1؎м|Vy7|t tKr@ÃrNo active partition„x8w rsþfRW_?ƈËDT s 0Zƻ|ZVbD\ B^st O|0sÁ>}Uu_Not bootable'%}$< rNu7Read error 00&. Hit any key to reboot.0 ^t |ѫwvU>D1؎м|Vy7|t tKr@ÃrNo active partition„x8w rsþfRW_?ƈËDT s 0Zƻ|ZVbD\ B^st O|0sÁ>}Uu_Not bootable'%}$< rNu7Read error 00&. Hit any key to reboot.0 ^t |@  ѫR 6kU1м|PPRV}}&DFF? G0 tF00rF1۾"}DT0FVs+v50ƊV(:vPY V}L\DT VB^rDd(u:$u^0 }$< rNu}tRead error 00  Urootdev=c0d0p0s0 ramimagedev=c0d0p0s0 ramsize=1024 "h$A 7oCkv:鄚="mA Ƅ= ;Ƅ=#,=]}'Ƅ=$,\aC'Ƅ=%N7oCzC:DŽ=&A|"=N:Ԅ='DŽ= Y/DŽ=( DŽ=v.ӄ=)08oCv:DŽ=*+,-%6oCM:DŽ=./012346`6oCݎ:ʄ=9:;<=>?A =v:̈́=RST ʄ=ov:ʄ=UVW\;oCˬv:˄=XYZ[\]^`6oCv:̄=abcdefI=v:̄=ghij`@:̈́=klmnopqs 7oCv:҄=}~+aC.v:҄=<6oCPv:ӄ=p6oCv:ӄ=PՄ=y9Մ=A7oC==a鄚=ί8鄚=!6oCί8ꄚ=!aCί8ꄚ=!ꄚ=6oC6oCa `C ;ꄚ=aꄚ=ί8ꄚ=aꄚ=ί8ꄚ=paꄚ= ;ꄚ=taꄚ= ;ꄚ=xaꄚ=ί8ꄚ=|aꄚ=ί8ꄚ=qaꄚ=ί8ꄚ=uaꄚ=ί8ꄚ=yaꄚ=ί8ꄚ=}aꄚ==ꄚ=aꄚ==ꄚ=a넚=ί8넚=a넚=ί8넚=a넚=ί8넚=a6oCƄ=넚=a넚=ί8넚=a6oC=넚=a넚=ί8넚=a넚=ί8넚=a넚=DO:넚=a넚=ί8넚=a넚=ί8넚=a넚=ί8넚=a넚=ί8넚=a넚=ί8넚=a섚=ί8섚=a섚=ί8섚=a섚=ί8섚=a섚=ί8섚=a섚=ί8섚=a;oCu5oCu5oCa섚=ί8섚=a섚=ί8섚=a섚=ί8섚=a섚=ί8섚= a^&aC$aC$aCa섚=ί8섚=a섚=ί8섚=a턚=ί8턚=a턚=&:턚=a턚=ί8턚=a턚=MO:턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8턚=a턚=ί8=a=ί8=a=ί8=a=(09=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8= a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=a=ί8=!7oC=oC=oC!'aCί8= =ί8= =6oC6oC!=6oC6oC!=ί8=!=ί8=!=z9=!=ί8=!= ;=!= ;=!=| ;=!=y ;=!=r:=!=r:=!=ί8=!=ί8=7oC7oC7oC6oC6oC6oC===8q=q=Ú=A *aC8=8=G6oC==u6oCJ&w8ބ=H7oCC:ބ=%7oC85ބ=+=y.ބ={ 6oChS:ބ= (={68߄= 7oC &1߄=7oCm3߄=:7oCtw8==iy:=6oC:=7oC $=A;oC;oC;oC7oC7oC7oCq=q=q=mA =U/5=mA =U/5=A0= ;脚=脚= ;脚=  mA 鄚= ;鄚=mA }=V/5鄚=AP6oCI=I=H7oCzC:鄚=!=ί8=!=ί8=!=ί8=!=ί8=...usr.ellepro.b1.exrc.profilebinbootdevetcfd0fd1minixmntroottmp.ashrc...,!, &SN %t  DrT<@\i[#V0_1_2_3_4_5_6_7_8_9_AkB2CEfF [-r]" >&2; exit 1 esac . /etc/fstab dev=$1 dir=$1 case $1 in 0) dev=/dev/fd0 dir=fd0 ;; 1) dev=/dev/fd1 dir=fd1 ;; PS0|at0|fd0|pat0|pc0|ps0) dev=/dev/$dev dir=fd0 ;; PS1|at1|fd1|pat1|pc1|ps1) dev=/dev/$dev dir=fd1 ;; root) dev=$root ;; tmp) dev=$tmp ;; usr) dev=$usr ;; *) dev=/dev/$dev dir=mnt esac case $0 in *M) mount $dev /$dir $2 ;; *U) umount $dev esac #!/bin/sh # # cd 1.3 - equivalents for normally builtin commands. Author: Kees J. Bot case $0 in */*) command="`expr "$0" : '.*/\(.*\)'`" ;; *) command="$0" esac "$command" "$@"   ph f1$T$Lhsu;SSSSu QRPl& PvUVW} }|&W:-uzuuWzuh9ujjYY9u:-uzujjYYuj4YYEyKh Y4YhY5YPYhYjuYYuYFW _^UVWhhlue ƅy=hu=lu$uVhlu , 9t럺l&+9'Vhl5 gWhl5 hhlu  =td)VlPhl l_^U=lt#-lPhlj[ Uh YjYUV5Nx t&^U=tuYUVux95$^UVu>tF+URuj ^UVW5YNj5hYhY}t.U:t&uYPuVd jh8VT WkYPWVB jh4V2 _^SkUVW}u M U$UUEPjjG U$UUEPjj' U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjk UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUU UUUEPjj yEUSE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu } : cat: cannot open catunknown error : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0p&lSSSSUnknown errordT<0|dTH4$|lTD8(tXD8 tdP<CB  $L1$T$Lsu;SSSSu QRPT P UDVWEPY9uU :-Bu VZYtG9uF>uր?=uэG1_^UVW EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh<u%dEuEu1k0Z‹N9:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPq>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW$ YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhd  YY_U U V Y=Vhd YYVh wYYƅ>-uF>+uFjVEP ƅUUj h 5 1 Vh YYƅpj h 5<  >t>,tjVEP ƅt5U>t'>,u"FV Y=xwVh YYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J<4EU M R+Q¤ЙЙUuW +UЙOIkkE0<UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^"UVW=E_^]BUVWME_^]U$UUEPjj# U$UUUUU UEPjj U$EUEPjj U$EPj j y}tUEEU$UUUUU UEPjjw UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPSqrstuNo permission to set time Please enter date: MMDDYYhhmmss. Then hit the RETURN key. %c%ABDHI-M578ZSTkUWXkYZa^bvcdehvjmnprCsYtgwqxy%B %e %Y%I:%M:%S %p%a %b %e %T %Z %YLC_TIMEGMTDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuarySaturdayFridayThursdayWednesdayTuesdayMondaySundayu%c Inexact conversion to UTC from Illegal date format Usage: date [-qsuS] [-r seconds] [[MMDDYY]hhmm[ss]] [+format] SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZX |tl`TL@8,$GMTGDTU U \TL@4, |pd SSSS ((((( AAAAAABBBBBB   Il l1$T$L0su;SSSSu QRP +P-UV1҉1}Ft^UuhT;YYj-YU}t } t} u1UVW=uh ;Y1uh:YY=th:YhP4Y8J8xLLSX h86Ylj=qtQuj^,YV>Yu08J8xLLSX h85YŃntNu11ۅÉ_^UVW}1=0|=8}G-0܉_^UVuh,9Y=h$9YhP3YM tL8J8xLLSX h85YSDYt 19us@FF8J8xLLSX h84YPYtɸ1^UVUU R+Yƅu h0YUU RjV9 ^UVWUDžtB _r?PJPxdd hPW5YYENu_^UUztErYPJPxdd/hPj/J5YYERTYUzu/PJPxdd/RhPj/4YYB5dY4Phd7YY'PhX7YY @ED} t hT7YU=t1P5p7YYy5p6YhtYU57Yth|6YhxYUVWu }u 9==ijP567 u$hh5*7 =u$zhh57 =t[54WuP5lh6u!h6Yhjh57 hY_^UEjP YYEuPu 6 U=u hY}tEjPYYEuu P6 EjP~YYU} uEEPu u5 U} uEEPu uh5 UVWu1u12-0= sF0ـ>u1_^UVWE0E2Yt E1tu h4YY1_^UP(Ph4YYjPEPYYtEP%Y%f(5<h4YYjPEPzYYtEP%Y<,PhP4YYjPEPFYYtEP|%Yf,.Ph4YYjPEPYYtEPG%Yf.0Php3YYjPEPYYtEP%Y%f02Ph\3YYjPEPYYtEP$Yf254hHy3YYjPEPoYYtEP$Y4h@%YtjDh(h $h$YQ=tj$YUjDh(h =t8=u hdkY8=h$t hDRY( h8-YYh2-Y멉+U U׉+M  ˁfr_^Uuo!YU,PYx.SY,SvY|.ScY,SPYU5xY5tY5|hY5\Y5PYUVWu } 1PEBEЙu7E8t/=t=uh YtEPE8tHtuuuh+ #utuuh+ E=_^UVW} uEEiEEuhT<+YYuuu  9tEPEPuuPPEM}Ń=t =t}u hL*Y}} ~uh8*YY}t h$xYtuuu }~ h z*Y_^UfEh_*YU x]QPٺY,.iUJjEPR UtUEPht)YYhlYt5,.iUJj@hR UBfU(M9 Uhhn)YU(BjR'YYU@V=tth5)Yt,.iUJj@EPR UUˆUPEPEPh(hYU%fEu@h!YfEUxM !ˁf,.iUJj@EPR ^UfE(M93Ut+U:t EPYUBfU뾃=tu h'YU5,YUM Ut/PJPxddr=hPjrW$YY-PJPxdd-hPj-($YYM Ut/PJPxddw=hPjw#YY-PJPxdd-hPj-#YYUMt8PJPxUdd~hPu#YYjM Ut/PJPxddx=hPjx@#YY-PJPxdd-hPj-#YYUVu =th\%YEPhT%YY2PJPxdd-%hPj-"YYPJPxdddhPjdo"YYPJPxddchPjc:"YYPJPxddbhPjb"YYsPJPxddpThPjp!YYDPJPxdd?%hPj?!YY1jshjPjshjPjthjPFPhLM$YY=FSFSh@"$ &vh8$YY O1jjYY^UVW}| ˁfhYt%HjjWT$ 1_^UVWuME E Dž} _s \tF\FR\FbFfFnFrFtF롉0F0F!0Fs30_^UuWhp Yjj=YYU|M ˁfu dYt1>M~F-~~5h E PdYYEh E POYYEh E P:YY넃5x5l5`V5lh  GF4 \WuuVEE1E }uht YjY1_^UVWu1E%tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5(Nx ^U=,t,u4YUVU9wU9v4 16VYt1'rF5&Y5^UVW}u1E}UUs4 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV$ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjo y U1UVW5}׃}~9r }y 9vWYu_^UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf E_^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^UVWuU VVuYYDžt~~yVډ4F_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvI =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hsYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },f7~y UVu CV€tu ,fNV~Pu>5T$Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvx =tN V@FF t V 9ډUVVFt$jjv  =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVW54YNj5lhP9Yhh.Y}t.U:t&uoYPuV jh V WKYPWV jh V _^UU UhPuu 3K3[USE] ![]USE] ![]USE] ![]UVW}u M UW}E Mr/u'uĉ fE_] UVux95 ^U$UUEPjj U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu( YYU UEPjj; ^U$UUUUU UEPjj U$EPj$j Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0 { }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEH uVuukƀ}Xu9utUPWYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuZYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP>YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPZYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhhhvYYjrYUVuYƋU rU MJwU uRQYY^U$UUU UUUEPj6j UUUuuu UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s fatal yes %s? --> out of memoryn-G (ino = %u) (ino = %u, closeContinuing with a zero-filled block. writeread%s: can't %s block %ld (error = 0x%x) internal error (devwrite)warning: no %s numbers given Do you want to try againok nowmaxsize = %ldlog_zone_size = %ufirstdatazone = %uzmap_blocks = %uimap_blocks = %unzones = %ldninodes = %umax. file size <= 0zone size < block sizefirst data zone too smallno zmapno imapno zonesno inodesbad magic number in super blockCannot handle V1 file systemsinstead of %ld warning: expected max size to be %ld instead of %u warning: expected first data zone to be %d first data zone too smallwarning: large log_zone_size (%d) log_zone_size too largefirst data zone too large instead of %d swarning: expected %d zmap_block%stoo few zmap blocks instead of %d swarning: expected %d imap_block%stoo few imap blocksbad magic number in super blockDo you want to change it againWrite this back size = %6ld nlinks = %6u mode = %6oinode %u: out of range (ignored) zone number %ld inode number %ld %s %ld is not free %s %ld is missing stop this listing install a new map%d errors found. etc. Checking %s map . clearmode inode %u not clearedChecking inode list internal error (counterror) adjust%5u %5u %5uINODE NLINK COUNT I @{`F  `%7ld %2x,%2x %3u %6u inode permission link size name . remove entry    \%s is linked to %u) warning: %s has offset %ld in . repairinstead of %u)%s is linked to %u bad %s in ')entry = 'found a '/' in entry of directory null name found in ', dir ino = %u)name = 'link to directory discovered in ...' in directory discovered at entry 'too many links to ino %u . remove entry')name = 'ino found = %u, bad inode found in directory . extendsize not updated of directory  , pos = %ld) VERY INDIRECTDOUBLE INDIRECTSINGLE INDIRECTDATAzno = %ld, type = %s zone in foundduplicateout-of-range.. missing in . missing in nonzero zone number %ld for special file illegal device number %ld for special file %% %@]%`u%E%mode = %o)bad mode of cnt = %u) link count too big in link count zero of (ino = %u, mode = %o) root inode is not a directory removefound inode %u: bad root inodes%6ld Free zone%s s%6u Symbolic link%s s%6u Named pipe%s s%6u Free inode%s s%6u Bad inode%s s%6u Character special file%s s%6u Block special file%s iesy%6u Director%s s%6u Regular file%s zonesize = %5d blocksize = %5d ----- FILE SYSTEM HAS BEEN MODIFIED ----- inodezone,a,c,i,l,r,s,z,Usage: fsck [-acilrsz] file %s: unknown flag '%s' zoneinodeinodeFsck was compiled with the wrong BITSHIFT! 2N2h$t2$h2a2 : unknown error? q?@?@X@b@d@i@o@p@u@x@A A#A+A-A0ADL}BhgBlrBBE1DGDXCbCcDdCe1Df1DgDiCnBoCpCruDsACuCxC(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point $Answer questions with y or n. Then hit RETURN ((((( AAAAAABBBBBB SSSSB8PhlUnknown errorxlP<( p`P@,tdP4  t\@,xC  H@1$T$L<Hsu;SSSSu00 QRPl PUVWu Vh YYj/6YYDžu>jYhWYYu1PhYjhji _^UV54Nx t^U=8t8uYS UW}0OE uG_]1_]U$Vu UUuV֋RUV֋RUEPjLj ^UVWuU VVuYYDžt~~yVډ@F_^U$UUEPjj U02u u ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s@KVYE=u@&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0rYE܋]P3W= }׃E뻋EEU9vGu)YEuUUȋUUEEEPj;j RUY_^UU$VWEP"YEPEPj jYƋ}t9uvE<EPYEEPEPj WYUUjEPYYEPYWjYZ)‰jEPjv jEPj t9r)օu jYV9YU)_^U$UUUUU UEPjj_ w|USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UVW}u MU}x}~uPYYU$UUEPjjC y UD1UVW5DD}׃}~9r }y 9vWYu_^U$UUEPjj U$EPjj U$UUU UEPj%j U$UUU UUUEEPjGjT U$} uEEUUE UEPjJj y}tUEEU} v@M E 1U} v@M ҋE!1UE1UE1U} v@M Et1U$EUEPjHj% ÃUVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V\T5dhHjKj ^reboot call failed reboot/usr/bin/haltpSSSS  pP LS1$T$Lsu;SSSSu QRPPUuYPujA UUh Y}tuYhYuYPYhYjwYUh~Yj_YUVW}tU jrYYEy U r[Yhh u| y U r6YjhXh h t*hLYU rYh4YjYuY E K}uUGEGfMUtG сfEEhhkFu yj[Yj Y_^UV5Nx ^U=tu(YUVux95`^KoUVWu} Mr6 u.uAfA(_^].U$UUEPjjk U$UUEPjjK U$UUU UUUEPj6j U(VuU @t*ujYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu } : loadkeys: Usage: loadkeys mapfile : not a keymap file loadkeys: KMAZunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0SSSSUnknown errorpdH4 |hXH8$xl\H,xlT8$pC  P N1$T$L su;SSSSu QRP< PU8VWu }uEEVUEU9UgU:-uDUUU:t?EEw݋EEUEEE덋EU)ЙE}t }t }t-}tv;YvYh Y}tuvv y^5YEh Yv Yh Yvx Yhm Yud YhY Yj~YvYhtY}tP[YhPYvGYh<YhBYDžyjYPPPPHDžx?PPPPqDžyhtYjY뗃}t El8hdvYYE=u E`}u E\EX}tLHPu}tPFPvDžyh YjYhY1_^UVhTYƅyjYPPPPƅP YPPjd hLPYYu h<Yh0vYh,PYYu$PLYh AYP4Yh)Y2jY^Uh\YjYUuJYPuj UVW}jWsYYpx@jhpE =t$hPp< lyN5Yhh/YW(YhYhYhYj+YjhV tlujhV u V~%hYWYhYjYp@YVtV xhW|P ƅtPhM@0YYyN5Yhh"YWYhYhYhYjY_^UV5 Nx D^U=tuhYUVux95H <^UVjuZYYƅy'u nYhcYuYjhV jDh V =Dt+u YhYu4YVYAVY 0 B=u0 B=h$u^UVWj5YYDžyh@u^YYhh4 WV Eh0u+YYU}u'uAYh6Y5*Y%WY4 >t)tF1_^UVh5YYƅyhduYY?$-8 Ph8 V EhPugYY VDY1^U= 4 rU25 uYY - =_s  :u= 4 s 5 u uYY - =_s  :u= 4 s 5 u)YY - =_s  :u= 4 s 5 uYY - =_s  :u= 4 s 1UVWuYEu YEuYuYƋ$UU8r u5$2YYU$$$ u 5$ YYU$$$ u5$YY$$$ u5$YY$$$ 1_^Uu%Yu Y5Yhx-YUVu>tF+URuj ^UVW5YNj5 hd Yh| Y}t.U:t&uYPuVh jhVX WYPWVF jh|V6 _^+oUVWu} Mr6 u.uAfA(_^]UVWE_^]UVWMwE_^]U$UUU U5EPjMj? 6EPjMj- $UUVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$UUU UUUEPjj+ yEU$uzYEu iYEUUUUU UEPjj U(VuU @t*u"YEU UV֋RUUUEPuYYU UEPjjo ^U$UUUUU UEPjjC U$UUUUU UEPjj UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVu YƋU rU MJwU uRYY^Ë+C;Cw Ë[ uӅu P-KI|;u[u P_1ۇ tPXPrmountmount: /etc/mtab has grown too large rwroswap021mountswapmount: /etc/mtab has grown too large mount mounted on writeonly is read- : on mount: Can't mount is swapspace mounted on onlywriterw is read- is swapspace swapmountUsage: mount [-r] special name mount -s special : mount: is not swapspace mount: : mount: unknown error cannot read super block on cannot open /etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 F I M S @SSSS4 8 ((((( AAAAAABBBBBB Unknown errorx\H4$|l\L8$p\@,,,,,,,,,,,hL8(CBL d | _  G1$T$L(su;SSSSu QRP\ PUH}~U hrYYu1dEPhVYYh*YEzu&YEfhhCYYURhYYEPhYYuU܁`uE]9ujhYYjhYY1UVuYPuj =dtjh@j u Yjhjf h4uYYƃujh,j? )ujh$j' jhj u Y^UV5 Nx h^U=$t$uYUVjuYYƅy'u YhdYuYjhVN jDhVV =Dt+u hYhD]Yu|YV YAVYLB=uLB=h$u^UVu>tF+URuj ^UVW5,YNj5dhH}Yh`rY}t.U:t&uYPuV$ jhxV WYPWV jhtV _^sgsjUVWE_^]UVux95|^U$UUEPjjs U$UUEPjjS U$UUU UUUEPjj' yEU(VuU @t*u:YEU UV֋RUUUEPuYYU UEPjj ^U0VWEPuYYy1U؁@t,1huKYYDžy1EPWYYxS,U؁@u7jW`YYEx& PjWI xh$Yƅu,UWrYUЉ,1FfFF_^U$UUUUU UEPjj UVWuu, 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjjh U$UUUUU UEPjj; UVWuEu41}%}t EXu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=X<9}r79}u+UOJ}t EXURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15Xt 9ur6E0tU UXtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVupYƋU rU MJwU uR%YY^UVWuU VVuYYDžt~~yVډ,F_^U(VuEEV֋RUV֋RU E UUU UEPj7jb ^U$UUU UEPjj= USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P1ۇtPXP/dev/unknown/-r0 rw 2 rw 1 rw printroot cannot read super block on cannot open : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0}V}V}Vccc`/dev/ / SSSSB0H`Unknown errordP<, tdT@,xdH4 pT@0C  TB1$T$Lsu;SSSSu QRP PUVWhhYYƅu%5YP5j jQYVYlj GPVjg W9tj#Y1_^UV5Nx ^U=tuY#sU$UUEPjj UVW}E 0?tG9}s 9usON9uu N/E 01_^U VuU>t3FuF>t>/uEu YyUȋU1^UVW}t} w1?Uu NEPhl+YYy1EhEPu YYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWYEu=+WvYWYVY1_E4E UhdRYYtUh`RYYuP[UM9uMh\vPYYURyPYYEPvPYYy HE UM9E]9uUREPu yWY"VY1dWYuYy VY1EuEPEPR VeYy1>uN/9us VuYYE_^U0VWEPuYYy1U؁@t1huYYDžy1EPWYYxSU؁@u7jWYYEx& PjW xh$YƅuUWzYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UjukYYU$uYEUUU UEPjj U$UUUUU UEPjj UW}0ʀuA)_]UVW}u MUVWE_^]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuu TfFV V#U UU +UVjvPx =uU 9Vs V)Yu1^UVWuU VVu%YYDžt~~yVډF_^U$EPuYYEPj j U$UUEPjj{ U}u UEuYuYU(VuEEV֋RUV֋RU pE KUUU UEPj7j ^U$UUU UEPjj U$UUU UUUEPjj yEU(VuU @t*uJYEU UV֋RUUUEPu4YYU UEPjj ^U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UVuYƋU rU MJwU uRYY^É{sƉ+C;Cw Ë[ uӅu Pg1ۇtPXPpwd: cannot search some directory on the path 7E../......A  A  A  ' ' ' SSSST  8`(J1$T$L`su;SSSSull QRP PUVWjhUYYD=uhYjiYjhD =tjCPD  yƅCCt6Ct-h5YCPhhe jYjYBBtihxYBPh`h! Bt h4YB@t h YBt hYjlY}fE E 0F<-t>tG7ptx|F6M됃=xt thh$ YYDž0Dž4Dž8' Dž<}0PhS@YYuh$ iYW1 EPYjoYPEEPEP 5EPYL=u:UBlMuuuuRQhh{ jYGu ujY=t=ptLhWYY$LPYyhhYjYLPYPEP 5EPhPj@TP}\0uƅ\ TPhLYYXPPTYPEP 4=pt)UBlMuuuuRQh, EPYjY_^Uu5hh-U UVWuEPoYEEFjEPjK  jYE1= thhYYj1Yj /Yuj#Y9EtEG|j YFjYFjYF jYFj YFjY9jjY9FYjY9FHjY9F 7jY9F&j Y9Fj oYuFvYFvYFv YF vYFvYF6YN~P}Fd=|t ~d}F_^UxujpYYjqYEbEUVWu=xtj&j YYjj YYj YǺ Rj YYF=|t~d| VVuOdFRYFvYFv YF vYFvYF6Yvj qYYvjeYYv jYYYvjMYYvjAYY6j6YYj YE pPj YYWj YYuj YY_^UujpYYu jqYYUUk #U‰U EPEY ʉUhhYYjYUV5Nx  ^U=tuYUVWu^Yƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP.>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW<YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWWYZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_U U V Y=VhYYVh`wYYƅ>-uF>+uFjVEP ƅUUj h`5 1`Vh`YYƅpj h`5T `>t>,tjVEP ƅt5U>t'>,u"FVY=xwVh`YYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J44EU M R+Q¤ЙЙUuW +UЙOIkkE04UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy@UUU:tEG9tU:u?=tȋU=U1U=l2=kEt Eu E@k PYƅu Ul:2ul2E u4@k lP2YYƅu.l2J]1_^UUUuuu 0 UU Uhuu 3; o  UU1]UU1f]UUE ]UUE f]UWU} M_]UWU} Mf_]UVUu M^]UVUu Mf^]U]U]UW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]UVWlUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh4u%dEuEu1k0Z‹Nrtuvwxyz{|9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y UP1UVW5PP}׃}~9r }y 9vWYu_^U$UUU U5EPjMj? 6EPjMj- $LUTUVWuU VVuYYDžt~~yVډLF_^U$UUEPjj U$UUEPjj U$UUU UUUEPjjW yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE$3EPjGj U} vLM E 1U} vLM ҋE!1UE1UE1U} vLM Et1UU$VWEP YEPEPj~ jYƋ}t9uvEp&EPYEEPEPj WYUUjEP YYEP YWjYZ)‰jEPj jEPj t9r)օu j YVaYU)_^U$EUEPjj U$EPj j y}tUEEUVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Ud)EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UI JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P+E6U U RU U RUEEE9 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }7~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvr =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvc =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MU}x}~uPYYUUas U EUhLhYYjYUVuYƋU rU MJwU uREYY^U$EPjj U$EPu6YY1ۅÉU$UUU UEPj%jI U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V  5 hjKji ^U$EUEPjHjE Uu hT$u9 U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvZ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j {sƉKI|;u[u P1ۇXtPXP2Wnw%04d-%02d-%02d %02d:%02d:%02d %s %a %b %d %H:%M:%S %Z %YNot allowed to set time.stime(%lu) readclock: Invalid time read from CMOS RTC: %d-%02d-%02d %02d:%02d:%02d TZTZ=Time invalid in CMOS RAM. Reset clock.CMOS RAM checksum is bad. Run SETUP.RTC lost power. Reset CMOS RAM with SETUP.CMOS state = 0x%02x CMOS RAM error(s) found...Machine ID byte = %02x Machine ID unknown.Permission denied./dev/mem%s%s readclock: readclock: CMOS clock appears dead Usage: readclock [-nwW2] SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ%~ABRHIMvSUWLXY#ZMab'c}dj*mPpw(xy%H:%M:%S%a %b %d %YPMAM%a %b %d %H:%M:%S %Y$F$I$M#S#u( (@N(r)X[)b@)dR)iR)oI)p[)uR)x[)K* <*#A*+7*-2*0F*=-L%+h+l+C+E,G,X/,b/,c,dm,e,f,g,im,n+o/,p/,r-s+u/,x/,(null)cannot print floating point GMTGDTU U tldXLD8| SSSSB(   P( d1$T$L&(su;SSSSu QRP+SPU0VWEh0+kY(+օu&jh$,YYƅu hzYE>/tjh YYEuE0+VEPaYYDžt@EPWQYYxU؁@uuVWYYPW xj VhYX_^U=+tE 8+uQYy&8+J8+u54+ZtHKuY8+J8+u54+Zt} t=+t5xh,aYY1UV5+u14+U>/t>tF>u + F5+E^UVWu'Y@PaXY+u5+YY5x|,+U:/tK=+;=+?t&,+J,+xGFZƊGFՀ/u,+NDžh4WZYYu95xs,+N>/t?th0W.YYt,+J,+x/F Z/F?t,+J,+xGFYƊGF95xu ,+J,+x/F Y/F=,+u Y=+t 5+Y5xVY+_^UJ5+<Yp"Hp"zy5p"|Yp" p" 1UVW=+y8+PYy htYjjCYYjjE uWAYt#j0YjYYYjhdhh hLjYYDžU)RVG Džu=&u ~ӉYDžEFYtjYx9t~ t h8YFPUY+8+J8+u54+Zt/_^U=<+uU@+j5<++YYU58+Zt4+14+=H+t=+t jY hYUu uh U4+8+U U}n=D+t5D+hhH"襌 uuhH"= t"Ht"zy5t"ÊYt" t" 莋jYU VW}U z}5x|,+U U?t&,+J,+xGFUƊGFՋEEׅt",+J,+x FU F뤋,+J,+xF UF|+,+RSYW YL+_^UEPSYju`9YYjkeYE=h+tjuYYEPSY9EPSYUVWu} jvYY=X+WvYYjvYY=X+z=L+mWvYY]jv|YY=X+D=L+7WvWYY'vDYjvhYYWv2YYWV}YYWVoYYEjvYY=X+=L+uWvYYL+U~ tWv YYL+UUL+zVYnVnYbWVZYYWvvYYL+>VY5jWV" '6hqYYh4"衈Y =d+tu=+u=L+tu 5L+nY_^UV`+1UjrYY=X+tP=X+u\+J\+ X+ƒ=X+`\+J\+OX+CE8 u =L+t 0=L+t'UjrLYY5L+=X+Zm `+5L+^UVWEPPYUUUzt!jEPW =X+ۋEL+`+u~Ujvr UjrYY=X+tL=X+u\+J\+ X+&=X+u$\+J\+X+6z `+EPOY_^UVWEPOYUUUjEPr  UrtD=X+u;~t/UrW*0YYt=X+uu v YY ͋v븍EPUOY_^UVWu1>u@vYjV;YYEWVu< u'te jv{YY U RvAYYu38+u>YL+8+J8+u54+Zt_^U Vut4>t >t>u UUjEPv  URVv^UVWEUrtE68+uu:YYEUrv YE>t EPYyWYhiYUrvu; z8+J8+u54+Zt~jYjW~YYWY}x,uY}tjYjub~YYukYjvYYxWTY}uHY68+J8+u54+Zt4Uzu38+u<YL+8+J8+u54+Zt_^UVWu }EPLYFFF ?uVjW EPYy hYjW8YYEjWu%: uP8+54+ZtQu6Y}tj(Yju }YYuYjWWYYuYUUV EPKY_^UVWEPKYUUUUEURU}hURUȃ}t6i!t*EȋUi!u:=ujEPu jEPu EURU뎋EEUr oYEUŨ}t E؋E̋UUBRIYE܋UŨ}tŰErEE̋UEDžt=+t=T+u}~ U܋RtUU܉U܀=#+/L"JL"yhH"YH"H"+H"H"+UŨ}tNL"JL"yhH"YH"H" H"H" Ur[YE̋U묋UŨ}tNL"JL"yhH"vYH"H" H"H" UrYE̋U묋L"JL"yhH"(YH"H" H"H" hH"Y}uEEEj]S0 }u$L+hH"YEPHY}f}\EMtSE0YEy;]3hthH" L+hH"TYEPHY}tUzu0}uU t"U }u}t }ju4YYEURUċU t EEPYy h`Yuuu5 U tF8+54+ZtuY}tjYjuxYYuYM }hLxYuxYUjr sYYhp+EP8t+UJp+U܃x+|+8+ +| +8+J8+u54+Zt5jEP t\=@+u EPTYhp+TYEPhp+y| +u<+j5<+YY<+UU<+UŨ}tUrYE̋UT+juYY T+8+| +hp+SYEPhp+u<+v8+J8+u54+Zt=X+uX+\+U 5L+yzY}h8vYuvY}u1Eă} u$`"d"\"h"@MUur qYYD+UUP+Džx5jEP t*@+xxZuL+O<+UU<+E܋D+U܃(+l+UuuYYL+*{p"4"t"H"{xZtuD+U t 5L+yYu<+xZtJxZu}t}t }t}u xY8+54+Zt}ts} 9U d"J\"+d"MQd" h$tYutY=tUjr oYY}t1+RY@PMBYEȋ+RuYY +UȋUŨ}tUjr襁YYE̋U蹃Euuuu[}u58+u2YL+8+J8+u254+Zt' }uUEuYUMJ ttjth 3 EPtBY_^UE8u*URrmYtURjEPr U5P+誁YL+UV}~U r HY95`+}5`+~!E :cuX+5\+1^UV5L+}~U rGYƃ=T+tX+\+^UE h0YYu1U}~0+juY+jRU PR 1UVWuj/6FYYtu V6| =&Y6EPwYYEt@My0=+u'u Vu; =&t=&t=&u=@YW^YP6YY_^Uuu u UVWE8u1EUր>t >:t>%tFu Y+UƒUU9|}|@=x9ut!+URWuE +U/Gu WfYY+>%uF5+>t>:tF>:u VE Eu>Y_^UVW}*+,s7t VY61Eh PYEt}ru jCYރ}vuEӋ(+UvjuYYƅt!VtF=u=(xjEPu: }t }tjuYYVYJu(+w1_^U VWuVu6~+UF PEPYYEP=YOyusY8F=uF PhuYYF=uF PhuYY~ t:p"Hp"zy5p"sYp"* p"*p"Hp"zy5p"msYp" p" _^Ut)U9uu6YYuF Ҹ^UVW+,s/7t$VtF=u =(xF 6؃_^UVW=+uE'EE9tUU?u>:t ?:u>uE>t1>%u }yFPh+?YYtUU>:uEFG롃=(y}x U(=(x }yEuYU(_^UVW8++,L}E0t;VuU9V}F=uU9(|EV7Yu뼃먋8+J8+u54+Zt_^UVW8++,s8}E0t'^uEvBYVYՉuЃ8+J8+u54+Zt _^UVWuE>t FEeE+UE8tuG PYYt}?} g_8+uY P5Y]fGG uG PYY8+J8+u54+Zt5U,_^UV8+,2 V蕳Y8+J8+u54+Zt^UV8+juYYF=u v(AYE fFU RFP[8+J8+u54+Zt{^U8+Eu <YEEPufYY8+J8+u54+Zt,UVjuYYƅtF=uvm@Y^UU jju# ,+xR5xu $r U VW+UR ,x,|,+,,,Uur2YY} ",+J,+x,,6,,|+,+R3Y4,0,}t1h0,Wo YY4,4,0,50, Yj3YƉ~4,254,=,tG8+,U5,YU,8+J8+u54+Ztg밋4,=0,tU R 0, U 4,J_^UVu} t6,+J,+x,,MM5,,MFE,+J,+x,,M5,,Mvu VYYdE%,u Pr_ ,,6,+J,+x,,M4,,MFE^UVW5,+xD} ta]@8+h,TP,,P,L<|+,+RW1YǍEPuYYVWU4YYTPh,P,,L,<}ƅKMyH}hlPup Ey =&tك}lUJUGKKt}t2K@8 u ,+J,+xF 2F,+J,+xKFL2ƊKF7K u,+N}x u,Y}t u軭Y}tu YL+} u+xjRD 5,8+J8+u54+Zt_^U(VWuFE%EuEi!uEj=V6YYF}tUPYE1.u"pYDžt U t?u 1EE,+xU}}}t @#UMu RP U@ta]E܀?} t=E܀8 u2,+J,+x,,0,,,+J,+xG,,0,G,,r}u 1}EU@tU:@u6=p+t-}u}u!@#U ,+ xRQu }} }t}uu VYYUjVYY=,+u/, ,U؉UxU܃}uEjuul U+,,,U+,+,+ډ,+e=tuh@hH"ae jnYU t0++UJPuRh$D}iEFE=uF}t}u}t݃=,tԋ,,ă}uF%=tE멃}uMu_^UV}!u=Z1X}@t}*ux+:u<1=E-1E]w#5x+u1EHE]y^U8VW=@,=L+=p+ ǍuE 0NDžu>,+J,+xF,,-,F,,EEԀ,K+tF,+J,+x,,Q,ZU-,],Q,ZE뜃}tEE } t }ta]Eȋx+ŰẼEօ>EȀ8 u2,+J,+x,,,,,,+J,+xF,,,,F,,xẼ8Y,+J,+x,,Mӈ53,,,Mӈ5<,} t }ta]EȀ>EȀ8 u2,+J,+x,,+,,,+J,+xF,,+,F,,xE-1E]w ]x+46ED_^UV=,,u,j,(YƋ,,25,,,,,,MJ,,M J,,MJ ^UVWUU=,,E,UMr΃z t0+ L,BEUMJ9u=uFFPu.YYt΋U9UwU: t$Uj'YNjUWU R:U zU: u1UMJ9v$u=uFFPu2.YYuҋuuYEU%U:uU: FU9Uv>j:'YNjUWU R:U zj'YNjUWU R:U z_^UVWu&=+~?~u WYljFGEЄ}*t}?t }[t}!u׋4,U8+=8,uh&Y8,v58,YY58,Y8,8+J8+u54+ZtbU94,u&=$+P4,2vY54,74,E0YE]E8tUU4,6_^UVWuV>~uZЉE}ԋU:t :/tU9rEEG}s>~unh7fYDžuWWYPuYP@P$%YWV踶YYPuR襶YY+ujhT YYTPEP葶YZhTP*YYT]9u֍TPEP+YYt?:uDžPG?t?:uPP?dG>t > t>:tF)PuYP@P#$YWV践YYPuR褵YY+u2 _^UHVWEU Uu >*t>?u Ee>[u1G?!uG=uG?/C?t>G?]uE/>!u~!u9u t~/u E>t"=uF>/u }u VUFn}^8,9UtEu =uFU E>tF}tEP58,蟳YY58,YuU 9Ut u 9uv=uFFUE8,9Uu-8,9Uu8,:/u 58,UBVYEȅ8,9UtUB/U:u EEUEEU:.t=u z.uE54+Zu蔲YEąvx.u}tыUăRuuYYt}tUăRuNYY58,MY뗋uUăUEEFuF/uVYYgu花Y}uUB/_^UVWuY@PA!YuWӲYYj,!YƉ~4,254,_^UVW1utG6WuYY_^UVW} EU UuUMxu6EuuYYEU +URVYYƍ}UrvYYy77uUU}Uuʉ7E_^UVu>!u~!uju FPYYZ)‰ u VYY^UVWu} dGF9T1nGB1\ME=t,}?t&}*t }[t]9t?u1#GWVYYt  Gu1u>!uEU:=uEEU:]uE>!uEFEGE&FeE=uFE>-u3~]t-F=uFE]9|]9|EFE]9uEFE=]uU9Uu11G]9t1!FEǻ?t1_^UVWu=t Fu>t=uFFG_^UEP%YUR ,x,|,+,,UjrYY,+J,+x,,Y ,,|+,+RYEu uQYYEEPYEUVWuU UM}~AP,JP,xT,T,Pǁu 9uu1F uE_^UP,JP,xT,T,UVW=p0t>p0T,p0t0P,JP,xT,T,=P,t xzu h4"\TYhH"QTY=|zxRT,֋|U|uYEuP,VuVYYuЙYVϭYljBj VWZYZxRT,֋xhVrn Džj=&txzQ=&6uHjjj̫ Ex3Et*eujj覫 xhQY\P,lJP,FtOT,T,GVUO~>t U EFxM9J+JI P,T,T,_^UP, T,UT,p0P,t0UT,U P,UVW8+juYYƅyuhYY }$j V_LYYVhYy hYu V%YY8+J8+u54+Zt?_^Uju;YY Pju) } theYxBxz~ rөYxMJxzuh$YxBP,tU8+} tOUT,uYP,xBt8+J8+u54+ZtBUVx P,Jx T,J x t jjYƋxVF5x^UV5x8+~x v輨Y~t vKYVxV;YxRP,xR T,xt8+J8+u54+Ztd^U=xX,t`Uxz~rYxBUjY1UXVWjjZ YYE5x0|09U~V u VY}t ~F E~9~uPuhLj@EP PPhDj@EPOEPMYEPYEE_Wu _Sh<j@EPOuGE%=.#U<t#U4EPLYY#URh0j@EPEOU€th EP趧YYEPLYEP!YEp"Hp"zy5p" MYp" p" E}|w~LYp"Hp"zy5p"LYp" p" M}~TF~uVYE_^UVW}8+G EwMx~0+t v/Y9t wYG8+J8+u54+Ztm_^UVW}~U rFY1tQ~sF HF@Eu ЉU#U€U=+uV%YE<=x0k|0x09w1!ttjjYYo_^UVWU rY1G 9WPhXLYYp"Hp"zy25p"JYG F9~  p" G F9~  p" q1_^UVW}uh|SYU:%B-0= wKURYE9|0Hkx0xUJkx0P15x0|0UMx@~t5F ~-VMrQYYttuhl虾YY뻅ZWbu1YtGuYE5x0|0UMx'~tF ~F HV9EuVuh\!YX_^UVW=|05x0O8+=|0ujPYx0q|0kPYk|0PV5x0 19=|0~'kx0kx09Xu kkCG5x0袏Y5x0k|0x0ֿOx#|0Aj5x0 |0kZYJڋ8+J8+u 54+Zt赼~t8+FFFfF } ~U RYFv8+J8+u54+ZtS_^UVW}8+LE=u*8+J8+u54+ZtheY}H+UH+|0U5x0Mx~tVYr8+J8+u54+Zt蜻C}uJj>EYj6EYtW u.yBu%jRYjh譠YYt h詻Y}t!=+tjCYjCYjCYE=H+t,}t&= +ttW uUU WE}u UfTW @wfG Z4‹UffFF0+=+t=H+t} t u 8YF8+J8+u54+ZtXE_^UVWu8+~uVjYY=uF HF@u ʉM!€UVY4+!ujPYY8+J8+u54+Zt訹E_^U$VWEPu(YYE=u =&t߃}E8+E5x0k|0x09~EE~F F9G=t89Eu EfGuG=u EG<uE맃}t$}tE^9]tFE8+J8+u54+Zt}=H+t=+t} U 9U#UUUU}} U 9Utuh5t"VE }U<t4CYt" t" hH"DY }tUBE_^U}u1Pu j Uj2 YE00.uY0EUVWuvYhYvYvYhYvYvYhYvYnVU}^UrgYE8t hDYEUh/Yv6YhYvYhYvYhYvYhYhY hYvYhYvYhYhYv wYhlYbh\YVrPYhxEY;v7Yhp,Y"~tW)Yt hlYߋ~ hhYWYvYEdE>E`E.E\EEXEETEU9Vt0VUEEPdYu[Y>t>u0V UEEP8Y1v =Y&hL YhHY _^UVWE=0}50GEЄE=u GFE=u%$F0J0~{FGEh}=u#}t#UJЊFE?E=u}F.E1=uCE1=uA t0MF0J0,.F.F.F50_^UtF~/t/FEPuߗYYyE}y}oU90_9UV=+t+P_=Yt"Ht"zy5t"=Yt" t" U܉0G =0EPY_^U4VWEEE5jEPb =@+u'葖@,H+0E"uZt=+t =H+uj;Y3N=@+uEt"Ht"zy5t"<Yt" t" hH"q=YEPY8+54+Zt詰uZuZ1uZU<+蜕@,H+,MEPYu uYY=+t+=#+t#+E 8:-{Eh<YEh4YEԅtCukY PBYEЅt'uu,YYh(u轕YYuXYAhKY4="+u =0t"hYE؅tEuBY}t uہYEE 8t:-tSh ~YEԅtAu谕YPYE̅t%uuqYYhuYYuY}t ucY=+t+=#+t#+L+E=0t 50uY="+u =0ujY5L+&9Y_^UVWEPYE=d+tm81=+t"}tGjYjYh4":YW~YƁh+u*=+}2hL39YEqi=!+u`tR8+=0t 50Y00V Y08+J8+u54+ZtqjV裯YYEPFY EP7Y_^UV8+ju苒YYƅx jVYY8+J8+u54+Ztx jY^U8+ju0YYExjuYYuhlYY8+J8+u54+Zt薬j(YUL+}|(U jrYYU RD+jY_L+U}~U rYL+5L+6YU}~U 50rYY1[8+50X Y0008+J8+u54+Zt趫j50YYL+UVu|Yƅu h|Y^UVuu V|YYƅu h軫Y^UVuّY@PYuV襑YY^U VWUU9|h}}8+GPMYEtEUx=|Ut8+J8+u54+Zt裪5xUxx|+U|_^U}uj hj yx+U|UxUtEU xJU |JUV8+Et9t5ttVx|Y܋URxUR|8+J8+u54+Zt賩^UVW|d׋xU|Ut9xl=t0t`8+5ttGPVYYƋt5tVx=|8+J8+u<54+Zt1*WYEuuu Ux=|_^UVuV։xx|)|^UV5|=x-|%V5x5: J,+x|)J,+x^UV|+,+|),+x^Ux+U|UxU +U+|ډ,+U(VWEEhmYE؅t}pu 2UEԃ}tjٌYtu2Y 4=(+?u hͧYjh`=YYEuE0+EEE5x|,+jEPj舌 =t Ey}t׃}t3E} tċ,+J,+xMF&ƊMF랃}t }\uE덀} }tU: uEPuYY^E}U}\uOjEPjϋ =t E,+J,+x MF ƊMF^EPuYYtK=,+u Kj5x7w9 E5x|,+,+J,+x MFvƊMFd=,+u j5x79 ?tjh0+78 E_^U VWU RׅuE8+j贊YV諊Y8+J8+u54+ZtVhR2YY=1-0E=rU rh$YYuG?uV@Y1_^UVWu }M}~GFЄu_^UVu] 9t Fu1^UVW} uMxFG_^UVWu} >tFG9t1_^UuYuuh>YYurYUVu-0= v1 F>u^U}u1I22u/Y22RY222uYUVuIU2(vYvYv YvYvYvYvYv YvxYvoYv YY@2vQYvHYv:Yv1Yv #YvYvYcv ^YvY@2vY?v YvY+vY v YvY ^UVut22vY6^UVW}u152U22wYFwYF~w YF wYFWV[w]YFWVDwnYFwbYF'w QYF wEYFw9YFw BYF wYFwYFwYFwYFw YF wYFwYFw YF wYFwYFfw YF WVw~YFFW V WVwdYF,w VYF WVwDYF P_^UVW}ut#22wYB?6E_^U VW}522UGFЄu52E_^U}t urYUVU (+}~(++&+sFjY(+:u=0u"+jmYtjaYt12=+u="+u=2t+= +u + ++&+s >uFE <,="+u2(+(+<,=0uD+j5D+YY(+x+(+:tp+(++P(Y^UVW}t 0(+օ(+F=-aE>t>-f~\}>u1҈%+#+(+:5(+Yz+u E (+`FDžtLcu:}t4(+(+Ut =0t h褝YU0uWYY몃}_^UVEPh,YYƅuEPhSYYE P-,Z+^UVW1U<tFBRYENjE8t]E3FYhp+%Yt+5p+Ux+|+_^UVUzt$Ur>t 6nYUrnY^U VW}~U rY95p+}5p+8+p+)p+=x+Nx=t+t7XnYx+U]Eu|+8+J8+u54+Zt胛1_^U}uu u3YYT8+jY+P%Y(+:t 5(+[Y8+J8+u54+Zt1UVW}t h,XY=|+ux+|++5+t >{|+2t >-uF>uR|++x+Й@Ph(j EP (jEPh  . |+|+>-u~tFEU z]9t(?uEPh 'YYE?UG?:uGG?:uF>u,|+օuEPhI'YYE?|+jVha- 5+MMEU jEPr8- |++x+Й@Phj EP&jEPh, 1_^U VW5l+t>u7(+2t >-uF>u1(+>-u ~u1uFE}]9t?uEPhdAYYG?:uGG?:u2>u%(+(+օuEPhLYY5215l+E_^UU2t$=L+u $3B <3BP{Y2` Euh+}u1h+jYUVW3}uh\ Z€:t143EE}}uE8u}:t:u B5:u&j kYVF7h+ =u }tEh+3h\A Z€:tEtsEj YUVUVuB=2tV E1}tjYh+E 鞈E_^UVWXE =uu h+E%$Ej @YƉ>UVUVu_^UVWyEU =Yj YGjYƉwUVujY*FE0 =t}h+E_^U(VW3EUU= u53E0VUh+ jKYjGYGv=tjYj(YGU=u@jYF v jYF*=tjYjYF봃=3u jYF F h+=tjxY3Mj }Yǃ=3u  jhYGE=tj&YjFYGu=tjY3R= u=3u53Yu h8 ,YjY 3W = =3h4 53+zYYpUU= u/jzY3V 3V E0VUŋEUW=3S=3tJj Y@jYF F Fw=3t=3th+3E=u E}u EjYjYG9Et uqY3Fj vY = tj >YjRYƉG3V 3V Fl=t=3 uh0 53xYYt h @YWU3&= jYE]E UUjYE]EU 3JU 3J =uUU= tj @Y뤋UB=3tj#YjCYUB oE=uh+} tj YUU E=3tjY3j YjYGG=tjY3[jY=tjYY31h+uuYYtj-Y =v= u53E0VU9h+E}t ?tj Y~UW_^U VW}}} u} EUU}= u/jY3V 3V E0VUŃ=3 u537먃=3u6U9Uu+9}u&=tjYF:h+EjYFUVU V _^UVW53 = tjY>=2=3u t3: u353Yt53&uYEt}O~ h` Y53Y3W=2u =22UE8tUE8>t>uM3-0= w -0F 3:-uF 3zt:hP Y-jYF v F3V 3V _^UVW=2=22=2t03RY2Ww w:ue aPPjYF3V 3V Wr e_^U Eh+UVWǃ=3=3u3uw3 Z=3uQ>tG39u0536rYYu- ǣ3봉_^UV=h+th+53=2t03R Y2t3P,JP,xT,T,ƃ tՃ EQ= tu4= u0tt3=2t03R YqTt223R1҉3R=&u3R3R=|u3R~3RhW=;u 3RN3R;3R-3R f|jjh]VPX^UVWUUt3E} auEEEExU|,+M=,+E} ]5 ,+E]Et=2t03R Y.E ,+E]E}t}t ,+EE ,+E]E|E=u ,+]E\T} u"=2A03R Y,}t-}\t'}`t!}$t}"u}t ,+EE\Ee u ,+]E ,+E]EEE e E aE}t ,+E]EE ]EEn}~M ,+EEQ ,+E]E;E}tU ,+E]EU U yP,JP,xT,T,bE} ]t=2u}u hD Y}tt3h8 g Y ,+EEU+xUxU}N}>t}uK@_E=>uE}&uEE聿UBE=<`j)YE@EjY2UPмE=-u2B 32B }&u EE}tE-0UBU3\E=(t1}{t+i!u"i!u ,+]E$肾}(u E ,+EEU+xx ,+EEDž|}{uͻEDž|Ei!tH,+J,+xE]E@EE]EzEi!u3Ei!u h$ Y ,+E]Eti!u1^U@}x,U 34x4xhp j@EP  34xh` j@EP{ EPYU=D+t535D+h hH" uh hH" j~YUVW NxD5#U UU t5jYE1 }UfrF@3EU@3UU}UzU uUz=`8+j WYY=tUfzWaY8+J8+u54+Zt|uh }YWaYuTEPu4YYURUB}t p"\"}t t"\"_^U VW}WUL+8+U UwjVoaYYEy5&QYPVh Z| U9UuuYYu`YwhhAVa Ey5&XQYPVh { 럋whhAV` Ey5&QYPVh { b xGU W :t U U1uw YY"W?YE(I l8+J8+u54+Ztz_^UVWuEP9`Yy h4 &{Y>u-V rEaYǁV Wru jjj: nua_YjjOYYjjOYYjjOYYjjOYYjj OYY>uV Wru uv !YYj^Yu^YE_^UVW5@31 }KVz=t:u TW^YVzxVzWPYYVzP^YG8+@3VLY8+J8+u54+Ztmy_^UVW5@3t01 }%VzxVzP(^YVfzG֋6_^UVu ju"^ ƅy=&u^U1=TUUUUV^UUlUVW}01"tX:tQ8+6JYH3t-H3P(Y8+J8+u54+ZtMw^UVWUH3օu>t=H+t4u/ =+t$=+t X EhUJցƤ3>u/ju LYYE=u h wY}u>t9u18EEE x :huuKYY_^UVuJЀ3tJЀ3t jVnKYYJƀ3^UhuMKYY}u=P3uuUJƀ3d+UVJЀ3u}0FJƀ3L+U4H3swYUL+d+^U39Ut!jYjYj YU3U,VW5 jEPT uF5 jEPS ut>=t EF+U׃}tuWhLel WU} uM u xRYEuYYt*V u } u u1j=v YY61_^UVWE34s7tVtE6ދUBRYEE34s#7tVt VEE6ՋEE_^U VW34c}E0NVu)EVu v*;YVuV;Y‹Vtv)YFfu륃g_^UVW34s&7tV uvhtYY61_^UVWE :ruE5P+cY}q(+(+Uj=uQYYDžtG2uYE]3tuv2YYtU V뤋6uWu E3}4E0UV~?=tEp"Hp"zy5p"YPp"ZPp"ZG붡p"Hp"zy5p"Yp" p" 6^EC1_^U=T+u hxfY(+(+Ut uY1UVW8+jYNjU:-u*zu$j 診YG j w h+ 1u}YE]3tuvYYu6uIj=uyYYtju莺YPEYYjjuf E0G G 3VW VWN j=u YYtju5YPYYw += +8+J8+u54+ZtPe_^UVW5 +j +~uj h+v v 7Y5$#V u wYWu wp7YVWV WV]7Y_^U}u u1YY+}uU M jrq5 hdY1UVu >t6FY6 Y1^UVWuYNj7uvYY|8+j=v西YYxuVtjh0+u fN Vuu vj6YV_6Y8+J8+u54+Ztc 7^_^UVWuǀ>t >=tF'13_^UVWu} G9uF<=u>=u u1_^UVp,l,d,5&>tj=6舾YYt j 6\YY^UX+`+T+=@+t P,Nh+=@3tp"4"t"H"=d"t5d"4Yd"UVL+f+'+sFc33s >uF^UVWEE} }t7tDhV-HYYuhVHYYuEhVHYYuEƅ?FEЄ}\}pEu1GE eE \E SE ME GEEMx7-0=s(F-0]È]NFRp"Hp"zy"5p"ZYEPp"Z"EPp"Z ?p"Hp"zy5p"Yp" p" }u:p"Hp"zy5p"Yp" p" 1_^UVWE  ME}tu E@}[u:UJM h`4FYYt hT `YUJM EU UDžEE}؍u v,YFE=>u(j 谲YEvh(j uNUV>u~t F FE=rE9 utvCYYtIE V}uPvBYYPvBYY}| E}u SVP> =t =uM܃}wU9}t}uE}uFPYtE܃}t}uE}uFPYuE܃UfEfG}tN<u@hYY1<u@htYY@t h]Yt1G]9u uW>YYu+U Й ɸ_^UY@Pr(YƉEuUΉUEOZFE7u?^uGFE?]u }C-u]t-FFOF?-u-F-F-FGGFEGF+UU?F}E } uEEUUNUĊ M}uU܈F} E-0= wG-0k] É]݋UĈF?,tUĈF1GE-0= wG-0k] É]݋UĈF?\uG?}t h VYGuGE=(u5Eȃ} ~ hVYFUȈFU؋MȈ EE}})u+U9Uu hZVYFM؋U؊ FEL}{u E E-1= sFE-0FEFMFEGEGU9Ut hUYUf4E_^UVU 444w u uYY^U4VWu} E}rEU9Uqu[+4f4GF9t?Gu3EEEGEπ>t;>-u!F]9'F]9|E]9uEFFU9U?F<4*+4f]4F4UFE4EMG]E9tW?LEEFEF]uEu}EEF,bE}u1IEU:uBE4EMU9U|UUURVYYt޸1_^U=T*t 5T*5(j8 T*UE(T*T*BT* X*I9r"X*X*P5(:$YY(UU:tEPYU}uj^Yj?{Ya}t!U }j^_YU@RQY:=#t&Et jM8Yj-0YUR"Y EPYUU:tEPhYU=H*tH*D*8#:t #"jEPj7 =uEUMx!=\*t5\*YjqYUV=p*p*1҉d*`*hx YƅupVP)YYy`*Pd*sPhl+YY\*t5\*bY\*hh*Y`*hd*Yd*=`*~ =d*`*Pd*^U VWE19u~U 46Y9E}}FUѡ`*Eh#YE}@E19uo9}VU UR6YEEMxUPYEU9U~EU9U} j Y}h#YF_^UVWj Y5(Y=@*5(Ox PYF_^U=\*t5\*YjKY=@*@*J(:t<@*J( }'=\*t5\*SYfjYY=#tP@*J(t>=\*t5\*YjY=\*t5\*YjY}u @*U(@*PY}u@*UjWY#UE_UUE_EEPY#u##UVW1(5@*֋4*9@*}*> t­%u}uj4*uYUV1UEuBF950*uY^UhmYUhYU1҉(4(aYU(J(4(BYUVuU  Mu 1/>t%]9uuu V/ u1Fָ^U VWut(>t#=l*t 5l*BYVEYl*!=l*t l*:u1o5l*>^u EdG EW.YE(UU t*(uW4(U uދ(( U(1_^UV=h*t h*(U(R'Y=0*umE8ƋU(h*5(Yu=L*~L*)uVYYtu VXY^UV14*9@*}jYF950*^UVu =(t5(Y(~7FP]Y(t$(UVR5(, (^UVW}~@*94*u 82}4*J9@*t 4*(5@*ֿj WY>t }j =Y#=#ttj Yj YWzYU@*94*}4*+@*U s}~u5@*YY(5@*֋U@*+4*BOx U F4*+U4*(@*RVY_^UV1=@*tjYF950*^UV1=@*tjYF950*VYY^U=0*te@*90*}&U0*@*6U+@*RY*@*90*~j,Y0*+@*JRY?4*+@*R5@*eYY(@*@*4*UVW=0*t =0*}UUEEP~YT0*BRYDžu90*UMxUF0*W5YEWcYE_^UVW=u [tCOuO<@1oƻ_50 sO00*I=t0 sk0* -00*H*5D*4As VY! %t9uW k_^UVW}@*<*=#t&ǀtH*!D*B$~t 9t~tVWYE=H*u 0*E_^UVuƀt 954tu 954u)=@*t@*G0*X954u=@*u=4*u7954uL*954uL*^UV0*1҉4*8*@*<*(L*J=tVC(O1KDyס(612+`V5Y2VY21^UVW}Wd YDžt\=(d}(A (<(.5('Y1c}B((F<((J(_^UUUV=(u"@P*RY(u1jYh#8YX*RwY(}tE#(P2Y[ƅtVe Yh#YjWY5(5Y(J(4(Yt/>t*=(t(J4(V%YYtVY=L*~#L*UL*ue$P$YY^UU=@*t@*U=0*u0*P,YU4*9@*t @*UVW(5@*95(s*N95(s ~\uNPh#$YYtF+(+@*BURYEu17}(@*9v>\u(@*F9tFGE_^UVWJǍEPWk YYƅtWwYt,uV`YYNxU4YYuNYT_^UVWǍEPW YYƅtWYV $YEP YEE>A |Ph#a#YYt}t~t U\EFUE붋UWY}t uPYEu|Y}tE_^U(4*1U=@*4*9@*uj1Y@*J( MjY(@* @*I (@*J(PY@*AEP5( @*YZEPYUE=u uYU4*98*~{D8*9@*~#@*U8*@*U8*8*+@*RYU@*8*UV=tu5.8*94*r@*8*5@*^U=(t(:t5(ZYU4*98*~I8*9@*~@*+8*R58*YY8*+@*R5@*YYUVWE=u9@*B֋(954*~9Uu 5@* FG߸_^Uj-YUjY@*9<*t +<*U<*@*uAYUVW1(5@*95(sV­%u jOYN95(s ~ tV­%t j'YN؃=@*t G9=0*_^U~@*9<*t<*+@*RYUVW@UR YE] u1u­%tF> t>u11BVuWZY>> ­%F>tӀ> tΉB9UW@UR YEuUVURuuW E@u YUUE BVuWZYWFQU_^U VW=(t((օu V|Yƅu qEPVYYǃ=0*t&9=0*}0*M4Y.u~tۀ~.u~tσ}tuu VC uEVYE܁}vtOU4Y@1uLW@RYEu EYtRuu uYUUEVYUuu uuYEGuY}uN}t# E10NE1E׍U9vN VYƅtVuWZYhYƅt,VuWZYthwjWu6_^UVWj/uYYƅu8h%YDžu fuYƅuKWhYIubYDžu3+UBFVBYƅuW+Y E 8E01_^U(VWEPEPuL y1EPuu< EuuYuY1EuYE؃}E E0Y+EؿǍGP`YE]UWRu uTY]P3HYZPYEuuYYhuYYE0uYYuuYYuYE }|u؋E0YE9uv)9}vU] 9uGF9us8+UؿWaYEt]UWRu JUuJYuAY19uvU4.YFu"YE_^U EPEPuU y1)u uuI EuYuYEU=&t&jOYUVuj jV ^UVWu1E%tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5&Nx 4^U=&t&uDYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV*U9*wU*9*v& 16VYt1'*rF5*&Y5*^UVW}u1E}UUs& 1=*u8jHY=u1V!փ5*5*FE5*OVU}9}r69v2W9UvUW~>}t E*u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=*<9}r79}u+UOJ}t E*URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^U VWUUb15*t 9ur6E0tU U*tU9ru NJEtU9Wu RWE_^U} t#U*U JUUuRu UVW}U9U ^UU UU +U1EE9us0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+&"}t}y UU_^UUAs UEUUas U EU$UUEPjjg y U&1UVW5&&}׃}~9r }y 9vWYu_^UVWuU VVua YYDžt~~yVډ&F_^UVW}u YfE=&h\YEu ELPU:/tHhDYEt/u uZ YYuhuW E4h0u& YYEu&E+UMuRQA uuY&1W Y-E8\t%tF>#tEPVu u&E8|t E8:uusY>t >|t>:tFF<|t<_^UV5&t}uEF<:t ~u1%tFjuVD uˀ~#uōFPVY^UV5&t}u7F<:t ~u1&%tFjuV uθ^UVW5&E 8t}u1F<:t ~u1%tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!Fd GF9GE UE 8E_^U VW*EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F" +EUU FE*_^UVuu>t FPUY^U$EPjj U$UUU UEPj%jm U$UUU UUUE`EPjGj< U} v&M E 1U} v&M ҋE!1UE1UE1U} v&M Et1UUM J} t U RY]uEPu B1UEUUzt RYuh*rU RuZBRY*UVW11}U90(u 0(F߃| jugYtUrYtURtUzt rY}'t}(t}(t u~Y_^UVWuEu41}%<0(t40(YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv* =u N /uvv EU9Uu1 N _^UV1}*<0(t0(Bt 40(aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<0(t,0(R@t0(Bt 40(YGƒ~uF*FF VVv vv >uNN FFSX_^UVWEE11<0(tN|1DFρECEE0-EMP1E E U :t! EE E 4 U uuuwYYEy@Ut8huYYE~" tuYuu3YYE}y1]jYEu uY1A!uEUMJUzUBU0(E_^OgsC 7 S . USE] ![]USE] ![]USE] ![]UVW}u Ms UW}0))ϊE tu1_]XG_] UVW E_^] T$  L$ 7 UW}0OE uG_]1_]U 1 Uujj< Ujuj( U$UUEPjj U$EPu YYEPj j U$UUEPjj U}u& UEuYuYU$U UEPut YYEPjji U2E Pu ULVWE1EEU UE8t+0@YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s&KV8YE=u&&UEUUU}׋U UE8t=+UEEE0RYE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WE }׃E뻋EEU9vGuYEuUUȋUUEEEPj;jR RY_^U(VuEEV֋RUV֋RU E kUUU UEPj7j ^U$EPjj U$EPj/j yEU$EPjj yEU$EPjjU U$UUU UUUEPj6j' U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu|YYU UEPjjk ^U0VWEPu YYy1U؁@t&1huKYYDžy1EPW2YYxS&U؁@u7jWYYEx& PjW xh$Yƅu&UWYUЉ&1FfFF_^U$EPj*jU yUEUMJ1U$UUUUU UEPjj UVWuu& 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V**5*h*jKj9 ^U$uNYEUUU UEPjj Uu hT$u UV& T$@, T$@% T$@&E uVuO ^U$UUEPjkc#ZsXsXfR[[׉1ۇ(tPXPwaitunsetumaskfalsetrue:trapshiftsetvarsetreturnreadpwdlocaljobsjobidhashgetopts[testexprreadonlyexportexitexecevalecho.chdircdcontinuebreakcommandcan't cd to %sCDPATHHOME not setHOME%s ...pwd command failedCannot exec /bin/pwdpwd/bin/pwdPipe call failed%s: %s%s:  1gJ J V b m Node type = %d Pipe call failedPipe call failed_normal command: builtin command: Shell function: Pipe call failed%s: not found falservfunction %sbuiltin %s%s: %s %s not defined in %sfuncbuiltinbuiltinP('(("("((null or %.*s: parameter %snot set%s 1!.#.$.*/-g/00?.@//etc/passwdHOME/.;z:;*:?:[;sh: turning off NDELAY mode Out of file descriptorsCan't open %s (core dumped)Signal %dExit %d %d [%d] %d %dNo such job: %s%s: ambiguousNo current jobCan't open /dev/null/dev/nullCannot fork - core dumpedSignal %d%d: zQNqP%OOO^ONOOOO P1PzQXPPPPPPQmQmQ???<<...<&<>&>>> () ... in ...case in ...for ; done; do until while ...; then if )( | || && ; }-+?=You have mail6T/.ashrcHOMESHINIT.profile/.profileHOME/etc/profile Use "exit" to leave shell. Can't open %sOut of spaceOut of spacestunalloc IFSarg countep:Illegal number: %s%.4o Illegal numbercpbbbbbbpbpbbpbpbb c!cAcAcecececycyccced!dDd[d[d[dddxddddddee9e9e9eYeYeseseBad -c optionIllegal option -%cOPTIND%dOPTARGNo arg for -%c option Illegal option -%c OPTIND%dUsage: getopts optstring varNo arg for -%c optionIllegal option -%c"esac""case""}""{""done""do""for""until""while""fi""elif""else""then""if"wordredirection"`"";;"")""(""|""||""&&""&"";"newlineend of fileesaccase}{donedoforuntilwhilefielifelsethenifnn4n:nm6uuuu6u6u6u6utu6u6u6uu4p6u6u6u6uqqsq6u6utu sexpecting "in"ininBad for loop variableBad fd numberIllegal eof marker for << redirectionR{ z y fz y#z&z(*{)8{;z\ z|z} 3|{|:}F}Y}}}(~L|Bad substitutionMissing '}'Unterminated quoted string%s unexpected%s unexpected (expecting %s)Syntax error: %s %s: %d: Out of file descriptors[[cannot create %s: %scannot create %s: %scannot open %s: %sPipe call failedStopped (output)Stopped (input)StoppedStoppedTerminatedAlarm callBroken pipeUser signal 2Memory faultUser signal 1KilledFloating exceptionEMT trapabortTrace/BPT trapIllegal instructionQuitInterruptHangup%s: bad trap%d: %s ێR+4=Signal system call failedٗX&cdosǖux&PSE=* PS2=> PATH=:/bin:/usr/binMAILPATH=MAIL=IFS= PS1=# PS1=$ PS1=%.*s: is read only%.*s: is read only%s Not in a functionList assignment not implementedƤ 0\פbYcbfinrr{tv-e-n--true %ld %s true%dExpression too complexsyntax errormissing ]]:$%,3lszªɪЪ cz:: +<MXfuDivision by zeroDivision by zero-n-z-t-L-h-s-k-g-u-p-b-c-d-f-x-w-r!:%/*-+-ge-le-lt-gt-ne-eq-newer!==&-a|-oЭ$c*u.ح[\]RE errorRE errorRE errorRE error ڰfvӱޱlicoledumbTERMSearch: A B*C4D>mmmm}m /choices/unknown errorr/etc/termcapTERM/etc/termcapTERMCAP 0H1H2H3HEb8f@n r(t0\% +2PdirOOPSaprKwZ+bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0!!!S>EL+f|T,Y4nYjEB]6jis`-JE x p h `\TLH@80,$ @(#)cd.c 5.2 (Berkeley) 3/13/91@(#)dirent.c 5.1 (Berkeley) 3/7/91@(#)error.c 5.1 (Berkeley) 3/7/91@(#)eval.c 5.3 (Berkeley) 4/12/91@(#)exec.c 5.2 (Berkeley) 3/13/91@(#)expand.c 5.1 (Berkeley) 3/7/91@(#)input.c 5.4 (Berkeley) 7/1/91X,@(#)jobs.c 5.1 (Berkeley) 3/7/91@(#)mail.c 5.1 (Berkeley) 3/7/91@(#) Copyright (c) 1991 The Regents of the University of California. All rights reserved. @(#)main.c 5.2 (Berkeley) 3/13/91@(#)memalloc.c 5.2 (Berkeley) 3/13/9100@(#)miscbltin.c 5.2 (Berkeley) 3/13/91@(#)mystring.c 5.1 (Berkeley) 3/7/91    @(#)options.c 5.2 (Berkeley) 3/13/91efIijnsxzv@(#)parser.c 5.3 (Berkeley) 4/12/91, $     x | t p h ` \ X P L H @ 8 A@=}-+?=@(#)redir.c 5.1 (Berkeley) 3/7/91@(#)show.c 5.2 (Berkeley) 4/12/918 , $  | t l \ H           @(#)trap.c 5.2 (Berkeley) 4/12/91@(#)output.c 5.1 (Berkeley) 3/7/91d4"H"0123456789ABCDEF@(#)var.c 5.3 (Berkeley) 4/12/91D, ,0,$0,+ (3 43 plhd`\XTPLHD@<840,|xt # "#$&'()*:;<=>?[\]^`{|}~ TjQ|  % &Q6QQQ>4QQ .<F>`?bdftlmRuyw. ((((( AAAAAABBBBBB SSSSd5Unknown errortdL@$tdXD4$|dTH8$&&&&&&&&&&hTH0t`LCB'((  p@1$T$Lsu;SSSSu QRP P*UH1UV5Nx  ^U= t uY #U$UUEPjj U$EPj$j UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]SSSS  | N1$T$L|su;SSSSu QRP PUVWu E}~0V:-u(~G?tGttF1_^UVh5YYƅyhuYY?- Ph V EhugYY VDY1^U=| rU25uYYY- =_s:u=| s5u YY- =_s:u=| s5uYY- =_s:u=| s5uuYY- =_s:u=| s1UVWuCYEu 7YEu+Yu YƋUU r u5YYU u 5YYU u5zYY u5SYY 1_^Uu%Yu Y5Yh-YUVu>tF+URuj ^UVW5YNj5hYhY}t.U:t&uYPuV jhV WYPWV jhVv _^C[sw/2UVWME_^]RUVux95pd^U$UUU U5EPjMj? 6EPjMj- $U`UVWuU VVuMYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuLYYEPjjU U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$EPuYYEPjj U$UUUUU UEPjjs UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvj =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuxYƋU rU MJwU uR-YY^U$UUU UUUEPjj yEËKI|;u[u P1ۇttPXP from unmountedumountDevice not mounted /etc/mtab not updated. umount/etc/mtab not updated. umountUsage: umount [-s] special /etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : unknown errorFIMSNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 SSSS| ((((( AAAAAABBBBBB BUnknown errorhX@4hXL8(pXH<,TTTTTTTTTTx\H<$xhT@C  \H1$T$Lxsu;SSSSu`` QRPP"UuYPuj U|Uh YuYhYuRYPYhYjYUhYjYUVWEEEU9UUM :-UAMM 0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+|"}t}y UU_^U$UUU UUUEEPjGj U} v|M E 1U} v|M ҋE!1UE1UE1U} v|M Et1['fNUVWuU VVuYYDžt~~yVډ|F_^U$UUEPjj U$UUEPjj U$EPuYYEPj j[ U$UUEPjj; UVu x~| 5juIYYy9uuVYVju! ^U4VWEj/u'YYuh,wYƅu(VYPu~YZEЃeuYE=u|}؀>t >:tFG9}s/GuWYYEPuYY=t4`2u u =|t |Ũ}t} uFuUR+YỦ|_^U(VuEEV֋RUV֋RU 4E gUUU UEPj7jf ^U(VuU @t*u6YEU UV֋RUUUEPuYYU UEPjj ^U$EPj>j UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjy V5hjKja ^U$u:YEUUU UEPjj( U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UW}0))ϊE tu1_]XG_]UVWE_^]UVW`Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVu@YƋU rU MJwU uRYY^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s|KVYE=u|&UEUUU}׋U UE8t=+UEEE0YE܋]P3WQ }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuMYEuUUȋUUEEEPj;j* RuY_^U$} uEEUUE UEPjJj y}tUEEË} 0)ʇʋu }UVW}u M#UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP : intr: Usage: intr [-d] [-t seconds] command [arg ...] d?tH//dev/null/dev/nullsetsid()/dev/consolesetsid()/dev/tty/dev/ttyunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH  /dev/logSSSS ((((( AAAAAABBBBBB Unknown error pd@0p\H8(xdH4 t`L4 C\  0BNNDؠ u 1 %ġȎ؎1ND])0[6[[$b`1[[1[[ء [[[&D EUj?=rA=rs r.t*1ۉE &D E Ut[r~ utFV s36\6^0Ɗ[^(:F vF f PY!* N L\DDT [f @rFV (F u0tt O| 0rr0_^]1Nu&u mt0< u <uR0ÉGNôt <u0R1RÉGt< u  ÉG;`t,``uøOat010ábPX0Љ;1=rBru&GBuJ@uJУPø<ut5@t/@t)@t#t t@ %0-0txWw1м||U 1؀&?[uI[tvvvv[ tʸ3>[u11RPFV RvF Vڎ.. fXڸz  F V  1o  FV  1T  j8[@thh[tfvjvjv[ tj8h<jj0vvgظ fˣ[[f[vo=r 1؊6000䲀9=rO0tIr@&B È5È.&B Ã&H &H ډ16F 6F ´]È$ ÉF^ N VFF^ N VFfˉf1f&l͊fu hJfv ː.H^FfFf^fNfV fv$f~(fn,fUffF^FfFf^ fN$fV(fv,f~0fF41flЎf˴M fT" fX"8(؎  fT fX"޸ホ؎0>Pt"d`ddu$$8uUV ( sV9uDw7UXH: F.6X7Uvvv [Pv vrP3 47UvvvP7UvvvP7UVN[[VNPvvv;[RP# F tvvvP[6UVW1VR1[FVP7[[ t tVP2[OttA } t P[-V[PvW}Z[Z9~ufvv-2[[F u^F6U^PP37[[1 tC5UVW^7< t < u | uF^7= s < t1<(u#F= r4<(uFF<)uNuV~[ tFF= v Vi[ t^+VRu0[Nj^v7WF6^= u;^775UPVW~FP6[F tP*0[ƋVT5׉5UPPV6[TV[V0[F4UP0[4U>[t[_?;t P[Py[[v[Pm[[4U tP0[[14UPPVWPv vv[RP F tu~Ǿv^9v V Vt1IFv^9v0tw w\ZY9O wu9Ws [sP[P4[[[[[g1PP[P[RP[P[RP 1PP tP|[1}5Ӌ[[+WO Ë9Ow u9W wFƉӋ[[9Wu9O u>[}6[M6[Gt>[}Ӌt[i6[ӋWO P[P2[[[[Т[[[[>[|P[Pi2[[[[[,1UV Á( Svq2[[ uF10U~t~( tv,[0UV^?u( vF2[P+[vV"2[[0U^Gt^ u10UV[<tvw1[[ t4m0UVv[Ë7 tDu1DJ0UVv[Ë7 tDu1D'0UVWv[ljÃ?u9v[ t P +[v[DFDD 5L5DtD%#V9tDCD% FDV[ tTT t[t[v[Dv [D1s/Uv( Pvv:\/UPVv[FË tMDt&| tAt4[D( t([T TD !t[t [t[^V*[.UVWv1FF<-uF-0= w&F-0RP 1vv.Y[ӉN^ωRPFVu..UVop Pvv1Pv.[N vv1Pv-FV ủQ.U Pvv<.UVW1^Ɖ0 w0Aw7 awW F뽉-UVPP PaPP POPP P=.RPT[[PP P# Pb[SP P Pq[SP P PT%[SP PƆ[[seT TtXtPP=.[[Pt4qPP#.[[PP.[[PttHPP-[[땍P~P PB=uvpPzP P#\PbP PPTPPPPPPPPPP( PP[[PQRP[RPj t"[[QRP8[FP[P[[P[[+U^?t![?t^F1P[[Z+UVP PP},F[6[ u{DtmV[ udt[Dt Py[tr[ Pj[D%=tPO[tH[[?u PC'[_[[ 4~[[PQRP1[RP t"[[QRP&[*UPPVWF6[ uDtDtttt4P&ttV[ t(P&<tDFF1 u3Ph&[3ǃt ~ Ps[ ~WG[ P=&[4i)UVv-0= wF9vu1~u 01 u@^7)U1Pv[[)U*VW~1=*uC[ tGPW*[[ u>[uP%[Lb[[[[FPPV* uPV*[[ uF[}&[[BV[[€[V[>[tNW|PP![[P![[F t3FPv][[#V`tWbPv#[[L,VV>[}[~uW@PH#[[LF&U$VWF1DD >[|UTL QRPP3 tW[Ӌ7|uP[[[뤃>[t-<u(F~}VӋFFPt t1P|P tWL1P}PC[[=UtP5~t&PP\[RP; tW V6["[X%UVv,[F[V>[}~tNvP![[@[[L uƃuV[FPvP!V[_%U0>[unvP[[F tFPvN[[FPg[=u6L[PvP[!*FPB[FP:[F tFPvP1!$URP71$$U%(+FVRP(P%P$$U>[t6[c [[$UV[[[VN[[f$U>[t 6[6[[[9[w u9[w17$Uv8[FV t1>FVp u uvv1[[9Vwu9Fw#UVvDt\?u1\,tDt#UPPVWF16[ tV[=uF4BP[6[ tG6~t;\S\P6P!\tPP VS[|"4JF uS uLt6[ t'~t\9Fu| V [ 6"4 tvP*[[W[P[["UV s!<t 4`P[[t\P[["UVWF>[t>[ui t 6[[[V~t^_?;t F^V[WVR [F[V t^V t^V~u)~t ~tv[ t^_?=t^w[ t~t%~t^_?dtq^w[ uc^wF~u ^wNVvvF t"Ft  Pv* P[V9[u)^~s:v[ t,^_?(tvvFF~tC^_F=;u~t,^w\"[F^V~{uF~}uNuv[9vt/tW![[t[ uw[ u  PW![[4̋^W1PRR![-[Z~tP[[A^_WSvPF t"FtPvPc[V9[t#W[^?{u96[FF<t ={uF=}u Nu;4 t~s~ t ~tVY9[uh|ƃ~ uV[݉=t_=\tMP[MV9[u4 P[7 P[-( t@= uP[ GbtG뜋V9[t  P`[^~u9~u3^_?-u(^wPPSPY[~uK~t ~t~u9~u ^w[~u ^wC[~u ^w [G~u=~ u7^w[ t)^wJ[FVRO+Pvv~tF FY6FXP[FI( P[F:(F0?F&4FF1P[ FzPv[[ uF~uv9[ tV[P<[[F~u vP[[v![~t(4P[V9[t[wPx[[H⸒Pj[[UP[V[6 P[P[[>[tNV[1>[u@UV([[P> P [[V[Px[[Vv[U t[>[tUVW1^F tO/t_u ru^-0= w B P[ u aw AwV[UFF~ wu~s VN VNvvvNPC[RPvvp݃ VN +VNVN V VufVNVNVNVN 9Nr u9VvVNvvvvvv݃ VN +VNVN VNщVNGU VW1[V~u^WVGut^GtWn[F=u101Pv[[vd[PWY[ZF9Fv)^vS,[[^| PS[[^WS[[v^Vc[t[[[[QR1PPRP[[W[\Ã^9^v^r PS[[^WSh[[v6[6[1PPRP[[W[\Ã^9^v^h PSb[[^WS[[v9vw N P'[1 ^UVW[t\\VN19>4]y[ƋTL +TLQ6][VTL+TL Q6][VvvvۃFVvvvhۃFVvG~[u^^6]WG(\*\RSQ&ۃ(\*\vQR ۃ(\*\vQRڃUV:Pv[[ u1~ P+[F uvv[[F:1~u@kUPPVvTHLJVNDBt DD0FVDB tVNVNTLLNVNVNQ [ЉUPPV^SR[[FV!ƒuLPP:V Vu1PP,VN[[QRvv1PPY[SQXZ~U[[:]<]VNЉ^UV VutvvB][[FV!ƒu1V VutP1PvPvVN+pr19r$u9tvVN+prӹ ㍇vtVNprtBt sN1prQR[[ u9FVvvB][[FV!ƒtt1pr9Vu9Nt6t6r6pvP[RPك F t!v6r6pރtL1vUVW~vv[[ u1cEBt UD0֋T6]T[tW P[[12>6]r>6]vW P[[L16]8]UPPVW~F^19G}u9w~u7^OӉȃQRPSv[ZYO[[F u1FM8]9N wu9V s L 168]9vsv1PVv^[RPu5փ 5U^O)OVVV)V;8]1ɃM8]1!!+E1PVu5r5U^O)OcUVWdžd P[PW[`b1P[ P}[v[ Pn[1FF[[VN[[[[VN9[wu9[s[[VNn^VN|~1PP~|1>]@]9Nvuu9VrkuvP PL[ƋVNӉȃ^FQR[[F uppPvFP%~u~t LJFPX[ uFP[FV뗀~u,b%u`sb`| P%L uCFPvv u8]1ɃVN8]1!!ȉ^FVNVN1P PFP[RPؙ|~RPӃ du%T P[[tJ P~[ P[dždV֋N؉rtVڋN܉npVދNjl[t6VN+np+jlfhF u+rtfh 1fhVNTLVNLFtF0rtFtTL+8]TLF tMvvFPrPFP uwVNTL Ft +8]TL VNT L0rtVNT LTLTL rtnpvvvvvvt ttt. P [thf( P FP" P [[vvFPnPFP u t[t1fhjlnpjl8]1Ƀjl8]1!!ȉxzjl+xzjlVNxz9Nwu9Vs L zxvvxzVNjlfh8]1Ƀfh8]1!!ȉxzfh+xzfh^F^F\D u+[t$[[VN[[[[VNG{>4] uv P` [[L86\6\'[[=oRt P< [L[u1PP~|1PPeЃ u LP\P_[[ u L P"[\ t\D[^ u" P P[P[[ u^^[y~|P\P6[6[6[6[6[6[Ӄ[u 1PP6[6[\Pc[RPσ \P[j t[L UVvFP[F u 1ۉ\\1bVv[[FTLVNVv[[#Tu&VN9L|u9TvVVFPv[[ VNTLFD U4VWvVV[P=[P[[ƃ>[tVP|[[F t|FPV[[ tE^Fހ?:u:v<[ t/B]:(V[:]<]v[>]@]2 PV%[[>[u  P[6L%[PV PFPv[[#VunVV [ZЉǺ#V@tP[PV PlFPz[FPr[/GFPWU[[F u V P^[[8FPv![[B]'VNQ [>]@]V[1 UV PU[Py[ t9VN[$V P[[!Vd P[[VL P[[ L8 VJ[z U帀WP1PPgԃ2PWPNPG > Oh$u,NNNOOOSR6> Ou*NNN ON1SR1PPXZ UVW~ORPOY[ӉN^VJ16NFFVJ16NVVNVNWPvvӃ> Oh$t^㍷W.OT0OT2OT4OTL 6O8OT L:OO@OTLBODOF~ |V\w7^㍟FOGFы^㍷W.OL 0OT2OL 4OTL6O8OTL :OO@OTL BODOF~ }$V\1P7^㍟FOGFnOVpOnOpOU.OU0OE2OU4OE FOU 6O8OUM:OO@OUMBODOUM1[[[[1ۉ[[UPPVF#.O@t L~t6O8O9[vu 9[rt6[6[1PPpF u%WP6[6[1PPRPF[[RP=уFWƋV tPDPv ^G[[gFUVVNVN1vv98Owu96Ow PP(OV^V^VNF)؉NFN~w?u9Vs8^㋗FOHOVNOQRZ[V^V^SRVN+NVNN~w u9VsN㋗FOHOVNN㋗FOHOVN u1PPDOV^V^9[u9[tSPvvσVN[[VN+NVNQR1P6N Ɓ> Oh$uSS 1PSFFvv1P6NLFVV Vu1PPOV^V^9[u9[tOPvv΃VN[[> Oh$u^OO ^1POZYVNOQRZ[V^V^SRXZU@VWv revision Too many boot parameters emssize=memsize==label%s click size is bad %s requires features this monitor doesn't offer colorchromeconsoleKernel magic number is incorrect There are no programs in %s %s %8ld%06lx %06lx %7ld %7ld %7ld stack cs ds text data bssYou can't run a 386 kernel on this 80%ld There are more then %d programs in %s . Loading processorThere are no images in %s %s: %s Can't load %s: %s No image selected Minix5454 44 4Unsuspected EOF on %s Not enough memory to load %s %s contains a bad program header image> %6>X=c>d[=o=p=sC>u=x= Hit any key to reboot D] Out of%s Low on memory, use chmem to increase the heap  (null)<8L/?2.16$ v f V @  @xhXH<&bootdelayechoexithelplsmenusavesettrapunset0123456789ABCDEFxtatmcamdacgaegaegavgavgamonocolor ZRF:zpZ@0 pbRB& ~lbootopts0123456789ABCDEF0123456789abcdefD]D]8...rammemkmemnullfd0fd1fd0p0fd0p1 fd0p2!fd0p3"fd1p0#fd1p1$fd1p2%fd1p3&c0d0'c0d0p0(c0d0p1)c0d0p2*c0d0p3+c0d0p0s0,c0d0p0s1-c0d0p0s2.c0d0p0s3/c0d0p1s00c0d0p1s11c0d0p1s22c0d0p1s33c0d0p2s04c0d0p2s15c0d0p2s26c0d0p2s37c0d0p3s08c0d0p3s19c0d0p3s2:c0d0p3s3;c0d1<c0d1p0=c0d1p1>c0d1p2?c0d1p3@c0d1p0s0Ac0d1p0s1Bc0d1p0s2Cc0d1p0s3Dc0d1p1s0Ec0d1p1s1Fc0d1p1s2Gc0d1p1s3Hc0d1p2s0Ic0d1p2s1Jc0d1p2s2Kc0d1p2s3Lc0d1p3s0Mc0d1p3s1Nc0d1p3s2Oc0d1p3s3Pc1d0Qc1d0p0Rc1d0p1Sc1d0p2Tc1d0p3Uc1d0p0s0Vc1d0p0s1Wc1d0p0s2Xc1d0p0s3Yc1d0p1s0Zc1d0p1s1[c1d0p1s2\c1d0p1s3]c1d0p2s0^c1d0p2s1_c1d0p2s2`c1d0p2s3ac1d0p3s0bc1d0p3s1cc1d0p3s2dc1d0p3s3ec1d1fc1d1p0gc1d1p1hc1d1p2ic1d1p3jc1d1p0s0kc1d1p0s1lc1d1p0s2mc1d1p0s3nc1d1p1s0oc1d1p1s1pc1d1p1s2qc1d1p1s3rc1d1p2s0sc1d1p2s1tc1d1p2s2uc1d1p2s3vc1d1p3s0wc1d1p3s1xc1d1p3s2yc1d1p3s3zconsole{tty|lp}log~ttyc1ttyc2ttyc3tty00tty01ttyp0ptyp0ttyp1ptyp1ttyp2ptyp2ttyp3ptyp3eth0ip0tcp0udp0ethiptcpudp...fstabgrouppasswdprofileprotocolsrcservicesshadowtermcapttytabinet.confhostname.filemotdmtabutmpissue# Poor man's File System Table. root=/dev/c0d0p0s0 usr=/dev/c0d0p0s2 operator:*:0: daemon:*:1: bin:*:2: other:*:3: tty:*:4: uucp:*:5: news:*:6: ftp:*:7: kmem:*:8: www:*:9: nogroup:*:99: root:##root:0:0:Big Brother:/: daemon:*:1:1:The Deuce:/etc: bin:##root:2:0:Binaries:/usr/src: uucp:*:5:5:UNIX to UNIX copy:/usr/spool/uucp:/usr/bin/uucico news:*:6:6:Usenet news:/usr/spool/news: ftp:*:7:7:Anonymous FTP:/usr/ftp: ast:*:8:3:Andrew S. Tanenbaum:/usr/ast: www:*:9:9:World Wide Web:/usr/www: nobody:*:9999:99::/tmp: # Set timezone. TZ='GMT0' export TZ # # Internet (IP) protocols # # @(#)protocols 8.1 (Berkeley) 6/9/93 # ip 0 IP # internet protocol, pseudo protocol number icmp 1 ICMP # internet control message protocol igmp 2 IGMP # internet group management protocol ggp 3 GGP # gateway-gateway protocol tcp 6 TCP # transmission control protocol egp 8 EGP # exterior gateway protocol pup 12 PUP # PARC universal packet protocol udp 17 UDP # user datagram protocol hmp 20 HMP # host monitoring protocol xns-idp 22 XNS-IDP # Xerox NS IDP rdp 27 RDP # reliable data protocol iso-tp4 29 ISO-TP4 # ISO Transport Protocol Class 4 iso-ip 80 ISO-IP # ISO Internet Protocol encap 98 ENCAP # RFC1241 encapsulation # /etc/rc - System startup script run by init before going multiuser. umask 022 TERM="${TERM-minix}" PATH=/usr/local/bin:/bin:/usr/bin export TERM PATH usage() { echo >&2 "Usage: $0 [-saf] start|stop|down" exec intr sh } while getopts 'saf' opt do case $opt in s) sflag=t ;; # Single user a) aflag=t ;; # Ask for /usr f) fflag=t ;; # Force a full file system check *) usage esac done shift `expr $OPTIND - 1` case "$#:$1" in 1:start|1:stop|1:down) action=$1 ;; *) usage esac case $action in start) # National keyboard? test -f /etc/keymap && loadkeys /etc/keymap # Set timezone. . /etc/profile # Try to read the hardware real-time clock, otherwise do it manually. readclock || intr date -q # Initialize files. printroot >/etc/mtab # /etc/mtab keeps track of mounts >/etc/utmp # /etc/utmp keeps track of logins # /etc/fstab lists the root, tmp and usr devices. . /etc/fstab # Any swapspace on a device? test "$swap" : '/dev/' && mount -s $swap # Mount the /usr partition unless this is a single floppy Minix. if [ ! -d /usr/bin ] then if [ "$aflag" -o "$usr" = unknown ] then # We need to ask what the /usr du jour is. intr sh -c ' echo -n "Finish the name of device to mount as /usr: /dev/" read usr echo "usr=/dev/$usr" >/tmp/usr' . /tmp/usr fi mount $usr /usr || { echo "\ Please try to mount something else as /usr, then hit CTRL-D to continue startup. Mount $usr /usr failed -- Single user." intr sh } rm -f /tmp/usr fi # Check if the system crashed. if shutdown -C then echo echo "The system was not properly shut down. Checking file systems." fflag=t fi if [ "$fflag" ] then umount $usr intr fsck -r $root intr fsck -r $usr mount $usr /usr fi if [ "$sflag" ] then echo "Single user." intr sh fi # Any swapspace on a file? test -n "$swap" -a ! "$swap" : '/dev/' && mount -s $swap case "`printroot -r`" in /dev/ram) # Remove boot-only things to make space. rm -rf /boot /minix esac # Things should be alright now. echo;echo "Multiuser startup in progress." esac # Further initialization. test -f /usr/etc/rc && sh /usr/etc/rc $action test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action # Any messages? test "$action" = start -a -f /etc/issue && cat /etc/issue exit 0 # # Network services, Internet style # # @(#)services 8.1 (Berkeley) 6/9/93 # tcpmux 1/tcp # TCP port multiplexer (RFC1078) echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver rlp 39/udp resource # resource location nameserver 42/tcp name # IEN 116 whois 43/tcp nicname domain 53/tcp nameserver # name-domain server domain 53/udp nameserver mtp 57/tcp # deprecated bootps 67/udp # Bootstrap Protocol Server bootpc 68/udp # Bootstrap Protocol Client tftp 69/udp rje 77/tcp netrjs finger 79/tcp http 80/tcp # World Wide Web link 87/tcp ttylink supdup 95/tcp hostnames 101/tcp hostname # usually from sri-nic tsap 102/tcp # part of ISODE. pop 110/tcp postoffice sunrpc 111/tcp sunrpc 111/udp auth 113/tcp authentication sftp 115/tcp uucp-path 117/tcp nntp 119/tcp readnews untp # USENET News Transfer Protocol ntp 123/udp netbios-ns 137/tcp # NETBIOS Name Service netbios-ns 137/udp # NETBIOS Name Service netbios-dgm 138/tcp # NETBIOS Datagram Service netbios-dgm 138/udp # NETBIOS Datagram Service netbios-ssn 139/tcp # NETBIOS Session Service netbios-ssn 139/udp # NETBIOS Session Service imap 143/tcp snmp 161/udp snmp-trap 162/udp # # UNIX specific services # exec 512/tcp biff 512/udp comsat login 513/tcp who 513/udp whod shell 514/tcp cmd # no passwords used syslog 514/udp printer 515/tcp spooler # line printer spooler talk 517/udp ntalk 518/udp route 520/udp router routed timed 525/udp timeserver tempo 526/tcp newdate courier 530/tcp rpc conference 531/tcp chat netnews 532/tcp readnews netwall 533/udp # -for emergency broadcasts uucp 540/tcp uucpd # uucp daemon rdist 541/tcp rdistd # rdist daemon remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem ingreslock 1524/tcp # # Kerberos (Project Athena/MIT) services # kerberos 750/udp kdc # Kerberos (server) udp kerberos 750/tcp kdc # Kerberos (server) tcp krbupdate 760/tcp kreg # Kerberos registration kpasswd 761/tcp kpwd # Kerberos "passwd" klogin 543/tcp # Kerberos rlogin eklogin 2105/tcp # Kerberos encrypted rlogin kshell 544/tcp krcmd # Kerberos remote shell root::0:0::: mx|minix|minix console:\ :am:xn:bs:\ :co#80:li#25:\ :is=\E[0m:\ :cd=\E[0J:cl=\E[H\E[0J:\ :so=\E[7m:se=\E[0m:\ :us=\E[4m:ue=\E[0m:\ :mb=\E[5m:md=\E[1m:\ :mr=\E[7m:me=\E[0m:\ :sr=\EM:\ :cm=\E[%i%d;%dH:\ :ho=\E[H:\ :al=\E[L:AL=\E[%dL:\ :ce=\E[K:\ :DC=\E[%dP:dc=\E[P:\ :DL=\E[%dM:dl=\E[M:\ :DO=\E[%dB:do=\E[B:\ :IC=\E[%d@:ic=\E[@:\ :it#8:\ :le=^H:LE=\E[%dD:\ :nd=\E[C:RI=\E[%dC:\ :up=\E[A:UP=\E[%dA:\ :ku=\E[A:kd=\E[B:\ :kl=\E[D:kr=\E[C:\ :kh=\E[H:kb=^H:\ :kD=\177:kI=\E[@:\ :kN=\E[U:kP=\E[V: du|dialup|Dialup line:\ :bs:co#80:li#24: db|dumb|Really dumb terminal:\ :bs:co#80:li#24: lp|lp|Line Printer:\ :co#80:li#66: li|ansi|Ansi standard crt:\ :am:bs:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:co#80:\ :dn=\E[B:me=\E[0m:mb=\E[5m:mr=\E[7m:md=\E[1m:ho=\E[H:li#24:\ :nd=\E[C:ms:pt:so=\E[7m:se=\E[0m:us=\E[4m:ue=\E[0m:up=\E[A:\ :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C: vs|xterm|xterms|vs100|xterm terminal emulator (X window system):\ :am:cr=^M:do=^J:nl=^J:bl=^G:le=^H:ho=\E[H:\ :co#80:li#24:cl=\E[H\E[2J:bs:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :md=\E[1m:mr=\E[7m:me=\E[m:\ :ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:kD=\177:\ :kI=\E[@:kN=\E[U:kP=\E[V:ta=^I:pt:sf=\n:sr=\EM:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:\ :MT:ks=\E[?1h\E=:ke=\E[?1l\E>:\ :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:\ :rs=\E[r\E<\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:xn:\ :AL=\E[%dL:DL=\E[%dM:IC=\E[%d@:DC=\E[%dP:\ :hs:ts=\E]2;:fs=^G:ds=\E]2;^G: d0|vt100|vt100-am|vt100am|dec-vt100|dec vt100:\ :do=^J:co#80:li#24:cl=\E[;H\E[2J:sf=\ED:\ :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;24r\E[24;1H:\ :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\ :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\ :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr: # ttytab - terminals # # Device Type Program Init console minix getty ttyc1 minix getty ttyc2 minix getty ttyc3 minix getty tty00 unknown tty01 unknown ttyp0 network ttyp1 network ttyp2 network ttyp3 network ttyp4 network ttyp5 network ttyp6 network ttyp7 network ttyp8 network ttyp9 network eth0 DP8390 0 { default; }; noname /dev/c0d0p0s0 / 2 rw /dev/c0d0p0s2 /usr 2 rw /dev/c0d1 /mnt 2 rw .........2.0.3kernel  0' UVW}t%5@&FCʃ%]U E؎м+RSj(jj00f؎f@j} ! ! jpYt!$!! ! jtYt!$!! ! jxYt!$!k! ! j|Yt!$!;! ! jYt!$! ! ! jYt!$!! @! jYt!$!! ! jYt!$!{ 桰 jYt$K 桰 j Yt$ 桰 j Yt$ 桰 j Yt$ 桰 j Yt$ 桰 j Yt$[ @桰 jYt$+ 桰 jYt$`ffffҎڎ‰u+h31`(hU`(UVWffffҎڎ漘+1SPQp F$=ta%T$@D$@ ffffajOjHjAj:j6j2j.j*jFj "j >j :j 6j 2j.j 6+6+6+6+PD$6+D$6+D$ 6+X5+5+5+5+5+%xhTLXUVW}uYu sY8u`YE=v+WP5y h$Yh VYYu hVYYuhaYPYh JYƅthV}YYu "hV`YYu|_^UVW+>t.}?t9uGF?u >=uF Ft1_^U VWEUfUBEUf-UBjh05hjh5hȃ!jjjhЃjjjhjjjhEs@VDMjj RͰPUյUV@EjjhPhns"WʎR7GP fnh_^UVuuu V= UʚV^UVuuu V UʒV^UVWu}#U fVU VU VOv fʀV!fVV@V_^UVWU4հVN N щ_^UUf!UE UVU4լ-#U ffF0UVU fV^UEH40%f(ڎŽ_^]fˀ=u%%UVWS䡈!P%!桸(Ї%5ԫ5Ы5̫5ȫ5ī55555؎h* fl$Līȫ̫Ыԫt 0؎Ї%%@X! ث[_^]VW!؎t$ t$|$ |$$D$_^T$)T$)fT$D$T$D$fW!T$ |$L$fm_W!T$ |$L$l_V!ًT$ t$L$fo^V!ًT$ t$L$n^L$Ās ! ! 桝ËL$Ās!u!䡄u 桝Ý1VW!t$|$D$= rك)&&%&_^َ\$D$UVWu} U#=ѡܫ)9v)=tfx#f+=u_^]UVWu} U9r6#5#=ѡܫ)9vܫ)9v)@u5t|#5#=эF9vG9v) u_^]5=&f+5+=ËD$x"UVW1oW0)h(YEtQ(sDVuYYu0) EVEUuRYY G_^UXVWjMSYCWs~h4G9E<4W EPPYYyCU؃z~ UVdᆳދU؋RUUV8 UEdžBU}UM j RQ U UU UE uEU UUV|U쉖UUU艖UUU艖U艖E}8s,E܋U9uUUEU܋MM+JىJEˋE؋V,uF4x V8V8t tV YFtVxYG<ǂ_^U}t2uh4YY} tu h0YYh,Yj>YUVU4=u =l1t@~mu+Fm=t rp55Fp|#VtuzttFlTBftFl=t( 555(dž^UVW U *r} zt R5u }t6Utuu V& ǃ}ttuu V _^UVWuu} t} t gU <u JUU U#U UU9w9Ur9Ur Wtt?U9uu URttUUѺ#WtuMzt Vh9u6uvhgtnWYbU~tuVYYNtU Uu Ut UUdž1_^UVW}Wtu} ztU 9VhuYuvh9uUftuVY1}u냀lt*} zt} uEUBGl1BU UtuWYOt=~hu} zuS1_^UV5t5<5 t5*5$t55^UVuu5=t( 555(džYu/= t,5 5,dž!=$u50$5$^UVW}uZWd:ᆳtwhhHYY59u"9=E(bu15 9u peE,(5$tR9u$C;E09tօuE98uE0_^U=$tE0 $$0$$0ǂUl1uu u El1Ul1vl1Ul1uYl1Ul1u5Yl1Ul1$l1UV=l1u>5Vpu FmvhY5u^UVW=kE Ɓ,}uhY|=uuvwhOYYV>t 9VvuhLYY6h<YYw,w0whh|'hh`YY_^UVhp1hzYY]hp1YZhp1NYHhp1Y6hp1pY$hp1'Yhp1Yhp1Yhp1Yhp1uYhp1Yhp1Yhp1Yhp1; Yhp1 Yphp1 Yahp1 YRhp1 YChp1Y Y4hp1Y%hp1'Yt15t1hp15p1<YYaU VW}WU􃺠thxh53M W 4thhh5M V@UuV:UV@W VhNtftǍPYdžWF$dždždždž1_^UVWEUUzRUW *r |4Uj$uj4/Euhh 5L Vxj$Ru V YVtUft}t ~tuVY1_^UVWEUUzRUW *rhh.5K 4Uj$uj4sEuhh45bK Vxj$uR 1_^UVW}W4thhJ5K  t jw YYWUV8jjFTPl WV,ftuVuYjw7P Et9jRu5 UU |EU1_^U VWURUUR UU<thh{57J U4thh}5 J dž~tuVYhPYYVt    !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~o^tM9u?UU􋒼Ut9uuM􋒼UUҁ떋Vtt P$YdžFtdž1_^UVW}W4thh5H V8W1_^UVW}W4WW WWG1_^UVWu~fVB9=shh55H Wvv Euhh5H W5u v/Y1_^UVWUR4th(h5G Ujrj5 Euhh5vG UjRu }Ǹj@VEP EUUjHWjV! Eu UjHuR W䉕t}V,UVUtV}EU쉕|UxjtjV Eu+xjuR tV8UV,1_^UPVW}W4th4h;5AF jHwjV# Eu UjHRu Uu `UtUV$UЉVUV,UV81t%E EPRYYEG˃}tEPjYYU VW=|tjaV)V~XMM1_^UU rYu'=`3t =`3uU R 47Y1U 5EPޭYYH@3 D3PEP跭YYHH3 L3jEP虭YYH83 <3U(VWu vYEu V U~ t iFE E8U9WsuhhLLYYڋW+UWU REPYYPu:uEPƬYYUPRj~ uV,V~ u V0E@jvv h$jt#Vhc5YY,F1_^U`3h,3(3- 1UBUB@UB U$VW4|sVYƤhhh4 h'Y4|s>tVYƤEPhz׫YY}tɋ}siǤƁ4#u41t ~juujDwiEPVYYXEPVYYGEPVGYY6EPVYY%EPV!YYEPVYYjuujDlE UVWu} ~H~ E Ewww S u EFADFBG FCWVDWVHV~uU~JujVYYF}$~u`jVlYYaVVYV6Y~Ht7GtE1҉VLVH EFACuw 7jD_^UVWu} ~X~ E Ewww 2 u E_FPDFQG FRWVTWVXVzY~XtCGt~\~F\E1҉V\VX EFPCuw 7jD_^UVWu} 6E$:E1E(EE E G}t.uww C Eujw 7jD}  EVxuuR ~X~)F`G FaWVdWVhE T  T$@uV YVxuRu V Y`UuRu{ 3V? Y:VV0Y0V) YVV0YEtE馪UuRu! L1}u@F>PVV,YYPVV,YYEE3~4VV4YuuR _uRuw B|s:uYE,|s$u$YEE G̩uw 7jDm _^UVWu} EuWt-E$GuG F?EF@@F@uw 7jD _^U VWuU zpF@HF@~@[F?VL YVV0YVVpYh4FxP 跨ǜEd3E}~MEEGV YU E jr 0jDd _^UVWuU z RUt~HtFC9uV Y1҉VLVHUt~XtFR9u VV0Y1҉V\VX~dtFa9uFdE jW0jD _^UVuVVYVV(Y~dtVYY>uV4YV9VL|(~H~"FC^BNAvLPSQx 1҉VLVH^UPVWuuF~H"V9VUUFC U}~H~V M u3NHGU9u&UVDj@Ru FD@FL@FL}F9Vu VN EtNV~tFHhU9v)U)щMUVDQRu UVDUVL~Hu"FC^BNAvLPSQ.1҉VLVH_^UVWuEEU9UU  E Vx€tV~ tO~=t F=@9uF=j^VYYjVYYn9u VwYWu@ uVx7Vxt  uVx t V~9u"VqYV~WVYY9u=VDYuV~WVYYV~j VYY9u0 u9uVxtP9uF>?~>t09t VxtF>9 V~@tH9t 9u2E9uEuV:YYWVYY~ uV~V~u=}u1~&~jVYYEV~ t WVVYYǺ!FFf9Vu VF tF~ uVYE&E_^UVWu} V~u# uV~uj VV,YY~ u1FV VU~}~,f9uǤMjVYYV~t F"V~u~FVxu F>u jVIYYVVlY_^U$UUUUUUEPu ȚYYEtuhhYYUVu~?tF?u PYYV~€u1҉VV VVVV0YF>^UVu1҉VV VVVVY^UVuVVFh4FxP ?PIVpVlV0V|s VY|s^UVd5|t+U9V ~ V dFV$|jY^UVW}|>t9>uW$6$} J+kÉ_ |>tO 9J }6$W$>d9W } W d_^UUVW}5u=3t /kE \E=3h3Ut}G|}S 1ۅÉߋUtU t 1ǃ=3t'=3u =3tt 1t=3tU r_^UE=3 }K\#\#=\#3u \#l33ihǀ4dUVWih4E=3`#`#ǁ=`#3u `#l3 3WYuWYƁwUjEPuH 뉁r9 w1EE[Њd#MjEPu HuhJRY#(uhBRYRuY_^U VW=3tA=3t8}St}Ru,p#=p#ujMYjjhYYs#U1ǃeu YE3U3(W}t333 33 W}6u333 33W}t333 339=3}h3ֹ3 =39=3}h3ֹ3 e=3T9=3}h3ֹ3 8=3'3tEE<_^U=t85hj`ZYYSh43j`:YY3UVNtjdYEttj`Y^UVNtj`ͼY=u^UUBJWh0Jj1YYjtYU塘\hPu趽 1UVU€t1kE \ցrvP1a/UNtGjh4YY7jh4YY'j h4YY1u?Y鸖^UVj`ƻYEja軻Yƺ RjaɻYYVja迻YYE^U VWujj!裻YY'{uhD Y=uuGhYgbEjd[YR9}ttWY:E־u h 行Y=vmjkYjj!YYjhߺYYuj5P uj 5P迻 h Yt#jhrP蚻 h Y_^UPVWuVtUVXU~> }@vE@FR VTUUuRu# }UVTUV\VX+UVX= rUB)U 39Jsz PrGPuYY0GU J ][ @QMA @Yf ZE@MuVXUt ~>&uY~Xu!FR^QNPv\PSQF\_^UVWu~tu W YYWY_^UVuF)Ju VTYYGVY 6NyNx V3VVzYJzuF3J9Vu jVYYFV>YFV+YVV93s$+3V3J9Vu jVYYFVYVYF)o39Vr)3J9Vu jVSYYFFVY~ PuVYU  N F F V@f BF TE b^UVWuVLY3+3׃} =3tV 3WRQ, M=3u23V39Vw3VWvR VV3V#VV#Uw=3t3VWRv諸 P=3u53V9Vs'V+3U3WRvs UVV+3#VVUV$x#53uj 955u vj YYVY_^UVWuU~ ~)v vF@P虷 F UNJ8UB<~yF39VvV~yF39VrJVV3V~9~t955u WjeYY~_^UVuF*V@V,F,V,V09V,w*M N*F)E PVYYyF)pE E =0|&E =9V@9V,sDV,k ] 0É1} ;uV@9V,s#F,E PVYYF)i^UVWuVY~*u3!~u jV YYNV[YOE =Mt?~*[5V0U}uENjV)VVY}uE~VY}uE~VY}uENjV)VVYV0JVV4JVVYV+V+3ډUVU>V+VUVU-3UVUEVU EV$x#uujٴ 3+VUVUAVUV+VU03UV+VUEVU E锍V$x#uujf }3+V9s 3+V׋V3VU3UU3+V)3URuuQ V$x#3Rujڳ }3+V9s 3+V׋V3VU3UU3+V)3URuuų V$x#3MMRQjJ ~}3+V9s 3+V׋VUU3+V)URuuP V$x#Wuj }3+V9s 3+V׋VUU3+V)URuu V$x#UUWRjv V0UU9V,V@9U~(/p#V #N  Ѻ#V ʉV V$V F(N =3u f f N F('u%1u(=3|?%:##N щN ##N$ щN$U(|P/K(# #N щN (# #N$ щN$E8~(t%p#V #N  Ѻ#V ʉV EjE ,F)_^Uܯu53.YYU  3APQYYUBR53YYU 3APQYY薯U$=3xhjCŮYYj3jB躮YYjjB诮YYHja聮Y Pja蓮YY<3EEEE\EPjۅYYUja(Y%Pja:YY3ٮUVW}-4E9|#i]ށ3>wtWYG(PG,QGl3aUjRhJخ UjRhc迮 UjRh覮 UjRh荮 U3U3U3=t UB3=3uE ܫ@E ܫ=t ܫ1=3uhh̪ ܫܫ333ܫ153|#=~ |#=|#~ 3ܫ15|#EEFEFVVVV$V x#53vj蔭 j8YWY_^U}t} uj Yuh3YY h3YU]1=33tPh)}YYU%3jY4 4UVWE|#9UdiEƁ3V9VvAܫ+3׋V+V9sV+V׋V)53RvҬ V)VVYE5hY_^UVux<95|#~45hi35pj cYY5rjQYY^U=3u #=u7h#*Yh h u^ h# Y۪1UVWuFPP YYBFPRYYO_^UVu#3f#3f3f33f^UV#=|tPj fYY}tPPj!JYYjj!?YYjj!4YYjj!)YY=|tPhYY}tppPhYYjhڨYYjh̨YYjh辨YYj h@j Ω 1}pbF^U1UVux| Vh̭YYU 9pt: uF>uu?>,t >:T?,t?:uEG9uF= }؉E (EEE T ~uEPVx E9ut*uU9UL9E9E|]E1uYPuh| u hjըYX_^Uuu uh thj誨YYUuuuu uh thj{YYU0VWuEPhzjzYYUЉUU܉U}p}fuPh, Xt 뻍EPVVYYPEPVVYYBEPVV YY4EPVYY$EPV-YY E|VEDUU؉}܍EPuyYY7UV55%-؉=s5^UVWu ~y vvv Eu cUvRYu K~u EVUVUUjEPvuv RDžu V+U_^UVWu ~>y VUZ@v@URv65 Eu6hH `YY?Euuu E?UvRYu2UWuvvv RE>xuuu轡 E_^U JhU"1U \ BzU1UU h#EPzEPYU$ERhUUUU UEPjewYYU(VW} d@tdt UwRYƅu jww 譿 Eu |UUd@u3juu} EPVyEPFPy2NU؉M܋VN UMUEPRYjuu( 1_^UlVWUu RYDžjw wu hw7u Ehw wu EEEPju uuINE pKEP YE <E EE JUUU€U t ExUu RYDžE}UM΋V VU9VvUUU9UvUU9VsVU9VvVUhvEPt PWxU+VhREPt PGPw}u;~uUU jRub ~t~uUU vRu E_^UlVWE EE J׋U€UEEPuu uEP}YE1M΀~t~u VU~vUuRYEuUUVhREPs Puvhv EPs UPRvEEtGNUU_^URhUU UUEUu RYtUjEPuj uR}tEPh #mYY1AUut1j@¾RuLs UVWuU09vI~tV9Vv6~t0VEPuFPVzuEPFPhuO_^UVABsFdFhhzj$YYjgYhT$Y^UVu5B!B=Br1kBhABBBJ}VBJ$B BBZhSEPGq BP Rct|p|Bp(щ BB^U0Bv$t$UBhvhsYYUVW}BUUUBr rMpYYEԋU |Et E}1}U9Us UrEU9Ur1U9UsU+U֋Bhur2tPZop0o Et ;B€d} t  s B|j PR^ =Bu ։W}~BыE1UBBMZYYBыE115BUBUUU9UsEEE}E15BU؋EUЋURUt }t;UعщM؋MЉLmEEB9Ut 9uuE떃=BtVB9BtDEBJMEjEP{YYBBPhіYYBBEUz u} sB 19uUz u}ut}E}u3U B9J rB UR TUE8u E@ ̓}u%} uE|h5R6 }uu Yu YE}u%} uE|hR5 }t*}~ E}u X}uUB1 u9wv7W)Wb+W֋WGu1 M1_^Ujj FYYjj ;YY}uJFPj YY5jYYRjYYRhYYhjٔYYjjΔYYjj ÔYYU,V B։#BU BB BRhyYYBB}u$Bh|BP;YYEPjkYY^UB9Bt%B RhYYBBUBU0V5B~ut V9u1EV BUҋVUjEP-YYt t mjMYNEuB u B9Vt4B€th|jYYEPjjYYVF 1^UVW5B~u  BBu B€tVEMV BU BM BM BM BMjEPYY}I}uEV BUVUVUV UEBUBJMEj EPYYt t EtBtPh EcYYBt zB B taB€t1RB+VBB+VBBJ+V ׃t BJV 1_^UVW1EP9YhސY!ǁu(}Hh运YBShBVZYZu jwY1(EPY=rBjPY_^UBjY1Uh}jxIYYB} ~EESYM =Bt1U=BuMEP;YhY%=tEP2Y=rBuhɏYYU V5BEBUjEP3YYt etUjVYWEF }uB u =BtBF1^U(VBjjYY觏BBjhYYj hَYY肏EPj3fYY=Bt1}jYF1} khƀAFB^U$EPjeYYU$Bh}jx>YYEPjeYY=Bt=BuB1U=BuBj蠓YU VW5B~u BBu EJV BUjEP5YYtT!tDdDžt5Bt%B B t BV 1_^UVWU rYu |#Bփp|1t5Jփ| BJ5BAY1B€t Bzdt8 BBt1BBP~Yu1nH$T$sR֋BJt1VCYuBJW!ыBJ1=Bt릋BBd_^UBMJUBBURFYBJ MUEjEPuj j'}tj5BhT$ 1UBMZYUBU BJURhH hx$YU(VWUUjuhu- U܉U~E1B9}euAFEUjRP֋ UMjuQ軋 U܉V UމVUVUV(ʠV$F,}pFGƄT_^UVU rYu 5H>u7t.Ph [YYt J~0uBt U Rt+ EtkHjPhx$ F01^UVu}9HiHBHT4HL@s=HiHBHÄډH1H^UHVW5HV$UEEPY(h5v׈ 1(}1D 6D=G YJ ˉ^ YJ ˉ^ Y J ˉ^ VVV UBctG}v>N$@ YyJx ˋJz ًZ{ ˉ]~ VV VVV V~ kFFV V EEPYuBh5v蝇 1(}1D 6D=GE0~ u V VVVVV VVV UhuEPT^ PFu9vvHV5r| U)Uȉ)븃}~vu9vU9rsrEU HVRq{ uU)Uԉ)׋E0EUR)MQUzuEMExvHV5rG{ )Ƀ}cE}VH H1_^U(VW} 5HVv$RzYYjhYYu>Ph *LYYhchnYYvVjRdzYYVjRRzYYVjR@zYYNPQ*zYYNPQzYYHNRQyYYjhYYuh cKY# HUj Rvz 1_^UVWHUUJQayYEUJQLyYƋUJQ8yY ƋUJQ!yYEHtT#H#M щM!1*#  EsS H_^Uh$YUVu}9|Ni|NdHxNTNI@s:|Ni|NdHxNdډN1$9|N}N1^U0|N$$U@VW}xNUUUNr rNYYE܋UMRQU؋U UEt jE}W1}U9Us'UJv u UrEt U9Ur1U9UsU+U֋Nhur2EPMp0N E}~} NE}9us?WUU9v+UUUEMuRQw UUE뼋Uz} uCB|NȫN1f̫N%fNN fN1fNfNUNNE1u؉EȋUJE1UċE1u؋MI1E} u 1ffUȈū#U UĈīUɫ|Nȫh ZwYtE};} NE}9us?WUU9v+UUEU MuRQu UUEu9wv7W)W+W֋WGu1 M1_^U=$u$U r;Yu6xNR ыxNK uk|NjPh$ 1UU rYuxNR  xNQ 1UVW19=$ kPY5xNȫh uYu ȫ$=~ $9=$ɫBVī?Vī ū ANNMAfUȫ=t h uYUīHȫN1f̫N%ffNh otYu FNU=NtE~tuPh@8C vv6Ph ChuEPH PFPKG_^UxNMQxNMRQxNMRQURh`Qh$YUVu }9QiQTôN\QTQI s:QiQTôN\QTډQ1dQ9Q}Q1^U0Q$$U=$u$U rYu4\Qы\Q ukQjPh$ 1UU rYu\Q \Q1UVWj5hup  dQ~ dQh1jYYj!pY195dQkPnFú RY1_^U8VW}UUQr rLDYYE؋U UEt vE}c1}U9UsUrt @EڋU9Ur1+U9UsU+U֋Qhur2EPMCp0C E܃}~UUE}9usUE9uURUE9usuh'lY Ph6lYYVuuu }EhkY%?PhlYY}tE}<u9wv7W)W+W֋WGu1 M1_^U VWQփ}uFF hQU lQ#U pQU tQ RY1}94hQh5@kYYkkh5jYEtkGkjY 9Qt RTYjY@uuu jkY RY#Q~1_^UVukh5RjYEPtkVh5XjYYk1^U$}tPh5)jYYEPjAYYjh5jYY}tQRjiYYUh5iYQ5`QqoYUajQRjiYY QRjiYYu jiYYU Rj}iYYU RjmiYY@QRjXiYYUJRjJiYYUJRj9iYYpQRj$iYY}uDLPjiYYQRjhYYiU\Qhrr ? 1UBUB@UB URht^ hd%kYU VW1kkPfY^UIljujjEPjh%WqUM EjjEPjh%WJEUBF_^UVu(}@^i`Q^PYщ ^sC^i`Q^`PYʉ^K@s=@t^i`ìQ^,^1^^U塈^ %^-Q`0%%UV=^uu U rYu 5^EtFyU Rjt~ d-Q`kjPhd%= @~ t9U BF^1ɃuAFF@F 1^UVW5^Džt#FtPhH7YYFFu-Džt^FFu jjXYYjjMYYE^F\\U^hEYjjYYt.Ph6YYPhz6YYUJ UZ SX?}=Ph56YY<E ?FuMt ^h^ ~^$P;Ph5FuI9<t>9t.)Ph5YYF\~>1_^UUjjYYE=\uB=\t2}tUJu^B%^B1U VWj8j5t; j8j.YYtO^=E8}~ MGF=^uhh^;YY^t1_^UVW5^EU=^t R~uF FXhjrYYt F%FUBt^F~uF F\\%j5YYu9uYEURYWuPhH~3Ph0i3YYvWPh N3 L~WuEP8 PFP<vЉF^F1_^U VW5^==^t=^t hjj YYt OGPYEGPYEPuPh}2Ft~t VUUfFfFF F$FU9UuFUVUV(F%FFF(}uEFhj@YYt F%FGt^FW|HGPYPGPPh|1G PYP~tthPo1YYF F1_^U@VW}5^UU^r r6YYE̋U UȋU \\}Fuqt qE}U9UURUEU9Ur1=UU9Us U+UU^ur2EP5H\ \NE1uv5\5\5 ruWuu uNE1t F=u } u%~t1wmF8\l^\}U9UEUURU}UUU܋UU\9Us U+\UU\9Vs V+\U=\t$U9UuUUԋl^uԃRYYYp^9l^;=\tU3U#l^u܃RYYUUR5l^zYYl^UUU؋U\UU+UUU9\\9VEv5\5\3 E= sE \} u \uh\YYN\1\K \} u*(\uh\YYN\1Ph\_YYjj YYE}t} u\J\!}u7\\RYPPhd\- E \} u \N \N\1Ph\YYjj YYEu@_VV+\ډ\} uUufF4FfFU€t"N\1؉F$~uF$F U t%~u \+V\fF}u3} u<4PPhD', EfFF=ufF~uF$N\1F$1} u@FF4\U\9WvW+\W\+W\WG=\u1 M1_^U,VWu^U^r r0YYEU U܃} t u\E}XVUU9Ur1EUU9Us U+UU^ur2EP/H\ \Ur5\5\'0 E9Es[\\(uh\2YYjh\YYUr5HYYEt#}u\J\sUUUr5\5\/ EUR+U9}s}U MWRQ[Y }>V)V~M1_^UVU rYu 5^V V ~t1F~t?F=t4jjYYtPh.)YYfFF$F =^u7jjUYYt`Ph(YYfFF$F 1^UVW} w3Yu 5^Sd u0~ v jjYYt 1WuYYFM1M@:UjEP5t^ww vtLU~t3F=t(jj?YYt +F$F FFE0jjYYt F%FvjjYYcjjYYt jjYYt jjYYtpE(0fFF$F GF=u 4\\UUE=u]E=u UJUuh\O YYE=t E=u1\jj|YYEt U@t6E=t E=ufFF$F dU€VfFFE=uF$F 1F$V V E=t E=uUV$ F$UV E=uEZ\\jh\, YY\jjvYYt F fFF=u }y s}u1f\\uh\ YYjjYYt +fFF$UV F F=u l\\hh\; YY\jjYYEF$F }t}t V +VV }tfFjj~YYt jfFF$F E= u}uFFhj-YYt UJ} UUBUBE= u UMJUBE= uUu R YYj jYYt E= u FUVF%FldZEH,Mu:Vu fFFjww FP5t^zqt 1_^UVWu 1d\U\3\4\*&Vh\YY\ EU+W5NYY_^U\\f\U\ \\f\U,VW^U^%Z È\=\j=\ u\ ˆ\\El^-\E =|^0u#\h\zYEh\lYE u h\YYuh\YY^x^BjROYY=^uEPj&YY^=\g=\ulhP\P.Ph Uzu UfB\\jjR' -=\\ց\V}1҈V V =\u~puV) "=\ujjV& !Ѻtd\PSPhH =\t\Ph0YY*!F PF P4$%FPhUzu%UfBUfBFPYUBt1_^UV19u~,5x^MYuE E x^BSRMYYF19u~?5x^`MYux^RJMYtڋx^BR8MYUEF뼺x^RMYtj 5x^)MYY=^t 5^MY^U4VWE0hjEPjh%h%=u1Ux^EjjEPjh%h%ܧUUEj@jEPjh%h%賧UUEhjEPjh%h%臧UUh5x^E(EPjEPj}t E)EM׈MjjEPj=|^0u=|^Dhh8KYYjh*KYYhhKYYjhKYYhhJYYjhJYYtj j JYYjj JYY\h$EY1E_%C< 5 . ' hY1DE%hV¡YY5^VKY\jh\eYY\\\h\@s@kZУp^^\Ph^YY^EE^PEPYYjjEPjEUUjjEPjEUUjjEPjE UUjjEPjEEEEEjjEPjb_^Ux^RHYt1 j 5x^HYY5t^NYUU MUM JUU MU MQUM JUVWu} VVV_^UU Z ˁUU Z ˋUJ ىUVuN V N щ^UVW^JRMUh@uu y @ ?huu ։1UBUzUr_^URh%h%\YU0H%%UU rYu fL:u 5LYLzt<LHыLHukHjPh% 1UU r+YuLH LH1U} }>EHiH^LELP1Lzt1PUXVWUUU}WEUUU9UsURUEPr rYYEԋUU9Uw1 UU9Us U+UUPr2YYELM9Jw UU L9Qs 19}eu5L YYEuE U9Uu?L L<E<1Y)щM9MsU)U؋UU}EUUtU9zw+JσEE}wU ULR UUUUUUUċUULEPrYYEthh55% Uzu1EỦ}ЋU ULR UUUUUỦUELEPrYYEthhF5%耠 }t!uU֋)}1_^UL L<B1UBUB@L< MQUdVWuFEPF PFP5H ]V[YtPh|YY;hjV E }Uu UtpPh`fYYG PG PYYEtGP:Ph@0 dž4 GPGPYYEu)dž4 G'PG&PG%PG$PEUUUGPGPGYYEFGPGP/YYEDWUVVG/PG.PG-PG,PEW UGPGPYYEuG#PG"PG!PG PEu}uEX1F UU<VDV4 u~ v dž4+V<1E9F vF 4 EUUȋUUU:\t:/uEUUU:t:\t:/u EEEލEPuuVE̅4EPEPYYEEPEPEPEPEȋU:t%ERuPh  nEtuPh MEPEPEPEP?F<(i(9Fv(≖(EMк9(vEMк9(t(5Ph+ UЉ8(,EEU9VvM,uUЉAMЍN$]ȉ}uPhYYSuVYYEȋ<Udž0V$@FvEPYYPTPZ_^U$VEUR U%UEUEPr(YYƅthh5% utVPh 1^Ut+>.t&}aw  T=L=GFЀ>.uFjj EPe 1>t&}aw  T=L=GFՃ}EUM9DwJhQu ƅu n1}UM9DvUjEPuA u2UjEPR( uj Rur 1E  EEuuYYEUUhRu ƅu 1WUjEPu u2UjEPR~ uj Ru 1^E  띁EUM9<[uu5YYEE}:u Ph _^UVWkE UBjPu ƅu1FPP8YYNjU u U MQjRu ƅu1{FPPYYVUM JjQuU ƅu1@FPFPFPPU43U9z v1_^UUM <JU VWu,ҋ} !׋,#0U9}u U 90v"8U0UN$@0<9U rC<0@V_YY@@uhTh5%- 묋U +09<wh$h5% @VYYE +0_^U VWEP3YDžu uPh Zj:VuYY1ۅÉ]\E}y$ UPWvYYtE:F}uWBPh8 }tOjEPVd E=rWPh 9utU::tEuF}uWPh eVY=vWPh #Ufh 1YUVW&T&sU9uFA_& E10OE1EuWhZ&YYT&_^Ur rYYJ1UBUB@R MQU0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+&"}t}y UU_^cD$T$T$T$ P1Q+Q QQQ +QQQÉqAAD$|$tD$T$@1ҋD$t$ D$t$ YL$D$d$ QUSE] ![]USE] ![]USE] ![]UVWu} Mr6 u.uAfA(_^]UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]ZUVWuE_^]zL$ U} v&M E 1U} v&M ҋE!1UE1UE1U} v&M Et1UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P$1ۇ'tPXPoRmcaatbusprocessorvgaegavideo %d Kernel panic: %sstack overrun by taskexception in system codeprocess number %d, pc = 0x%04x:0x%08x %s Intel-reserved exception %d got spurious NMI Coprocessor errorPage faultGeneral protectionStack exceptionSegment not presentInvalid TSSCopressor segment overrunDouble faultCoprocessor not availableInvalid opcodeBounds checkOverflowBreakpointNonmaskable interruptDebug exceptionDivide errorsystem.c&8nJ\isemptyp(rpc)isuserp(rpp)src_phys != 0dst_phys != 0isokprocn(k)isuserp(rp)isuserp(rc)isuserp(rp)isuserp(rp)src_phys != 0len <= mon_parmsizesrc_phys != 0isuserp(rp)isuserp(rp)isuserp(proc_addr(m_ptr->PR))isuserp(rp)overflow in count in do_copy,' !%,'@%%%%:&~&&,''(Sx'S@'can't inform MM,,,,,,,clock task got bad message5m5m@4m@5Not enough memory for RAM disk7r7777.7?7P7a7Executing in 32-bit protected mode 0.32Minix %s.%s Copyright 2001 Prentice-Hall, Inc. 9T9T$9 T 9T@9 T@9T@9T@9T@9T@9T@9 T$@9 T$@9 T$@9kF9::::d;$;$;>;Q;;T;T$#: T @:T@; T@};T@ ;T@:T@;T@;T@; T$@: T$@@: T$@@:kF; C B B BEETEEaEEEZEtty_reply failed, status M LMLMkLLLyM ONNNNNNdelay;bootRebooting Hit ESC to reboot, F-keys for debug dumps System Halted S zS3RDR R fR {R {R RRUMU[UGVUUWRWkW|WXWWWZ|ZZZZZZZZ[ @VYAVBVCVDWH8WJWKXL:XMXPYm*ZHardSoft%sware scrolling enabled. attempt to register second irq handler for irqinvalid call to put_irq_handler--more-- %s S:%-5.5s%-7.7s %5lx %6lx %2x %7lu %7lu %5uK %5uK %5uK %5d(%3d) --pid --pc- ---sp- flag -user --sys-- -text- -data- -size- -recv- command --more-- %3d %-6.6s %4x %4x %4x %4x %4x %4x %4x %4x %4x %5uK PROC NAME- -----TEXT----- -----DATA----- ----STACK----- -SIZE- ANYgc(gd gogxgBad environment setting: '%s = %s' onoffpanic at %s(%d): assertion "%s" failed panic at %s(%d): compare (%d) %s (%d) failed hhhhuhYhghhh%s: got message from %d bad I/O vector byjjjjllll%s: can't read partition table %s: diskette is write protected. %s: probe failed %ux%ux%u %.40s %s: %s: drive not ready %s: controller not ready ͊ o0o%s: timeout on command %02x %s: reset failed, drive busy before=%u, nbytes=%u, count=%u block=%lu, before=%u, nbytes=%u, nblocks=%u %s: timeout (BSY|DRQ -> DRQ) %s: drive not ready ) ))))))!%ACD: Phase Unknown ACD: Phase Data In %d ACD: Phase Data Out %d ACD: Phase Command Out ACD: Phase Command Aborted ACD: Phase Command Complete S=%02x E=%02x L=%04x I=%02x %s: %d cylinders, %d heads, %d sectors per track %s: %lu sectors %s: %lu sectors %s: unable to get dma channel %s: unable to get parameters COMMJUKEBOXOPTICALSCANNERCDROMWORMCPUPRINTERTAPEDISKSENSE RESERVEDMISCOMPAREVOLUME OVERFLOWEQUALABORTED COMMANDCOPY ABORTEDVENDOR UNIQUE ERRORBLANK CHECKDATA PROTECTUNIT ATTENTIONILLEGAL REQUESTHARDWARE ERRORMEDIUM ERRORNOT READYRECOVERED ERRORNO SENSE INFOdtt,,,,":]Υ]]]  %s: unsupported UNKNOWN%s: %-7s %.48s %s: hardware error %s: not ready %s: no media loaded %s: offline (unknown)%s: can't handle %lu byte blocks %s: unknown capacity %s: capacity %lu x %lu bytes variable %lu %s: density 0x%02x, nblocks %lu, block len %s: limits: min block len %u, max block len %lu ̬̬̬̬2i222writeread%s: soft %s error (recovered) %s: soft read error at block %lu (recovered) %s: failed to rewind %s: failed to add filemark KcKKK m; ^ss[D[[1[[[[[[[[[[5[[[[[[D'sense key 0x%02x (%s), additional 0x%02x%02x target status 0x%02x %s: error on command 0x%02x, (Selection timeout)%s: host adapter error 0x%02x%s ]E !@ٿ @}aha0: strange IRQ setting aha0: AHA154x: strange DMA channel aha0: AHA154x controller not responding, status = 0x%02x dp8390.cwdeth.cfatfile.cr == OKr == OK%s: cluster chain finishes early! %s: ff_map_step (= %ld) is not a power of 2 %s: '%s' is not a file %s: '%s' is not a directory %s: strange number of fats: %d %s: magic AA55 not found %s: init_hd failed %s: dev_open failed: %d r == OK%s: dev_read failed: %d r == OKoff+size <= SECTOR_SIZE%s: '%s' not found   Spos-ffp->ff_cache_pos < ffp->ff_cluster_sizeffp->ff_cache_cluster != 0%s: using %s %s: file name too long in '%s' %s: unable to parse '%s' %s: minor device number in '%s' is out of range %s: driver named in '%s' is not available %s: no environment variable '%s' %s: seek to %lu failed: %s (read-only)%s: using '%s', %lu bytes%s %s: can't determine size of '%s': %s %s: can't open '%s': %s %s: No DOS 3.0+ running %s: boot environent variable '%s' not set Access code invalidInvalid handleAccess deniedToo many open filesPath not foundFile not foundFunction number invalidNo error %X[cd'oRp[suixbjqx     PQ RPSTUVW@ppqrst0u`vw!<"@6TTYj(C1)j(C0)0SYN_ALG(IDLE@pFLOPPY2MEMORYl,CLOCKSYSHARDWARMMFSINITatbiosPesdiaha1540xdosfiledfatfilec0VV VVVp` D 8 $    j3j422j5  .s?1!2@3#4$5%6^7&8*9( 0)-_=+ qQwWeErRtTyYuUiI oOpP[{]} aAsSdDfFgGhHjJ kK lL ;:'"`~\|zZxXcCvVbBnNmM ,<.>/?**                789 -   4 5   6 +   123 0   . <>  l3l3HYABDCVUGST@4ȍmemoryx:x,jjjjjj ($-*P (* P$-* (# P$#PH2L22 aq}j?kpq|qfd0?kyjat-d0i?k`#jbios-d0֚>?kj6esdi-d0xh\H8( GسTjd:d,daha1540-d0AHA0x:d:d:xzK?kjafatfile-d0_?ktj_dosfile-d0tdP@0 Error 655350123456789ABCDEF0123456789abcdef ((((( AAAAAABBBBBB mm  p9vX1$T$Ltsu;SSSSu QRPM P3UVW;=@MNr E@M E}tu5PMYY"1XM }#<u*HPW3YYt Wh%YY<GlUhMhz3YYthh%YYMPM M@MhXM=PMy1PMilZУTMUViElƁXMU L<<tV!Y^UhVWhLM2YsPhLM2YYFhHM2YsPhHMc2YYFEPjK0YYUU+UUE}?iElǁXM<Wu0YYt< W W+WUEXPhxP1Yh|P1YDMEPj2YYthh$YYUȉUEPEPYYU 1Ph:+YYU 1Ph|+YYU 1Phh*YYU 1PhT*YYEPj%1YYthh8P#YYjh,0YYE=thXMhm@u0 u0Y_^U(VW=TM=DM u =DM|W:t W UW+W UU UuYEu qU U؋W Uuujhujh8-Eyuha"YYXMzs<tl-XMlEDMWV[+4PMV4<!< uUVUVW+W VVF$F%E=0u} BXMzs!9W(t9W,u El׋V(}uv(u5PM, v(u5PMj!Vu(-YYjuYY_^U5$M5TM YYUVWu-XMlNjTMR,9V(u TMB,1E싖<t jWYYjjWj!Wv4y-YYF@vDPF>PVu vv YYV V+V RvYYE F$i^4lXM]S0U#<U}tU9V(t9V,u1E}t}t VYdž<juYYXMzsA<t.9~4u)F4#lQUt<tVKYl뷃}tUjRYY_^UVW=@Mu$Mǃ=@Mu1(MEu TMR,ډEXMz<{PM9V4l~ 9~(_} 9V,uQE<tVYp<€t'~%t!F% TMPF%F(>l_}~(Ut1!TM<TMz0_^UVWuiF4lǁXMF$V% ‰UPv(v4YY<dž< DM_^UVW5TM0MU 9~ vdždA+V ׍EP5PMr)YYuWV# Eu0MdE_^U,VW}W UE~u1VU؋U U9Uw +UUԅ~EE]U U9Us URUUM 9JtJM}~+UԉV+UԉVUVM #<Uww w wwubEu"}t-XMlWPl(YY12Ut UMJUtUUVV+UԉV_^UUU9Us1UVW5TM(MU@v =$M~ =$M~ 0MUEЄ5$Mujjuj5PM|&Džt4MUEЄ uujjuj5PMB&Džt \1E܄pʉljj5PMj jluW Ey U UhPuEPEPEPEPEPEPu$E=0u*G$hEPh ufE܅K}y&u (Y}@v |rllrPAPVEuuuuuuDžtu'YlfRfV>lffV@lRVDV UV UU+UURh 9YYEԄ uuj5PMujj$Džt5PMhYY}tjuu' uj5PMujuj5PMuju&Y<@jtt%fxfV:F:^8PS5PMjdtt'zF=^=NPVu vvGYYV V+V Rv3YY}tuV'UVUVUUVF UVUVUVUV UVUV V5PM"!YY<UUU ׋V U܋U UU܉+UԉׅtTsEPujhhjjthhYYUU܉+U؉1_^UVWEuE=}(U@9v>t >} >E@E_^UVW}E Uu"YEWUr9U1UU}t$U9Uu1MUAM:uEE]]E UE @v1jU+UM]]RQS! UuR!YY}u URGPGP! uWYYUW_^U VW}EjWuu u1jju =t,hWu Exuj W ƅu1g9v N> t> t9t3F9v~ t ~ tNujVuu Eu1!EEuYE_^UVWiElk] XMÉ]uUM M ME ׅXvE}uuWu EuWu EU9Uu}׉+U_^UV0Pzs<< t)9ut$U N>9uF@]9u U9VDu l1^UV=(M u1=(M~ =(M~ ~TMk(M \ЉE=4Mt,j 54Mj5PMujjƅt4=0Mu1$j EPjj50Mj5PMƅt}uGTM5(MHRCYYTM5(MXR4YYTM5(MLRYYMTM5(MHRYY}uTM5(MLRYYTM5(MLRYYTMk(M ML\j EPYYTMk(M ML`TMk(M MLdTM 8M41^UTM TMRX\1UVTM TMRP\j h0M&YYVh0MYYtTMVPRYYFѾ&Vh0MYYtTMVPRYYF5TM}YAj h0MYYTM 0MJP5TMRY$M 1^UTM TMRPQTTM 0MJPTMj PR7YYTM<5TMYUTM 0MJPTMj PRYY5(M58M5PM\ E5TMYEU5(M5$M YYUVW=PMt $MUiElƁXM#<t V(U0MUTMXMTMN,J,aWEP+YYu.LE/E&<t/<UU 0Wu3YYu4YG떸_^U5$M5PMYYU$VW} tiElNƺ iElNƺ#EUUkE 5LVbY(tU9Ws}?EE0u8Y_^UVWu }95Lu LL5L_^UVWu>t>VV9WuWVWVYY>tVV9WuWVWVYY_^U0VWILs V  xLLLIE E EPjYYthhYYU؉U}܅t2WuhYYUEE 8U9LsULL1+LL_^UVu=t cjj5PMj juYYy xډ.U L 95Ls5LtV5LYY^U VW=u10Pzs<tVYl0Pzs<tMl݋=Lt#L9WrWuYY=L}?5Y1_^UVWu<u*L?t ?D7džD<_^UVWL7-XMlEV V+V U<u DuYEu D먋VUUVV+V VVVuYYU+L LUju5 U Rju5juuYY<DVY_^U VW5lzu0P< <@-XMlEV V+V UE=LtL9WrU9Ws}?WUUWW+UWu WuYYU+L LUju5 U Rju5jVUUVV+V VVVu YYuuYY<5951_^UVuu&YYyxډjjjjhuYYƋxUTMB:TMZ:PSjjy UډKu V YYyhh:YY}u#U JtV Y^UUuhLYY} tu h4YYh(Yjjjj$ j( YU$U UUUUUEPuj{ UVut =LPu0 uj YtLA LӈL^U=LtLLLL MLLMhLj YYLUV=(Mu#TM<@TMǂ`15$MYƅt<€|54MVeYYTMǂ`1=4Mx =4M~ =4M~<54MVYY<@<(M,-XMlh4M50MP5(Mb t xډTM 4M`1^UVQzs<t U9V(u l1^UVWuiF4lǁXM-XMljjPj uC<<t%<U Pv(v4YY E F%_^UVW5TM^F8F:PXF<F=PCiPMlMiF4lMPF8P$MZ9tV:t $MfF8$MfF:$MP$MP5PMj1F~,@M _^UV5TMV:mj=(Mrj(MBR|Pjj50Mj5PMtj|(M:tjnjgT$M j jYYjjjjjjjjjjjj$5(M|Pj5$M X^UVW$MU8MUUSTMJ:1uPu5PMTMJ:t mTMiB4lƁXMjj5PMj>~0<tItTM9z(tڋ TM9Q,u*džPTM TMr(q4>YY<XMzs%<tPM9V4uF4l1ҋ TMQ, TMQ(TMB41TMJ:t {hhPjjuj5PMtMlhpP= 0TMJ:t tE _^U*?&+++++k++.M ,M -M@-1 %B0X/c&0d/o/p/sT0u/x/M 0Pcore&&&&&0&&&0&&&&&&&)&&))&'&]&&&&&&&&&&&&&&&))&&&&&&&&&&& &&))&&&&&&@MH+<,0123456789ABCDEF0123456789abcdefSSSSfs  r` \1$T$LL` su;SSSSu QRP. PmUV|8C.4CP^u1>|=x =N|,ƃ=|uV58CYY=@z!pUV=.}.>s_~uuQ-.8CVdʉ Vdʉ @VhAVl@FtFu .WƀhhfYYh@hznYYthhdfYY@8C@^UU @h@u#nYYU,VW4C8C5>Y1.4Cj5>@YYƋ4CrVGY4Cr4CfB\4CfB^4CB`4CBa4Cf}4CBxG\EEEEm@E.EPjAmYY_^UV>>>^UPUUumYEUUE@EPjhS@j]iEPiYU(VWhY>hYEhYEjj5> thhcYY=>jju thhlcYYEAEUfB$u<YthhTncYYUMA RU9UsUUBi EUJIMUZ QZU9UvU@@@@m@U@h@jjYYu =@thh<bYYiE @h@jjYYthh bYYugKY=>UhcYf`UfU؉EU9UiEhPuhrju5>C hVW"j ƇjVGEYYjW=EYYiEPhcYYErhbYuGYuYjj5>\C ƉuUB UUMRq,aYY%UfBUur,aYYUBƆhVDYY_^UVWA4Cs fF$DAfUfV$V+:Y1ۅÉ]u/EjP<YY@u G=}E}thh`YY~WWBY~F(_^Uj5@5A_ t,#@RhArYYEUVW1@@t =Aj5@5Ap_ j5@5AV_ ƅt,W5@ YYƉ_^U VW}E! %fEEPh@EPjJEtk@rU 4C!Ӂf] jE Ph(- Ƌ,Uu E<}tE!1Eh( Yƅu ,4C @]UBUr Uz}fEPV PYYEN4=jVOYYE(Vu1YV;YjV6<YY Ut1EVfU!M ER58CP EUzWEPV EUtEUBuVYIYYEt)4C @]CUr UzND>UB}uV4UV8UUMJrg}t,4C @UBV8YE@_^UVWEPu(YYDžu1EPWs YYƅ=,G@] SP8YYƅuWj8Y1F@FUVjVe:YYjFBPEPW!Et@W'8YFHFFTV8YU,1(t E ,UW7YU,_^UVWu}U tPVGYYu"tU t<;jY+=0~"50jV 50jV FU1_^U#@fU=>uUt sj5@5AZ t,RU 4C!U ځfU5AEPh( EP6Y,UVWj5@5A.Z t ,?EPh(YYDžu ,W|WI6Y4C# @!ف@fMjEPh(: ƅt =,uV5YW5Y,fWBfUfVBfUfUfjEPh$V)EjEPh(VE}u&}u ^CF_CGGTjjEPWFHFFTWF5YV?5Y,_^UVW5@DYDžu ,Vw WJZtSU t }`u6VfU}`uV1YuuSEP>YEP8Y~Uu%tEj uV Ou)~Uu~D~uWV4WV8VR4Y @ҡ4C!P|4C @=(u1Y(UE}(s.U t9ru 4CIx9Ju f (EɋU9(};P1_^UVW5@ZCYDžu ,W zUu%1&w!W rd @a=A~A9}9=AyA9~5A9wtW BWw5@1_^UjYUPVWEE=8Cu0@t$@UЋ@Ũ%@8CUE=@y 55@'BYEu ,UP}uZuU u =@u1UzRU܋Ur VUE~Uu4CRpUE}uEfUUt Uu1EU u1EU`u1EȅtE8}tGVfUEu5@W5AuPuE؅E}E}u?}u9VPR +@9s Et}9}sjuVp ~Uu&EPW5@uuV E؅C}~E=@1U}t+M9MsE +UЉE$+U9@s@ +UЉEԃ}y +UUԃ}uU)U9}9UvUuu5Au5@uuWV$E؅uK=8xBUAA@+Uԉ@UU}ԃ} U+UԉU}u}u U@u69}s1~,~Uu&9~w!F1jV?YYEt@Uz}u3~Wu-1u}u U@u 5@=4FW=8t 8U؃=8uE}n}uFX FX}uFX FXFT}t(EEu4CMJpj Y14CBpEE_^UVW}1`u@EtE 1EWfUu WcYYEfW@fU}uG}uA}ujjj3 V@ Yu W4YYƅk,}uuu uW,E}u1E}u}uU 9WwEEuuPc3 ƃ}u$}t}uU 9Ww }uVY}u#Uuu u$u(RjjUE(UuRjju u$u(UEƆUUuEPVN4YYE_^U4VW}WPB EE 1E̋ME+E؉EWHUWLUU9U~(UO4u1MUU؉U+UU9U~UO4lUBOօu1U+UUԋMUG@juP1 EEԙ}EPu~YYjuW3YYEԙ}Uԅu1UMUG@juP1 EUԉURu+YYju3YYu1MUU؉_^UVWUP (Yǃ0uU MQPw,OYYU M4w,OYYƅt/W9w9ww"u Vh8aP hh$OYY_^U V5@@54VYYEt&h54uVEju2YY^U(VWu1`u@Et VfUfV@fUދU UEjuP20 EtE,E1UU+UUUUU1ǃ}t~u E@IV+U1E}u)VPZ ]MVHU9Uw 9VvGE@v@ s ~Wu 9}s}EUAMM؉ Ot8=>L}/EEjuP3/ Etju0YYEjuh P3Eju P. _^UjYU8VWuFT1VPB EE 1MEȋVHUVLU9E~EVM 1U+UUEE9U~UNUEUBNU؅u4F@vP0YYE؅u ,eUBN]؉EU+UỦЙ}EE̙}ŰU9U| #MUUЃ}t1^@PuS- ǃ}tWYuWFYYEE}^F@vP/YYEԃ}t UNuuW EtƇ}ujW.YY,ljW.YYMUUЃ}t1^@PuS, ǃ}tWCYỦUuuW ƇjWQ.YY1_^UVUP#Yƃ~0uuv,KYY%U MfQuv,KYYU M^UVWURPB EM׃}u E 1ljE U U1PE 1Z9cuuGYYEtOM-EUUU9Uw-UB@juP+ VYjV;-YYE_^U VWuu VYYE~uVPUJMVUF@uP-YYEu1uu Va Et^@uS>.YYU,1kU 9Vtju V VPB EMUUUE 1u1EEF@juP* WY_^UVuhjVQ Ɔ^UVW=4CEPEPjj}3EtCUO ]UBEPEPjjG3EtUO UBEUO ]UBh5>#$YYƅu8UO UBUO UB,V:YthhpGYYFUffUr UBV5)YUr UBjV+%YYU@U@FX1_^UVWu}E} uS9~DjV2YYt4Et Ej/Y=0~50jV EjV\2YYu&4C-.j PKYYUEt}} Et>}~5)E~50jV j`}~()E~50jV /j,Y1#u50jV E_^UVutu04CBt@  4CQdډ4CBvu 4C AJh4C @Jl4C AJh4C @Jl|^UVW}.>Q~tuC~uu=Vd9M u2N 9z u$-.jPYY 0Mtƀ_^UVW}x} |uhDYYUցƸ.~tW~uMFv؉ǃtu Fu./FtuVdRuYYU Vlu uYY_^UsFb] 9uMƀE uuPuSǃu4CfM fJb1_^U4CJbu1UV=8Ct@ցƸ.FwfFb^U VW5@',YDžu ,Yw  t`t-VfUEw5Aj5 A58CPj_^U,VWu V UVuJHYY=SEPuHYYDžu?~u U9U}Ctuuuh@,Auu YY땅thh ?YYU9Vt9~Ctvv6h@v vYYVuGYY_^UV4CJbu U B 94CBbk Ɓd4CBbU ȉJu vVYY^UU,VWE k ǁdE ЉUUU؋UU܋UUUUEPwWYY}}U9UzE % EfE h-5>YYƅuE juPj\,AE F4C @r Y4C @r EE_^UVWEPu1YYƅu1!}uEPVuYYVY_^UVWU:/u 4CB 4CBƀ~tU:u,1VSYu usYYEuV+Y1XU:u*@u;VY,1&u VYYVYu1 UU_^UVW} uE=/uFU9v%}/t}tU 9vUGFE΃}/uU9v FEU 9vU9w,1_^UVWU :uUMA@ZBSPYYq}u1djEPu uWEt ,1=4CM9Ju8hxu DYYu%} (tUMA@ZBSPYYUB@]SPYYDžu1WBUJBuU z.hXA4CWF$_@9uFWYVfR@fUVJBMEQPrYYEu uYYuYD띅u1u j5@5A6 t ,mh(YfEu ,MEEEA}4Cs-UB$]9uEUJ$uUUEDʃ}t }u =At]P58CSl t UfMfJ$uYEt]SYE}j5@5A5 tUfB$EP[Y,Eh(YDžuUfB$EP,Y,ED~EfUU`t U uE1}uEjPYYƅu ,UtuE}uA1@u@E1ہ@uC]}u }tE}t.WYVYl/EPYEP/YEGVUzUrU AJ(1_^UVW=>u j5@5A3 t ,h(YfEu ,Es~D~F@]9uVDU\ۃ}~ z1EA}4CsUB$]9u}ED^.EPYu3EPYWBVwyYwpYGfG$1_^UVuwYƅu18`t,V!Y1VfUVYE^U VWj5@5A2 t ,Eh(Yƅu ,*1V|u@u=>utVYj5@5A 2 tVZY,EPh(YYEu=,u2EPuYYEu=,u1uYuF@UZ@9tujFBPEPuBDžuF@F^XFXFTV Yu Y_^UVWj5@5A1 t ,EPh(YYEu ,1EPu YYƅu=,tu YVBuu YV Yr= uE@u=>uVBuu&EPVu  EPVu< V Yu Y_^ULVW1j5@5A0 t ,EPh(YYEu ,sEPuYYEu5,j5@5A/ t5,EPh(RYYDžu5,EPWYYE}tU 1ہ@uC]19}u@E؃}^}T}WYU9Uu2h(u,YYEuL YU9UtUUuľu, YhEP7YYts9~t9~uBƀuWu2 Et"h$jW h(jW 1_^UVWu uGjEPuu,uUZ@EPSYYƃ=,uu,FV; YjjuuDžuFHF^XFXFTVY_^U4VWu~(thh *YY} uEBUFE FEVJ+VډU^]U9UrE E1EE1UUUUUF$jRP\ EE؋UM9}Pv,)YY%fEEMкMօtE+UЙi] ]Љ]9]vTMкM сfMEPv,&)YY%fUƂju YYE89ju YYEU9UrEEM1_^UVW}(thhN(YY} u E GE E1EE1UE1UMfUUUG$jRP ƋUQPw,(YY%fEUMuh} uP'YYUM!сfMEPw,'YY%UfQƆjV YY_^UVA4CsF$]9uDEPh,'YY1^UVW}WfUE9>u'A4CsF$]9uD1_^UVWufV$fUF$jjPv jDWV. hW YYfF$FE=thj&YY9EuE1}u@E>}h$thh$j&YY9EuE1}h$u@E 4PuM&YY%fFPu6&YY%fF^Su&YYfF^Su&YYfFFPu%YY%fF^ Su%YYfF v u%YYF vu%YYF}uVVF F4F8F F4F8F<F@UV0UV,F~ F~~~r F =v fUfV$1_^UVW1s)~D~F@]9uVB9U u FDL\υu,13fUfW@#U fWBGDUt jW(YYGX_^UVuONDuJ~u#V+YfFTF@^BSP_YY ~UuVYFU~Tu jVYY^UVWEPYƃ~(t,1vu`\Phh$1qUVtJU 9 u7]9u(uVwY@#벋5>ujPhYYV8Y# U<>9u >'t9utuP`YVYfUfU @# U>U4>Ut0uVYYu!}u fdž}u jVYY_^UVuH >U €t;dž>=>u5 >5>9dž=u5> 5U @tut jVYY^UVWEPdYV9U uV@U VJ+U ډUujVW DžuR,F$ЉUF$ЉU^$Qu9>uPh{1V9U u~@VJ_^UVWEPYV9U r(U 9Vv VJ+U ډWjVh 9~@v~@_^UVWufUi E} uE]jhuVjSuǁtIxt&E] QPhwfdž} u=8Ɔ_^UVUt=>t5_^U}vE.UVW}=u .=.t} t#  u1v5.u5.NUE 9uUZ9t 95.u10ijhPWjhj=u1_^UVW=..щ .U9 .u .U<iEjhPujhjC=ZWt#  IfUffWU   Af_^UVW19=.vBUB]9u)UfBE#  IfG_^UVWE}}4C <uE8GE8y;<<s)~ufU fFFE01 ϸ_^U,}x}|14C MUVW}<<s~t9~ uU t1_^UV=8C@ցƸ.4CrYV 4CQRY4CrYV 4CQRYV^ 4CfQ^ 4CfQ\Va 4CQa 4CQ`4Cff 1!4C5@5ARB E^UV=>u"4C5@5AR Ɖ^UVWjuu u t ,]h(YDžu,E@t jWDYYƅt WyYE0jYE81_^UVWj5@5A t,4h(XYƅu,5AjVD VY_^UV5@Yƅu,5AVv  ^U,Vu~XtVYfUUށ t Uށ`u1EfV@fUfVBfUffUVfUfVfUVfU}tF1fEVU~Uu.UfU} tU  t M+JMV UVUVUj uj58CEPjj^UVWj5@5A_ t ,h(Yƅu ,F4CZ^9t=>u VkYDžtVYYh # @ сf=>u$F4CZa9tfFX FXFTVY1_^UVWj5@5Ar t ,h(Yƅu ,VYDžuV=>t@fF?F4CZ^9tF9@t4CBa9Atu0AFfFX FXFTVY_^U4C сfM#@ҁ 4CfEUVW@t=@tXj5@5A1 t,7h(YDžu,#@RWYYWJY_^UVWuu~Vu)XA4Cs9wuG$jPYYDffU=!u 4CB\ 4CB^E=!u4CZ` 4CBaE}u+U@t UItfEIfEAF9Eu EF9Eu EEMUfUEU M M9tE}uU t VYE9utVYE_^UVUrP~(t1^UVW@Uu @Uju5 AU t ,h(Yƅu ,1F4CZ^9t=>u=@ut jV YYVHYtu0=@u F FAV AVFXFTVY_^U^ @1UV=>u9.A .h .jYYƅt Vh, YY1^UEP58CYYU@U@U@U@U@1U@VWEEAUjEPjjuj58CEt {EЉEUffU}t}t}t N} u}u 8UR  t } t}uUu } t:}u4Uu+1+Uz#UR zEһ<n}~U9s }yU9v x}ԋUU}uE9}s NE(tu}[uSUR 9VDU9V 89~/}u=}t4CRx9VE} }t}u} u jY1E9~ rU9Vwf (9~ rUV U9Vw JV{=(u 2E}}kEtEkEEffUċNJUċNJUMĉQ UċNJJV(}t} X}t'ffUfEV UԋV+V U؋VUfEjuj58CEPjj EU}u1H}u;UMf 4CMRxQUMR QUz UMJ(1_^UV80>s6Fv؉E~tu}u-.jPYYƀ^UVW@!WYƅu ,y9=@uEPh@jj"Et;S=@x =@|:9=@u@+@@rF4C @4@_^UVW5@)Yƅ ,=Ax =A| EPEPj5AfEtF4C M4E4C @R|t 1 @UAtE1E4CM#J| MJ|1TV !׉F #V# A щN1)5@VYYET@_^UVWsD~Tu jWAYY\ݾY4Cr/Y4CB4CB4Czwu14CBw4CJbu14CfRbfU澸/>zFb]9ufFb1RV UtB t;R U u$B]9uEPYUfG륁ƀz4CBx1_^UV=8CtS@ցƸ.=u@fF\AfF^=.uAFa@F`1^U=8C|4Czxt5@5@.YY|1U VW4CJ^t jEPjj5 Aj58C<EtEЉ9= k Ɓd~zt)f&$h&(GE F'8CV4CBx1=@F@_^UV8.h4.jYYƅt VhYYH.^U VW} ,l} ~,O}u$} (AFGM uE"u h(jjuj58CEE_^UU=0.uI0.uh*YY} tu hYYhY'jYU}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVuu =.u =.Pu*j5.jhX.jhjg. uj Yt .щ .ӈX.^U0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+P"}t}y UU_^USE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]L$ U$UUEPjj UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWuU VVueYYDžt~~yVډPF_^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Po1ۇX tPXPfs receive errorget_work couldn't revive anyoneToo few bits in fp_cloexecV2 inode size != 64V1 inode size != 32NR_BUFS < 6OPEN_MAX > 127BLOCK_SIZE % V2_INODE_SIZE != 0SUPER_SIZE > BLOCK_SIZE RAM disk loaded. %5ldK Loading RAM disk.Loaded: 0K FS can't sync up with MMCan't set RAM disk sizeBad root file systemCannot open RAM image deviceCannot open root deviceramsizeramimagedevrootdevInvalid root file system  @ ` q P?CHcheck file systemIllegal zone number %ld in indirect block, index %d pipe device is read onlyrevive errF$$$$unpause err 2unpause err 1Suspend on open fromfs: strange device reply from %d, type = %d, proc = %d call_task: can't send/receivefs: strange device reply from %d, type = %d, proc = %d ..............can't allocate bit on read-only filesys.tried to free unused blocktried to free unused inodecan't free bit on read-only filesys.can't find superblock for device (in decimal)root Out of i-nodes on %sdevice %d/%d all buffers in useroot No space on %sdevice %d/%d Unrecoverable disk error on device %d/%d, block %ld fs: I/O error on device %d/%d, block %lu do_stime errorz]c]g]o]]baaaab-bJbJbJbfffffclock_time err %dFile system panic: %s 9l %vkXjcZkdjojpjsku kxk....gcbg416gS[o VWgdU g0H3eg[ggUgZggYggwbgG7 16`\+\ggeggggggg;'9agggcXT'gg#geggggggggg6f(&'&'&'h&'&(((z&'((((((0123456789ABCDEF0123456789abcdefSSSS ((((( AAAAAABBBBBB init  P$Lp1$T$L$su;SSSSu`` QRP P~ UhVWEPjIYYy$jhhGYYjh\9YYj YEPVYEEjEPj2 EjEPj EjEPj Et$jY9E=tj YEEDE UUEEPhS@ YYu UEEE<hYh0jYYj Yhh. YYEx u YjjjjE}t1PjjD E~71 }֍< U9WuujVj0GEF˃=t&1 } FE=thtjYY=P}F1 }:< C Et'xtP:tu? } uVdYYFREUUU$=$uj YU4VWu U< EP Yy UUY E=uhjYYj Y}u Yju YY Pju 5 hEP YYj6EP j Yj YjEP YYx j Yyjhu j_ Y~ V :{ E=u2hjYYjhu j Y}u'j  Yv YV 2jYYj YjEPut 9Eu}ghjzYY6joYYhjaYYV 2jSYYhjEYYjhu jT Yjjj YYv"Yjjf YY PjjU }tV2jYYjhu jYttUWuYjhu. x! uY6jYYtuYB |)hj>YY6j3YYhj%YY3jY)uSYttu6uj_^UVW}hpP::/uhW7 1p YP7 YZ=v$UpEPYYhEPYY7EPsYYhWEP =uFl_^U0VW}j0jEP hEP9YYhEP)YYj uEPT jh(YYƅy =hjYYxU Bk0jPV =tj0EPV =uhj]YYV|Y.VpYE=jhEP ,UfUfUjYEpjhVYYƅx0U Bk0jPV6 =tj0EPV =u=thjYYjVY^ThhYYƅxj0EPV# =u=thj=YYtVWY l_^Uu qYPu u UVWu=hVYYu VYYhVYYW^YPVYYhVYY=_^UV5Nx  ^U=tuYUVux95^U=x 55YU=xjhYYy'j5YY Pj5 1U (  ( =u/hh(5u 1V (= ( u1<     = u ( U} t} u1UV PYt }u :#u1b5  U :u1D : t(}t :"u*  P_YtU>u1^UV U P'Yt  :"uR jYƅt(>"t#= u1{  0ʋ :"u; 0jYƅu1C= u13  0= u1  E^U=y _y1Du17jRY tjAY UVƅtu69YYu^U$UUEPjj[ U(VuEEV֋RUV֋RU E  UUU UEPj7j ^U(VuU @t*uYEU UV֋RUUUEPupYYU UEPjj ^U$UUUUU UEPjjk ++;Wo73cUW}E Mr/u'uĉ fE_]&FUVWaE_^]fT$ UVWM#E_^]U$Vu UUuV֋RUV֋RUEPjLj ^U$UUU U5EPjMj{ 6EPjMji $U8` UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUEPjj Ujju UVu x~ 5juYYy9uuVYVju ^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKV8YE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3WI }׃E뻋EEUUE8t=+UEEE0vYE܋]P3W }׃E뻋EEU9vGu-YEuUUȋUUEEEPj;j RY_^U$EPjj U$UUU UEPjj U$UUU UUUEPjj yEU$EPj*ju yUEUMJ1U$EPj>j= U$UUU UUUEdEPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UU$VWEPYEPEPj jYƋ}t9uvEEPYEEPEPj WYUUjEP=YYEPJYWj]YZ)‰jEPj jEPj t9r)օu jYVYU)_^U$EPj jQ y}tUEEU$EPjj y}tUEEU$UUUUEPj j y} tUE EU$UUUUU UEPjj rUSE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u M U}x}~uPYYU$UUEPjj+ y U1UVW5}׃}~9r }y 9vWYu_^U$EPjj U$UUU UEPj%j U$} uEEUUE UEPjJjQ y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPKYjEPjM V  5 h jKj ^U$EUEPjHj UVW}u M)9r/r uu fE_^]t|{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPCTRL-ALT-DELnowshutdown-consolesh /etc/rcstartbootopts/etc/rcsh/dev/log/dev/null: excessive errors, shutting down init: : bad exit status : init: fork()/dev/fork()//usr/bin/usr/sbin/bin/sbinAQAAAvA, ^, ^8 ~reboot : init: unknown error  No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0pF^I^MLSL ($d/etc/utmp/usr/adm/wtmpXP$SSSS/etc/ttytabUnknown error0$tP@, lXH8 tXD0p\D0Cp .........setupacd84hello# Share the .ashrc of bin. test -f /usr/src/.ashrc && . /usr/src/.ashrc rootconsole7oCttyc16oC##rootof root directory The first entry on each line (except the first 3 and the $ lines, which terminate directories) is the name the file or directory will get on the new file system. Next comes its mode, with the first character being ---dddbbbccc for regular files, directories, block special files and character special files, respectively. The next two characters are used to specify the SETUID and SETGID bits, as shown above. The last three characters of the mode are the _r_w_x protection bits. Following the mode are the uid and gid. For special files, the major and minor devices are needed. The size in blocks must also be specified for block special files (the MINIX block size is 1K; this can only be changed by changing _B_L_O_C_K__S_I_Z_E and then recompiling the operating system). The maximum size of a file system is 1 Gb for a version 2 file system, and 64 Mb for a version 1 file system. Alas the 8086 _f_s_c_k runs out of memory on a V2 file system larger than 128 Mb, so for the 8086 version of MINIX you have to limit yourself to file systems of that size. SSSEEEEEE AAALLLSSSOOO mmmkkkppprrroootttooo(1), fffsssccckkk(1), mmmooouuunnnttt(1). 2 3 $memsize -lt 4096 && swapadv=$(expr 4096 - $memsize) ;; *) test $memsize -lt 6144 && swapadv=$(expr 6144 - $memsize) esac echo -n " How much swap space would you like? Swapspace is only needed if this system is memory starved, like a 16-bit system with less then 2M, or a 32-bit system with less then 4M. Minix swapping isn't very good yet, so there is no need for it otherwise. Size in kilobytes? [$swapadv] " swapsize= read swapsize test -z "$swapsize" && swapsize=$swapadv echo -n " You have created a partition named: /dev/$primary The following subpartitions are about to be created on /dev/$primary: Root subpartition: /dev/$root 1440 kb Swap subpartition: /dev/$swap $swapsize kb /usr subpartition: /dev/$usr rest of $primary Hit return if everything looks fine, or hit DEL to bail out if you want to think it over. The next step will destroy /dev/$primary. :" read ret # Secondary master bootstrap. installboot -m /dev/$primary /usr/mdec/masterboot >/dev/null || exit # Partition the primary. p3=0:0 test "$swapsize" -gt 0 && p3=81:`expr $swapsize \* 2` partition /dev/$primary 1 81:2880* $p3 81:0+ >/dev/null || exit if [ "$swapsize" -gt 0 ] then # We must have that swap, now! mkswap -f /dev/$swap || exit mount -s /dev/$swap || exit else # Forget about swap. swap= fi echo " Migrating from floppy to disk... " mkfs /dev/$usr echo "\ Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if are absolutely sure that there can not be any bad blocks. Otherwise just wait.)" trap ': nothing' 2 readall -b /dev/$usr | sh echo "Scan done" sleep 2 trap 2 mount /dev/$usr /mnt || exit # Mount the intended /usr. cpdir -v /usr /mnt || exit # Copy the usr floppy. umount /dev/$usr || exit # Unmount the intended /usr. umount $fdusr # Unmount the /usr floppy. mount /dev/$usr /usr || exit # A new /usr if [ $fdroot = unknown ] then echo " By now the floppy USR has been copied to /dev/$usr, and it is now in use as /usr. Please insert the installation ROOT floppy in a floppy drive." drive= while [ -z "$drive" ] do echo -n "What floppy drive is it in? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done fdroot=/dev/fd$drive fi echo " Copying $fdroot to /dev/$root " mkfs /dev/$root || exit mount /dev/$root /mnt || exit if [ $thisroot = /dev/ram ] then # Running from the RAM disk, root image is on a floppy. mount $fdroot /root || exit cpdir -v /root /mnt || exit umount $fdroot || exit cpdir -f /dev /mnt/dev # Copy any extra MAKEDEV'd devices else # Running from the floppy itself. cpdir -vx / /mnt || exit chmod 555 /mnt/usr fi # Change /etc/fstab. echo >/mnt/etc/fstab "\ # Poor man's File System Table. root=/dev/$root ${swap:+swap=/dev/$swap} usr=/dev/$usr" # How to install further? echo >/mnt/etc/issue "\ Login as root and run 'setup /usr' to install floppy sets." # National keyboard map. test -n "$keymap" && cp -p "/usr/lib/keymaps/$keymap.map" /mnt/etc/keymap umount /dev/$root || exit # Unmount the new root. # Compute size of the second level file block cache. case `arch` in i86) cache=`expr "0$memsize" - 1024` test $cache -lt 32 && cache=0 test $cache -gt 512 && cache=512 ;; *) cache=`expr "0$memsize" - 2560` test $cache -lt 64 && cache=0 test $cache -gt 1024 && cache=1024 esac echo "Second level file system block cache set to $cache kb." if [ $cache -eq 0 ]; then cache=; else cache="ramsize=$cache"; fi # Make bootable. installboot -d /dev/$root /usr/mdec/bootblock /boot >/dev/null || exit edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; save" || exit echo " Please insert the installation ROOT floppy and type 'halt' to exit Minix. You can type 'boot $primary' to try the newly installed Minix system. See \"TESTING\" in the usage manual." /   81$T$L8su;SSSSu|| QRPD P2UhCY1UV5Nx L^U=tu(YUU Uhuu. U$UUEPjj3 UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE,uVuu+ ƀ}Xu9utUPw YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Ut EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U)JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuETUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }j~y UVu CV€tu ,fNV~u>5pYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvY =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UV<U9<wU<9<v( 16VYt1'<rF5<&Y5<^UVW}u1E}UUs( 1=8u8jY=u1V!փ585<FE5@OVU}9}r69v2W9UvUW~>}t E@u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=@<9}r79}u+UOJ}t E@URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV< uY_^U VWUUb15@t 9ur6E0tU U@tU9ru NJEtU9Wu RWE_^UUas U EUh\hYYjYU$,9Ut*UUEPjjd y U,1UVW5,,}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ(F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uU U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu 0 USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ0tPXPHello world.  Y@Xbdiopux |#+w-r0}LehOlZEGXobocdefginoopor]s)uoxo(null)cannot print floating point HSSSSBbegrom__callsh_gnum_o_printC_do_writ, _growD __bottom8__top<__empty@SENDRECEIVEBOTHSYSVEC!SRCDESTMESSAGE uplwordtupwordupbytedonedownwardbegtextbegdata|begbss8crtso___mainP__penvir|__fpu_prD__penvpH__edata8_exit_environendtext_mainT_printf___funcc__clean___functL__exit__doprnt___stdou___exit__syscal___stdin___stder___iotab__f_print__i_comp ___flushh .csb4_toupperT___cleanj__lseek_malloc __isatty`__write_realloc _free__sbrk_memcpy_errno(__brk__fp_hoo$_fprintf__brksiz,__sendre__tcgeta__ioctl _fflush__send__receivendbss__memcpyb__memmovLECASE.fat.stop.trp.trppc0ERANGEESETEIDIVZEHEAPEILLINSEODDZ.ignmask4__etextendrom|enddata8__end|8....badblocks`$Ph$A c=㥚=㥚=PA$=k=k=QTZ W[H:H:҉=RSTUVW ; ;;=XYZ1v:v:=[\]^_`ac v:v:>=ijklmnoL6oC8:=pqrstuvxC=(v:k=4h:oC;v:_=v:v:V=?@ABC;=xv:7=DEFGHIJLL v: v:=TUVWXYZ\-v:v:=ijklmnoq$::=vwxyz{|~G7oCv:&=Y=oCv:0=V˫v:˫v:=!=v:=Ru5oC¬v:=::=<)Ǭv:Ǭv:?=D!::=؅)aCM;‹=|'~v:~v:Ë= !"#$%&(dv:v:ዚ=+,-./018+v:v:닚=2345678: v:v:=>?@AKv:v:=BCDEFGHJ#I=::=VWXYZ[\^|a6oC߫v:=`abcdefh6oCv:=z{,v:v:=|}~8R7oC&v: =L 6oC4v:.=tM=:v:%=|6oCVv:?=/=l:C=AP=z=z=&6oC}D:z=A Ä=Z=Z=A„= ;„=Uv:v:M=Xv:v:M=Uv:v:M=v:v:M=Nv:v:M=bv:v:N=Uv:v:O=Yv:v:N=Wv:v:N=Uv:v:N=Uv:v:N=Uv:v:O=7oCv:Y=A`Ą= ;Ą=Pv:v:^=Bv:v:^=v:v:_=g&aCv:_=A06oCaCaCAp ;==0 ;7oC7oCVq ;0aC0aCVV6oC7oC7oCVVVVVWApn9:Љ=Љ=AyC:yC:ω=,]}']}'ω=[]}']}'Љ=,''Љ==9:9:Љ=U::щ=   Y/ Y/҉=  v.v.= =v:v:= \=v:ɋ= !"#$&b2:2:t=@ABCDEFH 4141݉=Z[\dd˩v:˩v:쉚=]^_`abce*v:v:== 0D=$&aCtv:,= v:v:؊= v:v:=KLMNOPQSJv:v:=UVWXYZ[]2v:v: =ijklmnoqHv:v:=wxyz{|}4v:v:닚=,v:v:= v: v:=<7v:7v:%=Xv:Xv:I=$=Ov:(= ! v: v:)=#$%&'()+Q v: v:+=-./01235v:v:,=CDEFIv:v:0=GHIJKLMOv:v:5=[\]^_`ac7v:v:6=}~mƀ:ƀ:9=;۬v:۬v:Ë= v:v:>=4#v:v:==kv:v:B=#::C=aC]1= 6oCv:F=@N!v:!v:I=$v:$v:J=%m:m:M=   m6oC|v:P=4 v: v:Q=,-./0124&2v:2v:T=;<=>?@AC%M:M:T=FGHIJKLNp.q7oC7v:V=QRSTUVWYv:v:\=^_`abcdf9v:9v:]= ,:,:`=wAv:Av:d=(Dv:Dv:d=@uv:v:h=8y>:>:m=`v:v:q=     XHdv:dv:s=        +Ev:Ev:t=+ , - . / 0 1 3 U::y=7 8 9 : ; < = ? Mv:Mv:}=N O P Q R S T V ,v:v:=W X Y Z [ \ ] _ _v:v:= )\aCv:B= H:6oC'v:=    8&%v:%v:=       ! 0'Pv:Pv:=$ % & ' ( ) * , Qv:Qv:=/ 0 1 2 3 4 5 ^;CoCjv:=6 7 8 9 : ; < > %Sv:Sv:=O P Q R S T U W %w =Uv:=[ \ ] ^ _ ` a c C6oCYv:=f g h i j k l n `=]v:=x y z { | } ~ "_v:_v:= ZLv:Lv:= |)#v:#v:=      D&`v:`v:=     5mv:mv:=        cv:cv:=$ % & ' ( ) * , `ݎ:ݎ:=- . / 0 1 2 3 5 `pv:pv:=F G H I J K L N ::Ċ=` a b c d e f h L)5:5:Ŋ= Llvv:vv:ʊ= XH0aC۫v:勚= %::ъ= ,::Պ= \+:+:؊= #v:v:ڊ=        1D=":ۊ=       (2::܊=& ' ( ) * + , . (v:v:ފ=4 5 6 7 8 9 : < _v:_v:㊚=@ A B C D E F H v:v:芚=n o p q r s t v uv:v:늚= iv:v:= /:/:= pv:v:=    0Dv:v:=        $Rv:v:=$ % & ' ( ) * , h?v:v: =: ; < = > ? @ B Gv:v:=K L M N O P Q S  Gv:v:?= @Yv:v:= tcv:v:#= l nv:nv:$=  ov:ov:%= ('v:v:)= )v:v:*= >v:v:,= HUޏ:ޏ:4=iv:v:8=)*+,-./1Hv:v:<=EFGHIJKM2222=hiD&aCv:=jklmnopr`Bv:v:=}~|v:v:=$qsv:sv:=ֳ;ֳ;=v:v:=D::= :ɬv:ɬv:=*aCv:j=\ˬv:ˬv:=    )ͬv:ͬv:=@6oCv:= ""άv:άv:=,-./01244}::=6789:;<>`$ެv:ެv:ċ=XYZ[\]^`׫v:׫v:ɋ=cdefghikpTv:v:̋=v:v:͋=Jv:v:Ћ= Ev:v:Ӌ=L!v:v:Ӌ=v:v:ԋ=\6::׋=4aCv ;؋=v:v:ً=bo:o:܋=Dv:v:= "`@::㋚=<=>?@ABD0*v:v:勚=NOPQRSTV%v:v:拚=Z[\]^_`b)"v:"v:狚=efghijkmYv:v:ꋚ=qrstuvwys܎:܎:=n v: v:=v:v:=` ::=v:v:=(1(1=\v:v:=v:v:=v:v:=   00= D v:v:= !S/!S/=,) v: v:=h"v:"v: = !"#%,(v:(v: =&'()*+,.)v:)v:=/012345y9A*9A*=6P9-v:-v:=789:;<=?.v:.v:=GXi:i:=HIJKLMNPv:v:=`abcdefh"::=rv:rv:=rxv:xv:"=l9 ; ;'=H@v:@v:'=he(={v:+=l&Cv:Cv:-=    -Dv:Dv:.=)7oCFv:/= !"#$& ::0=*+,-:::3=./012346`Jv:Jv:3=>?dv:v:7=@ABCDEFH\(::8=\]^_`abd5Nv:Nv:9=hijklmnpOv:Ov:;=wxyz{<Pv:Pv:;=|}~%Tv:Tv:<=*Uv:Uv:==IYv:Yv:A=&\v:\v:B=( av:av:D=QC:QC:V=cv:cv:W=8dv:dv:Z=`ev:ev:Z=w::k=Igv:gv:a=85iv:iv:b=Vv:Vv:j="#$%&'(*,jv:jv:j=_Tq ;q ;y=`abcdefh/#:/#:y=6oC<:z=A,9:疚=疚=A`Ճ/5==v:v:=t+v:v:=)v:v:=~v:v:=  .v:.v:=-./01235Aփ/5==l&aC+=m++=no &aCc2=pqr &aC2=stu- ٭.٭.=vwx11=yzz ߭.߭.={|}m@#q3#q3=~mdq3dq3=m,0q=/=#=u9=AP׃/5==ie>0>0=3 >0>0=  gH0H0匚=   Aك/5b=b=mdr3r3쌚=mr3r3=mĉr3r3=mr3r3= !"#$%'mr3r3C=JKLMNOPR$L>r->r-C=}~$L>r->r-C=mr3r3H=mr3r3N=mr3r3S=m<r3r3Y=    mr3r3^=89:;<=>@m̯r3r3b=bcdefghjm4r3r3g=mq=q3=m|:q3q3=hijklmnpm)r3r3=xyz{|}~mTJr3r3=m$q=4r3=m`9Kr3Kr3=mq=dr3=QRSTUVWYmr3r3=m<r3r3ȍ=A0ڃ/5ʍ=ʍ=,TM&&̍=-./01235A7ԍ=ԍ=B&Њs1Њs1͍=CDEFGHIK&Њs1Њs1Ѝ=NOPQRSTV&Њs1Њs1э=YZ[\]^_a&Њs1Њs1ҍ=defghijl&*s1*s1Ӎ=opqrstuw&Њs1Њs1ԍ=z{|}~h7h7ԍ=ow}'w}'Ս=A0!J:2=2=mtq=Hs3⍚=m Lq=Ms3=]q=:='Bq=`:=()q= ;=*+,-./02qX:X:=!dq=:=78:Oq=:=9:;<=>?ANH_:_:=NOPQRSTVEq=: =bcdefghjM::,=uvwxyz{}|::0=::0=_::1=::1=!::1=Y:Y:2=Av:L=L=mɋ/ɋ/:=   mkɋ/ɋ/G=FGHIJKLNl//H=y9y9L=//L=j\e7j\e7L=y9y9L=(Me*(Me*O=Aރ/5X=X=5--P=--Q=w--Q=--Q=r--R=--R=O--R=--R=U--S=P --S=--T=--T=W--T=--T=--U=--U=+--V=--W=x--W=--W==--W=--W=--X=--X=  P--X= jx}'x}'Y= "6oCv9Z= Ap<&=Z=Z=A &= ;Z=A  ; ;Z=A  ; ;Z=A &aC ;Z=A  ; ;Z=A &aCҗ=җ=A 6oCT:_=A06oC6oC6oCA`8`=`=A06oC_=_=A 6oC8_=A 6oC@9_=A 6oC/5`=A 6oC8`=A P ;曚=曚=77oCBxC:՗=,]}']}'՗=[]}']}'՗= !"#$%,''֗=&y7oC?K:֗='G&.G&.Ö=()*+H 9H 9Ö=,q=X 9Ö=-. \*\*Ö=/0r O 9O 9Ė=123#~1~1Ŗ=456789:< H 9 H 9Ŗ=>?6/6/Ŗ=@ABCDE H 9H 9Ɩ=FGH]*]*Ɩ=IJH 9H 9ǖ=KApܫ9Ȗ=Ȗ=L**Ȗ=MBz!8z!8Ȗ=NOg6g6Ȗ=P@ zw6zw6Ȗ=QRSy_9_9Ȗ=TUjj+jj+ɖ=VWx1x1ɖ=XYZ[<P 9P 9ɖ=\]pP 9P 9ɖ=^_^*^*ʖ=`aA Ό/Ό/疚=! " du9u9薚=# $ =`p2.p2.ꖚ=% & ' ( ) * + - A@ U:F=F=? !"Tt02t02떚=@ Yl0l0=A B C D E F G I jt02t02=Y Z %t02t02=[ \ ~^2^2=] ^ _ ` a b ֐22=c d e f g h i k _u02_u02= E%7%7= bv02v02= /ψI2ψI2= zE!/E!/= 5 22= (4(4= y\w02\w02= }w02}w02= p2p2= }J}2}2= <F= := w02w02=  22= x02x02= 22= ~gx02gx02= Kx02x02= p׊02׊02= x02x02= N y02 y02= 7!y02!y02= 0202= |͊02͊02=  -*-*= z02z02= L::= Rxx3Rxx3= 88= /|02/|02= 1[|02[|02= \AXs9AXs9=!!!./2./2=!!./2./2=!./2./2=!>9>9=!//=! !B~02B~02 = ! !߂/߂/ = !y0.20.2 = !!!! -*-* =!!fq02q02 =!I2I2 =!!!!!!!0202 =!.02.02 =!G02G02 =!h Л:Л: =!! !!b=2b=2=!!"!#!FQYV-YV-=$!%!&!'!(!)!*!,!NpYV-pYV-=:!;!!?!@!B!-*-*={!0202=|!y-y-=}!~!0202=!M؀02؀02=!!Vg5g5=!!!,102102=!! ?02?02=!0'5-5-=!!!!!!!!;:;:=!!>D:D:=!0202=!]./2./2 =!!22 =!!!!!z/$0/$0 =!/$0/$0!=!cJ.'6J.'6!=!~@2~@2!=!!bi02i02!=!bd3bd3"=!!0202"=!::"=!QO02O02"=!Ɔ02Ɔ02"=!//"=!1 21 2#=!!t:t:#=!!!!./2./2#=!!! v7 v7$=!!.2.2&=!22'=!!!!!?[A2[A2'=!$0$0'=!!_0202'=!o0202'=!w &aC02(=!!!!R%aC02)=!!0202)=!!h::)=! 66)=!!![x02x02)=!!./2./2*=!::*=!!./2./2*=!!iC++-=!!!!!!!!$0$0.=!1./2./2.=!! *02*02.=!!IӈI2ӈI2.=!aC./2/=!!Kv02v02/=!F2F20=!!!02020=!ׇ02ׇ020=!$0$00=!-*-*1=!!!!3.3.1=!!!!! I2I23=!""ՈI2ՈI23="M2M24=""" 02024="""&U3U35= " " " " """"02026=")02026="̉02̉026="y02026=""+02026="&02&027="./2./27="`02`027=" ]w3]w38="" "!"""k02028=#"$وI2وI28=$"4/02/028=%"&" 7171;='"(")"F02F02<=*"+","-"."/"0"2"R02R02<=3"!^02^02<=4"5"8p2p2<=6",N2N2>=7"8"9":";"<"="?" 22>=D"E"F"Ë02Ë02>=G"^55?=H"I"0202?=J"0202?=K"./2./2?=L"c'v7'v7@=M"a02a02@=N"0202@=O"(.:.:@=P"R&02&02@=Q"R"G702702@=S"1M02M02A=T"U"10202A=V"O302302A=W"X"9191A=Y"Z"["\"./2./2B=]"..B=^"v02v02B=_"0202B=`"0202B=a"0202C=b"[0202C=c"+ 9,9,C=d"e"f"t$*2*2F=g"h"i"j"k"l"m"o"S0202F=r"A@:^=^=s" \(2\(2G=t"u"v" X)2X)2G=w"x"1(21(2H=y"z"X(2X(2H={"|" X(2X(2I=}"~"""X(2X(2I="""P)2)2I=""(2(2I=""" X(2X(2J=""""V,2V,2J="""Irp:rp:L=""""""?h(2?h(2M=""11M=""""""7ܡ(2ܡ(2M="""G$(2$(2N="z(2z(2N="V(2(2N="@0l420l42P=""""""""(2(2R="" ϩ(2ϩ(2R=""" (2(2R="""](2](2S=""m \)2\)2S=""" ')2')2S=""""2222T=""kd)2d)2U="""""*)2)2U="j)2j)2U="""l)2l)2V=""""""zo)2zo)2X="""U22X="" ~s)2~s)2X=""""v)2v)2Y=""w6w6Y="I)2)2Y="" l1 l1Z=""""""f l1 l1Z=" l1 l1Z=""% l1 l1[="d)2d)2[="""""d22[="s+2+2\=""9 ,29 ,2\=""s)2s)2\=")ˮ22ˮ22\=")2)2\="")2)2]=""x#O9#O9]=##### ӏ)2ӏ)2^=###Z밆:밆:^=# #A:z=z= #:y12y12^= #2{12{12^= #,2,2^= #|12|12_=#CZ12Z12_=##2(12(1_=##_,2_,2b=####r,2r,2b=##N"2222c=#######!#X/X/d=##$#77d=%#&#'#(#)#*#x<22<22d=+#F,2F,2e=,#-#.#/#0#1212e=1#@,2,2e=2#,2,2e=3#4#' ,2 ,2g=5#6#7#;,2,2h=8#9#eO,2O,2h=:#;#!t:t:h=<#=#>#?#@#A#N12N12i=B#C#YM,2YM,2i=D#N32N32i=E#h Dl1Dl1j=F#G#H#I#EJ,2EJ,2j=J#_ V%V%j=K#L#M#|,S,2,S,2k=N# El1El1k=O#P#Q#R#oO12O12k=S#T# l1l1l=U#V#W#,1,1l=X#Y#H 1212n=Z#[#\#jrp:jrp:n=]#^#`,2`,2n=_#`#b`132`132o=a#b#c#d#e#f#g# [12[12o=h#i#\12\12o=j#21212p=k#l#(12(12p=m# !12!12q=n#o#p#q#i8-i8-q=r#s#t#u#v#w#x#z#a12a12r={#|#}#~### g12g12t=###IEl1El1t=##eI,2eI,2t=# 2222u=###7Bk12Bk12u=######; ȁ2ȁ2v=####Q-H,2-H,2w=#'1212w=####El1El1w=#####%El1El1x=#l_0_0x=##k12k12x=# 2:2:x=###_8_8y=######k% :k% :z=######X 22z=###.'2'2}=####A:==#'#մ:մ:~=########V:V:=######## ::::=###b;:;:=########pn.n.=# ^R-^R-=###'K` "5` "5=######$$5 : :=$$$$$$$$A@A:==$ H]2H]2=$$ $!$//="$+2+2=#$]i:i:=$$%$B)s:B)s:=&$'$~ 1 1=($)$*$+$,$Z1Z1=-$.$/$0$1$f.f.=2$3$z_8,_8,=4$5$6$7$00=8$m2222=9$:$;$<$=$>$?$A$} 4 4=l$m$A00=n$o$..2..2=p$q$c::=r$s$t$u$v$ku9ku9=w$x$y$z${$M9M9=|$}$6&V:&V:=~$$$$$$$$A@p:==$C2222=$ze:e:=$Ap/5==$_k2k2=$$$$$$$$‰2‰2=$$$$x o߄2o߄2=$$$;::=$$$$$+@++@+=$$$$$$$$A Z:×=×=$.44=$$ *1*1=$k802802=$Qd02d02=$$Wۼ5Wۼ5=$b;V:V:=$$$$$$$$ެ/ެ/=$0202=%GAXs9AXs9=%%%%%Q,Q,=%%0aC02=% %X2X2= % %_9292= % %%%%9D0D0=%% : :=%?C=:=%%I:I:=%%%%, U2U2=%%%%(Y:Y:=%% %!%"%#%$%&%H+N8N8=*%+%,%-%.%/%0%2%9 ;:;:=6%7%8%>22>22=9%+02+02=:%<!7!7=;%<%=%>%?%@%A%C%|( }6 }6=L%M%N%O%P%Q%R%T%z+;:;:=X%Y%Z%[%\%]%^%`%aC\3=d%e%f%g%h%z:z:=i%j%*1*1=k%qL02L02=l%O-(1-(1=m%n%s ;:;:=o%p%q%yg6yg6=r%s%\::=t%u%"/"/=v%w%' f2f2=x%y%z%{%g2g2=|%}%~%%%I0I0=%%R5R5=%%%%%%Z =2=%%%t:t:=%%%an02n02=%#22=%22=%s;s;—=%%%%%%%%v-.v-.×=%%4D14D1×=%%! <: <:ė=%%%%%%%%Ag5ї=ї=%311Ɨ=%%%%%%%%y!4Ϡ14Ϡ1Ǘ=%%%%%%%%2P1P1ȗ=%%%%%%%% X@2X@2ɗ=%%%%<11˗=%%%%%%%%.2.2Η=%&&&&&&&Z%1Z%1З=%&&&'&(&o 11ї=)&*&+&,&-&.&/&1&11җ=3&4&5&6&7&8&9&::җ=:&9D&aCm:՗=;&<&=&>&?&@&A&C&$8R:8R:֗=N&O&!J:J:֗=P&A X8==Q& qy9qy9ח=R&S&T&#$x9#$x9ۗ=U&V&W&X&Y&Z&[&]& x9 x9ܗ=}&~&&&&& v8v8ޗ=&&&&&&&&y9y9ᗚ=&&&&&&&&F\$x9\$x9䗚=&&&&&&&&jد8د8嗚=&&&&&&&&j.j.嗚=&Rw8w8藚=&&&&&&&&د8د8藚=&&&&&&&ݚ6ݚ6闚=&&&&&&&&M t/ t/闚=&&w4y14y1ꗚ=&+$x9$x9뗚=&&&&,,!x9,!x9=&&&&&'''z A3c5A3c5='' 'A'U:==!'r9::="'#'$'%'&'''('*'AҞ:==r'=11=s'uJ&w8J&w8=t'HC:C:=u'%8585=v'y.y.=w'{ hS:hS:=x'y'z' {68{68={'|'}' &1 &1=~'m3m3='':tw8tw8='iy:iy:='::=' $ $= $ $= $ $=A`P:==' E:E:='''' '9'9=''''a8#E:#E:=''''''''%E:%E:='''''E:E:='''''<OB:OB:='03(E:(E:=''''''''GG0G0=' I62I62=''''6G:6G:=''m^"0m^"0='E:E:=''6-E:-E:=''''''''? **='''9z-2z-2=''''''''.F1F1='''''' 0 0='+pL:pL:='''''''',?G:?G: =''''''''Jm/B:m/B: =((((((S=80B:80B: =( ( ( ( ( (((;G:;G: =((04.14.1=((((( (!(#(G'6E:6E:=)(*(+(,(-(.(/(1(1.1.1=4(5(6(7(8(9(:(v8B:8B:=;(<(=(>(?(@(A( fB: fB:=B(C#T:#T:=C(D(E(F(G(H(I(K(QQ2Q2=U(V(W(X(Y(Z(":E::E:=[(\(](^(_(`(a(c( S1S1=e(f(g(M^F:M^F:=h(i(j(k(l( _.1_.1=m(n(o(x**=p(q(eE:eE:=r(s(t(u(v(8 **=w(x(y(z({(|(}((A0:\=\=(f:f:=((((((((`UK5UK5=((((((((P : :=(((( ]y9]y9 =(A:R=R=(XC::#=((((((((YL :L :$=(kxKh5xKh5$=(6EIh5EIh5$=(((((((I e5 e5%=(Pk:k:'=((((((((}e:e:'=(z:z:)=((Kh5Kh5)=(f5f5)=(Y : :,=((((((((,)f:)f:,=( o2o2,=(_e5e5,=(/o2o2,=( $l:l:/=(())))))@g:g:/= )<@Z:Z:1= ) ) ) )))))>*l:*l:2=)))) )3- : :2=!)")#)$)%)&)')))-th:th:3=.)/)0)1)2) : :5=3)4)5)6)Lh :h :7=7)8)9):);)<)=)?))::8=L)M)N)O)P)Q)R)T)IVKh5Kh5:=X)Y)Z)[)\)])^)`)go2o2:=o)p)q);::>=r)s)t)u)v)w)x)z)oi:oi:>=)i:i:>=)Ll:Ll:D=))))))))i:i:E=))2w:w:E=))))))%0ZH5ZH5H=))))))))mr9r9K=))))))))Me/:/:O=))))))))o2o2O=*Ell:ll:R=******* *j:j:R=&*::S='*(*)***+*,* R:R:U=-*.*/*::V=0*1*2*3*4*5*6*TJ:J:W=7*8*U2::X=9*:*;*<*=*>*?*A*Kh5Kh5X=G*o2o2X=H*NMp:Mp:Y=I*]o2o2Y=J*~>J:J:\=K*L*M*N*O*P*Q*S*o2o2\=\*z:z:\=]*Aq: = =^*G:G:]=_*`*a*b*c*d*e* L2L2^=f*g*h*H:H:^=i*j*k*l*m*FG:FG:g=n*o*p*q*r*s*t*v*oG:oG:h=*>:9>:9k=********.99n=********qS SK: SK:p=********(w͎:͎:u=********vSK:SK:v=++++++6qSK:qSK:v=+++++ +Iy9y9z=!+"+#+$+%+&+'+)+4ys:ys:=5+6+7+8+9+:+;+=+f.99=d+e+f+g+h+i+j+l+*.19.19=q+r+s+t+u+v+w+y+8 9 9=}+~++ 9 9=+++++++0߮8߮8=+RU/9/9=++++++++*'H:'H:=+++J0909=++++++++# 2828=++++Zm8m8=+++++Y^"0Y^"0=+;:aF:aF:=++++++++Aƪ7==+77=++m1m1=+++++++:B00B00=++;|10|10=+++++++ C4 C4=+++++++00=,,,,,,,N& 1 1=,, , , , , ,,1010=,,,,,,,?72?72=,,,,,,,1010= ,!,",#,$,%,&,1010=',(,),*,+,,,-,1010=.,/,0,1,2,3,4,1010=5,6,7,8,9,:,;,!7!7И=<,=,>,?,@,A,B,1c/1c/И=C,uHG9G9Ҙ=D,E,F,G,H,I,J,L,xX9X9ט=X,Y,Z,[,\,],^,`,PO:PO:ؘ=x,y,z,{,|,},[0 ;: ;:٘=~,,,,,,,, %vNG:vNG:ۘ=,,,,,,,,$7R:$7R:ܘ=,,,,,5c/5c/ܘ=,@99ޘ=,,,,,,,,S99ᘚ=,,,,,,,,aF:aF:㘚=,,,,,,,, 1 1㘚=,}299䘚=,,,,,,,,JSK:SK:蘚=,,,,,,,,bTK:TK:蘚=,,,,,4*n9n9ꘚ=,,,,,,,,n9n9ꘚ=------4TK:TK:혚=- - - - - ---\7R:\7R:=--------taF:aF:=J-K-L-M-N-O-P-R- %0%0=i-j-k-l-m-n-o-Ht8t8=p-q-r-s-t-u-v-x-.88=--------O00=- E: E:=---uTK:TK:=--------bF:bF:=------%1%1=----- 99=----&G:G:=-------- m 1m 1 =----/y9y9 =--------l0909=--------AD!J: = =. M!J:M!J:= . . . .A0/5(=(= .z.-/-/=.......s*s*=.&s*s*=.s*s*=..s*s*=.s*s*=.}s*s*=.Zpy9py9=.%Y+%Y+=.s*s*=.es*s*=.s*s*= .++=!.".s*s*=#.ms*s*=$.s*s*=%. *2*2=&.'.(.s*s*=).=@ .@ .=*.+.,.-.../.0.2.s*s*=;.^ X5 X5=<.s*s*==.As*s*=>.As*s*=?.As*s*=@.As*s*=A.As*s*=B.As*s*=C.As*s*=D.As*s*=E.As*s*=F.As*s*=G.As*s*=H.Cs*s*=I.*s*s*=J.s*s*=K.'s*s*=L.0s*s*=M.s*s*=N.h5h5=O.P.Q.R.S.s*s*=T.s*s*=U.s*s*=V.s*s*=W. . .=X.s*s*=Y.\s*s*=Z.s*s*=[.$Rk3Rk3=\.].^._.`.a.b.d. (1(1!=g.h.i.j.4 s*s*"=k.l.m.n.++"=o.s*s*"=p.s*s*"=q.s*s*#=r.gp2.p2.#=s.s*s*#=t.s*s*#=u. . .#=v.s*s*#=w.}s*s*$=x.s*s*$=y.Ys*s*$={.s*s*%=|.}.~..is*s*&=.s*s*&=.J . .&=.s*s*&=.s*s*&=.s*s*&=.s*s*'=.&Y+&Y+'=.s*s*'=.B1B1'=...s*s*'=.X5X5(=..Ts*s*(=.Ts*s*(=.s*s*(=.s*s*(=.s*s*(=.AH:7=7=. H:H:)=....s*s*)=.s*s*)=..s*s*)=.tE1tE1,=......zD1zD1-=.. s*s*-=.s*s*-=.s*s*-=.<s*s*-=.s*s*-=.s*s*-=.s*s*.=..... s*s*.=...N &Y+&Y+/=....{D1{D10=.....s*s*0=..Ss*s*0=..5{D15{D10=..s*s*1=..s*s*1=..!s*s*1=..'Y+'Y+1=.....s*s*4=...s*s*4=.Qs*s*4=..s*s*4=.s*s*5=.s*s*5=.s*s*5=.#s*s*5=.s*s*5=.'Y+'Y+6=.G'Y+'Y+6=.(s*s*6=..us*s*6=..s*s*6=.s*s*7=... s*s*7=.s*s*7=..Aw8?=?=.~8~89=..i ,1,19=...R8R89=.....^FR8FR8>=........w//>= / / ,1,1>= / //,1,1>=//,1,1?=/Ap/5?=?=/7070?=/MY5Y5?=/BY5Y5?=/}Y5Y5?=/6Y5Y5?=/A /5P=P=/%.%.@=/[Y+[Y+@=/EŤ*EŤ*@=/HŤ*HŤ*@=//JŤ*JŤ*A=/X u/u/B=/ /!/"/ V/V/B=#/$/%/MuI+uI+C=&/'/buI+uI+C=(/)/`)`)C=*/-O,O,C=+/FO,O,D=,/\Y+\Y+D=-/O,O,F=./XO,O,F=//-uI+-uI+F=0/1/0uI+0uI+F=2/O,O,F=3/4/P,P,F=5/6/;uI+;uI+G=7/>uI+>uI+G=8/9/,BuI+BuI+G=:/;//W(P,(P,H=?/@/"7P,7P,H=A/B/mNuI+NuI+I=C/D/E/F/G/H/I/BP,BP,J=J/MP,MP,J=K/ XuI+XuI+J=L/M/N/\uI+\uI+J=O/_uI+_uI+J=P/i,i,K=Q/i,i,K=R/S/<70<70K=T/Ť*Ť*K=U/V/mP,mP,L=W/tP,tP,L=X/quI+quI+L=Y/Z/[/8P,P,L=\/fP,P,L=]/t{uI+{uI+M=^/_/S,S,M=`/h,h,M=a/uI+uI+O=b/vuI+uI+P=c/d/uI+uI+P=e/f/?uI+uI+P=g/UuI+uI+P=h/vuI+uI+P=i/A`/5Q=Q=j/b0/0/Q=k/+/+/Q=l/l+/+/Q=m/n/o/p/s*s*Q=q/Ap/5S=S=r/3+-3+-R=s/@+-@+-R=t/yI+-I+-S=u/K+-K+-S=v/M+-M+-S=w/x/AZ8k=k=y/88T=z/Aܫ9a=a={//c9c9T=|/}/~////z)z)T=/$D/$D/U=/(D/(D/U=/3.n).n)U=/.n).n)U=/"*"*U=//D//D/U=/3D/3D/V=/`9D/9D/V=/?D/?D/V=/CD/CD/V=/FD/FD/V=/.n).n)V=/ID/ID/V=/KD/KD/V=/].n).n)W=/.n).n)W=/.n).n)W=/.n).n)W=/MD/MD/W=/PD/PD/W=/m.n).n)W=/.n).n)X=/RD/RD/X=/TD/TD/X=/.n).n)X=/G.n).n)X=/.n).n)X=/.n).n)Y=/.n).n)Y=/;[D/[D/Y=/^D/^D/Y=/aD/aD/Y=/cD/cD/[=/(-.>(-d=//A/A/e=/da8da8e=//99e=//99e=//A/5j=j=///f=//[..f=///"_._.f=//jqJ-qJ-g=/wH-wH-g=/16-6-g=/HyJ-yJ-g=/J-J-h=/6-6-h=/6-6-h=/#6-6-h=//uJ-uJ-h=/..h=//Ώ6-Ώ6-h=/ԏ6-ԏ6-i=/׻.׻.i=/<܏6-܏6-i=/6-6-i=/t6-6-i=/6-6-j=/6-6-j=/6-6-j=/-6-6-j=0-6-6-j=06-6-j=0(6-6-j=0J-J-k=0AH8n=n=088k=00LVm1Vm1k=0Vm1Vm1k= 0Vm1Vm1k= 0fu8u8l= 0OVm1Vm1l= 0Vm1Vm1m= 0Vm1Vm1n=0UVm1Vm1n=0cVm1Vm1n=0nVm1Vm1n=0OVm1Vm1n=0Vm1Vm1n=0A8==0>8>8o=0A`j<:y=y=0::::o=00006+6+o=0s*s*o=0s*s*p=0s*s*p=0s*s*p=0s*s*p= 0s*s*p=!0|s*s*p="0fs*s*q=#0s*s*q=$0>s*s*q=%0s*s*q=&0s*s*q='0s*s*q=(0s*s*r=)0*0s*s*r=+0\::\::r=,0s*s*r=-0s*s*r=.0_s*s*r=/0 7/ 7/t=0010203040506080Ms*s*t=90399t=:0s*s*t=;0s*s*u=<0es*s*u==0s*s*u=>0s*s*u=?0s*s*u=@0ps*s*u=A0s*s*u=B0s*s*u=C09s*s*v=D07s*s*v=E0s*s*v=F0s*s*v=G0ms*s*v=H0}s*s*v=I0-s*s*v=J0s*s*w=K0s*s*w=L0M0s*s*w=N0s*s*w=O0ts*s*w=P0s*s*x=Q0s*s*x=R0(s*s*x=S0s*s*x=T0U0bs*s*x=V0t*t*x=W0t*t*y=X0Af5|=|=Y0n)>n)=0 Nu.Nu.=0000 44=000ev)ev)=005tц)tц)=09*/*/=003Z53Z53=00000000P*/P*/=00000000}ɂ4ɂ4=000000+G2+G2=000001wP*/P*/=1111111 1Nno.no.= 1 1 1 11111N7N7=1Z:Z:= 1!1"1#1$1%1&1(1)[-:)[-:=)1*1.[-:.[-:=+1,1A X5==-1PU5PU5=.1/1$+-$+-=0111213141%'+-'+-=5161718191:1;1#-+--+-=<1=1?l-l-=>1?16+-6+-=@1A1B1C1D1E1F1H1a--=I1J1`2`2=K1L1M1N1=+-=+-=O1P1D1A+-A+-=Q1R1S1T1U1V1W1Y1$D+-D+-=_1`1a1b1c1d1e1g13H+-H+-=j1k1K+-K+-=l1m1n1o1p1q1r1t14P+-P+-=u1v1w1w Q+-Q+-=x1y1z1{1U+-U+-=|1}1~1xY+-Y+-=11111111[+-[+-=1%--=11111111b+-b+-=11111~--=111nF-nF-=11o+-o+-=111(ZU5ZU5=11111111qw+-w+-=1--=1J{+-{+-=1W}+-}+-=1+-+-=1+-+-=1 +-+-=111+-+-=11e+-+-=11m+-+-=1U5U5=1lU5lU5=1 +-+-=11U 8.8.=1111+-+-=11'+-+-=1+-+-=1+-+-=1+-+-=1 +-+-=1 +-+-=11+-+-=1+-+-=1J+-+-=11A/5ř=ř=1/2`2`2=11111T +- +-=1V +- +-=1Z +- +-=15ŏU5ŏU5=11+-+-=1+-+-=1V+-+-=11+-+-=1O-O-=119+-+-=1G ܏U5܏U5=1111j+-+-=1+-+-=11J!+-!+-=111 "+-"+-=1$+-$+-=11N'+-'+-=1(+-(+-=1 (-(-=111b,+-,+-=111w--=1--=11+-1+-=1 --=11W--=17+-7+-=1}--=1:+-:+-=22 U5 U5=22>+->+-=22@+-@+-=22B+-B+-=2D+-D+-= 2 2KF+-F+-= 2H+-H+-= 2TI+-I+-= 2~ U5U5=222M+-M+-=21O+-O+-=22Q+-Q+-=2R+-R+-=2T+-T+-=2fV+-V+-=2X+-X+-=2Z+-Z+-=2r[+-[+-=23]+-]+-=2_+-_+-=2oa+-a+-=22yb+-b+-=2xd+-d+-= 2!2f+-f+-="2h+-h+-=#2Ei+-i+-=$2--=%2E--=&2o+-o+-='2(2q+-q+-™=)2*2ls+-s+-™=+2,2--™=-2--™=.2x+-x+-™=0212z+-z+-Ù=22|+-|+-Ù=32~+-~+-Ù=42+-+-Ù=52.+-+-Ù=62+-+-ę=72826+-+-ř=92:2+-+-ř=;2<2+-+-ř==2>2/+-+-ř=?2@24+-+-ř=A2AP/5ƙ=ƙ=B2K//ƙ=C2_,_,ƙ=D2E2_,_,ƙ=F2G2H2A/5͙=͙=I27070Ǚ=J2K2t*t*Ǚ=L2M2t*t*Ǚ=N2O2Pt*t*Ǚ=P2t*t*ș=Q2^t*t*ș=R2S21t*t*ș=T2t*t*ș=U2$*Y+*Y+ș=V26060ș=W2_t*t*ə=X2+Y++Y+ə=Y2t*t*ə=Z2t*t*ə=[2\2>t*t*ə=]2^2t*t*ʙ=_2@6060ʙ=`2@t*t*ʙ=a2b2+Y++Y+̙=c2d2t*t*̙=e2f2>t*t*͙=g2It*t*͙=h2i2vt*t*͙=j2k2APG:噚=噚=l2D::Ι=m2n2o2p2}:}:Ι=q2r2͡D:͡D:Ι=s2R0R0Ι=t2Y//ϙ=u2 ::::ϙ=v2w2x2y2nv 2nv 2ϙ=z2v 2v 2Й={2v 2v 2Й=|2&1&1Й=}2~2t*t*Й=25t*t*Й=2 t*t*љ=2lt*t*љ=2pt*t*љ=22t*t*љ=22t*t*ԙ=22222222t*t*ԙ=22 Φ%1Φ%1ՙ=2222t*t*ՙ=2t*t*ՙ=22E1E1ՙ=22 צ%1צ%1֙=2222 00֙=2222~t*t*֙=2,a+a+י=2t*t*י=2t*t*י=2t*t*ؙ=2t*t*ؙ=22at*t*ؙ=22wt*t*ؙ=22Yt*t*ؙ=2h,Y+,Y+ٙ=222226t*t*ٙ=22 t* t*ٙ=22++ܙ=2221q::q::ݙ=22222222YѣX5ѣX5ݙ=22wt*t*ݙ=2gnt*t*♚=22222222it*t*♚=222t*t*㙚=2t*t*䙚=2Ft*t*䙚=2t*t*䙚=2a+a+䙚=22///䙚=2t*t*噚=2222222t*t*噚=2200噚=22ARC:==2I3C:C:晚=2233333J/J/晚=3a+a+晚=3t*t*癚=3G0G0癚=300癚= 300癚= 3\0\0癚= 3+2.+2.癚= 3t*t*癚= 3/a+a+虚=3t*t*虚=3t*t*虚=3//虚=3t*t*虚=3t*t*虚=31t*t*虚=3-C:C:陚=3N]C:]C:陚=3)t*t*陚=3t*t*陚=3Xq0q0Ꙛ=33t*t*Ꙛ=3 e8e8왚=333 t* t*왚=3 t* t*홚= 3 t* t*홚=!3[ t* t*홚="3 0 0홚=#3!t*!t*홚=$3!t*!t*홚=%3!t*!t*=&3QE1QE1='3E1E1=(3"t*"t*=)3-"t*"t*=*3"#t*#t*=+3+2.+2.=,30.0.=-3|R.R.=.3$t*$t*=/3H$t*$t*=03 $t*$t*=13#Q/Q/=2333b+b+=43%t*%t*=53%t*%t*=63%t*%t*=73b+b+=83%.1.1=93:34&t*&t*=;3</</=<3,2.,2.==3&t*&t*=>3 0 0=?3't*'t*=@3't*'t*=A3't*'t*=B3't*'t*=C3m+m+=D3E3{ܘ&9ܘ&9=F3G3(t*(t*=H3)t*)t*=J3T< 9T< 9=K3L3)t*)t*=M3)t*)t*=N3*t**t*=O3m0m0=P3 m0 m0=Q3 m0m0=R3m0m0=S3#m0#m0=T3Il0l0=U3*t**t*=V3*t**t*=W3+t*+t*=X3+t*+t*=Y3)0)0=Z3[3+t*+t*=\3q2.q2.=]3,t*,t*=^33,t*,t*=_3b+b+=`36|C:|C:=a39C:C:=b3qC:C:=c3d3: C:C:=e3f3g3A`̎v:==h3؁D1؁D1=i3j3k3l3/t*/t*=m3 /t*/t*=n3q2.q2.=o3p3q3r3s3t3u3'22=v3w3x3y3z3{3|3~30t*0t*=3Y0t*0t*=30t*0t*=31t*1t*=3T:T:=331t*1t*=32t*2t*=32t*2t*=32t*2t*=3(;2.;2.=33 Ɠv:Ɠv:=333e ++=333Y4t*4t*=34t*4t*=34t*4t*=34t*4t*=3++=33^5t*5t*=3.Y+.Y+=336t*6t*=3 .Y+.Y+=36t*6t*=36t*6t*=37t*7t*=38t*8t*=3q2.q2.=3.Y+.Y+=33Q!81!81=3Q9t*9t*=39t*9t*=39t*9t*=3j9t*9t*=3:t*:t*=3 ;t*;t*=3a;t*;t*=3;t*;t*=3*Q0*Q0=3-v:v:=3R4ŏH:ŏH:=?4A@ h6==@4g6g6=A4i {t){t) =B4C4D4A0@!J: = =E4!J:!J: =F4A`@R:1=1=G43P:P: =H4I4a9gP:gP:!=J4K4L4M4N4O4P4R4r N: N:$=Z4[4\4]4^4_4`4y9y9$=a4WP:P:'=b4c4d4e4f4g4h4j4*hsp:hsp:*=y4z4{4|4}4~444>u N:u N:*=44qP:qP:*=4k?R:k?R:+=44444411+=4^ O:O:+=444WN:WN:+=44 ]rP:]rP:,=444 y9 y9,=44NmP:mP:0=44444444 i8i80=444l N: N:0=4444**1=4CK:CK:1=4444 mvP:mvP:2=4444A  h6p=p=4+2+22=44 q2.q2.3=444m.m.3=4HJg6Jg63=4444444 h6 h66=444444N,+,+6=4Ar2.r2.6=44,+,+6=4n3+n3+6=44 n3+n3+7=444g,+,+8=44444pn3+n3+8=4n3+n3+8=44on3+n3+8=44v]r2.r2.:=44444444,+,+;=4455555z,+,+@=5555 5 5 5 5 ,+ ,+E=%5&5'5(5)5*5+5-5f9n3+n3+F=G5H5I5J5K5L5M5O55151I=W5X5Y5Z5[5\5]5_5Kx/x/K=`5a5b5c5d5e5f5h5%Nr2.r2.N=t5u5v5w5x5y5z5|5n3+n3+O=555550r2.r2.P=55555555c.s2.s2.Q=55555555K\11S=55555555)V0V0V=55555555's2.s2.W=555555555ֵ1ֵ1X=55555555^Rs2.s2.[=55555555uE/E/\=5566666$ 1 1]=6666 6 6 6 6N11]=6666666'!1!1_=66666666I%1%1a="6#6$6%6&6'6(6*6E)1)1c=66768696:6;6<6>6L'-1-1d=I6J6K6L6M6N6O6Q61111e=T6U6V6W6X6t2.t2.e=Y6Z6[6\6]6^6_64141f=`6a6b6c6d6e6f6#,8181g=g6h6i6j6k6l6m6o6t2.t2.g=t6u6=1=1h=v6w6x6y6z6{6|6~6n3+n3+j=66666666U0,+0,+k=66666Ju2.u2.l=66666666\g11o=66666666$u2.u2.p=66666A >8>8p=6ApH:u=u=6H:H:q=65+E:E:r=66666666 ݀1݀1s=666#G|BO:|BO:u=66666666;/;/u=6v::盚=66A/5==6B1B1盚=6++盚=6<+ 9+ 9雚=66666666++雚=6h^1h^1雚=66++雚=7j++ꛚ=77++ꛚ=77++ꛚ=7777++ꛚ= 7#_1#_1웚= 7++웚= 7++웚= 7 7777N++훚=7++훚=7V + +훚=7_1_1훚=7 + +훚=7 + +훚=77K + +=7 + +=7 + +=7@ + +=7I + +=73 + +=7 + +=7A`H:==7%H:H:= 7!7u^2.2.="7#7$7%7&7'7(7*7l2.2.=;7<7=7 2.2.=>7?7@7X$2.2.=A7B7C7D7E7F7G7I72.2.=L7M7N7O7P7Q7R7T7t+2.2.=n7o7p7q7r7s7t7v7)2.2.=z7{7|7}7~7777~2.2.=77777777x 2.2.=777CD2.2.=77777777Q+2.2.=77777777+2.2.=77777777 2.2.=777777 x|2x|2=777k2.2.=7777777<2.2. =7777777752.2. =777777772.2.=8888 8 8 8 8V82.2.=-8.8/80818283858AtP:Y=Y==8@ i+J:i+J:=>8?8@8A+E*+E*=A8B8C8D8E8F8G8I8A/5==S8++=T8U8V8i>,>,=W8ܺ+ܺ+=X8ݺ+ݺ+=Y8Z8.F,.F,=[8\8ߺ+ߺ+=]8+.I2.I2=^8_8`8a8b8c8d8f82++=j8u++=k8l8BşE2şE2=m8n8e++=o8>,>,=p8q8r8s8t8++=u8++=v8E2E2=w8 T.T.=x8y8z83!],],={8|8}8~888881E*1E*=88888P:P: =8888888$*P:*P:!=88888AO88$=88888888 9?9 Dk*Dk*9=@9A9B9C98<-<-9=D9E9F9G9H9 )V/)V/:=I9J9K9L9o, , ,<=M9N9O9P9Q9R9S9U9,)LT8LT8<=Z9[9\9]9^9_9`9b9iE*iE*==f9g9h9i9j9k9c# , ,>=l9m9n9o9p9q9r9t9 w-V/w-V/A=v9w9x9y9anE*nE*A=z9{9|9}9~9 dP:dP:A=999qE*qE*B=99999RsE*sE*C=999999"B6B6D=99999999 ,,D=99992(B+B+G=999999992 zE*zE*G=9999tRJ:RJ:L=99999999 ~E*~E*M=999 - -N=99999999M ++N=999 OC:OC:O=9999 &?,&?,Q=99999999A0/5Q=Q=9,,Q=9A0/5R=R=92}Ak*Ak*U=99999999?,?,U= : : :::::E*E*V=:::3I:I:Y=::::::::3*+3*+Z=#:$:%:&:A`/5[=[=':xe(0e(0Z=(:N^h)^h)[=):*:+:,:-:.:^h)^h)[=/:0:^h)^h)\=1:2:3:4:A/5l=l=5:Ҡ1Ҡ1\=6:ٱ,/ٱ,/\=7:8:7s,/s,/]=9:Xa+/a+/_=::;:<:=:>:bB*<1*<1a=?:@:A:B:C:D:E:G:a+/a+/a=Q:b+/b+/b=R:S:T:U:V:W:X:{ `1`1b=Y:Z:[: %b+/%b+/b=\:]:^:$)6b+/6b+/e=_:`:a:b:c:d:e:g:z^+/^+/j=k:l:m:n:o:p:q:s:~++j=:2Mb+/Mb+/l=::::::::Dq<1q<1m=::::::::AH:==:@F$Me*$Me*q=::::::::|:|:r=::'Me*'Me*w=::::::::9'Me*'Me*y=::::::::q2"/q2"/y=:;;;;^W2"/W2"/z=; 'Me*'Me*z=;;;0E(Me*(Me*}=; ; ; ; ; ;;;]//~=;(Me*(Me*~=;;X (Me*(Me*~=;; ;(Me*(Me*=!;";#;$;%;&;)Me*)Me*=';(;);*;+;,;-;/;M)Me*)Me*=0;1;2;3;4;Q|)Me*)Me*=5;6;7;8;9;:;;;=;)Me*)Me*=V;W;FF!/FF!/=X;Y;Z;[;\;];^;[**Me**Me*=_;`;a;b;c;d;e;g;+Me*+Me*=k;l;m;n;o;p;q;s;+Me*+Me*=;;;;;;O+Me*+Me*=;;;;;;;;?F!/F!/=;;;;;;;;f,Me*,Me*=;,Me*,Me*=;A`/5==;19,19,=;319,19,=;;2<|$3<|$3=;;19,19,=;;;19,19,=;19,19,=;19,19,=;;19,19,=;;;;;F("/("/=;;;;;;;19,19,=;;;;;;'19,19,=;;;;;;;;s%19,19,=;;;;;;;; / /=;;;;;;;19,19,=;;;;;;<Xz%"/z%"/=<<<<<<< <w19,19,=<<<<<<<!<!19,19,=8<9<:<;<<<=<><@<119,19,=B<C<19,19,=D<E<F<G<H<I<J<19,19,=K<L<A /5Ĝ=Ĝ=M< [)0[)0=N<O<P<q%++=Q<R<S<T<U<V<W<Y<++=\<]<"++=^<_<`<a<b<".r 2r 2=c<d<e<f<g<h<i<k<:&..=p<q<r<s<t<u<v<x<K 3+ 3+={<|<++=}< $++=~<<<<<<<<++=<<b++=<<<<<< c2c2=<<<{ ..=<<<5++=<<<<<<<<l5"+5"+=<<<<l++=<<++=<<<< 22=<<<- ٭.٭.=<<<11=<<z ߭.߭.=<<<,E++=<<<<<<<<++=<<<M謶,謶,=<<<<<<<<3++=<<<<<<<<++=<<<<<+++=<r++Ü=<<<<<<<<'++Ü==++Ĝ===W2W2Ĝ========= 2 2Ŝ==== =!="=#=AH:Μ=Μ=$=> H: H:Ɯ=%=}Vi*Vi*Ɯ=&='=(=)=*=+=,=8_i2.i2.ɜ=-=.=/=0=1=2=3=5=*11ʜ=F=G=H=I=J=K=L=N=, @/@/˜=R=S=T=U=V=W=X=Z=3u0u0̜=\=]=^=_=`=a=b=d=V.G1V.G1Μ=j=k=l=m=n=dJ0J0М=o=p=q=r=s=t=u=w=A/5ٜ=ٜ==p//ќ===A+lfi*lfi*Ӝ=========H6+H6+Ӝ=======mfi*mfi*Ԝ=======Xdnfi*nfi*֜=========FH6+H6+؜========= ofi*ofi*ٜ==vofi*ofi*ۜ=========AH:===H:H:ܜ===CVi*Vi*ݜ=========Vi*Vi*ޜ==>>>>>>>v"Vi*Vi*ߜ=> > > > > >>>Vi*Vi*ߜ=>>^fVi*Vi*㜚=>>>>>>>>=b/b/䜚=/>0>1>2>3>4>5>7>5Vi*Vi*圚=8>9>:>;><>=>>>@>Vi*Vi*뜚=A>B>C>D>E>F>G>I><Vi*Vi*휚=u>v>w>x>y>z>{>}>UVi*Vi*휚=>>>>>Vi*Vi*=>>>>>>>Vi*Vi*=>>>>>>rVi*Vi*=>>>>>>>L,Vi*Vi*=>>>>>>>>Vi*Vi*=>>>>>>>>Vi*Vi*=>>>>>>&Vi*Vi*=>>>>>>>>OVi*Vi*=>>>>>>>>:<Vi*Vi*=>>>>>>>>Vi*Vi*=>>Vi*Vi*=>>>>>///=>>>>>>>>Vi*Vi*=???????tb/tb/=?>Vi*Vi*=? ? ? ? ? ???FVi*Vi*=?????$Vi*Vi*=?? ?!?"?#?$?&?Vi*Vi*=)?*?F&D91D91=+?,?-?.?/?0?1?3?Vi*Vi*=6?7?8?9?:?;?cVi*Vi*=???@?A?B?xI. 1I. 1=C?D?E?F?G?H?I?K?3Vi*Vi*=c?d?e?f?2Vi*Vi* =g?h?i?j?k?l?m?o?h 0h 0 =u?v?w?x?y?z?{?}?)**=????????gVi*Vi*=??FVi*Vi*=????????ixVi*Vi*=????????Vi*Vi*=??????䇬1䇬1=????????Vi*Vi*=@ @A/5z=z=!@w++0="@#@$@%@&@'@(@*@W He*He*1=@@@@ He*He*2=@@@ 1G11G12=@@@V>++5=@@@@@@@@He*He*5=@@)$He*He*7=@@@@@@@@υIe*Ie*<=@@@@@@@@DIe*Ie*?=@@@@@@@@2Ie*Ie*A=AAAAAA A AGJe*Je*C=AAAAAAAAJe*Je*C=$A%AJe*Je*C=&A'A L2G12G1G=(A)A*A+A,A-A.A0A)Je*Je*I==A>A?A@AAABACAEA4Ke*Ke*L=IAJAKALAMANAOAQAXLe*Le*L=XAYAZA[A\A]A^A!Ҋ2/Ҋ2/M=_A`AaAbA?Le*Le*O=cAdAeAfAgAhAiAkAMe*Me*Q=tAuAvAwAxA@Me*Me*S=yAzA{A|A}A~AAA'Me*Me*T=AAAAAAAAvNe*Ne*T=AAAp&Ne*Ne*W=AAAAAAAA(Ne*Ne*X=AAAAAAAANe*Ne*Y=AAAAAA Ne*Ne*Y=AAA3Oe*Oe*Z=AAAAOe*Oe*Z=AAAAAjCH0H0^=AAAAAAAA Oe*Oe*^=AAAOe*Oe*_=AAAAcPe*Pe*c=AAAAAAAAy+Pe*Pe*d=AAAAAAAA4IQe*Qe*f=BBBBBBB BCQe*Qe*i=BQe*Qe*i=BBBBB!Qe*Qe*j=BBBBB B!B#BQe*Qe*j=%B&B'B(B)B(Qe*Qe*l=*B+B,B-B.B/B0B2BRRe*Re*p=6B7B8B9B:B;BB@Re*Re*q=LBMBNBOBPBQBRBTBRe*Re*r=^B_B`BaBbB Re*Re*r=cBdBeBfBCSe*Se*v=gBhBiBjBkBlBmBoBKRSe*Se*z=yBzB{B|B}B~BBBPSe*Se*|=BBBBBBBBAp/5==B &&}=BBF1_'_'=BBBBBBBB =`8=`8=BBBBB?&&=BB&&=BBBBB'i&&=BBBBBBBB6"&&=BBBBBBBBTM&&=BBBBBBBBq&&=BBBCCCCC{_'_'=CCCCC C!C#C&&=;CC?C@CACCC,&,&=CL-&-&=CCCCCCCC@:&&=CCCCCCCCD8&8&䟚=CCCCCCCC88&8&埚=CCCCCCCC / /ퟚ=CCCCCCCC09&9&= D DDDDDDDg9&9&=DDDDDD D"DQb9&9&=#D$D%D&D'D(D)D+D9&9&==D>D?D@DADAH:==BDKH:H:=CD4Ύ:Ύ:=DDEDFDGDHDIDJDLD]#*2#*2=SDTJ:TJ:=TDUDVDWDXDYDZD\D11=]D@1@1=^D_D`Ȍ1Ȍ1=`D!W2W2=aDbDcDdDeDfDgDiDF8181=kDP jO1jO1=lDmDnD{O1{O1=oDAXJ:==pD$H:$H:=qD }9}9=rDsDtDB1B1=uDMb8b8=vDwDxDyDzD{D|D~D B1B1=DD`i4`i4=DDDDDDD]2]2=D"#u>6u>6=DDDDDDDD3?C1?C1=D(1(1=DDA`v:==D4v:4v:=DH:H: =DDDDDDDDA/5==Dd33d33 =Dq%C0%C0 =DD76*C06*C0 =DDDDD]92]92 =DDDDm92m92 =D69292=DDDDDDDD='92'92=DDDDEEEE22= EU^2^2=EEEEEEEE.Zf2f2=%E&E'E(E)E*E+E-EbQFF3FF3==E>E?E@EAEBECEEEj$-$-=SETEC2C2=UE9292=VEWEXEYEZE[EAPv:m=m=\EFG 3 3 =]E^E_E`EaEbEcEeEAv:Av: =pEqE mv:mv: =rEsEtE+v:v:"=uEvEwExEyEzE{E}Eav:av:"=EEEdv:dv:#=EEfv:fv:#=EQ hv:hv:#=EEE0909#=EE,!F6F6$=EEEEEEEEně4ně4$=E99$=EfJ(9(9(=EEEEEEEE]1v:1v:*=EEEEEEEEQd6d6*=EEf^ר9^ר9.=EEEEEEEE9 ܨ9ܨ9/=EEEEa6a6/=EEEEEEE5GK6GK60=EE k8k80=EEEt09090=EET|S 9|S 94=EEEEEEEE7F9F96=EEEEEFFF8|ç9|ç96= F F F FFb6b66=F 6 68=FFF'O9O99=FFFFFFFFY9Y9:=FT M6 M6;=F99;= Fç9ç9;=!F"F44;=#F$F%F&F'F (4(4<=(F#99<=)F*F+F,F-F.F/F1FR99==3F4Fި9ި9==5F6F/v:v:@=7F8F9F:F;F$0$0="H#H$H%H&HB3&F:3&F:='H(H)H*H+H,H-H/H*::=9H:H;HH?HAHK.9C1.9C1=EHFHGHHHIHJHBW8BW8=KHLHMHNHOHPHQH ::=RHSHTHUH90c/0c/=VHWHXHYHZH[HA28==\HJS9S9=]H^H_H`HaHbHcHeHAXs9AXs9=qHrHsHE88=tHAXs9AXs9=uH)t9t9=vHwHxHyHzH{H|H~HAXs9AXs9=HHK 9 9=HHHHHHA:==HO#d:#d:=Hn|;:n|;:=H-2:2:=HHHHHHHHki:i:=HHHHHHHH'::=HHHHHHQ;:Q;:=HHHHHHaSS:SS:=HHHHHHHHA`g5ɠ=ɠ=Hg5g5=HH Ze*Ze*=HHHHa9Ze*Ze*=HHHHHHHHZe*Ze*=HHHHHHHIZe*Ze*=IIII<4[e*[e*=II I!I"I#I$I&IR@[e*[e*=-I.I/I0I1I2I3I5I[e*[e*=?Ȉ\e*\e*=@IAIBICIDIEIFIHI \e*\e*=eIfI\e*\e*=gIhIiIjIkIlImIoIh\e*\e*=pIqIrIsItIuIvIxIp&1&1=IIIIIIII%]e*]e*=IIIIIIIIg5g5=IIIIIIIIfy}/y}/=IIIIIIIIfe0e0Ġ=JJJJJJJJ`e*`e*Ƞ=-J.J/J0J1J2J3J5J/`e*`e*ɠ=PJQJRJSJTJ1`e*`e*ʠ=UJVJWJXJYJZJ[J]JA@/5ՠ=ՠ=cJ_be*be*ˠ=dJbe*be*ˠ=eJce*ce*ˠ=fJ-ce*ce*͠=gJhJiJjJkJlJmJoJ( / /͠=tJde*de*͠=uJvJde*de*Π=wJde*de*Π=xJde*de*Ϡ=yJzJ{J|J}J~JJJ 5!*5!*Ϡ=JJJJJJm/--Р=JJJJJJJJ~ee*ee*Ѡ=JJF7!*7!*Ѡ=JJ+:Y1:Y1Ҡ=JJJJJJJJ}-}-Ԡ=JJJJJJJL6+L6+ՠ=JJJJJfe*fe*ՠ=J-9!*9!*֠=JJJJJJJJA/5ߠ=ߠ=JO/0/0֠=Ju7u7נ=JJJJJJJ M6+M6+נ=JJJ]">4>4٠=JJJJJJJJ+ u7 u7ڠ=JJJJJJJJC54C54۠=JJJJJ,u7,u7۠=JJJJJJJJ}IIy7Iy7ޠ=JJJJJJJJ >4>4ޠ=KKKe${.{.ߠ=KKK K K K KKA`/5蠚=蠚=K#j1j1ࠚ=K.\1\1⠚=KKKKKKKK\1\1蠚= K!K"K#K$K%K&K(KS6+S6+=[K\K]K^K_K`KaKcKAH:==KQ*Q*=KQ*Q*=KE^H:^H:=KGm+Gm+=KKKK//=K k2.k2.=KKKKKKKKvQ*Q*=KL]1]1=KKKKKKKKQ*Q*=K(|Jm+Jm+=KKKKKKKKJm+Jm+=KKk2.k2.=KKKKKKKKQ*Q*=KKKQ*Q*=KQ*Q*=KA/5==Kwp0p0=K <:<:=KKK <:<:=KKKz<:<:=KKO Q1Q1=KKKe#<:<:=KKKKKKKK@//=KA o:==KU::=KKKKL Y/ Y/=LH:H:=LLLLLLX +o:+o:=L L L 4141= L L Lmƀ:ƀ:=LLLLL2222=LLֳ;ֳ;=LLLLL#::::=LLLLLL L"L00=$L!S/!S/=%Ly9A*9A*=&Lv.v.='L 0 0=(LQC:QC:=)L]1]1=*LAH:==+LiH:iH:=,L(M7M7=-L.L/L0L1L2L3L5L$:7+7+ =9L:L;LL?LAL=17+7+ =ILJLKLLLMLNLOLQL8MM7M7=WLXLYLZL[L\L]L_L5M7M7=lLmLnLoLpLqLrLtL+M7M7={L|L}L~LLLLLs7+7+=LA vp:d=d=LhO.RY\n ;\n ;=LLLLLLLLs:s:=LLLLLLL-4-4=LLQ@8@8=LLLLLLLqr*r*=LL</z//z/=LLLLLLLLv<<-<-=LLLLLLLL6r*r*=LLLLLLLh(A*(A*=LL)g6g6 =LLLLLLLL l2.l2."=LLLLLLLL 5151#=LLLLLL00$=LLLګ:ګ:+=LLLMMMMM Y+Y+,=8M9M:M;MM@MA$)A*)A*/=AMBMCMDMEMFMGMIM #P+#P+/=LMMMNMOMr]91r]910=PMQMRMSMTMQ K6/K6/1=UMVMWMXM%*A**A*2=YMZM[M\M]M^M_MaM*A**A*4=bMcMdMeMfMgMD:D:4=hMiMa 115=jMkMlM+A*+A*5=mMnMoMpMqMrM+A*+A*6=sMtMuMvM//<=wMxMyMzM{M|M}MMvc:c:A=MMMMMMMM::A=MMMMJ%_g5_g5B=MMMMMMMM,A*,A*E=MMMMMMMM&k9k9F=MMMMMMMM<z9<z9G=MMMMMMMS7-A*-A*I=MMMMMMMM)+=d:=d:K=MMMMMMMM 200M=NNNNNN N Ny=/=/R=NNNNNNNN22.2.R=1N $8$8S=2N3N4NE<:E<:U=5N6N7N8N9N:N;N88V=N?N@NAN#&:&:W=BNCNDNENFNGNHNJN TW:TW:X=LNMNNNONPNԫ$8$8^=QNRNSNTNUNVNWNYN..^=}N/A*/A*_=~NNu/A*/A*_=N#/A*/A*`=NNNNNNNNXJ0XJ0b=NNNNNNNS&[/&[/d=NNNNNNNNFcg+/g+/i=NNNNNNNNv/A*/A*i=NNNNNN/A*/A*j=NN,.,.j=NNÙݎ:ݎ:p=NNNNNNNN̕y9y9u=NNNNNNNN 4 4v=OOOOO O?[zD1[zD1y=!O"O#O$O%O&O'O)O%5M75M7z=2O3O4O5O6O7O8O:OC--z==O>O}a:a:~=?O@OAOBOCODOEOGOv:v:=`OaObOcOdOeO0A*0A*=fOgO!:!:=iOjOkOlOmOnOoO.)1)1=pOqOrOsOtOuOvOxOpb8pb8=}O~O'#L3L3=OOOOOOOO1d3d3=OOOOOOOO<2:2:=OOOOOOOOP|8|8=OOOOOOOOb1b1=OOOOOOOOP1P1=OOO-c3c3=OOOOOOOO"22=OOOOOlFD1FD1=OOOOOO?+bY2bY2=OOOOOOOOaO".O".=OOOO22=OO22=OOOOOOOgd h9 h9=OOOOOPPPDX.X.=PPPPPPPPb:a2a2=)P*P+P,P-P.P/P1Pa$&1$&1=9P:PPzq2zq2=;PP?P@P3A*3A*=APBPCPDP y9y9=EPFPGPHPIPJPKPMP2.2.=hPiPo,o, =jPkPlPmPnPoP @J1@J1 =pPqPrPsPtPuP?=-=-!=PPPPPPPQ8d81d81&= Q Q Q Q QQQQ܎:܎:+=,Q-Q.Q/Q0Q1Q2Q4Qo2.o2.+=NQH-\/\/-=OQPQQQRQSQTQUQWQ.;1;13=\Q]Q^Q_Q`QaQbQdQy4+y4+4=QQE",E",4=QQ98A*8A*4=Q335=QQQQQQQQdGY5GY5:=QQQQQQQQ /#>/#=wSFB/#B/#=xSySE/#E/#=zS{Sm **=|S}S~SL/#L/#=S09"+9"+=SSSU/#U/#=Sm + 1+ 1=SSSS(`/#`/#=S(n1n1=SSSSSSSST * 1* 1=SSSSAH:==SH:H:=S!"xe*xe*=SSSSSSSS #>2>2=SSSSSSSS"6+6+=SSSSSSSSC6+6+=SSSSSSSS ;y*y*=SSSSSSSSy*y*=TTT T T T TA`X<:== T/_;:_;:=T$H;:H;:=TTTTTTTT>;:>;:=T/;:;:=TTTA`:==TKV9V9=Ti8i8= T!T i8 i8="T.R9R9=#T$T%T&T'T(T)T+TA0===0TV ; ;٥=1T2T3T4T5T6T7T9TA@٥=0=0=TA@٥=+=+=Tb2:2:ޥ=TTTTTTTT/:/:襚=TTTTTTTT\+:+:쥚=U U!U"U#U$U%U'U1":":=8U9U:U;UU@Uv:v:=FUGUHUIUJUKULUNUuv:v:=lUmUnUoUpUqUrUtUTq ;q ; =UUUUUUUUl9 ; ; =UUUUUUUU8y>:>:=VV V V V V VV4}::='V(V)V*V+V,V-V/VpTv:v:=HVIVJVKVLVMVNVPVL)5:5:=_V`VaVbVcVdVeVgV4v ;v ;=kVlVmVnVoVpVqVsVDv:v:$=zV{V|V}V~VVVVn v: v:)=VVVVVVVVhe{v:{v:+=VVVVVVVVw::0=VVVVVVVVA $ ;$ ;0=V6oC6oC6oCV6oC6oC6oCA@===VH6oCC:=V 6oC &1=V saCaCaCVVV\mu=}u=}u=V...bin(etc*lib9mdec>tmp?admCast include~localmanpreserverunspoolsrc minix usr...MAKEDEVarchbadblockschmodclonecompresscpcpdir df mtools edparams getty grepinstallbootisodirisoinfoisoreadkilllnloginlsminedmkdirmkfsmknodmkswapmvodpartpartitionreadallrepartitionrmrmdirsedsetup shutdown!sleep"sort#stty$sysenv%tarunameuncompress&update'volzcatIDESCRIBEJMJUK[LaalMacdNadd_routeOadduserPadventQanmRaproposLarSnroffTashUasize#!/bin/sh # # MAKEDEV 3.1 - Make special devices. Author: Kees J. Bot case $1 in -n) e=echo; shift ;; # Just echo when -n is given. *) e= esac case $#:$1 in 1:std) # Standard devices. set -$- mem fd0 fd1 fd0p0 fd1p0 \ c0d0 c0d0p0 c0d0p0s0 c0d1 c0d1p0 c0d1p0s0 \ c1d0 c1d0p0 c1d0p0s0 c1d1 c1d1p0 c1d1p0s0 \ tty ttyc1 ttyc2 ttyc3 tty00 tty01 ttyp0 ttyp1 ttyp2 ttyp3 eth ;; 0:|1:-\?) cat >&2 <&2 ex=1 esac done exit $ex    A1$T$Lsu;SSSSu QRPbPUVW} W׋rtVYPVu _^Ujh5hjjaYUDVWE j/0YYu ] 1}U R:-hU zG?]FJA8/& 1 XGME nu$h5YYu ƍPYtjhpj jDYtjPjv t,tjhljU jPjB t)tjhhj! jEPj t)tjhdj jEPj t)tjh`j jEPj t)tjh\j jEPj~ jhXjm 1_^UV5Nx ^U=tuYc{2UW}0OE uG_]1_]U$UUEPjj U VWujhYYEy(=t hFPKYYrhFPu EUuLYU}y VUj FPYYDžt)RjWE hVYYhPYYhPYYƆ$i[PYP%PYYh0PlYY1_^U$UUUUU UEPjj+ U7t. &t`kdVD$aÜX1PXR1ЅUVWtu} u ~tIu(_^]UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVW E_^]U VWE}yA ƀ-]}uA ƀ0Z'~QEǃ}u~$G0A ӈE+UډU 뫡ƀ_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj? ^U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]Ë} 0)ʇʋu }UVuYƋU rU MJwU uRYY^ËKI|;u[u P1ۇtPXP -snrvmpa Usage: La mnpCr(s1v: unable to determine uname values archi3860.32Minixnoname/etc/hostname.fileSSSS  ) I1$T$Lp su;SSSSu@@ QRP@Pz UVjj5 jh5 }uj55 j55 ƃt+Vj}u Ph4j Y^Uj`YB=u <B=h$u BPh@YYj YUjYUVWUfRfUBZÉUJЙ=iUJЙ=UUjj5 UjR5w =tB} u55 5v ^55 5 @} u55\ 54 55\ 5F 9=t'} uphPhxxYYjL Y_^UVjuYY=t1 }, frF1 }\ F^Uju[YYU4VWH \  }|} ~E 0hh j Y}u1thYhYjY YU R`hPYhhPYY=uhPhlh j YjhP5` 5`Y=u5`hLYYjYhD=YhPhd}YYhHhdlYYhDhd[YYjhP5` =uh(hbYYjVYhhdYY=thdhQYYj%Yh hd YYEЅuhdh YYjYjhd6YYhhd}YY=uh YjYuY5`]Y=uh YjYj5` YY=u5`h YYjWYEP5 YY=u5`hxQ YYj%YU؁`t5`hP% YYjYJ th4 Yh YjY=t  @hCYE}=tjh YY1}D=t u uYYǃtWDYE̅u FWY뽃}u=tujY=t0E^jYQhY!E0VMY5 YjY1_^UU9\u\A \M 4YUVW}=t/19}R4aY#  fqF19}#42Y\   Fك=ti B B,i\ B1ҋ \ Q \ Q \ Q hY_^U`A `M UV1F`^UV195`~4VhF F^UV1<tU9tF<t1^UVWuYtuhx YYJI+Mىω U )ډUUBiƋUjj5 jV5 jEP5 E=th`B YjY E1UMUu1uhL YYh$ Y_^UVWJI+Mىω U )ډUUBiƋUjj5 jV5 jEP5 E=thVYj+Y E1UMUnjj5j jV5Y M UjEP5 E=t/hYhYjYuhYY_^UVW=t tJtxSX htYƃt u -t 0|9-uh4YjY10|P9Kk lj0׋tJtxSX htYƃ u뫉_^UVuhxYYtJtxSX htY=tDyt?nt:qt5 tPhd_YY렸.1*#8bh`,Y\^U$hdY5`YhPyY |Et}u1PYUVWu1EetF>+uF >-uEF-0= sk F-0߃}tډ_^UV5hNx ` ^U=ltluLYUVW11}U9u F߃| jugYtUr YtURtUzt rY}tt}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvQ =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv3 EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E ?U :t! EE E U uuuYYEy@Ut8huYYE~" tu{Yuu;YYE}y1]jYEu uFY1A!uEUMJUzUBUE_^UUUuuu 0 UU Uhuu g'W77WUV8U98wU898v  16VYt1'8rF58&Y58^UVW}u1E}UUs  1=4u8jlY=u1V!փ5458FE5<OVU}9}r69v2W9UvUW~>}t E<u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<<9}r79}u+UOJ}t E<URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15<t 9ur6E0tU U<tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuEYYDžt~~yVډ F_^U$UUEPjj U$U UEPuYYEPjju U$UUEPjjW U$U UEPuHYYEPjj) U$UUU UEPjj U$EPjj yEU$UUU UUUEPjj yEU$uNYEU UUUEPj'jl U VWEu>tFN>Xu E0EEF>t&azjuVYYyEG߸_^U$u YEu YEUUUUU UEPjj U(VuU @t*uJ YEU UV֋RUUUEPul YYU UEPjjG ^U$UUUUU UEPjj U$EPu YYEPj(j U$u YEUUU UEPjj U$EPj$j U$EPu YYEPjj{ U$EPur YYEPj jS U$UUUUU UEPjj' UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE> uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U8M EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Uhm JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjubdefghPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE]E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }l~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVW}u M+^UUas U EUh hYYjbYUVuYƋU rU MJwU uRYY^U$U UEPuYYEPj!j U$EPjju U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVW=E_^]U$UUU UUUEPj6js } 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇtPXPwritereadBad %s in get_super() (should be %u is %d) Bad magic number in super_block (0x%x) writereadBad %s in get_inode() kk All these blocks ok (y:Device will change) Give up to %d bad block numbers separated by spaces This program can not handle it Block_size != zone_size.Device "%s" is not a block_special. fstat on device %s failed Can not open device %s Can not umount device anymore??? What? Second call from stat failed Cannot create file %s wFile %s already exists Could not mount device anymore /Could not umount device %s. %s is already used in system Set_uid bit must be on or you must become super_user Sorry, not in superuser mode Usage: %s block_special [up_to_7_blocks] Block[%d] = %lu This zone (block) is marked in bitmap Bad number %lu. Read error in bitmap Duplicate block (%lu) given Bit map indicates that block %lu is in use. Not marked. Check file system Bad write in zone map Read error in bitmap Block numbers must be positive  n q y Bad character %c %s# # arw&+b/ @Xbdiopux #+-0 LhlEe GP Xbc7 dee fe gP inopr suux(null)cannot print floating point D.Bad_XXXXXX/tmpXXXXXX ((((( AAAAAABBBBBB SSSSBt   H1$T$Lsu;SSSSu QRPPU VuU fU>GfE>j>auUfUL>uuU fU1>guU8fU>ouUfUF덀>t>,u>>,uFE fE>f>uu@UfUUM U M сfMF!>gu=U8fUUM U M сfMF>ou=UfUUM U M сfMF>ruU$fU>wuUʒfU>xuUIfU>suU fUd>Xu.U @t U ItDUIfU1>tUfUUfUFOUtUM!сfMfEUtUM!M сfMM!U ʁfUUt!UM!M!сfMU  U!ʁfU^E$>FE^UVWu }EOt"hH6YYuO JWZu{hD6YYuJWZuYuC=0=7f=0|3=7)% f뽋:tfjYfJWZtPYtE܋E_^U VW}hWYYtWY5=u ffU P5YYfEEPWYYtWrY  @=WYEuW!Y(t Wh(YYh(h(YZ/FuYEtCx.uUztUz.u UztϋURVYYh(Y u)YN_^UhLJYjYUV5 Nx (^U=tuYUVu>tF+URuj ^UVW5YNj5Ph4 YhLY}t.U:t&uYPuV jhpV WYPWV jhlV~ _^7UVWE_^]UVux95t^U$UUEPjj U$U UEPuYYEPjj U}u UEuLYuYU0VWEPuYYy1U؁@t1huG YYDžy1EPWYYxSU؁@u7jWHYYEx& PjW1 xh$kYƅuUWYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uJYEUUU UEPjj\ U$UUEPj}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U$UUU UEPjj U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu\YYU UEPjj ^U$UUUUU UEPjjW USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u PO1ۇtPXP+-=+ -X=---RUsage: chmod [-R] mode file... : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0SSSSB4LUnknown errorx\H4$|l\L8$p\@,hL8(C  > X1$T$L su;SSSSuT T QRP.PF U=u =d u25 T#YPu5hh 'X UuYjYU5 #YPu u5hh &X UVuu u 3 Y u V4!YYƅu h Y^U}t u"YUVuVRjYY1j6VYZ^UVW}u (YGE9GsEUWu7OYYw97s ~/t/FU :t:/u 97t~/tU FE +W_^UEU Mj0QYZUVu>/uF>tu>t>/tFE^UVh y"Yh n"Y J x  SX h #Y= t˃ytYu1Et5 t0 J x  SX h #YƋE^UVu=t =u:F9uV F 9u V V^UVW} uKs7t VY= t 5 .%Y 1UJ@tUB= 1UB1<7UJV9jv5 $ =u1|hh 5 $ y1YU 9u9h u %YYuVY 1 N= uBjG#YEhhuQ$ y= t1uu$Yu P%YE=r 1Uff u h $YYEjj5 # E=u1Vuh 5 $ 9Et17j Yƅu1%UfRfVUV7 1_^UVW} =u= t1YWuqYYƅu1DUJtWi#YWV"YY1ۅÉ]t=x tWVh,! E_^UVWu} UJu_Vt#fV=\ = V#fV=` u=uG=d u>u"Yu1UJQWhh Ou1=u"WO"YyA= t8WGY1=\ u!UfRfVUfRfVUfR fV uVWuIt bju!YYyuY1<VRhAWg! y>=d t5= u,UJɀQW YYjhAW%! y/=d t&= uWC!YjhAW yW)Yq Y1uk YYy&WYC Y7 Y1FhP ~D ~ +볃ruW5hh v WlYBy(u YTYHY1W5Y)Y=\ u = UJUB^9uUB ^ 9ljWYYuUJUfJF ^PSW y= t$W5Y1UfNfJUfN fJ = tGUJu2UB^9uUB ^ 9tVfVUJuPUNZ9tAFPWYYy0= tWY1W5hph =\ u = UJn=uFjYVPWYYy6= t WY1R=\ tW5hPh =x t"Wu=uD8P _^UVWu} UJV9u7U9u*u5hhh X UJt+UJ@u W Y}Vt= tM=t uDuVWuA=4uY#uYUJv=` u=uD=d u;uYu.UJQWhLh W%Yy W&YUfB=\ u= tV#fVEuVWutEEVu9FPWBYYE=x }Wh0YYV`tV oF PFPW E=x {}q^ N VPP`ubcPWhN/FPu5hh X +}xuWYYy WY =u"utYyusYW`Y}=\ u = uJUB^9uUB ^ 9t,F ^PSWh y= t WYy=\ u = c=uFjYVPWYYy+= t WYW5hh _^UVu=` u=d u7u Yu*U JQVhh t*V!Yy V"Y=x t VhsYY^UVWu UJ=` u =d UMYJ9u7=d u5h8h X =` t Vh,h  C UJ@t V0Yy V1YI=h v=l t = `VuYYy.=l t = tVu=YY #=x Vuh  =t u=l u &VY>/u,U:/t$Vu5hh jYEP*YU:/t3?t,?t?/tG?/uG?thEPYYuEPYY &VYuY_^UVW} uYEu1uxYƅgh\FPCYYthXFP/YYtjjYYFPCYPjYYBFPrYY?uY_^UVE0EvYVY^U}t EPYUTVWu }fEfE=u=h t =t t0EP7= t0)0)YYy 7Y}u f fUf =t9EP6= t0)0)YYy= t 6+Y=U= HUtE]9t %=p tUtU@UM9u)75hPh X Uf=` u=d u:EPYu,UR6h4h U@t6Y67YYu#=x v67h(X `= u  67)YY;Uڅ\U܁@UDEPEP67EP7YYEPEP67]`X(=t u 72Y=uF=| t ]9=` t!7hh 5 UEP7YYu 7Y7=UU@=t =d u 6mY=` t+6hh  uu2Y6 Yy6 YuYfE=U=\ u= tU#fUU܁R6NYYxEP6YYy6YuY=x l6hYYY=u)=p u  6JYu:Y=\ ufUfUfUfUfUfUUЉU ufUf fUf  M9uOE 9u@67=tP5hh uY =| t ]9tunYWUVU}tVUrWbYY=tUrVKYYUBRVW< uWYYuVYYEPY뤃=t =p=u*=` t!7hh  67Yy= '7Y=x t7h YY==\ u = uFE]9u E]9t.E]PS6 y= t 6"YUM9tEP6HYYy 6YiU9U]=uEjYEUUEP6YYy-= t 6Y65h|h _^UVWO8,R$Fhh YYjY!11p+#W5hh Q tV5hh 4 j#Y_^UHVW} 7{YhT5]YYu*EH qhD5YYu1E<\ t *h85 YYu E0h,5 YYu E h5j YYu>E \ p t  jh5 YYu4Ed p t 5hh g jVY n jo Yj YУ9ur:-dBWVZYU:-u zCU:tPu YY\ ` =ud d =u` 뎃=uh v gl Xp I t 0x !| EED9uuLEU)u=uUAMU)}[EP*YEP Y==p UJEP4 YYU܁@|UJ4EPYYUĉU4EPYY4kYPEPYYjEPEP jEP&YYuEPYYFUJ9|xwyz{|}~=tU)\4EP_YY=tB4EPCYYjEPEP1 jEPYY=u F9uwuYuY5X Y_^UV5 Nx ^U= t uYUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95t Xh ^U$T 9Ut*UUEPjjd y UT 1UVW5T T }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv> =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hOYF~uN NF 1}9< t, R@t Bt 4 }YGƒ~uFFF VVv vv >uNN FFSX_^UUUuuu | UU Uh uuZ U=P uGh8 h8 1YZУP j5P j PP P .P L BL v L jj5P j 5L Z}th8 uYY8 /c7gC7[C3SUSE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]U$UUEPjj U$U UEPu$YYEPjj U$uYEU UUUUUEPjj U$UUEPjj U}u UEu8YuYU$UUU UEPjj5 U$EPj/j yEU$EPjj yEU$EPjj U$EPuJYY1ۅÉU$uJYEu 9YEUUU UEPj j_ U$UUU UUUEPjj3 yEU$uYEU UUUEPj'j U U jRu U$uvYEU UUUUUEEPjj U(VuU @t*u&YEU UV֋RUUUEPudYYU UEPjj+ ^U0VWEPutYYy1U؁@t 1huKYYDžy1EPWfYYxS U؁@u7jWYYEx& PjW xh$'Yƅu UWYUЉ 1FfFF_^U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP| GWBVVFWB)ډfFWBV4_^U$uYEu YEUUU UEPj&j U$EPu YYEPj(j U$uFYEUUU UEPjjl Uu hT$u U$EPj j9 y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U [ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UP JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEp E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } &&~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvJ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv; =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh h YYjYUVuYƋU rU MJwU uR=YY^U(VuEEV֋RUV֋RU ( E KUUU UEPj7jF ^U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u Pw1ۇ| tPXP%s: %s: %s %s %s %s: %s malloc()ln %s %s mv %s %s cp %s %s %s: Can't set the time of %s %s: Can't change the mode of %s %s: Warning: EOF writing to %s Overwrite %s? (mode = %03o) %s: Can't set the time of %s %s: %s: odd filetype %5o (not copied) mknod %s %c %d %d mkfifo %s ln -s %s %s Replace %s? (mode = %03o) %s: can't copy %s onto itself rm %s Remove %s? (mode = %03o) ln -s %s %s ..%s: Symlinking %s to %s can't be made to work, too difficult ln -s %s %s ln -s %s %s ln %s %s Remove %s? %s: Can't link %s onto itself ...%s: Can't set the time of %s rmdir %s Remove directory %s? -r%s%s %s/ %s/: infinite recursion avoided mkdir %s Replace %s? Remove contents of %s? mv %s %s Replace %s? (mode = %03o) %s: Can't move %s onto itself 5 %s [-%s] file ... dir Usage: %s [-%s] file1 file2 ifsSvxifvxifsSrRvxifsSmrRvxUsage: rm [-ifrRvx] file ... ifsvxifsmvxpifsrRvxpifsmrRvx RtSLfim[prjs%vx.%s: Identity crisis, not called cp, mv, rm, ln, cpdir, or clone ifsSmrRvxclonepifsmrRvxcpdirifsSmrRvxlnifrRvxrmifsmvxmvpifsmrRvxcpunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 01 1@12X2b2d2i2o2p2u2x23 3#3+3-3036L4h4l44E]6GH6X5b5c/6d5e]6f]6gH6i5n5o5p5r6sm5u5x5(null)cannot print floating point >=>=>====SSSSB /tmp/tmp.XUnknown error h \ @ ,   t`P@0pdT@$X X X X X X X X X X pdL0 |hC  6 p\1$T$L su;SSSSu  QRPT !PUhhP #YYUVW} EjjYY =thjYYh j YYh$6?Yd uh|hP ?#YYjYhYh uhdhP #YYjRYURYƉEEj/7&YYEtEUhXu&YYu  'hPuq&YYu  M}":-:  E   롋:u+Mt?uh<hP !YY"j$Y7Y d I :Ph$hP ! jY83M= }  = ~    E8u>v = h RR$YZƒR$YYt"6EP$YYhEPq$YYUh h61! u 6 #Y|=  J x4 4 SX h UYh 9u< J x4 4  h Yd 9t%dh6hhP  J x4 4 SX h Y % %   = ~!j5 6hhP gR6hp /#YYjhp 6?#Y-ZY ehRR #YZƒR"YYu6hhP  h h6{ u 6U!YlP6"YY|l  =l }  ^=l }  )#F=l @}  ]F.=l }  ψ=l }  e6hp "YYj/hp )"YYEtEEp u!Y= vuhdhP  h`hp !YY}= lPhp YYƅbnhp hLhP  'jh@ YYhhp hhP H hP YjbPh^ c t&jcPh> yhqYh YbythhP YY= uHh8 hhp @ uhp Y= u6hhP { = u= uMhp 6C YY= t = u-P JP xd d hP j YY= uGn= XP JP xd d 6hP j 8YY#=  J x4 4 SX h Y 9u7 J x4 4 SX h JY 9thhP +YYjkY J x4 4 SX h Y % %   l = ~"j5 hhP j Y _^UVW1= 8 J8 xL  SL Zh8  PYY8 J8 xL  SL Zh8  PzYY8 J8 x$  L L !  h8 P&YY@ tj       ' \ ѺJ` = t  J x4 4 SX h YE U}}Ee+UU UR Y J x4 4 SX h YE= EMU1֋d 9uh  r뎋d <xLU)UuE+Uօyud M9 uh  rBd <WY } 9 }0 A h fqd M  9 = WkY j]Y= u7= u.hhP <YY + RQhP l  9 ~  _^UVW U=\ }΃eE !ӋMU ! ڈF+U)ډ׺+UыUU| F}tU\  \ 9 uQ =\ = 8 J8 xFL L Fh8 PYYOu ` 9  =  = ~3h8 5\ jh 9\ t\   = t* \ ѺJ`  \  9\ u ` \ J` l= ~# h8 Rjh  Й  h8 5Y@ t_^UVW \ ѺJ` xh fr d N= t EE}8 J8 xL L Eh8 PYY@ t=d FƅuG= t>xh frN  =u95  UGu|d  Gh  r݋d  MG8 J8 xOL SL ZOh8 PYYd 9r5 95 ~(#U h fqU d B UUh8  Y@ t_^U VW =   9 }` 9 ` 9 ~6\  9\ u `  \ J` = ~% \ ѺJ`  h 5\ jh      \ I)ى = \ U΃FU)+UډU)׃}|F UmE !ʉ U\  E_^Uhp Yhp ^YjWYU,VWu }h8 O Y5< YEPWYYt WLYuUt<= tWh8hP  hhP YY E=~C= tWh hP X EHPhhP @  = u,= u#= hhP YY UURVYYtVKYE]PSV UUԋUU؍EPVYY= uE= uVhhP  'VhhP l VYtVY_^U= t1jbYt1UjjYYhp ZYjSYUjj wYY= uh@hP YYhp YjYUV'  = ~" օu  Й= 95 }5 5 5 #Y  h.Y^UVWU d οUU~~ĉ~ȉ~̉~Љ~ԉ~؉~܉~~~~~~~~myǃE}~ >M_^UVW}} F~'EE iE '}ƅyJx GG- Wj- YY޹dj%RPh\W> _^UhhP % YYh|hP  YYhthP  YYjhhhP UVuj jV ^UV5 Nx  ^U= t uYUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVu~  u 6EPVYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuA YYDžt~~yVډ F_^U$UUU UUUEl'EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UVWuEu41}%uNN FFSX_^UVW}Wu u, ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~8 u>5< 0Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UVW}EEL#WUWYw!Y*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu|YY=u}t UډE1!,'"UHEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UxJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE(UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP\YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh hP YYjYUVupYƋU rU MJwU uR%YY^U$UUU UUUEPj6jO U$} uEEUUE UEPjJj y}tUEEËKI|;u[u P1ۇ tPXPUsage: compress [-dfvcV] [-b maxbits] [file ...] j CFVbcLdfnq[vstdin: compressed with %d bits, can only handle %d bits stdin: not in compressed format %s: w not overwritten stderr do you wish to overwrite %s (y or n)? /dev/tty%s already exists;.Z%s: filename too long to tack on .Z r%s: already has .Z suffix -- no change .Z%s: compressed with %d bits, can only handle %d bits %s: not in compressed format %x %x r.Z.ZUnknown flag: '%c'; Missing maxbits zcatuncompressCan't allocate codetab Can't allocate htab Compression: -- decompressed to %s -- compressed to %s -- file unchanged -- has %d other links: unchanged%s: -- not a regular file: unchanged%s: uncompress: corrupt input %d.%02d%cBITS = %d MINIX, Options: compress 4.1 %a$r$w$W%+7%b-% : unknown error, ),@^,-Xk-bP-db-ib-oY-pk-ub-xk-[. L.#Q.+G.-B.0V.M1L5/h/l*/S/E0G0X?0b?0c0d}0e0f0g0i}0n/o?0p?0r-1s/u?0x?0(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point X   '?SSSSB 8 P \ ((((( AAAAAABBBBBB Unknown error t X H 0 $  |pXH<(p`H8, hL8,hXD0C  (L V1$T$Ll L su;SSSSu0 0 QRPp)P Uhh 2YYjn YUVWu }ElE}V:-qUU:VAD L H ΃}oVUO^뱋EE,&OzjYxzf|_f\BuY=H t5=L tP=D u(PYY"=D uTPhYYu%@ U}t?uY EEUE9}}U4YPY EEuY_^U<VW@ h| YyjYPPPXP XhxuYYu0htPYYt2hpPYYt댍PuYYsEPXPYYYU܁`Cj|YƅyXPnYPYYFtYPNYP9YF t9fUfVXPvYYPv YY7_^U(VWUTXEPu:YYy LU`uEEfP5@ tFP9u6U`u LhYE؅u L|uYDžt_.tGPhU YYEPhP yYYxU`uP]9uTP XuYL_^U\VW}W :u |PYW :u PYjwYYEy,5p YPwhh aTjhu] jDEPud =Dt(whh  uYjhu  uF=t3F=h$t(whlh  uYF=uVVBFuRP E=u(whLh l u9YVMVJ+VFuRP? E=u(wh,h  uYVJUF VUF UUwh(YYwYE=~>=xt5 J x   h j  YYE}}2 J x  h j YYEȃ=H uJ=D uAJkEd1k]dUJw P1uU+UPuRuh =H M=D tDkEdUJ‰1uJk]dw P1+UPuRPhL =H tG=D u>=L ueekEdUJ‰1uU+Uw PRuuh =H t9=D t0JkEd1+Uw PRuPh u Y1_^UVW=M t;}.E}}}tEL @EEEU9U} hhL u =t EL } rELm BU ׉L E+U ډU M J!L ]E U9UtEEL EE;E_^UV5d Nx ^U=h th ul YUV`U9`wU`9`vp 16VYt1'`rF5`&Y5`^UVW}u1E}UUsp 1=\u8jY=u1V!փ5\5`FE5dOVU}9}r69v2W9UvUW~>}t Edu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=d<9}r79}u+UOJ}t EdURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15dt 9ur6E0tU UdtU9ru NJEtU9Wu RWE_^UVux95< 0 ^U$UUEPjjG y U 1UVW5  }׃}~9r }y 9vWYu_^UVWj5t YYDžyhu^YYhhhW Ehu+YYU}u'uAYh6Y5t *Y%W Yh>t tF1_^UVh5t YYƅyh$uYY?| -lPhlV2 EhugYY VY1^U=x hrU25x uMYYx - =_sx x :u=x hsx 5x u YYx - =_sx x :u=x hsx 5x uYYx - =_sx x :u=x hsx 5x uiYYx - =_sx x :u=x hsx 1UVWu7YEu +YEuYuYƋ| UUlr u5| YYU| | |  u 5| YYU| | |  u5| nYY| | |  u5| GYY| | |  1_^Uu%Yu Y5t Yh8QYUVu>tF+URuje ^UVWuU VVuuYYDžt~~yVډp F_^UVW}Wu uD ƅ~9})׉U U 1_^UVWu }h %~y UVu CV€tu ,fNV~ u>5 0Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu  UVW5p HYNj5 h Yh Y}t.U:t&uYPuV( jh@V WcYPWV jh<V _^UU Uh uu '?W 7g;USE] ![]USE] ![]USE] ![]UVW}u MgUVWE_^]U$UUEPjj U$UUEPjj U}up UEuYuYU$U UEPuYYEPjj] U$EPj/jE yEU$EPjj yEU$EPj/j U$EPjj U$EPu:YY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uFYEU UV֋RUUUEPu<YYU UEPjj ^U0VWEPuDYYy1U؁@tp 1huKYYDžy1EPWRYYxSp U؁@u7jW YYEx& PjW xh$7Yƅup UWZYUЉp 1FfFF_^U$UUUUU UEPjj UVWuup 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$EEEPj.j U$UUEPjj U$uYEUUU UEPjj Uu hT$u= U$UUUUU UEPjj? UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U g }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VudYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U,JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEELE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPDYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuhYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv. =u N /uvvO EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh YYj:YUVuYƋU rU MJwU uRYY^U(VuEEV֋RUV֋RU  E oUUU UEPj7jV ^U$UUU UEPjj1 U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇD tPXPUsage: df [-ikP] [-t type] [device]... PiktFilesystem Files free used % BUsed% Mounted onFilesystem 1k-Blocks free used % FUsed% Mounted on%s Filesystem Inodes IUsed IFree %%IUsed Mounted on Filesystem %4d-blocks Used Available Capacity Mounted on dev21devdf???/dev %7ld %7ld %7ld %4d%% %s %7ld %7ld %7ld %4d%% %s %7ld %7ld %7ld %3d%% %3d%% %s %7ld %7ld %7ld %3d%% %3d%% %s %sdf: Can't find bit maps of %s df: Can't find bit maps of %s df: %s: Not a valid file system df: Can't read super block of %s df: %s: %s unknown error/etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0! @Xbdiopux #+-0 LhlE Gp XbcW d e f gp i n?opr sux(null)cannot print floating point %'&%'&%'& ' ' 't/etc/mtab/dev/SSSShlB  ((((( AAAAAABBBBBB Unknown errorl\D8l\P<, t\L@0 |`L@( |lXDC  q\Z Xhp71$T$LhW\Zsu;SSSSuCC QRPg1P-UVWu} VVV_^UU MQU MU}tU 9Ut1UVWu~t~u1lV(+V$N,N$^4^$RQSvVHNjV(+V$9t)y h TYhhW/SYYFF(F$1_^UVu~ uhHhWRYYVQYyNE 1+U ډV,F01^UVWu}U 9V,wM EUU1FUVUV1^UVWu} VVV_^UU MQU MU}tU 9Ut1Uu%YUVu +U щM Ӊ^U VW11U:t=jVYYƋUP>6YEUMэO11΃GE뻍V։ֺ! 1ֺ!1։_^UVW E 1ѺUU 1׃}t UM# U֋M _^UUuu R tSuj u YYUP Rg t-uju YYUP RA t1Uju YPuv UVWu }W9Vu"VW~t vWYYv WYY_^Uju SYPu EUEztRrhXHYYUVWu} yu hdhWmF j YU 9V?BR6p"YYu$~U B9~ GU BV1_^UVW} yWhthWE jYu#Yƃ>h  Yu1BjRYY:u6Y1nBQhj RJ hj RJ hj RI BW6YYy1_^UVW} 9}}uWhhWEjY9}E4uGVU9U}UU}}U9U}EUEU9Vu~T9~uUVGhhWDYYuWhhWmDvvhhWUDjYV9Vu%~t vY~ t v YV|Y}_^UVWuutYYy1Zj4Yƅu1EUFF U VUVuu u } 9}~ E4G_^UVWU 9U} uu hhWqCjYjuu uEEu1gUM JUMJ}tu/YUBu YUB u}E }~ MGFuuYYE_^U VW} LEU Ju1t-?u(VUU9V~ EYju=Y}j=Yj=Yu=Yu=YUER0=YYj<Yu=Y=EPVuu u'> j u=YYEPM>Yy^UVWu }hCP)VƆu1?u h|W%YYuhWV{? wWhthP <hVP Eyhd;Yj"Y}t UJhWV> _^UVWu} VVV_^UU MQU MU}tU 9Ut1UVuURuV<YYV Pu R^UUURuuy<YYUPu r-UVuURuVG<YYV Pu RQ^UUURuu<YYUPu r$-UVWUB UJ8Mj uBYYƅu1/19}~&k k @k @GՉ_^UUR89U rU E E 1E1UVWuVdUN<1UV8V4U E1 ڋM MkE FLRQURV=Džy1J9~v9U UkE FL]jRSV79~v1 _^UVWu}VdN<1ׅt ~huF,V8V4UU kE FLMNjRQV _^UVWuEPEPu Vy1kE FL8uFVRHYk] ^Lk] ^L;u1`VkE FLRh0: kE FLMPEEU9V<~6uuuu V/EuuhhW5 Eƒ}u1EU9U}&kE FLNjUUѺ E҃}u}uU juRV}u3=Ht*E}}U UjuRVE݃}u#kE FLNjM F0kE FLU_^U VWuU U19uU9|u3juuV      !"#$%&'Džu1(UUU #U_^UVju up ƅu^UVWkE EPuYYǺURuYYƃ} rxx UR\B9U vu hhW3 +U t! щ! _^UVWkE Ejuu NjUBjRu ƋU t M шUUM ш_^UVU jRu0 Vщ^UU jRu E#URuxYYUU jRu ESXUU jRu E#UfUVU jRu VNVˉ^UU jRuI EuuYYUU jRu E]UU jRu EUEU$VWu~0$Vu~u ~u1U J9t"U J|>t>uU zu }%U BPPhhW+&~u~thhWw+YY1_^UVWuU J'U Z&U J%U B$؉F8U J(1ۅÉ^hU J(NdU J/U Z.U J-U B,؉FlV<V8V4VXVUU J1U Z0ˉ^p~~p~puqYjvpWV9FWOWˁRRaAˁrrAau\ˉ^xˉ^tWYVYuu V u VYt1_^UVuFhFdV<V8V4VPVTVXFp}tF<uu V t?~\~(V Y=LDtv^UuY@UuY`UuY,UVWuVUFthhW!YYFtvhhW! UMRQUV1uEUV1uE+EDžy1+VRu$YYEt~1_^UVWu} >t-9>s)EU9uuW6hhW&!9w >UE1_^UUMuhRu dQUVWu E1҉׉UUU9rDr7t2t.EVu!YYGVEPWEP4yȾE_^UuYEEu u~YYUVuYEu V\YYFF^UVWuYEp uh`("YEE1҉׉U}uW9t7}u9}t WhX!YYhT!YuVhL!YYGEUVrYYEVuu} yUR9rDr u}u9}t WhDl!YYh@`!Y_^U$VWu}VU܋EU܋M܋RQUE 1uU}uV+U V+U 9vV+U ?u1~ }t?u 1jv/YYE=ulWv\V5g7 UV \PV5g Ur@uvb E 1uE9F(wV(UV$U EV UU1uEUU9UU9Uu V(UV$uv\YYE=t}u uuhhWjTYUU9UU܋M9JDsB}uYYV]Y1_^UVWuu RY9~s9~s ~VY1_^UUz tB uYt1UVuVY3F^UUURYUVW}u V9WuWYPVYZ9t1_^U=hDu(hgjh<h<h;whDUxVW}uYEF} DžLD} u tGu Dž5 Dž=8U EU UjPP5gu@NWhl'Yu1;ǂ`BBW,RL2u R,r,YLDr} u tGuB5 B=8} uB M J ǂdǂhB(MJBB \R5g$ _^U<VWh0jPE uYDžƅPjjVjhItVuYYuYNjWTWPVuUPY_^U VWuFP68YYDžuFt 6YmFtW6oYYE"V'N&V%^$ˉ]VuW6EFtEPYu juYYE_^UuYE1ہx=8uCUVWu} VVV_^UU MQU MU}tU 9Ut1UVWu1}U = ~ U  GFߋU= ~'.F1}U= ~ U GFFE_^UVWu}E>9uw }}u> t>.ut U  %= }U _as6PYU ];u=PCuYEKAs(U  E8u=PCu#Et U M U  ME F_^UVWuu<YEP薇YEj\uYYEtEj j u UB huYYDžtUUj.uYYEVEPujuuM}tUMVEPjjRQ(t ju#YY>u*}u}u}t}u =PCuE_^UVW}juEP Ej EP%YYEtEu=DCt E EEt$1}|5tD5PYD5Fju EPf Ej EPYYEtEt$1}|5tD5PaYD5Fހ}t'EPWYYhWQYYEPWEYY EPWYY_^UVWu 19}~9FE8t VU U:u E@EG‹E_^UVWu} VVV_^UU MQU MU}tU 9Ut1U@VW} uhhWjYYi1E h@WPu ƅyhY5t/uVjP4uhY1_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVWuu%YE9FthhWcYYjY~uhhWDYYjYFV uvu REyOE19}~5U : t(U :t!U  UC]U F G~UVE_^UVWuuTY~u 9Vth@hWy YYjY~uh hWZ YYjYF1҉׉UhU9U\U U: u+Bj PWZYZBj PWZYZE벋UAMU APPWZYZ댋UVWvPvE~F9}tFE_^UVuE~ujvEPva1^UVj$kYƅu1'lD1҉VVVUVFF ^UVWu} VVV_^UU MQU MU}tU 9Ut1UVWu} VVV_^UU MQU MU}tU 9Ut1UVW1}t;uuu uUƅ tuU)UU U 뿉_^UEruuu uUE2uuu uvUVWu} VVV_^UU MQU MU}tU 9Ut1UVW}1Etv^U|VWu5\ZYV Y PFwY\Zh85\Z YY-A=s~u \ZJ0j/V" YYu\ZVR\ YYV5\ZL YYP5\ZYY=tDhjPl \ZDžDž=gDž4Vh8P ?4PYVwYYdWuOu7YYDž44u&u jj8Pu uWu/ 44UrEtuRYPYF`^U} ~u uYY=t U EP|1UVWu} VVV_^UU MQU MU}tU 9Ut1U$E҅UthhW7YYjYEUUUU Uuu u 1UV1}9UuF^UVWu} VVV_^UU MQU MU}tU 9Ut1UEPYY] PSMYZ19uCUE] 19uAU VWu:^uDž Dž1} Ƅ=G:]|:u1Bz-Pf:]u fDžf9~Ƅ=GƄy}t U MU t3}Yu U SPYZ€:t'}tU PYU3IU SPYZ€:t'}tU PYU3_^UVWu}U :}?u1FU :*u}tE M?tuuuVu Wt tFGE MFuPWE PuK1eE MU PPUYYu1?tU FU  E MGt?t1_^UV}tXXVuuuu u^UVWu} VVV_^UU MQU MU}tU 9Ut1Uu uZYYU(VWu }F(F,~0n\VqjjjjjWjj貮 F(~(uWYhV( jEPjjRQ}t$F(P躹YVu16Wu肾YYF(}t VjVYYEVV YEF(P{YE_^UU:u6h, uYYuh( uYYu1UEtu Yt1U}th0 uYYt1UVWu }E=Gt t[Lu,YGG W蛸Y1GP芸YhH hWYY004 G UV,UBt&FtuYF(EVuVYYE#VtuYF(EVuVYYEEPYv/uFŀ>u}t uEjh` V8 th\ VYYu,}t&w(iYW(uuFPWT1}j/VMYYEuVYUUEU)E}Gt1wuuWw(YPE hT VYYu"uWw(oYP9YP W}tAUrUMI J~ u軴Yw(蝴Y]E@ DžDžDžDžw(PcYY =G w$w RVPUPYYuDž}t=PgYG(uuuW< P赳Y5uWP wMU U~tUuG=F4P莯YUt%Ut tUt1_^UVu }t VuVYYVV Y^UVuFHPv^YFF<F4F8FqgF 1҉V$V F(F^UUz,tR,B( Ur0aYUU z,tjr,u U r@h u UUz<tB< uYU(VW}WYEw8JYPu;YZPYƅu1_w8VYYU:tJ<u,4u&EPVfYYuU܁@th$ VSYYuVHYY_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVW}U rtVO! ЈGW\Y_^UVuF tFuF uFtFu Fvh< YF tFt h8 YF uFu h4 qYFt h0 `YFt h, OYjVhW h( 4Y^UVuhX YF t/WJWxWWA=hWjAYY-WJWxWW hWj YYhWhT YYFt/WJWxWWS=hWjSUYY-WJWxWW hWj &YYFt/WJWxWWH=hWjHYY-WJWxWW hWj YYFt/WJWxWWR=hWjRYY-WJWxWW hWj bYYhL vYjVhW hH [Y^UVuU RUF t-WJWxWWAhWjAYYFt-WJWxWWDhWjDYYFt-WJWxWWShWjSYYFt-WJWxWWHhWjHUYYFt-WJWxWWRhWjR"YYUt=WJWxWW hWj YYjVhW衪 WJWxWW hWj YY^UVu VuVYYh\ Vv( ^U5G5Gh hW_5gh` hWG jYU# 1*#uY WUVW} ƅ$ƅ%EEDž DžDžh Wu- =tYGNY%!ˆ%DžEDž뙻@ U9tW`tW4F>cPY$ È$FۋtW4F>t6PY%!ˆ%F݋tWh tWi%u$u Dž U9tW|(PY {tGDž0lU+tW!}utWh 4YYt1Et Dž0i Dž0EjDž<Dž0biDž<}t Dž,m$8Dž@0}t @U+tW tWRQ(Pc PY_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVW}uU rVYU 9Bu=5G5Gh hWE 0h hW jNY PYU jjrVYYPYYu] 3h hW` jYYƋVVURNYEuP蝤Y;Rj迻Y19~X_vWVYYV PuRyh sYj|YV9sh hWYYjXYG똋VVUV\9n=GaWVV$YYuSVVXUuuV1YYPuvd9E~Wh VYYhWVe G낍P茣Yj賺Y_^UVWu} VVV_^UU MQU MU}tU 9Ut1U5G5Ghh hWhL hWrYYh$ hWaYYjYUGVW1ƅcDž\G}}U R:-uU Rzwtdƅc\U+\E\M 4SY\M 9u \M j4SYYEPh P Dž5g>PYuvYYjVEP_P6YYDžu/cjjjSPPVEP2 uDc~u.PPYPh hW j^Yc{hWh>jhP;X=>u$ h>WhPRQǀ>봃X XWhPRQp h>WhPRX=>u#hWh>jhP ǀ>뵃XthWXjhPP*YjQY_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVh hNYƅuh hWYY'juVѠ h VYYVY$^U}~=5G5Gh hWE 0h hW jEY0PYDžHDž4w}uxPh YYjYU jR0P- PYUVWu} VVV_^UU MQU MU}tU 9Ut1U}t3h uYYt } tU UU UEPuYYUVWU zR(UEjjjEPuRuE$tt u MYƅuRK$W$}jVYYkjVhL ޣ tV YEPVYYu6UЁt$Vh0 hW VǷYU$u7 t1h$ hWsYYu hWYYh hWSYY=GtVpYjjjxPhAVjjK EE}t&t uYYPYEuE u9YE}uuuYYEȍEP)YEPY}y$uVYV蹶YJ$uuVYYV蚶Y+xPh hWN $uVmY_^U huYYu1G=lWu9EPuYYy%U@u1lWUHVWU zR(U?uU zDt1SEjjjEPuRuE$u: t4h hWcYYjuhW h hW@YY=Gt u 0Yƅu5H$uu Y8tVYpWPMDžDž$E h Su EuVYYV赴Y U*h YVhx hW_ V脴Y_^Uju u Ujuj Uu uFYYU VuVP jEPEPEPRQyh hWYYg}t%~ tu h hW <~ tu h hW =Gt uv\jYYu ~tUU EPJYUF RujjPuuYEuh hWYYj襯YVVt uYEuvP:YYEU EPjEPjRQEP0YVVtE}yuv\YY)URuu(Y^ PuSuK1^U VW}U ru u Dt16}yw(w4}YYthhphWYYjuhW hHhWYYjw4ñYPhW藗 hDhWYYVP jjjPRQyh,hWYY{~$u ~ tWYPh hWS }t~t UJN F }t"E9W4udž$UR(dž$dž(~t PFYVPMDž,Dž4:tHw4YY$u7V PPw4<^$ W4$$u?hPw( :t $P胔Y _^Uju u Ujujo U5G5GhPhW5gh hW 5ghhW hhWnYYjYUDVWuEPaRYDžDžDžDžDžDžDžUDžhu Vk =DžDžDžDžDžDžDžHvPEPQYY\gPEPQYYY+PY=~&H8/uI F룋U+tW tWRQ(P PsY_^UVWu} VVV_^UU MQU MU}tU 9Ut1U VW}W¼RhHEP WRh@EPk WOQh8EPF 5`C>jh0V^ u!W¼Rh(YYjh$V) u)W¼dЙRhYYFjhV uWRhxYYFjjh V辶 u#WOQh>YYF3WJWxWSWZhWPYYF_^UVUJ΃=\Cu' |paE ~ u E EUJUZPSVhP^UVWU U UBR`Y]u pʚ;E1UE1Et'} ~!U ]uuRhd3>Euuh\0$E0~t >0u FE0-YE]uGE9w^0 sEU9v+NONOEUO9vG ɋEUM ʉ_^UPVWu~YljW]Y[=[t15[PfYYPPjHjjPyt$u |u hYY@t PPu hPu h ~t##VNRQh_ 1_^U=[uh@=Yuh0*YY}u/WJWxWW =hWj YY-WJWxWWshWjsYYEPj u 3 PhYY}t u褡YU=[uY=[}u=[~hpQY5[5[YY=[t6=0Eu-5[yYEEPju PhLYY}t uYh[;Y[UV=[tu 5[YYu1HjYU [u u9YYƅt [[[1^U=[}u=[t8E9[t 5[6Y=|[t-WJWxWW hWj ׾YY=[u5[5[YYh[%YUVWu95[u1jCYVnYEPVYYEtVȄY[V@YPzY[u 8E[=[tj/5[YYDžt u=[u5[hYY=|[u=[u hY[[[1_^UVWu=[u Ft1 =[tF(PYt16YEt =|[m[t/WJWxWW =hWj YY-WJWxWW hWj YYFt E"V'N&V%^$ˉ]VUu =DCtMUt1}D>P_YD>GUt1}D>P:YD>G=|[tIFt-hj h`ZYZ)Rh`ZhCih`Zh,YYS=[=XCth`ZhYYFPFPh Ft hYuhYYhYFP+YhYFPY=4EtV#N"QFPhv =pZthpZh[YYhOYwF(P5[h5 Ft-WJWxWW/hWj/YYWJWxWW hWj 贺YY[[U[[_^UVu ~Dt VuYYNv(YEt7V,P4U40h,Pv( ^UVu V0P4DžH0Dž4Dž8h0Pv( ,V0P4DžHh0Pv( ,^U5G5GhhWk5ghhWS 5ghhW; hhW)YYjɖYUVW}DžؙDž1DžtWBM jj4( EtWU jRP t kYDžtWBU9VM 4>ut+:t hhWʷ jiY9]}t$U3JD]QRSS( 0tMRQQ( Gt}uUMr@QQ( 辐Y_^UVWu} VVV_^UU MQU MU}tU 9Ut1U5G5GhhW萶5ghHhWx jYUVW}U rGP7蛑YYP7͕YYE>u~u-uhLYYjWhWy hWj *YYUV_^UVWuU zWP;<Dž6PYuFP6YYP6YY( Dž(U E h,Sr( tu0(hgYYjVhWx hWj EYY(P _^UDžDžDžh,u u[ =t1DžDž뿻U9tW|tthhWaYY0PYDž8DžDDž4S@DžH0U+tW tWM RQ0P P薍YUVWu} VVV_^UU MQU MU}tU 9Ut1UVWuU #JQFPYYU #JQFPYYU M RQQN^NF)؋]=}%E#RFPF@U M I,B1tFAFAUVBUVC~CuFCL!RFFPYYUAPVWZYZBjlVWZYZEU9UUAPVWZYZE޺!RFHP,YYBj@VWZYZBjVWZYZBW׏EU RUU R,UE}{M9U}M麀UAPVWZYZUAMAPVWZYZUAPVWZYZM+UډU{+UJЙU!RFJP;YYU RUU R,U}tGUѺ9U}MUAPVWZYZUѺ+UډU볺!RFDPYY}EE@9}}U MEUڈV?E&} uFFjh0FPԵ 1_^UVWu UJ1UB<B9Ev}u%UJ1UB<B?9Ev ~ډЅtL~ډ9}:}thhW脯YYj$YVhhWj j Y u,}u&~ډ= thHhW0YYuI ~BUJ1UB<E9Es U9Ur_^UVWuU +VT+V4N1F Du0EPVaYE S0hhWj_xY,tQj,AYY$yhYj$xYP$" Dž$$eujV }uNuE  jjRjQh4FPYYRQuOpDžtUV$uhUPYYN^NF)؉#WRFPTYY#WRFP@YY/t>\thT"WEYYVW<YY VW1YYW詒Y=u N>/u_^UVu%hYƅu jfY^UVWuh"YY19URh|"YY1}U Pht"ĎYYF1}?U  _sU Php"苎YY hl"}YFhh"oYGe_^U=lFuh[YlF}t [E[UVj:uYYƅt9uuEF^U VWuVYE9u)} uE "u VYE9u "VUU)WxYEOWVu UuUPcyYUE_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVW}u1?WTYPeYƅuWh"hW轊 j\dYWVYY_^UVj/uYYYƅtFE^UVWu} VVV_^UU MQU MU}tU 9Ut1UVWu}jsRYu1Eu t""Ph"hWӉhWYj(RYPt PtEP躃 u1TjtEPtEPY-ZY uUWEPjEPR8UG_^U(VWu uURuEP8u EUUujbQYu 1}U4pFut##Ph#hW谈hl#hW螈YY}uhP#hW臈YYh0#hWvYY}uh,#hW_YYh$#hWNYYhW蒀YjPYP胀Y=0Vt7jPYPYEhWh #XYY}uEqU؈UjUPYPj EP UA1s@_Et EE}EE1E1EP;uY"鬣UM t UM }u UE_^UVuuuuuVEuGndVuu uEM}tjVxRYY6jVHRYY%}t1 $E駢^UVuVVV1҉V VVU tu輋Y 1FF^UVu>t0= } >ttPu YYtF1^UVW}1Lj4|FWFt u3} tt} u!jh0$GP2 u oF1_j4FWs uFG=1|;G=40} tt} ujh($GPŊ uF1_^ULVWuE1>u@UDžjuYYuuh$upYYZ€:uDž58VunYYtDžju YYtDžF(1W54Vu YYtDžF(1+Džuv(u ( {t ~(t1Pv4v,uuu u>ZT$ԟEUzx RU;V(tUzt RU1 Uzx RU }xKUEPPBYY}t U9V0t t1VWutEE PE=^}xXtjjh$K t6P_Ytƅ卅PRYE_^U0VWu}Wu[Yt1VhuPć E#U Puuu UP~~)V+V 9VPv uu WOF%FPv ju WO1_^UVW}u>t > tFU:tG_^UHVWu}Džu JYth%hW/YY~8AutWY} t u qYt!PF(PjWV8V(t} 1u YhPY t-PF(PjWV8PWхYYt N(PF(PjPV8VV VPF(PjPV8t"5gh%hW Džu?YYtT{v(uuPPPuEPh$hW 1VPPPuO$邛_^U VW} t u FY1}t u1Y1uuuVWuEtW+\YtV \YE_^UVuF,F4FFF F8AF0^UVW}E -A=s1E P`lYE MW1MW1?W11W1#W1E <%x_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVW}h%WYYuYE= ~EE EuuW 1҉UU1 r asE-A=sEPkYPhl%YYtE~F녃}t}t E_^UEPvYURujjju|<1U5G5Gh &hWx|5gh%hW`| jUYUVWDžDžDž|DžxDžtDžp`'Džl`P YDžDžEE1hX'u uIl =EEſDžjfYPfYMf|DžjpP5gWg |p:b5gh8'hW{ jTY=s3@&LU+tWu tWM 4YtWM 9u+PYtWM 4Yƅu}u>uu1EEtWM j4YYEuu>YYVY=v&h('hW-zYYP<YjSYuA}u;}u5>u0=lW t =lWuEju6>YYuE 0h'hWy jNSYP;YYPPjHjjPNh=uP;YjRYu}tWP:Yt h&J{Y9tPPh&&{ Ph&{YY}tDh&hWxYYhWhVr >tjVV ~Y-ZY t >aP#:YuP}t/>u*jjh|&[A tP:YjQYƅƅPGY>t<Dž`PjhjVt1Džtt>u t>!sYlhjpPll1=uCttd dt >>uj hp&P| PPuVmtt@|1dz)u%dj PR| Džx1ttEtt<|-dz)u!d|RrYYDžxxthjpPlXkP8YOY_^UVWu} VVV_^UU MQU MU}tU 9Ut1U<VWuEj0OYYu 3URv jjju{5u`YDžuh|'hW{uYYWP6YYDžE EPjjjRQE0NY9EuEPv jujhp'4PDYW$7YDžEPjjjWRPv jujhd'4PLDYUNRv juPuh4~1_^U5G5Gh(hW_t5gh'hWGt 5gh'hW/t jMYUUUMMUUjuMYYu1*uEPhnju uE1EUEP{YU RM ] PjRqU׉֋E1EE1t3EUU֋E1NjE1tGU׉֋E1E}uEUE E8UEE_^UVWu} s*1u E E@ @Wuu VEu];w??v E E@ _^U5G5Gh+hWqb5ghp+hWYb j;YU VWEEEEEEEEEEEEEEEEEEEEEDžlDžLDžHDžDhX1u uQ E=gUgl̃MEEEEEEE돃MEExEEeMjj5gL EG5g9YL05g9YH5g9YDMEEMjj5g~L EEE5gc9YEE5gH9YE{,EP|U+tWu tWM 4YtWM 9u6tWM j4YY@Ph<1pPa E=gEEP!Y@wdYY$r$v@h1pPa WPP3{Lt L`Ht HdDt Dh@P7$YYjjupP}t1P@PWPP Eu+5lWJYPh 1hpP`(}uEW(ƅb%jjdPb j hXPb uYPj XPjj bPuYPXBYZ[щM̃}tuh0_YYU hj@PR=t"@Ph0hpP_!}|#h@Ph0Q Du0EPYE pS0h0hW]j6Yhu dtPYY>Uu ?t)h$0hW\YYh/hW\YYE}W$zu@h/hW[ W$J?u0@ht/hW[ hL/hW[YYEW$jjR` }t7W$zt)@h$/hWL[ h.hW:[YYEE}`UzFU:tEduUJAdhuUJ?hW$9U}UJ UZ UJ UB؋UJUZUJ UPB ZЉEW$9UU}uO}uIUJ UZ UJ UB؉EEEhuBdu9}thPdPEPu{Džd@Džh }t!udhh.hWQYhdU}}u}tE̙}+UډUE}u}u hU}X`KEU`U؃}u $v}uE}+UډUU+U9U~ U+UU؃}t(}u$v}t U+U؉U*UUU}uh.hWXXYYj1Y1}W$uPhduuR}tOW$zu4@h.hWW 'W$W$ ,Esw$PPEPEPEPuuV E}%}W$z @hL.YYYW$J W$Z W$J W$Bؙ}O$YO$AO$Y O$RQ YʉЙ}쉅`W$J W$Z W$J W$B@Phd`h .X}bU9U~Zuh-hWNV j/Y;h-hW2VYY5uh-hWV hP-hW VYY ,E%r}t6}u0h4-hWUYY}th-hWUYYjg/Y}}|h@Ph, U hj@PRQ=th,hWdUYYj/Y}|h@Ph,I EPYj.Y_^UVWu} VVV_^UU MQU MU}tU 9Ut1UU R(UjuhWo WJWxWW hWj zPYYuC4Yht1VYUhx1hWGTYYU5G5Gh1hW T5gh1hWT j-YUEPYh1u u`D =t׃?t̋U+tWdPfYDžDžDž1U+tW tWM RQP3e P,YUVWu} VVV_^UU MQU MU}tU 9Ut1UVWE 0Yǃ}U h3rWYYtU h3rWYY|5G5G_SPd@YPh3Th3sTYh3hTYht3]TYh`3RTYhP3GTYh<3YYUVWu} VVV_^UU MQU MU}tU 9Ut1UGUhj|)YYhjn)YYhj`)YYhjR)YYUVWu} VVV_^UU MQU MU}tU 9Ut1UVW}1=Hu ztWRY ƃt wY Ɖ_^UVutF^UVW}E?u z֋JKzt  RQY Ez t  RQ Y Ezt RY E79Yzt r&Y EE_^UUR uuuu RQUUR uuu RUUR uuu RQUVWu} VVV_^UU MQU MU}tU 9Ut1UV1}><[t#[ztrVh8hW;[P\YF^UV=Hu-H1}[Fh"Y^UVW1}-<[tu4[W>YP@YYuF˃uuh9hW>; 1V<[t [U7u u9YYEuuh8hW: 1U[u#%Y_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVWu>t-j hh6~DžuVY>_^UVWu} VVV_^UU MQU MU}tU 9Ut1UVu} tV(E }tV E}t E}t E1^UVuv0Yv4<Y1^UVWUU1Ur4#=YE=GP>BYűUr0>YUPR>YZPYƅuIUr0V?>YYhH9V=YYURV=YYjVu u@ VYH_^UVW} j8YHFFF W=YPYF0~0u VY1UWv0=YYFPW<YYyv0_YVXY1&W;YF4~4uv0;YV4Y1_^UVWu} VVV_^UU MQU MU}tU 9Ut1U=(Vt1s=$Vu.jhP9;YY,VxhL95,V&YY$V=$Vu.j:Yu(V1,V$VW$VU jkYu1uu uhW6hW%/Yj7YP/Y=0Vt%jYP0YEhWh\96YYjYPj EP0 }yt}Yu1}nt }NkUVWu} VVV_^UU MQU MU}tU 9Ut1UVW1EEUUU:t6= }:uUPu:YYt U_EE1U:9uxU]9dU] 9uu1E@U=0|*U=9Uk Ã0kE EEFq}u%U9}UUuu,}tG?Bv U9}u 9uMFU M}ttw =TCtE UUWPh9R6}t UM _^Uu j54Vj j~uQUu h58Vjj-u/UVWu }UU9uvt_FE_^UUǂ UǂUǂUVuV UE9uv0Et1UR>t ZЈEFE^U Vu uju EP8 U jREP8 EEPfY9u6 J#K9uk  dž^U8VUU uuYYƅuh9hW2YYj@ YuV U9iPP4YYtEt:=t,ƅ倽uƅPY1^UXVW}UG 1҈WWW u YG u47Y 1EE}DžUJk UVPjGPV:!ZVPjGPV!ZVPjGPV!Z֋U9Uu @ UEUU+UPYMMEUUBRuYYuh9hW0YYjf YU PjRu XUMMARPuQuu)YUU_^UVWUzuh9hWB0YYj YURBER0YYEuh9hW0YYj YEURUKUB=uUMrquQ $UuzE }~ MGFuRY_^UVW}U@UU~"UrEPh:hWP/U O 9tu EYU O UJѺE }t U M UJk U VjVGP ZVjVGP ZVjVGP Zր}t_^U4VWu} VBUEPYFPV0YYu:tE1AvuW vWYY"~u}uvWYYF=t~uPVQYYoF=uVBRuWL FPP?YY}uEV+URuW Ft.jFPEP3 EjFPEP2 EF]SPFPFP}t DžVBN+MFPEPRQWi_^UVURBUEE U4tVJMQuju u^U VW21=3E 0h:hW|, E <:HU uzE }~ MGFUBtU u1U @RU zt!UM uj(Ruq3u(UM uj(Ruq b3u1iUBt)U u!uU r hx:hW+ 17UBu)U u!uU r hT:hWi+ 1_^UVW}}u} t u 0YEu WBR7YYEuh:hW+YYjYEPuW ƅu)}t h:hW*YYjcYuuuuu VWEt}K}t~tvu/YYU}t v u/YYV(VJ,1 G_^UVEU 4t >tRU JMQEPjuu[ƅu#}t1$h;hW)YYjuYEU ^UVu~u6U R9Vt U RV U RV+V 9VFVV JV^UPVW}1}u@uPYYju$YYuh;hW)YYjYuU PjRu R}yt#uYYtDž}tDu;PYYt#} tGiDž0YYyhX;hW<(YYjYP VWLYYFuVJ9Uu VW/YYFVJ9Ur~tuvYYt~ t"uv YYuVJWu*v PYYuVJW ,;CV>x=VW t*uYuhD;hW 'YY_^U=tG9uF>uր?=uэG1_^UVW u+Yƹ<\V+F؉F\V+ډV YV YDžt"<1FF1V Y_^UV_U9_wU_9_vlW 16VYt1'_rF5_&Y5_^UVW}u1E}UUslW 1=_u8jY=u1V!փ5_5_FE5_OVU}9}r69v2W9UvUW~>}t E_u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=_<9}r79}u+UOJ}t E_URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVX' uY_^U VWUUb15_t 9ur6E0tU U_tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhLWEP<>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hxVVW ƅu1WW$YZ׀>/u5FuhxVVEP ƅu19ut EEG>,t1jFhVVW ƅu1MWW$$YZ׀>/u0FuhVVEP ƅu1EEGu>t1_^UVWuE}>:tVhD`w#YY_hVlVxVUV VUV Vc#Y=VhD`,#YYVh_wYYƅ>-uF>+uFjVEP ƅUU\Vj h_5hV# 1dV_Vh_YYƅpj h_5lV" _>t>,tjVEP ƅt5U`V>t'>,u"FVY"Y=xwVh_YYƅu_^UhX<YPLYhVpVlVtVUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JV4EU M R+Q¤ЙЙUuW +UЙOIkkE0VUM 9_^UVWuExVVE=dVudVV =dVu1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t`V F 1_^U VWu<Fyt 9tF>tG1_^UVW}?tu >t 9tF>tGމ+U_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0-XtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+lW"}t}y UU_^UUAs UEUUas U EUVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPYYNjE E PGY9uuąt9}t t1_^U$UUEPjj_ y U(X1UVW5(X(X}׃}~9r }y 9vWYu_^UVW1}y11:tWM xWC;t!A tWM xWCgtWU9tW|W=pWt=E hW06YYhWh<%YYhWW YYhWj YYxW?`tWA tWM gxW7tWM xWxW:uxWtWg_^U=Wx 5WYWWU=Wx=4bu 4b|Wj54bYYWy'j5WYY Pj5W} 1U^U4bUTg8f=Wu/hh8b5W W1VPg8b=Tg8gu1< WPgPgTgTg= uTg8fUTgUTgUTg:u1Tg: t Tg::uҋUEUV=Wyy1u18gtxHgtjƅtjjVf fg/Lgt!@gyDggTg:X8g^UV%ƅt F9Eu^UV{ƅtu6YYu[^UVWuU VVuYYDžt~~yVډlWF_^U$UUEPjj U(VuEEV֋RUV֋RU <E &UUU UEPj7jB ^U(VuU @t*u*YEU UV֋RUUUEPu@YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE|XEPjGj U} vlWM E 1U} vlWM ҋE!1UE1UE1U} vlWM Et1UVW11}U9Wu WF߃| jugYtUrYtURtUzt r Y}Wt}Wt}Wt uY_^UVWuEu41}%uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }@V N~y UVu CV€tu ,fNV~Wu>5WlYt.h|YFu NLNHF 9hNYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvy =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11t >:tFG9}s/GuWYYEPuYY=t4C2u u =lWt lWŨ}t} uFuUR;YỦlW_^U$EPjjY U$UUU UEPjj5 U$EPj/j yEU$EPjj yEU$EPj/j U$EPjj U$UUU UUUEPj6j{ U$EPuYY1ۅÉU$UUU UEPj%j5 U$UUU UUUEPjj yEU$uYEU UUUEPj'j U0VWEPuYYy1U؁@tlW1hu3YYDžy1EPWYYxSlWU؁@u7jWYYEx& PjWy xh$YƅulWUW2YUЉlW1FfFF_^U$EPj*j yUEUMJ1UVWuulW 1FQh^ SP} fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$EEEPj.j U$UUEPjjc UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjQ Vgg5ghgjKj ^U$uYEUUU UEPjj Uu hT$u U$EPj jm y}tUEEU$EPuYYEPj j+ U$} uEuYE"E UU RUuYEUUEPjj U$EPjj y}tUEEU$UUUUU UEPjjk UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U AS }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEAuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UBEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UDBJxUʋFF VuFYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEBUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/E6U U RU U RUEEEdBE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP*YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPFYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UhBhWRYYjYU$} uEEUUE UEPjJjy y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇTZtPXPbuffer_flush: short write buffer_flush: writeShould not happen refreshing directory bb>Short buffer fill @This->dirty = %d ROUNDOWN(offset + len + grain - 1) = %x offset + len + grain - 1 = %x Internal error, dirty end too big %x %x %x %d %x cylinder size not multiple of sector size size not multiple of cylinder size mm-dd-yyyyOut of memory error Short write %d instead of %d write in copyfile readFile too big Couldn't open target file Couldn't open source file B/dev/fd1A/dev/fd0 at 2 = %d Bad slot %d Bad slot %d %d %d %d %d Internal error, non contiguous de-allocation Bad slots %d %d in free range Bad slots %d %d in add used entry Bad slots %d %d in add free entry dir_grow: malloc://%s"$\"$\eoPipe read errorecho %s$*(){}[]\?`~-csh/bin/shError reading fat number %d [1] Bad address %d Trouble writing the info sector end of file in fat_write error in fat_writealloc fat mapTrouble initializing a FAT sector alloc fat sector bufferProbably non MS-DOS disk Cluster # at %d too big(%#x) Too many clusters in FAT Initial byte of fat is not 0xff Bad media types %02x/%02x, probably non-MSDOS disk Could not read first FAT sector alloc fat mapBad FAT entry %d at %d No free cluster %d %d Fat error detected Disk full Disk full Trying to remove . or .. entry .. . Bad preallocated size %x Bad filesize loop detected! oldrel=%d newrel=%d abs=%d >-%lu<%lu> -%luRoot directory or empty file cluster too big Fat problem while decoding %d %x /. .writefile readCouldn't open source file Change of transfer direction! Bad offset Change of transfer direction! Bad offset Removing non-existent entry %s Can't set disk parameters for %sCan't set disk parameters for %s: %sinit %s: non DOS mediadiskette %s: is Linux LILO, not DOSinit %s: could not read boot sectorDrive '%s:' not supported/dev/dosXinit: allocate bufferBig disks not supported on this architecture init %c: sector size (%d) not a small power of two init %s: sector size too big Internal error, offset too big w[*[?Z[L[\q[...-X^^3^Ambigous ......./../ge5eQeAmbigous %s %s: no match for target .%s: File "%s" not found *[?Several file names given, but last argument (%s) not a directory %s/ +h +s -a +a mattrib *Usage: %s [-p/X] [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...] -p Replay how mattrib would set up attributes -/ Recursive -X Concise Mtools version %s, dated %s 3nAnHnR%nS,nn/n?nXnpno+$ooUo*[?/ahrsAHRSXpBad cluster %d found end of file in file_read early error%s: Cannot initialize drive Usage: %s drive: Mtools version %s, dated %s -w write on device else read Usage: mcat [-w] device Mtools version %s, dated %s %s Drive '%s:' not supported mcd: Can't open mcwd .file for writing w%s Usage: %s: msdosdirectory Mtools version %s, dated %s -%s Copying "%s" is not a regular file File "%s" exists, overwrite (y/n) ? -Failure to make directory %s mkdir* Copying Could not open Target Copying %s "%s" is a directory Can't stat source file *Copying %s Can't stat source file into one of its own subdirectories Cannot recursively copy directory -/ -s Recursive -p Preserve attributes -a -t Textmode -n Overwrite UNIX files without confirmation -m Preserve file time (default under Minix) -v Verbose -Q Quit on the first error -b -B Batch mode (faster, but less crash resistent) -o Overwrite DOS files without confirmation %s [-/spabtnmvQB] [-D clash_option] sourcefile [sourcefiles...] targetdirectory Usage: %s [-/spabtnmvQB] [-D clash_option] sourcefile targetfile Mtools version %s, dated %s [/?)BփDQʃabփmnopstvBad target %s .--abB/sptnmvQD:o%s: "%s" is read only, erase anyway (y/n) ? Removing Cannot remove root directory non empty Directory *Usage: %s [-v] msdosfile [msdosfiles...] -v Verbose Mtools version %s, dated %s ʼnщv%02dmm%02ddd%02dyy%04dyyyy%02d%02d%04d%2d:%02d%c%.*lu%.*lu%09luInvalid negative number Volume Serial Number is %04lX-%04lX Volume in drive %s is %s Volume in drive %s is %s (abbr=%s) Volume in drive %s has no label %s bytes %3d fileNo files %s bytes free Total files listed: Directory for %s %s/%s %s %s %d %8ld %-8.8s %-3.3s %-13s%-15s[%s]%*s*** -w Wide listing -a All, including hidden files -b -X Concise listing -f Fast, no free space summary -d Debug mode -s -/ Recursive %s: [-waXbfds/] msdosfile [msdosfiles...] Usage: %s: [-waXbfds/] msdosdirectory Mtools version %s, dated %s ӗ/XabdǗfswwaXbfds/.File does not reside on a Dos fs Usage: %s [-b] [-o offset] [-s size] file fat Mtools version %s, dated %s c?ʚbosNot a number: %s Not a number: %s bo:s:Usage: %s [-as] msdosdirectory -a All (also show individual files) -s Summary for directory only Mtools version %s, dated %s %-7d %-7d *i?as-a and -s options are mutually exclusive asMTOOL3972M-STV04Warning: Using 32 bit FAT. Drive will only be accessibly by Win95 OEM / Win98 Device too big for a %d bit FAT Contradiction between FAT size on command line and FAT size in conf file 0  Could not open root directory Internal error while calculating Xdf fat size IĨĨToo few clusters for this fat size. Please choose a 12-bit fat in your /etc/mtools or .mtoolsrc file Too many clusters for this fat size. Please choose a 16-bit fat in your /etc/mtools or .mtoolsrc file Internal error in cluster/fat repartition calculation. © © Internal error while calculating cluster size Bad fat size Usage: %s [-t tracks] [-h heads] [-n sectors] [-v label] [-1] [-4] [-8] [-f size] [-N serialnumber] [-k] [-B bootsector] [-r root_dir_len] [-L fat_len] [-F] [-I fsVersion] [-C] [-c cluster_size] [-H hidden_sectors] [-S hardsectorsize] [-M softsectorsize] [-3] [-2 track0sectors] [-0 rate0] [-A rateany] [-a]device Mtools version %s, dated %s 0F ˮ1KŰ1Hk\iRR;iFAT%2.2d NO NAME open boot sector%s: %s Error reading from '%s', wrong parameters?Unknown geometry (You must tell the complete geometry of the disk, either in /etc/mtools.conf or on the command line) Drive '%s:' not supported/dev/dosXFlag %c not supported by mtools Bad size %s 148f:t:n:v:qubkB:r:L:IFCc:Xh:s:l:N:H:M:S:230:AaUsage: %s [-v] drive -v Verbose Mtools version %s, dated %s last allocated cluster=%u free clusters=%u signature=0x%08x Infosector: Boot sector hexdumpread boot sectorOut of memory error backup boot sector=%d infoSector location=%d rootCluster=%u FS version=0x%04x Extended flags=0x%04x Big fatlen=%u disk type="%8.8s" disk label="%11.11s" serial number: %08X dos4=0x%x reserved=0x%x physical drive id: 0x%x big size: %d sectors hidden sectors: %d heads: %d sectors per track: %d sectors per fat: %d media descriptor byte: 0x%x small size: %d sectors max available root directory slots: %d fats: %d reserved (boot) sectors: %d cluster size: %d sectors sector size: %d bytes banner:"%8s" ====================== bootsector information %s: -H %d mformat command line: mformat -t %d -h %d -s %d cylinders: %d heads: %d sectors per track: %d filename="%s" =================== device information: vOut of memory errorLOGNAMEHOME/.mcwd/tmpMCWDWarning: "%s" is out of date, removing it /A:A:/A:/r .%c%02x %03x %s: A:A:strdup(): not enough memory to duplicate `%s' secondaryprimaryNew %s name for "%s": aoqrs sSq): oO s)kip S)kip-all q)uit (aArRo)verwrite O)verwrite-alla)utorename A)utorename-all r)ename R)ename-all ShortLong%s file name "%s" %s. contains illegal character(s)is reservedalready existsOcmm LPTCOM NULPRNAUXCON?IS]file is read only, overwrite anyway (y/n) ? .  {{(Internal error: clash_action=%d %s: No directory slots Cannot create entry named . or .. a mors^+=/[]:,?*\<>|". Usage: %s [-vscn] [-N serial] drive:[label] -v Verbose -s Show label -c Clear label -n New random serial number -N New given serial number Mtools version %s, dated %s >NcnsvNO NAME Delete volume label (y/n): Enter the new volume label : Volume label is %s Volume label is %s (abbr=%s) Volume has no label %s: Cannot initialize drive Label too long %s not a valid serial number vcsnN:. .. Could not open Target %s [-D clash_option] file [files...] target_directory Usage: %s [-D clash_option] file targetfile Mtools version %s, dated %s ?Do D:oM7WEasy, isn't it? I wonder why DOS can't do this. Directory has no parent entry ..Cannot move a root directory: ) into one of its own subdirectories (Cannot move directory -v Verbose %s [-vo] [-D clash_option] file [files...] target_directory Usage: %s [-vo] [-D clash_option] file targetfile Mtools version %s, dated %s ?Dov:/:Path name to current directory too long Cannot move files across different drives vD:o h=%d s=%d c=%d nr=%d start=%d end: type=0x%x start: active=%x Partition %d End position mismatch for partition %d Start position mismatch for partition %d Partitions %d and %d badly ordered or overlapping Partition %d is not aligned Usage: %s [-pradcv] [-I [-B bootsect-template] [-s sectors] [-t cylinders] [-h heads] [-T type] [-b begin] [-l length] drive Mtools version %s, dated %s =BI=STgabcTdfhl"p$r-stvi\ SSector writtenError writing partition tableWriting sectorRetry with the -f switch to go ahead anyways inconsistency detected! Usually, a disk should have exactly one active partition Warning: %d active (bootable) partitions present Warning: no active (bootable) partition present Partition %d exceeds beyond end of disk mpartition -c -t %d -h %d -s %d -b %u %c: The following command will recreate the partition for drive %c: Partition for drive %c: does not exist Unknown size sectors: %d heads: %d %d Use the -r flag to remove it before attempting to recreate it Partition for drive %c: already exists Use the -f flag to remove it anyways Partition for drive %c: may be an extended partition Partition for drive %c: does not exist Use the -I flag to initialize the partition table, and set the boot signature Boot signature not set open boot sector or none of them You should either indicate both the number of sectors and the number of heads, %s: %s Read sectorError reading from '%s', wrong parameters?%d sectors in total init: open: %sDrive '%c:' is not a partitionDrive '%s:' not supportedadprcIT:t:h:s:fvpb:l:S:B: File does not reside on a Dos fs Usage: %s file ... Mtools version %s, dated %s writetypeshowfatrenmovereadrmdirrdpartitionmkdirmdlabelinfoformatdudoctorfatdirdeltreedelcopycdcatbadblocksattribUse 'mtools command -?' for help per command %s, Supported commands:Usage: mtools [-V] command [-options] arguments ... Unknown mtools command '%s' mtoolsmtools disable-raw-term disable-debug disable-new-vold disable-vold disable-xdf configured with the following options: %c%s version %s, dated %s --version-VRecompile it using a more recent compiler Mtools has not been correctly compiled 3.9.71 jun 2000plain_ioseekUnknown media type 2M (scsi_sector_size=%d)   SCMD_WRITESCMD_READUnaligned write Scsi buffer too small If this is a PCMCIA card, or a disk partitioned on another computer, this message may be in error: add mtools_skip_check=1 to your .mtoolsrc file to suppress this warning *** Maybe try without partition=%d in device definition *** Possibly unpartitioned device Warning: inconsistent partition table init: non-existant partitioninit: Big disks not supportedinit: Big disks not supportedinit: set default paramsunknownplain floppy: device "%s" busy (%s):Can't stat %s: %sCan't open %s: %sCan't stat -: %s--csh/bin/shCould not forkafter reclaim privs, both uids should be 0 after drop_privs, real should be 0, effective should not destroy_privs, no uid should be zero after init, real should be 0, effective should not user or setgid to any id. However, it can be installed setuid to a non rootMtools cannot be installed setuid root. Seteuid call not supported on this architecture. scsi_io not implemented Streamcache allocation problem:%c %d Cannot initialize '%s:' Cannot initialize '%s:', out of table space /r/dev/tty ;+=[]',"*\<>/?:|"*\<>/?:|%c%dOut of memory error in clear_vses Out of memory error Out of memory error in dir_write Attempt to write root directory pointer parse_vses: invalid VSE ID %d at %d. ''''Skipping "%s", is not a directory Skipping "%s", is a directory Unexpected entry type %d Out of memory error in vfat_lookup Out of memory error in vfat_lookup [0] Out of memory error in vfat_lookup_loop ,<,J,,No directory slots Out of memory error in vfat_looup [0] Out of memory error in lookupForInsert SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown errorDaCrCwDDD+,Db"D: option requires an argument -- : illegal option -- --]J6J]J6J]J6JCJCJCJ?Sa,SrSwSS+cSbYS : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATHg f@fhXgbgdgigogpgugxgh h#h+h-h0hkLihiliiE}kGhkXjbjcOkdke}kf}kghkikn7jojpjrksjujxj(null)cannot print floating point g"NeLH<84xV4;Zx0N8 9%;::;EFGe /a= 52udݑ#GM I=2zd9!#CGT '[R=2zd4O/ex1؎||r|( ( ((P PP P$ ###P$L$H$D$@$<$8$x2Qnl2Fqh2sd2ew\2X2'P2'L2/@26<2B42u,2[$2 22 22'2'1111Q11<4D4F a IPm +IPmrEAAEEEIIIOOUUYAIOUCUEAAACEEEIIAEEEOEIUUOUUUOUIAAEEEIIIOOUUYAIOUAAEEEIIIOOUUYAIOUUEAAAEEEIIIAEOOOUUOUAIOUCUEAAAACEEEIIIAAEOOOUUYOUOOAIOUAAAAAEEEIIIIIOOOOOUUUYYCEAAACEEEIIIAEOOUUYOOAIOUAAAAAEEEIIIIIOOOOOUUUYYގY饥IUEAAAEEEIIIAEOOOUUOUOOAIOUAAAAAEEEIIIIIOOOOOUUUYYގ똙饥ޏӊ׍♕餤׷AAAAAACEEEEIIIIOOOOOOUUUUYAAAAAACEEEEIIIIOOOOOOUUUUYYAAAAACEEEEIIIIOOOOOUUUYAAAAACEEEEIIIIOOOOOUUUYYYAAAAAEEEEIIIIOOOOOOUUUUYAAAAAEEEEIIIIOOOOOOUUUUYR3,,R,3!!R!311R13"R"3"''R'3..R.3-Ra-3a-aa)R)3)/Ra/3a/aaR 3 R 3 fRf3f__R_3__R\_3\_\\R3==R=3QQ3RR3VV3XX37RR 73R7RbRR b3RZRR Z3R&TT &RT &3T*TT *RT *3T0TT 0RT 03T$TT $RT $3Tv`9t9GMTGDTDVPVDVPVU U ;;;;;;;P<D<<<4<0<(< << <<;; SSSS/etc/passwdBWWWXh ((((( AAAAAABBBBBB Unknown errorAAxAhAPADA(AAA@@@@@@x@h@\@H@8@(@@@???????h?X?L?>>>0Y0Y0Y0Y0Y0Y0Y0Y0Y0Y>>l>X>L>4>>>======x=d=P=Cbegrom_set_dwoT_set_wor_compare__buf_fl_invalidA_isInBuf_buf_rea_buf_wri_buf_flu"_buf_freN_BufferC C_set_dwo_set_wor_compare_set_dwoH_set_wors_compare_set_dwo _set_worG _compareb _compare~ _set_dwoH _set_wors _compare _rol _calcHas _addBitU __addHas _addName& _hashDceB _freeDir(_allocDi;_mergeFrr_set_dwo_set_wor_compare_set_dwo\_set_wor_compare_getPath_sprintPh__fprint_set_dwo_set_wor _compare&_set_dwo_set_wor'_compareB_readSec^_forceRe_writeSe_forceWr_GetFatM%_locate_fatRead_fatWrit|_loadSec_getAddr_readByt _fat12_dB _fat12_e _fat16_dX!_fat16_e!_fast_fa!_fast_fa!_fat32_d!_fat32_e<"_fast_fah"_fast_fa"_word_enD_dword_e D_check_f&_check_m'_fat_32_(_old_fat*_set_dwo40_set_wor_0_comparez0_set_dwo1_set_wor1_compare1_getUnbu1_recalcPJ2__loopDe2_loopDetK3__countBr3_countBy3_normal_5_root_ma=8_read_fi8_write_f 9_monthD_conv_st9_get_fil:_free_fi:_flush_f%;_pre_all;_FileClaLD_getAbsC;_func1;_func2<_comp<_init_haI<__intern<_set_dwo@_set_wor;@_compareV@_Transla@_set_dwo`D_set_worD_compareD_set_dwo\E_set_worE_compareE_read_fiE_write_fF_free_fiG_FilterClD_set_dwo0H_set_wor[H_comparevH_set_dwoH_set_worH_compareH_force_iH_set_dwoI_set_worI_compareI_sizesD_deletedE_unallocE_alloc_hI__hash_aK_rehash!L__hash_lL_set_dwoN_set_worN_compareN_read_boN_fs_flus4O_get_medKOI_1\Z_set_dwoW_set_worW_compareW_set_dwoX_set_worX_compareX_casecmpX_exactcmY_parse_rY__matchZ_set_dwo \_set_wor7\_compareR\__unix_ln\_checkFo]_isUniqu]_handle_]__dos_lo^_recurs_8`_common_c_dos_lood_dos_tard_dispatcqg_set_dwoi_set_wor+i_compareFi_attrib_bi_replay_i_view_atEj_concisel_recursim_usagem_letterTn_set_dwop_set_worq_compare*q_set_dwoHs_set_worss_compares_set_dwov_set_worv_comparev_mcd_calw_set_dwox_set_worCx_compare^x_set_mtizx_unix_wrx_makeUni{_unix_co}{_dos_to_}_unix_to}_directo)}_writeit;}_dos_wri~_subDir_dos_cop_dos_to_U_unix_toj_usage~_set_dwo܅_set_wor_compare"_del_ent>_del_fil_usage_set_dwo_set_wor_compareΊ_fast0E_debug4E_print_d_print_tt_dotted__print_v_printSu_leaveDrُ_enterDr_emptySt8E_leaveDi_enterDi_list_fi_list_no•_list_re3_usageÖ_shortna`Z_longnampZ_recursix[_wide|[_all[_concise[_dirPath[_current[_current[_filesIn[_filesOn[_dirsOnD[_bytesIn[_bytesOn[_RootDir[_set_dwoܘ_set_wor_compare"_dos_doc>_unix_doؙ_usage_set_dwo<_set_worg_compare_usage_file_md_dir_mduS_set_dwod_set_wor_compare_init_geƠ_comp_fa%_calc_faq_format_4_xdf_cal\_calc_fa%_bootpro@E_inst_bo?_calc_cl_old_doss_calc_fs_calc_fs_usage2_set_dwo@_set_work_compare_usage_display_set_dwo_set_wor3_compareN_get_mcwI_20[_set_dwo_set_wor_compare:_set_dwo_set_wor_compare_ask_ren._ask_nam_process(_clear_s_contain"_is_resec_get_slo2_write_s_stripsp_set_dwo0_set_wor[_comparev_usage_set_dwo _set_wor7_compareR_usage_createD_set_dwo_set_wor_compare_set_dwo,_set_worW_comparer_rename_M_rename__rename__usageB_set_dwo_set_wor_compare_print_h_set_offN_setsize_setsize9_usage_set_dwo(_set_worS_comparen_dos_sho_unix_sh_usage_set_dwo_set_worC_compare^_dispatcF_set_dwo_set_wor_compare_file_io_file_re _file_wr+_file_flI_file_frP_file_gem_file_da_scsi_inu_ScsiClaG_SimpleFG_set_dwoH_set_wors_compare_set_dwo_set_worG_compareb_print_p~_Setuid_rgid[_egid[_ruid[_euid[_set_dwo_set_wor_compare_set_dwoh_set_wor_compare_set_dwo_set_worC_compare^_set_dwo_set_wor_compare_is_initH_finish_"_init_stq_fss[_set_dwop_set_wor_compare_set_dwo_set_wor;_compareV_get_dirr_dir_fre_DirClasH_set_dwoT_set_wor_compare_tty$V_notty(V_ttyfd,V_set_dwo_set_wor_compare:_autorenV_unicode, _sum_sho _check_v _parse_v$_vfat_lo%_vfat_loT'_checkNa'_vfat_lo*_account*__calls-_grow.__bottom___top___empty__ntstrDV_dststrPV_dststarxV_dstendV_parseZo1_parseTiY2_parseDa3_parseRu4_parseTZ5_last_su7_date_ofG8I_22_I_21D`_nextdW_string2@I_14a_PASSWD|W_pwfdW_buflenW_getlineG_scan_coLH_pwfile4b_buf8b_pwline8f_entry8g_bufptrPg_lineptrTgI_1Xg_do_writPSENDRECEIVEBOTHSYSVEC!SRCDESTMESSAGE slwordYsword*Ysbyte3Ydone5Ynext]Yfound{Yfailure3Z_unknown0YI_1lgI_1g_gnumTf_o_printfuplwordoupwordoupbyte$odone&odownward-ono0focompareodoneono0obegtextbegdataCbegbss\Zcrtso___mainP__penvirC__fpu_prg__penvpg__edata\Z_exit-_environhWendtextp_mainz_buf_inip_perrorU_freez1_mallocc/_memcpyX.csa4xp_force_wDI___stderW_fprintfLT_memsetX_get_date_mtools__OpenFilJ?_isRootD?_filehasg_copy_st_free_st_bufferi_hash_loM_hash_adL_fsPrealaW_dir_wri#_hash_re N_make_htJ_unix_nor@_dos_namA_unix_naC_unicodeD_autoren_strrchrZ_tolower(B_strspn @__basena_skip_drE_file_reD_fwritelU_open_fiG_free_ht?K_FsClassE_find_deO_fs_initR_num_clug_strerro?_old_dospE_strcmpY_sprintfV_SimpleF| _stat,X_log_2WX_write_p_read_pa_max_off(E_max_off,E_mt_lsee?X_lseekW_match[.csb4p_unix_lo\_isSpeciS]_unix_tae_target_e_main_lo7f_init_mpg_mpGetBag_mpPrinth_mpPickT=h_mpBuildYh_accessdW_vfat_lo(_get_drik_open_ro_prognamg_unlink___fix_mcw_unix_di_OpenDir_mattribQn_conciseg___stdouW_getoptD_mdateG_mversioG_optindtW_mbadbloFq_printOoj_usages_mcats_freadT___stdinW_noPriviG_mcdew_fcloseK_open_mc_mcopy_ask_con>_mkdirW_createD*_handle__optargg_init_clb_unlink t > u ~ uFE0= s > t1>(u'E= r:>(uEF<)uMu$VrYtFF= v VYYtE+URjYYNjEu0W' U? u;E0_^UVW}E PYEtjjYYƋUV7҉_^UV5VUVYE^UPYU=tR:;thHh_YYuhPYYU thL%Y1UV kX Pud'YYuF1^U}t}X t u&YUVU:uX 'uJ'YPjYYYuV'YY^UUBtUzu1UV>tur&YYt6^UVuY0tFu1F^UVuY0tFu1F^UVWu Yǃ8uMu Yt jjYYu YFEFF7Z7FtF%#U9tFQF% EFVYtVV vdYv [YuoYF ucYF1_^UuhX u uUVuYEօ]Ft.~tQv YF X vYVVF)vYv YvYEVY^UVWuE1>-uEF-0= wF-0k ߋU׉_^UVW}1u N 1u Džu_^Uj uYYUVW1UƉ0 w0Aw7 awW E뿉_^UhLhPj m h8h@j Y h,h0j E hh j 1 hhj  hh j hhj hhj hhj hhj hhj hhj hphxj} hXh`hX j|jRPjWt5YjYEPh5YYhTYYUU:t :tEESY U Vhj P! E5FV YvtYFt!hcYv ZYhOY#F%=tP*Yv!Y:u hpYZ 6V|jRPjt5FYhXSY^UVWE5F=uVYFtvv vh&vvVYtP >=zEE1chYǃt ~<Jx hj YY ~|h=Y6_^UVu-0= wF9uu1} u 1 E 0^UjuYYU4=ujYYfEt!EPEPFYYEP^Y=u54YPuh} 2EP.YEP$YfEtEPuhK UjYiU\&+E\&1Uj6Y=t5YUU UjYU=t5rY9w1UueYEt50EjYuuuY9EwUVuFtV :u1"V z,tFt^UVWE15tVY=uE6h@Y5S<}tGV N RPh4 *V vPh~ V1Y*6Ei\)5t-}t!V 9Eu~VY*6υtuhYYWh]YY_^UV s'>t6h`YYvh\YY^U4VWE=t=Yt5TYMU}tUR:;t EEURUR}YEUt]Ut]U}u }t }u]YUR:=Ur:Y}t-}UR:dUrYzURU}u URUuuV ƅt/tPuh# U9}urYvUR:(gUUUEE}FUR=;u}t.UrYE̋EU{uEԃ}uMuujYYU9UtGUrWYYUrYuErYu hWYYEU뱋URjRRY-ZY }thYJURWRuj2E؅t+tt`Puh U9tYW;Y~U:{GUE8t"z?{uF?}uNu; EU+@}} t }EuYU9E} u u$Yϋ}? ?\JxSZhPYYU9ukJx hj YY{hH YkhX Y^. j= uCJxSZ hPYYG\%GJx*U9t  Uh9t  PYYW}uT}uNUR:-uCUrhje t hPYhUY}]}t }t}uK}uUrhDYY}u UrY}u UrYid}uA} u;Ur|Yt+Ur@Y0+PV[YYK}1E|1t h<Ykh8lYYhX YG;Y/u#jjY E#h4ueYYuu$uYEtuhYYuuhIYYu Yt4Gh .YU9trhYYhY_^UUhh:YY=tU1=UV=t5hpYYVhYYV Y^U(VW}hjYYu1}}h4hYYjY9u~#U ΁fƅPjj y hYPx1ۅÉ=u9u~>=uBu VZY49Y=tǃ=ujY봃}jY_^Uh8jYYjDh8h =h$u3D=u4 1UVW} É]UJ15EUJ15fUUUh8uYY=h$Uց8fffVfVffVVV VVE} UN]EUց8ffN fVfN VVVVE} }UN]QEf#UfffffWffWfGffWfG fG WWWW1҉<8@_^UVfE@tU|9@j@1Uu@1h8PHYPYYu8fUtjFPu UB@xE^UVWUUiE9w rU+UډU95v 4}׉%+95vUUu1U/123456789:;<9=<th8W{YY=<+։15Eh$u 8 UU8E15փ}u1`U9=8th8WYY=8=h$u 8u8}׉_^UHVWu >/uE%fEUu1>/uF>u EEPEPYYU@t1N}>t>/tU9sFGEPYfEiEPEP YYR_^UV5Nx ^U=tu YUVHU9HwUH9Hv 16VPYt1'HrF5H&Y5H^UVW}u1E}UUs 1=Du8jY=u1V!փ5D5HFE5LOVU}9}r69v2W9UvUW~>}t ELu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=L<9}r79}u+UOJ}t ELURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15Lt 9ur6E0tU ULtU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPV yE^UVux95l\`^U$UUEPjjg y UL1UVW5LL}׃}~9r }y 9vWYu_^UVWuU VVuAYYDžt~~yVډF_^U$UUU UUUE,EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv  =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu ux ƅ~9})׉U U 1_^UVWu }z(~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv& =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu  UU Uhuu 7o ;FUSE] ![]USE] ![]USE] ![]UVWu} Mr6 u.uAfA(_^]UVW}u MW UW}E Mr/u'uĉ fE_]: UW}0))ϊE tu1_]XG_] UVW5 E_^]: L$ UVWM E_^]U$UUEPjj U$UUEPjj U$EPuzYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$EPjj U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEP[YjEPj1 Vd\5lhPjKjA ^Uu hT$u UV& T$@, T$@% T$@ E  uVuw ^U$EPj j y}tUEEU$UUUUU UEPjj{ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE  uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu0YY=u}t UډE1!,'"U< %EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ul EJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEE 5E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVP|YY=u}t UډJxUʋFF Vu4YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuqYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh$ hBYYjjYUVuPYƋU rU MJwU uRYY^U$UUU UUUEPj6j? U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P_1ۇttPXPedparams: %s: %s =[ =(){}; ;[ESC] :;boot=,Start Minixecho \ctrailermenumainecho \cMinix boot monitor \v\n\nPress ESC to enter the monitorleaderminiximage?c0?memory?chrome?video?bus?processor0ramsizebootdevramimagedevramrootdevCan't save environment The environment is too big =d =)(More? %s = %s %s = (%s) %s(%s) %s %s/%s ls: %s: %s ,ici%c %c Select %s kernel %c %s Hit a key as follows: %s %-24s- Exit the MonitorexitUnset variable or set to defaultunset name ...Schedule commandtrap msec commandShow environmentsetSave environmentsaveChoose a menu functionmenuList contents of directoryls [directory]Print the wordsecho word ...Delay (500 msec default)delay [msec]Boot Minix or another O.S.boot [device]Call functionnameA menu function like: minix(=,Start Minix) {boot}name(key,text) { ... }Define functionname() { ... }Set environment variablename = [device] valueCommands:Startup functionmainName of the kernel imageimageDevices (as in /dev)fd0, d0p2, c0d0p1s0Special name for the boot devicebootdevRAM disk sizeramsizeRAM disk image if root is RAMramimagedevRoot devicerootdevNames:(c}n8vmwq Try 'help' %sCan't parse:%s: unknown function:500[boot] [boot %s] [boot] [clear]special variablereserved word%s is a %s Missing '}' special functionreserved word%s is a %s trailer%s>Boot parameters editor. edparams: %s: not a bootable Minix device /dev/Usage: edparams device [command ...] unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0////11 0@ 1.2X2b1d2i2o2p2u2x23 2#2+2-2035L3h3l33E5G5X4b4cg5d)5e5f5g5i)5nO4o4p4r5s4u4x4(null)cannot print floating point x2.161мbootdelayechoexithelplsmenusavesettrapunset0123456789ABCDEFxtatmcamdacgaegaegavgavgamonocolor|pPH80 |`P@(tdT80lbootoptsSSSSBUnknown error l ` D 0  x d T D 4 t h X D (  PPPPPPPPPPthP4 lC  B1$T$Lsu;SSSSu QRP(PzU*=,u.B"=Bu7 EUuYPuj UVjEPjr ƅuh4YjYyH=u<=t/h,Y50YhvY jYE^UPVWE8uEE U} PYU85U9uPY80>>\u\)RWj 7hYhYhYF8?>%x)RWj5 SPMYRP>YCEP2Y7EP&Y+EPYEPYOF`F)RWj UU} oEU=Bu#=,t<=7u,E 봋U묋UU 9UsUM E딻EU:E _^U juhhhYh YhYEPj|YYu6U u$E-=sjhh; U0VEP^YEEjEPj: jY0uh jYsjj50 h50YYETjEPj  jEPj  U RjEP EEPY^UV5Nx 4^U=tu YUHVWEPuYYxU܁ t1hYƅu1VYDžU9uhhYYh(hYYGPhYYEPhYYxU uUM9uE]9pE]9`V/Y V!Y1_^#W{/NUVWiE_^]nU$UUEPjj U$U UEPud YYEPjj U$uYEU UUUUUEPjjV U}u UEu Yu] YU2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKV YE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3Wq }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuMYEuUUȋUUEEEPj;j R Y_^U$UUU UEPjj U0VWEPuYYy1U؁@t1hu7 YYDžy1EPWrYYxSU؁@u7jW YYEx& PjW} xh$YƅuUW6 YUЉ1FfFF_^U$EPjj U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$UUU UUUEEPjGjh U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$uYEUUU UEPjj| U VWujhL!YYEy(=t hDFP+YYrhFPuk EUuHYU}y VUj FPYYDžt)RjW h<VYYh8PYYh4PYYƆ$i[PmYP%P_YYh,0PLYY1_^U$UUUUU UEPjj' U7t. &t`kdVD$aÜX1PXR1ЅÃ"UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }UW}0ʀuA)_]UVW}u MCUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jwY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$9Ut*UUEPjjl y U1UVW5}׃}~9r }y 9vWYu_^U VWE}yA ƀ-]}uA ƀ0Z'~QEǃ}u~$G0A ӈE+UډU 뫡ƀ_^UVuHYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU `E UUU UEPj7jB ^U(VuU @t*u:YEU UV֋RUUUEPuYYU UEPjj ^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5 hjKjU ^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|U$} uEEUUE UEPjJjy y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP Yn: read error getty: nstmonHp{rWs9vc  %s Release %r Version %v %n login: getty: can't exec getty: tty name unknown /i3860.32Minixnoname/etc/hostname.file))),/usr/bin/login/bin/sh,SSSS/dev  31$T$LLsu;SSSSu00 QRPt PU VWu ER$Y=r,hRR#YZƒR#YYuEjjh 1# EhVu- E=t/}?u؃}eu |UNjUaƀ 붃tU9Xu&}u 5hh j Y}uXA XU=t,UUU:t-A=w -Eڃ}uAu"YP=YEuhh_ YYjYuuYYUU,uB Y(uR5hdh =,t5,h\h hXhYYjYU9XuhPjh` XB9UXhL4!YYuhHjh`K ;XhD4YYEu-X45h,h(X4ju U9XXh(40!YYuh h$h` EuXh4&YYEu*X45hhu-XX44u( Eu;Yt#}X/_^UVWEE=u =suoYƅt0=t VYEju5(Q t1=t$=!ut=!tu uYYuYƅE=t VgYEju5( tP1=!u} tu hYY=tuhYY=uVYEl=!_} tu hyYY=tuhaYY=uVtYE=tuh1YY_^UVW=8u>h)Y4u 5hhC jbY8548UM}GEJExEX@ u:Y=t u 4F묃u$UR u954u148UR54_YYEU5hhi EJExEX@ uY=t u408JMκ8U 4U8_^UVWu89@s=@R5<YY<u 5h0h jY=<-A=w -GFuڡ<_^UVWu }>SA\GFGFGF݊FGՊFGFGFH+FGv+G_^UU,UV5DNx ^U=HtHuYUV4U94wU494vP 16VYt1'4rF54&Y54^UVW}u1E}UUsP 1=0u8jlY=u1V!փ5054FE58OVU}9}r69v2W9UvUW~>}t E8u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=8<9}r79}u+UOJ}t E8URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb158t 9ur6E0tU U8tU9ru NJEtU9Wu RWE_^U$UUEPjjC y U1UVW5}׃}~9r }y 9vWYu_^UVW=\aU9X} XM :-uXzu XM h4YYuXXM \ǣ:tWuYYƅ}=Tt=E h0YYhhYYhWeYYhj WYYXM \\:uX\? F>:XM \C;t!A XM \C|XU9X|W=Tt=E h0YYhhYYhWYYhj YY\?`XA XM |\7XM \\:u\X|_^UVW}uhY1zU<@LHDh(YEPjAYYu10=L|hnY1`LRYDžuhDY1U<@W\HhYEPjYYu1GPGQGTGX]VN Y8|>uNOP>u GQ@GQUPEEt2>u"FPY9EwVUFPYEV YʋUWTUWX_^UVWE }t8=@ |hT&Y1U@U@RWY E1EP*Yƅu1t VWYYUuE #UE <:|uC<EPYƅu1VWYYUuE #UE 벃}t U1PYEPWUYYtuVYYV Y}t<<8)thDY16}u.<:t#:)uh4Y1h(Y1_^UVWEjYE1<:K:|tF:)tAEPKYDžu1<#UE u#UE  WVfYY릅uj YE_^UVWEPYƅu1< M}*t}+t}?tUE|Uu}?thlY1\}+t]}*uUtVj VYY}*uKVjAYYjYPVYYVVYYjYPVuYYj YPVdYY}+uUtVj YY}+uHjqYWV)YYVj]YPYYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWV YY<<:*t :+t:?uh`zY1_^UVWEjYjYjYNjEq<:^ujeY< jSYNj<:]t:-u<<PfY<::]:-g<:]t:u j-*Y‹<JA΋< MA9}hPtY19u| VYF<x<<PY^jY<:]th@Y1`<EMEPjYYDžu15#UE !h0Y1hY1<:uhY1jYǡ<<PYjYE <h5<YYƅh;Y1< M~}*t }+t}?uNEuEjGYDž~<<PfYNj[Y<<#_^UVW=HDu LMFFF5H_^U=HDtHHMLUVW=HDu L>=HHHU9} sOPMUY u MFFF_^U VW}Dt@uVEYDžt>u +U UU )UUˆFUڈ^_^UVutDt>uu FPYY^UVW}t} uhxSY1\thd;Y1Tt9u WTPV3 YYƅtwXwTV tFՅu1~}t U T TQt u WXYYPu Pt*GPPV YYƅt2VW1YYt FVWYYt Fu1_^UVWU PUXU(\}u(E }~MU]R&YtU EU PJ(1_^UVWuVFYEoT9Pj1xP:T1bP:u1PP0P9t1)W YE=~u5PW t1UPPP:tPFP YYu1PP:tPFP YYt1Pr-E=PuYtU X<u<M1F-E=PuzYtU \<u< 1U:t VU=PFP0Yt =PVtYƅt>t1EU:uJM> u1E=PFPYEU9U|;}tP]9uuYtLMUP181hHaY1"ueh4=Y1_^U VW15PUUnVxYljjU9YGF>tPPuYYt>GF>t5PuYYu#GFhY1U\5P_^UVWuDu1*VNu1>u _^UVWuU VVuYYDžt~~yVډPF_^UVW11}U9u F߃| jugYtUrYtURtUzt rfY}`t}xt}t uBY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvb =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVKMNOPQRSu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF`FF VVv vvq >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E cU :t! EE E :U uuuYYEy@Ut8huYYE~" tu_YuuYYE}y1]j!YEu u*Y1A!uEUMJUzUBUE_^UUUuuu  UVu JxUʋFF VuN YY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UU UhxuuV UVW}xE?t:JxG^FSX GVP YY=utF>uGމ+U_^U$UUEPjj U$UUEPjj U$U UEPuL YYEPjj U$UUU UUUEPjjg yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U S }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U( EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UX JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEExE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }H6~y UVu CV€tu ,fNV~xu>5|Yt.hYFu NLNHF 9hjYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhhYYjYUVuYƋU rU MJwU uR=YY^U$EPuYY1ۅÉUu hT$u% UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s: couldn't open %s r---%s: couldn't open %s r-- (%s)%s: bad regular expression%s: out of memory Usage: %s [-cilnsv] [-e] expression [file ...] e:cilnsvegrep%ld %ld:%s:%ld:%s:%s: line too long - truncated %s: not enough memory %s: not enough memory ()+?| ()+?\|: option requires an argument -- : illegal option -- --out of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be empty P$($)P*b+b.?b[\t^|Pinternal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parameter'[t577eeeeeeeeecorrupted pointersmemory corruptionm7Rmm"internal foulup!a!r w Z!+;!b1! ' &@&(X'b'd'i'o'p'u'x'( (#(+(-(0(+L)h)l))Em+GX+X*b*c?+d+em+fm+gX+i+n'*o*p*r+s}*u*x*(null)cannot print floating point xSSSSB`x  =p1$T$L su;SSSSu  QRPPU5 YPuhh $UuYjsYUVWj:u'YYƅt9uws EEGj/u (YYƅuu F>uN݀>tsFG_^U}tKujuu8$=t1UR t u :Yu hh # jYU}t#ujuuV$=t u YUVW1u@}u VUMjpju/& j?u YPu& uj jVx#EUR t u ~Y} | >u~tu hh " jY}tV RF Pu u}t= uh#Y }t#V VVu Rvv vh#V V  V ~u-VV UF uVU~|}|cuD@PtPLPu\XPthdPu hph !_^UVu }~5Jx1ҋFF VjYY=u uYM^UVWu} U+UU}JxGGSXWYE=u.W t u~Yuhh jYJxUʋFF VuYY=u u,YMeuVu _^UVW hpuYYEu uYEE E օLj:V{#YYEtEu,Pu"YYx4 0uhluYYDžuVZY|PWVj]EPLP 7EUUjp|Puuhuu NtW YPTN t.TuuWVXuuWVXTRuuWVWLYEu;Y=u u^YhH Y   R5 5 5 h,_^UVu]hPu uEEsPPuu^UVWuEPV YYyVYU؁uEEhxVqYYEuVIY}Jh4PVumjp4PdP[ EP4P 5dPjPjhtdPYYDžu dPY6t8<8PEPdPWm6 t>EPYU,VW} EEPhd5 uuu YYEhu YYEu uY71UiEuhjPtJ9uw"5uhh 1}uhRYYEF9uUR t uOYuY1thRYY= uhY +EEu07h7_^UVWU jRYYy u Y u hph  jYtdu hTYYh8YDž })h j.YYh YjYh j YYDž E1}u+ujgYYf*u= tuY fDž**uI,PuYYy uYh4uYYuYY,P*PP YYj/Yu ƅ,P YYj0PPJ DžPP 0LPujPP g0t [YЙ =vuhh  jYFDž$ 9$*u$6$R Yuuhh b jMY$R1Yʉ~uV9uFF$?FPjfYYhu`YYu u3YLPuj/PP .)ѻșB~5uuhh Nuh|h 9 j$YRPu :Yʉ~tLN 뮋9v+)ѻșu uPuhPƅUƅ9s0E8u w? thj P GƋ≕*uO PPu u&}uu uhh j YDž}uhWYYWWYZ׋EEj:mYYt Bthh YYj YDžDžDž PP uj Yu.+ RhWWW!YZ׃j,YYt + -A R=w - PhXWc WW}YZW9ch h YYj YEPjYY9v!Rh _^UVWUjRYYy uYh\u YYEu u YUEPrOYYxU܁`u%hPuu jSցvu h@h  j YPj YYhjPW VPu u`E8r8UR`Dž\\-0= vWhh  jY\\:u\vWu hh jY\W5Pp \Ƅ5 `j`YYXxhPhdX y `Yhlh TVv$`Wu hh jYƄ5#jTP5P ƅUƅPjYY_^Uh`h YYjYUVuu VYYuE>-tVY=t1.FU Z9u~xuU zeu1^UVWu }}h|&hvtYYtF PvaYYu!hvIYYtvY|/hv#YYtFPvv vj<g|,hvYYtFPvv vj6|,'h|vYYtFPv v |j(Y_^UhjYYjDhh =h$u3D=u4 1UVW} É]UJ15EUJ15fUUUhuYY=h$UցƐff4fV6fVf8fV:V<V @VDVHE} UN]LEUցƐff4N 6fVf8N :V<V@VDVHE} }UN]QLEft#UfvftffvfWf4fW6fGf8fW:fG LfG <W@WDWHW1҉_^UVfE4@t U|<9j1Uu1hPHYPXYYuƐfUtjFPue UBxE^UVWUUiE9<w rU+UډU95v 4L}׉%+95vLULUu1U9=thW9YY=+։15Eh$u  UUE15փ}u1`U9=thWYY==h$u u}׉_^UHVWu >/uE%fEUu 1>/uF>u EEPEPYYU@t 1N}>t>/tU9sFGEPYfEiEPEP YYR_^UV5 Nx ^U= t u0 YUVux95 ^UVW11}U9$ u $ F߃| jugYtUrbYtURtUzt r Y} t} t} t u Y_^UVWuEu41}%<$ t4$ YtEG֋E ~tV€uFu1V€cE~tVuډUjuv) =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<$ t$ Bt 4$ aYF^UVWu~y V0t VuN F[]^_`abcdefghtN V€uNVu+~u%hk YF~uN NF 1}9<$ t,$ R@t$ Bt 4$ }YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ^~y UVu CV€tu ,fNV~ u>5  Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvd =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvw =u N 3uvvl uNN N_^UVWEE11<$ tN|1DFρECEE0-EMP1E E kU :t! EE E BU uuu YYEy@Ut8huYYE~" tusYuu[ YYE}y1]jYEu u>Y1A!uEUMJUzUBU$ E_^UUUuuu UVu JxUʋFF VuYY^UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UU Uh uu Ujju E`UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu O+D$|$t1ҋD$t$ D$t$ YUVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]VUVWqE_^]vUVWMCE_^]UW}0OE uG_]1_]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV@ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$U UEPu| YYEPjjU U$UUU UEPjj1 U$UUU UUUEPj6j U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPux YYU UEPjjK ^U$UUUUU UEPjj UU$VWEP YEPEPj jT YƋ}t9uvE.EPK YEEPEPj$ W YUUjEP YYEP& YWj YZ)‰jEPj jEPj t9r)օu j YV YU)_^U$u.YEUUU UEPjj Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U H }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE` uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U  JxUʋFF VunYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЈ UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PCE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPRYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPnYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu1fϋV€t}u ~tu>FtVYU )uRv? EVt tfVV}u1_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^7KOUSE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uPYYUUas U EUh h fYYjRYUVuYƋU rU MJwU uRYY^U$UUEPjj U$EPjjy U$UUU UEPj%jU U$UUU UUUE<EPjGj$ U$} uEEUUE UEPjJj y}tUEEU} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$EUEPjHj Ã:UHVuUVUVUV UVUЋU UEPY^UVuEPCYjEPjq V5hjKje ^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P#1ۇtPXPinstallboot: %s: %s installboot: Unexpected EOF on %s iss aredata and text%s will crash, %s%s%s segment%s larger then 64K %8ld%8ld%8ld%9ld %s text data bss size installboot: %s is not an executable installboot: premature EOF on %s %8ld%8ld%8ld%9ld total ------ ------ ------ ------- rwwrinstallboot: Unexpected EOF on %s %8ld%8ld %s sector length installboot: %s can't be attached to %s r   %16ld (%ld kb) total installboot: Out of parameter space, too many images %s(%c){label=%s;image=%ld:%ld;echo %s kernel selected;menu} image=%ld:%ld installboot: Only one image can be the default trailer()echo \nInsert the root diskette then hit RETURN\n\w\c (Isn't there a copy of %s on %s that can be used?) %s and %d addresses to %s patched into %s You can try copying/reinstalling %s to defragment it installboot: %s + addresses to %s don't fit in the boot sector rinstallboot: %s has holes! installboot: %s is way too big rScribbling in 10 seconds%s contains a file system! installboot: %s is not a Minix file system installboot: not enough space after '%s' for '%s' and an offset to '%s' installboot: not enough space after '%s' for '%s' installboot: bad guide keys '%s' installboot: %s is too big rUsage: installboot -i(mage) image kernel mm fs ... init installboot -(e)x(tract) image installboot -d(evice) device bootblock boot [image ...] installboot -b(oot) device bootblock boot image ... installboot -m(aster) device masterboot [keys [logical]] -master-boot-device-extract-imageunknown error#a#r#w#B$+#$b$No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 00 U0@01X1b|1d1i1o1p1u1x12 x2#}2+s2-n202y5La3hK3lV33E5G5Xk4bk4c4d4e5f5g5i4n3ok4pk4rY5s%4uk4xk4(null)cannot print floating point SSSSB Unknown error@ 4   ` P < 0   | h X H 0  hTt t t t t t t t t t @( lT@(Cp   0((N1$T$Lsu;SSSSu QRP*PUVW} uYEG PmY9E~ 19u~P|7!;u }D7!=A|D7!=Z D7! D7!U9tAF뫀|7!;t 9ut+}t#Dt1u1_^U=thDh YY-=th(h YYhh YYjYU VWE E :t} у:/uE hYYu ,haYYu  }~ =u}t =u}~=t9uU :-Bu VZY:-u z:t=t=t:, hl %=t1놋=at9u Bu VZY=t9uBu VZY=t#Dž9u~Bu VZY9u~=u =e1:tN=A|$=Z 5FƄ5j+YY y hh  jY uhh YYjY=t+=t5 Y 5 YjYPYEt>=t*=tuPYYduYYuCYN=thh YYhh YYPhh  jY1_^U$VWDžDž=t5 Ɯ 5 ƴU:/u!uY=uDžuY9v#U:/tU+ GunY9tuaY-9uU:/u1+ƄBFP YPFP YZЉEF P Y EDžDžU9iEhhP EEV( Yg}Z=u=uu1PVPS u DžV YEuƜ:Z1_^UVWu DžFPu YPFP\ YZЉF PI Y u YHE8/t!AU/Uuhh% VYhh YYDž9ihhPa ADžV YvfDt1(~ u ~!u1 ~ u ~!u119~U =G1F PY9~E|>!;t>D>!=A|D>!=Z D>! D>!G뭋Ƅ/BƄFPi YihhS hPYYihhP VYƜ{_^U0VWuEEEFPYPFPYZЉEF PY EEU9U5iEhhP1 EEViY}E~ u ~!u1t'U؉AMD.=E~ u ~!u1t5U؉AMD.U؉AMD.=E1F PY9~H }C|>!;t<D>!=A|D>!=Z D>! D>!U؉AM؈DG몋Dt1tU؉AMD/}=t8F PYPh(h2 FPYh$h YY}؃}D= GEEPh h =u#Eԃ}|+EhhYYhhYYEV}YEuƜE=u}thhhYY_^UVWuFP.YHDžx ~hTh5YYkPhLh F^NPFSQRPh0h_^UVWURYEU RYDž=uYiEhhP& 19}.}& tPh\hh F΁EiEhhP 19}%}PhXh FׁEC_^UVuF ^ N V PF S^QNRVPFSQNRVPFS^QRPSh`h@^UVW}h8hYYh,hwYY1 sD7Ph(hY Fh$hDYYhh3YY1 sD7(Phh FhhYYGPPYPhh P YPhh hhYY-PYhhYYhhYY>PsYhhcYYhhRYYOPDYhh4YYhh#YY`PYhhYY_^UVW}hhYYhhYY1 sD7Phh FhhYYhhYY1 sD70Phhu Fh|h`YYGXP$YPhdhB PmYPhLh" _^UVdihhP    jhR& u / jh R u Frd|1^Uju5  u u5  E9E thh /YYj[YUUUVUƀt ։^UUJU ˉUU Z ˉUVu^9u F^9thh YYjYVY^UVuV V N щ^UVuN V N щ^UV1}5)UU9thh YYj*YFudY^UV5Nx  ^U=tuYUVWuEu41}%<$t4$YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<$t$Bt 4$aYF^UUUuuu h Kc L$ o U$UUEPjj U$UUU UUUEPjj yEU(VuU @t*unYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U W}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U|EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE Po E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF Vprstu@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVU9wU9vx 16VYt1'rF5&Y5^UVW}u1E}UUsx 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVD uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhdh YYjYU$UUEPjj y U|1UVW5||}׃}~9r }y 9vWYu_^UVuLYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډxF_^U$EPuYY1ۅÉUu hT$u USE] ![]USE] ![]USE] ![]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }KI|;u[u P_1ۇtPXPUsage: isoread [-a] inputfile file Usage: isoinfo inputfile Usage: isodir [-lr] inputfile [dir] lr %s not found FileDirectoryFile system not in ISO9660 or HIGH SIERRA format cannot open %s /isoinfoisodir directory %s: %s %8ld %02d 19%02d %02d:%02d:%02d%.3s %c%c%c%c-%c%c-%c%c%c%c %c%c:%c%c:%c%c Effective date: Expiration date: Modification date: Creation date: Block size: %d bytes Volume size: %ld Kb %cVolume id: %cSystem id: Format: ISO9660 Block size: %d bytes Volume size: %ld Kb %cVolume id: %cSystem id: Format: HIGH SIERRA CDROMCD001read error seek error Invalid ISO 7.2.3 number Invalid ISO 7.3.3 number M @&JX3bd*i*o!p3u*x3# #+- 0LhlEGXbcdEefgiEnkoprsux(null)cannot print floating point JanFebMarAprMayJunJulAugSepOctNovDecSSSSB (  8 J1$T$Ld8 su;SSSSu QRPh PU,VWu EE}V:-zE?t!VR7YYuWUڃ}y0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+h"}t}y UU_^UUUuuu ` +C_ U$UUEPjjo U$UUU UEPj%jI U$UUU UUUEEPjGj U} vhM E 1U} vhM ҋE!1UE1UE1U} vhM Et1UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEHuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PW E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu uL ƅ~9})׉U U 1_^UVWu }`~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UV< U9< wU< 9< vh 16VYt1'< rF5< &Y5< ^UVW}u1E}UUsh 1=8 u8jY=u1V!փ58 5< FE5@ OVU}9}r69v2W9UvUW~>}t E@ u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=@ <9}r79}u+UOJ}t E@ URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15@ t 9ur6E0tU U@ tU9ru NJEtU9Wu RWE_^UUas U EUhxhYYjYU$UUEPjjg y U, 1UVW5, , }׃}~9r }y 9vWYu_^UVWuU VVu%YYDžt~~yVډhF_^U$EPuYY1ۅÉU$UUU UUUEPjjw yEUHVuUVUVUV UVUЋU UEPY^UVuEPsYjEPj VX P 5` hD jKj ^Uu hT$u5 U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvU =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVW}u MU$UUU UUUEPj6jk U$} uEEUUE UEPjJj- y}tUEEUVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ0 tPXPTTOUTTINTSTPSTOPCONTCHLDBUSEMTTERMALRMPIPEUSR2SEGVUSR1KILLFPEIOTABRTTRAPILLQUITINTHUPkill: %d: %s Usage: kill [-sig] pid unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0i @BfXOb4dFiFo=pOuFxO? 0#5++-&0:1 L h l 7 E G X# b# c da e f g }ia n o# p# r s u# x# (null)cannot print floating point l |xtl d \ T L D<84 ,$ SSSSBl ((((( AAAAAABBBBBB Unknown error(xlH8$xdP@0lP<          (|hT<(C   ; \[1$T$L su;SSSSudd QRP~P2 U@VW1EEȅu=u+hUjR"YYƅy==ukE0jPV" uj0EPV" =0t=xVK"YjuEP# =tj5EP# Uu /"fEfEEP|"YuLtUhR"YYƅy=t(= j0EPVG" y=V!YuhUjR!YYƅy=ukE0jPV! uj0EPV! y=xVN!Yu+UjRq!YYƅy=c=ukE 0jPV=! uj0EPV! y=xV YtWX YPuhh4 _^UXVWju YYDž~2~"jPEPW VEPj! Wr Y_^UVWDžHP YDžDž jPj Dž<Dž8Dž4hxu u @=<tPDž<뽃4t6u4땃8tDž8x@h\h4  jYN @7U9}A M D DžDU9t<048,jYEԅujh@jI jYDtDEPYYujh8j jEPj EЅujY}y0=t5 YPh h4 ` jY}|UJDDž jPjf j<YEPYEPjYYu-=s1Et70t.Dt%^9t u E.t*}t$VRRh} YYPYYuE}hK YE܃=tjiYEuE}uE E}u(t$VRRh YYPYYuE}tFEPPuYYPYYtjhj jhRYYu*hEPYYtjhj j#YFPEPTYYEỦAM̍LLV :tWLP  8tUE8tEUU+ЙEjP&YYuhh4 DYYjdYEU9U}U ]Ehh 0YYEPh YYjh 5W hh,YYEPh,YYjh,5! hhPYYvhPUYYjhP5 hhYYHhYYjh5 UԃROY(t;h|hP@YY(rhPYYjhP5b hYFjPu huYYFPYFPYv^YDžE}jPu E5EPH@ ~uLDžHtEphhh[YYHhYY5EPH 5PYPHhHh4 jYDžDUj$hj Uhh4 YYjYUVWu} j=WOYYE)@E>tuW6 u}u܉>_^U VWUU URYDžu1u9v _^UV5Nx ^U=tudYUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95  ^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVW UUU UEEFt uWEEFt u:EPY(- Ph uZ u Yu Y}tju YYu Y}tju YYu Yjhh hh j( jB YbE*uE YjEPuj x}t u! YKhh u u Yx' 1 v N>uGu U 5  _^UVW=aU9} M :-uzu M hD4YYuM ǣX:tWuYYƅ}=t=E h4 0YYh4 h,YYh4 WYYh4 j YYM :u? F>:M C;t!A M CU9|W=t=E h4 0YYh4 hYYh4 WYYh4 j YY?`A M 7M :u_^UU`VW1jhHs YYDžy1<EPjj }t*EP YEE@EPEPj EPW YYEPEP P'UfUUfUUfUUfUEPjWt uqYPuj jPW ~ t }FƆEPjW W/YjEPj =tj~Y_^U=x 5YU=x=u j5 YYy'j5. YY Pj5 1U^UU$=u/hh5 1V =$u1<   $$= u$U$U$U$:u1$: t $::uҋUEUV=yy1u1txtjƅtjjV f LƅtjjV /t!yg$:X^UV%ƅt F9Eu^UV{ƅtu6* YYu[^U=x 5AYU=xjh-YYy'j5YY Pj5 1U((=u/hh(5Y 1V(=(u1< = u(U} t} u1UVPYt}u:#u1b5U:u1D: t(}t :"u*P_YtU>u1^UVUP'Yt:"uRjYƅt(>"t#=u1{0ʋ:"u;0jYƅu1C=u130=u1E^U=y _y1Du17jRYtjAYUVƅtu6 YYu^UVWuU VVu1 YYDžt~~yVډF_^UHVWEPuHYYxU܁ t1hGYƅu1VCYDžU9uhh" YYhThYYGPhYYEPhYYxU uUM9uE]9pE]9`V[Y VMY1_^UVj$Yƅu jYƅu jYƉ^U VWuYƅu1PjhXVy t18Et]3VYYu G1_^U$UUEPjj U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^Ud2E Pu ULVWE1EEU UE8t+0$YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE06YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W) }׃E뻋EEU9vGuYEuUUȋUUEEEPj;jf RY_^U(VuEEV֋RUV֋RU `E UUU UEPj7j ^U$EPjj U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjjw ^U$EPj*j] yUEUMJ1U$UUUUU UEPjj U$UUU UUUE#EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1Uu hT$u1 UV& T$@, T$@% T$@E kuVu ^U$UUUUEPj j y} tUE EU$UUUUU UEPjj[ UUUuuu  UVu JxUʋFF VuNYY^UVWu }E?t:JxG^FSX GVP YY=uEE_^Ko#?Og[kUSE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]T$ kL$ UVWME_^]UW}0OE uG_]1_]U}x}~uRPYYUVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVu|YƋU rU MJwU uR1YY^U$U UEPuYYEPj!j) U$UUEPjj U$EPufYYEPj j U$U UEPu8YYEPjj U$uYEU UUUUUEPjjz U}u UEuYuIYU$UUU UEPjj U$EPjj U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjjk yEU0VWEPuYYy1U؁@t1hu3YYDžy1EPWYYxSU؁@u7jWxYYEx& PjWa xh$YƅuUWYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$EEEPj.jR U$UUEPjj3 UHVuUVUVUV UVUЋU UEPY^UVuEPsYjEPjQ V5hjKj ^U$uYEUUU UEPjjp U$EPj jU y}tUEEUVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE6 uVuu+ ƀ}Xu9utUPg YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U\E EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ue JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE<UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEU E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu ud ƅ~9})׉U U 1_^UVWu }:~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hjYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvm =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhDh4 ZYYjzYU$EPujYY1ۅÉU$} uEEUUE UEPjJjI y}tUEEUVWuEu41}%/u=hthJ0#:/tHd9hudR50#AYY0#hAP50# hYZFu h^UVWu }fVfWfVfW FGfVfW F GfV fWVWVWVWVW _^UVURUl€t URUlt UR UEPMYƋpJpyh 5Yp2lt5lVkFR6vvv Phhht3 p 9U|:  9U~*lVkFRv PhXhtS3%kFvvv PhDht,3t^U VW}W Њ$ lW EG 9u щMG9 utEtR r-ƀtU€tW w-@t6W Њ U@t0W t=-EW tr-Uƀtw-UB@tx-UBE}vW tW @ts=W tW ts=W tW tt=_^U VW}u 0FDžNE уPE Y U9w_^UVE1҈UzwEPr{YYUJ1ƁwEPVEYYUkk =wSk 1ƹ ]SPYYEE. EPRYYUmyX>w#1]SPYYUmNk ?B@B1ƹ ]SPYYEE. EPRjYYUg^U VW}U26tEU6uEUE:tWYE8t EPY7uV YYօuUU}U7}u_^UU Mrq0YYUUM I9Ju1UM I9J~UUM I9Ju1UM I9J~UUM I 9J u1UM I 9J ~UUJ $U J $)ۉUuu  YYUVujfY>: W l@u+jrYt   9 VYiVYlt  !l€t   o jr9Yt   9 VYlt  VY^UVj$.Yuu.YPYP.YYF^UEE U EUUrYuYUVE0E^UVuF<.t1(a!>uaAFn@^UVWju ,YYyu HY1pu -YDžu u )Y1TW-Yƅt;tFPeYPYt׍FPYPuYYEUW,Y_^UVWu1t3V1V ?6ɉ_^UVjqPYEEEօtD}t ~u?D JD xX X hD V*(YY^UV1ltltUJ @u/} t1t-D JD xX X  hD Vz'YY^UVu U 9}~U ^UV1F E1Eu^UVW}EU 44#=~5D JD xX X hD j &YY ‹lt9}tGPFPh,Q) GPSYPFP YYEltKW1E}tuFPh$( uYPFPYYElt6}tWYPh (YYlt ElWYEP*YE}SV+UU}~2D JD xX X hD j %YYMuh(YYuFPYYl}tGPFPh' GPYPFPYYEl uN}t#G jP0YYPFPh ' %G jP YYP)YPFPVYYE}t&GjPYYPFPhC' GjPYYPG)YPFPYYE}t-G_VQPRh&tGSYPFPYYEM}twFPh& 0wYPFPpYYEW :}tW?YPhR&YYlt EwK(YE}t)wYjWIYYtEV+UMjW)YYtEURFPYYE}}U MEuVYY_^UV1}t FEU^UVW}U 4)JЙ} 8)=4'9u ~'E8)9U} t?E<4'F_^UVWu uYY}u)19u ~"E}}4#UEFً8)J8)E19u b4'ׅt4'uVW }u6} ~0<4#u1p4#U89U~1QF땃}oD JD xX X ChD j !YY0_^UVWEu}hD lY=lu }>rEPOYYh 50#$YYEy*} u = t rYV-YP Yh 6YY6Uj50#hYZxEPY} u!ltuYPh<)#YY}t} u4u>t,J @uVYPW_YY?Ӌ6u8Y4)ajCYu=4)}4)Ejuuf uMjuuM }tE}u,UJ @uEPYPWYY?ȍEPYPY뵃}UrY=au } UrEPuYYE50#EPYYu} tR=u-D JD xX X hD j YY50#h4!YY}u1PjuH Uj50#hYZEPYPY_^U VWu EUU" " j/6<#YYu hl5"YYt==G?t!Ph\N"YYt GڋR.Y>t-:-u&z-u zuPYjf!Yt#hdBYEt8-uEuYj1=YuPjC1YuDjl%Yu8=u$jMYujXYu jFYt h`lY=t h\XY= t jaYt hX8YjiYt ljsYt ljMYt ljXtYt l jtaYt l@juNYt ljc8Yt ljl"Yt ljgYt l8jFYt ljpYt ljDYt ljTYt ljdYt l lt%ljC|Ye=tjhLTYYEx+EPhTu* uU~ UJ8}t}t uYE>u+l uEhHYPuYY=~ul uEPYPuYYEU>ul t1jRYtPuu$ <_^UV5Nx <)^U=tuYUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW uYƹ<+F؉F+ډV YV YDžt"<1FF1V Y_^UV( U9( wU( 9( v 16VYt1'( rF5( &Y5( ^UVW}u1E}UUs 1=$ u8jY=u1V!փ5$ 5( FE5, OVU}9}r69v2W9UvUW~>}t E, u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=, <9}r79}u+UOJ}t E, URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV, uY_^U VWUUb15, t 9ur6E0tU U, tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EPQ+>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh$ VW ƅu1MWWYZ׀>/u0Fuh$ VEP ƅu1EEGu>t1_^UVWuE}>:tVh YY_   U $ U4 VY=Vh YYVh0 wYYƅ>-uF>+uFjVEP ƅUUj h0 5 Z 10 Vh0 YYƅpj h0 5  0 >t>,tjVEP ƅt5U>t'>,u"FVY=xwVh0 YYƅu_^Uh YPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuE $ E=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy5H x Yt.hlYFu NLNHF 9h>YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv| =tN V@FF t V 9ډUVVFt$jjva =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu T UU UhD uu2 UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu_wg3{oWUSE] ![]USE] ![]USE] ![]UVW}u MWUW}0))ϊE tu1_]XG_]JUVWeE_^]jUVWM7E_^]UW}0OE uG_]1_]UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N90uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVuYƋU rU MJwU uRYY^U$UUEPjj U$U UEPuYYEPj!j U}u UEuYuYU$EPj/j9 yEU$EPjj yEU$UUU UUUEPj6j U$EPujYY1ۅÉU$UUU UUUEPjj yEU0VWEPuYYy1U؁@t 1huYYDžy1EPW YYxS U؁@u7jW@YYEx& PjW) xh$Yƅu UWYUЉ 1FfFF_^UVWuu 1FQh^ SPe fF^1FfFV VF=uFF~u~. VffGVjRGP8 GWBVVFWB)ډfFWBV4_^U$urYEUUU UEPjjT Uu hT$uE U$EPj j! y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEJuVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UYEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UHyJxUʋFF VuVYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEhiE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP:YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPVYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh\ YYjYU$UUU UEPjj É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s: Out of memory Usage: %s [-%s] [file ...] %s: %s: %s %u%.3s %2d %02d:%02d%.3s %2d %d%.3s %2d %02d:%02d:%02d %d  . @ \ @U c Q `%s %*lu %*d, %3d %-*s %-*s %*u %s %s %*lu %*d %s: total %ld ./dev/ttyAqCLSOPTSlsSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error222222222No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0C B@BDXDbCdCiCoCpDuCxDD D#D+D-D0DGLEhElEEEGGlGXFbFcSGdGeGfGglGiGn;FoFpFrGsFuFxF(null)cannot print floating point 0pcCd?bB-?l?s???Oacdfgilnpqrstu1ACDFLMRTXcdfmrtxJan 19 03:14:07 2038JanFebMarAprMayJunJulAugSepOctNovDecdrwxr-x--xxgus1.2mGMTGDTU U |p  SSSS/etc/group/etc/passwdB, D \ )Unknown errorx`T8$xlXH8(xh\L8 |h\D(t`C ((((( AAAAAABBBBBB   I t)1$T$L su;SSSSu QRP P;U5 5X5 hdj=dtPUP= u =t?EPhYY=t( 5 jYY}u1EP? YU\VW1= ujjjhXj1k=dt =Xu.EPhDxYYt ;EPhdpYYhhd>@YYEy,jjhdh4jXX`jjhdh(jL 295 tBF t 9uV: t&vuYY=uvYNj6붅~uY=uub?Yu;  5 5X5 hdWh 1_^UZU VWhn9YDžjjjhjG5jYYj jYYjYj4 Y= t"j>Yjh>YYyj~8YjWW}> j8Yjj9<YYjj.<YYEP>Yƃt9uuG>EpEjYUujjWhjm U~ujjjhjK_^UVWu} yBWZy$95 tvJWZ~ 95 t6_^UTVW1u F} tE E tF}tEEtF FF}u=Tujjjjj5jYY}u5 jYYT TEPjYY}tuuYY5 jYY5 jYY}t5jXYY5P5LCYYjYtjjjjj_^UVWUJ kƋUzyG< u V!F1? tG< u V!F_^U VW}5 ELU}I 9U:P9U}U9Pt PvU9Pt P6} u8EP9=LuPV# E 9=Lt U}u VYYǣx OO OuU : tOЙ@EEtM}t9V UV u VRYY5PjYYjjV ==LU  5 5P5LTYY_^UVWUrJ k9u t>tF< u W!G_^UVWUrJ k9} ~2> t-> u$E+U u W9U |W!GFɋE8_^UVWu1t FtG_^UVWu }FGЄu_^UVu5   J9 }"9 } 9t 6 ω5  9U ~ E PP5 wYY ^U UBM ARQ5 EP EPjYYUjh59YY y h/YUjEP5 9 =t= u h YEUVWu}u uWYYy WVYY95 tJWZxjjV 6܃=\u'JWZx5 jKYYj jYY_^U`A `ЊM =`hu uHY1UVWu }>tFPWYY=u1_^U VWUrJ k9} ~F< u W!G> O> u$WUO}9}~Gj j.YYF~==35 jAYYF@PjYY5 jYYFPjYYGmOu> t~ u!PjYY}u5 jYYj jYY_^U=`1:5`h u6 9`tuY `1U}uj0Y`= t = u8,PhLh jjjhjzUh j3YY U jjjhtj9=ytjjjjj2j-Y5jPYYj jYYYjYj/YU}uhT j5 5 hT 5 5YYh0 5 q5YY6 f6 0 f0 H C F h j2YYh0 j5 5 UVu5 V5 hhr hYPhj4 =\u h 4YjYj.Y^UVu/Yƅu=\u hkYh`Y^Uuj1YUVW 295 t>vYVYv61҉PL1҉  _^UVW}1?t ?/uGuE~uuYF_^UVW5 EE X}u:= ujjjh(jEEd|uhd$YYju2YYyjjuh jJEju2YYEyjjuhjju2YYt X\}jjuhjhuYY=tWhV }҃= ujhV `  5 5X5 hduhu1YjhV-  j2YY 5 2jjjjj jY\_^UVWu = u9= u-hhh u1 , ~' ?u GF= u= =, +9uu)~ t=\u F  +U_^UVjrYƋU BReYFF uvYY^U V5 jYYEPhTj0 uUtUJJjw0Yu8}tjh4j0 ju*Y  jYjY @ Q }} jMYU rjYYU r0Yƃ=Tujjjjj= uVYjY= u U5 jNYY5 5 jj~5jYY5 jYY5Pj5L UU= u =t=j]Y5jYYj jYYjYh .Yj(YU}[nEP_XCQJCT</5l/.A' bLE5U VW1E}0|&}9 = uk NjU0Eԅuu/Y U4uP YƁujjjjj]JWZ~4= u+=TujjjjjuYjY= ujjjhj_^UVjjh=dt hdHYPja=yt#nt= ujjYYj Yjjjjjyunu1 ^UVW 295 tG6_^UVW} y 295 tv uhjYYhjYY5 jYYhjYYjj}YY|9uu} u 1E= | E=~~} u@MF} uhj[YYEPjYYhj=YYjjYY-E/ ^U}tju jujDEu!u YEPY=~UBEU=Pu5Pj5Ly PJRj5L_ U 9PuA 9 uR: t !55Pj5L PBRj5L U=Lu9 B u- 9Jt4#5Pjh LJ5PjR U : u, 9 t45PjhZ LB5PjR@ Ujjj- U5 jj U5Pjh U5Pjh UEPhYY=^}~UJ R1YYE9 ujju YPhjuqYPj5La UV195~>=tFP)yRjj# P)Rjj ^UV195~Q=tF5jYY5 jYYP9}Rjj PRjj ^UR5 YY9 u` j2YYjjh@ U RR: t55 DYY9 u)ً RQsYYP&YY5 jh U 9JtR5j`YY5 jYY9Pu PBPj5L] UE=t)=Pu1 PJPj5L% 5P5LYYU 9 uM      5jYYjj5 1U 9Ju |9 t  R  R  R jjYY5 j;YYjjYYjj5 P 1Uj YUVW MU 9Ju 9JE̳ z5 > t> t> t} t } t} u9t> t > t> uN9t> t > t> tN9t> tF5PVjF } uu5 V5 _^Uj YUV5 > t> t > t> tF> t > t> uF} u V5 5 5 xX> uB 9 t2G5Pjh 5 > t > t> uF5PVjf ^U : u)  r15 5 $ R5 5 5 U=Lu 9Jt |U : ug/ RRYZƒR5 5 5 NU : u!j dYU 9JuYj ZYUM h 5 5  =} 5PjYY9Pujj5 - 65P5 YY +PR5 5Pj9PuP PBPjj TLBOuLB5PjR\ .j5L5 LB5PjR, Ujjjh(j%E~*E=EPYjjjjjLjjjh j5Uj _Y 5Pjh UVW}uu YYƉ~7r _^UVWUzWYYPuOYZ=|jjjhDj 9} tGFU:t E FUz uu YPu u; u VYYUrYhY@PXYUBUhrYY1_^UVWu>V NJvOYVHY _^U VWuVUEEELU U 9UsEEGEuYE=|jjjhXjG}tETPWYYUEUU9Ut 9UtuYEE܃}u)v~Y=u= ~v6YE.v7YhJY@PYFhvOYYF t@jOVYZ)¹ЙE~#V 9U|F V +UV kEE}]}~5PjYYjjV $5P5LbYYj5LV 5Pjuy U U5P5 YYU+PRV5Pj5Pj}uE1P" _^UVjY=ujjjhhjkjVgYYVY^UTVEPhYYu=jEPYYƅyjjEPh|jjV YYVY^UVW5 =  DžPuYY=P5 V =PuYY=t#tPVJ 뿃u6PvVY  )ׅuR5PjbYYjjV 5Pj} uLPzYLP_ 5P5 YY9t  9 t؋ 9 u} u#+PR5 5Pj?} u5Pj5L @u"V YPjPYP 6 YPjj |jjhWYPj_^U`VWEjYE=ujjjhjEPh.YYhEP YYƅyjjEPhj[jjEPhj?hhu Dž~!WhV  9tV0YEVYu}Y}t!jj5EP5h_^U  jjjhjUj YUj YUjjjh`j_u5 5 55S_u555 5 .: jjjh@j UVW1 9uP 9u =u y 9s a W 295 t95 u95t695 t #=uu _^UVr95tFu>u1^U VW}u j YE=jjjhj9ut=PuYY=uuYF< u ?wu)Y=uuYouY } u6uYPju uYYP uuu u)jjhp5YPj_^U VW= } GPYNJGЄtFa Fjh YYthh YYE A |jjjhjeuEYW}ujh YYEx}u)hh gYYEy  `E_^UjhzYYUjhgYYUPjEPjujj=u1v}u"=ujjjhj81N}t EPhYYhx EP\YY=| ujjj5x j1x UjhYYUjhYYUVW5 DžPDžLPHuEP3YYEPY\!hEPhpPj`PjEPj7=5jkYYjYjv\ PL`P\V Dž\B%=t+\B%=tjW\I u9HHjYYjjV/ 9HH695 t} u = = ud`PEPYYLu#= ujjjhLjP} = u4PLEPh(PjjjEPjC} u+L|"jjhLYPjpjjjjj\5Pj5L _^UVWuURU U M9Jt E G>NB>&u)U RUU M9J vs E GF뽀>\u~tFFGh=YU Pr 0YZ=|jjjh|j|1RU r WYYUrYhY@PYUBUhrYYU-B_^UVWuYƅ5jIYYjYu 5 V Džu7= ujjjhj>jjjhj'W%YPvj jjjjj}_^UVW15 9ut 92tG6 92tXRuYY9 u1 29utG6 2 jVYY._^UVWuE -W YW6h _^UVW}?^u U BG2U B?*"*G?u.HU B U BVu KYY$@Vu $YY?u\GVUE t#]M EdEVE?^u GEE?]?uU BE 0/?\uGG?-ZOMGU@E9~U BE ]9|U@EG)_U B E G+UЙ]=uU BE iE }u EVU E#EGE)uU B E _^UVW}5 Uzu1UBqu(U WRu =N UBu;U M Wvui =uU M IU M uFƃ~tWvu% =u95 t = t1_^UVW}u wGtju Wu i}u1u > tF9u MwNjPWD t2= u'>t"wjVW t > tF1_^UVWu }uE8= )@>>  U#UUt eu}tF]9F]91F}>}F< r}tEFuPSW=u#EFuPSWu1EHhdiY <E}WVuuSG@t=Ur t> t >t1#U9ruBu u1 1_^UVWu} NuVuP t9u1_^UVWu}} t} u1DJWZ~&E 9uEt1Et1_^U jhrh  RB 9 t   UV5 Nx )^U= t uYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV U9 wU 9 v 16V,Yt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVu~  u 6EPYEU UEPEPV yE^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^U$UUU UUUEBEPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1;SwSWwUSE] ![]USE] ![]USE] ![]ËD$D$D$wUVW}u MkU$UUEPjj U$U UEPuYYEPj!j U$UUEPjjk U$U UEPu4YYEPjj= U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KV YE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0zYE܋]P3W }׃E뻋EEU9vGu1YEuUUȋUUEEEPj;j& RY_^U$EPjj U$EPjj U$UUU UUUEPj6j U$EPu*YY1ۅÉU(VuU @t*uNYEU UV֋RUUUEPu0YYU UEPjj3 ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V  5 h jKj} ^Uu hT$u UV& T$@, T$@% T$@ E uVu; ^U$EPuYYEPj j U$EPjj y}tUEEU$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|UVuYƋU rU MJwU uR}YY^U$} uEEUUE UEPjJj y}tUEEUW}0ʀuA)_]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP[buffer]Visit file:WroteWriting Cannot create Enter file name:Write not necessary.>Cannot open /dev/tty as fd #0Cannot exec /dev/ttyCannot fork./bin/shSHELLCannot open /dev/tty for read/dev/ttyCan't read one char from fd #0Write errorNo space on deviceCommand aborted: %s (File incomplete)Really abort? %s%s Error code %d Out of memory.File too big.[%d;%dHM Read Reading Cannot open New file standard inputNo file.Cannot find terminal. A.5<CJ$QX_fmAborted has been modified. Save? (y/n)[buffer]ss (Readonly)*standard input%s %s%s%s %d line%s %D char%s.%s Line %ds Buffer: %D char%s.DdsBad count ^I     Illegal line number: Please enter line number.Unknown control characterEnter control character.Line too long Line too longBuffer is empty.Cannot open Get and insert file: lines added.WroteWriting Cannot create Write buffer to file:Buffer is empty.Mark setA,+A,A,A,A,A,++,0 characters saved in buffer.Mark not set. characters saved in buffer.Saving text.Unable to creat scratchfile.Search forward:Search reverse:No previous expression.Global replace:Line replace: substitutions.%s %D substitutions on %D lines.Pattern not found.(Aborted) %s %s by:Substitution result: line too bigPattern not found.AbortedRegular expression too long75$5*26.5[t6\ 6Empty []Bad range in [a-z]Missing ]t:99 :!:Corrupted program in check_string() #GGGG O++EQ| '!M"M"+F0M" "#("<*30!'buM"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"=!M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"M"/tmp/mined.XXXXXXSSSS)   H1$T$LD su;SSSSu88 QRP,PUVWujEPV$ ǁsU:u9ut!hU fU>GfE>j>auUfUL>uuU fU1>guU8fU>ouUfUF덀>t>,u>>,uFE fE>f>uu@UfUUM U M сfMF!>gu=U8fUUM U M сfMF>ou=UfUUM U M сfMF>ruU$fU>wuUʒfU>xuUIfU>suU fUd>Xu.U @t U ItDUIfU1>tUfUUfUFOUtUM!сfMfEUtUM!M сfM<M!U ʁfUUt!UM!M!сfMU < U!ʁfU^E$P>FE_^UVL48jYf<<PYh`u u E=t0!`84DEU9P|1U9P}PA PM 4XY ։^UuPVYYj/PvYYu1u1h@PYYu=D@u1HPYhPEYYtFP5Yt rhPYYtPeYG<t9<ҁRPYYtP Y1UVuhVYY=4uVYh@VwYYu7D@u1HVYV.Yt khVYYtVjYL=8tAh@VYYu"DP58YYYPVYYtV Y1^UhdRYjYUV5<Nx d^U=@t@uLYUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+H"}t}y UU_^UVW=TaU9P} PM :-uPzu PM h4YYuPPM Tǣ:tWu YYƅ}=Lt=E h0YYhhYYhWYYhj sYYPM TT:uPT? F>:PM TC;t!A PM TC`PU9P|W=Lt=E h0YYhhYYhWYYhj YYT?`PA PM `T7PM TT:uTP`_^UVu>tF+URujI ^UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UVW5H\YNj5hpyYhnY}t.U:t&uYPuV  jhV WYPWV jhV _^;kUW}0))ϊE tu1_]XG_]UVWE_^]UW}0OE uG_]1_]UVux95^U$UUEPjj U$U UEPu< YYEPjji U$uBYEU UUUEPj'j4 U$u YEUUU UEPjj U$UUEPj5t|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjve =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UV$U9$wU$9$vH 16VYt1'$rF5$&Y5$^UVW}u1E}UUsH 1= u8jlY=u1V!փ5 5$FE5(OVU}9}r69v2W9UvUW~>}t E(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=(<9}r79}u+UOJ}t E(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV< uY_^U VWUUb15(t 9ur6E0tU U(tU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډHF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$ua USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u PO1ۇtPXPK+P-P=P8+B-=ym_yymm:pUsage: mkdir [-p] [-m mode] dir... : option requires an argument -- : illegal option -- -- : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 00SSSSBXp ((((( AAAAAABBBBBB Unknown error0$tP@, lXH8 tXD0p\D0C  Cd(^1$T$L| dsu;SSSSuT T QRP PU4VWj,Y] P3,YYE 11hu u! E= jj5 jj5 s` dh UF<E?AU+ uu M 4VYƋU+ tU+ uu M 4dY  M U9 h5'YY\ EPPYYEPPYYuvY95s hxuYu@Y%fEEPPYYu!YEuYEuYEC\ U9 }#jj5 ƅu hY1ǁ Nrׁ@r 1ǁ`r 1ǁ8r 1ǁr׋J׉15ǁvs hEY95s h2Ys h"Yv hY!fUEAEEl 5U J M 4tY=:JijP5( fdE2ffhhd5( =t hYY(JijP5H( fdffhhd5.( E=udE2uft hlYJijP5' fdffhhd5' =t hDYjj5' ;hjYYX X UEPuYYuuu fEEPUY=l u EPY=` tg1_^U(Vju&YY=u1KEPhdV& =ujEP&YYHUMV&Yhuu& ^U$VWU9sGfU f=u#UfV fFUVU BRYfFuYfF^Nك U JЙ=EMM X UJUUUJfVVJX fF =ufFUUfFh$UUiEF X PjYYEU9UvhuqYYEVFj5H YYjj= YY_^U E5j uEPmEPhEP4 EPhEP EPYEPYUVWEP P YYu؀>$uV YuYuYthh u"YY fPuEP` jEPYYPY>d 5j P4PhP EPhP EPYPYPY>bt>cueuYuY1}t uYiNj 5WRPgFju"YYy-5 YPu5hh P YY_^UVW1E95d1} Ƅ=GhPu " E~(uE X UPRYYFUU됃=t u | Y}tuuEP?} u\ > t> u> u F F1uUFE} t,}tBFPu WZYFE}tЀ} u_^Uh8\YlPPPPhExAPuYYuPu5hh jYU EPuYYEUu5hph m=\ t5\ h@h L j*YUUIMtEEU  E UVWPjmYYh)Y1}uPhYYF㍅Pj3YYhY1 }uPhYYF㍅PjYYhlY1 }uPhdYYFh\YfEU9=uPYYPoYY195q+BfUU9A=EPhHYYPh@YYPSh$ hkYYPh QYY@tPPNYY1@Mt(P Ph G뻉EPhYYPhYY SPhg hNYY h6YY@u]P 9YY1@s<t(P Ph GF3J5Rhx _^UVWUUE1UM׋Et1E] E_^U5hh  jYUhu,YYPYju4YYy h  YUu.Yuhu h1 CiEjP5 hu 5 E=t h$YUuYiEjP5 =u hXdYhu 5 =t h<+uF >-uEF-0= sk F-0߃}tډ_^UV5t Nx ^U=x tx uPYUVux95PpD^UVujuu V!^UVujuu V^UVWuEEEu} tE 0q tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf EY#_^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^UVW= aU9 }  M :-u zu  M h4 YYu  M  ǣ:tWuG YYƅ}= t=E h 0YYh hrYYh W5YYh j 'YY M   :u  ? F>: M  C;t!A M  C U9 |W= t=E h 0YYh hYYh WdYYh j VYY ?` A M  7 M   :u  _^UVWj5 3YYDžyhu^YYhhdW  Ehu+YYU}u'uAYh6Y5 *Y%WYd>tq tF1_^UVh5 RYYƅyh<uYY? -hPhhVf Eh(ugYY VY1^U= drU25 uYY - =_s  :u= ds 5 u MYY - =_s  :u= ds 5 uYY - =_s  :u= ds 5 uYY - =_s  :u= ds 1UVWuYEu wYEukYu`YƋ UUhr u5 YYU    u 5 YYU    u5 YY    u5 YY    1_^Uu%Yu Y5 YhPYUVu>tF+URuj ^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFlFF VVv vvE >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E TGU :t! EE E tU uuuYYEy@Ut8huYYE~" tuYuuYYE}y1]jEYEu uY1A!uEUMJUzUBU E_^UUUuuu \ UVu JxUʋFF VuNYY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UVW5 TYNj5 h Yh Y}t.U:t&uoYPuVP jhV@ WKYPWV. jhV _^UU Uh uu" 7Sw'WgD$T$@1ҋD$t$ D$t$ YUW}0))ϊE tu1_]XG_]vUVWE_^]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y UT1UVW5TT}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$UUU UEPjj1 U$UUU UUUEPj6j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjjk ^U$UUUUU UEPjj? U$uYEUUU UEPjj U$EPj$j U$EPj j y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE  uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UL ) EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U| I JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE, UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE 9 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvvO EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }x =~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvB =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv3 =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUh4 h YYjrYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ\tPXPr1bdi,lEoTtcFile system is too big for minor deviceFile system is too big for minor deviceFile system is too big for minor deviceInode count too largeInode count too smallBlock count too largeBlock count too smallCan't open prototype file%s: warning: FS is larger than the %dM that fsck can check! Block count too larger1b:di:lot...%s: Can't open %s: %s ...A.S.Tanenbaum HaltDirectory-inode %d beyond direct blocks. Could not enter %s File has grown beyond single indirectFile has grown beyond single indirectFile system does not have enough inodesFile system not big enough for all the filesinsert_bit called with negative argumentUnexpected end-of-fileLine too long%s: %s is mounted on %s mkfsLine %d being processed when error detected. %s: %s %d inodes used. %d zones used. Inode %2d: %s zone[0]=%ld %6ld uid=%2d gid=%2d size=%06oInode %2d: mode= Inode %2d: %s zone[0]=%d %6ld uid=%2d gid=%2d size=%06oInode %2d: mode=... %06o ... Zone map: %06o ... Inode map: %06o Superblock: can't initialize past 128MUsage: %s [-1dlot] [-b blocks] [-i inodes] special [proto] Can't open special fileget_block couldn't readput_block couldn't writeput_block couldn't seekunknown erroroh$@$hQ-: option requires an argument -- : illegal option -- --/etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite g*aT*r/*w>**+*b* : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 04 U4@45X5b|5d5i5o5p5u5x56 x6#}6+s6-n606y9La7hK7lV77E9G9Xk8bk8c8d8e9f9g9i8n7ok8pk8rY9s%8uk8xk8(null)cannot print floating point  ((((( AAAAAABBBBBB SSSSdhB Unknown error l X D 4 (  | l \ H 4 lP<( 4444444444x\H8$C  \H1$T$Lsu;SSSSu QRP PUVWu }}V:bt:ct :ptV:pu }tV:cu }tV:bu }tV:puE1TV:bua!Ev YEvYEUJ }~JU} Wuvt y&UhYUvY1_^Uh xYj}YUh4`YjeYUhLHYjMYUhp0Yj5YUVuj jVC ^UV5Nx ^U= t uYUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVu>tF+URuj ^UVW5YNj5Ph4EYhL:Y}t.U:t&u_YPuV jhV W;YPWV jhV _^G_bUVux95^U$UUEPjj? U$uYEU UUUUUEEPjj U$UUUUU UEPjj UVWuEu41}%0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUUuuu H UU Uhuu& ?D$|$tUVW}u M+ UW}E Mr/u'uĉ fE_]U$UUEPjj U$UUU UEPjj U$UUU UUUEPj6j U$UUU UUUEPjj yEU(VuU @t*uV YEU UV֋RUUUEPuYYU UEPjj/ ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE4 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }&~y UVu CV€tu ,fNV~u>5Yt.h0YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|rUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UUas U EUhh0YYjvYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVu5YYDžt~~yVډF_^U$EPuYY1ۅÉUu hT$u UVWuEu41}%-ZEF>t[?D<4,$ xF    u }tNj t 4=t =t  U 49}~A>+ttF<.uE}t E1UM 4>+uF>tO>.tJFEE=0| E=9~EPh\bYYjYUE-0묋UBM 4UBMI9u >builj_^UVEPYƅ9=ZuU=uLhuYYt9=uh|Y뗃=u 5Y5=tjVu =tj Vuz =tjVuc =tjcVu =tjbVu 1}UrF1UfrF^UVA t hY1U BЙ9~Ur%uPYYFhhY^UVA t hBY19u ~EUPPYYFhY^UVu} buhYjVYYuhYuhYy uhYd u hYR u hY@ u h|Y. |}VhdYYhVYjVPYY^UV 9 |#hhjY   9 |1? ] 9 | + 5 ^UVJVZtEE] E 9t1^UVW} u փ u փu փu hCY4u h1Y"u hYu h YWuYY_^UVW} uuVhYY: uVhYY&uVhYYu VhYY_^U=uuhYYuh vYYUhh@YYUV5Nx  ^U=tu8YUUUuuu  UU Uhuu UVuh} t1Pu V^UVWu} E}t}@t}t ~tVt v-Yft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^'WUVxU9xwUx9xv` 16VYt1'xrF5x&Y5x^UVW}u1E}UUs` 1=tu8jlY=u1V!փ5t5xFE5|OVU}9}r69v2W9UvUW~>}t E|u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=|<9}r79}u+UOJ}t E|URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15|t 9ur6E0tU U|tU9ru NJEtU9Wu RWE_^U$UUEPjjg y Ud1UVW5dd}׃}~9r }y 9vWYu_^UVWuU VVuYYYDžt~~yVډ`F_^U$UUEPjj U$UUEPjj U$UUU UUUEPjjW yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U P7}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEhr uVuu ƀ}Xu9utUP{ YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEАUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P#E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvY =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu u$ ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5<Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvY =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MFUUas U EUhh.YYjYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u U$UUUUU UEPjjs UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }KI|;u[u P1ۇltPXPbcdhovx od: cannot open %s Bad character in offset: %c * %c \t \r \n \f \b \0 %03o%04x%05u%06o%07lx%07loUsage: od [-bcdhovx] [file] [ [+] offset [.] [b] ]  @Xbdiopux #+-0LhlEQG<Xbc#deQfQg<in oprsaux(null)cannot print floating point SSSSB`   h`1$T$Lsu;SSSSu QRP!6PF;U5&?YPuhh2NUuYj;YUh!jPYYy hYUh!jjdP y hYU$h!EP fU⮁fUU܃fU܍EPjjP y hJYUht:YEtuh?YY=thdh7MYYj:YE "EPh`AYYtE0"EPh\AYYuh8hLYYj9Yh4@Y"h0@Y"EP"EPh,@YYE`"EPh(@YYEp"EPh$~@YYE"EPh g@YYFUJxUhu)HYYUEEEt uYUhRjuu h0"(A PB UA jRYYhRjh "dB }thRjhP"JB UhRjh`"1B UU=~#Ju =t-=}$= ~j7Yj/YhY UjjYYhRjh "A TUj5YYhRjh "CA Uu\8YEuh1YEU,VWfE} EPuLYYU؁`tCEЃ|VEЁuESXt)[ESXbEPuLYYj'YfUfVuMYPYF uv MYYV VFE<uEЃp} F6E=|+EЁ}ESXuF=u5v6"x=F_9| ?9=uWU>wUVE0FZ9}5F=u5""B=t "_^UVhJYƅu h'YVJYEt1h EP_LYYUREPMLYYjEPYYV&JY^UUzuUBU$VWtFaTTUBTU܋U$PYUPÜ$SzYZ9vU܉TBMLGF떾\䈃%F_^UVuVN ыE U JV?JM Q^U VE 15ƋE 1515EE 15UUM  UMQUJ^U=y*jPjh$AJ 6=u-=u$$$=y1$U(VW1҉w1sFGE}OU$Ex+Uu&UEPRAYYUMI JMUEPRYYURU9UrUE?UUU9Ut9щ1PѺY!ʋѻ1PѺYtEFv}uƄGGPhdFP> GPYPFPSAYYdW5Y15Ph`FPF> >WYE1515Ph\FP> 5ujYY$9UF FWYE15RhXFP= 5uYYF F5hTFPk= c5hPFPO= G5hLFP3= +WYE=u1 E15PhHFP< WYE=u1E1515PhDFP< U5R YYF FWoYE15R}u@<PFPW< U5RYY6F F"WYPh8FP < $$9Wvw YF F=tu WYWYEu1EPh4FP; ~ t'W W $ $9wW WRYtQF F@WOYPh0FP(; #vh$FP; FR=y~|h FP=YYFP=YE^ 9~EF F~|3F +Eu^S\S= F +EPj FP = F +EVUPj R< F DF%#U9uEPFP=YY~|F ^ K)ۉF ^ PSYYFthRjhP"k/ FthRjhp"O/ FPgYFthRjh`"+/ FthRjh"/ _^UV5xt V Y6^UV} u?5xtF6^UV}X9u9u9tW555555^U} ttXuU | %%^U}tUU9U w9Ur E1UU9U w9Ur E1U=t1=t uj YY=t1=x55Y"fRfU} yI"R"} nB]9R"B]9|>""} ~*B]9u"B]9¸UVUzu+$$s~u u$uU^UV=u }tE-$<$ujujYh]Yh*YJxSX h,Y=ytnuVYjY1yu@PX^U VW}U r Ezu E=U z-UUE %UUE %= %EE %0|9 0U>}ua|f WU$}AF|7U= %t UU1E % I%V Y %-t +uu YYU1uEhPjh5U1uEhPjhxU1uEj?PjhYH@-t +AxU}tUzu +uR EU܃+u1U R VYVUЙ}EF-t +VdYuFPYYFUUUU z t-t +~u jjV2 VU1uUE1uE1uEEEhPjEP     &=tt U ztU+V+V ډV UVVY~FUUUU zt-t +~u jjV2 V VUU1uER}EZ)‰UE1uE1uEEEhPjEPGU+VV VY~FE}uF ~uLU zt =tu-u jmYY%F u WYYjjV$1 U zt =tuF V VЉE1uUE1uE1uEEEhPjEPWU zt =tuE U+VЉF VY~uFU <BE_^UVWU+$9$195p%rU9%=t%u1$$9Ur%+% %+M9v'($9UtK%+%M+ %9wFp%=p%9~J%%OU%_^UVWU r =t=u1E}m= %VY=%3p%-t%V%(t%V V%U B D~jjV. VYF%=t%[xU}t1UB U Z 9uUzu ujmYYEU%u jmYY$9%u%RY$$9|r$9Wu RY wYW WRY=t%u&=tuW+V R`YW W+V RPYG15tEh}%U9$uEU15E$9Ut-15EuY=t%u$15PY%p%9%u %=t%u3=tu%%+V+V ډV %%V%%+VV _^UVWU r }>'=$~u =t~t ~~ VEPA=t%+UU=t u j\YY==x5*Yj$[Yh$GP@"RW"RWWW =EPh$U@r+YEPY"B "rqg+YY"MCj:r]ZY -$-"MCPr]ZY "RU"zu1"BU}t}u(=uUU%"Bu jr YY_^UV}<==t u j YY==x5.(Y5FPh$>"rY"NJ"NJVV VYu jr YY=u ^U8VWhu $YYƅu5HYVj jEPr%EȋV t5YVY} |}u }u}tVYiUUԁ~VYMjEPVl% UUVRju$V t5YVtY VkY!jYWu h% jY_^UTVh5EP' HUM=?EPhd5^& y huuuuЍEP&HUMuuhuuEP&p0&1PEP&YYHUM&EPhd@5% y jj5% =nijP5{% =uBzhh"5j% )hh"5% E;=?r'A%EPhd@5$ y^U VW}r=jYhYU "hRq $ = u1҉U "Rq w$YYy[jGY5Y"Pr h# jhY=/5#Yj1Y}u%jY"r h"YYjYhjh"F% jYEjY}y;53Y"Pr h|Z" 5@#Y}}"rhh#"YY}jnY}}Ej@hZ$h$n$ $uF~=$Uu =$t[hjh"P$ hh"YYj@jh$.$ jY"rhDd!YYjYLׁǜ$=t!ttuGW1$F=tjYh Yj,Y_^UDVW}wt }@=y(=u4}wjY"rh(o YYjY=$Uu =$t%jUY"rh3 YYjY=tj'Yh Yj`Yj YhYhDYJxSX h,Y=yt ntuu h\YWYjYnu}u yj@h$EP! uU9g~ujjV! MvFPYYV VRFPYY=t!v~t~uZ)‰Vj@EPhZ$M! $U$j*Yy5jY5eY"Pr h jY _^UVW}sKhYjQY5 YPh+YYj|Ys=x 5Yjh|h =jY5 YPhlYYjYj YƻX}5jj YYEjj YYEjj YYExEPYDžx9uuj YYuj YYuj YYRx&Uuu j1Y u j CYY_^UTVW}p=j@hZ$EP] 1MjYEPFPOYYuuuFPt* BPRhEPFPYYV R=tuF VV Pvuuuh:j YGMj0Y"rhYYj _Y_^U}qt}xu2=t u jYY=t UV}?s'jYv6hH jYjYh8,YhP"!Yh0Yh`" YhYhp"YhYh"YhYjcY0}!u*sjY6Yj6Y^UVWu }VWYYVWkYYVWYYVWYYVW\YYVWYYVWYYVWYYVWFYYVWYYVWYYVWYYVWYYVWYYVWYYVW*YYVW1YY_^UVW1|B |Z PSYYhVYjEPj( y h,YU}-u+kh 1[u1Mh6j/k(l!H-+ *11 1Eh!jkl 1_^U=u$E5|uYYtUVWjjjjjaj jjjjMFj j%jjj2Fjj4jjjFxjjjjjFpj jjjjF`j j&jjjFPjj8jjjFHjjBjjjFjjNjjjuFDjjjjjZF4jjjjj?|jjjjj(jj(jjjF $jj-jjj F $jj1jjj F $jjjjj F $jjjjj F $jj"jjj F $jj(jjjrF $jj-jjjWF $jj1jjj<F $j j;jjj!F $j jEjjjF $j jOjjjF $E$$CjjujjƉ~ jjujjƉ~ jj ujjƉ~ j j ujjoƉ~ jjujj WƉ~ jjujj ?Ɖ~ jj"ujj 'Ɖ~ jj(ujjƉ~ jj-ujjƉ~ jj1ujjƉ~ j j;ujjƉ~ j jEujjƉ~ j jOujjƉ~ EEU9U}UM j4RYYE=uE Er=t)5|uYYfj9Y_^UVuxډ^UV5Nx x%^U=tuYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV!U9!wU!9!v 16VPYt1'!rF5!&Y5!^UVW}u1E}UUs 1=!u8jY=u1V!փ5!5!FE5!OVU}9}r69v2W9UvUW~>}t E!u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=!<9}r79}u+UOJ}t E!URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15!t 9ur6E0tU U!tU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPV yE^UVux95|^U$d9Ut*UUEPjjd y Ud1UVW5dd}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^UVW}u eYfE=hYEu EPU:/tHhYEt/u uYYuhuW Ehu" YYEuE+UMuRQ} uuY1W~Y-E8\titF>#tEPVu l u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1itFjuV uˀ~#uōFPY^UV5t}u7F<:t ~u1&itFjuVt uθ^UVW5E 8t}u1F<:t ~u1itFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F $ H#GF9GE UE 8E_^U VW!EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EU`}"U FE!_^UVuu>t FPUY^U$UUU UUUEQEPjGjx U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW11}U9u F߃| jugYtUrZYtURtUzt rY}t}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv# EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uF!FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }H~y UVu CV€tu ,fNV~u>5 Yt.hLYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuu YYEy@Ut8huuYYE~" tuYuug YYE}y1]jAYEu uY1A!uEUMJUzUBUE_^UUUuuu  UVWu}E} LU9U@U UJxFFSXV YE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuuT EUJUx ]E EPj YYEUuu huSk3w # O D$T$T$T$ T$PD$T$T$T$ P1Q+Q QQQ +QQQÉqAAD$T$@1ҋD$t$ D$t$ YL$D$d$ QÃN USE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]UVW-E_^]2T$ L$ UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0itFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj U$UUEPjj U}u UEu0YuYU$U UEPuYYEPjj U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKV[YE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W= }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuaYEuUUȋUUEEEPj;jr RY_^U$EPjjE U$UUU UEPjj! U$UUU UUUEPj6j U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u:YEU UV֋RUUUEPu YYU UEPjj; ^U0VWEPuYYy1U؁@t1huKYYDžy1EPWYYxSU؁@u7jW4 YYEx& PjW xh$YƅuUWVYUЉ1FfFF_^U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGPp GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V!!5!h!jKj ^U$u>YEUUU UEPjj` U$EPj$jE Uu hT$u UV& T$@, T$@% T$@0E S uVu ^U$EPjj y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U H }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE`J uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UYEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UyJxUʋFF Vu>YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЈUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEEiE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP"YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP>YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh*YYjYUVuXYƋU rU MJwU uR YY^U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P 1ۇtPXPpart: %s: %s memdsesocolipart: This terminal is too dumb cmcdpart: Can't get terminal capabilities TERMType '+' or '-' to change, 'r' to read, '?' for more help, '!' for advice.../dev//dev/devmust be correct when the table is written or the system may not boot!between the two geometries to see what is best. Note that the geometrythe %ux%ux%u geometry implied by the partition table. Hit 'X' to switchThe %ux%ux%u geometry obtained from the device driver does not matchWARNING:The geometry has been guessed as %ux%ux%uNo driver supportFailure to get the geometry of %s: %shMib%??? %d ??%lu%lu%lu%lu-1%lu%lu%u%u%u%lu%lu%lu%02Xps%s%d%d%c?Size in kilobytesSize in sectorsBase sectorLast sectorLast headLast cylinderSectors per trackNumber of headsNumber of cylindersStart sectorStart headStart cylinderPartition typeHex partition typeActive flagSelect device8USizeLastHhcjklDo you wish to modify existing partitions? (y/n) D 5+- " "1 " H]fs$ - :  % O#O#O#d#d#d#O#d#d#%s: %sDoes not fit in a boot sectorNot an 8086 executabler+++Warning: You are in an extended partition.%s: Invalid partition table (reset)%s: Unexpected EOF%s: %s%s: Readonly%s: %s%s: %sDELSave partition table? (y/n) You have changed an extended partition. Bad Idea.Warning: About to write a new table on %s%s is not changed, or has already been written2z11/bin/sh: %s sh/bin/shcan't fork: %s (Raw dump of the original %.40s table)%6d%5d%4d%10lu%10ld%9lu%2d%c %02X%15d%5d%4d is not really a problemthis must be checked, but thisThings like %-25s - %s* To study the list of keys: Type '?'.* To make a partition active: Type '+' in the Num field.* To delete a partition: Type a zero in the hex Type field.* To reuse a partition: Change the type to MINIX. head or sector numbers. partitions that are not padded to cylinder boundaries. Look for highlighted interesting values go by. Note: Other Operating Systems can be picky about You can hit 'm' more than once on a base or size field to see several a cylinder boundary. Hit 'm' again to pad it out to the end of the disk. partition and type the size. Hit the 'm' key to pad the partition out to* To make a new partition: Move over to the Size or Kb field of an unused* To change any value: Move to it and use '+', '-' or type the desired value.* Choose a disk with '+' and '-', then hit 'r'.Answer "yes", "no", "cancel"y n DELRaw dump / Shell escape / Quit / Exitp s q xRead/write partition tabler wShow "Size" or "Last"spacebarCycle through magic valuesmBack to the primary partition table<Start a subpartition table>Redraw screenCTRL-LMove entry up/downCTRL-K CTRL-JMove aroundhjkl (arrow keys)Enter value0-9 (a-f)Select/increment/decrement/make active+ - (= _ PgUp PgDn)This help / more advice!? !~65= 6_5n6A?686F616n6n6n6M6n6n6n6n6n6n6n6n6n6n6T6[6T6[6n666b666666stdinNum Sort TypeKbBaseCyl Head SecCyl Head SecDevice------sectors-------geom/last------first----unknown errorr/etc/termcapTERM/etc/termcapTERMCAPC 0dC1dC2dC3dCE4CbTCf\Cn}Uu ^VƬt /dev/hd? None active Read error Not bootable NoneFAT-12XENIX /XENIX usrFAT-16EXTENDEDFAT-16HPFS/NTFSAIX COHERENT OS/2 FAT-32 FAT?FAT?EXTENDEDOPUS@VENIX286BW2000 DynRMICROPORTc386/IXdNOVELL286eNOVELL386uPC/IXMINIX-OLDMINIXLINUXswapLINUXAMOEBAAMOEBAbad386BSDBSDIBSDI swapSYRINXCPMBADBLOCKS|p\L < 0    Sized H 4 x t P L 0 $  d  | 0 H , |TSSSSB% ((((( AAAAAABBBBBB Unknown error(xlH8$xdP@0lP<llllllllll(|hT<(C  < \J1$T$Ll< su;SSSSu\\ QRPH WPU5pYPu5\ hhUuYjYUVWT X ׋E1ƋU JE15X  ыU JE115X U _^UVW}u1҉Uֿ@T X ыE1ƋE15X T )ډUE15X WuVh2_^UVWu- ǹj=`uh<Y`JЙPh4YYv#YV VRYV Rv vh _^Uhxh`YYjYUVW1j:u$YYu@ t 5\ hh jYE u= u   EEEƉ0 w0awW Aw7UU뺃:tEEE-0= w0kE ЉEE*u M +uMEE܃ut= u"j5\ hhjYU  Ȉ U  Ȉ  ЋU쉐  _^U VjuYYƅy uYEPhdV y ukYVYhuu | huu UP UT UX =d u=| u1p ^UVWu=p u uX T X Љǃ} tJV V V1+FF _^UVW1| U U  s+UVjVlYYV UU+V Ut̓}y2=l uMURu5\ hh jYtUW jWYYX  O~ujjVN .FPvYYV VFPRYYVvY_^UHVWfEU1}'BЉ PDPvFjuYYDžxHjhWx =t1j@EPWr xjEPW_ x W2Yy uY_^UVWE j/0YY\ u ] \ \ 9uuU :-fBu VZY*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UTEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U5JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE4UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEE% E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }hV~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^rUV@ U9@ wU@ 9@ vp 16VYt1'@ rF5@ &Y5@ ^UVW}u1E}UUsp 1=< u8jY=u1V!փ5< 5@ FE5D OVU}9}r69v2W9UvUW~>}t ED u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=D <9}r79}u+UOJ}t ED URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15D t 9ur6E0tU UD tU9ru NJEtU9Wu RWE_^UUas U EUh<hYYjYU$UUEPjj y U0 1UVW50 0 }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVu5YYDžt~~yVډpF_^U$EPuYY1ۅÉUu hT$u% UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MCUVWqE_^]UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }{sƉKI|;u[u P1ۇ4 tPXP%s: %s: %s %4d/%02d/%02d %8lu %8lu %7lu %3d Part First Last Base Size Kb Usage: partition [-mf] device [type:]length[+*] ... %s: too many partitions, only %d possible. %s: Two holes can't be adjacent. %s: %s is %ld sectors too small @af4mr(%s: -a is not yet implemented %s: -r is not yet implemented unknown errorNo such connectionAlready shutdown')*No connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0  e @ X b d i o p u x  # + -~ 0 Lqh[lfE%GX{b{cde%f%gino{p{ris5u{x{(null)cannot print floating point L SSSSBtUnknown errort`L<0 tdP<(tXD0          dP@,C   P1$T$LDsu;SSSSu,, QRP P6UVW1}t}thhxYYjYU RU:-u&zbu Uzu4FU U:-u0ztu*Uzu!48FU U j4YYEy U 4hphx1 j\YijPua i0PhuV Ei09]uJ=0=0=2n0_}yb=0t0W= u 5 hHhx\ jY <g=0 Eǃ=4tWYhDhxYY=8t Wh<YY= t =8tj YE=4t h$Y195 ~a=4u}u5hYYE4gh YYBЙuhzYEFheYjrY=4 2WYU5 uhhxhxAYUV5<Nx ^U=@t@uYUVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu \ UU Uh`uu: 3cU$UUEPjjk U$UUU UUUEPjj? yEU(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjw UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 7}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEruVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U$EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UT JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEEt E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }@~y UVu CV€tu ,fNV~`u>5dYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUh hxYYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$EPuYY1ۅÉUu hT$u USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }KI|;u[u P1ۇtPXP %6ld badblocks %s Summary of bad blocks %8ld %ld Bad blocks is too many. Exiting %s is not readable Usage: readall [-b | -t] file %8ld blocks read, %5ld errors  1@fXsbXdjijoapsujxsc  T #Y +O -J 0^ U L= h' l2 [ E G XG bG c d e f g i n oG pG r5 s uG xG (null)cannot print floating point SSSSBH`x  !( J1$T$LX( su;SSSSuHH QRP4 PU5\YPu5< hhUuYjYYUVW}E}1zuBzu%BI9JsVBztHREP< BRQ! BEPR FiEU_^U0VWj/5@  YYƅu5@ F+@ ׁv&5@ 5< hXhj8YW5@ h( e hPYEu hHYuYEhP( P?YYEPh( YYuUԁ`tUԁ uE]9uu]Yh( %5@ 5< hhjeX_^U,VEPYEju!YYƅy>u} ud@dPV E\UVYU\E^UVWuX \ U1u115\ R1u15\ P1uPhx+_^UV=LuGuYLhY95L~hxj YYFhYuhYYuY95L~hxj rYYFu YUU RYURuu hn^UVWE j/0IYY< u ] < < }|}~ 5< h(h jqYU R@ UJM L1}u@*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U W}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UDJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEd E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }T ~y UVu CV€tu ,fNV~xu>5|Yt.h`YFu NLNHF 9h2YFuN!NF V@uVVVhUFt$jjvv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvg =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UW}0ʀuA)_]UV, U9, wU, 9, v\ 16VYt1', rF5, &Y5, ^UVW}u1E}UUs\ 1=( u8jY=u1V!փ5( 5, FE50 OVU}9}r69v2W9UvUW~>}t E0 u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=0 <9}r79}u+UOJ}t E0 URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^U VWUUb150 t 9ur6E0tU U0 tU9ru NJEtU9Wu RWE_^UUas U EUhhYYjnYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVu\YƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډ\F_^U(VuEEV֋RUV֋RU E UUU UEPj7jb ^U$UUU UEPjj= U$EPuYY1ۅÉUu hT$u U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€c9;<=E~tVuډUjuvE =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s: %s: %s %s: Can't find partition devices associated with %s /dev/dev%s: %s: Name is way too long %4d/%03d/%02d %8lu %8lu %7lu %s first last base size kb device%s: %s does not contain a partition table %s: %s is not a device Usage: %s device [partition-file] unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 @Xbdiopux #+-0LhlEiGTXbc;deifigTin#oprsyux(null)cannot print floating point 8 SSSSB`xUnknown errort\P4  thTD4$tdXH4xdX@$p\C   X1$T$LXsu;SSSSu QRPX PU VWu >}}%hYWYhYjrYEMtD6:YtUWjYh_YU6vYE뷋E_^UV5Nx `^U=tuYUVu>tF+URuj ^UVW5YNj5h)YhY}t.U:t&u_YPuV jh V W;YPWV jhV _^G_FUVux95T$H^U$UUEPjj_ U$EPu YYEPj(j7 U$UUUUU UEPjj  UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv" =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUU UUUEPjj yEUSE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu }: dir... Usage: : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0\SSSSBUnknown errorx\L4( t\L@, tdL<0  8888888888lP<0l\H4C  @CHD1$T$Lsu;SSSSu QRPy P(UUHU LL =HujYHJHLL:-Y]Y뵋HI Hj\YLLh82-YYDu"L2hh '/ jY5DH'Y<Y1D&LBPhh. LBA=Lxu/LHYdYL H=Tthyh$h ^. jKY8 LJ?j*Y1UH:u!yyHRYH: t: uHH:t:#uH:tHH:;uH놋@9<v!hyh(h - jyY@< LRdY<=uhyhh J- j7YL <9 u:=Pt P %hyh8h - jY=<uL<LLPH:,t :;H@9<vhyh(h , jpY< LQR\Y<=t =<uhyhh 9, j&YL <9Ju PJLRP LB@9<vhyh(h + jYH: t: uHH:!uHLBH: t: uHH=8| =~-8\UuhyhXh 8+ j%YE%LB EuHHHPYLL(rhyhh * jYH: t: uHH:h:;_:#Vhyh h j* jWY2UVW yLJ1LBL TCT\yLL(rhyhh ) jYnL:thyh@h ) jYTJTyhyhth x) jeYT\y L Lzhyhdh *) jYL:thyh@h ( jY< 4R Y<54+ Yƅt+~jhyhh ( jYI4B544 4 rhyhh [( jHYLVH: t: uHH:u@8RׅtWUt}LW8 LJ< 4R Y<54 Yƅt7~tLNJ>~WUt}LW4 LJ4B4 4 hyhh ,' j YLzthyhdh & j YH:\uH: uH< LQR Y<YLBxGHHME< LQPRYY<=uhyh h T& jA YL <9Ju PJLRP< LQ9@shyh(h % j YELPrYY<=uhyh h % j Y=YtLB@LBH:gt:pt :P`H:guHLB@LBH:puHLBH:PuHLB뇋H:wH= |hyhh $ j Y< 4yRY<JU}xKU<4yt9 44y44y&YYuU L yQ1M믋h44y"YYLBu'44yhh $ j YL Cr yHH< LQPRYY<=uhyh h # j Y@9<v/hyh(h t# ja YE<51_^UVWu=HG=\u;G0X9~=98FEˀ] 9uF=H Fu_^U4VWuHUH] 9uHEEU߉U1҉XUЋU1=^uCFtEU9wUHWEE] 9u&UHU9Ut )F* uEE=(uE=X |UHU؋ X E FXA XF?)u2U9UwUHFM؋U؊ FE1|%9 19} cFF uUH=nu tu r UHFy}U:uUHU BU] 9 F'UN9rhyhh h jUYFEE1=^uCEt ]ENjUUuhyh h  jY-uGU9Uv?U:]t7BNjU9~'U! ËÜGσ\u/EE=nu tu ru U! ËÜEE=]#}t$E}}UԉU5Eu%ÜFF~1_^UVWuN=Y=YYHI HjYLL:GFЄt>>\u!'GFuyM> u=y5y!=yu GFЄtF>\u)'GF=0uy> u=yyDD:xDX@ 5DYE=`F=\u=DD:xDX@ 5DYEFv> m F_^UVWuH:$uFFHH:/t:\u-H:\uHHHPVYY=HE=0|=9Gk] Ã0]9=Hs_FFA M D=|hyhh  j YF=H1_^UVW}5H> t> uFF=\uF?u N5HG? u > t> uFGu‰_^UVW}589s>t76YYu 1_^U VW58954M~u6hh : j'Y$~t~WUt VW}VW _^UVW5Hu] 9t>\uF> t>u FFEE%] 9X\uU:nuE FU=\u>nu U FU] 9t U:uE] 9t3F5H1}U:u UGߋU_^UuYU VWhy*YE= Y\ix~ tHVYuVG Y=iu(= it iVօux벃=D}=ipy9=Yv6JxSZhPYYG‹Jx hj YY= Yvi_^UVWE8UrEzo>>uCVU 9 DUBU 9 DEjVYY}UBq?u=i_ES?u,WU 9 Dt E/t+UB"jW5YYt tUBEUzt 1}E_^U VW} t4U:t1y\YGFЄu5i5iyi}Gt+5h?uG9t1lWViYY^?u6OM]9uWVEYYt 5h.Fu1#WV YYt 5h Fu1_^UVWu} nGF9^1eFL1S><1C5i3F%E]Mt1G48iG4i8iUGi+UURVu t u18iUGi+UUuuVuS t u9uw$WVYYt ?Uډ1+uFtCuF9tG0uF%E]MuփN9u?u7OM]9uWV(YYt N9Er1?u>G8i M]9uWVYYt aN9Er1U95itWVYYt9N9Er1-OPhxh @ j-YG&_^UVWujvsYYti19hu@vYY1N~tCi:t8tijv&YYti19hu@v Y뽸_^UVWy\Y9=hvGFUUEEE}&u5i5hV ͋U€t7e}1|-}:}'U1M14i48iV 뎺#UFhwhh YYa=i-\YyiGFЄthrhh YYؿy\YFGЄuWY_^UVWu} 9}v!GFhrhh @YYډ_^UVWu }OG3- =_s%JxPFFZVP YYJxFF\Vj\ YYJx FFbVjb YYzJxFFtdVjt YYUJxFFn?Vjne YY0JxFFrVjr@ YY JxFFeVje YYPhV |#Jx FF Vj YY_^U9tZhh YY5}tPh z hhIKLMNOPQRSTUh c UVWU=\Yr5hh  iUzt =icUrhkYYLiAy׉ր> tF1itFFGЄuWY i5hhi ydiGFЄuVYYY 5YditvjIYF GFЄuݍVYjdiyGFЄuVE 5yyvjYF GFЄuݍVUrhYY iUztBPhy YY=Du hyY= YvhyOYE=uigUY\iO= YvYY 5YYE=uYYUY\ihyYy> t:>t5JxFFhP' YYJx uhj YYb=Du hyY= YvjYU=\Yr5h|h  uLYEt \iUzt}tUzhy Y}Uzhyhxr }UB 1=uC9\i`\i iGy> O>FURUJExFURUу] 뼋UFrPzYY먋URUJEx URUуE Urj 6YYUhyhtr y\YFGЄudiyFGЄuWY\YdiFGЄuW-yUztFUB _^Uhhu uuhh V jCYUJxSX hY`i=u%HJHxLL0hYUHJHxLL0>YsUVu=`iu ^=`i uCtw `iF+=`iuу=`iu itv j~YN^UVWu }UIMtGF9t1_^UVWY:z urhZ YYNjhr9YYDžurhh  닋JxGGSXWY=t>Jx봉hP/YYW]Y Y_^UV5Nx P^U=tu YUVW11}U9$u $F߃| jugYtUr YtURtUzt r: Y}t}t} t u Y_^UVWuEu41}%<$t4$YtEG֋E ~tV€uFu1V€cE~tVuډUjuv9 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvs EU9Uu1 N _^UV1}*<$t$Bt 4$aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<$t,$R@t$Bt 4$}YGƒ~uFyFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }*~y UVu CV€tu ,fNV~u>5 Yt.h@YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvP =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<$tN|1DFρECEE0-EMP1E E  U :t! EE E ,ZU uuuYYEy@Ut8hu YYE~" tuYuukYYE}y1]j5YEu uY1A!uEUMJUzUBU$E_^UUUuuu UVW}EEL#WUWYwY}t Eyu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=y<9}r79}u+UOJ}t EyURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15yt 9ur6E0tU UytU9ru NJEtU9Wu RWE_^U$UUEPjjg y Ux1UVW5xx}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډtF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U | }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPCYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U 1JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEмUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE,!E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPfYY=t6JxEEFFEEVP0YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu%YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UVW}u MUUas U EUhh YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6jS UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u Pk1ۇtPXP`e J``````Ur :6=D TWV a4 bc_ i4 lA qr4 s twV yi {}wH V$*r.i[\U /?Osed: RE error, %o @   %02x truncated to %d characters line %ldhold spacesed: % !E | !^!!!!"y"""f###K$K$%%$B%%%s %s sed: too many reads after line %ld %s %ld %s sed: too many appends after line %ld sed: can't open %s rsed: can't open %s r%s C/a0/r /w//+g/b]/0a0r0w01+0b08 8@89X9b9d9i9o9p9u9x9: :#:+:-:0:=L;h{;l;;EE=G0=X<b<c=d<eE=fE=g0=i<n;o<p<r=sU<u<x<(null)cannot print floating point y @sed: garbled address %s sed: garbled command %s sed: too much text: %s sed: no addresses allowed for %s sed: only one address allowed for %s sed: too many commands, last was %s sed: cannot open command-file %s sed: unknown flag %c sed: cannot create %s sed: undefined label %s sed: too many {'s sed: first RE must be non-null sed: no such command as %s sed: too many }'s sed: duplicate label %s sed: too many labels: %s sed: too many w files sed: RE too long: %s sed: too many line numbers sed: command "%s" has trailing garbage  Yyx  sed: line too long YdiSSSSB #!/bin/sh # # setup 4.1 - install a Minix distribution Author: Kees J. Bot # 20 Dec 1994 PATH=/bin:/usr/bin export PATH usage() { cat >&2 <<'EOF' Usage: setup # Install a skeleton system on the hard disk. setup /usr # Install the rest of the system (binaries or sources). # To install from other things then floppies: urlget http://... | setup /usr # Read from a web site. urlget ftp://... | setup /usr # Read from an FTP site. mtools copy c0d0p0:... - | setup /usr # Read from the C: drive. dosread c0d0p0 ... | setup /usr # Likewise if no mtools. EOF exit 1 } # No options. while getopts '' opt; do usage; done shift `expr $OPTIND - 1` # Installing a floppy set? case $# in 0) # No, we're installing a skeleton system on the hard disk. ;; 1) cd "$1" || exit # Annoying message still there? grep "'setup /usr'" /etc/issue >/dev/null 2>&1 && rm -f /etc/issue if [ -t 0 ] then size=bad while [ "$size" = bad ] do echo -n "\ What is the size of the images on the diskettes? [all] "; read size case $size in ''|360|720|1200|1440) ;; *) echo "Sorry, I don't believe \"$size\", try again." >&2 size=bad esac done drive= while [ -z "$drive" ] do echo -n "What floppy drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done vol -r $size /dev/fd$drive | uncompress | tar xvfp - else # Standard input is where we can get our files from. uncompress | tar xvfp - fi echo Done. exit ;; *) usage esac # Installing Minix on the hard disk. # Must be in / or we can't mount or umount. case "`pwd`" in /?*) echo "Please type 'cd /' first, you are locking up `pwd`" >&2 exit 1 esac case "$0" in /tmp/*) rm -f "$0" ;; *) cp -p "$0" /tmp/setup exec /tmp/setup esac # Find out what we are running from. exec 9<&0 /dev/null || exit # Partition the primary. p3=0:0 test "$swapsize" -gt 0 && p3=81:`expr $swapsize \* 2` partition /dev/$primary 1 81:2880* $p3 81:0+ >/dev/null || exit if [ "$swapsize" -gt 0 ] then # We must have that swap, now! mkswap -f /dev/$swap || exit mount -s /dev/$swap || exit else # Forget about swap. swap= fi echo " Migrating from floppy to disk... " mkfs /dev/$usr echo "\ Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if are absolutely sure that there can not be any bad blocks. Otherwise just wait.)" trap ': nothing' 2 readall -b /dev/$usr | sh echo "Scan done" sleep 2 trap 2 mount /dev/$usr /mnt || exit # Mount the intended /usr. cpdir -v /usr /mnt || exit # Copy the usr floppy. umount /dev/$usr || exit # Unmount the intended /usr. umount $fdusr # Unmount the /usr floppy. mount /dev/$usr /usr || exit # A new /usr if [ $fdroot = unknown ] then echo " By now the floppy USR has been copied to /dev/$usr, and it is now in use as /usr. Please insert the installation ROOT floppy in a floppy drive." drive= while [ -z "$drive" ] do echo -n "What floppy drive is it in? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done fdroot=/dev/fd$drive fi echo " Copying $fdroot to /dev/$root " mkfs /dev/$root || exit mount /dev/$root /mnt || exit if [ $thisroot = /dev/ram ] then # Running from the RAM disk, root image is on a floppy. mount $fdroot /root || exit cpdir -v /root /mnt || exit umount $fdroot || exit cpdir -f /dev /mnt/dev # Copy any extra MAKEDEV'd devices else # Running from the floppy itself. cpdir -vx / /mnt || exit chmod 555 /mnt/usr fi # Change /etc/fstab. echo >/mnt/etc/fstab "\ # Poor man's File System Table. root=/dev/$root ${swap:+swap=/dev/$swap} usr=/dev/$usr" # How to install further? echo >/mnt/etc/issue "\ Login as root and run 'setup /usr' to install floppy sets." # National keyboard map. test -n "$keyma]_p" && cp -p "/usr/lib/keymaps/$keymap.map" /mnt/etc/keymap umount /dev/$root || exit # Unmount the new root. # Compute size of the second level file block cache. case `arch` in i86) cache=`expr "0$memsize" - 1024` test $cache -lt 32 && cache=0 test $cache -gt 512 && cache=512 ;; *) cache=`expr "0$memsize" - 2560` test $cache -lt 64 && cache=0 test $cache -gt 1024 && cache=1024 esac echo "Second level file system block cache set to $cache kb." if [ $cache -eq 0 ]; then cache=; else cache="ramsize=$cache"; fi # Make bootable. installboot -d /dev/$root /usr/mdec/bootblock /boot >/dev/null || exit edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; save" || exit echo " Please insert the installation ROOT floppy and type 'halt' to exit Minix. You can type 'boot $primary' to try the newly installed Minix system. See \"TESTING\" in the usage manual."   NP _1$T$Lsu;SSSSu  QRP0rPUVWUUEE:+u EEj EPu ƋU:u }tu1tF9uv'?t"? u9ut~ t  F9uuNGF_^UVWDžXEPb"YEPYǍ\PQ"Yx lX!PYuhh"YY2h"YYjhhd! ƅh5k"YYt5he"YYhhR"YYhhA"YYhh0"YYffUj0hVg! V Yjhht ƅu hYXOXhRR7www 4hPEP,EP!YPEPV V7 Y_^UVuj jV# ^UuIYP"YUV5Nx ^U=tuYUVWuN#Yƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP%=>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW|YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhx_YY_U U VKY=VhxYYVhwYYƅ>-uF>+uFjVEP ƅUUj h5 1VhYYƅpj h5 >t>,tjVEP ƅt5U>t'>,u"FVAY=xwVhYYƅu_^UhhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0Jd4EU M R+Q¤ЙЙUuW +UЙOIkkE0dUM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U=x 5iYU=x=hu hj5hYYy'j5"YY Pj5  1U^UhUl=u/hhl5 1Vl=lu1< = ulUUU:u1: t ::uҋUEUV=yy1u1ltxgijklmnopqrstuvwxy|tjƅtjjVJ fpLƅtjjV, r/t!tyxg:Xl^UV%ƅt F9Eu^UV{ƅtu6YYu[^U VWE}yA ƀ-]}uA ƀ0Z'~QEǃ}u~$G0A ӈE+UډU 뫡ƀ_^UHVWEPu YYxU܁ t1h Yƅu1V YDžU9uhh~ YYh|hM YYGPh= YYEPh YYxU uUM9uE]9pE]9`V Y V Y1_^U$UUEPjj U(VuEEV֋RUV֋RU E +UUU UEPj7j ^U(VuU @t*ur YEU UV֋RUUUEPuYYU UEPjj; ^U$UUUUU UEPjj UVW11}U9Hu HF߃| jugYtUrYtURtUzt rY}t}t}0t uY_^UVWuEu41}%uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }%~y UVu CV€tu ,fNV~u>5Yt.h YFu NLNHF 9h~ YFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv0 =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVWEE110u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhVYYUR<EMxGFFUR<4EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^UVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhdu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^U$Vu UUuV֋RUV֋RUEPjLjD ^UVu$YƋU rU MJwU uRYY^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U}u UEuYuMYU$U UEPu YYEPjj9 U 2u u ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W] }׃E뻋EEU9vGuIYEuUUȋUUEEEPj;j" RMY_^U$EPjj U$UUU UEPjj U$EPjj U$EPjj U$EPuYY1ۅÉU$UUU UEPj%jY U$UUU UUUEPjj/ yEU0VWEPuYYy1U؁@t1hu3YYDžy1EPWYYxSU؁@u7jWYYEx& PjWy xh$YƅuUW2YUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGPL GWBVVFWB)ډfFWBV4_^U$EPj>j UU$VWEP YEPEPj jP YƋ}t9uvE=EPG YEEPEPj W YUUjEP YYEP" YWj YZ)‰jEPj jEPj t9r)օu jv YV YU)_^U$uYEUUU UEPjj Uu hT$u U$EPj j y}tUEEU VWujh YYEy(=t hx FP;YYrhFPu EUu YU}y VUj FP YYDžt)RjWU hp VYYhl PYYhh PYYƆ$iO PYP%PoYYh` 0P\YY1_^U$EPu2YYEPj j_ U$UUUUU UEPjj3 UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U$  JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PCE6U U RU U RUEEED E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuEYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^/s$KSU7t. &t`kdVD$aÜX1PXR1ЅUSE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUW}0))ϊE tu1_]XG_]U}x}~uP0YYUUas U EUh h0YYjYU$UUEPjjK U$UUU UUUEPj6j U$UUU UUUELEPjGj U$} uEEUUE UEPjJj y}tUEEU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EUEPjHj ÃUVW}u M)9r/r uu fE_^]t|UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V 5(h jKj ^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPssThe system will shutdown in %d hour%s and %d minute%s at %02d:%02d Invalid time specification `%s' CRhBk6mrBxBReboot call failed: %s Can't execute 'halt': %s /usr/bin/halt/dev/tty%s: can't fork nowshutdown: invalid option '-%c' shutdown: option '-x' requires an argument shutdown message -> short shutdown message or absolute time specification ``11:20'' time -> keyword ``now'', minutes before shutdown ``+5'', code -> boot monitor code to be executed -k -> stop an already running shutdown -m -> read a shutdown message from standard input -x -> return to the monitor doing... -R -> reset system after shutdown -r -> reboot system after shutdown -h -> halt system after shutdown Usage: shutdown [-hrRmk] [-x code] [time [message]] Shutdown process terminatedCan't kill the shutdown process, probably not running anymore Can't get pid of shutdown process, probably not running shutdown rshutdown> shutdown> Type your message. End with ^D at an empty line The system will shutdown NOW The system will shutdown in %d seconds The system will shutdown in %d minutes at %.02d:%.02d ss The system will shutdown in %d hour%s and %d minute%s at %.02d:%.02d shutdown/dev/consoleCannot open utmp file Broadcast message from %s@%s (%s) %.24s... ?unknownsystem taskDecNovOctSepAugJulJunMayAprMarFebJan%s %02d %02d:%02d:%02d %s: system %s by %s@%s open~~~shutdownrebootrootlocalhostSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error/"""""""""*a*r*w*++*b* : ??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0i3861VU2Minixnoname/etc/hostname.fileIA @@"AFBX/BbBd&Bi&BoBp/Bu&Bx/BC C#C+ C-C0CFLChClCDEEGEXEbEcEdAEeEfEgEiAEngDoEpErEsDuExE(null)cannot print floating point 4/usr/adm/wtmp/usr/run/shutdown.pid/etc/nologinh-?D/etc/utmp/usr/adm/wtmp/usr/adm/logLHD@<840,($ GMTGDTU U `TLD@80( SSSS/etc/passwd/devB0 ((((( AAAAAABBBBBB Unknown errorX L 0  x h T H 0  p ` H 8   l X @ $   lX@0C  <@1$T$L4<su;SSSSu(( QRP` PUVW1}thYjYU ֋у Mt;E=0| E=9~hfYj;YE-0k WuY1_^UV5,Nx h^U=0t0u,YUVu>tF+URuj ^0U$UUEPjj UU$VWEP"YEPEPj jYƋ}t9uvExEPYEEPEPj WYUUjEPYYEPYWjYZ)‰jEPjv jEPj t9r)օu jzYV9YU)_^U$UUUUU UEPjjg  U}x}~unPYYUVWuU VVuYYDžt~~yVډ8F_^U$UUEPjj U$EPjj U$UUU UEPj%je U$UUU UUUEEPjGj4 U$} uEEUUE UEPjJj y}tUEEU} v8M E 1U} v8M ҋE!1UE1UE1U} v8M Et1U$EUEPjHj ÃvUSE] ![]USE] ![]USE] ![]UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj5 VPH5Xh<jKj9 ^sleep: bad arg Usage: sleep time dSSSS  `"x $1$T$Lx su;SSSSu$$ QRP wPUVWu }SFTFKFBF 9F$F)F jhPjr !_^UVW}E  4E F}t V Y VYGtF>.u,F}t VYG VYG tF}t>tFWPYY}YE  4t@>-u;^u~.u(ju W0 W9~jhTjt G_^U4VWEU hY| U9UUM ր:-t >+>-u ~>+u=x =x ujhj kx (j]S Pj F>aR(,0EUM  F h VYYx2E9=x |k( PYGBEE'}t)EЙ}0FEЙ}̉Uй E̙Ehj YY=,t>UM <t+UR YjYU9Uu)=(tjjhYYjj YYU9UUM h4YYu1sUM EP4DYYy UAMM 4hj 뜋UM j4YYDžy#UAMM 4hj a=(tUM 4WYY uW>YYE2=(tjY=Luj{Y5La Y1_^UVW} ~tG~tG~tG~tG~ tG ~$tG$_^UVWu} W;YPWj tV$YPVj h Y}tjY_^U= u  0h5 rYY y5 hji U VW +| ډ׃}W5 j: ƅd +| r4?Ƌ|  M| | M 1t| | Gۉ|     +| ډ-9} tW5 u 4Ƌ| jRu U ))U |  u uYY/} W5 u   uY_^UV~| : tNB^U VWE}ug>=0t~tvWYYtBUAPMZ }uhh u EG< uuh u uYL_^UVu=,t#9~ 'aHaI8^UVuVu uC ytjhj ^UVuVu u1 9ttjh j ^UVW5| 1>t F< uGR Y | ր>tF< uBV5 WZYJ JR5Y=4t5 YjY5 Y_^UVW}օ~ WVNYYN~> UJ  J ]JRj YYN_^UVWu} 9B9! I 44YYFJ K 44YYy8J UJK J ]n_^UVWu }Ex 9UiUBk(W PPz UBk(V PP] UBk( PPPv EuE눋x 9UtUBk( t UډE_^U VWu} u7VmYYEU9W~ > tFEVuW YYt:wu3YYEEU9W ~U: tEEU)U _^UVuU IM Q=u!> t > t> tFtF9t> tF9uF랉^UVWu }=x ~ VW3YY"h VW E= tE_^UVWu }Uzt"œtGœtFUz$tjVW< 09uG< u1F? u > u Uz t>œuGœtœuFœt뀋UztDœuGœtUœuFœt3UzLGЉUЁœtE FЉUЁœtE U9UU+U )щ_^UVWu }E}C?-u EG?+uG>-u}u [F}t H>+uFtt9uGFڀ?.t >.d?.u?>.ujFPGPQ EtEtE[K)ۉ]EGtEFtM}uEEE-ut1EE}t UډE_^UVW}19uVU9| 3}QaHaIhh8 YY yh8hj GuVAYY냃=,t+19}BVYPl Y_^U VWU +UU1u- 5| Y}9} +UkƁƤ h8W8YP YYu t>u>u F1_^UVW}U J9ux19u kk Xk 9tLkw 8YYEukä SY=uσ}yku  PsYYF댉_^UVuvYvPrYYVY=t#vPYYuVY=u^UVW}uE h5| | Vh'YF1҉VV U V)Y=vPYYVY=vPYYDž~+u hTjk vjYPvj IyvPcYY땃=0tu h<j vYPvj5 5| pY_^UVW}G< tF_^UVWu }FG= u_^UVW}WY=ujhpj _^Uu\Y=ujhjj UVjjYY,1}VYP\YFj6Y^UVuj jV ^UV5Nx ^U=tuYUVu~  u6EPYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUU UUUEXEPjGjt U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW5YNj5h=Yh2Y}t.U:t&uYPuV jhV WYPWV jhV _^k{S+KFfUVux95l ` ^U$UUEPjjg y UL 1UVW5L L }׃}~9r }y 9vWYu_^UVWuU VVuaYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu@YYEPjjU U$EPjj= U$UUU UUUEPjj yEU(VuU @t*u2YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjjw UHVuUVUVUV UVUЋU UEPY^UVuEP#YjEPj- V  5 hx jKj ^U$u"YEUUU UEPjj U$EPuvYYEPj j U$UUUUU UEPjj_ UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv} =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVudYƋU rU MJwU uR]YY^U$} uEEUUE UEPjJj y}tUEEUVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P/1ۇp tPXPbdpyEnd field is before start field!com{otuCannot open Cannot find -Too many fields Cannot creat Cannot creat Read errorWrite errorCannot creat Cannot open -Non uniq line in file Disorder in file stdinNot enough memory. Use chmem to allocate moreCannot reset memory : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 /tmp/sort.XXXXX.XXUsage: sort [-funbirdcmt'x'] [+beg_pos [-end_pos]] [-o outfile] [file] .. SSSS ((((( AAAAAABBBBBB B$Unknown error|l`<, lXD4$ t`D0P P P P P P P P P P p\H0C  >T1$T$LDsu;SSSSu QRP$ P%UVWE X1h,j+YY=u-5H%YP5Xhh|C*jB%YhPhTj+ =u-5H>%YP5Xhhh|)j$YRt R}u4U hdrJ+YYuU h`r/+YYu}ttWYj$Y9u~+B9U~ BM \U P4YYFhPhT@j* =u-5HV$YP5Xh4h|)j$Yh,jjz* =u-5H$YP5Xhh|(j#Yj#Y_^UdVWUr58542P0P.P,Ph(E}}E<Sh(YYEh(Y1}Ƌ4U=89}t/WsYPuiYPhEP(EPY/ut#W8YPhEPa( EPYf0fUuOU tVAhZYGhMY:h@Y-h3Y h&YU :Vhj.j@EPVhj.hEPVh|j.j EPVhtj.jEPxVhlj.jEPaVhdj.jEPJth`$'Yf,fUVhXh jEP VhPh jEPVhHh jEPVh@h hEPVh8h j@EPVh0h hEPVh(h j EPjVh h jEPPVhh jEP6Vhh hEPVhh hEPVhh hEPth%Yf.fUVhjjEPVhjjEPVhjjEPvVhjjEP_th9%Yf2fUVhjsj@EP$VhjsjEP Vhjsj EPVhjsjEPVhjsjEPVhjsjEPVhjsjEPVhjshEPVhjshEPfth@$YVhj<PVhh=PVhxj>PVhpj?PVhhj@PVh`jBPVhXjDPiVhPjEPQVhHjFP9Vh@jGP!Vh8jHP Vh0jIPVh,jAPiVh$jCPQth "YuPu Rt+RPPPh EP"EPYuVu Tt+TPVPhEPp"EPYth1"Y=th"Y_^UVWu} h4V YYt0f01h,VYYt0f01h$VYYt0f01hVYYt0f01khVdYYt50f00f01%hVYYt50f00f01hVYYt50f00f01h VYYt50f00 f01ShVLYYt0f01$hVYYt0f01hVYYuhVYYt0 f01hVYYuhVYYt0߁f01uhVnYYt0@f01FhV?YYt0⿁f01hVYYt!0ʀf01hVYYt!0f01j EPVJ EU:uLu!YE=u V5Xhh|1fU4U81MhVFYYj EPW E}tIuYE=u#V5Xhh|JU4W5XhXh|hPVYYj EPW6 E}tIuYE=u#V5Xh4h|QU8>W5Xhh|{hVYYt,f,1hVYYt,f,1hVYYt,f,1hVYYt,f,1_hVXYYt,f,10hV)YYt,f,1hVYYt,f,1hVYYt,f,1hVYYt,f,1thVmYYt,f,1EhV>YYt, f,1hVYYt,߁f,1hVYYt,@f,1hVYYt,⿁f,1hVYYt!,ʀf,1WhVPYYt!,f,1%hVYYt!,f,1 hV YYt!,f,1 hxV YYt!,f,1 hpV YYt!,f,1] hhVV YYt!,f,1+ h`V$ YYt!,f,1 hXV YYt!,f,1 hPV YYt!,f,1 hHV YYt.f.1f h@V_ YYt.f.17 h8V0 YYt.f.1 h0V YYt.f.1 h(V YYt.f.1 h V YYt.f.1{ hVt YYt.f.1L hVE YYt.f.1 hV YYt2f21 hV YYt2f21 hV YYt2f21 hV YYt2f21a hVZ YYt2f212 hV+ YYt2f21 hV YYt2f21 hV YYt2f21 hV YYt2f21v hVo YYt2f21G hV@ YYt2 f21 hV YYt2߁f21hVYYt2@f21hVYYt2⿁f21hVYYt!2ʀf21YhVRYYt!2f21'hV YYt!2f21hVYYt!2f21hxVYYt!2f21hlVYYt!2f21_hhVXYYtWj YY:hdV3YYtWj YYh\VYYtWj YYhTVYYtWj YYhLVYYtWjv YYhDVYYtWjQ YYh<VzYYtWj, YY\h4VUYYtWj  YY7h,V0YYtWj YYh$V YYtWj YYhVYYtWj YYhVYYtWj s YYhVYYtWj0 YY~hVwYYtWj YYY>:uVY1FhV?YYuhV.YY>cu1EhPYYEhPYYEhPYYEhPYYEhPvYYEhPaYYEhPLYYEhP7YY1chV\YYuhVKYYt:hhYYhxh|YYhlhpYY1hdVYYt:hXh\YYhPhTYYhDhHYY1h<VYYu"h4VYYuh,VYYt)h h$EYYhh4YY1`hVYYYthh  YY17hV0YYt:hhYYhhYYhhYY1hVYYt>@1hVYY, f,.f.0"f02qf22tAC<=>?@BDGHIEF2uAC1hVYYtVjEPW7 EU:t#W5Xhh| c#UfRJhVCYYtVjEPW EU:t#W5Xhth|\ #UfPhlVYYtVjEPWi EU:t#W5XhDh| #UfT|h<VuYYtPjEPW EU:t W5Xhh| 1#UfVV5Xhh|X 1_^UVWu }?u >u ?t>u19t1GF_^UE= }E@PhDi YY$}u h@U YEPh<C YYUV<sU9Vu ^UV<sU9uF ^UVuU Uu}uUtVYF}uU UuVY^UVu YƉ9hH Y=t3dJdxxx hdj DYYhdu YY5^UVWu}}u 9u ouWhhEP I sF@PWh\EP ,uWhTEP VWhLEP EPY_^U}uU 9Ut!uuhxEP EPYU,VWUUjEPR ƋU::tuh` h| !fUUjEPR ƋU::tuh@ h|a !fUUjEPR ƋU::tuh h| !fUUjEPRH ƋU::tuh h| >!fUUjEPR ƋU::tuhh| u؋UjEPR ƋU::tuhh|Y u1}BUjEPR ƋU::tuhh| {T=G빋Uztuhh| RfUf,fUf.fUf0fUf2U؉4Uԉ81} L=܈<G_^UVWu h V-YYuh VYYt h VYYt mVY=u5>^u0FPCY-@Džx |?Vh h| LVY=uVh h| "}x}| h YE<_^UVjEPu ƋU:tu h h|y B9tu hp h|Y "}x}| h$ YE<^Uh|u<YYUV5<Nx \^U=@t@u@YUVux95 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+H"}t}y UU_^UUas U EUVW}Wu u ƅ~9})׉U U 1_^UVWu }@;~y UVu CV€tu ,fNV~du>5h Yt.h,YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv- =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uhduu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj8YYEUuu huS#36U=@t@jYUVU9wU9vH 16VYt1'rF5&Y5^UVW}u1E}UUsH 1=u8jY=u1V!փ55FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U}x}~uPLYYU$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډHF_^U$UUEPjj U$EPjj U$UUU UUUEPj6j_ U$EPujYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEUu hT$uE UV& T$@, T$@% T$@H E uVu ^U$UUUUU UEPjjS UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 8 }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEP uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuExUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPzYY=t6JxEEFFEEVPDYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu9YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvY =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MCUhh|YYjYUVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s: can't set terminal parameters to stdin: %s %s: can't set screen size to stdin: %s -g-a%s: can't get screen size from stdin: %s %s: can't read ioctl parameters from stdin: %s }IVc p %d ypixels %d xpixels%d rows %d columns timeminflushlnextrprntstopstartsuspquitkillintreraseeoleof -lflusho-noflsh-echonl-echok-echoe-echo-iexten-icanon-isig -onoeot-xtabs-onlcr-opost -ixany-ixoff-ixon-icrnl-igncr-inlcr-istrip-inpck-parmrk-ignpar-brkint-ignbrk -clocal-cread-cstopb-hupcl-parodd-parenbcs??cs8cs7cs6cs5speed %lu baud;ispeed %lu baud; ospeed %lu baud;: :%x:%x:%x:%x:%x:%x:%x%s: unknown mode: %s %s: illegal parameter to ypixels: '%s' ypixels%s: illegal parameter to xpixels: '%s' xpixels%s: illegal parameter to rows: '%s' rows%s: illegal parameter to cols: '%s' colssaneek-igncr-inlcr-icrnl-nlicrnlnlcs8-parenb-oddp-evenp-parityparoddcs7parenboddp-paroddcs7parenbparityevenp-echo-iexten-icanon-isig-onlcr-opost-ixon-icrnlrawcookedtimeminflushlnextrprntstopstartsuspquitkillintreraseeoleof-lflusholflusho-tostoptostop-noflshnoflsh-isigisig-iexteniexten-icanonicanon-echonlechonl-echokechok-echoeechoe-echoecho-onoeotonoeot-xtabsxtabs-onlcronlcr-opostopost-ixanyixany-parmrkparmrk-ixonixon-ixoffixoff-istripistrip-inpckinpck-inlcrinlcr-ignparignpar-igncrigncr-ignbrkignbrk-icrnlicrnl-brkintbrkint%s: invalid argument to ospeed: %s %s: illegal speed: '%s' ospeed%s: invalid argument to ispeed: '%s' %s: illegal speed: '%s' ispeed%s: illegal speed: '%s' -paroddparodd-parenbparenb-hup-hupclhuphupcl-cstopbcstopbcs8cs7cs6cs5-creadcread-clocalclocal%c^?^%c %s = %c%s = ^?%s = ^%c%s = %s = %uerror in saved settings '%s' error in saved settings '%s' error in saved settings '%s' error in saved settings '%s' error in saved settings '%s' error in saved settings '%s' error in saved settings '%s' error in saved settings '%s' Assertion "option >= 0 && option < NCCS" failed, file "stty.c", line 1238 stty: illegal option value: '%s' stty: illegal option value: '%s' ^?^-undefAssertion "option >= 0 && option < NCCS" failed, file "stty.c", line 1259 stty: illegal option value: '%s' stty: illegal option value: '%s' unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 011112 y2@23X3b3d3i3o3p3u3x34 4#4+4-4047L5ho5lz55E97G$7X6b6c 7d6e97f97g$7i6n5o6p6r}7sI6u6x6(null)cannot print floating point (P2 K0n@P`p,X` %KSSSSBLd| ((((( AAAAAABBBBBB Unknown error xh\8( | h T @ 0  p \ @ ,  | l X D ,  C   F1$T$L su;SSSSu QRP ;PUVW} W׋RօtVYPVu _^U VWE9uSU :-uHBu VZY:-uzt&:tjh$jj jY9u~U UReYEEEUEEPhS@YY=u>=u MMjh5YPhj\}WWYZ G9uu?u+URuj y'Mjh5`YPhjrF9uE_^UV5Nx ^U=tu(YUVux95@^2U$UUU U5EPjMj? 6EPjMj- $UUVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUUUU UEPjjw USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]KI|;u[u P1ۇtPXP sysenv: sysenv: Usage: sysenv [name ...] unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0FIMSSSSSUnknown errorxhPD(xh\H8(hXL<( lXL4xdPC  @>,@1$T$L su;SSSSu  QRPCPU} tE PuhjrjYjYU0VW} }}jh YYw>rsg^1=  K ? 3jm!Y) jh *YY <Fm=tjh YYh|w!YYu=t1+=thw[ YY jw YY=ywhlxYYA t'j YEУ ux Y   f =x=~&EP5YYywh`YYfUf fUf EU9U}Uԉ4P YEe=UR`Ytu>tFFt5EU9U}+Uԉ4p YUԉPu4n tE̓}tU9U} uiY =t0t=tt =t ujYJvjY1_^UVhh5 =u1<= t,jhlYY/9tjhwYY^UV^= tPVhjhuh|D YY huhh. YYh\hd YY= j hTEP EEPh)h!=t3u,$Ph8j(VbYu;= t+j hTYYPhj O=hh` YY*tPhj t8jY^UVj hTIYYƉJVZthh5  ^UVWuVYVhueYYy'5 YPVhuhj= Vhuhj>.u~tVY>.u~thVYYuVYVh# YYk5 YPVhjmIjh!%YYEjh)YYE=t3u `EV YU URuVl uD= t/h)h!=t3uPhjVY5 2YPh)h!=t3uLDPhXjih( YYVWYjVYYuVYVhYY+5 YPVhj- t5hV,YYDžuj/uYYE=ejVYYyChVYYy"5 *YPVhj Vhj U/EUUhVYYDžy5 YPVhjN -j hT YYPW5VYW7YVEY_^U EPuYYx&U@u uiY uvYUVW= = ujhh,7 t0hYEt@h YEt@ƃujhDYYǃujhLYYVWu8 jh<YY# PuYYuY_^Uj h`YYEEEPu{YYUVWuE= tuuh4j UIMtUhhu 9 ~Nj9UuPhu )_^UVW119u ~3U=0|!U=7U-0Fȉ_^UVWl1ts FsF_^UVuFuF1=/uC^UVuVhhHhL { L ^UVW}>tFu"N/t tN>/uF*?tL ujhPYYGF/F_^UVWuEPVuYYy"5 PYPVhj SE 9u$ M9uVhj EPVQYYDžyVhjp EPVYPYYEPYE܅ljduhu t1= tVhuhj Phhl hh5k VVEPYY/t0Ph|hl hh5 u5WVYPt5tPhxhlQ hh5 VhhYY= hGP>YYuhPjYYtVYy"5 S YPVh8jGVOYWpY1h4Y@@Y<h0PYYu EPYċj hTP ƅ(Ph)h!VhjGRPhhl/ hh5 t3= th)h!VhjPhhl hh5G 5EPYVhj Udu-jYW(Y_^U= tu uhjMU}t uJYUVU JtU J@t14ju[YYƃu5 [ YPhhx  ^U VWu EEGuV@uG/VRh(h<v FPh$hD_ F Ph hLH VuvhhT! j hhT vhh` jh h FP YEj }t]PhS F P YEj }t]Ph# V`t4F Phh!N F Shh)4 1_^UVWU :UB=nu dYWYPYƅu h, Y= VUffVUfRfUBHFWF P YY5 _^UV5 tV VmY^UVW5 XFU9u J9t vFHF~uVjdF Ph  F 1_^UVsF^Uhh5R hh5: 5 YUuu uG 9Etjh<YYUuu uY 9EtjhPYY UVW19u~)U)M RQu Džy҉_^UVW19u~)U)M RQu Džy҉_^UVWu=uDžu 5 h WC  J>tEF A ӈ = uhh W  _^UVW} JVZt!0۸_^UVW1}t UUUuU ::%E UUzUUrSYƅ=`G@݋UUrY9UUrYǀ?0uGOE E d 'GFЄuN2E E F"t uY_^UV5 Nx "^U= t u YUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95 ^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^U=, x 5, Y, 0 U=, x=u  j5YY, y'j5, BYY Pj5, - 1U^UU=0 u/hh5,  0 1V=u1< 0 = uUUU:u12: t9Etz:u1 UEUV=, y~y1u1j:nYtj:]Ytj:LYEtjju ։: t$j,Yts:u^UV3ƅt F9Eu^UVv ƅtu6YYuV^U=@ x 5@ Y@ D U=@ x=u 4 j5YY@ y'j5@ YY Pj5@ } 1U^UU=D u/hh5@  D 1V=u1< D = uUUU:u1: t ::uҋUEUV=@ yy1u1txtjƅtjjV fLƅtjjV /t!yg:X^UV%ƅt F9Eu^UV{ƅtu6YYu[^UVWuU VVuMYYDžt~~yVډ F_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U(VuU @t*u:YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj UUUuuu  'Gk /o'  ; [ USE] ![]USE] ![]USE] ![]+UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]L$ UVWME_^]UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVuYƋU rU MJwU uRYY^U$UUEPjj U$U UEPuYYEPj!jU U$EPufYYEPj j/ U$U UEPu8YYEPjj U$uYEU UUUUUEPjj U}u UEuYuYU$U UEPuYYEPjj] U$UUU UEPjj9 UVW}E 0?tG9}s 9usON9uu N/E 01_^U Vu U>t3FuF>t>/uEujYyUȋU 1^UVW}t} w 1?Uu NEPh\ _YYy1EX EPu?YYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWYEu=+WYWY VY1_E$ EUhT RXYYtUhP R=YYuP[UM9uMhL vP&YYURyPYYEPvPYYy 8 EFUM9E]9uUREPu yWY "VY1dWYu7Yy VY1EuEPEPVeYy1>uN/9us Vu/YYE_^U$EPjj yEU$u YEu YEUUU UEPj j U$uYEU UUUEPj'j U U jRu U$unYEU UUUUUEEPjj' U0VWEPuYYy1U؁@t 1huYYDžy1EPW^YYxS U؁@u7jWYYEx& PjW xh$Yƅu UWYUЉ 1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^Uju YYU$EPu6YYEPj(j U$uYEUUU UEPjj U$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U ` k}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEx uVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEР UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } 6=~y UVu CV€tu ,fNV~` u>5d Yt.hDYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvb =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvS =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh hx YYjVYUVuu TfFV V#U UU +UVjvPL =uU 9Vs VYu1^U$EPuFYY1ۅÉU$UUU UUUEPjj yEUu hT$u UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv; EU9Uu1 N _^UV1}*< t Bt 4 aYF^U$UUU UUUEPj6j {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s %s  DFcf;optvxCan't stat Cannot open -Tar: header checksum error."  01+2A3m4m56Wnot recogised item %d directory%d tape blocks blockcharacter%s special file major %s minor %s fifosymbolic link tolinked to %s%s1dtdCannot create %s: %s Made directory %s Cannot mkdir %s: %s Can't make fifo %s: %s made fifoNot implemented file type blockcharactercannot make %s special file major %s minor %s: %s blockcharactermade %s special file major %s minor %s Can't make directory %s: %s created directoryLinked %s to %s Cannot link %s to %s: %s ustar%s, %d tape blocks %s%sPathname too long6 @| `W& Tar: %s unknown file type. Not added. %I read character device %s major %s minor %s %I read block device %s major %s minor %s %I read fifo......Cannot chdir to %s: %s Error: cannot getcwd() read directory%I %I %I linked %s to %s Cannot open %s Cannot tar current archive file (%s) %s: %s %s: %s open failed: %s %I %I nobodynobodyustar%L 0%L %I %I %I Out of memory Tar: read error.Tar: write error.IJLds9unknown error! ! ! No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0(((n))!)../......=/ .@/:0X#0b0d0i0o0p#0u0x#01 1# 1+0-0014L1h1l1 2E3G3X2b2cs3d53e3f3g3i53n[2o2p2r3s2u2x2(null)cannot print floating point Usage: tar [cxt][vo][F][f] tarfile [files].SSSS/etc/group/etc/passwdBH ` x @#Unknown error  | l ` < ,  lXD4$ t`D0 p\H0C ((((( AAAAAABBBBBB   @1$T$Lsu;SSSSu QRP@ PVUjzYjrYjjYhWYijZYUV5 Nx H^U=tuY#;[xWU$UUEPjj U$EPuYYEPj j U$UUEPjj UU$VWEPYEPEPj jYƋ}t9uvEXEPYEEPEPj WYUUjEPYYEPYWjmYZ)‰jEPjb jEPjr t9r)օu jfYV%YU)_^U$EPj$j /CGU}x}~uPYYUVuYƋU rU MJwU uRIYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$EPjj U$UUU UEPj%je U$UUU UUUEEPjGj4 U$} uEEUUE UEPjJj y}tUEEU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EUEPjHj ÃUSE] ![]USE] ![]USE] ![]UVWE_^]UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V0(58hjKj ^} 0)ʇʋu }UW}0ʀuA)_]/DSSSS  # XL1$T$L su;SSSSu QRP P~U`VWE9uU :-Bu VZYBu VZY jhj5 h4 E E9uU U=u5=u,j Yt j Yt 9uuhh cEPu YYy*5 YPuhhN jYYUā`t/Uā tuhh jYUā1 t@=u.jh YYEyhh YYjYEj Y=t6}u=tjYhho YYj{YIu=t`\Phdh; jEPur =u} u=t1Pu? YYEy*53YPuhLh jY}u+Uā u uuYY?E}t3EPhdu y Euu YY =thDujuuh<ujuM YErUhTh YYjYUVWj EPu J ǃ=uU 9Ut 9}9}}1EU:u }tE}gU:[*6/(!EEE$E9| ׉E돃}t u uhh jY_^UEPhMu  y9=p5YPuh0hjYD}v uuhhjY}u  UU=u=t=u=t 15 u  15t&55 hdhjY5 bYu) 1Ph@h jYUVW UE= u  U}<1 9Uv EE9uU)׃}t1WRuH DžuAE15ׅ~_)׋WjR 9u}:u5y*5YPuhhjYUujYE9u}R+U׋UWRu  Džy*5YPuhh'j2Y}멋U)U_^UV5Nx  ^U=tuYUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8j`Y=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95 x ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0e tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjjg y U` 1UVW5` ` }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^UUUuuu  3WoD$|$tUSE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]U$UUEPjj{ U$UUEPjj[ U$UUU UUUEPj6j/ U$EPuYY1ۅÉU(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj UU$VWEP YEPEPj j YƋ}t9uvEEP YEEPEPj\ WK YUUjEPI YYEP^ YWj% YZ)‰jEPj jEPj* t9r)օu j YV YU)_^U$uZ YEUUU UEPjj\ Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 03}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEHnuVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U}EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }f"~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv^ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvO =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^GUVW}u M)9r/r uu fE_^]t|NU}x}~uPYYUUas U EUhxhYYj YUVu|YƋU rU MJwU uRYY^U$UUEPjjW U$EPjj= U$UUU UEPj%j U$UUU UUUEPjj yEU$UUU UUUE"EPjGj U$} uEEUUE UEPjJjq y}tUEEU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EUEPjHj UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvB =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^zUW}0ʀuA)_]UVWE_^]UHVuUVUVUV UVUЋU UEPY^UVuEP[YjEPj V  5 h jKj ^} 0)ʇʋu }KI|;u[u P1ۇ tPXPQ1bmruwstdinstdoutvol: %s: %s outinPlease insert %sput volume %d and hit return vol: can't continue, volume is full vol: cannot open /dev/tty /dev/ttyvol: %s is not a device vol: %s: %s vol: should %s be read or written? volumemaximumblockUsage: vol [-rw1] [-b blocksize] [-m max] [size] block-special OBAK:M3WHbAk:m3wHvol: bad %s size '%s' kvol: %s: tape block size (%lu) is too large to handle vol: %s: %s vol: cannot allocate a %luk buffer vol: volume size (%s) is not a multiple of the block size (%lu) vol: %s: %s vol: %s: %s unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0) @&Xbdiopux #+-0LhlEGxXbc_d!efgxi!nGoprsux(null)cannot print floating point SSSSBX ((((( AAAAAABBBBBB Unknown error(xlH8$xdP@0lP<h h h h h h h h h h (|hT<(C(...)rc dhcptags.conf daily# /usr/etc/rc - continued system initialization. case "$#:$1" in 1:start|1:stop|1:down) action=$1 ;; *) echo >&2 "Usage: $0 start|stop|down" exit 1 esac daemonize() { # Function to start a daemon, if it exists. local IFS=':' local name="$1" test "$1" = tcpd && name="$2" for dir in $PATH do if [ -f "$dir/$1" ] then echo -n " $name" "$@" & return fi done } case $action in start) # Select console font. test -f /etc/font && loadfont /etc/font /dev/null && net=t # Is there a TCP/IP server? echo -n "Starting daemons:" daemonize update daemonize cron if [ "$net" ] then if [ -f /etc/rc.net ] then # Let a customized TCP/IP initialization script figure it out. . /etc/rc.net else # Standard network daemons. daemonize dhcpd daemonize nonamed daemonize talkd daemonize tcpd shell in.rshd daemonize tcpd login in.rld daemonize tcpd telnet in.telnetd daemonize tcpd ftp in.ftpd fi fi # The last daemon has been started, so close the list: echo . if [ "$net" ] then # Get the nodename from the DNS and set it. t='-t 10' trap '' 2 while :; do intr $t hostaddr -h case $? in 142) echo "\ Unable to obtain an IP address after 10 seconds. Hit DEL to get a root prompt to investigate, otherwise just wait until an address is received..." t= ;; 130) echo "Single user." intr sh echo "Continue waiting for an address..." ;; *) break esac done trap 2 fi # Recover files being edited when the system crashed. test -f /usr/bin/elvprsv && elvprsv /usr/tmp/elv* # Run the daily cleanup on systems that are not on at night. test -f /usr/etc/daily && sh /usr/etc/daily boot & esac *...+keymaps8pwdauthadventasmconvcawfcppcpp.ansicvdescr dict$ego3em_cemcom.ansi4em_decode5em_ego6em_encode7em_led8em_m29em_opt:em_opt2;em_pc<flex>fontsFfortune.datGi386Yi86alibmath.bbm2|more.help}crontab+.*..,french.map-german.map.italian.map/japanese.map0latin-am.map1olivetti.map2polish.map3scandinavn.map4spanish.map5uk.map6us-std.map7us-swap.mapKMAZ&1&12~2"3#3'4{4(5[5-6|67`7_8\89^9 0@0 )]- =+}=  AaAaQzZzWeEeErRrRAtTtTyYyYuUuUiIiI AoOoOpPpP^"^[$$] qQqAsSsSAdDdDfFfFgGgGhHhHAjJjJ kKkK lLlL mMmM %\`**` AwWwZxXxXcCcCvVvVAbBbBnNnN,?,m;.;,:/:.!$!/****?                77m8899 -  - 44m 5  5 66 +  + 11m2233 0  0 .. <><> ? ?KMAZ1!1!2"@3#4$4$5%5%6&6^7/{&8([*9)]( 0=})?\_'`=+ AqQ@QwWwWeEeErRrRAtTtTzZzZuUuUiIiI AoOoOpPpP[{+*~] aAaAsSsSAdDdDfFfFgGgGhHhHAjJjJ kKkK lLlL ;:'"^`~#'\|AyYyYxXxXcCcCvVvVAbBbBnNnNmMM ,;,<.:.>-_/?****?                77m8899 -  - 44m 5  5 66 +  + 11m2233 0  0 .. <>|> ? ?KMAZ1!1!2"2@334$4$5%5%6&6&7/7/8(8(9)8) 0=0='?`?^^ AqQqQwWwWeEeErRrRAtTtTyYyYuUuUiIiI AoOoOpPpP[{+*]} aAaAsSsSAdDdDfFfFgGgGhHhHAjJjJ kKkK lLlL @@#\|~|AzZzZxXxXcCcCvVvVAbBbBnNnNmMmM ,;,;.:.:-_-_**** ?                77m8899 -  - 44m 5  5 66 +  + 11m2233 0  0 .. <>|> ? ?KMAZ1!2"3#4$5%6&7'8(9) 0~-=^~ AqQwWeErRAtTyYuUiI AoOpP@`[{ aAsSAdDfFgGhHAjJ kK lL ;+:*]}AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠                7m89 -   4m 5   6 +   1m23 0   .  ? ?\_\|KMAZ1!2"3#4$5%6&7/8(9) 0='?\ AqQ@wWeErRAtTyYuUiI AoOpP+*~ aAsSAdDfFgGhHAjJ kK lL {[^|}]`AzZxXcCvVAbBnNmM ,;.:-_**? 𠠠                7m89 ------4m 5   6 ++++++1m23 0   . <> ? ?KMAZ1!2"3#4$5%6&7'8(9) 0_-=^~ AqQwWeErRAtTyYuUiI AoOpP@`[{ aAsSAdDfFgGhHAjJ kK lL ;+:*]}\|AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠               ? 7m89 -   4m 5   6 +   1m23 0   .@   ??KMAZ1!2@3#4$5%6^7&8*9( 0)-_=+ AqQwWeErRAtTyYuUiI AoOpP[{]} aAsSAdDfFgGhHAjJ kK lL ;:'"`~\|AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠                7m89 -   4m 5   6 +   1m23 0   . <> ? ?KMAZ1!1!2"@@3##4 $$5%5%6&6^7/{&8([*9)]( 0=})+?\_'`=+ AqQ@QwWwWeEeErRrRAtTtTyYyYuUuUiIiI AoOoOpPpP[{"^~] aAaAsSsSAdDdDfFfFgGgGhHhHAjJjJ kKkK lLlL ;:A'"`~'*\|AzZzZxXxXcCcCvVvVAbBbBnNnNmMM ,;,<.:.>-_/?****?                77m8899 -  - 44m 5  5 66 +  + 11m2233 0  0 .. <>|> ? ?KMAZ1!|!2"@"3#4$4$5%5%6&&7/{/8(((9))) 0==='??? AqQqQwWwWeEeErRrRAtTtTyYyYuUuUiIiI AoOoOpPpP`^[^+*]* aAaAsSsSAdDdDfFfFgGgGhHhHAjJjJ kKkK lLlL '"{"\}AzZzZxXxXcCcCvVvVAbBbBnNnNmMmM ,;,;.:.:-_-_**** ?                77m8899 -  - 44m 5  5 66 +  + 11m2233 0  0 .. <><> ? ?KMAZ1!2"34$5%6^7&8*9( 0)-_=+ AqQwWeErRAtTyYuUiI AoOpP[{]} aAsSAdDfFgGhHAjJ kK lL ;:'@`~#~AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠                7m89 -   4m 5   6 +   1m23 0   . \| ? ?KMAZ1!2@3#4$5%6^7&8*9( 0)-_=+ AqQwWeErRAtTyYuUiI AoOpP[{]} aAsSAdDfFgGhHAjJ kK lL ;:'"`~\|AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠                7m89 -   4m 5   6 +   1m23 0   . <> ? ?KMAZ1!2@3#4$5%6^7&8*9( 0)-_=+ AqQwWeErRAtTyYuUiI AoOpP[{]}      aAsSAdDfFgGhHAjJ kK lL ;:'"`~\|AzZxXcCvVAbBnNmM ,<.>/?𯯿**? 𠠠          7m89 -   4m 5   6 +   1m23 0   . <> ? ?  xtK1$T$LPxsu;SSSSu44 QRP PUVWhPj Džy 19v N>uGt PP YZ‰F>#v~#lh8"YFP Yu R:u tKRRRPkYYP YYt&D>u tVP;YYV YPVj y1_^ULVWu}E@}~ MGFUIM~M JMMT_^UVW}W7UUWUF9EvNUWUW7_^UVW}U,Dž$@$~$,,Gj05DEP! U<<tu IY<}U ,Dž$@$~$,,Gj0hDEP pU4U0@9v'44P00 Z1NϋU4Dž<<FFFFFF< 44 44 44# 44<j huR _^U VWx}E@}~ MGFj8hhx _^UVWUUj@hDu E}} tE +UЉEu}Džd@d~dGFE}x UMMTMፅpPuhxuE}x)UUpM 1˺ UUMM9j@hu j@hu _^UVW}U:t4U9s-JVZtU%GEGčU9sGUREYU9sGtdDžhDž`@`~$`hhd dӍtDU :tzuE DžppE E _p__=Z~_-;_4_=9~_-5__-._1}h_tVkpXtX TtXt TX tFp=u  Džpp}jEPYYpD}EU9sH1DžXXIXt G .9~Z~U E뱋U_^UV5HNx  ^U=LtLuYU=`x 5`Y`dU=`x=u Tj5YY`y'j5`NYY Pj5`9 1U^UU =du/hh5` d1V = u1< d    = u U U U :u1 : t  ::uҋUEUV=`yy1u1 tx tjƅtjjV f LƅtjjV / t! y g :X ^UV%ƅt F9Eu^UV{ƅtu6:YYu[^U$UUEPjj; U(VuEEV֋RUV֋RU E OUUU UEPj7j ^U(VuU @t*uYEU UV֋RUUUEPuPYYU UEPjjw ^U$UUUUU UEPjjK UVujuu V!^UVujuu V^UVWuEEEu} tE 0mtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+h"}t}y UU_^UVuYƋU rU MJwU uR!YY^UVWuU VVuYYDžt~~yVډhF_^U$UUEPjj U$UUUUU UEPjjw USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P1ۇptPXP**y R y R y R _ _ _ /etc/shadow:2*" <4,$ >6.&@80( 91)! ;3+# =5-% ?7/'(08@ '/7?&.6>%- 5=$, 4<#+ 3;"* 2:!) 19!"#$%&'()*+,-./0123456789:;<=>?@  91)! :2*" ;3+# <4,$?7/'>6.&=5-%      )4%/7(3-!0,1'8"5.*2$                                                                                                                                     SSSS/etc/passwd ((((( AAAAAABBBBBB 9...:boot;bootblock<jumpboot=masterboot  0BNNDؠ u 1 %ġȎ؎1ND])0[6[[$b`1[[1[[ء [[[&D EUj?=rA=rs r.t*1ۉE &D E Ut[r~ utFV s36\6^0Ɗ[^(:F vF f PY!* N L\DDT [f @rFV (F u0tt O| 0rr0_^]1Nu&u mt0< u <uR0ÉGNôt <u0R1RÉGt< u  ÉG;`t,``uøOat010ábPX0Љ;1=rBru&GBuJ@uJУPø<ut5@t/@t)@t#t t@ %0-0txWw1м||U 1؀&?[uI[tvvvv[ tʸ3>[u11RPFV RvF Vڎ.. fXڸz  F V  1o  FV  1T  j8[@thh[tfvjvjv[ tj8h<jj0vvgظ fˣ[[f[vo=r 1؊6000䲀9=rO0tIr@&B È5È.&B Ã&H &H ډ16F 6F ´]È$ ÉF^ N VFF^ N VFfˉf1f&l͊fu hJfv ː.H^FfFf^fNfV fv$f~(fn,fUffF^FfFf^ fN$fV(fv,f~0fF41flЎf˴M fT" fX"8(؎  fT fX"޸ホ؎0>Pt"d`ddu$$8uUV ( sV9uDw7UXH: F.6X7Uvvv [Pv vrP3 47UvvvP7UvvvP7UVN[[VNPvvv;[RP# F tvvvP[6UVW1VR1[FVP7[[ t tVP2[OttA } t P[-V[PvW}Z[Z9~ufvv-2[[F u^F6U^PP37[[1 tC5UVW^7< t < u | uF^7= s < t1<(u#F= r4<(uFF<)uNuV~[ tFF= v Vi[ t^+VRu0[Nj^v7WF6^= u;^775UPVW~FP6[F tP*0[ƋVT5׉5UPPV6[TV[V0[F4UP0[4U>[t[_?;t P[Py[[v[Pm[[4U tP0[[14UPPVWPv vv[RP F tu~Ǿv^9v V Vt1IFv^9v0tw w\ZY9O wu9Ws [sP[P4[[[[[g1PP[P[RP[P[RP 1PP tP|[1}5Ӌ[[+WO Ë9Ow u9W wFƉӋ[[9Wu9O u>[}6[M6[Gt>[}Ӌt[i6[ӋWO P[P2[[[[Т[[[[>[|P[Pi2[[[[[,1UV Á( Svq2[[ uF10U~t~( tv,[0UV^?u( vF2[P+[vV"2[[0U^Gt^ u10UV[<tvw1[[ t4m0UVv[Ë7 tDu1DJ0UVv[Ë7 tDu1D'0UVWv[ljÃ?u9v[ t P +[v[DFDD 5L5DtD%#V9tDCD% FDV[ tTT t[t[v[Dv [D1s/Uv( Pvv:\/UPVv[FË tMDt&| tAt4[D( t([T TD !t[t [t[^V*[.UVWv1FF<-uF-0= w&F-0RP 1vv.Y[ӉN^ωRPFVu..UVop Pvv1Pv.[N vv1Pv-FV ủQ.U Pvv<.UVW1^Ɖ0 w0Aw7 awW F뽉-UVPP PaPP POPP P=.RPT[[PP P# Pb[SP P Pq[SP P PT%[SP PƆ[[seT TtXtPP=.[[Pt4qPP#.[[PP.[[PttHPP-[[땍P~P PB=uvpPzP P#\PbP PPTPPPPPPPPPP( PP[[PQRP[RPj t"[[QRP8[FP[P[[P[[+U^?t![?t^F1P[[Z+UVP PP},F[6[ u{DtmV[ udt[Dt Py[tr[ Pj[D%=tPO[tH[[?u PC'[_[[ 4~[[PQRP1[RP t"[[QRP&[*UPPVWF6[ uDtDtttt4P&ttV[ t(P&<tDFF1 u3Ph&[3ǃt ~ Ps[ ~WG[ P=&[4i)UVv-0= wF9vu1~u 01 u@^7)U1Pv[[)U*VW~1=*uC[ tGPW*[[ u>[uP%[Lb[[[[FPPV* uPV*[[ uF[}&[[BV[[€[V[>[tNW|PP![[P![[F t3FPv][[#V`tWbPv#[[L,VV>[}[~uW@PH#[[LF&U$VWF1DD >[|UTL QRPP3 tW[Ӌ7|uP[[[뤃>[t-<u(F~}VӋFFPt t1P|P tWL1P}PC[[=UtP5~t&PP\[RP; tW V6["[X%UVv,[F[V>[}~tNvP![[@[[L uƃuV[FPvP!V[_%U0>[unvP[[F tFPvN[[FPg[=u6L[PvP[!*FPB[FP:[F tFPvP1!$URP71$$U%(+FVRP(P%P$$U>[t6[c [[$UV[[[VN[[f$U>[t 6[6[[[9[w u9[w17$Uv8[FV t1>FVp u uvv1[[9Vwu9Fw#UVvDt\?u1\,tDt#UPPVWF16[ tV[=uF4BP[6[ tG6~t;\S\P6P!\tPP VS[|"4JF uS uLt6[ t'~t\9Fu| V [ 6"4 tvP*[[W[P[["UV s!<t 4`P[[t\P[["UVWF>[t>[ui t 6[[[V~t^_?;t F^V[WVR [F[V t^V t^V~u)~t ~tv[ t^_?=t^w[ t~t%~t^_?dtq^w[ uc^wF~u ^wNVvvF t"Ft  Pv* P[V9[u)^~s:v[ t,^_?(tvvFF~tC^_F=;u~t,^w\"[F^V~{uF~}uNuv[9vt/tW![[t[ uw[ u  PW![[4̋^W1PRR![-[Z~tP[[A^_WSvPF t"FtPvPc[V9[t#W[^?{u96[FF<t ={uF=}u Nu;4 t~s~ t ~tVY9[uh|ƃ~ uV[݉=t_=\tMP[MV9[u4 P[7 P[-( t@= uP[ GbtG뜋V9[t  P`[^~u9~u3^_?-u(^wPPSPY[~uK~t ~t~u9~u ^w[~u ^wC[~u ^w [G~u=~ u7^w[ t)^wJ[FVRO+Pvv~tF FY6FXP[FI( P[F:(F0?F&4FF1P[ FzPv[[ uF~uv9[ tV[P<[[F~u vP[[v![~t(4P[V9[t[wPx[[H⸒Pj[[UP[V[6 P[P[[>[tNV[1>[u@UV([[P> P [[V[Px[[Vv[U t[>[tUVW1^F tO/t_u ru^-0= w B P[ u aw AwV[UFF~ wu~s VN VNvvvNPC[RPvvp݃ VN +VNVN V VufVNVNVNVN 9Nr u9VvVNvvvvvv݃ VN +VNVN VNщVNGU VW1[V~u^WVGut^GtWn[F=u101Pv[[vd[PWY[ZF9Fv)^vS,[[^| PS[[^WS[[v^Vc[t[[[[QR1PPRP[[W[\Ã^9^v^r PS[[^WSh[[v6[6[1PPRP[[W[\Ã^9^v^h PSb[[^WS[[v9vw N P'[1 ^UVW[t\\VN19>4]y[ƋTL +TLQ6][VTL+TL Q6][VvvvۃFVvvvhۃFVvG~[u^^6]WG(\*\RSQ&ۃ(\*\vQR ۃ(\*\vQRڃUV:Pv[[ u1~ P+[F uvv[[F:1~u@kUPPVvTHLJVNDBt DD0FVDB tVNVNTLLNVNVNQ [ЉUPPV^SR[[FV!ƒuLPP:V Vu1PP,VN[[QRvv1PPY[SQXZ~U[[:]<]VNЉ^UV VutvvB][[FV!ƒu1V VutP1PvPvVN+pr19r$u9tvVN+prӹ ㍇vtVNprtBt sN1prQR[[ u9FVvvB][[FV!ƒtt1pr9Vu9Nt6t6r6pvP[RPك F t!v6r6pރtL1vUVW~vv[[ u1cEBt UD0֋T6]T[tW P[[12>6]r>6]vW P[[L16]8]UPPVW~F^19G}u9w~u7^OӉȃQRPSv[ZYO[[F u1FM8]9N wu9V s L 168]9vsv1PVv^[RPu5փ 5U^O)OVVV)V;8]1ɃM8]1!!+E1PVu5r5U^O)OcUVWdžd P[PW[`b1P[ P}[v[ Pn[1FF[[VN[[[[VN9[wu9[s[[VNn^VN|~1PP~|1>]@]9Nvuu9VrkuvP PL[ƋVNӉȃ^FQR[[F uppPvFP%~u~t LJFPX[ uFP[FV뗀~u,b%u`sb`| P%L uCFPvv u8]1ɃVN8]1!!ȉ^FVNVN1P PFP[RPؙ|~RPӃ du%T P[[tJ P~[ P[dždV֋N؉rtVڋN܉npVދNjl[t6VN+np+jlfhF u+rtfh 1fhVNTLVNLFtF0rtFtTL+8]TLF tMvvFPrPFP uwVNTL Ft +8]TL VNT L0rtVNT LTLTL rtnpvvvvvvt ttt. P [thf( P FP" P [[vvFPnPFP u t[t1fhjlnpjl8]1Ƀjl8]1!!ȉxzjl+xzjlVNxz9Nwu9Vs L zxvvxzVNjlfh8]1Ƀfh8]1!!ȉxzfh+xzfh^F^F\D u+[t$[[VN[[[[VNG{>4] uv P` [[L86\6\'[[=oRt P< [L[u1PP~|1PPeЃ u LP\P_[[ u L P"[\ t\D[^ u" P P[P[[ u^^[y~|P\P6[6[6[6[6[6[Ӄ[u 1PP6[6[\Pc[RPσ \P[j t[L UVvFP[F u 1ۉ\\1bVv[[FTLVNVv[[#Tu&VN9L|u9TvVVFPv[[ VNTLFD U4VWvVV[P=[P[[ƃ>[tVP|[[F t|FPV[[ tE^Fހ?:u:v<[ t/B]:(V[:]<]v[>]@]2 PV%[[>[u  P[6L%[PV PFPv[[#VunVV [ZЉǺ#V@tP[PV PlFPz[FPr[/GFPWU[[F u V P^[[8FPv![[B]'VNQ [>]@]V[1 UV PU[Py[ t9VN[$V P[[!Vd P[[VL P[[ L8 VJ[z U帀WP1PPgԃ2PWPNPG > Oh$u,NNNOOOSR6> Ou*NNN ON1SR1PPXZ UVW~ORPOY[ӉN^VJ16NFFVJ16NVVNVNWPvvӃ> Oh$t^㍷W.OT0OT2OT4OTL 6O8OT L:OO@OTLBODOF~ |V\w7^㍟FOGFы^㍷W.OL 0OT2OL 4OTL6O8OTL :OO@OTL BODOF~ }$V\1P7^㍟FOGFnOVpOnOpOU.OU0OE2OU4OE FOU 6O8OUM:OO@OUMBODOUM1[[[[1ۉ[[UPPVF#.O@t L~t6O8O9[vu 9[rt6[6[1PPpF u%WP6[6[1PPRPF[[RP=уFWƋV tPDPv ^G[[gFUVVNVN1vv98Owu96Ow PP(OV^V^VNF)؉NFN~w?u9Vs8^㋗FOHOVNOQRZ[V^V^SRVN+NVNN~w u9VsN㋗FOHOVNN㋗FOHOVN u1PPDOV^V^9[u9[tSPvvσVN[[VN+NVNQR1P6N Ɓ> Oh$uSS 1PSFFvv1P6NLFVV Vu1PPOV^V^9[u9[tOPvv΃VN[[> Oh$u^OO ^1POZYVNOQRZ[V^V^SRXZU@VWv revision Too many boot parameters emssize=memsize==label%s click size is bad %s requires features this monitor doesn't offer colorchromeconsoleKernel magic number is incorrect There are no programs in %s %s %8ld%06lx %06lx %7ld %7ld %7ld stack cs ds text data bssYou can't run a 386 kernel on this 80%ld There are more then %d programs in %s . Loading processorThere are no images in %s %s: %s Can't load %s: %s No image selected Minix5454 44 4Unsuspected EOF on %s Not enough memory to load %s %s contains a bad program header image> %6>X=c>d[=o=p=sC>u=x= Hit any key to reboot D] Out of%s Low on memory, use chmem to increase the heap  (null)<8L/?2.16$ v f V @  @xhXH<&bootdelayechoexithelplsmenusavesettrapunset0123456789ABCDEFxtatmcamdacgaegaegavgavgamonocolor ZRF:zpZ@0 pbRB& ~lbootopts0123456789ABCDEF0123456789abcdefD]D]8 "1м|PPRV}}&DFF? G0 tF00rF1۾"}DT0FVs+v50ƊV(:vPY V}L\DT VB^rDd(u:$u^0 }$< rNu}tRead error 00   1؎м|tvd?POyH~#uv~#teQp?, ^|u8s?H( ?FtE0y< tÉ^t ?u,0<wƊDtR?ƈËDT s 0Zƻ|ZVD\ B^sx Read error >}Ut[ Not bootable þ} ù|8lt]+\] \ s \F9rr| b1؎м|Vy7|t tKr@ÃrNo active partition„x8w rsþfRW_?ƈËDT s 0Zƻ|ZVbD\ B^st O|0sÁ>}Uu_Not bootable'%}$< rNu7Read error 00&. Hit any key to reboot.0 ^t |>...elv_21.1 ?...@lastlogAlogBwtmp daily.lasttime oldC...D.ashrcE.ellepro.b1F.ellepro.eG.exrcH.profile# Ash initialization. test -z "$EDITOR" && { # Don't repeat in subshells. umask 022 # Favourite editor and pager, search path for binaries, etc. export EDITOR=vi export PAGER=more export PATH=$HOME/bin:/usr/local/bin:/bin:/usr/bin } # End of no-repeat. # Let cd display the current directory on the status line. if [ "$-" : '.*i.*' -a -t 0 -a -f /usr/bin/tget ] && tget -flag hs then hostname=$(expr $(uname -n) : '\([^.]*\)') eval "cd() { chdir \"\$@\" && echo -n '$(tget -str ts \ "$USER@$hostname:'\"\`pwd\`\"'" \ -str fs)' }" unset hostname cd . fi ,!, &SN %t  DrT<@\i[#V0_1_2_3_4_5_6_7_8_9_AkB2CEfF "Insert Self") (keybind ? "Insert Self") (keybind @ "Insert Self") (keybind [ "Insert Self") (keybind ] "Insert Self") (keybind ^ "Insert Self") (keybind # "Insert Self") (keybind $ "Insert Self") (keybind % "Insert Self") (keybind & "Insert Self") (keybind ' "Insert Self") (keybind * "Insert Self") (keybind + "Insert Self") (keybind , "Insert Self") (keybind - "Insert Self") (keybind . "Insert Self") (keybind ! "Insert Self") (keybind " " "Insert Self") (keybind """" "Insert Self") (keybind "(" "Insert Self") (keybind ")" "Insert Self") (keybind ";" "Insert Self") (keybind "\" "Insert Self") (keybind _ "Insert Self") (keybind ` "Insert Self") (keybind { "Insert Self") (keybind | "Insert Self") (keybind } "Insert Self") (keybind ~ "Insert Self") ; CTRL char (keybind ^A "Beginning of Line") (keybind ^B "Backward Word") (keybind ^C "Copy Region") (keybind ^D "Scroll Window Up") (keybind ^E "New Window") (keybind ^F "Forward Word") (keybind ^H "Backward Delete Character") (keybind ^I "Insert Self") ; open (keybind ^K "Kill Region") (keybind ^L "Replace in Line") (keybind ^M "CRLF") (keybind ^N "Kill Word") (keybind ^O "Open Line") (keybind ^P "Backward Kill Word") (keybind ^Q "Write Last Kill") (keybind ^R "Replace String") (keybind ^S "Push to Inferior") (keybind ^T "Kill Line") (keybind ^U "Scroll Window Down") (keybind ^V "Find File") (keybind ^W "Save File") (keybind ^X "Prefix Extend") (keybind ^Y "Un-kill") (keybind ^Z "End of Line") (keybind "^\" "Quoted Insert") (keybind ^_ "Move to Window Bottom") (keybind ^^ "Set/Pop Mark") (keybind ^] "Goto Line") ; ESC char (keybind ^[ "Prefix Meta") (keybind M-0 "Argument Digit") (keybind M-1 "Argument Digit") (keybind M-2 "Argument Digit") (keybind M-3 "Argument Digit") (keybind M-4 "Argument Digit") (keybind M-5 "Argument Digit") (keybind M-6 "Argument Digit") (keybind M-7 "Argument Digit") (keybind M-8 "Argument Digit") (keybind M-9 "Argument Digit") (keybind M-A "Append Next Kill") (keybind M-B "Select Buffer") (keybind M-C "Uppercase Word") (keybind M-E "Execute Kbd Macro") (keybind M-F "Find File") (keybind M-G "Insert File") (keybind M-H "Describe") (keybind M-I "Uppercase Initial") (keybind M-K "Kill Buffer") (keybind M-L "Lowercase Region") (keybind M-M "Mark Paragraph") (keybind M-N "Buffer Not Modified") (keybind M-O "Lowercase Word") (keybind M-P "Forward Paragraph") (keybind M-Q "Query Replace") (keybind M-R "Set Profile") (keybind M-S "Select Existing Buffer") (keybind M-T "Transpose Characters") (keybind M-U "Uppercase Region") (keybind M-W "Transpose Words") (keybind M-X "Return to Superior") (keybind M-Y "Un-kill Pop") (keybind M-Z "Incremental Search") (keybind M-^ "Exchange Point and Mark") (keybind M-* "View Kbd Macro") (keybind M-[ "Prefix Extend") (keybind M-] "Backward Paragraph") (keybind M-= "Delete Horizontal Space") (keybind M-| "Delete Blank Lines") (keybind "M-," "Move to Window Top") (keybind "M-;" "Indent for Comment") (keybind "M-." "Indent Relative") (keybind "M-/" "Start Kbd Macro") (keybind "M-\" "End Kbd Macro") ; CTRL-X char (keybind X-1 "One Window") (keybind X-2 "Two Windows") (keybind X-A "Up Real Line") (keybind X-B "Down Real Line") (keybind X-C "Forward Character") (keybind X-D "Backward Character") (keybind X-G "List Buffers") (keybind X-H "Goto Beginning") (keybind X-L "Grow Window") (keybind X-N "Other Window") (keybind X-P "Shrink Window") (keybind X-S "Reverse String Search") (keybind X-T "String Search") (keybind X-U "Next Screen") (keybind X-V "Previous Screen") (keybind X-X "Return to Superior") (keybind X-Y "Goto End") (keybind X-^A "Up Real Line") (keybind X-^B "Down Real Line") (keybind X-^C "Forward Character") (keybind X-^D "Backward Character") (keybind X-^G "List Buffers") (keybind X-^H "Goto Beginning") (keybind X-^L "Grow Window") (keybind X-^N "Other Window") (keybind X-^P "Shrink Window") (keybind X-^S "Reverse String Search") (keybind X-^T "String Search") (keybind X-^U "Next Screen") (keybind X-^V "Previous Screen") (keybind X-^W "New Window") (keybind X-^X "Return to Superior") (keybind X-^Y "Goto End") (keybind DEL "Delete Character") set autoindent autowrite report=2 showmatch # Login shell profile. # Erase character, erase line, and interrupt keys. stty sane erase '^H' kill '^U' intr '^?' # Check terminal type. case $TERM in dialup|unknown|network) echo -n "Terminal type? ($TERM) "; read term TERM="${term:-$TERM}" unset term esac # Shell configuration. unset EDITOR; . $HOME/.ashrc #!/bin/sh # # DESCRIBE 2.1 - Describe the given devices. Author: Kees J. Bot # # BUGS # - Arguments may not contain shell metacharacters. case $# in 0) flag=; set -$- /dev ;; *) flag=d ;; esac ls -l$flag $* | \ sed -e '/^total/d' \ -e '/^[^bc]/s/.* /BAD BAD /' \ -e '/^[bc]/s/.* \([0-9][0-9]*\), *\([0-9][0-9]*\).* /\1 \2 /' \ | { ex=0 # exit code while read major minor path do case $path in /*) name=`expr $path : '.*/\\(.*\\)$'` ;; *) name=$path esac dev= des= case $major in # One of the controllers? What is its controller nr? 3) ctrlr=0 ;; 8) ctrlr=1 ;; 10) ctrlr=2 ;; 12) ctrlr=3 ;; esac case $major,$minor in 1,0) des="RAM disk" dev=ram ;; 1,1) des="memory" dev=mem ;; 1,2) des="kernel memory" dev=kmem ;; 1,3) des="null device, data sink" dev=null ;; 2,*) drive=`expr $minor % 4` case `expr $minor - $drive` in 0) des='auto density' dev="fd$drive" ;; 4) des='360k, 5.25"' dev="pc$drive" ;; 8) des='1.2M, 5.25"' dev="at$drive" ;; 12) des='360k in 720k, 5.25"' dev="qd$drive" ;; 16) des='720k, 3.5"' dev="ps$drive" ;; 20) des='360k in 1.2M, 5.25"' dev="pat$drive" ;; 24) des='720k in 1.2M, 5.25"' dev="qh$drive" ;; 28) des='1.44M, 3.5"' dev="PS$drive" ;; 112) des='auto partition 0' dev="fd${drive}p0" ;; 116) des='auto partition 1' dev="fd${drive}p1" ;; 120) des='auto partition 2' dev="fd${drive}p2" ;; 124) des='auto partition 3' dev="fd${drive}p3" ;; *) dev=BAD esac des="floppy drive $drive ($des)" ;; [38],[05]|[38],[123][05]|1[02],[05]|1[02],[123][05]) drive=`expr $minor / 5` des="controller $ctrlr disk $drive" dev=c${ctrlr}d${drive} ;; [38],?|[38],[123]?|1[02],?|1[02],[123]?) drive=`expr $minor / 5` par=`expr $minor % 5 - 1` des="controller $ctrlr disk $drive partition $par" dev=c${ctrlr}d${drive}p${par} ;; [38],12[89]|[38],1[3-9]?|[38],2??|1[02],12[89]|1[02],1[3-9]?|1[02],2??) drive=`expr \\( $minor - 128 \\) / 16` par=`expr \\( \\( $minor - 128 \\) / 4 \\) % 4` sub=`expr \\( $minor - 128 \\) % 4` des="hard disk $drive, partition $par, subpartition $sub" des="controller $ctrlr disk $drive partition $par slice $sub" #par=`expr $drive '*' 5 + $par` dev=c${ctrlr}d${drive}p${par}s${sub} ;; [38],6[4-9]|[38],7?|1[02],6[4-9]|1[02],7?) tape=`expr \\( $minor - 64 \\) / 2` case $minor in *[02468]) des="controller $ctrlr tape $tape (non-rewinding)" dev=c${ctrlr}t${tape}n ;; *[13579]) des="controller $ctrlr tape $tape (rewinding)" dev=c${ctrlr}t${tape} esac ;; 4,0) des="console device" dev=console ;; 4,[1-7])des="virtual console $minor" dev=ttyc$minor ;; 4,15) des="diagnostics device" dev=log ;; 4,1[6-9]) line=`expr $minor - 16` des="serial line $line" dev=tty0$line ;; 4,12[89]|4,1[3-8]?|4,19[01]) p=`expr \\( $minor - 128 \\) / 16 | tr '0123' 'pqrs'` n=`expr $minor % 16` test $n -ge 10 && n=`expr $n - 10 | tr '012345' 'abcdef'` des="pseudo tty `expr $minor - 128`" dev=tty$p$n ;; 4,???) p=`expr \\( $minor - 192 \\) / 16 | tr '0123' 'pqrs'` n=`expr $minor % 16` test $n -ge 10 && n=`expr $n - 10 | tr '012345' 'abcdef'` des="controller of tty$p$n" dev=pty$p$n ;; 5,0) des="anonymous tty" dev=tty ;; 6,0) des="line printer, parallel port" dev=lp ;; 7,*) d=`expr $minor % 16` n=`expr $minor / 16` case $d in 1) case $name in psip*) des="Pseudo IP #$n" dev=psip ;; *) des="raw ethernet #$n" dev=eth esac ;; 2) des="raw IP #$n" dev=ip ;; 3) des="TCP/IP #$n" dev=tcp ;; 4) des="UDP #$n" dev=udp esac case $d in [1234]) if [ "$name" = "$dev" ] then des="$des (default)" else dev=$dev$n fi esac ;; 13,0) des="audio" dev=audio ;; 14,0) des="audio mixer" dev=mixer ;; BAD,BAD) des= dev= ;; *) dev=BAD esac case $name:$dev in *:) echo "$path: not a device" >&2 ex=1 ;; *:*BAD*) echo "$path: cannot describe: major=$major, minor=$minor" >&2 ex=1 ;; $dev:*) echo "$path: $des" ;; *:*) echo "$path: nonstandard name for $dev: $des" esac done exit $ex } #!/bin/sh # # M, U - mount or unmount standard devices. case $#:$2 in 1:|2:-r) ;; *) echo "Usage: $0 [-r]" >&2; exit 1 esac . /etc/fstab dev=$1 dir=$1 case $1 in 0) dev=/dev/fd0 dir=fd0 ;; 1) dev=/dev/fd1 dir=fd1 ;; PS0|at0|fd0|pat0|pc0|ps0) dev=/dev/$dev dir=fd0 ;; PS1|at1|fd1|pat1|pc1|ps1) dev=/dev/$dev dir=fd1 ;; root) dev=$root ;; tmp) dev=$tmp ;; usr) dev=$usr ;; *) dev=/dev/$dev dir=mnt esac case $0 in *M) mount $dev /$dir $2 ;; *U) umount $dev esac #!/bin/sh # # cd 1.3 - equivalents for normally builtin commands. Author: Kees J. Bot case $0 in */*) command="`expr "$0" : '.*/\(.*\)'`" ;; *) command="$0" esac "$command" "$@"   p7T,d21$T$Lsu;SSSSu QRPp PUh51hjUuuuu PP-YPPj, }t5,Yja,YUVW}1?t ?/uGuE~uuYF_^UVWu} fEuAhV,YYEyVhpj* fE,EPu!YYEWV,YYEyTu?jVYYP+Y= uV51h\jjVYYY\VhLj jju+ uxY%fEU,tUetVh4j` E_^U5e+Yj*YU(VW1E 1}}U r>v w k b T K = / &  v /4Fit }R= tEP51f*YYU = th5*YYh5*YY      Ãt= t= u= u= u = t 5)YhY| hqY =| t = uhjeYY  hj&YYu usYY1_^Uh85 HYYu1L=PyhjYYjh8h ) uj5P5 ( 럸8UDVW} E= u= u = t1Pw YY = u= u = tj5YYEƅ}EU9U}#UjV4wYP( tEՋU9Ut = = u= u = tLU9Ut U4h YYUVuYYju5 V9VjtBFP5 X' = u = t VY= E= t&UEP4$'YYxU9V|E}uUhu4q VuYYju5 V= Vh|YY= ỦUȉučV 9UwUĀ:tEċMȊEU EȋU= WFPYEFPYE@UBUMEPRQvFPFPuhdO "EPA Y= t Vh\?YYVjtBFP5 % UXU}eEU9URU:t@= u = tUhPu4 U4h@ YYE뢀= u= u = jj"YY5 $Yu$YjwYY j5uYYEph(h u$ E~uh 5  u`$Y5$Y5 H$Y_^U(VWEPuo$YYyuhjM U@uuhj$ ju$YYE؅yuhj _juGYPh$ E0]1fUf2U,U4= t#01f2 ,hu YY54uaYYjju?# 4tB4x }q(9}s!}EtBU)UVh u" 9tuhj Wh u  녀= thuYYua"Y_^UVWujVEPT# E= u.hEP*"YYDžyEPhj= = t+= uEPh {YYEPhiYYjW5 V0x tW!Y= uFPEP!YY_^U VW}WUt1E}uJjju {! Euu ~YYUtBEx juu @! }(~(EVh u 2! 9t&jWEP! EEPh(j }xVh u$ U)U}t*jju }x}ujju _^UVW} E}otr-k]ƀtw-k]C@tx-k]Etsts_^Uh<jYYUhLjYYUVWu }WVu 9thXjYY_^U,VW}Ջu U 9r >tFGGEPuYY_^U(VWtj5 YZ1sD=GhhEPYY UEP YEEfE$= tEE UEP5 YY5 5 YYUU5|  | 9v UV5 5| 5  55 rYY55 5  _^UVuuV t1^U} |4uYuEPqYEPYt EPYUVWUJ MUJkUB JUZ k ȉDUMI9JurJ YDžuhtjOYYUrWWYY}}d|dE@HU+@U@HPYY@I@t+D8>u Ջ8V€tVtVY W Y_^UV 9 r4 R5| c YY| uhjWYY  | ы | x JE0 9r1 R5 YY uhjYYP5 YZ>tF ^UU URuP> PPh( UVU4\95TtjV5X< uu 5Xd u5TU4\^UjuYYXy1 5XYUV1}\Ftjju ly1*lT\UXp^U5XKYXUXUVW}jWj WkG lE`WUUdW k EUh_^UVWuVkF =llj=`_^UVW}kE kE PWjM kE ׋tU tU уM t"lW tI tX_^UUX\UpUVu uj pX֋M  ^UVW}U RWj _^UVW}kE PWj~ _^Uu ujg U(VW} u}jVu E؅u1}tEU؉IM؅t FU܈EG% GFG&FgfGG% G_^UjEPu, EUUUjuuu u ZY EU(VW} u}EU؉IM؅t EE܊FWfWfOFOFfWfWfWfjEPu _^UVW} }t=U9EVWu9 9t׋U)U_^UU fUjEPu UU UjEPuv U,VW} URWuR _^U#+ $E1U$VWu }>W>%CEF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurMYYEINU܉U@PYEtUUurYYE>%u EU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW} }t=U9EVWu 9t׋U)U_^UV s~u1^U}u1Euu 0g 19EuCUVW}1} EN} ~#yډU9t%}`ET} J] yCEE} s#eyEU 9U| U+U UGE׋EN} N} Džu}t N-N0_^UuIYPYUV5Nx 1^U=tuYUVW uYƹ<+F؉F+ډV YV YDžt"<1FF1V Y_^UVU9wU9v 16V\Yt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPA>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFh$VW ƅu1MWW YZ׀>/u0Fuh$VEP ƅu1EEGu>t1_^UVWuE}>:tVh YY_U  $U4 V Y=Vh YYVhwYYƅ>-uF>+uFjVEP ƅUUj h5 1VhYYƅpj h58 >t>,tjVEP ƅt5U>t'>,u"FV Y=xwVhYYƅu_^UhY YPLY UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE$E=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VW hVYYUR<8EMxGFFURtG9uF>uր?=uэG1_^UVW( EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9tFN>Xu E0EEF>t&azjuYYyEG߸_^U(VuU @t*uYEU UV֋RUUUEPudYYU UEPjj' ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjA V` X 5h hL jKjq ^U$uYEUUU UEPjj8 U$EPj j y}tUEEU$EPuYYEPj j U$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^U$U UEPuYYEPj!ju U$EPjj] U$} uEEUUE UEPjJj! y}tUEEÉ{sƉKI|;u[u P1ۇtPXP[acdrtxvlu]usage: %s %s archive [file] ... %s is not in ar format cannot open %s %s: creating %s cannot creat %s  DacdlrtjuvvxOut of core /usr/tmp/ar.XXXXXXar.XXXXXX__.SYMDEFarchive has member with negative size %s: not found a - %s d - %s %s%3u/%u%7ld %s %s %sr - %s (old) r - %s %s: already in archive %s seems to shrink cannot open %s %s is a directory (ignored) cannot find %s <%s> x - %s cannot create %s read error on %s write error read error write error __.SYMDEFstring table too big string table overflow Out of core bdoux %SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ??? ??? ?? ??:??:?? ???? /t $Header: archiver.c,v 1.23 91/06/20 14:22:37 ceriel Exp $10123456789ABCDEFGMTGDTU U 4,$ xph\TH< SSSSd2  lLd1$T$L|Lsu;SSSSuDD QRPCPnGU}tU:u'5@KYP5hhV(5KYPu5hhcVPUuYjPYUVu} u hFYtu VHYYu GYTujY^U}tuIY TUVuXYPjYYuV|XYY^UuhLXYYthj\UYYJxUhu[QYYUVW1u>tFPh`WYYt߅thj"8UYYU:tEPYYthj"UYY_^UVuhL|UY hDlUYVYh<ZUYh4JUYVYh,8UYV rh "UYYFPYvYhTYhTYthTYdhTYW=L|PTY9=L|PTYhBDYFxi^UVut3F=(v Y~u~thj SYYvɅtVY^UuzYhj vSYYUuYhj ZSYYUV=t5VT jjYYfFFFF F^UVWK1Ur>tFi10UJUBUBXg_^UVWhuYZE 2Uzu.1t"UvrTYYDž~ VE 2څt1_^UVuJfF=xEPVbYYE9uVEF~uPFtJ=L|"hlNRYvFYhj QYYvrSYy=t vYvrYv >Yv5YV5 T^UVWuu1]Bf F=}9EPV}YYDžuEVE0BfVY_^Uu ~YE uYE UVeƋEFBfU V ^UVu t F9Eu VuYY^UVFU RjYYFu uvlR VU VY^UuRYPuYYUVW&L>tA ut0W UWUG G>uYu}Y뻃먋TU쾴&s>tf6GY݃}t!}tu5hth7Ou?Y_^UhuOCYY=L|j hjP PUEqu}_t }|1U=+=+ u**:x*X@ 5*HY+=u*R t 5*Y=+u&5*5hh$Nj)YUVWEXt:+qt%F+VVY%X=+\d}Z+qt@=+#u"Xu=+ t =+u+qu떃 X=X=+#u/=t}t b=+ t =+uET+qtF=+ t==+t4E =+ u=+u1nƃ}tEFVUYaXuH=+"u?Xu XFVY&%XVNY"Xu'5+tPNYY=+ u/55*h|hK%XPXt=+nu + %XF+V XVNYZ=+$^.uF>.uF>/tH5*GYPjYY5*hhVE5*Y5*h5*CYY*u 5*&Y5*dYE5*nYUR*+iuYt?=*t 5*A<YuYE_^U VWu f~ t V zS~ DEU9ukEES0iYY]V B]UP3MYZv뒅u4Eu0YYPjYY]]E~ vu}1?t h3YW U}u hdr3YUzt h(^3YUrEYEE]9sUUEER0zYY]UEMurQD UUuRuVu<_^UVut1!v Yu1#v1FW^U8VWuEUU} ~t hlk2Yv YvV!YYƃ} uE PW/YYDžtuu w WYYNjE8E8t0jYY]Eދu} VYuEUUURj YYEEEPuEPVEP2u*Y}u h4~1YVYu} Y~tAV zt hP1YV EPrBYYxv uYYBVօuUr uYY'~u v VYY} | VjYY_^UVu>t26jYYU 9P u}tp6YYЋ6Ƀ>u}uu jzYY u Y^UVuT1[v Yu vYt:16V BuV r Yt11FT^UVWuEUU1gu V7YYW} } VIYtV u r VYYPYYƉ$r 5*hth?PVY1hDX/YF'TVYEV ׅY u9} }E u}Yu vVYYPYY]Ek} |~ tu WYPYYǀ~t h.YvVlYYƃ} |E8WjpYY]E880jYY]EڅuuYE} }!uYVYjuYYuYv ZYvVYYƅtt uGEWIYjWYYDžtuuw YPEP uWEP zwWRYY뷋E_^UVW1d7tU 9VuU9V t?u4jjYYƉEFF1҉VV VF}uF}uF F}t VvUYU Vv FYUV _^U=L}1 hrh< U4VW=Pu =L| uYUUURjYYE}W UEz uUUUz uUU}u9UMCr]U9UeURV%YYWׅt W Uzt3r 5*hh';PeE8x0<Y=P|DUh9Uu1AUPr< ]yUrYPU}x==P~4=Lu+j/6|=YYEЅuUEuh ;YY}=Ph!3Y]hY}xju;YYu;Y}xju;YYu;YV6;YY6%Yj*Y;EػO}x uZ;Y}x uK;Y}=PEP;YE9Et}y=t߃}VUʃMt;}t5} t/€tPu65hh9PVY_^UVWPYPYFPYVBVB VR B Vr xYVB uiYF u ]YVRB jVKYPYYEPUYU V VRMJ jVYYW0Y}u u1_^UVW1u>t86jYYP Ux}t zuBNj6Ã} tuEr 0YY]_^UVW1=L5(+:YEP5(+NYY(+@9(+UPh<R;8 (+RRG:YZУLLLaBL(+%'()*+,-./0123456789:;<=>?CBja5LWZYZL@(+L$oL_^Uu9YPjYY(+8PuhP5(+7(+RR9YZУL=Pt>h5(+H8YYy(=u5(+YP빃=L|5(+hD6YYL:tLLL/LULL:/u5(+7Yy=t 5(+ Y=L|5(+h\_6YY5(+YUVWuEUU>tqtF>Y?tqu?:tG9u hh;Y )RVYYPjYY]EFuE_^URR urq 5*hlh4PURR rq 5*hh4PUUBt8U rq 5*hh]4P1UVWu5hh(4 t)~u~ v1whh3 P_^UVRօt-~u'V օt~uuvs6YYu1^UVuu1~u ~uF 1^UTVW1RR*RU}t GURURURUu1UBEUz R zUr DYƅu0r 5*h h2P@VY1VUVVjuPYPYYEv XYUV  UVvh 2YYuYh DYguUr pYƅuh YVkY}t uYv YF VVLh YuUr Yƅuh |YVYv9"YEtuvh| 1 uYEv YUV VVht 'YZjuYP_YYEujEPYY=t1tuUr YƅuuYh` Y0VYtusYE}u\ UBE0E@uC3YPu93YZPjYYUBUur2YYUur2YYuYEuYv YUV VVUJUJzWUrvhL b0 <h@ YyjuYYPYYEjEPFYYyuPYh8 SYtUrh( /YYUJUJu Yh .Y=+~ 5juYPSYYEjEPYY=tuYh YG5+YU܉+H%Urh 3/YYh Yju+YPYYEjEPYY=tuYh "Y tUrh .YYUj EPr" UԀ:tL=+u +B 1PY=+uhj:-YYUrh h- uY' h YjuDYPYYEjEP1YYu;Yh >Y th -YuYuYhj 4-YYuY h Y uUz t R zt2h YJQjK YYl6 UR UURR U7tbh ,-Yju=YPYYEPzYu>Yh ,Yju YPYYEPYu YuuYYEJQ}t1P YYUlr h Yuh YuUr Yƅu2h YJQj YYl t uYUR RB1=nuCV11؉EJQ}t1P YYUl h| Yuht YEjuYP7YYEjEPYY=tuYhl Y+ AtŰMI rqhd '+ UR RztuUBMEDUjr,YYEȅx.jEPu, =u }#uEu+YuYJQ}t1Pt YYUl` h\ Ymt(hX YJQj+ YY 6t u/YJQ=lu1PYYhP ^Y=+~ eu2Ujr YP{YYEUjr YPbYYEu(jEPYY=ujEPYY=t'uuYuYh@ Y/EtUMrqh0 .) UrXYUMJUJUJu6Yh( XYV=+t _+R zt0r 5*h h'Puu2Ujr YP6YYEUjr YPYYEu(jEPlYY=ujEPXYY=t'uuZYuQYhTYtUMrqh' dUă}t&UĀzuUċM9JuM9J t EċUԃ}u7UMrqs 5*hh&PuYuY}:UċRUUċRU+R U+R UUUĉR+MċR Q+B +B +B u YUċ +RQ UċMJUċMJ+MJ +MJ +BUqhYUUjuYP!YYEjEPuYY=tu|YhY+tUrh&YYUċR*UEu+YE8tUMI EEUًUrYUBEEUEUUnhY=+~ Hs(hYJQj&YY1t u*Yju9YPjb JQjYYhTY=+~ [u2Ujr YPqYYEUjr YPXYYEu(jEPYY=ujEPYY=t?uuYuYhlYJQjYY #tUMrqhX $ uujJ JQjYYhPtG9uF>uր?=uэG1_^UVTU9TwUT9Tv 16V Yt1'TrF5T&Y5T^UVW}u1E}UUs 1=Pu8jY=u1V!փ5P5TFE5XOVU}9}r69v2W9UvUW~>}t EXu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=X<9}r79}u+UOJ}t EXURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Xt 9ur6E0tU UXtU9ru NJEtU9Wu RWE_^UVu~  u6EPzYEU UEPEPV yE^UVux95< 0^UVujuu V!^UVujuu V^UVWuEEEu} tE 0qtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUU UUUEYEPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW11}U9u F߃| jugYtUr YtURtUzt rY}t}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvW EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF\FF VVv vva >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }xfQ~y UVu CV€tu ,fNV~u>5T Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv4 =tN V@FF t V 9ډUVVFt$jjva =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E  sU :t! EE E 4 JU uuuKYYEy@Ut8huIYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuud EUJUx ]E EPjYYEUuu hu/?3SvUSE] ![]USE] ![]USE] ![]UVW}u M.UW}0))ϊE tu1_]XG_]UVW)E_^].UW}0OE uG_]1_]U=xtxjYU}x}~ubPYYU$UUEPjj U$UUEPjjg U$U UEPuYYEPjj9 UVu x~ 5juIYYy9uuVmYVju! ^U4VWEj/u+YYuhkYƅuVyYPujYZEЃeu*YE=u}؀>t >:tFG9}s/GuWYYEPuYY=t4D2u u =t Ũ}t} uFuURYỦ_^U(VuEEV֋RUV֋RU E UUU UEPj7jf ^U$EPjjM U$EPjj5 U$EPuYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEU$uYEU UUUEPj'j U(VuU @t*u>YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$EPuN YYEPj(j UHVuUVUVUV UVUЋU UEPY^UVuEP[YjEPjU V|5hpjKjA ^U$uYEUUU UEPjj Uu hT$u U$EPuJ YYEPj j U$EPjj y}tUEEU$UUUUU UEPjjg UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U< EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ul= JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEE-E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPLYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuAYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh$hYYj*YUVu\YƋU rU MJwU uRYY^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKV@YE=u&UEUUU}׋U UE8t=+UEEE0 YE܋]P3WU }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuiYEuUUȋUUEEEPj;jZ RY_^U$UUU UUUEPj6j U$} uEEUUE UEPjJj y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P1ۇDtPXP%s: %s: %s %s: %s Assertion "size > 0" failed, file "acd.c", line 71 \'"<>();~$^&*|{}[]?~`$^&*()=\|[]{};'"<>?< Jl<<Assertion "0" failed, file "acd.c", line 220 >>>><<<<***---+++===$$${%s}"""""")))(((((()))zi=rm -f %s: internal fault: %d chunks still on the heap # interrupt %s: %s is a binary file. ( ) * + - ; < = > "%s", line %u: $%c unmatched, no '%c' "%s", line %u: Word expected after '$' "%s", line %u: missing closing quote $=()+-*<>; $Y ))Y)YY)))uuuuuA!!!A!~!!!kkkk"%s", lines %u-%u: unmatched '(' Assertion "0" failed, file "acd.c", line 803 "%s", line %u: unmatched ')' %*sr/usr/lib%s/%s/descrstdinAssertion "q->type == WORD" failed, file "acd.c", line 941 Assertion "q != nil" failed, file "acd.c", line 940 Assertion "p->type == CELL" failed, file "acd.c", line 938 Assertion "s->car->type == WORD" failed, file "acd.c", line 1029 Assertion "r != nil" failed, file "acd.c", line 1020 Assertion "s->type == STRING" failed, file "acd.c", line 986 gC& A&&&Assertion "p->type == CELL" failed, file "acd.c", line 1140 Assertion "0" failed, file "acd.c", line 1119 "%s", line %u: Can't do nested assignments %*sL - core dumped%s: %s: Signal %d%s fork()%s "%s", line %u: I/O redirection without a file z/acd%dmkdir %s %s/acd%drmdir %s ."%s", line %u: Usage: %s %s "%s", line %u: wrong execution phase for '%s' "%s", line %u: %s is read-only %s%s:compilescan %s combine combineprefer %s %s prefertransform %s %s transform ...arginclude %s include"%s", line %u: no %s %s transformation apply %s %s "%s", line %u: $* is not one file applytreat %s %s treatelse%s %s ifhashiftempifndefifdef = if = iferror expr ...error '%s' is not a number numeric %s numericstop %s stoptemporary %s temporarymktemp %s=%s []mktempimport %s=%s importunset%s === "%s", line %u: Usage: = expr ... "%s", line %u: empty body, no statements "%s", line %u: (warning) sudden indentation shift === "%s": no stop suffix has been defined "%s": contains a combine-combine cycle "%s", line %u: $> should be returned as a single word %s combinetransform%s %s: %s: can't compile, no transformation applies "%s": An assignment to $> contained junk === Usage: %s -v -vn -name -descr -T ... include %s ><*i386ARCHVERSIONPROGRAM/usr/lib/descr-descr-name/tmpTMPDIRunknown errorVaUrUwUJV++Vb!VNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH\~\\~\\~\\\\` -`@b`aXoabTadfaifao]apoaufaxoa_b Pb#Ub+Kb-Fb0ZbQeL9ch#cl.cWcEdGdXCdbCdcdddedfdgdidncoCdpCdr1escuCdxCd(null)cannot print floating point 1.9+ ((((( AAAAAABBBBBB SSSSB+Unknown errortdL@$tdXD4$|dTH8$          hTH0 t ` L C  S_1$T$L su;SSSSu  QRP PUVWEE j/02YYu ] h52YYu Bh51YYu  5hhd / jYDž|DžxDžtDžpEEEEEhu uy' E=$|tDž|xtoDžx릃ptUDžp댃tt;Džto}t!UV}tU=}tU$}tU }tU5hhd . jhYEQU9, th|txtQ|U|t}t }t}u(}t }u }tUUuUUUU}EPuhYYu#u5hhd A-jYEEDžlEPEPVg t DžlWEPVTYYuGV YEtP U1EPVYYu!V5hxhd ,jYMMEu}tPEGE@u E8E u E)u YP5hThd F,EU҅UtEluUU}tCltEPueYYu#u5h8hd +j=Y}t?jEPu EU:u}$u5h hd +Eu hYDžu jW9-YYE=u.5$ 6YPW5hhd 6+jYpuYP}tP=uPh+uYPhv+YYupYPh`+YY}t=uuh|B+YYhx6+YEUUȋUŰUUЃ=uE1Eԃ=u tt1EEE=u'EP}t,n(@)n(@Pu+ E%EP}t-n(@*n(@Pu+ E}uV5$ YP}tIOP=uSDP5h\hd )jYjY_^U=uP=u($P=u40P=uHDP5hPhd )jcYUVu uQ YYu9uKYƅu1+~t1!~ t1Vj2u * ^UVWj/u*YYƅu1FEEPu YYuEj EPVw 9ut U:u vEN/}u1mUE u1 )ѺУ ʋ  ы ʋE_^UV5 Nx ^U= t u,)YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+$ "}t}y UU_^U8VWEU UUUUfRftt t ىM؋UfRftt t ىME<Eu }}`uuVuuS Džyp1W΋Uu&YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt p p1+EEE E EM9uuuVuuC DžV9 YEV, YEV Yǃ}u@ց}8sUEEuY%YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u Uuut$YZЉEE1UU=s-UEȉEWVR# UUE;}tEE p1_^UVW}-0= >N>.WY@=up1= @ X-0= r>.uF\hPjjWN y1jPi _^UVW}}t1PGPGPGPhP3!hPj jP Ey1HjuP ƅu1*UVU V  @@_^UVW5xPYDžt-u7!YYtw>tu6!YYt=xuD_^U=DuhhYYD 5D YU xU=Dt5DYDxUVW=Du!h8h<kYYDu15DhhH Eu1U:#th4u$YYƅtULh0u$YYƅtF> t> uFh,V$YYEtEVYXT\P׃}tut8>t3> t> uFs7h(V$YYƅtFL_^UVuEPVYYtE$ ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU LE>} tF=  ً ʋ  ыE _^U(VWuUU1E >0uEF>xt>XuEFUjE-0= sE-0UF̃}u>E Dt1E ]aPsaAZ)‰F눀>.u!U9Ur }E܉8EF:>t u SE܉8EUM)ѻșE=v'1EU9UsU؋T E_^UVuFPFPFPPhhh^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#Ut<}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!:+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UJ9>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWu=u hPjjjuu uj$ƅpuuVPƅyp}Gu^fWftt t uL0p7p+ppWa7_^UVWEu=u N$ puE>t >.uEF}u)uYƅtuuuu V_}u €u$}N>.?quuuu 7uE~=$ ;upl=puE=pt =put놃}t"uuuu ju%E~}t p_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhPMuuuu_^UVWhYEthuYYEu1EuhP >t uF>nuP. YYuF u>tDG?t uG1҈hVh u Y u Y1_^U@VWEEEUUЋUUE=u=u u } ~1EUffUE9UYE9U;}GIJKLMNOPQRSTUVWXYDžU= y2UMEPUP4w  =#U ftt t فfMjEP5  =t$$ U5 Y ^u u5  9E t$$ U5 RY }fEU܅t2EPW5 8 ƅ~U)fUU܅tB$ U5 Y }<}EM}fftt t ىM9M}#UfUDž #UfUU܅t2EPW5 \ ƅ~U)fUU܅t$$ U5 Y UJÜJU+UfUU܅VU܁vE܉VP5  ƅU)fU멃= y y$ U'UMUP4u u5 (9E M|Uԃ}~ Eԙ=Eԃ}Euuu5 E=u=$ EEUM9u u+UBt"5 Y E}tt}u u5 :Y EaEE= x5 Y }u}u $ ;$ = Uȉ$ _^U= t5 Y U$VWhTYDžujW YYƃu$ EE1UUfU fUEPh0n@V> E=u$ EV YGEEPh2n@V E=u$ EV Y E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh 4YDžujWh YYƃuEE73EPh@n@V: E=u $ UV YU$ _^UVWUR\ Yƅu$ wUWfUfW fG #UfWuu FP URVu E$ UVY}r UUU$ E_^Uh&jLYYj3 YUVWUR YDžu$ h&jYYEu YEURWu Ƌ$ Uxw7~1W?Yj YujYYu YU$ @RGPu W Yj_ YujdYYuJ Y_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEP]YNjE E PKY9uuąt9}t t1_^UVW=0 aU9, } , M :-u, zu , M hh4 YYu, , M 0 ǣ:tWu YYƅ}=( t=E hd 07YYhd hP&YYhd WYYhd j YY, M 0 0 :u, 0 ? F>:, M 0 C;t!A , M 0 C, U9, |W=( t=E hd 0fYYhd h,UYYhd WYYhd j YY0 ?`, A , M 0 7, M 0 0 :u0 , _^UVW11}U9| u | F߃| jugYtUrYtURtUzt rB Y}4 t}L t}d t u Y_^UVWuEu41}%<| t4| YtEG֋E ~tV€uFu1V€cE~tVuډUjuv5 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv? EU9Uu1 N _^UV1}*<| t| Bt 4| aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hgYF~uN NF 1}9<| t,| R@t| Bt 4| YGƒ~uFFF VVv vvU >uNN FFSX_^UVWEE11<| tN|1DFρECEE0-EMP1E E l$U :t! EE E #U uuuYYEy@Ut8huQYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU| E_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UU UhL uu" Ujju  E`UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu  o UVW}u M#UW}0))ϊE tu1_]XG_]VUVWM#E_^]UW}0OE uG_]1_]UVU9wU9v$ 16V Yt1'rF5&Y5^UVW}u1E}UUs$ 1=u8j7 Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVu~  u$ 6EPj YEU UEPEPV yE^UVW}?t!u >t 9tF>tG1_^UUas U EU VWDžDž|jh< YYupg#Jfh0 oYƅthVh8 h h t> uF>t> thVh j h1YYƅtDždjh PD 9> t> uF>> hVh j hYYƅt7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj hPO Q=D> t> uF>(> PVYYff UuY=u"ff=u=hPYYu&j.P2YYƅtFPh<YY]E>t >.uEF}|sj.VYYF7M 1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U X 3}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEp nuVuu ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U }EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEИ UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } -~y UVu CV€tu ,fNV~L u>5P Yt.hFtV YU )uRv EVt tfVV}u1_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^*USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UVWaE_^]L$ Uh hd YYjYU Vjh EYYƅyHu uV2 EVY}u"U JUj u4YYEt1^UVW5hYDžD7u6YYtw>t6uYYt} tu w YYu=uA_^UVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPkYjEPje V0(58hjKj ^Uu hT$u U= uh h YY 5 =YU U= t5 Y UVW= u!h h YY u1D5 hh@ Eu1U:#th u YYƅtUDh uYYEtEU: t: uEh uYYƅjFu7Y%ftt t ى L5PTHh VWYYƅtFt8>t3> t> uFs7h VYYƅtFD_^UVW}Utu >t]9uFG1_^U$} uEEUUE UEPjJj] y}tUEEUVuj jV# ^+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPR ?MDI4dgiemnov%s: NWIO%cIP%cROUTE: %s at distance %dusing gateway %swith netmask %s outputinputdeletingadding%s %s route to %s %s: unable to open('%s'): %s /dev/ipIP_DEVICE%s: illegal metric %s %s: illegal netmask'%s' %s: Warning: Martian address '%s' %s: unknown network/host '%s' %s: unknown host '%s' %s: getopt failed iovDg:d:m:n:I:?Don't know what to do when named '%s' del_routeadd_route-m metric [-D] [-m metric] [-D] Usage: %s [-o] %s-g gw [-d dst [-n netmask]] %s[-I ipdev] [-v] -i %s-g gw -d dst [-n netmask] %s[-I ipdev] [-v] Note: may be in CIDR notation unknown error%u.%u.%u.%u.in-addr.arpar/etc/networks # r/etc/networks}} &G%d.%d.%d.%dUXP_ %.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE: option requires an argument -- : illegal option -- --c/aP/r+/w://+/b}/No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain=;A=!B A@ACXCbBdBiBoBpCuBxCC C#C+C-C0CFLDhDlDDEFGpFXEbEcWFdFeFfFgpFiFn?EoEpErFsEuExE(null)cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/servicesSSSSB4 L d ((((( AAAAAABBBBBB Unknown error|hTD8|lXD0 |`L8 lXH4 C#!/bin/sh # # adduser 1.0 - add a new user to the system Author: Kees J. Bot # 16 Jan 1996 # Check arguments. case "$#" in 3) user="$1"; group="$2"; home="$3" ;; *) echo "Usage: adduser user group home-dir" >&2; exit 1 esac # We need to be root. case "`id`" in 'uid=0('*) ;; *) echo "adduser: you must be root to add users" >&2; exit 1 esac # User and group names must be alphanumeric and no longer than 8 characters. len=`expr "$user" : '[a-z][a-z0-9]*$'` if [ "$len" -eq 0 -o "$len" -gt 8 ] then echo >&2 \ "adduser: the user name must be alphanumeric and no longer than 8 characters" exit 1 fi len=`expr "$group" : '[a-z][a-z0-9]*$'` if [ "$len" -eq 0 -o "$len" -gt 8 ] then echo >&2 \ "adduser: the group name must be alphanumeric and no longer than 8 characters" exit 1 fi # The new user name must not exist, but the group must exist. if grep "^$user:" /etc/passwd >/dev/null then echo "adduser: user $user already exists" >&2 exit 1 fi gid=`sed -e "/^$group:/!d" -e 's/^[^:]*:[^:]*:\\([^:]*\\):.*/\\1/' /etc/group` if [ `expr "$gid" : '[0-9]*$'` -eq 0 ] then echo "adduser: group $group does not exist" >&2 exit 1 fi # Find the first free user-id of 10 or higher. uid=10 while grep "^[^:]*:[^:]*:$uid:.*" /etc/passwd >/dev/null do uid=`expr $uid + 1` done # No interruptions. trap '' 1 2 3 15 # Lock the password file. ln /etc/passwd /etc/ptmp || { echo "adduser: password file busy, try again later" exit 1 } # Make the new home directory, it should not exist already. mkdir "$home" || { rm -rf /etc/ptmp exit 1 } # Make the new home directory by copying the honorary home directory of our # fearless leader. echo cpdir /usr/ast "$home" cpdir /usr/ast "$home" || { rm -rf /etc/ptmp "$home" exit 1 } # Change the ownership to the new user. echo chown -R $uid:$gid "$home" chown -R $uid:$group "$home" || { rm -rf /etc/ptmp "$home" exit 1 } # Is there a shadow password file? If so add an entry. if [ -f /etc/shadow ] then echo "echo $user::0:0::: >>/etc/shadow" echo "$user::0:0:::" >>/etc/shadow || { rm -rf /etc/ptmp "$home" exit 1 } pwd="##$user" else pwd= fi # Finish up by adding a password file entry. echo "echo $user:$pwd:$uid:$gid:$user:$home: >>/etc/passwd" echo "$user:$pwd:$uid:$gid:$user:$home:" >>/etc/passwd || { rm -rf /etc/ptmp "$home" exit 1 } # Remove the lock. rm /etc/ptmp || exit echo " The new user $user has been added to the system. Note that the password, full name, and shell may be changed with the commands passwd(1), chfn(1), and chsh(1). The password is now empty, so only console logins are possible." if [ $gid = 0 ] then echo "\ Also note that a new operator needs an executable search path (\$PATH) that does not contain the current directory (an empty field or "." in \$PATH)." fi exit 0   @( ,1$T$L4su;SSSSu++ QRP PUhEY}uU rY(jjjA[ ft &hĞjsYP͖Y=Ğu:58Y5,Y5 Y5Y1UVEVh+hhhh蒝YY+:u hbYF^UVW}hTW[YYƅu WYVh!jhGUE=!tAh!uh<hl艞V t58h(hli W耠YV)Y=uWkYWhYY_^UVW}hW諜YYƅuWYVh!jhG讞E=!tAh!uhhlޝV t58hlhl辝 W՟YV~Y=uWYWhX@YY_^Uu裟YjtYUVW}EJxGGSXWחY9E z uE|UAM;1փ t}t5TJTxhhwhTV֘YYeU EV}uU_^UVuUIMt4JxFFSXVYE9E tσ}uj oWY^UP}tEu_Y:}t uNY1G} t u ;Y1hTh_YYjPEPh\W YU}6u h脞Y/UJj4|55ݜ jjj#51UUJj435詜 U Rj/5 h(jj/5jhh(u th(h۝YYUUJj4+50 jjj#5UUJj4/5 jjj#5PU0VW<<<<u<(<<0y2<40<hYY<B<1<UU=0y0ڹЙ 0E=0y0ڹЙډ0ЉƋ<B<<9 <B<<y<B<ڹЙ<B<= }t &<<<0> =0A =0G =0R u<40<hx蝛YYT<0<UU:t#-a=sPmYUEՋ<40<hdGYY1<0<U<B<0<=0F<B<<y<B<ڹЙ<B<=u_<B<<y <B<ڹЙډ<B<=0u0; h\W裛YYtYhTW蒛YYtHhHW聛YYt7h@WpYYt&h<W_YYth4WNYY 5GNY=QuF+PDY<1 <B<<y<B<ڹЙ<B<E<B<<y <B<ڹЙډ<B<ЉEh,urYYu3}u-uLYtU =0y0ڹЙډ0У0=mu1h0T Y=0~850̞< 0<W (<<<<tC<<y<ڹЙ<<=t<뭋<<<1=8u 88< y ڹЙډ8 ==0y0ڹЙډ0Љƃ4 uc<h40<9YY<h40<YY<h40<YYyEPY1=uJ<J<<y<J<ڹЙ<J<=uDPY18 0 < 80<=8tLDPSY12088< y ڹЙ8 =u =tCPY18hP=< y ڹЙډ8 Z,unCPuY1T=0y0ڹЙډ0УȞ(=0y0ڹЙډ0ЉEBu1=0y0ڹЙ 0=u!<J40<h4YY1{=0y0ڹЙ 0=t<j40<薃YY0=0h=0y0ڹЙ 0=u7=0y0ڹЙډ0=muAPY1< 0 <=0y0ڹЙډ0ЉE؋UPBU܋U܃PY1 ̞<̞=0=uH=Оum>PtY@(=Ԟt hxY5hT݌YY1'=~=~>P#Y1_^U V<:ajPh;h8E 8t<;<:t)-A=sP4Y<<<; D/<1}0</<<F<: u< D < 0<h5<zYYE<<M< Dh40<݌YYtc Dh40<YYtF Dh40<裌YYt) Dj40<}YY D< D},u: D0< Dj40<}YY D< D};t}.t}t } }u <^UV1} /<F1-}/̞/<</<F8Ȟ^UVu6=YT:t$<40<hYY G9 M69Ys6=Yt/6~@YtuOEuY8>g=Gt=Gt =Gu?8=G =G@8;t=Di| 5G=Y9jW=Y9uj 8Y{jG;=Y9ujG8Y_>u j7Yt=au :>\ujs7Yt s>u%G9iujtYi>uj7Yt >)}jp,7Yu$j* 7Yuj+7Yu j,7YtMj+6Yt +j,6Yt ,qjp6Yt pZ*R>nujo6Yto98< t)< t<40<hcYY^UVW=0y0ڹЙډ0У0=mtKh0Y=0~550<< 0<1,4@>zY9=Ȟ=0t5=0y0ڹЙ 0=J(<J<40<EP荇YY84`PrYY1h EPPYYthEP<YYu,h`P%YYt<̞uh `PYYth`PYYuhEPɆYYuh`P貆YYuhEP虆YYh`P~YYt8< si,4@> yY9=0umu @u6149=0t*t",,J<@>y1Ɖ_^UVW8< y ڹЙډ8 Љǃt*t %h{ZVt3YtL~Yhp^U84hX~YYUVW1{}$G9Kuu TFׅt/t =Di} -t+=t=p u\=p!ua]L9_^UVW1{}$G9KuV0Yt5tGF׃t5=p1uh%=p2uk=puCA_^U.t=Di| tj 0Ytj Yj+Yt=aujoYj!+Ytj![Yji/YtjiGYj#/Yt=auj#*Yjc/Yt=bujc Yje/Yt=ptjeYjo/Yu jc/YtjY=u =tu j,^YDUjn/Yt"j;0YtjGV/Yu tjG@/Yt"jG 0Ytj(/Yu tG=tuU[5UV{} V.YtV-YtVYFۃ=u =tu5^UV5G/YƃQtUu5t|jE/Yj*YtQtUu5t|jG/YjG)Yt%QtUu=|t5t|G t=tu:@4^Uj6j6jA ĞtUVWEb{}IV-Yt;V82Yu0#t+0t&tjcXYjVYY1EV.YF벿{}GV1Yt9thlhTvYYhdhTvYYjV9YYE1Fj0-YthYj0.Yj#,YtE}t uY_^U=8bujGk,Yu tG=laujL,Yu tj6,Yt jG*,Yu =tu2U= iu5pF4YVi=Ku=Gtu i=Ktu=Gtt i5iY UVW8j4jYYy&8j4jYYعډ 8j4jYYЉƺ)9it!=iu*W,Y5iiD9Ltj8.YtD9Gu j*Yh=Lu=dLu=au aj8*YtD9Gu15Dj8,YYVj8YY_^UVii=i'ti'viV"Y^Ujn)Yt tnjo)Ytjo@Yjt)Ytjt,Yjs)YtjsYj)YtjYj$)Ytj$Yjo)YtjYjq[)YtjqYj G)Ytj Y=u=tt 'tQUiA i}jYiG8]GGUVW8j4hYYy&8j4gYYعډ 8j4gYY- ƿ*)9it=itnWLY5iths1Yijjpt$YYjjp$YYb=byA hbh9hu#=ht=h#}h#hhmY_^U=u=tt  UtU,VW1EEE}{Ut=xAt =xRu*=xuPV[Y^U VWjEYDžtj;7Y9u"j;MYt+GGjuYj; Ytj;9Y5Gj;YYG!h=auhjj!YYajj" YYjh YY5Dj! YY5Fh YYj3YGGFD+GG=au aj# "YhYpaa5Gj#YYXNa=byhGG% UG8UGHG{0t.U9Ku"vY h?fYGjxYthjsYYj YtjTYtjmYj>Ythj9YY{}VYtVYFtar=uGGSjkYGHG=Gu1j&u YU,钎_^U VW} UJTUE}}GU2Eu:WƉƉW EjY_^UVW=5GYtF=Gt==it4hYGG=$iu  i$iG9Gt5G(YuGGG=Gu 5GYt*5GYG8]֋B`n=it33t*j# YtjYGG)25GYt/=$at&X=X ~!hDYX X=itYiib5GjcyYY=i |)~t h+YjjchYY~5G/Ytii=d~ idjwYt=Mu jvYt-i=i<}4<+i ЙPY=iy =Gu6=Gt*=Gt=bujjirYYbuG8]֋BEE}sUt@t AtGu a/tHu a huM9GuaWVLYYVYF6h9hu=ht=h#~ h#_^UhYUj0YĞUV=i=hyhuY iR iQj6RQؿ Ei=i}}ux=it"ibhjc2YYjYt $a{}HVYtuGPVxYYV{Ytaj V YYFGGGidhlYi^UVW=G5GYGG=Diu5GYDi=Di5GyYjjU YZDi}#j2Ytjh(ijSY@ZFؾ-G9(iu i(i(idiFjTY5GjYY1҉׉UU<(ijjYE9dit9(itދGu҃}uj$Y(idiU(i ujhlYY>yVViHYZ׀ t<<J<xPPSX h<>YE= t}uĀ>t%tFO9r%t_^U} t}tP}tEPhhlC} t h|蒤Yjl:YU/j"NY~q t j|1`3V' L B 8].$s=tt jLԦYjY=Ȟu )"?R>!L"#}/#v$l%b+&[&T'M3(F(?.)8*1p***#@5h}DYpjUV}~}7~j'YU4tV覥Y^UV1=teu3= iu*jeUYtG9tMthfY[=ȞuL=tt=|t3P:Y/=tu |t|=t0u5tAYt)5tYt VͤYƋtYth;PYEt|jYt0tjEYt + h8YjGYt0tGjG Yt h8̣Yh8輣Y=t#t\jYP5tYZ=~=5tIYt taj 5tYYj\WYL=Ȟt5tcYt W,)W=tqu6=Mu-bj5GjpYY5GjYYY=t0u4j Yu=Lth¢Ya=te=bj^Yt j耢YujYu jgY\jYuhfKY@jjeYYjjYYj5tiYYj6Y=tA= bu=|t=|[tjPܡY=p tj6jhL jBsYu$N bjjAҡYY5G5tYY=t t4=tZt+=tAt"=t/t =tHu!5tYuta=p t =tAuVY^UVƃ=tu=|as=t#u=au=t@u=at=tAu= bu=t/u=au=tu=au=t^u=tWt =tau'=t1u(^UVjNYt=tuj9Yu t5tOYtijY9tu tjGY9tu tG5tYu V螟Y=Ȟu F$=teuUj TYtIjiY= it vjeYj CYHa5GjeYYHX=p%ua=pu`=pu6=t uj0 YthٞY=t6u3j&Yt'j6Y5Gj'dYYjj'YY=teuMj!YtA=au8hoYjeYje\YYYj jtYYabxFDЙjhYYjhYYWjYYWj>YY{}5D9KtxF9Kt VYt WVYYFƉ=G=G=5pdY/t{[uY}uGGh_^UVWu=|u 1=|t=|At c1jYt-|Ut|UtSjYt c1;j$Ytb'hdPYj=Yt451_^UV=tt =tGu,t|RYtu/h<Yh=tQ| =tV~ jNҔYIjYujGYu j譔Y$jYtjY9tu |jGYtjGkY9tu |G=|u jKY5|YuhO+Y=|Gut|a5tEYtKM=|Gu thjbYu)j)VYujAJY= bj)-YtEa=tSu ajj)YYjj)YYaqjAYtF= b b=tSu bN bmp=tQu_=|ay|aJ|a|aBRj YY|aЙ|aЙaV脒Y^UVW;h5t_YEH,E- Etj׍U)EZ=tjuE*=Gth5tYEuYuU G9 MUU{}7Zu =bt&UD9KuY_^UVt5pOY=tt=|tPYƃ=t|titvrlb=ftjYt=fu?jYt3= it*j6hhу fPtIV%Y^UVW1= ihY#=bb=latjYEla}tOuYUK6jAYt% btHtP5tVYt 5tkY5t8Yt5G5tYYtMVY_^UVp4jcbYtibjb=Yt=bu#=tu= ithtYVfY^U5t4Yt =t#u=bth)Y=t/{=anbaN5Gj/YYYhҁYjcdYt/=bu&ibh螁YUV=tAu= bt 5tGY=t/u=au 5tYt=tCuutaj 5tYY5tYt 5t(Y5tYt6""4h>YYV蝀Y^Ujc)Yt=bu o=t^t_= ithTY膿D=bu h9Y.5Gj_YYbbh YUVpukd=bt T= ithY@bbp4tDVxY^U VWp<=tt=|t WGY=tu |t|=tu =t45G!Yt jc|YtW~Y=b=|b|=Gft=Gc=GuE |b{}&G9Kt 9Mu uVtYYFՋUGW0~Y_^U=t^t5pBY&= ith}YE h}YUVp4=tt=|tP}Y=tu |t=t4u[=tDuKjbZYt:jbYu.bj jbYYYYjj_YY!t6VpY_^UV=ttPpY5|7Y5|нYu(5|rYtp4NpY|<`Yuhg.pYkTJTxhh hTj YY5|Y-5|cYt |t|=|x5G=Yt jEhYt j*oYhzoYhhY5LGt jEtYt.t&1=K9u=$at hoYVoYu=iuhnYihd{ YhnY4h<V YY^U VWuYƅ~J4̆ucYYuJ) sB4̆u<YYuBІ9І~u}<ІyІڹЙІ9E  ІH<ІyІڹЙІ9E  І _^UVWE UЙ4̆uY YYEu}yJBU9}~_^UVuxډ^UV5(Nx ^U=,t,u YUi0mNA90011UU0UVW}?tu 9t>tF>uGމ+U_^UUAs UEUUas U EUVW11}U9u F߃| jugYtUr2YtURtUzt rY}<t}Tt}lt ubY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<t,R@tBt 4YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },*~y UVu CV€tu ,fNV~Tu>5X Yt.h YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E |$_*U :t! EE E $6*U uuu YYEy@Ut8hu YYE~" tuYuuo YYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVYU )uRvO EVt tfVV}u1_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UVW58 YNj5phT5Yhl*Y}t.U:t&uYPuVh jh$VX WYPWVF jh$V6 _^UU UhTuu: UUURu huoUUURuu uOU UUEEUUUUuYEuu EP- UEEUUUUU JUEPuup EUJUx ]E EPjHYYEUuu huSvUVWE_^]L$ 7UVU9wU9v8 16VYt1'rF5&Y5^UVW}u1E}UUs8 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95$^U$UUEPjjg y UԘ1UVW5ԘԘ}׃}~9r }y 9vWYu_^UVWuU VVuQYYDžt~~yVډ8F_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$EPj j= y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U $k}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE$uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U,%EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U\%JxUʋFF VuJYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE &UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PgE6U U RU U RUEEE|%E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP.YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPJYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }E$E)E EEE&-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G \&3E=cF}[t@}nt:JxFFSXVYEE%uՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}謜u8-t8+uEE-EE}dt}iuuEPh EuEPh EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE%u:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE講}謜s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEGٛ띀?uEE3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}謜u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY |&E EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVujuu V!^UVujuu V^UVWuEEEu} tE 0%tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+8"}t}y UU_^Uhd+hlYYjYUh+hlYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7u.`=}aac1ۇtPXPr%sadvent%d.datSaved in %s. errno is: 0x%.4x wrote %d of %u bytes wbRestored from %s. errno is: 0x%.4x read %d bytes, expected %u rb&NYnyPlease answer Y (yes) or N (no). > ok. %s<$$<vDDDcc. !)04What do you want to do with %s? What do you want to do with them? Mumble ? %s I don't understand the word %s? %s what? hikerunwalkwestanvilsworddoorplantoilwaterlightleavepoolseaoceanreservoirwaterstreamOkay, "%s"!!!!! Okay, "%s". I didn't understand the word "%s" andanthea ,.; > I see no %s here. I see no %s here. putdownpickupputtaketurnoffonBUG???BUG???Mumble ? %s I don't understand the word %s? $:1!'!'!;!E!;!R!R!'!'!\!m!w!!!'!'!!'!!'!!!!!!!'!'!!"1!'!'!!"T"d"q"'!'!'!'!'!1!1!1!1!$;!;!"I#S#m#### $F$This intransitive not implemented yet The pirate is at location %4d %4dThe dwarfs are at locations: %dLocation ? Your health rating is %2d out of a possible 100. You have been killed %d times otherwise advent.savadvent.sav%s what? You are wearing: you need %3d more point%s would be a neat trick! CONGRATULATIONS!! To acheive the next higher rating,s..All of Adventuredom gives tribute to you, Adventurer Grandmaster! Your score puts you in Master Adventurer Class A. Your score puts you in Master Adventurer Class B. Your score puts you in Master Adventurer Class C. You have reached "Junior Master" status. You may now consider yourself a "Seasoned Adventurer". You have achieved the rating: "Experienced Adventurer". Your score qualifies you as a Novice Class Adventurer. Better luck next time.You are obviously a rank amateur. out of a possible %4d For a score of: %4d using %4d turns You have found %3d out of %3d Treasures,22(3C25P5j5555555:7X77899:@w@@@@ %d of them get you !!! %d of them throw knives at you!! There are %d threatening little dwarves in the room with you! Q OO/QP/QBPdPPPPP/Q but it will cost you %2d points I am prepared to give you a hint, TRYING TO PRINT HINT # %d WWWW trying to carry a non-existent object** unused **.unknown word class in getwdstrying to put a container into itself (tricky!)received an unexpected word terminator from a1toa5preposition found in unexpected tableaction verb 'leave' has no object.invalid month returned by date functionhint number exceeds goto listlocation has no travel entriesconditional travel entry with no alternativetransitive action verb exceeds goto listintransitive action verb exceeds goto listverb class (n/1000) not between 1 and 3ran off end of vocabulary tablespecial travel (500>l>300) exceeds goto list** unused **.too many entries in adjective/noun table.object number too largeobject has condition bit set twicetoo many entries in prep/obj tableillegal word in prep/obj tableunknown or illegal word in adjective table.** unused **.illegal motion word in travel tableout of order locs or rspeak entries.invalid section number in databaselocation has loc_attrib bit being set twicetoo many hintstoo many rtext or mtext messagesrequired vocabulary word not foundtoo many vocabulary wordstoo many travel optionstoo many words of messagesnull line in messagemessage line > 70 charactersFatal error number %d - Unused error number! Fatal error, probable cause: %s end of inputadvpanic.sav. Save...aborting. PANIC: %s%s i^3\\\]^]/]9]C]^^M]W]a]k]u]]^]]]]]^^i^]]]^i^^^^#^*^i^i^1^8^?^F^M^T^[^]i^i^]%]i^b^This verb is not implemented yet. n /l l;l;l l.m!l#lbGlcleki"ms rrrrqr!r#r.r`qbrcrerirjrkryww!x#wbxc.xb} { |{!{#|W|b|c|What do you want to feed the %s . $noqstL:sAJust exactly how does one wear a %s  \\\!f#\^wc\epWhere do you want to put the %s Where do you want to %s it? ڐq*+7@8pI don't know how to lock or unlock the %s "*n+n7>@ÑI don't know how to lock or unlock the %s I see nothing special about the %s? yanky2xyzzywumpuswornoutworn-outwornwoodenwolfwizwithwinewickerwhiskbroomwhiskwhirlpoolwhirlwherewhackwestwearwavewaterwandwallwallwalkwakenwakewvolumevolcanoviewvendingvelvetvasevalleyutterusedupwardupstreamuponupupunterseunlockunbriefuturntunneltubetrolltridenttreestreetreetreasuretraveltotetosstometotinythunderthrowthentersetelephonetastytametaketabletswordswingswimsweepswsuspendsurfacesuggeststrumstrikestreamstopstonesticksstickstepsstepssteelstealstatuestarstalagmitestairsstairspicesspherespelunkersouthwestsoutheastsouthsnakesmashsmallslugsslitslippersslideslayslabroomslabsingsilversilkensilkshutshoesshit!shitshipshieldshellshelfshazamshattershardsshakeshadowysesamesecretsescoresaysavesapphiresandwichsaint-michelsafesacksrustyrunrugrubyrubrowboatroomrodrocksrocksrockrockroadringrightreturnretreatrestorereservoirreportreplyremovereleaserefillreadrationrareradiumquitquartzqpyramidputpunchpullproceedprayerpraypourpoundpotteryposterpoolpolepocusplughploverplayplatinumplantplacatepitpiss!pisspirlocpiratepillowpickphucephoneboothphonepeyoteperusepersianpearlpausepassagepantryoysteroveroutsideoutdoorsoutorientalopensesameopenonwardontoonoilofficeoffoakenoaknwnullnuggetnowherenothingnorthwestnortheastnorthnestnenmushroomsmushroommumblemossmistmirrormingmetalmessagemapmainmagazinemachinelyrelowlostlooklocklittlelightleftledgeleaveleaveleatherleapleadenleadlanternlamplknollknivesknifeknapsackkillkickkeyskeykegkeepjumpjewelsjewelryjerkjarissueironinwardinventoryintoinsideinsideinsertininigniteiceihurlhousehoundhornhoneycombhoneyholyholehocushivehithillhikehelpheelsheavehealthheadlamphallh20gullyguanogrottogripegreygreengrategrailgrabgotogoldengoldgognomeglowinggiantgiantgeysergetgatefumfumfuck!fuckfromfreshfreefour-leafedfountainforwardforkforestforcdfoodfoofoofollowfoefoeflowersflowerfloorflingfissurefindfillfigurefightfiefiefeedfeefeeextinguishexploreexitexcavateexamineeverythingentranceenteremptyemeraldelfineggseggeateastedwarvesdwarfdustdumpdropletdropdrinkdrawingdragondownwarddownstreamdowndowndoordondomedogdoffdisturbdiscarddigdiamondsdiamonddialdiagnosedevourdetonatedescribedescenddepressiondefiledebrisdarkdcupcakescupcrystalcrowncrosscrawlcrap!crapcrackcontinuecontinuecomplaincombcoinscobblecloverclosecloakclimbclickclamchimneychestchasmchantchalicechaincaverncavecatchcaskcarvingcarrycarpetcapturecapecanyoncanistercalmcallcakescakecageburnbumblebuildingbrushbrushbroombrokenbriefbridgebreakbrassboxbottleboothbookboatblowupblowblastblackbitchbirdbillboardbeesbeehivebeebedquiltbedbearbeansbatteriesbatshitbatsbatbarrenballbackaxeawkwardawakenattackatascendanvilanswerandaltarallalacazacrossabracdabraabove?774-leafed34342222"spelunker"7a$rwz+[bQ : unknown error  @ Xbثdiopux Ԭ#٬+Ϭ-ʬ0ެկLhlۭEqG\XǮbǮcCdeqfqg\in+oǮpǮrsuǮxǮ(null)ͲXbdiopux}LfhXl_EGX[ bcdefgin.opsIuxNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point cannot print floating point /usr/lib/advent//=vq[0bU  m  * w/5qOM[ AO#A+!~& b p ~ !!N!!2"h"## $Z$,%%{&'(D))!*++l++,,3- /011336f9!:r:::;;;<<=BCCxDAEEEFKFFFGQGGGIpJ6KKL@MNaN|NNNNyO2PP*QoR%SSNTTKUU5VpVWDXXYYZZ6[[N\\\\']]]2^^^^_p__z`+aLaaJb{bccd|e@fggij kl mxm|nopqZqqq9r~rrstQuuuEvv wwex`yy`zzz {@{{|(|O||}~~#ހD#>Yn $Xt*ISclLN,hXf 5 Z  - F } * > r  @  X f t N|*C`|Aw (J&i)Fo\#d)jy $A.Jr 1Zz?g'[5hw.Ol O p !`!!!!!">"n""""#/#L#g####$a$$$$$%1%e%%% &?&u&&&&'8'''(i(($**H+`*{8w$= w | Lp&i+JN9kX ;?oZn /G_s/m$ z!!!i""%%x%%%$&H&&&''E''')(_(((((>)!1Q{8fg7j3nLs  N i  t 1 P 3V~^/O4UTsm6:>B/c N_ 3!t!!""h"" #f###/$n$8%%"&e&G''L(()*++,, -Y-}--O3t333454]44415p55,6:66J778G8y8f99=:{:::p;;;;;7<Z<u<<<=== >P>?7??AFA{AAB[BBaCCCCODDEEUEE F.FzFFFF G.GdGGGH~HHIIII%JeJJJJJ KzK LLLLMMMMNNNXNNEOOtP;QQQRkRS%SESmSSgTTTKUlUUUU!VVVW6XXXX Y2YY Z=ZZ\W\\\Z]u] ^%_X____``>aaa bcbb"cEcccKd]ddddeEeieeeee$f>fmfffgg7iqiiiiYjjjjk)kxkkl'lEl_lwlllllmm*m8mRmjmtmmmmnn)n]nnno%oBoToppqQqzqqqr:r3tAtsttt u}}};;;;; !"$%'NOPY Y*E\-Jpr CdoJJ^JLJJ~JrJC 5./<'(+ "21-, $%!bB))22@8Hw;I_nn64Ap)HZek0  `egjumo#awu~`^\adewf 'n zCnyzyIAIIAAIA!    AAAAAAAAAAA AAA))    A IIAA AAAAAAAAA   "   H@ @ @ h `X `@ @ @ @@@:@ @ H h @ @  H H @ @" f"AZ  b @ @B8I{{{PPCKL8I{8-P{8PP{) PPP{{'' '  >?> !"2!,@rrd >|ee|:6+)}e44á]v5vEOPnt F V \ek s !'"'#'<'6++3#<#=#S# ++$+++6?h#!'"'''(';'... / 6?h#+#+++2226?h#++. /666?h#++22:>>tF~FoBBBBJVJeJ'''''''z'66::G֡124Mai:::eogojokosooRo::::MD6--} R!:  aat {gYYP'+eWG֡123MaBmT^JCJfJԌ^JCJeJ^JCJcJ\M<_9J m~ :GN}mm.̌t F V < = ˌ4:.)>-'HiqE=#8<#~}@<%۳ƷSSӯӯ{d VNmK6|cN%PdM4L23eDKHyiSE9t]Nd``x ]&E[uv^;u.;+j j u j ~l.q0,+wl0{ZZ]]Z    }Ʊݭ.U{0{nQKcJ}%),%%#%0, =88<88KH4LdDcDCD=+aaaGNg{gaYEsas/s^xWsk]og{gkgg{gwgT[TTR ^o;o{gc6666kQ~~'{0{//// !(?5 I P g 'ߗˆߗӗ~ ~ /Άvcf#f#^4.uF]K  urS<%feeeeeee}e~e;| GNncwcc oT.#өPHQJe3<#<M<gb}3<#< !^ ^ ^ ^ ^ 1/=G ^%    ;!;!! ^ ^ ^ ^ ^ G LLwl0%L]LC)v_SN N tSYL}L,LL$ ]F=&* qW; kUB('^V-$% lY?*# Z@'( mA# nX)) vpE>*****~~~&&'dJCJ2..CJ&~:V:d>MB{:~:MBU|e e.~:3F4F5F ˈ6FNJQNN3F4FKBQJ6FNJYƥc> %Nuefe]U YYYa vvYYY ~~~Se:u@ % C e f #f 8f k+ + + CPt+PtPtB "yd p V e f f $f kijWV= p }4t4t4t4tB {  y z @-' U.; n OcU #l^B.K=ާ)`ʫۧЫ~ƫFT~$ (3@vLk  {kkh+++)+M }ho  ,k,kv,iF=O# qSE ;T}!$6Cp 8$W}er((<] t ,$ ((0   ,m44V8c80m4X4|4^kC@f$$L(X 8 !DKGOOKKKSSOO !!]cc[t_ WoWW5g Nck6gLgcr([teSeeeKz3z>z3&     vvv~{ c z y      z| [ z % [iCiRi%%vV9AC+++)+M ~,9J UUݩǥ¥ݥ|iL"M {f4fK6 h3di jt7l ((((( AAAAAABBBBBB SSSSB<Tl,Unknown error\+P+4+$+ ++*****|*l*X*L*4*$***)))))))t)d)L)<)$)))((((((p(ؘؘؘؘؘؘؘؘؘؘ\(D(((((''''''p'\'D'4' ' 'C  %t1$T$Lsu;SSSSu QRP PU4VWu M}V:-z:r^믋Phh A j Y덋M$M}uEFUUUIM1h6nYYu6hh  5hhV t%6hh  5{ Yq}~6hYYUu%6hxh F 54 Y*=u%6hdh  5 YU9t6hDh  jYtNE9U};5h<hI  M؉EuYEu6h h \ j;Yk k jP5 5uju u6hh  jYk k +E؉EkjR5 EM5hEP }tڃ=t U€tȃ=tUuUuUUt=UtUuUUԃ|}~ Uu j HYUBk PWBYYDžu6hh  jtYU؉AMk ]SP} t=uh!j uWgEU9U=6h8YYkE PRhEP6 hEP%YYnhEPYYhEPYYIhEPYYhEPYY$hEPYYkE P€thEPYYhEPYYkE P€thEPnYY`hEPYYYNhEPGYYhEP2YY{kE PRhEP  WkE PLhEPYYhEPYYkE P`kE k] 0EPEPshiEtWY}t uY5YjY_^UVWu }=t=WN9~ zWN9}ډY=t#V9W~AV9W} ډ-67YYE~}y ډ1_^UVWu}JxFFSXVx YGJxFFSXVT YEJxFFSXV5 Y EUfJxFFSXV YEJxFFSXVY EJxFFSXVY EJxFFSXVY EUE E _^UV5Nx ^U=tu YUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U} t#UU JUUuRu UVW}U9U ^UU UU +U1EE9usuNN FFSX_^UVWEE11<$tN|1DFρECEE0-EMP1E E $GU :t! EE E DU uuuYYEy@Ut8huUYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU$E_^UUUuuu  UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuu  EUJUx ]E EPjp YYEUuu huoUSE] ![]USE] ![]USE] ![]UVW}u M  U$UUEPjj# U$UUEPjj U$U UEPu< YYEPjj U$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj; ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U \{ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEt uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEМUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }>~y UVu CV€tu ,fNV~u>5pYt.hYFu NLNHF 9hnYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UUas U EUhh YYjYUVuYƋU rU MJwU uR]YY^U$EPuYY1ۅÉUu hT$uE UW}0ʀuA)_]UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ|tPXPgA,~Ns%8lx %s %s %s ???%2d A U - E - E C M - F - S%2d%s:anm: out of memory on %s 4224anm: read error on %s anm: out of memory on %s 44444anm: string area too big in %s anm: %s-- no names anm: %s-- no name list %s: anm: %s-- bad format 22222244anm: cannot open %s ra.outanm: invalid argument -%c 12 4Xa rwb+Cb9 q@Xbdiopux #+-0L}hglrE1GXbcde1f1ginoprusAux(null)cannot print floating point SSSSB t#!/bin/sh # # whatis/apropos 1.3 - search whatis(5) database for commands # Author: Kees J. Bot # BUGS # whatis file must be as if created by makewhatis(8). # all='exit 0' case "$1" in -a) all="found='exit 0'" shift esac case $#:$0 in 1:*whatis) ;; 1:*apropos) all="found='exit 0'" ;; *) echo "Usage: `basename $0` [-a] " >&2 exit 1 esac IFS=":$IFS" MANPATH="${MANPATH-/usr/local/man:/usr/man}" found= for m in $MANPATH do for w in $m/whatis do test -f $w || continue case $0 in *whatis) grep "^($1|[^(]* $1)[ ,][^(]*\\(" $w && eval $all ;; *apropos) grep -i "$1" $w && eval $all esac done done $found echo "`basename $0`: $1: not found" >&2 exit 1   #A@E1$T$L"#su;SSSSu\\ QRP4$ PUPVWEEEpEEE j\0豦YYt*E j/0蒦YYt E h#hhYDžt}uYEh`YE}tU:uEXuߥYUBRhPͥYZEP膒YDžuuh,jjuuh WEPW覤YYt:hu?YYuuhjjW1YEFURYEujhjjMU؉AM؋M.t>'u1Et?~^u9~#u3hCYjVj xV0YT}~s~ojVj E܅ujhjj`  huwYYEujhjj2 =|!u荒Yjhjj   h6U  <$xxA5 P6B}t>~iu8~gu25hV1 >.uـ~.u}W~dM~euG~ u~ujhjj NMNMjEPYYT}t ~t~uV9u EE=T}=|jhjj j\VܚYYE܅uVYP$LEL;u؋EEM܈tU܀:\u U؀:\uEEhL;YP$kT 6ukT 6kT 6NjB=Tx;}t5T55hhL;轘hL;-Y?}t2jFPYYYE=uV5,dYYt V YV-Y_^UVWuVYP†YEu V5hPh#豗1}E>F=0=71҉UU}W=0| =7~,E@uu5h0h#*1iUƒ0UEF럁}~ E벋UGEL>xF1҉UU}Mu-0= r E ae=0|=9-0EN=a| =f~=A|=F APsAaZ)UEFPUGE|>Et>eu GEFe>u EFGEFFGE8=\8UE E_^UVWu j=VXYYDžu#Vu5hh#1s)BR]Y]u Vu5hph#G1>)ERV0x E)EPGP(YY]u1E_^U$VWEEEE1҉66|661҉6666=Xth5XYYuXL==`t>=XtX\P5`5hdh#@1L=hT5X袇YYuchLY6hDY6h<Y6 6 6666/h45X)YY=\t 5\h,荁YƅuV臕YPhvYZEP/Yu'h5hh#ahVhphVhYYEu#V5hh# ƅ URp t#t uuhP菌 j PĔYYtEP5X-YYtuhP; fEuhP  u= uG =M}B=lj PYYt8E/=6t$V5XYYDžV5XYYuDžDžV5qXYY&haYǃG?=u.>t uGL0J9DžJ9DžJ9DžJ9DžJ9Dž{4ѬV55WYYh%YP0x9~ <j'RqYY)+PRWÌ u DžV5|VYYt2hpYxn|Džm>.t>'u4jhFP> u+Dž/DžDžVhP8 t+t)~ V5UYYV5rUYY)~VWe r(V0x09~(4WYYW4YZ׀>tV5TYYlVW諊YY^Džt<>.t>'u2Vt$V u ƅxtjPE YYy VYI=|0jhtPT jPjj B 8A A dBk Dž }9P=뾋k 6Džk 6P YGDž ?t ? t? uG??"u GDž Džu? t? u 1t"Gt:"u뱀TP YA, }ރ=BA8AdBk DžDž }LPYP=t ~!A4P$p55hdPP Y_^UVW} E0F1҈WW(uFtFO_^UVu95*VhPu jPjj@J9~ BBPBP)F ^UVWU Mz t Uz u1UBEE1҉։UJ9}ZUЙjBPEPw EyJƒ}~BU봃}t U B}u =2|EPhjj:=t4}~FJ9| BBPBPOM BM BU B_^UVW}M t u1GEE1Ѐt3U9uU9uF뽸_^UV1k tk U9tFk t }tk EU MH^U VW=laU9h} hM :-uhzu hM h 40YYuhhM lǣXD:tWu谂YYƅ=dtOUE E 0Y] P3j h` ݂YPhx j jEPj hM ll:uhl?!F>:hM lC;t!A hM lCd6hU9hi=dtOUE E 0Y] P3j/ h YPh< j jEPj l?`hA hM d6l7hM ll:ulhd6_^UVW}9=*Wh P jPjjWk 6k 69~P$PYFJ9~#Bk k 6PÜ6SF _^U VW}t hxGYu }> t> uF>t > t> tF9u1n}Z}uZ)BR mYxujh jj\)RW5x4 )xx M^1_^UVWU Mz t Uz u1UBEE1҉։UJ9}UЙk j6PEP EyJ}~BU볃} uEPh jjvk k 66k 6U9}UP$PYE} u =d|EPh jj =t7}~FJ9|#k Bk 6PÜ6SݝOk M6k M6k ǀ6k ǀ6_^UE8t0$mYEUVu*~YPjYƅuuh jj:uV}YY^U VW1҈UUUUJMt UJM1҉։E"9}|PUЙ4pEPc}YYEyJUɃ}~Bu utYYjh jj_^Ujjh j.-Uhjh u -Ujjh u ,Ujuj; EtuXYH HUjjh j,5dUUPRKYYujh jjjuj jPdN :\uBz*uO1҈V>\ :*t :(:(u:DžFFFPPYYƀ>tFjjP&H 8EuYPVuYZ=rPhT jjVhL PsPPhuYYDžtF1҈>uDžƅ V>\ :(t :*:(u:DžFFrFlPPBYYƀ>tFjjPF 83tYPVtYZ=rPh8 jjVh0 PrPPtYYDž0tFƅ 0 &jjjPCDžxk GsY=tPh jjk G 0 麒jjjP"uFj\VpYYtD9vFG:\u\G:buG>tF먊FGu:huzyujPA jPX@_^UVUzt5Uzt,1Ujuj@ EtuJYH Uz#u1hYYjuj txx UVWuu1}1>t>%tG}t PeYF>Ru hp EPxk UUU:tG}t P&YEF>tG}t P YF_^U=du4"J"xU # #Uh"P{fYYU=duh"uzjYYULVW}uhjh$jK<=uW506YYujh W1l ujjhj? t? u&jjhjjjh j?. ?' =Rd=@W=JW55YY4:t : u苕::t&: t!  0 ϋ+jjPR:tCW54YYtjjhj=H~jjhjv Ha=TjjhjK<1҉ƅ:t: t : rtU=@u89jjhT5<=4tjjhjDžDž:YrG=@u1҉@<4@Džjhj4ƅ9J4SjhjDžƅ=<jjj: ƅyhhjjq8k $TjhT5<uk k $T(ThjT1҉@<ƅ4Mz荅PPYYPu  1nu ru   nurujGPj jGPj Dž:: t: u苕:+t:-uƅ Džƅ++t1*t(%t)t-t / )x<ոռ jhhjj   :(|jhLjj| ոռ  ƅ+W:\) :c鋕:7:t 9t݋+JRjg55nYY:PPYYjjPk ƅx4Bj}ggx:.t 0 1 0 r :.:.u  0QjftAVjfkYYdYYk >5(5$zmYYdYY#j505,Pƅy/h0PV jPjjj5854Pkƅx9k lYYqwlYYA_cYY"ooYYkYYjj{c ^jjbc Zu.h :/u,(Pjj^/uPj\d0Rj=d<*u |0jhPS jPjjk -u55x5tljYYդը դը: t : bGP5YYOOPYƅyPhjj\t$55|-cuЋ$ttuuNOP >uWQBWQUPEEt2>u"FP&>Y9EwVUFP>YEV YʋUWTUWX_^UVWE }t8=b |hY1NbUbRPY1EP*Yƅu1t VWYYUuE #UE b:|uCbEPYƅu1VWYYUuE #UE 벃}t U1PYEPWmYYtuVYYV Y}tbb8)thpY16}u.b:t#:)uh`Y1hTY1_^UVWEjYE1b:K:|tF:)tAEPKYDžu1<#UE u#UE  WV~YY릅uj YE_^UVWEPYƅu1b M}*t}+t}?tUE|Uu}?thY1\}+t]}*uUtVj hYY}*uKVjSYYjYPVYYVVYYjYPVYYj YPV|YY}+uUtVj YY}+uHjqYWVAYYVj]YP0YYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWVYYbb:*t :+t:?uhuY1_^UVWEjYjYjYNjEqb:^ujeYb jSYNjb:]t:-ubbPoYb::]:-gb:]t:u j-3Y‹bJA΋b MA9}h|oY19u| VYFbxbbPY^jYb:]thlY1`bEMEPjYYDžu15#UE !h\Y1hHY1b:uh<Y1jYǡbbP YjYE bh05bT'YYƅh6Y1b M~}*t }+t}?uNEuEjGYDž~bbPoYNjdYbbV_^U VWUU=bbu bMFFF5b_^UUU=bbtbbMbUVWUU=bbu b>=bbbU9} sOPMUY u MFFF_^U VW}bt:uV+YDžt>u +U UU )UUVUV_^UVutbt>uu FPYY^UVW}t} uh3YYu1bb:tPFP3YYt1bnU=buYtU b<u<K1DU=bu~YtU b<u< 1U:t VU=bFP4Yt =bVtYƅt>t1EU:uJM> u1E=bFPYEU9U|;}tbM9uuYtLMUb181ht^Y1"XQuih`:Y1_^U VW15bUUnV1YljjU9YGF>tPPu1YYt>GF>t5Pu0YYu#GFhY1UP5b_^UVWubu1*VNu1>u _^UVWu} 1҈WW>t> uFu1VWu_^UVu95*Vh P. jPjj褟`DP YJ9~ B\DP\DPOF ^U=Rt@ƀTUVWU Mz t Uz u1UBEE1҉։UJ9}eUЙk j|GPEP/ EyJ}~BU볃}uk GPY}u =|jh8jje=t7}~FJ9|#k Bk |GP|GS9NOk M툈|Gk M}Gu蒰Yk Gk ؋U G_^UV195~k  T9tF95F}u = |hhpjj脝k  T/}uGhhTjjMk (TP贯YuɯYk (Tk ؋U $T^U VWU Mz t Uz u1UBEE1҉։UJ 9}nUЙj\DPEPz- EyJƒ}~BU봉5 }u 4`D`DPҮY}u h=d|EPhjj)=t4}~FJ9| B\DP\DPLO5 M \DM ]D} uhOY`DPUU :"u1EE P$Y`DE}t$uu>,YZЉE9Es x"uUBuX_^UV6@|jhjj)A=6t11956~'6 @CP@ZTFR^UVWu} ==L=@|jhjj虚0 @CP@ZT@A @ƀT0 @CP@ZT@A @ƀT0 @CP@ZTN9l=Rts6@=6t119=6~'6 @CP@ZTGъ  @B0 @CP@ZTM$=L=uq@N@A @ƀT_@A @ƀT0 @CP@ZT=Itg=Rt56@=6t119=6~'6 @CP@ZTGI@Bq0 @CP@ZTY=Rt@B)0 @CP@ZTGM F1_^U VWuEPEPuu uE}t-FUt+F Ut F}0F}~U:t E F0FO}Ut.FE} Ox0FOxU:t E F0F_^UVWuUBEPEPRu uǃ}t-FUt+F Ut FGF}Ut.FMx?tGF0FeFu u555tM}y -F]+F}d|dE0FEU E0FE0F_^UVWUUEPEPuu uEu}t-FUt+F Ut FUuUJׅ~U:0uMO}| UB9UMEEF}Ut.FM}~ EEFeF}y -F]+FV}d}}Z}d}}Dž~" E0NEEOڋEv}U:0t0F.F}y E0F9}|EEF9}u.FG9}|BWZ9U|0F.F~.u UuNE_^U VW}U €tEEJRMUvEEJRMUXu uWuu+Mu uWuu4u WuuuWWA$YZEC}Et}Gu>t>etF>euE_^U EPu u EPYUVuj jVg ^UV5PNx d^U=TtTu"YUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWVU@W Wuu V:@u EP$@WV@}F_)ۉ]y!]FEfFuFPYY"}~GEfGuGPYY9nV9Ww 9Wu{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]S PW kE W!PEP .kE ]SXPW kE WPEP _^U(VW}EEE} tUE UMtEffG1҉WWU fE 4<EEƉ0 r.UAM.tEUWOUMjGPbYYjEPUYYEPGPYYE0UEPGPYYE}VMN},} t UE Et eEEE EEUL ;UƉ0 SkE 0‰UUUU؁/ }}EEUƉ0 r} tUE UUU}t iE/Eut ""ut5fG?GujGPYYGHfGuW YY_^U Vu :] :E@fE^fFVEPVR ^UDVW}E#E} yE } ~E E #E#EtEfEcVWYYx - E=|׃- Ek] W!SW' kE]dsVW?YYx -X E]hXWYY!VWYYy -! Ek] WèSW Ek]+ۋEW4YE VWYYy - Ek] WXSW5 E+UEEE}uEUU$vE$fEfEEEU9UU+U~EG}EfEfEEEkE XPEPK7EPWYYx1EPEP)7kE ]SXPEP E뿺0UMEfEWEPWl M+fEEPEPhX? fEGZEfWfUfEG-؉WUЃ0MEG-؉UUWEPW U0EWEPYYEPWYY~+tG=|U@GFEPYWY0U0E"}#fUUU=9?0}#vMu@ՋU1E}uā}#vU0E밋U#_^UVuEPu u8 EU RP5h5d$1ۅftu u-EE UJfF5p5lu u*YYZYUM QRjjB# Fu uvj(.YYEE 5x5tu u*YYZYUM QRjj" F^U VuEf~u~u55|#uh#55 Vh#qYYyEU""FF-?Pvj4'55)YYvj' YY EU}tuuQ,EEuu55#u~u~t ""uuXZ^UVW\Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV$U9$wU$9$v" 16VYt1'$rF5$&Y5$^UVW}u1E}UUs" 1=$u8jY=u1V!փ5$5$FE5$OVU}9}r69v2W9UvUW~>}t E$u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=$<9}r79}u+UOJ}t E$URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15$t 9ur6E0tU U$tU9ru NJEtU9Wu RWE_^UVW}?tu 9t>tF>uGމ+U_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0MtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+""}t}y UU_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PoY9uuąt9}t t1_^Uu uP"EXZU塜UVWuu uYYt"!u uu u55'u55u u55yu u%EE u u55~$""Wju u"YY!EPu u EU u~%""RPWj!YY~$55u u!YYEE ׉Rju uh!YYEE j}55f}$u u55YYEE ׉ډѺu uRj YYEE Wju u YYXZ_^U$UUEPjjg y Ux#1UVW5x#x#}׃}~9r }y 9vWYu_^UVWuU VVuQ YYDžt~~yVډ"F_^U EPu u uuuuEPUjuuuu uUjuuuu uUVW11}U9(#u (#F߃| jugYtUr YtURtUzt rY}"t}"t}#t uY_^UVWuEu41}%<(#t4(#YtEG֋E ~tV€uFu1V€cE~tVuډUjuv] =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<(#t(#Bt 4(#aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<(#t,(#R@t(#Bt 4(#YGƒ~uF $FF VVv vv} >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }T~y UVu CV€tu ,fNV~"u>5"Yt.hXYFu NLNHF 9h*YFuN!NF V@uVVVhUFt$jjvN =uN ?jEPv@ =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv? =u N 3uvvl uNN N_^UVWEE11<(#tN|1DFρECEE0-EMP1E E "U :t! EE E ~"U uuugYYEy@Ut8huYYE~" tuYuu#YYE}y1]jMYEu uVY1A!uEUMJUzUBU(#E_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu7USE] ![]USE] ![]USE] ![]UVW}u M UW}0))ϊE tu1_]XG_] UVW E_^] L$ o UVWM E_^]UW}0OE uG_]1_]UUas U EUVu u9 Y^!ut1^U$UUEPjj U$UUEPjj U$U UEPu YYEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u^YEU UV֋RUUUEPu( YYU UEPjj ^U$UUUUU UEPjj U$uYEUUU UEPjj Uu hT$u U$UUUUU UEPjjg UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE,6uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UtEEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UeJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuETUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P%E6U U RU U RUEEEUE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPvYY=t6JxEEFFEEVP@YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu5YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j U}u}uUM UMQ}u} tEjEPEP jEPEP EPEPYYjEPEP U jEPEPs jE PEP UVu EPEPE Ey1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVu EPEP Ey1} u@D1QUJfUE]9~jYE]fUE-؉U1} u@t^UVW}EP Y}u fEu U UfEu W YEy1fEyډE}teEPW YjWEP _^UVW} uyEyE9Et.ut}~ YO9t9}E-UUUU9Uu1!U9Us EEUU_^UVWuE}} #V Vu Wb YFfF^~.j=YfFFFUAMt7xF*FP YFyFPFPYYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^UVEPY}u fEu U UfEu EPTY(}tuEP,YjEPEP ^UjEPEP; jEPEP) EPEP YYjEPEPH U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVPY_^U VujEPE Pk Uu}u}u E@fEjFPEPp ^UE UjEPEP jEPEP EPEPYYjEPEP UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jjYfF?1҉VVF=}jGYfF_^UV}u} tu^UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPdYY_^U}u} tEjEPEP jEPEP EPEP5YYjEPEP UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPeYNF@fFV9Ww9WLV9WvDW9Vv WWW+VWW+VWWVYt1f#V9Wv VVV+WVV+WVVY_^UEUBUVuFFfFf^U VWu} W WV VuWVWVVYY9}V9Ww 9WuKV9WvCVEPjWV^U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP0YYtFPYNF@fFVY_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWufEU M I JujFY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEP%YU R9VEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JN Wt1fEUtFPYWE`}E=~WE- fEG?t E?t E- ؉ UEEPFPVmYF=}jnYfF1҉VV!F=?|jKYfF?1҉VV_^UVWUBU Z)ۉ߅t'yߋuu FfFWFPYY_^É{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7#u`=}aa{nZsPsPR[) [)։ZsXsXfR[[׉c1ۇ|#tPXPL?cqdefhmBCIR.^e.^# 1 %s can't open rstdin.^# 1 .^b.^x can't allocate translate table space = % -CH can't find Scale['v'] can't find Scale['u'] can't find Scale['n'] regcomp failure can't find file ... source file names -m m is the macro file name -h display help (this output) -f is the output device font name -e issue eject after last page (built-ins = ANSI, NONE and NORMAL) (default = NORMAL, using \b for bold and italic) -d is the output device name -c is the device configuration file path %s %s usage: [-c] [-d] [-e] [-f] [-h] [-m] file... esan%s/m%s.mac no string space for .macmultiple macro file declarationc:d:ef:hm:%s/common no string space for common file namecommon no space for file list no dumb.dev file in dumb%s/%s.dev no string space for device file: .devdumbTERMCAWFLIB/usr/lib/cawf.^# %d %s out of macro text space illegal macro definition nesting too deep can't openr no file specifiedno char after \non-hex charoctal char > 0377%s: %s : %s non-octal char%s: out of string space at %s %s: no space for %s font name %s %s: bad %s font line format: %s gbefirI%s: font %s for device %s not found in %s %s: can't find device %s in %s %s: unknown device %s line: %s %s: dup roman for %s in %s: %s %s: dup italic for %s in %s: %s %s: dup bold for %s in %s: %s %s: can't open config file: %s rdevice.cf%s/%sdevice.cf%s: no space for %s name device.cf/usr/lib/cawfCAWFLIBnonex[0mx[4mx[1mansiNORMAL%s: font %s for device %s illegal normal%s:%s%s %s: (%s, %d):%s%s - %s - %s: pass3, len=%d, word="%s", sarg="%s", narg=%d%s%s %s: (%s, %d) %s !<=>@GbL.^# %d %s macro nesting > %d.tm unknown .if/.ie form: %sel .if n .if '\$n'.if \n(.$=n .^= %d %s bad Delnum(%d) index out of number registers at : option requires an argument -- : option requires an argument -- : illegal option -- : illegal option -- -- bad Delmacro(%d) index Field out of string space macro table full at duplicate macro Newstr out of malloc space at vstrtmrsrrrnrmpsnsnfnalilgiti0ftflfidsdicebrbpad^x^r^f^e^d^c^b^=^#\" unknown requestbothneedflushflush%s no nameflushflush bad font code%s,%s first .it arg must be 1leftflushnospace no macro/string no name no new name no name no register no nameyesspaceK0 3%3K034K033 unknown named character: unknown named character: bad named character: %s%s string too long: %s%s string too long: unknown translation unknown initializationfph bad character definition unknown fontn@n@ missing Scale['v'] bad Scale['v'] (%f) missing Scale['n'] bad Scale['n'] (%f) missing Scal['m'] bad cpi resolutions%dC ">%[C*BcBf>h?k@nQAsMB.E = =->\>QO"LnMwL$@2Q% pP2Q2Q2Q2Q@PO2QP2QpPGz?WUeSrpTGz?space bad number registerneed can't find parameter register at expression limit of %d by 0moddiv "%s" isn't an expression expression stack overflow expression stack underflow unrecognized line failed .it: Nh%d. over NH limit (%d)toindentLF%s; %s%s%snbbytoindentflushcentergapuserhyphenemhyphen no hyphen for font %s%s%d%s line too long%d unknown number register \h < 0 no \n after \h font undefined unknown font userhyphen no hyphen for font tabtogapnohyphenflushcentergapflushspace\"needebaKgeKgb)b{bbeebebeceefcPdFeeeeeunknown requestRFCFLFRHCHLHage nohyphenneedcenterneedtoindentneedoutput line too bigregexp(3): %sout of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be emptyn n$ m(Sn)n*n+n.m?n[/m\n^l|ninternal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parametert'trrr6sfsturudtdttttttttttssssssssstssssssssscorrupted pointersmemory corruptionu;uduuuuOuinternal foulup,fR^[.']i[ef]^(LH|CH|RH|LF|CF|RF)[]\)'\"\*]^(ll|ls|in|ti|po|pl)^(ta|ll|ls|in|ti|po|ne|sp|pl|nr),tP,fP[.!?:][]\)'\"\*]*$\\| |-| ^[ ]*$\\\$[0-9]^[.']i[ef] !?[nt] ^[.']i[ef] !?'\\\$[0-9]'[^']*' ^[.']i[ef] !?\\n\(\.\$(>|>=|=|<|<=)[0-9] ^[.']i[ef] !^[.'](i[ef]|el)pagelenpageoffsettempindentvspacelinelenindent bad Delstr(%d) index at character table limit duplicate hyphen for font at hyphen limit for font out of space for string word too long=~Bg{g{=~=~=~=~=~} word too longтEGefkgB+1B,P+;P4AAAAAǣarw +bU @.RX;b d2i2o)p;u2x;+ #!+-0&Lhl#EGXbcdMefgiMnsoprsɭux(null)8$4.0 - 8 8 4 V5 - -| 6x 6t -p )l )h )d )` 4*\ S*X |+T +P +L -H ;,D -@ -< -8 0-4 S-0 -, k-( -$ f/ / / 0 -|h\TH40,BIRCRNinlllstipoplBin@c|>W@PD@p @u?m?n?v? ((((( AAAAAABBBBBB  @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%SSSSB""#@e  P( d1$T$L&(su;SSSSu QRP+SPU0VWEh0+kY(+օu&jh$,YYƅu hzYE>/tjh YYEuE0+VEPaYYDžt@EPWQYYxU؁@uuVWYYPW xj VhYX_^U=+tE 8+uQYy&8+J8+u54+ZtHKuY8+J8+u54+Zt} t=+t5xh,aYY1UV5+u14+U>/t>tF>u + F5+E^UVWu'Y@PaXY+u5+YY5x|,+U:/tK=+;=+?t&,+J,+xGFZƊGFՀ/u,+NDžh4WZYYu95xs,+N>/t?th0W.YYt,+J,+x/F Z/F?t,+J,+xGFYƊGF95xu ,+J,+x/F Y/F=,+u Y=+t 5+Y5xVY+_^UJ5+<Yp"Hp"zy5p"|Yp" p" 1UVW=+y8+PYy htYjjCYYjjE uWAYt#j0YjYYYjhdhh hLjYYDžU)RVG Džu=&u ~ӉYDžEFYtjYx9t~ t h8YFPUY+8+J8+u54+Zt/_^U=<+uU@+j5<++YYU58+Zt4+14+=H+t=+t jY hYUu uh U4+8+U U}n=D+t5D+hhH"襌 uuhH"= t"Ht"zy5t"ÊYt" t" 莋jYU VW}U z}5x|,+U U?t&,+J,+xGFUƊGFՋEEׅt",+J,+x FU F뤋,+J,+xF UF|+,+RSYW YL+_^UEPSYju`9YYjkeYE=h+tjuYYEPSY9EPSYUVWu} jvYY=X+WvYYjvYY=X+z=L+mWvYY]jv|YY=X+D=L+7WvWYY'vDYjvhYYWv2YYWV}YYWVoYYEjvYY=X+=L+uWvYYL+U~ tWv YYL+UUL+zVYnVnYbWVZYYWvvYYL+>VY5jWV" '6hqYYh4"衈Y =d+tu=+u=L+tu 5L+nY_^UV`+1UjrYY=X+tP=X+u\+J\+ X+ƒ=X+`\+J\+OX+CE8 u =L+t 0=L+t'UjrLYY5L+=X+Zm `+5L+^UVWEPPYUUUzt!jEPW =X+ۋEL+`+u~Ujvr UjrYY=X+tL=X+u\+J\+ X+&=X+u$\+J\+X+6z `+EPOY_^UVWEPOYUUUjEPr  UrtD=X+u;~t/UrW*0YYt=X+uu v YY ͋v븍EPUOY_^UVWu1>u@vYjV;YYEWVu< u'te jv{YY U RvAYYu38+u>YL+8+J8+u54+Zt_^U Vut4>t >t>u UUjEPv  URVv^UVWEUrtE68+uu:YYEUrv YE>t EPYyWYhiYUrvu; z8+J8+u54+Zt~jYjW~YYWY}x,uY}tjYjub~YYukYjvYYxWTY}uHY68+J8+u54+Zt4Uzu38+u<YL+8+J8+u54+Zt_^UVWu }EPLYFFF ?uVjW EPYy hYjW8YYEjWu%: uP8+54+ZtQu6Y}tj(Yju }YYuYjWWYYuYUUV EPKY_^UVWEPKYUUUUEURU}hURUȃ}t6i!t*EȋUi!u:=ujEPu jEPu EURU뎋EEUr oYEUŨ}t E؋E̋UUBRIYE܋UŨ}tŰErEE̋UEDžt=+t=T+u}~ U܋RtUU܉U܀=#+/L"JL"yhH"YH"H"+H"H"+UŨ}tNL"JL"yhH"YH"H" H"H" Ur[YE̋U묋UŨ}tNL"JL"yhH"vYH"H" H"H" UrYE̋U묋L"JL"yhH"(YH"H" H"H" hH"Y}uEEEj]S0 }u$L+hH"YEPHY}f}\EMtSE0YEy;]3hthH" L+hH"TYEPHY}tUzu0}uU t"U }u}t }ju4YYEURUċU t EEPYy h`Yuuu5 U tF8+54+ZtuY}tjYjuxYYuYM }hLxYuxYUjr sYYhp+EP8t+UJp+U܃x+|+8+ +| +8+J8+u54+Zt5jEP t\=@+u EPTYhp+TYEPhp+y| +u<+j5<+YY<+UU<+UŨ}tUrYE̋UT+juYY T+8+| +hp+SYEPhp+u<+v8+J8+u54+Zt=X+uX+\+U 5L+yzY}h8vYuvY}u1Eă} u$`"d"\"h"@MUur qYYD+UUP+Džx5jEP t*@+xxZuL+O<+UU<+E܋D+U܃(+l+UuuYYL+*{p"4"t"H"{xZtuD+U t 5L+yYu<+xZtJxZu}t}t }t}u xY8+54+Zt}ts} 9U d"J\"+d"MQd" h$tYutY=tUjr oYY}t1+RY@PMBYEȋ+RuYY +UȋUŨ}tUjr襁YYE̋U蹃Euuuu[}u58+u2YL+8+J8+u254+Zt' }uUEuYUMJ ttjth 3 EPtBY_^UE8u*URrmYtURjEPr U5P+誁YL+UV}~U r HY95`+}5`+~!E :cuX+5\+1^UV5L+}~U rGYƃ=T+tX+\+^UE h0YYu1U}~0+juY+jRU PR 1UVWuj/6FYYtu V6| =&Y6EPwYYEt@My0=+u'u Vu; =&t=&t=&u=@YW^YP6YY_^Uuu u UVWE8u1EUր>t >:t>%tFu Y+UƒUU9|}|@=x9ut!+URWuE +U/Gu WfYY+>%uF5+>t>:tF>:u VE Eu>Y_^UVW}*+,s7t VY61Eh PYEt}ru jCYރ}vuEӋ(+UvjuYYƅt!VtF=u=(xjEPu: }t }tjuYYVYJu(+w1_^U VWuVu6~+UF PEPYYEP=YOyusY8F=uF PhuYYF=uF PhuYY~ t:p"Hp"zy5p"sYp"* p"*p"Hp"zy5p"msYp" p" _^U?@ABCDEFGHIJ =&&UE UЁ=+tTuY@PQ:Yu8YjWfYYƅt F=tuWh u:YZ]9uU@u-[7]9uUu@U38+jWYYfFUV8+J8+uJ54+Zt?8t}tuRYPWh5t"qE "F F] U FPR_^UVh>t)U9uu6YYuF Ҹ^UVW+,s/7t$VtF=u =(xF 6؃_^UVW=+uE'EE9tUU?u>:t ?:u>uE>t1>%u }yFPh+?YYtUU>:uEFG롃=(y}x U(=(x }yEuYU(_^UVW8++,L}E0t;VuU9V}F=uU9(|EV7Yu뼃먋8+J8+u54+Zt_^UVW8++,s8}E0t'^uEvBYVYՉuЃ8+J8+u54+Zt _^UVWuE>t FEeE+UE8tuG PYYt}?} g_8+uY P5Y]fGG uG PYY8+J8+u54+Zt5U,_^UV8+,2 V蕳Y8+J8+u54+Zt^UV8+juYYF=u v(AYE fFU RFP[8+J8+u54+Zt{^U8+Eu <YEEPufYY8+J8+u54+Zt,UVjuYYƅtF=uvm@Y^UU jju# ,+xR5xu $r U VW+UR ,x,|,+,,,Uur2YY} ",+J,+x,,6,,|+,+R3Y4,0,}t1h0,Wo YY4,4,0,50, Yj3YƉ~4,254,=,tG8+,U5,YU,8+J8+u54+Ztg밋4,=0,tU R 0, U 4,J_^UVu} t6,+J,+x,,MM5,,MFE,+J,+x,,M5,,Mvu VYYdE%,u Pr_ ,,6,+J,+x,,M4,,MFE^UVW5,+xD} ta]@8+h,TP,,P,L<|+,+RW1YǍEPuYYVWU4YYTPh,P,,L,<}ƅKMyH}hlPup Ey =&tك}lUJUGKKt}t2K@8 u ,+J,+xF 2F,+J,+xKFL2ƊKF7K u,+N}x u,Y}t u軭Y}tu YL+} u+xjRD 5,8+J8+u54+Zt_^U(VWuFE%EuEi!uEj=V6YYF}tUPYE1.u"pYDžt U t?u 1EE,+xU}}}t @#UMu RP U@ta]E܀?} t=E܀8 u2,+J,+x,,0,,,+J,+xG,,0,G,,r}u 1}EU@tU:@u6=p+t-}u}u!@#U ,+ xRQu }} }t}uu VYYUjVYY=,+u/, ,U؉UxU܃}uEjuul U+,,,U+,+,+ډ,+e=tuh@hH"ae jnYU t0++UJPuRh$D}iEFE=uF}t}u}t݃=,tԋ,,ă}uF%=tE멃}uMu_^UV}!u=Z1X}@t}*ux+:u<1=E-1E]w#5x+u1EHE]y^U8VW=@,=L+=p+ ǍuE 0NDžu>,+J,+xF,,-,F,,EEԀ,K+tF,+J,+x,,Q,ZU-,],Q,ZE뜃}tEE } t }ta]Eȋx+ŰẼEօ>EȀ8 u2,+J,+x,,,,,,+J,+xF,,,,F,,xẼ8Y,+J,+x,,Mӈ53,,,Mӈ5<,} t }ta]EȀ>EȀ8 u2,+J,+x,,+,,,+J,+xF,,+,F,,xE-1E]w ]x+46ED_^UV=,,u,j,(YƋ,,25,,,,,,MJ,,M J,,MJ ^UVWUU=,,E,UMr΃z t0+ L,BEUMJ9u=uFFPu.YYt΋U9UwU: t$Uj'YNjUWU R:U zU: u1UMJ9v$u=uFFPu2.YYuҋuuYEU%U:uU: FU9Uv>j:'YNjUWU R:U zj'YNjUWU R:U z_^UVWu&=+~?~u WYljFGEЄ}*t}?t }[t}!u׋4,U8+=8,uh&Y8,v58,YY58,Y8,8+J8+u54+ZtbU94,u&=$+P4,2vY54,74,E0YE]E8tUU4,6_^UVWuV>~uZЉE}ԋU:t :/tU9rEEG}s>~unh7fYDžuWWYPuYP@P$%YWV踶YYPuR襶YY+ujhT YYTPEP葶YZhTP*YYT]9u֍TPEP+YYt?:uDžPG?t?:uPP?dG>t > t>:tF)PuYP@P#$YWV践YYPuR褵YY+u2 _^UHVWEU Uu >*t>?u Ee>[u1G?!uG=uG?/C?t>G?]uE/>!u~!u9u t~/u E>t"=uF>/u }u VUFn}^8,9UtEu =uFU E>tF}tEP58,蟳YY58,YuU 9Ut u 9uv=uFFUE8,9Uu-8,9Uu8,:/u 58,UBVYEȅ8,9UtUB/U:u EEUEEU:.t=u z.uE54+Zu蔲YEąvx.u}tыUăRuuYYt}tUăRuNYY58,MY뗋uUăUEEFuF/uVYYgu花Y}uUB/_^UVWuY@PA!YuWӲYYj,!YƉ~4,254,_^UVW1utG6WuYY_^UVW} EU UuUMxu6EuuYYEU +URVYYƍ}UrvYYy77uUU}Uuʉ7E_^UVu>!u~!uju FPYYZ)‰ u VYY^UVWu} dGF9T1nGB1\ME=t,}?t&}*t }[t]9t?u1#GWVYYt  Gu1u>!uEU:=uEEU:]uE>!uEFEGE&FeE=uFE>-u3~]t-F=uFE]9|]9|EFE]9uEFE=]uU9Uu11G]9t1!FEǻ?t1_^UVWu=t Fu>t=uFFG_^UEP%YUR ,x,|,+,,UjrYY,+J,+x,,Y ,,|+,+RYEu uQYYEEPYEUVWuU UM}~AP,JP,xT,T,Pǁu 9uu1F uE_^UP,JP,xT,T,UVW=p0t>p0T,p0t0P,JP,xT,T,=P,t xzu h4"\TYhH"QTY=|zxRT,֋|U|uYEuP,VuVYYuЙYVϭYljBj VWZYZxRT,֋xhVrn Džj=&txzQ=&6uHjjj̫ Ex3Et*eujj覫 xhQY\P,lJP,FtOT,T,GVUO~>t U EFxM9J+JI P,T,T,_^UP, T,UT,p0P,t0UT,U P,UVW8+juYYƅyuhYY }$j V_LYYVhYy hYu V%YY8+J8+u54+Zt?_^Uju;YY Pju) } theYxBxz~ rөYxMJxzuh$YxBP,tU8+} tOUT,uYP,xBt8+J8+u54+ZtBUVx P,Jx T,J x t jjYƋxVF5x^UV5x8+~x v輨Y~t vKYVxV;YxRP,xR T,xt8+J8+u54+Ztd^U=xX,t`Uxz~rYxBUjY1UXVWjjZ YYE5x0|09U~V u VY}t ~F E~9~uPuhLj@EP PPhDj@EPOEPMYEPYEE_Wu _Sh<j@EPOuGE%=.#U<t#U4EPLYY#URh0j@EPEOU€th EP趧YYEPLYEP!YEp"Hp"zy5p" MYp" p" E}|w~LYp"Hp"zy5p"LYp" p" M}~TF~uVYE_^UVW}8+G EwMx~0+t v/Y9t wYG8+J8+u54+Ztm_^UVW}~U rFY1tQ~sF HF@Eu ЉU#U€U=+uV%YE<=x0k|0x09w1!ttjjYYo_^UVWU rY1G 9WPhXLYYp"Hp"zy25p"JYG F9~  p" G F9~  p" q1_^UVW}uh|SYU:%B-0= wKURYE9|0Hkx0xUJkx0P15x0|0UMx@~t5F ~-VMrQYYttuhl虾YY뻅ZWbu1YtGuYE5x0|0UMx'~tF ~F HV9EuVuh\!YX_^UVW=|05x0O8+=|0ujPYx0q|0kPYk|0PV5x0 19=|0~'kx0kx09Xu kkCG5x0袏Y5x0k|0x0ֿOx#|0Aj5x0 |0kZYJڋ8+J8+u 54+Zt赼~t8+FFFfF } ~U RYFv8+J8+u54+ZtS_^UVW}8+LE=u*8+J8+u54+ZtheY}H+UH+|0U5x0Mx~tVYr8+J8+u54+Zt蜻C}uJj>EYj6EYtW u.yBu%jRYjh譠YYt h詻Y}t!=+tjCYjCYjCYE=H+t,}t&= +ttW uUU WE}u UfTW @wfG Z4‹UffFF0+=+t=H+t} t u 8YF8+J8+u54+ZtXE_^UVWu8+~uVjYY=uF HF@u ʉM!€UVY4+!ujPYY8+J8+u54+Zt訹E_^U$VWEPu(YYE=u =&t߃}E8+E5x0k|0x09~EE~F F9G=t89Eu EfGuG=u EG<uE맃}t$}tE^9]tFE8+J8+u54+Zt}=H+t=+t} U 9U#UUUU}} U 9Utuh5t"VE }U<t4CYt" t" hH"DY }tUBE_^U}u1Pu j Uj2 YE00.uY0EUVWuvYhYvYvYhYvYvYhYvYnVU}^UrgYE8t hDYEUh/Yv6YhYvYhYvYhYvYhYhY hYvYhYvYhYhYv wYhlYbh\YVrPYhxEY;v7Yhp,Y"~tW)Yt hlYߋ~ hhYWYvYEdE>E`E.E\EEXEETEU9Vt0VUEEPdYu[Y>t>u0V UEEP8Y1v =Y&hL YhHY _^UVWE=0}50GEЄE=u GFE=u%$F0J0~{FGEh}=u#}t#UJЊFE?E=u}F.E1=uCE1=uA t0MF0J0,.F.F.F50_^UtF~/t/FEPuߗYYyE}y}oU90_9UV=+t+P_=Yt"Ht"zy5t"=Yt" t" U܉0G =0EPY_^U4VWEEE5jEPb =@+u'葖@,H+0E"uZt=+t =H+uj;Y3N=@+uEt"Ht"zy5t"<Yt" t" hH"q=YEPY8+54+Zt詰uZuZ1uZU<+蜕@,H+,MEPYu uYY=+t+=#+t#+E 8:-{Eh<YEh4YEԅtCukY PBYEЅt'uu,YYh(u轕YYuXYAhKY4="+u =0t"hYE؅tEuBY}t uہYEE 8t:-tSh ~YEԅtAu谕YPYE̅t%uuqYYhuYYuY}t ucY=+t+=#+t#+L+E=0t 50uY="+u =0ujY5L+&9Y_^UVWEPYE=d+tm81=+t"}tGjYjYh4":YW~YƁh+u*=+}2hL39YEqi=!+u`tR8+=0t 50Y00V Y08+J8+u54+ZtqjV裯YYEPFY EP7Y_^UV8+ju苒YYƅx jVYY8+J8+u54+Ztx jY^U8+ju0YYExjuYYuhlYY8+J8+u54+Zt薬j(YUL+}|(U jrYYU RD+jY_L+U}~U rYL+5L+6YU}~U 50rYY1[8+50X Y0008+J8+u54+Zt趫j50YYL+UVu|Yƅu h|Y^UVuu V|YYƅu h軫Y^UVuّY@PYuV襑YY^U VWUU9|h}}8+GPMYEtEUx=|Ut8+J8+u54+Zt裪5xUxx|+U|_^U}uj hj yx+U|UxUtEU xJU |JUV8+Et9t5ttVx|Y܋URxUR|8+J8+u54+Zt賩^UVW|d׋xU|Ut9xl=t0t`8+5ttGPVYYƋt5tVx=|8+J8+u<54+Zt1*WYEuuu Ux=|_^UVuV։xx|)|^UV5|=x-|%V5x5: J,+x|)J,+x^UV|+,+|),+x^Ux+U|UxU +U+|ډ,+U(VWEEhmYE؅t}pu 2UEԃ}tjٌYtu2Y 4=(+?u hͧYjh`=YYEuE0+EEE5x|,+jEPj舌 =t Ey}t׃}t3E} tċ,+J,+xMF&ƊMF랃}t }\uE덀} }tU: uEPuYY^E}U}\uOjEPjϋ =t E,+J,+x MF ƊMF^EPuYYtK=,+u Kj5x7w9 E5x|,+,+J,+x MFvƊMFd=,+u j5x79 ?tjh0+78 E_^U VWU RׅuE8+j贊YV諊Y8+J8+u54+ZtVhR2YY=1-0E=rU rh$YYuG?uV@Y1_^UVWu }M}~GFЄu_^UVu] 9t Fu1^UVW} uMxFG_^UVWu} >tFG9t1_^UuYuuh>YYurYUVu-0= v1 F>u^U}u1I22u/Y22RY222uYUVuIU2(vYvYv YvYvYvYvYv YvxYvoYv YY@2vQYvHYv:Yv1Yv #YvYvYcv ^YvY@2vY?v YvY+vY v YvY ^UVut22vY6^UVW}u152U22wYFwYF~w YF wYFWV[w]YFWVDwnYFwbYF'w QYF wEYFw9YFw BYF wYFwYFwYFwYFw YF wYFwYFw YF wYFwYFfw YF WVw~YFFW V WVwdYF,w VYF WVwDYF P_^UVW}ut#22wYB?6E_^U VW}522UGFЄu52E_^U}t urYUVU (+}~(++&+sFjY(+:u=0u"+jmYtjaYt12=+u="+u=2t+= +u + ++&+s >uFE <,="+u2(+(+<,=0uD+j5D+YY(+x+(+:tp+(++P(Y^UVW}t 0(+օ(+F=-aE>t>-f~\}>u1҈%+#+(+:5(+Yz+u E (+`FDžtLcu:}t4(+(+Ut =0t h褝YU0uWYY몃}_^UVEPh,YYƅuEPhSYYE P-,Z+^UVW1U<tFBRYENjE8t]E3FYhp+%Yt+5p+Ux+|+_^UVUzt$Ur>t 6nYUrnY^U VW}~U rY95p+}5p+8+p+)p+=x+Nx=t+t7XnYx+U]Eu|+8+J8+u54+Zt胛1_^U}uu u3YYT8+jY+P%Y(+:t 5(+[Y8+J8+u54+Zt1UVW}t h,XY=|+ux+|++5+t >{|+2t >-uF>uR|++x+Й@Ph(j EP (jEPh  . |+|+>-u~tFEU z]9t(?uEPh 'YYE?UG?:uGG?:uF>u,|+օuEPhI'YYE?|+jVha- 5+MMEU jEPr8- |++x+Й@Phj EP&jEPh, 1_^U VW5l+t>u7(+2t >-uF>u1(+>-u ~u1uFE}]9t?uEPhdAYYG?:uGG?:u2>u%(+(+օuEPhLYY5215l+E_^UU2t$=L+u $3B <3BP{Y2` Euh+}u1h+jYUVW3}uh\ Z€:t143EE}}uE8u}:t:u B5:u&j kYVF7h+ =u }tEh+3h\A Z€:tEtsEj YUVUVuB=2tV E1}tjYh+E 鞈E_^UVWXE =uu h+E%$Ej @YƉ>UVUVu_^UVWyEU =Yj YGjYƉwUVujY*FE0 =t}h+E_^U(VW3EUU= u53E0VUh+ jKYjGYGv=tjYj(YGU=u@jYF v jYF*=tjYjYF봃=3u jYF F h+=tjxY3Mj }Yǃ=3u  jhYGE=tj&YjFYGu=tjY3R= u=3u53Yu h8 ,YjY 3W = =3h4 53+zYYpUU= u/jzY3V 3V E0VUŋEUW=3S=3tJj Y@jYF F Fw=3t=3th+3E=u E}u EjYjYG9Et uqY3Fj vY = tj >YjRYƉG3V 3V Fl=t=3 uh0 53xYYt h @YWU3&= jYE]E UUjYE]EU 3JU 3J =uUU= tj @Y뤋UB=3tj#YjCYUB oE=uh+} tj YUU E=3tjY3j YjYGG=tjY3[jY=tjYY31h+uuYYtj-Y =v= u53E0VU9h+E}t ?tj Y~UW_^U VW}}} u} EUU}= u/jY3V 3V E0VUŃ=3 u537먃=3u6U9Uu+9}u&=tjYF:h+EjYFUVU V _^UVW53 = tjY>=2=3u t3: u353Yt53&uYEt}O~ h` Y53Y3W=2u =22UE8tUE8>t>uM3-0= w -0F 3:-uF 3zt:hP Y-jYF v F3V 3V _^UVW=2=22=2t03RY2Ww w:ue aPPjYF3V 3V Wr e_^U Eh+UVWǃ=3=3u3uw3 Z=3uQ>tG39u0536rYYu- ǣ3봉_^UV=h+th+53=2t03R Y2t3P,JP,xT,T,ƃ tՃ EQ= tu4= u0tt3=2t03R YqTt223R1҉3R=&u3R3R=|u3R~3RhW=;u 3RN3R;3R-3R f|jjh]VPX^UVWUUt3E} auEEEExU|,+M=,+E} ]5 ,+E]Et=2t03R Y.E ,+E]E}t}t ,+EE ,+E]E|E=u ,+]E\T} u"=2A03R Y,}t-}\t'}`t!}$t}"u}t ,+EE\Ee u ,+]E ,+E]EEE e E aE}t ,+E]EE ]EEn}~M ,+EEQ ,+E]E;E}tU ,+E]EU U yP,JP,xT,T,bE} ]t=2u}u hD Y}tt3h8 g Y ,+EEU+xUxU}N}>t}uK@_E=>uE}&uEE聿UBE=<`j)YE@EjY2UPмE=-u2B 32B }&u EE}tE-0UBU3\E=(t1}{t+i!u"i!u ,+]E$肾}(u E ,+EEU+xx ,+EEDž|}{uͻEDž|Ei!tH,+J,+xE]E@EE]EzEi!u3Ei!u h$ Y ,+E]Eti!u1^U@}x,U 34x4xhp j@EP  34xh` j@EP{ EPYU=D+t535D+h hH" uh hH" j~YUVW NxD5#U UU t5jYE1 }UfrF@3EU@3UU}UzU uUz=`8+j WYY=tUfzWaY8+J8+u54+Zt|uh }YWaYuTEPu4YYURUB}t p"\"}t t"\"_^U VW}WUL+8+U UwjVoaYYEy5&QYPVh Z| U9UuuYYu`YwhhAVa Ey5&XQYPVh { 럋whhAV` Ey5&QYPVh { b xGU W :t U U1uw YY"W?YE(I l8+J8+u54+Ztz_^UVWuEP9`Yy h4 &{Y>u-V rEaYǁV Wru jjj: nua_YjjOYYjjOYYjjOYYjjOYYjj OYY>uV Wru uv !YYj^Yu^YE_^UVW5@31 }KVz=t:u TW^YVzxVzWPYYVzP^YG8+@3VLY8+J8+u54+Ztmy_^UVW5@3t01 }%VzxVzP(^YVfzG֋6_^UVu ju"^ ƅy=&u^U1=TUUUUV^UUlUVW}01"tX:tQ8+6JYH3t-H3P(Y8+J8+u54+ZtMw^UVWUH3օu>t=H+t4u/ =+t$=+t X EhUJցƤ3>u/ju LYYE=u h wY}u>t9u18EEE x :huuKYY_^UVuJЀ3tJЀ3t jVnKYYJƀ3^UhuMKYY}u=P3uuUJƀ3d+UVJЀ3u}0FJƀ3L+U4H3swYUL+d+^U39Ut!jYjYj YU3U,VW5 jEPT uF5 jEPS ut>=t EF+U׃}tuWhLel WU} uM u xRYEuYYt*V u } u u1j=v YY61_^UVWE34s7tVtE6ދUBRYEE34s#7tVt VEE6ՋEE_^U VW34c}E0NVu)EVu v*;YVuV;Y‹Vtv)YFfu륃g_^UVW34s&7tV uvhtYY61_^UVWE :ruE5P+cY}q(+(+Uj=uQYYDžtG2uYE]3tuv2YYtU V뤋6uWu E3}4E0UV~?=tEp"Hp"zy5p"YPp"ZPp"ZG붡p"Hp"zy5p"Yp" p" 6^EC1_^U=T+u hxfY(+(+Ut uY1UVW8+jYNjU:-u*zu$j 診YG j w h+ 1u}YE]3tuvYYu6uIj=uyYYtju莺YPEYYjjuf E0G G 3VW VWN j=u YYtju5YPYYw += +8+J8+u54+ZtPe_^UVW5 +j +~uj h+v v 7Y5$#V u wYWu wp7YVWV WV]7Y_^U}u u1YY+}uU M jrq5 hdY1UVu >t6FY6 Y1^UVWuYNj7uvYY|8+j=v西YYxuVtjh0+u fN Vuu vj6YV_6Y8+J8+u54+Ztc 7^_^UVWuǀ>t >=tF'13_^UVWu} G9uF<=u>=u u1_^UVp,l,d,5&>tj=6舾YYt j 6\YY^UX+`+T+=@+t P,Nh+=@3tp"4"t"H"=d"t5d"4Yd"UVL+f+'+sFc33s >uF^UVWEE} }t7tDhV-HYYuhVHYYuEhVHYYuEƅ?FEЄ}\}pEu1GE eE \E SE ME GEEMx7-0=s(F-0]È]NFRp"Hp"zy"5p"ZYEPp"Z"EPp"Z ?p"Hp"zy5p"Yp" p" }u:p"Hp"zy5p"Yp" p" 1_^UVWE  ME}tu E@}[u:UJM h`4FYYt hT `YUJM EU UDžEE}؍u v,YFE=>u(j 谲YEvh(j uNUV>u~t F FE=rE9 utvCYYtIE V}uPvBYYPvBYY}| E}u SVP> =t =uM܃}wU9}t}uE}uFPYtE܃}t}uE}uFPYuE܃UfEfG}tN<u@hYY1<u@htYY@t h]Yt1G]9u uW>YYu+U Й ɸ_^UY@Pr(YƉEuUΉUEOZFE7u?^uGFE?]u }C-u]t-FFOF?-u-F-F-FGGFEGF+UU?F}E } uEEUUNUĊ M}uU܈F} E-0= wG-0k] É]݋UĈF?,tUĈF1GE-0= wG-0k] É]݋UĈF?\uG?}t h VYGuGE=(u5Eȃ} ~ hVYFUȈFU؋MȈ EE}})u+U9Uu hZVYFM؋U؊ FEL}{u E E-1= sFE-0FEFMFEGEGU9Ut hUYUf4E_^UVU 444w u uYY^U4VWu} E}rEU9Uqu[+4f4GF9t?Gu3EEEGEπ>t;>-u!F]9'F]9|E]9uEFFU9U?F<4*+4f]4F4UFE4EMG]E9tW?LEEFEF]uEu}EEF,bE}u1IEU:uBE4EMU9U|UUURVYYt޸1_^U=T*t 5T*5(j8 T*UE(T*T*BT* X*I9r"X*X*P5(:$YY(UU:tEPYU}uj^Yj?{Ya}t!U }j^_YU@RQY:=#t&Et jM8Yj-0YUR"Y EPYUU:tEPhYU=H*tH*D*8#:t #"jEPj7 =uEUMx!=\*t5\*YjqYUV=p*p*1҉d*`*hx YƅupVP)YYy`*Pd*sPhl+YY\*t5\*bY\*hh*Y`*hd*Yd*=`*~ =d*`*Pd*^U VWE19u~U 46Y9E}}FUѡ`*Eh#YE}@E19uo9}VU UR6YEEMxUPYEU9U~EU9U} j Y}h#YF_^UVWj Y5(Y=@*5(Ox PYF_^U=\*t5\*YjKY=@*@*J(:t<@*J( }'=\*t5\*SYfjYY=#tP@*J(t>=\*t5\*YjY=\*t5\*YjY}u @*U(@*PY}u@*UjWY#UE_UUE_EEPY#u##UVW1(5@*֋4*9@*}*> t­%u}uj4*uYUV1UEuBF950*uY^UhmYUhYU1҉(4(aYU(J(4(BYUVuU  Mu 1/>t%]9uuu V/ u1Fָ^U VWut(>t#=l*t 5l*BYVEYl*!=l*t l*:u1o5l*>^u EdG EW.YE(UU t*(uW4(U uދ(( U(1_^UV=h*t h*(U(R'Y=0*umE8ƋU(h*5(Yu=L*~L*)uVYYtu VXY^UV14*9@*}jYF950*^UVu =(t5(Y(~7FP]Y(t$(UVR5(, (^UVW}~@*94*u 82}4*J9@*t 4*(5@*ֿj WY>t }j =Y#=#ttj Yj YWzYU@*94*}4*+@*U s}~u5@*YY(5@*֋U@*+4*BOx U F4*+U4*(@*RVY_^UV1=@*tjYF950*^UV1=@*tjYF950*VYY^U=0*te@*90*}&U0*@*6U+@*RY*@*90*~j,Y0*+@*JRY?4*+@*R5@*eYY(@*@*4*UVW=0*t =0*}UUEEP~YT0*BRYDžu90*UMxUF0*W5YEWcYE_^UVW=u [tCOuO<@1oƻ_50 sO00*I=t0 sk0* -00*H*5D*4As VY! %t9uW k_^UVW}@*<*=#t&ǀtH*!D*B$~t 9t~tVWYE=H*u 0*E_^UVuƀt 954tu 954u)=@*t@*G0*X954u=@*u=4*u7954uL*954uL*^UV0*1҉4*8*@*<*(L*J=tVC(O1KDyס(612+`V5Y2VY21^UVW}Wd YDžt\=(d}(A (<(.5('Y1c}B((F<((J(_^UUUV=(u"@P*RY(u1jYh#8YX*RwY(}tE#(P2Y[ƅtVe Yh#YjWY5(5Y(J(4(Yt/>t*=(t(J4(V%YYtVY=L*~#L*UL*ue$P$YY^UU=@*t@*U=0*u0*P,YU4*9@*t @*UVW(5@*95(s*N95(s ~\uNPh#$YYtF+(+@*BURYEu17}(@*9v>\u(@*F9tFGE_^UVWJǍEPWk YYƅtWwYt,uV`YYNxU4YYuNYT_^UVWǍEPW YYƅtWYV $YEP YEE>A |Ph#a#YYt}t~t U\EFUE붋UWY}t uPYEu|Y}tE_^U(4*1U=@*4*9@*uj1Y@*J( MjY(@* @*I (@*J(PY@*AEP5( @*YZEPYUE=u uYU4*98*~{D8*9@*~#@*U8*@*U8*8*+@*RYU@*8*UV=tu5.8*94*r@*8*5@*^U=(t(:t5(ZYU4*98*~I8*9@*~@*+8*R58*YY8*+@*R5@*YYUVWE=u9@*B֋(954*~9Uu 5@* FG߸_^Uj-YUjY@*9<*t +<*U<*@*uAYUVW1(5@*95(sV­%u jOYN95(s ~ tV­%t j'YN؃=@*t G9=0*_^U~@*9<*t<*+@*RYUVW@UR YE] u1u­%tF> t>u11BVuWZY>> ­%F>tӀ> tΉB9UW@UR YEuUVURuuW E@u YUUE BVuWZYWFQU_^U VW=(t((օu V|Yƅu qEPVYYǃ=0*t&9=0*}0*M4Y.u~tۀ~.u~tσ}tuu VC uEVYE܁}vtOU4Y@1uLW@RYEu EYtRuu uYUUEVYUuu uuYEGuY}uN}t# E10NE1E׍U9vN VYƅtVuWZYhYƅt,VuWZYthwjWu6_^UVWj/uYYƅu8h%YDžu fuYƅuKWhYIubYDžu3+UBFVBYƅuW+Y E 8E01_^U(VWEPEPuL y1EPuu< EuuYuY1EuYE؃}E E0Y+EؿǍGP`YE]UWRu uTY]P3HYZPYEuuYYhuYYE0uYYuuYYuYE }|u؋E0YE9uv)9}vU] 9uGF9us8+UؿWaYEt]UWRu JUuJYuAY19uvU4.YFu"YE_^U EPEPuU y1)u uuI EuYuYEU=&t&jOYUVuj jV ^UVWu1E%tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5&Nx 4^U=&t&uDYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV*U9*wU*9*v& 16VYt1'*rF5*&Y5*^UVW}u1E}UUs& 1=*u8jHY=u1V!փ5*5*FE5*OVU}9}r69v2W9UvUW~>}t E*u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=*<9}r79}u+UOJ}t E*URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^U VWUUb15*t 9ur6E0tU U*tU9ru NJEtU9Wu RWE_^U} t#U*U JUUuRu UVW}U9U ^UU UU +U1EE9us0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+&"}t}y UU_^UUAs UEUUas U EU$UUEPjjg y U&1UVW5&&}׃}~9r }y 9vWYu_^UVWuU VVua YYDžt~~yVډ&F_^UVW}u YfE=&h\YEu ELPU:/tHhDYEt/u uZ YYuhuW E4h0u& YYEu&E+UMuRQA uuY&1W Y-E8\t%tF>#tEPVu u&E8|t E8:uusY>t >|t>:tFF<|t<_^UV5&t}uEF<:t ~u1%tFjuVD uˀ~#uōFPVY^UV5&t}u7F<:t ~u1&%tFjuV uθ^UVW5&E 8t}u1F<:t ~u1%tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!Fd GF9GE UE 8E_^U VW*EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F" +EUU FE*_^UVuu>t FPUY^U$EPjj U$UUU UEPj%jm U$UUU UUUE`EPjGj< U} v&M E 1U} v&M ҋE!1UE1UE1U} v&M Et1UUM J} t U RY]uEPu B1UEUUzt RYuh*rU RuZBRY*UVW11}U90(u 0(F߃| jugYtUrYtURtUzt rY}'t}(t}(t u~Y_^UVWuEu41}%<0(t40(YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv* =u N /uvv EU9Uu1 N _^UV1}*<0(t0(Bt 40(aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<0(t,0(R@t0(Bt 40(YGƒ~uF*FF VVv vv >uNN FFSX_^UVWEE11<0(tN|1DFρECEE0-EMP1E E U :t! EE E 4 U uuuwYYEy@Ut8huYYE~" tuYuu3YYE}y1]jYEu uY1A!uEUMJUzUBU0(E_^OgsC 7 S . USE] ![]USE] ![]USE] ![]UVW}u Ms UW}0))ϊE tu1_]XG_] UVW E_^] T$  L$ 7 UW}0OE uG_]1_]U 1 Uujj< Ujuj( U$UUEPjj U$EPu YYEPj j U$UUEPjj U}u& UEuYuYU$U UEPut YYEPjji U2E Pu ULVWE1EEU UE8t+0@YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s&KV8YE=u&&UEUUU}׋U UE8t=+UEEE0RYE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WE }׃E뻋EEU9vGuYEuUUȋUUEEEPj;jR RY_^U(VuEEV֋RUV֋RU E kUUU UEPj7j ^U$EPjj U$EPj/j yEU$EPjj yEU$EPjjU U$UUU UUUEPj6j' U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu|YYU UEPjjk ^U0VWEPu YYy1U؁@t&1huKYYDžy1EPW2YYxS&U؁@u7jWYYEx& PjW xh$Yƅu&UWYUЉ&1FfFF_^U$EPj*jU yUEUMJ1U$UUUUU UEPjj UVWuu& 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V**5*h*jKj9 ^U$uNYEUUU UEPjj Uu hT$u UV& T$@, T$@% T$@&E uVuO ^U$UUEPjkc#ZsXsXfR[[׉1ۇ(tPXPwaitunsetumaskfalsetrue:trapshiftsetvarsetreturnreadpwdlocaljobsjobidhashgetopts[testexprreadonlyexportexitexecevalecho.chdircdcontinuebreakcommandcan't cd to %sCDPATHHOME not setHOME%s ...pwd command failedCannot exec /bin/pwdpwd/bin/pwdPipe call failed%s: %s%s:  1gJ J V b m Node type = %d Pipe call failedPipe call failed_normal command: builtin command: Shell function: Pipe call failed%s: not found falservfunction %sbuiltin %s%s: %s %s not defined in %sfuncbuiltinbuiltinP('(("("((null or %.*s: parameter %snot set%s 1!.#.$.*/-g/00?.@//etc/passwdHOME/.;z:;*:?:[;sh: turning off NDELAY mode Out of file descriptorsCan't open %s (core dumped)Signal %dExit %d %d [%d] %d %dNo such job: %s%s: ambiguousNo current jobCan't open /dev/null/dev/nullCannot fork - core dumpedSignal %d%d: zQNqP%OOO^ONOOOO P1PzQXPPPPPPQmQmQ???<<...<&<>&>>> () ... in ...case in ...for ; done; do until while ...; then if )( | || && ; }-+?=You have mail6T/.ashrcHOMESHINIT.profile/.profileHOME/etc/profile Use "exit" to leave shell. Can't open %sOut of spaceOut of spacestunalloc IFSarg countep:Illegal number: %s%.4o Illegal numbercpbbbbbbpbpbbpbpbb c!cAcAcecececycyccced!dDd[d[d[dddxddddddee9e9e9eYeYeseseBad -c optionIllegal option -%cOPTIND%dOPTARGNo arg for -%c option Illegal option -%c OPTIND%dUsage: getopts optstring varNo arg for -%c optionIllegal option -%c"esac""case""}""{""done""do""for""until""while""fi""elif""else""then""if"wordredirection"`"";;"")""(""|""||""&&""&"";"newlineend of fileesaccase}{donedoforuntilwhilefielifelsethenifnn4n:nm6uuuu6u6u6u6utu6u6u6uu4p6u6u6u6uqqsq6u6utu sexpecting "in"ininBad for loop variableBad fd numberIllegal eof marker for << redirectionR{ z y fz y#z&z(*{)8{;z\ z|z} 3|{|:}F}Y}}}(~L|Bad substitutionMissing '}'Unterminated quoted string%s unexpected%s unexpected (expecting %s)Syntax error: %s %s: %d: Out of file descriptors[[cannot create %s: %scannot create %s: %scannot open %s: %sPipe call failedStopped (output)Stopped (input)StoppedStoppedTerminatedAlarm callBroken pipeUser signal 2Memory faultUser signal 1KilledFloating exceptionEMT trapabortTrace/BPT trapIllegal instructionQuitInterruptHangup%s: bad trap%d: %s ێR+4=Signal system call failedٗX&cdosǖux&PSE=* PS2=> PATH=:/bin:/usr/binMAILPATH=MAIL=IFS= PS1=# PS1=$ PS1=%.*s: is read only%.*s: is read only%s Not in a functionList assignment not implementedƤ 0\פbYcbfinrr{tv-e-n--true %ld %s true%dExpression too complexsyntax errormissing ]]:$%,3lszªɪЪ cz:: +<MXfuDivision by zeroDivision by zero-n-z-t-L-h-s-k-g-u-p-b-c-d-f-x-w-r!:%/*-+-ge-le-lt-gt-ne-eq-newer!==&-a|-oЭ$c*u.ح[\]RE errorRE errorRE errorRE error ڰfvӱޱlicoledumbTERMSearch: A B*C4D>mmmm}m /choices/unknown errorr/etc/termcapTERM/etc/termcapTERMCAP 0H1H2H3HEb8f@n r(t0\% +2PdirOOPSaprKwZ+bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0!!!S>EL+f|T,Y4nYjEB]6jis`-JE x p h `\TLH@80,$ @(#)cd.c 5.2 (Berkeley) 3/13/91@(#)dirent.c 5.1 (Berkeley) 3/7/91@(#)error.c 5.1 (Berkeley) 3/7/91@(#)eval.c 5.3 (Berkeley) 4/12/91@(#)exec.c 5.2 (Berkeley) 3/13/91@(#)expand.c 5.1 (Berkeley) 3/7/91@(#)input.c 5.4 (Berkeley) 7/1/91X,@(#)jobs.c 5.1 (Berkeley) 3/7/91@(#)mail.c 5.1 (Berkeley) 3/7/91@(#) Copyright (c) 1991 The Regents of the University of California. All rights reserved. @(#)main.c 5.2 (Berkeley) 3/13/91@(#)memalloc.c 5.2 (Berkeley) 3/13/9100@(#)miscbltin.c 5.2 (Berkeley) 3/13/91@(#)mystring.c 5.1 (Berkeley) 3/7/91    @(#)options.c 5.2 (Berkeley) 3/13/91efIijnsxzv@(#)parser.c 5.3 (Berkeley) 4/12/91, $     x | t p h ` \ X P L H @ 8 A@=}-+?=@(#)redir.c 5.1 (Berkeley) 3/7/91@(#)show.c 5.2 (Berkeley) 4/12/918 , $  | t l \ H           @(#)trap.c 5.2 (Berkeley) 4/12/91@(#)output.c 5.1 (Berkeley) 3/7/91d4"H"0123456789ABCDEF@(#)var.c 5.3 (Berkeley) 4/12/91D, ,0,$0,+ (3 43 plhd`\XTPLHD@<840,|xt # "#$&'()*:;<=>?[\]^`{|}~ TjQ|  % &Q6QQQ>4QQ .<F>`?bdftlmRuyw. ((((( AAAAAABBBBBB SSSSd5Unknown errortdL@$tdXD4$|dTH8$&&&&&&&&&&hTH0t`LCB'((  C1$T$L`su;SSSSuTT QRP0 PU4VWu MuEFUŰUIMIh6YYDžu6hhhO Wh\EP Ut6hDh WNYfUfUUօu 6h(h W!YW}~6h YYEU։IfMօ^WhEPr uh YYUUUօ~|J|x+h|j+UYYuuh] WpY_^UVWu}JxFFSXVYGJxFFSXVdYEJxFFSXVEY EUfJxFFSXVYEJxFFSXVY EJxFFSXVY EJxFFSXVY EUE E $_^UV5XNx 8^U=\t\u YUVW11}U9u F߃| jugYtUr YtURtUzt r& Y}dt}|t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }\R~y UVu CV€tu ,fNV~|u>5Yt.h,YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvs =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuuYYEy@Ut8huYYE~" tuYuuWYYE}y1]j!YEu uY1A!uEUMJUzUBUE_^UUUuuu  UU Uh|uuz UV(U9(wU(9(v 16VYt1'(rF5(&Y5(^UVW}u1E}UUs 1=$u8jlY=u1V!փ5$5(FE5,OVU}9}r69v2W9UvUW~>}t E,u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=,<9}r79}u+UOJ}t E,URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15,t 9ur6E0tU U,tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U k }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"ULEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U|JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE,UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPzYY=t6JxEEFFEEVPDYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu9YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MUUas U EUh4hYYj&YUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇtPXP = %ld = 0x%lx %ld44444%s: asize: %s-- no sections asize: %s-- bad format 22222244asize: cannot open %s ra.out12 4\ a r w 6 + b } !@VzXcbHdZiZoQpcuZxcS D#I+?-:0NEL-hl"KEGX7b7cduefgiuno7p7r%su7x7(null)cannot print floating point 4SSSSBd|RVatWatrunXawkYbackupZbanner[basename\bc]bsfilt^env_cal`calendaracatScawfMccbcdiffcmshdcgrepecheckhierfchfngchgrphchmemgchownfchshicijcksumkclrlcmpmco]colcrtncommocrcpcronqctagsrcutsdatetddudevdecomp16wdhrystonexdiffydirnamezdis88{tcpdp|crontab}dosdir}dosread}doswrite~duNdel_routeKechoedejectelleellecelviselvprsvelvrecexexpandKexprfactorKfalsefdiskfgrep  < 8O1$T$L su;SSSSu  QRPt PUVW}|}~E 0hh( p jYU rYE=u] 3hh( ; jY}t}u;U M r qRYY=uE 0hdh(  jCY}t}uCUJM j4@ YY=u)UJM E 40hLh( jYhPPYYu,5 Y] P3h h( bjYTPYTPYNjWUwkGdG9EFmuEu n1E9w9wkGdG9EE;N;~N9w9wpkGdG9E`EX;~WBG9 ;~WBG9ukGdG9EE;~NE[9dERuVRhEPddERuVRhgPWj?eYEhgPLYYPu35 Y] PgP3hh( jYEUAMM\U`\\Et!}=tU9`s``Ƀ}=u`EPhP \:t8:'uhPYY\PPYY\뽍EPhP PPhP uh|Po }t}u"UJM 4hxPF o J x  SX h YE=t9PJPxUPX@PuYYPYPPgP =u@5 Y] PgP3hTh( sgPYjYEPgPYY=uD5 WY] PEPgP3h4h( gPYjXYE ]S0h$; h h aYYP|DžLPYE=tD} t>-0= r DžL&U0kL ЉL=0urDžLLvjLYY1_^UVu~mF=0^F=9OF=0|DF=59F=0|.F=9#>0t>1tF=3>2u VY^U VW h uYt uY1Eu }% 2uYYt9}t G փ }=u >Yt u cY1Et 9B|MU4 _^UVu=0| =9F>u1^UVuj jV  ^UV5 Nx |^U= t uYUVWuYƹ< +F؉F +ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EPI1>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWW8YZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVh@YY_   U  U( VwY=Vh@@YYVh wYYƅ>-uF>+uFjVEP ƅUU j h 5  1  Vh YYƅpj h 5   >t>,tjVEP ƅt5U >t'>,u"FVmY=xwVh YYƅu_^UhqYPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0Jx 4EU M R+Q¤ЙЙUuW +UЙOIkkE0x UM 9_^UVWuE  E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVW11}U9@ u @ F߃| jugYtUrYtURtUzt rY} t} t}( t u Y_^UVWuEu41}%<@ t4@ YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvR =u N /uvv EU9Uu1 N _^UV1}*<@ t@ Bt 4@ aYF^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<@ t,@ R@t@ Bt 4@ UYGƒ~uF0FF VVv vv5 >uNN FFSX_^UVW}Wu u8 ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~ u>5 dYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv  =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvq =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<@ tN|1DFρECEE0-EMP1E E CU :t! EE E U uuu# YYEy@Ut8hu YYE~" tuYuu YYE}y1]jYEu uY1A!uEUMJUzUB\^_`abcdefghU@ E_^UUUuuu $ UVu JxUʋFF VuYY^UU Uh uu UUURu hu'UUURuu uUEEUUUUU JUEPuuP EUJUx ]E EPjYYEUuu huG [ k g 7SjUVWE_^]UVWMWE_^]UVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWDEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhx u%dEuEu1k0Z‹N9}t Epu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=p<9}r79}u+UOJ}t EpURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15pt 9ur6E0tU UptU9ru NJEtU9Wu RWE_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVu9YYDžt~~yVډ F_^U$UUEPjj U$uYEU UUUUUEPjjf U$UUEPjjG U$U UEPuYYEPjj UVW}E 0?tG9}s 9usON9uu N/E 01_^U Vu U>t3FuF>t>/uEuYyUȋU 1^UVW}t} w 1?Uu NEPhYYy1EEPuYYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWYEu=+WYWY VY1_ELEUh|R@YYtUhxR%YYuP[UM9uMhtvPYYURyPYYEPvPYYy `EJUM9E]9uUREPu yWY "VY1dWYuSYy VY1EuEPEPVeYy1>uN/9us VuYYE_^U$EPj/j U$EPjj U$EPjj U$EPuzYY1ۅÉU$UUU UEPj%j} U$UUU UUUEPjjS yEU(VuU @t*uFYEU UV֋RUUUEPu YYU UEPjj ^U0VWEPu`YYy1U؁@t 1huKYYDžy1EPW"YYxS U؁@u7jW YYEx& PjW xh$ Yƅu UWYUЉ 1FfFF_^U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEu YEUUU UEPj&j Uju YYU$uzYEUUU UEPjj8 Uu hT$u U$EPj j y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEN uVuukƀ}Xu9utUPsYUE_^U4VWuEEEE }%MJxUʋFF VupYY=u}t UډE1!,'"U] EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U}JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE8mE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VutYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u M/UUas U EUhh( .YYj~YUVuu TfFV V#U UU +UVjvP =uU 9Vs VYu1^UVudYƋU rU MJwU uRYY^U$EPuYYEPj j U}u UEuYuUYU(VuEEV֋RUV֋RU E UUU UEPj7jV ^U$UUU UEPjj1 U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pg1ۇ tPXP 99er%s: %s created %s: cannot move %s to %s: %s %s: cannot set ownership of %s: %s %s umask %o cd '%s' '; export %s '\''%s='%s: cannot create %s: %s w/usr/spool/at/past/%02d.%03d.%04d.%02d/usr/spool/at/%02d.%03d.%04d.%02d%s: cannot determine current directory: %s %s: cannot find: %s %s: wrong date specification %s: wrong time specification Usage: %s time [month day] [file] DecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown errorarw*+ bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0?****s**../......0 0@01X1b1d1i1o1p1u1x12 2#2+2-2025L3h3l33E]5GH5X4b4c/5d4e]5f]5gH5i4n4o4p4r5sm4u4x4(null)cannot print floating point 1; ;1; ;1; ;;;;x/usr/run/cron.pid<[y1OGMTGDT U U 4,$ xph\TH< SSSSB  ( ((((( AAAAAABBBBBB Unknown errorD8 dT@4 l\L4$ lX D,pXD,C  - F1$T$Lsu;SSSSu QRP8 PzUVWxPUYxPtYǹdGwwwRhdEPhTYEuYƅ~~.t~ptj EPFP$ čFPh@EP FPh(EP fuEPEP]YYzEPY|PEPaYYEPEYEPBYjEPhh EPhh$ j%Y 1_^UV5Nx @^U=tuYUVWuYƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP )>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WWl YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhO YY_U U( V; Y=Vh YYVhwYYƅ>-uF>+uFjVEP ƅUUj h5 1VhYYƅpj h5 >t>,tjVEP ƅt5U>t'>,u"FV1 Y=xwVhYYƅu_^Uh,E YPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0Jx4EU M R+Q¤ЙЙUuW +UЙOIkkE0xUM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FytG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhxu%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEHuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U%JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}prstuvt UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }>,~y UVu CV€tu ,fNV~ u>5Yt.hPYFu NLNHF 9h"YFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u M'UV0U90wU090v 16VYt1'0rF50&Y50^UVW}u1E}UUs 1=,u8jY=u1V!փ5,50FE54OVU}9}r69v2W9UvUW~>}t E4u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=4<9}r79}u+UOJ}t E4URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb154t 9ur6E0tU U4tU9ru NJEtU9Wu RWE_^UUas U EUhxh$YYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVutYƋU rU MJwU uR)YY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U$UUU UEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuth$70YYu@F72@~tFM7h VYY7VV#YHZ F뙋U7=7=7u#=7~777 77:t+j=2KYYt7704Y 7575757+5 =7u7l#7gC 0jwY_^Uu u5YYEuuh(YYEUhPh#~YYu uh#l hLh#ZYY=7t7r2h8h#5jvYUv/ URvYUVW}UuQW֋@t>=7t5hT9vnYYt1EPjpjjyƉg]U| }~uhXYYUUWUY ttV/Y뛉_^U VW}WU\u$w YV9@YRPEE}uLw YV @YEUwjuu艾YYV? w YwYEV?YEUu?YEU}6t }EMuu5p5l+hh#,YYuuuuTYYEEuuuu躽YYEEuuuuYYEEuu5x5tujhYYuuuuYYEE~uu55|貿ujhYYuuuuEU6uuuu0EUh迧Y E/uYVYuujjE_^UVWURUUr YƋ1u>t6hh#螦 UrY9}u3tW=YRPV< iW=YPV=YYTVn=YEUWa=YEUuuuuݻYYEEuuuu;YYEEuuuuYYEEuu5 5ujhYYuuuuYYEEuu5(5$跽ujh|YYuuuuEU:uuuu5EUuhdaUYY ,E0uuVX; WY_^U VWUrYEPZ<Yƍ>tFGuYUr YEP&<Yƀ>tFGugY55Pj(_^UVWURUtHUr "YEP;YuW^(YYuY Dž#EtuP%YYƅU<tR~D92P裥YYU4{YEP;YEPPxYYuMYF뢋P92PVYYEt55Pj%P^YY}Y0_^UVW} u1 UMwYV9YEU u=wYEP9YEURPuu`EUu^YW UM@uu"YYEU(uuYYEUEPuu EUuu覊YYEUuu訓YYEUuuYYEU8Pjl55YYEEuu55ǹujYPj EEuujj軷 YPjEE$whLh#( GtVYuujj_^U,VWUR ~&UztrYEPN8YE~0UrYW8YEPV%'YYWXY Džj jjE~ VgY hT9gYPj̷jjEUuc1YED~4UrYW6YRPjj. ZJWY Dž~2UrYW6YRPjj W[YVgY+U>t%I~PfYtFFր>t9I~&P~fYt FUEFUE‹U5l5hPjEUrYWYVbYYWmY=T=t45T=j#H9Y[ Z5@9j L9Y[ Z5T=jjj ExhYhV{#YE\V~Y=u5t5p 5|5xjj E#hh#违YYUBu YE_^UVW}@tw^=|$tw5|$̟YYu5$95|$2Y5$2YW4YP2Y|$PVaY$Ɖ_^U VWUR 9UrYEP4YEUrYǃ~#UrYVQ4YE썕U T9UU1Uzu1Ht&uuRwuSc6hYY~Gt/PhT9蘞YY7hX=2hT9 +PV2YY7hX=2hT9 u YW YV Y Džjkjjt _^U4VW7UԋUzr xYEP2YEU.tNtLuOEt%uu5854肳1ۅÉ u2YE؅t 8t1Ɓ.uuu Y@Nutu Y0Luu1{DtKu 7UrYEP1YEU.tNt0t 1Et)uu5@5<1ۅÉ]gu1YE؅t 8t1EDt }t1u}t1#u u~DDtKuTu,1YEuYEuu]YYu1ƁK"u1EQ]tGuuuumy!uuuuN~1uy0YPuo0YP2YYy1y1eu1Tt1C~12x1!Whh#Q l@u#YuYUԉ7Vjկjj_^UVWUrYƋt)V/YRP551ۅÉ]VS/YDžt ?t1EVY}tUr YUzt roY0_^U VUrMYV{.YEURP55~t0VYUr Y!4VYVY0^U VUrYW VYUr YV-YRP5854t VxYVoY0^U VW}twVYVDY t=w >YVl-YEUVYuu5@5<dtCwY VY-.DtwYVYz0_^UVW}iPl`b t%w YV,YRPjj EEu/bYW"Yp lGo_^U VW5x$YUz !zuVr Yƃ>u"55hjx$v vv6x$VYU<tXu ƅD92P薖YYU4nYV,YEPPlYYVCYG뜍P)Yt'P`YRPPj x$.55Pjx$ x$0_^UURUr rjj4 YU$JM7U$VW=$b|jhYYx$0URUE8@tjhCYYUr rjj賩 ZU܅R+YEE1UR U9}`UM4YƋtu*v vvjoE>t #E BuuWZYE9}~055jj%BPuWZYE$M 7$UrRYEP?Y $}UJ9}} U4t Vj YVYOۅtU4uvs'YVl'YOUO4YE];u2EUr7'YUNJUN^ JZ V'YOu 'Yx$ x$x$r rq3;_^U0UuFYEUVj)YƋUF^UVj )YƋUFU V^UVja)YƋUFU VUV ^UVj6)YƋUFU VUV UV^UVj)YƋUFU VUV UVUV^UVj(YƋU} u F u %YFUMVN ^UV Uuuu R^UVut-t%~tv~(YFVj(Y1^UVW=>tk>P= t t#u:ƃ t= eR酹1҉>RRh,hAh-j+j=a>P,hYh5hZj-j=;>PhGhHj= >Ph6h7j= >PhEhFj= >PhPhOj= >Phh;j=~ >PkhLhKhIj~j=z>PEh0h.j&9 >P&h1hNj| >=>t=>1u >5>hChThBj=>t=>Cu >5>h?hUh>j>j=>=>t)>>>l5><D>R+:>R 3u _?u_uG VYh?YEu_h>h?5Y~YEuG(u>R=>t(h?'Y>=t>R`}tE@>PH.t 0 sV.Yh?Y>P"uh?Y>P5>VX_^UV9EuE VYE^UV9EuE9u uE VYE^UV1<tu4YYtFދ^UV1k tk u譍YYtFk E k ^UVW}TƅtVh,YYt G3Ɖ0 sG.u$G Ɖ0 sGtVVhʌYYtEGƅtVh詌YYt GƉ0 sGV\YM_^UVWv1t@1ۃ"tC\v} s i _ U0 sK1҉׉U}}"0 s0EVYƻU EVPYt UE%UX_^UVW?{=/t5 u hYWPYu\u FFljFR_^UU$=CvCsU V=$t5$$6=7t7:t 757蜅YƉ-C=u C^UVWUzt1Uz tHr YWYEUruP YYWYV[YY VY9uUrYǍPW_YYjHjjQ_^UVWu }uET9H Mu EE EVu&JxFFSXVkYE=u1B}E9Ec}YucNYt%UGJxFFSXVYEUGJxFFSXVYE됃}t5JxFFSXVŃYE= t}t  GU}T9p7hX=2hT9 7r25$5 ݛYY7Y[ ZHr25,5(貛YYHY[ Z9}r}t1_^UV=7l#t$Hr2jj Z96=7H 04 ZHr2jj Z95hHEP h HEPYYEPYj=V)YYtVY5hDVFYYu h@V*YYu 7l#h<VYY77257uYYtE=7l#t 57DY77l#781^UVWDžu 讆Y=~uu uw kU : t:u E XHr2jj9 9|(Ur*YU4YUG1uUt%>tPhT芅YYtF>>t8Pu $KYYu&PJYt FUEFUEËUPYt)P|OYRPPj*vGU$5P5LPj(PGU>tFWj`HY[ Z_^UVW75G2ӄYYt75GY5GY72YGPeFYGHr2jj艘 9|(UrzYU4nYUG1uU>V5G FYYt(T=~FUE>t FUEUU5`5\Pj(GU>o5@9`WjHY[ Z_^UVWHr2jjk E9u|U9X=tF9u};d}U9X=tFdu Vhd+YYVjiHY[ ZT9Hr2jj E9u|7~ D9 G4X=YEU:t E GFG_^UVWUrYEPJYRPjj{ _uYHr2jjZ ^9~4F9/2PWEYtFGG>%t G~%u FGUFEMEtPh<YYuFڋUU <uuhYYU C4#YE>suuYE6u8YjjN PW} ~ltMUlEUdEUjj PWX} PW7}~lu*jj謒 PW} ]jj肒 PW| 3uPW| PWO~YY ҥuYWWN~YZFuY_^UVW1 }4k Gt%k uG}YYuk GF1 }k GtF u hYUU=|Cxt(P@Yt 9uGF9uGFӀ>uEUPj@YtEEE1_^UhH55h j h c7hH55h j h 4HhH55h j h D9hH55h j h P9hH5 5h j h hJhH5 5 jjh {7hH5 5 jjh| OHhH5 5 jj hp #7hH5 5 jjhl 5( 5$ jjX=@T9hH50 5, h` j hd lJhH58 54 jjh\ HhH5@ 5< jjhT VH9hH5H 5D jjhL *L9UVWu>t>=tFFhHuYYDžuJV YthHVBYRPVj uIhH5 5 Vj u(V} YtVfBYRPW= VW YY_^U VW}hHu ji5 5 dYYjjh <HhH5 5 jjh E@ Hh H5 5 uj h 19u rBRh EPu 4 Yt'h H4vAYRP4j EP$h H5 5 4j EPiF_^UV1U:t E 21^UVu uYZ4t6uvYYuFv1^UVuuYYƅuuuuuu uuh YY^U VWj ` YjV Yu0 Y~u&YEUVUM4U uYGUMWO _^UVWu uYYƅ=pJt(u 5 5 h0 juO;Uh YE12} UGj YƋUUV  VN j X YEu1Y]Uru!YEU MQUM ]u 5 5 h, uuu=pJh>_}U}uDUvYh YF12} VG$ ( VN }tU_^UVWu>uCvlYhM YF12} VG4 8 VN _^UVWEujh< YYURU12}4U4t'VU6YVURRYVYuGNjUrYu.Y_^UVUr> u0v vjj ZRFYƃ>uVYu h\ UYPuYYj vP" ^UVW} UJ M9uL~ lJ GU4iYEPYEU:t E Gu8YF_^UPunYY5x 5t PjUVWURUEu h| QYPuYYUzDžPY4t6PqYYt v݅t?VrY6Yt NJ94u 0_^UVWUr uvh YYVU~fUrYEPYEE}2}7UMV5$1YYtT=UM؃}~FG>tFGEuh EPm juEPm EPYtPj9YRPu? PuYY>C5@94U1= uC]E>}tPh M4YYtF>>t.Pu*4YYuP3YtFGFGEuh EPl juEPg EPYtPd8YRPu9 PuYY>#}FuYuYEuj=jjF_^UVWUr VYƋujh YYVUV)YUr&Yƃ>uu6uh ~ E}2}7UMth@ VlYYu1>tPh< UlYYtF>u1-0= sF>.uF-0= sF>tJPh8 lYYt6F>u16>tPh4 kYYtF-0= sF1^UVu>u1t2&vYFU MVN  tV;Y6hD h#Fi ^UVu>u1t=&vYu [YF` d VN  tVY6hh h#h ^UVu>u+ h YF VN UM$tVN UMv4YEUEU^UTVWut~gv vjj~ jv vmu hJ:v vWEPhvlYEP3YF@>u' h YFNj VN 6h h#g _^UuuDYEu h YEUuiFYU VW7=>gYxJS=Ju<JJU}URׅu UB}bN|J=>tH=>/t<=>9t0=>=t$EG}e뾻 >韐O=xJt5xJIYV7Y=Ju =|Jt,jkYt =|Jt5|J YVYԃ=Jt5JYVY_^UVh?hGDhYYh@hIh?" =>(t h Y=>)tJ=>@t h Yh?Y4&$=>,u|4&54&j|FF \>CF >=4&~#4&J4&4$qY=4&^UV=4&~%4&Jօx4$ugYYtN^UV1<tU9tF^UVW=>{u ~ƃ=>,uxEE=>t=>:t D hYǃ}tWuVh"WVh Ɖ_^UVW=>:jY{hYi]QE9j-j5>hK q=>@t=>Mt=>F 5>hYY#jhHh?@ E=[t h YuYp=>}uh?Y EX=>}tNjUz}:z >d>u h rY_^U=>:u3UVWE>=>(u=>}n=>)a=>:tU=>tI=>t==>t1CljEE=>,uV#Ew܃=>)u~=>t=>t =>u>UL1҉U>U RZYFU UV~ }u5X=hYYEE}t!UN]UzB}EًUN_^UV=>(t h YE=>)t h Y`ME=>8u=*1Vuuh^U =>(t h YE=>)t h YEPuh UVW=>(t h4 Y=>:ttJ EtJE=>S=>u05>jvjh EPhYY&jhHh?> EPhYY=>)t h$ YEPWuh =>:t h Y=>:t 1=>:t h Y^=>)t 1=>)t h [YEPVWuh JƉ_^UV>= t=> t=> t݃=>;uheY5>YƉ^U[EN=>t hd Yy=>(t hT Y`RE=>)t hD i Y?uuh UVWE=:t5EE=>,u!uEUru1UB RYFFSEtUNYtV5>TYYƉ^UVut0-t(Zt Ht7tFtOu1^UVw5>YtV5>YYVu uh^UVOƃ=>?u?E=>:t hx YvPuVh]^UV:Ɓ=>Nu'<PVhNh͉^UV:Ɓ=>.u'PVh.h͉^U Vƃ=tJuC=>u7jhHh? EuVhP =>;tT=>ItH=>Ct<=>Bt0=>?t$=>>t=>Dt =>Ku,>U PVuht^UVT5>%Yt=EPVh Չ^UVW1ׅt9}tF_^U VW5>=>Yt =>,u\ǁYuWh\h ǁ=>,t=>Yd5>ZE,uuWh,h믁YuuWhYhh Y뀉_^U VWǁ=>Gt=>6t=>E5>pxEauWhGhNuWh6h4uWhEhrh /Yb _^UV=>Lu!OPhLh 33Ɓ=>Pu PVhPhƉ^UVW5>.YDžtOh=>@t=>t h jY!hWVhhT>U5>YDžt2}@t }u hWVhh=>1n=> t h Y=>@t=>Xt =>u EEhVuh LƉ_^U}Au}5u1U VWp5 5h?j]h?A"YRPjj@WhxYY,E=[uf=>u6jY5>jmjh W2YjhHh? WYiuY=>u/5>jljh WhYY%j hHh?- WhYYD>U>U1҉>>8ƃ=>,u VYƃ=>)t hYU>U>njhIh? P5>YY5>5>YYh Yoh?[ YRPjjZWhYYVh YY7Ph eYYjhYY >}>>5<58jj@h?SYGWhYY>>.=>@t=>Xt =>u EE>=>uE1҉։UuVuh hY@>|_^UVW1{=(pJe=>=>)t} u5u0=>t$pJjhHh?N pJ`=>,u=>)t h<YGrpJ=>)u h,YW RYƋUFU V~ EE9}}!UAMMC`]VڋUN_^U`VW71=>t#=>]tD=>,u Gԃ=>]t hPYB R"YFUV~ EE9}}UAMMCt]V݉_^U`VWUU=>t9=>)t0D=>,uU=>)t h`dYG뾉B RiY FF~ EE9}}UAMMCt]V݉_^UVW557hh#O=>thGhh#qO hh#_OYYׁCsFENCs=FtF> u E}tN9tP9t&h#POYYF-C=uݾCր> th#PNYYhxh#NYYu uh#N hth#NYYj^Y_^UVW}uhhYY1U8&<&H&D&@&hh YEPjFYYu15=H&|hhuYY1H&`ROYNjU8&<&W\D&h YEPjYYu1fGPfGRGTGX^V;Yu fVfWPuWRBfWRUSEEt5u"FP&Y9EVUFPYEVYNjUWTUWX_^UVWE }t>=<& |hh(YY1m<&U<&RY1EPIYƅu17t VW; YYUuE #UE 8& |uD8&EPYƅu1VWYYUuE #UE 뮃}t U1PYEPWYYtuV YYVtY}t)8&8&)thlh|YY1G}u?8& t2 )uh<hLϠYY1hh躠YY1_^UVWEjYE18& Q |tI )tAEPKYDžu1<#UE u#UE  WVYY랅uj YE_^UVWEPYƅu18&ffUU*t!U+tU?tUEUu!U?thh襟YY1}U+t]U*uUtVj TYYU*uKVj<YYjYPVYYVVYYjYPVYYj YPVrYYU+uUtVj YYU+uHjWYWV1YYVjCYP YYj3YPWYYj "YPVYY@U?u7VjwYYjYPVYYj YWVYYWV:YY8&8& *t +t ?uhh'YY1_^UVWE=jwYIjhY:jYYƋE%8& ^uj6Yƃ8& j#YƋ8& ]t -u8&8&S;Y8&  ] -8& ]t u j-Y뵋8&JAϋ8& MA9}hhYY1ChY!RY#URY8&?8&8&U\u-8&8&Unu E }tuE u-Yj Y8& ]thhhxCYY18&E{EPjYYƅu1c#UE Oh8hHYY19hh՛YY1!8& uhh谛YY1jYơ8&8&ffUUnu fE Utu fE Ufu fE U u fE Uu fEEPuYU0fU8&PLY^8&8&Uʃ0fU8&PYt%8&8&Uʃ0fUfUfUEP9Yj1YE8&h58&YYDžhh8YY18&fzU~}*t }+t}?uOEuEjkYƅ~8&8&SYOjY8&8&S0Xin_^UU0|U91UVW=D&@&u H&$fUfff5D&_^U=D&@&tD&D&fUfH&UVW=D&@&u H&N=D&D&D&U9} sPEUYf u fUfff_^U VW}@&euVYDžtu+U ЙEU )ЙEUʁfNUʁfN_^UVut@&tuu FP[YY^UVW}t} uhhؗYY1W\thh贗YY1Tt;u WTPVYYƅtwXwTV tӅu1}t U P& P&WRtu WeYYZu WPt,GPPV_YYƅt:VW9YYt(VW YYtfЅu1_^UVWU L&UT&U(X&}u(E }~MU^R&YtU EU L&J(1_^UVWuVYEP&9L&1L& u1L& u1uL&NL& 9t1MWXYE=~u5L&W  t1UL&L&L& tPFP>YYu1L&L& tPFP YYt1L&U=L&uYtU T&<u<k1dU=L&uqYtU X&<u<,1%U t VU=L&FP$Yt =L&VYƅtt1fEU ufRfU u1E=L&FPYEU9U|?UtL&M9uuYtZMUL&1D=hh$覓YY1(0#huBhh|YY1_^U VW15L&UUVYlj4z~U9mG\PuYYtJGt=PuYYu+GhhhxےYY1UDUg5L&_^UVWu@&u16VVʉυu1u z_^U VWEut"} ?tG9uE E׋E_^UVWuKu)UU 9Uw!U 9wU 9u1_^UVutU 9u1^UVWu }M}~9u)щ_^UV1U tFE^UuhJvYYhJ/YUVW}u hJRYYjhJW ƅt&-J@T=W(+Й@91҉@9T=_^UVW} ?t1RYt G κ!MfEGʋUf_^UVW}U  t E  tGG_^U VWEU J\thhYY1U Kjuu 3E UU R(UUIM~U9UsEEUff EU9UsEEUff EufЉU}&u EZ}\u!0|9fЃ0U3}\u\t&u U#UMfE뀋UM ׅm(UUY9}PfUfEUUE}U tEMffEUfEE_^UVW}tu hJYYhJ_Y} uhJYYuh\&vYYuhJh\&Wh\.h\.uYY}tW Y_^UVu~|~}1^UVWu1>tPYtFGF_^UVu>t PYtF 9E uF1^U VWuEPEPuu u2E}t-FUt+F Ut F}0F}~U:t E F0FO}Ut.FE} Ox0FOxU:t E F0F_^UVWuUBEPEPRu u1ǃ}t-FUt+F Ut FGF}Ut.FMx?tGF0FeFu u55NtM}y -F]+F}d|dE0FEU E0FE0F_^UVWUUEPEPuu u0Eu}t-FUt+F Ut FUuUJׅ~U:0uMO}| UB9UMEEF}Ut.FM}~ EEFeF}y -F]+FV}d}}Z}d}}Dž~" E0NEEOڋEv}U:0t0F.F}y E0F9}|EEF9}u.FG9}|BWZ9U|0F.F~.u UuNE_^U VW}U €tEEJRMUvEEJRMUXu uWuu+Mu uWuu4u WuuuWWm6YZE]}Et}Gu>t>etF>euE_^U EPu u EPYU h#UjuYYEUUh#UUV5Nx R^U=tu4YUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWV}ZW Wuu VbZu EPLZWV@Z}F_)ۉ]y!]FEfFuFPYY"}~GEfGuGPYY9nV9Ww 9Wu{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]S` PW kE W!PEP .kE ]S PW kE WpPEP _^U(VW}EEE} tUE UtEffG1҉WWU fE BVEEƉ0 r.UAM.tEUWOUMjGPbYYjEPUYYEPGPYYE0UEPGPYYE}VMN},} t UE Et eEEE EEU(4UUƉ0 SkE 0‰UUUU؁/ }}EEUƉ0 r} tUE UUU}t iE/Eut h#"ut5fG?GujGPYYGHfGuW YY_^U Vu T] UE@fE^fFVEPVR ^UDVW}Eh6E} yE } ~E E h6Eh6EtEfEc|VWYYx -p E=|׃-p Ek] Wð!SW' kE],psVW?YYx -  E]h WYY!VWYYy -! Ek] WpSW Ek]+ۋEW4YE` VWYYy -` Ek] W SW5 E+UEEE}uEUU6vE6fEfEEEU9UU+U~EG}EfEfEEEkE  PEPsQEPWYYx1EPEPQQkE ]S PEP E뿺0UMEfEWEPWl M+fEEPEPh ? fEGZEfWfUfEG-؉WUЃ0MEG-؉UUWEPW U0EWEPYYEPWYY~+tG=|U@GFEPYWY0U0E"}h6fUUU=9?0}h6vMu@ՋU1E}uā}h6vU0E밋Uh6_^UVuEPu u EU RP5D5@=1ۅftu uGEE UJfF5L5Hu uEYYZYUM QRjj.< Fu uvj@+HYYEE 5T5Pu uDYYZYUM QRjj; F^U VuEf~u~u5\5X^6uh\65d5` Vh\6qYYy EUh#"FF-?Pvj @5l5hCYYvj@9YY EU}tuuyFEEuu5t5p<u~u~t h#"uuXZ^UV6U96wU696vh# 16VYt1'6rF56&Y56^UVW}u1E}UUsh# 1=6u8jY=u1V!փ5656FE56OVU}9}r69v2W9UvUW~>}t E6u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=6<9}r79}u+UOJ}t E6URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV# uY_^U VWUUb156t 9ur6E0tU U6tU9ru NJEtU9Wu RWE_^Ui"mNA90"11UU"UVu~  uh#6EPYEU UEPEPVB yE^U VW}Eyt 1}uE VYFu=",2h"h j!YEPYE9Et}u}uEu}u EEE_^Uuu55O7u9u u5517uh#!55u u556y u u>Au uEEuu556y uuAuuEEuuuuAYYuu6u@u u55e6y5555uuuu#AYYuu6u UM u uuu:YY? YYEUuu555~uuRu u555yuu55@YYuu552YYXZU(VWu u55E51ۅÉu uVYYth#!u uu u554yh#"5 5Uu u554~h#"RP!tu u>EE u u55<YY5$5 1YYjj|2 ^Vj3EEu ujj[2 j3EEu uuu?YYE؏Euuuu5,5(;YY>YYuu]1YYuu5450h;YY>YYEEtuu>EEuuuu1;YYEE5"5"uu;YY5"5"0YYuu:YY5"5"0YYuu:YYEE FVu u5"5"uu:YY5"5"t0YYuu:YY5"5"T0YYuuk:YY5"5"40YYu u=YY6YY5<58 0YY RPXZ_^Uuu5D5@_2uh#!5L5H4EPu uuuW6YY EURPuu9YYXZUu uP7EXZUPTUVu u/Y^!ut1^UVWuu uYYth#!u uu u5\5XW1u5d5`u u5l5h(1yu un;EE u u5t5p0~$h#"WjK0u up8YY!EPu u EU u~%h#"RPWj/ 8YY~$5|5xu u7YYEE ׉Rj/u u7YYEE j}55f}$u u554YYEE ׉ډѺu uRj:/3YYEE Wj%/u uJ7YYXZ_^U$u uYYth#!u uu u55]/yh#!_RP9u u55$/uh#"&RP_9u u55.~ u ufEPu u EU RP55.fu u559YY55q9YYEEu u555YY55+YYEERu u559YYZYUMQR555YY55r+YYEEMuuuu2YYZYUMQRQRg5YYEE5#5"uuH5YY5"5"+YYuu(5YY5"5"*YY5 #5#uu4YY5#5#*YYuu4YY5#5 #*YYuu4YY5#5#*YY.1YYuuuu4YY4YYuuW*YYEE uj9,ZYUMQR55N4YYu u*YYEE uu55"4YYu u)YYXZUu ujj+P2YUY[ ZXZUV1u u55 ,uuu55,tJu u5 5+yGEPuub RP55+th#!55u u5$5 +u u ugu u5,5(V+yUEPuu5450`/YY RP5<58+tu uX5EE u uOYYEU RP5D5@*y"u u5EE uu 5EEu u5L5H*~P5T5Pu u.YYuui*y%h#"tgRP4@YRP7u uuu1YYYYEU t u uf4u uXZ^UVu uYYth#!u uCu u5\5X)yu u3EE }t&5d5`u u&YYEE UM UMuu5l5h0YY5t5p&YYZYUMQR5|5x)x55xEPuu EP55uuv0YYc RP55(tރ}tuu553YYEEEPu u EUuuuu55/YYG3YYEE uuu u%YYZYUM QRuu55/YY3YYZYUM QR55'yu u32EE u uu ud/YYEE5`#5\#uuE/YY5X#5T#%YYuu%/YY5P#5L#$YYuu/YY5H#5D#$YYuu.YY5@#5<#$YYuu.YY58#54#$YYuu.YY50#5,#n$YYuu.YY5(#5$#N$YYu uuu_.YYX.YYu u'$YYEE u u u0u uXZ^Uju uv Uu u55W&yu u0EE ju u2 U u uCYYth#!u uGu u55%9u u55%y h#!55u u55%~ u uEPu ui EUUt"M55uu,YYEEEHPuu55"YYo EUE}x>u uuu)YYuu["YY55(YYEEMuuXZU$UUEPjj y U$1UVW5$$}׃}~9r }y 9vWYu_^UVWU :ru1U :wuǃtEPYx Ey1}6H7s >t-6P[YtLY11ۅPtSYY1t!Yjuhhhj YTM 61tYu tYYY_^UVWUzjj|YYEjjnYYEu}YEPY=t 946uuEuj.YYuj"YY6E_^UVWuU VVu YYDžt~~yVډh#F_^U$UUEPjj UVu x~h# 5ju]YYy9uuVYVju5 ^U,2E Pu ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u sh#KV|YE=uh#&UEUUU}׋U UE8t=+UEEE0 YE܋]P3W- }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGuA YEuUUȋUUEEEPj;j. R=Y_^U(VuEEV֋RUV֋RU E '1UUU UEPj7j ^U$EPjj U$EPj*j yUEUMJ1U$UUU UUUE0EPjGj8 U} vh#M E 1U} vh#M ҋE!1UE1UE1U} vh#M Et1U$EPjji y}tUEEU EPu u uuuuEPfUjuuuu uUjuuuu uUVW11}U9#u #F߃| jugYtUrYtURtUzt rY}l#t}#t}#t uY_^UVWuEu41}%<#t4#YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvg EU9Uu1 N _^UV1}*<#t#Bt 4#aYF^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<#t,#R@t#Bt 4#UYGƒ~uFH7FF VVv vv >uNN FFSX_^UVWEE11<#tN|1DFρECEE0-EMP1E E 4+U :t! EE E T*U uuuYYEy@Ut8huYYE~" tuoYuuOYYE}y1]jAYEu u:Y1A!uEUMJUzUBU#E_^UUUuuu < UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPAYY=uEE_^UU Uh#uu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj\YYEUuu huSUSE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]UVWu u5p5l1ۅÉu uYYth#!u utu uEE u u5x5t/~&55|u u=YYEE 1u u55sF55u ufYY55YY55YYu uYY55u uYYYYEE u uu uYYEE5$$5 $uuYY5$5$YYuuYY5$5$YYuuYY5 $5$dYYu uuuuYYnYY5L$5H$uuUYY5D$5@$YYuu5YY5<$58$YYuuYY54$50$YYuuYY5,$5($YYgYYu uYYEE ~u unEE 4T$4P$u usYYEE t u u8u uXZ_^UVW1}y11<#t,|1Fρ(1E E R$U :tE E 0$jYEu1EttEUMJUzUBU#E_^U$UUEPjj; U$U UEPu<YYEPjj U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjjs ^U$UUUUU UEPjjG UHVuUVUVUV UVUЋU UEPY^UVuEP/YjEPja Vp7h75x7h\7jKj ^U$EPj j y}tUEEU$UUUUU UEPjj[ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUPg YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UD!EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UtAJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE$UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE1E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }r~y UVu CV€tu ,fNV~#u>5#Yt.hYFu NLNHF 9hRYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUVuYƋU rU MJwU uRiYY^U$EPufYY1ۅÉU$} uEEUUE UEPjJjM y}tUEEUu hT$u U$UUU UUUEPj6j U}u}uUM UMQ}u} tEjEPEP jEPEP EPEPYYjEPEP U jEPEPs jE PEP UVu EPEPE Ey1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVu EPEP Ey1} u@D1QUJfUE]9~jXYE]fUE-؉U1} u@t^UVW}EP Y}u fEu U UfEu W YEy1fEyډE}teEP YjWEP _^UVW} uyEyE9Et.ut}~ YO9t9}E-UUUU9Uu1!U9Us EEUU_^UVWuE}} #V Vu W YFfF^~.jyYfFFFUAMt7xF*FP YFyFPFP YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPB YFyFPFP2YYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^UVEP Y}u fEu U UfEu EP Y(}tuEPhYjEPEP ^UjEPEP; jEPEP) EPEP YYjEPEPH U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^U VujEPE Pk Uu}u}u E@fEjFPEPp ^UVujEPEP jEPE P EPEPaYYEPEP jEPEP Ey$FEPFP E=3~"EPV FF }E-?PEP1YYE-?PEPYYjVEPv jEPV' jEPEP EPEPYYjFPEP4 ^UE UjEPEP jEPEP EPEPYYjEPEP UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jjYfF?1҉VVF=}jGYfF_^UV}u} tu^UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPdYY_^U}u} tEjEPEPc jEPEPQ EPEP5YYjEPEPp UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPeYNF@fFV9Ww9WLV9WvDW9Vv WWW+VWW+VWWVYt1f#V9Wv VVV+WVV+WVVY_^UEUBUVuFFfFf^U VWu} W WV VuWVWVVYY9}V9Ww 9WuKV9WvCVEPjWV^U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP0YYtFPYNF@fFVY_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWufEU M I JujFY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEP%YU R9VEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JN Wt1fEUtFPYWE`}E=~WE- fEG?t E?t E- ؉ UEEPFPVmYF=}jnYfF1҉VV!F=?|jKYfF?1҉VV_^UVWUBU Z)ۉ߅t'yߋuu FfFWFPYY_^É{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7t$u`=}aa{nZsPsPR[) [)։ZsXsXfR[[׉W1ۇp$tPXPFf-r-cannot open %srecord number %g awk: ILLEGAL PROC (%d)k,6EGPOYcUNSUPPORTED ARITH OPERATOR ! division by zero in "%%"division by zero in "/"divid by 0 f-^7FHOJZ|illegal assign op (%d)division by zero in "%="division by zero in "/="ASSIGN TO NON VARIABLE (%d) @N  2 J N b N  N N N N unknown math function (%d) ?3u[ I    unknown string functionmissing regexpr in match(str, regexpr)[g]sub(PAT, .. ) must be /../ or string (%d)H.01N';'''''''''unknown relative operator (%d) pppE24<J1S#called function is not declaredstack frame overflowu \H?!U-/ d!$%&J*+=-c/;d<=>^|i~SwhilesprintfsprintreturnprintfprintnextinifgetlinefunctionfuncforexitelsedodeletecontinuebreakENDBEGINsystemsubstrsubsplitsrandrandsqrtsinmatchloglengthintindexgsubexpcoscloseatan2+-eE+-"bm"fw"n"r"t"newline in regular expression??-r-%d too many field (%d) .Z--%s%s0c//0000000000)000000)000)0not enough args in printf(%s)%cdefgosux1S1Z11u1|1a1rrwawtoo many files to open2w2w22w2f22can't poen %sawk000%02d.tmp-DT! @RLENGTHRSTARTFNRSUBSEPPIFILENAMENFNR%.6gOFMT ORS OFS RS FS?%d0ARGVARGC%s is doubly definedtry to free non array variablenon array refferencecan't delete non array variable%s is not an array%d %dsplit to non array variable'for (VAR in .)' is not variable (%d)non array variable is specified in 'for (. in var)'+-eE+-.assign to nonvariable (%d) assign to constant (%d) abnormal value (STR|NUM == 0)(%d) %.16gmemory overE/DE9XE=Eargument expected'(' expected8J {IIH  IHHH2tI4tI<#IJtIQHSIstatement expected'[' expected')' expected'(' expected')' expected'(' expected')' expected';' expected'in' or ';' expected')' expected'(' expected')' expected'(' expected'while' expected':' expected'+' or '-' expectedT6dTE~TGJT'*', '/' or '%' expected'GETLINE' expectedillegal '++/--' operatorX(XX@XMXZ $X(WVGX wYpXpXpX6!Y@VMVWXXVidentifier, number, string, argument, regexpr, call or '(' expectednumber or identifier expected after '$'')' expected')' expected',' or ')' expected']' expected',' or ')' expected <-- : in function %s%s: Syntax error at line %dregexp too bigregular expression error: %sNULL argumentregular expression error: %sjunk on endregular expression error: %sunmatched ()regular expression error: %sunmatched ()regular expression error: %stoo many ()regular expression error: %snested *?+regular expression error: %s*+ operand could be emptyregular expression error: %sg e$d(e)e*f+f.d?f[&d\,f^c|einternal disasterregular expression error: %s^$.[()|?+*\trailing \regular expression error: %s?+* follows nothingregular expression error: %sinternal urpregular expression error: %sunmatched []regular expression error: %sinvalid [] rangeregular expression error: %scorrupted programregular expression error: %sNULL parameterregular expression error: %sCn',Z̗0/u7EBEنu;H%|x?*K?*D??Q(?(\ D?U c3>P Jb0@)VDw ~&s@gKA?UUUUUUſ?>*c$>]KEZ0jh<=I jߓi/t>tFMPY}tMF^UEyhuhj}~EPYE]jY5`juhh 5`juhhohhhj1U(VW19u Th\&PYYufǀ$hX&PUYYufǀ$$uP*YYjhTPE j&PP' PPYYy-h@PhDj} fǀ$S$(Ћ,(Ћ0(Љ&((F119u ~;$t&Љ$(P$(S&GF_^UVW$(UJ$(9v=U$(9v"jwv  ~ WVYY̓_^U4VW$(U$(9#UruPd YYjhP jvPk vP Yǃ~=LXt@=Y=HXVPhP PgY=%wVYY=%vHVKY=%vF%4PP,Y=%v 8Ph<8 Uhh$Hux El}y"h Ph$j^Duh$Hub Ey=duh Vhj=HXVPh{ P@Y=%wV2Y=%vQV$Y=%vF%PPY=%v Ph VzYu1Yu(Y=DXtU RVYYY_^U$h`EPuYY=*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"ULEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U|JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE,UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }\*~y UVu CV€tu ,fNV~u>5dYt.hYFu NLNHF 9hRYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvM =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVU9wU9vd 16VYt1'rF5&Y5^UVW}u1E}UUsd 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUh4hrYYjFYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVumYYDžt~~yVډdF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uI UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P{1ۇtPXP!d!!!!!!!!! !!!! is too largedirectory cannot open non-directory cannot stat restorecannot execute mkdirmkdir/usr/bin/mkdirmkdir/bin/mkdircannot fork off mkdir to create cannot stat /...%s is special file. Not backed up. Quitting, disk fullOut of space while copying to %s .Z.Z.Z/%37.37s %37.37s %-37.37s -> %-37.37s write error on read error on %37.37s %37.37s %-37.37s -> %-37.37s .Z.Zcannot create cannot open /.s.o.log.bak.Zcorea.outcannot exec compresscompress/usr/bin/compresscompress/bin/compresstargcannot write on cannot forkfd-ccannot recursively exec backupbackup/usr/bin/backupbackup/bin/backupcannot recursively exec backupbackup/usr/bin/backupbackup/bin/backupcannot fork//zvtsromj-cannot execute shell to ask for new diskette-ish/usr/bin/sh-ish/bin/shcannot fork 4. Type CTRL-D to return to the backup/restore program 3. Mount the new diskette using /etc/mount 2. Physically replace the diskette by the next one. 1. Unmount the diskette using /etc/umount Diskette full. Please do the following: Usage: %s [-djmnorstvz] dir1 dir2 %s: %s%s%s Y @2VX?b$d6i6o-p?u6x?/ #%+-0*!L hl'EGXbcdQefgiQnwoprsux(null)cannot print floating point SSSSBhX  00W1$T$L0su;SSSSu$$ QRP< P:UdVWE ME 0eYE= ~E E}19uE  ]yE1}MEkE4(EkZ€:@u U DG뮉D FwUJօx|5 uD5NEPhaYYE7hMYE 1_^UV5xNx D^U=|t|u(YUU Uhuu> z U$UUEPjjK UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U!EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE ULAJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P? E6U U RU U RUEEEl1 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }|~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv  =uN ?jEPv4 =tN V@FF t V 9ډUVVFt$jjvq =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UW}0ʀuA)_]UV4U94wU494v  16VYt1'4rF54&Y54^UVW}u1E}UUs  1=0u8jY=u1V!փ5054FE58OVU}9}r69v2W9UvUW~>}t E8u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=8<9}r79}u+UOJ}t E8URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV4 uY_^U VWUUb158t 9ur6E0tU U8tU9ru NJEtU9Wu RWE_^UUas U EUhhYYjYU$UUEPjjg y U$1UVW5$$}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uU U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu  USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ(tPXP @ @ @ @@@@@@ @@@ @ @@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @@ @ @ @@ @@ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @@@@@@ @ @ @ @ @ @ @ @ @ @@@ @ @@@ @@ @ @ @ @ @ @@@ @ @ @ @@@@ @ @@@@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @@@@@ @ @ @ @@@@@ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@ @@@@ @@@@@ @@@@ @@@@@ @ @ @ @ @ @ @ @ @ @@@@ @ @ @@@@@@ @ @ @ @ @@@@ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@@ @ @ @@@@ @ @ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@@ @ @ @@@@@ @@@@ @@@@@ @@@@@@ @ @@@@ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@@ @ @ @ @ @ @ @ @ @@@ @ @ @ @@@@@ @ @ @ @@@@@ @@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@ @@ @@@@@ @@@@ @@@@@ @@@@@@ @@@@@@ @@@@ @@@ @ @ @ @@@@@@@ @@@@@ @ @@@@@ @@@@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@@@@@@@ @@@@@ @ @@@@@ @ @ @@@@ @@ @ @@@@@ @ @@@@@ @ @@ @@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @ @ @@ @ @ @ @ @ @ @ @ @ @@@@@@@ @ @@@@@@@ @@@@@ @ @ @@ @@ @ @@ @@ @@ @@ @ @ @@ @@ @ @@ @@ @@ @@ @ @ @ @@ @@ @ @@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@@@ @@ @@ @@ @ @@@ @@@@@ @ @ @@@@@@@@ @@ @@@@@@@@@ @ @ @ @@ @ @ @ @@ @@@ @@ @ @ @ @@ @ @ @ @@ @ @@ @@@@@@@@ @ @@@@ @  @ @ @@ @ @@ @@ @ @ @@ @ @ @ @ @ @@ @ @@ @@ @ @ @@ @ @ @@ @@@@ @@ @@ @ @*@ @@ @ @ @ @@ @@@@@@@@ @@@@@ @ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@ @@@@@ @ @@ @@ @@ @@ @@ @ @ @@ @@@@ @@@@@@@@ @@ @ @@ @ @ @@ @ @ @@ @@@@@@@ @ @ @@@@@@ @@@@@ @ @@@@@ @@@ @ @ @ @ @@ @ @@ @ @ @ @ @ @ @ @@ @@ @@ @ @ @ @@@@@ @ @@@@@@ @@@@@ @@@@@@ @@@@@@@@@@@@@@ @@@@@ @@@@@ @@@@@ @@@ @ @ @ @ @ @@ @ @@@ @ @ @ @ @ @ @@@ @ @@@@@ @ @ @@@@@ @@@@@@ @@@ @ @ @@ @ @@ @ @@@ @ @@@@@ @ @@ @@ @ @@@ @@@ @ @ @ @ @@@@@ @@@@@ @@@ @ @ @@@@@ @@@ @@@@@ @@@@@@@ @@@@@ @ @@@@@ @@@@@ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @ @ @ @ @ @ @ @@ @ @ @ @ @ @ @@ @ @@ @@ @ @ @ @@ @ @@@ @ @@@@@ @@@@@ @ @@@@@@@ @@@@@ @@@@@@@ @@ @@ @ @@@ @ @ @ @ @ @ @ @@@ @ @ @ @ @ @ @@@ @ @ @ @@@@@@@ @@@@@ @@@ @@@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @@ @@ @ @@@ @ @ @@@@@ @ @@ @@@@ @ @@@ @ @ @ @ @ @ @@ @ @ @@@@@@@ @ @ @ @ @ @ @ @ @ @@@@@ @ @@@ @ @@@ @ @ @@@@@@@@ @ @@ @ @@ @ @@@ @@ @@ @ @ @ @ @@@ @ @ @ @@@ @@@ @@ @@ @ @ @@@@@ @@ @@@ %s  q@Xbdiopux #+-0L}hglrE1GXbcde1f1ginoprusAux(null)cannot print floating point @x<L\ l0|@P ` $ p 4 D  T  d ( t8H Xh,x<L\ l0|@SSSSB  pTB1$T$LTsu;SSSSu QRP` P UVW}|}~h hYYjYU r>/uF>uhYjYU zj/W3YYƅt.~u >/uN>/t j/W YYƅt>/uG}~*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEH"uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U1EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UQJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE Po E6U U RU U RUEEEA E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv: =uN ?jEPvd =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv+ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVXU9XwUX9XvD 16VYt1'XrF5X&Y5X^UVW}u1E}UUsD 1=Tu8jY=u1V!փ5T5XFE5\OVU}9}r69v2W9UvUW~>}t E\u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=\<9}r79}u+UOJ}t E\URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15\t 9ur6E0tU U\tU9ru NJEtU9Wu RWE_^UUas U EUhxh^YYj2YU$UUEPjjg y UH1UVW5HH}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډDF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u5 U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇLtPXP%s / Usage: basename string [suffix]  @Xbdiopux #+-0LhlEaGLXbc3deafagLinoprsqux(null)cannot print floating point dSSSSB  9 G1$T$L@99su;SSSSu   QRPX:[/PrUVWd:h:l:p::t:h>1҉׋ p:f}ƅ=l:yl:y l:}Hƅ5l:Yu'9l:up=p:f>u p:p:ft:t:h|:R&l:=h:. h:#}ƅt/5l:x'Yu'9l:uu =h:uh+Yd:=h:h:p:EHƅlxdY\u'=uM=p:f>u p:ft:t:h|:R.=p::p:t:V=l:l:uE+U t:x:x:=FhhkYYv)##h:"x:x:t:x:h|)Yf)wt:t h`*Yt:th\"YBhX"Y2x:hT"Yt:2y"Yt:2qY=s;p:p:ft:t:hx:RU}ohkY1_^U$VW=9}=9u 9=0u 0T9=0u 0l9=:t505:)YYh50 YY: 959 :u=9°1 M}0t =:5 :}2UU 79t#} 4ǁ|U°2 M}2UU05F}2=q}0EUF+UF :59 :5 :=:뵸 { qg]SI?5+!  F |:FyF |:aF |: I|:= :U։9UF+UF :59 5F Y|: F |: FF9WE=*t}t} uF݃}*u%.E=*t}/} uF}uhDh9@iYY5F Y|:*E5F Y|:FUU:t: uFU:"uEE݃}t h(+Y5F(lYEHF8.u UJFFUFUU:0uEU:uMU:t%:\uEEFEEU EӋU5F Y|:+F } @QhaYYF ~~Ph>YYl5Fh'YYU50j5F5FRh41+FJU ::R999 UF9W9YE܋FU}q99֋}:t*F99JЙ)E=:h505:VYYKUF9Nj59FU8: 9J 9Nj59FUfvh9hfYY9J9x99 h9j bYYjVYEHv_^UVW:RU=FO: 9AJ9 9vFh9heYY9J9x99 h9j aYYj9VY9+FE9u}GUEE:zt9:R )JU~ EL}Fh9hMeYY9J9x99 h9j `YYjUY:R 0uRqf 9yQ=D9th9hddYY9J9x99 h9j \`YYjUY놃=9u1uE:BE:BE59:R9: 9AJ:RFE_^U VW=95F959>t°1E}0t =:5 :}2UU 79t#} 4ǁ|U°2 M}2UU05Ff_^U VWu=9Eu0t 5:= :u2UU 79t#u 4Ɓ|U°2 Mu2UU051u@Et1_^U VW59 :     :R99U: :Y Z]R}׋:9zsOPMUY U)΋U)U U :R 9:R9vFh9h bYY9J9x99 h9j ]YYjGRY9u s ~ uF NMU F+U F :59_^U9U : 9::R999s99F9tF9505:JYYbF9Wh9h `YY9J9x99 h9j ^\YYjQYYp9 M9 :EUu5:YY_UU9:tM=:t,9 : : 9J: 9JU: :U:R9:R9F:09 :UVjPYƅuFh9hp_YY9J9x99 h9j [YYjOYU V RYPYF~uFh9hD1_YY9J9x99 h9j ZYYjlOYuV6YY^U:9Uu :UrQYuQYUVuU V FVBVBVVF^U u1Uu~aYP$ YEuuCaYYUVj YE UV^UVW}t U uRw u YD} t}t7hEP^ 7hEP^ EPVF`YYƉ_^U= 9t 5 9PY9 9u juK 9UVW}tVlPY_^UVW}t9ut2~t9u h %Y>y hYvʃ} t)u t"~t9u hYvڃ}t/} t)ut"} t9u hYv_^Uu,U U BU BU fBE 20\YYu RYYUHf11UzG%UOJUW>UfBfGxWRWMRQzMJ3UfBfG2UfBfG!UfBfGB, ifBBD iu RYYU@f11UzGx%UOJUW>UfBfGWRWMRQMJz3UfBfG2UfBfG!UfBfGB\ 'hfBBt h1_^UFFFFUVW}WZY=t Wh =YYW5FYYƅnjjYW#YFFF VhF"YY4~tW{JYVډ*FA FV F<~}F9V|`!Vډh YjgGY~tWJYFFA FV F<~}F9V|XFh YjGY~ tWIYF ^FA FV J F<~ F9V |F $h IYjFY E $f_^UUh uh@ V h h@ h h h hD h h h hD h h V0Uhh yVYYhh hVYYhh WVYYhh FVYYhh 5VYYh@hx $VYYhlh` VYYhhH VYYUVu-FYƅu^Uhh9TYYjcEYUVU U=Ft<L9J F45FVh4h9\Tuuh9U h0h97TYYF^UVW} =Ftg=FtL9J F45FVhxh9SWuh9\U hth9SYYFd=Ft[=FtdL9J F45FVhPh9qSWuh9T hLh9NSYY_^UU URuP4U F FP5F4hh9RFUU URuPT F FP5F4hh9RUVFGFFjTYtjTYt FFhtu uG ƃe@FCG:F1F(Fh$hpSYY hbhu uF L)=Fth'2jEYYeU FUGFG0uj7BY=Ft hRYjBY^UVF=Ft1=GtQ=GtHhhOYYGtVYhh9PYYjAYG9L9jL9 Fh46OYYƅtV]YL9LL9A5F L9Y4h|h9jP j!AYhT9YF^U=Gu 50hHYU0GUh0QYh'2jCYYUVW}?t" ֋Jz u7FCY_^UVUU RAYƅuUVU VF F^UjjYY GjjYYG@jjYYG@UE@ EU5 GY]U0VW} EEyEߍu FDžt FEuYjuYY]}t EEU؋UԉIMԅ~ NU؊ E_^UVW1UUUz~ EEk O~1y1E8uډ_^UVWu}t"E 9t>u U R9VIU R9V~}t>u rh}t>u SIU R9V~U BF~ǍVUU U~UU9u EEO}tuU R9Vu1NUU9~}t>u }t>u U R9V~U R9V~=U N+Jυ`EE8t}t>u B;O΋U R+Vׅ~'EE8t}t>u O1_^Ujju uUVW G9Uu/UMRq֋}~ GuNt1_^UE1ۃ8uCUVWUzDUr}~ ?uGNUrUrUJVZ~ GUE_^U$VWUM I9J~BU BEUM I9J~BU B@EuucYYEUzU RU܋UMQT:UU M QU܃UEEpN9}t-9}}9}}#EMNO9}~EMNMUzU RUEJ}~DEM]M]= ~E- ENOM뮅u }܋UUJWZ~3EME ~E- ENƒ}u uYE_^U$VWUM I9J~BU BEUM I9J~BU BEUM I9J~U BUBEUM I9J~U BUBEuuYYEUMQQUU M QQUEEEEUM9Jt#R+UօVEMU MNU R+Uօ~4EM+E܉Džy EEU MN1UU9~?EM]M)+]܉߅y EEU MF뷋U9Ut>U+Uօ~2EM+E܉Džy EEU MNuAYE_^UVW}E 9uu WyYYƋ[jju WE9Wu YYƋE 05 GeY u WYYƋ EWuYE0_^UVW}E 9tu WYYƋgjju WEEWu HYYƋE 8u105 GY u WYYƋ E6WuYE0_^U8VWuVVUU M IJMMM؋RVUЋU R9V~FU B9E~EU R9V~FU B9E~8U R9V~FU B9E~EU R9V~F U BEЉE̋U+ỦUȋU+UuRHYYE] 9u1]VUUU U܃UUU؋MٍT UE19}w+UBuy1+UBZЉEUJu9}UJZЉEV9Ur"U9UwEM]EEֹ EԙEG뀋UJ9+UBuy1+UBZЉEUJu9}UJZЉEV9Ur"U9UwEM]EEֹ EԙMM EԙEGgUMԈ MuYUERYE0HYt E_^UVW} }uWjuF {}uWuuF aUUUU1JWZ~3EMUU ЙMM E…tU _^UXVWu Yt $U zzzUurYYE]M 9u1]UMQujRE UM9J~EUBUBMPRQE u YUEU RUЋU M QUЍrN}t NuMUMJM؋R+UЉU9U~ U+UUEUMIJMȃQ3YDžuUMIJMȃQjWE UMIJQRGPD U MJMԃQ3YEudU uԃRuD UUu>uFMUU9Uv UBUE$EU9Uv UBUU+UUŰU+UuRYYEujP9D UR2YEu}BѸ E=t*UUUȃWuRWVuuVEU9UvUUԋMكщM UUUU+U9U U9u E %U k U șEU k U U)k U VU9sIMU k U U)k U VU9sME}UURuuVUUԉUUUUEU9Us?UESMY)+MMy E EEUM܈ ME봃}MUUԉUUԃUEEU9U@EMU MM܃ ~ m EEUM܈ ME봃}uU A șMUM EEE] 9u1]uYt EuYuYUEu2YW2Yu1Y1_^UVWu }V6Yt dUV9W~GUVЉEEPYuEPVWcuEPVuAuuW EPY1_^UVW}U zt h<Yu OYƅuU zzt h `YuuY5GJY]yEދUU;EU9W}EGW9}U9W}E GW։ЉE5GYEWYEt5tuEPuu0UuEPRRǀ}t#uuu5G EPYuYUEEPY_^UVWu5 G6>YYDžy1uVtY5 GY5G6YYDžuV@Y5GYzM 9J}E BEEEPYEPYjjYYE@y5GYE[j EPYYrEPYYuEPuuUBuEPuuEPpYE}rEPUYuYEuEPu6nEPuu uEPuu8jjuuDžuEVYuV5Gu EPYEPYEPY_^U(VW}tj UYuhXEP; EP=Y9} ~ j0UYM 19} D5PUYF_^U0VWu>uj-UYVYt j0UY} sVU~:t$VU}~EE0PUYME~Ij.UYEU9V0EE0PUYEEEPVYjEP5GVEP7YEP-YEP#YEPuV u EPYYEPYU JREPYYuYQjEPuujT*YDžu,uhYUW}jEPuu랃}F}t@}URU} $9SUYUujr7W+Y뺃~j.UYE5GYEԋUԋN9JvEPuuXuYEPEPYYEPuu } E$9SUYUuuru/EjEPuudEPYEPYEPYEPY_^UFjF\FOF4G0G$G (G  G,GUVWFUGUFU衸F FkTSYGFRYF19u~-kTEkTGPSFU FF95FNkTGE}}UOEGDGHGPGLF릃}tu)Yu)Y_^UVWFU=8GFUF FPY8GFRYF9u~ 8GF95F~8GF}tW(Yu(Y_^UVWFU=GFUF FPRYGFR=YF9u~ GF95F~GF}tWH(Yu?(Y_^U VWEkTG1}"V<tV4(YVGFD~PtvP]YFP~LtvLGYFL~HtVHUvH'YUVH_^UV=0Gt50GV0GUVq'YE^UVjYƋ0GVU50G^UV=4Gt54GV4GVYV'Y^UVjYuGY4GV54G^UVjYƋU4GV54G^UVW}54Gt ~vO~hdY1_^UVU 8G4uj%YU 8GVY^U(VWU GUu1j YU GEEUBUBEUu"jY]EEUfB#U U؋U E UB9E}!MTEڋUB9Efj@9YNjUJtE}'F1}5 GYFE8UB@UfB늋E8UIMiT؉U<Lj@YUU<}~1}F1}5 GYFU<녋U_^U VW}~/uYDžWY4G2YE4G2YtK^UVWjYj4G2XYƅxu,4G2YuU F4hNYYVuYYDžt 7Y_^UV=$G~ $G{h8ZYk=(G~ (GZh 9YM= G~ G} ~1}*U JR4YYF1}PoYFWY_^UVW}E8~48GUa 8GRuYuYAߋG4t2N ~u>tBP23YY6FYV?YURUj_^U$VWEkE TGpLu6YE=:4}0uH>~C>jYE8GP4GE54GY8GM }1v>m4G2YjWYYE6YډU9}uGRU GUU GUBEE:>yڋ F4hLFYY F4h$-YY}uhYEvt hY_^UjjYYƁ}PY!ʁɀQYPYU:,uEU::tEPlYj:bYEEPMYUP@YUP.YHGEEPYEP~YE=}uYhUʁɀQYUPYC<5UU/3UPYU3EW_^ULGht#Yh\YUVuV UFFUkTGUU^U,VWFFFEPY=Fth_jYYLGkFTGF9PD[ =FN hF>YE- hF+YƀthFYVY돋4G2"Y1ۅÈ,GmhFYEhFYE}Jt&}Bu =,Gu}Z.=,G!kFTGPHUUU@EUUIM~UUUMFhF/YǀthFYkTG8uF4hYYtWhFYYkTGPPU؃}tE0YU؋RU5F Y5FY5$GY=FF4G2$Y=Fu $GU 0GU} uhFrYuhvm YYhFYƀthFYVRYohFYƀthFYV8Y7hFYE="v}\t EPYhFlYE}"uAMj Yj {Yj qYjgYj ]Yj\SYyEx.=Fhl9?Y=FtJkFTGpPYkFTGpLYFF2hY"hFYƀthFtYV`Y4G2}Y,G,GSY4Gh '5(G26 }Wuj 9Yj>Y=Fhl90YvhFY4Gzu94Gzt+4Gzu4Gr54GYY4G 4G IJQ54GYY4Gr54GYY5 G54GYYh:Y5$GhmYY,hFYƀthFYVYQj YhFYƀthFYVYhFxYƀthFcYVY4GR25 G" hFYƀthFYV+Y{hFYE="t EPY؀=FFhl9Y6jY&4GUԋ4GR 4G4GRMԉ 5 GY5GY4G2fY,G,GS Yj$Y4GR2-Yu4G2Yu1,Gd,GP YPjY@4GR2Yt4G2Yu1,G,GP/ YjjY4G 4GIEP21 u YEPAYjY4G 4GIEP21 ojuYEPYQjYA4G 4GI5 GEP21ucYEPYjqY4G 4GI5 GEP21u"uYEP>YhYjY4G2YthY]4G 4GI5 GEP214/uYEPYjY4G 4GI5 GEP214GR2qYt4G2Yt h8YuYEP,YjY}4G 4GI21YY1ۅÈ,GR,GPzY>jY.4G 4GI21YY1ۅÈ,G,GP+YjfY4G 4GI21PYY1=uC,G,GPYjY4G 4GI21YY1ۅÈ,Gb,GPYNjY>4G 4GI21YY1=uC,G,GP8YjsY4G 4GI21]YY1ۅÈ,G,GPYEPh&YYE%=FtGkFTGpPYkFTGpLYFF밃=4Gt,=Ft"h'2jYY=LGt hhY_^UhF^YUT9JT9xh9h9SX hT9YE}\dT9JT9xh9h9SX hT9YE} u/T9JT9xh9h9SX hT9YEE-0= sE-0zE=A|E=FESE=a|E=fE/}.t }+t}-uEE=  :UVWu} EP)YEPYEPY5 GYEEWEP YYֈE} uֈE}+uֈE}-u EֈEE=}2MMֈE]}]9|JUEPEPYYE=VE=}E9|JUjEPuuEPEPVYYEPuu\ ֈE뛀}.ֈE]9|JUEP>YEP4Y5GYE5 GYEEE=kjEPuuEPEPYYEPuu jEPuuEֈE]}]9|JUuEPuuEPuu^ }tEPu5 G uYEP@YEP6YEP,Y_^UVWU RMUE1EPYE}.t}:tEEP|YE}.u#EPgYE}:tGEPSYEuEYE}}u5 GYuYE}u5GYuYEE= ~4EPYEPEPYYuYuYEk}uWj6YYEƃFWuYYEƃ}:t+}.tE= ~ FMFuNYEu(Y_^U54G蔿Y}t5G5Y4G5 GY4GUV589Nx PG^U=<9t<9uHYUV:U9:wU:9:vD9 16V,Yt1':rF5:&Y5:^UVW}u1E}UUsD9 1=:u8jY=u1V!փ5:5:FE5:OVU}9}r69v2W9UvUW~>}t E:u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=:<9}r79}u+UOJ}t E:URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15:t 9ur6E0tU U:tU9ru NJEtU9Wu RWE_^UVu~  uD96EPYEU UEPEPV yE^U$UUEPjj y U91UVW599}׃}~9r }y 9vWYu_^UVW=P9aU9L9} L9M :-uL9zu L9M hh4YYuL9L9M P9ǣG:tWu YYƅ}=H9t=E h90 YYh9hP YYh9Wi YYh9j [ YYL9M P9P9:uL9P9? F>:L9M P9C;t!A L9M P9CGL9U9L9|W=H9t=E h90 YYh9h, YYh9W YYh9j YYP9?`L9A L9M GP97L9M P9P9:uP9L9G_^UVWuU VVuI YYDžt~~yVډD9F_^U$UUU UUUEEPjGj U} vD9M E 1U} vD9M ҋE!1UE1UE1U} vD9M Et1UVW11}U99u 9F߃| jugYtUr YtURtUzt rY}T9t}l9t}9t uY_^UVWuEu41}%<9t49YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<9t9Bt 49aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hOYF~uN NF 1}9<9t,9R@t9Bt 49}YGƒ~uF :FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }<9|~y UVu CV€tu ,fNV~l9u>5p9dYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv, =tN V@FF t V 9ډUVVFt$jjvM =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<9tN|1DFρECEE0-EMP1E E lsU :t! EE E JU uuuYYEy@Ut8hu]YYE~" tu#YuuYYE}y1]jYEu uY1A!uEUMJUzUBU9E_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UU Uhl9uuf UUURu hu?UUURuu uUuuu  UEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huWoUSE] ![]USE] ![]USE] ![]UVW}u M UW}E Mr/u'uĉ fE_] UW}0))ϊE tu1_]XG_]~ UVW E_^] U$UUEPjjs U$UUEPjjS U$U UEPu YYEPjj% U$EPubYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjjk ^U$UUUUU UEPjj? UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj VH:@:5P:h4:jKj ^Uu hT$uA U$UUUUU UEPjjo UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U%EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U4EJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEET5E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPTYY=u}t UډJxUʋFF Vu YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuIYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh9YYjJYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j3 U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ9tPXP!M<]==>`-<K^nx4bx B (Tdl   H u  ( v  #  X .\2)Chyacc stack overflowcomparison in subscriptcIread functioncScRcLd%d:i%d:l%d:M%d:A%d:DL%d:xd%d:l%d:i%d:l%d:DM%d:L%d:DA%d:L%d:C%d:C%d,%s::K10l%d:L%d:n^-+>}<{#=!! operatorB%d:0J%d:N%d:1N%d:B%d:|| operatorDZ%d:p1N%d:DZ%d:p&& operators%d:S%d:%ccomparison in assignmentl%d:DL%d:comparison in return expresion0Missing expression in for statementK%d:comparison in argumentK%d:comparison in argument0R]F%d,%s.%s[J%d:N%1d:else clause in if statementPOprint statementJ%1d:N%1d:Z%1d:N%1d:N%1d:Z%1d:J%1d:N%1d:pJ%1d:N%1d:J%1d:N%1d:Comparison in third for expressionN%1d:B%1d:J%1d:1pN%1d:N%1d:Comparison in first for expressionR0RhJ%1d:Continue outside a forContinue statementJ%1d:Break outside a for/whilewpWcomparison in expressionbc 1.02 (Mar 3, 92) Copyright (C) 1991, 1992 Free Software Foundation, Inc.%s syntax error$) !+5?IS]gq{Oj"!fatal flex scanner internal error--no action foundillegal character: %sillegal character: \%3dillegal character: ^%cNUL character in string.EOF encountered in a comment. read() in flex scanner failedfatal error - scanner input buffer overflowfatal flex scanner internal error--end of buffer missedflex scanner push-back overflow"![!!unexpected last match in input()out of dynamic memory in yy_create_buffer()out of dynamic memory in yy_create_buffer()%d%d,variable in both parameter and auto listsduplicate auto variable namesArray parameterduplicate parameter names@i %s@r w)4)E)V)*(((m***;*L**)))p,+/++Too many variablesToo many functionsToo many array variablesmultiple letter name - %s Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. along with this program. If not, write to the Free Software You should have received a copy of the GNU General Public License GNU General Public License for more details. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the but WITHOUT ANY WARRANTY; without even the implied warranty of This program is distributed in the hope that it will be useful, (at your option) any later version. the Free Software Foundation; either version 2 of the License , or it under the terms of the GNU General Public License as published by This program is free software; you can redistribute it and/or modify %s%s%s%s%s%s%s%s%s%s%sbc 1.02 (Mar 3, 92) Copyright (C) 1991, 1992 Free Software Foundation, Inc. %s%s Number of vars = %ld multiply digits = %ld MAX code = %ld MAX Exponent = %ld BC_STRING_MAX = %d BC_SCALE_MAX = %d BC_DIM_MAX = %ld BC_BASE_MAX = %d Fatal error: Out of memory for malloc. %s %d: (standard_in) %s %d: (Warning) (standard_in) %s %d: (standard_in)Runtime error (func=%s, adr=%d): %s Runtime warning (func=%s, adr=%d): %s X0c 0i0l0s00v90w'0 lcisvwbc 1.02 (Mar 3, 92) Copyright (C) 1991, 1992 Free Software Foundation, Inc.%s lcisvwFile %s is unavailable. rMath Library unavailable. r/usr/lib/libmath.b (interrupt) use quit to exit. :u:::^; ;.;>;exponent too large in raisenon-zero scale in exponent%ld(main)Stack error.RoQQQRQDRRscale too large, set to %dobase too large, set to %dobase too small, set to 2ibase too large, set to 16ibase too small, set to 2negative scale, set to 0negative obase, set to 2negative ibase, set to 2Array %s subscript out of bounds.TSSSArray %s subscript out of bounds.9UTTUscale can not be negative in -- obase too small in --ibase too small in --Array %s subscript out of bounds.iVV'VHVScale too big in ++obase too big in ++ibase too big in ++Array %s subscript out of bounds.Parameter number mismatchParameter number mismatchParameter type mismatch, parameter %s.Parameter type mismatch parameter %s.Function too big._im_rt__ _"\@{_A_B]CV^Fl]J]K^L_M_N\S_Z]]/^c^d_i_l_s_Program too big. interrupted execution 9c\cbcfcncrctcp`I ep`p` ep`p`p`p`p`e|el!\gl2kligllli}hlhlvi{ggllllllllllkj"lll``amblllllabbcl9cdlcNddlldll`lllZjlllldelllf'fll_flflfllflllf:gllk htlInterruption completed. bad instruction: inst=%cdivide by zeroModulo by zeroDivide by zeroSquare root of a negative numberReturn from main program.Function %s not defined.: option requires an argument -- : illegal option -- --3a rw v+WbM Q@Xbxdiopux t#y+o-j0~uL]hGlR{EGXgbgcdefginˋogpgrUs!ugxg(null)cannot print floating point \:@(#)yaccpar 1.8 (Berkeley) 01/20/90         S#^_a'`VQ GIEW[+(T&U]X!YZ >*8@."%0:/561 OqlmIJ !:"#;02X6Ye^_: [T %[B32^[$(TR0ZYGD%3[6.8 ;<=?1Nl}RBD1E h4B@4A\7 97 9-$(4-B(&C7D9*F(.)/1\Bi34+=5L= PBRkB? ,?vUho) ]g , &-4f;C<2Dw3A$A,x@A),>wB)[ -4444447>94E444444444444444444  |  ,9, % )9>?)  V  \\\\`\```L L`L\\GRRRR ``RL\} F`FRRL\F\\\OOOO@\AZ@AROFn@A \\@AOFBPPPPBr@\APBMOMMM\\\jB\\\\NMNNN```\P````NLLLBK`KLHtH@MALPKJJHRRRNRRJM\R\\\Ku@HANBFFF@AJF\\\FK\\HOOO<\O\O>J?<=B>O?B<=>?<=>?PPPPP<=>P?MMMMNNNMNNKKKHHH<=>?JKJHJ'\\\\\\<=>?<=78>?HKMNQSTW`abcdpsyz{K~WKpp(;,^+--;);),;,;;;(;)( ; ;;((([((-;;,(;()((,;(^(^);,,,))(})[[-;}[};)}9}}[{,F{;)][);)(])))-);[);))\{v+-(-;}{}(}-^{(-}(-{   {(-]    (-   (-       (-     ])+,-);+,- ),;;]^) +,-]^;]} )},]^});+,-)+,-+;-)+-};])+- ]^+-]}^)+,-^)+}-;^)}+,-]^   );+,-]   ;^), )),+]-};),;] ;})+,-])+]-}^+-] } }^ } ^ ^            ()./1346>?@ABPR^_egiv(&!&&&%&################&!$%"%% ####################%%################### ########## #### ## # #####  !"#$%&'()*+,-./$0$1$234*)).4=2~($xBHLx|uuzquuwv4}kjrPTXivblo__]if[_XgU]TUZZ[U]MLZJKWZUKSL?B>/-5o8     !"#$%& ' ..?1/7@,,/J0,253HK553545A`)BMIC5MPN23PQM3a4/MNP/0PQ**~}|{zyxwvutsrqponmlkjihgfPMedcb_^]\[ZYXWVUTSR3O+(LGFED>=<;:98,6)),-,+)(  &%& G /% /2/3322M3G3OMMPOO~P}P{zxwutqponlihgedcba`_^]\[ZYXVUTSRQNKJIHFEDCBA?>=<;:9840*('$#"! 0123456789ABCDEFSSSSBT9l99G  K1$T$LPsu;SSSSu44 QRP  P*UVW} EEj/7 YY(t($j\7 YY(t((}^W:-uVB8E@1҉U835(hLh= jtYWBF9u }o9u ET>hH4zYYEu%45(h4hjYFEEuYEUR}t EPYj YE}_~}alJlxMhlEP=YYlJlx#hljYY=8t <E0}t EPHYMME}EPYj YjY_^UVU lJlx hlj ]YY=D=DtDJЀ, u D݃=Du195D~>lJlx,SZhl,PYYF뺋lJlx hlj YY1҉D<@lJlxUUhlP^YY=8m=D|+h5@5(hhhjVY=<t- DA Dӈ,<^UV5HNx , ^U=LtLuYUVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }L~y UVu CV€tu ,fNV~lu>5p Yt.h8YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjv =uN ?jEPvH =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuuYYEy@Ut8huYYE~" tuYuucYYE}y1]j-YEu uY1A!uEUMJUzUBUE_^UUUuuu  UW}0OE uG_]1_]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu) YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu( YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uR YEU UV֋RUUUEPut YYU UEPjj ^U$UUUUU UEPjjo Uu hT$uU U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U ? }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEz uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U, EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U\JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PcE6U U RU U RUEEE|E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPnYY=t6JxEEFFEEVP8YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu-YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MUUas U EUhhbYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPULL%s: can't open %s r%s usage: [-] [-U] [file] %s: underline for line %d > %d characters + a rw n +O bE  e@Xbdiopux #+-~0Lqh[lfE%GX{b{cde%f%gino{p{ris5u{x{(null)cannot print floating point $SSSSBTl   @\H1$T$L\su;SSSSu|| QRPh PUVWEE9}wU :-hBu WZY4F>-u~tN>uE>t-EEhdh'YYjCYF}t 9}~SU j=4YYt@U 4DYt-5YU P4hDhjYG9}M5>t;6Y=u'5YPh8hh jY1WU 4U}tEuVYYURiYPVhh}u~_^UV5Nx p^U=tupYUVux95H<^UVW|2}u1r|:u ]j=uYYEcJ>@UUU:tEG9tU:u?=tȋU=U1U=|2=kEt Eu E@k P+Yƅu U|:2u|2E u4@k |P2YYƅu.|2J]1_^UUUuuu , UVW}E?t:JxG^FSX GVP_YY=u}t Edu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=d<9}r79}u+UOJ}t EdURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVT uY_^U VWUUb15dt 9ur6E0tU UdtU9ru NJEtU9Wu RWE_^U$UUEPjjg y UL1UVW5LL}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U4VWEj/uYYuh  YƅuV YPu YZEЃeuYE=u}؀>t >:tFG9}s/GuWX YYEPubYY=t4|2u u =t Ũ}t} uFuURKYỦ_^U$u YEUUU UEPjjT UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE,uVuu+ ƀ}Xu9utUPO YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UtEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuETUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.h(YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv8 =tN V@FF t V 9ډUVVFt$jjvu =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MCUVWqE_^]vUVW|Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UUas U EUh\hJYYjfYULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE02YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U$EPuFYY1ۅÉU$UUU UUUEPjj{ yEUu hT$uy U$UUUUU UEPjj+ UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UW}0ʀuA)_]U$UUU UUUEPj6j KI|;u[u P1ۇTtPXPaienv: Can't execute %s: %s env: %s env: Setting '%s' failed: %s Usage: env [-ia] [name=value] ... [utility [argument ...]] unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such !"deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH  @  X b d i o p u x  # + - 0 L h l EmGXXbc?demfmgXin'oprs}ux(null)cannot print floating point lSSSSBUnknown errort`PD xdP<(lXD(,,,,,,,,,,xdT@,C  0p0G1$T$L su;SSSSu QRP PnUVW}5!YoU rYƋU r8YE}u}  VWYY6V6Y-U rYE}~ uVYY VuYY1_^UVW}~'~ 5Yd}WhYY WhYY }VA444htRR5hYjVW_ BjRWP jFPWA jYzh|Y_^UVWu }~'~ 5Y~ ~ 5Y5W4hjVW jYhY_^U,VWE}d19}Ok~k]UE}}EEԍUU EEEPhVL G먁dv ~ uNhdhYYEj_^U VWu uYYE}E}ikE~k]kM FuuYYDž  F F, }  FW0 0F0EEt_^UuhhD  jYUu uYYuuYYUVW} ~ ~=u#Y6*UBRY+Mu u9}<+) F_^UVkEE +@ƅ~95}1=u= u |F ^UVW}GWƁ~,dЙ)؉ƉAЙƁ~_^UVuj jVC ^UV5Nx ^U=tuYUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUUuuu ( UU Uh,uu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huz U$UUEPjjK UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U $}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE<uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U-EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UMJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEdUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P? E6U U RU U RUEEE= E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~,u>50Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv  =uN ?jEPv4 =tN V@FF t V 9ډUVVFt$jjvq =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UW}0ʀuA)_]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhlhDYYj YU$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u5 U$UUUUU UEPjj' UVWuEu41}%<\t4\YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<\t\Bt 4\aYF^USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPBad argument Usage: cal [month] year S M Tu W Th F SDecNovOctSepAugJulJunMayAprMarFebJan??? %s %s %s %12s%23s%23s %35d 00%2d %9s%5d %s %s %s %s%[   ] @ X b d i o p u x  # +{ -v 0 Li hS l^ EGXs bs c d efgi n os ps ras- us xs (null)cannot print floating point 0xtplhd`\XTPLHSSSSB,D *, ((((( AAAAAABBBBBB 0  H U1$T$L su;SSSSu QRP P&UVWu M}~9:-u/>G?uh\W-YYu뾃=tMjhL-YYu </jh0,YYu $hhYYV  jcY_^U VW=uhh YYhh)YYEuhhYYuhh' 1>t> t >:uGFthht^YYh`jhtYYPhlh+jh+YYt=thYXjh!YYPhYY8u$Y_^UVWu19} ~>t >:uGF1E >t>:t}FUEGU _^U:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP?>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW0%YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFh$VW ƅu1MWW$YZ׀>/u0Fuh$VEP ƅu1EEGu>t1_^UVWuE}>:tVh$$YY_U  $U4 V#Y=Vh$#YYVh wYYƅ>-uF>+uFjVEP ƅUUj h 5# 1 Vh YYƅpj h 5X#  >t>,tjVEP ƅt5U>t'>,u"FV"Y=xwVh YYƅu_^Uh #YPLY UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE$E=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fyt-PYtY11ۅPtYY1tYjuhhhjYTM 1t>Yu t YY_^UVWUzjj|YYEjjnYYEuYEPGY=t 94uuEuj.YYuj"YYE_^UVW}uhY1zUdhtplh(YEPjAYYu10=t|hY1`tRYDžuhY1UdhW\phYEPjYYu1GPGQGTGX]VN Y8|>uNOP>u GQ@GQUPEEt2>u"FP4Y9EwVUFPYEV YʋUWTUWX_^UVWE }t8=h |hDcY1UhUhRWY E1EP*Yƅu1t VWYYUuE #UE d:|uCdEPYƅu1VWYYUuE #UE 벃}t U1PYEPWUYYtuVYYV Y}tdd8)th4AY16}u.d:t#:)uh$Y1h Y1_^UVWEjYE1d:K:|tF:)tAEPKYDžu1<#UE u#UE  WVfYY릅uj YE_^UVWEPYƅu1d M}*t}+t}?tUE|Uu}?th\Y1\}+t]}*uUtVj VYY}*uKVjAYYjYPVYYVVYYjYPVuYYj YPVdYY}+uUtVj YY}+uHjqYWV)YYVj]YPYYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWV YYdd:*t :+t:?uhPY1_^UVWEjYjYjYNjEqd:^ujeYd jSYNjd:]t:-uddPfYd::]:-gd:]t:u j-*Y‹dJA΋d MA9}h@Y19u| VYFdxddPY^jYd:]th0XY1`dEMEPjYYDžu15#UE !h  Y1h Y1d:uhY1jYǡddPYjYE dh5dYYƅhxY1d M~}*t }+t}?uNEuEjGYDž~ddPfYNj[Yddx*_^UVW=plu tMFFF5p_^U=pltppMtUVW=plu t>=pppU9} sOPMUY u MFFF_^U VW}lt@uVEYDžt>u +U UU )UUˆFUڈ^_^UVutlt>uu FPYY^UVW}t} uhhY1\thTxY1Tt9u WTPV[YYƅtwXwTV tFՅu1~}t U | |Qt u WXYYPu Pt*GPPVYYƅt2VW1YYt FVWYYt Fu1_^UVWU xUU(}u(E }~MU]R&YtU EU xJ(1_^UVWu46789:;<=>?@ABVFYEo|9xj1xx:T1bx:u1Px0x9t1)W YE=~u5xW t1Uxxx:tPFPG YYu1xx:tPFP YYt1xr-E=xuYtU <u<M1F-E=xuzYtU <u< 1U:t VU=xFP0Yt =xVtYƅt>t1EU:uJM> u1E=xFPYEU9U|;}tx]9uuYtLMUx181h8Y1"x%ueh$zY1_^U VW15xUUnV YljjU9YGF>tPPu YYt>GF>t5Pu YYu#GFhpY1UL\$5x_^UVWulu1*VNu1>u _^U$UUEPjjK UVu x~ 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0, YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0> YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WA }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E #!UUU UEPj7jb ^U$EPjjI U$EPj*j1 yUEUMJ1U$EPjj y}tUEEUVW11}U9H u H F߃| jugYtUrYtURtUzt r Y} t} t}0 t u Y_^UVWuEu41}%uNN FFSX_^UVWEE11tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVu~  u 6EPYEU UEPEPV2 yE^UVW}?tu 9t>tF>uGމ+U_^U$UUEPjjG y U 1UVW5  }׃}~9r }y 9vWYu_^UVW1}y11*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U s }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4 uVuu+ ƀ}Xu9utUP{ YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U| EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P#E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu })~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv! =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhdh0 YYj蒿YUVu|YƋU rU MJwU uR1YY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPoYjEPju V5hjKj ^Uu hT$u U$UUU UUUEPj6j U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P71ۇ tPXP/usr/bin/mailcannot find %s/bin/mail/bin/mail/usr/bin/mail/usr/bin/mailrcalendar%s/%sillegal '/etc/passwd' format: %s/etc/passwdcannot open %sr/etc/passwdcalendar%02d%02d%02dcannot stat %s%02d%02d%02dcannot popen %sw%s %scannot open %srtoo many date expressions(^|[ (,;])(((%s[^ ]*[ ])|0*%d/|\*/)(0*%d|\*))([^0123456789]|$)[Dd]ec[Nn]ov[Oo]ct[Ss]ep[Aa]ug[Jj]ul[Jj]un[Mm]ay[Aa]pr[Mm]ar[Ff]eb[Jj]anREGULAR EXPRESSION ERROR (%s) %s: SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ-csh/bin/shout of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be empty_ $x()*+.?[\^i|internal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parameterW"'P" & !s"C s"!!W"W"W"W"W"W"W"W"W"!!!!!!!!!W"B!B!B!B!B!B!B!B!B!corrupted pointersmemory corruption #""" # #"internal foulupa&:&a&:&a&:&G&G&G&g+aT+r/+w>++++b+D5a65r.5w<55+h5b^5: 9@9;X:b:d:i:o:p:u:x:; ;#;+;-;0;>L<h<l<<Ei>GT>X=b=c;>d=ei>fi>gT>i=n#=o=p=r>sy=u=x=(null)cannot print floating point GMTGDTU U `XPD80$th SSSSB  0   ph f1$T$Lhsu;SSSSu QRPl& PvUVW} }|&W:-uzuuWzuh9ujjYY9u:-uzujjYYuj4YYEyKh Y4YhY5YPYhYjuYYuYFW _^UVWhhlue ƅy=hu=lu$uVhlu , 9t럺l&+9'Vhl5 gWhl5 hhlu  =td)VlPhl l_^U=lt#-lPhlj[ Uh YjYUV5Nx t&^U=tuYUVux95$^UVu>tF+URuj ^UVW5YNj5hYhY}t.U:t&uYPuVd jh8VT WkYPWVB jh4V2 _^SkUVW}u M U$UUEPjjG U$UUEPjj' U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjk UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$UUU UUUEPjj yEUSE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu } : cat: cannot open catunknown error : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0p&lSSSSUnknown errordT<0|dTH4$|lTD8(tXD8 tdP<CB  A,1$T$Lsu;SSSSu QRP PN UlVWEE ` h R] YX p RF Y\ ME }t(E :-uzcuR YEME ҃}thXhL(YYj YE UU RUhTu'YY uuhDhLn( je Yh@u&YY uuh0hL9( j0 Yuh(P^( h$P.YYEuuh hL' j YuhP$ ƅuYt#uhhL'j YuhP' hPYYEuuhhLI' j@ YuhP $ ƅuQYt#uhhL&jYuuhh 'hh YY u uuhphL&jY EPr'YYEPKYPPuh\& EPrd'YYEPYPPuhHO&D 5 hh " $ -0= sh Y -0= sF>,uFVtY -0= sF  >at%>dt >ctVh0hLy% jpYMFVY -0= sF>,uFVY$ -0= sF $ > t > tVhhL% jYUUĀ}au  E}du  E  +U( U , =(  (  +U0 U$ 4 =0  0 ( J9D }D=D x( @ 0 H 1҉T P 1҉l d 8 B( < B0 =( 9= WYuJ , [%Yd 9h w!h h R5X YYX 9= X d uR$YYP X d hR$YYX d R$YYd G 8 , D =0 9=$ WYuJ$ 4 R$Yl 9p w!p p R5\ YY\ 9= \ l uR#YYT \ l hR#YY\ l R#YYl G$ < 4 L =D xN5 YtjYʉt u_^U VW8 B95D V,YDžuJD W"YEd 9h w!h h R5X YYX X d hRx"YYX d WR`"YYUd FV< B95L VYDžuJL W9"YEl 9p w!p p R5\ YY\ \ l hR!YY\ l WR!YYUl FVh* YD 9@ |5D h YY5D 5@ h =P t5X hYYd X L 9H |5L hYY5L 5H ht =T t5\ hplYYl \ _^U5 hh  tU9uӸ 1U5 hh  tU9uӸ 1UVuYƅu 5` hhL jY^UVuu VYYƅu 5` hhLX jOY^UVuj jV ^UuIYP YUV5Nx t ^U=tuYUVW un!Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV@ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPm/>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h(VW ƅu1WWYZ׀>/u5Fuh(VEP ƅu19ut EEG>,t1jFh<VW ƅu1MWW\YZ׀>/u0Fuh<VEP ƅu1EEGu>t1_^UVWuE}>:tVhLYY_(U8 <UL VY=VhLdYYVhwYYƅ>-uF>+uFjVEP ƅUU j h5. 1VhYYƅpj h5 >t>,tjVEP ƅt5U>t'>,u"FVY=xwVhYYƅu_^UhYPLY $UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE(<E=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVWU :ru1U :wuǃtEPYx Ey1}< s >t-< P[YtLY11ۅPtSYY1t!Yjuhhhj YTM < 1tYu tYY_^UVWUNPQRSTUVWXYZzjjYYEjj YYEu%YEPY=t 94< uuEujYYujYY< E_^UVWuU VVum YYDžt~~yVډF_^U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u sKV|YE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W- }׃E뻋EEU9vGuIYEuUUȋUUEEEPj;j. R=Y_^U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjj U$EPj*j yUEUMJ1U$EPjjQ y}tUEEUVW11}U9du dF߃| jugYtUrYtURtUzt rY}t}4t}Lt uY_^UVWuEu41}%uNN FFSX_^UVWEE110u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VW h$VYYURtG9uF>uր?=uэG1_^UVW EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U x7 }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEr uVuu+ ƀ}Xu9utUP? YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEиUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE(E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }B&~y UVu CV€tu ,fNV~4u>58Yt.h YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvw =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhhLYYjYUVu8YƋU rU MJwU uRYY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPwYjEPju V  5 h jKj} ^Uu hT$u U$UUU UUUEPj6j7 U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PG1ۇtPXP - + ! Unparseable input: %s Unparseable input: %s --- %s crc=%s %s*** %s crc=%s %sCan't execute diff %s %s rdiff %s %s 2>/dev/nullcrc %s returned bad status %d Can't execute crc %s rcrc %scrc %s returned bad status %d Can't execute crc %s rcrc %sCan't open %s rCan't open %s rUsage: cdiff old new %s--- %d,%d ---- --- %d ---- %s*** %d,%d **** *** %d **** *************** %s: out of memory %s: out of memory SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ-csh/bin/sh#b##b##b#o#o#o#(a|(rW(wf((+(b(??? ??? ?? ??:??:?? ???? /a/r/w//+/b/Y3 2@23V4X?4b$4d64i64o-4p?4u64x?4/5 5#%5+5-50*5!8L 6h5l5'6E7G7X7b7c7dQ7e7f7g7iQ7nw6o7p7r8s6u7x7(null)cannot print floating point  GMTGDTU U 80(|tl`XL@ SSSSB4L ((((( AAAAAABBBBBB   Pm41$T$L`su;SSSSu\ \ QRP P^UVWu `UEE8t]Ej3YY`UE8t]E3 YP$YQXhh Yth 9uh 5t YY5t Yh] Yxh 9uh5x YY5x Yj`PYYPh YPn YYh Yph 9uh 5pB YY5pH Yh Y`&h 9uh5`& YYh| YHh 9uhx5H YY`u-ht5H YYHB %HB hp9 YDh 9uhl5Dy YYEdVEUM}:-4z*>G?$HB %HB DB %DB hh5H YYhd5D YYEM}@UURh@tVOYdhOY` zet^UuY` znu<=Xuj=| tj5| fXYYOt x UV}t QGj;Yƅu= t.hp Vb5 | 1^UVW5 t/= Vhp bV YO9=  WXY_^UVWu} >tFWPYYt1_^UVWu }>tF9u1_^UVujVYY^UVW}E} y yE߾N 10N1M } مuՃ}tN-_^UUHhdVh@HYYUh jTYY =Xt=$t*hMY\=l t|VUVua|z~A|Z~_u1^UVu0| 91^UVuVYu VYt1^UVu Yƅu h5Y^UVWuVYPYƅt!u V9YYEEGu_^UVuVY^UVu5\h VpSYY^UU&Ut.}uU&U@hUh@$YYU VWUPYuUEUPYt }}Uk] Ã0]E9UU h 5TtuvYYtvuYjSYƅt+UR>YFuY~EEt?=tG?u=GjVrYYjvfYYh TVF 5T_^Uju u UVW}G t*w>t>=t FPJYhYE}wWTYPu MTYZP=tFFuF=uU UEEFuUU EG t w5YUWU G EG _^UUB UB UURP YtUB UB UVuPYu1$>=t>tPYu1F^UVW}PYu1e>=t>tPYu1GFWYE} u1FPVu } tUB %UB _^UVuFPYu1>tFPHYu1^UVW} 5TF EjVPYUF tjh WQ F tj hWQ vkY+FPvWQ jhWQ vy_^UVWu} >=t>tG9t1F?t?=u1_^UVu>t>=tF^UVWu} tu1GЉUvF%EXuWjYYDžu1W}u1MN?t WVYYt3Fu1(#U9Ut1EZ1_^UVWu1=!uC]tFUU>u1O׀~-u~]t VUF}9} t 9} |U9U  1}EF>]u}tF1_^UjOYt jOYjOYBUVW}u]LUU5h9V~+>h9W~9=tU9r695u}|EEPOYƃu195tKUω>FG=U9s)9vK:BhVF_^UVut95v5F^UVW=59tU9V|F6_^UVutU V^UUBUVW=59t.h9V~U h9J~ E56_^ULjj >YY1=U VWuYƅ[jG YE=|u@jYDžu>t>tjjVjjWVj뮋U_^U VWjuYƅ]jYE=t }u9jHYDžuEjWV}uPy묋U_^U VWvƅjRY=&ujjVj,j-YE=;t}&t=`tG} uADžu=jY=&ujjWjWVYY똋U_^UVWuY=<t>t =1UUjhDYY5u5   UtV5"CYY_^Uu 0Y9EtUV17jHY-u C5YjY4UU^UV`tW6#FYYuF1_^UVj YFFF FF^UVu=lt5lj51YYlFF>t3>t*~t$jjVjƋV RVV Bj/YF^UV5B1Y^U5u0YYUV5l1Yl^UVjYƋUfE fFUV5lVD0YYl^UhYU=Xt.=x w"`3ujY= uuY5U VW5~  u p Uj2Y= t hVSYYjd2YP2Yu 0 막p p Mj"2Yƅt uV2Ynp p j1Y={j}VYYƅVVYYƅVAYDžtm\|HV@Y:;bdefghijklmnopqrstuvwxyz{|=`uUt/=Xt=x wD28YUd tLV]1Yj0YƅtAhVYYu0d 9p r hVYƉp p V1YhVRYYp p }thgYƅt5hhYY_^UVWu} p p W/Y9mu,Vb0YUEhR7YEPnY,R=Xt u=x wD27Yp p 낉p p 1_^UVW}uFjE/YFEPPYDžu NP/Y_^UVW}j/Yƃ>tu j.Y>u&u =u V3/Y  _^UVuYƅuh 6Y^UUDVW}u14EhA hUURU؅t!E8uPuYY1EaEPuuuu uE}Hd 9EPL6YE$u5YEu5YEUjEPu r "UjuEPr EUjuu r Ujuu rE5Em}tRu!YPhZYPYY} t u 5Y=Xt$uYPm4Yhb4YEum Y%jj";YYjj;YY=Xt jj;YYX} uj.=Yjh q=YYUjuu r Pt:YUjuu r EURU]1Ƀ;uA1}9mjuu uER}u"U܋UyEEE܃E8uUrYE5jEP; t=x&tEPYUR UUIMt3E܃8t+]܃E3uYYjuu uER{5jEP; t=x&tUEPYUR Ujuu u\1ۅËE1Ƀ8 uA9uUjuu r0E뼋RUzjuu r uURjuu r URjuu rEUjrYYEuEUur YYERjuu ulE:}x4UR Ut'juu uAEEEUM؉Jx&5h6Y5h/YUh=Xt= t ?1~\Ut\u,YE_^U VWuUUEEEE>uEEׅuE8` zxttEEPYu0~u*EEׅtjWYYuj2Y~t WKYEUVUU}PEtB}uE7} t u 0Y}ujuqYYPY 1=Xtjjc6YYjjX6YYEX E|}t3EEׅt$jWYYt}uWYP;Y̓} tE j038YYu 0Y}tUjr8YYu/YVUd}t%}:4tW.Yh$YE8t11ۃ}1Ƀ} UESQ2 tϋE}tVUYPgYE }}uT7YE}tjj4YYjj4YY>ujjjv P4YE8ujw4Y]Pu3 NjE0-Yh -YWY=|u &P_^UV6ƅtu hD`Y^UVWu=uVt1f} tu1}t=u1VtEVu#VUjuYYEu V UzuUPCYu&U:-tu,YhYIU:-ufF@F%fFju5YYF%Pvc0YYElju5YYDžxjjW|5 Khu*5YY8U0PS!5YYP4Y1FP?yedUu+YVt v+Yh+Yu+Yhy+Yu2YPi+YhOY9tPW4YYWb4Y1_^UVW}h$+Y1<tt h +Y4+YFh*Y_^UVW}u1bE8u!Uu r YYEtAUz}w>t,jPYYEtuu YYtԍG 1_^UVu uvYYƅt1^UU JUUVWl Ul 1EP3Yǃu=d} #Us0<@tZ9}tW)Yh)Y4@)Y49}tW)Yh)Yh)YV)Yhv)YU€t hc)Ys <@t hI)Y Uʉ9}Ul = t2=Xt} t# =du5djY_^UVu5dVHYPh YPYY^UVWEEuj/YYtp1E}u ?E5p ?t!G=:u1EF95p t/FEUAMU Fuuu 5p ;1 Tp E E E 0p E uu h1 E 0|:l3T,E(dl;=duH8_^U-uEF1PYYt-0k F>tuYh,YU_^UURjrYYUURjrYYUVW}u uRYƅ=t WNuth<=YjU x&jW'YX_^UV|URRօtVYPY^UURjhR' 1UURjhR 1UVu>t->t46Yt6YPU Y6YjuYY^UVuV,YhXNY^UVWURRօu0TU}tUjrVYYURU1>>-1UARMItGF>u1ҋ ` Qv ` Qxc>ZI=XH` eU@4=a|*=z ` EC =etFsURz~MIUR<tURj4GYYG߉JUR5:YPhlsYPYYjRYY1_^UVuP6Yt&VV&YPVu +& jhpu & ^UEP%YEPlYh*YE<ЙPEYh|YEP(YhxYE<ЙPYhtY1UVW}>tW6m%YYuF1_^U VWEEEU5jR# PYE8t,0Yt #U EER]S0n ̋` zkt:UUE8t,0dYt#U ER]S0, Euj YYEE8t8` zkt 0Yu#U ER]S0 EujYYEP2YE=&=&t1E_^UVW15TtF t WvkYYNjvWjZYYWY_^UVuEu EPV; t-}tUJt URօuuY1^UVW&}u1tuh$YYw`&u2YY]Utuh gYYuB5hu,YYEUt u YE 0uYYY] U5jRp! P]YU@hVh@pYYx t uYEg=&Zp 5huuYYEUu$t uUYE 0u YY] 뛋E 0uZYY] &&1_^UVW=p #UUE9=p u1p p U`&2VYYvEx zwx zgujuGYY9Et5t1'thTVYYu΀p p 1uj"YYƻ,+VYVlYuEuj"YYƅtEUt`&2V"YYu)x ztAx zt5hPVYYt$EVYhLVYYtJT}t'=uEEV YuEp p @p p _^UEPYEx z^x zN}'tH}`uu Yu15x B멀}$uu YEu x BEUVWE=p }{rp p M EPYtIEt/]SYt d 9p sԡp p MEPYEx Ux BEx Bjj"YYEt-}}t'} t!d 9p sыp p M 뾋x 9Uu EB}}t#hY&@&].d 9p rhY&@&p p ?t*F>t"hPlYYt MFFـuG?*t?@u==~-=p DhUh@YY11G=p WiYE]U9h PYthY&@&j5hVTYYPQYYVu^YYEUj5hV"YYPYYEv>uhYW)Yj5hVYYPYYPY&@&/EX&}+uj5hVYYPYYE` zut*h 9Uuhx{YWY&@&U@}t9VVPh@ YY1_^U VWt Njp Up p x Ux BEx Bjj'YYDžt(`t#d 9p s܉p p Njx 9Uu EB`thYj|EPwYyjg=uEPzYhYj=tFUp uZYuYH}tWWPh@ YYjp 1'd&tjVYY=t jVYYFjuYYEPY` Be` Bv` BnUp jRYYEh5hY t x u6YXU@hUh@ YY jX_^UVWut>tF%E_^UVW}uE 1}?t=h PYYtF#%h PYYu %G뾅j5hukYYPYY5#YBP\Y1B9uYF݋BhMjPRFJt=1B9~u 4:YYE F5YE u uYPYYE _^UXVWu9u tU z/tM U )RdYljE9u vFG.Gu DYP6YljE>t >/tFGjuYYEyu3Yu*YsƅhPu E=,EEU9U}ƋUUjPP .u U:.E}};Uh P躽YYtU܉ EuPYYdVPu uxE>t1h V&YYu PuYYt uY5uYYEuYuYuY_^UVWulYU +URuZYZPIYljEu9u tFGuFGЄuOuFGЄuE_^UVWu1UB9~ Ph -YYtG1_^UE ]03YYUVW}R衽YƉffF_^UVWu u jYFE9|5PYNjURFPGP EfGVgYV@ufFV_^UVWuu1?Vu VY1,FEPּYuFPW> VY_^UU|&U&UU URuYYUVW&UU +UU9UjUыE1EEEEEuUڋM 9uv8uV|&YYEuUUURVYY҃}y u9}Wu|&YYEuUUUWRYYЃ}~F9uu!UUUWRV UUUWVYYUډωuGUډt9uuGU+UM +M9|UUu RYYUU uuYYUUUUUUVRWI UUU_^UVW&U}u MGMFMu_^UVW&UUU} uUE EFUGMu_^UVW} uMxGFE_^UVW}d 9p v.= tuh膷Y&@&?ƃ't1x zt%\u nƃ u"t WY΀_^Ut 9x r x MJUt 9x rx zu z u1UVt 9x x Rօtx Bx z x x RrYYƅt:u x =x uVYx B x zu4x z t(x B =x uj {Y mx zu>=`t1ҋ x Q F=Xt=x uH2Yx =x r1,^U` zvtjEPj  UVu x x r$x hGY&@&Xx 2Uz t x Qx -k&x Bx urx=x u0$x RBx Rr YuY=x tx Rjjr =t.<B<u <x R <J x B x Bx Bx B dVttXu x B&WtWu x B x B^UV5t Ut ^UVWu>u1Džu  _^UVW}Wօu15>t$Ut E%G G _^UVWuFFׅt.=@V:uVUPh@YY1_^UVWu>u1Džu  _^UVWu>t Džu1_^UVWu>t Džu1 _^U VWuVU~ E19V tC߅uUM9ptjvv] UhRv^ Džy =dtڅv Y1zV EUMMFE%;jEPv Džy =dtu E% vY1_^UVujEPv =t v0 YEE^UVu uYY%= u ^UVW} t' tG HG rGGUuRY= uCG utV YPVj ^UjEPj UjuHYYPYUVu~VY^UV }BVY^UTVW}9= V1} DFDWzYDžx9= 1}|tVGYFy h<=Y_^UVWuVxYDžy h\Y_^UVutPY6Y^U1҉UVW}jwYƅjWYYU VU BF =u5(U}tUz ur UR UU B U fB>?t)t!U B%U fBGҋU B%F_^UVW5t(~t1'VP6R1 v ԅtW _^UDVWEPlY5hEPNYY]hEPhYYERU5|jR P葭YtEPYx x 2qYYx t =Xt=x wD2YE= t0}t*U9r EEPu YYt;}t5 )QPu 9}uhYu YhYȬuY_^U@VW}u ?ju+YYEy "} EPYhEPYYEy U5jR PѫYUHhvWh@YY5x tYjjYYEtM]]Et'EhP;YYujhu jEPu 蛫 EPZYuYjEP YYEEP7YEE_^UV5t~tVzt rYv ^UVW15tkc#ZsXsXfR[[׉1ۇtPXPxcirq-st<#/etc/profile.profile> PS2# $ PS1 IFSPATH$/HOMESHELL-: cannot open-Oi out of string space is read-only readonly export *w?m[UH<>({'Q  9  au}{&&||;;fiuntilelifelsetheninifdonedowhileesaccaseforsyntax error "`#$&z'`(' )' ;z<>^``|z"'`$word too long`$ '" ;&<>()|^ 0123456789no closing command line too complicated TerminatedAlarm clockBad system callMemory faultBus errorKilledFloating exceptionEMT trapAbortTrace/BPT trapIllegal instructionQuitHangupSignal 0%&'##M##$$4%'&& & &&'L'#/dev/null !: : cannot redirect shell commandtry again,K,^,, ,^, ,@,) (: cannot here file : illegal >& argumentcreateopen + - core dumped Signal : : ?90109090900 1cannot executenot foundargument list too longprogram too bigno Shell/bin/sh11cd: bad directory: no home directory#nothing to shift: 4: not found:Usage: read name ... : trap: bad signal number: bad numberbad break/continue level: bad identifier# s ms mtimesnewgrploginumask.setreadonlyexportexitcontinuebreaktrapevalreadwaitexecshiftcd:X=?[*?$`'"@@" A' A"'"'$`"F-yE=E?Eunset variable: missing value for cannot use ${...=...} with $n=-+?string in ${} too longunclosed ${try againno closing `input line too longShell input nested too deeplytoo many files open in shellcan't create pipe - try again[' unclosedhere document `T]\`$\/tmp/shtmunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0bbbgfgfgffff& /bin/sh:/bin:/usr/bin      {}tl`LD8( V2 ]22:4566 7#9:999 ::43L3L3U<[?*SSSSUnknown error  t d X 4 $   x d P < ,   l X < ( hhhhhhhhhh x h T @ (  C'  0X1$T$Lsu;SSSSu QRP P~UVWE9uU :-t[=u>U R YQhh8YYjY3EU 4aYU BE-A=s u YEu1U ztU <uUJ9BUM <WYuWYusWYuXOWYu/U 4hh8 jY E-Fl=uh<h8YYjY}ujY1_^UVW}t0h,uYYEu!uhh8` E=uWj5YYE9U} j5YYU E1҉1EBډU <9u 9u9u u5WF 9EWXY9U}0A ~= =~ h-Y9tA ])4Su 9u N1UUIM~ Wuu9 95F}t uY_^U=t,}t&=t@<PuhDF =tu h4-YYuh0YYUV=tu5hp ju5 1ۅÉރ=ttTLPh\YY^UuhYYj|YUVuj jV ^U VWUU URYDžu1u9v _^UV5Nx ^U=tu YUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8j\Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUAs UEU$UUEPjj  y U1UVW5}׃}~9r }y 9vWYu_^UVW}uhY1zUh(YEPjAYYu10=|hHY1`RbYDžuhY1UW\hYEPjYYu1GPGQGTGX]VN Y8|>uNOP>u GQ@GQUPEEt2>u"FPY9EwVUFPYEV YʋUWTUWX_^UVWE }t8= |hY1UURWY E1EP*Yƅu1t VWYYUuE #UE :|uCEPYƅu1VWYYUuE #UE 벃}t U1PYEPWUYYtuVYYV Y}t8)thY16}u.:t#:)uhY1hY1_^UVWEjYE1:K:|tF:)tAEPKYDžu1<#UE u#UE  WVfYY릅uj YE_^UVWEPYƅu1 M}*t}+t}?tUE|Uu}?thY1\}+t]}*uUtVj VYY}*uKVjAYYjYPVYYVVYYjYPVuYYj YPVdYY}+uUtVj YY}+uHjqYWV)YYVj]YPYYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWV YY:*t :+t:?uhTY1_^UVWEjYjYjYNjEq:^ujeY jSYNj:]t:-uPfY::]:-g:]t:u j-*Y‹JA΋ MA9}hNY19u| VYFxPY^jY:]thY1`EMEPjYYDžu15#UE !hY1hY1:uhwY1jYǡPYjYE h5 YYƅhY1 M~}*t }+t}?uNEuEjGYDž~PfYNj[Y_^UVW=u MFFF5_^U=tMUVW=u >=U9} sOPMUY u MFFF_^U VW}t@uVEYDžt>u +U UU )UUˆFUڈ^_^UVutt>uu FPYY^UVW}t} uh -Y1\thY1Tt9u WTPV/ YYƅtwXwTVk tFՅu1~}t U  Qt u WXYYPu Pt*GPPV YYƅt2VW1YYt FVWYYt Fu1_^UVWU UU(}u(E }~MU]R&YtU EU J(1_^UVWuVFYEo9j1x:T1b:u1P09t1)W YE=~u5W t1U:tPFP YYu1:tPFPYYt1r-E=uYtU <u<M1F-E=uzYtU <u< 1U:t VU=FP0Yt =VtYƅt>t1EU:uJM> u1E=FPYEU9U|;}t]9uuYtLMU181h;Y1"}uehY1_^U VW15UUnVdYljjU9YGF>tPPuYYt>GF>t5PuYYu#GFhY1U5_^UVWuu1*VNu1>u _^UVWuU VVuYYDžt~~yVډF_^UVW11}U9Pu PF߃| jugYtUrzYtURtUzt rY}t} t}8t uY_^UVWuEu41}%uNN FFSX_^UVWEE11tF>uGމ+U_^U$UUEPjj U$UUEPjj U$U UEPuL YYEPjj U$UUU UUUEPjj{ yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U \S }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEt uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEМUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }n~y UVu CV€tu ,fNV~ u>5$Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhh8*YYj&YUVuYƋU rU MJwU uR=YY^U$EPuYY1ۅÉUu hT$u% UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPa;bYfwlnwUsage: cgrep [-a n] [-b n] [-f] [-l n] [-n] [-w n] pattern [filename... ] Invalid option %s cgrep: error in regular expression. ---------------------------------------------------------------------------- Can not open file %s r%s@%05d:: %s%sFALSETRUEmatlin returned %s Matching %s against %s%s out of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be empty $(\)*+.#?[8\^|internal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parameter'=moocorrupted pointersmemory corruptionFoZinternal fouluparw+b-# "@#*$X$b#d $i $o$p$u $x$% $#$+$-$0$'L%h%l%%E'G|'X&b&cc'd%'e'f'g|'i%'nK&o&p&r's&u&x&(null)cannot print floating point dSSSSB 8 ((((( AAAAAABBBBBB #!/bin/sh # # checkhier 2.7 - check the directory hierarchy Author: Kees J. Bot # 7 May 1995 case "`id`" in 'uid=0('*) ;; *) echo "$0: must be run by root" >&2 exit 1 esac # List of all interesting top level files and directories, with mode, # owner and group. Only the key files are listed, the rest is owned # by bin, has mode 755 or 644, and is not critical to the operation of # the system. { cat <<'EOF' drwxr-xr-x root operator / drwxr-xr-x bin operator /bin drwxr-xr-x root operator /dev drwxr-xr-x root operator /etc -rw-r--r-- root operator /etc/fstab -rw-r--r-- root operator /etc/group -rw-r--r-- root operator /etc/hostname.file -rw-r--r-- root operator /etc/inet.conf -rw-r--r-- root operator /etc/motd -rw-r--r-- root operator /etc/mtab -rw-r--r-- root operator /etc/passwd -rw-r--r-- root operator /etc/profile -rw-r--r-- root operator /etc/protocols -rw-r--r-- root operator /etc/rc -rw-r--r-- root operator /etc/services -rw------- root operator /etc/shadow -rw-r--r-- root operator /etc/termcap -rw-r--r-- root operator /etc/ttytab -rw-r--r-- root operator /etc/utmp dr-xr-xr-x root operator /fd0 dr-xr-xr-x root operator /fd1 dr-xr-xr-x root operator /mnt dr-xr-xr-x root operator /root drwxrwxrwx root operator /tmp drwxr-xr-x root operator /usr drwxr-xr-x root operator /usr/adm -rw-r--r-- root operator /usr/adm/lastlog -rw-r--r-- root operator /usr/adm/wtmp drwxr-xr-x ast other /usr/ast drwxr-xr-x bin operator /usr/bin drwxr-xr-x root operator /usr/etc drwxr-xr-x bin operator /usr/include drwxr-xr-x bin operator /usr/lib drwxrwxr-x root operator /usr/local drwxrwxr-x bin operator /usr/local/bin drwxrwxr-x bin operator /usr/local/include drwxrwxr-x bin operator /usr/local/lib drwxrwxr-x bin operator /usr/local/man drwxrwxr-x bin operator /usr/local/src drwxr-xr-x bin operator /usr/man drwxr-xr-x bin operator /usr/mdec drwx------ root operator /usr/preserve drwxr-xr-x root operator /usr/run drwxr-xr-x root operator /usr/spool drwx--x--x root operator /usr/spool/at drwx--x--x root operator /usr/spool/at/past drwx------ root operator /usr/spool/crontabs drwxrwxr-x root uucp /usr/spool/locks drwx------ daemon daemon /usr/spool/lpd drwxr-xr-x bin operator /usr/src drwxrwxrwx root operator /usr/tmp -rwsr-xr-x root ? /usr/bin/at -rwsr-xr-x root ? /usr/bin/chfn -rwsr-xr-x root ? /usr/bin/chsh -rwsr-xr-x root ? /usr/bin/df -rwsr-xr-x root ? /usr/bin/elvprsv -rwsr-xr-x root ? /usr/bin/elvrec -rwsr-xr-x root ? /usr/bin/format -rwsr-xr-x root ? /usr/bin/hostaddr -rwsr-xr-x root ? /usr/bin/install -rwsr-xr-x daemon ? /usr/bin/lpd -rwsr-xr-x root ? /usr/bin/mail -rwsr-xr-x root ? /usr/bin/mount -rwsr-xr-x root ? /usr/bin/passwd -rwsr-xr-x root ? /usr/bin/ping -rwxr-sr-x ? kmem /usr/bin/ps -rwsr-xr-- root ? /usr/bin/shutdown -rwsr-xr-x root ? /usr/bin/su -rwxr-sr-x ? uucp /usr/bin/term -rwsr-xr-x root ? /usr/bin/umount -rwxr-sr-x ? tty /usr/bin/write EOF } | { # Check if each file has the proper attributes. Offer a correction # if not. banner="\ # List of commands to fix the top level hierarchy. Do not apply these # commands blindly, but check and repair by hand. " while read mode owner group file do ( # "fix" a memory leak in set... set -$- `ls -ld $file 2>/dev/null` '' '' '' '' curmode=$1 curowner=$3 curgroup=$4 test $owner = '?' && curowner=$owner test $group = '?' && curgroup=$group # File types? if [ x`expr "$mode" : '\\(.\\)'` != \ x`expr "$curmode" : '\\(.\\)'` ] then case $curmode in ?*) echo "${banner}rm -r $file" banner= esac curmode= curowner= curgroup= case $mode in d*) echo "${banner}mkdir $file" ;; -*) echo "${banner}> $file" ;; *) echo "$0: $mode $file: unknown filetype" >&2 exit 1 esac banner= fi # Mode? if [ x$mode != x$curmode ] then octmode= m=$mode for i in u g o do r=0 w=0 x=0 case $m in ?r??*) r=4 esac case $m in ??w?*) w=2 esac case $m in ???[xst]*) x=1 esac octmode=$octmode`expr $r + $w + $x` m=`expr $m : '...\\(.*\\)'` done r=0 w=0 x=0 case $mode in ???[sS=]??????) r=4 esac case $mode in ??????[sS=]???) w=2 esac case $mode in ?????????[tT=]) x=1 esac case $r$w$x in 000) ;; *) octmode=`expr $r + $w + $x`$octmode esac echo "${banner}chmod $octmode $file" banner= fi # Ownership? if [ x$owner != x$curowner -o x$group != x$curgroup ] then echo "${banner}chown $owner:$group $file" banner= fi # The Minix shell forgets processes, so wait explicitly. wait case "$banner" in '') exit 1;; *) exit 0;; esac) || banner= done case "$banner" in '') exit 1 esac exit 0 }   / Y1$T$L su;SSSSu QRPlPU U5thhH X hH YU uYYUhAYy= thYEunYUuwYjYU4CYj8YUVEEƅt:t ||1^UXVWEE j/0/YYttt E th5tYYu  h5tYYu E=uE9Et @9EtU9Uu u) Y6EP.YYUӉUU RUR) YƅtF9ES}Ih YjY1V:#nz#dEVjREP EUӉUh Yu Yƅuh YjYuhYYuhYYEV:tM}tGhmYPEP/YYvEPYYPvYYth Yj Yh&YPEPYY}u h Y&hYPEPYYthh YhX Y룍EP?Y?#U.UU?.UE}IUU=9~UUUU=Z~UUE뭍EPEPYYPEPYY`UJM UR YP=uP<Z9w uYu$h YjYH*jjYYjjYYjjYYjjYYjYE hhh EyF= t h<YUIM~ jYhhH YYjYhu7YYEu hYƅ6uYYu)UVUVUV `)hv uYYthv bYYuF FPYPv6huUR t hYFv vvP_YPhuUR  hY}uY=u hmYjjuF t hOYh}tPYYEy hYhhtu Et3}xuhtu  9Ethx[Yj<YuYuYj}Y_^UV5Nx x^U=tuDYUVu~  u 6EPn YEU UEPEPV yE^UVW UUU UEEFt uWEEFt u:EP Y(- Ph u u:Yu1Y}tju;YYuY}tju YYuYjhh` hh j jY E a&uYjEPu x}t uYKhh u, ucYx' 1 v N>uGu U 5  _^UVW1}y11<` t,|1Fρ(1E E 4%U :tE E Tl%j,YEu1EttEUMJUzUBU` E_^UU`VW1jhl/YYDžy1<EPjj }t*EPO YEET EPEPj EPW| YYEPEP 0$UfUUfUUfUUfUEPjW0 u YPuj jPW ~ t }FƆEPjW WYjEPj =tjY_^U= x 5 Y  U= x= u   j5 YY y'j5 YY Pj5  1U^U U,= u/hh5   1V(=,u1<  ((,,= u,U,U,U,:u1,: t ,::uҋUEUV= yy1u1tx tjƅtjjV^ fLƅtjjV@ /$t!yg,:X^UV%ƅt F9Eu^UV{ƅtu6 YYu[^U VWE0}y0A 0ƀ4-]}u0A 0ƀ40Z'~QEǃ}u~$G00A 0ӈ4E+UډU 뫡0ƀ44_^UVu>tF+URuj ^U$UUEPjj U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KV, YE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WQ }׃E뻋EEU9vGumYEuUUȋUUEEEPj;j R Y_^U(VuEEV֋RUV֋RU xE UUU UEPj7j ^U$EPjj U(VuU @t*uYEU UV֋RUUUEPul YYU UEPjj ^U$EPj*jy yUEUMJ1U$UUUUU UEPjj/ U$UUU UUUEEPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1Uu hT$u UV& T$@, T$@% T$@ E uVu[ ^U$UUUUEPj j y} tUE EU$UUUUU UEPjjw UVWuEu41}%<` t4` YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<` t` Bt 4` aYF^UUUuuu UVW5 YNj5L h0 YhH Y}t.U:t&uYPuV jhV WYPWV jhV _^UU Uh0 uu ?wT3 _ { UVW}u M[UVWE_^]UVWM{E_^]UW}0OE uG_]1_]UV@U9@wU@9@v 16VYt1'@rF5@&Y5@^UVW}u1E}UUs 1=<u8jY=u1V!փ5<5@FE5DOVU}9}r69v2W9UvUW~>}t EDu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=D<9}r79}u+UOJ}t EDURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Dt 9ur6E0tU UDtU9ru NJEtU9Wu RWE_^U}x}~uPXYYUVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډ F_^U$EPjj U$EPjj U$UUU UUUEPj6jc U$UUU UEPj%j= U$UUU UUUEPjj yEUHVuUVUVUV UVUЋU UEPY^UVuEP+YjEPj V\T5dhHjKj} ^UU$VWEP YEPEPj j YƋ}t9uvE$ EP YEEPEPj` WO YUUjEPM YYEPb YWj) YZ)‰jEPj jEPj. t9r)օu jYV YU)_^U$EPj ju y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U4! EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UdA JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PSE6U U RU U RUEEE1E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~0 u>54 Yt.hYFu NLNHF 9h^YFuN!NF V@uVVVhUFt$jjv2 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv# =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhthH vYYjYU$UUEPjj U$EPuYY1ۅÉU$} uEEUUE UEPjJj y}tUEEU$EUEPjHj} É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s: chsh [user] shell chfn [user] fullname passwd [user] Q11wError rewriting password file, tell root!Can't recreate password fileCan't reread temp file%s:%s:%s:%s %s:%s:%s:/usr/bin/sh/bin/shw+Password file busy, try again later. Can't create temporary file, try again Passwords don't matchRetype password:Password cannot be nullNew password:Old password:Changing the password of %s Changing the shadow password of %s chshchfnF] a r w + b /dev/ttyqJqJqJWWWv} : unknown errorU" !@."R#X;#b #d2#i2#o)#p;#u2#x;#+$ $#!$+$-$0&$'L%h$l$#%E&G&X&b&c&dM&e&f&g&iM&ns%o&p&r&s%u&x&(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point p/etc/passwd/etc/shadow/etc/ptmpPermission denied 8 /usr/lib/pwdauthSSSS/etc/passwdB 0 H  ((((( AAAAAABBBBBB Unknown errorl`D4|h\D4(t\L4$ lT8$lTD0C   V1$T$Lsu;SSSSu   QRP\ PUVWu j/6L YYttttMh45t YYd}t:-uzRuMl}}UMj:uQ YYDžtGu=du }E}iU-0= suYfx:u YEuu Yh YjYUfRfxh ht]-0= sWY|4WYEuW Yhu YjYUJ |d dpUIMtP Yp_^U,VW}EPW YYtW3 Yp=dt |EP=ht xEPW tW YpU؁@=lWR YEuW Ypxt Whx YYhxhx YZ/Fu YEt=x.uUztUz.u UztϋURV8 YYhxYu YN_^UhhY5tY=dtXHPYh<Yj5YUVuj jVC ^UV5Nx ^U=tuYUVujuu V!^UVujuu V^UVWuEEEu} tE 0ItFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U=,x 5,mY,0U=,x=u  j5YY,y'j5,&YY Pj5, 1U^UU( =0u/hh5, 01V$=(u1< 0$$((= u( U(U(U(:u12(: t(9Et(z:u1 UEUV=,y~y1u1j:nYtj:]Ytj:LYEtjju( $։ (: t$j,Yt s(:u^UV3ƅt F9Eu^UVv ƅtu6YYuV^U=@x 5@Y@DU=@x=,u ,4j5,YY@y'j5@vYY Pj5@a 1U^U,UL0=Du/hh05@ D1VH0=L0u1< DHHLL= uL0ULULUL:u1L: t L::uҋUEUV=@yy1u10tx@tjƅtjjV f4LƅtjjV| 6/Dt!8y<gL:X0^UV%ƅt F9Eu^UV{ƅtu6NYYu[^UVu>tF+URuj ^U$UUEPjj U(VuEEV֋RUV֋RU pE o UUU UEPj7jj ^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj UVW5dYNj5hdYh|Y}t.U:t&uYPuV jhVt WYPWVb jhVR _^UW}0))ϊE tu1_]XG_]UVWE_^]UW}0OE uG_]1_]UVux95^UVuYƋU rU MJwU uREYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$uYEU UUUUUEPjjf U}u UEudYuEYU0VWEPuYYy1U؁@t1huoYYDžy1EPWYYxSU؁@u7jWYYEx& PjW xh$YƅuUWnYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjj U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVTU9TwUT9Tv 16VYt1'TrF5T&Y5T^UVW}u1E}UUs 1=Pu8jlY=u1V!փ5P5TFE5XOVU}9}r69v2W9UvUW~>}t EXu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=X<9}r79}u+UOJ}t EXURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15Xt 9ur6E0tU UXtU9ru NJEtU9Wu RWE_^U$UUEPjj7 y U1UVW5}׃}~9r }y 9vWYu_^U$UUU UEPjj U$UUU UUUEPjj yEUVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P1ۇtPXP: unknown group name : unknown user name chgrp file... [owner:]group owner[:group]Usage:  : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0`SSSS/etc/group/etc/passwd ((((( AAAAAABBBBBB BLd|Unknown errorxdTH$|hT@, p\H,|hXD0C  P \J1$T$L su;SSSSu QRP PJU\VWu  }}v~?=t?+t ?-t_GP~YEE0}yhGPYYjYMMj6YYEy6hYYuEPu 9Et6hYY뫀}u}th6gYYE t1EMM7EE_U9U~6htYYU+U+UU}u+UU?=uUU?+u UUU?-u U+UUUUUU}uUUU9U~ U+U1E܋U+U܉UU+U܉UUjju] uEPuc 9Et6hd0YYUuu6h,u Y21_^Uu5 hh, =t u Yu hh, U5 hh, jYUVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5Nx  ^U=tuYUUUuuu L UVW5YNj50ha Yh,V Y}t.U:t&uYPuV jhV WwYPWV jh V _^UU Uhuu _w?ZUVux95 ^U$UUEPjjC U$UUEPjj# U$UUU UUUEPjj yEU(VuU @t*u:YEU UV֋RUUUEPu`YYU UEPjj ^U$UUUUU UEPjj[ U$UUUUU UEPjj/ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U $}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE< uVuu ƀ}Xu9utUP?YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U9JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEdUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE) E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv- =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UW}0ʀuA)_]UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVD uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UUas U EUhh,:YYjYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$EPuYY1ۅÉUu hT$u USE] ![]USE] ![]USE] ![]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }KI|;u[u P1ۇ tPXPpL ^Ug%s: Stack+malloc area changed from %ld to %ld bytes. can't modifysize is too large forbad CPU type inis not executablecan't read header incan't openis negative%s %s: %s Usage: %s {=+-} amount file : unknown error @Xbdiopux #+-0 L h l EM G8 X b c d eM fM g8 i n o p r s] u x (null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point ((((( AAAAAABBBBBB SSSSB,Unknown errorl`D0 xdTD4  thXD(thP4 lC\   Zt l^1$T$Lsu;SSSSu  QRP P2 UVWu }OtH:-uAzuu zlu ՋBPh h\ # j Y벃thh\"YYj Yh65YYhhlYYhhhh\"h j6YYh j(YYh jYYj/h&YYu 5&Y= v 5hh\?" j Yhh=&YYj;j,h&YYZhh YYuh#Yj Yh %Yh %YhhF YY5hhz hhh/$ =thh|h\e! j Y55YYu%5hdh\(! 0jYh`h YYu"h hLh\ hH"Y5hh 5hh tJh8h$YYt55h YYR th(E"Yj"Y5Yhh $YYuhh #YYt$h!Y#jY 5h5 h5YYhhMYYuh!YjdY5hhm t5hYY5Y5hvYY=<RRh\5/9w  hX5YYuh< YjY5hh t5hYY5/Y5h,5 5= uPYY5Y5hh tJjhhn" t25h/YY5Y5hYY= t;BRhh\ BR Ph5jj(YYjjYYR u=5 Yu-=~hB!Yuhh!YYt hlh\9YYBjYhXh\YYhh YYxmRhr YYy h<Y= t@hh YYxmRh+ YYyah oYT= t@hhH YYxʀRhYYyh&Y h YG1_^UVhY(jYhh YYƅxjVYY=uhYjYVZYjh hhhVht}YjZYA8QheY=t1=t%5hLh\R ZjY^UEPY5hh\ EPYPh5huh[Yt,hhYYthhu UVuu YYu uYPh(YZ)Yh$VYYu^UVWu }WVlYYh8V?YYjVYYj/WYYEt)@PW|Pi ƅ|h4|PYYj|PdYYuE|PVYY}uh0VYYWVYY uVYYh,VYY_^UXVuu Ph<EPVoYEjEPYPV Vj(EP# EPEP;YY1ۅÉ]juV E^UhTh\YY jYUh Yt h Yh Yt h YhYt hYUJPYEt]UuIYPYUV5 Nx ^U= t uYUVWu~Yƹ< +F؉F +ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EPL>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h$ VW ƅu1WWYZ׀>/u5Fuh$ VEP ƅu19ut EEG>,t1jFh8 VW ƅu1MWW<YZ׀>/u0Fuh8 VEP ƅu1EEGu>t1_^UVWuE}>:tVhpYY_  $ U4 8 UH V{Y=VhpDYYVhwYYƅ>-uF>+uFjVEP ƅUU j h5  1 VhYYƅpj h5  >t>,tjVEP ƅt5U >t'>,u"FVqY=xwVhYYƅu_^Uh8%YPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuE$ 8 E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FyuNN FFSX_^UVWEE11FtVyYU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^UVW,}JxFFSXVYE=t } tGσ}uVt 9}u1 1E_^UVW5\ YNj5`hD9Yh\.Y}t.U:t&uYPuV jhV WYPWV jhV _^UUURu huoUUURuu uOU UUEEUUUUu^YEuu EP UEEUUUUU JUEPuu EUJUx ]E EPjx$YYEUuu hu  ; O Gw :'Z'UVWu'E_^]z'L$ 'UVWM7'E_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhVYYURtG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV$! uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVupYƋU rU MJwU uR%YY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$U UEPuHYYEPj!ju U$U UEPuYYEPjjI U$U UEPuYYEPjj UVu x~ 5juYYy9uuVqYVju ^UE PuYYU4VWEj/uYYuhYƅuVYPuYZEЃeuYE=u}؀>t >:tFG9}s/GuW YYEPuYY=t4 2u uz =t Ũ}t} uFuURYỦ_^U$EPjj} U$EPjje U$uYEu }YEUUU UEPj j U$UUU UUUEPjj yEU VWEu>tFN>Xu E0EEF>t&azjuYYyEG߸_^UHVuUVUVUV UVUЋU UEPY^UVuEPkYjEPj V5hjKj ^U$uYEUUU UEPjj U$EPj j y}tUEEU$EPu"YYEPj jO U$EPjj5 y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U "}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE!uVuuoƀ}Xu9utUP?YUE_^U4VWuEEEE }%MJxUʋFF VuhYY=u}t UډE1!,'"UD EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UtJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE$UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPHYY=}t UډmEJxEEFFEEVP YY=t6JxEEFFEEVP YY=u}t UډJxUʋFF Vul YY=u}t UډMuUUMRJxEEFFEEVP YY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWu }E$E)E EEE,-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXV9YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G tGE=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPhx EuEPhz EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVgYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG5띀?uEE3]uVuYYEEuUURUEu UMЈ EMt"JxFFSXV;YEE}t}tE3]u}t}t Vu`YYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E2EEu }ntEGV}u}tE_^UVW}Wu u@ ƅ~9})׉U U 1_^UVWu } f ~y UVu CV€tu ,fNV~Du>5HpYt.hPYFu NLNHF 9h"YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvY =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u M{UW}0))ϊE tu1_]XG_]UUas U EUh| h\YYjJYUh h\rYYj*YULVWE1EEU UE8t+0hYE9uvEEEE͋UUE8t(0/YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0zYE܋]P3W }׃E뻋EEUUE8t=+UEEE0"YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;jf RY_^U$EPjj9 U$EPufYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUu hT$ue UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE8UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7u.`=}aaG1ۇtPXPci: can't chmod source fileci: can't chmod source fileci: can't chmod SVC fileCheckin complete. SVC file write/link error - Checkin aborted #***SVCLOCK*** %s %d (relocking into revision %d) rm -f Fix.$1 #***SVCLOCK***fix $1 Fix.$1 > New.$1; mv New.$1 $1 mv Fix.$1 $1 ***%d-eof*** can't open diff output filerif test $2 -ge %d ; then rm -f Fix.$1 ; exit 0 ; fi ; cat <<***%d-eof*** >Fix.$1 ***MAIN-eof*** ci: can't read source filercat <<***MAIN-eof*** >$1 # %d ci: can't stat original or diffoutci: origfile***MAIN-eof*** ci: can't create %swRevision %d not locked ci: %s: illegal SVC file header # %drci: can't create SVC temporarywci: filename %s is too long %s -> %s ci: bad number of files arguments ci: illegal option -%c 9ci: bad return status (0x%x) from diff ci: exec diff faileddiffdiffci: diffoutci: fork#***SVC*** %s .#***SVC*** revision %d %s %sEnter log message for revision %d (end with ^D or '.'): ,S,S,S/SVC,S#***SVCLOCK*** %s %d Interrupt - Aborting checkin, cleaning up nobodySaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ"a"r{"w""+"b" : ??? ??? ?? ??:??:?? ???? unknown errorPATH/7 97@n78X{8b`8dr8ir8oi8p{8ur8x{8k9 \9#a9+W9-R90f9]<LE:h/:l::c:E;G;XO;bO;c;d;e;f;g;i;n:oO;pO;r=<s ;uO;xO;(null)U?X#?b>?d,?i#?o5?p#?u,?x#?ELDhDlDEE%JG%JXF[HbFc+GdFe%Jf%Jg%JiFnEoFpFsGuFxFNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point cannot print floating point /tmp/cioXXXXXX/tmp/cidXXXXXXGMTGDT U U 0$ SSSS/etc/passwdB,D\l ((((( AAAAAABBBBBB Unknown errort h L < $  p d L < 0  | d T < ,  t \ @ ,  t\L8$C   l1$T$L su;SSSSu QRP tPUVW}U IM ~MGU1ʉօu' A ց= r  U3U릋E_^UVWu }O u jj5YY(JWZt6j6YYPYYۡ _^U VW} }yWY EE hPu{ ƅy,uZYtPY {tuuVP EuYuuh  tWhYY- J x0 0 h j YY_^UV5 Nx  ^U= t utYUVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~ u>5 Yt.hHYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvP =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVW5 YNj58 h ]Yh4 RY}t.U:t&uYPuV jh V WgYPWV jhV _^UU Uh uu #;UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV| uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95 $ ^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjj7 yEU(VuU @t*uFYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj Uu hT$ue U$UUUUU UEPjjW UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 4# }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEL^ uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"Um EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEtUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PsE6U U RU U RUEEE}E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPfYY=t6JxEEFFEEVP0YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu%YY=u˃}t Uډ E_^UVWuEu41}%jm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-SSSSB  4 l Unknown error|pT@,tdTD0xhT8$ x`D0  |C#!/bin/sh # # clear 1.0 - clear the screen Author: Kees J. Bot # 30 Mar 1996 export PATH=/bin:/usr/bin exec tget -str cl   p` h1$T$L`su;SSSSu|| QRPt( P:UVWu }VV:-uNztHVzt&$VBeM렃}tV:-uzu`,E+V`j5`YYEy 5`YV:-uzud$1*Vdj5dYYDžy 5dYWu YYPY_^U(VWEE1EEE1E9}u9UUhhhu_ E}y 5`9Y1U9Uu8hhhu $ E}y 5dYEBhhWZYEUAMh]9]f=u5=u"UuR5d5`hT^vUM]PPShD3E} EuE2=u$u`dPh4h _^U=u"5|YPuhxhj;YUhhmYYjYUV5Nx |(^U=tulYUVux95L@^UUUuuu  UU Uhuu +U$UUEPjj U(VuU @t*u YEU UV֋RUUUEPu|YYU UEPjj ^U$UUUUU UEPjjw UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U C}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE,~uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UtEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuETUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv` =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVl(U9l(wUl(9l(v 16VYt1'l(rF5l(&Y5l(^UVW}u1E}UUs 1=h(u8jY=u1V!փ5h(5l(FE5p(OVU}9}r69v2W9UvUW~>}t Ep(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=p(<9}r79}u+UOJ}t Ep(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVp uY_^U VWUUb15p(t 9ur6E0tU Up(tU9ru NJEtU9Wu RWE_^UUas U EUh\hNYYjYU$UUEPjj y UT1UVW5TT}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uR YY^UVWuU VVuYYDžt~~yVډF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uu U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }KI|;u[u P1ۇXtPXP-lsstdinstdincmp: EOF on %s %10ld %3o %3o %s %s differ: char %ld, line %ld cmp: %s: %s Usage: cmp [-l | -s] file1 file2 unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 E@zXbld~i~oupu~xw h#m+c-^0ri LQh;lFoE G X[ b[ c d e f g i no[ p[ rI s u[ x[ (null)cannot print floating point x(SSSSBUnknown error l\P,p\H4$xdP4 0000000000 p`L8  C(  @P \Y1$T$Lh P su;SSSSuL L QRP PJUVWu }Ot:-izru0O6Y$hh YYjY뵋zlu4륋BPhh  jY낃thhh YYjYh6>YYhhuYYhYXPhh\h UhXhYY uh@Yj+Yh(h85  =u =(hh YYjY5 Yh85X YYxF<’t:5Xhh  9uhh YYjY5X9Yt 5XY=$u ($5$hh 6 5$5Xh =4K(B,Rhh  h8h6YYx<ʀRhYYy hLYh85XYYx<ʀR5XYYy hl YhhhYY t-5,PhP5 9 R thh<h  jYh8hRYYx"<mRh$YY}h dYm J x  h j YYh85XYYx<mR5XYYt hY1_^UVuu YYu uYPhYZ)YhVYYu^UVWu }WVYYhVjYYjVYYj/WYYEt)PW|P ƅ|h|PYYj|PYYuE|PVYY}uhVYYWVYY uVYYhVYY_^UXVWu Vhh\9 huYY Phh  5 hh hVLYYDžuhNY5 hh t$hhYYtWhYYW6 Y5 hhp jhh  EPhh U9U|h\aYGh|h\tYYDžuh\vY uhLEP 5 hh t#EPh.YYtWhYYWK YjhHh< u"VVh8EPuEP9Yjh0h u%VVVVVhEP8EPYjhh }VVVhEPEPYZh\Y_^Uj/uYYEuEUBUPYEt]U h j EPj t}yt}Yu1UVuj jVC ^UV5P Nx ^U=T tT uYUVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+l "}t}y UU_^U VW}Eyt 1}uE V*YFu=` L 2hX h  jYEP$YE9Et}u}uEu}u EEE_^U=| x 5| Y|  U=| x=P u P p j5P YY| y'j5| ^YY Pj5| I 1U^UP UpT= u/hhT 5|  1VlT =pTu1< llpp= upTUpUpUp:u1p: t p::uҋUEUV=| yy1u1TtxdtjƅtjjV fXLƅtjjVl Z/ht!\y`gp:XT^UV%ƅt F9Eu^UV{ƅtu6FYYu[^U$UUEPjj ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u sl KVXYE=ul &UEUUU}׋U UE8t=+UEEE0" YE܋]P3W }׃E뻋EEUUE8t=+UEEE0 YE܋]P3WU }׃E뻋EEU9vGu YEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E /UUU UEPj7j: ^U$EPjj! U(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$EPjjy y}tUEEUVW11}U9 u  F߃| jugYtUr>YtURtUzt r~ Y} t} t} t uZ Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv1 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv; EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFtFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }T z~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E $'U :t! EE E D~'U uuuYYEy@Ut8hu}YYE~" tuYuuYYE}y1]j YEu uY1A!uEUMJUzUBU E_^UUUuuu UVWu }E?t:JxG^FSX GVPYY=uEE_^UUURu u UVW5l YNj5 h Yh Y}t.U:t&uYPuV jh`V WYPWV jh\V _^UUURu huoUUURuu uOU UUEEUUUUu.YEuu EP UEEUUUUU JUEPuu< EUJUx ]E EPjYYEUuu hu/Gk'oUVW}u M/bUVWE_^]L$ CUVWM_E_^]UW}0OE uG_]1_]UVU9wU9vl 16VYt1'rF5&Y5^UVW}u1E}UUsl 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95@ d4 ^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuAYYDžt~~yVډl F_^U$UUEPjj U$U UEPuHYYEPj!ju U$U UEPuYYEPjjI U$U UEPuYYEPjj U$EPjj U$EPu~YY1ۅÉU$UUU UUUEPjj yEU$u6YEUUU UEPjjt Uu hT$u% U$EPuYYEPj j3 U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U t}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF Vu&YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEдUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P'E6U U RU U RUEEE$E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPhYY=}t UډmEJxEEFFEEVP YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP&YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }E$E)E EEE-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXVaYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G WE=cF}[t@}nt:JxFFSXVYEE uՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPh EuEPh EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE u:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG띀?uEE3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVcYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY $EB EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh h :YYj6YUh, h YYjYU$UUU UUUEPj6j U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7L u.`=}aaO1ۇH tPXPco: can't chmod source fileco: can't chmod SVC fileco: can't lock %s #***SVCLOCK*** %s %d aco: can't chmod source fileco: can't chmod SVC file; Locking into revision %d Checking out revision %dCheckout aborted Writable %s exists - overwrite (n/y)? co: illegal SVC file format # %dco: can't read SVC filer%s -> %s co: bad number of files arguments co: illegal option -%c Illegal revision number ,S,S,S/SVC,Spatch -n -s %s < Fix.%s; rm -f %s.origpatch fix %s Fix.%s > New.%s; mv New.%s %sfix mv Fix.%s %smv ***%d-eof*** co: can't create output filewif test $2 -ge %dif ***MAIN-eof*** co: can't create output filewrFix.%snobody-csh/bin/shcd .iBiBiBOOOatrOw^+b : unknown error# %#@Z#~$Xg$bL$d^$i^$oU$pg$u^$xg$W% H%#M%+C%->%0R%I(L1&h&l&&O&E'G'X;'b;'c'dy'e'f'g'iy'n&o;'p;'r)(s&u;'x;'(null)A+X+b*+d+i+o!+p+u+x+0L0h0l01E6G6X2[4b2c3d2e6f6g6i2n1o2p2s3u2x2No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point cannot print floating point SSSS/etc/passwdB ((((( AAAAAABBBBBB \Unknown error x d T H $  |hT@, p\H,$ $ $ $ $ $ $ $ $ $ |hXD0C  l L1$T$Lsu;SSSSu QRP P&UVW}U R:-U RzvU RUU:W@U-1ǃ<t9G}(֋JGXU(eEME }t/U hrsYYU hraYY1_^U5UYj*YUhD=Yu4Y} t u %Yh@YjYUVWu }>V dž?-uu FjW!YYFy WhLoYY_^UVWutOhFPv Džy6hX+YYu VV 1_^UVWiEƁƸiEXǁ 9uV^Yt1NG= t' 9uV"Yt G_^UVjcYu j-YjJYuhjYYjYh8 hYYƅtZ1iXPVYYVYu1iX1ۅPS_YY1PYJhjAYYjYu jnY&jY[hj YYjFY^UVU<t.1UJ9~hlYFu hhYY^UVu<t!VYtiXPVYY^UV5Nx  ^U=tuPYUVu>tF+URujE ^UU Uhuu +C6 U$UUEPjjc U(VuU @t*u& YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U p}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEаUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P_ E6U U RU U RUEEE  E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvf =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvW =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhh(&YYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$ui UVWuEu41}%<@t4@YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv7 EU9Uu1 N _^UV1}*<@t@Bt 4@aYF^UUUuuu USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P[1ۇtPXPUsage: comm [-[123]] file1 file2 1 comm: can't open read error on %s  Y@Xbdiopux |#+w-r0} Le hO lZ E G Xo bo c d e f g i n oo po r] s) uo xo (null)cannot print floating point SSSSB(   P Ȋ1$T$LL su;SSSSu@@ QRP< PUVWu}  jYuhwYYubhThP tWPPwY-Z€: ujPPZY-ZY P%YwYN1=D _^U VW1fE}uTBh4uYYƅu-5PYPuhhpD JxFFSXVYE=t+GUUMD13UfUWEPh! }tuh YYVsYhY_^UV5DNx H ^U=HtHuYUVux95 8^UVW11}U9u F߃| jugYtUrz YtURtUzt rY}Tt}lt}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvN =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uF FF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E HU :t! EE E hU uuuYYEy@Ut8huYYE~" tuYuuWYYE}y1]jAYEu uY1A!uEUMJUzUBUE_^UUUuuu  UU Uhluub UV4 U94 wU4 94 vP 16VYt1'4 rF54 &Y54 ^UVW}u1E}UUsP 1=0 u8jlY=u1V!փ50 54 FE58 OVU}9}r69v2W9UvUW~>}t E8 u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=8 <9}r79}u+UOJ}t E8 URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb158 t 9ur6E0tU U8 tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډPF_^U$UUEPjj U$UUEPjj U$U UEPuH YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*u^YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U8 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Uh JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }H~~y UVu CV€tu ,fNV~lu>5p|Yt.h8YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUh h.YYjnYUVupYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }KI|;u[u P1ۇ tPXP- %s%05u %6ldcrc: Can't open %s: %s runknown errorarw+bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted syst  em callNo such processNo such file or directoryNot ownerError 0= @:X#bdiop#ux# # +-0Lhl EGXbcsd5efgi5n[oprsux(null)cannot print floating point @ !B c0@P`p)Jk1s2R"RBrb9{ZӜb$C4 dtDTjK( ōS6r&0vfVF[z8׼HXhx@a(#8َHi +ZJzjqP 3:*˿yX;l|L\",<` A* hI~n^N>2.Qp:Yxʱ -No0 P%@Fpg`ڳ=^"25BRwbVr˥nO, 4$ftGd$TDۧ_~<&6WfvvF4VLm/ș鉊DXeHx'h8(}\?؛uJTZ7jz *:.lMͪɍ&|ld\EL<, >]|ߛُn6~UNt^.>SSSSBTlUnknown errortXD0 xhXH4  |lX<(|dH4$C   P[81$T$Lsu;SSSSud d QRPP UVu@YPu @YZPn!Yƅu>uVl@YYhV?YYu V?YYV6Yy V<#Y1^UVWuVU1zE~?EMrq>YYyF=u5|0YUPrhjV YcUEPrL>YYy.5/0YUPrhj6Va YEP4YDžuXEv4PhhjV- Y1~0t-v04YDžuv0hTj V Y}5EEPU=YxEPG=Yy@5k/YPh<jx }tu<Yu<YV Y@ju<YY Pju< <E=uL5.YPh$j  uX<YuO<YuF<Yu=<YV Y}u<Yu<Y}tju<YYu;YjZjfP= v4~?tPhfP:}thEP=YYf``:t: u%`j7fPhhhx;jhu< j,;Yu;;Yu2;Yjhu; ~:5-YPhj u:Yu:YVYwu:YEP';Yy75K-YPhjX }t u:YVtY)ju:YY Pju: :E=uI5,YPhj uA:Yu8:Y}t u):YVY}u :Y}t&}tju:YYu9Yjj9YYGPC:YGP@:Yw9Y7h|YY7htYYxwhlYYaW :u\G PhdYYx>~?tUjrhPhTK9jv4h@hDhH-9jhu9 j8Y}t u8Yu8Yjhu19 ~.5K+YPh$jX u8YVzY2u8YUV@5Z~v@v4hh6_^U,VWjh@ YYjh( YYjh YYhr8YDžtJW8Yƅt6~.thEP9YYFPEPo9YYFPEPE YYW7YhY5Z|#h"Y5hh5 _^U,-! TESjA7YU5hh5 jYU,VWE j/079YYu ] 9}U :-Bu WZYU؀:-u z\U؀:t@U؀:u j EPuL) U؀:t(!붋EE=dt9}tjYh(h,3YYEu,5(YPh h hb4jY.6PhuD4 UR uuf0Y=u,5K(YPhhh4jTYEP%6YEEjEPj6 jEPj 5 jEPj 5 EPjj5 u}tjEPj5 EPjj5 u}tjEPj5 jEPj}5 h5Y5ZtS9rEԅt u5Y5Ztjjj5 =u j54Y0+~+P4Y5Z~$hYP5hhB2jjj4 ƃu= u4j3YhN4Y~/5Z~Vhh1 VMY5Zh 4Y1_^UVu B?!։U! tى^UtVWu~?t F8o~>t V8F8PYPEP tNEEPEP [NE};~ EE}~EEEă}~1҉UUEEȃ} |1҉UUEEE̋U+U~ F8~=cU#MȻL uE1҉UUELU#MĻLu1҉UUEU#MLuEEU#MLuEEPEP MEEPuYF8ǃ~8u5UBlMuuuuRQh0j F8U9Uu U9U}u hXYEPEP LEEPYF8E~8u5UBlMuuuuRQhjY F8 U9UuU9Ut$}t hY9}| h@Y~8U9UuU9UuU9Ut1҉UUE~=t"U#ML(^~<t9V8} V8_^UVE0> t> uFu> t> t > t>tFE0E^UVW1} UGu > t> t > t>tFEu >uuhj 1V>*uM~uG}9}|#UU! ˈG؋EFEE>?u};u~-th[YxF=-0= 1F-0k 9}-0= r9}v>-yF-0= :EF-0k] É]9]7-0= r9}UU! ˈG9}}>:F-0= EF-0k] É]U+UB9U-0= rσ}9} +U}9}|BUU! ˈ։UU! ˈ>t F<,O U#t9uuUȀ:tEȀ: tjD? YNj]}UWEPj;jGPVutu EEPYƍEPjjGPVu@u EEPYƍEPjjGPVu u E{1}G-F>-uV9UuEPYu9uv^9uu EPuY9ut%U)RVFP) UBVW0uFPuhjpEF=utЋUztRW0w49ut >#gUȀ:tEȀ: uEEȀ8 tuhj  EUȀ:LE = u UȀ: u0EF҉uȋUȀ:tE = t >%u FW8G>G?G@WY}t UB_^UlVWu&YE}hsYPEP BEu&YE&EEh t2h .uUUz.tUUB-0= sE‹Eh uUUzuj$jEP2' URcYEU 9U}EdURBY@EU R1YEdEEUEEPYE=uEEPYE=U9UUUUREP-'YYuJ%Y} juYu'YP^YFuv&YYhvt&YYEPvf&YYu&YPYFuv&YYhv2&YYEPv$&YYFF F5jDYljFwG0vuW&YZƒW4UW8G>G?G@9W8} W8_^U VW7V~t FVUtEVu]YvRYvIYv@YV9Y_^U VWE=MwtBU9V@uF@VKY~@u"9V8} V89V8u6뺋?뫋E_^UuzYUjmYU VWE1@iU ! t uD@t;Wuhu!J9tJRhu! EF_^U0VWuU}Urh,V UzuUBPhV U RYPhV} UzF?thV[ YYdGPVYYVj c YYGPVYYVj M YYGPVYYVj 7 YYG PVYYVj ! YYG(PV|YY0tUR9W0tw0hV hVYYW4UU:t#VPYYU: u Vj YYEVj YYG8PYPEP <}tPEPYPhVG@tw@hV0 ?EU@_^UuqYEuh@j=YYjBYEU}tuNY UUx UUU5hXh uu hq UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWh`V7!YYUR< EMx !"#$%&'()*+GFFUR< EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^UhuLYY UVuj jV3 ^UuIYPYUV5| Nx ^U= t uYUVW u Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPe4>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWlYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWYZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVh@OYY_   U  U V;Y=Vh@YYVhwYYƅ>-uF>+uFjVEP ƅUU j h5  1 VhYYƅpj h5  >t>,tjVEP ƅt5U >t'>,u"FV1Y=xwVhYYƅu_^Uh,YPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J,4EU M R+Q¤ЙЙUuW +UЙOIkkE0,UM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj y U\1UVW5\\}׃}~9r }y 9vWYu_^U=x 5mYU=x=0u 0j50YYy'j5&YY Pj5 1U^U0UP4=u/hh45 1VL4=P4u1< LLPP= uP4UPUPUP:u1P: t P::uҋUEUV=yy1u14txDtjƅtjjV f8LƅtjjV :/Ht!<y@gP:X4^UV%ƅt F9Eu^UV{ƅtu62 YYu[^UVWd 2}u1rd :u ]j=u YYEcJ>@UUU:tEG9tU:u?=tȋU=U1U=d 2=kEt Eu E@k P3Yƅu Ud :2ud 2E u4@k d P2YYƅu.d 2J]1_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU @E !UUU UEPj7jB ^U(VuU @t*uYEU UV֋RUUUEPut YYU UEPjj ^U$UUUUU UEPjj UVW11}U9 u  F߃| jugYtUrYtURtUzt rY}t}t}t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvj =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWEE11< tN|1DFρECEE0-EMP1E E loU :t! EE E FU uuu_YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu urY1A!uEUMJUzUBU E_^UUUuuu 8 UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVP=YY=uEE_^UUURu hu?UUURuu uUuuu Q UEEUUUUU JUEPuu EUJUx ]E EPjdYYEUuu hu'?W '7S  # ;  C o USE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]UW}0OE uG_]1_]U= t j#YUVWd Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWTEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh,u%dEuEu1k0Z‹N9YE܋]P3W) }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RmY_^U$EPjj U$UUU UEPjj U$EPjj U$UUU UEPj%jy U$UUU UUUEPjjO yEU0VWEPuYYy1U؁@t1huYYDžy1EPWYYxSU؁@u7jW YYEx& PjW xh$YƅuUWYUЉ1FfFF_^U$EPjj- U$EPj*j yUEUMJ1UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEu YEUUU UEPj&j U$EEEPj.j U$UUEPjj U$UUU UUUE$XEPjGjL U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$u>YEUUU UEPjj` U$EPj jE y}tUEEU$EPuYYEPj j U$UUUUEPj j y} tUE EU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U + }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE f uVuu+ ƀ}Xu9utUPo YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U\ u EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE< UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ;~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv~ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvo =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhD hYYjnYU$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPju V5hxjKjQ ^Uu hT$u U$UUU UUUEPj6j U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP=executing >%s<, pid = %ld can't execute /bin/sh: %s -csh/bin/shsh/bin/sh/bin/shSHELLHOMELOGNAMEUSERfork() call failed: %s pipe() call failed: %s can't execute /usr/bin/mail: %s -smail/usr/bin/mail...cronATOutput from your %s job: %.50sfork() call failed: %s pipe() call failed: %s %s: Unknown user Unknown owner for uid %lu of AT job %s Can't stat %s: %s Can't rename %s: %s %lu memory chunks in use /usr/spool/at/usr/spool/crontabs//usr/spool/crontabs/var/lib/crontab/usr/local/lib/crontab/usr/lib/crontabUsage: %s [-d[#]] /usr/run/cron.pidpid %d has exited %s: sleep until %s/usr/run/cron.pid%s: %s %d /usr/run/cron.pid%s: %s w/usr/run/cron.pidAssertion "nodst_rtime > dst_rtime" failed, file "tab.c", line 194 Assertion "!tmptm.tm_isdst" failed, file "tab.c", line 188 mktime failed for %04d-%02d-%02d %02d:%02d:%02d Assertion "tmptm.tm_isdst" failed, file "tab.c", line 164 mktime failed for %04d-%02d-%02d %02d:%02d:%02d%s: field '%s': values out of the %d-%d allowed range %s: field '%s': bad syntax for a %d-%d time field %s: not enough time fields %s: contains an empty command %s: bad option -%c, good options are: -u username %s contains a null character %s: %s%s: %lu bytes is bigger than my %lu limit %s: %s /past//,-%d%s%d pid = %ld (DST) rtime = %.24s%s -u %sAT jobtab->mtime = %s(root)tab->user = "%s" tab->file = "%s" Out of memory, exiting %s: ??? ??? ?? ??:??:?? ???? SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error989898888o<a\<r7<wF<<+<b<No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0M 9M@nMNX{Nb`NdrNirNoiNp{NurNx{NkO \O#aO+WO-RO0fO]RLEPh/Pl:PcPEQGQXOQbOQcQdQeQfQgQiQnPoOQpOQr=Rs QuOQxOQ(null)cannot print floating point 96.365.1546.00GMTGDT U U |$ SSSS/etc/passwdB8 ((((( AAAAAABBBBBB Unknown error | h T D 8   | l X D 0  | ` L 8   ddddddddddlXH4 C  *H @R1$T$LxH su;SSSSull QRPp PUVWE}}'E]x ]x ]ƃx EоD>tx  F<>tx  F>tGx  ^x  Nx Fx 봋u>tM~tGx  ^x  Nx Fx   E} }Ex  E w w _^UVu= t 5 YhPVRYY uV-Y5     VVY-Z95 w>.u~ht~Hu  ^UV= t5  |= t! 5 Y  = t1  :x X@5 YYƃ u  ^UU UVu 5 YEju5   :x X@ 5 YE}^lJx FF\ Vj\"YYJx FF^ Vj^YY  :x X@ 5 ]YE}   :x X@ 5 !YE}\t }$u#} uJx FF\ Vj\hYYJxEPFFZ EVPCYYMMeju5  ^Uu Y  UVu}= p= c= V u=L uHL  L  :x X@5 VsYY^UV= t  H  H H = u  5H YH =H #u = u2=H t=H t  5H YH `>tS> u(bH = t=H t5H Y#:H 9H t5H YF먀>= u =x = uE5 5 RYY  :x X@:5 j: YYH H ʁx u =H _uG  :xH X@5 5H YYEH 5 5 hT5 t=H t(=H t=H \u H H 5H ;YH ^UU UVWI{tE}t@*u}/t5uXENƃ tuVxY l!1ƃ*u1 E{tt)u};t uEރ{u VY};u u YC ƃ{t }tu{u,Et u}}t utE j}YNƃ]tu16ƃ{u  ;tu= u j}qYj;iYqgʁx u _> EƁ}}/ʁx u_u] EȋEƀ VYhh YYuhh YYt*hh YYthh |YYushh SYYt*hh >YYthh )YYu# 1 S_^U}T}u&5 h 5 h5 5 h h5   :x X@/5 j/VYY  :x X@^5 j^$YY5 u oYY  :x X@$5 j$YY  :x X@/5 j/YY  :x X@ 5 j ~YYUVWuJYE1u1=Ut tuu1Ճu UKuF}t@1}t=| t/= u =x tu= t1PYYt)}u#u1}u =x t uuYY|t n1}u=| t= u*=x u!}u= t =x u = t*}u= uujKYY uu= t40Ph8YY uh( Yj[Y9u~U 4YF5 ^Y= t 5 IYjY_^UV5pNx ^U=tttu YUVW11}U9u F߃| jugYtUr YtURtUzt r Y}|t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFP FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }t~y UVu CV€tu ,fNV~u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvs =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E \_U :t! EE E |6U uuuYYEy@Ut8huYYE~" tuYuuWYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu UVWu }E?t:JxG^FSX GVPYY=uEE_^UVWu1fϋV€t}u ~tu>FtV%YU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjvP ǃu}_^UVW5 YNj5hMYhBY}t.U:t&u_YPuV jhV W;YPWV jhV _^vUVh U9h wUh 9h v 16VYt1'h rF5h &Y5h ^UVW}u1E}UUs 1=d u8jY=u1V!փ5d 5h FE5l OVU}9}r69v2W9UvUW~>}t El u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=l <9}r79}u+UOJ}t El URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15l t 9ur6E0tU Ul tU9ru NJEtU9Wu RWE_^UVux958 , ^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}356789:u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPSYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U<!JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE\E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPzYY=t6JxEEFFEEVPDYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu9YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUhLhYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6jC UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P{1ۇ@ tPXPaAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 0123456789r %s %ld define * z p (:,/;=# [ {FORWARDEXTERNexternPRIVATEprivatestatictypedef%s %s %s:%s %s -a append to "tags", instead of overwriting -r generate a "refs" file, too -v include variable declarations -t include typedefs -s include static functions usage: ctags [flags] filenames... arstvrefswarefstagswatagsarw+b : unknown errorE  @ B!X+!b!d"!i"!o!p+!u"!x+!" "#"+"-"0" %L"h"l"#E$G$X#b#c{$d=$e$f$g$i=$nc#o#p#r$s#u#x#(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point t SSSSB|@Unknown errorD8 dT@4 l\L4$ lX          D,pXD,C  !J1$T$L8su;SSSSu QRPPUUu 5$4hlUB( UUe5$4hl ugYU VW11= ujkY(-0= r(-tjeYBE(,((-0= sY(-0= s(Bh(WZYk Ã0Ń<ujfYF(-mGE]}ttJB  9 }jiY։Bh(WZYр9_^UPVW5 hh(7 h(Y-Eƀ(h(h YY EUAMDŽ(19ur(9YƆ(}PujjYU))9u=tU׋FEF녃}u#=`h(h= YYJ195<UBM9 |9MkIh YYJ9uBM9 t;TJTxhShZhTP{YYEoFS195UBM9 ~E B9EGTJTxEh'QhZE'hTSYYEFv|}u =TJTxhh khTj YYX_^UVW} E$}ujgoY9u:-}=t =uhXjYYBWVZY 뮉BWVZY4hTh(* =t =uhPjYYaBWVZY4hLh( =t =uhHjdYYBWVZY4hDh( =t =uh@jYYE=h<jYYJRjYYgBWVZYBFED=u =u*=t =uh8jIYY=u!=uh4jYYk}9u:-u2F <FFΉBBh0WVZY4@YY uJ4jYY^5 ZYq <>( _^UV50Nx , ^U=4t4u@ YUVW11}U9u F߃| jugYtUr YtURtUzt rj Y}<t}Tt}lt uF Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvi =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }4N ~y UVu CV€tu ,fNV~Tu>5XYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E \U :t! EE E |U uuusYYEy@Ut8huYYE~" tuYuu/YYE}y1]jYEu ubY1A!uEUMJUzUBUE_^UUUuuu t UU UhTuuR UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huBUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF Vu YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U$JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEDE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPlYY=u}t UډJxUʋFF Vu$YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuaYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)BDE_]UVW}u MUUas U EUhhl.YYjYUVu(YƋU rU MJwU uRYY^U$UUU UUUEPj6js UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s: Cannot open %s %s: -%s not allowed in current mode %s: -%s overrides earlier option %s: Option -d allowed only with -f %s: MAX_ARGS exceeded %s: MAX_FIELD exceeded %s: range must not decrease from left to right %s: line longer than BUFSIZ %s: usage: cut [-f args [-i] [-d x]]|[-c args] [filename [...]] %s: position must be >0 %s: syntax error {%s%s%slbcd1fgiNnts]rbjcjdjfjionosorssnc%sb%sf%sd[aHr#w2+bu a@Xbdiopux #+-z0LmhWlbE!G Xwbwcde!f!g inowpwres1uwxw(null)cannot print floating point  d@hLSSSSB<Tl   $L1$T$Lsu;SSSSu QRPT P UDVWEPY9uU :-Bu VZYtG9uF>uր?=uэG1_^UVW EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh<u%dEuEu1k0Z‹N9:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPq>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW$ YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhd  YY_U U V Y=Vhd YYVh wYYƅ>-uF>+uFjVEP ƅUUj h 5 1 Vh YYƅpj h 5<  >t>,tjVEP ƅt5U>t'>,u"FV Y=xwVh YYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J<4EU M R+Q¤ЙЙUuW +UЙOIkkE0<UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^"UVW=E_^]BUVWME_^]U$UUEPjj# U$UUUUU UEPjj U$EUEPjj U$EPj j y}tUEEU$UUUUU UEPjjw UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPSqrstuNo permission to set time Please enter date: MMDDYYhhmmss. Then hit the RETURN key. %c%ABDHI-MMOPZSTkUWXkYZa^bvcdehvjmnprCsYtgwqxy%B %e %Y%I:%M:%S %p%a %b %e %T %Z %YLC_TIMEGMTDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuarySaturdayFridayThursdayWednesdayTuesdayMondaySundayu%c Inexact conversion to UTC from Illegal date format Usage: date [-qsuS] [-r seconds] [[MMDDYY]hhmm[ss]] [+format] SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZX |tl`TL@8,$GMTGDTU U \TL@4, |pd SSSS ((((( AAAAAABBBBBB   # K1$T$L su;SSSSutt QRP P2 UV5 F]E9uU:u5 1^UVW5 1=0x=9jF-0k TiJi@5 ljǁ}y 5 h4hk jj YFN"_^UV= 9 u  5 5 5 ^ 9 tGu!5 YPhxh 5 VhTh j Y ^U u]5 5 hh| 5 5 hh^ = t5 hh= U8VWE ME UIME E  hpYt  |hhYt  hdYt  hh`\Yt Hh\*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE$uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UlEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuELUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE Pk E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }"~y UVu CV€tu ,fNV~u>5,Yt.h YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvI =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]ùUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UUas U EUhThYYjYUVuYXZ[\]U rU MJwU uR}YY^U$EPufYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUu hT$u  UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv! =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇx tPXPbkwxdd: argument %s out of range dd: Short write, %d instead of %d dd: Write error: %s %d truncated records %u+%u records out %u+%u records in dd: Read error: %s dd: Seeking on output failed: %s dd: Error skipping input: %s dd: not enough memory dd: not enough memory dd: obs cannot be zero dd: ibs cannot be zero stdoutdd: Can't open %s: %s stdindd: Can't open %s: %s dd: bad argument: %s dd: bad argument: %s ,silentswabsyncnoerrorucaselcaseconv=length=files=count=seek=skip=of=if=bs=obs=ibs=unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 E@zXbld~i~oupu~xw h#m+c-^0riLQh;lFoEGX[b[cdefgino[p[rIsu[x[(null)cannot print floating point @-R-S`mdma`tl SSSSBUnknown error|`L8(p`P<(t`D0P P P P P P P P P P lP<,C   $51$T$L"$su;SSSSu( ( QRPY P<UPVW} UEI}u"hlw8hYYuEM)}u#hhwhYYuIM}uW:-u2uhLh(#d uh,h(#d jh;Y}u'gPFgYgP/gY]jjXIYY=thjCIYYhj5IYY=u hY}zwhgY=<v h|YEPEPwi2 u hZYu2YIu h=YhhIfYYhhIfYYuhIfYYEP5IVfYY=u5IhYYEPh-fYY=uhhYYE]9uhLhTYYjhIjeYYuhIh0{YYh,hIhaYYIuhIhPYYhhI)eYYRePQePhIe WIIEP5IWeYY=u5IhYYUԁ`tUԁt hY5I5IdYYI=u5IhYYjj5Id =u5IhWYY1thn)YhPc)YI I I1}PIpIFRdh$+Yh$-YD}wh$1YYfEUЅuhIdYh@YUJ$ $+ $iУDhEh$*YYh$2Y=uhIcYh06YhIVhb jm7Yu5hEh$)YYh$YDDh$"YZu#DEh$!Y7u2b#J#x$#$#h#j[YYxPQYPh$YY=F=It=Iu hIbYj6Y_^UVu'. &pW}^UVWu[ 8 u U 8 8 3 8 u1# V! Ydž8  V` YEu  E 8 < |8 8 u   8 @#< #8 9t  | 8 h h YH${$9@ u 0 8 8  $JiE98 u1VYU8 EPh' YYt;U9VwhH%YVYiE8 }H D  MH$th$YMV9Urhp$Y0V.YdžH$iE8 VYEPhhC YYtY}rU9shP_$YVYdžH$V+ViUJV ‰8 {hDdY Džt?u VWV* YYfEUt.V?YdžH$V+ViUJV ‰8  8 < 8  8 8 8 #< #8 9t 8 8 #< #8 9t oeh, YH$x ( /P$uh"YhYP$PV,'YYE=uh{"YVYU8 hYL$PY$8 $H$E}}7UB$]$UB$]$Eø6,8 < 8   8 #< #8 9t 8 #< #8 9t hYH$+wH$th!Ye$uht YGEPhhYYt=#U9UthL Y#URV&YY8 < 8 8 < u 8 @8 #< #8 9t zp8 8 Th4YH$uh$ Y.džH$1džH$%džH$^u$uV2YEtH E}},%:t :tEGˍ) %QjP4X)9t hYdž$% $uVoYEt %hjH PW=t hoYdž$%h YDžt?u WV&YYfEUt.VYdžH$V+ViUJV ‰8 PH$thY2VYEtVm Y2 h YV'Y=u $PXY %MYƆ$h Y,Džu ?tWP$PXYYV YP$uhYu hpY YP$PV!YYE=uhXY 5V3YdžH$U쉖8  E r_^UVWu~-J$$J$$Oϋ8 $H$$_^U VW}hD Yƅt>u uU:t& uhYEjVyVYYuVhYYwhVuRYYEuVhYYO$t"$%u $PVY %vKYV$PVYYU %LJ$%1_^UVuYƅt>u1("jjV8 ] 1="^UUM EPQ$1ѺY!ʉUDUEP$UYY=u h`YEPu UYY=uu hoYY1SE]9tU$hhGYY1.fUfUU~ EU9shPY1EUVWTǃu7h3)Yƅu5"jVVTVSYj(Yjj6YYjj6YYEPTYE9t}uhj6YYhj6YY_^U"#J#x$#$# h#j MYYjZ(YUhh(#\QYYU URuh(#rS ="t5"6YPhh(#Q hh(# QYYj'YUhIjSYYU$hIEP nU܃fUUރfUUfUEEPjjS UhIjjvS UVh#HY=L u$hY=} jhERYY܋5L L u XtOjKYƅy:[t 5L (j$YƅyL [ ^UVhJj4YYuRYjEPjXR jQYJ E%^UVW1<ǃt tǀt1uNh2QYNvuNhhQYN uƆ J JZ<} JW Y.#J#x$#$#h#jJYYNF>h'Y1_^UVuP 9u8T 9u&X 9u\ 9u^UUVWDž\Jh8!%YDžu1WP>YY=t1iPh4@YYLJu1FPh0@YYPJu1#Ph,@YYTJu#XJTJ#Ph(O@YYXJu1Ph$,@YYƅtVPY=u P Ph ?YYƅtV`PY=u T Ph?YYƅtV1PY=u X Ph?YYƅtVPY=u \ _^Uh#u u5LJ@ PLYYUVW$ +@U@H$i5PJhD NYY5XJ5TJh, N h MYh MYh MYh` MYh MYh MYh MYhh MYh$ MYh MYh MYh {MYh@ pMYh eMYWhYMYYWhLMYYuPVh-M u\XPVh` M _^Uhd YvUjjXYY5XJu5TJh LUjj,YYj h LYYjjYYUVWuh#5PJJYYVYVYVmYVYH PYV9@ u3Vi +F,غ#D )ډ;VV 9@ u%V i +F0غ#D )ډׅy1#D WH P YY H$Xg_^UVW}jjYY$$u  Ph TK Ah EKYAhp 8KY4h\ +KY'h8 KYh KY Gf$PQLYEuh h JYY4}$Ph JYY$URh JYYP$PKYEuh h JYYh rJY} N19u~7P$PzYF }T#J#x$#$# h#j DYYF1}7P$P,YFh IY_^UVujjXYYv@ h0I ~@ uh$IY@ uhIYV9@ shwIYrVV 9@ s h TIYR@ 9Vv h E} URjYYU4` hHYYEɀ~V+V9@ @ 9V}E#D H ʉU#D H eghijklmnopqrstuvwxyz{|}~ʉUvjuuW-GP5YE_S93Y|~tUtjjWV jjYY\hAGYdh4GYEPh| GYEYt@ 9VeVV i+8 ؋N 19>r/F8PWyYYt P6Wh> h>Y_^U#UU#U UURjYY#J#x$#$# h#j 8YYURjYY#J#x$#$#>h#j>7YYUVWU!׋U !ֹ@Pj!YY#J#x$#$# h#j }7YY@PjYY#J#x$#$#>h#j>77YY@jRYY#J#x$#$# h#j 6YY@jRSYY#J#x$#$#^h#j^6YY_^UUMU MUjRYY#J#x$#$# h#j N6YYUjRYY#J#x$#$#^h#j^6YYUVEPh;YYEPh ;YYEPh;YYE ^#J#x'Ut E01E$#$#$Uh#t E01EPS5YY뙋#J#x%Ut10$#$#>Uh#t10P4YYhqY E V^UE%E] }#]@5XJS5TJh:S}u5XJ5TJh: 2#J#x$#$#MEh#PL4YYU5PJjh84: j jYY5TJh(:YYU URuA:YY5XJh$9YYh#W0Yj:YUVWu}URj-YYU9r4~VhP9YYU+J44 hD9YYUzt3U <!9tURj.YYWh@I9YYFUR(UU__^UVuju $9 =u$h}YYhu$9 =t$hlNYY^UVWui$HE98 v8 H$u 8 H$u8 8 !׉ @ 8 )D u WV" _^U VWuH H PhV GF~u7FFF E F$F(WVF4~h$u3FFF @EF$F(WVF4RG=u h;Y#G=$hu h`#Y hHYh YFRYF_9^t(_9^v hY hYGFvSYF _9^ t(_9^ v hlaY h0YGF U1uFVV VVW9Vt(W9Vv h Y h2YWVV,V+VV0V$W t hY_^UVW}w  vhYb19wv%iW8Ni BQSW F19w v/i荗8 Oi BQSW F_^U$VWU8 ׉}u 6Y-Dž`UjW$6 =uU$hYYUhP$5 =uU$hzYY+Ur?#J#x$#$#.h#j..YYh#"+YE+19s5U 9uRBʉU :u<9tF끺+_^UVu8 t h(bYj8 $x4 =u$h4YYjE P$4 =t$hYY^UVW}j/W5YYƅu h|htK4YYWh4K4YY*tK)RWhtK4 FPh4K\4YY=tKuhxhtKB4YY=4KuhLY1E tKE4K_^UTVWujV3YYtVhaYY1EPVv3YY=uVh:YY1jh%3YY=uhh YY1jEPW2 =Uthh$KY3YYhh$K(3YYjEPh$Kf3 EPh$K2YY=tUā`uE]9pW42Y$KW&2YhVhM 1_^U4Vju 1YYuh#Y1dEPEPu u1Fju1YYtuhYY1 EPu1YY=tU܁@tuh|YY1uuYYu1jux1YY=uuh``YY1jEPVS1 E=TU؅uj EPu1 ufUfUV0YU΅~ EU9shHY15E/V0Y}uuh$YYuhYY1^U|VWu}V+Vi+8 ؋N 1E#D H ʉU#D H ʉUvjuuWxV+V9@ r @ 9Vwh0YaU9sh YEF8PuYYth Y/fE]SiYEUt5_M9t)}t]PhYYWUEU9V4~7}uGUOEP4V u E}uGpV4OjEP4V_u J}uG?V4BOjEP4V-u}uGhY_^U VWu} }iF$]9r}th\qY1j %, =u$PhH;YY1E+Eu VYYu1U PRV 19~$nE8u a~t }}tjuVu1"uV u1G뉸_^UVW}?vƃ} ubsh0Y1UjV %* =uU$RhYY1)uu unYYu1]U PRu U %VjP*9tU$Rhx|YY1 )_^UVuU 9Vw9VwhIY12V+U ڍ8 PR?YYthY1^UuYP-YUV5!Nx Z^U=!t!u\+YUVW( Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWu-Yƹ<!+F؉F!+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh"EP D>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h!VW ƅu1WW\(YZ׀>/u5Fuh!VEP ƅu19ut EEG>,t1jFh!VW ƅu1MWW'YZ׀>/u0Fuh!VEP ƅu1EEGu>t1_^UVWuE}>:tVh,L?'YY_!!!U! !U! V+'Y=Vh,L&YYVhKwYYƅ>-uF>+uFjVEP ƅUU!j hK5!& 1!KVhKYYƅpj hK5!& K>t>,tjVEP ƅt5U!>t'>,u"FV!&Y=xwVhKYYƅu_^UhYPLY!!!!UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JL"4EU M R+Q¤ЙЙUuW +UЙOIkkE0L"UM 9_^UVWuE!!E=!u!V =!u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t! F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+""}t}y UU_^UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf E5_^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^U="x 5"] Y""U="x=Mu M"j5M YY"y'j5" YY Pj5" 1U^UMU4T Q="u/hh M5" "1V0T M=4T Su1< "0T0T4T4T= u4T QU4TU4TU4T:u124T: t4T9Et4Tz:u1 UEUV="y~y1u1j:nY Stj:]Y$Stj:LYEtjju (S0S։,S4T: t$j,Yt,Ts4T:u S^UV3ƅt F9Eu^UVv ƅtu61YYuV^U="x 5"Y""U="x=8Tu 8T"j58TYY"y'j5"fYY Pj5"Q 1U^U8TUXY#tEPVu  u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5"t}uEF<:t ~u1 tFjuV uˀ~#uōFPY^UV5"t}u7F<:t ~u1& tFjuV uθ^UVW5"E 8t}u1F<:t ~u1 tFjuV? uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F) p)GF9GE UE 8E_^U VW\YEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EUi(U FE\Y_^UVuu>t FPUY^U$UUEPjj  U(VuEEV֋RUV֋RU E 'UUU UEPj7j ^U(VuU @t*u YEU UV֋RUUUEPu YYU UEPjjG ^U$UUUUU UEPjj U$UUU UUUEhEPjGj U} v"M E 1U} v"M ҋE!1UE1UE1U} v"M Et1UVW11}U9@#u @#F߃| jugYtUrYtURtUzt rvY}"t}#t}(#t uRY_^UVWuEu41}%<@#t4@#YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<@#t@#Bt 4@#aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<@#t,@#R@t@#Bt 4@#YGƒ~uFtYFF VVv vv% >uNN FFSX_^UVW}Wu uD ƅ~9})׉U U 1_^UVWu }!r_~y UVu CV€tu ,fNV~#u>5#tYt.h YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv] =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<@#tN|1DFρECEE0-EMP1E E U :t! EE E U uuuYYEy@Ut8hu YYE~" tuWYuuYYE}y1]jYEu u"Y1A!uEUMJUzUBU@#E_^UUUuuu 0 UVWu }E?t:JxG^FSX GVPYY=uEE_^UVWu1fϋV€t}u ~tu>FtVYU )uRvO EVt tfVV}u1_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UVW5"YNj5,#h#Yh(#Y}t.U:t&uYPuVT jh0VD WYPWV2 jh,V" _^UU Uh#uu& Uuuu  Uh#u u  3 W O   3 g H 'Wgw >UVWYE_^]^T$ L$ UVWM E_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWYh4VYYUR<"EMxGFFUR<"EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYYY_^UVuj jV' ^UVWYEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhL"u%dEuEu1k0Z‹N9}t EYu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=Y<9}r79}u+UOJ}t EYURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV< uY_^U VWUUb15Yt 9ur6E0tU UYtU9ru NJEtU9Wu RWE_^U$UUEPjj y U$1UVW5$$}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRMYY^UVWuU VVu%YYDžt~~yVډ"F_^U$UUEPjj U$U UEPuHYYEPj!ju U$UUEPjjW U$U UEPuYYEPjj) U$u~YEU UUUUUEPjj U$U UEPuYYEPjj UVu} t VփzuV֋RURE Pu ^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0{YE9uvEEEЃ E V!փ}u s"KV4YE=u"&UEUUU}׋U UE8t=+UEEE0YE܋]P3W9 }׃E뻋EEUUE8t=+UEEE0nYE܋]P3W }׃E뻋EEU9vGu%YEuUUȋUUEEEPj;j RY_^U$EPjj] U$UUU UEPjj9 U$EPj/j! U$EPjj U$EPuNYY1ۅÉU$UUU UUUEPjj yEU$EEEPj.j U$UUEPjjk UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj VYY5YhYjKj ^UU$VWEP YEPEPj jYƋ}t9uvEuEP{ YEEPEPjT WYUUjEPA YYEPV YWjYZ)‰jEPj jEPj" t9r)օu j YViYU)_^U$uFYEUUU UEPjj U$EPj$j Uu hT$u UV& T$@, T$@% T$@"E  uVu ^U$EPuYYEPj j U$EPjj y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VudYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UPJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEp E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPDYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuhYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^\'USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MkU}x}~uJPYYUUas U EUh h(#YYjrYU$EPjju U$UUU UUUEPj6jK U$UUU UEPj%j% U$} uEEUUE UEPjJj y}tUEEU$EUEPjHj UVW}u M)9r/r uu fE_^]t|{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ$tPXPRecovered %ld bytes, written to file %s Recover abortedRecover abortedThe (partial) last block will not be accessibleDevice size is not a multiple of 1024Error seeking %sCan not open %sCan only edit block special or regular filesCan not find file %sCan not open file %swWill not overwrite file %s/tmpWill not recover files on the same device as %s/tmpCan not stat(2) directory %s/tmpCan not stat(2) device %s//tmpRecover abortedRecover abortedPath name too longRequires a termcap entry %s -r lost_file_name Usage: %s [-w] /dev/device -w-rbdhoH4K     \   @ b m w 'z z e/?B}FG3I5 WX`bHcdfeghil mh n o p qz r s- u vy w x  }eHSearch string not foundSearching...No search string definedSearch string?Recovering...Must be in visual mode "word"Lost file name?Problem writing out bufferProblem writing out bufferVisual mode?Internal fault (mode)Word is more than 16 bitsStore word?Use -w option to open device for writingMust be in visual mode "word"Internal fault (mode)Output base?Search string not foundSearching...No search string definedInternal fault (mode)File name?Illegal i-node numberI-node?Block number too largeMust be in visual mode "word"Block number too largeBlock?Internal fault (mode)Can not open file %swWill not overwrite file %sFile name contains non-graphic charactersFile name?Illegal i-node numberFile is not on device %sCan not find file %sCan not fstat(2) file system device/bin/shSHELL : %s de: %cInternal fault (line buffer overflow)  krklkdkusesoclcmTERMk4@Ls RIGHT r Move forward %d byte%s s LEFT l Move back %d byte%s DOWN d Move forward %d bytes UP u Move back %d bytes s Store word p Previous address X Extract lost blocks n Next occurrence x Extract lost entry / Search W Write block exactly I Filename to i-node w Write ASCII block i Goto i-node c Change file name G Goto block indirectly g Goto specified block o Output base (h d o b) v Visual mode (w b m) END F Goto last block HOME B Goto first block m Minix shell PGDN f Forward one block q Quit PGUP b Back one block h Help %sDE COMMANDS%s %s Press a key to continue...%s%s%s %77c%8JyEh$_$hlR...Search = %20sFile = ...%17.17s File = %-20s %29snot a Minix file system V2-bytes-swapped file system (?) V2 file system V1-bytes-swapped file system (?) V1 file system (w) Device %s= %-14.14s not Data block (%sin use)I-nodesZone bit mapI-node bit mapSuper blockBoot blockBlock = %5u of %-5u (base %d)%5d V2 number of zonesfsck magic numbermagic numbermaximum file sizeblocks per zone shift & flagsfirst data zonezone bit map blocksinode bit map blocksV1 number of zonesnumber of inodes  V @I `j ~ combined I & Dseparate I & Dexecutablemajor %d, minor %dc_time %sm_time %sa_time %sfile size %lugroup %suser %slinks %d links %d, group %sm_time %sfile size %luuser %sxwrxwrxwrtguxwrxwrxwrtguunknown fifo regular block character directory %s(MSB)%'M&&&&(%d)'c'x''(padding) not I-node %lu of %lu (%sin use) (padding) Block %ld of %u (padding) I-node %ld of %d Offset = %5d ,++ ++Internal fault (output_base)%7o%7u%5x%s?%s%s%c%s %s%s Warning: %c%s%ld%sindirectzone %dtriple double Error reading %sError seeking %sCan not handle multiple blocks per zoneFirst data zone in super block suspiciously highCorrupted first data zone offset or inode count in super blockCount of zone map blocks in super block suspiciously highCorrupted zone map count or zone count in super blockCount of inode map blocks in super block suspiciously highCorrupted inode map count or inode count in super blockThe file system features will not be availableNot a Minix file systemV2-bytes-swapped file system (?)V1-bytes-swapped file system (?)Super block specifies too many bit map blocksError reading %sError seeking %sError writing %sError seeking %sInternal fault (unaligned address)A file name must follow the directory name/./devThe device containing file %s is not in %s//dev/devCan not read %s/devCan not stat(2) %sCan not find %sProblem reading directory %sCan not find a deleted entry for %sIllegal i-node numberCan not read directory %sCan not find directory %sCan not find %sFile has not been deletedInternal fault (file_size != 0)I-node did not belong to user %sI-node is in useNot an inodeNot in an inode blockProblem seeking %sFile has a hole at the endProblem writing %sProblem seeking %sFile has a hole at the endEncountered an "in use" data blockIllegal block numberSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown errorMMh$M$hMMr/etc/termcapTERM/etc/termcapTERMCAPzY 08Y18Y28Y38YEYb(Yf0YnYrYt YY\YYX[%Z+ Z2@ZdZiYrZOOPS[[[[[[[[[daldrGdwVdd+dbd : ??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0w wwwx Ax@vxyXybhydzyizyoqypyuzyxysz dz#iz+_z-Zz0nze}LM{h7{lB{k{E}G|XW|bW|c|d|e}f}g|i|n{oW|pW|rE}s|uW|xW|(null)cannot print floating point Yde (c) Terrence W. Holm 1989p\h`X ((((( AAAAAABBBBBB GMTGDT!!!!U U 4,$ xph\TH< SSSS/etc/group/etc/passwdB"#(#Unknown errorxhPD(xh\H8(hXL<( ##########lXL4xdPCZ  p1$T$Lsu;SSSSu QRP P UVW} 1:tFuJVZt :/u:/uFUU)UEU9UU:-UJMLE-0Jjhj uuj jhj j YE u9u~BFMMES}~Rjw YYE=u hYjYuY=u hsYuY}~^wYhwYYE=u h|7YjcYujY=u hhYu:Y=t =u/=u =t hPY(#(L(€t1P=L | =L~ h<yY=t=tj5(^YY=uB=uq=uc=uU=uGi342< LJ@9<s <@=Pt1D3H =u@L9H}+ H9r=TtH8=(u5=Pt,=~j5("YY=THa(,49,r,+4 U( ,j5,YY=D3s"#, DCDfM(p@9s=B 4I9v%#( + 4 DfM( 48(,98,+4 U( 09 8w ,֋,+4jU(pPYY,8u/U EPY=u h$YE=u hY}uFjY=u hjYuY=t hOYuzY;jjY=u h$Yu_Yt h Yu7YUVu= t15 55M 9 t4 jhYY=ut>tFjP5 u1PY^UU CP5 ZY = |5h55 =t hHY U$9|4h55G $jYA5 YUVTBT(5H)~f (T H! (H)ыH)ډ^U=h=|4hh(5G =t hlYA fU(fA  U( (9 s=(u1\P\Yf y>49(r(+4 U( (j5( YYU=uuuY=u"fU(#U CfM( U f=|Zf f =|4hh(5 =t h|YUV5Nx X^U=tuYKc{ wU$UUEPjjG U$UUEPjj' U$U UEPuYYEPjj Ujju U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjjm U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj  ^U$EPj*j yUEUMJ1U$UUUUU UEPjj U$EPuRYYEPj j U$UUUUU UEPjjS UVuYƋU rU MJwU uRYY^UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P[1ۇtPXP01234d+can't decompress not a compressed file output dup failed output creat failedinput dup failed input open failed [-#] [in] [out] Usage: dup(0) error close(0) error dup(1) error close(1) error fork() error pipe() error bad stdout write bad stdout write invalid data bad pipe read bad pipe write m F m F m F S S S ((SSSS  DD*m1$T$LDsu;SSSSu QRPt PU01Uh}jYY|U|UVWj YE1EPZ YUUjD Y5|ZuFEP4 YU+UUuj0Y-j0Y---B-B-B (-hRF YYhEP6 YY 1EP YUUj Y5|ZFmEhhEP YYEEPEPYY1ۅÉ9}}kE)EEPWu Euuh\h5-YEAE9*EjCP YY9Eu EPjYYE@EljUUЙ}NjU)k+EǍEPYEP| YU+UUuE1uE1+E؉E1ukd1uPE1uPuhh8UU1uPhYY_^UVu5-6 F N J 2Yzu:B RvYY- Rj q / 6V f^UVE ր=AuN+EE}u^U=-t-E d- R5j UV1=AuC 5B^UAUVu UuYu916=d~% Ed^UUUU EUVWU֋UM UA]VM4uB9UiE U4EiE J׋BUNiE _^UMMMME] 9tUV(BU UPSYY=uEAFE=W|E=Z}Xuu uYY~ 1^UUUu1UV5Nx -^U=tuYUVHU9HwUH9Hv 16V,Yt1'HrF5H&Y5H^UVW}u1E}UUs 1=Du8jY=u1V!փ5D5HFE5LOVU}9}r69v2W9UvUW~>}t ELu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=L<9}r79}u+UOJ}t ELURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Lt 9ur6E0tU ULtU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPVB yE^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^UT@ZdS<L1HA:3a ,% EU$UUU UUUE EPjGj( U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UU Uhuu cUSE] ![]USE] ![]USE] ![]UVW}u M UVW E_^]U$UUEPjj U$UUEPjjc UHVuUVUVUV UVUЋU UEPY^UVuEP[YjEPj Vd\5lhPjKj ^U$VuEEPj+j yUUVUVUV E^UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U s}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4 uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U| EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }f~y UVu CV€tu ,fNV~u>5DYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvH =tN V@FF t V 9ډUVVFt$jjv- =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UUas U EUhdhYYj.YU$EPuYY1ۅÉU$UUU UUUEPjj yEU$} uEEUUE UEPjJj y}tUEEUu hT$u U$UUUUU UEPjjS UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu  U$UUU UUUEPj6j_ {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P?1ۇ<tPXPThis machine benchmarks at %lu dhrystones/second Dhrystone(%s) time for %lu passes = %lu.%02lu DHRYSTONE PROGRAM, 2'ND STRINGDHRYSTONE PROGRAM, 1'ST STRINGDHRYSTONE PROGRAM, SOME STRINGbj   )@^XkbPdbiboYpkubxk[ L#Q+G-B0VML5hl*SEGX?b?cd}efgi}no?p?r-su?x?(null)cannot print floating point x1.1SSSS-B  `j H H1$T$L@ su;SSSSu  QRP@ P:UVu HVuYYL BL P$P$44L = uPPYYPPYY=Pt= ~1^U}}5HhxYYhpu uv/ E==LthljYYL 뭃=LthhjYYL늃=LthdjYYL5tY S D 5jY(EgU+L th<h@YYUVWu }EEhW@YYt WPYEhV@YYt V5YE}t+}t% Wu@YYVu@YY}tWhV`@YYt5Wua@YYh u?YYVu?YYVu<@YYhhYY}tThW@YYt2Wu@YYVu?YYhu?YYWu?YY'hhYYWu?YYVu?YY_^UHVWuYu YƅEPw>YYEPv>YYU܁uUR= uIEPEPu uJVWu u 8VWYY=Lu&h4/=YLQePtW3YtV3Y_^UVh<u>YYuT #h8u:YYƅu ujYY^UIh`hT<YYE= uh\hT<YY)5 hThT< @LdU5Hhhh r; u uh _; hdh M;YYj%YUUu 5H4 h !;UVW}? u+}F> t> tE>t FUEUG?u_^UVE/j/u=YYƅuuEP<YY VEP<YYE^UV5 t  7j YƺURYFt~uhhYY^UVu 5 ^UVWu }tu15u~tG^19uAvwa<YY1ۅÉ_^UVW1Su uYYu1;}tUzuEEE} tU zu] E E F뤉_^U VWhYƋV€BFuhvP3 u FV+t%? t u3YE= t}u G= u vY_^UVWu>t9~u 1҉VWpYF _^UVW} t+7t%>t6URUJUz_^UVW}Wօt W wYƅt/?uw7#Wzt~t VYG W2w_^UVu1҉VVF U V^UVWuE= t/= u&h`h`hThw8 >V9=Ltru h;8 z? t ?.t? uG<.uE}~? |}rz?tE?.u h 7Yl Jl xG  Ghl P2YYh7Yh7Yh7Yru hx7 VY_^UJV9?VYUARQYYuhX`4YY=LtVUARQYYl Jl x  chl jcL/YYUUMARQlYY= U9Uu8UARQHYYhT3YhPu YYhL3YWUARQYYhH3YWh@3YYh<u YYh8r3YU+U+ ډ >tV9t VY=Lll Jl x  hl j H.YY}t h4VIYY}t}t h,2Y}th(u YY _^UVWEE0Uzt 9tE6E_^UU u u9Uu|tPr2 UDVWU`UdR YR Y= uu uhh`+2u uh h`2hh`O#YYEu u uhh 0j Y uhh`* = = uh`h`hThR1`EPr12YYEP YPuh#1 dEPr2YYEP YPu h0  `-0= 2h` Yh`-0= sF>,uFVi Yl-0= sFhl>at%>dt >ctVhh / je YMFV Yp-0= sF>,uFV Yt-0= sFpt> t > tVhh / j YỦUЀ}au hEЌ}du pËh+ x l|=x xp+  t= xJ9}D=xx1҉1҉BxB=x9=lW{YEąuJl|un0YE9w!R5 YY9=huR/YYhR/YYuăR/YYUG$l|=9=tWYEąuJtut/YE9w!R5YY9=puR.YYhR.YYuăR.YYUG$t3uNYEt Uu ʃ~ P=x_^U VWB95V2YDžuJW..YE9w!R5YYhR-YYWR-YYUFVB95VYDžuJW{-YE9w!R5YYh|R-YYWR,YYUFVhl hh*YY9|5hX*YY55hH* =thl 5=*YY9|5h8*YY55h(l* =thl 5)YY_^U5`hh`s# t U9 uӸ`1U5dhh`8# t U9 uӸ`1U EPu*YYU@t1UVWuh@P) h<PYYu h4Po) h0PYYƅtuhhYYƅPhW( ƅPhV( REPPY*YYyDPuhw( ƅPhW;( uDbPu h3( ƅPhV' t PP)YYDuP|)YYhP )YYPP(YYu PC)YYhP(YYPP(YYPYtCP{Yt2PPh' PPsYYE Ph`(YYPh`(YYPPYYƅPhW& ƅPhVe& t9PuhZ& PhW%& =uǀt9Pu h& PhV% =uWrYt PV]Yt P_^U4ihxEP%YYhdEP%YYhXEP%YYh@EP%YYh,EP%YYsUJHMhEPQ%YYahEP?%YYOhEP-%YY=hEP%YY+hEP %YYUJx(MEPu EPuh$UVuYƅu 5Hhh # jY^UVuu VYYƅu 5Hhh z# jQY^UVuj jV ^UuIYP&YUV5 Nx ^U= t u$YUVW u'Yƹ<8 +F؉F8 +ډV YV YDžt"<1FF1V Y_^UV U9 wU 9 vD 16VYt1' rF5 &Y5 ^UVW}u1E}UUsD 1= u8jlY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV" uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh( EPF>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hT VW ƅu1WWYZ׀>/u5FuhT VEP ƅu19ut EEG>,t1jFhh VW ƅu1MWWYZ׀>/u0Fuhh VEP ƅu1EEGu>t1_^UVWuE}>:tVh YY_D H T Ud h Ux VY=Vh YYVh wYYƅ>-uF>+uFjVEP ƅUU8 j h 5D R 1@  Vh YYƅpj h 5H   >t>,tjVEP ƅt5U< >t'>,u"FVY=xwVh YYƅu_^Uh`YYPLYD L H P UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuET h E=@ u@ V =@ u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t< F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+D "}t}y UU_^U$UUEPjj7 y U 1UVW5  }׃}~9r }y 9vWYu_^UVW=P aU9L } L M :-uL zu L M h4YYuL L M P ǣD:tWuYYƅ}=H t=E h 0YYh hvYYh W9YYh j +YYL M P P :uL P ? F>:L M P C;t!A L M P CL U9L |W=H t=E h 0YYh hdYYh WhYYh j ZYYP ?`L A L M P 7L M P P :uP L _^UVWU :ru1U :wuǃtEPYx Ey1}xs >t-xP[YtLY11ۅPtSYY1t!YjuhhhjYTM x1tYu tYY_^UVWUzjj4YYEjj&YYEu%YEPY=t 94xuuEujYYujYYxE_^UVWuU VVu YYDžt~~yVډD F_^U$UUEPjj UVu x~D 5ju]YYy9uuVYVju5 ^U 2E Pu ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u sD KVDYE=uD &UEUUU}׋U UE8t=+UEEE0 YE܋]P3W! }׃E뻋EEUUE8t=+UEEE0~ YE܋]P3W }׃E뻋EEU9vGu5 YEuUUȋUUEEEPj;j. RY_^U(VuEEV֋RUV֋RU E 1UUU UEPj7j ^U$EPjj U$EPj*j yUEUMJ1U$EPjjQ y}tUEEUVW11}U9 u  F߃| jugYtUrYtURtUzt rY}T t}l t} t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv} =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVuJxFFSXVrY^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFFF VVv vvu >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } f:~y UVu CV€tu ,fNV~l u>5p Yt.hXYFu NLNHF 9h*YFuN!NF V@uVVVhUFt$jjvF =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv7 =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E *U :t! EE E )U uuu_ YYEy@Ut8huYYE~" tuYuu YYE}y1]jMYEu ufY1A!uEUMJUzUBU E_^UUUuuu UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UUURu uV UU Uhl uu UUURu hu'UUURuu uUEEUUUUU JUEPuu0 EUJUx ]E EPjpYYEUuu hu#gSUSE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhVYYUR<| EMxGFFUR< EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^UVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U l}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUPKYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЬUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVP`YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuUYY=u˃}t Uډ E_^UVWu }E$E)E EEE -t+u-U EMtJxFFSXV7Yǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVMYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G [E=cF}[t@}nt:JxFFSXVYEE uՃ}}nJxFFSXV?YE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPh8 EuEPh: EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE u:EuUEMtʋJxFFSXVhYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEGI띀?uEE3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY  EF EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh h YYjһYUh h YYj費YUVulYƋU rU MJwU uR!YY^U$UUU UUUEPj6jC UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj1 V0(58hjKj ^U$} uEEUUE UEPjJjy y}tUEEU jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE8UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7 u.`=}aaK1ۇ tPXP*?CbcPe}rNeed exactly two input file-names! CecceC:brUsage: %s [-c|-e|-C n][-br] file1 file2 cannot compare stdin (-) with a directory!/-cannot compare stdin (-) with a directory!/---a))w r--C %d-c-e %s: %s: cannot open file %s for reading %s: The options -c, -e, -C n are mutually exclusive! Assuming -%c Out of memory%s%sa .s/\.\././ . .%s%sdiff %s %s %s > --- < . %d a d . c d%dd %da. %d a %d,%d%d - + ! Unparseable input: %sUnparseable input: %s--- %s %s*** %s %sdiff %s %s %s Can't execute diff %s %s rdiff %s %sdiff -b %s %s--- %d,%d ---- --- %d ---- *** %d,%d **** *** %d **** *************** %s Only in %s: %s %s Only in %s: %s %s %s Common subdirectories: %s and %s //%s Only in %s: %s %s Only in %s: %s %s %s cannot execute ls!rls %srls %s  @` o@]`K9File %s is a %s while file %s is a %s FIFO special file character special file directory block special file regular file FIFO special file character special file directory block special file regular file %s: out of memory %s: out of memory SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ: option requires an argument -- : illegal option -- ---csh/bin/sh777777777?a?rc?wr??+?b???? ??? ?? ??:??:?? ???? GaGrGwG,H+Hb H L K@KMXLbLdLiLoLpLuLxLM M#M+M-M0MPLNhNlNNEmPGXPXObOc?PdPemPfmPgXPiPn'OoOpOrPs}OuOxO(null)SXSbSdSiSoSpSuSxSyYLbYhTYl[Y ZE^G^XZ[]bZc[dZe^f^g^iZn*ZoZpZsE\uZxZcannot print floating point cannot print floating point DpGMTGDT , , U U XLD<80(   SSSSBT l H ((((( AAAAAABBBBBB   HB1$T$LHsu;SSSSu QRPT PUVW}t!E 0hh mU zWWYZ9v ~/uN9v ~/tN9v ~/uN9u?/u P{Y)WRhh 1_^UV5Nx \^U=tuHYUUUuuu ` UU Uhuu> z U$UUEPjjK UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U $}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE<uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U!JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEdUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P? E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }>~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv  =uN ?jEPv4 =tN V@FF t V 9ډUVVFt$jjvq =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UW}0ʀuA)_]UVLU9LwUL9Lv8 16VYt1'LrF5L&Y5L^UVW}u1E}UUs8 1=Hu8jY=u1V!փ5H5LFE5POVU}9}r69v2W9UvUW~>}t EPu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=P<9}r79}u+UOJ}t EPURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Pt 9ur6E0tU UPtU9ru NJEtU9Wu RWE_^UUas U EUhlhYYjYU$UUEPjjg y U<1UVW5<<}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ8F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u5 U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ@tPXP%.*s . / Usage: %s path q @JnXWb<dNiNoEpWuNxWG 8#=+3-.0B9L!h l?EGX+b+cdiefgiino+p+rsu+x+(null)cannot print floating point XSSSSB  PQ#1$T$L ##su;SSSSu QRPx% P7UVuVhhT#; j7Y^UVWu }VWhhT#;j7Y_^UVudT)փvRh+=YYt h=Y^UVWuVI>YljJWZt:/uF_^UVW}E=hTu41} \uFu5#hTuE=#t"#Rhv<YYE#=hTthT<YEE195hT\Ph&<YYhTJ9~/<#J<#xP#P#,=h<#j,7YY-<#J<#xP#P# h<#j 7YYFshTE_^UVW}=dtuS=hTuJ=#uAu5dThHh#; 5dTh<h#e; #1195ЋdT9tTmxT9uXV YPh4h#: =tt5dTh(h#: h#h#;YY#Fh1_^U VW=1҉׉95xT~xTxTV YEPh:YYGz<#J<#xP#P# h<#j 5YYu;Y=s-<#J<#xP#P# h<#j y5YYh9Y<#J<#xP#P# h<#j 95YY{ЃtTgV YEtTuh9 Gu h8Y-<#J<#xP#P# h<#j 4YYFSt-<#J<#xP#P# h<#j 4YY1҉׉95%%P YEGuhN8YY<#J<#xP#P# h<#j 4YYu[9Y=s-<#J<#xP#P# h<#j 3YY4%ht7YYF;t-<#J<#xP#P# h<#j 3YY1҉׉95xTVYEtTuhdH7 GuUh`57Yup8Y=s-<#J<#xP#P# h<#j 2YYhT6Y-<#J<#xP#P# h<#j 2YYF%t-<#J<#xP#P# h<#j t2YY_^UVW109~%$#J$#x8# h$#0YF55#h26 h%6Y5h6YY=y h5Y h|5Y.t hd5Y. th85Yh 5Y,545dTh5 `TdTdT94$#J$#x8#8#SX h$#/YЉօudT94udT:j}YEtuh5YYЋVYdTd_^U VW<#J<#xP#P# h<#j 0YY. tdT8U84U585dTht4 `ThT#U9dTjYƅtVOYVh$4YY=hT|'j1Yt=y5dTh3YY$#J$#x8#8#SX h$#;.YЉ׉ hTChTȈ\dTJhY_^UVW<#J<#xP#P# h<#j G/YY. t<8U84<U5<5dTh3 `TdTUU9dTs@jFYƅt*U9dTvuYdTUVh2YYdT뵋U9dTv uPY_^UVWu 6sY#>:-uE0:t5#Y5#Y뻋=ot߃=u 땃=u 5#WYq=u5#=YCj52YYDžy.5h8P1 P5#YY=tJh<#h45 0 u.5hP1 P5#YY=u5#hhT#/ j0h,W"2 =,u =-t.5hP1 P5#ZYY=/t.5hP0 P5##YY0 1҉PL1҉XT84 0щPL L PH~h5#YY~h5#nYYljW0 9tht5#6YY?9}!jՀ%PW0  qjWO0 9thh5#YY\9}$jlTPW0  5#hLhT#K- W/Yh$#hH5L- u.5h,P. P5#YYj(Y_^UVW}1}(Ѐ0lTtЊ0lT$FƆ$$_^UVW}} =195U 9%q%]%PWYPu.YYt8yWhH EP- Wh@ EP- EPu.YYFm1_^UVWh$uu+ t $1=`Tt`Tt E E 1E95ЋU9tTgxT9U u }uJ=`Tu;. u2}y}u$kE hk] hU9~}uFq}xu Ya}uuh\ h${, ?dT+U+UډUyuhT h$Q, uhL h$:, $_^U VWE#UU#UU#U U8#U U#U UdTU}tEUU~E}}dT$#J$#x8#8#SX h$#%YЉ։ hTChTȈ\dT$#J$#x8#8#SX h$#p%YЉ׉ hTChTȈ\ UhdT$#J$#x8#8#SX h$#%YЉ։ hTChTȈ\ƀt1 U}U UU4h$$f+YYh h$$E+YY}dT$#J$#x8#8#SX h$#c$YЉ։ hTChTȈ\dT$#J$#x8#8#SX h$#$YЉ׉ hTChTȈ\ UujjuPh$$m*YYU4(h h$]) h$h$$;*YY}uh h$$*YYh h$$ *YYuh h$) h$h$$)YYU4Hh$$)YYh h$$)YY U U4h$$)YYh EF;}dT$#J$#x8#8#SX h$#"YЉ։ hTChTȈ\dT$#J$#x8#8#SX h$#_"YЉ׉ hTChTȈ\ UujjuKPh$$(YYU4(h h$' h$h$$(YY}uh h$${(YYh h$$h(YYuh h$T' h$h$$2(YYU4Hh$$(YYh h$$ (YY+U U4h$$'YY E9h h$$'YYU UU4h$$'YY$$_^UVW}W'Y-ƅx:,u N_^UVu=`Tt =`Tuk`T`T `ThT hTChTȈ\^UV=h %Y=xdT+hTRh %YY195hT~\Ph %YYF<#J<#xP#P# h<#j b!YY^UVWu }Wh8 [%YYVh$ N%YY_^UVu`TVh ,%YYЃuЃt/<#J<#xP#P# h<#j YY hd $Y^UVuVdY.u `T&t 6t>u `Th $YYt^ULVW}W Yh H$YYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\jVW Ph #YYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\Vh p# !dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#YYЉUЋ hTChTȈ\Uu ֋dTJEPRV t Ѝ]Sh " 9Vh h" WY! 5=_^UVW}WYdT$#J$#x8#8#SX h$#oYЉUЋ hTChTȈ\U€t1 udT dTRjjjQ;Ph !{_^U0VW}WYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\dTUE!U8!U!Uܺ!Ut }t }t}uVWEYYmU4h$!YY}uht h$!YYUU~E}}dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#MYЉUЋ hTChTȈ\U UԉU}}dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\U UԉUdT$#J$#x8#8#SX h$#!YЉUЋ hTChTȈ\U€t EEU UЉUdT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\E9dT$#J$#x8#8#SX h$#KYЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\U UԉUE}dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\U€teE! /hp h$YY}u$ujju<Ph$YYU4(hh h$ h$h$xYY}uhd h$\YYh` h$IYYuh\ h$E h$h$#YYU4Hh$ YYhX h$YY+U U4h$YY ( E.hT h$YY}thP h$YYhL h$YYuhH h$ h$h$nYYh$hD IYY=_^UVWuuYdT$#J$#x8#8#SX h$#pYЉ׉ hTChTȈ\t tttu@tjWV UPhx  s_^UVW}W YdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\ t VWYY,jVW Ph  _^UVW}WeYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\8t VWYYJh FYY!jVR* EPYuh YY_^UVWuYUh YYdT$#J$#x8#8#SX h$#*YЉ׉ hTChTȈ\dT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\ Rh 5YYdT$#J$#x8#8#SX h$#vYЉ׉ hTChTȈ\dT$#J$#x8#8#SX h$#&YЉ։ hTChTȈ\ Rh YYu_^ULVW}W Yh MYYdT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#0YЉUЋ hTChTȈ\Uu ֋dTJEPRVY tEPh iYYpVh WYYadT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\uh YY_^UVWu}YdTUdT$#J$#x8#8#SX h$# YЉ։ hTChTȈ\dT$#J$#x8#8#SX h$#YЉ׉ hTChTȈ\ ֋Uh YYUt-4ujjVPh  0ujjV_#UP4h  _^ULVWu/Y#UM4h ` dT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\UdT$#J$#x8#8#SX h$#DYЉ׉ hTChTȈ\ UdTJEPRun tEPh ~YY,uh mYYPtVh PYYD_^UVWuYdT$#J$#x8#8#SX h$#z YЉ։ hTChTȈ\dT$#J$#x8#8#SX h$#* YЉ׉ hTChTȈ\ ֋UVh w j_^UHVW}WYdT$#J$#x8#8#SX h$# YЉ։ hTChTȈ\8tVWYYh, YYu-<#J<#xP#P#bh<#jb YY!!jRQ EPYuh$ tYYdT$#J$#x8#8#SX h$# YЉ׉ hTChTȈ\dT$#J$#x8#8#SX h$#Y YЉ։ hTChTȈ\ ֋dTJEPRV tEPh YYlVh YY]dT$#J$#x8#8#SX h$# YЉ։ hTChTȈ\Vh (YY_^UVW}WYdT$#J$#x8#8#SX h$#N YЉ։ hTChTȈ\8!0uVW7YY8!4hD YYu-<#J<#xP#P#bh<#jb: YY!!jRQ+ EPYuh@ YYt h8 Y h0 Y_^UVW}WYdT$#J$#x8#8#SX h$#$ YЉ։ hTChTȈ\ t VWYYhH jYY^_^UVW}WYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\VhL _^U VW}WoYdT$#J$#x8#8#SX h$# YЉUЋ hTChTȈ\dT$#J$#x8#8#SX h$#YЉUЋ hTChTȈ\Uu ֋dT dTIdTRQjjSPh\ _^UHVW}W^YdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\!!jRQH EPYlh 9 YwVWYY;h  Y\h  YOh  YBh Y5h Y(h Y]փ8t u-<#J<#xP#P#bh<#jbuYYuh z YY8t5<#J<#xP#P# _h<#j .YYLdT$#J$#x8#8#SX h$#rYЉ׉ hTChTȈ\dT$#J$#x8#8#SX h$#"YЉ։ hTChTȈ\ ֋dTJEPRVO tEPh _ YYlVh P YY]dT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\Vh YY_^UVWuVyYdT$#J$#x8#8#SX h$#YЉ׉ hTChTȈ\!!jRQc EPYhhXQ Yu-<#J<#xP#P#bh<#jb YY<#J<#xP#P# !h<#j YYhPYu-<#J<#xP#P#bh<#jbYY<#J<#xP#P# h<#j dYYghH[Y}tOh<CYet7h4+YPt"h,Y;t h$Y&WVYY/]׃8 uh YY_^UVWuWYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\!#MjRQ@ WYWuh0 95hT~\PhYYF_^UVW}`TdT$#J$#x8#8#SX h$#6YЉ։ hTChTȈ\\PhYY95hT~\PhpYYF_^UVW}WYdT$#J$#x8#8#SX h$#YЉ։ hTChTȈ\| VY Vh _^UV5#Nx d^U=#t#u|YUVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }#^N~y UVu CV€tu ,fNV~<#u>5@# Yt.hLYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv\ =tN V@FF t V 9ډUVVFt$jjv  =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu 4 UVW}EEL#WUWBYwY}t Et%u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=t%<9}r79}u+UOJ}t Et%URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t%t 9ur6E0tU Ut%tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U#1UVW5##}׃}~9r }y 9vWYu_^UVWuU VVu) YYDžt~~yVډ#F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U @? }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEXz uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuvYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЀUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPZYY=t6JxEEFFEEVP$YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPvYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuEu41}%0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVW5<&YC'DžD7uzYYtw>t6ubYYt} tu w FYYu=<u&_^UVuFPFPFPPhh ^U VW}EJxGGSXW Y=u #u Eà u E뵃}u ~U U:t;uU EXU 9Us U EJxGGSXW Yƃt ~ :t;ut WV YYUU _^UVWU:u1j/uYYƅu u;'Y] /FE 8u11-0= sF-0k ǃ ~1x>uu1ku1 )Ѻ )У@@ ʋ @ ы@ ʋE_^UVWU-A=w U -A=w *uE U :*t-A=w u jt@9u U MRQ|YYtBEU-A=w 1"tu 19u@9u EE 41_^UVWEjjEP" ƅM6u  YYu !Yƅt2~u,1V<t!jEP47 u EGփ}t uYPu YYE_^UVWEPh1nuC y Ut9Uu h$5 SYYEu1ۃ= tCDžDžDžDžDžPuYY=:u Džу;uDžDž붃t\Pu YYtu PpYYtm`DžQlu3h P3 YYu(Dž-t3+t.}P5 hh$ au+u1u@1ۃ+uC9u-uPPPX t-3UM-u5uPuYYu PPYY-uu9Y%uPu^YY}t1u@SPUYYh P Yhh=YY=@PzY@Pe YuNN FFSX_^UVWEE11<< tN|1DFρECEE0-EMP1E E (_SU :t! EE E H6SU uuu#YYEy@Ut8huA1YYE~" tuYuuYYE}y1]j YEu ujY1A!uEUMJUzUBU< E_^UUUuuu 88 UUURu huUUURuu u_UVWu }tV€u4V9Vu>t FN~U9tUE_^UEEUUUUU JUEPuu`7 EUJUx ]E EPj>YYEUuu huC///0;1s111K2p221224?4UVWu} Mr6 u.uAfA(_^]UW}0))ϊE tu1_]XG_]?UVW@E_^]@UVW u@Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UV U9 wU 9 v 16V ,Yt1' rF5 &Y5 ^UVW}u1E}UUs 1=u8j+Y=u1V!փ55 FE5$OVU}9}r69v2W9UvUW~>}t E$u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=$<9}r79}u+UOJ}t E$URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV@= uY_^U VWUUb15$t 9ur6E0tU U$tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPJ>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WW8YZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWYZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_   U  U VY=VhYYVh(wYYƅ>-uF>+uFjVEP ƅUU j h(5 7 1 (Vh(YYƅpj h(5 7 (>t>,tjVEP ƅt5U >t'>,u"FVY=xwVh(YYƅu_^Uhhm7YPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JX4EU M R+Q¤ЙЙUuW +UЙOIkkE0XUM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FyDžy +֋U  }u}t }t&9=,t U9UtQ=,UŨ}u1(}u U uu0YZЉEE1UUs-UEȉEWVR3, UUE;}tEE  D1_^UVW}-0= >N>.WY=uD1= $44(,0 X-0= r>.uF\hPjjW y1jPi _^UVW}}t1PGPGPGPhlPhPj jP@ Ey1HjuP ƅu1*UVU V _^U=uhhYY 5)YU <U=t5Y<UVW=u!hh3YYu1D5hh% Eu1U:#thu YYƅtUhuYYEtEU: t: uEhuYYƅjFu+)Y%f  ى 5hVWYYƅtFt8>t3> t> uFds7hVYYƅtF_^UVW}Utu >t]9uFG1_^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E5} tF=@ @ ً@ ʋ @ ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U<4}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!72+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#Uj1>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWPum$=u hPjjjuu uj"($ƅDuuVPƅyD}Gu^fWf  uL0D7D+DDW(/_^UVWEPuM#=u N DuE>t >.uEF}u)uYƅtuuuu V_}u P€u$}N>.Pl?quuuu 7uE~= ;uDl=DuE=Dt =DuPt놃}t"uuuu ju%E~}t D_^UVW}} uBWt uF>nuP. YYuF u>tDG?t uG1҈ghVhhI u&Yh uY1_^U@VWEEEUUЋUUE=Pu =u Pu } ~1EUffUEL9UYET9U;}DžLU=y2UMEPUdP4Xw =#U f  فfMjEP5 =t$ U5Y^u u5 9E t$ U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tB U57Y}<}EM}ff  ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$ U5[YUJÜJU+UfUU܅VU܁vE܉VP5& ƅU)fU멃=yy U'UMUdP4Xu u5(9E MHUԃ}~ Eԙ=TEԃ}Euuu5E=u= EEUM9uP u+UBt"5YE}tPt}u Pu5YEaEE=x5WY}u}u  ; = Uȉ _^U=t5YU$VWhtYDžuhjWYYƃu EE1UUfU fUEPh0n@V E=u EVlYGEEPh2n@Vv E=u EV0Y E_^UVWuut.Vu u Dž U)U U )΋E_^U VWhYDžujWYYƃuEE73EPh@n@V E=u  UVjYU _^UVWURYƅu wUWfUfW fG #UfWuu FP URVul E UVEY}r UUU E_^UhEjYYjwYUVWURYDžu hEjYYEu*YEURWul Ƌ Uxw7~1WYjYujBYYuYU @RGPu x WAYjYujYYuY_^UVWEEP4YNjE E P"Y9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRQYY^UVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$U UEPuHYYEPjju UVu x~ 5juIYYy9uuVYVju! ^U4VWEj/uYYuhYƅuVEYPu6YZEЃeu*YE=u }؀>t >:tFG9}s/GuWYYEPuYY=t4 2u u^ = t  Ũ}t} uFuURYỦ _^U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjj U$UUU UUUEPjj_ yEU$EPj*j9 yUEUMJ1U$UUUUU UEPjj U$UUU UUUEYEPjGj U$} uEEUUE UEPjJj} y}tUEEU} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$EUEPjHj UU$VWEPf YEPEPj jD YƋ}t9uvE LEPYEEPEPjl W YUUjEPaYYEPnYWj YZ)‰jEPj* jEPj: t9r)օu jYV YU)_^U$uYEUUU UEPjjl U$EPj jQ y}tUEEU$UUUUEPj j y} tUE EUVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEVuVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U0 eEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U` JxUʋFF Vu.YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P_ E6U U RU U RUEEE uE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPpYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP.YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu}M } ~/JxFFSXV芾YE=t G} uȃ}uVt 9}u1 1E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } v~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvb =uN ?jEPvL =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvS =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UjjuM E`  USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVWME_^]UVuj jVǬ ^UVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWhEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhXu%dEuEu1k0Z‹N9 t> uF>t> thVhl j hl豺YYƅtDždjhD P 9> t> uF>> hVhl j hl(YYƅtll7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj h8 P Q=TD> t> uF>(> TXPVYYTff UdTuȱY=Tu"XffdT=lu=hP>YYu&j.P貸YYƅtFPhlYY]lllE>t >.uEFl}|xsj.VHYYF7M P1_^UFtVYU )uRv EVt tfVV}u1_^UVW}u M)9r/r uu fE_^]t|UW}E Mr/u'uĉ fE_]L$ U Vjh 譯YYƅyHu uV袯 EVVY}u"U JUj u,YYEt1^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s %s: %s: %s Usage: %s [-d] [-m maxclients] service program [arg ...] dkmtMs%s %s: stalling %u second%s %s %s: Connection from %s:%u Unable to listenforkpipeCan't set TCP optionsCan't configure TCP channelCan't open /dev/tcp/dev/tcp%s %s: listening to port %u %s: %s: Unknown service tcpunknown error%d.%d.%d.%d/etc/serv.accessdeniedgranted%s %02d %02d:%02d:%02d service '%s' %s to %s /usr/adm/log%s: strange check word '%s' logrWaDrw.+{bqNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ%u.%u.%u.%u.in-addr.arpar/etc/services ,/ # r/etc/services!4!4333y54(5|7t77/8768:9:99::%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEPATHIIIIIIIII}N !N@VNzOXcObHOdZOiZOoQOpcOuZOxcOSP DP#IP+?P-:P0NPESL-QhQl"QKQERGRX7Rb7RcRduReRfRgRiuRnQo7Rp7Rr%SsQu7Rx7R(null)cannot print floating point nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomaindbc/etc/hostname.file/32JanFebMarAprMayJunJulAugSepOctNovDecSSSSB $ ((((( AAAAAABBBBBB Unknown errorx`T8$xlXH8(xh\L8 |h\D(t`CGMTGDT U U `TLD@80(   `O\X1$T$Lt\su;SSSSu  QRPHPVUV1(A!xgEON}t(}ruPu 6YYy,6fEhVu 6 ExUx^UVWhPu6 ƅc19}ى)R=Pu6 ƅ;uD 5x0+YPu5ThPhf4j5Y럅y05x*YPu 5Th(h.4jY_^UT TRRQQhlh3jYUTVWE j/007YYTu ] TT1҉UUUUEU9UzUM :-hUAMM U:-uztHU:t+EEEEˋEE[LUUUUt1҉Uփ}uU9U}UAMM 4}t*uU9U}UAMM Uu1U9Ut4t5Thh2 c4fEu9]S-YE܅uV]S5ThhO2jY/V-YE܅u!V5Thh2jYUt/UB]9t 5Th`h1 jYE܋0UfRfUj?3YjzYVh$ hXEPx2}bjrEPj Džy15x*(YPEP5Th@h_1j.Yh8jEPW]W2Y}tSEPB3Yy15x'YPEP5Thh0jYVh1YYE}EjruPO Džy05xc'YPu5Thh0jhYVu YY~=PujGYjwEPj Ey15x&YPEP5Thh00jYEPuuW/W1Yu1YVh0YYE}hh].YYE\1u,YE=t-} t'-0= r1U0k ׁ0ur1vjWa1YYuE}t 5ThhhQ/ j YhD/Y1_^UVu B?!։U! tى^UtVWu~?t F8o~>t \V8F8PYPEP GEEPEP GE};~ EE}~EEEă}~1҉UUEEȃ} |1҉UUEEE̋U+U~ F8~=cU#MȻL uE1҉UUELU#MĻLu1҉UUEU#MLuEEU#MLuEEPEP MFEEPuYF8ǃ~8u5UBlMuuuuRQhj F8U9Uu U9U}u hXYEPEP EEEPYF8E~8u5UBlMuuuuRQh|jY F8 U9UuU9Ut$}t h@Y9}| hY~8U9UuU9UuU9Ut1҉UUE~=t"U#ML(^~<tX9V8} V8X_^UVE0> t> uFu> t> t > t>tFE0E^UVW1} UGu > t> t > t>tFEu >uuhj 1V>*uM~uG}9}|#UU! ˈG؋EFEE>?u};u~-th\[YxF=-0= 1F-0k 9}-0= r9}v>-yF-0= :EF-0k] É]9]7-0= r9}UU! ˈG9}}>:F-0= EF-0k] É]U+UB9U-0= rσ}9} +U}9}|BUU! ˈ։UU! ˈ>t F<,O U#t9uuUȀ:tEȀ: tjD? YNj]}UWEPj;jGPVutu EEPYƍEPjjGPVu@u EEPYƍEPjjGPVu u E{1}G-F>-uV9UuEPYu9uv^9uu EPuY9ut%U)RVFPR& UBVW0uFPuhjpEF=utЋUztRW0w49ut >#gUȀ:tEȀ: uEEȀ8 tuhj  EUȀ:LE = u UȀ: u0EF҉uȋUȀ:tE = t >%u F\W8G>G?G@WY}t UB_^UlVWu$YE}h\sYPEP [;Eu`$YE&EE8 t28 .uUUz.tUUB-0= sE‹E8 uUUzuj$jEPv$ URcYEU 9U}EdURBY@EU R1YEdEEUEEPYE=uEEPYE=U9UUUUREP1$YYu"Y} juYu"$YP^YFuv#YYh\v#YYEPv#YYu#YPYFuv#YYhTvv#YYEPvh#YYFF FP5PjDYljFwG0vu[#YZƒW4UW8G>G?G@X9W8} W8X_^U VWP7V~t FVUtEVu]YvRYvIYv@YV9Y_^U VWEX=PMwtBU9V@uF@VKY~@u"X9V8} V8X\9V8u6뺋?뫋E_^UuzYUjmYU VWEp1@iU ! t uD@t;WuhhuJ9tJRhdu E`F_^U0VWuPU}UrhV> UzuUBPhV U RYPhV UzF?thVYYdGPVYYVj YYGPVYYVj YYGPVYYVj YYG PVYYVj YYG(PV|YY0tUR9W0tw0hVT hVFYYW4UU:t#VPLYYU: u Vj :YYEVj +YYG8PYPEP 5}tPEPYPhV@tw@htV ?EU@_^UuqYEuhj=YYjBY`EU}tuNY `UUH UUU5Thh uu h UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VW\hV;YYUR< EMxGFFUR< EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY\_^UhuYYUVuj jV3 ^UuIYPYUV5L Nx d^U=P tP uYUVW uYƹ<l +F؉Fl +ډV YV YDžt"<1FF1V Y_^UV|U9|wU|9|vx 16VYt1'|rF5|&Y5|^UVW}u1E}UUsx 1=xu8jY=u1V!փ5x5|FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVt uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE             =0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh\EP->M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWpYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWYZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVhSYY_x |  U  U V?Y=VhYYVhwYYƅ>-uF>+uFjVEP ƅUUl j h5x  1t VhYYƅpj h5|  >t>,tjVEP ƅt5Up >t'>,u"FV5Y=xwVhYYƅu_^UhYPLYx  |  UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuE E=t ut V =t u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}tp F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+x"}t}y UU_^U$UUEPjj y U(1UVW5((}׃}~9r }y 9vWYu_^U=x 5YU=x=u |j5YYy'j5YY Pj5} 1U^UU =u/hh5 1V= u1<   = u U U U :u1 : t  ::uҋUEUV=yy1u1txtjƅtjjV fLƅtjjV /t!yg :X^UV%ƅt F9Eu^UV{ƅtu66YYu[^UVWuU VVuiYYDžt~~yVډxF_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U(VuU @t*uvYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 41YGƒ~uFFF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E (+U :t! EE E HU uuuKYYEy@Ut8huEYYE~" tuYuuYYE}y1]jEYEu u^Y1A!uEUMJUzUBUE_^UUUuuu UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UU UhuuR UUURu hu?UUURuu uUuuu UEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huoO[ooUSE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]UVWE_^]UVWME_^]UW}0OE uG_]1_]U=P tP j#YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW$EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE Z uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U i EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UH JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEh y E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv} =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }P I~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv} =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh hYYjYU$EPuFYY1ۅÉU$UUU UUUEPjj3 yEUu hT$u U$UUU UUUEPj6j {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇTtPXPhr]hhhha%s: Read error on %s: %s End of file%s: Write error on %s: %s Usage: %s -c [user] file # Change crontab %s -l [user] # List crontab %s -r [user] # Remove crontab %s -p # Tell cron to reload ckltpr}Cron signalled to reload tables %s: Alerting cron has failed; cron still running? r/usr/run/cron.pidNew crontab for %s installed %s: Can't open %s: %s %s: Can't open %s: %s Crontab of %s removed %s: Can't remove %s: %s stdout%s: Can't open %s: %s %s/%s%s: Only root can change the crontabs of others! %s: Don't know who you (%s) are! %s: Don't know who you (uid %lu) are! %s: No root privileges? Assertion "nodst_rtime > dst_rtime" failed, file "tab.c", line 194 Assertion "!tmptm.tm_isdst" failed, file "tab.c", line 188 mktime failed for %04d-%02d-%02d %02d:%02d:%02d Assertion "tmptm.tm_isdst" failed, file "tab.c", line 164 mktime failed for %04d-%02d-%02d %02d:%02d:%02d%s: field '%s': values out of the %d-%d allowed range %s: field '%s': bad syntax for a %d-%d time field %s: not enough time fields %s: contains an empty command %s: bad option -%c, good options are: -u username %s contains a null character %s: %s%s: %lu bytes is bigger than my %lu limit %s: %s /past//,-%d%s%d pid = %ld (DST) rtime = %.24s%s -u %sAT jobtab->mtime = %s(root)tab->user = "%s" tab->file = "%s" Out of memory, exiting %s: ??? ??? ?? ??:??:?? ???? SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown errorA22A22A22'2'2'24a4r4w45+4b4No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0@ Q@@@AXAbxAdAiAoApAuAxAB tB#yB+oB-jB0~BuEL]ChGClRC{CEEGDXgDbgDcDdDeEfEgDiDnCogDpgDrUEs!DugDxgD(null)cannot print floating point L/usr/spool/crontabs96.365.1546.00GMTGDTT ` T ` U U tldXLD8| SSSS/etc/passwdB ((((( AAAAAABBBBBB Unknown error x ` T 8 $  x l X H 8 (  x h \ L 8   0000000000|h\D(t`C  9Q`1$T$LH su;SSSSu  QRP0`P&UVu=_tPVh(h (jY^UUJUˉUVuVNVʉ^ULVWfE1U1_j$EPjjjEPhjEPmYǍEPaYEЍEPTYE̍EPGYEu EPOYEEP)YEȍEPYEčEPYEEPYEu EPYEUځUt58`hPh ' F}s"} tu58`h(h i'Fu58`h h L' F}u58`hh -' F}t"=_t58`hh ' F}t58`hh & Ft 58`hh & jY}uEUU+U+UЋMR1Z)M1%f_Uׁf_U׉_U_Mщ _#Uf_Uf__~  _~58`hh % FjEPhj)_jEPRj UM9t58`hPh % Ft 58`h8h i% jY_^U VW} 70YfEE058`hV'YYu _ZhV'YYu _=hV'YYu _ 58`hh $ jY}u7YW:-owF>Y>lu=_t _<>ru=_t _">au=_u _7BYFE@fEE9Eu7%YE4'Y=v]U@fE j/5 s&YYyh{%Yfh$YjYQU@fEPYE=A| E=Z~7mY MJ=_t1P5 %YYy35L YP5 58`hh #j&Y}_ _RhQj<=_tX=_tOjj_PhE]Sh$YY}u h$Yuh#YYE<_=_u7UY=_t h#Yjj_Ph=_tFhh kYj(YE4>t>\u/ P]YFN>/uEj4YYjhYY=_t=_th<_h#YYE4j_PhLE=_t.jj_Pu)=_k=_tuY}t\hh nYUB th<_58`hh !E458`hhh jYjjYY=<_t?E4YP_Ph<_j_PhQP' E4_Ph 5!Yhh YjRY1_^U(VWu}EUfRfUfEE}>/t">.t>t}}FU܉AM܈Dـ>.FEFU܉AM܈D>/t*>.t%>t U؉AM؃}FU܉AM܈Dр>/t>tFUU_9U t'EPYljEfUfUEPYfEEU 9UQfU}hUtU}uU _щ _%U __Mщ _$UG t}U.U}}W fU}u1EPW5 YYE}uEP YY2UuC=_u >ohh EYEP58`h|h jY>>u9=_t0hh Yh<_58`hdh jY>tFPj_PWAǃ}t"tj WhOo OuY}u uW YYIUtAuh<_hP juYYjj_PWjjYYE܃ }t uYU$}@=_t >u1hh YEP58`h8h ijY1}u+hh Y58`hh 1 jHYj YfEEPEPMYYhEP<YYU ___Ph.t>tF؀>.t>tF>.uFDž} >.t>tFWDž }W G fGPPjYYA)A_hQYYPPYY_J _Й%f __PRj Dž9}^WufWf%PP YYffBf듋958`hTh  WthP YYWW&Yj W5_j = tx _^UVWj^Y-fEfEy1Eu3E9u+UUBfUĹQ%fEUiڀQ)ۉ޹%fEUi)ۉ޹<%fEUk<)ۉ޺!fUEu%f 1U } 94UBfUBEPh WZYQZ)ځfUUBfUU M U ʁMfQU M U ʁMfQ_^UVW}`fEE=}EFE@fEN> t`s ht YF t2.FfEE=}ELFE@fEN> tFU t/F`_^UVWuU Uu9uq= t F ދP JP xd d SX hP Yǃt%=_t u F 덉F놉+U_^UVu ta-Pt-wPts-Pth-Ptd-Ph^UVWu} fVfUfVfUfE?t&?/t!GUS@fEZTED=_uEPh(RYYF PYEPY=sPEPh  fEF tFfVfUEPYfE=t ]Cf]E_PhYYvhYYU ¼MI]E%RU 4 SPRhZ_^UVW11fE_M9}.GFEP>Y,!UBfU_Rh`YYt_RhDYY_^UVW}_PYƅu 58`hxh  j4Y ___PVRjO_^U_  9}) P_Yt Bf _  9|1aUf  f _  9}) PYu Bf  JM fU_  9}) PYt Bf Ń}t2_  9| 58`hh  jY Af  U VW=_= te5_1Y_u@h Y_u 58`hhh ? jVY_k__[_RY_t5_Y_u 58`h8h  jY__E15__%f  _f = 5_5_hj=_5_fEU9_WсfufufWOсfufufUfUV_ R5_Qj=_tDfE=_5_U9_v&WY%fUBfU_^U VW= =_tCfE=_5_U9_v%fWUBfUϋ_ R5_Qj_ _R5_Sj=_5_fEU9_vIfV шOVWUfU5_5_hjJ_5_5_Rj(_^UVu 9w  9s= tnVY#U  )ˋ _fY ^UVu 9w  9s= tVY )ы_J^UVWu>t FtF}u6<_tN<_tN>/t<_u<_t } u/F uV YY^UVWu}ju 5; uVu55 EVu5. E9ut-5L YP58`hh % j<Y_^Uh u$ YY UV5@ Nx <`^U=D tD ud YUV`U9`wU`9`vL 16V  ! " # $ % & ' ( ) * Yt1'`rF5`&Y5`^UVW}u1E}UUsL 1=`u8jY=u1V!փ5`5`FE5`OVU}9}r69v2W9UvUW~>}t E`u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=`<9}r79}u+UOJ}t E`URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\ uY_^U VWUUb15`t 9ur6E0tU U`tU9ru NJEtU9Wu RWE_^UVux95 ^UUas U EU$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډL F_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h7YF~uN NF 1}9< t, R@t Bt 4 }YGƒ~uF`FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }D %~y UVu CV€tu ,fNV~h u>5l Yt.hYFu NLNHF 9h~YFuN!NF V@uVVVhUFt$jjvv =uN ?jEPvd =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvg =u N 3uvvl uNN N_^UUUuuu < UVWu }E?t:JxG^FSX GVPYY=uEE_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UVW5L PYNj5 hh EYh :Y}t.U:t&uYPuV jhV WYPWV jhV _^UU Uhh uu WKUSE] ![]USE] ![]USE] ![]UVW}u M UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]r UVW E_^] U=D tD jYU}x}~urPYYU$UUEPjj U$EPuV YYEPj j U$UUEPjjc U$EPjjI U$EPuYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuD YYU UEPjjk ^U$UUUUU UEPjj? Uu hT$u% U$EPj j y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEH VuVuukƀ}Xu9utUP3YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U eEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VunYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEp UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE uE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPRYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPnYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]Uhx h 2YYjJYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP-a] drive file-lr] drive [dir]Usage: %s [%s %s: Can't handle disk %s: Disk type in FAT copy differs from disk type in FAT original. %s: cluster size too big %s: Can't handle disk %s: reserved != 1 %s: fats != 2 %s: sectors per cluster == 0 %s: bytes per sector == 0 %s: %d sectors per track not supported %s: magic != 0xAA55 %s: %s already exists. %s: %s is a directory. Directory %s: /Root directory: is %.11s has no label. Volume in drive %c %s: cannot open %s: %s /dev/devAssertion "'\r' == 13" failed, file "dosread.c", line 326 Assertion "'\n' == 10" failed, file "dosread.c", line 325 %s: Program should be named dosread, doswrite or dosdir. doswritedosreaddosdir  %s: No entries left in root directory. %s: Cannot find `%s'. Directory %s%s: %s: %s is a directory. %s: Not a directory: %s %s: Premature EOF: %ld bytes left. %s: Too many clusters allocated for file. %s: reserved cluster value %x encountered. %s: cannot write to stdout: %s %s: cannot write to stdout: %s %s: disk full. File truncated Assertion "ptr >= name_buf" failed, file "dosread.c", line 747 DecNovOctSepAugJulJunMayAprMarFebJan %c%c%c%c%c %02d:%02d %2d %s %d %8ld%8ld %s%s%s Bad sectors: %ld bytes. Free space: %ld bytes. %s: Cannot set break! %s: Diskette full. File not added. Assertion "CHAR_BIT == 8" failed, file "dosread.c", line 982 Assertion "sizeof (short) == 2" failed, file "dosread.c", line 981 %s: not enough memory for FAT cache. Use chmem %s: not enough memory for FAT cache. Use chmem %s: read error: %s %s: Bad lseek: %s unknown error : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0q/ /@J/n0XW0b<0dN0iN0oE0pW0uN0xW0G1 81#=1+31-.10B194L!2h 2l2?2E3G3X+3b+3c3di3e3f3g3ii3n2o+3p+3r4s2u+3x+3(null)cannot print floating point 4`/dev/dosX $Id: dosread.c,v 1.8 1994/05/14 21:53:08 hjp Rel $SSSSBP h `Unknown error(  x l H 8 $  x d P @ 0   lP< (|hT<(C  ! 1$T$L su;SSSSu QRP PUVWu Yu Y9Es1?uU:t E F~/t/FJWZt E E F_^UVWE 1< 7t<U N9u,E9Fu#F HF ~ u VYQj Yƅuhh`< YYjYfU fVEF]KF 71_^U0VW}EPW YYy-5 YPW5hTh` 1rE]9tUt=t1NU11=EWJ Y8 YshPP YYtЋhLR YYthPRWtE܋U JPRP s YM1E=~E]PEPS t1IUU$79U } }t} xWVhD _^UE 5u u E=hY5Y5hh` jY냻`EpU9(}(A (M  j55 a U9(|1UVuj jVw ^UV5Nx ^U=tuYUV U9 wU 9 v  16VYt1' rF5 &Y5 ^UVW}u1E}UUs  1= u8j`Y=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVW=,aU9(} (M :-u(zu (M h4YYu((M ,ǣ:tWu3YYƅ}=$t=E h`0 YYh`hYYh`WYYh`j YY(M ,,:u(,? F>:(M ,C;t!A (M ,C(U9(|W=$t=E h`0:YYh`h)YYh`WYYh`j YY,?`(A (M ,7(M ,,:u,(_^UVWuU VVuMYYDžt~~yVډ F_^UUUuuu  UVu JxUʋFF Vub YY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UU UhHuuj +USE] ![]USE] ![]USE] ![]UVW}u MWUW}0))ϊE tu1_]XG_]JjU$UUEPjj U}u  UEuYumYU0VWEPuYYy1U؁@t 1huYYDžy1EPW~YYxS U؁@u7jW YYEx& PjW xh$Yƅu UW YUЉ 1FfFF_^UVWuu  1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U d}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE|uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEФUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }* ~y UVu CV€tu ,fNV~Hu>5LYt.h8YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjvj =uN ?jEPv$ =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv[ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhh`YYjjYU$UUEPjj+ U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$UUU UEPjj U$EPuYY1ۅÉU$UUU UUUEPjj[ yEU(VuU @t*uYEU UV֋RUUUEPu4YYU UEPjj ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjj{ UVWuEu41}%5Lhl;EGX'b'cdeefgieno'p'rsu'x'(null)cannot print floating point M&M&M&333  NSSSSB0H` ((((( AAAAAABBBBBB Unknown error\P4$ |lXL4$tdL<$p\D(p\D4  C  Ntg\o1$T$Ltsu;SSSSuPP QRPiP.-ULjPjuu uH E=Ljt13=Pj }' Pj(j PjjPjЋEUVWu u1H}1>*~vUUU:tuVEPF' uVօtLjUPjUU9Uw2uVux EtMULjUPj1>(u;=Lju =Pj |1PjM jLjv$>)u8=Lju1WPjA PjM (jLjvuVEPY& tv1 9}sE_^U } t yUT=itTBRh9YYhh P 3 u/.u u1P!YEyUVWUt1UǍGP;+YƅtUWjFP9 _^UVW} U9w1V}t$U#UѺ ˆ$U#UѺ!ˆ_^UVu U9w1#U#UѺ!‰^U VW}u?9u?&u'UUU 9UEEF9uwl?\^G=1H=9>-1(jU-1jUU9UsEEF9uw FFGP_^U VWi M}gt }vt15XjYYy ii ME=  F$EiM9uijYƿ9=Xr&9=i]9=iQF PPC8YYhP7YYjuP t }gu }vuvG낸_^U=iuUiU ii9i =i1UVW}JyXJPYEU B9X}1U BPYEUr9utitVUV)Yuuuuu$U )B+XډXJyXJУT1_^U VWEi: u : uiii=iu/TB9X}1 TBУiu iT5ih5YYfi: u =i~ Ju5iYYy ,ji: t TRRYYy 5i5iYYy u5TMYYy ji: t TRRzYYy k5i5iYYy JTB9X}1 TBЅt!TB9X}1 TBУTj=i~ =jtj=i~ i: t: t: t Uƅu "Vj YYEyhVhTjO4YYjJ=i~ 9i: t: t: t ƅu =TnthTjh2YYVhTj3YYi: u =i~ iJuyX iJP%YYy jsi: uTBR5TVYYy G5i5iMYY*"i: t: uii=a| =z~ iiNji: t: t: t a i Xni: t TRR}YYy n5i5iaYYQIEy 3TRR%YYy uYy ji: t TRRYYy 5i5i%YY=jtj|i: u=iu}u XN=i~ ;=iu Xii: t: t: t ƅu V5iYYEyji:eu i: t: ui,Eu hthYEy ji:puETRRNYYy ?uuhthuEy } jEy TRRYYy uYy j1Wu@Ei: t: t: t |9 ƅu g5XjYYYy JuV5i5iy $ji: uE=iu<}u6 ƅu jV5XjCx TRRYY|iуRQYY|t i i RQYYyQLiR5iYYy-(i=<=1_^UiUiu uPYYEUiU VWU UU :9E:-tjuE P{ YP rU9U t U B9Eujuj- JU U BU 9~ BU BƋU F9juV E LE _^U VWiUj'Yƿ9=X| uvG9=X|1&=TUi1 EyjYEyT_^UVW} }EE9=X}XDžtJu YEu91=it1UP5i R URUFˉ=T1_^UVu}tuh${*YY>7> .= =} thP\YYJxSZhPO%YYJx^hj^%YYJx?bhj?$YYRhPYY@ :JxSZhP$YYF} t-Jx$hj$`$YYJx hj 3$YY^UVu Jx FF^ Vj^ $YYJxE% @^FE% @VP#YY^U VW11҉iii=`tu hD(YYhu &YYEuh"(YUT1Euh htH5 ƅ~1htH`)YEEhtHt Yyhx'YFGuYy|=`muWhd' =it5ihTn'YY=it5ihHS'YY=it5ih08'YYh,,'Y_^UVWE1҉UU=`tuh&YY}tPu$YYDžuh&Yud YƋUUU 9UQV UEu(YEEWu#&YY=uhl&YEWj %YYvE맃=`tuuh;& WVYE_^Uh&YjhnYYU VW j4&YE}~=U hr.'YYtU hr'YYu`ME }~KEU9U}"YYjuP/ tL} tB9X}1BJyXJЉƃ} tGGE&_^UVi: u TnhTjhtG"YYoTni: t: uitGi:t: t: t: t i FhtG!Yuh7 Y1#htG!Yuh Y1tG^UViiƅxAii5iii:,t:;ui:;u5Ti봃=i}iiu Ti=i iiui^U Vi: t: uii=0=9 1i=0|=9k Ã0iщiTiX EiM9ui}/u1PupYY}t Tuii=a| =z~Kii-aXn/}t"i M6/^UVWjYƅ]i: t: uii:+t:-u5iiEj=YDžy#}+u뫉)95X}_^UjuYYUVWU9X}"X9U5i=X9}}vOi19}~vG_^Ui: tz uRhu\YYu8ii: t: uii:gu i1Uu7YE Pht'YYhht'dYYt'U VWEE> @ A B C D E F G H I J K L M = u?tGލPYPYƅu PF PIYY5TYPRVV VV XTU:u 5_^U VW}~9} | X9U ~ 9} u =T1U 9XY: tU9sFۍU9uhY< Fu WkYYJTPLYj1_^UVWU:t9E t : t:*u1E1҉U׋U:9E : }j $ YFF.!}u^LF^ UB9E tUzt Uz u$LF$}10**Uz^u !E[EhYFtvuj] EnhDhYYEQU:\uz(u(E;U:\uz)u)E%LEPdYFU5*}uuu Y1Q}uFu+>*t w~9}t Wr~ UVwuE1GE_^UVW1uiiM1i]9?: 69} -:&u&FiiiF=\9} 1\F Fi Fi FiFi FiEii=0|=70 ÈMuFIiiF7i=a|=z - i`Y(G9} 1E_^UVWUUU:} U :LU:} u_9t%OM>t]9tFu>VfEFt?Lu_9tfEFޅu}tN~EvUuEhU:u 1Wu} uWVE Eu} tU :^t,EU9Uv U9UvM}tEEEE_^U VWu=i~i9i|95i95i| $iJyX iJPYE5iYE5iYEiB9X}1 iBPYWuWui+iB+XډX95i}i+iB)ډ֋i+iBTVuYEB9X}1BPWYWuuuuuWu{i+iBX_^UVW=i~i9i~ ni9U}EiEUT15i9u|VrYPYGF=i95i|VPYPYi߸_^UVW}:U Z9U9w1p: e[: P1LU rPYYt5.U rPxYYuU R$xF_^UViiMi]9t2: t-:\uz tiiFiiFu5n(=nt 5nzYPYnPX^UVii:tt: t: t: tii: u i: t: ui1i: t': t": tiAPEPVZYZD5nhn:t22EPYYun nIR1 n 1^Ud\\RPh8J =itP=it Ph$ 1UU MJUMJU5XjYYUhihihihi1҉XTU VW=i EiUi9UuYEE썽EEU:c}u}uuuuZ 1t!9utEEPWu Vuljut9uu EEG떉u둃}tGU9r TGuuhYYPRYE}tTRR|YYE }u }uE_^U[fjuhthxh|sjuh`hdhhWjzYEP[Y9Et>EL EUVW}t&wYVY _^UV5Nx n^U=tuYUVxiU9xiwUxi9xiv 16V,Yt1'xirF5xi&Y5xi^UVW}u1E}UUs 1=tiu8jY=u1V!փ5ti5xiFE5|iOVU}9}r69v2W9UvUW~>}t E|iu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=|i<9}r79}u+UOJ}t E|iURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15|it 9ur6E0tU U|itU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPV yE^U$UUEPjjg y Ud1UVW5dd}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUU UUUEp<EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UUM J} t U R Y]uEPu 1UEUUzt R YuhiU RuZBRYiWUVW11}U9u F߃| jugYtUrv YtURtUzt rnY}t}t}t uJY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv1 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFiFF VVv vvQ >uNN FFSX_^UVW}Wu uh ƅ~9})׉U U 1_^UVWu }^5~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuu;YYEy@Ut8huUYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu T UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UU Uhuu  /?USE] ![]USE] ![]USE] ![]UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVWE_^]U 1uUujj Ujuj U$UUEPjj U$UUEPjjg U$U UEPupYYEPjj9 UP2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGueYEuUUȋUUEEEPj;j" RY_^U$EPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPux YYU UEPjj; ^U$UUUUU UEPjj U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPGYjEPjM Vii5ihijKj- ^Uu hT$uu U$EPjj y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu@YY=u}t UډE1!,'"UHEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UxJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE(UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE POE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuDYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh0hYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6jw {sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉1ۇltPXP%6d.  F+F-.} =EP Q W a*cudefF i j kp l mI p q rD s t w x}z%s %d  4%7d [%d lines truncated] [%d nul] [%d non-ascii]%d lines %ld bytesfile insert error file open err r"%s" %d lines %ld bytes file write error file open error wa"%s" ? ? FATAL ERROR -s-truncating line [Incomplete last line] BNRST no file name bad file name $U'+-.E/e?e line too long n"$g"*g"^g""$)"*[". "["^"Not enough memory for pat $ -$0$Bc$NE$Rr$S6$TT$)!($(.(Lv([(^(noeightbiteightbitnolistlistnonumbernumberOFFONOFFONnumber %s, list %s ed version %d.%d -,,-csh/usr/bin/sh-csh/bin/shC-!:-[:-k:aX:r3:wB::+:b:===C QC@CDXDbxDdDiDoDpDuDxDE tE#yE+oE-jE0~EuHL]FhGFlRF{FEHGGXgGbgGcGdGeHfHgGiGnFogGpgGrUHs!GugGxgG(null)cannot print floating point i iiiiddSSSSB\o  lH1$T$Lsu;SSSSu QRP:PU5 YPuhh@jYUVW}thh@YYjwYU rjVYYDžy=  u jVYYDžyVxYjhd W yV]YjY_^UV5Nx ^U=tuHYUVux95,^UUUuuu  +OU$UUEPjj U$UUU UUUEPj6j U(VuU @t*u YEU UV֋RUUUEPuPYYU UEPjjw ^UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EERuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UaEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U$JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEEDq E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~(u>5,Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv` =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVU9wU9v  16VYt1'rF5&Y5^UVW}u1E}UUs  1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVp uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhh@rYYj"YU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uR YY^UVWuU VVuYYDžt~~yVډ F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uQ U$UUUUU UEPjj' UVWuEu41}% unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 @Xbdiopux #+-0LhlEuG`XbcGd eufug`i n/oprsux(null)cannot print floating point SSSSB(@Unknown errordT<0|dTH4$|lTD8(tXD8 tdP<ClU   P84@91$T$L`184su;SSSSu'' QRPp5 PUVW5I85I8jh1YYjh1YY84u uYY=x5t 5x5RY=|5t!GEU4x5lRY1I 55jh5d =5t 55555`<t84=5t E<uY=5tj5Y|UVWEEu }O:-t}}UA6Mx5E΋BP>]YE$5$-$-똻EO~)5t5 (EF6ht YYjYB}~ujhH j8Y_^U'5555=5uhSY5jj.YYW jB551Yh"9j YYh"9jYYh"9j YYhl9jYYU/5 5h#jYYjh5PYYU(xUVW=+t$=5tC  555V=CYƅuj/CYƅt8V"CYEtp v h06 v h6YY h6YDž`P [YEWY=jY&t4VAY~$t hp9Yhc9Y EL_^U5Mthl/9Y5jPYUVWjjYYEjjYYhY}BVnYjjYYjjYYhYEuEhYEuEjuu& h'YjY*EPuY9EttEpuj:YYWj0YY 5_^UuuxYP YPEYYUVu艢Yƅth9Y31^UuYuh9Yu3U VW}u GEt(9]tuXYPSXYZ9t1F9Eu_^UujYYUVu Fu+U JRu u9 ^Ux PYUb P{YUVW}y51.E!ǃ-uu55҃0|,9'k -0ƃ=5x 555롋555U55_^UjLY5UU5j0YUh h]KYYU*]g4Eg-Le&kei`7 U=5y3uu /t1UV55x5;t^UVW}WYƅt !RY_^Uh'uYZUVWEt5+=+U€t05+=+uGVYEF9EtFOu#U+ 9=\*1_^UVW}tu8PYY/5+hd558PYYPYYPYYj8P&YYly}:hPX4Y*lY=WYWVl 9jRPV SR щ +UT щ +WV  +YX щ +[Z  +]\ щ +_^  +VQYh<53YlY_^U1Uh5jYYh5h6 x6f66߁f66f66f66f66f66f66⿁f66f66f66f66߁f666h6jj Uh6jj Uh5jjr UUU7U=p6u p6 w 5U=7u7sUV57~87d6JjRYY*JhjYY^UVWh6Jl6 h6d6U=d6H =h6~&q5h65d6h jsYkd6UjR%YYƅu-hYj=Ykd6E6d669v,UVUUV h6UU_^UVW57#5 V5 5tL,=d6Ox6B 957t57>YPV>Y 5%55t& 5 57t N6%55 t+57t!Vu~tVY6ۋ57~tVY57~tVY5tW57 @YPqY=7t97Rt+7zu 7zt57?YP/Y5$6FYu h0Y5'_^UVuNVYtVY^UVWuYDžy16U79z}J6Bƅ~N17QE]3PYEU+VRYYƅy2UBƅ~N7 7I JG9 uYPY1uLPYVWYY_^UVW7UrJ M9u~<6U9}*FWU9U~ _NU9Ut6OU9tU9r|9N4U9r|(N<6Gu G=~ F9u_^U(VW} 55UUNx SXVYE=} XV,€aNx SXV躃YE= u}u1_U}tFE } uV,€u,WEPu MI9=l6}_^Uju YYU 6B }t EH 5 5UVW}wW U9u~ VWYYF_^UHVWuu1F u1957u$6F EV VUԋ5U؋V5aNEEU9VV +dЙd++V dЙDž 9~ V JunMYtP;eYMFEWNE9E~EF 957uU$6z~EE9}UEu46L YY6UVtUB UBUB%UBGuV9YY}tV +dЙU9V~h<+Y~ ~VB6VV6UEJNv.LYFtvLYEFuuVYYGV,U<LE,+F,EUU9V(}+V(U}u U9V$~9}~6UE9V$~G9}UEJ9N$H9~}.UztE9V$uJ6zt O6U}G9}~6UM E}9~}J6BEEEEURJY9}6UU9UE9u}u }wEЋUBE9~} J61Pu YYVtUB UBUB%UBJEUZ]GWuVYYuVYYpk957_UJ6UEJ9M~t E#E~u E kFd}EU9Vt V 5F$UV,f}tNuIYU؉5E_^U VW}U 9W~1NW WJ46VU9U },U9U ~1 ~tFu F=~1_^U8VWUUu 7UURU79Uu 5 UeUMJE tuuYURUUURt1P YEȋURUUMJ MUUU9UWU6B9}t*mt!UMJuK Y&VV#YY6UuMEEU@~ UB9}~=6Bt046VYYt}u}ЋV U؃}uG뾃}{U46}Љ+U 6 6ы 6 6щM+U d69}7U9U}/e俉+UuRud 9}uYEU€~UB9}~=6Bt0V46YYt}u}̋VUԃ}uG뾃}iU46}̉+U 6 6ы 6 6щM+U d69}%U9U}e+UuRul uYF%FEu' YUB1_^UVWu Ft7~VUUB%1ۅF%1Ʌ9t+1W~ VUUB%^9t13U9z t1'tUrF]E9t1Ou_^UHVWEU6URUUċUB%1ۅÉ]UB%1Ʌ9Mt!juA YY UB UUu YEUR UЋUR׉UȋURŰu9u}u̅t$G]E9tONu+Uȉ֋UĉU9u}t%ju YYuWYYỦ6h69U}5}t+UЋMMjRQ h6+UЋMMRQYY9uKGEU9]-9u?EU59Uu956t Vu YYuY66tEU9UuE܋U9U| }6UUԋUJ9~E} u U9UuU9EuBU9EtF9uߋu};EEU9U~UUUJ9uEى+U66U9UUԉUu}El}tUԉUuXuuYY+UUU)M]]RQS U+UUUuR:YYuuY}RB9UFUUԉ}ȉBUEU: u U9UuF9uGEUU9Et95h6F9uGE9EtF95h6EUU9U~GUUU9uE܉+U6|6U9U}t 9Ut+U֋}OUVu9h6 h6)EZ‹MMRQ uЋUUVWR^ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  uuEYYWVYYGu"uUԉU}ȃ}EFF9u~VuYYUMRQUMRQ UMJUB%UB}tUB UBUB%UB_^UVW} ~ uUFOu_^UVW} ~ u FOu_^UVW}~,u U+UNPMUY Ou} FOu_^UVW1h6UURUu t:FDžt0Ot%WFt VUVUPu UUMu?Wuu 9} =+tF?+UׅtUVNMjRQ BFVU!UB׉~_?+F^F=+^F_^UVW55UU+Nx SXV sYǃu +E4 uKV,€ZNx SXVrY= u+EtF  uV,€u+EuuW ljUU}U 9UA9Uo +V,€t>Nx SXV,rY= u +RtFVRsY?F8V,€u+(F!Nx SXVqYE_^U VWu~}U ]} u!#UډUU GMuE4Eƀt~GE~u ^G@EE_^U0VWUMIJ MjuaYYuu iYY9u |U)6RFUJ֋U U9.+U 6 6RQ+U 6R Q NȍU UJ9u6BB Nu9u~6 F_^U0VWUMIJ MjusYYuu YYuU U9~6RFuU+U 9~.U 6 6RQU 6R Q FȍU+U 9u~6BB Fu9u~6 F_^U+U9Utu YU+EUVW}9=5tu WkYYxU +6xAc95t6~P6B uC6R6VRYYU 6*ډx69t6~ Nu u WYY_^UVW6tZ546V +6ׅ~>jYE6Uj Y6OuuYu55YY_^Ud6h6O666t6x6p6+@4=5uhpYY5u 5lhh55JYYtD4Hh`55%YYtD4#hX55YYtD455 YtD4hH Y<4t6|666666=p6 u(6666 6T 6 |666p6Ѻ664D4E=$-y6t$-UhY55Yh|YuYhxYj?YUM5-Y=L4t 5,YjY1j Y'h Yh YD4zU:=L4t 5,zY5-nY&jw Yh YD4*U/5d65`,JYY)h_ YhR YD41҉65UVWu }95h6h5h6`WV5h,蹩 PYVj Y`1R Y`1R Y0h YG P YF P YD4G=556_^U=7t57{ YjD Y 6Uj1 Y U%5X,Y&j Yh8/ Y D4UVWukd6J9U L6U5UU )jRYY5d6V2YYuuYY =H,tVV5H, =,t,5,EY5,9YNu5,*Yd6+5R5@,)YYNuj Yj  Y (!1<p6WWYNuj YPh Y!1\p6]WYNuD4B_^UVWu>=,tVV5,f =,t,5,Y5,YNu5,Yd6+5R5,YYNu~jYjY=p6 |jYNujYPhY!1p6NWYNuD43d6J9U }?5U6UU +UjR2YY5d6u7YYuuYY_^UVWu} v5,Y=,t-jV5, t VWDYYSj YNuF=,t 5,Yt GPYj Y=,t 5,cYNu5,TYU6h{Yt GP?Yj 5YNuhTYU6jY=p6 uBh*YNujYu}VhYYY/5655YYjYNujYt9ut GPYj YNuU6D4G_^UVu5,?Y=x,tjV5x,b 5p,YNu5,YRh(;YNuBjY=p6 u h$YjYNujY D4^U6}t,,PY*}tHDPY,D4KUVWu~=<4W_YNu_^UVW}~4@9})kdƉ+@4օ~5<4Y_^U}th6juT U}th6u u6 Uuu ju觢 PYYUVWuP YY=t1%h莇YEu h&YUUE <,M =,MEPEPYY@,NuӋU+UU| hYuu讇YYhNYH4h>Yt H4h%YuhYt1L4h薟Yd6h|膟Yh6@=,t, 7P,7-7p6f8hx5Y=,t=,t 6=h,t =`,u hLY5h,Yt6=7t57Yx6=,u =,=,u =p, 65,NYP5,AYZУ|65,-Y@P5,YZУ6=,tj5,4YY|665,YP5,YZУ65p,Y6=x,tj5x,YY66=,u =@,;=,u =,% 665@,LY6=H,t0j5H,dYY6j5H,PYY+66;=,t25,YP5,YZУ65,Y665,Y6=,t0j5,YY6j5,YY+66;=,t25,jYP5,]YZУ65,IY6=H4t h6=X,t 6=L4t 6_^UP4UP4}tU:thU6ju艟 P4U}u1u ju PYU-J-yE - -UVW}5 -GEt(-J-y5 -h5 -UF͉5 -_^UVW}5 -U U~+-J-y5 -5 -GFMuՉ5 -_^UV= -t --T4ƅ~VhT4j9  -T4-O^U(-J(-y44j2Rj踧 (-ҡ44#$-U=(- t1UkUUVW}rE_hY57t5uVv\YYt!v$v ~$tP赤 vǃ}~Zu tPhz uDu@utFG9tE 1_^UVWhnYDž/?u55? u1 WYWYuhY955t=779r7U9uuV<YEu VdYEUr hYYDž?t? u E WYEWY}u hYX9ut=7t79ruuY955u uYVY957u 57_^U(VW5Uh@YEPYh(#Y57~ ? V,t$ Po#YWh#YVO"YPEP#YYjWDYZ)REP6YZ)‰U~ uj #YYh#YEP#Yh#YV$ׅtW"Yj {YvJu YuYuY_^U5`, 5U5p,5R,€t\LPY 5UUU VWhY5$6EP"YYEPYU։׋$6UMx\E= uF} uGuhtYWEPJ"YYEP^YhSYB+UREP#"YYEP7Yh,Y5$60YPEP!YYEP YhYVEP!YYEPYhY9tFVEVEP!YYEPY} t htYhpYT_^U7h:Y57h6Rj- YYhY57UVW}W\YƅtMj4YƋ7V57WYF F(jVLYYF$F,5V0_^UV57tuv YYtv^U59Ut7uYUVWu=59ta$6W(55V05v(Y7r7 $6J 7BWY,6 5_^UVW}57t 9~t 6WTTY_^UVWu)Ylj9utV,tV Y9u1_^UVW}t Vօu57V : u9u_^UVWuE=7t 9t}uݻhYO}u V7 UNJVKYPQYjLY~$t v$;Yv 2YV+Y_^U5R,t55Y1,,6U VW}w hlYYƅu1*PY=YuEV衽YE_^UVW=7th mY57/F EV}57jW 7UB+V ډA55RQ 77#J7 H7#J7 HUV B6 7Q9$6}7 7RQ !7 $6J J6$6 5_^UV=7uh _Y|57~t..vYVR+-YFF7R BV 57Y57Y1҉77 5^U=7u h0 Y+57Y7777 5UVW57uhL xYb=57Uzt u57ߋUJ ~ V  h@ 3Y Ex ~V )V 7x 5_^U=7t!bU=7t cUVE57QYF57CY577Y,57t"VtVY6\ 5e^UVut#VtfNN 5 ^U=5t5=+t1+UV57u.v=+u7#J+.t(= .uh| `Y . .VN7Vf 5 N 5^U77d655Rj 7h Yd6PjR 7h Yd6JPjR 7=+t 7H77U7 $6J #57 PU7UR5Ur "Y%5 5UVW}j0YYFUVU V ~W(V FFF$F(F,F757_^UVW}E57t 9tu6uOh Y6}u 7E9=7u$6G WB(W趷Y_^UVW7Ud6uRj PY)~ Ox6N,9 tG}19~ @Eu~ V YEuv }t  PYYLǃ u)}t)v h YYj3%YNg=5uYVY 5_^U$VW}5U7Uw7UtRtt 7UuY5+Yh Y52Y=L.t h tY=8t h| `Yhx UYv LYht AY~$t v$2YV,t hp Y hl Y}ahh Yu$u h Yw$YV{YVY_^UhTh YYU5R,t juYh YUVW5U57|V,h~$^=5tVY|Ev h YYEu13UPV Y=YuVsY>uYvtuRY_^UjYUj YUj YUVujYƅt>tVU YV躲Y^UVW57t~$tuv$蘌YYtvt VYju YYEy=d1tu觋YuYEP6YƅSVQYu~$tB~$tF$0 Pv h< Dž]?t WzYWܱY ufYVY}y ueY#uYu~$tv$蛱YF$_^Uat&u'YuYu1U VWjuYYDžy 1d1W>Yƅu8 | h Y=d1tU hp YWFY19V55CYY& E%U9$6t uYD _^Uh YUh YUuIYh >Y5d1yYP^YUlVW#UUDžmE n=,6uh Y1E J@6u#$uh< TY1fw$ViYYPVYY5+V5+P15+V5+ P PΈYx"jVYYt@Dž5+ PYYEyDž}uV9Yh0 >YR P觇YYPS P葇 tuWi=YYk(6+$6REYEujuS uPAY/@6uj4D6_S E<uYd1th YDž~Dž}uP4YPVֆYYuVYV P輆YYu PYh Yh YDž_^UVWuudYlj+URuV } t u V豆YYV8YWV蟆YY}tjVjWˆYZ)YZWVzYYE_^U VWuGEt }/u_^UVW55uYǃ~$t v$0Y~$ 5_^UlVWuu}VYƅv h 55EPYYPȅYYPYY} tEPh YY5+EP YYDžy!} t<5d1tYPh ؂YY!WV:YYWɄY} t h 贂Yf,D_^U=.jh ̈́YY.U5.vY.UV55Nx U uV:YY$6jY^UVu ~ uYNu^U5R,€tj Yj YUVWuFDžt WuY_^UVWu} ~FPUYOu_^UVW}!V%Z)Rj YYY)Rj KYY_^Uz 5UuYUuYUuYUt&$67B 5UEuYuPYYUVWu9u }u } VYU )W55:YY$6U5$6j:YU$69U  )$695$6~5$6U 9(6|(6)(695(6~5(6h_^UVWuYU +URYƅt[=5u>@6D6ׅt+U 9U~WV <YY@64D6VW;YYVYu uYY_^UV@6=@6| @6@6D6օtV;Y@6M D6^UVWEU +UUyUUU UUU U+UUuY}W1M@P6 Yt1tA|؃ZӃ a|ăz)VYE뫃}uaEzEAEZE Mx&9|9u|UR*YEՋ$6U h}t uYu Y_^UVU!փa| zF^U55Y$6U55G7YU557YUj557YYUV55Nx SXV5Y^UV55F^UV55NxU EPV5YY^UV55~~Vp6Y^U55E3YEPY55G3YUu55?8YYUu556YYU$6Uju55e9 U5$6'YUjYUjj55+9 Uju559 Uju558 Uju558 U55YU55 YU55LYU55RYU55:YUhb55IYYUhd552YYUhc55YYUh@c55YYUPu ur U55BYUuD1YPm7Yju0YYUju u7 UuQ9YUu hcu U VuV&9YEjuV7 VU YV 9YEjuVk7 E^UVWuV,€jNx SXV2Y=r uFV3Y=tNxVx2YNxVh2Y u.Nx SXVE2Y=t u۸1_^UVWuV,€oNx SXV1Y=| uFV,3Y= u ZtNxV1YNxV1YNx SXV1Y=t uF1_^UVWuV,€gV2Y= uV2Y= u'NxV#1YNxV1YEtNxV0YV92Y=t uNxV0Y1_^UVWuV,€tNV1Y=] uV1Y= uVYu u1_^U[EuYu YAEuYEUVWux~___E׉E=t u*Yu}u uPY4׉E=t uYt}t}y Nu_^UVW=5}{uOx SXW+YE=9]uFU UM}~1EF9t}u1U+U jRW/ 돸{U JUUUuWT,YE=T9]uNUUu5JRYU}t uYXUVW}t uY06u)}~#}u yl5$6Y06Y=5u=5t5065$6Y065065PYYƃuVY0655_^U(6,6=+t 5+FYUt(6U$6(6uAYUt"5(65$6ZYY5Ut$(6+$6R2YPY{UjYUjYUAtu5(65$6 Utj5$65(6# U=,6u h [Y,6Uhfhg/YY1UhghfYYU}U$6U]= tEEju.Po UVW57=5t4=5uF=5u=5$6 YEx*uV覞YYR 5V +dЙDžy1 9~ V J׉R'YF 5_^U55VYU5RBYU55YU5RYUj'YUjYU VW57V ׅU׉ׅtFvRYWhYEPNZ9tUVF 5_^UVW}57vYWYnF 5~$69V~J`C$6UP>uV3YYt U$6V VJ6$6B_^U}t 7B7 7I JI6PY 5UPYUVWEuYG1uZ)‰U~+=l69}}}VWIYYƅy1U)UuY_^UVWu 1| r1 EutYjVeP lj)x5+Eƃ=+~'5R,V€tZ)‰uY_^UjYUjYUuYUVW}\P葙Yƅy h Y17RL7LJ H6UQUEA9L+L׋L6URCYWY9H|H))ډ׋HJ֋6 6 JM9L}%J6JMtJ6RUuYEPPYYO~>}u69HN6 6 JQY62sY_^UV57$6U#5 VVYV 5%5U$6^UVWUBU1=h6E=d u25R,€tb= uEt EOuMu}t5R,€tXS_^U$VWhp ]YЎEP/YNjU€t hl [Y[u#hh KY蜎 EPY&\u!hd #Yt EPΎYǺ#UUEEPY5U=4t54?YmhX Y5+YhT YhH ^Y4PY5+"Yu$uY54Y4uFU)jQEP u h8 #YZEu_h0 YEuiZ)RIYPuYYuFYu7Yu'Y_^UV=4.t h Y>54uh BY4VY4.8 5^U=4.~ 4J4xj54eYY$=4.t4.8 5U=4.t h Y>=4u h Y(5J4xj54YY4.U VW54u hYC=5VYIh YEVY*WYuVYY_^UV=4.h4H4zx4 54Yƃto4J4xj54YY4.跺ƃ=4.y14H4zx4V54hYY^UV=4.V4H4zx4 54Y=u =4~4@41^U=4.~ 4.=4.yU5UV@6D6օuGK$6(6,6V,YP55YY$65(6Y5^UVW=5tg5(65$6YY(69$6~$6@6J@6y @6@6D6ׅuNu_^Uj YUj `Yj XYU5U5$6Y9+~5+iY h(Y58.Y5<.Y5<.`YPhYUVW=u j ZY7 u#iztVY j #Y_^UjYUjYUVW$6U}tH<PYƅ`hjNYYEj_Yu586Ve j^YujgNYYtuuYh,iY_^Uh\蠾YUVWuYƅu1V=46>u,V}tJډPYuVEPf tu U9tU=46586586EP546$I 586=5Dž=46t 546YBRρY46V546EPH 586?57YY 5 _^Uh@.jYYUhD.jzYYUV5Uh(Yƅu~KY1Ou_^UVWU +UUy U U]u YDžu uyYtU+8UE1uMƃ ubu/YtU8BRY RY58YU+8U9$6|$6+8$6 t u/ RY } u!9$6; $60}}.t }!t}?uGM=G t& RYB9$6|$6G9=+}U)VYU)UMj YE1 =89$6| 8$65 8YP$6UU+$6ROYuY_^UV=L.t1L.=8u/hY85P.>tP58YYF 5^U55uYYu58YYtUVW,EE11xC9+| t0FPYttE9E|UUtjPu _^U}yK=5u薮;=5t 5 5A=5t|PpYU VWj1Yƅt5j55}=YYƅtj7Yƅt1/}t'-EVWhQ }~_^UlVWhQYUR菮YXhT.jzYYxǀj55<YY뷍EPAYǃu.WhYY>6j4Y|jj%7YYljj7YY\PY2ke0>j0Y1PyYkjYƅtVhPYYhPY57YEP@YDžtdPjXYYEP@YDžtdPj0YYFPYajhpOYg_^UVW1} j/YFhY|P諸YjhY 4/Yj YNuӃ}tPhoOYYEj@Y tEPcY8thL@ƅyډVhNYYVh~YY@ƹ tWBYlE?ƹ@tWYE}tWuhnN uu7YYjօx<}t hDMYjzYEtuh0MYYN>c}t h(YMYh ]Yh/{> Y4AYj YjYEtuh  MYYyhLYB*E=} uE=t؃}Lu0=iu$=nu=eu = thLY 5uhtLYY_^UVWu57555$6hDLVh6LYY6h(LYYvhLYYvh LYYvhKYYv hKYYv$hKYYv(hxKYYv,hhKYYvh\KYYv hPKYYh,KYVUV V9UU<6G_w Pw7SYPuh OKhwiPDN iW iPhKYYGtEwhKYYhwiPM iWiPhJYYE5_^UV4UtMFUtEF4^UVW}u1Y} u'ljE MuG t1!uEMuUzE_^UVWuu1VY~FF _^UVut N F^UVutf ^U EPuKYYyEUVWUUx} } <$8t1uuYEy1^jjYNjU$8UWƉGUW FF FF~UVF _^UVux |1)4$8 Y4$8 YNu^UVWut8uj?~94$8thj"YYP"~tjW~JY$8V(%X_^UVWU $8ׅt URօu1V Yƅt9~u61_^UVuV Yu jvc YP4 ^UVuNx SX1F~thjjVVY^UVWuNxU ʋFVׅu V tG>tNxO U ʋdhjjV~ u VxYYAhj@jV$N VU Eu V5YY_^UVu~VY=u F^UVWuVUt:Rׅt1W 9v*V t+W WFf F$jhjV"VY_^UVWuV tV׋R9J sFO jVYY_^UVu uYYƅtVY^UVWuEPEPu V Eu1VU# E} xUV}?t ~F?URUt(VUztRBUBFV+VV jVYYUztR:t URWUB tG}VU EE`gE_^UVWuEPEPu V Eu1"uu YYNjU jRV _^UVWUUtu u1X~t1KjuYYDžu15VYE~?t>t6rU UEP_^Uju YYUVut V Yƅu^UVWut>t} >twE_^U VWuu1)EtVׅtWUVU6E_^UVWuVUu !>^>} u VYU +VV.U V&VYE F(E%]jVYY1URׅuhXj_YY+W UV t UWf F&UV+U ډU #VYE R@E\U9U |U 9V|V+U V1"FU UVjV,YY1_^U VWut8VYV׃U# EWVYlj~FF_^UVWuVׅu6>u VV'WUuh`j.YY U+J N_^UVW}Wօu1B?t3VUt)W t 6Y!VYU+J )ى VY+G_^U VWuVׅu1>WUu1U+J M~~ sVOYVjYDžQ}t&V t UMJf F%VY~ UR+UV~~ VY^~VYVYVY}u8~VYVY1hE Zu VYYNjWUc~u e}t!x}nW9Vu >E@UU9VvV+URWYYVYNjUVUVU9WvUVRWYYWU#W UtU}uKuj@i YYEU9PYEEPU} bUESUM9JshjfYYm11a}tuuJYYEpwYUWUOJuhjYYUM_w jrq suWhj V YF}u78vWIYYVYǃjW,YY URU9VUM9JE8B}G pUM9Ja+JMtEEM9Jwu YEU+UEE UM EUEPo?t#RUtzuzt VYGvW;YYtVYǃt jWYYuuYYEGUBVYY~uOvWYYVBY;}tUBG9Ft vWYY1E V_^UVWUUR֋ׅu17~tVBF]CUBfOUz_^UVWuVׅuFF8g#U 9VWUtRUWUU9VS9V|U tFU ~WUtBGFV+VV?u UV?V+UVUVcuFF^WUtRUWUV+UVUVx~U uU uU9Vu?t?FUV~O_^UVWut Vׅt_^U VWuVUt3Rׅt*V t +W Wf +W V1҉VV_^UVWuVUt8Rׅt/EHVW W+VVt F W+WV_^UVWuu1ZEN@VJYNjUWtE8E`?}}f9u t6ug?E_^UVWUUu1j$Vu( F~tUr UV~ tV rVׅOWRRPYYEt"wp w z( UOJUVF t jVYYF_^UVWUUu1E} u1} yE}tPu9YYƅu1N@UREU EP}tPuYYDžufhj YY,O@}t9>u f E0E8_^U VW}u1MOG tWY>j$VW$' } u-~t"VUtr VrV Utr}.tWM 9Jvu wYYFLU 9WDuUB UBUBUBUBUB i_V+U VU V U W~~/W Ut R 9V ~}~W V trw }F FF~?tr7f?_^U VWEuu VYYDžuUAMRhYYԋV9Vr GV+VWVV_^U VWuVUtuYFVׅt>tz~tVY>VY_^U VWuVUt7VׅtV W UN JV ׅtVWFF_^UVW158u(hj$ YYƅuBWh YY΋8F_^UVuF858^UVW1uIYƅuBWuhYY߉_^UVWEu u V YYDžt3UAMRV'YYu V YYDžt 9uvu_^U} d~$} ~uhj Pu h;j$he XUVWuFt1=~U} lVUtBuuUt Bt1Vׅt!F t jVYYW| YF1jVYY1} t}u1URUUBUOJM9t 9OsuW YYDžu1J~UO O]rQs " UWU9u0UBWmY@U9WvuW|YYP YN uYE01} t.u FF u<@v6W8 YF&~u ~tVCYuu1pUF X}NUBuB~tYtE0uuuu uVuWYPWuhjx01_^UVu4$8hαj$h =5t =5u1Vh0jj5^UVWu} 9~u ~tN _^UUUU=5u=5t:u@uV)Y858u1 8_^UVuF858^U VWkEk]PSYYƅu1/V U VF1uEEF~ uuW _^U VW}UU1U ׉FMu_^UVu uVuc >tr~tV2E0^UVW58ujjYYƅu1SUt UU t U }Fu9~sF@u6uu1F@=8} =8t9=/v=/9~s~WH*YE9F }t }tv uhjUt#JthtjYYeV UF~tGW)YEt}uU9Utuuhdjj~UU뵋VׅuURVVYV MQ V)EP~fVUt3Bu*ExV V V)V~u uZYu.9~v"WVnYYuVhPj hfU9V$U 9Vv=8tu V!YYFN"0EtuY581_^UVWufVׅtGu WY>tGuVY~u)Vׅt WiYo8V-Y[V +8UtJVׅuhjYY1+UU9Vw WYUWUV V V+UV_^UVWuU 9V+VU1҉UU>tGuWU9UVׅtGuWUUU9Uv!u u =YYDžu1lEvw v Z VWVW}u VY7W5Y}tV&YU 9Vvu V:YYt6FY_^UVWu>WVtrWY_^U VW}U wUY9w1?ƅu10W+UVUW V UWWVtr~7_^UUUU=5u =5tEuuuuu 0j5EU VWUURRYYDžu1 W ։:_^UVuYƅt^UVW}7Vu9~ tuhj2 VY_^UVWu>Wu9w tuhj *U RWgYYDžu1 W ։:_^UVWUU օt VYDžu1}V֋EENu_^UV58uhj`YY$Nhjh8 F^UVW1҉UE=84UW!w G1u EUUE]UM~}}sFt F]~SEEU9UuEU9UuEu juVvEU9rEF~u#}tE0uE8uE0Eu 8}u0Wօt'}tUU 1҉UEWY?_^UVW58t>UVt2~ F1u EtuWUYYEt} Mu܋61_^Uh_ Y58h N YY58h< YYjh. YYjiYUVjYƅujMYƅt1^UVW}t hY}thhYY58u}t hY1}t1@1҉TP1}tVuPhU G|1V@P YYy$}tHVh  |S~t,}t 1h`Y}t jVPYYP!6[}tTh,YY1_^UVW}t hdY58u+}t hXY=8t H1U41҉DH1}thL0h0h48 v}t Vh,YYV4P YYy"}tYY} t jWYYWt} t hY } t6hYY>t/tW 9rW9vF} t hY3z~~~} t hY Q} t hY} tVRRh|p ~t>t~uV u+W +W9Vt} t ht6Y h} t hdY} tVRRhL ~t8tV t+W +W9Vv} t hDY 8}} t h4Y} tVRRh ~y} t hY4} tVRRhd } tVzYPhIYY1_^U VWu#UVUVׅt'EEU 9uV)VUOu݃EFFF~~/tF FF׍VM _^UVWu 5>tUtF G5_^UVWu} pUtE GNuXuBuփv0VWu; #Ut(U)UUU}uEEGNu_^UVWu }}tMu_^U=X1tX1jYUVuj jV ^UV5T1Nx 8^U=X1tX1u,YUVW'Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^U}x}~uPYYUi\1mNA90\111UU\1UVu~  ud16EP YEU UEPEPV^ yE^UVux95$4 3^UVujuu V!^UVujuu V^UVWuEEEu} tE 02tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+d1"}t}y UU_^UVW}u YfE=h1h YEu E PU:/tHh YEt/u uYYuhuW E h u& YYEuh1E+UMuRQA uuYh11WY-E8\t2tF>#tEPVu  u&E8|t E8:uusY>t >|t>:tFF<|t<_^UV5h1t}uEF<:t ~u12tFjuVl uˀ~#uōFPY^UV5h1t}u7F<:t ~u1&2tFjuV uθ^UVW5h1E 8t}u1F<:t ~u12tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F!N# \!#GF9GE UE 8E_^U VW5EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"!+EUt!!U FE5_^UVuu>t FPUY^U$EPjj U$UUU UEPj%j U$UUU UUUEEPjGj U} vd1M E 1U} vd1M ҋE!1UE1UE1U} vd1M Et1UUM J} t U R Y]uEPu v 1UEUUzt RYuh,5U RuZBRY,5 UVW11}U91u 1F߃| jugYtUr YtURtUzt rY}l1t}1t}1t uY_^UVWuEu41}%<1t41YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<1t1Bt 41aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<1t,1R@t1Bt 41YGƒ~uF85FF VVv vv >uNN FFSX_^UVWEE11<1tN|1DFρECEE0-EMP1E E !OU :t! EE E !&U uuuc YYEy@Ut8huYYE~" tuYuu YYE}y1]jYEu uNY1A!uEUMJUzUBU1E_^UU Uh1uu UVuh} t1Pu V^UVWu} EX1}t}@t}t ~tVt vYft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huOg7[kcG' G s 2JjUVWE_^]T$ L$ UVWM7E_^]U D&1Uujj Ujuj U$UUEPjjg y U(41UVW5(4(4}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډd1F_^U$UUEPjj U$U UEPuYYEPj!ju U$UUEPjjW U$U UEPu<YYEPjj) U$uYEU UUUUUEPjj U$UUEPjj U$U UEPuYYEPjj U'2E Pu ULVWE1EEU UE8t+0tFN>Xu E0EEF>t&azjuYYyEG߸X&_^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$} uEEUUE UEPjJjy y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V`5X55h5hL5jKj ^UU$VWEPf YEPEPj^ jYƋ}t9uvE|EP# YEEPEPj W[YUUjEP YYEP YWj5YZ)‰jEPj jEPj t9r)օu jYVYU)_^U$uYEUUU UEPjj Uu hT$u UV& T$@, T$@% T$@d1\&E uVu ^U$EPu6 YYEPj j# U$EPjj y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U t&/ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE&j uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U&y EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U' JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEд'UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P;E6U U RU U RUEEE$'E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }X1~y UVu CV€tu ,fNV~1u>51(Yt.h)YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv2 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv# =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u M+UUas U EUh'h1YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j U$EPuYY1ۅÉU$EUEPjHjY UUUuuu | UVW}u M)9r/r uu fE_^]t|{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉_1ۇ04tPXP78IFP/FFF"ELLE: more than %d file args, %d ignored. ELLE: bad switch: %s FundamentalHOME/N4Y"Use ^X ^W to write out bufferUse ^X ^S to save bufferQuit? Quit: buffer %s still has changes - forget them? Quit: buffers %s, %s,... still have changes - forget them? ByebNo shell!/bin/shSHELL/bin/shSHELLCannot forkELLE: No memory leftSomething overwrote an allocated block!Set Profile: ABCDQBad profile formatCannot open file/ELLE 4.1b.bakNMark set/usr/src/elle/help.dat.ellepro.b1 ELLE: not enough memory ELLE: %dx%d screen too big Cursor out of windowfix_wind failed|## l# #G)i((type unknownDM3025DM2500H19H19TERM " terminal ELLE: "*)))wy9x1[?2hGOq\y5b**<*F*v*i*~**EE+**+Y++++K, ,,,,,--------J-0,,,L+.$.+..+.+.+..Y.f-- .ME0./b/ O@0]000NA10A11qplacks cursor addressing or clear screen.sgcoliMTkmxnamdescription too big! - cannot allocate termcap bufferSBMSBX%sERR: %o %s %s: %s WARNING - FILE CORRUPTED! Buffers affected: ELLE stopped by fatal interrupt (%d)! Type S or W to try saving your work. 9?9A9B9Ce:D9Qe:S:W :Already saving -- continuedSorry, no diagnostics (A,B,C,D,S,W,?)<<N<Huh? Try again - ELLE Internal Error: Select buffer (%s): => That isn't a substring of any buffer name!Select existing buffer (%s): No such bufferKilling in-use buffer; select which other buffer (%s): No such bufferKill buffer: ) ( * Buffers in this ELLE: **SHOW**EOL Mode is LFEOL Mode is CRLF] (no EOL at EOF!) of [line Col Line , Page Dot=Main **LINES**No such bufferBuffer %s contains changes - forget them? Already 2 windowsOnly 1 windowOnly 1 windowToo muchOnly 1 window!KIK!K!K!K/K **SEPMODE** **ASK** **MODE**No such window------------------------------------------------ (Hit space to continue)----MORE-- (type Space for more, or type any command to flush)_PEPRP--BOTTOP -- *: ) MacroDef Fill (Find file: Read file: Visit file: No default file name.Insert file: (No changes need to be written)Buffer %s contains changes - write out? somethingBuffer %s contains %s, which buffer shall I use? SB rtn cannot read file? Cannot read - too many internal files Cannot read Cannot write - (VUUUPXWW!Xrename error!Written Output errorWriting...No default file name.bad iwritfile argWrite Last Kill: No killed stuffWrite Region: No Mark!Write File: error - %s Saving %s.../+nul:f f f e fNo mark!Dot out of window *SHOW* No help found **HELP**...Loading ^X-M-M-Help for command: *KBDMAC*Kbd macro active, ignoring "Start Kbd Macro"No kbd macro definedAlready in kbd macro!Current Kbd macro: No kbd macro defined/* */ Search FailedSearch: Reverse Search: ...Nothing to search forƂ  Zuf I-search str too long (FAILING)I-search: R-search: Query ReplaceReplace String **LINE**Replace in Line $ $ !,.?߅^knot implementedSP=Replace, DEL=Don't, ESC=Stop, !=Replace all, ^=Back up, .=Replace & Stop%s%s %swith string: Replace string: .,;:)!Fill column = "Fill Prefix = "Absurd Fill PrefixSelf-checking offSelf-checking on %s error: %s !!! SD listSBBUFMem mgtW>FELRPbWFW !?BCDrMQgVWXZ?? Type ? for help OK Failed: %s D>basenazgul010stonesexfingersforeskytoothroneLoop count = %ld XERR in pattern! XERR after ins: %s Line AddXERR after pop: %s Pop;XERR after yank: %s Yank %ld;XERR after kill: %s Kill %ld/ %d; - GC lev %d Pass %ldTypein stop. Bufflen: %ld Line **EXORCISE**%-40.40s %26d %-40.40s %2d %-5.5s %6ld %3d %1d %4d # Flags Boff Len ! Cols Line ht / %d pos / %d oldz/ %ld emod/ %ld bmod/ %ld dot / %ld topldot/ %ld redp/ %o buf / %o next/ %o Window %o: cur_dot/ %ld cur_buf/ %o cur_win/ %o SF table inconsistencyP9A֚ʚSDMEM 0SDMEM 0[y[[>-Readin SD: %oNo fileReadin blksiz errKILLN SD2 failedGC loop, cannot free block of size %dSwapout wrt errSwapout sk errSwapout err, SD %oSdfile 0, SD %oSwapout wrt errSwapout seek err: (%d,%ld,0) %d %sSwapout open errSwapout creat errFFND blew it, but recovered. SD %o siz %ld%s %d:%s, %ld:(%d%s,%o,%d)=%ld (fl %ld)(swap)Rd errSk errCan't sbrkZero sbm_nxtra!getsplit err: %oSBRK %o != %oNo uNXM node!SBRK %o != %oAlign errfree: bad arg %orealloc: bad arg %oZero sbm_nxtra smblk nodes are %o bytes long. sbm_list: %6o sbm_nfl : %6o Memory Usage: End - %d nodes on SM freelist. Free SM flagged Freelist node has flags: SM freelist loop LOOP - %o seen as node %d!! %s%7o-> No list. Maximum loop detection size is %d.Tracing SM node freelist -- End = %6o Alignment error! BAD!! %6o expected; Bad free-mem blockBad free-mem blockSM: len 0Zero-length area!FREE SM: bad node IDBAD - no node ID! Bad back ptr!%6o BAD Backptr!! ^ Loop in mem list!!LOOP - seen as node %d!! %6o: Flags: %s %s No mem list?!! No list?! Tracing mem list -- %7o = %s %6o %6o%5d. %5d.%6o: FREE %6o: %s End - %d nodes on SD freelist. Free SD flagged Freelist node has flags: SD freelist loop LOOP - %o seen as node %d!! %s%7o-> No list. Maximum loop detection size is %d.Tracing SDBLK node freelist -- %s %s Printout of all in-use SDBLKs: %7o: %6o %6o %6o %6o %6o %6o %6o %7lo %5ld. %c%c%c Free SD flaggedBad free SD, non-zero flag: SD freelist loopSD freelist loop at %o SD freelist too longSD freelist too long (%d) ----------- SD loop (on freelist!) LOOP!! This SD already seen%s. Too many SDsToo many SDs for table (%d) SD addr out of order Bad disk addr, not in order! SD: bad sdfile Bad sdfile ptr! Shd be %o SD: SM len < use Bad SMBLK, len < use SD != SM Bad SMBLK? Len conflict SD: bad SM Bad SMBLK ptr SD: neg len/addr Neg disk len/addr Bad SD node ID Bad node ID! SD bad slback Bad backptr PSD bad sdback Bad phys backptr %s SFPTR1 bad BAD!! Sfptr1 %o doesn't match SD %o!! SF: %o, fd= %d, ln= %ld Phys ---- %sList started: SD loopPhys SD loop(on freelist!)Backlist loop!! Dup'd node:%s Too many SDsToo many SDs for table (%d) Too many SDsToo many SDs for table (%d) SBFILE printout not coded: %o I/O ptr loc: %ld. sboff %7lo = %7ld. Bad sbdot BAD sbdot %7lo = %7ld. Bad sbwleft BAD sbwleft %5o = %5d. Bad sbrleft BAD sbrleft %5o = %5d. Bad SBIOP/cnts BADBad SBIOP BAD sbiop %6oSBCUR has bad SM BAD SMBLK ID!! %s SBCUR not SD? BAD SDBLK ID!! %s sbcur %6o sbflags %5o = %s (%s) (io,cur,r,w,f,.,+ = %o,%o,%d,%d,%o,%lo,%lo) Zero pointer??? SBSTR %o: Ptrtab overflowunknown errorr/etc/termcapTERM/etc/termcapTERMCAPV 0123Ebf nrtj\\j%+2djirOOPSOa<rw&+sbiNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0/Q @*NX7bd.i.o%p7u.x7' #+-0"LhlEGX b cdIefgiInoo p rsu x (null)cannot print floating point t5xkkk#l4lHlYlll1mWmgmmm~nnnnnno#o4oHovoo3pbp_qqqqr+r]rrrrr?h@AlBxCCCCCQQQRRHRR SSjH|IJ^JJKKK8ssstt(t5tPy({{{.|}c~}kX~PӉ~~ip08#yzNqp ]O%\i[aV TSonUk3J%s-^0_1_2_3_4_5_6_7_8_9_;|<8>9[.\]-B CD F G)H/I}LM{NO`PQ0TUVPW&Yj~6 5C< D ( 7Z=@'>B$!$t%r(d)e*g.v0K1G2F8L9M=:^IB2EfFuI?K4OHSATw`*0*'@+ht|G!24''  A+halALbcceclcmdcDCdlDLdmedeiiaicICidimipmmmopcsesotetiupvbA - Abort process B - Breakpoint (must have "bpt:b" set in ADB) C - Continue D - Diagnostic command mode S - Try to save current buffer W - Try to save world (all modified buffers) [ ]89 _Nix $44Q - Quit diag mode ! - Goto subshell V - Verify Mem & SD lists MF - Mem Freelist M - Mem list B - Current buffer SB DF - SD Freelist D - SDs in use DL - SD Logical lists DP - SD Physical lists C n - Compact; 0-7=sbx_comp(n), 8=SM freelist, 9=SD freelist. W - Window printout X n - Xercise randomly (GC every n) Z n - like X but with notes /tmp/sbd.XXXXXX U@N EMDU-Used, N-NXM, E-External, M-SMnodes, D-SDnodes SM: back smaddr smlen smuse smflagsL@T * flags: *-MOD (disk outofdate), L-LOCK, T-LCK2 (temp) SD: slforw slback sdflgs sdforw sdback sdmem sdfile sdaddr sdlenOWO-Overwrite, W-WriteSSSSBl111 ((((( AAAAAABBBBBB Unknown error<&0&&&%%%%%%%\%L%8%,%%%$$$$$$$x$d$T$D$,$$$#######d#P#3333333333<#$##""""""|"h"P"<"$"""!C@9  9%l1$T$L%%su;SSSSu QRP\& PU4VWx?}? u u0YY5Yd?5Yh?5Yl?5Yp?=d?t=h?t=l?t =p?u h4 YR5d?h! `R5h?hP" NR5l?h"i = #t!#R5p?5 #? 195!~hЃtUЉd&ЉӋh& YӉl&95}5F됃=?t.h$%h0 5?# u5?h YY=?t.h<%h 5?# u5?h VYY=?t h AY=?u =?t/Kt=?t=?tjY=?ttjY=?t t jqY=?t t jRY=?u =?t t 5? Yj#Y=?t t jY=?ujY=?}ƅh YDžtWPw%YYh Pd%YYh PQ%YYh$%h P" uPh YY=?ƅh mYDžtWP$YYh P$YYh P$YYh<%h Pw! u0h<%h PZ! uPhd YY/ t8_^U VWEu UU?M}:-t?uEjj h$#EP6ǃ}t E076h hT% zWW}V-0= rv]YWMS}RW N ?6h hT% E G36h hT% E }tjTY_^UVWu1҉׉UE EU9U};6uYYEt}~*}uuEU뽅tE 8E_^UVWu }GEtG9]tu%}~F뮀>t1_^UVWu }tu1SEEDžt19t'1= uW'YPSYZ9t1F9u_^Uu uYY~1UVWhX2 Y195~Rd? QhP YYV"YPVh@ WYPh8YYh0YFhY195kBh? ϋh?]QSh  URYPhwYYWZYPh cYYh WYh GY195kBl? ϋl?]QSh   URYPh YYWYPh YYh Yh Yh Y5h YYh` Yh@ Yh Yh zYh oY_^UVW?hNYhTCY195~d?PVYYFhDY195~+Bh? h?ˀPSqYYh,Y195~+Bl? l?PS1YYh(Y=?t5?hgYY_^UVu ~95}uoYPVhG WЃh&uuEYPVh -h&uYPYPh ?^UVUUUUUU5UUEE5UUEE5UUUU5h<%jjEPh<%5j5d?=th<%5j5h?]=th<%5j5l?9=th<%5j5p?^UVuVY! ‰^UVU!փa|z ^UVWuFDžt WYuuE6%"FEEFt "uFF"%_^UVW}%tXF-FǀtMF-F^F@uDFEFLFF%_^U VWDžh}uhWYhpLYDžPYE9UUrd&ExuuhDYYUR ׅuh19~lWYYF9AlEf19~Dh9lt2}tluh<` lh4JYYFh0;Y_^UpVWh0!YhYPf Y9=eցd&WhYYt~u hY+vhEP vEPvhG_^U VWh|YE9UdUցd&>tL~uuh YY5VUuEV ׅuWuv6hh E_^UVWhYhYhXYP" YE9UUׁd&?tuuh( YYwWULEEPYFu捵LFE!}"u jTYU#jAY_^UV$u;u= tu t5#^U<VWDžG=[}tD;-=u1"t5#1,G뫃"tVXYuՉ5#@BR' YBPrYY_^UVu ~%} (t)t;t"t \t1^UVWUztERURׅu1Bt18#>t6wYYt7VYwh\e YY1_^UVW}1}Gǀd&ǀh&ǀl&ǀp&F뱸t?_^U$VW}WY=}FhY1WU9EPw}YYtU܉UhhY1pG$?thHsY1WU?th(SY1zWU?th3Y1ZWU}~ }~uh YY1/Uցd&>nU9uAuvYYt0uvYYt~ uv YY~ tF Pvv6h~E}iUЃd&tSUul&YYUuh&YY~U9Utuh YY12E늋UUV UVUVU9}t?_^UVW}t EUu&1QUz'1BUr YUB"u1UUzth[Y1UrYEuUrhl0YY1195~El? 9u1Bl? 9Mt%UruW^YPhD95-9|h$Y1C5l?EBl? ǀ195~Eh? 9u1Bh? 9Mt%UruWYPh95-9|hY15h?EBh?T!֋d?:t.d? 9MtUruWYPhsEd?t?_^UVW15d?9=~FG1҉t?_^UVW}u$1}WU"1nwyYE G}u1I195~=p? 9Mt p?:uEp?t?F1_^U VWuu %EVHYEF}u }u^u$}uPY%WYǀ>-u]F>uKVfYPY VNYPY zV6Y%iSuPY=Pu }u :Du0FPpY=EuFP^Y=Lu >u_^Uj jYYUVWuu1T1҉U׀>-uFEFEt-0= r1)k U0փ}tډ] _^UVWu1tG6_^UVW}1~9=|Ћh&օt_^UVW}5~$h&WWYYt Nu11_^UVW1} UF195~d? MϋBF195~Bh? MϋB195~Bl? MϋB_^UVWu }}~ GFMu_^UVW}? uG?tWWO YZN> tF_^UhhT%YYu,u(u$u uuuuu uhT%u,hhT%cYYUu,u(u$u uuuuu u(#h?5#h hT%Uu,u(u$u uuuuu u7(jYUVuj jV ^U VWUU UR=YDžu1u9v _^UV5%Nx @^U=%t%u4 YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV@&U9@&wU@&9@&v % 16VYt1'@&rF5@&&Y5@&^UVW}u1E}UUs % 1=<&u8j<Y=u1V!փ5<&5@& FE5D&OVU}9}r69v2W9UvUW~>}t ED&u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=D&<9}r79}u+UOJ}t ED&URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15D&t 9ur6E0tU UD&tU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0$tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ %"}t}y UU_^U$UUEPjjg y U%1UVW5%%}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ %F_^UVWu~y V0t VuN FtN V€uNVu+~u%hSYF~uN NF 1}9uNN FFSX_^UUUuuu x UVW}EEL#WUW YweY*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U X?}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEpz uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEИUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%5@%Yt.hPYFu NLNHF 9h"YFuN!NF V@uVVVhUFt$jjv" =uN ?jEPvL =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhhT%nYYjYUVuYƋU rU MJwU uRYY^U$EPuFYY1ۅÉU$UUU UUUEPjj_ yEUu hT$u1 U$UUUUU UEPjj U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇ%tPXPf_debugDebug Modef_bkptHit Breakpointf_wfexitWrite File Exitf_retsupReturn to Superiorf_pshinfPush to Inferiorf_indrelIndent Relativef_indcommIndent for Commentf_backindBack to Indentationf_indnlIndent New Linef_indatmIndent According to Modef_fillmodeAuto Fill Modef_sfprefSet Fill Prefixf_sfcolSet Fill Columnf_replineReplace in Linef_querepQuery Replacef_repstrReplace Stringf_risrchReverse Searchf_isrchIncremental Searchf_rsrchReverse String Searchf_srchString Searchf_appnkillAppend Next Killf_unkpopUn-kill Popf_unkillUn-killf_vkmacView Kbd Macrof_xkmacExecute Kbd Macrof_ekmacEnd Kbd Macrof_skmacStart Kbd Macrof_describeDescribef_vtbuttonsVT100 Button Hackf_argdigArgument Digitf_negargNegative Argumentf_uargUniversal Argf_pfxextPrefix Extendf_pfxmetaPrefix Metaf_setprofSet Profilef_mvwbotMove to Window Bottomf_mvwtopMove to Window Topf_scdnwindScroll Window Downf_scupwindScroll Window Upf_pscreenPrevious Screenf_nscreenNext Screenf_newwinNew Windowf_2modewindsTwo Mode Windowsf_sowindStandout Windowf_delwindDelete Windowf_shrinkwindShrink Windowf_growindGrow Windowf_othwindOther Windowf_1windOne Windowf_2windsTwo Windowsf_wlastkillWrite Last Killf_wregWrite Regionf_wfileWrite Filef_savefilesSave All Filesf_sfileSave Filef_ifileInsert Filef_vfileVisit Filef_rfileRead Filef_ffileFind Filef_whatpageWhat Pagef_goendGoto Endf_gobegGoto Beginningf_eolmodeEOL CRLF Modef_bufnotmodBuffer Not Modifiedf_listbufsList Buffersf_kbufferKill Bufferf_selxbufferSelect Existing Bufferf_selbufferSelect Bufferf_fillparaFill Paragraphf_mrkparaMark Paragraphf_bparaBackward Paragraphf_fparaForward Paragraphf_fillregFill Regionf_lcregLowercase Regionf_ucregUppercase Regionf_copregCopy Regionf_kregionKill Regionf_exchmarkExchange Point and Markf_setmarkSet/Pop Markf_golineGoto Linef_bklineBackward Kill Linef_klineKill Linef_delblinesDelete Blank Linesf_olineOpen Linef_uprlineUp Real Linef_dnrlineDown Real Linef_prvlinePrevious Linef_nxtlineNext Linef_endlineEnd of Linef_beglineBeginning of Linef_uciwordUppercase Initialf_lcwordLowercase Wordf_ucwordUppercase Wordf_twordsTranspose Wordsf_bkwordBackward Kill Wordf_kwordKill Wordf_bwordBackward Wordf_fwordForward Wordf_tcharsTranspose Charactersf_delspcDelete Horizontal Spacef_bdcharBackward Delete Characterf_dcharDelete Characterf_bcharBackward Characterf_fcharForward Characterf_crlfCRLFf_quotinsQuoted Insertf_insselfInsert Selfcannot open output profile "%s"wwb.ellepro.b1/HOMEcannot open profile "%s"r.ellepro.e/HOMEbad usage, see doccannot open output file "%s"wcannot open input file "%s"rcannot init, no memoryFdumpPdumpAllconfCSconfCMconfFXconfFconfPconfProfileEPLZellec: bad switch: %s ellec: bad switch type: %s ellec: ambiguous switch: -%s = %s or %s }; 0, 0 sizeof(extmap)/2, extmap, sizeof(metamap)/2, metamap, sizeof(charmap), charmap, %d, /* Ver */ struct profile def_prof = { }; */ %s /* %4s 0%-3o,%3d,}; char extmap[] = { */ %s /* %4s 0%-3o,%3d,}; char metamap[] = { */ %s /* (%3o) %3s %2d,/* This file defines the initial data for ELLE's default user profile. ** It is automatically generated by ELLEC, and should not be edited. */ char charmap[] = { %d errors encountered, check output file. ; Extended commands ; Meta chars (keyallunbind) ; To flush all existing bindings ; ELLE default ASCII profile (keybind %s "%s") ;INTERNAL ERROR: No name for function %d while mapping key %s ;INTERNAL ERROR: Bad function index %d for key %s \ %s.o%s %s internal error - no name for function %dFUN_OFILES = # Function module definition file, generated by ELLEC unknown-moduleEFUN( %-12s, %-14s, "%s") "%s"EFUNHOLE /* %3d */ /* 0 */ EFUNHOLE /* Always undefined */ /* .H Function Definition file, generated by ELLEC */ (efun %d "%s" %s %s) unknown-moduleunknown-addrinternal error - no name for function %d; Master Function Definition file #define FX_%-14s %3d #define FN_%-14s %3d /* %s */ internal error - no addr/name for function %d/* FX_ defines Function eXistence in this ELLE configuration */ /* FN_ defines Function Numbers (indices) for all known functions */ /* .H Function Index Definition file, generated by ELLEC */ undefallkeyallunbindmenuitemefunkeybindunknown op: (%s)efun - name or address dup! "%s"unknown-moduleefun - redefining function (%d "%s" %s %s)efun - bad function index %defun - non-string function moduleefun - non-string function addrefun - non-string function nameefun - non-value function indexefun - not enough args(keybind) redefining %s as %d="%s"(keybind) too many M- commands(keybind) redefining M-%s as %d="%s"(keybind) too many X- commands(keybind) redefining X-%s as %d="%s"(keybind) no such function - "%s"(keybind) non-string function nameYhaCMXnunknown function ellec: Line %d: %s K&a7&r&w#&&+o&be&+ *@*,X+b+d+i+o+p+u+x+, ,#,+,-,0,/L-h-l--E}/Gh/X.b.cO/d/e}/f}/gh/i/n7.o.p.r/s.u.x.(null)cannot print floating point `&X L < 0 (  h \ L D 4 ,   p d X L @ 4 $   xl`PD, phXL<0 |ldXPD8,$|pdXLD4(|pdTH4(xh`L@0$th\H<,$ xh`PD4( xlXL<0  #yzNqp ]O%\i[aV TSonUk3J%s-^0_1_2_3_4_5_6_7_8_9_;|<8>9[.\]-B CD F G)H/I}LM{NO`PQ0TUVPW&Yj~6 5C< D ( 7Z=@'>B$!$t%r(d)e*g.v0K1G2F8L9M=:^IB2EfFuI?K4OHSATw!0P"'" ? ? ? ?| ?t ?l ?d ?\ ?T ?L ??TLp@C0 $ ((((( AAAAAABBBBBB SSSSB$%<%T%lA  P048^h1$T$LX104su;SSSSu%% QRPpcJPUV1}"ifǀ48iǀ88F1s fuxcF^UVW}u xc44\Hs-9Uu\H`H5\Hˡ%%Ɓ=%\Hu %4495\Ht95`HtVY#UfU UxctG UxcijP5H- hV5H- =t!hʝY1} Godž\H`H5\H_^UVWut >uVY Uxct nvjW5H- %fEhV5H-* =t h(YdžfMf Uxc_^UVWE}}iE449EtEiE48"uFu¨tt~t h蜗Y-aU z^U VWU:!ujRu uɏa}u'io9E u}6uuuĦYY1EU:>uz>u EEjumYYu}u}uhY}thuYYEE}y*hu7YYEyuh蕖YYEEE 9EGuHYVwYljBj VWZYZWVun 9} h1YE멹E PEZ)BoyuY_^UVu}%u P*1҉U U>!u =Puh\ĕYP!}uVY=Os VhPYY=*t0|gt$=ou ohsh(_YYJ}u V謊YjVu u衍1=ou@PY^U|VW=sthYo}tE3U:/t):?t$}ugvPhYYlu.YEUzu$}ugvPh臔YY3UR蚁YEsjYs=sE+o؉ƋE PEZ)BU1}o)zo)RBFYEjuun 1ۅ1}t@9u;o)ixguEPYYoEP0Y=oNMfssuY=o_^U}zEkd=oPE|gP5ot |gPt P=sts,Ph8ǒEPh謒YYUVW}}4uoh聒Y?tfhyWXYYu5L-uϣYt W蕛Y95o|3~/ixg"h`-YWhyYYL-_^U VW}u#}tU:tuuWu uu yBu yJ1x95u##uPh蔑YYhuEo}~EE8uMuآYtu蜚Y5y*uuPh'YY_^UV=yxEyB9u~6o9Pt(}t} thxYoP} u>X)X)u$Yt o hH薐YX)`|g!ƃ}5u|g f|guhYt o hBYu|g%f|g^UVWE}t U:=uu =o'o1҉U׋u9U6VYEu9|3u uu8 uu u1E-~)u uu8 uu uGy9Uwu[uu8 uu uVYuz uu uu]uu8 uu u"VYuz uu uUB}E=ot=ot}t,t(u uu8 uu uouU:E tt*FU ttEU:tu뼋EEFy=ut5uh̍YY_^UVu>uhdYƅu h蟍YVYyVY^UVWU:uH}u!j}tPYYj}tPΔYYuu>t#> t> t>u~tFFUE؀> t> uFUu?t?utGGUEU}t}/u&h}tPVua!j}tPVu>_^UU:u j]Y,hu1YYu jy]Yu_YoUVW}t?u =lPuhYllPjWhlP/ PhlPhs=sttpPhxhuJjhuYYEyhuh`臋YYu-uPVuQ E~ uu莂YuusWhL/YYu> tFFhuhsYYt%umYu hYYhu"Y *M*xghxgV$YY=xguxgh虊YM *_^UhhyYYhhhYYUhXhP*7YYuh0?YtJh-jRj5o詼 P |gh$Yuz uu uhsYuz uu uh~Yuz uu uh-j5o耽 }bjj臵YYEjjYYujmYYjY=ot =ou jj\iYY'U(VWo}*u==*t E$E hvYE}tI1҉PP9U:/t:?th谈Y u"YEURuYE}}+u>tU9t>\u~tFF߀>tF=)u1҉PPP>t_O1=PP1=PP1=PPFPhYY9F`0=Pu =Pt6=ou-u uu8 uu u=jBYs=sa1҉U؉UܹEEE 9E#u9YEjuuz E܋UU迴uE؋EU9v E GWuuV{ UR(UWWYZ׋UzPuU:t%E G=Ptjuu7z uEEGuG UBii]huPSA =Pt+hu Yuz uu uiExgEsu螱Y=stU܉oy<}u hͅYH*9E|uuh讅 o_^UVWu}?"uG?t PY#U U RVYY}8cxgUjYs=stu V8YYsۋU 9U~U+U xg 9u~5xg_^UVjYs=s}uuuuu uEƃ}uFhhuj xdu uu8 uu uh,hu.YYt'h(huYYihuP;YYFs2jj0dYY^UVu>"uF>t P7YjYs=st%jju xgNs^UVWE9ouhlsYEPE Z9uE EEP5YPhu'YYhu;YEE 9Eu]5Yǀ? t? uGWY=~h8҂Y}uV~RJЀu.tJЀu?tJЀu!uBj huVZYZBj huVZYZWuP[YYWsY3Bj huVZYZƆujYs=st9ee E huu u[= s뾹E PEZ)Joy0_^UVWjpYs=sQEEE 9Eu3YE8u }E1UU: t UU: u,UU: uG**PY)E뾃}'u **)щ΅y19E=T)t,*9!UAMƀu *)؉ԅ~UAMƀu NEƀuiEEi]huPS; EsE PEZ)Bo}'u y y_^U tU~  E>u E> u EEEMFhuW5YYiEE!)V}~h~Y BRW92YY9suYPEZ)‰oy=ou!xg Uxg}t h~Y}t h~Y_^UhUVWEEE 9E}u'uhhuY hu Y1u/Yƀ>> u-}t'u uG*u~ = |>u*u^u5@uuBt,}u&Phhu螸 hu Yu uG=0{u:9=u2u uu8 uu u+uF}uu$uu uu8 uu u }Eb_^UVWu} xgUhlu YYu E)EPu YY9Et}uhP{Y!׺#UU}u9u|9}} h4{YjiYs=stQj YWV YY} tWV/YY9u| )+UډUjju< s릉)Uxg|io9xg|ioxg} u,$y_^UU:u hpzY uYUVWu=%thzY%>"uF>tu¨tu hgzYhSP` DžPh:zYY,rPh zYYj\WP %_^UVWE}}'E]4|]4{]ƃtEоH>tt F@>tt F>tGt ^èt N4{F4|봋u>tM~tGt ^èt N4{F4|u uE} }Et E'u 'uu u_^UhY4}uj&hj jڠY 54}MYu@}hPj0YYjzYUU%:t5% YP5%j %:th-j5%ɫ hPjjĴ %U=%Pf8} P hPhQ Q fQQfQQ@fQ#Q%Q'Q(QhQjj %:t5%YP5%j %:th-j5%譪 %}jj誢YYtJh-jRj5o Pf h-j5%Q hYh-j5%1 .jjh@}k =@}:u9ou uu8 uu uojjUYYhpQjȡYYUVh4Qu ަYYƅtE0^Uu uYYE8u9jhj色 ju jz jhji jĝYUuu~YYuu qYYE:t ] :u E EU4Q8Q4jh j jXYjh j j?Yuh@}趣YY h hHYYh hDYYh hoYYh h h%h%h h%YYh h%YYh 誤Ywh h h%h%h h h%h%h h h%h%%:u%%%%h hPYYh hTYYh| hoYYhx hLYYht hXYYhl hp h%h%hh h%sYYhd hbYYh` Yth\ Yu10{hX ģY@jYhP hT h%h%whL h\YYhH h`YYhD hdYYh@ hhYYh< hlYYh8 hpYYh4 htYYh0 hxzYYh, h|iYYUVW1҉։׍EPhTj觮 x UUօtu&}u h SYth CYu|=t|5u=t| =u}jh j蠮 TjY1_^UuM uu8 uu u1UVW}5uGFЄuVu_^Uh-j5% }u&h-j5%ؤ %%\}u#h-j5%謤 %%3}u#h-j5%胤 %% % U%:th-j5%F h-j5%1 uM u%:th-j5% U=u@}t$u-@}Ph@}j u@}U塨u-@}=~$u-@}Ph@}jĬ u@}U VWEXTVs;9Vu+~JWZ~z%UAMMfQ؃뽾VWs;9Vu+~JWZ~z%UAMMfQ؃뽋E_^UPVW}=H-x 9=mNxk\T~k9hTuy NxkV~k9Vuy'W*Ph`)h EPEPrY_^UVu~~VUF6ϙYuBY^UVjWY5H-荪YH-1 }kVPYF5Y^UV1}kXTPgYF5Y^UUWU(VWEuE u EEE=t=Wu# W W=W.t W W=WuPhWYE}~'UJkk]VPVSMӾVFzW=a|.W=z W-akƁXTVNY>=W.uVV7Y'WPh, slYY1҈WWWVEFEu.E u%E PEZ)‰oy$ EEEUM9 g}EuYljE؋UJgUEU9U} G< t#Uω+U؉VE EUUUM9 g}EU9UtuYljE}؋UJgUEU9U} G< tE 9o|#U ω+U؉V U+UV~ ~FVRzYEU9V~UAMUxcUfQE_^U4VU 9Ju5H-1UrFPh`)h| EPjEPLYYƋEU QijSV hhuV* =t hL *jY95H-tV蟦Y^UVW=t@=WuLW=1|W=9} W@W W W=W.t W WW=A|*W=ZW-AkƁXTW=a|*W=zW-akƁXTwW=1|'W=9W-1kƁVB=W.uV2=WuV"WPh hYYW1~u8=WtWPh hYY h hYW1W~te} t;E2} t,Eu EPY=tEEU({~u]jViYY~ t F ƀujYs=sFuPuYYsjYs=sVJ׃~ ~#WVYYF ƀuhuulYYO~WVYYhuuOYYOjVYYFuPu/YYst({PEZ)‰oy }t ({JE_^UVW}a|}zUakƁXT ~u1~tE~V +V9Uw V +VfjVYY~u F ƀu*uVUF u9Es EEG} uthuu )YYV +V_^UVW}F>t9t>\u~tFF>tF_^UVWu} >;uF¨ttF>.uFxg>$uFio¨tt5E¨ttk] Ã0]FiE>'uFPj5xg( Fc>/t >?UVYE'>/u1PSY=~ JV7t)YY V7*YYu?uu>-t U:+KFE¨ttk] Ã0]F}uEUPu7?! >;>+z>-qE~9o}5ohX "dYY_^UVoxgW=o hjPj:^ ƅu9h jP褡YYu uh-j5o茗 (u uu8 uu u_jPzY=ouxg9W:oxgW=P)=oxgh jjRR^U,VWU::uEU:"u=o>%uEioEFl>0u1҉UUFYxgUEPViYYƋUU}t>,uFEPVIYYƃ}SU9U~hLbY;19uu@E¨ttF>u}Uxg¨tu EEU ttEEUЃ%t#Uu%V襟 tE̋Uf%fUUЋ%UuVuh4+a SuUt>!u FfEfE¨ttFU>u1҉UԉU܀>~\t ~%t~#u FG\G=suh`YhsWkYY?tGEY=yuh J`YthyW1YY?tGE"GEG  hF3}t&}!u =u!t}6=u!}=ot(u uu8 uu uhu]Yuz uu uu uu8 uu u_D}t>=u>t5huVY&UuhshuYYuuUu.=o%Uh %h ^ Uu%}uU%h ^YYUu3xg9Ut(=o~U%hp V^YYUu0U9Ut(=o~U%hH ^YYFUu$>tU%h ]YYU e}!uUS>!tN?tG¨tt6UU%t  Ph ] G봃}tU@tEioE}tU€t1҉UUUt?=ot6=u-u uu8 uu u]EUVPuuu%_^UVju荙YYƅy14hhV聙 EV Yjuh ^UVWuUU 9`{Džll}1UU 9v'> t">|t9Eu~|uFGFl{P%YF_^UVWu E9ut Vu8YY=t]jYs=s>9ut Vu7YYj.Yjjuj @xgs9ut*EPZ9uJhVR 9ut VuYYuUxg}t xgЉE=L)EE9oxgPY=tEP Y=Eu? t? u GUE}uv5Uhu5xg7YYE-uxgxg9~5xgj5xgV:YYxgP_ YUE9u#UUU#xg O9}w¨tuG#xg)RWu^ E=L)xgP Y=¨ttG9=?%xgxg95xgxgPEZ9uUxg%xg95xg}V5xgh YYxg({hj}u&'xgPRR=({t({xgj5xg@YYxg5xg+U9xg QYxgu4xgxgЙPi Yxg xgjbj5xg& EPxgZ9u"U9U|Uxg9UU~XtEuU E=L)yxgP Y=? t? u GUE+# xg9|1=~(xgxgR5xg YYU95xg|}thu5xg YYhuV5xg7 j5xg6YYE-u#xgJxgj95xg}V5xg% YY}uj.Yjj5xgO @xg'95xg|}th5xg! YYhV5xg xgBj5xg>6YYjgZYE} uE xgBEPR5xg? xg95xg5xgjj5YY}95xg|%}tEP5xgx YYxg5xgZxgPY#xg9uEP5xg2 YYxgBEPR5xg xg=+EPh豒YYj5xg&5YYxgJjRYYE9tERZ9zju4YYj腑Y\Ep鵩95xg}V5xg YY=uj.Y5xguYYxgt xgj5xgV4YYoxg_^UVWEEE+o=o@**oE RRΑYHZܨjjYYjjYYh(jYYh(jYYh(j YYh(j sYYh(j eYYh(jWYYh(j IYYh(j ;YY#=\thThh\5\X=`thHhhP5`X=dth<hhD5dqX=hth0hh85hKX=tth$hh,5t%X=xthhh 5xW=lthhh5lW=pthhh5pW=|thhh5|W=thhhhhWEU9UUM :-@*hYQYQV1jyYwUM ztUUWEUM UFo:o.UM 4hPYYUM B)E+U9U};UM :+u-UztUAMM U EEU9UUM 4hoSYYEU9U}Nho\Y@UM P4KYZ=s(hho豍YYUM 4ho蜍YYhohuYYhujjjj赿ouyh|gxYEtS8tNuhu葍YYhuhu蠍YZ‰Uz/t EE/htu]YYhuYhlYhdwYEtjuIYPu }tujj.hh=H-ySh`jjjjԼj蠴Ys=stis|g%f|g}t uY=otK5Hjh蒃 t葵hpQjzYYm>뻻LoyfMtJh-jRj5o觀 P h-j5o jzvY_^UNj4YhpQuyYYsjhYY1U VWW9ouW9Uu 5WXEUM9 g}EUgWu茮YƋUJgUEU9U} F< tW> tFGW9U}!UBWoWVW WW_^Uuh`LYYU9Uu9ot-URYP菊YoUVWU 9U1ooEPE PEP)& E EE}UM9 zM 9 z}zUz9EWE9Eu,UzU#M #])+ۋEMUzU#M + ًE-UzUE2+EiZ)‹EE Eu.E u%E PEZ)‰oypEEEUM9 g}EUUU 9UnU uOF#U΋U9> pooj衩Ys=st!U uYZsֹEPE PEP PjAYs=st5u uYYuu9YYys_^UVWu }[}GuoEi)؉E~95o}5ohBYY1CiNiE|9o}1_^UVWu }}tNPY!U9~1_^UVWu }!9|)1_^U VW}u}  \)U U } E M ueEEPY=1҉U9u K?tF? u(=8*u**)ډ |?uFGE묀?u  U#UUU_^UVW}PfY5> t> uFG_^U UUVu>.t>?t >!t1)F>)t>]t>"t>t > u ~ u1^UVW} E }(ujbju EuEWY#U ΋U IM m})u'>u9=o1~GWeY56F395u*WOW>Y:tNNVYt낉+iЉEjjwjuZ E_^UVW} E EEE*xEEE*ajCY=[t1KEE{E*7jCY=]t1!EE{E* EOEƉE95oU IM ~"95o|VYEM9uuڋU:.u<9ut7}?t/t)UZ9uGUZ9u1vuf95oZVYEM9u@95o}ioE E iEE_^U VWEEPY#U E}a>XME%=]tE%=[uE5E"E%=(uE5EEF땀}u1N}(t}[t }{a95u/}1MuJY:tNN]9uO]9uG뤿~E>u#o9U|1HEuY5F]9uO]9uG뷉+iЉE_^UVu't`u=${u=${6a|z~1(at]9u߀>u1_^UVW}} E [ h[gM [P[Y! ΋U IM ~ON95w]9u95v1_^UVuPY!915FEPu V ƅu1[h[hJ^UVuu15NEPu V ƅu1[h[hB^UVu N85=tJЙ5"t) Ei^UVW}} x o9U ~1} tiE Eu EE0|G9BkE -0Ej9Yܹt)؉tJ)ډ1Dojj6YY~5 h5wh5wj E_^UVWu }vh5wh5wj tJփ0(uL* tJ9} tJ։L* E靉)օ !iЉEju9YYtRZ9tivt95o}5oioǺ!iЉEjuYY9~i XE鲈_^UVW} E EEPqY#U ΋U IM Fǃ}Wu$yʁteF܉ʁtu_utDʁtt4Ft(ʁtuʁtuFԃ}cu } Mtʁtt9u-}t} t)Eo9U~1;urY5FN}tN+iЉE_^UVW} E EWY#U ΋U IM N95w¨tt/95v$O1WYNN뻃}Bu!95h¨tVN¨tu>_u95w8¨tt*N95w¨tu¨tuNF)+iЉE_^UVW} E EEPY#U ΋U IM >tFFDžtʁtt0u$Eo9U~1uY5F뼃}Eu$yʁteF܉ʁtu_utDʁtt4Ft(ʁtuʁtuFԃ+iЉE_^UVWhXYEtuhP*ImYY54}h*7mYYt4*u\)tHL*=Du71Ё$+*tG!+%*h̴Y_^U VW1҉։׉Ѓ+}u!+4~/u uu8 uu u1~4u uFneu uFЋ$+:u!unuuou+螼Y+kY Ћ$+PhEP-i +OYu=uEP6Y+hkY+Yu=uu"u$+ӻYu"u+jYP$+jYZ +݁Y-G~-u uu8 uu u"-_^U$VW}?? t? uG¨ttF>=wFuuE>L}u¨tu8>"u1}E">\u~t FU E U EF뫀>tFU@>tFE}?nuUzouU:nuzeu UzguEUЃ+t9UW+-iYYtUW+iYYtE붋UЃ+uWh+YYxU!+%=tWh*YYKU!+%=t!=o~hdWhl* }N WhHz*YYuRYEuU:0tWh P*YYUЋ$+B9E|UЋ$+J9M~9UЋ$+Mȋ$+AZSPWh)u:RYUӋ$+U!+EKUu$+gYYU!+EU +~U!+@jjw YYUЀ +9}uUЋ$+GUzouUЋ$++UЋ$+ 1UӋ$+U!+EU!+@tjjYY Wh(YY$=@*t|g f|g4*t\)u_^UVW1s Ɔ[F[[[[sDuxcs1uxc[uxcѺ!ʈFjj5H-qd hP5H-wd =t#hw'Y1Ɔ[FsDus1u[uѺ!ʈF봍PyYHƅxDus1u[uѺ!ʈN_^UVW1s [uFujj5H-Hc Ets$к!Ѻ[!ʉuFiEs(Ӂ[ߺ!Ѻ !ʈE_^UVWu}9=]ui+U +]ډ]95]}+]]5]]9]~]=]\]5w]]?=]~!5w]]9=]~=]=]U ]5]]_^U VW} 1#UUo9^^3U^9UuKU: u7}u1=8*u(*^*P^Y)I^^9U~15^#U# ^)ىM#^σ}XEJ} u&=8*u**)ډ}x} |}uFGM랋U^5^o^? u-}u'=8*u**PY)I_^UVuu uh 95~4*+أ]h5wh5wjc ċuR=<*t Z)9}-*]h5wh5wj 몹E+đ+ȑ=<*tȑȑ^U VW=<*tu hEP:^ EPeY=*t1U:.u)h-j5oqV u u?U*EE1UDžt?9u~: u=8*uUR}Y)щx |uFE9u}u uEuU=<*tmUDž9u =8*UR}Y)щ9}~R}u3=@t*+uu u9|u uF9|u=0{{u uu8 ^u uMx |u.u^u9u|(@1 uuFu uE=8*t9u~u$uF}t9u~h-j5oYT =0{t9u~(u uu8 uu uU_^UVuU +h-jRj5o{R PS }tju V ^U VW}=~o9~ =tJh-jRj5oR PuS h-j5o`S ]]5w]]]]*EVXYu WuH 95Mt9|:=]o9]19]t@PVW w95>+t9*=Xu =P=]h-jjj5oP P6R 95x =Xth-j5XR h-5t5PQ 56Yj5W h-j5HQ |tJh-jRj5oP PQ h-j5ouQ L5h5wh5wj_ -95tt9=]tJh-jRj5oO PP h-j5oP t9tRYNjtjRW 뮋t)ډh5wh5wjn ?t)H h5wh5wj3 o=]=]5wu]5w]]]9]|4]9]}9]t ]]+]]]9]t9]9]}55]t ]+ ]9|=Pt =<*t5w]]+h-jRj5oM PN ]+]U}~h-5t5PN M܋tJh-jRj5o*M PN h-j5oN ]9]t9]t9]=Tt =<*t5w]]]tJh-jRj5oL PM h-j5oM ]+h-jRj5o?L PM 5]95]~/t9|h-5t5TsM FɋtJ ]+ ]щMh-juj5oK P5M U5֋t9|]h-j5oM 95o|VJYjVW" &h覧Yuz uu uF됹EVYjV5~ 9]}55]t995]95]ut9]+h-jRj5oJ P L t995]95]uu uk95o}Nu~uh-j5oK u uu8 u&u uVYjVW FP]]5w]]E+h-jP5ȑ5oI PJ .o]_^U VWuE1} t } U G>^uFE>>]~-q~g^9~hYjh̑KYYǃ} t0F9|(U U!Ѻ ‹MGʃsFǃ} cU U!Ѻ ‹M9F<]thYjh̑KYY}t$} t1 }U U G_^UVWu\ =^ |hYjh̑JYY@^A5^ @^^^A ^=@^h'Yjh̑6JYY@^J@^ ^m=*t]S=*tC9/%(i=*D^9u :u =^ |h.Yjh̑=IYY} tU ^D WP6YY j6YY^A ^ JFhD^9u&":u h_^UVWUD^^^@^jEP{YYDžt% | "؁|Fȉ_^UVWE5 jh̑G t}t uF>Y1U:u-= ^uhYjh̑GYY ^U?= ^t 5 ^=YubPY@P;Y ^tu5 ^"PYY^^@^UD^uYbEPu;YEuhYjh̑%GYYU ^AVщM^UBVE} }1ҋM(]M]EދUBTUBUUBPE^^@^UD^EuEPYYE}}} }|$}h|Yjh̑,FYY=}|4}t+} | }~h<Yjh̑EYY}tE@PEEU]E}t}u}} EUBTEuEPYYE=}}ph CYjh̑REYYR}}!}tEUBTEE@P(}t} |} EE@P}u UBU8}|!EEU]EE]EUUuEPYYEEEEE=@^~hRYjh̑aDYYE_^UVu} u u1~ |=5U AE DV] ٺt819E 9t(=)t#U 4|ʁ4|9u1^UVWu}>u FE}}?9} _tW¨tj?_t¨tmIUMu FEUUF:Eu 5KYE2Eu KYEEE tEb>u FEFEU9U}!?tuPu uEG׋U9U|WVu u2tMOދU9U|1_^UVW}Ut }u1u YJYE_VWWӉ]UtHTtOTU QPW u"U9WPu uu WL1Ju TtGTPSW uVuu W]tU9WP~1 FM뾸_^UVWuU UE E U}&u=*tE8UR(U}\rE E MTE-0E]U<](UH=*t MFwE8UR(U$MF\E`MFC;9}2GF_^U VWjj6YY,Ghw YEE}<}uFY=\1tEjj]6YY}P*u5X1jhP*hP*F"5X1juhhP*hP*FhP*h YYjm2YEPFYƅx9uyEhpQj5YY ^E_^UEPnFYy jj5YYuEYjEYuEYjEYuEYuEY} tjEYu EYu EYjj$5YY5X1juh@hP*hP*Ejj1YuTEYEiE,]Uu/EYEPEYhpQj4YYEU VW}ut"hLhueFYYuhuEYY6uugFYZ‰F9usNOjhDuoF jhuYYEyEiE+UERuPuD EE}uYu)}u#}}}~UJƀuuE_^UPVWu th`)hEPC EP u F=)tL=ot H^^U=*th-j5D2 ێ=)tjhj; bb^UVWu <YEb+^U+UU^ցƠ^}Ǡ^U^+bډU9rUIM~+FGu։}׋UIM~NOU+U+^bU+U+^b^^u >tFG_^UVEt#U1P5xgYY虍+bbu R^P ƅu]} uWjYtJh-jRj5o/ P91 h-j5o$1 !j%Y5b5b^UVWb15bFEFb+^9EF^Pà^Sv : uLG=btbB^9}05b(b+^^R^Pv : uG6c_^UVW} ^^¨t^s5btF9uWuv +: t6݅tFjvj5 ~jhj ~ډjPj _^Ujhu UVW}~t*u%h 6Yejh5b b9^|1҉bb^jW^YYb9^} =D*uWYƃ~)PW%YYރu@bJtt1b bYPrS =D*tt}~ot uu /YY^^ 9uƀ^^A ^^_^U VW} }th4u7YYtbbE]3Et'v u7YYuF]!uu6Յ?}bu$jh,W7 uE fEUt E &fE`j"Yuq7YfF^CS"YF uv /7YYfUfVUVE8tE0E0 v$YW7Y@P"YFWv6YY3t/}t EEv c$YvZ$YVS$Y_^UVW}u?t& |?u^F5@FFGu_^UVW} tbbƅFE} u=~tvYWv,6YZ)‰׋u uJWZv @YEP赆Yu5YNju uBWZ|vYEP|Yu uu8 uu u46(_^UXVW=*U 9Uu裩Yƀ>s>eu~xt>v\~iR~:uLWW#5YZN>:u9v0)Ps')RWEP+5 )j\REPb FEe_^UDVWojjYYs}RU:Fuhsq4YYjhsG3YYEy*=\1t!hshJYYhY}uEPhs3YYy(ohshYY}j Y}xCUt1hshYYhYGEPh2YY}xWU=@*u182u(2]9tUuS|g f|g?3|g f|gEEPh 2YY51Ph`)hhb0jhbD1YYu(ohbhYY|j <Yhhb'1YYP1Yjhbb1YYH-y2oh`)hTbYYC|j Yhhxc5H-`1 hhu5H-H1 E}sUg5wEg}yjfxcjUYhPW1YYgoE=sthsh0YYh}Yy1҉oUURTYEE}Ժ+UЉMRQu%0 E̅yRu/Y5H-/YH-hb"0YohshYYzj oYuЉuȋUU9~D:u"|g f|gUȉAMMȉCP]ZF벋UȉUЅuNx : uBVZy}|PuEuSYEԋU)UE}MMȊEFݺ+UЉNx :t: t|g f|gB 1}:t: uoEFڋUJ o gC=ou2jRYhWp/YYgoE}uPu=ou|gP5otPhshxgup-Y|gt h|Y|g t h<YhsY=o ~!jj0YYoуRQYY5oj YYV1_^UVWut>us>uhFY1hsV.YYu#=@*t} uVhYY1y>>u(~>u"> t> uFhV,YYEGhsV-YYt&jV0,YYu} uhlY1hV',YYE}yVhHYY1EE}uPYE{8r1} U:tGWuuM, 9}=Vh0YYhsV,YYu|g f|guf+Y1L}Ed|g%f|gou5oVhu+Y_^U=H-y }u$|gt=X)t u_YZ1V(hshy1,YYxgL-sOof|gU|gtjjoYYu }u1 j9YU}u hhh+ %Uh:tEPh+ =H-x-jh5H-* hh5H-_* 1U uE=~?=H-x65H-)Yhbuhhhu|(hu3Y~uVYUjhb "YYUVWhjYYu)Y5jhb! uu ujW) E E hjpYYj(Y} yE E _^UtJh-jRj5o P oxgUjjYYxgU1=ou@u Yv=ot=ot xgu=cohYjY=:u4ou uu8 uu u jjgYYxgURt jjIYYxgUVWu} }Xu!9}1)ֹPY9}!+ډׅu1Hj\PYs=st+RV|YYRV YY Qs̉_^U}a|}z~ h09YUaM zEUVW} E EPPY1#U 9} ~;>t6¨tt4| u4{ uGF#UWRhu' tIjFOYs=st.ƇuUhuRu趤 OsɋU_^UVW} E } uE #U9U ~#UډU u} ~ UFOEPY#UUU 9} +UU j_NYs=st(U UhuRuգ Osπ=u u#UiE  U UJ_^UVWu=t>=cyhLY1=cu5cVeYYqjMYs=st!jjVVԋ]NsֹPZ9uJ9 )Bc c_^UuyYEUVjMYs=sZ1}pu@jPu} ƅt,PEZ9tu}pu Ms뙉^Uu u9yYYEUVu9u 1DjwLYs=st'u VxYYu V*YY*MsЉ^U VWu} E jLYs=sEPqY=|FvjVפYYhP?Y!5FhV賜YYE*!hV菜YY xE:} U~ujVV草@Oݺ!~NUKs_^UVWu }9~}uuu 9t1Et&P5Y!5jJYs=st*VWwYYjjVW踈AKs͉_^UVWu} P趗Y!9}!+ډjIYs=st2RVvYYjjRVJsʼn_^UVu} E PY!UiE hjjPV`E^Um jjj&u uaEUm jjj'u uaEUm jh)u ujjZYYEUm hjPj! ~jjPu uGjj YYEUxghjjRRlOxgUU hjj*RuqYxgU=yu hmY*hyhuS YYxghujj RROxgUU xgujj.RRUxgU}Zt1WtJh-jRj5ox P h-j5o hjj7uuPEUE9t1wjPGYs=stHhhYYBiihPS覜 Gs#UUVhhuuz ƅ~u1jhuj= xg^Uhjj,jj\V1UVWjjYY1҉TX\`DžPEE=oxg9t H*9o|>j5xg\YY5y=ou84P5oh<oPtPDžPj1Yƅx}t 9uu_P-U}u6zu0&tʁttxgUu_P-U}t!UBu\EEUBu}teUU-tX`U쉕\DžXUTxg9t!xgP8YPhYY.w`P-U\Ut xgU}u TUxg9t-xgP躐YPhJYY =xg}uxg!kE -0ExgPCYxg!֋ tu1~J ttN#xgDžLB5VZYыLCPLYd tudLEuWdS E E8tEEuVu5xgE=tEXu5xg {jYL=uE1LujYLUBu}tUU-t LXELu5xg EuxgUuxgPQY=u=xg}0xgUj5xgܚYYǾ$EP-UdhePV x,u ukEdS5xgYY'=u =ou jj|YYo=otEUB%L0=oUzujW5xg UB PW5xg ǃ}WUBJ}@uEE"Uxg9}~ }=xgUB%]=uWEPZ9}A9o|jWYY9u&!׹PjY=UU-UZ ÉLG0e L&/UWuP-YYǃ=ou2xgjRRP UU-PW5xg5 xgE}=xg_^UVWu u ;EU@t U${9o} ioƹP*YUt jV蛗YYƋU !Uu'=~ Jc =~69U|!Jj5V! ccE=c9UI?tD? u&=8*u**PEY)M |?uEEG9=sO+!։_^UVuj jV ^UV5P1Nx ^U=T1tT1uYUVW%Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV cU9 cwU c9 cv\1 16VYt1' crF5 c&Y5 c^UVW}u1E}UUs\1 1=cu8jY=u1V!փ5c5 cFE5cOVU}9}r69v2W9UvUW~>}t Ecu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=c<9}r79}u+UOJ}t EcURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15ct 9ur6E0tU UctU9ru NJEtU9Wu RWE_^UVu~  u\16EPnYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0i1tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+\1"}t}y UU_^U$UUEPjjg y Ud11UVW5d1d1}׃}~9r }y 9vWYu_^UVWuU VVuyYYDžt~~yVډ\1F_^UVW}u YfE=`1hxtYEu EhPU:/tHh`QYEt/u urYYuhuW EPhLu YYEu`1E+UMuRQ uuY`11WY-E8\ti1tF>#tEPVu u&E8|t E8:uu7Y>t >|t>:tFF<|t<_^UV5`1t}uEF<:t ~u1i1tFjuV\ uˀ~#uōFPnY^UV5`1t}u7F<:t ~u1&i1tFjuV uθ^UVW5`1E 8t}u1F<:t ~u1i1tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F # "GF9GE UE 8E_^U VWcEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"(+EU}!U FEc_^UVuu>t FPUY^U$UUU UUUEEPjGjx U} v\1M E 1U} v\1M ҋE!1UE1UE1U} v\1M Et1UUM J} t U RG Y]uEPu n 1UEUUzt R" Yuh,cU RuZBRY,cUVW11}U92u 2F߃| jugYtUrj YtURtUzt rY}l2t}2t}2t ubY_^UVWuEu41}%<2t42YtEG֋E ~tV€uFu1V€cE~tVuډUjuv- =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<2t2Bt 42aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<2t,2R@t2Bt 42YGƒ~uF8cFF VVv vv >uNN FFSX_^UVWEE11<2tN|1DFρECEE0-EMP1E E 0GU :t! EE E PU uuuk YYEy@Ut8hu YYE~" tuYuu' YYE}y1]jYEu uY1A!uEUMJUzUBU2E_^UVW5\1YNj52h2Yh2 Y}t.U:t&uYPuV jhlV WYPWV jhhV _^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huc{+Gw?o|[  ; USE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]T$ KL$ kUVWME_^]U p1Uujj Ujuj UVux95 43^U$UUEPjj U$U UEPuYYEPj!j U$UUEPjj U$EPu:YYEPj j{ U$UUEPjj[ U$U UEPuYYEPjj- UjjuQ UVu} t VփzuV֋RURE Pu ^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s\1KVYE=u\1&UEUUU}׋U UE8t=+UEEE0YE܋]P3WE }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuYYEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E UUU UEPj7jn ^U$EPjjU U$EPjj= yEU$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjj yEU VWSEu>tFN>Xu E0EEF>t&azjuBYYyEG߸_^U(VuU @t*u:YEU UV֋RUUUEPuxYYU UEPjj ^U$EPj*j yUEUMJ1U$UUUUU UEPjjO U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V`cXc5hchLcjKjm ^UU$VWEP~ YEPEPjv jYƋ}t9uvEEP; YEEPEPj WYUUjEP YYEP YWjmYZ)‰jEPj jEPj t9r)օu j YV%YU)_^U$uYEUUU UEPjjH U$EPj$j- Uu hT$u UV& T$@, T$@% T$@\1E ;uVu ^U$EPub YYEPj j U$EPjj y}tUEEU$UUUUU UEPjjC UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U<  EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ul 9 JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE!UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PgE6U U RU U RUEEE )E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }T1 ~y UVu CV€tu ,fNV~2u>52(Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvI =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^?{UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uvPYYUUas U EUh|%h2YYjYUVuYƋU rU MJwU uR=YY^U$EPuYY1ۅÉU$EUEPjHj UUUuuu | {sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉1ۇ(4tPXPError reading back from tmp file!Trouble writing to tmp fileTrouble writing header to tmp file Trouble rereading the old header from tmp fileYou haven't modified this file yet.Invalid mark namewrittenWrite failedCan't write to "%s"File already exists - Use :w! to overwriteWarning: "%s" has been modified but not yet savedNo previous shell command to substitute for '!'Can't use empty regular expression with '%c' commandUsage: %c /regular expression/ commandCan't nest global commands.%ld[READONLY][MODIFIED][NO FILE]"%s" %s%s %ld lines, line %ld [%ld%%]Use edit! to abort changes, or w to save changesnextrewindpreviousUse :%s! to abort changes, or w to save changesmore No %sfiles to editCould not save file -- use quit! to abort changes, or w filenameUse q! to abort changes, or wq to save changesMore files to edit -- Use ":n" to go to next file%d files to editenvironment variable $HOME not setHOMEabbrallTag's address is out of dateUse :tag! to abort changes, or :w to save changestag "%s" not foundCan't run "%s"-fref -t %s%s %sNo previous tagThis version of ELVIS is freely redistributable.%sELVIS 1.5, by Steve Kirkendall (23 March 1992)%s" modified but not yet savedWarning: "The /bin/sh shell doesn't support ^Z/bin/shd $ $cQg>p+%ld substitutions on %ld linesSubstitution failedchangedSubst options are p, c, and g -- not %cUsage: s/regular expression/new text/\~~ .joinedCan't join -- the resulting line would be too longNothing to join with this lineedNULs were converted to 0x80Newlines were added to break up long linesreadLast line had no newline Can't open "%s"\%03o%6ld movedcopiedinvalid destination addressinvalid destination address0"source" requires a filenamebuffer "%c is too large to executebuffer "%c is empty@ requires a cut buffer name (a-z)@ macros can't be nestedaAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 0123456789Environment variable TERM must be set TERM[Press to continue]=: capability This termcap entry lacks the :*u**kIkHkhkNkPkrklkdkukeksptxnamdciceiimsrcdcedlalaeasmemdueusugtetisesocmvbupUnrecognized TERM type Can't read /etc/termcap Screen too small coli%s/elv_%x.%xyankedInvalid cut buffer name: "%cError reading back from tmp file for pasting!%s/elv_%x.%xpastedCut buffer is emptyCut buffer "%c is emptyInvalid cut buffer name: "%cunabbreviateunmapsuspendrewindpreviousmapchdirwqvisualversiontagstopsourceshellsetputnumbermarkexcopycdargsabbreviate@&=><#!yankxitwritevglobalundotosubstitutereadquitprintNextnextmovelistkjoininsertglobalfileeditdeletechangeappendInvalid line number -- must be from 1 to %ld.+1$.?%>*.??.?[.?\>`.?{.?~.?argumentsfilenamesToo many %s to "%s" command.Extra characters after "%s" command.Can't use a range with "%s" command.Can't use address with "%s" command.Can't use address 0 with "%s" command..exrcCan't use the "%s" command in a %s fileNo filename to substitute for #No filename to substitute for %%Unknown command "%.*s"first address exceeds the secondIHIIxFIIIFIGIIGIIHIIIxFBFHZGIIIE)}]^^$KwsKgKaNLMRMeUNrMtNvINPPPPEXINIT.exrc.exrcHOME $Ignoring unknown flag "%s"Use the `elvrec` program to recover lost filesxi$^lhjkRE error: %sdeletedaddedchanged\M\-M\G[\_\kM\Only %ld linesi`[`]2`{_}_mark '%c is unsetHit bottom without finding RENot found(wrapped)No previous expressionHit top without finding RENot found(wrapped)No previous expressionNo previous f, F, t, or T commandiHWiiiizi_i9j Ij Ij+Ij-*j.jzjkjjjjjjlkkkkkkwswrapscantetermtstabstopsysyncsssidescrollswshiftwidthsmshowmatchshshellsectsectionsscscrollrereportremapremaproreadonlyparaparagraphsnunumbermlmodelinesmamagiclilistlslineskpkeywordprgktkeytimeicignorecasehfhideformatvbellflasherexrefresheberrorbellsepequalprgededcompatibledirdirectorycocolumnsawautowriteatautotabapautoprintaiautoindentSHELLrDqqr%-3duttuoption "%s" must be given a valueoption "%s" must have a value between %d and %doption "%s" must have a numeric valueoption "[no]%s" is boolean.exrcoption "%s" can only be set in a %s fileoption "%s" can't be alteredinvalid option name "%s"garbage() failed to read oldhdr??%6ld |~ ] missingBackwards span in [](XΊ؊$%*G.=[Q^$^͋Too many []sMismatched \)Too many \(sNot enough \)s* or \+ or \? doubled upClosure operators can only follow a normal character or . or []Closure operator follows nothingNot enough memory for this RENo previous REӑ%@Sӑӑӑӑӑӑӑӑӑӑӑӑӑӑӑo(=Rn&Jnnnnnnnnn%%%%%%%%%%yӔexecle("%s", ...) failed-cfork() failed|-cecho echo %ld lines read from filter%ld lines written to filter%ld lines out, %ld lines back%s/soXXXXXXXٛ  [More...]visual abbrNewline characters have been inserted to break up long linesThis file contained NULs. They've been changed to \x80 charsss[READONLY]"%s" %s %ld line%s, %ld char%s Error reading "%s""[NO FILE]" 1 line, 1 char"%s" [NEW FILE] 1 line, 1 char Can't create temp file... Does directory "%s" exist?Temp file "%s" already exists?%s/elv_%x.%x.."%s" is not a regular fileCan't stat "%s"Can't open "%s"Wrote "%s" %ld lines, %ld charactersTrouble writing to "%s"Can't write to "%s" -- NOT WRITTENFile already exists - Use :w! to overwrite"%s" [READONLY] -- NOT WRITTENDon't know a name for this file -- NOT WRITTENfooelvprsv%s "%s" %s-Elvis diedղ[Hit to continue]Marks must be from a to zCan't repeat a multi-line overtype commandAWIIOya%io No previous file @6Sv$?%=P_hbs%ld line%s %sr/etc/termcapTERM/etc/termcapTERMCAP 0X1X2X3XE(bHfPn0r8t@\!%+-2`dir!OOPSWaDrw.+{bq : unknown errorzzz/3%, U@Xb|diopux x#}+s-n0yLahKlVEGXkbkcdefginokpkrYs%ukxk(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point tc44TX\`dhlptx|P kH k@ +8 <0  8( 2 O k  ) U!  # C  C  U! 3 !N9 +8 # 0K! 32 K 6 73 8+ ^ ' U! & '   *8 $  x ,t <l # h <` )X U!T ])P $H %^ @ (q$88 )4 .,,, 2$ 4 < 53 <   C  #C  , 1  /(P /usr/tmpfmt2ref` /bin/sh((?PPppIPLPQPNHSHSSSEse|xL)lhP)`\T)PLX)D@K\)40`) ) )))*B*)))K4*B8*|*pl*d`B<*TL*@<@*4,D*$ H*L**P*+***B***jj j j](\`(\(\9(\9`j F]Aj Ѽ\ 5"a^ ma b2]^^(\ g (\cAu g eeA;"kmn hB (\]DifDiDicA$hB  l Hv ?_Q_Q(^(\b2Akmn gB ](\9(\9\ 2\cA ̺hB * l Hv i _F]A_3SSSSh ((((( AAAAAABBBBBB Bl222Unknown errort%h%L%<%$%%$$$$$$$p$d$L$<$0$$ $#######|#d#T#<#,# ##""""""3333333333t"\"@"," ""!!!!!!t!\!L!8!$!C  . 4t F|>t FD>tG ^ü NF봋u>tM~tG ^ü NF  E} }E E; ;   _^UV5 Nx  ^U= t ulYU=0 x 50 -Y0 4 U=0 x= u  $ j5 YY0 y'j50 nYY Pj50 Y 1U^U U( =4 u/hh 50 ( 4 1V$ =( u1< 4 $$((= u( U(U(U(:u1(: t (::uҋUEUV=0 yy1u1 txtjƅtjjV fLƅtjjV / t!yg(:X ^UV%ƅt F9Eu^UV{ƅtu66 YYu[^UVWU :ru1U :wuǃtEPYx ^Ey1},|s >t-,PYtY11ۅPtYY1tYjuhhh?j YTM ,1tYu t!YY_^UVWUzjj,YYEjjYYEuqYEP3Y=t 94,uuEuj YYuj YY,E_^U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^U 2E Pu ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WE }׃E뻋EEU9vGuAYEuUUȋUUEEEPj;j" R Y_^U(VuEEV֋RUV֋RU E _UUU UEPj7j ^U$EPjj U(VuU @t*ubYEU UV֋RUUUEPu YYU UEPjj3 ^U$EPj*j yUEUMJ1U$UUUUU UEPjj U$EPjj y}tUEEUVW11}U9 u  F߃| jugYtUrYtURtUzt rY}8 t}P t}h t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWEE11< tN|1DFρECEE0-EMP1E E U :t! EE E ZU uuuYYEy@Ut8hu YYE~" tuYuuYYE}y1]jYEu ufY1A!uEUMJUzUBU E_^UUUuuu 8 UVWu }E?t:JxG^FSX GVPmYY=uEE_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^UVW5 @YNj5l hP Yhh Y}t.U:t&uYPuV jhV WcYPWV jhV _^UUURu hu'UUURuu uUEEUUUUU JUEPuu` EUJUx ]E EPjYYEUuu hu+kKK { UVW}u MgUVU9wU9v 16V Yt1'rF5&Y5^UVW}u1E}UUs 1=|u8jY=u1V!փ5|5FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV@ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVu~  u 6EPfYEU UEPEPV yE^UVux95   ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVW1}y11< t,|1Fρ(1E E ~U :tE E <\jYEu1EttEUMJUzUBU E_^UVuYƋU rU MJwU uRYY^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U$U UEPuHYYEPjju U$EPjj] yEU$UUU UUUEPjj yEU$UUEPjj U$UUU UUUE*EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$uYEUUU UEPjj U$EPu~YYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_        ^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U T? }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EElz uVuu+ ƀ}Xu9utUP{ YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEДUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P#E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~P u>5T Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWE_^]UUas U EUhhh YYjYU$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5hjKj- ^Uu hT$u% Ë} 0)ʇʋu }U$UUU UUUEPj6j U$} uEEUUE UEPjJj y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u PG1ۇ tPXProotuid not found in password filerootstat() failed P.S. %s Elvis With fond wishes for a speedy recovery, elvrec %s cd %s To recover this file, do the following: was preserved when %s. A version of your file "%s%c%s" wmail %s >/dev/null 2>/dev/nullfoo*%s %s %s: unrecoverable -- header trashed w/usr/preserve%s%cp%ld/usr/preserve/Indexa/usr/preserve/Indexw%s: unrecoverable -- header trashed %s: trucated header blocks -Rthe editor went awayaAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ 0123456789-csh/bin/shAAA'''/arwr+SbI : unknown error4a&rw,p+XbNU  @. R!X;!b !d2!i2!o)!p;!u2!x;!+" "#!"+"-"0&"%L#h"l"##E$G$X$b$c$dM$e$f$g$iM$ns#o$p$r$s#u$x$(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point SSSS/etc/passwdB8 P h uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5 Yt.hYFu NLNHF 9hZYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvX =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E |/U :t! EE E U uuu7YYEy@Ut8huyYYE~" tu?YuuYYE}y1]j}YEu u Y1A!uEUMJUzUBUE_^UUUuuu UVW54YNj5h5Yh*Y}t.U:t&u3YPuV8 jhV( WYPWV jhV _^UVW}E?t:JxG^FSX GVPYY=u}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95XL^U$UUEPjjg y U81UVW588}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ4F_^U$UUEPjj U$UUEPjj U$U UEPu| YYEPjjU U$EPjj= U$EPu.YY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjS U$UUEPjj3 U$uZYEUUU UEPjj Uu hT$u5 U$EPu YYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U k }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPsYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U,EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U\JxUʋFF VuzYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE|E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP^YY=t6JxEEFFEEVP(YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPzYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhlhYYj>YUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P+1ۇ`tPXPwr%s: no recovered file has that exact name r/usr/preserve/Indexusage: %s [preserved_file [recovery_file]]  a r w V +7 b- : unknown error ]@Xbdiopux #+{-v0LihSl^EGXsbscdefginospsras-usxs(null)No such connectionAlready " # shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point SSSSB Unknown errordX<,t`T<,  |lTD,x<<<<<<<<<<dL0xdL<(C   I1$T$L< su;SSSSu,, QRP0 PUVW1E}U R:-U RpDžl1 }_pR'YD9l|hht YYj3YTlpj,R YYptFME }uEPVhDj \9}~RU h4 YYtuU 4 YjYEPVt tYG1_^UVWEJExEX@ uY= } uE0@]E219u |U 09 F9u } 0BU UU0\J\xpp h\j xYYU90|1u=0~ 0J10 t u 00\J\xpph\WYY_^UVuj jVC ^UV54Nx 8 ^U=8t8uD YUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+@"}t}y UU_^UVW11}U9u F߃| jugYtUr YtURtUzt r Y}Dt}\t}tt u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv~ =u N /uvv; EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hoYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }8~y UVu CV€tu ,fNV~\u>5`Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv^ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvO =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E <U uuuwYYEy@Ut8huYYE~" tuYuu3YYE}y1]jYEu ufY1A!uEUMJUzUBUE_^UUUuuu x UVW5@YNj5xh\YhtY}t.U:t&uYPuV jhXV WkYPWV jhTV _^KUW}0))ϊE tu1_]XG_]fUV( U9( wU( 9( v@ 16VYt1'( rF5( &Y5( ^UVW}u1E}UUs@ 1=$ u8jY=u1V!փ5$ 5( FE5, OVU}9}r69v2W9UvUW~>}t E, u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=, <9}r79}u+UOJ}t E, URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15, t 9ur6E0tU U, tU9ru NJEtU9Wu RWE_^UVux95 \^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ@F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U l[ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЬUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPhYY=u}t UډJxUʋFF Vu YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu]YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MUUas U EUh ht*YYjjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6js UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇ tPXPrBad tab stop spec a rw w + b : unknown error @Xbdiopux #+-0LhlEyGdXbcKd eyfygdi n3oprsux(null)No such connectionAlready shutdownNo c+ - . onnectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point 4 SSSSBD\t ((((( AAAAAABBBBBB Unknown errorxdTH$|hT@, p\H,|hXD0C  PD1$T$Lsu;SSSSu QRP PU VWE}uU rY=}h4tYjIYuh$\Yj1YVNYDžu*}uVh5YY Vh &YYjYWhYYEUVW}u1<u'9|u1_^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5Nx ^U=tu(YUU Uhuu. U$UUEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U X}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEpuVuu+ ƀ}Xu9utUPw YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U!JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEИUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5hYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvQ =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVU9wU9vp 16VYt1'rF5&Y5^UVW}u1E}UUsp 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV4 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhhYYjYU$UUEPjjg y Ut1UVW5tt}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډpF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uU U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu 8 USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇxtPXP%ld %ld %ld is a prime 2 is a prime Usage: factor n (2 <= n < 2**31)  @ Xbdiopux #+-0LhlEqG\XbcCdeqfqg\in+oprsux(null)cannot print floating point  ((((( AAAAAABBBBBB SSSSB  C`1$T$L su;SSSSuXX QRP PU VW  9u~MU ׀:-u@huGP*Y suGPY `F9uu  pUJ9uU    1t 5 lY@J@xTT h@j YYjYh0Y E@J@xTT \h@j YYIxJPYg9P YV(P YE1 ;1P Y PYjYjY PF Y.u PhuYY= th[Yu/5 Yh6Yh+Yj Y]hYMuhYY9EX@U$V=`{j5 'YYƅbEPhdV EVY}x@U U U\5 5 5\5 h|`^UVuj5 YYy05 h+YY j5 nYY=y5 hYYjYhV5; =thYjYUtI5 hYYhYhjV hhdV fdžU^Ujj5 hu5 =th4#YjYUPVhYjPEP|YYsjEP=YYƅyEPhYYNh5 V =u VYthtYjYEPh`YY^UPVheYjPEP YYt h<YhEPqYYƅyEPhYYCh5 Vv =u V.Yt hYEPhYY^U8VW   }tEEEEE?EhkYh4`Y5 ƾE}}t-Ph,EPN FPh$EP8 @>uPh EP FP YPhEP UӈUU~uVt E+ V t E- EE= Ǿ}/u ~u9rt~tW9VvEEˋU9Ut E# EӋV PRu1V F]V#UN#MPFN#MS^#]vRV]PF$PQFPREPEPSuuuDE]_^U,VWEEE5 ƾEEE}>uEEPEPEPv~ u ~uEUN9uUN9u UN9t!uhhYYh@YE~ u~tV VEPEPEPRUN9uUN9u UN9t!uhYYhYE~ EUBU}SW9VrW 9Vr!V V9Ww-V VO O9suuh EE룋V V9VvuhYYEV9U}VUV9U}VUV?9U} V?UV?9U} V?UE!}iUB9 u 9UrhXYYUB5 uRh0@5 5 5 h!E$h Y5 5 h }u hY}~uhhYYEE_^UV  ыEƋE= BыU U   ыEЙ= U ^U}tUBh>YUVWu4EPhYY}yuhYYэEPhpYYU9U}uhDYYσ}uC}u=FFFFFFFFF h0Y#UU  UuE#UUB  JUUVU+UBV tMV V h YFPFPFPu=FPFPFPu&v vh ~uFhYy~uhYcFPYPhTYYDžtnuFPYPh4_YY!yuFFPmYPh<YY>u h+Y4hY(Džtnu hY yuVkY_^UTjPEPeYYu1EUh Yh\ Yh< Yh Yh Yh Yh Yh\ uYh8 jYh _Yh TYh IYhx >YhX 3Y= t h< Y h YUVuEPhP YYyUVsUVRh YYȋV +UsV +URh YY먋UVV +UV FPFPFPvv vh o ^UVukEPh YYSUV sUV Rh #YYȋUV V VFPFPFPRAv h| YY^UEPh0 tYYu1<}~}~ h Yuh YY MI U= t!hw Yh@l Yha Y= x= t-@J@xTT h@j YYh Yhd Yh Yh Yh Yhp Y= k= u = t-@J@xTT h@j YYh$ Yh z Yh o YhT d YUPuhN YYjPEPYYu1/u hEP =u h YUVW11hV YP YY|VYPVh P}/@J@xTT ?h@j  YY/@J@xTT h@j YY1FVt-@J@xTT h@j YY_^UT}h Yhp YjPEPnYYbEPhlEP4 =t hX Y뷁}r h@ Y롋UMJuYPuh UVuh@YYh(u V u1@J@xTT h@j YY1Dj V& YYtjj V YYZ>th Yh Yk^U:x=p3h)\TL D<8,$ukaZSLE|>t7l0d)\"PD< $E-UVut.>u1>tPhSYY^UhAYj6YUVuj jVC ^UV5Nx $ ^U=tu YUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+$"}t}y UU_^UVWuEu41}%uNN FFSX_^UVW}Wu ul ƅ~9})׉U U 1_^UVWu }R~y UVu CV€tu ,fNV~@u>5DYt.hYFu NLNHF 9hvYFuN!NF V@uVVVhUFt$jjv& =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UU Uh@uu UUURu huoUUURuu uOU UUEEUUUUufYEuu EP UEEUUUUU JUEPuu EUJUx ]E EPjlYYEUuu hu+oGUVW}u MUW}E Mr/u'uĉ fE_]= ? @ A B C D E F G H I J K L M N UW}0OE uG_]1_]UVU9wU9v$ 16VYt1'rF5&Y5^UVW}u1E}UUs$ 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuaYYDžt~~yVډ$F_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$UUU UUUEPj6j+ U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjjo ^U$UUUUU UEPjjC U$EPj$j) Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUP/YUE_^U4VWuEEEE }%MJxUʋFF VuG?%u2JxFFSXVuYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G hKE=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVgYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPhP EuEPhR EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVCYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG%띀?uEE3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E6 EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhhXjYYjYUh8hXJYYjYUVuYƋU rU MJwU uR%YY^UUUuuu , UVWE_^]} 0)ʇʋu }U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UEUVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBËKI|;u[u P7u.`=}aa;1ۇtPXP2+BS:achlmnp%q2sKtUv_w %c ???? Not written Please reboot now. Partition table has been updated and the file system synced. Write disabled inPartition table is %svalid (Enter 'h' for help. A null line will abort any operation) /dev/hd0Geometry of %s: %dx%dx%d Partition table reset and boot code installed. Invalid boot sector on %s. Cannot read boot sector Cannot open device %s No write permission on %s Write error Seek error during write Loaded from %s OK Read error Cannot open %s Enter name of file to load from: Saved to %s OK Write error Cannot open %s Saving anyway Enter name of file to save to: %sA %s0x%02x0x%02xNum Sorted Act Type Cyl Head Sec Cyl Head Sec Base Last Size ----first---- -----last---- --------sectors------- %2d %3d%c %4s %-9s %4d %3d %3d %4d %3d %3d %7ld%c%7ld %7ld%c %2d %3d%c %4s %-9s x%02x %3d x%02x x%02x %3d x%02x %7ld%c%7ld %7ld%c %d active partitions Do not write the table if you are not sure!. Assuming %d heads and %d sectors. Empty table - skipping test on number of heads and sectors. fdisk -h%d -s%d %s Try fdisk -h%d -s%d %s instead of Disk appears to have mis-specified number of heads or sectors. Overflow from preposterous size in partition %d. Overlap between partitions %d and %d Suspect head and sector parameters. Inconsistent size in partition %d. Suspect head and sector parameters. Inconsistent base in partition %d. Partition type is now MINIX Leaving partition inactive Change partition to active? (y/n) Leaving partition active Partition type changed from %s to MINIX Leaving partition type as %s Change partition type from %s to MINIX? (y/n) Leaving partition type as MINIX Partition type changed from None to MINIX Base of partition changed to %ld, size changed to %ld Size reduced by 1 to make it even Partition deleted That looks like %d which is too small Enter last cylinder (an integer >= the first cylinder): That looks like %d which is negative Enter first cylinder (an integer >= 0): w - write changed partition table back to disk and exit w - write (disabled) v - verify partition table t - print known partition types s - save boot block (including partition table) on a file S - adjust a size (by changing the last sector) q - quit without making any changes p - print raw partition table n - mark a partition as a non-MINIX partition m - mark a partition as a MINIX partition l - load boot block (including partition table) from a file c - change a partition B - adjust a base sector a - toggle an active flag + - explain any footnotes (+, -, #) Type a command letter, then a carriage return: Base of partition adjusted to %ld, size adjusted to %ld That would make the size %d and too small That would make the base %d and too small Enter adjustment to base (an integer): Size of partition adjusted to %ld That would make the size %d and too small Enter adjustment to size (an integer): Partition %d That does not look like 1 to 4 Enter partition number (1 to 4): device numbers of unchanged partitions have changed. the order by sorting the partitions on their base. Be careful if the by DOS fdisks prior to DOS 3.3. The Minix wini drivers further confuse # The partitions are in a funny order. This is normal if they were created reformatted. partitions, and may be safe for other partitions which are about to be sizes should be decreased by 1 using 'S'. This is safe for all Minix only create partitions with even sizes. If possible, the current odd causes trouble for programs like dosread. This program will by default - Minix cannot access the last sector on an odd-sized partition. This To use these with the new drivers, increase the base by 1 using 'B'. This causes some old (Minix) file systems to be offset by 1 sector. + The old Minix wini drivers (before V1.5) discarded odd base sectors. That does not look like an integer %d%s0x%02x: %-9sUnknownPartition type changed to 0x%02x (%s) Hex number too large Invalid hex number %x Enter partition type (in 2-digit hex): Known partition types are: Otherwise, please type something before the newline: Use the EOF character to create a null line. T"!+5?IS]gq { @QRcdeu#*18?FMUnknownBadblocksDOS 2aryDOS r/oDOS accCP/MSyrinxBSDIswapBSDI386BSDAMOEBAbadAMOEBALINUXLINUXswapMINIXMINIX oldPC/IXNOVELL386NOVELL286386/IXMICROPORTNOVELL?VENIX286OPUSOS/2COHERENTAIXHPFSDOS-BIGDOS-EXTDOS-16XENIX usrXENIXDOS-12NoneinPartition changed to %sactive Usage: fdisk [-hheads] [-ssectors] [device] & I&@~&'X'bp'd'i'oy'p'u'x'{( l(#q(+g(-b(0v(m+LU)h?)lJ)s)E +G*X_*b_*c*d*e +f +g*i*n)o_*p_*rM+s*u_*x_*(null)e.X3.bN.d<.i3.oE.p3.u<.x3.4L3h3l34E59G59X)5[7b)5c;6d)5e59f59g59i)5n4o)5p)5s6u)5x)5cannot print floating point cannot print floating point 1؎м|V$t9|0,0< sP&X ugˆPsgX,}a} |8lt]+\] \ s $d$F9rr҉ƀ|r}!|t t8r+Ãr„|8w rrfÉ\\ RW_?ƈËDT 0Zƻ|st O|0sÁ>}Uu ^VƬt /dev/hd? None active Read error Not bootable SSSSB(@X ((((( AAAAAABBBBBB   P!$1$T$Lsu;SSSSu QRP PZUVWEhjhhE }u(hxu u E=t[L5'CYl땻E=u1U9u hYA M 4YU+}M '81ƅG=t1%=t"5'htBYYh" Y=u=u5'hpYY=t5hlYYJx,S,ZhP YYF95'wh Y* }=t3=u5'hdYYWh`sYYhS Y5KYU9}t1_^U5hh0n jYUu5hh0FjYUVW}uYDžz~ hYhYƅu hYhWFP ~ UVUVOxMNوE5_^U='th5'MYYu'Aj5'YY=u&5'5hh0+jY''' UVW=t1'+'W5'h hV5H Dž*t h$Yu1c F։-=}~ u5'N> uFu'' 5'5'''-_^UVWe'9'r ~bh j 5' F+'RYDžu hLY+'R5'W WUY5'5Y_^UVWU 'J N95'vAuUJ9urދUzU9zurNO9tuF뷋Ur_^UVW'9'ru1-5'U='uuKY9s.Ur&U9rs '9Js u#Y9sUrEUu=t3='h j WO '9I=tH='h j W '9r95'u95'w95'>95'v%O? uGh j V '''_^UV5Nx '^U=tu YUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVW=aU9} M :-uzu M hL4W YYuM ǣ|(:tWuYYƅ}=t=E h00sYYh0h4bYYh0W%YYh0j YYM :u? F>:M C;t!A M C'U9|W=t=E h00YYh0hYYh0WTYYh0j FYY?`A M '7M :u'_^UVWuU VVuqYYDžt~~yVډF_^UVWuEu41}%5,Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu @ UVu JxUʋFF Vu2YY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uhuu UVWu} EF}t}@t}t ~tVt vYft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^Wo;USE] ![]USE] ![]USE] ![]UW}E MuG_]1_]UVW}u M UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]v U$UUEPjjK U$UUEPjj+ U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPu YYU UEPjjo ^U$UUUUU UEPjjC Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U P[ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEhuVuukƀ}Xu9utUPWYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEАUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]V X Y UUas U EUhh0.YYjYUVuYƋU rU MJwU uR1YY^U$UUU UUUEPj6j UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPc%u %s: %u:%s:%s ce:f:hlnsvUsage: %s -chlnsv <[-e string] ... [-f file] ... | string> [file] ... %s: %s string too long%s: can't open %s stdin-read error: option requires an argument -- : illegal option -- --a @:^XGb,d>i>o5pGu>xG7 (#-+#-02)Lhl/EGXbcdYefgiYnopr sux(null)cannot print floating point not enough memoryargument missingSSSSB0(filefindfingerfixflexfmtfoldformatfortunefsckfsck1ftppr_routesgomokuhaltheadhosthostaddrTshidifconfigifdefin.fingerdin.ftpdin.rldin.rshdin.telnetddhcpdintrinstallirdpdjoinkermitlastleavelexlifeloadfontloadkeyslooklplpdMm2m4mailmakemakewhatismanstatmesgmixermkdistmkfifomkprotomodemmoremountfstatmtcleantmpnmnonamedKcdfpasswd  @x1$T$Lxsu;SSSSu QRP PNUV hu uK E=t;, hhTYYjY뵻E'U9|59u~U 4 YF1^ULVWuhYYEPuYYEyhYUU@uh]Y#U uh=Y#U`uhY#UuhYd#UtuhYY@juYYEyhxYhhu EyhhYuY}uh\kYuY19=E}}7E܋]!ʉE9uEÃ}u:hXYYJYuY7GjUIthHYuYEEE19}~ƀtE;t{t }t#uE*tt/uEA|Zettt atouEit ntsuEGy}TkEd}Ek]dؙ}E؃}~ h<Y}~ h,Y h YuYhYuY_^U}t hoYt h[Yt hGY t h3Y h&Y     thYh|Y}uA     thlYkh`Y^}uM'hLY+h8{Yh nYnhhKYY h=YUh-YjYUV5Nx  ^U=tu YUVW=aU9} M :-uzu M h 4YYuM ǣ :tWuYYƅ}=t=E h0YYhhYYhWyYYhj kYYM :u? F>:M C;t!A M C U9|W=t=E h0YYhhYYhWYYhj YY?`A M  7M :u _^UUUuuu 4 UVu JxUʋFF Vu~ YY^UVWu }E?t:JxG^FSX GVP9 YY=uEE_^UU Uhuu s#UW}0))ϊE tu1_]XG_]b U$UUEPjj U$UUEPjjo U(VuU @t*u2 YEU UV֋RUUUEPuYYU UEPjj  ^U$UUUUU UEPjj U$u YEUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U $}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE<uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEdUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P_ E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }6~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvf =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvW =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UV|U9|wU|9|vh 16VYt1'|rF5|&Y5|^UVW}u1E}UUsh 1=xu8jY=u1V!փ5x5|FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVp uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhlhYYjvYU$UUEPjj y Ul1UVW5ll}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uR YY^UVWuU VVuYYDžt~~yVډhF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uu U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P#1ۇptPXPcore fileMINIX-68k gnu executableMINIX-PC 32-bit gnu executable combined I & D spaceMINIX-68k new style executableMINIX-68k old style executableMINIX-PC 32-bit executableMINIX-PC 16-bit executableMINIX-PC gnu object fileMINIX-68k gnu object fileMINIX-PC bcc object fileACK object fileMINIX-PC gnu archiveMINIX-68k gnu archiveMINIX-PC ack archiveACK object archiveMINIX-PCb d e bcc archive16-bit compressed file13-bit compressed file?Lfile: panic getopt failed L?data ASCII text English text C program shell script %sempty file cannot read cannot open strange file type %5o named pipe block special file character special file directory cannot stat %s: , '%.32s' of unknown executable of i386 executable of i86 executable stripped not stripped stripped not stripped , comm I&D, sep I&D, NSYM, PAL, UZPUsage: file [-L] name ... : option requires an argument -- : illegal option -- --  @ X b d i o p u x  # + - 0 L h l EqG\XbcCdeqfqg\in+oprsux(null)cannot print floating point e,elGnu T!t6WYYtF,u$`11_^UVj YƋU^UVu}t>-t } u>+uF=0|0U 9}F>u1^UVWu/U U1>-t>+uF<-u 1]=0|9E|FU ƒ0ۀ>thh YYE8_^UVu U!#U 0#U  E0^U VWEu>-u EF E>]1>-t >=t>+u ~>ut!>gt>ot>atVh`, YYX>ut'>gt">ot>au( /FĀ>-t>=t>+t VhHYYFE>r{>wr>xi>s`>tjRthEPu tj EPu jEPur thEPuQ tjEPu8 jEPu tj@EPu tjEPu sjEPu ]thEPu t9hEPu #hEPut .Fi>>,uFVh(YYUE _^U VWuiYNj2YE=u82YPYEjYƉ~UV _^U VW}W|YE23Y=tt tuE92YPYEjTYƋUVUV_^UVW}uS2YPYƋ2Y=th|hYY@}u12WYPYjYljw u!Y_^U}uhh=YYU8VWuqY2YRF`F F@FFh$h(YYkm+26Y2YEԅu7jj 2 tFPFPj 2}u2h&YYUBFF2Y2YEЅu7jj 21 tFPFPj 2^`}u2hYYUBFF02Y2#Y-Eȋ8cuUFPFPj 22YFPFPj 22mYjj2 tFPFPj2=?FPFP2 "2YFPEPj 2iÈQ+ ؉Fk^^2Yh YG~:q:;uzuOK:{u#z}uzuW뀋:uhhPYYw YGuw h1YY}jhYY$hhYY2YEP2YY=u2hYYUV\2u1O>*u&FVWYYt 2Gu1$?u1>\u"F9uFGVWYY1>?uFGVWrYY>[F>]>\uF~-t(9uF>]t>\uFFGVW+YY~]u 9t?-u v1o~\uE9|'9|F>]t>\uFFGVWYY)uJ19u FGVWYY1_^UVWU:/uju$YYuE1UUU::t :U9Uu&juYYuu:YoEU}U9Ut EEFE/FGFЄujPYYuPYU:tE\1_^U VWu >t=uUW}>t36YP65$[ jht5$F jhp5$, j P5$ =| yt1E=uh`hdYY}ufDžARVYt捅POYYP;YYhPAYYj=YEP^Y9Eu }u1_^UV5Nx 4^U=tu YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jlY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^U=x 5YU=x= u  j5 YYy'j5BYY Pj5- 1U^U U =u/hh 5 1V =u1< = u UUU:u12: t9Etz:u1 UEUV=y~y1u1j:nYtj:]Ytj:LYEtjju ։: t$j,Yts:u^UV3ƅt F9Eu^UVv ƅtu6YYuV^U= x 5 Y U= x=u j5YY y'j5 YY Pj5 } 1U^UU=u/hh5  1V=u1< = uUUU:u1: t ::uҋUEUV= yy1u1txtjƅtjjVb fLƅtjjVD /t!yg:X^UV%ƅt F9Eu^UV{ƅtu6>YYu[^UVWuU VVuYYDžt~~ym o p q r s t u v w VډF_^U$UUEPjj U(VuEEV֋RUV֋RU xE UUU UEPj7jB ^U(VuU @t*u~YEU UV֋RUUUEPu`YYU UEPjj ^U$UUUUU UEPjj UVW}Wu u, ƅ~9})׉U U 1_^UVWu }"7~y UVu CV€tu ,fNV~,u>50\Yt.hhYFu NLNHF 9h:YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvE =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu UU Uh,uun Kc77# SUSE] ![]USE] ![]USE] ![]UVW}u M&UVWAE_^]FUW}0OE uG_]1_]UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVuYƋU rU MJwU uRYY^U$UUEPjj? U$U UEPuYYEPj!j U}u UEuYuYU 2u u ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVHYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3W1 }׃E뻋EEU9vGuMYEuUUȋUUEEEPj;j R Y_^U$EPjj U$EPujYY1ۅÉU$UUU UUUEPjjG yEU0VWEPuYYy1U؁@t1huYYDžy1EPW YYxSU؁@u7jWYYEx& PjW xh$YƅuUWYUЉ1FfFF_^UVWuu 1FQh^ SP) fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjj Uu hT$u- U$EPj j y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu|YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U45JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEET%E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP\YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuEu41}%<\t4\YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvr =u N /uvvO EU9Uu1 N _^UV1}*<\t\Bt 4\aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhhDYYjYU$UUU UEPjj U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPnogroupnouserprunedepthxdevoanewerprint0printokexecmtimectimeatimeinumsizegroupuserlinkstypepermnameout of memorysyntax error: garbage at end of predicateUsage: path-list [predicate-list]Can't get path from environmentPATHg{%s can't read directory %s can't get status of !?Qdw %4qhhoILLEGAL NODE%s%s internal: bad n_sign!vhosyntax error: illegal numeric value+-~=\ aH g> oC u9  r   b garbage at end of mode string: -, + or = expected: u, g, o, or a expected: syntax error, ) expectedsyntax error, argument expected| b @ L X | d | | | | | p p' : ::**Tsyntax error, operator expected-newer: can't get status of can't open /dev/tty/dev/ttycan't find program -exec/-ok: ; missing/bin/shunknown group: unknown user: -type needs b, c, d, f or l%s: %s%s exec failure: can't fork? ] 6 ] 6 ] 6 C C C =. -@.:/X#/b/d/i/o/p#/u/x#/0 0# 0+/-/003L0h0l0 1E2G2X1b1cs2d52e2f2g2i52n[1o1p1r2s1u1x1(null)cannot print floating point xp h ` X P LD<40,$ SSSS/etc/group/etc/passwdB,D ((((( AAAAAABBBBBB   w|1$T$Lsu;SSSSu   QRP<& PUVWu &>:->G?tdhlpptdxX|L@4(hhh TYYjY [uG:=u =pt h&UY>u#VY=|&tjY_^UVWtt&jhDgUYYEyhDhh T jIY=t Gj0hD&u%U =0=D&tڃ=|&ujT1Y|&jT YF8v8jEPhD&:U Ej FPhP&#U FjFPh\& U F!p&V$F0F4F<=t-EPIYDžtWFYF0V YV0EPP:UYPmYPUYY=t ~FuSY=|&u hRYF8_^U VW1=t&E8P0 Yu>=|&ujTY|&jTYF8v8EF4F6F0E뤃=|&hF8=F=xu.5|&6DHYEt uYF0v82GE5|&t~6pE06SYYtEU60r tE~0uuYF01jTYuYG0G6G4V8W8F6~8v8zEjhDfRYYEyhDhh Q jHYj0hD&u7R =0=D&tڋ5|&tЀ~4jhD&~0tV0PR ~4u@j FPhP&3R FjFPh\&R F!p&V$F4bjTYNjj GPhP&Q GjGPh\&Q G!p&W$V0W0G4G6V8W8F4~8v8u QY=t 5|&t Vx Yv8e _^UVW=h=t0=t&o=t hpOYYhDOYLh$OY=pt hwOYJx hj /KYY=|&2=u WY=t&u WYWY0W0BPYW02Y=l\W0rPY P YEW0ruPYYhXujPYYh uLYYƅhuNYJxFFSXVHYE=} - =_r Et2JxUhuIYY낋Jxd3UYd3UhRIYY?V]EYJx hj eIYYuY=|%W0rnOYPYEW0ru0OYYhPuOYYhuKYYƅh MYJxFFSXV\GYE=- =_r Et2JxUhuHYY댋Jxd3Ucd3UhR?HYYIVCYuY8t-Jx hj GYY8_^UVWujEYNjRRMYP-YPMYYfVfWVRRMYPYPMYYGVRRMYPYP|MYYGV RRMYPYPZMYYG _^UVu6jjhHK~4=ptPVYF$PYPFPj ~5t *PhJhF(Ph F$PYPFPj hJJx hj }FYY hJY^UVWu~0u6hjJYYV02jhRJ E=t"~,tv,h|/JYY hd!JYJx hj EYY~4t5~5u/Jx*=hj*EYY-Jx hj qEYY~tF~tu.~tu(~yu"~du ~4tEFPh\UIYYFPhTCIYY hP5IYF$PYǀ~4tF(PGYG PWh@ I K~$u h0HY8&+V$N|GPGPhH GPhHYY~tFPhHYYJx hj \DYY_^UVWu~0u6hXHYYV02hBHYY~4t~5u h*HY hHY~,tv,h HYY=dt/V0rhxGYYV0R :tV0r hlGYY~4xF$P Yǀ~t4FPFPGPhLGh<F(PhH6 FPj GPh kGhF(Ph ~$u=x&h0GY&+V$N~:F$P YǍFPGPWhF~tFFPhFYY4F$P YǍFPWhF ~tFPhFYYJx hj dBYY_^UVWUB,Uz0R0z?*uG?`?,W?&uJUR0-a=sP;YFFuNG럊GFF)щ~!PYPGYYUB,Uz4t u*Y uAY_^Ujh0FYYx&y =th0hh +E U4Vu=x&V0Bk0jP5x&#F j0EP5x&F E=0u4j FPEPgF FjFPEPQF F!UV$=}th0h h D FFF$FFF$^U=x&x 5x&gEYU$VuFPh@FYYEPheEYYyhh$h C j2 YEP?EYU9U} F( U+UV(U1u@F5^UVub Yƃ~V~u$~u h`CYLvhXCYY;~ |vhP|CYY$vvhDhC vh<VCYY^UVu Yƃ~u~u~u > j@uh CYY~ |vhCYY ~~>~uPv~uPvhB~ |vhBYY~~>~uPv~uPvhaBg~ |vhFBYYM~u6h-BYY7>uplP6~uxtPvh|AuhhAYX^UpVW}?*uGEu^U UU9sEEFuN>uEPDYYt3},t}u1#u U9sUFGEb_^UVWu }GE-a=s u\YEFE-a=s u=YEU9Uu}uL}uN-0= sF>u,'}uO-0= sG>u1_^UVW}u1Jj@u7BYYEu10UEuCYExuY<=uuh(@YYuhAYY@P<LHDE@E0h?YYh8YhY`u Dž`j`@YYE=u35YP`5&hph 6?jiYDžl0URtf)O) ) فfzlPh0n@u? Ey'5YPhlh > jYDžddPh2n@u? Ey"= uhLh W>YYj?Y}y = t}y'5aYPhHh > jOYhD'>Y=ttjh@uJ? u@YPuu2? jh<u ? h8u0YYƋJxFFSXV!8Y=. JxFFSXV7Y!ǃ u;|Jx xhj 9YYeJx hj 8YY| _r t5JxhW8YYJxd1d1hRd8YY| t-Jx hj )8YYV3Y_^U$VWE u,>YPh  >YZPPYuV=YYuV=YYEPV =YY=j}tdU9Uuh;YEPYP;Y>h;YEP}YGW;Yhy;YEP[YPh;YVY_^UV1BVZ9~U9&u}U&1^UuiYP/>YUV5Nx )^U=tu;YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWTEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhXu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ} t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVL7 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPS>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW3YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW3YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVh2YY_U U V2Y=Vh2YYVhwYYƅ>-uF>+uFjVEP ƅUUj h5j2 1VhYYƅpj h5 2 >t>,tjVEP ƅt5U>t'>,u"FV1Y=xwVhYYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JX4EU M R+Q¤ЙЙUuW +UЙOIkkE0XUM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FyN>.WY =u0*1=| |X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhP"hPj jP$Ey1HjuP ƅu1*UVU V   _^UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU EA} tF=4* 4* ً4* ʋ 4* ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U0?}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!H=+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U`<>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW@*u!=u hPjjjuu ujF%$ƅ0*uuVPƅy0*}Gu^fWf)) ) uL00*70*+0*0*Wx;_^UVWE@*uq =u N0*uE>t >.uEF}u)uYƅtuuuu V_}u @*€u$}N>.@*\+?quuuu 7uE~=;u0*l=0*uE=0*t =0*u@*t놃}t"uuuu ju%E~}t 0*_^UVW}} uBWY-Ɖ:.u#sVWP= Ƅ5*"u hWhhPuuuu_^UVWhsYEthuYYEu1EuhP >tuF>nuP. YYuFu>tDG?tuG1҈#hVh$ uY$ uY1_^U@VWEEEUUЋUUE=@*u)=u @*u } ~1EUffUE<*9UYED*9U;}Dž<*U=y2UMEPUT*P4H*w =#U f)) ) فfMjEP5 =t$U5Y^u u5 9E t$U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tBU5#Y}<}EM}ff)) ) ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$U5GYUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yyU'UMUT*P4H*u u5(9E M8*Uԃ}~ Eԙ=D*Eԃ}Euuu5E=u=EEUM9u@* u+UBt"5YE}t@*t}u @*u5zYEaEE=x5CY}u}u ;= Uȉ_^U=t5YU$VWhYDžujWYYƃuEE1UUfU fUEPh0n@V~ E=uEVXYGEEPh2n@VB E=uEVY E_^UVWuut.Vu u' Dž U)U U )΋E_^U VWhYDžujWYYƃuEE73EPh@n@Vz E=u UVVYU_^UVWUR|Yƅu wUWfUfW fG #UfWuu FP URVu EUVY}r UUUE_^UhmFjxYYjsYUVWURYDžu hmFj/YYEu&YEURWu8 ƋUxw7~1W_YjYujYYuYU@RGPu \ WYjYujYYuY_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEP9YNjE E P'Y9uuąt9}t t1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVW1}y11<8t,|1Fρ(1E E -U :tE E p-jYEu1EttEUMJUzUBU8E_^U=x 5YU=x=$u $j5$YYy'j5YY Pj5} 1U^U$UD!( =u/hh(5 1V@!(=D!(!u1< @!@!D!D!= uD!( UD!UD!UD!:u1D!: t D!::uҋUEUV=yy1u1(!tx8!tjƅtjjV f,!LƅtjjV .!/uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }O~y UVu CV€tu ,fNV~u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv} =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<8tN|1DFρECEE0-EMP1E E L!U :t! EE E l!U uuuYYEy@Ut8huaYYE~" tu?YuuYYE}y1]jYEu u Y1A!uEUMJUzUBU8E_^UUUuuu  UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuu< EUJUx ]E EPjYYEUuu huw  cCoUSE] ![]USE] ![]USE] ![]ËD$D$D$UVW}u M .NUVWiE_^]nL$ UVWM+E_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VW\!hVYYUR< EMxGFFUR<(EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY\!_^UVu~  u6EP YEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U VWDžDž8*<*@*D*\*jh8 rYYu0*g#Jfh, 胾YƅthVh\*\ h h |YYE(uhP jh P _u> t> uF>t> thVh\* j h\*}YYƅtDždjh Px 9> t> uF>> hVh\*; j h\*YYƅt\*\+7E>t3t+s+> t> u E}t 7EFȀ>t > t> tFDžoj h P Q=D*D> t> uF>(> D*H*PVYYD*ff UT*D*uY=D*u"H*ffT*D*=\*u=hPYYu&j.P~YYƅtFPh\*`YY]\+\*\*E>t >.uEF\*}|h+sj.VYYF7M @*1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U T }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEl &uVuukƀ}Xu9utUPoYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U 5 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U U JxUʋFF VuRYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEДUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP6YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPRYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^<ckUVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]U}x}~uP$YYUhh nYYj袩YU VjhYYƅyHu uVn EVBY}u"U JUj uYYEt1^UVW5x+Y DžD7uYYtw>t6uYYt} tu w YYu=x+u_^U$EPjj U$UUU UEPj%j U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V!!5!hx!jKj ^U$EUEPjHj U=uhhYY 5YU x+U=t5Yx+UVW=u!hh7YYu1D5hh! Eu1U:#thu YYƅtU%huYYEtEU: t: uEhuYYƅjFuY%f)) ) ى %5%%%hVWYYƅtFt8>t3> t> uF8&s7hVYYƅtF%_^UVW}Utu >t]9uFG1_^Ujju% E`UVuj jVc ^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pk1ۇtPXPb Usage: finger [-bfhilmpqsw] [login1 [login2 ...] ] No one logged on finger: error opening %s finger: error opening %s Plan: No Plan. rProject: r IdleLogin TTY WhenLogin TTY Idle When Where Login Name TTY Idle When Where Not Logged In %-*s %-16.16s %c%-*s %-16.16s%-*.*s %-20.20s <%-12.12s> <%-6.6s, %-4.4s> < . . . . > %3.3s %-5.5s %-2.2s %-2.2s ??? %-20.20s%-*s%-15s ??? from %s Last login %16.16s on %s from %s Last login %10.10s, %4.4s on %s Never logged in. Idle Time On since %15.15s on %-*s Idle Time On since %15.15s on %s from %s Shell: %-s Directory: %-25sIn real life: %s (messages off) Login name: %-10sLogin name: %-10s In real life: ??? finger: %s open error finger: %s read error finger: Can't stat %s %3dd%1d:%02d%3d: %2d %sss%d minute%s %d second%s%2d seconds%2d minutesss%d hour%s %d minute%s%d hoursss%d day%s %d hour%s%d days%sd d&D,dr /W %s got EAGAIN error, sleeping 2s %s %s: unable to open %s (%s) /dev/tcpTCP_DEVICE[%s] unknown host: %s ; unread since New mail received Unread mail since No unread mail /usr/spool/mail//usr/spool/mail/SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error%u.%u.%u.%u.in-addr.arpa55525S56668889G99l;`;l;T;H;l;l;%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEIaIrIwIXI+@Ib6IMLMLMLLLLTaTrTwTU+TbT??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain$c%aubg Ig@~ghXhbphdhihoyhphuhxh{i li#qi+gi-bi0vimlLUjh?jlJjsjE lGkX_kb_kckdke lf lgkiknjo_kp_krMlsku_kx_k(null)cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/services@&@(#)finger.c 1.1 87/12/21 SMI/usr/adm/lastlog/etc/utmp/.plan/.project/dev/ ((((( AAAAAABBBBBB GMTGDTU U ph`TH@4x SSSS/etc/passwdB |+Unknown error x d P @ 4  x h T @ ,   x \ H 4    h T D 0   C  `L1$T$LLsu;SSSSu QRPl5PbUuhu m u hYE U$VWE U R}t5hYYU hrYYuU rhzYYU hrYYDžuU rhPYY1PPEPPPW{J9FPYYPhYỲ}du9t hY9vPYYEFPWYYEjhux t hmYURuYYt hMYx}dhPWYYPuYYt hl Y}au;9t hTYPYYPhPYYF9mjhLPWYYP t h8YPh40YYEhP tPh0YY1_^UVW1U-0= sEk Ã0܉U:,u)E1U-0= sEk Ã09~ h,YE 8E0E_^UVuhP ƅu1zuu VH ƊF=atctdt hd=YuuV ƀ> t~t Vh<YYU ^UU U55hxhouuh hthJYYjYUVWu }}uPYtGPYtF9u?t >tGFPiYtGPXYtF?t>t 9t)t uPuShh)ۉ_^U 1ElUV5Nx t^U=tuYUVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YYGƒ~uFLFF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuukYYEy@Ut8hu!YYE~" tuYuu'YYE}y1]jIYEu uY1A!uEUMJUzUBUE_^UUUuuu ( UU Uhuu Uuuu  L$ UVdU9dwUd9dv8 16VYt1'drF5d&Y5d^UVW}u1E}UUs8 1=`u8jlY=u1V!փ5`5dFE5hOVU}9}r69v2W9UvUW~>}t Ehu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=h<9}r79}u+UOJ}t EhURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15ht 9ur6E0tU UhtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U<1UVW5<<}׃}~9r }y 9vWYu_^UVWuU VVuMYYDžt~~yVډ8F_^U$UUEPjj U$UUEPjj U$U UEPu|YYEPjjU U(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE8uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U5 JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE`UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PSE6U U RU U RUEEE% E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvU =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5lYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvU =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UVW}u MK~UUas U EUhhhYYjYUVuYƋU rU MJwU uR!YY^U$EPuFYY1ۅÉU$UUU UUUEPjjg yEUu hT$u U$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVW=E_^]U$UUU UUUEPj6jK } 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇDtPXPunexpected eofaRvv%s%sillegal append line>%sappend count conflictillegal separator in chunk--- delete line conflictillegal delete line<delete count conflict%scan't read %srcan't read %sruse: %s original-file diff-list-fileillegal rangeextra characters at end of command: %sillegal command %s: proc essing: %s fatal: Failing for (%x)[%s] (%x)[%s]  { { { {arw*+ b @Xbdiopux #+-0LhlEaGLXbc3deafagLinoprsqux(null)cannot print floating point pSSSSB  ` np1$T$LPl nsu;SSSSu<< QRPu8PU VWU u< uU19}Uu 9M t[FUU9u+uuj5u5uT uBMuU uM_^Uuu9u|^uduj5u5uRT uj5u5u7T uj5u5uT u=uuu u(uJ uuKuuu uu uuUU uUVWuJx FF[ Vj[5YY19=uU <}Jx FF Vj YYVWRYPYYG9=u~ U <uJ9U}JRsRYPhV贽 Jx FF Vj 蚹YYGaJx FF] Vj]wYY_^UVu=}t }<t}<w=ԕdVh5v V5vYYu 5vYYvv:xvX@ 5vj ϸYY^UVW9} UU }UU U}Q <uE}u?9u|5U@t&U 45h(hl9 FGr_^UVW1U \U ~X9X_\  TE9}UT9`tE9}~d}GT`FW`PIYYh`ujYY9Qu(EJExEX@ uj *YY`h\u F맋EJExEX@ uj YY_^UVW195u~4艠YNjU Fhu蝺YYPu5YY195u~1Fhu\YYPuYYEJExEX@ uj 'YY_^U(VWE U=T=uj5}gGYY nT=1҉UU܉UEU9UU؋MU ~<vE܋}9U|A}uj5}uN Ej5}5 nN nU܋ n]U ~}]U Ut EM]UUE59}w nU UMU ~}4<E܋}9U|A}uj5}uM Ej5}5 nM nU܋ n4~} ~Ut EM]}u<[E}9U|A}uj5}uM Ej5}5 nL nUM4uU ~4~<E܋}9U|A}uj5}uL Ej5}5 n{L nU܋ n4~} ~Ut EM]}u<[E}9U|A}uj5}uK Ej5}5 nK nUM4uG9}|B n ~<y n} n hGYG빋UE UEUEE_^Uvuj5v5(K j5v5ĕ K ĕj5v5 ~J ~j5v5ЕJ Еj5v5J j5v5J j5v5}J }=tj5v5bJ UtVW=t ~vBjRfBYYEj5}TBYY1҉195u|DŽDŽF195v| UF=}t }rKYhlhL葴YY蝎=ؕ9z19uu@=~tCu:Džu9"9ؕu DžѥЃtj5vHAYY=t0195ؕ|DŽFjjP \=~tS=t ؕU ؕBUuh$ȵYY19u~ jdEYF}  ̕≕9Eu@}M0}44NYYUEPEPuEPWǍEPuuuuWt9UU= vt}~uuuWF=u8hjjujWu hBY9EE95ؕ|DŽFU UԋU ~U=}tuhhl臱 PPuuEؕ9UU샼uDŽU샼WuuuEEPEPuEPWǍEPuuuuWBt9UU= vt}~uuuWUM=}tuuhhluEЋUDŽUЋMulU싔UM쉔=}tuuhhl 1FU9u󍔵BuE̋UDŽEcU~=t:=ܕu1ADžaZFދ9U~PuYY=t*ȕMȕDŽ=~i9Uu RAY 5 AY9u~$t UډP@YF}  =tuuP 9UuhjjuieEE9u|#U9~UUFuuuuP衃 =~t>_=uV膅= ~C  44v44~謋 __^UVWE95~M9 x ~M 9 `U}uu uT;YYE9} |UM 9 uG9} }E01}Fd~v9~|~UU BRYU U <u hr=Y}u u u:YY9u |UM FU ~] U ]}u@=}tU }U }U Е=}tuu9YYUBRYU }U }<u h\<Y9u|UM} FU Е]-vB׾9u|U9<}փ|2plJplxll hplj yYYɅ~0plJplxll hplj CYYN^U=}ub=tY=t hY hY>hYh\Yh<Yh8Y >U=}=>h{YhtpYh\eY=u =~t h8HY h;Yh0Yh%YplJplxll hplj YY>UVWvBUؕ@BRh<@YYh44Y@ ~A@B ]ؕB @A @ @ 195~|L}< J J 5uhhh>袡95u~N=t!A|ZhVy-YZ4ĄY41YF.=}hlhߞYYuE19}95u~S4V=3YPhthlzlJlxll hlj PYYu륋lJlxll hlj YYGg_^U=thY=~thYj=}RhYhYhD4Yh Y>huYhjY>hYYhNY= vdh6Yhd+Y>h`Yh4Y>h0YhYhYhYhY >hY >hY>hYhtYh<Y=t!h$uYhjYh_YhTY >hCY>h2Yh'YhYhYhYh Y >h| Yhl Y8>hh YhP YhH YhD Y >h@ Y >h4 Yh~ Yhs Yhh Y > hU YUVWvBU~BRh8 h>訝  }]95~|4}h Yh  Y=8t4~Rh ٜYY>h H Y >h 7 Y >hD & YUV=ܕt  ƃ=ܕt  E=~Vh@ YY>=~=h< YplJplxll hplj 訕YYh0 } Y=~ h, i Y >plJplxll hplj VYYh + Yr=h  Yh  Yh YVh YYhX YuhD YY>=~ h@ Yh Y=~=plJplxll hplj 薔YYTh f Y >h U Yh E Y>h 4 Yj|Yh ! Yh  Y >q=0t5<h pYY5,h \YY=}u=0uh YhX Y^U}tJ=uA=ܕt5ȕh P诚 @5ȕh P蓚 $=ܕt  PPYY}t<=t3=~u=uh  Y>h Y=~tPhL YY+=tPh uYY PY}t<=t3h Y >h ~Y>h mY >=u =~t3=}t h <YUV=~=}u1ƅt hYplJplxll hplj YY=thYhY=~t'5ȕhYYh\Y=tH5ȕh@YYh[YhPYhEYh:Yi5ȕh|EPW EPXY=}t hXYa=0t5<h(`YY5,hLYYq=u =~t_plJplxll hplj 襐YYh zY>h iYGh YY >^U=t$=4tPhYYUhY=4t"hY>hY >=}th`Yh<YU,VWvBUj5v4!YYE=}EUU܋ Е }]؉=~@Phh>讕 E95~)UM Е< }UЕU=}tVhhl EU9UUMUE= vt*E@u!}~9v| <uM u3%Y=}cUM4hhl_ U9U}hlheYY-lJlxll hlj YYE1FUM !; }]95~|}MFU~U=}tEuhh> 95~|@U4"$Y=}u(=}tU<t4Vh|hlEF븋U4#Y=}t U4#Y!=ܕt~=8=}thlh\YYؕBRhTh>1 95ؕ|A=}t!4 tvYPVhHhl薐4 SvYP.#YFt D~UBRh@=@~@>>P角 95~hĕ<<u < uĕ , y~)B ĕ4y"YF댋4g"YF9u|!4R"Yĕ , FUBRh8=@~@>>Pȑ 9u|ĕ4!YF=@BRh0=~~@>>Py 95@|9<t  <u , 4~!YF@BRh(=~~@>>P 95@|$ <u 4!YF`_^Uu u谐YYplJplxll hplj #YYU_u蓐YUVW1p#>=HthlYhPY h4Y>+#vBRhYY=ؕ@BU~ E>h=Y>h,Yh!YuhYYhY >hY htY=t=~tx=~hDYhY=t~BRhhl> 95~|H=t-=t4hʎYYh輎Y4YF;=$tRhYhY5vhh>n 95v~4YF=}h\TYh<IYh(>Y= vtCh*YhYhYh hYYh@hύYYhpYhl܍Yh(эYhƍY= vt!h貍Yhp觍Yh0蜍Yh$葍Yh膍Yh {Y,hnYhcYhXYhxMY=Ht9hXYh4YhYhuYhjYh]YhlRY(R t h8(Y5(Yt h Yh5?詈YY(u hY&x>=HtYhYhYhY>hYhlYhXYhTY >!hH Y=>Y=$h00Y>h,YhY>hY >^5vhfYY>hYhdY >%5vhH-YY>hYhY >vBRhYY>haY >hʊY>h:Y >h)Y >>fH95̕|.<uV4hh[YYFʅt>hXY >D>=u =~t hDY(=}u=0uh$mYhbY>=4t h?Y>jsY>hplY<_^Uu ug YYV=Ptj<Y=hu H=hu H=lu }=lu }=`h=0thhluYY=Hthhhl[YY=}th<hlAYY= vthhl'YY=}t = vt }=~u =t*=}t!=t hY huYjYUV=?t6?R t h"cY5?L}Yt h"FY=(tS(R t h|"$Y85( }Yt hH"Y5?Yt h"Y}tX=?tOxl t h!Y7hpl|Yt h!Y5?辉Yt h!Y=ԕ=v=uh!5vYY?=u =~t5hX!5vS h0!5v>YYvR t h!Y5v{Yt h Y=LR0h?5h hlՃ505,h hl跃hp hl襃YY=ԕt-lJlxllbhljbsYY=$t-lJlxlldhljd=YY=0t-lJlxllIhljIYY=t-lJlxllihlji~YY=\u-lJlxllLhljL~YY=`t-lJlxllphljpe~YY=Xt-lJlxllshljs/~YY=$ot-lJlxllthljt}YY=}t-lJlxllThljT}YY=Lt-lJlxllvhljv}YY=uu-lJlxll8hlj8T}YYhl hl?YY=~t-lJlxllfhljf }YY=t-lJlxllFhljF|YY=ܕt-lJlxllehlje|YY=8t-lJlxllmhljmk|YYhT 5?YYt5?hL hl: lJlxll hlj |YY5|5h8 hl55v5~h hlvJRh hl =uhhlYY==u =~t5hhlk hhlWYY=4thhl=YY55̕hdhl 5<58h4hl=uuhhl~YYHu uuu5(5uS5u5uhhl~5~hhl~ 5u5uhhlh~=~t'~ؕVhxhl=~ D~ @֋D~5vRhThl}5@55@h(hl}Dؕ D R5 Qhhl}5hhl} 5hhlq} 55DhhlS}=ܕt$5u5u5ؕhthl&}=8t$5ؕ5u5hHhl|555}hhl|5uhhl| Vhhl| ubY^UVW} 1҉0X}PL1҉~$`ԕ1҉}dH1҉lhܕ8\E$ouM}:-z UU:ԕ5h|%hl{ t hX%' Y}u%ܕ8~EFU:qGܕMA~58)UPh@%% YYU#pF$1҉8ܕ~1҉8ܕ0\`t h% YU?kXY$oM}AL5u)UPh% YYU0#`F M=~u =t=8t h$K Y=~u =t=0t h$% Y=~t=t h|$ Y=?u?Hohd$5?~YY=$ou;hplh`$5?y Eu5?hL$U YY?Ux=t=x~ t1PJY=ԕt'h8$h<$2wYYvuh$F Y vu̕p ,h$5?vYY?u5?h# YYj{Y?u&h#h(o}YYh(o|Y?(oh#5?~vYY(u5?h#7 YY1҉~v~1҉}u<8ؕ1҉}Tuu1҉ 1҉4 v4p=ܕtA95u|JJ4Fu"95u|4F_^U =$t h &yY=uu h%xY h%xYhpl8Yth%YjY=?thYؕܕ4=ܕt5uhh< ؕ uؕuR[Yȕ=ܕtU|j5| YYj5|YYj5|YYj5|YYj5|YY~j5|YY~j5|YYj5|YYj5|lYY}dj5NYYj5:YY(j5YY}j5YYj5YYj5YYj5YYj5YYudj5uYYuj5uYYuj5urYYuuj5uTYYu}j5,YYj5YY  j5 YY$vj5vYYj5vYYĕj5vYY ~j5vYYЕj5vYYj5vxYYj5vdYY}U5(hPl t'%u %thplPrYYUVU U hP&PYU URYYƅu h &1Y^UVu>ts ar1F޸^UVu>t$s-A=r1F׸^U VW} ~>9}2BM]9}UB]BM]FO_^UVusAs VdhYSX^UVW}>tF)BRrXYEu h|&YuGFЄuE_^UVW}>tF)BR(XYEu h&YuGFuE_^UVWuE E}UUU 9UU+UׅsUU}t):Z:t(M 9<M 9~) MUUM +UEiEEF_^U=}~!h&prY}UplJplxll hplj kYY= |7plJplxll hplj kkYY}Uu5h&hl4oj{YUu5h&hl ojSYUVjsYEEPTYPrYF^Uu uPq PXYUu uPq P+YUEPh 'uq EUU0 s1uY'鉙U=?t%=\t5?5ph4'umU=} |2plJplxll,hplj,iYY=}uhplhH'mYY-plJplxll,hplj,oiYY}uhD'oYYU=} |2plJplxll,hplj,iYYC=}uhplhT'mYY-plJplxll,hplj,hYY}uhP'oYYUEEPh\'uo EU VW}  s 0 sF߉ MGPYEM ErEU sUPfYtE؉U MUGP"YEUM EG`'G_^UEPh'un EUVux |D|K=<(b8([4(T0(M,(FVh$(hp n p,'R u (ppp^UVU U hh(YU URuRYYƅu h@(hY^U5?hPd t'%u %thplP_jYYUu uh(l }}=K{plJplxll hplj eYY u-plJplxll hplj eYY}UVW} <u ] $hYƋM VWqYY_^UVWhYǾ9u |uYPW=YYF_^U VWuh(hlh 95Vh(hlh U~U~Uu \uRR\uuhh4R莪 Al\RbY~=xu2 uuuj4S =ܕtAu uRRuuhh4RlRYlRYRRl=t :A|:Z2!Y2,YHR4r YR 9J~h,,~Y=tDzA|zZrYB:A|:Z2bYRd d9 |5dr׍YYd؃=xt `9J~1x`R =t :A|:Z2Y 2qDYY=xt `9 ~1x`Rx`xs=t :A|:Z2 Yl2YPrYYhY 8+wUNjUuAEi}ucf5=y.y =UUCƅt$x uF9u uD UUBǁ=s3f5h,Y1_^U4VWE=i}=iu i=Hu HXl=Hu Hpl=pt5H5pYYh@5HYYpi5i piU uE4K U UHt p5pUU`LUL^9Et,UUOE=U|4L 볋UU`LUREF}TZ5ppUUUHE=\)` p5i) p5ppUEi p5Hj5`5\JiphplYEi U4hplYich4YEi'Ei'h4YEi'ppuRF/Y?u h\4YEu9U}U ?Ei+Zh@4YJ5\h4jMYYpi 5\h4?MYYDpp )h,4Yi5Hj5`5\Iip5Hj5`5\Hir5Hj5`5\HQ5Hj5`5\H0p5Hj5`5\mH pi5Hj5`5\7H5\Y}5Hj5`5\G5\YHv5Hj5`5\GUp5Hj5`5\G})i5\P8KYYPJKY-E}xU: tU: uMًUBƄPh4YYp=pu h44Yipspi5\h4JYYpi25\vYtUlh3Y5\YtUhh3Yh3wYpiEhx3@Y}t ډP5?5\HYZEU}t ډЋ\ ?E p pN5i=\)` p5ip5\ht35(9C h`35(&CYYip5\h\35(B hH35(BYY1 p]\ 1%t@EEq}t5\hD35(B i) i <7 ^- i" pW։i=\)` p5ii{ i pW։i=\)` p5i$ qi% f dp L qdi $ pN5i=\)` p5iqdi p  4i 5\h4sFYYh4YtD(X uBRh4<YYh4IFY-E}~ E45\P YYMi[ 5\h4EYY`Jƀ4h5Yuh03 Yo5\j)' YYEY-E}x"U 5\P YYM5\j( YY\C \ D* p  , i> pW։i=\)` p5ii>5\h4DYYh3YGi^t\ D[i"Gh3Yip"" pW։i=\)` p5ii^ pW։i=\)` p5i^iD-~i\ D[ pW։i=\)` p5i-\ Di]5\`YD,i}h2Yi}h2Yip}sh2Yih2Ypiq5\h25(C< 5\Y}5\h25(< 5\YHq5\h25(; Sp5\h25(; =qt}!}}u5(h2;YYEi5\h25(C; q5\h25(; q5\h25(: 5\h25(: e5\h25(: i!=5\h25(: 5\h25(y: i#p5\h25(K: =q5(ht2K:YYi5\hp25(: 5\hl25(9 id5\hh25(9 F5\hd25(9 (p5\h`25(|9 5\h\25(^9 5\hX25(@9 5\hT25("9 p5\hP25(8 5\hL25(8 i^5\hH25(8 @h$2Y1o5\YDT5\YDi/5Hj5`5\1:hlh2N8YYlJlxll hlj 4YYj Y1+\J ppRp9i#\iEPPY=\tii։E5ppUpt*\iiJЙzE=p5H5pZYY\iE5i=\vp pJ iE5i=\fx/ahlh16YYlJlxll hlj O2YYjWY/Ea_^UVWpRU=\Op pAJ9 ivFhlh45 6YYlJlxll hlj 1YYjYi+\E9u}GUEEpztppR )JU ~ E L}Fhlh5X5YYlJlxll hlj 1YYjYpR HuRq9 pyFhlh44YYlJlxll hlj 0YYjY=pu1uEpBEpBE5ppRpp pAJpR\E_^UVW\U5iz uF=\9=i?t4KEuHt 5p=pu`LUUL^9t#uOƁU|U4L Mu`LUURGf_^U VWu=iEuHt 5p=pu`LUUL^9t#uOƁU|U4L Mu`LUUR1Tu@Et1_^U VW5i ppR9pUp pY Z]R}׋p9zsOPMUY U)΋U)U U pR ppR9vFhlhl52YYlJlxll hlj -YYjY9u s ~ uF NMU \+U ` p5i_^UiU p i:pRp9isii\it\i5H5pJYYb\iWhlh50YYlJlxll hlj ,YYjYT5[i Mi pEUu5pYY_UU9ptM=pt,i p p iJp pJUp pUpRppRi\pHi pUVjYƅuFhlh5/YYlJlxll hlj M+YYjUYU V RWYF~uFhlh57/YYlJlxll hlj *YYjYuV6YY^Up9Uu pUrYuYUVuU V FVBVBVVF^UxJx~tt2 Y1U}t5U?h865?,YYHu%uh(6SYYHXl? 6UVWuu YYEUtU <U GϋؕU9@}ؕU@_^U= |uuu uF  M ~ M  M v M UVW}uEU JؕġUؕU}~*EE9u  EMЋE_^UV=TtƃtuHT=4uh8.Y4=4u411=}=$kgvBRh8hl $k>lJlxll'hlV[YYlJlxll hlj )YY=4$khlh8YYhlh8YYlJlxll ~hlj YYkhlh8YY=4M$k>h4h8hle "5Dh8hlH =DsD _r5Dh8hl lJlxDllhl5DYY6DLF5Dh8hl g5Dh8hl Mh8hlyYY:h8hlfYY'5DVhX8hlL X7E^UVuxډ^UuIYP YUV5(kNx  ^U=,kt,kuYUVW u!Yƹ<Hk+F؉FHk+ډV YV YDžt"<1FF1V Y_^UVqU9qwUq9qvTl 16VYt1'qrF5q&Y5q^UVW}u1E}UUsTl 1=qu8jY=u1V!փ5q5qFE5 qOVU}9}r69v2W9UvUW~>}t E qu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= q<9}r79}u+UOJ}t E qURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 qt 9ur6E0tU U qtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh8lEP?>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hdkVW ƅu1WWYZ׀>/u5FuhdkVEP ƅu19ut EEG>,t1jFhxkVW ƅu1MWWYZ׀>/u0FuhxkVEP ƅu1EEGu>t1_^UVWuE}>:tVhqYY_TkXkdkUtk xkUk VY=VhqYYVhqwYYƅ>-uF>+uFjVEP ƅUUHkj hq5TkR 1PkqVhqYYƅpj hq5Xk q>t>,tjVEP ƅt5ULk>t'>,u"FVY=xwVhqYYƅu_^Uh9)YPLYTk\kXk`kUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0Jk4EU M R+Q¤ЙЙUuW +UЙOIkkE0kUM 9_^UVWuEdkxkE=PkuPkV =Pku1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}tLk F 1_^U VWu<FyuNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },k&~y UVu CV€tu ,fNV~plu>5tl Yt.hYFu NLNHF 9h^YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE110u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWrh9VYYURtG9uF>uր?=uэG1_^UVWrEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhku%dEuEu1k0Z‹N9tFN>Xu E0EEF>t&azjuYYyEG߸:_^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj? ^U$UUUUU UEPjj Uu hT$u% U$EPj j y}tUEEU$EPurYYEPj j U$UUUUU UEPjjs UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U :s}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE0:uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"Ux:EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U:JxUʋFF Vu.YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEX;UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE:E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPpYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP.YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }Es$E)E EEE`;-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXViYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G ;;E=cF}[t@}nt:JxFFSXVYEEmuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=sr}su8-t8+uEE-sEE}dt}iuuEPhs EuEPhs EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEmu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEEr}ss UE?]u Gƀr?Z?]QGƀr?-uG?t2?]t-G9"G@E9EEƀrEGr띀?uEEr3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVkYEE}t}tEr3]u}t}t VuYYMEUEt }vE}uEuVu E=sr}su8-t8+uEE-sEEEPhs:YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY ;E& EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVujuu V!^UVujuu V^UVWuEEEu} tE 0mtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+Tl"}t}y UU_^UUas U EUhX<hlYYjYUhx<hlYYjYUVuYƋU rU MJwU uR9YY^U$U UEPuYYEPj!j U$UUU UUUEPj6j U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE8UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7nu.`=}aa1ۇntPXP-%sState #%d is non-accepting - %s: Dangerous trailing context in rule at line %d %d associated rule line numbers: jam-transitions: EOF out-transitions: consistency check failed in epsclosure() %d %d %d %d state # %d: could not create unique end-of-buffer statestatic short int yy_nxt[][%d] = { DFA Dump: dynamic memory failure in snstods()dynamic memory failure in snstods()consistency check failed in symfollowsetbad transition character detected in sympartition()scanner requires -8 flagtoo many %t classes!}yy_last_accepting_cpos = yy_cp;yy_last_accepting_state = yy_current_state;{if ( yy_accept[yy_current_state] )if ( yy_current_state[-1].yy_nxt )goto yy_find_action;yy_current_state = yy_last_accepting_state;yy_cp = yy_last_accepting_cpos;yy_cp = yy_last_accepting_cpos + 1;*yy_cp = yy_hold_char;/* undo the effects of YY_DO_BEFORE_ACTION */case 0: /* must backtrack */ &yy_transition[%d], { static const struct yy_trans_info *yy_start_state_list[%d] = }; { static const struct yy_trans_info yy_transition[%d] = %4s = %-2d Equivalence Classes: yy_ecshortyy_ecYY_CHARyy_act = yy_accept[yy_current_state];}yy_lp = yy_accept[yy_current_state];yy_current_state = *--yy_state_ptr;--yy_cp;}}break;yy_full_match = yy_cp;{goto find_rule;++yy_lp;}break;yy_full_lp = yy_lp;yy_full_state = yy_state_ptr;yy_full_match = yy_cp;{else}yy_full_lp = yy_lp;yy_full_state = yy_state_ptr;yy_full_match = yy_cp;yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;{else if ( yy_act & YY_TRAILING_MASK )}}break;yy_act &= ~YY_TRAILING_HEAD_MASK;yy_looking_for_trail_begin = 0;{if ( yy_act == yy_looking_for_trail_begin ){ yy_looking_for_trail_begin )if ( yy_act & YY_TRAILING_HEAD_MASK ||yy_act = yy_acclist[yy_lp];{if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] ){for ( ; ; ) /* until we find what rule we matched */find_rule: /* we branch to this label when backtracking */yy_lp = yy_accept[yy_current_state];yy_current_state = *--yy_state_ptr;yy_act = yy_accept[yy_current_state];yy_act = yy_current_state[-1].yy_nxt;state # %d accepts: [%d] yy_acceptyy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];}yy_c = yy_meta[yy_c];if ( yy_current_state >= %d ) yy_current_state = yy_def[yy_current_state];{while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )register YY_CHAR yy_c = %s;yy_current_state = yy_last_accepting_state;yy_cp = yy_last_accepting_cpos;while ( yy_current_state != %d ); while ( yy_base[yy_current_state] != %d ); }++yy_cp;{do}}yy_current_state += yy_trans_info->yy_nxt;{ yy_c = %s ) (yy_trans_info = &yy_current_state[yy_c])->yy_verify == yy_c;for ( yy_c = %s;register YY_CHAR yy_c; register const struct yy_trans_info *yy_trans_info; {yy_current_state = -yy_current_state;}++yy_cp;{while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )*++yy_cpyy_ec[*++yy_cp]*yy_cpyy_ec[*yy_cp]*yy_state_ptr++ = yy_current_state;yy_current_state = yy_NUL_trans[yy_current_state];else}yy_current_state += yy_current_state[%s].yy_nxt;yy_current_state = yy_nxt[yy_current_state][%s];{if ( *yy_cp )*yy_cpyy_ec[*yy_cp](*yy_cp ? *yy_cp : %d)(*yy_cp ? yy_ec[*yy_cp] : %d)}{if ( ! yy_is_jam )yy_is_jam = (yy_current_state == %d); yy_is_jam = (yy_base[yy_current_state] == %d); *yy_state_ptr++ = yy_current_state;%dyy_is_jam = (yy_trans_info->yy_verify != yy_c);yy_current_state += yy_trans_info->yy_nxt;yy_trans_info = &yy_current_state[yy_c];register const struct yy_trans_info *yy_trans_info; register int yy_c = %d; yy_is_jam = (yy_current_state <= 0);yy_current_state = yy_nxt[yy_current_state][%d]; yy_is_jam = (yy_current_state == 0);yy_current_state = yy_NUL_trans[yy_current_state];register YY_CHAR *yy_cp = yy_c_buf_p;*yy_state_ptr++ = yy_current_state;yy_state_ptr = yy_state_buf;++yy_current_state;if ( yy_bp[-1] == '\n' )yy_current_state = yy_start; + (yy_bp[-1] == '\n' ? 1 : 0)yy_current_state = yy_start_state_list[yy_start%s];yy_chkyy_nxtyy_defyy_base%d = %d yy_meta Meta-Equivalence Classes: state # %d accepts: [%d] yy_accept, [%d]state # %d accepts: yy_acclistregister YY_CHAR *yy_bp = yytext; yy_current_state = yy_last_accepting_state;yy_cp = yy_last_accepting_cpos;yy_cp = yy_c_buf_p;yyterminate();case YY_STATE_EOF(%s): }fprintf( stderr, "--EOF\n" );else fprintf( stderr, "--(end of buffer or a NUL)\n" );else if ( yy_act == %d ) yytext );fprintf( stderr, "--accepting default rule (\"%s\")\n",else if ( yy_act == %d ) yy_rule_linenum[yy_act], yytext );fprintf( stderr, "--accepting rule at line %d (\"%s\")\n",else if ( yy_act < %d ) fprintf( stderr, "--scanner backtracking\n" );if ( yy_act == 0 ){if ( yy_flex_debug )yy_match:}yy_more_flag = 0;yy_more_len = yyleng;{if ( yy_doing_yy_more )yy_doing_yy_more = yy_more_flag;yy_more_len = 0;could not re-open temporary action filererror occurred when closing temporary action fileerror occurred when writing temporary action file#define YY_MORE_ADJ 0#define yymore() yymore_used_but_not_detected#define YY_MORE_ADJ (yy_doing_yy_more ? yy_more_len : 0)#define yymore() { yy_more_flag = 1; }static int yy_more_len = 0;static int yy_doing_yy_more = 0;static int yy_more_flag = 0;#define REJECT reject_used_but_not_detected */ * any uses of REJECT which flex missed/* the intent behind this definition is that it'll catch}goto find_rule; \++yy_lp; \yy_current_state = *yy_state_ptr; /* restore curr. state */ \yy_state_ptr = yy_full_state; /* restore orig. state */ \yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \yy_cp = yy_full_match; /* restore poss. backed-over text */ \*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \{ \#define REJECT \#define YY_TRAILING_HEAD_MASK 0x%x #define YY_TRAILING_MASK 0x%x static int *yy_full_state;static int yy_full_lp;static int yy_looking_for_trail_begin = 0;static int yy_lp;static YY_CHAR *yy_full_match;static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;yy_rule_linenumint yy_flex_debug = 1; extern int yy_flex_debug; 0, &yy_transition[%d], yy_NUL_transstatic YY_CHAR *yy_last_accepting_cpos; static yy_state_type yy_last_accepting_state;typedef int yy_state_type;typedef const struct yy_trans_info *yy_state_type;};%s yy_nxt;short yy_verify;{struct yy_trans_infoshortlong#define YY_END_OF_BUFFER %d yyleng = yy_cp - yy_bp; \yyleng = yy_cp - yytext; \yytext -= yy_more_len; \lex.yy.cvariable trailing context rules cannot be used with -f or -FREJECT cannot be used with -f or -FVariable trailing context rules entail a large performance penalty REJECT entails a large performance penalty yymore() entails a minor performance penalty -I (interactive) entails a minor performance penalty %d total table entries needed %d sets of reallocations needed %d (%d saved) hash collisions, %d DFAs equal %d/%d meta-equivalence classes created %d/%d equivalence classes created %d templates created, %d uses %d protos created %d empty table entries %d/%d (peak %d) template nxt-chk entries created %d/%d (peak %d) nxt-chk entries created %d/%d base-def entries created %d table entries %d/%d unique/duplicate transitions %d state/nextstate pairs created %d/%d character classes needed %d/%d words of storage, %d reused no character classes %d epsilon states, %d double epsilon states %d/%d start conditions Beginning-of-line patterns used compressed tables always backtrack %d backtracking (non-accepting) states No backtracking %d rules %d/%d DFA states (%d words) %d/%d NFA states -S%s/usr/lib/flex/flex.skel -C scanner options: - started at %s, finished at %s %s version %s usage statistics: error occurred when closing backtracking fileerror occurred when writing backtracking fileCompressed tables always backtrack. %d backtracking (non-accepting) states. No backtracking. error occurred when deleting output fileerror occurred when closing output fileerror occurred when writing output fileerror occurred when deleting temporary action fileerror occurred when closing temporary action fileerror occurred when writing temporary action fileerror occurred when closing skeleton fileerror occurred when writing skeleton file7EFEeEfEm+EGF8;FCDFEIELESET#FbDcDdcEfrEiEnpFpEs FtFv/Fcan't open temporary action file %sw/tmp/flexXXXXXXcan't open skeleton file %srcould not create lex.backtrackwlex.backtrackcould not create %sw/usr/lib/flex/flex.skelfull table and -F are mutually exclusivefull table and -I are (currently) incompatiblefull table and -Cm don't make sense togetherunknown flag '%c'-S flag must be given separatelyunknown -C option '%c'-C flag must be given separately%s: Assuming use of deprecated -c flag is really intended to be -C fatal parse error#define YY_CHAR char#define YY_CHAR unsigned char#define FLEX_DEBUGmemory allocation failed in allocate_array()request for < 1 byte in allocate_array()dynamic memory failure in copy_string()dynamic memory failure in copy_unsigned_string() } ; %s: %s %s: fatal internal error, %s %xRaQQQQQQ# line %d "%s" %5d %5d %dT0T1T2T3T4T5T6T7T8T9TaSbSfSnSrStSvSx]T%o,U%UU U,UUU' '\%.3o\b\r\f\t\nattempt to increase array size failedattempt to increase array size by less than 1 byte%7d, %5d,********** end of dump [%d]%3d: %4d, %4dstate # %4d ********** beginning dump of nfa with start state %d empty machine in dupmachine()YY_DO_BEFORE_ACTION; /* set up yytext again */ %s -= %d; %s = %s + %d; *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_bpyy_c_buf_p = yy_cpVariable trailing context rule at line %d case %d: p[[([bad state type in mark_beginning_as_normal()input rules are too complicated (>= %d NFA states)found too many transitions in mkxtion()too many rules (> %d)!case YY_STATE_EOF(%s): multiple <> rules for start condition %s"%s", line %d: %s s4Vefss+fs;fJfYfpffssffg-hhoiyiisjOjjjkklmGmZmmmmn>nan ofoospq:qNqbqqqqr[s~ssyacc stack overflownegative range in character classiteration value must be positiveiteration value must be positivebad iteration valuestrailing context used twice of preceding '|' action %s: warning - trailing context rule at line %d made variable because trailing context used twicetrailing context used twice of preceding '|' action %s: warning - trailing context rule at line %d made variable because bad start condition listundeclared start condition %sundeclared start condition %sunrecognized rulewarning - all start conditions already have <> rules'^' operator results in sub-optimal performance'^' operator results in sub-optimal performancebad start condition listunknown error processing section 1INITIAL; YY_BREAK ECHOYY_FATAL_ERROR( "flex scanner jammed" )syntax erroruQ|vv ww@wJwTw{wwwwxu xvxxxxxxy-y^yyyyyzZz{zuz4{]{{u{{{ ||1|uA|{|||+}h}s}}}}}@~O~~~~~EU_}΀]yʁ7u !<FZy؃#_} /Mkم&Dl̆&JrUNNO}NNNNNNNNNNNNNNNNfatal flex scanner internal error--no action foundflex scanner jammedEOF encountered inside an action%s%s%s%s%s%s%s%s%s%s%s YY_BREAK %s%s%s%s%s%s%s%s YY_BREAK %s%s%s%smissing }bad name in {}'smissing }bad character inside {}'smissing quotebad start condition nameundefined {name}%s%%%% end of prolog %s%%%% end of prolog %sbad row in translation tableunrecognized %used/%unused constructunrecognized %used/%unused constructunrecognized %used/%unused constructincomplete name definitionillegal characterunrecognized '%' directivedynamic memory failure building %t tablewarning - %%used/%%unused have been deprecatedwarning - %%used/%%unused have been deprecatedread() in flex scanner failedfatal error - scanner input buffer overflowfatal flex scanner internal error--end of buffer missedflex scanner push-back overflowˏf%tunexpected last match in input()out of dynamic memory in yy_create_buffer()out of dynamic memory in yy_create_buffer()can't open %srsymbol table memory allocation failedname defined twicestart condition %s declared twice#define %s %d 0"$()*+,-./<>?[\]^{|}ޥ˥ "$()*+,-./<>?[\]^{|}u9OeǤ *Something Weird* - tok: %d val: %d End Marker<>[%d]%d\%.3o\%c'%s'%% %x%s%d premature EOFSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ3a rw v+WbM'arwk+KbA??? ??? ?? ??:??:?? ???? /% @"X bdiop ux  #+-0LhlEGtXbc[defgtinCoprsux(null)XbdiopuxL~hplw(EGX[#bcdefginFopsauxcannot print floating point cannot print floating point u@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ccl.c,v 2.5 90/06/27 23:48:13 vern Exp $ (LBL)@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/dfa.c,v 2.7 90/06/27 23:48:15 vern Exp $ (LBL)@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ecs.c,v 2.5 90/06/27 23:48:17 vern Exp $ (LBL)@(#) $Header: /home/horse/u0/vern/flex/RCS/gen.c,v 2.12 91/03/28 12:01:38 vern Exp $ (LBL)static const short int %s[%d] = { 0, static const long int %s[%d] = { 0, static const yy_state_type %s[%d] = { 0, static const %s %s[%d] = { 0, static const YY_CHAR %s[%d] = { 0, @(#) Copyright (c) 1990 The Regents of the University of California. All rights reserved. @(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)2.3@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.9 90/08/14 00:10:24 vern Exp $ (LBL)@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/nfa.c,v 2.6 90/06/27 23:48:29 vern Exp $ (LBL)@(#)yaccpar 1.9 (Berkeley) 02/21/93@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/parse.y,v 2.7 90/06/27 23:48:31 vern Exp $ (LBL)   .+)5*3  #$% 4,-/0(1'& ( !"),F#,5/3?>"OISKL )$-"$!>BH32ND2?J""!!""4!!5""!! %670<&+-:'/F*8CG;15IL"O!E@K333"!9MAA32=."!#"! " """](](](].}. . $$),"$"<$()/() ./ ./$$*+)),/^/ [[^[^?/>E-[}[ 3+}|||||{||  @(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)wwyC;<5CB3CCC21C4x/ww IxEFHJXYVUWKMLKQPQQSSSTchgiidddabx![Zkmloqrs__`____&#"&&,*-,,)))() ;<8uuu76721?2/.wwGHUvvvNORcfeddd!kjop___\___&#&&*+++*(  9:@uu77A?vvdd\\__&&'++  uvdd__&&+ dd__&&]^]^$% >     !"#$%&'( !"#$%&'()*+   +U~[ZYIBhl4(x_wd'/+qP {R-NSVOgZceQ`\OdLIhEMMMmFJG+5#H3/'s9=AEINUoON@9Q?0"7gLRZNKQ %2?LYfs '.:AMZgt~#/;AMS_flq}TTUUVVWWT XXT YYZZ[[\\]]T^^YY__``aaT%bb%%cdTTTTTeTTfgThTTTTTTTijTTTTTklmTnTooonpTTTTTTqTTTTTTTTTjTTrsTtjTuTTvTwwwTTxTTTyTTzTT{TT|}}T}~~~TTTTTTTTTTTTTeTTfTTTTTTThTTTTTiiTTTTTTklTmTnoooTpTTqTTTTTTuvTvTwwwxTyzT{T}}}T~~~TTTTTTTTTTTTTTTTTTiiTTooTTwwT~~TTTTTTTTi TooTww~~TTTTiiooww~~TTooww~~TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT./0//...1.............222222222222222222....3433.5.6.....7.......888888888888888888...:;::<=>>`S>a?U@ARSRRRSRRhbwij`[aB>CDCC<\=E]>>bU>?U@AUFdhxedfRij^eQfB>KKLKKKKKKKKKKKKKKKKKKKMMMMMMMMMMMMNMMMMOKKKTTUTTTTTTTTTVTTTTWTTTTXXXXXXXXXXXXXXXXXXTTT[zz}}P\{{]~~ON^kklkkmkkknkkkkokkkkkkkppppppppppppqpppprsktwMLKJIxHGFEDCBA.@=< ;&9876!"!!54  21                  -()((/+>*//////!"!!()((?&# ??????9999999999999GGGGGGGGGGGGGIIIIIIIIIIIIIQQQQQQQQQQQQQUUUUUUUUUUUUUZZZZZZZZZZZZZ_____________cccccccccccccggggggggggggguuuuuuuuuuuuuyyyyyyyyyyyyy|||||||||||||  Tv   v         YYPJ$JHH$%%%%%%%%%%%%%''TT'',,TT,,0TTT03TTT3T:TTT:-TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTEAbI AbeEe===HG # #!"nFi !"$n#$++++>>E+////i$3333+D''''RRR??CB'A@='%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%((((::::;9:CCCC87C(65(,,,,4:,2C,,61-+6666*6666666%6BB#BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB   .  ..      !!!!((((///////UUUUUUUUUUUUUVVVVVVVVVVVVVWWWWWWWWWWWWWXXXXXXXXXXXXXYYYYYYYYYYYYYZZZZZZZZZZZZZ[[[[[[[[[[[[[\\\\\\\\\\\\\]]]]]]]]]]]]]^^^^^^^^^^^^^_____________`````````````aaaaaaaaaaaaabbbbbbbbbbbbbcccccccccccccdddddddddddddeeeefffffffffffffgggggggggggghhhhiiiiiiiiiiijjjjjjjjjjjjkkkkkkkkkkkkklllllllllllmmmmmmmmmmmmmnnnnnnnnnnooooppppppppppppqqqqrrrrrrrrrrrrsssssssssssstttttttttttuuuuuuuvvvvvvvvvvvvww~wwxxxxxxxxxxxxxyy{yyuyyyyyyyzzrzzqzzzzzzz{{of{{{{]{{{{||W||||||||||}}P}}}}}}}ON}~~IG~~@?751- TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/sym.c,v 2.4 90/06/27 23:48:36 vern Exp $ (LBL)@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/tblcmp.c,v 2.5 90/06/27 23:48:38 vern Exp $ (LBL)@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/yylex.c,v 2.5 90/06/27 23:48:40 vern Exp $ (LBL)GMTGDT0k0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+L"}t}y UU_^UVW11}U9u F߃| jugYtUr YtURtUzt rR Y}Pt}ht}t u. Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvu =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF$ FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }D~y UVu CV€tu ,fNV~hu>5lP Yt.hXYFu NLNHF 9h*YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv9 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E (SU :t! EE E H*U uuuYYEy@Ut8huIYYE~" tuYuuYYE}y1]jMYEu uY1A!uEUMJUzUBUE_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^UVW5LYNj5hhEYh:Y}t.U:t&uYPuV jhdV WYPWV jh`V _^UVWu }tV€u4V9Vu>t FN~U9tUE_^ fUV< U9< wU< 9< vL 16VYt1'< rF5< &Y5< ^UVW}u1E}UUsL 1=8 u8jY=u1V!փ58 5< FE5@ OVU}9}r69v2W9UvUW~>}t E@ u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=@ <9}r79}u+UOJ}t E@ URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15@ t 9ur6E0tU U@ tU9ru NJEtU9Wu RWE_^UVux95 h^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډLF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U x[ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuFYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEиUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE(E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP*YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPFYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MUUas U EUhhYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6js UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }   KI|;u[u P1ۇ tPXPusage: fmt [-width] [files]... r al rG wV + b : unknown errorY @2VX?b$d6i6o-p?u6x?/ #%+-0*!L hl'EGXbcdQefgiQnwoprsux(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point H HSSSSBPh ((((( AAAAAABBBBBB Unknown errorp`T0  t`L8(|hT8$tdP<$C   I1$T$L@ su;SSSSu00 QRP4 PU VW} EP}~8W:-u0RYEhhxx YYjYM}uuhHXYYN9u~Dh4 YYEu4E YjfYuuYYuCYF1_^UVW}JxGGSXWfY= u4@4>u=4~ 4J14 t u 44U 94~C`J`xtt h`j ?YY u4`J`xtt h`VYY_^UVuj jVC ^UV58Nx < ^U=<t<uD YUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+D"}t}y UU_^UVW11}U9u F߃| jugYtUrJ YtURtUzt r Y}Ht}`t}xt uz Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv> =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h/YF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vvM >uNN FFSX_^UVW}Wu uL ƅ~9})׉U U 1_^UVWu }<^~y UVu CV€tu ,fNV~`u>5dYt.hYFu NLNHF 9hvYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E  U :t! EE E @vU uuu7YYEy@Ut8huYYE~" tu[YuuYYE}y1]jYEu u&Y1A!uEUMJUzUBUE_^UUUuuu 8 UVW5DYNj5|h`YhxY}t.U:t&uOYPuV jh\V W+YPWV jhXV _^ fUV, U9, wU, 9, vD 16VYt1', rF5, &Y5, ^UVW}u1E}UUsD 1=( u8jY=u1V!փ5( 5, FE50 OVU}9}r69v2W9UvUW~>}t E0 u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=0 <9}r79}u+UOJ}t E0 URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb150 t 9ur6E0tU U0 tU9ru NJEtU9Wu RWE_^UVux95 `^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډDF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U p[ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF Vu\YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEаUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVWj5 cYYDžyhu^YYhh1W: Ehu+YYU}u'uAYh6Y5 *Y%WY1>t} tF1_^UVh5 zYYƅyh<uYY? -3Ph3V Eh(ugYY VY1^U= 3rU25 uYY - =_s  :u= 3s 5 u QYY - =_s  :u= 3s 5 uYY - =_s  :u= 3s 5 uYY - =_s  :u= 3s 1UVWuYEu {YEuoYudYƋ UU5r u5 YYU    u 5 YYU    u5 YY    u5 YY    1_^Uu%Yu Y5 YhP%YUVu>tF+URuj ^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UUUuuu 0 UVu JxUʋFF Vuz YY^UVW5 $YNj5 h Yh Y}t.U:t&uYPuV jhXVp WYPWV^ jhTVN _^UU Uh uuR U=x uGh` h` }YZУx j5x j 1Px x .x t Bt v t jj5x j 5t Z}th` uYY` /Gk# UW}E Mr/u'uĉ fE_].UVWIE_^]NU$UUEPjj[ U$U UEPuYYEPj!j- U$UUEPjj U$U UEPuYYEPjj U$UUU UEPjj U$EPjj U$EPuRYY1ۅÉU$UUU UUUEPjj[ yEU$uYEU UUUUUEEPjj  U(VuU @t*ufYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj{ U$uYEUUU UEPjjD Uu hT$um U$EPuYYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE:uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U IEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UD i JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEd Y E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } >~y UVu CV€tu ,fNV~ u>5 0Yt.h0YFu N   ! " # LNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UV5U95wU595v 16VYt1'5rF55&Y55^UVW}u1E}UUs 1=5u8jY=u1V!փ5555FE55OVU}9}r69v2W9UvUW~>}t E5u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=5<9}r79}u+UOJ}t E5URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV8 uY_^U VWUUb155t 9ur6E0tU U5tU9ru NJEtU9Wu RWE_^UUas U EUh h YYjYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRaYY^UVWuU VVuYYDžt~~yVډ F_^U$UUU UUUEPj6j USE] ![]USE] ![]USE] ![]UVW}u M#UVW}u M)9r/r uu fE_^]t|KI|;u[u P'1ۇ tPXPformat: %s: %s format: formatting cyl %d, head %d failed: %s format: seeking to cyl %u, head %u (pos %ld) failed: %s #]format: too many bad sectors, floppy unusable format: short read at pos %ld format: bad sector at cyl %u, head %u, sector %u (pos %ld) format: seeking to cyl %u, head %u, sector %u (pos %ld) failed: %s format: seeking to cyl %u, head %u (pos %ld) failed: %s Cyl. %2u, Head %u Formatting a %uk diskette in a %uk drive format: making verify device failed: %s format: making format device failed: %s Usage: format [-v] [ []] format: %s: can't format strange type %d format: floppy partition %s can't be formatted format: no sizes need to be specified for non-auto floppy device %s format: can't format a %uk floppy in a %uk drive format: no size specified for auto floppy device %s format: %s is mounted on %s mkfsformat: %s: not a floppy device --unknown error/etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 -@bXobTdfifo]poufxo_ P#U+K-F0ZQL9h#l.WEGXCbCcdefginoCpCr1suCxC(null)cannot print floating point 5hh PTh P Ph P PTSSSS13B /tmp/tmp. ((((( AAAAAABBBBBB Unknown errort\P4  thTD4$tdXH4 xdX@$p\CP6  0DC1$T$LDsu;SSSSu QRPh PU,VWhhmYYƅuE 0hV YYjY Pj YZ1Pz Z1УDEPht YYtE 0hT YYjYju,YPVc U׋JxFFSXVYE=t}%u %u} t}}}uE 0h( YYjY U׋JxFFSXV_YE=%u %u} tD}u V] YJx hWYY}}닋Jx hj RYYVY1_^U=TD1i;TP;TD1Z)ƒD1uUV5Nx p^U=tuYUVW11}U9u F߃| jugYtUrR YtURtUzt r Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvz =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h[YF~uN NF 1}9<t,R@tBt 4}YGƒ~uFHFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E wU :t! EE E NU uuusYYEy@Ut8huYYE~" tucYuu/YYE}y1]jYEu u.Y1A!uEUMJUzUBUE_^UVWu1fϋV€t}u ~tu>FtVYU )uRv/ EVt tfVV}u1_^UU UhuuV UjjuE E`[kgUV`U9`wU`9`v0 16VYt1'`rF5`&Y5`^UVW}u1E}UUs0 1=\u8jlY=u1V!փ5\5`FE5dOVU}9}r69v2W9UvUW~>}t Edu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=d<9}r79}u+UOJ}t EdURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\ uY_^U VWUUb15dt 9ur6E0tU UdtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U41UVW544}׃}~9r }y 9vWYu_^UVWuU VVu! YYDžt~~yVډ0F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPjj= U$EPjj% U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu8 YYU UEPjjg ^U$UUUUU UEPjj; U$u YEUUU UEPjj Uu hT$u U$EPj j y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U|EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuRYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP6YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPRYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M.UUas U EUhdhvYYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UUUuuu < UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇ<tPXPCopyright (c) 1990 Bert Reuling Something unexpected has happened. - %s It furthers one to see the super guru. - %s /usr/lib/fortune.dat Some things better stay closed. - %s r/usr/lib/fortune.datC a0 r w +g b]  @Xbdiopux #+-0LhlEuG`XbcGd eufug`i n/oprsux(null)cannot print floating point lSSSSB+   Il l1$T$L0su;SSSSu QRP +P-UV1҉1}Ft^UuhT;YYj-YU}t } t} u1UVW=uh ;Y1uh:YY=th:YhP4Y8J8xLLSX h86Ylj=qtQuj^,YV>Yu08J8xLLSX h85YŃntNu11ۅÉ_^UVW}1=0|=8}G-0܉_^UVuh,9Y=h$9YhP3YM tL8J8xLLSX h85YSDYt 19us@FF8J8xLLSX h84YPYtɸ1^UVUU R+Yƅu h0YUU RjV9 ^UVWUDžtB _r?PJPxdd hPW5YYENu_^UUztErYPJPxdd/hPj/J5YYERTYUzu/PJPxdd/RhPj/4YYB5dY4Phd7YY'PhX7YY @ED} t hT7YU=t1P5p7YYy5p6YhtYU57Yth|6YhxYUVWu }u 9==ijP567 u$hh5*7 =u$zhh57 =t[54WuP5lh6u!h6Yhjh57 hY_^UEjP YYEuPu 6 U=u hY}tEjPYYEuu P6 EjP~YYU} uEEPu u5 U} uEEPu uh5 UVWu1u12-0= sF0ـ>u1_^UVWE0E2Yt E1tu h4YY1_^UP(Ph4YYjPEPYYtEP%Y%f(5<h4YYjPEPzYYtEP%Y<,PhP4YYjPEPFYYtEP|%Yf,.Ph4YYjPEPYYtEPG%Yf.0Php3YYjPEPYYtEP%Y%f02Ph\3YYjPEPYYtEP$Yf254hHy3YYjPEPoYYtEP$Y4h@%YtjDh(h $h$YQ=tj$YUjDh(h =t8=u hdkY8=h$t hDRY( h8-YYh2-Y멉+U U׉+M  ˁfr_^Uuo!YU,PYx.SY,SvY|.ScY,SPYU5xY5tY5|hY5\Y5PYUVWu } 1PEBEЙu7E8t/=t=uh YtEPE8tHtuuuh+ #utuuh+ E=_^UVW} uEEiEEuhT<+YYuuu  9tEPEPuuPPEM}Ń=t =t}u hL*Y}} ~uh8*YY}t h$xYtuuu }~ h z*Y_^UfEh_*YU x]QPٺY,.iUJjEPR UtUEPht)YYhlYt5,.iUJj@hR UBfU(M9 Uhhn)YU(BjR'YYU@V=tth5)Yt,.iUJj@EPR UUˆUPEPEPh(hYU%fEu@h!YfEUxM !ˁf,.iUJj@EPR ^UfE(M93Ut+U:t EPYUBfU뾃=tu h'YU5,YUM Ut/PJPxddr=hPjrW$YY-PJPxdd-hPj-($YYM Ut/PJPxddw=hPjw#YY-PJPxdd-hPj-#YYUMt8PJPxUdd~hPu#YYjM Ut/PJPxddx=hPjx@#YY-PJPxdd-hPj-#YYUVu =th\%YEPhT%YY2PJPxdd-%hPj-"YYPJPxdddhPjdo"YYPJPxddchPjc:"YYPJPxddbhPjb"YYsPJPxddpThPjp!YYDPJPxdd?%hPj?!YY1jshjPjshjPjthjPFPhLM$YY=FSFSh@"$ &vh8$YY O1jjYY^UVW}| ˁfhYt%HjjWT$ 1_^UVWuME E Dž} _s \tF\FR\FbFfFnFrFtF롉0F0F!0Fs30_^UuWhp Yjj=YYU|M ˁfu dYt1>M~F ? @ A B C D E U|M ˁfU J,.iUJj@u R _^Uuh YYjjlYYu hYY4hY4hY'h|YhoY E(uhRYYUVW0M)ѿϋU ֋B09Ur <9Uruu uh( -1 !QPٺYtHֹ! ˁfuu uh 1q  !QPٺYtuu uh xֹ! ˁf_^UVW2UihPV~ UJRhPuu EPu1Ot EU R9r_^UVW}2օtOu_^UVu}uJU  @uu6u EPu102uuVu EP^UVW19umU<uu?Y]NEU0u4\ uuY]1"Uu4uu EPu1F늉_^UVWEU jjREPu EPME }(U WjPEPu EP!EFGӋE_^UVWUM ˁfu EPRYYNjBuhH YjjMYY1Buh8 zYjj)YY1_^UVWU Burh ?YYjjYY1 }1U <t"U 4hX YYjjYY1Fʉ_^UVu VEPlYYVEPYYVEP-~~5h E PdYYEh E POYYEh E P:YY넃5x5l5`V5lh  GF4 \WuuVEE1E }uht YjY1_^UVWu1E%tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5(Nx ^U=,t,u4YUVU9wU9v4 16VYt1'rF5&Y5^UVW}u1E}UUs4 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV$ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjo y U1UVW5}׃}~9r }y 9vWYu_^UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf E_^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^UVWuU VVuYYDžt~~yVډ4F_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvI =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hsYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },f7~y UVu CV€tu ,fNV~Pu>5T$Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvx =tN V@FF t V 9ډUVVFt$jjv  =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVW54YNj5lhP9Yhh.Y}t.U:t&uoYPuV jh V WKYPWV jh V _^UU UhPuu 3K3[USE] ![]USE] ![]USE] ![]UVW}u M UW}E Mr/u'uĉ fE_] UVux95 ^U$UUEPjj U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu( YYU UEPjj; ^U$UUUUU UEPjj U$EPj$j Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0 { }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEH uVuukƀ}Xu9utUPWYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuZYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEpUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP>YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPZYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhhhvYYjrYUVuYƋU rU MJwU uRQYY^U$UUU UUUEPj6j UUUuuu UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s fatal yes %s? --> out of memoryn-G (ino = %u) (ino = %u, closeContinuing with a zero-filled block. writeread%s: can't %s block %ld (error = 0x%x) internal error (devwrite)warning: no %s numbers given Do you want to try againok nowmaxsize = %ldlog_zone_size = %ufirstdatazone = %uzmap_blocks = %uimap_blocks = %unzones = %ldninodes = %umax. file size <= 0zone size < block sizefirst data zone too smallno zmapno imapno zonesno inodesbad magic number in super blockCannot handle V1 file systemsinstead of %ld warning: expected max size to be %ld instead of %u warning: expected first data zone to be %d first data zone too smallwarning: large log_zone_size (%d) log_zone_size too largefirst data zone too large instead of %d swarning: expected %d zmap_block%stoo few zmap blocks instead of %d swarning: expected %d imap_block%stoo few imap blocksbad magic number in super blockDo you want to change it againWrite this back size = %6ld nlinks = %6u mode = %6oinode %u: out of range (ignored) zone number %ld inode number %ld %s %ld is not free %s %ld is missing stop this listing install a new map%d errors found. etc. Checking %s map . clearmode inode %u not clearedChecking inode list internal error (counterror) adjust%5u %5u %5uINODE NLINK COUNT I @{`F  `%7ld %2x,%2x %3u %6u inode permission link size name . remove entry    \%s is linked to %u) warning: %s has offset %ld in . repairinstead of %u)%s is linked to %u bad %s in ')entry = 'found a '/' in entry of directory null name found in ', dir ino = %u)name = 'link to directory discovered in ...' in directory discovered at entry 'too many links to ino %u . remove entry')name = 'ino found = %u, bad inode found in directory . extendsize not updated of directory  , pos = %ld) VERY INDIRECTDOUBLE INDIRECTSINGLE INDIRECTDATAzno = %ld, type = %s zone in foundduplicateout-of-range.. missing in . missing in nonzero zone number %ld for special file illegal device number %ld for special file %% %@]%`u%E%mode = %o)bad mode of cnt = %u) link count too big in link count zero of (ino = %u, mode = %o) root inode is not a directory removefound inode %u: bad root inodes%6ld Free zone%s s%6u Symbolic link%s s%6u Named pipe%s s%6u Free inode%s s%6u Bad inode%s s%6u Character special file%s s%6u Block special file%s iesy%6u Director%s s%6u Regular file%s zonesize = %5d blocksize = %5d ----- FILE SYSTEM HAS BEEN MODIFIED ----- inodezone,a,c,i,l,r,s,z,Usage: fsck [-acilrsz] file %s: unknown flag '%s' zoneinodeinodeFsck was compiled with the wrong BITSHIFT! 2N2h$t2$h2a2 : unknown error? q?@?@X@b@d@i@o@p@u@x@A A#A+A-A0ADL}BhgBlrBBE1DGDXCbCcDdCe1Df1DgDiCnBoCpCruDsACuCxC(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point $Answer questions with y or n. Then hit RETURN ((((( AAAAAABBBBBB SSSSB8PhlUnknown errorxlP<( p`P@,tdP4  t\@,xC  Ih `1$T$L(su;SSSSu QRP+P-UV1҉1}Fl^Uuhh;YYj0-YU}t } t} u1UVW=uh $;Y1uh;YY=th:YhH4Y0J0xDDSX h016Ylj=qtQujr,YV>Yu00J0xDDSX h05YŃntNu11ۅÉ_^UVW}1=0|=8}G-0܉_^UVuh,:Y=h$9YhH3YM tL0J0xDDSX h0$5YSDYt 19us@FF0J0xDDSX h04YPYtɸ1^UVUU R+Yƅu h0YUU RjV9 ^UVWUDžtB _r?HJHx\\ hHW5YYENu_^UUztErYHJHx\\/hHj/^5YYERTYUzu/HJHx\\/RhHj/5YYB5dY4Phd7YY'PhX7YY @ED} t hT7YU=t1P5h7YYy5h6YhtYU57Yth|6YhxYUVWu }u 9==ijP5J7 u$hh5>7 =u$zhh5*7 =t[5,WuP5dh6u!h6YhjhI7 hY_^UEjP YYEuPu 6 U=u hY}tEjPYYEuu P6 EjP~YYU} uEEPu u5 UVufEu1E-0= s$FUM0fM̀>uE1%^UVWE0E2Yt E1tu h4YY1_^UP Ph4YYjPEPYYtEP&Y%f "Ph4YYjPEPYYtEP%Y%f"$Phf4YYjPEPHYYtEP%Yf$&Ph14YYjPEPYYtEP]%Yf&(Php3YYjPEPYYtEP(%Y%f(*Ph\3YYjPEPYYtEP$Yf*5,hH3YYjPEPqYYtEP$Y,h@'YtjDh h $h$YI=tj$YUjDh h =t 0=h$u hdmY0=t hDTY  h8;Y" h,$Y$ h$Y& hY(= hY*y hY=,u hYUVW R'Y0=t h Y$9} hiY$9t,hhVh$Ph1YY"P 'Y&9} h Y&9t,h|hVh&PhlN1YY" (9| hPY*%= r h8Y*=~*Ph0YY $&*ڃ*(9} hY(9t!Vhz0YY(Phf0YYJ*1=r*9=,tWh0YY5,h0YY_^UxVW}܃}EE0FYfEfUtM ˁffUfU$&iUJj WR EPh]/YYPhM/YYjPEP/YYtEPY%fG Php/YYjPEPYYtEPE YG wh\.YYjPEPYYt EP YGhLYt6$&iUJj WRZ h,>Y_^UVhuYYf^UVWu19}~"iE hVP GE ًU f _^UVWu19}~"iE hVP GE _^UV}EE0 YfEU M9| UM9|<t9UuEPhe-YYEPhR-YYhF-YU M)AMU ])CPٺY ʁfP^Uuz!YU$PyYp&SfYx$SSYt&S@Y|$S-YU5pY5xtY5thY5|\Y5PYUVWu } 1PEBEЙu7E8t/=t=uhYtETE8tLtuEPuh+ %utEPuh+ UBfU-_^UVW} uEEiEEuhP7+YYuuu 9t EPEPuEPPPUfUM}=t =t}u hH*Y}} ~uh4*YY}t h PYtuuu }~ hf*Y_^UfEhK*YU p]QPٺY$&iUJjEPR UtUEPhp)YYhhYt5$&iUJj hR_ UBfU M9"hdb)YU BjRYYU V=lth))Yl$&iUJj EPR U]ÈUMPQEPh(hhYtSU Mu h Y$&iUJj EPR ^UfE M9+U:t EPYUBfUƃ=lu h'YU5eYUM Ut/HJHx\\r=hHjr$YY-HJHx\\-hHj-a$YYM Ut/HJHx\\w=hHjw&$YY-HJHx\\-hHj-#YYUMt8HJHxU\\~hHu#YYjM Ut/HJHx\\x=hHjxy#YY-HJHx\\-hHj-J#YYUVu =thX2&YEPhP"&YY2HJHx\\-%hHj-"YYHJHx\\dhHjd"YYHJHx\\chHjcs"YYHJHx\\bhHjb>"YYsHJHx\\pThHjp "YYDHJHx\\?%hHj?!YY,2jshjPjshjPjthjPF PhH$YY;F^QSh<]$ &vh4K$YY1jjYY^UVW}t ˁfh|Yt%HjjW$ 1_^UVWuME E Dž} _s \tF\FR\FbFfFnFrFtF롉0F0F!0Fsn0_^UuWhl YjjdYYUtM ˁfu dYt1>M~F-~~5h E PGYYEh E P2YYEh E PYY넃5x5l5`V5dh  GF, ]WuuVEE1E }uhl YjY1_^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5 Nx ^U=$t$u4YUVU9wU9v, 16VYt1'rF5&Y5^UVW}u1E}UUs, 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV$ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjo y U1UVW5}׃}~9r }y 9vWYu_^UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf E_^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^UVWuU VVuYYDžt~~yVډ,F_^UVWuEu41}%uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }$z7~y UVu CV€tu ,fNV~Hu>5L$Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvx =tN V@FF t V 9ډUVVFt$jjv  =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVW5,YNj5dhH9Yh`.Y}t.U:t&uoYPuV jh V WKYPWV jh V _^UU UhHuu 3K3[USE] ![]USE] ![]USE] ![]UVW}u M UW}E Mr/u'uĉ fE_] UVux95 ^U$UUEPjj U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu( YYU UEPjj; ^U$UUUUU UEPjj U$EPj$j Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U ( { }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE@ uVuukƀ}Xu9utUPWYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuZYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEhUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP>YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPZYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhh`vYYjrYUVuYƋU rU MJwU uRQYY^U$UUU UUUEPj6j UUUuuu UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s fatal yes %s? --> out of memoryn-G (ino = %u) (ino = %u, closeContinuing with a zero-filled block. writeread%s: can't %s block %ld (error = 0x%x) internal error (devwrite)warning: no %s numbers given Do you want to try againok nowmaxsize = %lulog_zone_size = %ufirstdatazone = %uzmap_blocks = %uimap_blocks = %unzones = %uninodes = %umax. file size <= 0zone size < block sizefirst data zone too smallno zmapno imapno zonesno inodesbad magic number in super blockCannot handle V2 file systemsinstead of %ld warning: expected max size to be %ld instead of %u warning: expected first data zone to be %d first data zone too smallwarning: large log_zone_size (%d) log_zone_size too largefirst data zone too large instead of %d swarning: expected %d zmap_block%stoo few zmap blocks instead of %d swarning: expected %d imap_block%stoo few imap blocksbad magic number in super blockDo you want to change it againWrite this back size = %6ld nlinks = %6u mode = %06oinode %u: out of range (ignored) zone number %u inode number %u %s %u is not free %s %u is missing stop this listing install a new map%d errors found. etc. Checking %s map . clearmode inode %u not clearedChecking inode list internal error (counterror) adjust%5u %5u %5uINODE NLINK COUNT $ @V`! `%7ld %2x,%2x %3u %6u inode permission link size name . remove entry    \%s is linked to %u) warning: %s has offset %ld in . repairinstead of %u)%s is linked to %u bad %s in ')entry = 'found a '/' in entry of directory null name found in ', dir ino = %u)name = 'link to directory discovered in ...' in directory discovered at entry 'too many links to ino %u . remove entry')name = 'ino found = %u, bad inode found in directory . extendsize not updated of directory d q ~ , pos = %ld) VERY INDIRECTDOUBLE INDIRECTSINGLE INDIRECTDATAzno = %u, type = %s zone in foundduplicateout-of-range.. missing in . missing in nonzero zone number %u for special file illegal device number %u for special file %% %@o%`%W%mode = %o)bad mode of cnt = %u) link count too big in link count zero of (ino = %u, mode = %o) root inode is not a directory removefound inode %u: bad root inodes%6u Free zone%s s%6u Symbolic link%s s%6u Named pipe%s s%6u Free inode%s s%6u Bad inode%s s%6u Character special file%s s%6u Block special file%s iesy%6u Director%s s%6u Regular file%s zonesize = %5d blocksize = %5d ----- FILE SYSTEM HAS BEEN MODIFIED ----- inodezone-a,c,i,l,r,s-z,Usage: fsck1 [-acilrsz] file %s: unknown flag '%s' zoneinodeinodeFsck was compiled with the wrong BITSHIFT! 2b2h$2$h2u2 : unknown error? ?@?@X@b@d@i@o@p@u@x@A A#A+A-A0ADLBh{BlBBEEDG0DXCbCcDdCeEDfEDg0DiCnBoCpCrDsUCuCxC(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point Answer questions with y or n. Then hit RETURN ((((( AAAAAABBBBBB SSSSB0H``Unknown errorpdH4 |hXH8$xl\H,xlT8$pC  P}$"[<1$T$L4 $"su;SSSSu QRPwP*UVW1 }DwGuuUYZ‰N9ut> t> t tNߋu@w=@w c>ttF>tJ@wA @w4Dw>t$u=@wu P-YF׀>tF_^Uu_RYhT LYh< uu wN uh2RYj)Yjj u TYYZ= t> t tNhlwh sQYYhT KY}tEjhlwEPMT E jEPhlw&T E=ow-8EP'Yǁ}1}t@1ہtC_^U= wuh<PY=$wuh$PY1UU :tu uhl5wOuhd5wO 5wJYjU hIPYhp>PYhD3PYh(PYhPYhPYhPYhhOYh<OYhOYhOYhOYh|OYhLOYh OYhOYhOYhpOYh@OYhxOYhmOYhbOYhtWOYj EPhX h$9OYh.OYh#OYhOYhx OYhLOYhNYhNYhNYhNYh@NYhNYhNYhNYhhNYh<NYhNYh~NYhsNYhthNY1UVW!1}~ZU rh h$"[N h$"Ymǃ= dVh YY^UVt185Hw=@w}hhdh dVh YY^UV=@w}+= wuh $CY1Xh h hYYE"t185Hw=@w}hhdh r dVh !YY^UVWt1HwU=@w}EP =@w}L =Lw?uhhAWUD ƅy58 YPWh$ @B 1%Vjuh E~VCYE_^UVWt1HwU=@w}E =@w} =Lw?uhhAWC ƅy58 YPWh\ A 1%VjuhT E~VCYE_^UVWjt1=Hw=@w}hhdh d=@w}5LwhhAVB Ey58 =YPVh @ 1"ujWh \EucBYE_^U$VWt1HwU=@w}hhdh4 Ed=@w}}=LwjW7BYYƅy"58 YPWh #@ 1=(wu+EPVYYt+Wh ?YYVAY1jjjVA Euh EP? EPh YYE=^t VUAYE Vjuh *EV3AYE_^U0VWt1HwU=@w}hhdh EdEP?YhhAEPA ƅy%58 ZYPEPh> 1#Vjuhs V}@YhEP<YYEEP@Y}uh>Y1uhhd: jhdhd=AY-ZY hdhl>>YYhT 8YhhAhd@ ƅyhdhL>YYwVjhdhD V?YQu7Y EP?Y_^UVWt15Hw=@w}hhdh d=@w}u LwUjVO?YYDžy58 YPVh;= 1 Wjuh EW>YE_^UVWt15Hw=@w}hhdhPk d=@w}u LwUjV>YYDžy58 YPVh(< 1 Wjuh  EW>YE_^U(VWqt1QHwU=@w}hhdh Ed=@w}UU LwUuhLYYƁthpwYEju=YYDžy$58 YPuh; 1=(wuuWYYEjuW]= EU9Utuht^;YYW =Y1WuhpEPd; EPhhYYƁ^t W<YWjuh` W<Y_^UVWt15Hw=@w}hhdhQ d=@w}u LwUjV<YYDžy58 YPVht: 1 WjuhEW<YE_^UVWWt1HwU=@w}hhdht EdjuYYEhpu7YYƅuhP9Y1Vhhd5 jhdhd<Y-ZY hdh<9YYhT 4Yjhd_;YYDžyhdhT9YYWjhdhEW:Y}\V3Yu<;YE_^UVW1h h$u: E~$$Eu9}vϊG< uF}u E 01_^UVW19u v0jh$u: Džyt F=$ uFˉ_^U w$w(w,w0w4w8wj9Y,Y5w2,Y5j3Y<t(5w,Y5w,Y5j3Y1  w_^U= wuh 1Y1:5w+Y5w+Y5js3Y w$w1U= wthHhLYYEEh<q1YjYUUlVWjUfEh$YE܅uEju3YYE؅yh0Y=8w]hhEYYƁtu2Ylw?t?(tGGEE}}=W|YU‰Uj,W3YYDžuh~0YDGEW?Y%fEj,W2YYDžuhC0Y GW Y%UfU΋UЉl{ l{ ًl{ ʋ l{ щMfUfp{p{ p{ فfME=8wu5ffp{p{ p{ ف|M0vffp{p{ p{ Af p{p{ p{ فf M ffUUЉUfUfUEPh0n@u0 ƅy(=8 : h.YuJ0Y_EPh1nuI0 ƅyhl-Yu0Y*fUf=8wuEEPh2n@u/ ƅyhL-Yu/Y1EPh1nu/ ƅUh(Q-Yu/Y1EEP/Yyh!-Yv\/ky-h-Yu8/Yu//Yu&/Y;=kou /Yh&"j@YYj.Yu.YEPh3n@u. j.Yy=8 u j|YjrYjhYu.YjEPu. u.Yh&"jYYjZ.YEPh1nup. j<.Yuǃ=8wffp{p{ p{ ffp{p{p{ jl{l{%P$ ȋl{ ‹ l{ сjl{l{%PÇ$ ؋l{ ‹l{ Ӂjl{l{%P$ ȋl{ ‹ l{ jl{l{%PÇ$ ؋l{ ‹l{ PPhEP* EPhYYƁtuI,Yj 5kc,YYOu uYYƃ}t  =8wEPt,Yƅx95kuy*h)Yu+Yj 5k+YYUt"uh)YYu+YUʉMuh)Y}tDuhh)YYuR+YduuYYuunYY TERu+Ye!=8wuj 5k+YYu*Y_^UVuj jV ^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5 Nx t{^U= t u*YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVu~  u8 6EP.!YEU UEPEPV yE^UVux95 "0!^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+8 "}t}y UU_^U VW}PEyt 1}uE VYFuP=( 2h hH j&YEPYE9Et}u}uEu}u EEE_^UUAs UEU8VWEU UUUUfRfp{p{ p{ ىM؋UfRfp{p{ p{ ىME$mEu }}`uuVuuGDžy{1W΋Ulu&YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt { {1+ElEllEkElkEM9uuuVuu7DžV- YEV YEV Yǃ}u@ց} msUEEu%YljUUU)U]}tE} u?uuVuuDžy +֋Ull}u}t }t&9=lt U9UtQ=lUŨ}u1l}u Uluu$YZЉEE1UU%qs-UEȉEWVR# UUE;}tEEl {1_^UVW}-0= >N>.WY(q=u{1=llllllk(qklklX-0= r>.uF\hPjjWB y1jPi _^UVW}}t1PGPGPGPhXP hPj jPEy1HjuP ƅu1*UVU V k(qk(q_^UVW5{%Y&DžD7u"YYtw>t6u!YYt} tu w !YYu={u%_^UVuEPVYYtE8 ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU tEcF} tF=l{ l{ ًl{ ʋ l{ ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UE}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!C+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UJB>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW|u =u hPjjjuu ujB$$ƅ{uuVPƅy{}Gu^fWfp{p{ p{ uL0{7{+{{Wa@_^UVWE|um=u N8 {uE>t >.uEF}u)uYƅtuuuu V_}u |€u$}N>.| }?quuuu 7uE~=8 ;u{l={uE={t ={u|t놃}t"uuuu ju%E~}t {_^UVW}} uBWXY-Ɖ:.u#sVWP Ƅ5*"u hWhhP=uuuu_^UVWh YEthuYYEu1EuhP >tuF>nuP. YYuFu>tDG?tuG1҈+rhVh,q! u Y,q u Y1_^U@VWEEEUUЋUUE=|u%=u |u } ~1EUffUE|9UYE|9U;}Dž|U=0 y2UMEPU|P4 |w 0 =#U fp{p{ p{ فfMjEP50  =t$8 U50 =Y0 ^u u50  9E t$8 U50 Y0 }fEU܅t2EPW50  ƅ~U)fUU܅tB8 U50 Y0 }<}EM}ffp{p{ p{ ىM9M}#UfUDž #UfUU܅t2EPW50 < ƅ~U)fUU܅t$8 U50 Y0 UJÜJU+UfUU܅VU܁vE܉VP50  ƅU)fU멃=0 y0 y8 U'UMU|P4 |u u50 (9E M{Uԃ}~ Eԙ=|Eԃ}Euuu50 E=u=8 EEUM9u| u+UBt"50 'Y0 E}t|t}u |u50 Y0 EaEE=0 x50 Y0 }u}u 8 ;8 = Uȉ8 _^U=0 t50 SY0 U$VWh$YDžujW`YYƃu8 EE1UUfU fUEPh0n@V E=u8 EVYGEEPh2n@V E=u8 EVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh<YDžu0jW@YYƃuEE73EPh@n@V E=u 8 UVYU8 _^UVWUR|Yƅu8 wUWfUfW fG #UfWuu FP URVu E8 UVY}r UUU8 E_^UhEGj0YYj YUVWURYDžu8 hEGjYYEu YEURWu Ƌ8 Uxw7~1W_YjE YujYYu0 YU8 @RGPu WYj YujHYYu Y_^UVWEEPXYNjE E PFY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^UVW1}y11< t,|1Fρ(1E E Hb3U :tE E h@3jt YEu1EttEUMJUzUBU E_^U$UUEPjj_ ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u s8 KVHYE=u8 &UEUUU}׋U UE8t=+UEEE0" YE܋]P3Wm }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGu YEuUUȋUUEEEPj;jb R Y_^U$EPjj5 U$UUU UUUEUEPjGj U} v8 M E 1U} v8 M ҋE!1UE1UE1U} v8 M Et1U$EPjj5 y}tUEEUVW11}U9 u  F߃| jugYtUrFYtURtUzt rV Y}< t}T t}l t u2 Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv1 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv; EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h{YF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF,rFF VVv vv >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E +U :t! EE E *U uuu3YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu uvY1A!uEUMJUzUBU E_^UUUuuu  UVW58 YNj5p hT Yhl Y}t.U:t&u+YPuVL jhV< WYPWV* jhV _^UU UhT uu UUURu huUUURuu uU= uGh h aYZУ j5 j =P#  .  B v  jj5 j 5 G#Z}th uYY UEEUUUUU JUEPuu EUJUx ]E EPj< YYEUuu huC[w/_k{UVW}u M""UW}0))ϊE tu1_]XG_]"UVW"E_^]"L$ {"UVWM"E_^]UVDrU9DrwUDr9Drv8 16V Yt1'DrrF5Dr&Y5Dr^UVW}u1E}UUs8 1=@ru8j Y=u1V!փ5@r5DrFE5HrOVU}9}r69v2W9UvUW~>}t EHru6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=Hr<9}r79}u+UOJ}t EHrURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Hrt 9ur6E0tU UHrtU9ru NJEtU9Wu RWE_^UUas U EU="uhhmYY" 5" YU {U="t5">Y"{UVW="u!h@hDYY"u1D5"hhLr0 Eu1U:#th<u YYƅtUPvh8uYYEtEU: t: uEh4uYYƅjFuGY%fp{p{ p{ ى Xv5\v`vTvh0VWYYƅtFt8>t3> t> uFvs7h,VYYƅtFPv_^UVW}Utu >t]9uFG1_^U VWDžDž{||| |jhYYu{g#JfhYƅthVh | hphtYYE(uhP jhhP} _u> t> uF>t> thVh |L j h |YYƅtDždjh`P 9> t> uF>> hVh | j h |$YYƅt | }7E>t38}s+> t> u E}t 7EFȀ>t > t> tFDžoj hTP Q=|D> t> uF>(> | |PVYY|ff U||uxY=|u" |ff||= |u=hPYYu&j.PYYƅtFPh |YY] } | |E>t >.uEF |}|,}sj.VDYYF7M |1_^Ut3FuF>t>/uEu2YyUȋU8 1^UVW}t} w8 1?Uu NEPhYYy1EEPuYYyV9Y1E]9uUM9u/YDžuVY1E]9u1EfEWVYEu=+W6YW&Y8 VY1_EEUhR YYtUhRYYuP[UM9uMhvPYYURyPYYEPvPOYYy E&UM9E]9uUREPu yW+Y8 "VY1dW YuYy VY1EuEPEP~VeYy1>uN/9us VuYYE_^U$EPjj U$UUU UUUEPj6j U$EPuVYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjjs yEU$u>YEU UUUEPj'j0 U(VuU @t*uYEU UV֋RUUUEPu,YYU UEPjj ^U0VWEPuYYy1U؁@t8 1huKYYDžy1EPW~YYxS8 U؁@u7jWYYEx& PjW xh$Yƅu8 UWzYUЉ8 1FfFF_^U$EPj*j yUEUMJ1U$UUUUU UEPjjk UVWuu8 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^Uju7YYU$EPuYYEPj(j? UHVuUVUVUV UVUЋU UEPY^UVuEP[YjEPj% Vwv5whvjKj ^U$uYEUUU UEPjj| Uu hT$uY UV& T$@, T$@% T$@8 E cuVu ^U$EPuJYYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U +}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEfuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Udu EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } O~y UVu CV€tu ,fNV~T u>5X Yt.hTYFu NLNHF 9h&YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvw =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UhLhl YYj&YU VjhlYYƅyHu uV~ EV"Y}u"U JUj uYYEt1^UVuu8 TfFV V#U UU +UVjvPH =uU 9Vs V]Yu1^UVuYƋU rU MJwU uRIYY^U}u8 UEuYuYU(VuEEV֋RUV֋RU E ;UUU UEPj7j ^U$UUU UEPjj U$} uEEUUE UEPjJj y}tUEEUVWu1fϋV€t}u ~tu>FtVYU )uRvs EVt tfVV}u1_^É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ"tPXP%s End of file on input! %s You must login first. You must "OPEN" a connection first. %s %s %s user Enter remote user information system Get remote system type information status Get connection/file status information size Get file size information site Send a site specific command rmdir Remove directory on remote host rm Remove file on remote host reput Restart a partial file send to remote host remotehelp Display ftp commands implemented on remote host reget Restart a partial file retrieve from remote host quote Send raw ftp command to remote host quit Close connection and exit pwd Display current directory on remote host putu Send a file to remote host(unique) put Send a file to remote host passive Toggle passive mode pass Enter remote user password open Open connection to remote host noop Send the ftp NOOP command mput Send multiple files to remote host Press ENTER to continue... mod Get file modification time mkdir Create directory on remote host mget Retrieve multiple files from remote host ls Display remote host directory listing lrmdir Remove directory on local host lpwd Display current directory on local host lmkdir Create directory on local host lls Display local host directory listing ldir Display long form local host directory listing lcd Change directory on local host help Display this text get Retrieve a file from remote host exit Close connection and exit dir Display long form remote host directory listing del Remove file on remote host close Close connection cd Change directory on remote host bye Close connection and exit binary Set file transfer mode to binary ascii Set file transfer mode to ascii append Append a file to remote host ! Escape to a shell Command: Description usersystemstatussizesitermdirrmreputremotehelpregetquotequitpwdputuputpassivepassopennoopmputmodmkdirmgetlslrmdirlpwdlmkdirllsldirlcdhelpgetexitdirdelclosecdbyebinbinaryasciiappend!Command "%s" not recognized. ftp>useropen %s Current local directory: %s Could not determine local directory. %s Could not change local directory. %s Path: Directory created. Could not make directory %s. %s Directory: Directory removed. Could not remove directory %s. %s Directory: ..$SHELLrm %smore %sls %s > %sls -l %s > %sls %s > %sls -l %s > %s %8lu bytesSent %8lu bytesSent %8lu bytesReceived %8lu bytesReceived ATYPEITYPEXPWDPWDXCWDXCUP..CWDCDUP..Path: XMKDMKDDirectory: XRMDRMDDirectory: DELEFile: MDTMFile: SIZEFile: STATFile: STATYou must "OPEN" a connection first. LISTCould not open local file %s. Error %s NLSTCould not open local file %s. Error %s RETRCould not open local file %s. Error %s Remote File: RETRREST%luCould not determine ascii file size of %s Could not open local file %s. Error %s Remote File: RETRUnable to open local file %s Retrieving file: %s Unable to open file listing. rNLSTCould not open local file %s. Error %s Files: APPECould not open local file %s. Error %s Local File: STORCould not open local file %s. Error %s Local File: STORREST%luCould not set file start of %s Could not open local file %s. Error %s SIZELocal File: STOUCould not open local file %s. Error %s Local File: STORUnable to open local file %s Sending file: %s Unable to open listing file. rFiles: PASS Password: You must "OPEN" a connection first. passwordUSERUsername: You must "OPEN" a connection first. NOOPOFFONPassive mode is now %s SYSTHELPYou must "OPEN" a connection first. SITE ftp: Could not get tcp configurationftp: Could not open tcp_device/dev/tcpTCP_DEVICEwrftp: ioctl error on NWIOGTCPCONFftp: ioctl error on NWIOTCPCONNftp: ioctl error on NWIOSTCPCONFftp: open error on tcp device/dev/tcpTCP_DEVICE127.0.0.1Unresolved host %s ftp: Could not find ftp tcp service tcpftpHost: Use "CLOSE" to close the connection first. You can't close a connection that isn't open. FTP done. QUIT(*) *Child listener returned %02x Child listener timed out Child listener failed %04x wait error:PORT%u,%u,%u,%u,%u,%uftp: could not fork listenerftp: could not create a pipeftp: error on ioctl NWIOGTCPCONFftp: error on ioctl NWIOTCPCONNftp: ioctl error on NWIOGTCPCONFftp: ioctl error on NWIOSTCPCONFCould not parse PASV reply Could not parse PASV reply PASVftp: open error on tcp device/dev/tcpTCP_DEVICEunknown error-csh/bin/shcd .%u.%u.%u.%u.in-addr.arpaa6a65 6+676h7999o::v:D<8<D<,< <D<D<%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEtIafIr^IwlII+IbIQaQrQwQR+QbQ : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesnameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainb`IbfeefCfQf../......Cl.l5ltG9uF>uր?=uэG1_^UVux95 ^UVuFPFPFPPhh, , ^UVW=@aU9<} <M :-u<zu <M hD4YYu<<M @ǣ :tWuKYYƅ}=8t=E ht0YYhth,YYhtWyYYhtj kYY<M @@:u<@? F>:<M @C;t!A <M @C\ <U9<|W=8t=E ht0YYhthYYhtWYYhtj YY@?`<A <M \ @7<M @@:u@<\ _^UUUuuu  UVu JxUʋFF Vu YY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UU Uh\uu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj YYEUuu huUW}0))ϊE tu1_]XG_]* UVWE E_^]U$UUEPjj_ U$UUU UUUEPj6j3 U(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U /}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEjuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UyEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U0JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEP E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u, ƅ~9})׉U U 1_^UVWu },~y UVu CV€tu ,fNV~\u>5` Yt.h YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UVD U9D wUD 9D v4 16VYt1'D rF5D &Y5D ^UVW}u1E}UUs4 1=@ u8jY=u1V!փ5@ 5D FE5H OVU}9}r69v2W9UvUW~>}t EH u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=H <9}r79}u+UOJ}t EH URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^U VWUUb15H t 9ur6E0tU UH tU9ru NJEtU9Wu RWE_^UUas U EUhht:YYj"YU$ 9Ut*UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVu YƋU rU MJwU uRmYY^UVWuU VVuYYDžt~~yVډ4F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u U$UUUUU UEPjj' UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u M#UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ tPXP?Iaio%s: unable to NWIOGIPxROUTE: %s %s: unable to NWIOGIPxROUTE: %s %s: unable to NWIOIPGCONF: %s %s: unable to open %s: %s /dev/ip IP_DEVICE%s: getopt failed: '%c' ?aI:io flags%smtu%*s pref%*s dist%*s gateway%*s dest%*s if%*s ent #%*s %s/%-2d dead static%*lu%*ld%*lu %*s %*s %*s %*lu Usage: %s [-i|-o] [ -a ] [ -I ] unknown error%d.%d.%d.%d: option requires an argument -- : illegal option -- --No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0Y  @2 V X? b$ d6 i6 o- p? u6 x? / #%+-0*!L hl'EGXbcdQefgiQnwoprsux(null)cannot print floating point P SSSSBD\tUnknown errorp`H<  p`T@0 x`PD4 dPD,p\HC   c o1$T$Ld su;SSSSu QRPd P,U@ P0Y '!5r'YUrJjR5rO 5rY ju,YUVj 5ru%YYj 5rf%YYF@PhFYYFj 5r:%YY^UVWu uhYY65r%YY#v5r$YYv5r$YYGv5r$YYv 5r$YYuhYY_^UVjj5rG u uTYYUJփ|uV>YYNuj/YY^U0rUrUrUrUrUrUrUrUrUЋrUԋrU؋rU܍EPEPEPj&UUB+M RQ5r] Uj1j5rF @U EuRShq5r%Yuu YYES5rE#YYuu hYY5rYUj1j5r 5r7%YUuh$jj5Ujj5r 5r$YU塨rHUP5r"YYr`URh(YYUVW}yj1j5r  h5r3$YYj1j5r heYhZYj1j5r h=Yj1j5r h Yj1j 5r hYju ^UVW}U<u9U ֋  A +  -<uUU ֋M A+_^UVWE5YE1U)UU U}}ziEk] PY=t }uE1;Uik] iMkU uP_$P FGU1U)UU )U}}}}~iEk] x'P!Y=t }uE1?UiUk iMkU uP_$x'P FG;1UUU )U}}}}~iEk] LPZY=t }uE1?U)iUk iMkU uP_$LP, FG;1UUU )U}ziEk] 8:PY=t }uE1;iEUk iMkU uP_$8:P FGWkEPlU  =tuu u5<u u5/ U_^U=u =1UVW5iYEEE E EkPM l<uEskPl<^j9Yik  _kPؙik M_ZЉE9E}E8E 0UUFGp_^UV5r=YƅyuY5r!Y=[u?5r Y#U-D&RL?lT?as V#Y^UVWuu uFYY5rY>+E3U.D)L$RtP1 Tt_^UVj*Y xr|rh|rhxrYYxrЙBxrxrBxr|rЙB|rq|rB|rX=xrt =|ru5xr|rxr5|r) xr|r=xru!+|rBxr|r=|ru!+xrB|rxrxr|r=|ru!+xrB|rxr=xru+|rBxr|rb xr |rT=xrt =|ru5xr|rxr5|r(xr |rEQ^UkxrPl|r<u.5|r5xrUYY=t hmYrP5r YUt)=rQtN=uEh %Y8h|rhxrlYY5|r5xrYY=t hY5rg Y=uUjDY5r@ Y xr|rhr5|r5xrg t=rQtrNrPY=rEu=rPt =rAu=rQuh,wY1Uuh8h_- jYUJxUhu%)YYUh6juu 54x" P`$ Uh6j50xF$ UVWuh\sAYY=t dEPhTj- u>UtE hz YrUtE h\ Yr hJ Yrh: Yr(x\wh(xh YY0xh(xh YY8xh(xh YYt'149tGF Fԋrrrr rr$r(rr,srs s$s(s,s0s4sorrrr8suuh L# h 5rR YY=u h $YUUUuu u =u;uuh " h u YY=u h #YUUUuUYh u# YY=uuu h " UU U5r Yh 5r YY=uuuh B" UUUu u5r =u?5rYh 5rg YY=uuuh ! UUUuu ut =u9u3Yh u YY=uuuh m! Ur9Uu B$ uYxU(VWuDsUVUVUEUU؋U9VN<< t'WuYY9=r~> tۋPYGGEhY_^UVW$ MR<U$ R@UrR8]׋$ R8]֋U9UW9uU9Ut:uu YYU9Uы9uU9Ut6YEӋE띋$ MR<$ MR@_^UVDs$ rz$t5rY=$ z$t5$ Y#195r~$ R<VU#V UV8N  MEV8M MMU9Uw:EU9t*UU}uV8M+ șEUEE뾃}IVV8UN UU9UwUEEV<V@N G빋VDF_^UVWu1~,u#VtV J9VuVJ9u =Xst=PsuGpJpxSX hpYE=XstAVVNRQ5r =tEP5rYYEPVYYtVE_^UVu uY=t> tF=u 1^UVWuVu19~|V8<t 42YGv<&Yv@Yv8YV Y_^U VWu#V ( ~,VD9VH9VDN8U~D9~H~%BN8^8V<V@N G֋UUU+UЙ9F |( EEڋVHN8]VD9~VHN<VHN@^ _^U=Xxh6j5Xx q=\xdh6j5\x M=`xth6j5`xu -=\xt$h6j5\xU E5U=\t\jYU VWUU UR=YDžu1u9v _^UV5XNx tx^U=\t\u YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV0 U90 wU0 90 vh 16VLYt1'0 rF50 &Y50 ^UVW}u1E}UUsh 1=, u8jY=u1V!փ5, 50 FE54 OVU}9}r69v2W9UvUW~>}t E4 u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=4 <9}r79}u+UOJ}t E4 URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb154 t 9ur6E0tU U4 tU9ru NJEtU9Wu RWE_^U}x}~uBPTYYUi`mNA90`11UU`UUas U EU$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډhF_^UVW}u YfE=lh$YEu EPU:/tHhYEt/u uYYuhuW Ehuv YYEulE+UMuRQ uurYl1WY-E8\t tF>#tEPVu u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5lt}uEF<:t ~u1 tFjuVX uˀ~#uōFPR Y^UV5lt}u7F<:t ~u1& tFjuV uθ^UVW5lE 8t}u1F<:t ~u1 tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F B- x-GF9GE UE 8E_^U VW8 EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EU+U FE8 _^UVuu>t FPUY^U$EPjj U$UUU UEPj%jm UVW11}U9u F߃| jugYtUr YtURtUzt rjY}pt}t}t uFY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv- =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFP FF VVv vvM >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }\n9~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv$ =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E #U :t! EE E #U uuu7YYEy@Ut8huiYYE~" tu/YuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu  UEEUUUUU JUEPuuH EUJUx ]E EPjYYEUuu huUEEUUUUuYEuu EP? USE] ![]USE] ![]USE] ![]UVW}u MT$ L$ UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+h"}t}y UU_^U$UUEPjj U$UUEPjjo U$U UEPuYYEPjjA U$UUU UUUEPj6j U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu(YYU UEPjj[ ^U$UUUUU UEPjj/ Uu hT$u UV& T$@, T$@% T$@hE suVu ^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U c}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE8uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE`UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVP\YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuQYY=u˃}t Uډ E_^UVWu }Ed $E)E EEEh-t+u-U EMtJxFFSXV3Yǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVIYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G +E=cF}[t@}nt:JxFFSXVYEE uՃ}}nJxFFSXV;YE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=d r}d u8-t8+uEE-d EE}dt}iuuEPhd < EuEPhd > EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE u:EuUEMtʋJxFFSXVdYEEEuU}}t VuYYMEuE}uEG?^u EGEEd }d s UE?]u Gƀd ?Z?]QGƀd ?-uG?t2?]t-G9"G@E9EEƀd EG 띀?uEEd 3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tEd 3]u}t}t VuYYMEUEt }vE}uEuVu E=d r}d u8-t8+uEE-d EEEPhd ZYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]UW}0ʀuA)_]Uh`h>YYjYUhhYYjYUVu|YƋU rU MJwU uRYY^UVWE_^]} 0)ʇʋu }U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7 u.`=}aa'1ۇ tPXP %c %-2d %2d %c %c %d%s%s1 2 37 8 9 NOTE: Use Num Lock & arrowsSPACEDownUp, Right, Left, HintPlayAutoQuit Newgame G O M O K U A [ B B B1z2L3z4Q6V7z8G9zAzDzHzLzNzPzQzRzUz 137739sAqDHLNRUCongratulations, You won!I won!Tie game!Good bye!curses: %s vbblacaeasvsveviueusmdmbmemrcmsesoclcolicoliTERM>'' & & &',,;,_,r/etc/termcapTERM/etc/termcapTERMCAP25 04142434E4b4f4n4r4t4F5\85F546%6+525dF6i5r5OOPS{>ah>rC>wR>>+>b>DDDDE E@EFXFbFdFiFoFpFuFxFG G#G+G-G0GJLHhHlHHEQJG<v^#: #+'#+++++- - _++++|+,.-0ahI`fgjklmnopqrstuvwx~SSSSBpx ((((( AAAAAABBBBBB   0; T1$T$L  su;SSSSu QRP(0PU50hhl  jYU4VWEEEE j/0YY0u ] 00h50 YYuEh 50YYuE9}U :-Bu WZY4F>-u ~q>tYEEEEE>u9}uBu WZY4uоF(.99}t}u 50hhl % j(YEPhYYyE.}t jYjjYYjjYY5$ YP50hhl jYjhhhh5$ YP50hhl _jbYjju 9EtE̻X7jjYYjjYYjYu"YPuu 5$ #YPhlhl  _^UVWDžXEPrYEPYǍ\PaYx lXP'Y uhh4YYY 2h4CYYjhh ƅh50YYt50h YYhh YYhh YYhh YYf4 f6 U8 $ j0h Vw VYjhh$ ƅu hYX0OXh4RR7www 4hPEP,EPDYPEPV VY_^UV5Nx <^U=tuHYUVWuYƹ< +F؉F +ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EP)3>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h4 VW ƅu1WWDYZ׀>/u5Fuh4 VEP ƅu19ut EEG>,t1jFhH VW ƅu1MWWYZ׀>/u0FuhH VEP ƅu1EEGu>t1_^UVWuE}>:tVh 'YY_$ ( 4 UD H UX VY=Vh YYVh< wYYƅ>-uF>+uFjVEP ƅUU j h< 5$  1 < Vh< YYƅpj h< 5( \ < >t>,tjVEP ƅt5U >t'>,u"FV Y=xwVh< YYƅu_^Uhh=YPLY$ , ( 0 UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuE4 H E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FytG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N90uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+$ "}t}y UU_^U$Vu UUuV֋RUV֋RUEPjLjD ^UVudYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډ$ F_^U$UUEPjj U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0GYE9uvEE EЃ E V!փ}u s$ KVYE=u$ &UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0:YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RqY_^U$EPjj] U$EPjjE U$UUU UEPj%j UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjY V5hjKj ^UU$VWEPYEPEPj jYƋ}t9uvEL"EPYEEPEPj WwYUUjEPuYYEPYWjQYZ)‰jEPjF jEPjV t9r)օu jYV YU)_^U$uYEUUU UEPjjp U$EPj jU y}tUEEU VWujh(YYEy(=$ t h FPYYrhFPu E$ UuYU$ }y VUj FPYYDžt)RjW5 hVYYhPpYYhP]YYƆ$i PuYP%P;YYh0P(YY1_^U$UUUUEPj j y} tUE EU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U <}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EETuVuu ƀ}Xu9utUP3YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE|UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }.~y UVu CV€tu ,fNV~T u>5X < Yt.hYFu NLNHF 9h~YFuN!NF V@uVVVhUFt$jjv =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv% =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^ GOcU7t. &t`kdVD$aÜX1PXR1ЅUSE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVU9wU9v$ 16V0Yt1'rF5&Y5^UVW}u1E}UUs$ 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U}x}~uPHYYUUas U EUhhl fYYjjYU$UUEPjj' y U 1UVW5  }׃}~9r }y 9vWYu_^U VWE}yA ƀ -]}uA ƀ 0Z'~QEǃ}u~$G0A ӈ E+UډU 뫡ƀ  _^U$UUEPjj U$EPjj U$EPuYY1ۅÉU$UUU UUUEPjjw yEU$} uEEUUE UEPjJj- y}tUEEU$EUEPjHj Uu hT$ue UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6jO {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPUsage: %s [-hrRf] [-x reboot-code] RQfZh?rHxc$Q%s: reboot(): %s %s: can't execute: /bin/sh: %s down/etc/rcsh/bin/sh%s: can't fork(): %s /usr/binDon't know what to do when named '%s' reboothaltDecNovOctSepAugJulJunMayAprMarFebJan%s %02d %02d:%02d:%02d %s: system %s by %s@%s open~~~shutdownrebootrootlocalhostSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown errorY2Y2Y2??? : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0i3861VU2Minixnoname/etc/hostname.file% %@%&X&b&d&i&o&p&u&x&' '#'+'-'0'*L(h(l((Ea*GL*X)b)c3*d)ea*fa*gL*i)n)o)p)r*sq)u)x)(null)cannot print floating point ,/usr/adm/wtmp/usr/adm/logLHD@<840,($ GMTGDT U U `TLD@80( SSSS/etc/passwdB< T l Unknown errort`PD xdP<(lXD( xdT@,C ((((( AAAAAABBBBBB   pP I1$T$L|P su;SSSSupp QRPp PUVWU RU }~E:-uFubYDž6U)UuhWYYjiY9u}~U 4h$D YYU h 4 YYEu,5FYU ] P43hh uW'YYuYF9u~h Yp1_^UVWu }kAMJxʉhP`YY볋JxFFSXVYǻ0P_^UhHh YYj6YUVuj jVg ^UV5tNx x ^U=xtxu YUVux95< h0^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVW11}U9u F߃| jugYtUr YtURtUzt r& Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFP FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }xF~y UVu CV€tu ,fNV~u>5Yt.h,YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvs =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E xU :t! EE E U uuuYYEy@Ut8huYYE~" tuYuuWYYE}y1]j!YEu uY1A!uEUMJUzUBUE_^UUUuuu  UU Uhuuz UVh U9h wUh 9h v 16VYt1'h rF5h &Y5h ^UVW}u1E}UUs 1=d u8jlY=u1V!փ5d 5h FE5l OVU}9}r69v2W9UvUW~>}t El u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=l <9}r79}u+UOJ}t El URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15l t 9ur6E0tU Ul tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U@ 1UVW5@ @ }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U k }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UhEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEHUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPzYY=t6JxEEFFEEVPDYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu9YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MUUas U EUhPhYYj2YUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇH tPXP %s: cannot open %s: %s r==> %s <== ^ [Usage: head [-n] [file ...] unknown error a r w * + b No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argu mentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0q @JnXWb<dNiNoEpWuNxWG 8#=+3-.0B9L!h l?EGX+b+cdiefgiino+p+rsu+x+(null)cannot print floating point t SSSSB ((((( AAAAAABBBBBB Unknown errort`PD xdP<(lXD(          xdT@,C   Pn(q1$T$Lsu;SSSSuxx QRP. P%U(VWu EE60}}hhQYYj%Y}V:-hvSYYu#00EMhvXSYYu%0Mhv6SYYu 0MmhvSYYuMEhvRYYuMjhvR uMvkY 0MjhvR uMv}YMhvWRYYu 0Mhv%RYYj 0MX}_VUj:uQYYEtEEPu.YYE؃}tUB:}uXu)YDžu%hhNYY50Yjx#YW$0hpKOYWYU$0fT15T1 T1 فf 005$0Y/YPhXNYY}tVu"YPhLNYYu"Y%fT1T1 T1 فf 00hHNYVUhDuPYYtIEPu,YYt7EPEPEPEPh(hrNE 10%0=t'= 0t 0PuoYYP!YEE=0r|}u uDY u7Yǃ=|t7U܉IM܅uhmMYjz!Y|U10냃}yu50{YjA!Yj9!Y_^UVuhV-OYYuj$hVOYYuj hVNYYujhVNYYujhVNYYujhVNYYujhVNYYujhVNYYuj|hVmNYYuj dhVUNYYuj LhV=NYYuj 4hV%NYYuj hV NYYuj hVMYYujhVMYYujhVMYYujh|VMYYujdhxVMYYujehtV}MYYujfthlVeMYYujg_hhVPMYYuhGhdV8MYYuh/VYt VYPVhLhjJ jX^UVuhVLYYujqhVLYYuj\hVLYYujGhVLYYuh/VUYt VJYPVhhI j]X^UVWE0h(0JYYh$JYUz?t2s*YPhJYYh IYUrt>t:t6hIYYhIY_^ULhh)IYYFhhIYY3hhIYY hPhHYY 4EdUVWh(udKYYujuYY uE>t >.uEF}t1~.u+~.uFjuYYE~uF.E}u>uJ8Yƅt/=t VhHYY 0jVYYt81?t1=t7hyHYY7uMYYEt>ʃ=0u 0u1 =t h1HYjuYY_^UV= 0t5 0u uf [5u uM ƃ=|u=u =t&ju u Eu}t1^U@V} uuhh`PG$u huhhTPGhPjjju5Pj:0$ƅy'0t h@GY01jhPVPQ7ƅy$0t h,FY01$UjhuP^U8VW}fWfT1T1 T1 ىMfWfT1T1 T1 ىMfWfT1T1 T1 ىMfW fT1T1 T1 ىMԋ0u=t-}u'WuRYWPRhEGulUUUw[Gt01010101s01bWh`1HEEEu }t7Vu VC(YYZMЃ}~Vu V$(YYZ߃}`Gu=t}u htDYMx;t79u v2uhuVƃ=|tӃ=uʸ=u s}t1hDYMx!t9u vuhuVGڃ}t1hCYMx!t9u vuhuVڸ_^U4VWu}hPu Vƅu1V(YEV(YEV(YEU9Ut}t}u} t}u EE}t`=t.ujYPuYPu䍅Ph WeB)u<YPu|YPPhW:B=tE E VA'YEujEPVC }u/}tu"Y]PShWAuv}l}tLu"Y]PShWAFPhWA VNQhWrA u}JU hhVRu K"x0hhmCYY= 0t= 0t |hPu Vƃ}EӍSPhW@hFЉUt$}tEVuPhW@u֊FЉU&}tEVuPhWa@uhPu Vƃ}tPhW @ hPu Vƃ}tPhW? }tV%YPhW? }tV$YPhW? }tV$YPh\W? }tV$YPh@Wr? }tV$YPh$WS? }t7=tVV$YPhW&? V>$YPh W? hPu Vƃ}PhW> uhPu Vsƃ}tEӍSPhW>hPu V9ƃ}PhWZ> FЉU}tEVuPhW'>u}tEVPhW>u}}tV#Y]PShW=j}`jEPVe? UFuYE؃}tJ}t$]3uWY]PShWe= uu5Y]PShWC=EUU9UFU€}E}t>Eغ#U0fT1T1 T1 Q6YYEԃ}t,}tE0hW< uhW< eEUeK}tEPhWn< u EXUU9tUURVhW8<}t hW$<YY_^U3=t -t#p=t hTPLH=t D4=t 0 |rh^WPIB;4uhh; =u1 EWUy=t si=tYR=tB;4uhh"; =u1 EVUVuUM RVuQu /Ey1>u.FUU^UVWDžDžDžTu<YljJU:.u JU=t%jhPh$0N; Dž`6hPjjjjjuj"$yh 9Y hPP*yh 9Y 0u =tXffT1T1 T1 QR7 YPRh 9ffT1T1 T1 ffT1T1T1 f fT1T1 T1 ىuYiJt h R8YJh E8Y=h@ 88Y0h +8Y#h 8Y< S1 ffT1T1 T1 م~ VRV,YYZDždDž`VhPVRPZVYVYhPVRPduP0YY19d~"PP/YYtG9ddhPP8 dDŽdr`e19d~[PPY/YYu9,B,`jhPV)7 `G띉319dDž(PYXtLP,,8t8`}&`jhS06 `(,뽋0u =tWP(h 5 50u =t!Ph 4 GDž\DžDžhPjjjh5uj$y&0tht h3YYYhh |YPu DžP\ `9\xjP85YYL=u/5YPPh@ hc3Dž<1\hDf00fJtG9uF>uր?=uэG1_^UVux95^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U8VWEU UUUUfRfT1T1 T1 ىM؋UfRfT1T1 T1 ىME$ Eu }}`uuVuu[ Džy01W΋Uu*YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt 0 01+EEEEEM9uuuVuuKDžVA YEV4 YEV' Yǃ}u@ց} sUEEu)YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u Uuu(YZЉEE1UU%$s-UEȉEWVR' UUE;}tEE 01_^UVW}-0= >N>.WY($=u01=($X-0= r>.uF\hPjjW^y1jPi _^UVW}}t1PGPGPGPhP$hPj jPEy1HjuP ƅu1*UVU V ($($_^UVW}51%Yƅt9~u=1uA_^U=uhh!YY 5#YU 1U=t5Y1UVW=u!hhk!YYu15hh,$ Eu1U:#thuYYƅtU0(huYYƅtF> t> uFhV|YYEtEVY8(<(4(׃}t?ut8>t3> t> uF(s7hVYYƅtF0(_^UVW}Utu >t]9uFG1_^UV51(YD)ƅtU9Vu} tu v $YYuփ=1u(^UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E;} tF=1 1 ً1 ʋ 1 ыE _^UVuFPFPFPPhh((^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U:}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!4 8+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UL>7>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^U VWDžDž000 080jhf#YYu0g#JfhkYƅthVh80 hhYYE(uhPG jhxP% _u> t> uF>t> thVh80 j h80UYYƅtDždjhpP 9> t> uF>> hVh80k j h80YYƅt80817E>t3P1s+> t> u E}t 7EFȀ>t > t> tFDžoj hdP Q= 0D> t> uF>(>  0$0PVkYY 0ff U00 0uY= 0u"$0ff00 0=80u=hPYYu&j.PVYYƅtFPh80YY]818080E>t >.uEF80}|D1sj.VYYF7M 01_^Ut >.uEF}u)uYƅtuuuu V_}u 0€u$}N>.081?quuuu 7uE~=;u0l=0uE=0t =0u0t놃}t"uuuu ju%E~}t 0_^UVW}} uBWPY-Ɖ:.u#sVWP9 Ƅ5*"u hWhhPuuuu_^UVWhYEthufYYEu1EuhP >tuF>nuP. YYuFu>tDG?tuG1҈)hVh( u Y( u Y1_^U@VWEEEUUЋUUE=0uu=u 0u } ~1EUffUE09UYE 09U;}Dž0U=y2UMEPU00P4$0w =#U fT1T1 T1 فfMjEP5 =t$U5-Y^u u5 9E t$U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tBU5{Y}<}EM}ffT1T1 T1 ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$U5 YUJÜJU+UfUU܅VU܁vE܉VP5B ƅU)fU멃=yyU'UMU00P4$0u u5(9E M0Uԃ}~ Eԙ= 0Eԃ}Euuu5E=u=EEUM9u0 u+UBt"5 YE}t0t}u 0u5 YEaEE=x5 Y}u}u ;= Uȉ_^U=t5C YU$VWh DYDžujW YYƃuEE1UUfU fUEPh0n@V E=uEV YGEEPh2n@V E=uEVt Y E_^UVWuut.Vu u_ Dž U)U U )΋E_^U VWh$$YDžujW YYƃuEE73EPh@n@V E=u UV YU_^UVWUR Yƅu wUWfUfW fG #UfWuu FP} URVu@ EUV1 Y}r UUUE_^UhYJj YYjYUVWUR YDžu hYJj_ YYEu~YEURWu ƋUxw7~1Ws Yj=Yuj YYu(YU@RGPu X W- YjYuj YYuY_^UVWEEP YNjE E P Y9uuԅt9}t t1_^UVW}u1]MEEP YNjE E Ps Y9uuąt9}t t1_^UVW11}U94u 4F߃| jugYtUrYtURtUzt r Y}t}t}t u Y_^UVWuEu41}%<4t44YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvB =u N /uvv EU9Uu1 N _^UV1}*<4t4Bt 44aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<4t,4R@t4Bt 44YGƒ~uF)FF VVv vv >uNN FFSX_^UVWEE11<4tN|1DFρECEE0-EMP1E E 03U :t! EE E P U uuu YYEy@Ut8hu YYE~" tuk YuuK YYE}y1]jYEu u6 Y1A!uEUMJUzUBU4E_^UUUuuu ` UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uhuu Ujju E`UUURu hu'UUURuu uUEEUUUUU JUEPuuD EUJUx ]E EPjYYEUuu hu# ; S / D$D$D$UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVWE_^]L$ GUVWMcE_^]U=tjYUV)U9)wU)9)v 16VxYt1')rF5)&Y5)^UVW}u1E}UUs 1=)u8jY=u1V!փ5)5)FE5)OVU}9}r69v2W9UvUW~>}t E)u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=)<9}r79}u+UOJ}t E)URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV4 uY_^U VWUUb15)t 9ur6E0tU U)tU9ru NJEtU9Wu RWE_^U}x}~uP YYUVu~  u6EPfYEU UEPEPV yE^UUas U EU VjhYYƅyHu uV EVvY}u"U JUj uYYEt1^U=uhhYY 5YU 1U=t5Y1UVW=u!hhYYu1D5hh) Eu1U:#thu YYƅtU.huYYEtEU: t: uEhuYYƅjFuY%fT1T1 T1 ى .5 ...hVWYYƅtFt8>t3> t> uF.s7hVYYƅtF._^UVW}Utu >t]9uFG1_^UVW51Y7DžD7uYYtw>t6uYYt} tu w YYu=1u_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$UUEPjjc U$U UEPuYYEPjj5 U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj3 ^U$UUUUU UEPjj U$UUU UUUEkEPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE( uVuu ƀ}Xu9utUP[YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Up EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U1 JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEPUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE! E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }VN~y UVu CV€tu ,fNV~u>5|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvw =u N 3uvvl uNN N_^UVWu1fϋV€t}u ~tu>FtV}YU )uRv EVt tfVV}u1_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UhXhRYYjڹYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjI V..5.h.jKj ^Uu hT$u U$} uEEUUE UEPjJju y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P31ۇtPXPToo many cnames. Possible loop. %d.%d.%d.%d.in-addr.arpa..: on port %dUsing domain server %sUsing domain server: Error in looking up server name: -V-a-c-t-l-v-d-r-wUsage: host [-w] [-v] [-r] [-d] [-V] [-t querytype] [-c class] [-a] host [server] -w to wait forever until reply -v for verbose output -r to disable recursive processing -d to turn on debugging output -t querytype to look for a specific type of information -c class to look for non-Internet data -a is equivalent to '-v -t *' -V to always use a virtual circuit Invalid query type: %s *anyunspecgiduiduinfotxtmxminfohinfoptrwksnullmrmgmbsoacnamemfmdnsaInvalid query class: %s anyhschaosin %s Aliases: %sAddress:Name: %s xThere is an entry for this host, but it doesn't have what you requested. No recovery, Host not found. Host not found, try again. Host not found. Trying null domain Trying domain "%s" Aliased to "%s" .res_send failed res_mkquery failed %.*s.%.*s%.*s0  Additional information: For authoritative answers, see: The following answer is not authoritative: rcode = %d (%s), ancount=%d ,M\^    h^def packet size error (%#x != %#x) %c??? %d %s%c%s %d%c%s %s%c%ld%c%s%c%.*s %s%c%s%s (pri=%d) by %d %ld ;minimum TTL ) %ld ;expiration period %ld ;retry refresh this often %ld ;refresh period( %ld ;serial (version) %s %s%c%.*s%c%.*s%c%s., port = %d, protocol = %d%c%s%c%s%s%s %s%s %d%s %s 8 B L V `jdeft~%dGIDUIDUINFOANYMAILAMAILBAXFRMINFOHINFOPTRWKSNULLMRdescriptive textTXTmail is handledMXMGMBSOAis a nickname forCNAMENShas addressA81 %d ANY HS CHAOS INNOCHANGE14131211109876REFUSEDNOTIMPNXDOMAINSERVFAILFORMERRNOERROR' %$ $D$$ result: %s, answers = %d, authority = %d, additional = %d ListHosts: error receiving zone transfer: *** Error during listing of %s: %s Premature end of dataServer failed: %s Premature end of dataServer failed, trying next server: %s write failed: %s write failed: %s Error from the last server was: %s No server for that domain responded Connection failed, trying next server: %s Trying %s tcp_ioc_setconf failed: %s unable to open '%s': %s /dev/tcpTCP_DEVICEListHosts: Res_mkquery failed Found %d addresses for %s Found %d addresses for %s by extra query Unrecoverable error looking up domain name. That domain exists, but seems to be a leaf node. Unable to get information about that domain -- try again later. Unable to get information about domain -- try again later. No such domain rcode = %d (%s), ancount=%d Unable to get to nameserver -- try again later res_mkquery failed %%x%q%%@%G%N%U%\%c%%%%%%%%%%j%BAD ERROR VALUENon-authoritative answerTimed outUnspecified errorNo informationNo changeQuery refusedNot implementedNon-existent domainServer failedFormat errorSuccessAssertion "siz >= nbytes" failed, file "host.c", line 1418 unknown error%u.%u.%u.%u.in-addr.arpar/etc/protocols # r/etc/protocols9292112%d.%d.%d.%d32t3555{6+66nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain\>]<=X?L?X?@?4?X?X?%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEPaPrkPwzPP+PbPNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0/etc/hostname.filer/etc/services ,/ # r/etc/services_ _@_`X`b`d`i`o`p`u`x`a a#a+a-a0adLbhblbbEUdG@dXcbcc'ddceUdfUdg@dicncocpcrdsecucxc(null)cannot print floating point .4 ,   SSSSB ((((( AAAAAABBBBBB Unknown errorh\@,t`P@0pdT@$pdL0 |hC1  P ( 1$T$L su;SSSSu  QRP PvUVWEE $1҉UUU1҉UUhu u\" E=}tE}tE뭃}tE뙃}t(U냃}tzEl}tc(USPIEdNU9 t.UU܃}tUUh|rYE̅uEpUU؋UUԋUUЃ}tUUhd9YEȅuE\}u }u}u}uUԉU؉U܃}ju`*YYE=u05 5YPu5$h<h8 o(jYtPhnHu* E=u-5 YP5$hh8 !(jDYtP YP}tPh( E}u}u }ju)YYE=u05 VYPu5$hh8 'jYhPh!n u)) E=u-5 YP5$hh8 B'jeY(P(Y}t4l YP}tPh' E}u }11jjlP dtd3[jh a(YY4=uD= 35 &YPh 5$hh8 ^&jYh$ P4' 0=$ul9u˃0y25 YPh 5$hh8 %j Y4{'Y0$pPPj PvtPPj PMtt t t j.VV'YYt"j.VH'YYGl Y1V\Pq'YYt"h\P&YYW\P&YY}t.\P}tPhk% E}|hhhl$#YYt4\Phdy$ =tY=u-5 YP5$hHh8 :$j]Y}u hD$YjDY_^U5$hh8 # jYUV5 Nx ,^U= t uL%YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVux95  ^U(VWUcSct1UUE4UlUEU,UE1tTT9{UF}g}u1FSXE؋U 9Uu }tE0}tU؋E2}4utEtE@uuGb1_^UVWu} u jM%YDžt+FPFPFPFPFPPhW" _^Uh uYYU8VWEU UUUUfRf  ىM؋UfRf  ىMEEu }}`uuVuuDžy1W΋U| uk#YljUUU)UVuV YYZMԃ}~DVuVm YYZ߃}t&UBt  1+E E E E EM9uuuVuuDžV YEV YEV Yǃ}u@ց}sUEEu-"YljUUU)U]}tE} u?uuVuuVDžy +֋U| | }u}t }t&9= t U9UtQ= UŨ}u1 }u U| uuH!YZЉEE1UUs-UEȉEWVRg UUE;}tEE| 1_^UVW}-0= >N>.WY =u1=|        | X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhPhPj jPXEy1HjuP ƅu1*UVU V    _^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E?} tF=  ً ʋ  ыE _^UVuFPFPFPPh(h$$^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U4>}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!L<+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UdB;>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWu=u hPjjjuu uj^$ƅuuVPƅy}Gu^fWf  uL07+W|Y9_^UVWEu=u N uE>t >.uEF}u)uYƅtuuuu V_}u €u$}N>.?quuuu 7uE~= ;ul=uE=t =ut놃}t"uuuu ju%E~}t _^UVW}} uBW<Y-Ɖ:.u#sVWPu Ƅ5*"u hWhhP1uuuu_^UVWh{YEthuYYEu1EuhP >t uF>nuP. YYuF u>tDG?t uG1҈7hVh8 u Y8 u Y1_^U@VWEEEUUЋUUE=uA=u u } ~1EUffUE9UYE9U;}DžU= y2UMEPUP4w =#U f  فfMjEP5  =t$ U5 yY ^u u5  9E t$ U5 6Y }fEU܅t2EPW5 $ ƅ~U)fUU܅tB U5 Y }<}EM}ff  ىM9M}#UfUDž #UfUU܅t2EPW5 H ƅ~U)fUU܅t$ U5 Y UJÜJU+UfUU܅VU܁vE܉VP5  ƅU)fU멃= y y U'UMUP4u u5 (9E MUԃ}~ Eԙ=Eԃ}Euuu5 E=u= EEUM9u u+UBt"5 cY E}tt}u u5 Y EaEE= x5 Y }u}u  ; = Uȉ _^U= t5 Y U$VWhYDžujWt YYƃu EE1UUfU fUEPh0n@V* E=u EV YGEEPh2n@V E=u EV Y E_^UVWuut.Vu u Dž U)U U )΋E_^U         VWhYDžujWT YYƃuEE73EPh@n@V& E=u  UV YU _^UVWURP Yƅu wUWfUfW fG #UfWuu FP URVu E UVY}r UUU E_^Uh !j@YYj YUVWUR YDžu h !jYYEu YEURWu Ƌ Uxw7~1W3Yj YujYYut YU @RGPu W YjC YujXYYu. Y_^UVWEEPYNjE E P~Y9uuԅt9}t t1_^UVW}u1]MEEPYNjE E P Y9uuąt9}t t1_^UVW= aU9 }  M :-u zu  M h(4 YYu  M  ǣ:tWu YYƅ}= t=E h8 07YYh8 h&YYh8 WYYh8 j YY M   :u  ? F>: M  C;t!A M  C( U9 |W= t=E h8 0fYYh8 hUYYh8 WYYh8 j YY ?` A M ( 7 M   :u  (_^UVW11}U9P u P F߃| jugYtUrrYtURtUzt r6 Y} t} t}8 t u Y_^UVWuEu41}%

uNN FFSX_^UVWEE11

}t ETu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=T<9}r79}u+UOJ}t ETURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Tt 9ur6E0tU UTtU9ru NJEtU9Wu RWE_^UVu~  u 6EPr YEU UEPEPV yE^UUas U EU VWDžDžjhYYug#JfhsYƅthVh hh|YYE(uhP jhP _u> t> uF>t> thVh j huYYƅtDždjhP 9> t> uF>> hVh{ j hYYƅt7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj hP Q=D> t> uF>(> PVYYff UuPY=u"ff=u=hPzYYu&j.PvYYƅtFPhYY]E>t >.uEF}|sj.V YYF7M 1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U /}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE0juVuu+ ƀ}Xu9utUPOYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UxyEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEX UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } >'~y UVu CV€tu ,fNV~ u>5$ <Yt.h4YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvf =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvW =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^:USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]L$ 7Uh` h8 YYj2YU Vjh YYƅyHu uV EVnY}u"U JUj uYYEt1^UVW5hYDžD7uYYtw>t6uYYt} tu w YYu=uA_^UVuYƋU rU MJwU uRAYY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPje Vld5thXjKj ^Uu hT$u U= uh h YY 5 EYU U= t5 VY UVW= u!h h YY u1D5 hh|H Eu1U:#th u YYƅtUh uYYEtEU: t: uEh uYYƅjFuSY%f  ى 5h VWYYƅtFt8>t3> t> uFs7h VYYƅtF_^UVW}Utu >t]9uFG1_^U$} uEEUUE UEPjJj y}tUEEUjju E`UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVWu1fϋV€t}u ~tu>FtVYU )uRv7 EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP1?EIaehi %s: /etc/hostname.file: %s %s w/etc/hostname.file %s%s.%s: %s: %s %s: %s: %s %s%s%s: Unable to fetch IP address: %s %s: Unable to open '%s': %s %s%s%s: Unable to fetch ethernet address: %s %s: Unable to open '%s': %s /dev/ipIP_DEVICE/dev/ethETH_DEVICE?aheE:iI:Usage: %s -[eiah] [-E ] [-I ] unknown error%x:%x:%x:%x:%x:%x%u.%u.%u.%u.in-addr.arpa%d.%d.%d.%d},x3:%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE: option requires an argument -- : illegal option -- --)ax)rS)wb))+)b)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain75)7E< ;@<B=X+=b=d"=i"=o=p+=u"=x+=> >#>+>->0> AL>h>l>?E@G@X?b?c{@d=@e@f@g@i=@nc?o?p?r@s?u?x?(null)cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/services /usr/adm/dhcp.cacheSSSSB 8 ((((( AAAAAABBBBBB Unknown error|dX<(|p\L<,|l`P<   l`H,xdC  pD Q1$T$LhDsu;SSSSu\\ QRP PUVWcEPE=+uYEuhuhh$Eh0huhhuYEuhuhh$Ehh0hluhphx]9}tJWYEt$]hL3hPWhTh\(h8Wh<hD9utJVYEt$]h3h Vh$h,hVh hhY1_^UV5`Nx ^U=dtduYU=xx 5xEYx|U=xx=Du Dlj5D}YYxy'j5xYY Pj5x 1U^UDU\ H=|u/hhH5xh |1VX H=\ H u1< |X X \ \ = u\ HU\ U\ U\ :u12\ : t\ 9Et\ z:u1 UEUV=xy~y1u1j:nYH tj:]YL tj:LYEtjju P X ։T \ : t$j,YtT s\ :uH ^UV3ƅt F9Eu^UVv ƅtu6YYuV^U=x 5YU=x=` u ` j5` YYy'j5NYY Pj59 1U^U` Ud=u/hhd 5 1V|d =du1< ||= udUUU:u1: t ::uҋUEUV=yy1u1dtxttjƅtjjVB fhLƅtjjV$ j/xt!lypg:Xd^UV%ƅt F9Eu^UV{ƅtu6nYYu[^U$UUEPjjo U(VuEEV֋RUV֋RU E UUU UEPj7j ^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj UU UhuuN UVujuu V!^UVujuu V^UVWuEEEu} tE 01tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVuYƋU rU MJwU uR YY^UVWuU VVuY YYDžt~~yVډF_^U$UUEPjj U$EPj/j yEU$EPjj] yEU$EPj/j1 U$EPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U /}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE juVuu+ ƀ}Xu9utUP# YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UTyEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE4UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }d~y UVu CV€tu ,fNV~u>5Yt.hlYFu NLNHF 9h>YFuN!NF V@uVVVhUFt$jjvR =uN ?jEPv| =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvC =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWEE_^]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUh<hYYjYU$UUEPjj y U81UVW588}׃}~9r }y 9vWYu_^U$EPuFYY1ۅÉU$UUU UUUEPjj yEUu hT$u9 U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu } 0)ʇʋu }UVW}u MOU$UUU UUUEPj6js UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ<tPXP egid=%s%d%s) (egid=%s%d%s%s%s euid=%s%d%s) (euid=%s%d%s%s%s) (  gid=%s%d%s%s%s gid=%s%d%s) (uid=%s%d%s%s%s uid=%s%d%s  U @ X b| d i o p u x  x#}+s-n0yLahKlVEGXkbkcdefginokpkrYs%ukxk(null)cannot print floating point SSSS/etc/group/etc/passwdB ((((( AAAAAABBBBBB   % L1$T$L su;SSSSu  QRP PVUPVWE ( EEEEEE1hu u E=`}tU, U뿃}t?, U멃}t), U듃}t, Uz}tEc}tELt9u5( hhX > j)YE#}u }u}t1Et }tb}uE}t P YU9 t0UUUUUUỦUEuuu hYƅu!uhh > jV YYEyLt= = 5 YPV5( hhX  jY}tuuu }tuuuq }t uuYY}EPusYYu+gV5( hhhX jyYDu YPVhX UtuYPhL YYh@ j _ YYu Yt E܃}jY_^UVu pYƃu#u 5( hhX jY}t uZYuREuEPh n @ug Ey-5 YP5( hhX jnY^U EPu$YYu1Uu h<YUVWju YYE Pju EPh!n u Ƌ= uju y3 t.= WHYP5( hhX jYuEPu 1_^U5( hhX z jeYUVu Yƃu#u 5( h(hX >j)Y}t uYuREuEPh n @u Ey-5 dYP5( hhX jY^UjEPu O EU:t#u 5( hDhX j|YU EPu3YYu 5( h\hX W jBY#UUhX uYYI UV5 Nx 0 ^U= t uYUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E3} tF=   ً  ʋ  ыE _^UVuFPFPFPPhh  ^UVW=$ aU9 }  M :-u zu  M h4YYu  M $ ǣ :tWukYYƅ}= t=E hX 0YYhX hYYhX WyYYhX j kYY M $ $ :u $ ? F>: M $ C;t!A M $ C,  U9 |W= t=E hX 0YYhX hYYhX WYYhX j YY$ ?` A M , $ 7 M $ $ :u$  , _^UUUuuu  UVu JxUʋFF Vu: YY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UU Uh@ uuB UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj YYEUuu hug{UW}0))ϊE tu1_]XG_]F U= t jYU}x}~uPYYU$UUEPjj7 U$UUEPjj U(VuEEV֋RUV֋RU tE UUU UEPj7j ^U$EPjj U$EPjj U$UUU UUUEPj6jW U$UUU UEPj%j1 U(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U0JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P_ E6U U RU U RUEEEP E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u  ƅ~9})׉U U 1_^UVWu } #~y UVu CV€tu ,fNV~@ u>5D Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVx uY_^ ! " # $ % U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UUas U EUhhX YYj YU$ 9Ut*UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVu YƋU rU MJwU uR YY^UVWuU VVuYYDžt~~yVډ F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u U$UUUUU UEPjj' UVWuEu41}%

0RIL1hl&OEGX;b;cdyefgiyno;p;r)su;x;(null)cannot print floating point $ SSSSB( @ X ((((( AAAAAABBBBBB Unknown errorl`D4|h\D4(t\L4$ lT8$lTD0C   ' J1$T$L< su;SSSSu(( QRP8 P UVW1U u]Y= t t u u߉lURt WBPu WZYZuY= t" t tBPu WZYZ̋U _^UD L =L t3L u2>YYu L BL RL 1UVuYE]9]}t3L zEL BE L Bj : Yƅuh hYYj} YuYP YuhhmYYjI Yu6iYYE FEF=D u5D H r5H ^U=0t5@ YjYU5@ NYE= t }uUV5@ %Y= t;uߋhJhx||hhVYY밋hJhx|| hhj UYY^UVhTvY5D t~u6hPYYYvh@HY5D t~u6h<+YYv^UPVW5@ 5Y=u#t?hJhx|| hhVYY, t뢍EP5@ _YYhxEPZYYthpEPFYYuGhhEP1YYuOVEPh`S , t8$ _^UPV5@ IY=u#t, tύEP5@ YYhEPYYu?EP5@ vYYjjEP[ , p`fhEPHYYu?EP5@ #YYjjEP ,  hEPYYthEPYYuPEP5@ YYƍEPVY=tjjEP , , |U\VWE5@ Y=u"#tUt?hJhx|| hhVYY, t., t댍EP5@ YYh@EPYYuUtQEP5@ YYjjEP VEPh0 ,  h(EP]YYuUtQEP5@ 4YYjjEP VEPhV , 7hEPYYu:uE1VEPh , tVhEPYYuEnEP5@ qYYBVEPh , th(jjEP& 1EPY*, hEPYYuE^EP5@ YY21BVEPh , tEP/Y, {hEPcYYu(}u"1, ?hEP'YYu)}uM, t+VEPh , uk, \RUhHhYYjzYUTVuuhu V E=05P EPOYYjjEP 5P EP,YYjjEP 5P EP YYjjEP d5P EPYYjjEP >4E@ PJM :-t=5@ YJM h4 YY@ uhYj6Y=0tK1^UV54Nx T ^U=8t8uXYUV U9 wU 9 v@ 16VYt1' rF5 &Y5 ^UVW}u1E}UUs@ 1= u8jlY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVW=LaU9H} HM :-uHzu HM h4 YYuHHM Lǣ :tWu YYƅ}=Dt=E h0 YYhh YYhW YYhj YYHM LL:uHL? F>:HM LC;t!A HM LCP HU9H|W=Dt=E h0& YYhh YYhWYYhj YYL?`HA HM P L7HM LL:uLHP _^UVWuU VVu YYDžt~~yVډ@F_^UVW11}U9u F߃| jugYtUr YtURtUzt r Y}Pt}ht}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hsYF~uN NF 1}9<t,R@tBt 4UYGƒ~uF$ FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }8~y UVu CV€tu ,fNV~hu>5lDYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv- =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E 'U :t! EE E 8U uuuYYEy@Ut8hu=YYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UVW5@YNj5hhYhY}t.U:t&u?YPuV jhTV WYPWV jhPV _^UU Uhhuu USE] ![]USE] ![]USE] ![]UVW}u M UW}0))ϊE tu1_]XG_] UVW E_^] UVux95 X^U$UUEPjjS U$UUEPjj3 U$U UEPu YYEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu0 YYU UEPjjK ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U h; }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEvuVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1- / 0 1 2 3 !,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuRYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEШUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP6YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPRYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhhnYYjJYUVuYƋU rU MJwU uR9YY^U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPifdef: could not malloc ifdef: could not malloc %s Undefined %s Defined #%s%cendififndefifdefifndefifdefundefdefineB#%s%cendifelse#ifdef %s%cifndef#ifdef %s%cifdef#%s%cif#undef %s%cundef#define %s%cdefineUsage: ifdef [-t] [-Dsymbol] [-dsymbol] [-Usymbol] [-Isymbol] D9 I U\ d t ifdefrtD:d:U:I:: option requires an argument -- : illegal option -- --WaDrw.+{bq : unknown error% @"X bdiop ux  #+-0"L h l E"Gt"X!b!c["d"e"f"gt"i"nC!o!p!r"s!u!x!(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point < SSSSBPh Unknown errort`PD xdP<(lXD(xdT@,C   HJ1$T$L su;SSSSu QRP PU,VWƅhhP PPx YZ֍9v N> uDžPtF>h>/u&~Wt~wuBhLPWZY>tuBVPWZY>tuFDŽP YyE hD0YY uaS YtjD YY/ YPh4- YYh YhYj YuE h0YY Yh WYYu] h3YYJxX@ Y=g u-Jx hj YYJxmhWYY[jYP Y9tu1_^UuhXh u YjYUV5Nx  ^U=tulYUVW1}y11<t,|1Fρ(1E E `U :tE E jYEu1EttEUMJUzUBUE_^UVW11}U9u F߃| jugYtUr YtURtUzt r Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvZ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<t,R@tBt 4YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }Z~y UVu CV€tu ,fNV~u>5L Yt.hYFu NLNHF 9hRYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv5 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu h UVW5lYNj5hYhY}t.U:t&uYPuV jhV WYPWV jhV _^UU Uhuu ;SkCBUV U9 wU 9 vl 16VYt1' rF5 &Y5 ^UVW}u1E}UUsl 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95 ^U$UUEPjjg y Up1UVW5pp}׃}~9r }y 9vWYu_^UVWuU VVu] YYDžt~~yVډlF_^U$UUEPjj U$UUEPjj UVu x~l 5ju]YYy9uuVYVju5 ^U2u u ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u slKVYE=ul&UEUUU}׋U UE8t=+UEEE0YE܋]P3Wu }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGu}YEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E G UUU UEPj7j ^U$EPjj U$EPuYY1ۅÉU$UUU UUUEPjj7 yEU$EPj*j yUEUMJ1U$UUUUU UEPjj Uu hT$u U$EPjj y}tUEEU$UUUUU UEPjjO UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEFuVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U<UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UluJxUʋFF VuBYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEeE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP&YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPBYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MUUas U EUh|h:YYjvYU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u PK1ۇ tPXPfdopenrforkNo finger program found /usr/bin/fingerpipe-lfinger%s: arw+b : unknown errorE @BX; = > ? +bd"i"op+u"x+ #+-0 LhlEGXbc{d=efgi=ncoprsux(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point @(#)in.fingerd.c 1.1 87/12/21 SMI ((((( AAAAAABBBBBB SSSSBH Unknown errorthL<$pdL<0 |dT<, ttttttttttt\@, t\L8$C  d1$T$Lsu;SSSSu QRP}P*U}}}}}}},~P~UhhfY1UVWE<h JfYh?fY14:tN~juE*E u6hYZERP6heGu heY1뫅t heYheY1_^UhЀhDeYY1UVhЀhЀhYZ‰NЀt> t> t tNܾЀ>tuPi;YF>tF>ttFE0^UhhhЀa ujj hЀgYYZu8Y1U0hhdYUV=؂EPGfYEP*Yu u=}tP~~lVN^PhR6vvv 44hP`d4PfYPP5؂e ^U}tԂЂ؂UVW&hhd7eYYЂhhP!eYYԂjYhDhHYYEP;eYEP)Yh~h${cYYV lN^F46vvQ4v 4h=c$h h^YhOj6YYh dYEPYt=0{hbYkjcY4:t7hЀeYYt:t uWYEhЀhbYYEh ]Y}QjV&Y_^U=}u5|]bY1U}}jPuh~d =~uhbY1}h~haYY1U VWE~hW&dYYu=}t WVYƅu EwhWcYYtJvh_RYYPvcYYuEvu u  F FF멃} uh hZYYh Y%fEh YEPEPhNZ WzY1_^UhuhЀ\ EPpYhhЀ^\YYthhЀI\YYuhhЀ4\YYPuYYhЀhxYYY1U$=t1EPu6[YYt"5-YPu5yY 1WUthVYY16UU܃=}uEPuYYt1uhYYY1UVWU:WEPZYEPYf}f܂܂ ܂ Q5}6YPh~hX5hXYYV lN^F46vvQ4v 4hTX$f}f܂܂ ܂ Q5}H6YPh X =}u hpWYh~h\WYY=}uD<PhLWYYh(WY15t1uhWYYuh \YYDžy hpWYMjh WX E=u,= u h@WY Ph+WYYWVYhWY1_^Uju7 YYUju& YYU*UPh0 VYY%UPh VYYU61UhL VY1UUztRh VY1U}h iVY<}h RVY%UPh >VYYU` 1U(hPKh Ytu uh PUDž Dž DžPVYy Vy"VYsVY=pPVYjHVYjh VYYj4VYYj%VYYVYPPV jYUYUuUY=u1#jEP5ZV E1UVWjuUYYEy(5(YPu5TT 1h h uU ƅ~:E ~Vj uU EtGJ+E)؉ƋUUυuE 8uTY1,5'YPu5S uTY_^U VWEPu2UYYu.Uthx tSY1}=t%5v'YPu5>S 1OhuhfU ghfhfUYZ1f?.hp W-UYYu^hh WUYYuFhd WTYYu.h\ WTYYuhX WTYYutEPhfSYYt .1OGu$5a&YPhf5'R ;t tu!Uth< QY1 E f_^UVWEPu#YYEEh "U:/[U:/uEE` E EzP >0 7 0 ) " 1l Ezt)uuVhdZQh hdYYjupRYYDžy5)%YPu5P _^U4VWgET uhP YYƅ5$YPu5P EH uh@ LYYƅ5$YPu5KP UUuTYƅyuYPh8 WYYTurYPh0 ?YY=}t5jYuKYPh( YYjY l E yy ==}}E9UEjh VP Ey95#YPu5OO V{Yb}tb= uEj5V[P E=u95#YPu5N VY9Ut15uh N VYzuh vNYYh IY2 tVY1=}t } t} u1EEEPOY@E`h h VpO EE}YE UIM~EE܊M} u GEMG9}wЉ-@Ph@5,^O @uh 5,AO a@v-@Ph@5,O EPNYVwY5,BNY,U9UuEkEdU+U11E}y h LY dEERPh L 1_^U8VWJt UU#E'EEAEA \ E u=tEhuuM Džy(5l YPu54L 4uYPh@ PYY==}}E9UEjh W=M EЅy95YPu5K WLY{ }tb= uEj5WL E=u95|YPu5DK WGLY 39Ut15uh K W LY } uuh JYYuh JYYh EYxtWKY1EE@E`EPLYh h 5,K EЅE=}mE UЉIMЅ~EEM}tE} t F} u EMF9uw-@Ph@WK @uh WK J}t F@v-@Ph@W]K EP1KYWJY5,JY,U9UuEkEdU+U11E}y h 8IY@h +IY} uuh IYYdEERPhp H 1_^U$V1}:V JPhH hdHEPhdSJYY=udF뾸d^UVu>/uVhd h`H VhEPIYYuh` EPwHYY}uVh\ h`_H VEPhT h`FH`^U0VWt1h YEuE=,x 5,HYju IYY,y,5GY5YPhlGYY1"E0}Uf܂܂ ܂ فfMG I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m f܂܂ ܂ فfMEPh0n@5,AH ƅyB5FY5 YPh<FYY5,GY,1OEPh1n5,G ƅyB5FY5YPhzFYY5,yGY,1}fUfUEhGyB50FY5LYPh FYY5,GY,1=gEh,FYEPh3n@5,G ƃu!= uUЉAMЃ  j2GY붅y jm Yjc YEP GYjGYU9FhX*jYYjFFYEPh1n5,yF j%FYt jFYfUf܂܂ ܂ fUf܂܂܂ =%P$ ȋ ‹  с=%PÇ$ ؋ ‹ Ӂ=%P$ ȋ ‹  =%PÇ$ ؋ ‹ PPh pC1_^UVWuE1}9VYU‰Uj,VHEYYƅu5!CY1FGVKY%fEj,VEYYƅu5BY1FVY%UfUU  ً ʋ  щ }fUf܂܂ ܂ فf }h9BY1_^U0VW=,hX*jYYj BY=u+jEP5C 95t yՃ= ujBY=t%j 5BYYjEP5TC =t75uAYh4jAY5,jBY,-y75:AYh/AY5,/BY,Ut;5@Yuh@YY5,AY,UʉMԅt;5@Yuh@YY5,AY,d1]hoYDžujWAYY,y/5E@Y5aYPh-@YYE }Uf}fUf܂܂ ܂ فfMEPh0n@5,@ ƅyE5?Y5YPhX?YY5,@Y,VEPh1n5,@ ƅyE5J?Y5fYPh(2?YY5,1@Y,EEEPh2n@5,*@ ƃu!= uUЉAMЃ  jZ@YyB5>Y5YPh>YY5,?Y,aEPh1n5,? ƅyB5U>Y5qYPh=>YY5, Eyh|=Yh 8YjFYU}fUf}U}fUf}jjh}  ƅu75}NYPhx=YYhT=Yh 38YjYh6hu? π^UUVuj jV ^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5Nx ^U=tu<YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWgEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh\u%dEuEu1k0Z‹N9:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP`>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW8YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWWL8YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhh7YY_U U  V7Y=VhhT7YYVhhwYYƅ>-uF>+uFjVEP ƅUUj hh57 1hVhhYYƅpj hh56 h>t>,tjVEP ƅt5U>t'>,u"FV6Y=xwVhhYYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J\4EU M R+Q¤ЙЙUuW +UЙOIkkE0\UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUas U EU8VWEU UUUUfRf܂܂ ܂ ىM؋UfRf܂܂ ܂ ىMEjEu }}`uuVuusDžyd1W΋Uju_+YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt d d1+EjEjjEpiEjpiEM9uuuVuucDžVY YEVL YEV? Yǃ}u@ց}jsUEEu!*YljUUU)U]}tE} u?uuVuuDžy +֋Ujj}u}t }t&9= jt U9UtQ= jUŨ}u1j}u Ujuu<)YZЉEE1UUns-UEȉEWVRk( UUE;}tEEj d1_^UVW}-0= >N>.WYn=ud1=jjjjj jpintijpijX-0= r>.uF\hPjjWn y1jPi _^UVW}}t1PGPGPGPhP %hPj jPEy1HjuP ƅu1*UVU V pintin_^U Vjh%YYƅyHu uV% EV>%Y}u"U JUj u$&YYEt1^UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU EK} tF=  ً ʋ  ыE _^UVuFPFPFPPhhn!n^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UJ}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!,H+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UD6G>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWpu"=u hPjjjuu uj^&$ƅduuVPƅyd}Gu^fWf܂܂ ܂ uL0d7d+ddW\ME_^UVWEpu!=u NduE>t >.uEF}u)uYƅtuuuu V_}u p€u$}N>.p?quuuu 7uE~=;udl=duE=dt =dupt놃}t"uuuu ju%E~}t d_^UVW}} uBWY-Ɖ:.u#sVWP  Ƅ5*"u hWhhPuuuu_^UVWhYEthuYYEu1EuhPN >tuF>nuP. YYuFu>tDG?tuG1҈ohVhny ujYn uZY1_^U@VWEEEUUЋUUE=puA=u pu } ~1EUffUEl9UYEt9U;}DžlU=y2UMEPUP4xw =#U f܂܂ ܂ فfMjEP5 =t$U5]Y^u u5 9E t$U5Y}fEU܅t2EPW5H ƅ~U)fUU܅tBU5Y}<}EM}ff܂܂ ܂ ىM9M}#UfUDž #UfUU܅t2EPW5l ƅ~U)fUU܅t$U5YUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yyU'UMUP4xu u5(9E MhUԃ}~ Eԙ=tEԃ}Euuu5E=u=EEUM9up u+UBt"5GYE}tpt}u pu5YEaEE=x5Y}u}u ;= Uȉ_^U=t5sYU$VWhHYDžujWYYƃuEE1UUfU fUEPh0n@V. E=uEVYGEEPh2n@V E=uEVY E_^UVWuut.Vu u' Dž U)U U )΋E_^U VWh(YDžujWpYYƃuEE73EPh@n@V* E=u UVYU_^UVWURYƅu wUWfUfW fG #UfWuu FPM URVu EUVuY}r UUUE_^UhVjYYjYUVWUR YDžu hVj{YYEuYEURWu ƋUxw7~1WYj]Yuj"YYuHYU@RGPu ( WqYjYujYYuY_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^UVWoUUU UEEFt suWEEFt su:EPY(-oPhou uYuY}tjuYYuY}tjuYYuYjhh hhojD j^Y~Eq7uaYjEPu" x}t u=YKhhou uYx'Ƽo1ov N>uGuoU 5ooo_^U=x 5YU=x=su sj5sYYy'j5YY Pj5 1U^UsUxw=u/hhs5 1Vxs=xxu1< xxxx= uxwUxUxUx:u1x: t x::uҋUEUV=yy1u1xtxxtjƅtjjV fxLƅtjjV x/xt!xyxgx:Xx^UV%ƅt F9Eu^UV{ƅtu62 YYu[^U$UUEPjj; U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0d YE9uvEEEE͋UUE8t(0+ YE9uvEEEЃ E V!փ}u sKVPYE=u&UEUUU}׋U UE8t=+UEEE0v YE܋]P3W }׃E뻋EEUUE8t=+UEEE0 YE܋]P3Wy }׃E뻋EEU9vGu YEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E 1UUU UEPj7j2 ^U$EPjj U(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$EPj*j yUEUMJ1U$UUUUU UEPjjS U$UUU UUUEhEPjGj  U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$UUUUEPj jE y} tUE EU$UUUUU UEPjj UVW11}U9Pu PF߃| jugYtUrnYtURtUzt r: Y}t} t}8t u Y_^UVWuEu41}%uNN FFSX_^UVWEE11}t Exu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=x<9}r79}u+UOJ}t ExURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15xt 9ur6E0tU UxtU9ru NJEtU9Wu RWE_^U VWDžDžhlptjhBYYudg#Jfh製YƅthVh hhYYE(uhP3 jhP= _u> t> uF>t> thVh j hYYƅtDždjhP 9> t> uF>> hVh j hpYYƅt7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj hP Q=tD> t> uF>(> txPVYYtff UtuY=tu"xfft=u=hPYYu&j.PYYƅtFPh4YY]E>t >.uEF𾌃}|sj.VYYF7M p1_^Ut3FuF>t>/uEu YyUȋU1^UVW}t} w1?Uu NEPh0+YYy1E,EPu YYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWnYEu=+WYWbYVY1_EEAUh(R(YYtUh$R YYuP[UM9uMh vPYYURyPYYEPvPYYy EUM9E]9uUREPu yWgY"VY1dWHYuYy VY1EuEPEP VeYy1>uN/9us VuYYE_^U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjj yEU$ufYEU UUUEPj'jH U0VWEPuYYy1U؁@t1huYYDžy1EPWYYxSU؁@u7jW YYEx& PjW xh$+YƅuUW:YUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uBYEu 1YEUUU UEPj&j UjuOYYU$EPuYYEPj(j U$EEEPj.j U$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj Vy y5yhyjKj ^UU$VWEP YEPEPj j@YƋ}t9uvE|EP YEEPEPj WYUUjEP} YYEP YWjYZ)‰jEPjN jEPj^ t9r)օu j YVYU)_^U$uYEUUU UEPjj U$EPj j y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 4c}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EELuVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEtUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }c~y UVu CV€tu ,fNV~ u>5$Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvx =tN V@FF t V 9ډUVVFt$jjvy =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^;C3USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]L$ 7U}x}~u:PxYYUh|h8YYj肟YUVW5YwDžD7uYYtw>t6uYYt} tu w YYu=u_^UVuu TfFV V#U UU +UVjvP =uU 9Vs VYu1^U}u UEuYuYU$UUU UEPjj U$EPuYY1ۅÉU$} uEEUUE UEPjJj} y}tUEEU$EUEPjHjA Uu hT$u) UUUuuu U=uhhYY 5YU U=t5YUVW=u!hh{YYu1D5hh$y Eu1U:#thu YYƅtU(}huYYEtEU: t: uEhuYYƅjFu{Y%f܂܂ ܂ ى 0}54}8},}hVWYYƅtFt8>t3> t> uF}s7hVYYƅtF(}_^UVW}Utu >t]9uFG1_^Ujju E`UVWu1fϋV€t}u ~tu>FtV9YU )uRv EVt tfVV}u1_^É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Ps1ۇtPXP0.95SatFriThuWedTueMonSunDecNovOctSepAugJulJunMayAprMarFebJanXRMDXPWDXMKDXCWDXCUPUSERTYPESYSTSTRUSTOUSTORSTATSMNTSIZESITERNTORNFRRMDRETRRESTREINQUITPWDPORTPASVPASSNOOPNLSTMODEMKDMDTMLISTHELPDELECWDCDUPAPPEALLOACCTABOR200 NOOP to you too! 214 That's all the help you get. %s%c%s Those with '*' are not yet implemented. 214-Here is a list of available ftp commands 502 Command "%s" not implemented! 421 Inactivity timer expired. %s %s %2d %02d:%02d:%02d %d %s %s %s %s 500 Command "%s" not recognized. 221 Control connection closing (EOF). %s, %02d %s %d %02d:%02d:%02d %s 220 FTP service ready on %s at CONNECT/usr/adm/aftplog/usr/adm/ftplog530 Not logged in. 331 Password required for %s. 501 Bad user name. FAILLOGINftpftpanonymous221 Service closing, don't be a stranger. 230 User %s logged in, directory %s. 230 User %s logged in, no home directory. PASSLOGINFAILLOGIN530 Not logged in, could not chroot. FAILLOGIN/ftp550 %s %s. 202 ALLO command not needed at this site. ..250 %s command okay. DELE250 File "%s" deleted. 215 %04d%02d%02d%02d%02d%02d 550 Not a regular file. 1 S s 501 Unknown mode %c. 200 Mode set to %c. MKD 257 "%s" directory created. 257 "%s" is current directory. 350 Next file transfer will restart at %lu. RMD 250 Directory "%s" deleted. 350 Got RNFR waiting for RNTO. RNTORNFR250 Renamed %s to %s. 550 Rename failed. Error %s 550 Rename failed. 201 CRC %05u %ld. %s501 Could not obtain CRC. 201 SITE CRC DONE. 201-SITE CRC "%s" 501 Could not obtain CRC. crc501 Unknown SITE command %s. CRCCCRCCRC215 %lu 550 Not a regular file. 211 End of status %c Could not retrieve statusls -lA211-Status of %s: 211 End of status BinaryAscii TYPE: %s Logged in %s Not logged in Connected to %s:%u %s, %02d %s %d %02d:%02d:%02d %s Version %s 211-%s(%s:%u) FTP server status: YFDfD501 Unknown structure %c. 200 Structure set to %c. 215 UNIX Type: L8 AIai501 Invalid type %c. 200 Type set to I. 200 Type set to A. 501 Syntax error in parameters. /dev/null-c/bin/sh%s %sTZPATH=/bin:/usr/bin:/usr/local/bin550 Not a regular file. .gz.tar.gz.Z.tar.Z.tar550 Not a regular file. mmm%s compress -dcq %s%s gzip -c %s%s tar cf - %s | gzip%s compress -cq %s%s tar cf - %s | compress -q%s tar cf - %scd / &&c226 Transfer finished successfully. %ld.%02d KB/s 451 Transfer aborted. 150 File %s okay. Opening data connection. 550 File restart point error. %lu not %lu SENDSENDFAILls -lALISTlsNLST%ld.%02d KB/s Unique file %s. 226 Transfer finished successfully. 451 Transfer aborted. 150 File %s okay. Opening data connection. 150 FILE: %s 550 File restart point error. %lu not %lu RECVftpd%d%d%s/%s/%s???%s425-Could not open data connection. 501 Syntax error in parameters. 227 Entering Passive Mode (%u,%u,%u,%u,%u,%u). 425 Could not fork listener. Error %s 425 Could not NWIOGTCPCONF. Error %s 425 Could not ioctl NWIOSTCPCONF. Error %s 425 Could not open tcp_device. Error %s /dev/tcpTCP_DEVICE200 Port command okay. 425 Could not ioctl NWIOGTCPCONF. Error %s 425 Could not ioctl NWIOTCPCONN. Error %s 425 Could not ioctl NWIOGTCPCONF. Error %s 425 Could not ioctl NWIOSTCPCONF. Error %s 425 Could not open tcp_device. Error %s /dev/tcpTCP_DEVICE425 Child listener returned %02x 425 Child listener failed %04x 425 Child listener vanished. 425 Child listener timeout. 421 to your host name. Closing. 421-FTP service unable to translate your IP address (%s) 421 FTP service unable to get remote ip address. Closing. unknownSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error%u.%u.%u.%u.in-addr.arpa/etc/hostname.fileEEDDD%d.%d.%d.%dFE@FHHHGIHNIKKKKJKK%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEYXXi_B_i_B_i_B_O_O_O_fa frewebf+Cfb9fNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainsq=sGw www{ww../...... ~@~Xbdiopux #+ۀ-ր0LɁhlE}GhXӂbӂcOde}f}ghin7oӂpӂrsuӂxӂ(null)cannot print floating point r/etc/services ,/ # r/etc/services}$  TPLHD@<840,(j|jtdlvd`XPHY@t<Z 4 , $; # 2jk  I p j.?|tlZ d \ Xt h ((((( AAAAAABBBBBB GMTGDTU U 4,$ xph\TH< /usr/lib/pwdauthSSSS/etc/passwdB 8Unknown errorl\D8l\P<, t\L@0|`L@( |lXDC  pm` m`1$T$L su;SSSSux x QRP% P UTVWE1E % jh|j>  jjb YYjhxj> jjF YYEEp}znU  0EPh| s>YYE=t?E}},E􊈔 jh| >YYE=uE΃}uE눃}u5%hd<YYj YU E􊈔 jh =YYE=u-5 YPh 5%hD5<j Yu5YE==E=u(5 YP5%h(; jq Y}u7u<Yujuh h h$h uYYu<Y<E=u(5 3 YP5%hu; j Y}juj<YY1uhh&j< ƅ~-&VWj< E܅~9u}׉+U܉j <<PF<YYuh u} j;Yju;YY1u#hh&j< ƅr&uVhWM< EЅt')Eu VW'YYE؅t}׉+U؉uWj; E܅~9u}׉+U܉lj u};YYuh u 1_^UVWuYl;ju R;YYǃu+5 YPu 5%h,9jLYjh ;YYE=u+5 KYPu 5%h9j Y+%=+t =*t *u6:Yu-:YtjW(:YYW:Y1jW:YYjW :YYh +h+h9 = uh +h+h9  Uhj-YYEt)uDYP5%huc8u3Yj\9Y_^Uujuu hThX#jju C9 hu +9YYUYDžtUȀ:u}}܍EPju.7  + +_^UV1< tU9 u  F1^UVu vVuEP 7 })RD5PQYY}t1?})RD5P+YY}su}st1 s )RD5PYYjEPEP6 fUf<+<+ <+ فfMfUf<+<+ <+ فfMfUf<+<+ <+ فfMfUf<+<+ <+ فfMEPhT@j5 ^UVWu t$Vuj5 Dž~UU)_^UVEPh1nj4 Ey-5 YP5%hh 53jYjjEP{ ƅuuP YPh 3YYjYh6h%5 &1ۅÉ+^UhjEP hjh*p hjh*\ hh :5YYhj;h 7 h*+YEuh*h*jh%(U jEPj3 =t5 h(jt M yjuj` UM E}uU} tEEPh6n@j3 =u5 UYPh4h x1 UV5 Nx @+^U= t uD2YUVux95xXl^UVujuu V!^UVujuu V^UVWuEEEu} tE 0YtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U8VWEU UUUUfRf<+<+ <+ ىM؋UfRf<+<+ <+ ىMEEu }}`uuVuukDžy+1W΋U<u;1YljUUU)UVuVYYZMԃ}~DVuVYYZ߃}t&UBt + +1+EPE@PEȬELEM9uuuVuu[DžVQYEVDYEV7Yǃ}u@ց}sUEEu/YljUUU)U]}tE} u?uuVuuDžy +֋U<<}u}t }t&9=Ht U9UtQ=HUŨ}u1D}u U<uu/YZЉEE1UUs-UEȉEWVR- UUE;}tEE< +1_^UVW}-0= >N>.WY=u+1=<@PPDHL<X-0= r>.uF\hPjjWfy1jPi _^UVW}}t1PGPGPGPhhP*hPj jPEy1HjuP ƅu1*UVU V _^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEYDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s Yu1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E3W} tF=+ + ً+ ʋ + ыE _^UVuFPFPFPPhh'^U@VWEuC(Ef#M сf }|h`p*YEuETE0XYEu!]3h@h & EEEJf} fju(YYDžy'5 KYPuh(h k&7E!ff<+<+ <+ فfM#U fUURUEPh0n@Wa' ƅy9= :u W'Y5 YPhh % EEPh0n@W ' ƅy$5 ]YPhh % LEEPh2n@W& ƅy= uj&Yy = tʅy-= :t$5 YPhh % y M}0}uhh $YY}u?jhW& =/5 xYPhh $ gju&YYEy'5 AYPuh|h a$-E"ff<+<+ <+ فfMEPh0n@un% ƅy$5 YPhXh # %EЅy$5 YPhDh # }j$YjjR*YYj$YEEPh3n@u$ ƅy= uj$Yy = tȅy0= :t'5 YPh h # jYx jYjYj$YPhEP%# EP%YPEPW$ PEP%YZ9t$5 mYPhh " \ud%YPuW,$ uI%YPuW$ u.%YPuW# jEPW# =t$5 YPhh " }t5jEPWo# =jEPj# } u}UEEPh1nu# ƅy!5 WYPhh z! IfUf<+<+ <+ ف|hh 4!YYxWN"Y}x u?"Y_^U8VWDžDžu>tF>.uu +UFG-A=s FP'YFG} t1h|hYYE}t;uuPuuuY1uY= u } DžuYu rP"YYhpP)"YYhlP:YYEu]UPr YYu0tB9uuY_^UVWuhP > t2> t-> t(>t#-A=s P &YFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPu#!YY/1_^UVW} }uWu YY1ۅÉ uWu! t1Wu YYu U:t1= tu w x y z { | } ~  1= hh%%YY=u 1j.hXYY u 1T  ր>t-A=s Pq$YF݋UUR5 YY1ۅÉ_^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UPK}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!KI+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U~H>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW+u= =u hPjjjuu uj#$ƅ+uuVPƅy+}Gu^fWf<+<+ <+ uL0+7++++WF_^UVWE+u=u N +uE>t >.uEF}u)uYƅtuuuu V_}u +€u$}N>.+,?quuuu 7uE~= ;u+l=+uE=+t =+u+t놃}t"uuuu ju%E~}t +_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhPuuuu_^UVWhYEth uYYEu1EuhP >tYuF>nuP. YYuFYu>tDG?tYuG1҈hVhm uY uY1_^U@VWEEEUUЋUUE=+u=u +u } ~1EUffUE+9UYE+9U;}Dž+U= y2UMEPU+P4+w =#U f<+<+ <+ فfMjEP5  =t$ U5 Y ^u u5  9E t$ U5 Y }fEU܅t2EPW5  ƅ~U)fUU܅tB U5 OY }<}EM}ff<+<+ <+ ىM9M}#UfUDž #UfUU܅t2EPW5  ƅ~U)fUU܅t$ U5 sY UJÜJU+UfUU܅VU܁vE܉VP5 V ƅU)fU멃= y y U'UMU+P4+u u5 (9E M+Uԃ}~ Eԙ=+Eԃ}Euuu5 E=u= EEUM9u+ u+UBt"5 Y E}t+t}u +u5 Y EaEE= x5 oY }u}u  ; = Uȉ _^U= t5 Y U$VWh( YDžujW4YYƃu EE1UUfU fUEPh0n@V E=u EVYGEEPh2n@V E=u EVHY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh@YDžu4jWYYƃuEE73EPh@n@V E=u  UVYU _^UVWURTYƅu wUWfUfW fG #UfWuu FP URVu E UVY}r UUU E_^Uh11jDYYj YUVWURYDžu h11jYYEuB YEURWu Ƌ Uxw7~1W7Yj YujYYu YU @RGPu WYj Yuj\YYu Y_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPAYNjE E P/Y9uuąt9}t t1_^UVW1}y11<t,|1Fρ(1E E L9U :tE E lt9jLYEu1EttEUMJUzUBUE_^U= x 5 5Y  U= x=u  j5mYY y'j5 YY Pj5  1U^UU = u/hh5 X 1V= u1<   = u U U U :u1 : t  ::uҋUEUV= yy1u1txtjƅtjjV fLƅtjjV /t! yg :X^UV%ƅt F9Eu^UV{ƅtu6 YYu[^UVj$Yƅu jYƅu jYƉ^U VWu Yƅu1PjhV t18Et]3VS YYu  G1_^U$UUEPjjK U(VuEEV֋RUV֋RU E ?5UUU UEPj7j ^U(VuU @t*uYEU UV֋RUUUEPu`YYU UEPjj ^U$UUUUU UEPjj[ UVW11}U9u F߃| jugYtUrYtURtUzt r6 Y} t} t} t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuva =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h[YF~uN NF 1}9<t,R@tBt 4YGƒ~uF$FF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E ?0U :t! EE E 0U uuuYYEy@Ut8huqYYE~" tuYuusYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu @ UU Uh uu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj"YYEUuu hu7OsO'7ScCoUW}E MuG_]1_]UVW}u MK%UW}E Mr/u'uĉ fE_].%UW}0))ϊE tu1_]XG_]%UVW)%E_^].%L$ $UVWM$E_^]UW}0OE uG_]1_]UVWx Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV<U9<wU<9<v 16V Yt1'<rF5<&Y5<^UVW}u1E}UUs 1=8u8j Y=u1V!փ585<FE5@OVU}9}r69v2W9UvUW~>}t E@u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=@<9}r79}u+UOJ}t E@URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15@t 9ur6E0tU U@tU9ru NJEtU9Wu RWE_^UVu~  u 6EP*YEU UEPEPV~ yE^UUAs UEUUas U EU VjhH YYƅyHu uV EVY}u"U JUj uYYEt1^U VWDžDž+++++jh V YYu+g#Jfh YƅthVh+ hx h| YYE(uhP# jhp P _u> t> uF>t> thVh+ j h+IYYƅtDždjhh P 9> t> uF>> hVh+_ j h+YYƅt+,7E>t3-s+> t> u E}t 7EFȀ>t > t> tFDžoj h\ P Q=+D> t> uF>(> ++PVYY+ff U++uY=+u"+ff++=+u=hPNYYu&j.PJYYƅtFPh+YY],++E>t >.uEF+}|,sj.VYYF7M +1_^Uu1^UV U P'Yt  :"uR jYƅt(>"t#= u1{  0ʋ :"u; 0jYƅu1C= u13  0= u1  E^U=y _y1Du17jRY tjAY UVƅtu6YYu^UVu0YƋU rU MJwU uRYY^UVWuU VVu-YYDžt~~yVډ F_^UHVWEPuYYxU܁ t1hSYƅu1VGYDžU9uhh &YYh h YYGPh YYEPh YYxU uUM9uE]9pE]9`VY VY1_^U$UUEPjj U$UUEPjj{ U$U UEPu YYEPjjM U$u:YEU UUUUUEPjj U$U UEPuYYEPjj UVu x~ 5juqYYy9uuV5YVjuI ^ULVWE1EEU UE8t+0PYE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0bYE܋]P3W] }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U$EPjja U$UUU UEPjj= U$EPjj% U$EPjj yEU$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjj yEU$EPj>j] U$UUU UUUEdEPjGj, U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UU$VWEPV YEPEPjN jpYƋ}t9uvE8WEP YEEPEPj W/YUUjEP YYEP YWj YZ)‰jEPj jEPj t9r)օu j YVYU)_^U$uvYEUUU UEPjjT Uu hT$uA UV& T$@, T$@% T$@  E 7uVu ^U$EPj j y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE .uVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U4 =EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ud ]JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE ME tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } j:~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvB =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv3 =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^G?GW3USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uRPYYUh h YYj*YUVW5-YDžD7uYYtw>t6uYYt} tu w YYu=-u_^U}u UEuYuMYU$EPuNYY1ۅÉU0VWEPuYYy1U؁@t 1huWYYDžy1EPWYYxS U؁@u7jWYYEx& PjW xh$Yƅu UWVYUЉ 1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$} uEEUUE UEPjJji y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPCYjEPjM V!!5!h jKj ^U$EUEPjHj U=uh< h@ %YY 5YU -U=t5Y-UVW=u!hd hh YYu1D5hh! Eu1U:#th` u YYƅtU%h\ uYYEtEU: t: uEhX uYYƅjFuY%f<+<+ <+ ى $%5(%,% %hT VWYYƅtFt8>t3> t> uF%s7hP VYYƅtF%_^UVW}Utu >t]9uFG1_^Ujju% E`UVuj jV_ ^UVWu1fϋV€t}u ~tu>FtV]YU )uRvO EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP%s: unable to fork: %s %s: unable to fork: %s %s: unable to open '%s': %s %s: out of ptys %s(do_child): unable to exec login: %s w/usr/bin/login/bin/login-f-h-plogin%s(do_child): '%s' didn't result in a controlling tty (%s) /dev/tty%s(do_child): unable to open '%s': %s rlogind: %s. rlogind: %s: %s. Host name for your adress (%s) unknown %s: ioctl(NWIOTCPCONF): %s Terminal type too longTERM=locuser too longremuser too longprotocol violationread failedrlogind: NWIOSTCPOPT failed: %s unknown error%u.%u.%u.%u.in-addr.arpaAZ{%d.%d.%d.%dunable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equiv! T!###[$ $b$0&$&0&& &0&0&%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE`3aR3rJ3wX33+3bz3/dev/7~77~77~7777<a<r<w<<+<b<No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0/etc/hostname.filenameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainLJK/XzXXXY Y@YZXZbZdZiZoZpZuZxZ[ [#[+[-[0[^L\h\l\\EI^G4^X]b]c^d]eI^fI^g4^i]n]o]p]r^sY]u]x](null)cannot print floating point r/etc/services ,/ # r/etc/services%/dev/ptyXX/dev/ttyXX0123456789abcdef/etc/utmp/usr/adm/wtmpTERM=2K n0@P`,pX` %KSSSS/etc/passwdB ((((( AAAAAABBBBBB Unknown error@ 4   ` P < 0   |hXH0 hT\\\\\\\\\\@( lT@(C/etc/ttytab/dev -begrom_do_chil_deallocy_wtmp_setup_t_num2spe]_do_cont_readall _getstr __callsT _string2 _getansw_h_addr__host<_host_alP_hostbuf_host_adI_1__checkhlI_25I_1_dn_find#I_3_s _tcp_con._tcpip_w/_udp_con0_udp_sen0_alarm_h11_udp_recL1_PASSWD _pwfd _buflen _getline4_scan_co85_pwfile_buf_pwline_entry_bufptr_lineptr I_1$failure?slword?sword@sbyte@done@nextE@foundc@failure A_unknown\_growtA__bottom8__top<__empty@_TTYTAB|_ttfd_buflen_getlineM_whiteCN_scan_wh]N_scan_quN_bufD_ttlineD_ttargvD _entry _bufptr _lineptr _argvptr _base_path _handler8W_gnum Y_o_printsY_do_writ\aSENDRECEIVEBOTHSYSVEC!SRCDESTMESSAGE uplword(eupword5eupbyteedownwardEeno0~ecompareedoneeno0eI_1 _servf_anyk_line!_serv%_serv_al,%begtextbegdatax begbsscrtso___mainP__penvirx __fpu_pr%__penvp%__edata_exitm _environ endtextdm_mainT_pty_str| _tty_str _hex_str _PATH_UT _PATH_WT _term _confirm _fatalE_prog_na%_hostnam%_line&_luserna*_ruserna*_authent+_env +_args+_strerro _fork?_memchr?_write?_memcpy?_strrchr@_setsidP?_tcp_urg _fflush8_tcsetatp?_getppid ?_close>_chmod>_timex?_strtol _strncpy@_ioctl(?_errno __exit>_strchr8@_execve?_authentL _kill0?_dup2>_sprintf>_printf=_readH?_fprintf=_tcgetath?__tmp<+_chown>_open@?_stat`?_lseek8?_memset?_fttyslo6_fdopen3_do_rlog _ruserok___stder _strcpy@_getpwnat6_inet_nt_gethost"___funcc __clean ___funct@+__sys_erl__sys_nex_strtoul ___ctypeX_gethost_h_errno+_res_que@%_strlen@_inet_ad__getsho$_dn_expa _dn_skip#_res_sea\&__tmp_l+_inet_at .csa4l_rcmd<__check_ __validu_getpid?_alarm>_sleepX?_index?_tolowerD_strncmp@_strcat(@_fgets:_fcloseT8_fopenL<_fstat?_signalD_strcmpx@_getenvA_gethost(E_dn_comp!__getlon$___putsh$___putlo%.csb4m_res_que'___hosta(_res_iniE_strcase@2__res+_res_mkqI_res_sen)__res_cl._freeD_mallocA_strncas2_toupperE___iotab_endpwen3_setpwen&4_setpwfi4_getpwen5_getpwuiM6__read(8__open7__fcntld7__closeD7_ttyslot6_ttynameP_endttye M_getttyeO__syscalP__loadnalP___stdin ___stdou ___cleanj:__lseekV__writeX___fillb;__creatR__doprnt[_snprint*>_vsnprinL>_vsprint>___flusha___exitQ__alarmR__chmod4R__chown`R__dup2R__execve$S__fork4U__fstatLU__getpidpU__getppiU__ioctlU__killU__setsid8V__sleep=W__stat$X__tcgeta\X__tcsetatX__timeX__memcpye__strnca`e__strncme__strncpe__strnlee_reallocB__sbrkL__brkL__sigactPV__sigempV_getservHf__brksiz_setttyeNM_getttyn=P__sendred_readdird_opendir|d_closeditd___sigred__sigaddV__sigdelV__sigfilV__sigismW_sigprocd_sigfilld_sigsuspd_sigactid_raisef_sigemptd_sigdelsd__f_prin(f__i_compd__isattyf__closedf__opendig__readdih__sigproi__sigsusi__sigreti__sendd__receivdendbss -__memmove__fp_hoo__serv_s-_endservGj_getservuj_setserv j__sigjmp`i_rewind(l_atoiDl_fseek\lECASE.fat8m.stopDm.trpLm.trppcERANGEESETEIDIVZEHEAPEILLINSEODDZ.ignmask__etextdmendromx enddata__end -x  -  a\?L1$T$Lsu;SSSSu< < QRPL% P" UtVWE x5}t#u5x5hDhP8jYjjW YYjjL YYjjA YYEPh1nj9 ƅy35 YP55x5h hP.8juYfUf|Q|Q |Q فfMUʁ} Uʁ} EP5x5h7 j Yj<8YfEjEPj 9 ƅy+5YP55x5hhPk7jY}tUk ]Ã0f]jG8YUȅfu8EEU#M щM}}|EM}}EjhG8YYEąy35YP55x5hhP6jYuYE!#Uf|Q|Q |Q فfMfUf|Q|Q |Q فfMUUEPh0n@uh7 ƅtR=:t35YP55x5hhP5jYu6YM}}uh5YjYEEPh0n@u6 ƅy35YP55x5hphPG5jYEEEPh2n@u6 ƅtT= t<=;t35+YP55x5hLhP4j!YMt jg6YjjEP Euu} YPh 4YYjYhjhh58 hjhX5$ hhhT%  a*hX5,YDžuhL4YjuY *w25Yy h#5YEhX5hh5j0yh3Yj(YUȅ,Y5E5EyG= t+5YP55x5hhP3h3YjY}^j4Yjz4Yjjx4YYjjm4YYjEPu4 jtYEEUPRw4YYȍEPz4Yƅy"h 3YjA4PK4YYj'Y4EyV= t+5YP55x5hhP2ht2YUjR3YYjY}u3Yhh|5u3 ƅju3YYjYE|5~Vuu3 EB59YP55x5h\hP1UjRD3YYj Y+Uu2Yu2Yju2YYu2YW :uG TGP3YGP3YhPYEj:whT 3 j9w h 3 j7h@ 3 }thuh 3 j/w 3YYEtEW UUȅu jj2YYjhLjr2 jhT%hHuw 1j1Yjh< 2YY5YP5hT%uw 5x5hhP`0 j1P1YYjY_^UjEPj1 =tjoYUM EM uuhh 0YYjHY}uUju1YY Pju 1 UV5Nx Q^U=tu0YUVW< Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVu~  u6EP6)YEU UEPEPV( yE^UVux95x^U8VWEU UUUUfRf|Q|Q |Q ىM؋UfRf|Q|Q |Q ىME Eu }}`uuVuukDžyR1W΋Uu+0YljUUU)UVuVYYZMԃ}~DVuVYYZ߃}t&UBt R R1+EEEEEM9uuuVuu[DžVQYEVDYEV7Yǃ}u@ց}sUEEu.YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u Uuu.YZЉEE1UU!s-UEȉEWVR'- UUE;}tEE R1_^UVW}-0= >N>.WY$=uR1=$X-0= r>.uF\hPjjWfy1jPi _^UVW}}t1PGPGPGPhP*hPj jPEy1HjuP ƅu1*UVU V $$_^UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU EO} tF=R R ًR ʋ R ыE _^UVuFPFPFPPhh(?'(^U@VWE@uC (Ef@@#M сf @}@|hYEuEtE0XYEu!]3h`hPO& EEE@Jf@@} f@jun'YYDžy'5YPuhHhP%7E!f@f|Q|Q |Q فfM#U fUURUEPh0n@W& ƅy9=:u Wq&Y5pYPh$hP+% EEPh0n@Wq& ƅy$5-YPhhP$ LEEPh2n@W.& ƅy= ujU&Yy = tʅy-=:t$5YPhhPz$ y M}0}uhhPL$YY}u?jhW% =/5HYPhhP$ gjue%YYEy'5YPuhhP#-E"f@f|Q|Q |Q فfMEPh0n@u$ ƅy$5YPhxhPM# $EЅy$5bYPhdhP# }j$YjjYYj$YEEPh3n@u<$ ƅy= ujc$Yy = tȅy0=:t'5YPh@hP" jYx jYjYj$Y@Ph<EP" EP$YPEPW# PEP$YZ9t$5=YPh$hP! \uT$YPuW# u9$YPuWi# u$YPuWN# jEPW# =t$5YPhhPm! }t5jEPW" =jEPj" } u}UEEPh1nuk" ƅy!5'YPhhP IfUf|Q|Q |Q ف|hhP YYxW!Y}x u!Y_^U8VWDžDžu>tF>.uu +UFG-A=s FP'YFG} t1hhjYYE}t;uuPuuu=Y1u-Y=u } DžuYu rP!YYhP!YYhPYYEu]UPrD YYu0tB9uuJY_^UVWuhPj > t2> t-> t(>t#-A=s P&YFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPu YY/1_^UVW} }uWuYY1ۅÉ uWu t1WuYYu U:t1=t1=hh<5%YY=u1<j.h<YYu1Tր>t-A=s P$YF݋UUR5YY1ۅÉ_^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UC}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!A+U_^UVWUUU9Uu E8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U@>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWRuM =u hPjjjuu uj$$ƅRuuVPƅyR}Gu^fWf|Q|Q |Q uL0R7R+RRW ?_^UVWERu-=u NRuE>t >.uEF}u)uYƅtuuuu V_}u R€u$}N>.R,S?quuuu 7uE~=;uRl=RuE=Rt =RuRt놃}t"uuuu ju%E~}t R_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhh Puuuu_^UVWh0 YEth,u YYEu1EuhP: >tuF>nuP. YYuFu>tDG?tuG1҈ChVhDm uVYD uFY1_^U@VWEEEUUЋUUE=Ru=u Ru } ~1EUffUE R9UYER9U;}Dž RU=y2UMEPU$RP4Rw =#U f|Q|Q |Q فfMjEP5 =t$U5aY^u u5 9E t$U5Y}fEU܅t2EPW5L ƅ~U)fUU܅tBU5Y}<}EM}ff|Q|Q |Q ىM9M}#UfUDž #UfUU܅t2EPW5p ƅ~U)fUU܅t$U5YUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yyU'UMU$RP4Ru u5(9E MRUԃ}~ Eԙ=REԃ}Euuu5E=u=EEUM9uR u+UBt"5KYE}tRt}u Ru5YEaEE=x5Y}u}u ;= Uȉ_^U=t5wYU$VWhHYDžu<jWYYƃuEE1UUfU fUEPh0n@VB E=uEVYGEEPh2n@V E=uEVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh`YDžuTjWtYYƃuEE73EPh@n@V> E=u UV YU_^UVWURYƅu wUWfUfW fG #UfWuu FP URVu EUVY}r UUUE_^Uh%-jYYj YUVWUR1YDžu h%-jsYYEu YEURWu ƋUxw7~1WYji YujYYuT YU@RGPu WYj# YujYYu Y_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPQYNjE E P?Y9uuąt9}t t1_^U=x 5YU=x=Du D j5DYYy'j5NYY Pj59 1U^UDUd H=u/hhH5 1V` H=d H u1< ` ` d d = ud HUd Ud Ud :u1d : t d ::uҋUEUV=yy1u1H txX tjƅtjjV* fL LƅtjjV  N /\ t!P yT gd :XH ^UV%ƅt F9Eu^UV{ƅtu6 YYu[^U$UUEPjj U(VuEEV֋RUV֋RU lE 7/UUU UEPj7j. ^U(VuU @t*u: YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE:EPjGjl U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW11}U9hu hF߃| jugYtUrYtURtUzt rr Y} t}8t}Pt uN Y_^UVWuEu41}%uNN FFSX_^UVWEE11}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUAs UEUUas U EU Vjh( UYYƅyHu uVJ EVY}u"U JUj uYYEt1^U VWDžDžR RRR,Rjh| ZYYuRg#Jfhp _YƅthVh,Rp hX h\ DYYE(uhP{ jhP P _u> t> uF>t> thVh,R j h,R)YYƅtDždjhH P 9> t> uF>> hVh,RO j h,RYYƅt,R,S7E>t3DSs+> t> u E}t 7EFȀ>t > t> tFDžoj h< P Q=RD> t> uF>(> RRPVYYRff U$RRuY=Ru"Rff$RR=,Ru=hPNYYu&j.P*YYƅtFPh,RdYY],S,R,RE>t >.uEF,R}|8Ssj.VYYF7M R1_^Uj1 U$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj9 V  5 h jKj ^UU$VWEPn YEPEPjf j$YƋ}t9uvENEP+ YEEPEPj WYUUjEP YYEP YWjYZ)‰jEPj jEPj t9r)օu jR YVuYU)_^U$UUUUU UEPjjo UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP'YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U( JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEH E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }5~y UVu CV€tu ,fNV~8u>5<Yt.hYFu NLNHF 9hRYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv] =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^wwUSE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]U}x}~uPt6uYYt} tu w YYu=HSu_^U$EPuYY1ۅÉU$} uEEUUE UEPjJjA y}tUEEU$EUEPjHj Uu hT$u U=uh h YY 5YU HSU=t5YHSUVW=u!h( h, YYu1D5hh Eu1U:#th$ u YYƅtU$h uYYEtEU: t: uEh uYYƅjFuY%f|Q|Q |Q ى $5$$$h VWYYƅtFt8>t3> t> uFH%s7h VYYƅtF$_^UVW}Utu >t]9uFG1_^Ujju% E`UVuj jV[ ^UVWu1fϋV€t}u ~tu>FtVMYU )uRvo EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPPATH=:/bin:/usr/bin%s: execl(%s, %s, .., %s)= %d : %s /dev/tty-cTZ/bin/sh%s: write()= %d : %s Try again. %s: fork()= %d : %s Can't make pipe Try again. %s: fork()= %d : %s Permission denied. /Login incorrect. cmdbuflocuserremuserHost name for your adress (%s) unknown %s: ioctl(NWIOTCPCONN)= %d : %s %s: ioctl(NWIOSTCPCONF)= %d : %s can't get stderr port %s: ioctl(NWIOSTCPCONF)= %d : %s %s: open= %d : %s /dev/tcp%s: read= %d : %s %s: unprotected port (%d) %s: ioctl(NWIOGTCPCONF)= %d : %s %s: wrong number of arguments (%d) %s too longunknown error%u.%u.%u.%u.in-addr.arpa5No%d.%d.%d.%dunable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equivHO V $""$" ""$"$"%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE2121211118a8r7w7V8+78b-8No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0/etc/hostname.filenameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainHFGP aP@PQXQbQdQiQoQpQuQxQR R#R+R-zR0RULmShWSlbSSE!UG UXwTbwTcTdTe!Uf!Ug UiTnSowTpwTreUs1TuwTxwT(null)cannot print floating point r/etc/services ,/ # r/etc/servicesP%USER=HOME=SHELL=TZ=T @ SSSS/etc/passwdB 8P ((((( AAAAAABBBBBB Unknown error  p d @ 0   p\H8(xdH4 t`L4 CLS  [,P!|1$T$L4 ,su;SSSSu  QRP-)PJ Uh$h 2YYj* YUVW< h`u uu& =t! ϻ<tZU9@ tTPh1nj3 y3h<EP2YYEP4YPEPj4 jj\PM PtPL\ YLhPxPUYYy3h EP52YYEPj4YPEPju3 +1O*du)hEP1YYEP&4YPEPj13 hdR03YYtG9'@2p2jh2YYty:hhEPg1 EP3YPEPj2 \x2Yjt2YYjt 2YYjt1YYt1Yjhh1 jhh1 jhh1 jhj 2 Hpy?hTEP0YYEP2YPEPj1 xX1YhLpRWjx,Yx1YhLpRWjjjh0 hh0YY1_^UV1,<F^UVWuEU UU1`d,RM,;6<$< dE {V~WEPur0 _^UVWU LUUU1}U EM tՃ tЁu  뼋U EG u 렋U EG  5 tU~Wuu/ UU1 0VY5V!Y)VFYVVY IU :U~Wuu2/ _^U VW} }mEuhW/ ƅt EFu։)U~uWu. }tjFPu. U+UU_^UVW}#<,t., bTWVYY_^UVu<,t,VhRYY^UEuu5YYUVu<<t<VhYY^UEUUU UUjhj jhj jhj{ jhjj jhjY UVWEPD-YEEjEPj - ,=u:58 YPh$hP+ hP-YPhPj, tD= u/hhPj, ƅ~VhPjuKj Wi,YYN>.WY$=u$.1=`dtthl$p`X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhP!hPj jPXEy1HjuP ƅu1*UVU V $$_^UVuEPVYYtE8 ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU EF} tF=,. ,. ً,. ʋ ,. ыE _^UVuFPFPFPPh h$/$^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U,E}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!DC+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U\B>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW8.u =u hPjjjuu uj$$ƅ$.uuVPƅy$.}Gu^fWf(.(. (. uL0$.7$.+$.$.Wt@_^UVWE8.u=u N8 $.uE>t >.uEF}u)uYƅtuuuu V_}u 8.€u$}N>.8.T/?quuuu 7uE~=8 ;u$.l=$.uE=$.t =$.u8.t놃}t"uuuu ju%E~}t $._^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhPiuuuu_^UVWhYEthuYYEu1EuhP* >t uF>nuP. YYuF u>tDG?t uG1҈%hVh$ uFY$ u6Y1_^U@VWEEEUUЋUUE=8.ue=u 8.u } ~1EUffUE4.9UYE<.9U;}Dž4.U=0 y2UMEPUL.P4@.w 0 =#U f(.(. (. فfMjEP50  =t$8 U50 Y0 ^u u50  9E t$8 U50 ~Y0 }fEU܅t2EPW50  ƅ~U)fUU܅tB8 U50 Y0 }<}EM}ff(.(. (.  ىM9M}#UfUDž #UfUU܅t2EPW50  ƅ~U)fUU܅t$8 U50 3Y0 UJÜJU+UfUU܅VU܁vE܉VP50  ƅU)fU멃=0 y0 y8 U'UMUL.P4@.u u50 (9E M0.Uԃ}~ Eԙ=<.Eԃ}Euuu50 E=u=8 EEUM9u8. u+UBt"50 Y0 E}t8.t}u 8.u50 fY0 EaEE=0 x50 /Y0 }u}u 8 ;8 = Uȉ8 _^U=0 t50 Y0 U$VWh@YDžujWYYƃu8 EE1UUfU fUEPh0n@V E=u8 EVDYGEEPh2n@VN E=u8 EVY E_^UVWuut.Vu uC Dž U)U U )΋E_^U VWh YDžujWYYƃuEE73EPh@n@V E=u 8 UVBYU8 _^UVWURtYƅu8 wUWfUfW fG #UfWuu FPa URVu$ E8 UVY}r UUU8 E_^Uh%%jdYYjOYUVWURYDžu8 h%%jYYEuYEURWuL Ƌ8 Uxw7~1WWYjYujYYuYU8 @RGPu < WYj{Yuj|YYufY_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPAYNjE E P/Y9uuąt9}t t1_^UVW=D aU9@ } @ M :-u@ zu @ M h 4YYu@ @ M D ǣt/:tWuYYƅ}=< t=E h 0 YYh h YYh WE YYh j 7 YY@ M D D :u@ D ? F>:@ M D C;t!A @ M D Cp/@ U9@ |W=< t=E h 0 YYh h YYh Wt YYh j f YYD ?`@ A @ M p/D 7@ M D D :uD @ p/_^U=T x 5T 5YT X U=T xjhH YYT y'j5T YY Pj5T  1U('((=X u/hh%5T u X 1V(%=((u1< X ((((= u('U} t} u1UV(PYt(}u(:#u1b5((U(:u1D(: t(}t :"u*((P_YtU>u1^UV(U(P'Yt((:"uR(jYƅt(>"t#=((u1{((0ʋ(:"u;(0jYƅu1C=((u13((0=((u1((E^U=T y _y1Du17jRY(tjAY((((UVƅtu6m YYu^U$UUEPjj7 U(VuEEV֋RUV֋RU $E .UUU UEPj7j ^U(VuU @t*uYEU UV֋RUUUEPuLYYU UEPjjs ^U$UUUUU UEPjjG UVW11}U9 u  F߃| jugYtUrYtURtUzt r Y}\ t}t t} t u Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv% =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h#YF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF(FF VVv vv >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E P)U :t! EE E p(U uuuYYEy@Ut8huUYYE~" tuYuusYYE}y1]jMYEu uY1A!uEUMJUzUBU E_^UUUuuu | UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UUURu hu'UUURuu uUEEUUUUU JUEPuup EUJUx ]E EPjYYEUuu hu G/'O_7cUW}E MuG_]1_]UVW}u MUW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVWME_^]UVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV(U9(wU(9(v8 16VT Yt1'(rF5(&Y5(^UVW}u1E}UUs8 1=(u8j Y=u1V!փ5(5(FE5(OVU}9}r69v2W9UvUW~>}t E(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=(<9}r79}u+UOJ}t E(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV4 uY_^U VWUUb15(t 9ur6E0tU U(tU9ru NJEtU9Wu RWE_^UVu~  u8 6EP& YEU UEPEPVz yE^UUas U EU VWDžDž0.4.8.<.T.jh ZYYu$.g#Jfh wYƅthVhT.@ hh YYE(uhP jhP  _u> t> uF>t> thVhT. j hT.9YYƅtDždjhP 9> t> uF>> hVhT. j hT.YYƅtT.T/7E>t3l/s+> t> u E}t 7EFȀ>t > t> tFDžoj hP Q=<.D> t> uF>(> <.@.PVYY<.ff UL.<.uY=<.u"@.ffL.<.=T.u=hPYYu&j.P:YYƅtFPhT.YY]T/T.T.E>t >.uEFT.}|`/sj.VYYF7M 8.1_^Uj U$UUU UUUEREPjGjT U} v8 M E 1U} v8 M ҋE!1UE1UE1U} v8 M Et1U$EPj j y}tUEEU$UUUUU UEPjj? UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U < }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EET uVuu+ ƀ}Xu9utUPgYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE| UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P3E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }, /~y UVu CV€tu ,fNV~t u>5x Yt.hLYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv1 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWE_^]L$ gUh h YYj>YU Vjh qYYƅyHu uV^ EV Y}u"U JUj uYYEt1^UVW5x/,YDžD7uYYtw>t6uYYt} tu w YYu=x/u_^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPKYjEPje V((5(h(jKj ^Uu hT$u U= uh h qYY  5 EYU x/U= t5 BY x/UVW= u!h h YY u1D5 hh(4 Eu1U:#th u YYƅtU-h uYYEtEU: t: uEh uYYƅjFuSY%f(.(. (. ى -5 ---h VWYYƅtFt8>t3> t> uF-s7h VYYƅtF-_^UVW}Utu >t]9uFG1_^U$} uEEUUE UEPjJj y}tUEEUjju E`UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+8 "}t}y UU_^UVWu1fϋV€t}u ~tu>FtVYU )uRv7 EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ$tPXP@(#) telnetd 1.00 (07/26/92)Usage: telnetd [-dv] dvI am sorry, but the fork(2) call failed! EXEC failed! login/usr/bin/logingetty/usr/bin/gettygetty/usr/sbin/gettyCan't open %s Can't find %s in the tty table I am sorry, but there is no free PTY left! Unable to obtain your IP address dvVm$?<<<<%Q]{{{telnetd: fork() failed: %s /dev%s/tty%c%cFile %s, desc %d OK error %d ...: Testing: /dev%s/pty%c%ck  k telnetd: %s: %s unknown error%u.%u.%u.%u.in-addr.arpa  %d.%d.%d.%dHOV$$ $$%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE: option requires an argument -- : illegal option -- --,,,,,,,,,2a1r1w1F2+'2b2No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainA?i@mH H@FHjIXSIb8IdJIiJIoAIpSIuJIxSICJ 4J#9J+/J-*J0>J5MLKhKlK;KELGLX'Lb'LcLdeLeLfLgLieLnKo'Lp'LrMsKu'Lx'L(null)cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/services-/etc/utmp/usr/adm/wtmpSSSS/etc/ttytabB\ t ((((( AAAAAABBBBBB Unknown error|`L8(p`P<(t`D0 lP<,C|/  pH@p1$T$L su;SSSSu QRP42 P"VU5$BYYPu5<2h<hX褐UuYjUYUujVYEu hHYEUVWuFYE}uVR UPUjujuuuurK0 URRUuuuu? EtE}t&Ujuuuuuur/ u EP=Y}UjEPj3rNtjuȍEPM Uĉp2 p2 ًp2 ʋ p2  h2M9 h2,E }t*uA[YP5<2h hX袃jHYEEE}@h2RuuuNEP<YE}tjEPu uVz tM9J t Eo}e}[uuuu?EPQ<Y0}}jEPuh 5<2hhX舂 EU9Us!UUPhhX] EuYYPhhX< EPEPj8vLtuuhhX hXj YYujjuEP`;YB}t5h2uuuEP7;YEP+;Y Ef}VMIRQVMIRQURBVMIRQURfBVMIfR fQ URB }u1EURB}u URBVMIRQVMIjRQ UjGPj6r}uUjEPj3r}uYVPRhxf F@F V VjV6$YYEPY19=Dv;4Ft+FtV$3VVu VVF t @2G뽺d29h2O19=DvE@ h29J4 @2 h29J@ @2G19=D4FF =@2ujjV `VR~YVRNhr PhL2PE=u-=$t=$2tVR'Yj fYGQ9=D}VREPZYY=H2rTUR 2+<YVPRhXd UR r<YPhTdYY=H2r UrYuuV EXUur Vl tB=H2r9UR r;YVPRh8Rd =H2r UrYEPbY=H2r:jdeY9HtjTeYH-@4Ph$cYYh@^Y=@2u =l2t^l2L=l2u1LPjhL2!O =$|hlYj dYd=H2r hgcY1_^Uuuu u.u 5<2hhXb j'(YUVWu fYEEuu :8YYt %5ƅ Uuuu 1L UU:tUU:.Vj2EPae Up2 p2 ًp2 ʋ p2 ыUp2p2 Ëp2 ڋp2 1ˉ]9]UEUUGVUK4}s =@2u Y2Yƅ~1V<j4EPFd Up2 p2 ًp2 ʋ p2 ыUp2p2 Ëp2 ڋp2 1ˉ]9]vUEUUG@1_^UVg3ƅtVjEP2c u3u=@2tjjEP92 ƅt1^UVWj/ucYYƅu1FEPuy5YYEj EPV( 9ut U:u vEN/}u1mUE u1 )ѺУp2p2 ʋ p2 ыp2 ʋE_^UVW xT=p2 p2 ًp2 ʋ p2 9M t!NVuS6YPhh$._u%u 26YPj/h$vtGu?t$FPv vhhXNYjYhGPP^] hPd]YYZЉt1Gu(hGP;BYYt8hGP'BYYt$FPv vhhXXjYU9s#ft Ft1t Gt$FPv vhthXFXjY/j PGP -=wi:u^ +Ѻp2 p2 ًp2 ʋ p2 щ>uGPP u$GPw wh@hXnWjYU9wjPdZ BtWu$FPv vhhX WjQYjjGP UJU9w'ыꋍutGu?t$FPv vhhXkVjYGPhP =u$GPw whhX"VjiYUJv?uU9v v vhhXUjYUJt=UJ1t(UBPv vhhhX{UjYUzt=UJ9v.UBPv vh0hX5Uj|YUBqUMYJˉUJuU MjQ)X )ыU]QPSW ()ыUQPPuw_^UVWEEuYUUщM XL} UJ|uMUJTrUJTMITEhD FPH=YY+VKY-=BREPYY|=BRYt=uVKY=vDRYt=gVRKY=UBB|9UuEPuU qtt}$tU$ 9tP:tt?Wxu xEP }t U9U Up2 p2 ًp2 ʋ p2 ыU p2p2 Ëp2 ڋp2 1ˉp9]tUMJUpUXv vh hXQjY3h FP;YYDž|xxPx8tExBu6}t uu RuU u Dž|xx룋x9t x8tv vh hX Q|rxUdh FP6:YYVHY=B}!EPEPR{ LU3UUjjjuujEPjuIUMJUu REP\ U9UMQU~v vh hXOj8YYht FP+9YY:VGY-=BB}$RYPlYxu*Rq shL hXNOjYjREP] u0 Rq sh hXOjKYxMJU$9xVUMJU?}u  Pv vh hXNjYh FP7YYuPVFY=uBuU}v vh hX;NjYh FPu7YYu3}FPv vh| hXMj;Y\ht FP.7YY5>^GuUGPMY|=t>|苽Yxu$GPw whH hXsMjY? U$xWfEY=uBGu9h@ GP6YYu%}$xJxJWEY=Gh8 GP66YYBr}$3u REP u*Rq sh hXLjYxJxJxMJ$W^DY=uEGuu UJM>u Uz!>u Uz>lt>,u6jEPj4u<t>luU 19}v U:uG9}u$EPEPPu~tvh HYYPh HYY19}R:uuh jH }ډuWZYр9u  P:HY믋UjREPJ uSYPh HYYEVUuWZYыU ډUMuuh GYYFt>uuYPh GYYF>5 uYPh GYYuh@j 8GYYuWZYPh GGYYV gh@j FYYy_^UVE8u2h!YƍV@VV VVVE0^UE8t0sYEUuYE EE UVjD謵YjDjVxI F(F@F ^UVu~tHPhL2K3YYP4GYFFFPTY=H2rFPh FYY^UVW}EE$$s7N9uV9U u wVU9V uVUUzt}u$ 1 Gu;DžL$L8t L苅L8GWWE 9=$uUzt0h29U~%l29U} Ul2$ 1WWW$uYuNU PPh FPDwjFPEYY=$t=$t =$u1FP肳YW]ShnHPrE yPBEY1WDUHDž@@~$@HHD DE3]Shn@PD >5$ YPFP5<2h hX[CjYDž`3EEEƅhE`Sh"n8@PD 5$ YPFP5<2hh hXBj+YDžP;3f`2fTDžP93f\2fTPSh@n@PC =u@5$ YPFP5<2h@ hX]BjY  E cU Vh2V=H2rFPh4 mBYY_^UV$$s#U V9uV9U uVY^Uuh h$:B $UVWhu#CYYDžy.=$t=$t =$u `uӰY=D2t >EPh!n WB y5$ tu虰YUE UE1WiBY_^UV=D2uTjuxBYYƅy uMYEU UUUEPh n @V5B y uYVAY^U VW}UUU UEEfWfUfWft2t2 t2 ىtjWVZYZVWj EPjA PA _^UVWuv EP`>EE}~MEEGU >UE}~MEEGfB VEVBUft2t2 t2 فVfJVfBVfB@VBVB VfB VB VBjvj@ %VfB VfMf VfMfJUft2t2 t2 فVfJVfBVNvrq %VfB_^UVuJ uBV:Eu:z u4jvj@ =uVNvrq =t1}VR UVRUVffUVfRfUfEVfRft2t2 t2 كfMEPv Y^^UVWEUj t+Uu zE}~ MGF1_^UVUrREURB FFfFjVj{= %fF^UVUrREURB FFFft2t2 t2 فfNU R VF fFjVj< %fF^UVWUz? u)1W9~WMII 9 u URB F1_^UV5Nx x2^U=tu;YUV%U9%wU%9%v$ 16Vt$Yt1'%rF5%&Y5%^UVW}u1E}UUs$ 1=%u8j#$Y=u1V!փ5%5%FE5 %OVU}9}r69v2W9UvUW~>}t E %u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= %<9}r79}u+UOJ}t E %URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV,; uY_^U VWUUb15 %t 9ur6E0tU U %tU9ru NJEtU9Wu RWE_^UVux95 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+$"}t}y UU_^U(VWUcSct1UUE4UlUEU,UE1tTT9{UF}g}u1FSXE؋U 9Uu }tE0}tU؋E2}4utEtE@uuGb1_^Uhju7 UǂcScUh4hR7 UVW} ~ } |1uU$9]>tXV9U u=U)ʉ$RQV(7 UWh $P7 1뒃}t4VUM$9wU FUFuuV6 1_^U VW}u1e1UjEPu Džx~17}U::u u U:t1%UUF뢸%_^UVWu} u jYDžt+FPFPFPFPFPPh W'3 _^Uh%uYYU8VWEU UUUUfRft2t2 t2 ىM؋UfRft2t2 t2 ىME\&Eu }}`uuVuu Džy21W΋U%u5YljUUU)UVuV$ YYZMԃ}~DVuV YYZ߃}t&UBt 2 21+E%E%%E,%E%,%EM9uuuVuuDžV YEVt YEVg Yǃ}u@ց}X&sUEEu}4YljUUU)U]}tE} u?uuVuuDžy +֋U%%}u}t }t&9=%t U9UtQ=%UŨ}u1%}u U%uu3YZЉEE1UU]*s-UEȉEWVRg2 UUE;}tEE% 21_^UVW}-0= >N>.WY`*=u21=%%%%%%,%`*0%%,%%X-0= r>.uF\hPjjW y1jPi _^UVW}}t1PGPGPGPh P+.hPj jP Ey1HjuP ƅu1*UVU V ,%`*0%`*_^UU=d*t5d*'Yd*U VW=d*u7=u1h$5[+YYd*u ,+d*d*:xd*X@ 5d*)YE=t} t ,,sF봃}u%5d*&Yd*D,,8*,+= w>tF>t/>#t*(+t"7= v>tF>tF뺁(+*unh5*/YYuX5d*6&Yd*5*/Y=~5*hh*Z/YYh*]*Qh(+5*YY7*_^UVW520Y#1DžD7u.YYtw>t6u.YYt} tu w .YYu=2u0_^UVuEPVYYtE$^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU (EI} tF=p2 p2 ًp2 ʋ p2 ыE _^UVuFPFPFPPhDh,,(,,^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UP H}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!hF+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UNE>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW3u]+=u hPjjjuu uj/$ƅ2uuVPƅy2}Gu^fWft2t2 t2 uL0272+22WeC_^UVWE3u=*=u N$2uE>t >.uEF}u)uYƅtuuuu V_}u 3€u$}N>.3$4?quuuu 7uE~=$;u2l=2uE=2t =2u3t놃}t"uuuu ju%E~}t 2_^UVW}} uBW$Y-Ɖ:.u#sVWP# Ƅ5*"u hWhhP uuuu_^UVWh$YEthuYYEu1EuhP >tuF>nuP. YYuFu>tDG?tuG1҈?-hVh@,# uY@, uY1_^U@VWEEEUUЋUUE=3u&=u 3u } ~1EUffUE39UYE 39U;}Dž3U=y2UMEPU3P43w =#U ft2t2 t2 فfMjEP5 =t$$U5EY^u u5 9E t$$U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tB$U5Y}<}EM}fft2t2 t2 ىM9M}#UfUDž #UfUU܅t2EPW54 ƅ~U)fUU܅t$$U5YUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yy$U'UMU3P43u u5(9E M3Uԃ}~ Eԙ= 3Eԃ}Euuu5E=u=$EEUM9u3 u+UBt"5/YE}t3t}u 3u5YEaEE=x5Y}u}u $;$= Uȉ$_^U=t5[YU$VWhYDžujWXYYƃu$EE1UUfU fUEPh0n@V E=u$EVYGEEPh2n@V E=u$EVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh|YDžujW8YYƃuEE73EPh@n@V E=u $UVYU$_^UVWURuF1P}j YE]9$ j> YEE|EPf YEEPEPj E+U9}v}W YvF$V FvvPA F$V RFvvP F$V 1F^vPS F$V F 3}t!ja YjEPj uH Y~u~ u$1_^UUuUYUu uYYEu&5T-5P-h<hXfjYEUVutu6uAY^U VW}1t}?E0utu~6uY_^UVu6YvYv YVY^U=X- uT-L-L-:xL-X@ 5L-YX-=uAL-R t35$YP5T-5P-h\hXIjYUX-t'Z=X-#uL=X-tփ=X- uUX-UE=X-upEP5T-5P-hthXjYUVWEE j5jYYFP-VT-V F=X-'t =X-"uX-U~EU9UuE URVYYƃ}u=X-=X-p5X-hYYuZ=X-t =X- u.v 5T-5P-hhXjYU9X-u k=X-\t#X-UщMDX-t H-t8UщMD\U9UuE URVpYYƁNX-0 sTEU X-0щMO~X-0 rԋEUщMDZ=X-xt =X-X4EX-Du&5T-5P-hhXKjYX-as X-W&X-As X-7 X-0ЋU‰U#O~X-DuEUщMDX-oX-cX-WX- KX- ?X- 3X- 'X- X- X-.X-UщMDXVU}t Nr}u1\PEPFP U:u  VPEPFPp U:u O VG뛺URVYY_^UVWE}*=X-=X-}=X-;ur}tv}^=X-{uUOjjzYYP-VT-V ;FF7=X-}t`RE_^UVWEUUDžhGPdYY7t>u Ft#w 5P-hLhXN jYFt=VUUU U =\u EUMU:tEE̍FP_YWYE0E88Ujj1YY~WVW V FE0uE_^U@VWL-Uԋ=P-T-ŰX-UEU:/ttj/WYYEt)@EuJYE PjYYuWFP8 VUuR YYD-5D-VP-T-hu^YYL-t]SpSYYyF=$t*5$)YPuhhX jYFX-UVX- E=X-tK=L-t 5L-YUԉL-=P-ỦT-UȉX-E_^U,VWu_U}t;UEPRYYy=$uEUM9Ju EU뿃}uVY$D-U H-uYƅtDFPy YEPVYYǺURWGP D-GG5D-YVY1_^UV}uUBƋUB^UV1}t FEU^UVWuU VVue YYDžt~~yVډ$F_^U$UUEPjj U$UUU UEPjj} U$UUU UUUEPj6jS U$UUUUU UEPjj' U$UUU UUUEEPjGj U} v$M E 1U} v$M ҋE!1UE1UE1U} v$M Et1U$u YEUUU UEPjj U$EPj j y}tUEEU$UUUUU UEPjj UVW11}U9pu pF߃| jugYtUrYtURtUzt rY}(t}@t}Xt uY_^UVWuEu41}%uNN FFSX_^UVWEE11UVWYE_^]^L$ UVWME_^]L$UW}0OE uG_]1_]U=tj_YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^U}x}~u P YYUVu~  u$6EP>YEU UEPEPV yE^UUas U EU=uh@hDYY 5YU 2U=t5Y2UVW=u!hhhlKYYu1D5hhp-| Eu1U:#thdu YYƅtUt1h`uYYEtEU: t: uEh\uYYƅjFuY%ft2t2 t2 ى |1511x1hXVWYYƅtFt8>t3> t> uF 2s7hTVYYƅtFt1_^UVW}Utu >t]9uFG1_^U VWDžDž333 3$3jhYYu2g#JfhCYƅthVh$3 hhYYE(uhP' jhPI _u> t> uF>t> thVh$3 j h$3yYYƅtDždjhP 9> t> uF>> hVh$3 j h$3YYƅt$3$47E>t3<4s+> t> u E}t 7EFȀ>t > t> tFDžoj h|P Q= 3D> t> uF>(>  33PVYY 3ff U3 3uY= 3u"3ff3 3=$3u=hPYYu&j.PzYYƅtFPh$3YY]$4$3$3E>t >.uEF$3}|04sj.VYYF7M 31_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUPoYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Ud EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U- JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }ƍ~y UVu CV€tu ,fNV~@u>5DDYt.h訪YFu NLNHF 9hzYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`/UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuj jV ^UhLhX>YYj膦YU VjhlYYƅyHu uV EVBY}u"U JUj utYYEt1^UVuYƋU rU MJwU uRyYY^U$EPuYY1ۅÉU$} uEEUUE UEPjJj] y}tUEEU$EUEPjHj! Uu hT$u UVWu1fϋV€t}u ~tu>FtVYU )uRvs EVt tfVV}u1_^É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP/etc/dhcp.conf/usr/adm/dhcp.pool/usr/adm/dhcp.cache%s: %s: %s Can't allocate memory%s: %s: Pool table is corrupt %s: %s: %s is already present %s: %s has %d addresses %s: %s: Unknown host /usr/run/dhcpd.pid%d w/usr/run/dhcpd.pid%02X %-15s %8s +%lu-%luinfiniteunusedDynamic address pool since %ld: DHCP data for network %d: %s: Unknown port "%s" udpCan't dup()m m m VmmD saying: "%.*s" declines %s%02X%s: %s: No lease set for address %s B !B)Usage: %s [-qar] [-t[L]] [-d[L]] [-f config] [-c cache] [-p pool] [host ...] 8a8(8888888888] )8Nothing more to do! Bailing out... asyn_wait()Memory use = %lu %s: Sent DHCP packet to %s %s %s: Got DHCP packet from %s to %s: Router advert received from %s %s: Broadcast router solicitation %s: Sent advert for %s to self %s is already in use by %s %s: %s: %s offered by saying: "%.*s" through %s%s: Got a NAK from %s%s: Broadcast DHCP %s %s: Address set to %s Sent ARP for %s through %s %s: Got a DHCP %s from %s%s: Sent DHCP %s to %s %s: Broadcast DHCP %s Minix%s: Interface disabled (lease expired) %s: IP address is %s (dhcp.conf) MinixMinix%s: IP address is %s (ifconfig?) (sink)%s: Ethernet address is %s%s bootpcbootps%s: DHCP packet too big, please trim the configuration %s/%-2dfilesnamechaddrgiaddrsiaddryiaddrciaddrflagssecsxidhopshlenhtypeop"%s", line %u: Usage: tag number name type granularity max "%s", line %u: Tag definition is incorrect tagoctetnumberipbooleanasciiDNSservergatewaynetmask3;7"889:"%s", line %u: Got %d initializers, can have only %d "%s", line %u: Expected a multiple of %d initializers "%s", line %u: Tag value is way too big "%s", line %u: %s: Bad hexdigit string "%s", line %u: Usage: %s hexdigits "%s", line %u: Usage: %s number ... "%s", line %u: Can't translate %s to an IP address "%s", line %u: Usage: %s host ... "%s", line %u: Usage: %s false|true ... truefalse"%s", line %u: Usage: %s string "%s", line %u: Tag '%s' can't be configured "%s", line %u: Unknown tag '%s' "%s", line %u: Usage: no tag-name no"%s", line %u: Nesting is too deep "%s", line %u: Usage: macro macro-name {params} macro"%s", line %u: Unknown option hostnamepossessive"%s", line %u: Can't find IP address of %s relayserver"%s", line %u: Interface %s is not enabled option"%s", line %u: A %s can't be defined here tag"%s", line %u: Usage: macro macro-name macro [macro|{params}]"%s", line %u: Usage: interface ip# host%s "%s", line %u: Can't find IP address of %s "%s", line %u: Can't find interface %s interface"%s", line %u: Usage: host host-spec macro|{params} host"%s", line %u: Usage: class class-name ... macro|{params} class"%s", line %u: Usage: client ID [ip#] host [macro|{params}] clientREPLYREQUEST???INFORMRELEASENAKACKDECLINEREQUESTOFFERDISCOVER???HHI9IhII%02X (%s) (%s) %lu %s true false "%.*s" T%d = %s =%s: Closed NMMLNfN%s: Opened %s: %s: Unable to set UDP options: %s %s: %s: Unable to set IP options: %s %s: %s: Unable to set eth options: %s /dev/%s%d/dev/ip%dunknown error%x:%x:%x:%x:%x:%x%u.%u.%u.%u.in-addr.arpa/etc/hostsincluderQhQhggh%d.%d.%d.%diiikkklCllhn\nhnPnDnhnhn%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE~| |{M|&~}}}}"%s", line %u: Out of memory "%s", line %u: %s EOF"%s", line %u: parse error at '%s' ރa`oރރ{ރރރރރރރރރރރÃ"%s", line %u: bad hex escape "%s", line %u: string at line %u not closed "%s", line %u: 'include' command requires an argument include"%s", line 1: %s rarۏwV+7b-No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesnameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain= @Xbdiopux #+ߥ-ڥ0Lͦhl¦EGlXקbקcSdefglin;oקpקrŨsuקxק(null)cannot print floating point /etc/hostname.file82(IP address requested isn't yoursAddress in use by 00:00:00:00:00:00`XPHD< 4 ,$  ,@l2456789\ T L x t p h ` ethipudpudp/etc/hosts(+*!#$%&*+-./:<=>?[\]^_|~ SSSSB(@X@4 ((((( AAAAAABBBBBB Unknown error8,|XH4(t`P@(|`L8 xdL8 Cbegrom_cachefi_defaultB_openpoo_readpoo_writepoy_findpoo_commitp_updatep_cachedh_printda_portbyn _sendY _servdhc _onsig_usageD_network_qflag8_aflag<_rflag@_n_netsDI_72HI_35LI_10T_name2ipM._ip2name0_cidr_at1_ascii2o2_ascii2co3_statict_inittag3_tagdefbD6_configt6_dhcpopnG_dhcpconX_alltagd\I_2$_fds$_fdwaitq$I_9$_BCAST_E_udp_ckstP__callsXV_growV__bottom%__top%__empty %_string2YI_1%I_2%_getansw^_h_addr_,%_host%_host_al%_hostbuf\&_host_ad`*_HOSTS_hosts_hfpd*I_7h*I_4*I_3(+I_2,+I_1,,_dn_findlI_3@,_s_tcp_conw_tcpip_ww_udp_con>x_udp_senx_alarm_hiy_udp_recy_operati{_time_ou|_asyn_cu@-_allocat~_delete_~_delete_~_nextcT_skipwhi_parse_e_read_wom_read_li_read_lij_read_fi_c_filesD-_c_flagsH-_c_fpL-_c_fileP-_c_lineT-_cX-I_1\-alignalignedadd6,add6testEadd1\add1testfdonemaskSENDRECEIVEBOTHSYSVEC!SRCDESTMESSAGE clwordcwordcbyte*last,slwordswordsbytedonenext͔foundfailure_unknown_servf_any_linep-_servt1_serv_al1I_12_handlerT_gnumX_o_print_do_writuplwordupwordupbyte$done&downward-compareXdonedno0begtextbegdatabegbsscrtso___mainP__penvir__fpu_pr42__penvp82__edata_exitqV_environ endtextl_maini_configf_poolfil_reportT_fatal_allocat_ifname2_if2net_program<2_serving@2_testD2_debugH2_asynL2_port_se\2_port_cl`2_startd2_nowh2_eventl2__end@4_strerroY_mallocW_strlen0_sbrk_memcmp___stdou@_getpid_fcntl|_write_memcpy@_dhcp_in\_syncԒ_fputc@_sleep̒_dhcp_ge[_give_buJ_settag._sigacti.csa4_fflushX_put_bufJ_opendevjK.blmԱ_get_buf`J__tmp_lp2_is_arp_pT_icmp_isV_asyn_wa|_asyn_re|_newnetwJ_set_ipc P_get_ipcdO_strtoulY_gethost!b_initdhcz6_make_arS_closel_sigemptĒ_fclose_timeܒ___stderX_fopen_errno$_dhcptypG_ether2cP3_ipdevEO_strcpy_icmp_so3U_makedhc<_udp2ethQ_sprintf_printfp_read_icmp_adU_fprintf __tmpt2_open_getservf_lseek_closedeO_dupt_inet_nth_memsetp_ether2uR_printdhG_ether_nv^_cidr_nt1__endhosc__gethosd_inet_atf_strcasexz_strncasz_ether_a]_dhcp_se\_config_1_strncmp@_strncpyP_strchr_config__config_ _strnlenp_gethost*c_closefdK_free&Y_asyn_clx~_ioctl_oneC_su___funcc__clean___functx2__exit\_reallocX__sbrk{__brkP{__sys_er__sys_ne_strtolY___ctype_memmove`_ether_e(^_h_errno2_res_quexm_inet_ad|f__getshol_dn_expah_dn_skipk_res_sean__sethosc___fillbl_strcmp__serv_s2_endserv_getserv=_setservԖ_dn_compj__getlonm___putsh1m___putloLm.csb4_res_quep___hostap_res_ini_fgets__res3_getenv̕_res_mkq؜_res_senq__res_clv_alarmd_signalP_toupper__brksiz__syscalP_asyn_in{_asyn_wr|_asyn_io|_asyn_sys~__sigfilЊ__read__alarm_abort__sigact0_pause__timeP__ioctl؉__write_config_&_strrchr__fstat__stat__sendre̓___sigre__sigaddd__sigdel__sigemp__sigism___stdin(___iotabp__close___cleanƍ__lseek__openL__creat8__doprntV___flushЫ_snprint_vsnprinؑ_vsprint?___exit__dupd__fcntlx__getpidؠ__pause__sleepY__sync@__sigret__send__receivendbss@4__memcpy__memmov__strncmH__strncpx__strnle_raise(__kill_rewind_atoi_gethost__loadna`__sigjmpȡ__sigpro_sigprocخ_sigfillЮ_sigsusp_sigdelsȮ__f_prinЯ__i_compT__isatty_fseekL__sigsus__fp_hoo__tcgeta4ECASE.fat@.stopL.trpT.trppcERANGEESETEIDIVZEHEAPEILLINSEODDZ.ignmask__etextlendromenddata@4  \H1$T$Lxsu;SSSSu`` QRPP"UuYPuj U|Uh YuYhYuRYPYhYjYUhYjYUVWEEEU9UUM :-UAMM 0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+|"}t}y UU_^U$UUU UUUEEPjGj U} v|M E 1U} v|M ҋE!1UE1UE1U} v|M Et1['fNUVWuU VVuYYDžt~~yVډ|F_^U$UUEPjj U$UUEPjj U$EPuYYEPj j[ U$UUEPjj; UVu x~| 5juIYYy9uuVYVju! ^U4VWEj/u'YYuh,wYƅu(VYPu~YZEЃeuYE=u|}؀>t >:tFG9}s/GuWYYEPuYY=t4`2u u =|t |Ũ}t} uFuUR+YỦ|_^U(VuEEV֋RUV֋RU 4E gUUU UEPj7jf ^U(VuU @t*u6YEU UV֋RUUUEPuYYU UEPjj ^U$EPj>j UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjy V5hjKja ^U$u:YEUUU UEPjj( U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UW}0))ϊE tu1_]XG_]UVWE_^]UVW`Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVu@YƋU rU MJwU uRYY^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s|KVYE=u|&UEUUU}׋U UE8t=+UEEE0YE܋]P3WQ }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuMYEuUUȋUUEEEPj;j* RuY_^U$} uEEUUE UEPjJj y}tUEEË} 0)ʇʋu }UVW}u M#UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP : intr: Usage: intr [-d] [-t seconds] command [arg ...] d?tH//dev/null/dev/nullsetsid()/dev/consolesetsid()/dev/tty/dev/ttyunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH  /dev/logSSSS ((((( AAAAAABBBBBB Unknown error pd@0p\H8(xdH4 t`L4 C\  7P HY1$T$LT P su;SSSSu QRP PRU}tU:u!5X YPh0h  "5X YPuhh ( UuYjYUVuu u bY u VcYYƅujY^U}t uGYU EPYh\ YhT Yju&YYjuYYuYuYuYjj DYYE u 0YYE 0 YE@x5uuYYuYuYEU VW}>/uF>uX >/t>tFu>/uFUEhhWOYYXhdW:YYtGu WWYYy=X u>u*6uuW y=X tUM >^1_^U VWu} EPVYYe=X t ViYu}u E}u EuuWVVYuUm U9tWVYYy VYZ}uEE}uEEE9Eu E9Et.uuV y=X t VY WVYY_^UVW}5D =H ~uƉ H ؋WW G uwGtWրu ~9wt w1_^UtVWu EEEEPufYYyuY }u2UU=, t =0 tM$UItMI}uEE}uEEUt$uhh 4 ( EPVYYEy=X V YXUāt"Vhh  ( $E]9uJUM9u>=, u.=0 t%Vuhh ( E=, }y}xVYy VNYVuYYx ED=0 t =X t25X YPVuhlh ( >}}DžDžju*YYEyuY URhAV Džy)=X u  URVYYhVYYDžyVSYurYDžhPu Ee} =8 t3Dž=D tPYtE=< tP5@ YP5@ W 5< W YYyu`YWYY}E9U~UuPW y;VYuYWY-jj +UDžl}y uYuYWYtjP" x t( }=D jVYYDžy VYej0PW Ey VY@} l_uVPJYtEjjW =tuPWY yVYWYEWYEPVYYy V[YUā9UtuVUYYy V1Y}E9Eu E9Et0uuV- y=X t VYFuVYY}u5UԉUPVtYYy=X tVY_^Uhh YYjYULVWEEEEuE}uPYPYjj YY9}U :-Bu WZY4FhV.YYb>tJ, 0 8 4 ƃ=< u<  @ 맀>u"9}uBu WZY4>uj EPV EU:u9EtUU3VYE؅uVhh  j[YUBE>u"9}u@Bu WZY4>u(j EPV EU:u9EtUU3Vs YEԅuVhh r jYUBE{>u"9}uBu WZY4>ujEPVS EU:u %9EtiUUt}t }uEEt}t }uE|>u"9}uBu WZY4>ujEPV D E9ut =D yu>g.E3E*EEEF=)1u9D vlUD D H }D D H MF-1=w%<   NJ@ F((=4 t =0 u=, u =8 tjY=4 t+U)tU uuu4EU)i=, u =0 tU)uHUJM EP4wYYU@1U)uUJ9U j/4YYE؅u U UE؋UJM 4YPuYZPVYYƋUJM 4VYYhxV[YYuVPYYBuuuVu WZY4OUJM ] uuu445( Y_^UV5L Nx ^U=P tP u YUVT U9T wUT 9T vX 16V Yt1'T rF5T &Y5T ^UVW}u1E}UUsX 1=P u8jY=u1V!փ5P 5T FE5X OVU}9}r69v2W9UvUW~>}t EX u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=X <9}r79}u+UOJ}t EX URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15X t 9ur6E0tU UX tU9ru NJEtU9Wu RWE_^UVu~  uX 6EP YEU UEPEPV: yE^UVux95@ 4 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0! tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+X "}t}y UU_^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^U=h x 5h Yh l U=h x=\ u \ \ j5\ YYh y'j5h BYY Pj5h - 1U^U\ Ut`=l u/hh` 5h  l 1Vp` =t`u1< l pptt= ut`UtUtUt:u12t: tt9Ettz:u1 UEUV=h y~y1u1j:nY`tj:]Ydtj:LYEtjju hp։lt: t$j,Ytlst:u`^UV3ƅt F9Eu^UVv ƅtu6EYYuV^U=| x 5| Y|  U=| x=xu xp j5xYY| y'j5| YY Pj5| } 1U^UxU|= u/hh|5|  1V|=|u1< = u|UUU:u1: t ::uҋUEUV=| yy1u1|txtjƅtjjV fLƅtjjV /t!yg:X|^UV%ƅt F9Eu^UV{ƅtu6YYu[^UVWuU VVu-YYDžt~~yVډX F_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUU UUUEEPjGj U} vX M E 1U} vX M ҋE!1UE1UE1U} vX M Et1UUUuuu 4 ;GoWSOUSE] ![]USE] ![]USE] ![]UVW}u MUVWE_^]UW}0       ! " # OE uG_]1_]UVuYƋU rU MJwU uRiYY^U$UUEPjj U$U UEPuYYEPjj U$u*YEU UUUUUEPjjJ UVu x~X 5ju}YYy9uuVAYVjuU ^U4VWEj/uYYuh\YƅuXVeYPuVYZEЃeuYE=uX }؀>t >:tFG9}s/GuWYYEPunYY=t42u u =X t X Ũ}t} uFuUR;YỦX _^U$EPjj U$EPj/j U$EPjj U$u*YEu YEUUU UEPj j? U$UUU UUUEPjj yEU$uYEU UUUEPj'j U$EPj*j yUEUMJ1U$EEEPj.jv U$UUEPjjW UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5hjKj ^U$unYEUUU UEPjj U$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U d}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE|uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U=JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEФUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE- E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }P 6~y UVu CV€tu ,fNV~ u>5 @Yt.hYFu NLNHF 9hnYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}0))ϊE tu1_]XG_]UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UUas U EUhh YYjYULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sX KVYE=uX &UEUUU}׋U UE8t=+UEEE0YE܋]P3We }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGu9YEuUUȋUUEEEPj;jN RY_^U$EPufYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUu hT$u UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvF =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇH tPXPcompress-#gzipinstall: %s: %s install: %s ?Tfork()pipe()...install: can't link %s to %s: %s install: %s and %s are the same, can't copy install: %s is not a regular file install: %s is not a regular file Usage: install [-lcsz#] [-o owner] [-g group] [-m mode] [-S stack] [file1] file2 install [-lcsz#] [-o owner] [-g group] [-m mode] [-S stack] file ... dir install -d [-o owner] [-g group] [-m mode] directory B K M W b k m w  S c d g[ lv m o s z /install: %s: unknown user install: %s: unknown user -unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATHY& %@2&V'X?'b$'d6'i6'o-'p?'u6'x?'/( (#%(+(-(0*(!+L )h(l(')E*G*X*b*c*dQ*e*f*g*iQ*nw)o*p*r+s)u*x*(null)cannot print floating point #!/usr/bin/zexec /usr/bin/zcat #!/usr/bin/zexec /usr/bin/gzcat SSSS/etc/group/etc/passwdB H ((((( AAAAAABBBBBB Unknown errorPD(p`L@( xhX@0xd$ $ $ $ $ $ $ $ $ $ P8|dP8(C  C<+y1$T$L su;SSSSu` ` QRP Pj U5 YPuhh 'UuYj+ YUVWE5(9,99UsF09Q9V|-FPm Y7wwv6x YPh'E _^UVW,9RYEu hLTYUUփEUMJ FFFf89X89 89 فfNE(9U,99UU 09Q9JwVBVU 09X9J}BEUR49 49 ً49 ʋ 49 щEE VfF)RVjb' %fFV~]=p tuYPh0&YY+URu5 ' y5 = u{TYuqY_^UVWx 909=t u0x =,9h d }EG FfFFjVj_& %fF=p t h|%YjEP5$& y hXY09x t | 909|A=l tP!Y,09| h d _^U VW1E5(9,99UsU9ttW9V}E ؅t09X9W|1,99UuDu@B,9k P5(9 YY(9u hY,9Jk (9ׅtUFU 9V~09,9VU V09V_^UVW,099 (UMZ9t=p hU#YxUJ ρ8?t(=p WPGPh# <E(EE9uff8989 89 كk~ueV49 49 ً49 ʋ 49 щMr=p tuhX"YYR}r +UЉE$UEu0YY=p t#E0YPGPh! =| u | _^U(VW(5U9U}=p h!YE(5EW9W W 49 49 ً49 ʋ 49 с\8 St EuEUJ9MpU49 49 ً49 ʋ 49 щMU9W uEuuYYE뀋UfRf8989 89  09M܃}t }uU܃x9| ~ U܃x| =p tJw YPhh YY}t)h YE؋]؋U3prh4_^Up p E:Uhh pYYjYUVW1҉ E9}U :-U 4F>-u ~uG>=tq>uG9}uaU 45= t@>uG9}u0U 45 됃}t>uG9}uU 4ubl Sp D:F8G9}tEEPOYEjEPj 2 jEPj " =uhTYu = uh-Y u  }u $7j|Pu* x|:u $9xthhYYEuhh 5YYj}YU#JfMj5+YYy 5 YE+2fUfUfUfUEPh@n@5 y hxYj5 YYy 5 YE3EEEEEEEPh"n8@5u y hXcYEPY=h kh h(5EPnpy,= u 5Y= t'5YjY09pMY=d khh(55EPpy,= u 5 Y= t'5 ]YjY09pYh Y| 9x }x | EEE}u1EPjEP = t= t hLYjY097UV5 Nx <9^U= t uYUVW` Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW uYƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8j<Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV| uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EPY/>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWYZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_   U  U VY=VhYYVhwYYƅ>-uF>+uFjVEP ƅUU j h5 j 1 VhYYƅpj h5  >t>,tjVEP ƅt5U >t'>,u"FVY=xwVhYYƅu_^UhYPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4 4EU M R+Q¤ЙЙUuW +UЙOIkkE04 UM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F+ - . / 0 1 2 3 4 5 6 7 8 9 >xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVW59@ Y DžD7u YYtw>t6u YYt} tu w YYu=9u _^UVuFPFPFPPhh+^U$UUEPjj y UL 1UVW5L L }׃}~9r }y 9vWYu_^UUUBUVu {95 tF9Et5 EFEFEFUVUV 395 tF9EtV  FN ^Uuuju ujOUuuju uj2Ujuuu ujUjYU$VWu95 tU t>uF1P}jYE]9  jvYEE#EPzYEEPEPj E+U9}v}W0YvF V FvvPU F V RFvvP| F V 1F^vPS F V F}t!jYjEPj uY~u~ u 1_^UUuUYUVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$UUU UUUEPj6jw U$UUUUU UEPjjK U$UUU UUUEd*EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$EPj jI y}tUEEU$UUUUU UEPjj UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuvE =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UUUuuu d UU Uh uuB UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj`YYEUuu huWgUVWEu }10ttOF"FFF FFsst#ff_^]*USE] ![]USE] ![]USE] ![]UVW}u M{UVWE_^]UVWME_^]U= t jYUVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh4 u%dEuEu1k0Z‹N9t3> t> uFs7hVYYƅtF8_^UVW}Utu >t]9uFG1_^U$UUEPjjW U$EPjj= U$UUU UEPj%j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$EPjje UHVuUVUVUV UVUЋU UEPY^UVuEPoYjEPj9 V5hjKj ^UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U G}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu ƀ}Xu9utUP3YUE_^U4VWuEEEE }%MJxUʋFF VutYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UP JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEp E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPTYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuxYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVW11}U9 u  F߃| ju[YtUr YtURtUzt rY} t} t} t uzY_^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hkYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } .(~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv9 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E  sU :t! EE E ( JU uuuYYEy@Ut8huYYE~" tuWYuuYYE}y1]jYEu u"Y1A!uEUMJUzUBU E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UjjuM E`UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuj jV ^UUas U EUh@ h .YYjvYUVuYƋU rU MJwU uRYYY^U$UUEPjj U$U UEPuYYEPjj U$EPufYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUu hT$u UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ|tPXPirdpd: %s: %s %-40s %6ld %02d:%02d:%02d Routing table send to %s: heap errorsending router solicitation failedBroadcasting router solicitation heap errorRouting table after RIP-%d packet from %s: Strange metric %lu RIP-%d packet command %d ignored Bad sized route packet (discarded) This router advert is valid until %02d:%02d:%02d Routing table after advert received from %s: Bad sized ICMP (discarded)  Usage: irdpd [-bd] [-U udp-device] [-I ip-device] [-o priority-offset]  I Ug b d o sY asyn_wait()can't configure ICMP channelsetting UDP options failedirdpd: unable to look up the port number for the 'route' service udproute/dev/ipIP_DEVICE/dev/udpUDP_DEVICESaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error%d.%d.%d.%d"@"*""Z$##$)$No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/services1 Q1@12X2bx2d2i2o2p2u2x23 t3#y3+o3-j30~3u6L]4hG4lR4{4E6G5Xg5bg5c5d5e6f6g5i5n4og5pg5rU6s!5ug5xg5(null)>a>rg>wv>>+>b>cannot print floating point GMTGDT U U XPH<0(xl` SSSSB 9 ((((( AAAAAABBBBBB Unknown error|pTD, xlTD8$l\D4(T T T T T T T T T T |dH4(|dT@,C  09`$xj1$T$Ldsu;SSSSuXX QRP8 PB UVW} )@M}:-z7FE=-u~u MF>7M) )뎃 )녃 )ys75)aFE>u7MV6YHE0U2U$UE 71҉UUEPEPhVg}~ }~}~zUJ )͠#UJ )ͤ#)j,VmYYƅtF7M}~ >-yE@g )Z)$ )B )6 )*,$6@E96}th7YYth7TYYlDhw9YYHj;Y=u =t'^Euۃ}yhtYjyY_^U5)hh jRYUV=u k=u[9jhYY9jhwYY 4p4PYYƉ^U=)u j@Y5H YEj Yt% 4p4P`YYtUYh4P9YYu%j5L5H jY ULU)u )t j@YU)u )t j@Y5H YLjYUUth4P YYh4pr YYUtj!YUtjYhj  YYU VUUUU19u~G9ut?h=)t ) P YYiE Ph4 YYF^U VW1҉U9=)#UBUt+U9#}iE P#45)t>UAMt$h=)t ) P YYhV2 YYGkhj YY_^UV> > =)t*>J)98> t3> t.F؀> t> uF>t> t> t > t> tF>tFiE UAMP<}Y}td`PhhRYY5iE PUE_^Uu uYYEuuhYYEU5)hh u uh  hhYYj5YUVuj jVC ^UV5\Nx )^U=`t`uYUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+h"}t}y UU_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvV =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFFF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E K)U :t! EE E ")U uuuYYEy@Ut8hu!YYE~" tuYuu_YYE}y1]jIYEu uY1A!uEUMJUzUBUE_^UUUuuu UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UVWu1fϋV€t}u ~tu>FtVIYU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv( ǃu}_^U UUEEUUUUuYEuu EPA WUW}0))ϊE tu1_]XG_]UVWE_^]UV0U90wU090vh 16VYt1'0rF50&Y50^UVW}u1E}UUsh 1=,u8jlY=u1V!փ5,50FE54OVU}9}r69v2W9UvUW~>}t E4u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=4<9}r79}u+UOJ}t E4URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb154t 9ur6E0tU U4tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډhF_^U$UUEPjj U$UUEPjj U$U UEPu$YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*u^YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuoƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuhYY=u}t UډE1!,'"U8EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UhJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PwE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPHYY=}t UډmEJxEEFFEEVP YY=t6JxEEFFEEVP YY=u}t UډJxUʋFF Vul YY=u}t UډMuUUMRJxEEFFEEVP YY=u}t UډdZ}~UUMA C D E F G H I J #JxUʋFF Vu YY=u˃}t Uډ E_^UVWu }E8$E)E EEE +-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G h{E=cF}[t@}nt:JxFFSXV7YEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=8r}8u8-t8+uEE-8EE}dt}iuuEPh8 EuEPh8 EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE8}8s UE?]u Gƀ8?Z?]QGƀ8?-uG?t2?]t-G9"G@E9EEƀ8EGe띀?uEE83]uVuYYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE83]u}t}t Vu`YYMEUEt }vE}uEuVu E=8r}8u8-t8+uEE-8EEEPh8&YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY Ef EEu }ntEGV}u}tE_^UVW}Wu u@ ƅ~9})׉U U 1_^UVWu }` ~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv* =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhhjYYjYUh8hJYYjYUVuYƋU rU MJwU uRIYY^U$EPuYY1ۅÉUu hT$ue UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6jG U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7u.`=}aa1ۇtPXP1M11?;1#/T1$2$aejont vrr-%d.%dUsage: %s [-an|-vn] [-e str] [-o list] [-tc] [-1 f] [-2 f] file1 file2 missing key field in file2missing key field in file1file1 is not sortedfile2 is not sorted01null line in file%s01too many filed in file%scan't open %s %s: ?a,rw+cbY ]@Xbdiopux #+{-v0LihSl^EGXsbscdefginospsras-usxs(null)y XG bb dP iG oY pG uP xG )&L&h&l &&EI+GI+X='[)b='cO(d='eI+fI+gI+i='n&o='p='s(u='x='cannot print floating point cannot print floating point <SSSSBl ((((( AAAAAABBBBBB x*  b$;=1$T$L_bsu;SSSSu<< QRP(} P莢UU$U  =5=hDYY====yjY蒈=d=xʼn===tL݃}~Bʀ===t/K==u hY==tj螋Y^===tKU1U1U$VWu} =>x1&U=>jV;YY>yVYjVhdN ?u?hVYYu >"jYt > >>=>~EVYy0Vhh_u 5>7Y>O>?y>hb5>YYhb5>YYh c5>rYY1_^U=>y1W=>t^th h_YYb߁fb.5>xY>1U=>y11UV=>y0jYhbj5> ƅy hDY^UVuvYƅ~JU] 9u JUN1^UVuEj/VYYEtEEPV-YY=uVhph_ E]MRPPh\EP[EPhXuhcYYP^YYPVYYEPhcYYu4hchPxPJYYP"YYxP贱Y1^U VWE>uYDžyIu1@h$hcYYƅy"jEPV8 VgY>1_^U=>t hcY1UVW} =>y rU=uYƃubfbubfbub!fbubfbbfbb@fbbfbbfbbfbbⳁfbbfbbbx 5b5bhbj5>f y(1_^UVW} =>y MuIYƃu cf cu cf cuc!fcucfcc⮁fc cf c cf ccfccⳁfccfc!c#cx 5c5ch cj5> y1_^UVW}y y0|prhaZSLE>71uhh_ hh_տYY Et_^U=>y >>1UjhbYYU$>jj̪YYUjj蹪YY1=uC]jKYE1ۅÉ=uj航YYuj|YY==t#jjhYYjj]YYjjRYYEujDYYhuj6YYh. j(YY=$>t $>>UjjYYjjYYjjYYjjکYYjjϩYY>U= >x >U >=>~0e0e,dMuhh,d5>; >~ƀ,d=>u!==t_'4-=>y1҉0eЊ,dM >EUE >U1Uuh48P5 8PYjbYUjhb趴YYU1UV1x 9u~BPu VZYZ܅~U y^UV=>yu u5>M ƅy^U=>yjEP5> U VWEE=>y ==tEU}th j蕧YYuӿY5PjhbP t EhEEE~8U +U9U~ U +UUUURuYYEy?EEj"YE=u EEUUUUU9U  EU9UcUUU#EUU]9u-EUUj;Y}t jjuYYEUU%=uJE}~Hj莾Yjj<YYhXh_軺YY/hTh_襺YY%EE7j>YjjYYE_^U VWEE==tE=>y }5E=t}uE}y U#Uh j^YYu蜽Y5`jhb t E'kE=t}uE UUEjKYjjYY}yE#E_^U =>yjj5>追YXUUj輽YbUVj詽Y+by1^UEPYEPY]UjYu16hTcj6YYhcj(YYhxcjYY >1UVj诼Yu1= >uM b=cfcc b ccchcjj蜼 ƅxjh_YY^UjYu1= >uM b=~c⮁f~cxcfxcxcfxczcfzccchxcjjλ U= >u13jRYu1#j肻Y=hTcjj艻 UjEPj蔻 Uuu j UuYEPuj] UV1U:tU4YF^UuYjhdj U=$>t$>h. jɡYY1UVWE};jEPjr E]]}~ M}h j`YYu螹Y5hjhb t E jEPj E]]jTYjjYY}~E_^Uj j茹YYUVuVtYt1uu You,jHYthuY1OT>_>hu 膳YYL>u h荵Yt1^UVuVYt1tuX>_lhu YYL>u hY,bPlPu  uj4L>-YYt1^UVWuV0Y1\u=l>t 4_t_t4L>衫YL>u_^UVWuY WUL>֋JxUL>֋уU4L>߭Yǃu U 1_^UuEYU4L>u ^YY1UuY,U4L>u /YYU4L>hYY1UuYUL>uu r, UVW}WY uL>jE Pr eL>֋JxU L>΋ ˃E 4L>PYY=uL>R t11_^UuhHh_б #EmUu1U VWEPuYYƅyBU!tt&juYYƅy }x1_^U@VWUƉU1EEMEtFuJ~ J|/tOuhhEPYYD=jEP|YYƅy1_^Uu4YUVu>t)-A=s PYU E FҋU ^UpVWE}u>d>/uE}M-a=sP襞YG/>~uXG$>#uXG>.uE}~XGGFu }.uXFEPVYY_^UVU:uhlYuVeYu1^UhtYU|UVWEP詳Yt1P4eEu YjYjhOYYy1juYYjuYYuʲYPGYDžtW :uUUW UUUր>t Fl>_^Uj 54ekYYu#jβYE94et}u4e5T>Y1҉l>T>UhhLeu 8e~ mLe8eU8eI 8e~mm0uDzYYU8eBU$VW1EEEEuU:t E FGU܃9}E܍u-E}kE E*FNhuYEUIM~2mmUU:~u؃RȆYE9E}ƉEUJ9U}UBRhV药 E u NOEi_^UVWu1҉UU>/uF>jYDžu hlYG}u}Uz}E}}>/t>tFUEU}| >/t>tF>/yFsE_^UhVWuCYƋU:/u E/}hEPְYY}tt mU tUtWEPV t V1Yvt_^U,VWu}uNu /Y%WYuJWVNYYVWeYZEPu lYY/FVu w EPu 8YY=U@u YEuYEsjPh?uFGՀ>*u Fu}ǃ}tU:t E}u1_^UuUduUUR T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  duuu<+<RYUuUduuUV=<BEu9~=uuu<=<^F=<^<<}A <}ӈx <<}A <}ӈx<=<uI<EP>YD}9<} <}@}<EPY=<~V<<}A <}ӈx< <<}A <}ӈx<E!E%E=<t*}t$<<}A <}ӈxU |u,<}A0=P <}ZxE5@E0=9u <}A0=P <}Zx=<t(95<u <}A0=P <}Zx=<t(95<u <}A0=P <}Zx<}A <}ЊMx<}ƀx^U VW}<Gƅ=<t95<uG- <GE=<t95<u EG,=9u$Gƺ!U@r}_v}?u@ u=<u <==u Q u =<:VU Yy <1_^U塀M1UEPY1UE#=Pj YYy=1UVW=uu:ut>hu>YDžu8u1҉<}R=uu=t>u1҉<}R<}<}t>xt<}t>=uu 5<}<=uhuYDžu u<}@}uPY u uU9<}u5<}LU9<}~1@}xt>tF@}<}Ƃx5<}5<}X_^UV=|>~|>U =ut!duduU1ۅÉEPj YY1=uCޅt1LE#=E==u} u|>U  UM ^UU:Xu =U:Zu ===u ==t1U1҉ U=udu<1҉<<==t==8=4=1҉==H}==t <UEP@YujYPTYUlVuEPY=u5=Yyh`jjj S18=u EP5=YYEPY=0==t hPUYh@jjj S1 ƅ==uh$jjj cS hY1=u~ ƅS1|=uuC==t)=:t5=hYY=hhYY ==u==u 5\=YjS Y^UVVV軤Y]P54=S^UV1҉|h#5tFYY=|uhh|7YYh|jjj%R==t&=:t5=h|YY=hh| YYƅt'hjjjQ5UYhpjjj Q^U==ut1=DuC== =R YE==u ==t =AEU1҉==vAUdV}n=:t5=EPYY=+==tEPh@YYhEP轢YYhYu1uhu1҉VYh4=Yhx5<}54=}tXFPV }uO=x=Yh54=jFj"PEPjjjPh5jjOhhu54=jXjO5SYu^UV==u ==tF<+<RYƅu#h4=YhxV54=jDe ^Uh4=Y}tU:tuj54=jZ/ hj54=jZ T?Uh4=CYhj54=jB 1҉==?U=<^~ y~ <y <z <{ =5@|(= }~#=t"&<<<黶<0<=<t<~=<t<1P==t=1Z P==t=1Z  ==t<1 <Bӈx<<_Й <ӈx< <ӈx<ƃx=h=t<R=YyUVW}O=8}~ G- PƋ<U=<t95<~5< }P<=<u-=8}| G- ƅy<<==8}|-G- <=8}|_@===8}| G-  $=$=| $=~$= =8}|G#ƃ ~?| _~ }#0==8}|_1<=Yu<=< ~ =<?|=<_~=<}<t<e<e=t\<<&F<9<t =<Yu1<t<<<S=8}|G-0ƅ~~5<=8} |;G <= ~ =<?|=<_~=<}1< <1҉ ====8} G - ƅ5<t=<t1=5=t==t1=5=t==t1 =< <- t<98}|<փ==<98}t<- k_< ƃ=<t9u~E<~<=< } <P= =tA<B98}~(<B- ƃ~< <=h=t 58}?9Y_^UV==t1=uu1=u~:I ~0h(YY 1X=uyhYEu19h+YƅyhjjjGm5b^UlV=ut j=uuuVYYt=EPuYYEPVYYEthjjj ?G1^Uh=|=thj.YY==u ==t UU==tuuYYuEPϘYY==t.EPY=tEPEPYYuEP蘘YYEPjYYu1EPu uYYU1҉hjaYYU=ut ujY==u ==thjjj FhjjjE1҉==UjYEyhjjjEK}t2==u)=t hYhjjj}EhjjjhEEU=hhhu3YYuu<du==t==UU-EURYt!EPYhxY1UVW}t?u1yhu?tGFE E FuhhujYY~C1҉u====t==1_^UVW==t==i950}uZH18=94}tTtQt N9=<}%hhx莕YYtxE~Eu EoNu4=B?94}uYQ==t==x(VG950}uG;%_^UVWEH}<==PlYE195<~EBEPhH}VZYZ@=P5YBPhH}VZYZBV֏E U R YBPhH}VZYZE0}PYBPhH}VZYZU=<׃_j Y]H}_ PYBPhH}VZYZ_ RrYBPhH}VZYZƆH}EH}PY P=YBPhH}VZYZG"PY]H}UIM~%EEPYBPhH}VZYZƆH}EH}P7Y PYBPhH}VZYZEH}P+Ylj? RYBPhH}VZYZ?! R]YBPhH}VZYZEH}PYǺ! R YBPhH}VZYZ? RYBPhH}VZYZ?! RYBPhH}VZYZ<馨$=PYBPhH}VZYZƆH}VhH}YYy k5<=5<= =l=t3h(jKYY=H}thH}jcYY ujUYYEuu Pjm?_^UV=uEYE!=>C 5>5$!,鴧^UVuYƺ!?!։^UVW}=tE1?t #EG!_^UVW1EEDžtE=t1UiE1ЉƉ1UiE1Љ묉_^UhTj54=jYh4=PYUuuYP54=jYh4=#YUhXj54=jNU=<=t5<=hH}YYhl54=j%j}==l=thhj YYh\j+YYUuHYhx5<}54=jE9jFYhxjjj=Uu YEhx5<}54=PU5=Yhx5<}54=jRUE8=EB@ЙEUh|-YjxMYU$VWEଅ8}4}t=L=tP=(=EE}EP5<hh]ƅy.}jLYh54=jTj;T551D=9t 9}EGBWZ9|Eh}| Ql=l=thj YYuj.YY}BhWZY- Uց~ Q EƆEPYU 9t QE k_J + < 8}"} Q+<8}1BhWZY- 4}BhWZY] t8}ց~ QE<9U}UЍUU􊈬 EۍUUƆEPY] 9QE- ] É]EPY9EbQqE- ]  E- ؉E]ìSY9EtQ/Q(<鸡u54}uj9E_^UE?U?Ut t ?뾃==t? jӉY x? g?  ?jIY?\=?  ?CjIY?2?  ?GjIhY?j7Y? h4Y=(=}jY(=15t!Y<<[!?z5t|Y= ?t ?5=PJYY ?=? u_??*= ?t ?5=PYY ?=? u??|h#5tYY=|ct?? 5tYPvY4=8=Y|h#5t6YYj2Yj*Y | =? |h#5tYYjYh0h|AYYt?hoY? hPY? h}Yu h"YS? ^h~5<>YYt?9hY? h~50>lYYt?hY? hjjj41hjjj44t?xhYN? Yh~58>YYt?4hY ? }(t =( u1(th5@>(YY(t?htQY? h~5H>YYt?hh\ Y>? Ih4Y? *h#5tYY==t? j*YhthY?h$pY==t? j҃Y'h?}T4==tA? Lj{YW==t h /Y==t hYh#5tYYWy5hY==t? jY?5tY<<5=eY(t@?_==t,PY==t? !jPY,|h#5tYYjY=|t+yh~Y??5t.YtRh@Y?t&hY?U~T5=$Yt?-hY==t? j4Y?==t? jY5t =Y=(=@jY&(===t==u h<Y==t&? 1j`Y?hY==t? j.Y EzUh7?ZY==t!=H=yh, jjj .E5`=EPh" yh jjj y.G}x U===tH=E55u詷 yh jjj .==xuB===u9==u5<Y"hYhY ===vu==u==u hY==su==u==u hlYj~Ya==t===u hTY蔴hPjjj--UVWYj;uh8J t8xGFЄu>>u_^UU JRh8u UU U=Yu 5,YxYh8h zYYUYuuuUu=usuuU YUVW}?t?\u>tNFG_^UV} tuh yYYSEPu u ƅy7hYthkRY]uh yYY^UVU:uE E EPu u ƅyPuFYtuh 9yYY-uYyuh yYY UE^UVW}1҉UY| Ut k Eu YYRY]YUyu}uU :ujj7hY]tG7#YEu7hd HxYYj5}y7hD -xYYju7uYhh8h4 )u  E铏E_X_^UVu>t>*t>?uF1^UVW1҉׉YE 5t Ru YYE=Yu U E EE:uu-u h MtYYu Yu I YY1_J_x__Yh_jnYYIU:u h sYuh sYYhh8h s 1J _^UVW}Y=u7wYuX u5tƋuYuu=uuU =uu"u hT rYYu YY_J_x__mh_jmYY]U:u hD rYuh@ rYYhh8h8 }r Vh mrYY Ԍ_^UVW}1҉YUUu u+ YEYUu=Yu u YEPu hWDhhD qYYRhh4 qYYR^\ VL=YeU:t(uh0 XqYYu YuT YY5_J_x__h_jkYYEPu hWƃu5_J_x__h_jkYY|u"hh pYYRbkE YURh tpYYu YV5EPu hWƅx$kE hh80h ,puh pYRU:u h oYuh oYYEU 9U}HkE 5Yh0s u$kE jpZ YYukE 0ZYEhh8h jo *uh XoYYRp E鷉EX_^UVW1҉Yփ=u15Y~hh nYY1~_J_x__h_jliYY뒅~hh nYY3h vnYhh8h an OX Ɉ_^U1҉40UVW}0195(Y~"?tG4A 4ӈFր?t4Jƀ+$Y=(Y90}#95(Y~84A 4ƀ F݋4A 4ƀ_^U4A 4ƀhh ^mYYU VW}u YEt} 1UJ9yk u 0pYYt?k uu 0q 1ۅÉ]t.Bk uu 0p tE0k @L}t?F{UJk uu 0p uUJEUJk @_^UVWE1Euu=u1҉׉UuƅuH= Yt_J_x__SX h_7eYƃujE}}u\u Ej u h XY u uut-_J_x__ h_VfYY=0Yu uuu5u$Y0Y1҉R t mut-_J_x__ h_VeYYuu5uY0YR1}uX?uS_J_x__ h_VeYYu5uDYRu&u5uYRt =uv4hiYuu: u 0Yu2_J_x__h_jKdYYu9u$RuHu u=vh4iYu0YR=uwC_J_x__h_jcYY!R` u=ur'u: uhhYu ú=ur'u: thVhYu uu0YRu%uhh8hh t-_J_x__ h_VbYY0Y}t tuuER_J_x__h_j5bYYh ]gYRX_^UV1U:t$=usEuSuZFԡuu uuu^UVWuY> uF> t> t>t> tFGYGY_^UVu>t-0= r1F^UVWu1>t-A=s P{SYFG܉_^UU Ut1UU1UEy u%fY1UV1ۅÉ]tE21U:tUh_4dYYFh_j dYY1^U1U1UVE hhseYYvEPhh \EPhh BEh|heYY#uhX eYYj(EryVuh(hYYE(ƅVj]Yuj譮YYƅ~uhhYY5l=VLj"YujrYYƅ~uhKhYY5p=Vj DE~X^U1U5=5<hpd hT*dY5H=hh4c ==t h,cY h$cY=tPhcYYh cYUhcYWhcYJhycY=hlcY0h_cY#5hLcYY$}h/cY=T=t hcY hcYhcY=u hbY(=u hbY5hbYYhbY=L=t5P=hbYY hbY==uPh`qbYYh8ebY=<u =<t h$HbY5<5<h 1b =<t hbY5<5<hb 5<haYY ==PSha 5\=haYYD=@=PSha 5<hlaYY(=$=PShTwa =<t5<h4[aYY5<hIaYY=<tP,aY5<haYY=<^~P`Y=<t5<h`YY5<5<h` h`Y==thh`YYhh`YYhp`Y==th`hhn`YYhPhX[`YYh8O`Y=l=t h;`Y h0.`Yh#`Y==thh `YYhh_YYh_Y=p=t h_Y h_Yh_Y==thh_YYhh_YY==uPhq_YYhe_Y==t hxQ_Y hpD_YhXh`4_YYhTL_YUVh_Y5h_YY5h^YY5h^YY5 h^YY5ht^YY==~?k =VhT^YY=H=~kd=H=Vh0i^YY5<5<hQ^ 5<h>^YYh2^Y=<t5<h^YY h ^Yh]Y=<t5<h]YYh]Y h|]Y1^UUVEPiY=~8=~=~&=k ƃ=H=~ kd=H=^UUUVW} hF]Yh;]Y1 hhjhZƅy Ey 5=1x EP5=h6 EyU 荕5=u`YYt=E5`=EPu yhl}x U=uhF`YY==u H=1hdhhjh4YƅyEy5<1hh=YsEPj h4h8j^Vuh\=Ah(h0jhXYZƅydEy 5T=1EPj hhXVuhX= hh5YhpYƅMEPYƅy1}=1shhjhdZEyNEy=U=1-hhjh|ZFEyEPj hhcƅy}t}thtDZY ƅyU=}u =}u =1~h=YnhXYYY\@thHhT5ZhYbƅy#lEy51h<hD5`Zh Zƅy$EyW~1L=5P=1EyU`=1h0h85ZhZƅy_EyN5t < <1'EPhh EyU:"u!ux\YHEE8"u UUEuY1EPj hh'j^Vuh<hhjh[ƅpEPj hhƅyK}t}thWY*sƅy}u =}u =m uhth(*[YYhTh([YYhPh(5YhYƅEPj h h$VuEP  ƅyM u U(= U$=-EPj hhƃ uBhVuEPbƅyU<}^~^E<5hVuEP ƅyU<<}^~==u hUYvEPj hhVuEP ƅy? u UD= U@=EPj hdhhzj^VuEP\ƅy u U< U<EPj h0h4!VuEPN ƅy u U = U=oEPj h hj^VuEPƅy6 u<U< U< xo==uhdTYhYTY1L(hh5LU EPj hh(ƅy1ۅÉޅtzuvYƅyuhhSYY'5H===u5H=hhXS 1/xEy!hh@SYY1 m_^U E EmUVhhjhZƅyEyE01^UVuy7U9U ~uhRYYƅy U E1^UVWu} y4~tWhRYYiƅyE81_^U&Y1 h/h/5(^h] E=uh/<:YS }yEE E0 =h=uh/9Y1 Ph=j~Y =l=uhh/9Y1 l=jEY =p=uhL/9Y1 p=j Y =t=uh,/P9Y1j t=jӃYL uh/9YY16 T)ESEPh.h.O Ey uY EPh.h. Ey L(u5<>h.5L::h($Y1 EPh.h. Ey} U:E=\DE1҉UUU=0|)=7}}Uƒ0UEEM_J_xU__h_u2YYEgh.7Y1 Ex jYE dEy ==uh.n7Y1 hx.h|.h.jFR=1c ==uhX..7Y1H h=h(.h,.m E=t}uE E=:=d=,d=4jdh(/ u h.Yh(pYh(:YE}~0UJЀ( tUJЀ( uUJƀ(M=(d=4hh/ u h-OYhYh:YE}~0UJЀ tUJЀ uUJƀMʀ=u =( =EUj(EP诺YYh-UY5=YE==u褺}uh=h-h- Eރ}yEPYEW=:uh- 5YEPڹY105=h(8YY=(ht-謹Y5=lYE==u}uh=h`-hd- Eރ}uhP-4YEPNY1}yEE}u 9EEPY}u=r==t x=EMh4-h<-5l\h[EPY!h$-h(-5(^h]E=uh,3Y}yEuYEPh,h, Eyu1 Y=,h=h,h,˹ E=t}uE`EyO=v==t x=1.==uh,2Yhh,hl,5]h]E=uh4,2Yu-Y0,==EPEPh,h ,|Ey#}uh+b2YyEquh($6YY=}u#h=h+h+n Ey&Ey=(=:t=s==t x=1Ey=x==t x=1h+h+5]hp\)E=uh+Z1Yq}yEcuYUEPh+h+{ y 1x3EȅEx+3P "YEtP :uuUr uU:t E:/u}U:ujht+WVU3juhp+WV?3j YFjjYYjjYYj3YE9Et}t VjzYYWjnYY5X=OvY1Ch`+hl+jh,^ýEyE 5?5<hL+/ 5p>hD+/YY5[5Yh8+/ 5=5=h,+/ 5,>5(>h +j/ 5D^h+W/YY5l^5h^h +?/ h*0/Y p)EI1;Ey*5@>iY1ǿEy=d=~h*.YEPEPh*h*襵Ey#}uh*.YE}thd*h.Yuh(<2YY Eybh`*h(+YYd=d=uh(-Y d=1%hhL*-YY )EZH_^UFu)E5X=sYEUjhu#YYULVW==uh2-Y=H=yh|2h-Y=X=x =X=~5X=hP2;-YYp5`=h=hd y/UUhh82u. EPc,Y%5H=hh2, X=RRDYPh1, h1,Yh1,Y=p=thht1,YY5X=5sYyhH1f,Y55H==iYYysh15,Yk.Ejj QYY.E=u"zsh1m+Yh0+Y1'}45|0jhu! h$j YY=4jtY#=E%9X=ujsY%EP,YuYPrmYx>=T=turY=p=tuj`wYYvp=gh0x*Y4Mj u-YYj9.YRrh0*Y1 j-YjoYEy5=_'u h0*Y h0*Yj ul-YY}-U#=UR'rY=p=t ujvYYkE~}~EhlukYYE~0U90} 0lE#=0hluqYY=p=tuhlju j_^UVhH^qYh2qYjrY!VHqYh2qY^UVv} }@3URh3V+ uh3V* v^UE9X=uEP覛YE]S1kYE-A=EPYEs4h4pYgn]a4h4pY>h4|pYhqpY=H=x#5H=h4h8* h8EpY==uPh4h8) =t[h4 pY4hx4oY6ht4oY)hl4oYhd4oY3Bh\4oY=p=thL4oYhoYhH4oYDEeEEPYE]SiYj/oYE3 BUj)YU1U1UVuj jV ^UuYP,YUV5p^Nx 4^U=t^tt^uL)YUVW<Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW u&,Yƹ<^+F؉F^+ډV YV YDžt"<1FF1V Y_^UVvU9vwUv9vv_ 16V,Yt1'vrF5v&Y5v^UVW}u1E}UUs_ 1= vu8jY=u1V!փ5 v5vFE5vOVU}9}r69v2W9UvUW~>}t Evu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=v<9}r79}u+UOJ}t EvURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV4' uY_^U VWUUb15vt 9ur6E0tU UvtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh_EP;>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h^VW ƅu1WW#YZ׀>/u5Fuh^VEP ƅu19ut EEG>,t1jFh^VW ƅu1MWW`#YZ׀>/u0Fuh^VEP ƅu1EEGu>t1_^UVWuE}>:tVhv"YY_^^^U^ ^U^ V"Y=Vhvh"YYVhvwYYƅ>-uF>+uFjVEP ƅUU^j hv5^B" 1^vVhvYYƅpj hv5^! v>t>,tjVEP ƅt5U^>t'>,u"FV!Y=xwVhvYYƅu_^Uh5YPLY^^^^UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J _4EU M R+Q¤ЙЙUuW +UЙOIkkE0 _UM 9_^UVWuE^^E=^u^V =^u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t^ F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+_"}t}y UU_^U VW}Eyt 1}uE VYFu5=_<2h_h5 jYEPYE9Et}u}uEu}u EEE_^UUAs UEUUas U EU$UUEPjj y U\`1UVW5\`\`}׃}~9r }y 9vWYu_^UVW1}y11< `t,|1Fρ(1E E 5Z,U :tE E 58,jYEu1EttEUMJUzUBU `E_^U=_x 5_Y__U=_x=wu w_j5w9YY_y'j5_YY Pj5_ 1U^UwU|{=_u/hhw5_$ _1V|w=||u1< _||||= u|{U|U|U|:u1|: t |::uҋUEUV=_yy1u1|tx|tjƅtjjV f|LƅtjjV |/|t!|y|g|:X|^UV%ƅt F9Eu^UV{ƅtu6vYYu[^UVWuU VVu YYDžt~~yVډ_F_^U$UUEPjj ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s_KVYE=u_&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WA }׃E뻋EEU9vGumYEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU 6E O&UUU UEPj7j2 ^U$EPjj U(VuU @t*uYEU UV֋RUUUEPu8YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE@EPjGjX U} v_M E 1U} v_M ҋE!1UE1UE1U} v_M Et1U$EPjj y}tUEEUUM J} t U RgY]uEPu $1UEUUzt RBYuh|#U RuZBRY|G$UVW11}U9 `u  `F߃| jugYtUrYtURtUzt rvY}_t}_t}_t uRY_^UVWuEu41}%< `t4 `YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv3 EU9Uu1 N _^UV1}*< `t `Bt 4 `aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< `t, `R@t `Bt 4 `YGƒ~uF|FF VVv vvi >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }t^~y UVu CV€tu ,fNV~_u>5_Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvr =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvc =u N 3uvvl uNN N_^UVWEE11< `tN|1DFρECEE0-EMP1E E 06U :t! EE E P6U uuuSYYEy@Ut8hu YYE~" tusYuuYYE}y1]jYEu u>Y1A!uEUMJUzUBU `E_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UVW5_<YNj5_h_Yh_Y}t.U:t&uSYPuV jhl6V W/YPWV jhh6V _^UU Uh_uu UVW}_E?t:JxG^FSX GVPgYY=u0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VW|hp6VYYUR<^EMxGFFUR<^EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY|_^UVW|EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh _u%dEuEu1k0Z‹N9YYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 6 }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE6uVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U(7 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UX7-JxUʋFF Vu.YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE8UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEx7E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPpYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP.YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^s7UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~u"PpYYUhh<h_YYjYU$UUU UEPjje U$UUU UUUEPj6j; U$EUEPjHj É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉1ۇbtPXPC-Kermit, 4E(070) 29 Jan 88C-Kermit Server REMOTE Commands: BYE CWD DELETE DIRECTORY FINISH GET HELP HOST SEND SPACE TYPE WHO C-Kermit server starting. Unix tty I/O, 4E(047), 27 Jan 88 Minix/dev/ttyExclusive access to %s denied /dev/ttyWarning, problem releasing lock tcsetattrls -l /LK.%03d.%03d.%03dWarning, can't access %s /usr/spool/locks nV,`j` t{%KCurrent speed not changed Unsupported line speed - %d fatal error in initrawq: %s ^C... Unix file support, 4E(037) 27 Jan 88 Version 7 Unixrm -f pwd cat ls -l df df who zopenirTerminal input not allowedzopeno can't openw ?File number out of range - %d ./HOMEHOME(directory unknown)r-c/dev/null/bin/sh~%dmalloc fails in splitpath()././C-Kermit functions, 4E(053) 14 Sep 87stdinNo readable file to sendNo readable file to sendFile not foundFile not foundToo many filesCan't open fileNONAME-n--n--1000Can't open filehelp textTimed out.;::;s-<e<m<o<s<(resend)s-(resend)User typed ^CBA BDBr-Wart Version 1A(005) Jan 1988C-Kermit Protocol Module 4E(031), 31 Jul 87B%B+CProgram's command promptnonenonexon/xoff?unexpected file parameter ?The choices are 7 and 8 8file byte size (7 or 8)texttype of fileconvertedhow to handle filenamesFile parameterDecimal ASCII code for escape characterfull5Number of seconds before starting to send1Sorry, can't open lineDevice namediscardType 'help set send' or 'help set receive' for more info. ...Use 'set send' or 'set receive' instead. ovjvnjvjv,jvXjvjvjv` jvjv%jvKjvjvjvjvon ?Sorry, %d is the maximum ?Not in ASCII control range - %d L{uw@yyyzL{L{L{L{L{L{@zL{L{zL{z{not working yet - %s Remote user name, or carriage returnRemote file specificationConfirm, or remote directory nameRemote file(s) to print on remote printerCommand for remote systemRemote directory or file specificationName of remote file(s) to delete? Password of remote directory Password: Password: take file ends prematurely in 'remote cwd'Remote directory name?File specification required }|}W}}} {|||}}!~~~~~%R*** screen() called with bad object ***%s: %ld%s: %ld*** screen() called with bad status ***Skipping [interrupted] [discarded] [OK], Size: %ld=> CTRL-B to cancel batch, CTRL-A for status report: CTRL-F to cancel file, CTRL-R to resend current packetN?a [Ignored] ^R - Resending ^F - Cancelling File ^B - Cancelling Batch 8th-bit prefixing compression block check characters file numbertextbinary file type: ^A Status report:User Interface 4E(059), 29 Jan 88unredirected -k can only be used in local mode-a without -s, -r, or -g-l and -b requiredeggugg؈aކхUσa؈)R؈؈$V؈؈invalid argument, type 'kermit -h' for helpinvalid paritymissing parityinvalid argument bundlingdebug.logUnsupported packet lengthmissing lengthinvalid argument bundlingunsupported baud ratemissing baudinvalid argument bundling/dev/ttycommunication line device name missinginvalid argument bundling after -lmissing name in -ainvalid argument bundling after -amissing filename for -ginvalid argument bundling after -gconflicting actionssending from terminal not allowedinvalid mixture of filenames and '-' in -s-s: too many -'smissing filename for -s-invalid argument bundling after -sconflicting actionsconflicting actionsconflicting actionsconflicting actionsconflicting actions Fatal: %s %s - %s takestatisticsspaceshowsetserversendscriptsremotereceiverquitloghelpgetfinishexitechodirectorydialcwdconnectclosecbye%!timeoutterminalstart-of-packetspeedsendretryreceivepromptparitypaddingpad-characterpacket-lengthmodem-dialerlineincompletehandshakeflow-controlfileescape-characterend-of-packetduplexdelayblock-checkbaudwhotypespacehosthelpdirectorydeletecwdtransactionssessionpacketsdebuggingversionsparametersr.kermrcr.kermrc/C-Kermit>%s,%s Type ? for help (<0Kermit command error: take file terminated.Kermit command error in background executionCommandCommand too long for internal buffer ʏ<u՛.Jovv~՛k՛՛՛՛[(F՛՛ٕ՛՛՛՛՛՛(a̖՛4M՛՛՛՛ѐ1ώNot available - %s r?Wildcards not allowed in command file name ?A file specification is required C-Kermit command file?Take files nested too deeply Nothing to show... %s %s %s %s for%s %s for%s %s %s %s Versions: %s %s parameters-c-i/bin/shUnix shell command to execute?You must specify a parameter to set ParameterName to send it with?A file specification is required File(s) to send?You must specify a command for the remote server Remote Kermit server command You have to 'set line' first Name under which to store the file, or CRText of login script?You must specify what is to be logged What to loghelpC-Kermit command(cancelled) Local file name Local name to store it under: (cancelled) Name of remote file(s) Remote file specification: take file ends prematurely in 'get'take file ends prematurely in 'get'Name of remote file(s), or carriage return You have to 'set line' first You have to 'set line' first Material to be echoed%s %s.Directory/file specificationNumber to be dialed ?Unexpected log designator - %ld ?Transaction log wasn't open ?Session log wasn't open ?Packet log wasn't open ?Debugging log wasn't open ?You must tell which log Which log to closeName of local directory, or carriage returnText of comment lineYou have to 'set line' first Connect Command for Unix, V4E(017) 14 Sep 87 Can't get character Communications disconnect [Back at Local System] Can't send character[Back at Local System] Can't create keyboard forkSorry, Can't condition communication line Sorry, can't condition console terminal (Session logged to %s.) or followed by ? to see other options. Type the escape character followed by C to get back, The escape character is %s (%d). Connecting thru %s, speed %d. Sorry, can't open %sYour escape character is not ASCII - %d Sorry, you must 'set speed' first Sorry, you must 'set line' first Command> escape character twice to send the escape character. ? for help S for status H to hangup and close connection B to send a BREAK 0 (zero) to send a null C to close the connection, or:'%c' CTRL-%cemߡošsҡ^  v0??2bchs8, logging to paritymarkspaceoddeven, , %d bits, speed %d Connected thru Dial Command, V2.0(009) 24 Jan 88Script Command, V2.0(007) 3 Aug 87SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ-csh/bin/shcd . arwH+0b&޽޽޽ar[wj+b : ??? ??? ?? ??:??:?? ???? kkkunknown error )@^XkbPdbiboYpkubxk[ L#Q+G-B0VML5hl*SEGX?b?cd}efgi}no?p?r-su?x?(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point ,} ZZZ  &Y~  ##l !"$'(+-.03569:u VUY=X tTjF PWH% u! _^UVW}5X t jG PV! uW,V WvjYƅu 5Thh  j]YjG PV! W,V X V5X _^UVWu EPj/6!YYTu TTM}:-hL6 YYu H dhH6 YYu P I}~ hD6 YYuVUM#R-YP~ L M^UX5\h<5TG YYuP h8uYYEuuYjYjju uudYǹ01t 5Th h # jYjjYY=thTjnYYhcj`YY01DžujY,UsUE+Uk0jSu1 uuj0P9Et 5Thh i jYMxkE0SY=\ tkE0,SYPh9YY=\ ujY\ hcjlYY떀=P t5Thh  ,P,YPhYY1_^UVuj jV ^UuIYPYUV5` Nx d^U=d td uYUVW uJ Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UV` U9` wU` 9` v 16VPYt1'` rF5` &Y5` ^UVW}u1E}UUs 1=\ u8jY=u1V!փ5\ 5` FE5d OVU}9}r69v2W9UvUW~>}t Ed u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=d <9}r79}u+UOJ}t Ed URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15d t 9ur6E0tU Ud tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhp EP*>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWhYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWYZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVh KYY_   U  U V7Y=Vh YYVhh wYYƅ>-uF>+uFjVEP ƅUU j hh 5  1 h Vhh YYƅpj hh 5  h >t>,tjVEP ƅt5U >t'>,u"FV-Y=xwVhh YYƅu_^UhYPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J 4EU M R+Q¤ЙЙUuW +UЙOIkkE0 UM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjjg y U( 1UVW5( ( }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ F_^U$UUU UUUE&EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UVW11}U9 u  F߃| jugYtUr2 YtURtUzt rY} t} t} t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvvw EU9Uu1 N _^UV1} *< t Bt 4 aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }d ~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvB =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv3 =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E $U :t! EE E DU uuu[YYEy@Ut8huYYE~" tuYuuYYE}y1]j YEu uJY1A!uEUMJUzUBU E_^UUUuuu UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVIYU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^UVW5 0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhdVYYUR< EMxGFFUR< EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^UVW@ Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh u%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE" uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U81 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UhQJxUʋFF VuBYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P[E6U U RU U RUEEEAE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP&YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPBYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF4FF VVv vv >uNN FFSX_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh h "YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j U$UUUUU UEPjj U$} uEEUUE UEPjJj y}tUEEÉ{sƉKI|;u[u P1ۇT tPXP@(#) LAST 1.7 (10/24/92)Usage: last [-r] [-u] [-count] [-f file] [name] [tty] ... - %s still logged in - %.5s %s: no reboot record added to wtmp file on system boot! down crashreboot~ftpftp%-8.8s %-8.8s %-16.16s %.16s %02ld:%02ld) ((%ld+s %u user%s %lu:%02lu,s %lu day%s, %d:%02d up%s: %s: %s r/etc/utmp%s: malloc failure wtmp begins %.16s %s: no reboot record in wtmp file to compute uptime from interrupted %.16s %s: read error on wtmp file %s: invalid wtmp file ruptime-f-u-r/usr/adm/wtmpSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error;#a(#r#w#~#+_#bU# : ??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0. -@-/X.b.d.i.o.p.u.x./ /#/+/-/0/2L0h0l00E}2Gh2X1b1cO2d2e}2f}2gh2i2n71o1p1r2s1u1x1(null)cannot print floating point LGMTGDTh t h t U U tl` SSSSB  ((((( AAAAAABBBBBB Unknown errortXD0 xhXH4  |lX<(0 0 0 0 0 0 0 0 0 0 |dH4$C  P LT1$T$Lsu;SSSSu\\ QRP:PUhh$6YYjYUE6dE] EE;UE UE)"EPEPhuN}x}xE8;~bU4VhhYYƅu dVjj0EP=uCju EP ujuEP uVYVY1 VY1^UxVWjRYEjYEjYE}=hoYh YhjPEP t} u2j$Y(U rEPYY}~U rEPYYEPYǀ}+u,EPEPEP3 UWUWW YEBEPEPEP UWUWW YE9E~hhYjzYEP?YPhTYYE=uh<h$YYj;Y}tj-Y}t}uhh$YYjYjjYYjjYYjjYYuuYYujYujYZ)‰U1 }UdF~&h~JZ4hYY uhYjcYUd}UdPYKUuIYP+YUV5Nx ^U=tuhYUVWuYƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP5I>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WWTYZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWWYZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVh 7YY_U U V#Y=Vh YYVhwYYƅ>-uF>+uFjVEP ƅUUj h5 1VhYYƅpj h5| >t>,tjVEP ƅt5U>t'>,u"FVY=xwVhYYƅu_^UhTYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JX4EU M R+Q¤ЙЙUuW +UЙOIkkE0XUM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FyuNN FFSX_^UVWEE11<<tN|1DFρECEE0-EMP1E E O3U :t! EE E &3U uuuYYEy@Ut8hu= YYE~" tuYuuYYE}y1]j=YEu uY1A!uEUMJUzUBU<E_^UUUuuu P UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UU Uh uu U UUEEUUUUuYEuu EP C [ C 7 > n''UVW'E_^]'L$ O'UVWMk'E_^]UVu E 0}u>0u F E 0FF^UVWu} '׹0F ׹d0F׹ 0F0FF_^U VWThVYYUR< EMxGFFUR<(EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYYT_^UVW\Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWpEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhXu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV! uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRyYY^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U}u UEudYuYU$U UEPu YYEPjj9 U$EPjj! U$UUU UEPjj U$EPjj yEU$UUU UUUEPjj yEU0VWEPuPYYy1U؁@t1huWYYDžy1EPWYYxSU؁@u7jWYYEx& PjW xh$YƅuUWVYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP\ GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5hjKj% ^UU$VWEP~YEPEPjv jDYƋ}t9uvE,EP;YEEPEPj WYUUjEPYYEPYWjYZ)‰jEPj jEPj t9r)օu jYVYU)_^U$uYEUUU UEPjj U$EPj j y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE. uVuuoƀ}Xu9utUP_YUE_^U4VWuEEEE }%MJxUʋFF VuhYY=u}t UډE1!,'"U<=EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ul]JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEME tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPHYY=}t UډmEJxEEFFEEVP YY=t6JxEEFFEEVP YY=u}t UډJxUʋFF Vul YY=u}t UډMuUUMRJxEEFFEEVP YY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWu }E$E)E EEE$k-t+u-U EMtJxFFSXV'Yǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXV=YEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G lE=cF}[t@}nt:JxFFSXVsYEEuՃ}}nJxFFSXV/YE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPh( EuEPh* EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXV YEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVXYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG띀?uEE3]uVuYYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t Vu`YYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E EEu }ntEGV}u}tE_^UVW}Wu u@ ƅ~9})׉U U 1_^UVWu }B~y UVu CV€tu ,fNV~ u>5Yt.h$YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvQ =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^? [USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MU}x}~uPYYUUas U EUhh$YYj膼YUh<h$YYjfYU$UUEPjj U$EPjj U$EPuYY1ۅÉU$UUU UEPj%ju U$} uEEUUE UEPjJj9 y}tUEEU$EUEPjHj Uu hT$ue UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j[ U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE8UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7u.`=}aa1ۇtPXP@(#) LEAVE 1.4 (01/09/90)You're going to be late!Time to leave!Just one more minute!You have to leave within 5 minutesUsage: leave [[+]hh[:]mm] %d:%dr/etc/utmpThat was the last time I'll tell you. Bye.  %s leave: Can not determine user and terminal name leave: can not fork Alarm set for %sThat time has already passed! When do you have to leave? SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ/nnn{{{a|rWwf+b??? ??? ?? ??:??:?? ???? . q.@./X/b/d/i/o/p/u/x/0 0#0+0-0003L}1hg1lr11E13G3X2b2c3d2e13f13g3i2n1o2p2ru3sA2u2x2(null)6X[6bv6dd6i[6om6p[6ud6x[6=<L&<h<l<<E]AG]AXQ=[?bQ=cc>dQ=e]Af]Ag]AiQ=n<oQ=pQ=s ?uQ=xQ=cannot print floating point cannot print floating point <x,hXdL< GMTGDTU U L@80,$ SSSS/etc/passwd/devB $L ((((( AAAAAABBBBBB   p[Et=1$T$L,su;SSSSutt QRPP RPR#Ujj5G 5GYv j #YU$7P&Y 5jYhTj&YYjj5|5xFj5FYYjjjPjGj5GYY5F~Y5GrYjj5G 5GY=Fx9FwF|9F}T%iF@X FiF@X F<u FFFFwU VW5GYjj5G" jh 5G 5GY׉UJIRQ5F 5FY5FYE}a} i@X U<tSi@X ֋JFFuW5Ff =j 5FYYi@X U֋BFFuW5F =tKj*5FOYY:}u45FYO#G EM5FYXW9=x}=9=~=x|9U~ U9U} |UuW5Fi 5F3Y5GY_^U VW1҉FFFFx9FF|9F[FJUFBUFJ׋FBiE@*i]@*FiE@*iF@*iF@*iE@*iE@* FiE@*UiF@X FiF@*F<t`FFRiF@X FiF@*F<uFF \E=UFFlF9FuF F=FujY_^U=tajj5G; FFF5F5F5F5F5Fh5G 5GnYFx9F%F|9FiF@X FiF@* F 9 tIiF@X <u45F5F5FR jh5FE wiF@X FiF@* F 9 tDiF@X <u/5F5F5F jh5F FF=t 5GlY5F`YU}lFU9F}W3E=E RRhhh.jYFM BRFk=tFx9F}YF|9F}9iF@X FiF@* FFF9U= Ghj j5 G$ q=Gdhj j5G$ M=Gthj j5Gm$ -=Gt$hj j5GM$ ExQUuh$hhg- j:YUPJPxUddhPu-)YYUhj juu 5LN" P# Uhj j5L# UVWuhGYY=t dEPhTj- u>UtE hYGUtE hYG h|YGhxYGLKhLht/ YYLhLhp YYLhLhl YYLhLhhYYLhLhdYYLhLh`YYLhLh\YYLhLhXYYLhLhTYYLhLhPiYYLhLhLSYY GhLhH=YYGhLhD'YYGhLh@YYLhLh<YYLhLh8YYhLh4YYLhLh0YYLt,>t'19tGF FԋlGpGtGxG|GGGGGGGGGGGGGGoGGGGGGG1_^Uh$Gj?*YYhHGj1*YYNG1GNGP1ۅÉGNGP1@u@GHG1ۅÉGUjYGJjRYY5GYhj j5LU 5GY5 GY5GYh$Gjji) 1UhLYEu1uSYjj5G5G=Gu1^jj5G5G Gu19jj5G5GGu1j5 GYYGUVu}xU9V | U 9VD9VH} UVU 1^UVW}jL-Yƅu djWYYF8uVYBjWYYFuuhT# h5GR YY=u h $YUUUuu u =u;uuh" hu YY=u h#YUUUuUYhu# YY=uuu h" UU U5G Yh5G YY=uuuhJ" UUUu u5G =u?5GYh5Gg YY=uuuh! UUUuu ut =u9u3Yhu YY=uuuhu! U G9Uu B$ uYxU(VWuGUVUVUEUU؋U9VN<< t'WuYY9=G~> tۋPYGGEhPY_^UVW MR<U R@U GR8]׋ R8]֋U9UW9uU9Ut:uu YYU9Uы9uU9Ut6YEӋE띋 MR< MR@_^UVG  Gz$t5 GY= z$t5 Y#195G~ R<VU#V UV8N  MEV8M  MMU9Uw:EU9t*UU}uV8M+ șEUEE뾃}IVV8UN UU9UwUEEV<V@N G빋VDF_^UVWu1~,u#VtV J9VuVJ9u =Gt=GuG8J8xLLSX h8YE=GtAVVNRQ5 G =tEP5 GYYEPVYYtVE_^UVu uY=t> tF=u 1^UVWuVu19~|V8<t 4rYGvtG9uF>uր?=uэG1_^UV U9 wU 9 v0 16VhYt1' rF5 &Y5 ^UVW}u1E}UUs0 1= u8j Y=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVt uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^Ui(mNA90(11UU(UVu~  u06EPYEU UEPEPV yE^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ0F_^UVW}u YfE=4hYEu EPU:/tHhYEt/u uBYYuhuWK Ehu" YYEu4E+UMuRQ} uuY41WY-E8\ttF>#tEPVu  u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV54t}uEF<:t ~u1tFjuV  uˀ~#uōFPY^UV54t}u7F<:t ~u1&tFjuV uθ^UVW54E 8t}u1F<:t ~u1tFjuVK uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F/ L.GF9GE UE 8E_^U VW EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EUd-U FE _^UVuu>t FPUY^U$UUU UUUE7EPjGjx U} v0M E 1U} v0M ҋE!1UE1UE1U} v0M Et1UVW11}U9u F߃| jugYtUr YtURtUzt rY}8t}Pt}ht u~Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvM =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uF FF VVv vvm >uNN FFSX_^UVW}Wu uD ƅ~9})׉U U 1_^UVWu }$0~y UVu CV€tu ,fNV~Pu>5TYt.h =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv/ =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E %U :t! EE E $U uuuWYYEy@Ut8huqYYE~" tu7YuuYYE}y1]j1YEu uY1A!uEUMJUzUBUE_^UUUuuu 0 UEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huUEEUUUUuYEuu EP #VUSE] ![]USE] ![]USE] ![]UVW}u M/T$ CL$ cUVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+0"}t}y UU_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjj U$EPjju U$UUU UUUEPj6jK U$EPubYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjjc UHVuUVUVUV UVUЋU UEPY^UVuEP YjEPjm V@ 8 5H h, jKj ^Uu hT$uM UV& T$@, T$@% T$@0E uVu ^U$UUUUU UEPjjG UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuuƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF VudYY=u}t UډE1!,'"UT%EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UEJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE4UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE5E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPDYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuhYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }EP $E)E EEE<S-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXV=YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G E=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=P r}P u8-t8+uEE-P EE}dt}iuuEPhP EuEPhP EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVkYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEEP }P s UE?]u GƀP ?Z?]QGƀP ?-uG?t2?]t-G9"G@E9EEƀP EG} 띀?uEEP 3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXV?YEE}t}tEP 3]u}t}t VuYYMEUEt }vE}uEuVu E=P r}P u8-t8+uEE-P EEEPhP zYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUh4hhrYYjFYUhThhRYYj&YUVuYƋU rU MJwU uR]YY^U$} uEEUUE UEPjJj] y}tUEEUVWE_^]} 0)ʇʋu }U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7u.`=}aa 1ۇtPXPdA>ADIUse arrow keys to move, space to place / erase, ^D to start- *Cycle %5d | %5d changes: %5d died + %5d born = %5u total changesdp%s: usage: %s [-d] [-p] D curses: %s vbblacaeasvsveviueusmdmbmemrcmsesoclcolicoliTERMr:   3Hr/etc/termcapTERM/etc/termcapTERMCAP+ 0+1+2+3+EP+bp+fx+nX+r`+th++\++@+I-%C-+U,2,d,i=,rI,OOPS5a5r5w55+5b5<<<<= y=@=>X>b>d>i>o>p>u>x>? ?#?+?-?0?BL@ho@lz@@E9BG$BXAbAc BdAe9Bf9Bg$BiAn@oApAr}BsIAuAxA(null)EXcEb~EdlEicEouEpcEulExcEEKL.Kh Kl'KKEePGePXYL[NbYLckMdYLeePfePgePiYLnKoYLpYLsNuYLxYLcannot print floating point cannot print floating point T O><v^#: #+'#+++++- - _++++|+,.-0ahI`fgjklmnopqrstuvwx~SSSSB8PhtM ((((( AAAAAABBBBBB   LF1$T$LLsu;SSSSu QRP\LPUuYPuj UVW}[L 10N1Džuމ_^U Uh Y}tuYh|Yu#YPlYhaYUhQYjYU VW}tU jrYYExU r_YjYbwmc1_U r'Yj[YhYU rYhdYj1Yh&hLu 4uVYEPhTjM x UujYjYMEEu*}| EL}| ELEL$uELE}}*19}UUMȊ 8P,GEhP,hT@j yjYj)Yj!Y_^UV5Nx dL^U=tu(YUVux95@4^;Sk.U$UUEPjjk U$UUEPjjK U$UUU UUUEPj6j U(VuU @t*ujYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuUYYDžt~~yVډ F_^USE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇDtPXP : loadfont: Usage: loadfont fontfile sQ[e&o: fontfile is not an 8x8, 8x14, 8x16, or compound font loadfont: unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0`LSSSSUnknown error|hXL(lXD0 t`L0$$$$$$$$$$l\H4C  pP LS1$T$Lsu;SSSSu QRPPUuYPujA UUh Y}tuYhYuYPYhYjwYUh~Yj_YUVW}tU jrYYEy U r[Yhh u| y U r6YjhXh h t*hLYU rYh4YjYuY E K}uUGEGfMUtG сfEEhhkFu yj[Yj Y_^UV5Nx ^U=tu(YUVux95`^KoUVWu} Mr6 u.uAfA(_^].U$UUEPjjk U$UUEPjjK U$UUU UUUEPj6j U(VuU @t*ujYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UW}0ʀuA)_]UVuYƋU rU MJwU uRYY^UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu } : loadkeys: Usage: loadkeys mapfile : not a keymap file loadkeys: KMAZunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0SSSSUnknown errorpdH4 |hXH8$xl\H,xlT8$pC  HH1$T$LxHsu;SSSSull QRPh PrUVWEHE}~$U hDr YYuEME }|}~E 0hh jYU RUj/uJ YYEu E UE}tudYu[Y}uU zh WYYƅuW`YjjV7 tWHYVYEU9UUUЙEjuV tWYVjPEP VjPEP uWYjEPP Y-ZY EP@P YY}t EPsYEPuc YYt-A=s -F^UuYjYUV5pNx p^U=tttu<YUVW11}U9u F߃| jugYtUr YtURtUzt r Y}|t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvf =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<t,R@tBt 4YGƒ~uFHFF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E \ U :t! EE E |U uuuYYEy@Ut8hu1YYE~" tuYuuoYYE}y1]j5YEu uY1A!uEUMJUzUBUE_^UUUuuu UVWu1fϋV€t}u ~tu>FtVYU )uRvO EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^UVW5HYNj5hYhY}t.U:t&uYPuV$ jhV WYPWV jhV _^UU Uhuu UW}0))ϊE tu1_]XG_].UVWIE_^]NL$ UV`U9`wU`9`v 16VYt1'`rF5`&Y5`^UVW}u1E}UUs 1=\u8jY=u1V!փ5\5`FE5dOVU}9}r69v2W9UvUW~>}t Edu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=d<9}r79}u+UOJ}t EdURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15dt 9ur6E0tU UdtU9ru NJEtU9Wu RWE_^UVux958,^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuh YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*u*YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U c }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP3 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U  EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U< JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE\E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }t~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhLhYYjZYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$ue UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j KI|;u[u P1ۇ@tPXP%s %s rUsage: %s [-f] prefix[/suffix] [dictionary] -f/usr/lib/dict/wordsGa4rw+kba : unknown error u@Xbdiopux # +-0LhklvE5G Xbcde5f5g inoprysEux(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point lSSSSB|Unknown errorD8 dT@4 l\L4$ lXD,pXD,C  !DJ1$T$Lsu;SSSSu QRPPU5 YPuhhUuYjYUVU:/u #ƅuMjuhh=t hYjuhhhYy huYjEPV y hWY}tjY^UVW1} hpDYhhsYYu hLYhY E E 0j"YjV9YYtVYˀ>/u VYVAY BƒvVh$h 눡 ƀ/ VPYYhrYYWY_^UV5Nx  ^U=tuHYUVux95x^UUUuuu c{b[UVWE_^]U$UUEPjj U$UUEPjj{ U2E Pu ULVWE1EEU UE8t+0`YE9uvEEEE͋UUE8t(0'YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0rYE܋]P3Wi }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;jb RQY_^U$EPjj5 UVW}E 0?tG9}s 9usON9uu N/E 01_^U VuU>t3FuF>t>/uEuYyUȋU1^UVW}t} w1?Uu NEPhYYy1EEPuoYYyV9Y1E]9uUM9u7YDžuVY1E]9u1EfEWYEu=+WYWYVY1_EE)UhRYYtUh RYYuP[UM9uMhvPFYYURyP1YYEPvP?YYy EUM9E]9uUREPu yWY"VY1dWYuYy VY1EuEPEPVeYy1>uN/9us VuOYYE_^U(VuU @t*uJYEU UV֋RUUUEPuYYU UEPjj ^U0VWEPuYYy1U؁@t1huKYYDžy1EPWbYYxSU؁@u7jWYYEx& PjW xh$ YƅuUW^YUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGPh GWBVVFWB)ډfFWBV4_^UjuYYU$uYEUUU UEPjj U$UUUUEPj jm y} tUE EUVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U '}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4buVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U|qEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }.~y UVu CV€tu ,fNV~u>5xYt.h0YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvP =tN V@FF t V 9ډUVVFt$jjva =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhdh YYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuu TfFV V#U UU +UVjvP =uU 9Vs VYu1^UVulYƋU rU MJwU uR!YY^UVWuU VVuYYDžt~~yVډF_^U$EPunYYEPj j U}u UEupYuYU(VuEEV֋RUV֋RU E UUU UEPj7j ^U$UUU UEPjj U$EPurYY1ۅÉU$UUU UUUEPjj yEU$UUUUU UEPjjW Uu hT$u U$UUUUU UEPjj UVWuEu41}%<,t4,YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv2 =u N /uvv EU9Uu1 N _^UV1}*<,t,Bt 4,aYF^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu f E_^]t|UVWtu} u ~tIu(_^]U$UUU UUUEPj6js {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P;1ۇtPXPlp: %s: %s waitcan't forklp: full pathname of %s is too long Can't determine current directorystdinunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0O ../......E  @ B X+ b d" i" o p+ u" x+  #+-0 LhlEGXbc{d=efgi=ncoprsux(null)cannot print floating point /usr/sbin/lpd/usr/bin/lpdSSSSBUnknown error|`L8(p`P<(t`D0||||||||||lP<,CD   P3 P1$T$L su;SSSSu@@ QRP P& U5F YPuhhbUuYjYUUhhYhtYuYUVW}hhbYhtWYE?/ujWNYYEx u Y}9}hhtAYYƅu ht`YJxSX hYE=t,JxUʋFF VuQYY=u tWYV uVY=u htYhYjhhh] Ey hhY3Eu YPuuc xTjEPuN x?WYPWu1 x"uYxhhhYYy hhY_^U0VW=t h(YEu hLYuYEjh$PO uӋUEPRlYYxUtjYDžu hUYUWURGPYY>tO9J}6>]uY1=_^UVW =1E5W5  EyA= t hDY9uuhDh,h V}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95| $p ^U$UUEPjjg y UX 1UVW5X X }׃}~9r }y 9vWYu_^UVWuU VVuMYYDžt~~yVډF_^UVW}u qYfE=h`YEu EPPU:/tHhHYEt/u u YYuhuW E8h4u: YYEuE+UMuRQ uu6Y1W Y-E8\t] tF>#tEPVu x u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1] tFjuV uˀ~#uōFP Y^UV5t}u7F<:t ~u1&] tFjuV uθ^UVW5E 8t}u1F<:t ~u1] tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!Fh" !GF9GE UE 8E_^U VW EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EU U FE _^UVuu>t FPUY^UVW11}U9 u  F߃| jugYtUr YtURtUzt rY}t}t}t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h+YF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF FF VVv vv1 >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5 Yt.hYFu NLNHF 9hrYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv4 =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E  U :t! EE E 8U uuuYYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu unY1A!uEUMJUzUBU E_^UUUuuu _#Ww_tS USE] ![]USE] ![]USE] ![]UVW}u MUVWE_^]T$ L$ UVuj jVc ^UVW@Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0] tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj U$EPuYYEPj j U$U UEPuYYEPjjU U$UUEPjj7 U}u UEuYuYU$U UEPuLYYEPjj UVu x~ 5ju1YYy9uuV1YVju ^    U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjj U$EPjj U$EPurYY1ۅÉU$UUU UUUEPjj yEU VWEu>tFN>Xu E0EEF>t&azjuYYyEG߸_^U(VuU @t*uYEU UV֋RUUUEPu4YYU UEPjj ^U0VWEPuYYy1U؁@t1huKYYDžy1EPW6YYxSU؁@u7jWYYEx& PjW xh$YƅuUWYUЉ1FfFF_^U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGPP GWBVVFWB)ډfFWBV4_^U$EPj>j} UU$VWEPR YEPEPjJ j YƋ}t9uvE#EP YEEPEPj W YUUjEP YYEP YWj YZ)‰jEPj jEPj t9r)օu j YVi YU)_^U$uFYEUUU UEPjj\ Uu hT$uu U$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U k }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U8 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Uh JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPLYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuAYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^XUVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uP4YYUUas U EUh h*YYjYUVuLYƋU rU MJwU uRYY^U$U UEPuYYEPj!j- U$UUEPjj U$UUU UEPjj U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUE02EPjGjP U$} uEEUUE UEPjJj y}tUEEU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EUEPjHj! Ã:UHVuUVUVUV UVUЋU UEPY^UVuEPCYjEPjq V  5 h jKj ^+C;Cw Ë[ uӅu P-KI|;u[u P_1ۇ tPXPlpd: %s: %s wmalloc()job.lpd: %s: Printer out of paper #can't remove itlpd: something is wrong with %s lpd: can't read %s rrlicolp*/dev/null/dev/nullcan't fork/dev/ttyUsage: %s [path | stdin < path] unknown errorr/etc/termcapTERM/etc/termcapTERMCAP 0|1|2|3|ELblftnTr\td\<E%?+Q2di9rEOOPSarw+bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0! ! !    /M& %@&&J'X3'b'd*'i*'o!'p3'u*'x3'#( (#(+(- (0(+L(h(l()E*G*X*b*c*dE*e*f*g*iE*nk)o*p*r*s)u*x*(null)cannot print floating point /dev/lp/usr/spool/lpd/dev/logjobXXXXXXtmpXXXXXXPBSSSSB ((((( AAAAAABBBBBB Unknown errorxhPD(xh\H8(hXL<( ` ` ` ` ` ` ` ` ` ` lXL4xdPC  H8 41$T$L| 8 su;SSSSu QRP P#U VWjj&YY=th4j&YYa h\u u * =dS0@UU:t :=tEU:tEu50@YYj50@.YY눻4[G? (@ h }8Y,@??:t%jY5YW }<@tVYF=@t"5@`/Y,@B05,@7Yj3"Y_^UVW=vI?֋Jx ?֋у4?1Y=_t a ?WYRaY=?a:=(@(@:x!S(@X@Z뾋5(@P1YY럋:PY߁=?}5???=?}r??=?}????=?}r??=?}0??=?}5??=vI?֋Jx ?֋у4?.YPY(Wj)Yj(YBu:=?x heYJ B4?;,Y9$Dž=vI?֋Jx ?֋у4?.Y9u+9uu hyY~R=?y=(@(@:x(@X@!5(@.YY Y=?9(@(@:x(@X@5(@W~.YY=vI?֋Jx ?֋у4?,Y9t:(@(@:x(@X@c5(@W-YYP(@(@:x(@X@5(@W-YY?<~WYha =vI?֋Jx ?֋у4?+YZu@Y?֋B?֋J~ WYjY=?u hY?J<u$?+? ?RPYY1?J ?+ ??4QP ??????<jYha =vI?֋Jx ?֋у4?)YZuY=?A5??#W(Ydm>_^UVWuEuU9uha =vQ?UJEx$?UуE4?(YEZu}_uUFEVEP{Y9uu h`YE< t7u/YYt _^UVW1"sU4w YEjYƋU V U4 V VG_^U VWu} zV:nOhs~F Pv<YYTK~F PvYY,WV9YYvYP YWVYYv Ytv  Yv Y~ v.Y1P* Y~vFY@P Yh_v'YHP YI@vY8 -58 YvYvhh + h YvYvYvhh n+ h Y~vYpWV5YYbWV~YYTKWVYY=4JU}~7P? YU4a YP# Yj, YMP Yv / YP Y~vYEtuY(@ WVbYY}5 YlcE9}SUj4l YYE4E9}$Uj4= YYEv*YPJ Y~L~vv vP5v vPP Yv Y~v vT YYP YcZE9}}U4hh ) Ehh (YY=v]?Jx*?у4?"YE= }f~ v Y`~ v#Y1PIYE~@E9}}4U4YEht0 Y#U@7_^UVWE8>tFN9~$PYU RTYy-0EU J9b@U4YPU JU}~UM4Yj,YMދUrYPlY x6NNM9u PHY_^UVW}?u hp! Yu W^(YYu hT YWYƅu WY9Vt vxYU :u V u : YFF_^UVu2Yƅt09Vt%PYvYPyY^UVW} U:u hPYWu'YYu h6YuYƀ?u V WYFF_^UVW}} ~>9u v4jYEt]p35 h w%F1}< U}t)UEr05 h <%UR UF_^UVWu} v v&YYu vYu vsY ~ _^UB u h Yhu@#YYB?t 1UVWhu #YYDžgJxGGSXWY=t4(@(@:x(@X@5(@V$ YYWRY1_^UVWu} ~5V:t ~V :t&   `'_^UVWu} ~0V:t ~V :t!  # _^UVux |1<@u7F0,@Bh5,@!YY@u hRY5@(@^UVW} ~59} ~IU4 Yƅ~ }<@tVYGо }<@tVYF_^UVW} } EUrn YEURUMRq U YZ9uwCuu#YZ9v0VV#Y9Ev V#YEZ‰O9r P_YO_^UVW}U :?t!U:tE1G ڋU :HE ME ME]9tMME MUMtE묀>t FU_^UVWu1>tF_^UVh uYZ4t6u"YYtv ^UVWuYj YDžt W < uY hY_^UVWuHYE4 1Tu6 "YYu=v uU4 2YU4 W Uw uY} uv _^UVuV€u6 Y9Vt v YV Y^UVW}?t/}u >tU9uFE>u +UG̸_^U9sM hYUVWu=>tFN9uw9=vNG=9=u h,Y_^UVW}yډƹ 0R\Y ƅ܅yj-@Y_^U9sM hPYUVWU (@9 @u hYU4@YU@0U,@Bh5,@YYƅuhYYJxFFSXVY=t4(@(@:x(@X@5(@WYYVY5,@Y=u hlY_^U0uhh  jYU5\ YUV1 }5<@t(4@YF0,@B5,@'YF^UVWuYVYDžt VuW@ _^Uhh YYjYUVWU< 5jh@ } t1#"EYuE hwY1_^UVWM+=?t < 1E =:t h-YDžtE_^UVWVE=|u-< < ;|u/Džut1ă}|u < < _^UVWVnE=&u-< < ;&u/Džt t1ă}&u < < _^UVWI =|u"< < 8|t < E Ѓ|u < < _^UVW%=^u 1 < _^UVWI=&u"< < 8&t < E!Ѓ&u < < _^U VWC*E=t,-19u@19t@һ$E)_^U VWYaE=tBC,19@19}@19~@19|@뼻8EX)_^UVWfz=<t>u5< < 9u#:Eu < < _^UVW<E=+t}-u ǃ}+uډ) < _^UVWZE=*t }/t}%u18։Ӊ !"#$%&'(ʉTEg( < _^UVWa=!t ~t-u.1'҉ډt( < _^UV=(u"=)t hY < ^UVW='t < 1< < U='u < d}\uP. < E>E 8E 2E ,E&E < < U'EDFkt< < 8't h)Y1Nx |_^UVWE=0uC< < ƃxtXuE< < EEE 10 s0As7 as+Wx$9u~U׉< < E < }t h,>Y1_^UVWǡ< < Y=t < 1V=uJ< < < +< < < <s%_^UVWuǡ< < Q=uQ < D=u8 < +< < < T$_^U< < U= EEUuhlYYjh@ YYUVuj jV ^UV5d Nx 4@^U=h th uYUVX U9X wUX 9X v 16VYt1'X rF5X &Y5X ^UVW}u1E}UUs 1=T u8j`Y=u1V!փ5T 5X FE5\ OVU}9}r69v2W9UvUW~>}t E\ u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=\ <9}r79}u+UOJ}t E\ URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\ uY_^U VWUUb15\ t 9ur6E0tU U\ tU9ru NJEtU9Wu RWE_^UVu~  u 6EPYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0a tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U VW}Eyt 1}uE VzYFu=t 2hl h|p jYEPlYE9Et}u}uEu}u EEE_^U$UUEPjj y U( 1UVW5( ( }׃}~9r }y 9vWYu_^UVW= aU9 }  M :-u zu  M h4[YYu  M  ǣ@:tWuYYƅ}= t=E h 0 YYh h YYh Wm YYh j _ YY M   :u  ? F>: M  C;t!A M  C0@ U9 |W= t=E h 0 YYh h YYh W YYh j YY ?` A M 0@ 7 M   :u  0@_^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u s KVTYE=u &UEUUU}׋U UE8t=+UEEE0 YE܋]P3W }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W- }׃E뻋EEU9vGui YEuUUȋUUEEEPj;j RY_^U$EPjjy U$UUU UUUE9EPjGjH U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$EPjjy y}tUEEUUM J} t U R Y]uEPu 1UEUUzt R Yuh` 6U RuZBRY` UVW11}U9 u  F߃| jugYtUrYtURtUzt r*Y} t} t} t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvN =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 }YGƒ~uFl FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }h 3~y UVu CV€tu ,fNV~ u>5 Yt.h0YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv. =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E U :t! EE E bU uuuYYEy@Ut8huYYE~" tuYuuwYYE}y1]j%YEu uY1A!uEUMJUzUBU E_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UU Uh uu 6USE] ![]USE] ![]USE] ![]UVW}u MO UW}0))ϊE tu1_]XG_]B b U 1 Uujj Ujuj U$UUEPjj U$U UEPuD YYEPjj U$EPu.YY1ۅÉU$UUU UUUEPjj yEU VW3 Eu>tFN>Xu E0EEF>t&azju YYyEG߸_^U(VuU @t*u~YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$} uEEUUE UEPjJjA y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V  5 h jKj ^Uu hT$u] U$EPu YYEPj j[ U$UUUUU UEPjj/ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4uVuukƀ}Xu9utUPWYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U|EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U!JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UUas U EUhdh YYjYUVu(YƋU rU MJwU uRuYY^U$U UEPuYYEPj!jA U$EPjj) U$UUU UUUEPj6j UVWE_^]} 0)ʇʋu }{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉1ۇ0 tPXPunixsysvalsyscmdm4exitm4wraperrprintmaketempdivnumundivertundefinetranslitshiftdumpdefpushdefpopdefspastepasteindexchangecomchangequotednldecrincrlenifdefifelsesubstrevalexprdivertdefndefinesincludeinclude?DUotD:U:o: (: m4: internal stack overflowm4: missing right quotem4: unexpected end of inputm4: token too longx F   . m m  -iwu l m4: major botch in eval. %s cannot open for read.m4: %s: cannot open for read.m4: %s: `%s' `%s' #1lCCCCCCCCCCm4: recursive definition.m4: null definition.m4: recursive definition.m4: null definitionrm4: too many include files.rm4: cannot divert.wm4: no more memory.m4: too many characters pushed backm4: too many characters pushed backm4: string space overflowm4: cannot unlink.m4: cannot undivert.rm4: undivert: diversion still active.%s interrupted.Usage: m4 [-Dname[=val]] [-Uname] Ill-formed expressionBad query;S^%*/P !+ -< ~4 Bad factorL! 0 1 2 3 4 5 6 7 b !f&!n!r!t!Illegal character constantBad constant"!"="A#<#A#(#mp: %s -csh/bin/shcd .: option requires an argument -- : illegal option -- --7a7r7w77+7b7:::/q> >@J>n?XW?b?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ((((( AAAAAABBBBBB xtSSSSB @  W Z1$T$Lsu;SSSSuH H QRP P2UE 0Y8lu L hp ;Yj;Y|hpu uD' E=h l P T X I;Pp;Y\ jO5h< L s` hjQYVETU9}4U M+ RQYYy j YjY=\ tPh\h9 =h t!hdYt jYjY=P t ^ =d t 1UVW1E}d~h$hL5YYd9P1*Y@uh hLb5YY0@0EP:YYj9Yu}~jjj9 =u EEjj"YYEjj"YYEjj"YYE19}v}~ u8YU 4)Y@uU 4hhL4 F-@0hh7 @0hHP7 1҉ Vj>A*YYVh .YYE u 1EE U9Us.JxUPFFZUVP)YYEʋJx FF VW)YYEE > u 1EJxFFVWy)YYEL} tJx FF Vj D)YY}uJx FF Vj !)YYV t1_^UVW1҉jh!1YYxhhT+YY u:=\ t =hhL,YYh4/YjQ Y15 hP& jhP2 fju YƅuhhL(,YYjY=u5r5FF~ P1YF_^UV=X tƅu h.Y%t!h4VYY=X tF^UVWDžDž=uhq.Y=X t=X t Bu =T u)5jhh" h"jYYu.t%ztBh4YYt-4J4xHH h4j U&YYDžh4h*YYh4"YhhP3$ n=T PjjYY@DžB9t Džd pDža=X t Bu DžhPYYzYYh|jOYYʍPYjYhhhL(YYJG_^Ujhh YYUV,Eyh +Y}tEP!-Y,P,Y,P,Yhu &YYƅuu *YjYVu>YYVY1ۅú #VtthhL'YYu h*YjY^U`VWE|PhEP+ hhp &YYƅuhd*Y=tt VWYYV uVh`hp ' ƅuh<)Yhp +YMjjYYjjYYjjYY=\ t=EPhY+YYt)E}|hhL&YYjU+Y5 h hA' u>h#)Yhp hhLj& =\ EP+Yhp +YJxFFSXV YE=t7  :xU X@5 u!YY5 Y=\ t EP*Y_^U VWu UR jR5 ' UztRB E9}\  :x X@ 5 YE=t#JxUFF Vu'!YYG_^UVhYƅuX)Eyh'Yi}t EP)YW2)PY)Y+)PR)Y5|f)YjuhVV(hhL$YYjBY^UhhLc$YYhhLR$YYUj/uz)YYEuEUBU(PYEt](UTh\h`q"YYEuh0hDh4# 'ujPEP th4EP#YYU EPu<(YY=uE}t1UuYP/*YUV5 Nx ^U= t uP'YUVWH Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW uB*Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jhY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV$ uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP;>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW!YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWWL!YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhl YY_  U U, V Y=VhlT YYVhwYYƅ>-uF>+uFjVEP ƅUU j h5 . 1 VhYYƅpj h5  >t>,tjVEP ƅt5U >t'>,u"FVY=xwVhYYƅu_^Uh$YPLY  UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J|4EU M R+Q¤ЙЙUuW +UЙOIkkE0|UM 9023456789:;<=>?@ABCD_^UVWuEE= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy:M C;t!A M CU9|W=t=E hL0YYhLh`YYhLWHYYhLj :YY?`A M 7M :u_^U=x 5YU=x=`u `j5`YYy'j5YY Pj5} 1U^U`Ud=u/hhd5 1V|d=du1< ||= udUUU:u1: t ::uҋUEUV=yy1u1dtxttjƅtjjV fhLƅtjjV j/xt!lypg:Xd^UV%ƅt F9Eu^UV{ƅtu6YYu[^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU E (UUU UEPj7jB ^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE<EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UUM J} t U RY]uEPu '1UEUUzt RYuh&U RuZBRY'UVW11}U9du dF߃| jugYtUr*YtURtUzt rY}t}4t}Lt uY_^UVWuEu41}%uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } 1~y UVu CV€tu ,fNV~4u>58Yt.hYFu NLNHF 9hnYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvD =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11FtVYU )uRvc EVt tfVV}u1_^UVW5YNj5Ph4YhLY}t.U:t&uYPuV jh@V WYPWV~ jh<Vn _^UU Uh4uur Ujju E`UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu;o  G w #Okr USE] ![]USE] ![]USE] ![]UVW}u MsUW}0))ϊE tu1_]XG_]VUVWqE_^]vL$ UVWM3E_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhDVYYUR<0EMxGFFURt 9tF>tG1_^UVW}?tu >t 9tF>tGމ+U_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVuYƋU rU MJwU uReYY^U$UUEPjj U$U UEPuYYEPj!j U$u&YEU UUUUUEPjjN U$U UEPu$YYEPjj! UH 2E Pu ULVWE1EEU UE8t+0|YE9uvEEEE͋UUE8t(0CYE9uvEEEЃ E V!փ}u sKV,YE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE06YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U$EPjj U$EPj/j U$EPjj U$EPuJYY1ۅÉU$u"YEu YEUUU UEPj j? U$UUU UUUEPjj yEU VW Eu>tFN>Xu E0EEF>t&azjuYYyEG߸_^U$EEEPj.jr U$UUEPjjS U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V5hjKjq ^UU$VWEP YEPEPj j YƋ}t9uvE\IEPw YEEPEPjP W? YUUjEP= YYEPR YWj YZ)‰jEPj jEPj t9r)օu j YV YU)_^U$uYEUUU UEPjjL Uu hT$u! U$EPj j y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE. uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U=EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U]JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE8ME tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPrYY=t6JxEEFFEEVPkc#ZsXsXfR[[׉1ۇtPXP$d $$$$$$$$$$$/usr/spool/mail/%sepqrf:tdv mail: error delivering to user %s %s Dist: From %s %24.24s ------------- | Mail from %s to %s ------------- mail: mailbox for user %s is illegal mail: serious maildrop problems for %s aamail: couldn't lock maildrop for user %s mail: couln't create a maildrop for user %s w/dev/console/usr/spool/mail/%s.lock/usr/spool/mail/%smail: user %s not known mail: unknown sender mail: too many recipients  .Krmail: couldn't copy letter to temporary file mail: can't create temporary file w  .P@ Out of memory. From can't access mailbox rNo mail.  !*-7d p(qsxIllegal command ? No mail. savefile write error:amail: couldn't forkmail may have been lost; look in %s mail: couldn't reopen maildropwmail: couldn't lock maildrop for update mail: temporary file write errorrmail: can't create temporary filew/usr/spool/mail/%s.lockcan't exec shell -cmail: couldn't fork/bin/shSHELL mail [-epqr] [-f file] [-t arg] usage: mail [-v] user [...] nobody/usr/lib/mail.helpcan't open helpfile %s r/usr/lib/mail.helpSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZH'a:'r2'w@''+l'bb': option requires an argument -- : illegal option -- --i-B-i-B-i-B-O-O-O-6a6rs6w66+6b68a8r8w89+8b8 : ??? ??? ?? ??:??:?? ???? +A+A+Aunknown error/=L K@L:MX#MbMdMiMoMp#MuMx#MN N# N+M-M0NQLNhNlN OEPGPXObOcsPd5PePfPgPi5Pn[OoOpOrPsOuOxO(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point /tmp/mailXXXXXXFrom GMTGDT U U t SSSS/etc/passwdB4L ((((( AAAAAABBBBBB Unknown error  p d @ 0   p \ H 8 (  x d H 4   t ` L 4  C  pl1$T$Lsu;SSSSu<< QRP*?P0UVW=*twwh0O ?Jx hj JYYE|9UU *2jFtvh(cOYYvh ROYY95*u h>OYVU}Jx:hj:ZJYYURU}tURrh NYYEUۋJx hj IYYURU}tUrhNYYEUދJx hj IYYEU Jx hj mIYY6Ei_^UVWUBtUjrh<J UJUJUrt~t wY?6UJUJ_^UVW19=||*2t VsY6G_^UVWhXKYE@t*Urt ~tWU  ?6_^UxR.Y*ujjh\ j.Y*ujjh7 *h.Y*ujjhx ***hl.Y*ujjhd ***UVukFFP2+/YY:ujjhz ^UVWj.uMYYEE=*|9UruLYYtEڋ|9Ux9U|3xR5*.YY*ujjh, |U *j>-Yujjh uLYP -YEujjhk uu3LYYMJ=*2Ut$vuKYYu6EU؃=@u!j,Yƅu#jjh 5@@E0uKYPL,YEujjh uuuKYYUVFF FU_^UVuYƃ~uF t7V(YF t&=tv-Y5@1^UVWj+YDžujjhD UW} uu >t6>E _^UVWj uJYYƅtUtEU:uE j+YEujjhtf EuHJYP*Yƅujjh\1 uVIYYUr} uE} ?t?UE _^U VW}EW:.u:} u4}u.wtUVe,YuGWWwEt~tEu6}t7}t1Gu+W:.u} uWMJwhYYGt*W11ۃ}9twhYYj )Yƅujjh U VUV}tE0wWW}t WW_^U(VWuh*YYj*: ujhH>YY*UUtEj=uGYYEt'9Et"x\uuNUUEEFt}EEUtEj u4HYYEt*UEPcYƅujh8YYuVYYuh*YY o*UUtEjh0u~G OUB;*U*U܋UUR.GYPu5*F h*Y*UUtEuFYPm'YEujjh uuFYYUUEP2Y*tPh5*CYYE؅u55*hv *uYu~<Yu(YU*U܉*uh*PYY*U1j;uEYYƅtFt WV0YYh*ZY*UUtEj:uDEYYEt'9Et"x\uuNUUEEFt}ujh2YYEEU::u EEEEEPYEtuYEuuYYEы*UjR5*EYZYJuh*YYu.*: u#W5*YYuh*YYtҍEP@YEtJ>$tFGE@EF>{uF>O>}FU E>(uF>t/>)t*U E>u$GE@U EU>tFhYEuhhTYYEUB tUjrh UJ UJ UB t+UruYYEMy׋UJ UJ UMI9JuYEMy_^UVW}2q@YP YƅujjhZ 2V#@YYGVW=YYV"Y_^U VWEUIM E E +UUU U׋UIMFj=7Q?YYƅt%FP7YYEP MQ M EE멋UUU U׋UIM:-wM7F>t7F>uMUIMu 75*P-Y +-a=s + 5 +)0Y=ft]EZhYƅt>tFPY5uFhd0Y=*t%h5*>>YYu=**hR:YY=u u5hh  o*hR^:YYuN5hhht 4hd5*):YYu55*hP 5+hHYYEP MQ h@hDxYYUE8_j=0<YYƅt4E^S0?YYE==lt&UJ UJ Ej0h( E5Y52Y*=\tPh 4YE@tXhYE@tP=*ujjh` W}uj5*YYE+UIMtE E j0YPYY EՀ=ht uYjY_^UVE +-a=s + 5 +,YEpLrPfT]XT\K`Bd9h0l'pt8E{U5u]9tFM^U5+hh 8 hhh 8 hh 8YYhXh 8YYhh 8YYhh 8YYhh ~8YYh\h m8YYh<h \8YYhh K8YYhh :8YYhh )8YYhh 8YYh`h 8YYhHh 7YYjYU5+h(h 7 u+*YPu uh 7h j 7YYjYUu*YU1҉UUEPu8YYUVuhP+8YYu`Pu hdu'7uPhPu7 .ƀt40ʃPQhDu6^UVWhYE8uEU RU}nUr5*o8YY+h*Y5* XM PM>@t>-uN>@uEE=Lu3JxSZhP2YYF먉?u? u+t% }t =LuUhh6YYB}t =Lu3JxSZhP1YYG낀}t =Lu-Jx hj I1YY=Lu =+h.YuVYYE}ujuh }t&u5+hm hu5Yu5+h G hh 4YYUBu.UrYuUr5+hph h4=Tu1}P~YUJ@UJ EU_^UVUrtVuBYY6^U VWuvYtEPvfYYEPv4YYDžy2=t5vh F V߈VUV V V_^U=Lt =XuUrh 4YY=LtuuuWVEE=t VʀV?VV=htV UUV U19U}@0U9V |F u?Fu9uuujVUV =tVʀV FtUV =p}tKF@thVu  uFthtVu  YhdVu  FF@thHju  ,Fth4ju  h$juLNOPQRSTUVWXYZ[\]^_`abcdefg  } uFuv5+h D0 }t u=Y1_^UVW}=dtuYUB@h 5*01YY}u(*U=ttEPEPu uuh ,YY}u *UuhYYtB5*0Yth5*M0YYVr5*:0YY>VZY5*hYYUrhYY} tu uYY u5Y_^UVWE=*Urj.V0YYE>t9uw}uFG5*0YPY]ujjh E5*0/YY5*/YE} tU U URU}rURU}OUREur0/ uURRE2}uURREEEU맃} u EU_^UVWu t"F PYGhGPU-YYhh8 B-YYhh4 1-YYUIMthh0 -YYt9hv,YYFthh( ,YYhh ,YYhu,YYJx hj L(YYh %Y_^U5+hd h , u uh  , =*t5*5*hP h +h j +YYj YUVWuFV9V|V YE JE xE X@ u &YE=u E^P2FZY } u*~|"N 9\uN  NmV9V|VxYVU׋UtE? u U:#Rj#Wo,YYEt.9}t)x\u#UU}EEMEt}t U UB:tG?1_^UVWut:u1">:tu_^U4VWEE5*Uzj.WA,YYE?t9}w}uGF5*+YP] Y] ujjh E 5*0+YY}uE +*Uhx YE@u1URU}URU܃}U܋RRUu2+YPu(+YZ9*w h*eYЋ5*}ЊGFЄuN}GFЄu5*nYE@E 0*YPu*YZ9*w h*Y΋E 85*GFЄuN}ЊGFЄu5*YE}uEURRUԋURU}_URU؃}tFU؋R5*r)YYuUUURRUEEE؋U봋EU뗀}E܋UjEUJ}UBhl "YE@u1Uzu1URRUԋURU}t)URU؅tRUEHEUjuju(EE 612juYYEjuuuURE_^U VWh` hd YYhT hX YYjh< YYh4 YjVjWjh YYh YjVjWUjh |YYh YjVjW*h h 2YYjh @YYVh 1YYh sYjVjWjh YYVh YYVhp YYhh *YVh\ YYjVjWhL hT YYjh0 YYVh YYh YjVjW<jh cYYVh TYYVh EYYh YVh )YYjVjWh ]YjWYYEh CYuWYYEh (YuW}YYEh YuWbYYEh YuWGYYEh YjjuWA_^UVu>t >(t>)tF5(F<(t1->t >(t>)tF5(F<)t1 1^UVWEu=>tFi]Ӊ]OuE1_^U VWEhuYZ<7t 5FPua% E~ڃ}\}tRjYƅujjhh 5uFP% E V7}tVE 1_^U VW(s!>t}?uKY_^UVW}1} t? t-0k GM _^UHVWjWu# =u1jjh EP# t\učU9s > uFj EP!YYEjEPEP j EPYY<ǍW!._^U@VjVu-" =u1jEPu " =jEPEPR" UM U M щMUM U M щMU؉UjEPEP VU!2^UVWu uKYuI(((UVu/!YYN9u(9fVfff(V(ju YYEyNjh EP! u uOY@},u}u u#Y'jEPub ;Uu$ YU1u!jFPu Nj(9V~V((()_^UuYP"YUV5Nx +^U=tuYUVW<Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW u*"Yƹ<+F؉F+ډV YV YDžt"<1FF1V Y_^UV(U9(wU(9(v 16VYt1'(rF5(&Y5(^UVW}u1E}UUs 1=(u8jY=u1V!փ5(5(FE5(OVU}9}r69v2W9UvUW~>}t E(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=(<9}r79}u+UOJ}t E(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15(t 9ur6E0tU U(tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP15>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WWYZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW4YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVh`)YY_U U  VsY=Vh`)<YYVh(wYYƅ>-uF>+uFjVEP ƅUUj h(5 1(Vh(YYƅpj h(5 (>t>,tjVEP ƅt5U>t'>,u"FViY=xwVh(YYƅu_^Uh YPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J\4EU M R+Q¤ЙЙUuW +UЙOIkkE0\UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy@UUU:tEG9tU:u?=tȋU=U1U=<2=kEt Eu E@k PYƅu U<:2u<2E u4@k <P2rYYƅu.<2J]1_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj ULVWE1EEU UE8t+0 YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0 YE܋]P3WE }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGui YEuUUȋUUEEEPj;j RY_^U$EPjjy U$EPjja y}tUEEUVW11}U98u 8F߃| jugYtUr.YtURtUzt rY}t}t} t uY_^UVWuEu41}%<8t48YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<8t8Bt 48aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<8t,8R@t8Bt 48}YGƒ~uFP*FF VVv vv% >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }I~y UVu CV€tu ,fNV~u>5 x Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvl =tN V@FF t V 9ډUVVFt$jjva =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<8tN|1DFρECEE0-EMP1E E  oU :t! EE E  FU uuu YYEy@Ut8huiYYE~" tu?Yuu YYE}y1]jYEu u Y1A!uEUMJUzUBU8E_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^UU Uhuu 7g  ? USE] ![]USE] ![]USE] ![]UVW}u M[3~UW}0))ϊE tu1_]XG_]^UVWyE_^]~L$ UVWM;E_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWd*h VYYUR<EMxGFFUR<,EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYYd*_^UVW*EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh\u%dEuEu1k0Z‹N9t3FuF>t>/uEu~YyUȋU1^UVW}t} w1?Uu NEPhYYy1EEPuYYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEW~YEu=+W^YWYVY1_ElEUhRYYtUhRYYuP[UM9uMhvPYYURyPYYEPvPYYy EUM9E]9uUREPu yWY"VY1dW|YuKYy VY1EuEPEPjVeYy1>uN/9us VuYYE_^U$EPuYY1ۅÉU$UUU UUUEPjj3 yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U0VWEPuYYy1U؁@t1huKYYDžy1EPWYYxSU؁@u7jWYYEx& PjW xh$#YƅuUW.YUЉ1FfFF_^U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^Uju7 YYUU$VWEP YEPEPj j` YƋ}t9uvE[EPW YEEPEPj0 W YUUjEP YYEP2 YWj YZ)‰jEPj jEPj t9r)օu j YV YU)_^U$u&YEUUU UEPjjt Uu hT$u U$EPj jA y}tUEEU$} uEuYE"E UU RUuqYEUUEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U8 JxUʋFF VufYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEXE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPJYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPfYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^SlUVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~u PHYYUUas U EUhh YYjYUVuu TfFV V#U UU +UVjvP =uU 9Vs V]Yu1^UVuhYƋU rU MJwU uRYY^U$UUEPjj U$EPuYYEPj jg U}u UEulYumYU(VuEEV֋RUV֋RU E UUU UEPj7j ^U$UUU UEPjj U$EPjj U$UUU UUUEPj6jc U$UUU UEPj%j= U$UUU UUUEDkEPjGj U$} uEEUUE UEPjJj y}tUEEU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EUEPjHj Ã:UHVuUVUVUV UVUЋU UEPY^UVuEPCYjEPjq V**5*h*jKjM ^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP- %s %s(MAIN NAME) %s: %s:: %s = %s Circular dependency from %s.PRECIOUSNo memory for str2No memory for str1No memory for nameNo memory for suffarrayNo memory for string reallocationNo memory for nameNo memory for nameNo memory for nameNo memory for nameNo memory for suffarrayNo memory for dependantNo memory for commandNo memory for commandNo memory for lineInconsistent rules for target %sCommands defined twice for target %sNo targets providedCan't open %s: %srNo memory for includeincludeNo macro nameRules not allowed hereNo memory for macroNo memory for macroNo memory for macroNo memory for tmp./Infinitely recursive macro %sNo memory for temporary stringNo targets defined.IGNORE.SILENTinvalid environment: %s$$MAKECan't open %s: %srMakefileCan't open %s: %srMakefilemakefileCan't open %s: %sMakefilermakefile-MAKEFLAGSmake`aW``NE```````!<*3Environment: MAKEFLAGS -t : touch files instead of making them -s : make silently -r : don't use inbuilt rules -q : question up-to-dateness of target -p : print all macros & targets -n : pretend to make -k : continue with unrelated branches on errors -i : ignore exit status of executed commands -f filename : makefile name (default: makefile, Makefile) -e : environment macro def. overwrite makefile def. -d : print debugging information Options : -a : try to guess undefined ambiguous macros (*,<) Function: maintaining computer programs V%s Syntax: %s [{options | macro=val | target}] %s: - core dumpedSignal %d%sExit code %d?%s in %s: %s: made '%s' look old. (Ignored) Couldn't execute %s\ /bin/shSHELLCan't open %s: %s%s: '%s' not touched - non-existant touch(%s) %s: '%s' is up to date } is up to date} successfully made} skipped because of erroris up to datesuccessfully madeskipped because of error {don't know how to make%s: Don't know how to make %s already done@? *<No memory for basename : :: in %s near line %d%s: .DEFAULT.SUFFIXESNo memory for basename.SUFFIXES.l.y.c.s.orm lex.yy.c.l.omv lex.yy.o $@$(CC) $(CFLAGS) -c lex.yy.c$(FLEX) $(FLEX_FLAGS) $<.l.cmv lex.yy.c $@$(FLEX) $(FLEX_FLAGS) $<flexFLEXrm y.tab.c.y.omv y.tab.o $@$(CC) $(CFLAGS) -c y.tab.c$(YACC) $(YFLAGS) $<.y.cmv y.tab.c $@$(YACC) $(YFLAGS) $<yaccYACC.s.o$(CC) -c $(CFLAGS) $<.c.o$(CC) -c $(CFLAGS) $<.c.s$(CC) -S $(CFLAGS) $<CFLAGSccCCNo memory for archive name cache--<-` y.o..0C0/! SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error-csh/bin/shcd .NaNr[NwjNN+NbN??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0OWW WWWW../......M^ ]@&^J_X3_b_d*_i*_o!_p3_u*_x3_#` `#`+`- `0`cL`h`l`aEbGbXbbbcbdEbebfbgbiEbnkaobpbrbsaubxb(null)cannot print floating point 9ii9ii9iiiii*@F@D2.0MAKEFLAGS= ((((( AAAAAABBBBBB GMTGDTU U     x p l d \ T H @ 4 (   SSSSB +Unknown errordX<,t`T<,  |lTD,xdL0 x d L < (  C#!/bin/sh # # makewhatis 2.0 - make whatis(5) database. Author: Kees J. Bot. # # Make the whatis database of a man directory from the manual pages. case $1 in -*) set -$- x x esac case $# in 1) ;; *) echo "Usage: $0 " >&2 exit 1 esac cd $1 || exit { # First pass, gathering the .SH NAME lines in various forms. # First the man[1-8] directories, the titles are under the .SH NAME # section header. for chap in 1 2 3 4 5 6 7 8 do for page in man$chap/*.$chap do if test -f "$page"; then # (Old sh barfs on 'continue') sed -e 's/ / /g /^\.SH NAME/,/^\.SH /!d /^\.SH /d s/\\f.//g # should not be needed s/\\s[+-].//g s/\\s.//g s/\\// '"s/ - / ($chap) - /" < "$page" fi done done # The Minix "Book style" documents, look for .CD for page in man9/*.9 do if test -f "$page"; then sed -e 's/ / /g /^\.CD /!d s/^[^"]*"// s/"[^"]*$// s/\\(en/-/g s/\\f.//g s/\\s[+-].//g s/\\s.//g s/\\\*(M2/MINIX/g s/\\// '"s/ - / (9) - /" < "$page" fi done # Some people throw extra flat text files into the cat[1-9] # directories. It would be nice if man(1) can find them. trap 'rm -f /tmp/mkw[cmn]$$; exit 1' 1 2 15 for chap in 1 2 3 4 5 6 7 8 9 do ls cat$chap 2>/dev/null >/tmp/mkwc$$ ls man$chap 2>/dev/null >/tmp/mkwm$$ comm -23 /tmp/mkwc$$ /tmp/mkwm$$ >/tmp/mkwn$$ sed -e "/.*\\.$chap\$/!d s/\\.$chap\$/ ($chap) - ???/" < /tmp/mkwn$$ done rm -f /tmp/mkw[cmn]$$ } | { # Second pass, remove empty lines, leading and trailing spaces, # multiple spaces to one space, remove lines without a dash. sed -e 's/ */ /g s/^ // s/ $// /^$/d /-/!d' } | { # Third pass, sort by section. sort -t'(' +1 -o whatis }   9D $h1$T$Lp D su;SSSSu QRP HPUVW}DžDžDžl WVYƍ t t,u W2Y \ S,J(tE t@t;U9s JxGGSXWY뛋tPh YYDžu P YYu Dž(t t (tDžiWMY=)t5 t0t+A|Z s͋ 뻋)u l u Džt% t JxGGSXWYփu >tE El u_^UVWuVYu#H jjVO VYD D 9H  U UD H UUujjV kUjRV t JxFFSXVY=t tEыV t JxFFSXVY= t u1tU 9uEt U 9UJD UBH j5H V t =H tDJxFFSXV Y=t tH ΋V t U UJxFFSXVY=u1H t u1tU 9uE믋U 9N 9t1OVCY= t tEl K B(t= t8t3}k s U EJxFFSXVY묁}l u1U t u VY(t1EL VY=)t, t't"A|Z}k sЋU EċU)u }L u1Jt% t JxFFSXVGYփ t1El EL _^UVW$ $ ƋU} W׋Ru_^UtU E 9=$ W 19$ u@EЍEP`Yx}u5EPLYy'5t `YPh\h  jR YjuYY Pju E܅y'5t YPhDh  j Y}}tG5 Y P YEt(h8uYY5 uYYu@Y}tju7YYuY}u$uY}tju YYuYuYV6YYjht u8 jYuYjht u t)5t YP6h(h |j YuuY}uufYUUE jjG YYEjj9 YYEjj+ YYEčEP}YE9Et/}y5t g YPhh  jY Yuj YYuj YYuj YY}tj% Y$ _^Uj= t1P= tP = tuheYYh YujYYU(VW}EPWYYy1}Ut1dUIt ?/t1O= t 2} t} ujhYY} hWYYE܅u(5t YPWhh kjYu|YE9Et }'u6>.u1F>ujh]YYuGYE= t} uuY} t} u ju4  = t,W} |Ph h )YWjYY _^UVWu uYǁ u F>t?WVu u:t :,u>t>,tF>,uF1_^UVWumY=v1uh$P! h PYYYEt Dž_BuhP hPYYEu1{DžT1PPu u=uYYtYPuwYZPgYZ ={( Dž> = u]uvPh YYuP6PL ǃuu= 1y9UR t.5t YPPhh jYu Y_^UVWu6YDžu1W:YƅhFPYYthFPYYtjhFP  tjhFP uF-0= vuYPFPYZ=]FPuhPeuu P %= W Y WY1_^UVW5 >t>:uF>q>t>:tU9sGFU9tu uPz t = t&u uP= t= y_^Uhh 3YYjYUVWE EhY u  hY u  j Y 9u/U :- }Bu VZYtG9uF>uր?=uэG1_^UV U9 wU 9 vt 16VPYt1' rF5 &Y5 ^UVW}u1E}UUst 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVD uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVu~  ut 6EP>YEU UEPEPV yE^UVux954 ( ^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVW2}u1r:u ]j=u YYEcJ>@UUU:tEG9tU:u?=tȋU=U1U=2=x kEt Eu E@k P{Yƅu Ux :2u2E x u4x @k P2YYƅu.2x J]x x 1_^UVWuU VVuYYDžt~~yVډt F_^U$UUU UUUE4!EPjGj U} vt M E 1U} vt M ҋE!1UE1UE1U} vt M Et1UVW11}U9 u  F߃| jugYtUrvYtURtUzt r>Y}| t} t} t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvk EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 UYGƒ~uF FF VVv vv >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E U :t! EE E U uuu#YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU E_^UUUuuu @ UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv4 ǃu}_^UU Uh qstuvwxyz{|uu& UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu huw[k{CUSE] ![]USE] ![]USE] ![]UVW}u M&UW}0))ϊE tu1_]XG_]UVW!E_^]&L$ U$UUEPjj U$UUEPjj U}ut UEuYuYU$U UEPuYYEPjj UVu x~t 5juIYYy9uuV1YVju! ^U4VWEj/uSYYuh<Yƅu8VYPuYZEЃeuYE=ut }؀>t >:tFG9}s/GuWYYEPurYY=t42u u =t t t Ũ}t} uFuUR?YỦt _^U(VuEEV֋RUV֋RU DE UUU UEPj7j ^U$EPjj U$EPuYY1ۅÉU$UUU UUUEPjjO yEU(VuU @t*uYEU UV֋RUUUEPu<YYU UEPjj ^U0VWEPuYYy1U؁@tt 1huKYYDžy1EPWYYxSt U؁@u7jW8YYEx& PjW! xh$Yƅut UWYUЉt 1FfFF_^U$EPj*j yUEUMJ1U$UUUUU UEPjj UVWuut 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V  5 h jKj ^U$uYEUUU UEPjj Uu hT$ui U$EPjj y}tUEEU$UUUUU UEPjjS UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U p}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUPg YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U! JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEаUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE  E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }l ~y UVu CV€tu ,fNV~ u>5 Yt.h YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv: =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv+ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh YYjYUVudYƋU rU MJwU uRYY^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u st KVYE=ut &UEUUU}׋U UE8t=+UEEE0YE܋]P3W] }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuqYEuUUȋUUEEEPj;j RY_^U$UUU UEPjjM U$UUU UUUEPj6j# U$} uEEUUE UEPjJj y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P71ۇ< tPXPtroffnroffman: wait(): %s man: %s: %s MANPATH=man: cannot fork: %s man: can't create a pipe: %s catLooking for keyword '%s' -awhatisaproposShowingFormatting%s %s tblman: %s: %s rzcatman: %s: %s -man-mnx9r%s/whatisr%s/windex%s/man%.1s/%s.%s.Z%s/man%.1s/%s.%s%s/cat%.1s/%s.%s.Z%s/cat%.1s/%s.%s%s/man%s/%s.%s.Z%s/man%s/%s.%s%s/cat%s/%s.%s.Z%s/cat%s/%s.%s%s/%scatman...Usage: man -[antfkq] [-M path] [-s section] title ... MaGfSk_nwqkstman: no manual on %s -manMANPATHPAGERunknown errorarsw+bNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH$n$$n$$n${${${$) })@)*X*b*d*i*o*p*u*x*+ +#+++-+0+.L,hs,l~,,E=.G(.X-b-c.d-e=.f=.g(.i-n,o-p-r.sM-u-x-(null)cannot print floating point /usr/local/man:/usr/manmore.\"t  lXD0SSSSB| hUnknown error0$tP@, lXH8 tXD          0p\D0C  4 tO1$T$L su;SSSSu QRPH P U0VW} EEDžDžDžj/7%YYPu PP}~#։h4YYuF9u:-lh4VYYuDžEH4h/YYu:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EP'>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WWYZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWW$YZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVh w YY_   U  U Vc Y=Vh , YYVh wYYƅ>-uF>+uFjVEP ƅUU j h 5 1  Vh YYƅpj h 5  >t>,tjVEP ƅt5U >t'>,u"FVY Y=xwVh YYƅu_^Uh YPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4 4EU M R+Q¤ЙЙUuW +UЙOIkkE04 UM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFFF VVv vv5 >uNN FFSX_^UUUuuu L UVu JxUʋFF Vu>YY^UU Uh uu G_UW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhVYYUR< EMxGFFUR< EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh4 u%dEuEu1k0Z‹N9}t EDu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=D<9}r79}u+UOJ}t EDURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Dt 9ur6E0tU UDtU9ru NJEtU9Wu RWE_^U$UUEPjjg y Up 1UVW5p p }׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U$UUU UEPjj} U$UUUUU UEPjjS U$uYEUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U `w}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEx uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEРUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuvI =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu } .~y UVu CV€tu ,fNV~ u>5 `Yt.hHYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv  =tN V@FF t V 9ډUVVFt$jjvI =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhh YYj2YU$EPuFYY1ۅÉU$UUU UUUEPjj yEUu hT$u U$UUUUU UEPjjw UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇx tPXPctimeCtimemtimeMtimeatimeAtimesizerdevgiduidnlinkmodeinodev%s: %s: %s %s: fd %lu: %s fd %lu: %s: %s: %s: %s -%s: fd %d: %s fd %d: stat: %s: bad field -?-s-all-- i@c`os 6 K s ` Program error: bad '%s' field size %d %u%u%d%luatime%lumtime%luctime%.24s (%lu)Atime%.24s (%lu)Mtime%.24s (%lu)Ctime"%s"----------%07lo, mode%s: Usage: %s [-] [-fd] [-all] [-s] [-field ...] [file1 ...] SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error??? ??? ?? ??:??:?? ???? No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0% a%@%&X&b&d&i&o&p&u&x&' '#'+'-z'0'*Lm(hW(lb((E!*G *Xw)bw)c)d)e!*f!*g *i)n(ow)pw)re*s1)uw)xw)(null)cannot print floating point L`T\VTXLZH\D^<`4d,h$hll ppGMTGDT U U d\TH<4(xl SSSSB ((((( AAAAAABBBBBB Unknown errorXL0 xhTH0 p`H8 lP P P P P P P P P P X@$lX@0C  4C1$T$Lsu;SSSSu QRP PU VjYƅujYEPViYY=ujYM]U R:nufE,U R:yufEhhYYjrYEPVYY=u&jVYUt PYUtj'YjY^UV5Nx ^U=tuPYUHVWEPuPYYxU܁ t1h/Yƅu1V#YDžU9uhhYYh0hYYGPhYYEPhYYxU uUM9uE]9pE]9`VkY V]Y1_^UUUuuu ` UU Uhuu> c{JUVWeE_^]U$UUEPjj U$U UEPu<YYEPjji U}u| UEuYuqYU$UUU UEPjj  U0VWEPuYYy1U؁@t|1huYYDžy1EPWrYYxS|U؁@u7jWYYEx& PjW xh$ Yƅu|UWvYUЉ|1FfFF_^UVWuu| 1FQh^ SPQ fF^1FfFV VF=uFF~u~. VffGVjRGP$ GWBVVFWB)ډfFWBV4_^U$u YEUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 4}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EELuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEtUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu uT ƅ~9})׉U U 1_^UVWu }*~y UVu CV€tu ,fNV~u>5Yt.h@YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv& =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }UVW}u MFUVU9wU9v| 16VYt1'rF5&Y5^UVW}u1E}UUs| 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUh|hnYYj:YU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uR5YY^UVWuU VVuYYDžt~~yVډ|F_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu`YYU UEPjj ^U$UUUUU UEPjj[ Uu hT$u U$UUUUU UEPjj UVWuEu41}%<(t4(YtEG֋E ~tV€uFu1V€cE~tVuډUjuvQ =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<(t(Bt 4(aYF^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u Pk1ۇtPXPis n is y mesg: usage: mesg [n|y] / U@Xb|diopux x#}+s-n0y La hK lV  E G Xk bk c d e f g i n ok pk rY s% uk xk (null)cannot print floating point qJqJqJWWWSSSS/devB4  fd X1$T$Ld su;SSSSu QRPqP:,Uhh ?YYj,YU5jj @ jj5 5|Yhjj @ ]j+YUVh$5?YYƅ~NjlhV? jlh`V? jlhV? jlh8V? VY?Y1^UVj5[?YYƅfjlhVJ? jlh`V:? jlhV*? jlh8V? V>YjYjYjPY1^UV}u s s E1k Pu5> F^U V}u s s E}u s s E7k `Pu5G> k Pu5-> F^UV}u s s Ek 8Pu5= F^U VWjh=YYyhh<YYj)Yh)YW?>YPh|3>YZPh*Yuhhh<<YYjL)YW>YPW5"> j h\5W=YZR> 1'k k `k k 8Fԃ}~WU jhXr= u9mth<;Yj(Y hh;YYj(YThrj,YYjjt<YYjjjPjj5YYjdYjYj Yl _^U,VWEEEE1E}t' U؉U}u1W3‰U}t,U؉U}u15U‰UUR}1Z)kP}tZP}u1ZЉE}u?k] }}X P}~'1ZЉE=kE }}X P}~'1ZЉEuu5n 58Y54!YE~5 !Y5!YEI}t#}wE؃}jE^}u }w}u*}}EE3E1E}} E؃} EEEE}t}t EEE}t(}~MEEE}t }[}t(}~M^EEED}:M؃}-}#EE }t }}E} }} E}~ EE}u9kE U9YkE 0}}ZЉ3kE U9}$kE 0}}ZЉkE Phs 58 kE Ph s 58 URR}}1Z)kP}tZP}}1'@Pt }t |}}u1}t}rEf}}u7kE WkE 0}}Z)‰1kE ~$kE 0}}Z)‰kE Phs 56 kE Ph s 56 URR}}1Z)kP}tZP}}1'@P e]W}u1Z)‰>Ex[}kE <u1k] <k] 8Phs 55 NkE @u1k] @k] 8Phs 55 EZkE 8Ph s 5l5 jj)YYe}[ kE du1k] dk] `Phs 55 kE hu1k] hk] `Phs 54 kE u1k] k] Phs 54 MkE u1k] k] Phs 5E4 YkE `Ph s 54 kE Ph s 53 jj)YYthjj5hjj5k5.Yj3Yhjj5@thpjj5hXjj55YjM3Yq6jY)E(XUVu j hdV3 j hXV3 j hLV3 |j h@V3 gj h4V~3 Uj h(Vl3 Cj hVZ3 1j hVH3 j hV63 EW^UVW} huYYPhuW5kE }}XEk] }}XE1q}u}*9uuUPRW5A}|}~-9uuUAPRQ5F놃}|}~=U hxRW5 U AhpRQ5 5Y_^UVW} huW5 BhuR5s huGP5Y k u1k Pu1k Phu1k Pdu1PhVYYBPhuR5 $Fo= u1P=u1PhjYYBPhuR5r 55Y_^UVW} hDuW5C Bh,uR5) Yk @u1k P<u1PhVYYJPhuR5 F뢃=xu1PhjYYJPhuR5 5K Y_^UV5Yh\jj5Q 5 Y1%VkSj" Fjjj( jjj( jj)HYYjj)YY^Uuh|h, jYUJxUhu(YYUhjuu 5T! P@# Uhj5P&# UVWuh|!YY=t dEPhTjV- u>UtE hZYUtE h<Y h*YhYH|hHhYYPhHhYYXhHhYY\hHhqYYThHh[YY`hHhEYYdhHh/YYhhHhYYlhHhYYphHhYYthHhYYxhHhYY|hHhYYhHhYYhHhYYhHhiYYhHhVYYhHh@YYt,>t'19tGF FԋHLD@ lhpt\ x$P(T,d044(88<<@DoHLP T,X0\$`1_^Uhj*YYhj*YY1xP1ۅÉpP1@u@t1ۅÉUjvYJjRYY5Yhj5d 5Y5Y5dYhjj9) 1Uh YEu1uSYjj55=du1^jj55u19jj55u1j5YYUVu}xU9V | U 9VD9VH} UVU 1^UVW}jLYƅu djWyYYF8uVYBjWWYYFuuhh " hh 5: YY=u hh #YUUUuu u =u;uuhh " hh uYY=u hh #YUUUuUYhh u' YY=uuu hh ?" UU U5 Yhh 5 YY=uuuhh ! UUUu u5 =u?5Yhh 5k YY=uuuhh ! UUUuu ut =u9u3Yhh u YY=uuuhh ! U9Uu B$ uYxU(VWudUVUVUEUU؋U9VN<< t'WuYY9=~> tۋPYGGEhY_^UVWl MR<Ul R@UR8]׋l R8]֋U9UW9uU9Ut:uu YYU9Uы9uU9Ut6YEӋE띋l MR<l MR@_^UVdl z$t5Y=l z$t5l Y#195~l R<V8UN UU9UwUEEV<V@N G빋VDF_^UVWu1~,u#VtV J9VuVJ9u =xt=puGJxSX h[YE=xtAVVNRQ5 =tEP5YYEPVYYtRE_^UVu uY=t> tF=u 1^UVWuVu19~|V8<t 4.YGv<"Yv@Yv8YV Y_^U=xhj5xl q=|dhj5|E M=thj5% -=|t$hj5| E<UVu FU9rH}Nz,t uY^UVWu~UU UV Ue U9V|9~ |}x}@EE9}~+j VYY=u g~u1ZG1P=t1uV+YYE""1O 1j^V%YY=u j?V YY} }1j^VYY=u @U RVYY#V UUN8M9 ;UN<tG9uF>uր?=uэG1_^UVx U9x wUx 9x v 16V,Yt1'x rF5x &Y5x ^UVW}u1E}UUs 1=t u8jY=u1V!փ5t 5x FE5| OVU}9}r69v2W9UvUW~>}t E| u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=| <9}r79}u+UOJ}t E| URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15| t 9ur6E0tU U| tU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPV yE^U$UUEPjjg y UP 1UVW5P P }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^UVW}u YfE=h\DYEu ELPU:/tHhD!YEt/u uYYuhuW E4h0u" YYEuE+UMuRQ} uuY1W Y-E8\tU tF>#tEPVu  u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1U tFjuV` uˀ~#uōFPzY^UV5t}u7F<:t ~u1&U tFjuV uθ^UVW5E 8t}u1F<:t ~u1U tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!Fd1 W1GF9GE UE 8E_^U VW EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F" +EU 0U FE _^UVuu>t FPUY^U$UUU UUUE@EPjGjx U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW11}U9 u  F߃| jugYtUr YtURtUzt rY}t}t}t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF FF VVv vv) >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }V9~y UVu CV€tu ,fNV~u>5xYt.hxYFu NLNHF 9hJYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvx =tN V@FF t V 9ډUVVFt$jjva =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E 'U :t! EE E 4r'U uuuYYEy@Ut8huYYE~" tuYuuYYE}y1]jmYEu uvY1A!uEUMJUzUBU E_^UUUuuu UU Uhuu UEEUUUUU JUEPuux EUJUx ]E EPj`YYEUuu huUEEUUUUuYEuu EPo /S'8'kUSE] ![]USE] ![]USE] ![]UVW}u M^T$ L$ UVWM E_^]UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0U tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjjg U$UUEPjjG U$U UEPuYYEPjj U(VuEEV֋RUV֋RU LE !UUU UEPj7j ^U$UUU UUUEPj6j U$EPuNYY1ۅÉU$UUU UUUEPjjC yEU(VuU @t*u^YEU UV֋RUUUEPu@YYU UEPjj ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPOYjEPj5 V  5 h jKj ^UU$VWEPYEPEPj j|YƋ}t9uvEEEPsYEEPEPjL W;YUUjEP9YYEPNYWjYZ)‰jEPj  jEPj t9r)օu jYVYU)_^Uu hT$ua UV& T$@, T$@% T$@xE uVu ^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U !JxUʋFF VuZYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PKE6U U RU U RUEEE@E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP>YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPZYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }E $E)E EEE/-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G  E=cF}[t@}nt:JxFFSXV+YEEU uՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE= r} u8-t8+uEE- EE}dt}iuuEPh d EuEPh f EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEU u:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE } s UE?]u Gƀ ?Z?]QGƀ ?-uG?t2?]t-G9"G@E9EEƀ EG 띀?uEE 3]uVu-YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE 3]u}t}t VuYYMEUEt }vE}uEuVu E= r} u8-t8+uEE- EEEPh YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY @Ej EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^7?+{UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uPYYUUas U EUhhJYYjZYUhh*YYj:YUVuYƋU rU MJwU uRYY^U$UUEPjjS U$EPjj9 U$UUU UEPj%j U$} uEEUUE UEPjJj y}tUEEU$EUEPjHj UVWE_^]U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7` u.`=}aa1ۇ\ tPXPUsage: mixer [-r] Could not restore mixer settings Mixer settings restored -r/.mixerNot enough memory mixer.iniHOMECannot open /dev/mixer /dev/mixerA"         d N     t en r s error: could not openmixer settings restored error: file not savedmixer settings savedP 1Bass Treble Speaker Mic Line CD Fm Dac Master rightleft-*-*%s%s %d %d%s %d %d %d %d l r l r left right Rec-In %s %d%s %d %d left right Mix-Out ------- Mixer Controls -------curses: %s vbblacaeasvsveviueusmdmbmemrcmsesoclcolicoliTERM8)(((j*2* ) ) +*@*r/etc/termcapTERM/etc/termcapTERMCAPn4 0,41,42,43,4E3b4f$4n4r 4t44\t4435%5+5245d5i4r4OOPSc>aP>r+>w:>>+>b}>)DD)DD)DDDDDGFFG)H G@H&IXIbHdIiIoHpIuIxII I#I+I-I0ILLJhJlJJELGxLXKbKc_Ld!LeLfLgxLi!LnGKoKpKrLsKuKxK(null)OXObOdOiOoOpOuOxOULUhtUl{U,VEZGZXV['YbVcWdVeZfZgZiVnJVoVpVseXuVxVcannot print floating point cannot print floating point ><v^#: #+'#+++++- - _++++|+,.-0ahI`fgjklmnopqrstuvwx~SSSSB ((((( AAAAAABBBBBB #!/bin/sh # # mkdist 3.4 - Make a Minix distribution Author: Kees J. Bot # 20 Dec 1994 PATH=/bin:/usr/bin export PATH # Move out of /usr. case "$0" in /tmp/*) rm -f "$0" ;; *) cp -p "$0" /tmp/mkdist exec /tmp/mkdist esac usrlist=" bin bin/MAKEDEV bin/arch bin/badblocks bin/chmod bin/clone bin/compress bin/cp bin/cpdir bin/df `test -f /usr/bin/mtools || echo bin/dos*` `test -f /usr/bin/mtools && echo bin/mtools` bin/edparams bin/getty bin/grep bin/installboot bin/isodir bin/isoinfo bin/isoread bin/kill bin/ln bin/login bin/ls bin/mined bin/mkdir bin/mkfs bin/mknod bin/mkswap bin/mv bin/od bin/part bin/partition bin/readall bin/repartition bin/rm bin/rmdir bin/sed bin/setup bin/shutdown bin/sleep bin/sort bin/stty bin/sysenv bin/tar bin/uname bin/uncompress bin/update bin/vol bin/zcat etc etc/rc lib lib/keymaps `cd /usr && echo lib/keymaps/*` lib/pwdauth mdec mdec/boot mdec/bootblock mdec/jumpboot mdec/masterboot tmp " # Find the root device, and the real root device. . /etc/fstab realroot=`printroot -r` if [ $realroot = $root ] then rootdir=/ else umount $root >/dev/null 2>&1 mount $root /root || exit rootdir=/root fi echo -n " The installation root and /usr can be put on either one diskette of at least 1.2 Mb, or on two diskettes of at least 720 kb. Do you want to use a single diskette of at least 1.2 Mb? [y] "; read single case $single in ''|[yY]*|sure) single=true ;; *) single= esac echo -n "Which drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "Please type '0' or '1'" >&2; exit 1 esac if [ "$single" ] then echo -n "Insert the root+usr diskette in drive $drive and hit RETURN" else echo -n "Insert the root diskette in drive $drive and hit RETURN" fi read ret umount /dev/fd$drive 2>/dev/null umount /dev/fd${drive}p1 2>/dev/null mkfs -1 -i 272 /dev/fd$drive 480 || exit partition -mf /dev/fd$drive 0 81:960 81:240 81:240 >/dev/null || exit repartition /dev/fd$drive >/dev/null || exit mkfs -1 /dev/fd${drive}p1 || exit mkfs -1 /dev/fd${drive}p2 || exit mount /dev/fd$drive /mnt || exit mount /dev/fd${drive}p1 $rootdir/minix || exit # Hide /minix and /etc mount /dev/fd${drive}p2 $rootdir/etc 2>/dev/null # (complains about /etc/mtab) cpdir -vx $rootdir /mnt || exit install -d -o 0 -g 0 -m 755 /mnt || exit install -d -o 0 -g 0 -m 555 /mnt/root || exit install -d -o 0 -g 0 -m 555 /mnt/mnt || exit install -d -o 0 -g 0 -m 555 /mnt/usr || exit umount /dev/fd${drive}p2 || exit # Unhide /etc umount /dev/fd${drive}p1 || exit # Unhide /minix install -d -o 2 -g 0 -m 755 /mnt/minix || exit install -d -o 2 -g 0 -m 755 /mnt/etc || exit set `ls -t $rootdir/minix` # Install the latest kernel install -c $rootdir/minix/$1 /mnt/minix/`uname -r`.`uname -v` || exit cpdir -v /usr/src/etc /mnt/etc || exit # Install a fresh /etc chown -R 0:0 /mnt/etc # Patch up owner and mode chmod 600 /mnt/etc/shadow # Change /etc/fstab. echo >/mnt/etc/fstab "\ # Poor man's File System Table. root=unknown usr=unknown" # How to install? echo >/mnt/etc/issue "\ Login as root and run 'setup' to install Minix." umount /dev/fd$drive || exit umount $root 2>/dev/null installboot -d /dev/fd$drive /usr/mdec/bootblock boot >/dev/null # Partition the root floppy whether necessary or not. (Two images can be # concatenated, or a combined image can be split later.) partition -mf /dev/fd$drive 0 81:960 0:0 81:1440 81:480 >/dev/null || exit if [ "$single" ] then repartition /dev/fd$drive >/dev/null part=p2 else echo -n "Insert the usr diskette in drive $drive and hit RETURN" read ret part= fi mkfs -1 -i 96 /dev/fd$drive$part 720 || exit mount /dev/fd$drive$part /mnt || exit install -d -o 0 -g 0 -m 755 /mnt || exit (cd /usr && exec tar cfD - $usrlist) | (cd /mnt && exec tar xvfp -) || exit umount /dev/fd$drive$part || exit # Put a "boot the other drive" bootblock on the /usr floppy. installboot -m /dev/fd$drive$part /usr/mdec/masterboot >/dev/null # Guess the size of /usr in compressed form. Assume compression down to 60% # of the original size. Use "disk megabytes" of 1000 kb. set -$- `df | grep "^$usr"` size=`expr \\( $6 \\* 6 / 10 + 999 \\) / 1000` echo -n " You now need enough diskettes to hold /usr in compressed form, close to $size Mb total. " size= while [ -z "$size" ] do if [ "$single" ]; then defsize=1440; else defsize=720; fi echo -n "What is the size of the diskettes? [$defsize] "; read size case $size in '') size=$defsize ;; 360|720|1200|1440) ;; *) echo "Sorry, I don't believe \"$size\", try again." >&2 size= esac done drive= while [ -z "$drive" ] do echo -n "What floppy drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done echo " Enter the floppies in drive $drive when asked to. Mark them with the volume numbers! " sleep 2 if [ `arch` = i86 ]; then bits=13; else bits=16; fi >/tmp/LAST cd /usr && tar cvf - . /tmp/LAST \ | compress -b$bits | vol -w $size /dev/fd$drive && echo Done.   @ @G1$T$Lsu;SSSSu QRPPU VuU fU>GfE>j>auUfUL>uuU fU1>guU8fU>ouUfUF덀>t>,u>>,uFE  fE>f>uu@UfUUM U M сfMF!>gu=U8fUUM U M сfMF>ou=UfUUM U M сfMF>ruU$fU>wuUʒfU>xuUIfU>suU fUd>Xu.U @t U ItDUIfU1>tUfUUfUFOUtUM!сfMfEUtUM!M сfMM!U ʁfUUt!UM!M!сfMU  U!ʁfU^E$->FE^UVWu }E~ V:-uhHvDYYtOjjhD6? QOztEJWZuUjYfPYEuxJWZbh6xYYt6YE:}t4huYYP6<YYt6GY6YE돋E_^UhLJYjYUV5Nx ^U=tuYUVu>tF+URuj ^UVW5YNj5(h Yh$Y}t.U:t&uYPuV jhtV WcYPWV jhpV _^/O6L$ UVux95x^U$UUEPjj? U$U UEPuYYEPjj U U jRu U$uFYEU UUUUUEEPjj U$UUEPj     5 PY u6Y   6YE49U9| 6Y"< = u= l= t = u  = u= t6TY  WY EPWYYU@tWhxh 6Y5 5 hl5 EPhhYYhd5 YYWYh`5 mYY1_^U}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV, uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0mtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj y Uh1UVW5hh}׃}~9r }y 9vWYu_^UVW=aU9} M :-uzu M h4_YYuM ǣp :tWuYYƅ}=t=E h0YYhhrYYhW5YYhj 'YYM :u? F>:M C;t!A M C U9|W=t=E h0YYhhYYhWdYYhj VYY?`A M  7M :u _^UVWuU VVuYYDžt~~yVډF_^UVWEE11<tN|1DFρECEE0-EMP1E E *U :t! EE E ~*U uuugYYEy@Ut8huYYE~" tuYuu#YYE}y1]jYEu urY1A!uEUMJUzUBUE_^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^U UUEEUUUUuYEuu EP G USE] ![]USE] ![]USE] ![]UVW}u MBUW}0))ϊE tu1_]XG_]"UVW=E_^]BU$UUEPjj# U$UUEPjj U}u UEuYuYU$U UEPu(YYEPjj U(VuU @t*u.YEU UV֋RUUUEPuYYU UEPjj7 ^U0VWEPuYYy1U؁@t1huKYYDžy1EPWYYxSU؁@u7jWXYYEx& PjWA xh$WYƅuUWBYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U #}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE"uVuuƀ}Xu9utUP?YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"Ud!EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuBYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP&YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPBYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWu }E $E)E EEEL-t+u-U EMtJxFFSXV Yǃ}0}U EMtJxFFSXV} YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G GE=cF}[t@}nt:JxFFSXVYEEmuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE= r} u8-t8+uEE- EE}dt}iuuEPh EuEPh EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEmu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE} s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG띀?uEE3]uVu)YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E= r} u8-t8+uEE- EEEPh YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uu YUURY E2EEu }ntEGV}u}tE_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }4~y UVu CV€tu ,fNV~u>5Yt.h`YFu NLNHF 9h2YFuN!NF V@uVVVhUFt$jjvN =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv? =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhDhjYYjYUhdhJYYjYUVu(YƋU rU MJwU uRYY^U(VuEEV֋RUV֋RU E G UUU UEPj7j ^U$UUU UEPjj U$EPurYY1ۅÉU$UUU UUUEPjj{ yEU$UUUUU UEPjjC Uu hT$u U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv2 =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^U$UUU UUUEPj6j+ U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7xu.`=}aa1ۇttPXP b    A      a  $ boot %d %d mkproto: %s must be a directory %ob:g:i:p:t:u:d:s File %s has an invalid mode, made empty. /dev/null %s%s %d %d $ cant get status of '%s' /unable to open directory %s %s%s%c%c%c%3o %d %d -u n use nnn as the uid on all files (default %d) -t ROOT inital path prefix for each entry -s use the same uid, gid and mode as originals have -p nnn use nnn (octal) as mode on all files (default %o) -i n file system gets n i-nodes (default %d) -g n use n as the gid on all files (default %d) (none) -d STRING define the indentation characters (default %s) -b n file system size is n blocks (default %d) options: Usage: %s [options] source_directory [prototype_file] Cannot create %s w: option requires an argument -- : illegal option -- --arw+b q@Xbdiopux #+-0L}hglrE1GXbcde1f1ginoprusAux(null)X[bvddi[omp[udx[=%L&%h%l%%E]*G]*XQ&[(bQ&cc'dQ&e]*f]*g]*iQ&n%oQ&pQ&s (uQ&xQ&cannot print floating point cannot print floating point 212121111 SSSSBt ((((( AAAAAABBBBBB   / hdN1$T$L su;SSSSu QRP )PnUhhH YYjNYUVWDžDžDž fn m9}U :-Bu WZY`:-u z`:tDžDžDž̋`:u9}uBu WZY``hDž`닋`:u9}uBu WZY``dDž`G=``P-9}uyBu WZY4t 9}tXU j/V YYu.hP YYhVP PV[ YYy(5YPVh|hH|j?Y tVhhhHL jYjVYYxYu(5`YPVhXhHjY@YfEjheYYx0k0jS< j0EP8 yh<hHYYjJYYjjWYYjjFYYjj5YYjj$YY|<Dž>uh$hHYYjYDžE`+u1ǃ:tEj P-YYnPSV hVYYdtdVYYVhrYYvhthVYYPjVx hVbYYtEj PYYuVh YYU*95 YPhhH DžmP,YnP&Yj\YYjMYYj>YY|j/YY0YY5qYP3hhHj>YXPYt9\ttu܃=tӃtt Xt!Dž\)DžGKY_^UVWhuYYEy'5YPuhhH3E E ƅ*hhhH \u'E E ƅru nu GU9t t uhhhH )QPuZ hhhHw j!YhhhHX hPu PhhH. hPu hhhH 9hhhH )QPu{ hhhH jBYhPu hhhH^ uY_^UV5Nx  ^U= t uXYUVu~  u6EPYEU UEPEPV yE^UVux95 ^UVj$Yƅu jYƅu jYƉ^U VWuEYƅu1PjhV t18CEt]3V#YYu h G\1_^U$UUU UUUE EPjGjt U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UUUuuu UU Uh0uur +C7x W UW}0))ϊE tu1_]XG_]UVWE_^]T$ CL$ cU= x 5 Y  U= xjh YY y'j5 YY Pj5  1U  = u/hh 5  1V = u1<    = u U} t} u1UV PYt }u :#u1b5  U :u1D : t(}t :"u*  P_YtU>u1^UV U P'Yt  :"uR jYƅt(>"t#= | u1{  0ʋ :"u; 0jYƅu1C= | u13  0= | u1  E^U= y _y1Du17jRY| tjAY | UVƅtu6uYYu^UVWuU VVuYYDžt~~yVډF_^UHVWEPuYYxU܁ t1h Yƅu1VYDžU9uh h YYhTh YYGPh YYEPh YYxU uUM9uE]9pE]9`VY VY1_^U$UUEPjj U$U UEPuPYYEPjjm U$uYEU UUUUUEPjj2 U$UUEPjj U4VWEj/uYYuh\cYƅuXVAYPu2YZEЃeu2YE=u}؀>t >:tFG9}s/GuWYYEPuYY=t42u u =t Ũ}t} uFuURYỦ_^U(VuEEV֋RUV֋RU dE {UUU UEPj7j ^U$EPjj U$EPj/ji U$EPjjM U$UUU UEPj%j% U$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPutYYU UEPjj ^U$UUUUU UEPjj_ U$EEEPj.j> U$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V  5 h jKj ^UU$VWEP YEPEPj j YƋ}t9uvEEP YEEPEPj Wg YUUjEP YYEP YWjA YZ)‰jEPjV jEPjf t9r)օu jYV YU)_^U$u YEUUU UEPjjp U$EPjjU y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE:uVuu+ ƀ}Xu9utUP/YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UIEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U iJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE@YE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } j.~y UVu CV€tu ,fNV~0u>54 Yt.hPYFu NLNHF 9h"YFuN!NF V@uVVVhUFt$jjvJ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv; =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^oc @go+ { USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }v UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV U9 wU 9 v 16V0Yt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U}x}~uPYYUUas U EUhhHYYjYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRiYY^U$UUEPjj U}u UEuYumYULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVXYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3Wy }׃E뻋EEUUE8t=+UEEE0YE܋]P3W! }׃E뻋EEU9vGuAYEuUUȋUUEEEPj;j RY_^U$UUU UEPjje U$EPjjM U$EPurYY1ۅÉU0VWEPutYYy1U؁@t1huYYDžy1EPW:YYxSU؁@u7jWYYEx& PjW xh$YƅuUW*YUЉ1FfFF_^UVWuu 1FQh^ SPq fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$} uEEUUE UEPjJj y}tUEEU$EUEPjHj Uu hT$u UVWuEu41}%<`t4`YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvf =u N /uvv/ EU9Uu1 N _^UV1}*<`t`Bt 4`aYF^UW}0ʀuA)_]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPUsage: modem [-sio] [-I in-codes] [-O out-codes] line [command args ...] I)Ojios22-[modem: %s: %s modem: fork(): %s modem on %s set for dialin. modem on %s set for dialout. modem: line is busy. modem: cannot read UTMP ! modem: %s: %s %s is not a tty modem: %s: %s /dev/%d %d %d %d %d %d %d %d %d modem: can't send codes to %s: %s unknown error/dev/No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0/PATHe @>bXKb0dBiBo9pKuBxK; ,#1+'-"06-Lhl 3EGXbcd]efgi]nopr sux(null)cannot print floating point /etc/utmpSSSSB0HUnknown errorL@$l\H<$tdT<,t`L4x`L4$C/etc/ttytab/devd  j4J1$T$Lsu;SSSSu  QRPBk(P=UUV5,Bu hX3Y B,B5 B^UVW}t5uHYƅV-Yƅt V3YU}y @Bz tJhhV0[ Džy#=u h`0YhL0YW YWZY_^U VWEju9YYDžgt1U9s*?u FEjuYYG%Fˍ)QPuZ yhxE0Y_^UjuYYu=pBu u3Yj5`BjuUVhYƅt\>tVh[YYh*Y)dB 0Bօu h/YV*Yj5`Bjj,^U5 B/YUV} t=|Bt1UJPRYYƃ} t'=|Bu@Bju5DBr^UVWYYE HB܋EUVWbU= 5BPV r++փ} t1҈RYR@YFFDž>u7~t1_u~u">u~tFFDžDž_u>u FF>u ~_u Dž} tU9tGRYth-j5BE h-j5BE } tU9tGRSYth-j5B5E h-j5BE G ~q} B:RY5B\Yh-j5BD U OB+ډ++} =BtI GRYh-j5BC O } {PY=Bt =Bt h 9Yth-j5BWC th-j5B9C HB_^UV\uB9Uu>v~\tuNWPYZ)‰NWPtYZ)‰ׁ^w B9NWPNYZ)‰׋UF} |}| j^YGu@uYGj YF_^U5BYBJBpBB 5BY} |}|j YUVWEU FU:}\t<=th7IYE+UׅhVHYYuF!맃}\t==Bt5BHYE+Uׅ~S5BVHYYudF%[UBEJWZ~F>EES%=xBuPYh`YPh-HYY} |u!PGYyhLY9FEyh@Y}e } |u2_FYjWFYjjgF 9FYjPh0h4h8+Fj&Yjj;*YYjj0*YYjj%*YYE=t jj*YY} |u/EYjj )YY YEYj.FYE9Et}yh*j)YYhq+j)YYuj)YY_^U VWEu -0= s0kE ЉE݋UE}u=pBt@G BrPEPEP E~E}u1 _^UVW5d=dt 5`h9dp)ЙǍW2kkPSV ƣ`k֍h5d95hvFF ߅udddV0Y_^U VW=tBy15d|9U|9UVuO=`)ЙkEU9P}}u9r˃~ uVY/=pBt } u1ƋU9V| t1_^UVu u3YYƅu1VB+UڋN^ ^U|BjRYYu=pBt|U VW`U} t =B }uS$YE=pu hY BkpU֋Vp=B=tuj`YtjSYxV׉+UЙijP5t^B hv 5tB =t htYjW5x%B V)Wv5xQB 9t hdYvU%Yv L%YF } tBE_^UVWjuYYE} t1}uU 9UvUUуMtFGu$YE_^UVW}5`G)ЙklC)Йl=pup_^UVWut?UUU9V t zE |=Btjj5tB@ F=t;V =Bt++VډVUjh7YYEF jh#YYEFEcEE}U+V Ru5tB3@ Ey=thYEUUUV 9Ut 9}%? ^|UV9Uu63UMRQv FUVUE2+V BEE?uGx9~ |+V BEE_UzRjhYYEv EUYzπ?t GUEUN zϋU ||Vt,UU=9~ uC|F4VY+`ЙE+V HЙ}_^UVWujhYYF VUV+UUjuYYF=Bjj5tB= Ejv5tB= hv 5tB= Eju5tB= ~ VEUUV U9v>%? u$U9U}!+V BMCRv]Z?uG+`ЙijP5t= hv 5t= =t h Yju5x< uv5x< 9Et hZ YV ƂV#Y_^UVW=`9=dvW օtVYwYڋ5`tVY`dh|5tVgYlpB_^U}t us;YU5tY5xY5tBYUVo =hBthB:t hB/ (jEPjx;  E!Ɖ^UVWjuYYƉ+`ЙNjU+VN+)ۉ_^U0VW=Eu%E= |}uEЋUFEЃt FEЃ} |EP- Y_^UVWu} =pBt WUw~uH`F  Yh Y\B9| VvyYYvt UWs5h_^UhBh! Y BRP BjrPYY=t=8Bu=HBtjxYUuhpx:YYu hp :YYpUVWuU TUhu ?:YY>}u>t>=tF>uh|uYYF>>:uFF%?^t?\uEFEuhlu;YYE?^u}?u#U #UPYGU9rhTuYYu4YEuh<uYYU9u0U tU ]9UsE%UEU PRuEP. E=uhu]YYg}uhuCYYPhu8YYshu 8YYEPu 58YYhu &8YYBU1_^UV B,B5 BhYYhYƅt%5,BVYYƅu jYV Y,B^UV5 BT>tF9Eu1^UV#U#UѺ ˆ^U#U#UѺ!‰U VW1E0u+jj YYƋ]U FFFU9MEU:u,FEF~u}t/E fF !~tVUnVUc_^UVut>uuu V2 ^UVW}uEt>t9u }F߃}u1,UztUB ] +U>u1_^UVW} j5Yu BUBWYƅt>t1PYtD=Btjl4Yjl4Yh Y7YhYtjY=BtjVh14 )Й+EVPYY_^UVW}t h24Y h%4YhhBV4 Džy hYV(4Y_^UUBhj3Yt jp3YtB=Bt1jK3YjjhT3 th<YYjY=Bt1mh(hb4YYhhQ4YYjjYYh*jYY jjYYuhP+jYYhq+jYY1Uh*jYYpBUd jjYYjj2YY} 54BY|hP+jpYYU=CtjhB],YYU 9jYUhdYuYh`YUVWuhYDžtWSY>t/:-u(6?Yt6?Yhl4Y1̃>t:+u hB_^UVWu>-uF-0= s/1Fk Ã0-0= r}=`B>t7'|B CClBٸF=1_^UVB =BtB)RVj71 5B^UB BUBJBBBMUVut.>t)BJB]FBB^UVEEƅdv |u'BJBBB^@BJBBB^UuFYP4YUVu } | EVPYYƹ E0F^Uh9uYY9UU:u1J=9t59Y9u Y9t1=9t9UU9Uju59C U =tB~ 5tB.YUBjju. tByhYCEP5tBr.YYUCYUVWU9u B0B$9)U 0BjYU U =hBt:EPfYE tjYuuyYYhBjY5jhBy' t jYCpBEPYEuuYYUVUdB99~y5dB0B4[Y1^UVWu}9u v ?tGF_^UVWEt =8BtxB|BVh C%YYhTYƀ8t5BhPY@A8u5C:t*}~$UJRj5C Ph4C$YY5@Ah4C$YY=B~ =B~I=BrBBB=B~ =B~ BP}ExB|BUBUJ\BЙ$B $B=`Bt U9`B| \B`BTC׉tG9uF>uր?=uэG1_^UVAU9AwUA9Av 16V,Yt1'ArF5A&Y5A^UVW}u1E}UUs 1=Au8jY=u1V!փ5A5AFE5AOVU}9}r69v2W9UvUW~>}t EAu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=A<9}r79}u+UOJ}t EAURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV@ uY_^U VWUUb15At 9ur6E0tU UAtU9ru NJEtU9Wu RWE_^UVu~  u6EPBYEU UEPEPV yE^U$UUEPjj  y U1UVW5}׃}~9r }y 9vWYu_^UVW}uh, Y1zUAAAAAh(YEPjAYYu10=A|h Y1`ARYDžuh qY1UAAW\AhYEPjYYu1GPGQGTGX]VN Y8|>uNOP>u GQ@GQUPEEt2>u"FPY9EwVUFPYEV YʋUWTUWX_^UVWE }t8=A |hh SY1UAUARWY E1EP*Yƅu1t VWYYUuE #UE A:|uCAEPYƅu1VWYYUuE #UE 벃}t U1PYEPWUYYtuVYYV Y}tAA8)thX 1Y16}u.A:t#:)uhH Y1h< Y1_^UVWEjYE1A:K:|tF:)tAEPKYDžu1<#UE u#UE  WVfYY릅uj YE_^UVWEPYƅu1A M}*t}+t}?tUE|Uu}?th Y1\}+t]}*uUtVj VYY}*uKVjAYYjYPVYYVVYYjYPVuYYj YPVdYY}+uUtVj YY}+uHjqYWV)YYVj]YPYYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWV YYAA:*t :+t:?uht Y1_^UVWEjYjYjYNjEqA:^ujeYA jSYNjA:]t:-uAAPfYA::]:-gA:]t:u j-*Y‹AJA΋A MA9}hd Y19u| VYFAxAAPY^jYA:]thT HY1`AEMEPjYYDžu15#UE !hD Y1h0 Y1A:uh$ Y1jYǡAAPYjYE Ah 5ASYYƅh hY1A M~}*t }+t}?uNEuEjGYDž~AAPfYNj[YAA _^UVW=AAu AMFFF5A_^U=AAtAAMAUVW=AAu A>=AAAU9} sOPMUY u MFFF_^U VW}At@uVEYDžt>u +U UU )UUˆFUڈ^_^UVutAt>uu FPYY^UVW}t} uh Y1\thx hY1Tt9u WTPV+YYƅtwXwTV tFՅu1~}t U A AQt u WXYYPu Pt*GPPVYYƅt2VW1YYt FVWYYt Fu1_^UVWU AUAU(A}u(E }~MU]R&YtU EU AJ(1_^UVWuVFYEoA9Aj1xA:T1bA:u1PA0A9t1)WYE=~u5AW t1UAAA:tPFPYYu1AA:tPFPYYt1Ar-E=AuYtU A<u<M1F-E=AuzYtU A<u< 1U:t VU=AFP0Yt =AVtYƅt>t1EU:uJM> u1E=AFPYEU9U|;}tA]9uuYtLMUA181h\ Y1" uehH jY1_^U VW15AUUnVYljjU9YGF>tPPu YYt>GF>t5Pu YYu#GFh Y1Up <5A_^UVWuAu1*VNu1>u _^UVWuU VVu YYDžt~~yVډF_^UVW}u q YfE=h YEu E PU:/tHh }YEt/u u YYuhuW E h u YYEuE+UMuRQ uuY1W Y-E8\ttF>#tEPVu x u&E8|t E8:uu7Y>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1tFjuV uˀ~#uōFP Y^UV5t}u7F<:t ~u1&tFjuV uθ^UVW5E 8t}u1F<:t ~u1tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F  0 SGF9GE UE 8E_^U VWAEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F" +EUH U FEA_^UVuu>t FPUY^U$UUU UUUE(^EPjGjx U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UUM J} t U RY]uEPu 1UEUUzt RYuhA&U RuZBRYAUVW11}U9(u (F߃| jugYtUrV YtURtUzt rY}t}t}t uY_^UVWuEu41}%<(t4(YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvv =u N /uvvk EU9Uu1 N _^UV1}*<(t(Bt 4(aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<(t,(R@t(Bt 4(YGƒ~uFAFF VVv vv >uNN FFSX_^UVWEE11<(tN|1DFρECEE0-EMP1E E  U :t! EE E  U uuu7 YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU(E_^/sC[wo  G * USE] ![]USE] ![]USE] ![]UVW}u M/ b UW}0))ϊE tu1_]XG_]B UVW] E_^]b T$ L$ UVuj jV ^U 1 UujjP Ujuj< UVW}?tu 9t>tF>uGމ+U_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjj U$UUEPjjo U$U UEPuYYEPjjA Ujju1 U 2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0gYE9uvEEEЃ E V!փ}u sKVXYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0ZYE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjj U$UUU UEPjje U$UUU UUUEPj6j; U$EPuYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEU VWgEu>tFN>Xu E0EEF>t&azjuYYyEG߸ _^U(VuU @t*uYEU UV֋RUUUEPuPYYU UEPjj ^U$EPj*j yUEUMJ1U$UUUUU UEPjj U$} uEEUUE UEPjJjE y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM VBB5BhAjKj ^Uu hT$u% UV& T$@, T$@% T$@ E 3uVu ^U$EPuvYYEPj j U$EPjj y}tUEEU$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuhYƋU rU MJwU uRYY^U$U UEPuYYEPj!jI U$EPjj1 É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉1ۇxtPXPNo other keymappattern not found/?No previous pattern? / Could not open fileFile existsFilename: Write failedNo current fileFilename: No (Nth) previous fileNo (Nth) next fileWrite input to a filewrfVisit a filevisGo to the first line of the inputtopGo to marktomExecute a shell escapeshlRepeat last commandrepRedraw screenredExit from yapquipipe input into shell commandpipRepeat last search in other directionnsrRepeat the last searchnseSet a mark on the current pagemarGive description of all commandshlpScroll forwards, set scrollsizefssSkip screens forwardsfspSkip lines forwardsfslSearch forwards for patternfseScroll forwardsfsDisplay next page, set pagesizefpsDisplay next pagefpScroll one line down, or go to lineflVisit next fileffExchange current page with markexgSwitch to other keymapchmScroll backwards, set scrollsizebssSkip screens backwardsbspSkip lines backwardsbslSearch backwards for patternbseScroll backwardsbsDisplay previous page, set pagesizebpsdisplay previous pagebpGo to last line of the inputbotScroll one line up, or go to lineblVisit previous filebfNo previous command ~ , line P!PPP-csh/bin/shCannot forkCannot create pipe Write failedwrite failedNo coreCould not read input fileread errorread error Summary of yap commands: for helpType hlp: Other key sequence is prefix: Prefix of other key sequence: Nonexistent function: Key sequence too long: Syntax error: Syntax errorIllegal commandYAPKEYS/bin/catcat [-c] [-u] [-n] [-q] [-number] [+command] [file ... ] Usage: Couldn't open temporary file/usr/tmp/yap-XXXXXX/usr/tmp/yap_XXXXXXCouldn't open terminal /dev/tty  : illegal option YAP,c,n,q,u,Error in pattern: could not open0standard-input)%Next: Bottom, Previous: Top ( -, [Type anything to continue] lltahodbxnamlicomrmhmemdmbucugueussgsesoalsrcmteticlceupbcpchcNo termcap entrydumbTERM  out of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be empty+J I$DH(I)I*I+I.SH?I[hH\I^5H|Iinternal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parameter#P'PMMMmNNOO?PN?POO#P#P#P#P#P#P#P#P#PNNNNNNNNN#POOOOOOOOOcorrupted pointersmemory corruptionPvPPPPPPinternal foulupr/etc/termcapTERM/etc/termcapTERMCAPT 0tT1tT2tT3tTEDTbdTflTnLTrTTt\TT\TT4T=V%7V+IU2|UdUi1Ur=UOOPSs\a`\r;\wJ\\+\b\g_g_g_dbddbddbdododod/ggggB$Header: assert.c,v 7.1 88/04/29 11:43:49 ceriel Exp $$Header: commands.c,v 1.1 91/12/17 13:05:45 philip Exp $;TjTplsTPs,(RgRYtpPL<83;;:Pupl:LH#$ I|q+|lh4TPk84d($$Header: display.c,v 7.3 90/03/05 16:57:39 ceriel Exp $$Header: getcomm.c,v 1.1 91/12/17 13:05:58 philip Exp $$Header: getline.c,v 7.7 89/12/15 11:43:43 ceriel Exp $$Header: help.c,v 7.2 88/04/29 11:45:22 ceriel Exp $$Header: keys.c,v 7.2 89/12/07 16:47:50 ceriel Exp $bf=P:bl=k:bl=^K:bl=^[[A:bot=l:bot=$:bot=^[[Y:bp=-:bp=^[[V:bs=^B:bse=?:bsl=S:bsp=F:chm=X:exg=x:ff=N:fl=^J:fl=^M:fl=j:fl=^[[B:fp= :fp=^[[U:fs=^D:fse=/:fsl=s:fsp=f:hlp=h:nse=n:nsr=r:red=^L:rep=.:bps=Z:bss=b:fps=z:fss=d:shl=!:tom=':top=\^:top=^[[H:vis=e:wrf=w:qui=q:qui=Q:mar=m:pip=|$Header: machine.c,v 7.1 87/01/09 11:09:58 ceriel Exp $$Header: main.c,v 1.2 92/04/13 13:16:02 philip Exp $$Header: options.c,v 7.0 86/12/05 09:37:45 ceriel Exp $$Header: output.c,v 7.1 87/04/07 14:05:46 ceriel Exp $$Header: pattern.c,v 7.2 88/04/29 11:46:44 ceriel Exp $$Header: process.c,v 1.1 91/12/17 13:06:57 philip Exp $$Header: prompt.c,v 7.3 89/12/07 16:47:58 ceriel Exp $$Header: term.c,v 1.2 92/04/13 13:16:08 philip Exp $SSSSJ ((((( AAAAAABBBBBB B  P N1$T$L su;SSSSu QRP< PU8VWu }uEEVUEU9UgU:-uDUUU:t?EEw݋EEUEEE덋EU)ЙE}t }t }t-}tv;YvYh Y}tuvv y^5YEh Yv Yh Yvx Yhm Yud YhY Yj~YvYhtY}tP[YhPYvGYh<YhBYDžyjYPPPPHDžx?PPPPqDžyhtYjY뗃}t El8hdvYYE=u E`}u E\EX}tLHPu}tPFPvDžyh YjYhY1_^UVhTYƅyjYPPPPƅP YPPjd hLPYYu h<Yh0vYh,PYYu$PLYh AYP4Yh)Y2jY^Uh\YjYUuJYPuj UVW}jWsYYpx@jhpE =t$hPp< lyN5Yhh/YW(YhYhYhYj+YjhV tlujhV u V~%hYWYhYjYp@YVtV xhW|P ƅtPhM@0YYyN5Yhh"YWYhYhYhYjY_^UV5 Nx D^U=tuhYUVux95H <^UVjuZYYƅy'u nYhcYuYjhV jDh V =Dt+u YhYu4YVYAVY 0 B=u0 B=h$u^UVWj5YYDžyh@u^YYhh4 WV Eh0u+YYU}u'uAYh6Y5*Y%WY4 >t)tF1_^UVh5YYƅyhduYY?$-8 Ph8 V EhPugYY VDY1^U= 4 rU25 uYY - =_s  :u= 4 s 5 u uYY - =_s  :u= 4 s 5 u)YY - =_s  :u= 4 s 5 uYY - =_s  :u= 4 s 1UVWuYEu YEuYuYƋ$UU8r u5$2YYU$$$ u 5$ YYU$$$ u5$YY$$$ u5$YY$$$ 1_^Uu%Yu Y5Yhx-YUVu>tF+URuj ^UVW5YNj5 hd Yh| Y}t.U:t&uYPuVh jhVX WYPWVF jh|V6 _^+oUVWu} Mr6 u.uAfA(_^]UVWE_^]UVWMwE_^]U$UUU U5EPjMj? 6EPjMj- $UUVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$UUU UUUEPjj+ yEU$uzYEu iYEUUUUU UEPjj U(VuU @t*u"YEU UV֋RUUUEPuYYU UEPjjo ^U$UUUUU UEPjjC U$UUUUU UEPjj UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVu YƋU rU MJwU uRYY^Ë+C;Cw Ë[ uӅu P-KI|;u[u P_1ۇ tPXPrmountmount: /etc/mtab has grown too large rwroswap021mountswapmount: /etc/mtab has grown too large mount mounted on writeonly is read- : on mount: Can't mount is swapspace mounted on onlywriterw is read- is swapspace swapmountUsage: mount [-r] special name mount -s special : mount: is not swapspace mount: : mount: unknown error cannot read super block on cannot open /etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 F I M S @SSSS4 8 ((((( AAAAAABBBBBB Unknown errorx\H4$|l\L8$p\@,,,,,,,,,,,hL8(CBL d |    @ M1$T$Ll @ su;SSSSuH H QRPL )PUhph JYYjYU@VWEhpYDžuL }DU R:-u9U Rzfu-U z?uM}}E U zME }t }t^}bp U jEPr EU:t&=p "t UU9Ut U rhLh Y jYU RUhHuYYuE@EX  sGu{YPuv~ u&}tuh,h  jfYu 뱋uiuhh  j6YJ}yQvhh  jY2},vhh i jY FhWYYu E9jWYYEy(5p %YPWhh jY>t(fU܋UUEPhM@u& EhvYYEPhMu E]ȃUuuu4$ tUP@tUP€t ]MPS~ EƋ ]PSWh/0URuPYY}yO=p uvWhh jQY5p YPWhh j)Yj!Y_^UV5d Nx T ^U=h th uYUVWH Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVux95, x ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+p "}t}y UU_^UUUuuu  UU Uh uu C[* J L$ U$UUEPjjG U$UUU UUUEPj6j U(VuU @t*uzYEU UV֋RUUUEPuYYU UEPjj ^UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U c}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U@EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UpJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE Po E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }h ~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvg =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVD U9D wUD 9D vp 16VYt1'D rF5D &Y5D ^UVW}u1E}UUsp 1=@ u8jY=u1V!փ5@ 5D FE5H OVU}9}r69v2W9UvUW~>}t EH u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=H <9}r79}u+UOJ}t EH URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15H t 9ur6E0tU UH tU9ru NJEtU9Wu RWE_^UUas U EUh( h YYjbYU$UUEPjj y U4 1UVW54 4 }׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډp F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u U$UUUUU UEPjj' UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^USE] ![]USE] ![]USE] ![]UVW}u MCUVWqE_^]UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ8 tPXPblocksizeblksizedensityeraseretensionstatusrewofflofflinerewindeombsrbsffsrfsfweofeofEOFERROKSENSE RESERVEDMISCOMPAREVOLUME OVERFLOWEQUALABORTED COMMANDCOPY ABORTEDVENDOR UNIQUE ERRORBLANK CHECKDATA PROTECTUNIT ATTENTIONILLEGAL REQUESTHARDWARE ERRORMEDIUM ERRORNOT READYRECOVERED ERRORNO SENSE INFOUsage: mt [-f device] command [count] a /mt: %s: %s mt: %s: command '%s' not supported %ld variable ILI + EOM + EOF + ?SCSI tape drive %s: drive status = 0x%02x (%s), sense key = 0x%02x (%s%s%s%s) file no = %ld, block no = %ld, residual = %ld, block size = statusmt: %s: %s -mt %s: count must be greater than zero mt %s: count may not be negative mt: unknown command '%s' mt: %s: ambiguous rewindrewmt: %s: count too large, overflow TAPEunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 U@ X b| d i o p u x  x #} +s -n 0 y La hK lV  E G Xk bk c d e f g i n ok pk rY s% uk xk (null)cannot print floating point P /dev/nrst4phd`\X TLD<4(   |xt`PD4$SSSSBt ((((( AAAAAABBBBBB Unknown error|`L8(p`P<(t`D0          lP<,C   4 H@1$T$L$ su;SSSSu QRP PbU5( &YPuhh\ UuYj#YUu$ YEu hYEUVW}EPYEPYFFVYEUJiڀQ9]s 1҉E *UJi€Q+E؋] U#E 9}=|u 5YPh,h\  =|WYPhh\  _^UVu =u RY E=~/J :/tAj/5 YZ>/u=tJ :/tW9u*R5 YY u h<4YAP5 YZFu ^UUj5 YZUVWUU5 YEu5 Y1uYDžchDGPYYth@GPYYtjYƍGPYPpYFGPvYYE0uu#YEE_^UVW}?vpYViY_^UV1U:tEi!^UVWh u YZ<7tvu 0YY~}t=jYu >YPYFu vYY7vYVY _^UVh u-YZ4t%vuYYE 1ۃ}É61^U,VW=|5 h|h\  ƅ}uV:.uE vEPYY=tE5 EYt5=~5 hlh\ + 5 jYYe=t7vYt*=B5 h\h\  %EP5 YYy5 YU@WjYY9}| ==};5 Yy+=( '=( 5 RY=|5 hPh\  _9}| =tQ=}'5 DYy=( t/5 Y!=~5 hHh\  uYVY_^Uhh\ YYjYUVW9}U :-Bu WZY4F>-u ~>du!~tFP=Y뤀>iu-F>u9}udBu WZY4VjFYYr>fu~uEQj EPV5 E>t(U:u }ti]QQؙ9EVhh\ k jY}uhhu 9}~PU :uhh\ YYjYU 4EPIYY5j2YYu!YGjPY_^UVuj jV3 ^UuIYPwYUV5Nx ^U=tuYUVW uBYƹ<+F؉F+ډV YV YDžt"<1FF1V Y_^UV U9 wU 9 v( 16VYt1' rF5 &Y5 ^UVW}u1E}UUs( 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EP &>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h8VW ƅu1WW YZ׀>/u5Fuh8VEP ƅu19ut EEG>,t1jFhLVW ƅu1MWW0 YZ׀>/u0FuhLVEP ƅu1EEGu>t1_^UVWuE}>:tVh| YY_(,8UH LU\ Vo Y=Vh| 8 YYVh wYYƅ>-uF>+uFjVEP ƅUUj h 5( 1$ Vh YYƅpj h 5,  >t>,tjVEP ƅt5U >t'>,u"FVe Y=xwVh YYƅu_^Uh YPLY(0,4UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE8LE=$u$V =$u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t  F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+( "}t}y UU_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ( F_^UUUuuu +USE] ![]USE] ![]USE] ![]UVW}u MkUVWE_^]UVWME_^]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWl hVYYUR<`EMxGFFUR<|EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYYl _^UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wG!#$%&'()*+EWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U P}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEhuVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEАUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }3~y UVu CV€tu ,fNV~D u>5H DYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv- =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh\ YYjbYUVuYƋU rU MJwU uRYY^U$UUEPjjS U(VuEEV֋RUV֋RU E [UUU UEPj7j ^U$UUU UEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjj UVWuEu41}%:-:paUI=1Ph`h  jY[=hh YY>u hXY>t 6Y1^UVWUU} =tJ W 9} UJ W 9~ oUO9J} ZUO9J~HjWu 6jWu ƅu"UO9J}UO9J~=tމ_^UVWju YYƃuuhh z RVPYt!uhh U V Y&=u Vs Y9t!uhh  VD Y9t!uhh  V Y5WYDžu!uhh  V Y5WV 9t%uhth z WYV YG=uh[j5W\WuYYWYV] Y_^Uj0hu^ =0t^=u =tE jR ~1ZPu 1UVWu E=uuhlYYU9u*=tV =t F V !׃uEa%uEtuEduEbEuV u EEjVEP =tE=t!E]SPvuh\[E]SPvhL@=tE]SPvuh<wE]SPvh,\_^UV5Nx ^U=tu(YUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U} t#UU JUUuRu UVW}U9U ^UU UU +U1EE9us*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U t7}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEr uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEдUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PwE6U U RU U RUEEE$ E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%<8t48YtEG֋E ~tV€uFu1V€cE~tVuډUjuvY =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<8t8Bt 48aYF^UVW}Wu ux ƅ~9})׉U U 1_^UVWu }r~y UVu CV€tu ,fNV~u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvY =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UUas U EUhh "YYjYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$uq U$UUUUU UEPjj7 UW}0ʀuA)_]UVWE_^]U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPda.outillegal flag: -%c %s: can't read symbol table %s: can't allocate symbol table %s: symbol table too large to read %s: symbol table too large to allocate %s: no executable file can't open %s %08lx %c %s %s:%08lx %c %s %08ld %c %s %s:%08ld %c %s %s:  1@f35XsbXdjijoapsujxsc T#Y+O-J0^UL=h'l2[EGXGbGcdefginoGpGr5suGxG(null)cannot print floating point SSSSB   jD4x1$T$LlDsu;SSSSu  QRP#0Pf6U5p :YPuhhQUuY=Dr jMMY5j6YUu u8YYEu hYEUu8YU Vu<UƉUƹUuuuh$hS^U5HYUUM UM JUVuM M NMNMN^UU MJMEUVuMNMNMNME^Uu uhR UUJs UJPuhYYUVuJs Jk`,sk VhsYY^U$VWuU UhPVu?=u #֍V9s VYf## # فfV}Yf## # فfPh<PYY}tBPYPh4lPYYPYPh,QPYY+U1V9s VY## ʋ # ы# ʉVYf## # فf9s wh$jOYYPbYPh OOYYPqYPh4OYYs  ǀ?V9s VYP#=YPhNYYV9s VqY## ʋ # ы# Rh dNYY!hPVu<=u PhNYY9w FShMYYB9s FPPhM aV9s sV(Yf## # QhNMYYGc?*!9vGG +U_^UVWu } (huhL Ft|tPhLYYVUs kE uhhYYPhpLYYFt hdLYFt h`nLYFt h\]LYFt hXLLYF@t hT;LYhj JYYfVf## # ىMfVf## # ىMfVf## # ىMfV f## # ىMV UE}U|zhLuhPAK UPhD)KYY1}PuuVEhj IYY}t&UUUUT׋xEf_^UDVW1҉UUEĀ3U UU} s1}UJMUfRf## # ىMЋUfRf## # ىMԋUfRf## # ىM؋UfR f## # ىM܋u E}z9uqU|[hPVuu8E=2փ}V9UFPYEVY## ʋ # ы# ʉU9Uv1U+UЉẼ}}}VUhPuuu&7E=VEEhPuuu6E=%EE9E uY## ʋ # ы# ʉU9UvUE}tKỦ# # ً# ʋ # QV3YYU9UsỦUEVV3Yf## # كZ֋UTЉ׋E|}u}u }u }tE1_^UVuu h)Yv>tBd6~tF`V+lډl^U VW5`UH+L9V wVpYP{YXVVhPF$PRFP4ǃt.uPZ9YYuD>$PY9E u VY uo1_^UVWuV>tBdV~tF`Vl 9l=ddJdfJdJtd H+ L9J w5dUYP`Y닋d ` ` dJd`dRd`B;=Dr@15`tG6jFYP5luPWhD_^U`EUBuYU0VW=\h EPGYYhdEP`GYYh`EPTAYYDžu.=pt =pu =D/EPY =DrEPhPDYYWjjhC5dSH+L9V 6=Dr2H+VFPRFPh(CvFPj V# # ً# ʋ # QEPYYNM#Vf## # فQEPYYfVf## # فQEPIYYWj jEPOBWvjFP=BW uvW uW;Y=uEPYEPDYe=Drh EPhWB h EP.DYYy25p(YPh EPhh@EP'DY_^UVW=\hh >YYDžu&=pu =DRh :YB=Drh hAYYWjjEP@W jEPhC Wj jEPl@Ws jEPYf## # ىMQjYYƍEPY## ʋ # ы# ʉVMNFt hUVEP8Yf## # فfNWvjFPd?Wu t V0YfjuFPY FF =Dr2H+VFPRFPh?uFPj VYpW tQW t5pO&YlPh hth>=dt5dkYPvYW8Y_^UVWjj3YYƋUVU V UVp?tN 9J ?~7>tr_^UVuu vVYYt"V >tNJVY1^UVWp7t9U9Vu-~ t'>tzvjv7 VYʼn_^UVWjuAYYE9usN>.u9usN>.uU)U9}u1AO?.uuVW1 uU:.ujhW1 u_^UVtAf tfUE4tfUffU fVUVfUf## # ف^UVfUf## # فfMU t)с~1EE4tVu1&U ff UfNf VEfF^U EPu>YYuE1UHVW3Uu Uh YEh YE9Uu9Uu 9UUU=DrSff## # Q5W*YPh hPh,;PL=\+jG%Yy%ƅVj2EPs> U# # ً# ʋ # щMh6g.YYu UPh 6L.YYu ULh61.YYu U h6.YY29Uu 9=щ M -$=jh Z<YYEy=ph Yh$Pu0< =$u9u҅y h Yu;Y$PPjP~"tgjEP< 9Uu 9t=sщ M _^UVW=\t1RƅƅfDžDžDfDžfDžHDžLPHPhVu(ǃu1ֺ#U RV/YYhVYYj hu, uE0Dž4(Dž@00Uj!YE0u_+YYU)ESHSRV0'ǃu1֍UN9v1hVaYYhVQYY5PVVYYhV0YYURj2Vu: DEj.0:YYEUMR<UR4P:YYt(j.P8:YYuP:YYPu'*YY U)PHPRVP&ǃu1֍UN 9v1hV'YYhVYY5PVYYU)ESHSRV0&ǃu1`!f## # فQFPYYD} EzE:%jURMI ][E@P$QRKQXShlP6Pu(YYU)PHPRVP%ǃu1X֍UN 9v1Ah VYYhVYY5PVYYU)ESHSRV0$ǃu1!f## # فQFPYYD LE K2EuDu1e#Df## # فf)ыEQPu6 _^=?@ABCDEFGHIJKLMNOPQRSTUVUVW} uhu&YYt1ƅƅfDžfDžfDž#f## # فfPDžTPPPhVu"ǃu16ֺ#U RVwYYhVgYYU)PPPRVu"ǃu1hV#YYhVYYjVYYff## # Q5 YPh hFP&3FP5YǺ!f## # فQFP_YYJEU9UU)PPPRVhN!ǃu1֍UN9v1hVYYhVYYjVYYhVYYUjPV3 EUB15U;)ыEQPu3 _^U VWUJ{UJh} UU hPWRuE=5}WYfEW Y=EPPYYƅtUVUVUVY`UEEju u0 U RjYYƋUUVHVF#UfVU Vu uFPk2 VV VqY=Dr hv/Y=u%,HjRh$ _^U} u1U VWuE U hPWRVjE=t6}׉UO9s EWlYEW_YEUVU}u3VVVʄVV VVʁV}u'u Vu荅Pt E Ud}u荅PYYYEPURPV0 VVU H+JQuV }t:U H9J JUJhUJAUfJuY}u'u Vu荅Prt E U=tPYt0VVVʄVV VVʃV:}u0VVVʀVV VVʀV1,#UfVVV UVUE _^UVW=h55dtFtH+L9V wvuhVVVVhPF$PRFPE=V$URYEDDDžHPPDPhWPvE=d}׺#URWYYhWYYD)щMjRhY fDƅFƅGfDžHfDžJfDžLfDžN8ff>fDž@#UfB=Drcff## # ًQ4YPh* u썅DPj{ UUR4P5, y 5|Y_^UVW} t h Yhh5h=ƉUuV=pu } u19=pu 5|Y=Dr?5paYP'Phx) =DrVPh`) jhh) s =DrZff## # Q5xYPhT() uhj 59YdEPEPEPRLu  }uUi=$~`19=vV9uD==Dr 4YPh@e(YY$h6/mYG뢃=th!0LYuh@YYw}u LfUfUfUf=DfUf## # QuYPh,' t EPhLYYfff#UfUփ=D6ff## # Q5'YPh & uhj  5RQ fff=u%HjRh!0 =DrOff## # ًQ49YPh% Vh5' y 5|fY_^UUjRj fƅƅfDžfDžfDžfDž ƅ h PYYhPYY=Dr)uYYPh %YYjPj UfffDžfDžj!P5& y 5|HYU} u1=DrPhy$YY=$y$$J$yHj=Lu =t,HPh6/ h.'YH154+YHjRh6/O U} u1G=DrPh#YY=t=$$h6/YU,X-T!DD E9Uh@hw!YYjYUDVWEjj@jh#jhuYYEuhh%!YYjYU#Jf #Jf 9u/U :- Bu VZYÙ:-zDU-0= wj EPu D눋Ù:u9uuBu VZYUjEPu %f## # فf U9Ut:twUȉU\ELEEl79ut*}t-DjD#YH 1EEP#YEjEPj " Ew0jEPj" jEPj" jEPj " jEPj " jEPj" hxYxu xlh`qY|u |Tj5| "YYy 5|YE 3ffUEPh@n@5! =tEPhAn5! =u 5|Yj!YHuY=\u7hPh YYEԅt^!PhLu uYjhh) jjh. jjh6/ =X=pu h Yp H9J %j5pYY=puhYʋ=ptjWYYu?pz =DrPhYYpz t4R UEUU=Dr6uYPhqYYE=Drhj YYhQYujh y=pt=p t hYj YH=TTEPhAn5 =u 5|gYuY$h6/YR=Drj{YPhYY1_^U=<t<jYUhuYYUV58Nx #^U=<t<uYUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UV$U9$wU$9$vp 16VHYt1'$rF5$&Y5$^UVW}u1E}UUsp 1= u8jY=u1V!փ5 5$FE5(OVU}9}r69v2W9UvUW~>}t E(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=(<9}r79}u+UOJ}t E(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15(t 9ur6E0tU U(tU9ru NJEtU9Wu RWE_^U}x}~uP<YYUVux950$^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+p"}t}y UU_^U(VWUcSct1UUE4UlUEU,UE1tTT9{UF}g}u1FSXE؋U 9Uu }tE0}tU؋E2}4utEtE@uuGb1_^UU=,t5,Y,LU VW=,u7=Lu1h5LYY,u L,,:x,X@ 5,YE=t} t sF봃}u%5,Y,LD8= w>tF>t/>#t*t"7= v>tF>tF뺁unh57YYuX5,NY,L56Y=~5h0YYL0]Qh5YY7XX_^UVW5t$YODžD7urYYtw>t6uZYYt} tu w >YYu=t$u_^UVuEPVYYtEp^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E(} tF=# # ً# ʋ # ыE _^UVuFPFPFPPhh{^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U '}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!%+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U0:$>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWEEPTYNjE E PBY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^U$ 9Ut*UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UUUBUVu {95tF9Et5EFEFEFUVUVp395tF9EtV pFHZ!^Uuuju ujOUuuju uj2Ujuuu ujUjYU$VWu95tU t>uF1P}j8YE]9p jvYEENIEPYEEPEPj E+U9}v}W0Yv FpV FvvP FpV RFvvP FpV 1F^vPS FpV F`}t!jYjEPj? uY~u~ up1_^UUuUYUVWuU VVu YYDžt~~yVډpF_^U$UUEPjj U$EPjj U$UUU UUUEPj6j_ U$UUU UEPj%j9 U$UUUUU UEPjj U$UUU UUUEVEPjGj U} vpM E 1U} vpM ҋE!1UE1UE1U} vpM Et1U$EPj j y}tUEEU$UUUUU UEPjj UVW11}U9u F߃| jugYtUr YtURtUzt rY}tt}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvu =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv1 >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E |+U :t! EE E U uuuYYEy@Ut8hu)YYE~" tuYuugYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu UVu JxUʋFF Vu>YY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UVWu}E} LU9U@U UJxFFSXVTYE=tGE MuE봋E_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^UU Uhuu UVWu} E<RO}t}@t}t ~tVt vyYft }uEu(}t"}tu4YDžu EN~U VVVu F UV E_^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjdYYEUuu hu 6*USE] ![]USE] ![]USE] ![]UVWu} Mr6 u.uAfA(_^]UVW}u MRUW}0))ϊE tu1_]XG_]2UVWME_^]RUUas U EU=4uh h 9YY4 54YU t$U=4t54vY4t$UVW=4u!h4 h8 YY4u1D54hh  Eu1U:#th0 u YYƅtU$#h, uYYEtEU: t: uEh( uYYƅjFuY%f## # ى ,#50#4#(#h$ VWYYƅtFt8>t3> t> uF#s7h VYYƅtF$#_^UVW}Utu >t]9uFG1_^U$UUEPjjS U$UUEPjj3 U$U UEPuYYEPjj U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu|YYU UEPjjk ^U$EPjjQ U$uYEu uYEUUU UEPj&j UHVuUVUVUV UVUЋU UEPY^UVuEPOYjEPj V##5#h#jKj ^U$uYEUUU UEPjjH U$EPu* YYEPj j UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U H }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE` uVuu ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U  JxUʋFF Vu.YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЈ UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPpYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP.YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVW}Wu up ƅ~9})׉U U 1_^UVWu }<RO~y UVu CV€tu ,fNV~u>5Yt.hPYFu NLNHF 9h"YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvu =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuj jV ^Uh hVYYjYUVu@YƋU rU MJwU uRYY^U$EPufYY1ۅÉU$} uEEUUE UEPjJjq y}tUEEUu hT$u UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ<tPXPnonamed: %s: %s malloc()%02u:%02u:%02us*hdddssdicc*c*dddddlllllddddic*C_%uHSCHAOSCSINT_%uc~> %u "%.*s" %02X %s %ld %s %-5s %s %5lu %-5s %8s%-25s %s %*s PR RA RD TC AAERR_%lu %squeryreplyDNS %s:%*sAssertion "qp != nil" failed, file "nonamed.c", line 440 iesy%u cached repl%s, %u bytes, sbrk(0) = %u nonamed: mv %s %s: %s mv %s %s Usage = %u, Age = %ld, Flags = %02X: Writing %s: w.newCorruptnonamed: %s: %s Usage = %u, Age = %ld, Flags = %02X: Reading %s: r.in-addr.arpa..in-addr.arpa.%nameserver%nameserver%memory%memory%stale%stale%ttl%ttl%s: I am nonamed %s at %s:%u Y@ %d.%d.%d.%d.in-addr.arpalocalhostlocalhost.localhost.%nameservernonamed %s at %s:%uversion.bindversion.bindAnswer cached Refresh to %s:%u: To named %s:%u %s:%u UDP To client %s:%u Current named = %s %s:%u UDP %s: UDP read, %d bytes %s: UDP read: %s Assertion "!expired" failed, file "nonamed.c", line 1318 PROBE %s %s: Find named %s: Expect named 00|0000000000000|0Usage: nonamed [-qs] [-d[level]] [-p port] f2d1p1qZ2sK2sbrk(0) = %u fwait() (expires %s) %s: I/O waitAssertion "queue != nil" failed, file "nonamed.c", line 2106 Assertion "queue != nil" failed, file "nonamed.c", line 2101 %u w/dev/udpUDP_DEVICE/dev/tcpTCP_DEVICEnonamed: "domain": unknown service domainunknown error/etc/hostsincluderAAUAnAA%d.%d.%d.%dQCBCTELE[EFEFHHjHHJJ'JHJiJ3Qa QrPw QvQ+WQbMQNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/services\ M\@\]X]bt]d]i]o}]p]u]x]^ p^#u^+k^-f^0z^qaLY_hC_lN_w_E aG`Xc`bc`c`d`e af ag`i`n_oc`pc`rQas`uc`xc`(null)cannot print floating point #2.5/etc/hosts/usr/run/nonamed.pid/usr/adm/nonamed.cache/usr/adm/dhcp.cacheNND|xtplh`\XTPHD@<84ANSMDMFCNAMESOAMBMGMRNULLWKSPTRHINFOMINFOMXTXTAXFRMAILBMAILAANYQD:AN:NS:AR:NOERRORFORMERRSERVFAILNXDOMAINNOTIMPREFUSED@,/etc/hosts@PSSSSBtx$ ((((( AAAAAABBBBBB Unknown error x d T H $  | h T @ ,  p \ H ,   |hXD0CpastepatchKcommandMpcpingplaywavepostmortprKgetoptsprepKreadKtestprintrootprotopspwdrarpdrcpreadclockreadfsrebootKtruerecwaverefremsyncYrestoreKumaskrloginKwaitrshrzscreendumpsdumpsetup.anonftpkclearsharsizeslipspellsplitsrccrcstringsstripsusumsvclogswapfssyncsynctreesztailtalktalkdtcpdteetelnettermtermcaptgettimetouchtrprintf egrep  p$D1$T$Lpsu;SSSSu QRP PRUVWu 1f}MuUIM}:-iz_E>uh(j1YY6YM0@f h$jYYBl{Gr ~h jYYu uW-YY uW+YYjGYhjYY1_^UTVWDž}E :-uztzdwE nME :-uADŽEE h,0 YYAuE 0jYYE ZDŽ.fDž5ƅ1tуtDžtXhPs t9P Y=uhPA YYDž먃tYDŽBu@BuXthP YYƅJx hj hYY>t1@F@ƄF>5@fthP YYƅBt(>uFJƄFJ>u5hP YYhYG_^UVW}E :-uztzdE E :-u%E h00 YYƅuE 0jYY=JxFFSXVvYE=u>Jx hj YYhY+JxFFSXVYE=} uE?t3JxGGhP?YY?u8=0JxUhuYYUUPJxUhuYYE= t-Jx hj YYhYME _^UVW}=?Q?\tGFG1F8 F2 F,F& F  F\FF 4G_^UmRRhh^5hh Du 5hh'5hh tEjYUV5Nx ^U=tuYUVW11}U9 u  F߃| jugYtUrb YtURtUzt r Y}t}t}t u Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvV =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFpFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~u>5HYt.htYFu NLNHF 9hFYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv1 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11< tN|1DFρECEE0-EMP1E E  wU :t! EE E ,NU uuuYYEy@Ut8huAYYE~" tuYuuYYE}y1]jiYEu uY1A!uEUMJUzUBU E_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^BUVU9wU9v\ 16VYt1'rF5&Y5^UVW}u1E}UUs\ 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U`1UVW5``}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ\F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U D }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE\uVuukƀ}Xu9utUP#YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuNYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЄUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP2YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPNYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MUUas U EUhhYYjbYUVu(YƋU rU MJwU uRYY^U$UUU UUUEPj6js UVW}u M)9r/r uu _abfE_^]t|UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇhtPXPdsrr0\bfnrt~ :W%s : too many files %s : %s : cannot open %s : no delimiters %s : Usage: %s [-s] [-d ] file1 file2 ... arw*+ b ]@Xbdiopux #+{-v0LihSl^EGXsbscdefginospsras-usxs(null)cannot print floating point  SSSSB$  q-1$T$LTsu;SSSSu QRP" PFU$VW11Eh4)h>^YYE}}U,'EhP`Yhd`Yhx_Yh_Yh_YU"U #]jAY50'Y>=Du5,'P?YD=u hPY=u g3hx Y=u 5,'(6Y114FEZ1E9} U=uYE}=x-u"}ejjjhT>M1=u:YEu2-ujjjh8>1==tOs-ujjjh>1=jjjh:>j=tP=tPh:>=,#nZjjjh|>=,#yt E1=,ujjjh`==u}uEU9U>=t5(PY(5/E=t+G=juVhD=}u+G=juVh(<qu{ Y=[juVh <}tjjuh<=t+j=uP5hb<jjjhO<=4t9=0t0#"##jjjh <eu hp0AY=u 6>=uG5DhP7YYy5$hPK[YY5$5D6[YY5,NY,}=4'k5Dh4'[YYj/h4'[YYE܅uE4'u[Y= vU܀z .u U܋M܊R Q UB hlh4'y[YY=th4'VWh8:h4'VWh:h4'hx6YYy j<Y'=t 5MYux Y_^U l0$(8=,'t=4u5,'BY,'=Dt5DBYD=t5BY=8|jjjh9UV4'"###=" "#="#2hHVYYY>-u ~=8ujjjh,29V8Y8A 8,'O#rf8YH "#)#r@8YL "#F>u "##2VWYjjVhw8F>u "##29ujjjh,8Vhh'V Vhh4(V Vhh(V -F>=uFV<Y#r6YD "#F>=uFV<Y#rh4'WYY "#eYMA;:FP<Y)#jj2h6Ff "#(^UVWP(=M(E$)+UBU^(+(J‰U}u9}|JU9=$|ujW t19u|@E19u|C]}tCuVW t2tjV5hp55h}tLuRW8 t7tjR5hLg5ډ)}u }u1F9_^U VW0''E'E&EHE&EHE=u|E=utlEhX5,~PYY19R3U9U}uhL5,RP $U9Uuuuh@5,,Puuuh05, PU9U}uh$5,O U9Uuuuh5,Ouuuh5,OsVL&YPh5,O VV/&YPV%YPh5,YO.jjjh{38V%YcF_^UVW(%E@EU+%EMWE%Y==tW4%Y= uG9uV%Y=-tUJRY}tU}u5(h4(NYYE}u5(h|NYYE5(V%YP`NYY(Fn9}W$Y=+nUJRY}t@}u5(h NYYE}u5(h'MYYE5(Wn$YPMYYGW$YPV#YZ9tLj%Py%Ph1jW#YPV#YPh1jwYW#Y=!UJR Y}t5(h4((MYYEV[#Y=!u$}t5(V#YPLYY(F˃}t5(hLYYEW#Y=!u5(WG#YPLYYG׃}5(h(LYYEW"Y= t h5YFGs9}W"Y=+UJRY}t@}u5(h'LYYE}u5(hKYYE9}|)W"Y=+u5(W]"YPKYYG҃}t}t5(h(KYY_^UhPuIYY(ujjuh4/UhpuIYY,ujjuhTy/UVW}5(9~jjjht)/9} FVdY5(_^Utj5(5$h.=$t 5$Y5(5BY(UVE juc(YYơ((:x(X@5(P5FYY]9tF^U VWUB, +EEU U}9u|=t6V5 YPV Y1ۃ} PSW'YYPQ u:1BVYPV] Y1ۃ} PSW'YYPN t1 FG{_^UVWu }}9_9u1i}t9t > tFM9t? tG? t> u19uAGF9t1 Mo_^UhdLY=u hPLY=u hxLYhLYhLYu2YU UVut>thVLYYphhyFYYujjhh3,h\hh,#A t5h,#GYY5>?YhV FYYujjVh+h #rEKYY#jj YY^U= uR1Y =uR1Y=u51YU%= t=t =u h$0YR5 n2YY R5S2YY55;2YY= t=t =u&=0ujjjh*4U= t19 |#=tjjjh *14=tjjjh )uA= t=t(jjjh)jjjh)1=[j=u,%=u<=uhXP= uxPhC)=t4=t+j=uP5h)5,5(YY=,'=t.jjjh(5@L(Y,'jjjh(=,# t;=@t 5@'1Yh,#(Y@jjh,#+ ,'=,'Xjjjh(=,#y8=tjjjh(jj5@Q+ ,'ULVWEEEEEEEEEEEE1=,'E<j5 5C $JUUUUUU5CYEE5hh,#< uE}xU(U,EU(,E,#> t > t>Xu > uEܙUEFщ-0= r?,uG-0= s?dt ?ct?au1E}y}tUUUU܉}u&jhP VF uFP%YEjhH VF uFPb%YEjh@ VF uFP<%YErjh8 VcF Z9tGW%Yǀ?t9uG:u5-Y=t =u>}x8h4 VEYYu'U܉U(U,Ejh( VE 1ۅÉ]=t =w}mjh VgE uYFP)Yu <> tFU܉U(J,~*uEr=t =}jh VD tjh VD U(J,U܉E}}t5<5u& Eă}t5<5u& E}t5<5u& E}tA}t;uDYPuCYZ9su"Y,'Pu"Y,'@}tu"Y,'*}tu"Y,'}tum"Y,'=@t5@n+Y@=,'t5,'4"Y@}tj5u% @}tj5u% E}tj5u% E}t>}t8uBYPuBYZ9su!Y@:u!Y@*}tu|!Y@}tuf!Y@}t um*Y}t u^*Y}t uO*Y}t u@*Y}t u1*Y}t u"*YE_^UU U $UVu95 ~ h u&Y=95 j5 5T= jjjh jlmnopqrstuvwxyz{|}~5=Y9}B5hh,#6 Eu hx %Yjjh,#ht jjjhX jV5< U J^U u-t}t Ejj5h=t0t}t EMjh,#5hERh,#YY ,#>t-0= rF> jhV> u FPV=YYV"Y-0= sF>,u5>t-0= rF>* VK"Y+@)=t 9qb=-#-8u/J1= uCB9=u&BBUEUjt2}t E0jR5h|4505980PhD=5R8YEЋŰRh,# YY =,#>t-0= rF>` V Y -0= sF>,u5>t-0= rF> V> Y+ @)= t  ~h,#55h9=U90E$E=-# u=thh-#:YY-#9u(=-#>t=-#Ủju5l4 EBUU=uK}u=~<9U~/=th4 hH h h }U UUJUIM9UU: tE9U~jj50h iU ] U MU ]fQfXEE^9U9}tU: tE݋@tBRWuuh Z4B9Ut9}t hp YB9U9}h Y53YE5hh,# E}t,#0 r5uYY1oh,#ZY,#-0= sF>,u&FV1Y+@-0= sF1=atCMǀ}auFVY-0= sF>,u FVYE}}duGBU)B~h,#55h <9= U)BJR5h h,#35h,#YY *E9U5hh,# E}ujj5h x=,#tjj5h URh.#YYU U+E[=tujjjh |5%Yh h,YYhE9UV9UuE^E uY]NjU PSQuh h-h%YE럋B9~B^25 %Yjh,#5ht 1_^UVWuu uW' E1=S}tM,#9=~+> t > t>Xu> uGF́,#t Vh,#1YYE_^UVWE5 5  UUU /= t=t =ua= u 5 YU =u 5YU=u 5YU1B֋U: uEF=x'95 )Bډ== 195|MU U :+u -U frfyFG뫃}t;B֋U U U frfyG:=t h`_Y* j-j*27 U:*t h /YU=Ej*j-0  19=|MU U :-u +U frfyFG뫋B9t hY55}u uY}u uY}u uY_^UUU UUUUU QUUUV5*YEuc.YƉB5Rju*U f E^UVWU ,uF,#-0= s>dt >ct>au1Ey=uuh,#&YY>dJ5hh,#` *=uuh,#&YYhh,#9+YYu5W&YY=huB&YYhu3&YYuyYuMY 5DhPYYy5$hP)YY5$5D)YYj Y_^U=0tJ<"=D"t 5D"|Y=@"t 5@"gY@"D"W5,C)Y,5H"/Y5L"#Y1҉L"H"40T"Uu4Y=t(j=0tPuh UVW11=E0hu)#YYEujjuhphhd](YY,yjjhdh\uhh,#b t:=t}uh,#YtEh,#)Y9~뭃=}g=t)=qjj5hUjj5h%=,#yt5jjjh =tjj5hjju# P"=T"hYH"h YL"ujjjhlm=P"u3h5H"5,' =}jjjhL(BuR=P"H"R uKJ$=P"t;h5H"5,& =}jjjh,FIuY5,&YjhdE&YY,yjjhdho_^UVWu~95$} =0tD"=P"U+U9=0u E r9=4u E aU <0=P"ijP5,y% U h4H"5,t% yjjhdhU T"M H"_^UVW=u 5%YW5u% u9tHu>t>9t/W5FP% uB9tF1_^UVWhu (%YYtjjuhujuI$YYyjjuhthh,#$ Dž~)Wh,#j$ 9tjjjhl/#Y1=Lt'5LPp$YYu P?$YY5u PL$YY=HtHhPP$YYh #u m#YYIf #ff#f>t>/u VFh #P#YYt #9^#9uL>t-a=rF>tPY덋RC#YYqP"YytjPu hTmPu $"YYyjuu h(Cu '"Yytju uh u u!YYhu !YYyjuu hju!YYyjjuhhh,#f! Dž~-Wh,#d! 9tjjjhu Y Yu !Y1_^UVWhu YYEyjju h ju YYƅyjjuhhh,#V Dž~+Wh,#u 9tjju hV' Yu Y_^UVW}uHFu)RYEu*=0t 4%jjjh(EuGFЄuE_^Uuuu uhhYUuuu ujYU VWjhYEuuu uh,#VhYh,#2 YPh,#jh }thh,#j6 jYtAhtFYh,#YPh,#j hh,#j jhPYYDžxCWYt8h,#YPh,#W hh,#W WKYVjYYt>h\Yh,#;YPh,#jq hh,#jE ,#  ,#Ɔ,#}ujjjh,#_^U}uBjjWYY\"=t \"jj6YYX"=t X"5\"jYY5X"jYYUjjYYjjYYU\VW}Dž?t*?/uGAFيGF} tlh\h,#YY,#Dž93>tF FPVrYY/h,#6Y_^UVW}u1uYE9tF€tuu WhYj hW u18>t9u>/uM xGF9}t5U:/t-Gh #uYYt#@tG/}WgYWhx,P ubYh #WYY}ht,PYYh #,PdYYyhh #0PMYYyQWhdhh,Ph #,PYYy h #1PYYy WY1_^Ujj hhU=@t@jYUhuYYUVuj jVO ^UVWu1E9tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5<Nx 4-^U=@t@u|YUVd"U9d"wUd"9d"vX 16VYt1'd"rF5d"&Y5d"^UVW}u1E}UUsX 1=`"u8jY=u1V!փ5`"5d"FE5h"OVU}9}r69v2W9UvUW~>}t Eh"u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=h"<9}r79}u+UOJ}t Eh"URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15h"t 9ur6E0tU Uh"tU9ru NJEtU9Wu RWE_^U}x}~uPYYUVu~  uX6EPb YEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 09tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+X"}t}y UU_^U VW}4Eyt 1}uE VYFu=L2hDhh jYEP8YE9Et}u}uEu}u EEE_^UUas U EU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVWU :ru1U :wuǃtEPYx Ey1}l""s >t-l"P[YtLY11ۅPtSYY1t!YjuhhhjYTM l"1tYu tYY_^UVWUzjjDYYEjj6YYEuIYEP Y=t 94l"uuEujYYujYYl"E_^UVWuU VVuYYDžt~~yVډXF_^U$UUEPjj UVu x~X 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+00YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sXKV|YE=uX&UEUUU}׋U UE8t=+UEEE0BYE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3We }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j. R=Y_^U(VuEEV֋RUV֋RU E {UUU UEPj7j ^U$EPjj U$EPjj U$UUU UEPj%je U$EPj*jM yUEUMJ1U$UUU UUUE`EPjGj U} vXM E 1U} vXM ҋE!1UE1UE1U} vXM Et1U$EPjj- y}tUEEUVW11}U9u F߃| jugYtUrYtURtUzt rY}\t}tt}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv] =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVuJxFFSXVrY^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uF"FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }@bV~y UVu CV€tu ,fNV~tu>5x\ Yt.h0YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv& =uN ?jEPv@ =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E {U :t! EE E (RU uuuYYEy@Ut8hu1YYE~" tuwYuuoYYE}y1]j%YEu uBY1A!uEUMJUzUBUE_^UUUuuu UVWu }E?t:JxG^FSX GVPYY=uEE_^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^U VW}uE} OU9UCU UJxʋGG WP;YY=uEFMuE뱋E_^UU Uhtuu UVuh} t1Pu V^UVWu} E@bV}t}@t}t ~tVt vUYft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^UUURu hu'UUURuu uUEEUUUUU JUEPuu@ EUJUx ]E EPj`YYEUuu huWoCs;3S~USE] ![]USE] ![]USE] ![]UVW}u M k UVW-E_^]2L$ UW}0OE uG_]1_]UVW1}y11<t,|1Fρ(1E E @U :tE E `jYEu1EttEUMJUzUBUE_^U$UUEPjjw U$EPu YYEPj jO U$U UEPu YYEPjj! U$U UEPu YYEPjj U$UUU UEPjj U$EPuVYY1ۅÉU$uYEu YEUUU UEPj jk U$UUU UUUEPjj? yEU VWEu>tFN>Xu E0EEF>t&azju YYyEG߸x_^U(VuU @t*uYEU UV֋RUUUEPu, YYU UEPjj[ ^U$UUUUU UEPjj/ UHVuUVUVUV UVUЋU UEPY^UVuEPSYjEPj V""5"h"jKj ^U$uYEUUU UEPjjl Uu hT$uu U$EPu YYEPj j+ U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U | }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U 9JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEмUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/E6U U RU U RUEEE,)E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPvYY=t6JxEEFFEEVP@YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu5YY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UhhYYjYUVuxYƋU rU MJwU uR-YY^U$U UEPuYYEPj!j U$UUU UUUEPj6j U$} uEEUUE UEPjJjy y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇtPXP%d out of %d hunks failed--saving rejects to %s %d out of %d hunks ignored--saving rejects to %s #Assertion "hunk" failed, file "patch.c", line 277 Ran out of memory using Plan A--trying again... . s (offset %ld line%s) with fuzz %ldHunk #%d succeeded at %ldHunk #%d failed at %ld. Hunk #%d ignored at %ld. Lost hunk on alloc error! Apply anyway? [n] IgnoreAssumeUnrR%seversed (or previously applied) patch detected! %s -R? [y] Ignoring previously applied (or reversed) patch. Lost hunk on alloc error! Lost hunk on alloc error! Not enough memory to try swapped hunk! Assuming unswapped. You may not change to a different patch file.  B6  7        m                  CR (      O  ^ |      Unrecognized switch: %s #endif /* %s */ #ifndef %s #ifdef %s Argument to -D not an identifier. Can't cd to %s. Too many file arguments. +Offset changing from %ld to %ld Offset changing from %ld to %ld P  ( !( *7 +( -( = Fatal internal error in abort_hunk(). %c %s%s--- %ld,%ld%s --- %ld%s --- 0%s *** %ld,%ld%s *** %ld%s *** 0%s *************** ----- ---- ****Assertion "pch_char(new) == ' '" failed, file "patch.c", line 670 oldchar = '%c', newchar = '%c' Out-of-sync patch, lines %ld,%ld--mangled text or line numbers, maybe? patch: can't create %s. wpatch: can't create %s. wpatch: misordered hunks! output will be garbled. il=%ld lfl=%ld patch file %s not found rpatch: can't create %s. w-patch: out of memory (grow_hunkmax) Assertion "p_line != Null(long*) && p_len != Null(short*) && p_char != Nullch" failed, file "pch.c", line 139 Skipping patch... No file found--skip this patch? [n] File to patch: No file to patch. Skipping... s(Patch is indented %d space%s.) a context diffa new-style context diffan ed scripta normal diffThe next patch lL %sooks like %s to me... I can't seem to find a patch in there anywhere. Ignoring the trailing garbage. done Hmm...done > < *** ********. Prereq:Index:--- *** -------------------------- |%sAssertion "ret != Nullch" failed, file "pch.c", line 424 The text leading up to this was: -------------------------- Assertion "p_base <= file_pos" failed, file "pch.c", line 418 E( \' \' '!&*"+&-l$Malformed patch at line %ld: %s%3d %c %c %srNot enough memory to swap next hunk! > expected at line %ld of patch. Unexpected end of file in patch at line %ld. --- %ld,%ld --- expected at line %ld of patch. Unexpected end of file in patch at line %ld. < expected at line %ld of patch. Unexpected end of file in patch at line %ld. *** %ld,%ld Hunk too large (%ld lines) at line %ld: %sAssertion "filldst==p_end+1 || filldst==repl_beginning" failed, file "pch.c", line 782 Assertion "fillsrc==p_end+1 || fillsrc==repl_beginning" failed, file "pch.c", line 781 fillsrc %ld, filldst %ld, rb %ld, e+1 %ld Replacement text or line numbers mangled in hunk at line %ld the new style...)the telltale extra asterisks on the *** line that usually indicate(Fascinating--this is really a new-style context diff but without%s %s %s No --- found in patch at line %ld Hunk too large (%ld lines) at line %ld: %sOverduePremature%s "---" at line %ld--check line numbers at line %ld. Duplicate "---" at line %ld--check line numbers at line %ld. 0,0Unexpected *** at line %ld: %sUnexpected end of hunk at line %ld. ********Assertion "p_end < hunkmax" failed, file "pch.c", line 504 Unexpected end of file in patch. ********patch: can't create %s. wAssertion "p_end == -1" failed, file "pch.c", line 452 Assertion "i == p_ptrn_lines + 1" failed, file "pch.c", line 1081 Assertion "tp_char[0] == '*'" failed, file "pch.c", line 1065 Assertion "p_char[0] == '='" failed, file "pch.c", line 1053 too long line (%.40s .. q w . w/bin/ed - %s/bin/ed %sBAPatching file %s using Plan %s... Can't reopen file %s patch: can't write temp file. patch: can't write temp file. Can't seem to get enough memory. Good. This file appears to be the %s version. Aborted. This file doesn't appear to be the %s version--patch anyway? [n] Warning: this file doesn't appear to be the %s version--patching anyway. Can't open file %s Can't open file %s rError reading tmp file %s. patch: write failed patch: internal error, can't reopen %s patch: can't create %s, output is in %s. Moving %s to %s. patch: can't backup %s, output is in %s Moving %s to %s. ~patch: write failed patch: internal error, can't reopen %s Moving %s to stdout. -patch: write (%s) failed patch: internal error, can't reopen %s patch: can't create %s. patch: out of memory (savestr) Oops/dev/ttymkdirs.SCCS/%s%s,vRCS/%s/dev/nullfetchname %s %d %d %s Patch level: %d -csh/bin/shcd .-csh/bin/shR^RR^RR^RkRkRkR[a[r_[wn[[+[b[0ba"brbw(blb+TbbJb/%g f@f"hX hbgdhihogp huhx hh h#h+h-h0hkLihiliiEkGtkXjbjc[kdkekfkgtkiknCjojpjrksjujxj(null)cannot print floating point "$Header: patch.c,v 2.0.1.6 88/06/22 20:46:39 lwall Locked $/tmp/patchoXXXXXX/tmp/patchiXXXXXX/tmp/patchrXXXXXX/tmp/patchpXXXXXX/tmp/patchsXXXXXX#else } ((((( AAAAAABBBBBB SSSSB\t-  H L1$T$L su;SSSSu QRP PU`VW} }|}~7hhP% jYwYEu4w5 YE=u.w7hh%j]Y URU}u:jjw E=0s(w7hh$jYEjhY&YYEyh|$YjYEEEPh"n8@u& ƅyhhv$YjYEPh#n8u% ƅyhTI$YjzYE}EUMJEUUBUfBj uj% %UfBuhu}% ƅyhL#YjY9ut4jyh<hDh~#Vh0hk# jYj$YhjYYj$Yh@hu$ ƅy=uE}|wh#YYjSYyh #Yj<Ywh#YYj%Y_^UUV5Nx V^U=tu $YUVu~  u6EPYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0Y tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U8VWEU UUUUfRf8W8W 8W ىM؋UfRf8W8W 8W ىME Eu }}`uuVuuDžy4W1W΋U u"YljUUU)UVuVX YYZMԃ}~DVuV9 YYZ߃}t&UBt 4W 4W1+E4 E$ 4 EȐ E0 EM9uuuVuuDžV YEV YEV Yǃ}u@ց} sUEEu YljUUU)U]}tE} u?uuVuu"Džy +֋U }u}t }t&9=, t U9UtQ=, UŨ}u1( }u U uuYZЉEE1UUs-UEȉEWVR UUE;}tEE 4W1_^UVW}-0= >N>.WY=u4W1= $ 4 4 ( ,   0 X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhPChPj jP$Ey1HjuP ƅu1*UVU V   _^UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEY Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s Y u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E;} tF=.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UXr7>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWHWu=u hPjjjuu ujR$ƅ4WuuVPƅy4W}Gu^fWf8W8W 8W uL04W74W+4W4WWp5_^UVWEHWu}=u N4WuE>t >.uEF}u)uYƅtuuuu V_}u HW€u$}N>.HWdX?quuuu 7uE~=;u4Wl=4WuE=4Wt =4WuHWt놃}t"uuuu ju%E~}t 4W_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhPuuuu_^UVWhYEthuNYYEu1EuhP~ >tY uF>nuP. YYuFY u>tDG?tY uG1҈hVh u Y u Y1_^U@VWEEEUUЋUUE=HWu5=u HWu } ~1EUffUEDW9UYELW9U;}DžDWU=y2UMEPU\WP4PWw =#U f8W8W 8W فfMjEP5 =t$U5)Y^u u5 9E t$U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tBU5wY}<}EM}ff8W8W 8W ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$U5YUJÜJU+UfUU܅VU܁vE܉VP5> ƅU)fU멃=yyU'UMU\WP4PWu u5(9E M@WUԃ}~ Eԙ=LWEԃ}Euuu5E=u=EEUM9uHW u+UBt"5 YE}tHWt}u HWu5 YEaEE=x5 Y}u}u ;= Uȉ_^U=t5? YU$VWhP YDžujW YYƃuEE1UUfU fUEPh0n@V E=uEV YGEEPh2n@V E=uEVp Y E_^UVWuut.Vu u[ Dž U)U U )΋E_^U VWh0 YDžujW YYƃuEE73EPh@n@V E=u UV YU_^UVWUR Yƅu wUWfUfW fG #UfWuu FP URVu< EUV%Y}r UUUE_^UhjYYj YUVWUR YDžu hjcYYEuz YEURWu ƋUxw7~1Wg Yj9 Yuj YYu$ YU@RGPu W! YjYujYYuY_^UVWEEP YNjE E Pr Y9uuԅt9}t t1_^UVW}u1]MEEP YNjE E P Y9uuąt9}t t1_^U$UUU UUUEL(EPjGj< U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UVW11}U9 u  F߃| jugYtUrYtURtUzt r Y}t}t}t u Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv1 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFFF VVv vvQ >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E #U :t! EE E ^#U uuuYYEy@Ut8huMYYE~" tuYuuYYE}y1]j YEu uY1A!uEUMJUzUBU E_^UUUuuu p UVW5YNj5hYhY}t.U:t&uCYPuV jhV WYPWV jhV _^UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuu@ EUJUx ]E EPjYYEUuu hu + UVWEu }10ttOF"FFF FFsst#ff_^] UVW}u MUVWME_^]UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVU9wU9v 16V Yt1'rF5&Y5^UVW}u1E}UUs 1=u8j Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95| ,p ^UUas U EU VWDžDž@WDWHWLWdWjh|*YYu4Wg#JfhpYƅthVhdW hXh\8YYE(uhPo jhPP _u> t> uF>t> thVhdW j hdW-YYƅtDždjhHP` 9> t> uF>> hVhdW_ j hdWYYƅtdWdX7E>t3|Xs+> t> u E}t 7EFȀ>t > t> tFDžoj h<Pk Q=LWD> t> uF>(> LWPWPVYYLWff U\WLWu Y=LWu"PWff\WLW=dWu=hPYYu&j.P.YYƅtFPhdWXYY]dXdWdWE>t >.uEFdW}|pXsj.VYYF7M HW1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEFuVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UUEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U(uJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEHe E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }r"~y UVu CV€tu ,fNV~u>54Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvI =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVW!E_^]L$ Uh8hrYYj¿YU VjhX YYƅyHu uV EVY}u"U JUj uYYEt1^UVW5XtYDžD7uJYYtw>t6u2YYt} tu w YYu=XuM_^UVuYƋU rU MJwU uRYY^U$EPufYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUu hT$u UVWtu} u ~tIu(_^]U= uhlhpYY 5 YU XU= t5 Y XUVW= u!hhoYY u1D5 hh  Eu1U:#thu YYƅtUhuYYEtEU: t: uEhuYYƅjFuY%f8W8W 8W ى 5 hVWYYƅtFt8>t3> t> uFs7hVYYƅtF_^UVW}Utu >t]9uFG1_^Ujju% E`UVuj jV ^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s is alive readno answer from %s result= %d ping.c%s %d:writeioctl (NWIOGIPOPT)ioctl (NWIOSIPOPT)open/dev/ip%s: length too small (%s) %s: unknown host (%s) Usage: %s hostname [-l length] [-t timeout] %u.%u.%u.%u.in-addr.arpa  9 R s ;  gth%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE$a$r$w$%+$b$ : unknown errornameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainP3Q127 6@68X8b7d7i7o7p8u7x88 8#8+8-808;L9h9l99E;Gl;X:b:cS;d;e;f;gl;i;n;:o:p:r;s:u:x:(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/servicesSSSSB ((((( AAAAAABBBBBB XUnknown error0$tP@, lXH8 tXD` ` ` ` ` ` ` ` ` ` 0p\D0C  @lD1$T$Lsu;SSSSu QRP)PUhh0YYjYU,VWE}~/U jhrK uEU z U zjhtYYEyh\YYj:YEPhs@uk uYEuhDh0YYjYEPhsu. jW3YYƅyWh4YYjYjhV =RIFFtWhYYjY=WAVEu =fmt tWhYYjfYjjV EjhV jhV =tWh-YYj YE-E]܍EPhsu" hhsu  EPhsu }u1EEPhsu juV jhV =datathpYjQYjhV }Ph;YY=uPhYY5htYY5hXYYPh<YY5h YY=9Us uuV +UF5uV UU9UsJUMMEuuu l_^UV5Nx ^U=tuYUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^UUUuuu  UU Uhuu _USE] ![]USE] ![]USE] ![]UVW}u M L$ U$UUEPjj U$UUU UUUEPj6j U$UUU UUUEPjjk yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE4 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }J~y UVu CV€tu ,fNV~u>5pYt.hxYFu NLNHF 9hJYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]bUUas U EUhh0YYjYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u= UVWuEu41}% =u N /uvv EU9Uu1 N _^UV1}*T Ty1$T$L T su;SSSSu` ` QRPtP UVWu UUE1}+UMu0F1Fu$FUUG1_^UVW }1J J xD5  DD5h PYY- J x  .h j.YYFy J x  h j YY= ~U9UtWuuh}f_^UVuhYvhhYYFlPhyYYFmPhhYYvthlYYYh@GYYh$5YYh#YYhYYhYYhYYhlYYh@YYhYY^U$uYUUߍEPEPYYE$UUߍEPEPYYEPh0VYYUVhXDY195|w~*ЉwPwhH F^U$VuV4UߍEPEPOYYV4UE$EPEP5YYEPv,hT h0YhYv vvv vv$hh|Yv0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVW= aU9 }  M :-u zu  M h4YYu  M  ǣ:tWuYYƅ}= t=E h 0YYh hvYYh W9YYh j +YY M   :u  ? F>: M  C;t!A M  C  U9 |W= t=E h 0YYh hYYh WhYYh j ZYY ?` A M   7 M   :u   _^UVW}Wu u ƅ~9})׉U U 1_^UVWu } b3~y UVu CV€tu ,fNV~ u>5 Yt.hXYFu NLNHF 9h*YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv< =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvs =u N 3uvvl uNN N_^UUUuuu  UVu JxUʋFF Vu2YY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uh uuf U UUEEUUUUuYEuu EP 'UW}0))ϊE tu1_]XG_]6UVWME_^]UW}0OE uG_]1_]UVX U9X wUX 9X v 16VYt1'X rF5X &Y5X ^UVW}u1E}UUs 1=T u8jlY=u1V!փ5T 5X FE5\ OVU}9}r69v2W9UvUW~>}t E\ u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=\ <9}r79}u+UOJ}t E\ URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15\ t 9ur6E0tU U\ tU9ru NJEtU9Wu RWE_^U$UUEPjjg y UD 1UVW5D D }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjj7 yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjjW UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډƮE1!,'"U@EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UpJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPzYY=t6JxEEFFEEVPDYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF Vu9YY=u˃}t Uډ E_^UVWu }E` $E)E EEE(#-t+u-U EMtJxFFSXVo Yǃ}0}U EMtJxFFSXV% YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G psE=cF}[t@}nt:JxFFSXVYEE uՃ}}nJxFFSXVwYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=` r}` u8-t8+uEE-` EE}dt}iuuEPh` $ EuEPh` & EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVSYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE u:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE` }` s UE?]u Gƀ` ?Z?]QGƀ` ?-uG?t2?]t-G9"G@E9EEƀ` EG 띀?uEE` 3]uVuYYEEuUURUEu UMЈ EMt"JxFFSXV'YEE}t}tE` 3]u}t}t VuYYMEUEt }vE}uEuVu E=` r}` u8-t8+uEE-` EEEPh` JYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY E^ EEu }ntEGV}u}tE_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvN =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 }YGƒ~uF`FF VVv vv] >uNN FFSX_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUh h YYjYUh@ h YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|UVWiE_^]U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉKI|;u[u P7P u.`=}aa1ۇL tPXPStackDataText %s: 0x%08.8lx 0x%08.8lx %8ld (0x%08.8lx) address address Virtual Physical Length wanted = %d, got = %d, offset = %ld %02.2x - %08.8lx: Unexpected end of file Length %ld, offset %ld, amt %d %s segment Count of pending/unfinished signals: 0x%04.4x Bit map for pending signals 1-16: 0x%04.4x Expecting message from: 0x%04.4x Time of next alarm in ticks or 0: %ld Cumulative sys time of children: %ld Cumulative user time of children: %ld Sys time in ticks: %ld User time in ticks: %ld Process id passed in from MM: 0x%04.4x SENDING, RECEIVING, etc.: 0x%04.4x Nonzero if held by busy syscall: 0x%04.4x Nonzero if blocked by busy task: 0x%04.4x Number of this process: 0x%04.4x Kernel process table entries: Pending signals = %s 0x%08.8x T %s Symbol table entries (text): Stack pointer 0x%x, Base pointer 0x%x %04.4x %04.4x %04.4x cs ds es %04.4x %04.4x %04.4x sp bp ss %04.4x %04.4x %04.4x %04.4x %04.4x %04.4x ax bx cx dx di si Status = ____ ODIT SZ_A _P_C Stack Frame: PC = %04.4x PSW = %s ?cdpstx Cannot open %s Size of process table %d Size of mproc entry %d Cannot find symbols in %s a.outCannot open %s c:dps:tx:a.outcoreAddress 0x%04.4x, label %s %c %x %sMaxsym %d Addr 0x%04.4x, label %s 0x%04.4x 0x%04.4x 0x%04.4x %s Previous label.Frame address. Contents. Return address.Stack back trace: Baseptr %x, End %x, Bp %ld, Offset %ld Usage: %s [-dpt] [-c corefile] [-s symbfile] : option requires an argument -- : illegal option -- --9 @6Xbdio pux  # +-0 #L h l !E"G"X!b!co"d1"e"f"g"i1"nW!o!p!r"s!u!x!(null)%X%b%d%i%o%p%u%x%+L+h+l+<,E0G0X,[7/b,c-d,e0f0g0i,nZ,o,p,su.u,x,cannot print floating point cannot print floating point x  ((((( AAAAAABBBBBB SSSSB   =Lh 1$T$Lhsu;SSSSu QRP PUVWhh,YY9u[Bu VZYt2  VSQ> f= ffDž 9fDž9 Ë<t# 4Y Ë@ff@f3fDžfDžfDžHf=tuf@9u@ffDžH9XJxFFSXV Yf %u_=tV@fƄHffDžfDž= u\%9~$@fƄ GԋJf,P@fZ@f@fƄu. 9u=PY ً ؋S4Q%YY@f ؙfu)@f ؙf=Z= tL=t>JxFFSXVYf= t=uHfu' SӉșZ)f=tJPSYY=_^UV=tEH @f f=u EP YfEE 9~fEE] 9-ffU=t:Uu2@fPh!YYE-fEfEE ]ËօtPEH]9~C>t>JxFFhPYYE@fEE H]9~KU@fE]K9}/Jx hj YYE@fEJx hj YYE@fEo=u hx Y^UVWufEfEffUEf=t E-fEE@fE] 9}@]t7EE VPS fE] /E&E={=tEH @fE9u JxFFSXVYfEf fUUE=|E 9u=u EPY=t;}t'@fPhYYj hYYEfEE= 5E=&E]9E= YE%E]9}~0Jx hj CYYGˋUJfUE=uA=t8JxhjYYEHfE4JxEEhPYYJxFFSXVYfE]Cf]Jx hj XYY=NE= tCE=t8JxFFSXVYfE= t E=uEHfE] JxFFSXVRYfEEiE 9x=u h YE=sE9|FUHfEt/Jx hj 5YY_^UVuYƅuh$hYYjY^U$5YtEP5YYUU EPYuYEP5h< UVEPYƺlVNRvvv 4h^UVuj jV ^UV5@Nx  ^U=DtDuDYUVW u^Yƹ<`+F؉F`+ډV YV YDžt"<1FF1V Y_^UV U9 wU 9 vl 16VYt1' rF5 &Y5 ^UVW}u1E}UUsl 1=u8jlY=u1V!փ55 FE5$OVU}9}r69v2W9UvUW~>}t E$u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=$<9}r79}u+UOJ}t E$URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15$t 9ur6E0tU U$tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhPEP%>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h|VW ƅu1WW,YZ׀>/u5Fuh|VEP ƅu19ut EEG>,t1jFhVW ƅu1MWWYZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_lp|U U VY=VhYYVh(wYYƅ>-uF>+uFjVEP ƅUU`j h(5l 1h(Vh(YYƅpj h(5pD (>t>,tjVEP ƅt5Ud>t'>,u"FVY=xwVh(YYƅu_^UhHYPLYltpxUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE|E=huhV =hu1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}td F 1_^U VWu<Fy0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+l"}t}y UU_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVue YYDžt~~yVډlF_^UVW11}U9u F߃| jugYtUr YtURtUzt rBY}pt}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv- =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u$ ƅ~9})׉U U 1_^UVWu }Dz'~y UVu CV€tu ,fNV~u>5Yt.hHYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv{ =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E LCU :t! EE E lU uuuYYEy@Ut8huYYE~" tuYuu_YYE}y1]j=YEu uY1A!uEUMJUzUBUE_^UUUuuu  UU Uhuu UVuh} t1Pu V^UVWu} EDz'}t}@t}t ~tVt v9Yft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^;USE] ![]USE] ![]USE] ![]UVW}u M; n UVW E_^] UVWM[ E_^]UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U ' }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEbuVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UqEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF Vu"YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE4E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPdYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP"YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh>YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j {sƉKI|;u[u P1ۇtPXPMbfh"ldntw?Cannot open %s rMinimal length should be %d Too many columns for page width. Usage: %s [+page] [-columns] [-h header] [-w] [-l] [-nMt] [files] %7.7d %7c %7.7d malloc returned NULL %s Page %d DecNovOctSepAugJulJunMayAprMarFebJan %s %2d %2d:%02d %dSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ,a,r+w+^,+?,b5,4 3@35X4b4d4i4o4p4u4x45 5#5+5-5058L6h6l66E}8Gh8X7b7cO8d8e}8f}8gh8i8n77o7p7r8s7u7x7(null)cannot print floating point OB|xtplhd`\XTPGMTGDTHTHTU U @4,$  SSSSBph ((((( AAAAAABBBBBB   `xC1$T$Lsu;SSSSu   QRP P>UV}~}u6U h hrN uU rh YYjY J x44SX h Y=w=t .ui벃\u AsS8J8xVYLLh8VzYP YYGasF8J8xLL h8VYY'uF8J8xLL h8VpYY u1=8J8xLL h8j YYP1^U J x44SX h KYE= uUVW J x44SX h Yx J x44SX h YƋ J x44SX h YƉ! J x44SX h oYƋ J x44SX h AYƉ0 s. J x44SX h  YƉ J x44SX h Yƃ(u\ J x44SX h YƋ J x44SX h sYƋ J x44SX h EYƉ J x44SX h Yƃ( J x44SX h YƋ J x44SX h YƋ J x44SX h }YƉ J x44SX h HYE J x44 h Yǃ}eumu }eunu t J x44SX h YƉB J x44SX h YƉ _^UhXYjYUV5Nx ^U=tuYUUAs UEUVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~~y UVu CV€tu ,fNV~8u>5<Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVW}EEL#WUWYw]Y}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu) YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu( YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uR YEU UV֋RUUUEPut YYU UEPjj ^U$UUUUU UEPjjo Uu hT$uU U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 3 }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEn uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu YY=u}t UډE1!,'"U} EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U4JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PcE6U U RU U RUEEETE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPlYY=u}t UډJxUʋFF Vu$YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuaYY=u˃}t Uډ E_^UVWuEu41}%gEGXSbScdefginoSpSrAs uSxS(null)cannot print floating point SSSSB 8Px  G1$T$L(su;SSSSu QRP\ PUH}~U hrYYu1dEPhVYYh*YEzu&YEfhhCYYURhYYEPhYYuU܁`uE]9ujhYYjhYY1UVuYPuj =dtjh@j u Yjhjf h4uYYƃujh,j? )ujh$j' jhj u Y^UV5 Nx h^U=$t$uYUVjuYYƅy'u YhdYuYjhVN jDhVV =Dt+u hYhD]Yu|YV YAVYLB=uLB=h$u^UVu>tF+URuj ^UVW5,YNj5dhH}Yh`rY}t.U:t&uYPuV$ jhxV WYPWV jhtV _^sgsjUVWE_^]UVux95|^U$UUEPjjs U$UUEPjjS U$UUU UUUEPjj' yEU(VuU @t*u:YEU UV֋RUUUEPuYYU UEPjj ^U0VWEPuYYy1U؁@t,1huKYYDžy1EPWYYxS,U؁@u7jW`YYEx& PjWI xh$Yƅu,UWrYUЉ,1FfFF_^U$UUUUU UEPjj UVWuu, 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjjh U$UUUUU UEPjj; UVWuEu41}%}t EXu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=X<9}r79}u+UOJ}t EXURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV` uY_^U VWUUb15Xt 9ur6E0tU UXtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVupYƋU rU MJwU uR%YY^UVWuU VVuYYDžt~~yVډ,F_^U(VuEEV֋RUV֋RU E UUU UEPj7jb ^U$UUU UEPjj= USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu P1ۇtPXP/dev/unknown/-r0 rw 2 rw 1 rw printroot cannot read super block on cannot open : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0}V}V}Vccc`/dev/ / SSSSB0H`Unknown errordP<, tdT@,xdH4 pT@0C  *< <1$T$Ll < su;SSSSu, , QRP  PUVuY P'Yƅu 5 hh h jcYuFPIYY^UVutu6uY^UVW}1t tF?_^UVW} hSYƉE}tUR;YƋEU߅tGPYƋ?E_^UVWu }>t6tFPGPnYYu?1_^UVu>t6u Y^UVW1uLFPh 9YYF~/Fa u~_u~>tz,t hYG6_^U VWuh$>YljEEW>N~[uWpYE6~tF~(Fa u~_uFPY}?6롋E_^UVWu1}~lh@FP)YYth8FPYYuD6Y=}5t!h,GPYYu VYh(FPYY6{_^UVWuJxFFSXVYǃ u8 _^U VW}WYƃ\uWYWY/y=0 lWYƃ*uCE }t(uW]Yƃ}*u/u Eڅy։&WoY u 8 WV'YY/_^UVu?Yƃ=4 t!#uu&Yƅx uyG1 u@4 't"u.50 uYƅx950 u0 0^UVW}E5\ ~a t u PYy {kE8 < }t0u Yƅy 5\ {uEԃ}uMhHWYYu Y\ 1~a u>_t9Gu Y\ (u=\ *uGu Y\ 1;8 @ ~ a u_uGu SY5\ 1_^UVu uYYƅyU:;t:{u1^UVWEE1} DFh-Yh Y EuDP7YYy1D)u.My)}U<< hYElD;u ED,u%}uU<< hYEeDPWYYD(IEAEhCYEh5YEEuDPHYYy1D(u+DP5 YYh5 YYE밀D)u>8 9@ u(DP5 YYDP5 YYMiD,}}u1H19u~S|uI4< W?YYt6D4< YWuYY< 4< FYF먃}uWYEEWJYhYD;}u 19u~S|uI4< WYYt6D4< YWuYY< 4< YFEuYWYh|GYEhx9Y htDPYYtRhhDPYYEDPWYYD(uED)M}uh`Yh\YE19ut< :t$:u,< hTRYYthPuYYE8tU< EUJ9~hLuUYYF냉_^UVW1=X u h(Y=T t)UMIRuQhhuY=H tuh^YYut ~tG6} h;YuY=P t#=X t hYhY hYu Y5 Y=P t#=X t hYhY hY=T u hY hY=T t.hzY< IRQhd hWY_^UdVW1EVYhlY1EuEPYY^hhEPYYtPhdEPYYt:->MG?tހ?suD t?nuH `?pu P O?Pu X >?du4T X P H D -Gm=P t@=X t7h Yh Yh Yh Yh Y}uht 1Y}>h6YYEu6 YjCY=X t =L t=T u6h| YY8 4 \ uYMuYd=P t=X t hp YuY1_^Uh h YYh 5 YYh h YYh h YYh hv YYh hTe YYh hT YYh hC YYjYUV5d Nx  ^U=h th u` YUV U9 wU 9 vp 16VYt1' rF5 &Y5 ^UVW}u1E}UUsp 1= u8jlY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډp F_^UVW11}U9 u  F߃| jugYtUrYtURtUzt rBY}t t} t} t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuvq =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 }YGƒ~uF FF VVv vv >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E U :t! EE E <zU uuuYYEy@Ut8hu%YYE~" tuYuucYYE}y1]jYEu uY1A!uEUMJUzUBU E_^UUUuuu  UVWu }E?t:JxG^FSX GVP YY=uEE_^UVW5p YNj5 h Yh Y}t.U:t&uWYPuV jhXV W3YPWV jhTV _^UU Uh uu UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVW}u M; n UVW E_^] UVux95, \ ^U$UUEPjjS U$UUEPjj3 U$U UEPul YYEPjj U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjjk ^U$UUUUU UEPjj? U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U l }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEB uVuu+ ƀ}Xu9utUP7 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UQ EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Uq JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЬUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEaE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }h ~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh h YYjYUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u U$UUU UUUEPj6j KI|;u[u Pc1ۇ4 tPXP%s: out of memory %sintunsignedshortchar{}, intvoidvoidregister{} void > #endif %lda%ld > #else ; )) )))(, ( P((int /*%8ld */ > #ifdef __STDC__ > %lda%ld,%ld _PROTOTYPE( (;inlinestaticexterntypedef={}, #undef P /* %s */ r#endif # define P(args) () #else # define P(args) args #ifdef __STDC__ -s: include declarations for static functions -p: don't make header files readable by K&R compilers -n: put line numbers of declarations as comments -d: produce a diff file to prototype original source -P: use P() style instead of _PROTOTYPE [-d][-n][-p][-s] [files ...] Usage: arw&+b : unknown errora @:^XGb,d>i>o5pGu>xG7 (#-+#-02)"L hl / E!G!X!b!c!dY!e!f!g!iY!n o!p!r "s u!x!(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point  ((((( AAAAAABBBBBB SSSSBt < Unknown error xdTH$|hT@, p\H,          |hXD0C  * D`O1$T$L su;SSSSu QRPNP UVUuUuB195Nv3kN8t%kN@9EukNFŸ^UNUiNUVWu~Hzu HvHYE~ StD~Hu8Vt <mVt 4[FN,G~HuAVڃu$0VڃuVڃuVR%YuWh hJJ_^Uuhh$  hLh$ YYj5 YUVWEEEEhj .YY9ufU U:-uEU:tJ5EUUEE΋E 0 YEE'FjhxpYYN=u hl Yjh`KYYN=u hTY) =u h@YlPhm5N =u h YlNnNNiPj YNiNlST YNNR? YN=Nt=Nt =Nu hYNNiP5Npj5NNNi9t hYiNliNNP5Nt5NBiNl9t hvYN NAiNR5Nx5NN9t h!Y95N~-NiNhPYYtFˉ5N}tL4Ph YYNډ95NEPVYY=}uE9Et E9E}uE<}uVh,^P uh(^P UU<Йǁs$1R1PhIPaY@~s1<1lj1R1PhIP( 1PhIP }95N}}u VtYE]PIPSYUPt EPhYUU+UÚP1]UPuu^PSRuhK0B95N}}u VYE]PIPSjYP^PhF1_^U VWUMRX+Q8QDUU]+ZD+Y,ۉ߁@~@}ju5N uh 5N 9Et1rE EUUMR+QXׅx9}}1E EEuE 9v>uEU9U} F9uu1E_^UVWu }NUN99=N BiENu!ilN<u iENPtV9=N&NfRbfNBvF fF9=NilNfP8fVilNfP:fVilNP(VNili@4l‹R(V ilNP,VilN<V&FF 1fVfVFF9=NilN<t F ZilN<€t F TkiENxtuF RRilN< uNztuF S#F WiENxtuF RF WiEN V$iEN V(iEN V,iENPx V0iEN V4iEN V8iENP| V}t EJu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=J<9}r79}u+UOJ}t EJURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15Jt 9ur6E0tU UJtU9ru NJEtU9Wu RWE_^UVu~  u6EPYEU UEPEPVb yE^UVux95  ^U$ 9Ut*UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^U=x 5yYU=xjhYYy'j5FYY Pj51 1UNLNM=u/hhJ5 1VNJ=NMu1< NNNN= uNLU} t} u1UVNPYtN}uN:#u1b5NNUN:u1DN: t(}t :"u*NNP_YtU>u1^UVNUNP'YtNN:"uRNjYƅt(>"t#=NpNu1{NN0ʋN:"u;N0jYƅu1C=NpNu13NN0=NpNu1NNE^U=y _y1Du17jRYpNtjAYtNxN|NpNUVƅtu6YYu^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU E 'UUU UEPj7jB ^U(VuU @t*uFYEU UV֋RUUUEPu(YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE(EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1UUUuuu | UU Uh uuZ UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPj( YYEUuu hu#;OsWUSE] ![]USE] ![]USE] ![]UVW}u Mg UVW E_^] UVuYƋU rU MJwU uRYY^U$UUEPjjw U$EPjj] U$UUU UUUEPj6j/ U$UUU UUUEPjj yEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj VNN5NhNjKjm ^U$uzYEUUU UEPjj4 UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U \'}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEtb uVuu+ ƀ}Xu9utUPg YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Uq EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEМUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE  E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }:)~y UVu CV€tu ,fNV~ u>5 Yt.h,YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvf =uN ?jEPv` =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvW =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhh$ YYjYU$EPufYY1ۅÉU$} uEEUUE UEPjJjA y}tUEEUu hT$u U$UUUUU UEPjj UVWuEu41}%<< t4< YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<< t< Bt 4< aYF^+C;Cw Ë[ uӅu P-KI|;u[u P?1ۇ tPXP?co(%s) %sflockpopenpipessuspwaitpause?ANYWas ps recompiled since the last kernel change? Ooops, got signal %d qaIeRf_l_xh%5s %3s %s %s %3o %c %3d %5s %5d %5d %4d %10s %3s %s %s %4luh%2luh%02lu%2lu:%02lu%d(%d) PID TTY TIME CMD F S UID PID PPID PGRP SZ RECV TTY TIME CMD %sINITCan't get fs proc table from /dev/memCan't get mm proc table from /dev/memCan't get kernel proc table from /dev/kmemOut of memorycan't get PS info from kernelCan't get tty names/dev/mem/dev/mem/dev/kmem/dev/kmemUsage: %s [-][alx] ps: %s: %s ps: %s Out of memoryunknown errorM&M&M&333No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0A @>X'b diop'ux' # +-0 LhlEGXbcwd9efgi9n_oprsux(null)cannot print floating point N/dev/SSSS/etc/ttytabB $ `OUnknown errorTH,tdPD,|l\D4 |h T<  hT<,C  TB1$T$Lsu;SSSSu QRP PUVWhhYYƅu%5YP5j jQYVYlj GPVjg W9tj#Y1_^UV5Nx ^U=tuY#sU$UUEPjj UVW}E 0?tG9}s 9usON9uu N/E 01_^U VuU>t3FuF>t>/uEu YyUȋU1^UVW}t} w1?Uu NEPhl+YYy1EhEPu YYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWYEu=+WvYWYVY1_E4E UhdRYYtUh`RYYuP[UM9uMh\vPYYURyPYYEPvPYYy HE UM9E]9uUREPu yWY"VY1dWYuYy VY1EuEPEPR VeYy1>uN/9us VuYYE_^U0VWEPuYYy1U؁@t1huYYDžy1EPWYYxSU؁@u7jWYYEx& PjW xh$YƅuUWzYUЉ1FfFF_^UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UjukYYU$uYEUUU UEPjj U$UUUUU UEPjj UW}0ʀuA)_]UVW}u MUVWE_^]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuu TfFV V#U UU +UVjvPx =uU 9Vs V)Yu1^UVWuU VVu%YYDžt~~yVډF_^U$EPuYYEPj j U$UUEPjj{ U}u UEuYuYU(VuEEV֋RUV֋RU pE KUUU UEPj7j ^U$UUU UEPjj U$UUU UUUEPjj yEU(VuU @t*uJYEU UV֋RUUUEPu4YYU UEPjj ^U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UVuYƋU rU MJwU uRYY^É{sƉ+C;Cw Ë[ uӅu Pg1ۇtPXPpwd: cannot search some directory on the path 7E../......A  A  A  ' ' ' SSSST  U , Z1$T$L su;SSSSu  QRP(P U5 YPu5 hh4 \4UuYjU YUu YEu hYEUuh(h J4 Uuh,h +4 U  0ESUHVWuč}E}~ MGFfEfEEEfEUuڍzE}~ MGFUjREPN5 u}E}~ MGFjEPEP5 = r1EP YPu uY]P3YPhH2Uj?@LPPYYmLv|jNPhP. jjhP CMP3P P> Yx1R<t4Rj4hPE. h3tG뽋R<iLDž~$ hPVc= rZLPYPP6_YPh+-= r$LPYP60YPh_+ jjpP" 'hYj k,YUV5 Nx 0^U= t u+YUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\* uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVWu} u jaYDžt+FPFPFPFPFPPhW% _^Uh uYYU Vhh#YYƅu eVhP" t@uPP( uju P& uVuY1 VjY^U8VWEU UUUUfRf  ىM؋UfRf  ىME0Eu }}`uuVuuDžy1W΋U uW&YljUUU)UVuV YYZMԃ}~DVuVm YYZ߃}t&UBt  1+E E E E EM9uuuVuuDžV YEV YEV Yǃ}u@ց},sUEEu%YljUUU)U]}tE} u?uuVuuVDžy +֋U }u}t }t&9= t U9UtQ= UŨ}u1 }u U uu4$YZЉEE1UU1s-UEȉEWVR# UUE;}tEE 1_^UVW}-0= >N>.WY4=u1=      4  X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhP7 hPj jPXEy1HjuP ƅu1*UVU V  4 4_^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E=} tF=  ً ʋ  ыE _^UVuFPFPFPPh8h8g8^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UDd<}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!\_:+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#Ut9>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWu =u hPjjjuu uj $ƅuuVPƅy}Gu^fWf  uL07+W7_^UVWEu=u N uE>t >.uEF}u)uYƅtuuuu V_}u €u$}N>.?quuuu 7uE~= ;ul=uE=t =ut놃}t"uuuu ju%E~}t _^UVW}} uBW(Y-Ɖ:.u#sVWP Ƅ5*"u hWhhPuuuu_^UVWhYEthuYYEu1Euh     P >t uF>nuP. YYuF u>tDG?t uG1҈KhVhL uYL uY1_^U@VWEEEUUЋUUE=u=u u } ~1EUffUE9UYE9U;}DžU= y2UMEPUP4w =#U f  فfMjEP5  =t$ U5 Y ^u u5  9E t$ U5 Y }fEU܅t2EPW5  ƅ~U)fUU܅tB U5 7Y }<}EM}ff  ىM9M}#UfUDž #UfUU܅t2EPW5  ƅ~U)fUU܅t$ U5 [Y UJÜJU+UfUU܅VU܁vE܉VP5  ƅU)fU멃= y y U'UMUP4u u5 (9E MUԃ}~ Eԙ=Eԃ}Euuu5 E=u= EEUM9u u+UBt"5 Y E}tt}u u5 Y EaEE= x5 WY }u}u  ; = Uȉ _^U= t5 Y U$VWhYDžujWYYƃu EE1UUfU fUEPh0n@V E=u EVlYGEEPh2n@V^ E=u EV0Y E_^UVWuut.Vu uC Dž U)U U )΋E_^U VWh`YDžujWYYƃuEE73EPh@n@V E=u  UVjYU _^UVWURYƅu wUWfUfW fG #UfWuu FP URVu$ E UVqY}r UUU E_^UhM(jYYj YUVWUR YDžu hM(jsYYEu: YEURWuT Ƌ Uxw7~1WYj YujYYu YU @RGPu WmYj YujYYu Y_^UVWEEP YNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^U$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UUUBUVu {95LtF9Et 5LEFEFEFUVUV 395LtF9Et9 V  F)^Uuuju ujOUuuju uj2Ujuuu ujUjYU$VWu95Lt U t >uF1P}jYE]9  jvYEEܶ+EPzYEEPEPj E+U9}v}W0Yv F V FvvPU F V RFvvP| F V 1F^vPS F V F(}t!jYjEPj uY~u~ u 1_^UUuUYUVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$UUU UUUEPj6jw U$UUUUU UEPjjK U$UUU UUUED6EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$EPj jI y}tUEEU$UUUUU UEPjj UVW11}U9L u L F߃| jugYtUrYtURtUzt rY} t} t}4 t uY_^UVWuEu41}%uNN FFSX_^UVWEE11tG9uF>uր?=uэG1_^U}x}~uP YYUVu~  u 6EPfYEU UEPEPV yE^UUas U EUVWU: t: t: uE1}?jEPus Ɓw EE8:t ʋU  GjEPu4 Ɓw U: t: t IʋU  U: t: t: uEU uEMEU1_^U VWDžDžjhYYug#Jfh{YƅthVh( hhYYE(uhPO jhPq _u> t> uF>t> thVh j h1YYƅtDždjhP 9> t> uF>> hVh j hYYƅt7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj hP Q=D> t> uF>(> PVGYYff UuY=u"ff=u=hPfYYu&j.P2YYƅtFPhYY]E>t >.uEF}|sj.VYYF7M 1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4 uVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U|EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U9JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\ UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/E6U U RU U RUEEE) E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu ux ƅ~9})׉U U 1_^UVWu } ~1~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hֽYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UVWaE_^]L$ Uhd h4 YYjƹYU Vjh YYƅyHu uV EVY}u"U JUj uYYEt1^UVW5YDžD7ujYYtw>t6uRYYt} tu w 6YYu=um_^UVu,YƋU rU MJwU uRYY^U$EPuYY1ۅÉU$} uEEUUE UEPjJj y}tUEEU$EUEPjHj Uu hT$u UVWtu} u ~tIu(_^]U= uh h YY 5 YU U= t5 Y UVW= u!h h YY u1D5 hh Eu1U:#th u YYƅtUh uYYEtEU: t: uEh uYYƅjFuY%f  ى 5h VWYYƅtFt8>t3> t> uF$s7h VYYƅtF_^UVW}Utu >t]9uFG1_^Ujju% E`UVuj jV軸 ^UVWu1fϋV€t}u ~tu>FtVAYU )uRvg EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXP%s: %s: %s Can't allocate memory%d%d" " %s: Replying %s (%s) to %s %.*s-%d%sUsage: %s [-d[level]] network-name ... %s: Network number of "%s" is a bit large a2asyn_wait()%s: RARP request from unknown host '%s' %s: Host '%s' (%s) is on the wrong net %s %s: IP address is %s / %s: %s: Unable to set eth options: %s %s: Ethernet address is %s %s: %s: Unable to get eth statistics: %s fork()unknown error%x:%x:%x:%x:%x:%xr/etc/ethers%u.%u.%u.%u.in-addr.arpa55%d.%d.%d.%dpw'~L@L4(LL%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEZ+**)+-~,,,,3a3r3w34+3b3No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain|@}>?9D C@D6EXEbEdEiEo EpEuExEF F#F+E-E0 FILFhFlFGEHGHXGbGcoHd1HeHfHgHi1HnWGoGpGrHsGuGxG(null)cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/services,/dev/ethNNN/dev/ipNNNSSSSB  4  ((((( AAAAAABBBBBB Unknown errorh\@,t`P@0pdT@$ pdL0 |hC  o\1$T$Lsu;SSSSu QRP" PU0VWu }hh hYYuhh.YYjYR#/#P%Y#uhh-YYjDYO:-:y#### OVWUYY5"Y#OVW YY5"Y|jYwmOH=#tj-Yjh-.YY} ,jWY"~ #=#tP=#tP=#tPhP},h j YYJ4+YEEU:uEJj@43.YYEt:EJU:u #U-uYu j\YJU#UEJ9U$U4YEEU:uEUj@4-YYEcEUU:u #Uu@YuuuuPuuhP+$/UuuuuP4hpP* P'Y="luPhdP*UU#jPu25#EP!"yjYyjYURj*YYEs=#tJ4YEJ9UyU4YEbJ]44=#tHDP=#tPLPhTP)PYUEU:uE@Uj@4z+YYEt5EUU:u #U(u4YuUU#UuPh4P)#jPu25#EP"y"&DPjYY5")Y"E{5"Y_^U EPu)YYxU@t/"5"TYPuh( jYUVu>t>:u>/u1F1^UVWuǀu*u0 r _t-u F>uиuh8h' 1_^U VW(Eu$juhThXh\(jE(YjjYYjjYYƍEP(YE9Et}u}uEWjYYVjYYE_^U@VWEU9UHUЋM YYU܁dfj/W(YYEu}E=#tRuuhP0&P(YPP5"' >y V&Y1U܁uuRhP%P8(YPP5"(' y V~&YhVh Eԅu VX&YEEU9U^EԋUU9Us U+UUă}uUurVj& 9EtEUur5"& EԋUV%Y}ujh5"S& Wh| YYE_^UVW}W%YEu 5"YPWh4< j/W'YYEu}E=#tZU M rqh$P=$P&YPP5"% Kyu$Y5U JujQhP#PA&YPP5"1% yu$Yu$YƅthFP%YYth FP%YYtW%YPFP%YZ=rFPWh 뉍FPWhP#PjYYOu#Yjh5"K$ _^UVjEP5"# =jY1MFjEP5"# =tjiYMFU9s} uʃ=#u)QPj# "}ujvYEDHb^U=#uh\h!YYj<YUtVWEj#YEDž=#u u"Y}th;YjYE U=#t uYjh5"" EPu"YYuU@uEEjV5"E" 3F< u  jV5"" =t F< ut uD=#uP #YPPj! ujY"N>Eujh5"! w>T1FDž-0= sF-0k É׊F< t Dž-0= sF-0k É׊F< t Dž-0= sF-0k É׊F< t xDž-0= sF-0k É׊Ft \BjhX5" >Ct*>Dt%}tVhTYYjMY<FE9s4=0| =7~ 0-0U ‰UFŠF< t E-0= sF-0k] É]݊F< t g}t/UV:tPuhPuPS YYEPPEYY1ۅÉ]؀D}t=U@t"=#t,uPmYYuPYYUEPjYYmDžPPYYF5"'YPPh uPYYEy&5"YPPh }t=#tuPYYjh5" huh EȅuuQYUȋrEEEU9UUU9Us U+UŰUUuV5"V EujrYU+UỦuփ}ɋEȋU9u/}uUuruE 9EtEEUȋrEY}t"}uUuru 9EtEuYYtDDžPPYYy!5"@YPPh }t#5"YPPh jh5"c EWhtYYj5Y_^U VWuEPu YYy5"YPh GYY1=1u}9>}.~t vYWtYF~uh Y1>_^UVU "FuV P{YPP5"k =#uPOYPPjC ^Uh0hYYUV5Nx  #^U=tu<YUVU9wU9v" 16V0Yt1'rF5&Y5^UVW}u1E}UUs" 1=u8j Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVu~  u"6EPFYEU UEPEPV yE^UVux95|dp^UVW5# Y!DžD7uYYtw>t6uYYt} tu w YYu=#uy _^U@VWEuCLEf#M сf }|h(YEuEE0YEu!]3hh EEEJf} fjuYYDžy'5"[YPuhh#7E!ff## # فfM#U fUURUEPh0n@W ƅy9=":u WY5"YPhh{ EEPh0n@W ƅy$5"mYPhh8 LEEPh2n@WZ ƅy=" ujqYy =" tʅy-=":t$5"YPhh y M}0}uhthYY}u?jhpW =/5"YPh\hS gjuYYEy'5"QYPuhDh-E"ff## # فfMEPh0n@u ƅy$5"YPh h EЅy$5"YPh hm }jDYjj YYj1YEEPh3n@uh ƅy=" ujYy =" tȅy0=":t'5" YPhh j[Yx jOYjEYj YPhEP EP!YPEPW PEPYZ9t$5"}YPhhH \uYPuW uYPuW uYPuW jEPWC =t$5"YPhh }t5jEPW =jEPj  } u}UEEPh1nu ƅy!5"gYPhh2 IfUf## # ف|hthYYxWY}x uY_^U8VWDž!#$%&'()*+,-./0123456789:;Džu>tF>.uu +UFG-A=s FPjYFG} t1hDhH YYE}t;uuPuuuY1u}Y=u } DžuYu rPYYh8PYYh4P YYEu]UPrpYYu0tB9uuY_^UVWuhP > t2> t-> t(>t#-A=s PYFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPuYY/1_^UVW} }uWu]YY1ۅÉ uWu t1Wu*YYu U:t1=t1=hhYY=u1j.h0 YYu1Tր>t-A=s PYF݋UUR5N YY1ۅÉ_^U$UUEPjj y U\1UVW5\\}׃}~9r }y 9vWYu_^U=x 5YU=x=u j5YYy'j5YY Pj5} 1U^UU=u/hh5 1V=u1< = uUUU:u1: t ::uҋUEUV=yy1u1txtjƅtjjV fLƅtjjV /t!yg:X^UV%ƅt F9Eu^UV{ƅtu6" YYu[^UVWuU VVue YYDžt~~yVډ"F_^U$UUEPjj U(VuEEV֋RUV֋RU \E wGUUU UEPj7jB ^U(VuU @t*ub YEU UV֋RUUUEPuT(YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE40EPjGj U} v"M E 1U} v"M ҋE!1UE1UE1U} v"M Et1UVW11}U9 u  F߃| jugYtUrYtURtUzt r6Y}t}t}t uY_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv) =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv.) =u N /uvv- EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h[YF~uN NF 1}9< t, R@t Bt 4 YGƒ~uFFF VVv vv% >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E AU :t! EE E fAU uuuYYEy@Ut8hu1#YYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU E_^UUUuuu `, UUURu hu'UUURuu uUEEUUUUU JUEPuu+ EUJUx ]E EPj02YYEUuu hu!!3!O!!!###$$w$$%''(/(((z&USE] ![]USE] ![]USE] ![];UVW}u M+4^4UW}0))ϊE tu1_]XG_]>4UVWY4E_^]^4L$ 3UW}0OE uG_]1_]UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+""}t}y UU_^UUAs UEU8VWEU UUUUfRf## # ىM؋UfRf## # ىME Eu }}`uuVuu[ Džy#1W΋Uu{YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt # #1+EEEEEM9uuuVuuKDžVA YEV4 YEV' Yǃ}u@ց}sUEEu=YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u UuuXYZЉEE1UU!s-UEȉEWVRw UUE;}tEE #1_^UVW}-0= >N>.WY$=u#1=$X-0= r>.uF\hPjjWV y1jPi _^UVW}}t1PGPGPGPh PhPj jP Ey1HjuP ƅu1*UVU V $$_^U Vjh4 YYƅyHu uV EV>Y}u"U JUj u@YYEt1^U=uhH hL uYY 5*YU #U=t5FY#UVW=u!hp ht YYu1D5hh(8 Eu1U:#thl u YYƅtU,!hh uYYEtEU: t: uEhd uYYƅjFu+Y%f## # ى 4!58!t3> t> uF!s7h\ VYYƅtF,!_^UVW}Utu >t]9uFG1_^UVuEPVYYtE"^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E1} tF=# # ً# ʋ # ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U @0}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F! ;.+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U n->u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW#u#=u hPjjjuu ujz'$ƅ#uuVPƅy#}Gu^fWf## # uL0#7#+##W +_^UVWE#u"=u N"#uE>t >.uEF}u)uYƅtuuuu V_}u #€u$}N>.#$?quuuu 7uE~=";u#l=#uE=#t =#u#t놃}t"uuuu ju%E~}t #_^UVW}} uBWY-Ɖ:.u#sVWP- Ƅ5*"u hWhh P%uuuu_^UVWh YEth uBYYEu1EuhPr >tuF>nuP. YYuFu>tDG?tuG1҈"hVh!% uY! u~Y1_^U@VWEEEUUЋUUE=#u]=u #u } ~1EUffUE#9UYE#9U;}Dž#U=y2UMEPU#P4#w =#U f## # فfMjEP5 =t$"U5uY^u u5 9E t$"U52Y}fEU܅t2EPW5` ƅ~U)fUU܅tB"U5Y}<}EM}ff## # ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$"U5YUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yy"U'UMU#P4#u u5(9E M#Uԃ}~ Eԙ=#Eԃ}Euuu5E=u="EEUM9u# u+UBt"5_YE}t#t}u #u5YEaEE=x5Y}u}u ";"= Uȉ"_^U=t5YU$VWh4 PYDžu( jWYYƃu"EE1UUfU fUEPh0n@VV E=u"EVYGEEPh2n@V E=u"EVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWhL 0YDžu@ jWYYƃuEE73EPh@n@VR E=u "UVYU"_^UVWURYƅu" wUWfUfW fG #UfWuu FPq URVu E"UVY}r UUU"E_^UhaNjYYj YUVWUR-YDžu" haNjYYEuYEURWu Ƌ"Uxw7~1WYj}YujBYYuhYU"@RGPu L WYj7YujYYu"Y_^UVWEEPYNjE E PzY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^UVuYƋU rU MJwU uRYY^U$UUEPjjK U$UUEPjj+ U$U UEPulYYEPjj U}u" UEuYuYU$U UEPuYYEPjj U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0GYE9uvEEEЃ E V!փ}u s"KVYE=u"&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0:YE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j~ RyY_^U$EPjjQ U$UUU UEPjj- U$EPjj U$EPjj U$UUU UUUEPj6j U$UUU UUUEPjj yEU$uYEU UUUEPj'j` U0VWEPuPYYy1U؁@t"1huYYDžy1EPWYYxS"U؁@u7jW(YYEx& PjW xh$sYƅu"UWYUЉ"1FfFF_^UVWuu" 1FQh^ SPM fF^1FfFV VF=uFF~u~. VffGVjRGPT GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V""5"h"jKj ^UU$VWEPz YEPEPjr jLYƋ}t9uvEWEP7 YEEPEPj W YUUjEP YYEP YWjYZ)‰jEPj jEPj t9r)օu j YVYU)_^U$u&YEUUU UEPjj U$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U X #}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEp ^uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U mEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEИ UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE }E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }:+~y UVu CV€tu ,fNV~u>5H Yt.h蠳YFu NLNHF 9hrYFuN!NF V@uVVVhUFt$jjvr =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvc =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`7?G UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWME_^]UVuj jV ^U}x}~uPlYYUUas U EUh hRYYj֮YU VWDžDž#####jh2YYu#g#Jfh YƅthVh# h h YYE(uhP; jh P _u> t> uF>t> thVh# j h#YYƅtDždjh Pd 9> t> uF>> hVh# j h#YYƅt#$7E>t3$s+> t> u E}t 7EFȀ>t > t> tFDžoj h Po Q=#D> t> uF>(> ##PVYY#ff U##uؿY=#u"#ff##=#u=hPYYu&j.PYYƅtFPh#LYY]$##E>t >.uEF#}|$sj.VYYF7M #1_^UFtV]YU )uRv EVt tfVV}u1_^UW}E Mr/u'uĉ fE_]+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPndf#prtK%s -f %s. -p -rcp%s%s %s %s%s -t %srsh %s -n %s %s '%s@%s:%s'rsh %s -l %s -n %s %s '%s@%s:%s'.. -d -p -rrcp%s%s%s/dev/ttywho are you? rcp: shell/tcp: unknown service tcpshellrcp: %s: %s. rcp: invalid user name %s -csh/bin/sh@Krcp: %s: file changed size C%04o %ld %s T%ld 0 %ld 0 rcp: %s: not a plain file rcp: %s: %s E %s/%s%s/%s: Name too long. ...D%04o %d %s T%ld 0 %ld 0 rcp: %s: %s 0 ) 6 6 rcp: lost connection rcp: protocol screwup: %s rcp: %s: %s rcp: can't set times on %s: %s rcp: %s: %s rcp: can't set times on %s: %s /%s%s%ssize not delimitedmode not delimitedbad modeexpected control record%s atime.usec not delimitedatime.sec not delimitedmtime.usec not delimitedmtime.sec not delimitedlost connectionunexpected '\n'rcp: ambiguous target rcp: malloc: out of memory rcp: fstat: %s Usage: rcp [-p] f1 f2; or: rcp [-rp] f1 ... fn d2 unknown errorunable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equiv'f''f''f's's's'-at-rO-w^--+-b-No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0%u.%u.%u.%u.in-addr.arpa/etc/hostname.filer/etc/services ,/ # r/etc/services}=}= =&=G=>>>@@@A;AA`CTC`CHCtG7ptx|F6M됃=xt thh$ YYDž0Dž4Dž8' Dž<}0PhS@YYuh$ iYW1 EPYjoYPEEPEP 5EPYL=u:UBlMuuuuRQhh{ jYGu ujY=t=ptLhWYY$LPYyhhYjYLPYPEP 5EPhPj@TP}\0uƅ\ TPhLYYXPPTYPEP 4=pt)UBlMuuuuRQh, EPYjY_^Uu5hh-U UVWuEPoYEEFjEPjK  jYE1= thhYYj1Yj /Yuj#Y9EtEG|j YFjYFjYF jYFj YFjY9jjY9FYjY9FHjY9F 7jY9F&j Y9Fj oYuFvYFvYFv YF vYFvYF6YN~P}Fd=|t ~d}F_^UxujpYYjqYEbEUVWu=xtj&j YYjj YYj YǺ Rj YYF=|t~d| VVuOdFRYFvYFv YF vYFvYF6Yvj qYYvjeYYv jYYYvjMYYvjAYY6j6YYj YE pPj YYWj YYuj YY_^UujpYYu jqYYUUk #U‰U EPEY ʉUhhYYjYUV5Nx  ^U=tuYUVWu^Yƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP.>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW<YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWWYZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_U U V Y=VhYYVh`wYYƅ>-uF>+uFjVEP ƅUUj h`5 1`Vh`YYƅpj h`5T `>t>,tjVEP ƅt5U>t'>,u"FVY=xwVh`YYƅu_^UhYPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J44EU M R+Q¤ЙЙUuW +UЙOIkkE04UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy@UUU:tEG9tU:u?=tȋU=U1U=l2=kEt Eu E@k PYƅu Ul:2ul2E u4@k lP2YYƅu.l2J]1_^UUUuuu 0 UU Uhuu 3; o  UU1]UU1f]UUE ]UUE f]UWU} M_]UWU} Mf_]UVUu M^]UVUu Mf^]U]U]UW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]UVWlUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh4u%dEuEu1k0Z‹NCEFGHIJKLM9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y UP1UVW5PP}׃}~9r }y 9vWYu_^U$UUU U5EPjMj? 6EPjMj- $LUTUVWuU VVuYYDžt~~yVډLF_^U$UUEPjj U$UUEPjj U$UUU UUUEPjjW yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUE$3EPjGj U} vLM E 1U} vLM ҋE!1UE1UE1U} vLM Et1UU$VWEP YEPEPj~ jYƋ}t9uvEp&EPYEEPEPj WYUUjEP YYEP YWjYZ)‰jEPj jEPj t9r)օu j YVaYU)_^U$EUEPjj U$EPj j y}tUEEUVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"Ud)EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UI JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P+E6U U RU U RUEEE9 E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }7~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvr =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvc =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MU}x}~uPYYUUas U EUhLhYYjYUVuYƋU rU MJwU uREYY^U$EPjj U$EPu6YY1ۅÉU$UUU UEPj%jI U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V  5 hjKji ^U$EUEPjHjE Uu hT$u9 U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvZ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j {sƉKI|;u[u P1ۇXtPXP2Wnw%04d-%02d-%02d %02d:%02d:%02d %s %a %b %d %H:%M:%S %Z %YNot allowed to set time.stime(%lu) readclock: Invalid time read from CMOS RTC: %d-%02d-%02d %02d:%02d:%02d TZTZ=Time invalid in CMOS RAM. Reset clock.CMOS RAM checksum is bad. Run SETUP.RTC lost power. Reset CMOS RAM with SETUP.CMOS state = 0x%02x CMOS RAM error(s) found...Machine ID byte = %02x Machine ID unknown.Permission denied./dev/mem%s%s readclock: readclock: CMOS clock appears dead Usage: readclock [-nwW2] SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ%~ABRHIMvSUWLXY#ZMab'c}dj*mPpw(xy%H:%M:%S%a %b %d %YPMAM%a %b %d %H:%M:%S %Y$F$I$M#S#u( (@N(r)X[)b@)dR)iR)oI)p[)uR)x[)K* <*#A*+7*-2*0F*=-L%+h+l+C+E,G,X/,b/,c,dm,e,f,g,im,n+o/,p/,r-s+u/,x/,(null)cannot print floating point GMTGDTU U tldXLD8| SSSSB(   %,-1$T$Lsu;SSSSu QRP, P UVu 8-h8-vYYV:-u%RY8-h8-vYYvh8-YYh8-vYY]V:-u*RQYv h8-YYh8-vYY+6hh j Y E#1^UVu>tL:>.%Ph|hp D#F^U,VWj Yju YYDžyuhh$ EjuW 9Ethh YYjDh,W{ =Dthh YY-Ɓtu 81 81t"h$tuhhn gEPjW_ yhhD YYA=t(,,,PRh2 u EPW _^U V,,U JЙ=81U JЙ=81fjPVuu#j Pu4 1E Ph(hU ^UDVWE=th\u u =utF/FU RU}Puu uUщMu mUIM~U9scEPPuD yjGPV+ FUЁ@uVEPu VEPud vN=u U:thD Yu uIYY=tJRYh@ Y_^UVWu E=tu1:=th8-Vu =t1jum YYuuhth  Ru^ YYEyuh`h |~qUщMPRVumyuYRvhPu WPu uYVuYY1_^UVW,U,+UډUs;U  r,UUjuuuljsU JMbU JM,QZUjuuuDžy1U BM1,UUjuuuDDžy3U r,UUjuuu lj_^UVW} uhhYY}x}|uu u iE(E11}"iEU 9uiUGمuHu1}!iEV9P} iUGڍFPu u< y*VU hFPu 1_^UViE jVu> 9uhuu7 =u1u hh{ ^UVu F ^PSu  RuYYVUUEPuYY^UVu  ЊM uu-E ug-EU:t5Yuh YYF ^MPES]RQPSh nVNPPhd aVNPPhB F1Ph(YY&uhYY"Jx hj /YY^UVuJVZ~/Jx hj YY^UVƅu8juh@hHjuh(h0j=Y yEPY9uE^UV5Nx <1^U=tuYUVW}Wu u ƅ~9})׉U U 1_^UVWu }"~y UVu CV€tu ,fNV~u>5` Yt.hYFu NLNHF 9h^YFuN!NF V@uVVVhUFt$jjv =uN ?jEPvT =tN V@FF t V 9ډUVVFt$jjvI =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu , UU Uhuu  /c{#/ [ UVW}u MUVW-E_^]UVWME_^]UV,U9,wU,9,v| 16VYt1',rF5,&Y5,^UVW}u1E}UUs| 1=,u8jlY=u1V!փ5,5,FE5,OVU}9}r69v2W9UvUW~>}t E,u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=,<9}r79}u+UOJ}t E,URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15,t 9ur6E0tU U,tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ|F_^U$UUEPjj U$U UEPu`YYEPj!ju U$EPu:YYEPj jO U$U UEPu YYEPjj! U$uYEU UUUUUEPjj U$UUEPjj U$U UEPuYYEPjj U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s|KVhYE=u|&UEUUU}׋U UE8t=+UEEE0 YE܋]P3WQ }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGuA YEuUUȋUUEEEPj;j R)Y_^U$EPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uj YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$um U$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U T }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEl: uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UI EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UiJxUʋFF Vu~YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEДUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEYE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFUWXYFEEVPbYY=t6JxEEFFEEVP,YY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP~YY=u}t UډdZ}~UUM#JxUʋFF Vu!YY=u˃}t Uډ E_^UVWuEu41}%<,t4,YtEG֋E ~tV€uFu1V€cE~tVuډUjuv] =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<,t,Bt 4,aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UUas U EUhh~YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UW}0ʀuA)_]+C;Cw Ë[ uӅu P-KI|;u[u P{1ۇtPXP`{Usage: %s [-li] [dirname] ]DTIDL;dTiDl;Bad flag: %c boot %ld %d cannot get inode of root directory %s is not a valid MINIX filesystem cannot read superblock cannot seek to superblock cannot open %s cannot find inode %d $ ..Mkdir %s failed cannot create %s Will not create %s: file exists get_block: NO_ZONE requested ! read block %d failed   @ ` %s %ld %d %d %d %d%c%c%c%03o %d %d%-14s Mkdir/usr/bin/MkdirMkdir/bin/Mkdir @Xbdiopux #+-0LhlEQG<Xbc#deQfQg<in oprsaux(null)cannot print floating point ,-cdbSSSSB1  !<F1$T$L$su;SSSSu QRPPUhh\ YYjYUh@jj 5<jjG 5) Y5 YjYU RIFFWAVEfmt 8f0f  f"$"£("f,4datajj5q jh 5 jh 5o jh05Z jh45E jh850 UVW} }}U:-9ujhP4T uRYajhL4# uRZY 3jhH4 uRDYFQ9uuU=t =u*=r=Dw= t"= th4h\p YYjTYjh( YYyhh\@ YYj$YEPhs@5 uYEuhh\ YYjYEPhs5F h hs5. hhs5 hhs5 =u1hhs5 hu YYywhh\> j!Yjj.5 5h1 YY= uPh YY5hYYh@jS YYh@hd jfjjjYY<hrjYYhdjj  <Rjj hhqYjEPj =u} uh@IYjEPj =u} t3uu5v uu5z U858h(YYjY_^UVuj jV' ^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5Nx ^U= t u8YUVU9wU9v( 16VYt1'rF5&Y5^UVW}u1E}UUs( 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVu~  u(6EPVYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+("}t}y UU_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ(F_^U$UUU UUUEEPjGj U} v(M E 1U} v(M ҋE!1UE1UE1U} v(M Et1UUUuuu  UU UhDuu s#'fUSE] ![]USE] ![]USE] ![]UVW}u McL$ U$UUEPjj U$UUEPjj U$U UEPuYYEPjj] U(VuEEV֋RUV֋RU TE 7UUU UEPj7j ^U$UUU UUUEPj6j U$UUU UUUEPjj yEU(VuU @t*uv YEU UV֋RUUUEPu YYU UEPjj7 ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjQ V5hjKj ^Uu hT$um UV& T$@, T$@% T$@(E GuVu# ^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 7}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEr uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U( JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEH E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~Du>5HpYt.hYFu NLNHF 9hbYFuN!NF V@uVVVhUFt$jjv~ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvo =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UUas U EUhh\YYjYUVuYƋU rU MJwU uREYY^U$EPuYY1ۅÉU$} uEEUUE UEPjJj! y}tUEEUVWuEu41}% tF苕F=0|=9VY13VY-H8$u J Džh(P^ YYDžu9j/uhP0 hP, YYDžu1DžWi YWhPi uV/u *t6/u /t$(u *t-u3-u* t #u Džt&KVP -tkjW 9t7WhP{ hPj YYWF YWhP' hP3 YYWhP ~2#t)j{PI YYuhP YYWpY1_^U\VW=x uhYDžuH?u?t ?:tFG?:uGh@. YEUU9s2H8/u(Uuh8R u UBډ΍U9u.FEPuYYƅl=l t>h4EP YYtVj/EPh,6  hVYYVEPYY1_^UhhYYhhDYYhhYYhhpYYhh_YYjgYUVu>:t>tF>:t1~:t^UdVW} 9u:-l ztp lF9u~p VOztt 4F9u~ t !BFEB9Ut4Yx =p t<45p hEPx EP'YtjY=t t<45t hEPBx EPYtjYx 4YtjYjY_^UVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^UV5Nx | ^U=tuYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW11}U9u F߃| jugYtUr YtURtUzt r^ Y}t}t}t u: Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv= =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv_ EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFD FF VVv vv] >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E VU uuuYYEy@Ut8huYYE~" tuKYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UVWu }E?t:JxG^FSX GVPEYY=uEE_^UVWu1fϋV€t}u ~tu>FtVYU )uRvg EVt tfVV}u1_^UVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^UU Uhuu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjhYYEUuu hugUW}0))ϊE tu1_]XG_] UVW%E_^]*L$ UV\ U9\ wU\ 9\ v0 16VYt1'\ rF5\ &Y5\ ^UVW}u1E}UUs0 1=X u8jlY=u1V!փ5X 5\ FE5` OVU}9}r69v2W9UvUW~>}t E` u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=` <9}r79}u+UOJ}t E` URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15` t 9ur6E0tU U` tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U41UVW544}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ0F_^U$UUEPjj U$UUEPjj U$U UEPuh YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*uNYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4 uVuu+ ƀ}Xu9utUP3 YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U| EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~u>5Yt.h8YFu NLNHF 9h YFuN!NF V@uVVVlnophUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhdhYYjYUVu@YƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UUUuuu  UVW}u M)9r/r uu fE_^]t|U$UUU UUUEPj6j KI|;u[u P1ۇ<tPXPrtags%s%c%sr%s%crefsr%s%c%s.tagstags.:/usr/include:/usr/include/sys:/usr/src/lib:../lib:/usr/local/libTAGPATH. -c Class tag might be a member of class Class -f File tag might be a static function in File -t output tag info, instead of the function header -a function's args may be flush against left margin usage: ref [-a] [-t] [-c class] [-f file] tag cfvtg%s::%s%s:%sO a< r w& +s bi - @*Xbd i opu x #+-0LhlEG|Xbccd%efg|i%nKoprsux(null)cannot print floating point h ((((( AAAAAABBBBBB SSSSB   J(#11$T$L su;SSSSu  QRP,1'P+U5 ".YPuhh 7 UuYj*YUVuu u A+Y u VB,YYƅu'5 -YPhh z7 ji*Y^U}t u-YUVL1 2YL1 ֋уuiL1L1D09 uiL1|/ ^UVuI8YPjYYuV8YY^UVuVRjYY1j6VYZ^U VW}u 7YGE9GsEGw7YYw1Eu~/uNU :t,:/u E}t /FEU FE ̃}t97u/F+W_^UEU Mj0QYZUU 9 w R5 YY  &Uu1 U U VW}U26tEU6uEUE:tWYE8t EPY7UrvD6YYօuUU}U7}u_^U VW}u]5YEu1{uV5Yƅt8~.u~t~.u~tjjYYFPYB?u4Y }tE8t EPYE_^UVWE0E~VYWY_^UVW}1҉WWGGU J@U B=U B1|UE0t"U JV9u^ U  9tuՅXjjYYƋ]wmYFU fRfVU ffV U BF  B V VWGVWF HF ~ uEvYVzYG_^U L1=(hlY5P1hlYYjjYY0jjYY00h8zY0BjjYY,p(=$=@t=$;h$Yx(9xu9B(R50YY0(R5,YY,x 0$$x ,p*x 0<u=xu1m x֋x0RY8x ,4hl;YY58hlYY=xu <4, l <9/u<x4@EP5lj1YYy8=xt =  @5l{Y4=@1t< =u fUf E 9t@4AUfXfUfZE\U`UdfUfhEPh4YYU@uMT5lY$=  @5lzYUuTdU`u TFU u T(Uu T @4UT1R t 5X1YUVUJփ|IT1T1:x T1X@5T1j *YY=u벅~GT1T1:x T1X@5T1j =*YY=u?N^UVWuU UU υW ~\uWh<V- V t117JxʋFF VW)YY=u1 E뙸_^UVƅ6Yv5T1VYYu~ v #YPh5T1L- XF(^&PSF$Ph5T1#-F(^&v0v,PSF$Ph5T1,F4^(N&PSQF$P~ ubcPh5T1,ZF(^&PSF$Ph5T1,6hx5T1~,YYv5T1DYY DF l>g~tvhp5T1:, ~thh5T1!,YY5T1j 2,YY=e[5T1$Y^UVWu=uRjYY 1JxFFSXV(&YE=u} k} }hh n+YYj^YEP5 WZYZ9=uR5 gYY a}uV t1u1  _^UVWE0] UEUEDž { rF\u51E}}&-0=s-0 FEԉUщMUU9UueuuYYEoUUE0UE UE_^UV1U: t: uEU:95u`BR5YYR5YYjjYY PPEP FTE E0^UVW}fG EgG ETG EDG E4G E $G EESX;UtEjjR %fG$UPV9U }1Bj juVZY4 fG&Bj juVZY4 G(UtIV9U }1Bj juVZY4z G,Bj juVZY4] G0Ut0B9U }1JBjjuVZY4) fG4U t B9U }1BuVZYW1҉WW9u Bj juVZY4 E1UEUt M9JtU}u6j jfYYE]EUMJwYUBURWG9u ~HBh4uVZY4(YYt14Ur^YEEu7YG9u t1_^Uu5X1h<h l&j[YUVWL1T1Ru5T1MYƅu <11>t> uG> u W!F~=u==u1 =@E=t 9aUEPEPV }s 5Y=jE:/t 5YhYhlhYYRjzYYn9vR53YYJ 4hYYE0h0YY EUhdr%YY1ۅÉt.UMIRQh u 5Y_^U\1R t 5`1;YUVWu} u1nu `9~1S9~ Cwv$YYEy1(}~ ~ u tW V W 9V t ~u ~tu wvt$YY=<1tW09V0}:W,9V,uW09V0t kF4_49t UW$N$9uF&_&9u F(_(9t,*wv#YYtpF 4_^UUz =<1h5\1S"YY"Ur5\1YYu\1\1:x \1X@5\1j YY=u=H1tUrhh ! UVu ~ h5\1!YYwv5\1nYYu^F(^&PSF$Ph5\1i!7=H1t3UN$Z$9t$F(^&PSF$Pvhh (!^U@VW} =D1t &h@Pu! ƅu 1 \1\1:xʡ\1X@ 5\1pYY=u4ONuTk \1\1:x1ҡ\1X@5\1jYY=uOuu 1_^UVWu ~ ~h5\1YYwv5\1nYYu^5\1j YY=uCv5\1:YYu*5\1j gYY=u=H1vvhh h5\1YYv5\1YYF(^&PSF$Ph5\1=H1vhh  oEPY5P1EPYYvEPYYjuYYEy)uEYuYh5\1/YY F(^&v0v,PSF$Ph5\1v,uYYu]= uYh5\1YYudWYP5\1YY5\1j YYeC=H1t:v}uHUN09J0~TLPh\h MuYuYF4^(N&PSQF$P~ ubcPh45\1=H1vh(h  F(^&PSF$Ph5\1=H1vh h  kh5\1yYYHv5\1?YY35\1j pYY=H1t'vvhh 0 F 2._^UVW,Dž~qVgYF {ԃ~ u u uV>YWVYYF  WVYY>WjYYzWVjYY}-h5\1YYY5\10Y_^U(VuEP6YYy= 6YU@6YE؅u= t 6YVU܃}t'EPYPV'YYVkYuVYY6HYy 6YR=H1tI6hh l 36(Yy 6PY=H1t6h h 7 ^U1҉UUEPuYYy uY8uhDh  u } u@ Ph  U VuEPVpYYy VYUM 9tDE PVYYy VyY=H1t}tVE Phhh SE]9uE]9UE]PSV y= t5V Y,=H1t#}tE]VPShXh ^U@@VW}  eEȿS0kYYx$ u̿t uHYE0G$PVxz{|}~YYy VdY=H1Vhh E W,UEfDž̿ȿPVYYx̿sG$PhAV{ Ey)W$ʀRV(YYG$PhAVN E}yVtYG$PhAV+ E}yVY1}}\1\1:x\1X@ 5\1Y=uMU9t}u}x<)QPu yVYu/YEA}t[\1R t 5`1Y\1Rt5`1hh k t jV&YYjG Y}yjVYYuY=H1t8̿Vu9W0|Ph  jYW0ĿPVYY,VY G4W$`PRV y VY=H1G4_4QSVhh QG4W$ PRV y V"Y=H1G4_4QSVhh dW$jRV` y VYf=H1t5Vhh   &VY5xG &G(_&jPW$PRV_^U@VWu }EPWYYy W3YEP6YYx4UM9uE]9rVYEP6YYyZ6W\YYy.5 YP6Wh4h  =H1t6Wh(h _^Uu5`1hLh sjbYU`VWEPYEPY5P1EPYY5P1EPYY}\1Rz5\1!YƅdEPEPV }uVRYWEPYYEh0YYw}sV YUrEPYYUhrYY1ۅÉ]u%UMRQEP uVYEPEPnYYEh0pYYu-}tVYUrEPYYEPYEh0.YYuN}tVRYWEPYYUrEP6YYUrEP%YYEPuJYYyEh0YYt}tVYUrEPYYUjj jr UPj jr  UPjjr %PuMEh|0>YYu3}tVbYUrEPRYYUruYYEhx0YYu}tVY VYtj_^Uhh ~YYhh mYYhh \YYjLYUVW}9U :-U U:-u zuFvU:dO4181<1@1D1H1!룋EE$!FV=41t=81t=41t=<1t=41u=81u=<1t=81u=D1t9uBu VZYP1=41x9}Bu VZYX19tPT1 h5X1YYt'h5X18 YYT1u 5X1Y]=819}Bu VZY|X19}Bu VZYx`19tT1 ht5X1_YYt'hp5X1 YYT1u 5X1$Y\1 hl5`1YYt'hh5`1N YY\1u 5`1Ys9}Bu VZYd`19t\1 h`5`1YYt'h\5`1 YY\1u 5`1eY5 Y_^UV5 Nx d1^U= t u8 YUV1U91wU191v 16VYt1'1rF51&Y51^UVW}u1E}UUs 1= 1u8j`Y=u1V!փ5 151FE51OVU}9}r69v2W9UvUW~>}t E1u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=1<9}r79}u+UOJ}t E1URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb151t 9ur6E0tU U1tU9ru NJEtU9Wu RWE_^UVux95 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuQYYDžt~~yVډ F_^UVWuEu41}%<8 t48 YtEG֋E ~tV€uFu1V€cE~tVuډUjuvm =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv+ EU9Uu1 N _^UV1}*<8 t8 Bt 48 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<8 t,8 R@t8 Bt 48 }YGƒ~uF1FF VVv vvq >uNN FFSX_^UVW}Wu u| ƅ~9})׉U U 1_^UVWu } 2~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv1 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<8 tN|1DFρECEE0-EMP1E E 3U :t! EE E  U uuu_YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu uNY1A!uEUMJUzUBU8 E_^UUUuuu h UVu JxUʋFF VuYY^'?c/oco#{USE] ![]USE] ![]USE] ![]UVW}u M2UVWME_^]RU$UUEPjj U$U UEPutYYEPjj U$uYEU UUUUUEPjj U$UUEPjj U}u UEu\YuYU$U UEPuYYEPjj U$EPuYY1ۅÉU$uYEu YEUUU UEPj j U$UUU UUUEPjj yEU$u2YEU UUUEPj'jD U$uYEU UUUUUEEPjj U(VuU @t*uYEU UV֋RUUUEPu8 YYU UEPjj ^U0VWEPu,YYy1U؁@t 1huKYYDžy1EPWN YYxS U؁@u7jW YYEx& PjW xh$Yƅu UW&YUЉ 1FfFF_^U$UUUUU UEPjjs UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP@ GWBVVFWB)ډfFWBV4_^U$EPu YYEPj(j[ U$uYEUUU UEPjj$ Uu hT$uQ U$EPj j y}tUEEU$EPuF YYEPj j U$} uEuYYE"E UU RUu5YEUUEPjjM U$UUUUU UEPjj# UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U , }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EED uVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF Vu,YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U )JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEl UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPxYY=u}t UډJxUʋFF Vu0YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VumYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUht h YYjYUVu8YƋU rU MJwU uRYY^U(VuEEV֋RUV֋RU E oUUU UEPj7j ^U$UUU UEPjj U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPremsync: %s: %s remsync: Out of memory: %s //\%03o  = j j last %lu -> p%03o %u %u %c%03o %u %u %x %03o %u %u %lu %lu d%03o %u %u ignore (%s) remsync: control character in data file! p-`b-c@dpPlastremsync: %s: syntax error on line %lu ignore/4iirm %s rm chmod %s %03o %u %u %03o %u %u chmod :%%ln -s %s %s -> mkfifo %s p%03o %u %u mknod %s %c%03o %u %u %lx addupdaterestore%s %s File changed when copiedold %03o %u %u %lu %lu ignore mkdir %s d%03o %u %u add ln %s %s ln Vkend rm %s rmdir %s due to a remote problem: %s made %s look oldchown %u:%u %s chmod %03o %s # "#m##ln -s %s %s mknod %s p mknod %s c %d %d mknod %s b %d %d add %s restore %s update %s remspec: %s: premature EOF mkdir %s ln %s %s remsync: ln %s %s: %s remsync: %s: syntax error on this line: %s endoldchmodlnrmignoreadd remsync [-xv] tree [diff-file] remsync -duxvD tree [state-file [diff-file]] Usage: remsync -sxv tree [state-file] (D(df(sZ(ur(v(x~(r--w-r---w--unknown errorK7a87r7w"77+o7be7No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0@ E@@z@AXAblAd~Ai~AouApAu~AxAwB hB#mB+cB-^B0rBiELQCh;ClFCoCEEGDX[Db[DcDdDeEfEgDiDnCo[Dp[DrIEsDu[Dx[D(null)cannot print floating point IIIIIIIII01|/D0SSSSB  1 ((((( AAAAAABBBBBB Unknown error$  t h D 4  t`L<,|hL8 $ xdP8$ C  b3h1$T$L su;SSSSu  QRP" P UTVWu 1҉UUE1҉UUj/6%YYDžtG>hHW%YYt}}u}~V:-t UEUM+Mh<RQ E=aR,"4"0"E5B Y$ 듋BU끻pE`U U+ U ΃}uEu~>tt$EPYEuh h,F"YYj:Y}uEUE}uhh YYE}uhh,!YYjYhhYDžtPP$ EEPj#YYu+hP#YYu9YPP#YYh "hTj"# hj YYEUjSu0rEP ("yj'YEEPh6n@5("" E=u5 YPhh, u"Y_^U(EPj"YYEPh8" ^EPh\" ^\"Uf\"^"f^"b"ↁfb"jjYYh jYYh jYY!"=u'5 YPhh, jY="u`jxYE؅u"hxYje!Pw!YYjYj!YhdYj;!PM!YYjYhjYYhPVYj(YUu uYY=u juYYUjY="~7jjYYj 5" YYxEP YE~9"uuYUVjEPj ƅt.x95"uދUt֋Uʃ S_Y^UVW1jEPjC E}= UUt"1=4"Z$ 9UuN룅tC1}.t H"9UuuY$ 9Utjh$ 5(" UUjEP5(" u hYLL"9Ut0H"9Ut$K"9UtP"9Ut } t} u1_^U VW}u $ F } ^FW@Fu ^F?FF F FU)QEPj _^UVW؉E"-"+"؉E~9"uVj Džy= tø:뱾"""h h"5("< "u1="c= V= >uREEPh6n@5(" =$5 YPhh, |= ?uOEEPh6n@5("x =5 YPhh, $5 eYPhh,t _^UV8"\" ESYVjj) ^Ujj YYh( YjYUuh<h, UhLhPhTh,jYUVWuVtY=uT>\u=|83FjjV EF>uU&=0| =8~hNYb_^UV1<, t!U9( t9( u , Fո^UV5 Nx B^U= t uXYUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVu~  u 6EPYEU UEPEPV yE^UVux95^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UVW5C8#Y#DžD7uYYtw>t6unYYt} tu w RYYu=Cu#_^U@VWEuC,Ef#M сf }|hphYEuEdE0 YEu!]3hPh, EEEJf} fjuYYDžy'5 YPuh8h,7E!ffCC C فfM#U fUURUEPh0n@W ƅy9= :u WY5 YPhh, EEPh0n@W ƅy$5 YPhh, LEEPh2n@WB ƅy= ujQYy = tʅy-= :t$5 /YPhh,> y M}0}uhh,YY}u?jhW =/5 YPhh, gjuyYYEy'5 YPuhh,-E"ffCC C فfMEPh0n@u ƅy$5 YPhhh, EЅy$5 YPhTh, }jDYjj:YYj1YEEPh3n@uP ƅy= uj_Yy = tȅy0= :t'5 =YPh0h,L j?Yx j3Yj)YjYPh,EP EPYPEPW PEPYZ9t$5 YPhh, \u`YPuW uEYPuW u*YPuWj jEPW# =t$5 "YPhh,1 }t5jEPW =jEPj } u}UEEPh1nu ƅy!5 YPhh, IfUfCC C ف|hh,`YYxWY}x uY_^U8VWDžDžu>tF>.uu +UFG-A=s FPYFG} t1hh.YYE}t;uuPuuu Y1u Y= u } DžuYu rPYYhP%YYh|Pf YYEu]UPrPYYu0tB9uu Y_^UVWuhP. > t2> t-> t(>t#-A=s PEYFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPuYY/1_^UVW} }uWuYY1ۅÉ uWu t1WuYYu U:t1= t1= hhYY=u 1j.hYY u 1T  ր>t-A=s PYF݋UUR5 YY1ۅÉ_^UVW= aU9 }  M :-u zu  M h4sYYu  M  ǣC:tWu YYƅ}= t=E h,0 YYh,h YYh,W YYh,j  YY M   :u  ? F>: M  C;t!A M  CB U9 |W= t=E h,0 YYh,h YYh,W YYh,j YY ?` A M B 7 M   :u  B_^U= x 5 Y  U= x=u  j5YY y'j5 NYY Pj5 9 1U^UU= u/hh5  1V=u1< = uUUU:u1: t ::uҋUEUV= yy1u1txtjƅtjjV2 fLƅtjjV /t!yg:X^UV%ƅt F9Eu^UV{ƅtu6 YYu[^U$UUEPjj* U(VuEEV֋RUV֋RU E EUUU UEPj7j* ^U(VuU @t*u YEU UV֋RUUUEPu)YYU UEPjj* ^U$UUUUU UEPjj) U$UUU UUUE &EPjGj) U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UVW11}U9Du DF߃| jugYtUrYtURtUzt r Y} t}t},t u Y_^UVWuEu41}%uNN FFSX_^UVWEE11}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV. uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUAs UEU8VWEU UUUUfRfCC C ىM؋UfRfCC C ىMELEu }}`uuVuu[ Džy C1W΋UuwYljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt  C  C1+EEEEEM9uuuVuuKDžVA YEV4 YEV' Yǃ}u@ց}HsUEEu9YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u UuuTYZЉEE1UUMs-UEȉEWVR* UUE;}tEE  C1_^UVW}-0= >N>.WYP=u C1=P X-0= r>.uF\hPjjWV y1jPi _^UVW}}t1PGPGPGPh P{hPj jP Ey1HjuP ƅu1*UVU V P P_^U Vjh YYƅyHu uV EVY}u"U JUj ut3> t> uF s7h VYYƅtFX _^UVW}Utu >t]9uFG1_^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E-} tF=$C $C ً$C ʋ $C ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U( ,}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!@ *+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UX )>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW0Cu =u hPjjjuu uj#$ƅ CuuVPƅy C}Gu^fWfCC C uL0 C7 C+ C CWp '_^UVWE0Cu=u N  CuE>t >.uEF}u)uYƅtuuuu V_}u 0C€u$}N>.0CLD?quuuu 7uE~= ;u Cl= CuE= Ct = Cu0Ct놃}t"uuuu ju%E~}t  C_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhh Puuuu_^UVWh YEth uYYEu1EuhPN >tuF>nuP. YYuFu>tDG?tuG1҈!hVh ujY uZY1_^U@VWEEEUUЋUUE=0Cu=u 0Cu } ~1EUffUE,C9UYE4C9U;}Dž,CU=y2UMEPUDCP48Cw =#U fCC C فfMjEP5 =t$ U5Y^u u5 9E t$ U5Y}fEU܅t2EPW5 ƅ~U)fUU܅tB U5#Y}<}EM}ffCC C ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$ U5GYUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yy U'UMUDCP48Cu u5(9E M(CUԃ}~ Eԙ=4CEԃ}Euuu5E=u= EEUM9u0C u+UBt"5YE}t0Ct}u 0Cu5zYEaEE=x5CY}u}u  ; = Uȉ _^U=t5YU$VWh hYDžu jWYYƃu EE1UUfU fUEPh0n@V E=u EVXYGEEPh2n@Vj E=u EVY E_^UVWuut.Vu ug Dž U)U U )΋E_^U VWh HYDžu jWYYƃuEE73EPh@n@V E=u  UVVYU _^UVWURDYƅu wUWfUfW fG #UfWuu FP URVuH E UVY}r UUU E_^UhDj|YYjsYUVWUR}YDžu hDj3YYEu&YEURWu` Ƌ Uxw7~1W'YjYujYYuYU @RGPu  WYjYujYYuY_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPUYNjE E PCY9uuąt9}t t1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuPYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډ F_^U$UUEPjj U$UUEPjj U$U UEPu(YYEPjjU U$EPjj= U$UUU UEPjj U$EPjj U$EPjj yEU$EPjj U$UUU UUUEPj6j U$UUU UEPj%jm U$UUU UUUEPjjC yEU$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPwYjEPje V""5"h!jKj ^UU$VWEPb YEPEPjZ j*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U ;}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE vuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UX EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE8 UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~u>5$ Yt.hYFu NLNHF 9hbYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UjjuY E`3USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVuj jVW ^U}x}~uP0YYUUas U EUh@ h,YYjYU VWDžDž(C,C0C4CLCjh ^YYu Cg#Jfh kYƅthVhLC h| h YYE(uhP jht P _u> t> uF>t> thVhLCp j hLCYYƅtDždjhl P$ 9> t> uF>> hVhLC j hLCHYYƅtLCLD7E>t3dDs+> t> u E}t 7EFȀ>t > t> tFDžoj h` P/ Q=4CD> t> uF>(> 4C8CPVYY4Cff UDC4CuxY=4Cu"8CffDC4C=LCu=hPNYYu&j.PYYƅtFPhLC YY]LDLCLCE>t >.uEFLC}|XDsj.VhYYF7M 0C1_^UFtV9YU )uRv EVt tfVV}u1_^UVW}u M)9r/r uu fE_^]t|UW}E Mr/u'uĉ fE_]{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pg1ۇtPXP115200576003840019200960048002400180012006003002001501341107550098?9EKLdel.rlogin: NWIOSTCPOPT failed: %s /networkTERMrlogin: login/tcp: unknown service. tcploginrlogin: unknown user id. 8EKLde:l:rloginconnection closed.connection closed.connection closed.rlogin: fork: %s. line gonerlogin: read: %s rlogin: trouble with not-urgent data: %s rlogin: trouble with urgent data: %s connection closed.rlogin: %s 8ELUsage: rlogin [-%s]%s[-e char] [-l username] host illegal option value -- eunknownunknown errorunable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equiv: option requires an argument -- : illegal option -- --"a"r"w"6#+#b #No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0%u.%u.%u.%u.in-addr.arpa/etc/hostname.filer/etc/services ,/ # r/etc/services 4 4333e545h7`7o787"89999999%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE/KK!K(KL iL@LMXMbMdMiMoMpMuMxMN N#N+N-N0NQLuOh_OljOOE)QGQXPbPcPdPe)Qf)QgQiPnOoPpPrmQs9PuPxP(null)cannot print floating point nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain`^i_"@(#) Copyright (c) 1983, 1990 The Regents of the University of California. All rights reserved. ~lh d0`@\PX`TpPLD<4,$ SSSS/etc/passwdB , ((((( AAAAAABBBBBB Unknown error p ` H < p`T@0 x`PD4 dPD,p\HChD  _,01$T$L su;SSSSuh h QRPL PU@VW} 1҉UUUUE1҉UUj/7g#YYƅtF7hV#YYtuE}u}~W:-t UEUM+Mh RQ E=t3$E΋X UE볻E^U }u  A  UąuG <u8}tWh!YYhhh`  jFYU+ U |!EPYEuhh` YYjY}uEUWYEE}uhhYYE}uhh` UYYjYEUhT uu0rEPEԅyjpY=T yhdh` YYjNYu YjjnYY=thjYYYjjNYY=thj9YYjj.YY=thjYY}u3 E؅y'5 ^YPhTh` a jYuuuu'}u}t j uYYjxY_^UVW}}z5T xY hPj ƅ~.VWu Ex}׉+Uօujh5n uD jY=u'5 TYPhh` W jYtT EPY hPtET P ƅ"tj YY3j.YVPtP {_^UjEP5T y UVWEu>t6bYEEuLYEu#j 6YPh,h` 9 jY}u>t-6WYY6WYYǀ?tG~t G΋E_^Uh8h<h@h` jYUV5 Nx \ ^U= t uYUVU9wU9v 16V0Yt1'rF5&Y5^UVW}u1E}UUs 1=u8j Y=u1V!փ55FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVH uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVu~  u 6EP~YEU UEPEPV yE^UVux95 p ^UVW5 4#Y#DžD7uYYtw>t6unYYt} tu w RYYu= u #_^U@VWEuCEf#M сf }|h4LYEuE(E0 YEu!]3hh`  EEEJf} fjuFYYDžy'5 [YPuhh` [7E!ff    فfM#U fUURUEPh0n@W ƅy9= :u WYY5 YPhh`  EEPh0n@WI ƅy$5 mYPhh` p LEEPh2n@W ƅy= ujYy = tʅy-= :t$5 YPhh`  y M}0}uhh` YY}u?jh|W =/5 YPhhh`  gju=YYEy'5 QYPuhPh` Q-E"ff    فfMEPh0n@u ƅy$5 YPh,h`  \EЅy$5 YPhh`  }jYjj YYjYEEPh3n@u ƅy= uj#Yy = tȅy0= :t'5 YPhh`  j[Yx jOYjEYjYPhEP} EPYPEPW PEPYZ9t$5 }YPhh`  \u`YPuWD uEYPuW) u*YPuW jEPW =t$5 YPhh`  }t5jEPW =jEPj } u}UEEPh1nuC ƅy!5 gYPhh` j IfUf    ف|hh` $YYxWY}x uY_^U8VWDžDžu>tF>.uu +UFG-A=s FPYFG} t1hPhTYYE}t;uuPuuu Y1u Y= u } DžuYu rPYYhDP%YYh@P*YYEu]UPrYYu0tB9uu Y_^UVWuhP > t2> t-> t(>t#-A=s PAYFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPuYY/1_^UVW} }uWuYY1ۅÉ uWu t1WuYYu U:t1= t1= hhYY=u 1j.hYY u 1T  ր>t-A=s PYF݋UUR5 YY1ۅÉ_^U$UUEPjjK y U 1UVW5  }׃}~9r }y 9vWYu_^UVW= aU9 }  M :-u zu  M h4YYu  M  ǣ :tWusYYƅ}= t=E h` 0 YYh` h YYh` W YYh` j YY M   :u  ? F>: M  C;t!A  M  CX  U9 |W= t=E h` 0N YYh` hh= YYh` W YYh` j YY ?` A  M X  7 M   :u  X _^U=( x 5( Y( , U=( x=u  j5YY( y'j5( YY Pj5( } 1U^UU8=, u/hh5(  , 1V4=8u1< , 4488= u8U8U8U8:u18: t 8::uҋUEUV=( yy1u1tx,tjƅtjjV f LƅtjjV "/0t!$y(g8:X^UV%ƅt F9Eu^UV{ƅtu6~ YYu[^UVWuU VVu YYDžt~~yVډ F_^U$UUEPjj U(VuEEV֋RUV֋RU E wDUUU UEPj7jB ^U(VuU @t*u YEU UV֋RUUUEPu(YYU UEPjj ^U$UUUUU UEPjj U$UUU UUUEx#EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UVW11}U9x u x F߃| jugYtUrYtURtUzt rY}0 t}H t}` t uY_^UVWuEu41}%uNN FFSX_^UVWEE11U :t! EE E f>U uuuYYEy@Ut8hu%#YYE~" tuYuuYYE}y1]jMYEu uY1A!uEUMJUzUBUx E_^UUUuuu ) UVu JxUʋFF Vu/YY^UVWu }E?t:JxG^FSX GVP/YY=uEE_^UUURu hu'UUURuu uUEEUUUUU JUEPuux( EUJUx ]E EPj.YYEUuu hu '!K#[#w####O$$%B$USE] ![]USE] ![]USE] ![]KUVW}u M1&1UW}0))ϊE tu1_]XG_]1UVW!1E_^]&1L$ 0UW}0OE uG_]1_]UVWh Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UUAs UEU8VWEU UUUUfRf    ىM؋UfRf    ىMEEu }}`uuVuu[ Džy 1W΋Uu{YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt    1+EEEPEPEM9uuuVuuKDžVA YEV4 YEV' Yǃ}u@ց}|sUEEu=YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u UuuXYZЉEE1UUs-UEȉEWVRg UUE;}tEE  1_^UVW}-0= >N>.WY=u 1=PTPX-0= r>.uF\hPjjWV y1jPi _^UVW}}t1PGPGPGPhdPChPj jP Ey1HjuP ƅu1*UVU V PT_^U VjhYYƅyHu uV EVfY}u"U JUj u@YYEt1^U= uhhYY 5 q'YU  U= t5 Y  UVW= u!hhYY u1D5 hh Eu1U:#thu YYƅtUhuYYEtEU: t: uEhuYYƅjFu'Y%f    ى 5hVWYYƅtFt8>t3> t> uF$s7hVYYƅtF_^UVW}Utu >t]9uFG1_^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E+.} tF=   ً  ʋ  ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U,}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F! *+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U *>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW u =u hPjjjuu ujB$$ƅ uuVPƅy }Gu^fWf    uL0 7 +  W4 )(_^UVWE um=u N  uE>t >.uEF}u)uYƅtuuuu V_}u  €u$}N>. "?quuuu 7uE~= ;u l= uE= t = u t놃}t"uuuu ju%E~}t  _^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhX PUuuuu_^UVWhh YEthd uYYEu1EuhP >t uF>nuP. YYuF u>tDG?t uG1҈' hVh( u2Y( u"Y1_^U@VWEEEUUЋUUE= u%=u  u } ~1EUffUE 9UYE 9U;}Dž U= y2UMEPU !P4!w =#U f    فfMjEP5  =t$ U5 Y ^u u5  9E t$ U5 ZY }fEU܅t2EPW5 p ƅ~U)fUU܅tB U5 Y }<}EM}ff    ىM9M}#UfUDž #UfUU܅t2EPW5 ƅ~U)fUU܅t$ U5 Y UJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃= y y U'UMU !P4!u u5 (9E M Uԃ}~ Eԙ= Eԃ}Euuu5 E=u= EEUM9u u+UBt"5 Y E}t t}u  u5 BY EaEE= x5 Y }u}u  ; = Uȉ _^U= t5 Y U$VWh PYDžut jWYYƃu EE1UUfU fUEPh0n@Vn E=u EV YGEEPh2n@V2 E=u EVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh 0YDžu jWYYƃuEE73EPh@n@Vj E=u  UVYU _^UVWUR`Yƅu wUWfUfW fG #UfWuu FPa URVu E UVY}r UUU E_^UhAjPYYj;YUVWURYDžu hAjYYEuYEURWu( Ƌ Uxw7~1WCYjYujYYuYU @RGPu < WYjgYujhYYuRY_^UVWEEPTYNjE E PBY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^UVuYƋU rU MJwU uRYY^U$UUEPjj U$UUEPjj U$U UEPulYYEPjj Uh 2u u ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3W5 }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuYYEuUUȋUUEEEPj;j RMY_^U$EPjj] U$UUU UEPjj9 U$EPjj! U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$UUU UUUEPjj yEU$UUEPjj_ UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V< 4 5D h( jKj ^UU$VWEP YEPEPj jYƋ}t9uvEHEPG YEEPEPj WYUUjEP YYEP" YWj]YZ)‰jEPj jEPj t9r)օu j YVYU)_^U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE :uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U IEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U4 iJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEET YE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } 2~y UVu CV€tu ,fNV~H u>5L H Yt.hDYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvf =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvW =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`# UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWME_^]UVuj jV+ ^U}x}~uPYYUUas U EUh h` .YYjzYU VWDžDž    !jhL ֲYYu g#Jfh@ YƅthVh! h( h, YYE(uhP jh P _u> t> uF>t> thVh! j h!IYYƅtDždjh P 9> t> uF>> hVh! j h!YYƅt!"7E>t3,"s+> t> u E}t 7EFȀ>t > t> tFDžoj h P Q= D> t> uF>(>  !PVYY ff U ! uY= u"!ff ! =!u=hPYYu&j.PJYYƅtFPh!YY]"!!E>t >.uEF!}| "sj.VYYF7M 1_^UFtV]YU )uRv EVt tfVV}u1_^UW}E Mr/u'uĉ fE_]+C;Cw Ë[ uӅu P-KI|;u[u Pw1ۇtPXP 8?KLdeln wrsh: fork: %s. rsh: can't establish stderr. rsh: shell/tcp: unknown service. tcpshellrsh: unknown user id. /usr/bin/rloginrsh: can't exec %s. /usr/bin/rloginrlogin8KLdel:nwrshrsh: fork: %s. rsh: %s. usage: rsh [-nd%s]%s[-l login] host [command] unknown errorunable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equiv: option requires an argument -- : illegal option -- --^^^kkk al rG wV + b No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0%u.%u.%u.%u.in-addr.arpa/etc/hostname.filer/etc/services ,/ # r/etc/services00a0z00)2c11,4$4344446666666%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEI I@IJXJbJdJiJoJpJuJxJK K#K+K-K0KNLLhLlLLEUNG@NXMbMc'NdMeUNfUNg@NiMnMoMpMrNseMuMxM(null)cannot print floating point nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainh]i[\P @(#) Copyright (c) 1983, 1990 The Regents of the University of California. All rights reserved. @(#)rsh.c 5.24 (Berkeley) 7/1/91SSSS/etc/passwdB0 H ` 0"Unknown error\P4$ |lXL4$tdL<$p \D(p\D4  C ((((( AAAAAABBBBBB   @p0 t1$T$L|0su;SSSSu(( QRPTPN0U@EPjDYYEPjDYYE]19tA 4U=4thh@YYUV1<8tU9<u 8F޸^UuhLKYY#=|uh<5x^DYYh<h` nf`fbd⿁fdd fd=8tdfdff@=,tsvuwh`j5xC |1C=|uh<5xqCYYh<h` #m}u%f`fↁfffbd⿁fdd fd=8tdfduwh`j5xB |l41L=|uǩt1ʉ 1΋U EEMx1GǩtH1ʉ 1ʁ thY,_^UVWSƅy<51fUOxE ƅy UUM11fUU EƅyUUM11fUƅyUUM11fUUt5hYF54 54'jWY= tjDYƻ],_^UVu=~ VhPYY!0P'Y!0PY^UVu`50VYjY@50VYp=\$u#0@u jY@50VY==\$t`u jY@50VoY\^UVƃ=~ Vh8FYY^UVWƅyP0׃ ~'t2bƅy#0 ~'t ։_^UV5 Yƨ`t=\$t`t։H[5D Yƅyu5& Yƅyu5 Yƅyh5 YƅyVvl aZS=\$t `Q`!@u@1'x[=~ VhYY^UV5P Yƅy$=\$t`tى{Z^UVu^UVW}W։O ΉO Ή ʉ_^Ujh`$T%YYU=,t hYjiYuh8h+ URYUVWEdjh^-YYh`Yƅt,h\VYYuhTVYYt NE URY1MoE E 0>-/F>tFPYFL$\$L${M}E E 0Y= |=Bb8M}OE E 0VYXX}E :}U U~=t t=t`hhDhH) uh h,+YYhYjh)+YY5uhh[)=4t=u=u hh5hj}YhNjYY=ujjYYjj YYhNjYYhNj wYYhNjiYYuWYY=u EjYuhMYY}t=,uW}t=t-Jx hj 3$YY}tE1PKY_^U,hh'YYhh'YYhh'YYhh'YYh|h'YYh\h'YYh0h'YYhh'YYhhv'YYhh5hhU'hhhC'YYjkYUVWu}=~&VWu uh'h0h&YY_^UV=u }=u/=0tP55Hh&'ƅt)u1lWƅhHY==u1)hkY==u5wh&YE 0hC*YYh Yhhh% hh<$YYu =t1op =t=t5_YE=t 5Y=t"hV)Yhhh%% ^UV=tCP YjduYYƅt5u)VhQ YYjg YjY놸 jD Y1^UVW1=tCEEPYt2PhYYV YB9u`G9}EPhYY=u +Uy EW9uh- YE:u&t2j&Y1uhY_^UVW1҉=u Y=u jcYEjXY%fEE=B1҉UfU}UMxIjYƅxUUM11fUGEjYƅ/=UUM11fUjYƅUUM11fUUthT \YE&U)uE hH Yh0 Yru=u u-=uh Yu=uh Y VhYYjkY=u=t(=tCPxYE (j]Yfp_^UVWJx:=~8Ph hE 88SX7 EE=}E=~5uh h5X jh`$ t.=~h| hYYh;jJYYuL#Y#58R5xV# j#Y=~5hd hD =; =~8Ph\ h  88SX_^Ujj5x" UVW@ =t =t1=L$t L$ T$=u=P$u =P$u =T$u< =uAT$%=t.h8 uYYt5Y5wURuX"YZր>tahhhh, V t=tE555uh huu>t >/u_FN>.u=,u+=t"ucYuu uY=}uRh h=t-=t  Phh hh hYYzuh YY=t,W=t  Puh hUu<Y=tE WuYYu1_^UVW} u1=tDuO:xFKCF5PYY뿃=t1_uOS> tK>u1=:xPX@Z5PTYYF1_^UUU=~uhD h jEPj: UUVu>t-A=s P YF^UVu>t-a=sF1^UVWuu>t0U 9u u} ?uEEG9tF1_^U=~?5hX hC uu uh-hT hYYUhLYhYU=~1 Et  Puhd hUVW}>-uF>t F/u!uFVY^UVu>!uFjYVhp ht hx ^UVuj jV ^UV5dNx t$^U=hthudYUVW(Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVu~  u6EPYEU UEPEPV yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U VW}Eyt 1}uE VVYFu =t(2hlh  jZYEPXYE9Et}u}uEu}u EEE_^UUAs UEUUas U EUVWU :ru1U :wuǃtEPYx ^Ey1}<s >t-<PYtY11ۅPtYY1tYjuh h h ?jYTM <1tYu t}YY_^UVWUzjjYYEjjYYEuQYEPY=t 94<uuEujVYYujJYY<E_^U$UUEPjj UVu x~ 5ju]YYy9uuVYVju5 ^U(2E Pu ULVWE1EEU UE8t+04YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVHYE=u&UEUUU}׋U UE8t=+UEEE0FYE܋]P3W }׃E뻋EEUUE8t=+UEEE0 YE܋]P3W }׃E뻋EEU9vGu YEuUUȋUUEEEPj;jB R Y_^U(VuEEV֋RUV֋RU E w6UUU UEPj7j ^U$EPjj U$EPj*j yUEUMJ1U$UUU UUUEEEPjGjL U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EPjj} y}tUEEUUM J} t U RY]uEPu j51UEUUzt RYuhj4U RuZBRY4UVW11}U9u F߃| jugYtUrYtURtUzt r: Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }h<~y UVu CV€tu ,fNV~u>5 Yt.h|YFu NLNHF 9hNYFuN!NF V@uVVVhUFt$jjvB =uN ?jEPv  =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv3 =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E  .U :t! EE E  .U uuu[ YYEy@Ut8hu YYE~" tuYuu YYE}y1]jqYEu uY1A!uEUMJUzUBUE_^UUUuuu l UVW}EEL#WUWYw)Y}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U D1&Uujjd UjujP U$UUEPjjG y U 1UVW5  }׃}~9r }y 9vWYu_^UVW1}y11<t,|1Fρ(1E E X:%U :tE E x%j YEu1EttEUMJUzUBUE_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$U UEPuYYEPjj) U$UUU UEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjjK ^U$UUUUU UEPjj U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V5hjKj= ^UU$VWEPYEPEPj jtYƋ}t9uvEMEPYEEPEPjt W3YUUjEPaYYEPvYWj YZ)‰jEPj2 jEPjB t9r)օu jBYVYU)_^UE PhT@u Uu hT$u UE Ph T@u UV& T$@, T$@% T$@E O uVuS ^U$EPj j y}tUEEU$EPuYYEPj jW U$} uEueYE"E UU RUuAYEUUEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUPOYUE_^U4VWuEEEE }%MJxUʋFF Vu(YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U8JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PkE6U U RU U RUEEEXE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPtYY=u}t UډJxUʋFF Vu,YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuiYY=u˃}t Uډ E_^UVWu }E$E)E EEE-t+u-U EMtJxFFSXV Yǃ}0}U EMtJxFFSXV} YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G 8KE=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPh EuEPh EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t Vu[YYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG띀?uEE3]uVuiYYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY XE6 EEu }ntEGV}u}tE_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4=YGƒ~uFFF VVv vv >uNN FFSX_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^4[cUSE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U}x}~uPYYUhhYYjYUhhvYYjYUVuYƋU rU MJwU uRYY^U$EPjje U$UUU UUUEPj6j; U$UUU UEPj%j U$EUEPjHj U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE8UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBÉ{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7,uj`=}aUaK>kc#ZsXsXfR[[׉1ۇ(tPXPPlease read the manual page BUGS chapter! mode:%dxxxxxZSTDERRZCOMMANDZFREECNTZCANZCOMPLZCHALLENGEZCRCZFERRZEOFZDATAZRPOSZFINZABORTZNAKZSKIPZFILEZACKZSINITZRINITZRQINITERRORTIMEOUTCarrier Lostzsbhdr: %s %lxzshhdr: %s %lxZCRCWZCRCQZCRCGZCRCEzsdata: %d %s   hijkData subpacket too longBad data subpacketTIMEOUTSender Canceledzrdata: %d %s   h i j k Data subpacket too longBad data subpacketTIMEOUTSender Canceledzrdat32: %d %s 7  kw 77h * 77 * 77h A( Bg CI     zgethdr: %d %lxzgethdr: %s %lxGot %sGarbage count exceeded zputhex: %02X ]vvv@]vvvzgethex: %02X{bbbb9 h i j k l+m2Bad escape sequence %x rz: caught signal %d; exiting J+PD}\=aYbecqepqtu!v0wy;exitcode = %d POSIX2.03 05-17-88%s %s for %s argv[0]=%s Progname=%s /tmp/rzlogCan't open log file %s a/tmp/rzlogrkshrshSHELL "The High Reliability Software" POSIX2.03 05-17-88%s %s for %s by Chuck Forsberg, Omen Technology INC -y Yes, clobber existing file if any -v Verbose more v's give more info -e Escape control characters (ZMODEM) -c Use 16 bit CRC (XMODEM) -b Binary transfer for all files -a ASCII transfer (strip CR) or rx [-abcv] file (XMODEM or XMODEM-1k) or rb [-abuvy] (YMODEM) Usage: rz [-abeuvy] (ZMODEM) %s ready. To begin transfer, type "%s file ..." to your modem program rz: %s removed. w rz: ready to receive %s szsbPathname fetch returned %dSync ErrorReceived dup SectorGot 0%o sector headerTIMEOUTSender CANcelledSector number garbledChecksumCRC!%02x Read returned %d bytes Readline:TIMEOUT Calling read: alarm=%d Readnum=%d %02x /dev/nullASCIIBINReceiving %s %s %s wASCIIBINTopipe: %s %s %s %s Incoming: %s %ld %lo %o %ld%lo%orawSendline: %x Retry %d: %03d%c rz: Security Violation /usr/spool/uucppublic/usr/spool/uucppublic../ rz: %s exists r')')')')'))'))')')')+')')')')')')*+#+I*h*R+s+N+h+l+Y+ Y++V-/--h.i-j-kq-+ +w,++++,,++++,",rzfile: zgethdr returned %drzfile: zgethdr returned %drzfile: zgethdr returned %d CRC-32 %7ld ZMODEM%s rzfile: Sender SKIPPED filerzfile: zgethdr returned %drzfile: normal EOFrzfile: closeit returned <> 0rzfile: zgethdr returned %drzfile: zgethdr returned %d...file close ERROR ///O/ackbibi completeackbibi:-csh/bin/sh-csh/bin/shcd .-csh/bin/sh888888888_@aL@r'@w6@@+@by@AaArAwA;B+BbB+I+I+I JaJr JwJ\J+DJb:JNNNNP ]P@PQXQbQdQiQoQpQuQxQR R#R+{R-vR0RULiShSSl^SSEUGUXsTbsTcTdTeUfUgUiTnSosTpsTraUs-TusTxsT(null)yXXGXbbXdPXiGXoYXpGXuPXxGX)^L^h^l ^^EIcGIcX=_[ab=_cO`d=_eIcfIcgIci=_n^o=_p=_s`u=_x=_cannot print floating point cannot print floating point ` n0,pX` %!B c0@P`p)Jk1s2R"RBrb9{ZӜb$C4 dtDTjK( ōS6r&0vfVF[z8׼HXhx@a(#8َHi +ZJzjqP 3:*˿yX;l|L\",<` A* hI~n^N>2.Qp:Yxʱ -No0 P%@Fpg`ڳ=^"25BRwbVr˥nO, 4$ftGd$TDۧ_~<&6WfvvF4VLm/ș鉊DXeHx'h8(}\?؛uJTZ7jz *:.lMͪɍ&|ld\EL<, >]|ߛُn6~UNt^.>0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-xd|pd\TBad CRC`XPH0123456789abcdef4 SSSSB ((((( AAAAAABBBBBB $  p>1$T$LPsu;SSSSu88 QRPdDPUuQYPuj= U5TYEh YuYhYuYhYjrYUjhc5lD =u-h<Y h<xYh8QYj&Yjh`D5lD `Du  UVWjh<7YYlDy h<YFEju5lD =u-h<Y h<YhYjnY"h=h5lD pEPEjhYYE=PEPhTue u8U(|UUUU|UUU}t uYEEU9U[1DžPU9P}-U G~ FOU FEP F[)Q[Pj y hmYEsjY_^UV5HNx pD^U=LtLu(YUVux95th^C[s#GfU$UUEPjj U$UUEPjj U$UUU UUUEPj6jW U$UUU UUUEPjj+ yEU(VuU @t*u2YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UW}0ʀuA)_]UVudYƋU rU MJwU uRYY^UVWuU VVuUYYDžt~~yVډTF_^USE] ![]USE] ![]USE] ![]UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u P1ۇxtPXP : screendump: -screendump: can't obtain BIOS parameter: short read =stdout/dev/logscreendump: can't obtain screen dump: short read unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0hD/dev/memSSSSUnknown error0$tP@, lXH8 tXDXXXXXXXXXX0p\D0C  0|,#1$T$L|su;SSSSu QRP PUVW}~hhbYY}u5U rjVYYDžy Vh 1YYE3EEPuW$ uWYYEPuW; 1_^UVW}$URu u* 9EthphtYY1}k E P Fww7h8_^UDVVu u 9thhVYYu EP4hVYuuuuhX?uuuuuh #uuEPEPhuEPEPhhY^U5dYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvM =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UU Uhuuv WUVWE_^]UVU9wU9vh 16VYt1'rF5&Y5^UVW}u1E}UUsh 1=|u8jlY=u1V!փ5|5FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVh uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjjg y Ul1UVW5ll}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډhF_^U$UUEPjj U$EPuYY1ۅÉU$UUU UUUEPjjW yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjjw UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U T[ }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEl uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF Vu2YY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEДUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPtYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVP2YY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }UVW}u M.UUas U EUhhvYYjVYUVuYƋU rU MJwU uRQYY^U$UUU UUUEPj6j UUUuuu D UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]{sƉKI|;u[u P#1ۇttPXPcoreCannot openUsage: rdump [core_file] Seg sizes in bytes: Text: %ld Data: %ld, Stack: %ld Cannot read segmap map from core image file fs=%8lX gs=%8lX ef=%8lX ds=%8lX es=%8lX ss=%8lX cs=%8lX esi=%8lX edi=%8lX ebp=%8lX esp=%8lX eip=%8lX eax=%8lX ebx=%8lX ecx=%8lX edx=%8lX Cannot read process table from core image filed lX %*lX: %*l%*CharDecHexAddr%*s %*s %*s %*s Error reading stack from core fileStack too large%s %s I  @" FX/bd&i&op/u&x/ #+ -0LhlEGXbcdAefgiAngoprsux(null)cannot print floating point SSSSB,#!/bin/sh # setup.anonftp - Anonymous FTP setup and maintenance. # # 01/22/96 Initial Release Al Woodhul, # 01/25/96 Michael Temari, # # What is needed for anon ftp # ref: Hunt TCP/IP Net Admin pp. 338++ # ref: Nemeth et al UNIX System Admin Handbook p. 295 # ref: mail from M. Temari 18.01.96 # programs possibly used by ftpd PROGS="sh ls crc tar compress gzip" echo Checking /etc/passwd if grep '^ftp:[^:]*:[1-9][0-9]*:[1-9][0-9]*:[^:]*:/[^:]*:[^:]*$' \ /etc/passwd >/dev/null then echo -n "OK, ftp entry found: " grep '^ftp:' /etc/passwd else echo "Found no entry for ftp in /etc/passwd, please add one with the" echo "home directory pointing to the anonymous FTP directory" exit 1 fi # ftp directory FTPDIR="`sed '/^ftp:/!d; s/^.*:\\([^:]*\\):[^:]*/\\1/' /etc/passwd`" if [ `whoami` != root ] then echo You must be root to do this exit 1 fi echo Setting up for anonymous ftp echo Making $FTPDIR and subdirectories install -d -m 755 -o root -g operator $FTPDIR install -d -m 751 -o root -g operator $FTPDIR/bin install -d -m 751 -o root -g operator $FTPDIR/dev install -d -m 751 -o root -g operator $FTPDIR/etc install -d -m 755 -o root -g operator $FTPDIR/pub incoming= if [ -d $FTPDIR/pub/incoming ] then incoming=t elif [ -t 0 ] then echo -n "Create \"incoming\" directory? [n] "; read yn case "$yn" in [yY]*|ok|sure) incoming=t esac fi test "$incoming" && install -d -m 777 -o root -g operator $FTPDIR/pub/incoming echo Copying files for PROG in $PROGS do test -f /usr/bin/$PROG && install -lcs /usr/bin/$PROG $FTPDIR/bin done cp -rp /dev/tcp $FTPDIR/dev/tcp echo Copying a minimum of the password and group files sed 's/^\([^:]*\):[^:]*:\([^:]*:[^:]*\):.*$/\1:*:\2:::/' \ /etc/passwd >$FTPDIR/etc/passwd sed 's/^\([^:]*\):[^:]*:\([^:]*\):.*$/\1:*:\2:/' \ /etc/group >$FTPDIR/etc/group chown root:operator $FTPDIR/etc/* chmod 444 $FTPDIR/etc/* echo "Anonymous ftp setup complete"   @G1$T$L0su;SSSSu$$ QRP PUVWEEU9UUM UhluYYƅu!E uh`0 EhLhT YYhLu YYhLh@ YYhLu YYhLh4 YYJxFFSXV@Y=LJLx``XhLjXYYLJLx`` hLWRYY RJxFFSXVYǃt/LJLx``hLWYY륃hLh0YYV tE uh$0 EVYtE uh0X ET uE hLSYT tE hh 0 EE_^Uhdu.YYhdhpYYhdu YYu`YUV5(Nx $^U=,t,uYUVW11}U9|u |F߃| jugYtUr YtURtUzt r Y}4t}Lt}dt u Y_^UVWuEu41}%<|t4|YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvz =u N /uvv7 EU9Uu1 N _^UV1}*<|t|Bt 4|aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hkYF~uN NF 1}9<|t,|R@t|Bt 4|}YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },*~y UVu CV€tu ,fNV~Lu>5PYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvZ =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvK =u N 3uvvl uNN N_^UVWEE11<|tN|1DFρECEE0-EMP1E E | U :t! EE E U uuusYYEy@Ut8huYYE~" tuYuu/YYE}y1]jYEu ubY1A!uEUMJUzUBU|E_^UVWu }E?t:JxG^FSX GVPYY=uEE_^UVW5YNj5hhLeYhdZY}t.U:t&uOYPuV jhV W+YPWV jhV _^ UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVl uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVux95^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6jG UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇtPXPstdoutwriting closing reading / << '/' sed '/^X/s///' > echo x - opening r: error a r w  + b : unknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 SSSSB4LdUnknown error|l`<, lXD4$ t`D0p\H0C  lC1$T$L su;SSSSu QRP PUV}uh.Y5uY9u~U 4 YF^U@VW}jWYYƅy"WhhTK j0EPV =0t)WhxhT VLY}u}t)WhXhT VYE t1EU+U+U+UЉU}tUU}t UU؉E؉EA u h,YWuuuuuh jVY_^UV5Nx ^U=tuHYUUUuuu  UU Uh<uu 3KU$UUEPjj' U$UUEPjj U(VuU @t*u YEU UV֋RUUUEPu|YYU UEPjj ^U$UUUUU UEPjjw UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U C}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE~uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U<JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEE\ E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~<u>5@Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv` =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVp uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhhT&YYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uR YY^UVWuU VVuYYDžt~~yVډF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uu U$UUUUU UEPjj' UVWuEu41}%5YPhhj jHYE EE EPVY}Z}}U9 u>!Dž0Dž$ESXc9sFzEn}t E )щMEЍM)+MىMQuЍP! uhP E}}+UԍMRQjPDž~=UWhR E}ԃ}uZ}uQEEAuhLjYY=t!5eYPh,j j}xu܍PuP9}u ELxWuuhj2=t$5YPuhj}}}F}tU M FDž FDž,E FF)щM؃}{}qhPuPDž~}Huuhj  =t$5YPuhj}u؍PjPrDž~&U)UtWu؍=PPP ;uhjwYY^=t5/YPhxjQ 7jjP? 5YPhDj j uYY_^U0VWEU U׍UU?7?%(GjPhd  9}s++URuu3 Ey UUGWU?suuF1P}jYE]9 j2YEEܾEP6YEEPEPj E+U9}v}WYvFV FvvP FV RFvvP8 FV 1F^vPS FV F ^}t!jUYjEPj u<Y~u~ u1_^UUuUYU$UUEPjjk U$UUU UUUEPj6j? U$UUUUU UEPjj U$UUU UUUEd EPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1U$EPj j y}tUEEU$UUUUU UEPjj CcUW}E MuG_]1_]U=tjYU}x}~uPYYUVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$EPjj U$EPjjq U$EPjjY yEU$UUU UEPj%j% U(VuU @t*uYEU UV֋RUUUEPu|YYU UEPjj ^U$EPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj) V5hjKj! ^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVuYƋU rU MJwU uR]YY^U$} uEEUUE UEPjJj y}tUEEUVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u Pg1ۇtPXP? .O/slip: error while waiting for I/O to happen: %s slip: serial output error: %s slip: EOF on serial output slip: error reading %s: %s slip: EOF on %s slip: error writing %s: %s slip: odd write to %s, tried %u, wrote %d slip: serial input error: %s slip: EOF on serial input slip: can't fork: %s slip: Connecting input/output to %s slip: can't open %s: %s Usage: slip psip-device sduunknown errorb1  No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0SSSSUnknown errorxlP@(thP@4 hX@0$x`D0$ x`P<(C#!/bin/sh # # spell 1.1 - show unknown words Author: Kees J. Bot # 28 Apr 1995 dict=words while getopts 'd:' opt do case $opt in d) dict="$OPTARG" ;; ?) echo "Usage: spell [-d dict] [file ...]" >&2; exit 1 esac done shift `expr $OPTIND - 1` case "$dict" in */*) ;; *) dict="/usr/lib/dict/$dict" esac { if [ $# = 0 ] then prep else for file do prep "$file" done fi } | { sort -u | comm -23 - "$dict" }   B1$T$Lsu;SSSSuxx QRP PbUVu x}~fEU9UU:-xUB=0|9UB=9%=|uU4Y|yUzu=u U:N=u0Uj4YYy*h_YjdYU4hYYUBfU=u hhaYY:t `1^UVWDžDžhP5 ׉mG< u=|uփu )RV )9tDYDž9Mu 4)RV* )9_^UV@=z~a@hhYYEyh$dYjiYE^Uh@HYjMYUhd0Yj5YUVuj jVC ^UV5Nx ^U=tuYUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVu>tF+URuj1 ^[s /NUVWiE_^]U$UUEPjj U$UUEPjj U$U UEPu0YYEPjj] U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjj UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }UVuYƋU rU MJwU uR!YY^UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]aaCannot open input file. Cannot create new file. Usage: split [-n] [file [name]]. split: write error SSSS ((((( AAAAAABBBBBB #!/bin/sh # # srccrc 1.0 - compute CRC checksums of the entire source tree # Author: Kees J. Bot cd /usr || exit { # List the file names of all files in /usr/include and /usr/src. find include src/* -type f } | { # Sort the list to make them comparable. sort } | { # Remove files like *.o, *.bak, etc. sed -e '/\.o$/d /\.a$/d /\.bak$/d /\/a\.out$/d /\/core$/d /\/bin\/[^/]*$/d' } | { # Compute checksums. xargs crc }   L 1$T$LxL su;SSSSu`` QRPl PUVWu }Ok:-`h6 YYulh6 YYuh뷋B-0= sRYd닅uJWZtP Y1_^U4VWh uYYƅu"hhYYu YjYVjjP=uAt  u)=lu DžDžjV t9JxFFSXV]Y=t u)9 d~)сu@=ht)+Qh H YYP^ Y, | | u G VHY_^Uh$h5YYj5YUVuj jVC ^UV5pNx t ^U=tttu8 YUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+|"}t}y UU_^UVW11}U9u F߃| jugYtUrN YtURtUzt r Y}t}t}t u~ Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv" =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h3YF~uN NF 1}9<t,R@tBt 4}YGƒ~uFL FF VVv vv1 >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E PSU :t! EE E p*U uuuYYEy@Ut8huYYYE~" tuYuuYYE}y1]j]YEu uY1A!uEUMJUzUBUE_^UUUuuu UVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^UVW5|lYNj5heYhZY}t.U:t&uYPuVH jhV8 WYPWV& jhV _^UU Uhuu UVW}E?t:JxG^FSX GVPKYY=u}t Eh u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=h <9}r79}u+UOJ}t Eh URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15h t 9ur6E0tU Uh tU9ru NJEtU9Wu RWE_^UVux95< 0^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ|F_^U$UUEPjj U$UUEPjj U$U UEPuH YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*u:YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U0 JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEPE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }t~y UVu CV€tu ,fNV~u>5|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUh@hYYjYUVuLYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }KI|;u[u P1ۇD tPXP-o-%lo:strings: rusage: strings [-] [-o] [-num] file ... arwB +# b : unknown error U@Xb|diopux x#}+s-n0yLahKlVEGXkbkcdefginokpkrYs%ukxk(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point p SSSSB ((((( AAAAAABBBBBB Unknown error8,|XH4(t`P@(|`L          8 xdL8 C  pD1$T$L(su;SSSSu QRP P:UVu >u hY>t 6 Y1^U0VW}jWrYYƃuWhh\ V YVYtWh|h\ VY=u VYUEPVYY txU+UډUWhDYYE=uh\h\JYYVrYHuYt1h@h\ YYhYV=Yu4Y xtRuVI t3Wh0h\ h4YVYuY}tQjuV uuV t0Wh h\w hYVYuYcVYuxYWY=u Wh h\) hY%WhVYYhrYEPWYY_^Uj hluF = t g=lu =mtNp0v;jju pPhlu p9t1Ujju pPhlu p9t1UVW}u YE@=~Xu WrYYj/WYYƅuN)~$hFP9YYW YhWYY_^UVW}~QsVhu 9t&Vhu 9t )1_^UV5 Nx ^U=$t$u$YUUUuuu X 3O+UVW9E_^]>UW}0OE uG_]1_]U$UUEPjj U$U UEPuYYEPjj U$UUEPjj U$U UEPutYYEPjj U$UUU UEPjj} U$uYEu YEUUU UEPj j7 U$UUU UUUEPjj  yEU VW[Eu>tFN>Xu E0EEF>t&azjuYYyEG߸_^U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj' ^U$UUUUU UEPjj U$EPuYYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE.uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U=EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UD]JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P_ E6U U RU U RUEEEdM E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }$~y UVu CV€tu ,fNV~Du>5H(Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv9 =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^} 0)ʇʋu }UW}0ʀuA)_]UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhh\YYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRqYY^UVWuU VVuyYYDžt~~yVډF_^U$U UEPuhYYEPj!j U$EPjj} U$EPuYY1ۅÉUu hT$u  UVWuEu41}%tG9uF>uր?=uэG1_^UVWdUUU UEEFt cuWEEFt du:EP Y(-dPhdu u"YuY}tju#YYuY}tjuYYuYjh(h(H hhdjt jY EuYjEPu x}t umYKhhdu uKYx'd1dv N>uGudU 5ded_^UdU`VW1jhYYDžy1<dEPjj }t*EP YEE,EPEPji EPWD YYEPEP dUfUUfUUfUUfUEPjW u} YPujm jhPW ~h t }FƆhEPjW WYjEPj =dtjzYh_^U=Lx 5LqYLPU=Lx=u @j5IYYLy'j5LYY Pj5L 1U^UU =Pu/hh5Ll P1V = u1< P    = u U U U :u1 : t  ::uҋUEUV=Lyy1u1 tx tjƅtjjV f LƅtjjV / t! y g :X ^UV%ƅt F9Eu^UV{ƅtu66YYu[^UVW2}u1r:u ]j=uYYEcJ>@UUU:tEG9tU:u?=tȋU=U1U=2=TkEt Eu E@k PGYƅu UT:2u2E Tu4T@k P2YYƅu.2TJ]TT1_^UVu>tF+URuj ^U$UUEPjj U$UUEPjj UVu x~X 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0sYE9uvEEEЃ E V!փ}u sXKV YE=uX&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0fYE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j Ry Y_^U(VuEEV֋RUV֋RU E 3 UUU UEPj7j ^U$EPjj U(VuU @t*u>YEU UV֋RUUUEPuYYU UEPjj ^U$EPj*j yUEUMJ1U$UUUUU UEPjj U$UUU UUUEEPjGj U} vXM E 1U} vXM ҋE!1UE1UE1U} vXM Et1Uu hT$u UV& T$@, T$@% T$@XE uVuW ^U$UUUUEPj jI y} tUE EU$UUUUU UEPjj ;3WwfUVW}u MUW}0))ϊE tu1_]XG_]UVW E_^] UVWME_^]UW}0OE uG_]1_]UV U9 wU 9 vX 16VYt1' rF5 &Y5 ^UVW}u1E}UUsX 1= u8jdY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U}x}~ufPYYUVujuu V!^UVujuu V^UVWuEEEu} tE 0atFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+X"}t}y UU_^U$UUEPjj y U\1UVW5\\}׃}~9r }y 9vWYu_^UVu YƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډXF_^U$U UEPuhYYEPj!j U$EPuBYYEPj jo U2u uN U$EPj/j9 U$EPjj U$UUU UUUEPj6j U$UUU UEPj%j U$EEEPj.j U$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEP'YjEPj= V  5 h jKj ^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P1ۇdtPXPNo shell HOME=SHELL=LOGNAME=USER=SHELLSorry Password: Unknown id: rootUsage: su [-[e]] [user [shell-arguments ...]] -/dev/tty   +$ /bin/sh/usr/bin/sh/usr/lib/pwdauthSSSS/etc/passwdh ((((( AAAAAABBBBBB -  x C1$T$Lxsu;SSSSu QRP PUVW} ?u?b:-u zu1 j7YYƃu7h<YY }~1PVNYYtVzY땡_^Uh YuY} t u YhYUVWDžDžhPu Dž~Q19}݋t1‰5F뱅y1} tu h4)YYjh(YY_jjT Йjj' } tu h$YYh Y_^U VW}19u ~Quu' 10U )JD1}t0 U )JDF몍UU EPhDmYY_^UV5Nx ^U=tuPYUVu>tF+URujM ^UU Uhuu* #;SU$UUEPjjS U$UUEPjj3 U(VuU @t*u YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjw UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U H7}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE`ruVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЈUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P/ E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UV|U9|wU|9|vh 16VYt1'|rF5|&Y5|^UVW}u1E}UUsh 1=xu8jY=u1V!փ5x5|FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVd uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhh&YYjYU$UUEPjj y Ul1UVW5ll}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډhF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$ui UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvg EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu  USE] ![]USE] ![]USE] ![]UW}0ʀuA)_]UVW}u MoUVWE_^]U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }KI|;u[u P1ۇptPXP-can't open sum: %sread errorread error on %s) @&Xbdiopux #+-0 LhlE Gx Xbc_ d! e f gx i! nGopr sux(null)cannot print floating point SSSSB #!/bin/sh # svc=`basename $1 ,S`,S if test \( ! -r $svc \) -a -d "SVC" ; then svc=SVC/$svc ; fi grep '^#\*\*\*SVC' $svc   .` K1$T$L ` su;SSSSu QRP| PnU4u uYYEP/YuEPYY]й0.0]й0- 0]й0-uT4]jj0-uT<]jj0-u8<]jj0-u<=d t- J x  h j JYY]й08-u4]й0 -u41U(VW} h d l 9u]U:-t:Nd ?h d )l 7dYEU<+,F뚋U)u jYu U)~7'YU)~r~s h Y~t h` YF VV V$VV(V+V V,=d t>vhPh  6h@h  v h$h  _^UVWu} }fW' YEGPK YGP YF GP YF$F(E}UOQPYUNEWYEGPYG4PYF G8PYF$Gu F,F,0 0t?7e}`t } u}@u F,_^UV1}']80t q4u1`Fԍ]80su(K4t?]80Wu,/4t#]80;u04t1^UVut 9uw 9u vVhh { 1^U VWEu}(t1ZEEx | uNB9Uv1ǃ=h ttVhh  _^UVWu}u H DžU 9s9V uY9t hY+Uډׅy hxY=d t8~4WuYXPWhDh WV PY_^U0VWEEEEUU MUUUUU U U},uE} hYE}}uUURYUURYDžu EL9} w9}(w E9}tE+U UU MUR4Y=uEUUfuY=q}t'U4 hh hY} t}~O}tIUu4 hh c hlh Q YY}tUU ֊ E}}uUURYUURYDž+U UU MURY=uYUMI9u,U9Uu UJW4 h<h Wh h hYUMI ыUUЈ UU'UU  _^U VW}hWP* 1}PRYu"VRQBYYR5P,YY먍PY_^UVW}} ]<0] 0J`1}"]<0u8jtWd@Fٍ]<0u8ju,WC@]<0u8ju0W%@]<0u8ju4W@_^UVW} #U +U$UUuU!׋U UUuYPWYZ9~ MuYPWYZ9WY=uGU9Uu9}uu hh K u hh 1 hlYWeY=t hwYU9Ut @U9U~ U}tuʀ_^UVutu E tu EEE^Uuhh f jYUVu=` tN щV щ^UVWUU=` t% Z ϋUJUZ &UJU JUZ ω _^Uuhh  j;YUh uYY UV5 Nx  ^U= t uYUVt U9t wUt 9t v 16VYt1't rF5t &Y5t ^UVW}u1E}UUs 1=p u8jlY=u1V!փ5p 5t FE5x OVU}9}r69v2W9UvUW~>}t Ex u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=x <9}r79}u+UOJ}t Ex URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15x t 9ur6E0tU Ux tU9ru NJEtU9Wu RWE_^U$UUEPjjg y UP 1UVW5P P }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuvm =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVW}Wu ul ƅ~9})׉U U 1_^UVWu } "~y UVu CV€tu ,fNV~ u>5 `Yt.h,YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvm =uN uvv N V+VUV JVV}QFt!jjv =u N >@ABCDEF3uvvl uNN N_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^;Sk/USE] ![]USE] ![]USE] ![]UVW}u M{ UW}E Mr/u'uĉ fE_]U= t jYU}x}~uPYYU$UUEPjj U$UUEPjj_ U$U UEPu YYEPjj1 U$UUU UEPjj U$EPjj U$EPu2YY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$ub YEUUU UEPjj Uu hT$u U$UUUUU UEPjjo UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 8; }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEPvuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu= 0" failed, file "swapfs.c", line 793 Assertion "cnt == inode_size(version)" failed, file "swapfs.c", line 790 once with different typesBlock %ld used more than WARNING: %s zone block %ld used more than once unexpected zero block numbers WARNING: %s zone block %ld contains illegal value%s zone block contains Assertion "indnum > 0" failed, file "swapfs.c", line 826 Assertion "ztype_class(old_ztype) == Old_zone" failed, file "swapfs.c", line 972 Can't determine its typeERROR: file system corrupt, zone block %ld is used more than once. WARNING: file system corrupt, zone block %ld is used more than once. %s usage: %s [-v] srcfs [destfs] $ q$@$%X%b%d%i%o%p%u%x%& &#&+&-&0&)L}'hg'lr''E1)G)X(b(c)d(e1)f1)g)i(n'o(p(ru)sA(u(x((null)cannot print floating point $Id: swapfs.c,v 1.10 1992/04/15 10:51:46 ncwille Exp $4$SSSSB    p@1$T$Lsu;SSSSu QRP P*UH1UV5Nx  ^U= t uY #U$UUEPjj U$EPj$j UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![]SSSS  Il0)1$T$L su;SSSSuD D QRP(P$U5 (YPhh /  U5 'YPu5h h R/ UuYj$YU}t1Ph| 0YYx T = t h| YUVWu} W1YP-@Z=vAWh5h4h .5hh . jk#Yu=.uv/F?tGF_^U}u `($UrYUr 5`(0YY`(U VW}U26tEU6uEUE:tWYE8t EPY7Ur v #0YYօuUU}U7}u_^UVW Uh.YEu"h5hLh 3-u.YDži.ut.utj"Y VFGP/YPV"YF GPv K/YYE0uu-Y ztR:t RyY_^UVW} uK`$`(s7t V#Y= t 5 S-Y 1UJ@tUB= 1UB1<`$7UJV9jv5 - =u1|hh\#5 - y1YU\#9u9h^#u -YYuV"Y 1^#N= uBj\+YEhhu~, y= t1u,Yu -YE=r 1Uff\#u h^#/-YYEjj5 + E=u1Vuh\#5 7, 9Et17j Yƅu1%UfRfVUV7 1_^UVhh YYƅu= t hY^U Vu fVfUF%fE^ f]F %fEF1%fEUk jS5* =tj EP5=+ = t h| Y^U Vu  h| u+YYu Vu*YYy Vu~u =T Vk jP5-* =t#j EP5B* = uUu VFPYY?fUfVEfF]f^ EfF V`u Ui^1^U VW= uXjY @ B jY B  hdr m*YYd zt R M=  rtV  w 3YW,Y= u5 u1Z5 "Yh hYYt*=  = hY _^UV= u\j@h#5 ( 4= y hY5hlh & jY#### }5 J x  Zh V#YYH^UV = ~W5 ~ V5 5 ' ƅy hY   )   ^UE   UjEP5 '    UVu VY~.Vu5 '     ^UVuFP}YFPrYF PgYF P\YvSYvJY^U VWDžct uhYDž= t,hY5 6'YP5 YY hYh 'YPhYYh YRjh%YYDžy2h5hh $Zh*Y hYhPWi% ƅy hHYVP4YY~VW$Yx DžjyYtPYljnYtPfYKhYY>hLY15hh # jY><u_^U VWu$Džyh:Y1BuV6#YY6WYEP\$YE9t}y6Y1 1}_^Uuhy"YYU h pYUUUjEP5 # =t h$YUVW} = u`-h`Y5h@h ! jY'hh5 D# ,: 9= ~ V5 u#    ) UU);_^UjEPYYEUjEPYYEUV9u }!V5h|h jY~ VuYY^UVu%fFfF}fF qfF eF]F^UV= y j!Y  u5 J x  SX h .Y=u; = t- J x  h j cYY= u- J x   h V-YY^UVW= u:h Y}yuP8Y71=uCeuhuYYh Yǃ t t t ytYt ntNtuytYu1_^U,V1 EPh YY=T t'}t!h"EPYYEPh WYY= u7"M9t(=T u"Rh yYY= hE#9uE#9tJ=T u yu5 =T u##PSh  =T t}uh"EPYY= uR"u=#9Ut2EPKY#U EPh AYY= t$h 5hh St}uh hPYY^Uh h YYy-= tAh 5hh @h 5hh UjuYYu5h h = t"h 5hh zGh'YuLYUV=T uEPu u huWYYƅxV9Y^U VW=P t }t1= =L t.}u(5 h h jn Yh 5 YYx5 h h Uh 5 5hh W=P u!h hRYYjnY=T t"Ph jYYyh tYh hxYYhY=L t3}u-h h`YYjnYuhPYi#5#P"Ph y'h 5h<h Jh h NYY=L t3}u-h h)YYjnVYuhYhY= =T t"Ph YYƅy, h 5hh phPLYYDž~IxWPV 9th 5hh lV*Y랅yh 5hh xVYxy  h t 9#} Ph Kh "P5hph ShY!"@1j*Y_^UV=P t }t1 @|=H t1=P u$hhYYjn Yu1h7Yu 1uhhYY=H t }u1=P u;hh]YY=L t }unyPpYu1NhYy hhh  >1uhhYY^U= u = t?= t = t5 5 YYt    "9{1 #19tAg=H t 19#~@K#9 u#9 t(1$1  ,:/UtL=P u- h9#}d\Phl jMYt@jHY6=H ujSY @uhYUVW= t1k= t X 9u >tFG>/u12?/u&WV@YYEu}y1_^UE=T t1P,Yjj YYh5j YYh5jr YYh5jd YY= t = = }t }hY hh YYh"Yhh!YY !hh YYh"Yv hh!tYYhh cYYh"Y= 15hh > j!Yz,= u}t}uu  = t&= t=jY##jYE,h Yg= uPMYUb h+Y]jyYtP Y*jnYtPY uYEd+UDVWu؍}ʃ} LU U(j@u YYEtE$UUU U uYyS}_u= uhuYYy u)YugYy uYuhhYY1} u@PYUU5 YX -G=L tiG=H tuG=P tfGUʉ} ud p UEPuYYuPY_^UVu>:uFUE E0 >t>/uE UEF^U5h,h 4 jYU8VWu OQRSTUVWXYZ[\]^_E1j/6YYu }bV:-VUȋUȀ:t@+L H P TˋEEl)M딃}t,hd vYYu44EPEPv juuh ,Ehp vYYu2,EPEPvv juuh_EPEPvN EPEPv; EPIYxEP;Yy h$]Y}hhCYjuYYuYuYjuYYuoYufYjuuh #gEԻn'U u!YU uYjuuh_=}hh |YjuYYuYuYjuYYuYuYjuuh_\ǻ&U u[YU uIYjuuh wEPYh1Y}hYjuYYu Yu Yju YYu Yu Yu Yu Yjuuh q EԻ%hYju YYu^ YuU YuL YuC YjuP YYu. Yu% Yjuuh_& ǻ.%u Yu YU؉ u YU u Y5 Y5 Yjx Y}ut2j6 YE̅y hYU9UuE9}u15 !Y_^UV5 Nx (^U= t u YUVh(U9h(wUh(9h(v 16VPYt1'h(rF5h(&Y5h(^UVW}u1E}UUs 1=d(u8jY=u1V!փ5d(5h(FE5l(OVU}9}r69v2W9UvUW~>}t El(u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=l(<9}r79}u+UOJ}t El(URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15l(t 9ur6E0tU Ul(tU9ru NJEtU9Wu RWE_^UVu~  u 6EPYEU UEPEPV yE^UVux95< ^U$ 9Ut*UUEPjjd y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^U$UUU UUUE1EPjGj U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1UVWuEu41}%<( t4( YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<( t( Bt 4( aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<( t,( R@t( Bt 4( }YGƒ~uFp(FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } +~y UVu CV€tu ,fNV~ u>5 tYt.hxYFu NLNHF 9hJYFuN!NF V@uVVVhUFt$jjv> =uN ?jEPvp =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv/ =u N 3uvvl uNN N_^UUUuuu H UU Uh uu& U= uGhx hx QYZУ j5 j P#  .  B v  jj5 j 5 Z}thx uYYx 'Gkc7woc+ s 3 _ USE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]UW}0OE uG_]1_]U$UUEPjj' U$UUEPjj U$EPu"YYEPj j U$U UEPuYYEPjj U$uYEU UUUUUEPjjv U$UUEPjjW U}u UEuYuYU$U UEPu0YYEPjj UVu x~ 5juIYYy9uuV1YVju! ^U4VWEj/uYYuh Yƅu VYPuYZEЃeuYE=u }؀>t >:tFG9}s/GuWDYYEPuzYY=t4D 2u u* = t  Ũ}t} uFuUR>YỦ _^U(VuEEV֋RUV֋RU E [UUU UEPj7j ^U$EPjj U$EPjj yEU$EPjj U$EPuYY1ۅÉU$u YEu YEUUU UEPj jW U$UUU UUUEPjj+ yEU$uYEU UUUEPj'j U$uRYEU UUUUUEEPjj U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj? ^U0VWEPuYYy1U؁@t 1huKYYDžy1EPWNYYxS U؁@u7jW0YYEx& PjW xh$Yƅu UWYUЉ 1FfFF_^U$EPj*j) yUEUMJ1U$UUUUU UEPjj UVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj] V((5(h(jKje ^U$uYEUUU UEPjj, Uu hT$u U$EPj j y}tUEEU$UUEPj*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U # }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE ^ uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U< m EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ul JxUʋFF VubYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P{E6U U RU U RUEEE }E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPFYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPbYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVWD Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UUas U EUh$ h YYjYUVu@YƋU rU MJwU uRYY^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3WI }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuMYEuUUȋUUEEEPj;j RDY_^U$UUU UEPjja U$UUU UUUEPj6j7 U$} uEEUUE UEPjJj y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P31ۇtPXP: %s %s: %s: %s %s: Unable to continue. %s: %s/%s is too long. %s: Can't read dir %s ..@%s: Master died prematurely. request()report() ! + c w m %s: strange request %s: Can't open %sfork()(rm -r %s) -rrmorder()^ %s: slave died prematurely. reply channel from slave%s: panic: Can't read %d bytes ? (%c) Mode changed of %s %s: Can't set modes of %s%s: made %s look old. %s: can't make %s look old%s: was installing %s %s: Exiting after signal %d 5 5@`5%s: Won't add file with strange mode %05o: %s Installed:Updated: Restored: %s %s %s: Slave read err on %s %s: Write error on %s%s: Can't create %sInstall %sSpecial file %s created %s: Can't create special file %sCreate special file %sDirectory %s created. Add dir %s%s: Can't link %s to %sLinked %s to %s Link %s to %sDeleted: %s Can't delete %sDelete %sDirectory %s deleted. Delete dir %s&" @`UpdatRestor%sing %s (delete + add) (dC '%s: Strange answer from slave. |Destination directory %s created -lrshUsage: %s [-iuf] [[user@]machine:]dir1 [[user@]machine:]dir2 W fK i3 u? !l!w!"3">"$ ##&$##wait()Masterfork()Slavefork()Masterfork()Slavefork()pipe()MasterSlaveunknown errorNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATH555555555%= <@<">X >b=d>i>o=p >u>x >> >#>+>->0>AL?h?l??EAGtAX@b@c[AdAeAfAgtAiAnC@o@p@rAs@u@x@(null)cannot print floating point (synctree==SLAVE====MASTER==.backup SSSSB  /tmp/tmp.0)Unknown error t d L @ $  t d X D 4 $  |dTH8$ hTH0t`LC  h$ z1$T$L@su;SSSSu@@ QRPP$P>U@EPjRYYEPjRYYE]19tA $U=$thhx NYYUV1*ǩt1ʉ 1΋U EEMx1ǩtH1ʉ 1ʁ th`=YDp$_^UVWƅy<5p$1fUOxEƅy UUM11fUU EtƅyUUM11fU;ƅyUUM11fUUt5h`YF5 5'jY= tjYƻPRDp$_^UVu=~ Vhh*YY`J`x"!xtt !h`xS[5YY`J`x!xtt!h`xS5YY^UVu``J`x5tt5h`V4YY`J`xtth`j4YY`J`x@5tt3@5h`VJ4YY=)u#@u0`J`xtth`j3YY@`J`x5tt5h`V3YY=)t8`u0`J`xtth`j}3YY@`J`x5tt'5h`VA3YYxO^UVƃ=~ VhYY^UVWƅyP0׃ ~'t2bƅy#0 ~'t ։_^UV5ZYƨ`t=)t`t։O5Yƅyu5Yƅyu5Yƅyh5YƅyVvl aZS=)t `Q`!@u@1'?N=~ VhhtYY^UV5)Yƅy$=)t`tىM^UVu|$}$~$$^UVW}W։O ΉO Ή ʉ_^UVW} h %Yƅt>t V$Y$h$Yƅt,hVYYuhxVYYt 7d!YXE}}h h`6YYMN7F<->>tP'Y<)$8)8)M}77#Y\)M}t T)X)eP)A2M}75#Y=|=M}s7"Y= |=G<)<)<)8)aM}7d"Y= |=,"`)=`)j Yj YjYj<"YM}T7!YX$=s X$X$X$\$9w=u=\$e\$TI@)<)3)FI}}:UU}Eht05YY}=T)u=`)u<=tEhxhdhh1 uh@hL2YYh Yjhx3YY=$t=u=u hh5h0j4Yh7j YY=ujj YYjj YYh7j YYh7j YY=$u jj YYh7j YY=u[=uh2Yh`[(YuuYY=u&j5Y=T)t$h|$jYYh`(Y=T)tN"tW5X)14YP5X)YYt4#uugijklmnopqrstuvwxyz{|}~YY=uh`'YjY1= EtauYxJxx hxj V*YYjY_^UV) )4)19u~*0)U 4Y=u F0)==|T)X)t =Du 25X)2YP5X)YYtL 1C9 hhx@-YY&=Dt=u hY1^U(VWuP2YY=tdhdP* YYu-/uDh41YPhLP1 t hhx,YY=hux1YYuMh Yƅt>tVP_1YY0PhP/ %H%hu*YY%u 11҉(),)%EPrV0YYUܿ!ׁ@t`u5%#Y1^ O1KPCY8D=DuupY=u=t u0Y1_^U(VW=i=%HtEU:t=%Pr/YY=tRuhhx*hhx*YY1U:tE|Ph YY=Dut 1=V}?t?/u ?.u/Gt4FV/Y=v%VPH/YY.FPV5/YY}%?t GF=/u=u%F)sF=u`=%HtTU:tL%Pr0.YY=t.5%5 %PhhW-%+% %J % %=%y %=%t (%%=Dt&W.YP-%ZPh% YY$hjh%4 =u1_^UV)v t 1sh( lYa$))1Bj Y=u'=)u!h Yƻ@)^UVWE )Uuh` NYY5Y=tCtGt tu׃uhL YCu)Gu)EU9UEuh%YYt/Euuh% =u UU5%CY1`J`xtth`j"YYh`YG5Y1=tCޅt | uh< Y1_^UVWE=~(0)P50)hD hxM&/=~&0)P50)h0 hx&E} ZU)`J`x'}uСtt%h`}uS!YY`J`xU ʡttU h`Ps!YY`J`xU JʡttU Jh`P6!YY1҉׉UUUuMZ`J`xtth`P YYUʋUM11щMF띀=)UʋUM1ʋUڋU]1M1ډU`J`xUʡttUh`P1 YY`J`xUʡttJUh`PYY5`J`xʡtth`PYY=$)t )15kYE=)h$ }Yh hY= )t)h HY )U0)1h Yuh YY x E;U)5YE=t }t΃}Ctȃ}uπ=)u4Eh Y_^UVW}=uA%u Wr ' ƅ19u ~BjWVZYZE u =t GN%%:x%X@ 5%YE=t"} u GNu  UGNu9u u1 NxGE _^UV5%5jh%!95~ ()^UVWu}=~&VWu uhxX!hX hxF!YY_^Ujhl)'YYUVWh`Y5\ jhl) th Y EE=}E=~uuhh hx hp-jYYu%Yjh5% Ej$Y=~Ph` hxX }_^Uh`YUjj5$ Uh"Yh`YU=~?5h$h hx uu uhxh hxYYUVWuu>t0U 9u u} ?uEEG9tF1_^UV:t6hhxD h|hhhx#hXhxYYj\Y^U$V N5$Yh|$jyYYjYh|$jaYY{$=t t1$@# )y$ x$щ u X$55hT =$u jj YY= r =vRhHuYY=t#9s= | =u!= |= 5h< YYEP5!YYU t =T)u:%EPr!YYUt=}B=H,v =Hv =H` v =t9v=t9~55h$ 5\$5X$h ID=={$Qh|$jYY>jhx$YY4^UV=u=)t @t1h$jY=)t!$ @$h|$j[YYh|$jYYjkh YPh jhx$YY%*1&h$=h$p l3^UVW 8) $ <) ~$=@)t~$ ~$ D) }$|$h|$jYYjku u jhx$qYY,j2YDžv*uҸ=%%:x%X@ 5%Y=t.$J$t1ʉ 1֡%`jj5%  VYh|$j YY5%YV=$t!j5$5% t,$$4)Jd) 2_^UVWEd$Eh)5jh) tREjIYE15%ZY)5%DYE1E1=$uhj YYU`$5$Yh|$j YY=`)$J$t4} N}+5Yh`PY5YEEjjN YY1jY j]YuhYY=$thYjaYjYYDE=()t Eh}~ Eksd)94)u EkY=tU+UU Ek:=X$t*`$U`$9\$w`$EjEi=~.=$thdP5$hphx)uuh% $U$4)}k=X$$+d$U9X$\5X$uhP; }jtjURjh% jYE=tjhjh%v xuh@YY=()U=$u jjBYY5$Yh|$j 4YY(165%QYE%5%@YjYz._^UV=`)th[Y$ jhx$ZYY%`j5$5% t ()$$d$4)$9d)u*h)=h)~= ~$d)Z$d$}u$9$/5% Yh|$jYY:-^UjyYh|$j:YYa`J`xttOh`jObYY`J`xttOh`jO5YYjhx$YY0,U=t0xJxxUhxuYYUVLEh$uY\)$h|$jYYjku u djhx$YYwh$9h$~hah$=h$yG$q12hYh3YhvYjPr+^UVW}>-uF>t FtG9uF>uր?=uэG1_^U}x}~ufPxYYUVu~  uD6EPYEU UEPEPVJ yE^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+D"}t}y UU_^U VW}Eyt 1}uE VYFu4=8@2h0h, jYEPYE9Et}u}uEu}u EEE_^UUas U EU$UUEPjj ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sDKVYE=uD&UEUUU}׋U UE8t=+UEEE0YE܋]P3Wu }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGu9YEuUUȋUUEEEPj;j RY_^U$EPjj U$EPjj U$UUU UEPj%j U$UUU UUUESEPjGj\ U} vDM E 1U} vDM ҋE!1UE1UE1U} vDM Et1U$EPjj y}tUEEUUM J} t U RY]uEPu *!1UEUUzt R~Yuh$Z U RuZBRY$ UVW11}U9u F߃| jugYtUrYtURtUzt r*Y}Ht}`t}xt uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv6 =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<t,R@tBt 4}YGƒ~uF $FF VVv vvE >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },I~y UVu CV€tu ,fNV~`u>5d Yt.h0 YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv} =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E <U :t! EE E \U uuu/ YYEy@Ut8hui YYE~" tuYuu YYE}y1]j%YEu u^Y1A!uEUMJUzUBUE_^UUUuuu  UVWu}E} LU9U@U UJxFFSXV YE=tGE MuE봋E_^UVW}EEL#WUW&YwMYFtVYU )uRv EVt tfVV}u1_^UU Uh`uuV UVuh} t1Pu V^UVWu} E,I}t}@t}t ~tVt vYft }uEu(}t"}tupYDžu EN~U VVVu F UV E_^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu3w?L+[oUVW}u M#VUVWqE_^]vL$ UV$$U9$$wU$$9$$vD 16VYt1'$$rF5$$&Y5$$^UVW}u1E}UUsD 1= $u8jY=u1V!փ5 $5$$FE5($OVU}9}r69v2W9UvUW~>}t E($u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=($<9}r79}u+UOJ}t E($URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15($t 9ur6E0tU U($tU9ru NJEtU9Wu RWE_^U 1Uujj Ujujp U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډDF_^U$UUEPjj U$U UEPuTYYEPj!ju U$UUEPjjW U$U UEPuYYEPjj) U$UUU UEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu0 YYU UEPjjK ^U$UUUUU UEPjj U$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V@$8$5H$h,$jKj= ^UU$VWEP YEPEPj j\YƋ}t9uvEZEPg YEEPEPj@ WYUUjEP- YYEPB YWjYZ)‰jEPj jEPj t9r)օu jYVYU)_^U$uJYEUUU UEPjj UE PhT@u Uu hT$u UE Ph T@u UV& T$@, T$@% T$@DE uVu ^U$EPu2 YYEPj jS U$UUUUU UEPjj' UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U8 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Uh)JxUʋFF VuNYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PkE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP2YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPNYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^XOUSE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]Uh hxYYjnYUVu4YƋU rU MJwU uRYY^U$UUU UUUEPj6j U$EUEPjHj É{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PK>kc#ZsXsXfR[[׉31ۇtPXPPlease read the manual page BUGS chapter! mode:%dThe quick brown fox jumped over the lazy dog's back 1234567890 mode(2) in rbsb.c not implemented!! sz: caught signal %d; exiting szxxxxxZSTDERRZCOMMANDZFREECNTZCANZCOMPLZCHALLENGEZCRCZFERRZEOFZDATAZRPOSZFINZABORTZNAKZSKIPZFILEZACKZSINITZRINITZRQINITERRORTIMEOUTCarrier Lostzsbhdr: %s %lxzshhdr: %s %lxZCRCWZCRCQZCRCGZCRCEzsdata: %d %s   h i j k Data subpacket too longBad data subpacketTIMEOUTSender Canceledzrdata: %d %sh i j k Data subpacket too longBad data subpacketTIMEOUTSender Canceledzrdat32: %d %sZkZZ*5ZZ*:ZZAKBClzgethdr: %d %lxzgethdr: %s %lxGot %sGarbage count exceeded zputhex: %02X qqzgethex: %02X7[ [[hijklm[[Bad escape sequence %xe veeveeeOeOeeeev+N it0Xm^&|!0C<\~rz POSIXsz 2.12 05-29-88%s %s for %s /tmp/szlogCan't open log file %s a/tmp/szlog-rkshrshSHELLZNULLS Can't open any requested files. echo "sz: Can't open any requested files"4###rs%d.szONAME- sz: Security Violation /usr/spool/uucppublic/usr/spool/uucppublic../%lu %lo %o 0 %d %ldAwaiting pathname nak for %sGive your local XMODEM receive command now. Sending %s, %ld blocks: &?&l&p&*&Ce&GQ&Timeout on pathnameNo ACK on EOTReceiver CANcelledwctx:file length=%ld+C++s+c+!+CS+Retry Count ExceededGot %02x for sector ACKGot burst for sector ACKNAK on sectorTimeout on sector ACKCancelled Sector %3d %2dk Sector %3d %2dk -ret %x Timeout=%d Calling alarm(%d) TIMEOUT Retry %d: - as pathname sends standard input as sPID.sz or environment ONAME y Yes, overwrite existing file (Z) Y Yes, overwrite existing file, skip if not present at rx (Z) w N Window is N bytes (Z) v Verbose - provide debugging information u Unlink file after transmission q Quiet (no progress reports) r Resume/Recover interrupted file transfer (Z) p Protect existing destination file (Z) o Use 16 bit CRC instead of 32 bit CRC (Z) N send file if source newer or longer (Z) n send file if source newer (Z) l N Limit frame length to N bytes (l>=L) (Z) L N Limit subpacket length to N bytes (Z) k Send 1024 byte packets (Y) i send COMMAND, ack Immediately (Z) f send Full pathname (Y/Z) e Escape all control characters (Z) d Change '.' to '/' in pathnames (Y/Z) c send COMMAND (Z) b Binary file transfer override a (ASCII) change NL to CR/LF + Append to existing destination file (Z) 2 Use 2 stop bits sx [-2akquv] [-] file sb [-2adfkquv] [-] file ... sz [-2Ceqv] -c COMMANDUsage: sz [-2+abdefkLlNnquvwYy] [-] file ... (Z) = Option applies to ZMODEM only (Y) = Option applies to YMODEM onlySend file(s) with ZMODEM/YMODEM/XMODEM Protocol "The High Reliability Software" POSIXsz 2.12 05-29-88%s for %s by Chuck Forsberg, Omen Technology INC %s l2X2_2//X2/Txwindow = %u Txwspac = %dRxbuflen=%d blklen=%dRxbuflen=%dRxbuflen=%dRxbuflen=%d Tframlen=%dN3J3C3|3 4|3|33|3|3|34|3 4 44|3|3|34|3|3 4l55555 55888p888888Z5window = %ld%ld window >= %u CRC-32 %7ld ZMODEM%s ERROR: Interrupts Not Caught sz: Tcount = %ld 9 999999999 9 99999999 9 ***** Signal Caught ***** ::'::m;K;K;;,;m;m;m;f;m;f;f;f;m;m;m;m;m;;f;******** SZ *******rz******** RZ ******* countem: Total %d %ld %ld Countem: %03d %s Mode %d character transparency test ends. %02x Hit SPACE or pause 40 seconds for exit.  Enter Characters, echo is in hex. Hit Enter. %02x Hit Enter.If Pro-YAM/ZCOMM is not displaying ^M hit ALT-V NOW. Character Transparency Test Mode %d -csh/bin/shcd .MaMrkMwzMM+MbMOaOrzOwOO+ObO#W#W#W+\\\$\u] ]@N]r^X[^b@^dR^iR^oI^p[^uR^x[^K_ <_#A_+7_-2_0F_=bL%`h`l`C`EaGaX/ab/acadmaeafagaiman`o/ap/arbs`u/ax/a(null)cannot print floating point T$` n0,pX` %!B c0@P`p)Jk1s2R"RBrb9{ZӜb$C4 dtDTjK( ōS6r&0vfVF[z8׼HXhx@a(#8َHi +ZJzjqP 3:*˿yX;l|L\",<` A* hI~n^N>2.Qp:Yxʱ -No0 P%@Fpg`ڳ=^"25BRwbVr˥nO, 4$ftGd$TDۧ_~<&6WfvvF4VLm/ș鉊DXeHx'h8(}\?؛uJTZ7jz *:.lMͪɍ&|ld\EL<, >]|ߛُn6~UNt^.>0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-@ Txdxph`XPH@80( Bad CRC0123456789abcdef(pXD p T , ` 4  h L ($SSSSBH`x ((((( AAAAAABBBBBB *  1$T$Lsu;SSSSu QRP PU uEt9uu uN}uNF9uuu9v)hHRjV.U)hHRjV+UhHRju}tP t1_^U,VWjjj 1<`hPj ~%Pj yŸiyYjYG뗃tPjYY=u o9sjjjq RG_^Uh`hdj YYj6YUVuj jVS ^UV5Nx (^U=tuYUVU9wU9v  16VYt1'rF5&Y5^UVW}u1E}UUs  1=u8j<Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVW=,aU9(} (M :-u(zu (M h4 YYu((M ,ǣ:tWuc YYƅ}=$t=E h`0YYh`hYYh`WYYh`j YY(M ,,:u(,? F>:(M ,C;t!A (M ,C$(U9(|W=$t=E h`0YYh`hYYh`WYYh`j YY,?`(A (M $,7(M ,,:u,($_^UVWuU VVu}YYDžt~~yVډ F_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }V~y UVu CV€tu ,fNV~Hu>5LdYt.hYFu NLNHF 9hbYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjvM =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVu JxUʋFF VuRYY^UVWu }E?t:JxG^FSX GVP YY=uEE_^UVW}EEL#WUWYw9YFtVAYU )uRv7 EVt tfVV}u1_^U VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^;w 4+USE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]U$UUEPjj U$UUEPjj U$U UEPuYYEPjj U$UUU UEPjj] U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjw UU$VWEPYEPEPj jYƋ}t9uvEEPYEEPEPjx WgYUUjEPeYYEPzYWjAYZ)‰jEPj6 jEPjF t9r)օu jYVYU)_^Uu hT$uM U$UUUUU UEPjjG UVWuEu41}%S1$T$LLDsu;SSSSu QRPH Pj/U\VW}|}~hh^YYhhI8YYyhlh^YYTEyhHh~^YYvh8h<\YYDžu!hhhG^ >kE0jPW^ t(hhh^ WUYWjj0EP^=t(hhh] WUYWUYjEPhHSb HjRYƅuhh]YYxjFPhKb  KEPVx`YYyh|\^Y9UuhHh]YYU j@raYYƅtFIU j rhHa IhVhJqa K}~U jrh$KOa $K4KhJ4YEu!hJhhj\ aUMIr 1hI_ thh*\YY%t+u 1_^UHVWh<YhJhH@YYEPj^YYƅyh,\YEM҈MMԈMEjEP5 I^ ƃth Y jEP5 I}^ ƃthqYEPEPUYYEPC^YƅyhBY]Džy"h'Yu]Yu]YuZ5 I]Yu]YjHhHu] ƃHtuu]Yj+Y5H5HhH uI]YS]DžyhYu*]YtH=u5j@hH5 IO] ƅ~5HjHhHuY] u\Y5 I\Yj\P\YYjV*YH=uJj@hHj\ ƅ~35HjHhHu\ VhH5 I\ E9tjW{\YYu9\Y5 I-\Y_^UhuJ-YYUVuh@h.YYY?hj-YYhj-YYhj ,YYhj,YY5LK[$Y5LKYHKjj5PKP8Kj58K|YY58K$YHKjP5PKjB5PKJVZ~j-5!YY5YHK@HKjP5PKRZ)JR@Kj5@KYY5@Kb#Y1^UV58KjjV U:tuh\V V>#YV$YVY^UVuU :tS5PKV[YPu [YZZ)Rj5` u Vhl5Q<5PKV[YZ)Rj5 Vhd5 5Y^UU KU DKJ EKU J FKU VWU48KU IM EEM} t} u j VYỲ}t}tUKU9u VRYU~} t!PKJ9uV-YPhtV EPVYYY[VY_^UVWENEUUzOx4OWuu E} tMNEj uYY}Wuu} F_^UHKJjR5LKW 5LK!YU0VWhx$YEuEljuWYY4y,5PO(YPuhLhSh@hD .YYEu'hhSYY54ZVYU#Jf 4EMM M IUf4fUEPh@n@54,V ƅy!hETY54UYcEPhAn54U ƅy!hTY54UY%U\KfUfTKhF#YDžujWUYY Iy65P&YPWhhzR54,UYEM0IU؍EPh0n@5 I&U ƅy*h?SY54TY5 ITYTEPh1n5 IT ƅy*hxRY54TY5 ITY fUfXK1_^U Vh:j%YYu FTYh h54T ƋPUjTYUPy=Pu.yhSRYuVhuT 1^UVEMM M fTKfU} t \KU IUf4fUEPh@n@54S ƅyhQY}EPhAn54nS ƅyhQYNjTu54S ƅyh\QY#TtjTVhh!P1^UUVEM fXKfUIUfUfUEPh0n@5 IR ƅyhTPY{EPh1n5 IR ƅyh8PYLEEPh2n@5 IPR ƅy=P;uyh UPY1^UVEh:j#YYuQYEPh3n@5 IQ ƋPUjQYUPy=PuyhpOY1^U}uuY?U zu12U J sU J4Y h<rYUTVWjTjEPQ EUUU Uf`K`K `K فfMfXKfU\KUf`K`K `K فfMfTKfUƋ\KUqPEj hHEP*R j hHEPR jh$KEPR 11=]BWZMuIuEPYYujuiYYutUM9u MZ9t1떉_^UHVW1hYGjEPWjsƅtK}uEEPYƃuhYjEPuj7u1hYE=U؉AM؃h|EPjPjjPv t UUuhpEPM EPY}u,GhHEPjPWjP tAjYƅJjEPujGjEPuj4_^UUER8][Uu u5LKI =u#LK LK R8LK[UVuuu V =uN8^^UuhhJ jYUxJxxUhxuyFYYUhjuu 5Q= P`? Uhj5QF? UVWuh0LA:YY=t dEPhTjL u>UtE h8z;YHKUtE h4\;YPK h0J;YHKh,:;YPKP0PhPh(;YYQhPh$;YY QhPh ;YYQhPh;YYQhPh{;YYQhPhe;YYQhPhO;YYQhPh 9;YY QhPh#;YY$QhPh ;YY(QhPh:YY,QhPh:YY0QhPh:YY4QhPh:YY8QhPh:YYt'19tGF FԋKKKKKK KKKKKKKKKKKKoKLLL LLL1_^UhlKjIYYhKjIYYK1,LKP1ۅÉ$LKP1@u@(LK1ۅÉdKUjYHKJjRYY5LKYhj5Q: 5LKY5hKY5LYhlKjjH 1Uh<(YEu1uSYjj5PK5HK=Lu1^jj5PK5HKhKu19jj5PK5HKLKu1j5hKYYLKUVu}xU9V | U 9VD9VH} UVU 1^UVW}jL Yƅu djWYYF8uVYBjWsYYFuuh4lB h45LKR YY=u h4hDYUUUuu u =u;uuh4B h4u YY=u h4DYUUUuUYh4uK YY=uuu h4A UU U5LK Yh45LK YY=uuuh4bA UUUu u5LK =u?5LKYh45LK YY=uuuh4@ UUUuu ut =u9u3Yh4u) YY=uuuh4@ UhK9Uu B$ uYxU(VWuLUVUVUEUU؋U9VN<< U$LU$LU,LU,LUdKxUdKdU(LPU(L<Uu uYYYULU  LUVu95<5<hj5Q/ = t'WuYY9=PK~> tۋPYGGEhx0Y_^UVW6MR<U6R@UhKR8]׋6R8]֋U9UW9uU9Ut:uu YYU9Uы9uU9Ut6YEӋE띋6MR<6MR@_^UVL6hKz$t5hKY=6z$t56Y#195HK~6R<VU#V UV8N  MEV8M MMU9Uw:EU9t*UU}uV8M+ șEUEE뾃}IVV8UN UU9UwUEEV<V@N G빋VDF_^UVu u9Y=t> tF=u 1^UVWuVu19~|V8<t 4&YGv<Yv@Yv8YVY_^U VWu#V 6~,VD9VH9VDN8U~D9~H~%BN8^8V<V@N G֋UUU+UЙ9F |6EEڋVHN8]VD9~VHN<VHN@^ _^U VW}WUW U19u|W<W@M F_^U=,Qhj5,Q\& q=0Qdhj50Q5& M=4Qthj54Q& -=0Qt$hj50Q% tEgUVWu1~,u#VtV J9VuVJ9u =,Lt=$Lu}G`J`xttSX h`*YE=,LtAVVNRQ5hK> =tEP5hKyYYEPVlYYtE_^U VWUU UR=YDžu1u9v _^UV5@Nx HQ^U=DtDu$2YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UV6U96wU696vP 16V0Yt1'6rF56&Y56^UVW}u1E}UUsP 1=6u8jY=u1V!փ5656FE56OVU}9}r69v2W9UvUW~>}t E6u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=6<9}r79}u+UOJ}t E6URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV 0 uY_^U VWUUb156t 9ur6E0tU U6tU9ru NJEtU9Wu RWE_^UVu~  uP6EPJ#YEU UEPEPV" yE^UVux95^U8VWEU UUUUfRf`K`K `K ىM؋UfRf`K`K `K ىME7Eu }}`uuVuuDžyQ1W΋UP7u/YljUUU)UVuV@ YYZMԃ}~DVuV! YYZ߃}t&UBt Q Q1+Ed7ET7d7E6E`76EM9uuuVuuDžV YEV YEV Yǃ}u@ց}7sUEEu-YljUUU)U]}tE} u?uuVuu Džy +֋UP7P7}u}t }t&9=\7t U9UtQ=\7UŨ}u1X7}u UP7uu,YZЉEE1UU;s-UEȉEWVR+ UUE;}tEEP7 Q1_^UVW}-0= >N>.WoY;=uQ1=P7T7d7d7X7\76;6`76P7X-0= r>.uF\hPjjW y1jPi _^UVW}}t1PGPGPGPhPG(hPj jP Ey1HjuP ƅu1*UVU V 6;6;_^U Vjh)YYƅyHu uV) EV(Y}u"U JUj u)YYEt1^UVW5Qx,Y,DžD7u)YYtw>t6u)YYt} tu w )YYu=QuQ,_^UVuEPVYYtEP^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU EZ} tF=Q Q ًQ ʋ Q ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U@Y}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!;W+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UnV>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWQuI'=u hPjjjuu uj*$ƅQuuVPƅyQ}Gu^fWf`K`K `K uL0Q7Q+QQW0T_^UVWEQu)&=u NPQuE>t >.uEF}u)uYƅtuuuu V_}u Q€u$}N>.QR?quuuu 7uE~=P;uQl=QuE=Qt =QuQt놃}t"uuuu ju%E~}t Q_^UVW}} uBW, Y-Ɖ:.u#sVWP Ƅ5*"u hWhhTPuuuu_^UVWhdYEth`uYYEu1EuhP >tuF>nuP. YYuFu>tDG?tuG1҈<hVh; uY; uY1_^U@VWEEEUUЋUUE=Qu"=u Qu } ~1EUffUEQ9UYEQ9U;}DžQU=Hy2UMEPUQP4Qw H=#U f`K`K `K فfMjEP5H =t$PU5HYH^u u5H 9E t$PU5HBYH}fEU܅t2EPW5Hh ƅ~U)fUU܅tBPU5HYH}<}EM}ff`K`K `K ىM9M}#UfUDž #UfUU܅t2EPW5H ƅ~U)fUU܅t$PU5HYHUJÜJU+UfUU܅VU܁vE܉VP5H ƅU)fU멃=HyHyPU'UMUQP4Qu u5H(9E MQUԃ}~ Eԙ=QEԃ}Euuu5HE=u=PEEUM9uQ u+UBt"5HoYHE}tQt}u Qu5H*YHEaEE=Hx5HYH}u}u P;P= UȉP_^U=Ht5HYHU$VWh|LYDžupjWYYƃuPEE1UUfU fUEPh0n@VV E=uPEVYGEEPh2n@V E=uPEVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh,YDžujWYYƃuEE73EPh@n@VR E=u PUVYUP_^UVWURYƅuP wUWfUfW fG #UfWuu FPY URVu EPUV!Y}r UUUPE_^UhLjpYYj#YUVWURYDžuP hLj'YYEuYEURWu  ƋPUxw7~1WcYjYujYYuYUP@RGPu 4 WYjOYujYYu:Y_^UVWEEPYNjE E PY9uuԅt9}t t1_^UVW}u1]MEEPYNjE E PY9uuąt9}t t1_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu}YYDžt~~yVډPF_^UVW}u AYfE=Th@YEu EPU:/tHhYEt/u uYYuhuW Ehu YYEuTE+UMuRQ% uuYT1WZY-E8\ttF>#tEPVu H u&E8|t E8:uuWY>t >|t>:tFF<|t<_^UV5Tt}uEF<:t ~u1tFjuV uˀ~#uōFPY^UV5Tt}u7F<:t ~u1&tFjuVP uθ^UVW5TE 8t}u1F<:t ~u1tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!FC ,CGF9GE UE 8E_^U VW<EEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"|+EUDUBU FE<_^UVuu>t FPUY^UHVWEPu YYxU܁ t1hX Yƅu1V YDžU9uhXh=YYhh=5YYGPh=%YYEPh=A YYxU uUM9uE]9pE]9`V Y= V Y1_^UVj$Yƅu jYƅu jYƉ^U VWuYƅu1PjhV t18Et]3V YYu $ G1_^U$UUU UUUEbEPjGj U} vPM E 1U} vPM ҋE!1UE1UE1U} vPM Et1UVW11}U9u F߃| jugYtUr^YtURtUzt r2Y}`t}xt}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv= =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hWYF~uN NF 1}9<t,R@tBt 4YGƒ~uF$=FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }D2Y~y UVu CV€tu ,fNV~xu>5|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv. =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E ?8U :t! EE E 8U uuuGYYEy@Ut8huyYYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu | UVWu}E} LU9U@U UJxFFSXV YE=tGE MuE봋E_^UVWu1fϋV€t}u ~tu>FtVYU )uRvo EVt tfVV}u1_^UVW5P4YNj5hx9Yh.Y}t.U:t&uYPuV jhV WYPWV jhV _^UUURu hu'UUURuu uUEEUUUUU JUEPuut EUJUx ]E EPjYYEUuu huUEEUUUUuYEuu EPk# 7 /'.USE] ![]USE] ![]USE] ![]UVW}u M[+UW}E Mr/u'uĉ fE_]>+UW}0))ϊE tu1_]XG_]+UVW9+E_^]>+T$ *L$ *UVWM*E_^]UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+P"}t}y UU_^UUas U EU= uh( h, YY  5 m'YU QU= t5 Y QUVW= u!hP hT +YY u1D5 hh8= Eu1U:#thL u YYƅtUt3> t> uFAs7h< VYYƅtFt]9uFG1_^U VWDžDžQQQQQjh YYuQg#Jfh YƅthVhQ h h YYE(uhPG jhx P _u> t> uF>t> thVhQt j hQYYƅtDždjhp P( 9> t> uF>> hVhQ j hQt3Ss+> t> u E}t 7EFȀ>t > t> tFDžoj hd P3 Q=QD> t> uF>(> QQPV;YYQff UQQuY=Qu"QffQQ=Qu=hPYYu&j.PYYƅtFPhQYY]RQQE>t >.uEFQ}|Ssj.V\YYF7M Q1_^Uu1^UVpEUlEP'YtlElE:"uRlEjYƅt(>"t#=pEXEu1{pEpE0ʋlE:"u;lE0jYƅu1C=pEXEu13pEpE0=pEXEu1pEpEE^U=0y _y1Du17jRYXEtjAY\E`EdEXEUVƅtu6YYu^U$UUEPjj U$UUEPjjg U$UUEPjjG U}uP UEu謿YuYU$U UEPu,YYEPjj U(VuEEV֋RUV֋RU E "UUU UEPj7j~ ^U$EPjje U$UUU UEPjjA U$EPjj) U$EPjj yEU$UUU UUUEPj6j U$EPuYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjjg yEU(VuU @t*uYEU UV֋RUUUEPuLYYU UEPjj ^U0VWEPuYYy1U؁@tP1huKYYDžy1EPW&YYxSPU؁@u7jWYYEx& PjWm xh$跺YƅuPUWYUЉP1FfFF_^U$EPj*j yUEUMJ1U$UUUUU UEPjj UVWuuP 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj VEE5EhtEjKj ^U$uYEUUU UEPjj Uu hT$u UV& T$@, T$@% T$@P E uVu ^U$UUUUU UEPjjS UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuuƀ}Xu9utUP/YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"UdEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U!JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPdYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYYY=u˃}t Uډ E_^UVWu }EF$E)E EEEL/-t+u-U EMtJxFFSXV;Yǃ}0}U EMtJxFFSXVYǃxtXt}iNEB}tG?%u2JxFFSXVQYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G E=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVCYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=Fr}Fu8-t8+uEE-FEE}dt}iuuEPhFh EuEPhFj EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVlYEEEuU}}t Vu;YYMEuE}uEG?^u EGEEE}Fs UE?]u GƀE?Z?]QGƀE?-uG?t2?]t-G9"G@E9EEƀEEGE띀?uEEE3]uVuIYYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tEE3]u}t}t VuYYMEUEt }vE}uEuVu E=Fr}Fu8-t8+uEE-FEEEPhFYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY Ej EEu }ntEGV}u}tE_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`UVWu }tV€u4V9Vu>t FN~U9tUE_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UhDh YYjnYUhdhYYjNYUVuLYƋU rU MJwU uRYY^U$} uEEUUE UEPjJjM y}tUEEU jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UE UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBË+C;Cw Ë[ uӅu P]KI|;u[u P7@u.`=}aa1ۇ<tPXPtalk: Error in NetInit talk: Could not determine address of %s talk: Your terminal is not writable. Use: mesg y talk: Could not stat local ttytalk: You are not on a terminal /etc/utmptalk: Could not read %s /etc/utmptalk: Could not seek %s /etc/utmptalk: Could not open %s r/etc/utmptalk: You are not on a terminal talk: Error getting local host name Usage: talk user[@host] [tty] Could not forkCould not forkCould not create pipesConnection Closing due to errorConnection Closing due to errortalk: tcgetattrtalk: Could not initscr [%s] %s %s@%s %stalk: ioctl NWIOGTCPCONFtalk: ioctl NWIOSTCPCONFtalk: Could not open %s: %s /dev/tcpTCP_DEVICEtalk: ioctl NWIOGUDPOPTtalk: ioctl NWIOSUDPOPTtalk: Could not find ntalk udp service udpntalktalk: Could not open %s: %s /dev/udpUDP_DEVICEtalk: Read error in getreplytalk: sendrequest size mismatch %d %d talk: write error in sendrequesttalk: ioctl NWIOGUDPOPTtalk: ioctl NWIOSUDPOPTtalk: ioctl NWIOTCPCONNtalk: ioctl NWIOGTCPCONFtalk: ioctl NWIOSTCPCONFtalk: ioctl NWIOTCPLISTENBad Control AddressBad AddressIncorrect VersionAre request was not knowUser is not accepting callsRemote Does Not Know who we areFailureUser Not Logged InSuccessBad AnswerCould not leave are invitaion locallyRing #%dNo response to are ringRinging UserYour party has hung upInitiating Talk Protocolcurses: %s vbblacaeasvsveviueusmdmbmemrcmsesoclcolicoliTERM)v) ( A) o))|.- ./.unknown error%u.%u.%u.%u.in-addr.arpa/etc/hostname.file;;u;;;==w<<@?8?G????AAAAAAA%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEr/etc/termcapTERM/etc/termcapTERMCAPR 0`R1`R2`R3`RE0RbPRfXRn8Rr@RtHRR\RR R)T%#T+5S2hSdSiSr)SOOPS//dev/?^a,^r^w^^+c^bY^ : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesnameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain8o9mnsrssrssrssssxrxyxxy My@yzXzbtzdzizo}zpzuzxz{ p{#u{+k{-f{0z{q~LY|hC|lN|w|E ~G}Xc}bc}c}d}e ~f ~g}i}n|oc}pc}rQ~s}uc}xc}(null)iX7bRd@i7oIp7u@x7LhlE9G9X-[b-c?d-e9f9g9i-nʇo-p-su-x-cannot print floating point cannot print floating point H4 ><v^#: #+'#+++++- - _++++|+,.-0ahI`fgjklmnopqrstuvwx~SSSS/devB`xS ((((( AAAAAABBBBBB Unknown error  p d @ 0   p \ H 8 (  x d H 4   t ` L 4  C/etc/ttytab  a/81$T$L su;SSSSu  QRP`= P Ul}~AU hxrlAYYu}~hdh >YY b@th@h >YYhhh="YYyh h >YYZZthh o>YY9EPYu&EPEPYYuEPEPiYYt̸UVWh8 Yƅu,jV?YY0y*5 YPVh h =ZjVa?YY0y65 wYPVhh =50?Yhh)"YYEu3hh ]=YY50>Y50>YU#Jf 0EMM M0f0fUEPh@n@50> Džy*h<Y50T>Y50H>YIEPhAn50<> Džy*h|<Y50 >Y50>Y1_^UVWuh h50= Džyhl\<Y^sWh4h < <E׋UJ9t%UBPWhh ;TtjTWhh ;WhV= = hh ;YYFPFPFPPhh ^;vhh I; F Pv FPhh *;v(hh ; FPvFPhlh :FDPF8PF,PhDh :1_^UVWu EMM M f0fUURUUfRfUEPh@n@50 < Džyh:YEPhAn50; DžyhS:Y= {hh  :YYFPFPFPPhh 9vhh 9 F Pv FPhh 9hh 9YYjV50N; Džyh9Y#tjWhh `91_^U VWu }ONFFh>h> h> ًh> ʋ h> щN?t F1hfWfl>l> l> كt F1.fWfl>l> l> كt F1W,UU:- =_r F1EՍGDPG8PYYF~jjGP Eu FjWaYYEuW3YF]3WeYYFUWh> h> ًh> ʋ h> ыURh>h> Ëh> ڋh> 9v)UBURVE0WYYFURVFjWkYYEuW=YFoURVF]jW9YYEuFFURVUjRFP8 F"wdYFF8G_X1_^U@VWUDRhEP6 EPEP7YYy Uu hEP4YYƅu jEP7YEPY7wwhh=hV5Uu ,Rh|V5Uu ,RhTV5V"0Y1_^UVW}EP+7Y5 U9VX} VY} uFj FtN\J\~\tV\ VY^U =    h> h> ًh> ʋ h> щU8VWjh,4YYDžyh*3Yuj0EPW4 =0ME=ujuEPg5 uƋU :tj u EPJ5 uEPu 5YY1W4Y_^UV5 Nx p>^U= t u3YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW u4Yƹ< +F؉F +ډV YV YDžt"<1FF1V Y_^UV0U90wU090v 16V*Yt1'0rF50&Y50^UVW}u1E}UUs 1=0u8j*Y=u1V!փ5050FE50OVU}9}r69v2W9UvUW~>}t E0u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=0<9}r79}u+UOJ}t E0URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb150t 9ur6E0tU U0tU9ru NJEtU9Wu RWE_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh EPmN>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h VW ƅu1WW-YZ׀>/u5Fuh VEP ƅu19ut EEG>,t1jFh VW ƅu1MWWT-YZ׀>/u0Fuh VEP ƅu1EEGu>t1_^UVWuE}>:tVh<1,YY_   U  U V,Y=Vh<1\,YYVh0wYYƅ>-uF>+uFjVEP ƅUU j h05 6, 1 0Vh0YYƅpj h05 + 0>t>,tjVEP ƅt5U >t'>,u"FV+Y=xwVh0YYƅu_^UhYPLY    UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0JX 4EU M R+Q¤ЙЙUuW +UЙOIkkE0X UM 9_^UVWuE E= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fyl> l> ىM؋UfRfl>l> l> ىME\3Eu }}`uuVuuDžy>1W΋U2u"YljUUU)UVuV@ YYZMԃ}~DVuV! YYZ߃}t&UBt > >1+E2E22E,2E2,2EM9uuuVuuDžV YEV YEV Yǃ}u@ց}X3sUEEu}!YljUUU)U]}tE} u?uuVuu Džy +֋U22}u}t }t&9=2t U9UtQ=2UŨ}u12}u U2uu YZЉEE1UU]7s-UEȉEWVR UUE;}tEE2 >1_^UVW}-0= >N>.WoY`7=u>1=222222,2`7022,22X-0= r>.uF\hPjjW y1jPi _^UVW}}t1PGPGPGPhPhPj jP Ey1HjuP ƅu1*UVU V ,2`702`7_^U VjhEYYƅyHu uV2 EVY}u"U JUj uYYEt1^UVW5>T Y DžD7uYYtw>t6ujYYt} tu w NYYu=>u- _^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEyDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s yu1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU ,E:} tF=h> h> ًh> ʋ h> ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#UH9}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!`7+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#Ux6>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW?u%=u hPjjjuu uj$ƅ>uuVPƅy>}Gu^fWfl>l> l> uL0>7>+>>W4_^UVWE?u=u N >uE>t >.uEF}u)uYƅtuuuu V_}u ?€u$}N>.?@?quuuu 7uE~= ;u>l=>uE=>t =>u?t놃}t"uuuu ju%E~}t >_^UVW}} uBWY-Ɖ:.u#sVWP! Ƅ5*"u hWhhPuuuu_^UVWhoYEthu*YYEu1EuhPZ >tyuF>nuP. YYuFyu>tDG?tyuG1҈c8hVhd7 uv Yd7 uf Y1_^U@VWEEEUUЋUUE=?u=u ?u } ~1EUffUE>9UYE?9U;}Dž>U= y2UMEPU?P4?w =#U fl>l> l> فfMjEP5  =t$ U5 Y ^u u5  9E t$ U5 Y }fEU܅t2EPW5  ƅ~U)fUU܅tB U5 /Y }<}EM}ffl>l> l> ىM9M}#UfUDž #UfUU܅t2EPW5  ƅ~U)fUU܅t$ U5 SY UJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃= y y U'UMU?P4?u u5 (9E M>Uԃ}~ Eԙ=?Eԃ}Euuu5 E=u= EEUM9u? u+UBt"5 Y E}t?t}u ?u5 Y EaEE= x5 O Y }u}u  ; = Uȉ _^U= t5 Y U$VWh YDžujW YYƃu EE1UUfU fUEPh0n@V E=u EVd YGEEPh2n@VV E=u EV( Y E_^UVWuut.Vu u+ Dž U)U U )΋E_^U VWhYDžujW YYƃuEE73EPh@n@V E=u  UVb YU _^UVWURYƅu wUWfUfW fG #UfWuu FPe URVu E UVUY}r UUU E_^Uha7j YYj YUVWURYDžu ha7jW YYEu2 YEURWuD Ƌ Uxw7~1WYjYuj YYuYU @RGPu @ WQYjYuj YYuY_^UVWEEP YNjE E P Y9uuԅt9}t t1_^UVW}u1]MEEP} YNjE E Pk Y9uuąt9}t t1_^U$UUEPjjg y Ut1UVW5tt}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډ F_^UVW11}U9$u $F߃| jugYtUrYtURtUzt rY} t} t} t uY_^UVWuEu41}%<$t4$YtEG֋E ~tV€uFu1V€cE~tVuډUjuv5 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<$t$Bt 4$aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h3YF~uN NF 1}9<$t,$R@t$Bt 4$YGƒ~uFd8FF VVv vvU >uNN FFSX_^UVWEE11<$tN|1DFρECEE0-EMP1E E #U :t! EE E  "U uuuYYEy@Ut8hu5YYE~" tuYuuYYE}y1]j]YEu uY1A!uEUMJUzUBU$E_^UUUuuu < UVW5 YNj5h Yh Y}t.U:t&u+YPuV jh<V WYPWV jh8V _^UUURu hu'UUURuu uUEEUUUUU JUEPuu0 EUJUx ]E EPjYYEUuu hu 7 K ?kUSE] ![]USE] ![]USE] ![]UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]L$ UVWME_^]UVWx8EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhX u%dEuEu1k0Z‹N9U=t5&Y>UVW=u!h h YYu1D5hh8 Eu1U:#th u YYƅtU<h uYYEtEU: t: uEh uYYƅjFuY%fl>l> l> ى <5<<<h VWYYƅtFt8>t3> t> uF8=s7h VYYƅtF<_^UVW}Utu >t]9uFG1_^U VWDžDž>>???jh &YYu>g#Jfh YƅthVh? h h YYE(uhP jh Pe _u> t> uF>t> thVh?4 j h?YYƅtDždjh P 9> t> uF>> hVh? j h? YYƅt?@7E>t34@s+> t> u E}t 7EFȀ>t > t> tFDžoj h P Q=?D> t> uF>(> ??PV_YY?ff U??u`Y=?u"?ff??=?u=hPYYu&j.PYYƅtFPh?YY]@??E>t >.uEF?}|(@sj.V,YYF7M ?1_^Ul> l> فfGGUxO шO?t1W ˆW?@t1W ˆWWWu$ U( U(ỦUȋU$EȉEEEUUm(y učEPu(Vu 8Ey u֋U(+UU(Vu,YYVuYYfl>l> l> فfO}`}Vm( učEPu(VuEy 2u֋U(+UU(Vj YYVuYYVjYYVjhYYfl>l> l> فfO U9U(} FVuYYVuYYVjYYVuYY}tuuV ufl>l> l> فfO  E+U$_^U$UUEPjj U$UUEPjj U$UUEPjj U$U UEPuDYYEPjj U$EPjjq U$UUU UUUEPj6jC U$UUU UUUEPjj yEU(VuU @t*u.YEU UV֋RUUUEPuhYYU UEPjj ^U$UUUUU UEPjj{ U$UUU UUUED\EPjGjH U} v M E 1U} v M ҋE!1UE1UE1U} v M Et1U$uYEUUU UEPjj\ U$EPj jA y}tUEEU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 0 }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEH uVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U 1 JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEp UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEE ! E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } "<~y UVu CV€tu ,fNV~ u>5 Yt.h蜴YFu NLNHF 9hnYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju= E`UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UVuj jV ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0ytFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^Uhx h YYj袭YUVuYƋU rU MJwU uRAYY^U$EPuYY1ۅÉUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj VP=H=5X=h<=jKju ^Uu hT$u UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^U$} uEEUUE UEPjJj y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPtalkd: Error in NetInit talkd: Error getting hostname talkd: Must be run as super user Usage: talkd [-d] -dtalkd: ioctl NWIOGUDPOPTtalkd: ioctl NWIOSUDPOPTtalkd: Could not find ntalk udp service udpntalktalkd: Could not open %s: %s talkd: Could not open %s: %s /dev/udpUDP_DEVICE %-12.12s %-12.12s %-16.16s %04x %08lx:%04x %08lx %04x %08lx:%04x %08lx %02x %02x %02x %02x Request: talkd: Size mismatch in request %d %d talkd: Size mismatch Packet %d Udp Data %d talkd: Packet size read %d is smaller the udp_io_hdr talkd: Read error in getrequesttalkd: write size mismatch %d %d talkd: write %04x %08lx:%04x%08lx %02x %02x %02x %02x Reply: talkd: ioctl NWIOGUDPOPTtalkd: ioctl NWIOSUDPOPT~Ltalkd: to answer type: talk %s@%s talkd: %s@%s would like to talk to you  talkd: Message from talkd@%s at %d:%02d:%02d w/dev/%stalkd: out of memory in insert table talkd: opening UTMP file/etc/utmpSaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error%u.%u.%u.%u.in-addr.arpa/etc/hostname.file}&}& &&&G&''')))*;**`,T,`,H,<,`,`,%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICEo>a\>r7>wF>>+>b> : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesnameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainMKLQ =Q@rQRXRbdRdvRivRomRpRuvRxRoS `S#eS+[S-VS0jSaVLITh3Tl>TgTEUGUXSUbSUcUdUeUfUgUiUnToSUpSUrAVs UuSUxSU(null)cannot print floating point d=GMTGDT U U tldXLD8| SSSSB 8@ ((((( AAAAAABBBBBB Unknown error h X @ 4   h X L 8 (   pXH<,||||||||||x\H<$xhT@C  P. P1$T$L$ su;SSSSu QRPPUV5(VYPu5 5 hh\< 5(^Ujjj ~= t  UE8t0 YEU5 hh\ j]YU`VW} 1 W:-tjh| YYu Whl YYhdYj Y}}W WUEP YjEP YYEPEPj jEP YYEP} YEEjEPjI h`5 YYE܅jEP5  Et}wU:t&5 5 hDh\j%Y#Uf  فfMUܹ#JfMEjhcYYE؅y7hY=(t=(t =(IjY<E fUfUEPh0n@u yhVYjOYEEPh6n@u yh$YjY}?EEPh6n@u jYEPYyhYjuJYY Pju8 hYuYuY?uYuYjuYYjuYYuYEu0YYE0>Yjh(u" j%Y EPxYuoYjh(u EuQY}thPN)= r EPYjEPj EEPh3n@u) y=(t߃=( t1hrY$jEPj6 U؉UE1xEPYEPYtVYRHUV5Nx  ^U= t u4YUVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+("}t}y UU_^UVW5YGDžD7uYYtw>t6uYYt} tu w YYu=u_^UVuFPFPFPPhh  ^UVWuEu41}%t3> t> uFs7hVYYƅtF _^UVW}Utu >t]9uFG1_^U$UUEPjjG U$U UEPuYYEPj!j U$UUEPjj UVu x~( 5juuYYy9uuVYVjuM ^U2u u ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0OYE9uvEEEЃ E V!փ}u s(KV3YE=u(&UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0BYE܋]P3W }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j RY_^U4VWEj/u3YYuhDYƅu@VqYPubYZEЃeuYE=u(}؀>t >:tFG9}s/GuWYYEPuRYY=t42u u =(t (Ũ}t} uFuURYỦ(_^U(VuEEV֋RUV֋RU LE UUU UEPj7j ^U$EPjj U$UUU UUUEPj6j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$EPj*j yUEUMJ1U$UUUUU UEPjj U$UUU UUUEd%EPjGj U$} uEEUUE UEPjJjE y}tUEEU} v(M E 1U} v(M ҋE!1UE1UE1U} v(M Et1U$EUEPjHjU UU$VWEPYEPEPjv jYƋ}t9uvEEPCYEEPEPj WWYUUjEP YYEPYWj1YZ)‰jEPj jEPj t9r)օu jNYVYU)_^U$uYEUUU UEPjj4 U$UUUUEPj j  y} tUE EU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U x}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VutYY=u}t UډE1!,'"U-EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UMJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEиUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PwE6U U RU U RUEEE(=E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPTYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuxYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVW11}U9tu tF߃| juYtUrYtURtUzt r^ Y},t}Dt}\t u: Y_^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%h+YF~uN NF 1}9uNN FFSX_^UVW}Wu u4 ƅ~9})׉U U 1_^UVWu }  ~y UVu CV€tu ,fNV~Du>5H Yt.hYFu NLNHF 9hrYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11tG9uF>uր?=uэG1_^UVU9wU9v( 16V0Yt1'rF5&Y5^UVW}u1E}UUs( 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV| uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U}x}~uPYYUUas U EUhh\YYjBYU$ 9Ut*UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVupYƋU rU MJwU uR%YY^UVWuU VVu)YYDžt~~yVډ(F_^U$UUEPjj U$U UEPuHYYEPjju U$EPjj] U$EPuYY1ۅÉU$UUU UEPj%j UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj= V5hjKj ^Uu hT$u UVWu1fϋV€t}u ~tu>FtViYU )uRvk EVt tfVV}u1_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|} 0)ʇʋu }UW}0ʀuA)_]+C;Cw Ë[ uӅu P-KI|;u[u PG1ۇ tPXP%s %s: %s: %s Usage: %s [-d] [-m maxclients] service program [arg ...] 1s%s %s: stalling %u second%s %s %s: Connection from %s:%u Unable to listenforkpipeCan't set TCP optionsCan't configure TCP channelCan't open /dev/tcp/dev/tcp%s %s: listening to port %u %s: %s: Unknown service tcptcpdp/usr/bin/tcpdp/etc/serv.accessunknown error%d.%d.%d.%dNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesPATH @Xbdiopux #+-0Lh{lEEG0XbcdeEfEg0inoprsUux(null)#a#r#w#$+#b#cannot print floating point SSSSB,D\ ((((( AAAAAABBBBBB Unknown errorp\L@ t`L8$hT@$ t`P<(C  xlA1$T$Lhxsu;SSSSu\\ QRP PUVWu EEM}J:-uC)E@E/E@E%h<YjlYBMDž}}t7j6YYxjj4 Eh6YYy&h GY6?Yh4YjYMV}t jjYYhPj. ~)19~P4 G19~4YG1_^UV5`Nx ^U=dtduxYUVu~  ul6EPYEU UEPEPV> yE^UVu>tF+URuj! ^U$UUU UUUEEPjGj U} vlM E 1U} vlM ҋE!1UE1UE1U} vlM Et1_UVWuU VVuAYYDžt~~yVډlF_^U$UUEPjj U$UUEPjj U$U UEPuYYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*ujYEU UV֋RUUUEPuLYYU UEPjj ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5hxjKj ^U$UUUUU UEPjj USE] ![]USE] ![]USE] ![]ùUVuYƋU rU MJwU uR}YY^U$} uEEUUE UEPjJj y}tUEEUW}0ʀuA)_]UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇptPXPai Cannot open output file: Usage: tee [-i] [-a] [files]. SSSS  @V \1$T$L0 su;SSSSu  QRPD P*U`VWu }|}~6h hh y0 j YvYEu4vYE=u.v6hhh 70j Y URU}}7fLL L فfMhvYYEljjv %fLL L فfMUu0v6hhh g/j YU#JfMfUfLL L QuYPhhh /h Yu Džj0YY yh?/Yj4 YE0UUfUfUEPh0n@5 0 Džyht.Yj YEEPh2n@5 R0 Džy)=4 u 5hThh 3. jA0Yy =4 tyh<.Yj~ Yh0hh -YY/E/Ewj u/YYn54 YP6hhh -j YCPj/YYj u~/YYPjj/ ER_^UVuu uQ/ ƅV=4 >t =4 ?u==4 >uEEPh6n@5 . =u ^UVWhP5 a Džyh -YWhV. uWVj. 1t29v*)RVjw. ))ډ׋WtN9t hXW YWVYYx5u h$0 Y։+ׅ?_^UVEhPj- ƅy'54 YP5hhh w+1t-VP5 - ƅy h+Yu^U VW}1} u h(eY9u ~BWVZYъ M-jEP5  h c+Y}t hY9u ~BWVZYъ MjEP5 J xh+Yshhh q*YY[hhh [*YYEhhh E*YY/hhh /*YYhhh *YYhhh *YYhhh )YY9u ~BWVZYъ M*jEP5 e h"*YU )RQYYEypUdhdhh b)YY9u ~BWVZYъ M-jEP5  h\)Y}u9u ~BWVZYъ M-jEP5  hTY)Y}h}EPhDhh ( }"9u ~BWVZYъ M-jEP5  h<(YBEPY09u ~BWVZYъ M-jEP5  h4(YEP^Y9u ~BWVZYъ M-jEP5 m h,.(YEPY9u ~BWVZYъ M*jEP5  h$'YIEPY:hhh :'YY'EPhhh "' EK_^UVuk= = uEEUM hl]Yu dEEUEEUtjEP5  Ey h\&Y^U4VW}W= V= uEEUjEPj<(YYÚfUU΃fUU҃ↁfUҍEPjj'  EEUjEP5  ƅh&Y= = uEEU EEUjEP5 Z ƅyMh%Y@EEUjEP5 & ƅyhw%Y tI_^UVW}t;Wu u' ƅ!9~ hYU U )1_^UUUVW19u ~BuVZYъ M-jEP5  h0$Yy}EEEEjEP5 ( Džy>5}&YE u(Rd&YE u 55  DžyEEjEP5  Džyhhh |#YY9u ~BuVZYъ M-jEP5  h#Yr}u9u ~BuVZYъ M*jEP5  ho#Y)}g}tEPhhh " _^Uhh u"YY]%UV5$ Nx P^U=( t( u8$YUVW Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVux958 ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+4 "}t}y UU_^U8VWEU UUUUfRfLL L ىM؋UfRfLL L ىMEDEu }}`uuVuu{Džy1W΋Uu!YljUUU)UVuV YYZMԃ}~DVuV YYZ߃}t&UBt  1+EEEEEM9uuuVuukDžVa YEVT YEVG Yǃ}u@ց}@sUEEuu YljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u UuuYZЉEE1UUEs-UEȉEWVR UUE;}tEE 1_^UVW}-0= >N>.WYH=u1=HX-0= r>.uF\hPjjWv y1jPi _^UVW}}t1PGPGPGPhHP?hPj jPEy1HjuP ƅu1*UVU V HH_^UVW5t6uYYt} tu w YYu=u!_^UVuEPVYYtE4 ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s  u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU dE#=} tF=  ً ʋ  ыE _^UVuFPFPFPPhhLL^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U;}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!9+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U8>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVWu=u hPjjjuu uj$ƅuuVPƅy}Gu^fWfLL L uL07+W6_^UVWEu=u N4 uE>t >.uEF}u)uYƅtuuuu V_}u €u$}N>.?quuuu 7uE~=4 ;ul=uE=t =ut놃}t"uuuu ju%E~}t _^UVW}} uBW Y-Ɖ:.u#sVWP Ƅ5*"u hWhhP1uuuu_^UVWhYEthufYYEu1EuhP >t uF>nuP. YYuF u>tDG?t uG1҈_hVh` u Y` u Y1_^U@VWEEEUUЋUUE=uq=u u } ~1EUffUE9UYE9U;}DžU=, y2UMEPUP4w , =#U fLL L فfMjEP5,  =t$4 U5, yY, ^u u5,  9E t$4 U5, 6Y, }fEU܅t2EPW5, 4 ƅ~U)fUU܅tB4 U5, Y, }<}EM}ffLL L ىM9M}#UfUDž #UfUU܅t2EPW5, X ƅ~U)fUU܅t$4 U5, Y, UJÜJU+UfUU܅VU܁vE܉VP5, ƅU)fU멃=, y, y4 U'UMUP4u u5, (9E MUԃ}~ Eԙ=Eԃ}Euuu5, E=u=4 EEUM9u u+UBt"5, c Y, E}tt}u u5,  Y, EaEE=, x5, Y, }u}u 4 ;4 = Uȉ4 _^U=, t5, Y, U$VWh ,YDžujW YYƃu4 EE1UUfU fUEPh0n@V2 E=u4 EV YGEEPh2n@V E=u4 EV Y E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh8 YDžu,jWd YYƃuEE73EPh@n@V. E=u 4 UV YU4 _^UVWUR< Yƅu4 wUWfUfW fG #UfWuu FP URVu E4 UV Y}r UUU4 E_^Uh)jT YYj YUVWURu YDžu4 h)j YYEuYEURWu Ƌ4 Uxw7~1W YjYuj YYutYU4 @RGPu  W YjCYujl YYu.Y_^UVWEEP YNjE E P Y9uuԅt9}t t1_^UVW}u1]MEEP1 YNjE E P Y9uuąt9}t t1_^UVW11}U9 u  F߃| jugYtUrYtURtUzt rZ Y}8 t}P t}h t u6 Y_^UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv& =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9< t, R@t Bt 4 YGƒ~uF`FF VVv vv >uNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E D%U :t! EE E d%U uuusYYEy@Ut8huqYYE~" tu7Yuu/YYE}y1]jYEu uY1A!uEUMJUzUBU E_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^UVW54 lYNj5l hP Yhh Y}t.U:t&uYPuV jhV WYPWV jh|V _^UUURu hu'UUURuu uUEEUUUUU JUEPuu, EUJUx ]E EPj|YYEUuu hu'7[  OUW}E MuG_]1_]UVW}u M?rUVWME_^]U=( t( jYUVxU9xwUx9xv4 16V Yt1'xrF5x&Y5x^UVW}u1E}UUs4 1=tu8j< Y=u1V!փ5t5xFE5|OVU}9}r69v2W9UvUW~>}t E|u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=|<9}r79}u+UOJ}t E|URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15|t 9ur6E0tU U|tU9ru NJEtU9Wu RWE_^U}x}~u PX YYUVu~  u4 6EP YEU UEPEPV yE^UUas U EU=uh h YY 5EYU U=t5YUVW=u!h h oYYu1D5hh Eu1U:#th u YYƅtUh uYYEtEU: t: uEh uYYƅjFuWY%fLL L ى 5h VWYYƅtFt8>t3> t> uFs7h VYYƅtF_^UVW}Utu >t]9uFG1_^U VWDžDžjhX >YYug#JfhL WYƅthVh< h4 h8 YYE(uhPK jh, Pa _u> t> uF>t> thVh j hYYƅtDždjh$ P 9> t> uF>> hVh j h(YYƅt7E>t3s+> t> u E}t 7EFȀ>t > t> tFDžoj h P Q=D> t> uF>(> PVwYYff UuY=u"ff=u=hPnYYu&j.PYYƅtFPhYY]E>t >.uEF}| sj.VHYYF7M 1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U 3}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE nuVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U } EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P'E6U U RU U RUEEE< E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }( -~y UVu CV€tu ,fNV~P u>5T XYt.hYFu NLNHF 9hbYFuN!NF V@uVVVhUFt$jjv6 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv' =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^Ujju E`'bUSE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]UW}0))ϊE tu1_]XG_]UVW!E_^]L$ UVuj jV ^Uh hh YYj"YU Vjh YYƅyHu uV EVJY}u"U JUj uYYEt1^UVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉU$} uEEUUE UEPjJj y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPYjEPjM V4,5<h jKj1 ^U$EUEPjHj UVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P_1ۇtPXPc8"%s: fork failed: %s Connected unable to NWIOTCPCONN%s: got EAGAIN, sleeping(1s) unable to NWIOSTCPCONFunable to open /dev/tcp/dev/tcpTCP_DEVICEConnecting to %s:%u... %s: unknown port (%s) tcp%s: unknown host (%s) Usage: %s host Assertion "optsize" failed, file "ttn.c", line 255 Assertion "iacptr == bp" failed, file "ttn.c", line 248 readwrite%s: read: %s  m i got unknown command (%d) got a IAC readreadreadreadgot IAC %d readreadgot an unknown SB (skiping) readgot a GA got a EL got a EC got a AYT got a AO got a IP got a BRK readAssertion "iac == IAC" failed, file "ttn.c", line 318 readAssertion "count" failed, file "ttn.c", line 316 writeunknownTERM  q writewritewriteAssertion "result <= buf_size" failed, file "ttn.c", line 528 got IAC %d readreadgot an unknown command (skipping) unknownreadunknown error%u.%u.%u.%u.in-addr.arpa!:[%d.%d.%d.%dW '%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE/a/r/w/60+0b 0 : No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0r/etc/services ,/ # r/etc/servicesnameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain@>?SE>EEELEuF F@NFrGX[Gb@GdRGiRGoIGp[GuRGx[GKH jYh jj GPYh jj jQYF9uIjhh,h@hX}tPhhj$9u~=U FjaYh jj jbYh jj j/Y0j` Yjh5 jC Yjh5 j5 3 YYj[YjEP5 ; EjEP5  =jh5 hj?jY_^UVu>-u~at~Au~tt~Tu1^UVW} W׋RօtV YPVu _^U VW}u==\ j 5\ YYjj5\ : \ \ y+jh5, LYPhjTjY=\ hP5 { Dž~/19}ډ)R5Pj ~jh5 hjjP YYjY_^UVW}ujh85 hXj}uh0Yƅu(j/VFYYDžuGlEy(jh 5, 'YPhj/}6PmYGPfY= tj 5 YY5 Y}ujWV juhWVjh5, YPhVhjjyYjjYYEjjYYEjjYYEjju ujYYujYYujYYjhj _^U0VWEPurYYy uYU t!jhuhjjYEShYYEShYYESh YYjYEjhYYDž=, t uQYh$hh} Džy=, th Y;EjEPW ƅy"5, hY5, hYWYjEPW ƅy uYWYuRjuYYy =, t9jhuhjnPZ9ujYjSYjh|hhj3hY=, hYuY_^Ujh5, YPhuhjjYUV1}' E 0MUE E F^UVW}EU9UUM U:/:- ~6uYY jhuhj jYfWfWW VfWBWfWW VfWVWVW FE_^UVufVↁfVVfVFF^UjjYh jj hYuYUV5 Nx  ^U=$ t$ uYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVu~  u, 6EPYEU UEPEPV: yE^UVux95L (@ ^U$UUU UUUEEPjGj U} v, M E 1U} v, M ҋE!1UE1UE1U} v, M Et1Wo_oOs4CSgUW}0OE uG_]1_]UVWuU VVu9YYDžt~~yVډ, F_^U$UUEPjj U$UUEPjj UVu x~, 5ju]YYy9uuVYVju5 ^U2E Pu ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0WYE9uvEEEЃ E V!փ}u s, KVpYE=u, &UEUUU}׋U UE8t=+UEEE0YE܋]P3W }׃E뻋EEUUE8t=+UEEE0JYE܋]P3W) }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j R1Y_^U(VuEEV֋RUV֋RU E UUU UEPj7j ^U$EPjj U$EPj/ji U$EPj?jM U$EPjj5 U$EPjj yEU$EPjj U$UUU UEPj%j U(VuU @t*unYEU UV֋RUUUEPuYYU UEPjjk ^U$UUUUU UEPjj? U$EEEPj.j U$UUEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPKYjEPj Vt l 5| h` jKju ^UU$VWEPfYEPEPj^ j,YƋ}t9uvEEP#YEEPEPj WYUUjEPYYEPYWjYZ)‰jEPj jEPj t9r)օu jjYV}YU)_^U$u2YEUUU UEPjjP Uu hT$u  UE Ph T@u UV& T$@, T$@% T$@, E uVu ^U$UUEPjtG9uF>uր?=uэG1_^UVW}u YfE=hL|YEu E<PU:/tHh4YYEt/u u6 YYuhuW? E$h u: YYEuE+UMuRQ uu6Y1W Y-E8\tQtF>#tEPVu u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1QtFjuV uˀ~#uōFP Y^UV5t}u7F<:t ~u1&QtFjuV uθ^UVW5E 8t}u1F<:t ~u1QtFjuV? uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!FT GF9GE UE 8E_^U VWhEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EU=U FEh_^UVuu>t FPUY^UVW11}U9u F߃| jugYtUrBYtURtUzt r Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv6 =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4YGƒ~uFFF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } ~y UVu CV€tu ,fNV~u>5( Yt.hYFu NLNHF 9hVYFuN!NF V@uVVVhUFt$jjv =uN ?jEPvd =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E $U uuuYYEy@Ut8hu!YYE~" tuYuuYYE}y1]jyYEu uY1A!uEUMJUzUBUE_^UUUuuu UU Uhuu T$ ;L$ [UVuj jV ^UVU9wU9vT 16VYt1'rF5&Y5^UVW}u1E}UUsT 1=u8j<Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV  uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0QtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+T"}t}y UU_^U$UUEPjjg y UX1UVW5XX}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډTF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u6YEU UV֋RUUUEPu< YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U < }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EET" uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U1EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UQJxUʋFF VunYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE|UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P+E6U U RU U RUEEEAE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPRYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPnYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUhh~YYjYUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }+C;Cw Ë[ uӅu P-KI|;u[u PK1ۇ`tPXPk5Generated by numeric "5"k4Generated by numeric "-"k3Generated by numeric "+"k2Generated by "PGDN"k1Generated by "PGUP"k0Generated by "END"khGenerated by "HOME"krGenerated by "RIGHT"klGenerated by "LEFT"kdGenerated by "DOWN"kuGenerated by "UP"hoMove to top left cornerndRight one spaceleLeft one spacedoDown one lineupUp one linecmCursor motionsrScroll backwardsmeReturn to normal modemrStart reverse modemdStart bold modembStart blinking modeueEnd underscore modeusStart underscore modeseEnd "stand out" modesoStart "stand out" modeclClear the whole screencdClear to end of screenceClear to end of lineliNumber of lines (li) = %d coNumber of columns (co) = %d Ctrl/H performs a backspace (bs) bsEnd of line wraps to next line (am) amTERM = %s termcap: No termcap entry for %s termcap: $TERM is not defined TERMUsage: %s [ type ] ^?^%c%-32s (%s) = r/etc/termcapTERM/etc/termcapTERMCAP 0123Ebfnrt\ % +2d i}rOOPSarwR+3b) e@Xbdiopux #+-~0Lqh[lfE%GX{b{cde%f%gino{p{ris5u{x{(null)cannot print floating point SSSSB ((((( AAAAAABBBBBB (   $E1$T$LXsu;SSSSuLL QRPH^P6U|J|xUh|uYYUhhYYjYU$VWDžhYuhh<YYjYPYY=t hh jaY9uU tG9uF>uր?=uэG1_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+\"}t}y UU_^UVW}u YfE=`hYEu EPU:/tHhYEt/u u YYuhuW Ehu: YYEu`E+UMuRQ uu6Y`1W Y-E8\ttF>#tEPVu u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5`t}uEF<:t ~u1tFjuV\ uˀ~#uōFPY^UV5`t}u7F<:t ~u1&tFjuV uθ^UVW5`E 8t}u1F<:t ~u1tFjuV uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F> TGF9GE UE 8E_^U VWEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EUlU FE_^UVuu>t FPUY^UVW11}U9u F߃| jugYtUr YtURtUzt r. Y}dt}|t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv- =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvg EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hSYF~uN NF 1}9<t,R@tBt 4YGƒ~uF(FF VVv vvM >uNN FFSX_^UVW}Wu uL ƅ~9})׉U U 1_^UVWu }T ~y UVu CV€tu ,fNV~|u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E +U :t! EE E U uuu7YYEy@Ut8huYYE~" tu[YuuYYE}y1]jYEu u&Y1A!uEUMJUzUBUE_^UUUuuu 8 UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uh|uu T$ SL$ sUV@U9@wU@9@v\ 16VYt1'@rF5@&Y5@^UVW}u1E}UUs\ 1=<u8jlY=u1V!փ5<5@FE5DOVU}9}r69v2W9UvUW~>}t EDu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=D<9}r79}u+UOJ}t EDURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV< uY_^U VWUUb15Dt 9ur6E0tU UDtU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډ\F_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu< YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE" uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu\YY=u}t UډE1!,'"UD1EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UtQJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE$UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P+E6U U RU U RUEEEAE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP%'()Yh YU+UR&YhrYUtU^UVWu1} Ƈp GKEi]K)ۉ޹Ei])ۉ޹<Ek]<)ۉkdؙE}thpuYYr:}u =thsucYYu:}u =thvu>YYw0 E0yE0zhpEY_^UVu E0EE0U=u }0uE MFMF}~ ^U55YYhPY5YhLYjYUV5|Nx ^U=tuxYUVu~  u6EPYEU UEPEPV> yE^UVu>tF+URuj! ^U$UUU UUUEEPjGj U} vM E 1U} vM ҋE!1UE1UE1U} vM Et1{UVWuU VVuIYYDžt~~yVډF_^U$UUEPjj U4VWEj/uYYuhdWYƅu`V5YPu&YZEЃeuYE=u}؀>t >:tFG9}s/GuWYYEPuYY=t4l2u u =t Ũ}t} uFuUR YỦ_^U$EPjjq UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5hjKj ^U$uYEUUU UEPjj U$EPj j y}tUEEU$VuEEPj+jV yUUVUVUV E^U$EPjj y}tUEEU$UUUUU UEPjj USE] ![]USE] ![]USE] ![]UW}0))ϊE tu1_]XG_]UVWeE_^]jUVWlUt}u16EEׅt%u>tG9uF>uր?=uэG1_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^ULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVYE=u&UEUUU}׋U UE8t=+UEEE0YE܋]P3Wq }׃E뻋EEUUE8t=+UEEE0YE܋]P3W }׃E뻋EEU9vGuQYEuUUȋUUEEEPj;jJ RY_^U$} uEEUUE UEPjJj y}tUEEË} 0)ʇʋu }UW}0ʀuA)_]UVW}u M#UVW}u M)9r/r uu fE_^]t| sys user realCommand terminated abnormally. Cannot fork Cannot execute PATH . SSSSH  `/ ,LM1$T$LD su;SSSSu QRP -PU(VWuhVVYYǹ1uj:t:.u} uj} a u(Fk ^ Á]DEdu(EPYEPYPEP -jb u;k ^Ákd^k NفlMY u#k ^Á]DEd1u%EPYEPiYPEP Q-jk ^Á]k NMk VUk ^Á]} uG>.uBF-0= s.F-0= s~uFk ^Á] jEEEP YEPX_^U4VW} E jmYƉuԉuhWuJ E=EP5 )YY=u35H YP5 5 hh ,jYUUԋUUj5 *YYƃuBuԉu] Q E61҉UЉU)hpYEj+=u U9P uP Jhl4}YYt9P j4eYY=tuԉuP U9P udU9P }\P uu4Y ~75H SYP P45 hPh EP 뙃}t1_^U$VWu=t,EPVNYY=tuUU UUE PV2YYu1=H t |=u1lhVYYDžxTEPWYY=tuUU UU hKYWYE PVYYu1_^U5 hh  j9YUh uYYUV5Nx  ^U= t uYUVWu"Yƹ<<+F؉F<+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEh, EP&>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hXVW ƅu1WW YZ׀>/u5FuhXVEP ƅu19ut EEG>,t1jFhlVW ƅu1MWWt YZ׀>/u0FuhlVEP ƅu1EEGu>t1_^UVWuE}>:tVh YY_HLXUh lU| V Y=Vh | YYVh wYYƅ>-uF>+uFjVEP ƅUU<j h 5HF 1D Vh YYƅpj h 5L  >t>,tjVEP ƅt5U@>t'>,u"FV Y=xwVh YYƅu_^Uh YPLYHPLTUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuEXlE=DuDV =Du1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t@ F 1_^U VWu<Fyt 9tF>tGމ+U_^UVW=T aU9P } P M :-uP zu P M hL4YYuP P M T ǣH :tWuYYƅ}=L t=E h 0YYh h4YYh WyYYh j kYYP M T T :uP T ? F>:P M T C;t!A P M T C P U9P |W=L t=E h 0YYh hYYh WYYh j YYT ?`P A P M  T 7P M T T :uT P  _^UUUuuu d UVu JxUʋFF Vu YY^UVWu }E?t:JxG^FSX GVPi YY=uEE_^7Og?UW}0))ϊE tu1_]XG_]UVWE_^]UVWME_^]U= t j#YUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UVW EUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U [}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U8JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U R5789:;<=M؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEX E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u4 ƅ~9})׉U U 1_^UVWu } -~y UVu CV€tu ,fNV~p u>5t Yt.h0YFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UV U9 wU 9 vH 16VYt1' rF5 &Y5 ^UVW}u1E}UUsH 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UUas U EUhh zYYjYU$UUEPjj y U 1UVW5  }׃}~9r }y 9vWYu_^UVu4YƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډH F_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$u5 U$UUUUU UEPjj' UVWuEu41}%< t4 YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*< t Bt 4 aYF^USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|{sƉKI|;u[u P1ۇ tPXP01234567890j?waCc[mOrt%s: cannot touch %s: %s --Assertion "0" failed, file "touch.c", line 172 %s: cannot stat %s: %s r:t:acm0Assertion "0" failed, file "touch.c", line 228 Usage: %s [-c] [-a] [-m] [-r file] [-t [CC[YY]]MMDDhhmm[.ss]] [MMDDhhmm[YY]] file... SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZunknown error: option requires an argument -- : illegal option -- --No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0u @NrX[b@dRiRoIp[uRx[K <#A+7-20F=!L%hlCE G X/ b/ c dm e f g im no/ p/ r!su/ x/ (null)cannot print floating point GMTGDT$0$0U U xl`XL SSSSBX p Unknown errorxhPD(xh\H8(hXL<(  lXL4xdPCL    L1$T$Lpsu;SSSSudd QRP PU VW}dU :-UU 4F>tH6:1(j&h$jw j:Y FGfEE=/E]1E E E@fEƋU <Bhu WZY4MYY=t h YU <th4!YYU <thhYY>t” F쾔>t” F1_^UfEfE ]9fhhj1 fE; Phj  9tj hXj jYf  @f fUEfU=tE ;=tE]9uE UfU S@f Z = Phj  9tj hLj jYf UVWu} >t)?u”M GE”F_^UVWu} >>\aF1҉UU=0|A=77FUƒ0UE}}=0| =7~ыUG뚀>tFG덀>[u>FFEF<-t [GmFEU9UUAMGFJFG?_^U VfEfEE=Gu>tE9tF>u!EM@fEE@fEEƄPuYYY^UV5hNx  ^U=ltluY3KoUVWE_^]U$UUEPjj U$UUUUU UEPjjS U$UUUUU UEPjj' } 0)ʇʋu }UVWuU VVuUYYDžt~~yVډtF_^USE] ![]USE] ![]USE] ![]ËKI|;u[u P1ۇxtPXPcdsUsage: tr [-cds] [string1 [string2]]. Bad write Bad write SSSS  W <T1$T$L su;SSSSu88 QRPL P U VW}}h h $YYj Yu UU UU rYU z??t:?%t5 J xG  Gh P!YY?mEGE?Q9E>U9Uwhh #YYj Y+UBRuP$ 6YPP#YYjjPh 6YPPx# jjP( jjS 6eYPP#,EuTU9Uwhh "YYj Y+UBRuP# 6YPP"YYjjP@ 6YPPM" _jjP jjS 6:YPP!EGSU9Uwhh !YYj Y+UBRuPY" jjP6 PP_!YYrjjP jjS PP! -jjP jjS jjS PP 4ERU9Uwhlh g YYj Y+UBRuP%! PYRPP0 BjjP SYRPPjjP jjS SmYRPPLEPU9UwhDh AYYjaY+UBRuP JƄsjjP PoYPPYYjjP jjS P*YPP jjPT jjS< jjS$ PYPP:OdEO J x  %h j%YYY |OGGBjY_^UVW}?)?\\F  F F F FF FFhh Wr FEGPhYY}M}pGGhhW FE?t:t4GPh4YYtM}~GGDt>etF>euE_^U EPu u EPYU  UjuYYEUU UUV5`Nx T^U=dtduDYUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWVEW Wuu VEu EP|EWVpE}F_)ۉ]y!]FEfFuFPYY"}~GEfGuGPYY9nV9Ww 9Wu{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]SPW kE W PEP .kE ]ShPW kE WPEP _^U(VW}EEE} tUE U tEffG1҉WWU fE PrAEEƉ0 r.UAM.tEUWOUMjGPbYYjEPUYYEPGPYYE0UEPGPYYE}VMN},} t UE Et eEEE EEUhd@UƉ0 SkE 0‰UUUU؁/ }}EEUƉ0 r} tUE UUU}t iE/Eut  "ut5fG?GujGPYYGHfGuW YY_^U Vu !@] G@E@fE^fFVEPVR ^UDVW}EE} yE } ~E E EEtEfEcVWYYx - E=|׃- Ek] W SW' kE]tsVW?YYx -h E]hhWYY VWYYy - Ek] WøSW Ek]+ۋEW4YEVWYYy - Ek] WhSW5 E+UEEE}uEUU(vE(fEfEEEU9UU+U~EG}EfEfEEEkE hPEP<EPWYYx1EPEP<kE ]ShPEP E뿺0UMEfEWEPWl M+fEEPEPhh? fEGZEfWfUfEG-؉WUЃ0MEG-؉UUWEPW U0EWEPYYEPWYY~+tG=|U@GFEPYWY0U0E"}fUUU=9?0}vMu@ՋU1E}uā}vU0E밋U_^UVuEPu u EU RP55*1ۅftu u3EE UJfF55u u30YYZYUM QRjj( Fu uvj`-[3YYEE 55u u/YYZYUM QRjjK( F^U VuEf~u~u55uh55 VhqYYyEU "FF-?Pvj,55#/YYvjo,&YY_ EU}tuu1EEuu55p(u~u~t  "uuXZ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0 tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^Uu uPZ,EXZUGIJKLMNOPQRSTUVWXYZUVWuu u- YYt !u uu u55%u55u u55%yu u.EE u u55%~$ "Wj$u u+YY!EPu u EU u~% "RPWj$+YY~$55u ue+YYEE ׉RjS$u u<+YYEE j}55f}$u u55(YYEE ׉ډѺu uRj#(YYEE Wj#u u*YYXZ_^U EPu u uuuuEPZUjuuuu uUjuuuu uUVW}Wu uH ƅ~9})׉U U 1_^UVWu }d@~y UVu CV€tu ,fNV~ u>5 (Yt.hlYFu NLNHF 9h>YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UUUuuu  UU Uh uu U UUEEUUUUubYEuu EP {UW}0))ϊE tu1_]XG_]ZUVWM'E_^]UV0U90wU090v 16VYt1'0rF50&Y50^UVW}u1E}UUs 1=,u8jY=u1V!փ5,50FE54OVU}9}r69v2W9UvUW~>}t E4u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=4<9}r79}u+UOJ}t E4URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb154t 9ur6E0tU U4tU9ru NJEtU9Wu RWE_^UVu uY^!ut1^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVu%YYDžt~~yVډ F_^U$UUEPjj U$EPuFYY1ۅÉU$UUU UUUEPjjW yEUu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U *}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE2*uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu`YY=u}t UډE1!,'"UXA)EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE Ua(JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE8UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEQ&E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP@YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VudYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWu }E8$E)E EEE@o#-t+u-U EMtJxFFSXVo Yǃ}0}U EMtJxFFSXV% YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G E=cF}[t@}nt:JxFFSXVYEE uՃ}}nJxFFSXVwYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=8r}8u8-t8+uEE-8EE}dt}iuuEPh8 EuEPh8" EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVSYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FE u:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE8}8s UE?]u Gƀ8?Z?]QGƀ8?-uG?t2?]t-G9"G@E9EEƀ8EGe띀?uEE83]uVuYYEEuUURUEu UMЈ EMt"JxFFSXV'YEE}t}tE83]u}t}t VuYYMEUEt }vE}uEuVu E=8r}8u8-t8+uEE-8EEEPh8YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY EEEu }ntEGV}u}tE_^UVWuEu41}%<8 t48 YtEG֋E ~tV€uFu1V€cE~tVuډUjuva =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<8 t8 Bt 48 aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h YF~uN NF 1}9<8 t,8 R@t8 Bt 48 }YGƒ~uF8FF VVv vv >uNN FFSX_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]Ë} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EU$UUU UUUEPj6j U$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP YYjEPEP U jEPEP jE PEP UVu EPEP Ey1} u@D1QUJfUE]9~jYE]fUE-؉U1} u@t^UVW}EP Y}u fEu U UfEu W YEy1fEyډE}teEPW YjWEP _^UVW} uyEyE9Et.ut}~ YO9t9}E-UUUU9Uu1!U9Us EEUU_^UVWuE}} #V Vu Wb YFfF^~.j=YfFFFUAMt7xF*FP YFyFPFPYYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^UVEPY}u fEu U UfEu EPTY(}tuEP,YjEPEP ^UjEPEP; jEPEP) EPEP YYjEPEPH U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVPY_^U VujEPE Pk Uu}u}u E@fEjFPEPp ^UE UjEPEP jEPEP EPEPYYjEPEP UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jjYfF?1҉VVF=}jGYfF_^UV}u} tu^UVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPdYY_^U}u} tEjEPEP jEPEP EPEP5YYjEPEP UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPeYNF@fFV9Ww9WLV9WvDW9Vv WWW+VWW+VWWVYt1f#V9Wv VVV+WVV+WVVY_^UEUBUVuFFfFf^U VWu} W WV VuWVWVVYY9}V9Ww 9WuKV9WvCVEPjWV^U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP0YYtFPYNF@fFVY_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWufEU M I JujFY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEP%YU R9VEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JN Wt1fEUtFPYWE`}E=~WE- fEG?t E?t E- ؉ UEEPFPVmYF=}jnYfF1҉VV!F=?|jKYfF?1҉VV_^UVWUBU Z)ۉ߅t'yߋuu FfFWFPYY_^É{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7 u`=}aa{nZsPsPR[) [)։ZsXsXfR[[׉{1ۇ tPXPZoZZ-ZXZ+XT%*.T0T1T2T3T4T5T6T7T8T9TXic;diefgoirsuixiprintf: Not enough args for format. printf: Not enough args for format. printf: Not enough args for format. printf: Not enough args for format. printf: Not enough args for format. printf: Usage: printf [ arg1 . . . ] 01234567X8\abfnrtvx80123456789abcdefABCDEF%3x01234567%3o?????? Eh G eh fO g >+->(L+7L0AAAAA+ Q+@+,X,bx,d,i,o,p,u,x,- t-#y-+o--j-0~-u0L].hG.lR.{.E0G/Xg/bg/c/d/e0f0g/i/n.og/pg/rU0s!/ug/xg/(null)m3X;3bV3dD3i;3oM3p;3uD3x;39L9h8l89E=>G=>X1:[<b1:cC;d1:e=>f=>g=>i1:n9o1:p1:s;u1:x1:PMdCD XLIV @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%SSSSB  ((((( AAAAAABBBBBB tsorttttttyumountunexpanduniquptimeuuduudecodeuueuuencodeviwcRwhatiswhereiswhichwhowhoamiurlgetwritexargsyaccyap yeshttpgetftpget inet  < hJ1$T$Ll< su;SSSSuTT QRP APUVu_Yƅuhhj YYjY^UVjYƋUV^UVu >t]9t FUEU>tatF^UVUrt U 9Vt6u1^UVW5XtuFP YYt6t9=XtX5XJu YPYFuFP YY1҉VVV VX5X_^UVWhthh| X h| h| YZց| v ~ uNj h| h< h< YVYE9}tWuYYuWHYEUREUMJGO_^UVjYƋUV\5\^U=\u1/\U\RU\\uYEUVW=XEt"UuU}GPbY}ڃ}]UUEU}WU}tًUR֋Ju$URM URUURRYEU뺃=\t P Y_^UVW} 9}t)GPYwtVz t zu~֋6GPhh Etuhh _^UVWu~[FF ~tGWzu wYWz t(RFPhhrwV-YYF?F _^UV5Xt V{Y6^UVu }~*hth@v uvYjaY}~*hh<vc uvYj1Ys1^UV5dNx $ ^U=hthuYUV U9 wU 9 vp 16VYt1' rF5 &Y5 ^UVW}u1E}UUsp 1= u8jlY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVL uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U 1UVW5  }׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډpF_^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4 YGƒ~uF FF VVv vv >uNN FFSX_^UUUuuu  UVWu }E?t:JxG^FSX GVPYY=uEE_^UVW}EEL#WUW YwEY*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE" uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U1 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U$Q JxUʋFF VujYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEDA E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPNYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPjYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVW}Wu u ƅ~9})׉U U 1_^UVWu }hf~y UVu CV€tu ,fNV~u>5Yt.hLYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPvh =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh4hYYj^YUVuYƋU rU MJwU uRAYY^U$EPuFYY1ۅÉU$UUU UUUEPjj yEUu hT$u U$UUU UUUEPj6j; KI|;u[u P1ۇ4 tPXPOut of memory. %s %s cycle found between %s and %s wr a rr w + b : unknown error %@Z~XgbLd^i^oUpcefggu^xgW H#M+C->0RIL1hl&OEGX;b;cdyefgiyno;p;r)su;x;(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point ((((( AAAAAABBBBBB SSSSBt Unknown error, |pL<(|hTD4 pT@,lX@,C  .I1$T$LPsu;SSSSu QRP$ P:UVW} uEdEEEEdE1}>E1}k MUF}uE} uEG1_^U(VWuu hYYE=dt}uUM] Z}E1 oU <_EM UJI+]RQSu EPwHUMU U9~Uډ׉u9}|F눃}t }UUUM] ZE_^U VWE1 |BFPRVh41}1M@Sh0YY} h,YGʃ}h(|Yh qYhfY{hSY_^U VhP=YEPhLRYYƅuEPhH<YYuʋUM<uuY^UVWjuYYƃduhYFuhhY/11 } U<tGF uh\Y1_^UjYPYE U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U \(}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEtN'uVuuƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U]&EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U}%JxUʋFF VuBYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEМUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE m#E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP&YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPBYY=u}t UډdZ}~UUM#JxUʋFF Vu YY=u˃}t Uډ E_^UVWu }E$E)E EEE -t+u-U EMtJxFFSXV Yǃ}0}U EMtJxFFSXV} YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G E=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPhX EuEPhZ EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG1띀?uEE3]uVu)YYEEuUURUEu UMЈ EMt"JxFFSXVYEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhv YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uu}YUURY EEEu }ntEGV}u}tE_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4 YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }L&~y UVu CV€tu ,fNV~lu>5pYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv2 =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv# =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWu }tV€u4V9Vu>t FN~U9tUE_^UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E oqrstuvu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UUas U EUhhbYYjYUhhBYYjYU$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^U$EPurYY1ۅÉU$UUU UUUEPjjw yEU$UUUUU UEPjj? Uu hT$uU U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv2 =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu D USE] ![]USE] ![]USE] ![]UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|U jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UEUVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBËKI|;u[u P7u.`=}aa31ۇtPXP ---+---+--- ---+---+--- | %c %d | %d | %d %c%dYour move: A draw! Bus error (core dumped) I have beaten you. My move: %d My move: %d %cDo you wish to move first: My moves are 'X' Your moves are 'O' TIC TAC TOE  @Xbdiopux #+-0 LhlE} Gh X b cO d e} f} gh i n7 o p r s u x (null) X b d i o p u x LrhdlkEGX[bcdefgin:opsUuxcannot print floating point cannot print floating point (  X OSSSSBTl ((((( AAAAAABBBBBB    A1$T$LPsu;SSSSuDD QRP$ PvUVjYƃ}uU hrTYYttP_YjYu1^UV5HNx ,^U=LtLuYUHVWEPuYYxU܁ t1hTYƅu1VsYDžU9uhTh~YYhhMYYGPh=YYEPh%YYxU uUM9uE]9pE]9`VY VY1_^UVW}tE?t:JxG^FSX GVPYY=u5xYt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv0 =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UVW}u MUVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jlY=u1V!փ55FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jB ^U$UUU UUUEPj6j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj{ ^U$UUUUU UEPjjO U$UUUUU UEPjj# UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvi =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVu YƋU rU MJwU uRYY^Ë+C;Cw Ë[ uӅu Pc1ۇtPXPnot a tty-s/} V } V } V c c c (SSSS/devB\t  | N1$T$L|su;SSSSu QRP PUVWu E}~0V:-u(~G?tGttF1_^UVh5YYƅyhuYY?- Ph V EhugYY VDY1^U=| rU25uYYY- =_s:u=| s5u YY- =_s:u=| s5uYY- =_s:u=| s5uuYY- =_s:u=| s1UVWuCYEu 7YEu+Yu YƋUU r u5YYU u 5YYU u5zYY u5SYY 1_^Uu%Yu Y5Yh-YUVu>tF+URuj ^UVW5YNj5hYhY}t.U:t&uYPuV jhV WYPWV jhVv _^C[sw/2UVWME_^]RUVux95pd^U$UUU U5EPjMj? 6EPjMj- $U`UVWuU VVuMYYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuLYYEPjjU U(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj U$EPuYYEPjj U$UUUUU UEPjjs UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvj =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVuxYƋU rU MJwU uR-YY^U$UUU UUUEPjj yEËKI|;u[u P1ۇttPXP from unmountedumountDevice not mounted /etc/mtab not updated. umount/etc/mtab not updated. umountUsage: umount [-s] special /etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite : unknown errorFIMSNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0 SSSS| ((((( AAAAAABBBBBB BUnknown errorhX@4hXL8(pXH<,TTTTTTTTTTx\H<$xhT@C  ,H1$T$L\,su;SSSSuDD QRPL PVU VW} E}~CW:-u;h0w YYu Ehh YYjYM}uuh`YYN9u~Dh45 YYEu4 YjYuuRYYuYF뷃=L~5xJxx hxj HYY L1_^UVW}JxGGSXWY= } u =PHLHu=Lu/xJxx =hxj YY-xJxx hxj kYYL* uUH@HLxJxx hxj YY=L~5xJxx hxj YY Lƒ t uIHPxJxxQhxVvYY?u=H~ HJ1HHPxJxxhxVYY_^UV5TNx T^U=XtXutYUVW11}U9u F߃| jugYtUrZ YtURtUzt r Y}`t}xt}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvN =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%h?YF~uN NF 1}9<t,R@tBt 4}YGƒ~uF,FF VVv vv] >uNN FFSX_^UVW}Wu u\ ƅ~9})׉U U 1_^UVWu }X~y UVu CV€tu ,fNV~xu>5|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv. =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E 4U :t! EE E TU uuuGYYEy@Ut8huYYE~" tukYuuYYE}y1]jYEu u6Y1A!uEUMJUzUBUE_^UUUuuu H UVW5YNj5hxYhY}t.U:t&u_YPuV jhpV W;YPWV jhlV _^vUVDU9DwUD9Dv 16VYt1'DrF5D&Y5D^UVW}u1E}UUs 1=@u8jY=u1V!փ5@5DFE5HOVU}9}r69v2W9UvUW~>}t EHu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=H<9}r79}u+UOJ}t EHURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV0 uY_^U VWUUb15Ht 9ur6E0tU UHtU9ru NJEtU9Wu RWE_^UVux95t^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPSYUE_^U4VWuEEEE }%MJxUʋFF VuLYY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE4E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP,YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuPYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUh$h*YYj:YUVuYƋU rU MJwU uRYY^U$UUU UUUEPj6jC UVW}u M)9r/r uu fE_^]t|UVWE_^]} 0)ʇʋu }KI|;u[u P1ۇ$tPXPrUsage: unexpand [ -a ] [ file ... ] -a al rG wV + b : unknown error Y@Xbdiopux |#+w-r0}LehOlZEGXobocdefginoopor]s)uoxo(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point PSSSSB`xUnknown error|l`<, lXD4$ t`D0p\H0C  p t $V1$T$Lt su;SSSSu QRP HPUu uw YYEuh YhuYjYEU VWu }Eh ho YYO:-t :+:+uRIYB-0= sR!Yzzu EfUU:tV?9#*U EO"u E$}uhYh0PYYOu EhoYh,PbYYOhY1_^UVWu=9>t > t> uF>u7>t > t> tF>uO뿋=~ >uFO_^Uu YPuYP YY1ۅÉU=tuu h8D -=t} t=t} tuh4 YYUV h5 YYy1 h5 |YY~M5 5 #YYu3V5 :YY U  U FV5 YY1^Uh@hYYUVW1BVZ9U UJxSX hYDžyU E uUE_^UVuj jVC ^UV5Nx ^U=tuYUVujuu V!^UVujuu V^UVWuEEEu} tE 0AtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVW11}U9u F߃| jugYtUr YtURtUzt r Y}t}t}t uY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv' EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFt FF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E pU :t! EE E U uuu;YYEy@Ut8huYYE~" tuYuuYYE}y1]jYEu uJY1A!uEUMJUzUBUE_^UUUuuu $ UVW5YNj5haYhVY}t.U:t&usYPuV jhV WOYPWV jhVr _^UU Uhuuv UVuh} t1Pu V^UVWu} Ef}t}@t}t ~tVt v-Yft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^UV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8jY=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95d X^U$UUEPjjg y UD1UVW5DD}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPuH YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*u:YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U  EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UP JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEEpE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }f~y UVu CV€tu ,fNV~u>5|Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVW}u MUUas U EUh`hYYjYUVuLYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|UVW=E_^]U$UUU UUUEPj6j } 0)ʇʋu }KI|;u[u P1ۇl tPXPuniqtchd<uRwr%s%4d %sUsage: uniq [-udc] [+n] [-n] [input [output]] G a4 r w +k ba : unknown errorY @2VX?b$d6i6o-p?u6x?/ #%+-0*!L hl'EGXbcdQefgiQnwoprsux(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point SSSSB ((((( AAAAAABBBBBB $Unknown errorXL0 xhTH0 p`H8 lHHHHHHHHHHX@$lX@0C  @? P R1$T$L su;SSSSu QRP P UPVWU Rׅ-?-$dtDuuntNuuttTuVuPE M}}hd( Yjn YU R=5hP YYtstSuOuIE M}}h0 Yj YU R=t-5h YYth Yj YE Mt ?-u&u  hh @YYt=t!5h YYWh YY Wh YYhh #YY uh h YYj% Y 1 }x F E`}Ux FE`}x F pl xE<'UNxAxxEp a5 hP u:=t=t h Yj Yh Yj Y jhP ujhP cPYt tHt ƄEPEPhP=thX" Yj h Y=t$5h, YYEPh, YYEPh, YYhTh, YY uh, h0YYj Y=th, hYY z=t1   5 Yuh, YY= h, hYYUVWu} > t> uF>u16Ot1> t > t>tF>u1> t> uF>u1_^UVWDž1}x G5 hP2 uh`YjY jhPg uh-YjsYPP0YZ‰N > uNDžgGEt u}Y6nYu`Y눻E0_^UVWE1u Džt u WYYE1u փ w F0PY ARY_^U J x  MEh PvYYUV5Nx t^U=tud YUVW11}U9<u <F߃| jugYtUrYtURtUzt r Y}t} t}$t u Y_^UVWuEu41}%<<t4<YtEG֋E ~tV€uFu1V€cE~tVuډUjuv5 =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvo EU9Uu1 N _^UV1}*<<t<Bt 4<aYF^UVWu}M } ~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1E_^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<<t,<R@t<Bt 4<YGƒ~uF FF VVv vvU >uNN FFSX_^UVW}Wu uT ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~ u>5 Yt.hxYFu NLNHF 9hJYFuN!NF V@uVVVhUFt$jjv& =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<<tN|1DFρECEE0-EMP1E E (U :t! EE E (U uuu?YYEy@Ut8huYYE~" tucYuuYYE}y1]jmYEu u.Y1A!uEUMJUzUBU<E_^UVW}EEL#WUWNYwY}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVuYYDžt~~yVډF_^U$UUEPjj U$U UEPu`YYEPj!ju U$U UEPu4YYEPjjI U$UUEPjj+ U$U UEPuYYEPjj U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu4YYU UEPjjC ^U$UUUUU UEPjj Uu hT$u U$UUUUU UEPjj UVWu }E $E)E EEELc-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXViYǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G E=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE= r} u8-t8+uEE- EE}dt}iuuEPh  EuEPh  EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVYEE볃}b}t VuYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE } s UE?]u Gƀ ?Z?]QGƀ ?-uG?t2?]t-G9"G@E9EEƀ EG 띀?uEE 3]uVuYYEEuUURUEu UMЈ EMt"JxFFSXVkYEE}t}tE 3]u}t}t VuHYYMEUEt }vE}uEuVu E= r} u8-t8+uEE- EEEPh YYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuU YUURY EEEu }ntEGV}u}tE_^UVWu }tV€u4V9Vu>t FN~U9tUE_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UhDh$YYjYUhdh$vYYjYUVuhYƋU rU MJwU uRYY^U$UUU UUUEPj6j UUUuuu d UVW}u M)9r/r uu fE_^]t|UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEZ uVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"Ui EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VubYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PsE6U U RU U RUEEE4y E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPFYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPbYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UUas U EU jEPEP jE PEP UVWuE}} #V Vu WYFfF^~.j!YfFFFUAMt7xF*FPlYFyFPFP\YYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jgYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^UEUVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UEUBËKI|;u[u P7 u.`=}aa1ۇ tPXPEnd uudecoding: %s Begin uudecoding: %s uud: Cannot open output file: %s wuud: Missing filename in begin line. begin%o%sbegintableuud: No begin line. End of file. uud: Can't open %s rUsage: uud [-n] [-d] [-s dir] [-t dir] [input-file] Source dir = %s uud: Missing source directory. Target dir = %s uud: Missing target directory. uud: Duplicate char in translation table. uud: Incomplete translation table. beginuud: EOF while in translation table. uud: Error on writing decoded file. Sequence char is <%c> instead of <%c>. uud: Wrong sequence line %d in %s Sequence check on (1). No sequence check (1). Sequence check on (2). Sequence check turned off (2). Bad line =%s Non uuencoded char <%c>, line %d in file: %s Bad line =%s uud: Bad prefix line %d in file: %s includeenduud: EOF before end. Reading part %c uud: Part suffix mismatch: <%c> instead of <%c>. uud: Missing part name, in included file: %s begintableuud: No begin line after include: %s uud: Freopen abort: %s Reading next section from: %s rContinuing to read same file. Cant find: %s uud: Missing include file name. c de su argwv+barw[+;b1QXb:d(io1pu(x%L$h$l$%E!*G!*X&[(b&c''d&e!*f!*g!*i&n%o&p&s'u&x&cannot print floating point cannot print floating point ]0 0@60Z1XC1b(1d:1i:1o11pC1u:1xC132 $2#)2+2-20.2%5L 3h2l3+3E4G4X4b4c4dU4e4f4g4iU4n{3o4p4r5s3u4x4(null) SSSSB $ ((((( AAAAAABBBBBB   "DHE1$T$LDsu;SSSSull QRPd PU VWu RRYZЉEU9s z/tMhuVYY1ۅÉ]}}uhdhn jYV:-u=vCYأhLh8YYjPYM}t l5hHvYYluvh8h jYVRRYZ9~s /tOWhtYYt?.uGuhtY= ~~h0htYYhtSY=u*}u}~V:-upp>(h,ht YYpuhthh j YDvhh 5ph5pYY5pY1_^UVW5phYY 1`}M u2pp:xpX@ 5pj K YYB5pWTYYF뮡pp:xpX@ 5pj  YY_^U=t0tJӈtxӈtUTVWj-EPGYYǡpp:x?! pX@?! 5pRa YYE9}}UUR}YEpp:x|PpX@Z|5pP YY|H||a}|zpp:xpX@ 5pj YYF=95t=tz~%ta=xzu xax^hth5pB 5pHYhht YYpuhthh jYVht5th5p _^U VWuE^0 ىM^<V ډU^?!ߡpp:x?#U pX@?#U 5pR6YYpp:x?#U pX@?#U 5pRYYpp:x?#U pX@?#U 5pRYYpp:x?! pX@?! 5pRfYY_^UVW}19u ~05lYElRtEFˋE _^UVuj jVC ^UV5Nx ^U=tul YUVujuu V!^UVujuu V^UVWuEEEu} tE 01tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^UVW11}U9u F߃| jugYtUr YtURtUzt r Y}t}t}t u Y_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv? EU9Uu1 N _^UV1}*<tBt 4aYF^UVuJxFFSXVY^UVWu~y V0t VuN FtN V€uNVu+~u%hoYF~uN NF 1}9<t,R@tBt 4UYGƒ~uFDFF VVv vvi >uNN FFSX_^UVW}Wu uh ƅ~9})׉U U 1_^UVWu }J ~y UVu CV€tu ,fNV~u>5Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv: =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv+ =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuuSYYEy@Ut8huYYE~" tuwYuuYYE}y1]jYEu uBY1A!uEUMJUzUBUE_^UUUuuu T UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPuYY=uEE_^'UVWE_^]UV\U9\wU\9\v 16VYt1'\rF5\&Y5\^UVW}u1E}UUs 1=Xu8jlY=u1V!փ5X5\FE5`OVU}9}r69v2W9UvUW~>}t E`u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=`<9}r79}u+UOJ}t E`URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\ uY_^U VWUUb15`t 9ur6E0tU U`tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U41UVW544}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$EPuYY1ۅÉU$UUU UUUEPjj yEU(VuU @t*u>YEU UV֋RUUUEPu\ YYU UEPjj ^U$UUUUU UEPjjo Uu hT$u= U$UUUUU UEPjj+ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuukƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu@YY=u}t UډE1!,'"UdEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEDUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PKE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuDYY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhLhYYjYUVuYƋU rU MJwU uR]YY^U$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|KI|;u[u P1ۇ<tPXPend begin %o %s Cannot open %s w.uueCannot open %s rWrong file length arg. Usage: %s [-n] inputfile [-] uuencodetable begin part %c %s Cannot open %s winclude %s arwV+7b-U @.RX;b d2i2o)p;u2x;+ #!+-0&Lhl#EGXbcdMefgiMnsoprsux(null)cannot print floating point haaz}SSSSB ((((( AAAAAABBBBBB H  D1$T$Lhsu;SSSSuXX QRP8 PBUVWUJUU z}~AG<-u:MF?t1@$DH Gʃ=@u0=Du'=Hu@DH1}|@E9uzhlY=@t5LhYY=Dt5PhYY=Ht5Th{YYh|oYhYjY9uU hx4YYEuU 4hdh uuY=@t5Lh\YY=Dt5PhTYY=Ht5ThLYYU 4hDYYuYFF}t\=@t5Xh<YY=Dt5\h4gYY=Ht5`h,LYYh$@YhY1_^UVW1LPTEJExEX@ uY=t4T]ttP1 t uL랋LXP\T`_^UhhMYYjYUV5`Nx d^U=dtduLYUVW11}U9u F߃| jugYtUrYtURtUzt rfY}lt}t}t uBY_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvE =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvg EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<t,R@tBt 4}YGƒ~uFFF VVv vv >uNN FFSX_^UVWEE11<tN|1DFρECEE0-EMP1E E U :t! EE E U uuu{YYEy@Ut8huYYE~" tuYuu7YYE}y1]j!YEu uY1A!uEUMJUzUBUE_^UUUuuu d UU UhuuB UV0U90wU090v 16VYt1'0rF50&Y50^UVW}u1E}UUs 1=,u8jlY=u1V!փ5,50FE54OVU}9}r69v2W9UvUW~>}t E4u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=4<9}r79}u+UOJ}t E4URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVD uY_^U VWUUb154t 9ur6E0tU U4tU9ru NJEtU9Wu RWE_^U$UUEPjjg y U1UVW5}׃}~9r }y 9vWYu_^UVWuU VVu YYDžt~~yVډF_^U$UUEPjj U$UUEPjj U$U UEPu YYEPjjU U$UUU UUUEPjj+ yEU(VuU @t*uR YEU UV֋RUUUEPut YYU UEPjj ^U$UUUUU UEPjj U$UUUUU UEPjjc UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U c }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UP EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE0UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P{E6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }d~y UVu CV€tu ,fNV~u>5<Yt.h8YFu NLNHF 9h YFuN!NF V@uVVVhUFt$jjvn =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv_ =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u MUUas U EUh8hYYj^YUVuYƋU rU MJwU uRYY^U$EPuYY1ۅÉUu hT$u UVW}u M)9r/r uu fE_^]t|UW}0ʀuA)_]UVW=E_^]U$UUU UUUEPj6j# } 0)ʇʋu }KI|;u[u P1ۇtPXPclw total %6ld %6ld %6ld %s %6ld %6ld %6ldwc: cannot open %s r %6ld %6ld %6ldUsage: wc [-lwc] [name ...] arsw+b @Xbdiopux #+-0LhlEaGLXbc3deafagLinoprsqux(null)cannot print floating point < ((((( AAAAAABBBBBB SSSSBl#!/bin/sh : List all system directories containing the argument : Author: Terrence W. Holm if test $# -ne 1; then echo "Usage: whereis name" exit 1 fi path="/bin /lib /etc\ /usr/bin /usr/lib\ /usr/include /usr/include/sys" for dir in $path; do for file in $dir/$1 $dir/$1.*; do if test -f $file; then echo $file elif test -d $file; then echo $file/ fi done done exit 0   LC1$T$Lsu;SSSSu QRP PU4VW} Dž}}7hxh< jpYU?1DžDžhp\Yƅuhdh<YYjYVPYYuj:VYYEuUh`VYYu"u7VhXhPw7VhPhP^EujhPYYuhPhL YYDžh@hPhDPjPYYuPh<YYDžh0hPh4PjPuYYuPh,jYYDžh hPh$PejP$YYuPhYYDž`t*hqYP7h h<Dž_^UV5Nx ^U=tulYUVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^UUUuuu  UU Uh$uu UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjh YYEUuu hu{UW}0))ϊE tu1_]XG_] UVW E_^]U$UUEPjj U$U UEPuYYEPj!j UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U S}t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"UEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U$JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE Po E6U U RU U RUEEED E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }R~y UVu CV€tu ,fNV~$u>5(Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjvv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjvg =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVWtu} u ~tIu(_^]} 0)ʇʋu }UVU9wU9v 16VYt1'rF5&Y5^UVW}u1E}UUs 1=u8jY=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVP uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UUas U EUhh<BYYjYU$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRYY^UVWuU VVuYYDžt~~yVډF_^U$EPuFYY1ۅÉU$UUU UUUEPjjw yEUu hT$uE U$UUUUU UEPjj' UVWuEu41}%Eyh<hYYjYkE0jPu: Eujj0EP=y}u}t֍EPYkFk^vvv PP8SEPEPhR }tEPjh9 h,Y}ijY_^UV5xNx  ^U=|t|uYUVWuYƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEPe.>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }hVW ƅu1WW YZ׀>/u5FuhVEP ƅu19ut EEG>,t1jFhVW ƅu1MWW YZ׀>/u0FuhVEP ƅu1EEGu>t1_^UVWuE}>:tVho YY_U U V[ Y=Vh$ YYVhlwYYƅ>-uF>+uFjVEP ƅUUj hl5 1lVhlYYƅpj hl5 l>t>,tjVEP ƅt5U>t'>,u"FVQ Y=xwVhlYYƅu_^UhLe YPLYUVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J(4EU M R+Q¤ЙЙUuW +UЙOIkkE0(UM 9_^UVWuEE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<FyFtVYU )uRv EVt tfVV}u1_^UU UhuuZ UVWE_^]L$ UVWME_^]UVW(Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEh(u%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVH uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U$UUEPjj y U\1UVW5\\}׃}~9r }y 9vWYu_^U=Lx 5LYLPU=Lxjh@QYYLy'j5LYY Pj5L 1U    =Pu/hh5LE P1V =  u1< P    = u  U} t} u1UV PYt }u :#u1b5  U :u1D : t(}t :"u*  P_YtU>u1^UV U P'Yt  :"uR jYƅt(>"t#= u1{  0ʋ :"u; 0jYƅu1C= u13  0= u1  E^U=Ly _y1Du17jRY tjAY UVƅtu6YYu^UVWuU VVuQYYDžt~~yVډ<F_^UHVWEPuYYxU܁ t1hTYƅu1VYDžU9uhTh YYhh AYYGPh 1YYEPh MYYxU uUM9uE]9pE]9`VY VY1_^U$UUEPjj U$UUEPjj{ U$U UEPuYYEPjjM U(VuEEV֋RUV֋RU E [UUU UEPj7j ^U$UUU UUUEPjj yEU(VuU @t*uZYEU UV֋RUUUEPuYYU UEPjjS ^U$UUUUU UEPjj' UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEuVuu ƀ}Xu9utUPO YUE_^U4VWuEEEE }%MJxUʋFF Vu YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UP JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P E6U U RU U RUEEEp E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPTYY=u}t UډJxUʋFF Vu YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuIYY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuvY =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hWYF~uN NF 1}9<t,R@tBt 4}YGƒ~uF FF VVv vv >uNN FFSX_^UVW}Wu u@ ƅ~9})׉U U 1_^UVWu }|(~y UVu CV€tu ,fNV~u>54Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^{USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UVW}u MUUas U EUhhYYjYUVu\YƋU rU MJwU uRYY^U}u< UEuYuYU$UUU UEPjj U$EPu2YY1ۅÉU0VWEPuYYy1U؁@t<1huYYDžy1EPWRYYxS<U؁@u7jW YYEx& PjW xh$Yƅu<UWYUЉ<1FfFF_^UVWuu< 1FQh^ SPi fF^1FfFV VF=uFF~u~. VffGVjRGP0 GWBVVFWB)ډfFWBV4_^U$uYEUUU UEPjj Uu hT$u U$UUUUU UEPjj UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]U$UUU UUUEPj6j {sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇdtPXP (%.*s)%-9.8s %-9.8s %.3s %.3s %2d %02d:%02dwho: no access to terminal. who: can't open %s rUsage: who | who am i SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ/dev/arkwz+b/]6]6]6CCC  @!X b d i o p u x ! !#!+!-!0!$L"h"l""Em$GX$X#b#c?$d$em$fm$gX$i$n'#o#p#r$s}#u#x#(null)cannot print floating point /etc/utmpSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDecGMTGDTU U D80($  SSSSB/etc/ttytab/devP   @G1$T$L<su;SSSSu00 QRP0 PNUVPYƅuj)Y6Y1^UV54Nx 8^U=8t8uTYU=Lx 5LYLPU=Lx=u @j5YYLy'j5LNYY Pj5L9 1U^UU =Pu/hh5L P1V= u1< P  = u U U U :u1 : t  ::uҋUEUV=Lyy1u1txtjƅtjjV fLƅtjjV| /t! yg :X^UV%ƅt F9Eu^UV{ƅtu6YYu[^U$UUEPjj U(VuEEV֋RUV֋RU E UUU UEPj7jf ^U(VuU @t*u*YEU UV֋RUUUEPuYYU UEPjj ^U$UUUUU UEPjj UVW}pE?t:JxG^FSX GVP[YY=u0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+T"}t}y UU_^UVuYƋU rU MJwU uRYY^UVWuU VVuaYYDžt~~yVډTF_^U$UUEPjj U$EPjj yEUVW}Wu uX ƅ~9})׉U U 1_^UVWu }8~y UVu CV€tu ,fNV~pu>5t8Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv! =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWE_^]UV(U9(wU(9(vT 16VYt1'(rF5(&Y5(^UVW}u1E}UUsT 1=$u8jlY=u1V!փ5$5(FE5,OVU}9}r69v2W9UvUW~>}t E,u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=,<9}r79}u+UOJ}t E,URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuVt uY_^U VWUUb15,t 9ur6E0tU U,tU9ru NJEtU9Wu RWE_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^U$EPuFYY1ۅÉU$UUU UUUEPjj/ yEUu hT$u U$UUUUU UEPjj UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv^ =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^} 0)ʇʋu }UVW}u MOU$UUU UUUEPj6j UVW}u M)9r/r uu fE_^]t|+C;Cw Ë[ uӅu Pk1ۇtPXP4SSSS/etc/passwdBXp ((((( AAAAAABBBBBB   Z\Md01$T$L \su;SSSSu, , QRP P:U VWu}>>%tFGF>%uFG=0|=9F-0EJ=a|=fF-WE(=A=FF-7E=0|$=9F-0U ˆUT=a|!=fF-WU ˆU)=A|*=F F-7U ˆUMGE_^UVW} E0W5YEEU9UGE'GeGEE0 FE%0] É؊0 FE%<] É؊0 FE%?0 FEqUB9UuF=U9UuF=F=E0_^Uh h\4YYDž|bu uhEPK3EP|PYY\UVW} uO=t t =t u > ut )=t t =t u > ut t > up p =t t =p u EFu1_^UVW} uE Pu u+ YYƅy"u uhh 1O}$t(j?u4YYEtEu3Y1}$t~jhV3 jhV2 u3YPuV2 j hV2 jhV2 jhpV2 U:tDjh`V2 uuYYEP3YPuVp2 jh\V`2 }$t1~-WhDhC1 h2YPhV)2 jh<V2 u2YPuV2 jh8V1 jh4V1 }$t~ WuV1 Eh>hV1 E}t5EPuh^ E}tU+URhjn1 UU}t} uU+UuPj?1 9Eqh,/Y'}yhh `/YY V0Y1_^U VWu>t>(tF>pF1V. YBSEPWZYZtj,V0YYƅthu"- ƅ~Vhj- E9t9ut tu,YWYƹd=u1hhWu W%Yu%Yu,Yu1_^U VW}} uhh *YYu u YYƅy"u uhh *e?/uGW,YPWV), jhV, h>hV+ E~uhj+ E9EtV+Y1_^UVW} DžDž Džj/7x,YYEuUM}x:-mM:-uztS:t-DžDž DžEƋMhue+YY}|}~uhh )) zj@P7Pl+ Dž0,}tj@PEP=+ EE}tj@PwP+ Eƅwji,,EP07Phuy*YY}tuhdh C( j@P7P* Dž0P, ,,EP07P &}tuhHh ' UMjh@u uEU$ojh8u uEU$Gjh0uq uEU$uh h ' \Eƅwƅ7Dž0$>t>/tF,,j@$~(YYtN$>t>:tF>tF$EP(YYVwP(YY$, $>t >/t>:tF+$R$7Ps( +$Ƅ7>:u+F$>t>/tF-0k0 É0܀>/u, Dž,},>t>;tF>FjhV PY( ,wPEP07P? p(,wPEP07P1<,wPEP07PEH_^UtG9uF>uր?=uэG1_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0% tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^UUAs UEU8VWEU UUUUfRfYY Y ىM؋UfRfYY Y ىME Eu }}`uuVuuDžyZ1W΋Ulu!YljUUU)UVuVX YYZMԃ}~DVuV9 YYZ߃}t&UBt Z Z1+EEpEE|EM9uuuVuuDžV YEV YEV Yǃ}u@ց}sUEEue YljUUU)U]}tE} u?uuVuu"Džy +֋Ull}u}t }t&9=xt U9UtQ=xUŨ}u1t}u UluuYZЉEE1UU s-UEȉEWVR UUE;}tEEl Z1_^UVW}-0= >N>.WY=uZ1=lptx|lX-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhHPhPj jP$Ey1HjuP ƅu1*UVU V _^UVuEPVYYtE ^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAE% Dt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s % u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU dE_=} tF=Z Z ًZ ʋ Z ыE _^UVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U<}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!:+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#UF9>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^UVW(Zuy=u hPjjjuu uj.$ƅZuuVPƅyZ}Gu^fWfYY Y uL0Z7Z+ZZW]7_^UVWE(ZuY=u N ZuE>t >.uEF}u)uYƅtuuuu V_}u (Z€u$}N>.(ZD[?quuuu 7uE~= ;uZl=ZuE=Zt =Zu(Zt놃}t"uuuu ju%E~}t Z_^UVW}} uBWY-Ɖ:.u#sVWP Ƅ5*"u hWhhPuuuu_^UVWh?YEthuFYYEu1EuhPv >t% uF>nuP. YYuF% u>tDG?t% uG1҈hVhq u Y u Y1_^U@VWEEEUUЋUUE=(Zu=u (Zu } ~1EUffUE$Z9UYE,Z9U;}Dž$ZU= y2UMEPUuNN FFSX_^UVWEE11< tN|1DFρECEE0-EMP1E E pc%U :t! EE E :%U uuuYYEy@Ut8hu1YYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBU E_^UUUuuu  UVW5 YNj5 h Yh Y}t.U:t&uYPuV jhV  WYPWV jhV _^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu 3 UVW}u MUW}0))ϊE tu1_]XG_]UVWE_^]L$ UVWME_^]UW}0OE uG_]1_]UV,U9,wU,9,v 16Vx Yt1',rF5,&Y5,^UVW}u1E}UUs 1=(u8j Y=u1V!փ5(5,FE50OVU}9}r69v2W9UvUW~>}t E0u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=0<9}r79}u+UOJ}t E0URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb150t 9ur6E0tU U0tU9ru NJEtU9Wu RWE_^UVu~  u 6EPR YEU UEPEPV yE^UVux95H< ^UUas U EU VWDžDž Z$Z(Z,ZDZjhYYuZg#JfhgYƅthVhDZH hhTYYE(uhP jhP _u> t> uF>t> thVhDZ j hDZYYƅtDždjhPd 9> t> uF>> hVhDZ' j hDZYYƅtDZD[7E>t3\[s+> t> u E}t 7EFȀ>t > t> tFDžoj hPo Q=,ZD> t> uF>(> ,Z0ZPV YY,Zff Ut >.uEFDZ}|P[sj.VYYF7M (Z1_^U*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE4uVuu+ ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U|EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U%JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE\UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }| 1~y UVu CV€tu ,fNV~ u>5 lYt.hhYFu NLNHF 9h:YFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^'/7USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E Mr/u'uĉ fE_]U}x}~uNPYYUh h &YYjfYU Vjh YYƅyHu uV EVbY}u"U JUj uYYEt1^UVW5`[YDžD7uYYtw>t6uzYYt} tu w ^YYu=`[u_^UVuhYƋU rU MJwU uRYY^U$EPjj U$EPu6YY1ۅÉU$UUU UEPj%j U$} uEEUUE UEPjJjU y}tUEEUHVuUVUVUV UVUЋU UEPY^UVuEPKYjEPjM VH@5Ph4jKj ^U$EUEPjHj Uu hT$uE U=Puh h YYP 5PYU `[U=Pt5PYP`[UVW=Pu!h h {YYPu1D5PhhX Eu1U:#th u YYƅtU\h uYYEtEU: t: uEh uYYƅjFuWY%fYY Y ى d5hl`h VWYYƅtFt8>t3> t> uFs7h VYYƅtF\_^UVW}Utu >t]9uFG1_^Ujju E`UVWu1fϋV€t}u ~tu>FtV9YU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu P-KI|;u[u P1ۇTtPXP%s:%sBASIC httpget: Read error write Host: Content-Length: %u Authorization: Connection: Close User-Agent: urlget HTTP/1.0 GET POST httpget: Could not connect to %s:%d %d.%d.%d.%d %s%s%s QUITRETRNLSTPASVTYPE%cCWDurlget@PASSftpUSERwrftpget: Could not connect to %s:%d httpget: Could not connect to %s:%d tcpget: No port specified d h p (\type=/%s: I do not handle this scheme tcp://ftp://http://Usage: %s [-h] [-p] url Usage: %s [-h] [-d] [-p] host path httpgetUsage: %s host path [user [pass]] ftpgethttpget: NWIOTCPCONNhttpget: NWIOGTCPCONFhttpget: NWIOSTCPCONFhttpget: opening tcp/dev/tcpTCP_DEVICEUnknown host %s! %u.%u.%u.%u.in-addr.arpa%%},x3 : "!"!!""%.*s.%.*srHOSTALIASES/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE8/a*/r"/w0/t/+\/bR/34a 4r3w 4v4+W4bM4 : unknown errornameserversearchdomainr/etc/resolv.confLOCALDOMAINdomainB@AG aG@GHXHbHdHiHoHpHuHxHI I#I+I-zI0ILLmJhWJlbJJE!LG LXwKbwKcKdKe!Lf!Lg LiKnJowKpwKreLs1KuwKxwK(null)No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0cannot print floating point /etc/hostname.filer/etc/services ,/ # r/etc/servicesABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/SSSSB ((((( AAAAAABBBBBB d[Unknown error | d X < (   | p \ L < ,   |l`P<  , , , , , , , , , , l`H,xdCbegromI_22\I_2\__callsp_string2>_getansw_h_addr__hostl_host_al_hostbuf _host_ad_dn_findI_3_s _tcp_con*_tcpip_w+_udp_con+_udp_sen],_alarm_h -_udp_rec$-I_1next!7found?7failure7_grow7__bottom(__top,__empty0_handlerE_gnumF_o_printKG_do_writ4OSENDRECEIVEBOTHSYSVEC!SRCDESTMESSAGE uplwordRupwordRupbyteRdoneRdownwardScompare0Sdonet > uFuJYjh\j ^UPVWf1jOEPj} Dž}t } utWEPji }!tGtC1h4jj- jOEPj EPYhXjj PtWEP50 -EPYWEP50 jhlj jhd50 _^UhhYYhthYYjYUVWjht6YYhu ul =t+ffŻ;U98k8A 8M RY=v BU98}28A 8M U98} 1Džt*WYh4jjT jY_^UjjHYYhhCYYh4jj tjh50 j6YUuIYPYUV5Nx |^U=tu<YUVWuz Yƹ<+F؉F+ډVYVYDžt"<1FF1VY_^UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP7>M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h0VW ƅu1WWYZ׀>/u5Fuh0VEP ƅu19ut EEG>,t1jFhDVW ƅu1MWW8YZ׀>/u0FuhDVEP ƅu1EEGu>t1_^UVWuE}>:tVhYY_ $0U@ DUT VwY=Vh@YYVhwYYƅ>-uF>+uFjVEP ƅUUj h5  1VhYYƅpj h5$ >t>,tjVEP ƅt5U>t'>,u"FVmY=xwVhYYƅu_^Uh!YPLY ($,UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE0DE=uV =u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^U VWu<Fy:8M <C;t!A 8M <C8U98|W=4t=E h0 YYhh YYhWX YYhj J YY<?`8A 8M <78M <<:u<8_^U=Lx 5LYLPU=Lx= u  @j5 YYLy'j5LfYY Pj5LQ 1U^U U =Pu/hh 5L P1V =u1< P= u UUU:u1: t ::uҋUEUV=Lyy1u1txtjƅtjjVz fLƅtjjV\ /t!yg:X^UV%ƅt F9Eu^UV{ƅtu6 YYu[^UHVWEPu YYxU܁ t1hT Yƅu1V{ YDžU9uhTh YYhh YYGPh YYEPh- YYxU uUM9uE]9pE]9`VY VY1_^U$UUEPjj ULVWE1EEU UE8t+0H YE9uvEEEE͋UUE8t(0 YE9uvEEEЃ E V!փ}u s0KVYE=u0&UEUUU}׋U UE8t=+UEEE0ZYE܋]P3W }׃E뻋EEUUE8t=+UEEE0YE܋]P3WM }׃E뻋EEU9vGuYEuUUȋUUEEEPj;j" RY_^U(VuEEV֋RUV֋RU E "UUU UEPj7j ^U$EPjj U(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj3 ^U$UUUUU UEPjj U$UUU UUUE$EPjGj U} v0M E 1U} v0M ҋE!1UE1UE1U} v0M Et1     U$EPjj y}tUEEUVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv! =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^UUUuuu  UVu JxUʋFF VuYY^UVWu }E?t:JxG^FSX GVPYY=uEE_^UU Uhtuu UVuh} t1Pu V^UVWu} E!}t}@t}t ~tVt vYft }uEu(}t"}tuYDžu EN~U VVVu F UV E_^UUURu hu'UUURuu uUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu o 7 S K '7{z UVW}u M[UW}0))ϊE tu1_]XG_]nUVWE_^]L$ /UVWMKE_^]UW}0OE uG_]1_]UVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWh8VYYURtG9uF>uր?=uэG1_^UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+0"}t}y UU_^U$UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^UVuYƋU rU MJwU uRIYY^UVWuU VVuYYDžt~~yVډ0F_^U$UUEPjj U}u0 UEudYu-YU$UUU UEPjjA U$EPjj) U$UUU UUUEPjj yEU0VWEPudYYy1U؁@t01huYYDžy1EPWYYxS0U؁@u7jWLYYEx& PjW5 xh$ Yƅu0UWYUЉ01FfFF_^UVWuu0 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGP GWBVVFWB)ډfFWBV4_^UHVuUVUVUV UVUЋU UEPY^UVuEPOYjEPjI V5 hjKjy ^U$uYEUUU UEPjj@ Uu hT$u UV& T$@, T$@% T$@0TE uVu7 ^U$EPj j y}tUEEU$UUUUU UEPjj{ UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U l }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U% JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEЬUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PKE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }!~y UVu CV€tu ,fNV~tu>5xYt.hDYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^USE] ![]USE] ![]USE] ![]UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhhvYYjYU$UUU UUUEPj6j U$EPu.YY1ۅÉU$} uEEUUE UEPjJj! y}tUEEÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXP@(#) WRITE 1.6 (10/24/92)Writing to %s on %s %s is logged onto %s, not %s %s is not logged on Cannot open utmp file /etc/utmpTrying to write to %s No such user: %s /dev/consoleIt may have write permission turned off Cannot open %s to write to %s /dev/%s Message from %s (%s) %-24.24s... unknown user ! ! EOT EOT -c : cbreak mode -v : verbose usage: write [-c] [-v] user [tty] cvvcv EOT Interrupt. Exiting write SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZ-csh/bin/shcd .: option requires an argument -- : illegal option -- --/1 1 1 ??? ??? ?? ??:??:?? ???? 2222I4 3@"4F5X/5b5d&5i&5o5p/5u&5x/56 6#6+ 6-6069L6h6l67E8G8X8b8c8dA8e8f8g8iA8ng7o8p8r8s7u8x8(null)cannot print floating point ,GMTGDTU U 80(|tl`XL@ SSSS/etc/passwd/devB\t ((((( AAAAAABBBBBB   p( \ 1$T$L su;SSSSu8 8 QRP PFUDVWEԐE81҉UĉUȉUhu u E=r`E5 YEԅhWY5 YE EEzE 'U+ U U U }t }uUBUBRYEEu5 m YPhYYE 8uEERYE3EE EERYEEE ] ;uԋ}UUU+UU̅ h3YURAYEu5 YPhYYuuŨU}L9uu 5 RY9uuu(Y5 2Y9uU9}t 9ut}uD}t9}t9uu hdtYuY}u 5 Yu}Ful9uv UF\9}u hD"Y}t h YukY}U+UURuu UUu֋UF J x  SX h YE<n$1҉U܉U9uu 5 Y9uu;uY5 Y}}t% 9un}u}t h (YU9}t 9ut}uD}t9}t9uu hYuLY}u 5 PYu}Fu}y1}E}^1}E}uG}uA J x  SX h YE=u h=Y9uv UF\9}u hY}t h YufY}U+UURuu UUu֋UF J x  SX h YEP"UVW}= tS7hh >t6hh hh YYh YEPY5 YPhYY5 YPhxYYu1Yju6YY Pju$ W7YY= u~E5 DYP7hhh  jEPu j Y E!!u YjEPu =sEuq YjEPu E=u5 YPh\YY}t u[YUuGu!7h8h @ j|/YUy {jUu(P7hh j}Y:Us&UʃQ7hh j}Y_^Uhh YYjYUU Uhh k YYuuh  hh G YYj7YUVuj jVw ^UV5 Nx  ^U= t u YUV U9 wU 9 v 16VYt1' rF5 &Y5 ^UVW}u1E}UUs 1= u8j`Y=u1V!փ5 5 FE5 OVU}9}r69v2W9UvUW~>}t E u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE= <9}r79}u+UOJ}t E URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15 t 9ur6E0tU U tU9ru NJEtU9Wu RWE_^UVux95  ^UVujuu V!^UVujuu V^UVWuEEEu} tE 0y tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+ "}t}y UU_^U$UUEPjj y Ut 1UVW5t t }׃}~9r }y 9vWYu_^UVW= aU9 }  M :-u zu  M h<4YYu  M  ǣX :tWuKYYƅ}= t=E h 0YYh h$YYh WYYh j YY M   :u  ? F>: M  C;t!A M  C  U9 |W= t=E h 0YYh h YYh WYYh j YY ?` A M   7 M   :u   _^UVWuU VVuEYYDžt~~yVډ F_^UVWuEu41}%<$ t4$ YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjvv =u N /uvvg EU9Uu1 N _^UV1}*<$ t$ Bt 4$ aYF^UVWu~y V0t VuN FtN V€uNVu+~u%hOYF~uN NF 1}9<$ t,$ R@t$ Bt 4$ }YGƒ~uF FF VVv vvY >uNN FFSX_^UUUuuu  UVu JxUʋFF Vu& YY^UVWu }E?t:JxG^FSX GVP YY=uEE_^Uuuu 9 7O_/USE] ![]USE] ![]USE] ![]ËD$D$D$UVW}u MUW}0))ϊE tu1_]XG_]U$UUEPjj U$UUEPjj U4VWEj/uGYYuhYƅuVuYPufYZEЃeuYE=u }؀>t >:tFG9}s/GuW,YYEPuvYY=t48 2u u = t  Ũ}t} uFuUR'YỦ _^U(VuEEV֋RUV֋RU E UUU UEPj7j> ^U$EPjj% U$UUU UUUEPjj yEU$EPj*j yUEUMJ1U$UUUUU UEPjj U$uvYEUUU UEPjjT U$UUUUEPj j- y} tUE EU$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu+ ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF Vu$YY=u}t UډE1!,'"U0 EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U` JxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE P;E6U U RU U RUEEE E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPpYY=u}t UډJxUʋFF Vu !(YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VueYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu } &~y UVu CV€tu ,fNV~ u>5 Yt.hYFu NLNHF 9hbYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]UW}0ʀuA)_]UVWE_^]UVW8 Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UUas U EUh h VYYjFYULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u s KVYE=u &UEUUU}׋U UE8t=+UEEE0YE܋]P3Wy }׃E뻋EEUUE8t=+UEEE0YE܋]P3W! }׃E뻋EEU9vGu]YEuUUȋUUEEEPj;j* RY_^U$EPuYY1ۅÉUu hT$u% Ë} 0)ʇʋu }U$UUU UUUEPj6j +C;Cw Ë[ uӅu P-KI|;u[u P71ۇ tPXP0?nstx3d   "r'W\insufficient space for argumentsinsufficient space for argumentbackslash at EOFinsufficient space for argumentsunterminated quoteinsufficient space for argumentsinsufficient space for argumentinsufficient space for arguments%sinsufficient space for command/bin/echo%sillegal argument countn:s:tx0/xargs: %s terminated by signal %d xargs: %s terminated by signal %d xargs: %s exited with status 255 waitpid: %sxargs: %s: %s. fork: %spipe: %s %s%susage: xargs [-t0] [[-x] -n number] [-s size] [utility [argument ...]] xargs: unknown error: option requires an argument -- : illegal option -- --No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0PATHY @2VX?b$d6i6o-p?u6x?/ #%+-0*!L hl'EGXbcdQefgiQnwoprsux(null)cannot print floating point @(#) Copyright (c) 1990 The Regents of the University of California. All rights reserved. @(#)xargs.c 5.11 (Berkeley) 6/19/91SSSSB \ ((((( AAAAAABBBBBB Unknown errorhX@4hXL8(pXH<,| | | | | | | | | | x\H<$xhT@C  й471$T$L34su;SSSSu.. QRP5+PJUVW5 ЙE5Pa'Y4Nj5U59UU 54E}YU 5Q5BE95,+5EE#UѺ EE띋UEh5554葚YY_^U,VW5 ЙEܺ5ЙE؋5UR[&Y5UУ45U 4ϋ5U59UU+5U 4E 5U59Uq} rUEMUtEU 5UEEEx%EԺ#UѺ EԉEE뀋U΋UE'54Y_^U0VW5 ЙE=55E܋=59}v U UUu9uS5BE956E4E=59}vEЋ]0EZ EЉE55u=59}UE} {MU`UU 5QE9uv 9E~f55fۋE55f9uv 9EuE{E R9uvf55f_^U55PY55DY5 Й54PYUu5.hh,4ij YU5.hh,4D j YUu5.h(h,4jf YU5/555.hDh,4j5 YUV}u> |- =_r> u5,4J,4x@4S@4Z?h,4P胠YY-,4J,4x@4@4?h,4j?TYYF{,4J,4x@4@4 h,4j !YYu9u d> u/,4J,4x@4@4 =h,4j YY-,4J,4x@4@4 h,4j 负YYF듋,4J,4x@4@4^h,4j^脟YY,4J,4x@4@4 h,4j WYY^U5/u5.hxh,4-uu AYYjjYU5/u5.hh,4uu YYj/YU5/u5.hh,4跢uu YYjYU5/u5.hh,4|uu YYjYU5/u5.h h,4Auu UYYj~YU5/555.h\h,4u55YYj=YU5/u5.hh,4šuu YYjYU5/555.hh,4臡u55YYjYUu5/555.hh,4CjYUu5/555.h$h,4jYYUu5/555.hth,4۠Uu5/555.hh,4诠Uu5/555.hh,4胠Uu5/555.h8h,4WjYU5/555.hth,4&U5/555.hh,4jGYU5/u5.hh,4ϟjYU5/555.h4h,4螟U5/u5.hph,4xuu YYjYUu 5/u5.hh,4:U5/u5.hh,4uu (YYjQYU5/555.hh,4֞j YUu u5/555.h@h,4蟞jYUu5/555.hph,4kjYU5/555.hh,4:Uu5.hh,4jdYUu5.hh,4U5 Й54fNL UV5RLY55 6tF546^UV5RY55 6tF5fN f B6^UV5RY556tF546^UV5RY555tF546^UVW1E65U559uvxG 9}}}1U4_^UVW5BRY51E59U}-U 5fQU 5Y4U5U@fN뫋?E55955~EUfr5rEFۋ55955~U 5frfqF䡴45 5fQ45MfQ4RY54RY5=6GE_KޅdWrE5B]95E]]@fEEU 5fQEU 5fQN딋?w5URY_^UVWU 5QEBQ]UU֋5r9}u9}~BUԉJU_^U4VW45URY44RYE4BRyYEE4U19=45zE؋5UZ]19u~FUr5BE95~'EE̺#UԉѺ ẺF9u~EUr5BE68t uuYYU܉AM܋MfQF붃}tAUBRYEU19u~UMfrfqFU܋MfQE5UUG4U̹ Ẻu.Y19=4~U<t 4ȌYGu輌Yu賌Y_^UDVW4RY44BRYEċ4BRYE19=4E5zE؋5z5Z]Ћ5UU:EUMf U؉UԋU5B5jE̋Uԋ 5UZ]EU9U}$UMJEԋ5B9]tEԋEUAMMfQ닋UWPuC ME}cE95MUMQESu:YYUAMMfQ6;t}~E듃E}MUBRYEȋ4EU9U}UMċ]EfQfXEߋUMfQG5454YYE19=4~4<t 4MYG54>YU4u,Yu#Y_^U VWU 5QBQEE}u 9}~5z9E u EGjYƋ4EfF44_^UVWU RYE19} ~+U4txEECfGЋU RYEU R|YE19} ~4UzE~#@PZYƋU4U4UfQGuY19} ~9U4t,x%]]у] fGu豈YE_^U54YU$VW5U5 5QE19}o5UU44FUUF54EU9UsEEE܋]0EZ E܉ۋ6벋UUG19}~!44tUVۇYuG54LJY54軇Y_^UV444BRY44BRY44U41954~4frF1954~$4 ru4<tVYF54Y54Y^U VWEP5444Y[fQ4UU 4fQU54U 5UU 4UEEDžp4 zuW]YU 4Qy9~4f yf Su54U9uvE]0EZ EU 4Q9E`4I54 4YQǡ44fz9}t-u54U9uv]E_^U VWE5R YƋ65U=59}v ExEECfۋ5RV Y4URE Y5EEE59U}?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^545_^UVWE= 6X}t hYG 6_4Suh|G EEU9UUOQEPhtȉYYu5rxF5r؋6B64hl艉YY5r؋5B9u~*B5655VZYQZ4hhDYYhd6Y5rx*B5655VZYQZ4h`YYh\Yh4謁YEE?_^UV1956~5rPVh譈 F^UV1955~5rPVh耈 F^U VW156^t hQYF^PSWh;FEEU9U}UNQPh YYEG6_^UVW4J RYƋ4fRfV4fF=4VU44U9}vfUfE=4t4254 5654_^UVWE5U59Us5U5BEyUAM 4fQE}|UJ RYƋ4fRfVEfF=4VUUU9}vfUfE=4t4254 5554_^U VW5RY555RY15U59UUM5rE59U}$U 6Q9Eu EfrFEщfrFE_^U5 547{Y55+{YUVW55xY6u1955~6FE}zE956~E5rDžx6:uEFك}t/ڋ 6QNj6:u6EF_^U56QzYUQU=P6t5P6|Y546襅Y=d6t5d6|Y5D6脅Y=h6t5h6|Y5H6cYuvYUjYUjj.zYY=th%jzYYjjzYY=th%jyYYjjyYY=th%jyYYU5.h$h,4豃 j$vYUVW}~ E .9},U 4>-\63B9UGF>t 5.G9}~U .P66F>t 5,6G9}~U ,6zp 6Y$6P(6G@Fh6)6  6$6(6F鶑GB9Ut~U /_^UV1}tuj=tYYƅu^UVWhtYDžuW裃YƍV Ut J:/tEu@uY46u^u)uYD6uGuuYH6u0W546YYW5D6 YYW5H6YYt,J:/t"46/D6/H6/F465.R趂YYD65.R蠂YYH65.R节YYV46aVD6tVH6u546ՁY5D6ɁY5H6轁Y5.UYƍFPtY@6u&5.5@6 YY@6hRYY= 6tBFPsY86u5.586YY86hR諁YY @686=6t@FPhsY<6u5.5<6iYY<6hRTYY=(6t@FPsYL6u=5.5L6 YYL6hR YY_^UV=\6u'h<5/}YY\6u 5/Yh8546}YYP6u 546Yh45D6}YYd6u 5D6Y=(6t'h05L6V}YYl6u 5L6Y=6tNh,5<6&}YYX6u 5<6QYh(5H6|YYh6u 5H6*Yh$5@6|YY`6u 5@6Y= 6t)h 586|YYT6u586Y `6T6Uu uBYYrbVemjYUV5RjY61955~V9Y6Fc66~9x^UVW}WYVWYYƉ_^UVWEU 5<WUGHE}pUMQE5B]95~IjYƋUEfFEfFU t6fQfVF x6U N uM놋E_^UVW5 ЙEU 5Q]BQU}9}`5zEU5U5Jօx1M!4ZtVuu  E NG뗋E _^UVWEutF9E~u6tF9Eu ~ uu6tF9Eu~ uF9E ~u6j2Ylj7EfGE fGU |6fQfWG 6U O }tE8}E_^U VW52VU5BE^K߅x'Ufzf665B9EtO_^UVW5R!nY6u?1955~6frF1955~06VlY_^UV1955~64YF56kY^U'(6(i[~1#]$= 6t h"_EF>"tE>\uEF>\uEUU}P~G= 6u06`6`6:x`6X@ 5`6j TYYUUh85`6XYYU4F>">\fh45`6XYYF>\uh05`6XYY`6`6:xP`6X@Z5`6PQTYY뇡`6`6:xP`6X@Z]5`6PTYYGh(5`6WYY%>'~"iE}P~H= 6u06`6`6:x`6X@ 5`6j SYYEh 5`6}WYYEF>'tE>\uEF>\uEUU}P~G= 6u06`6`6:x`6X@ 5`6j SYYUUh5`6VYYU4F>'>\fh5`6VYYF>\uh5`6VYY`6`6:xP`6X@Z5`6PvRYY뇡`6`6:xP`6X@Z]5`6P9RYYGh5`6VYYJVWYEE}P~G= 6u06`6`6:x`6X@ 5`6j QYYUU`6`6:x`6X@"5`6j"QYY`6`6:xP`6X@Z5`6PTQYYF>uh 5`68UYYdE}P~H= 6u06`6`6:x`6X@ 5`6j PYYEh5`6TYYGT= 6u06h5`6TYYu+JY= 6u065,6h 5`6wT 9=5;6z64h 5`6@T 5zEU 5QQ64>"h 5`6SYYF>"t>\u5~\uh 5`6SYYFPh 5`6S F뼡`6`6:xP`6X@Z5`6P}OYYh 5`6eSYY>'~"uh 5`6?SYY~\~\uh 5`6SYYFPh 5`6R F>'t:`6`6:xP`6X@Z5`6PNYY`6`6:x`6X@'?5`6j'NYY.FPh 5`6pR Vh 5`6ZR E= 6u06h 5`60RYYG= 6u06h 5`6RYY_^U=6u"=6u06h5T6QYYUVW=5=\65T66E= 5JxGGSXWLYE==6u 065/55h/VDQ} u06JxUFF VuMYYUU=6u 065/55h/VPJxUFF VuLYY66E= u06Jx FF Vj LYYE JxGGSXWJYE=t4} u06JxUFF Vu/LYYUU릃} t#06Jx FF Vj KYY=6u"5860606BRh/VO_^UVW5P6GYh546-NYYP6u 546XYP6P6:xP6X@ 5P6IY=5T6} u06Jx FF VW'KYYP6P6:xP6X@ 5P6IY=t- u06Jx FF VWJYY}뛃} t#06Jx FF Vj JYY=6u"5860606BRh/VkN_^UVW55CY5 6t >VCY_^UVW55CY56t >VCY_^UVW55CY55t >VwCY_^U696|(6R56;BYY6uKE666UVW5\6=6u&JxFFSXVGYE=u5=5t55BY566=5t =6et5=5t 55BYe6RX@Y5uv15E5} u56|G9=6+6d6P55AYY5uJxFFSXVFYE={5 656_^U VW=5u1I55> tF+5BRh?YDžu艦55}FUE= u_^UVW5UNj6+5U56>*u~/uV6WAY-> u%=5uuWu@ 56F_^UV=5u=5u 56z=5u o56WFT56%T~*u56 56.~/u/=5u 56 56  Y^UV6U66262tAs V@YVJY 0 r_t .t$uV(Y66j Yh56aKYYth56KKYYuj?h56.KYYuj"h56KYYujh56JYYujh56JYYth56JYYujh56JYYujh56JYYuj{hx56jJYYKj Z6{ujH%t\uj:uj(0uj2uju5555+YYX^UVW5`6"ǃuH"t565555 06hV'HYY66ǃ uhVHYYEJx FF VWCYY"uJx FF Vj CYY6_^U(VW5d6E5UkE6+5‰U6: u=5uuuu賤 =6u5/55h/V-G66_Jx FF Vj BYYEa=5uuuu8 5UE܋6+5J‰U؉}Jx FF VWBYY66NjJx FF VWhBYY9}uEu;Y uuuu] \u66NjJx FF VWBYY hg=5Vuuu @Jx FF VWAYYE6ǃ/Jx FF* Vj*AYY66= t9*uz/uhVIEYYˋJx FFVW.AYYhVEYY*5UE܋6+5J‰U؋Jx FF* Vj*@YY666NjJx FF VW@YY*u<6:/u1Jx FF/ Vj/q@YY6u9Y- u=5{uuu eE6:}u4}tJx FF Vj ?YY6up9Y5Jx FF VW?YYES_^U$VW5UmE6+5‰U=6t6R:Y6=6u5/55h/5d64Ch5d6!CYY=6thp5h6CYYE66ơd6d6:xd6X@5d6V>YY=6yh6h6:xh6X@R5h6V>YY?=5euuu OEGM>hd5d6+BYYu7Y5UNj6+5JU܉u66ơd6d6:xd6X@5d6V=YY=6t2h6h6:xh6X@5h6V=YY9uu W6Yk uuWu \U66ơd6d6:xd6X@5d6V=YY=6t2h6h6:xh6X@5h6V<YY 5=5uWuϝ 6ƃ/ud6d6:xd6X@*5d6j*_<YY=6t2h6h6:xh6X@*5h6j*$<YY66= *u5z/u/h`5d6?YY=6th\5h6?YY맡d6d6:xd6X@5d6V;YY=6hh6h6:xh6X@A5h6VW;YY.hX5d6$u9~$u3F-0= s#-0= sG?u1_^UV662u_t .t$uVY66jgY56Yt 56Y56Y^UVW16lj0 s"k 0Ƌ66ԉ_^UVW5UE6+5‰U6aƃu臒2u_t$tuuu菕 6VY662u܃_t׃.t҃$tjNYƃu >tuuu# 6E69U}3U 6456_8YYuU 6E‹696|G6=6t6R56 +YY6R)Y6u 56)YDžu56W7YY6 6<6u+Y_^UVWE}t6ǃuB_^U6,6R`&Y6u~66B6B6B 5d6R&Y6u66B6B6R%Y|6uی|6f|6fB|6fB56%Y6u螌66B6BU6,6P56>&YY6uNU6d6P56 &YY6u6R5|6%YY|6u5656%YY6u֋UVWƃ%uF6U,Vu5555蜍 Y@2u)_t$.t_t565555R ǃ=6uu wY=65U)ƃuO:t565555 uW YY6_^UVu~u u %YF695|U5 645 |6fQ65^UV=6^5 6z tI6J֋6<tNB 6<tB 56 I 9J t6696|f6 665^UVW656h56B/ 56YNj6z=65 6R W G6696}66փ>Vt5695|5J 6565J 6<5J |65|6fQfX5J |6fQ5J6 6 55J6_^U VW5U6ǃ't"u [ǃ:uuV]YY6>=6tP66696~t6J 64_^U4VW5P65UE܋6+5‰U؀=6t65Rh|V, =6u5/55h/V,6:=u6E6JUU 6<tEME6ǃ$z<5U,EЋ6+5‰U6YE6߃$u"uhpV, 6u!Y뀉0 s@E9E} uu{YYU+UuRh`V+uE!Y6-uK6B-0= s56p+EEuuhPVr+u Yuuu }6z$uS=6t15 6R UuuhDV + h<V*YY6q6B-0= 6E=6n}~9E} uYU6+UJ 6R UuU6+UJru蟋YYU+UuRh,VQ*U9U~u55ՊYYU+URh V* 6z-u=6E=6t PYYU+URhV) S2u _t$uIJx FF VW%YY662uƃ_t$tJx FF VW[%YY6=5uuu葉 }hV)YYEM}{hV(YYl5UEЋ6+5J‰Ủ}졬66NjJx FF VW$YY9}uuY uuuu蓅 \u66NjJx FF VW<$YY o=5]uuu5 G6ǃ/Jx FF* Vj*#YY66= t9*uz/uhV'YYˋJx FFVW#YYhVu'YY$*5U4EЋ6+5J‰ŰJx FF* Vj*+#YY666NjJx FF VW"YY*u<6:/u1Jx FF/ Vj/"YY6uEY6 u=5{uuuy e5_^UVW6Bƃ%t\u6V=u 6pt Py6B=rt R]6B=etEuE6B=ctCu-6B2u_t.t$t 6565555K P2u_t .t$u -'t"u 565555 5 |6Q=tQ_9tW5 |6f_fQ65O 1_^UVƃ2u_t.t$t 't"uǃ{t=u]붃|u&5J 6j4KYY6닃%uy565555 Xi^UV=6t(1956~64YF56Y^U VW6 56tv%Y@6v563Y6uQ~h565%YY6hR%YY=6 56t-}VUEEGuvYUVv_^UV6zu6rY56t~u vYFv^UVW556U}t 5Uzu5URUڋ555+555RY6u}5RYp6u|5RYt6u|55Yx6u|5RYDžu|55BU6U}t6UzuBuWVZYUAM]URUľ955~fBF5B6fB5UF955~! 69 tEfBE֋6fBE5B955~" 69 tEfBEFE955kBE=QUAMU}~,UJ p6Q9E}UJ]p6fQfXM΋EU p6fQF뉋WB=u WfBEE955eB=NU9U}4U p6Q9Eu"EU9U}U p6Q9EtEċEfBEF돋6 6p6ft6fx6955~L 6R p6fRfq t6fRfq x6RF묋5 665 p6fQ5 t6fQx65F955_BE 6RMp6fRfKMt6fRfK x6MRFWY_^UVW6RY5uy5RY6ux5BRY5ux5R5|6YY|6ux5556uYY6ux5f6 5fRfQ5fB5fB6f6fB56fB5f5fB5fB9=56 6fRfy5fzEE6<tC 5fRfq6zu 6BE6Z]F뱉ډ5frF|6z=uEfzE6G,5fz56Y56Y_^UVW5l6=(6:E9=5"J 6Qy9t[t hVYY6z64QhV6z64tY@E[RhV UUMxJx FF Vj |YY܋Jx FF| Vj|]YYU 5Qx Q64hV. EEJx FF Vj YYG_^Uh/;YB+;(bUVW5T6EUMׅU06Et#JxUFF VubYYGӋJx FF Vj BYYE_^UVWuFEtk]!_^UVjl YƅutFuY@PC YF~uatF fFfFfFFF~u5tuvYY^UVW57uYƉ6r56_^UVWh Y7us1}7Gh+YfFF5656V57h*YZ_^U57/Y7UVW56t~V Y_^UV=(65R YH5urhL+5l62YY1955~ V}YF5H5 Y6t\=6u =6t 5555h(+5l6555Rh+5l6^UVWhd+5l6YY9=56 z6z64h\+5l6G 5z5x$64hX+5l6  ՉRhP+5l6 G\_^UVh,5l6YY19556 ru6 rVh+5l6 6r=uh+5l6gYY)6r=~rPh+5l6= 6 rt 6 rth+5l6YY6r=uh+5l6YY)6r=~rPh+5l6 h|+5l6YYF^UVuth,5l6YY6 ru6 rtV-YVh,5l6R VYV_YVY^U VWU 64~ F9t+FFE~ u EE~ 69Eu)u%F-Puh,5l6d}u.6F-4PuuhT,5l6k06F-M4PQuh,5l696_^UVWU 5<G EEU9UUOQ5ƉEx؉E6B64h,5l6 U 5Q59uv$64h,5l6r סl6l6:xl6X@.5l6j.>YYx$64h,5l6 -Ph,5l6 E_^UVWEU 6U}Uz Uz t Uz UBNj5z@B 5Q9|19u~H5r9}F9uuEH5frKH5r9t=EUJU9u~UJ H5]H5fQfXM܉H5frEU!19}~;H5zƉ 6q 6R4h,5l6Gh,5l6YY_^U VW69Euh,5l6jYYU 6F9E t5F-E~ u#^6u4h -5l66봃} ~U Rh-5l6 _^UVWl6l6:xl6X@ 5l6j YYU 54VU1F9~AUzE5B]956u4h<-5l6.G_^U(VWU ЙEE EEUUE}9}UUu9uYMEt.}UU9uv'E؋]0EZ E؉U΋UUUE} r EEUg_^UVWu uYYU ЙEE EE1u9uv$ G r1U_^U VWUU UR=YDžu1u9v _^UV53Nx 7^U=3t3upYUVW.Ut}u16EEׅt%u>tG9uF>uր?=uэG1_^UVP5U9P5wUP59P5v3 16VLYt1'P5rF5P5&Y5P5^UVW}u1E}UUs3 1=L5u8jY=u1V!փ5L55P5FE5T5OVU}9}r69v2W9UvUW~>}t ET5u6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=T5<9}r79}u+UOJ}t ET5URU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15T5t 9ur6E0tU UT5tU9ru NJEtU9Wu RWE_^UVu~  u36EPYEU UEPEPV yE^UUAs UEU$UUEPjjg y U41UVW544}׃}~9r }y 9vWYu_^UVWuU VVu- YYDžt~~yVډ3F_^U$UUU UUUE@EPjGj U} v3M E 1U} v3M ҋE!1UE1UE1U} v3M Et1UVW11}U9D4u D4F߃| jugYtUrV YtURtUzt rY}3t}4t},4t uY_^UVWuEu41}%uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }3n~y UVu CV€tu ,fNV~4u>54Yt.hYFu NLNHF 9hYFuN!NF V@uVVVhUFt$jjv* =uN ?jEPv  =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11tFN>Xu E0EEF>t&azju YYyEG߸-_^U(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V5x555hl5jKj ^Uu hT$u} U$EPu YYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U - }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE- uVuukƀ}Xu9utUPwYUE_^U4VWuEEEE }%MJxUʋFF Vu(YY=u}t UډE1!,'"U-!EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U.AJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE.UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE8.1E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPtYY=u}t UډJxUʋFF Vu,YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuiYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUh.h,4YYjVYUVuYƋU rU MJwU uR5YY^U$U UEPuYYEPj!j U$EPjji U$UUU UUUEPj6j? U$} uEEUUE UEPjJj y}tUEEË+C;Cw Ë[ uӅu P-KI|;u[u P31ۇ4tPXP%s: f - %s %s: f - out of space %s: f - cannot open "%s" %s: e - line %d of "%s", unexpected end-of-file %s: e - line %d of "%s", syntax error %s: e - line %d of "%s", unmatched /* %s: e - line %d of "%s", unterminated string %s: e - line %d of "%s", unmatched %%{ %s: e - line %d of "%s", unterminated %%union declaration %s: e - line %d of "%s", too many %%union declarations %s: e - line %d of "%s", illegal tag %s: e - line %d of "%s", illegal character %s: e - line %d of "%s", illegal use of reserved symbol %s %s: e - line %d of "%s", the start symbol %s cannot be declared to be a token %s: w - line %d of "%s", the type of %s has been redeclared %s: w - line %d of "%s", the precedence of %s has been redeclared %s: w - line %d of "%s", the value of %s has been redeclared %s: e - line %d of "%s", the start symbol %s is a token %s: w - line %d of "%s", the start symbol has been redeclared %s: e - line %d of "%s", no grammar has been specified %s: e - line %d of "%s", a token appears on the lhs of a production %s: w - line %d of "%s", conflicting %%prec specifiers %s: e - line %d of "%s", unterminated action %s: w - line %d of "%s", $%d references beyond the end of the current rule %s: e - line %d of "%s", illegal $-name %s: e - line %d of "%s", $$ is untyped %s: e - line %d of "%s", $%d (%s) is untyped %s: e - line %d of "%s", $%d is untyped %s: w - line %d of "%s", the default action assigns an undefined value to $$ %s: e - the start symbol %s is undefined %s: w - the symbol %s is undefined too many gotostoo many states %s . %s%s :%4d state %d, number = %d, accessing symbol = %s ritem[%d] = %d rrhs[%d] = %d %d shift %d, number = %d, nshifts = %d yyaccyacc.XXXXXXXusage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename m' &-&b&d'l'p 'rR't['vd'''d'l'r't'v'.output.tab.h.code.c.tab.c/tmpTMPDIRwwwwwwwr%s: %d rules never reduced %s: 1 rule never reduced . %d reduce/reduce conflicts1 reduce/reduce conflict, %d shift/reduce conflicts1 shift/reduce conflict%s: #define YYPREFIX "%s" #define yyrule %srule #define yyname %sname #define yycheck %scheck #define yytable %stable #define yygindex %sgindex #define yyrindex %srindex #define yysindex %ssindex #define yydgoto %sdgoto #define yydefred %sdefred #define yylen %slen #define yylhs %slhs #define yyvsp %svsp #define yyvs %svs #define yyssp %sssp #define yyss %sss #define yyerrflag %serrflag #define yynerrs %snerrs #define yydebug %sdebug #define yylval %slval #define yyval %sval #define yychar %schar #define yyerror %serror #define yylex %slex #define yyparse %sparse yy }; %5d,short %slen[] = {%42d, }; %5d,short %slhs[] = {%42d, }; %5d,short %sdefred[] = {%39d, }; %5d,short %sdgoto[] = {%40d,maximum table size exceeded }; %5d, }; short %sgindex[] = {%39d,%5d, }; short %srindex[] = {%39d,%5d,short %ssindex[] = {%39d, }; %5d,short %stable[] = {%40d,#define YYTABLESIZE %d }; %5d,short %scheck[] = {%40d, YYSTYPE; extern YYSTYPE %slval; r#define YYERRCODE %d %d %d #define #define r}; #endif ", %s '%c' '\\%c '\\\\ '\"'\"\\%c\\\\ \""%s :char *%srule[] = { }; 0,",'",\\\\"'"'\"'",\"",\\\\"\"#if YYDEBUG char *%sname[] = {end-of-file#define YYMAXTOKEN %d #ifndef YYDEBUG #define YYDEBUG %d #endif #ifndef YYDEBUG #define YYDEBUG %d #endif #define YYFINAL %d #ifndef YYSTYPE typedef int YYSTYPE; #endif rz_ ._ _ ._ ._ ._ ._,._/>_;._\1_identunionstartbinarynonassocrightlefttypetermtoken" #ident "=f c"Jc%e'Jc/Md\e*/* g g"h'h/}i{g}g*/ */ * * YYSTYPE; typedef uniontypedef union!o m0m1m2m3m4m5m6m7manbnfnnnrotovoxsnJpop6pp@pp,p$end$accept.v vvvvwvvvvvy yyyy$$%d} Ҁ"8'8/;{}*/ * break; break; yyvsp[%d]yyvsp[%d]yyvsp[%d].%syyvalyyval.%syyvsp[%d].%syyvsp[%d].%syyval.%scase %d: $end$accept %s%4d %4d %s : #define YYRECOVERING (yyerrflag!=0)#define yyerrok (yyerrflag=0)#define yyclearin (yychar=(-1))#define YYMINOR 9#define YYMAJOR 1#define YYBYACC 1#endifstatic char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";#ifndef lint#endifextern char *yyrule[];extern char *yyname[];#if YYDEBUGextern short yycheck[];extern short yytable[];extern short yygindex[];extern short yyrindex[];extern short yysindex[];extern short yydgoto[];extern short yydefred[];extern short yylen[];extern short yylhs[];#define yystacksize YYSTACKSIZEYYSTYPE yyvs[YYSTACKSIZE];short yyss[YYSTACKSIZE];YYSTYPE yylval;YYSTYPE yyval;YYSTYPE *yyvsp;short *yyssp;int yychar;int yyerrflag;int yynerrs;int yydebug;#endif#endif#define YYMAXDEPTH 500#define YYSTACKSIZE 500#else#define YYSTACKSIZE YYMAXDEPTH#ifdef YYMAXDEPTH#else#define YYMAXDEPTH YYSTACKSIZE#undef YYMAXDEPTH#ifdef YYSTACKSIZE { switch (yyn) yyval = yyvsp[1-yym]; yym = yylen[yyn];#endif YYPREFIX, yystate, yyn, yyrule[yyn]); printf("%sdebug: state %d, reducing by rule %d (%s)\n", if (yydebug)#if YYDEBUGyyreduce: } goto yyloop; yychar = (-1);#endif } YYPREFIX, yystate, yychar, yys); printf("%sdebug: state %d, error recovery discards token %d (%s)\n", if (!yys) yys = "illegal-symbol"; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; yys = 0; { if (yydebug)#if YYDEBUG if (yychar == 0) goto yyabort; { else } } } --yyvsp; --yyssp; if (yyssp <= yyss) goto yyabort;#endif YYPREFIX, *yyssp); printf("%sdebug: error recovery discarding state %d\n", if (yydebug)#if YYDEBUG { else } goto yyloop; *++yyvsp = yylval; *++yyssp = yystate = yytable[yyn]; } goto yyoverflow; { if (yyssp >= yyss + yystacksize - 1)#endif to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); printf("%sdebug: state %d, error recovery shifting\ if (yydebug)#if YYDEBUG { yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && { for (;;) yyerrflag = 3; { if (yyerrflag < 3)yyinrecovery: ++yynerrs;yyerrlab:#endif goto yyerrlab;#ifdef lint yyerror("syntax error");yynewerror:#endif goto yynewerror;#ifdef lint if (yyerrflag) goto yyinrecovery; } goto yyreduce; yyn = yytable[yyn]; { yyn <= YYTABLESIZE && yycheck[yyn] == yychar) if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && } goto yyloop; if (yyerrflag > 0) --yyerrflag; yychar = (-1); *++yyvsp = yylval; *++yyssp = yystate = yytable[yyn]; } goto yyoverflow; { if (yyssp >= yyss + yystacksize - 1)#endif YYPREFIX, yystate, yytable[yyn]); printf("%sdebug: state %d, shifting to state %d\n", if (yydebug)#if YYDEBUG { yyn <= YYTABLESIZE && yycheck[yyn] == yychar) if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && }#endif } YYPREFIX, yystate, yychar, yys); printf("%sdebug: state %d, reading %d (%s)\n", if (!yys) yys = "illegal-symbol"; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; yys = 0; { if (yydebug)#if YYDEBUG if ((yychar = yylex()) < 0) yychar = 0; { if (yychar < 0) if (yyn = yydefred[yystate]) goto yyreduce;yyloop: *yyssp = yystate = 0; yyvsp = yyvs; yyssp = yyss; yychar = (-1); yyerrflag = 0; yynerrs = 0;#endif } yydebug = yyn - '0'; if (yyn >= '0' && yyn <= '9') yyn = *yys; { if (yys = getenv("YYDEBUG")) extern char *getenv(); register char *yys;#if YYDEBUG register int yym, yyn, yystate;{yyparse()int#define YYERROR goto yyerrlab#define YYACCEPT goto yyaccept#define YYREJECT goto yyabort#define YYABORT goto yyabort} return (0);yyaccept: return (1);yyabort: yyerror("yacc stack overflow");yyoverflow: goto yyloop; *++yyvsp = yyval; *++yyssp = yystate; } goto yyoverflow; { if (yyssp >= yyss + yystacksize - 1)#endifto state %d\n", YYPREFIX, *yyssp, yystate); printf("%sdebug: after reduction, shifting from state %d \ if (yydebug)#if YYDEBUG yystate = yydgoto[yym]; else yystate = yytable[yyn]; yyn <= YYTABLESIZE && yycheck[yyn] == yystate) if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && } goto yyloop; if (yychar == 0) goto yyaccept; }#endif } YYPREFIX, YYFINAL, yychar, yys); printf("%sdebug: state %d, reading %d (%s)\n", if (!yys) yys = "illegal-symbol"; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; yys = 0; { if (yydebug)#if YYDEBUG if ((yychar = yylex()) < 0) yychar = 0; { if (yychar < 0) *++yyvsp = yyval; *++yyssp = YYFINAL; yystate = YYFINAL;#endif state %d\n", YYPREFIX, YYFINAL); printf("%sdebug: after reduction, shifting from state 0 to\ if (yydebug)#if YYDEBUG { if (yystate == 0 && yym == 0) yym = yylhs[yyn]; yyvsp -= yym; yystate = *yyssp; yyssp -= yym; }errorerror%d grammar rules, %d states %d terminals, %d nonterminals (%d) %s %s : Rules never reduced: . %d reduce/reduce conflicts1 reduce/reduce conflict, %d shift/reduce conflicts1 shift/reduce conflictState %d contains state %d %d: reduce/reduce conflict (reduce %d, reduce %d) on %s %d: shift/reduce conflict (shift %d, reduce %d) on %s %d: shift/reduce conflict (accept, reduce %d) on $end (%d) %s%s %s : %s : . (%d) $end accept %s shift %d . reduce %d %s reduce %d . error %s goto %d arרwR+3b)/i @BfXOb4dFiFo=pOuFxO? 0#5++-&0:1Lhl7EͳGX#b#cdaeͳfͳgiano#p#rsݲu#x#(null)cannot print floating point 5 #line %d "%s" \T@,tX< dP0(|p`P@0$$$$$$$\$P$8$$$######|#x#d#P#<#8#$##""""""l"`"H"<"$"!!|!D!8!0!(! @  lP8 phL4,xhX@8  p`T4xd<(|pP|`PD<0(|L|th\Hx*****t*l*`*H**)))))h)\)()))(((`( (''''''x'<''&&&&&P&$&&%%%%%%%t%P%D%4%(%%% ((((( AAAAAABBBBBB SSSSB34,47  @1$T$Lsu;SSSSu QRP PrUVW}uU BVYljBj VWZYZWVj\ =uj Y_^UV5 Nx $^U=tuY3RU$UUEPjjS U$UUUUU UEPjj' UW}0ʀuA)_]UVWuU VVuUYYDžt~~yVډF_^USE] ![]USE] ![]USE] ![] ySSSS  XOl X1$T$LOOsu;SSSSuNN QRPL PPUVW=dtd=`tkKaƅujw5NYYhlKYVhzQYYEy#j|5NYYuhTKYYI>u VYg9=XuVIYV2YL~tjh0vh5NV4YVYU R@EK-Ru5&jhM OYY=uhJYj~OYEPhSOYY=uOUTf\fUEEPhF@OYY=u5OhJYY[OjhXhvN t"h5NFYYh|GJYL`38G-R_Dj,ytW&Uu uhI Uh IYj%jMYUu uYYuh IYYUu uYYuuuh8IU5OuhTnI jNYUufNYy=OtuYuhh2IYYU$Vu\% EfEލEPVMYYy=Ot9VnY0U u E]9tRVMYyVHYYy hYfUf\E}sEuOS&YYE_^UURGYUhVWE5Eth9UEj]S0F Et)j,5NYYEu0hB UJNhUVdPZYEVhUЋTUEEPvdHYYEyuhPBYYEPvdGYYyjD5NYYh<AY}uvhvdhA U9Vht#jR5NYYuhAYYU܉UE}~MEEGUJAh)]h2UhYhy\h]hTuQ F FVpY\E\ED_^UlVWu~ thjo5N U V VpUE1U U}C}t=UR R QMURMTUUGURU븃fu 3YE F E1U U}C}t=UR R QMURMTUUGURU븃|hh5N" }<}hh5N uURUEUE}UUEVhUTUEEPvdTEYYE=EPvdLEYYEy"h5NFYYhG?YLuU9Vht EP YEUuh`h5N4 UtP9uuhHh5N UEPR 4JUUMRhXQYMEPvdDYYEy"h5NYYh$>Y}uU9u T9Uthh5N Uthh5N Ut-EP8P IuVhPV UjU R IJ MUuVl€t,EPP HuVhFXPU v .YF _^U VW}th8h5N w-:YE5h9U}W9Vhu9Vdt E\ۋh9Uu)h5N~YYw7hz< }#WUuhh5Nu UtVYUt wV'YY_^UPVW}E WhU܋TUU UEPwdAYYƃ[EPwdAYYƅthh5N }tjhuh 5NEPY댅thh#5N EPwdAAYYƅthh&5Nl }th`h'5NN UօthTh*5N* }t EPY1_^UPVW}1U tU @tU €tEWhU܋TUuEPwdb@YYE=aEPwdZ@YYy"hV5NWYYh\X:Y]}tjh8uhY5NEPY}y}y&h_5NYYuh$9YYEPwd?YYy"hb5NYYh9Y}thhd5N U9Wht"hg5NxYYhy9Y~U Wl_^U VW}w G 5V IJ MUuWl€tV+YPVWiM V*YWLY_^UVWu~Fu jW- EWR*Yu uVM &VY_^UdVWu`thh5N ~thxh5N UhK(YEEE}G}tAUR R QM]ˋUMMRQEURU믃}thlh5N EVhU؋TU܋UUUUEPvd=YYE=EPvdw=YYEy"h5NqYYhXr7YwU9Wht EP,YNjUuh(h5Na Ut*EPP B}WhGXPO U99uhh5N EP8P /B}WhP:O }y"h5NYYh6YEPvdV<YYEy"h5NPYYhQ6YV}uU9u T9Uthh5NF Ut!UjhpRh5NAUt-uju* EuH'YuuVJ UV Ut*EPP @uVhFXP N  @_^UVW} 9Uth4h5Nn 8~thh5NH V9Whthh5N( Vuhh 5N fvWYY_^UVW} WX9Uthh5N ~thh5N V9Whth|h5N Vuh\h5Ng fWY_^UVW159=h~UR9Vht G\9=hhh05N _^UVe1},k,eOk,Oek,ǃOF^UV5euh j&5N V$eF$~(th j*5Nr F(^UVueV$5e~(th$ j45N5 F(^UU VWu=t0~u%jjv DžVY1jjhz VYEEVBY1EEVYDžt th h5Nh 1u@EE}VYDžtth h5N$ 1u@EEF8h5NYYv6hp 1 D F&=}t jWVP }tVMY_^UV}x}@rh h5N kE<Ɓeth h5N[ U VUV UVUVUVU VU$V ^UVWURUx}@v kE5N UEEU UrvVYYUrvVYYURUUvC-e<jjjPDžth hV5N 1uvVYY4h^5NYYh -YUp B9t-t%Wh z-YYh hc5N uU _^U VWUR UEEUr[Yƅuh hv5N* uujF(Pv$VǃtuujF0Pv,VyǃtduujF8Pv4VSgijklmnopqrstuvwxyz{|}~ǃtAh5NsYYUM]Ejjr qs0h< Y,\_^U VW1u jU9V Wu4UMurQ YYEth h5N! 1+V$W$VY$uE8 v$뎸_^UVW}yjh Wh5N@rj@h Wh5Nk<Ɓeuuh h5Nx _^U4VWuV UEVU}t}GCUWU W W60YYE=u(}t"=tt tr$5t5t5}t"h5NYYh *Y}tV^Y_^U0VWkE<Ɓe}t$V(UEE@4V8UEEUuh h5NR }UEU}uh h 5N UR$UU Ujuu U#U؋U U!}tuuu }th h5N 10M JMԋuEPur E܅y1E_^U,VWkE<Ɓe}t$V(UEE@,V0UEEUuh@ hB5N }Uuh< hG5N EUUR$UU UjuuC U#U؋U U!}tuuuG }th8 hV5Ni 1M JMԋQr uJ _^UVut-uv$uuh h5N ~Cth h5N V6 +YYEt&h5N.YYuh ,%YY0uv$uYGt?uh h5N Cth h5N W7*YYEt&h5NYYuh $YYWLY1_^UVW)ƅt0VU>uhP P$YYt9w hL <$YhH +$Y_^UkpdPYuUVWhDY15uE9=p~P~ FuUJhCh/.hW=h15h<h*WQ# VYGdE_^U VWuFV h6h,h*RRJPF~y Fh"n8@v]SYYE=u}~&h!n v*SYYE=u}~u&Eu}s&t9wut wueYYE@V Y1h5NYYhX"Y <F-_^UVW1sЋutGr `ցukEduFU V FUV UV$~(thhh5N F<_^UVWkEdu}uh@h5N }u2U Uy FFtVY1j} th8h,5Nr }8th h-5NT j8YE죤P HJ ME3UB4E}thh85N uhh95N }vU U~uhh=5N vYFt6~t~F'juW@  tIVY@&;uu v$ *vuu uh  F}+1_^U VW}kEduyu6U UyF1lFXVYLj WYYlj=W IJ MEuhh5N URVWYhh5NW uhh5N8 uEU Uyjhuh5N3t&V2Yy&q} thh5N WtYPWu =h5NsYYvWu uh`jm LF)1_^UVWUցuuh<h5NC VUU VUzVYj YExthh5N UR IJ MFPu(VMRQjujv V$Džu-jjV jjV? 1 E (t&_^UPVW}jjjw W E؅u ju.YYE؃xth\h5N U؉R R QREP(u#YGPEP'#UUċUUUܾ!UȅutjjWA 1UtjjW% 1u #U ֋U tjjW 1 u #U fUfUP !u-u@PYfE( !uUujjW 1QU u#U ֺ#U UȋU u #U ֺ #U UȋU u#U ֺ#U UfUfUU u#U ֺ#U UȋUUU u#U ֺ#U UȋU u #U ֺ #U UȋU Ut% t E tjjW 1E #Ut #UEEu}9}oEaUO9JRRU t #Uu7UMZ9u(#U#M9tjjW 1EE@rtWEYUU܍EPGP%U Ut8 t3t. t)Et EtEtE t'tWYjjW5 1_^UUf  فfMEPYt EfEU}ZfUf  فfMEPYtE5UBfUh5N\YYh]Yb1UUMuju r Q$Ethh5NB UUMuju r Q Ethh5N UVW1ustUN9u1 G@޸_^UVWuh@v$WYYǁu(thh5N t_^U VWUցuujjV 1GU V0~(t39F8| V/Y(~(tWUWfY}F(_^UVW}w(VW(V YEGjV YYƃ~}hh,5N 5V IJ MQ U9Ushh55Ni U+UURuV%  EVYuU9W0s#w0jV  EVwYuW0UUUjVjw W$ExU9Uv EUU'jjuw W$EthhR5N E_^UhVWkEduEjju ^  jVYYƉ5V IJ MUЃt>VYuju   uV<YYƉ5V IJ Muu YYEE U+UЉUsV<Yu3YjuYYE죤P HJ MfQf  ىM9MsVYuYU܋R UU܋RUUJEU܊J Mu YfEjEPEP fEjEPEP fEjEPEP fEUjREP fEUtVYuYzXEUffUUfRfUEUM9Ju EE Ej)YE䣤P HJ MԋUEԉUԋMJUfMfJUfMfJ ŨUȋUfB #UȋMfQuju UB}uUUEjYE裤P R PuRUR IJ MԋUЃUāfQ ujVM E];thh5NX Uzthth5N7 UMJUMRQUztRUBEUU1UeE}E}uUB U$MDž }tUO9uhTh5N uh4h5Nj U9WWUUEtUO9yEt U9Wd}tE#Uu}t(u}9E tUU UU E uu W tWY<}HURU tUU UU E uu u, Et ugYEh}t uY}t uY}u,uVBYYE 1EUju r - Juh(hT5N V9Y}uh hV5N uY_^U VWUցuuhhb5N tVY~(tWUWY}F(_^UVUցuVUujjV 1?thh5N U V4VYt1^U8VWu~t \uhhh5N &thPh5N~ jv4jv V Eu&jjV VUjYEP HJ MjYEP HJ MEjuYYEP HJ MQ U؃9V4s-u YuYuYjjVs IUt-uYuYuYjjV> }tuju2 EEV4+U؉UԹMRQu EuxY!EEV4UEUUUM܈UBUfBUBUB Et U܋NJ*}uhDh5N UM܋RQ #UЃ t UfNf +}uh8h5Na UMfRfEt UfNfJ,}uh,h 5N UMfR fQUԁf  فUfJUfBUMJuYYfE΋VjREP fE΋UjREPv fEEEjEPEPW fE΋UjREP= fEU҅tUҁfU΋UfMfJ}tuuYYEUPUUUMJthh'5N thh(5N UWuPYPw\YYE=u w$}yjuV5 jv4V% _^UVW}uhhB5N8 fEE}UR R y׋Ur[}t%MjEPEP fEGNEtEN MtVWEP fEURUe}tEjEPEPg fEE_^UVWu~thho5N> thhp5N  R&E~}syuut#t9wuWYt W@V E@_^UVUցuuhPh5N舾 &jjV uh0h5NT &V9ruBjjV buhh5N &jjV 1h5N跽YYhY载 E #1^UVW}u51us)~(tV(ztURV(uYG@҃}u/1us#~(tV(URV(uYG@_^UVWu }>tVJYEVzYuF(u UW8w(W,rw,_^UVW}WU #W uUR Wthj 5N肝 U EPFPF=du5d r5^UVW=dt:5dVd>uhj75N vVYY_^UE1ۃ8ÉUkpP詣YUVW159=p~ ~GhoY159=p~ V YG_^UVWuFVjh hhfRRF ~ dF&h"n8@v )YYǁu5N kEEEPV YYƅqUUMJUMJUYjRS %UfBUMYjRS} %UfBVuYY^U Vu }x p9U|hhV5N: kEEEPVYYƅt?UUMJUYjRS %UfBVuNYY^UVWu jhV jVYYƉ5V IJ MU~%uVYYƉ5V IJ MVYE+EE=s VYuuV jW/YYlj=W IJ MWY%V@YW9YuuWuuVuOtuuWuuZuuWuuVuVMuuWui+uuWuuVuUVYWY_^UVWU ztu vYumY}su YYuPYuuYYEjYExthh5N UR R yGU JсU )Ή!։!։ҁfWUMJURju UBu yYupYuuYY_^UVW}uhh5N fEE}UR R y׋Ur[}t%MjEPEP fEGNEtEN MtVWEPF fEURUe}tjEPEP fEE_^U VW} ~E URYNjU9Wth h35NՓ =W R q֋UUJNF@UJNV譧YE=}hj]5N> jUJN VYE=tR}tIhje5N 2jk5N輊YYvhYY辊 F$GEhz+Y831549=p~[tKQ%fFYUVWuEEEEEU th(!j 5Ny 19} hV1jGF}t VE~ t ?VV뮃}t EV} VVo}t EV} VV0}t EV} VV}t `E~tLE FVV 9} }1_^UU}x p9U|h8!h5Nw iE4@0UVu5  ً ʋ  ։U}uu EEU} E}u EU} ElU} ETU} E?U} E*U} Eu EEE^U 1)" `!EUVWkEdƁƴujjjvDVTpU V`~HX9F\|6~HWVHv\WV th!j65Ov 1~Ht~HWVHWKY_^U4VW} UM]Erq K QXSuEUfRf  فfMU MfRf  +MMUUGEU؋E}u E81E1U؉U܃}gU܉R IJ MfQf  فM9Mruu܋U܋RU독uH}th!js5Okt }uh!jt5OPt uWYYƉu/WVYYƃ}t uVYYƃ}tUru؋U؋E׉=W IJ MfQf  فfMU?cUR ŰEUB tWUԋRWuîY1UkZ<]9~UjWr 1_^U(VWu} uF~}h"h5Os }h"h5Or 5V IJ MfQf  فMU MfRf  +MM=W IJ MfQf  فMU MfRf  +MMVmYUU9thh"h5Oq WDYUU9th0"h5Oxq U9Ush"h5OXq UU9Uv ~UUMM9wV}YUJ uUJ߁UfJUUMM)ىMUUU+UQRW誯 E܋WUWY}؋UUUUf  فUfJuV英YYƉ~VYUU9th!h5OGp _^UVW1E8}R?u u?U9Wu)U9Wu!U9WuU 9WuU9WutV 9W }E 뤃>FRU}tURUuYUUUUjur FUV4F UVUVUVU V_^UVWUzs1UR R q׋U9z}1t1u莫YfVf  9t1TWVj藽 %t1;~1M I I KRQlYYt1_^UVWu }uh4#hi5O*n uF>tV.YEV^YuEFHu wHUW\WLrwL?V耪YEGjVǪYYƃ~}h#h5Om 5V IJ MU9Ush"h5O[m U+UUuVʭYYƋU9W`s#w`jV EVvYuW`UUUXtuVwDWX ^jVjwDWTExU9Uv EUU'jjuwDWTEyh"h5Ol _^U(VWu >h#h5Orl ~}h#h5OTl UfRf  ?uVu ƅ,~}h#h5Ok 5V IJ MfQf  ?thP#h5Ok CUJAk<É]؋UMI09Ju EE UJ M܃MEE}E}uUB` UdMDž|}t W89UaUWUGtUO9J =#Wu}u}%Hu}}u}uVW4 @|}tuVu E0}tUzXVEtLUBu@UfRf  ًU]QVrDSX uVu }uV'Y_^U(VWu VjYE=s VY[jjV} jV蜦YYƃ~}hL$h45Oqi 5V R yU~3jjV uV:YYƉ5V R yfWf  ىM9Mvuuju裧 uYVuYu VY`WUUM9J0uWVu =uuYYtWVu W}UjVr WJWuW YYuDYE=t:}t4}t.}t}u VVYUjVr UuruYYEt x uUjVrO eUiB4E9EztjVruPH/UM9J0uWVu EU9u E"URҋE 9Uu EEUuVuuRHUzu?h,$ְYw Yh$$°YwYh $记YV"Y}UR03W MQ8uUMrjVqnu V :ojYEأP HJ MuudURjV U؉BVYYUUu؃~}hl%jk5Oa UBJ M̅jjV芠 E؋URjVu EVYju蘞YYƉ5V IJ Mu-YE؋UH I Hũ RQ膱 U؉VU؋MԉJỦUEEЙUUMR5QUfBUz7tUJ@UfJUMR6QEU ME}} E!U9Uv EUzuE}tVěYEuVkYYƉ5V IJ M}t=UЃ5N I KRQYYEȅtV\YEUJMU @ #Uf  فUfJUJ@UfJUBt MR8Q Wth0%h5O] URUUMR QUMJ FLuwL}WhGTP WPrwP1?}ujVuWWHE$ucYEU9W0T>th%h5OI] FLuwL}WhGTP脿 WPrwP1U3W0W8u'W8 W019Uu@EPVuWWHE+4Й]SuuPEȅLU9W0u2FLuwL}WhGTP WPrwPjVuWWHEV讗YE_^UUfB u uj. %UfB UHVWE 0E EjVYYƃ~}h&hK5O[ 5V R yUVcYE9E|h&hQ5O[ W@tUjVr 1fWf  +MMU+UU+MMUQRV EЉűUUURjuݙ uQYu躔YE̋UЉPỦUЉR IJ MWufWf  ٻE%f  فUfJUUE}6uV:YYƉ5V R y׋U9V}hl&hs5OY 5V R QUċUЉR R QUEU9UE!UJMU %ӮUU9U}hL&h5O[Y UUUt%UU؋UIMtEEċU EUUĉUdUtUEEU؉UUESZ!ЋUUUf  فUfJUЋMJ>th0&h5OuX V :th&h5OUX W fWUUf  فfOUJ@th%h5OW uWYYUU9U| uumYYUЋE _^UUMjju rDQPt"h5ONWYYh&OYTWU U(VW E܋U U1U؋U 1U؋U1U؋UUUցU 9u~U 9Vu2VN UMVFP-EPV}U 9VuDVNUMFPFPVFPEPVҫ}]U 9VuSVNUMFPFP褫FPFP蒫VFP胫EPVt}1twEE} WU 3W}u}UR9WW  ً ʋ  ыUR Ë ڋ 9v?}:#WM#Y9t Qt}UR9Wt U9Wu}E}u1AFPFPFPFPVFPU UVE_^UVu uZYYƅtU9V ~ VE1^U$VW1.Ei]4]U3S0S8t +} t=| 5tU9uU 9VuU9Vtv$t U9Vtv(V pU9V d9V cU$9VW}t UU܉VFU܉VU9thP'h5OsS }(tE(01Lv,tt/U9th4'h%5O6S VYF E} RV F~tU9V}VhYF (V u~tu W9V}E0뤃} }*uh$'hO5OR W YG U WUWUW}t UU܉WGU܉WUW UG U$W} tO EU}MEU9u2UM 9Ju'M9Ju}t MR$Q$UR$UUUR$U멋UUEUU}t8UM9Ju}t MR(Q(UR(UUUUR(U‹UW,}WWYEUP(UURYEP$UU9UtUMrqxYY}(tE(81_^UVWʗE1 mV [U 9VO~tU9V|Ajjjhuu vvu5$Ethl'h5OP G0_^UVu u-YYƅtAjjjhuvuu u$Eth|'h5O%P ^UVWu uYYƅU9VV t U 9VuD|jjjhjE}}+E}}UMT,EEkhhhhIhhWR] VYG,o_^UVW}|Gh-hh RRʻG  y GRh"n8@w ݾYYE=uO}+!gh!n w 訾YYE=uO}gGiƁƜ~th4)h5 OND fFWVfFF FFF$F(F,F0V0V4V0V8V0VYYu1*#&jjV 1 *E ܍_^UPVWujjjvV$E؅u ju)uYYE؃xth+h5 O7 U؉R IJ MFPEP uEP#UUUUUܿ!Uą}t &jjV urY1Ut &jjV urY1u #U ׋U0t &jjV u`rY10u0#U fUfU\0!0u--@PYfE40! u(Uu &jjV uqY18U u #U ׺#U UċUUVt&}uH&jjV uqY1Euh+hZ5 O6 EU u"#U ׺#U UfUfUWt(UuG&jjV9 uqY1VEuh|+ht5 O5 fEU U܋U U0EE̜-}(9uE̋qŰN9JbRU0PUMZ9uA#U#M9u #Uu &jjVS upY1pEE@bEPFPUt,0 t 0#U0uEtEt&uoY&jjV 1_^U8VWujjjvV$Eu ju%qYYExth+h5 O3 UR IJ MV UEU#UU؋UUԺ#UUUU܅Ut&jjV 1SU Uu#U U#U U܋U Uu#U U#U U܋U Uu#U U#U U&~,u u]nY&jjVz 1U Uu#U U#U U܋U UUEPF PUt&Ut&~,t&UtV,׹@ V,׹# Ut &umY&jjV 1_^UUf  فfMEPYt EfE(U}ZfUf  فfMEPBYtE5UBfUh>5 O1YYh,{Y11UVW1E-(s$EtUMZ9u1EFE@׋5piǁǜPs tUO9u1F۸_^U}uhL,hc5 O0 UMuju rQ(UUMuju rQ$EthT,hq5 OI0 UVW}w,fWfVWRVGt fWfVfFGtWV F VeYWV ~F$F(Fdž_^U VW=piƁƜPJ>uF$F5~u$>v9F,~t jVHYY G1_^U VWUuhd,h5 O"/ }uh\,h5 O/ =piƁƜP\>JUN9u>U 9Vu6UN9u*U9V u"~t#VUt jVGYY G1_^UVWuNh v ݷYYǁuN(thl,h5 O>. fVt_^U(VWURUUR U܋U fRfUڋU ffUU؅ufEEE1pUiEƁƜ}PU9Vu-UN9u!UN9uU9V u ~t^U9VEVtUN9EVtUN9jE~ tU9V UEU9UE}t~u9}u"~u}tUN0+J0uuU B tUUE}U B t#EPuEPust1aEp9U}tU9Vt Eۅuh -ho5 O5, ~th,hp5 O, fUfVUVfUfVU܉V ~th,hv5 O+ }Uzth,h|5 O+ uE~WUt $t9z,th,h5 Or+ Uzt juDYYUR0W0UO,9J,~R,W,uh|,h5 O#+ _^UVWpUiEƁƜ}Pt^U9VRU N9B~(t<~t5Gt UN9u GtU9V u t E1_^UVuuh-h5 OS* ~ 5n t*~ 3n@t!~ 2n@th,-h5 O * &ju V ^UVu€uh-h5 O) &ju VP ^UVuuh-h5 O) &ju V ^UVWUׁǜ-uhl.h5 O_) ujjW 1w,~ujW 1 tjjW 1G0U W4V<9V4uV49uV|AYu*VTYhh.rYh.h 5 O( ~th-h 5 O( FVs>YNjV-YY€u1_^UVWUցƜ-uh.h#5 O,( ujjV[ 1U~,F8U V<th.h05 O' GjW=*YYOu1_^UVWuuhp/hG5 O' uhP/hH5 Oq' ~ 3n@t!~ 2n@th/hJ5 OG' ~,uh.hN5 O(' $uh.hO5 O ' u6U9wth.hT5 O& F,G EG$uV8YY_^UVWUׁǜ-uh/hm5 Oy& th/ho5 OY& ',uw,9~th/hv5 O,& F~$thx/hy5 O& V&>Y~uFdžV<9V4u jV>YY_^U VWUցƜ-uh0h5 O% ~,x€uh0h5 Ow% &~0tjv0V GjjV 5uh0h5 O&% &~8tjv8VP jjV> uh0h5 O$ &jjV jjV- $uht0h5 O$ G$GF,jW=YYjjV MjjV >0F yh5 O#YYh\0mY$ D0E fy1_^UVWuujVxYY1 tjV`YY1#VtjV?YY1v~,th1h5 O# VvFPrFP/Džtt'jVYY1#DžujVYY1 ~,VY_^UVW}w,fWfVWRVGuhP1h5 O" Guh$1h5 O" fWfVWV V4Y~WV F$F(FdžPFV2;YjV (YY~$t1_^UVWu }VUWN9t1?Et W 9Vt1*EtWN9t1W 9Vt1_^UVWuu&jjVh 1 t&jjVJ 1~,th|1h]5 O! #VGVvFPrFP0Džt&t&jjV 15~,VY)Džu&jjV 1 ~,VY_^UVW}u81Ps,t~lt~uvl<\YFlGσ}uA1Ps5t%~ut[YdžGƃ}G1Ps;t+~u%~u~tu~ht jVt9YYG} uA1Ps5t%~u~tu~ht jV-9YYG_^UVW}ցuuIjW8YY=u~򈗡LJW4W8jW%YY_^UVu~$thX2h5 Og tO~th42h5 OB ~hth2h5 O$ e9F,}SF0J~th2h5 O F,F0ƆƆfdž F~0ue<iF0V0V4V0V8V0VjV'YY/U#WVxWV|Vx~tUtUV4V0+V4Fdž@VYuh(9h5O ~$uh 9h5O vYjV$YY}luuuu VBaFVnYuh8h5OO V0V8jVYYUU tE}iU9V|u19}u@EV|+Uuh8h5O +V|u+Ut1EcV|+UtN+V|u +Uu&U+V|uU+Ut1EE}uUjVYYUtK~(t6VUF$FjV(%YY}uYjV%YYUX+V|uK~(t6VUF$FjV$YY}kuCY]jV$YYNUBV4+UV<+UFdž@EPuV VYuh8h5O ~$uh8h5O v#Yuuuu Vuuu Vb jV*YYwUU tE}iU9V|u19}u@EV|+Uuh`8h5OB +V|u+Ut1EcV|+UtN+V|u +Uu&U+V|uU+Ut1EE}]UwjVYY]UQ~DV5jV YY&Ut0"#"u~hujVQ"YYjVB"YYUt+V|ujV"YYU~t džU9V4bV49VHu@Ut8M9}fUUV4VHjVYYUfV4V8VHXV4+Ut*V<+UuEPuV ~u%V<+UtjV YYu VYYuVYY}tEV|)uuuuVuuuV@jV: YYU{V|)juV|+tF|jV YY~t8Vt-jV YY!h@8QYVY 8F|\}t uiBY_^U4VWu}~uh:h5O U B th:h5O U R  ً ʋ  щMU fRf  فfMUUU J ?M U9U} #UfUUUU+u U@t@Vx+V|t2W)AY~DV5jV YY&+Ut U􉖄U9U~$UURjWID EW@Y}؃eUtU+V|t#V|+UURWEYYNjUUU+U܉UU9V|th:h!5O UUU+Ut2+UURjWC EW@Y}؋UUUe+Uthp:h-5O UdžWuEYYE؉UV|UtV|+tuF|~tVt jVYYUt8-PhL:MYYdžW,?YOUV|+U4džWN@YEU+V|t6V|+UU9Uw W>YuWCYYNjUUU+U܉UU9V|th,:hf5O= UUU+Uth:hi5O  UdžWuDYYE؉UV||?YFx9F|t*VMYh9LYh|9hs5O ~tVt jVYYUЅUV|U+Udžu>YEU+Ut=E+Eةuuk=YU+UURuBYYEЋU+ỦUu UЉuBYYUVYYEPuYY%UfBu9Y~lt vl8YUVljVYY_^U(VWu~uhd;hW5Ok ~uhD;h[5OH ~u)8tw8WdYYWQYYVx+1E#U#UV|+VxU}tM}t+VxUUUU9WY Vzp~_^UVu V 9Uth;jI5O VY^U VW}Wth<jT5O Hwuh\<jY5On ~ltVlUFlFVYEN}iu5YPuw Et}tD}u VY띃}t}tuh@<BYYh<jy5O h}yOUWuc5YPw YYE=uOY}th;h5O gWh;h5OX &VpW_^UDVWu~uh >h5O >EI1iV<9V8uu1S&th=h5O j1YP HJ MUBMQMQjEPEPV2Ydžu1W3YEV8U~uEEU9V0uAu*VYh=@Yh=h5O U̓U̓F8U  ً ʋ  ыUJV|  ً ʋ  ыUJUM͈J ff  فUfJ#Uf  فUfJU MQW@6YYEPuYY%UfBu0YkxEE9F,}F,V8UE1fEt'E&jEPEPVDžu1V<9V4+Uthh=h5O U9VHRV09V4uh<=h 5O UU܋V4U؋Vh5O" 6E~\V\+U  9FX~h>h5O U+VXU~dF\u }9} U99}~>Vd~dX~FdX~dh>h5Oo yU +V\9u5kǃ}~d~duMh>h5O& 3kǃ}~d~duh>h5O VH+V4UffUދU 9V4uhp>h)5O UUغ#VLfUU9UvUVPfUU܉VLU܉UU9UvUU؋U U؉VHV4UVhM5O U9V0uE tU9U uM U9UuMMU +UUU+U UVhUFh}uu)YV4VHuu).YYEFhVH+V8tVHV8~t$V‚tLV<+V89v;VXY2V<9V4u*~th >h5O< jVZYYV89VHt9V Ntw Ydž&V|VxtO Ydž~htvh6 YFhV4V1^UVWuF hn@v5YYE=uN}~ h'vv1 Etuh C,YYF u NF E} s(t9w9UuWvQ6 Eu1}thDht5O ~uv5YYE=u'V€th\Dhz5O N}t!}th9UWUUF>PEPV Eu WYjQYE裤P HJ MԉM̋U؉UE}~MȋEEЋŮ EUMJUB~ uUV V$MJUV$UWWYE܋UjREP:, <U9U~CWuuY E=u WY}thEh5O }thhKh54O V UE8thTKh54O E7EU97s5} }/E}}U<t uYEEU97!h'54OYYh8KY}uuwW RU9UsUUGUWU+UUGE_^UuuYUVWu>hKhm54O J~ uhKhv54OT ?hKh}54O7 J~$F VUV5ueW7VUVWYuI_^UVW}=u0k =u"h54OYYhK Y5VWVtWUBE tW UBE_^UVWuuhLh54O3 1t0rpvhKh54O ~v̉_^UVutU 9V|VY^U VW}tUzuE8uR :uEruHYEuhtLh54O u9YE}uEE}uhhLh54O9 U9Wu EƋU9Wwh@Lh 54O W+UUuh4Lh 54O U9VuEvjU9Vwh Lh54O V+UU9UsUU=W R QU5N I KMuRQ UUUU+UUuYE_^UVWuu} u }u1uhLh554O uhLh854O }u'VYwYGG'tU 9Vw +VU vuhLhN54Ow VYwYGWU WW+U W9Ur U+WU UWE}vH}tBU9Vw:V#YUBURUrEYUBvUM+JM밃}tNuhLhn54O跿 VYUBURUrYUBUMJ_^UVWuuhLh54O[ U 9Ww'+WU uhLh54O, 9t VnY>tV&YVWYVU VV+U V_^ULVW} }uPuEDE}E8uUU5uYEԋ]ԃ;th`Mh54O{ uYUԋRUUԃzuBuY덃}uUԉUUԉVuq}uFtu}ԋtuPY߅uEmWVN 9Qs ~ETV 9J:~t.v5V R QN Rq F5V R QVỦ=W IJ Mwuu WVWVtWUBEWoYEWVRLYEEEEVUȃ}}uhTMh54OǼ UM9JuERU뾋UM9Jwh,Mh54O芼 U9Vwh Mh54Oj V+UĉUUR+UU9UsUU5V R QUċM I I KMuRQJ UUUċU+UUEWUȃ}}uhMh%54O辻 UM9JuERU뾋UM9JwhLh,54O聻 U9WwhLh-54Oa W+UĉUUR+UU9UsUU=W R QUċM I I KMuRQA UUUċU+UUVEPuV EPuuY~tvWVtWUBEWYE_^UU JUUVW1=u/ }*1} 7<t WYFG_^UVWuU 9Vr(5V IJ MUJUuVYE} t}uhMh54O躹 U 9UwVYƉ\u jVf NjU+U Ru VQ EVYWYǃthxMh54ON UW_^UU=uPhjYYx =tj+58OĸYYhMYʸU=u UUUVWu~tVY~thMjL58O聸 UVUVU V F=u57M 9J ~ 5=?tM 9J }?7=t 9J }|_^UfUVW}N9=u/5t9>t6uhMj~58O获 G_^UVW=.Njr 9`v=t95~e5)T5hjYYx =t"h58O讶YYhMY贶_^UuY@UV`=n`E=tXM9J JzuhMh58Ob B5VvVYY^Umq_mess.m_type == DL_TASK_REPLYunable to receive: %dout of messagesunable to find synchronous alarm task SYN_ALinet: error %d on registering ethernet devices inet: server signon failed panic at %s, %d: inet stacktrace: assertion "%s" failedcompare (%d) %s (%d) failedinit: %s: Error %d rm %s mknod %s c %d %d ln %s %s /dev/udp/dev/tcp/dev/ip/dev/psip/dev/ethinet: error on line %u inet: '%s' is not a number <= %u /dev/ip/dev/ipinet: No networks or no default network defined inet: ip%d and ip%d can't both be default defaultinet: Unknown device '%s' psipeth/etc/inet.conf/etc/inet.confmnx_eth.cosdep_eth_init: DL_INIT error or wrong port: %d osdep_eth_init: no ethernet device at task=%d,port=%d unable to receiveosdep_eth_init: unable to send to ethernet task, error= %d unable to find task %s: %d (mess1.DL_STAT >> 16) == OKmess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_procunable to receiveunable to sendloc_port != eth_portblock_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)unable to receivepack_size >= ETH_MIN_PACK_SIZEi< IOVEC_NReth_port->etp_wr_pack == NULLstat & (DL_PACK_SEND|DL_PACK_RECV)message from unknown source: %d:%dm->m_type == DL_TASK_REPLYresult == 0mess.m_type == DL_TASK_REPLYresult == OKresult == OKmlocked.m_type == DL_TASK_REPLYresult == OKgot reply for wrong portrepl_mess.m_type == DL_INIT_REPLYunable to receiveunable to send(%d)repl_mess.m_type == DL_TASK_REPLYunable to receive(mess1.DL_STAT >> 16) == OKmess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_procunable to receiveunable to sendloc_port != eth_portblock_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)unable to receive!pack_ptr!eth_port->etp_rd_pack!(eth_port->etp_flags & (EPF_READ_IP|EPF_READ_SP))m_ptr->DL_STAT & DL_PACK_RECVeth_port->etp_osdep.etp_port == m_ptr->DL_PORTm_ptr->m_type == DL_TASK_REPLYev == ð_port->etp_osdep.etp_recvevm_ptr->DL_STAT & DL_PACK_SENDeth_port->etp_osdep.etp_port == m_ptr->DL_PORTm_ptr->m_type == DL_TASK_REPLYev == ð_port->etp_sendevimq_allocated == 0mq != NULLmq->mq_allocated == 1sr.cYunknown message, from %d, type %dresult == OK || result == EINTRresult == OK || result == SUSPEND!(sr_fd->srf_flags & SFF_INUSE)minor>=0 && minorsrf_flags & SFF_MINOR)!(sr_fd->srf_flags & SFF_BUSY)sr_fdL03Hr == OK || r == SUSPEND || (printf("r= %d\n", r), 0)r= %d illegal case entryr == OK!*q_head_ptr*q_head_ptrsr_fd->srf_flags & susp_flagillegal case entrysr_fdrequest not found: from %d, type %d, MINOR= %d, PROC= %d, REF= %d OPERATION= %dsr_fdresult == OK!(loc_fd->srf_flags & SFF_MINOR) && (loc_fd->srf_flags & SFF_INUSE)minor < FD_NRminor >= 0unable to send!mqmloc_fd->srf_flags & ip_flag!mqmloc_fd->srf_flags & ip_flagunable to sendrecunable to sendrecunable to send: %dm_cancel->mq_mess.m_type == REVIVEm_cancel->mq_mess.m_source != MM_PROC_NRunable to send: %dm->mq_mess.m_type == REVIVEm->mq_mess.m_source != MM_PROC_NR!m_cancel ???0x%lx udp.cUDP_IO_HDR_SIZE == sizeof(udp_io_hdr_t)UDP_HDR_SIZE == sizeof(udp_hdr_t)BUF_S >= sizeof(struct udp_io_hdr)BUF_S >= sizeof(struct nwio_udpopt)BUF_S >= sizeof(struct nwio_ipconf)BUF_S >= sizeof(struct nwio_ipopt))()f))unknown stateudp_fd->uf_rdbuf_head == NULLW,*W,+udp_get_data(%d, 0x%x, 0x%x) called but up_state= 0x%x udp_port->up_wr_packudp_port->up_flags & UPF_WRITE_IP!for_ioctlcount == sizeof(*ipopt)!offsetfor_ioctl-,8-udp_put_data(%d, 0x%x, 0x%x) called but up_state= 0x%x !offsetresult >= 0udp_port->up_flags & UPF_READ_IP0ipconf->nwic_flags & NWIC_IPADDR_SET/An.@n@.opt_acc->acc_length == sizeof(*udp_opt)udp_fd->uf_flags & UFF_INUSEdata->acc_length == sizeof(nwio_udpopt_t)unable to find unused port (shouldn't occur)result == NW_OK!resultresult == NW_OKresult == 0size>= hdr_lenpack->acc_length >= UDP_IO_HDR_SIZEudp_accip_hdr_accudp_fd->uf_flags & UFF_OPTSETudp_fd->uf_flags & UFF_INUSEtmp_acc->acc_next == NULLtmp_acc->acc_linkC == 1udp_fd->uf_flags & UFF_INUSE!(udp_fd->uf_flags & UFF_WRITE_IP)!(udp_port->up_flags & UPF_WRITE_IP)!udp_port->up_wr_packudp_io_hdrudp_io_hdrudp_io_hdr!udp_port->up_wr_packudp_fd->uf_flags & UFF_WRITE_IPpack!(udp_port->up_flags & (UPF_WRITE_IP|UPF_WRITE_SP))!udp_port->up_wr_packDwDD4Dgot unknown cancel requestudp_fd->uf_flags & UFF_IOCTL_IPudp_fd->uf_flags & UFF_WRITE_IPudp_fd->uf_flags & UFF_READ_IPcurrarp.cBUF_S >= sizeof(arp46_t)BUF_S >= sizeof(struct nwio_ethopt)BUF_S >= sizeof(struct nwio_ethstat)HF]GiG Garp_main(&arp_port_table[%d]) called but ap_state=0x%x result == NW_OKresult == NW_OKJ ^H@Harp_getdata(%d, 0x%d, 0x%d) called but ap_state=0x%x offset+count <= sizeof(arp46_t)arp_port->ap_flags & APF_ARP_WR_IP(!offset) && (count == sizeof(struct nwio_ethopt))arp_putdata(%d, 0x%d, 0x%lx) called but ap_state=0x%x data->acc_length == sizeof(*ethstat)bf_bufsize(data) == sizeof(*ethstat)!offset to changed from arp: ethernet address for IP address oldeth_port >= 0ce->ac_state == ACS_INCOMPLETEarp_port->ap_state == APS_ARPMAIN || (printf("ap_state= %d\n", arp_port->ap_state), 0)ap_state= %d eth_port >= 0 && eth_port < eth_conf_nrce->ac_state == ACS_INCOMPLETE || (printf("ce->ac_state= %d\n", ce->ac_state),0)ce->ac_state= %d timer == &arp_port->ap_timereth.cBUF_S >= ETH_HDR_SIZEBUF_S >= sizeof(nwio_ethopt_t)eth_fd->ef_rdbuf_head == NULLYn8XnHXn@vUbf_bufsize(acc) == sizeof(*ethstat)result == 0bf_bufsize(acc) == sizeof(*ethstat)sizeof(nwio_ethstat_t) <= BUF_Seth_fd->ef_flags & EFF_INUSEr == NW_OK!(eth_fd->ef_flags & EFF_WRITE_IP)!(eth_fd->ef_flags & EFF_READ_IP)]@]t]got unknown cancel requesteth_fd->ef_flags & EFF_WRITE_IPeth_fd->ef_flags & EFF_READ_IP(eth_fd->ef_flags & EFF_INUSE) && !(eth_fd->ef_flags & EFF_BUSY)ev == ð_port->etp_sendevcurrr == NW_OKeth_fd->ef_flags & EFF_INUSE!dataerror == NW_OKevent.cev->ev_func == 0func != 0icmp.cBUF_S >= sizeof (nwio_ipopt_t)f3ffresult == NW_OKdata->acc_length == sizeof(*ipopt)count == sizeof (*ipopt)result == NW_OK!for_ioctl!(icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP) || (icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP)) == (ICPF_READ_IP|ICPF_READ_SP))0 <= port_nr && port_nr < ip_conf_nr0 <= port_nr && port_nr < ip_conf_nr0 <= port_nr && port_nr < ip_conf_nrVl VlVlVlkVlkVlVlklVl+lrepl_icmp->acc_length == ICMP_MIN_HDR_LENicmp_packrepl->acc_length == repl_hdr_lenicmp_port->icp_write_pack == NULL!(icmp_port->icp_flags & ICPF_WRITE_IP)pppppq\qqvs sBsip_pack->acc_next == NULL hdrlen= %d, ih_length= %d, bufsize= %d icmp_err_pack: wrong packet size: icmp_err_pack: invalid source address: %d.%d.%d.%d%x:%x:%x:%x:%x:%xip.cw+wnwunknown ip_dl_type %dresult == NW_OKresult == NW_OKBUF_S >= sizeof(nwio_route_t)BUF_S >= sizeof(nwio_ipopt_t)BUF_S >= IP_MAX_HDR_SIZE + ETH_HDR_SIZEBUF_S >= sizeof(struct nwio_ethopt)2yxxunknown cancel request!resultip_fd->if_flags & IFF_READ_IP!repl_resip_fd->if_flags & IFF_GIPCONF_IPip_fd->if_rdbuf_head == NULL(ip_fd->if_flags & IFF_INUSE) && !(ip_fd->if_flags & IFF_BUSY)not freeing ip_loopb_head, ip_loopb_event enqueued no callback filled in for port %dip_ioctl.cdž !n #n8m(n(F+n( n @̀)n(@,n(@}-n(@>"n8@|result == NW_OKresult == NW_OKdata->acc_length == sizeof(nwio_ipconf_t)data->acc_length == sizeof(nwio_ipopt_t)ip_fd->if_flags & IFF_INUSEfd>=0 && fd<=IP_FD_NRcurr!resultip_lib.c)>>)>S ƉH!(optlen & 3)port_nr >= 0 && port_nr < ip_conf_nrip_read.c!(ip_fd->if_flags & IFF_READ_IP)next_acc != NULLprev_acc == NULLfirst_hdr_size + first_datasize == bf_bufsize(first)second_offset >= first_offsetsecond_hdr_size + second_datasize == bf_bufsize(second)first_hdr_size + first_datasize == bf_bufsize(first)second->acc_length >= IP_MIN_HDR_SIZEfirst->acc_length >= IP_MIN_HDR_SIZEresult >= 0size >= ip_hdr_lenpack->acc_length >= IP_MIN_HDR_SIZEip_fd->if_flags & IFF_INUSE!(ntohs(ip_hdr->ih_flags_fragoff) & (IH_FRAGOFF_MASK|IH_MORE_FRAGS))pack->acc_length >= IP_MIN_HDR_SIZEpack->acc_length >= IP_MIN_HDR_SIZEpack->acc_linkC>0 dst=packet is wrongly routed, src= dst=packet should not be here, src=pack->acc_length >= IP_MIN_HDR_SIZE dst=ip[%d]: broadcast packet for ip-nonbroadcast addr, src=pack->acc_length >= IP_MIN_HDR_SIZEev == &ip_port->ip_loopb_eventip_write.cr != NW_WOULDBLOCKdata->acc_linkC == 1data->acc_linkC == 1data->acc_length >= IP_MIN_HDR_SIZEdata->acc_length >= IP_MIN_HDR_SIZEip_fd->if_port->ip_flags & IPF_IPADDRSET!(second_hdr->ih_flags_fragoff & HTONS(IH_DONT_FRAG))first_pack->acc_buffer->buf_linkC == 1first_pack->acc_linkC == 1i + optlen <= first_opt_sizefirst_pack->acc_length>=first_hdr_lenpack_siz > first_sizefirst_pack->acc_length >= IP_MIN_HDR_SIZEcan't error_replyipr.cIROUTE_HASH_ASS_NR == 4OROUTE_HASH_ASS_NR == 4oldest_routeoroute->ort_port == port_nroroute->ort_port == port_nrresult == NW_OKresult == NW_OKresult == NW_OKresult == NW_OKresult == NW_OKoroute->ort_dest != bestroute->ort_destoroute->ort_port == port_nrdist_routegw_routenw_routebest == orouteoroute == NULLbest == orouteoroute == NULLtcp.cBUF_S >= IP_MAX_HDR_SIZE + TCP_MAX_HDR_SIZEBUF_S >= sizeof(struct nwio_tcpconf)BUF_S >= sizeof(struct nwio_ipconf)BUF_S >= sizeof(struct nwio_ipopt)׿׿unknown state!tcp_conn->tc_busyw*wtcp_get_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x tcp_port->tp_packtcp_port->tp_flags & TPF_WRITE_IPcount == sizeof(struct nwio_ipopt)!offset\tcp_put_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x !offsetip_read() failedtcp_port->tp_flags & TPF_READ_IPipconf->nwic_flags & NWIC_IPADDR_SETtcp_conn->tc_busy == 0+7n1n.5n 6n@2n@l3n@0n@opt_acc->acc_length == sizeof(*tcp_opt)conf_acc->acc_length == sizeof(*tcp_conf)tcp_fd->tf_flags & TFF_INUSEnew_di_flags & NWTC_REMPORT_MASKnew_di_flags & NWTC_REMADDR_MASKdata->acc_length == sizeof(nwio_tcpconf_t)data->acc_length == sizeof(nwio_tcpopt_t)unable to find unused port (shouldn't occur)tcp_fd!resultremaddrremportresult == NW_OKlisten_conntcp_fd && listen_conn->tc_connInprogress && tcp_fd->tf_conn == listen_conn!best_conn->tc_fd!tcp_conn->tc_fdtcp_conn->tc_state == TCS_CLOSEDtcp_conntcp_fd->tf_ioreq == NWIOTCPSHUTDOWN || tcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONNtcp_fd->tf_flags & TFF_IOCTL_IPtcp_fd->tf_flags & TFF_WRITE_IPtcp_fd->tf_flags & TFF_READ_IPtcp_conn->tc_busy == 0tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0) tcp_fd->tf_flags & TFF_INUSEtcp_conn->tc_busy == 0tcp_fd->tf_flags & TFF_INUSEtcp_conn->tc_fd == tcp_fdtcp_conn->tc_connInprogresstcp_conntcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONNtcp_fd->tf_flags & TFF_IOCTL_IPtcp_fd!tcp_conn->tc_connInprogresstcp_conn->tc_fd == tcp_fd!(tcp_fd->tf_flags & (TFF_IOCTL_IP|TFF_READ_IP|TFF_WRITE_IP))tcp_fd->tf_flags & TFF_INUSEI1n5n 2n@3n@0n@eaunknown cancel requesttcp_conn->tc_connInprogresstcp_fd->tf_flags & TFF_IOCTL_IPtcp_fd->tf_flags & TFF_READ_IPtcp_fd->tf_flags & TFF_WRITE_IPtcp_fd->tf_flags & TFF_INUSE!tcp_fd->tf_conntcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RAtcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RP!tcp_conntcp_conn->tc_frag2send == NULLtcp_conn->tc_send_data == NULLtcp_conn->tc_adv_data == NULLtcp_conn->tc_rcvd_data == NULL!tcp_conn->tc_busy!tcp_conn->tc_send_datatcp_conn->tc_state == TCS_CLOSED!tcp_conn->tc_connInprogresstcp_lib.c!(tcp_hdropt.tho_opt_siz & 3)!(ip_hdropt.iho_opt_siz & 3):GTan{unknown (=%d)CLOSINGESTABLISHEDSYN_SENTSYN_RECEIVEDLISTENCLOSEDnot inuse tcp_conn_table[%d]->tc_state= SND_NXTtc_inconsistent == 1 0x%lx,%u ???,%u ???tcp_hdr TCF_FIN_SENT TCF_SEND_ACK TCF_MORE2WRITE TCF_RCV_PUSH TCF_FIN_RECV TCF_INUSE IRS 0x%lx LO +0x%x(0x%lx) NXT +0x%x(0x%lx) HI +0x%x(0x%lx)+0x%lx(0x%lx)0 transmit_seq snd_cwnd +0x%lx(0x%lx) ISS 0x%lx UNA +0x%lx(0x%lx) TRM +0x%lx(0x%lx) NXT +0x%lx(0x%lx)tcp_recv.c_mm tcp_frag2conn: unknown state tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)tcp_conn->tc_connInprogresstcp_check_conn(tcp_conn)tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)tcp_check_conn(tcp_conn)tcp_conn->tc_connInprogresstcp_check_conn(tcp_conn)tcp_check_conn(tcp_conn)tcp_check_conn(tcp_conn)tcp_conn->tc_RCV_LO + bf_bufsize(tcp_conn->tc_rcvd_data) == tcp_conn->tc_RCV_NXT || (tcp_print_conn(tcp_conn), printf("\n"), 0) tcp_LEmod4G(hi_seq, tcp_conn->tc_RCV_HI)lo_seq == tcp_conn->tc_RCV_NXTconn[%d]: advanced data after FIN tcp_LEmod4G(hi_seq, tcp_conn->tc_RCV_HI)lo_seq == tcp_conn->tc_RCV_NXT!(tcp_hdr->th_flags & THF_SYN)tcp_conn->tc_busytcp_conn->tc_busytcp_conn->tc_busyold_window >=0 && new_window >= old_windowtcp_fd->tf_flags & TFF_READ_IPtcp_conn->tc_busytcp_send.ctcp_conn->tc_flags & TCF_INUSEev == &tcp_port->tp_snd_event!(tcp_port->tp_flags & (TPF_WRITE_IP|TPF_WRITE_SP))r == NW_OKr == NW_OK || (printf("ip_send failed, error %d\n", r),0)ip_send failed, error %d tcp_conn->tc_flags & TCF_MORE2WRITE!(tcp_port->tp_flags & TPF_WRITE_IP)   . . 0Illegal statetcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0) tcp_conn->tc_SND_UNA != tcp_conn->tc_ISStcp_LEmod4G(seg_seq, tcp_conn->tc_SND_NXT)tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0) tcp_conn->tc_tcpopt == NULLtcp_conn->tc_busytcp_conn->tc_state == TCS_CLOSINGtcp_GEmod4G(tcp_conn->tc_snd_cwnd, seg_ack)seg_ack != tcp_conn->tc_SND_UNAtcp_conn->tc_rtttcp_conn->tc_rtttcp_conn->tc_rttcurr_time >= tcp_conn->tc_rt_timetcp_LEmod4G(seg_ack, tcp_conn->tc_SND_NXT)tcp_GEmod4G(seg_ack, tcp_conn->tc_SND_UNA)tcp_conn->tc_busystt <= curr_time!tcp_conn->tc_fd || !(tcp_conn->tc_fd->tf_flags & TFF_WRITE_IP)tcp_conn->tc_SND_TRM == tcp_conn->tc_SND_UNAtcp_conn->tc_state != TCS_LISTENtcp_conn->tc_state != TCS_CLOSEDtcp_conn->tc_flags & TCF_INUSEtcp_fd->tf_flags & TFF_WRITE_IPtcp_conn->tc_busytcp_check_conn(tcp_conn) || (tcp_print_conn(tcp_conn), printf("\n"), 0) tcp_conn->tc_state != TCS_LISTENtcp_conn->tc_state != TCS_CLOSEDtcp_check_conn(tcp_conn)tcp_port->tp_snd_head == tcp_conn!(tcp_fd->tf_flags & TFF_IOCTL_IP) || (printf("req= 0x%lx\n", tcp_fd->tf_ioreq), 0)req= 0x%lx !tcp_conn->tc_connInprogresstcp_fd->tf_ioreq != NWIOTCPSHUTDOWN!(tcp_fd->tf_flags & TFF_WRITE_IP)!(tcp_fd->tf_flags & TFF_READ_IP)tcp_fd->tf_conn == tcp_conntcp_conn->tc_flags & TCF_INUSEtcp_check_conn(tcp_conn)ip_eth.cBUF_S >= sizeof(eth_hdr_t)BUF_S >= sizeof(xmit_hdr_t)= vunknown state: %dipeth_main: arp_set_cb failed: %d ! !!get_eth_data(%d, 0x%d, 0x%d) called but ip_state=0x%x data(!offset) && (count == sizeof(struct nwio_ethopt))strange statusip_port->ip_dl.dl_eth.de_state= 0x%x!offset0sizeof(t) <= sizeof(eth_hdr->eh_src)r == NW_OK || r == NW_SUSPEND!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)r == NW_WOULDBLOCKr == NW_OKdest != ip_port->ip_ipaddrhostpart != 0invalid destinationeth_pack->acc_next == NULLr == NW_OK!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)r == NW_WOULDBLOCKip_port->ip_dl.dl_eth.de_frame == NULLr == NW_OKr == NW_OKip_port_nr >= 0 && ip_port_nr < ip_conf_nrip_hdr->ih_ttl > 0!(sum & 0xffff0000)ip_pack->acc_linkC == 1 && ip_pack->acc_buffer->buf_linkC == 1ip_pack->acc_length >= sizeof(*ip_hdr)enq_time <= now && enq_time + HZ > now!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_SP)!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_IP)ip_ps.cresult == NW_OKip_port->ip_dl_type == IPDL_PSIPip_port_nr >= 0 && ip_port_nr < ip_conf_nrip_port->ip_dl_type == IPDL_PSIPip_port_nr >= 0 && ip_port_nr < ip_conf_nrip_port->ip_dl.dl_ps.ps_send_head == NULLresult == NW_OKpsip.cpsip_port->pp_flags & PPF_CONFIGUREDport_nr >= 0 && port_nr < psip_conf_nrresult1 == NW_OKpsip_fd->pf_flags & PFF_READ_IPpsip_send: loopport_nr >= 0 && port_nr < psip_conf_nrport >= 0 && port < psip_conf_nro3Qn%3Pn@o2data->acc_length == sizeof(*psip_opt)fd >= 0 && fd < PSIP_FD_NRfd >= 0 && fd < PSIP_FD_NRpack == NULLpack == NULLfd >= 0 && fd < PSIP_FD_NRpsip_port->pp_opencnt >0fd >= 0 && fd < PSIP_FD_NR766w7invalid operation for cancelshould not be hereresult == NW_OKunable to find to request to cancelpsip_fd->pf_flags & PFF_READ_IPshould not be herefd >= 0 && fd < PSIP_FD_NRresult1 == NW_OKpsip_fd->pf_flags & PFF_READ_IPpsip'promisc_restart_read: loopresult == NW_OK!resultbuf.cbuf_s == BUF_Sfewer accessors than buffersbuf.c: to many clientsnot enough buffers freedbuf->buf_linkC == 0new_acc->acc_linkC == 0size>0buf->buf_linkC>0bufacc->acc_linkC>0buf.c: out of accessorsacc_ptr >= accessors && acc_ptr <= &accessors[ACC_NR-1]acc_ptroffset_new < acc_ptr_new->acc_lengthacc_ptr_newoffset_old < acc_ptr_old->acc_lengthacc_ptr_oldsize > 0datadatadatadatanew_accdataoffset_old < data_second->acc_lengthoffset_new < acc_ptr_new->acc_lengthacc_ptr_newoffset_old < tail->acc_lengthoffset_new < acc_ptr_new->acc_lengthacc_ptr_newcurr->acc_linkC == 1head->acc_next == NULLsize != 0 && buf_size != 0clock.ccan't read clock!timer->tim_activetimer_indexcan't set timertimer_chain->tim_activeeO %NX+NcNdMo"Np+NsNu9Nx2NTFTITMpTSpTP < X xP !$&d(x28x;BFGJMinet 0.35K, last compiled on May 22 2001 20:18:240123456789ABCDEF0123456789abcdefSSSS 8# A list of all tags mentioned in RFC-1533. tag 1 netmask ip 1 1; tag 2 zoneoffset number 4 1; tag 3 gateway ip 1 0; tag 4 timeserver ip 1 0; tag 5 nameserver ip 1 0; tag 6 DNSserver ip 1 0; tag 7 logserver ip 1 0; tag 8 cookieserver ip 1 0; tag 9 LPR ip 1 0; tag 10 impress ip 1 0; tag 11 resource ip 1 0; tag 12 hostname ascii 1 0; tag 13 bootfilesize number 2 1; tag 14 coredump ip 1 0; tag 15 domain ascii 1 0; tag 16 swapserver ip 1 1; tag 17 rootpath ascii 1 0; tag 18 extensions ascii 1 0; tag 19 IPforwarding boolean 1 1; tag 20 IPnonlocalsource boolean 1 1; tag 21 IPpolicyfilter ip 2 0; tag 22 IPmaxreassembly number 2 1; tag 23 IPTTL number 1 1; tag 24 IPMTUaging number 4 1; tag 25 IPMTUplateau number 2 0; tag 26 IPMTU number 2 1; tag 27 IPsublocal boolean 1 1; tag 28 IPbroadcast ip 1 1; tag 29 IPmaskdiscovery boolean 1 1; tag 30 IPmasksupplier boolean 1 1; tag 31 IPdiscovery boolean 1 1; tag 32 IPsolicitation ip 1 1; tag 33 IPstaticroute ip 2 0; tag 34 ARPtrailer boolean 1 1; tag 35 ARPtimeout number 4 1; tag 36 ETHencapsulation boolean 1 1; tag 37 TCPTTL number 1 1; tag 38 TCPkeepaliveinterval number 4 1; tag 39 TCPkeepalivegarbage boolean 1 1; tag 40 NISdomain ascii 1 0; tag 41 NISserver ip 1 0; tag 42 NTPserver ip 1 0; tag 43 VENDOR octet 1 0; tag 44 NetBIOSNS ip 1 0; tag 45 NetBIOSdgram ip 1 0; tag 46 NetBIOSnodetype number 1 1; tag 47 NetBIOSscope octet 1 0; tag 48 Xfontserver ip 1 0; tag 49 XDM ip 1 0; tag 50 DHCPreqip ip 1 1; tag 51 DHCPlease number 4 1; tag 52 DHCPoverload number 1 1; tag 53 DHCPtype number 1 1; tag 54 DHCPserverID ip 1 1; tag 55 DHCPreqpar number 1 0; tag 56 DHCPmessage ascii 1 0; tag 57 DHCPsize number 2 1; tag 58 DHCPrenewal number 4 1; tag 59 DHCPrebinding number 4 1; tag 60 DHCPclassID ascii 1 0; tag 61 DHCPclientID octet 1 0; #!/bin/sh # # daily - daily cleanup of the system. case "$#:$1" in 1:cron|1:boot) caller=$1 ;; *) echo >&2 "Usage: $0 cron|boot" exit 1 esac test -d /usr/adm || exit cd /usr/adm || exit # Last run must have been on a previous day. timestamp=daily.lasttime if test -f $timestamp then set -- `ls -lT $timestamp` test "$6 $7 $9" = "$(date '+%b %d %Y')" && exit fi >$timestamp # Remove three day old files from various tmp dirs. cleantmp -3 /tmp /usr/tmp /usr/preserve /usr/spool/lpd /usr/spool/at/past # Truncate log files in /usr/adm. test -d old || mkdir old || exit cycle() { # Cycle a log file if larger than a size in kilobytes. local size="`expr "$1" + "$1"`" local log="$2" if test -f "$log" && test -n "$(find "$log" -size +"$size")" then test -f "old/$log.2" && cp -p "old/$log.2" "old/$log.3" test -f "old/$log.1" && cp -p "old/$log.1" "old/$log.2" cp -p "$log" "old/$log.1" : > "$log" fi } cycle 100 wtmp cycle 100 log cycle 20 ftplog cycle 200 aftplog # Make copies of /etc/passwd and /etc/shadow if they have been changed. for file in passwd shadow do if cmp -s /etc/$file old/$file.1 then # Fine. else test -f old/$file.2 && cp -p old/$file.2 old/$file.3 test -f old/$file.1 && cp -p old/$file.1 old/$file.2 test -f /etc/$file && cp -p /etc/$file old/$file.1 fi done # Continue with a local script if present. test -f /usr/local/etc/daily && sh /usr/local/etc/daily $caller exit 0 ...a.out.halloca.hansi.hassert.hctype.hcurses.hdirent.herrno.hfcntl.hfloat.hgrp.hibmlib.hlimits.hlocale.hmath.hmathconst.hminixnetpwd.hregexp.hsetjmp.hsgtty.hsignal.hstdarg.hstddef.hstdio.hstdlib.hstring.hsystar.htermcap.htermios.htime.htools.httyent.hunistd.hutime.hutmp.hconfigfile.h.*..advent1.datadvent2.datadvent3.datadvent4.dat# Y䂾䐸í䗤䆢䌪٥þ웡íٷî٦ Aٽ٭䅣Íٷÿ䅠얱얢øî옪 dí٣ # Y䋭û䖼٥äٷå䗤䅣Øþ슨î døãٷ䌪ٰ٬쭬䊿٥î쐪øè # Y䂾䊢٥î٥û쑫䅣앥䐼à t٫ٷ䊿٥ÿٴ # Y䂾䊢٥ú䊢ٰ٢웡íٷ썱٥í r웡 # Y䂾䊢٫䅣䔥í٠䕭ٰ얪슭Âê i٥à٦ # Y䂾䊢٫䅣٪䁣íٲ옪䑣 # Aٽ䅩íøû٫썬슰ÿ쐪٥ԭ䐠 iٰٶ콫øÿ䁩䊿٦䑣 # Y䂾䊢٥酣è䅠䔥î읭ßå썬 då슰ÿ٣áå䀣مèÿ䁩 l쐪ٰ٠ # Y䂾䊢٥ÿ٧٦٥ÿ٣ø䗤䐹 A앫욶䌺ïà٭썫øû # Y䂾䀾ã욫쐪í٨ٴØ٭䇥䏥 aٰ١䆢䌪ٰٴ # Y䂾䊢٥è䑣ê䔥ÿٳ쐪ê썬슱 A앫쎭ٴٳ䀣䁩䓠䔥áíè h웱옪íï䏩쌴íû엫٫썬쎥 s䴣Ô # Y䂾䊢٥옳슨윥ֳ䀭 # Y䂾䊢٥ÿ욬썬ê쑭Øû٥٢ r٫얶ÿÍ䂻䀭٥٥ë쉥으 fé옪쎡ٷã䗤䀤 # Aٽ䅩å슩䓥䁾썶ã䔤씭Í䆭 p䆢ä으êíٷï٨٫ # Y䂾䂸٫١٫䕭ä슰êãã䐥썫 t䔩ِíã썫é䐥ي٥û슰 s액䇣ِ٬䊿٢쎭ٳã䔤씭 s䗣٥٢٥옷å䂠욫ٳ䁠쌴ø s䷤쐷íٴ٥썬썫얢í٠䁩ٽ # T䀾쐷êøÿ٢ٽٰ쟫 # Y䂾䌢ٰ١䁭ã쟭슨욨䂯ٰ٬ T䎥å䒹썬䋩옪썬쟭쐷øû썫æ # Tå앫싫ٳ욶䍣ã䗤䔭ِ٪䐭 "ûĸ٣٭쌴øÿ # Y䂾䊢ٌٰ䌪ٰى䨥쎭ٴ䌪䊢٥ d # Y䂾䂸ٰ٦얢øüû䁾٪ # Y䇥ĸ٩䊸 # T䇣å䖢 # Y䂾䂸ٰٳ䆢䌪ِٰ쫫Ø٭䏭쑫٭ t䔭íٰٴ٥썬١٫썬싫 # Y䂾䂸ٰ٦얢øéüå䗤䷻ٖ쭬䊿 a슩䓣ã䌥䊢٫٧얢øü # Y䂾䂸ٰ٦얢øûüå䗤䷻ٖ쭬䊿 a앥䋣å䗤䔭í쟡٥õ # Y䀠䖼ٰٴíÿ䗤䗤䋣í䗤䗣 # Y䂾䌢ٰٳ䐥ã䗤䅥䊢ٌٰ䌪ى # Y䂾䊢٥àÂ֗üí쑫٭썬쟨쭬쑫٣ dø䂢ف̛ٴ # Y䂾䊢ٰٗß캬 # Y䂾䊢ٰٓ䰥Ïã䗤䫭ã䗤䮣Ç A쉥욫䔩íù䋩 # < # Y䀭잡웽øÿ # Y䂾䊢٥àٶû䓭䗣ٰٷ䓭䗣ٰ w옪䔭ã䁾ٶ䗣ٰ١쭬䊿٥à䌢 a싫٭썬싫޷ï # Y䂾䊢٥æ䌪ٶû욶é # Y㑩٥䏣䔥٫٥ä쉭ٳéù䌹䌪 s쟨䊿٭䕥䌺䅩îØ䌪 w씭٧øê٫썬쉭٦䗤䗣ٰٶ M쐪øè옶øû䔣슡ٰ쐪ٰ s䋭䁩ä싡È옧øüê쀫옪 2٢䂻ø٭䐥䔥٨٭앭싫Í s䅥٧٦슡ٰüî옰õ # Y䂾䊢٥è٦쉥䷣ٰ١䊿٥ïØ䗤 wå앥䓭츦䚣䊿٥ä썫íü # Y䂾䌢ٰ٦ã슩䀠욨䓥䀾액 w # Y䂾䊢ٰ٦얢íٷüû䏥ٷٳ e٥١øø슨 # Y䂾䊢٥àٶ䅹ã䇹싫쭬䊿٥îä쐪 t䅠䷤옶욶éííٴ٨١ # Y䋭ïøíٲ䏣䔥üü썫íâ oٌٰ䌪ى # Y䂾䂸ٰٳ䆢䌪ٌ䌪ىمàû욶䀣 wííë엫쭫øÿ٭䏥ٴê o䗤䅠 # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Y䂾䌢ٰ٦ã썬ê쉭쎭٥áã䀣 dãû亣䀣욨䇣ä웱쀫욫䍣䄩䁭 uØá욫䂸ٰ䏩 # Dé # Y䋭ïøíٲ䏣䔥üü썫íâ oٌٰ䌪ى # Y䂾䂸ٰ١䆢䌪٥ú앫٬䂼ٳٷ cٍ썬슫䔭íÿû욶íí٬ h웱썬쑫٭쟥옦䚣ä䷣ٰ١쎭 c슨ù쭫øâ٥þٰ٢䋣ÿ䇣 # Y䂾䂸ٰٳ䆢䌪٥ú앫٢٬쭬쑥 j쌴û䍭٪̿ٴ # Y䂾䂸٥ï٫䋥Â֗üíí٨ف̛٫ # Dé # Y䂾䂸٥ïæ앫쑥䂢䈢쉥쟶ٰ n쓫쑭ï٢䗤䆭ø䎭íٳٴ g쎡Ø٭온٥àٶ䂮䷤䂥䊿٠䋩 # Y䂾䊢نí٨䆭̻쉥쎭٬é T١٥싥ÿ䍣ٷ쌴얶è # Y䂾䊢٥þ쎬䔭싡ٷï춦쉥 gٳéي٥ي䳭ã䗤䑣å䌯î앥 b䁠 # Y䂾䂸ٰ١䆢䌪ِٰ쫫Øê٬䊿 lû썬ٶ䐠ٳá쐰é썫èøü T쐷íٴ䋩îٰٴ䗣٧ٴ䅾é a䔩ِíä٥٫îøã웭얪쐷ã䗤 wè얲ٰٳ䓥䔤쀫욥䄩䗣٭ # Y䂾䊢٥à٨٧䀤䔤쟨䊿٥쐩슨 f٢䗤䀩˟쫫켥٥ٳ䗤얪ٳ l쉥䁹䗤íâê䔥î䯣䐡 pë䍣옪슫íøÿ٫ٵ٦û aٰ٦ # Y䂾䊢٥ÿ䀭٥í٨þ # Y䂾䊢٥ÿ䀭٥íٷٴ # Y䂾䊢٥ÿ䀭٥䉹ã䗤욥٦ nٷ옪쪁ِ٪ãå䂿ٰ䂿ٰ٫ø c # Y䂾䊢٥à٨ٶ캶à엫Âíß # Déï # Y䂾䊢٥ÿ䀭ٳä싱ف̛Å䀾䌺í vø٧ê웡찢õë䇣õáâî䂮 t٣٦䖼 # Y䂾䂸٥û쉨䊢٥ú썭䀭 # T䀭٬䁩䗣䗥썫ë䅹䐣 # Y䂾䊢٥ø욥مàø٧ë䅩â٥ s썫ã쌴 # T䀭ٶ䊢í٩䌪٦٠䆢 # T䐸٢ãøíٴ䌪ê읭ٷü Iٳî䂨썫ùøé # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥à٪욫ٷ얱얢ÿٰ썬 wم썬윥윪쐷í٬䗤䔤쀫욥슡 p얢à # T쐷âä썫ïÙ얶ٰ액䗤䓥 # Y䋭ïù䗤䓠옪얱얢øü # Y䂾䂸ٰٰ٫䐸쐪옦앥䑣ٝ٧ c읫٬îõû٪٦옦ٰ욨䖼Ø٭ p䏩䁭ø䗤䍣 # Y䂾䊢ٰكÞ䷤䀩䋩å䗣䋥ù䅣䚣 lø䐤å캥䓭à윥䍣٥ٷً t䔩û쐷ÿ썬쐪楉䥅䥃䥃× # T䓭䋩å䁠䁵٥þ䀭Υ # Y䂾䂸٫١٫옪åâַü # Y䂾䊢٥áï䔥íٶٷٳï oíٷû٭싫쎬䔤읭 t쑫٭썬쟨쩥١䗣ٰٷíû # Y䂾䊢ٰٗ䱣ِٳíïû쑡䀹 t䅠쎭٥øٴ䀭Á욫øï # Tå䗤䬾Þ䢢䌾ï읶٧ø w잡ÿüàٱ썫øâ䂢 p䏩쪁옪䋭옪쒪䀾액䆭 # Y䂾䅣䔥ü옶øã١䌪٥à٧ F䁩ٰ٥äٳáٷٷâ䀭䁩 h䷤䎥þٱ썬䅥䊢ٰ٧Øü høï십썫øÂ䂢䐣ٳíî䅣 wمþ٧û으䐡ٳí䐤䖼 tٰٷ # Y䂾䊢٥온مÿي쉥ٷø䔥옢슬 dم으䗥썱à١찰à٨쏡 t습䢢١à٧٦슡٥썬얰䆢 # Y㑩٭䐡욬앭웽í䆩잶䏥䢢١ nٰ으䗣ٰٳíí٠䀣àي # Y㑩٭썬콥Ԗ䀣àÿ٭썬얪١ # Y䂾䊢٥옶ä욫䓭䌢ïٱ옪윥 fä٦٭엫웨웽è쭬옭슩ã䐩䔭 # Y㑩٭䏭싫٧얱얢ÿþ䷤䅠옪 w옶앭ٳ䁥ã䐤٭䊢ٰٷم s䓭䓾è٥٥ÿ슰얪액 uÍ٨٬íçٴ١쟶ٰٷ # Y䂾䊢٥à슨욫ٳ䑭ٷû # Y䂾䊢٥ïΨ鐭䂮윭䅩í # Y䂾䊢٥옪٨ٰ䏭쉥썫øé䰡 pë䔩íù쭬싡٫싡èíé A슭٭씭ä슥栭ù٧䁩ٰ䓣 P䂸٫ٶ좓䠣Ï # Y䂾䊢٥á얢ø䏥ٴíè # Y䂾䂸ٓ켪䳭à얢쐪済٠ # Y䂾䊢٥âַï䂮ê옧ِ٢å c䁵ٳá슡쐪ê썬엫쭬쎥䆴 u٢ٳ䌺ê䰹쟶ٷ䖢ٴê a쀫٥윪ٰԷá䊿٬ٴ䗣٥ m٦ٰ٧쎥ѐ٩쐷ãٴ f䗤䖿䌪ٰ٠䔤䂿ٽٯíéٲم s쎭ïî䐩å䆥ٳÿ쟭䅩ù # Y㑩٥䏣䔥٫٥ä쉭ٳéù䌹䌪 s쟨䊿٭䕥䌺䅩îØ䌪 w씭٧øê٫썬쉭٦䗤䗣ٰ٨ M쐪øè옶øû䔣슡ٰ쐪ٰ s䋭䁩ä싡È옧øüê쀫옪 2٢䂻ø٭䐥䔥٨٭앭싫Í s䅥٧٦슡ٰüî옰õ # A앥䐸١٢䗤䑣íí䑩䗤䅠 b亣䀣욨䇣åíæ쟶٭썫øê䁹 h٠䐣ٽٳî䖢ٰ싡䊸ٰ욨䁭ù # Y䂾䊢٥à䎭ã䗻ü٥٠ # Y䂾䂸ٰ١䌪٥àٱٶم어ï oٳá쟭䗤䑣íþٶٱ䷤䏭å f䁵٥ÿûٰ٫٫䋣å䗤䔭í쟡 oíÿ엫쐪ٰٳÿٳ썬 mِ٭슬䌪ٰ٫䐤욥웡èٷ t䗤䎥ِ٫䓭䄣î썫øÿ # Dé # Y䂾䂸ٰ٪éã䂢٭ٶé앥ø썬 G쫫Å䂼䗣٦䑩٢ٰ梈 p촥썫쟥얲٦øþ쎭ٷ y٨ٗíٽ٧٦슡٥ü얢î䘨 oٰ䆡엱얢õ٦씱䒹í٦ o٫웱ã䁠싫ٳ䑹슰䌢ٰé٥ a욫ã䁾앥Ãø䌢䐥í٣á읳 a䐠ã䗤䅠ٷ٨슭٪싡 n䇥䗤䇻م쐩씭å䋭䂫䌢 w옪슰䗣ٰ٫éã䗤䑣쎬䕭䌸 s٫٧٦잨٠å䗤䇥م쌪 t웫䐸٥ٰ٪û # Y䂾䂸ٰٷéã䗤䑩Ø䌢䐥å쉭 fã䅥٣ÿ춪øãٷ䊿٥þã䐡 w٧윥٫쎬䀣í٨슱웭Å䌢 c٭䁹٫웨䑣û싱䎭얪ø١ l엱ã䕩ٴ٥ٷí٫썬쟨 B٫٫썬쉭쐷í٨읱àήٲ wøø櫥䌪م윩٭쉱٣ A쏥٩슰䌪䗣ٰ٪온þ썬 p웫츰õ쟡٭䏭슰䄾٪䗣ٳå a슭ٳþ쯥Ç쐪Á춢 # Y䂾䌢٫ٷ䌪٥à䇩ïÍ٬û٩䑥 u٢䁩얦٥ٲ䌪ٰ٢ٷ䰛ٴ䏩옳 føï٭쎭욫 # Y䂾䊢٥à쎭욫ٷ٫٫슭䊢٦ d # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y䂾䌢ٰ٪ÿ얢í٠䀤췁ü액䂻 føï٫썬ٷ # Y㑩٭䏣é㎡٧䅭싱٪ïî h쐪øè # T䓭ê٬쭬액٢䏩엫䇹þ s썫ëà䊢ٰ䇥䷤䑥쟫٨ÿ dí٣슨쭬씥٧䆢٢䗤䔩 # T䔭옶숱䔭ä䥾øâ٧٦쑡슰 r슫à썬ٰ١욥ٷø䁩ٰم p䏩슫íí٨٧ë윥 # Y䂾䌢ٰ١䌪٥î쏭Êîٽ٭옪 aٲ䅾û٣ë٫씫à욫ٷ oï٦䇣å썬읡ِ٣ٶ䅥썬 fþã䗤䀭ٳ웨鑩䄠٣윲 t옪é䎭䂼Øíå䅥ٳ䅠 s٫옷옪䋩슩䌪٦ِٳíäø t䗣٥ٰٰ얢øúè䌹䂠䌸 sÉ쐪øæ䑣êã옶씽ø f٧䌪ٴ䔤온ûٷٰ٩ l쐪ٷ䂼䖼øûØ䌢䐥å읡 g٢쎭٥îï٫썫ٶ䔤슡䗣 hî욶웽øè٬Í䊡䑥얢ê c䌹䅾øè䌪ٰٲ䁹쐰쎥썬썬 g٥ٴ䊢í٦쉭쟥얢썫õ액Ø t䑥٥쐩잡ã䁠ٷé䀣 fí٦쐷å䗤䀩٫䐹앥䔤웱 o䷤䅭䑥쎥٭옢û옪å٫쐰 oû٨í䂨٭䐼ø䗤䂠 h䐯읥䅣ٴ١ø䗤䐣 # Y䂾䊢٥ÿ٧٢쎭٨î䷤䔭옶 vû٧ٰ٥٭썬싫ٰ웡í䐸ê썬 hِ٫䆴å욶䋩䔩썬쎬䊿٧ a앫싱 # Y䂾䔭䂠䄩ٷ٪̿ٴ٨û o슬à٢ # Y䂾䐸í䗤䆢ø앥î䑣مÿ p٥øé싡ۇÎ쐪þ # Y䂾䊢٥î䑣ِ٧얢øþ쐷ï e으êÿ읱Á٭썬읱٨䂻ø䗤 f䆢䌪ٰٶ쭬얪١䊿ٰٳٽ٧䊢 # Y䂾䊢٥á얢ø앭ü٥٠ # Y䂾䊢٥à䎭ã䗻ٴíè # Y䂾䊢٥ø씥٫앭ü٥٠ # Y䂾䊢٥ø앭á얢ü٥٠ # Y䂾䊢٥ø䏥٩䌪ٴíè # Y䂾䊢٥ø䎭ã䏥ٴíè # Y䂾䊢٥à䗻٩䌪ٴíè # Y䂾䊢٥á얢à䗻ü٥٠ # Y䂾䊢٥á얢à䗻ٴíè # Dé # Y䂾䌢٥â䓾٥썬쟫٫䔭ٳ s٢䂢٫䋣å䗤䑣û옪슴٭ l싡ÿù䀠٫씭٥ٷ T䗤䗤쎬䎥à٥ü씥ÿٰ w쐷íí䆢þ٭䂢䪢٣액 a䔾䗤䔣洤쩱춱쭬ٗã䷤ S옪츪å䱥쎭ُ顣ã䢠䷤Á T쐷í٪욬얪øé슭٫썬쉶 # Y䂾䌢٥â䐤옦䂢䆭ã䗤䗣䌪٥ú슰 c䏣ÿ䄾䐠욱è얱얢ÿ tٰ١찢õë䇣øÿ䚣䎭䍣䁩٥䗣 c웥ٱ # Y䂾䊢ٰٴ٧٫썬촫ُ챡٭䗤 s싫٫썬윥ٳ䌪ٰ٧٭옪åλ t٫율è쭬䊿٥으ٰ썬쎡 # Y䂾䌢ٰ١䐥ã䗤䗤ٶ춪øíã䗤䗤 h䁩ä䐥ûٶ٢ٰ٠䕥 sÿ # Y䂾䇾䇣읫䊢øè䌪ٰٳ Jí䚣䀭䍣٨쑫ٽ䁾䚣䂾䐤ãã a쎥䊢øÿéã앥䑩䤭 a䐼䚣䀾쎡øøÿ # Y䂾䊢٠êû䋥ø䌢䐥ِٰí tٰ䌹䗣䗤䍣옪윥 # Y䂾䂸ٰ٬䓣얢íٳ䄾ٯ쉥䐹 b٠ê쭬앥ٶø䗤䐣옪윥䂢䇾얢 s䗣ٰ٪íû䷤䂥䐡٫슡쎥 # Y䂾䂸ٰ١䌪٥øٷ䎭䷭þ٫ t䕥 # Y㑩٭슥٩ # Y㑩٭슥䎭 # Y䂾䊢ٷ䎭 # Dé # Y㑩٫䐭웡䂸ٰ١䌪ٰ٫䐩쭬웡 eíٷè슫䂢䗤䏭þٰ䓣ِ t䍣ٰ٦é욨íî䑣 # Y䂾䂸٥æ䌪٨î䑣잡ü액䖼 tٰٰ٫썬엡ï䍭ٰٴ d٥øþ٥썬쟫٫썬욨 # Y䂾䌢٥ä욨䌺䗤䐩쿥웡䗤 r䁾ÿ٭쓱ã䏭웶þ T䗤䌪ٰٷ䊿٠ # Y㑩٥썬웫ã䗤䀠ٷٰ슩웽ø pÿ # Y䂾䂸ٌِí٢슬ï䌼䌢øÿ T䍣얢øÿ쉫٥ٰ٫þ٫썬욥٭ a웽øü슬䌪ٰ٧ïíٰԨ b䐣썫þø䗤䀭ً엥 pàٷøÿ앥䑣 # Y䂾䂸ٰٰ٫슫٥슰춪ãÿ쐷í٦û wíٰ䇣í䗤䁭ííٷã䬢ٰ٫ÿ a쎡ٴ٨ø䗤䐩 # Y䂾䊢٥àïïí䗤䁭ã슩䀭 T쐷íٷå䗤䑣û옰íٰ٬얢õ s # Y䂾䌢٥û액îã䌢䐥î싫ٳ a䌢ٰ٫î슬䀠䷤䌢ûü쐷ø a앥䔾銾è # Y䅩è͉䂾ٽ٭슴䆴 g䏭䧩á찷øï웭ã䂾䚣䐡 # Y䂾䂫얲٦䐥쏡٦ٰ䗥 e٥쀫쐷ÿ͟ # Y䂾䂫얲٦䐥쏡٦ٰ䗥 e٭슬ٍáٽ٥٣Ø쐷 tï # Y䅩è͉䂾ٽ٭슴䆴 g䏭 # Y㑩٥썬웫ã䗤䀠쎭٥î䍩 # Y䂾䂸ٰٳٰ٫썬컨ك앥䏭í cٰ٧쟨é䅣䔤쀫옶슰ß h쑭٭썬싫ٳ䗣ٰ١䂨䇥䏥䷤ r٫썬앭䅾øûٷ䗤䀭ٳ a쑥٦잨 # Y䂾䌢ٰٷã䂢ٱٷÍ٬䔣 s얢ú쉶으얱쐪ٰٳø䗤 eِٳٳ䊿ٰ٥ûΥ읫 # Y䂾䌢ٰ١ٷã䗤䡠Ë츪í t٠쐪ٰ٠䗣ٰٗ # Y䂾䂸٥ä싫٫썬췁ÿ얢íٳ욬옰øá o٥ÿ٦م쌪장웱쌴øøû٢ t䀤䅠웨à٧٦슡ٰ썬슫 # Y䂾䊢٥ûٰ웡썳앥䑣 # Y䂾䊢ٰنه쭬쎥䂢䀩䂾䀣䔥 sî䷤䅠쐷î䁵٥á얢è쟫Է g䷤䐸٭얲Éٰ썬췓íé # Y䂾䊢٥ú썭䀾䷤䓭䐩썫ûٰ t䐣 # Y䂾䊢٥ú썭䀾䷤䓭䐣쐷î b٥þ䀭Υ # Y㑩٭썬캨쭬٭쎬䗤䇾䴹ٶ tٷãä٩좨䂾䋥䅭è T䕩â䓭é췓í # Y㑩٭䑣ï䐩䐡욨䓥ٔ eø䗤䆭íâ # Y䂾䂸ٰ٦얢íٷêü # Y䂾䂸٥ä쑫٭䑣û # T䭉ٴ٭웨웽íٶ욥ԭ # Y䂾䊢٥ÿá٠٪䗣٥ø웶 # Y䂾䊢٥àف̛ٴٴîî䂢٫ t٫싫Íٷÿ쎫䗭õù䌺øø w٧í䖼٧ # T䇣䔣액쀫쉥 # Y㑩٭썬쬴䳭í٨䏩썱 # Y䂾䊢٥ÿኬïٔ䆴â䆭슫 a䔩 # Y䂾䂸٥율䊢٥ûÉ֓ü # Dé # Y㑩٥썬쐪٫썳앫ٰÃë췓 t䌸췁 # Y㑩٭䏣â䆭λ쉥쎬䀹٫٫슭 a٦䆢 # Y㑩٭썬쫫䠣싥쐪íè T쐷íٰîٷ䂫䗤䍣쎥 # Y䂾䐸å썡䁣옰øÿ얢í٨ï Hã䗤䔭å웥ι䓭䗩얢íè # Y㑩٥썬콡캬í٨ïÿ䏥í s옰øé얢í٦íÕïĸٷٰ٦ Aٱ쉥٨í쟶ٰ٥ # Y㑩٭䇩Ωï # Y㑩٫䐡잶î٥썬슫䔭ã䗤䡠Ë A잶ٴ䏩윥 # Y䂾䊢ٰق쫫Øû٥٧ٳ䀣 i٢쉥٫욶٣مä액 tٰٳ # Y䂾䂸ٰ١٫䐤욫 # Y䂾䏣䔩ê썬윪얢íٷÉ֓ï䢸ٽ få쉭٫앫䑹Ã䚣à쐷í٬䊢í c # Y䂾䊢٥옶ä䷤䑩ã엫ቨ욫 p䏥䗣ٰ١쭬엫䔭äü٧ eí٨ï䋣ø䂢䑣 # Y㑩٭썬쯡íٷéᎡٴ٦ٰٶ # Y䂾䊢ٰقË츨옶õåÿ aå䊡䀣䅣éí춪éٷ y䋩øè얢û䏥øê٫䗤 f䐡슰þ쟶ٰٗ욫مî䄠 eê썬슫䐥ã䗤䄾䂢슰䓭 dø䗤䆭 # Y䋭í䗤䏣윪얢íٷü웱쐰å jøï쑡ٰ쑥٥٥ٽ٥쉶١ t٧쮭ٰïõï٦䖼 # Y䂾䊢ٰهٔ䢢٫䕩ã䓤 q٧í٨䄠û٭싡䁵٧ï٫ mé쐪î쎥û٧٫슫ٷ䌪٬ r٣옴ã䕣ã䔥䓭 oٽ슥䏩쎡٥ٶÿø䗤䆭 # Y䂾䅣䚩ٷü䷤쐷í٣ tٰٳ # Y䂾䊢٥ú썥٧ٳû٥٧ã䎭 d싫ٷ䯭٫싡옪쀡ÿ iٳ䁾٦ã䀭٨å싥 lü٫욫쭬싥윢å䐣ٶõ a䂠ٰٰ앫٢٥üã䄣ٔ쟥얲 yä٥ë슨䔩ٰ٦ٰ٪í s쎥ê٥âî䂯ٰٶ䌪ٰ٧ A썶䏩윥٥ٳ # Y㑩٭䐸䐠䓭찰å䕩ï쑡 # Y䂾䊢ٌٰ䌪ٍ䊢ٰ٠ٴ䌪ٰ٧ Dٳ٢얱옭슡쑡䎭ٰ䑣 e욫٥ٽ䑣䷤䔭옪욡٥٧ wíٰïã䊯츪ù䓭䆴썫øû # Y䂾䐸ã엥웶êíٰ٢ã욭 c䔤쎥䂾싥얢á싫Øî w䅣١䂫䁵٥ä슨ٳê쟶ٰ٧٥ i٪ٮ웡썬엫䂢䐣쎥䌪ٰ٧ # Y䂾䊢٥à쎭ٶ䁩옪욬슩䄾 pêٰ٧얢øþ䷤䏭å䂼ٷ f䐡슰éٰ٥â䓭䗣ٰ٪ A앥üïٳ # Y䂾䊢٥ø٪̿٧øíٷ٫싡 c䑣ِ٥٭읥ٳ䎥 # Y䂾䊢٥ø욥ã䗤䐣슭٫䐻ٳ䑥 W䊢ٰ٩٭욶䏩䂾䗤䔣溣䫭Ê LÞ䔥ü액䆭íû온䗤䁭مø c쎥쎫䗭õÿ٫٫썬욥 # Y䂾䐸ã앥䅠þ썥䂸ٰٳ١٫ LÞه䡩䚣êٰٶè䂡 fíÿ٭앥䐥مë䓭à١ a썬십슫䐤䢢䏩슬쌴í t䑥䍣슭 # Y䂾䂸٥â٭썬욥û٢٥íٶ십 T䂥䊿٢쎭٩䂢䐼٩쐰èٰ슡 a읫ٷ٨âø䗤䆭쭬쉥 tٰٳ䊿١ # T䏩쐷ëú엥íø옪쟥䌪䂠 vÕï٣읫䁹䚣䔣웡í썫ï٦ # Y䂾䐸å썡䁣옰øÿ얢øÞ # Y㑩٥썬윥١٫䏩쉥옰í٬䊢ٰ٢ # Y㑩٥썬엫䆨ã읥٧ # Y䂾䊢٥èëî䔣ÿ䆣íî䔭 sè쟶٥âΨÿ # Y㑩٭䇾䐼é얢íí٥ÿ䑣î # Y䂾䊢ٰٓ٥ï읥ٶ䔤으슫 dãø䗤䆭 # Y䂾䗣ٰ١䌪ٰٓٳøþ윪٭䗤 o٬ÿ䓣ï٨üØ٭ n٨æ옦䗤䗣䌪ٰٷ䪪ٽ٣쌴쐰 m웡èٰ잡웥٠ # Y䂾䊢٥äᏥ욥ûٶ䑥얲٢ mٰ욱䊢٥ÿ䌪ٴ٥읭٫ yä䷤옶온ٰ٨٥썫é䐥쟫 süِٳé䊿ٰ䌪٥ë䀭 Y䀭䓾䍣ٷ윥䌾ٳ # Y㑩٥썬윥ٴ얢øË䠭ِٴ䏩 eíû # Y㑩٥썬쎡ٴ얢øË䠭 # Y䂾䂸ٰ٢䌪ٰم옪å웶䐸 A٫٨ÿ # Y㑩٫썫얢í䆢웶䐸Ø٭䋣 iٰ٧٫ # Y䂾䊢٥þ썬슭٥ٷã슩䀾엥 c䆴윥Ø٭䋣å䗤䅠 # Y䂾䊢ٰك캬䐡욬옠䗤䤣 Cمü액䔩 # Y䂾䌢ٰ٢ã䗤䱭䱣ٍ쟥䚣䂾䐼 *Ãٰ٢ã䗤䱭䱣 # Y䂾䊢٥è٨ٴ٦쭬챫É䊢 t䑣û옶썬얩쎫 *ííøÞٗ *ÀÃ쪴ْه뼪 # Y䂾䂸ٰٖß٥â䏥ٷ욱읭 aٰٴ䷤䆨ã䗤䐸٭앭ٳ䐸 a䌸읡û䊢٦䑩ٶ춪øêÿ oٰٶ썬쉥욫䆭 # Y㑩٫썬윥ٷ䌪ٰٶĿٷ # Y䂾䌢٥à٥썬엫١٫䏣Â֗ïØ l쐷í٥à٪얢ÿٲ䏥슴 A٥ٰ욨䇣ï٦읥å䚣䄩䎵 # Y䂾䕩â䐧ã䗤䓣얢íٷþ # Y䋭üٽ䁣í䗤䀭û # Y䋭üٽ䁣í䗤䇭û # Y䋭üٽ䁣í䗤䡠Ë # Y㑩٥콥쫡䌢ٰ٪ÿ얢íٽ٠䀤 A쉥욫䔩íٰ٧Ŀ١ # Y䂾䂸ٰ١䆢䌪٥þ٦䓭å䯣Þه # T䐸쐷âù # Y㑩٭썬욥쉥 # Y䂾䌢٥ÿٶ䌺웡䁭Å䗤䀩 oٰ٦٭썬욥ã䗤䆠 # Y䂾䌢ٰ٬ٴ䌪ٰ٧쐪øî S액٠䊢øë # Y䂾䊢ٰ٫ï٫썬장ã䗤䆠 S액ٱ썫øø䂢䗣ٰٳÿ䚣 føå٧쐷í٩䌪٬٨썬 b䂠٧٭썬䎹ÿ # Føå䗤䎭à٨쒥䔥 sã䀣읥옷õáٍ썬ٴ䗤䀣 a䓾î䐤䑩䁩䌢ٰ٦ # Y䂾䐹٦䗭äٳ䐤쐶à a䎩ã䅠 # Y䂾䊢ٰ٧얢øà䎭쭬쉨ä옶 d䗤ÿîÿ٧îٽ액 # Uٰ٫í٫썬쑡䐵䗤í슡䗣 hâ䎩ë䍩å䊿ٷî T䗾옪웱ííú䐤٫잶ø e٦íٶ䇭ÿٳøÿ웱 a앭쀡䄾٩䐸욫 # Y䂾䍩øé얢øáٝٷ썬웨 oٰ٦ِ䂾䇩 # Y䂾䂸ٰٳ١٫썬앭áن썬 s٢ٰٳíø䓠䁩ã v䂢䁾쉱ü Tٰٳ䊿ٰ٭ë # Y䂾䊢ٰ٭ë䌪ٰ١찪øï䊿 a앭øٳ䐤ٷ٦ë䎩 g액옪쟨십ٳ䍩䢿ٰ٪쟥 tٰ٣쐰ê٠䌪ٷم썬썶٭ a쑡䌪٦쎬䀭٦욶ّê a䐹í䚣á얢øâ䅭쐪øä T䆴å䗣ٰ١ # Y㑩٥윪얢þ옣 # Y㑩٥쑭٭싫 # Y㑩٭웱 # Y㑩٭쏥 # Y㑩٭쟫 # Y㑩٭쟫 # Y㑩٥슨٭슰 # Y㑩٫٣ # Y㑩٦øë # Y㑩٭욫ï # Y㑩٭콡Þ # Y䂾䊢٥옳슨윥ֳ䀭 # Y㑩٭컭ه # Y㑩٥썫얢ÿٴ # Y㑩٭챥٫촭 # T䀾쐷êøÿ٢ٽٰ쟫 # Y㑩٫윥٦䌪٢ # Y㑩٭췱ã䤣Þ # Y㑩٭챥٫촰Ç # Y䂾䂸ٰ٦얢øüû䁾٪ # Y䇥ĸ٩䊸 # T䇣å䖢 # Y㑩٥쎡١٫쭳Þ # Y㑩٭윥ٴ # Y㑩٭쎡ٴ # Y䀠䖼ٰٴíÿ䗤䗤䋣í䗤䗣 # Y䂾䌢ٰٳ䐥ã䗤䅥䊢ٌٰ䌪ى # Y䂾䊢٥àÂ֗üí쑫٭썬쟨쭬쑫٣ dø䂢ف̛ٴ # Y䂾䊢ٰٗß캬 # Y䂾䊢ٰٓ䰥Ïã䗤䫭ã䗤䮣Ç # < # Y䀭잡웽øÿ # Y㑩٥۝ # Y䂾䊢٥æ䌪ٶû욶é # Y㑩٥쎭ã䓥 # Y㑩٭읭䓭 # Y䂾䌢ٰ٦ã슩䀠욨䓥 # Y䂾䊢ٰ٦얢íٷüû䏥ٷ # Y㑩٭읱䑣þ # Y䋭ïøíٲ䏣䔥üü # Y㑩٥쎡١٫챥٫촭 # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Y㑩٥웶䌪ٴ # Dé # Y䋭ïøíٲ䏣䔥ü # Y㑩٥윥١٫쵫ٌ # Y㑩٥쎡١٫쵫ٌ # Y䂾䂸٥ï٫䋥Â֗üíí٨ف̛٫ # Dé # Y㑩٥캫쳱 # Y䂾䊢ن # Y㑩٭쪳䠤ٖ # Y㑩٥윥١٫쭳Þ # Y㑩٭쪨ٖ # Y䂾䊢٥ÿ䀭٥í٨þ # Y䂾䊢٥ÿ䀭٥íٷٴ # Y㑩٥쓱٫썬䐩٧ # Y䂾䊢٥à٨ٶ캶à엫Âíß # Déï # Y㑩٭슡É֓ï䂮썭䀭 # Y䂾䂸٥û쉨䊢٥ú썭䀭 # T䀭٬䁩䗣䗥썫ë䅹䐣 # Y䂾䊢٥ø욥 # T䀭ٶ䊢í٩䌪٦٠䆢 # T䐸٢ãøíٴ䌪ê읭ٷü # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y䂾䊢٥á얢ø䏥ٴíí # Dé # Dé # Y䂾䊢٥á얢ø䏥ٴíí # Y㑩٭엥ï # T쐷âä썫ïÙ얶ٰ액䗤䓥 # Y䋭ïù䗤䓠옪얱얢øü # Y㑩٥슰䊢䂮앥䑣 # Y㑩٭쾭䱣 # T䓭䋩å䁠䁵٥þ䀭Υ # Y䂾䂸٫١٫옪åâַü # Y㑩٭욥û쎥 # Y㑩٭쪫ٖ # Y㑩٭춶ٖ # Y㑩٭촭䠭 # Y㑩٭츨 # Y㑩٭쩨Þ # Y㑩٭콥Ԗ # Y㑩٭츶Ä # Y㑩٭쪬䱣 # Y䂾䊢٥à슨욫ٳ䑭ٷû # Y䂾䊢٥ïΨ鐭䂮윭䅩í # Y㑩٭츪 # Y䂾䊢٥á얢ø䏥ٴíè # Y㑩٥쮭޷É # Y㑩٭촭Ï # Y㑩٥쎭ã䓥 # Y㑩٥썫얢ÿ # Y䂾䊢٥à䎭ã䗻ü٥٠ # Y㑩٥쫡 # Dé # Y㑩٥췁é # Y㑩٥쪓é # Y㑩٫쪓ÿ얢ï # Y㑩٭슨욫 # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y䂾䊢٥ÿ䀭ٳéٰ썬엫䂢䆭 # Y㑩٫췁ÿ얢ï # Y㑩٭욫 # Y㑩٥쟫٭쉥 # Y㑩٥쓱ٳ䔭û # Y㑩٥웶θ䕥 # Y㑩٭캬얢Î # Y㑩٭쵭䳭 # Y㑩٭쟶䌪ن쫫 # Y㑩٭컥Þ # Y䂾䊢٥á얢ø앭ü٥٠ # Y䂾䊢٥à䎭ã䗻ٴíè # Y䂾䊢٥ø씥٫앭ü٥٠ # Y䂾䊢٥ø앭á얢ü٥٠ # Y䂾䊢٥ø䏥٩䌪ٴíè # Y䂾䊢٥ø䎭ã䏥ٴíè # Y䂾䊢٥à䗻٩䌪ٴíè # Y䂾䊢٥á얢à䗻ü٥٠ # Y䂾䊢٥á얢à䗻ٴíè # Dé # Y㑩٥쪳䳣 # Y㑩٥썫얢ÿ # Y㑩٥윪ٰ쭬Þ # Y㑩٫윥ٷ䌪ِ쫫 # < # Y㑩٭쟫 # Y㑩٫잶ç # Y䂾䂸ٰ١䌪٥øٷ䎭䷭þ٫ t䕥 # Y㑩٭슥٩ # Y㑩٭슥䎭 # Y䂾䊢ٷ䎭 # Dé # Y㑩٫슥䁩 # Y㑩٥웶þ # Y㑩٥춧䵥 # Y㑩٥썬웫ã䗤䀠 # Y㑩٥쭬챫 # Y㑩٥썫얢ÿ٭웥٫쭬챫 # Y㑩٭욶욬 # Y㑩٥액䁵ٳԭ䇣 # Y䅩è͉䂾ٽ٭슴䆴 g䏭䧩á찷øï웭ã䂾䚣䐡 # Y䂾䂫얲٦䐥쏡٦ٰ䗥 e٥쀫쐷ÿ͟ # Y䂾䂫얲٦䐥쏡٦ٰ䗥 e٭슬ٍáٽ٥٣Ø쐷 tï # Y䅩è͉䂾ٽ٭슴䆴 g䏭 # Y㑩٥썬웫ã䗤䀠쎭٥î䍩 # Y㑩٥쎡ٳ䌪ن䤾 # Y㑩٥쌪슡 # Y㑩٫윥ٷ䌪ٰن䤾 # Y㑩٭컱Ï # Y䂾䊢٥ûٰ웡썳앥䑣 # Y㑩٭컥캥 # Y䂾䊢٥ú썭䀾 # Y䂾䊢٥ú썭䀾 # Y㑩٭썬캨 # Y㑩٭䑣ï䐩䐡욨䓥 # Y䂾䂸ٰ٦얢íٷêü # Y䂾䂸٥ä쑫٭䑣û # T䭉ٴ٭웨웽íٶ욥ԭ # Y䂾䊢٥ÿá٠٪䗣٥ø웶 # Y㑩٥쭫ã䱣 # T䇣䔣액쀫쉥 # Y㑩٭썬쬴䳭í٨䏩썱 # Y㑩٭쪰ه # Y䂾䂸٥율䊢٥ûÉ֓ü # Dé # Y㑩٥썬쐪٫썳앫ٰ # Y㑩٭䏣â䆭λ쉥 # Y㑩٭쫫 # Y㑩٭쉬䁣 # Y㑩٥콡캬 # Y㑩٭䇩Ωï # Y㑩٫잶î # Y㑩٭쿨Þ # Y䂾䂸١䆢䌪ٷÉ֓ï # Y䂾䂸١䆢䌪ٷÉ֓ï # Y㑩٭츶Ä # Y㑩٭썬쯡íٷéᎡٴ٦ٰٶ # Y㑩٭썬쿥䤾 # Y䋭í䗤䏣윪얢íٷü # Y㑩٭썬캶쩥 # Y䂾䅣䚩ٷü # Y㑩٭썬쫥쫫 # Y㑩٭䐸䐠䓭찰å䕩ï쑡 # Y㑩٭썬챥٫찧 # Y䂾䌺øÞ䫫 # Y㑩٭쾶䯭Þ # Y㑩٭싡싫٧ # Y㑩٫슫䐥ã䯣Þه # Y㑩٥윪얢À쫭䠭 # Y㑩٥역䊢٨íو䱥 # A쏡٪옪썶액 # Y㑩٭쉬䁣 # Y㑩٥썬윥١٫䏩쉥옰í٬䊢ٰ٢ # Y㑩٭읥٧ # Y㑩٭읶웥 # Y㑩٭얨슴 # Y㑩٭썬쮭 # Y㑩٥앭䓥 # Y㑩٭쾫Ï # Y㑩٥썬윥ٴ얢øË䠭 # Y㑩٥썬쎡ٴ얢øË䠭 # Y䂾䂸ٰ٢䌪ٰم옪å웶䐸 # Y㑩٫썫얢ÿ # Y㑩٭썬캶 # Y㑩٭쾫Ï # Y䂾䌢ٰ٢ã䗤䱭䱣 # Y䂾䂸٥䗣ٖß # Y㑩٥썬쫭䰸 # Y㑩٫썬윥ٷ䌪ٰٶĿٷ # Y㑩٫액䂮앭䓥 # Y䂾䕩â䐧ã䗤䓣얢íٷþ # Y䋭üٽ䁣í䗤䀭û # Y䋭üٽ䁣í䗤䇭û # Y䋭üٽ䁣í䗤䡠Ë # Y㑩٥콥쫡 # Y㑩٥윥١٫쵫ٖÏ # T䐸쐷âù # Y㑩٭썬욥쉥 # Y㑩٫䐡십٫䗤䁭 # Y䂾䌢ٰ٬ٴ䌪ٰ٧쐪øî S액٠䊢øë # Y䂾䊢ٰ٫ï٫썬율 # Y䂾䊢ٰ٨씥䷤옶싡웡쑡 # Y䂾䐹٦䗭äٳ䐤쐶à a䎩ã䅠 # Y䂾䊢ٰ٧얢øà䎭쭬쉨ä옶 d䗤ÿîÿ٧îٽ액 # Uٰ٫í٫썬쑡䐵䗤í슡䗣 hâ䎩ë䍩å䊿ٷî T䗾옪웱ííú䐤٫잶ø e٦íٶ䇭ÿٳøÿ웱 a앭쀡䄾٩䐸욫 # Y䂾䍩øé얢øáٝٷ썬웨 oٰ٦ِ䂾䇩 # Y䂾䂸ٰٳ١٫썬앭áن썬 s٢ٰٳíø䓠䁩ã v䂢䁾쉱ü Tٰٳ䊿ٰ٭ë # Y㑩٭썬쐪䀣얢øé # # /٨ /٭䐤웶䏭â /٭䏭ÿâ / # /澶 /ë٭앫 /ë٭어 / # /䀭 /٭䐡쎭ï읭䍩 / # /ٶ /ٰê웨䑣䔥íٶÿ얪í䆢䏥â / # /ٶ /ٰê웨䑣䔥íٶá얪í䆢䏥â / # /檰 /ٷÿ٨䇣øü /ٷÿ٨䖼ٰ٠ / # # /䓣 /ٳ쉫٭약䍩 /ٳ쉫٬٦䐸쐪øáä / # /䓥 /ٷú䓥٨䌢ٰ٢ / # /檪 /٬䄾쟭ÿ٦䗤䔭 /젤٥ / # /濭 / /٧٦엫슴䗤䅥 /ïî䋭䕭 / # /檰䗭 /٩ٷø䊡å䗤䔭þ "ã䁾à٭䗤䧭Ξ / # /٧򞶖 /٭옪é욨٬䔥åÿٰ٧ / # /٫ /٭옪é얽ä쎭٭ٷøï /ِÿٰ웡ÿٳ٫썬쌪䌪 t䌵 / # /䷣ /٥٥êþ䊿٫ۗØ䎭ä / # # # /٢ /٭쟫٬ / # /٦ /٭䐡웫ä /٭옪é٦쑡 /٭䐡웫ä /٭䁾٦쑡 /٭䐡웫ä / # /溬썶䁾 /ٶٳ웶éí䗤䀤ٲå썬 mمÿ쉫ã䗤䁾ٶۗÜø /û얢í٦ѥ٥è웡䀭䁩ٷ䂸ٰ٦ oٰ٧ / # /溬٠䍭䁾 /٠䍭䁾ٷøïÍ٩ٷ䊢 t䑣û싡ãã䑩Áà쿫 /þ얢í٪٦쉥䌺øï / # /洭 / / # /扨 /٭䗥à䓠쐪øü씱䔭 /üٷ쐪٢٣쟫䅩䐩 /٭Ԣ闭îٷ쌴ãã䗤䓥 bۓٓ /ü٣é온êøî䌪ٰٴ /٭䄥îٷ온썬쎥쌴ø䗤䋣 /ĺ䌺λøüÅ슬ù찰Ŀ䊸޷ / # /橬䓠ѷ䊢ٰ싫٫䔤ø윪 / /øãΪ፥٦å䓣٫٫썬쎡ٴ /٭䋹î٣٫٫썬쎡ٴٱ썫øä / # /檰 / / # /抬쟭 /ÿê䐩썫î䗾ٰ옰쀫٥ / # /޷í /٭䏥٥٬ /٭䏥٥٨î䗤䁩 /٭䏥٥٨î䗤䴹 /٭䏥٥٨î䗤䇣 / # /溥٠ / / # /扭 / / # /杶 /٬䄾쟭è䁭øû /ٝ٬䉹ú읶û쀫٦ h˙٭ްå /î얢í٬䄾읡٠쐷à٫ٰ얪슭 / # # /歶 /٦øٷ웽øî䂢䊢䚣䗤쑭 tî䚣䎭䀾 /øٷãê웡썬웶íî䚣û /젤٥ / # /扬䗾 /ø٭엫썫î䐩 / # /졩ù싰 /٭䅩욥٦䆵쀫쟶ٰ٢١٫썬싫 /٭䄩٧䁩ÿü쐪ãï /٭䀣ᕫ웡ٳí٪ /짩 / # /洡쐪ÿ䎭 /٭䎩䐯å䗤䇹å쟨슧싡 "쐷âøá쎬䗤䓥٨쑭썶٧ / # /毫옪㖶ë / / # /毡씥 /٭䎭䕩䎭䋩ِ٭䌢٭ r檢٧ø䑩䅾웥 /٭䎭䕩䎭䋩 / # / /٥٢î٬ /쎫ԫ٦ä웡٠â /쎫ԫ٦ä웡٠â / # /溥ị́䎣 / / # /櫱䇣 /ûâ٭웥î씥ٶ쐶٠ /ûâ٨øí٩䑹٭䇣 / # /歭٠ /ã쎥쉥ٰٳ䊿ٰ٥ø앫è /ã쎥쉥ٰٳ䊿ٰ٥ø어٠ / # /歭٠ /è쐷à /è쐷ã / # /橬䁣읫 / / # # /٢ /٥ٷ䁩쟨쑡 /䗤䌸슭٫썬싫٥ÿ٫웡١٦얲 a웱䌪٢ê / # /䀠 /٭䐥٧ä /씩䀠 /٨슭ï٨䓭웱ù٥ü얢 l싫 / # /䁣 /٭䐡쎫î쑡 /íå쎫î / # /檰í䰸 / / # /٣䍹 /٭䏭슴䍹٫잫٬ / # /è /٥٠䋩 / # /䋣 /٭䐥٬䋩 / # /쓡 /٭쉶ٮ٬ /씩䉩 / # /욫 /٥٩䀣쑡 / # /욬 /ü썶٧å䋩 / # /䆫 /٭䏭엡٬ê얢ë䆫 /â얢ë䆫äú / / # /ø /٭䉩ᜪ䗾䋩 / # /쏥 /٭䇩쉶䎥ú쑡 /ú쐷âþ읡얪íٲ쉭 /ê٭앭ٳ䔣슬ã䓣 /á쏥٠û䇩ï / # /ο١ /٭옪éä썬슭٫䓠޷é / # /쉽 /٭䓠üäå䌢٥ÿ / # /䓩 /ø䌢䐥à䄠ٴ / # /þ /٭䓩䑹䐼٫٫썬쟨 /è䊿ٷ䌹䌢٥üþ / # /슴 /٥ٶ䐼٬ / # /䀤 /٭䄣٧à٭䋩ã䗤䅠 /î쐷à䗣ٰٳ䔥í٣욬 /٭䄣٧à䗣ٰٳ / # /슳 /٭䄠ÿ٬ /٣䐻쐷ÿ٭䗤䂢 /ëٰٷĿ٬옪잭٥á䋩٦ٳ lïٰٷîٷ䊢ÿê /ٷ얢í١ÿ٨ٷí /ٲ䀠슳䊿ٷå썬옪 /䌥ÿ٭슰䊢øí / # /٧ /䂢䀾얢éٯà쑡 /씩䀾 / # /슨 /٭䓭ã䑹ÿ쑡 /씩䐠 /٭䓭ã䑹ÿ쑡 / # /약 /٭䇩à쑡 / # /슥 /٭䐸ÿ쑡 / # /쾶 /٭옪ã䐥٧٬ / # /٧ /٭옪ã٧䋩 /٭옪é٫ï쑡 /٭옪ã٧䋩 /춢 /٭옪ã٧䋩 / # /䑥 /٭䐡잫ٶ䋩 /씩䑥 /䗤䴹䅥٭䐡잫ٶ / # /ᕡï /٭䅣Π䀠٬ /씩䀠 / # /썶 /٭䄣ÿ䌪٥ø쑡 / # /䇾 /٭䐥٠٫슭ã䗤䄾٬ / # # # # # # /ٳ / # /쎥 / # /䁠얭 / # /䁠얭 / # /û / # /û / # /滱 / /웱íÿ옶í٦ã䅾쟨 / # /汫û /쟫䆯ä썬øï / / # /殥ٳ䐭 /ٷÿ쐷é쐪øû / # /웶䈩 /٭䗥îٯ٬ /٭䗥îٯ٫썬슬 / # /渪 / / # /拫䌢٧ /쬂ه    /좊쫋ٗ / # /捡䁣 /ø٦å䆡 T䓤쐷þ /ü٦å䌯î잪챡å䗭䆴 tٷ٥썬얰䆢 /ø٦å䆡 / / # /歡 /ü٭십 /ø٭얱얢ã /ø٭얱얢ãÅ䊿٦è / / # /슨 /٥ٷ䏩ÿ٬ / # /٬ /٭䐻쑫䋩 / # /满 /٭옪í䁩䍩Øî쑱쉶 aٰ٬ /٭옪é٦٪ / # /滨䇣 /٬٦èî٬ٰíë䂸ٽ䂼 /í٨î٠٭쐪í٠䐠 / # /潶쮱 /䗤䀣쮱å䐠ü /ٷ쮱å䂡䗣䚣챡ûٰ쐪õø dÄ䔭쀫썫曡썬읭 /Û䊿ٷã䚣øÍä잡욨 /Û䊿٫쟡슰䁩ٽÍø으٭ m٬ٲä /Û䂠٬ٽ٭쑭잶젫욥쟡٬٬٦ oٽ䍩 /ï캶ه쪨쪩젱 /䊿ٰٷ٦䌪٥èÛ / # # /䁥å䀭 /٧䏥٦䊿ٷ٬䐥 /٭䏥٦䊢ٰ٧ / # /ã䈩 /٥ٷ䈩ã䗤䄾٬ / # /濫 /٭䅣ã䐼쏭쎭٬ / # /滥ë٭웥ᚥ / / # /枪䊢ٴî / / # /á /٥ٷ䌨ᚫ씱䋩 / # /욥 /٥ٷ䗥ï٫썬슬 / # /ß /٭䏩䐭ä / # # /웫 /٭䇹٨Ԧú䋩 / # /웫 /٭䇹٨Ԧú䋩 / # /ٳ鐭 /ÿ읫٭앫 /ÿ읫٭어 / # /ٴ /ٰ썬쎥٭䅭쉫 /٭䅭쉫ä / # / /٭䐡쎬ä / # /溥얪èٶ / / / # /滭 / / # # /٩ï /٭䋩٣á٧䋩 / # /ÿ /íٷ䄾ÿ٭잨웶 / # /䐼 /٭䓣ÿ䌪ٴ䒹٬ / # S엡å䠣Ïٳã䋭ê٢䊢 tíëٰ쐰å䑹䗤ÿ쎬윪䂾䍩 síÁ٭슥ٰ쎫٭썬욥Åٳ䁩ٽ䆵 a䋭䧥٩쎭٪ف٧䐤ٳ y䗤Å٨䂸٥ٰ٨٫윥ٳÍ쀫 s١íø䇥䊸٢ (䚣䄩䐸ٰ٫쟫슫٣٬ GÀ - # A앭èٳ웭쒪䁠ٽ䔭 # A앭èٮ䔭٥䀣䐭䚣ø٥à a䂸ٽٳáïíþí # T쐷íٰ٨읳䊢ٰٶ䔥õ # O䐤엥䈢쐷ø䂸ٽ # Nã䗤äõ # O䌪ٰ䄩õ # A쑫úٷ # T쐷â䔭䗣٣썬٠ # I옩ù䋣䚣䂾䅭Ùïü䌾٪얦 # I읫䈢å䅾ãä䶿䀣䓣٫엥ٷ iٰ٣٠õû썫ë # I읫䈢äø䂼썬ٳ䋩 # I읫䖢ٰ # I䄭ٓõï썫éä # S٦ٍí䍣䂠䗣٣䎣è䔥þ䗤 lèã䚣à # I٭엫쉭䇭ٍ쀫쉶쀫쎭٨쟥٭쉭 # Iٽٴٷ썽ٶ썬洩 # A䚣䗾ٰ욥䗤䁥 # T䁥å䅾ٶâíõï䀭쐰â䎭 wõøٔٽ٩øà # A䚣䗾ٰ슫읡ٳ䗤䐢 # Y䀭쒭ٰٷ얶è٭옳䌾٥åã䂢 lø䷤쐷íٳٰ잡웽웱쀫읫䋭øâ r십䍣 # Dٽٶ쎥ٰ숱٪ # Y䅩å䓥䂢䁾윲䁣å䚣î # Y䂾䂠䀭å # Y䀭웡ÿ # T䁥ûù쎬ٽ١䁹䂿ٽ٥䊸٦ d옪쀫욥ï٭ # Y䀭䀭썬웭䁹䚣䀭٧å # T쐷âä쎭٥à # Y䂾ĸ٧䊸 # T䏥٦䂸䗤䄾슪íå䂢٥쟨 dٰٷí # Y䋭â䈩 # I٬٪앫 # I읫䈢äø䏣ã䖢ٷ썬 # Iٳ٥٨ # T䄾쐷âà # T䄾쐷âù # Iٳ٥ٱ # Y䋭â䐣٫앭 # Yà쐷âã # Yà쐷âã # T쐷â䔭䗣٣ٴ䗤䁩ø䖢ٰ٧쎬䊿 pæ옷û # N䋭 # W # T쐷âä썫í # T䏥٦䊿٪٠찰웫٠ # A썬슪䁣èްû옪쐷ú읥 # Y䈥٥à䇻 # Y䂸٥à䇻٦٬읫ãã䗤䔭 # Wû亣î쑥 # Gø웱썬٭옪ãûᖱ씥䔣 # T٩øû٨䥃䡙콋찊켅䭃 U䬞ـß쉨䍭áø쀫썬í䎭䐣 m쎫ÕïÿØ쵅٫콖و䌾ٔو䪂ٗ Sãä슭١䅣䊢썬싫슧øî Y䀭䗭ã䇾á얦웽ÿ䷍Î츊쵅 eØ䏥û쀫옶욱䋣ÿÅ䌾ٮ Tٶٰ٠䇩䌪ٳõí슥쵋 oو젫욥온و䪂٫쵋م옴얦ً u٧䂾䫉䲙쪇Î䷉ّ Uß٥ٖ䷤䏭ٰٷ䌾ٶٽ c䓣쭫ëê욶êíٰõá쑥 lå报٭썬웱䰣âθ쐰䂾䁩 lâ쎬䚣䅥øِíï٢ٲٴ l옦䗤䀭앫٥٨ٍ쀫슡ٰ쑥٢ a䗤䗾ٯ䏣䂾٥û䐣율 m䋭ٰ쀫Ѣ٥î (ûۣèްé䁹䚣䀭䐭䥉Î쭋Èã T컋م콋مõïùïã䂢 bِ٥ـٰ # I٩ # I٣䚣 # O # Y䀭쌪øç # Y䋭ïí䊢ٷ䏥٬íûٱ웥٭썬 mü # I읫䈢ûٰ٧䊿䁹䋩٪슰ïþã t䐹䅣䏣ٍûٰٰٷ # I엡٩䇩å썫è䗤 # I욥얪ٰ䚣䔤õÿí䚣䎣í٥٩ tÅ٧썡ٽٳþ䗤٥ # I욥䎭íÿ٫٫썬 # W # A䚣䗾ٰ잡쐪ٰ٧ # T䄾쐷ú슫䂢䋭쑥ٷà亣䀭 e쎭䈩íø٥٪쒡٪쎫䑩 l䆠쟫썬쒡 # T䗾얢øê䂾䏭쑥٫٥٩쎭٥ o٣ã䓥ã䐼Ø٭숱웭얢ù g䏭䁥옪옷슥ٴ䍣䁹٫ v䐣䷤ø얢õ쏭å䒹싡î a䗤䏩䁹䗾٭숱䆭å䚣䇩٥썬 s٥٦î # Ů썫Í 읡웽Û䠾 䗣ن웽Æَ 슰웽Æـ쩫 썫úî䱣ٖ챥 Ů䚣䏥å # D䔥슬å䒹쐩䦺û䐤 på䖢 # Bþ읽 # I䂿٧䂿ٽ٥ # Må쎬䕭ٱٳ슡٢䗥ø䗥å c찰ïî䅣옪٦٭쟶íٷ䌪٥è p䏩䇣ø䔭 # Yê옶엫쎡 # I썬쓱٨䎵٥ # T쀫٭쎥읡 # Y䋭ø٥è٢䗤䐸Øûٰ슰٫ m웱쐷âù찰å䆴욫 # T䁣٭엫윩 # R䗤䆠à쐷âü싡츪 n䆴ä # Pيٱ쑥 # Yî䊿١íøë䊿ٳ # Y䀭쉫ٰ # W쐰 # W쎥 # O٠õÿ썫ä잫õ쒭ٍá٦옦ٰ hõã웱㕩٪þ䇣ø웡ـ쀫쎥٩ tٰٰ싡쀫 # A䑥䡹䇣웨䎩٭슫䄣û *Ü Y䂾䆢å욨䌪٫슩캫٥٣ y䆡٢䗤䐡옪쟭 # Y䀠٫䚣㕩٠䊸٥ٍèĸٯ䋣䏣Å٧ kø쌴ـ쀫쎥٩썫øþٽ٥ # O엫쎬䇥쉱씽ã䐡ݜ E٠쐪í٠ï٫얶ÿ # N䚣㕩ٶ읫٭䌹䌪٫슩젫읫䆴 mٰ읫í٠싡䔥䂢䌾ٷ읫õ # O쐢õľ䐣ٷ읫å䚣ٍġ٨ # # # # >䮩䗤䂾䑩ê # S٦ٍâ䏣ٷ䗣ٶ䋣䊸ٳٽ٣٬ # I޷øäÕĠ䋭ø䇾ÿ٢ # Y䀭잫øí٨슰䄾 # I웡쎬ٽٳ䊿ٶä쎭ٽ # Y䇣쟭썬䗻銢ÿ # I싡ٷٽ٣옧øî䊢䌪ٮ # T쐷â䔭䂯ٰ٢ # Y㑩٪٧䂢 # Y䂾䀹쑫썬쟫 # I޷âä˥씡üêøêن䚣 hâ䁥ÿ # T䐢쑥엫읡ٽ䁥 # T䍣䋩å䔭썫é䜼üõ # Y䅣읳윥얪٧췫쀫돡á쑭Ӗ٩ # Yï쐷é٥ٰ٣쐷ÿ # Y䂾ĸ٧䗤 # I읫䍩øøٽ # T䄾٭쎡옪썬옭쐷ÿ # Y !"#$%&'()*+,à쐷âãîøë٢䗤䔭쐷í bٍ쀫쉶쀫옶앭ø䅭å䓥 # Y䋭䂢䎭 # D웡þ # T䇣å䆴싱䂢䑩䗣٫ # T䓠쐪슬èåà䂢䂿ۓ # T䋥٥ٵø䑹٪٥ٳްî # T䌥䋭䅾쌴øä䐣ٰ䗤䇣û엫씫 aå䑩ÿ윢 # T䓠쑥으䇩þ٥٧웡ü䅾 # T䇻ç䕭٥썬ٷ썬쎥䌪ٰ٧ # S쀫닡ï쎫䅥䗤䗤䗹ٳ䚣 Y웡ٰ䊢옪읶ٷ # Y䀭쟭썬٢酣ï썬썬٨쉥 # Y䀭쟭썬٢酣ã䗤䗤à䓭 # I옠õø䓹䇣øï웡ãåǗ # I옠õø䓹䇣øã䁩٫٭ݛ # Y䇣쑥٥䐸١썫ã썬욨 # Y䇣쑥٥䐸١썫ã썬얽 # A잨ü٢ãã䗤䀠íþ٥쾫 tá싡î䂢٫˅٪ûú잫٥쐠 b䴤å䊿䊸٬٪ٷٷ䂫 # T䌵٧어䑩엫웱얽å찰 pÿٷ䂫 # Y䋭ïí䊢ٷ䏥٬íêٽ䔭 b䁵٥þ䀭Υ젫옶엫웥٭썬씥ٴ # T옶쟥䑹â䅾øè웡õ # O䅾øÿî䚣䓣웡쉭櫭ä h٧㏠ٮ䗭íø웫䂢䋥å䂻û씡 c읡٭썬씥챡ÿ쀫ٰ䂢䕭å t䄠 # A슡úٶøøïٷ٧ sم٥١䊡䗤䮭à # A씽þ쏫䄾٭䏥íí 淤é쐷ï쩨àٲى䬪 # I٨í䗤ٽ޶읡Ûٷ옷äå슫ïٰ c䗥íÅٰû㏠ٮ䀭å읥 # T䐩ٲåې٧䊿٪٧Í䗤䆯 f썬䊿٥î쟨䌪٨䘪䐡쉱٫얶 sÍ䚣é싡ٽ٨䂾٥٢ # T쐷í٨䆴٥٥ø酣ä옴쐪øê w웱썬읳쐪øþ젫씥䗤䗤䋣 a䅥õ쐪øÁ춢쎬욬٦䌪 fé٧øï䂨٫٭䗤䐹 # T쐷í٨䆴٥٥ø酣ä옴쐪øê w웱썬슪å䗤䑹Íٶã䎣٨䓣 iٰٰ٬è䆺٭쐰쉥䊢쀫 # T쐷í٨䆴٥ٽ٥ٷ䐼í䗤 w얢øþ # T䑩싱äí썬읳䷤옶엫슡 t䏥٠٭썬싫ٳ䚣촫٫썬ٰ k٥쀫䢠䌪ٰ䄩䚣 # O䏩썬쉫ٱ٦䂠 # I읥ٷٳ䚣䔭å䂾٬䐣 # I䍣䐹û쀫씡٦ّۗ油쐢õû썫ë u # Y䀭잡썬䅾ä # Y䂾䁩쟫٦䕩à䗭î # -ًٌِ츀ˍ -䡵ٍٓ A쎥얶è٦쮭캶䂢䏭 s싡䂢䆴î䧣䴣옰ß쬪 A썫àÏ䌾úûá얪í a싡٧٧캫هû٭䓭ã䨩Ŀ M䠭쭬ٲ٫썬장٭䗤䎭á a쉫얢øøԨ享쳱Î S캬þ䆸٦٪٩䎣 D䴣옪슫٫옰ß앥䑩䓣ã t䌾ü옪잶으ٰ٧쭬ٲ oٰ٣䊿ٶ䁵ٰ٩ٷã䓣 Sá٥û읫٦콥䯣û٥썬쬪 oه䤾ß䌪نÀ䂨쐪썬 s䆢ííã䗤䀭ã䗤ÿ٫쵫ٖ (Þ䠾䳭Î쾶윰 T䀭ٴٳ٥å䏭웽í䂢쎶 T٥٫䗣ٖÁ٥ـÊ웫٫ã f䐩䐹åٰٖٖøø b옪썬쟡ٓى䗤삢䂼 gٰ쭬ÁÏÈ썬쾶䡾콥 HقÎ옪윷Í䗤䑩íã䢈 # Dٽ٭쎭ٰ숱٪ # T쐷âä쎭ٳø䅥øú # T䐹٧쐪øäè䐤썬쏥 # I٭웡õ쉫䗣٠썬 # I읫䈢ä # I٭썫쟥쌴êõø䑩 # Y䈥٥à䇻䷤䁣ú쐪í٧ã䄾 b슩 # T䐤쐷ú슰íå䊡ٰ옰 # WĿٰ٩٧ްõþ䭣䚣웡ٷã # T䂴䁣䋭٫ٰ٠䗤슧 # T䇾٨þ䍭亣웡٪ٰٰ잡웽 # T䏥٦䂸䗤䄾읶옪쐪í䂿٢ gîٰ䀥Øí٦䂻 # Oٳ # O쟶٪٫㏠٫䇩íٴå䅹øêٰ y䀣ø䊸Ø䄩䗤䅹è슥ۈ # T٥٧þٳ䗤䑣옪쑥ٷ䂿ٰí tã심ِٰê٫ٽ䁠윢 # T䗾읡ïøí으٭욥íø䊸 b읡ٳ䁹䊸޷âú윪 # T䗾욥쀫ٰ䂢䐯í얱얢ÿ # T䗾싡썫àõï # T쐷â䏣٥ٳ٥썬욬 # Jí䚣䑩썬얰䐥썬웶îîø w٫썬웡䔤쎥슰䅣쀫옶ٝ sèêÿ웱옷øî䀣쀫 s䁭íê쐪ٰ٧ # T䁩àø䗤䗾ٳ٨䌹슰ٷ옪 sí䷤䁩ÿ잭䖼ٰٴ٥ٳ٦ # T䂴䎥٥٨â썬웡ٳõïĸ٣٥쐰 # Wû亣î쑥츣ӌ䁩ä # T䁩å䀣쑡ã쎥䗣٦쀫٢ # F䀾٫٨øü썬䊿٥٠ # T䁩éàٱ썬쑫íٳä䐩썫ï dï옪윲٦ٶ쟶 # T䁩å䐸욬썫øû # T䀤쐷ÿ٨ # T䀤쐷âù # T䀤쐷âà # T쐷âä썫ûٰ٧ïî䏣 # T쐷âä썫é # Dٽٳ䗤䋥 # Dٽ٪䋩ëãã䗤䎭 # Y䀭䎭øü앫٨䂠웽è썬 # A䚣䗾ٰ으웡øÜ䱣 # T쐷íٳٰ으썬ٶ쎭쑥ø䔣옦 f䊢íٴÂ얢øãí٭쐩 u٭읭썬슡 # Dٽ٪䋩ëãã䋩 # D잫û # Gå䍣䌢䌪ٰٰĿٲم䋣å # Yà쐷ëèٝޠî슰䔾ø쌴쌪 y䀭䅥ÿ쟶䁭슡ٰ싡ø޷íٲ m䊢ٰ٩컶䐣ïٳ䚣 # Yà쑥싱얱얢ü # T䍣䎹ü٭쎥䂾٫٬íõïĸ e䗤䀭ûí٨쪫àĿٮ䀭å읥 # T옶쟥䑹â䅾øè웡õم쀫 tø䗤썬웡٫쀫٨䅭옧í٦ٴ H٭욥٥à٧氤٩썭ä䀾돡 bÿٍĨ٦䋥䎩٫ٰ썬씥ٰ쑭٩욬 Wø٬쏥٭䗤䄠 # Yà쐷ëèٝޠî싡썬䁭 # Yà쐷âÿû싡슰 # Yà쐷ëè옪쀫쑥옪씫٧ٝޠ bÿٳ䗤ù # I䂪ٰ٩䊿ٳ٭읳 # "쐷âøá쎬䗤䓥٨쑭썶٧ # H썬٨à䀠쎬䎩쐰Ġ䀣õ䓣ٰ rå쪬Å٣올䂢䑩å䂢 # Iٷ온웨䑣íáٳ쪫٥ٱ쟫 o욥٧䓹쭬䎥웡ÿ옶ä # Iٷ䗤䐭ø٭읭웡 # I䂪ٍèĸٱ # "ã䁾à٭䗤䇭ξ # Y䐸ٰ٩䑩٦û٭슬٭ mٰ䅾 # Y䋭øٰٲ䂢䋹٭읡ø䗤䄾 # Y䓾øâè䔤䔭쌴ëٰãà옰 yïíë٢٬٥ # Iٰ䂯 # T䍣ٴå䐹٥è٣ # Y䎭䗣٧í٬ٱ웡à䚣ä옪 s䁭 # Y䔩ã䅩䚭쟶ٰٰٳ䚣䐠䂢䗹 a䗤䔭䁭è # O䌧Â䍩ø䁩٣ # P䂢٥î옶å잫ٳٰ잡쀫٥ٶ얢 # T䐻쐷âú욨 # T䐻쐷âïû얭 # T䋭٭엫썫슨ٰ잶 # Y䋭â䐯 # Y䂾䂠䔩䊸 # Dٽٳ䗣١ٰٷê썬옪 # Iٽ٧ï씡ã䚣þ٦쀫씭䄩䐣 # A䚣䗾ٰ잫ù䗤䐠 # M쀫䁩٨䅣䂢䔭䊢øï # Y䄾썬슳쑥íü٦ٰٷûĸ٦ Dٽٳ䗣ٰٽ٭얱 # A썭١ٶ䐸í䚣ÿ옪 d٭䗤䅣 # Y䀭슳ÕĨ٦䄣٦웫 # T䁣Ŀ٫䔩ÿ䁵ٰ٠ٰ쉨٦遣 (䇻üቫ쎭ٶÕä엫û tٴ썬웫 # Y䂾䐸쐪øî䪸٭썫쑡䗣٧ # Y䋭䁩٨øî쟭 # Y䂾䍣䐥䊢٥ÿ٦ # Y䀣ްü욶䗤ÿûí٨ÿ # T䀠쐷ù # Yç옶온썫앥䅣䗤䏣 # T䔭å䗣䐡ٰ욨 # T䐤쐷î䚣þ # Y䂾䂠䔩䗤 # Y䗤䎭썬䔩üٝ٢앭è b䍣䋭 # Y䂾䄾䗭䆴앭٥øÆ웡 yä슰썬썫얢øï썬씽ü s옷ÿ옷å䁩 # Y䂾䀠䖼٨䂢٥ꐤ׷ٝ a䍣䚣â䐥 # Y䋭ÿõ웫íã썬잶 # Y䂾䍣䗣䁥䗣٨øûõï쐪 # Tå䌮옪é١쬪õïÿ yøíٷԭ䇣쀫땨ä썫ê옪 w䊢øï # T䔾銾è쐷âà # T䗥è쐷âà # T䔾銾è쐷âù # T䗥è쐷âù # Y䂾䁠䁵ٰٳԭ䇣 # < # T䴹٨í䗤䅣û읭Ä䏣옰栋ٳ r # Y䋭æ䗤䀠쟶٫썬싫챫٭읫 sٽ٬䀭٥ÿٶ䐠٦䗤䆢 a䎭٥쌪è # T䀠쐷ÿٰùٰٶٝި쉶٬䗣 yå䌹 # T䴹٣øí슰䂢䓥쑭썡䔥å䅣쟡 m䔤앫썬٥쀫䴤ä䅥ü h䗩٬윥ٰ٥䁩ê옪슰í y䂫 # Aٰ٦읭썬쮱ÿ٢ٰ싡 yÿ얢øêٌ씭î䊢䂢䔥í٬ sٴٰ쑭읡䊢ٰ٠얢øê # Y䀭윲٬٥ÿ쮱ِ٥٭엫약䗣䍩 t䴹٢ٽٰ싡٭ # T䴹٭웡쀫옪썬옼亣䀭싡䊸 # Y䀭쟭썬䐥銢è # T䇣䆭٠썬옼ٳà٦쑭쎬䚣䀭 g䂸٭ # T䇣䔣Ѫ읫ٰ٢䂢䏣옶ä쟫 mٌ䋩٠䍣䂼ٰ웡íî䇥ø yü # Y㕩٣ٰ웡ç # I޷í썫øû # Y䀭쉱䗤쐪٭ # T䄢쟭î䗤䇣ã䗤䁣亣䀭윪 # T䀣þäí썬읳 T옶엫슡썬앭èå䗤䑣û y촫٫썬ٰç䂸ٽÍã䗤ëõ # T䗩쐷ãã䌾 # T䗩쐷ãã䌾옪쀫٬䊿ٷ # A욫ã䏩ÿ٠䅾øï웫ˋ䂾 n䀤䡹䚣㕩٦썬쉬䁩 a䋣 # Hٳø٪٣ # H٠슥옪 # I٭ްíٴ䫩٠슥옪 # N٫ٶØà잫٠䔥í٢ # I썬䚣䂾앭ï # Aٽ٩䗣䗤䓤웫í٣ÿ슰 aٰ٧ٮå썬웫䂢䑹ٷøè iٽ䅭ٝ٧ްëå # H٭ްä # Aٰ٦ã䗤䋣þ썬썬욬ٰ s슫䑣û욶٥þ٥ٶ䉹 bØû쎥씫٨쎫ٰ䁵٥옪쎥 w읶䖼ٮ䁩٧쎡옳ٰٶ # T䀤䑩ø䗤䁠얢øä (õíĸ # T䁩ÿ٫䗤䅾쟨٨ٰ٬䖢 a䑩䐻쑫 # Y䂾䍣䌹䌪٦ # I٭ްþ # A쑥䓭䑩䌹䌪ٰ٠䂢 # Y䇣쑥ٰ٧٧ # Y䄣٥ÿٳ٠䗤䁾ٴ䁹䗤䏥 g썫î쐪젫욥䀣 # Y䈢쐢õøۆٍûĸ٬䗣ٯ䑩썬 lè얢é싫 # A䚣䗾ٰ싡䗤䍭䁾 # Y䀭잡썫å䁵٧䗤䔭얶æã䂢 lø亣䀣온üå썡䀭ø䗤䏣 s٧䅣䂨䊪ٽ٧ê䓤 # Y䗹يٽ޲읫٭䪸ٰ䐣éîõ wù䗤䴹Ä䐠٫ãþé옪썬٥ a䗤ãá䂢䏣옰õÿ䫩٬٦ dã앥ٷٍ쀫읫䂯䒹õĠ b٥敥䂨 # T䁠얢õ쑫١썬ä옪읥 # A䚣䋭íû䐭Øî쐷à썬 i # Y䋭ÿõ슳䗣ٷ٥٥þ # S䚣í䊢ٰ٦䔥â䔭䗣ٴ쐰û n䁩ٲ䐡䡩ø䈩øü # Y㑩٥٭쐰 # Y㕩٬ٰٮ챱٫욫䂢䐠욥쟶 t䗩䀣þ䐠íÿ٥٫䗤䅠얢 t䁣 # WØê٬٫얱쟶ٱõٍ슡䚣 hê䊢í٦쉭䢿٥á䌪٢õľ s쟥䴩䋭î䗤ٰ읫ø쎥٥ f䚣䗣ٷ웫슫àĿٮ䂿ٽ޶읡 S옦䗤캬 # T䗩쐪øî٬٦ø䑥 # I읫䖢ٳ䚣䂾䗾ٰ읫 # H䇣ٽٴٰ욶䗤䑥 # T䂥䊿٢쎭٦á # T䂥䅥쎭٦áØèë٦ lêíí٥ÿٳä䏥è웽øÿ얢 t䀭٥٢å䇩ÿ # A䚣䗾ٰ잡쉥ٰ٠ # T䌢ü욥싡ٳ٩ٰ잡쉥ٰ٠ w䗤ÿùٳ쑭엥켱޷ê # Tû웡û䪸٭웡ٰ액슨٠䏥 # T䐸٢ãã䌢䕩ÿ٧íå옪 Y䀭잫ø쎥 # T䑥쐷øû옪읡ٰ욶 # T䄠쐷í䁠ٍ쀫쉶쀫옶앭 t٢䊢íٴ # T䋹䌪ٰ٦䑥썫í䂢웱٥쀫씫ٰ t䋥 # T䐸٥٦䂾䂠䊢٥ø䂢䂾䐸쐪ø m젫䍩íٷ썫èø얱 # Y㑩٥٧䗤 # T䀤䊿ٷ䀾찰ûĸ٬䂢䏥 # T䀭å䍣䆡 # T䔥ë십䗣ٽ䋩ٝٶ䂾٭䇾 s٥٢ٴ䌹젫옳û䐼쑡 a䗾䗣٢õ윽 # Y # Yî䊿٥٢ # T䀭å䂠䅹 # T쐷âä쎭ٳø䅥øî # T쐷âä쎬䚣䔣쎥ٰ쉱쐪ٰ٧ # Yî䊿٪٢䌪ٳ # T䀭å䍣䅹ã䔭 # Yî䊿٪٢䌪٫ # T䀭å䍣䅹ã䌥 # T䁣٭엫쟱٫쎭 # T䀭å䍣䅹ã䔥 # Y䋭âå䔤썫ï٭ # Y䀭쟭ٰ # Dٽٳ䊸٭썬웫ã䗤䀭 # Yï䂾䁣ê # I޷é # H䐩䚣䋭íë썬옪éٷ٫웥 I땨ëþã䗤䗾쟫쀫 # T䁾ٷ옷õïÀ٬ã䀠íþ엡 t䆨î٫٥٬쟥읫٭䗤䀤䰩䌪 t䀾٫썬웶ÿûٴ # T䏣å䗣䎹êøî쮭٥þٰ١ s잭䔭ü쀫쑡٭䗤䑭ٶí t䁣٫썬욬䂢䐯٥ٽ䋣م썬 i䔭٧ã쀫٬õê٥ٰ쎭٥ٽ m٥ٳ䚣à얱䌪ٷ䓹õ얪ٰ s웥٫썬십 # Y䀭잡옰äٌ쐷å䗤䓤웫 # Yà쐷íã # Yà쐷íã # Yà쐷í٣٠ÕĨ٦잡슫٩䁭 # Y䈢쀫옶쎥쀫٦î䔭옶ã hû쀫٨ã # <Í쯡َ # Dû䂿٥þ٥٨é췫쑥 # H䇣١썫ê䐠Û # Y䂾ĸ٬٭ # Iٳްê # T䀣è٭䗤䐠û䇹ِå䍣 dø # I޷íø # Pٶ䗤䐹è٢ø䅥ãûٰ sïÿ옪웱싡 # T䀤쐷âù # T䀤쐷âà # Y䀭잡옰å # I޷íã # I޷à # I޷íï # Y䀭쟭ٰ찰û٨䂠䌺øü # I޷âå䂢 # I٭ްø # H # T # D # I읫䗤䀭 # I챫 # H # Y䂾䊢ٴ٬ # Y䂾䅥䂿٥ê # Oûïè䗤 # A䚣䈥콫õû썫ÿٰٴ䗤 # T # L # Y䀭잡욨䆢٢٥ïٰ # Aٽ٩䊢٢ٰٯøè٪슨쒪 b䚣þ # Aٽ٥øèٷ٫ٳ䋥䈢 # I޷øè썫ÿí # I޷âã # T䍣䊢 # I٧ # T䁥싡 "نÏ캥Ã젡م䥹䅣 t䆢٢٫옰à٢ٰûÿ B썬쑡٭옪å䀣䎭䐤䋣 t٢䠣Ï䭣䗤å䎭îíø d٥ٳ٭켨 # H٦썬쉫å슰䐭윩٭썬쎥 # Bøè쟶٫٫썬앥þٶٷ䀭 c # E٠䂠젫닡á䎩ٷ # T䐭è슩ٷ어 # M쐢õþ䚣ê䔥ÿ # T䐭Ŀ٠䀠ٷ # Tå욫슥Øç쎫䋩 # I욡䀭싡٭썬٨ # T䓣٬٥üã썬٩ٳ앫ٳî H٭쎡䋥üïéû슰슽 a䋩٭쉫٥ê䂸ٽÎٰٴ٥ٰٳ "ٳ䚣᭫þ䂠䄣å٢١썫ø장 t٩쎭읡쫡䂿䍣䔤Í٧٠썫 yíû쀫욥읫êÍ - "ٴ슡얢øÆ콭䧥êÕß # " # Iٰٶ䊿٧썬씡 # Y䀭잡옰ø # O땨ë쀫썬쟱٠ٳ䚣䆢䑣 f䗤䅥썭 # Y䇣쑥ٰٶç # TĿ٪ٷ윪ø䌼øï # TĿ٪ٷ윪ø䌼øã # Gÿ䊿٪앫ü # *ّ # >䮩ø옶싡٢槥 # Y䂾웭얢썫쟫䁹䍣䗣ٳí # Y䂾䔩ٰ䖿䡩٥ê # Y䑩٫ø䗭í٦ٝ޶쐪øٷ # Y䂾䌢ٰ١䌪٧쵫٫슱옪쟶䂥䔥 s쀫ٶ # Yÿ쐷â䄣ً씭욥슥ٽ٪ # *ّ # *ّ # *ّ # *ّ # >䮩ø옶싡٢ٖ쩫 # I٭쑫쐪ä亣䂾䅠䂢䐻 # Y䂾䅩䇩ٴû # Y㑩٠엥Õïî䐸 # Y䂾䑩٭Å䚣䇣쟭٥옪ٷå c # Y䂾쎥쎫젫옶쏡ٳ젫䁩٢䌹 wĿٳî䊸޷øà # S쮬٥á亣ä쑥쟥ãíõ슯٭ c䔥î䢢䍣䂢٥٭슭 # W쀫썶îõ슰٭잫Øí٭쟭 o # *ّ # *ّ # Y䅩þ䇥í䊪ٽٳ䐹ÿ eé # Y䐩썬ٽ٥٭䇭ü䷤䌢ø٭슭 a䗣٦䀣썫øïî쎬䋣쀫 g찰ÿٰ웡ÿٰ٣êÿٰ sõ웱온쐰ïÿå䊸웶䁠 s铣䐸ÿ٭슴 # Yë쎭䅾øïî٥ٽ٥٪٦ iٽ䍣ٷ # A앥ÿéûٱ썬십䐭øû "ԉ䂢䊿٭øø䗤䀭 # A䚣䗾ٰ잡썫øï # I޷é썫ëø٭쀫쒪٬䷤䆠욶䌺 fä슫üõáٳí䆠䗣ٷ٬ O٧썬٥٥îÿ슫ç䄣ûãûٽ w # Y䄩썭٢٥쀫쎥ٰٰ٣í # Fû썬웭٭쐰욥٭엫쌷 Iٽ٬٭쐪õ쑥٭쎫䎭í٩ # W쀫앭٥á   0f| 1$T$L|su;SSSSuKK QRPQPIUVjjYY1҉V VVFF{^UVutF~{t haIYFvoYvYvYv YVMY^UVj$jYYFPFP.YYF FFFFF 1^UVuu hHY~ 1t hDHYF vYVY^UV1#s74Ku VYYu}} F1^U5KYPuhHhSjQHYUVuu u HY u VIYYƅu h\Y^U}t uJYUVuUYPjYYuVKUYY^UjEPuK U9UtU:u1UtVWu }sV:-gzm]hlvTYYu K8hdvTYYu KVRhDhR M}|}~hh_RYYjFY~VU}}1F E}}1FEhW!TYYuEE~hWSYYuEE]hWSYYuE$EE>@hu4SYYuEE?E Cuhh Q jEYhKuWhhEPfQuUYEPuUYYUEPUY}t uQY5KNEY_^Uj!u+YYUx[uYUj/YExtx ;t jB0YUVWEO9uLUЙk KE]3uRYYEuE}yJ뷉BU1_^U VWE0k.Yǃx [jEuYEu1lE08.Yx ]t h Wj) utY1;E-[UVt WƃuWSWRjzYYFWRwvP WVE +t  -t ~u3EuYEu1ƋW UVVh Wj( 1[EuuYEu ulY16-ƋW UVUV E0,Yǻ @ ~^_^UVWu6,Yx (BR,YExupYcV YEu136s,Yx )t"h, uj' uY1i(UW=x[u-} t'6,YP U#t}*uVY=x[uC6+Yx @u5u VYYEu1(UWe6+Yx (tVYEu1BE6{+Yx (\BRg+YExuIpYt<RC+Yx )u(]EEBUr,YUBE6+Yx (#EBR*YExpY~R*Yx )R*Yx *NR*YExu7PSh$ MYYt URzuRU*Yx )t+h uj% uYuY1DE}u1 UR]UrYUB}uE=x[K} A}u;}u5}tE8WuUrYu(UW2}u }u}OUWUWUW _^UVW}u W]YYƅu1V7)YEx ,tx :u=uu WYYEu uEY1,UVUV _^U VWj(Yǃt h~>YhwLYYj)Yj}(Yǃch wKYYchwKYYtPhwKYYt=hwKYYt*hwKYYthWj# 1EEhwBKYYu"=KuhWj># Mehw KYYu"=KthWj # M0hwJYYu"=KuhtWj" MhpwJYYu"=KthTWj" MhPwnJYYtLhHw[JYYt9h@wHJYYt&h8w5JYYth0w"JYYuM~t6hWj!" $FCF7F+WBD XWPh~IYYWhRIYYp~tZh Wj! HFFFFFFWl 5W}uwYEtxuh Wj! VY1>}JUztAzt;E0hx Wj $j&Yj8%Yǃx ;tEBWVw-YEu!wh\ Wj VY1URURV UVE1~ |@E VVEj$Yx ;t#uEPLYYFuVY1?up$Yx ;h< Wj VSY1~tV:WurkYh Wj VY1=x[u.~t(V:,u RUVNR QVMJ =x[~vV:(uztR:Ot"V:OTzJztDz u>VUVRVUBuYV:BuW TUBR$Y_^UVW1j$#Yǃx ;u ji$Yu1 #~j"YǃxuwYtj"YxthWjH 0jjj"Yp < HPj"YpYYwN_Xjk"Yx :uJƋWVF kEFE:w:YUBju#Yj "Yx =EEPqYEuu!Yx ;t!hpWj? wOƋWV F F=wYVBVMJUBR"Y;uƅu*1h`Wj Ɖ_^UUj#uYYUj YExtx ;t j*"YUVWE}9uLUЙk |[E]3uCYYEuE}yJ뷉BU1_^U VWE0S Yǃx (jEuYEu1lE0 Yx )t hWj u\Y1;E[UVt WƃuWSWRjbYYFWRwvB WVE +t  -t ~u3EuYEu1hƋW UVVhWj 1[EuuYEu uTY16ƋW UVUV E0Yǻ@ fP_^UVWu6Yx $uV4Y6Yx *u5u VYYEu1(UWr6IYx %uFBR9YExu3poYt&@WUrYG6Yx (uBRYx %tVsYEu1E1҉UU6Yx (}BRYx %uFBRYExu3pYt&EEBUrfYUB6IYx ,u69Yx %uFBR)YExu3p_Yt&3EE1UrYUB6Yx ,u}u }[6YExFPSh?YYt/URzu#}u UUEUR]6jYx )u4huj uYuYuY1M}u&}u } t:(UW$} OUWUWUW _^UVW}u W YYƅu1V7YEx ,tx :u=uu WYYEu uY1,UVUV _^U0VWjNYǃt hX1YEhTw>YYtLhLwz>YYt9hDwg>YYt&h<wT>YYth4wA>YYuM~t6hWj@ $FmFaFUWB$&L}^uwYEtxuBhWj VHY1jYj-Yǃx ;tEWVw:YEu!whWjxVY1URURV F~ u$NF E1~ |@E L9KEjYx ;t#uEPYYFuVgY1#uSYx ;thWj V:Y1>VU}E8,UR UUMRQ UMJURU~tV:WtVY1~uV:WirYXVjjjr 2 ZURhEP\: Vr\YEPfYVB lIUBRY_^UVW1j#Yǃx ;t /uj]Yۃu1 #~jYǃxuwYtjYxthWj< 0jjjYp0 HPjYpYYC_Xj_Yx :uJƋWVF _EFE:w.YUBjiYjYx =EEP}YEuuYx ;t!hWj3 lCƋWV F F=wuYVBVMJUBRY;uƅu*=hWj Ɖ_^Uj!uYYUjYExtx ;t j*YUVWEQ9uLUЙk dmE]3u8YYEuE}yJ뷉BU1_^U VWE0SYǃx (jEuYEu1E0 Yx )t h8&Wj u\Y1E[UVt WƃuWSWRjbYYFWRwv7 WVE- +t  -t ~u3EuYEu46789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijk1hƋW UV $EBRYxqEBRY!WWRjYYFh4&vO7YYWNRwQ6 WVEVh&Wj 1[EuuYEu uY16ƋW UVUV E0>Yǻ%@ D_^U VWu6Yǃxh&wj6YYmh&wS6YYVh&w<6YY=ED=KuE*=KtEWD&D=sA M |BRHYǃxuh&w5YYu6#Yx [BRYǃxuwFYiVYEu16Yx ]t h&WjI uY1EE(UMJE6YP U#t}*u6jYx [tVYEu1_EE69Yx [BR%YǃxlwXY[RYP U]t }+t}-u6EEBwYUB}]uE}}+t }-~BRYǃxhwYWVYEu1^6FYx ]t)h&Wj uYuyY1'E}+t6Yx [EBRYǃxwY~RYx ]RYx *NRYExu7PSh&2YYt URzuRPYx ]t)h&Wj uYuY11AE}u1 UR]wYUB}uE}}UUE8WUrY=EJ=KuE0=KtEUrYd&?=sGA M |,?EEOUMJUMJUMJ E_^UVW}WYƅu1R7 YEx ,tx :u9uWYEu uY1,UVUV _^UVWjg Yǃt h@).#Yh8)w0YYjYj- Yǃch0)w0YYch()wj0YYtPh )wW0YYt=h)wD0YYt*h)w10YYth(Wj6 1 PEh(w/YYtLh(w/YYt9h(w/YYt&h(w/YYth(w/YYuM~t6h(Wj $FFFWB&=h(wM/YYj Yxp~tHh|(Wj6 6FEF-t>6uNh$(w-YYth (w-YYu11ۃ=K9uF =sU R|Ej Yx ;tEP YFuVY1DUzu:=s'MI9 |t |V u Yx ;h(Wj VwY1h'w,YYu5~u/sEFEWh'@YUBUB~tV:WurGY\h'Wj} VY1N|V =u/>u|V d'N:UBR Y_^UVW1jYǃx ;u j Yu1  #~jUYǃxuw~Ytj8Yxth)Wj #0jjjYpl! HPjYpYYNqXjYx :uJpƋWVF EFE:wYUBjYjkYx =EEPYEuJu/Yx ;t!h)Wj wƋWV F F=wYVBVMJUBRYJjYxh)jYp)YYEEPYEufuKYx ;t!h)Wj 6ƋWVF *F,VMJ EVBEWwYUBUr_)YUBUBRY;u'ƅu*h)Wj {ƃ~ u F N_^U=<}t:xX@ 5!Y=uR t 5Y1= u@<}U5Yuc(YPjxYYu5 (YYU UEE U} uU BP5h)h%UURuhb& }t KUVuu*h)V#YYuVyY5jVYY{U ^U} w } t1UVuavAv0 v .t_u1^UVjj$YYVFF ^UVW1URjYY5iYt7PVWZYZ9}ueuVYY빉GPVYYNE@UrUzE_^U VWU5EURj5YYƋU9= =E=\= =SN? 0 !   E1a90 w -03Au -Kau -k UUUG떋Us0 aE1}90 w -0 UUUyG‹U*,2UщMU9UueuVFYYƃ}y UU9uht*jj UURVYYE@UrUMJE_^UVW}y h*YU@}7 5Yu9u.9u= t˃=t92봃=uF5Yt ='t ="u g= u ;FV ~ u=>u F s7}t M=D}_^UVW}y h+oY~;=u h*WY5vXYVQYO@}D}_^U塤:xUʡX@ 5uqYY=u 5}YUU URu5 =u 5JYUVW}u3Ȏh3WYYuWY==u h3zYY=܅u hX3eYH}؅s(<t h3YN _^UV} NUƃ |~Ph3YY "t\uVh3YYVYEM ^UVWu }h4qY=܅u;?t?,u.uv W h4zYuvW uvW ?t?,u44P7Yuv W^ \}t uj@Y~tjvW1 ~tjvW ~ jv W }t uj@dY}uj(VYjvW }j)6Yvh4uYY6v=Ku >1u44PI {~t/}t tj#Y6YjvWH F}t tj#YjvW! >u h4Y>u h4Y6gYjv W }t tj#@Yj[8YjvW j]"Y}t' u!vYtvh4HYY{}t tv]Yuj#Yvh4YYIj"YvvYYj"Y*6hp4h5 jY 3T+_^UVWuEu j SY9Vt5vYYu؅9V| 9V~/j Yvvhd7U VV؅8؅9Vuh`7)YE؅9V~j Y؅>u*V::t h7YVrh7YY> u;V:=t h6YVrh6YYVjrV ׅ=܅u66E>~D}u>j Y4h6MY4h6@Y'h63Yhl6 Y 5Fx)~y=܅uh6d6PY[h\6Y[hT6YNhL6YAhD6Y4h<6Y'h46Yh6X Y <5F(~t=܅u55PeYVt=Ku55PAYVt=Ku55PY>-u-#V11ۃ=K9u55ǃ>6u-#V11ۃ=K9u55ǃ>u+~t%V:,uR:WuVRrh5YY?t"?%u~ ujbY PYGك~tKj Y&E)=܅u ~ t1E d5'uvVG >u K>u(K6h5h5 j Y_^UV܅u uYYsN ^UuYU:xUʡX@ 5uYY=u 5 YUU URu5/ =u 5 ~YUVW}u?Ȏh?WYYuWBY= =u h?zYYs(<t hh?K YN _^UV} NUƃ |~Vh?YY%"t\uPh?YYVYEM ^UVWu }h@ Y?.uvW h@Yuv W }uv W h@qYuvW O}t uj*Y~tjvWW j(Y~tjvW; ~ tj,Yjv W j)Y}uj(Y}t uj*|YjvW }j)\Yvh@YY6vh@ p~t/}t |j$Y6 YjvWp ;}t |j$YjvWI >u h@Y>u h@Y6Yjv W }t |j$|Yj(tYjvW j)^YvYt" uj*>Yvh@YYn}t |j$Yvh@ZYYIj"YvvYYj"Y*6h@h jGY ?"_^UVWuEu j Y=KuhDhXYYjY9Vt5v5YYu9V| 9V~/j 9YvvhDz VV89VuhDNYE9V~j Y>u*V::t h|D YVrhxDYY> u;V:=t h,DYVrh$DYYVjrV >jV:Wu rYu hCYVjjr! EE}wM9UvEuhCPYY8ׅ >~P}uJj Y@hCYhCYhCYxhdCYh8AFj hTCY[hDCYNh4CYAh$CY4hCY'hCYhBrY TAF >-uVuBf>6uVuBf>t>uF >u~t V:,uBVt hBYVtj%W5YYu hBY>uK~tEV:,u=hBYVjr V hxBYVjrV v>n~dV:OXzNz uHztBR:Bu:VRhtBrYYu!h\B$YVjrV5 >~V:,zR:WVRhXBrLYYtVRhTBr3YYVR :OVR zVR z ~VR znVR R:B\VR RhPBrYYu@VRR:du\DPh8B YYVR jrV >~V:,zR:WVRh4Br1YYtVRh0BrYYWVR :(uLVR zt@VRR:duPhBHYYVR jrVU ?R?%u@~ u jbY:~ uVtwlPYhAY PYG륃~{j oYbjvV V 4hAYYEV 4hA{YYjvV jvV~ |A>u K>u(K6hAh j=Y_^Uhu YY UV5Nx ^U=tu YUVdU9dwUd9dv 16VYt1'drF5d&Y5d^UVW}u1E}UUs 1=`u8j`Y=u1V!փ5`5dFE5hOVU}9}r69v2W9UvUW~>}t Ehu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=h<9}r79}u+UOJ}t EhURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV\ uY_^U VWUUb15ht 9ur6E0tU UhtU9ru NJEtU9Wu RWE_^UVux95lE`^UVujuu V!^UVujuu V^UVWuEEEu} tE 0MtFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^U$UUEPjjg y UH1UVW5HH}׃}~9r }y 9vWYu_^UVWuU VVu-YYDžt~~yVډF_^UVWu~y V0t VuN FtN V€uNVu+~u%h/YF~uN NF 1}9<t,R@tBt 4-YGƒ~uFlFF VVv vvQ >uNN FFSX_^UVW}Wu uP ƅ~9})׉U U 1_^UVWu }c~y UVu CV€tu ,fNV~Ȏu>5̎|Yt.hYFu NLNHF 9hvYFuN!NF V@uVVVhUFt$jjv" =uN ?jEPv =tN V@FF t V 9ډUVVFt$jjv =uN uvv N V+VUV JVV}QFt!jjv =u N 3uvvl uNN N_^UVWEE11<tN|1DFρECEE0-EMP1E E  E+U :t! EE E @EU uuu;YYEy@Ut8hu]YYE~" tu#YuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^UUUuuu < UVWu }E?t:JxG^FSX GVPYY=uEE_^UUURu hu?UUURuu uUuuu  UEEUUUUU JUEPuuH EUJUx ]E EPjYYEUuu hu#USE] ![]USE] ![]USE] ![]UVW}u M UW}0))ϊE tu1_]XG_] UVW E_^] U=tjYU}x}~uvPYYU$UUEPjj U$UUEPjj U$U UEPu YYEPjj] U$EPjjE U$EPuYY1ۅÉU$UUU UEPj%j U$UUU UUUEPjj yEU(VuU @t*uYEU UV֋RUUUEPu YYU UEPjjg ^U$UUUUU UEPjj; Uu hT$u U$UUUUU UEPjj UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U I }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EEI uVuuƀ}Xu9utUP YUE_^U4VWuEEEE }%MJxUʋFF VuXYY=u}t UډE1!,'"UJ- EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE U@JMJxUʋFF VuYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEJUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE`J=E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVP8YY=}t UډmEJxEEFFEEVPYY=t6JxEEFFEEVPYY=u}t UډJxUʋFF Vu\YY=u}t UډMuUUMRJxEEFFEEVPYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvvO EU9Uu1 N _^UV1}*<tBt 4aYF^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUhJhjYYjYUVuYƋU rU MJwU uR5YY^U$UUU UUUEPj6jC +C;Cw Ë[ uӅu P-KI|;u[u P1ۇttPXPAssertion "e->magic == 31624" failed, file "asm86.c", line 29 Assertion "a->magic == 37937" failed, file "asm86.c", line 60 Assertion "a != nil" failed, file "asm86.c", line 59 stcr3cr2cr1cr0espebpediesiedxecxebxeaxssgsfsesdscsspbpdisidxcxbxaxdhchbhahdlclblalasmconv: %s: %s malloc()Translated from %s to %s by asmconv %sasmconv: '%s': unknown output language gnunccackasmconv: '%s': unknown input language basgnunccackUsage: asmconv [input-file [output-file]] asmconv: '%s': unknown machine -mi386-mi86xorbxorxlatxchgbxchgxaddwbinvdwaitverwverrtestbtestsubbsubstrstosbstosstistdstcsmswsldtsidtshrdshrbshrshldshlbshlsgdtsetzsetssetpsetosetnssetnpsetnosetnlesetnlsetngesetngsetnesetnbesetnbsetnaesetnasetlsetgesetgsetesetbesetbsetaesetascasbscassbbbsbbsarbsarsalbsalsahfrorbrorrolbrolretfretrcrbrcrrclbrclpushfpushadpushapushpopfpopadpopapopoutsboutsoutboutorbornotbnotnopnegbnegmulbmulmovzxbmovzxmovsxbmovsxmovsbmovsmovbmovltrlsslslloopzloopnzloopneloopelooplodsblodslocklmswlldtlidtlgslgdtlfslesleavelealdslarlahfjzjsjpjojnzjnsjnpjnojnlejnljngejngjnejncjnbejnbjnaejnajmpfjmpjlejljgejgjecxzjejcxzjcjbejbjaejairetdiretinvlpginvdintointinsbinsincbincinbinimulbimulidivbidivhltfyl2xp1fyl2xfxtractfxchfxamfucomppfucompfucomftstfsubsfsubrsfsubrdfsubprfsubpfsubdfstswfstsfstpxfstpsfstpdfstenvfstdfstcwfsqrtfsincosfsinfscalefsavefrstorfrndintfptanfprem1fpremfpatanfnopfmulsfmulpfmuldfldzfldxfldsfldpifldln2fldlg2fldl2tfldl2efldenvflddfldcwfld1fisubsfisubrsfisubrlfisublfistsfistpfistlfinitfincstpfimulsfimullfildsfildqfildlfidivsfidivrsfidivrlfidivlficompficomfiaddsfiaddlffreefdivsfdivrsfdivrpfdivrdfdivpfdivdfdecstpfcosfcomsfcompsfcomppfcompdfcomdfclexfchsfbstpfbldfaddsfaddpfadddfaddfabsf2xm1enterdivbdivdecbdecdasdaacwdecwdcmpxchgcmpsbcmpscmpbcmpcmccltsclicldclccdqcbwcallfcallbtsbtrbtcbtbswapbsrbsfboundarplandbandaddbaddadcbadcaasaamaadaaa.use32.use16.text.symb.space.rom.nolist.list.line.file.extern.end.define.data4.data2.data1.data.comm.bss.base.assert.asciz.ascii.alignV %&*+-/^|expression syntax error missing ] operand syntax error 1248operand syntax error  e n z c'3?KWd[[[+[,$[$.align is restricted to one numeric argument garbage at end of instruction unknown instruction '%s' '%s' can't have an operand size prefix machine instruction expected after instruction prefix can't have more than one segment prefix segcdefgscan't have more than one rep repnzrepzrepnereperepa32 in an 80386 section a32a16 in an 8086 section a16o32 in an 80386 section o32o16 in an 8086 section o16weird section name to .sect .end.bss.data.rom.text.sectAssertion "t->type == T_WORD" failed, file "parse_ack.c", line 639 syntax error garbage after assignment file not preprocessed? xorwxorlxorbxlatxchgwxchglxchgbxaddwbinvdwaitverwverrtestwtestltestbsubwsublsubbstrstoswstoslstosbstistdstcsmswsldtsidtshrwshrlshrdlshrbshlwshllshldlshlbsgdtsetzsetssetpsetosetnssetnpsetnosetnlesetnlsetngesetngsetnesetnbesetnbsetnaesetnasetlsetgesetgsetesetbesetbsetaesetascaswscaslscasbsbbwsbblsbbbsarwsarlsarbsalwsallsalbsahfrorwrorlrorbrolwrollrolbretfretrcrwrcrlrcrbrclwrcllrclbpushlpushfpushadpushapushpoplpopfpopadpopapopoutwoutswoutsloutsboutloutborworlorbnotwnotlnotbnopnegwneglnegbmulwmullmulbmovzwlmovzbwmovzblmovwmovswlmovswmovslmovsbwmovsblmovsbmovlmovbltrlsslslloopzloopnzloopneloopelooplodsblodslocklmswlldtlidtlgslgdtlfslesleawleavelealldslarlahfjzjsjpjojnzjnsjnpjnojnlejnljngejngjnejncjnbejnbjnaejnajmpfjmpjlejljgejgjecxzjejcxzjcjbejbjaejairetdiretinwinvlpginvdintointinswinslinsbinlincwinclincbinbimulwimullimulbidivwidivlidivbhltfyl2xp1fyl2xfxtractfxchfxamfucomppfucompfucomftstfsubsfsubrsfsubrdfsubprfsubpfsubdfstswfstsfstpxfstpsfstpdfstdfsqrtfsincosfsinfscalefrstorfrndintfptanfprem1fpremfpatanfnstenvfnstcwfnsavefnopfninitfnclexfmulsfmulpfmuldfldzfldxfldsfldpifldln2fldlg2fldl2tfldl2efldenvflddfldcwfld1fisubsfisubrsfisubrlfisublfistsfistpfistlfincstpfimulsfimullfildsfildqfildlfidivsfidivrsfidivrlfidivlficompficomfiaddsfiaddlffreefdivsfdivrsfdivrpfdivrdfdivpfdivdfdecstpfcosfcomsfcompsfcomppfcompdfcomdfchsfbstpfbldfaddsfaddpfadddfaddfabsf2xm1enterdivwdivldivbdecwdecldecbdasdaacwtlcwtdcwdecwdcmpxchgcmpwcmpsbcmpscmplcmpbcmccltscltdclicldclccdqcbwcbtwcallfcallbtwbtsbtrbtlbtcbswapbsrbsfboundarplandwandlandbaddwaddladdbadcwadcladcbaasaamaadaaa.word.text.symb.space.rom.nolist.long.list.line.lcomm.globl.file.extern.end.data4.data2.data1.data.comm.byte.bss.base.assert.asciz.ascii.alignn %&*+-/^|expression syntax error missing ) operand syntax error 1248yenzxxxN+,%ugarbage at end of instruction unknown instruction '%s' machine instruction expected after instruction prefix can't have more than one rep repnzrepzrepnereperepAssertion "t->type == T_WORD" failed, file "parse_gnu.c", line 676 syntax error garbage after assignment file not preprocessed? xorxlatxchgxaddwbinvdwaitverwverrtestsubstrstosbstosstistdstcsmswsldtsidtshrdshrshldshlsgdtsetzsetssetpsetosetnssetnpsetnosetnlesetnlsetngesetngsetnesetnbesetnbsetnaesetnasetlsetgesetgsetesetbesetbsetaesetascassbbsarsalsahfrorrolretfretrcrrclpushfdpushfpushadpushapushpopfdpopfpopadpopapopoutsboutsoutboutornotnopnegmulmovzxmovsxmovsbmovsmovltrlsslslloopzloopnzloopneloopelooplodsblodslocklmswlldtlidtlgslgdtlfslesleavelealdslarlahfjzjsjpjojnzjnsjnpjnojnlejnljngejngjnejncjnbejnbjnaejnajmpfjmpjltjlosjlojlejljhisjhijgtjgejgjeqjecxzjejcxzjcjbejbjaejajiretdiretinvlpginvdintointinsbinsincinbinimulidivhltfyl2xp1fyl2xfxtractfxchfxamfucomppfucompfucomftstfsubsfsubrsfsubrdfsubprfsubpfsubdfstswfstsfstpxfstpsfstpdfstenvfstdfstcwfsqrtfsincosfsinfscalefsavefrstorfrndintfptanfprem1fpremfpatanfnopfmulsfmulpfmuldfldzfldxfldsfldpifldln2fldlg2fldl2tfldl2efldenvflddfldcwfld1fisubsfisubrsfisubrlfisublfistsfistpfistlfinitfincstpfimulsfimullfildsfildqfildlfidivsfidivrsfidivrlfidivlficompficomfiaddsfiaddlffreefdivsfdivrsfdivrpfdivrdfdivpfdivdfdecstpfcosfcomsfcompsfcomppfcompdfcomdfclexfchsfbstpfbldfaddsfaddpfadddfaddfabsf2xm1exportenterdivdecdddasdaacwdecwdcmpxchgcmpsbcmpscmpcmccltsclicldclccdqcbwcallfcallbzbtsbtrbtcbtbswapbsrbsfbrboundbnebncbltblosbloblebhisbhibgtbgebeqbcarplandaddadcaasaamaadaaa.zerow.zerob.word.use32.use16.text.symb.space.rom.nolist.long.list.line.lcomm.globl.file.extern.even.end.define.data.comm.byte.bss.blkb.base.assert.asciz.ascii.align! % & * + - / ^ |   expression syntax error 0xmissing ) !bl!d!wu!%%%%%operand syntax error 1248operand syntax error operand syntax error ptrdwordwordbyte) (e(n%(z((c(((((((((((((((((+ *E+E+o+o+o+o+o+o+o+o+.align is restricted to one numeric argument 2.evengarbage at end of instruction cwdcbwunknown instruction '%s' machine instruction expected after instruction prefix can't have more than one segment prefix segcan't have more than one rep repnzrepzrepnereperepweird section name to .sect .end.bss.data.rom.text.sectAssertion "t->type == T_WORD" failed, file "parse_bas.c", line 672 syntax error garbage after lcomm lcommgarbage after assignment file not preprocessed? "%s", line %ld: rstdin 3a2.2 3 3 3=2 3 3 3 3 3 3 3L2 3 3 3[2 3j2 3y2 32string contains newline Assertion "n >= 0" failed, file "tokenize.c", line 224 Assertion "tq != nil" failed, file "tokenize.c", line 295 Assertion "n >= 0" failed, file "tokenize.c", line 292 xor%xlatxchg%xaddwbinvdwaitverwverrtest%sub%strstos%stistdstcsmswsldtsidtshrdshr%shldshl%sgdtsetssetpsetosetnssetnpsetnosetnesetlesetlsetgesetgsetesetbesetbsetaesetascas%sbb%sar%sal%sahfror%rol%retfretrcr%rcl%pushfpushapushpopfpopapopouts%out%or%not%nopneg%mul%movzxbmovzxmovsxbmovsxmovs%mov%ltrlsslslloopneloopelooplods%locklmswlldtlidtlgslgdtlfslesleavelealdslarlahfjsjpjojnsjnpjnojnejmpfjmpjlejljgejgjejcxzjbejbjaejairetdiretinvlpginvdintointins%inc%in%imul%idiv%hltfyl2xp1fyl2xfxtractfxchfxamfucomppfucompfucomftstfsubsfsubrsfsubrdfsubprfsubpfsubdfstswfstsfstpxfstpsfstpdfstenvfstdfstcwfsqrtfsincosfsinfscalefsavefrstorfrndintfptanfprem1fpremfpatanfnopfmulsfmulpfmuldfldzfldxfldsfldpifldln2fldlg2fldl2tfldl2efldenvflddfldcwfld1fisubsfisubrsfisubrlfisublfistsfistpfistlfinitfincstpfimulsfimullfildsfildqfildlfidivsfidivrsfidivrlfidivlficompficomfiaddsfiaddlffreefdivsfdivrsfdivrpfdivrdfdivpfdivdfdecstpfcosfcomsfcompsfcomppfcompdfcomdfclexfchsfbstpfbldfaddsfaddpfadddfaddfabsf2xm1enter.use32.use16.sect .text.symb.space.sect .rom.nolist.list.line.comm.file.extern.sect .end.define.data4.data2.data1.sect .data.comm.sect .bss.base.assert.asciz.ascii.aligndiv%dec%dasdaacwdcmpxchgcmps%cmp%cmccltsclicldclccbwcallfcallbtsbtrbtcbtbswapbsrbsfboundarpland%add%adc%aasaamaadaaaAssertion "opcode2name_tab[mp->opcode] == nil" failed, file "emit_ack.c", line 345 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text! %swstdout\%c\%03oV:%:9&:9(}8*:9+9,7-9/:918284888B8O$8S7:W9[9^:9|:9~9:9:9asmconv: internal error, unknown expression operator '%d' %s(%s)>><<(%s*%c)(%s)(%s), :, Assertion "e != nil" failed, file "emit_ack.c", line 376 <0<;; <<<X<e<r<<<<====asmconv: internal error, unknown opcode '%d' .define %s; cdqcwdcwdecbwa16 a32 o16 o32 ; Assertion "0" failed, file "emit_ack.c", line 537 sseggsegfsegesegdsegcseg; Assertion "0" failed, file "emit_ack.c", line 524 repnereperep; %s = Assertion "a->args->operator == '='" failed, file "emit_ack.c", line 510 %s:Assertion "a->args->operator == ':'" failed, file "emit_ack.c", line 506 ; # %ld "%s" .text.rom.end.data.bssxor%xlatxchg%xaddwbinvdwaitverwverrtest%sub%strstos%stistdstcsmswsldtsidtshrd%shr%shld%shl%sgdtsetsbsetpbsetobsetnsbsetnpbsetnobsetnebsetlebsetlbsetgebsetgbsetebsetbebsetbbsetaebsetabscas%sbb%sar%sal%sahfror%rol%lretretrcr%rcl%pushf%pusha%push%popf%popa%pop%outs%out%or%not%nopneg%mul%movzb%movzwlmovsb%movswlmovs%mov%ltrlsslslloopneloopelooplods%locklmswlldtlidtlgslgdtlfslesleavelea%ldslarlahfjsjpjojnsjnpjnojneljmpjmpjlejljgejgjejcxzjbejbjaejairetiretinvlpginvdintointins%inc%in%imul%idiv%hltfyl2xp1fyl2xfxtractfxchfxamfucomppfucompfucomftstfsubsfsubrsfsubrlfsubprfsubpfsublfstswfstsfstptfstpsfstplfnstenvfstlfnstcwfsqrtfsincosfsinfscalefnsavefrstorfrndintfptanfprem1fpremfpatanfnopfmulsfmulpfmullfldzfldtfldsfldpifldln2fldlg2fldl2tfldl2efldenvfldlfldcwfld1fisubsfisubrsfisubrlfisublfistsfistpfistlfninitfincstpfimulsfimullfildsfildqfildlfidivsfidivrsfidivrlfidivlficompficomfiaddsfiaddlffreefdivsfdivrsfdivrpfdivrlfdivpfdivlfdecstpfcosfcomsfcompsfcomppfcomplfcomlfnclexfchsfbstpfbldfaddsfaddpfaddlfaddfabsf2xm1enter.use32.use16.text.symb.space.data.nolist.list.line.lcomm.file.globl.globl.long.short.byte.data.comm.bss.base.assert.asciz.ascii.aligndiv%dec%dasdaacwtdcmpxchgcmps%cmp%cmccltsclicldclccbtwlcallcallbts%btr%btc%bt%bswapbsr%bsf%bound%arpland%add%adc%aasaamaadaaaAssertion "opcode2name_tab[mp->opcode] == nil" failed, file "emit_gnu.c", line 336 / %swstdout\%c\%03oB%A&A(#A*A+A,U@-A/A1~A2~A4~A8~ABjAO@SBWhB[1B^A|A~AAAasmconv: internal error, unknown expression operator '%d' %s%%%s>><<%%%s,%c%%%s, , Assertion "e != nil" failed, file "emit_gnu.c", line 367 !EEDEEEE>EKEXEeErEEIWIIasmconv: internal error, unknown opcode '%d' %%%s, , %%%seaxaxalAssertion "0" failed, file "emit_gnu.c", line 641 .byte 0x8E,0x%02X; .long esds.byte 0x8E,0x%02X,0x24,espesds.byte 0xFF,0x6C,0x24,esp; .short .byte 0xEA; .long .byte 0x66; .byte 0x67; imul%cltdcwtlAssertion "0" failed, file "emit_gnu.c", line 546 .byte 0x36; .byte 0x65; .byte 0x64; .byte 0x26; .byte 0x3e; .byte 0x2e; Assertion "0" failed, file "emit_gnu.c", line 535 repne; repe; rep; .align %uAssertion "a->args->operator == 'W' && isanumber(a->args->name)" failed, file "emit_gnu.c", line 522 %s = Assertion "a->args->operator == '='" failed, file "emit_gnu.c", line 513 %s:Assertion "a->args->operator == ':'" failed, file "emit_gnu.c", line 509 ; # %ld "%s" asmconv: the GNU assembler can't translate 8086 code unknown errorTa|TrWTwfTT+TbTNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0Z ]Z@Z[X[b[d[i[o[p[u[x[\ \#\+{\-v\0\_Li]hS]l^]]E_G_Xs^bs^c^d^e_f_g_i^n]os^ps^ra_s-^us^xs^(null)cannot print floating point D@<840,($  1.11 | t l d \ T L D < 4 , $                    ! ! " # $ %x &t 'p (l )h *` +X ,T -P 6L .H /D 0< 18 24 3, 3$ 4 4 5 6 - 7 8 9 9 : : ; < = > ? A @ D E F G H Jx Lp Kh I` MX NP OH Q@ T8 V0 U( P Y B C Z [RWXS]\^st_`acbxphg`nXePoHi@h8k0l(j fdmprquvwxyz{|}~xph`XPH@80( xplhd`\TPHD@<84,(  |tld\TLHD@<4,$ |xpld`XTLH@84,(  |tld\TLD<80($        |t|tld\TLD<4,$      | t l!d!\!T"L#H$D%<&8(4'0),*(' +,- -6./06123344356-6-7899|9t:l:d:\;T<L=D><?4A,@$DEF HJLKIMNOQTVUPYBCZ[|RtWlXdS\]T\L^Ds<t4_,a$cb gneoihkljfdmprq|Gt`lud|\TLvDw<x4y,z${}~ |tld\XPH@80($ |xpld`\XPLD@<840,($ |tld\TLD<4,$ xph`XPH@80(  |tld\TLD<4,$ |tld\XTPH@84 , $        %%%%%%%%x%p%h% `%X%P% H% @% 8%0%(% % %%%%$$$$$$$$$$$$ $!$"$$$$$$$$$|$x$t$l$#h$d$$`$%X$&T$'P$(L$)H$*D$<$+4$,0$-,$6($.$$/ $0$1$2$3$4$4#5#6#-#7#8# #9#:#;# #<#=#>#?#A#@#D#E#Fx#Gp#Hh#J`#LX#KP#IH#M@#N8#O0#Q(#T #V#U#P#Y#B"C"Z"["R"W"X"S"]"\"^"s"t"_"`"a"cx"bp"h"`"X"P"gH"n@"e8"o0"i("h "k"l"j"f"d!m!p!r!q!u!v!w!x!y!z!{!|!}!~!!x!p!h!`!X!P!H!@!8!0!(! !!!!!                   x p l h d ` \ X P L D @ < 8 4 0 ( $        |tld\TLD<4,$  xtpld`\TPLH@80( xtlh`XPHD@<4,( $     32222 2!2"2#2$2%2&2'2(2)2*2+2,2-2.2/20212223x24p25h26d27`28\29T2:L2D2<242,2$222211 1 11 1 111111111x1p1;h1<`1=X1>P1?H1A@1@81D01E(1F 1G1H1J1L1K0I0M0N0O0Q0T0V0U0P0Y0B0C0Z0[0R0Wx0Xp0Sh0]`0\X0^P0sH0t@0_80`00a(0c 0b0000/g/n/e/o/i/h/k/l/j/f/d/m/p/r/q/ux/vp/wh/x`/yX/zP/{H/|@/}8/~0/(/ /////................x.p.h.d.\.T.P.H.@.<.4.,.$.... ...--------------------------x-p-h-`-X-P-L-H-D-<-4-,-$--- ---,,,,,,,,,,,,,,,,,|,t,l,d,\,T,L,D,<,4,,,$,,, ,,++++++++++++++++ + + |+ t+ l+d+\+T+L+D+<+777x7p7d?`?\?X?P? H?!@?"8?#0?$(?% ?&?'?( ?)?*>+>,>->.>/>0>1>2>3>4>5>6>7>8>9>:>>>|>t>l>d>\>T>L>D> <> 4> ,> $>>> >>======;=<===>=?=A=@=D=E=F=G|=Ht=Jl=Ld=K\=IT=ML=ND=O<=Q4=T,=V$=U=P=Y =B=C<Z<[<R<W<X<S<]<\<^<s<t<_<`<a<c<b|<t<l<d<\<gT<nL<eD<o<<i4<h,<k$<l<j<f <d<m;p;r;q;u;v;w;x;y;z;{;|;};~;;;|;t;l;d;\;T;L;D;<;4;,;$;;; ;;::::::::::::::::::x:t:p:l:h:`:\:X:T:P:L:H:@:<:8:4:0:,:(:$:::: :::999999999999999999|9t9l9d9`9X9T9L9D9<949,9$999 9998888888888888888x8p8h8`8X8P8H8@88808(8 888887777 7 7 7 7 7777777AAASSSSBȎ ((((( AAAAAABBBBBB Unknown errorIIIpIXILI0IIIHHHHHHHpHdHPH@H0H H HGGGGGGGpG`GTGDG0GGGFFFPPPPPPPPPPFFtF`FTF) # bold = Emphasized # # all fonts are Near Letter Quality (NLQ) # # The s10 and s12 fonts are Script, which is only available on the more # deluxe models of the Panasonic KX-P1100 series -- e.g., Script is not # supported on the KX-P1180, but is supported on the KX-P1124. kxp1124 b=\033E i=\0334 r=\0335\033F f=c10=\033x1\033k0\033P f=bps10=\033x1\033k6\033P f=bps12=\033x1\033k6\033M f=c12=\033x1\033k0\033M f=p10=\033x1\033k3\033P f=p12=\033x1\033k3\033M f=s10=\033x1\033k4\033P f=s12=\033x1\033k4\033M f=ss10=\033x1\033k1\033P f=ss12=\033x1\033k1\033M # IBM Personal Printer Data Stream (PPDS) protocol # bold = Double-strike # italic = Underline ibmppds b=\033G i=\033-\001 r=\033-\000\033H # Epson FX-86e/FX-800 # bold = double strike epson b=\033G i=\0334 r=\0335\033H .\" Device-dependent but not macro-set-dependent definitions. .\" -------------------------------- .\" overall formatting initialization .\" 12 cpi horizontal exploits 80-column terminal well (6.5i@12 = 78) .^r cpi 12 6 .\" call margin adjustment device-dependent for sake of some unusual cases .ad .\" page parameters .pl 10i .ll 6.5i .po 0 .\" -------------------------------- .\" fonts, and their hyphens, last font change doubled to set up \fP .^f R .ft R .^c hy 1 - .^f I .ft I .^c hy 1 - .^f B .ft B .^c hy 1 -\b-\b- .^f C .ft C .^c hy 1 -\b-\b- .ft R .ft R .\" -------------------------------- .\" definitions of nroff special characters .\" The character definitions here operate on the "better ugly than invisible" .\" principle, and try to approximate the character *somehow*. They were .\" tuned for a Teletype 40 line printer, but should give vaguely plausible .\" results on any overprinting ASCII device. .\" .\" first, things that nroff considered builtins .^c \ 1 \\ .^c e 1 \\ .^c ' 1 ' .^c ` 1 ` .^c - 1 - .\" some things seem to assume that \+ is like \- .^c + 1 + .\" we do not do backslash-space here, it can't be done with .^c, but the .\" other forms of space we can do .^c 0 1 " .^c | 0 .^c ^ 0 .^c & 0 .\" .\" and more normal characters .\" note, the hyphenation logic knows about em .^c em 2 -- .^c en 1 - .\" hy is a special case, see above .^c bu 1 +\bo .^c sq 2 [] .^c ru 1 _ .^c 12 3 1/2 .^c 14 3 1/4 .^c 34 3 3/4 .^c de 1 '\b` .^c dg 1 -\b! .^c fm 1 ' .^c ct 1 /\bc .^c rg 3 (R) .^c co 3 (c) .^c pl 1 + .^c mi 1 - .^c eq 1 = .^c ** 1 * .^c sc 1 j\bf .^c aa 1 ' .^c ga 1 ` .^c ul 1 _ .^c sl 1 / .^c *a 1 <\ba .^c *b 1 ,\bB .^c *g 1 ,\by .^c *d 1 S\bo .^c *e 1 -\bc .^c *z 1 ,\bL .^c *y 1 ,\bn .^c *h 1 -\b0 .^c *i 1 ,\bi .^c *k 1 <\bK .^c *l 1 \\\b> .^c *m 1 ,\bu .^c *n 1 ,\bv .^c *c 1 ,\b3 .^c *o 1 o .^c *p 1 -\bn .^c *r 1 p .^c *s 1 -\bo .^c ts 1 s .^c *t 1 ~\bt .^c *u 1 u .^c *f 1 /\bo .^c *x 1 /\b\\ .^c *q 1 |\bu .^c *w 1 u\bw .^c *G 2 ~\b|~ .^c *D 2 _\b/_\b\\ .^c *H 1 -\bO .^c *L 2 /\\ .^c *C 1 _\b-\b~ .^c *P 2 ~\b|~\b| .^c *S 1 ~\b_\b> .^c *U 1 Y .^c *F 1 |\bO .^c *Q 1 |\bU .^c *W 2 _\b(_\b) .^c sr 2 \\/ .^c rn 1 ~ .^c >= 1 _\b> .^c <= 1 _\b< .^c == 1 _\b= .^c ~= 1 ~\b= .^c ap 1 ~ .^c != 1 /\b= .^c -> 2 -> .^c <- 2 <- .^c ua 1 |\b^ .^c da 1 |\bv .^c mu 1 x .^c di 1 -\b: .^c +- 1 _\b+ .^c cu 1 U .^c ca 3 (^) .^c sb 2 (_\b~ .^c sp 2 _\b~) .^c ib 2 (~\b_\b= .^c ip 2 ~\b_\b=) .^c if 2 oo .^c pd 1 3\bo .^c gr 1 ~\bV .^c no 1 - .^c is 1 '\b,\bI .^c pt 2 oc .^c es 1 /\bO .^c mo 1 -\bC .^c br 1 | .^c dd 1 I\b| .^c rh 1 =\b> .^c lh 1 =\b< .^c bs 4 (:-) .^c or 1 | .^c ci 1 O .^c lt 1 ~\b( .^c lb 1 _\b( .^c rt 1 ~\b) .^c rb 1 _\b) .^c lk 1 -\b( .^c rk 1 -\b) .^c bv 1 | .^c lf 1 _\b[ .^c rf 1 _\b] .^c lc 1 ~\b[ .^c rc 1 ~\b] .^b HF 1 .^b fh 1 .\"----------------- .de TH .ds LH "\\$1(\\$2) .ds CH "Minix Programmer's Manual .ds RH "\\$1(\\$2) .ds LF " .ds CF "\\$3 .ds RF "% .. .\"----------------- .de AT .. .\"----------------- .de IX .. .\"----------------- .de NB .ds nb "\\$1 .lF .. .\"----------------- .de BY .ds by "\\$1 .lF .. .\"----------------- .de UC .BY "\\$1BSD" .. .\"----------------- .\" common initialization for headers and paragraphs: .In need .de In .ne \\$1 .sp \\n(PDu .fi .in 0 .ti 0 .in \\n(inu .it .ft R .ns .. .\"----------------- .de SH .In 6 .in 0 .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .nr in 5n .in \\n(inu .. .\"----------------- .de SS .In 6 .in 2n .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .in \\n(inu .. .\"----------------- .de LP .In 4 .. .\"----------------- .de PP .LP .. .\"----------------- .de P .LP .. .\"----------------- .de HP .In 4 .if \\n(.$>0 .ti 0-\\$1 .if \\n(.$=0 .ti 0-\\n(tpu .. .\"----------------- .de TP .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .it 1 tP .. .\"----------------- .de IP .ie \\n(.$>1 .TP "\\$2" .el .TP \&\\$1 .. .\"----------------- .de I .ft I .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de B .ft B .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de SB .\" Can't reduce size, just do bold .ft B .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de IR \&\\fI\\$1\\fR\\$2\\fI\\$3\\fR\\$4\\fI\\$5\\fR\\$6\\fI\\$7\\fR\\$8\\fI\\$9\\fR .. .\"----------------- .de RI \&\\$1\\fI\\$2\\fR\\$3\\fI\\$4\\fR\\$5\\fI\\$6\\fR\\$7\\fI\\$8\\fR\\$9 .. .\"----------------- .de BR \&\\fB\\$1\\fR\\$2\\fB\\$3\\fR\\$4\\fB\\$5\\fR\\$6\\fB\\$7\\fR\\$8\\fB\\$9\\fR .. .\"----------------- .de RB \&\\$1\\fB\\$2\\fR\\$3\\fB\\$4\\fR\\$5\\fB\\$6\\fR\\$7\\fB\\$8\\fR\\$9 .. .\"----------------- .de BI \&\\fB\\$1\\fI\\$2\\fB\\$3\\fI\\$4\\fB\\$5\\fI\\$6\\fB\\$7\\fI\\$8\\fB\\$9\\fR .. .\"----------------- .de IB \&\\fI\\$1\\fB\\$2\\fI\\$3\\fB\\$4\\fI\\$5\\fB\\$6\\fI\\$7\\fB\\$8\\fI\\$9\\fR .. .\"----------------- .de SM .\" no-op .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de DT .ta +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 .. .\"----------------- .de TA .ta \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de RS .in +5n .. .\"----------------- .de RE .in -5n .. .de DS .br .. .de DE .br .. .\"----------------- .de PD .ie \\n(.$=0 .nr PD 0.3v .el .nr PD \\$1n .. .\"----------------- .\" misc. initialization .nr tp 5n .PD .ds lq \&" .ds rq \&" .ds R \(rg .ds S " .ds Tm (TM) .nr )P 1v .^b HF 1 .^b fh 0 .^b NH .\"----------------- .de r .ie \\n(.$=0 .ft R .el \\fR\\$1\\fP\\$2 .. .\"----------------- .de i .ie \\n(.$=0 .ft I .el \\fI\\$1\\fP\\$2 .. .\"----------------- .de b .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de UX \\$2UNIX\\$1 .. .\"----------------- .de DA .ds DY "\\$1 \\$2 \\$3 .\" keep trailing spaces out of CF .if \\n(.$=1 .ds CF "\\$1 .if \\n(.$=2 .ds CF "\\$1 \\$2 .if \\n(.$>2 .ds CF "\\$1 \\$2 \\$3 .. .\"----------------- .de ND .\" it's our default, ignore it .. .\"----------------- .de TL .rs .sp 5 .ft B .ce 9999 .. .\"----------------- .de AU .sp 2 .ft R .. .\"----------------- .de AI .sp .ft R .. .\"----------------- .de AB .sp 2 .ce 0 .ll -7n .in +7n .. .\"----------------- .de AE .sp .ll .in .. .\" common initialization for headers and paragraphs: .In need extraspace .de In .ne \\$1 .sp \\n(Tsu .nr Ts 0 .ie \\n(.$>1 .nr iN \\$2v .el .nr iN 0 .sp \\n(psu+\\n(iNu .ce 0 .ft R .in 0 .ti 0 .in \\n(inu .ll \\n(LLu .ns .fi .. .\"----------------- .de uh .\" unnumbered section head .nr in 0 .In 6 1 .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de sh .\" numbered section head .nr in 0 .In 6 1 .ft B .\" punt to awk code to get the header numbering right .nH \\$1 .\" and pick up the result \&\\*(Nh \\$2 .ft R .. .\"----------------- .de lp .\" left-blocked paragraph .In 4 .. .\"----------------- .de pp .\" paragraph, first line indented .In 4 .ti \\n(piu .. .\"----------------- .de tp .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .\" .it 1 tP .. .\"----------------- .de ip .\" indented paragraph .ie \\n(.$>1 .tp "\\$2" .el .tp 4n \&\\$1 .. .\"----------------- .de np .\" numbered paragraph .nr $p +1 \" increment paragraph number .ip (\n($p) .. .\"----------------- .de bu .\" bulleted paragraph .ip \(bu .. .\"----------------- .de (q .\" begin major quote .nr in +5n .nr LL -5n .In 4 .. .\"----------------- .de )q .\" end major quote .sp .nr in -5n .nr LL +5n .In 4 .. .\"----------------- .de (l .\" begin list .In 5 .if '\\$1'C' .ce 9999 .if '\\$1'' .in +5n .if '\\$1'L' .in 0 .nf .. .\"----------------- .de )l .\" end list .In 3 .sp .rs .. .\"----------------- .de u \&\\fI$1\\fP .. .\"----------------- .de sm .. .\"----------------- .\" exdented paragraph macro borrowed from Berkeley -ms .de XP .lp .in \\n(piu .ti .. .\"----------------- .\" the -ms accent strings .ds ' "'\b .ds ` "`\b .ds : ":\b .ds ^ "^\b .ds ~ "~\b .ds C "v\b .ds , ",\b .\" post-title spacing (set to 4v if using .TL macro) .nr Ts 0v .\" and parameter setup .nr LL 6i .ll \n(LLu .nr ps 0.3v .nr pi 5n .\" -mnx macros for the Minix "Book manual pages". Author: Kees J. Bot .\" 19 Nov 1994 .\" Uses -ms: .so /usr/lib/cawf/ms.mac .tr ~ .ds OQ \&' .ds CQ \&' .ds SQ \&' .ds M0 MINIX .ds M1 \\s-1MINIX\\s+1 .ds M2 \\s-2MINIX\\s+2 .ds M9 \\s-1MINIX\\s+1 .ds m0 minix .de MX \s-2MINIX\s+2\\$1 .. .de Ux \s-2UNIX\s+2\\$1 .. .ds Mx \\s-1MINIX\\s0 .ds Mp \\s-1MINIX-PC\\s0 .ds Ms \\s-1MINIX-ST\\s0 .ds M0 MINIX .ds M1 MINIX .ds M2 MINIX .ds M9 MINIX .ds Mx MINIX .ds Mp MINIX-PC .ds Ms MINIX-ST .de CD .LP .ne 2 .ta 11m 15m 36m .ds SX Syntax: .ds FL Flags: .ds EX Examples: .ds EY Example: .in +16m .ti -16m \\fBCommand:\& \\$1\\fR .in -16m .br .. .de SX .in +16m .ti -16m \\fB\*(SX\& \\$1 .in -16m .ds SX .br .. .de FL .in +15m .ti -15m \\fB\*(FL\& \\fB\\$1 \\fR\\$2 .in -15m .ds FL .br .. .de EX .br .in +38m .ti -38m \\fB\*(EX\& \\fR\\$1 \\fR# \\$2 .in -38m .ds EX .ds EY .br .. .de EY .br .in +38m .ti -38m \\fB\*(EY\& \\fR\\$1 \\fR# \\$2 .in -38m .ds EX .ds EY .br .. .de Cx .in +8 .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .in -8 .. .de DI .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .. .de SY \\$3\\$1\\$2 .. .de HS .sp 0.5 .. .de SP .sp .. .\" Major section (normally numbered) .de SE .sp 1 \fB\\$1\fP .sp 1 .. .\" Subsection (normally numbered) .de SS .sp 1 \fB\\$1\fP .. .de UU .SH \\$1 .sp 1 .. .\" Start list .de LI .in +0.25i .ll -0.25i .HS .. .\" End list .de LX .sp 1 .in -0.25i .ll +0.25i .LP .. .\" List item .de IT .HS .. .\"Short unnumbered lines .de UN .HS .. .^b HF 1 .^b fh 0 .^b NH .\"----------------- .de R .ie \\n(.$=0 .ft R .el \\fR\\$1\\fP\\$2 .. .\"----------------- .de I .ie \\n(.$=0 .ft I .el \\fI\\$1\\fP\\$2 .. .\"----------------- .de B .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de UX \\$2UNIX\\$1 .. .\"----------------- .de DA .ds DY "\\$1 \\$2 \\$3 .\" keep trailing spaces out of CF .if \\n(.$=1 .ds CF "\\$1 .if \\n(.$=2 .ds CF "\\$1 \\$2 .if \\n(.$>2 .ds CF "\\$1 \\$2 \\$3 .. .\"----------------- .de ND .\" it's our default, ignore it .. .\"----------------- .de TL .rs .sp 5 .ft B .ce 9999 .. .\"----------------- .de AU .sp 2 .ft R .. .\"----------------- .de AI .sp .ft R .. .\"----------------- .de AB .sp 2 .ce 0 .ll -7n .in +7n .. .\"----------------- .de AE .sp .ll .in .. .\"----------------- .\" common initialization for headers and paragraphs: .In need extraspace .de In .ne \\$1 .sp \\n(Tsu .nr Ts 0 .ie \\n(.$>1 .nr iN \\$2v .el .nr iN 0 .sp \\n(PDu+\\n(iNu .ce 0 .ft R .in 0 .ti 0 .in \\n(inu .ll \\n(LLu .ns .fi .. .\"----------------- .de SH .nr in 0 .In 6 1 .ft B .. .\"----------------- .de NH .nr in 0 .In 6 1 .ft B .\" punt to awk code to get the header numbering right .nH \\$1 .\" and pick up the result \&\\*(Nh .. .\"----------------- .de LP .In 4 .. .\"----------------- .de PP .In 4 .ti \\n(PIu .. .\"----------------- .de TP .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .it 1 tP .. .\"----------------- .de IP .ie \\n(.$>1 .TP "\\$2" .el .TP 4n \&\\$1 .. .\"----------------- .de QP .In 4 .in +5n .ll -5n .. .\"----------------- .de QS .nr in +5n .nr LL -5n .In 4 .. .\"----------------- .de QE .nr in -5n .nr LL +5n .In 4 .. .\"----------------- .de DS .In 5 .if '\\$1'C' .ce 9999 .if '\\$1'' .in +5n .nf .. .\"----------------- .de CD .In 5 .ce 9999 .nf .. .\"----------------- .de LD .In 5 .nf .. .\"----------------- .de ID .In 5 .in +5n .nf .. .\"----------------- .de DE .In 3 .rs .. .\"----------------- .de RS .nr in +5n .in \\n(inu .. .\"----------------- .de RE .nr in -5n .in \\n(inu .. .\"----------------- .de UL \&\\fI$1\\fP .. .\"----------------- .de RP .. .\"----------------- .de LG .. .\"----------------- .de SM .. .\"----------------- .de NL .. .\"----------------- .\" the -ms accent strings .ds ' "'\b .ds ` "`\b .ds : ":\b .ds ^ "^\b .ds ~ "~\b .ds C "v\b .ds , ",\b .\" post-title spacing .nr Ts 4v .\" and parameter setup .nr LL 6i .ll \n(LLu .nr PD 0.3v .nr PI 5n   Qk1$T$L 3Xks=XSSSSu XQRP3%PcwU3UU=3t h3 YU VW33ƅuB#ƀPh0GYY3ER\uA33ƅu"Ɖʁ9u 3e 3\ ~}Vh YY>Vh YY,/u533ƅui"ƃ*u  3/E0V33q!"a=uER 3E0V&uER 3E0Vv=Tt* 3j>hYYUBERCu ER 3E0V|u ERz 3E0VikX<=3tQ8G$333ƅuX Ɖʁk=3t8G$333ƅu Ɖʁ=3t7G$3B33ƅuƉʁ=3td7G$333ƅukƉʁ~=3t7G$333ƅuƉʁ/=3t6G$3 U33ƅuƉʁ=3tw6G$3@33ƅu~Ɖʁ=3t(6G$333ƅu/ƉʁtF9v=3t5G33ƅuƉʁu 3=Pt4jPYYtxt`1Y633ƅuxƉʁt*9vG33ƅu@ 3G=\tUBER)QJYUBUPrHYYERDžDž33ƅuƃ'uhY' uhY 3}\u/33ƅuNƃ u3VYƁ|33ƅk_v hBYUJERsDž Dž0[G33ƅu~ƃxtXu'Dž33ƅuO DžVYY|E9sG33ƅu룃ltLu33ƅu 3UJERTj"hYYUBER3ER&hpRYʁ<QUX_^UV333ƅu$ƃ*tEʁ9u3u 3C33ƅu붡33ƅuƃ/u 3^UVWUR7GYE33ƅuv9u  uuh`YY 3uuhHYY\uS33ƅuƃ u*333ƅymVnYƉUAMU9UueuWFYYǡ33ƅ"UAMuW}FYY_^UVWuʁu@2 }s i _pOE1U0щM33ƅuƉʁtG| 3u_^UVuʁt 0.} t!ʁt W^U}} hYF}t'u>YPhYYg5353>YPhnYYUVWu}uhxJYuhp*Y׉>)19>}@19>~@19>@y19>|@k19>u@]19>t@O!>H1>A >=>t t1'>ut1> E M_^UVu 1> EjM^U PEP#YEP}uE1UV&juYYƅu"uh8YYs3uEYuEYPj YjYEPVY=thY 32vuYha2Zvh YY2DF KuHY,h Y 3u2EPYK^UVW=`333EuE}#t!}u 3? 32뼍EPYY=t 31juYYEuuCY}t1q1b`3t h Y}u+9=`u# `P# 3[1`3t hp Y81}`3@9=` 3619=`u ` 3 `ULB ,J_^U4U4X\Y6X\49Uu=4t1UVWTEPY=tuu hM Y1T 3 04 3 1u@4]SPV/ u.=HtVh YY Vh YYVYCuYuY35`44dU33_^UVWgEuh^ Y 3(/33ƅuƃ(uRxPxPYY=u 3.ux@Y33ƅuwjV-YYƉʁ9uDžtDžp) 3pP~x1PYYtjpWtjuF YYP3_^U=`| h Y``ƀ3U4 `9 d} 3th8Y- `jWYUV-4 `9 d} 3t hXY`3@jY^UW-4 `9 d| hxbY `URujYUVW%DžuhY1jW YYW>Yt ~t13Et j`Y 3,_^UVWDžt:jW YYƅt!~tV T VTFW >Y hY 3J,_^U EPYE 3(,U3}u U3UVW}U U33ƅu jV*YYƃ)u 1Dʁ9thdYUU EU 9Ur h@hY33ƅu ƋU EU 9Ur h*YʁuUBWUU9Uw&E708YYu7hdYYE҃jV)YYƃ)u+UЙC,thY,33ƅuT jV)YY_^UVWURUt,u rYYWUrhYYUr>F$3 >F$3 >F$3 >F$3 >kF$3 >LF$3 >t1F$3 @>tF$3 jjhT7 EUBUM JUMJUMJ EUBUB_^UVu >t%Pud6YYu+U Й1^U`VWUR 8YE133ޅuL Ɓʁ9\33ƅu ƃ u9j uWZYZ333ƅu j\uWZYZ9}_euu7YYEG/y33ƅuo ƃ*u"33ƅuJ j/uWZYZ9}euu#7YYE}ʁ9UU E33ƅuƍU9Uw U EʁuMUuEPYYEtD PuWZYZ9}euuY6YYEUM)AMUUU9Uweuu#6YYEEERRuWZYZZuOPuWZYZ9}ueuu5YYE33ƅVJjuWZYZWu5YYEJE E_^UVWu }? t? uG> t> uF?t9uGF?u> t> uF1-? t? uG> t> uF?u >u1_^U=3t#u5353hhZ/uhH/YYUU UhY4uuh. hh/YYUU UhcYuuh. hh.YYUU Uh&Yuuhe. hh.YYj<YUU UhYuuh . hhB.YYj}<YUUVWI u2h 2Y=hW<}h9U v#} ~E P2Y5+U wU IM t EEF5UW_^UVW}EGEtUUU3E1U+UUU UE0t9UU~UG)ۉ]uE:u}u6}|u뾃} }1!u uu ƋEE0_^UVW>t)j6$YYǃ t hlYVW :EEPQYPh /YY&"% jjjh jh`YYP,jjjhPjhTYYP jjjh@jhDrYYPjjjh4jh8PYYP_^UVhV1Yƅu1454F^UV5,t3V h3FP!:50t 0j$0Yƅu1,F 5,^UV5,6, 0 ,05,u,1!V 3FPh39^Uuhu u8u1EU UVW}W-YPu -YZP0Yƅu10E0?tGFЄuF/E E Fu_^UVW}EEu E} t?/uEPjW)7 `1E 8M] E EPW3) u1EPju6 t}u0YE맃}|ƅu}t ut6Y1ZF3tFP53uk u}t u16Y1UV}tE81_^UV^ƅu1U VUV3F^UVW5,u IVV93s14~ 1~Džt>~~8FPvv t"~~V3у 3t~t v=5Y839~t 4U54/YU4F8Ftt"F gt F S~ t=39u:jt"33EuEE39_^UVW}j/W+YYƅt~uj/W*YY?t ?/u 9u#t)BRW,YY/_^U 41U4 `9 d} hY=3t hY4I 4d`1UVWu 4j(@+Y4\5 X544B4Bc}~'V:-uzt~G?-uGW3YMӋUJFPRYY54PY_^UV1BE 053B3$3 ,E 354hYY EL4EPjV? u!tP54h tuY3VEY=LtVY^UVW=4}tAj.u(YYƅt(~t"FoFj/u(YYƅtVUE=Pt+h@j5P1 u5PhdYYt, dth(j{h@0 uw<YY_^UVjuYYƃ~ uF d4V54^U=A5tj hu' t@=E5t!} tuu h|5@#uhx5@# UVWeUƀ4fhu&YYOUBPh$YY6UBƀ4#LU:t PHUBƀ4u˜:tuhlYYu>tœtF>uh!>=uFuhPgYYyjW &YPjWju(YYPRU:tuX5\59X5~ \5R54'YY4DA DUX59UU 4UU4uEԋD 4EPY<U:t h<Y=<@~j@hYY<@=<jhY<PU:tHjuYYƅt6~t0V T VTFEEC0_^UVW1Eރ0|9k 0ߋEۉ_^U=Hth h`5h|/ UhVW`5E`UDž=(5uW53hh :t"9uu r`5F333Džuǃ#u; 9uu `5 F33DžuA39u39U{3U3=(5u]5353hh:t"9uu s`5FǀtRu?9uu A`5 F=H5 -`5Ph`5h-  h{Y/ 33Džu)ǃ*~3=5t&9uu `5/F9uu `5*F33Džuǃ u"39uu i`5F뾁u?9uu K`5 F=H? -`5Ph`5h, *g=5t9uu `5F33Džu!ǃ/u=5tG9uu `5F1 3=59uu `5F 333Dž9uu L`5/F9uu 4`5FDž9uu `5F33Džu2ǃ u?9uu `5 F=H-`5Ph`5h:+ \uL9uu `5F33Džuǃ u3 Dž9 9uu "`5F 33Dž<0L9uu `5F33Džuljʁu.u?9uu `5F33Džuljʁue9uu L`5F33Džusǃ+t-u/9uu `5F33Džu:ljʁ9uu `5F33Džuljʁu;9uu `5F33DžuǃxtXuD9uu S`5F33Džuzljʁuʁ9uu `5F33Džu"ljʁuf<=3t $333Džuljʁ=3tS $3633DžuOljʁo=3t $333Džuljʁ=3t $333Džuljʁ=3tE $3(33DžuAljʁa=3t $3 33Džuljʁ=3t $3@t33Džuljʁ=3t7 $333Džu3ljʁtW9sI=3t 33Džuljʁu 3jPYYkxte33Džu~ljʁu 3!Yt$33Dž9:t"9uu `5Fӡ33Džuljʁ9uu m`5F33Džu9uu <`5F33Dž_ʁ#_^U VWUrFtrhp YY1T~Ft=Xu14F~d~UrhP YY133UuEF%1ۅESPYYE}(t% 3FuUrh4 YY1F\EtjuYYEE\}(u?33UuEEjP+YYE})t h( FY}u h 5YjjhXb ǃ}tUzt E E ju^YY44W `U=`Uw}t uDYuYEjjhX ljwFt uoY~VUV UF FEPuu EGuuYY44W `U=`U_^UVW}ws53YF FdUV"V53RoYYh vYY>j 53YYFvbYF h "YWB _^UVWURJ MQYEURz?MG%EHU UU:tЋMCP]ZU9UueuVYYEɊGUAMU9UueuVuYYtUUEUBRVQYY_^U3U VW5`UE|U49V ]V%Vzt ׋J~t vY}u U`UUEX5Xuu|3_^UVWURzidYidijj)j( =idisii h \YiA iu'5di˜:t> uF>u i9=it3Urh YY9=i}idi i߸di_^UVW}t)=idisiiM h Y33ƅuaE 9x}z=idisiiVh JYFUBRj)j(Y 333ƅuƃ#u"n33ƅu 3=idisii h Y 33ƅulƃ*u  3=idisii/h [Y}uY=idisii hx )Yi=i | h\ Yi i diM=idisii)h8 Y=idisii h Y33ƅuLƁ9\uI=idisii h 5Y33ƅuMD u?3h 9Y=idisii]h YP=idisii h Y33ƅ[ 9u4=idisiihp QYhX xY@=idisiiqh4 Ya _^UVWu1ʁ9u133ƅuу} t4ʁ9u$33ƅub3G뗃/uV33ƅu9ƃ*u)33ƅUI 3/4t.#u)33ƅ _^U VW33ƅuƉʁ9vjʁ9tʁ9E33ƅu;Ɖʁ9tFt>\u/33ƅuƃ u3E}u9uʁ9."33ƅ \u133ƅuƉʁ9u3/u)33ƅuKƃ*33ƅv3uh, eY 3_^Uo1ukaZSLE>7 0 ) "   P E0Uh4MYU3uY3@juY @j=i)tj)Y =jtUFEPCY_uYuuYY. iu~Y3t jzUViiu Yo53Y9EijDYƅtYuBiEPY iEPuOYHPYYuuu ' @ j i^UVEEDjuj?YHP+YY Djj?Yƅu Djz_ DjHjiEPdY Hj=i:tj:Y iEP*YE8tEE] j^Uu YUVLjzuY5j,Yƅt6uTEPYuj,u j` Lj^U3EUUUUUUj1UXj3EU=it hY 3EUuYUhPYHx=it hZYhPYU.i9Et u0YUhr iZBj} jYUVW}u =i}uI=i=ijY螷i~=in܋iUrj} jYBUUrǍjֹ j֋U9it u8Y_^U}u =i~K}u9=it6=i~-jY϶i~=it uYUVW}1[t1j)\#jѺt~}r9ju_^UVW1j<jtgjU#jѺU|'70)" Q^Uuu P PPu UUURu P PPuv UUUjuuu uJ ZY EU#+ $E{1U$VWu }>W>%CE0F>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u E,U܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}`1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋EN} N} Džu}t N-N0_^UVWuFuNE E Fu_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVuFu+UJ^UVWu }UуMt%F9u Gu1N)ۉ1_^UVW}1?tG9E uN_^U VWE8L}~UU RYDžu}uhMt} ׋U E8E8E}} Nm 먃} rm U уM tGE_^UVuYƃ}t u^UVW}u YEƃ} t u\U уM tGFE_^UV}u u NYu uYYƃ} t u^Ujh@h jYUVW}u1_}s EUU}w&U_^UVWUrRUu!URUm}s7UrtUV_^UVU4tV9U wv1^UVWU48s>tWtB1_^UVW=`uFFFFN#VV5`U )Vt#WtWYVWYY_^UVWUu ֋MzFFFFN#VUV)V`9Ut$#WWtWkYWV YY5`+UMQVY_^UVW} w։+UMQ9=`t#VUV9=`u U`_^UE} | E PuYY E 0UjEPu/ UuYPuh jhh u hxYYj hh uYPuh j hxh j=Y1UVuYƅtu1^UVutF6+Y^UVWƅ1juYYDžv1juYYDž}juYYu#1XjjW }5WY1E0_^U}u1!Euu 0c ]1ۅÉUjYjYr EUVXs~u1^UjYU}u1Euu 0 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇtPXPO/oU$UUEEEEEEPjj U$uEP~U UEPj!jVU(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjjp U$uEPjU UEPjjBU(UUUUU UEEEEPjj E=uEUu UBUM JUju RU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjjG ^U$UUUUU UEEEEPjj UVuU VVuYYEtF~}Vډ\F^U,EEEEEEEPj j E=uUUԃ}tEEU$UUUUU UEEEEPjj UVW11U F|_^U VWE8dhE1)UL֋UVNdEUM9J̋uE/U L׍WOdEU9V_^UVWuuօu >:uF>/t]ׅtWYPVYZ=sWPhPJVP=jVYY=wh PVKEVQ},GփRH FP9] F P+U BF$PU BF(P U B ] ;;2U zz zzrz z 2 9Jt U kB,kZZ E  9UU:u@Fj;jEPVZƅtkE<>:uFj;jEPV7ƅtU_^UVu>-u EF uF<+u E1u VAYYƅt}tE ^UVWu} >Ju&FhmPGPVs>MuPFj jG PVyƅu1lF<.ujjGPVTƅtۊF<.u1jt1hmxt>/uFGPVlYYG _^U,VWE udE uE u1u}ExWJi€QE}&<EQiGQEuE1kE0i0lQEEW J9U|ߺ W ЙBU U JE EdƋEUkE- @EPEZPZЉ)ڹЙօ}W)U}EE"kE0W JlM9 ~uEU9WiEQEUWU_^UVWuu}t VYEuփ}3r)E2 VY+EE=} >>tEPVYYƅtߋ} Wh YYE؅t>nuVY+EE=|>t!>,t>;tEPVoYYƅuzUU>,t >;FEPVYYƅIF<,>EPVvYYƅ(>GGrUډLLJPUBTUډ\LJ`LJdWU䍗UEuEPVuEuEPVu E9E~)]E]EEEUEE*EEUEEEEUEEhuduu1ZiQEF*>}EEEEEDžtLtփztBUUUU}t 9U_UڍLtΉUBVELUULtM M}t 9MUڍLtΉFEEtU9WH}}EEDžxU9WU L֍WxU2}t ~ uEEZЋ]VUExEGGUډLLJPLJTUBW }tUBW  3uuW< }׉G}tuuW U1_^Uuh`YYtjuh`B UVh, Yƅu 2>u;8<&&h`h$'fYY5h8V8YYt$>:tjh8V t h89Y`^U2h8jYYt h8Y.UVWEU=2u 8׃ztU9W~*E17PtKEW9U|E4EU9T7EU9WUJMULuW6EPUNJ VMI dVMQ(_^Uh2ju 2UV2UU=2u2h(YVh(juF(02^U0VWEEEUUM܃E}|OU u֋E9|9u.}u~UMI ^9\}1EVUEQƋEUU +UU}}EQNmQF}Q}}EGEU<ЙGE}tFW}GE|SEudEuEu1EU9UE+U؉MEudEuEu1E|UlWwkE0lEG +UԉGWMU9~BW G U W$_^UVWu} uֹ 0VֈM_^UVuh4h2AkFjPh2kFjPh2 jv h2tjvh2ejvh2Vj6h2HlVjRh23\2^UuPRYYUVWu }U9|}}0>}+U} ډЙ}@+؉ډЙ}+Uډ_^UVWu} V+WUu3V+WUu(V +W UuV+WUuV+WUu+UE_^UVWEuEP Y}>}}}jM}}6u݃=jtjuNY_^UEPuYYU VW=uE 9t FE>u}5XEuW6 u0UU:=u#+XЙ] UUR >ujX_^USE] ![]USE] ![]USE] ![]UVW}u MGUVWME_^]U} |} ~\M E 1U} |} ~\M ҋE!1UE1UE1U} |} ~\M Et1U$EEEEEEEPjj U$UUU UEEEEEPj%j U(VWu UJ| x cAJ +k Impossible character classstringcharacter constant too longnewline in character constantcharacter constant too shortmissing =file specifiergarbage char \%03ogarbage char %cnon-ascii '\%03o' readend-of-file inside %snewline in %s+ b f n r t %s deleted%s missinggarbage at end of line% & *8 +D ,-K / <p >~ ^ |   V    c  / by 0%% by 0B!)-%~!m %_fillegal # line%s: unknown control#line without linenumber%s: unknown controlc|mmm#else after #else/#elif#elif after #else/#elifcannot find include file "%s"cannot find include file "%s"bad include syntax#define: illegal macro nametoo many nested #if/#ifdef/#ifndef#elif without corresponding #if#else without corresponding #if#endif without corresponding #ifillegal #ifdef constructionillegal #undef construction#define: bad formal parameter listformal parameter "%s" already usedformal parameter buffer overflowformal parameter buffer overflow#define: bad formal parameterredefine "%s""%s", line %d: %s (warning) CRASH fatal error -- pragmaundeflineincludeifndefifdefifendifelseelifdefinedefined__FILE__0__LINE____DATE__maximum identifier length insufficientunexpected EOFmissing #endif/usr/include'&&stdin%s: no source file %suse: %s [options] [source]p->id_resmac == K_FILE/usr/proj/em/Src/util/cpp/main.ccould not open %s%s %s: %s /usr/include/) -(AF)C3)D)I*M*P3)U+dF)ir)mr)u)minimum identifier length is 8maximum identifier length is %dmalformed -M optionmalformed option -D%s1identifier missing in -D%sillegal option: %cndefZ7b/Z7Z7Z72{/{/0non-ascii character read#%s %d "%s" #%s 1 "%s" 0 1 identifier missing) missingmacro %s needs argumentsmacro %s is assumed recursivemacro %s is recursive:FB:L:(macro_func)"argument mismatch, %sactual parameter buffer overflow@ ="W?'W?(=,>/e>@actual parameter buffer overflowunterminated macro callactual parameter buffer overflowactual parameter buffer overflowactual parameter buffer overflownewline in stringactual parameter buffer overflowactual parameter buffer overflowactual parameter buffer overflow(getact) too many actualsactual parameter buffer overflowactual parameter buffer overflowactual parameter buffer overflowactual parameter buffer overflowactual parameter buffer overflowunexpected EOF while skipping textD!D%D&>D(D*D+"D,hD-"D/D:aD<0D>0D?aD^ED|LD7DSD)D 0D 7D 0D )D ZDEEEDDDlEElElElElElEUEUEUEUEUEUEUEUElElEEEEEUElElEUEUEUEUEUEUEUEUEUEFFF@FFFF GF GFWGeG eG^G^G{G{G{GGGGGGGGGGGGGGGGGGGGGGGGGGGG$Id: rec,v 2.23 1997/02/21 11:23:55 ceriel Exp $HL 9L 9L 9L 9L 9LKKKKKLL L L L $L +L2Lbad tokenerroneous||>>>===<=<<&&!=integerfilespecifierstringidentifier1MbMdMoMuMxM%Out of memory TTTTTT" failed : assertion ", line ~ZZeZ~Z ZZZZZ //usr/share/zoneinfo/etc/localtimeGhg7gHgposixrulesTZ Thu Jan 1 00:00:00 1970 ,$   @ p?    0123456789ABCDEFSSSSGMTmnSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec ((((( AAAAAABBBBBB k  B`1$T$L ;`s=SSSSu QRP;-P+U=;t h; YU(VW}ƀ  Ph`$YY <R ~}VhP#YYVh<#YY돉7V c=u R =t<<7V] &u RG =u R1 =t<<7V +u R =u R =t<<7V -u R >u R =u Ri =t<<7V< =tC=t<<j>h,% YYGRuQ ==u R=t<<R=t<<7Vs|u R]=u RG=t<<7V=u R=t<<7V=u R=t<<7V=u R~=t<<7VQ*u=<u ? =u R=t<<7VVhYY hh'YGRj"hYYGRQ ="uj"hYYGRn'uhYGRJ=t<<Dž=t<uDžƋ ; oƀL} ;>ƀLL ; ƀL ;xƀL ;GƀL ; zƀL ;@IƀLt[ ;ƀLt.9s ƀLuҁ=t<<=t=jPYYt#xtu9YdƀLt'9s 6Ё=t<<Dž=tGR)QWYGPwbYYhDž DžDž.u7V0u.QƃxtXuDž6 DžVYY|W|9~}|GutUu!GƃltLu2)ltLuxƃutUuG`ƃthYG}G=t<<WRAR7=<JVhYYlbUX_^UV|<ƃ*t*u<u |<wnƃ/u |<^U VW1EHƃ'uuheYYf'] uuhCYY<A\uP:YƁ|}sUщ E뚃}vuhYY}~uhxNYY_^UVWUR@TYEp9}  uuhYY<kuuhbYYR\u=uPVYljUAMU9UueuVTYYmUAMuVSYY_^UVWu   1TjVYYE=t }ف=t<<c_1E0ƀt E}|ف=t<<_^UVu|t9} 0qgt 0UNt 0}9>}11ۅÉyU#UEEEUUU|9}|1U‰*uhY E 8dt>}9>})ЉU#UEUUU|9}| U)E׉>{)pc[E 8tI;.U>}E 8t<tt 19>~Ct119>~@19>~@U>}E 8t<tt 19>|Ct119>|@19>|@v19>u@h19>t@Z!>S1>L >E>t t1/>ut1UE > XEZ_^UVu 1> ErZ^UVU1҉EPAYUt}t t}A1E^UVEPYE$juYYƅu"uhYY Au~NYupNY5jYjYzEP;Y=thIY@suYe^@Wj YMvh YYN@7(F XurYhY$@ dEX^UVWU|<{ƀu k#zu |</u3*t'=tG<<,b듁=t<<d?dEPYE}t}t h Y?juYYEuuh YYuSLY}&>><t hb Y}u.U9u# L |<r>r<t ht Y<@}u0U9u%,>t=>u h\K Y |<`>U9u+=t=>u h@ Y  |< = UB FV_^U >U>;D >9Uu=>t1UVWEPY=tuu h Y1<t h Y> < 1u@>]SPVD u.=tVhB YY Vhx YYVYCuYuY<5==U<<_^UVWEj@YDžuh( Y{ƃ(u7xPxPwYYE=u;W+IYx?jV:YYƉ<<pP}~x1P6YYtjputjW! YYP<<_^U=| hD Yƀ<U= 9 |h| Y:1<thh Y: }jYUV:t=>u h Y= 9 | h, Y3<t h Y<@j/Y^U5:t=>u h T Y= 9 | hY U>ujYUVWjYƅuh\lY1jVr YYVGY9t,t(=>u}t0(Ph8YYt t13Etj8Y_^UVW}uj`YDžjW YYƅtD~t>VB tWhYY&V2UFYV @ V@F}u1W-FY8t!=>uhY hxSY_^UVEPjCYYVh-YYVEY<^UVW}U UjV7YYƃ)u 1tthpYUU EU 9Ur hLY`ƋU EU 9Ur h(kYLu͋UBWUU9Uw&E70>MYYu7huYYE҃jV6YYƃ)u+UЙ/,thYjV[6YY_^UVWURUtMB tUrhYY%Eu 0YYuUrhxYYu DY5Ur>F; >F; >F; >F; >kF; >LF; >t1F; @>tF; jjh@? EUBU EUMJUMJEUB _^UVu >t%PuKYYu+U Й1^UxVW}EƺWRb@YGG t u Elу't "uԃ}tEj W2YYVW2YY\u-PW2YY9utt u9utuhYYVW2YYB/uFƃ*uE}tEj WU2YYj/WK2YY}t UU E\ƍU9Uw U ELuMU}tEj W1YYuEPYYEt PW1YYZUUU:HEPW1YY〾 }tEj Wb1YYVWY1YY.uƀ VW71YYzƀLu .VW1YYX=etEuVW0YY<ƃ+t-uVW0YY"릃}tEj W0YYVW0YY[W+WE W+WBRw>YY_^UVWu }? t? uG> t> uF?t9uGF?u> t> uF1-? t? uG> t> uF?u >u1_^U VEPKYƃt1U<u U<^U=<t#u5<5<hhpCuhpCYYU >hYU URuhp}C hhpCYYUh kYU URuhpBC h hpdCYYUh 0YU URuhpC h hp)CYYUh$ YU URuhpB h hpBYYjHYUh0 YU URuhpB h, hpBYYjGYUUVW"I "u"2h ;Y"=""h"W H}h"9U v#} ~E "P:Y5""+U "wU IM t EEF5"UW_^UVW}EGEtUUU3E1U+UUUUE0t9UU~UG)ۉ]uE:u}u6}|u뾃} }1!u uu ƋEE0_^UVW>t)j6$YYǃ t h YVW PFEEPYYElPMIRp 4|h h"@jh"CYPjh"jh YYPEUM0rqh h"}@jh"CYPjh"jh TYYPojjjh jh 2YYPMjjjh jh YYP+jjjh jh YYP jjjh jh YYP_^UVh8Yƅu1"5"F^UV5"t<V h<FPD5"t "j$n8Yƅu1"F 5"^UV5"6" " ""5"u"1!V <FPh<ZD^Uuhu u|Cu1EU UVW}WAYPu AYZP7Yƅu10E0?tGFЄuF/E E Fu_^UVW}EEu E`} t?/uEPjWA `1E 8M] E EPW3) u1EPjuA t}u(8YE맃}|ƅu}`t uDAY1ZF<tFP5<uk u}`t uAY1UV}tE81_^UV^ƅu1U VUV<F^UVW5"u IVV9<s14~ 1~Džt>~~8FPvv t"~~V<у <t~`t v @Y#<#~t "U5"6YU"F#Ftt"F gt F S~ t=<#u:jt"<<EuEE<#_^UVW}j/W>YYƅt~uj/W>YY?t ?/u 9ul #t)BRW3YY/h _^U <1U= 9 } h Y=|<t hp Y=I =1UVWu $>j(2Y>0> ,>> >B >B}~'V:-uzt~G?-uGW7YMӋUJFPRYY= >t1P>Y_^UV1BE 05<B< < ,E <5$>h fYY E?EPjV2 u!t P5$>h $ tuY<VY=tVY^UVW=(>}tAj.u<YYƅt(~t"FoFj/up<YYƅtVUE=t+hj5< u5h qYYtuw<YY_^UVju\YYƃ~ uF d(>V5(>^U=>tj h uw; t@=>t!} tuu h 57uh 57 Uh, YUVWWUƀ=XhL u:YYAUBPh8 hYY(U:t  UBƀ=ut tuh YYu>tLtF>uEjh x/YY9>=u FV9YEPVS/YYuh YYLjujWjuYYP*U:tu,>0>9,>~ 0>R5>$/YY>A U,>9UU >UU4uEԋ >EPYU:t h Y=@~j@h YY@=}Fh Y/=&U:tuTYEE< ;_^UVW1Eރ0|9k 0ߋEۉ_^Uh h4>hh]: UVWUR^-YEE V+U9Uu URu-YYEENE}t-9}u EW\NF+ǃ u=L't"u},/u' =*u =<t/F 9^FM=#uj ,Y##Bk P5#,YY#}tuhT YYk# #<k# #<Pk# #UP#<_^UpVW4>E4^E==uFE4^5<h h uA3U:t9uu 4>EEF<EEǃ}=#E<U<U܋#9UE kE #<kE #P<<9Uu<9U<U<U==E4^5<5<h h h4^82N4>rt> uNFƁ4>r > t> uNF9uu 4> FU؀:t9uu 4>EE؊F܋U:t9uu 4>EEFkE #PUU:t9uu h4>EEFN4>r > t> uNF9uu 54> FEkE #p+YES5#+Y##U<U܉<<9Uu<9U<U<U==E4^5<5<h h h4^0N4>rt> uNFƁ4>r > t> uNF9uu 74> FU:t9uu 4>EEF܀t //=<ǃ*u;EPVrYYƅb==u9uu 4> Fn둁=t<</ 9uu e4>F%E#u>EN4>r > t> uNF9uu !4> F!E<9Uu<9U<U<U==E4^5<5<h h h4^.N4>rt> uNFƁ4>r > t> uNF9uu [4> FU:t9uu @4>EEFǀ\uIN4>r > t> uNF9uu 4> F-4>Ph4>hhM3 sh Y/N=<Azǃ*u>EPV@YYƅ0==u9uu {4> F<89uu \4>/F N4>r > t> uNF9uu -4> F}E9uu 4>Fǃ uIN4>r > t> uNF9uu 4> F-4>Ph4>hh2 B\u29uu 4>FQǃ u <EE}C9}:9uu L4>F 79uu #4>F.ǃ.o=.u29uu 4>.F9uu 4>.F=t<<.cV9uu z4>F:ǀLu .)9uu M4>FetEu.ǃ+t-u9uu 4>Fǁ=t<<"t'u9uu 4>LFLUUUUE=tuEFNjU E;F(ǀLGU E;ǀLU E;ǀLU E;ǀLU E;|ǀLU E; oQǀLpU E;@D&ǀLtIU E;ǀLt"U9Us U EǀLuރt%=t<<UjEPYYEx=}uYt9uu 4> FD@UUU:t9uu V4>EEFǀL9uu &4> FUUUU:t9uu 4>EEFǀL9uu 4>Fփ=<t9uu 4> Fea9uu 4>FEAh -_^U VWuE4^E|<==t&9uu (4>/F9uu 4>*FǁuKN4>r > t> uNF9uu 4> F-4>Ph4>hh0, 1==t9uu 4>F u(<E ==u9uu r4>F*uH-ǃ/u==tB9uu D4>F,}/u h mYE*} |<_^UVWu~u1VB t1jjhD^ ǺWRGYGGjhhH3 GwVW0YYu1F<W+WRwYYV U <W 4_=4__^UUVW}1 }'W <tW 4Y4YFԋH=H_^UVW54_1cU<9V ~LVR U%u U4_Uv>YvUYD5Du_^U VWuU zVUyG t!=u1VYEjuYYE=(t)=t<<1Fu VYYG t u M Yuu V V9Vtzt jVYY_^UVW}EEjVYYƃ(uE#jVYYƀm`h8 "Y}t)t h, Y}t)t%=t<<j0WXYY=t<<jYEtjuYYEu1YEAjVYYƃ}t)t h OY}t)t%=t<<}tUzt10PW YYj Ww YY_^UVuVRgYFRPY^UVWUrU RRU1VYWE=)=t<<uYE=)g},th .Yjju V N Gu h qY | h YVYjju V N G9}~ hh Y9}} hL Y_^UVW4_UzRr>tjPu/ F烿yEU<P}ujj(u jj,u U4>tjPu FEjj)u _^U$VW1E1u}ƅt9= '+ ' '=t+ׅ} ډ '1|t bDžuDž Dž9} ƀLű1=t<<jPYYtu~Yvut*ztRB t1Pju :h1PSu ҅u ujYG6 1PVu .uTƀ t01=<<1PVuH <ƀLu .i1PVu =etEu1PVu ƃ+t-u1PVu 1=(<< (uE1PVuz )u(M} )1PVuM ,u>}}t h WYu ,1PVu  y (<ƀt //{=*u,=<u#1Pj u 뫁=t<</1Pj/u[ M^#u DHuhVY)/=t<< 1Pj u H/z=*u(=<u1Pj u =t<</1Pj/uV 't "1PVu) =x9l\u1PVu 1 u,h Y<1Pu 1PVu v9th Y)A1PVuq }u 1PVuI _^UVW}wj #"5<h #sYYh`h #YY #h #pYF;j 5< YYPSYFhPYWB8_^UVW}U R2EU R1zt@E>>'t >"VEPW YY>\u FPWYY>uheYF9EuĀ>tFPWYY듀>#}u ~#F>#tFOW9WrW\tOW9Ws E W9Wr W:uOGW+WUu\tFF%EUH˜Ut8U\tEU:uEU:tEPWYY}~WULtM}WU:rWUd>u E!LCM}~WULtM}WU: WUuVW F%EuUu\tEU:#uz#uUMI˜UUMI U}tU:tEPWYYW9Wt zSjWYYDFPWmYY2}t hdY_^UVW}EEEU u\tE U E %EUH˜4j"WYY>\t}uEj WYYFE}u>"t>'uE9Eu }uE1=\uC]>"t }t>\u j\W\YY>t>uFcFPW?YYQOW\tOGj"WYY hYE _^UVWuV+V׍W9VVVvvL YYFFE ^FV_^UVWUr+V׃}|0B9VVVvv YYFE }t]+׉B9/≖ YYE _^UVWu1u 3} tu<Gσu=<t 븃/uOƃ*u=<u'չ됁=t<</t#u蟾蒹J_^UVWE1o= t\uT= u9u1̃'t"uEZ/uC=*u=<uV듁=t-<<u =<Z\MEAt WhWYY<E_^Uo1ukaZSLE>7 0 ) "   E(UEEPh>YYU;u uaYY7_u uIYY _=H_)tj)TY =`tUREPYu uYYu uu 2 8_u ukYYtݻ`OU V8_<_uu wYY~5;qY9ExjYƅduM@_EPYA @_EPEPu YHPw uuuuu %`o <_^U VWuEE_u Vj?YHP _j?YDžu _l __D_u EPsYY _=H_:tj:~YK D_EPEP0YY>tUUUE x`_^Uu u YYUV_u uYY@j,:YƅtAu*EPEPYYuuj,u u豶` _^U;EUUUUUU`U`u;EU=H_t hY;E;E Uu uYYUVu +"  ukaZSLE>70)"  ^U0PYH=H_t hZY0PYU蒣H_9Et u0YUhpH_ZB`} j艳YUVW}u =H_}uI=H_=H_j_^UVWUrRUu!'URUm}s7UrtUV_^UVU4'tV9U wv1^UVWU4''s>tWtB1_^UVW='uFFFFN#VV5'U )Vt#WtWYVWYY_^UVWUu ֋MzFFFFN#VUV)V'9Ut$#WWtWkYWV YY5'+UMQVY_^UVW} w։+UMQ9='t#VUV9='u U'_^Uuu P PPu UUURu P PPub UUUjuuu uJ ZY EU#+ $Eg1U$VWu }>W>%CEܼF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u EU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW} (1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋ENL} NL} Džu}t N-N0_^UVWuFuNE E Fu_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVuFu+UJ^UVWu }UуMt%F9u Gu1N)ۉ1_^UVW}1?tG9E uN_^UVuYƅtu1^UVutF6+Y^UVWƅ1juYYDžv1juYYDž}juYYu#1XjjW }5WY1E0_^U}u1!Euu 0c ]1ۅÉUjYjYr EUV`s~u1^UjYU}u1Euu 0 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇtPXPO/oU$UUEEEEEEPjj U$uEP~U UEPj!jVU(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjjp U$uEPjU UEPjjBU(UUUUU UEEEEPjj E=uEUu UBUM JUju RU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjjG ^U$UUUUU UEEEEPjj UVuU VVuYYEtF~}VډF^U,EEEEEEEPj j E=uUUԃ}tEEU$UUUUU UEEEEPjj UVW11U F|_^U VWE (  E1)UL֋UVN EUM9J̋uE/U L׍WO EU9V_^UVWuu(օu >:uF>/t]ׅtWYPVYZ=sWPhP^VPQjVYY=wh PVKEVQ},GփRH FP9] F P+U BF$PU BF(P U B ] ;;2U zz zzrz z 2 9Jt U kB,kZZ E  9UU:u@Fj;jEPVZƅtkE<>:uFj;jEPV7ƅtU_^UVu>-u EF uF<+u E1u VAYYƅt}tE ^UVWu} >Ju&FhmPGPVs>MuPFj jG PVyƅu1lF<.ujjGPVTƅtۊF<.u1jt1hmxt>/uFGPVlYYG _^U,VWE udE uE u1u}E8xWJi€QE}&<EQiGQEuE1kE0i0QEEW J9U|ߺ W ЙBU U JE EdƋEUkE- @EPEZPZЉ)ڹЙօ}W)U}EE"kE0W JM9 ~uEU9WiEQEUWU_^UVWuu}t VYEuփ}3r)E2 VY+EE=} >>tEPVYYƅtߋ} WhPYYE؅t>nuVY+EE=|>t!>,t>;tEPVoYYƅuzUU>,t >;FEPVYYƅIF<,>EPVvYYƅ(>GGrUډLLJPUBTUډ\LJ`LJdWU䍗UEuEPVuEuEPVu E9E~)]E]EEEUEE*EEUEEEEUEEhtuduu1ZiQEF*>}EEEEEDžtLtփztBUUUU}t 9U_UڍLtΉUBVELUULtM M}t 9MUڍLtΉFEEtU9WH}}EEDžxU9WU L֍WxU2}t ~ uEEZЋ]VUExEGGUډLLJPLJTUBW }tUBW  3uuW< }׉G}tuuW U1_^UuhYYtjuhB UVh\ Yƅu l;>u; ((X/`/hh/zYY5h (V8YYt$>:tjh (V t h (9Y`^Ul;h (jYYt h (Y.UVWEU=l;u (׃ztU9W~*E17PtKEW9U|E4EU9T7EU9WUJMULuW6EPUNJ VMI  VMQ(_^Uh;ju ;UV;UU=p;up;h1YVh1juF(9;^U0VWEEEUUM܃E}|OU u֋E9|9u.}u~UMI ^9\}1EVUEQƋEUU +UU}}EQNmQF}Q}}EGEU<ЙGE}tFW}GE|SEudEuEu1EtU9UE+U؉MEudEuEu1Et|UlWwkE0EG +UԉGWMU9~BW G U W$_^UVWu} uֹ 0VֈM_^UVuhdht;UkFj|Pht;kFjPhx; jv h|;tjvh;ejvh;Vj6h;HlVjRh;3\t;^UuPRYYUVWu }U9|}}0>}+U} ډЙ}@+؉ډЙ}+Uډ_^UVWu} V+WUu3V+WUu(V +W UuV+WUuV+WUu+UE_^UVWEuEP Y}>}}}jM}}6u݃= `t `uNY_^UEPuYYU VW=uE 9t FE>u}5EuW6 u0UU:=u#+Й] UUR >ujX_^USE] ![]USE] ![]USE] ![]UVW}u MGUVWME_^]U} |} ~M E 1U} |} ~M ҋE!1UE1UE1U} |} ~M Et1U$EEEEEEEPjj U$UUU UEEEEEPj%j U(VWu UJ<`UUtuuUJ4`EEEEEPj0jJ E؅}UJ<`EUJ4`}u_^U`E]]P `Xa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]} 0)ʇʋu } !%&J*+-/V<k=T>^|4 ~  f p bad class for char 0%ooverflow in constantwide characterwide character stringstringcharacterbad class for char 0%ofile specifiergarbage char \%03ogarbage char %cnon-ascii '\%03o' read%s constant includes more than one character%s constant too longnewline in %s constant%s constant too shortend-of-file inside %snewline in %sa      <<<<<<<(val_in_base) illegal base value %do !H'6()--Z/$<?=>Q%s deleted%s missinggarbage at end of line%&y*E+Q,-X/<>^|kc] p%% by 0/ by 0!-~x `",gnillegal # line%s: unknown controlbad #line syntax%s: unknown control m    dgarbage following #endifgarbage following #else#else after #else#elif after #else%s: unknown controlillegal # linecannot open include file "%s"cannot open include file "%s"bad include syntaxbad include syntax#define: illegal macro nametoo many nested #if/#ifdef/#ifndef#elif after #else#elif without corresponding #if#else after #else#else without corresponding #ifgarbage following #else#endif without corresponding #ifgarbage following #endififndefifdefgarbage following #%s illegal #ifdef constructionillegal #undef constructiongarbage following #undefit is not allowed to #undef %suser error: %s#define: bad formal parameter listformal parameter "%s" already usedformal parameter buffer overflowformal parameter buffer overflow#define: bad formal parameterillegal redefine of "%s"it is not allowed to redefine %sunclosed opening %c"%s", line %d: %s (warning) (strict) CRASH fatal error -- undefpragmalineincludeifndefifdefiferrorendifelseelifdefinedefined1__STDC____FILE__0__LINE____TIME__"%02d:%02d:%02d"__DATE__"%s %2d %d"maximum identifier length insufficientDecNovOctSepAugJulJunMayAprMarFebJan.unexpected EOFmissing #endif/usr/include. /..stdin%s: no source file %s use: %s [options] [source]could not open %s%s %s: %s /usr/include/out of memory1 -0A/1C[1Dn1I-2M2P(3U13d/1i[1m[1o[1u0minimum identifier length is 8maximum identifier length is %dmalformed -M optionmalformed option -D%s1identifier missing in -D%sillegal option: %cndefunclosed opening %cA B;AAA==q;q;c<A@non-ascii character read#%s %d "%s" #%s %d "%s" #%s %d "%s" #pragma#%s 1 "%s" comment inside comment ?) missing) missingidentifier missingtoo many macro argumentstoo few macro argumentsargument vector overflownumber of parameters exceeds ANSI standardillegal macro callunterminated macro callnewline in stringunterminated macro callunbalanced parenthesisOF6OLvO(macro_func)"illegal use of ## operatorunterminated stringillegal use of # operatorunclosed opening %cV!V%V&W(V*V+V,8W-V/V:1W<W>W?1W^W|WW#WVWWWV*W XWW"W#W$WcX-XcXcXcXcXcXcXcXcXcXcXcXcXcXcXcXLXLXcXcXcXLXLXLXLXLXLXcXcXcXXXXXLXcXcXLXLXLXLXLXLXLXLXLX'YYYLY Y!YYMZYMZZZZZ"Z(Z+Z,Z-ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX\ I\ I\ I\ I\ I\V[`[j[t[~[[[ [ [ [ [ [[[[[[\ \\\\&\-\4\;\B\bad tokenerroneous...||>>>===<=<<->--++&&!=|=^=&=>>=<<=%=/=*=-=+=integerfilespecifierstringidentifier$Id: rec,v 2.23 1997/02/21 11:23:55 ceriel Exp $ddd d d d ibhdhohuhxh%Fml-mFmlmmmm //usr/share/zoneinfo/etc/localtime{yyzposixrulesTZ Thu Jan 1 00:00:00 1970    | t p h ` X P H @ d ` \ X T P L H D @ < 8 @h     ? '? ?#'+%(!"& )*,-$ ,0123456789ABCDEFSSSSGMTmnSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec ((((( AAAAAABBBBBB `  @) 1$T$L s=SSSSu QRPdPUVuU J։} )ډ^UVWu }VwRYY19uC_^U5h YYU8VWu EEE}V:-J =uu,=xuEh<vYYuEh4vkYYuEh0vQYYM*VUԀ:ujEPu EU9Ut}UЉUԋUԀ:_.E8E/EE#EEEL&}9}U׉E}~EMMhhBv (}vh YYVvc Yu vh  YY}th Yt hc Y t hL Y~ h6 Yt#tPjh| Ph YYE=|EEEUU U9uEE EEU9t5h`| YY=dt h8g YhDhXYYu hG Yh0hDmYYu h' YD+04X+DH }t1P}t1Z Т U    fH4\U}~}uljMދH4\UU90u+   j5 ?YY A0+ hh0&YYu hYUu4hXhlYYu hY=pt hY}u}~EU jj 5(R h;Yh00YhD%Y}t$(k $t  jj5( h8Yh-Yh"YhYh  Yh$Yj jh! =thv^YY1_^UVWuU ։օtD@|@lj)Wu5(J 9} hD/YUU_^UVWUr E-Pf Yi@|@W+ YEu hYWuF YYWu5( 9s hpYu Y)돋UMR+Q օijh@ YYEu hdUYt<@|@Wu5(8 9s hTY)ut Y_^U VW}uFFFFU ډu V5( 9E ~ hY_^UVWE8uFFFF_^UVUffUuEFEF^UVWu} JWZtV€t1 _^U4VWk k ЉEh9u=t5 YE̅u hY5uYYfEM9 jEPGYY:EGEAE;E5E/URhhP UU€t E EUU}u*U+U؉U|9uhYYŰ}1}GD5?tFF}D5FEPYEPYjjEP UBfU_^UVWffUk k -EU=<u/j EP]YYDžu hYPWYYj EP.YYƅu htYu=<UWVGfFWuWuB=,t=uEPWYYtJf0WtWFWFFFFWFF=,t  VFz=,t4 VFY=,t4 HVF5F/WRhThP W W€tF F UJfU ?uffUUtJ>t +U VYFPYFP3YUJfU Pj u uY5<Y9u5YEu hHFYjR+YY5uYY5ju umY_^UU U5hhPy uuhP =t 5 YjdYUhYUVU495tjV5` uu 5h u5U4^Uju. YY}1 5YUV1}Fjju }1*U^U5YUUVW}jWj WkG EWUUW k EU_^UVWuVkF =lj=_^UVW}kE kE PWjM kE ׋U U уM t"W I _^UUUUVu uj ֋M  ^UVW}U RWj _^UVW}kE PWj~ _^Uu ujg UVW} }t=U9  EVWu 9t׋U)U_^U VWUU URYDžu1u9v _^UV5N| @^U=tuYUV U9w*U9w VYt1'rF5&Y5^UVW}u1 E}UUs1=u8j\Y=u1V!փ55FE5OVU}9}r69v2W9UvUW~>}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuF-0= r q}at$As Aa E0UU9U}*+U1u9EvEUUUUFq} t9uu UE E 0}u'}t!}} }w}~ }vE}t+"}t}} UU_^U$UUEPjjg } U1UVW5}׃}~9r }} 9vWYu_^UVWuU VVuYYDžt~~}VډF_^UUUuuu P Uuuu 9 +USE] ![]USE] ![]USE] ![]UVW}u M 2 U$UUEPjj U$U UEPut YYEPjj U$UUEPjjs U$UUU UUUEPjjG }EU(VuU @t*u YEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj U$EPuf YYEPj j U$UUUUU UEPjjW UVWu>*uEERE F%1-0E|}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U  }t/}} -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE uVuu ƀ}Xu9utUP YUE_^U4VWuEEEE }%MJ|UʋFF Vu YY=u}t UډE1!,'"U EtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}|t }}]uEttUЉU$ E#@EπE U4 J|UʋFF VuYY=u}t UډbXE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEET E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋J|EEFFEEVPYY=}t UډmEJ|EEFFEEVPYY=t6J|EEFFEEVPnYY=u}t UډJ|UʋFF Vu&YY=u}t UډMuUUMRJ|EEFFEEVPYY=u}t UډdZ}~UUM%J|UʋFF VucYY=u˃}t Uډ E_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }'(~} KVu 9V€tu "fNV~8u>5<dYt.h@YFu NLNHF 9hYFuN!NF V@uVVVeUFt$jjvJ =uN 5jEPv =tN V@FF t V 9Ft$jjv =uN Rvv uN VVzV+VUV JVV}QFt!jjvB =u N 0uvvs uNN N_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]FUUas U EUhhP~YYjYUVuYƋU rU MJwU uRYY^U$EtUUEPj6j }1UVWuEu41}%] [-S stack] BKMWbkmwend segment must be empty end segment must follow bss rom segment must follow text data segment must follow rom bss segment must follow data segment bss space contains initialized data text must not start at %ld Input file must have %d sections, not %ld Relocation information present. Contains unresolved references. Not an ack object file. Can't read %s. Can't write %s. -S-mi386-mi86write error write error. No memory. write error. No memory. write error.  bad on_off: %ld warning: unknown s_type: %d No memory. - ? 6 H ^ g p No memory .warning: unknown s_type: %d No memory. No memory. %s: read error.  @Xbdiopux #+-0LhlEeGPXbc7deefegPinoprsuux(null)cannot print floating point SSSSB 8P ((((( AAAAAABBBBBB # ACD pass description for the ACK compilers. # # Pre-set variables. # PROGRAM - Name the compiler driver is called with. # ARCH - Default target architecture. # Library directories search path. L = /lib /usr/lib # ACK Compilers support search path. A = $L $L/ack # ARCH must be defined. ifndef ARCH error "\$ARCH is not predefined" # Get ARCH from the environment if set. import ARCH # Compiler passes. ACK_CPP = $A/cpp.ansi $CPP_F $PREDEF $NOLINENO ACK_CEM = $A/em_cemcom.ansi -L $CPP_F $PREDEF \ -Vw${W}.${W}i${W}.${W}p${P}.${W}f4.${W}s2.2l4.${W}d8.${W} ACK_M2 = $A/em_m2 -I$MOD_INCL -WR \ -Vw${W}.${W}i${W}.${W}p${P}.${W}l4.${W}f4.${W}d8.${W} ACK_PC = $A/em_pc \ -Vw${W}.${W}i${W}.${W}l4.${W}p${P}.${W}f8.${W}S${W}.${W} MOD_INCL = $A/m2 + ACK_DECODE = $A/em_decode ACK_ENCODE = $A/em_encode ACK_OPT = $A/em_opt ACK_EGO = $A/em_ego -P $A/ego -M$EGO_DESCR EGO_DESCR = $A/ego/${ARCH}descr + ACK_OPT2 = $A/em_opt2 ACK_CG = $A/$ARCH/cg ACK_AS = $A/$ARCH/as \- ACK_LED = $A/em_led -a0:$W -a1:$W -a2:$W -a3:$W ACK_CV = $A/cv ASMCONV = $L/asmconv AAL = /usr/bin/aal # Minix predefined symbols. CPP_F = -D__minix -D__$ARCH # Library path. LIBPATH = $USERLIBPATH $A/$ARCH # Default output "model". MODEL = -sep # Floating point is done in software. LIBS = -fsoft # Default optimization level. OPT_LEVEL = 1 # Call names. if $PROGRAM = acc PROGRAM = cc if $PROGRAM = apc PROGRAM = pc if $PROGRAM = am2 PROGRAM = m2 if $PROGRAM = kcc PROGRAM = cc # Default transformation target. stop .out # Select the runtime environment by option or program name. arg -.c if $PROGRAM = cc ifndef RTSO RTSO = -.c LIBS = $LIBS + -.c arg -.mod if $PROGRAM = m2 ifndef RTSO RTSO = -.mod LIBS = $LIBS + -.mod arg -.p if $PROGRAM = pc ifndef RTSO RTSO = -.p LIBS = $LIBS + -.p # Omit the runtime startoff, but keep the libraries. arg -.o RTSO = arg -.$any error ".$any: unknown language" # Select the target architecture. arg -m$arch ARCH = $arch # Preprocessor directives. arg -D$name arg -D $name CPP_F = $CPP_F -D$name arg -U$name arg -U $name CPP_F = $CPP_F -U$name arg -I$dir arg -I $dir CPP_F = $CPP_F -I$dir ACK_M2 = $ACK_M2 -I$dir # Debugging. arg -g # Add debugging info. ACK_CEM = $ACK_CEM -g ACK_CG = $ACK_CG -gdb arg -n # Suppress line numbers. ACK_M2 = $ACK_M2 -L ACK_PC = $ACK_PC -L arg -a # Enable assertions. arg -A # Enable array bound checks. ACK_M2 = $ACK_M2 $* ACK_PC = $ACK_PC $* # Language checking. arg -w # No warnings. ACK_CEM = $ACK_CEM $* ACK_M2 = $ACK_M2 $* ACK_PC = $ACK_PC $* arg -ws # No strict warnings. ACK_CEM = $ACK_CEM -s ACK_M2 = $ACK_M2 -wR arg -wa # No warnings and no strict warnings. ACK_CEM = $ACK_CEM -a ACK_M2 = $ACK_M2 -wR arg -wo # No warnings about old style C. ACK_CPP = $ACK_CPP -o ACK_CEM = $ACK_CEM -o ACK_M2 = $ACK_M2 -wO arg -3 # Only accept 3rd generation Modula-2. ACK_M2 = $ACK_M2 $* arg -_ # Allow underscores in identifiers. ACK_M2 = $ACK_M2 -U ACK_PC = $ACK_PC -U arg -w$any arg -F arg -m # Ignore strange -w flags, and past and present i86 compiler flags. # Stop suffix. arg -c stop .o arg -c.$stop stop .$stop arg -E stop .E arg -P CPP_F = $CPP_F -P stop .i arg -S stop .s # Optimization. arg -O OPT_LEVEL = 1 arg -O$n numeric $n OPT_LEVEL = $n arg -OS # Optimize for size. ACK_EGO = $ACK_EGO -S arg -OT # Optimize for time. ACK_EGO = $ACK_EGO -T # Library search path. arg -L$dir arg -L $dir USERLIBPATH = $USERLIBPATH $dir/$ARCH $dir # -llib must be searched in $LIBPATH later. arg -l$lib arg -l $lib $> = $LIBPATH/lib$lib.a # Software floating point, hardware floating point, or no floating point. arg -f arg -fp arg -fsoft LIBS = $LIBS + -fsoft arg -fhard LIBS = $LIBS - -fsoft arg -fnone LIBS = $LIBS + -fnone # Output model. arg -com MODEL = # Common I&D. arg -sep arg -i # Separate I&D. MODEL = -sep arg -r # Relocatable object (combined .o) MODEL = -r # Strip executable. arg -s ACK_LED = $ACK_LED -s # Size of heap+stack. arg -stack $size ACK_CV = $ACK_CV -S $size # Change output file. arg -o$out arg -o $out OUT = $out # Complain about just -D, -U, -I, ... arg -D; arg -U; arg -I; arg -L; arg -l; arg -o; arg -stack error "argument expected after '$*'" arg -R$pass-$flag # The ACK way of passing options to passes. arg -Wack-R$pass-$flag # The ACD way. if $pass = cpp ACK_CPP = $ACK_CPP -$flag if $pass = cem ACK_CEM = $ACK_CEM -$flag if $pass = m2 ACK_M2 = $ACK_M2 -$flag if $pass = pc ACK_PC = $ACK_PC -$flag if $pass = opt ACK_OPT = $ACK_OPT -$flag if $pass = ego ACK_EGO = $ACK_EGO -$flag if $pass = opt2 ACK_OPT2 = $ACK_OPT2 -$flag if $pass = cg ACK_CG = $ACK_CG -$flag if $pass = as ACK_AS = $ACK_AS -$flag if $pass = led ACK_LED = $ACK_LED -$flag arg -Was-$dialect # Default assembly dialect. ASDIALECT = $dialect arg -W$any # Ignore any other -W options. # Complain about unknown options, don't give them to the loader. arg -$any error "$*: unknown option" # Do the scanning phase early, we need to know the architecture. scan # The word and pointer sizes of the target. if $ARCH = i86 W = 2; P = 2 if $ARCH = i386 W = 4; P = 4 ifndef W error "$ARCH: unsupported architecture" # Optimize -O2 or higher? if (0 1 - $OPT_LEVEL) = (0 1) ACK_EGO = $ACK_EGO -O$OPT_LEVEL ACK_OPT = $ACK_OPT -m0 # Leave multiplication optimization to opt2. prefer .m .gk # Tell cem to reverse bitfields on the i386 to be compatible with gcc. if $ARCH = i386 ACK_CEM = $ACK_CEM -Vr # Predefined preprocessor flags. PREDEF = -D_EM_WSIZE=$W -D_EM_PSIZE=$P -D_EM_SSIZE=2 -D_EM_LSIZE=4 \ -D_EM_FSIZE=4 -D_EM_DSIZE=8 -D__ACK__ -D_ACK # Preprocess C source. transform .c .i $ACK_CPP $* > $> # Preprocess any type of file and send it to standard output or $OUT. transform "" .E if $* = "-" file = # Standard input. else file = $* ifndef OUT $ACK_CPP $file else $ACK_CPP $file > $OUT # Compile C source to EM-code. transform .c .k transform .i .k $ACK_CEM $* $> ifndef RTSO RTSO = -.c LIBS = $LIBS + -.c # Compile Modula-2 source to EM-code. transform .mod .k ifhash $* apply .c .i $ACK_M2 $* $> ifndef RTSO RTSO = -.mod LIBS = $LIBS + -.mod # Compile Pascal source to EM-code. transform .p .k ifhash $* apply .c .i $ACK_PC $* $> ifndef RTSO RTSO = -.p LIBS = $LIBS + -.p # Compact EM to readable EM. transform .k .e transform .m .e transform .gk .e transform .g .e $ACK_DECODE $* > $> # Readable EM to compact EM. transform .e .k ifhash $* NOLINENO = -P # Encode chokes on cpp line directives. apply .c .i unset NOLINENO $ACK_ENCODE $* > $> # Peephole optimization. transform .k .m $ACK_OPT $* > $> # Global optimization. transform .m .gk $ACK_EGO $* > $> # Second peephole optimization after global optimization. transform .gk .g $ACK_OPT2 $* > $> # EM-code to target machine assembly. transform .m .ack.s transform .g .ack.s transform .m .s transform .g .s if $ARCH = i386 $ACK_CG -F__fp_hook $* > $> else $ACK_CG $* > $> # How to treat plain .s? ifndef ASDIALECT transform .s .ack.s $> = $* # Assembly to object file. transform .ack.s .o ifhash $* apply .c .i if $> = $<.o ifdef OUT $> = $OUT $ACK_AS -o $> $* # Combine object files and libraries to an executable. combine (.o .a) .out if $MODEL = () model = -b0:0 if $MODEL = (-sep) model = -b0:0 -b1:0 rtso = if $RTSO = -.c rtso = $A/$ARCH/crtso.o if $RTSO = -.mod rtso = $A/$ARCH/m2rtso.o if $RTSO = -.p rtso = $A/$ARCH/prtso.o libm2 = ; libp = ; libd = ; libc = ; libfp = if (-.mod - $LIBS) = () libm2 = $A/$ARCH/libm2.a libc = $A/$ARCH/libc.a if (-.p - $LIBS) = () libp = $A/$ARCH/libp.a libc = $A/$ARCH/libc.a if (-.c - $LIBS) = () libd = $A/$ARCH/libd.a libc = $A/$ARCH/libc.a if (-fsoft - $LIBS) = () libfp = $A/$ARCH/libfp.a libs = $libm2 $libp $libd $libc $libfp $A/$ARCH/libe.a ifndef OUT OUT = a.out if (-r - $MODEL) = () # Combine to an object file. $ACK_LED -r -o $OUT $* else # Combine to an executable. mktemp EXE $ACK_LED $model -o $EXE $rtso $* $libs $A/$ARCH/end.a $ACK_CV -x -m$ARCH $EXE $OUT # Add object files to a library. combine (.o) .a if $> = $<.a ifdef OUT $> = $OUT $AAL cr $> $* # Assembly conversions. # ACK assembly to ACK Xenix assembly. transform .ack.s .ncc.s ifhash $* apply .c .i $ASMCONV -m$ARCH ack ncc $* $> # ACK assembly to GNU assembly. transform .ack.s .gnu.s ifhash $* apply .c .i $ASMCONV -m$ARCH ack gnu $* $> # ACK Xenix assembly to ACK assembly. transform .ncc.s .ack.s ifhash $* apply .c .i $ASMCONV -m$ARCH ncc ack $* $> # ACK Xenix assembly to GNU assembly. transform .ncc.s .gnu.s ifhash $* apply .c .i $ASMCONV -m$ARCH ncc gnu $* $> # BCC assembly to ACK assembly. transform .bas.s .ack.s ifhash $* apply .c .i $ASMCONV -m$ARCH bas ack $* $> # BCC assembly to ACK Xenix assembly. transform .bas.s .ncc.s ifhash $* apply .c .i $ASMCONV -m$ARCH bas ncc $* $> # BCC assembly to GNU assembly. transform .bas.s .gnu.s ifhash $* apply .c .i $ASMCONV -m$ARCH bas gnu $* $> #ifdef ASDIALECT # Treat plain .s as being in the given dialect. transform .s .$ASDIALECT.s $> = $* .*..!people"tech#wordsabadi abadi's abbott abbott's abbruscato abbruscato's abe abe's abraham abraham's abramson abramson's abrossimov abrossimov's acampora acampora's accetta accetta's ackermann ackermann's adam adam's adams adams' adleman adleman's adve adve's agarwal agarwal's agrawal agrawal's agrawala agrawala's ahamad ahamad's ahmadi ahmadi's aiken aiken's akyildiz akyildiz' alamos alamos' albuquerque albuquerque's aldridge aldridge's alexander alexander's alice alice's allan allan's almasi almasi's altis altis' amador amador's amaral amaral's amy amy's ananda ananda's anderson anderson's andreessen andreessen's andrew andrew's andrews andrews' angermeyer angermeyer's anna anna's antoine antoine's antonio antonio's anyanwu anyanwu's apostolides apostolides' appenzeller appenzeller's archibald archibald's armand armand's armbruster armbruster's armitage armitage's arnold arnold's artsy artsy's arvind arvind's athas athas' atkinson atkinson's attiya attiya's auslander auslander's awdeh awdeh's ayache ayache's ayanoglu ayanoglu's babaoglu babaoglu's babbage babbage's bach bach's backes backes' bacon bacon's badrinath badrinath's baer baer's bailey bailey's bakne bakne's bal bal's balachandran balachandran's balakrishnan balakrishnan's balenson balenson's ball ball's ballardie ballardie's ballart ballart's bantz bantz' banwell banwell's bapna bapna's baptiste baptiste's baran baran's baransel baransel's barbara barbara's barborak barborak's bardeen bardeen's barlow barlow's baron baron's barrera barrera's bart bart's batcher batcher's bates bates' batlivala batlivala's bauchot bauchot's bauerfeld bauerfeld's bayliss bayliss' bays bays' bazzi bazzi's beck beck's belady belady's bell bell's bellamy bellamy's bellman bellman's bellovin bellovin's belsnes belsnes' ben-ari ben-ari's benhamou benhamou's bennett bennett's bensoussan bensoussan's bentley bentley's benzoni benzoni's bernard bernard's bernstein bernstein's berntsen berntsen's bershad bershad's bertsekas bertsekas' bever bever's bharghavan bharghavan's bhuyan bhuyan's biham biham's binder binder's birman birman's birnbaum birnbaum's birrell birrell's bitar bitar's bjornson bjornson's black black's blackadar blackadar's blair blair's blau blau's blaze blaze's blazewicz blazewicz' bochmann bochmann's boggs boggs' bogineni bogineni's bohman bohman's bokhari bokhari's bolon bolon's bolosky bolosky's bonomi bonomi's borgonovo borgonovo's borrill borrill's bosack bosack's bottos bottos' boule boule's bourne bourne's bowman bowman's boykin boykin's brakmo brakmo's branstad branstad's brantley brantley's brattain brattain's braun braun's brawley brawley's brereton brereton's bressler bressler's brian brian's bricker bricker's briggs briggs' brinch brinch's brinksma brinksma's broadhead broadhead's brooks brooks' broomell broomell's brown brown's brumfield brumfield's brutzman brutzman's brzezinski brzezinski's bucciarelli bucciarelli's budhiraja budhiraja's budkowski budkowski's buford buford's burg burg's burns burns' burr burr's burrows burrows' burzynski burzynski's butler butler's bux bux's byron byron's cadow cadow's calingaert calingaert's campbell campbell's campione campione's caneschi caneschi's capetanakis capetanakis' carl-mitchell carl-mitchell's carlo carlo's carolus carolus' carolyn carolyn's carriero carriero's carroll carroll's carter carter's cass cass' cathy cathy's catlett catlett's cayla cayla's cerf cerf's chaiken chaiken's chaitin chaitin's champine champine's chandler chandler's chandra chandra's chandranmenon chandranmenon's chandy chandy's chang chang's chansler chansler's chao chao's chapin chapin's chapman chapman's charles charles' chase chase's chaum chaum's chen chen's cheong cheong's cherenson cherenson's cherian cherian's cheriton cheriton's cherkassky cherkassky's chervenak chervenak's chesson chesson's cheswick cheswick's cheung cheung's chew chew's chiani chiani's ching ching's chiueh chiueh's chlamtac chlamtac's choa choa's choi choi's chong chong's choudbury choudbury's choudhury choudhury's chow chow's christian christian's chu chu's chutani chutani's cidon cidon's cisco cisco's ciscs ciscs' cksum cksum's clark clark's claude claude's cleary cleary's clingen clingen's clos clos' cocke cocke's cody cody's coffman coffman's coggins coggins' cohen cohen's cole cole's collard collard's collins collins' collyer collyer's colwell colwell's comer comer's conard conard's conner conner's conte conte's cook cook's cooper cooper's corbato corbato's corwin corwin's cotton cotton's coulouris coulouris' coulson coulson's courtiat courtiat's courtois courtois' coutant coutant's cox cox's crane crane's crespo crespo's crichlow crichlow's cristian cristian's cronin cronin's crowcroft crowcroft's crowther crowther's crudele crudele's curnow curnow's currie currie's cusick cusick's d'souza d'souza's dagdeviren dagdeviren's dahbura dahbura's dahlgren dahlgren's dailey dailey's dalal dalal's daley daley's dally dally's dam dam's damm damm's daniel daniel's danskin danskin's danthine danthine's danzig danzig's darden darden's dasgupta dasgupta's david david's davidson davidson's davie davie's davies davies' davin davin's davis davis' day day's dean dean's deasington deasington's decina decina's deering deering's dehghan dehghan's deitel deitel's dekker dekker's deloddere deloddere's delp delp's dembinski dembinski's demers demers' denning denning's dennis dennis' denzel denzel's deprycker deprycker's derosa derosa's desmond desmond's despain despain's desrochers desrochers' dhas dhas' dhesikan dhesikan's diersing diersing's diffie diffie's dijkstra dijkstra's dirvin dirvin's dixit dixit's dixon dixon's dobosiewicz dobosiewicz' doeringer doeringer's dollimore dollimore's dongarra dongarra's doran doran's dorfman dorfman's doshi doshi's dougherty dougherty's douglis douglis' dove dove's draves draves' drummond drummond's du du's dubois dubois' dumke dumke's duncan duncan's durham durham's dykeman dykeman's eager eager's eckberg eckberg's eckert eckert's edgar edgar's edler edler's edmond edmond's edwards edwards' eggers eggers' einstein einstein's elinor elinor's elisha elisha's ellen ellen's ellington ellington's ellis ellis' eloise eloise's elphick elphick's emily emily's emmons emmons' enderby enderby's english english's ephremides ephremides' eppinger eppinger's eriksson eriksson's estridge estridge's estrin estrin's eswaran eswaran's eugene eugene's evans evans' even even's everhart everhart's fabry fabry's farber farber's farinacci farinacci's farrens farrens' feig feig's feiler feiler's feit feit's feldman feldman's fendick fendick's ferguson ferguson's ferrari ferrari's fidge fidge's field field's fine fine's finkel finkel's fiorini fiorini's fischer fischer's fisher fisher's fitzgerald fitzgerald's fleig fleig's fleisch fleisch's fletcher fletcher's flores flores' floyd floyd's fluckiger fluckiger's flynn flynn's foley foley's folts folts' ford ford's forin forin's forman forman's forrester forrester's fotheringham fotheringham's fowler fowler's foxley foxley's francioni francioni's francis francis' frank frank's frans frans' franta franta's fraser fraser's fratta fratta's fredrickson fredrickson's freitas freitas' fridrich fridrich's friedman friedman's fuchs fuchs' fujitani fujitani's fulkerson fulkerson's fuller fuller's furht furht's gabriel gabriel's gajski gajski's gallager gallager's galvin galvin's gamal gamal's gambosi gambosi's gantenbein gantenbein's ganz ganz' garcia garcia's garcia-haro garcia-haro's garcia-molina garcia-molina's garg garg's garner garner's garver garver's gasman gasman's geer geer's gehani gehani's geihs geihs' geist geist's gelernter gelernter's george george's gerla gerla's gharachorloo gharachorloo's ghosal ghosal's giacopelli giacopelli's gibbons gibbons' gibson gibson's gien gien's gifford gifford's gilmore gilmore's gimarc gimarc's giraul giraul's girault girault's gitlin gitlin's gitman gitman's gleeson gleeson's gligor gligor's gold gold's golden golden's goldman goldman's goldstine goldstine's golestani golestani's golub golub's gong gong's goodhue goodhue's goodman goodman's gookin gookin's gopal gopal's goralski goralski's gorsline gorsline's goscinski goscinski's gosling gosling's gottfried gottfried's gottlieb gottlieb's grafe grafe's graham graham's grampp grampp's gray gray's green green's greene greene's gregory gregory's griffiths griffiths' grob grob's groenbaek groenbaek's grosch grosch's grosshans grosshans' grunsteidl grunsteidl's guerin guerin's guglielmo guglielmo's guillemon guillemon's guillemont guillemont's gujarati gujarati's gunther gunther's gupta gupta's gurwitz gurwitz' gusella gusella's gustavson gustavson's haas haas' habermann habermann's hac hac's hafner hafner's hagmann hagmann's halliday halliday's hamacher hamacher's hamilton hamilton's hamming hamming's hammond hammond's hamner hamner's hamrick hamrick's hamstra hamstra's hancock hancock's handel handel's handley handley's hansen hansen's harbison harbison's harbron harbron's harrison harrison's hart hart's harty harty's harvey harvey's hatamian hatamian's hattori hattori's havender havender's haverty haverty's hawe hawe's hawley hawley's hayes hayes' hayter hayter's heart heart's heath heath's hebbard hebbard's hebiard hebiard's hedrick hedrick's hein hein's heinrich heinrich's held held's helen helen's heller heller's hellman hellman's henderson henderson's henken henken's hennessy hennessy's henri henri's henshall henshall's herman herman's herrmann herrmann's heuser heuser's hewitt hewitt's heymans heymans' hickey hickey's hill hill's hillis hillis' himelstein himelstein's hinden hinden's hinnant hinnant's hitchcock hitchcock's hluchyj hluchyj's hoare hoare's hoch hoch's hodge hodge's hoffman hoffman's holfelder holfelder's holmes holmes' holt holt's holzmann holzmann's homan homan's homewood homewood's hong hong's honig honig's hoover hoover's hopkins hopkins' hopper hopper's horak horak's hord hord's horner horner's horowitz horowitz' hoskins hoskins' hotz hotz' howard howard's huang huang's huber huber's huck huck's hudak hudak's hudson hudson's huffman huffman's hughes hughes' hui hui's huitema huitema's humblet humblet's hummel hummel's humphrey humphrey's hutchinson hutchinson's hutchison hutchison's hutto hutto's hwang hwang's hyde hyde's iacobucci iacobucci's ieee ieee's ioannidis ioannidis' irland irland's irmer irmer's isloor isloor's israel israel's ivancic ivancic's jabbour jabbour's jackson jackson's jacobs jacobs' jacobson jacobson's jacquemot jacquemot's jaeger jaeger's jain jain's jajszczyk jajszczyk's james james' james''s janniello janniello's jansen jansen's jefferson jefferson's jelatis jelatis' jenkins jenkins' jennifer jennifer's jennings jennings' jensen jensen's jesse jesse's jesshope jesshope's jia jia's joe joe's johann johann's john john's johnson johnson's jonathan jonathan's jones jones' jonge jonge's jooss jooss' joseph joseph's joshi joshi's joy joy's jubin jubin's jueneman jueneman's jul jul's julin julin's julio julio's julius julius' kaashoek kaashoek's kabakibo kabakibo's kadaba kadaba's kahn kahn's kain kain's kaiser kaiser's kaiserswerth kaiserswerth's kalman kalman's kalra kalra's kamoun kamoun's kan kan's kanakia kanakia's kandel kandel's kandlur kandlur's kane kane's kano kano's kanodia kanodia's kantrowitz kantrowitz' kaplan kaplan's karels karels' karjoth karjoth's karlin karlin's karn karn's karol karol's karshmer karshmer's katz katz' kaufman kaufman's kaufmann kaufmann's kavak kavak's kazar kazar's keizer keizer's keleher keleher's kelly kelly's kenneth kenneth's kenney kenney's kent kent's kernighan kernighan's kerridge kerridge's keshav keshav's kessler kessler's khan khan's khanna khanna's killian killian's kilpatrick kilpatrick's kim kim's kindberg kindberg's kirby kirby's kirschen kirschen's kitson kitson's klein klein's kleinfelder kleinfelder's kleinrock kleinrock's klerer klerer's kline kline's knapp knapp's knauer knauer's knott knott's knowlton knowlton's knuth knuth's kochan kochan's kodesh kodesh's koehler koehler's kohl kohl's kohli kohli's kohno kohno's kolata kolata's kollar kollar's kolling kolling's konangi konangi's konrad konrad's kopetz kopetz' korth korth's koza koza's krajewski krajewski's kramer kramer's kranakis kranakis' krantz krantz' kranz kranz' krieger krieger's krishnaswamy krishnaswamy's krueger krueger's kubiatowicz kubiatowicz' kui kui's kumar kumar's kummerle kummerle's kung kung's kurihara kurihara's kurose kurose's kutten kutten's kwan kwan's kwok kwok's kyas kyas' kyle kyle's lai lai's lam lam's lamarr lamarr's lambert lambert's lamport lamport's lampson lampson's landau landau's landweber landweber's landwehr landwehr's langerman langerman's langholz langholz' langlois langlois' langsford langsford's lantz lantz' larowe larowe's larry larry's latif latif's laubach laubach's lauck lauck's laudon laudon's lawrie lawrie's layland layland's lazowska lazowska's lea lea's leary leary's lebeck lebeck's lee lee's leffler leffler's lehoczky lehoczky's leibniz leibniz' leichter leichter's leiner leiner's lempel lempel's lenoski lenoski's leonard leonard's leonardo leonardo's leventhal leventhal's leverett leverett's levin levin's levine levine's levy levy's lewis lewis' li li's lilja lilja's lim lim's limb limb's lin lin's linda linda's linde linde's linden linden's linn linn's linnington linnington's linton linton's lioupis lioupis' lipkis lipkis' lipovski lipovski's lipper lipper's lipton lipton's lisa lisa's liskov liskov's little little's littlefield littlefield's littlewood littlewood's litzkow litzkow's liu liu's livadas livadas' livesey livesey's livny livny's lloyd lloyd's lo lo's locanthi locanthi's lock lock's lomas lomas' lomuto lomuto's lorie lorie's louis louis' lovelace lovelace's low low's luan luan's luetchford luetchford's lukasiewicz lukasiewicz' lundelius lundelius' lundelius-welch lundelius-welch's luotonen luotonen's lurndal lurndal's lyles lyles' lynch lynch's macario macario's macedonia macedonia's macgregor macgregor's mackinnon mackinnon's maebara maebara's maekawa maekawa's maguire maguire's malan malan's malcolm malcolm's malek malek's malindi malindi's malone malone's mamrak mamrak's manasse manasse's manber manber's maquire maquire's march march's marcus marcus' mariani mariani's marilyn marilyn's mark mark's markatos markatos' markoff markoff's markstein markstein's marseille marseille's marsh marsh's marshall marshall's marsland marsland's martin martin's marvin marvin's marzullo marzullo's mashey mashey's mason mason's massey massey's matsui matsui's matyas matyas' mauchley mauchley's maurer maurer's maurice maurice's maxemchuk maxemchuk's maxey maxey's may may's mcauliffe mcauliffe's mcbryan mcbryan's mccaw mccaw's mcclelland mcclelland's mccloghrie mccloghrie's mcdaniel mcdaniel's mcdysan mcdysan's mcfarling mcfarling's mcgilton mcgilton's mcguffin mcguffin's mckenney mckenney's mckevitt mckevitt's mckinley mckinley's mckusick mckusick's mcleod-reisig mcleod-reisig's mehravari mehravari's meidan meidan's meier meier's meijer meijer's meisner meisner's meister meister's melear melear's melliar melliar's melton melton's memnet memnet's menees menees' menezes menezes' merelli merelli's merkle merkle's merlin merlin's merritt merritt's merwin-daggett merwin-daggett's metcalfe metcalfe's metzner metzner's meyer meyer's michels michels' michelson michelson's microsoft microsoft's miki miki's miller miller's milli milli's millie millie's milliken milliken's mills mills' milstein milstein's milton milton's minnich minnich's minoli minoli's minzer minzer's mirchandani mirchandani's mishra mishra's misra misra's mitch mitch's mitchell mitchell's miyaguchi miyaguchi's mizell mizell's mizrahi mizrahi's mochida mochida's mockapetris mockapetris' mogul mogul's mok mok's molina molina's monaural monaural's mooers mooers' morales morales' morgan morgan's morley morley's morris morris' morris''s mosberger mosberger's moser moser's mothersole mothersole's mouftah mouftah's moussouris moussouris' moy moy's moyer moyer's mudge mudge's muhlhauser muhlhauser's mukherjee mukherjee's mulazzani mulazzani's mulder mulder's mullender mullender's munro munro's murphy murphy's murray murray's mutka mutka's myles myles' nagle nagle's nahrstedt nahrstedt's narkakati narkakati's narten narten's natarajan natarajan's nayfeh nayfeh's neal neal's needham needham's neiger neiger's nelson nelson's nemeth nemeth's nemzow nemzow's neuhauser neuhauser's neuman neuman's neumann neumann's newell newell's newman newman's newton newton's ni ni's nichols nichols' nicoud nicoud's nikhil nikhil's nikolaidis nikolaidis' nikolaou nikolaou's nist nist's nitzberg nitzberg's noe noe's norman norman's norton norton's nussbaum nussbaum's nyquist nyquist's o'malley o'malley's o'reilly o'reilly's oakley oakley's obermarck obermarck's ochsenreiter ochsenreiter's ohnishi ohnishi's oldehoeft oldehoeft's older older's olsen olsen's olukotun olukotun's omidyar omidyar's onvural onvural's organick organick's ornstein ornstein's orr orr's ortega ortega's otway otway's ousterhout ousterhout's owen owen's owicki owicki's pace pace's padgett padgett's paff paff's page page's pahlavan pahlavan's palais palais' palmer palmer's pan pan's pancha pancha's pandya pandya's panzieri panzieri's pappas pappas' parkin parkin's parnas parnas' partridge partridge's parulkar parulkar's pascal pascal's pasternack pasternack's paterson paterson's patil patil's patka patka's pattavina pattavina's patterson patterson's paul paul's pavon pavon's pawlikowski pawlikowski's paxson paxson's pease pease's pechura pechura's pedroza pedroza's pellegrini pellegrini's pereda pereda's perkins perkins' perlman perlman's perlmutter perlmutter's perry perry's peterson peterson's pfister pfister's philip philip's philips philips' phinney phinney's pickholtz pickholtz' piepho piepho's pieprzyk pieprzyk's pier pier's pierce pierce's pierson pierson's pike pike's pillevesse pillevesse's pinkert pinkert's pinkerton pinkerton's piscitello piscitello's pitt pitt's pleszkun pleszkun's pogran pogran's pohm pohm's pollack pollack's poole poole's popek popek's postel postel's powers powers' pozefsky pozefsky's prentice prentice's presper presper's presser presser's price price's princeton princeton's probert probert's proudfoot proudfoot's prycker prycker's przybylski przybylski's pu pu's purdin purdin's quarterman quarterman's quick quick's quintana quintana's quisquater quisquater's rabin rabin's radia radia's radin radin's raghavendra raghavendra's rahnema rahnema's rajagopalan rajagopalan's rajkumar rajkumar's ralph ralph's ramakrishnan ramakrishnan's ramamritham ramamritham's ramanathan ramanathan's ramaswami ramaswami's rangan rangan's ransom ransom's rao rao's raphson raphson's rappaport rappaport's rashid rashid's rawson rawson's raychaudhuri raychaudhuri's raynal raynal's reddy reddy's redell redell's reed reed's reedy reedy's rees rees' reiser reiser's rekhter rekhter's renesse renesse's renwick renwick's rettberg rettberg's ricart ricart's richard richard's riordan riordan's ritchie ritchie's rivest rivest's robbert robbert's robert robert's roberts roberts' roberts''s robertson robertson's robinson robinson's rochkind rochkind's rodriguez rodriguez' romanow romanow's romkey romkey's rooholamini rooholamini's rose rose's rosenberry rosenberry's rosenblum rosenblum's rosenthal rosenthal's rosin rosin's ross ross' rossum rossum's rothauser rothauser's rovner rovner's rowen rowen's rowlance rowlance's royce royce's rozier rozier's rubinstein rubinstein's rudin rudin's rudisin rudisin's ruh ruh's rumsewicz rumsewicz' ruzzo ruzzo's sacco sacco's sachs sachs' sadiku sadiku's saha saha's salat salat's salehi salehi's saltzer saltzer's salus salus' salwen salwen's samples samples' samsen samsen's sandberg sandberg's sanders sanders' sanderson sanderson's sandhu sandhu's saniya saniya's sansom sansom's santifaller santifaller's sartirana sartirana's satyanarayanan satyanarayanan's sawchuk sawchuk's sawdon sawdon's saxe saxe's scheurich scheurich's schildt schildt's schilit schilit's schill schill's schiller schiller's schilling schilling's schiper schiper's schlanger schlanger's schlichting schlichting's schmidt schmidt's schmitt schmitt's schneider schneider's schneidewind schneidewind's schneier schneier's schnorr schnorr's scholl scholl's scholtz scholtz' schonberg schonberg's schroder schroder's schroeder schroeder's schulman schulman's schulzrinne schulzrinne's schwabl schwabl's schwan schwan's schwans schwans' schwartz schwartz' schweitzer schweitzer's scollo scollo's scott scott's seawright seawright's seberry seberry's sebestyen sebestyen's seebass seebass' seifert seifert's seitz seitz' selfridge selfridge's senft senft's sequin sequin's serlin serlin's seshan seshan's sethi sethi's seybold seybold's seymour seymour's shacham shacham's shah shah's shalkhauser shalkhauser's shamir shamir's shannon shannon's shapiro shapiro's shapley shapley's sharp sharp's shasha shasha's shaw shaw's shedler shedler's sheltzer sheltzer's shen shen's shenker shenker's shepherd shepherd's shiah shiah's shimizu shimizu's shin shin's shirley shirley's shivarati shivarati's shoch shoch's shockley shockley's short short's shoshani shoshani's shostak shostak's shreedhar shreedhar's shrivastava shrivastava's shuford shuford's sidebotham sidebotham's sidhu sidhu's sidi sidi's siegel siegel's siewiorek siewiorek's silberschatz silberschatz' silbey silbey's silvester silvester's simoni simoni's simpson simpson's simpsons simpsons' sincoskie sincoskie's singh singh's singhal singhal's siu siu's sivalingam sivalingam's sivarajan sivarajan's skellern skellern's skelly skelly's slater slater's sleator sleator's sloman sloman's smarte smarte's smith smith's smock smock's snyder snyder's soddy soddy's soha soha's solman solman's song song's spafford spafford's spauster spauster's speciner speciner's spector spector's spell spell's spencer spencer's spiegelhalter spiegelhalter's spindel spindel's spohn spohn's spragins spragins' spratt spratt's sprunt sprunt's srikanth srikanth's stallings stallings' stankovic stankovic's starr starr's staveren staveren's steele steele's steenbergen steenbergen's steenkiste steenkiste's stefanick stefanick's stefferud stefferud's stein stein's steiner steiner's steinmetz steinmetz' stenstrom stenstrom's stephens stephens' stephenson stephenson's sterbenz sterbenz' stern stern's steve steve's stevens stevens' stevenson stevenson's stewart stewart's stibbitz stibbitz' stibbitz''s stiller stiller's stinson stinson's stone stone's stritter stritter's strole strole's strowger strowger's stuck stuck's stumm stumm's sturgis sturgis' subramanian subramanian's subramian subramian's sud sud's suda suda's sullivan sullivan's sunshine sunshine's suzanne suzanne's suzuki suzuki's svobodova svobodova's swan swan's sweet sweet's swinehart swinehart's tabak tabak's taft taft's takeuchi takeuchi's tam tam's tamaru tamaru's tanaka tanaka's tanenbaum tanenbaum's tappan tappan's tardo tardo's tarjan tarjan's tay tay's taylor taylor's tennenhouse tennenhouse's tenney tenney's teory teory's teraoka teraoka's terman terman's tevanian tevanian's thacker thacker's thapar thapar's theimer theimer's thekkath thekkath's theoharakis theoharakis' thiel thiel's thomas thomas' thompson thompson's thyagarajan thyagarajan's tilborg tilborg's tobagi tobagi's tokoro tokoro's tokuda tokuda's tolmie tolmie's tom tom's tomas tomas' tomlinson tomlinson's touch touch's toueg toueg's traiger traiger's train train's trajkovic trajkovic's tralli tralli's tredennick tredennick's treleaven treleaven's tripathi tripathi's trudy trudy's truong truong's ts'o ts'o's tschichholz tschichholz' tseung tseung's tso tso's tsybakov tsybakov's tu tu's tuchman tuchman's tucker tucker's turek turek's turner turner's tyrrell tyrrell's ullman ullman's ulug ulug's ungar ungar's vandome vandome's vanstone vanstone's varghese varghese's varma varma's vaswani vaswani's veen veen's veeraraghavan veeraraghavan's veidenbaum veidenbaum's venkatesh venkatesh's venkatraman venkatraman's venkatramani venkatramani's verbiest verbiest's verhille verhille's verissimo verissimo's vernon vernon's vetter vetter's villamizan villamizan's vissers vissers' vitella vitella's viterbi viterbi's vogel vogel's voydock voydock's vranesic vranesic's vyssotsky vyssotsky's wada wada's walden walden's walker walker's wall wall's wallach wallach's wallich wallich's wallmeier wallmeier's walrand walrand's walrath walrath's walter walter's wang wang's want want's ward ward's waring waring's watson watson's wayner wayner's wear wear's weber weber's wei wei's weicker weicker's weihl weihl's weikart weikart's weinstein weinstein's weiss weiss' weissberger weissberger's weizmann weizmann's welch welch's wellings wellings' west west's whitby whitby's whitby-strevens whitby-strevens' white white's whitehead whitehead's whitney whitney's wichman wichman's wiener wiener's wild wild's wilkes wilkes' willett willett's william william's williams williams' williamson williamson's willinger willinger's wilson wilson's windsor windsor's winkler winkler's winograd winograd's winsor winsor's witten witten's wittie wittie's wobber wobber's wolter wolter's wong wong's woo woo's wood wood's worley worley's woroboff woroboff's worster worster's wortman wortman's wu wu's wulf wulf's yang yang's yeh yeh's yemini yemini's yeung yeung's yew yew's yokte yokte's yoshimura yoshimura's young young's youssef youssef's yozawa yozawa's yuen yuen's yum yum's yuval yuval's zahorjan zahorjan's zainlinger zainlinger's zaky zaky's zatti zatti's zayas zayas' zegura zegura's zehnder zehnder's zekauskas zekauskas' zhang zhang's zhao zhao's zhou zhou's zimmerman zimmerman's zimmermann zimmermann's zipf zipf's ziv ziv's zobel zobel's zoccolillo zoccolillo's zuse zuse's zwaenepoel zwaenepoel's zwicky zwicky's aal abc abcdefghijklmnopqrstuvwxyz ack acks acl acls acm afnor allbox alt altair alu ameritech amiga anycast anycasting anylan applet applet's appletalk applets applets' approx arcnet argc argv atan atari autoincrementing automount automounting avogadro's bbn bcpl bellcore bellcore's benes betamax bmp bps bsd burroughs bytecode cacher callee callee's callees cept cern cidr cisc cmos cmu codec codecs collidees colorburst com compuserve cpu's crossposted crossposting csma ctrl ctss cyber cybers cyberspace dec's decapsulates decentrally dhrystone dhrystones dibit doublewords drive's ebone edsac edu edvac eeprom eeproms emacs email emails endian endian's endians eniac eprom eprom's eproms errno eurocard europanet exabyte exe faq faqs fastbus fcc feal fido fileset fileset's filesets foo fpu's freebies fuzzball fuzzballs gif giga gigaflop globals gotos gov grep gsm halfword halfwords hdtv hec hepnet hewlett hippi hippi's honeywell hostless html http ietf illiac init inode inria intel's interarea interas ioctl isis iso's itu's johniac jpeg jpl juke jumbograms keepalive khafre killfiles knowbots lans laserjet lata latas latch's lookaside lycos macaw macroarchitecture macroblock macroblocks mailstorms malloc mapper mapper's mappers massbus mbone mbyte mbytes mci's mega megabuck megabus megachip microblock microblocks microsoft's mil milnet min minimessages miniport miniports mmdf mmu mmu's mmus mod mos mospf mostek motis motorola's mpeg mrouter mrouter's mrouters mtso's mtsos multics multics' multicycle multiframes multiperson multiplatter multiposition multiwindow munin munin's murkier mutex mutexes nak naks namespace nand nano nasa ncsa's netblt netiquette netscape netware newsfeed newsfeeds newsgroups nmos nntp noncombining nondata nondelivery nondistributed nonequilibrium nonfaulty nongraphical noninteractive noninterlaced noninterlocked noninvertible nonlatin nonmobile nonoverlapping nonreplicated nonrepudiation nonsecrecy nonswappable nontraditional nontreaty nonworking norma novell novell's nsaps nsf's nsfnet nubus nynex opcode's opcodes org osf's osi's ospf pacbell packard packetizer passwd pentium peregrine pgp's photodetector picoinstruction picostore posix printf prom proms pseudoconnection pseudoheader quasihierarchical quasiparallel rasterize rbocs readme readonly remailer remailers resize rfc rfcs rgb richtext risc riscs rlogin rpc's secam sequent server's sigalrm sigfpe sigint sigkill signetics signup sigquit simd smds smiley smileys smtp snmp snowbird solitons sony spacewar sparc sparc's sparcs sparcstation sprintlink sqrt sscop standout starlite stat stateful statelessness stdin stdout subcubes subgrid subkeys submultiple subnetting subsubdomains subtransaction subtransactions subtypes sunos superclass superclass' superclasses supercluster superclusters superminicomputers superpage superpages superuser's synch tcp's tdma telecom telepoints telnet tenex tera testbed testbeds textarea tokenless toolbars tpdus trinary trits troff trojan tsap tsaps ttys typedef typesafe uart uarts ucsb ucsd uids ultracomputer undeletable undelete undelivered unibus unicast unicasting unicode uniplexed uniprocessors unisys univac unmap unmapped unmaps unmarshal unmarshals unmet upcall upcalls urls usarts vaxes vcr vcrs venn versabus vistanet wakeups wans warc's webmaster weizac winchester winchesters writeahead wwv www wysiwyg xyz a a's aardvark aardvarks aback abacus abaft abandon abandoned abandoning abandonment abandons abase abased abasement abasements abases abash abashed abashes abashing abasing abate abated abatement abatements abater abates abating abbe abbey abbey's abbeys abbot abbot's abbots abbreviate abbreviated abbreviates abbreviating abbreviation abbreviations abdomen abdomen's abdomens abdominal abduct abducted abduction abduction's abductions abductor abductor's abductors abducts abed aberrant aberration aberrations abet abets abetted abetter abetting abeyance abhor abhorred abhorrent abhorrer abhorring abhors abide abided abides abiding abilities ability ability's abject abjection abjections abjectly abjectness abjure abjured abjures abjuring ablate ablated ablates ablating ablation ablative ablaze able abler ablest ably abnormal abnormalities abnormality abnormally aboard abode abode's abodes abolish abolished abolisher abolishers abolishes abolishing abolishment abolishment's abolishments abolition abolitionist abolitionists abominable abominably abominate abominated aboriginal aboriginals aborigine aborigine's aborigines abort aborted aborting abortion abortion's abortions abortive abortively aborts abound abounded abounding abounds about above aboveboard aboveground abovementioned abrade abraded abrades abrading abrasion abrasion's abrasions abrasive abreaction abreactions abreast abridge abridged abridges abridging abridgment abroad abrogate abrogated abrogates abrogating abrogation abrupt abruptly abruptness abscess abscessed abscesses abscissa abscissa's abscissas abscond absconded absconding absconds absence absence's absences absent absented absentee absentee's absenteeism absentees absentia absenting absently absentminded absents absinthe absolute absolutely absoluteness absolutes absolution absolve absolved absolves absolving absorb absorbed absorbency absorbent absorber absorbing absorbs absorption absorption's absorptions absorptive abstain abstained abstainer abstaining abstains abstention abstentions abstinence abstract abstracted abstracting abstraction abstraction's abstractionism abstractionist abstractions abstractly abstractness abstractor abstractor's abstractors abstracts abstruse abstruseness absurd absurdities absurdity absurdity's absurdly abundance abundant abundantly abuse abused abuses abusing abusive abut abutment abuts abutted abutter abutter's abutters abutting abysmal abysmally abyss abyss's abysses acacia academia academic academically academician academics academies academy academy's accede acceded accedes accelerate accelerated accelerates accelerating acceleration accelerations accelerator accelerators accelerometer accelerometer's accelerometers accent accented accenting accents accentual accentuate accentuated accentuates accentuating accentuation accept acceptability acceptable acceptably acceptance acceptance's acceptances accepted accepter accepters accepting acceptor acceptor's acceptors accepts access accessed accesses accessibility accessible accessibly accessing accession accession's accessions accessor's accessories accessors accessory accessory's accident accidental accidentally accidently accidents acclaim acclaimed acclaiming acclaims acclamation acclimate acclimated acclimates acclimating acclimatization acclimatized accolade accolades accommodate accommodated accommodates accommodating accommodation accommodations accompanied accompanies accompaniment accompaniment's accompaniments accompanist accompanist's accompanists accompany accompanying accomplice accomplices accomplish accomplished accomplisher accomplishers accomplishes accomplishing accomplishment accomplishment's accomplishments accord accordance accorded accorder accorders according accordingly accordion accordion's accordionist accordions accords accost accosted accosting accosts account accountability accountable accountably accountancy accountant accountant's accountants accounted accounting accounts accoutrement accoutrements accredit accreditation accreditations accredited accretion accretion's accretions accrue accrued accrues accruing acculturate acculturated acculturates acculturating acculturation accumulate accumulated accumulates accumulating accumulation accumulations accumulator accumulator's accumulators accuracies accuracy accurate accurately accurateness accursed accusation accusation's accusations accusative accuse accused accused's accuser accuses accusing accusingly accustom accustomed accustoming accustoms ace ace's aces acetate acetone acetylene ache ached aches achievable achieve achieved achievement achievement's achievements achiever achievers achieves achieving achilles aching acid acidic acidities acidity acidly acids acidulous acknowledge acknowledgeable acknowledged acknowledgement acknowledgements acknowledger acknowledgers acknowledges acknowledging acknowledgment acknowledgment's acknowledgments acme acne acolyte acolytes acorn acorn's acorns acoustic acoustical acoustically acoustician acoustics acquaint acquaintance acquaintance's acquaintances acquainted acquainting acquaints acquiesce acquiesced acquiescence acquiescent acquiesces acquiescing acquirable acquire acquired acquirer acquires acquiring acquisition acquisition's acquisitions acquisitive acquisitiveness acquit acquits acquittal acquitted acquitter acquitting acre acre's acreage acres acrid acrimonious acrimony acrobat acrobat's acrobatic acrobatics acrobats acronym acronym's acronyms acropolis across acrylic act acted acting actinium actinometer actinometers action action's actions activatable activate activated activates activating activation activations activator activator's activators active actively activism activist activist's activists activities activity activity's actor actor's actors actress actress's actresses acts actual actualities actuality actualization actually actuals actuarial actuarially actuate actuated actuates actuating actuator actuator's actuators acuity acumen acute acutely acuteness acyclic acyclical acyclically ad ada ada's adage adages adagio adagios adamant adamantly adapt adaptability adaptable adaptably adaptation adaptation's adaptations adapted adapter adapters adapting adaptive adaptively adaptor adaptors adapts add added addend addenda addendum adder adders addict addicted addicting addiction addiction's addictions addicts adding addition addition's additional additionally additions additive additive's additives additivity addle addled addles addling address addressability addressable addressed addressee addressee's addressees addresser addressers addresses addressing adds adduce adduced adduces adducible adducing adduct adducted adducting adduction adductor adducts adept adequacies adequacy adequate adequately adhere adhered adherence adherent adherent's adherents adherer adherers adheres adhering adhesion adhesions adhesive adhesive's adhesives adiabatic adiabatically adieu adjacency adjacent adjacently adjective adjective's adjectives adjoin adjoined adjoining adjoins adjourn adjourned adjourning adjournment adjourns adjudge adjudged adjudges adjudging adjudicate adjudicated adjudicates adjudicating adjudication adjudication's adjudications adjunct adjunct's adjuncts adjure adjured adjures adjuring adjust adjustable adjustably adjusted adjuster adjusters adjusting adjustment adjustment's adjustments adjustor adjustor's adjustors adjusts adjutant adjutants administer administered administering administerings administers administrable administrate administrated administration administration's administrations administrative administratively administrator administrator's administrators administrators' admirable admirably admiral admiral's admirals admiralty admiration admirations admire admired admirer admirers admires admiring admiringly admissibility admissible admission admission's admissions admit admits admittance admitted admittedly admitter admitters admitting admix admixed admixes admixture admonish admonished admonishes admonishing admonishment admonishment's admonishments admonition admonition's admonitions ado adobe adolescence adolescent adolescent's adolescents adopt adopted adopter adopters ad !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     opting adoption adoption's adoptions adoptive adopts adorable adoration adore adored adores adorn adorned adorning adornment adornment's adornments adorns adrenal adrenaline adrift adroit adroitness ads adsorb adsorbed adsorbing adsorbs adsorption adulate adulating adulation adult adult's adulterate adulterated adulterates adulterating adulterer adulterer's adulterers adulterous adulterously adultery adulthood adults adumbrate adumbrated adumbrates adumbrating adumbration advance advanced advancement advancement's advancements advances advancing advantage advantaged advantageous advantageously advantages advent adventist adventists adventitious adventure adventured adventurer adventurers adventures adventuring adventurous adverb adverb's adverbial adverbs adversaries adversary adversary's adverse adversely adversities adversity advertise advertised advertisement advertisement's advertisements advertiser advertisers advertises advertising advice advisability advisable advisably advise advised advisedly advisee advisee's advisees advisement advisements adviser advisers advises advising advisor advisor's advisors advisory advocacy advocate advocated advocates advocating aegis aerate aerated aerates aerating aeration aerator aerators aerial aerial's aerials aeroacoustic aerobic aerobics aerodynamic aerodynamically aerodynamics aeronautic aeronautical aeronautics aerosol aerosolize aerosols aerospace aesthetic aesthetic's aesthetically aesthetics afar affable affair affair's affairs affect affectation affectation's affectations affected affecting affectingly affection affection's affectionate affectionately affections affective affects afferent affianced affidavit affidavit's affidavits affiliate affiliated affiliates affiliating affiliation affiliations affine affinities affinity affinity's affirm affirmation affirmation's affirmations affirmative affirmatively affirmed affirming affirms affix affixed affixes affixing afflict afflicted afflicting affliction affliction's afflictions afflictive afflicts affluence affluent afford affordable afforded affording affords affricate affricates affright affront affronted affronting affronts afghan afghanistan afghans aficionado afield afire aflame afloat afoot afore aforementioned aforesaid aforethought afoul afraid afresh africa african africans aft after aftereffect afterglow afterimage afterlife aftermath aftermost afternoon afternoon's afternoons aftershock aftershocks afterthought afterthoughts afterward afterwards again against agape agar agate agates age aged ageless agencies agency agency's agenda agenda's agendas agent agent's agents ager agers ages agglomerate agglomerated agglomerates agglomeration agglutinate agglutinated agglutinates agglutinating agglutination agglutinin agglutinins aggravate aggravated aggravates aggravation aggregate aggregated aggregately aggregates aggregating aggregation aggregations aggregative aggression aggression's aggressions aggressive aggressively aggressiveness aggressor aggressors aggrieve aggrieved aggrieves aggrieving aghast agile agilely agility aging agitate agitated agitates agitating agitation agitations agitator agitator's agitators agleam aglow agnostic agnostic's agnostics ago agog agonies agonize agonized agonizes agonizing agonizingly agony agrarian agree agreeable agreeably agreed agreeing agreement agreement's agreements agreer agreers agrees agricultural agriculturally agriculture aground ague ah ahead aid aide aided aides aiding aids ail aileron ailerons ailing ailment ailment's ailments aim aimed aimer aimers aiming aimless aimlessly aims air airbag airbags airborne aircraft aircraft's airdrop airdrops aired airedale airer airers airfare airfield airfield's airfields airflow airfoil airfoils airframe airframes airily airing airings airless airlift airlift's airlifts airline airline's airliner airlines airlock airlock's airlocks airmail airmails airman airmen airplane airplane's airplanes airport airport's airports airs airship airship's airships airspace airspeed airstrip airstrip's airstrips airtight airway airway's airways airy aisle ajar akimbo akin alabama alabamian alabaster alacrity alarm alarmed alarming alarmingly alarmist alarms alas alaska alba albacore albania albanian albanians albatross albeit albino album albumin albums alchemy alcibiades alcohol alcohol's alcoholic alcoholic's alcoholics alcoholism alcohols alcove alcove's alcoves alder alderman alderman's aldermen ale alee alert alerted alertedly alerter alerters alerting alertly alertness alerts alewife alfalfa alfresco alga algae algaecide algebra algebra's algebraic algebraical algebraically algebras algeria algerian alginate algol algorithm algorithm's algorithmic algorithmically algorithms alias aliased aliases aliasing alibi alibi's alibis alien alien's alienate alienated alienates alienating alienation aliens alight align aligned aligning alignment alignments aligns alike aliment aliments alimony aliquot alive alkali alkali's alkaline alkalis alkaloid alkaloid's alkaloids alkyl all allah allah's allay allayed allaying allays allegation allegation's allegations allege alleged allegedly alleges allegiance allegiance's allegiances alleging allegoric allegorical allegorically allegories allegory allegory's allegretto allegretto's allegrettos allegro allegro's allegros allele alleles allemande allergic allergies allergy allergy's alleviate alleviated alleviaters alleviates alleviating alleviation alley alley's alleys alleyway alleyway's alleyways alliance alliance's alliances allied allies alligator alligator's alligators alliteration alliteration's alliterations alliterative allocatable allocate allocated allocates allocating allocation allocations allocator allocator's allocators allophone allophones allophonic allot allotment allotment's allotments allots allotted allotting allow allowable allowably allowance allowance's allowances allowed allowing allows alloy alloy's alloys allude alluded alludes alluding allure allurement alluring allusion allusion's allusions allusive allusiveness ally allying alma almanac almanac's almanacs almighty almond almond's almonds almoner almost alms almsman alnico aloe aloes aloft aloha alone aloneness along alongside aloof aloofness aloud alpha alpha's alphabet alphabet's alphabetic alphabetical alphabetically alphabetics alphabetization alphabetize alphabetized alphabetizes alphabetizing alphabets alphanumeric alphanumerical alphanumerically alpine alps already also altar altar's altars alter alterable alteration alteration's alterations altercation altercation's altercations altered alterer alterers altering alternate alternated alternately alternates alternating alternatingly alternation alternations alternative alternatively alternatives alternator alternator's alternators alters although altitude altitudes alto alto's altogether altos altruism altruist altruistic altruistically alum aluminum alumna alumna's alumnae alumni alumnus alundum alveolar alveoli alveolus always am amain amalgam amalgam's amalgamate amalgamated amalgamates amalgamating amalgamation amalgams amanuensis amass amassed amasses amassing amateur amateur's amateurish amateurishness amateurism amateurs amatory amaze amazed amazedly amazement amazer amazers amazes amazing amazingly amazon amazon's amazons ambassador ambassador's ambassadors amber ambiance ambidextrous ambidextrously ambience ambient ambiguities ambiguity ambiguity's ambiguous ambiguously ambiguousness ambition ambition's ambitions ambitious ambitiously ambivalence ambivalent ambivalently amble ambled ambler ambles ambling ambrosial ambulance ambulance's ambulances ambulatory ambuscade ambush ambushed ambushes amelia ameliorate ameliorated ameliorating amen amenable amend amended amending amendment amendment's amendments amends amenities amenity amenorrhea america america's american american's americana americans americas americium amiable amicable amicably amid amide amidst amigo amino amiss amity ammo ammonia ammoniac ammonium ammunition amnesty amoeba amoeba's amoebae amoebas amok among amongst amoral amorality amorist amorous amorphous amorphously amortize amortized amortizes amortizing amount amounted amounter amounters amounting amounts amour amp amperage ampere amperes ampersand ampersand's ampersands amphetamine amphetamines amphibian amphibian's amphibians amphibious amphibiously amphibology amphitheater amphitheater's amphitheaters ample ampler amplest amplification amplifications amplified amplifier amplifiers amplifies amplify amplifying amplitude amplitude's amplitudes amply ampoule ampoule's ampoules amps amputate amputated amputates amputating amsterdam amtrak amulet amulets amuse amused amusedly amusement amusement's amusements amuser amusers amuses amusing amusingly amyl an anabaptist anabaptist's anabaptists anachronism anachronism's anachronisms anachronistically anaconda anacondas anaerobic anaesthesia anagram anagram's anagrams anal analog analogical analogies analogous analogously analogue analogue's analogues analogy analogy's analyses analysis analyst analyst's analysts analytic analytical analytically analyticities analyticity analyzable analyze analyzed analyzer analyzers analyzes analyzing anaphora anaphoric anaphorically anaplasmosis anarchic anarchical anarchist anarchist's anarchists anarchy anastomoses anastomosis anastomotic anathema anatomic anatomical anatomically anatomy ancestor ancestor's ancestors ancestral ancestry anchor anchorage anchorage's anchorages anchored anchoring anchorite anchoritism anchors anchovies anchovy ancient anciently ancients ancillary and anders anding andorra anecdotal anecdote anecdote's anecdotes anechoic anemia anemic anemometer anemometer's anemometers anemometry anemone anesthesia anesthetic anesthetic's anesthetically anesthetics anesthetize anesthetized anesthetizes anesthetizing anew angel angel's angeles angelic angels anger angered angering angers angiography angle angled angler anglers angles anglican anglicanism anglicans angling anglophilia anglophobia angola angrier angriest angrily angry angst angstrom anguish anguished angular angularly anhydrous anhydrously aniline animal animal's animals animate animated animatedly animately animateness animates animating animation animations animator animator's animators animism animists animosity anion anion's anionic anions anise aniseikonic anisotropic anisotropy ankara ankle ankle's ankles annal annals annex annexation annexed annexes annexing annihilate annihilated annihilates annihilating annihilation anniversaries anniversary anniversary's annotate annotated annotates annotating annotation annotations announce announced announcement announcement's announcements announcer announcers announces announcing annoy annoyance annoyance's annoyances annoyed annoyer annoyers annoying annoyingly annoys annual annually annuals annuity annul annular annuli annulled annulling annulment annulment's annulments annuls annulus annum annunciate annunciated annunciates annunciating annunciator annunciators anode anode's anodes anodize anodized anodizes anoint anointed anointing anoints anomalies anomalous anomalously anomaly anomaly's anomic anomie anon anonymity anonymous anonymously anorexia another another's ansi answer answerable answered answerer answerers answering answers ant ant's antagonism antagonisms antagonist antagonist's antagonistic antagonistically antagonists antagonize antagonized antagonizes antagonizing antarctic antarctica ante anteater anteater's anteaters antecedent antecedent's antecedents antedate antelope antelope's antelopes antenna antenna's antennae antennas anterior anthem anthem's anthems anther anthologies anthology anthracite anthropological anthropologically anthropologist anthropologist's anthropologists anthropology anthropomorphic anthropomorphically anti antibacterial antibiotic antibiotics antibodies antibody antic antic's anticipate anticipated anticipates anticipating anticipation anticipations anticipatory anticoagulation anticompetitive antics antidisestablishmentarianism antidote antidote's antidotes antiformant antifundamentalist antigen antigen's antigens antihistorical antihogging antilock antimicrobial antimony antinomian antinomy antipathy antiphonal antipode antipode's antipodes antiquarian antiquarian's antiquarians antiquate antiquated antique antique's antiques antiquities antiquity antiredeposition antiresonance antiresonator antisemitic antisemitism antiseptic antisera antiserum antislavery antisocial antisubmarine antisymmetric antisymmetry antitank antithesis antithetic antithetical antithyroid antitoxin antitoxin's antitoxins antitrust antivirus antler antlered ants anus anvil anvil's anvils anxieties anxiety anxious anxiously any anybody anyhow anymore anyone anyplace anything anytime anyway anywhere aorta apace apart apartheid apartment apartment's apartments apathetic apathy ape aped aperiodic aperiodicity aperture apertured apes apex aphasia aphasic aphelion aphid aphid's aphids aphonic aphorism aphorism's aphorisms aphrodite apiaries apiary apical apiece aping apish apl aplenty aplomb apocalypse apocalyptic apocrypha apocryphal apogee apogees apollo apollonian apologetic apologetically apologia apologies apologist apologist's apologists apologize apologized apologizes apologizing apology apology's apostate apostle apostle's apostles apostolic apostrophe apostrophes apothecary apotheoses apotheosis appalachia appalachian appalachians appall appalled appalling appallingly appanage apparatus apparel appareled apparent apparently apparition apparition's apparitions appeal appealed appealer appealers appealing appealingly appeals appear appearance appearances appeared appearer appearers appearing appears appease appeased appeasement appeases appeasing appellant appellant's appellants appellate append appendage appendage's appendages appended appender appenders appendices appendicitis appending appendix appendix's appendixes appends appertain appertains appetite appetite's appetites appetizer appetizing applaud applauded applauding applauds applause apple apple's applejack apples appliance appliance's appliances applicability applicable applicant applicant's applicants application application's applications applicative applicatively applicator applicator's applicators applied applier appliers applies applique apply applying appoint appointed appointee appointee's appointees appointer appointers appointing appointive appointment appointment's appointments appoints apportion apportioned apportioning apportionment apportionments apportions appraisal appraisal's appraisals appraise appraised appraiser appraisers appraises appraising appraisingly appreciable appreciably appreciate appreciated appreciates appreciating appreciation appreciations appreciative appreciatively appreciativeness apprehend apprehended apprehensible apprehension apprehension's apprehensions apprehensive apprehensively apprehensiveness apprentice apprenticed apprentices apprenticeship apprise apprised apprises apprising approach approachability approachable approached approacher approachers approaches approaching approbate approbation appropriate appropriated appropriately appropriateness appropriates appropriating appropriation appropriations appropriator appropriator's appropriators approval approval's approvals approve approved approver approvers approves approving approvingly approximate approximated approximately approximates approximating approximation approximations approximator approximators appurtenance appurtenances apricot apricot's apricots april apron apron's aprons apropos apse apsis apt aptitude aptitudes aptly aptness aqua aquaria aquarium aquarius aquatic aqueduct aqueduct's aqueducts aqueous aquifer aquifers arab arab's arabesque arabia arabian arabians arabic arable arabs arachnid arachnid's arachnids arbiter arbiter's arbiters arbitrarily arbitrariness arbitrary arbitrate arbitrated arbitrates arbitrating arbitration arbitrator arbitrator's arbitrators arbor arbor's arboreal arbors arc arcade arcade's arcaded arcades arcane arced arch archaeological archaeologist archaeologist's archaeologists archaeology archaic archaically archaicness archaism archaize archangel archangel's archangels archbishop archdiocese archdioceses arched archenemy archeological archeologist archeology archer archers archery arches archetype archfool arching archipelago archipelagoes architect architect's architectonic architects architectural architecturally architecture architecture's architectures archival archive archived archiver archivers archives archiving archivist archly arcing arclike arcs arcsin arcsine arctan arctangent arctic ardent ardently ardor arduous arduously arduousness are area area's areas aren't arena arena's arenas argentina argo argon argonaut argonauts argos argot arguable arguably argue argued arguer arguers argues arguing argument argument's argumentation argumentative arguments arianism arianist arianists arid aridity aries aright arise arisen ariser arises arising arisings aristocracy aristocrat aristocrat's aristocratic aristocratically aristocrats aristotelian aristotle arithmetic arithmetical arithmetically arithmetics arithmetize arithmetized arithmetizes arizona ark arkansas arm armadillo armadillos armageddon armament armament's armaments armchair armchair's armchairs armed armenian armer armers armful armhole armies arming armistice armless armload armor armored armorer armory armour armpit armpit's armpits arms armstrong army army's aroma aromas aromatic arose around arousal arouse aroused arouses arousing arpa arpanet arpeggio arpeggio's arpeggios arrack arraign arraigned arraigning arraignment arraignment's arraignments arraigns arrange arranged arrangement arrangement's arrangements arranger arrangers arranges arranging arrant array arrayed arrays arrears arrest arrested arrester arresters arresting arrestingly arrestor arrestor's arrestors arrests arrival arrival's arrivals arrive arrived arrives arriving arrogance arrogant arrogantly arrogate arrogated arrogates arrogating arrogation arrow arrowed arrowhead arrowhead's arrowheads arrows arroyo arroyos arsenal arsenal's arsenals arsenic arsenide arsine arson art art's artemis arterial arteries arteriolar arteriole arteriole's arterioles arteriosclerosis artery artery's artful artfully artfulness arthogram arthritis arthropod arthropod's arthropods artichoke artichoke's artichokes article article's articles articulate articulated articulately articulateness articulates articulating articulation articulations articulator articulators articulatory artifact artifact's artifacts artifice artificer artifices artificial artificialities artificiality artificially artificialness artillerist artillery artisan artisan's artisans artist artist's artistic artistically artistry artists artless arts artwork aryan as asbestos ascend ascendancy ascendant ascended ascendency ascendent ascender ascenders ascending ascends ascension ascensions ascent ascertain ascertainable ascertained ascertaining ascertains ascetic ascetic's asceticism ascetics ascii ascot ascribable ascribe ascribed ascribes ascribing ascription aseptic ash ashamed ashamedly ashen asher ashes ashman ashore ashtray ashtray's ashtrays asia asian asians asiatic aside asinine ask askance asked asker askers askew asking asks asleep asocial asp asparagus aspect aspect's aspects aspen aspersion aspersion's aspersions asphalt asphyxia aspic aspirant aspirant's aspirants aspirate aspirated aspirates aspirating aspiration aspiration's aspirations aspirator aspirators aspire aspired aspires aspirin aspiring aspirins ass ass's assail assailant assailant's assailants assailed assailing assails assassin assassin's assassinate assassinated assassinates assassinating assassination assassinations assassins assault assaulted assaulting assaults assay assayed assaying assemblage assemblage's assemblages assemble assembled assembler assemblers assembles assemblies assembling assembly assembly's assent assented assenter assenting assents assert asserted asserter asserters asserting assertion assertion's assertions assertive assertively assertiveness asserts asses assess assessed assesses assessing assessment assessment's assessments assessor assessors asset asset's assets assiduity assiduous assiduously assign assignable assignation assignations assigned assignee assignee's assignees assigner assigners assigning assignment assignment's assignments assigns assimilate assimilated assimilates assimilating assimilation assimilations assist assistance assistances assistant assistant's assistants assistantship assistantships assisted assisting assists associate associated associates associating association associational associations associative associatively associativities associativity associator associator's associators assonance assonant assort assorted assorting assortment assortment's assortments assorts assuage assuaged assuages assume assumed assumes assuming assumption assumption's assumptions assurance assurance's assurances assure assured assuredly assurer assurers assures assuring assuringly assyrian assyriology astatine aster aster's asterisk asterisk's asterisks asteroid asteroid's asteroidal asteroids asters asthma astonish astonished astonishes astonishing astonishingly astonishment astound astounded astounding astounds astral astray astride astringency astringent astronaut astronaut's astronautics astronauts astronomer astronomer's astronomers astronomical astronomically astronomy astrophysical astrophysicist astrophysicists astrophysics astute astutely astuteness asunder asylum asymmetric asymmetrical asymmetrically asymmetries asymmetry asymptomatically asymptote asymptote's asymptotes asymptotic asymptotical asymptotically asynchronism asynchronous asynchronously asynchrony at atavistic ate atemporal atheist atheist's atheistic atheists athena athenian athenians athens atherosclerosis athlete athlete's athletes athletic athleticism athletics atlanta atlantic atlas atmosphere atmosphere's atmospheres atmospheric atoll atoll's atolls atom atom's atomic atomically atomicity atomics atomization atomize atomized atomizes atomizing atoms atonal atonally atone atoned atonement atones atop atrocious atrociously atrocities atrocity atrocity's atrophic atrophied atrophies atrophy atrophying attach attache attached attacher attachers attaches attaching attachment attachment's attachments attack attackable attacked attacker attackers attacking attacks attain attainable attainably attained attainer attainers attaining attainment attainment's attainments attains attempt attempted attempter attempters attempting attempts attend attendance attendance's attendances attendant attendant's attendants attended attendee attendee's attendees attender attenders attending attends attention attention's attentional attentionality attentions attentive attentively attentiveness attenuate attenuated attenuates attenuating attenuation attenuator attenuator's attenuators attest attested attesting attests attic attic's attics attire attired attires attiring attitude attitude's attitudes attitudinal attorney attorney's attorneys attract attracted attracting attraction attraction's attractions attractive attractively attractiveness attractor attractor's attractors attracts attributable attribute attributed attributes attributing attribution attributions attributive attributively attrition attune attuned attunes attuning atypical atypically auburn auckland auction auctioned auctioneer auctioneer's auctioneers audacious audaciously audaciousness audacity audibility audible audibly audience audience's audiences audio audiogram audiogram's audiograms audiological audiologist audiologist's audiologists audiology audiometer audiometers audiometric audiometry audiovisual audit audited auditing audition audition's auditioned auditioning auditions auditor auditor's auditorium auditors auditory audits audubon aug augend auger auger's augers aught augment augmentation augmentations augmented augmenting augments augur augurs august augusta augustly augustness aunt aunt's aunts aura aura's aural aurally auras aureole aureomycin aurora auscultate auscultated auscultates auscultating auscultation auscultations auspice auspices auspicious auspiciously aussie aussies austere austerely austerity austin australia australia's australian australians austria austrian authentic authentically authenticate authenticated authenticates authenticating authentication authentications authenticator authenticators authenticity author author's authored authoring authoritarian authoritarianism authoritative authoritatively authorities authority authority's authorization authorization's authorizations authorize authorized authorizer authorizers authorizes authorizing authors authorship autism autistic auto auto's autobiographic autobiographical autobiographies autobiography autobiography's autocollimator autocorrelate autocorrelation autocracies autocracy autocrat autocrat's autocratic autocratically autocrats autodecrement autodecremented autodecrements autodialer autofluorescence autograph autographed autographing autographs autoincrement autoincremented autoincrements autoindex autoindexing automata automate automated automates automatic automatically automating automation automaton automatons automobile automobile's automobiles automotive autonavigator autonavigator's autonavigators autonomic autonomous autonomously autonomy autopilot autopilot's autopilots autopsied autopsies autopsy autoregressive autos autosuggestibility autotransformer autumn autumn's autumnal autumns auxiliaries auxiliary avail availabilities availability available availably availed availer availers availing avails avalanche avalanched avalanches avalanching avant avarice avaricious avariciously ave avenge avenged avenger avenges avenging avenue avenue's avenues aver average averaged averages averaging averred averrer averring avers averse aversion aversion's aversions avert averted averting averts avian aviaries aviary aviation aviator aviator's aviators avid avidity avidly avionic avionics avocado avocados avocation avocation's avocations avoid avoidable avoidably avoidance avoided avoider avoiders avoiding avoids avouch avow avowed avows await awaited awaiting awaits awake awaken awakened awakening awakens awakes awaking award awarded awarder awarders awarding awards aware awareness awash away awe awed awesome awful awfully awfulness awhile awkward awkwardly awkwardness awl awl's awls awning awning's awnings awoke awry ax axe axed axer axers axes axial axially axing axiological axiom axiom's axiomatic axiomatically axiomatics axiomatization axiomatization's axiomatizations axiomatize axiomatized axiomatizes axiomatizing axioms axis axle axle's axles axolotl axolotl's axolotls axon axon's axons aye ayes azalea azalea's azaleas azimuth azimuth's azimuths azure b b's babbage babble babbled babbles babbling babe babe's babel babel's babes babied babies baboon baboons baby babyhood babying babyish babysit babysitting baccalaureate bach bach's bachelor bachelor's bachelors bacilli bacillus back backache backache's backaches backarrow backarrows backbend backbend's backbends backboard backbone backbone's backbones backdrop backdrop's backdrops backed backer backers backfill backfiring background background's backgrounds backhand backhoe backhoes backing backlash backlog backlog's backlogged backlogs backoff backorder backpack backpack's backpacks backplane backplane's backplanes backplate backpointer backpointer's backpointers backs backscatter backscattered backscattering backscatters backside backslash backslashes backspace backspaced backspaces backspacing backstage backstairs backstitch backstitched backstitches backstitching backstop backtrack backtracked backtracker backtrackers backtracking backtracks backup backups backward backwardness backwards backwater backwater's backwaters backwood backwoods backyard backyard's backyards bacon bacteria bacterial bacterium bad bade badge badger badger's badgered badgering badgers badges badlands badly badminton badness baffle baffled baffler bafflers baffling bag bag's bagatelle bagatelle's bagatelles bagel bagel's bagels baggage bagged bagger bagger's baggers bagging baggy baghdad bagpipe bagpipe's bagpipes bags bah bail bailiff bailiff's bailiffs bailing bait baited baiter baiting baits bake baked baker bakeries bakers bakery bakery's bakes baking baklava baksheesh balalaika balalaika's balalaikas balance balanced balancer balancers balances balancing balconies balcony balcony's bald balding baldly baldness bale baleful baler bales balk balkan balkanize balkanized balkanizing balkans balked balkiness balking balks balky ball ballad ballad's ballads ballast ballast's ballasts balled baller ballerina ballerina's ballerinas ballers ballet ballet's ballets ballgown's ballgowns balling ballistic ballistics balloon ballooned ballooner ballooners ballooning balloons ballot ballot's ballots ballpark ballpark's ballparks ballplayer ballplayer's ballplayers ballroom ballroom's ballrooms balls ballyhoo balm balm's balms balmy balsa balsam baltic baltimore balustrade balustrade's balustrades bamboo ban ban's banal banally banana banana's bananas band bandage bandaged bandages bandaging banded bandied bandies banding bandit bandit's bandits bandlimit bandlimited bandlimiting bandlimits bandpass bands bandstand bandstand's bandstands bandwagon bandwagon's bandwagons bandwidth bandwidths bandy bandying bane baneful bang banged banging bangladesh bangle bangle's bangles bangs banish banished banishes banishing banishment banister banister's banisters banjo banjo's banjos bank bank's banked banker banker's bankers banking bankrupt bankruptcies bankruptcy bankruptcy's bankrupted bankrupting bankrupts banks banned banner banner's banners banning banquet banqueting banquetings banquets bans banshee banshee's banshees bantam banter bantered bantering banters bantu bantus banyan baptism baptism's baptismal baptisms baptist baptist's baptistery baptistries baptistry baptistry's baptists baptize baptized baptizes baptizing bar bar's barb barbados barbarian barbarian's barbarians barbaric barbarities barbarity barbarous barbarously barbecue barbecued barbecueing barbecues barbed barbell barbell's barbells barbeque barbequed barber barbers barbital barbiturate barbiturates barbs bard bard's bards bare bared barefoot barefooted barely bareness barer bares barest barflies barfly barfly's bargain bargained bargaining bargains barge barges barging baring baritone baritone's baritones barium bark barked barker barkers barking barks barley barn barn's barns barnstorm barnstormed barnstorming barnstorms barnyard barnyard's barnyards barometer barometer's barometers barometric baron baron's baroness baronial baronies barons barony barony's baroque baroqueness barrack barracks barrage barrage's barrages barred barrel barrel's barrelled barrelling barrels barren barrenness barricade barricade's barricades barrier barrier's barriers barring barringer barrister barrow bars bartender bartender's bartenders barter bartered bartering barters bas basal basalt base baseball baseball's baseballs baseband baseboard baseboard's baseboards based basel baseless baseline baseline's baselines basely baseman basement basement's basements basename baseness baser bases bash bashed bashes bashful bashfulness bashing basic basically basics basil basin basin's basing basins basis bask basked basket basket's basketball basketball's basketballs baskets basking bass bass's basses basset bassinet bassinet's bassinets basso bastard bastard's bastards baste basted bastes bastille basting bastion bastion's bastions bat bat's batch batched batches batching bath bathe bathed bather bathers bathes bathing bathos bathrobe bathrobe's bathrobes bathroom bathroom's bathrooms baths bathtub bathtub's bathtubs baton baton's batons bats battalion battalion's battalions batted batten battens batter battered batteries battering batters battery battery's batting battle battled battlefield battlefield's battlefields battlefront battlefront's battlefronts battleground battleground's battlegrounds battlement battlement's battlements battler battlers battles battleship battleship's battleships battling bauble bauble's baubles baud bauxite bawdy bawl bawled bawling bawls bay bayed baying bayonet bayonet's bayonets bayou bayou's bayous bays bazaar bazaar's bazaars be beach beached beaches beachhead beachhead's beachheads beaching beacon beacon's beacons bead beaded beading beadle beadle's beadles beads beady beagle beagle's beagles beak beaked beaker beakers beaks beam beam's beamed beamer beamers beaming beams bean beaned beaner beaners beaning beans bear bearable bearably beard bearded beardless beards bearer bearers bearing bearings bearish bears beast beastly beasts beat beatable beatably beaten beater beaters beatific beatification beatify beating beatings beatitude beatitude's beatitudes beatnik beatnik's beatniks beats beau beau's beaus beauteous beauteously beauties beautification beautifications beautified beautifier beautifiers beautifies beautiful beautifully beautify beautifying beauty beauty's beaver beaver's beavers becalm becalmed becalming becalms became because beck beckon beckoned beckoning beckons become becomes becoming becomingly bed bed's bedazzle bedazzled bedazzlement bedazzles bedazzling bedbug bedbug's bedbugs bedded bedder bedder's bedders bedding bedevil bedeviled bedeviling bedevils bedfast bedlam bedpost bedpost's bedposts bedraggle bedraggled bedridden bedrock bedrock's bedroom bedroom's bedrooms beds bedside bedspread bedspread's bedspreads bedspring bedspring's bedsprings bedstead bedstead's bedsteads bedtime bee beech beechen beecher beef beefed beefer beefers beefing beefs beefsteak beefy beehive beehive's beehives been beep beeped beeper beepers beeping beeps beer beers bees beet beet's beethoven beetle beetle's beetled beetles beetling beets befall befallen befalling befalls befell befit befit's befits befitted befitting befog befogged befogging before beforehand befoul befouled befouling befouls befriend befriended befriending befriends befuddle befuddled befuddles befuddling beg began beget begets begetting beggar beggarly beggars beggary begged begging begin beginner beginner's beginners beginning beginning's beginnings begins begot begotten begrudge begrudged begrudges begrudging begrudgingly begs beguile beguiled beguiles beguiling beguilingly begun behalf behave behaved behaves behaving behavior behavioral behaviorally behaviorism behavioristic behaviors behead beheading beheld behemoth behemoths behest behind behold beholden beholder beholders beholding beholds behoove behooves beige being beings bel belabor belabored belaboring belabors belated belatedly belay belayed belaying belays belch belched belches belching belfries belfry belfry's belgian belgian's belgians belgium belie belied belief belief's beliefs belies believable believably believe believed believer believers believes believing belittle belittled belittles belittling bell bell's bellboy bellboy's bellboys belle belle's belles bellhop bellhop's bellhops bellicose bellicosity bellies belligerence belligerent belligerent's belligerently belligerents bellman bellmen bellow bellowed bellowing bellows bells bellum bellwether bellwether's bellwethers belly belly's bellyache bellyfull belong belonged belonging belongings belongs beloved below belt belted belting belts belying bemoan bemoaned bemoaning bemoans bench benched benches benchmark benchmark's benchmarked benchmarking benchmarks bend bendable bender benders bending bends beneath benedict benedictine benediction benediction's benedictions benefactor benefactor's benefactors beneficence beneficences beneficial beneficially beneficiaries beneficiary benefit benefited benefiting benefits benevolence benevolent bengal bengali benighted benign benignly bent benzedrine benzene bequeath bequeathal bequeathed bequeathing bequeaths bequest bequest's bequests berate berated berates berating bereave bereaved bereavement bereavements bereaves bereaving bereft beret beret's berets berg beribboned beriberi berkeley berkelium berlin berliner berliners bermuda berne berries berry berry's berserk berth berths beryl beryllium beseech beseeches beseeching beset besets besetting beside besides besiege besieged besieger besiegers besieging besmirch besmirched besmirches besmirching besotted besotter besotting besought bespeak bespeaks bespectacled bespoke bessel best bested bestial besting bestir bestirring bestow bestowal bestowed bests bestseller bestseller's bestsellers bestselling bet bet's beta beta's betatron betel betide betray betrayal betrayed betrayer betraying betrays betroth betrothal betrothed bets better bettered bettering betterment betterments betters betting between betwixt bevel beveled beveling bevels beverage beverage's beverages bevy bewail bewailed bewailing bewails beware bewhiskered bewilder bewildered bewildering bewilderingly bewilderment bewilders bewitch bewitched bewitches bewitching beyond biannual bias biased biases biasing bib bib's bibbed bibbing bible bible's bibles biblical biblically bibliographic bibliographical bibliographics bibliographies bibliography bibliography's bibliophile bibs bicameral bicarbonate bicentennial bicep bicep's biceps bicker bickered bickering bickers biconcave biconnected biconvex bicycle bicycled bicycler bicyclers bicycles bicycling bid bid's biddable bidden bidder bidder's bidders biddies bidding biddy bide bidirectional bids biennial biennium bier bifocal bifocals bifurcate bifurcation big bigger biggest bight bight's bights bigness bigot bigot's bigoted bigotry bigots bigwigs biharmonic bijection bijection's bijections bijective bijectively bike bike's bikes biking bikini bikini's bikinis bilabial bilateral bilaterally bile bilge bilge's bilges bilinear bilingual bilk bilked bilking bilks bill billboard billboard's billboards billed biller billers billet billeted billeting billets billiard billiards billing billings billion billionaire billions billionth billow billowed billows bills bimetallic bimetallism bimodal bimolecular bimonthlies bimonthly bin bin's binaries binary binaural bind binder binder's binders binding bindings binds bing binge binges bingo binocular binoculars binomial bins binuclear biochemical biochemist biochemistry biodegradable bioengineering biofeedback biographer biographer's biographers biographic biographical biographically biographies biography biography's biological biologically biologist biologist's biologists biology biomass biome biomedical biomedicine biophysical biophysicist biophysics biopsies biopsy bioscience biosphere biostatistic biosynthesize biota biotic bipartisan bipartite biped bipeds biplane biplane's biplanes bipolar biracial birch birchen birches bird bird's birdbath birdbath's birdbaths birders birdie birdied birdies birdlike birds birefringence birefringent birth birthday birthday's birthdays birthed birthplace birthplaces birthright birthright's birthrights births biscuit biscuit's biscuits bisect bisected bisecting bisection bisection's bisections bisector bisector's bisectors bisects bishop bishop's bishops bismuth bison bison's bisons bisque bisques bistable bistate bisync bit bit's bitch bitch's bitches bite biter biters bites biting bitingly bitmap bitmapped bitnet bits bitten bitter bitterer bitterest bitterly bitterness bitternut bitterroot bitters bittersweet bitumen bituminous bitwise bivalve bivalve's bivalves bivariate bivouac bivouacs biweekly bizarre blab blabbed blabbermouth blabbermouths blabbing blabs black blackberries blackberry blackberry's blackbird blackbird's blackbirds blackboard blackboard's blackboards blacked blacken blackened blackening blackens blacker blackest blacking blackjack blackjack's blackjacks blacklist blacklisted blacklisting blacklists blackly blackmail blackmailed blackmailer blackmailers blackmailing blackmails blackness blackout blackout's blackouts blacks blacksmith blacksmiths bladder bladder's bladders blade blade's blades blamable blame blamed blameless blamelessness blamer blamers blames blameworthy blaming blanch blanched blanches blanching bland blandly blandness blank blanked blanker blankest blanket blanketed blanketer blanketers blanketing blankets blanking blankly blankness blanks blare blared blares blaring blase blaspheme blasphemed blasphemes blasphemies blaspheming blasphemous blasphemously blasphemousness blasphemy blast blasted blaster blasters blasting blasts blatant blatantly blatantness blaze blazed blazer blazers blazes blazing bleach bleached bleacher bleachers bleaches bleaching bleak bleaker bleakly bleakness blear bleary bleat bleating bleats bled bleed bleeder bleeding bleedings bleeds blemish blemish's blemished blemishes blemishing blend blended blending blends bless blessed blesses blessing blessings blew blight blighted blimp blimp's blimps blind blinded blinder blinders blindfold blindfolded blindfolding blindfolds blinding blindingly blindly blindness blinds blink blinked blinker blinkers blinking blinks blintzes blip blip's blips bliss blissful blissfully blister blistered blistering blisters blit blithe blithely blitz blitz's blitzes blitzkrieg blizzard blizzard's blizzards bloat bloated bloater bloating bloats blob blob's blobs bloc bloc's block block's blockade blockaded blockades blockading blockage blockage's blockages blocked blocker blockers blockhouse blockhouses blocking blocks blocs bloke bloke's blokes blond blond's blonde blonde's blondes blonds blood bloodbath blooded bloodhound bloodhound's bloodhounds bloodied bloodiest bloodless bloods bloodshed bloodshot bloodstain bloodstain's bloodstained bloodstains bloodstream bloody bloom bloomed bloomer bloomers blooming blooms blossom blossomed blossoms blot blot's blots blotted blotting blouse blouse's blouses blow blower blowers blowfish blowing blown blows blowup blubber bludgeon bludgeoned bludgeoning bludgeons blue blueberries blueberry blueberry's bluebird bluebird's bluebirds bluebonnet bluebonnet's bluebonnets bluefish blueness blueprint blueprint's blueprints bluer blues bluest bluestocking bluff bluffing bluffs bluing bluish blunder blunderbuss blundered blundering blunderings blunders blunt blunted blunter bluntest blunting bluntly bluntness blunts blur blur's blurb blurred blurring blurry blurs blurt blurted blurting blurts blush blushed blushes blushing bluster blustered blustering blusters blustery boa boar board boarded boarder boarders boarding boardinghouse boardinghouse's boardinghouses boards boast boasted boaster boasters boastful boastfully boasting boastings boasts boat boater boaters boathouse boathouse's boathouses boating boatload boatload's boatloads boatman boatmen boats boatsman boatsmen boatswain boatswain's boatswains boatyard boatyard's boatyards bob bob's bobbed bobbin bobbin's bobbing bobbins bobby bobolink bobolink's bobolinks bobs bobwhite bobwhite's bobwhites bode bodes bodice bodied bodies bodily body bodybuilder bodybuilder's bodybuilders bodybuilding bodyguard bodyguard's bodyguards bodyweight bog bog's bogeymen bogged boggle boggled boggles boggling bogs bogus boil boiled boiler boilerplate boilers boiling boils boisterous boisterously bold bolder boldest boldface boldly boldness bolivia boll bologna bolshevik bolshevik's bolsheviks bolshevism bolster bolstered bolstering bolsters bolt bolted bolting bolts bomb bombard bombarded bombarding bombardment bombards bombast bombastic bombay bombed bomber bombers bombing bombings bombproof bombs bonanza bonanza's bonanzas bond bondage bonded bonder bonders bonding bonds bondsman bondsmen bone boned boner boners bones bonfire bonfire's bonfires bong boning bonn bonnet bonneted bonnets bonny bonus bonus's bonuses bony boo boob booboo booby book bookcase bookcase's bookcases booked booker bookers bookie bookie's bookies booking bookings bookish bookkeeper bookkeeper's bookkeepers bookkeeping booklet booklet's booklets bookmark bookmarks books bookseller bookseller's booksellers bookshelf bookshelf's bookshelves bookstore bookstore's bookstores boolean booleans boom boomed boomerang boomerang's boomerangs booming booms boomtown boomtown's boomtowns boon boor boor's boorish boors boos boost boosted booster boosting boosts boot bootable booted booth booths booting bootleg bootleger bootlegged bootlegger bootlegger's bootleggers bootlegging bootlegs boots bootstrap bootstrap's bootstrapped bootstrapping bootstraps booty booze borate borates borax bordello bordello's bordellos border bordered bordering borderings borderland borderland's borderlands borderline borders bore bored boredom borer bores boric boring born borne borneo boron borough boroughs borrow borrowed borrower borrowers borrowing borrows borscht bosom bosom's bosoms bosporus boss boss' bossed bosses bosses' boston bostonian bostonian's bostonians bosun botanical botanist botanist's botanists botany botch botched botcher botchers botches botching both bother bothered bothering bothers bothersome botswana bottle bottled bottleneck bottleneck's bottlenecks bottler bottlers bottles bottling bottom bottomed bottoming bottomless bottoms botulinus botulism bouffant bough bough's boughs bought boulder boulder's boulders boulevard boulevard's boulevards bounce bounced bouncer bounces bouncing bouncy bound boundaries boundary boundary's bounded bounden bounding boundless boundlessness bounds bounteous bounteously bounties bounty bounty's bouquet bouquet's bouquets bourbon bourgeois bourgeoisie boustrophedon boustrophedonic bout bout's boutique bouts bovine bovines bow bowdlerize bowdlerized bowdlerizes bowdlerizing bowed bowel bowel's bowels bower bowers bowing bowl bowled bowler bowlers bowline bowline's bowlines bowling bowls bowman bows bowstring bowstring's bowstrings box boxcar boxcar's boxcars boxed boxer boxers boxes boxing boxtop boxtop's boxtops boxwood boy boy's boycott boycotted boycotts boyfriend boyfriend's boyfriends boyhood boyish boyishness boys bra bra's brace braced bracelet bracelet's bracelets braces bracing bracket bracketed bracketing brackets brackish brae brae's braes brag bragged bragger bragging brags braid braided braiding braids braille brain brainchild brainchild's brained braining brains brainstem brainstem's brainstems brainstorm brainstorm's brainstorms brainwash brainwashed brainwashes brainwashing brainy braised brake braked brakeman brakes braking bramble bramble's brambles brambly bran branch branched branches branching branchings brand branded branding brandish brandishes brandishing brands brandy brandywine bras brash brashly brashness brass brasses brassiere brassy brat brat's brats bravado brave braved bravely braveness braver bravery braves bravest braving bravo bravos bravura brawl brawler brawling brawn bray brayed brayer braying brays braze brazed brazen brazenly brazenness brazes brazier brazier's braziers brazil brazilian brazing breach breached breacher breachers breaches breaching bread breadboard breadboard's breadboards breadbox breadbox's breadboxes breaded breading breads breadth breadwinner breadwinner's breadwinners break breakable breakables breakage breakaway breakdown breakdown's breakdowns breaker breakers breakfast breakfasted breakfaster breakfasters breakfasting breakfasts breaking breakpoint breakpoint's breakpoints breaks breakthrough breakthrough's breakthroughes breakthroughs breakup breakwater breakwater's breakwaters breast breasted breasts breastwork breastwork's breastworks breath breathable breathe breathed breather breathers breathes breathing breathless breathlessly breaths breathtaking breathtakingly breathy bred breech breech's breeches breed breeder breeding breeds breeze breeze's breezed breezes breezily breezing breezy bremsstrahlung brethren breve brevet breveted breveting brevets brevity brew brewed brewer breweries brewers brewery brewery's brewing brews briar briar's briars bribe bribed briber bribers bribery bribes bribing brick brickbat bricked bricker bricklayer bricklayer's bricklayers bricklaying bricks bridal bride bride's bridegroom brides bridesmaid bridesmaid's bridesmaids bridge bridge's bridgeable bridged bridgehead bridgehead's bridgeheads bridges bridgework bridgework's bridging bridle bridled bridles bridling brief briefcase briefcase's briefcases briefed briefer briefest briefing briefing's briefings briefly briefness briefs brier brig brig's brigade brigade's brigades brigadier brigadier's brigadiers brigantine bright brighten brightened brightener brighteners brightening brightens brighter brightest brightly brightness brigs brilliance brilliancy brilliant brilliantly brim brimful brimmed brimming brimstone brindle brindled brine bring bringer bringers bringing brings brink brinkmanship briny brisk brisker briskly briskness bristle bristled bristles bristling britain britches british britisher briton briton's britons brittle brittleness broach broached broaches broaching broad broadband broadcast broadcasted broadcaster broadcasters broadcasting broadcastings broadcasts broaden broadened broadener broadeners broadening broadenings broadens broader broadest broadly broadness broadside brocade brocaded broccoli brochure brochure's brochures broil broiled broiler broilers broiling broils broke broken brokenly brokenness broker brokerage brokers bromide bromide's bromides bromine bronchi bronchial bronchiole bronchiole's bronchioles bronchitis bronchus bronco bronze bronzed bronzes brooch brooch's brooches brood brooder brooding broods brook brooked brooks broom broom's brooms broomstick broomstick's broomsticks broth brothel brothel's brothels brother brother's brotherhood brotherliness brotherly brothers brought brow brow's browbeat browbeaten browbeating browbeats brown browned browner brownest brownie brownie's brownies browning brownish brownness browns brows browse browser browsers browsing bruise bruised bruises bruising brunch brunches brunette brunt brush brushed brushes brushfire brushfire's brushfires brushing brushlike brushy brusque brusquely brussels brutal brutalities brutality brutalize brutalized brutalizes brutalizing brutally brute brute's brutes brutish bubble bubbled bubbles bubbling bubbly bubonic bucharest buck buckboard buckboard's buckboards bucked bucket bucket's bucketfull buckets bucking buckle buckled buckler buckles buckling bucks buckshot buckskin buckskins buckwheat bucolic bud bud's budapest budded buddha buddha's buddhism buddhist buddies budding buddy buddy's budge budged budges budget budgetary budgeted budgeter budgeters budgeting budgets budging buds buenos buff buff's buffalo buffaloes buffer buffer's buffered buffering bufferrer bufferrer's bufferrers buffers buffet buffeted buffeting buffetings buffets buffoon buffoon's buffoons buffs bug bug's bugaboo bugeyed bugged bugger bugger's buggers buggies bugging buggy buggy's bugle bugled bugler bugles bugling bugs build builder builders building building's buildings builds buildup buildup's buildups built builtin bulb bulb's bulbs bulgaria bulgarian bulge bulged bulging bulk bulked bulkhead bulkhead's bulkheads bulkier bulks bulky bull bulldog bulldog's bulldogs bulldoze bulldozed bulldozer bulldozes bulldozing bulled bullet bullet's bulleted bulletin bulletin's bulletins bullets bullfrog bullied bullies bulling bullion bullish bullock bulls bullseye bully bullying bulwark bum bum's bumble bumblebee bumblebee's bumblebees bumbled bumbler bumblers bumbles bumbling bummed bumming bump bumped bumper bumpers bumping bumps bumptious bumptiously bumptiousness bums bun bun's bunch bunched bunches bunching bundle bundled bundles bundling bungalow bungalow's bungalows bungle bungled bungler bunglers bungles bungling bunion bunion's bunions bunk bunker bunker's bunkered bunkers bunkhouse bunkhouse's bunkhouses bunkmate bunkmate's bunkmates bunks bunnies bunny bunny's buns bunt bunted bunter bunters bunting bunts buoy buoyancy buoyant buoyed buoys burden burdened burdening burdens burdensome bureau bureau's bureaucracies bureaucracy bureaucracy's bureaucrat bureaucrat's bureaucratic bureaucrats bureaus burgeon burgeoned burgeoning burger burgers burgess burgess's burgesses burgher burgher's burghers burglar burglar's burglaries burglarize burglarized burglarizes burglarizing burglarproof burglarproofed burglarproofing burglarproofs burglars burglary burglary's burial buried buries burl burlesque burlesques burly burn burned burner burners burning burningly burnings burnish burnished burnishes burnishing burns burnt burntly burntness burp burped burping burps burr burr's burro burro's burros burrow burrowed burrower burrowing burrows burrs bursa bursitis burst burstiness bursting bursts bursty bury burying bus busboy busboy's busboys bused buses bush bushbaby bushback bushbacks bushel bushel's bushels bushes bushing bushwhack bushwhacked bushwhacking bushwhacks bushy busied busier busiest busily business business's businesses businesslike businessman businessmen busing busload buss bussed busses bussing bust bustard bustard's bustards busted buster busting bustle bustling busts busy busybodies but butane butcher butchered butchers butchery butler butler's butlers butt butt's butte butted butter butterball buttercup buttered butterer butterers butterfat butterflies butterfly butterfly's buttering buttermilk butternut butters buttery buttes butting buttock buttock's buttocks button buttoned buttonhole buttonhole's buttonholes buttoning buttons buttress buttressed buttresses buttressing butts butyl butyrate buxom buy buyer buyer's buyers buying buys buzz buzzard buzzard's buzzards buzzed buzzer buzzes buzzing buzzword buzzword's buzzwords buzzy by bye bygone bylaw bylaw's bylaws byline byline's bylines bypass bypassed bypasses bypassing byproduct byproduct's byproducts bystander bystander's bystanders byte byte's bytes byway byways byword byword's bywords byzantine c c's cab cab's cabal cabana cabaret cabbage cabbage's cabbages cabdriver cabin cabin's cabinet cabinet's cabinets cabins cable cable's cabled cables cabling cabs cache cache's cached caches caching cackle cackled cackler cackles cackling cacti cactus cadaver cadence cadenced cadets cadillac cadillac's cadillacs cadre caesar cafe cafe's cafes cafeteria cafeterias cage caged cager cagers cages caging caiman cairn cairo cajole cajoled cajoles cajoling cake caked cakes caking calamities calamitous calamity calamity's calcify calcium calculable calculate calculated calculates calculating calculation calculations calculative calculator calculator's calculators calculi calculus calcutta caldera calendar calendar's calendars calf calfskin caliber calibers calibrate calibrated calibrates calibrating calibration calibrations calibre calibres calico california california's caliph caliphs calisthenics call calla callable called caller caller's callers calling calliope callous calloused callously callousness calls callus calm calmed calmer calmest calming calmingly calmly calmness calms caloric calorie calorie's calories calorimeter calorimetric calorimetry calve calves calypso cam cambridge came camel camel's camels camera camera's cameraman cameramen cameras camouflage camouflaged camouflages camouflaging camp campaign campaigned campaigner campaigners campaigning campaigns camped camper campers campfire campground camping camps campsite campus campus's campuses can can's can't canada canadian canal canal's canals canaries canary canary's cancel canceled cancelers canceling cancellation cancellation's cancellations cancels cancer cancer's cancerous cancers candid candidacy candidate candidate's candidates candidly candidness candied candies candle candlelight candler candles candlestick candlestick's candlesticks candor candy cane caner canine canister canker cankerworm cannabis canned cannel canner canner's canners cannery cannibal cannibal's cannibalize cannibalized cannibalizes cannibalizing cannibals canning cannister cannister's cannisters cannon cannon's cannonball cannons cannot canny canoe canoe's canoes canon canon's canonic canonical canonicalization canonicalize canonicalized canonicalizes canonicalizing canonically canonicals canons canopy cans cant cantaloupe cantankerous cantankerously canteen cantilever canto canton canton's cantons cantor cantor's cantors canvas canvas's canvases canvass canvassed canvasser canvassers canvasses canvassing canyon canyon's canyons cap cap's capabilities capability capability's capable capably capacious capaciously capaciousness capacitance capacitances capacities capacitive capacitor capacitor's capacitors capacity cape caper capers capes capillary capita capital capitalism capitalist capitalist's capitalists capitalization capitalizations capitalize capitalized capitalizer capitalizers capitalizes capitalizing capitally capitals capitol capitol's capitols capped capping capricious capriciously capriciousness caps capstan capstone capsule capsules captain captained captaining captains caption caption's captions captivate captivated captivates captivating captivation captive captive's captives captivity captor captor's captors capture captured capturer capturers captures capturing capybara car car's caramel caravan caravan's caravans caraway carbohydrate carbolic carbon carbon's carbonate carbonates carbonation carbonic carbonization carbonize carbonized carbonizer carbonizers carbonizes carbonizing carbons carborundum carbuncle carcass carcass's carcasses carcinogen carcinogenic carcinoma card card's cardboard carder cardiac cardinal cardinalities cardinality cardinality's cardinally cardinals cardiologists cardiology cardiovascular cards care cared careen career career's careers carefree careful carefully carefulness careless carelessly carelessness cares caress caressed caresser caresses caressing caret caretaker cargo cargoes caribou caricature caring carload carnage carnal carnation carnegie carnival carnival's carnivals carnivorous carnivorously carol carol's carolina carolina's carolinas carols carp carpenter carpenter's carpenters carpentry carpet carpeted carpeting carpets carport carriage carriage's carriages carried carrier carrier's carriers carriers' carries carrion carrot carrot's carrots carry carrying carryover carryovers cars cart carted cartel cartels carter carters cartesian carthaginians cartilage carting cartographer cartographic cartography carton carton's cartons cartoon cartoon's cartoons cartridge cartridge's cartridges carts cartwheel carve carved carver carves carving carvings cascadable cascade cascaded cascades cascading case cased casement casement's casements cases casework cash cashed casher cashers cashes cashew cashier cashier's cashiers cashing cashless cashmere casing casings casino cask cask's casket casket's caskets casks casserole casserole's casseroles cassette cassettes cassock cast cast's caste caster casters castes castigate castillian casting castings castle castled castles castling castor castrated casts casual casually casualness casuals casualties casualty casualty's cat cat's cataclysmic catalog cataloged cataloger cataloging catalogs catalogue catalogued catalogues catalyst catalyst's catalysts catalytic catalyzed catapult cataract catastrophe catastrophes catastrophic catastrophically catch catchable catchall catcher catchers catches catching catchword catchwords categorical categorically categories categorization categorize categorized categorizer categorizers categorizes categorizing category category's cater catered caterer catering caterpillar caterpillar's caterpillars caters cathedral cathedral's cathedrals catheter catheters cathode cathode's cathodes catholic catholic's catholicism catholics cation cations catlike catnip cats catsup cattail cattle cattleman cattlemen caucus caught cauldron cauldrons cauliflower caulk causal causality causally causation causation's causations cause caused causer causes causeway causeway's causeways causing caustic causticly caustics caution cautioned cautioner cautioners cautioning cautionings cautions cautious cautiously cautiousness cavalier cavalierly cavalierness cavalry cave caveat caveat's caveats caved caveman cavemen cavern cavern's cavernous caverns caves caviar caving cavities cavity cavity's caw cawing ccitt ccitt's cdr cease ceased ceaseless ceaselessly ceaselessness ceases ceasing cedar ceiling ceiling's ceilings celebrate celebrated celebrates celebrating celebration celebrations celebrities celebrity celebrity's celerity celery celestial celestially cell cell's cellar cellar's cellars celled cellist cellist's cellists cellophane cells cellular cellulose cement cemented cementing cements cemeteries cemetery cemetery's censor censored censoring censors censorship censure censured censurer censures census census's censuses cent centaur centenary centennial center centered centering centerpiece centerpiece's centerpieces centers centigrade centimeter centimeters centipede centipede's centipedes central centrality centralization centralize centralized centralizes centralizing centrally centrifugal centrifuge centripetal centrist centroid cents centuries century century's ceramic cereal cereal's cereals cerebellum cerebral ceremonial ceremonially ceremonialness ceremonies ceremoniously ceremony ceremony's certain certainly certainties certainty certifiable certificate certificates certification certifications certified certifier certifiers certifies certify certifying cesium cessation cessation's cessations cetera chafe chafer chaff chaffer chaffing chafing chagrin chain chained chaining chains chair chaired chairing chairlady chairlift chairman chairmanship chairmen chairperson chairperson's chairpersons chairs chairwoman chairwomen chalet chalice chalice's chalices chalk chalked chalking chalks challenge challenged challenger challengers challenges challenging chamber chambered chamberlain chamberlain's chamberlains chambermaid chambermaids chambers chameleon champagne champaign champion championed championing champions championship championship's championships champs chance chanced chancellor chancellors chancery chances chancing chandelier chandelier's chandeliers change changeability changeable changeably changed changeover changer changers changes changing channel channeled channeling channelled channeller channeller's channellers channelling channels chant chanted chanter chanticleer chanticleer's chanticleers chanting chants chaos chaotic chap chap's chapel chapel's chapels chaperon chaperone chaperoned chaplain chaplain's chaplains chaps chapter chapter's chapters char character character's characteristic characteristic's characteristically characteristics characterizable characterization characterization's characterizations characterize characterized characterizer characterizers characterizes characterizing characters charcoal charcoaled charge chargeable charged charger chargers charges charging chariot chariot's chariots charisma charismatic charitable charitableness charities charity charity's charleston charm charmed charmer charmers charming charmingly charms chars chart chartable charted charter chartered chartering charters charting chartings chartreuse charts chase chased chaser chasers chases chasing chasm chasm's chasms chassis chaste chastely chasteness chastise chastised chastiser chastisers chastises chastising chastity chat chateau chateau's chateaus chattel chatter chattered chatterer chattering chatters chatting chatty chaucer chauffered chauffeur chauffeured chauffeurs cheap cheapen cheapened cheapening cheapens cheaper cheapest cheaply cheapness cheat cheated cheater cheaters cheating cheats check checkable checkbit checkbits checkbook checkbook's checkbooks checked checker checkerboard checkerboarded checkerboarding checkers checking checklist checkout checkpoint checkpoint's checkpointed checkpointing checkpoints checks checksum checksum's checksummed checksumming checksums checkup cheek cheek's cheekbone cheeks cheeky cheer cheered cheerer cheerful cheerfully cheerfulness cheerily cheeriness cheering cheerleader cheerless cheerlessly cheerlessness cheers cheery cheese cheese's cheesecloth cheeses cheesy cheetah cheetahs chef chef's chefs chemical chemically chemicals chemise chemist chemist's chemistries chemistry chemists cherish cherished cherishes cherishing cherries cherry cherry's cherub cherub's cherubim cherubs chess chest chester chestnut chestnut's chestnuts chests chew chewed chewer chewers chewing chews chic chicago chicanery chick chickadee chickadee's chickadees chicken chickens chicks chicory chide chided chides chiding chief chief's chiefly chiefs chieftain chieftain's chieftains chiffon child child's childbirth childhood childish childishly childishness childlike children children's childrens' chile chili chill chilled chiller chillers chillier chilliness chilling chillingly chills chilly chime chime's chimera chimes chimney chimney's chimneys chimpanzee chin chin's china chinatown chinese chink chinked chinks chinned chinner chinners chinning chins chintz chip chip's chipmunk chipmunk's chipmunks chips chiropractor chirp chirped chirping chirps chisel chiseled chiseler chisels chit chivalrous chivalrously chivalrousness chivalry chlorine chloroform chlorophyll chloroplast chloroplast's chloroplasts chock chock's chocks chocolate chocolate's chocolates choice choices choicest choir choir's choirs choke choked choker chokers chokes choking cholera cholesterol choose chooser choosers chooses choosing chop chopped chopper chopper's choppers chopping choppy chops chopsticks choral chorales chord chord's chordate chorded chording chords chore choreograph choreography chores choring chortle chorus chorus' chorused choruses chose chosen chow chowder christen christened christening christens christian christian's christianity christians christmas chromatic chromatogram chromatograph chromatography chrome chrominance chrominances chromium chromosphere chronic chronically chronicle chronicled chronicler chroniclers chronicles chronograph chronography chronological chronologically chronologies chronology chronology's chrysanthemum chubbier chubbiest chubbiness chubby chuck chuck's chuckle chuckled chuckles chucks chum chunk chunk's chunks chunky chunnel church churches churchgoer churchgoing churchly churchman churchmen churchwoman churchwomen churchyard churchyard's churchyards churn churned churning churns chute chute's chutes chutney cicada cider cigar cigar's cigarette cigarette's cigarettes cigars cilia cincinatti cinder cinder's cinderella cinders cinema cinematic cinnamon cipher cipher's ciphers ciphertext ciphertexts circa circle circled circles circlet circling circuit circuit's circuitous circuitously circuitry circuits circulant circular circularities circularity circularly circulate circulated circulates circulating circulation circumcise circumcision circumference circumflex circumlocution circumlocution's circumlocutions circumnavigate circumnavigated circumnavigates circumnavigation circumpolar circumscribe circumscription circumspect circumspectly circumstance circumstance's circumstances circumstantial circumstantially circumvent circumventable circumvented circumventing circumvents circus circus's circuses cistern cistern's cisterns citadel citadel's citadels citation citation's citations cite cited cites cities citing citizen citizen's citizens citizenship citron citrus city city's cityscape citywide civet civic civics civil civilian civilian's civilians civility civilization civilization's civilizations civilize civilized civilizes civilizing civilly clad cladding claim claimable claimant claimant's claimants claimed claiming claims clairvoyant clairvoyantly clam clam's clamber clambered clambering clambers clamor clamored clamoring clamorous clamors clamp clamped clamping clamps clams clan clandestine clang clanged clanging clangs clank clannish clap clapboard clapped clapping claps clarification clarifications clarified clarifies clarify clarifying clarinet clarity clash clashed clashes clashing clasp clasped clasping clasps class class' classed classes classic classical classically classics classier classifiable classification classifications classified classifier classifiers classifies classify classifying classless classmate classmate's classmates classroom classroom's classrooms classy clatter clattered clattering clause clause's clauses claustrophobia claustrophobic claw clawed clawing claws clay clay's clays clean cleaned cleaner cleaner's cleaners cleanest cleaning cleanliness cleanly cleanness cleans cleanse cleansed cleanser cleansers cleanses cleansing cleanup clear clearance clearance's clearances cleared clearer clearest clearing clearing's clearinghouse clearinghouses clearings clearly clearness clears cleavage cleave cleaved cleaver cleavers cleaves cleaving cleft cleft's clefts clement clench clenched clenches clergy clergyman clergymen clerical clerk clerked clerking clerks cleveland clever cleverer cleverest cleverly cleverness cliche cliche's cliches click clickable clicked clicking clicks client client's clientele clients clients' cliff cliff's cliffs climactic climate climate's climates climatic climatically climatology climax climaxed climaxes climb climbed climber climbers climbing climbs clime clime's climes clinch clinched clincher clinches cling clinging clings clinic clinic's clinical clinically clinician clinicians clinics clink clinked clinker clip clip's clipboard clipped clipper clipper's clippers clipping clipping's clippings clips clique clique's cliques cloak cloak's cloaked cloaking cloakroom cloaks clobber clobbered clobbering clobbers clock clocked clocker clockers clocking clockings clocks clockwatcher clockwise clockwork clod clod's clods clog clog's clogged clogging clogs cloister cloister's cloisters clone clone's cloned clones cloning close closed closely closeness closenesses closer closers closes closest closet closeted closets closeup closing closure closure's closures clot cloth clothe clothed clothes clotheshorse clothesline clothing clotting cloture cloud cloudberries cloudburst clouded cloudier cloudiest cloudiness clouding cloudless clouds cloudy clout clove clover cloves clown clowning clowns club club's clubbed clubbing clubhouse clubroom clubs cluck clucked clucking clucks clue clue's clues clump clumped clumping clumps clumsier clumsiest clumsily clumsiness clumsy clung cluster cluster's clustered clustering clusterings clusters clutch clutched clutches clutching clutter cluttered cluttering clutters cm coach coached coacher coaches coaching coachman coachmen coagulate coal coalesce coalesced coalesces coalescing coalition coals coarse coarsely coarsen coarsened coarseness coarser coarsest coast coastal coasted coaster coasters coasting coastline coasts coat coated coating coatings coats coattail coauthor coax coaxed coaxer coaxes coaxial coaxing cobalt cobble cobbled cobbler cobbler's cobblers cobblestone cobol cobra cobweb cobweb's cobwebs coca cocaine cock cocked cocking cockpit cockroach cockroaches cocks cocktail cocktail's cocktails cocky coco cocoa coconut coconut's coconuts cocoon cocoon's cocoons cod coddle code codebreaker coded coder coders codes codeword codeword's codewords codfish codicil codification codification's codifications codified codifier codifier's codifiers codifies codify codifying coding codings codpiece coed coeditor coeducation coefficient coefficient's coefficients coequal coerce coerced coerces coercibility coercible coercing coercion coercions coercive coexist coexisted coexistence coexisting coexists cofactor coffee coffee's coffeecup coffeepot coffees coffer coffer's coffers coffin coffin's coffins cog cogent cogently cogitate cogitated cogitates cogitating cogitation cognate cognition cognitive cognitively cognitives cognizance cognizant cogs cohabitate cohabitation cohabitations cohere cohered coherence coherency coherent coherently coheres cohering cohesion cohesive cohesively cohesiveness cohort coil coiled coiling coils coin coinage coincide coincided coincidence coincidence's coincidences coincident coincidental coincides coinciding coined coiner coining coins coke cokes colander cold colder coldest coldly coldness colds colicky coliform coliseum collaborate collaborated collaborates collaborating collaboration collaborations collaborative collaborator collaborator's collaborators collagen collapse collapsed collapses collapsible collapsing collar collarbone collared collaring collars collate collated collateral collaterally collates collating collation colleague colleague's colleagues collect collected collectible collecting collection collection's collections collective collectively collectives collector collector's collectors collects college college's colleges collegian collegiate collide collided collides colliding collie collier collies collision collision's collisionless collisions collocation colloidal colloquia colloquial colloquialism colloquially colloquium colloquy collusion colocated cologne colon colon's colonel colonel's colonels colonial colonially colonials colonies colonist colonist's colonists colonization colonize colonized colonizer colonizers colonizes colonizing colons colony colony's color colorado coloration colored colorer colorers colorful coloring colorings colorless colors colossal colossus colt colt's colts columbia columbus column column's columnar columnate columnated columnates columnating columnation columnize columnized columnizes columnizing columns comb combat combatant combatant's combatants combated combating combative combats combed comber combers combination combination's combinational combinations combinator combinator's combinatorial combinatorially combinatoric combinatorics combinators combine combined combines combing combings combining combs combustion come comeback comedian comedian's comedians comedic comedies comedy comedy's comeliness comely comer comers comes comestible comet comet's cometary comets comfort comfortabilities comfortability comfortable comfortably comforted comforter comforters comforting comfortingly comforts comic comic's comical comically comics coming comings comma comma's command command's commandant commandant's commandants commanded commandeer commander commanders commanding commandingly commandment commandment's commandments commando commands commas commemorate commemorated commemorates commemorating commemoration commemorative commence commenced commencement commencement's commencements commences commencing commend commendation commendation's commendations commended commending commends commensurate comment commentaries commentary commentary's commentator commentator's commentators commented commenting comments commerce commercial commercialization commercialize commercially commercialness commercials commission commissioned commissioner commissioners commissioning commissions commit commitment commitment's commitments commits committed committee committee's committeeman committeemen committees committees' committeewoman committeewomen committing commodities commodity commodity's commodore commodore's commodores common commonalities commonality commoner commoner's commoners commonest commonly commonness commonplace commonplaces commons commonwealth commonwealths commotion communal communally commune communes communicant communicant's communicants communicate communicated communicates communicating communication communications communicative communicator communicator's communicators communion communist communist's communists communities community community's commutation commutative commutatively commutativity commute commuted commuter commuters commutes commuting compact compacted compacter compactest compacting compaction compactly compactness compactor compactor's compactors compacts companies companion companion's companionable companions companionship company company's comparability comparable comparably comparative comparatively comparatives comparator comparator's comparators compare compared compares comparing comparison comparison's comparisons compartment compartmental compartmentalize compartmentalized compartmentalizes compartmentalizing compartmented compartments compass compasses compassion compassionate compassionately compatibilities compatibility compatibility's compatible compatibles compatibly compel compelled compelling compellingly compels compendium compensate compensated compensates compensating compensation compensations compensatory compete competed competence competencies competency competent competently competes competing competition competition's competitions competitive competitively competitor competitor's competitors compilation compilation's compilations compile compiled compiler compiler's compilers compiles compiling complacency complain complained complainer complainers complaining complains complaint complaint's complaints complement complementary complementation complemented complementer complementers complementing complements complete completed completely completeness completes completing completion completions complex complexes complexion complexities complexity complexly compliance compliant complicate complicated complicates complicating complication complications complicator complicator's complicators complicity complied complies compliment complimentary complimented complimenter complimenters complimenting compliments comply complying component component's componentry components componentwise compose composed composedly composer composers composes composing composite composites composition compositional compositions compost composure compound compounded compounding compounds comprehend comprehended comprehending comprehends comprehensibility comprehensible comprehension comprehensive comprehensively compress compressed compresses compressible compressing compression compressive compressor comprise comprised comprises comprising compromise compromised compromiser compromisers compromises compromising compromisingly comptroller comptroller's comptrollers compulsion compulsion's compulsions compulsive compulsory compunction computability computable computation computation's computational computationally computations compute computed computer computer's computerization computerize computerized computerizes computerizing computers computers' computes computing comrade comradely comrades comradeship con concatenate concatenated concatenates concatenating concatenation concatenations concave conceal concealed concealer concealers concealing concealment conceals concede conceded concedes conceding conceit conceited conceits conceivability conceivable conceivably conceive conceived conceives conceiving concentrate concentrated concentrates concentrating concentration concentrations concentrator concentrator's concentrators concentric concept concept's conception conception's conceptions concepts conceptual conceptualization conceptualization's conceptualizations conceptualize conceptualized conceptualizes conceptualizing conceptually concern concerned concernedly concerning concerns concert concerted concertmaster concerto concerts concession concession's concessions conciliatory concise concisely conciseness conclave conclude concluded concludes concluding conclusion conclusion's conclusions conclusive conclusively concoct concocted concomitant concord concordant concourse concrete concretely concreteness concretes concretion concretization concretizations concretize concretized concretizes concretizing concubine concur concurred concurrence concurrencies concurrency concurrent concurrently concurring concurs concussion condemn condemnation condemnations condemned condemner condemners condemning condemns condensation condensations condense condensed condenser condenses condensing condescend condescending condition conditional conditionally conditionals conditioned conditioner conditioners conditioning conditions condone condoned condones condoning conducive conduct conductance conducted conducting conduction conductive conductivity conductor conductor's conductors conducts conduit cone cone's cones confectionery confederacy confederate confederates confederation confederations confer conferee conference conference's conferences conferencing conferred conferrer conferrer's conferrers conferring confers confess confessed confesses confessing confession confession's confessions confessor confessor's confessors confidant confidant's confidants confide confided confidence confidences confident confidential confidentiality confidentially confidently confides confiding confidingly configurability configurable configuration configuration's configurational configurations configure configured configures configuring confine confined confinement confinement's confinements confiner confines confining confirm confirmation confirmation's confirmations confirmatory confirmed confirming confirms confiscate confiscated confiscates confiscating confiscation confiscations conflict conflicted conflicting conflicts confluent confocal conform conformable conformal conformance conformant conformed conforming conformity conforms confound confounded confounding confounds confront confrontation confrontation's confrontations confronted confronter confronters confronting confronts confuse confused confuser confusers confuses confusing confusingly confusion confusions congenial congenially congenital congest congested congestion congestive conglomerate congratulate congratulated congratulation congratulations congratulatory congregate congregated congregates congregating congregation congregations congress congress's congresses congressional congressionally congressman congressmen congresswoman congresswomen congruence congruent conic conical conically conifer coniferous conjecture conjectured conjectures conjecturing conjoined conjugal conjugate conjunct conjuncted conjunction conjunction's conjunctions conjunctive conjunctively conjuncts conjure conjured conjurer conjures conjuring connect connected connectedness connecticut connecting connection connection's connectionless connections connective connective's connectives connectivity connector connector's connectors connects conniption connivance connive conniving connoisseur connoisseur's connoisseurs connotation connotative connote connoted connotes connoting connubial conquer conquerable conquered conquerer conquerers conquering conqueror conqueror's conquerors conquers conquest conquest's conquests cons conscience conscience's consciences conscientious conscientiously conscionable conscionably conscious consciously consciousness conscript conscription consecrate consecration consecutive consecutively consensus consent consented consenter consenters consenting consents consequence consequence's consequences consequent consequential consequentialities consequentiality consequently consequents conservation conservation's conservationist conservationist's conservationists conservations conservatism conservative conservatively conservatives conserve conserved conserves conserving consider considerable considerably considerate considerately consideration considerations considered considering considers consign consigned consigning consigns consist consisted consistency consistent consistently consisting consists consolable consolation consolation's consolations console consoled consoler consolers consoles consolidate consolidated consolidates consolidating consolidation consoling consolingly consonant consonant's consonants consort consorted consorting consortium consortium's consorts conspicuous conspicuously conspiracies conspiracy conspiracy's conspirator conspirator's conspirators conspire conspired conspires conspiring constable constable's constables constancy constant constantly constants constellation constellation's constellations consternation constituencies constituency constituency's constituent constituent's constituents constitute constituted constitutes constituting constitution constitutional constitutionality constitutionally constitutions constitutive constrain constrained constraining constrains constraint constraint's constraints constrict constriction construct constructed constructibility constructible constructing construction construction's constructions constructive constructively constructor constructor's constructors constructs construe construed construing consul consul's consular consulate consulate's consulates consuls consult consultancy consultant consultant's consultants consultation consultation's consultations consultative consulted consulting consults consumable consumables consume consumed consumer consumer's consumers consumes consuming consummate consummated consummately consummation consumption consumption's consumptions consumptive consumptively contact contacted contacting contacts contagion contagious contagiously contain containable contained container containers containing containment containment's containments contains contaminate contaminated contaminates contaminating contamination contemplate contemplated contemplates contemplating contemplation contemplations contemplative contemporaries contemporariness contemporary contempt contemptible contemptuous contemptuously contend contended contender contenders contending contends content contented contenting contention contention's contentions contentious contently contentment contents contest contestable contestant contestants contested contester contesters contesting contests context context's contexts contextual contextually contiguity contiguous contiguously contiguousness continent continent's continental continentally continents contingencies contingency contingency's contingent contingent's contingents continual continually continuance continuance's continuances continuation continuation's continuations continue continued continues continuing continuities continuity continuous continuously continuum contort contorted contorting contortion contortions contorts contour contour's contoured contouring contours contraband contraception contraceptive contract contracted contracting contraction contraction's contractions contractor contractor's contractors contracts contractual contractually contradict contradicted contradicting contradiction contradiction's contradictions contradictorily contradictory contradicts contradistinction contradistinctions contrapositive contrapositives contraption contraption's contraptions contrariness contrary contrast contrasted contraster contrasters contrasting contrastingly contrasts contravened contravenes contribute contributed contributers contributes contributing contribution contributions contributor contributor's contributorily contributors contributory contrite contrition contrivance contrivance's contrivances contrive contrived contriver contrives contriving control control's controllability controllable controllably controlled controller controller's controllers controllers' controlling controls controversial controversies controversy controversy's controvertible conundrum conundrum's conundrums convalescent convect convection convene convened convenes convenience convenience's conveniences convenient conveniently convening convent convent's convention convention's conventional conventionally conventions convents converge converged convergence convergent converges converging conversant conversantly conversation conversation's conversational conversationally conversations converse conversed conversely converses conversing conversion conversions convert converted converter converters convertibility convertible converting converts convex convey conveyance conveyance's conveyances conveyed conveyer conveyers conveying conveyor conveys convict convicted convicting conviction conviction's convictions convicts convince convinced convincer convincers convinces convincing convincingly convivial convoke convoluted convolution convoy convoyed convoying convoys convulse convulsion convulsion's convulsions coo cooing cook cookbook cooked cooker cookery cookie cookie's cookies cooking cooks cooky cool coolant cooled cooler cooler's coolers coolest coolie coolie's coolies cooling coolly coolness cools coon coon's coons coop cooped cooper cooperate cooperated cooperates cooperating cooperation cooperations cooperative cooperatively cooperatives cooperator cooperator's cooperators coopers coops coordinate coordinated coordinates coordinating coordination coordinations coordinator coordinator's coordinators cop cop's cope coped copenhagen copes copied copier copiers copies coping copings copious copiously copiousness coplanar copper copper's copperhead coppers copra coprocessor coprocessors cops copse copy copyeditors copying copyright copyright's copyrightable copyrighted copyrights copywriter coquette coral cord corded corder cordial cordially cordless cords core cored corer corers cores coriander coring cork corked corker corkers corking corks corkscrew cormorant corn cornea cornell corner cornered corners cornerstone cornerstone's cornerstones cornet cornfield cornfield's cornfields corning cornmeal corns cornstarch cornucopia corny corollaries corollary corollary's coronaries coronary coronation coroner coronet coronet's coronets coroutine coroutine's coroutines corporal corporal's corporals corporate corporately corporation corporation's corporations corps corpse corpse's corpses corpulent corpus corpuscular corral correct correctable corrected correcting correction corrections corrective correctively correctives correctly correctness corrector corrects correlate correlated correlates correlating correlation correlational correlations correlative correlator correspond corresponded correspondence correspondence's correspondences correspondent correspondent's correspondents corresponding correspondingly corresponds corridor corridor's corridors corrigenda corrigendum corrigible corroborate corroborated corroborates corroborating corroboration corroborations corroborative corrode corrosion corrosive corrugate corrupt corrupted corrupter corruptible corrupting corruption corruptions corrupts corset cortex cortical coset cosh cosine cosines cosmetic cosmetics cosmic cosmology cosmopolitan cosmos cosponsor cost costa costed costing costly costs costume costumed costumer costumes costuming cosy cot cot's cotangent cotillion cots cottage cottager cottages cotton cottonmouth cottons cottonseed cottonwood cotyledon cotyledon's cotyledons couch couched couches couching cougar cough coughed coughing coughs could couldn't coulomb council council's councillor councillor's councillors councilman councilmen councils councilwoman councilwomen counsel counseled counseling counselled counselling counsellor counsellor's counsellors counselor counselor's counselors counsels count countable countably countdown counted countenance counter counteract counteracted counteracting counteractive counteracts counterargument counterattack counterbalance counterclockwise countered counterexample counterexamples counterfeit counterfeited counterfeiter counterfeiting counterflow countering counterintuitive counterman countermeasure countermeasure's countermeasures countermen counteroffer counterpart counterpart's counterparts counterpoint counterpointing counterpoise counterproductive counterproposal counterrevolution counterrotating counters countersink countersunk countess counties counting countless countries country country's countryman countrymen countryside countrywide counts county county's countywide couple coupled coupler couplers couples coupling couplings coupon coupon's coupons coups courage courageous courageously courier courier's couriers course coursed courser courses coursing court courted courteous courteously courteousness courter courters courtesan courtesies courtesy courtesy's courthouse courthouse's courthouses courtier courtier's courtiers courting courtly courtroom courtroom's courtrooms courts courtship courtyard courtyard's courtyards cousin cousin's cousins covalent covariant cove covenant covenant's covenants cover coverable coverage covered covering coverings coverlet coverlet's coverlets covers covert covertly coves covet coveted coveting covetous covetousness covets cow coward cowardice cowardly cowboy cowboy's cowboys cowcatcher cowed cower cowered cowerer cowerers cowering coweringly cowers cowherd cowhide cowing cowl cowlick cowling cowls coworker coworkers cows cowslip cowslip's cowslips coy coyote coyote's coyotes coypu cozier coziness cozy cpu cpus crab crab's crabapple crabs crack cracked cracker crackers cracking crackle crackled crackles crackling crackpot cracks cradle cradled cradles craft crafted crafter craftily craftiness crafting crafts craftsman craftsmen craftspeople craftsperson crafty crag crag's craggy crags cram crammed cramming cramp cramp's cramped cramps crams cranberries cranberry cranberry's crane crane's cranes crania cranium crank crankcase cranked crankier crankiest crankily cranking cranks crankshaft cranky cranny crash crashed crasher crashers crashes crashing crashproof crass crate crater craters crates cravat cravat's cravats crave craved craven craves craving crawl crawled crawler crawlers crawling crawls cray crayon craze crazed crazes crazier craziest crazily craziness crazing crazy crc creak creaked creaking creaks creaky cream creamed creamer creamers creamery creaming creams creamy crease creased creases creasing create created creates creating creation creations creative creatively creativeness creativity creator creator's creators creature creature's creatures credence credential credentials credibility credible credibly credit creditable creditably credited crediting creditor creditor's creditors credits credulity credulous credulousness creed creed's creeds creek creek's creeks creep creeper creepers creeping creeps creepy cremate cremated cremates cremating cremation cremations crematory crepe crepes crept crescent crescent's crescents crest crested crestfallen crests cretin crevice crevice's crevices crew crewcut crewed crewing crews crib crib's cribs cricket cricket's crickets cried crier criers cries crime crime's crimes criminal criminally criminals crimson crimsoning cringe cringed cringes cringing cripple crippled cripples crippling crises crisis crisp crisply crispness crisscross criteria criterion critic critic's critical critically criticise criticised criticism criticism's criticisms criticize criticized criticizes criticizing critics critique critiques critiquing critter croak croaked croaking croaks crochet crochets crock crockery crocks crocodile crocus croft croissants crook crooked crooks crop crop's cropped cropper cropper's croppers cropping crops cross crossable crossbar crossbar's crossbars crossed crosser crossers crosses crossing crossings crossly crossover crossover's crossovers crosspoint crosspoints crossroad crosstalk crosswalk crossword crossword's crosswords crotch crotchety crouch crouched crouching crow crowd crowded crowder crowding crowds crowed crowing crown crowned crowning crowns crows crt crts crucial crucially crucible crucified crucifies crucifix crucifixion crucify crucifying crud cruddy crude crudely crudeness cruder crudest cruel crueler cruelest cruelly cruelty cruise cruiser cruisers cruises cruising crumb crumble crumbled crumbles crumbling crumbly crumbs crummy crumple crumpled crumples crumpling crunch crunched cruncher crunchers crunches crunchier crunchiest crunching crunchy crusade crusader crusaders crusades crusading crush crushable crushed crusher crushers crushes crushing crushingly crust crust's crustacean crustacean's crustaceans crusts crutch crutch's crutches crux crux's cruxes cry crying cryogenic crypt cryptanalysis cryptanalyst cryptanalyst's cryptanalysts cryptanalysts' cryptanalytic cryptanalyze cryptic cryptical cryptically cryptogram cryptograms cryptographer cryptographers cryptographic cryptographically cryptography cryptologist cryptologists cryptology cryptosystem cryptosystems crypts crystal crystal's crystalline crystallize crystallized crystallizes crystallizing crystallographer crystallographic crystallography crystals csnet cub cub's cubbyhole cube cube's cubed cubes cubic cubical cubically cubs cuckoo cuckoo's cuckoos cucumber cucumber's cucumbers cuddle cuddled cuddly cudgel cudgel's cudgels cue cued cues cuff cuff's cufflink cuffs cuisine culinary cull culled culler culling culls culminate culminated culminates culminating culmination culpa culpable culprit culprit's culprits cult cult's cultivable cultivate cultivated cultivates cultivating cultivation cultivations cultivator cultivator's cultivators cults cultural culturally culture cultured cultures culturing cumbersome cumulative cumulatively cunning cunningly cup cup's cupboard cupboard's cupboards cupful cupped cupping cups cur curable curably curb curbed curbing curbs curd curdle curdled curdles curdling cure cured cures curfew curfew's curfews curing curiosities curiosity curiosity's curious curiouser curiousest curiously curl curled curler curlers curlicue curling curls curly currant currant's currants currencies currency currency's current currently currentness currents curricular curriculum curriculum's curriculums curried curries curry currying curs curse cursed curses cursing cursive cursor cursor's cursorily cursors cursory curt curtail curtailed curtails curtain curtained curtains curtate curtly curtness curtsies curtsy curtsy's curvaceous curvature curve curved curves curvilinear curving cushion cushioned cushioning cushions cusp cusp's cusps custard custodial custodian custodian's custodians custody custom customarily customary customer customer's customers customers' customizable customization customization's customizations customize customized customizer customizers customizes customizing customs cut cut's cutaneous cutaway cutback cute cutest cutlass cutlet cutoff cutout cutover cuts cutter cutter's cutters cutthroat cutting cuttingly cuttings cuttlefish cyanide cybernetic cybernetics cyberpunk cycle cycled cycles cyclic cyclical cyclically cyclicity cycling cycloid cycloid's cycloidal cycloids cyclone cyclone's cyclones cyclotron cyclotrons cylinder cylinder's cylinders cylindric cylindrical cylindrically cymbal cymbal's cymbals cynic cynical cynically cynics cypress cyst cysts cytology cytoplasm cytosine czar czars czech czechoslovakia d d's dabble dabbled dabbler dabbles dabbling dactyl dactylic dad dad's daddy dads daemon daemon's daemons daffodil daffodil's daffodils dagger dahlia dailies daily daintily daintiness dainty dairies dairy daisies daisy daisy's dakota dale dale's dales dallas dam dam's damage damaged damager damagers damages damaging damask dame damming damn damnation damned damning damns damp dampen dampens damper damping dampness dams damsel damsel's damsels dance danced dancer dancers dances dancing dandelion dandelion's dandelions dandy danger danger's dangerous dangerously dangers dangle dangled dangles dangling danish dare dared darer darers dares daresay daring daringly dark darken darkened darker darkest darkly darkness darling darling's darlings darn darned darner darning darns darpa dart darted darter darting dartmouth darts dash dashboard dashed dasher dashers dashes dashing dashingly data database database's databases dataflow datagram datagrams datakit date dated dateline dater dates dating dative datum daughter daughterly daughters daunt daunted dauntless dawn dawned dawning dawns day day's daybreak daydream daydreaming daydreams daylight daylight's daylights days days' daytime daze dazed dazzle dazzled dazzler dazzles dazzling dazzlingly deacon deacon's deacons deactivate dead deaden deadline deadline's deadlines deadlock deadlocked deadlocking deadlocks deadly deadness deadwood deaf deafen deafer deafest deafness deal dealer dealer's dealers dealing dealings deallocate deallocated deallocates deallocating deallocation deallocations deals dealt dean dean's deans dear dearer dearest dearly dearness dears dearth dearths death deathbed deathly deaths debacle debase debatable debate debated debater debaters debates debating debauch debauchery debilitate debilitated debilitates debilitating debility debit debited debiting deblocked debrief debris debt debt's debtor debts debug debugged debugger debugger's debuggers debugging debugs debunk debutante dec decade decade's decadence decadent decadently decades decal decathlon decay decayed decaying decays decease deceased deceased's deceases deceasing decedent deceit deceitful deceitfully deceitfulness deceive deceived deceiver deceivers deceives deceiving decelerate decelerated decelerates decelerating deceleration decelerations december decencies decency decency's decennial decent decently decentralization decentralized deception deception's deceptions deceptive deceptively decertify decibel decibels decidability decidable decide decided decidedly decides deciding deciduous decimal decimally decimals decimate decimated decimates decimating decimation decipher decipherable deciphered decipherer deciphering deciphers decision decision's decisions decisive decisively decisiveness deck decked decking deckings decks declarable declaration declaration's declarations declarative declaratively declaratives declarator declarators declaratory declare declared declarer declarers declares declaring declassify declination declination's declinations decline declined decliner decliners declines declining decnet decode decoded decoder decoders decodes decoding decodings decolletage decollimate decompile decompiled decomposability decomposable decompose decomposed decomposes decomposing decomposition decomposition's decompositions decompress decompressing decompression decorate decorated decorates decorating decoration decorations decorative decorum decouple decoupled decouples decoupling decoy decoy's decoys decrease decreased decreases decreasing decreasingly decree decreed decreeing decrees decrement decremented decrementing decrements decrypt decrypted decrypting decryption decrypts dedicate dedicated dedicates dedicating dedication deduce deduced deducer deduces deducible deducing deduct deducted deductible deducting deduction deduction's deductions deductive deed deeded deeding deeds deem deemed deeming deemphasize deemphasized deemphasizes deemphasizing deems deep deepen deepened deepening deepens deeper deepest deeply deeps deer deface default defaulted defaulter defaulting defaults defeat defeated defeating defeats defecate defect defected defecting defection defection's defections defective defects defend defendant defendant's defendants defended defender defenders defending defends defenestrate defenestrated defenestrates defenestrating defenestration defense defense's defenseless defenses defensible defensive defer deference deferment deferment's deferments deferrable deferred deferrer deferrer's deferrers deferring defers defiance defiant defiantly deficiencies deficiency deficient deficiently deficit deficit's deficits defied defies defile defiling definable define defined definer defines defining definite definitely definiteness definition definition's definitional definitions definitive definitively deflate deflater deflect deflection deflections defocus deforest deforestation deform deformation deformation's deformations deformed deformities deformity deformity's defraud defray defrost deftly defunct defy defying degeneracy degenerate degenerated degenerates degenerating degeneration degenerative degradable degradation degradation's degradations degrade degraded degrades degrading degree degree's degrees dehumidify dehydrate dehydrated deify deign deigned deigning deigns deities deity deity's dejected dejectedly delaware delay delayed delaying delays delegate delegated delegates delegating delegation delegations delete deleted deleter deleterious deletes deleting deletion deletions delhi deliberate deliberated deliberately deliberateness deliberates deliberating deliberation deliberations deliberative deliberator deliberator's deliberators delicacies delicacy delicacy's delicate delicately delicatessen delicious deliciously delight delighted delightedly delightful delightfully delighting delights delim delimit delimitation delimited delimiter delimiters delimiting delimits delineament delineate delineated delineates delineating delineation delinquent delirious deliriously delirium deliver deliverable deliverables deliverance delivered deliverer deliverers deliveries delivering delivers delivery delivery's dell dell's dells delta delta's deltas deltoid delude deluded deludes deluding deluge deluged deluges delusion delusion's delusions deluxe delve delves delving demagnify demagogue demand demanded demander demanding demandingly demands demarcate demarcated demarcates demarcating demarcation demeanor demented demerit demigod demise democracies democracy democracy's democrat democrat's democratic democratically democrats demodulate demodulator demographic demolish demolished demolishes demolition demon demon's demoniac demonic demons demonstrable demonstrate demonstrated demonstrates demonstrating demonstration demonstrations demonstrative demonstratively demonstrator demonstrator's demonstrators demoralize demoralized demoralizes demoralizing demote demountable demultiplex demultiplexed demultiplexer demultiplexers demultiplexing demur demythologize den den's denature deniable denial denial's denials denied denier denies denigrate denigrated denigrates denigrating denizen denizens denmark denominate denomination denomination's denominations denominator denominator's denominators denormalized denotable denotation denotation's denotational denotationally denotations denotative denote denoted denotes denoting denounce denounced denounces denouncing dens dense densely denseness denser densest densities density density's dent dental dentally dented denting dentist dentist's dentistry dentists dents denture denude denumerable denunciate denver deny denying deodorant deoxyribonucleic depart departed departing department department's departmental departments departs departure departure's departures depend dependability dependable dependably depended dependence dependencies dependency dependent dependently dependents depending depends depict depicted depicting depiction depictions depicts deplete depleted depletes depleting depletion depletions deplorable deplorably deplore deplored deplores deploy deployed deploying deployment deployment's deployments deploys deport deportation deportee deportment depose deposed deposes deposit depositary deposited depositing deposition deposition's depositions depositor depositor's depositors depository deposits depot depot's depots deprave depraved deprecate deprecated depreciate depreciated depreciates depreciation depress depressed depresses depressing depressingly depression depression's depressions deprivation deprivation's deprivations deprive deprived deprives depriving dept depth depths deputies deputy deputy's dequeue dequeued dequeues dequeuing derail derailed derailing derails derby dereference dereferenced dereferencing deregister deregistered deregistering deregistration deregulate deregulated derelict derelicts deride derision derivable derivation derivation's derivations derivative derivative's derivatives derive derived derives deriving derogatory derrick derriere dervish descend descendant descendant's descendants descended descendent descendents descender descenders descending descends descent descent's descents descheduled descrambled describable describe described describer describers describes describing description description's descriptional descriptions descriptive descriptively descriptives descriptor descriptor's descriptors descry desecrate desegregate deselect desert deserted deserter deserters deserting desertion desertions deserts deserve deserved deserves deserving deservingly deservings desiderata desideratum design designate designated designates designating designation designational designations designator designator's designators designed designer designer's designers designing designs desirability desirable desirableness desirably desire desired desires desiring desirous desist desk desk's desks desktop desktops desolate desolately desolation desolations despair despaired despairing despairingly despairs despatch despatched desperado desperate desperately desperation despicable despise despised despises despising despite despoil despondent despot despot's despotic despots dessert dessert's desserts dessicate destabilize destination destination's destinations destine destined destinies destiny destiny's destitute destitution destroy destroyed destroyer destroyer's destroyers destroying destroys destruct destruction destruction's destructions destructive destructively destructiveness destructor destuff destuffing destuffs desuetude desynchronize detach detached detacher detaches detaching detachment detachment's detachments detail detailed detailing details detain detained detaining detains detect detectability detectable detectably detected detecting detection detection's detections detective detectives detector detector's detectors detects detente detention deter detergent deteriorate deteriorated deteriorates deteriorating deterioration determinability determinable determinacy determinant determinant's determinants determinate determinately determination determinations determinative determine determined determiner determiners determines determining determinism deterministic deterministically deterred deterrent deterring deters detest detestable detested detour detours detract detractor detractor's detractors detracts detriment detrimental detroit deuce deus deuterium devastate devastated devastates devastating devastation develop developed developer developer's developers developing development development's developmental developments develops deviance deviant deviant's deviants deviate deviated deviates deviating deviation deviations device device's devices devil devil's devilish devilishly devils devious devise devised devises devising devisings devoid devolve devote devoted devotedly devotee devotee's devotees devotes devoting devotion devotions devour devoured devourer devouring devours devout devoutly devoutness dew dewdrop dewdrop's dewdrops dewy dexterity diabetes diabetic diabolic diachronic diacritical diacritically diacriticals diadem diagnosable diagnose diagnosed diagnoses diagnosing diagnosis diagnostic diagnostic's diagnostician diagnostics diagonal diagonally diagonals diagram diagram's diagrammable diagrammatic diagrammatically diagrammed diagrammer diagrammer's diagrammers diagramming diagrams dial dial's dialect dialect's dialectic dialects dialed dialer dialers dialing dialog dialog's dialogs dialogue dialogue's dialogues dials dialup dialysis diamagnetic diameter diameter's diameters diametric diametrically diamond diamond's diamonds diaper diaper's diapers diaphragm diaphragm's diaphragms diaries diarists diarrhea diary diary's diatribe diatribe's diatribes dibble dice dicey dichotomize dichotomy dick dickens dicky dictate dictated dictates dictating dictation dictations dictator dictator's dictatorial dictators dictatorship diction dictionaries dictionary dictionary's dictum dictum's dictums did didactic diddle didn't die died diego diehard diehards dielectric dielectric's dielectrics diem dies diesel diet dietary dieter dieters dietetic dietician dietitian dietitian's dietitians diets differ differed difference difference's differences different differentiable differential differential's differentially differentials differentiate differentiated differentiates differentiating differentiation differentiations differentiator differentiators differently differer differers differing differs difficult difficulties difficultly difficulty difficulty's diffract diffraction diffuse diffused diffusely diffuser diffusers diffuses diffusible diffusing diffusion diffusions diffusive dig digest digested digestible digesting digestion digestive digests digger digger's diggers digging diggings digit digit's digital digitalis digitally digitization digitize digitized digitizes digitizing digits dignified dignify dignitary dignities dignity digram digrams digress digressed digresses digressing digression digression's digressions digressive digs dihedral dike dike's dikes dilapidate dilatation dilate dilated dilates dilating dilation dilemma dilemma's dilemmas dilettante diligence diligent diligently dill dilogarithm dilute diluted dilutes diluting dilution dim dime dime's dimension dimensional dimensionality dimensionally dimensioned dimensioning dimensions dimes diminish diminished diminishes diminishing diminution diminutive dimly dimmed dimmer dimmer's dimmers dimmest dimming dimness dimple dims din dine dined diner diners dines ding dingbat dinghy dinginess dingo dingy dining dinner dinner's dinners dinnertime dinnerware dinosaur dinosaurs dint diode diode's diodes diophantine diopter diorama dioxide dip diphtheria diphthong diphthongs diploma diploma's diplomacy diplomas diplomat diplomat's diplomatic diplomats dipole dipped dipper dipper's dippers dipping dippings dips diptheria dire direct directed directing direction direction's directional directionality directionally directions directive directive's directives directly directness director director's directorate directories directors directory directory's directrices directrix directs dirge dirge's dirges dirt dirt's dirtier dirtiest dirtily dirtiness dirts dirty disabilities disability disability's disable disabled disabler disablers disables disabling disadvantage disadvantage's disadvantaged disadvantages disagree disagreeable disagreed disagreeing disagreement disagreement's disagreements disagrees disallow disallowed disallowing disallows disambiguate disambiguated disambiguates disambiguating disambiguation disambiguations disappear disappearance disappearance's disappearances disappeared disappearing disappears disappoint disappointed disappointing disappointment disappointment's disappointments disappoints disapproval disapprove disapproved disapproves disarm disarmament disarmed disarming disarms disassemble disassembled disassembler disassembles disassembling disassembly disaster disaster's disasters disastrous disastrously disband disbanded disbanding disbands disburse disbursed disbursement disbursement's disbursements disburses disbursing disc disc's discard discarded discarding discards discern discernable discerned discernibility discernible discernibly discerning discerningly discernment discerns discharge discharged discharges discharging disciple disciple's disciples disciplinary discipline disciplined disciplines disciplining disclaim disclaimed disclaimer disclaimers disclaiming disclaims disclose disclosed discloses disclosing disclosure disclosure's disclosures disco discomfort disconcert disconcerting disconcertingly disconnect disconnected disconnecting disconnection disconnects discontent discontented discontinuance discontinue discontinued discontinues discontinuities discontinuity discontinuity's discontinuous discord discos discount discounted discounting discounts discourage discouraged discouragement discourages discouraging discourse discourse's discourses discover discovered discoverer discoverers discoveries discovering discovers discovery discovery's discredit discredited discreet discreetly discrepancies discrepancy discrepancy's discrete discretely discreteness discretion discretionary discriminable discriminant discriminate discriminated discriminates discriminating discrimination discriminatory discs discuss discussant discussed discusses discussing discussion discussion's discussions disdain disdaining disdains disease diseased diseases disembodied disembowel disengage disengaged disengages disengaging disentangle disentangled disentangles disentangling disfigure disfigured disfigures disfiguring disgorge disgrace disgraced disgraceful disgracefully disgraces disgruntle disgruntled disguise disguised disguises disguising disgust disgusted disgustedly disgustful disgusting disgustingly disgusts dish dishearten disheartening dished dishes dishevel dishing dishonest dishonestly dishonor dishonored dishonoring dishonors dishwasher dishwashers dishwashing dishwater disillusion disillusioned disillusioning disillusionment disillusionment's disillusionments disinterested disinterestedness disjoint disjointed disjointly disjointness disjunct disjunction disjunctions disjunctive disjunctively disjunctors disjuncts disk disk's diskette diskettes diskless disks dislike disliked dislikes disliking dislocate dislocated dislocates dislocating dislocation dislocations dislodge dislodged dismal dismally dismantled dismay dismayed dismaying dismember dismembering dismembers dismiss dismissal dismissal's dismissals dismissed dismisser dismissers dismisses dismissing dismount dismounted dismounting dismounts disneyland disobedience disobey disobeyed disobeying disobeys disorder disordered disorderly disorders disorganized disown disowned disowning disowns disparage disparate disparities disparity disparity's dispatch dispatched dispatcher dispatchers dispatches dispatching dispel dispelled dispelling dispels dispensary dispensation dispense dispensed dispenser dispensers dispenses dispensing dispersal disperse dispersed disperses dispersing dispersion dispersions displace displaced displacement displacement's displacements displaces displacing display displayable displayed displayer displaying displays displease displeased displeases displeasing displeasure disposable disposal disposal's disposals dispose disposed disposer disposes disposing disposition disposition's dispositions disproportionate disproportionately disprove disproved disproves disproving dispute disputed disputer disputers disputes disputing disqualification disqualified disqualifies disqualify disqualifying disquiet disquieting disregard disregarded disregarding disregards disrepute disrespect disrupt disrupted disrupting disruption disruption's disruptions disruptive disrupts dissatisfaction dissatisfaction's dissatisfactions dissatisfied dissatisfies dissatisfy dissatisfying dissect dissects disseminate disseminated disseminates disseminating dissemination dissension dissension's dissensions dissent dissented dissenter dissenters dissenting dissents dissertation dissertation's dissertations disservice dissident dissident's dissidents dissimilar dissimilarities dissimilarity dissimilarity's dissipate dissipated dissipates dissipating dissipation dissociate dissociated dissociates dissociating dissociation dissolution dissolution's dissolutions dissolve dissolved dissolves dissolving dissonant dissuade distaff distal distally distance distances distant distantly distaste distasteful distastefully distastes distemper distill distillation distilled distiller distillers distillery distilling distills distinct distinction distinction's distinctions distinctive distinctively distinctiveness distinctly distinctness distinguish distinguishable distinguished distinguishes distinguishing distort distorted distorting distortion distortion's distortions distorts distract distracted distracting distraction distraction's distractions distracts distraught distress distressed distresses distressing distribute distributed distributes distributing distribution distribution's distributional distributions distributive distributivity distributor distributor's distributors district district's districts distrust distrusted disturb disturbance disturbance's disturbances disturbed disturber disturbing disturbingly disturbs disuse ditch ditch's ditches dither ditto ditty diurnal divan divan's divans dive dived diver diverge diverged divergence divergence's divergences divergent diverges diverging divers diverse diversely diversification diversified diversifies diversify diversifying diversion diversionary diversions diversities diversity divert diverted diverting diverts dives divest divested divesting divestiture divests divide divided dividend dividend's dividends divider dividers divides dividing divine divinely diviner diving divining divinities divinity divinity's divisibility divisible divisibly division division's divisional divisions divisive divisor divisor's divisors divorce divorced divorcee divulge divulged divulges divulging dixieland dizziness dizzy dma do doable doberman docile dock docked docket docks dockside dockyard doctor doctoral doctorate doctorate's doctorates doctored doctoring doctors doctors' doctrinaire doctrinal doctrine doctrine's doctrines document documentaries documentary documentary's documentation documentation's documentations documented documenter documenters documenting documents dodecahedra dodecahedral dodecahedron dodge dodged dodger dodgers dodging doe doer doers does doesn't dog dog's dogfights dogged doggedly doggedness dogging doghouse dogma dogma's dogmas dogmatic dogmatism dogs doing doings doldrum dole doled doleful dolefully doles doll doll's dollar dollars dollies dolls dolly dolly's dolphin dolphin's dolphins domain domain's domains dome domed domes domestic domestically domesticate domesticated domesticates domesticating domestication domicile dominance dominant dominantly dominate dominated dominates dominating domination domineer dominion domino don don't donate donated donates donating donations done donkey donkey's donkeys donned donning donnybrook donor dons doodle doom doomed dooming dooms doomsday door door's doorbell doorkeeper doorman doormen doors doorstep doorstep's doorsteps doorway doorway's doorways dope doped doper dopers dopes doping dormant dormitories dormitory dormitory's dos dosage dosages dose dosed doses dossier dossiers dot dot's dote doted dotes doting dotingly dots dotted dotting double doubled doubleheader doubler doublers doubles doublet doublet's doubleton doublets doubling doubloon doubloons doubly doubt doubtable doubted doubter doubters doubtful doubtfully doubting doubtless doubtlessly doubts dough doughnut doughnut's doughnuts dove dover doves dovetail dowager down downcast downed downer downers downfall downfallen downgrade downgraded downgrades downgrading downhill downing downlink downlinks download downloaded downloading downloads downplay downplayed downplaying downplays downpour downright downs downside downsizing downstairs downstream downtown downtowns downtrodden downturn downward downwards downy dowry doze dozed dozen dozens dozenth dozes dozing drab drabs draconian draft drafted draftee drafter drafters drafting drafts draftsman draftsmen drafty drag dragged dragging dragnet dragon dragon's dragonfly dragonhead dragons dragoon dragooned dragoons drags drain drainage drained drainer draining drainpipe drains drake dram drama drama's dramas dramatic dramatical dramatically dramatics dramatist dramatist's dramatists drank drape draped draper draperies drapers drapery drapery's drapes drastic drastically draught draught's draughts draw drawback drawback's drawbacks drawbridge drawbridge's drawbridges drawer drawers drawing drawings drawl drawled drawling drawls drawn drawnly drawnness draws dread dreaded dreadful dreadfully dreading dreadnought dreads dream dreamboat dreamed dreamer dreamers dreamily dreaming dreamingly dreamlike dreams dreamt dreamy dreariness dreary dredge dregs drench drenched drenches drenching dress dressed dresser dressers dresses dressing dressings dressmaker dressmaker's dressmakers drew dribble dribbled dribbles dribbling dried drier drier's driers dries driest drift drifted drifter drifters drifting drifts drill drilled driller drilling drills drily drink drinkable drinker drinkers drinking drinks drip drip's dripping drippy drips drive driven driver driver's drivers drivers' drives driveway driveway's driveways driving drizzle drizzly droll dromedary drone drone's drones droning drool droop drooped drooping droops droopy drop drop's droplet dropout dropped dropper dropper's droppers dropping dropping's droppings drops drosophila drought drought's droughts drove drover drovers droves drown drowned drowning drownings drowns drowsiness drowsy drubbing drudge drudgery drug drug's druggist druggist's druggists drugs drugstore drum drum's drumhead drummed drummer drummer's drummers drumming drums drunk drunkard drunkard's drunkards drunken drunkenness drunker drunkly drunks dry drying dryly dual dualism dualities duality duality's dub dubbed dubious dubiously dubiousness dubitable dublin dubs duchess duchess's duchesses duchy duck ducked ducking duckling ducklings ducks duct ducts dud due duel dueling duels dues duet dug duke duke's dukes dull dulled duller dullest dulling dullness dulls dully duly dumb dumbbell dumbbell's dumbbells dumber dumbest dumbfounded dumbly dumbness dumbstruck dummies dummy dummy's dump dumped dumper dumping dumpling dumps dunce dunce's dunces dune dune's dunes dung dungeon dungeon's dungeons dunk dupe duplex duplicable duplicate duplicated duplicates duplicating duplication duplications duplicator duplicator's duplicators duplicity durabilities durability durable durably duration duration's durations duress during dusk duskiness dusky dust dustbin dusted duster dusters dustier dustiest dusting dusts dusty dutch dutchess dutchman duties dutiful dutifully dutifulness duty duty's dwarf dwarfed dwarfs dwarves dwell dwelled dweller dwellers dwelling dwellings dwells dwelt dwindle dwindled dwindling dyad dyadic dyads dye dyed dyeing dyer dyers dyes dying dynamic dynamical dynamically dynamics dynamism dynamite dynamited dynamites dynamiting dynamo dynastic dynasties dynasty dynasty's dyne dysentery dyspeptic dysprosium dystrophy e e's each eager eagerly eagerness eagle eagle's eagles ear eardrum eared earl earl's earlier earliest earliness earls early earmark earmarked earmarking earmarkings earmarks earn earned earner earner's earners earnest earnestly earnestness earning earnings earns earphone earpieces earring earring's earrings ears earsplitting earth earth's earthed earthen earthenware earthliness earthling earthly earthman earthmen earthmover earthquake earthquake's earthquakes earths earthworm earthworm's earthworms earthy ease eased easel easement easement's easements eases easier easiest easily easiness easing east eastbound easter eastern easterner easterners easternmost eastward eastwards easy easygoing eat eaten eater eaters eating eatings eats eaves eavesdrop eavesdropped eavesdropper eavesdropper's eavesdroppers eavesdropping eavesdrops ebb ebbing ebbs ebcdic ebony eccentric eccentric's eccentricities eccentricity eccentrics ecclesiastical echelon echo echoed echoes echoing echos eclectic eclipse eclipsed eclipses eclipsing ecliptic ecology econometric economic economical economically economics economies economist economist's economists economize economized economizer economizers economizes economizing economy economy's ecosystem ecstasy ecstatic ecuador eddies eddy eddy's eden edge edged edges edging edible edict edict's edicts edifice edifice's edifices edinburgh edison edit edited editing edition edition's editions editor editor's editorial editorially editorials editors edits educable educate educated educates educating education educational educationally educations educator educator's educators eel eel's eelgrass eels eerie eerily effect effected effecting effective effectively effectiveness effector effector's effectors effects effectually effectuate effectuated effectuates effectuating effectuation effeminate efficacy efficiencies efficiency efficient efficiently effigy effort effort's effortless effortlessly effortlessness efforts egalitarian egg egged egghead egging eggplant eggs eggshell ego egocentric egos egotism egotist egypt egyptian egyptians eigenfunction eigenstate eigenvalue eigenvalue's eigenvalues eigenvector eight eighteen eighteens eighteenth eightfold eighth eighth's eighthes eighties eightieth eights eighty either ejaculate ejaculated ejaculates ejaculating ejaculation ejaculations eject ejected ejecting ejects eke eked ekes el elaborate elaborated elaborately elaborateness elaborates elaborating elaboration elaborations elaborators elapse elapsed elapses elapsing elastic elastically elasticity elbow elbowing elbows elder elderly elders eldest elect elected electing election election's elections elective electives elector elector's electoral electors electric electrical electrically electricalness electrician electricity electrification electrify electrifying electro electrocardiogram electrocardiograph electrocute electrocuted electrocutes electrocuting electrocution electrocutions electrode electrode's electrodes electroencephalogram electroencephalograph electroencephalography electrolysis electrolyte electrolyte's electrolytes electrolytic electromagnet electromagnetic electromagnetically electromechanical electron electron's electronic electronically electronics electrons electrophoresis electrophorus electrostatically elects elegance elegant elegantly elegy element element's elemental elementals elementarily elementary elements elephant elephant's elephants elevate elevated elevates elevation elevator elevator's elevators eleven elevens eleventh elf elicit elicited eliciting elicits elide elided elides eliding eligibility eligible eliminate eliminated eliminates eliminating elimination eliminations eliminator eliminators elision elisions elite elk elk's elks ellipse ellipse's ellipses ellipsis ellipsoid ellipsoid's ellipsoidal ellipsoids elliptic elliptical elliptically elm elmer elms elongated elongating elongation elope eloping eloquence eloquent eloquently else else's elsewhere elucidate elucidated elucidates elucidating elucidation elude eluded eludes eluding elusive elusively elusiveness elves em emaciate emaciated emanate emanating emancipate emancipated emancipates emancipating emancipation emasculate embalm embargo embargoes embark embarked embarks embarrass embarrassed embarrasses embarrassing embarrassingly embarrassment embassies embassy embassy's embed embedded embedding embeds embellish embellished embellishes embellishing embellishment embellishment's embellishments ember embezzle emblem embodied embodies embodiment embodiment's embodiments embody embodying embossed embrace embraced embraces embracing embroider embroidered embroideries embroiders embroidery embroiled embryo embryo's embryology embryonic embryos emerald emerald's emeralds emerge emerged emergence emergencies emergency emergency's emergent emerges emerging emeritus emery emigrant emigrant's emigrants emigrate emigrated emigrates emigrating emigration eminence eminent eminently emissary emission emissions emit emits emitted emitter emitting emotion emotion's emotional emotionally emotions empathy emperor emperor's emperors emphases emphasis emphasised emphasising emphasize emphasized emphasizes emphasizing emphatic emphatically empire empire's empires empirical empirically empiricist empiricist's empiricists employ employable employed employee employee's employees employer employer's employers employing employment employment's employments employs empower empowered empowering empowers empress emptied emptier empties emptiest emptily emptiness empty emptying ems emulate emulated emulates emulating emulation emulations emulator emulator's emulators en enable enabled enabler enablers enables enabling enact enacted enacting enactment enacts enamel enameled enameling enamels encamp encamped encamping encamps encapsulate encapsulated encapsulates encapsulating encapsulation encased enchancement enchant enchanted enchanter enchanting enchantment enchantress enchants encipher enciphered enciphering enciphers encircle encircled encircles encircling enclose enclosed encloses enclosing enclosure enclosure's enclosures encode encoded encoder encoders encodes encoding encodings encompass encompassed encompasses encompassing encore encounter encountered encountering encounters encourage encouraged encouragement encouragements encourages encouraging encouragingly encroach encrust encrypt encrypted encrypting encryption encryptions encrypts encumber encumbered encumbering encumbers encyclopedia encyclopedia's encyclopedias encyclopedic end endanger endangered endangering endangers endear endeared endearing endears endeavor endeavored endeavoring endeavors ended ender enders endgame ending endings endless endlessly endlessness endorse endorsed endorsement endorses endorsing endow endowed endowing endowment endowment's endowments endows endpoint endpoints ends endurable endurably endurance endure endured endures enduring enduringly enema enema's enemas enemies enemy enemy's energetic energies energize energized energizes energy enervate enfeeble enforce enforceable enforced enforcement enforcer enforcers enforces enforcing enfranchise engage engaged engagement engagement's engagements engages engaging engagingly engender engendered engendering engenders engine engine's engineer engineer's engineered engineering engineers engines england englander englanders english engrave engraved engraver engraver's engraves engraving engravings engross engrossed engrossing engulf enhance enhanced enhancement enhancement's enhancements enhances enhancing enigma enigmatic enjoin enjoined enjoining enjoins enjoy enjoyable enjoyably enjoyed enjoying enjoyment enjoys enlarge enlarged enlargement enlargement's enlargements enlarger enlargers enlarges enlarging enlighten enlightened enlightening enlightenment enlightens enlist enlisted enlistment enlists enliven enlivened enlivening enlivens enmities enmity ennoble ennobled ennobles ennobling ennui enormities enormity enormous enormously enough enqueue enqueued enqueues enquire enquired enquirer enquires enquiries enquiring enquiry enrage enraged enrages enraging enrapture enrich enriched enriches enriching enroll enrolled enrolling enrollment enrollment's enrollments enrolls ensemble ensemble's ensembles ensign ensign's ensigns enslave enslaved enslaves enslaving ensnare ensnared ensnares ensnaring ensue ensued ensues ensuing ensure ensured ensurer ensurers ensures ensuring entail entailed entailing entails entangle enter entered entering enterprise enterprises enterprising enters entertain entertained entertainer entertainers entertaining entertainingly entertainment entertainment's entertainments entertains enthusiasm enthusiasms enthusiast enthusiast's enthusiastic enthusiastically enthusiasts entice enticed enticer enticers entices enticing entire entirely entireties entirety entities entitle entitled entitlement entitles entitling entity entity's entomb entomology entrance entranced entrances entrant entrants entrap entreat entreated entreaty entree entrench entrenched entrenches entrenching entrepreneur entrepreneur's entrepreneurial entrepreneurs entries entropy entrust entrusted entrusting entrusts entry entry's enumerable enumerate enumerated enumerates enumerating enumeration enumerations enumerative enumerator enumerators enunciation envelop envelope enveloped enveloper envelopes enveloping envelopment envelopments envelops envied envies envious enviously enviousness environ environing environment environment's environmental environmentally environments environs envisage envisaged envisages envisaging envision envisioned envisioning envisions envoy envoy's envoys envy enzyme epaulet epaulet's epaulets ephemeral epic epic's epics epidemic epidemic's epidemics epidermis epigram epileptic epilog epilogue episcopal episode episode's episodes epistemological epistemology epistle epistle's epistles epitaph epitaphs epitaxial epitaxially epithet epithet's epithets epitomize epitomized epitomizes epitomizing epoch epochs epsilon epsilons equal equaled equaling equalities equality equality's equalization equalize equalized equalizer equalizers equalizes equalizing equally equals equate equated equates equating equation equations equator equator's equatorial equators equestrian equidistant equilateral equilibrate equilibria equilibrium equilibriums equinox equip equipment equipments equipoise equipped equipping equips equitable equitably equity equivalence equivalenced equivalences equivalencing equivalent equivalently equivalents era era's eradicate eradicated eradicates eradicating eradication eras erasable erase erased eraser erasers erases erasing erasure erasures erbium ere erect erected erecting erection erection's erections erector erector's erectors erects erg ergo ergodic ermine ermine's ermines erode eroded erosion erotic erotica err errand errant errata erratic erratically erratum erred erring erringly erroneous erroneously erroneousness error error's errored errors errs ersatz erudite erupt eruption escalate escalated escalates escalating escalation escalator escapable escapade escapade's escapades escape escaped escapee escapee's escapees escapes escaping eschew eschewed eschewing eschews escort escorted escorting escorts escrow esoteric esoterically especial especially espionage espouse espoused espouses espousing esprit espy esquire esquires essay essayed essays essence essence's essences essential essentially essentials establish established establishes establishing establishment establishment's establishments estate estate's estates esteem esteemed esteeming esteems esthetic esthetically esthetics estimate estimated estimates estimating estimation estimations estimator estonia et eta etc etch etched etching eternal eternally eternities eternity ether ether's ethereal ethereally ethernet ethernet's ethernets ethers ethic ethical ethically ethics ethiopia ethnic etiquette etymologies etymology eucalyptus euclid euclid's euclidean eulogies eunuch eunuchs euphemism euphemism's euphemisms euphemistically euphorbia euphoria euphoric eureka europe european europeans euthanasia evacuate evacuated evacuation evade evaded evades evading evaluate evaluated evaluates evaluating evaluation evaluations evaluative evaluator evaluator's evaluators evaporate evaporated evaporating evaporation evaporative evasion evasive eve even evened evenhanded evenhandedly evenhandedness evening evening's evenings evenly evenness evens event event's eventful eventfully eventide eventides events eventual eventualities eventuality eventually ever everest evergreen everlasting everlastingly evermore every everybody everyday everyone everyone's everything everywhere evict evicted evicting eviction eviction's evictions evicts evidence evidenced evidences evidencing evident evidently evil evilly evils evince evinced evinces evoke evoked evokes evoking evolute evolute's evolutes evolution evolution's evolutionary evolutions evolve evolved evolves evolving ewe ewe's ewes ex exacerbate exacerbated exacerbates exacerbating exacerbation exacerbations exact exacted exacting exactingly exaction exaction's exactions exactitude exactly exactness exacts exaggerate exaggerated exaggerates exaggerating exaggeration exaggerations exalt exaltation exalted exalting exalts exam exam's examination examination's examinations examine examined examiner examiners examines examing examining example example's examples exams exasperate exasperated exasperates exasperating exasperation excavate excavated excavates excavating excavation excavations exceed exceeded exceeding exceedingly exceeds excel excelled excellence excellences excellency excellent excellently excelling excels except excepted excepting exception exception's exceptional exceptionally exceptions excepts excerpt excerpted excerpts excess excesses excessive excessively exchange exchangeable exchanged exchanges exchanging exchequer exchequer's exchequers excise excised excises excising excision excitable excitation excitation's excitations excite excited excitedly excitement excites exciting excitingly exciton exclaim exclaimed exclaimer exclaimers exclaiming exclaims exclamation exclamation's exclamations exclamatory exclude excluded excludes excluding exclusion exclusionary exclusions exclusive exclusively exclusiveness exclusivity excommunicate excommunicated excommunicates excommunicating excommunication excrete excreted excretes excreting excretion excretions excretory excruciate excruciating excursion excursion's excursions excusable excusably excuse excused excuses excusing exec executability executable execute executed executes executing execution executional executions executive executive's executives executor executor's executors exegesis exemplar exemplary exemplification exemplified exemplifier exemplifiers exemplifies exemplify exemplifying exempt exempted exempting exemption exemptions exempts exercise exercised exerciser exercisers exercises exercising exert exerted exerting exertion exertion's exertions exerts exhale exhaled exhales exhaling exhaust exhausted exhaustedly exhaustible exhausting exhaustion exhaustive exhaustively exhausts exhibit exhibited exhibiting exhibition exhibition's exhibitions exhibitor exhibitor's exhibitors exhibits exhilarate exhort exhortation exhortation's exhortations exhorting exhume exile exiled exiles exiling exist existed existence existences existent existential existentialism existentialist existentialist's existentialists existentially existing exists exit exited exiting exits exodus exorbitant exorbitantly exorcise exorcism exorcist exoskeleton exotic exotica expand expandable expanded expander expander's expanders expanding expands expanse expanses expansible expansion expansionism expansions expansive expect expectancies expectancy expectant expectantly expectation expectation's expectations expected expectedly expecting expectingly expects expedient expediently expedite expedited expedites expediting expedition expedition's expeditions expeditious expeditiously expel expelled expelling expels expend expendable expended expending expenditure expenditure's expenditures expends expense expenses expensive expensively experience experienced experiences experiencing experiment experimental experimentally experimentation experimentation's experimentations experimented experimenter experimenters experimenting experiments expert expertise expertly expertness experts expiration expiration's expirations expire expired expires expiring expiry explain explainable explained explainer explainers explaining explains explanation explanation's explanations explanatory expletive explicit explicitly explicitness explode exploded explodes exploding exploit exploitable exploitation exploitation's exploitations exploited exploiter exploiters exploiting exploits exploration exploration's explorations exploratory explore explored explorer explorers explores exploring explosion explosion's explosions explosive explosively explosives exponent exponent's exponential exponentially exponentials exponentiate exponentiated exponentiates exponentiating exponentiation exponentiation's exponentiations exponents export exportable exported exporter exporters exporting exports expose exposed exposer exposers exposes exposing exposition exposition's expositions expository exposure exposure's exposures expound expounded expounder expounding expounds express expressed expresses expressibility expressible expressibly expressing expression expression's expressions expressive expressively expressiveness expressly expulsion expunge expunged expunges expunging expurgate exquisite exquisitely exquisiteness extant extemporaneous extend extended extendible extending extends extensibility extensible extension extension's extensions extensive extensively extent extent's extents extenuate extenuated extenuating extenuation exterior exterior's exteriors exterminate exterminated exterminates exterminating extermination external externally externals extinct extinction extinguish extinguished extinguisher extinguishes extinguishing extirpate extol extort extortion extra extract extracted extracting extraction extraction's extractions extractor extractor's extractors extracts extracurricular extramarital extraneous extraneously extraneousness extraordinarily extraordinariness extraordinary extrapolate extrapolated extrapolates extrapolating extrapolation extrapolations extras extraterrestrial extravagance extravagant extravagantly extravaganza extremal extreme extremely extremes extremist extremist's extremists extremities extremity extremity's extricate extrinsic extrovert exuberance exult exultation eye eyeball eyebrow eyebrow's eyebrows eyed eyeful eyeglass eyeglasses eyeing eyelash eyelid eyelid's eyelids eyepiece eyepiece's eyepieces eyer eyers eyes eyesight eyewitness eyewitness's eyewitnesses eying f f's fable fabled fables fabric fabric's fabricate fabricated fabricates fabricating fabrication fabrics fabulous fabulously facade facaded facades face faced faces facet faceted facets facial facile facilely facilitate facilitated facilitates facilitating facilities facility facility's facing facings facsimile facsimile's facsimiles fact fact's faction faction's factions facto factor factored factorial factorials factories factoring factorization factorization's factorizations factorize factorized factorizes factorizing factors factory factory's facts factual factually faculties faculty faculty's fade faded fadeout fader faders fades fading fag fags fahrenheit fail failed failing failings fails failsoft failure failure's failures fain faint fainted fainter faintest fainting faintly faintness faints fair fairer fairest fairies fairing fairly fairness fairs fairy fairy's fairyland faith faithful faithfully faithfulness faithless faithlessly faithlessness faiths fake faked faker fakes faking falcon falconer falcons fall fallacies fallacious fallacy fallacy's fallen fallibility fallible falling fallout fallow falls false falsehood falsehood's falsehoods falsely falseness falsification falsified falsifies falsify falsifying falsity falter faltered falters fame famed fames familial familiar familiarities familiarity familiarization familiarize familiarized familiarizes familiarizing familiarly familiarness families familism family family's famine famine's famines famish famous famously fan fan's fanatic fanatic's fanatics fancied fancier fancier's fanciers fancies fanciest fanciful fancifully fancily fanciness fancy fancying fanfare fanfold fang fang's fangled fangs fanned fanning fanout fans fantasies fantastic fantastically fantasy fantasy's far farad faraway farce farce's farces fare fared fares farewell farewells farfetched farina faring farm farmed farmer farmer's farmers farmhouse farmhouse's farmhouses farming farmland farms farmyard farmyard's farmyards farsighted farther farthest farthing fascicle fascinate fascinated fascinates fascinating fascinatingly fascination fascism fascist fashion fashionable fashionably fashioned fashioning fashions fast fasted fasten fastened fastener fasteners fastening fastenings fastens faster fastest fastidious fasting fastness fasts fat fatal fatalities fatality fatality's fatally fatals fate fated fateful fates father father's fathered fatherland fatherly fathers fathom fathomed fathoming fathoms fatigue fatigued fatigues fatiguing fatness fats fatten fattened fattener fatteners fattening fattens fatter fattest fatty faucet faucets fault faulted faulting faultless faultlessly faults faulty faun fauna favor favorable favorably favored favorer favoring favorite favorites favors fawn fawned fawning fawns fax faxed faxes faze fear feared fearful fearfully fearing fearless fearlessly fearlessness fears fearsome feasibility feasible feast feasted feasting feasts feat feat's feather featherbed featherbedding feathered featherer featherers feathering feathers featherweight feathery feats feature featured features featuring feb februaries february february's fecund fed federal federally federals federated federation fee feeble feebleness feebler feeblest feebly feed feedback feeder feeders feeding feedings feeds feel feeler feelers feeling feelingly feelings feels fees feet feign feigned feigning felicities felicity feline fell felled felling fellow fellow's fellows fellowship fellowship's fellowships felon felonious felony felt felts female female's females feminine femininity feminism feminist femur femur's femurs fen fence fenced fencer fencers fences fencing fend fens ferment fermentation fermentation's fermentations fermented fermenting ferments fern fern's ferns ferocious ferociously ferociousness ferocity ferret ferried ferries ferrite ferry fertile fertilely fertility fertilization fertilize fertilized fertilizer fertilizers fertilizes fertilizing fervent fervently fervor fervor's fervors festival festival's festivals festive festively festivities festivity fetal fetch fetched fetches fetching fetchingly fetid fetish fetter fettered fetters fettle fetus feud feud's feudal feudalism feuds fever fevered feverish feverishly fevers few fewer fewest fewness fiance fiancee fiasco fiat fib fibbing fiber fiber's fibers fibrosities fibrosity fibrous fibrously fickle fickleness ficticious fiction fiction's fictional fictionally fictions fictitious fictitiously fiddle fiddled fiddler fiddles fiddlestick fiddlesticks fiddling fidelity fidget fiducial fief fiefdom field fielded fielder fielders fielding fields fieldwork fiend fiendish fierce fiercely fierceness fiercer fiercest fiery fife fifo fifteen fifteens fifteenth fifth fifths fifties fiftieth fifty fig fig's fight fighter fighters fighting fights figs figurative figuratively figure figured figures figuring figurings filament filament's filaments file file's filed filename filename's filenames filer files filial filibuster filing filings fill fillable filled filler fillers fillet fillets filling fillings fills filly film filmed filming films filter filter's filtered filtering filters filth filthier filthiest filthiness filthy fin fin's final finality finalization finalize finalized finalizes finalizing finally finals finance financed finances financial financially financier financier's financiers financing find finder finders finding findings finds fine fined finely fineness finer fines finesse finessed finesses finessing finest finger fingered fingering fingerings fingernail fingerprint fingerprints fingers fingertip finicky fining finish finished finisher finishers finishes finishing finite finitely finiteness fink finland finnish finny fins fir fire firearm firearm's firearms fireboat firebreak firebug firecracker fired fireflies firefly firefly's firehouse firelight fireman firemen fireplace fireplace's fireplaces firepower fireproof firer firers fires fireside firewall firewalls firewood fireworks firing firings firm firmament firmed firmer firmest firming firmly firmness firms firmware first firsthand firstly firsts fiscal fiscally fish fished fisher fisherman fishermen fishers fishery fishes fishing fishmonger fishpond fishy fission fissioned fissure fissured fist fisted fisticuff fists fit fitful fitfully fitly fitness fits fitted fitter fitter's fitters fitting fittingly fittings five fivefold fives fix fixate fixated fixates fixating fixation fixations fixed fixedly fixedness fixer fixers fixes fixing fixings fixture fixture's fixtures fizzle fizzled fjord flabbergast flabbergasted flack flag flag's flagellate flagged flagging flagpole flagrant flagrantly flags flagship flail flair flak flake flaked flakes flaking flaky flam flamboyant flame flamed flamer flamers flames flaming flamingo flammable flank flanked flanker flanking flanks flannel flannel's flannels flap flap's flaps flare flared flares flaring flash flashback flashed flasher flashers flashes flashing flashlight flashlight's flashlights flashy flask flat flatbed flatly flatness flats flatten flattened flattening flatter flattered flatterer flattering flattery flattest flatulent flatus flatworm flaunt flaunted flaunting flaunts flavor flavored flavoring flavorings flavors flaw flawed flawless flawlessly flaws flax flaxen flea flea's fleas fled fledged fledgling fledgling's fledglings flee fleece fleece's fleeced fleeces fleecy fleeing flees fleet fleetest fleeting fleetingly fleetly fleetness fleets flemish flesh fleshed fleshes fleshing fleshly fleshy flew flex flexibilities flexibility flexible flexibly flexing flick flicked flicker flickering flicking flicks flier fliers flies flight flight's flights flimsy flinch flinched flinches flinching fling fling's flings flint flinty flip flipflop flipped flipping flips flirt flirtation flirtatious flirted flirting flirts flit flitting float floated floater floating floats flock flocked flocking flocks flog flogging flood flooded flooding floodlight floodlit floods floor floored flooring floorings floors flop flop's floppies floppily flopping floppy flops flora floral florid florida florin florist floss flossed flosses flossing flotation flotilla flounder floundered floundering flounders flour floured flourish flourished flourishes flourishing flow flowchart flowcharting flowcharts flowcontrol flowed flower flowered floweriness flowering flowerpot flowers flowery flowing flown flows flowsheeting flu fluctuate fluctuated fluctuates fluctuating fluctuation fluctuations flue fluency fluent fluently fluff fluffier fluffiest fluffy fluid fluidity fluidly fluids fluke flung flunked fluoresce fluorescent flurried flurry flush flushed flushes flushing flustered flute fluted fluting flutter fluttered fluttering flutters flux fly flyable flyer flyer's flyers flying foal foam foamed foaming foams foamy fob fobbing focal focally foci focus focused focuses focusing focussed fodder foe foe's foes fog fog's fogged foggier foggiest foggily fogging foggy fogs fogy foible foil foiled foiling foils foist fold folded folder folders folding foldout folds foliage folk folk's folklore folks folksong folksy follies follow followed follower followers following followings follows folly fond fonder fondle fondled fondles fondling fondly fondness font font's fonts foobar food food's foods foodstuff foodstuff's foodstuffs fool fooled foolhardy fooling foolish foolishly foolishness foolproof fools foot footage football football's footballs footbridge footed footer footers footfall foothill foothold footing footman footnote footnote's footnotes footpath footprint footprint's footprints footstep footsteps for forage foraged forages foraging foray foray's forays forbade forbear forbear's forbearance forbears forbid forbidden forbidding forbids force force's forceably forced forceful forcefully forcefulness forcer forces forcible forcibly forcing ford fords fore forearm forearm's forearms foreboding forecast forecasted forecaster forecasters forecasting forecastle forecasts foredoomed forefather forefather's forefathers forefinger forefinger's forefingers forego foregoes foregoing foregone foreground forehead forehead's foreheads foreign foreigner foreigners foreigns foreman foremost forenoon forensic forerunner forerunners foresee foreseeable foreseen foresees foreshadowing foresight foresighted forest forestall forestalled forestalling forestallment forestalls forested forester foresters forestry forests foretell foretelling foretells forethought foretold forever forewarn forewarned forewarning forewarnings forewarns forfeit forfeited forfeiture forfend forfended forfending forfends forgave forge forged forger forgeries forgers forgery forgery's forges forget forgetful forgetfulness forgets forgettable forgettably forgetting forging forgivable forgivably forgive forgiven forgiveness forgives forgiving forgivingly forgot forgotten fork forked forking forklift forks forlorn forlornly form form's formal formalism formalism's formalisms formalities formality formalization formalization's formalizations formalize formalized formalizes formalizing formally formals formant formants format formation formation's formations formative formatively formats formatted formatter formatter's formatters formatting formed former former's formerly formidable forming forms forms' formula formula's formulae formulas formulate formulated formulates formulating formulation formulations formulator formulator's formulators fornication forsake forsaken forsakes forsaking fort fort's forte forth forthcoming forthright forthwith fortier forties fortieth fortification fortifications fortified fortifies fortify fortifying fortiori fortitude fortnight fortnightly fortran fortress fortress's fortresses forts fortuitous fortuitously fortunate fortunately fortune fortune's fortunes forty forum forum's forums forward forwarded forwarder forwarding forwardness forwards fossil fossils foster fostered fostering fosters fought foul fouled fouler foulest fouling foully foulmouth foulness fouls found foundation foundation's foundations founded founder foundered founders founding foundling foundries foundry foundry's founds fount fount's fountain fountain's fountains founts four fourfold fourier fours fourscore foursome foursquare fourteen fourteens fourteenth fourth fowl fowler fowls fox fox's foxes fraction fraction's fractional fractionally fractions fracture fractured fractures fracturing fragile fragment fragmentary fragmentation fragmented fragmenting fragments fragrance fragrance's fragrances fragrant fragrantly frail frailest frailty frame frame's framed framer frames framework framework's frameworks framing franc france france's frances franchise franchise's franchised franchises francisco francs frank franked franker frankest frankfurt franking frankly frankness franks frantic frantically fraternal fraternally fraternities fraternity fraternity's fraud fraud's frauds fraudulent fraught fray frayed fraying frays frazzle freak freak's freakish freaks freaky freckle freckled freckles free freed freedom freedom's freedoms freeing freeings freely freeman freeness freer frees freest freestanding freeway freewheel freeze freezer freezers freezes freezing freight freighted freighter freighters freighting freights french frenetic frenzied frenzy freon frequencies frequency frequent frequented frequenter frequenters frequenting frequently frequents fresco frescoes fresh freshen freshened freshener fresheners freshening freshens fresher freshest freshly freshman freshmen freshness freshwater fret fretful fretfully fretfulness frets fretted fretting friar friar's friars frication fricative fricatives friction friction's frictional frictionless frictions friday friday's fridays fried friend friend's friendless friendlier friendliest friendliness friendly friends friends' friendship friendship's friendships fries frieze frieze's friezes frigate frigate's frigates fright frighten frightened frightening frighteningly frightens frightful frightfully frightfulness frigid frill frill's frilled frills fringe fringed frisian frisk frisked frisking frisks frisky fritter frivolity frivolous frivolously fro frock frock's frocks frog frog's frogs frolic frolics from front frontage frontal fronted frontier frontier's frontiers frontiersman frontiersmen fronting fronts frost frostbite frostbitten frosted frosting frosts frosty froth frothing frothy frown frowned frowning frowns froze frozen frozenly frugal frugality frugally fruit fruit's fruitful fruitfully fruitfulness fruition fruitless fruitlessly fruits fruity frustrate frustrated frustrates frustrating frustration frustrations fry frying fudge fuel fueled fueling fuels fugitive fugitive's fugitives fugue fulcrum fulfill fulfilled fulfilling fulfillment fulfillments fulfills full fuller fullest fullness fully fulminate fumble fumbled fumbling fume fumed fumes fuming fun function function's functional functionalities functionality functionally functionals functionary functioned functioning functions functor functor's functors fund fundamental fundamentalists fundamentally fundamentals funded funder funders funding funds funeral funeral's funerals funereal fungal fungi fungible fungicide fungus funk funky funnel funneled funneling funnels funnier funniest funnily funniness funny fur fur's furies furious furiouser furiously furlong furlough furnace furnace's furnaces furnish furnished furnishes furnishing furnishings furniture furrier furrow furrowed furrows furry furs further furthered furthering furthermore furthermost furthers furthest furtive furtively furtiveness fury fury's fuse fused fuses fusing fusion fuss fussiness fussing fussy futile futility futon future future's futures futuristic fuzz fuzzier fuzziest fuzzily fuzziness fuzzy g g's gab gabardine gabbing gable gabled gabler gables gad gadflies gadfly gadget gadget's gadgetry gadgets gadolinium gag gagged gagging gaging gags gaieties gaiety gaily gain gained gainer gainers gainful gaining gains gait gaited gaiter gaiters galactic galapagos galaxies galaxy galaxy's gale gall gallant gallantly gallantry gallants galled galleria galleried galleries gallery galley galley's galleys galling gallium gallon gallon's gallons gallop galloped galloper galloping gallops gallows galls gallstone galore gambit gambits gamble gambled gambler gamblers gambles gambling gambol game gamed gamely gameness games gaming gamma gamut gander gang gang's ganged ganging gangland gangling gangplank gangrene gangs gangster gangster's gangsters gantry gap gap's gape gaped gapes gaping gaps garage garaged garages garb garbage garbage's garbaged garbages garbed garble garbled garbles garbling garden gardened gardener gardeners gardening gardens gargantuan gargle gargled gargles gargling gargoyle gargoyles garland garlanded garlic garment garment's garments garner garnered garnish garrison garrisoned garter garter's garters gas gas's gaseous gaseously gases gash gash's gashes gasket gaslight gasoline gasp gasped gasping gasps gassed gasser gassing gassings gassy gastric gastrointestinal gastronome gastronomy gate gated gates gateway gateway's gatewayed gatewaying gateways gather gathered gatherer gatherers gathering gatherings gathers gating gator gauche gaudiness gaudy gauge gauged gauges gaunt gauntness gaussian gauze gave gavel gawk gawky gay gayer gayest gayety gayly gayness gaze gazed gazelle gazer gazers gazes gazette gazing gcd gear geared gearing gears gecko geese geisha gel gel's gelatin gelatine gelatinous geld gelled gelling gels gem gem's gems gender gender's genders gene gene's genealogical genealogists genealogy generable general general's generalist generalist's generalists generalities generality generalization generalization's generalizations generalize generalized generalizer generalizers generalizes generalizing generally generals generate generated generater generates generating generation generations generative generator generator's generators generic generically generosities generosity generosity's generous generously generousness genes genesis genetic genetically geneva genial genially genie genius genius's geniuses genre genre's genres gent genteel gentile gentle gentleman gentlemanly gentlemen gentlemen's gentleness gentler gentlest gentlewoman gently gentry genuine genuinely genuineness genus geocentric geodesic geodesy geodetic geographer geographic geographical geographically geography geological geologist geologist's geologists geology geometric geometrical geometrically geometrician geometries geometry geophysical geophysics georgia geostationary geosynchronous geothermal geranium gerbil geriatric germ germ's german german's germane germanic germans germany germicide germinal germinate germinated germinates germinating germination germs gerund gestalt gesture gestured gestures gesturing get getaway gets getter getter's getters getting geyser ghastliness ghastly ghetto ghost ghosted ghostly ghosts giant giant's giants gibberish giddiness giddy gift gifted gifts gig gigabit gigabits gigabyte gigabytes gigacycle gigahertz gigantic gigavolt gigawatt giggle giggled giggles giggling gild gilded gilding gilds gill gill's gills gilt gimmick gimmick's gimmicks gin gin's ginger gingerbread gingerly gingham ginghams gins gipsies gipsy gipsy's giraffe giraffe's giraffes gird girder girder's girders girdle girl girl's girlie girlish girls girls' girt girth gist give giveaway given giver givers gives giving glacial glacier glacier's glaciers glad gladden gladder gladdest glade gladiator gladiators gladly gladness glamor glamorous glamour glance glanced glances glancing gland gland's glands glandular glare glared glares glaring glaringly glass glassed glasses glassy glaucoma glaze glazed glazer glazes glazing gleam gleamed gleaming gleams glean gleaned gleaner gleaning gleanings gleans glee gleeful gleefully glees glen glen's glens glide glided glider gliders glides gliding glimmer glimmered glimmering glimmers glimpse glimpsed glimpses glint glinted glinting glints glisten glistened glistening glistens glitch glitter glittered glittering glitters gloat global globally globe globe's globes globular globularity gloom gloomily gloomy glories glorification glorified glorifies glorify glorious gloriously glory glorying gloss glossaries glossary glossary's glossed glosses glossing glossy glottal glove gloved glover glovers gloves gloving glow glowed glower glowers glowing glowingly glows glue glued glues gluing glut glutton gnash gnat gnat's gnats gnaw gnawed gnawing gnaws gnome gnomon gnu go goad goaded goading goads goal goal's goals goat goat's goatee goatee's goatees goats gobble gobbled gobbler gobblers gobbles gobbling goblet goblet's goblets goblin goblin's goblins god god's goddess goddess's goddesses godfather godhead godlike godly godmother godmother's godmothers godparent gods godsend godson goes goggles going goings gold golden goldenly goldenness goldenrod goldfish golding golds goldsmith golf golfer golfers golfing goliath golly gondola gondolas gone goner gong gong's gongs good goodby goodbye goodies goodly goodness goods goodwill goody goody's goof goofed goofs goofy goose gopher gopher's gophers gore gorge gorgeous gorgeously gorges gorging gorilla gorilla's gorillas gory gosh gospel gospelers gospels gossip gossiped gossiping gossips got gothic goto gotten gouge gouged gouges gouging gourd gourmet gout govern governance governed governess governing government government's governmental governmentally governments governor governor's governors governs gown gowned gowns grab grabbed grabber grabber's grabbers grabbing grabbings grabs grace graced graceful gracefully gracefulness graces gracing gracious graciously graciousness grad gradation gradation's gradations grade graded grader graders grades gradient gradient's gradients grading gradings gradual gradually graduate graduated graduates graduating graduation graduations graft grafted grafter grafting grafts graham graham's grahams grail grain grained graining grains gram grammar grammar's grammarian grammars grammatic grammatical grammatically grams granaries granary granary's grand grandchild grandchildren granddaughter grander grandest grandeur grandfather grandfather's grandfathers grandiose grandly grandma grandmas grandmother grandmother's grandmothers grandnephew grandness grandniece grandpa grandparent grandparents grands grandson grandson's grandsons grandstand grange granite granny granola grant granted grantee granter granting grantor grants granularity granulate granulated granulates granulating grape grape's grapefruit grapes grapevine graph graph's graphed graphic graphical graphically graphics graphing graphite graphs grapple grappled grappling grasp graspable grasped grasping graspingly grasps grass grassed grassers grasses grassier grassiest grassland grassy grate grated grateful gratefully gratefulness grater grates gratification gratified gratify gratifying grating gratings gratis gratitude gratuities gratuitous gratuitously gratuitousness gratuity gratuity's grave gravel gravelly gravely graven graveness graver graves gravest gravestone gravestones graveyard gravitate gravitation gravitational gravities gravity gravy gray grayed grayer grayest graying grayish grayness graze grazed grazer grazers grazing grease greased greases greasy great greater greatest greatly greatness greece greed greedier greediest greedily greediness greedy greek greek's greeks green greener greenery greenest greengrocer greenhouse greenhouse's greenhouses greening greenish greenly greenness greens greenware greenwich greet greeted greeter greeting greetings greets gregarious gregorian grenade grenade's grenades grew grey greyest greyhound greying grid grid's griddle gridiron grids grief grief's griefs grievance grievance's grievances grieve grieved griever grievers grieves grieving grievingly grievous grievously grill grilled grilling grills grim grimace grimaced grime grimed grimly grimmer grimmest grimness grin grind grinder grinders grinding grindings grinds grindstone grindstone's grindstones grinning grins grip gripe griped gripes griping gripped gripping grippingly grips grisly grist grit grit's grits gritted gritty grizzled grizzly groan groaned groaner groaners groaning groans grocer grocer's groceries grocers grocery groggy groin groom groom's groomed grooming grooms groove grooved grooves grope groped gropes groping gross grossed grosser grosses grossest grossing grossly grossness grotesque grotesquely grotesques grotto grotto's grottos ground grounded grounder grounders grounding grounds groundwork group group's grouped grouping groupings groups grouse grove grovel groveled groveling grovels grover grovers groves grow grower growers growing growl growled growling growls grown grownup grownup's grownups grows growth growths grub grub's grubby grubs grudge grudge's grudged grudges grudging grudgingly gruesome gruff gruffly grumble grumbled grumbles grumbling grunt grunted grunting grunts gsize guano guarantee guaranteed guaranteeing guaranteer guaranteers guarantees guaranty guard guarded guardedly guardhouse guardian guardian's guardians guardianship guarding guards guatemala gubernatorial guerrilla guerrilla's guerrillas guess guessed guesses guessing guesswork guest guest's guests guidance guide guide's guidebook guidebook's guidebooks guided guideline guideline's guidelines guides guiding guild guilder guilders guile guilt guiltier guiltiest guiltily guiltiness guiltless guiltlessly guilty guinea guise guise's guises guitar guitar's guitarist guitars gulch gulch's gulches gulf gulf's gulfs gull gulled gullible gullies gulling gulliver's gulls gully gully's gulp gulped gulps gum gum's gumming gumption gums gun gun's gunfire gunman gunmen gunned gunner gunner's gunners gunnery gunning gunny gunplay gunpowder guns gunshot gurgle guru gurus gush gushed gusher gushes gushing gust gust's gusto gusts gusty gut gutenberg guts gutsy gutter guttered gutters gutting guttural guy guyed guyer guyers guying guys gymnasium gymnasium's gymnasiums gymnast gymnast's gymnastic gymnastics gymnasts gypsies gypsy gypsy's gyro gyrocompass gyroscope gyroscope's gyroscopes h h's ha habeas habit habit's habitat habitat's habitation habitation's habitations habitats habits habitual habitually habitualness hack hacked hacker hackers hacking hackneyed hacks hacksaw had haddock hades hadn't hag haggard haggardly haggle haggling hail hailed hailing hails hailstone hailstorm hair hair's haircut haircut's haircuts hairdryer hairdryer's hairdryers hairier hairiness hairless hairpin hairs hairy hale haler half halfhearted halfway hall hall's hallmark hallmark's hallmarks hallow hallowed halloween halls hallucinate hallway hallway's hallways halo halogen halt halted halter halters halting haltingly halts halve halved halvers halves halving ham ham's hamburg hamburger hamburger's hamburgers hamiltonian hamlet hamlet's hamlets hammer hammered hammering hammers hamming hammock hammock's hammocks hamper hampered hampering hampers hampshire hams hamster hand handbag handbag's handbags handbook handbook's handbooks handcrafted handcuff handcuffed handcuffing handcuffs handed handedness handful handfuls handgun handicap handicap's handicapped handicaps handicrafts handier handiest handily handiness handing handiwork handkerchief handkerchief's handkerchiefs handle handled handler handlers handles handling handoff handoffs handout handouts handover hands handset handsets handshake handshakes handshaking handsome handsomely handsomeness handsomer handsomest handwriting handwritings handwritten handy hang hangar hangar's hangars hanged hanger hangers hanging hangman hangmen hangout hangover hangover's hangovers hangs hanoi hap haphazard haphazardly haphazardness hapless haplessly haplessness haply happen happened happening happenings happens happier happiest happily happiness happy harass harassed harasses harassing harassment harbinger harbor harbored harboring harbors hard hardboiled hardcopy harden hardened harder hardest hardhat hardiness hardly hardness hardscrabble hardship hardship's hardships hardware hardware's hardwire hardwired hardworking hardy hare hare's harelip harem harems hares hark harken harks harlot harlot's harlots harm harmed harmful harmfully harmfulness harming harmless harmlessly harmlessness harmonic harmonics harmonies harmonious harmoniously harmoniousness harmonize harmony harms harness harnessed harnessing harp harper harpers harping harried harrier harrow harrowed harrowing harrows harry harsh harsher harshly harshness hart harvard harvest harvested harvester harvesting harvests has hash hashed hasher hashes hashing hashish hasn't hassle haste hasten hastened hastening hastens hastier hastiest hastily hastiness hastings hasty hat hat's hatch hatched hatchet hatchet's hatchets hatching hate hated hateful hatefully hatefulness hater hates hating hatred hats haughtily haughtiness haughty haul hauled hauler hauling hauls haunch haunch's haunches haunt haunted haunter haunting haunts have haven haven's haven't havens haves having havoc hawaii hawaiian hawk hawked hawker hawkers hawks hay haying hays haystack hazard hazard's hazardous hazards haze haze's hazel hazes hazier haziest hazily haziness hazy hdlc he he'd he'll he's head headache headache's headaches headed headend headends header header's headers headgear heading heading's headings headland headland's headlands headless headlight headline headlined headlines headlining headlong headmaster headphone headphones headquarters headroom heads headset headway heal healed healer healers healing heals health healthful healthfully healthfulness healthier healthiest healthily healthiness healthy heap heaped heaping heaps hear heard hearer hearers hearing hearings hearken hears hearsay heart heart's heartbeat heartbreak hearted hearten heartfelt heartiest heartily heartiness heartless hearts hearts' hearty heat heatable heated heatedly heater heaters heath heathen heather heating heats heave heaved heaven heavenly heavens heaver heavers heaves heavier heaviest heavily heaviness heaving heavy heavyweight hebrew heck heckle hectic hectoring hedge hedged hedgehog hedgehog's hedgehogs hedges hedonism hedonist heed heeded heedless heedlessly heedlessness heeds heel heeled heelers heeling heels hefty hegemony heifer height heighten heightened heightening heightens heights heinous heinously heir heir's heiress heiress's heiresses heirs held helical helicopter helicopters heliocentric helium helix hell hell's hellfire hellish hello hells helm helmet helmet's helmets helmsman help helped helper helpers helpful helpfully helpfulness helping helpless helplessly helplessness helpmate helps helsinki helter hem hem's hemisphere hemisphere's hemispheres hemispherical hemlock hemlock's hemlocks hemoglobin hemorrhoid hemostat hemostats hemp hempen hems hen hen's hence henceforth henchman henchmen henpeck hens hepatitis hepatitus her herald heralded heralding heralds herb herb's herbivore herbivores herbivorous herbs herd herded herder herders herding herds here here's hereabout hereabouts hereafter hereby hereditary heredity herein hereinafter hereof heres heresy heretic heretic's heretics hereto heretofore hereunder herewith heritage heritages hermetic hermetically hermit hermit's hermitian hermits hero heroes heroic heroically heroics heroin heroine heroine's heroines heroism heron heron's herons herpes herring herring's herrings hers herself hertz hesitant hesitantly hesitate hesitated hesitates hesitating hesitatingly hesitation hesitations heterogeneity heterogeneous heterogeneously heterogeneousness heterogenous heterosexual heterosexuality heterosexually heterosexuals heuristic heuristic's heuristically heuristics hew hewed hewer hews hex hexadecimal hexadecimally hexagon hexagonal hexagonally hexagons hey hi hibernate hick hickory hid hidden hide hideous hideously hideousness hideout hideout's hideouts hides hiding hierarchal hierarchic hierarchical hierarchically hierarchies hierarchy hierarchy's high higher highest highland highlander highlands highlight highlighted highlighting highlights highly highness highness's highnesses highway highway's highwayman highwaymen highways hijack hijacked hijacking hike hiked hiker hikes hiking hilarious hilariously hilarity hill hill's hillbilly hillock hills hillside hillsides hilltop hilltop's hilltops hilly hilt hilt's hilton hilton's hilts him himself hind hinder hindered hindering hinders hindrance hindrances hindsight hindu hindus hinge hinged hinges hint hinted hinting hints hip hip's hippies hippo hippopotamus hippos hips hiragana hire hired hirer hirers hires hiring hirings hirsute his hiss hissed hisses hissing histogram histogram's histograms historian historian's historians historic historical historically histories history history's hit hit's hitch hitched hitchhike hitchhiked hitchhiker hitchhikers hitchhikes hitchhiking hitching hither hitherto hits hitter hitter's hitters hitting hive hoar hoard hoarder hoarding hoariness hoarse hoarsely hoarseness hoary hobbies hobble hobbled hobbles hobbling hobby hobby's hobbyhorse hobbyist hobbyist's hobbyists hoc hockey hodgepodge hoe hoe's hoes hog hog's hogging hogs hoist hoisted hoisting hoists hold holden holder holder's holders holding holdings holds hole holed holes holiday holiday's holidays holies holiness holistic holland hollow hollowed hollowing hollowly hollowness hollows holly hollywood holocaust hologram hologram's holograms holographic holy homage home homed homeless homely homemade homemaker homemaker's homemakers homeomorphic homeomorphism homeomorphism's homeomorphisms homeopath homeowner homer homers homes homesick homesickness homespun homestead homesteader homesteaders homesteads hometown homeward homewards homework homicidal homicide homing homo homogeneities homogeneity homogeneity's homogeneous homogeneously homogeneousness homomorphic homomorphism homomorphism's homomorphisms homosexual homosexuality homosexuals honchos honduras hone honed honer hones honest honestly honesty honey honeybee honeycomb honeycombed honeydew honeymoon honeymooned honeymooner honeymooners honeymooning honeymoons honeysuckle honing honolulu honor honorable honorableness honorably honoraries honorarium honorary honored honorer honoring honors hood hooded hoodlum hoods hoodwink hoodwinked hoodwinking hoodwinks hoof hoof's hoofs hook hooked hooker hookers hooking hooks hookup hookups hoop hooper hoops hoot hooted hooter hooting hoots hooves hop hope hoped hopeful hopefully hopefulness hopefuls hopeless hopelessly hopelessness hopes hoping hopper hopper's hoppers hopping hops horde horde's hordes horizon horizon's horizons horizontal horizontally hormone hormone's hormones horn hornbills horned hornet hornet's hornets horns horny horological horrendous horrendously horrible horribleness horribly horrid horridly horrific horrified horrifies horrify horrifying horror horror's horrors horse horse's horseback horseflesh horsefly horseman horseplay horsepower horses horseshoe horseshoer horticulture hose hose's hoses hospitable hospitably hospital hospital's hospitality hospitalize hospitalized hospitalizes hospitalizing hospitals host host's hostage hostage's hostages hosted hostess hostess's hostesses hostile hostilely hostilities hostility hosting hosts hosts' hot hotcakes hotel hotel's hotels hothead hotly hotness hotter hottest hound hounded hounding hounds hour hour's hourglass hourly hours hours' house house's houseboat housebroken housed houseflies housefly housefly's household householder householders households housekeeper housekeeper's housekeepers housekeeping houses housetop housetop's housetops housewife housewifely housewives housework housing houston hovel hovel's hovels hover hovered hovering hovers how however howl howled howler howling howls howsoever hub hub's hubris hubs huddle huddled huddling hue hue's hues hug huge hugely hugeness hugged hugging hugs huh hull hull's hulls hum human humane humanely humaneness humanists humanitarian humanities humanity humanity's humanized humanly humanness humans humble humbled humbleness humbler humblest humbling humbly humbug humerus humid humidification humidified humidifier humidifiers humidifies humidify humidifying humidity humidly humiliate humiliated humiliates humiliating humiliation humiliations humility hummed humming hummingbird hummingbirds hummus humor humored humorer humorers humoring humorous humorously humorousness humors hump humpback humped hums hun hunch hunched hunches hundred hundredfold hundreds hundredth hundredths hung hungarian hungary hunger hungered hungering hungers hungrier hungriest hungrily hungry hunk hunk's hunks hunt hunted hunter hunters hunting hunts huntsman hurdle hurl hurled hurler hurlers hurling hurrah hurricane hurricane's hurricanes hurried hurriedly hurries hurry hurrying hurt hurting hurtingly hurtle hurtling hurts husband husband's husbandry husbands hush hushed hushes hushing husk husked husker huskiness husking husks husky hustle hustled hustler hustles hustling hut hut's hutch huts hyacinth hybrid hybridity hybrids hydra hydrant hydraulic hydraulically hydro hydrodynamic hydrodynamics hydrofoils hydrogen hydrogen's hydrogens hyena hyenas hygiene hymen hymn hymn's hymns hype hyper hyperbola hyperbolic hypercube hypercubes hyperlink hyperlink's hyperlinks hypermedia hypertext hyphen hyphen's hyphenate hyphenated hyphenates hyphenating hyphenation hyphenations hyphens hypnosis hypnotic hypocrisies hypocrisy hypocrite hypocrite's hypocrites hypodermic hypodermics hypotheses hypothesis hypothesize hypothesized hypothesizer hypothesizes hypothesizing hypothetical hypothetically hyrax hysteresis hysterical hysterically i i'd i'll i'm i's i've ibex ibexes ibid ibis ibm ibm's ice iceberg iceberg's icebergs icebox iced iceland ices icicle icicles iciness icing icings icon icon's iconoclasm iconoclast icons icosahedra icosahedral icosahedron icy id idea idea's ideal idealism idealistic idealization idealization's idealizations idealize idealized idealizes idealizing ideally ideals ideas idem idempotency idempotent identical identically identifiable identifiably identification identifications identified identifier identifiers identifies identify identifying identities identity identity's ideological ideologically ideologies ideology idiocy idiom idiomatic idiomatically idioms idiosyncracies idiosyncracy idiosyncrasies idiosyncrasy idiosyncrasy's idiosyncratic idiot idiot's idiotic idiots idle idled idleness idler idlers idles idlest idling idly idol idol's idolatry idols ieee ieee's if ifip igloo ignite ignition ignoble ignominious ignoramus ignoramuses ignorance ignorant ignorantly ignore ignored ignores ignoring ii iii ill illegal illegalities illegality illegally illegitimate illicit illicitly illinois illiteracy illiterate illness illness's illnesses illogical illogically ills illuminate illuminated illuminates illuminating illumination illuminations illusion illusion's illusions illusive illusively illusory illustrate illustrated illustrates illustrating illustration illustrations illustrative illustratively illustrator illustrator's illustrators illustrious illustriousness illy image imagery images imaginable imaginably imaginary imagination imagination's imaginations imaginative imaginatively imagine imagined imagines imaging imagining imaginings imbalance imbalances imbecile imbibe imitate imitated imitates imitating imitation imitations imitative immaculate immaculately immaterial immaterially immature immaturely immaturity immeasurably immediacies immediacy immediate immediately immemorial immense immensely immenseness immensity immerse immersed immerses immersion immigrant immigrant's immigrants immigrate immigrated immigrates immigrating immigration imminent imminently immodest immoral immortal immortality immortally immovability immovable immovably immune immunities immunity immunity's immunization immutable imp impact impacted impacting impaction impactor impactor's impactors impacts impair impaired impairing impairment impairs impala impalas impale impart imparted impartial impartially imparts impasse impassioned impassive impatience impatient impatiently impeach impeached impeccable impeccably impedance impedance's impedances impede impeded impedes impediment impediment's impediments impeding impel impelled impelling impend impending impenetrability impenetrable impenetrably imperative imperatively imperatives imperceivable imperceptible imperceptibly imperfect imperfection imperfection's imperfections imperfectly imperial imperialism imperialist imperialist's imperialists imperil imperiled imperious imperiously impermanence impermanent impermeable impermissible impersonal impersonally impersonate impersonated impersonates impersonating impersonation impersonations impertinent impertinently impervious imperviously impetuous impetuously impetus impinge impinged impinges impinging impious implacable implant implanted implanting implants implausible implement implementability implementable implementation implementation's implementations implemented implementer implementer's implementers implementing implementor implementor's implementors implements implicant implicant's implicants implicate implicated implicates implicating implication implications implicit implicitly implicitness implied implies implore implored imploring imply implying impolite import importance important importantly importation imported importer importers importing imports impose imposed imposes imposing imposition imposition's impositions impossibilities impossibility impossible impossibly imposter impostor impostor's impostors impotence impotent impound impoverish impoverished impoverishment impracticable impractical impracticality impractically imprecise imprecisely imprecision impregnable impregnate impress impressed impresser impresses impressible impressing impression impression's impressionable impressionist impressionistic impressions impressive impressively impressiveness impressment imprimatur imprint imprinted imprinting imprints imprison imprisoned imprisoning imprisonment imprisonment's imprisonments imprisons improbable improbably impromptu improper improperly impropriety improve improved improvement improvements improves improving improvisate improvisation improvisation's improvisational improvisations improvise improvised improviser improvisers improvises improvising imprudent imps impudent impudently impugn impulse impulses impulsion impulsive impunity impure impurities impurity impurity's impute imputed in inabilities inability inaccessibility inaccessible inaccuracies inaccuracy inaccurate inaccurately inaction inactivate inactive inactivity inadequacies inadequacy inadequate inadequately inadequateness inadmissibility inadmissible inadvertent inadvertently inadvisable inalienable inalterable inane inanimate inanimately inapplicable inapproachable inappropriate inappropriately inappropriateness inasmuch inattention inaudible inaugural inaugurate inaugurated inaugurating inauguration inauspicious inboard inbound inbreed incalculable incandescent incantation incapable incapacitate incapacitating incarcerate incarnate incarnation incarnation's incarnations incendiaries incendiary incense incensed incenses incentive incentive's incentives inception incessant incessantly incest incestuous inch inched inches inching incidence incident incident's incidental incidentally incidentals incidents incinerate incipient incisive incite incited incites inciting inclement inclination inclination's inclinations incline inclined inclines inclining inclose inclosed incloses inclosing include included includes including inclusion inclusion's inclusions inclusive inclusively inclusiveness incoherent incoherently income incomes incoming incommensurable incommensurate incommunicable incomparability incomparable incomparably incompatibilities incompatibility incompatibility's incompatible incompatibly incompetence incompetent incompetent's incompetents incomplete incompletely incompleteness incomprehensibility incomprehensible incomprehensibly incomprehension incompressible incomputable inconceivable inconclusive incongruity incongruous inconsequential inconsequentially inconsiderable inconsiderate inconsiderately inconsiderateness inconsistencies inconsistency inconsistency's inconsistent inconsistently inconspicuous incontestable incontrovertible incontrovertibly inconvenience inconvenienced inconveniences inconveniencing inconvenient inconveniently inconvertible incorporate incorporated incorporates incorporating incorporation incorrect incorrectly incorrectness incorrigible increase increased increases increasing increasingly incredible incredibly incredulity incredulous incredulously increment incremental incrementally incremented incrementer incrementing increments incriminate incriminated incriminates incriminating incrimination incubate incubated incubates incubating incubation incubator incubator's incubators inculcate incumbent incur incurable incurred incurring incurs incursion indebted indebtedness indecent indecipherable indecision indecisive indeed indefatigable indefensible indefinite indefinitely indefiniteness indelible indemnity indent indentation indentation's indentations indented indenting indents indenture independence independency independent independently independents indescribable indestructible indeterminacies indeterminacy indeterminacy's indeterminate indeterminately index indexable indexed indexes indexing india indian indian's indiana indianapolis indians indicant indicants indicate indicated indicates indicating indication indications indicative indicatively indicatives indicator indicator's indicators indices indict indicted indictment indictment's indictments indifference indifferent indifferently indigenous indigenously indigenousness indigestible indigestion indignant indignantly indignation indignities indignity indigo indirect indirected indirecting indirection indirections indirectly indirects indiscreet indiscretion indiscriminate indiscriminately indispensability indispensable indispensably indisputable indistinct indistinguishable indistinguishably individual individual's individualism individualistic individuality individualize individualized individualizes individualizing individually individuals indivisibility indivisible indivisibly indoctrinate indoctrinated indoctrinates indoctrinating indoctrination indolent indolently indomitable indonesia indonesia's indonesian indonesians indoor indoors indorse indubitable induce induced inducement inducement's inducements inducer induces inducing induct inductance inductances inducted inductee inducting induction induction's inductions inductive inductively inductor inductor's inductors inducts indulge indulged indulgence indulgence's indulgences indulgent indulging industrial industrialism industrialist industrialist's industrialists industrialization industrialized industrially industrials industries industrious industriously industriousness industry industry's inebriated inebriation inedible ineffective ineffectively ineffectiveness ineffectual ineffectually inefficiencies inefficiency inefficient inefficiently inelegant ineligible inept ineptness inequalities inequality inequitable inequity inert inertia inertial inertly inertness inescapable inescapably inessential inestimable inevitabilities inevitability inevitable inevitably inexact inexcusable inexcusably inexhaustible inexorable inexorably inexpensive inexpensively inexperience inexperienced inexpert inexplicable inexplicably inextricably infallibility infallible infallibly infamous infamously infamy infancy infant infant's infantile infantry infantryman infantrymen infants infarct infatuate infeasible infect infected infecting infection infection's infections infectious infectiously infective infects infer inference inference's inferences inferential inferior inferior's inferiority inferiors infernal infernally inferno inferno's infernos inferred inferring infers infertile infest infested infesting infests infidel infidel's infidels infighting infiltrate infiltrating infinite infinitely infinitem infiniteness infinitesimal infinities infinitive infinitive's infinitives infinitude infinitum infinity infirm infirmary infirmity infix inflame inflamed inflammable inflammation inflammatory inflatable inflate inflated inflater inflates inflating inflation inflationary inflect inflected inflecting inflection inflections inflects inflexibility inflexible inflict inflicted inflicting inflicts inflow influence influenced influences influencing influential influentially influenza info inform informal informality informally informant informant's informants informatica information informational informations informative informatively informed informer informers informing informs infra infraction infractions infrared infrastructure infrequent infrequently infringe infringed infringement infringement's infringements infringes infringing infuriate infuriated infuriates infuriating infuriation infuse infused infuses infusing infusion infusions ingenious ingeniously ingeniousness ingenuity ingenuous ingest ingestion inglorious ingot ingrained ingrate ingratiate ingratitude ingredient ingredient's ingredients ingrown inhabit inhabitable inhabitance inhabitant inhabitant's inhabitants inhabited inhabiting inhabits inhale inhaled inhaler inhales inhaling inhere inherent inherently inheres inherit inheritable inheritance inheritance's inheritances inherited inheriting inheritor inheritor's inheritors inheritrices inheritrix inherits inhibit inhibited inhibiting inhibition inhibition's inhibitions inhibitor inhibitors inhibitory inhibits inhomogeneities inhomogeneity inhomogeneous inhospitable inhuman inhumane inimical inimitable iniquities iniquity iniquity's initial initialed initialing initializable initialization initialization's initializations initialize initialized initializer initializers initializes initializing initially initials initiate initiated initiates initiating initiation initiations initiative initiative's initiatives initiator initiator's initiators inject injected injecting injection injection's injections injective injects injudicious injunction injunction's injunctions injure injured injures injuries injuring injurious injury injury's injustice injustice's injustices ink inked inker inkers inking inkings inkling inkling's inklings inks inlaid inland inlay inlet inlet's inlets inline inmate inmate's inmates inmos inn innards innate innately inner innermost inning innings innocence innocent innocently innocents innocuous innocuously innocuousness innovate innovation innovation's innovations innovative inns innuendo innumerability innumerable innumerably inoculate inoperable inoperative inopportune inordinate inordinately inorganic input input's inputs inputting inquire inquired inquirer inquirers inquires inquiries inquiring inquiry inquiry's inquisition inquisition's inquisitions inquisitive inquisitively inquisitiveness inroad inroads insane insanely insanity insatiable inscribe inscribed inscribes inscribing inscription inscription's inscriptions inscrutable insect insect's insecticide insects insecure insecurely inseminate insensible insensitive insensitively insensitivity inseparability inseparable inseparably insert inserted inserting insertion insertion's insertions inserts inset inside insider insiders insides insidious insidiously insidiousness insight insight's insightful insights insignia insignificance insignificant insincere insinuate insinuated insinuates insinuating insinuation insinuations insipid insist insisted insistence insistent insistently insisting insists insofar insolence insolent insolently insoluble insolvable insolvent insomnia insomniac inspect inspected inspecting inspection inspection's inspections inspector inspector's inspectors inspects inspiration inspiration's inspirations inspire inspired inspirer inspires inspiring instabilities instability install installable installation installation's installations installed installer installers installing installment installment's installments installs instance instances instant instantaneous instantaneously instanter instantiate instantiated instantiates instantiating instantiation instantiation's instantiations instantly instants instead instigate instigated instigates instigating instigator instigator's instigators instill instinct instinct's instinctive instinctively instincts instinctual institute instituted instituter instituters institutes instituting institution institutional institutionalize institutionalized institutionalizes institutionalizing institutionally institutions instruct instructed instructing instruction instruction's instructional instructions instructive instructively instructor instructor's instructors instructs instrument instrumental instrumentalist instrumentalist's instrumentalists instrumentally instrumentals instrumentation instrumented instrumenting instruments insubordinate insufferable insufficiencies insufficiency insufficient insufficiently insular insulate insulated insulates insulating insulation insulator insulator's insulators insulin insult insulted insulting insults insuperable insupportable insurance insure insured insurer insurers insures insurgent insurgent's insurgents insuring insurmountable insurrection insurrection's insurrections intact intake intangible intangible's intangibles integer integer's integers integrable integral integral's integrals integrand integrate integrated integrates integrating integration integrations integrative integrator integrity intel intellect intellect's intellects intellectual intellectually intellectuals intelligence intelligent intelligently intelligentsia intelligibility intelligible intelligibly intelsat intemperate intend intended intending intends intense intensely intensification intensified intensifier intensifiers intensifies intensify intensifying intensities intensity intensive intensively intent intention intentional intentionally intentioned intentions intently intentness intents inter interact interacted interacting interaction interaction's interactions interactive interactively interactivity interacts interarrival interblock intercept intercepted intercepting interception interceptor intercepts interchange interchangeability interchangeable interchangeably interchanged interchanger interchanges interchanging interchangings interchannel intercity interclass intercluster intercom intercommunicate intercommunicated intercommunicates intercommunicating intercommunication interconnect interconnectable interconnected interconnecting interconnection interconnection's interconnections interconnects interconsole intercontinental intercourse interdata interdependence interdependencies interdependency interdependent interdict interdisciplinary interdomain interest interested interesting interestingly interests interexchange interface interfaced interfacer interfaces interfacing interfere interfered interference interferences interferes interfering interferingly interferometer interferometers interferometric interferometry interframe intergroup interim interior interior's interiors interject interjected interjecting interjects interlace interlaced interlaces interlacing interlayer interleave interleaved interleaves interleaving interleavings interlevel interlink interlinked interlinks interlisp interlisp's interlocation interlock interlocked interlocking interlocks interloper interloper's interludes intermachine intermediary intermediate intermediate's intermediates interminable intermingle intermingled intermingles intermingling intermittent intermittently intermix intermixed intermixing intermodule intern internal internalize internalized internalizes internalizing internally internals international internationality internationally interned internet internet's internets internetwork internetworking internetworks interning internode interns interoffice interoperability interpersonal interplay interpolate interpolated interpolates interpolating interpolation interpolations interpose interposed interposes interposing interpret interpretability interpretable interpretation interpretation's interpretations interpreted interpreter interpreters interpreting interpretive interpretively interpretor interpretors interprets interprocess interprocessor interrecord interred interrelate interrelated interrelates interrelating interrelation interrelations interrelationship interrelationship's interrelationships interrogate interrogated interrogates interrogating interrogation interrogations interrogative interrogator interrupt interrupted interruptible interrupting interruption interruption's interruptions interruptive interrupts intersatellite intersect intersected intersecting intersection intersection's intersections intersector intersects intersperse interspersed intersperses interspersing interspersion interstage interstate interterminal interthread intertoll intertree intertwine intertwined intertwines intertwining interval interval's intervals intervene intervened intervenes intervening intervention intervention's interventions interview interviewed interviewee interviewer interviewers interviewing interviews interwork interworking interwoven intestate intestinal intestine intestine's intestines intimacy intimate intimated intimately intimating intimation intimations intimidate intimidated intimidates intimidating intimidation into intolerability intolerable intolerably intolerance intolerant intonation intonation's intonations intone intoxicant intoxicate intoxicated intoxicating intoxication intracell intracluster intracompany intractability intractable intractably intragroup intralata intraline intramachine intramural intramuscular intranet intranetwork intransigent intransitive intransitively intraoffice intraprocess intraprocessor intrastate intravenous intrepid intricacies intricacy intricate intricately intrigue intrigued intrigues intriguing intrinsic intrinsically introduce introduced introduces introducing introduction introduction's introductions introductory introspect introspection introspections introspective introvert introverted intrude intruded intruder intruder's intruders intrudes intruding intrusion intrusion's intrusions intrusive intrust intubate intubated intubates intubation intuition intuition's intuitionist intuitions intuitive intuitively inundate inundated invade invaded invader invaders invades invading invalid invalidate invalidated invalidates invalidating invalidation invalidations invalidities invalidity invalidly invalids invaluable invariable invariably invariance invariant invariantly invariants invasion invasion's invasions invent invented inventing invention invention's inventions inventive inventively inventiveness inventor inventor's inventories inventors inventory inventory's invents inverse inversely inverses inversion inversions invert invertebrate invertebrate's invertebrates inverted inverter inverters invertible inverting inverts invest invested investigate investigated investigates investigating investigation investigations investigative investigator investigator's investigators investigatory investing investment investment's investments investor investor's investors invests inveterate invincible invisibility invisible invisibly invitation invitation's invitations invite invited invites inviting invocable invocation invocation's invocations invoice invoiced invoices invoicing invokable invoke invoked invoker invokers invokes invoking involuntarily involuntary involuted involve involved involvement involvement's involvements involves involving inward inwardly inwardness inwards io iodine ion ionosphere ionospheric ions iota iowa iran iraq irate irately irateness ire ire's ireland ireland's ires iridium iris irish irk irked irking irks irksome iron ironed ironic ironical ironically ironies ironing ironings irons irony irradiate irrational irrationally irrationals irrecoverable irreducible irreducibly irreflexive irrefutable irregular irregularities irregularity irregularly irregulars irrelevance irrelevances irrelevancies irrelevant irrelevantly irreplaceable irrepressible irreproducibility irreproducible irresistable irresistible irrespective irrespectively irresponsible irresponsibly irretrievably irreverent irreversibility irreversible irreversibly irrevocable irrevocably irrigate irrigated irrigates irrigating irrigation irritable irritant irritate irritated irritates irritating irritation irritations is isdn islam islamic island islander islanders islands isle isle's isles islet islet's islets isn't iso isolate isolated isolates isolating isolation isolations isometric isomorphic isomorphically isomorphism isomorphism's isomorphisms isotope isotope's isotopes israel israeli israelis issuance issue issued issuer issuers issues issuing istanbul isthmus it it'll it's italian italian's italians italic italicity italicize italicized italicizes italicizing italics italy itch itches itching item item's itemization itemization's itemizations itemize itemized itemizes itemizing items iterate iterated iterates iterating iteration iterations iterative iteratively iterator iterator's iterators ithaca itineraries itinerary its itself iv ivies ivory ivy ivy's ix j j's jab jab's jabbed jabbing jabs jack jackal jackals jackass jacket jacketed jackets jacking jackknife jackpot jackpots jacks jade jaded jagged jaguar jail jailed jailer jailers jailing jails jam jammed jamming jams jan janitor janitor's janitors januaries january january's japan japanese jar jar's jargon jarred jarring jarringly jars jaundice jaunt jaunt's jauntiness jaunts jaunty javelin javelin's javelins jaw jaw's jawbone jaws jay jazz jazzy jealous jealousies jealously jealousy jean jean's jeans jeep jeep's jeeps jeer jeer's jeers jellies jelly jelly's jellyfish jenny jeopardize jeopardized jeopardizes jeopardizing jeopardy jerk jerked jerkiness jerking jerkings jerks jerky jersey jersey's jerseys jerusalem jest jested jester jesting jests jet jet's jetliner jets jetted jetting jew jewel jeweled jeweler jewelries jewelry jewels jewish jews jiffy jig jig's jigs jigsaw jill jingle jingled jingling jitter jitterbug jittery job job's jobs jockey jockeying jockstrap jocund jog jogging jogs join joined joiner joiners joining joins joint joint's jointly joints joke joked joker jokers jokes joking jokingly jolly jolt jolted jolting jolts jonquil jordan jordanian jordanians jostle jostled jostles jostling jot jots jotted jotting jotto joule journal journal's journalism journalist journalist's journalists journalize journalized journalizes journalizing journals journey journeyed journeying journeyings journeyman journeymen journeys joust jousted jousting jousts jovial jowl joy joy's joyful joyfully joyous joyously joyousness joyride joys joystick joysticks jubilee judge judged judgement judgements judges judging judgment judgment's judgmental judgments judical judicial judiciary judicious judiciously judo jug jug's juggle juggled juggler jugglers juggles juggling jugs juice juice's juices juiciest juicy jukeboxes julies july july's jumble jumbled jumbles jumbo jump jumped jumper jumpers jumping jumps jumpy junction junction's junctions juncture juncture's junctures june jungle jungle's jungles junior junior's juniors juniper junk junker junkers junkies junks junky junta jure juries jurisdiction jurisdiction's jurisdictions juror juror's jurors jury jury's just justice justice's justices justifiable justifiably justification justifications justified justifier justifier's justifiers justifies justify justifying justly justness jut jutting juvenile juvenile's juveniles juxtapose juxtaposed juxtaposes juxtaposing k k's kamikaze kangaroo kangaroos kanji kansas kappa karate katakana kbps kbyte kbytes kebab keel keeled keeling keels keen keener keenest keenly keenness keep keeper keepers keeping keeps kelvin ken kennel kennel's kennels kentucky kenya kenya's kenyan kenyans kepler's kept kerberos kerchief kerchief's kerchiefs kern kernel kernel's kernels kerosene ketchup kettle kettle's kettles kewpie key key's keyboard keyboard's keyboards keyed keyhole keying keynote keypad keypad's keypads keys keystone keystroke keystroke's keystrokes keyword keyword's keywords kgb kgb's kibbutz kibbutzim kibbutzniks kick kicked kicker kickers kicking kickoff kicks kid kid's kidded kiddie kidding kidnap kidnapper kidnapper's kidnappers kidnapping kidnapping's kidnappings kidnaps kidney kidney's kidneys kids kill killed killer killers killing killingly killings killjoy kills kilo kilobaud kilobit kilobits kiloblock kilobyte kilobytes kilogram kilograms kilohertz kilohm kilojoule kilometer kilometers kiloton kilovolt kilowatt kilowatts kiloword kimono kimonos kin kind kinder kindergarten kindest kindhearted kindle kindled kindles kindling kindly kindness kindred kinds kinetic king kingdom kingdom's kingdoms kingly kingpin kings kink kinky kinship kinsman kiosk kiosks kiss kissed kisser kissers kisses kissing kit kit's kitchen kitchen's kitchenette kitchens kite kited kites kiting kits kitten kitten's kittenish kittens kitty klaxon kludge kludges klystron km knack knapsack knapsack's knapsacks knave knave's knaves knead kneads knee kneecap kneed kneeing kneel kneeled kneeling kneels knees knell knell's knells knelt knew knife knifed knifes knifing knight knighted knighthood knighting knightly knights knit knits knives knob knob's knobs knock knockdown knocked knocker knockers knocking knockout knocks knoll knoll's knolls knot knot's knots knotted knotting knotty know knowable knower knowhow knowing knowingly knowledgable knowledge knowledgeable known knows knuckle knuckled knuckles koala koalas kodak kookaburras kopeck kopecks korea korean kosher kremlin kudo l l's lab lab's label labeled labeling labelled labeller labeller's labellers labelling labels labor laboratories laboratory laboratory's labored laborer laborers laboring laborings laborious laboriously laboriousness labors labour labs labs' labyrinth labyrinths lace laced lacerate lacerated lacerates lacerating laceration lacerations laces lacing lack lacked lackey lacking lacks lacquer lacquered lacquers lad ladder laden ladies ladies' lading ladle lads lady lady's ladylike lag lager lagers lagged lagging lagoon lagoon's lagoons lagrangian lags laid lain lair lair's lairs laissez lake lake's lakes lamb lamb's lambda lambda's lambdas lambert lambs lame lamed lamely lameness lament lamentable lamentation lamentation's lamentations lamented lamenting laments lames laminar laming lamp lamp's lamplight lampoon lamprey lamps lance lanced lancer lances land landed lander landers landfill landing landings landladies landlady landlady's landlord landlord's landlords landmark landmark's landmarks landowner landowner's landowners lands landsat landscape landscaped landscapes landscaping landslide lane lane's lanes language language's languages languid languidly languidness languish languished languishes languishing lantern lantern's lanterns lap lap's lapb lapel lapel's lapels lapland lapping lapps laps lapse lapsed lapses lapsing laptop lard larder large largely largeness larger largest lark lark's larks larva larvae larynx lascivious laser laser's lasers lash lashed lashes lashing lashings lass lass's lasses lasso last lasted lasting lastly lasts latch latched latches latching late latecomers lately latency lateness latent latently later lateral laterally latest lathe latin latitude latitude's latitudes latrine latrine's latrines latter latter's latterly lattice lattice's lattices laudable laugh laughable laughably laughed laughing laughingly laughingstock laughs laughter launch launched launcher launches launching launchings launder laundered launderer launderers laundering launderings launders laundry laureate laurel laurel's laurels lava lavatories lavatory lavatory's lavender lavish lavished lavishing lavishly law law's lawbreaker lawful lawfully lawgiver lawless lawlessness lawn lawn's lawns laws lawsuit lawsuit's lawsuits lawyer lawyer's lawyers lax laxative laxity lay layer layer's layered layering layers laying layman laymen layoff layoffs layout layout's layouts lays lazed lazier laziest lazily laziness lazing lazy lazybones lead leaded leaden leader leaders leadership leadership's leaderships leading leadings leads leaf leafed leafiest leafing leafless leaflet leaflet's leaflets leafy league leagued leaguer leaguers leagues leak leakage leakage's leakages leaked leaking leaks leaky lean leaned leaner leanest leaning leanness leans leap leaped leapfrog leaping leaps leapt learn learned learner learners learning learns lease leased leases leash leash's leashes leasing least leather leathered leathern leatherneck leathers leave leaved leaven leavened leavening leaves leaving leavings lebanon lechery lecture lectured lecturer lecturers lectures lecturing led ledge ledger ledgers ledges leds lee leech leech's leeches leek leeks leer leery lees leeward leeway left leftist leftist's leftists leftmost leftover leftover's leftovers leftward leftwards leg legacies legacy legacy's legal legalistic legality legalization legalize legalized legalizes legalizing legally legend legend's legendary legends leger legers legged legging leggings legibility legible legibly legion legion's legions legislate legislated legislates legislating legislation legislative legislator legislator's legislators legislature legislature's legislatures legitimacy legitimate legitimately legless legs legume leisure leisured leisureliness leisurely lemma lemma's lemmas lemming lemmings lemon lemon's lemonade lemons lend lender lenders lending lends length lengthen lengthened lengthening lengthens lengthly lengths lengthwise lengthy leniency lenient leniently leningrad lens lens's lenses lent lenten lentil lentil's lentils leopard leopard's leopards leper lepidoptera leprosy les leslie leslie's less lessen lessened lessening lessens lesser lesson lesson's lessons lessor lest lester let let's letdown lethal lets letter letterbox lettered letterer letterhead lettering letters letting lettuce leukemia levee levee's levees level level's leveled leveler leveling levelled leveller levellest levelling levelly levelness levels lever lever's leverage levers levied levies levitated levy levying lewd lewdly lewdness lexical lexically lexicographic lexicographical lexicographically lexicon lexicon's lexicons liabilities liability liability's liable liaison liaison's liaisons liar liar's liars lib libel libelous liberal liberalization liberalize liberalized liberalizes liberalizing liberally liberals liberate liberated liberates liberating liberation liberator liberator's liberators libertarian liberties liberty liberty's libido librarian librarian's librarians libraries library library's libretto libya lice license licensed licensee licenses licensing licensor lichen lichen's lichens lick licked licking licks licorice lid lid's lids lie liechtenstein lied liege lien lien's liens lies lieu lieutenant lieutenant's lieutenants life lifeblood lifeboat lifeguard lifeguards lifeless lifelessness lifelike lifelong lifer lifespan lifestyle lifestyles lifetime lifetime's lifetimes lift lifted lifter lifters lifting lifts ligament ligature light light's lighted lighten lightens lighter lighter's lighters lightest lightface lighthearted lighthouse lighthouse's lighthouses lighting lightly lightness lightning lightning's lightnings lights lightweight like liked likelier likeliest likelihood likelihoods likeliness likely liken likened likeness likeness's likenesses likening likens likes likewise liking lilac lilac's lilacs lilies lily lily's limb limber limbo limbs lime lime's limelight limes limestone limit limitability limitably limitation limitation's limitations limited limiter limiters limiting limitless limits limousine limp limped limping limply limpness limps linchpin lincoln linden line line's linear linearities linearity linearizable linearization linearizations linearize linearized linearizes linearizing linearly lined linefeed linefeeds linen linen's linens liner liners lines lineup linger lingered lingerie lingering lingers lingo lingua linguist linguist's linguistic linguistically linguistics linguists lining linings link linkage linkage's linkages linked linker linker's linkers linking links linnaeus linoleum linseed lint lion lion's lioness lioness's lionesses lions lip lip's lips lipstick liquid liquid's liquidation liquidation's liquidations liquidity liquids liquified liquifier liquifiers liquifies liquify liquifying liquor liquor's liquors lira lisbon lisp lisp's lisped lisping lisps list listed listen listened listener listeners listening listens lister listers listing listing's listings lists lit litanies litany liter literacy literal literally literalness literals literary literate literature literature's literatures liters lithe lithograph lithography litigant litigate litigation litigious litmus litter litterbug littered littering litters little littleness littler littlest livable livably live lived livelihood lively liveness liver liveried livers livery lives livestock livid living lizard lizard's lizards lo load loadable loaded loader loader's loaders loading loadings loads loaf loafed loafer loan loaned loaning loans loath loathe loathed loathing loathly loathsome loaves lobbied lobbies lobby lobbying lobbyists lobe lobe's lobes lobster lobster's lobsters local localities locality locality's localization localize localized localizes localizing locally locals locatable locate located locates locating location locations locative locatives locator locator's locators loci lock locked locker lockers locking lockings lockout lockout's lockouts locks locksmith lockstep lockup lockup's lockups locomotion locomotive locomotive's locomotives locus locust locust's locusts lodge lodged lodger lodges lodging lodgings loft loft's loftiness lofts lofty log log's logarithm logarithm's logarithmic logarithmically logarithms logged logger logger's loggers logging logic logic's logical logically logician logician's logicians logics login logins logistic logistics logjam logo logs loin loin's loincloth loins loiter loitered loiterer loitering loiters london lone lonelier loneliest loneliness lonely loner loners lonesome long longed longer longest longevity longhand longing longings longitude longitude's longitudes longs longstanding look lookahead looked looker lookers looking lookout looks lookup lookup's lookups loom loomed looming looms loon loop loopback looped loophole loophole's loopholes looping loops loose loosed looseleaf loosely loosen loosened looseness loosening loosens looser looses loosest loosing loot looted looter looting loots lopsided lord lordly lords lordship lore lorry los lose loser losers loses losing loss loss's losses lossier lossiest lossless lossy lost lot lot's lotion lots lottery lotus loud louder loudest loudly loudness loudspeaker loudspeaker's loudspeakers louisiana louisville lounge lounged lounges lounging louse lousy lovable lovably love loved lovelier lovelies loveliest loveliness lovelorn lovely lover lovers loves loving lovingly low lower lowered lowering lowers lowest lowland lowlands lowliest lowly lowness lows loyal loyally loyalties loyalty loyalty's lubricant lubricant's lubricate lubrication lucid lucidly lucifer luck lucked luckier luckiest luckily luckless lucks lucky lucrative ludicrous ludicrously ludicrousness luggage lukewarm lull lullaby lulled lulls lumber lumbered lumbering lumberjacks luminance luminous luminously lummox lump lumped lumping lumps lumpy lunar lunatic lunch lunched luncheon luncheon's luncheons lunches lunching lung lunged lungs lurch lurched lurches lurching lure lured lures luring lurk lurked lurking lurks luscious lusciously lusciousness lush lust luster lustful lustily lustiness lustrous lusts lusty lute lute's lutes luther luxemburg luxuriant luxuriantly luxuries luxurious luxuriously luxury luxury's lying lymph lynch lynched lyncher lynches lynx lynx's lynxes lyre lyric lyrics m m's ma'am macbeth mace maced maces machination machinations machine machine's machined machinelike machinery machines machines' machining machmanga macho macintosh mackerel macro macro's macroeconomics macroinstruction macroinstructions macromolecule macromolecule's macromolecules macrophage macros macroscopic mad madam madden maddening madder maddest made mademoiselle madhouse madison madly madman madmen madness madras madrid maestro mafia magazine magazine's magazines magenta maggot maggot's maggots magic magical magically magician magician's magicians magistrate magistrate's magistrates magna magnesium magnet magnetic magnetically magnetism magnetism's magnetisms magnetizable magnetized magneto magnification magnificence magnificent magnificently magnified magnifier magnifies magnify magnifying magnitude magnitude's magnitudes magnolia magnum magpie mahogany maid maiden maidens maids mail mailable mailbox mailbox's mailboxes mailed mailer mailing mailings mailman mailmen mails maim maimed maiming maims main maine mainframe mainframe's mainframes mainland mainline mainly mains mainstay mainstream maintain maintainability maintainable maintained maintainer maintainer's maintainers maintaining maintains maintenance maintenance's maintenances maize majestic majesties majesty majesty's major majored majoring majorities majority majority's majors makable make maker makers makes makeshift makeup makeups making makings maladies malady malady's malaria malcontent male male's malefactor malefactor's malefactors maleness males malevolent malformed malfunction malfunctioned malfunctioning malfunctions malice malicious maliciously maliciousness malign malignant malignantly mallard mallet mallet's mallets malnutrition malpractice malt malta malted malteds maltese maltless malts mama mamma mamma's mammal mammal's mammalian mammals mammas mammoth man man's manage manageability manageable manageableness managed management management's managements manager manager's managerial managers manages managing manchester mandarin mandate mandated mandates mandating mandatorily mandatory mandible mane mane's manes maneuver maneuvered maneuvering maneuvers manganese manger manger's mangers mangle mangled mangler mangles mangling mango manhattan manhole manhood mania maniac maniac's maniacs manic manicure manicured manicures manicuring manifest manifestation manifestation's manifestations manifested manifesting manifestly manifests manifold manifold's manifolds manila manioc manipulability manipulable manipulatable manipulate manipulated manipulates manipulating manipulation manipulations manipulative manipulator manipulator's manipulators manipulatory mankind manly manned manner mannered mannerly manners manning manometer manometer's manometers manor manor's manors manpower mans mansion mansion's mansions manslaughter mantel mantel's mantels mantis mantissa mantissa's mantissas mantle mantle's mantlepiece mantles manual manual's manually manuals manufacture manufactured manufacturer manufacturer's manufacturers manufactures manufacturing manure manuscript manuscript's manuscripts many maori maoris map map's maple maple's maples mappable mapped mapping mapping's mappings maps mar marabou marajuana marathon marble marbles marbling march marched marcher marches marching marconi mare mare's mares margarine margin margin's marginal marginally margins marigold marigolds marijuana marimba marina marinade marinate marine mariner marines marionette marital maritime mark markable marked markedly marker markers market marketability marketable marketed marketeers marketing marketings marketplace marketplace's marketplaces markets marking markings marks marksmanship markup marlin marmalade marmot maroon marquis marriage marriage's marriageable marriages married marries marrow marry marrying mars marsh marsh's marshal marshaled marshaling marshals marshes marshmallow mart marten martial martin martingale martini marts martyr martyr's martyrdom martyrs marvel marveled marvelled marvelling marvelous marvelously marvelousness marvels marxism maryland mascara masculine masculinely masculinity mash mashed mashes mashing mask maskable masked masker masking maskings masks masochist masochist's masochistic masochists mason mason's masonry masons masquerade masquerader masquerades masquerading mass massachusetts massacre massacred massacres massage massages massaging massed masses massing massive massively mast masted master master's mastercard mastered masterful masterfully mastering masterings masterly mastermind masterpiece masterpiece's masterpieces masters mastership mastery mastodon masts masturbate masturbated masturbates masturbating masturbation mat mat's match matchable matched matcher matchers matches matching matchings matchless mate mate's mated mater material materialize materialized materializes materializing materially materials materiel maternal maternally maternity mates math mathematical mathematically mathematician mathematician's mathematicians mathematics mating matings matriarch matriarchal matrices matriculate matriculation matrimonial matrimony matrix matroid matron matronly mats matted matter mattered matters mattress mattress's mattresses maturation mature matured maturely matures maturing maturities maturity maul mausoleum mauve maverick max maxim maxim's maxima maximal maximally maximize maximized maximizer maximizers maximizes maximizing maxims maximum maximums maxwell may maybe mayhap mayhem mayonnaise mayor mayor's mayoral mayors maze maze's mazes mbps me mead meadow meadow's meadows meager meagerly meagerness meal meal's meals mealtime mealy mean meander meandered meandering meanders meaner meanest meaning meaning's meaningful meaningfully meaningfulness meaningless meaninglessly meaninglessness meanings meanly meanness means meant meantime meanwhile measle measles measurable measurably measure measured measurement measurement's measurements measurer measures measuring meat meat's meats meaty mechanic mechanic's mechanical mechanically mechanics mechanism mechanism's mechanisms mechanization mechanization's mechanizations mechanize mechanized mechanizes mechanizing medal medal's medallion medallion's medallions medals meddle meddled meddler meddles meddling media median median's medians mediate mediated mediates mediating mediation mediations medic medic's medical medically medicinal medicinally medicine medicine's medicines medics medieval mediocre mediocrity meditate meditated meditates meditating meditation meditations meditative medium medium's mediums medley medusa meek meeker meekest meekly meekness meet meeting meetinghouse meetings meets megabaud megabit megabits megabyte megabytes megahertz megalomania megaton megavolt megawatt megaword megawords megohm melancholy melange melbourne mellon mellow mellowed mellowing mellowness mellows melodic melodies melodious melodiously melodiousness melodrama melodrama's melodramas melodramatic melody melody's melon melon's melons melt melted melting meltingly melts member member's members membership membership's memberships membrane memento memo memo's memoir memoirs memorabilia memorable memorableness memoranda memorandum memorial memorially memorials memories memorization memorize memorized memorizer memorizes memorizing memory memory's memoryless memos memphis men men's menace menaced menacing menagerie menarche mend mendacious mendacity mended mender mending mends menial menials mens menstruate menstruating menstruation mensurable mensuration mental mentalities mentality mentally mention mentionable mentioned mentioner mentioners mentioning mentions mentor mentor's mentors menu menu's menus meow mercantile mercenaries mercenariness mercenary mercenary's merchandise merchandiser merchandising merchant merchant's merchantanility merchants merciful mercifully merciless mercilessly mercurial mercury mercy mere merely merest merge merged merger mergers merges merging meridian meringue merit merited meriting meritorious meritoriously meritoriousness merits mermaid merrier merriest merrily merriment merry mesa mescaline mesh meshed meshes meshing meson mesquite mess message message's messages messed messenger messenger's messengers messes messiah messiahs messier messiest messieurs messily messiness messing messy met meta metabit metabits metabolic metabolism metacircular metacircularity metal metal's metalanguage metalanguages metallic metallization metallizations metallurgy metals metamathematical metamorphosis metanetwork metanotion metanotions metaphor metaphor's metaphorical metaphorically metaphors metaphysical metaphysically metaphysics metaproduction metaproductions metasyntax metasyntaxes metavariable mete meted meteor meteor's meteoric meteorite meteoritic meteorological meteorology meteors meter metering meters metes methane method method's methodical methodically methodicalness methodist methodist's methodists methodological methodologically methodologies methodologists methodology methodology's methods methods' meticulously meting metric metric's metrical metrically metrics metro metronome metropolis metropolitan mets mettle mettlesome mew mewed mews mexican mexico mezzo mhz miami miasma mica mice michigan micro microarchitect microarchitects microarchitecture microarchitectures microbial microbicidal microbicide microcell microcells microchannel microcode microcoded microcodes microcoding microcomputer microcomputer's microcomputers microcontrollers microcosm microcycle microcycles microeconomic microeconomics microelectronic microelectronics microfarad microfilm microfilm's microfilms microgramming microinstruction microinstruction's microinstructions microjump microjumps microkernel microkernel's microkernels microlevel micron microns microoperation microoperations microphone microphones microphoning microprocedure microprocedures microprocessing microprocessor microprocessor's microprocessors microprogram microprogram's microprogrammable microprogrammed microprogrammer microprogrammer's microprogrammers microprogramming microprograms micros microscope microscope's microscopes microscopic microscopy microsec microsecond microsecond's microseconds microstore microsystem microsystem's microsystems microsystems' microvax microvaxes microwave microwaves microword microwords mid midafternoon midcourse midday middle middleman middlemen middles middling midge midges midget midlevel midnight midnights midpoint midpoint's midpoints midrange midscale midsection midshipman midshipmen midst midstream midsts midsummer midsummer's midtown midway midweek midwest midwife midwinter midwives mien might mightier mightiest mightily mightiness mightn't mighty migrant migrate migrated migrates migrating migration migrations migratory mike milan mild milder mildest mildew mildly mildness mile mile's mileage miles milestone milestone's milestones militant militantly militarily militarism military militia milk milked milker milkers milkiness milking milkmaid milkmaid's milkmaids milks milkshakes milky mill milled millenia millenium millennium miller millet milliammeter milliampere millijoule millimeter millimeters millinery milling million millionaire millionaire's millionaires millions millionth millipede millipede's millipedes millisec millisecond milliseconds millivolt millivoltmeter milliwatt mills millstone millstone's millstones milton milwaukee mime mimeograph mimic mimicked mimicking mimics minaret mince minced mincemeat mincer mincers minces mincing mind minded mindful mindfully mindfulness minding mindless mindlessly minds mindset mine mined minefield miner mineral mineral's minerals miners mines minesweeper mingle mingled mingles mingling mini miniature miniature's miniatures miniaturization miniaturize miniaturized miniaturizes miniaturizing minibar minibus minibus' minibuses minicomputer minicomputer's minicomputers minima minimal minimally minimax minimization minimization's minimizations minimize minimized minimizer minimizers minimizes minimizing minimum mining minion minis minister minister's ministered ministering ministers ministries ministry ministry's minivan minix mink mink's minks minneapolis minnesota minnesota's minnow minnow's minnows minor minor's minoring minorities minority minority's minors minstrel minstrel's minstrels mint minted minter minting mints minuend minuet minus minuscule minuses minute minuted minutely minuteman minutemen minuteness minuter minutes mips miracle miracle's miracles miraculous miraculously mirage mire mired mires mirror mirrored mirroring mirrors mirth misanthrope misbehaving miscalculation miscalculation's miscalculations miscegenation miscellaneous miscellaneously miscellaneousness miscellanies miscellany mischief mischievious mischievous mischievously mischievousness misconception misconception's misconceptions misconstrue misconstrued misconstrues misdeclared misdefined misdelivered miser miserable miserableness miserably miseries miserly misers misery misery's misfit misfit's misfits misfortune misfortune's misfortunes misgiving misgivings misguided mishap mishap's mishaps mishmash misinserted misinsertion misinterpret misinterpretation misinterpretations misjudgment mislead misleading misleadingly misleads misled mismatch mismatched mismatches mismatching misnomer misplace misplaced misplaces misplacing misprint mispronunciation misrepresentation misrepresentation's misrepresentations misroute miss missed misses misshapen missile missile's missiles missing mission missionaries missionary missionary's missioner missions mississippi missive missouri misspell misspelled misspelling misspellings misspells missteps mist mistakable mistake mistaken mistakenly mistakes mistaking mistakion misted mister misters mistiness misting mistletoe mistress mistrust mistrusted mists misty mistype mistyped mistypes mistyping misunderstand misunderstander misunderstanders misunderstanding misunderstanding's misunderstandings misunderstands misunderstood misuse misused misuses misusing mit mit's miter mitigate mitigated mitigates mitigating mitigation mitigative mitten mitten's mittens mix mixed mixer mixers mixes mixing mixture mixture's mixtures mixup mnemonic mnemonic's mnemonically mnemonics moan moaned moans moat moat's moats mob mob's mobile mobility mobs mobster moccasin moccasin's moccasins mock mocked mocker mockery mocking mockingbird mocks mockup modal modalities modality modality's modally mode model modeled modeless modeling modelings models modem modems moderate moderated moderately moderateness moderates moderating moderation moderator modern modernistic modernity modernize modernized modernizer modernizing modernly modernness moderns modes modest modestly modesty modicum modifiability modifiable modification modifications modified modifier modifiers modifies modify modifying modula modular modularities modularity modularization modularize modularized modularizes modularizing modularly modulate modulated modulates modulating modulation modulations modulator modulator's modulators module module's modules moduli modulo modulus modus moist moisten moistly moistness moisture molar molasses mold molded molder molding molds mole molecular molecule molecule's molecules molehill moles molest molested molesting molests mollified mollify mollusk mollycoddle molten moment moment's momentarily momentariness momentary momentous momentously momentousness moments momentum mommy monad monadic monads monarch monarchies monarchs monarchy monarchy's monasteries monastery monastery's monastic monday monday's mondays monetarism monetary money moneyed moneymaker moneys mongolia mongoose mongrel monitor monitor's monitored monitoring monitors monk monk's monkey monkeyed monkeying monkeys monkeys' monkish monks monoalphabetic monochromatic monochrome monocotyledon monocular monogamous monogamy monogram monogram's monograms monograph monograph's monographes monographs monolith monolithic monologue monopolies monopolize monopolizing monopoly monopoly's monoprogrammed monoprogramming monostable monotheism monotone monotonic monotonically monotonicity monotonous monotonously monotonousness monotony monsoon monsoons monster monster's monsters monstrosities monstrosity monstrous monstrously monstrousness montana montana's month month's monthly months monument monument's monumental monumentally monuments moo mood mood's moodiness moods moody moon mooned mooning moonlight moonlighter moonlighting moonlike moonlit moons moonshine moor moored mooring moorings moors moose moot mooted mop moped mops moraine moral morale moralities morality morally morals morass morasses moratorium morbid morbidly morbidness more moreover mores moribund mormons morn morning mornings morocco moron morose morphine morphism morphisms morphological morphologically morphology morrow morse morsel morsel's morsels mortal mortality mortally mortals mortar mortared mortaring mortars mortem mortgage mortgage's mortgages mortician mortification mortified mortifies mortify mortifying mosaic mosaic's mosaics moscow moslem moslems mosque mosquito mosquitoes moss moss's mosses mossy most mostly motel motel's motels moth mothball mothballs mother mother's motherboard mothered motherer motherers motherhood mothering motherland motherless motherly mothers moths motif motif's motifs motion motioned motioning motionless motionlessly motionlessness motions motivate motivated motivates motivating motivation motivations motive motives motley motor motorcar motorcar's motorcars motorcycle motorcycle's motorcycles motoring motorist motorist's motorists motorize motorized motorizes motorizing motorola motors motto mottoes mould moulding moulds mound mounded mounds mount mountable mountain mountain's mountaineer mountaineering mountaineers mountainous mountainously mountains mounted mounter mounting mountings mounts mourn mourned mourner mourners mournful mournfully mournfulness mourning mourns mouse mouser mouses mousetrap mousy mouth mouthed mouthes mouthful mouthing mouthpiece mouths movable move moved movement movement's movements mover movers moves movie movie's movies moving movings mow mowed mower mowing mows mr ms mu much muck mucker mucking mucus mud muddied muddies muddiness muddle muddled muddlehead muddler muddlers muddles muddling muddy muesli muff muff's muffin muffin's muffins muffle muffled muffler muffles muffling muffs mufti mug mug's mugged mugging mugs mulatto mulberries mulberry mulberry's mule mule's mules mull mullah multi multiaccess multibillion multibit multiblock multibus multibyte multicast multicasting multicasts multicellular multicolored multicomputer multicomputers multicopy multicultural multidestination multidimensional multidrop multiframe multifunction multiheaded multihop multilateral multilayer multilayered multilevel multiline multilisp multimachine multimedia multimegabit multimicrocomputer multimillion multimode multinational multinationals multipacket multipage multipart multiparty multipass multipath multiple multiple's multiples multiplex multiplexed multiplexer multiplexers multiplexes multiplexing multiplexor multiplexor's multiplexors multiplicand multiplicand's multiplicands multiplication multiplications multiplicative multiplicatively multiplicatives multiplicity multiplied multiplier multipliers multiplies multiply multiplying multiprocess multiprocessing multiprocessor multiprocessor's multiprocessors multiprogram multiprogrammed multiprogramming multiprotocol multipurpose multiregister multiscreen multisector multisegment multiserver multistage multistep multitasking multithreaded multithreading multitude multitude's multitudes multiuser multivariate multivendor multiversion multiway multiword multiwords mumble mumbled mumbler mumblers mumbles mumbling mumblings mumbo mummies mummification mummy mummy's munch munched munching mundane mundanely mung munich municipal municipalities municipality municipality's municipally munition munitions mural murder murdered murderer murderers murdering murderous murderously murders murky murmur murmured murmurer murmuring murmurs muscle muscled muscles muscling muscular musculature muse mused muses museum museum's museums mush mushroom mushroomed mushrooming mushrooms mushy music musical musically musicals musician musicianly musicians musicology musing musings musk musket musket's muskets muskox muskoxen muskrat muskrat's muskrats musks muslim muslin mussel mussel's mussels must mustache mustached mustaches mustard muster mustiness mustn't musts musty mutability mutable mutableness mutandis mutant mutate mutated mutates mutating mutation mutations mutatis mutative mute muted mutely muteness mutes mutilate mutilated mutilates mutilating mutilation mutilations mutinies mutiny mutiny's mutt mutter muttered mutterer mutterers muttering mutters mutton mutual mutually muzzle muzzle's muzzles my myriad myrtle myself mysteries mysterious mysteriously mysteriousness mystery mystery's mystic mystic's mystical mystics mystification mystified mystifies mystify mystifying myth mythical mythologies mythology mythology's myths n n's nab nabla nablas nadir nag nag's nagged nagging nags nail nailed nailing nails nairobi naive naively naiveness naivete naked nakedly nakedness name nameable named nameless namelessly namely namer namers names namesake namesake's namesakes naming nanny nanoinstruction nanoinstructions nanoprogram nanoprogramming nanosec nanosecond nanoseconds nanostore nanostores nanoword nap nap's napkin napkin's napkins naps narcissus narcotic narcotics narrate narrated narrates narrating narration narrative narrative's narratives narrow narrowband narrowed narrower narrowest narrowing narrowly narrowness narrows nary nasa's nasal nasally nastier nasties nastiest nastily nastiness nasty natal nation nation's national nationalist nationalist's nationalists nationalities nationality nationality's nationalization nationalize nationalized nationalizes nationalizing nationally nationals nationhood nations nationwide native natively natives nativity natural naturalism naturalist naturalization naturally naturalness naturals nature nature's natured natures naught naughtier naughtily naughtiness naughty nausea nauseate nauseum naval navally navel navies navigable navigate navigated navigates navigating navigation navigator navigator's navigators navy navy's nay nazi nazi's nazis near nearby neared nearer nearest nearing nearly nearness nears nearsighted neat neater neatest neatly neatness nebraska nebula nebular nebulous necessaries necessarily necessary necessitate necessitated necessitates necessitating necessitation necessities necessity neck necking necklace necklace's necklaces neckline necks necktie necktie's neckties necrosis nectar need needed needful needing needle needled needler needlers needles needless needlessly needlessness needlework needling needn't needs needy negate negated negates negating negation negations negative negatively negatives negator negators neglect neglected neglecting neglects negligee negligence negligent negligible negotiable negotiate negotiated negotiates negotiating negotiation negotiations negro negroes neigh neighbor neighbor's neighborhood neighborhood's neighborhoods neighboring neighborly neighbors neighbors' neither nemesis neoclassic neon neonatal neophyte neophytes nepal nephew nephew's nephews nerve nerve's nerves nervous nervously nervousness nest nested nester nesting nestle nestled nestles nestling nests net net's nether netherlands nets netted netting nettle nettled network network's networked networking networks networks' neural neuritis neurological neurologically neurologist neurologists neuron neuron's neurons neuroses neurosis neurotic neuter neutral neutralities neutrality neutralize neutralized neutralizing neutrally neutrino neutrino's neutrinos neutron nevada never nevertheless new newark newborn newcomer newcomer's newcomers newer newest newly newlywed newness news newscast newsgroup newsletter newsletters newsman newsmen newspaper newspaper's newspapers newsprint newsreels newsstand newsworthy newt newton newtonian next nibble nibbled nibbler nibblers nibbles nibbling nicaragua nice nicely niceness nicer nicest niceties nicety niche niches nick nicked nickel nickel's nickels nicker nicking nickname nicknamed nicknames nicks nicotine niece niece's nieces nifty nigh night night's nightcap nightclub nightfall nightgown nightingale nightingale's nightingales nightly nightmare nightmare's nightmares nightmarish nights nighttime nihilism nil nimble nimbleness nimbler nimbly nimbus nine ninefold nines nineteen nineteens nineteenth nineties ninetieth ninety ninth nip nipped nipple nips nitric nitrogen nitrous nitty no nobel nobilities nobility noble nobleman nobleness nobler nobles noblest nobly nobody nocturnal nocturnally nod nod's nodal nodded nodding node node's nodes nods nodular nodule noise noiseless noiselessly noises noisier noisily noisiness noisy nomads nomenclature nomenclatures nominal nominally nominate nominated nominating nomination nominative nominee non nonacademic nonadaptive nonadjacent nonaligned nonbiodegradable nonblank nonblanks nonblocking nonce nonces nonchalant noncommercial noncommunication nonconforming nonconsecutively nonconservative noncritical noncyclic nondecreasing nondescript nondescriptly nondestructively nondeterminate nondeterminately nondeterminism nondeterministic nondeterministically none nonempty nonetheless nonexclusive nonexistence nonexistent nonextensible nonfunctional nongovernmental nonidempotent nonidentical noninteracting noninterference noninterleaved nonintrusive nonintuitive noninverting nonlinear nonlinearities nonlinearity nonlinearity's nonlinearly nonlocal nonmaskable nonmathematical nonmicroprogrammed nonmilitary nonnegative nonnegligible nonnumerical nonogenarian nonorthogonal nonorthogonality nonperishable nonpersistent nonportable nonpreemptable nonpreemptive nonpreemptively nonprocedural nonprocedurally nonprofit nonprogrammable nonprogrammer nonrecursive nonrecursively nonresident nonsegmented nonsense nonsensical nonsequenced nonsequential nonspecialist nonspecialist's nonspecialists nonstandard nonstop nonsynchronous nontechnical nonterminal nonterminal's nonterminals nonterminating nontermination nonthermal nontransparent nontrivial nonuniform nonuniformity nonvoice nonvolatile nonwrite nonzero noodle noodles nook nook's nooks noon noonday noons noontide noontime noose nor norm norm's normal normalcy normality normalization normalize normalized normalizes normalizing normally normals normative norms north northbound northeast northeaster northeastern northerly northern northerner northerners northernly northward northwards northwest northwestern norway norwegian nose nosed noses nosing nostalgia nostalgic nostril nostril's nostrils not notability notable notables notably notarize notarized notarizes notarizing notary notation notation's notational notations notch notched notches notching note notebook notebook's notebooks noted notepads notes noteworthy nothing nothingness nothings notice noticeable noticeably noticed notices noticing notification notifications notified notifier notifiers notifies notify notifying noting notion notional notionally notions notoriety notorious notoriously notwithstanding noun noun's nouns nourish nourished nourishes nourishing nourishment nov nova novas novel novel's novelist novelist's novelists novels novelties novelty novelty's november novice novice's novices now nowadays nowhere noxious nozzle nsec nu nuance nuances nubian nubile nuclear nuclei nucleic nucleotide nucleotide's nucleotides nucleus nuclide nude nudge nudged nugatory nugget nuisance nuisance's nuisances null nullary nulled nullified nullifiers nullifies nullify nullifying nulls numb numbed number numbered numberer numbering numberless numbers numbing numbly numbness numbs numerable numeral numeral's numerals numerator numerator's numerators numeric numerical numerically numerics numerous numismatic numismatist nun nun's nuns nuptial nurse nursed nurseries nursery nursery's nurses nursing nurture nurtured nurtures nurturing nut nut's nutate nuthatch nutria nutrient nutrition nutritious nuts nutshell nutshells nuzzle nylon nymph nymphomania nymphomaniac nymphs o o'clock o's oaf oak oaken oaks oar oar's oars oases oasis oat oaten oath oaths oatmeal oats obedience obediences obedient obediently obelisk obese obey obeyed obeying obeys obfuscate obfuscatory obituary object object's objected objecting objection objection's objectionable objections objective objectively objectives objector objector's objectors objects objects' obligated obligation obligation's obligations obligatory oblige obliged obliges obliging obligingly oblique obliquely obliqueness obliterate obliterated obliterates obliterating obliteration oblivion oblivious obliviously obliviousness oblong obnoxious oboe obscene obscure obscured obscurely obscurer obscures obscuring obscurities obscurity obsequious observable observance observance's observances observant observation observation's observations observatory observe observed observer observers observes observing obsession obsession's obsessions obsessive obsolescence obsolescent obsolete obsoleted obsoletes obsoleting obstacle obstacle's obstacles obstinacy obstinate obstinately obstruct obstructed obstructing obstruction obstruction's obstructions obstructive obtain obtainable obtainably obtained obtaining obtains obviate obviated obviates obviating obviation obviations obvious obviously obviousness occam occasion occasional occasionally occasioned occasioning occasionings occasions occipital occlude occluded occludes occlusion occlusion's occlusions occult occupancies occupancy occupant occupant's occupants occupation occupation's occupational occupationally occupations occupied occupier occupies occupy occupying occur occurred occurrence occurrence's occurrences occurring occurs ocean ocean's oceanic oceanography oceans oct octagon octagonal octahedra octahedral octahedron octal octane octave octaves octet octets october octogenarian octopus odd odder oddest oddities oddity oddity's oddly oddness odds ode ode's odes odious odiously odiousness odor odor's odorous odorously odorousness odors oedipus of off offend offended offender offenders offending offends offense offenses offensive offensively offensiveness offer offered offerer offerers offering offerings offers offhand office officemate officer officer's officers offices official officialdom officially officials officiate officio officious officiously officiousness offing offline offload offloaded offloading offloads offs offset offset's offsets offsetting offshore offspring offsprings oft often oftentimes oh ohio ohio's ohm ohmmeter ohms oil oilcloth oiled oiler oilers oilier oiliest oiling oils oily ointment ok okay oklahoma old olden older oldest oldness oldy oleander oleomargarine oligarchy olive olive's olives olympic olympics omaha omega omegas omelet omen omen's omens omicron ominous ominously ominousness omission omission's omissions omit omits omitted omitting omnibus omnidirectional omnipotent omnipresent omniscient omnisciently omnivore on onanism onboard once oncologist oncology one one's oneness onerous ones oneself onetime ongoing onion onions online onlooker only onrush onset onset's onsets onslaught ontario onto ontogeny ontology onus onward onwards onyx ooze oozed opacity opal opal's opals opaque opaquely opaqueness opcode open opened opener openers opening opening's openings openly openness opens opera opera's operable operand operand's operandi operands operas operate operated operates operating operation operational operationally operations operative operatives operator operator's operators operetta opiate opinion opinion's opinions opium opossum opponent opponent's opponents opportune opportunely opportunism opportunistic opportunities opportunity opportunity's opposable oppose opposed opposes opposing opposite oppositely oppositeness opposites opposition oppress oppressed oppresses oppressing oppression oppressive oppressor oppressor's oppressors opprobrium opt opted opthalmic optic optical optically optics optima optimal optimality optimally optimism optimist optimistic optimistically optimization optimization's optimizations optimize optimized optimizer optimizers optimizes optimizing optimum opting option option's optional optionally options optoacoustic optoelectrical optomechanical optometrist optometry opts opulent opus or or's oracle oracle's oracles oral orally orange orange's oranges orangutan oration oration's orations orator orator's oratories oratorios orators oratory oratory's orb orbit orbital orbitally orbited orbiter orbiters orbiting orbits orca orchard orchard's orchards orchestra orchestra's orchestral orchestras orchestrate orchid orchid's orchids ordain ordained ordaining ordains ordeal order ordered ordering orderings orderlies orderly orders ordinal ordinance ordinance's ordinances ordinarily ordinariness ordinary ordinate ordinates ordination ore ore's oregano oregon ores organ organ's organic organism organism's organisms organist organist's organists organizable organization organization's organizational organizationally organizations organize organized organizer organizers organizes organizing organs orgasm orgiastic orgies orgy orgy's orient oriental orientation orientation's orientations oriented orienting orients orifice orifice's orifices origin origin's original originality originally originals originate originated originates originating origination originator originator's originators origins oriole orleans orly ornament ornamental ornamentally ornamentation ornamented ornamenting ornaments ornate ornately ornateness ornery ornithological ornithologist orphan orphanage orphaned orphans orthant orthodontist orthodox orthodoxy orthogonal orthogonality orthogonally orthographic orthopedic orthopedics oryxes osaka oscillate oscillated oscillates oscillating oscillation oscillation's oscillations oscillator oscillator's oscillators oscillatory oscilloscope oscilloscope's oscilloscopes osi oslo osmosis osmotic ossify ostensible ostensibly ostentatious osteopath osteopathic osteopathy osteoporosis ostracism ostrich ostrich's ostriches othello other other's others otherwise otherworldly otter otter's otters ouch ought oughtn't ounce ounces our ours ourself ourselves oust ousting out outage outbound outbreak outbreak's outbreaks outburst outburst's outbursts outcast outcast's outcasts outcome outcome's outcomes outcries outcry outdated outdo outdoor outdoors outer outermost outfit outfit's outfits outfitted outflow outgoing outgrew outgrow outgrowing outgrown outgrows outgrowth outgunned outing outlandish outlast outlasts outlaw outlawed outlawing outlaws outlay outlay's outlays outlet outlet's outlets outline outlined outlines outlining outlive outlived outlives outliving outlook outlying outnumber outnumbered outperform outperformed outperforming outperforms outpost outpost's outposts output output's outputs outputting outrage outraged outrageous outrageously outrages outright outrun outruns outs outset outside outsider outsider's outsiders outskirts outsmarting outstanding outstandingly outstretched outstrip outstripped outstripping outstrips outvote outvoted outvotes outvoting outward outwardly outweigh outweighed outweighing outweighs outwit outwits outwitted outwitting oval oval's ovals ovaries ovary ovary's oven oven's ovens over overall overall's overalls overbar overblown overboard overcame overcast overcoat overcoat's overcoats overcome overcomes overcoming overconsumption overcrowd overcrowded overcrowding overcrowds overdimensioned overdone overdraft overdraft's overdrafts overdue overemphasis overemphasized overestimate overestimated overestimates overestimating overestimation overfed overflow overflowed overflowing overflows overhang overhanging overhangs overhaul overhauled overhauling overhead overheads overhear overheard overhearing overhears overheating overjoy overjoyed overkill overlaid overland overlap overlap's overlapped overlapping overlaps overlay overlay's overlayed overlaying overlays overlies overload overloaded overloading overloads overlook overlooked overlooking overlooks overlord overly overnight overnighter overnighters overpass overpower overpowered overpowering overpowers overprint overprinted overprinting overprints overproduction overran overridden override overrides overriding overripe overrode overrule overruled overrules overrun overrunning overruns overseas oversee overseeing overseer overseers oversees overshadow overshadowed overshadowing overshadows overshoot overshot oversight oversight's oversights oversimplification oversimplifications oversimplified oversimplifies oversimplify oversimplifying oversized overstate overstated overstatement overstatement's overstatements overstates overstating overstep overstock overstocks overstrike overstrikes overstriking oversubscribed overt overtake overtaken overtaker overtakers overtakes overtaking overthrew overthrow overthrown overtime overtly overtone overtone's overtones overtook overture overture's overtures overturn overturned overturning overturns overuse overview overview's overviews overwhelm overwhelmed overwhelming overwhelmingly overwhelms overwork overworked overworking overworks overwrite overwrites overwriting overwritten overwrote overzealous owe owed owes owing owl owl's owls own owned owner owner's owners ownership ownerships owning owns ox oxen oxford oxide oxide's oxides oxidize oxidized oxygen oxymoron oyster oyster's oysters ozone p p's pa pace paced pacemaker pacer pacers paces pacific pacification pacified pacifier pacifies pacifism pacifist pacify pacifying pacing pack package packaged packager packagers packages packaging packagings packed packer packers packet packet's packetized packetizing packets packing packs pact pact's pacts pad pad's padded padding paddle paddled paddles paddling paddock paddy padlock padlocks pads pagan pagan's pagans page page's pageant pageant's pageantry pageants paged pager pagers pages paginate paginated paginates paginating pagination paginations paging pagoda paid pail pail's pails pain pained painful painfully painless painlessly pains painstaking painstakingly paint painted painter painters painting paintings paints pair paired pairing pairings pairs pairwise pajama pajamas pakistan pal pal's palace palace's palaces palatable palate palate's palates pale paled palely paleness paler pales palest palette palfrey palindrome palindromes palindromic palindromicity paling pall palliate palliative pallid palm palmed palmer palming palms palmtop palo palpable pals palsy paltry pamper pamphlet pamphlet's pamphlets pan pan's panacea panacea's panaceas panama pancake pancake's pancakes panda pandas pandemic pandemonium pander pandering pane pane's panel paneled paneling panelist panelist's panelists panels panes pang pang's pangs panic panic's panicked panicking panicky panics panned panning panorama panoramic pans pansies pansy pansy's pant panted pantheism pantheist pantheon panther panther's panthers panties panting pantomime pantries pantry pantry's pants panty papa papal papaya paper paper's paperback paperback's paperbacks papered paperer paperers papering paperings paperless papers paperweight paperwork papoose paprika papyrus par parabola parabolic paraboloid paraboloidal parachute parachute's parachuted parachutes parade paraded parades paradigm paradigm's paradigms parading paradise paradox paradox's paradoxes paradoxical paradoxically paraffin paragon paragon's paragons paragraph paragraphing paragraphs paraguay parakeet parallax parallel paralleled paralleling parallelism parallelization parallelize parallelized parallelizes parallelizing parallelled parallelling parallelogram parallelogram's parallelograms parallels paralysis paralyze paralyzed paralyzes paralyzing parameter parameter's parameterizable parameterization parameterization's parameterizations parameterize parameterized parameterizes parameterizing parameterless parameters parametric parametrization parametrize parametrized parametrizes parametrizing paramilitary paramount paranoia paranoiac paranoiacs paranoic paranoid paranormal parapet parapet's parapets paraphernalia paraphrase paraphrased paraphrases paraphrasing parapsychology parasailing parasite parasite's parasites parasitic parasitics parasol parboil parc parcel parceled parceling parcels parch parched parchment pardon pardonable pardonably pardoned pardoner pardoners pardoning pardons pare paregoric parent parent's parentage parenta !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~l parentheses parenthesis parenthesised parenthesize parenthesized parenthesizes parenthesizing parenthetic parenthetical parenthetically parenthood parents pares pariah parimutuel paring parings paris parish parish's parishes parishioner parities parity park park's parka parked parker parkers parking parkinson's parkland parklike parks parkway parlay parley parliament parliament's parliamentarian parliamentary parliaments parlor parlor's parlors parochial parody parole paroled paroles paroling parried parrot parroting parrots parry pars parse parsed parser parsers parses parsimony parsing parsings parsley parson parson's parsons part partake partaker partakes partaking parted parter parters partial partiality partially participant participant's participants participate participated participates participating participation participle participles particle particle's particles particular particularly particulars particulate parties parting partings partisan partisan's partisans partition partitioned partitioning partitions partly partner partner's partnered partners partnership partook partridge partridge's partridges parts partway party party's pasadena pascal pass passable passage passage's passages passageway passe passed passenger passenger's passengers passengers' passer passers passes passing passion passionate passionately passions passivate passive passively passiveness passivity passport passport's passports password password's passwords past past's paste pasted pastel pastes pastime pastime's pastimes pasting pastness pastor pastor's pastoral pastors pastries pastry pasts pasture pasture's pastures pat patch patched patches patching patchwork patchy pate paten patent patentable patented patenter patenters patenting patently patents paternal paternally paternoster path pathetic pathname pathname's pathnames pathogen pathogenesis pathological pathology pathos paths pathway pathway's pathways patience patient patient's patiently patients patients' patina patio patriarch patriarchal patriarchs patriarchy patrician patrician's patricians patrimonial patrimony patriot patriot's patriotic patriotism patriots patrol patrol's patrolled patrolling patrolman patrolmen patrols patron patron's patronage patronize patronized patronizes patronizing patrons pats patted patter pattered pattering patterings pattern patterned patterning patterns patters patties patting patty patty's paucity paunch paunchy pauper pause paused pauses pausing pave paved pavement pavement's pavements paves pavilion pavilion's pavilions paving paw pawed pawing pawn pawn's pawned pawning pawns pawnshop paws pay payable payback paycheck paycheck's paychecks payed payer payer's payers paying payload payloads payment payment's payments payoff payoff's payoffs payroll pays pbx pbxes pc pcm pea pea's peace peaceable peaceful peacefully peacefulness peacetime peach peach's peaches peacock peacock's peacocks peak peaked peaks peal pealed pealing peals peanut peanut's peanuts pear pearl pearl's pearls pearly pears peas peasant peasant's peasantry peasants peat pebble pebble's pebbles peccary peck pecked pecking pecks pectoral peculiar peculiarities peculiarity peculiarity's peculiarly pecuniary pedagogic pedagogical pedagogically pedagogy pedal pedant pedantic pedantically pedantry peddle peddled peddler peddler's peddlers pedestal pedestrian pedestrian's pedestrians pediatric pediatrician pediatrics pedigree peek peeked peeking peeks peel peeled peeling peels peep peeped peeper peephole peeping peeps peer peered peering peerless peers peg peg's pegboard pegs pejorative peking pelican pelicans pellagra pelt pelting pelts pelvic pelvis pen penal penalize penalized penalizes penalizing penalties penalty penalty's penance pence penchant pencil penciled pencils pend pendant pended pending pends pendulum pendulum's pendulums penetrable penetrate penetrated penetrates penetrating penetratingly penetration penetrations penetrative penetrator penetrator's penetrators penguin penguin's penguins penicillin peninsula peninsula's peninsulas penitent penitentiary penmanship penned pennies penniless penning pennsylvania penny penny's pens pension pensioner pensions pensive pent pentagon pentagon's pentagons pentecostal penthouse penultimate penumbra peony people people's peopled peoples pep pepper peppered peppering peppermint pepperoni peppers peppery peppy peptide per perceivable perceivably perceive perceived perceiver perceivers perceives perceiving percent percentage percentages percentile percentiles percents perceptibility perceptible perceptibly perception perceptions perceptive perceptively perceptual perceptually perch perchance perched perches perching percussion percutaneous peremptorily peremptory perennial perennially perfect perfected perfectible perfecting perfection perfectionist perfectionist's perfectionists perfectly perfectness perfects perforce perform performance performance's performances performed performer performers performing performs perfume perfumed perfumes perfuming perfunctory perhaps perihelion peril peril's perilous perilously perils perimeter period period's periodic periodical periodically periodicals periods peripheral peripherally peripherals peripheries periphery periphery's periscope perish perishable perishable's perishables perished perisher perishers perishes perishing perjure perjury perk perky permanence permanent permanently permeable permeate permeated permeates permeating permeation permissibility permissible permissibly permission permissions permissive permissively permit permit's permits permitted permitting permutation permutation's permutations permute permuted permutes permuting pernicious peroxide perpendicular perpendicularly perpendiculars perpetrate perpetrated perpetrates perpetrating perpetration perpetrations perpetrator perpetrator's perpetrators perpetual perpetually perpetuate perpetuated perpetuates perpetuating perpetuation perpetuity perplex perplexed perplexing perplexity persecute persecuted persecutes persecuting persecution persecutor persecutor's persecutors perseverance persevere persevered perseveres persevering persist persisted persistence persistent persistently persisting persists person person's personage personage's personages personal personalities personality personality's personalization personalize personalized personalizes personalizing personally personification personified personifies personify personifying personnel persons perspective perspective's perspectives perspicuous perspicuously perspiration perspire persuadable persuade persuaded persuader persuaders persuades persuading persuasion persuasion's persuasions persuasive persuasively persuasiveness pertain pertained pertaining pertains pertinent perturb perturbation perturbation's perturbations perturbed peru perusal peruse perused peruser perusers peruses perusing pervade pervaded pervades pervading pervasive pervasively perversion perversions perversity pervert perverted perverting perverts pessimism pessimist pessimistic pest pester pesticide pestilence pests pet petal petal's petals peter peters petition petitioned petitioner petitioning petitions petri petroleum pets petted petter petter's petters petticoat petticoat's petticoats pettiness petting petty pew pew's pews pewter phantom phantom's phantoms pharmaceutic pharmacist pharmacology pharmacopoeia pharmacy phase phased phaser phasers phases phasing pheasant pheasant's pheasants phenomena phenomenal phenomenally phenomenological phenomenologically phenomenologies phenomenology phenomenon phi philadelphia philanthropy philharmonic philosopher philosopher's philosophers philosophic philosophical philosophically philosophies philosophize philosophized philosophizer philosophizers philosophizes philosophizing philosophy philosophy's phoenix phone phonebook phoned phoneme phoneme's phonemes phonemic phones phonetic phonetics phoning phonograph phonographs phony phosgene phosphate phosphate's phosphates phosphor phosphorescent phosphoric phosphorus photo photo's photocopied photocopier photocopiers photocopies photocopy photocopying photodiode photodiodes photogenic photograph photographed photographer photographers photographic photographically photographing photographs photography photon photons photos photosensitive phototypesetter phototypesetters phrase phrased phraseology phrases phrasing phrasings phyla phylum physic physical physically physicalness physicals physician physician's physicians physicist physicist's physicists physics physiological physiologically physiology physiotherapist physiotherapy physique phytoplankton pi pianist piano piano's pianos piazza piazza's piazzas pica picas picayune piccolo pick pickaxe picked picker pickers picket picketed picketer picketers picketing pickets picking pickings pickle pickled pickles pickling pickpockets picks pickup pickup's pickups picky picnic picnic's picnicked picnicking picnics picofarad picojoule picosec picosecond pictorial pictorially picture pictured pictures picturesque picturesqueness picturing piddle pidgin pie piece pieced piecemeal pieces piecewise piecing pier pierce pierced pierces piercing piers pies piety piezoelectric pig pig's pigeon pigeon's pigeonhole pigeonholes pigeons piggish piggy piggyback piggybacked piggybacking piggybacks piglet pigment pigmentation pigmented pigments pigpen pigs pigskin pigtail pike piker pikes pile piled pilers piles pilfer pilferage pilfered pilgrim pilgrim's pilgrimage pilgrimage's pilgrimages pilgrims piling pilings pill pill's pillage pillaged pillar pillared pillars pillory pillow pillow's pillows pills pilot piloted piloting pilots pimp pimple pin pin's pinafore pinball pinch pinched pinches pinching pincushion pine pineapple pineapple's pineapples pined pines ping pinhead pinhole pining pinion pink pinker pinkest pinkie pinkish pinkly pinkness pinks pinnacle pinnacle's pinnacles pinned pinning pinnings pinochle pinout pinpoint pinpointed pinpointing pinpoints pins pinscher pint pint's pinto pints pinwheel pion pioneer pioneered pioneering pioneers pious piously pip pipe pipe's piped pipeless pipeline pipelined pipelines pipelining piper pipers pipes pipette piping pique piranha pirate pirate's pirated pirates piss pistachio pistil pistil's pistils pistol pistol's pistols piston piston's pistons pit pit's pitch pitched pitcher pitchers pitches pitchfork pitching piteous piteously pitfall pitfall's pitfalls pith pithed pithes pithier pithiest pithiness pithing pithy pitiable pitied pitier pitiers pities pitiful pitifully pitiless pitilessly pits pitted pitting pittsburgh pituitary pity pitying pityingly pivot pivotal pivoted pivoting pivots pixel pixel's pixels pizza pizzeria placard placard's placards placate placated place placebo placed placeholder placement placement's placements placenta placental placer places placid placidly placing plagiarism plagiarist plague plagued plagues plaguing plaid plaid's plaids plain plainer plainest plainly plainness plains plaintext plaintexts plaintiff plaintiff's plaintiffs plaintive plaintively plaintiveness plait plait's plaits plan plan's planar planarity plane plane's planed planeload planer planers planes planet planet's planetaria planetarium planetary planetesimal planetoid planets planing plank planking planks plankton planned planner planner's planners planning planoconcave planoconvex plans plant plantation plantation's plantations planted planter planters planting plantings plants plaque plasma plaster plastered plasterer plasterers plastering plasters plastic plasticity plastics plate plateau plateau's plateaus plated platelet platelet's platelets platen platen's platens plates platform platform's platforms plating platinum platitude platonic platonical platonically platoon platter platter's platters platypus plausibility plausible plausibly play playable playback playboy played player player's players playful playfully playfulness playground playground's playgrounds playhouse playing playmate playmate's playmates playoff playroom plays plaything plaything's playthings playtime playwright playwright's playwrights playwriting plaza plea plea's plead pleaded pleader pleading pleads pleas pleasant pleasantly pleasantness pleasantries please pleased pleases pleasing pleasingly pleasurable pleasure pleasures pleat plebeian plebian plebiscite plebiscite's plebiscites pledge pledged pledges plenary plenipotentiary plenteous plentiful plentifully plenty plethora pleurisy pliable pliant plied pliers plies plight plod plodding plot plot's plots plotted plotter plotter's plotters plotting plough ploughman plover plow plowed plower plowing plowman plows plowshare ploy ploy's ploys pluck plucked plucking plucks plucky plug plug's plugboard plugboards pluggable plugged plugging plugs plum plum's plumage plumb plumb's plumbed plumbers plumbing plumbs plume plumed plumes plummet plummeting plump plumped plumpness plums plunder plundered plunderer plunderers plundering plunders plunge plunged plunger plungers plunges plunging plunk plunked plural plurality plurals plus pluses plush plutonium ply plywood pneumatic pneumonia poach poacher poachers poaches pocket pocketbook pocketbook's pocketbooks pocketed pocketful pocketing pockets pod pod's podge podia podium pods podunk podunk's poem poem's poems poet poet's poetic poetical poetically poetics poetries poetry poetry's poets pogo pogrom poignant point pointed pointedly pointer pointers pointing pointless points pointy poise poised poises poison poisoned poisoner poisoning poisonous poisonousness poisons poisson poke poked poker pokerface pokes poking poland polar polarities polarity polarity's polarizations pole polecat poled polemic polemics poles police police's policed policeman policeman's policemen policemen's polices policies policing policy policy's poling polio polish polished polisher polishers polishes polishing polite politely politeness politer politest politic political politically politician politician's politicians politicized politicking politico politics polka polkas poll polled pollen polling polloi polls pollutant pollute polluted pollutes polluting pollution polo polyalphabetic polygon polygon's polygons polymer polymer's polymers polymorphic polymorphism polynesian polynomial polynomial's polynomials polyphase polytechnic pomp pompadour pomposity pompous pompously pompousness poncho pond ponder pondered pondering ponderous ponders ponds pong ponies pontiff pontific pontificate pony pony's pooch poodle pool pooled pooling pools poolside poor poorer poorest poorly poorness pop pop's pope popish poplar poplin popped poppies popping poppy poppy's pops populace popular popularity popularization popularize popularized popularizes popularizing popularly populate populated populates populating population populations populous populousness porcelain porch porch's porches porcine porcupine porcupine's porcupines pore pored pores poring pork porker porno pornographer pornographic pornography porous porpoise porridge port port's portability portable portables portage portal portal's portals portapotties ported portend portended portending portends portent portentous porter porterhouse porters portfolio portfolios portico porting portion portion's portions portland portly portmanteau portrait portrait's portraits portray portrayal portrayed portrayer portraying portrays ports portugal portugese portuguese pose posed poser posers poses posh posing posit posited positing position positional positioned positioning positions positive positively positiveness positives positron posits posse possess possessed possesses possessing possession possession's possessional possessions possessive possessively possessiveness possessor possessor's possessors possibilities possibility possibility's possible possibly possum possum's possums post postage postal postcard postcards postcondition postdated postdoctoral posted poster posterior posteriori posterity posters postfix postgraduate postincrement posting postings postlude postludes postman postmark postmarks postmaster postmaster's postmasters postmortem postoperative postorder postpone postponed postponement postpones postponing postprocess postprocessor posts postscript postscript's postscripts postulate postulated postulates postulating postulation postulations posture posture's postures pot pot's potable potash potassium potato potato's potatoes potbelly potent potentate potentate's potentates potential potentialities potentiality potentially potentials potentiating potentiometer potentiometer's potentiometers potholded pothole potholes potion potlatch potpourri pots potsherds potted potter potter's potters pottery potting pouch pouch's pouches poultice poultry pounce pounced pounces pouncing pound pounded pounder pounders pounding pounds pour poured pourer pourers pouring pours pout pouted pouting pouts poverty powder powdered powdering powderpuff powders powdery power powered powerful powerfully powerfulness powering powerless powerlessly powerlessness powers powerset powerset's powersets pox practicability practicable practicably practical practicality practically practice practiced practices practicing practise practised practising practitioner practitioner's practitioners pragmat pragmatic pragmatically pragmatics pragmatism pragmatist prague prairie praise praised praiser praisers praises praiseworthy praising praisingly pram prams prance pranced prancer prancing prank prank's pranks prate pray prayed prayer prayer's prayers praying preach preached preacher preachers preaches preaching preallocate preallocated preallocating preamble preambles prearrangement preassign preassigned preassigning preassigns precall precarious precariously precariousness precaution precaution's precautions precede preceded precedence precedence's precedences precedent precedented precedents precedes preceding precept precept's precepts precess precession precinct precinct's precincts precious preciously preciousness precipice precipitable precipitate precipitated precipitately precipitateness precipitates precipitating precipitation precipitous precipitously precise precisely preciseness precision precisions preclude precluded precludes precluding precocious precociously precocity precompile precompiled precompiles precompiling precompressed precomputation precompute precomputed precomputing preconceive preconceived preconception preconception's preconceptions precondition preconditioned preconditions preconfigured precursor precursor's precursors predate predated predates predating predator predators predatory predecease predecessor predecessor's predecessors predecessors' predecrement predefine predefined predefines predefining predefinition predefinition's predefinitions predeterminate predetermination predetermine predetermined predetermines predetermining predicament predicate predicated predicates predicating predication predications predict predictability predictable predictably predicted predicting prediction prediction's predictions predictive predictor predicts predilection predilections predisposition predominant predominantly predominate predominated predominately predominates predominating predomination preeminent preempt preemptable preempted preempting preemption preemptive preemptively preemptor preempts preen prefab prefabricate prefabricated preface prefaced prefaces prefacing prefer preferable preferably preference preference's preferences preferential preferentially preferred preferring prefers prefetch prefetcher prefetching prefill prefilled prefilling prefills prefix prefixed prefixes prefixing preformatted pregnant preheat preheated prehistoric preinitialize preinitialized preinitializes preinitializing preinterrupt prejudge prejudged prejudice prejudiced prejudices prelate preliminaries preliminarily preliminary preloaded prelude prelude's preludes premature prematurely prematurity premeditated premier premier's premiere premiers premise premise's premises premium premium's premiums premonition preoccupation preoccupied preoccupies preoccupy prep prepaging prepaid preparation preparation's preparations preparative preparative's preparatives preparatory prepare prepared prepares preparing prepend prepended prepending prepends preposition preposition's prepositional prepositioned prepositions preposterous preposterously preposterousness preprinted preprocessed preprocessing preprocessor preprocessors preproduction preprogrammed prerequisite prerequisite's prerequisites prerogative prerogative's prerogatives prescan prescribe prescribed prescribes prescribing prescription prescription's prescriptions prescriptive preselect preselected preselecting preselects presence presence's presences present presentable presentation presentation's presentations presented presenter presenting presently presentness presents preservation preservations preserve preserved preserver preservers preserves preserving preset presets presetting preside presided presidency president president's presidential presidents presides presiding press pressed presser presses pressing pressings pressure pressured pressures pressuring pressurize pressurized prestidigitate prestige prestigious presto presumably presume presumed presumes presuming presumption presumption's presumptions presumptive presumptuous presumptuousness presuppose presupposed presupposes presupposing presupposition pretend pretended pretender pretenders pretending pretends pretense pretenses pretension pretensions pretentious pretentiously pretentiousness pretext pretext's pretexts prettier prettiest prettily prettiness pretty prevail prevailed prevailing prevailingly prevails prevalence prevalent prevalently prevent preventable preventably prevented preventing prevention preventive preventives prevents preview previewed previewing previews previous previously prey preyed preying preys price priced priceless pricer pricers prices pricing prick pricked pricking prickly pricks pride prided prides priding pried pries priest priests priggish prim prima primacy primal primaries primarily primary primary's primate prime primed primeness primer primers primes primeval priming primitive primitively primitiveness primitives primogeniture primrose prince princely princes princess princess's princesses princeton principal principal's principalities principality principality's principally principals principle principled principles print printable printably printed printer printer's printers printing printout printouts prints prior priori priorities prioritized priority priority's priory prism prism's prisms prison prisoner prisoner's prisoners prisons pristine privacies privacy private private's privately privates privation privations privatization privies privilege privileged privileges privy privy's prize prized prizer prizers prizes prizewinning prizing pro pro's probabilistic probabilistically probabilities probability probable probably probate probated probates probating probation probative probe probed probes probing probings probity problem problem's problematic problematical problematically problems procaine procedural procedurally procedure procedure's procedures procedures' proceed proceeded proceeding proceedings proceeds process process' process's processable processed processes processes' processing procession processor processor's processors processors' proclaim proclaimed proclaimer proclaimers proclaiming proclaims proclamation proclamation's proclamations proclivities proclivity proclivity's procotols procrastinate procrastinated procrastinates procrastinating procrastination procreate procrustean procure procured procurement procurement's procurements procurer procurers procures procuring prod prodigal prodigally prodigious prodigiously prodigy produce produced producer producer's producers produces producible producing product product's production production's productions productive productively productivity products prof profane profanely profess professed professes professing profession profession's professional professionalism professionally professionals professions professor professor's professorial professors professorships proffer proffered proffers proficiency proficient proficiently profile profiled profiles profiling profit profitability profitable profitably profited profiteer profiteer's profiteers profiting profits profitted profitter profitter's profitters profligate profound profoundest profoundly profundity profuse profusely profusion prog progenitor progeny prognosis prognosticate program program's programmability programmable programmed programmer programmer's programmers programming programs programs' progress progressed progresses progressing progression progression's progressions progressive progressively prohibit prohibited prohibiting prohibition prohibition's prohibitions prohibitive prohibitively prohibits project project's projected projectile projecting projection projection's projections projective projectively projector projector's projectors projects prolate prolegomena proletariat proliferate proliferated proliferates proliferating proliferation prolific prolix prolog prolog's prologue prologues prolong prolongate prolonged prolonging prolongs promenade promenade's promenades prominence prominent prominently promiscuous promiscuously promise promised promises promising promontory promote promoted promoter promoters promotes promoting promotion promotional promotions prompt prompted prompter promptest prompting promptings promptly promptness prompts promulgate promulgated promulgates promulgating promulgation prone proneness prong pronged prongs pronoun pronoun's pronounce pronounceable pronounced pronouncement pronouncement's pronouncements pronounces pronouncing pronouns pronto pronunciation pronunciation's pronunciations proof proof's proofread proofreader proofs prop propaganda propagandist propagate propagated propagates propagating propagation propagations propane propel propellant propelled propeller propeller's propellers propelling propels propensity proper properly properness propertied properties property prophecies prophecy prophecy's prophesied prophesier prophesies prophesy prophet prophet's prophetic prophets propitious proponent proponent's proponents proportion proportional proportionally proportionate proportionately proportioned proportioning proportionment proportions propos proposal proposal's proposals propose proposed proposer proposers proposes proposing proposition propositional propositionally propositioned propositioning propositions propound propounded propounding propounds proprietary proprietor proprietor's proprietors propriety props propulsion propulsion's propulsions prorate prorated prorates pros prosaic proscenium proscribe proscription prose prosecute prosecuted prosecutes prosecuting prosecution prosecutions prosecutor proselytize proselytized proselytizes proselytizing prosodic prosodics prospect prospected prospecting prospection prospection's prospections prospective prospectively prospectiveness prospectives prospector prospector's prospectors prospects prospectus prosper prospered prospering prosperity prosperous prospers prostate prosthetic prostitute prostitution prostrate prostration protagonist protean protect protected protectedly protecting protection protection's protections protective protectively protectiveness protector protector's protectorate protectors protects protege protege's proteges protein protein's proteins protest protestant protestation protestations protested protesting protestingly protestor protestor's protestors protests protocol protocol's protocols proton proton's protons protoplasm prototype prototype's prototyped prototypes prototypical prototypically prototyping protozoan protract protracted protrude protruded protrudes protruding protrusion protrusion's protrusions protuberant proud prouder proudest proudly provability provable provably prove proved proven provenance prover proverb proverb's proverbial proverbs provers proves provide provided providence provident provider provider's providers provides providing province province's provinces provincial proving provision provisional provisionally provisioned provisioning provisions proviso provocation provocations provoke provoked provokes provoking provost prow prow's prowess prowl prowled prowler prowlers prowling prowls prows proxies proximal proximate proximity proxy prudence prudent prudential prudently prune pruned pruner pruners prunes pruning prurient pry prying ps psalm psalm's psalms pseudo pseudofiles pseudoinstruction pseudoinstructions pseudoparallel pseudoparallelism psi psych psyche psyche's psyches psychiatric psychiatrist psychiatrist's psychiatrists psychiatry psychic psycho psychoanalysis psychoanalyst psychoanalytic psychobiology psychological psychologically psychologist psychologist's psychologists psychology psychopath psychopathic psychophysic psychoses psychosis psychosocial psychosomatic psychotherapeutic psychotherapist psychotherapy psychotic ptt ptts pub pub's puberty public publication publication's publications publicity publicize publicized publicizes publicizing publicly publish published publisher publishers publishes publishing pubs pucker puckered puckering puckers pudding pudding's puddings puddle puddles puddling puerto puff puffed puffin puffing puffs puke pull pulled puller pulley pulley's pulleys pulling pullings pullover pulls pulmonary pulp pulping pulpit pulpit's pulpits pulsar pulsate pulsation pulsations pulse pulsed pulses pulsing puma pumice pummel pump pumped pumping pumpkin pumpkin's pumpkins pumps pun pun's punch punchable punched puncher punches punching punchings punctual punctually punctuate punctuated punctuates punctuating punctuation puncture puncture's punctured punctures puncturing pundit pungent punish punishable punished punishes punishing punishment punishment's punishments punitive punning puns punt punted punting punts puny pup pup's pupa pupil pupil's pupils puppet puppet's puppeteer puppets puppies puppy puppy's pups purchasable purchase purchased purchaser purchasers purchases purchasing pure purely purer purest purgatory purge purged purges purging purification purifications purified purifier purifiers purifies purify purifying purist purists puritanic purity purple purpler purplest purport purported purportedly purporter purporters purporting purports purpose purposed purposeful purposefully purposely purposes purposive purr purred purring purrs purse pursed purser purses pursue pursued pursuer pursuers pursues pursuing pursuit pursuit's pursuits purveyor purview pus push pushbutton pushcarts pushdown pushed pusher pushers pushes pushing puss pussy pussycat put puts putt putter puttering putters putting putty puzzle puzzled puzzlement puzzler puzzlers puzzles puzzling puzzlings pygmies pygmy pygmy's pyramid pyramid's pyramids pyre python q q's qua quack quacked quackery quacks quad quadrangle quadrangular quadrant quadrant's quadrants quadratic quadratical quadratically quadratics quadrature quadrature's quadratures quadrennial quadrilateral quadrillion quadruple quadrupled quadruples quadrupling quadrupole quaff quagmire quagmire's quagmires quahog quail quail's quails quaint quaintly quaintness quake quaked quaker quakers quakes quaking qualification qualifications qualified qualifier qualifiers qualifies qualify qualifying qualitative qualitatively qualities quality quality's qualm quandaries quandary quandary's quanta quantifiable quantification quantifications quantified quantifier quantifiers quantifies quantify quantifying quantile quantitative quantitatively quantities quantity quantity's quantization quantize quantized quantizes quantizing quantum quarantine quarantine's quarantines quarantining quark quarrel quarreled quarreling quarrels quarrelsome quarries quarry quarry's quart quarter quarterback quartered quartering quarterly quartermaster quarters quartet quartet's quartets quartile quarts quartz quartzite quasar quash quashed quashes quashing quasi quaternaries quaternary quaver quavered quavering quavers quay queasy queen queen's queenly queens queer queerer queerest queerly queerness quell quelling quench quenched quenches quenching queried queries query querying quest quested quester questers questing question questionable questionably questioned questioner questioners questioning questioningly questionings questionnaire questionnaire's questionnaires questions quests queue queued queueing queuer queuers queues queuing quibble quibbles quick quicken quickened quickening quickens quicker quickest quickie quicklime quickly quickness quicksand quicksilver quicksort quiescent quiescently quiescentness quiet quieted quieter quietest quieting quietly quietness quiets quietude quill quills quilt quilted quilting quilts quince quinine quint quintet quintillion quip quirk quirks quirky quit quite quits quitter quitter's quitters quitting quiver quivered quivering quivers quixotic quiz quizzed quizzes quizzical quizzing quo quonset quorum quota quota's quotas quotation quotation's quotations quote quoted quotes quoth quotient quotients quoting r rabbi rabbis rabbit rabbit's rabbits rabble rabid rabies raccoon raccoon's raccoons race raced racer racers races racetrack racial racially racing racist rack racked racket racket's racketeer racketeering racketeers rackets racking racks radar radar's radars radial radially radian radiance radians radiant radiantly radiate radiated radiates radiating radiation radiations radiator radiator's radiators radical radically radicals radices radii radio radio's radioactive radioactivity radioastronomy radioed radiography radioing radiology radios radiotelephones radish radish's radishes radium radius radix radon raft rafter rafters rafts rag rag's rage raged rages ragged raggedly raggedness raging rags ragweed raid raided raider raiders raiding raids rail railed railer railers railing railroad railroaded railroader railroaders railroading railroads rails railway railway's railways raiment rain rainbow raincoat raincoat's raincoats raindrop raindrop's raindrops rained rainfall rainforest rainier rainiest raining rains rainstorm rainstorms rainwater rainy raise raised raiser raisers raises raisin raising rake raked rakes raking rallied rallies rally rallying ram ram's ramble rambler rambles rambling ramblings ramification ramification's ramifications ramp ramp's rampage rampant rampart ramps ramrod rams ran ranch ranched rancher ranchers ranches ranching rancid random randomization randomize randomized randomizes randomizing randomly randomness randy rang range ranged rangeland ranger rangers ranges ranging rangy rank ranked ranker ranker's rankers rankest ranking ranking's rankings rankle rankly rankness ranks ransack ransacked ransacking ransacks ransom ransomer ransoming ransoms rant ranted ranter ranters ranting rants rap rap's rapacious rape raped raper rapes rapid rapidity rapidly rapids rapier raping rapport rapprochement raps rapt raptly rapture rapture's raptures rapturous rare rarely rareness rarer rarest rareties rarety rarety's rarity rascal rascally rascals rash rasher rashly rashness rasp raspberries raspberry rasped rasping rasps raster rat rat's ratchet rate rated rater raters rates rather ratification ratified ratifies ratify ratifying rating ratings ratio ratio's ration rational rationale rationale's rationales rationalities rationality rationalization rationalizations rationalize rationalized rationalizes rationalizing rationally rationals rationing rations ratios rats rattle rattled rattler rattlers rattles rattlesnake rattlesnake's rattlesnakes rattling raucous ravage ravaged ravager ravagers ravages ravaging rave raved ravel ravels raven ravening ravenous ravenously ravens raves ravine ravine's ravines raving ravings raw rawer rawest rawly rawness ray ray's rays raze razor razor's razors re reabbreviate reabbreviated reabbreviates reabbreviating reach reachability reachable reachably reached reacher reaches reaching reacquire reacquired react reacted reacting reaction reaction's reactionaries reactionary reactionary's reactions reactivate reactivated reactivates reactivating reactivation reactive reactively reactivity reactor reactor's reactors reacts read readability readable reader reader's readers readied readier readies readiest readily readiness reading readings readjusted readjustment readout readout's readouts reads ready readying real realer realest realign realigned realigning realigns realism realist realist's realistic realistically realists realities reality realizable realizably realization realization's realizations realize realized realizes realizing reallocate reallocated reallocates reallocating reallocation reallot reallotment reallotments reallots reallotted reallotting really realm realm's realms realness reals realtor ream reanalyze reanalyzes reanalyzing reannounce reap reaped reaper reaping reappear reappeared reappearing reappears reappraisal reappraisals reaps rear reared rearing rearrange rearrangeable rearranged rearrangement rearrangement's rearrangements rearranges rearranging rearrest rearrested rears reason reasonable reasonableness reasonably reasoned reasoner reasoning reasonings reasons reassemble reassembled reassembles reassembling reassembly reassessment reassessment's reassessments reassign reassigned reassigning reassignment reassignment's reassignments reassigns reassurance reassure reassured reassures reassuring reawaken reawakened reawakening reawakens rebalance rebate rebate's rebates rebel rebel's rebelled rebelling rebellion rebellion's rebellions rebellious rebelliously rebelliousness rebels rebind rebinding rebinds rebirth reboot rebooted rebooting reboots reborn rebound rebounded rebounding rebounds rebroadcast rebroadcasting rebroadcasts rebuff rebuffed rebuild rebuilding rebuilds rebuilt rebuke rebuked rebukes rebuking rebuttal rebutted rebutting recalcitrant recalculate recalculated recalculates recalculating recalculation recalculations recalibrate recalibrated recalibrates recalibrating recall recalled recalling recalls recant recap recapitulate recapitulated recapitulates recapitulation recapture recaptured recaptures recapturing recast recasting recasts recede receded recedes receding receipt receipt's receipts receivable receive received receiver receiver's receivers receives receiving recent recently recentness receptacle receptacle's receptacles reception reception's receptions receptive receptively receptiveness receptivity receptor recess recessed recesses recession recessive rechecked rechecking recipe recipe's recipes recipient recipient's recipients reciprocal reciprocally reciprocals reciprocate reciprocated reciprocates reciprocating reciprocation reciprocity recirculate recirculated recirculates recirculating recital recital's recitals recitation recitation's recitations recite recited reciter recites reciting reckless recklessly recklessness reckon reckoned reckoner reckoning reckonings reckons reclaim reclaimable reclaimed reclaimer reclaimers reclaiming reclaims reclamation reclamations reclassification reclassified reclassifies reclassify reclassifying recline reclining recode recoded recodes recoding recognition recognition's recognitions recognizability recognizable recognizably recognize recognized recognizer recognizers recognizes recognizing recoil recoiled recoiling recoils recollect recollected recollecting recollection recollection's recollections recombination recombine recombined recombines recombining recommenced recommend recommendable recommendation recommendation's recommendations recommended recommender recommending recommends recompense recompilation recompilations recompile recompiled recompiles recompiling recompute recomputed recomputes recomputing reconcile reconciled reconciler reconciles reconciliation reconciling reconfigurable reconfiguration reconfiguration's reconfigurations reconfigure reconfigured reconfigurer reconfigures reconfiguring reconfirmed reconfirming reconnect reconnected reconnecting reconnection reconnects reconnoiter reconsider reconsideration reconsidered reconsidering reconsiders reconstituted reconstruct reconstructed reconstructing reconstruction reconstructions reconstructs reconvened reconvert reconverted reconverts record recorded recorder recorders recording recordings records recount recounted recounting recounts recourse recover recoverability recoverable recovered recoveries recovering recovers recovery recovery's recreate recreated recreates recreating recreation recreational recreations recreative recruit recruit's recruited recruiter recruiting recruits recta rectangle rectangle's rectangles rectangular rectangularly rectified rectify rector rector's rectors rectum rectum's rectums recuperate recur recurrence recurrence's recurrences recurrency recurrent recurrently recurring recurs recurse recursed recurses recursing recursion recursion's recursions recursive recursively recursivity recyclable recycle recycled recycles recycling red redbreast redcoat redden reddened redder reddest reddish reddishness redeclare redeclared redeclares redeclaring redeem redeemed redeemer redeemers redeeming redeems redefine redefined redefines redefining redefinition redefinition's redefinitions redemption redesign redesigned redesigning redesigns redevelopment redhead redirect redirected redirecting redirection redirections redirects redisplay redisplayed redisplaying redisplays redistribute redistributed redistributes redistributing redistribution redly redneck redness redo redone redouble redoubled redraw redrawing redrawn redraws redress redressed redresses redressing reds reduce reduced reducer reducers reduces reducibility reducible reducibly reducing reduction reduction's reductionist reductions reductive redundancies redundancy redundant redundantly redwood reed reed's reeds reeducation reef reefer reefs reel reelect reelected reelecting reelects reeled reeler reeling reels reemphasize reemphasized reemphasizes reemphasizing reenabled reenabling reencrypt reencrypting reencrypts reenforcement reenter reentered reentering reenters reentrant reentry reestablish reestablished reestablishes reestablishing reevaluate reevaluated reevaluates reevaluating reevaluation reexamine reexamined reexamines reexamining reexecuted refer referee refereed refereeing referees reference referenced referencer references referencing referenda referendum referendums referent referent's referential referentiality referentially referents referral referral's referrals referred referring refers refetch refill refillable refilled refilling refills refine refined refinement refinement's refinements refiner refiners refinery refines refining reflect reflected reflecting reflection reflection's reflections reflective reflectively reflectivity reflector reflector's reflectors reflects reflex reflex's reflexes reflexive reflexively reflexiveness reflexivity reforestation reform reformable reformat reformation reformatory reformats reformatted reformatting reformed reformer reformers reforming reforms reformulate reformulated reformulates reformulating reformulation refract refracted refraction refractory refragment refrain refrained refraining refrains refresh refreshed refresher refreshers refreshes refreshing refreshingly refreshment refreshment's refreshments refrigerate refrigerator refrigerator's refrigerators refuel refueled refueling refuels refuge refugee refugee's refugees refund refusal refuse refused refuses refusing refutable refutation refute refuted refuter refutes refuting regain regained regaining regains regal regaled regally regard regarded regarding regardless regards regatta regenerate regenerated regenerates regenerating regeneration regenerative regenerator regenerators regent regent's regents regime regime's regimen regiment regimentation regimented regiments regimes region region's regional regionally regions register register's registered registering registers registrar registration registration's registrations registries registry regress regressed regresses regressing regression regression's regressions regressive regret regretful regretfully regrets regrettable regrettably regretted regretting regroup regrouped regrouping regular regularities regularity regularly regulars regulate regulated regulates regulating regulation regulations regulative regulator regulator's regulators regulatory rehabilitate rehabilitation rehash rehashing rehearsal rehearsal's rehearsals rehearse rehearsed rehearser rehearses rehearsing reign reigned reigning reigns reimbursable reimburse reimbursed reimbursement reimbursement's reimbursements rein reincarnate reincarnated reincarnation reindeer reined reinforce reinforced reinforcement reinforcement's reinforcements reinforcer reinforces reinforcing reinform reinitialization reinitialize reinitialized reinitializes reinitializing reins reinsert reinserted reinserting reinsertion reinsertions reinserts reinstall reinstalled reinstalling reinstalls reinstate reinstated reinstatement reinstates reinstating reinterpret reinterpreted reinterpreting reinterprets reintroduce reintroduced reintroduces reintroducing reinvent reinvented reinventing reinvents reinvoke reinvoked reinvokes reinvoking reiterate reiterated reiterates reiterating reiteration reject rejected rejecting rejection rejection's rejections rejector rejector's rejectors rejects rejoice rejoiced rejoicer rejoices rejoicing rejoin rejoinder rejoined rejoining rejoins relabel relabeled relabeling relabelled relabelling relabels relapse relate related relater relates relating relation relational relationally relations relationship relationship's relationships relative relatively relativeness relatives relativism relativistic relativistically relativity relax relaxation relaxation's relaxations relaxed relaxer relaxes relaxing relay relayed relaying relays relearn release released releases releasing relegate relegated relegates relegating relent relented relenting relentless relentlessly relentlessness relents relevance relevances relevant relevantly reliabilities reliability reliable reliableness reliably reliance reliant relic relic's relics relied relief relies relieve relieved reliever relievers relieves relieving religion religion's religions religious religiously religiousness relink relinking relinquish relinquished relinquishes relinquishing relish relished relishes relishing relive relives reliving reload reloaded reloader reloading reloads relocatable relocate relocated relocates relocating relocation relocations reluctance reluctant reluctantly rely relying remain remainder remainder's remainders remained remaining remains remapping remark remarkable remarkableness remarkably remarked remarking remarks remedial remedied remedies remedy remedying remember remembered remembering remembers remembrance remembrance's remembrances remind reminded reminder reminders reminding reminds reminiscence reminiscence's reminiscences reminiscent reminiscently remission remit remittance remnant remnant's remnants remodel remodeled remodeling remodels remonstrate remonstrated remonstrates remonstrating remonstration remonstrative remorse remorseful remote remotely remoteness remoter remotest removable removal removal's removals remove removed remover removes removing remunerate remuneration renaissance renal rename renamed renames renaming rend render rendered rendering renderings renders rendezvous rending rendition rendition's renditions rends renegotiable renegotiated renew renewal renewed renewer renewing renews renounce renounces renouncing renovate renown renowned rent rental rental's rentals rented renting rents renumber renumbering renumbers renunciate reoccur reoccurring reopen reopened reopening reopens reorder reordered reordering reorders reorganization reorganization's reorganizations reorganize reorganized reorganizer reorganizes reorganizing reoriented repackage repackaged repacked repaid repainted repainting repair repaired repairer repairing repairman repairmen repairpersons repairs reparation reparation's reparations repartee repartitioning repast repast's repasts repay repaying repays repeal repealed repealer repealing repeals repeat repeatable repeated repeatedly repeater repeaters repeating repeats repel repelled repellent repels repent repentance repented repenting repents repercussion repercussion's repercussions repertoire repertory repetition repetition's repetitions repetitious repetitive repetitively repetitiveness rephrase rephrased rephrases rephrasing repine replace replaceable replaced replacement replacement's replacements replacer replaces replacing replay replayed replaying replays replenish replenished replenishes replenishing replete repleteness repletion replica replicas replicate replicated replicates replicating replication replications replicator replicators replied replies replugged reply replying repopulated report reported reportedly reporter reporters reporting reports repose reposed reposes reposing reposition repositioned repositioning repositions repositories repository repository's reprehensible represent representable representably representation representation's representational representationally representations representative representatively representativeness representatives represented representing represents repress repressed represses repressing repression repression's repressions repressive reprieve reprieved reprieves reprieving reprimand reprint reprinted reprinting reprints reprisal reprisal's reprisals reproach reproached reproaches reproaching reproduce reproduced reproducer reproducers reproduces reproducibilities reproducibility reproducible reproducibly reproducing reproduction reproduction's reproductions reproductive reprogram reprogrammed reprogramming reprograms reproof reprove reprover reptile reptile's reptiles reptilian republic republic's republican republican's republicans republics republish republished republishes republishing repudiate repudiated repudiates repudiating repudiation repudiations repugnant repulse repulsed repulses repulsing repulsion repulsions repulsive reputable reputably reputation reputation's reputations repute reputed reputedly reputes request requested requester requester's requesters requesting requests require required requirement requirement's requirements requires requiring requisite requisites requisition requisitioned requisitioning requisitions reread rereading rereads reregister reregisters reroute rerouted reroutes rerouting rerun rerunning reruns resale rescan rescanned rescanning rescans reschedule rescheduled rescheduling rescind rescue rescued rescuer rescuers rescues rescuing research research's researched researcher researchers researches researching reselect reselected reselecting reselects resell reselling resemblance resemblance's resemblances resemble resembled resemblence resembles resembling resend resends resent resented resentful resentfully resenting resentment resents reserpine reservation reservation's reservations reserve reserved reserver reserves reserving reservoir reservoir's reservoirs reset resets resetting resettings reshuffled reside resided residence residence's residences resident resident's residential residentially residents resides residing residual residue residue's residues resign resignation resignation's resignations resigned resigning resigns resilience resilient resin resin's resins resist resistable resistably resistance resistances resistant resistantly resisted resistible resisting resistive resistivity resistor resistor's resistors resists resolute resolutely resoluteness resolution resolutions resolvable resolve resolved resolver resolvers resolves resolving resonance resonances resonant resonate resort resorted resorting resorts resound resounding resoundingly resounds resource resource's resourceful resourcefully resourcefulness resources respect respectability respectable respectably respected respecter respectful respectfully respectfulness respecting respective respectively respects respiration respirator respiratory respite resplendent resplendently respond responded respondent respondent's respondents responder responding responds response responses responsibilities responsibility responsible responsibleness responsibly responsive responsively responsiveness rest restart restarted restarting restarts restate restated restatement restates restating restaurant restaurant's restaurants restaurateur rested restful restfully restfulness resting restitution restive restless restlessly restlessness restock restocking restoration restoration's restorations restore restored restorer restorers restores restoring restrain restrained restrainer restrainers restraining restrains restraint restraint's restraints restrict restricted restricting restriction restriction's restrictions restrictive restrictively restrictiveness restricts restroom restructure restructured restructures restructuring rests result resultant resultantly resultants resulted resulting results resumable resume resumed resumes resuming resumption resumption's resumptions resurgent resurrect resurrected resurrecting resurrection resurrection's resurrections resurrector resurrectors resurrects resuscitate resynchronization resynchronizations resynchronize resynchronized resynchronizes resynchronizing retail retailer retailers retailing retain retained retainer retainers retaining retainment retains retaliate retaliation retaliatory retard retardation retarded retarder retarding retargeted retch retention retentions retentive retentively retentiveness rethinking rethought reticle reticle's reticles reticular reticulate reticulated reticulately reticulates reticulating reticulation retina retina's retinal retinas retinue retire retired retiree retirement retirement's retirements retires retiring retort retorted retorting retorts retrace retraced retraces retracing retract retracted retracting retraction retractions retracts retrain retrained retraining retrains retranslate retranslated retransmission retransmission's retransmissions retransmit retransmits retransmitted retransmitting retreat retreated retreating retreats retribution retried retrier retriers retries retrievable retrieval retrieval's retrievals retrieve retrieved retriever retrievers retrieves retrieving retroactive retroactively retrofit retrofitting retrograde retrospect retrospection retrospective retry retrying return returnable returned returner returning returns retype retyped retypes retyping reunion reunion's reunions reunite reunited reuniting reusable reuse reused reuses reusing revamp revamped revamping revamps reveal revealed revealing reveals revel revelation revelation's revelations reveled reveler reveling revelry revels revenge revenger revenue revenuers revenues reverberate revere revered reverence reverend reverend's reverends reverent reverently reveres reverie reverified reverifies reverify reverifying revering reversal reversal's reversals reverse reversed reversely reverser reverses reversible reversing reversion revert reverted reverting reverts review reviewed reviewer reviewers reviewing reviews revile reviled reviler reviling revise revised reviser revises revising revision revision's revisions revisit revisited revisiting revisits revival revival's revivals revive revived reviver revives reviving revocable revocation revocations revoke revoked revoker revokes revoking revolt revolted revolter revolting revoltingly revolts revolution revolution's revolutionaries revolutionary revolutionary's revolutionize revolutionized revolutionizer revolutions revolve revolved revolver revolvers revolves revolving revulsion revved reward rewarded rewarding rewardingly rewards rewind rewinding rewinds rewire rewired rework reworked reworking reworks rewound rewrite rewrites rewriting rewritings rewritten rewrote rhapsody rhesus rhetoric rheumatic rheumatism rhinestone rhino rhinoceros rho rhode rhododendron rhombic rhombus rhubarb rhyme rhymed rhymes rhyming rhythm rhythm's rhythmic rhythmically rhythms rib rib's ribald ribbed ribbing ribbon ribbon's ribbons riboflavin ribonucleic ribs rica rice rich richer riches richest richly richness rickets rickety rickshaw rickshaw's rickshaws rico ricochet rid riddance ridden ridding riddle riddled riddles riddling ride rider riders rides ridge ridge's ridgepole ridges ridicule ridiculed ridicules ridiculing ridiculous ridiculously ridiculousness riding rids rifle rifled rifleman rifler rifles rifling rift rig rig's rigging right righted righteous righteously righteousness righter rightful rightfully rightfulness righting rightly rightmost rightness rights rightward rightwards rigid rigidity rigidly rigor rigorous rigorously rigors rigs rill rim rim's rime rims rind rind's rinds ring ringed ringer ringers ringing ringingly ringings rings ringside rink rinse rinsed rinser rinses rinsing riot rioted rioter rioters rioting riotous riots rip ripe ripely ripen ripeness ripoff ripped ripping ripple rippled ripples rippling rips rise risen riser risers rises rising risings risk risked risking risks risky rite rite's rites ritual ritually rituals rival rivaled rivalled rivalling rivalries rivalry rivalry's rivals river river's riverbank riverfront rivers riverside rivet riveter rivets rivulet rivulet's rivulets roach road road's roadbed roadblock roads roadside roadster roadster's roadsters roadway roadway's roadways roam roamed roaming roams roar roared roarer roaring roars roast roasted roaster roasting roasts rob robbed robber robber's robberies robbers robbery robbery's robbing robe robed robes robin robin's robing robins robot robot's robotic robotics robots robs robust robustly robustness rochester rock rockabye rocked rocker rockers rocket rocketed rocketing rockets rockies rocking rocks rocky rod rod's rode rodent rodents rodeo rods roe rogue rogue's rogues role role's roles roll rollback rolled roller rollers rolling rolls roman romance romancer romancers romances romancing romansch romantic romantic's romantically romantics rome romp romped romper romping romps roof roofed roofer roofing roofs rooftop rooftops rook rookie rooks room roomed roomer roomers roomful roomier rooming roommate rooms roomy roost rooster roosters root root's rooted rooter rooting roots rope roped roper ropers ropes roping rosary rose rose's rosebud rosebud's rosebuds rosebush rosemary roses rosetta rosette rosiness roster rostrum rosy rot rotary rotate rotated rotates rotating rotation rotational rotations rotator rotor rotors rots rotted rotten rottenness rotterdam rotting rotund rotunda rouge rough roughed roughen rougher roughest roughly roughneck roughness roulette round roundabout rounded roundedness rounder roundest roundhead roundhouse rounding roundly roundness roundoff rounds roundtable roundup roundworm rouse roused rouses rousing roustabout rout route routed router router's routers routers' routes routine routinely routines routing routings rove roved rover roves roving row rowboat rowdy rowed rower rowing rows royal royalist royalist's royalists royally royalties royalty royalty's rub rubbed rubber rubber's rubbers rubbery rubbing rubbish rubble rubdown rubens rubies ruble ruble's rubles rubout rubs ruby ruby's rudder rudder's rudders ruddiness ruddy rude rudely rudeness ruder rudest rudiment rudiment's rudimentarily rudimentary rudiments rue ruefully ruffian ruffianly ruffians ruffle ruffled ruffles rug rug's rugby rugged ruggedly ruggedness rugs ruin ruination ruination's ruinations ruined ruining ruinous ruinously ruins rule ruled ruler rulers rules ruling rulings rum rumania rumanian rumble rumbled rumbler rumbles rumbling rumen rummage rummy rumor rumored rumors rump rumple rumpled rumply rumpus run runaway rundown rung rung's rungs runnable runner runner's runners running runoff runs runt runtime runway rupee rupture ruptured ruptures rupturing rural rurally ruse rush rushed rusher rushes rushing russet russia russian russian's russians rust rusted rustic rusticate rusticated rusticates rusticating rustication rusting rustle rustled rustler rustlers rustles rustling rusts rusty rut rut's rutabagas rutgers ruthless ruthlessly ruthlessness ruts rye s s's sabbath sabbatical saber saber's sabers sable sable's sables sabotage sack sacker sacking sacks sacrament sacred sacredly sacredness sacrifice sacrificed sacrificer sacrificers sacrifices sacrificial sacrificially sacrificing sacrilege sacrilegious sacrosanct sad sadden saddened saddens sadder saddest saddle saddlebag saddled saddles sadism sadist sadist's sadistic sadistically sadists sadly sadness safari safaris safe safeguard safeguarded safeguarding safeguards safekeeping safely safeness safer safes safest safeties safety safety's saffron sag saga sagacious sagacity sage sagebrush sagely sages sagging sagittal sags saguaro sahara said sail sailboat sailed sailfish sailing sailor sailorly sailors sails saint sainted sainthood saintly saints sake sakes salable salad salad's salads salamander salami salaried salaries salary sale sale's sales salesgirl saleslady salesman salesmen salespeople salespeoples' salesperson salient saline saliva salivary salivate salivating sallies sallow sally sallying salmon salon salon's salons saloon saloon's saloons salt salted salter salters saltier saltiest saltiness salting salts salty salutary salutation salutation's salutations salute saluted salutes saluting salvage salvaged salvager salvages salvaging salvation salve salver salves same sameness sample sampled sampler samplers samples sampling samplings sanatoria sanatorium sanctification sanctified sanctify sanctimonious sanction sanctioned sanctioning sanctions sanctity sanctuaries sanctuary sanctuary's sand sandal sandal's sandals sandbag sandboxes sanded sander sanders sanding sandman sandpaper sands sandstone sandwich sandwiched sandwiches sandy sane sanely saner sanest sang sanguine sanitarium sanitary sanitation sanity sank sanskrit santa sap sap's sapiens sapling sapling's saplings sapphire saps sapsucker sarcasm sarcasm's sarcasms sarcastic sardine sardines sardonic sari sarongs sartorial sash sat satan satanic satchel satchel's satchels sate sated satellite satellite's satellites sates satin sating satire satire's satires satiric satirized satisfaction satisfaction's satisfactions satisfactorily satisfactory satisfiability satisfiable satisfied satisfies satisfy satisfying saturate saturated saturates saturating saturation saturday saturday's saturdays satyr sauce saucepan saucepan's saucepans saucer saucers sauces saucy saudi sauna saunter sauntered sausage sausage's sausages savage savaged savagely savageness savager savagers savages savaging savannah save saved saver savers saves saving savings savior savior's saviors savor savored savoring savors savory saw sawdust sawed sawfish sawing sawmill sawmill's sawmills saws sawtooth sax saxophone say sayer sayers saying sayings says scab scabbard scabbard's scabbards scabrous scaffold scaffolding scaffoldings scaffolds scalability scalable scalar scalar's scalars scald scalded scalding scale scaled scales scaling scalings scallop scalloped scallops scalp scalp's scalps scaly scamper scampering scampers scan scandal scandal's scandalous scandals scandinavian scanned scanner scanner's scanners scanning scans scant scantier scantiest scantily scantiness scantly scanty scapegoat scar scar's scarce scarcely scarceness scarcer scarcest scarcity scare scarecrow scared scares scarf scaring scarlet scars scarves scary scatter scatterbrain scattered scattering scatters scenario scenario's scenarios scene scene's scenery scenes scenic scent scented scents scepter scepter's scepters sceptical schedulable schedule scheduled scheduler scheduler's schedulers schedules scheduling schema schema's schemas schemata schematic schematically schematics scheme scheme's schemed schemer schemers schemes scheming schism schizophrenia schizophrenically schnitzel scholar scholarly scholars scholarship scholarship's scholarships scholastic scholastically scholastics school school's schoolboy schoolboy's schoolboys schooled schooler schoolers schoolhouse schoolhouse's schoolhouses schooling schoolmaster schoolmaster's schoolmasters schoolroom schoolroom's schoolrooms schools schooner science science's sciences scientific scientifically scientist scientist's scientists scissor scissored scissoring scissors sclerosis sclerotic scoff scoffed scoffer scoffing scoffs scold scolded scolding scolds scoop scooped scooping scoops scoot scope scoped scopes scoping scorch scorched scorcher scorches scorching score scoreboard scorecard scored scorer scorers scores scoring scorings scorn scorned scorner scornful scornfully scorning scorns scorpion scorpion's scorpions scotch scotland scottish scoundrel scoundrel's scoundrels scour scoured scourge scouring scours scout scouted scouting scouts scow scowl scowled scowling scowls scram scramble scrambled scrambler scrambles scrambling scrap scrap's scrapbook scrape scraped scraper scrapers scrapes scraping scrapings scrapped scrapping scraps scratch scratched scratcher scratchers scratches scratching scratchpad scratchpad's scratchpads scratchy scrawl scrawled scrawling scrawls scrawny scream screamed screamer screamers screaming screams screech screeched screeches screeching screen screen's screened screening screenings screenplay screens screw screwball screwdriver screwed screwing screws scribble scribbled scribbler scribbles scribe scribes scribing scrimmage script script's scripts scripture scriptures scroll scrolled scrolling scrolls scrooge scrounge scrub scruffy scrumptious scruple scrupulous scrupulously scrutinize scrutinized scrutinizing scrutiny scuba scud scuffle scuffled scuffles scuffling sculpt sculpted sculptor sculptor's sculptors sculpts sculpture sculptured sculptures scurried scurry scurrying scurvy scuttle scuttled scuttles scuttling scythe scythe's scythes sdlc sea seabed seaboard seacoast seacoast's seacoasts seafood seagull seahorse seal sealed sealer sealing seals sealy seam seaman seamed seamen seaming seamless seams seamy seaplow seaport seaport's seaports sear search searched searcher searchers searches searching searchingly searchings searchlight searchlight's seared searing searingly sears seas seashore seashore's seashores seasickness seaside season seasonable seasonably seasonal seasonally seasoned seasoner seasoners seasoning seasonings seasons seat seated seating seats seattle seaward seaweed sec secant secede seceded secedes seceding secession seclude secluded secludes secluding seclusion second secondaries secondarily secondary seconded seconder seconders secondhand seconding secondly seconds secrecy secret secretarial secretariat secretaries secretary secretary's secrete secreted secretes secreting secretion secretions secretive secretively secretly secrets secs sect sect's sectarian section section's sectional sectioned sectioning sections sector sector's sectors sects secular secure secured securely secures securing securings securities security sedan sedate sedge sediment sediment's sedimentary sediments sedition seditious seduce seduced seducer seducers seduces seducing seduction seductive see seed seeded seeder seeders seeding seedings seedling seedling's seedlings seeds seedy seeing seek seeker seekers seeking seeks seem seemed seeming seemingly seemly seems seen seep seepage seeped seeping seeps seer seers seersucker sees seethe seethed seethes seething segment segment's segmentation segmentation's segmentations segmented segmenting segments segregate segregated segregates segregating segregation seismic seismograph seismology seize seized seizes seizing seizure seizure's seizures seldom select selectable selected selectedly selecting selection selection's selections selective selectively selectivity selectman selectmen selector selector's selectors selects selenium self selfish selfishly selfishness selfsame sell seller sellers selling sellout sells seltzer selves semantic semantical semantically semanticist semanticist's semanticists semantics semaphore semaphore's semaphores semblance semester semester's semesters semi semiautomated semicentralized semicolon semicolon's semicolons semiconductor semiconductor's semiconductors semifinals semiformal seminal seminar seminar's seminarian seminaries seminars seminary seminary's semipermanent semipermanently semisubmersible sempahore senate senate's senates senator senator's senatorial senators send sender sender's senders sending sends senile senior senior's seniority seniors sensation sensation's sensational sensationally sensations sense sensed senseless senselessly senselessness senses sensibilities sensibility sensible sensibly sensing sensitive sensitively sensitiveness sensitives sensitivities sensitivity sensor sensor's sensors sensory sensuous sent sentence sentenced sentences sentencing sentential sentiment sentiment's sentimental sentimentally sentiments sentinel sentinel's sentinels sentries sentry sentry's seoul separable separate separated separately separateness separates separating separation separations separator separator's separators sepia sept september sepulcher sepulcher's sepulchers sequel sequel's sequels sequence sequenced sequencer sequencer's sequencers sequences sequencing sequencings sequential sequentiality sequentialize sequentialized sequentializes sequentializing sequentially sequester sequoia serendipitous serendipity serene serenely serenity serf serf's serfs sergeant sergeant's sergeants serial serializability serializable serialization serialization's serializations serialize serialized serializes serializing serially serials series serif serious seriously seriousness sermon sermon's sermons serpent serpent's serpentine serpents serum serum's serums servant servant's servants serve served server servers serves service serviceability serviceable serviced serviceman servicemen services servicing servile serving servings servitude servo servomechanism sesame session session's sessions set set's setback sets settable setter setter's setters setting settings settle settled settlement settlement's settlements settler settlers settles settling setuid setup setups seven sevenfold sevens seventeen seventeens seventeenth seventh seventies seventieth seventy sever several severalfold severally severance severe severed severely severer severest severing severities severity severity's severs sew sewage sewed sewer sewers sewing sews sex sexed sexes sexist sextet sextillion sexton sextuple sextuplet sexual sexuality sexually sexy seychelles shabby shack shacked shackle shackled shackles shackling shacks shade shaded shades shadier shadiest shadily shadiness shading shadings shadow shadowed shadowing shadows shadowy shady shaft shaft's shafts shaggy shakable shakably shake shakedown shaken shaker shakers shakes shakespeare shakespeare's shakily shakiness shaking shaky shale shall shallow shallower shallowly shallowness sham sham's shambles shame shamed shameful shamefully shameless shamelessly shames shaming shampoo shamrock shams shan't shannon shannon's shanties shanty shanty's shape shaped shapeless shapelessly shapelessness shapely shaper shapers shapes shaping sharable shard share shareable sharecropper sharecropper's sharecroppers shared shareholder shareholder's shareholders sharer sharers shares sharing shark shark's sharks sharp sharpen sharpened sharpening sharpens sharper sharpest sharply sharpness sharpshoot shatter shattered shattering shatterproof shatters shave shaved shaven shaves shaving shavings shawl shawl's shawls she she'd she'll she's sheaf shear sheared shearer shearing shears sheath sheathing sheaths sheaves shed shedding sheds sheen sheep sheepishly sheepskin sheer sheered sheet sheeted sheeting sheets sheik shelf shell shell's shelled sheller shelling shells shelter sheltered sheltering shelters shelve shelved shelves shelving shenanigan shepherd shepherd's shepherds sherbet sheriff sheriff's sheriffs sherry shibboleth shied shield shielded shielding shields shies shift shifted shifter shifters shiftier shiftiest shiftily shiftiness shifting shifts shifty shill shilling shillings shimmer shimmering shin shinbone shine shined shiner shiners shines shingle shingle's shingles shining shiningly shintoism shiny ship ship's shipboard shipbuilding shipmate shipment shipment's shipments shipped shipper shipper's shippers shipping ships shipshape shipwreck shipwrecked shipwrecks shipyard shire shirk shirker shirking shirks shirt shirting shirts shiver shivered shiverer shivering shivers shoal shoal's shoals shock shocked shocker shockers shocking shockingly shocks shod shoddy shoe shoed shoehorn shoehorning shoeing shoelace shoemaker shoes shoestring shone shook shoot shooter shooters shooting shootings shoots shop shop's shopkeeper shopkeeper's shopkeepers shopped shopper shopper's shoppers shopping shops shopworn shore shore's shoreline shores shorn short shortage shortage's shortages shortcoming shortcoming's shortcomings shortcut shortcut's shortcuts shorted shorten shortened shortening shortens shorter shortest shortfall shorthand shorthanded shorthands shorting shortish shortly shortness shorts shortsighted shortstop shot shot's shotgun shotgun's shotguns shots should shoulder shouldered shouldering shoulders shouldn't shout shouted shouter shouters shouting shouts shove shoved shovel shoveled shovels shoves shoving show showboat showcase showdown showed shower showered showering showers showing showings shown showpiece showroom shows showy shrank shrapnel shred shred's shredded shredder shredding shreds shrew shrew's shrewd shrewdest shrewdly shrewdness shrews shriek shrieked shrieking shrieks shrill shrilled shrilling shrillness shrilly shrimp shrine shrine's shrines shrink shrinkable shrinkage shrinking shrinks shrivel shriveled shroud shrouded shrub shrub's shrubbery shrubs shrug shrugged shrugs shrunk shrunken shudder shuddered shuddering shudders shuffle shuffleboard shuffled shuffles shuffling shun shuns shunt shunted shunting shunts shut shutdown shutdown's shutdowns shutoff shutout shuts shutter shuttered shutters shutting shuttle shuttlecock shuttled shuttles shuttling shy shyly shyness siberia siberian sibling sibling's siblings siblings' sick sicken sicker sickest sickle sickles sickly sickness sickness's sicknesses sickroom side sidearm sideband sideboard sideboard's sideboards sideburn sideburn's sideburns sidecar sided sidelight sidelight's sidelights sideline sidereal sides sidesaddle sideshow sidestep sidetrack sidewalk sidewalk's sidewalks sideways sidewise siding sidings siege siege's sieges sierra sieve sieve's sieves sift sifted sifter sifting sigh sighed sighing sighs sight sighted sighting sightings sightly sights sightseeing sigma sigmas sign signal signaled signaling signalled signalling signally signals signature signature's signatures signed signer signers signet significance significant significantly significants signification signified signifies signify signifying signing signor signs sikkim silence silenced silencer silencers silences silencing silent silently silhouette silhouetted silhouettes silica silicate silicon silicone silk silken silkier silkiest silkily silks silky sill sill's sillier silliest silliness sills silly silo silt silted silting silts silver silvered silvering silvers silversmith silverware silvery similar similarities similarity similarly simile similitude simmer simmered simmering simmers simper simple simpleminded simpleness simpler simplest simpleton simplex simplicities simplicity simplicity's simplification simplifications simplified simplifier simplifiers simplifies simplify simplifying simplistic simplistically simply simula simulate simulated simulates simulating simulation simulations simulator simulator's simulators simulcast simultaneity simultaneous simultaneously sin sin's since sincere sincerely sincerest sincerity sine sines sinew sinew's sinews sinewy sinful sinfully sinfulness sing singable singapore singe singed singer singers singing singingly single singled singlehanded singleness singles singlet singleton singleton's singletons singling singly sings singsong singular singularities singularity singularity's singularly sinh sinister sink sinked sinker sinkers sinkhole sinking sinks sinned sinner sinner's sinners sinning sins sinuous sinus sinuses sinusoid sinusoidal sinusoids sip siphon siphoned siphoning siphons sipping sips sir sire sired siren sirens sires sirs sirup sister sisterly sisters sit site sited sites siting sits sitter sitter's sitters sitting sittings situ situate situated situates situating situation situational situationally situations six sixes sixfold sixgun sixpence sixteen sixteens sixteenth sixth sixties sixtieth sixty sizable size sized sizes sizing sizings sizzle skate skated skater skaters skates skating skeletal skeleton skeleton's skeletons skelter skeptic skeptic's skeptical skeptically skepticism skeptics sketch sketchbook sketched sketches sketchily sketching sketchpad sketchy skew skewed skewer skewers skewing skews ski skid skidded skidding skids skied skies skiff skiing skill skilled skillet skillful skillfully skillfulness skills skim skim's skimmed skimming skimp skimped skimping skimps skimpy skims skin skin's skindive skinned skinner skinner's skinners skinning skinny skins skip skipped skipper skipper's skippers skipping skips skirmish skirmished skirmisher skirmishers skirmishes skirmishing skirt skirted skirting skirts skis skit skulk skulked skulker skulking skulks skull skull's skullcap skullduggery skulls skunk skunk's skunks sky sky's skyhook skyjack skylark skylarking skylarks skylight skylight's skylights skyline skyrocket skyrockets skyscraper skyscraper's skyscrapers slab slack slacken slacker slacking slackly slackness slacks slain slam slammed slamming slams slander slanderer slanderous slanders slang slant slanted slanting slants slap slapped slapping slaps slapstick slash slashed slashes slashing slat slat's slate slated slater slates slats slaughter slaughtered slaughterhouse slaughtering slaughters slave slaver slavery slaves slavish slay slayer slayers slaying slays sled sled's sledding sledge sledge's sledgehammer sledges sleds sleek sleep sleeper sleepers sleepily sleepiness sleeping sleepless sleeplessly sleeplessness sleeps sleepwalk sleepy sleet sleeve sleeve's sleeves sleigh sleighs sleight slender slenderer slept sleuth slew slewing slice sliced slicer slicers slices slicing slick slicker slickers slicks slid slide slider sliders slides sliding slight slighted slighter slightest slighting slightly slightness slights slim slime slimed slimly slimy sling slinging slings slingshot slip slip's slippage slipped slipper slipper's slipperiness slippers slippery slipping slips slit slit's slither slits sliver slob slogan slogan's slogans sloop slop slope sloped sloper slopers slopes sloping slopped sloppily sloppiness slopping sloppy slops slot slot's sloth slothful sloths slots slotted slotting slouch slouched slouches slouching slovenly slow slowdown slowed slower slowest slowing slowly slowness slows sludge slug sluggish sluggishly sluggishness slugs sluice slum slum's slumber slumbered slumming slump slumped slumps slums slung slur slur's slurp slurped slurring slurry slurs sly slyly smack smacked smacking smacks small smaller smallest smallish smallness smallpox smalltalk smalltime smart smarted smarter smartest smartly smartness smash smashed smasher smashers smashes smashing smashingly smattering smear smeared smearing smears smell smelled smelling smells smelly smelt smelter smelting smelts smile smiled smiles smiling smilingly smirk smite smith smithereens smiths smithsonian smithy smitten smock smocking smocks smog smokable smoke smoked smoker smoker's smokers smokes smokescreen smokestack smokies smoking smoky smolder smoldered smoldering smolders smooch smooth smoothbore smoothed smoother smoothes smoothest smoothing smoothly smoothness smote smother smothered smothering smothers smudge smug smuggle smuggled smuggler smugglers smuggles smuggling smut smutty snack snafu snag snagged snags snail snail's snails snake snaked snakelike snakes snaking snap snapdragon snapped snapper snapper's snappers snappily snapping snappy snaps snapshot snapshot's snapshots snare snared snares snaring snark snarl snarled snarling snatch snatched snatches snatching snazzy sneak sneaked sneaker sneakers sneakier sneakiest sneakily sneakiness sneaking sneaks sneaky sneer sneered sneering sneers sneeze sneezed sneezes sneezing sniff sniffed sniffing sniffle sniffs snifter snigger snip snipe snippet snivel snob snobbery snobbish snobol snoop snooped snooper snooper's snooping snoops snoopy snore snored snores snoring snorkel snorkeled snorkeling snort snorted snorting snorts snotty snout snout's snouts snow snowball snowed snowfall snowflake snowier snowiest snowily snowing snowman snowmen snows snowshoe snowshoe's snowshoes snowstorm snowy snub snuck snuff snuffed snuffer snuffing snuffs snug snuggle snuggled snuggles snuggling snugly snugness so soak soaked soaking soaks soap soaped soaping soaps soapy soar soared soaring soars sob sobbing sober sobered sobering soberly soberness sobers sobriety sobs soccer sociability sociable sociably social socialism socialist socialist's socialists socialize socialized socializes socializing socially societal societies society society's socioeconomic sociological sociologically sociologist sociologists sociology sock socked socket socket's sockets socking socks sod sod's soda sodium sodomy sods sofa sofa's sofas sofia soft softball soften softened softening softens softer softest softly softness software software's softwares soggy soil soiled soiling soils soiree sojourn sojourner sojourners solace solaced solar sold solder soldered soldier soldiering soldierly soldiers sole solely solemn solemnity solemnly solemnness solenoid soles solicit solicitation solicited soliciting solicitor solicitous solicits solicitude solid solidarity solidification solidified solidifies solidify solidifying solidity solidly solidness solids soliloquy solitaire solitary solitude solitude's solitudes solo solo's solomon solos solstice solubility soluble solution solution's solutions solvable solve solved solvent solvent's solvents solver solvers solves solving somatic somber somberly some somebody someday somehow someone someone's someplace somersault something sometime sometimes somewhat somewhere sommelier somnolent son son's sonar sonata sonet sonet's song song's songbook songs sonic sonnet sonnet's sonnets sonny sons soon sooner soonest soot sooth soothe soothed soother soothes soothing soothsayer sop sophisticate sophisticated sophistication sophomore sophomore's sophomores soprano sorcerer sorcerer's sorcerers sorcery sordid sordidly sordidness sore sorely soreness sorer sores sorest sorghum sorority sorrel sorrier sorriest sorrow sorrow's sorrowful sorrowfully sorrows sorry sort sorted sorter sorters sortie sorting sorts souffle sought soul soul's soulful souls sound sounded sounder soundest sounding sounding's soundings soundly soundness soundproof sounds soundtrack soundtracks soup soup's souped soups sour source source's sources sourdough soured sourer sourest souring sourly sourness sours south southbound southeast southeastern southern southerner southerners southernmost southland southpaw southward southwest southwestern souvenir souvenirs sovereign sovereign's sovereigns sovereignty soviet soviet's soviets soy soya soybean spa space spacecraft spaced spacer spacers spaces spaceship spaceship's spaceships spacesuit spacing spacings spacious spade spaded spades spading spaghetti spain span span's spandrel spaniel spanish spank spanked spanking spankingly spanks spanned spanner spanner's spanners spanning spans spare spared sparely spareness sparer spares sparest sparing sparingly spark sparked sparking sparkle sparkling sparks sparring sparrow sparrow's sparrows sparse sparsely sparseness sparser sparsest spasm spastic spat spate spate's spates spatial spatially spatter spattered spatula spawn spawned spawning spawns spayed speak speakable speakeasy speaker speaker's speakers speaking speaks spear speared spearmint spears spec special specialist specialist's specialists specialization specialization's specializations specialize specialized specializes specializing specially specials specialties specialty specialty's specie species specifiable specific specifically specification specifications specificity specifics specified specifier specifiers specifies specify specifying specimen specimen's specimens specious speck speck's speckle speckled speckles specks spectacle spectacled spectacles spectacular spectacularly spectator spectator's spectators specter specter's specters spectra spectral spectrogram spectrogram's spectrograms spectrograph spectrographic spectrography spectrometer spectrophotometer spectrophotometry spectroscope spectroscopic spectroscopy spectrum speculate speculated speculates speculating speculation speculations speculative speculator speculator's speculators sped speech speech's speeches speechless speechlessness speed speedboat speeded speeder speeders speedily speeding speedometer speeds speedup speedup's speedups speedy spell spellbound spelled speller spellers spelling spellings spells spencer spend spender spenders spending spends spent sperm spewed spewing sphere sphere's spheres spherical spherically spheroid spheroidal sphinx spice spiced spices spiciness spicy spider spider's spiders spidery spied spies spiffy spigot spike spiked spikes spill spilled spiller spilling spills spilt spin spinach spinal spinally spindle spindled spindling spine spinnaker spinner spinner's spinners spinning spinoff spins spinster spiny spiral spiraled spiraling spirally spire spire's spires spirit spirited spiritedly spiriting spirits spiritual spiritually spirituals spit spite spited spiteful spitefully spitefulness spites spitfire spiting spits spitting spittle splash splashed splashes splashing splashy spleen splendid splendidly splendor splenetic splice spliced splicer splicers splices splicing splicings spline spline's splines splint splinter splintered splinters splintery split split's splits splitter splitter's splitters splitting splotchy splurge spoil spoilage spoiled spoiler spoilers spoiling spoils spoke spoked spoken spokes spokesman spokesmen sponge sponged sponger spongers sponges sponging spongy sponsor sponsored sponsoring sponsors sponsorship spontaneity spontaneous spontaneously spoof spoofed spoofing spook spooky spool spooled spooler spoolers spooling spools spoon spooned spoonful spooning spoons sporadic sporadically spore spore's spores sport sported sporting sportingly sportive sports sportsman sportsmen sportswear sportswriter sportswriting sporty spot spot's spotless spotlessly spotlight spots spotted spotter spotter's spotters spotting spotty spouse spouse's spouses spout spouted spouting spouts sprain sprang sprawl sprawled sprawling sprawls spray sprayed sprayer spraying sprays spread spreader spreaders spreading spreadings spreads spreadsheet spreadsheets spree spree's sprees sprig sprightly spring springboard springer springers springier springiest springiness springing springs springtime springy sprinkle sprinkled sprinkler sprinkles sprinkling sprint sprinted sprinter sprinters sprinting sprints sprite sprocket sprout sprouted sprouting sprouts spruce spruced sprung spun spunk spur spur's spurious spuriously spurn spurned spurning spurns spurs spurt spurted spurting spurts sputnik sputter sputtered spy spyglass spying squabble squabbled squabbles squabbling squad squad's squadron squadron's squadrons squads squalid squall squall's squalls squander squandered square squared squarely squareness squarer squares squarest squaring squash squashed squashes squashing squat squats squatting squaw squawk squawked squawking squawks squeak squeaked squeaking squeaks squeaky squeal squealed squealing squeals squeamish squeeze squeezed squeezer squeezes squeezing squelch squid squint squinted squinting squire squire's squires squirm squirmed squirms squirmy squirrel squirreled squirreling squirrels squirt squishy stab stabbed stabbing stabile stabilities stability stability's stabilize stabilized stabilizer stabilizers stabilizes stabilizing stable stabled stabler stables stablest stabling stably stabs staccato stack stack's stacked stacking stacks stadia stadium staff staffed staffer staffers staffing staffs stag stag's stage stagecoach stagecoaches staged stager stagers stages stagger staggered staggering staggers staging stagnant stagnate stagnation stags staid stain stained staining stainless stains stair stair's staircase staircase's staircases stairs stairway stairway's stairways stairwell stake staked stakes stalactite stale stalemate stalk stalked stalking stall stalled stalling stallings stallion stalls stalwart stalwartly stamen stamen's stamens stamina stammer stammered stammerer stammering stammers stamp stamped stampede stampeded stampedes stampeding stamper stampers stamping stamps stance stanch stanchest stanchion stand standalone standard standardization standardize standardized standardizes standardizing standardly standards standby standing standings standoff standpoint standpoint's standpoints stands standstill stanford stanza stanza's stanzas staphylococcus staple stapler staples stapling star star's starboard starch starched stardom stare stared starer stares starfish staring stark starkly starlet starlight starling starred starring starry stars start started starter starters starting startle startled startles startling starts startup startup's startups starvation starve starved starves starving state state's stated stateless stately statement statement's statements states statesman statesmanlike statesmen statewide static statical statically stating station station's stationary stationed stationer stationery stationing stationmaster stations statistic statistical statistically statistician statistician's statisticians statistics statue statue's statues statuesque statuesquely statuesqueness statuette stature status statuses statute statute's statutes statutorily statutoriness statutory staunch staunchest staunchly stave staved staves stay stayed staying stays stead steadfast steadfastly steadfastness steadied steadier steadies steadiest steadily steadiness steady steadying steak steak's steaks steal stealer stealing steals stealth stealthily stealthy steam steamboat steamboat's steamboats steamed steamer steamers steaming steams steamship steamship's steamships steamy steed steeds steel steeled steelers steeling steelmaker steels steely steep steeped steeper steepest steeping steeple steeple's steeples steeply steepness steeps steer steerable steered steering steers stegosauruses stellar stem stem's stemmed stemming stems stench stench's stenches stencil stencil's stencils stenographer stenographer's stenographers stenotype step step's stepchild stepchildren stepmother stepmother's stepmothers stepped stepper stepping steps stepson stepwise stereo stereo's stereos stereotype stereotyped stereotypes stereotypical sterile sterilization sterilization's sterilizations sterilize sterilized sterilizer sterilizes sterilizing sterling stern sternly sternness sterns stethoscope stevedore stew steward steward's stewardess stewardesses stewards stewed stews stick sticker stickers stickier stickiest stickily stickiness sticking stickleback sticks sticky stiff stiffen stiffens stiffer stiffest stiffly stiffness stiffs stifle stifled stifles stifling stigma stigmata stile stile's stiles stiletto still stillbirth stillborn stilled stiller stillest stilling stillness stills stilt stilts stimulant stimulant's stimulants stimulate stimulated stimulates stimulating stimulation stimulations stimulative stimuli stimulii stimulus sting stinging stings stingy stink stinker stinkers stinking stinks stint stipend stipend's stipends stipulate stipulated stipulates stipulating stipulation stipulations stir stirred stirrer stirrer's stirrers stirring stirringly stirrings stirrup stirs stitch stitched stitches stitching stochastic stochastically stock stockade stockade's stockades stockbroker stockbrokers stocked stocker stockers stockholder stockholder's stockholders stockholm stocking stockinged stockings stockpile stockroom stocks stocky stodgy stoichiometry stoke stole stole's stolen stoles stolid stomach stomached stomacher stomaches stomaching stomp stone stoned stones stoning stony stood stooge stool stoop stooped stooping stoops stop stopcock stopcocks stopgap stopover stoppable stoppage stopped stopper stopper's stoppers stopping stops stopwatch storage storage's storages store stored storehouse storehouse's storehouses storekeeper storekeepers storeroom stores storied stories storing stork stork's storks storm stormed stormier stormiest storminess storming storms stormy story storyboard storyteller stout stouter stoutest stouthearted stoutly stoutness stove stove's stoves stow stowed stowing stows straddle strafe straggle straggled straggler stragglers straggles straggling straight straightaway straighten straightened straightening straightens straighter straightest straightforward straightforwardly straightforwardness straightness straightway strain strained strainer strainers straining strains strait straiten straits strand stranded stranding strands strange strangely strangeness stranger strangers strangers' strangest strangle strangled strangler stranglers strangles strangling stranglings strangulation strangulation's strangulations strap strap's strapped straps stratagem stratagem's stratagems strategic strategically strategies strategist strategy strategy's stratification stratifications stratified stratifies stratify stratosphere stratospheric stratum straw straw's strawberries strawberry strawberry's straws stray strayed straying strays streak streaked streaking streaks stream streamed streamer streamers streaming streamline streamlined streamliner streamlines streamlining streams street streetcar streetcar's streetcars streeters streets strength strengthed strengthen strengthened strengthener strengthening strengthens strengths strenuous strenuously streptococcus stress stressed stresses stressful stressing stretch stretched stretcher stretchers stretches stretching strew strewn strews stricken strict stricter strictest strictly strictness stricture stride strider strides striding strife strike strikebreaker striker strikers strikes striking strikingly string string's stringed stringent stringently stringer stringers stringier stringiest stringiness stringing strings stringy strip strip's stripe striped stripes stripped stripper stripper's strippers stripping strips striptease strive striven strives striving strivings strobe strobed strobes stroboscopic strode stroke stroked stroker strokers strokes stroking stroll strolled stroller strolling strolls strong stronger strongest stronghold strongly strontium strop stropped stropping strops strove struck struct structural structurally structure structured structurer structures structuring strudel struggle struggled struggles struggling strung strut struts strutting strychnine stub stub's stubbed stubble stubborn stubbornly stubbornness stubby stubs stucco stuck stud stud's student student's students students' studied studies studio studio's studios studious studiously studs study studying stuff stuffed stuffier stuffiest stuffing stuffings stuffs stuffy stumble stumbled stumbles stumbling stump stumped stumping stumps stun stung stunned stunning stunningly stuns stunt stunt's stunts stupefy stupefying stupendous stupendously stupid stupider stupidest stupidities stupidity stupidly stupor sturdiness sturdy sturgeon stutter style styled styler stylers styles styli styling stylish stylishly stylishness stylistic stylistically stylized stylus suave sub subaction subarray subarrays subatomic subcategories subchannel subchannels subclass subclass's subclasses subcommittee subcommittees subcomponent subcomponent's subcomponents subcomputation subcomputation's subcomputations subconscious subconsciously subcube subculture subculture's subcultures subcycle subcycles subdirectories subdirectory subdivide subdivided subdivides subdividing subdivision subdivision's subdivisions subdomain subdomains subdue subdued subdues subduing subet subexpression subexpression's subexpressions subfield subfield's subfields subfile subfile's subfiles subgoal subgoal's subgoals subgraph subgraphs subgroup subgroup's subgroups subinstance subinstances subinterval subinterval's subintervals subject subjected subjecting subjection subjective subjectively subjectivity subjects sublanguage sublanguages sublayer sublayers sublicense sublimated sublimation sublimations sublime sublimed sublist sublist's sublists submarine submariner submariners submarines submerge submerged submerges submerging submersed submission submission's submissions submit submits submittal submitted submitting submode submodes submodule submodule's submodules submultiplexed subnanosecond subnet subnet's subnets subnetwork subnetwork's subnetworks suboptimal subordinate subordinate's subordinated subordinates subordination subpart subparts subphases subpoena subproblem subproblem's subproblems subprocess subprocesses subprogram subprogram's subprograms subproject subproof subproof's subproofs subrange subrange's subranges subroutine subroutine's subroutines subs subschema subschema's subschemas subscribe subscribed subscriber subscriber's subscribers subscribes subscribing subscript subscripted subscripting subscription subscription's subscriptions subscripts subsection subsection's subsections subsegment subsegment's subsegments subsequence subsequence's subsequences subsequent subsequently subservient subset subset's subsets subside subsided subsides subsidiaries subsidiary subsidiary's subsidies subsiding subsidize subsidized subsidizes subsidizing subsidy subsidy's subsist subsisted subsistence subsistent subsisting subsists subslot subslots subspace subspace's subspaces subspecies substance substance's substances substantial substantially substantiate substantiated substantiates substantiating substantiation substantiations substantive substantively substantivity substation substations substitutability substitutable substitute substituted substitutes substituting substitution substitutions substrate substrate's substrates substring substrings substructure substructure's substructures subsume subsumed subsumes subsuming subsystem subsystem's subsystems subtask subtask's subtasks subterfuge subterranean subtheorem subtheorems subtitle subtitled subtitles subtle subtleness subtler subtlest subtleties subtlety subtly subtract subtracted subtracting subtraction subtractions subtractor subtractor's subtractors subtracts subtrahend subtrahend's subtrahends subtree subtree's subtrees subtropics subtype subunit subunit's subunits suburb suburb's suburban suburbia suburbs subversion subversive subvert subverted subverter subverting subverts subway subway's subways succeed succeeded succeeding succeeds success successes successful successfully succession succession's successions successive successively successor successor's successors succinct succinctly succinctness succor succumb succumbed succumbing succumbs such suck sucked sucker suckers sucking suckle suckling sucks suction sudan sudden suddenly suddenness suds sudsing sue sued sues suffer sufferance suffered sufferer sufferers suffering sufferings suffers suffice sufficed suffices sufficiency sufficient sufficiently sufficing suffix suffixed suffixer suffixes suffixing suffocate suffocated suffocates suffocating suffocation suffrage suffragette sugar sugared sugaring sugarings sugars suggest suggested suggestible suggesting suggestion suggestion's suggestions suggestive suggestively suggests suicidal suicidally suicide suicide's suicides suing suit suit's suitability suitable suitableness suitably suitcase suitcase's suitcases suite suited suiters suites suiting suitor suitor's suitors suits sulfa sulfur sulfuric sulfurous sulk sulked sulkiness sulking sulks sulky sullen sullenly sullenness sulphate sulphur sulphured sulphuric sultan sultan's sultans sultry sum sum's sumac summand summand's summands summaries summarily summarization summarization's summarizations summarize summarized summarizes summarizing summary summary's summation summation's summations summed summer summer's summers summertime summing summit summitry summon summoned summoner summoners summoning summons summonses sumptuous sums sun sun's sunbathed sunbathing sunbeam sunbeam's sunbeams sunbonnet sunburn sunburned sunburnt sunday sunday's sundays sunder sundial sundown sundries sundry sunflower sung sunglass sunglasses sunk sunken sunlight sunlit sunned sunning sunny sunrise suns sunset sunshine sunspot sunstroke suntan suntanned suntanning sup super superb superblock superbly supercede superceded supercomputer supercomputer's supercomputers supercomputing superconducting superego superego's superegos superficial superficially superfluities superfluity superfluity's superfluous superfluously supergroup supergroups superhighway superhuman superhumanly superimpose superimposed superimposes superimposing superintend superintendent superintendent's superintendents superior superior's superiority superiors superlanguage superlative superlatively superlatives supermarket supermarket's supermarkets supermini superminis supernova superpose superposed superposes superposing superposition superpositions superscript superscripted superscripting superscripts supersede superseded supersedes superseding superset superset's supersets supersonic superstition superstition's superstitions superstitious superstructure superuser supervise supervised supervises supervising supervision supervisor supervisor's supervisors supervisory supine supper supper's suppers supplant supplanted supplanting supplants supple supplement supplemental supplementary supplemented supplementing supplements suppleness supplication supplied supplier suppliers supplies supply supplying support supportable supported supporter supporters supporting supportingly supportive supportively supports suppose supposed supposedly supposes supposing supposition supposition's suppositions suppress suppressed suppresses suppressing suppression suppressor suppressors supranational supremacy supreme supremely supremities supremity surcharge sure surely sureness surest sureties surety surf surface surfaced surfaceness surfaces surfacing surfing surge surged surgeon surgeon's surgeons surgery surges surgical surgically surging surliness surly surmise surmised surmises surmount surmounted surmounting surmounts surname surname's surnames surpass surpassed surpasses surpassing surplus surplus's surpluses surprise surprised surprises surprising surprisingly surreal surrender surrendered surrendering surrenders surreptitious surreptitiously surrey surrogate surrogate's surrogates surround surrounded surrounding surroundings surrounds surtax survey surveyed surveying surveyor surveyor's surveyors surveys survival survivals survive survived survives surviving survivor survivor's survivors susceptible sushi suspect suspected suspecting suspects suspend suspended suspender suspender's suspenders suspending suspends suspense suspenses suspension suspensions suspicion suspicion's suspicions suspicious suspiciously sustain sustainable sustained sustaining sustains sustenance suture sutures suzerainty svelte swab swabbed swabbing swabs swagger swaggered swaggering swahili swain swain's swains swallow swallowed swallowing swallows swallowtail swam swami swamis swamp swamped swamping swamps swampy swan swan's swank swanky swanlike swans swap swappable swapped swapper swapping swaps swarm swarmed swarming swarms swarthy swastika swat swatted swatter sway swayed swaying sways swear swearer swearing swears sweat sweated sweater sweaters sweating sweats sweatshirt sweaty swede sweden sweden's swedish sweep sweeper sweepers sweeping sweepings sweeps sweepstakes sweet sweeten sweetened sweetener sweeteners sweetening sweetenings sweetens sweeter sweetest sweetheart sweetheart's sweethearts sweetie sweetish sweetly sweetness sweets swell swelled swelling swellings swells swelter swept swerve swerved swerves swerving swift swifter swiftest swiftly swiftness swifts swim swimmer swimmer's swimmers swimming swimmingly swims swimsuit swindle swine swing swinger swingers swinging swings swipe swiped swiping swirl swirled swirling swish swished swiss switch switchable switchblade switchboard switchboard's switchboards switched switcher switchers switches switching switchings switchman switzerland swivel swizzle swollen swoon swoop swooped swooping swoops sword sword's swordfish swords swore sworn swum swung sycamore sycophant sycophantic sydney syllabic syllable syllable's syllables syllogism syllogism's syllogisms syllogistic sylvan symbiosis symbiotic symbol symbol's symbolic symbolic's symbolical symbolically symbolics symbolism symbolisms symbolization symbolize symbolized symbolizes symbolizing symbols symmetric symmetrical symmetrically symmetries symmetry symmetry's sympathetic sympathies sympathize sympathized sympathizer sympathizers sympathizes sympathizing sympathizingly sympathy sympathy's symphonic symphonies symphony symphony's symposia symposium symposiums symptom symptom's symptomatic symptoms synagogue synapse synapse's synapses synaptic sync synchronism synchronization synchronizations synchronize synchronized synchronizer synchronizers synchronizes synchronizing synchronous synchronously synchrony synchrotron syncopate syndicate syndicated syndicates syndication syndrome syndrome's syndromes synergism synergistic synergy synod synonomous synonym synonym's synonymous synonymously synonyms synopses synopsis synoptic synoptical synoptically syntactic syntactical syntactically syntax syntaxes synthesis synthesiser synthesize synthesized synthesizer synthesizers synthesizes synthesizing synthetic synthetical synthetically synthetics syphilis syringe syringes syrup syrupy system system's systematic systematically systematize systematized systematizes systematizing systemic systems systemwide systolic t tab tabernacle tabernacle's tabernacles table table's tableau tableau's tableaus tablecloth tablecloths tabled tables tablespoon tablespoon's tablespoonful tablespoonful's tablespoonfuls tablespoons tablet tablet's tablets tabling taboo taboo's taboos tabs tabular tabulate tabulated tabulates tabulating tabulation tabulations tabulator tabulator's tabulators tachometer tachometer's tachometers tacit tacitly tack tacked tacking tackle tackle's tackled tackles tackling tacks tact tactic tactical tactics tactile tag tag's tagalog tagged tagging tags tail tailed tailing tailor tailored tailoring tailors tails taint tainted take taken taker takers takes taking takings tale tale's talent talented talents tales talk talkative talkatively talkativeness talked talker talkers talkie talking talks tall taller tallest tallied tallies tallness tallow tally tallying tame tamed tamely tameness tamer tames taming tamper tampered tampering tampers tan tandem tang tangent tangent's tangential tangents tangible tangibly tangle tangled tangles tangling tangy tank tanker tankers tanks tanner tanner's tanners tantalizing tantalizingly tantamount tantrum tantrum's tantrums tanzania tanzanian tap tap's tape taped taper tapered tapering tapers tapes tapestries tapestry tapestry's taping tapings tapped tapper tapper's tappers tapping taproot taproot's taproots taps tar tardiness tardy target targeted targeting targets tariff tariff's tariffs tarmac tarred tarry tart tartly tartness task task's tasked tasking tasks tasmania tassel tassel's tassels taste tasted tasteful tastefully tastefulness tasteless tastelessly taster tasters tastes tasting tatter tattered tattoo tattooed tattoos tau taught taunt taunted taunter taunting taunts taut tautly tautness tautological tautologically tautologies tautology tautology's tavern tavern's taverns tawny tax taxable taxation taxed taxes taxi taxi's taxicab taxicab's taxicabs taxied taxiing taxing taxis taxonomic taxonomically taxonomies taxonomy taxpayer taxpayer's taxpayers tea teach teachability teachable teacher teacher's teachers teaches teaching teachings team team's teamed teaming teams tear tear's teared tearful tearfully tearing tears teas tease teased teases teasing teaspoon teaspoon's teaspoonful teaspoonful's teaspoonfuls teaspoons technical technicalities technicality technicality's technically technician technician's technicians technique technique's techniques technological technologically technologies technologist technologist's technologists technology tectonic teddy tedious tediously tediousness tedium teem teemed teeming teems teen teenage teenaged teenager teenagers teens teeth teethe teethed teethes teething teflon telecommunication telecommunications teleconferencing telegram telegram's telegrams telegraph telegraphed telegrapher telegraphers telegraphic telegraphing telegraphs telegraphy telemarketers telemedicine telemetry teleological teleologically teleology telephone telephone's telephoned telephoner telephoners telephones telephonic telephoning telephony teleprocessing telescope telescoped telescopes telescoping teletex teletext teletype teletype's teletypes televise televised televises televising television televisions televisor televisor's televisors telex tell teller tellers telling tells temerity temper temperament temperamental temperaments temperance temperate temperately temperateness temperature temperature's temperatures tempered tempering tempers tempest tempestuous tempestuously template template's templates temple temple's temples temporal temporally temporaries temporarily temporary tempt temptation temptation's temptations tempted tempter tempters tempting temptingly tempts ten tenacious tenaciously tenancy tenant tenant's tenants tend tended tendencies tendency tender tenderly tenderness tenders tending tends tenement tenement's tenements tenets tennessee tennessee's tennis tenor tenor's tenors tens tense tensed tensely tenseness tenser tenses tensest tensing tension tensions tent tentacle tentacled tentacles tentative tentatively tented tenth tenting tents tenure tenured terabit terabits terabytes terbium term termed terminal terminal's terminally terminals terminate terminated terminates terminating termination terminations terminator terminator's terminators terming terminologies terminology terminus terms termwise ternary terrace terraced terraces terrain terrain's terrains terrestrial terrestrial's terrestrials terrible terribly terrier terrier's terriers terrific terrified terrifies terrify terrifying territorial territories territory territory's terror terror's terrorism terrorist terrorist's terroristic terrorists terrorize terrorized terrorizes terrorizing terrors tertiaries tertiary test test's testability testable testament testament's testaments tested tester testers testicle testicle's testicles testified testifier testifiers testifies testify testifying testimonies testimony testimony's testing testings tests tetanus tethered texas texas's texases text text's textbook textbook's textbooks textile textile's textiles texts textual textually texture textured textures than thank thanked thankful thankfully thankfulness thanking thankless thanklessly thanklessness thanks thanksgiving thanksgiving's thanksgivings that that's thatch thatches thats thaw thawed thawing thaws the theater theater's theaters theatrical theatrically theatricals theft theft's thefts their theirs them thematic theme theme's themes themselves then thence thenceforth theological theology theorem theorem's theorems theoretic theoretical theoretically theoretician theoreticians theories theorist theorist's theorists theorization theorization's theorizations theorize theorized theorizer theorizers theorizes theorizing theory theory's therapeutic therapies therapist therapist's therapists therapy therapy's there there's thereabouts thereafter thereby therefore therefrom therein thereof thereon thereto thereupon therewith thermal thermodynamic thermodynamical thermodynamically thermodynamics thermometer thermometer's thermometers thermos thermostat thermostat's thermostats thesaurus these theses thesis theta thetas they they'd they'll they're they've thick thicken thickened thickens thicker thickest thicket thicket's thickets thickly thickness thicknesses thief thieve thieves thieving thigh thighs thimble thimble's thimbles thin thing things think thinkable thinkably thinker thinkers thinking thinks thinly thinner thinness thinnest third thirdly thirds thirst thirsted thirsts thirsty thirteen thirteens thirteenth thirties thirtieth thirty this thistle thong thorn thorn's thorns thorny thorough thoroughfare thoroughfare's thoroughfares thoroughly thoroughness those though thought thought's thoughtful thoughtfully thoughtfulness thoughtless thoughtlessly thoughtlessness thoughts thousand thousands thousandth thrash thrashed thrasher thrashes thrashing thread thread's threaded threader threaders threading threads threads' threat threaten threatened threatening threatens threats three three's threefold threes threescore threesome threshold threshold's thresholds threw thrice thrift thrifty thrill thrilled thriller thrillers thrilling thrillingly thrills thrive thrived thrives thriving throat throated throats throb throbbed throbbing throbs throes throne throne's thrones throng throng's throngs throttle throttled throttles throttling through throughout throughput throw throwaway throwback thrower throwing thrown throws thrush thrust thruster thrusters thrusting thrusts thud thuds thug thug's thugs thumb thumbed thumbing thumbs thumbtack thumbwheel thumbwheels thump thumped thumping thunder thunderbolt thunderbolt's thunderbolts thundered thunderer thunderers thundering thunders thunderstorm thunderstorm's thunderstorms thursday thursday's thursdays thus thusly thwart thwarted thwarting thwarts thymine thyself tic tick ticked ticker tickers ticket ticket's ticketing tickets ticking tickle tickled tickles tickling ticklish ticks tidal tidally tidbit tide tided tides tidied tidier tidiness tiding tidings tidy tidying tie tied tier tiers ties tiger tiger's tigers tight tighten tightened tightener tighteners tightening tightenings tightens tighter tightest tightly tightness tightwad tilde tildes tile tiled tiles tiling till tillable tilled tiller tillers tilling tills tilt tilted tilting tilts timber timbered timbering timbers time timed timekeeping timeless timelessly timelessness timely timeout timeouts timer timers times timesaver timeshare timeshared timeshares timesharing timesliced timestamp timestamped timestamping timestamps timetable timetable's timetabled timetables timetabling timid timidity timidly timing timings tin tin's tinge tinged tingle tingled tingles tingling tinier tiniest tinily tininess tinker tinkered tinkering tinkers tinkle tinkled tinkles tinkling tinnier tinniest tinnily tinniness tinny tins tint tinted tinting tints tiny tip tip's tipped tipper tipper's tippers tipping tips tiptoe tire tired tiredly tireless tirelessly tirelessness tires tiresome tiresomely tiresomeness tiring tissue tissue's tissues tit tit's tithe tither tithes tithing title titled titles titling tits titter titters to toad toad's toads toast toasted toaster toasters toasting toasts tobacco today today's todays toddies toe toe's toes together togetherness toggle toggled toggles toggling toil toiled toiler toilet toilet's toilets toiling toils token token's tokens tokyo told tolerability tolerable tolerably tolerance tolerances tolerant tolerantly tolerate tolerated tolerates tolerating toleration toll tolled tolls tomahawk tomahawk's tomahawks tomato tomatoes tomb tomb's tombs tomography tomorrow tomorrow's tomorrows ton ton's tone toned toner tones tong tongs tongue tongued tongues tonic tonic's tonics tonight toning tonnage tons tonsil tony too took tool tooled tooler toolers tooling toolkit tools tooth toothbrush toothbrush's toothbrushes toothed toothpick toothpick's toothpicks top toper topic topic's topical topically topics topless topmost topographies topography topological topologically topologies topology topped topping toppings topple toppled topples toppling tops torch torch's torches tore torment tormented tormenter tormenters tormenting torn tornado tornadoes torpedo torpedoes torque torrent torrent's torrents torrid tortoise tortoise's tortoises tortuous torture tortured torturer torturers tortures torturing torus torus's toruses toss tossed tosses tossing total totaled totaling totalitarian totalitarianism totalities totality totality's totalled totaller totallers totalling totally totals totter tottered tottering totters touch touchable touched touches touchier touchiest touchily touchiness touching touchingly touchy tough toughen tougher toughest toughly toughness tour toured touring tourist tourist's tourists touristy tournament tournament's tournaments tours touts tow toward towards towed towel toweling towelled towelling towels tower towered towering towers town town's towns township township's townships toxic toy toyed toying toys trace traceable traced tracer tracers traces tracing tracings track tracked tracker trackers tracking tracks tract tract's tractability tractable tractive tractor tractor's tractors tracts trade traded trademark trademark's trademarks tradeoff tradeoffs trader traders trades tradesman trading tradition tradition's traditional traditionalists traditionally traditions traffic traffic's trafficked trafficker trafficker's traffickers trafficking traffics tragedies tragedy tragedy's tragic tragically trail trailed trailer trailers trailing trailings trails train trained trainee trainee's trainees trainer trainers training trains trait trait's traitor traitor's traitors traits trajectories trajectory trajectory's tram tramp tramped tramping trample trampled trampler tramples trampling trampoline tramps trams trance trance's trances tranquil tranquility tranquilly transact transaction transaction's transactions transatlantic transceiver transceivers transcend transcended transcendent transcendental transcending transcends transcontinental transcribe transcribed transcriber transcribers transcribes transcribing transcript transcript's transcription transcription's transcriptions transcripts transducer transfer transfer's transferability transferable transferal transferal's transferals transference transferred transferrer transferrer's transferrers transferring transfers transfinite transform transformable transformation transformation's transformational transformations transformed transformer transformers transforming transforms transgress transgressed transgression transgression's transgressions transience transiency transient transiently transients transistor transistor's transistorize transistorized transistorizing transistors transit transition transitional transitioned transitions transitive transitively transitiveness transitivity transitory transits translatability translatable translate translated translates translating translation translational translations translator translator's translators transliterate transliteration transliterator translucent transmission transmission's transmissions transmit transmits transmittal transmitted transmitter transmitter's transmitters transmitting transmogrification transmogrify transmuting transoceanic transpacific transparencies transparency transparency's transparent transparently transpire transpired transpires transpiring transplant transplanted transplanting transplants transponder transponder's transponders transport transportability transportable transportation transported transporter transporters transporting transports transpose transposed transposes transposing transposition transpositions transputer transputers trap trap's trapdoor trapdoors trapezoid trapezoid's trapezoidal trapezoids trapped trapper trapper's trappers trapping trappings traps trash trauma traumatic travail travel traveled traveler travelers traveling travelings travelogue travels traversal traversal's traversals traverse traversed traverses traversing travesties travesty travesty's trawlers tray tray's trays treacheries treacherous treacherously treachery treachery's tread treading treads treason treasure treasured treasurer treasures treasuries treasuring treasury treasury's treat treated treaties treating treatise treatise's treatises treatment treatment's treatments treats treaty treaty's treble tree tree's trees treetop treetop's treetops trek trek's treks tremble trembled trembles trembling tremendous tremendously tremor tremor's tremors trench trencher trenches trend trending trends trendy trespass trespassed trespasser trespassers trespasses trespassing tress tress's tresses trial trial's trials triangle triangle's triangles triangular triangularization triangularizations triangularize triangularized triangularizes triangularizing triangularly tribal tribe tribe's tribes tribunal tribunal's tribunals tribune tribune's tribunes tributaries tributary tribute tribute's tributes triceratopses trichotomy trick tricked trickeries trickery trickier trickiest trickily trickiness tricking trickle trickled trickles trickling tricks tricky tricycle tried trier triers tries trifle trifler trifles trifling trigger triggered triggering triggers trigonometric trigonometry trigram trigrams trihedral trilateral trill trilled trillion trillions trillionth trim trimly trimmed trimmer trimmest trimming trimmings trimness trims trinity trinket trinket's trinkets trip trip's triple tripled triples triplet triplet's triplets triplicated tripling tripped tripping trips triumph triumphal triumphantly triumphed triumphing triumphs trivia trivial trivialities triviality trivially trod troll troll's trolley trolley's trolleys trolls tromso troop trooper troopers troops trophies trophy trophy's tropic tropic's tropical tropics trot trots trouble troubled troublemaker troublemaker's troublemakers troubles troubleshoot troubleshooter troubleshooters troubleshooting troubleshoots troublesome troublesomely troubling trough trouser trousers trout trowel trowel's trowels truant truant's truants truce truck trucked trucker truckers trucking trucks trudge trudged true trued truer trues truest truing truism truism's truisms truly trump trumped trumpet trumpeter trumps truncate truncated truncates truncating truncation truncation's truncations trunk trunk's trunks trust trusted trustee trustee's trustees trustful trustfully trustfulness trusting trustingly trusts trustworthiness trustworthy trusty truth truthful truthfully truthfulness truths try trying tub tub's tuba tube tuber tuberculosis tubers tubes tubing tubs tuck tucked tucker tucking tucks tuesday tuesday's tuesdays tuft tuft's tufted tufts tug tugs tuhoutui tuition tulip tulip's tulips tumble tumbled tumbler tumblers tumbles tumbling tumor tumors tumult tumult's tumults tumultuous tunable tundra tune tuned tuner tuners tunes tunic tunic's tunics tuning tunisia tunnel tunnel's tunneled tunneling tunnelled tunnels tuple tuple's tuples turban turban's turbans turbo turbulence turbulent turbulently turf turgid turgidly turing turkey turkey's turkeys turkish turks turmoil turmoil's turmoils turn turnable turnaround turnarounds turned turner turners turning turnings turnip turnip's turnips turnover turns turpentine turquoise turret turret's turrets turtle turtle's turtles tusks tutor tutored tutorial tutorial's tutorials tutoring tutors twain twang twas tweed tweeter tweeter's twelfth twelve twelves twenties twentieth twenty twice twig twig's twigs twilight twilight's twilights twill twin twin's twine twined twiner twinkle twinkled twinkler twinkles twinkling twins twirl twirled twirler twirling twirls twist twisted twister twisters twisting twists twitch twitched twitching twitter twittered twittering two two's twofold twos tying type type's typed typeout types typescript typeset typesets typesetter typesetters typesetting typewriter typewriter's typewriters typewritten typhoid typical typically typicalness typified typifies typify typifying typing typist typist's typists typographic typographical typographically typography tyranny tyrant tyrant's tyrants u ubiquitous ubiquitously ubiquity ucla ugh uglier ugliest ugliness ugly uighur ukrainian ulcer ulcer's ulcers ulterior ultimate ultimately ultimatum ultra ultrasensitive ultrashort ultraviolet umbrella umbrella's umbrellas umpire umpire's umpires unabashed unabated unabbreviated unable unabridged unacceptability unacceptable unacceptably unaccounted unaccustomed unachievable unacknowledged unadorned unadulterated unaesthetic unaesthetically unaffected unaffectedly unaffectedness unaided unalienability unalienable unaligned unallocated unalterable unalterably unaltered unambiguous unambiguously unambitious unanalyzable unanchored unanimity unanimous unanimously unannounced unanswered unanticipated unarmed unary unassailable unassigned unattached unattainability unattainable unattended unattractive unattractively unauthenticated unauthorized unavailability unavailable unavoidable unavoidably unaware unawareness unawares unbalanced unbearable unbearably unbelievable unbelievably unbiased unbind unblock unblocked unblocking unblocks unborn unbound unbounded unbreakable unbroken unbuffered unbundled unburned uncached uncalibrated uncalled uncancelled uncanny uncapitalized uncaught unceremoniously uncertain uncertainly uncertainties uncertainty unchangeable unchanged unchanging uncharacteristic uncheckable unchecked unclaimed unclassified uncle uncle's unclean uncleanly uncleanness unclear uncleared uncles unclosed uncomfortable uncomfortably uncommented uncommitted uncommon uncommonly uncompressed uncompromising uncomputable unconcerned unconcernedly unconditional unconditionally unconfirmed unconnected unconscionable unconscionably unconscious unconsciously unconsciousness unconstrained uncontrollability uncontrollable uncontrollably uncontrolled unconventional unconventionally unconvertible unconvinced unconvincing uncooperative uncoordinated uncorrectable uncorrected uncountable uncountably uncouth uncover uncovered uncovering uncovers uncritical undamaged undated undaunted undauntedly undecidable undecided undeclared undecomposable undefinability undefinable undefined undefinedness undeformed undeleted undeliverable undeniably under underbrush underdone underestimate underestimated underestimates underestimating underestimation underflow underflowed underflowing underflows underfoot undergo undergoes undergoing undergone undergraduate undergraduate's undergraduates underground underhand underlie underlies underline underlined underlines underling underling's underlings underlining underlinings underloaded underlying undermine undermined undermines undermining underneath underpants underpinning underpinnings underplay underplayed underplaying underplays underscore underscored underscores undersea undershirt understand understandability understandable understandably understanding understandingly understandings understands understated understood undertake undertaken undertaker undertakers undertakes undertaking undertakings undertook undertow underutilized underwater underway underwear underwent underworld underwrite underwriter underwriters underwrites underwriting undesirability undesirable undesirables undesired undetectability undetectable undetected undetermined undeterred undeveloped undid undifferentiated undiminished undirected undisciplined undiscovered undisturbed undivided undo undocumented undoes undoing undoings undone undoubted undoubtedly undreamed undress undressed undresses undressing undue unduly unearthing uneasily uneasiness uneasy uneconomic uneconomical unembellished unemployed unemployment unencrypted unencumbered unending unenlightening unequal unequaled unequally unequivocal unequivocally unessential unethically unevaluated uneven unevenly unevenness uneventful unexcused unexpanded unexpected unexpectedly unexplained unexplored unexposed unextended unfair unfairly unfairness unfaithful unfaithfully unfaithfulness unfamiliar unfamiliarity unfamiliarly unfavorable unfettered unfilled unfinished unfit unfitness unflagging unfocused unfold unfolded unfolding unfolds unforeseen unforgeable unforgiving unformatted unfortunate unfortunately unfortunates unfounded unfriendliness unfriendly unfulfilled ungainly ungrammatical ungrateful ungratefully ungratefulness ungrounded ungrudging unguarded unguided unhappier unhappiest unhappily unhappiness unhappy unharmed unhealthy unheard unheeded unholy unicorn unicorn's unicorns unidentified unidirectional unidirectionality unidirectionally unification unifications unified unifier unifiers unifies uniform uniformed uniformity uniformly uniforms unify unifying unilluminating unimaginable unimpeachable unimpeded unimplemented unimportant unindented uninfected uninhabited uninitializable uninitialized uninitiated uninsulated unintelligible unintended unintentional unintentionally uninteresting uninterestingly uninterpretable uninterpreted uninterrupted uninterruptedly union union's unionization unionize unionized unionizer unionizers unionizes unionizing unions uniprocessor unique uniquely uniqueness unison unit unit's unitary unite united unites unities uniting units unity unity's univalve univalve's univalves universal universality universally universals universe universe's universes universities university university's unix unjoined unjust unjustified unjustly unkind unkindly unkindness unknowable unknowing unknowingly unknown unknowns unlabeled unlabelled unlawful unlawfully unleash unleashed unleashes unleashing unless unlike unlikely unlikeness unlimited unlink unlinked unlinking unlinks unload unloaded unloading unloads unlock unlocked unlocking unlocks unlucky unmanageable unmanageably unmanned unmarked unmarried unmasked unmatchable unmatched unmentionable unmerciful unmercifully unmistakable unmistakably unmoderated unmodified unmount unmounted unmounting unmoved unnamed unnatural unnaturally unnaturalness unnecessarily unnecessary unneeded unnerve unnerved unnerves unnerving unnoticed unnumbered unobservable unobserved unobstructed unobtainable unobtrusive unoccupied unofficial unofficially unopened unordered unorthodox unpack unpacked unpacking unpacks unpaid unparalleled unparsed unplanned unpleasant unpleasantly unpleasantness unpleasantry unplug unplugged unpopular unpopularity unprecedented unpredictability unpredictable unpredictably unprepared unprescribed unpreserved unpretentious unprimed unprintable unprinted unprivileged unprocessed unproductive unprofitable unprojected unprotected unprotectedly unprovability unprovable unproven unpublished unqualified unqualifiedly unquestionably unquestioned unquoted unravel unraveled unraveling unravels unreachable unread unreadability unreadable unreal unrealistic unrealistically unrealizable unreasonable unreasonableness unreasonably unrecognizable unrecognized unrecoverable unrefined unregulated unrelated unreliabilities unreliability unreliable unreliably unreplicated unreported unrepresentable unresolved unresponsive unrest unrestrained unrestricted unrestrictedly unrestrictive unrewarding unroll unrolled unrolling unrolls unruly unsafe unsafely unsanitary unsatisfactorily unsatisfactory unsatisfiability unsatisfiable unsatisfied unsatisfying unscheduled unscrew unscrupulous unseeded unseen unselected unselfish unselfishly unselfishness unsent unserviced unsettled unsettling unshaken unshared unshaven unshielded unsigned unskilled unslotted unsold unsolicited unsolvable unsolved unsophisticated unsorted unsound unspeakable unspecified unspoken unstable unstack unstacked unstacks unstated unsteadiness unsteady unstressed unstructured unstuck unsubscribe unsuccessful unsuccessfully unsuitable unsuited unsupported unsure unsurprising unsurprisingly unsuspected unsuspecting unsuspended unswitched unsynchronized unsystematic untagged untapped untenable unterminated untested unthinkable untidiness untidy untie untied unties until untimely unto untold untouchable untouchable's untouchables untouched untoward untrained untransformed untranslated untreated untried untrue untrusted untrustworthy untruthful untruthfulness unturned untying untyped unusable unused unusual unusually unvarying unveil unveiled unveiling unveils unvisited unwanted unwarranted unwary unwelcome unwholesome unwieldiness unwieldy unwilling unwillingly unwillingness unwind unwinder unwinders unwinding unwinds unwired unwise unwisely unwiser unwisest unwitting unwittingly unworkable unworthiness unworthy unwound unwrap unwrapped unwrapping unwraps unwritable unwritten up upbraid upcoming update updated updater updates updating upgrade upgraded upgrades upgrading upheaval upheld uphill uphold upholder upholders upholding upholds upholster upholstered upholsterer upholstering upholsters upkeep upland uplands uplift uplink uplinks upload uploaded uploading uploads upon upper uppermost upright uprightly uprightness uprising uprising's uprisings uproar uproot uprooted uprooting uproots upscale upset upsets upshot upshot's upshots upside upstaging upstairs upstream uptake upturn upturned upturning upturns upward upwards urban urchin urchin's urchins urge urged urgency urgent urgently urges urging urgings urinalysis urinate urinated urinates urinating urination urine urn urn's urns uruguay us usability usable usably usage usages use used useful usefully usefulness useless uselessly uselessness usenet user user's users users' uses usher ushered ushering ushers using usual usually usurp usurped usurper utah utensil utensil's utensils utilities utility utility's utilization utilization's utilizations utilize utilized utilizes utilizing utmost utopia utopian utopian's utopians utter utterance utterance's utterances uttered uttering utterly uttermost utters uucpnet v vacancies vacancy vacancy's vacant vacantly vacate vacated vacates vacating vacation vacationed vacationer vacationers vacationing vacations vaccinated vaccination vaccinations vaccine vacuo vacuous vacuously vacuum vacuumed vacuuming vagabond vagabond's vagabonds vagaries vagary vagary's vagina vagina's vaginas vagrant vagrantly vague vaguely vagueness vaguer vaguest vain vainly vale vale's valence valence's valences valentine valentine's valentines vales valet valet's valets valiant valiantly valid validate validated validates validating validation validity validly validness valley valley's valleys valor valuable valuables valuably valuation valuation's valuations value valued valuer valuers values valuing valve valve's valves vampire van van's vancouver vandalism vandalize vandalized vandalizes vandalizing vane vane's vanes vanilla vanish vanished vanisher vanishes vanishing vanishingly vanities vanity vanquish vanquished vanquishes vanquishing vans vantage vapor vaporing vapors variability variable variable's variableness variables variably variance variance's variances variant variantly variants variation variation's variations varied varies varieties variety variety's various variously varnish varnish's varnishes vary varying varyings vase vase's vases vassal vast vaster vastest vastly vastness vat vat's vatican vats vaudeville vault vaulted vaulter vaulting vaults vaunt vaunted vax veal vector vector's vectored vectorization vectorizing vectors veer veered veering veers vegetable vegetable's vegetables vegetarian vegetarian's vegetarians vegetate vegetated vegetates vegetating vegetation vegetative vehemence vehement vehemently vehicle vehicle's vehicles vehicular veil veiled veiling veils vein veined veining veins velocities velocity velocity's velvet vendor vendor's vendors venerable venezuela vengeance venison venom venomous venomously vent vented ventilate ventilated ventilates ventilating ventilation ventricle ventricle's ventricles vents venture ventured venturer venturers ventures venturing venturings venus veracity veranda veranda's verandas verb verb's verbal verbalize verbalized verbalizes verbalizing verbally verbatim verbose verbosity verbs verdict verdure verge verger verges verifiability verifiable verifiably verification verifications verified verifier verifiers verifies verify verifying verily verisimilitude veritable vermin vermont vernacular versa versatile versatility verse versed verses versing version versions versus vertebrate vertebrate's vertebrates vertex vertical vertically verticalness vertices very vessel vessel's vessels vest vested vestige vestige's vestiges vestigial vests veteran veteran's veterans veterinarian veterinarian's veterinarians veterinary veto vetoed vetoer vetoes vetting vex vexation vexed vexes vexing vi via viability viable viably vial vial's vials vibrate vibrated vibrates vibrating vibration vibrations vice vice's viceroy vices vicinity vicious viciously viciousness vicissitude vicissitude's vicissitudes victim victim's victimize victimized victimizer victimizers victimizes victimizing victims victor victor's victorian victories victorious victoriously victors victory victory's victual victualer victuals video videoconference videoconferencing videophone videophones videos videotape videotape's videotapes videotex vie vied vienna vier vies vietnam vietnamese view viewable viewed viewer viewers viewing viewpoint viewpoint's viewpoints views vigilance vigilant vigilante vigilante's vigilantes vigilantly vignette vignette's vignettes vigor vigorous vigorously vii viii vile vilely vileness vilification vilifications vilified vilifies vilify vilifying villa villa's village villager villagers villages villain villain's villainous villainously villainousness villains villainy villas vinci vindictive vindictively vindictiveness vine vine's vinegar vines vineyard vineyard's vineyards vintage violate violated violates violating violation violations violator violator's violators violence violent violently violet violet's violets violin violin's violinist violinist's violinists violins viper viper's vipers virgin virgin's virginia virginity virgins virtual virtually virtue virtue's virtues virtuoso virtuoso's virtuosos virtuous virtuously virulent virus virus' virus's viruses visa visage visas viscount viscount's viscounts viscous visibility visible visibly vision vision's visionaries visionary visions visit visitation visitation's visitations visited visiting visitor visitor's visitors visits visor visor's visors vista vista's vistas visual visualization visualizations visualize visualized visualizer visualizes visualizing visually vita vitae vital vitality vitally vitals vitriolic vivid vividly vividness vizier vlsi vocabularies vocabulary vocal vocally vocals vocation vocation's vocational vocationally vocations vodka vogue voice voiced voicer voicers voices voicing void voided voider voiding voids volatile volatilities volatility volcanic volcano volcano's volcanos volley volleyball volleyball's volleyballs volt voltage voltages volts volume volume's volumes voluminous voluntarily voluntary volunteer volunteered volunteering volunteers vomit vomited vomiting vomits voodoo vote voted voter voters votes voting votive vouch voucher vouchers vouches vouching vow vowed vowel vowel's vowels vower vowing vows voyage voyaged voyager voyagers voyages voyaging voyagings voyeurism vulgar vulgarly vulnerabilities vulnerability vulnerable vulture vulture's vultures vying w waddled wade waded wader wades wading wafer wafer's wafers waffle waffle's waffles waft wag wage waged wager wagers wages waging wagon wagoner wagons wags wail wailed wailing wails waist waist's waistcoat waistcoat's waistcoats waists wait waited waiter waiters waiting waitress waitress's waitresses waits waive waived waiver waiverable waives waiving wake waked wakeful waken wakened wakening wakes wakeup waking wales walk walked walker walkers walking walks wall walled wallet wallet's wallets walling wallow wallowed wallowing wallows walls walnut walnut's walnuts walrus walrus's walruses waltz waltzed waltzes waltzing wan wand wander wandered wanderer wanderers wandering wanderings wanders wane waned wanes waning wanly want wanted wanting wanton wantonly wantonness wants war war's warble warbled warbler warbles warbling ward warden wardens warder wardrobe wardrobe's wardrobes wards ware warehouse warehouses warehousing wares warfare warier wariest warily wariness warlike warm warmed warmer warmers warmest warming warmly warms warmth warn warned warner warning warningly warnings warns warp warped warping warps warrant warranted warranties warranting warrants warranty warranty's warred warring warrior warrior's warriors wars warsaw warship warship's warships wart wart's wartime warts warwickshire wary was wash washed washer washers washes washing washings washington wasn't wasp wasp's wasps wastage waste wasted wasteful wastefully wastefulness wasteland wastes wasting watch watchdog watched watcher watchers watches watchful watchfully watchfulness watching watchings watchman watchword watchword's watchwords water waterbuck watered waterfall waterfall's waterfalls watering waterings waterproof waterproofing waters watersnake waterway waterway's waterways watery watt watts wave waved waveform waveform's waveforms wavefront wavefront's wavefronts waveguides wavelength wavelengths waver wavers waves waving wavy wax waxed waxen waxer waxers waxes waxing waxy way way's ways wayside wayward we we'd we'll we're we've weak weaken weakened weakening weakenings weakens weaker weakest weakish weakly weakness weakness's weaknesses wealth wealthiest wealths wealthy wean weaned weaning weapon weapon's weapons wear wearable wearer wearied wearier weariest wearily weariness wearing wearisome wearisomely wears weary wearying weasel weasel's weasels weather weathercock weathercock's weathercocks weathered weathering weathers weave weaver weaves weaving web web's webs wed wedded wedding wedding's weddings wedge wedged wedges wedging wednesday wednesday's wednesdays weds wee weed weeding weeds week week's weekday weekdays weekend weekend's weekends weekly weeks weep weeper weeping weeps weigh weighed weighing weighings weighs weight weighted weighting weights weird weirdly welcome welcomed welcomes welcoming weld welded welder welding welds welfare well welled welling wells welsh wench wench's wenches wends went wept were weren't west westbound westchester western westerner westerner's westerners westernized westerns westward westwards westwood wet wetly wetness wets wetted wetter wettest wetting whack whacked whacking whacks whale whaler whales whaling wharf wharves what what's whatever whatsoever wheat wheaten wheel wheelbarrow wheelchair wheeled wheeler wheelers wheeling wheelings wheels wheelwright wheezes whelp when whence whenever where where's whereabouts whereas whereby wherein whereupon wherever whether whetstone which whichever while whim whim's whimper whimpered whimpering whimpers whims whimsical whimsically whimsies whimsy whimsy's whine whined whines whining whip whip's whipped whipper whipper's whippers whippersnapper whipping whipping's whippings whips whirl whirled whirling whirlpool whirlpool's whirlpools whirls whirlwind whirr whirring whisk whisked whisker whiskers whiskey whisking whisks whisper whispered whispering whisperings whispers whistle whistled whistler whistlers whistles whistling whit white whitely whiten whitened whitener whiteners whiteness whitening whitens whiter whites whitespace whitest whitewash whitewashed whiting whittle whittled whittles whittling whiz whizzed whizzes whizzing who who's whoever whole wholehearted wholeheartedly wholeness wholes wholesale wholesaler wholesalers wholesome wholesomeness wholly whom whomever whoop whooped whooping whoops whore whore's whorehouses whores whorl whorl's whorls whose why wick wicked wickedly wickedness wicker wicks wide wideband widely widen widened widener widening widens wider widespread widest widget widgets widow widowed widower widowers widows width widths wield wielded wielder wielding wields wife wife's wifely wig wig's wiggling wigs wigwam wild wildcat wildcat's wildcats wildebeest wilder wilderness wildest wildlife wildly wildness wile wiles wiliness will willed willful willfully willing willingly willingness willow willow's willows wills wilt wilted wilting wilts wily win wince winced winces wincing wind winded winder winders winding windmill windmill's windmills window window's windowed windowing windows winds windshield windsurf windsurfed windsurfing windswept windy wine wined winer winers wines wing winged winging wings wining wink winked winker winking winks winner winner's winners winning winningly winnings wins winter wintered wintering winters wintry wipe wiped wiper wipers wipes wiping wire wirecutter wired wireless wires wiretap wiretap's wiretapper wiretappers wiretapping wiretaps wiriness wiring wirings wiry wisconsin wisdom wisdoms wise wised wiseguy wiseguys wisely wiser wisest wish wished wisher wishers wishes wishful wishfully wishing wishy wisp wisp's wisps wistful wistfully wistfulness wit wit's witch witchcraft witches witching with withal withdraw withdrawal withdrawal's withdrawals withdrawing withdrawn withdraws withdrew wither withers withheld withhold withholder withholders withholding withholdings withholds within without withstand withstanding withstands withstood witness witnessed witnesses witnessing wits witted wittier wittiest wittily witty wives wizard wizard's wizards wobbling wobbly woe woeful woefully woke wolf wolves woman woman's womanhood womanly womb womb's wombat wombs women women's womens' won won't wonder wondered wonderful wonderfully wonderfulness wondering wonderingly wonderment wonders wondrous wondrously wont wonted woo wood woodchuck woodchuck's woodchucks woodcock woodcock's woodcocks wooded wooden woodenly woodenness woodland woodman woodpecker woodpecker's woodpeckers woods woodwork woodworking woody wooed wooer woof woofed woofer woofer's woofers woofing woofs wooing wool woolen woolly wools woos word word's worded wordily wordiness wording wordings words wordy wore work workable workably workbench workbench's workbenches workbook workbook's workbooks workday worked worker workers workers' workhorse workhorse's workhorses working workingman workings workload workman workmanlike workmanship workmen works workshop workshop's workshops workstation workstation's workstations world world's worldliness worldly worlds worldwide worm wormed worming worms worn worried worrier worriers worries worrisome worry worrying worryingly worse worship worshiped worshiper worshipful worshiping worships worst worsted worth worthiest worthiness worthless worthlessness worths worthwhile worthwhileness worthy would wouldn't wound wounded wounding wounds wove woven wrangle wrangled wrangler wrangling wrap wrap's wraparound wrapped wrapper wrapper's wrappers wrapping wrappings wraps wrath wreak wreaking wreaks wreath wreathed wreathes wreck wreckage wrecked wrecker wreckers wrecking wrecks wren wren's wrench wrenched wrenches wrenching wrens wrest wrestle wrestler wrestlers wrestles wrestling wrestlings wretch wretched wretchedness wretches wriggle wriggled wriggler wriggles wriggling wring wringer wrings wrinkle wrinkled wrinkles wrist wrist's wrists wristwatch wristwatch's wristwatches writ writ's writable write writer writer's writers writes writeup writeups writhe writhed writhes writhing writing writings writs written wrong wronged wronging wrongly wrongs wrote wrought wrung wyoming x xerox xylophone y yale yank yanked yanking yanks yard yard's yards yardstick yardstick's yardsticks yarn yarn's yarns yawn yawner yawning yawns yea year year's yearly yearn yearned yearning yearnings years years' yeas yeast yeast's yeasts yell yelled yeller yelling yellow yellowed yellower yellowest yellowing yellowish yellowness yellows yells yelp yelped yelping yelps yeoman yeomen yes yesterday yesterday's yesterdays yet yield yielded yielding yields yogi yogurt yoke yoke's yokes yon yonder yore york yorker yorkers you you'd you'll you're you've young younger youngest youngly youngster youngster's youngsters your your's yours yourself yourselves youth youth's youthes youthful youthfully youthfulness yugoslavia yugoslavian yummy yuppie yuppiedom yuppies z zany zap zapped zapping zaps zeal zealand zealot zealous zealously zealousness zebra zebra's zebras zen zenith zephyr zeppelin zero zeroed zeroes zeroing zeros zeroth zest zeta zetas zigzag zigzaging zillion zillions zinc zing zip zipcode zipped zipper zippy zodiac zodiacal zombie zombie's zombies zonal zonally zone zone's zoned zones zoning zoo zoo's zoological zoologically zoology zoom zooming zooms zoos zurich $.*..%bo&ca'cf(cj)cs*i386descr+i86descr,ic-il.lv/ra0sp1sr2ud  D P1$T$L  s= SSSSu QRP PSUVu>t6} ttV~ V~v^UV1 }$u ]9u )U F׸V^UUBPY1=VtCUVWU M9Ju B URUBUBPeYUBUR Urt~t4j[YF fF UztRURrUrUfN fJ Uzt U9W t uUMR QNUR W W'YƅuUW0VJ %0=0u uY Vu'YYU MR Q U MJ _^UVWu YE}u Yƃ~ u v YYvR YEV*'YEqxgu5 Ywv x YYtKW&YEPYt6PSh. D uuWVuu u YYE _^UVUr Yƅt+V YEP 2uYYUrVt YY^UVWU jrYYƋURURr>u V%YYu u W%YY_^UVW}w Y=wYPYƃ|~rv Y=[jwJYYEDx:~ tFvv YYt5jvYYE PJ %0=0jvYYExu"UzRUBEPSh,E D wSYVWv DY/F'F wYE}tFuYE PV\YYU RWYYU9ruzwu~YYEWVYYUV_^UVWUrLYƅt&VRYjYG UrV-YY_^UVWUrt5vYDžt!W Yp VvYYvWYYۋv _^U VWUrYƅt$VYw OYUrVYY_^UVW}G @u/W!YW[YWYwt VGYv WY_^Uh h h&h u u65D hXPYYjMYUVW}4 YƋEF_^UVWuV׃u v 1YV OY_^UVU4 RYƋEfF^UVWut3>v+Yv YFp:'VNY_^UVWut >VNY_^UVWut~VnNY_^UUrYUrhYuBNYUE@PYUu NYUEHPdYUuMYUE@PCYUuMYUUR#YUV1U tFuMY^UVW}jWKYYƅu hY_^U5hh< h* =t5hh< G* hh< 5*YYu uh< #* hh< *YYJj'KYU= t8hh< )YYuu uh< )hh< )YYUVhu$YYh hV) h hV)  9 t 9 t hYVU YV%Y^U(VWu EE U9UaU<G<-t@hLY3E:E4GuW/YY&  WUY m$E듀}td1f vAYvYU} QhHv #YYEhDv#YYEh@v#YYEh<v #YYE:jhEPEPEPuu hUuuuujj1븋MJ5UYuuj5j5You$Yu$Yu$Yu#Yh8v"YYEP5YYh4v"YYEju5] _^UUU= tu uh`h< &U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV\IYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVHY܉ՋUUE _^UVWut~VHY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y@fff^UB@fBCfUVWHz}5Z%Y ǡHz}5*%Y Ɓ| _^UVWHz}5$Y ơHz}5$Y  ơHz}5r$Y i ơHz}5<$Y ǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$dY]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhu!YYuuhYY0fSYfEE}fEE9J tuhlEYYj,Yf4Hz}5"Y F F `lfFFFUt?jYFV6VfBjtYF V fdF7(E@fE5sYE_^U VW1UUEEEhu YYuuhYYfS5YHz}5 Y EJ j{Y]ƍVUVUVUfHz}5l Y FWFfFHz}5' Y F jY]ǍWUw rfG_tNJVWY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYUVEH@PYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEUu uYYEuuhYYE+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPU$UUEEEEEEPjj UVuU VVu 0YYEtF~}Vډ F^UVuV u ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u hu0%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrThP5)O}E_^UVW=u wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ >t 6+V~ WY_^Uhu0YU 92UVEPu I6YYEu1xƅthuu"0 E}fF ̋EfFEfF vF$3F,3F(=4F 4Et jjVC ^UUURu ub EUUURu u EU VWE %wWUV tVUY ETM}?u׋E_^UVuV;YuNSX^UVuFuu Pj/ E|FPF %fF E^UVuV tFjjP`. F %fF ^uu S/ ^UVuFuu P. E=u^ fF F fF UVPE^UUBP-YUVu ~u F1Vu05YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ,YYt5uu55"}E-EEuu,YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju% t+EE9EU܉Uu&YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!|URc$YELEd+UU1}=UM E EeUUU}tE U@tEU9U~EEEU0U+UU= FEE}|EPu YYdm} UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5x5tt1uu55|}MmE}tW9U$vFMF0}uUt F.1uu55K$}EPuu55_YY EUuujj Z0Fuu55tMkuu55tMEPuu55YY, EUuujj Z0Fuu55BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF Ec+U _^UVWu u55t'EPu u55YY, E-0PjVEEu}uu55K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUU t/~VT%Y7 tENу}%u!1EEEU!~V$Y 9MNE]M벃M묃M릃Mk E-0둃MEEԐWE QEEԐWE7MEE YEEE YE MMEE YEMEEuPYYEM EM EMEE YElU'tEUURfUtUURM܉ LE M~V8#YU  EN~V"YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjr"p8E܉EEuUtRE ʀ:t*ENJt~V"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E uENJt~V%!Yt뫋UURUU u*N]EJt~V YtƋUU+UUE>Jׁ\v\GMvU Mj}uEMEt e?oe?cUU EUU E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU MXe?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ V(Yu OpU€nEt&v9UUUVP2YYڋUU Met }EtVu YYUU MVuYYUUvPzYhlUtUURlJ!lhF YUURY EFE }E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUSXU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=u[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP jEP j/PmjjjPWjD(UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃= t uY_^U$VW=kǣj YƉI!)ى}=tW Y=u1%EE95wU9UwEE#UUUUtEU9UwU0օUѺU~W9~5}EU5EV Y=tU<0 U։MU0օU 0UVF_^UVWutVր:uV׍0׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5 uYYƅ}NU9vm U}tFt*N9~  ֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVWO _^UVWEE*1E09} t9uuEG6uEE}|и_^U VWuEF u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEE t0% UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^U VWuEF u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEE t0% UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E " }t]} t}tFE] E_^=+CC [ {sƉ=kC{Sck[SkÃ=g{SK k{uC [ SkC [=C[=_1C CtrIAÃ=C s[ =CK [ =SC[U}u}uUM UMQ}u} tEjEPEPM jEPEP; EPEPYYjEPEP U jEPEP jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEPz _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEP}YYjEPEPt UjEPEP jEPEPm EPEPYYjEPEP$ UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]ËD$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1U(UUEEEEEEPjj E=u U@ 1UVW5@ @ }׃}~9r}}9vWqYu_^U$UUEEEEEEPjjd U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjj E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJ<UUtuuUJ4E\EEEEPj0jv E؅}UJ<EUJ4}u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U   Zu u4)UUM] Z5$ 5 UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E( , UM0 4 UMEEuF uFE=-u Ej}+tdNaE t`uu5 5 }6U0Rj5< 58 uuYYYYEEGFEu}.l_E t^uu5 5 J}5U0Rj5D 5@ uubYY[YYEEOFEu}Et}euQFE=-u E#}+tNE tk] -0؉EFEuۃ}}]}}}EE9} s7t"E uuYYEEEEuÅ~;} tUԋE  "}}5RP$RPx}}uuuu"YYEEuuuu#YYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZH EE8EE@#EE@ 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVPYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(=4u^ fF FLF fF uwYEu^ fF 5 92F fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=uuFV t V uYV u  V t)V|YuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv09YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=K C c[ U VWu} W WV VuWVWV YY9zV9Ww 9WuHV9Wv@VEPnWVbU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVqt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]Uh l U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj葮 U$UUU UUUEEEEPjhjR Uu &UBUM JUju RUVWuEVU}u>u Fn}| "RPS "5t 5p 0}uax | UMQRQRYYZYUMQRQRwYYZYUMQRu u`YYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuuYYZYUM QR5 5 Nu  "u uXZ_^ u`=}aͫaUVWME_^]} 0)ʇʋu }branch optimization proc %d block %d branch optimization in proc %d, block %dbranch optimizationsN*555out of memory : file %serror on line %u optimization: illegal pointer size%d%dr3 CG M Q! S T V* wwwwrrillegal argument%s: %d unexpected eof %scannot open %srcannot open %sr/MMM%3@em(3ms_opt encounteredms_err encountered}q*5BMX'''offset expectedtoo few parameterscannot open %s;;y;;; X6;;6;;;;;;66;66;S7\7\7\7\7\7\7\7\7\7;;;;;;;;;;78;8;;;;7;;c9;;;;;6:;;t:;;;;;;;;;;7788877;;7;#9g99;;9;::;;}:bug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@QGEBG!EeBf|Ag!E$@@@K"6K%I*I0I1I2I3I4I5I6I7I8I9IDIEJFJLIO"JXZJ[JcJdIeJfJgJhIiJlInJo&JpJsJu@Jx^JN+MNNNNNNSNSNSNSNSNSNSNcNcNNNNNNNN~N~N~N~N~N~NNNNNNNNNNNNNNNNNNNNNNNNNNN~N~N~N~N~N~NNNNNNNNNNNNNNNNNNNP+P-P."P0P1P2P3P4P5P6P7P8P9PE4Pe4P IKUL5MMOLRQ-R]HR?$@$@iairhwh@@ | ~  2 < +776   90   SSSSH  43=43 43=43 < 43=43  0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe  ` 1$T$L 0 s= SSSSu QRP,PSUVWULUU}Eu YƋLJ I~uUzt VY1~uV zu:u VY7E0u~uE}t=Uzu4jYFjYF E@7EUEE_^UVW1utGvWmY4ut44v_^U@P3Y8PPhu(1=tCP,Y@PY 8 8P4,YYUPPY<PPh u0=tCP`,Y@P Y < <P4 ,YYUVu6,YE6hSYE_EIEI5$ hEP0 $ EP+Y@PYEP6+YY^UVW=DtG u<PoY(ދ5Tt-F u"8<t8P8Yv_^UVWu vYDv}YTPYf@h vYYEPYu+YhvYYEP:Yuv+Yhv oYYEd WYhHuaYYEt WuYYu'+YW +YjPY_^UXHXz[ XI9J|4EX: t XD5Xj MYY3E5XPMYYEXXUXHXz] XI9J|5EX: t XF5Xj 0MYY5E5XPMYYEXXXHXzc XI9J|8EX: t XL5Xj LYY;E5XPLYYEXXUE=E=xXHXzp XI9J|@ExX: t X5Xj KYYEx5XPKYYExXX|XHXz}K XI9J|,X: t X45Xj DKYY#5Xj3KYYXXEPYUVu9uPYXHXz}K XI9J|,X: t X45Xj JYY#5XjJYYXX!PYPY^UVWU:.RKYǁ XHXz}K XI9J|,X: t X45Xj IYY#5XjIYYXXXHXzb XI9J|9X: t X"5Xj YIYY5XP>IYYXXXHXz}K XI9J|,X: t X45Xj HYY#5XjHYYXXPYPu>tU9vF+UסXHXz[ XI9J|4E X: t XD5Xj HYY3E 5XPHYYE XXP~YuWZXHXzP XI9J|.FX: t X5Xj uGYYF5XPaGYY뇊FXXn_^UU8<tU8h4YYUU<h4YYUVE44F F F thYVwY^UVuF F F thqYVxY^UVUr F u6F F 8<tF uh(YVY^UVuF u'F F F uhYVY^UVuV 8<u 6Y>uv YXHXz}K XI9J|,X: t X45Xj EYY#5XjnEYYXXv Y68Y^UVW}1}}tUBƋEUVY1G9XHXzR XI9J|/L7 X: t X;5Xj DYY*D75XPDYYXL7 XFo?^_^UVu XHXz}K XI9J|,X: t X45Xj DYY#5XjDYYXXXHXzb XI9J|9X: t X5Xj CYY5XPwCYYXXXHXz}K XI9J|,X: t X45Xj CYY#5XjBYYXXPIY^UVu<XHXza XI9J|7X: t XS5Xj fBYYB5XPJBYY&XXVY^UVW1Ur  @vY@vY2vY$FPaYXHXz}K XI9J|,X: t X45Xj AYY#5XjnAYYXXFP YXHXz}T XI9J|2X: t X/5Xj @YY5Xj@YYXXXHXz}T XI9J|2X: t X5Xj }@YY5Xji@YYXXqXHXz}K XI9J|,X: t X45Xj @YY#5Xj?YYXXFPtYF PYF$q6BWZ Uzt Uzu1XHXz}K XI9J|,X: t X45Xj 9?YY#5Xj(?YYXXUBPY_^UVuVVJt XHXz}T XI9J|2X: t Xz5Xj ~>YYf5Xjj>YYRXX;~uF 8h4YYF PYv Y~uF P+YV}F PYF PYv Yv YVYsXHXz}K XI9J|,X: t XR5Xj V=YYA5XjE=YY0XXPFFp^UVW}WfUw lYE=pG PY`E=u w YJw rY?w t8vYvSYF76G%_^UVU Xu`UV1Y~t~t FP YV&YV   rYFVrYu똃=\t`P5\TYY\^UUXhYUVW}4( YƋEF_^UVWuV׃u v 1YV?Y_^UVU4D RYƋEfF^UVWut3>v+Yv YFV>Y_^UVWut >V>Y_^UVWut~Vv>Y_^UUrYUrhYuJ>YUE@PYUu(>YUEHPdYUu>YUE@PCYUu=YUUR#YUV1U tFu=Y^UVW}jW;YYƅu hY_^U5dh(h  =ht5hhh  hh YYu uh  hh YY:j/;YU=d t8h@h YYuu uh h<h nYYUu uYYEuuhPYYEUVj$Y@fff^UHB@HfBCfUVWLHLz}5L>Y LǡLHLz}5LY LƁ| _^UVWLHLz}5LY LơLHLz}5LY L ơLHLz}5LVY Li ơLHLz}5L Y Lǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$Y]]fMf EUnEEtEPuUYPwYY܋EUVP! YfEH]9|]V]Cf]׉^UVWhuYYLuuhtYY0fPPSYfEE}fEEP9LJ tuh`yYYj,FYf4LHLz}5LY LF F `lfFFFUt?jYFV6VfBjYF V fdF7(E@fE5LWYE_^U VW1UUEEEhuYYLuuhIYYfppSiYLHLz}5LY LELJ jY]ƍVUVUVUfLHLz}5LPY LFWFfFLHLz}5L Y LF jY]ǍWUw rfG_tNJVCY^UVuU VE E 0>tr^UVUru1 >t6^UVW5l*Yƅt0V0Yjw YY9Eu5lVYY1_^UuY1ۅÉUuYEu p bYYUVEH@PmYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PurYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV )YދUE _^UEUUBUEU VWE U}7t%u6$YYtVV(Y܉ՋUUE _^UVWut~Vu(Y_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^+C;Cw Ë[ uӅu P-KI|;u[u PK1ۇ` tPXPUVW0E_^]0U$UUEEEEEEPjj UVuU VVuc0YYEtF~}Vډ F^UVuV u ~V t VY1E~ tvV Y}EV €t v_&Y~0tV@9V0t v0H&YF0~DtvD2&YFDfF E^U}u h0%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT P#YEu18u EUzUrThXP)O}E_^UVW=u wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW-7Ǿ >t 6+V~ WY_^Uh0YU1UVEPu 6YYEu1xƅthuu0 E}fF ̋EfFEfF vF$3F,3F(%4F }4Et jjV ^UUURu u EUUURu u EU VWE %wWUV tVUY ETM}?u׋E_^UVuV;YuNSX^U\fEUUUUUUURu EP EUEUVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S0 ^UVuFuu Pa. E=u^ fF F fF UVPE^UUBPK-YUVu ~u F1Vut5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ[,YYt5uu55"}E-EtEuuU,YYtEpE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE\M@ExUURUuET}|4uju& t+EE9EU܉UuYEMUutUU#J UUBEEZE@E,UutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYELE0d+UU1}=UM EEUUU}tE U@tEU9U~EEEU0U+UU= FEE}|EPu YYdm} UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5 5t1uu55}MmE}tW9U$vFMF0}uUt F.1uu55_$}EPuu5$5 sYY EUuujj Z0Fuu5,5(tMkuu5450tMEPuu5<58YYp EUuujj( Z0Fuu5D5@VtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF HE+U _^UVWu u5|5xt'EPu u55YYp E-0PjjEEu}uu55_~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUi t/~V%Y7 i tENу}%u!1EEEU~VB%Y 9MNE]M벃M묃M릃Mk E-0둃MEEԌWE QEEԌWE7MEEYEEEYE MMEEYEMEEuPYYEM EM EMEEYElU'tEUURfUtUURM܉ LEi M~V|#YU  i EN~VA#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrfp8E܉EEuUtRE ʀ:t*ENJt~VG"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E i uENJt~Vi!Yt뫋UURUU i u*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU M}uEMEt e?oe?cUU8 EUU8 E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ V Yu O)U€t)v9UUUVP%!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M9e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VlYu OpU€nEt&v9UUUVPvYYڋUU Met }EtVuOYYUU MVu5YYUUvPYhlUtUURlJ!lhZ YUURY EFlE}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUSX%U]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VRYu1NUG9~tV t} u V$YuE_^UV=uuV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEPQ jEP jsPjjj]PjX(Uj ju UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃=tu>Y_^U$VW=$kFǣ$j YƉI!)ى}=$tW Y=u1%EE95$wU($9UwEE#$U(UUUtEU9UwUօUѺU~W9$~5$}EU5$EV Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5\ uYYƅ}NU9$vm $U}tFt*N9$~  $֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^U VWuEFi u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEi t0%i UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^U VWuEFi u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEi t0%i UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E " }t]} t}tFE] E_^=,+CC [ {sƉ=,kC{Sck[SkÃ=,g{SK k{uC [ SkC [=,C[=,_1C CtrIAÃ=,C s[ =,CK [ =,SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]Ë} 0)ʇʋu }UW}0ʀuA)_]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1U(UUEEEEEEPjj E=u U 1UVW5  }׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$EEEEEEEPjj U$UUU UEEEEEPj%jU U(UUUUU UEEEEPjj E=uEU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjjR U(VWu UJ<UUtuuUJ4EEEEEPj0j E؅}UJ<EUJ4}u_^U$UUUUU UEEEEPjjz UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z55UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E UM UMEEuFi uFE=-u Ej}+tdNaEi t`uu5p 5l }6U0Rje55uuYYYYEEGFEu}.l_Ei t^uu5p 5l }5U0Rj55uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNEi tk] -0؉EFEuۃ}}]}}}EE9} s7t"Ex t uuyYYEEEEuÅ~;} tUԋE  "}}RPRRPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZ!EE8EE@#EE@ 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uVhYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W{ V+UVUUUyV9v,U9Us$u6WCUVRtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUV(tHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(%4u^ fF FLF fF uGYEu^ fF 51F fF UVUV}tFP6YtF fF ^UUB % 1=uCt uWY1UV=uuFV t V uYV u  V t)VYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPu E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=,K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE@ UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]U U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj) U$UUU UUUEEEEPjhj Uu 肭UBUM JUju RUVWuEVU}u>u Fn}| "RPS "5 5 0}ua  UMQRQRzYYZYUMQRQRgYYZYUMQRu uPYYEE VUUׁM~!#N щNW@ׁ#N щN  UMQRQRYYZYUMQRQRYYEEu uuuYYZYUM QR5 5 >u  "u uXZ_^d uJ`=}a5aUVWM?E_^]%d %s%d %s%drrr=gKYwv//Q(6xXJwJ+"B)))out of memory : file %serror on line %u optimization: cannot open %sunexpected eof %scannot open %srO?cannot open %srQ  ! ! !"!!"%"?""-#""""ms_opt encounteredms_err encountered%%%offset expectedtoo few parameters;:a;;; X6;;6;;;;;;66;66;;7D7D7D7D7D7D7D7D7D7;;;;;;;;;;78;8;;;;u7;;K9;;;;;:;;\:;;;;;;;;;;77888~77;;7; 9O99;;9;":;;e:bug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@9GEBG EeBfdAg E$@@(K"K%{I*I0I1I2I3I4I5I6I7I8I9IDIEgJFgJLIO JXBJ[JcJdIekJfkJgkJhIiIlInJoJpJswJu(JxFJN+MnNNnNNNN;N;N;N;N;N;N;NKNKNNNNNNNNfNfNfNfNfNfNNNNNNNNNNNNNNNNNN|NNNNNNNNNfNfNfNfNfNfNNNNNNNNNNNNNNNNNN|NkP+O-O. P0O1O2O3O4O5O6O7O8O9OEPePIK=LMMO4RQ-R]0R?$@$@Fia1iriwi@@ 2 < +776   90   SSSS  }43%43d }43%43  }43%43  0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe   p1$T$L ,Xs=XSSSSu XQRP(DPWU     JE B7 B j)Y B RB Rf  UUBfE=uWE=uEE=~3EH%0E=t}0uU VWu%YDžHuBtjw 3YY= u+4B @4B DGN6?fUR U/_^U VWUztwTY UrIYƅt%VOYEp SYUrV+YY_^UVWu }EVUWUV UW UG u&F t1F F G tF uF F EF tG uG G EE]03*YYuEu0BYYEUJt&UJuUB UfBEU tU u fEG tF uF F EE_^U VWE}iEutF tSv0YfEUt>E5PPiYZtzt6E 0E8_^UVuEPEPV UJfME=!t E="uVuY]PS^ E=XE=]E=AEH%0=0u)E=3mUB HV4gYYSE==EH%0=u%UB HV4*YYVv YY Vv YYv ^UVWuX@fXVf Xf VrX\4VB vYDžt/WYEP u ruYvWeYY_^UVuVR Rz RVr YVR RRRVRR9}VR RNRQVR RNR Q ^UVuVz u VwYVB^UU RMJ UVWfXE PW Y\uYfXfUE=+E\4v VYDžKWXYEP t(uKYEPV 9} PNffv WYY뭋V\RRVmYYVVrYYVRRrYDžjVRRrWYYEWYEVRRRuAYYuYEPUR 9}VBUB}EHfEfEEX92E\4V\N9 tQVE@fE뿋UBE P5\YY_^UUR BU R Z9u9U R M2q YYt U R M2q YYt1UUR BU R Z9}9U R M2q YYt U R M2q YYt1UE 0uu YYuu u YYuu| YYUVWj?Yj5YG UWU W E EEPu3 YYEPEPu w u YƅtTV YEEPu/ YYUr c YƅtǍEPEPVa YP& Ur V@ YYҋW M u YW fB_^UVu  Yƅt.uV YPYYt V Yu V YY1^UVWE0 YE}u YfGE0 YE}tNu Y9t+V9Wu#V w 2 YYv GYuV YYE0uJ YYE묋E0u6 YYEl_^UVUR 2 Yƅt.V YEPuv YYUR 2V YY^U VWfEu Yƅt/V YE@fEfUfWxYuV YY_^UVWut YE}auq YfFuM YDžt/WS YPVYYt F@fFuW% YYuu YYE_^UVu Yƅt!V YP 2I YuV YY^UVUr Yƅt4U R 2V YP YYuUrV YY1^UVWUrk YDž]Wm Y9ut=U 9rt5R 2VYYt$VuF fFu VYYUrW YY_^UVW}W zawt$VuWV YYt WVKYYv ؋wF fFVu^fF9wtv_^UVuvYƅt V|YEP`YuV]YY^UVWEUrv&YE}u#YEVu#YYtRVuYYuWYYEuEPW]YY%UR BW 2(Yw YCYWRCYvuYYEtv XEPYuYuYuYu`YUMJ_^UVW}4YƋEF_^UVWuV׃u v 1YVBY_^UVU4RYƋEfF^UVWut3>v+Yv YFlB$VMBY_^UVWut >V0BY_^UVWut~VBY_^UUrYUrhYuAYUE@PYUuAYUEHPdYUuAYUE@PCYUu|AYUUR#YUV1U tFuKAY^UVW}jW&?YYƅu hY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5<hh d# =`t5`hh C# hh 1#YYu uh # hh #YY>:j:YU=t8hh "YYuu uh "hh "YYU1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV;YދUE _^UEUUBUEU VWE U}7t%u6$YYtVVU;Y܉ՋUUE _^UVWut~V%;Y_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$[Y8@f8f8f^U4B@4fBCfUVWDHDz}5D     "!Y DǡDHDz}5D Y DƁ| _^UVWDHDz}5D Y DơDHDz}5Do Y D ơDHDz}5D: Y Di ơDHDz}5D Y Dǁ|i _^UUE|<u)jwY]|]|fMf E|UUu1FE<u)j$ Y]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhuiYYDuuhuYY0fLLSYPfEE}fEEL9DJ tuh YYj,YfP4DHDz}5DY DF F `lfFFFUt?jQYFV6VfBj0YF V fdF7(E@fE5D7YE_^U VW1UUEEEh$uYYDuuhYYf@@SYxDHDz}5DY DEDJ j7Y]ƍVUVUVUfDHDz}5D4Y DFWFfFDHDz}5DY DF jY]ǍWUw rfG_xtNJVY^UVuU VE E 0>tr^UVUru1 >t6^UVW5dYƅt0VYjw YY9Eu5dVYY1_^UuY1ۅÉUuYEu p bYY+C;Cw Ë[ uӅu P-KI|;u[u P1ۇ tPXPU$UUEEEEEEPjj UVuU VVuo#YYEtF~}Vډ\F^UVuV u\ ~V t VY1E~ tvV Y}EV €t vY~0tV@9V0t v0YF0~DtvDvYFDfF E^U}u h=%UJ u\ uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT PYEu18u EUzUrThTPO}E_^UVW=uh wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW)'Ǿh >t 6+V~ WY_^Uh=YU?UVEPu &YYEu1xƅthuu# E}fF ̋EfFEfF vF$0AF,oAF(AF BEt jjVG ^UUURu uf EU VWEh %wWUV tVUY ETM}?u׋E_^UU URuh EUVuV*YuNSX^UVuFuu P" E|FPF %fF E^UVuV tFjjP! F %fF ^uu S9# ^UVuFuu P}! E=u^ fF F fF UVPE^UUBPg YUVu ~u F1Vu %YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQwYYt5uu5H5D^}E-E8EuuqYYtE4E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE M@ExUURUuE}|4uju& t+EE9EU܉UugYEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYELLEd+UU1}=UM EdEaUUU}tE U@tEU9U~EEEU0U+UU=t FEE}|EPu YYdm}t UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55e t1uu55G }MmE}tW9U$vFMF0}uUt F.1uu55$}EPuu55YY EUuujj0 Z0Fuu55`tMkuu559tMEPuu55[YY EUuujj Z0Fuu55tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E_+U _^UVWu u5@5<9t'EPu u5H5D[YY E-0PjEEu}uu5P5L~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VYuE_^UV=uuV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP jEP j P5 jjp j P jD(UVUU U RxYƅt u V\YY^UuYUVW5VUT>M}}6u݃=tuY_^U$VW= k ǣ j YƉI!)ى}= tWh Y=u1%EE95 wU$ 9UwEE# U$UUUtEU9UwUօUѺU~W9 ~5 }EU5 EVY=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5 uYYƅ}NU9 vm  U}tFt*N9 ~   ֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^=(CC [ {sƉ=(;{SK k{uC [ SkC [=(C[=(31C CtrIAÃ=(C s[ =(CK [ =('C[U}u}uUM UMQ}u} tEjEPEP jEPEP EPEPWYYjEPEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPsYjWEPR _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPUYYjEPEPL UjEPEPW jEPEPE EPEPYYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]ËD$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~\M E 1U} |} ~\M ҋE!1UE1UE1U} |} ~\M Et1U(UUEEEEEEPjj E=u U 1UVW5  }׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$EEEEEEEPjj U$UUU UEEEEEPj%jy U(UUUUU UEEEEPjj: E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjjv U(VWu UJ<UUtuuUJ4E{EEEEPj0j E؅}UJ<EUJ4}u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U TX Zu u4)UUM] Z5`5\UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uYYXZ_^UUU VWuVFZdUEE8EE@#EE@\1)>+t >bu~+u EU UE _^U VWU RUu1"uV t~uVhYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W V+UVUUUyV9v,U9Us$u6WUVtKVU9UruWvV, E'UUR6Wk V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W' Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUVtHVU9U|uWvV, E$pUUR6WD V+UVUU+UUuVpYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPcYY}EEVU؁1 u@EEU؁u%~(Au^ fF FLF fF u3YEu^ fF 5?F fF UVUV}tFPYtF fF ^UUB % 1=uCt uY1UV=uuFV t V uYV u \ V t)VYuF %fF FFF fF 2~0t,V@9V0t v0uYF0VT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjje U$UUU UUUEEEEPjhj& Uu ^UBUM JUju R5É uv`=}aaaUVWME_^]} 0)ʇʋu }lbX(5;AGHJ{KMN[O[SK^chnopr{smon not yet implemented cannot open %swcannot open %swcannot open %swcannot open %swcannot open %sr  bad case descriptorcannot find rom pseudo for case descriptorcase descriptor must be in rombad 'lae descr' before csa/csbcannot find 'lae descr' before csa/csbout of memory : file %serror on line %u optimization: unexpected eof %scannot open %srC$$3%u%cannot open %srE&&&&&&'''('''(3((!)((((ms_opt encounteredms_err encountered,1,<,I,T,_,k,k,k,%100001 1W959>9offset expectedtoo few parameters?I~HHInI X%DnInI1DnInInInInInI7DSDnIMDYDnIDDDDDDDDDDnInInInInInInInInInINEEnIEnInInInI EnInIFnInInInInIGnInIGnInInInInInInInInInI$EREEEEEREnInIEnIFF GnInIMGnIGnInIGbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@TEPGRePfNgR$@@gagrfwf 2 < +776   90   SSSS lB0AAoAB0AAoA  B0AAoA`l 0000000000000000  PH1$T$L h4Hs=4SSSSu 4QRPdPsUUVWu} tt F_9t1WN9q1xF _ 19uA_W 19V u@OW 19V u@?W 19V u@/F _ 19uA1F._^UVUr>t6tV~ V~v^UVW1utHD(F.EPEPEPV)}t +Uׅ}1 }6봸_^UVU r Yƅt-V YEURu YYU rV YY^UVWf NjURW UBURW YYUr Y UBURW YYz G G Pu YYG Pu YYw YP YE Pu YYU Ru YYU RWF YYuWYYuu%YYGUfRfWUR W Uz Urt~uuvu UBUzuu"j4YF[ fF UUrwu ~tUuV%YYuWfR fV _^UVWEEUzt U zu1ugYu \YDžtu1~u UUvu U UWVlYYt Ev}huUBƅuU BVYt=U9Uuuu VWu uWV1_^UVWUR URYDžWYEpY=XuYƅtIVYE9Et+p[Y=uuuYYt#uViYYuWZYYm1_^UVEUB @u*}t$EUrtVYtEv ^Uh h h h u u5hHYYj!PYUVuV~ V~h1/Y{VJ Ph/YYGF Ph/YYBV BPh.YY,v h|.YYhx.YFT)ht.Y^UVW}4 YƋEF_^UVWuV׃u v 1YVPY_^UVU4 RYƋEfF^UVWut3>v+Yv YF)VPY_^UVWut >VxPY_^UVWut~VZPY_^UUrYUrhYu.PYUE@PYUu PYUEHPdYUuOYUE@PCYUuOYUUR#YUV1U tFuOY^UVW}jWnMYYƅu hY_^U5lhh0, =pt5phh, hh+YYu uh+ hh+YYLjMYU= t8hh+YYuu uh+hh+YYUVh u&YYh hV{+ h hVh+  9 t 9 t hYVU YV'Y^U(VWu ElE U9UaU<G<-t@htY3E:E4GuW/YY&  WUY $5&E듀}td1fvAYtvYU} Qhpv %YYEhlvt%YYEhhvb%YYEhdv P%YYE:|jhxEPEPEPuu hUuuuujj1븋xMJ5xUYuuj5xj5|Y|ou%Yu%Yu%Yu%Yh`v$YYEP5YYh\v_$YYEju5t] _^UUU= tu uhh(U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVVHKYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVJY܉ՋUUE _^UVWut~VJY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y@fff^UxB@xfBCfUVWHz}5F'Y ǡHz}5'Y Ɓ| _^UVWHz}5&Y ơHz}5&Y  ơHz}5^&Y i ơHz}5(&Y ǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$dY]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhum#YYuuhYY0fSYfEE}fEE9J tuhEYYj,Yf4Hz}5#Y F F `lfFFFUt?jYFV6VfBjtYF V fdF7(E@fE5;YE_^U VW1UUEEEhu!YYuuhYYfS5YHz}5"Y EJ j{Y]ƍVUVUVUfHz}5X"Y FWFfFHz}5"Y F jY]ǍWUw rfG_?@ABCDEFGHIHz}K I9J|,: t 45j 3YY#5j3YYvwY6w^UVWfEU ut~tE@fEvEP[YuVUHz}K I9J|,: t 45j 2YY#5j2YYPYHzP I9J|.N : t 95j d2YY(F5PP2YYN vYFP?YHzP I9J|.N : t 95j 1YY(F 5P1YYN vYvYVYuJ5Y=tP5YY_^UUPaYfEUH]9|E4gYE@fEU VfEU utE@fEv(EPY}t1PYuV(UPYHzP I9J|.N : t 95j Z0YY(F 5PF0YYN F xFP4YvYvY}tUV2YVBPYV PYvzYV2 Yvd3Yv [3Yv YVK3Yu5 Y=tP5YY^UUP{YU}u jhY UPYYUuU YUVuYƅt!u VYPYYuV}YYjY^UVW} fEUUu2jYuuGYYfEUEPYwtE@fEv EPYwYPYwruvYYfEUVYEPNYh$vYYh$v YYvYh$vYYFP Yv wXYE}tTuYYEPYYUBPYUrQYUrEYu?1Ywu YYEw^Ywt'vNYvEYv tNJVWY^UVuU VE E 0>tr^UVUru1 >t6^UVW5|Yƅt0VYjw YY9Eu5|VYY1_^UuY1ۅÉUuYEu p bYYUVWfE1URUu1UBEUJfM]~ ]~1Uzu'UfR fUE9 ~  fUEEE<?0u1?G] 95  5 }u {Eh}tUzEuUzu UB EF}tUzEuUzu UB G4_^Uj-uYYfEj+usYYfE]t]t1U ]EE]UVEH@PYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEUu uYYEuuh=YYE+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPU$UUEEEEEEPjj UVuU VVu/0YYEtF~}Vډ8F^UVuV u8 ~V t VY1E~ tvV Y}EV €t v+&Y~0tV@9V0t v0&YF0~DtvD%YFDfF E^U}u h1%UJ u8 uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT P#YEu18u EUzUrThPY)O}E_^UVW=uDwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6ǾD>t 6+V~ WY_^Uh1YU3UVEPu m6YYEu1xƅthuuF0 E}fF ̋EfFEfF vF$L5F,5F(5F -6Et jjVg ^UUURu u EUUURu u EU VWED%wWUV tVUY ETM}?u׋E_^UU URuh EUVuV;YuNSX^UVuFuu Pj/ E|FPF %fF E^UVuV tFjjP`. F %fF ^uu S/ ^UVuFuu P. E=u^ fF F fF UVPE^UUBP-YUVu ~u F1Vu05YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ,YYt5uu55"}E-E Euu,YYtE E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju% t+EE9EU܉Uu&YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URc$YELEd+UU1}=UM E0EAUUU}tE U@tEU9U~EEEU0U+UU=PFEE}|EPu YYdm}PUVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5 5 t1uu5 5 }MmE}tW9U$vFMF0}uUt F.1uu5 5 K$}EPuu5 5 _YY EUuujj Z0Fuu5 5 tMkuu5 5 tMEPuu5 5 YY, EUuujj Z0Fuu5 5 BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E?+U _^UVWu u5 5 t'EPu u5 5 YY, E-0PjVEEu}uu5 5 K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUt/~VT%Y7 tENу}%u!1EEEU ~V$Y 9MNE]M벃M묃M릃Mk E-0둃MEE(YE QEE(YE7MEEԤZEEEԤZE MMEEԤZEMEEuPYYEM EM EMEEԤZElU'tEUURfUtUURM܉ LEM~V8#YU  EN~V"YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjr"p8E܉EEuUtRE ʀ:t*ENJt~V"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E uENJt~V%!Yt뫋UURUU u*N]EJt~V YtƋUU+UUE>Jׁ\v\GMvU M8 F}uEMEt e?oe?cUUpEUUpE=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M| e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ V(Yu OpU€nEt&v9UUUVP2YYڋUU Met }EtVu YYUU MVuYYUUvPzYhlUtUURlJ!lhF YUURY EF E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUS XuU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VrYu1NUG9~tV t} u VDYuE_^UV=u7uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP jEP j/PmjjjPWjD(UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃=turY_^U$VW=\kǣ\j YƉI!)ى}=\tW Y=u1%EE95\wU`\9UwEE#\U`UUUtEU9UwUօUѺU~W9\~5\}EU5\EV Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5uYYƅ}NU9\vm \U}tFt*N9\~  \֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVWO _^UVWEE*1E9} t9uuEG6uEE}|и_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE8" }t]} t}tFE] E_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E8" }t]} t}tFE] E_^=d+CC [ {sƉ=dkC{Sck[SkÃ=dg{SK k{uC [ SkC [=dC[=d_1C CtrIAÃ=dC s[ =dCK [ =dSC[U}u}uUM UMQ}u} tEjEPEPM jEPEP; EPEPYYjEPEP U jEPEP jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEPz _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEP}YYjEPEPt UjEPEP jEPEPm EPEPYYjEPEP$ UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]ËD$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~8M E 1U} |} ~8M ҋE!1UE1UE1U} |} ~8M Et1U(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj@ U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjz E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJ<UUtuuUJ4EEEEEPj0jR E؅}UJ<EUJ4}u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U < @ Zu u4)UUM] Z5H 5D UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1EL P UMT X UMEEuFuFE=-u Ej}+tdNaEt`uu55}6U0Rj5` 5\ uuYYYYEEGFEu}.l_Et^uu55J}5U0Rj5h 5d uubYY[YYEEOFEu}Et}euQFE=-u E#}+tNEtk] -0؉EFEuۃ}}]}}}EE9} s7t"EuuYYEEEEuÅ~;} tUԋE 8"}}5RP$RPx}}uuuu"YYEEuuuu#YYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZl EE8EE@#EE@81)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV,Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(5u^ fF FLF fF uwYEu^ fF 53F fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=uvuFV t V uYV u 8 V t)VXYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv09YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=dK C c[ U VWu} W WV VuWVWV YY9zV9Ww 9WuHV9Wv@VEPnWVbU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVqt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U塌  U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjjm U$UUU UUUEEEEPjhj. Uu &UBUM JUju RUVWuEVU}u>u Fn}|8"RPS8"5 5 0}ua UMQRQRYYZYUMQRQRwYYZYUMQRu u`YYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuuYYZYUM QR5 5 Nu 8"u uXZ_^u辫`=}a詫aUVWME_^]} 0)ʇʋu }fQQQcross jumps*E* ? %ld %d %d %s *** ? out of memory : file %serror on line %u optimization: illegal pointer size%d%dr C M Q S T V wwwwrrillegal argument%s: %d unexpected eof %scannot open %sr;+mcannot open %sr=+ms_opt encounteredms_err encountered)4ALWcccO'-'6'offset expectedtoo few parameters0+a0-w-w-w-w-w+a-w-a-a+a-w+?-w+w-w+w-w+w-w+w-w+w-w+w-a-p-x-p-w-p-a-p-w-w-w-a+a-w-a+a-w-a+a-w-a+a-w-w-p-p+p+p-w+a-d-p-d-d-a-a+a-p-p+a-a-a+a-a-a+a-p-a-p-?-?-w-a+a-w-a+a-a-a+a-a-a+a-a-?-p-a+a0-a+a-a+a-?+?-a-a+a-a-a+a-a-a+a+p+p+p-p+p-a-p+x+p+w-p+a-p+w+w+w00+w+w+a+d-p+d+d+d-p-a-p+?+p+p-a-a+a-w-a+w00-w+w-p-?0-a-a+a+a-a+a+w-a-a+a+a-a-a+a-a-a+a-a-a+a-a-x+x+x-a+a+a00-w+w-p+p-w-w-y+x-w-w-y+x-w-w-y+x-p-a-p-a-a-a+a-a-a+w-a-a+w-p-p+w-a-a+w-a-a+w-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x0-p0-w-w-w-w-a-p-p-p-p-w-w-w-w-w-w-w-w-a-x-a-a-a+a-a-a+a-a-p+p-p+p-a-a+a-a-a+a-p-a-p+pY+?E+a*d*p*w*x*y+cannot open %s[=<=1== XA8==M8======S8o8=i8u8=8888888888==========j99=9====%9==:=====;== <==========@9n9999.9n9==79=::<;==i;=;==<bug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@HE7DGFe7DfCgF$@@L"L%+K*[K0sK1sK2sK3sK4sK5sK6sK7sK8sK9sKDKELFLLgKOKXK[3LcWLdKeLfLgLhmKiKlaKnLoKpgLs'LuKxKyP+MPyPPyPyPOOOOOOOOOOyPyPyPyPyPyPyPPPPPPPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyP,PyPyPyPyPyPyPyPyPPPPPPPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyPyP,PR+Q-Q.Q0Q1Q2Q3Q4Q5Q6Q7Q8Q9QEQeQJBMMNzOcQSxS-S]S?$@$@jajrsjwj@@ 2|tld\TLD<40,(|tlhd\PH@8,$ |xtld\TLD@80(  |xph`XPH@80,($  aaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrlSSSSH-6L555-6L555 -6L555<H 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOeH  0)1$T$L ))s=SSSSu QRP)PwrU UVWUB @[)".)Urt8V"Yv t9~uv b/Y=tu2 Y|_^U )hz.hhihz.u uQ+5 )hk-YYjqYUVj %YƋUU VUV^UuBsYUj %YUu'sYUjg%YUu sYUVEP6 Yƅu2~t%VR ztVR jrcHYY^Uuv-YUuh-YU@fUfU 1 (EJUVWu }F_9t1W9V1F_19uAFPYtAF_9u F_9tF_9uF_9u1hF_9uF_9u1BF_9uF_9uF_9u1ExI_^UVu~tV^9tF^UVW} u1Equ U9teu,9UuEPWYYvHYt1_^UVWu} ONWV6fWfV9fWfVfWfV'fWfVfWfVfWfV EH_^UVW}U RU5)t1WVu tFPu o*YYVY6ƋUB_9t FE0wYYFUV }uG5fFVWu u eY)5)_^UVW5)tJUVUR0*YDžtWYPYuW*YYup*YVYu)_^UVuV"V~h hLYYVJPhhK _F PhhK TV BPhhK 8v hhK !hhKYYFFhhgKYY^UVW=t$E0tU9ru1VY_^U}tU E} t U MJUVWE ut >VY_^UVWE 0t#U 9rt1NjU9ru1_^U VW} ]wA(YƅtJwV9(YYEuVYPYYt!VYPYGPV(YP'YYu벋?_^UVEPYPCYƃ} ;uHpF]3VYYVuYY^UVWEUUzu BYƋU 9JuI?F7VyYYUzu URrUVrYYYUzu WUtUBPuV$ WuGYY_^U VWu 2BYNjU 9JuqeGu BYƋU 9JuI?FUR 2VYYVWYYUWr YYUzu0UR JMtUBPuVa UR B_^UVWUzW'&YƅtYjha"YYVYPY )E0VYPYYuu VpYP: WV%YY_^UUjr$CYYUVU BjP YU PBPu AƋURrV5BYY^UVUr 6666U V^UVW5)9Vt 9V~u E vIYEVYrv%YE~tVzWAYEWh(!YY(vu?YYuVW EWVYYuu(YYWVQYY6?_^UV5)l$Yƅt-VY]9u VY5)VF$YY1^UVWu} F_9t1W9Vt1~1W19Vu@W19Vu@W19Vu@F_19uAF_9uW 9V u1jW19Vu@WW19Vu@GF_9uF _ 9uF _ 9u1F<@_^UVWu} NONOVWhVWkVW`VWUfVfWHfVfWV W 8VW0VW(fVfWfV fW fV fW F|=@_^UVW5)d"Yƅt1uVYPYYt VY;5)V:"YYMfWuYYh)W!YY_^UV5)!Yƅt VYPY5)V!YY5)*"Y!)^UVuFFFFw?^UVW5)n!YE}tRuY]9u'uGPYeG>5)u!!YYE먋5)t6F]9u&~u FPkY~u FPXY61_^UVWu} 9~u}~t V9}1_^UVuu1~t ~t~ u1^U}tUzu1U VW5). YƅVY{WMI 9J w} uuw&YY\fRW)YPPYEP6Yu6uYYtURMI 9J uMfGQ=5)VYYL_^UVWu} W9V~u}~} |1~t VV9W}1_^U VW5)YƅVY} twA<Yf}uWXYYjjf]Ur<YuMWYPYEP,Yu11f'Uzu~fG4<5)VSYY4_^UVW5).Yƅt+VYǀu f5)V YY_^U&UjrYY&juYYUBp;UVuYP&Yƅu!-(jvNYYjV_YYF6;^UVW5)^YDžtt@zu8v^2Ylj9u!5PYYYt1_^UVu5FP,YYt1~Nt~Ou!v 1Y19|A~jt~kuv 6Y1ۅÉ~u;V zt2Rzjt V RzkuV rY1ۅÉY5FPxYYtV r9Y1ۅÉ)5FPHYYt1~^U VWE 0OU 9rt1V~ V~1FPYu~^ut1j멋U Rz;t U Rz^uIUBPYE=u12Uzu$=2}19EC_^UVWuYu1{UrWYƅtNUrVLYYVYPuYYu$VYPYURV"YPYY뮋UrY1ۅÉ_^UV,>Vt9Uu1^UPVWu} 7~JuHVh/YEEUE 1ZE E52EPY8FPtYEu1~At~hu,EEUV.YEEPYffUEUJMUUU~tV.YE|5EPYYUEZ~t VT.YE5EPYYE5EPYYfUfUu؍EPoYYfUfU5EPVYYfUfUUEP[YEUB0EEV-YEEV-YEEV U~Ht~pu5EPYYUfUfUfUfUXE5EPYYUfUfUV(-YE*V-YEuEV UE/EPY_^UVu~u "*"ff "NJ"v" @^UVW} tB="t6"9zu+MfRfUz"MRQ"7UfUB="u""9z}'="t"9z+Jσ"ف="g"R)9~ "K"fB"։2=t1P=ZZ)‰_^UVW5""UuH+Yǁv9~} +V׃s!fE}UUEP!Yk9~}#fE+VUUUEPY$9~~fE}UUEPY 9ur PY"MJ_^U"U UffUURUU UEPtYU$U JMURUUffUuQSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|u u= Eju܍EP/ U$EUUfRfUUfR fUUfR fUuu u Eju܍EP U UfRfUURUU UEPYU$U JMu 0YEUffUUuu rg E܋Urju܍EPS P{YYU$U JMu YEUffUUffUUuu r E܋Urju܍EP PYYU$U JMu lYEUffUUffUUffUUuu r E܋Urju܍EP{ PYYU VWuu%fEUEP>YV(YDž~WEPgYYfE}EPYVtYB5EP YYwfEV'YEEPYX5EPYY5EPYY45EPYY!5EPYYFp*_^UVEPYƅt ~ uF1^U VUzu 5EPZYYEPYUr t VuY^U-! E)Uv+Yv YFl:'VNY_^UVWut >VNY_^UVWut~V~NY_^UUrYUrhYuRNYUE@PYUu0NYUEHPdYUu NYUE@PCYUuMYUUR#YUV1U tFuMY^UVW}jWKYYƅu hY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5)hhl& = )t5 )hhK& hh9&YYu uh'& hh&YYFj+GYU=t8hh%YYuu uh%hh%YYUVhu YYhhV% hhV% 9t9t hYVU YV!Y^U(VWu E)E U9UaU<G<-t@hHY3E:E4GuW/YY&WUY a E듀}td1fvAY$)vY0)U}z.QhDv YYEh@vYYEh<vYYEh8v |YYE:,)jh()EPEPEPuu hUuuuujj1븋()MJ5()UYuuj5()j5,)Y,)ou Yu Yu Yu Yh4vYYEP50)YYh0vYYEju5$)] _^UUU=tu uh\h"U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV`EYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVDY܉ՋUUE _^UVWut~VDY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y`)@f`)f`)f^U()B@()fBd)Cfd)d)UVW\)H\)z}5\)^!Y \)ǡ\)H\)z}5\).!Y \)Ɓ| _^UVW\)H\)z}5\) Y \)ơ\)H\)z}5\) Y \) ơ\)H\)z}5\)v Y \)i ơ\)H\)z}5\)@ Y \)ǁ|i _^UUET)<u)jY]T)]T)fMf ET)UUu1FEX)<u)j$XY]X)]X)fMf EX)UEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhuYY\)uuh|YY0f4)4)SYP)fEE}fEE4)9\)J tuhhEYYj,YfP)4\)H\)z}5\)Y \)F F `lfFFFUt?jYFV6VfBjhYF V fdF7(E@fE5\)wYE_^U VW1UUEEEhuYY\)uuhYYf8)8)S)Y)\)H\)z}5\)Y \)E\)J joY]ƍVUVUVUf\)H\)z}5\)pY \)FWFfF\)H\)z}5\)+Y \)F jY]ǍWUw rfG_)tNJVKY^UVuU VE E 0>tr^UVUru1 >t6^UVW5,)Yƅt0VYjw YY9Eu5,)VYY1_^UuY1ۅÉUuYEu p bYYUu u YYEuuhYYE+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇdtPXP0U$UUEEEEEEPjj UVuU VVu 0YYEtF~}VډF^UVuV u ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u hO%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrTh0(P5)O}E_^UVW=p)uwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ>t 6+V~ WY_^UhOYUl)Pp)UVEPu y6YYEu1xƅthuuR0 E}fF ̋EfFEfF vF$PRF,RF(RF 1SEt jjVC ^UUURu ub EUUURu u EU VWE%wWUV tVUY ETM}?u׋E_^UVuV4;YuNSX^UVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S 0 ^UVuFuu PM. E=u^ fF F fF UVPE^UUBP7-YUVu ~u F1Vu`5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQG,YYt5uu55"}E-E EuuA,YYtE E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE M@ExUURUuE }|4uju% t+EE9EU܉Uu7&YEMUutUU#J UUBEEZE E UutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!x UR$YELEd+UU1}=UM EEUUUU}tE U@tEU9U~EEEU0U+UU=FEE}|EPu YYdm}UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5t 5p t1uu5| 5x }MmE}tW9U$vFMF0}uUt F.1uu5 5 K$}EPuu5 5 _YY EUuujj Z0Fuu5 5 tMkuu5 5 tMEPuu5 5 YY\ EUuujj Z0Fuu5 5 BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF ES+U _^UVWu u5 5 t'EPu u5 5 YY\ E-0PjVEEu}uu5 5 K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUmt/~V%Y7 mtENу}%u!1EEEU ~V.%Y 9MNE]M벃M묃M릃Mk E-0둃MEE,vE QEE,vE7MEEԨwEEEԨwE MMEEԨwEMEEuPYYEM EM EMEEԨwElU'tEUURfUtUURM܉ LEmM~Vh#YU  mEN~V-#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrRp8E܉EEuUtRE ʀ:t*ENJt~V3"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E muENJt~VU!Yt뫋UURUU mu*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU M Z}uEMEt e?oe?cUU<EUU<E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU MT e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VXYu OpU€nEt&v9UUUVPbYYڋUU Met }EtVu;YYUU MVu!YYUUvPYhlUtUURlJ!lhF YUURY EF E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUS XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=p)u[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP= jEP j_PjjjIPjD(UVUU U RxYƅt u V YY^UuYUVW5t)VUT>M}}6u݃=l)tl)uY_^U$VW=(kFǣ(j YƉI!)ى}=(tW Y=u1%EE95(wU)(9UwEE#(U)UUUtEU9UwU(օUѺU~W9(~5(}EU5(EV Y=tU<( U։MU(օU (UVF_^UVWutVր:uV׍(׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5`uYYƅ}NU9(vm (U}tFt*N9(~  (֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E(9} t9uuEG6uEE}|и_^U VWuEFmu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEmt0%mUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE" }t]} t}tFE] E_^U VWuEFmu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEmt0%mUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E" }t]} t}tFE] E_^=)+CC [ {sƉ=)kC{Sck[SkÃ=)g{SK k{uC [ SkC [=)C[=)_1C CtrIAÃ=)C s[ =)CK [ =)SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~M E 1U} |} ~M ҋE!1UE1UE1U} |} ~M Et1U(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj4 U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjn E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJuFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z5 5UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E$ (UM, 0UMEEuFmuFE=-u Ej}+tdNaEmt`uu5t5p}6U0Rje5854uuYYYYEEGFEu}.l_Emt^uu5t5p}5U0Rj5@5<uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNEmtk] -0؉EFEuۃ}}]}}}EE9} s7t"E|xuuyYYEEEEuÅ~;} tUԋE "}}5RPR$RPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZDEE8EE@#EE@1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uV|YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(Ru^ fF FLF fF uGYEu^ fF 5l)PF fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=p)ujuFV t V uYV u  V t)VLYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=)K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]Pt)Xa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]UdhU$EPuYY}1Uu hT$uE U$UUU UEEEEEPjja U$UUU UUUEEEEPjhj" Uu &UBUM JUju RUVWuEVU}u>u Fn}|"RPS"5p5l0}uat xUMQRQRZYYZYUMQRQRGYYZYUMQRu u0YYEE VUUׁM~!#N щNW@ׁ#N щN| UMQRQRYYZYUMQRQRYYEEu uuucYYZYUM QR55u "u uXZ_^hu被`=}a荫aUVWME_^]} 0)ʇʋu }Duplicate expressions eliminated4 -----8-P-Q-R-GxGGGGx***** *  ? %ld %d %d%s*** ? eliminate duplicatere-using %ld(LB)& Z m m & a l w l w   (  :qqq Wm\{[TTT[[[TTTT +2(G%d%d%d%d %d%%CS%sQ_o} Xok~O"! 9" x" x" x" x"x"x""!"""*-"+9"/9"3"@Y"J!K9"W"X"]"gC"z"|"~"""""n#U#U#SI#VI#rI#sU#'%#### $#+$S$$$$$'%% %%%%%%out of memory : file %serror on line %u optimization: illegal pointer size%d%dr,C,M,Q,S,T,V,wwwwrrillegal argument%s: %d unexpected eof %scannot open %sr'5p56Y6cannot open %sr)7~77777777988889x9:9999ms_opt encounteredms_err encounteredt== =-=8=C=O=O=O= BAAAAAA;JJ"Joffset expectedtoo few parameterscannot open %s_ZYZ5ZZ XEUZZQUZZZZZZWUsUZmUyUZUUUUUUUUUUZZZZZZZZZZnVVZVZZZZ)VZZWZZZZZXZZYZZZZZZZZZZDVrVVVV2VrVZZ;VZWX@XZZmXZXZZYbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@eE;aGce;af`gc$@@i"i%/h*_h0wh1wh2wh3wh4wh5wh6wh7wh8wh9whDhEiFiLkhOhXh[7ic[idheifigihqhihlehniohpkis+iuhxh}m+M"m}m"m}m}mllllllllll}m}m}m}m}m}m}mmmmmmm}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m0m}m}m}m}m}m}m}m}mmmmmmm}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m}m0mo+n-n.n0n1n2n3n4n5n6n7n8n9nEnengFjjk~lgnp|p-p]p?$@$@aчrw@@              ()569:; <=>?ABEFGHIM N O^ cdehinopq} V 2aaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrlSSSS"1SPRRRh1SPRRR 1SPRRR 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe)4 4 %%RA 2 0 0 1 2 2 0 1 0 8 4 0 0 1 0 4 2 2 2 0 1 0 0 0 0 0 1 0 2 2 1 0 2 2 1 0 -1 -1 1 0 4 2 1 0 2 2 2 2 1 0 9 4 0 1 0 9 4 2 2 1 0 10 6 0 1 0 10 6 1 0 4 4 1 0 1000 1000 1 0 4 4 1 0 4 4 4 0 0 0 1 18 2 2 36 4 0 0 0 %%UD 1 0 4 2 1 0 4 2 %%SR 0 0 0 %%CS 4 71 62 72 38 76 -1 4 71 62 72 38 76 -1 25 36 26 37 -1 25 36 26 37 -1 1 1 8 -1 -1 -1 -1 %%SP 0 2 2 %%RA 2 0 0 1 2 2 0 1 0 8 4 0 0 1 0 4 2 2 2 0 1 0 0 0 0 0 1 0 2 2 1 0 2 2 1 0 -1 -1 1 0 4 2 1 0 2 2 2 2 1 0 9 4 0 1 0 9 4 2 2 1 0 10 6 0 1 0 10 6 1 0 4 4 1 0 1000 1000 1 0 4 4 1 0 4 4 4 0 0 0 1 18 2 2 36 4 0 0 0 %%UD 1 0 4 2 1 0 4 2 %%SR 0 0 0 %%CS 4 71 62 72 38 76 -1 4 71 62 72 38 76 -1 25 36 26 37 -1 25 36 26 37 -1 1 1 8 -1 -1 -1 -1 %%SP 0   ( 1$T$L (D s=D SSSSu D QRP$ PGYUVWu hvYYEhvYYEh vYYj Y0VuYYYPuYujh`W Wjhd1 jjh` jjhdy u5Yu5YW5Yjjh`c jjhd< hvYYEP5`3%YYhvYYEju5X' jXY_^Uj%YHHHBUETH}F\"EPiYE]UB=Ht HM UHEfH =TtOu5TO!YYTuLU9Ttu5T!YYUTUH4\ ` J` HM u5T YYTHfH h<YEPEPYY2UVUf <f hD Y,jTYƋ,ffV FE 0=Tu5T1LjYF<Pp YfF E 01f<fUEPYE=ufEu WE 0EF=Tu5TE=u'E=u11Pk1^UVEH %fEUj3Yj&YjYEPY<PS5P, F vjY<PA YfF UjYf<fV ;E0E=u2jYEPtYP5@5P F j_YƋ@V jGY<P YfF j&YEP YPjhD@ F jYEPY<PShD F ZjYEPYP5@hD F ,jYjhDj YYF z/^UV 5 hhD; jhDJ YYhDY,j*YƋ,ffV F=Tu5T=HtH25H`^U V=Ht5HYt`P ?PfE=Ht5HYHJfME]9bE=t E=uLjYE=uE]SV5H5,V6Y1hYE=u1EPvYEVP5,- ,BH 9tAL @fL ,BfH fH ,Bw-,f L fJFjY17jY1(jY1jY1 jY\N \B\B \B jYƋ\V FL\fBjY j2YXhiYhl^Yjv .$YY jv $YY 4V}Y1=jv #YY` jv #YY-,E0,^U- 6 *#EPhYYE,UVW}NG9Gu I = 6Et FE6EGG$d+_^UVW8U Jt hlYU B*1u t VZYNj6EP+_^UVjIYƋURV^U VWutVt1-6uYENj]3tVYNj6E_^UEEEE |E v*UMJUEr PYYUB}uUr UYUBUVW}UEr PYYG}u4t.w>t6Ur YuwZYGU r >t6UR UB _^UVu UIMt:F=u jGY VP@fFZT^UVWj[YEǃ EXhY<@jxYƉ@V4j\YƉ<SiYfFj7YƉjjhD  FjYƉjhDYYF<@jYƉj5@hD FjYƉEFPuYYdjYƉj~YƉ jpYƉ$EfFF PDPBYYE2 '}t MuE}u܋E_^UUB1=uCUVjuYYƀ~tuhbYY^UVWEUrtU 9}uvt7U 9u0~u UVj}tU9VuUuvjYP @fP fP fWU UWUW }uUzUzw_^U}u0 juYYEuu u UVWE%4d>tE9BuB46j Ylj]_\ @f\ f\ fWG_^UVW1҉U׋u>tF#U1ǃE_^UVW}ujYhduY1YtUW^HY}f\ _^U VW}U U9J7t?VUB u/UvPhXu'UB UB 6뽃_^UVW}U U9`E7JV U%UVB Eu}uUUEVjGYuu뮃_^U VW}U U9J7t?VUB u/UvPh`u,&UB UB 6뽃_^UVW}U U9`E7JUV U%VB Eu}uUUEVFYuu뮃_^U u I u. H z}5 ,Y UVWƁ| _^UVWmf Zi Mǁ|i _^UhhY<=tUUhY<@xUuhhD+ U VWDmljJWZtEDsFF_^Udf<f<:PjY|PQY[LEvGf<df@S=t&h[YhNY(!XE EFUVsƃu i~f<M|f<-}|f<VY^UVƁ}|xf<VUY^UU fU f U \fE]t]ShYYUU fE]et],t]Sh YYUUIMt U PY@UjuuYYEt @ u1UjutYYEt xu1U>hDYt/7hDYt!1jhYYQd1U=u<=tjhYY=t hY<=uWUVu>tFU9sN>auN>mu N>.u1^U(VWu濠 5d jjV% d J t1EU؉IM؅tFGV  V с F &F% V f V  V с _^UVl 5d ?#Ytjj5d  |5d #Y5 j5d t1jV5d  5 j5d d d  jR5d K Ffl 8=d t 5d Yh U9h |1h M h5YYd u5h#YY5Ytfl 5d Yjj5d d ^UVW}4p YƋEF_^UVWuV׃u v 1YV]>Y_^UVU4 RYƋEfF^UVWut3>v+Yv YF^V=Y_^UVWut >V=Y_^UVWut~V=Y_^UUrYUrhYu=YUE@PYUup=YUEHPdYUuI=YUE@PCYUu(=YUUR#YUV1U tFu<Y^UVW}jW:YYƅu h Y_^U5\h0h  =t5h$h  h h YYu uh  hh uYY9jw:YU= t8hHh IYYuu uh 4hDh "YYUu ukYYEuuhXYYEUVu,H,zr ,I9J|DFЋ , ,: t ,5,j 7YYF5,S7YYqFЋ , ,QvYTFPYGv YtNJVY^UVuU VE E 0>tr^UVUru1 >t6^UVW5*Yƅt0V0Yjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYUVEH@PYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV&YދUE _^UEUUBUEU VWE U}7t%u6$YYtVVI&Y܉ՋUUE _^UVWut~V&Y_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^+C;Cw Ë[ uӅu P-KI|;u[u P[1ۇ tPXPv+UVW+E_^]+U$UUEEEEEEPjj UVuU VVu*YYEtF~}VډH F^UVuV uH ~V t VY1E~ tvV Y}EV €t v#Y~0tV@9V0t v0#YF0~DtvD#YFDfF E^U}u h7]%UJ uH uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT PO!YEu18u EUzUrThPPE$O}E_^UVW=4uT wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW/ǾT >t 6+V~ WY_^Uh7bYU094UVEPu I/YYEu1xƅthuu, E}fF ̋EfFEfF vF$BF,BF(CF iCEt jjV ^UUURu u EUVWUU Uu~}FUU}VU9Uv>uW6K'U}׋U+UUVtƋU+U1u !uW6 ' V+UVUE_^U4VW=4ukuV(UH V t~PjjvU =tV t+V׃~0t+V<V t >t+V} EE'1EH nE~uVLYV V uc}Cu.F|&F]SPp(YYuUԁtF fF FLF fF }uU U!F]SP(YYqU UU}u?V t~PjjvU =7+V׃~0t+V<׃~0tV8+VU+U׋V<U+VU+U׋VUV uX9}|SU9UsIU)׉VU)V~0tV@9V0t v0YF0F %fF VLJҋ}!jWvU =jFV~0tV@9V0t v0vYF0F %fF U)UVYuU9VrV+UVcVY/uu vU =~0tV@9V0t v0YF0VFF %fF 1_^UVWu~(uH ]V t~PjjvV( =t4V t+V׃~0t+V<V t >t+V׉_^U VWET %wWUV tVUY ETM}?u׋E_^U,VuV tVCVFF|F]SP "YY}EEVU؁1 u@EEU؁u%~(Cu^ fF FLF fF uYEu^ fF 509F fF UVUV}tFP:!YtF fF ^UUB % 1=uCt u/Y1UV=4uuFV t V uYV u H V t)VYuF %fF FFF fF 2~0t,V@9V0t v0YF0V E|EPYtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ YYt5uu5 5^}E-EEuu YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju t+EE9EU܉UuwYEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYELEd+UU1}=UM E(EUUU}tE U@tEU9U~EEEU0U+UU=` FEE}|EPu YYdm}` UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55e t1uu55G }MmE}tW9U$vFMF0}uUt F.1uu55$}EPuu55YYH EUuujj0 Z0Fuu55`tMkuu559tMEPuu55[YY EUuujj Z0Fuu55tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E+U _^UVWu u5 5 9t'EPu u5 5 [YY E-0PjEEu}uu5 5 ~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u V|YuE_^UV=4uouV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEPi jEP j Pa jj j PK jD(UVUU U RxYƅt u VYY^UuYUVW58VUT>M}}6u݃=0t0uY_^U$VW=k*ǣj9 YƉI!)ى}=tW Y=u1%EE95wU 9UwEE#U UUUtEU9UwUօUѺU~W9~5}EU5EV2 Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5 uYYƅ}NU9vm U}tFt*N9~  ֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^=$CC [ {sƉ=$;{SK k{uC [ SkC [=$C[=$31C CtrIAÃ=$C s[ =$CK [ =$'C[U}u}uUM UMQ}u} tEjEPEPy jEPEPg EPEPYYjEPEP UVu EPEP) E}1} u@D1UfUE]9~;E@]9uUt}u}tj:YE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP' jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEP=YYjEPEP| UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]#UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U$EPuYY}1U} |} ~H M E 1U} |} ~H M ҋE!1UE1UE1U} |} ~H M Et1Uu hT$uq U(UUEEEEEEPjj E=u U 1UVW5  }׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$UUU UEEEEEPjj U$EEEEEEEPjj U$UUU UUUEEEEPjhj> U$UUU UEEEEEPj%j U(UUUUU UEEEEPjj E=uEU,VU @t=Uփ֋ru0YE܋U UuUUEEU UuEPYYEPjj; ^U$UUUUU UEEEEPjj U(VWu UJ<<UUtuuUJ4<EzEEEEPj0j E؅}UJ<<EUJ4<}u_^U$UUUUU UEEEEPjj" UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U   Zu u4)UUM] Z5$ 5 UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uYYXZ_^UUU VWuVFZ( EE8EE@#EE@H 1)>+t >bu~+u EU UE _^U VWU RUu1"uV t~uVT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVut1f#V9Wv VVV+WVV+WVVY_^U`E]]P8Xa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]Uu ںUBUM JUju R5É uR`=}a=aUVWME_^]wwwww +eillegal readline]BY]]]]8 N"NNNNNNNv!_HH%d2   - 8 C g g r  ix! ms_opt encounteredms_err encountereddatablock without label ( 2 3 5 9 = F c n illegal operand of opr_size: %dd  ) ) ) 0 P P P q q offset expectedR 3 9 R R R R - R R R R ? {  U ~ { { {  * unknown byte in arglistidentifier %s redeclaredsymbol expectedproc name expected%d %s %d %s int expected offset expected.%uHSZp  p/offset expectedsymbol expectedwrong magic number: %dwrong archive magic number: %d  vwrong argument of MES %dmessage number expectedcannot find MES %d in library filecannot open %srjFQQQout of memory : file %serror on line %u optimization: cannot open %s Q \ i t  E%$$ %%!%,%w-U-^-offset expectedtoo few parameters;;;;JIMJmJJ X}EJJEJJJJJJEEJEEJ'F0F0F0F0F0F0F0F0F0FJJJJJJJJJJFFJFJJJJaFJJ7HJJJJJ IJJHIJJJJJJJJJJ|FFFFFjFFJJsFJG;HxHJJHJIJJQIbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@%VEsQGSesQfPPgS$@@iair[iwpi 2 < +776   90   SSSS X iCBCB iCBCB  iCBCBL X 0000000000000000  x1$T$L Txs=SSSSu QRPPPU VWhu3YYh u z3YYEhuh3YYEhh<T3YYC65YV_YEjhEPEPEPVuDUuujjO% 붋MJR$MJ5|YR$fBR$BR$B=d~B B \Wu5 j5j$ 5E6Y05VWYuWYuWYWWY_^UVWh u1YYEhh@1YYhh<1YYEu2%YƅtKVB u9VYt.VUYVsYE]3uYYjWV( V9#Yu u5 uVY=<u uUYWVYuVY=<u h<UYhh@ 1YYW5fYY5YWVY=<u h@UY_^U,VWEh0u0YYEh,u0YYEh(u 0YYE}th$hy0YYEg3huY%YYDž=uu7GYYW)YɋB t75 YYUfER$2lVUF])SuYYE؋]j3YYEfVfU7uVu}tjuV' VV!Yuu7:GYY5y3Yd2W(YuTYuTY}tuTY=<u hSY_^UVut!j *YF$fVfPV$NJv(^UVutv$Yv(^UhhWYYhhWYY5hhhW 5lhphW 5phXhW 5th8hmW 5|h hUW h hCWYY5hh,W 5dhhW 5xhhV 5hhV 5hhV 5hphV 5h\hV 5hDhV 5h4hlV UVu}>Fk Ã0X^hhQYYhh<QYYhhQYYhh@QYY<FQ^UVWu hh6h6h6Vu3-5`YhDh2QYYh4h<!QYYh$hQYYhh@PYYh[Yh<ZYhZYh@ZYhvv a dЙPhYYvv YYhv+YY5YW5LFYYh v+YYjW5H 5dh;.YY=tj}Y_^UVuF t-F u'vPs&YYu~t~F @tHF F F t3F thvP+&YYtl~~pv(u^UVu t,F=uUB UB t6^UVW}U ruu VW<jjVKYPu WjjVKYPu WnjjVqKYPu WQ}jjVTKYPu W4`jjV7KYPu WFjjVKYPu W,v WYYG G TFM6_^UVW}E`wt,v-Yu ~ tEu VW v Ѐ}tG G WYu5`!YYW$B5`3Y_^UVj#Yu uYYUV2V ^UVu Uztt~u~uF 9Bu1^UVUB uH5`tU 9uF@fF)vj ;#YƋU fF`V5`^U VW\U R UB UR$ @fUM h jEPrq.E 0uYY|j"YNjU\fGUWuYG _ ~UJt_ @G WuuYYjuW~ x52Y_^UVW} u1EUR$rtU9}uvt(U9u!Fu PdYYt1t FP6u ut1]}t#UB]u uP3_t14j F!YNjE GU}u UR$zUzw_^UUB UB uGYUVuF u$U rA*YuF FF F^UVW}}LG uFG u@uuW ƅu WaY"}uF F u VaYY_^Uu)YPu YZ19uCUVW5(Yƅt7V(YP :U9WuM 9Ju5V~(YY1_^UVutV UVxYu^UVUR$rtVUVxYuUR$B^UVWUR  uURJREUR$rt>~FPYP6YYu}u UR$zUzV!xY_^UVWu}9~uY19~C"9~u Y19~C_^UVfEUr,'Yƅt5V2'Y@]9|V'Y@@fEUrV&YYE^UVWEUzt'wtV~VE6 ՋE_^UVWE}W Yƃ}uuuFE0UVu9} t?ˋE_^UVWu} t tFPY9Gt1 v܅u1_^UVE 0\HRURJt=?u-EtVR$B=d~%VR$B9E }Vuv^UVut8V$B=~F tV$u 2FYYv(^UVE 0t URU6E^UVUrE UU9t 6Y^UVW}Wu}9YYP9Y9=uFq;9uFe)F:u V:YYu jYƉfF Fpu V:YY_^UVWU zUrtE6W#YYE~t}xuu'YYvW5= Uzv _^UVU ru YURz~6Yz@u6qY^Uu uWYYU REu uYYUVW}?t zu6jYFU B@U fBU fRfV WV9YY_^UVW1Eu t9~u U+VU9}E0~uU+UUE~v _^UU zuEU fB U MJ UVWUJfMu YE=ht E=Au;5`7YE=hupHFWYPV8YYURUuYuWYY_^U VW}W{6Yƅ}UWR&YY=U EPEPurVUztE0WYY WuYY_^U VWUr ]6`~} UVNU EPEPurWFUzt u"Y UVuY F8_^UVURUuYU RB u$j^ YFUfR fV uVZ7YY^UVu~UF EfF Puuu Vwt"Uuuuuu W}ڋEBUR UV; Y_^UVutV|V6^U VWE8u YbWYƅuuYpWYY?9u u VYY.uzYPUVu VYYuWYY_^UVWEu t(UuVYF6uԃ}tj Y]EBUR$:tWUWeY}UB %UB UreYUr eY_^U UHU RR$jru: EPu"YYE5YUEUVut~uE HfE U u61^U VW} dRډUEPuW Wut6^UVWu uYNj>tzUUr_^UVu~tV >tNJVY^U"E 3UVW}GP"YGF,fW fV 0W V (fW fV W V W V F2_^UVWE}t0WYƃ}uuuFE0UVu?̋E_^UVWUrt)V U>tUWY}V%bYuӋURUubY}tURUuYUU_^UVutUV%Yu^UVWUuuYU rt6V UvYvnYveYv \YVoaYuƋU rYDžt WYPJaYU rWYY܋U rYP5qYYP5\YYP5GYYP52YY_^UVutVUV`Yu^UVWUjyYifEJ t1M5DZ6fF5'ZVHz}5=Y F Hz}5=Y F fFVUfEUHfEujYsfEGHz}5<Y G]EPSu E8W UpE_^UVWUUffUffUUE j YE@V}u #YƋJ t1y7~~t~uVaYËE 8t<S5YYP5YYUUfUffUfE_^UVWU R$jruO3 UE}fEUt9j Y5ZfF]Kf]뿋E_^U VW1utGv WYuV U1U}t GEUWYvSYHzP I9J|.N : t 95j eYYY(F5PQYYYN u 6n YYV\Yu._^UVWuU EPYPYFPYVPYHzP I9J|.N : t 95j XYY(F 5PnXYYN HzP I9J|.N : t 95j XYY(F 5PWYYN FPYu vYY~V^[YtWUE@Pu W }_^U Vu 3YEU fEutE@fEvEP Yut6pYFPYvE^UVW}4YƋEF_^UVWuV׃u v 1YVZY_^UVU4RYƋEfF^UVWut3>v+Yv YFB*V%ZY_^UVWut >VZY_^UVWut~VYY_^UUrYUrhYuYYUE@PYUuYYUEHPdYUuuYYUE@PCYUuTYYUUR#YUV1U tFu#YY^UVW}jWVYYƅu h Y_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5hDh) =t5h8h) h4h)YYu uh) h0hq)YYRjRYU=t8h\hE)YYuu uh0)hXh)YYUu ug(YYEuuhlYYEUVhuYYhhV( hhV( 9t9t h|YVU YV%Y^U(VWu EE U9UaU<G<-t@hPY3E:E4GuW/YY&WUY 9#E듀}td1f vI Yv YU}6Qhv YYEhvpYYEhv^YYEhv LYYE:jhEPEPEPuuhUuuuujj9븋MJ5UYuuj5j 5YouH#Yu?#Yu6#Yu-#Yhv{YYEP5YYhv[YYEju5e _^UUU=tu uhh'&U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVVPYދUE _^UEUUBUEU VWE U}7t%u6$YYtVV5PY܉ՋUUE _^UVWut~VPY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UV}~ }~1)U4U>u1] F]^U 1 EDU1} u@UVu~Eu*VzEu!VEY] v7Y]1^UVuu Yu uYtuuv Iu UYu uHYt*~uF ]~u V E1^UVu {lbVOC1?U0"95~LE1^U}t9UEPEPBP tEPEPuuuu E 5E uuu ]uuu ]UVW}Eu uEPEPEPWJ}t +Uօ}1U}u}"UBuREPuwu1(}u uWuU Uz냋UE_^UVj$[Y@fff^UB@fBCfUVWHz}5)Y ǡHz}5b)Y Ɓ| _^UVWHz}5)Y ơHz}5(Y  ơHz}5(Y i ơHz}5t(Y ǁ|i _^UUE<u)jwY]]fMf EUUu1FE<u)j$ Y]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhuYYuuhuYY0fSYfEE}fEE9J tuh YYj,Yf4Hz}5F&Y F F `lfFFFUt?jQYFV6VfBj0YF V fdF7(E@fE5YE_^U VW1UUEEEhu5YYuuhYYfSYHz}5%Y EJ j7Y]ƍVUVUVUfHz}5$Y FWFfFHz}5_$Y F jY]ǍWUw rfG_tNJVY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYY+C;Cw Ë[ uӅu P-KI|;u[u PS1ۇtPXP8UVW 9E_^]U$UUEEEEEEPjj UVuU VVuG8YYEtF~}Vډ F^U$uEPz<EEPj jUVuV u  ~V t VY1E~ tvV Y}EV €t v.Y~0tV@9V0t v0.YF0~DtvD-YFDfF E^U}u hyZ%UJ u  uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Ps+YEu18u EUzUrTh|PE1O}E_^UVW=u,wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVWU@Ǿ,>t 6+V~ WY_^UhyZYU=\UVEPu ?YYEu1xƅthuu9 E}fF ̋EfFEfF vF$eF,fF(QfF fEt jjVS ^UUURu ur EUUURu u EU4VW=uuV(U V t~PjjvU =tV t+V׃~0t+V<V t >t+V} EE'1E nE~uVLYV V uc}Qfu.F|&F]SP@6YYuUԁtF fF FLF fF }uU U!F]SP5YYqU UU}u?V t~PjjvU =7+V׃~0t+V<׃~0tV8+VU+U׋V<U+VU+U׋VUV uX9}|SU9UsIU)׉VU)V~0tV@9V0t v0(YF0F %fF VLJҋ}!jWvU =jFV~0tV@9V0t v0(YF0F %fF U)UV2YuU9VrV+UVcV8Y/uu vU =~0tV@9V0t v0'YF0VFF %fF 1_^UVWu~(u ]V t~PjjvV( =t4V t+V׃~0t+V<V t >t+V׉_^U VWE,%wWUV tVUY ETM}?u׋E_^U,VuV tVCVFF|F]SP/YY}EEVU؁1 u@EEU؁u%~(Qfu^ fF FLF fF u[$YEu^ fF 5=\F fF UVUV}tFP/YtF fF ^UEPu.YYtEUjuYYtE1U(VW 1ƋUUU:tE10M1ƋUU:Xtܾ/}GOU 9uBEPu)4YYt1U܁@t  ۋU/ MU9Uw} t3hhu2 ] | b= t"돍EPu3YYt= to>d>zuFata{@p_^UUB % 1=uCt u/Y1UV=uuFV t V uYV u   V t)VYuF %fF FFF fF 2~0t,V@9V0t v0#YF0V E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ-YYt5uu55"}E-E Euu-YYtE E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE M@ExUURUuE }|4uju&& t+EE9EU܉Uug&YEMUutUU#J UUBEEZE E UutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu! UR$YELE0d+UU1}=UM E0EUUU}tE U@tEU9U~EEEU0U+UU=8FEE}|EPu YYdm}8UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5 5 t1uu5 5 }MmE}tW9U$vFMF0}uUt F.1uu5 5 K$}EPuu5 5 _YY\ EUuujj Z0Fuu5 5 tMkuu5 5 tMEPuu5 5 YY EUuujj Z0Fuu5 5 BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E+U _^UVWu u5 5 t'EPu u5 5 YY E-0PjVEEu}uu5 5 K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUt/~VY7 tENу}%u!1EEEU ~VY 9MNE]M벃M묃M릃Mk E-0둃MEEԤE QEEԤE7MEE EEE E MMEE EMEEuPYYEM EM EMEE ElU'tEUURfUtUURM܉ LEM~VYU  EN~VYtuUtfDžpVU9s-p+U׋UVTYt׃pupV)VUpUUUVWjrp8E܉EEuUtRE ʀ:t*ENJt~VYt΃}}wUURUU ʀ:t6N]EJt~VJׁ\v\GMvU M8 }uEMEt e?oe?cUUXEUUXE=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VjYu O)U€t)v9UUUVPYYwUJMxt}XuMVuYYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M| 9e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VYu OpU€nEt&v9UUUVP&YYڋUU Met }EtVuYYUU MVuYYUUvPYhlUtUURlJ!lhF YUURY EF E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUSX%U]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VXYuE_^UV=uKuV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP jEPA j PjjjPsjD(UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃=tuZY_^U$VW=HkǣHja YƉI!)ى}=HtW< Y=u1%EE95HwULH9UwEE#HULUUUtEU9UwUօUѺU~W9H~5H}EU5HEVZ Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5|uYYƅ}NU9Hvm HU}tFt*N9H~  H֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E " }t]} t}tFE] E_^=P+CC [ {sƉ=PkC{Sck[SkÃ=Pg{SK k{uC [ SkC [=PC[=P_1C CtrIAÃ=PC s[ =PCK [ =PSC[U}u}uUM UMQ}u} tEjEPEPA jEPEP/ EPEPYYjEPEP U jEPEP jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEPn _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPqYYjEPEPh UjEPEPs jEPEPa EPEPYYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]Ë} 0)ʇʋu }D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]ZU$EPuYY}1U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1Uu hT$uq U(UUEEEEEEPjj0 E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$UUU UEEEEEPjjI U$EEEEEEEPjj U$UUU UUUEEEEPjhj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjF E=uEUu UBUM JUju RU,VU @t=Uփ֋ruXYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjjJ U(VWu UJ<UUtuuUJ4EdEEEEPj0j E؅}UJ<EUJ4}u_^U$u"EUUU UEEEEPjjhU$UUUUU UEEEEPjj& UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U <@ Zu u4)UUM] Z5H5DUM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u& YYXZ_^U0VWu1EL PUMT XUMEEuFuFE=-u Ej}+tdNaEt`uu55"}6U0Rj5`5\uu:YY3YYEEGFEu}.l_Et^uu55}5U0Rj}5h5duuYYYYEEOFEu}Et}euQFE=-u E#}+tNEtk] -0؉EFEuۃ}}]}}}EE9} s7t"Euu YYEEEEuÅ~;} tUԋE  "}}RPRPx}}uuuuYYEEuuuuYYEEuuuI EU} tVE }} uuauuXZ_^Uju&YYUUU VWuVFZlŻEE8EE@#EE@ 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6e V+UVUE_^U VWU RUu1"uV t~uV YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W+ V+UVUUUyV9v,U9Us$u6WUV*tKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj Wc Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV蠹Yu8E}׋U+UUU R+UM QU zF @fF _^U VW}u =u3u V uKV tV t)V;YuF %fF FFF fF UʉM~0V49VuV@9V0uOhYEu vUV0F4E UL>@ O}UEAV4URv0EYYEtEuPu E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=PK C c[ U VWu} W WV VuWVWV YY9zV9Ww 9WuHV9Wv@VEPzWVnU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE|UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WV%t1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWV}t1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]UVWME_^]U塌UVWuEVU}u>u Fn}| "RPS "550}ua UMQRQRzYYZYUMQRQRgYYZYUMQRu uPYYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuuYYZYUM QR55>u  "u uXZ_^u^`=}aIawwrrrrwrwwrrzero ratio: %d no space available: %d callee too big: %d callee is changed: %d caller dispensable: %d caller too big: %d parser failed: %d total number of calls substituted: %d total number of calls: %d Info about calls: procedures removed: %d instr. lab in data block: %d too many locals: %d recursive: %d environment accessed: %d Info about procedures: STATISTICS: 8ast....inline substitutionsww/ego.i4.XXXXXX/ego.i3.XXXXXX/ego.i2.XXXXXX/ego.i1.XXXXXXw  ) 6 :1 ? A I VX e h q K K K K =< dispensable: procedure %d can be removedsingles: procedure %d can be removedspace left: %ld H v )& 6& :& ?& A& I& X: e& h& q& & K K K K T K K K " !!""""!""""!!%$$$d%d%*%4%<%F%N%-----out of memory : file %serror on line %u optimization: cannot open %sillegal pointer size%d%dr5C5M4Q4S4T4V4wwwwrrillegal argument%s: %d 8 888888888888\: 999999::::.:<:unexpected eof %scannot open %srk@@[AAcannot open %srmBBBBB C)C)C)CDDDDAD[DDIEDEEDms_opt encounteredms_err encounteredHYHdHqH|HHHHHMMLMMM)M4MU]UfUoffset expectedtoo few parameters]]]]mmmmn Xhnnhnnnnnnhhnhhngipipipipipipipipipinnnnnnnnnni1jn1jnnnninnwknnnnnJlnnlnnnnnnnnnnii1j1j1jiinnin7k{kknnknNlnnlbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@eyEtG5wetfsg5w$@@T}"J}%{*{0{1{2{3{4{5{6{7{8{9{D{E|F|L{O6|Xn|[|c|d|e|f|g|h{i|l{n}o:|p|s|uT|xr|+M2gggggggww+$-$.60123456789EHeH4{}i~I߁`-/]\?$@$@Μarw@@/tmp/tmp/tmp/tmp 2                     SSSS0feQfffeQff feQff$0 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOex  h`1$T$L  s= SSSSu QRP] P^UV59r 61`YP5 YY^U 1UB8U 1U\B8U 1UBc8UVWP YEfEE9}:EJuEÍEPS YYE@fE뷋UrPB YVS/ YVB~W/YtLEPEPW6 }VE2P YYwVERP2 YY_WYtEU REr PYYEURErPxYYE]M9t#uV}t1PYYPYYE@fEB^UVWuU ztutr7~>trU rF_^UVW}U EPEPW1 }E9UfMf E)ۋ4VU}uWVjYYPQ-YY?VtF%fF}uWVjYYP-YYU _^UVEPEPu0 }dE9~UE)ۋ4Vt4Vu+} uuVjMYYP,YYF fF^UUVWURUE 0}9} tUWY}}uUrE0tUV_^UVWEUzuWYY}} uWYW,YƅVUVYE PEPEPV}E)ۋBhKj]SPugURUWVu E)ۋ 2Ph hVYt E PVYYu _^UVUrtjYFv ^UVUrt=V2YVrYVrYVr YvoWYv ^U D  U=NtUVuF @u4VWYV8YD PV YYVZY^UhC h.h` hD8u uE5hh_ YYjTYUVW}4H YƋEF_^UVWuV׃u v 1YVyVY_^UVU4d RYƋEfF^UVWut3>v+Yv YF8.VVY_^UVWut >VUY_^UVWut~VUY_^UUrYUrhYuUYUE@PYUuUYUEHPdYUueUYUE@PCYUuDUYUUR#YUV1U tFuUY^UVW}jWRYYƅu hTY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5hxh` - =t5hlh` - hhh` -YYu uh` - hdh` q-YYNjNYU= t8hh` E-YYuu uh` 0-hh` -YYUVhu[(YYh hV- h hV-  9 t 9 t hYVU YV5)Y^U(VWu EE U9UaU<G<-t@hY3E:E4GuW/YY&  WUY 'E듀}td1f vI Yv YU}.Qhv 'YYEh v 'YYEhv&YYEhv &YYE:jhEPEPEPuuhUuuuujj9븋MJ5UYuuj5j 5Youx'Yuo'Yuf'Yu]'Yhv&YYEP5YYhv%YYEju5e _^UUU= tu uh(h` W*U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVVLYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVULY܉ՋUUE _^UVWut~V%LY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UV}~ }~1)U4U >u1] F]^U 1 4E#U1} u@UVu~Eu*VzEu!VEY] v7Y]1^UVuu Yu uYtuuv Iu UYu uHYt*~uF ]~u V E1^UVu  { l b V O C1? U0 "95 ~ pE`"1^U}t9UEPEPBP tEPEPuuuu E 5E uuu ]uuu ]UVW}Eu uEPEPEPWJ}t +Uօ}1U}u}"UBuREPuwu1(}u uWuU Uz냋UE_^UVj$Y4@f4f4f^UB@fB8Cf88UVW0H0z}50%Y 0ǡ0H0z}50%Y 0Ɓ| _^UVW0H0z}50/%Y 0ơ0H0z}50$Y 0 ơ0H0z}50$Y 0i ơ0H0z}50$Y 0ǁ|i _^UUE(<u)jY](](fMf E(UUu1FE,<u)j$PY],],fMf E,UEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhu!YY0uuhYY0fSY fEE}fEE90J tuh=YYj,Yf 40H0z}50f"Y 0F F `lfFFFUt?jYFV6VfBj`YF V fdF7(E@fE50YE_^U VW1UUEEEhue YY0uuh YYfS!Y$0H0z}506!Y 0E0J jgY]ƍVUVUVUf0H0z}50 Y 0FWFfF0H0z}50 Y 0F jY]ǍWUw rfG_$tNJVCY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYU VWUUE0JU9u1F] 9u%}hF fFUVMU9 V Uv jY]NjUfU fWw }tG fGUW_^UVUr jVYY=u9>t4jVYYPju jVYYPjVnYYP ^UVu3 fU5 fU' fUu VnYY7Fx>tzVtEjju PVYP^U VWEEfEEURU}t%UztEPWAYY?UR UՋuu}tDU9}=F fFUJu*UZUfB]Kf] E@fEFE}t9E}UUuv fUfEPYfEut@V UVt V)Y#U@fE4F u_^UfEE9BEM9 .E9 uUU fMf E@fE뫋UUVWu18V Ju U[V M fRfUFF ~ FtuEPW5 U:tEËU f_^UVWEfE=Ewst~u fFWU9}+fF}t1UJt&UfBEHfEU@fEfVVU9U}Uuv녋kEHf_^Uu uYYEuuhYYE+C;Cw Ë[ uӅu P-KI|;u[u P1ۇtPXPU$UUEEEEEEPjj UVuU VVu 0YYEtF~}Vډ F^UVuV u ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u h!;%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrThP5)O}E_^UVW=Du wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ >t 6+V~ WY_^Uh!;YU@<DUVEPu I6YYEu1xƅthuu"0 E}fF ̋EfFEfF vF$`>F,>F(>F A?Et jjVC ^UUURu ub EUUURu u EU VWE %wWUV tVUY ETM}?u׋E_^UVuV;YuNSX^UVuFuu Pj/ E|FPF %fF E^UVuV tFjjP`. F %fF ^uu S/ ^UVuFuu P. E=u^ fF F fF UVPE^UUBP-YUVu ~u F1Vu05YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ,YYt5uu55"}E-EEuu,YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE|M@ExUURUuEt}|4uju% t+EE9EU܉Uu&YEMUutUU#J UUBEEZE`ELUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!0URc$YELEd+UU1}=UM EEeUUU}tE U@tEU9U~EEEU0U+UU= FEE}|EPu YYdm} UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5,5(t1uu5450}MmE}tW9U$vFMF0}uUt F.1uu5<58K$}EPuu5D5@_YY EUuujj Z0Fuu5L5HtMkuu5T5PtMEPuu5\5XYY, EUuujj Z0Fuu5d5`BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF hEc+U _^UVWu u55t'EPu u55YY, E-0PjVEEu}uu55K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUt/~VT%Y7 tENу}%u!1EEEU!~V$Y 9MNE]M벃M묃M릃Mk E-0둃MEEJׁ\v\GMvU Mj}uEMEt e?oe?cUU EUU E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ V(Yu OpU€nEt&v9UUUVP2YYڋUU Met }EtVu YYUU MVuYYUUvPzYhlUtUURlJ!lhF YUURY EF E }E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUS XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=Du[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP jEP j/PmjjjPWjD(UVUU U RxYƅt u V YY^UuYUVW5HVUT>M}}6u݃=@t@uY_^U$VW=kǣj YƉI!)ى}=tW Y=u1%EE95wU9UwEE#UUUUtEU9UwUTօUѺU~W9~5}EU5EV Y=tUxt>XuFǃE}u0u E}tE1uUE1uEEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E " }t]} t}tFE] E_^=+CC [ {sƉ=kC{Sck[SkÃ=g{SK k{uC [ SkC [=C[=_1C CtrIAÃ=C s[ =CK [ =SC[U}u}uUM UMQ}u} tEjEPEPM jEPEP; EPEPYYjEPEP U jEPEP jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEPz _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEP}YYjEPEPt UjEPEP jEPEPm EPEPYYjEPEP$ UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]ËD$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1U(UUEEEEEEPjj E=u Ud1UVW5dd}׃}~9r}}9vWqYu_^U$UUEEEEEEPjjd U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjj E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJuFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z5 5 UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E UM UMEEuFuFE=-u Ej}+tdNaEt`uu55}6U0Rj5 5 uuYYYYEEGFEu}.l_Et^uu55J}5U0Rj5 5 uubYY[YYEEOFEu}Et}euQFE=-u E#}+tNEtk] -0؉EFEuۃ}}]}}}EE9} s7t"E uuYYEEEEuÅ~;} tUԋE  "}}5RP$RPx}}uuuu"YYEEuuuu#YYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZ EE8EE@#EE@ 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVPYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(>u^ fF FLF fF uwYEu^ fF 5@<F fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=DuuFV t V uYV u  V t)V|YuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv09YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=K C c[ U VWu} W WV VuWVWV YY9zV9Ww 9WuHV9Wv@VEPnWVbU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVqt1f#V9Wv VVV+WVV+WVVY_^U`E]]PHXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U  U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj葮 U$UUU UUUEEEEPjhjR Uu &UBUM JUju RUVWuEVU}u>u Fn}| "RPS "5( 5$ 0}ua, 0 UMQRQRYYZYUMQRQRwYYZYUMQRu u`YYEE VUUׁM~!#N щNW@ׁ#N щN4 8 UMQRQRYYZYUMQRQRYYEEu uuuYYZYUM QR5@ 5< Nu  "u uXZ_^ u`=}aͫaUVWME_^]} 0)ʇʋu } ()56=?AFIh ;>AGHKScenquseless assignment ,proc %d,local %duseless assignments deleted j u u u out of memory : file %serror on line %u optimization: illegal pointer size%d%drCM_QmSSTYVvwwwwrrillegal argument%s: %d K DDDDKKKKKKDD :AL[jtunexpected eof %scannot open %sr,cannot open %sr:DOiL!y 4!!q!|!!Z!ms_opt encounteredms_err encountered0%$$$$$ % % %)q)~)))))111offset expectedtoo few parameters6 )565?5A5I5e5h5q55587887cannot open %soFE%FEFF XUAFFaAFFFFFFgAAF}AAFABBBBBBBBBFFFFFFFFFF~BBFBFFFF9BFFDFFFFFDFF EFFFFFFFFFFTBBBBBBBBFFKBFCDPDFF}DFDFF)Ebug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@QEKMGOeKMf(LgO$@@U"U%?T*oT0T1T2T3T4T5T6T7T8T9TDTE+UF+UL{TOTXU[GUckUdTe/Uf/Ug/UhTiTluTnUoTp{Us;UuTx UY+M2YY2YYYXXXXXXXXYYYYYYYYY*Y*Y*Y*Y*Y*YYYYYYYYYYYYYYYYYY@YYYYYYYYY*Y*Y*Y*Y*Y*YYYYYYYYYYYYYYYYYY@Y/[+Z-Z.Z0Z1Z2Z3Z4Z5Z6Z7Z8Z9ZEZeZSVVWWXwZ\\-\]\?$@$@sasrsws@@ 2                     SSSSl A?`>>> A?`>>> ` A?`>>>  0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe  l1$T$L Xs=XSSSSu XQRPP{UVWEPhuZ u/Y19u~'DPDPPhuZFԉ_^UVEPhuuZ 19u~3EPEPhuVZucYUU MF^U VEPh$uZ 19u~)EPh uZ uYUM F^UdVuN} V:ZY SX= uEPh@VY h8EPsUYYuh h4VY h h0VvY h h,VcY h h(VPY hVYYhVYYVEYDV9YHV-YLV!YPhTVYYhdVYYVYtVYxVY|VYVY^UVURrt/v6Y=uv 6YP6YU9Bu1^UVWUr5YDžtv YVjxY_^U5P5L !YYUVWuT1=duC]F @VYVYfVUhhV JR)YPVYYh YhhYEPv63YPVi WYEPWYYEV]S]SPWu#Y55uV%UVuV&YYuV'YYu`YuWYuYJR5(YYV:Y_^Uh7hQhhu u.jtYUVWU Ph\hS E}UM4U4 hLh{S }uVBPh4h[S vh$hDS F4hh'S FPhhS v 1YPhhR hhRYY~t GPShhRhhRYY6EU PhhR _^UVWPhxhXR UU}uUfRfUE4 hdhR WURBPhXhQ FURPhLhQ (Urh<hQ EpMFPh$hQ FPhh{Q v/YPhh\Q F2PhhEQ hh3QYY~t GPShhQhhPYYhhPYY~t GPShhPhhPYYF PhhP v$hhP F PhhpP v(#UR4U_^UVWE}}UfUE}tGE@f4_^UVWhhOYYE}UEE}aEUM4t)VYtEF׋BUӋUu4 hheOEE}+UM44hh-OE_^UV1} UF^UVWUJ΅~~8J<u$uAGY|u4GY=_^UuY1=tCUVE 0tU9Vu ~t61^UVWu} WJYfFFW V"W VWFYFFI_^UE8t1EBIUVW@URBNjU RB7URNjU RUzU rUBI9u19~_^Uu u~YY1ۅÉUu u`YY1=uCUUjrFHYY1UBwHU7Ujr HYY6L,P"PUB(&HUVWu} fWfVWVWVWVFLGz)F W-YfFW[YfFON_^UVWUBU׋7tAuVYYtUzuFF Pu ?)YY>VuYYu7j-!YƋ7uV'YYF Pu (YY_^UuEPOYYuYuEUuuFYu fEfEuu uYYPEP U VWEu %YUrt+~tWYt u VW] E?݋v ыUE_^UVWfEfEE9E4~uUjv ^CYY= uBjv KCYYu2ujv 8CYYP YYDž~E@fG m~[jv BYY= uHjv BYY=u5ujv BYYPYYDžt E_ OQPS fUfUE@fE _^UVWEE9EUMfQUMfQEڋU r c'YE}u`'YEPRUR(YfEu-'YDžeW/'YE]CfUEURJPtEPYZfuW&YY듋U r u&YYEF_^UVj8-Y@fffVUU VfUfVfUfVUVUV,M N2M$N3^UE UJ4UE U|%E}t4U JuU MIrS YYtEPum%YYEUVW1Ur %YDžt8W%YEPUuE uVAYYƋUr W%YYvO&Y~v_^UVW}E 0S;YY\u PhYYWBWuPSL w %Yƅt%uu V%YP w V%YY_^UVWuYPYEEUr $Yƅt5V$YEPUEPEPu# Ur V$YYuPSYYuWBWMQPSu uYE 8UE_^U#EU Ju U z|EPu#YYEUVWUR 2#YDžW#YEp#Yƅ_V#YEUR 2u #YYu-U Ju"U MIrPE YYt+UrVr#YY뙋UR 2W^#YYe1_^U VfEu2#Yƅt*V8#YEU 9Pu ]Cf]uV#YYE^UVWEPEPu jjjuu u U Pr #YU Pr z#YPuu EuuIYYu"Yƅ~V"YU Bu WRYY W RUu.U JU OIrP YYWYEUfZfUUfZfUU JuU OIrS YYt@URBURMQPS U ur KYY]f]Eujjuuu W: ]MPSQuu PYY4U Bt&UBUZ9~UMfBfQuV !YYz_^UVWEE PYE] SYNjut3E WuPVuUEPWurVu6E PuYYE PWYYE_^UVWutPYFv4uJurvYY vYF}9f9WwvgYYtFG^SP YYF_SPYYF_9uF0@fF0_0CfG04뒋v4X_^UVu SY|}1>| ?1'| 1E`<^UVuu P{YYt}tFF^UVE Uր}tFF^UV1E =ufE E9PE9LE=E ]4 uE=oE ]4Z5DR5DJ u E=u45L, u E=u5PE|;ujuV UfujuV~ U f^UVE =uBfE :E 4T;E 4d.5t&5t5|5E:ujuV UfujuV Uf^UUZËUBfE]jS5 U f]jS5 UfU VfEuYƅt9VYEp;YPY]f]uVTYYE^U$VWu'fE>WUEG9fWfUE_OWPE$PE$PuSQRG_MQMQuPSvwYfE^MMU)fMfVfUE]PvY]Z)fU} tEEfE]M9~fUfUfUfVfUfV Ut fEv4_^UVjYfUffU fV^UVWEUU1E0t] 9 VUvtG@]9u fU fWEtE @9u fUfE}u!E ]PS[YYEpUE}ufVfWVWVx_Y_^UVWEUR 2 Yƅt8VYNjWBWMQPS UR 2VYYċE_^UVUr~ tv VBPjYY^UVWE8] 39} E8E 0 E0E 8_^U EUUU U}}EPEPYYUUZ9~ URUUBUZ9}&UBUMQPS  !"#$%&'()*+,-./01234567 URU뉋UBUMQPS UBUZ9u URUURUEEUUUU U}t8}t2EPEPYYUUZ9~ URUɸ1UVu t&F]9|]19Av1^U VWE}ut FPSYYE}v܋E_^UV1} fuF^Uj86YEUVu UUB^9u2t.UBvPLYYuv(tߋE9u֋U1^U VW1U r4t!EPVu t}uv4ۉ_^UUBE UZ]9u uYYt1UVW}Ur4t"F _ 9~u VYYtv49}u1_^UVW}u W*YYEu6_] @ffO BPuc1YYEG$UfR fW UR$W$E_^U VW} U r4hV4UE9NUrvBYYt:V4W49uu1}uUR4V4Ur4UR(V(Ur(F4u_^UVfEutF ]f]v(E^UVWfEUUUr4t*VYfE]M9~ fUfU}uv4Uu E W4E E8_^UVWfE+ǍEPEPuj }UBE@fEPEPh E]PS0YY])f]uY]9~.UMR4Q4UO4J4UW4E]f]UU UUz4tR4UUMR4Q4UO4J4WBYY_^U VWEU z4t'tU9u}t1Ev(4ո_^UVu U9V4tv4^UVW}fEU fR fW U R$W$uu YYEU R4W4U B4Uz4U W(W(Uu t6V(U9uF ]f]UEVUXYV(UufUfW _^UVWUr4aV4ULu7YYt7W,Ut-B ~%EPVu tuVu (묋u_^UVWEUP4E PWu ƅt uWV EPWuVW&YuWYYW4EUR4EWEUfB=UfMfJ0E UfBUfM fJUB.FkGZ_^UUJIUUE rPYYUu EPYYUB=uUufEUB]9uEPuwYYt1UVW}t5t*EPVpYYtu 6wYYt v(ҋ41_^UVWu}U 9zurW2WV>t6?trWY_^UVWEUUuYEE}|kE <U<G=u2]u *Y.jY"jtYfWfV G9-E0FUVuuEzE_^UVWu} Ju*F$9F$uGF$fG 'GV$W v$WYYEPuW _^UVW}1jYƋWV -jYƋWV w)YG$f,G_ Q9Pu1ZF_^UVu )YE9PuqeF^UVW1Urt8F ,6_^UVWu E0UVuYDžuURUMJUBUUz>tr_^UVW}hYv YE}tBu YEZPv$SYYP6rYPH vuO YYE븋v(럋4_^U VWURzUu t/FZh'PSv$(EUz}v4̓}tUUz_^UVWUzQwtEU~u5jv 'YY= u"jv |'YYEt}u WV)YYu뷋 _^UVWfEUzwU~u@jv 'YY=u-V :t%jv &YY='tV BVYt%EPVu O Et uVW| E@fEul Yu Yu ueYYuY_^U VW} t?t4U~3t$JuUM9JuMfRf v(ȋ41_^UVUr~9ڍEPu R t!UPVhXF E)؉ËUr^U VWUz1Y9}1EPu V/ tUPVh E9u UjPhx UB_^UVjYƋUU V^UUuE=~ EUVW}4YƋEF_^UVWuV׃u v 1YVOY_^UVU4$RYƋEfF^UVWut3>v+Yv YF:'VNY_^UVWut >VNY_^UVWut~V~NY_^UUrYUrhYuRNYUE@PYUu0NYUEHPdYUu NYUE@PCYUuMYUUR#YUV1U tFuMY^UVW}jWKYYƅu hY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5hhl& =t5hhK& hh9&YYu uh'& hh&YYFj+GYU=Dt8hh%YYuu uh%hh%YYUVhHu YYhPhDV% hLh@V% L9PtP9Lt h(YVU YV!Y^U(VWu EE U9UaU<G<-t@hY3E:E4GuW/YY&HDWUY La E듀}td1fTvAYvYU}7Qhv YYEhvYYEhvYYEhv |YYE:jhEPEPEPuu hUuuuujj1븋MJ5UYuuj5j5You Yu Yu Yu YhvYYEP5YYhvYYEju5] _^UUU=Htu uhh"U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVV`EYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVDY܉ՋUUE _^UVWut~VDY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y@fff^UB@fBCfUVWHz}5^!Y ǡHz}5.!Y Ɓ| _^UVWHz}5 Y ơHz}5 Y  ơHz}5v Y i ơHz}5@ Y ǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$XY]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhuYYuuhYY0fSYfEE}fEE9J tuhEYYj,Yf4Hz}5Y F F `lfFFFUt?jYFV6VfBjhYF V fdF7(E@fE5wYE_^U VW1UUEEEh uYYuuhYYfS)YHz}5Y EJ joY]ƍVUVUVUfHz}5pY FWFfFHz}5+Y F jY]ǍWUw rfG_tNJVKY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYUu u YYEuuh,YYE+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇtPXP0U$UUEEEEEEPjj UVuU VVu 0YYEtF~}Vډ\F^UVuV u\ ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u hX%UJ u\ uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrThP5)O}E_^UVW=uhwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿh>t 6+V~ WY_^UhXYUMZUVEPu y6YYEu1xƅthuuR0 E}fF ̋EfFEfF vF$[F,\F(Q\F \Et jjVC ^UUURu ub EUUURu u EU VWEh%wWUV tVUY ETM}?u׋E_^UVuV4;YuNSX^UVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S 0 ^UVuFuu PM. E=u^ fF F fF UVPE^UUBP7-YUVu ~u F1Vu`5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQG,YYt5uu5@5<"}E-E0 EuuA,YYtE, E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE M@ExUURUuE }|4uju% t+EE9EU܉Uu7&YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!UR$YELDEd+UU1}=UM E\EUUUU}tE U@tEU9U~EEEU0U+UU=tFEE}|EPu YYdm}tUVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5 5 t1uu5 5 }MmE}tW9U$vFMF0}uUt F.1uu5 5 K$}EPuu5 5 _YY EUuujj Z0Fuu5 5 tMkuu5 5 tMEPuu5 5 YY\ EUuujj Z0Fuu5 5 BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF  ES+U _^UVWu u58 54 t'EPu u5@ 5< YY\ E-0PjVEEu}uu5H 5D K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUt/~V%Y7 tENу}%u!1EEEUL ~V.%Y 9MNE]M벃M묃M릃Mk E-0둃MEEԤE QEEԤE7MEE EEE E MMEE EMEEuPYYEM EM EMEE ElU'tEUURfUtUURM܉ LEM~Vh#YU  EN~V-#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrRp8E܉EEuUtRE ʀ:t*ENJt~V3"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E uENJt~VU!Yt뫋UURUU u*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU Md Z}uEMEt e?oe?cUUEUUE=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VXYu OpU€nEt&v9UUUVPbYYڋUU Met }EtVu;YYUU MVu!YYUUvPYhlUtUURlJ!lhF YUURY EF( E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUSH XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=u[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP= jEP j_PjjjIPjD(UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃=tuY_^U$VW=kFǣj YƉI!)ى}=tW Y=u1%EE95wU9UwEE#UUUUtEU9UwU4օUѺU~W9~5}EU5EV Y=tU<4 U։MU4օU 4UVF_^UVWutVր:uV׍4׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5uYYƅ}NU9vm U}tFt*N9~  ֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E49} t9uuEG6uEE}|и_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE\" }t]} t}tFE] E_^U VWuEFu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEt0%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E\" }t]} t}tFE] E_^=+CC [ {sƉ=kC{Sck[SkÃ=g{SK k{uC [ SkC [=C[=_1C CtrIAÃ=C s[ =CK [ =SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~\M E 1U} |} ~\M ҋE!1UE1UE1U} |} ~\M Et1U(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj4 U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjn E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJ< UUtuuUJ4 EEEEEPj0jF E؅}UJ< EUJ4 }u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U h l Zu u4)UUM] Z5t 5p UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1Ex | UM UMEEuFuFE=-u Ej}+tdNaEt`uu55}6U0Rje5 5 uuYYYYEEGFEu}.l_Et^uu55}5U0Rj5 5 uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNEtk] -0؉EFEuۃ}}]}}}EE9} s7t"EuuyYYEEEEuÅ~;} tUԋE \"}}5RPR$RPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZ EE8EE@#EE@\1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uV|YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(Q\u^ fF FLF fF uGYEu^ fF 5MZF fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=ujuFV t V uYV u \ V t)VLYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U塸  U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjja U$UUU UUUEEEEPjhj" Uu &UBUM JUju RUVWuEVU}u>u Fn}|\"RPS\"5 5 0}ua UMQRQRZYYZYUMQRQRGYYZYUMQRu u0YYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuucYYZYUM QR5 5 u \"u uXZ_^u被`=}a荫aUVWME_^]} 0)ʇʋu }%hd %hd %hd%d%d %d%d%d%d%hd%hd%hd%hd%%RA%sdouble constantconstantaddr. of procedureaddr. of externaladdr. of locallocal variablefloatpointerloopanyEND PROCEDURE %d } (%d,%d) lifetime = {#usages = %d size = %d regtype = %s offset = %ld id of external = %d itemtype = %s BEGIN PROCEDURE %d J  , regnr = %d dummy local = %ld profits = %d } (%d,%d) busy = {} (%d,%d) timespan = {isloop = %d #inits = %d #usages(dyn) = %d #usages(static) = %d offset = %ld] id = %d] id = %d] item: [type = %s, BEGIN ALLOCLIST of proc %d #%s = %d #%s = %d STATISTICS  &  ; ^ f 4 N  f222<F8B]tG_FSpx`h''''g'U''t'1))%) *))****local %d removed from proc %d all formals of procedure %d removed formal %d removed from proc %d R/./9/9/9/out of memory : file %serror on line %u optimization: illegal pointer size%d%drC6CW6M#6Q16S6T6V:6wwwwrrillegal argument%s: %d unexpected eof %scannot open %sr>>??cannot open %sr@@A A%A?A]A]A]AC5BCBPBuBBB}C-C8CCCCms_opt encounteredms_err encounteredFFFFFFFFFK-K:KEKRK]KhKSSSoffset expectedtoo few parameterscannot open %sccccd X^dd^dddddd^^d^^dg_p_p_p_p_p_p_p_p_p_dddddddddd_1`d1`dddd_ddwadddddJbddbdddddddddd__1`1`1`__dd_d7a{aaddadNbddbbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@eoEjG5mejfig5m$@@Ts"Js%q*q0q1q2q3q4q5q6q7q8q9qDqErFrLqO6rXnr[rcrdrerfrgrhqirlqnso:rprsruTrxrrv+Mvvvvv2vgvgvgvgvgvgvgvwvwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvx+$x-$x.6x0x1x2x3x4x5x6x7x8x9xEHxeHx4qsitIuuw`zy-/z]\z?$@$@^aIrw4@@t`TD     AVHHVVHhVHpVpA4hA'h}hI?VI?::99MMEVV< 2SSSSLl\[Q\\\[Q\\ \[Q\\`l 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe  |T1$T$L s=SSSSu QRPPcRUdVuN} V1Y SX= uEPhV%1 hEP,YYuhhV0 ^UUB U Z ÉU fB uuu"YYU VWURUE1uiU~u~u F L}tA~Xu F )؉/EPEPEPVz$}t +Uׅ}E}u돀}^u==tQUJuEUrY2|uu!YYF 9u|uVu uE}_^UVW1UrtC~Xu F )؉1EPEPEPV#}t +Uׅ}1}61_^UVWUr dYDžt;WjYVuF fFVYUr W0YY_^UVUrt0Vu"V(YuF fFVrYv ^UVUB @uuYUrt VYv ^UhhPhhu u5|hYYj]OYUVhPug)YYhT hLV/. hP hHV. P 9T tT 9P t h0M(YVU YVQ*Y^U(VWu EE U9UaU<G<-t@h'Y3E:E4GuW/YY&L WUY T(E듀}td1fX vAYvYU}Qhv *(YYEhv(YYEhv(YYEhv 'YYE:jhEPEPEPuu hUuuuujj1븋MJ5UYuuj5j5You(Yu(Yu(Yuy(Yhv#'YYEP5YYhv'YYEju5] _^UUU=L tu uhhts+U1UVWu }t9>uv1_^UVE 0uYYujh!YƋUE VE 0^U VWE U}7tU9uVVMYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVqMY܉ՋUUE _^UVWut~VAMY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$ Y<@f<f<f^UB@fB@Cf@@UVW8H8z}58)Y 8ǡ8H8z}58)Y 8Ɓ| _^UVW8H8z}58S)Y 8ơ8H8z}58#)Y 8 ơ8H8z}58(Y 8i ơ8H8z}58(Y 8ǁ|i _^UUE0<u)j'Y]0]0fMf E0UUu1FE4<u)j$Y]4]4fMf E4UEEtEPuUYPYY܋EUVP}YfEH]9|]V]Cf]׉^UVWhu!&YY8uuh%!YY0f  S9Y(fEE}fEE 98J tuh YYj,~Yf(48H8z}58&Y 8F F `lfFFFUt?jYFV6VfBjYF V fdF7(E@fE58!YE_^U VW1UUEEEhu$YY8uuhYYfSY,8H8z}58Z%Y 8E8J jY]ƍVUVUVUf8H8z}58$Y 8FWFfF8H8z}58$Y 8F j@Y]ǍWUw rfG_,tNJVY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYUVWfE1URUu1UBEUJfM]~ ]~1Uzu'UfR fUE9T ~ T fUEEE<\ ?0u1?G] 95T T 5P }u {Eh}tUzEuUzu UB EF}tUzEuUzu UB sG4_^Uj-uYYfEj+usYYfE]t]t1U ]EE]UVW}4xYƋEF_^UVWuV׃u v 1YV.Y_^UVU4RYƋEfF^UVWut3>v+Yv YF0:V-Y_^UVWut >V-Y_^UVWut~V~-Y_^UUrYUrhYuR-YUE@PYUu0-YUEHPdYUu -YUE@PCYUu,YUUR#YUV1U tFu,Y^UVW}jW*YYƅu hLY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5hphtl =t5hdhtK h`ht9YYu uht' h\htYY%j+&YU=t8hhtYYuu uhthhtYYUu u YYEuuhYYE+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇtPXP0U$UUEEEEEEPjj UVuU VVu 0YYEtF~}VډF^UVuV u ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u h.%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrThP5)O}E_^UVW=LuwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ>t 6+V~ WY_^Uh.YUH0LUVEPu y6YYEu1xƅthuuR0 E}fF ̋EfFEfF vF$<2F,{2F(2F 3Et jjVC ^UUURu ub EUUURu u EU VWE%wWUV tVUY ETM}?u׋E_^UVuV4;YuNSX^UVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S 0 ^UVuFuu PM. E=u^ fF F fF UVPE^UUBP7-YUVu ~u F1Vu`5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQG,YYt5uu55"}E-EEuuA,YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE|}|4uju% t+EE9EU܉Uu7&YEMUutUU#J UUBEEZEhETUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!8UR$YELEd+UU1}=UM EEUUUU}tE U@tEU9U~EEEU0U+UU=FEE}|EPu YYdm}UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu54 50 t1uu5< 58 }MmE}tW9U$vFMF0}uUt F.1uu5D 5@ K$}EPuu5L 5H _YY EUuujj Z0Fuu5T 5P tMkuu5\ 5X tMEPuu5d 5` YY\ EUuujj Z0Fuu5l 5h BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF p ES+U _^UVWu u5 5 t'EPu u5 5 YY\ E-0PjVEEu}uu5 5 K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUU%t/~V%Y7 %tENу}%u!1EEEU ~V.%Y 9MNE]M벃M묃M릃Mk E-0둃MEEVE QEEVE7MEEԔWEEEԔWE MMEEԔWEMEEuPYYEM EM EMEEԔWElU'tEUURfUtUURM܉ LE%M~Vh#YU  %EN~V-#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrRp8E܉EEuUtRE ʀ:t*ENJt~V3"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E %uENJt~VU!Yt뫋UURUU %u*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU M Z}uEMEt e?oe?cUUEUUE=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VXYu OpU€nEt&v9UUUVPbYYڋUU Met }EtVu;YYUU MVu!YYUUvPYhlUtUURlJ!lhF YUURY EF E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUS XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=Lu[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP= jEP j_PjjjIPjD(UVUU U RxYƅt u V YY^UuYUVW5PVUT>M}}6u݃=HtHuY_^U$VW=kFǣj YƉI!)ى}=tW Y=u1%EE95wU9UwEE#UUUUtEU9UwUlօUѺU~W9~5}EU5EV Y=tUxt>XuFǃE}u0u E}tE1uUE1uEEE%t0%%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE" }t]} t}tFE] E_^U VWuEF%u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEE%t0%%UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E" }t]} t}tFE] E_^=+CC [ {sƉ=kC{Sck[SkÃ=g{SK k{uC [ SkC [=C[=_1C CtrIAÃ=C s[ =CK [ =SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~M E 1U} |} ~M ҋE!1UE1UE1U} |} ~M Et1U(UUEEEEEEPjj E=u Ux1UVW5xx}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj4 U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjn E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJuFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z5 5 UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E UM UMEEuF%uFE=-u Ej}+tdNaE%t`uu5,5(}6U0Rje5 5 uuYYYYEEGFEu}.l_E%t^uu5,5(}5U0Rj5 5 uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNE%tk] -0؉EFEuۃ}}]}}}EE9} s7t"E40uuyYYEEEEuÅ~;} tUԋE "}}5RPR$RPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZ EE8EE@#EE@1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uV|YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(2u^ fF FLF fF uGYEu^ fF 5H0F fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=LujuFV t V uYV u  V t)VLYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]PPXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U$ ( U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjja U$UUU UUUEEEEPjhj" Uu &UBUM JUju RUVWuEVU}u>u Fn}|"RPS"50 5, 0}ua4 8 UMQRQRZYYZYUMQRQRGYYZYUMQRu u0YYEE VUUׁM~!#N щNW@ׁ#N щN< @ UMQRQRYYZYUMQRQRYYEEu uuucYYZYUM QR5H 5D u "u uXZ_^ u被`=}a荫aUVWME_^]} 0)ʇʋu }%d%%SP%sstack adjustments deletedillegal pointer size%d%dr?CSMQ-STV6wwwwrrillegal argument%s: %d unexpected eof %scannot open %sr  cannot open %sr!;YYY1?Lqy)4?ms_opt encounteredms_err encountered})6ANYd!!!offset expectedtoo few parameters0+a0-w-w-w-w-w+a-w-a-a+a-w+?-w+w-w+w-w+w-w+w-w+w-w+w-a-p-x-p-w-p-a-p-w-w-w-a+a-w-a+a-w-a+a-w-a+a-w-w-p-p+p+p-w+a-d-p-d-d-a-a+a-p-p+a-a-a+a-a-a+a-p-a-p-?-?-w-a+a-w-a+a-a-a+a-a-a+a-a-?-p-a+a0-a+a-a+a-?+?-a-a+a-a-a+a-a-a+a+p+p+p-p+p-a-p+x+p+w-p+a-p+w+w+w00+w+w+a+d-p+d+d+d-p-a-p+?+p+p-a-a+a-w-a+w00-w+w-p-?0-a-a+a+a-a+a+w-a-a+a+a-a-a+a-a-a+a-a-a+a-a-x+x+x-a+a+a00-w+w-p+p-w-w-y+x-w-w-y+x-w-w-y+x-p-a-p-a-a-a+a-a-a+w-a-a+w-p-p+w-a-a+w-a-a+w-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x0-p0-w-w-w-w-a-p-p-p-p-w-w-w-w-w-w-w-w-a-x-a-a-a+a-a-a+a-a-p+p-p+p-a-a+a-a-a+a-p-a-p+p%?%a6%d%p+%w%xQ%y{%&&&&&out of memory : file %serror on line %u optimization: cannot open %sK:9:!:z: X15z:z:=5z:z:z:z:z:z:C5_5z:Y5e5z:5555555555z:z:z:z:z:z:z:z:z:z:Z66z:6z:z:z:z:6z:z:7z:z:z:z:z:8z:z:8z:z:z:z:z:z:z:z:z:z:06^66666^6z:z:'6z:77,8z:z:Y8z:8z:z:9bug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@EE'AGCe'Af@gC$@@I"I%H*KH0cH1cH2cH3cH4cH5cH6cH7cH8cH9cHDrHEIFILWHOHXH[#IcGIdvHe If Ig Ih]HiHlQHnuIoHpWIsIuHxHiM+MMiMMiMiMLLLLLLLLLLiMiMiMiMiMiMiMMMMMMMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMMiMiMiMiMiMiMiMiMMMMMMMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMiMM O+N-N.N0N1N2N3N4N5N6N7N8N9NENeNG2JJKjLSNPhP-P]P?$@$@gagrgwg@@2|tld`\XL@4(xph\THD<40,$|tph`XPH@<0(  xph`\XTPLHD@<84 SSSS3<22{2 3<22{2 t3<22{2 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe  |(1$T$L 8 (s= SSSSu QRP4PhUdVuN} VHY SX= uEPhVG hEPTCYYuh<h VjG h@hVWG hDhVDG ^UVu YƅtV YPiYuV YYu Y^UEPEPu u2!Y~uuum uYu YUVWUrt5v YDžt!W& Yp VYYvW YYۋv _^UVWE1UrYE}t;uYNjW zuG9E~ GEUruYYE뿅tVYV B_^UVURrt/v+ Y=uvJYPVYU9Bu1^UVWUr!YDžtKW'YjYF VYV BV ztr;YV B UrWYY_^UVWUrYƅt$VYw gYUrVYY_^UVuF @uVHYV;YV|YVY^Uh hPhh u uF5Hh`YYjeYUVu8YPc;Yu1Du Yƅt0VYP8YPu8YZ9u1u VYY̸^UVum1tj 9 uu VfYYt1? 9 uu V9YYt110F/?^UVu Mtt6^UVWUz9u.UR z uwjYYƅt VuF_^UVu>t6U ^UV5YƅtG5VYYEuJ7YPVYP;7YZ9uhVxYPYYu^UV5EYƅt6u6YPVAYP6YZ9u5VYY1^Uhu|YYUhuhYYUuYuYUV5Yƅt3VYPf6YPu\6YZ9u15VYYɸ^UVuV+6YP8Yt2VYu U Ju VbYVpYtV&Y^UVWukUR 2YDžaWYEpt<(uVbYY)V5YP8YtVYXF<6UR 2WYY뗋E E_^U VWUzIuMu5YE5KYƅt/VQYNjU9u =5V#YY1_^UVWu} ~F 9 E8~F 9 ڋE~~rF 9 bڋETE8HAVYt =)5V!YYtF";1_^U VWu}E u]S]SPvtUEM1E u]S]SPvaUr} t }u1E ] uEPEPSVYt&UE} t}t1F1BE03} tE01EPuV 9_^UUU jEPEPjut+}t%UEEE1UUzuUB 9 u1E/;}t1'}t1UB091U}t(UzIuu1YPu 1YZ9u1UVW}j YƀuG G ~U VhVIYY_^UU$B8UVWUzwWY=u*uV3YYWYPuQYYuY=u,uVYYtVzEuVB PuYYAW]Y=~0~Eu*uvYYtWY^ PuYY_^UVW EPEPuv u^Y~LuYDžt=WYƀ~6t~)uVYPV_YYVYuWJYY뿍EPuMYYE UE_^U 1UlB(6UVWu uYUPr$uY0ƋURzr7~_^UVW} ;W/YFIt6URRUUR U}uURzG E8UW}tUrUUR _^UVWu }u F&U7~}t>t6UUr_^UVWUr 6u .Y@q3u .Y@q"Fju d YYFP5rEz ?tzu1zu+UEI Irq,YY]R RB+zuUrqYYUr7YY>t67_^UVWuj YE UfB v,^-YFVBP-YE@EUBu -YGIu -YE@qjv,-YZN^YRy-YE@EUBu b-YGIu S-YE@qWEv,YVNJP#-YE@ju YYju YYE F(3}t uWYYuWYYuWYYVRUE8tEEMJE8UW_^UVUrtUVI YuuzZY^UVWu} WN91W 19V u@V+YPW+YZ19uC 9 u*V{+YPWs+YZ9uuVYYt1S 9 u*V:+YPW2+YZ9uuV?YYt11TF52_^UVW}uVO9t61^~u G ^ 9t+1E~uV 9W t131/G|19} u 19uu@9uu1?6_^UVWu }V(9W(u7w,Y*YPv,O*YZ9uvvww?t1q~(t ~(;t~(^uIvvwwt1uv,w, tuvw t1G(0_^UVW5Yƅt2VYu Wu t5VYY1_^U VWLRUUR Rz yUR rL+Yƀ~t&jCYNjURRfR fW G>wUR MI 9Jt UR Uu*YEPUUr_^UVWuu VYYEtp VYYPVhYYVnYh6fYv$5L(YYlj~ 5LVjWWVYYPVYYWVYYWVYYhV YY6Y_^UVW=<tUJUzEPEPEPuu W t*URzEuj0YƋWV,~URVHEEPEPEPuu w~j0JYƉ~,WVUVUVUUVUV UVUV V$UJN(ULPSh HuV?YY_^UVW=<tUJUzEW&Y9DEPEPEPuu w~j0_YƉ~,WVUVUVUUVUV UVUV V$UJN(ULPSh HuVTYY_^UVW=@tUJUzuWUYYUztWY9 EPEPEPuu wURUuuYY~j0DYƋUVUUVUVUV UVWVUV V$UJN(~,ULPSh HuV9YY_^UV5 Yƅt V YPYSY5V YY5Q Y^U VW1 UR 2 YDžW YEp|U~eF 9 UEVuuu uCw_^UVWUR z(ƋURU|FtF Ur YE}Ur uYYEuYNjUR 2W3YYuBU RW{YYGPumYYGPV+YYF PWYYWuV UUwUR NJ U RVYYFPuYYLz t w uuV URVUrUR r_^UVW}4 YƋEF_^UVWuV׃u v 1YVOY_^UVU4 RYƋEfF^UVWut3>v+Yv YFx:'VNY_^UVWut >VNY_^UVWut~V~NY_^UUrYUrhYuRNYUE@PYUu0NYUEHPdYUu NYUE@PCYUuMYUUR#YUV1U tFuMY^UVW}jWKYYƅu hY_^U5Phh x* =Tt5Thh W* hh E*YYu uh 3* hh !*YYJj7KYU= t8hh )YYuu uh )hh )YYUVhu$YYh hV) h hV)  9 t 9 t hYVU YV%Y^U(VWu EPE U9UaU<G<-t@hTY3E:E4GuW/YY&  WUY m$E듀}td1f vAYXvY`U} QhPv #YYEhLv#YYEhHv#YYEhDv #YYE:\jhLEPEPEPuu iklmnopqrstuvwxyz{|}~hUuuuujj1븋LMJ5LUYuuj5Lj5\Y\ou($Yu$Yu$Yu $Yh@v"YYEP5`YYh<v"YYEju5X] _^UUU= tu uhhh 'U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVVlIYދUE _^UEUUBUEU VWE U}7t%u6$YYtVVIY܉ՋUUE _^UVWut~VHY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y@fff^ULB@LfBCfUVWHz}5j%Y ǡHz}5:%Y Ɓ| _^UVWHz}5$Y ơHz}5$Y  ơHz}5$Y i ơHz}5L$Y ǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$dY]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhu!YYuuhYY0fddSYfEE}fEEd9J tuhtEYYj,Yf4Hz}5"Y F F `lfFFFUt?jYFV6VfBjtYF V fdF7(E@fE5YE_^U VW1UUEEEhu YYuuhYYfhhS5YHz}5 Y EJ j{Y]ƍVUVUVUfHz}5| Y FWFfFHz}57 Y F jY]ǍWUw rfG_tNJVWY^UVuU VE E 0>tr^UVUru1 >t6^UVW5\Yƅt0VYjw YY9Eu5\VYY1_^UuY1ۅÉUuYEu p bYYUVEH@PYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEUu u YYEuuhYYE+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇLtPXP0U$UUEEEEEEPjj UVuU VVu 0YYEtF~}Vډ F^UVuV u ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u hiE%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrTh`P5)O}E_^UVW=u wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ >t 6+V~ WY_^UhiEYU-GUVEPu y6YYEu1xƅthuuR0 E}fF ̋EfFEfF vF$HF,HF(1IF IEt jjVC ^UUURu ub EUUURu u EU VWE %wWUV tVUY ETM}?u׋E_^UVuV4;YuNSX^UVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S 0 ^UVuFuu PM. E=u^ fF F fF UVPE^UUBP7-YUVu ~u F1Vu`5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQG,YYt5uu55"}E-EEuuA,YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju% t+EE9EU܉Uu7&YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!UR$YELEd+UU1}=UM EEUUUU}tE U@tEU9U~EEEU0U+UU=FEE}|EPu YYdm}UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55|t1uu55}MmE}tW9U$vFMF0}uUt F.1uu55K$}EPuu55_YY EUuujj Z0Fuu55tMkuu55tMEPuu55YY\ EUuujj Z0Fuu55BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF ES+U _^UVWu u55t'EPu u55YY\ E-0PjVEEu}uu5 5K~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUUUt/~V%Y7 UtENу}%u!1EEEU ~V.%Y 9MNE]M벃M묃M릃Mk E-0둃MEEԄlE QEEԄlE7MEEnEEEnE MMEEnEMEEuPYYEM EM EMEEnElU'tEUURfUtUURM܉ LEUM~Vh#YU  UEN~V-#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrRp8E܉EEuUtRE ʀ:t*ENJt~V3"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E UuENJt~VU!Yt뫋UURUU Uu*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU M Z}uEMEt e?oe?cUU$EUU$E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M` e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VXYu OpU€nEt&v9UUUVPbYYڋUU Met }EtVu;YYUU MVu!YYUUvPYhlUtUURlJ!lhF YUURY EF E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUS XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV=u[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP= jEP j_PjjjIPjD(UVUU U RxYƅt u V YY^UuYUVW5VUT>M}}6u݃=tuY_^U$VW=,kFǣ,j YƉI!)ى}=,tW Y=u1%EE95,wU0,9UwEE#,U0UUUtEU9UwUօUѺU~W9,~5,}EU5,EV Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5HuYYƅ}NU9,vm ,U}tFt*N9,~  ,֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^U VWuEFUu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEUt0%UUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^U VWuEFUu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEEUt0%UUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}E " }t]} t}tFE] E_^=4+CC [ {sƉ=4kC{Sck[SkÃ=4g{SK k{uC [ SkC [=4C[=4_1C CtrIAÃ=4C s[ =4CK [ =4SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1U(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj4 U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjn E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJ<UUtuuUJ4EEEEEPj0jF E؅}UJ<EUJ4}u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U $ Zu u4)UUM] Z5, 5( UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E0 4 UM8 < UMEEuFUuFE=-u Ej}+tdNaEUt`uu5\5X}6U0Rje5D 5@ uuYYYYEEGFEu}.l_EUt^uu5\5X}5U0Rj5L 5H uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNEUtk] -0؉EFEuۃ}}]}}}EE9} s7t"Ed`uuyYYEEEEuÅ~;} tUԋE  "}}5RPR$RPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZP EE8EE@#EE@ 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uV|YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(1Iu^ fF FLF fF uGYEu^ fF 5-GF fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV=ujuFV t V uYV u  V t)VLYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=4K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]Up t U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjja U$UUU UUUEEEEPjhj" Uu &UBUM JUju RUVWuEVU}u>u Fn}| "RPS "5| 5x 0}ua UMQRQRZYYZYUMQRQRGYYZYUMQRu u0YYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuucYYZYUM QR5 5 u  "u uXZ_^Pu被`=}a荫aUVWME_^]} 0)ʇʋu }%d%d%d%%SR%sstrength reductionsW9:?*I)6qv '$4$E0I7U`bx T c h / / '( 4( `C bC    ' ) 4 6 ` b Q R j k 9  ; Q R ^ j k H*;&QR^&jk;QR^jGkGQ9:?I@;@QR^@jksr: multiply in proc %d loop %dsr: leftshift in proc %d loop %dsr: array in proc %d loop %dmH;HQ1R1^Hjk2out of memory : file %serror on line %u optimization: illegal pointer size%d%drC+MQSTVwwwwrrillegal argument%s: %d unexpected eof %scannot open %srs''c((cannot open %sru)))))*1*1*1*+ ++$+I+c++Q,, ,,+ms_opt encounteredms_err encountered/a/l/y//////U4444&414<4<e<n<offset expectedtoo few parameterscannot open %sPOmPPP XKPPKPPPPPPKKPKKPGLPLPLPLPLPLPLPLPLPLPPPPPPPPPPLMPMPPPPLPPWNPPPPP*OPPhOPPPPPPPPPPLLMMMLLPPLPN[NNPPNP.OPPqObug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@E\EWGZeWfpVgZ$@@4`"*`%^*^0^1^2^3^4^5^6^7^8^9^D^Es_Fs_L^O_XN_[_c_d^ew_fw_gw_h^i^l^n_o_p_s_u4_xR_c+MzcczccccGcGcGcGcGcGcGcWcWccccccccrcrcrcrcrcrcccccccccccccccccccccccccccrcrcrcrcrcrcccccccccccccccccccwe+e-e.e0d1d2d3d4d5d6d7d8d9dE(ee(e^`Ia)bbd@gf-g]~a)~r}w~@@ 2SSSS IH1IHP IH1IH  IH1IH  0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe(  1$T$L P s=P SSSSu P QRPZP_lUVWEPhu?K uY19u~'DPDPPhu KFԉ_^UdVuN} VPKY SX= uEPhVJ hEPFYYuVQYVEY^U$-} |} }1E EUVuu PYYt}tFF^UVufEE9VERPDYYE@fEfEE99E:|VEÃRSYYE@fE븋VN Rq@YYVN RqvYYVN R1YY^UVu Yup"Yƅt&u Vs"YPr kYYuVQ"YY^U VW}PYEwt@PYVBSYVB VN R1sYYv wYE}EWr tEPv 'YYVruYYPEVRuYYVN RqYYVN Rq0YYVN R1[YYv 끋wtVrYVr Yv uY_^Ujj5v Pjj5` P1=YYUju5= Pju5& P<YYUVWu Uzu6~t&oPV6;YPYZ9|1EPEPu;YP@ EYfVYfVYV YVY^UVWP5YY=9r 7hYP5YY59r 6tYP5YY_^U VW}WP YEPu W ƅVXYbEu WPVvWYYzu vW} jPhP< GEPVYYt5uu W jPh4 1_^UVWE}t5EUrt~tUVWYYtE}v P5IYYP5|YY_^UVUrtj$YFv ^UVUraV2YVrYVrYVrYVrYVrwYVr kYv?fYv ^UVuF @uFVVYVYV7YVYV=Y^Uh#hhKh Fu u5h2YY5hp YYjcYU 1UB>U 1UB=UVWfEUzt;wt/VYt EPEPV< }t E@fE6͋ fUfP)YSYfEE9&PY]]Cf]fEUzPzYWB wmVYZEPEPV?; }tCWE RPYYE4E]PSoYYE@fE6닋 d_^UEPY]SYfEE9-EhP YYEhPYYE@fEfEE9;EJuEhSYYE@fEU57Y5+YUVWuE 9wfU fUE9&~uV B]9u1~t*V3Y] )ً9u1`E )ۋ<~uuV 9W u1&tWA3YPV93YZ9u1_^UVE 0VYfEUtQEVPYYfE]S2YPuYYtEu PYPhYYfUfU^UVUR2VYfEUtKE5PYZJfMtEu PYYEVPOYYfE^UV7Ur F tu VuYYVJu%3u 5YYYULBV9u 56YY^U VWfEPYUzPYWwqVYt wVCYYUVYtJE9;E94u,wV*YYEwSYYE@fE6뇋 a_^UE4YfEUnEP+YfEU R] 2Q YYuU REÃRSYYE]4SYYfE놋U RERP YYUVUreP@ YVBVr %YfEUt4EPdYfE]VSYYVEr P YYfEċv ^U 1U`BW7UVWH fU11EH fEUru1rH fU=F ]9|1L1REH fEE]9u VA/Y#1)F6UB6E 8_^UVu~FUzu=V B t4V B u+V RJuV RMI A2P YY6Uzt!E )ۋJu1^UVUr]VYtVu YYt UE0v+Yv YFl+VSY_^UVWut >VSY_^UVWut~VRY_^UUrYUrhYuRYUE@PYUuRYUEHPdYUumRYUE@PCYUuLRYUUR#YUV1U tFuRY^UVW}jWOYYƅu hY_^UVEH@PIYfUf^UEHfE]KٺUU EM u1U VE UEHfE]KٺUUE֋M ^U VE UEHfE]KٺUUE֋M# ^UujYYUE@fEU ]9|$Eu PYYtE E@fE1UEUVE UUHfEfEE]9+UE֋ME E@fE^UVE UUHfEfEE]9+UE֋ME # E@fE^UUH@PuNYYUU u JfEUH]9|-U EҋMEt1E@fEUVE0fEH]9|EVE@fE^UE UfEUH]9|"EM]E@fEUVE UfEUH]9|-UE֋ME # E@fE^UfEUH]9|(EM ] 9 t1E@fEƸUfEfEU]9|'EuP9YYt E@fEE@fEEU5hh * =t5hh * hh *YYu uh * hh y*YYKjKYU=< t8hh M*YYuu uh 8*hh &*YYUVhuS%YYhH hV* hD hV* D 9H tH 9D t hYVU YV=&Y^U(VWu EE U9UaU<G<-t@hHY3E:E4GuW/YY&@ < WUY $E듀}td1fL vAYvYU}#QhDv $YYEh@v$YYEh<v#YYEh8v #YYE:jhEPEPEPuu hUuuuujj1븋MJ5UYuuj5j5You$Yuw$Yun$Yue$Yh4v#YYEP5YYh0v"YYEju5] _^UUU=@ tu uh\h _'U1UVWu }t9>uv1_^UVE 0uYYujYƋUE VE 0^U VWE U}7tU9uVVIYދUE _^UEUUBUEU VWE U}7t%u6$YYtVV]IY܉ՋUUE _^UVWut~V-IY_^UVujYƅt)u VmYPYYu1uVHYYӸ^UVfEutE@fEvE^UVj$Y@fff^UB@fBCfUVW H z}5 %Y ǡ H z}5 %Y Ɓ| _^UVW H z}5 ?%Y ơ H z}5 %Y  ơ H z}5 $Y i ơ H z}5 $Y ǁ|i _^UUE<u)jY]]fMf EUUu1FE<u)j$XY]]fMf EUEEtEPuUYPYY܋EUVPYfEH]9|]V]Cf]׉^UVWhu "YY uuh|YY0fSYfEE}fEE9 J tuhhEYYj,Yf4 H z}5 v"Y F F `lfFFFUt?jYFV6VfBjhYF V fdF7(E@fE5 YE_^U VW1UUEEEhuu YY uuhYYfS)Y H z}5 F!Y E J joY]ƍVUVUVUf H z}5  Y FWFfF H z}5  Y F jY]ǍWUw rfG_tNJVKY^UVuU VE E 0>tr^UVUru1 >t6^UVW5Yƅt0VYjw YY9Eu5VYY1_^UuY1ۅÉUuYEu p bYYU VWUUE0JU9u1F] 9u%}hF fFUVMU9 V Uv jY]NjUfU fWw }tG fGUW_^UVUr jVYY=u9>t4jVYYPju jVYYPjVnYYP ^UVu3H fU5H fU'D fUu VnYY7Fx>tzVtEjju PVYP^U VWEEfEEURU}t%UztEPWAYY?UR UՋuu}tDU9}=F fFUJu*UZUfB]Kf] E@fEFE}t9E}UUuv fUfEPYfEut@V UVt V)Y#U@fE4F u_^UfEE9BEM9 .E9 uUU fMf E@fE뫋UUVWu18V Ju U[V M fRfUFF ~ F0uEPW5 U:tEËU f_^UVWEfE=Ewst~u fFWU9}+fF}t1UJt&UfBEHfEU@fEfVVU9U}Uuv녋kEHf_^Uu u YYEuuhLYYE+C;Cw Ë[ uӅu P-KI|;u[u P+1ۇ tPXP0U$UUEEEEEEPjj UVuU VVu 0YYEtF~}VډT F^UVuV uT ~V t VY1E~ tvV Y}EV €t v&Y~0tV@9V0t v0%YF0~DtvD%YFDfF E^U}u hH%UJ uT uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pc#YEu18u EUzUrThP5)O}E_^UVW= u` wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW6Ǿ` >t 6+V~ WY_^UhHYUJ UVEPu y6YYEu1xƅthuuR0 E}fF ̋EfFEfF vF$8LF,wLF(LF MEt jjVC ^UUURu ub EUUURu u EU VWE` %wWUV tVUY ETM}?u׋E_^UVuV4;YuNSX^UVuFuu P/ E|FPF %fF E^UVuV tFjjP. F %fF ^uu S 0 ^UVuFuu PM. E=u^ fF F fF UVPE^UUBP7-YUVu ~u F1Vu`5YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t Uzuu6Yt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQG,YYt5uu5`5\"}E-EPEuuA,YYtELE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE8M@ExUURUuE0}|4uju% t+EE9EU܉Uu7&YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!UR$YELdEd+UU1}=UM E|EUUUU}tE U@tEU9U~EEEU0U+UU=l FEE}|EPu YYdm}l UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55t1uu55}MmE}tW9U$vFMF0}uUt F.1uu55K$}EPuu55_YY EUuujj Z0Fuu55tMkuu55 tMEPuu55YY\ EUuujj Z0Fuu5 5BtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF $ES+U _^UVWu u5X5Tt'EPu u5`5\YY\ E-0PjVEEu}uu5h5dK~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWuU UEEEEEEUU t/~V%Y7 tENу}%u!1EEEUl~V.%Y 9MNE]M벃M묃M릃Mk E-0둃MEEpE QEEpE7MEEԐqEEEԐqE MMEEԐqEMEEuPYYEM EM EMEEԐqElU'tEUURfUtUURM܉ LE M~Vh#YU  EN~V-#YtuUtfDžpVU9s-p+U׋UV"Yt׃pupV)VUpUUUVWjrRp8E܉EEuUtRE ʀ:t*ENJt~V3"Yt΃}}wUURUU ʀ:t6N]EJt~V!YtċU9UmU+UUhUEUUuUt9E uENJt~VU!Yt뫋UURUU u*N]EJt~V!YtƋUU+UUE>Jׁ\v\GMvU M Z}uEMEt e?oe?cUU EUU E=eɃ} ~]U@tSe"EtDw9Uu9EeE]EN~ VYu O)U€t)v9UUUVP!YYwUJMxt}XuMVu YYUwUujvPUԃ pUtUUR>UtpUURfUuUURp EvM)MUJׁ\v\GMvU M e?HU@ge6EtXe$#Uu?#U@ʀUE]EN~ VXYu OpU€nEt&v9UUUVPbYYڋUU Met }EtVu;YYUU MVu!YYUUvPYhlUtUURlJ!lhF YUURY EFH E}E_^U VWu VFZ M^uEUFE1EUG|}uFi}+UUEUFЉUSh XU]t9}}-FEGU9}뻉}_^UVWu VVV t~uVaYtQUʉM+V9~ VYu1NUG9~tV t} u VhYuE_^UV= u[uV ufV u V t:~0tV@9V0t v0YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^UEP= jEP j_PjjjIPjD(UVUU U RxYƅt u V YY^UuYUVW5$VUT>M}}6u݃=tuY_^U$VW=|kFǣ|j YƉI!)ى}=|tW Y=u1%EE95|wU|9UwEE#|UUUUtEU9UwUօUѺU~W9|~5|}EU5|EV Y=tU< U։MUօU UVF_^UVWutVր:uV׍׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5 uYYƅ}NU9|vm |U}tFt*N9|~  |֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E9} t9uuEG6uEE}|и_^U VWuEF u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEE t0% UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tET " }t]} t}tFE] E_^U VWuEF u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E1uE1uUEE t0% UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}ET " }t]} t}tFE] E_^=+CC [ {sƉ=kC{Sck[SkÃ=g{SK k{uC [ SkC [=C[=_1C CtrIAÃ=C s[ =CK [ =SC[U}u}uUM UMQ}u} tEjEPEP} jEPEPk EPEPYYjEPEP" U jEPEP/ jE PEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~T M E 1U} |} ~T M ҋE!1UE1UE1U} |} ~T M Et1U(UUEEEEEEPjj E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj4 U$EEEEEEEPjj U$UUU UEEEEEPj%j U(UUUUU UEEEEPjjn E=uEU,VU @t=Uփ֋ruLYE܋U UuUUEEU UuEPYYEPjj ^U$UUUUU UEEEEPjj U(VWu UJ<(UUtuuUJ4(EEEEEPj0jF E؅}UJ<(EUJ4(}u_^U$UUUUU UEEEEPjj UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z5 5 UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu u YYXZ_^U0VWu1E UM UMEEuF uFE=-u Ej}+tdNaE t`uu55}6U0Rje5 5 uuYYYYEEGFEu}.l_E t^uu55}5U0Rj5 5 uu2YY+YYEEOFEu}Et}euQFE=-u E#}+tNE tk] -0؉EFEuۃ}}]}}}EE9} s7t"EuuyYYEEEEuÅ~;} tUԋE T "}}5RPR$RPx}}uuuuYYEEuuuuYYEEuuu EU} tVE }} uuuuXZ_^Uju&YYUUU VWuVFZ EE8EE@#EE@T 1)>+t >bu~+u EU UE _^UVWUU Uu~}FUU}VU9Uv>uW6U}׋U+UUVtƋU+U1u !uW6 V+UVUE_^U VWU RUu1"uV t~uV|YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6Wk V+UVUUUyV9v,U9Us$u6W3UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W UVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(Lu^ fF FLF fF uGYEu^ fF 5JF fF UVUV}tFP6YtF fF ^UUB % 1=uCt uY1UV= ujuFV t V uYV u T V t)VLYuF %fF FFF fF 2~0t,V@9V0t v0YF0V@ O}UEAV4URv0 YYEtEuPuw E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^=K C c[ U VWu} W WV VuWV~WV YY9zV9Ww 9WuHV9Wv@VEP>WV2U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFP}V7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE` UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVAt1f#V9Wv VVV+WVV+WVVY_^U`E]]P$Xa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}0ʀuA)_]U  U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjja U$UUU UUUEEEEPjhj" Uu &UBUM JUju RUVWuEVU}u>u Fn}|T "RPST "5 5 0}ua UMQRQRZYYZYUMQRQRGYYZYUMQRu u0YYEE VUUׁM~!#N щNW@ׁ#N щN UMQRQRYYZYUMQRQRYYEEu uuucYYZYUM QR5 5 u T "u uXZ_^ u被`=}a荫aUVWME_^]} 0)ʇʋu }%hd %hd %hd%d%%UD%sK vp:value folded in proc %dvp:variable folded in proc %dvariables foldedvalues folded ()56cenq#     ^ d h o p s   ^ =?FI\<7EE}# ()56cenq=?FI2=?FI^:EEEout of memory : file %serror on line %u optimization: illegal pointer size%d%drO"Cc"M/"Q="S#"T)"VF"wwwwrrillegal argument%s: %d unexpected eof %scannot open %sr**++cannot open %sr,- --1-K-i-i-i-/A.O.\..../9/D/O/"/ms_opt encounteredms_err encountered222222222797F7Q7^7i7t7???offset expectedtoo few parametersC )oC6oC?{CACIoCe{ChCqoCoCCEEEEEcannot open %sGTSSTvT X-OvTvT9OvTvTvTvTvTvT?O[OvTUOaOvTOOOOOOOOOOvTvTvTvTvTvTvTvTvTvTVPPvTPvTvTvTvTPvTvTQvTvTvTvTvTRvTvTRvTvTvTvTvTvTvTvTvTvT,PZPPPPPZPvTvT#PvTQQ(RvTvTURvTRvTvTSbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@_E#[G]e#[fZg]$@@c"c%b*Gb0_b1_b2_b3_b4_b5_b6_b7_b8_b9_bDnbEcFcLSbObXb[ccCcdrbecfcgchYbiblMbnqcobpScscubxbeg+M geg gegegffffffffffegegegegegegegggggggegegegegegegegegegegegegegegegegeggegegegegegegegegggggggegegegegegegegegegegegegegegegegeggi+h-h.h0h1h2h3h4h5h6h7h8h9hEheha.ddeffOhjdj-j]j?$@$@΁arw@@ 2SSSSd M8LLwL M8LLwL  M8LLwLX d 0000000000000000   ((((( AAAAAABBBBBB @C@9@@A7yABnD?O8I20HwR;sOe  K1$T$L s=SSSSu QRP aP߶Uh,Y0iA 0ikhP证U0iJ0ikPh腁U=Dt hDhcD7h,hC=t h,Y UVWui=(it (i@% ǀttPhLjYYVVb VV=$it RF ǃ#t/t k{#uY=(it(i땃/uu =*u=u뢁=,i+,i ~ }>WWh8=iYY>W =Rd&u RN=R4+u R=m R-u R>u R=' R= itH=,it,iFPj>h( FRm- ==u R=,it,iRk|u RU=R;= R!=p R=uZR*u=u !=u( RWhfYY $}=,it,i>WwhYFF <RUFPj"h FF ;R+="u*FPj"hQ FF R'u"hVYFF <R=,it,iDžDž=itѶuDž i9} ǀ8lút%=,it,ijPYYFX,ƃ\NJNJzt&=ituϴY=it*z1tFF <RKztB$z tR z 5uh DžDž.Rǀl.uT9=.u R=,it,i.%=,it,i.RB=,it,i.| jǀ8lu .z| .uetEu@ǃ+t-u| t|=,it,iуǃihaYut:0u:xt*:Xt%jhVYYFF >RFF @ut.0u:xt:XtVPYYRZVPYYRAR7=pmWhaYYklUwUX_^UVW1`_ƃ*t,kuu `70'ƃ/t/u hdc`Y*/u `_^U VW1Eƃ'uuh_YYh'_ uuh_YYC\uP?YƁ|U9j~ щ Eg똃}~uh^YYU9j}uh`_YY_^UVW URRTYE 9}  uuh_YYluuh^YYS\u= iuPVYljUAMU9UuEuV=TYYzlUAMUE_^UVWum   1VYE=t }܁=,it,ic tt1E0zƀmt E}|ف=,it,i_^UVult 0@mt W^UVƅu,ƃ?uEƃ\u3ƅuƃ u \5,i^UVƅu辖ƃ?ƅuZ蚖Q#e[\\S]J^A{8|/}&~r  ?^UVWu1ltF>.uFltF>et>Eu(F>+t>-uFluGltF>ft>Fu~tGU B =0>lt>Lu~tGU B ?>tGU B >t!hH[YjhoPYYU B+UBRuVPYYU B_^U(VWuE 1EEEE>0uF>xt>Xu FEEEE@mt?P8YE9EE%|9}}E܋U׉ׅ} U|E}F뵀>t>lt>LuE >ut>UuEF܀>tE}t.} u}uPhZYY"}~ h`YY}~ h<YY}th$YYE@}gj# d9P|9=| E< j9ju E7f} u}u E,QE7H j# d9u| E,(E@hGYY j#t=u5uYYW5uYYB?uF?.>t=u5uYY 5uYY>u>=u5ukYY>5u@YY>u>=u5u%YY>}5uYYh=u!=T5uYY?=u!=+5uYYERZ]ERJM,u(}t",u}u5uYY4,u,}t&,u}u}u5uYYǁ,u7<u/}t) j9j}PuXYYC,u;<u3}t-}u' j9j}PuYYǁ,u,t5uYY(,u ,t}u5uYYNjERZ]ERJM}t/}u)}u#,uPuvYY3}u-}t'}u!,uPuAYYNj0j9jt2}t,EU f]U f_^U VWE0];VJCuV>tYt~uu}VB=Cuvu uy mWB=Cuwu uU IW9VuVB='t3} :uVB=:uWB=:tuu u _^UVW}E0VZCu9~Wu u vYc} t} t} :uV.sYt~t'VBPYPu YPh0VPWhKu8 6VBPTYPu JYPhVIPWu u _^UVWu} Rzt&R I 9J u5VYYi5VYYY5VYYIViY@uYPWYPh6OV&YRBEHgRB_^UVE0^]VdrYh<jSoYYƺ UfFE0^UVW}jj(h$s`D ƋWVUVFWu Vuo_^U VW} E0VVqYNVU~Uzu3t-W d#VUtW d9UuU!VV9YVhPWA ƋE0VB_^UVW}7VBEVpYt!U VFuFPvK 7hQu _^UVE0VpYgU BPFPQOYYE=@uhVNYY=@u hVNYYU VFFUVV8Y VhRu - ]^UVu6oYt M J6hSu ^UVuVjjjrhC9F^UVujjjvhCF^UVuvv$YYEFFUV F^UVWuRBǁ<t0,t(u bYPWZYPh6XLVY_^UVWuRBǁBtAu=u YPW YPh6LBu 6YE6Y;Du3V|Y*u YPWYPh6KV9YRBǻ0c_^UVuu Vj} 1]} MuAOu VYYB6Y8zu06Y&6YVuYRBb^UVuj(VtYY0j9jtJthH      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg6wKYYRB==u5V YY^U VWuRRURz  JUztSj9W|  Jh<wjYYPhVR h<7iYYPj&V8 Lj+WU+Wh<RiYYPhV h<uiYYPhV _^UVuFPYY^UE=juE =8jtj}uU 9U~98j1UVWu uYYtujp}5YYh-j5Pj50jh-j5Pj50j50jVYYjjJ%5YY50jWjYYVWu jJUЙ=jjPj4YYVYWY_^UVWu uYYtujH4YYh-j5Pj50jh-j5Pj50j50jWYYjJUЙ=jjPj=4YYjjJ24YY50jVwYYVWu VYWY_^UVWu uYYtuj3YYqh-j5Pj50jh-j5Pj50j50jVYY50jWYYVWu V~YWwY_^UVW4iщ 4iUʉ4ih-j5upYu#UBPYUPrhVDV>UB\uuYYǃ} ..~uJWVWVB1=AtCfF 9V]^fFE~;VUz.t zZUR UO EWVB1=AtCfF 9V^fFh<wcYYPj.Vw@dƋWB1=AtCfF VJ ^fFgVeYtWVWV!h<w cYYPu VwcƋWB1=AtCfF ^fFWBu UBtF @fFWBu UBtF fF} .uV@tjv2YYFV€tjv2YYFE0_^Uh<jMbYYPu u UVWuE8E} .u&F=:uh0 WBYYWWB=BuWYWB=AuWYuWYWUz B=:t h WAYYUB=Duu#YVu u< F=Du8vu u E&EEE E *YjuuVtG}t9F=Cu.VBURZ!ËURB9t h W`AYYwSF=:uW:u YV Yzux YEVn YE}t}tVunYY}t}uVuYY}u}tVu)YYVuYYUB=CF=C~uUzhVB=:uURB=BURB=:uVB=BaURB=:uWaYtt?} LuhW?YY'u >YPhW? lE 7WwUB=CzVYk} KtFPYPhWv? UN 9J ~FPYPhtW? UN 9J tVuYY0w(F=CuwY0W`Ytt,UBPKYPhPW> E DVUN 9J ~BPYPh$W ? UN 9J tVuYYwUB=HuwkUN 9J u} KuhWO>YYwEUB=Ht4F=Ht)FPYUZPSvYPhWu=wE8} Ku_fG_^UVWu} 9u xt$t F_9uF_9uW9Vt1IW 9V tF=Au ~ t  t1#} F_9h $=Y~ t" tuw v 9 u+1~ u tuWV u1UBuRwv W 9V t~ t  t1wuuwv^UBuRwvFuuwv0W9VuW 9V u1F` S_^UVWu }EW t8}t+h8 _;YG fG ^ fF 1V t+W u}t h ;Y1}uujvwQ}tDW uV uVrh :YYG fG ^ fF E?6{ut}t h f:YEE_^U VWUR UU R UE}tuu}u"U z$tMur$q { V t>V t.}t h 9Y h 9YF fF 1~sVBǁ;t/t=uN}t1V u(}tX T PWYPhp \9 F fF E6녋E_^UVWu }9u Wt9t5G %^ 9uujvwu1 ?6Åut11ۅÉ_^UVUBE t.:Ur t.u vYYtv ߋUB P1^UVWE0VZ]u lYǁ}At }BufF V uWh| VI8 hVtWhX V8 KV@tWh< V8 1}3t }6ujvYYtWh V7 } =u vu EP URUeh<jWYYEf@ UNJuu EP URUUzuR$UUB$u[ZYUUuu V}DuVBFPWƋUVF fFE0_^UVuvY1F N^UVuvY1F N^UVWu} WVZYYRUWEPFYYUBP_YPh 6]6 URB !NUBD Nuj+V} Vj*rYYUB=Cu#URB=BuVj*DYYRUUB=Bt?UBPYPh 65 uXYjj(65PVUuj(6r7VU fUuhI6rVWVYYWEPYYEPWV juWVWVpYYWEPdYYEPWV` juWVnURB=CuUUURUUUUB=CuIEPWV RMII 9J trhKEP3 uWVm EPWV +ujuWVjuWVUB=CuCURB=CuuWV EPWVb uWV aEPWV1 juWVl?WV YYWEPYYEPWV 5WEP= juWV"EPWVl juWV JWVYYWEPYY6UYU1z1ہuC9uU?UBUZ ÉUfBuUY1t@h<PRYYUUZ ËUfuUYuTYhU1z1ہuC9u+UUZ ËUfu-UY8u UBuj,Va uW65RU fkUBPYuURBPYt)UjjruSuh 61YYEPWV uWRrRWVYY6SYnzt6;TYUr$/TYUR6TYUrTYUR$$sEU$sU fmUuW6r{QR62SYt6SYUUuW6rEQU f h wH_^UVWu}RRUWjjruu!h 6)0YYW%SYVYWu RrP5hKV BUZPSYPu&YYPOYYPj/V 5hKVi 0j9jtU f_^U!>'< E ETGUVW}E0WQYtVQYtWu u WQYtVQYtWu uV b}tGV€u>V9WW t V t V2QYtVu -YPWvQOWu Vv?O]_^UVWu}u V5YYE==t}>t }?u u6YPh@64. VYBRPh8riYYPNYYPj*VR _^UVWu}W=PYt61PYtWu V Wu RrgN_^U VWu }}uVAYY>WB=Ct19WWBP;YPhW:- WOYt WRWWWj*jrM>WB=AtWB=Bt1fG W tWz  hpW,YYWBtG @fGWBtG fGG%fGRB=Aujr覩YYBRB=Bujr~YYBRB=DuhT6,YYJ uh<6+YYsJth 6+YYRzu+zu%R R Uz -uh6+YYRBPrʨYYBfB U%?fRBE==t}>t }?u%uYPh6+ VYuVYY6uMYHRU}-uډ*RztRR M# dU҉ЋB76AMYt 6 Y6ujr2Kj!VYY6LYt1zB J6uj5JU fuVYYzu)zu#R R ztR rh6* h7zuBRBPYPrYYPIYYG fG6LY> hE}A_^U50j5jYYuYuuh0*YY50j5j YY=Cjjd5\j" h,5ѓYYh$5`迓YYh5譓YYh5h蛓YYh5\艓YYh5dwYYh5eYYh5SYYh5AYYh5/YYh5YYh5 YYB$PYUVWjjhsE Ƌ8iщ 8iWh YY_^U VWU zr ~t6U 9r u%>t zuUEE0U MJ =@tWJY=VB=Bth%YVVRjJ Q Й=jj8] (PYBP輛Yt$=8Whl3%YY< <4iщ 4i,4iщ 4i04膤Wy Y=(=@it55@i9YYtH8iщ 8i@RS Y59Y@@iPRh  j5@j2 5jCYY=Ct/WhBV芏 hdW>9YYujjj*W_^UV JM=@ts50 Y=4t=<u8RjIYY5, Y=4t:=<t 50jjYY50jjXYY58jXYY jjXYYjJ j+QЙ=jj5(YV5>YY9U~55h" uY=]tJ]5(Y踣V Y95}55h" M J^U=Ct55YY50jBYYU5h.EP- jjjju=<t(50jj芤YY rq YY5,jYY4UVW}w VR UVBEV U5u=Cwv蟌YY}_}t }2u }BtF} t!}2u}(uwh;"YY} NFw Y<}2 }B =Ct} uwuVX vY} }wh YYEjJUЙ=jjjjPh} W^LY=l|wht\ YYh=CtwuV見 } t Wu EYY=}Au4Vz u+whX YYh@!Y E!8_^UVWUUU z w"~ u Hi}=Diu@WDi=Hit Di8iщ 8iWw@Yjwj9  58jv YY=Hit(Hiw VTYPvv Di5Dij: YYDi=8jt8jPv YYDiWDi=CU rhW F6Uzu.z Ju%}fUu rYYUR$UVj=EPH jjjjuW!EU UEVEP5YYuHAY_^UVW}w =Ctwv V] Vz ~ 2^B=AOVztFRz |=wYVR jIJ ș=jjjjPhPvvwhi8w<YjJNQ Й=jjjjPh_^UVW} wj9V t5F=;t F=/u5jweYYv w̟YYL(j9V tAF==u6}u05(jw*YY55@YYv w~YY_^UVu=(u vjC YY=Ct v6YYuuuu VZ^UV5D=Ct55YYtvjYY h Y^UV5Dt4~t*=Ct552YYvjYY6h8Y^UVjj hPs ƋDUVU V5D^UV5DDPs5Ps^U=Lj8iщ 8iHRYu0Y@Puh j5Hj9 h`jYY50jjwYYU=Lt/j5Hj9p hljYY50jj:YYUL9Uu P9U t!u jDj U PULUVWUr U z uYEu YE9=j~=j9pU9Uq_VjEYYWjEYYjzYK95j~'VjEtYY5jjEeYYjLY5j}u"9}VjECYYWjE9YYj YVjE%YYWjEYY}u jYjYxE\195j~5jVjEYYWjEYY'j$Yj%Yuj#YhE1VjEYYWjEYYjgY;j]Y1jSY'E0hUY E0U j9J V}tP}u%r jEYY5jjEYYjY%U R 4djEYY5jjYY_^UVu"~t%F001^U$VWErUzRZ]։u1=kuhuYYxhuYYd}vt}9}11ۅÉ3U!UEEEUUU|9}|1Uu1=kuhuYYhuYY}ct}9})ЉxU!UEUUU|9}| U)E6*#) }t!։Jщu}}t:tt 19~@t119~@19~@u}}t7tt 19|@t119|@:19|@/19u@$19t@! 1 XE \-ErE0AYEUUZ ËUfEU%fu8Y_^UVWu~VBEVR UVZCuE}t2Ud҅t=ku h8VYYU#% tUVU rtvv vuvjE6ދE^UVW}j jhsH ƋWU VUV UVUV}tt hYUWw_^UVWUrt6s=s_^UVW}wEt"h(LYwHYGEt?~Bu2~t vaY!}u=KuEhY6_^UVWu~}hpYF1u h`PY p҅thHVYYF_^UVWu~=lu/~t ~-uvYPhWYYFE=lu,~t&~-tvJYPh"YYFFt9V tGt hYV tGt hYG F u F=~f1~/u@E~ u49=u}t=h4=,9=u}u=vYPhdYYF~1~7u@E~ _9=`u}c=\X9=hu}tJ=dB9=u}t4=,9=u}t=vYPhYYFv W YYF_^UVW}GEt F9E t6|uYYƊONWVE FW V A} t%u wYYG1҉U FW V WVWVW V 4E;'7_^U ViU1҉iiEP訥YiUit}t ts1E^U$iiEPJYEi/jYjYoEPؤY=thCYs|um YndW]jYSUrhYYr:UtB %u YhYr E%$iU$VWTiU`jƀku Z#u `/u:0ƃ*t'=,itG,i,茭댁=,it,iq]iEPfYEi}Q}t h YqUrh YYmq^qTit hg Y}u.U9Tiu# TiX `qTit h YTi@}u0U9Tiu%pt=Ku h Y ``p$U9Tiu+pt=Ku h Y Ti ` \p TiUB G#_^UXiUiiiiXi9Uu=t1U$VW iEP\Y=tuu h4 Y1 iot h  Y  1u@]SPVD u VhP YYVIYVYruIYuYFY(iUTiPi=Ctjjh5X9utVY_^UVWjbYEuhH Ygƃ(u/xPxPYY=u Anl3jVgmYYƉpP~x1PYYtjpWtu_^U=Ti| h`^ YTiTiƀU9Tih Y{m1Tith Y[m TijYUV=mt=Ku hdY9Ti h3 Y3Tit h YTi@jNY^Ult=Ku h(Y9Ti hY TiUGujYUVj@Yƅu hx{Y1Mlt(=Ku}tLDPhTaYYt ~t13EtjxY^UVuujYƅl~tAVBtvhYY'Vr YV Ds VDsF}u*kt!=KuhY hY^UVEPj.YYVhlYYVY^UVW}U UjVNjYYƃ)u 1ktkthYUU EU 9Ur hh[Y覩ƋU EU 9Ur hD1Y8lu͋UBWUU9Uw&E70UYYu7h oYYE҃jVpiYYƃ)u+UЙ/,th-YjV*iYY_^UVW}wtBFtwhYY u vYYuwhYYu Y1jjhDs ƉGU VUVUV EF_^UVu >t%Pu=YYu+U Й1^UxVW}E ƺ WR6YGGk t u Eǧу't "uԃ}tEj WfYYVWfYY\u舧PWfYYz9utt kuǁt kuuhYYVWwfYY/6/uFƃ*u衣E }tEj W/fYYj/W%fYY}kt kUU E諦ƍU9Uw U E8luMU}tEj WeYYuEP YYEt PWeYYNUUU: t> uF?t9uGF?u> t> uF1-? t? uG> t> uF?u >u1_^UVEP6YƁt}eUu8=Ct&u5OYYtjhuV U^UU URu55jUVuUUVu%uu v6jF fF^UU URu55jUU URu55j`UUUUJuUEuu r0j(UU URu55jUUUUJuUEuu r0jUU URu55jUU URu55jxUU URu55jP&jYUU URu55jktjLYUVi9i}HE=StZ=OtL tXi-E&1p 8EV} tuu h`hhtVh\hh uuhh hXhhYY^ULVW}tUjrYYt1E1ۃ}uC]=Xi}t8}t UzuEEPjhYYu uYY{}qu ucYYjJMIQ Й=jjPjYY5}+ufYUMrq j9 }8iщ 8iUUj EPR u|YURr EPhhjuj90 URr jHYYzUR UUzR$ŰUruuYY}]~tv jYYv jYY~ŰRr Yjv jYYYh$zYIFfjjuju}8v jU(YYv jTYY hh  YY FuuYY} ~tv jbYY v j`YY ŰRB=Cu50jjaYYd ŰRr jUsYYŰRr Y> v j_SYY- hNY Fu;jjuju} Ũz jjHYY uuYY} I~tv jRYY v jQYY v jPYY~ hYn FHuu<YY}I I~tv j.VYY0 v j-EYY v j,4YY h/Y FuuYY} ~tv jZYY v jYYY uuYY} ~tv jkYY v jjYYr uuNYY}[ ~tv jmjYYD v jlYYY3 uuYY} WR U^WztujYYUuj YYGujYY9jY/ujYY!h6hYYF]}tuuP YYujYY~ u Yp uuLYY}Y V U9j~>jU3ujUYY/ uj8DYY uj{3YY EWB=DuuuYY FPlYt<}u6jjjjuRjjjjWAvv 踮YY jjjju}t*} u$jJV Й=jjPj*sYYjjjjW}r} hh-j5Pj50j{uE50jj*YY50juZxYYvv ]YY50juwYYuuYvv 2YYwGP YY}} jjjjWqEEWB=Duuu1YYCu EuW u EE}RF=CtG} t$} t}t}t }uEjjjjuS}ujWC YYy}ujjjjW']jjjjWh-j5Pj50jsE50jj*kYY50juvYYWr jHLYY}t9}Nt }Ou'jJOQ Й=jjPj* YYVw YY}ujjjjub}t}Nt}Ot1EuV@YYwVYY}u'wGPa YY}pjW YYa}OjjjjWWr jpXYY}-jjjjWWr jH.YY50jutYYWr jp YY}t50jutYYWr jHYYurYEEExW z,k8iщ 8iU4iщ 4iUuYuhYYjuj9g 50jjH?YY0jUċỦUUzMz IuDjjjjr$xUR$R jIJ ș=jjEċURUjjjju4jJMIQ Й=jjEFPdgYt(jjvv pEPj:jYY0jUău;u5W rjYY}t uY=@t'W r=YjjjjWjY}~ ujYY}cFPfYt050jj@YY} u?5jv YYupY$jJV Й=jjPj@YYF==tF=>tF=?B3F==tF=>t F=?u jju}.u1PW}UrjYYjjjjWSuuuu u<jjuju#}v j YYn4iщ 4iUĺʉ4iMщ 4iUuujjWuYUjjuu rujiYYugYUjjuu r$quFY4iщ 4iU}tUUċUU24iщ 4iUă}tʉ4iQuďE}uEEP}uEEPjjWuYuuuju}^}uX4iщ 4iUufYjjEYYujHYYuFYjjEYYu2Y}uY}u+jjuju}yjtYluuujuQjjuju}t7UwrPYY%uYPhtURB=?u URMIrq ӣYYhYUB} uUJu}tjVUY_^UVu gVhYYbVhYYSVj{YYGVj~oYY;Vj|cYY/VhTYY hhhYY 0E|^UOjxYRjwYHjvY>juY4jtY*jyY hhYY EUVWUBNjUR 9j5jtVjAYYVj2YYtVjbYYVj`YYtVjRYYvVjQYYgtVj.YYTVj-YYEtVjZYY2VjYYY#tVjkYYVjjYYtVjmuYYVjlfYYVjWYYVj{HYYVj89YYE VjYYVj_YYVjPYYxVj,YYiH E x} t} t } Ou VjUYYV5Y.UBP%YPh YYUB _^U0j9Ut#ujEdYY50jjEUYYj%<Y50jj>YYUVWu EEURUE8u"50ju8YYvv XYYcF=8ju&j9V u Ej9V uEE8URUz  Et (t  2a}tUurjn }tUurjc Uurj9k vv 茞YY}u}tUWv RZjYYuUWRjYvv KYYVURU}tuujn 5}tuujc uuj9 vv YY_^U VW}w} uW t1EEEWUWZ=tWZ>tWZ?u u:}t"50ju0YYvv YYv uYY}t4F=8ju&j9V u Ej9V uE}X}tuw jF }tuw j=p uw j9[ vv cYY`jw j9: ujYY@W UR URBE=BuUrjMLYYUz Etz 2t z (}a}tUurjF }tUurj= Uurj9 vv 腜YYUjrj9u uj4YY_}tA}u}tUMJv QfYY7UMJQgYvv YYUrgYujYY_^UVu 95j|ujEYYl95juuj<YYV8iщ 8iURYVj uYYPhhjuj9` VjH=YY^UVujju jvjju jv$^Uy1ukaZSLE> 7 0 ) "  EUVjj(h$s2 ƋE0V(V4Y.VY%V,Yh",YX"~^UVWu$Uz }=,(u6=Kurh")YY5l5h(u8u YuUrh"YY5l5juUz =ku uGWV9uF fFWB=BtWB=At  'u1fF WBt^@fFWBtF fFF 'uFWV9 2u|FWV FFUV F_^UVW}jj(h$s5 Ɖ7VVF @fFFU VUV_^U5 5$u UVWu= 7V8V-V"WNYPh#YY "FFP5$YY5$Y=@u h"VYY_^UVjj(h$s. ƋVu uV ^UVuDVFV;V0V%u{YPhT#YY ,#EvFFU VVSY^UVWjj(h$sv ǃ}t u~u ~tvVW7} t u ~u ~$tv$VWWUWG}\} tU B1E} t U Z1EUM9J}EUB@GUZ ]/fG}(uG2WUUEUMJUM JUMJ _^UVE0)VoYu8h#VYY h#VYYVBt#u_Y^UVujhJu 5l$^UVuV u ~u1^UuYtUzu1UU1zu@U Vu51~9jEPj FPEPCYY1ۅÉ#F^UVut&~uvYv$Y$s5$s^U$VWUR UUzR$UWr RUEztj9V|EG}=ut)j6YYǃ t h(*YVW EEP1YElPMIRp 4ih*h Uz } jh%YPjhjh *OYYPEUM0rqh)hdjhdYPjhdjh)YYPjjjh)jh)YYPfjjjh)jh)YYPDjjjh)jh)YYP"jjjh)jh)xYYP_^UVWu}u Y|@B9uBR螾Y]u1>E]S60WtU9tE0߿Y1EU_^UV5tV hFP5t j( Yƅu1F$5^UV56 5u1!V FPh]^UVW}WYPu YZP^Yƅu10E0?tGFЄuF/E E Fu_^UVW}EEu EX} t?/uEPjW/ `1E 8M] E EPW3) u1EPju t}uYE맃}ƅu}Xt uVY1a}Xu1QEPEPWuYu uY1,UVUVUV }tE81_^UVƅu1U VUVF ^UVW5u VV9s1~$1~ Et~ Xt v YY~ t v詼YFF}tt"F$dt F$P~$t=u7tDžu lj_^UVW}j/WMYYƅt~uj/W4YY?t ?/u 9u*#t)BRW讹YY/*_^U 1U9Tit h*aY=`t h*#YTi=Ct =Pi~jjh5p Pi:t 5Y\j9t 5Y1UVW}wt} tQ~tKwh*4YY:j/YPWs/YYj2j h sy F GwWVWV~u4iщ 4iV} tF_^UVuVzuVYuvh*YY^UVWu }j(Y*B*Bi ~V:-uURYOJFPRYY=`jt 5\jY=Xit1PDY_^UVW=}tAj.uYYƅt(~t"FoFj/uYYƅtVUE=djt+hij5dj u5djh*4YYtWurRYY?_^UVWjuYYǃ u+j jh@s~ G d~5_^U=Etj h+ur t@=It!} tuu h+5i~uh+5if UV105h+OYY)U r!5hp+3YY ,+EQE hl+0bYYtE \j\jjh\+蓵YYEPj5\j u55hD+ (icth@+VYYt1PKY5\jYTt@T^UMhj9YhjhYjjjh;N=`jjh7h;3=\5j54jjh/=h5j54jh7h/<d5j58jjh<<5j58jh7h<<5j5;5,j5Ljjh?;jjjh:;jjjhH;@j90ju' j90ju hP,Yj9jt h(,Yj9j9 j} h,νY(j9$j9,j} h+譽Yjjj5hB!8jjj5`hC8j5`h5jh+9YYPmj5h5jh+YYPIj5h5jh+YYP%j5h5jh+YYPj5h5jh+YYP'UVWu>t)j6YYǃ,t h,苼YVW,_^Uh,nYUh,^YU$VW=EPhh.=YYBEEƀ`jU:dj EƀCJEƀSOukt ktuhL.蹹YYu>t8ltF>uEjhH. YYE:>=u!FVYEPVYYEuh0.IYY'jujujuYYPqU:uu9i| R5ͯYYiA iUi9U}U UU4uEii jEPeY iU:u = i h.4Y= i@2j@h-YYU:t  -U:juYYP*YEEU߄EPYEU:.lEEPYEWt=j}tU4j띅t=jj}tU8jut=j}aUt:t6V t)uV u h|.|YF fF G6_^UVWE8tG 1EU RUEUfB U urYYƃ~ VuYYoF=:tFP xYPhD/YYJuU zuz t!h/YUB UfB UB UfB U zt9z-t0UJ u$U zt h._Y h.FYF=BujjjVhC0'F=AujjjvhCt0EU zt z-t1}uF-E}tUM9Juwh.辳YYd\j2j h s EUEUMJUMJ UrUMJUOJUOJUW WYUzUr_^UVW}EGƁDtCtAtBu GՋWE  WR(UGT/E_^UVWjY YEUzt"Bu?twJYG?څtG1ƅEVUV t6UB=:~t VR Uuh/6Y6\Uz u ht/YUBuvWYY6EPuYYEtx}@uu&YYH_^UVWu9u } F=Bt/F=CtF=A|vU RU ug~ U R Ut7}t1t"}tUrwrYY?EUڋU N J }u tU z U rv;YY_^UVWUBE}Dt}Ct}At }BuURUBEʋURUu(UB/>tM9J t6>t>}Xs=Xs_^UVWuC~t*Vz t}J  s= sF~t vY6_^UVWERUER$U1}t/UrtF=Bt 95tvt ~ t~ }xE0$EEUzcz IV}uh0uYY}|h0upYY7UMC]$huURU됋U쉴htW tEht00谯YY1tMEU艼?u Džpj}j}}EhH00ӮYYQU苔J u)U苔MrhLhal MUhcYM댃}}u@J u1Eh00TYYtW uEh/04YY_^UVWu~u1VBt1jjh8s6 ǺWRYGGjhhtjPu> F烿yEU<P}ujj(u jj,u U4>tjPu FEjj)u _^U$VW1E1uLƅt9=+=it+iׅ} ډ1kt kbDžuDžwK Dž i9} @Kƀ8lű1=,it,ijPYYtuYvut*ztRBt1Pju :h1PSu ҅u ujYG6k 1PVu .uTJƀk t01=,i,i1PVuW Iƀ8lu .i1PVu* I=etEu1PVu lIƃ+t-u1PVu GI1=,i(,i (uE1PVu )u(M} )'1PVu\ ,u>}}t h1ԥYu ,1PVu y 2nHƀkt //{LH=*u,=u#D1Pj u H뫁=,it,i/1Pj/uj G^#u(i>uh1ɤY)/=,it,i 1Pj u >/z9G=*u(=uC1Pj u =,it,i/1Pj/u[ 't "1PVu. F=x9l\u1PVu `F1 u,h1wY1Pu 1PVu v9th1*Y)A1PVuv }u 1PVuN _^UVW}wn"5h辶YYh2hQYYFh躶YF >j 5SYYFv蚶YF h1貢YWB1._^UVW}U RrEU R1zt@E>>'t >"VEPW YY>\u FPWYY>uh,2ӡYF9EuĀ>tFPWYY듀>#}u ~#F>#tFOW9WrWHntOW9Ws E W9Wr W:uOGW+WUuHntFF%EUH˜Ut8UHntEU:uEU:tEPWYY}~WU8ltM}WU:rWUd>u E!8lCM}~WU8ltM}WU: WUuVW F%EuUuHntEU:#uz#uUMI˜UUMI U}tU:tEPWYYW9Wt zSjWYYDFPWmYY2}t h 2?Y_^UVW}EEEU uHntE U E %EUH˜4j"WYY>Hnt}uEj WYYFE}u>"t>'uE9Eu }uE1=\uC]>"t }t>\u j\W\YY>t>uFcFPW?YYQOWHntOGj"WYY h@2蝜YE _^UVWuV+V׍W9VVVvvNYYFFE ^FV_^UVWUr+V׃}|0B9VVVvvYYFE }t]+׉B9/≖襒YYE _^UVWu1ku ?} tku?Gσu=t t?븃/uOf?ƃ*u=u;L?됁=,it,i/t#uN ?J_^UVWE1>= t\u>= u9u1̃'t"uEZ/uC>=*u=u;듁=,it-,iu =ZHnMEAt Wh\2臚YYE_^U=uj@5Y@UV+֋J9r)@P5_YYE^UU:tEPYUVWu~~ vhd3EPP PY~})~ }#VRh`3EP! PYe~Vvh\3EP PRY"rhX3EPƪ P,Y V d|~t&|vhL3EP芪PYV JѺ!||J|Rvh@3EPBPYv vh43EPPYcj*YvYM~ Ch03UY5eYVJ F HPh(3EP轩 P#Yv6Y~ }&Vrh 3EP苩 PY^je{Yjz^WR tttEt9ru*z 'u!Orqh3EP PYtt벋?j;YH~ }>VFr=3usuPh3EPèP)Y^Fv =3usuPh3EP舨PY~ WrYj:iYWB=Du?WrYWR OI _YrSh2EPPY2wYWR ORQh2EPPPY ]j;Y!jfYvIYFp2q_^UVuuu Yhh3Yv Yj;Yj9V t V z |1V B Ph5y^UVu u Yhl3YVYj;Yj95t ~ |1F Ph5ty^UVWu~u2Yj:Yh~ 2ufFPYwYj;Yujj$5.z3~ Ft~ -u:~|4jpXYWYj;IYvjh5x~ ~ -~t&(E~ 2u~| jVYjSYjGYWMYj;Y~ 2u ~|jvju5mxUjuju5x;WYj;qYvjh5w} B_^UVWjjhHsE Ƌ=j7~llVWV5j_^UVW} wt U9Vt%6j2jhLs ƋWUVw_^UVl9UujU9Vt6^UVWjzRUzEjJLsEULs=lu%WօtWY s5 sGW օtBl9V|7~ -t ~ u vFYW  s5 sWY뵋W$Ut) l9J|EW$TsEUTs͋W(U l9JEW(XsEUXsŋjUjRj=l|U jRQHsEUHsjjRl_^UVWjzjWUr u?~ 2u3VB=Bu%~uUhp3rh3M F (~u~u u$rYF?_^UVW}WR(UUR$UURUG=3uB}u!U Er0YYEjAWuE PuuE&}tWuE PuuEEWuYYj2jhTs ƋUUr$UVUV~U VUVU B=Du U R r uYPuxYYE2V EG=3u2}u,h3u { YYE]U rwYYGBG=6u7}u1h3u > YYE]9}]U rwPYYG_^UVW}U r t9~uwh3nYYv _^UVW} E8t hP4FYu跹ǍW(UE0xV z kZ9]^l9Vt=l|J=lA~u;~t(wh$4׍YYuHPua V Et<l9Vu1V z |(wh4芍YYuPu =l}uzPYPh3FYYj jhXs誂 ƋEE0lVu YF }'utER B9Et+uOYR ZPSOYPwhp4艌R EuWu _^UVW}$7t$jhu v"Otn?֋UR$օtUrh4YYHuYuUrh4YYj2jhTsK ƉUVVV_^UVWu }R UU9jtjj~|~u u[Yt U9VhL5aYjh45؋Y j9J ~fBPHNYPh5 YYjxBPNYPh4YYjLB4=juOE5t)jvYYǃt h47YW_^UVj2j(hdsry ƋEfFF ^UVuF=;t F=/u~tj9V uF==u^UVWu uVYYF=Buh7hYF=Auh7HYnuuVf YuVYYJF=:uh7YEuuV hx7腄Y \7Eٚ_^UVW}1u/hBYƉ~F PjVEFU V _^UVW}wt F9E t6u7hCDYF~0jV PjVE FWw_^UVW}wtU 9V u F9Et6LhAYƉ~U V WVEFWw |} | W U V F _^UVW}hDYƉ~WVW V E F_^UVUr }u h7aYY^UVW} UR r?t h 85Y~ }-F=Au"j2j(hds}v V7 7_^UUU JЙ} E UVuY1} FUVUV ^UVWUzu)6t1~ u UR V UR V URVF,8飘t | UO J O ?_^UhPdkYUV5jU+Vu R&YY؉F^U VW51t:U 9V |,U9V|$U9VuU9Vut6…uBj jh0su u umYYFU V UVUVUVFVUU4F_^UVWUU41tU9Vt6t$t U 5_^U VW5jY5tD~-uF =Ju~|vvvvb60s=0sE} eU4tD~-uF =Ju~|vvvvpb60s=0s븋UE5%jY_^UVW}|Oj jh0s_s ƋU!׋UVUVFUVU V4_^UVU4t U9Vt6^UVW} uYƅt 9~tF9=juujIiYY79=juuj?iYY!tFuj:iYYWjHiYY_^UVW} uSYƅt 9~tF9=juujqxiYY79=juujebiYY!tFuj:IiYYWjp?iYY_^UVuYƅtFuj:iYY^UVEP#YuVt hL8Vx|YYVVkY^UV jtGYƅt!u "wDp84 @^U0hEP ÓhxEP谓6=u =,uEPYEPiYH9道 EPiY5lEPEPC Z EPEPWYY }u}u}t hh;{YEPEP~YYfFtL: }u}u}t hT;K{Y=8;t"j;DYTFt$;鿒EPgY/SUVWu }VgY%w6YYAw5lj6WX*=Vtj,lEYEtu wBWY;  =8;tj;6DY_^U VW} 7V誫YW耫YVu~SYYWYjDYEtu SA;雑 WVޫYYEPVʭYY $+uwYFV,@ V t h>wYN @ V t h>wYN ?g ~t h>[wYV?= ~t h>1wYV? FP5$YYF b? =8t h2AYFP5$tYYF #?gBt $rh>vYYV$z tR J$R B 5>K h/>Y>3 FP Y! FPY|=^U$hEP ލEPPY}t h4?uY}-u h ?uYUEUVu?Y$j,@Yƅt%u=uYL?u ^U VuhxEP+EP=YEPbY5lEPV < vuGYY6 v5ljuS@tٻ`?όEP&bY^U8VWuEV RBE=l|+} 2t"}3t}6t }Au1E=lt=l|} 2u1NjV RB=Buh?!tYV RfBH=lu hx?tY=,{t=,tEtu 5lEPVQ}t VjSYYEPu}tV B1P&YYrV RB=Buu裖YE=Ct!=l|}tUEr0XYY}t VjNSYYu 5luVAQ=Cttvu v i VY_^UVWuEEs VtY';j=YDž:R=t7 EP YC EPY1 )=t?f?+ =8)tj);YuujjhBV_E2EPYjjujhAV^=W$:@ى HN=*EPYVYjjjuhCVs^A鉉_^UVu:VY<9V3Y =8)tj):Y =Wt^UVEG9X \j<Yƅu Fu/ EP'Yu^YUREu贓Y B骈 =8]tj]c9Y^UVuZY8:j;Yƅt;u$=8,tj,u:Y~8uYp8B- ^UVEPyYjjhs9e ƋUVEE0Uz tR z 5uUrhBoYY^UVuE>t hDjoY7 Vjh' EP6YY7 EPY7i Vuh' EP6uYY=CtUMrq(oYY57M Vuh' 4c:t޻BΆK:[C鲆^UVWuBu VYY,=,}t2j,9YDžt"u u VhYY$DCJh/ =WtUVW}=l|lUl lWYa ej,1YEu NUu7 h8.Yjjh4s[ ƋfF 7.G ~7UY=lu Ull_^UVuaYF=,tIh.1Yƅt6u=8,tj,/Y.uYH} ^U4Vjjh4sZ hxEP<}hEP )}EPYEP1Y5lEPEPV误EE0EPaRY^UVWuEEn VoYj0YDž,R=t7 EPYC EPY1 )0tHk|I0| =8)tj)-YuujjhBVQVQY2EPYjjujhAVP=W$!,J{ HS/*EPYVYjjjuhCVxP8J{_^UVu=,)j85,6.YYtR=,udDV Yx+Te+VY =8)tj)+YB+xJzJz^UuYUVWu*]h -YDžWt0>t h K[bY"t hKDbY ="t*JSz _^UVWu=8t hJ,YVYL*hVM Y;*ZVXYQ%*VY =8)tj)*Y f)8Ky_^UVWL5$=( U)h,YExaU9 t hMbYO(RVWYYE(9U} $UAPVWZYZE/)`Kx LWVu _^U VWuE VoYqh+YDžk<K(EPY =8]tj]/)Yuj[V) Eh(8 ?j;+YDžu )u EPY@Mw =8)tj)(Yuj(V) V芯YEnU' EPYuuV 9ENEO =tuVYYMEwt'Mw _^UVEuYhIuYY\h*YƅtZuC=8,tj,(Y&EPoYhIEPmYYuhIu' Ov ^UVWuj85,:)YY=,EPYs&VYuhKV  f0j9j%fj V Y[Z)tAEPZY%V8YVu/YY- V%YPu=W_^UVWuk%j85,"(YYtS=,tG EPYh7htQulYYP}YY f-%.VlYVh11/YY^(tPt k_^U VWu VY5xY9E!h'YDž EPMYkU}t }uD6~Yu 6~Yt,6~Yt}uk}uk$$ EPu>xYHPYYuuV% Uk|Qs _^UVWuEE1Vj?wYHPYY  j?q&YEu U $kU6}Yu 6}YtG6}Ytk##EPY =8:tj:#Ytk9Uuk Uk" $EPYUkuj:EP# j?VYYuj?V# 8SVr_^UE(uYO (,EPMYM" ,EPYuuuX! (k%tSqUVumY5j,$Yƅt6u!EPFYuj,u" hTLq ^U=&u MEUUUUUUT qUTpEUVu^UuuYUuYumzYU2 =8t/h"Y"#t TU#p$EUj=,:N 0cO W j:Y, / 0   0  0 0 0 0 0 0+ 0:j;Y 0 ;j;Yck 0NY 0s<G 0=8;tj;!Y)e"thUnUnUEPY =8;tj;`Yjjjju9umyYUEPYjuȓYYURr>YUVW4iщ 4iUʉ4iιщ 4i0j(Y EPYh+EP$ YYu,xYtUzu(VjZBYYVujju8uC=YuvxY =8)tj)6YH 0WjAYYV<YlW<Y' V<Y t`Vm_^UVW4iщ 4iֺʉ4iϹщ 4iU0WV8YYW^<Yj(PY EPYh9EPYYuvYtUzu(Vj AYYVujju7u;Y =8)tj)YNWj@YYV;YQ8uvY_^U VW4iщ 4i׺ʉ4iMщ 4i0 VH;YuW7YY6 =89t h9)Y j(Yu:Yq EPZYh9EP}YYuuYtUzuVj?YYWVjju,6W:Y =8)tj)Y j;uY 7uuY_^UVWEEE4iщ 4i׺ʉ4iMщ 4iUʉ4iM0uW56YYj(Y<K RjYƅu <u% EPYjjjju4XWi =8;tj;eYuI9Y jYƅu {` EPoYh)EPYYusYtUzu9Wj=YY-Wujju?4u8YWh =8;tj;Y8 ?jYƅu )u EPYXX~h =8)tj)7Yu8Y}tjjjju}3uj<YYW7Yu4usYu sYusY_^U0j(Y EPYEPY =8)tj)~Yd1urYU0EPYuEYuZrY =8:tj:YyU0Tj:YWUE2: EPYuZ,YuqY% ,HtXf =8;tj;lYUEPY j;(Yju׋YYURrj ;YYUVW1=ku@0=8{tj{AYEP=t =,:u0=u>=,u2jYƅt"u iGXYe k=Ct?t;5khj3 $hYƅt"u 0ZMe 0 =8}tj}VY赺=Ctt5khj3 k_^UVWu }4tWuY 4=lu hVeYRB=Au6yY=l} 6nYu6oYuzuVWYY6UoYRhh\6G9=hu lhFFEUB$]^_^UVW5=httFf1_VUA=hu lhF5V9Vu,Vt$6 ,s ,s5F~|V9V~ FUB=AuVv}YYFVYDžbFFU9B ~jh\]hhr,Vt'6 ,s ,s5FJ=,{t+WB=AtWB=3ujGPYYGUBD]\_^UVW}w u:vpYt jvYYWVYYƅt v^pYuˉw _^UVW5E}=hVUUz u!jvjrhAwVFN9FUrYV!YDžt0wY t WYFh|]w:YYF ̋FFU9B ~,jhx]hh*׋UB`][VuE6 ,s ,s5_^UVWE 0^AYFPuYY~ u"jjjvhAX] VJ F EM~vzYF=3u?~ GPupYY tWYW ׅtAw=Y tWcYF=6u~ GPu&YY VuYY_^UVWu~ EPY=hdF=Du jVeYYM8j9V|"9=jjh(YY+jޅtjh]hh(O_^U(VWE0u j=u E0VdYu VgYe~u VYS~g~ W z|z Etz (t V!YW RB=Buwh(YYvwh( vv h' u j=u E0~u3j EPFPI Vr EPhh'|VrYpU rj=ul E0VcYtvu YY>V4Y5=hu,lhh ^AYU B]&X_^UVWE0U z~ ujWjvhAS]&VJ F E@9~h,^u ~@YY}W6YEWu~4YYU 9z|U BEUUU RUM|EEU EU r7YjWu u7Y_^UVWu} jЙ=jjE9}}:}tuVh& uVh& +U׉u}tWVha& WVhP& _^UVWUz w =ku)VkURx} tU #O k~ tV k9Jt+khpYkk_^UVWuV R+VRhH^vzYYZ)‰׉}JWZ~jhD^hh$ڋE_^UUz }u hX^=YY1UVW}w~t$v jwQYYPhh$>j9V uwh#YY"v j wcQYYPhhM$_^Uhl^u:=YYlhUh^'t>uuWu >'uv >uWuYYwuVu t5VWYYExT|uuuH uuYY>t>uv >uuWu{YYv A_^UVWUM IT ׅuUM IT ] 1GWURw]YYGU ROORQWWBU RR֋BU RWrYYt0WW WW U Rj`r,YYWdz$tuu u+ U zu u uFYY_^UVWEU 9Uu 1U9zR@URuUR URu tYYtUR EUR @UR%UR GGE_^UV1U9r~RtF1^U VWuEU M9J=JQ!U MJQU EU MJy`udž`h Yd5`9\u'``RdYYd\d<\tuWV ku59Wu džhuwVI u;WVYY0T} WVLYY~ WYuWVw E_^UVWu ~EU9V~@VRzt,UVR׋JUVruYYE븁~T|*UNT 94uUNT vvYVoYHVYt=V;YUǂ|VuYYU|tFVuYY_^UVWEUM9JTJyMRu:URt.UJ  u WJW O WYE_^UVWU z ~ Uǂ|U B 1U 9z~5Rt)U R%U RtuYYG_^UVWjYURVFF FURVURRYFURMRqv; EU9V~"VR׋BUNE։_^UVW1U9z~CR] t1UR] !ÈE URPtYYG_^UVW1U9\~dֹ# GދUǂ\_^U VWuUVUFFEU9UUMM 9Jt=UM׋JUM׹# UM4VuYYQ~uF VR:YFV9uF VRvNYYFUMFEMu"Y_^UVW}19P~X4WYYFLJP_^UVW}GGLJPLJTLJXLJ\LJ`LJd1}D7 F1} W F1} Ƅ7lFLJh_^U VWEUURUEUBUB19u~@Uu 4u uYU׋JU4uYYFuYuY1} UD2 F1}U F1E90~UR׹# F_^UVW1E98~)UR֋JUR4u%YYG_^UVWxP1YDžt1=u58~u?dz$t8jYxP9Y58VxP t9x~ xt58xPJYY9x~x=8h=8XxjYxP!Y/58~u?dz$t8jYxPMY58VxP t9x~ xt58xP^YY9xx EE}}UUEW58xPYYt9x~ xt58xPYY9xx}t8jYxPCY_^UjR YxUj> YuYu YRUj YuYu |YusYujYUjYuMYu 1Y@Pu ) YYUjYUj Yu YUj YUj nY}tu0Y@PuYYu YuYuY^Uj &Y}tuG0Y@PupYYu vYumYuuYYUj Y}tu/Y@Pu$YYu *Yu!YuuiYYUj Y}tu/Y@PuYYu YuYu`Y~Uj FY}tug/Y@PuYYu YuYuY6Uj Y}tu/Y@PuHYYu NYuEYUuYu Yu Yu YUuYu YhYUuYuu  YYhYUuYuu YYhoYUu_Yuuu hCYUu3Yu cYhYUuYu  YhYUuYuu YYhYUu YUuYUu YUuYUu u YYUu u YYUhYYu) YUUuhYUVuYƅtv YF^UVWuEtUUuuu^~u vY<~V U9}v&9uGՉu6uY_^UV E4t U9Vt6^UV=u:54545050^UV=t:54545050^U VWu1YEu1SFtFF F~t uwYu E?F%FE_^UVWuYƹ Eׅtj YƋUV4FFF _^UVW}t#w+V 9Vu WV Y_^UVW}jj YH=WwF+V_^UVWRSS=tuYt uYU=tjYƉ5 5VYj YNjV~GUWV,Y_^UVuYRSS5YV VY^UV5U9Vt-VY~ t v YF^Ujhdhh\+ j*YUh YUuYUuYu YUuYuu :YYUuYuu YYUuYu kYUuYu YUuYUhYYuYu YUh5YuYUuYu YUuYu YUuYu [YUu uYYU=q=u(h }Y8 ,8R5YY8%88G=8t1-8Ph85 X) u V8U9u EUU}u  `h ju' u1U=tE=t+ IQ =u jY5S Yy= `t 5 &Y U1= U9u.9u UVuwL9u9ur9u9un9uH^UVuwL9u 9ur9u9u9ux^UVu|1x},9u9FxZw9u9u9u9u~9u]9u79u 9u^U} u uY39uuYYu YUVWuV$"YPYO|&9uLF_^U9uuYU} u uY39uuYu cYU9uuYU9uxEuYu YUVWu} 9u2WYO|&9uF_^UVW} u M 몃ruWZt UE_^U VWE8L}~UU RYDžu}uOMt} ׋U E8E8E}} Nm 먃} rm U уM tGE_^UVuYƃ}t uN^UVW}u YEƃ} t uNU уM tGFE_^Uu uYYUV}u u *Yu uvYYƃ} t uEN^UVW}u1_}s EUU}w&U<@7tVfUUEmE}s}|1u[YƅMU=<uj!YǍW)RY}}1 uYDžuUU| uYDžu6uYƅu/UJuRYYƅu1=V5Y uWYYƃfEVM9r uV*YY_^UVW}Ju#Vu=Vu5Vw V<@V7NVY_^UVWuN95<t!~׺#WtWrYWV'YYFt&V!׺#WtWEYVWYYVYd1d1_^UVW}uu Yx} uuY1bu} s E U U VNV<@E9t}}uV<@Uzf#Vt VZYfVU9U vL95<tDVU#Jt2RM9M wuYuVYYVUU9U IUUu oYljEu1NUуMt EEGuYE$E VM 9r u VYYE_^UVW@s7tVfVY7_^U VW}WUm}sUGUW}tUz>_^UVWUrRUu!URUm}s7UrtUV_^UVU4tV9U wv1^UVWU4s>tWtB1_^UVW=<uFFFFN#VV5<U )Vt#WtWYVWYY_^UVWUu ֋MzFFFFN#VUV)V<9Ut$#WWtWkYWV YY5<+UMQVY_^UVW} w։+UMQ9=<t#VUV9=<u U<_^UVWu }}u } ffF~ufFfF?@V%Y_^UdVW}uE] ] @UU 1fU M I Ju#@fG@GGAUMI JufG1҉WWfUBU Z)ۉfGU#JfMjEPYYEPEPYYfEfEfEEPu YYULU؅uMEEUUE}\UډU}uEuUN9)NщMU9| E|Uڃu UUh}|E}ES#UЙ}P}ZЉE#UЙ}R}YBUU9U|EU+UUUU+UډUEu,UNMMRQ)YY~ MUU˃}9EEỦU}fULUMMMMfM]Q19}AMUM)ˁfUUM됋UU19U~@Eu+UMf}hMEỦU}~=UMKLUEE%%fQUUM뽉uUMfUtEUЋ] EԃUWUWWl YWY_^U VWu} t@tt@1F} FW9mt&F=u~u~u @@@W‰fFtFFFFVNUMF-?PEP YYU UUt UډE_^UVW}1} E1}t] E 1EE 1Uu5@EP}tk] PW u5@}r8EP}t4PEP u5@UUW}tPk] PEPz u5@5@_^U VWu }EEEtG@ffF1҉VVEfG dEGEu}.UAM}.tE~c~VVNUMjFP YYjEP YYEPFPYYEU0UEPFPYYE}NMF}u@}Et }e_EE EG dEtkE U0‰UGEuUUU~u~tfF?V YuVGYYV Y_^U,VWuE1E&EtEfE ~EhVdYY|!Vh4V E E uV4YY|E GOk VPPV k] ] E}suVYY|E GOE 8hVYYh4VYY}!VhV_ E E E\uVyYY}E GOk VPV E k+ۋE VhV E E1uV#YY}E Gk VPV E )E 1E U9UREfEfEEEk PEPDEPVYY|0EPEP"k ]SPEP E0UԋMEfEVEPV OJFu~kEfVfUfEVUF-؉U0ME}t.F-؉UUVEPV U0E~VhVV }fUUU=9~*0}vMUU@֋U1E ɋUM}v U:0u_^U@VWuuEP@EPEPEP ǃ}t-FGF.FE}~?tGF }u 0FM܋UMI JtM}NeF}} -F]+F}O E0OEEu݀?tGFFU҉)9M} @uҋ} GFu_^U VWu }EPVW }u }u1Ut_^U$VWu }@V VuWu. W WuVu ~VEP WEP }uF_)ۉ]}!]FEfFuFP\YY"}~GEfGuGP8YY9vwYYEvwYYE܃} }u4}~.}}OW+VWW+VWWu- }~NV+WVV+WVVu XVu UGPRYYt4UjRhYYURMQUB@UfBuYu1Y_^UVu 1fuVu 1f^UVWu} +7RYY1ۅÉ]+VwR~YY1ۅÉ]WV}tB>u E_^UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUt(Ft!FFtFF@fFVY_^UVWuV VufFf_~uVVFF- fFFu3E@UVu}OFfFWFPYY_^UVWu} ?}F |V ~IVVJыVV>t) )ы VVI߃ |VF ~7~t&VU) VV_^U@U 1fUVuF=@|@fF@FFF=#@fFFfF^UVWu }Wf#WfVWfV#WfV_^UVWu} 9u1.|9}}9}_^Uuu P PPu UUURu P PPu UU URuP PPh` UUUjuuu uJ ZY EU#+ $dE1U$VWu }>W>%CE eF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u EeU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}H1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋END} ND} Džu}t N-N0_^UVWuFuNE E Fu_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVuFu+UJ^UVWu }UуMt%F9u Gu1N)ۉ1_^UVW}1?tG9E uN_^UVuYƅtu1^UVutF6Y^U EPuYYtEUVWƅ1juYYDžv1jubYYDž}ju0YYu#1XjjW1 }5WY1E0_^U}u1!Euu 0 ]1ۅÉUj|5Yjt5Y"5 LeEUVXs~u1^UjvYU}u1Euu 0[ 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P{nZsPsPR[) [)։ZsXsXfR[[׉1ۇtPXPwW{UVW}u M39U$UUEEEEEEPjj U$uEP~U UEPj!jU(UUEEEEEEPjj` E=u U1UVW5}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$uEPjU UEPjjU(UUUUU UEEEEPjjN E=uEUu 6UBUM JUju R7U,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjjR U$uJEUUU UEEEEPjjUVuU VVu5YYEtF~}VډF^U,EEEEEEEPj j E=uUUԃ}tEEU$UUUUU UEEEEPjj UVW11U F|_^U VWEHpeleE1)UL֋UVNEUM9J̋uE/U L׍WOEU9V_^UVWuueօu >:uF>/t]xeׅtW YPVYZ=sWPhtePZVPMjVYY=wh PVEVQ},GփRH FP9] F P+U BF$PU BF(P U B ] ;;2U zz zzrz z 2 9Jt U kB,kZZ E  9UU:u@Fj;jEPVZƅtkE<>:uFj;jEPV7ƅtU_^UVu>-u EF uF<+u E1u VAYYƅt}tE ^UVWu} >Ju&FhmPGPVs>MuPFj jG PVyƅu1lF<.ujjGPVTƅtۊF<.u1jt1hmxt>/uFGPVlYYG _^U,VWE udE uE u1u}EeWJi€QE}&<EQiGQEuE1kE0i0 QEEW J9U|ߺ W ЙBU U JE EdƋEUkE- @EPEZPZЉ)ڹЙօ}W)U}EE"kE0W J M9 ~uEU9WiEQEUWU_^UVWuu}t VYEuփ}3r)E2 VY+EE=} >>tEPVYYƅtߋ} WheYYE؅t>nuVY+EE=|>t!>,t>;tEPVoYYƅuzUU>,t >;FEPVYYƅIF<,>EPVvYYƅ(>GGrUډLLJPUBTUډ\LJ`LJdWU䍗UEuEPVuEuEPVu E9E~)]E]EEEUEE*EEUEEEEUEEhluduu1ZiQEF*>}EEEEEDžtLtփztBUUUU}t 9U_UڍLtΉUBVELUULtM M}t 9MUڍLtΉFEEtU9WH}}EEDžxU9WU L֍WxU2}t ~ uEEZЋ]VUExEGGUډLLJPLJTUBW }tUBW  3uuW( }׉G}tuuW( U1_^UuhYYtjuhB UVhe"Yƅu  >u;HLhh4vYY5hHV8YYt$>:tjhHV t hH9Y`^U hHjYYt hHY.UVWEU= u H׃ztU9W~*E17PtKEW9U|E4EU9T7EU9WUJMULuW6EPUNJ VMI VMQ(_^Uh ju UV UU= u hYVhjuF( ^U0VWEEEUUM܃E}|OU u֋E9|9u.}u~UMI ^9\}1EVUEQƋEUU +UU}}EQNmQF}Q}}EGEU<ЙGE}tFW}GE|SEudEuEu1ElU9UE+U؉MEudEuEu1El|UlWwkE0 EG +UԉGWMU9~BW G U W$_^UVWu} uֹ 0VֈM_^UVuheh QkFjtPh #kFjPh  jv h tjvh ejvh Vj6h HlVjRh 3\ ^UuPRYYUVWu }U9|}}0>}+U} ډЙ}@+؉ډЙ}+Uډ_^UVWu} V+WUu3V+WUu(V +W UuV+WUuV+WUu+UE_^UVWEuEP y}>}}}jt 6+V~ WY_^Uh>YUMUUURu u EU VWE%wWUV tVUY ETM}?u׋E_^UVuFuu P. E|FPF %fF E^UVuV tFjjP F %fF ^uu S ^UVuFuu P E=u^ fF F fF UVPE^UUBPYUVu ~u F1VuYYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPaYtEU@tF @fF E^UVWUJ t UzuuJYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQYYt5uu5e5e }E-EgEuuYYtEgE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEgM@ExUURUuEg}|4uju t+EE9EU܉UugYEMUutUU#J UUBEEZEgEgUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!tgURYELeE.uNFuuV, 0}uEU9UB}uOuu5ph5lht1uu5xh5th}MmE}tW9U$vFMF0}uUt F.1uu5h5|h$}EPuu5h5hYY EUuujj Z0Fuu5h5h tMkuu5h5htMEPuu5h5hYY EUuujjL Z0Fuu5h5hztujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF hE+U _^UVWu u5h5ht'EPu u5h5hYY E-0PjEEu}uu5h5h~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UV=u/uV ufV u V t:~0tV@9V0t v0pYF0F %fF FVF fF ~uV<YV tFVډVV t1FF1^UEPjEPj?P}jjj)Pgj(UVW5VUT>M}}6u݃=tu2Y_^UEPuYYU VW=uE 9t FE>u}5EuW6 u0UU:=u#+Й] UUR >ujX_^= CC [ = ;{SK k{uC [ SkC [= C[= 31C CtrIAÃ= C s[ = CK [ = 'C[U}u}uUM UMQ}u} tEjEPEPq jEPEP_ EPEP YYjEPEP UVu EPEP! E}1} u@D1UfUE]9~;E@]9uUt}u}tj2YE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP  EPEPYYjEPEP UjEPEP jEPEP EPEP5YYjEPEPt UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}E MuG_]1_]UVWME_^]U} |} ~M E 1U} |} ~M ҋE!1UE1UE1U} |} ~M Et1U$EEEEEEEPjj7 U$UUU UEEEEEPj%j U(VWu UJ<UUtuuUJ4EEEEEPj0j E؅}UJ<EUJ4}u_^UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U hh Zu u4)UUM] Z5i5hUM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uNYYXZ_^UU}u h%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^U VWU RUu1"uV t~uVDYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W{ V+UVUUUyV9v,U9Us$u6WCUVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj Ws Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVPYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(iu^ fF FLF fF u軛YEu^ fF 5MF fF UVUV}tFPYtF fF ^= K C c[ U VWu} W WV VuWVһWV YY9zV9Ww 9WuHV9Wv@VEP蒻WV膻U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPѵV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UEUT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WV=t1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWV蕮t1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]C} 0)ʇʋu }D$D$D$oU$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj U$UUU UUUEEEEPjhj袱 u`=}aݭa9 !z%&*+-/<:=>^| D>bjY bad class for char 0%o0.0number too longwide characterwide character stringstringcharacterbad class for char 0%ofile specifiergarbage char \%03onon-ascii '\%03o' readcomment inside comment ?%s constant too long%s constant includes more than one characternewline in %s constant%s constant too shortend-of-file inside %snewline in %s/af H ///\ ///////4 ///R /> /p /z ~ !W'E(*)<-i/3<N=!>`0.0malformed floating constantconstant too large for target machineoverflow in constantonly one unsigned suffix allowedonly one long suffix alloweddecimalhexadecimaloctalmalformed %s integer constant%s not expectedend of file expected]l0.0int%s on %s and pointer%s on %s and pointer ',/L;L<=>?DHoperator %s on non-numerical operand (%s)underflow in float to unsigned conversionoverflow in float to int conversion%s operand to %s ',/;<=>?CH%s operand to %s%s operand to %s !0,<0>0000000'^/^;^AkBCuDpointer difference caused long expressionM%, %< %C%Hj%%,%3%6%<%C%H%selector %s applied to %s-> applied to %s) -8):8)<8)=1)>8)8)8)8)8).1)K()L1)+:*=***.*KA+L*,=+++.+K4,L+cannot convert %s to %sdubious conversion based on equal sizeconversion of %s to pointer loses accuracyillegal conversion of %s to pointerconversion of pointer to %s loses accuracyillegal conversion of pointer to %sincompatible pointers in %sincompatible pointers in callqualifier errorincomplete type in expressionreturn in function returning void.'.3.6.A!.B-CU.Dm.missing or illegal qualifiersincorrect number of parametersincorrect type for parameter %s of definitionfunction is defined without parametersillegal ellipsis terminatorprevious (prototype) illegal %s parameter in %sdeclarationellipsis terminator in previous (prototype) declarationillegal ellipsis terminator1'13161operand of %s contains a const-qualified memberoperand of %s is read-onlyincorrect lvalue in operand of %sno lvalue in operand of %s~3'l3,l3/l3;l3<l3Ds33 '3,3/3;3<3=3>3?3D33C<43333:4C<44444::&%%5&\5(Y4*q5+5,9-O6/:5:8< 7> 7? 9[+4^\5|\5 5 O6 :5 :5 %566%5%5%5 7975O66 7 7 7697I5N5OO6illegal balancecall of non-function (%s)indexing an object of type %ssubtracting incompatible pointers;<:>:; ;objectillegal combination of %s and pointer@!?*<-a?~?X@X@1h@M=sizeof formal array %s is sizeof pointer!~ not allowed on %s operands& on register variable not allowed& applied to illegal lvalue& applied to non-lvalue& applied to field variableincomplete type in expression* applied to non-pointer (%s)voidlong doubledoublefloatunsigned intunsigned longunsigned shortunsigned charshortlongcharintcannot write to %s D(C2CECmainunknown return type for function %smaking function body for non-function%s has more than %ld bytes of local variables%s has more than %ld parameter bytes=JI(I-I2*IEWJbad local storage classsize for local %s unknowncannot initialize extern %s in blocksize of %s unknown%s has internal linkageK3J6JAwJsize of %s unknown ("%s", line %d)break not inside for, while, do or switchcontinue not inside for, while or doprocentryprocexitQ7PXPXPQQ!Q.QQ^QhQrQQPPHQ(conversion) illegal type conversionHR 'R,R/R;R<R=,R>,R?,RC3RHRU%DS&U*wR+S-S/R<GT>OT^ U|UTTTTTTmodulo by 0modulo by 0division by 0division by 0overflow in constant expressionoverflow in unsigned constant expressionsizeof (arith) insufficient on this machinearray full_mask too small for this machineDFA: %s: --none-- DFA: %s: %s formal parameters list discardedold-fashioned function declarationnon_empty formal parameter packoverflow in array sizearray size is 0array size is negative%s with illegal type%s with illegal typeindirect repeated type qualifierindirect repeated type qualifier%s formal illegalno global %s variable allowed=['"[3"[6"[AZB[C[D[\ [[[\n\ \\#\0\:\x\\\\\\illegal # line%s: unknown controlbad #line syntax]]^^p^^^ ^ ^ ^ ^ ^ ^ ^d^garbage following #endifgarbage following #else#else after #else#elif after #else%s: unknown controlillegal # linecannot open include file "%s"bad include syntaxbad include syntaxillegal #define linetoo many nested #if/#ifdef/#ifndef#elif after #else#elif without corresponding #if#else after #else#else without corresponding #ifgarbage following #else#endif without corresponding #ifgarbage following #endififndefifdefgarbage following #%s illegal #ifdef constructionillegal #undef constructiongarbage following #undefit is not allowed to undef %suser error: %s#define: bad formal parameter listformal parameter "%s" already usedformal parameter buffer overflowformal parameter buffer overflow#define: bad formal parameterillegal redefine of "%s"it is not allowed to redefine %sunclosed opening %clalalalllllllllllll %s "%s", line %u: fatal error --CRASH(warning)(strict)do,o<o=So>So?SoC?oo,o<o=o>o?oCop, p< p=p>p?pC4p?q,q<q=.q>.q?.qCqq,vq<vq=q>q?qCvqr'r,r<r=r>r?rCr}&}s^s|s},! }%q&Ms(x*p+n,z-o.z/]q<r=s>r?O{^Ms|Ms~ { Lu Lu Lu Lu LuLuLuLuLuLur{LuLuz rrrrKr{NLuOLuPl}Ql}Rl}Sl};~m#nQnn(EVAL) bad expression class(EVAL) bad operator %s EVAL: CRASH at line %ubad type /bad type *bad type -EVAL: CRASH at line %ubad type +~<~>~~~~~EVAL: CRASH at line %u@<>6,"EVAL: CRASH at line %u\     9[}NO\  ƀ Հ ƀNOƀ. ',/;<=>?C(assop) bad type %s +!%&!(*+,R-./:D<=K>?D[^(|/ K K K K KKKKKK6  =1IKMbad conversion to expression%s undefinedimplicit declaration of function %s =internal floating point overflow(float2expr) bad fund %s ݊,NJ7<@Ҋ(fill_int_expr) bad fund %s l'R,R/R;R<Rnon-numerical constant expressionexpression is not constantk)k4<ْ>. L *[+-/t<>ΓhΓ(fltcstoper) bad statusdivision by 0.0division by 0.0floating point overflow on %s#%d in %s, line %u`/`;`=`A4B !-2size of local %s unknown%s redeclaredformal %s redeclared%s redeclaredillegal storage class %s for function with block-scope%s is a function; cannot be formal%s has size 0void is not a complete typeunknown %s-type0(כ2E%g(כ2MEכ(2כE'(@25Etbad storage classillegal redeclaration of %sbad storage class%s is already declared staticbad storage class%s redeclared staticbad storage class%s redeclared staticredeclaration of %s with different type%s not in parameter listtypedef cannot be initializedmultiple initialization of %s'%s' old-fashioned function definitionincorrect number of parametersincorrect type for parameter %sellipsis terminator in previous declarationillegal definition of %snumber of formal parameters exceeds ANSI limit4,<=>?Cundefpragmalineincludeifndefifdefiferrorendifelseelifdefinedefined1__STDC____FILE__0__LINE____TIME__"%02d:%02d:%02d"__DATE__"%s %02d %d"maximum identifier length insufficientDecNovOctSepAugJulJunMayAprMarFebJanunexpected EOFmissing #endifredeclaration of label %slabel %s not defined__setjmp/usr/includecould not open %s%s %s: %s /usr/include/ڪҪ-%s: no source file %s standard input-use: %s source destination%s: destination file not specifiedvoiddoublefloatintcharsizes of float/double/long double decreasingsizes of short/int/long decreasingint_size and word_size are not equalpointer size incompatible with any integral sizemaximum identifier length insufficientout of memorywrite failedٳ SUƳdAfi۲lprswxcѯ)-ADcI&L@MST U,VPaPd@g-imn@o@p@s@w@-V: bad type indicator %c .maximum identifier length is %dmalformed -M optionmalformed option -D%s1identifier missing in -D%sillegal option: %cillegal use of void in argument listparameter %s redeclaredillegal storage class in parameter declarationillegal storage class in parameter declarationillegal use of void in argument listunknown %s-typeg'N3N6Nillegal storage class in parameter declarationno parameter identifier supplied'36fewer parameters than specified in prototypefewer parameters than specified in prototypemore parameters than specified in prototypeno parameters expectedtoo many parametersnumber of parameters exceeds ANSI limit) missing) missingidentifier missingtoo many macro argumentstoo few macro argumentsargument vector overflownumber of parameters exceeds ANSI standardillegal macro callunterminated macro callnewline in stringunterminated macro callunbalanced parenthesis,FL (macro_func)"illegal use of the ## operatorunterminated stringillegal use of # operatorunclosed opening %c'UUUx,%ld,%ld;,%ld,%ld;%c%ldx%c%s:%s:%ld,xe%s:;0;%ld;arr%d;%ld;0r%d;%ld;%ldr%d;0;%ld%d%d=%d%d:T:tchanged to externstatic function %s never defined, %smembermembermultiple selector %sdeclaration of %s-tag inside parameter listredeclaration of struct/union %srecursive declaration of struct/union %smultiple types in declarationtag %s indicates a %s, not a %sunknown selector %sillegal use of selector %s8',/;<field type cannot be %sbit field type %s does not fit in a wordnon-portable field typeillegal field-width specified=floating point type in switchmultiple case entry for value %ldcase statement not in switchmultiple entry for default in switchdefault statement not in switchdoublefloatintcharvoidwhilevolatileunsigneduniontypedefswitchstructstaticsizeofsignedshortreturnregisterlongifgotoforexternenumelsedodefaultcontinueconstcasebreakautomaximum identifier length insufficientYA)bad constructor in construct_typecannot construct array of voidfunction cannot yield arrayfunction cannot yield functionsize of %s unknownmultiple types in declaration'36sizeof not allowed in preprocessorD++++"+'+(+,+-+/+0+2+3+5+6+7+8+:+;+<+=+>+T+W+^+=S"'(,-/0235678:;<=>TUV[TkW^declaration missingdeclaration specifiers missingTK0"'(,-/0235678:;<=>[VttTNWt^t"'(,-/0235678:;<=>T7U7W7X7Y7]7^7=OTTTTT'''''%s is not a type identifierrepeated sign specifierrepeated size specifierrepeated type qualifierrepeated type qualifierrepeated storage class specifierregister ignoredstorage class ignoredTeTGG2illegal initialization of formal parameterillegal initialization of functionX="'(,-/0235678:;<=>TUVW|XY|[]mmWm^r1WZg^abcdeUXKtypedef name %s may not be redeclared as a parameteryyyy"y'y(y,y-y/y0y2y3y5y6y7y8y:y;y<y=y>yTyUyWyXyYy[2]y^y[multiple types in declarationU\5unexpected trailing comma in enumerator packUR"'(,-/0235678:;<=>TUWXY[]^j[bmultiple types in declaration"'(,-/0235678:;<=>\TIT>U>]gW]^'    " ' ( , - / 0 2 3 5 6 7 8 : ; < = > XWWUu"'(,-/0235678:;<=>UgWXY^X=UwwmmUmWmXmYm^((W6llW %%"8U%W%X%Y%^%repeated type qualifierrepeated type qualifier=seeW|k                                            illegal pasting of string literalsN l l l l l l 1l Wl XF ^l al bl cl dl el   W3 Y _  kG         G G G G G G G G G G G G $ $ $ G G G G G G                                                       G G G $ G $ G  G G G $ G G G G   G G G G G G                  1 U V W X ^ a b c d e        1 W ^ a b c d e        1 W ^ a b c d e type k                                                                                                    T U V X Z \ ] `> D D D D DDDDDDTUVDXZ\]T JXXanbQcQjnkn|uu^uaubucufugujukubb !#1$%)*`+.N49Tr[@MMMMM1MWM^MaMbMcMdMeM]NNNNNNN N!N#N$N%N&)N*N+N.N1N4N9NTNWN[N\N^NaNbNcNdNeNz1TrW^abcde&&&&&&1&TW&^&a&b&c&d&e&1WX^abcde||||||1|TW|^|a|b|c|d|e|dii !#$%)*+.149TW[\+^abcdeB1W[Q^abcdeillegal initializationU\ 3J 6i A" H unionstructarray element!3 6 :!A B!H!selector#3 #A"H#I$3$H,$0&3[&A&0selector0*'!(****(**(**********&*((\)\)\)***()***)check_ivaltoo many initializers0struct membersize of %s unknownillegal initialization constanttoo many initializers0W 0 0 0 0 0l-v------ - - - - ----. .. .*.4.>.H.R.\.f.p.z... .!.".#.$.%.&.'.(.).*.+/,/-/.$//./08/1B/2L/3V/4`/5j/6t/7~/8/9/:/;/</=/>/?/@/A/B/C/D0E 0F0G0H(0I20J<0KF0LP0MZ0Nd0On0Px0Q0R0S0bad tokenend of filefloat2floatfloat2intint2floatint2intpostfix --postfix ++unary &castabcastinitcommaparcommaerroneouslabelformalglobalfieldpointerfunctionarrayunsigned longlong doubledoublefloatintcharvoidwhilevolatileunsigneduniontypedefswitchstructstaticsizeofsignedshortreturnregisterlongifgotoforexternenumelsedodefaultcontinueconstcasebreakauto...||>>>===<=<<->--++&&!=|=^=&=>>=<<=%=/=*=-=+=floatingintegerfilespecifierwcharstringtype_identifieridentifier$Id: rec,v 2.23 1997/02/21 11:23:55 ceriel Exp $fatal error: out of memory fatal error: out of memory ;:G;/tmpinternal error ccccccYn+InYnDn_o+Oo_oHo|b|d|o|u|x|%Jπ1J //usr/share/zoneinfo/etc/localtimeposixrulesTZ Thu Jan 1 00:00:00 1970 .Ũ Xգ IIbԤIII¤ˤOЦfbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@}E˯GMe˯fgM$@@@))))))|)t)l) d) \) T) |*x*t*p*l*h*d*`*\*X*T*P*`*,7 $7!7"7#7$7%6&6'6(6)6*6+6,6-6.6/60616263646566x67l68`69X6:P6;H6<D6=<6>4606    }@ @ B}p}`X> @`@> }b b bB}B g@>>?@??@g@>`;NH>gH>dgaWX^cUb_f]ThVi`YZj[k\e  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRScT }@U`@>VV`@>W }@X }aY @f'jYZ }_[p;\@=e] @Y^ }X;_{}` @]a }'8'"'''''''b'cbHc'd }Xe`H>f k'(Y)g }wh li[]j@*{k l km{n}n ko{}p }dq;q `rr `s :Vt(du)uBv'juv'(u)w }xx }Xyy Bz'jyz 'k'(y){|}'~''()~`@>}`@>`@>`@>t'''`@>1`@>?@`@>@@*'/'% +'-' <'>'''@ '''&'^'|`;NH>':'_'''''''' ;'#;''';`@>; k+()9() %9();)(;;)4()!V:$:@.;*k;{}`H>e }@W' }X' @Y'; }a'()'i' }^'@\' ,]'@\' @`' }^'`;NH>' ,]'!$'2'('5'-/',0'7|:';'<'='>H3'6 o'k m'k`H>' ,' ,l'`@>V' ' ,n' ,'@=V' }p }' ,r' `Y's()'i' ,x'()'i'8'"''' ,'[]'()'k'' ,'@'`@>*'&'-'+'!'~''`@>t'?@'?@''''?:'@=' ' ' ' ' '''''@&'`@>'`@>'`@>'`@>' ,e' ,' }pZ'[ }g'h'o'm' s' }g' }g'h'`@>'.'`'dgaWX^cUb_f]ThVi`YZj[k\e  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS|d88 @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%0123456789ABCDEFSSSSGMThedemnSunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec ((((( AAAAAABBBBBB $ ii hi 0000000000000000  0\ %401$T$L /@ 40s=@ SSSSu @ QRP/ Pc"UVu}|U R/ /5/Yu 5xHYV Y55YY}|U rYu$h YjYu hY[> c> u5xh YY=xt5xhIYY>tVVYu5/h$YYV Y\5/?!Y^U5=/t/4PhDh%uuuu uh h0hYY/UTtuuuu uuj YU=` t  9` s ` 1h` h hh 5\ t'= ~ ƀ ` ` SX  Ud : t=xu UxUd  =xu UxUVW` :t ` Nj` :t ` Ɓ| _^UVW` :t ` Ƌ` :t `  Ƌ` :t ` g Ƌ` :t ` Gǁ| _^UVWu ` :t ` xV`` :t ` FF vFF ~l=x_xP` :t ` BF'F~ =xxF`F`jYEPVjuYEPVFVjfYYEPj`YYYUViVj`DYYVVj YEѺURV0jYEURVEV l }=x\u hYJ|| hfY0Uu=xu x}u_^UVWUr=wI u >_t10FE8O~"=wI u >_t1F۸_^UVW EPj`YYUU}h(YV9Uv9~uVRYFUVRvYYFU~M| ` :t ` GG}tVYu=xu x_^UVWu` :t ` ;=}~~}&|u~_G;FV *F` :t ` F F[F ~ =xxF ` :t ` 'F F F ~ j=x]xQFjYEu F ,URV ! h|4Y D_^U= tx1q}t$h\ ju ux1G\ U|0 ` =tx1 U=\ t5\ 5Y\  UVuFPj`YY ~  A kƁh FPj`WYY= t 9V t=xu xLV  V  A kƁh FPj`YY= t 9V t=xu x V  V ^UVWux= tM hh V19= ~#Bkkh Ph S]Gո5d = uxp 1= VY1=xVJ%EE$ ߃}uF}t FPWYY= K= >~ ~=xu tx~ =xtx~`~ }=xu tx~ |F V ډЉE `҅U=xtx~u F q `҅V t=xu tx~ =xu tx~ |F = =xtx~ ~%F = N =xtx~ | ~ =xtxtEEPj`YYUFPh;YYEPj`YYU.=!=xxLFPjPYYFPh;YYEPj`)YYUV EPj`YYUVFPhYYEPh`YY}u FUVvFPh`YYaFPh?YY HFPh?YY /h@7Y"FVY |= u'=xu  x 1=xFPhYY=xt> t1~u== u! 1=x[ VYH= u1=x+= u FF1=x_^UUVuvYVJ%= u~`u V V FVJt jVYYVYshYv Y]jV]YYQoJv Y_:v YO*v /Y?/1 ^UVu} +>uVJ%=t!>uv Yv Yvv yYYvv YY~v Ypv Ybvv YYSvv h >vv h )vv h  F ^UVuvLYv aY vSYjVYY53YjVYY5Y5YjVlYY5YXjVLYY~t vY81~u$v YjV YY F ^U=q=/u(h Y/. /,.R5/sYY/.%../G=t1-Ph5/ u/U9u EUU}u /h/ju u1U=/tE=/t+/ /IQ /=u j/Y5/xYy=/t 5/6Y/U1=/UUVu>t&9u F^UuYUuhXEPY EPYU9u UJXPbY9u Uuh`EP EPYUV9u:'Pu ur ƀ>tL>'u!9u\9uF믋9u'^U9u UlP'Y9uR UuhdEP EPYUuY} tu hlEPj EPYUuY} tu htEP5 EPvYU9u$uGYUuh|EP EP!YU}uI}uUFEu Y9uEuzYU9u U9u,U9u?Ujhh jJYUVu Yƃ}t uV^Uu uYYUV}u u Yu u* YYƃ} t u^Ujhh jYUUURu P PPu UUUjuuu uJ ZY EU#+ $E1U$VWu }>W>%CEF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUur1YYEINU܉U@PYEtUUurYYE>%u EU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}uU IM b- =^w?\t?"u\FGF\F%0F%0FG%0FE_^UVW}/1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋EN} N} Džu}t N-N0_^UVuFu+UJ^UVutF6Y^UVWƅ1juYYDžv1juYYDž}juYYu#1XjjW }5WY1E0_^U}u1!Euu 0S ]1ۅÉUj0Yj(Y EoUVXs~u1^U}u1Euu 0 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PS1ۇP tPXPw{cU$UUEEEoqrstuvwEEEPjj U$uEPU UEPj!jU$UUEEEEEEPjjp U$uEPjU UEPjjBU(UUUUU UEEEEPjj E=uEUu BUBUM JUju RMU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjjG ^U$UUUUU UEEEEPjj UVuU VVuGYYEtF~}VډD F^U$UUUUU UEEEEPjj UEPjEPIjwPjjjaPj(UVW5/VUT>M}}6u݃=/t/uY_^U$VW=|/kǣ|/jYƉI!)ى}=|/tWhY=u1%EE95|/wU/|/9UwEE#|/U/UUUtEU9UwU/օUѺU~W9|/~5|/}EU5|/EVY=tU</ U։MU/օU /UVF_^UVWutVր:uV׍/׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5L uYYƅ}NU9|/vm |/U}tFt*N9|/~  |/֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E/9} t9uuEG6uEE}|и_^USE] ![]USE] ![]USE] ![]ËD$D$D$UVWMKE_^]U} |} ~D M E 1U} |} ~D M ҋE!1UE1UE1U} |} ~D M Et1U(UUEEEEEEPjjL E=u UX 1UVW5X X }׃}~9r}}9vWqYu_^U$EEEEEEEPjj U$UUU UEEEEEPj%je U(VWu UJy$Id: convert.c,v 1.11 1994/06/24 10:35:42 ceriel Exp $T.0123456789ABCDEFaaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrlbssconendexaexcexpholinainpmesprorom < +776   90   `````|```` SSSS ((((( AAAAAABBBBBB 40  T1$T$L lTs=lSSSSu lQRPPUVW=uP~4 t>t >-tVF YO݀=<t h</ Y=t h Y_^U5h8hf u uhS h4hAYYZj YU=| h@YA M U= @| hPgY A M Uj: YUV= t#=u4 YF^UVW E}E_^UVW =ujBh< YY-<?<J    G뼃=| @9~C0_^UVW 5P YYhP YYU4P YY  < F= 8i  < F  pK=uX J| B0h WZY `Ee }hY=tLDž< t!4 hh hhYYh 5 ( YY5 hYYj YMP Y9u닕t5 hxYYt ejY_^UVWu 1hgjYY=u jjYYhgjYY=u jjYYhgjsYY=u jjaYYVM :-zVMNjzz2tztz3uLvpghRYYQj YjY8hRYY"j YhRYYjYhRYYjYhR]YYjeYhR6YYu jBYyhRYYcj YRhRYYu jY/hRYYuj Y BB65WZY6kY== t  = ujY=u hhY=t3hdh<RYYh`hAYYh\h<0YYhLh<YYh< Yh<hYYh Yh(h<YYh< Y~h<<PYYOjAh<YY-<Ƈ<pƇ<pƇdƇdƇ<lƇ<lƇbƇbjYjY:t2Yj Y/jY_^UUURu PR PPu U#+ $E1U$VWu }>W>%CEF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u EU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋EN} N} Džu}t N-N0_^UVWuFuNE E Fu_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVuFu+UJ^UVW}1?tG9E uN_^UjYjY EWUVls~u1^U}u1Euu 0 19EuCË+C;Cw Ë[ uӅu P-KI|;u[u Pg1ۇttPXP+_oU5lu uL U$UUEEEEEEPjj ULVWEEE1u *6YEEE9EvEEG>uыu)6YEEE9EvEE>u҃E E UU}u} spuYE=tދE8UUU}׋u 3+UEE66EP6WA}׃>uȋEEu3+UEE6EP6W}׃>uȋEEGUU9wuEUUUUȋUUEEEPj;jUR_^U$EEEEEEEPjj U(VWu UJ<UUtuuUJ4EdEEEEPj0j: E؅}UJ<EUJ4}u_^UVuU VVu?YYEtF~}VډpF^U$uEPJEEPj jU(EEEEEEEPjjS E=t}tUEEU$UUUUU UEEEEPjj UEPu.YYtEUjuYYtE1U(VW ƋUUU:tE10M1ƋUU:Xtܾ/}GOU 9uBEPuYYt1U܁@t pۋU/ MU9Uw} t3hhu ] | b=pt"돍EPu YYt=pto>d>zuFa}ta{@p_^UEPjEP9jgPjjjQPj(UVW5LVUT>M}}6u݃=PtPuY_^USE] ![]USE] ![]USE] ![]U`E]]PXa]UVW}u MU} |} ~pM E 1U} |} ~pM ҋE!1UE1UE1U} |} ~pM Et1U(UUEEEEEEPjjL E=u U 1UVW5  }׃}~9r}}9vWqYu_^U$EEEEEEEPjj U$UUU UEEEEEPj%je Uu UBUM JUju REU,VU @t=Uփ֋ru|YE܋U UuUUEEU UuEPjYYEPjj ^U$uEUUU UEEEEPjjpUVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UVWME_^]} 0)ʇʋu }cacjbospralvudsrcsilcfic %s: too many filestoo many phases <%s got a unix signalCould not exec %s %s Could not fork--/v B:CI LOPRaS Utv/ego.A.BB.XXXXXX/ego.pd.XXXXXX/ego.dd.XXXXXX...no correct -P flag givenSPSRCJCSLVUDRABOIL bm dt o{ u x %  0,($  /tmp/tmp/tmp   < 100123456789ABCDEFSSSS ((((( AAAAAABBBBBB T  @4 *51$T$L l4 5s= SSSSu  QRPh4 PW,UVu}|U Rp4 p45p4Yu 5PHYVvY5`5\YY}|U rYu$h YjYu hYS> c> u5Ph YY=Pt5PhIYY>tVZYu5x4h$YYVYT5t43+Y^U5X=p4tp44PhDh!uuuu uh!h0h!YYt4ULtuuuu uuj*YU=8 t98 s 8 1h8 hhh54 %t'=~ƀ8 8 SXU< : t=Pu UPUVW}1?t G_^UVu YF| փ< uU ^UVJ0PVYYF⾖DPV{YYF^UV8 :t 8 x! t uՃ;u'8 :t 8 Hƃ tuى^UVuY 8 :t 8 = tuׅ|8 8 ^U;= thlY$UVW8 :t 8 =070E}V8 :t 8 M=0|7~|8 8 D0E렉1* #   #_^UVW ~uFh\YljF8 :t 8 E! u2}_t,}|8 8 h&YE! u }_TVV9w$+VUFvvYYF}NjUG8 :t 8 E떃}|E8 8 +V_^UVW wuGhAYƉG8 :t 8 x8 :t 8 XE= t}u-}|E8 8 hYe9Uu="MFG}\u9EWW9w$+WUGwwYYGuƋUFC+W_^UV=+t-u-EPj`YY-u UڋE UE &E |8 8 E^UVWuE `Dž+t-u'-uG8 :t 8 ! u/|8 8 hzYDžU9rh TYG8 :t 8 `=.t etEu1.t@Dž뗃tDž+{-r! e|8 8 HƁu5Ft0|8 8 hqYItUt F}P5 YYU JPj`YYU J3E aE QE A(|8 8 j P`YYU B_^UVWu} (u\W&P(YY=t h<mY3=)t%|8 8 h,8Y WV*YY_^UVWu }VWrYY=t=*t-/t(%t#{8 8 `VUVUPYY=t hPY8*u UVV댃/uNEFvNEVe_^UVWu }VW YY=tx=+t%-t X8 8 @VUVPYY=t h`Y+uUV똋U+VV델_^U 8 EP:t 8 PYY=t hpwYEt=Pu LPEUVWu = u&|8 8 E! u+t -t(u=VWYYE=P~C~6E*! u_uC|8 8 PVFPhYYE.u&F FPhYYE*uFE$uvPVEm"t'uB|8 8 jNYEPVEVE!?uE hY7UUMUu hnY}u_^UV=t:=,t, t h.Y-|8 8 u uYY^UVWu }|E8 8 ,wYEE}|EUU UuhYq}(UJ0PwsYYuUV@UDPwFYYq}u UV_^U EPj YYUXEPhYYuuh7 TUVu }|E8 8 FPjLP0~ |~ ~$=PuLP tE5EPj`pYYUdFPh;WYYEPj`JYYUh=h=PPLFPjYYFPhYYEPj`YYUV EPj`YYUVFPhYYEPh`YY}u FfUV^FPh`sYYLFPh?aYY 3FPh?HYY h@TY F~t%~tVY t= u'=Pu  P 1=PFPhYY=Pt> t1~uB6= u! 1=P[ VYH= u1=P+= u FF1=P_^U帰UVuvYVJt%= u~`u V V FVJtjVYYvVYjh?Yv YTjVTYYHhY;v KY0v Y%v Yx41^UVu} >uVJt%=thY>uv TYv Yvv YYvv zYY~v Ypv Ybvv YYSvv h >vv h )vv h  F^UVuvYv ~YvuYjVYYhY5dJYjVYY5h4Y5d#YjVjYY5h Y_jVOYY~t vYDh Y7~u hY$v YjV YY F ^U=lq=4u(h Y43 4x,3R54YY43x%334tG=xt1x-Ph54 u4RxUt9xu ExxUU}u 4h4ju u1U=4tE=|4tx+4 |4IQ 4=pu j4Y54tYy=4t 542 Y4U1=4Ut9xu.xxt9xu xxUVuwLt9xuxxt9xuxxrt9xuxxt9xunxxt9xuHxx^UVuwLt9xu xxt9xuxxrt9xuxxt9xuxxt9xuxxx^UVu|1x},t9xu9FxxxZwt9xuxxt9xuxxt9xuxxt9xu~xxt9xu]xxt9xu7xxt9xu xxt9xuxx^U} u uY3t9xuxxuYYu YUVWuV YPYO|&t9xuLFxx_^Ut9xuxxuYU} u uY3t9xuxxuYu cYUt9xuxxuYUt9xuxExxuYu YUVWu} t9xu2xxWYO|&t9xuFxx_^UjhXh jYUVu0 Yƃ}t uV^Uu uYYUV}u u Yu u YYƃ} t u^Ujhxh| jYUUURu PR PPu: U#+ $Eo1U$VWu }>W>%CEܼF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurYYE>%u EU܉UuuGYZ)‰UUIM~UGEEGuOFFG+U_^UVWu} uUIM~GFE_^UVW}31} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋EN|} N|} Džu}t N-N0_^UVE-0ƃ w-E-AƃwF E-aƃwF E ^UVWuE1>-uEFFu PYYE9E ~ U ׋}܃}tډ_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVuFu+UJ^UVutF6Y^UVWƅ1juYYDžv1juYYDž}juYYu#1XjjW }5WY1E0_^U}u1!Euu 0S ]1ۅÉUj0Yj(Y EoUV0s~u1^U}u1Euu 0 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u PS1ۇ( tPXPw{cU$UUEEEEEEPjj U$uEPU UEPj!jU$UUEEEEEEPjjp U$uEPjU UEPjjBU(UUUUU UEEEEPjj E=uEUu BUBUM JUju RMU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjjG ^U$UUUUU UEEEEPjj UVuU VVuGYYEtF~}Vډ F^U$UUUUU UEEEEPjj UEPjEPIjwPjjjaPj(UVW54VUT>M}}6u݃=4t4uY_^U$VW=`4kǣ`4jYƉI!)ى}=`4tWhY=u1%EE95`4wUd4`49UwEE#`4Ud4UUUtEU9UwU3օUѺU~W9`4~5`4}EU5`4EVY=tU<3 U։MU3օU 3UVF_^UVWutVր:uV׍3׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5$ uYYƅ}NU9`4vm `4U}tFt*N9`4~  `4֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E39} t9uuEG6uEE}|и_^USE] ![]USE] ![]USE] ![]ËD$D$D$UVWMKE_^]U} |} ~ M E 1U} |} ~ M ҋE!1UE1UE1U} |} ~ M Et1U(UUEEEEEEPjjL E=u U0 1UVW50 0 }׃}~9r}}9vWqYu_^U$EEEEEEEPjj U$UUU UEEEEEPj%je U(VWu UJ<4UUtuuUJ44E3EEEEPj0j E؅}UJ<4EUJ44}u_^UU`E]]P4Xa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]} 0)ʇʋu }%s%s%sC_open failedC_open failed standard input%s, line %d: Argument range errorend of line expected1bf nrtLetter expectednon-terminated string F I U 'F' expectednumber too longdigit expected')' expectedexpression expectedfactor expectedterm expectedinteger expectedBad argument typeoperand expectedcomma expectedbad mnemonicy`G d\Could not open input fileEM_open already calledDifferent pointersize in duplicate ms_emxDifferent wordsize in duplicate ms_emx j=XLD ttD+ QwEM code should start with mes 2Bad pseudoThird argument of hol/bss not 0/1Initialization not doneU'4?JIllegal EM lineu `  '6K `f Hfffff read, write, or open failed Out of memory #b#d#o#u#x#%(''('}(m(u(}($Id: convert.c,v 1.11 1994/06/24 10:35:42 ceriel Exp $T30123456789ABCDEFaaradfadiadpadsaduandaspassbeqbgebgtbleblmblsbltbnebracaicalcffcficfucifciiciucmfcmicmpcmscmucomcsacsbcufcuicuudchdecdeedeldupdusdvfdvidvuexgfeffiffilgtoincineinlinniorlaelallarldcldeldfldllfrlillimlinlnilocloelofloilollorloslpblpilxalxlmlfmlimlumonngfnginoprckretrmirmurolrorrttsarsbfsbisbssbusdesdfsdlsetsigsilsimslislusrisrustestfstistlstrststeqtgetgttletlttnetrpxorzeqzerzgezgtzlezltznezrezrfzrlbssconendexaexcexpholinainpmesprorom < +776   90   `````|```` SSSS ((((( AAAAAABBBBBB 5  1$T$L % s= SSSSu QRP% PcdUVW58);YEEURjHYYǃu h<gY()uV58); 58);YEPjHYY=u h Y()uR58)L< 5()UIMtU9| hY>ڋE_^U VW!E%EUUE}()u֋>W1YPW0YYEt PtEEMvO,Yh@'Y4)= tjjjWhXEVUMEE}~U9Vtu4Yhc$Y2}jH.YjY_^UVjjF&YY=u hdY)M ^UVW=)փ>t*6`+YhQ&Y4)6э=_^U, t5 EY, PaY5 aYU, @f, uuuu uhxUuuuu uhRU, @f, uuuu uh#Uuuuu ujU5<)hhp H =@)t)=4)t 54)5@)hhp HD=@)t5@)hhp H !=4)t54)hhp H uuuuu hp jH}tuhhp OH bx Jx }D9 ,p  p : tp /hp j ^YYhp j ^YYp  p Ug$)( REP.BEPYEPIYEP )YUVWuV UVkEVkV k ىMVk^ VN k ׋UIM)( UREPA}t"9}| V9U| h>YU)UEPJYUuU)UURjD YYEU€t EPqY6 u+Uuh Bfh EP !YE E _^UVWED)U L/Zفf L/UR P/U J/Z9~UfRfJ/)( ׃UJMD*UIMt= tV+V P/W VV W V WVVEE_^UVW}Wֺ!Ut=}t7}t1tƀu!hY!D)W_^U VWu)( >W+YEPW*YYEuLl Bfl uV*YYVP= tGjjjWh1Vt(UJu>uVYY >uVYY_^UVWu} Wt&V[6h4YYKVu0VO9t6h YYW9V~VW WVYY_^UVWu }WVfWfVfWfV_^UVWQ )5( ( U)( Nk׋)( NkN k Ӊ]SVWK WuVs =$ u u F PWYYFPu-YYV$Y_^U VWuuU J ϋU JkU B JU Z k ȉEJWZt>t +UU =$ uU B PuYY_^UVWuU уM VyV(UR(YPu'YYNj t +( Йh ‰V.WVV fVWN сfN \_^U$VW=$ sUJMu %Yy%NjUIM(G-9tG-Vu u% EjWuuu01UJ9kE x 4 VP)YY Vu ur% EyUJMuH$YUIMt?$G-9ujWuuu tjW8YYkE p Vu( kE P UEVEPu_% E}U9U~EEEPu<-YYUJMu#YUIMP#G-9uۋU9W|U9W}uWuuu tjW7YYuVu' U+UUUUAu$Y UkE k] H+K  E܉F_^UVW}U уM tCV€u5Vu)VYV:YjV'YY VP9 뮉+U ЙPu7YY_^UVW}D)U уM t W_^Uu u~YYu Y=X/t$u YUV%()w--% vvPhLhp ?> ^Ujh >YYjh >YYjhp q>YYE <)\/D#fD/fF/U VW}?7>-VYFVUYEj:V&YYƅu hlYFVmYPu"YYFV[UYEj:Vg&YYƅu hHYFV2YPu1YYg% T H 5h4>Y% t hNY  th,Y ?u hY7##YEP7!YYu7YPF"YY |X/mPhYYXFp6_^U VWuEE >0u.EF>xt>Xu EF>bt>BuEFFDž^A| F7+a| fW0| 90 WhYY9}uWh UUU딋E_^UVWu }h(WYYt940t hkYu h\Y40_^UVWu} h VXYYt9<(t h!Y<(_^UU0f480UuYuuYU~ ukUVWE5(l ׉JWZV|}u[E u h$hp 9YYH/fH/ u/ (Rhhp 9 ` 5(l ׉JWZ}VhVRVUVUkE`/H*VU`/UM EVfV t_^UVWEJ/kE1J/9D)kƁD*UVV U `/Vh(WHYYt 0Fh W&YYt*(U~t8NEt+h0vY~tVJUNE+UډUUVUG*_^UVW5(l ׉JWZ~ VY =$ t&5(h ׉JWZ~ VY _^UVWEEEUU UƋMtM֋U U 1_^UVWEEE׋U UƉֺ!_^UVWUJ!Ήׅt(t#tUJukD*EP_^UVu\/>t&:-t6YBD$1^UuRYuuaYUVuV?!։u=@t95@|<R1Y=u=@t95@~5@<<1^UVW%%%@(`(@(@(@)@ ) )$)0) Ej0Yǣ<t"RY0YjO0Yǣ<%4)T>F(t(u)~uFE~׋VUNF ~׋VU u^Y=o$ jAY=u h\Y=<%4)s8>(t(uFFFF _^UVWu ~VY=u  11S=X/tVhlhp 3 ()kE %9sVW<YYkE %EE_^UVWUUUU%()s kE Ɓ%}uU VU9U }U } VUUJk Ɓ%%N}u1VׅuV9~| V)UU 9U|-% E릋U9UfBk Ɓ%()N}u1VׅuV9~| V)UU 9U|-% E 릋U9UuE9UuEU 9U}1vEEHEkE Ɓ%kE %9]}t uV9YY}tU 9U}9}t1VׅuV9~|V)!}V)V 뒃}t uVYYVUFU 9UEkE Ɓ%kE %9`}t UU9U ~9}t1VׅuV9~|V)!}V)V}t uVYY돋UUkE %EUE%()s U 19U|@_^U VWURUE8U ډ΋E0UIMtGF_^U VWURUE}׉u ֋UIMtONE0_^UVW} 1kE %UkE %UuEW |E~*+U~+U Йi ƅtJUU9~UUVRuYYZ)‰օ~%Vu}YY9t5, Wu t/kE %EEkE %E)EE$ _^UVWu uYY=te1I} VY )FCu uYY=t%, u uYY, _^UVW)V+( U>( UUIMt EEGV+( V( V( _^UVW}k %k %k ǀ%_^UVW}u WYY=u1 k %_^UVWkE k] %%kE %Ɖ+U +ډkE %Ɖ+U _^UV( =$ u/1I} V0Y 'FjjjH ^UVW1fJ/fUJ/kP/L/ N/k ЉE uTh P5(lYYuh P5(  UMl RQ5( hD/ YEPhD*!YY%(sBvW6  tL/P5(I$YY u^h P5(%YYU l R5($YY(5 R&YY(5 R&YY_^UVWu} WZt>tUJ _^U5 Yu5 hYY=$ t| u fL/ tfN/T/8l  h  J/сf N/  T/=$ uU VWJ/k EPjBYYƅt>1J/9~1WfVfFkD*VG _^U=$ u u &UhYUVuE tNщVщE t/NсfMVNсfM-VсfMVNсfME tUMщ3UMщ"hYE % $^UVWu }EtFFE tfU!fU!fUfUEt.UEFUFEFPfUUFEFUF h@YE%$"_^UVWUJk U fh fUEUWtCWUD)UkED*Ul UMсfM7YP7Z YYƅu7hTYYVt VuV1YUfUWVUVu"J/ l MсfM#V l уUʁfUUEE_^UVWuF-V+UU PRYYEUJ V9}EPuVw %fF#l  h  J/сfNtkD*D)+UډUV+UU PRu D)V_^UV=$ t%jjG6YYƅtf,( ( ^UV=$ t.jjGYYƅtuV ( ( ^UVW} u1)( U RY@ƃ}Cu*5 =$ tVutYY=u(G5 VuQYY=u&)( U kE %RQGYY_^UVE0jCGYYE=t$j jA YYƅtuVU^U Vu@)4)=\/t =$ u:jV YY8)} VhYY58)Y%fE)( DffUjY54)15@)=\/u4EP58)YYhEP YYt.VhzYY=$ tD( ( VhEYYpE^U=\/t =$ u 58)YUVu=\/t =$ uV58)<YY'5DVD( ( ^U=\/u58) Y=$ u58) YU VE)5( փ}t( URVXYY)( NkF PRYY)( NkN k vR2YY^UjjGVYY=u hY)( R Y)( REPEPYtEPYt1UVWEUfRfUUu#Y-)EPjGYY=u h!Y)( UEPRu YYUIfMt$~~VJVVNRY)щNǃ=$ tWjG2YY=t1_^UVW}fWfUfWfUEwBYWkW k Mw!YWkW k WʉU1U9~.Vuu8 u1)EE]]FURuYY_^UVWU4T)( UR Ut?t;Vu)YYE=t k] %}׉JVZt G1T1)( UJ+MU TuuYYE=t)( U 1_^Uu j@YYE=t)( U1UVW)( MRqYUJkUJ k ZE1UJ9~.W/ YU kE %r Q4 YYEE GNj)( MRqYUJkUJ k UZZӉ]UE (BPQ YY_^U=\/t =$ uju58) UVuYƃ=$ t/V( ( =\/u&VDDjGY( ^U(VWjjGYY=u h$]Y)=( WRYfWfUEfW fUWkEWUWkW k ىMWYU)ډURjG]YY=u hY)( u֋)( UU)( UUEPV YYUIfMt$~~VJVVNRY)щNEPu YYuu| YY_^UVuV^UVuvYVkV k Vʃ^UVu=$ tC5DvYVkV k VYыU(HfP@VYfVfL^UV=$ tHHPsP@uHL@|@LL)fLVhTYYfPPAf PTPX^UVW}=$ u;kE p jGVYYƅu1]WFYkE p VTYYAU5DrNYUJkUJ k ZʋUk %_^UVW@9ut&VjGYYDžtuYE 0h@ Y1_^UujGYYUVT s ^UVWU TU}K)}׋(UE(UuEE9u FuE WU1_^UVWE0jDYYEjjEYYEj jBYYǃ}t }tu h`Y)u։>(UuuUEU TVU M T_^UU+( ЙUVWufEFDžt#UfUUfUӹ3E_^UhxIYUVD/VK YFPhD* YYVkF VN k У ^U$Uf(f*kED*,$UVW5(5 l PV` l PVYY(5 R2YY  1J/9~jWNYPeYYG_^Uu YuuYYUVWu uYt(|Wh$hYY)_^UVWu>t%6Y@W6YY = } t jV)YY_^UVWu }F9u Gu1 N)ۉ_^UVWuE E Fu_^UVu>tF9E uN1^UVuFu+UJ^UVU48950tjV54 uu 54 u50U48^UjuYY4}1 54YUV1}8FPjju2 H}1*H08U4L^U54Y4U4UVW}jWj VN V ˉ_VN V ˉ_ V сfO V сfOV сfOV сfOV сfOV сfWkG HE<WUU@W k EUD_^UVWuVkF =Hlj=<_^UVW}kE kE PWjn kE ׋PU PU уM VN V ˉ_VN V ˉ_ VN V ˉ_VN V ˉ_VN V ˉHW PI P4_^UU48ULUVu uj4 L4֋M  ^UVW}U RWj U ΋U ϋU уM MVN V ˉ_V сfONON_^UVW}kE PWjm kE kE ׋U уM VN V ˉ_V сfOV сfOVN V ˉl_^Uu uj U(VW} u}jVux E؅u1}tEU؉IM؅t FU܈EV щGV щ% GFG&FgV щfGV щGV щ% G_^UjEPu UM U] ˉUVW} URWu U΋UϋUIMtLVN V ˉ_VN V ˉ_^UjEPu UM щUVW} }t=U9  EVWuu 9t׋U)U_^UVuV9Vv6V+VRvv# V+VV sN T VVVV^UVWiE Ɓ`0VU> u9}~CVpYWu v U)UU U ~ s?N T-})E~E E U EOUV>t > VY#UUt?uu v UU U eUV sN T}t0EVU)~E E U EOUV_^UViE Ɓ`0ju v F }|E #U ډ +NʉVV^UVhu8YYP(Y`0sju(YYF}1 T^UV`0sVYvYF ^UVWUJkUz jjYYWjYYUJWjYYUJ k WjYYuU ωFUJωFUJωFUJωFUJωFUJ ωFUz FFFUzFFFjEPjT _^UVWU UUуMtG=T~=T}Ur5TLYYU TCrTTEkE EE} `0E5d09E sU UU +UU kE+`0أ`0UуME8FFFUzFFFUzFFFUz FFFUzFFFE5d0} }h`0Ym_^UVW}h`0=|i Z9==yV+VRvv V+VV N TV 9Ttj4Tv F #T ډ +NʉVV=_^Uu u=|PP U VW}} E59E sU UU +UU U+ډUуMbFOFWUUFWUUFUFUF닉5} 3hY#_^UVW}  E59E sU UU +UU kE +أUуME8FFFUJωFUJωFUzFFFE =5} hY_^Uu uj UVW} }t=U9  EVWu 9t׋U)U_^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇ tPXP#_oU$UUEEEEEEPjjX U(UUEEEEEEPjj E=u U 1UVW5  }׃}~9r}}9vWqYu_^U$UUEEEEEEPjjp U$uEPjU UEPjjBU(UUUUU UEEEEPjj E=uEUu "UBUM JUju R$U,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjjG ^U$UUUUU UEEEEPjj UVuU VVu{#YYEtF~}Vډ F^U$uEPEEPj jU$UUUUU UEEEEPjjV UVW}kT PYEu18u EUzUrTh$PO}E_^UVW=u wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW#Ǿ >t 6+V~ WY_^Uhep>YU}LUUURu u" EU VWE %wWUV tVUY ETM}?u׋E_^Uh} t1Pu uUV}t }t}u}} uV"YFFV €t vYF %|fF EF fF VCVF0F fF UډV}LU VUVV tV t1EF1^UVuFuu P E|FPF %fF E^UVuV tFjjP F %fF ^uu Se ^UVuFuu P E=u^ fF F fF UVPE^UUBPYUVu ~u F1Vu!YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPq YtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQYYt5uu55N}E-EEuuYYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEExM@ExUURUuEp}|4uju t+EE9EU܉UuCYEMUutUU#J UUBEEZE\EHUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!,URYELEd+UU1}=UM EEUUU}tE U@tEU9U~EEEU0U+UU= FEE}|EPu YYdm} UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5(5$U t1uu505,7 }MmE}tW9U$vFMF0}uUt F.1uu5854 $}EPuu5@5< YY EUuujj Z0Fuu5H5DP tMkuu5P5L) tMEPuu5X5TK YY EUuujj Z0Fuu5`5\tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF dE+U _^UVWu u55)t'EPu u55KYY E-0PjEEu}uu55~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ V Yu1NUG9~tV t} u V\ YuE_^UV=uuV ufV u V t:~0tV@9V0t v0]YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^Uj jum UVW5VUT>M}}6u݃=tuY_^U$VW=%k ǣ%juYƉI!)ى}=%tWPY=u1%EE95%wU%%9UwEE#%U%UUUtEU9UwU@%օUѺU~W9%~5%}EU5%EVnY=tU<@% U։MU@%օU @%UVF_^UVWutVր:uV׍@%׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5 uYYƅ}NU9%vm %U}tFt*N9%~  %֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW{ _^UVWEE*1E@%9} t9uuEG6uEE}|и_^U VWuEF u-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEE t0% UtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE " }t]} t}tFE] E_^=%CC [ =%;{SK k{uC [ SkC [=%C[=%31C CtrIAÃ=%C s[ =%CK [ =%'C[U}u}uUM UMQ}u} tEjEPEP= jEPEP+ EPEP YYjEPEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEP YYjEPEP UjEPEP jEPEP EPEPYYjEPEP@ UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]ËD$D$D$UW}E MuG_]1_]UVWM7E_^]UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z55UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uZYYXZ_^UUU}u hep%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W/ V+UVUUUyV9v,U9Us$u6WUVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj WG Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVPYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(Nu^ fF FLF fF uYEu^ fF 5}LF fF UVUV}tFP YtF fF ^=%K C c[ U VWu} W WV VuWVrWV YY9zV9Ww 9WuHV9Wv@VEP2WV&U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPqV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UE0UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWV5t1f#V9Wv VVV+WVV+WVVY_^UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]} 0)ʇʋu }U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj= U$UUU UUUEEEEPjhj  u`=}aabad ranlib string offsetno space for ranlib stringsno space for ranlib structsdefines %sno space for archive positionfatalwarningerror (%s) %s: %s: %s(%.14s): %s: illegal offset in namelocal commons should be handled by the assemblerrequires %s%s: sections differ%s: multiply definedmem %d: full %lx, free %lx a.outr Scab:cxnorsu vTbad flag letter %c-u needs symbol name-s contradicts -r: -s ignored-r contradicts -s: -s ignored-o needs filenameusage: -b

:usage: -a
:digit %c exceeds radix %dwrong digit %calignment cannot be zerosection has different alignmentssection has different bases %s Undefined: base not alignedo'u'no core at allmoving up %lx GB"B7"777can't create %sread error #K"S" #"bad relocation size$A#J#$z#bad relocation sizename %s not found in pass 2($(,9(e9(%s: wrong magic number%s: no table of contents__.SYMDEFcan't read %sno space for module headerno space for moduleno space for moduleno space for module headerno space for section contentssymbol table overflowwrite errorMMMM'VfUUUVV X QVVVVQVVVVVVVVVVVVQ;QVV5QAQVVQQQQQQQQQQVVVVVVVVVVVVVVVVVVVV6RRVVRVVVVVVVVQVVVVSVVVVVVVVVVTVVVVTVVVVVVVVVVVVVVVVVVVV R:RRRRQ:RVVVVRVVSSTVVVV5TVVTVVVVTbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@aE]G_e]f[g_$@@$Id: archive.c,v 3.3 1994/06/24 10:34:23 ceriel Exp $$Id: error.c,v 3.6 1994/06/24 10:34:38 ceriel Exp $$Id: extract.c,v 3.11 1994/06/24 10:34:40 ceriel Exp $$Id: finish.c,v 3.9 1994/06/24 10:34:44 ceriel Exp $$Id: main.c,v 3.15 1996/11/21 10:14:26 ceriel Exp $h$Id: memory.c,v 3.20 1994/06/24 10:34:53 ceriel Exp $$Id: output.c,v 3.6 1994/06/24 10:35:02 ceriel Exp $$Id: read.c,v 3.2 1994/06/24 10:35:08 ceriel Exp $$Id: relocate.c,v 3.5 1994/06/24 10:35:11 ceriel Exp $$Id: save.c,v 3.4 1994/06/24 10:35:14 ceriel Exp $$Id: scan.c,v 3.19 1994/06/24 10:35:17 ceriel Exp $$Id: sym.c,v 3.4 1994/06/24 10:35:23 ceriel Exp $$Id: write.c,v 3.6 1994/06/24 10:35:26 ceriel Exp $SSSSX NNNWN NNNWN p NNNWN  0000000000000000 ((((( AAAAAABBBBBB   @,1l1$T$L 8ls=SSSSu QRP4P#zUVW1ƅu ƃ$ƅwXtRh1Ru@E]uE}-uE+}+u1}u w\ƀu#Ru Bf m(u#ƅu%ƃ*uGE*u%ƅuƃ)uO}?uh,Y $ƅPD_^UVWj9YE j 9YljFEunEU9UU€u+Ru"h\5Y Bf N}u hD Y8UG+V9UzURv9YYF}ǃEV+VPJҋ P!щM+V9U~Guv{9YYF>u_^UVƅusƀttPhYY^UVWEx#t }ƀRt R u& Bf 5MEY>RuRukE 0‰U%"tRtR t "xƍU9sGRt R u& Bf 5M Y"uOƀRt R u瀾RuJxP5$UYYt2xPVYPxPN7YY$P=Y(R u5M Y#Uf _^UVƅu{ƁtRu hO Y ^U,VWE<THt&hHuWfHUn MjƋUf fJ;  Bf ʉ _sVh YYVh YY뢃(u<u *u (g &u Mf ~u!Mf Uf .Mf4 = Mf =uMf >uL#Mf =u.Mf h Y ?V Uf )9 M~Gƅuƃ_u_u h Ys Ru _u hL YjPYYUBztBUfVYǃ?u*WMYTw5YW5Y:Uz5P7YYu h< Y7jh@H TMfFDžGs Tt1ޅs2Tt)U9sGƅuSɃBtCuDžcDž s2St)U9sGƅuɃDuDžsStDž.uDžDžHuDž ƅunƃs#StU9sDGDžqDžD Ws2St)U9sGƅuDžDžHh Y U9sGƅuƃHuDžDžsStDž OGDžU9rUBh YѡD?0uGUB?=sStG-0G-7Uz| 9J~URMQUz}J|EPiTCXuOTuUzz}hjYYiMfU=t/ t&ƅuƃDt D=u =xTu/Uz|&PMI9 4| TPMj4\q DžuPMI9 4| Uz} DžT`u,Uz|#PMI9 4|T+PMj4\q# u DžthjlYYMfƅu$ƃ.u.DžDž DžNuU9s.G0Ts2St)U9sGƅuɃDuJ,TƅuRƃ+t-tsSt E EU9sGƅu ƃ+t-u'U9sGƅu ƃs@St7U9sGƅu ƃsSu hnYG jjh* UBU9r#jh+YYURh%Y!)QP+YYURsURMIR18YY=<uhjYYMf2Mf h\ YR(vL_^UVW}<VhH3Lf%Fj*YFjh@*YYVBFtjjhl) Fjh<z*YYVVNR17YY8K} h$0Y<PYPhYYMM_^UU UjuujjUUUjuu ujUUUuuu jjUUUu uuujUU Ujuujj|UUUuuu jjYUU Ujuujj7jIYUU Ujuujj jIYUVW}E1}t}u2M9M} -"t!XSDEIQUu `VOhEI;4EI} t U B >E U EmI=$tu5$hhd0CtVhhdC WuhdB hhdBYY_^UVWu EdMRW'Yh@M~+:-uRgYUAMЋU}} 5dh hd_B jGYwwYYt1PGY_^UEPju u"u5dhXhdA16f U$u-Y(5Q5PBYYu =Yu h< Y5Q5PYY=tjjd5$ DhOYd: jYpjY)j J5$RYY=Xu>MlRR2hHYY5ljY=t1=XUVu>tv5tj6 u^UVhMY5ht !YY5xhl YY5hd YY50h\ YY5,hP YY5hD YY=t5h8 YY5h0 YYj5j@h, hNFPEjhhYYPh$; YY5h) YYj5j hƋR2j5j h F@5hYY^U5hYY5|hYY5hYYhN5YhhNYYu h|GYxUh2YUh"YUVWu>t'jvYYDžu hYW_^UUVW(I (u(2h "Y$=$$hW#D}h9U v#} ~E P"Y5 +U wU IM t EEF5 UW_^UVW}EGEtUUU3E1U+UUU@UE0t9UU~UG)ۉ]uE:u}u6}|u뾃} }1!u uu ƋEE0_^UVWu}u :AY|@B9uBR"Y]u1>E]S60WAtU9tE0C#Y1EU_^UV5,tV h FPYPu >YZP Yƅu10E0?tGFЄuF/E E Fu_^UVW}EEu ET} t?/uEPjW? `1E 8M] E EPW3) u1EPju:? t}uZ!YE맃}ƅu}Tt u>Y1a}Tu1QEPEPWuYu uv>Y1,UVUVUV}tE81_^UVƅu1U VUVF^UVW5,u -VV9s1~ 1~Et~Tt v=YVVU5EU9VVJU}~MUO M56~t vYF4F}t}t"F gt F S~ t=6u:t"EuEE6_^U(:t 5(#YUUVW} j2jh sPVQV sPVejjh FPVFjj hn FWVW V $h0WYEfF=>_^UVE} օt U )UE^      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPUVj2jh ƋEfFU VUV }t }ujj h F^UVP9Pt hwYP9P} hp^YQ9Q} hHEYQ9Q~Q QУjjh( PBjjj PB5P5Pj x5P5Pj 5P5Pj 5P5Pj 5P5Pj z 5P5Pj _ 5Q5Pj D 05Q5Pj ) ,5P5Ph jjh |5hYY5hYYƋVPJNQVYjhYYtj2jh 55:^UU JѺUM \!1UVu`҅U uF F&P\҅U uPV PV^UV5P5Pj VuYYV5PrNYYuhuYYVRJRVXYY^UVWEju|QYYE0> th VtYYV(Yz~ WVtGu"WrhV; VU(YCVG(YWuW YG$WrhV E0(Y_^UVWu} }u 19|@3tt 19|@t119|@_^UVWu }[|V9z~ U1NBVPrWo t BVPW2V t1F08_^UVWURB=u URUB9=]U RB=u U RU B9xt&}t(UB=uEE9xu=x=h4 WE P% u W uh uIYYWh$YYƋUNR U NR QGU MPr q  u&huYYUM R Q VNQ9=uVrVeYY9=xtVj2YYt#VjrYYtF F?V5P2YYt)V5PrYYtPV PV}UB=u:Vu2YYtVurnYYu hYEUUJu 9UuU9[hYNx9Uu89u9PNj44q uhlSY hPFYU_^UVuh=YYƋU VUV5PuYYu hh Y}t,PMRRq YYPsYYu hD Y^UVWuV UF=uNjP9U}UEPEPV* F=u"VRUu5QBQNQ VRUuQBQNQ}uTQURYuj u0YYPhhZuj uf0YYPhh8juj9  P9U2G=u  Pj YY5Qj= YY0G=u  Pj YY5Qj YY_^UVuF=uVE VREE VRJE^U VWuV t P9V ~h YEPEPVz }}h jYYU+UBU}h YZVhYYƺU5PR>YYF =P@lj~9~th TYUV_^UVWUR2F= uVdYvv YYǡPt5PWYY5PWYYu h( YURzUN9J}J_^UVWu>VkYP9W  W uht YVRV VNR QW VNR+Q U|5PuYYu hX 4YVMAJvQYYF Q\҅V t hH YQBQNQVrYjhYYuhYYVrhYY_^UVWUzt(?V V5ԋEU_^UVWuU zwG=@hVuU Rrh u8 7fG9tF=u69NU Rrh u +U rF=u@=u u Y=t ju /YYu Y_^UVW}WuFwfGt0VO =tVB}vh lYYvwlY_^U VWuVUIVu=VzYV RU9u V NJU9rtRUUNJv믋U: uRUjj5pu耒V1@tWrh u t2Wu&WUVWWY=}_^UVutF=u6^UVWpjhr5@GƅtQAv%YfFFvjj  lj~UW1 F=.jYjj5pWcPuWY^phrw  EPMfQUWUz9utVtUNJUr1_^UVWu tE׉uE_^Uu u uYYXEUVWu} F= uu}G= uF=t F=u1_^UVu=tVh YY VhYY^UVW}W r9t%t9~uWVvW RWW z_^UVW} j2j$h  ƋUV~ #UfVUR Ur }@t }u VURtfFWVw_^UVW}jhu W̎ƅi}t&}@tVrh DYYfF@=}pR9V =`fFE t}vYVV#UfVV~Y}uVEtwht YYfF@(E u vYfF@ F*}@tV@twhP 6YYU 9V t V@u#UfVURtfFuu W _^UVW}7^V€t:VuVrh j V2YV5V@fV_^UVW}WUR 9u UJ 9>t6_^UVW} }purW jYFVfVpRRJtWV BpRw2h PN#Pw&Y@PPYYF l p9Jv h-YYpjhrW謋ƅtVu VYxpurW w858h P"P%Y@PPYYF PaYVfVjYpRUV EUrpV_^UVuvu PYYjY=uV:tVrh QYY^UVWpjru ƋUr Q5 Qh@ P!~ujYpVVpzQWwP$Y@PPYYjjj FxP%Y_^UVuVuC~t=9Vt2vu mYYuVrhH IYYvYfFU V^UVWu }9t#W:#tV:#tvwht _^UV5$#Y2PY P5$<5<h VG Vv#Y@PVYYjVPYY^UVu V R:#tV uruh V^UVpu rjuYYP ƋUV}tUV=t u V賐YY^Uju juUVWE}U RBUpj rw + ƋU VU RUAEV}u U R2UruuY_^UVW}Njuw ƋU VV@fVU Er0YYFU B ]uKY_^UVWUU=p}tWz t}pMI jrq # ƋU VUR zlUR RRVfV9t$JuUR h rdYYUR RR V}t>U M _I +K5PrQYYPYY؋WBWRVWRJt VRV?VOr1h PCPl Y@PPYYFVfV=`t-VfVl9zu vhYYvhYYURURueY_^UVWu EujYƉE E8jjh EEE8u UE @M U@=`u'9ut"pjrv NjEWj2j$h` NjUzUWW UfWUB= PUz uGEQMIQ EQPMIQPQPE+}u QEU5Pr YY]vu Y_^U VW}V€t 9vtvVB=uVFEV@=vUR2PV@fVjhu voEt9ut URu V uvWfW~Vqp9VuVrh YYOR9V tAVRrt#V thu V! uvWfW_^UVW}hu w Ɖ~V UfVuu Vq _^UVWuR9V tpRRV fFjY=pjYpRW~U V_^UVW}jju w ƅuAhu w j2jhg FWvVB_^UVW}pjjrw {EuW rh@ W. iUJ`tW rh W DUJ M UfJ} #pRRRr t8V€t(pRN9Juhv u% u6ċpRjhrw 詀ƅUUUJt URUVu1UJu%fFVfVUVPVu$UJuUrVWl fF pRhruL uOu Y_^UVWURr t7V€t'~W€t9}ujv V 6_^U VWuU RRUpuu YYU RrjV U RRUpM9JuAuh u uh u U \ B@jjuv ~Džu9V R:#tV urh Vh@uv 1W`u(V urh VHW@fWpjrW uvVu/ Y_^U Vuh EP(tOpjr} t uVYY jv YYP> uEPh v^UVW}j/WYYƅt ~ut)BRWNYY/4_^Uj uEPB EhdEPMYYh ( h$5hEP uuh8YY15$DY(f UVW}$U UU HjhrW|ƅrX=jYpRUpUE UB hwYYu%*jhrWA|W:#wY$UjhrW{ƃ=HuMtIVu=j lYEURP =DtDMJ UUDucY#jhrWz{ƋWEj+Ygh@rW ƋUVUr@V€twhYY&95lu=HuwhlYYfF@U$#Uf H+U H_^UU 9Ut9Ut9U u1UVWu }VWYYu7G= u3 u-F= u"~ uVO21YYt1_^UVWE ]03jYYu1TUzU rt=t9WJVZ9uVOrqFYYu1 ?619u@_^UVWu} WVYYt F=uG=uG= tF= t95u}u9^9=u95xtN95tF95t>9= u95t.95t&95t9=uF=t F=u1_^UVWu} WV YYt  F=uG=uV u95uW u9=u F= uG= u F=uG=uWVYYwF= fF= u ~ u1PVB=u VV9u$G=@uVNR+Q B9W 11_^UVWu }G=@t F=@u_^UVW} Er}t"URurh`PuhLPs VWaYY}ujWu 9=uF=9=u3P9V }u9V F= ~ 9=|u ~ qG= l bW 9 tK |9 tAF= uVO21YYu!F=@u W52lYYt =Z}tTVW=YYtGV 9W u"Eh0Sj0=EhS0 1 VWYY]PP3p 1_^UVuru UYYu,}t"uru YYPhx6*1u VYY^UEZu u 0/YYhcGuu uvUhFuu u[UVj2jhz ƀ=tF F=tF FU^UVuYf<fVf>fV U V UV^UVumYh<FPOF$F FUQ8^UVuu!Av YvYvYQ5^UhXYUhHYUU 9Jthju UVWE0VU~FVEYE8UW_^UVWE8WUr >=uURR 94uWoY&1h$YG0uaYEr E0 Y_^UVWE8] 3t-}9|)E EnE`U!UEEEUUUUEUE }|9u|EE )E _^UVWEUR r URz URR U5~J~#U49u$YU9juY\}X}6U94t9<tً49})uY~U9~ uY։u*UB=uPuYY~11ۅ9tC}ߋUB=uJىЙ#JЙ) UB=u ~~U4)9|}}U)9~ uY|}U 49|}|U 9~ urY)c19}@U19~@J19@?19|@419u@)19t@hZYUB0 u YEr E0Y_^UVWE0V R U׃VR UEEWuW ,WuWI WuW WuW EuWyYYEW1}ET1}EF1}E81}E*1}E1}EF VR :tVR 2:YVR VR FhY9F FP|YPhtV/ hdVٿYYH< E8t0YE}tEUuFYE0}tfFUV UV VY_^UVWE0V R UVR UVz ,}t}u E"\UUUEPEPsYYjuu uV{YUUU}u%F=uTHPV豾YYEPEPYYF=UU\+UjRu uVYUUW9VWjuuT uCVB= u%xVU+UjR4! uh$jV6 U+UUjuu 1ۅÉ]juu 1ۅÉ]juu Ejuu EuU19Uu@EbU19Ut@EO}t }t1E5}u}t1EhYF~uYE0UV 9VufFVEY_^U VWE0Vz RB 15PE^V UNI+QEv V U~ |?U9V s0E154E15ѺYt1EWtYjdYfFEfR fV UV VE0YE0V R UjY]ENJEfN fJ Vr YE]B EU9UylEE EE^Ћ]E#]E@EE#EE'EE3EEFd^EmEU9UV>] 9?E4EE 9u* EE9tFE랋U9UsF1=#uC]F1=#tC]jY]EfBEMJ E JEfR fQ hYFV r Q YVr E YVY_^UVWERr ~RVERB E0YE0fF~ }"=uW N 9 |VY^ VY~ a~ zF G=uW 4V G=uW \V G=uWRV oWRJV `G=uW V FG=u WV 1F (f "W V hLyY E _^UVWuVB=uVFG= t5G=tW \!V +W UMV V _^U VW11dF׃ u h袸Y<\JѺ!4ډ=uUJE딃=Pv hXGYP_^UVut'V@t(Vu rhuU u uEYY^UVWE0~E9} G=@G=uǀ>29V#9U G= BU V:V jRYYE3V jRYYEhfYU B=<uE}t =MRV :t2IYV V UV fFjjh E9UjRv BUjRv ,h讶YG=u@ UV fFu v YYEG=u~ |U R \҅V eExYGU R P44v O tU R jv 41 uElU B u}tuhTjV#}t =MtU V u!V J uv hV 1_^UVWE0VjFPYYu1>VzG=thVYY17YDžu=~_^UVWE0Vu F P$YYVPjFPHQYYZu1XV zG= thVgYY16W2YFZhuPFP _^UUVWE0V>Xu j5pVaEj &YƋUV EfR fV UrhYF]3YE0H> ?Vu ^S|QYYu10~? u2WB=u W J uw hTW 1WB=th@W)YY1Wu hrv <`Euh0Vh4> 1j %YƋUV UrtYF]fR fV E EE0UJ`uuh V ? u W Jt ~WYV J1@t@_^UVWjuYYu1QE0~ W`jSYƋWVW uWV fFGPFPEfR fV WB=uV UBEWB=u WB= MV UjjhE F uv E8t0Y@]P33YY]E0SYE0WnuWhV 13Wu%t9Wt W z~hhVYY1_^UVujVHQYYthu V t1^UVWE0] U> fF=WuF PYYPuFP{YYZu1AV :uV:t 'V R UVR U5uu4YYu1E0>t V UUUB=uEE@Puu uhV褮YY1uuYYtuuYYuhVnYY1eU M+JMM+JM}9}r315EE015ѺY ʋEGV2YE_^U VWuYljƃmUуMt VUBE_^UVWuV׋J~ FPY_^UVWE0EEjY]E JEfN fJ ~ iV j^ S|QYYu1~ W UJtURB=tuhWi 1URU UEMJ~UrY]B t4Er uG P uE tEȃ}uENJFVxYE_^UVEruu h0 1E0^UVWuuYYDžt4 t.}tjG PhYYW j_ SHQYYu1w }t> uV U f } SVB=uVFE}uuG P*YYw UBE uuh,V 1_^UVWuuYYDžt tW j_ S|QYYu1Tw > tuhdVh 17V M Zt}t!VBEuuhHV3 1_^UVWEEEUr > uV U9Vu/UUUztujjEP3t1V2YUBUUVzWJuQjEPƅuEETEF=uWrVYYUOYOu RSqWYPuQuE?lUUzt9uhxr UztujjEP:t1E_^UVuV2Ytzth6YY J1^UVW}I j R|QYYer > uV Jt W>YKVB=t 9Vut9VuWYhV聨YYV7Y_^UEE U>,F ? 81*.#.hY E~UVWu} 9=u)F=+u}VU}V VUUUV 9UuTV9=u vWt2F=+t F=-uPFP'YY;179=u-UJt!V5F PYY1_^UVWE0V jF PHQYYEVjFPHQYY!EV RB=u V RV BNjVRB=u VRVBEPWYYt+G= u }V zUB= u }VzFuPYYEF^UZthV$YY1EW0YYYuhv YY15F PYYV :uV:uzu uYE}u1FPYYE^SYEUZ]t GEuHUtVuWt uuhVW 1&9UVF=#t F= u 9=tuhV 1Wu\YYu$uWdYYPuhVפ1WF PYYuFPuYYG=u7V :pzfV:ZzPuYEV :u=V:u5G=u ukYG= u uY uY_^U VWE0~^3u F=(u.E85EjuHQYYVVj^SHQYYu1VRB=u VRVBEFuFP(YY~9UUUJ, E85 UB= tUB=uB9Uu xV 9Uu V?u uYUB= ?u9E8W RmYW :t2YW 5W9Uu0?u u:Y7h|YF8FP襏YPh`V 1_^UVu uYYƅt~ tuF P]YYu1F ^U8VWE8}W R UEEWujj,EPnƅu1VB=uVFGUw RYYUr WJ$uE>J!V fBE3E'WB{WujhEPƅu1K>Eujj EPu1uUzu5F P?YYUzu,0PF PYYEmujjEP#ƅu1VB=uVFEUzu8UxUԋ,U܋0UЋU؋U6UԋxU,UЋ0U܋ŰU؋U9UuUuԃ RGYYUU9UuUuЃ R)YY:=tU9UuUũ RYYuhV HE<ujhaEPƅu1zVB= u5VWVB= u Vz WVEF=tuhV 1jYNjWVB=u1 V ЉG fGEfR fW EBE0^YE8Muh hEPƅu1VWEujj EPƅu1VVB=uVFUP RsYYWUR :EujhEP]ƅu1W>uVE`=DQu2DQ=uhjW` hlW YYGjuEP ƅu1aVB=tuhPVE 1;j YƋUBfW fV fF,jYF v UR RR V fFfW fV Vw YjYƉG fFfW fV UjzuD8PYYF uYWujhEPƅu1gVB= u Vz t EURrh jW=Uz3URօhjV进 VYUB}ujj EP3u1Uzu=t UP RYYEuhhEPƅu1ZV RWURWUBuY}ujjEPu1Uzu Wx9WUw R&YYEuWujjEP"Q1GjuEP ƅu1VJ uuhVi 1_Uzujj EP10GGjuEP ƅu1VUB=tuhV 1ujjEP+Eu1Eh0EP u1U5 RYYhϙYUB9u~tuhxvH 1A}tUruYY$}tV EwF WY_^UVWE8wW RUW R Ut~tuh<W 18V j^ SHQYYu1V RB=u V RV BPF PYYv VMI 9J t+ P9J U9J ~uh W9 1VB= u!Vz uuhW 1WB WY>u?UB=uJjYNjUrKYG V fV fW VSYjlYfG4fV fW wE8UW_^UVuU B= uT9VuIV Ljjh@莤 FjYF 5PhLYYV BV ^UEh\0耖YY1UVER  M f^UVWu`ECXRLFEC5@>du @>t4>%Q%Q%QFpQ>t4> Q Q QFQwuEPoYMU:u =M hd͕Y=M~MhhDj =Mjh$j M>uuM9M~ MR5hYYhQA Q9=M~!hUhM UUGMtQ h\FEЄKuEPCYEu>.uVUEP"YEuEPhfYYuEPh襓YYtRB=PP>=P6=P.=P&=Q=Q=QE}5pUP"UPUPUPUPUPUPUPE,dFtV_^UVWuEǃ0|9kE -0E݋E_^UuYU uuu Q U=XtW`Xr jEϲYYhxj)YY5Pj貲YY5Pj@裲YY5`jq蔲YYU=Xt85`jIwYYhjѲYY5PjZYY5`YUu藭Y\UVu=t =eV YV 9\tMV \=uF PjCޱYY=t#V 9dtV dRjDjӫ ^U\}tS=uJ=Qu3Qj诬Y5$Y@P5$hX jjj2b U VW}pUWpWXprhv$YYFV脤Y6蜱Y=tKjWFYYhחvYY=\2u9=luWjjj*rPjWFYY9=lU=\uVQBQR蒫Yjh٪YYj5QjFT jh}YYj5Qj54 =uhjjYY}t"UR RR2jMYYURUj$YhvYYQ=t"=t1QPhj賩 W jjw Q j(YjjXcYY=t"=t1QPhjY VR軪Y QUphv$YY_^U(VWpUURRUEEEEqEiEQURpUhrYYUR2訪YǣTt%5Pw 艛YYE9W ~EuYu֬YU1zu@PY9URrlVJXVzG= uG uA=Tt}ujuuYYEEjjJ轭YY5QuYY6u.YUMIjjrQ tF}t@URMrhjqjBjEPYYjz7YURj9YYu[YUhr9YYURrVJVzG= u tFP9W O PVrjI赬YYVw rYYzVrj:葬YYhjYY5QjtYY5Qj@eYY5Qj VYYV5QrYYhj蝬YY5Qj&YY6 u荫YjY}tHURrj:YYujpYY}t5QupYYjjrɫYYEM}tG=Tt uuYY5Qu0YYjjr艫YY=Tt uuYYujXbYYu脪YURڋMRq ӫYY=tLju"AYYUhחr7YYjuAYY=t1QPhj URr}tE1ZPaY=uUh|rYYu!Y=t"=t1QPhj蠤 URRYU5PrKYYuUhr轉YYUp QUhr<YY_^UVuZVY\VYS=QuJVu>v%YVjj5Pr YYPhFs^UVuVu+jjO苩YYVR2jYY5QjkYY^UVut&> u!V uu v Q Evuu VQ ^UVW}wWJ5YF=uPVYY_^UtVWuV U~F=;u  1}th jVg F=0uUJ V 9tVVYF%^uEPY~thV跇YY|VYpV/ YdBUBUuuF P< uu w uEt<BURj YYuu wu EEUUU Uu?Yuu V EBUBUBURj脧YYuu Wu EuYuuF PN uY6BUBUuu uuEuuFP uYYBUBUuuWuRteEuj蠦YYuYmEeEBUBUEuYEUR UЋW R U؅uhjw 蔅 }UЋRB=u UЋRUЋBE@1=tC]܋URr1Yujq}YYURr 1Y5Pj*_YYujqSYYujIGYY}t5Pj2YY5Pj!YY}|uj_YYuhNYYujIYYURR Mrq%YYu1Y}|ujI辤YYuY]uYujI蛤YY5Pjb茤YY}tujEzYY5Pj.kYYujq_YYUЋR U f uY=uuYujqYYWuu wQ E=uMBUujI٣YYuYuj YYjDjE蹣YYjz蠣Yu]YUЋR U f uY}ujIkYYuj|诣YYujISYYjjEHYY5Pjb9YYujq-YYW r jEYYuY5PjYYUur#YYu0Y:Wuu wQ EUЋR U f ujYYuQYu0YjEPF P5 V URB=thuǁYYUEUURRUEPYfEbEE5EPl YYfEEPEPUUpUUpuu WQ EUpUuFY#UN R^ S|QYYUtEu j詡YYe`Vj^SHQYYkh5TFP{ tP~WB=@u5TW0YYW$-Yjj-YYhYF,E_^UVuhEPNjVHQYYt: 9Jt 9Jth$6YYuu EP6^Uuu-YYu1&hu Eu 0-YYUVWUzj RYYEW jG PHQYY!EWj_SHQYY!Eu1UR r Vuh uYY~u~|hu~YYdpR9V t=pU}uhu~YY.UN 9Jt EŰV P9J  J uhue~YYVB=uVFEW RUWRU=phuG P thuGP u ruv?YYtuv.YYuKh`ju} 7hPuG Pƶ th@uGP讶 u_^UVWuVj^SHQYYPjF PYYZV zhT WFP vhEPCjjEPvVzW t"E=t E=uEP Y WEPYYWv EP> _^UVWuV~VqVB=uVFVu Wtjj5Qv.W,t%Gj= u1Pw v谔_^UVu VV{}qVNurt` EVtp 5Vu %Vu V@u  Ph ju{^UVWuV RUVR:#VրV`V€~VO сfOVVu4VWuYYj%Y5PVjE&YYWjEYY7jYjYxjYkh%6jY[$E̴VjẺYYWjE‰YY7j#觉Y+j%蚉Yj$草Yhp%iY$ErVjErYYWjEhYYjOYVjEQYYWjEGYYj.Y=`BUuVj*YYuhYYujYYuj~9YYj jEވYYjzňYuYVjEÈYYWjE蹈YYj蠈Y'hX%hY%E鋳0%E~_^UVWUz t9WuuY#WUt' 9J ~5Pr PuYYPj*YYUzOrqYYkw V@uvVt8V RU~Q+URjO͇YYV B Ev jYY$EWYj莇Y = t܋Wrj肇YY}t0U5Pr tYYEU 9J  uj@LYYuYuY_^UVWu E8t v0YYURRUv ~B= XUz KRUURrjEφYYG=  v YWMI 9J Wr jE舆YY5PjRyYY9UPJRjEYYY5PjJYYPJRjE9YY5Pj*YY|F=uV JRjE YY\9Uu PW JЙ=PHPjE܅YY1|9UuW JRjEYYWOR+Q RjE詅YYjjE螅YYUB= u Uz tURJF=rV{YURJQVYYwV5Pr ErYYEV]YVruxYYEuuYYuj:YY,%鰯G=@u uVYYVY_^UVWUR5Pr qYYNjU 5Pr qYY)ƅt Vj}聄YYuYWjHnYY_^U=u!U9Pu%%Pj襄YYujb1YYU=u!U9Pu%%PjjYYujYYUVu1vY &钮^UVWURU11UR R RU}%Ur VB=uVFNjURUVYVYG=u/P9W u&&Pj蒃YYw jYY8G= u-Q9W u&&PjXYYw jYYw j@؂YYnVYh&j&YYTv YFv Yj4艂YWr jE艂YY5PjRzYYVYP9W ujjEXYY5PjIYYjj<9YY5Pj*YY5Pj8YYjVYYV YEEVR U9P~ PU}tC!vEjV@YY5QuYY5Qu@YYVr jH蕁YYV YWvwYY}tUr YUR WrTYYjjEQYYW59YY}u$G=uuj`&YY-uY"G=uujYY uYP9Uu"G=uxPvYY}t-5QuPYYVr jp襀YYuMuY2V Y&h&jYYV~YEE}tCtEjV YY5Qu*YY5QuYYVr jH YYVS YUr G YwjEYY5Pj`YYw jfYY} uw j8YYw j YYw jYY}t*5Qu>YYVr jpYYu;tY#V Yh&_Y <&E[_^UVWu} V tFW t3EPEPW&v VuqYYtVupYYt1 1_^U VWu }=VWxYYt W\tYF=uG=u F=tF=kG=\BUv j*d~YYv j}X~YYv jL~YYuj~~YYj jE5~YYjz~YuY_^UVuv L YvC YVY^U,VW}W UWUWBEWr TWY`Vj}YYJVj}YY;URr j}YY$V^YVj8}}YY h)]Y&EQW5YVj`E}YYVj_6}YYU 9JuVja}YYURr jU}YYURr j|YY|V{YpVj |YYVj|YYWh) ]YG,'E韧WYsVjQ|YY=u95P|)x)Pj|YYVjR]|YYVjPN|YYVj?|YYhl)}\Yl'EWY.Vj, |YYVj{{YYh`)9\Yw'EϦWYZ95Pu\)T)Pj|YYRj{YYVj@{YY&Vj.{YYhD)[Y'E_WCYZ95Pu@)8)Pj{YYRj4{YYVj@*{YYVjZ{YYh()Y[Y'EWYURB=u URUBE@= u$URB=u URUBEUr VjzYYjlzYVjnzYY5PjZzYYVjKzYYG=u*Rj*-zYYVj#zYYVj8zYYfG=/G=u$Vj yYYVjyYYVj}yYYfG=VjyYYh)ZYUB$(鮤} t Gu P:YYujyYY#GPYEEURUUB=3u URRUU:gURM2q kYYu'} tujjyYYjjE yYYu8YUMIR +QRjExYYuYuYURrjExYY5PjbxYYURu2:YYtPBU5Pj*vxYYURR RjE`xYY5PjQxYYuj~xYYURr j73xYY} tu hnxYYujbxYYBURjFxYY}tAuYUR PJ QjwYY} tuj xYY jjEwYY}6uQY(BUEhEP} u0BU BUBUG=#uuu EPuuuEPuuYhEP薡uu EPuj}tZu uYjjEvYYujvYYuUYjjEvYYuAYh(VYG|(e_^UVu ^VhvYY\VhvYYMVjvYYAVj~~vYY5Vj|rvYY)VhcvYYh)TVY )E^UIjxuYLjwuYBjvuY8juuY.jtuY$jyuYh *UY )E鏠UVW}wwYrjteuYsv jUeuYYbv jTTuYYTh*UYGF0*-WVrYYWrV"YYhx*\UYGP*_^UVWu~vt!~ tu Wv % E vۃ} t w j}tYY_^UVWu >U: B=}t v j}ztYYvjEntYYv jEbtYYG=uWrjEHtYYWRJRjE5tYYu Yh*jtYYkPPj tYYBu>YvjEsYY5Pj`sYYv jfsYY}u v j8sYY_^UVuhEPZjjEPV2vEP3YY^UhEP} t uYEPulYYE=t E=u1EEPY}t2=u)5Qj*sYYjjHrYY5PjrYYUVuhEPVYEPVYYvEP!YY^UVWuPV=Q׋V Q9J}+JQjNurYYWjGkrYY WjI_rYY_^UVWUr 1tU 9V t6u,}t&U z tUr 1t9V t6t7tUR Ur V UfVUNtv_^U VW} EUuhvr >E}t6Pu*}uutUR 9Vtvqe=MS}I}tuWNI9J}t,NI9J|!Uuhwr o @E86,}th*uh*u Uh@wr o _^U=uj@yY@UV+֋J9r)@P5zYY𣐞E^UU:tEPYUVWuF~"FPh+EP贔 PYCF}6>u$FPh+EP胔 PYFfFVu} tfFF~FPh+EP, P*Y95FPh+EP PYV N F444Ph+EP͓PY\FPh+EP諓 PY:Fv Ph+EP膓PYFPh+EPd PbYP9V u"FPh+EP7 P5YFPh+EP PYVNCr1Pht+EPPYuj6YYF^FfFL=`tLl p9Ju;ډfF^Shp+EPh PfYj*Yj5gYY>t1j*Yj6JYYFFfFډfF^Shl+EPۑ PYjjSfYj6YYvv h`+EP襑PY4ja0YF= u9~ u3jrYj6YYVrhX+EPV PTY j6dYYj;YVj2NYYjeYV:t&WwrhP+EPPYj;Y~v hH+EPϐ PYVztNWrYj:IYjwYYWR ORQh<+EP|PzYj;Y=t%jfYj>tP\YYjQYj>tP7YY~Džxt x?xh4+EP PY~lWJtv)WRB= uWRz uipP-YWjrYYj;Y?F*r_^UVu uQYj:YjtYjVTYYj;Yj95t <9V |1F Ph5b^UxVWu~QVrYj:oY=tjFYYj5YYVr h,EP蒎 PYVR2=t1QPj$5PcR=t jfYVr h,EP1 P/Yj?tP4YY=]VURU}OURRUt,Ju#URrh,EP輍 PYURUj;?YVR2=t1QPj$5ebg=ZVr h,EPL PJYj5Qh5`=Vr h,EP PYj5Qh5`=`tl p9JVt7jvJYjWYYj;8Yvjh5I`sVtSG= u  uipPYjWgYYj;Yvjh5_=QtVE(V tE jGYjS}YjWYYj;kYVtvju5r_jvju5_jWYYj;Yvjh5&_PjtYjWiYYj;Yj9=t <9W |1G Ph5^=`tl p9JjcYj={YG=uvvh,EP谊 PYdvh,EP萊 PYDjrYV:uj EPR蔁 EP]Y V2PYj;YVRUh,/YU:t$:'t:\uj\YEEPYh,YjeYjWYYvh,EPȉ PY|jSSYjWYYEW 9U}CE=PV4E=PZPhx,EPd PbYEj;YG+M<j9W }G 1Ph5\ 8,E _^U VWd`hf4Y5@fYƍFPY `=;tj;P5Y4#jD7YDžt$u jY4,q EPEPYY F PV Y h3Yuu7oYYjZY5@vBgYY_^UVu 4c dh3VEY h=]tj]r4YRJuh0-60BYY3 d6t-]^UE E |$`_3' $E@I3 $B6tD- u Y `=;tj;3Y2 =wUVW1`MhE2YjzYƃ}tpjjrVj5@?rYY2 =t =t h2YU2 EPY `=;tj;2YtVWu9o pRruuqp uzY_^UVWpz `l=t h/2Y h 1Y h0Yjr5@_ ƺ XN сfNw=t29Vt'VR:#tNrqh8.R? Vrh0.P̄ PYPP*iYYpVjjjL Fx`=lu5l `j;0Y{0#j3Yt u jqYV0\-= EPEPYY}tN=uh.ju> h-Q>YuxYj2Ytu-鿉 =t h1Y h/YGP^Y `v5@bYYVfV lj..Y_^UVW 7/=j1YDžt>u'`J `=;tj;/Y.d.鳈 .je1YDžp`=t h0Ypjr5@9\ m.I p Z.FP YVXY4 pfFjj@IYYF.1tۻ/݇=t jVYY `=;tj;.Y-/ˇ -=jT0YDžt>u'`^ `=;tj;!.Y-/g C`hEPYY `=;tj;-Y7-t0_^UVWd`l= t h x-Y hN,Y=\q@r˃Yǃ ~ @Wr5$Ń t@5$rh0j;j5@ lYYƋVpLjr5@Y ƣlj=PYpVpR0pRrFPY `=;tj;y,Y+#jm.YDžt$u jY+0隅 F PY h+YjQY5@v^YY lj.*Y_^U~ h819YjMOY\/jQY[ \*\2 =t -t1鴄U VE=Q~Q1EEth*Y5@u |ZYY]e* tx|C*o `EPEPYY*j;,Yƅt+u*EPEPYYX1ރ ` ,tp1鶃 x=)tj)+Y)( |)EPY@ |8,tﻐ1a tf,tﻨ1uuuUM ]P3[YY}t)UJ$tERrh1j7 ^UV $jz+Yƅtu1鯂  $/= t h |*YuzYME =t =t h(Y^UV=t h*Y(@h*Yƅt>u'`) `=;tj;x(Y'D2龁 '@hD*Yƅt>u'`[ `=;tj;(Yp'2W ,K'@h)Yƅt>u'` `=;tj;'Y '2 ``QjEP YY `=;tj;I'Y& URY h&Y5@u:XYY Q `j;%Y[&/`4 `j;%Y;&3 ^U H|(EP Y EPY |=:tj:t&Y%EPYu uuuu\UVg (,h"%Y5h @YYz% ,v YVwLYE0) (us YO(tD3*^UV pjr5@R EjBmYj=y$Y$EPYuuVM VimY^UVus 0VsYj'tP VoYP V>Y~$< V Y- V Y V Y\36~^UVu 0dVC Y* dv't dV:Y#W3}&t. 0V4Y#) 0VY#3}^Ux#EP(Y x=)tj)$YuBY]UVW=t h#Yj nkYƋ] #Ej%YDžtFu/=,tj,$Yho"Yj &kYFv"4| _^U4h"EP Y =t h#Yw" 4EP Y h=]tj]"YE0uuC ]ujYujYUVW0 !EPYuh N=YYƉAj,w$YEtAu.0!EP|Yuh =YYVV244{ ="t h"_#Yh!EPYVM WHYE8_^U VEPUjEYƍEPEPVp }uhL4j/YYEuu=YYPuj= ]ErFPFY =t h@!Y^UV8`uu uJ -j;#Yƅt.u8uu u h48z `^UVW})  8| EPY |=:tj: YEPYUr7KLYYu uuuT 8<@D <|EP Y |^EPyYU:thh5-YwUjur L ƋUr7KYYUJ u hP5O-YUVUE r0:YYFUB ] V@fVuTgY |=uh$5j3-YY h5,YEPL>YEM!t4\xi! <LEPgY4'xE U ="t h"YWuEPuUUE UBj| YEtBu/@WuEPuU9U~UUE U4w WEPu U9U~UU =t =t hYUE 7 80 t4 w_^Uk @|DEPEP]YYuoeY |=:tj:\Y Duu u @t|5}vUVWu Vu]YY@j,YDžtAu*j6j Td ?Ru YY65u _^UVW} WQYE8KRZu RB]P3XHYYEt]Eht60WAc 7VB=uVFFP tV P9J hX6V)YY jVj Pc ƉV RV0R|YhL6vRb u VOVBVN Pr q w; u/h6VH)YY t5tVE_^U0h"YEPBYu@Y]UVW}Hjh5YYh,Y@MVtEYt H VSY< H=t hYtӻ6s7_^UEPYEP9Y]U EEEt- tEPEPEP= trt6Msuuua= ]UVLx|$k Lu uYY(j,Yƅt)uu uYY6r Lt7r x=)tj)Y' ||uY |lt87Gr^UH(EP#YEPyYu uujuLOU0 HE) HEth7qUV4=t hY@Uj=Y 4EPYpj@ru/E ƋURFPqURVu_Y^U VWP| EPYuhY @J _^UVWuYEj0j ] Ƌ]fF,3j,YDžt4uj ]YFvF PsY8}n _^UVuVLYjVHQYYt3:t,:t'=t: uRB=t h 9"Y^UVuTV[YF TXj6j.\  XR&Y Tt,9m^UVW}1\`d( \j[Y \t@:m `WkYtV77@hYEt=u*`jVjS[ > `FPY:l d7_^UVWhlucYE0=hYDžt;u$hjVjZ FPY;pl lE0_^U VWu hpVY pttVY@ tj6jNZ PDY-p te t컸<kt$ pEP7Y}W >=k hVY h=thY>JkjYYTPhft hxjYY:VYE=t}t }t} u W>WYY x=)tj)Y,jYYR3Y>j_^UVW@f<*jXYƋ]V}b @VY%j,YDžt&uvHVY't>uuWu >'uv >uWuYYwuVu t5VWYYEx5|uuuH uuYY>t>uv >uuWu{YYv A_^UVWUM I5ׅuUM I5] 1GWURw]YYGU ROORQWWBU RR֋BU RWrYYt0WW WW U Rj`r,YYW\ztuu u+ U zu u uFYY_^UVWEU 9Uu 1U9zR@URuUR URu tYYtUR EUR @UR%UR GGE_^UV1U9r~RtF1^U VWuEU M9J=JQ!U MJQU EU MJy,udž,h Y05,9(u',,R0YY0(0<(tuWV ku59Wu dž4uwVI u;WVYY05} WVLYY~ WYuWVw E_^UVWu ~EU9V~@VRzt,UVR׋JUVruYYE븁~5|*UN594uUN5v'YV&YHVYt=V;YUǂDVuYYUDtFVuYY_^UVWEUM9JTJyMRu:URt.UJ  u WJW O WYE_^UVWU z ~ UǂDU B 1U 9z~5Rt)U R%U RtuYYG_^UVWjYURVFF FURVURRYFURMRqvE EU9V~"VR׋BUNE։_^UVW1U9z~CR] t1UR] !ÈE URPtYYG_^UVW1U9(~0ֹ# GދUǂ(_^U VWuUVUFFEU9UUMM 9Jt=UM׋JUM׹# UM4VuYYQ~uF VR:YFV9uF VRvNYYFUMFEMu#Y_^UVW}19~$4WYYFLJ_^UVW}GGLJLJ LJ$LJ(LJ,LJ01}D7 F1} WF1 } Ƅ78FLJ4_^U VWEUURUEUBUB19u~@Uu 4u uYU׋JU4uYYFuYuI"Y1} UD2 F1}UF1E90~UR׹# F_^UVW1E98~)UR֋JUR4u%YYG_^UTVWP1YDž1=u5~u?\ztj"YP9Y5VP 9~ 5PJYY9~=h=XjYP!Y/5~u?\ztj6YPMY5VP 9~ 5P^YY9 EE} }UUEW5PYY9~ 5PYY9}tj,YPCY_^UVU+U փ}t*|&5PVYYt}=1^UVWjjh NjuV j^ SHQYYt6V RB=u V RV BPF PO;YYv LYV RW BVօX> uCF=|u8~ t݋BV fBV BV Pr W 뫋BWuW J uhHuYYQBQUR Ytwh YY5QhHhh wwwX 2EWUUzu EUjhi YYW+WRhV YYWUU9W}uUM9JPEUrhf YYUM9J \EEU}tGUzu>EUtwh YY5QhHhh ESwjE YY5PjbYYjuj9 5Pj!YYwhV YYWU}KUzt8RUuh( YYUrhf YYUAMM9Q u΋EUjuj9y 5Pj"QYYuEVօW> u=F=|u2~ t݋V N Auu rP\ E7jJYYuu Vw\ E7]YWYE_^UVW}wtU5u=_^UVWu }> u?F=uuvv W7.uv W uvW uVVW_^UVW}jjh] ƋWUEW BEhTIw E P' thLIw EPn' uUVU R VUR V UM R +Q U| }dBU5Pj*yYYU r jEjYY}uujYY5PjGYYuhYY5Pj*)YYUr jEYY}uuj XYY5Pj YYuj;YY5Pj YYuj YYu YFuw~*VWV W}t(Uuvr tUUEU҃}t>Uur v t&vh(Iu 5}\Uuv r t&v hIul 5o}tEE0WwE0~t6uvw< uVWuwv ! uV W~t V +VBW_^UUUV5U+V5Pu RYYYPQYY؉F^UVW}?u.uu YYE=u/juu u 7VU5E_^Uj5P5PhUj5P5QhfUVj jh ƋEU VE0^UuhYYUuhYYUVW5t6=5t6=1҉_^UVWj jh j jh 1}u@G QW~pV uA V 5p_^UuYpRUjYEUVWj jh~ j jhk ƋQW=~5p_^UVutLVuVrhxI/YY'VuVrh\IYYvJ#Yv^U VWE0VuVUVYV pRz tVrhIv Vp:jjwvϖEVE}u+VuV:WRVWrWV Hvy"YVU4_^U VW1E0t!V߁t}vUWvۋE8_^UVW}prv"Yj !YFt5t vXYt FPYt FPfYpRp_^UjYUjYu!Yu YUjYuYu YuYuYUj~YuYu /Y@Pu YYbUjNYPUj :YuY3Uj Y}tuW/Y@PuPYYu JYuAYu8YUj Y}tu/Y@PuYYu YuYuu-YYUj Y}tu.Y@PuYYu YuYuuYYRUj >Y}tuw.Y@PupYYu jYuaYuY Uj Y}tu/.Y@Pu(YYu "YuYuhYUj Y}tu-Y@PuYYu YuYUuYu g Yu^ YuU YUukYu ; YhWYUuGYuuu h+YUuYu KYhYUuYuu YYhYUu YUuYUu YUuYUu u YYUu u YYUheYu5 YUUutYUVuYƅtv YF^UVWuEtUUuuu^~u vY<~V U9}v&9uGՉu6uY_^UV E4t U9Vt6^UV=u:58585454^UV=t:58585454^U VWu1YEu1SFtFF F~t uwYu E?F%FE_^UVWuYƹ EׅtjU YƋUV4FFF _^UVW}t#w+V 9Vu WV* Y_^UVW}j YH=WwF+V_^UVWp.V//=tuYt uYU=tjYƉ5 5VYj8 YNjV~GUWV,Y_^UVuYp.V//5YV VY^UV5U9Vt-VY~ t v YF^UjhIhd* jZ*YUhYUuYUuYu YUuYuu FYYUuYuu YYUuYu wYUuYu YUuYUheYuYu ,YUhAYuYh-YUhYuYUuYu YUuYu [YUu uYYU=q=u(h Y< ,<R5#YY<%<<G=<t1-<Ph<5( u<U9u EUU}u \hju& u1U=tE=t+ IQ =u jY5Yy=\t 5&&YU1=U9u.9u UVuwL9u9ur9u9un9uH^UVuwL9u 9ur9u9u9ux^UVu|1x},9u9FxZw9u9u9u9u~9u]9u79u 9u^U} u uY39uuYYu YUVWuVT!YPYO|&9uLF_^U9uuYU} u uY39uuYu cYU9uuYU9uxEuYu YUVWu} 9u2WYO|&9uF_^U VWE8L}~UU RYDžu}ubMt} ׋U E8E8E}} Nm 먃} rm U уM tGE_^UVuYƃ}t u^UVW}u YEƃ} t uVU уM tGFE_^Uu uYYUV}u u *Yu uvYYƃ} t u^UVW}u1_}s EUU}w&U_^UVWUrRUu!URUm}s7UrtUV_^UVU4ĿtV9U wv1^UVWU4Ŀs>tWtB1_^UVW=@uFFFFN#VV5@U )Vt#WtWYVWYY_^UVWUu ֋MzFFFFN#VUV)V@9Ut$#WWtWkYWV YY5@+UMQVY_^UVW} w։+UMQ9=@t#VUV9=@u U@_^UVWu }}u } ffF~ufFfF?<V%Y_^UdVW}uE] c] <UU 1fU M I Ju#<fG@GGAUMI JufG1҉WWfUBU Z)ۉfGU#JfMjEPYYEPEPYYfEfEfEEPu YYULU؅uMEEUUE}\UډU}uEuUN9)NщMU9| E|Uڃu UUh}|E}ES#UЙ}P}ZЉE#UЙ}R}YBUU9U|EU+UUUU+UډUEu,UNMMRQ)YY~ MUU˃}9EEỦU}fULUMMMMfM]Q19}AMUM)ˁfUUM됋UU19U~@Eu+UMf}hMEỦU}~=UMKLUEE%%fQUUM뽉uUMfUtEUЋ] EԃUWUWWl YWY_^U VWu} t<tt<1F} FW9mt&F=u~u~u <@<W‰fFtFFFFVNUMF-?PEP YYU UUt UډE_^UVW}1} E1}t] E 1EE 1Uu5<EP}tk] PW u5<}r8EP}t0PEP u5<UUW}tL k] PEPz u5<5<_^U VWu }EEEtG<ffF1҉VVEfG IEGEu}.UAM}.tE~c~VVNUMjFP YYjEP YYEPFPYYEU0UEPFPYYE}NMF}u<}Et }e_EE EG JEtkE U0‰UGEuUUU~u~tfF?V YuVGYYV Y_^U,VWuE1E*EtEfE ~EhVdYY|!Vh0V E E uV4YY|E GOk VLPV k] ] Eȑ} suVYY|E GOE 8hVYYh0VYY}!VhV_ E E EXuVyYY}E GOk V PV E k+ۋE VhȑV E E1uV#YY}E Gk VPV E )E 1E U9UREfEfEEEk PEP(EPVYY|0EPEPk ]SPEP E0UԋMEfEVEPV OJFu~kEfVfUfEVUF-؉U0ME}t.F-؉UUVEPV U0E~VhȑVV }fUUU=9~*0}vMUU@֋U1E ɋUM}v U:0u_^U@VWuuEP~<EPEPEP ǃ}t-FGF.FE}~?tGF }u 0FM܋UMI JtM}NeF}} -F]+F}O E0OEEu݀?tGFFU҉)9M} <uҋ} GFu_^U VWu }EPVW }u }u1Ut_^U$VWu }<V VuWu W WuVu ~VEP WEP }uF_)ۉ]}!]FEfFuFP\YY"}~GEfGuGP8YY9vwYYEvwYYE܃} }u4}~.}}OW+VWW+VWWu }~NV+WVV+WVVu XVu UGPRYYt4UjRhYYURMQUB@UfBuYu1Y_^UVu 1fuVu 1f^UVWu} +7RYY1ۅÉ]+VwR~YY1ۅÉ]WV}tB>u E_^UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUt(Ft!FFtFF@fFVY_^UVWuV VufFf_~uVVFF- fFFu3E@UVu}OFfFWFPYY_^UVWu} ?}F |V ~IVVJыVV>t) )ы VVI߃ |VF ~7~t&VU) VV_^U<U 1fUVuF=@|<fF@FFF=#<fFFfF^UVWu }Wf#WfVWfV#WfV_^UVWu} 9u1.|9}}9}_^Uuu P PPu UUURu P PPu UUUjuuu uJ ZY EU#+ $(JE1U$VWu }>W>%CE\JF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u EXJU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}L1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋EN@} N@} Džu}t N-N0_^UVWuFuNE E Fu_^UVWu }F9u Gu1 N)ۉ_^UVu>tF9E uN1^UVuFu+UJ^UVWu }UуMt%F9u Gu1N)ۉ1_^UVWuUуMtE E Fu_^UVW}1?tG9E uN_^UVuYƅtu1^UVutF6Y^U EPuYYtEUVWƅ1juoYYDžv1juRYYDž}ju YYu#1XjjW! }5WY1E0_^U}u1!Euu 0 ]1ۅÉUjYjY2 JEoUVTs~u1^U}u1Euu 0S 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P{nZsPsPR[) [)։ZsXsXfR[[׉1ۇ4tPXPoOsUVW}u M U$UUEEEEEEPjj U$uEP~U UEPj!jU(UUEEEEEEPjj` E=u U<1UVW5<<}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$uEPjU UEPjjU(UUUUU UEEEEPjjN E=uEUu UBUM JUju R]U,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjjR U$u2EUUU UEEEEPjjUVuU VVugYYEtF~}VډF^U$UUUUU UEEEEPjj UVW}kT P7YEu18u EUzUrThPO}E_^UVW=uwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVWǾ>t 6+V~ WY_^Uh>YUcUUURu u EU VWE%wWUV tVUY ETM}?u׋E_^UVuFuu P E|FPF %fF E^UVuV tFjjP F %fF ^uu Sm ^UVuFuu P E=u^ fF F fF UVPE^UUBPYUVu ~u F1VuYYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPYtEU@tF @fF E^UVWUJ t UzuuJYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ;YYt5uu5J5Jn}E-ELEuu5YYtELE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE|LM@ExUURUuEtL}|4ujuv t+EE9EU܉Uu'YEMUutUU#J UUBEEZE`LELLUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!0LURYELJEd+UU1}=UM EJEUUU}tE U@tEU9U~EEEU0U+UU=FEE}|EPu YYdm}UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu5,M5(Mut1uu54M50MW}MmE}tW9U$vFMF0}uUt F.1uu5.tF hME+U _^UVWu u5M5MIt'EPu u5M5MkYYP E-0PjEEu}uu5M5M~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UV=u/uV ufV u V t:~0tV@9V0t v0lYF0F %fF FVF fF ~uV YV tFVډVV t1FF1^UEPIjEPjPjjjmPj(UVW5VUT>M}}6u݃=tu Y_^=4CC [ =4;{SK k{uC [ SkC [=4C[=431C CtrIAÃ=4C s[ =4CK [ =4'C[U}u}uUM UMQ}u} tEjEPEPQ jEPEP? EPEP YYjEPEP UVu EPEP E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP jEPEP EPEPYYjEPEP UjEPEP jEPEP EPEPYYjEPEPT UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]UW}E MuG_]1_]U} |} ~M E 1U} |} ~M ҋE!1UE1UE1U} |} ~M Et1U$EEEEEEEPjj U$UUU UEEEEEPj%j U(VWu UJ<UUtuuUJ4ElEEEEPj0j& E؅}UJ<EUJ4}u_^UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U MM Zu u4)UUM] Z5M5MUM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uNYYXZ_^UU}u ha%UJ u uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W[ V+UVUUUyV9v,U9Us$u6W#UVtKVU9UruWvV, E'UUR6W V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuVPYu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SPYY}EEVU؁1 u@EEU؁u%~(du^ fF FLF fF usYEu^ fF 5cF fF UVUV}tFPYtF fF ^=4K C c[ U VWu} W WV VuWVnWV YY9zV9Ww 9WuHV9Wv@VEP.WV"U9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFP: YNF@fFVr Y_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWuE}} #V Vu WYFfF^~.jEYfFFFUAMt7pF*FP/ YF}FPFP( YYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPyYF}FPFPrYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVWufEU M I JujY1҉VVfF?V Vu fFFPtYU RgYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPMY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPmV7YF=}jYfF1҉VV!F=?|jYfF?1҉VV_^U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVyY_^UEUT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWV1t1f#V9Wv VVV+WVV+WVVY_^U`E]]PXa]g#D$D$D$U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj U$UUU UUUEEEEPjhjV 8u`=}aa%AFRUunterminated commentend-of-file in stringnewline in stringillegal line directivenon-ascii '\%03o' readtoken separator required between identifier and numberD.:<>& i ] E V zv/(LLlex) Impossible character classoverflow in floating point constantreal constant too long0.0bad scale factoroverflow in constantcharacter constant out of rangeconstant too longH expected after hex numberstring too longlast character of an identifier may not be an underscorean identifier may not contain two consecutive underscores(LLlex, STCOMP)garbage char \%03ogarbage char %c/<fr%s not expectedend of file expected0.0UUUU|| %s "%s", line %u: fatal error --CRASH(warning)(strict)(old-fashioned use)%s: Use a file argument could not open output file%s: cannot open %s FLOATDTRUNCDSHORTLONGINCLMINMAXODDORDSIZETRUNCDISPOSENEWVALINCDECEXCLHALTHIGHFLOATCHRCAPABSADRTSIZEBOOLEANTRUEFALSEBITSETPROCNIL(void)LONGCARDCARDINALLONGREALREALLONGINTINTEGERCHARcould not insert textADDRESSBYTEWORDout of memorywrite failedWITHWHILEVARUNTILTYPETOTHENSETRETURNREPEATRECORDQUALIFIEDPROCEDUREPOINTEROROFNOTMODULEMODLOOPINIMPORTIMPLEMENTATIONIFFROMFOREXPORTEXITENDELSIFELSEDODIVDEFINITIONCONSTCASEBYBEGINARRAYANDout of Memory@,,Cp, Qfunny type constructorlong real size smaller than real sizelong integer size smaller than integer sizeinteger size not equal to word sizetoo many enumeration literalsidentifier "%s" is not a typetype "%s" not (yet) declaredtype expected%$$$illegal base for a subrangeupperbound too large for type INTEGERspecified basetype for subrange not compatible with boundsbase type has insufficient rangelower bound exceeds upper boundillegal base type for subrangesubrange boundsmaximum return value size exceededmaximum parameter byte count exceededrckulrckilrckurckiset size too largeset type limits exceededbase type of set has negative lower boundillegal base type for setelement size of array too largearray too largetoo many elements in arrayillegal index typeopaque type "%s" has a circular definitionopaque type "%s" is not a pointer type(forward_type)"%s" is not a typeG//&/2A21x21Q21identifier "%s" already declaredidentifier "%s" must be a typeidentifier "%s" already used; may not be redefined in this scopeidentifier "%s" imported but not used_%d_%s%s_%sfunction procedure %s does not return a value_%d%s_inconsistent procedure declaration for "%s"name "%s" does not match block name "%s"#%d in %s, line %u%s "%s" not declared%s%s_%sillegal type for addresscannot import current module "%s"multiple occurrences of "%s" in export listidentifier "%s" not defined3AA@@@@identifier "%s" not exported from module "%s"identifier "%s" not declared in module "%s"identifier "%s" does not represent a modulecannot import from current module "%s"could not find a DEFINITION MODULE for "%s".defcannot import from current module "%s"definition module "%s" depends on itselfSYSTEMtype incompatibilityproperties of opaque type are hidden; illegal useequal sized types requiredidentical types requiredparameter %d: %%s"%s", parameter %d: %%s%s in %s8L LL}L^LJL(NodeCrash) Illegal node(PNodeCrash) Illegal nodeoverflow in constant expressionQM- M~FM!FM(cstunary)P #P*gN+O-P<JP=yP>XPcPnPOO(cstibin)modulo by 0division by 0Q#Q<eQ=Q>vQQQQ #OQ*Q++Q-=Q/Q<OQ=OQ>OQOQOQTRRTRTR6Rdivision by 0.0floating point overflow on %s(cstfbin)U#T&T*R+S-S<;T=T>ZTyTT TESES#T(cstubin)underflow in constant expressionmodulo by 0division by 0W*VVWVWVW#^W=^WJW2WW#W*iV+iV-iV/iV=WWW(cstset)pYwXXX X *Y bYhY3hY(cstcall)sizeof (arith) insufficient on this machinearray full_mask too small for this machine"%s": %s[n[Y[ N[;\%\;\;\;\\;\;\;\\']x\\\ \ [\x\x\might cause %s errorconversionconversionrange boundMkCoercionconversionMkCoercionvariable expected"^": illegal operand typeindex typenot indexing an ARRAY typenot exported from qualifying moduleidentifierillegal selectionillegal selectionstandard or local procedures may not be assignedvalue expectedset elementset element out of rangelower bound exceeds upper bound in rangenot a SET typetoo few arguments suppliedunexpected parameter typeunexpected parameter typeidentifier expectedtoo many parameters suppliedfunction call expectedprocedure, type, or function expectedi#i<i=i>iiiij#i*i+i-i/i<i=i>iii iii#i(AllowedTypes)"%s": %s in operands"%s": illegal operand type(s)"%s": illegal operand type(s)type incompatibility in IN"IN": right operand must be a seto+n-o~o!o"%s": illegal operand typeChkUnOper7yq py2p!qfwwtxbqhxrwtxss"ttvvwttqqvbqyyyyyyyyyyyyyyyyyyyyyyyyyywvtoo many parameters supplied(ChkStandard)EXCL/INCLSET parameter expectedillegal parameter typeTSIZE with multiple parameters, only first parameter used%s on conformant arrayDEALLOCATEALLOCATEpointer variable expectedNEW and DISPOSE are obsoleteNEW and DISPOSE are obsoletearray parameter expectedunexpected parameter typetype transfer function on conformant array not supportedunequal sizes in type casttype cast must have 1 parameterdesignator expectedD|OO|D|D|X|D|D|D|D|a||O|||||||||~d~~~~~m~~~}~~~~~~~u~~~~[~}Sdf~i~l~ps~w~F-{3{A{IT}L{M|R{U{V}W|g|l{n{s{w?|x{-V: bad type indicator %c wislfdpSminimum identifier length is %dmaximum identifier length is %dmalformed -M optionstackpriounstackpriokillbssmaximum local byte count exceededcopy_arraynew_stackptrfunction procedure "%s" does not always return a valueˑ (= v!2d()R081(WalkStat)RETURNrecord variable expectedzero stepsize in FOR loopprocedure call expected instead of function callstatement not reachedboolean expression expectedFOR statementFOR statementcompatibility required in FOR statementFOR statementFOR statementillegal type of FOR loop variableFOR-loop variable may not be importedFOR-loop variable may not be a parameterFOR-loop variable may not be a field of a recordassignmentvalue parametervariable parametervariabletypeprocedureconstant%s "%s" %soonever usednever assignednever used/assignedimported but not usedimported but not used/assignedܗ@ܗfm̛yy̛a(CodeValue)loadassignment to FOR-loop control variableHY}H<)<(CodeStore)store=ޟޟ lhlCodeMoveblockmoveStringAssignؠNiǠ(CodeAddress)gEEPP(CodeFieldDesig)  E%>%%_-______Ӣ(CodeDesig) class(CodeDesig) Uoperrcka(CodeDesig) Def(CodeConst)hqP ϥPPqPP(CodeExpr) bad node typeValue error3 !''!  Kl *GШ Ш Funny REAL conversionFunny cardinal conversionFunny integer conversionhMhhMhhhhMsubulchksubuchkaddulchkadduchkʮ ʮʮʮʮʮʮʮ'Iӯ. . 1==23(CodeStd)haltcapabsdabsfabslabsi.޴  W u fuǵl   N]  ֶ F и =. .! Q@!!=`#*+մ-K/<=> Ͷ$=#(CodeOper) Bad operatorbad type COMPAREbad type MODrmilrmibad type DIVdvildvibad type /bad type *mululchkmuluchkbad type -bad type +#<D=z>bSn(compare)#<=߼>˼ռ(truthvalue)T5 5 F-a!(3o4Bad unary operatorBad operand to unary -LtoUsetidentifier*h @O7, ,%d;,%ld,%ld;s%ld%s:%ld,;0;A%ld;%ld;%ld;%d%dr%d;%ld;%ldr%d;0;255r%d;0;-1r%d;0;255r%d;%ld;0r%d;0;-1r%d;%ld;%ld%d%d=%d%dO  @Q4j6@,%ld,%ld;';s'c%ld;i%ld;E%d;E%d;,%sQ%d;M%d; ++++ +%+-+/+5illegal priorityg_&I-___CC%_-_/_%-/export list not allowed in definition moduleexport list in definition module ignored_%s_DEFINITION MODULE name is "%s", not "%s"qDqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq{5_{{{;%-/59 55$%5'*-5/5568:<=d%=/  %-/__M2M_modulename %s does not match filename %s[ Compiling a definition module5;h/h;#5<C5;CCCCFprocedure "%s" has a constructed result type  %-/  %-/ EEE E%E-E/E]v  %-/k M%-/PZI  $9%H'**6:"56=>u6:5;<="=empty record declaration(dd5>>d("<=@"<O>yqq5q>q':' missingold fashioned Modula-2 syntax; ':' missingillegal type in variantillegal variant tag !:>BCF<<RQ<=lower bound exceeds upper bound in case label rangecase labelillegal type in case labelcase labelh s$s%s's*s6s:s7//5/:>/; /;=5555<>5 /6<=6kB0000000000000000000000000000000000000;constant expression expectedAlllllll !:BCF8A8888888888888888888N88888888888888888NN888AA~~~~~~~~~~~~~~~~~~~~R~~~~~~~~~~~~B77777777777777777777777777777777777&&C!:QF@=VGt ++++!+:+B+C+F+G| !:;BCF~J=vGv6HF"EEEEEEEEEEEEEEEEEEE"E"EEEEEEEEEEEEEE"UBMMMMMUUMUUUMMMMMUUUUUUUMUMUUMMUUUUUUUMMUMUUUUUUMMUMMMMMMMMMMMMMUM7= fff.f5f9:f>fN<rrr.%9()Y.r0S15r>rEXIT not in a LOOP':=' expected instead of '='444().4015>4YYVV>5   !:> BCFs (ssssYillegal type in BY clauseeee!.e5e:>eBCFfunction procedure "%s" must return a valueprocedure "%s" is not a function, so cannot return a valuea module body cannot return a value2$.8BLV`jt~ (2<FPZdnxbad tokenend of fileWITHWHILEVARUNTILTYPETOTHENSETRETURNREPEATRECORDQUALIFIEDPROCEDUREPOINTEROROFNOTMODULEMODLOOPINIMPORTIMPLEMENTATIONIFFROMFOREXPORTEXITENDELSIFELSEDODIVDEFINITIONCONSTCASEBYBEGINARRAYAND:=..>=<=realnumberstringidentifier$Id: rec,v 2.23 1997/02/21 11:23:55 ceriel Exp $fatal error: out of memory fatal error: out of memory   00illegal type in CASE-expressionmultiple case entry for value %ldmultiple case entry for value %ldcasecaseprocedure "%s" not definedhidden type "%s" not declaredidentifier "%s" not declared/tmpinternal error >>>>>>I+IIIJ+JJJWbWdWoWuWxW%~\\e\~\ \\\\\3lrkk lbl Xgblbl%gblblblblblbl+gGgblAgMgblggggggggggblblblblblblblblblblBhhblhblblblblgblbliblblblblbljblbljblblblblblblblblblblhFhhhhhFhblblhbliijblblAjbljblbljbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@wEsGuesfqgu$@@p  ;M     |tl32DEFINITION MODULE SYSTEM; TYPE PROCESS = ADDRESS; PROCEDURE NEWPROCESS(P:PROC; A:ADDRESS; n:CARDINAL; VAR p1:ADDRESS); PROCEDURE TRANSFER(VAR p1,p2:ADDRESS); END SYSTEM.    |xh`\TP H!D"@#<$4%(&'( )*+,-./01^T^jm]h`Ld{L`L{T^{{]{^L{{L^L LLLLLLLLLLL>'''' `E!#   @`5a_!c`W!c!P@E#@ @<L@ @@ < | <p <@0@@@@@@E@@E#?:;DB=C8E<5@9A67HF>G  !"#$%&'()*+,-./01234\H56'nC6 ;o:p.7 8;q:;8@[<]'9r=;s:t; !uv<<L^=w> x'-y'/z'B;?=<@@K'L'M'N'O'PA[{:@B %|C }8;~;.DI=:JEUF!'-'/'B;;;'7;G@@E#hH=@I/'J "E'EK@E'R'QL K"@M'SN*"KO$,P %Q@[<<]R(=)S@ TT@=:@'"V'UV<LW:S'W<LXX<L<Y()ZIJ[\.]<L^^<L__<L``<@aa<@U'd''(^)'!ab@g'c()d@{}e<L^fUbg@[^]'^h@@Ef'i'j'0^G'(G.^'G'k'1fG''l'i^+Gj@^"mk ^,^Gl)m<Ln'o9o'p >p'q9q'r't=;'u!Fu'v G'w ,w'x?;x'y;y'zA;z'{ ,[{'|()'~9~'?;'H;'A;' ;h'@'Q ,K'@@'Y' ;T'U':E@|V'S'\' ,X'<'Z':E'@[<]' ,^' _' ' `'0a'@@b'd8''@\'g'<L]'<Le'^' ,^''^^+G'G'@|m'G'  <'<L^'<LW:G'@&'=@'D':E':E' ,Z' ='#'<''>'' +'- +'-'#0*'/''' c' ,e'c' ' ;D's6s'}6}'6'?:;DB=C8E<5@9A67HF>G  !"#$%&'()*+,-./01234I<< @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%0123456789ABCDEFSSSS ((((( AAAAAABBBBBB L e$ddcd`e$ddcd e$ddcd 0000000000000000l  L( X1$T$L S\JXs=\JSSSSu \JQRPS PtU2VWu }SJWZ~:-u 6vY~ 5ShhKY jstYt&hpJh6Y u6hYYrUPYY:11_^UVuF>tC15,~luFFPsY <SF^Ui=t hpQY=t4hlh8[YPXYY Su(hh\YY SJh)YUVWtJJtJ} hpJ>\YpJpJSXNjtJJtJ} hpJ\YpJpJSXƁ| _^UVWtJJtJ} hpJ[YpJpJSXƋtJJtJ} hpJ[YpJpJSX ƋtJJtJ} hpJ^[YpJpJSXi ƋtJJtJ} hpJ*[YpJpJSXǁ|i _^UtJJtJ} hpJZYpJpJSX=uUhTYL=tU3h+YjuhL\ #juhLH QUhYLL|PUuhhL3Z U VWL1ljJWZt<tJJtJ} hpJYYpJpJSXEMsFF_^U,tJJtJ} hpJYYpJpJSXfLfLtJJtJ} hpJ.YYpJpJSXPYPYEvtfLdLS=t&h<<Yh,/Y(!NE ENUVtJJtJ} hpJ@XYpJpJSXƃu i~fLM|fL-}|fLVY^UVtJJtJ} hpJWYpJpJSXƁ}|xfLVY^UVW|hY=t hYa Lj*YFjjhL FS5SejYFLP YFxtLSh;YYVrS5S0LPbYLLJIjeYhYjKYnJI%= tPL=|(L=}LlPY jYfLfVjYLPYFjYƋLV jYLPUYFjwYjjhL FjTYjjhL Fcj1YjjhL FfLfV 8jYjjhL FLV |5KFS5SB_^UVu UIMaF=u ƋtJJtJ} hpJITYpJpJSXVP@fFZT^UVWj+YEǃEuhxYLLjdYƉLVQLjCYƉLSYFEfjYƉjjhLK FjYƉjjhL$ FLLjYƉjjhL FLV jYƉEFPuLYYdj[YƉjMYƉ j?YƉEfFF P=PYYE0H}t MuE}u܋E_^UVu} ~ t6M u h YVt h YF^UVWA R=E1h` YjY%jYj YjYFfEfEUeUY=SEHfEUt?}UHfEt EUߋ7ESE5Sj% YjjYjgYBjvrYYjvaYY S-V2EYV Yj YfEV Yj YfEjvYYF=~hSHP*FVjuYS3S6LLLShw YMF S=~aSSDžDD%}D$SDHPhS*E 1=u_h YR=SuXh YKLL=StL9St h YLS*$XE S=u1/(ELEEFS5S1_^U=u h  YUVW1҉U׋u>tF#U1ǃE_^U VWhSuY1YtM9Ju6 ljUW _^UV=t =u h=Yv=u1=tE=u(1&&El :}t F|+qSAA5U; Y=t5U& Yu-=Ut hhY^UVWE$S}S|E8fV uF fFv V UVt1V UUV F%fF^fFuƋ?뒃EwE$S}Ss*E8tG%fGG?E_^UVWSUs(7tV tF fF6߃_^U VW$SSs">tUWY}_^UVW$SSs$7t~uvhYY6_^UU UJM I!щUVWfE=UWUB ]9tEUfR fU5uYYEUB w5uiYYE5uKYYEjF9~FPu"YYE5u YYEFE.VU}t"UBEEUF?6FG??_^U VW5U1E99tuWV: }6_^UVW1҉UUU5SUUVJuV fV fVJuV fV fJVJuV fV fVU}}URJuUR fUR fNURJuUR fUR fUB(=EUVF<=v=Y+FPu=YVlRe=YFX=Uu(VUJuUB%UfBUB UfB=UuA=Ut8UBEU9U}UM]IUEڋUf $fJ U$@f$nU$@f$T=UGU$@f$-=UtU$@f$VUU}tC=U}:UJu&U UCrUUEUE1=U|@U=jvYY= t*jvYY= tjvYY= VUuQVJuV%fV fVLYF;Uuu=tGSJuSB%SfBSB SfBUUUUS_^U5|5Sh<hKf@=tSRjdh4hK?@h0hK-@YYu uhK@ h,hK @YYjZYUVW}~4CYƋEF_^UVW}Wփ~u w9Y4WYY_^UVU4YƋEfF^UVWut?>v7Yv ,YFT9F4V/YY_^UVWut>jVYY_^UjZYUjuYYUj<YUjuYYUj YUUR YUjYUVW1E}iUUUOEU UEUfBt9us E0u뼉?t U9s?EUE덅F9uB^ÉfFF="r)Fj:PYYF-fFF=|'FjPYYF-fF>FPVqYYQ_^UVW:9}}?4Ut+ U+UMRQ$YYvvUUօtU UH:9}}<4Ut( U+UMRQYY1_^UVWUU<};UօtU U'uYƅuuY uYƅu hpY}~fUU_^UugYUUU UEU M UUULVU PVUVULV9PV_=~VRn6Yƃu=95PVt 5PV5LVu =PVPV눃=u15LVULVLV^UVWufEV~uvZYvY}vYovvYaVU}QUrSYUrEYUB4EUFXZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~4E=t E@fEWYWYfVfUVlfUFn4E]9u=uUVYuE@]9u:=u1DWYUVYjYƋUFWYfUfUfEJI%0= ufEWY3JI SH Sz}T SI9J|2 S: t Sx5 Sj jRYYd5 SjVRYYP S S9VlR[Y&FPKYvxYuVr Y}VR BPYVr / Yv Y SH Sz}K SI9J|, S: t S45 Sj bQYY#5 SjQQYY S SvF YF PXY# SH Sz}K SI9J|, S: t S45 Sj PYY#5 SjPYY S Sv Yv YvYs SH Sz}K SI9J|, S: t SP5 Sj BPYY?5 Sj1PYY. S S1F$0UVYu SJ @VhPYF_^UVuvYVr Yv Y SH Sz}K SI9J|, S: t S45 Sj >OYY#5 Sj-OYY S Sv" Yv qY SH Sz}K SI9J|, S: t S45 Sj NYY#5 SjNYY S SFPY SH Sz}T SI9J|2 S: t S/5 Sj 3NYY5 SjNYY S S SH Sz}T SI9J|2 S: t S5 Sj MYY5 SjMYY S Sq SH Sz}K SI9J|, S: t S45 Sj 8MYY#5 Sj'MYY S SFP7YF PYF\-6#^UVW}1}}tUBƋEUVY1G9 SH SzR SI9J|/L7  S: t S;5 Sj KLYY*D75 SP6LYY SL7 SFo?^_^UVuF fFVt#VtPYVY^UVuVu<F fFVu#VtP[YVY^U5S]Yh7Y5SeY5SYUhY5SYU SH Sz[ SI9J|4E S: t SD5 Sj JYY3E5 SPJYYE S SUVu9uPY SH Sz}K SI9J|, S: t S45 Sj $JYY#5 SjJYY S S!PdYPPY^UE=E=x SH Szp SI9J|@Ex S: t S5 Sj PIYYEx5 SP.IYYEx S S| SH Sz}K SI9J|, S: t S45 Sj HYY#5 SjHYY S SEPYU SH Sz] SI9J|5E S: t SF5 Sj *HYY5E5 SPHYYE S S SH Szc SI9J|8E S: t SL5 Sj GYY;E5 SPzGYYE S SUVu~< SH Szo SI9J|AV S S: t S[5 Sj FYYJV5 SPFYY*V S SVY^UVu~  SH Sz}K SI9J|, S: t S45 Sj 3FYY#5 Sj"FYY S S SH Szd SI9J|:F S: t S5 Sj EYYF5 SPEYYF S S SH Sz}K SI9J|, S: t S45 Sj 'EYY#5 SjEYY S SFPmY^UVW}.GPFYE=  SH Sz}K SI9J|, S: t S45 Sj vDYY#5 SjeDYY S S SH Szd SI9J|:E S: t Sh5 Sj CYYTE5 SPCYY8E S S SH Sz}K SI9J|, S: t S45 Sj jCYY#5 SjYCYY S SEPY>t Wt9vFW)щM SH Sz SI9J|OWt S S: t Sh5 Sj BYYWW5 StPtBYY,Wt S SEPeYUуM SH SzP SI9J|.F S: t S5 Sj AYYF5 SPAYY녊F S Sl_^U VWES}Us#E0tVuVXY6EԀ='5 SI$Y SJhh'YYEu h YhYEHUz} uG+YEуE= SH Sz}Z SI9J|9 S  S: t Sw5 Sj p@YYc5 SW]@YYP S  S8x SH Sz}Q SI9J|3 S  S: t S45 Sj ?YY#5 SW?YY S  ShYjYES}Us*E0tF%=uVY6E͡ SH Sz}N SI9J|, S: t S75 Sj #?YY&5 Sh?YY S SEHUz} u:)YEуE= SH Sz}W SI9J|6 S  S: t S5 Sj o>YYo5 SW\>YY\ S  SDu=!YhY_^UVu|k^UVW9u 9u fAfUUEǁDFfUE=uFfUFE fEuEEUHfEt FPY݊FUN1ʁfU6tUN1ʁfUfE fEfEE}ULUfUTVfUU_EDEULU9u(UBRPW tE}EUMAJ fEMl9}u+E܁}~&hhKYYUEE}}=7~VUЃEt }t 6+V~ WY_^UhWYUXuYXUVEPu 'YYEu1xƅthuu$ E}fF ̋EfFEfF vF$^F,^F(_F i_Et jjV ^UUURu u EUVWuEPu A&YYEuVFY1=XuV ufF EE;V tVY1~ E^]}}tvV YEhuu" Dž}:}t4=`Jt =`Ju"vV Ehuu"Nj`JU}tvV YV €t vYFFFFF~0tV@9V0t v0YF0F4~DtvDuYFDFH}fF U`J}|9}tuW YY| We Y}EfF fFvF$^F,^F(_F i__^U VWElK%wWUV tVUY ETM}?u׋E_^UEPu.YYtEUjuYYtE1U(VW > ƋUUU:tE10M1ƋUU:Xtܾ/}GOU 9uBEPua!YYt1U܁@t `JۋU/ MU9Uw} t3hhuW ] | b=`Jt"돍EPu YYt=`Jto>d>zuFaKta{@p_^UVuV'YuNSX^U\fEUUUUUUURu EP EUEUVuFuu P E|FPF %fF E^UVuV tFjjP F %fF ^uu S ^UVuFuu PA E=u^ fF F fF UVPE^UUBPYUVu ~u F1Vu!YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPMYtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ'YYt5uu50 5, 6}E-E Euu!YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju. t+EE9EU܉Uu3YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYEL4 Ed+UU1}=UM EL EUUU}tE U@tEU9U~EEEU0U+UU=xKFEE}|EPu YYdm}xKUVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55=t1uu55}MmE}tW9U$vFMF0}uUt F.1uu55$}EPuu55YY EUuujj Z0Fuu558tMkuu55tMEPuu553YY< EUuujjx Z0Fuu55tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E+U _^UVWu u5(5$t'EPu u505,3YY< E-0PjEEu}uu5854~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VfYu1NUG9~tV t} u V8YuE_^UV=Xu+uV ufV u V t:~0tV@9V0t v0詩YF0F %fF FVF fF ~uVYV tFVډVV t1FF1^Uj juU UVW5XVUT>M}}6u݃=XtXu Y_^U VWuEFKu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEKt0%KUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE`J" }t]} t}tFE] E_^=SCC [ =S;{SK k{uC [ SkC [=SC[=S31C CtrIAÃ=SC s[ =SCK [ =S'C[U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP#YYjEPEPj UVu EPEPu E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEP?YjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEPs jEPEPa EPEP!YYjEPEP UjEPEP# jEPEP EPEPYYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E MuG_]1_]U} |} ~`J 5jurYY|U 9UuE u u juJU$UUEEEEEEPjj U$VuEE<E V֋RU V֋RUUUU UEEEPjdj< ^U$EEEEEEEPjj U(UUUUU UEEEEPjj E=uEUu jUBUM JUju ReU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjj U$u~EUUU UEEEEPjjpU$UUUUU UEEEEPjj. UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U lp Zu u4)UUM] Z5x5tUM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uYYXZ_^UU VWuVFZ|EE8EE@#EE@`J1)>+t >bu~+u EU UE _^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W V+UVUUUyV9v,U9Us$u6WwUVtKVU9UruWvV, E'UUR6W+ V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WMUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV8Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SP;YY}EEVU؁1 u@EEU؁u%~(_u^ fF FLF fF uޘYEu^ fF 5XuYF fF UVUV}tFPjYtF fF ^UUB % 1=uCt uY1UV=XuuFV t V uYV u `J V t)VdYuF %fF FFF fF 2~0t,V@9V0t v0詗YF0VT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVmt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVſt1f#V9Wv VVV+WVV+WVVY_^g#D$D$D$U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj U$UUU UUUEEEEPjhjj Ku`=}aaUVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]Cannot open %srUsage: %s [-Ln] [-m] [name] IL mncan't create %swwrong input fileint expectedsymbol expectedoffset expected.%u +GYj:offset expectedsymbol expectedE 7 unknown offset bytelabel %u multiple definedprocedure unterminated at eofunknown instruction byte+  " K Y g + + + ^ 6 B unknown byte in arglistoffset expectedtoo few parameters6 C O } v  ;;;;;!-LLLLL R ] l { { ] { { ' l inconsistency in number of bytes for localsbytes for locals still unknownEND misplacedbad second arg of PROunknown pseudoThis is not allowed outside a procedureredefined symbol %s%s is both proc and datalabelinstructions outside procedureNo MES EMX encounteredlocal label %u undefined<<ZZZxxx ,,-m+s       )6?AIehq"""  : (%.*s)%s: error on line %uout of memory Pr         C( D ##8#8#8#! !!! """*#write error$$$.$<$$D%%B&temp file disappearedr 7<7#7/989c:[;:c:m;m;y;;;M<<<<-==>!>/>>?=>L>[>j>z>>>>??{????@@ A.C$CBCSCcCsCCCWarning: possible loop in patterns; call an expert FFFFiGRG^GHONNO?WQaPdlPpPw[PxPyQ0+a0-w-w-w-w-w+a-w-a-a+a-w+?-w+w-w+w-w+w-w+w-w+w-w+w-a-p-x-p-w-p-a-p-w-w-w-a+a-w-a+a-w-a+a-w-a+a-w-w-p-p+p+p-w+a-d-p-d-d-a-a+a-p-p+a-a-a+a-a-a+a-p-a-p-?-?-w-a+a-w-a+a-a-a+a-a-a+a-a-?-p-a+a0-a+a-a+a-?+?-a-a+a-a-a+a-a-a+a+p+p+p-p+p-a-p+x+p+w-p+a-p+w+w+w00+w+w+a+d-p+d+d+d-p-a-p+?+p+p-a-a+a-w-a+w00-w+w-p-?0-a-a+a+a-a+a+w-a-a+a+a-a-a+a-a-a+a-a-a+a-a-x+x+x-a+a+a00-w+w-p+p-w-w-y+x-w-w-y+x-w-w-y+x-p-a-p-a-a-a+a-a-a+w-a-a+w-p-p+w-a-a+w-a-a+w-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-?-?0-w-w-w-w-a-p-p-p-p-w-w-w-w-w-w-w-w-a-x-a-a-a+a-a-a+a-a-p+p-p+p-a-a+a-a-a+a-p-a-p+pRRRRRRfeMfmff X}affaffffffaafaaf'b0b0b0b0b0b0b0b0b0bffffffffffbbfbffffabff7dfffff effHeffffffffff|bbbbbjbbffsbfc;dxdffdfeffQebug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@%rEsmGoesmfPlgo$@@||||||||||arӀw$Id: main.c,v 2.8 1994/06/24 10:40:17 ceriel Exp $$Id: getline.c,v 2.7 1994/06/24 10:40:03 ceriel Exp $$Id: lookup.c,v 2.7 1994/06/24 10:40:10 ceriel Exp $$Id: var.c,v 2.6 1994/06/24 10:41:18 ceriel Exp $/usr/tmp/emoptXXXXXX$Id: process.c,v 2.11 1994/06/24 10:40:42 ceriel Exp $$Id: backward.c,v 2.12 1994/06/24 10:39:46 ceriel Exp $$Id: util.c,v 2.7 1994/06/24 10:41:15 ceriel Exp $$Id: alloc.c,v 2.11 1994/06/24 10:39:37 ceriel Exp $    $Id: putline.c,v 2.7 1994/06/24 10:40:51 ceriel Exp $$Id: cleanup.c,v 2.6 1994/06/24 10:39:49 ceriel Exp $$Id: peephole.c,v 2.17 1994/06/24 10:40:38 ceriel Exp $I?F=qenc$Id: flow.c,v 2.10 1994/06/24 10:40:00 ceriel Exp $$Id: tes.c,v 1.6 1994/06/24 10:41:04 ceriel Exp $ | x t h \ P D 8 , $    x p d ` X P L H @ 8 4 0 $      | t l d \ X L D < 4 , (     | x t p l h d ` \ X T P $Id: reg.c,v 2.9 1994/06/24 10:40:55 ceriel Exp $4'4EE 4E`E`'EE#'E`E`0EE` E =<<`< KEE EY<<<gEEb E u<>#H%G H&> oo#dd#(p%o 2p&d <"F#M*'(W"*a|+ j~+ t+ ~+ ++|+ +-U,U - 99#9Hn 9Hc 9>=#9GF#9HF 9H= 99Fn19 9299=c19 93!999919 9529:9:79 :5D:9:99: 95V:::::: :5h::a<E=z9dc#9on#9pn 9pc :>:#:Hq :He :>>?#:G>I#:HI :H? :d>e#:o>q#:pq :pe =c,=c=cC9 9E'?e,7NHNpH?NGNoHIN>NdHSNoNGK*N o]NdN>K*N dmOGOoH}O>OdHOoOGK*O oOdO>K*O dNpNHN*N pEQ'E'SERE P~E PE-QU<-TUEFUF'EIUI' EQQU<~YM<YE7GE7E7E!II ,FF ,AA ,II,FF, AA,IIt,EFFt,E&AAt,E1IIy,E!<FFy,E!GAAy,E!RIEqEI q ]IEqEI q qIEqEI q IE8qEI 8q IE{qEI {q IFqFI q IFqFI q IFqFI q IF8qFI 8q IF{qFI {q IIqII q %IIqII q 9IIqII q MII8qII 8q aII{qII {q uIAqAI q IAqAI q IAqAI q IA8qAI 8q IA{qAI {q ?<e<? e ?<e<? e ?<e<? e ?<8e<? 8e )?<{e<? {e =?=e=? e Q?=e=? e e?=e=? e y?=8e=? 8e ?={e=? {e ??e?? e ??e?? e ??e?? e ??8e?? 8e ??{e?? {e FEnEF n FEnEF n -FEnEF n AFE8nEF 8n UFE{nEF {n iFFnFF n }FFnFF n FFnFF n FF8nFF 8n FF{nFF {n FInIF n FInIF n FInIF n FI8nIF 8n FI{nIF {n 1FAnAF n EFAnAF n YFAnAF n mFA8nAF 8n FA{nAF {n =<c<= c =<c<= c =<c<= c =<8c<= 8c =<{c<= {c ==c== c ==c== c !==c== c 5==8c== 8c I=={c== {c ]=?c?= c q=?c?= c =?c?= c =?8c?= 8c =?{c?= {c AEhEA h AEhEA h AEhEA h AE8hEA 8h AE{hEA {h %AIhIA h 9AIhIA h MAIhIA h aAI8hIA 8h uAI{hIA {h AFhFA h AFhFA h AFhFA h AF8hFA 8h AF{hFA {h AAhAA h AAhAA h AAhAA h )AA8hAA 8h =AA{hAA {h QH<p< H .p4eH<p< H .p4H<p< H .p4H<8p< H8 .p4H<{p< H{ .p4H?p? H .p4H?p? H .p4H?p? H .p4H?8p? H8 .p45H?{p? H{ .p4OH=p= H .p4iH=p= H .p4H=p= H .p4H=8p= H8 .p4H={p= H{ .p4><d!< > .d4><d!< > .d4><d!< > .d4><8d!< >8 .d49><{d!< >{ .d4S>?d!? > .d4m>?d!? > .d4>?d!? > .d4>?8d!? >8 .d4>?{d!? >{ .d4>=d!= > .d4>=d!= > .d4 >=d!= > .d4# >=8d!= >8 .d4= >={d!= >{ .d4W GEo#E G .o4q GEo#E G .o4 GEo#E G .o4 GE8o#E G8 .o4 GE{o#E G{ .o4 GIo#I G .o4 GIo#I G .o4 !GIo#I G .o4'!GI8o#I G8 .o4A!GI{o#I G{ .o4[!GFo#F G .o4u!GFo#F G .o4!GFo#F G .o4!GF8o#F G8 .o4!GF{o#F G{ .o4!GAo#A G .o4!GAo#A G .o4"GAo#A G .o4+"GA8o#A G8 .o4E"GA{o#A G{ .o4_"H<p< H .p4y"H<p< H .p4"H<p< H .p4"H<8p< H8 .p4"H<{p< H{ .p4"H?p? H .p4"H?p? H .p4#H?p? H .p4/#H?8p? H8 .p4I#H?{p? H{ .p4c#H=p= H .p4}#H=p= H .p4#H=p= H .p4#H=8p= H8 .p4#H={p= H{ .p4#><d!< > .d4#><d!< > .d4$><d!< > .d43$><8d!< >8 .d4M$><{d!< >{ .d4g$>?d!? > .d4$>?d!? > .d4$>?d!? > .d4$>?8d!? >8 .d4$>?{d!? >{ .d4$>=d!= > .d4%>=d!= > .d4%>=d!= > .d47%>=8d!= >8 .d4Q%>={d!= >{ .d4k%GEo#E G .o4%GEo#E G .o4%GEo#E G .o4%GE8o#E G8 .o4%GE{o#E G{ .o4%GIo#I G .o4&GIo#I G .o4!&GIo#I G .o4;&GI8o#I G8 .o4U&GI{o#I G{ .o4o&GFo#F G .o4&GFo#F G .o4&GFo#F G .o4&GF8o#F G8 .o4&GF{o#F G{ .o4&GAo#A G .o4 'GAo#A G .o4%'GAo#A G .o4?'GA8o#A G8 .o4Y'GA{o#A G{ .o4s'?FEEe(FEE ? e '?IEEe(IEE ? e '=FEEc(FEE = c '=IEEc(IEE = c '?FEEQe(FEE ? Qe (?IEEQe(IEE ? Qe (=FEEQc(FEE = Qc ;(=IEEQc(IEE = Qc X(H,)u(:HEEEE84 I6E8I?E 8I7E.8I E48(E*qE*q8E qE q4E E (p= p. (p> p. (qI@*q (nF,*n )hA,*h )e?@*e )c=,*c &)II@I *2)FF,F *@)AA,A *L)??@? *X)==,= *f)GGH G*r)GGH G*)HHA H*)*pE p.  )pF p.  )I*) )I*) )hAJ*) h)pHQ*) p)*pHQ*) p)*IRS4*?TUB*              !  ! $ $  )    ./ -0   4. 16 18 96  ;  # ?  A @BD   FG  IF JGL! KM O P R P P V " "  Z Z Z   ! a a_  d D f  h  k  m n@ q r u v y z d f h k n r v z    . G  !    O ,_ ,. H  a     ] ,  Z  Z . 4 .! .u .        .  # = )    !     " _      !     ! ! !    G=# F  a _ _ ! F       _      _  G4  4    "4 $% & 'EE )*! ! ,-.! ./4! 012 +3j 5  9.):; G< G; ?, H? B) CD CG G! H I 4K! LG) MN.) OP$Id: patterns,v 2.54 1994/10/19 14:09:26 ceriel Exp $ < +776   90   SSSSMpJi_^_^Ji_^_^ Ki_^_^dJpJ 0000000000000000X ((((( AAAAAABBBBBB   L( X1$T$L S\JXs=\JSSSSu \JQRPS PtU2VWu }SJWZ~:-u 6vY~ 5ShhKyY jOtYt&hpJh6yY u6hYYrUPYY:11_^UVuF>tC15,~luFFPsY <cSF^Ui=t hpQY=t4hlh[YPWYY Su(hh\YY SJh)YUVWtJJtJ} hpJ\YpJpJSXNjtJJtJ} hpJ[YpJpJSXƁ| _^UVWtJJtJ} hpJ[YpJpJSXƋtJJtJ} hpJm[YpJpJSX ƋtJJtJ} hpJ:[YpJpJSXi ƋtJJtJ} hpJ[YpJpJSXǁ|i _^UtJJtJ} hpJZYpJpJSX=uUhTYL=tU3h+YjuhL\ #juhLH PUhYLL|PUuhhLZ U VWL1ljJWZt<tJJtJ} hpJYYpJpJSXEMsFF_^U,tJJtJ} hpJ[YYpJpJSXfLfLtJJtJ} hpJ YYpJpJSXPYPYEvtfLdLS=t&h<<Yh,/Y(!NE ENUVtJJtJ} hpJXYpJpJSXƃu i~fLM|fL-}|fLVY^UVtJJtJ} hpJoWYpJpJSXƁ}|xfLVY^UVW|hY=t hYa Lj*YFjjhL FS5SejYFLP YFxtLSh;YYVrS5S0LPbYLLJIjeYhYjKYnJI%= tPL=|(L=}LlPY jYfLfVjYLPYFjYƋLV jYLPUYFjwYjjhL FjTYjjhL Fcj1YjjhL FfLfV 8jYjjhL FLV |KFS5SB_^UVu UIMaF=u ƋtJJtJ} hpJ%TYpJpJSXVP@fFZT^UVWj+YEǃEuhxYLLjdYƉLVQLjCYƉLSYFEfjYƉjjhLK FjYƉjjhL$ FLLjYƉjjhL FLV jYƉEFPuLYYdj[YƉjMYƉ j?YƉEfFF P=PYYE0H}t MuE}u܋E_^UVu} ~ t6M u h YVt h YF^UVWA R=E1h` YjY%jYj YjYFfEfEUeUY=SEHfEUt?}UHfEt EUߋ7ESE5Sj% YjjYjgYBjvrYYjvaYY S-V2EYV Yj YfEV Yj YfEjvYYF=~hSHP*iFVjuYS3S6LLLShw Y)F S=~aSSDžDD%}D$SDHPhS*E 1=u_h YR=SuXh YKLL=StL9St h YLS*$4E S=u1/(ELDEFS5S1_^U=u h  YUVW1҉U׋u>tF#U1ǃE_^U VWhSuY1YtM9Ju6 ljUW _^UV=t =u h=Yv=u1=tE=u(1&&El :}t F|+qSAA5U; Y=t5U& Yu-=Ut hhY^UVWE$S}S|E8fV uF fFv V UVt1V UUV F%fF^fFuƋ?뒃EwE$S}Ss*E8tG%fGG?E_^UVWSUs(7tV tF fF6߃_^U VW$SSs">tUWY}_^UVW$SSs$7t~uvhYY6_^UU UJM I!щUVWfE=UWUB ]9tEUfR fU5uYYEUB w5uiYYE5uKYYEjF9~FPu"YYE5u YYEFE.VU}t"UBEEUF?6FG??_^U VW5U1E99tuWV: }6_^UVW1҉UUU5SUUVJuV fV fVJuV fV fJVJuV fV fVU}}URJuUR fUR fNURJuUR fUR fUB(=EUVF<=v=Y+FPu=YVlRe=YFXt=Uu(VUJuUB%UfBUB UfB=UuA=Ut8UBEU9U}UM]IUEڋUf $fJ U$@f$nU$@f$T=UGU$@f$-=UtU$@f$VUU}tC=U}:UJu&U UCrUUEUE1=U|@U=jvYY= t*jvYY= tjvYY= VUuQVJuV%fV fVLYFs;Uuu=tGSJuSB%SfBSB SfBUUUUS_^U5|5Sh<hKB@=tSRjdh4hK@h0hK @YYu uhK? h,hK?YYjZYUVW}~4CYƋEF_^UVW}Wփ~u w9Y4WYY_^UVU4YƋEfF^UVWut?>v7Yv ,YFTz9F4V/YY_^UVWut>jVYY_^UjZYUjuYYUj<YUjuYYUj YUUR YUjYUVW1E}iUUUOEU UEUfBt9us E0u뼉?t U9s?EUE덅F9uB^ÉfFF="r)Fj:PYYF-fFF=|'FjPYYF-fF>FPVqYYQ_^UVW:9}}?4Ut+ U+UMRQ$YYvvUUօtU UH:9}}<4Ut( U+UMRQYY1_^UVWUU<};UօtU U'uYƅuuY uYƅu hpY}~fUU_^UugYUUU UEU M UUULVU PVUVULV9PV_=~VRJ6Yƃu=95PVt 5PV5LVu =PVPV눃=u15LVULVLV^UVWufEV~uvZYvY}vYovvYaVU}QUrSYUrEYUB4EUF4E=t E@fEWYWYfVfUVlfUFJ4E]9u=uUVYuE@]9u:=u1DWYUVYjYƋUFWYfUfUfEJI%0= ufEWY3JI SH Sz}T SI9J|2 S: t Sx5 Sj FRYYd5 Sj2RYYP S S9VlR[Y&FPKYvxYuVr Y}VR BPYVr / Yv Y SH Sz}K SI9J|, S: t S45 Sj >QYY#5 Sj-QYY S SvF YF PXY# SH Sz}K SI9J|, S: t S45 Sj PYY#5 SjPYY S Sv Yv YvYs SH Sz}K SI9J|, S: t SP5 Sj PYY?5 Sj PYY. S S0F$0UVYu SJ @VhPYF_^UVuvYVr Yv Y SH Sz}K SI9J|, S: t S45 Sj OYY#5 Sj OYY S Sv" Yv qY SH Sz}K SI9J|, S: t S45 Sj NYY#5 SjNYY S SFPY SH Sz}T SI9J|2 S: t S/5 Sj NYY5 SjMYY S S SH Sz}T SI9J|2 S: t S5 Sj MYY5 Sj|MYY S Sq SH Sz}K SI9J|, S: t S45 Sj MYY#5 SjMYY S SFP7YF PYF\-6#^UVW}1}}tUBƋEUVY1G9 SH SzR SI9J|/L7  S: t S;5 Sj 'LYY*D75 SPLYY SL7 SFo?^_^UVuF fFVt#VtPYVY^UVuVu<F fFVu#VtP[YVY^U5S]Yh7Y5SeY5SYUhY5SYU SH Sz[ SI9J|4E S: t SD5 Sj JYY3E5 SPJYYE S SUVu9uPY SH Sz}K SI9J|, S: t S45 Sj JYY#5 SjIYY S S!PdYPPY^UE=E=x SH Szp SI9J|@Ex S: t S5 Sj ,IYYEx5 SP IYYEx S S| SH Sz}K SI9J|, S: t S45 Sj HYY#5 SjHYY S SEPYU SH Sz] SI9J|5E S: t SF5 Sj HYY5E5 SPGYYE S S SH Szc SI9J|8E S: t SL5 Sj sGYY;E5 SPVGYYE S SUVu~< SH Szo SI9J|AV S S: t S[5 Sj FYYJV5 SPFYY*V S SVY^UVu~  SH Sz}K SI9J|, S: t S45 Sj FYY#5 SjEYY S S SH Szd SI9J|:F S: t S5 Sj EYYF5 SPsEYYF S S SH Sz}K SI9J|, S: t S45 Sj EYY#5 SjDYY S SFPmY^UVW}.GPEYE=  SH Sz}K SI9J|, S: t S45 Sj RDYY#5 SjADYY S S SH Szd SI9J|:E S: t Sh5 Sj CYYTE5 SPCYY8E S S SH Sz}K SI9J|, S: t S45 Sj FCYY#5 Sj5CYY S SEPY>t Wt9vFW)щM SH Sz SI9J|OWt S S: t Sh5 Sj {BYYWW5 StPPBYY,Wt S SEPeYUуM SH SzP SI9J|.F S: t S5 Sj AYYF5 SPAYY녊F S Sl_^U VWES}Us#E0tVuVXY6EԀ='5 S%$Y SJhh&YYEu h YhYEHUz} u#+YEуE= SH Sz}Z SI9J|9 S  S: t Sw5 Sj L@YYc5 SW9@YYP S  S8x SH Sz}Q SI9J|3 S  S: t S45 Sj ?YY#5 SW?YY S  ShYjYES}Us*E0tF%=uVY6E͡ SH Sz}N SI9J|, S: t S75 Sj >YY&5 Sh>YY S SEHUz} u)YEуE= SH Sz}W SI9J|6 S  S: t S5 Sj K>YYo5 SW8>YY\ S  SDu!YhlY_^UVu|k^UVW9u 9u fAfUUEǁDFfUE=uFfUFE fEuEEUHfEt FPY݊FUN1ʁfU6tUN1ʁfUfE fEfEE}ULUfUTVfUU_EDEULU9u(UBRPW tE}EUMAJ fEMl9}u+E܁}~&hhKjYYUEE}}=7~VUЃEt }t 6+V~ WY_^UhWYUXQYXUVEPu 'YYEu1xƅthuu$ E}fF ̋EfFEfF vF$d^F,^F(^F E_Et jjV ^UUURu u EUVWuEPu A&YYEuVFY1=XuV ufF EE;V tVY1~ E^]}}tvV YEhuu" Dž}:}t4=`Jt =`Ju"vV Ehuu"Nj`JU}tvV YV €t vYFFFFF~0tV@9V0t v0YF0F4~DtvDYFDFH}fF U`J}|9}tuW YY| We Y}EfF fFvF$d^F,^F(^F E__^U VWElK%wWUV tVUY ETM}?u׋E_^UEPu.YYtEUjuYYtE1U(VW > ƋUUU:tE10M1ƋUU:Xtܾ/}GOU 9uBEPua!YYt1U܁@t `JۋU/ MU9Uw} t3hhuW ] | b=`Jt"돍EPu YYt=`Jto>d>zuFaKta{@p_^UVuV'YuNSX^U\fEUUUUUUURu EP EUEUVuFuu P E|FPF %fF E^UVuV tFjjP F %fF ^uu S ^UVuFuu PA E=u^ fF F fF UVPE^UUBPYUVu ~u F1Vu!YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPMYtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ'YYt5uu50 5, 6}E-E Euu!YYtEE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEM@ExUURUuE}|4uju. t+EE9EU܉Uu3YEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYEL4 Ed+UU1}=UM EL EUUU}tE U@tEU9U~EEEU0U+UU=xKFEE}|EPu YYdm}xKUVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu.uNFuuV, 0}uEU9UB}uOuu55=t1uu55}MmE}tW9U$vFMF0}uUt F.1uu55$}EPuu55YY EUuujj Z0Fuu558tMkuu55tMEPuu553YY< EUuujjx Z0Fuu55tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E+U _^UVWu u5(5$t'EPu u505,3YY< E-0PjEEu}uu5854~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VfYu1NUG9~tV t} u V8YuE_^UV=Xu+uV ufV u V t:~0tV@9V0t v0ͩYF0F %fF FVF fF ~uVYV tFVډVV t1FF1^Uj juU UVW5XVUT>M}}6u݃=XtXu Y_^U VWuEFKu-u E+uFǃ}t}u0u>xt>XuFǃE}u0u E}tE1uUE1uEEEKt0%KUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tE`J" }t]} t}tFE] E_^=SCC [ =S;{SK k{uC [ SkC [=SC[=S31C CtrIAÃ=SC s[ =SCK [ =S'C[U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP#YYjEPEPj UVu EPEPu E}1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEP?YjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEPs jEPEPa EPEP!YYjEPEP UjEPEP# jEPEP EPEPYYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UW}E MuG_]1_]U} |} ~`J 5jurYY|U 9UuE u u juJU$UUEEEEEEPjj U$VuEE<E V֋RU V֋RUUUU UEEEPjdj< ^U$EEEEEEEPjj U(UUUUU UEEEEPjj E=uEUu jUBUM JUju ReU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjj U$u~EUUU UEEEEPjjpU$UUUUU UEEEEPjj. UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U lp Zu u4)UUM] Z5x5tUM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uYYXZ_^UU VWuVFZ|EE8EE@#EE@`J1)>+t >bu~+u EU UE _^U VWU RUu1"uV t~uVYE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W V+UVUUUyV9v,U9Us$u6WwUVtKVU9UruWvV, E'UUR6W+ V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WMUVtHVU9U|uWvV, E$pUUR6W V+UVUU+UUuV8Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SP;YY}EEVU؁1 u@EEU؁u%~(^u^ fF FLF fF uYEu^ fF 5XQYF fF UVUV}tFPjYtF fF ^UUB % 1=uCt uY1UV=XuuFV t V uYV u `J V t)VdYuF %fF FFF fF 2~0t,V@9V0t v0͗YF0VT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVmt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVſt1f#V9Wv VVV+WVV+WVVY_^g#D$D$D$U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj U$UUU UUUEEEEPjhjj Ku`=}aaUVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]Cannot open %srUsage: %s [-Ln] [-m] [name] IL mncan't create %swwrong input fileint expectedsymbol expectedoffset expected.%u +GYj:offset expectedsymbol expectedE 7 unknown offset bytelabel %u multiple definedprocedure unterminated at eofunknown instruction byte+  " K Y g + + + ^ 6 B unknown byte in arglistoffset expectedtoo few parameters6 C O } v  ;;;;;!-LLLLL R ] l { { ] { { ' l inconsistency in number of bytes for localsbytes for locals still unknownEND misplacedbad second arg of PROunknown pseudoThis is not allowed outside a procedureredefined symbol %s%s is both proc and datalabelinstructions outside procedureNo MES EMX encounteredlocal label %u undefined<<ZZZxxx ,,-m+s       )6?AIehq"""  : (%.*s)%s: error on line %uout of memory Pr         C( D ##8#8#8#! !!! """*#write error$$$.$<$$D%%B&temp file disappearedr 7<7#7/989c:[;:c:m;m;y;;;M<<<<-==>!>/>>?=>L>[>j>z>>>>??{????@@ A.C$CBCSCcCsCCCWarning: possible loop in patterns; call an expert FFFFiGRG^GHONNO?WQaPdlPpPw[PxPyQ0+a0-w-w-w-w-w+a-w-a-a+a-w+?-w+w-w+w-w+w-w+w-w+w-w+w-a-p-x-p-w-p-a-p-w-w-w-a+a-w-a+a-w-a+a-w-a+a-w-w-p-p+p+p-w+a-d-p-d-d-a-a+a-p-p+a-a-a+a-a-a+a-p-a-p-?-?-w-a+a-w-a+a-a-a+a-a-a+a-a-?-p-a+a0-a+a-a+a-?+?-a-a+a-a-a+a-a-a+a+p+p+p-p+p-a-p+x+p+w-p+a-p+w+w+w00+w+w+a+d-p+d+d+d-p-a-p+?+p+p-a-a+a-w-a+w00-w+w-p-?0-a-a+a+a-a+a+w-a-a+a+a-a-a+a-a-a+a-a-a+a-a-x+x+x-a+a+a00-w+w-p+p-w-w-y+x-w-w-y+x-w-w-y+x-p-a-p-a-a-a+a-a-a+w-a-a+w-p-p+w-a-a+w-a-a+w-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-w-w-y+x-?-?0-w-w-w-w-a-p-p-p-p-w-w-w-w-w-w-w-w-a-x-a-a-a+a-a-a+a-a-p+p-p+p-a-a+a-a-a+a-p-a-p+pRRRRRRsfe)fIff XYaffeaffffffkaafaafb b b b b b b b b bffffffffffbbfbffff=bffdfffffdff$effffffffffXbbbbbFbbffObfcdTdffdfdff-ebug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@rEOmGoeOmf,lgo$@@||||||||||aـrwĀ$Id: main.c,v 2.8 1994/06/24 10:40:17 ceriel Exp $$Id: getline.c,v 2.7 1994/06/24 10:40:03 ceriel Exp $$Id: lookup.c,v 2.7 1994/06/24 10:40:10 ceriel Exp $$Id: var.c,v 2.6 1994/06/24 10:41:18 ceriel Exp $/usr/tmp/emoptXXXXXX$Id: process.c,v 2.11 1994/06/24 10:40:42 ceriel Exp $$Id: backward.c,v 2.12 1994/06/24 10:39:46 ceriel Exp $$Id: util.c,v 2.7 1994/06/24 10:41:15 ceriel Exp $$Id: alloc.c,v 2.11 1994/06/24 10:39:37 ceriel Exp $    $Id: putline.c,v 2.7 1994/06/24 10:40:51 ceriel Exp $$Id: cleanup.c,v 2.6 1994/06/24 10:39:49 ceriel Exp $$Id: peephole.c,v 2.17 1994/06/24 10:40:38 ceriel Exp $I?F=qenc$Id: flow.c,v 2.10 1994/06/24 10:40:00 ceriel Exp $$Id: tes.c,v 1.6 1994/06/24 10:41:04 ceriel Exp $ | x t h \ P D 8 , $    x p d ` X P L H @ 8 4 0 $      | t l d \ X L D < 4 , (     | x t p l h d ` \ X T P $Id: reg.c,v 2.9 1994/06/24 10:40:55 ceriel Exp $4'4EE 4E`E`'EE#'E`E`0EE` E =<<`< KEE EY<<<gEEb E u<>#H%G H&> oo#dd#(p%o 2p&d <"F#M*'(W"*a|+ j~+ t+ ~+ ++|+ +-U,U - 99#9Hn 9Hc 9>=#9GF#9HF 9H= 99Fn19 9299=c19 93!999919 9529:9:79 :5D:9:99: 95V:::::: :5h::a<E=z9dc#9on#9pn 9pc :>:#:Hq :He :>>?#:G>I#:HI :H? :d>e#:o>q#:pq :pe =c,=c=cC9 9E'?e,7NHNpH?NGNoHIN>NdHSNoNGK*N o]NdN>K*N dmOGOoH}O>OdHOoOGK*O oOdO>K*O dNpNHN*N pEQ'E'SERE P~E PE-QU<-TUEFUF'EIUI' EQQU<~YM<YE7GE7E7E!II ,FF ,AA ,II,FF, AA,IIt,EFFt,E&AAt,E1IIy,E!<FFy,E!GAAy,E!RIEqEI q ]IEqEI q qIEqEI q IE8qEI 8q IE{qEI {q IFqFI q IFqFI q IFqFI q IF8qFI 8q IF{qFI {q IIqII q %IIqII q 9IIqII q MII8qII 8q aII{qII {q uIAqAI q IAqAI q IAqAI q IA8qAI 8q IA{qAI {q ?<e<? e ?<e<? e ?<e<? e ?<8e<? 8e )?<{e<? {e =?=e=? e Q?=e=? e e?=e=? e y?=8e=? 8e ?={e=? {e ??e?? e ??e?? e ??e?? e ??8e?? 8e ??{e?? {e FEnEF n FEnEF n -FEnEF n AFE8nEF 8n UFE{nEF {n iFFnFF n }FFnFF n FFnFF n FF8nFF 8n FF{nFF {n FInIF n FInIF n FInIF n FI8nIF 8n FI{nIF {n 1FAnAF n EFAnAF n YFAnAF n mFA8nAF 8n FA{nAF {n =<c<= c =<c<= c =<c<= c =<8c<= 8c =<{c<= {c ==c== c ==c== c !==c== c 5==8c== 8c I=={c== {c ]=?c?= c q=?c?= c =?c?= c =?8c?= 8c =?{c?= {c AEhEA h AEhEA h AEhEA h AE8hEA 8h AE{hEA {h %AIhIA h 9AIhIA h MAIhIA h aAI8hIA 8h uAI{hIA {h AFhFA h AFhFA h AFhFA h AF8hFA 8h AF{hFA {h AAhAA h AAhAA h AAhAA h )AA8hAA 8h =AA{hAA {h QH<p< H .p4eH<p< H .p4H<p< H .p4H<8p< H8 .p4H<{p< H{ .p4H?p? H .p4H?p? H .p4H?p? H .p4H?8p? H8 .p45H?{p? H{ .p4OH=p= H .p4iH=p= H .p4H=p= H .p4H=8p= H8 .p4H={p= H{ .p4><d!< > .d4><d!< > .d4><d!< > .d4><8d!< >8 .d49><{d!< >{ .d4S>?d!? > .d4m>?d!? > .d4>?d!? > .d4>?8d!? >8 .d4>?{d!? >{ .d4>=d!= > .d4>=d!= > .d4 >=d!= > .d4# >=8d!= >8 .d4= >={d!= >{ .d4W GEo#E G .o4q GEo#E G .o4 GEo#E G .o4 GE8o#E G8 .o4 GE{o#E G{ .o4 GIo#I G .o4 GIo#I G .o4 !GIo#I G .o4'!GI8o#I G8 .o4A!GI{o#I G{ .o4[!GFo#F G .o4u!GFo#F G .o4!GFo#F G .o4!GF8o#F G8 .o4!GF{o#F G{ .o4!GAo#A G .o4!GAo#A G .o4"GAo#A G .o4+"GA8o#A G8 .o4E"GA{o#A G{ .o4_"H<p< H .p4y"H<p< H .p4"H<p< H .p4"H<8p< H8 .p4"H<{p< H{ .p4"H?p? H .p4"H?p? H .p4#H?p? H .p4/#H?8p? H8 .p4I#H?{p? H{ .p4c#H=p= H .p4}#H=p= H .p4#H=p= H .p4#H=8p= H8 .p4#H={p= H{ .p4#><d!< > .d4#><d!< > .d4$><d!< > .d43$><8d!< >8 .d4M$><{d!< >{ .d4g$>?d!? > .d4$>?d!? > .d4$>?d!? > .d4$>?8d!? >8 .d4$>?{d!? >{ .d4$>=d!= > .d4%>=d!= > .d4%>=d!= > .d47%>=8d!= >8 .d4Q%>={d!= >{ .d4k%GEo#E G .o4%GEo#E G .o4%GEo#E G .o4%GE8o#E G8 .o4%GE{o#E G{ .o4%GIo#I G .o4&GIo#I G .o4!&GIo#I G .o4;&GI8o#I G8 .o4U&GI{o#I G{ .o4o&GFo#F G .o4&GFo#F G .o4&GFo#F G .o4&GF8o#F G8 .o4&GF{o#F G{ .o4&GAo#A G .o4 'GAo#A G .o4%'GAo#A G .o4?'GA8o#A G8 .o4Y'GA{o#A G{ .o4s'?FEEe(FEE ? e '?IEEe(IEE ? e '=FEEc(FEE = c '=IEEc(IEE = c '?FEEQe(FEE ? Qe (?IEEQe(IEE ? Qe (=FEEQc(FEE = Qc ;(=IEEQc(IEE = Qc X(H,)u(:HEEEE84 I6E8I?E 8I7E.8I E48(E*qE*q8E qE q4E E (p= p. (p> p. (qI@*q (nF,*n )hA,*h )e?@*e )c=,*c &)II@I *2)FF,F *@)AA,A *L)??@? *X)==,= *f)GGH G*r)GGH G*)HHA H*)*pE p.  )pF p.  )I*) )I*) )hAJ*) h)pHQ*) p)*pHQ*) p)*IRS4*?TUB*              !  ! $ $  )    ./ -0   4. 16 18 96  ;  # ?  A @BD   FG  IF JGL! KM O P R P P V " "  Z Z Z   ! a a_  d D f  h  k  m n@ q r u v y z d f h k n r v z    . G  !    O ,_ ,. H  a     ] ,  Z  Z . 4 .! .u .        .  # = )    !     " _      !     ! ! !    G=# F  a _ _ ! F       _      _  G4  4    "4 $% & 'EE )*! ! ,-.! ./4! 012 +3j 5  9.):; G< G; ?, H? B) CD CG G! H I 4K! LG) MN.) OP$Id: patterns,v 2.54 1994/10/19 14:09:26 ceriel Exp $ < +776   90   SSSSMpJE_d^^^JE_d^^^ KE_d^^^dJpJ 0000000000000000X ((((( AAAAAABBBBBB   0OX+tz1$T$L vOtzs=OSSSSu OQRPv)P UVWE`w`wƅuk5Ɖ}=EtWhYYn`w`wƅu.5ƃsuvt-u WhYY-u Ƈv"+u Ƈv `wLE`w`wƅu4ƃ-uEv+u1}v `wEE`w`wƅuZ4ƃ0|09+kE 0‰U`w`wƅu'4 `w=EtWhYY,}WhtuYYUxw `w`wƅu3ƃ,1 `w_^UV`w`wƅu3ƃ$uPHuhwBfhwA*u"`w`wƅuD3ƃ)u7}t2u hY`w`wƅu3^UVWj ' YE j  YljF`w`wEu2EU€tPhGYYEPHu%hlYhwBfhw~}uhTYeU9Uu%`w`wEu:2EU9Uu8UG+V9U@URv YYF}ǃE}u O `w+VG>uh %Y_^UVWEv`w`wƅu1ƃ#t `w`w`wƅuY1ƀPHu&hwBfhw5EYu O PHuPHu+kE 0‰U`w`wƅu0́u O"t.t&PHt`w`wƅu0̓"`w`wƅup0ƉGPHu&hwBfhw5E)Y"uO`w`wƅu0ƀPHu܃=Ou>vP5lwCYYt&vPYPvP& YYlw=Ot5EY#Ufhw_^UVWEv\wvvt2hvuvvfvU%Uf hwfJ=OtO`w`wƅu.ƀ=wuA| Z 1 ƀPhTYYhwBfhwUJAUfJG=Eu"t_uUf8sVhYY'VhYY(s`w`wEu.E}*uOUf hwfJ}.u[Mf}u O/ `w'{uUf hwfJ_@u^UfY`w`wEW-E}.u Mf})]Mf}= Mf}=uMf}>uIMf}=u.Mfh`Y m}u O `wUfBs=wuA| Z 1 ƍs)9 E~G`w`wƅu ,ƃs Huu O `ws_u h|-YjsP'YYhUBhztBUfjVYǃ?u/'u*WMYTwvwYWY5'uUz7jh / vUz|wvMfgDž`ƅf-f9wG`w`wƅu*ƃs XIuȃ.`w`wƅu*ƃ[XItRf9w.Gf9wG`w`wƅuD*ƃs XIuDž``w`w`wet E\f9wG`w`wƅu)ƃ+t-u*f9wG`w`wƅu)ƃsMXItDf9wG`w`wƅuc)ƃs XIuDž`3`w`w`w+\u `w\u O `wG`g9vUBhh. Yvg?0uGj W YYUBUz|DW= YP5dw0 YZ9+W$ YP5dw YZ9u5dwW YY~ hP YXwvMfj \YUBj NYURBURJQURBURRBg9v6jhL)YYURURMIIh0 Y:f)QfPYYURRURRMItwvMf2Mf h  YPH _^UVW}"vPnYPWfYPh< Nv vvvf:Fj YFjh8YYVBjjhV* vXwv=HHu FFj oYFj dYVBVJQjh4lYYVVNItwv8 } hYvP<YPh YY_^UVWut!~ t~ t~ u6~uvۅ|~ rU €t+}t%V w9J t f}tVM  فfVM !فf_^UVuVVGYjw9V th\VYYP=5wuG=wu>h,HEP> jEPVS E PjEYYhTjEYY^U VW} EWWGYEWVRYuSY!EUR Uw jhuq }eXw9Uu'95wuhvWjjENjXwW 0w9Uu%95XwuhvWjjENjwW VuBYYuhuYYUz u#RJthutYY95wuUW =wh,HEP jEPW F t EPLuYBVEPrYYtw9Uu Ft9Xwu vEYVu莔YYVuEPp uEYWEY_^UVuVaYt~ t hVYY^UVWuEV}QYER6GY!E6[PYVRvGY!Ev>PY}~w9W th<VYYw9W t(|"h VYYjhV+ WB !u"hVYYjhV r w>YYu hVYYVr w>YYu hhVpYYw9Wu h8VXYYWt hV?YYWt hV&YYjhV] _^UVW}ww9V u-w9V t~}VB !tjhW _^UVWuV螓Y~t(u Y5Gj*YYWjqYY1_^U} uuj !YY ujYYu5YEMr q YYu输YUuY5Gj*YY}tujImYY UrYuj YY} u j44Yj'*YujYYuY5GjYYUVWUR zthhuYYjhu j j h0N ƋUR RVw5w=wsu脒Yjjh4NY Njw=wVWEj\YEE5wEPoYYEEPGPa_^UVWU9wgwUww0NEU0N=wtwr -Y=www4N=4N늋u tjh6z vu |@Y_^UU URujjUUURu ujUU URujjUUURu ujUU URujjoUU URujjQUU URujj3j[YUU URujj j5YUVW}E16tw/E=KwO,B$;4E^} t U BvEhwU E*F9lwgE9UX}t,}t&F=Fu E W=F~NF=Fu E1=F~(UElwF1҉FF=lwtu5lwhhxNutVhhxN^ WuhxN hhxN;YY_^UVW}wh rw>) ƅuWrh8WF wBwV$w_^U VWwzw}u>~ r~tVrhpYYUVrhLYY>U9V u F -~ u'VU}tUM9JuEHEUߋ?l_^UVW}j5wW腏 Ɓ~u4VrhWI F wwRwzWx<YfF@~ Xj jhN3 EVEUVw9V uUM JjVLYYDUBjV6YY.~ tU 9V ~VrhW jVYY_^UVWuh5wv DžuUVrhVM h 5wv' lj~wBwW$wRwrV[;YWʀfW tVrhV FU W WU}t+UM 9J}VrhV EUw$dY_^UVWu=w} tv$jYYV z~(u"wBwV(5wh[YYjv(j9 ~@H)RjOfYY5Gj}UYYh jYYGRj5YY_^U\VWuER z@u&>vuuh}YYWEYjuYYDžzw9W W Bt W W Pr 5YYuuh6" 'W Bt W W 9wu  Xw9J t9W Bt W W 9Xw w9J rG9Gtuh6 uhp6 9R Bt R B @ uuhP6C Kj6PYYEt'uh(EP uEP6       !"#$%&'()*+ 6WYYv~_^U\VWuElu"juGYYDžWYR z@u2 w9J tuhT6 >vWCYjuYYDžR Bt R B @ uuh46( Rj6OYYEt'uh EP uEP6 6WYYvqWY_^U VWuUEUR z@uBUztWhu ^UUR|BYvu WhtHYY;jWYYEt*t&UW6r  t6u(YYv_^UVWuE u"ju{YYDžWYUEUR z@VU w9J tuhu sUztuhu R}WAYvjuYYDžt1t&u65w! t6W@YYvWY_^UVWu P R Bt R B Ew9UuD9w@`u/YWuhD 61*EuBtEP1YYuWuh8 61~tWuh, 6`1Vօt>R Bt R B 9Xwt$Wuh 61yoVօ]tw9UtWuh 61@R Bt R B 9XwtWuh 61_^UVWh5wj} tF FPw YYP ƅt V uuhh YY1,hvj :3YYljwVW V@fV_^UVWu} W BtG E=wVYw9V Mh jrYYMh jbYY=h jRYY-h jBYYh ,YU B55GjYYUrj@YYV 2w YYW詃Y5Gj*sYYh jYY5GjVYY5Gj@GYYV 2w 荁YYV rjH'YYtw9UVV Bt V V 9Xwt$V Bt V V 9wuV rÀYW݂Yh jYY5GjYY_^U=wu&utYh jYY5GjhYYUVWE5GE 8U RUW BtG E=wtuYW蔁YU w9J UBt#u*YPjEYYGGUr}>EE01Y5GURU}t  PjYY}t  PjYY}t  PjYY}t  PjYY}t$E0舀Y5Gh jXYYz}t  Pj7YYY}tx p PjYY;}th ` PjYYhT YU BVjgYYUR tw9 uXw9Uu5G<~Y'UR tw9 uw9Uu 5G~YuYhL jcYY5GjYY5Gj@YYUR rjpYYhD j#YY5GjYY_^UVu=wu$VYh jYY5GjtYY^UVWu EwM~+:-uRFTYUAMЋU}} 5wh hxNO jYwwYYujYjY_^UVEPju u"u5wh( hxN1fhwUlwa7h,FYhLGY;OƋv vv vvvfvE~U =7wtrH=Iwu =)wtH3I"t_u `wfv5G5GYYu Yu h Y|5G5G_YY=;wtjjd5lw rwBwRY5lwY@P5lwhS whwJ5lwRKYY=wtk[1=w^UVj5wjhP FVʀfVwrj5wjhH F @VʀfVV B j5wjh@ [j5wjh< Dj5wjh4 -j5wjh0 j5wjh( j5wjh$ j5wjh =Gwu.j5wjh j 5wjh =Gwuj 5wjh zj 5wjh cj 5wjh Lj 5wjh 5j5wjh j5wjh j5wjh j5wjh j5wjh j5wjh j5wjh j5wjh }j5wjh fj5wjh Oj5wjh 8j5wjh !j5wjh j5wjh j5wjh j5wjh j5Twjh j5Xwjh j5twjh| j5wjht ij5wjhl Rj5wjhd ;=8wtj5wjh\ =7wtj5|wjhT j5\whhL j5\whhD Xw Fw(Fwjrjh< PYYP  ƋXwVFFVʀfV=;wt jV轀YY^UVWu>t'jvYYDžu hd ]YW_^UUVWTI TuT2h YT=TThSW}hS9U v#} ~E SP`Y5SS+U SwU IM t EEF5SUW_^UVW}EGEtUUU3E1U+UUU OUE0t9UU~UG)ۉ]uE:u}u6}|u뾃} }1!u uu ƋEE0_^UVWu}u Y|@B9uBRY]u1>E]S60WtU9tE0GY1EU_^UV5 Tt`wV hhwFP5Tt Tj$qYƅu1 TF 5 T^UV5 T6 T T  TT5 Tu T1!V `wFPhhw}^UVW}WoYPu eYZPYƅu10E0?tGFЄuF/E E Fu_^UVW}EEu EhN} t?/uEPjW_ `1E 8M] E EPW3) u1EPju t}u^YE맃}ƅu}hNt uY1a}hNu1QEPEPWuYu uNY1,UVUV`wUV}tE81_^UVƅu1U VUV`wF^UVW5 Tu -VV9`ws1~ 1~Et~hNt vYVVUTEU9VVJU}~MUO MT`wT~t vYFTF}t}t"F gt F S~ t=`wTu:t"`w`wEuEE`wT_^UUG9Gt h<+Y=Gt=Gt h(Y=Gt=Gt hY=8wt4G9G} h YG9G~ h YG9G} h Y=Gt=Gt ht ~YU-=Gwt#7w8wIww)wjjjx Tw@ jjj^ w@ 5G5xGj< Xw5G5Gj! tw=8wt5G5|Gh w=7wt5G5Gh@ |wjjYYw5Twj@YYwP wfQjjh \ww5\whYYw5\whYYwGPw tGJ UU JѺUM w!1UVj2j(h$NL ƋUV} tE FUVtGV 5Gu YYF^UVW} j2j(h$N vGV GVoGVV GVVRtGVV VV9W V WVWVWVhYUV`>_^UVjjCYYƋUVU V ^UVuj YYƋUVU V ^UVW} \wEW*Yo thWYYWwV@fVFt&~uVrhWr VEVrhWR _^UVW} UR UUw r ;YYuh@WYY\w'UB !uh WYY\wUO9J~ hWYYuhYYƋURVWV ~|Uw҅V uFFw҅V F=tG~tGFojvYYt jv YYtFF?jvYYt/jv YYtF=tG~tGF_^UVuFtVE V E6VtwڋE wEE V E^UVWu95Xw=GYj2jh(N Ej2jh(Nr NjXwW MQ UBxwWWuYYGExwU5GF uhY\wFtE9XwuIEPEPV }| xw9U~hdlY\wExwUEPEPu| VhzYYVM ʁfVU+UV5GvBYYFtGV U tNGtVVtGVVV_^UVWuFtVuVZY} uFJvvYYǡGt5GWYY5GWYYu hGY_^UVWuU~VfVVRWTYYF UB u*hYV VVW V V\wEPEPu U+UU|5GulYYu hYGMAw19F v hrYUBV VNGttGFF5GvYYFtGV wBwV$5wYuh YYuhYYv hYY_^UVut*6YV (N V(NN5N^UVWwRrE=F%~~wUE}t-UNIhrq i Eu ]U̓}t Uzt \wU8URU}uwRNJ UNJVohYVUtE\w9UuVrhw WM =;wtwhnYY?vYV@fV\w9Uu FFuv_^UVWu} q7v dYYuh|V2YYK tEV+WU|9Wh\V YY&UO 9YYt u1nGt9Xwu95wt9=wuFt9Xwu)GtFt19u@_^UVWu }VWYYtW1C9=twu9Ft9XwtFt9wu11_^UVWu }VW%YYfGt8u2Ft)~u#WN9uvwYYu%u~t  u~ uVWYYt1_^UVWE ]03YYu1TUzU rt=t9WJVZ9uVOrqYYu1 ?619u@_^UVWu }VWYYi}uVW`YYR u~ u VWAYYu9u~u VW(YYu GtBuYF_^UVW}R #JMt#1҉U֋RRUWRRU1҉UUrWRU~}~w)9U~'WY}}}w)9U}WYu|}}Uw9}'WY}}|Uw9~WY+UF~#}~w9E}WlYq}9}}395wt"w9UtډѡwU9}=W,Y4~w9E}#WY}~w}9~WYU։}uh W9YY}|}uhWYY}Wu}t1=t }t1#}tuuYY1ۅÉ19uu@}tuuؾYY1ۅÉ19ut@}tuu諾YY1ۅÉ19u|@}tuu~YY1ۅÉ19u@o}tuuQYY1ۅÉ19u~@E}tuu'YY1ۅÉ19u}@hxYGGWRGP#w9W ufGwWMY7YwY1҉W_^U VWuEEVzR B15GE^uRUFfF}|At=Uw9U}.E=w4E=wѺYt1FW-YRUUBZ}u}VBPHEU9U5EEE EEك}EEU9UEEE#EtEE΃}u}VBEEU9UEEE#EtEEЃ}uEMJEU9U}uu UU}EE9jm}u UU\TEE 9A4uUU0}t*] 9uEF0閽EBU9U}F1=uC^F1=tC^FfFzt rYVzt r߱Y6YvY1҉VyhYFXVzt r蕱Yzt r脱Y}tuuYEFUV6+Yv"Y1҉V_^UVWu1V:FfFN}w9WW$YWډVWVVIY'}$w9WtOw9G} WYOw9G~WYWʉNVYWVVY#WVWBVV BtN9J |V RtV N9J whVYYjVY^WJVV BtN9JV Rt~}hV覶YY#V9YhY E 6YvY1҉V_^UVW}wW BtG EPUw!UPt(Uweh(WYYS}tUw9UuU# wJQѺY9u+UUM։։w_^UVW11|&G u hpӵY4ww=Gv hD謵YGJѺҋ G#wwډwj 5w訵YYdwPgYP5dwYYdwGw=xwuJxw_^UVu~ u+~t%Vzt*Ru rhV_u hVL ^UVhvjKYYƋXwV fFFhvjVj fF,^UVWut!~ t~ t~ u6~uvۅ[~ Q~ tHW„u+wR9W uWR:#tWrh袳YYWfW_^UVW}Wօu~uV#Yu1E~u?thVYY1)u WpY9thWuYY1_^UVuV1Yu1%~ uVzuhV6YY1^UVWuVVGYu1p~uhDV色YY1U uVR¢uh0VYY14 u*Vzu!z(t RV h VYY1_^U VWu\wV ~u)j5wVE FF VRV ~ URYu1UR zthluYY1UR hrv?D Džuh\Vh`/ 1t~WV F Z~WtCV=YuFWVfF!VUwV蟵#UfV1t@_^UVuVYu1+~ tVBu hV!YY^UVW}wVVGYu1:VYV BtF EG UB VWٴ(N5(NUzt z u~uWYUz~u$VRWGfGV+YGww9UuP~uW\YXVW,(N5(N7h5YG@GPʋYPhWO 1_^UVWu }Cw\95twt9=twutwE95wt9=wuw.*tw#Eó9=wu 95Xwu_^U>"F ? 81r*"# hMY <EYU} t } u1UVWuU~RuGYEWWGY!Eu#YWYUR Bt UR UB EW BtG E^PuS F ^eUzthXV襭YY1E0uYYuh<V~YY1Uzu uV YE}u1FPqYEUBt UBU€tIuVYEt9uFY9Eu ^FP\YPh V 1=E@tUz@u FPYPhV衬 1FPYt,w9Ut!FPYPhVf 1E Xw9Ut w9Uu9tw9Ut F=/u#hv6jj twUQ tw9Uu<Xw9Ut w9Uu&hvvjj FtwUNQ Xw9Uu+w9Uu hv6jjawP 6w9Uu+Xw9Uu hvvjj*FwP uucYYu!FP蠇YPhV% 1UBM9wu UMJ w9UuUW w9V uUV Uzu.u(VkYUztUzu uVY_^UVWuUVU~ NF= ?uuu utuuu uu1:UzUzE8UMI9J}]EEU0B=wZ׋MA2=wѺY!ʉEU0B=wZ׋MA2=wѺY!ʉIURBUUR9U}4E0E=wZ׋E2=wѺY ʉE2VVGYu1VYE w9uEjv mYY] p15GZЉURY]Eu0ZYY)E v 2YYuhV蘨YY1~qVUXw9V u%}| xw9U~h|VXYY1YE8t,0E=wZ׋E2=wѺY ʉEE8t0苡YE_^U VWu~EEwV uFFet#EPEPF P7u1Cك}t3F}uuYEUVvYF_^UVWu1VJt HVz uVJ t 0_VJ OHR Jt:} u4-VR z@u!hlY FLjhVמ _^UVWu} EVuYu1.uVUEPYNjuEPhYYuEPhYY}tG7UG:UG/UG$UGUGE,鹜EB=tG8=xG-=|G"=G=G =GEd_FQ_^UVWuEǃ0|9kE -0E݋E_^UVWj jh,NU j j h0NB Ƌ@HW=w~UUV5w_^UVWj jh,N j j h0N Ƌ@HW~wUUV5w_^UVwRr}ttVUVuV(Yuww^UVWwMhrq j2j hN@ ƋWwUVU V_^UVwRrgFUVR:#tC\w9VuVrh舕YYVz@tVrhXkYYFFv^UVwRrt=~uVrh$YY~uVrhYYv^UVWuE =GסG} Ut }t1StG9U|At 9}|1>u*uF=tGt}uF} u1_^U(VWu }WEPVEPE+UEUWUVEPoYujH蔀YYEPYYujp~YY_^UPVWuU z h,HEP茘hVu >YYUzu$VY~tGGPjYY<WVYY.uYuuYYu %Y Vu YY~tGGE>F=GMAR=GY9UUkG9E~EVEP賗uEP袗EP1YEP'YujLYYmGU}XU9U|EPuuV+U+GU˃>t>uVYhJYE(_^UVWu} ~tGGE~tGG EF=GpG9Uu,~tvvjF~ vjI]~YYG9Uu,~tvvj=j~ pvj?$~YY_uuV tVYujH}YY7hHKY*5Gj;}YYh<-Y G9U}Gu>Gtxu)}#ujE}YY5GjEv}YYj]}Y_^UVWu} ~tGGE~tGG EVEP[F=GpG9Uu,~tvvjn"} vjq|YYG9Uu,~tvvjc| svje|YYbEPcYuuV tujpu|YY7h|ǐY*5Gj^W|YYhp詐Y T銔_^UVWu~vj|YY~tvvj9)| vj:{YY~ V  fG9Gu)~tvvjF{ ^vjI{YYP~tvvj={ 8vj?b{YY*5GjQ{YYh裏Y 鄓F_^UVWu >V=wUR 9Wt?GPV&0URV1VYURVhY UJ N_^UVWu} V U~ tV WGU @H9JVfVV^U @H+JQjN)zYYVuVBtIzuCvjzYY5GjHyYYGVU @H+JQjOyYYVW2VuVBtzuVWw _^UVWu} V @H9Jf+JQjN]yYYVr$jGNyYY~zV @H+JQjN+yYYV GJ$QjGyYY5GjyYY=Vr$jIxYY~u%V GJ$QjIxYY5GjxYY_^UVWu} V RB9@He=&wu=jjExYYV @H+JIQjOtxYYv,jhxYY5GjpYxYYV @H+JIQjOBxYY&=&wujjE&xYYv,jqxYYV(W_^UVWu }WUPVuYYVu5YYVu?YYVuYYhYUB V7}YYVwWYYlV7cYYV3YwYR UBt@zu: @H9J }+J QjN,wYYUr$jwYY#Ur$j: wYYUjr$j9w =wthjIwYYUJNWR z@uGwYh|jwYY5GjvYY5Gj@vYYFmVwcYY:XWr VYYF;3hh萊Y&qhTwY 4GW_^U= wujjj2v UVuwBwV$v$!uYVrY@VPrht ^UVuwBwRtY|w9V uVBNRqht VN2qhmt V wJ^UVuVzu=wBwRptYV wJV Nr1hhs^UVwrt.~u v 1tYVjjrh sv^UVW}wEhVz(t[}t(G+W 5GR.YY؉G pEVr(sYVr$h5sYYw hrYY6됃}uG 1_^U VWuEEVr+nY~{~@lhhtYYhHtYj,pYVrYEjBsYj jEsYY5Gj8vsYYji]sYVv sYVr oYVrYE2=Hwt,jv$j95s hjvsYY5GjrYY~(t5Gj}rYYv,jqrYYVzlWJJWRUB4z*}u"jlmYEjjErYYujqxrYYWrjIirYYU GJ$QjISrYYj4:rYU GJ$QjI3rYY5GjQ$rYYGJRjErYY5GjrYYGJRjEqYY5Gj qYY5GjqYY5Gj*qYYujIqYY5GjqYYujqqYY5GjKqYYjjJqYYWrjqvqYY?hÅY}tjjJSqYYujqGqYYE_^UVWu~@ujjE'qYYhjqYYPV9} t$u jIpYY5Gj pYYu *lY=BwuVRr"Y=Hwt,jv$j9p hjqYY5GjpYYVׅ=&wu:hwPjChpYYv,jI\pYYhjpYY5Gj?pYYG9WuWRjI%pYY9G9WuWRj?pYYWRj:oYYwjHoYYwjXoYYjjXoYY h#YVRR ReoY k_^UVWu} V UzTwEvjEpoYYV,YVjrj9ko UrjHCoYYWUzuvjE)oYY@Vjrj9.o ,5Gj}oYYh VYF aVYuV?YYEVU}uUrj}nYY]UB=GEEE}:EE0jERnYYMVYVL YURUBWR RU~ UJt5Gj}mYY@H+URjOmYYUr jM-nYYWuYYWVYYrVURYUR rYNVURY-4VURYht 蘁Y ( Fx}tuWEYYuj|]mYY_^UVW}w wyYB~t ~ uvjUlYY3vjTlYY%jtlYh YG _^UVWu }WYV Y_^UVWEUUzr OWuYYCvjKlYYBvj:lYY1vj8)lYY h"xY F遄Wu_YYOvj`kYYvj_kYYvj kYYvjkYYh"Y FWuYYCvjQkYY|vjPtkYYkvjckYYZh"YJ !F黃WuYY~uvj,$kYYh"sY WugYY~uDUB=u""PjBkYYVRjjYYvj@jYY~ uDUB=u""PjjYYVRj~jYYvj@rjYYihh"~YYuYWYW BtG .vj'jYY*vjjYY5GjjYYjiYUB=u2VRj*iYYvjiYYvj8iYYUfB=;UB=u-vj iYYvjiYYvj}~iYYUfB=vjiiYYlVgYYhL#jgYYkGPjgYYV Ywjf gYYwj8fYY_^U$VWEE8tU r0YYEURrE Uz Ft$~u9ut WVYYu YURJtug YuVuMYYfh,HEPy~jEPu WEPRYYWVr YY95twu#Gt9Xwu 5GY_^UVWu }WUBtzu vuYY~u)jjEeYYVJRjEeYYjjEeYYtFtK~uE@H9V }+V RjNceYYv$jWeYY v$j:IeYYkGPjH8eYY jv$j9@e kGPjHeYY_^UURjrj9e U rjHdYYUVWE0URU~w9V uucYY}tV urYYGtIW RU~Wu@H+URjOodYYw jdYYV r jTdYYwBwUwBwUVY5Gj/dYY5Gj* dYY5Gj}cYYjcYuj|7dYY5Gj/cYYjcYV GJ QjcYYujcYYu cY5GjcYYj}cYV r jcYYubYV Ut rj@^cYY_^UVWURUE0V BtF NjERRUVY9=Xwuh$jgcYY&9=wuh$jOcYYh$j?cYYwjbYYwj@bYYDV7Ywj*bYY9=Xwt9=wuwjQbYY5GjPwbYYVYph$jbYYjh$jbYYZh$jbYYJh$jbYY:h$j}bYY*h$jmbYYh|$WvY T#E7z5GjaYY5Gj@aYYPVCY?V2Yht$jbYY5GjaYY5Gj@aYYVYVY5TwYVYjjEBaYY9=wu}uwj#aYY wj`aYYV B v YVtYjjE`YY9=wuwj`YY9=wJI@VY}uhl$jaYYhd$j`YY5Gj|`YY5Gj@m`YYVPY9=wu jjEN`YYrjE>`YY}uh\$j`YYhT$j`YYGGRj`YYVY}uhL$jL`YYhD$j<`YY5Gj_YYJVYh<$j`YY5Gj_YY!W$UVyYURUE0VYURUE0VOYV jr$j9g_ juj9X_ h4$j_YYGGRj_YYW$Uu| jjE^YY jjE^YYVYURUE0VYV R$UURUE0V-Yjuj9^ juj9^ h,$j^YYG GQj`^YYVCYrjEF^YY}uh$$j^YYh$j^YYGGRj ^YYVY}uh$jT^YYh $jD^YY5Gj]YYUt VDY5Gj}]YYh$j ^YY5Gj]YYh#qY x#Eu_^UG9Gt&5GjER]YY5GjEC]YYj*]YUG9Gt&5GjE]YY5GjE ]YYj\YUujE\YY5GjE\YYj\YU5GjE\YY5GjE\YYj\YUVWu} F tKG u V@Y9EPEPV5 EPEPW$ U9UU9U}VY_^UVWuE=&wEPEPVٔ ~u$V$ׅu=wBw׉V$E"V$ׅuwBw׉V$E}t%W[Yuh4ZYYuh%ZYYjWj9[ 5GjW[YY_^UVuV BtF Eh,HEPsjEPV UB t EPYv EPAYY^Uh,HEP/sEPuYYEPYUVuh,HEPrEPVYYv EPFYY^UVWu~VVBtFVu Gtjj5Gv@VFVtjjwv#V)G t ju1PwvUvR_^UVWuVUz 9uJ t97t?N5N_^UVWUr 1tU 9V t6t=tUR Ur UVt~uh$j=h$b vى_^UVW} Uhwrt ƅU ROI9J~-U Mhrqg EtpE U ‹U w9Ju@Uh5wr u#U Mhrq Etp??A}th %uh% U Mhrqv Ɖ_^U=Uuj@bYUU@UUUVU+U֋UJ9r)U@UP5UcYYUUEUUU^UU:tEPYUVWuF ~"F Ph&EPi PY=F }6>u$F Ph &EPi PY F fF V u} tUUfF F ~F Ph&EPdi P*Y95wF Ph&EP;i PYVJѺҋN#w|IF RQPh%EPhPYAF vPh%EPhPYF Ph%EPh PoYB v vPh%EPhPEY>t1j*Yj6EYYF F fF UUډfF ^ Sh%EPh PY_jSaYj6YYjvh%EPgPY*ja,YFt8~u2jrYj6YYV$RRh%EPgPSY j6cYYj;YjvOYYjeY~t&Wwrh%EP7gPY j;Y{vh%EP g PYVztNWrYj:LYjwYYWRORQh%EPfP}Yj; YjQYj>twPhYY~Dž|t |?|h%EPLf PY~WJtv'WRBtWRzuipP`YWjrYYj;IY?jL=Yj6YY&j*(Yj5TwYY %Fk_^UVu uWYj:YjtYjVZYYj;Yj95wt ~~1VtFFPh5UHO^ULVW}wKWrYj:iY} Wrh&EPd PYh&5@Hj$5UPwWrh&EPd PfYj>twPkYYj;YWr5@Hj$5UOVU}tUhrYYEUދWRz@t u wWYY֋Wrh&EPc PYj5@Hh5UMWt7jvYjVYYj;Ywjh5UMDWtQFt ~uipPYjV9YYj;Ywjh5UKM=@Hu6jGYjVYYj;nYjw jj(5UMjVYYj;@Ywjh5UL|} @uAZPYjpYjVxYYj;YWr$jh5UL&jtYjV>YYj;Yj95wt ~~1VtFFPh5U,LjcjYj=bYFtcWrh&EPa PYMWrh&EPa PqY*jrYWR2VYj;YWRRUh&2YU:t$:'t:\uj\YEEPYh&YjeYjVYYWrh&EPa PYjSSYjVYYEV9U}GWEr=GZ4E=GZPh&EP` P^YEj;Y &F^fj~F1Ph5UkJ d&E )f_^U wyxyEPY y=x;tj;K@Y@ xuY yj.?Y=;wt#URjjj*rIjAuYY? wj2j0hNV Ej5lwzYYUBUBwRwU wJEPuYY-At'yeUVWuyh ?Yj2j0hN6V w vJB@wRw wJ=;wth6zYY>Z yaj(@YDžu yKu4 yy6 y=x)tj)>Y趗h>@'yc_^UH>EPYuYUVuxxwN xEPVYY x6+=wu uVYYtV/YwrY^UV8y2 8y6h?Yƅu 8y 8y xyb=EP8Y}t)u`YwRREwRMJ$=rj>YƅoT=x,tj,=Y<EPY}t)u>`YwRREwRMJ<X'yab x y=x;tj;=Y|<x'y.b^UpyxyxU py1UI xy=@Hu i@HwU x`Uw @HUwRw=wuuY] UVy yh<Yƅu yuu^ yxd;y yj;/;YF;j<Yƅttʻ'y` x0(y`^UVpy pyh)M<Yƅu pyg pyx:y y=x;tj;:Y:j;Yƅttp(y_ xt)y`^UVxy xyh+;Yƅu xyg xyx9y y=x;tj;:Y9j3;Yƅtt)y@_ x*yU_^UVxJj:YƅtKu4ynU =y"t yj;"9Y99*y^ x^UHH=xt h(9Y=v| =v'~=vt h +YYE?5vh+EPX hvj衙YY]jEPsYY]BHHU VWy x=xt h~8Y=v yj= 8Y78EPYwjrW ƅt6UVUR VVʀfV=;wt jVYY_^U VWy$x=xt h7Y=v yj=~7YEPLYwjrWF ƅt-UVVʀfV=;wt jVYY_^UVu97Q $xVWYQ8t7 $xV?Y 72 $xV_Y# $xVY68+y\^UVu$x=xt h7Yhvj蚗YYE6y xuVzYYu赗Y?8tO x xuϣYI6EPYuuzYYuiYu`Y6+y[ xx xEPqY xh 5Y5EPQYuu\zYYuYuY5+yU[^UVW}=xt h5YhvjbYYVWbyYYV蒖Y_^Uy$xEPY y=x:tj:G5YEPY1=@HPuu UVWy(xEPEPYY y=x;tj;4Y=wjY4 (xpjWuu5v胂kE6tQ (xWuuۃ ƀ=;wt jVYYVY=;wt hVYYj|Y,yY_^U VWu }yh3YhvjؔYY3 yEPvYEE=DHuEPu\YYEEPuzYYEuu:wYYu諔Yd3> y=@H~G1PjwYY 5tѻX,yX_^U=xt h4YUVWy(xEPEPYY y=x;tj;2Y=wjY2 (x}uURrh,uoS jWuu5vq34t (xWuu~ ƅt5VRډV(+G wIQ V,=;wt jVYYVYt=;wt hVYYVYj6Yt,yW_^UVWu }EE=@H~G1E,x=xt h|2YhJ1YhvjXYYK1 ,xj2YEu ,xU ,xyx>EPY=DHuEPu襇YYEEPuÈYYE0 =y4t y=x:tj:0Y0 xEPYUBth-7_QYY\wUuuuCt u葑YJ0,yU_^UVu)0. 0xVGY.1t 0xVY/,-yU^UVW}Ey/EPY y=x)tj)/Y5G5tGjSr Ɖ7Vu\YY~ u \w2UwҋN uUVUVeG9U|_^UVW}4x=xt hD/YhvjYYƉ.Fjb0YEtFu3=x,tj,/Yh.YhvjYY.l-ykT 4x_^UVufE8x fE{. =y!tURVYY^UVup 8xU RVkYYd 8xU RVYY.D/t* 8xU RVX YY 8xVz Y-yS^UVW}0xX/y/K_^UVW}yh3%YhvjAYY:%V yh/0FYVW)iYYVYYB&t( y$WjYVE V+Y$x/yJ_^UEyy@xyEPyY y=x:tj:$Y yj(_$YUEPRuu u5 y=x)tj)r$Yuuuo ulYUV xPxEPYUE#KhC^%YƅtIu2 x=x,tj,$Y#uFYEU#/yeI Px^UVu0xhe#YVFYE P6iYY^UVWu$xh2#Yjj@YfYYf $x6YJth/CY \w #zvJJJ_^UVWjheYY]h"Yhvj衃YYƋwhrv) ǃ=Utt GtE0V YYEV0]fYYV荃Y_^UVWTxyhvj (YYƋ]VxYEh:z#YDžtCu,hvj YYFv=x;tj;"YV1Y$0yG Tx y=x)tj)"Y_^UVuXxF! Xx4xy\xFFDV! =y+t 4xVY y=x:tj:S!Y !2 \xF PY/ \xF PnY "tl0yFV JpVdh0AY\wV N XxF PVAYYF3 XxF PVJYYFF"tܻ0y F^UVWu }DHVW=YY DH_^UVWu }DHVW_YY DH>uh07@YY\w_^UVuVYVY =y!t^UVWuy`xyHyxh |YjhbYYWfW yj[MY `xWVYY yj],Y HyhY2 xVYJtWfWW>_^U VW}`xyyHy\xjhaYYEj[Y `xuEPYYUEIj;YEtIu6jhaYYUBURUREPYYUEN1yD y y=x]tj]-Y HyhY 4 \xEPlY,t \xEPY 1yCUJt fUMJ_^UVWxxyxhTYwh@r5vj DžtU WWʀfW xh Y xhYwhr5vi ƅtU VVʀfV yj:Y xu&YEB uzth@1a=Y\wEEVW_^UVW} xdxVY6K8h1yA dxVY)t dxVY|1yA7{YKt1 xhvj|YYvP 9Twt7fY1ypA_^UVuhvj|YY^UVu=xthzY =yuhvjV|YYvP ^UVuhvj3|YY^UVWuhxVYf hxjh kYDžu hxQu: hxlxhvj6j{ lxRY1y6@_^UVWupxtxJ pxxxVYm xxRYu pxVYct2y?hYDžtIu2xxhvj6jz xxRY3yi? tx_^UVWu|xxVaYEh YDžtCu,|xhvj6j3zrRY4y> x_^UVWu |xx=xt h%Yhvj zYY xhvj6jyPYC xxj5w6 NjWR0t7w9Wu EEhvj6u/yf@(VNY2t 5y= |xVY% |xVY} |xyhvjxYYRY y=x)tj)Y2hvjxYYRQY6yO=_^UVudVYghvjbxYYvP 9TwtF6Yr3YYyfhwfU~EPGYEPuK*YYuqY`xhvjCqYYE;  xxxxEPY= x=x t:h Y-t xh=0Y=y5 xEPYuu*YYp\b xhvjuj-pEURQY\ =y4tu}+Y=wu u藷YuopY4 =y4"x=y4=y4UVEEPYu5Yy= yDj(Yƅu y.u yEPYx>y*4uY7YTEP@ Yua8Y<sy,= yDj(Yƅu y.u yEPY 8>y3u8Yh>y[3unY^U! $Nl>yF3Uv EPLY}t5LHu1YYUvE c =ytUV>y2UwUyxEPFY y=xt h Y xuu,YYLHBR\0YUVWuxEPYhvjuj %mEUfB,Nhk YDžtLu5=x,tj,< Yhvj #mYYUBURURY>y1 x_^UVuVY6+Y^U VWwBwBwhyxyEPCYh,HEP 1=wuVEPu ulY hy=x't h'{ Y x?LHBR.YK yWjYYVYWYLHBR.Y' yVY t ?y0_^U VWHyxLxyhvj kYYƉNjwBwWwBwU} VIYW Y Hy=xt h YM xuFPYYvuFP.YY y=xt h9 YuW YY_^UVu Lx Lx x=x;tj; Y < x[ t) xLxu V>YYu RYY'4?y9/G tt?y!/^UVuyxVY y=x:tj:X Yhvj6j iwBwQ5wY xu jyYYLHBR,Y^UVwBwtyxVjY8 ty=x*t h*Y xEPYh,HEP-=wuVEPu uiY^U VWwBwBwyxWYEPYh,HEPk-=wuVEPuv u iY y=xt hY xWj1YYVUYLHBRC+Y_^UVWwBwUwBwU1xxxxyxh YhvjhYY xh Y xVY@ x=x(t h(YE)t xE?ye, xFP`YV"Y=wu76BY5Gj*YYjv|$YYuuuV$ y=xt hWY x=wuWuuuV$V#YLHBR)YV(gYtWpY_^UVW}xxy=x(tj(Y xWEYhvj7j CfƉfF,BhkYEt?u,=x,tj,aYhvj HfYYFvVY?y* x y=x)tj)Y_^UVW}xxy=x(tj( Y xWYhvj7j weƉfF,Bh>YEt?u,=x,tj,Yhvj |eYYFvV1Y?y) x y=x)tj)NY_^UVW}y)WYR7GYu  \wJ 7pYhvj7j dƉfF: y j:4YEu yUyJyyhvj dYYFvzVFYR6GYu  \wJ 6:pY{ yj:YEu ytUuN yhvj dYYFvVYR6GYu  \wJ 6oY@yU(AyF(_^UVu#D%DDDCCCCCCCCCCCCCC{CqCgC]CSCIC?C5|C+xC!tCpC lChC`CTCLCDC_^UVWUrRUu!tWtB1_^UVW=uuFFFFN#VV5uU )Vt#WtWYVWYY_^UVWUu ֋MzFFFFN#VUV)Vu9Ut$#WWtWkYWV YY5u+UMQVY_^UVW} w։+UMQ9=ut#VUV9=uu Uu_^Uuu P PPu UUURu P PPu UUUjuuu uJ ZY EU#+ $xEE1U$VWu }>W>%CEܬEF>0u E0FE E=0|=9Fk] Ã0]ڀ>suUURU>cuUURUEUU~>lu9FPYEtUUurYYEINU܉U@PYEtUUurqYYE>%u EEU܉UuuYZ)‰UUIM~UGEEGuOFFG+U_^UVW}v1} EN} ~#}ډU9t%}`ET} J] }CEE} s#e}EU 9U| U+U UGE׋ENTN} NTN} Džu}t N-N0_^UVE-0ƃ w-E-AƃwF E-aƃwF E ^UVWuE1>-uEFFu PYYE9E ~ U ׋}܃}tډ_^UVWu }F9u Gu1 N)ۉ_^UVu>tF9E uN1^UVuFu+UJ^UVuYƅtu1^UVutF6?Y^U EPuRYYtEUVWƅ1juYYDžv1juYYDž}juYYu#1XjjW }5WY1E0_^U}u1!Euu 0S ]1ۅÉUj0Yj(Y EEoUVhNOs~u1^U}u1Euu 0 19EuCÉ{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pc1ۇOtPXPO/SU$UUEEEEEEPjj U$uEP~U UEPj!jU(UUEEEEEEPjj` E=u UO1UVW5OO}׃}~9r}}9vWqYu_^U$UUEEEEEEPjj U$uEPjU UEPjjU(UUUUU UEEEEPjjN E=uEUu FUBUM JUju RaU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPjYYEPjj ^U$UUUUU UEEEEPjjR U$uZEUUU UEEEEPjjUVuU VVu/YYEtF~}Vډ OF^U$UUUUU UEEEEPjj UEPajEPjPjjjPj(UVW5yVUT>M}}6u݃=ytyuY_^USE] ![]USE] ![]USE] ![]UVWME_^]U} |} ~ OM E 1U} |} ~ OM ҋE!1UE1UE1U} |} ~ OM Et1U$EEEEEEEPjj U$UUU UEEEEEPj%jA U(VWu UJ .:<>#  5in ] (LLlex) Impossible character classfloating constant too long0.0overflow in constantconstant too longunderscore starts identifier(LLlex, STCOMP)(LLlex) garbage char \%03ogarbage char %cnon-ascii '\%03o' read*(5u%s deletedgarbage at end of program0.0%s missing before %s_asstype of assertion should be booleanassignment to a control variabletype incompatibility in assignmentprocedure call expectedfor loop: control variable already set in blockfor loop: control variable already usedfor loop: control variable can not be a longfor loop: final value incompatible with control variablefor loop: initial value incompatible with control variablefor loop: control variable must be ordinalfor loop: control variable can't be a parameterfor loop: control variable must be localrecord variable expected---a a &n::UUUU %s "%s", line %u: etc ...etc ...fatal error --CRASH(warning)label %s redeclaredlabel %s declared but never definedjump to undefined label %sillegal jump to label %slabel %s not declaredillegal jump to label %slabel %s already definedlabel %s must be declared in same block_gto"%%s": %s can't be a variable parameter"%s": illegal parameter type"%s": mixture of longs and integers"%s": longs and integers have different sizes"%s": illegal parameter type"%s": variable-access expectedread"%%s": %s can't be a variable parameter"%s": illegal parameter type"%s": textfile expectedreadln"%s": expression expected"%s": filevariable can't have a widthwrite"%s": filevariable can't have a width"%s": textfile expectedwriteln"%s": %s"%s": %s"%s": %s"%s": %s"%s": %s"%s": %sillegal write parameter"%s": standard input/output not definedr%B%b%2% R%_get_wdw(CodeRead)_rdr_rdl_rdi_rdc_rln(''5('(( (@(_put_wdw(CodeWrite)_wrz_wsz_wrs_wss_wrr_wsr_wrf_wrl_wsl_wri_wsi_wrc_wsc_wrb_wsb_wlninputoutput%s: Use a file argument couldn't open output file%s: cannot open %s maxintexternforwardstringlong(void)textbooleanrealintegerchareolneofoddpredsuccchrordroundtruncarctansqrtlnexpcossinsqrabsunpackpackhaltreleasemarkdisposenewpagegetresetputrewritetruefalsewithwhilevaruntiltypetothensetrepeatrecordprogramprocedurepackedorofnotnilmodlabelinifgotofunctionforfileendelsedowntododivconstcasebeginarrayandwritelnwritereadlnreadout of Memoryillegal realsizepointersize should be at least the wordsizelongsize should be at most twice the integersizelongsize should be at least the integersizeillegal pointersizeillegal wordsizeinteger size not equal to word size:5: 5:@k::::N:funny type constructoridentifier "%s" is not a typetype "%s" not declaredtype expectedlower bound exceeds upper boundillegal base type for subrangetypes of subrange bounds not equalillegal integer base type of setillegal base type of setelement of array too largearray too largetoo many elements in arrayillegal index type(forward_type)identifier "%s" is not a typerecord variant: multiple defined caselabelcase constant: out of boundstype incompatibility in caselabelD>DRDDD 7Didentifier "%s" already declaredfunction identification "%s" expectedprocedure identification "%s" expectedidentifier "%s" must be a type"%s" already used in this block"%s" already forward declared"%s" unknown directive"%s" unknown directive"%s" already declared"%s" already declared"%s" illegal function declarationfunction "%s" not assigned"%s" not set in "%s""%s" unused in "%s""%s" neither set nor used in "%s"#%d in %s, line %u%s "%s" not declared%s_%d%sfpl->nd_class == Link/usr/proj/em/Src/lang/pc/comp/enter.c00_iniconformant array used as value parameterIllegal node %doverflow in constant expressionX-XX(cstunary)&\ *Y+kY-Y<[=[>[x[[K[ [ZZ Z(cstbin)modulo by 0division by 06_=^^^^_*^+b]-]=`^`^`^`^(cstset)a M``aaaaaaaa```Ja`(cstcall)"pred": no predecessor"succ": no successoroverflow in character valuesizeof (long) insufficient on this machinearray full_mask too small for this machine%s"%s": %s"%s" used before setconstant expectedconstant expectedillegal use of function nameillegal assignment to function-namevariable expectedcan't access a valueidentifierillegal selectionvalue expectedih(Hh+g-g)h"%s": illegal operand(ChkUnOper)i *h+h-h/h<h=h>hhhhhQi* i+ i- i/'i<Ji=JiCiCiprogram parameter "%s" must have a file typeprogram parameter "%s" must be a global variablefunction "%s" not definedprocedure "%s" not definedTBfB(CodeMove)q++`(CodeValue)(CodeValue)*(CodeStore)(CodeStore)%@(CodeAddress)\\gg(CodeFieldDesig) [k@{{'ՌS'(CodeDesig) class(CodeDesig) Uoper_wdw_rcka(CodeDesig) Def(CodeBeginBlock)procentry_m_a_i_n_m_a_i_n(CodeEndBlock)_nfaprocexit_hltH Δߔ7Un!Җ(CodeExpr : bad node type)(CodeExpr Value)(-W(CodeUoper)& Par Pʘۘ 8 9(9ZM @.*+-C/ <=> ћ;{; ћ(CodeBoper Bad operator %s )(CodeBoper : bad type COMPARE)_bcp(CodeBoper: bad type MOD)_dvil_mdil_dvi_mdi(CodeBoper: bad type /)(CodeBoper: bad type *)(CodeBoper: bad type -)(CodeBoper: bad type +)<O=w>cYm(truthvalue)_btsG'7KKCC7.ءءءءءءҢޢS(CodeStd)_hlt_rst_sav_dis_new_unp_pac_pag_get_put_opn_cre_eln_efl_rnd(CodeStd)_atn_sqt_log_exp_cos_sin_abr_abl_abidf->usd_def != 0/usr/proj/em/Src/lang/pc/comp/lookup.cidentifier8{= =@>ٮh @,%d;,%ld,%ld;s%ld%s:%ld,;A%ld;Z%ld;%ld;%ld;%dr%d;%ld;%ldr%d;0;255r%d;%ld;0r%d;%ld;%ld%d%d=%d%df <_ $$uдAٲٲ@,%ld,%ld;';s'c%ld;i%ld;E%d;Q%d;_m_a_i_nM%d;<<<"<#)<+<I2AIg2c6` UUU"U)U+U ")+27<=h] ]]"])]+]x=xOOOOxxxOxxOxxxxxxxOxxxxxxxxxxOxOxOxxxxxxxxxxOxOxxOxxxOOO  " )>+ 3=X3 333 33 X3333333 3X333333333 X3 3 33333333333 3 3 3 33 ѼƼ ƼƼ"Ƽ+~׽ ׽"%dlabel must lie in closed interval [0..9999]ٿ ʿʿʿʿ !$&4;<ʿ=ʿ t2t5t6t:t<<=f ")+25T ")+function "%s": illegal declaration2function has an illegal result type4<=5Y68Y $&  46: <=empty record declaration"55u25record variant part: each tagvalue must have a variantrange of variant tag too wideillegal type in variant5<=y258old-fashioned syntax ':' missing68_<=file type has an illegal component type"+245=8  !|q"V+|value parameter can't have a filecomponentillegal function parameter declarationj2}: !Indextypespecification: illegal type< <=9 49<|=|9/////////////////////V;VoVVVVoVVVVVVoVVVVVVVVVVVVVVVVVVVVoo;22222222222222222222222222222222C49  469:<=B kkkkkk4k9k:7<k=k" C6:boolean expression expected2?HHHHHHH22H2222H222222222H2HHH2H222222222222222222HHHH2H2HHHHHHHk?kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk;40,0!,M,,,,,,,,!!,,,,!!,!,!!,,,,,,,,,,,!,,,,!,!!!!!!!0  7b tt*t2t34t79; ./01 I:./01':=' expected instead of '='assertVNN*N2N4t*24A.ANZaZ%a,a-h%369;*2HSSSS@<S=S26A(3569;P?fffffffPPfPPPPfPPPPPPPPPfPfffPfPPPPPPPPPPPPPPPPPPffffffPfffffff525''2X>5 Z Z Z Z Zdnx     ",6@JT^hr| !"#$%&'()*+,-./&0017bad tokenend of filewritelnwritereadlnreadwithwhilevaruntiltypetothensetrepeatrecordprogramprocedurepackedorofnotnilmodlabelinifgotofunctionforfileendelsedowntododivconstcasebeginarrayand:=..<>>=<=realintegerstringidentifier$Id: rec,v 2.23 1997/02/21 11:23:55 ceriel Exp $case-expression must be ordinalcase-statement: multiple case entrycase-statement: constant out of boundscase-statement: type incompatibility in case00read, write, or open failed " failed : assertion ", line Out of memory DDDPPP=b dou"x)%+H   < 4 , $                   ! " # $ % & ' ( )x *p +l ,d -\ X .\ /T 0L 1D @ 8~fAgiooXuu}a}oXfoXoXoXoXB~eB~B~B~oXB~B~}a}8~e8~B~B~B~   $ `P @<0< R8< RT9<0< R8 <0@P0P<P0@@<p1<0<@04<p:<p:0<p <`   <`2<`P2 t`@ `@  t t`@ H <@1 t t45@<6=3A82>7?9:;  !"#$%&'()*+,-./01$DuU0123456789ABCDEFSSSStz<.*..=flex.skel/* A lexical scanner generated by flex */ /* scanner skeleton version: * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ */ #define FLEX_SCANNER #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* use prototypes in function declarations */ #define YY_USE_PROTOS /* the "const" storage-class-modifier is valid */ #define YY_USE_CONST #else /* ! __cplusplus */ #ifdef __STDC__ #ifdef __GNUC__ #include void *malloc( size_t ); void free( void* ); #else #include #endif /* __GNUC__ */ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #define YY_USE_CONST #endif #ifndef YY_USE_CONST #define const #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () /* we can't get here if it's an ANSI C compiler, or a C++ compiler, * so it's got to be a K&R compiler, and therefore there's no standard * place from which to include these definitions */ char *malloc(); int free(); int read(); #endif /* amount of stuff to slurp up with each read */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* returned upon end-of-file */ #define YY_END_TOK 0 /* copy whatever the last rule matched to the standard output */ /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ /* this used to be an fputs(), but since the string might contain NUL's, * we now use fwrite() */ #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) /* gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); #define YY_NULL 0 /* no semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #define yyterminate() return ( YY_NULL ) /* report a fatal error */ /* The funky do-while is used to turn this macro definition into * a single C statement (which needs a semi-colon terminator). * This avoids problems with code like: * * if ( something_happens ) * YY_FATAL_ERROR( "oops, the something happened" ); * else * everything_okay(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the YY_FATAL_ERROR() call. */ #define YY_FATAL_ERROR(msg) \ do \ { \ (void) fputs( msg, stderr ); \ (void) putc( '\n', stderr ); \ exit( 1 ); \ } \ while ( 0 ) /* default yywrap function - always treat EOF as an EOF */ #define yywrap() 1 /* enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN */ #define BEGIN yy_start = 1 + 2 * /* action number for EOF rule of a given start state */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* special action meaning "start processing a new file" */ #define YY_NEW_FILE \ do \ { \ yy_init_buffer( yy_current_buffer, yyin ); \ yy_load_buffer_state(); \ } \ while ( 0 ) /* default declaration of generated scanner - a define so the user can * easily add parameters */ #define YY_DECL int yylex YY_PROTO(( void )) /* code executed at the end of each rule */ #define YY_BREAK break; #define YY_END_OF_BUFFER_CHAR 0 #ifndef YY_BUF_SIZE #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ #endif typedef struct yy_buffer_state *YY_BUFFER_STATE; %% section 1 definitions go here /* done after the current pattern has been matched and before the * corresponding action - sets up yytext */ #define YY_DO_BEFORE_ACTION \ yytext = yy_bp; \ %% code to fiddle yytext and yyleng for yymore() goes here yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* return all but the first 'n' matched characters back to the input stream */ #define yyless(n) \ do \ { \ /* undo effects of setting up yytext */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext ) struct yy_buffer_state { FILE *yy_input_file; YY_CHAR *yy_ch_buf; /* input buffer */ YY_CHAR *yy_buf_pos; /* current position in input buffer */ /* size of input buffer in bytes, not including room for EOB characters*/ int yy_buf_size; /* number of characters read into yy_ch_buf, not including EOB characters */ int yy_n_chars; int yy_eof_status; /* whether we've seen an EOF on this buffer */ #define EOF_NOT_SEEN 0 /* "pending" happens when the EOF has been seen but there's still * some text process */ #define EOF_PENDING 1 #define EOF_DONE 2 }; static YY_BUFFER_STATE yy_current_buffer; /* we provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state" */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed */ static YY_CHAR yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif #ifndef YY_USER_INIT #define YY_USER_INIT #endif extern YY_CHAR *yytext; extern int yyleng; extern FILE *yyin, *yyout; YY_CHAR *yytext; int yyleng; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; %% data tables for the DFA go here /* these variables are all declared out here so that section 3 code can * manipulate them */ /* points to current character in buffer */ static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); #define yy_new_buffer yy_create_buffer #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif YY_DECL { register yy_state_type yy_current_state; register YY_CHAR *yy_cp, *yy_bp; register int yy_act; %% user's declarations go here if ( yy_init ) { YY_USER_INIT; if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( yy_current_buffer ) yy_init_buffer( yy_current_buffer, yyin ); else yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); yy_init = 0; } while ( 1 ) /* loops until end-of-file is reached */ { %% yymore()-related code goes here yy_cp = yy_c_buf_p; /* support of yytext */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; %% code to set up and find next match goes here yy_find_action: %% code to find the action number goes here YY_DO_BEFORE_ACTION; YY_USER_ACTION; do_action: /* this label is used only to access EOF actions */ %% deb46789:;<=>?@Aug code goes here switch ( yy_act ) { %% actions go here case YY_END_OF_BUFFER: { /* amount of text matched not including the EOB char */ int yy_amount_of_matched_text = yy_cp - yytext - 1; /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; /* note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the end- * of-buffer state). Contrast this with the test in yyinput(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ { yy_state_type yy_next_state; yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* okay, we're now positioned to make the * NUL transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we * don't want to build jamming into it because * then it will run more slowly) */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext + YY_MORE_ADJ; if ( yy_next_state ) { /* consume the NUL */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { %% code to do backtracking for compressed tables and set up yy_cp goes here goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* note: because we've taken care in * yy_get_next_buffer() to have set up yytext, * we can now set up yy_c_buf_p so that if some * total hoser (like flex itself) wants * to call the scanner after we return the * YY_NULL, it'll still work - another YY_NULL * will get returned. */ yy_c_buf_p = yytext + YY_MORE_ADJ; yy_act = YY_STATE_EOF((yy_start - 1) / 2); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_find_action; } break; } default: #ifdef FLEX_DEBUG printf( "action # %d\n", yy_act ); #endif YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } } } /* yy_get_next_buffer - try to read in a new buffer * * synopsis * int yy_get_next_buffer(); * * returns a code representing an action * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); /* try to read more data */ /* first move last chars to start of buffer */ number_to_move = yy_c_buf_p - yytext; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; else if ( num_to_read <= 0 ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); /* read in more data */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); } if ( yy_n_chars == 0 ) { if ( number_to_move == 1 ) { ret_val = EOB_ACT_END_OF_FILE; yy_current_buffer->yy_eof_status = EOF_DONE; } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_eof_status = EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; /* yytext begins at the second character in yy_ch_buf; the first * character is the one which preceded it before reading in the latest * buffer; it needs to be kept around in case it's a newline, so * yy_get_previous_state() will have with '^' rules active */ yytext = &yy_current_buffer->yy_ch_buf[1]; return ( ret_val ); } /* yy_get_previous_state - get the state just before the EOB char was reached * * synopsis * yy_state_type yy_get_previous_state(); */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register YY_CHAR *yy_cp; %% code to get the start state into yy_current_state goes here for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { %% code to find the next state goes here } return ( yy_current_state ); } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) register yy_state_type yy_current_state; #endif { register int yy_is_jam; %% code to find the next state, and perhaps do backtracking, goes here return ( yy_is_jam ? 0 : yy_current_state ); } #ifdef YY_USE_PROTOS static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) #else static void yyunput( c, yy_bp ) YY_CHAR c; register YY_CHAR *yy_bp; #endif { register YY_CHAR *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ register YY_CHAR *dest = &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; register YY_CHAR *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += dest - source; yy_bp += dest - source; yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) yy_cp[-2] = '\n'; *--yy_cp = c; /* note: the formal parameter *must* be called "yy_bp" for this * macro to now work correctly */ YY_DO_BEFORE_ACTION; /* set up yytext again */ } #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; YY_CHAR *yy_cp = yy_c_buf_p; *yy_cp = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext + YY_MORE_ADJ; return ( EOF ); } YY_NEW_FILE; #ifdef __cplusplus return ( yyinput() ); #else return ( input() ); #endif } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *yy_c_buf_p; yy_hold_char = *++yy_c_buf_p; return ( c ); } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* flush out information for old buffer */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* we don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); yy_init_buffer( b, file ); return ( b ); } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; free( (char *) b->yy_ch_buf ); free( (char *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { b->yy_input_file = file; /* we put in the '\n' and start reading from [1] so that an * initial match-at-newline will be true. */ b->yy_ch_buf[0] = '\n'; b->yy_n_chars = 1; /* we always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[1]; b->yy_eof_status = EOF_NOT_SEEN; } >.*..?cp437.fnt@cp850.fntAcp865.fntBcp866.fntCiso1.fntDkoi8-r.fntEpolish.fnt~~~~l|88||8<<<<~~<<<><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<l8l||||`0||0xv`0v~ x|||~8ll8|0000`|0`܆ >0fΞ><<<6ll6l6lDDDDDDDDUUUUUUUUwwwwwwww66666666666666666666666666666666666666666666666666666666666666666666666666666667666666666666670??07666666666666666666666666667076666666666666666666666666666666666666666666??66666666666666666666666vvxlllllll`00`~pfffff|``v~ffff<~~~~`0``|```0|~0  0~ 0`0 ~p~vv8ll8 ll<lllllp0`|||||||~~~~l|88||8<<<<~~<<<><~~<ffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0f8ll8vv000` 00000 0 0f<l8l||||`0||0xv`0v~ x8ll8|~8ll8|0000`|0`܆ >0fΞ><<<6ll6l6lDDDDDDDUUUUUUUwwwwwww66666666666666666666666666666666666666666666666666666666666666666666676666666666670??0766666666666666666666667076666666666666666666666666666666666666??6666666666666666666vv|@llllll`00`~pffff|``v~fff<~~~~`0``|``0|~0  0~ 0`0 ~p~vv8ll8 l<lllllp0`||||||~~~~l|88||88|8|8|8||8|<<><~~<ffffff{>c8ll8x~~~<~~<<~~< 0``0$ff$<~~<0xx000llllllll0|x 00f8l8vv``0```0`00`f<x00000x xflxlf```bf8ll8ff|``xxff|lfxpx0000xx0l88lx00xƌ2fx`````x`0 xx8l00x |v``|ffxx |vxx8l```v| `lvff0p000x x`flxlp00000xxxff|`v| vf`|x 0|004vx0ll8l| 0d00000000v8lxx x~xx~<>f?x |~x |~00x |~xx 8~lxxxxxxxx~~| ~8ll8|00`x 3f7o3ff3f3f""""UUUUww66666666666666666666666666666666666676666670??0766666666667076666666666666666666??6666666666vvxlllll`0`~pffff|`v0xx08ll88lll0|x~~ ~~`8``8x0000`00`0`0p0000vv8ll8 l<xllllp0`x<<<<~~~~l|88||8<<<<~~<<<><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<l8l||||`0||0xv`0v~ x|||||8ld`````||@l88l~p0`x |v 08<0`||0`vvffffffv~8ll8|0000`|||`bfl0`܆ >`bfl0fΚ?<<<6ll6l6lDDDDDDDDUUUUUUUUwwwwwwww`8l|8l 8l||666666666666666666666666666666666666666666||ff<~~vx |vv8l6666670??0766666666666666666666666666707666666666666666666666||4,>ffff<lfffffl8lfbhxhbffbhxhbf0fbhxhbf8< <<><~~<ffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0f8ll8vv0 00000 0 0f<l8l||||`0||0xv`0v~ x|||||8ld````||@l88l~p 0x |v 08< 0|| 0vvfffffv~8ll8|0000`|8DD8`cfl0n `cfl6n?<<<6ll6l6lDDDDDDDUUUUUUUwwwwwww0`8l8l8l 8l8DD8666666666666666666666666666666666666||ff<~~vx |vv8l6666670??07666666666666666666666670766666666666666666||4,>fff<lffffl8lfbhxhbffbhxhbf0fbhxhbf8< <<><~~<ffffff{>a`<|0f8l8vv0 000 0 0f<l|||||0||xv`0v~8ll8|||8ld`f:lll8l<p0x |v 8< ||0vvfffv~8ll8|0c>~~cl~3fclz6j<<3ff3f3f""""UUUUwwww0`8l|8l 8l~~666666666666666666~~ff<~~v|~~v8l6670??07666666666670766666666||0~ |xlffl|08< <<a><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<l8l||||`0||0xv`0v~ x|||||8ld`````||@~p0`x |v 08<0`||0`vvffffffv~8ll8|0000`|`bfl0`܆ >`bfl0fΚ?<<<6ll6||DDDDDDDDUUUUUUUUwwwwwwww66666666666666666666666666666666666666666666666666666666666666666666666666666667666666666666670??07666666666666666666666666667076666666666666666666666666666666666666666666??66666666666666666666666vvxllllll`00`~pffffff|``v~ffff<~~~~`0``|```0|~~0  0~ 0`0 ~p~vv8ll8 ll<l66666><~~<ffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0f8ll8vv0 00000 0 0f<l8l||||`0||0xv`0v~ x|||||8ld````||@ff|bfoff~p 0x |v 08< 0|| 0vvfffffv~8ll8|0000`|`cfl0n `cfl6n?<<<6ll6||DDDDDDDUUUUUUUwwwwwww66666666666666666666666666666666666666666666666666666666666666666666676666666666670??0766666666666666666666667076666666666666666666666666666666666666??6666666666666666666vvxlllll`00`~pfffff|`v~fff<~~~~`0``~``0|~~0  0~ 0`0 ~p~vv8ll8 l<l66666><~~<ffffff{>a`<|0f8l8vv0 000 0 0f<l|||||0||xv`0v~8ll8|||8ld`f:ll<p0x |v 8< ||0vvfffv~8ll8|0c>cl~3fclz6j<<3ff3||""""UUUUwwww66666666666666666666666666666666666676666670??0766666666667076666666666666666666??6666666666vvxllll`0`~pffff|v~ff<~~ ~~`0`~`0|~~0 0~ 0 ~p~vv8ll8 l<l6666x 0|<<<<~~~~l|88||8<<<<~~<<<><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<ffffff~DDDDDDDDUUUUUUUUwwwwwwww66666666666666666666666666666666666666666666666666666666666666666666666666666667666666666666670??07666666666666666666666666667076666666666666666666666666666666666666666666??66666666666666666666666||~Z~|||8l88l ~`|fff|涶||~~6fffll||0  0~ 0`0 ~p~vv8ll8 ll<||p0`|||||||~~~~l|88||8<<<<~~<<<><~~<ffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0f8ll8vv000` 00000 0 0f<fffff~DDDDDDDUUUUUUUwwwwwww66666666666666666666666666666666666666666666666666666666666666666666676666666666670??0766666666666666666666667076666666666666666666666666666666666666??6666666666666666666||~Z~|||8l88l ~`|ff|涶||~~6fllll||0  0~ 0`0 ~p~vv8ll8 l<||p0`||||||~~~~l|88||88|8|8|8||8|<<><~~<ffffff{>c8ll8x~~~<~~<<~~< 0``0$ff$<~~<0xx000llllllll0|x 00f8l8vv``0```0`00`f<x00000x xflxlf```bf8ll8ff|``xxff|lfxpx0000xx0Dl88lx00xƌ2fx`````x`0 xx8l00x ||```|ff|xx ||xx8l```|| ``|ffff0p000x l8``flxlfp00000xxx|ff|``|| vf`|x 0|004|x0ll8l| 0d00000000v8l6ff~ff|``|ff||ff|ff|~``````8lllll~``|``~~<~f<~~ff<``|ff|```|ff|x>x>fff>6fx |v<`<~~f<`|f|``|f||>|>f>6ff~`|`~$><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0$ff$88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<> < pp<"<($"> < 8ll8~Ȩ >P > 0`0 ~0  0~~lllll ~~0`8ld`````<<<~~8ld`````||Ƃf<|`8ll8 ||Ƃ|pxx6ll6||Ƃ|8ll8~~p0`0p0`fffff~c`{ <````p؈pl6l0fΖ>0`Λ 0r60fΖ>0000`|`08l 08l8l8lv8l8l8l88l>l 8~~~~6>>><<<<~~<<<<$BB$<۽ xxc06cc6c><~~<~<~~<  00````$BB$<~~<<<<fff$6666666>c``>c>ac 0cC66;nff;000` 00000 0 0f<~cgo{scc> < ?>c 0c>cc>6f~```~c>0``~ccc>c >ccc>ccc>>ccc?0 0`0 ~~`0  0`>cc >ccooon`>6ccccc~333>333~3`````3|6333336|304<403304<400x3```oc3cccccccc<<ff<s366<663sx0000003cwkccccccs{ogccc6ccccc6~333>000x6cccck>~333>633s>cc0cc>~Z<cccccccc>cccccc6ccccckk6ccc66cccfffff<<c 0`c<0000000<@`0 < <6c <>ff;p00>3333n>c``c>>ffff;>c`c>30|0000x;fff>f<p006;333s    xp0036<63s fkkkkn33333>cccc>n333>00x;fff>n3000x>c8c>~fffff;ccc6cckk6c66ccfff>f<f 3ppp;n6cc<~~<UUUUUUUDD|DD|@x@@8D@D8@@@@|8ll8~~DdTLDDDD( 0`0 ~0  0~>v666l~~ @600|00s~<<<>c``c>600|00s~Bc06cc6c>cc>A]QQ]A>8A]UYUA>~8ll8~~8l0d|| 8 l8 fffff;`{ 0p000x8DDD8|l66l`cfl3g`cfl0n 0cl3g0cc>`06cccc 6cccc66cccc;n6cccccc6cccc66cccc6ffg~ffg3`````3 `030>03 30>03630>03cc30>03`0<< << cccccc>6cccccc>cccccccc> fff<<x0>33>000x6cflgckn```0<>ff; <>ff;6<>ff;;n<>ff;ff<>ff;6<>ff;v ;nh7>c``c> 0 >c`c> >c`c>6>c`c>cc>c`c>`08< 8<fff<;nn33333`0>cccc> >cccc>6>cccc>;n>cccc>cc>cccc>~>go{s>``0fffff; fffff;f<x0>3333>0xffffff>f<~~~~l|88||88|8|8|8||8|<<><~~<ffffff{>c8ll8x~~~<~~<<~~< 0``0$ff$<~~<0xx000llllllll0|x 00f8l8vv``0```0`00`f<x00000x xflxlf```bf8ll8ff|``xxff|lfxpx0000xx0l88lx00xƌ2fx`````x`0 xx8l00x |v``|ffxx |vxx8l```v| `lvff0p000x x`flxlp00000xxxff|`v| vf`|x 0|004vx0ll8l| 0d00000000v8l<~~UUUUDDDD|@@@8DD8@@@|8l8~DdLDDD( 0` ~0 0~>66l~~@0000~000xx0||8```0v~~ 0f3f`fl3g`fl6j l3g00`x 0x`0xx0xf0x0x0H0x>x><~~<fffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<fffff~~~6f||~Z~||涶||||~`|fff|>f><~~<ffffffff{|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<fff$lllllll||| 0f8ll8vv000` 00000 0 0f<ffff~~~6f||~Z~||涶||||~`|ff|>f><~~<ffffff{>c8ll8x~~~<~~<<~~< 0``0$ff$<~~<0xx000llllllll0|x 00f8l8vv``0```0`00`f<x00000x xflxlf```bf8ll8ff|``xxff|lfxpx0000xx0Dl88lx00xƌ2fx`````x`0 xx8l00x ||```|ff|xx ||xx8l```|| ``|ffff0p000x l8``flxlfp00000xxx|ff|``|| vf`|x 0|004|x0ll8l| 0d00000000v8lDDDDUUUUwwww||||h8vv 0`0 0  0B~p8ll80H x88~66666666$f>6f|ff|`<~<~|f|f|``|f||ff>`|f|6ff~ff|``|ff|ffffff8lllll~``|``~~~~``````ff<fff>6f|fff|``f<~<~|ff|ff|```|ff|xfff>``|ff|~~~~l|88||8<<<<~~<<<6>0000p~f~ffffn<<>><~~<fffffffff|`8ll8 |<~~<~<~~< 0``0(ll(88||||88<<<Dlllllll||| 0`Ɔ8ll8vv000` 000000 0 0f<t 5U G9} h8 B(YU >53fD_=0|&=7FD_Ã0fD_D_uD_ fD_D_%fD_]f=0|J=7@FÃ0ffL_f@_F waU G fu u YYj<Yj4YY_^U VWErr@h hP_h&YY_fD_frr th hr5&YYrxVtv JYPVYYM[U :E t}t Whh J&YYEhd W gYY_u WhT $&YYWUY5_ dY뜃}u_ShL ,Y$_thfh_^U VWUUU:tE:/uUU1 }V@rFuYf _c:13}S3UVVV VWVWV+VW VWW UjWVYY$lUtnk EUt_^UVWjsY<_U}UrV€fF%-k$ǁǔ_u%W WUVW UVF%fF=uUR+W MQu UNJt9=tV€t nVUFrjPv EUE}3S3U4ht;F=u,=t nVjjhv 6E t@_jk$_9v(wVkY^PjSv N$_^UVU Rt u Ru _t.uV0 Y| RcV YaV YVV YK4ƃ t?u9j$ Y*j Yj Y Y1_H_z}Z _I9J|9 _ _: t _5_j zYY5_VpzYYn _ _VV[YM_H_z}5_dY _ƃu1~ƀVYƉ50s^UVW11}| };14-&lsU1s }t}FU_H_za _I9J|:U _ _: t _D5_j -yYY3U5_RyYYU _ _lsUN{_H_zj _I9J|=ыU _ _: t _5_j xYY떉ыU5_RkxYYwыU _ _Uls_U_H_za _I9J|:U _ _: t _D5_j wYY3U5_RwYYU _ _1s }t}FU_H_za _I9J|:U _ _: t _D5_j wYY3U5_RwYYU _ __UN_H_zj _I9J|=ыU _ _: t _5_j xvYY떉ыU5_R\vYYwыU _ _U=_5_N_H_zP _I9J|.G_: t _5_j uYYG5_PuYY둊G__xls 0 EjT_H_za _I9J|:U _ _: t _D5_j *uYY3U5_RuYYU _ _N_H_zP _I9J|.G_: t _5_j tYYG5_PtYY둊G__x_^UVW11F?8E /E !E E EN|7e_H_z}5_4^Y _ EƋUlsElsn_H_z}5_]Y _PY5ls5_=_ls ERN|3_H_z}5_p]Y _GʋE_^UV _=t _f __H_z}5_ ]Y _=u1v hX lYr xrHrz}Q rI9J|3 r r: t r45rj rYY#5rVrYY r r^UVls_H_z}5_\Y _=u hl Y%ls 5lsMu^UVW} Ǿ3t9uf __^U VWUEPM|UGE Ru}_tUf _hUYƅuGjUYhU YF $_Cf$_0u$EF>xu EF >buEF}tftbu htUYHlsFDžt/9~'09}w h YUlslsǸ _^U VW=3u&3RrY_u h 0Y5_@ǃ tuf _h UYw9}n\u~Nj3J_9wG+_U33P5_=sYY_u h Y_u։F`+___^UVW~ƃ07v0E}}-Qƃ0|7~ f _R0E͉?8 1 * # '" L_^UVW}G-0E= sNGu1ud =tVYnBfnJhBfhVPYE#U fU#UfUUUjEPBYY^UV3J3}.hogYUu h Y33UU Ƌ<_UV5<_^UVuVt Vt0=u=H_t ha YVBH_1F^UVuVu12=uVu U 9VtU V^UVW}EEFu3+U3}4hPfYWu hgY+U3}5WGFЄu=W5W_^UVWu} uu!!9kcquu ]!!9uu tu%6uu%EAt h0Y1_^UVWW}#U F} OuNDExSJxS}D9S+pSpS: tpS2hpSj bYY"hpSuaYYpSM pSWwE_^UVrrHrz}5rKY r= P}Fr=|hXKYxSJxS}D9S,pS pS: tpS/hpSj aYYhpSj aYYpS pSrfrr|uxSJxS}D9S-pS pS: tpS/hpSj `YYhpSV}`YYpS pSrHrz}5rJY r= XrmxSJxS}D9S,pS pS: tpS/hpSj _YYhpSj _YYpS pShpS>CYffrfrfr^UVW=huBL_t1S=r@rr=ru0u=WuWhzY1rV7YR+Y)VYRY; E :^UVW5_=_O| FPY}tjY_^Uu hu@B uuhYYUhuUAYYEuuhnYYEUVh]Yƅu53u Vh uEuDYPY^UUhYUh(YU0_@f0_uuuu uh4uUh@hTYYY\U0_@f0_uuuu uh`&Uuuuu uhdUhpS=Y=8_t 5(_58_hxhS@54_hphS@ uuuuu hSj@uhSZ@YYU=u hHYUYYu hYhY8!RYhsH_hs!R5`s5\s 6Y#}X=EEUfhlsV $|s=xs> xs3UU:Džt/=|s|')}G9|su}X==xsuh@Yts=xsxsUE8Džt\|T)L}G=u=}u@}X=EEUfhlsV#R}sEw=|s|s}45E+UыTsshPvYYvY~|~ ~h0YFvYPrYO6oYrt jY/r frfrf6Yrt jVYrfrfrf6oYrt j Yrfrfrfn(_rt jY"rtfrfrf=H_$sV(_=8_th5_58_! rt jIY"rtfrfrf=H_h Yxs(_rt jY"rtfrfrf=H_B8rtvjYYrfrPvYYvvYYtfrfrD_fr6CY6v+YY6Y{~q=_h YOWW>.=uVuhmYH_t.Vt"fFWr OYFH_#V^ vP_P:t_1PBo_P#Vh 5hP_P:t_1P>t f,_,_@f,_,_h5hPSjjxf,_h 5hjP5_G6Y:=hu,hhPFP6YU fU ftFPSYYFPvYYtFPSYYFPvVYYwhYsfsTsfs>6YsWB%fs=_t hoY_sfsVNs s~u~t1sNjSQ fs~t ~t1sNjSQ^ fs\V Vs^jPS4 fs2V3Vs^jPS fsV#Vs^jPS fsV19Vu@sNj>SQ fsV19Vt@sNj>SQ fsV19V}@sNj>SQV fsTV19V~@sNj>SQ( fs&V19V@sNj>SQ fsV19V|@sNj>SQ fsNVs^jPS fsNVs^jPSt fsrVVs^j+PSJ fsHV+Vs^j-PS fsVVs^jPS fs ~u%=u hDYsNFs^jPS fs ~u%=u hYsNFs^jPSF fsD VsjPj" fs VډsjPj fs V҉sjPj fs hsh fs %=t hYVs sz sm s^ sQ .   P Y %9u"= hNY %PY1= %9u"=` hhYP %PiY1=+ PIY PY Fv6P Fv6P_ FP Y FPY>v6Y =t hXYFPY FPYp FPY` FP_YP FPpY@ FPYF% PHYF%8PTY F%PY FPYjv6 FjPYYveY hYFSY VttFPYvY6YU FPrYFPY7 jWYFPLYFPxY FP.YP[YF^PS?YYjYFPYFPYjYFPYFPYjYF%PYF%8PYejYhzYF%8PY==t1 uhY>vhY6YPYFHPYjPYYvYXTs t hHYjaYF PQYjYFPY FP#YFP-YF=u Yj$6Y #uVYE^F^UVuV9Vv6V+VRvv# V+VV s;N W VVVV^UVWiE ƁX{VU> u9}~CVpYWu v U)UU U ~ s?;N W-})E~E E U EOUV>t > VY#UUt?uu v UU U eUV s;N W}t0EVU)~E E U EOUV_^UViE ƁX{ju v F }|E #U ډ +NʉVV^UVhu0YYP YX{;sju YYF}1 X^UVX{;sVYvYF ^UVWUJkUz jjYYWjYYUJWjYYUJ k WjYYuU ωFUJωFUJωFUJωFUJωFUJ ωFUz FFFUzFFFjEPjT _^UVWU UUуMtG=X~=X}Ur5XLYYU XCrXWEkE EE} X{E5\{9E sU UU +UU kE+X{أX{UуME8FFFUzFFFUzFFFUz FFFUzFFFE5\{} }hX{Ym_^UVW}hX{=;|;i Z9=;=;yV+VRvv V+VV ;N WV 9Wtj4Wv F #W ډ +NʉVV=;_^Uu u=;|;PP U VW}} E59E sU UU +UU U+ډUуMbFOFWUUFWUUFUFUF닉5} 3hY#_^UVW}  E59E sU UU +UU kE +أUуME8FFFUJωFUJωFUzFFFE =5} hY_^Uu uj UVW} }t=U9RREVWu 9t ׋U)U_^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u P1ۇHTtPXP' *:+L$ *UVWM*E_^]U$UUEEEEEEPjj  U$UUEEEEEEPjj U$uEPjU UEPjjU(UUUUU UEEEEPjjZ E=uEUu UBUM JUju RU,VU @t=Uփ֋ru`YE܋U UuUUEEU UuEPjYYEPjj ^U(VWu UJ<;UUtuuUJ4;EEEEEPj0j: E؅}UJ<;EUJ4;}u_^UVuU VVu(YYEtF~}VډRF^U$uEPfEEPj jU$UUUUU UEEEEPjjV UVuV uR ~V t VY1E~ tvV Y}EV €t v Y~0tV@9V0t v0 YF0~DtvD YFDfF E^U}u hAh%UJ uR uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT PSYEu18u EUzUrThD^P%O}E_^UVW=T<uTwWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW+ǾT>t 6+V~ WY_^UhAhYUP<jT<UVEPu *YYEu1xƅthuu2 E}fF ̋EfFEfF vF$d>zuFa Rta{@p_^UU URuhpS@ EUVuV`+YuNSX^U\fEUUUUUUURu EP EUEUVuFuu P# E|FPF %fF E^UVuV tFjjP| F %fF ^uu S] ^UVuFuu P9 E=u^ fF F fF UVPE^UUBP{YUVu ~u F1VuH%YYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EP)YtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQYYt5uu5T5P}E-EDEuuYYtE@E}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEE,M@ExUURUuE$}|4ujuB t+EE9EU܉UuoYEMUutUU#J UUBEEZEEUutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu!URYELXEd+UU1}=UM EpEUUU}tE U@tEU9U~EEEU0U+UU=$TFEE}|EPu YYdm}$TUVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPuYYC EԉURP5d5` YY5l5h$YYjj} Z0OEi}tW9U$vFF0}uUtF.uu5t5pr }nEPuu5|5x YYo EUuujj Z0FMtuu55 uuu55 tujFPu juuE UIMF0}W׉F }uUtF.W9U$vFM}u}uEW9U$v; UMuPFPu EP552E Muu55 EMEPuu55 YY EUuu55 tuujj" Z0F}uUtF0}uUtF.uu55( }nEPuu55< YY% EUuujj Z0FMtuu55 uuu55 t)ujFPu EPuuE F0UIMu}tUu9u s Vր:0t>.uNFuuV, 0}uEU9UB}uOuu55 t1uu55 }MmE}tW9U$vFMF0}uUt F.1uu55[ $}EPuu55o YYX EUuujj Z0Fuu55tMkuu55tMEPuu5 5YY EUuujj$ Z0Fuu55RtujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF E+U _^UVWu u5L5Ht'EPu u5T5PYY E-0PjfEEu}uu5\5X[~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VBYu1NUG9~tV t} u VYuE_^UV=T<uuV ufV u V t:~0tV@9V0t v0mYF0F %fF FVF fF ~uVTYV tFVډVV t1FF1^UEP9 jEP j P jj$jm P jD(UVUU U RYƅt u Vx YY^UuwYUVW5X<VUT>M}}6u݃=P<tP<uY_^UEPuYYU VW=uE 9t FE>u}5REuW6G u0UU:=u#+RЙ] UUR >ujX_^U$VW=_k ǣ_jU YƉI!)ى}=_tW0 Y=u1%EE95_wU__9UwEE#_U_UUUtEU9UwU^օUѺU~W9_~5_}EU5_EVN Y=tU<^ U։MU^օU ^UVF_^UVWutVր:uV׍^׋7_^UVW}Euu .YWU:u EJ-juYYƅ}5DTuYYƅ}NU9_vm _U}tFt*N9_~  _֋U9U w 9u v;WYu jYƅu1!9tU9U sE EPVW _^UVWEE*1E^9} t9uuEG6uEE}|и_^=_CC [ =_;{SK k{uC [ SkC [=_C[=_31C CtrIAÃ=_C s[ =_CK [ =_'C[U}u}uUM UMQ}u} tEjEPEP jEPEP EPEPYYjEPEPV UVu EPEPa E}1} u@D1UfUE]9~;E@]9uUt}u}tjrYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEP+YjWEP  _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEP_ jEPEPM EPEP YYjEPEP UjEPEP jEPEP EPEPuYYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]U`E]]P;Xa]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]D$D$D$Uu ju0UW}E MuG_]1_]UW}E Mr' uuĉ  fE_]U} |} ~R 5juYY|U 9UuE u +u junU} |} ~RM E 1U} |} ~RM ҋE!1UE1UE1U} |} ~RM Et1U(UUEEEEEEPjj E=u UPT1UVW5PTPT}׃}~9r}}9vWqYu_^U$VuEE`E ?V֋RU V֋RUUUU UEEEPjdjP ^U$EEEEEEEPjj U$UUU UEEEEEPj%j U$UUUUU UEEEEPjj U$uEUUU UEEEEPjj@UVU֋RUu>uFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z55UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu uYYXZ_^UUU VWuVFZiEE8EE@#EE@R1)>+t >bu~+u EU UE _^U VWU RUu1"uV t~uV,YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W V+UVUUUyV9v,U9Us$u6WUVtKVU9UruWvV, E'UUR6WK V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W Et ) UЉEEU9UvEEEVVUV9v)9E}$u6WmUVtHVU9U|uWvV, E$pUUR6W$ V+UVUU+UUuV|Yu8E}׋U+UUU R+UM QU zF @fF _^U,VuV tVCVFF|F]SP;YY}EEVU؁1 u@EEU؁u%~(ou^ fF FLF fF uYEu^ fF 5P<jF fF UVUV}tFPjYtF fF ^UUB % 1=uCt u Y1UV=T<uuFV t V uYV u R V t)VYuF %fF FFF fF 2~0t,V@9V0t v0YF0VT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WVٺt1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWV1t1f#V9Wv VVV+WVV+WVVY_^UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjjM U$UUU UUUEEEEPjhj LTu `=}aaa.outwbinvdinvlpginvdbswapcmpxchgcmpxchgbxaddxaddbfsubrpfsubrfsubpfsubfmulpfmulfdivrpfdivrfdivpfdivfaddpfaddffreefucompfcompfucomfcomfxchfstpfstfldfsubrdfsubrsfisubrlfisubrsfsubdfsubsfisublfisubsfstswfstenvfstcwfstpxfstpdfstpsfistplfistpsfistpqfstdfstsfistlfistsfsavefrstorfmuldfmulsfimullfimulsfldenvfldcwfldxflddfldsfildlfildsfildqfdivrdfdivrsfidivrlfidivrsfdivdfdivsfidivlfidivsfcompdfcompsficomplficompsfcomdfcomsficomlficomsfbstpfbldfadddfaddsfiaddlfiaddsfyl2xp1fyl2xfxtractfxamftstfsqrtfscalefrndintfptanfprem1fpremfsincosfsinfcosfpatanfnopfldzfldpifldln2fldlg2fldl2tfldl2efld1finitfincstpfenifdisifdecstpfucomppfcomppfclexfchsfabsf2xm1starplxchgxchgbtesttestbsetnlesetgsetngsetlesetnlsetgesetngesetlsetposetnpsetpesetpsetnssetssetnbesetasetnasetbesetnzsetnesetzsetesetnbsetaesetnaesetbsetnosetosarsarbshrshrbshlsalshlbsalbrcrrcrbrclrclbrorrorbrolrolbretfretpoppushdsegssegcsegesegrepzrepereprepnzrepnelocka32a16o32o16gsegfsegidividivbdivdivbmulmulbnegnegbnotnotbaadaamcltsaasaaadasdaastdcldsticlistcclccmchltxlatiretdiretintoleavescasscasblodslodsbstosstosbinscmpsinsbcmpsbmovsmovsblahfsahfpopfpushfwaitcwdcdqcwdecbwnopoutsoutsbpopadpopapushadpushamovmovbshrdshldlgslfslssldslesleaboundjnlejgjngjlejnljgejngejljpojnpjpejpjnsjsjnbejajnajbejnzjnejzjejncjnbjaejnaejcjbjnojojecxzjcxzlooploopzloopeloopnzloopneoutoutbininbintdecdecbincincbimulbimullmswverwsmswverrlidtltrlgdtlldtsidtstrsgdtsldtbsrbsflsllarmovsxbmovsxmovzxbmovzxenterjmpcalljmpfcallfbtcbtrbtsbtcmpcmpbxorxorbsubsubbandandbsbbsbbbadcadcbororbaddaddbtr7tr6tr5tr4tr3dr7dr6dr3dr2dr1dr0cr3cr2cr0gsfsdssscsesbhdhchahbldlclalediesiebpespebxedxecxeaxdisibpspbxdxcxax.use32.use16.list.nolist.file.line.symd.symb.base.sect.comm.space.assert.align.asciz.ascii.data4.data2.data1..extern.defineT/bdCorsu-o needs filenameSTDINcan't open %srsecond source file %sasLXXXXXXasTXXXXXXundefined label %dundefined symbol %scan't create %s T c r !B "7 &, '7 <, =, >, |, !E 6 6  %!")07@N\j%%%%%%%%%%%%%%%>>>>>>>>non-ascii characterunexpected EOF in compact inputdigit exceeds radixnumber too longout of memorynon-terminated stringout of memory"'ybVf]ndrktrbad numeric labelout of memoryillegal equatemultiple declaredmultiple declaredtoo many sections.base ignoredmultiple declaredbad sizeillegal alignmentout of memoryrelocation errorout of memory!+C!-_!>!illegal operator0123456789ABCDEF \ `&&&6&out of space for bit tablebit table overflow'Q'_'q'S( ()(S(>(can't reopen %srcan't create %sw/tmp%s/%sTMPDIRno sectionswrite error (fatal) assertion failed (fatal) (warning) %s: "%s", line %ld: too big+*(+6+bad operandbad operand---- -----bad scalescaling not allowed in 16-bit modebad operandsregister errorregister errorregister error?X@@@;AA?XA%BB?XCOCCCCCCDD@EE?XEF?X*F:FRFjFFFFG,G\GsGGG H7HaHHHHIGIuIIII!JLJJJKEKkK?X?XKKKKKKL4L?X?X?XQL`LLM#M2MIM`MpMMMMMMM4NINNNNO.OKOaOOOOP+PbPwPPPP#Q3QCQSQQQURRRS:S]SSSSS T+TQT|TTTTNUkUUU0VVV?XVVWDWWWXyacc stack overflowillegal index in FP stackillegal registersyntax errorsyntax errorsyntax errorsyntax errorsyntax errorsyntax errorregister errorregister erroroperand size toggle ignoredaddress size toggle ignoredmust be absolutedivide by zerodivide by zerotoo many charsexpr syntax errexpression undefinedassertion failedsyntax errorbad f/b labelsyntax errorKwvw!wzw X1rzwzw=rzwzwzwzwzwzwCr_rzwYrerzwrrrrrrrrrrzwzwzwzwzwzwzwzwzwzwZsszwszwzwzwzwszwzwtzwzwzwzwzwuzwzwuzwzwzwzwzwzwzwzwzwzw0s^sssss^szwzw'szwtt,uzwzwYuzwuzwzwvbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@قE'~Ge'~f}g$@@555****^aIrw4;(08 )19 *2: +3; ,4< -5=.6>/7?             x p h ` X P H @ %8 &0 ', '( '$ ' ' ' ' ' ' ' ' ' ' ' ' ' ) ) ) ) ) ) ) ) * * * * * * + + + , , , , , , - - - - - /x /t /p / l /d /` /X /T / L /!H /(@ /)< /04 /10 /8( /9$ 1 1 1 1 2 2( 33 4555566667777 77777 7!x7(p71h8`9(X:P:L:D: @;<<8<4<,<(= ======>>>>>>>>>>>>>>>>>> > > > > > > > > |>x>t>p>h?b`?\?X?T@P@L@HA@A8B0B,C`$C`CaCa CnCoCCCCCCCCCCCCCClCCmCCCxCpChC`CXCPCHC@C8C4C0C,C(C$C CCC'C/C7 C?DD D EEEEE E!E0E1E8E9.d.e$f$#g#....|.t.l.&d..\.6T.>LFDF@G<G4H,H(H H HHHHH H H!H!H(H)H8H9IIIIIIIIIII|ItIlIdI\I TI LI DI <I 4I ,I $I I I IIIJJKK0cRLLLLLLLLLLxLpLhL`LXLPLHL@L8L0L(L LLLLLLLLLLLLLMMMMM M0MMxMpMhM`MXMPMHM0@M08M00M0(M8 M8M8M8M(MMMMM(M(M MMMMM M0MMMMxM8pMhM`MXMPM8HM8@M08N80M (M M M M(M(M(M(OOOOOOOOOPPQQQQPxPpQhQ`QXQPSHS@S4S,T$D79D ==><=<=><<>> ||!&&"I@(#)yaccpar 1.8 (Berkeley) 01/20/90     BC  #;<!:"?IJHKLsD789SRYWacbUfQPlVOTikjtvuw}$456 ]Z_`e[\pqrmnoy{z|~A^67 - !.g>7@Q>U[>>>>dqh>U>>>>Ynv>>R>>p> rt|f>>>>>>>>>>>>>>>>>>>>>>fZVW%88>>b>F>>$>%,(>&( %&=Zdfhjo/b:<l?qEl+Bm+ >=x2}{|2~>}{9|~ xyz}{|=~2=22222g Eyz==/'2222w0>d1w4'''522g }EM;~''3 N hxv1@&X<2di333'3331011M1&&.&333N3hx111@1&&'X000%0....33000011...&.%%%3%%001..}{|~nopqrs0%rs. nopqrsFF22222222FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGG'':GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG3333333311111111&&/(),00000000......////,-,,,*///%/+,,,,---+-***)*(//---*-,,**++++))))((/(++--,))**((()-++*))((x+}{+|~)(yz"#$%*&'x}{|~x()}{|~yzyz//////,,,,,,w+w------**v***v,3++3833++"#$%))h((&'jklm}{|~}{(|)~yz3yz33()nopqrs+33"#$%+(*)&'nopqrstu()nopqrstu*()+ +()3*+333x*}{|~x}{|+~*yz3"#$%yz3&'nopqrs*wpqrs"#$%w&'x}{v|~xv}{|y~z"#$%yz&'"#$%w&'w"#$%&'vv"#$%?@&'ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefnopqrstunopqrstunopqrstunopqrsu :cd= %& : *+%- / *+- /  %&< >*+ -)/&,(),+,- ; <D>;; ;:;<E>^,; U ; G[;]^ ;NO;^()`a,%]^;;*; ,/,:;, ' ) , | ; ;; ; |((;,,,,&()]+,-& ();,() ,,:;<;>;,;:;<;>:;|;&,()' ,&'())*,'']^:;<R>R]^:;<]>R()', ,,,,,|,,:;]^|,,,,]^%,,*+(-R/',,, |,]'' '|''R R, (#$ !"./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ,ST#$)))!"*')./0123456789:;<=>?@ABCDEFGHIJKLMNOPQ ST !" !"!" (+-  !"!"&(),& (), :;<!>[:;<>&() ,&() , ]^:;<~>]^:;&(),&(),()|,:;]^|:;]^:;(+-|]^|]^]^%&|*+[-/|F|JLM<>TUXY~  %&(*+-/(%&+-*+-:/<'>)*+,-<>!"#!"^[]^!"|!"~| !"!"!"  %()*+*+-/%(*++--/<'>)*EG<>NOPQ(+Z-`a [nopqrstuvwxyz{|}~[+~-   !"+- !"'~)*+,-+-[  [(+-%&~[%&~(*+-/%&)*+-[/~<> <>   ~^ ^')*  %&*+|-/%&|*+'-</><>  C^K  ^\  e|'|#$'  ./0123456789:;<=>?@ABCDEFGHIJKLMNOPQST !" !" !" "SSSS ((((( AAAAAABBBBBB XSp9s04ju ^F뺋9sF98js+Pju W9s(9 MYPQY19$~MYF苕U9UGt MY9  1+ 9~( k$k$4P4S pFȋ+ }s EcJk$uu 4P\ Euu h4\ EU9UxEc0U1+ 9~( k$k$4P4S oFȋ+ Ec19$~.4uu [EF LYsG%1=uCG jGЉЁ|G ʉGЉЁ|]G ʉ>GЉЁ|G ʉDž29x+Jk$uu 4P[ EU9Ur EcnNDž2884BDڋ+Jk$44Yk FP"O t+uu NZ EU9UrEc뗃Dž288szt0k FPRN t BDG%1=uCGЉЁ|G ʉk(S:PJYY(,#XYt Ect2k,Dǀ2=2u,92u 2+Jk$4478u,9JuFMӁ81}$|2u,9 t F׃uu LX EU9UEcGЉЁ|G ʉ(PoMYY(ujj,A 5(81|2ujj,A FDž288 z@tR+Q@QB@DG jGЉ Ё|G  ʉ GЉЁ|]G ʉ>GЉ Ё|G  ʉ Dž\PKYY}1҉ T-2DjP@YYun-2DA(\PRPYYt)-2DAOy9A}u Ec =|t hYYuu h4DU EIuu h4)U EU9Ur Ec uDt;19~1k(D2uA(Fǃu+19(FDž19oADžJ9}6229uFDž8}DŽ<F틕PFYU+UDž9#jj= < C\t)ju 8P\P6$Dž$=Y9$s2js +$Pju W.$9$s$P'FYU9Us>EcUj<YYt EcDž8jj9< <\t8huu 8P\Po5EU9UrEc;<YA  G%GЉЁ|G ʉ}t5R"'~'t_-Y Q-Y19GЉЁ|G ʉ(P>FYY}tu ,P(P>/YY(~(8EFc}t.U9UEcGЉЁ|G ʉ(PEYYGЉЁ|G ʉPBEYYU+URuu P(P23EU9UEcGЉЁ|G ʉ(PDYYU+URuu (Pl5EU9UqEcxGЉЁ|G ʉ(P7DYY(P4Y GЉЁ|G ʉk(S:P@YY(,49YG%19~cGЉЁ|G ʉk$SPCYYk$jSKYYF195~(}uJk$j4PKYY F19~1k$A k$Q4S `F195jj4U7 FG%-9~k5|4Ћ+PS.`Nȋ++19GЉЁ|G ʉGЉЁ|G ʉ k kQì:SYYFS19BBBk YBk J NBk o'YYBk |^F(}GU 9GSXf=|G fGSXf=|G fU~N GYEU9UqEcx}      !"#$%&t_"SEGЉЁ|G ʉ}t8*YG% ]}tL}cuC=|u:Jk$uu 4PKI E| t> uF>+uF >-uFEF-0E= s k }tډ_^UVu zt)hzhVV u VhAYYN =ttPhAYY@R-Y<^Uhh5XRU UUVW+==$tǀA ց|hAYFWy YF4V $=( o$=( N,ǻHPJt%EuFFUUuWyY=4|4F4V 54YFhF540YFiF4V WP YF,FW= YF4V )LE0OW YFu FuF4V F_^UYY(yN5hhZX j`Y4Uh?YƋ=4j`Y4U=4uVu uji Y h?bYPC YhPY=>V$ Yj) Y EEEh? YƁt=u}}U܋ 4LU UEeV YhY뻡 H z}5 WY E=r}t5 uY"h%"#5(h 9YY,kI_^UVWƉǃu h@:Yօuu Wh(9YY_^UV H z}5 RY Ɓ}~ 5,I}| 5,,}|4V`Y^UV H z}5 dRY Ɓ}|x4VY^UVu H z}5 QY 4 H z}5 QY 8||8mh4\4KDjY0j`Y-j`Y4UU4 P0G^UVW H z}5 QY ǡ H z}5 PY Ɓ| _^UVW H z}5 PY ơ H z}5 WPY  ơ H z}5 "PY i ơ H z}5 OY ǁ|i _^UVWj`NY=4} hf6Y@94r05<!Y4R!Y<4B@=4=D5<O|3 H z}5 .OY FF_^UV545hh@O58h h@N 54hh@N y5<hh@N \50rY@>tF=4|+F -F454hVtN E3Dh@Y^UVW}1t h@4Y}t} u3=4u*jsYWhh05XG=jIY~Wu 'YZ)‰t hI4Y_^UVuaYh@h5XG h@h5XXG 54jYY195D~<PjYYFD]=4~>54Y5<YP54YY4 4PEB^UjYU9Ut/U|U4h5XbF UVW=thh@h5X0F@GFЄu_^U=thh5XE U=thh5XE U=t-5 h5XE  U5uh5<bK5<YUVWu} t=uktu,u!Njщ = = 5_^U}t he1Y5<pYEPh5XD UVWu1} t} t EPu`2YY} EfE}ufEU€t'uE@fEEEE=|fE1҉UUE-jEP=YYE}EPEP=YYfEE] ÉF]#U ډFUFUFjEPC=YYKEfE}ufEEt;#Uu$E}uE@fEE EEE=|fE1҉UUE-jEP<YYE}EPEP<YYfEE] ÉF]U ډFUFU FUFUM щFUFU jˍEP;YY} uNNNNNNNt1_^UVWEP545<0 ǃu#54hthp{A hdC.Y545<hP5XAu5<hhp{pA EPh5XXA 954~D5Ph5X2A FܡXHXz}K XI9J|, X: t X45Xj ^YY#5Xj ]YYX X_^U5Xh@YYUHUVu} t$N}t}uփ}|^ULPTUP9LtEH9Lu-HH9Pu-HH9Lu-H=Ht5Hh5X? =Tu/5Xh?YY=LtJ5Xh?YY6=Tu-5Xh?YY=Pt5Xhu?YY=L|5Lh5X4? =P|5Ph5X? Uhua;YYu=Tu TU L=Tu TU PU=Tu/=Lt5XhD>YY5Xh8>YY6=Tu-=Pt5Xh,~>YY5Xh l>YY5XhZ>YYUVuh`V:YYu |~Fu V| VhP3*YY^U VWVYh@h5X= h(Y=h`YƁu5Xh=YY#5<h5Xl= j`YƋ=4j`YƋ4UhYƃ=|tu4uWVYPh5X=heYh`SYƁu < j`6Y=4Du =|u5Xh<YY545<h5X|<j`Y54h5XY< hYH=|t|5|h5X#< hY=thE7_^U}u X{-h{hDu)< Xuuh4'YYU=Xt 5X8YUXJ @t hH'YUU5X48D;YYU}uEl} u U:u hhY@uY5U R|+ Puh`h|@h|YU}tU:uu hx5X: :5Xu:YY} XHXz}K XI9J|,-X: t X45Xj WYY#5Xj-qWYYX-XU Rht5X%: } XHXz}K XI9J|,+X: t X45Xj VYY#5Xj+VYYX+Xu hp5X9 UXHXz}K XI9J|, X: t X45Xj ]VYY#5Xj LVYYX XUVWXHXzT XI9J|4U X X: t X75Xj UYY&5Xu UYYU X XE8u&UkZD25X48D8YY@Eׁ8W 8DUEEƅ ~XHXz}T XI9J|3 X X: t X5Xj TYY5XVTYYs X X[UI4h5X7 7UIt4qYYUIkD25X48DW7YYJD|2_^UkE Th5X6 UVWj YƋum3Y@PYFuv63YY1U NG5_^UV5tuv2YYu61^UV1} ~E}t}t h"YjjYƋUVU VEfF 5^UVW}5t 9~u61_^UUtuYUVW} \M:-RITY<ыR6TYƉ U Uk$U2$Ud)(U(Uk,U2,U5$U5 UYYơ U1 U$U1$U5,U5(UYYơ(U1(U,U1,U!7YB0}~5\h YY}~1PY}|G1PYd jhj5<h$h Y_^UVW} E1։}uE_^UVWu uYYt1E 8u];u=U kJDUkBD2Q2PHYYt9UkBD2t)10U kBDu2PYYt1U rY+E8u#UkZD2Su YYt10R|HFk PüFSu. t"F^k PüFSu  u k$u 4P .Bk$u4P .FjuuuPaE--] ;U kJDρǤ2M9uUkBD2PGP .uGP -W8EE}EE8XUO kDU R2PU #Jt&GE}}:UO EE늋E8uUkZDu 2S B-E_^Uuh2 &-UVW}=2t>h2WYYt1?u!kGDh22PYYt1R|$Fk PüFSW uk$W4P ,Fjuuu PdE  _^UVW}GЉUЁ|GU ʉU} u }}1VU 9Ut1G19u~G9 t1$F19uzuk ǀPb2Yk P=uk ؋R T$k RTk ǀXFoGЉЁ|Gȉ ΅tBUk]S:P]YY}u}u U1 U_^U#UJt% *UVW}z=h=v\-+أ1E95~"]EPS)FfUE3BfE]3Z f]]DuЋpU}tB}hUDu9uBRGP(YYEtGW ЉEN1_^U VWkEDƁƤ2~uU V}t0U V@(1}!VUtuu u G_^U VWkEDƁƤ2~uv} tF@1Z)‰@EE}})UNׅtu WYY9}}}EыE_^UVWkEDƁƤ2VU88UFU kDƁƤ2F| V OEEE288s~u-U9V xFdV O~MV8E1}6EE8u(V M9 uF|V OGŃDf_^UVW288s"F| V OD_^UVjYƋ`5`UVU VUV UVF^UVW} U <0UHUkDUR92t E&UM]Eu rq sp=EU 4XU0UJM9JoU 0UJщUU 0UJׅ~,JM9J}JRP&OЉM MLUU=0UHUkDUR92t E%UM]Ejrq spYE5XU0UJM9J}J0UJׅ~,JM9J}JRPV%OЉM ML_^UVW1EU90U}t. HUkD2E]pj48D OUXUz~GUWtkED_K2UUVGk]S:PYYuYE~/UVE}UNMGE}UBOQuUN_UBOQk]S:P7YY}uUN],}uUNEPP UN]Enx _^U VWu kE ǁTIWuuV 5UkBD2E_KVUGH‰VGFWtkED_K2UUVcUUGk]S:PYYUuYE~/UVE}UNMUE-4$@_E}UBOQuUNzUUUBOQk]S:P(YYU}uUN],}uUNEPPv UN]ESU  `_^UVWE] 9t1E8u E8uUM I9Jt1Eׁ81UM  9 p1tUM  9 Q1UU M44YYt14UM L9Lt1D7 YFZ_^U(VWEEu"=u1dEE% F%E9}'}t U+U؋UU9t}u uEJk$ǁ4EU9UFЉUЁ|FU ʉUkE jFPW[ j}t uTYEWZYE9E~ dU9U}c+UkE FPYu EE4UU9U}KFЉUЁ|FU ʉUkE FPHYu8E몋U9Uu}u}t1 +UUU؉_^UVWHI1}UrWrtF1_^UE U15$U] (UP15,UZUkE FUVu>u kFD2 Ћ8^UVW}?uju w ?Ѝ8E}}"F<uUOju 4 E_^UVWuJk$4E)$9=| k$Jk$PԡS G؋+_^U VW1ԡ9=C>u U9Vu088E1}U|:u VM9 t GG$1_^UV195~/k$A k$ԡP4S F^UVu uYUFuhuuP蠖EU_E^UVWDžDž 4U9 +SFk PüFS a F|ZFTt*-2DjPYYt ăJk$4,+ $$9$|%k$ Jk$P0P \GӋ+$ 19~GF|6-2Djj5 Fjhuu P覔 19$~,k$k$0Q4S dG̋19~GE_^U,VW`S,}t1Fk PüFSu uF}6Fju]SP=ju EP jXYFt:VUUE}~MEEGYfF_^Uh hp{YYu(u$u uuuuu uhp{(h hp{xYYj22YUh hp{UYYu(u$u uuuuu uhp{.(h hp{YYax1j1YUVW}1} E1}t] E 1EE 1Uu5yEP}tlw,uk] PW u5y}r8EP}ty`wPEP u5yUUW}tx|vk] PEPz u5y5y_^U VWu }EEEytGyffF1҉VVEfG LE GEyu}.UAM}.tE~c~VVNUMjFP YYjEP YYEPFPYYEU0UEPFPYYE}NMF}uy}Et }e_EE EG dy EytkE U0‰UGEyuUUU~u~tfF?V YuVGYYV Y_^U,VWuEl|1E~|l|EtEfE ~Evh`wVdYY|!VhyV E E uV4YY|E GOk VxPV k] ] E8u}|vsuVYY|E GOE 8h,uVYYhyVYY}!Vh`wV_ E E ExuVyYY}E GOk V|vPV E k+ۋE Vh8uV E Elw1uV#YY}E Gk V,uPV E )E 1E U9UREfEfEEEk ,uPEP EPVYY|0EPEP k ]S,uPEP E0UԋMEfEVEPV OJFu~kEfVfUfEVUF-؉U0ME}t.F-؉UUVEPV U0E~Vh8uVV }l|fUUU=9~*0}l|vMUU@֋U1E ɋUM}l|v U:0ul|_^U@VWuuEP&yEPEPEP ǃ}t-FGF.FE}~?tGF }u 0FM܋UMI JtM}NeF}} -F]+F}O E0OEEu݀?tGFFU҉)9M} yuҋ} GFu_^U VWu }EPVW }u }u1Ut_^U$VWu }yV VuWuW WuVu~VEPWEP|}uF_)ۉ]}!]FEfFuFP\YY"}~GEfGuGP8YY9vwYYEvwYYE܃} }u4}~.}}OW+VWW+VWWu}~NV+WVV+WVVuXVuxUGPRYYt4UjRhYYURMQUB@UfBuYuY_^UVu 1fuVu 1f^UVWu} +7RYY1ۅÉ]+VwR^YY1ۅÉ]WV}tB>u E_^UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUt(Ft!FFtFF@fFVnY_^UVWuV VufFf_~uVVFF- fFFu3E@UVu}OFfFWFPYY_^UVWu} ?}F |V ~IVVJыVV>t) )ы VVI߃ |VF ~7~t&VU) VV_^UVuF=@|yfF@FFF=#yfFFfF^UVWu }Wf#WfVWfV#WfV_^UVWu} 9u1.|9}}9}_^{sƉ+C;Cw Ë[ uӅu P-KI|;u[u Pk1ۇ{tPXPV0v0UVW0E_^]0U$UUEEEEEEPjj UVuU VVu/YYEtF~}VډyF^UVuV uy ~V t VY1E~ tvV Y}EV €t v #Y~0tV@9V0t v0"YF0~DtvD"YFDfF E^U}u h%UJ uy uYU VW}G EgWօt^)U7Ut1GG;uVwW, E_ @fG U+UUuփ}1_^UVW}kT Pg YEu18u EUzUrThPO}E_^UVW=Pu{wWU V t#TM}?uj ]Yt?1SfF FFFFFfFF0F4FDFH_^UVW=4Ǿ{>t 6+V~ WY_^UhYULiPUUURu u EUUUu`EEUUEEPu  UVWuEPu 3YYEuVY1=PuQV ufF EE;V tVPY1~ E^]}}tvV YEhuu/ Dž}:}t4=yt =yu"vV Ehuu/NjyU}tvV YV €t v6YFFFFF~0tV@9V0t v0YF0F4~DtvDYFDFH}fF Uy}|9}tuW+YY| WI-Y}EfF fFvF$ԇF,F(]F _^U VWU RUu1"uV t~uV(YE U:RUEV p}uE8URUE}sEPWvV, E}׋U+UUU R+UM QU zuGV  }uE8URUEVUV t4U9UvUu6W) V+UVUUUyV9v,U9Us$u6W)UV*tKVU9UruWvV, E'UUR6Wk) V+UVU}׋U+UUU R+UM QU z0EE}uEE8URUE߃}u2uj W) Et ) UЉEEU9UvEEEVVUV9v)9E}$u6W(UVtHVU9U|uWvV, E$pUUR6WD( V+UVUU+UUuVYu8E}׋U+UUU R+UM QU zF @fF _^U VWE{%wWUV tVUY ETM}?u׋E_^UVuV0YuNSX^U\fEUUUUUUURu EP EUEUVuFuu P* E|FPF %fF E^UVuV tFjjP) F %fF ^uu Sa+ ^UVuFuu P) E=u^ fF F fF UVPE^UUBP#(YU VW}u =Puu V uKV tV t)VYuF %fF FFF fF UʉM~0V49VuV@9V0uOh3YEu vUV0F4E UL>@ O}UEAV4URv0YYEtEuPu$ E8UV0UV41UFEI~tV9vJ9Mu܋VV<V8V@V0F4UVBVBFE_^UVu ~u F1VuLYYEFFE^UXVuF %fEfVfUVUċV,UԍUUUUEuu EP> E|EPQYtEU@tF @fF E^UVWUJ t UzuuYt u UB %= uUB|uVu d։UEEE}}%t GEu+UUt?UUVUUE}|EPuSYY dUU} GEEEEEEGEm}uE MUURU}]ME+GE=*u"UURU}EEEkE EG]U0 vۃ}}EEM AEkE U0‰UGE-0= vމUMMMUUBUEEQMUutUUB UUBEȅ}]E-EUUJRMЉURQ%YYt5uu55|}E-EpEuu%YYtElE}'~&}gt}GuUt U܃'UE' }uEUdPuuEPuuuup E}tE-U:EUtUURM UtEUURfMUutUU#J UUBEE*UURUEEXM@ExUURUuEP}|4ujuF t+EE9EU܉Uu7YEMUutUU#J UUBEEZE<E(UutUU#J UUBEEUt }tM@EU܉U|eߍdU}}#Uȃ0UUUUȅu؋UU:0U0 E10UUE1Eȃ} sѺ0UȉUUK#UUMPMZUUȅu! URYELEd+UU1}=UM EEUUU}tE U@tEU9U~EEEU0U+UU={FEE}|EPu YYdm}{UVUUE}|EPuYYnd}t3UۉFEE}|kEPuYY1MU@tKƅ0UFEE}|EPu Z0F}uUtF0}uUtF.uu55D}nEPuu55XYYm EUuujj Z0FMtuu55uuu55t)ujFPu EPuuE F0UIMu}tUu9u s Vր:0t>.uNFuuV, 0}uEU9UB}uOuu55t1uu55 }MmE}tW9U$vFMF0}uUt F.1uu55w$}EPuu5 5YY EUuujj Z0Fuu5(5$tMkuu505, tMEPuu5854 YY EUuujj@ Z0Fuu5@5<n tujFPu juuVE UtUIMt0F0t$9u s Vր:0t>.tF DE+U _^UVWu u5x5t t'EPu u55| YY E-0Pj EEu}uu55w ~9>.uN@9~E09u}t 1E.V1O#NNjU :-u>.uN>0u 9uU N_^U8VW}EG} } ] G-G+ UU} ~LE 0UUE E = ׋u0VֈU9s"FGG00U G_^UVWu VVV t~uVaYtQUʉM+V9~ VjYu1NUG9~tV t} u VM}}6u݃=LtLuY_^U$VW=kǣjYƉI!)ى}=tWY=u1%EE95wU9UwEE#UUUUtEU9UwUhօUѺU~W9~5}EU5EVY=tUxt>XuFǃE}u0u E}tE1uUE1uEEEyt0%yUtYWt7WZ)‰9}~=}|U9Uw 9Uu9}} EEUUU}F닃}}!}tEy" }t]} t}tFE] E_^=CC [ =;{SK k{uC [ SkC [=C[=31C CtrIAÃ=C s[ =CK [ ='C[U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP YYjEPEP> UVu EPEPI E}1} u@D1UfUE]9~;E@]9uUt}u}tjZYE]fUE-؉UUt1} u@t^UVW}EP Y}u fEu U UfEu WYE}1fE}ډE}teEPYjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UjEPEPG jEPEP5 EPEPYYjEPEP UjEPEP jEPEP EPEP]YYjEPEP UV}u} tu^UEUBUVuFFfFf^USE] ![]USE] ![]USE] ![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]D$D$D$UW}E MuG_]1_]U} |} ~y 5juYY|U 9UuE u {u juU} |} ~yM E 1U} |} ~yM ҋE!1UE1UE1U} |} ~yM Et1U(UUEEEEEEPjj E=u U{1UVW5{{}׃}~9r}}9vWqYu_^U$UUEEEEEEPjjX U$VuEEE V֋RU V֋RUUUU UEEEPjdj ^U$EEEEEEEPjj U$UUU UEEEEEPj%je U(UUUUU UEEEEPjj& E=uEU,VU @t=Uփ֋ruYE܋U UuUUEEU UuEPBYYEPjj ^U$UUUUU UEEEEPjjb U(VWu UJuFu1^UVU֋RUu>u Ft1^UVWU֋Rׁ}U  Zu u4)UUM] Z55UM UM} |9m V!׋MJ!׺#V! щN>MJ!׉UM] Zuuu ufYYXZ_^UUU VWuVFZEE8EE@#EE@y1)>+t >bu~+u EU UE _^U,VuV tVCVFF|F]SPcYY}EEVU؁1 u@EEU؁u%~(]u^ fF FLF fF uYEu^ fF 5LiF fF UVUV}tFPYtF fF ^UUB % 1=uCt u/Y1UV=PuuFV t V uYV u y V t)VYuF %fF FFF fF 2~0t,V@9V0t v0 YF0VT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPPYY_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^U}u} tEjEPEP# jEPEP EPEPYYjEPEP UVWu} W WV Vu$WV襷t1fWVYY9t9GPFPYYFP YNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVt1f#V9Wv VVV+WVV+WVVY_^U`E]]PTXa]UVW}u M9r&r uuHfA=r, u"ut|tN|Of t|E_^]U$EPuYY}1Uu hT$uE U$UUU UEEEEEPjj赶 U$UUU UUUEEEEPjhjv Uu UBUM JUju R5É{uv`=}aaaUVWM'E_^]++T+xxxx Rxx8 bH\x No regs available+%ld%ld""""R".R"#2#e###$X$O%b%%%%%% &&/&B&v&&&&'#'2'A'Q'a'r'R"'''-((S#%4%E(V(&&'$((standard-inputBad format %sCan't open %sr.sect .text; .sect .rom; .sect .data; .sect .bss %s,-1-,,,,,,8. .8.8.--8.8.8.8.8.-unknown instruction byte..3...3 9//3233/ 3N30e3/No table entry for %d%s: .extern %s .extern %s too many parametersBad type in register messagemes 3 not allowed heremes 3 not allowed heretoo many parameterstoo many parametersbad pointer sizebad word sizehol%dUnknown opcode %dNo table entry for %dbad argument type %dunexpected EOF86 L555555586555 6 6 6string/identifier too long59_8_888885959885959595959!9%ld_%s%ldI_%dI%x_%dbad BSS initializer.comm %s,%ld bad BSS size: 99":":":I:::":9b::::.data4 %s .data4 %s %s %s = %s %s: %s: .data4 %ld %ld+hol%d .data4 %ld bad icon/ucon size,0%o.data1 0%oWarning: overflow in floating point constant %s !float %s sz %d bad fcon sizefloat constant size = %d push ebp mov ebp,esp mov edi,%ld(ebp) mov esi,%ld(ebp) push edi push esi push esi push edi sub esp,%ld esileave ret pop esi pop edi pop edi pop esi Unknown flag %s-gdbtEMEtEtECtEtEtECD.extern %s %d .symd "%s", 0x%x,call ___u_LiB %s, 0x%x, %d .symb "%s", .symb "", .define %s .sect .bss.sect .rom.sect .data.sect .textCan't create %swWrite error on output%s%c%ld0%ld%ld%ldII8JJ%ld%s: incorrect value for fallthroughLpKwLBombed out of codegenUsage: %s [ EMfile ] [ asfile ]R RRRRRRRRRRRRROut of memoryString table overflow__2```9a``bbJbfbxbcbb}dddd?ese\eYe Error: Fatal: espebpediesiedxecxebxeaxdxcxbxaxcldhdlchbhblahal.Xtrp.strhp.trppc.rck.mon.reghphol0.ignmaskhol0+4.gto.exg.dup.csb4.csa4.blm.unknownjnsjssetnssetnesetesets.cmf8.cmf4.cms2:1f2f.ilar.lar4.isar.sar4.iaar.set.inn.com.xor.ior.and.cff8.cff4.cfu.cfi.cuf8.cuf4.cif8.cif4.cii-.fef8.fef4.fif8.fif4.ngf8.ngf4.dvf8.dvf4.mlf8.mlf4.sbf8.sbf4.adf8.adf4.sts.sti.los.loi1:1b! kill cc! killo16 xorxorbxorxchgo16 testtestbtestsubshrshlsbbsarsalrorrolretrcrrclpushpopornotnegmulmovzxmovzxbmovsxmovsxbo16 movmovbmovloopleaveleasetgsetlecalljmpjnejlejljgejgjejcxzjbejbjaejaincimulidivdivdeco16 cmpcmpbcmpcdqandsyntax erroraddadc(*)()(*)()(ebp)()8$Id: table,v 1.18 1995/09/12 12:09:08 ceriel Exp $o+ooop+pppƐ=] Xmy Q'8lZc+hAbug in vfprintf: bad base0123456789abcdef0123456789ABCDEF(null)0123456789abcdefNaNInf$@{Gz?$@$@$@$@-C6?$@$@EcGecf@g$@@iQiQiQ^^^^a͵rw$Id: codegen.c,v 0.36 1994/06/24 13:27:01 ceriel Exp $$Id: compute.c,v 0.16 1994/06/24 13:27:05 ceriel Exp $$Id: equiv.c,v 0.6 1994/06/24 13:27:11 ceriel Exp $$Id: fillem.c,v 0.19 1994/06/24 13:27:20 ceriel Exp $$Id: mach.c,v 1.11 1995/03/17 12:37:06 ceriel Exp $$Id: mach.h,v 1.5 1994/06/24 13:02:12 ceriel Exp $($Id: gencode.c,v 0.16 1994/06/24 13:27:25 ceriel Exp $$Id: glosym.c,v 0.4 1994/06/24 13:27:28 ceriel Exp $$Id: main.c,v 0.8 1994/06/24 13:27:36 ceriel Exp $$Id: move.c,v 0.6 1994/06/24 13:27:40 ceriel Exp $$Id: nextem.c,v 0.9 1994/06/24 13:27:43 ceriel Exp $$Id: reg.c,v 0.11 1994/06/24 13:27:53 ceriel Exp $$Id: regvar.c,v 0.6 1994/06/24 13:27:56 ceriel Exp $$Id: salloc.c,v 0.5 1994/06/24 13:28:05 ceriel Exp $$Id: state.c,v 0.3 1994/06/24 13:28:10 ceriel Exp $$Id: subr.c,v 0.19 1994/06/24 13:28:18 ceriel Exp $$Id: var.c,v 0.3 1994/06/24 13:28:27 ceriel Exp $S'S' S'S$ S$S( S) S(S)S(SC SD SE S'S(S)S?S S@SSAS! 33 !33 ! S, 33 ! 33S, SB  !S- 33 !33S- SB  !.S 33  !/33 ! 33 !33S$ SB  ! ',! ' ,!.S  , !  ,! ,!  ,!+, ! ',! S, ,!',!S- ,32 ,, ME z,M*q M*e  ,,M*n M*c  ,,' ,mA qIM*h "0,"1,","2,"/,!,,,-,,' ,' ' IS' 3&! ,,"' ,#'  ,#' ' IS' 3&! ,#-H!,$"0,%"1,&",'"2,("/,)!,*"0,+"1,,",-"2,."/,/!,0"0,1"1,2",3"2,4"/,5!L60"0L71"1L82"L93"/L:5"2L;4!3S'< 3!= A433!> L?L@"LA"0LB"1LC!LD"2LE"/LF,!   "  32 ! $M  32!   32!   32! '  3F  ' 323F  A   #32 A   #32G A0   #032 A1   #132 A/ $Q  #/$QR32 R A2   #232 A  0 #320 A  3 #323 A0  1 #0321 A1  2 #1322 A/ $U 5 #/$UV325 V A2  4 #2324 A * A - A0 + A1 , A2 . A/$Y H A $ A ' A0 % A1 & A2 ( A/$] I -d!3S'< 3!J A433!K A LMq q?Mq q?A LMn n@Mn n@a   LD #3232D a   LM #32G32N a0   LO #03232O a1   LP #13232P a/ $f  LF #/$fRg32 R32F g a2   LQ #23232Q B+5,RB5+,SA6 S  +,A 6S  ,B 'S  ,A 6S> ,B6 S> +3/ +,A 6S ,)A6 S +,)A s ,&A s ,&A7  3  ,.A7  3  ,T.!63/ +,A+6S9 ,A86S9U ,A86S:U ,A+6S: ,- -6-5MI4MF4MA4-)-(MI'MF'MA'-` -) -( MI 'MF 'MA '-6 -5 MI 4MF 4MA 4-Q ',EFn',EIq',EFn',EIqA7' 3  ,+A7' 3  ,T+-j ME jA86S=U ,A+6S= ,MMMMMMMM--mJ-mJ-mJ-mJ-".,V"9,W"0,X"1,Y"2,Z"/,[!63 +,!63F +,\"5,]".,V"9,W"0,X"1,Y"2,Z"/,[!63 +,!63F +,\"5,]".,V"9,W"0,X"1,Y"2,Z"/,[!63F +,\"5,]!6S  +,MqMnMhmIomFoB+9,^B+.,_B+0,`B+1,aB29,bB2.,cB20,dB21,eB,fB,gB/,hB/,iA .S j ij,A. S k "k,B.+,lB9+,mB0+,nB1+,oB.2,pB92,qB02,rB12,sB.S kj "k,tB52,uB25,vB 2' ,wB2 ' ,xA 6S  ,A6 S  +,B+.,yB+9,zB+0,{B+1,|B+/,}A .S>j ij,~A 6S> ,A:S> ,!63 +,3 $M3 3!63 +,3 $M3 3 $M  -} ,Ll < I333&! !4 S:< I333&!  ! S  ! S A ; S  ! $MS  ! ' S3F  3' 33F  ! S ! S 3' S ,' 33F  ! ' S3F  '  S' S 3F ,' 33F  ! ' S3F  '  S' S 3F ,' 33F  ! ' S3F  ' 33F  ! ' S3F  ' 33F  ! ' S3F  S $MS SS3/ $M3/ I HqI qmS* ,mI qm',mI qmS+ ,mI qm',mImqm',mImqmqI q' ,mImqm',-6 ',-) -6 -) EI q30 $M30 ' ,mAmhm',mAm4hm',mAm'hmmA 4h mA 'h EA h' ,I GIo',I G4Io',I G'Io',I GmI o',I G4I o',I G'I oEI GImo' 3,' 3,' 3,' 3,' 3,' 3,' S ,' S ,' S ,3/',mF n ',-5 ',-( -5 -( EF n30EF GF oEF HF pA G4A oA G'A oEA GA oA H4A pA H'A pEA HA pa4<73!,L-%-%!&3 !&3 mEm|mEmmEm|mEm!:S* +," S* ,!:S+ +,"S+ ,mE E%mE E%mE,ME/mE0ME1E E24E E54M7!&3333 -8A6 S  +,A 6S  ,!&,66 S L +S  L 66S L 0 S ,-)A6S>3 S ,-)A/6S>5 S ,-)A26S>4 S ,-)m9 HFm9 pF3!,A373! 3!A373! 3!A 'S 333 3 I3 s,A 'S 333 3 I3 s,-A6 S> +,A 6S> , 66S>L L +S; S1 ,S'< 3!,<!43!,<3!M@3!M@A 'S 333 3 I3 s,A 'S 333 3 I3 s,! '3 v,! 'G3" v,! 'G3# v,A 63S1 I,a 6S 3S1L <I,LA 'S 33 I,A 'S 33 I,A S 3 A S 3  S L3S 3  S L3S 3  S L3S 3I  S L3S 3I A S?3 B S?3 ! S@ 3 !&S@ 3 "5S? 3 ! S 3 ! S  3 ! S 3 ! S  3 ,!7,!73 3 A S 3 A S 3 ! 3 ! G3 ! G3 !=3 !=3 3!! 3! 32 S  ,LT!7 A7< "  32  B  32 32  , S ! S   A S 3S   -S'< 3!!4S:< 3! A>4S 3S:< 3!  A373 a?37S 33  A373 a?37S 33  !L!@LA S'< 3!!43! A>4S 33!  ALLS'< 3!!43! S' 3 S'S' ,S' 3, S' ,S' ,!73! A373!,a?37S 33!, -X!6SB +,! S' ! S'  ! S' 3!!73!  ""DD  @" D% */"4D9 >CHJLN                $$ $!$" ' '( ( $" %!$!#!"!" !  - / / -H  "%7$7#7""7JK  7:!&7'7"?<!*G- J ?KL!#J*FOP(*J";ST(""-WXS"""/[\SLM(7N78!9! dKe(F)7"i.kmln mlp- rsktntp m-wxyk m{x|kxkrwk{kk  m  NOPQRSTUVWXYZ[ZZZ"""#j%j$j#i%i$i#\ZZZi"    (I'-5Ixx"wkII-rkI{kk{kwkwkI{k--//I n  Im-   mrx]mm .!m#$%&0'.05^5-_`ab 3c6de 9:!!fghi,j- kF-GIHJ IHLIF/OPJPLFSTJTLFWXJXLJ I]IF_.0 Zabcdk""g#"g" Flmnopqrtuv5k  xyz-|.~}}~ |+ } ~$  | x t p l h d \ T L H @ 8 4 , $    | p l h ` X P H @ 8 0 (    | t l d \ T L D < 4 0 , (    x p h ` \ X T P L H D @ < 8 4 0 , ( $     @B I($(($)$($B IC I@@9$ ($B I@@@@  jm`($($        !"#$&"#'"()*+!   1134 1+"#$%"#$"#" "/+"#$%"#$"#" "-+"#$%"#$"#""+7"#$8"#9":;<=>?@"A"#$B"#C+DEF"N Z Z^_"`"a"#$b"#ch Z +j "( "( "#$&"#')* +! +! i i ii i i ii i+- "-# +-j -Z " " "#$"# " " "#$"# " +i " i " i i ii i-mm>?@ACDEF +Dj+Di +Df+g"hijlmnopqrstu /    !"$& .&3" ;+@+!I+"R [, `-emt!{"   ./ # 9 D. O \i v+   2,3p333<4445L555256\6666\666646\66\666(7l7776\666666\666(7l77(7l7STT$T,T@TTT\ThTpTTTTTT@U<aE <IqIe?KXI*qKF nFc=DuF*qlAYACA*qhAVG#(- :295L8O,<O.?O0BO2HN,bN.eN0kN2t&H0/H.ĂBH5΂ӂ؂݂UH6 E HK5"?/=3(>7=CIOUM[JI:pH^qI_hqDq}nhIho Ճ߃'4FPp5 [epz΄*p. =p0",6@JTFp6ape s5wecd ȅօ-FT5bhn|`5Q5І-5Y5+U5Gj5Sal5o}A EIqoAEFnqA+EIlA7EFlAYEAlACEIquANEFnvAEItA~EFtAEAtbMyIEbqzBFEbn}MIEb~BFEb~EAEb~MIEbqBFEbnMIEbBFEbE AEbRB FEFnMIEIqBFEFnMfIEIq,.5; Z5Tkm Ekqm5w^56p_5_6P5 P6,5,6T5T6151605 06.  (2s 7EAGUAoG/EAG AoG0EAG'AoGEAG4AoGRE3AGAo E%AGAo EAGAo EAGAo EAG8Ao1EAG{AoCiEAHUAp/EAH Ap0E0AH'ApEAH4ApE@ AHApEAHAp{EAHApP EAHApP EAHApP EvAHApP E1AH8ApP1EAH{ApPCMIE`q>M"IEbq>MOIEjq9M^IEkq9MmIElq:M|IEmq=MIE`q>MIEbq>M@IEq MIEq MIEjq9MIEkq9MIElq:MIEmq=B FE`n>BFEbn>B'FEn B6FEn BEFEjn9BTFEkn9BcFEln:BrFEmn=EAE`h>E}AEbh>EAEh EAEh EAEjh9EAEkh9EAElh:EAEmh=LIUqLIUqKI*qHqKI*qHEEKI*qHKI*qHEEKI*qH&KI*qH4 qAK\I*qKdI6XI)aI,IqjI8IqnIIqrKPI q|KI qCA*hCqA*4hCA*'hAAhAAhAAhMIGIGIo MIGIG4Io MIGIG'Io MIG*IoMIG*4Io#MIG*'Io5MIGIoGM!IG*Io VB?FG*FomB]FH*FpMNIG*IoBlFG*FoBFH*FpM{IG*IoBUFG*FoBFH*Fp CFUn"D=F*n*F57F(@FFnIFFnMFFnQDF n[BFGFoaB<FHFpoE AGAo}E.AGAoEAGAoEJAHApEXAHApEAHAp$%AEE|.AEE.AEEE|"AEEE" AEEE|(AEEE(AEE)*5AEE*EPAEE`AEE$hAEE%pA'EE+qA=EE.zA?EE#+AEE#.AEEAEEAmEE6AEE.5ÑE;6(855C86Qi88{5{6{{  5 6 * :[5GU\5cqT75E7B^77FE7|F!E7f5ff&9K49M89Q?9RG9UR9VZ9Ye9[n9\z9^CEjHeC+EjpeŔϔCWEjeb5 %@[9;kv9^ku^5^;5;5ŕ55!/6=`}56Ixwtxyyuzw)vC]|x8.w8.t8.y8.u8.v8.xx8wyw8wyt8wy#y8wyu8wy|v8wyx5w5t5y5u5v5xwtyuvt5y5ӗ|~|556|6=^4|5B5EE|{-EE{-E zP^EzP#DE|{oDE{o7BO}Xeo    {~||@@qs@5@6X, X5$X6+5376EJ]b 5o ,5!5!"5"**54:3*6@*IE+5Y+fX/5a/6k//32BCDJ,J.J0SV W5W]8g<iHr,Qr.[r0hzrURyU hNGgUL o x <%Omt>2@ pygjch ; ^y1 .(3gdcnXI7J&Ox %  5 C1(:   ti~  D UJ0L ' W0 s7 < < +776   90   `````|````  @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%SSSS ((((( AAAAAABBBBBB |zԇ]{ԇ] p{ԇ]zz 0000000000000000ԣYQdQ1$T$Lsu;SSSSu QRPP  )/@  E  KP "*09AGMRXbegtextbegrombegdatabegbsscrtso___main__penviron__fpu_present__penvp__edata_exit_environendtext_main.text.rom.data.bss,__.SYMDEF:`$ nnnn&n.n4n;@H_edata__etextendtextendrom__edataenddata__endendbss_end_etextedata.o:_PPP_edata.text.rom.dataem_end.o:`W Oxxxxx'/5<BGMR__etextendtextendrom__edataenddata__endendbss.text.rom.data.bss.endend.o:` xxxxx_end.text.rom.data.bss.endetext.o:`M (@G_etext.text,__.SYMDEF ;$2'HN'( n)~,&-."/4|0:1@2I4QL5Z*7a28hZ9rz:w&<&<DDDDjFjFjFjF,a~bTe^fhgRh \i)Hj2Rk;>lD*mM4nV>o_*pi6qo$rusuwww|}           $j+18CHUbjLsX|f:HVTT`r"  '2?NKLWbn}xxx|"    * 9KXer 00!5>JnUn^nknvnnnV!V!8) / / / / /77bVD_J:fQtkW6m\tbviwoyvz|F}:P(\ܜܜڤL^^$Z'2>JYfv  pL !+5?IDQDYDaDiDq z888888: : : : X L    # * 3 : 6 C f!M f!X f!f f!v f! f! * . . 0 0 5 P8 9 9 T W X Y *[ 4] J^ J^ J^ J^# J^, J^3 J^: |hC kL kV m^ ng 0po Dq} .r s t t 0v rw x y { v| } ~ J z    $ , 3 ? G (P vZ d m ̛y   О    8 R   ( 8     ̱ 8 F r$ Ҷ+ 5 > pJ |R [ ξd ޿m y @ j         * F D  ! + 4 > J X d k s { : v  L   ( H H  n n n n 8 @ @  !\'J/:7:BLIhRYal~x #$%D'(,-V/b0123N45,7`8:<,= >L@PA#^B*C2D;FDFNHVjI_Kg>NolOyzPQRRTUZVVlWWXYY@ZZP[ [b\\%x],^1^7 _>_F`N`U.a]aeBblbrPc}chdd~e ff$gg:hhPiibjjnkk~lm mnn (o)o3Bp:p@PqHqN`rWr_vsgtrtyuu*vv>wwXxxxy zz2{{X| |z}~$~+39 BJ6S^Rkvv| 0BʈLLJJ ؋JJ$,4j<D`KS\xdhlDz”V PP *48>*H0NTUZ\`cXkds{TNN||_abort_abs_asctime___bad_assertion_atexit_atof_atoi_atol_bsearch_calloc___ctype_clock_ctime_difftime_div__sys_errlist__sys_nerr___funccnt__clean_exit___functab__str_ext_cvt__ext_str_cvt__dbl_ext_cvt__ext_dbl_cvt_getenv_gmtime_isalnum_isalpha_isascii_iscntrl_isdigit_isgraph_islower_isprint_ispunct_isspace_isupper_isxdigit_labs_ldiv_localeconv_localtime_malloc_realloc_free_mblen_mbstowcs_mbtowc__timezone__dst_off__daylight__tzname_tzname__days__months__ytab__tzset__dstget_mktime_qsort_raise_rand_srand_setlocale__lc___newsigset___oldsigset_signal_strcoll_strcspn_strerror_strftime_strpbrk_strspn_strstr_strtok_strtol_strtoul_strxfrm_system_tolower_toupper_tzset_wcstombs_wctomb__fp_hook__f_print_strtod_dhcp_gettag_dhcp_init_dhcp_settag_ether_line_ether_aton_ether_e2a_ether_ntoa_ether_hostton_ether_ntohost_getdomainname_gethostbyname_gethostbyaddr__sethostent__endhostent__gethostent_gethostname_getnetbyaddr_getnetbyname_setnetent_endnetent_getnetent__net_stayopen_getprotobynumber_setprotoent_endprotoent_getprotoent__proto_stayopen_setservent_endservent_getservent__serv_stayopen_getservbyname_getservbyport__tmp__tmp_l_inet_addr_inet_aton_inet_network_inet_ntoa_memcspn_rcmd__check_rhosts_file_ruserok__validuser_dn_expand_dn_comp_dn_skipname__getshort__getlong___putshort___putlong_res_init__res_res_mkquery_res_query_res_search_res_querydomain___hostalias_h_errno_res_send__res_close_servxcheck_servxfile_strcasecmp_strncasecmp_asin_acos_atan_atan2_ceil_exp_fabs_floor_fmod_frexp___huge_val___IsNan_ldexp_log_log10_modf_pow_sin_cos_sinh_cosh_sqrt_tan_tanh__brk__sbrk__reboot__seekdir__svrctl_asyn_init_asyn_read_asyn_write_asyn_ioctl_asyn_wait_asyn_synch_asyn_close_config_delete_config_read_config_renewed_config_length_crypt_ctermid_cuserid_environ_errno_fdopen_ffs_bitmapsize_conv2_conv4_conv_inode_old_icopy_new_icopy_fsversion_endgrent_setgrent_setgrfile_getgrent_getgrgid_getgrnam_getlogin_opterr_optind_getopt_optarg_optopt_getpass_endpwent_setpwent_setpwfile_getpwent_getpwuid_getpwnam_endttyent_setttyent_getttyent_getttynam_getw_hypot_cabs_itoa__loadname_syserr_lock_unlock_seed_lrand_lsearch_lfind_memccpy_etc_mtab_load_mtab_rewrite_mtab_get_mtab_entry_put_mtab_entry_err_nlist_peek_poke_popen_pclose_putenv_putw_regcomp_regexec_regsub_std_err_swab__syscall_sysconf_telldir_capab_tgetent_tgetnum_tgetflag_tgetstr_tgoto_tputs_ttyname_ttyslot_fttyslot___exit__access__alarm__cfgetispeed__cfgetospeed__cfsetispeed__cfsetospeed__chdir__chmod__chown__chroot__close__closedir__creat__dup__dup2__execl__execle__execlp__execv__execve__execvp__fcntl__fork__fpathconf__fstat__getcwd__getegid__geteuid__getgid__getgroups__getpgrp__getpid__getppid__getuid__ioctl__isatty__kill__link__lseek__mkdir__mkfifo__mknod__mktemp__mount__open__opendir__pathconf__pause__pipe__ptrace__read__readdir__rename__rewinddir__rmdir__setgid__setsid__setuid__sigaction__sigpending__sigprocmask__sigjmp__sigreturn__sigaddset__sigdelset__sigemptyset__sigfillset__sigismember_siglongjmp__sigsuspend__sleep__stat__stime__sync__tcdrain__tcflow__tcflush__tcgetattr__tcsendbreak__tcsetattr__time__times__umask__umount__uname__unlink__utime13456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     __wait__waitpid__write___setjmp_longjmp_clearerr___stdin___stdout___stderr___iotab__doprnt__doscan__ecvt__fcvt_fclose_feof_ferror_fflush___cleanup_fgetc_fgetpos_fgets_fileno___fillbuf___flushbuf_fopen_fprintf_fputc_fputs_fread_freopen_fscanf_fseek_fsetpos_ftell_fwrite_getc_getchar_gets__i_compute_perror_printf_putc_putchar_puts_remove_rewind_scanf_setbuf_setvbuf_sprintf_snprintf_sscanf_tmpfile_tmpnam_ungetc_vfprintf_vprintf_vscanf_vsnprintf_vsprintf_vsscanf__exit_access_alarm_brk_cfgetispeed_cfgetospeed_cfsetispeed_cfsetospeed_chdir_chmod_chown_chroot_close_closedir_creat_dup_dup2_execl_execle_execlp_execv_execve_execvp_fcntl_fork_fpathconf_fstat_getcwd_getegid_geteuid_getgid_getgroups_getpgrp_getpid_getppid_getuid_ioctl_isatty_kill_link_lseek_mkdir_mkfifo_mknod_mktemp_mount_open_opendir_pathconf_pause_pipe_ptrace_read_readdir_reboot_rename_rewinddir_rmdir_sbrk_seekdir_setgid_setsid_setuid_sigaction_sigaddset_sigdelset_sigemptyset_sigfillset_sigismember_sigpending_sigprocmask_sigreturn_sigsuspend_sleep_stat_stime_svrctl_sync_tcdrain_tcflow_tcflush_tcgetattr_tcsendbreak_tcsetattr_time_times_umask_umount_uname_unlink_utime_wait_waitpid_write_add64_add64u_add64ul_cmp64_cmp64u_cmp64ul_cv64u_cv64ul_cvu64_cvul64_diff64_div64u_rem64u_ex64lo_ex64hi_make64_mul64u_sub64_sub64u_sub64ul_alloca_get_bp_getprocessor_inb_inw_outb_outw_rep_inb_rep_inw_rep_outb_rep_outw_intr_disable_intr_enable_oneC_sum___sigreturn__send__receive__sendrec__brksize__memmove__memcpy__strncat__strncmp__strncpy__strnlen_bcmp_bcopy_bzero_index_memchr_memcmp_memcpy_memmove_memset_rindex_strcat_strchr_strcmp_strcpy_strlen_strncat_strncmp_strncpy_strnlen_strrchrabort.o: ,dU=tjY  _abort__clean_raise.text.rom.data.bssabs.o: d|||UVuxډ^ø_abs.text.rom.data.bssasctime.o:  TmdmUVu E 0}u>0u F E 0FF^UVWu} '׹0F׹d0F׹ 0F0FF_^U VWhV;YYUR<EMxGFFUR<EMxGFFEUM]j0jrjqjs V P P P ƋUlJQVYY_^??? ??? ?? ??:??:?? ????    e@_two_digits_four_digits_asctimeI_1__days__months_strcpy.text.rom.data.bssassert.o: 4?d}}}UhuYY   $)/___bad_assertion_fputs_abort___stderr.text.rom.data.bssatexit.o: <040d0U= |A M 1(&,17_atexit___funccnt___functab.text.rom.data.bssatof.o:@/5/d/U UjuYYEUUU &  *05;_atof_strtod_errno__fp_hook.text.rom.data.bssatoi.o:$d{{{UVuj jV ^  _atoi_strtol.text.rom.data.bssatol.o:Fm%mdmUVWu1EtF>+uF >-uEF-0= sk F-0߃}tډ_^!'06;A_atol___ctype.text.rom.data.bssbsearch.o:SSdSUVW}t>UM VuUYYEu}xUU J1_^ _bsearch.text.rom.data.bsscalloc.o:E&EdEU VWUU URYDžu1u9v _^  _calloc_malloc.text.rom.data.bsschartab.o:dddh ((((( AAAAAABBBBBB ___ctype.text.rom.data.bssclock.o:%dyyyUEPYE  _clock__times.text.rom.data.bssctime.o:1dyyyUuYPY   _ctime_asctime_localtime.text.rom.data.bssdifftime.o:0dyyyUU+U RjXZ  _difftime__fp_hook.cif8.text.rom.data.bssdiv.o: d UVWu }=u1ۅÉuEUF=u-11ۅ9t@E@)؉EEUUM] ZE_^-Irw|_tmp_div.text.rom.data.bsserrlist.o:Cx8dXdX  No such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerError 0Unknown errorPD(p`L@( xhX@0xdP8|dP8(C $(,048<@DHLPTX\`dhlptx| HQ_jpu{_unknown__sys_errlist__sys_nerr.text.rom.data.bssexit.o: CI;d;UV5Nx ^U=tuY#, 4GRZbhsz___funccnt__clean__calls_exit___functab__exit.text.rom.data.bssext_comp.o:Y&hLdhhLUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWVW Wuu Vfu EPPWVD}F_)ۉ]y!]FEfFuFPYY"}~GEfGuGPYY9nV9Ww 9Wu{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]S@PW kE WPEP .kE ]SPW kE WPPEP _^U(VW}EEE} tUE UtEffG1҉WWU fE .EEƉ0 r.UAM.tEUWOUMjGPbYYjEPUYYEPGPYYE0UEPGPYYE}VMN},} t UE Et eEEE EEU UƉ0 SkE 0‰UUUU؁/ }}EEUƉ0 r} tUE UUU}t iE/Eut "ut5fG?GujGPYYGHfGuW YY_^U Vu ,] E@fE^fFVEPVR ^UDVW}E E} yE } ~E E  E EtEfEc\VWYYx -P E=|׃-P Ek] WÐSW' kE] PsVW?YYx - E]hWYYVWYYy - Ek] WPSW Ek]+ۋEW4YE@VWYYy -@ Ek] WSW5 E+UEEE}uEUUvEfEfEEEU9UU+U~EG}EfEfEEEkE PEPwEPWYYx1EPEPUkE ]SPEP E뿺0UMEfEWEPWl M+fEEPEPh? fEGZEfWfUfEG-؉WUЃ0MEG-؉UUWEPW U0EWEPYYEPWYY~+tG=|U@GFEPYWY0U0E"} fUUU=9?0} vMu@ՋU1E}uā} vU0E밋U _^UVuEPu ul EU RP5450P1ۅftu u1EE UJfF5<58u uYYZYUM QRjj Fu uvjYYEE 5D5@u uYYZYUM QRjj F^U VuEf~u~u5L5Huh5T5P VhqYYy.EU"FF-?Pvj5\5XYYvjYY EU}tuuEEuu5d5`u~u~t "uuXZ^++AAA @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H% {    a$$$4$H"" """"$"(",# # q  % %E %N $ $ $ $ $ $ $ $ $4 $P $f $ $ $ % % $v   $ $ % %3 %[ %s  # #   # #      !%#3#9 D Y##%%##%  ##     7#I#O Tm\eWn8wjP@] { f %,8>DJPV[`ent{_mul_ext_add_ext_cmp_ext_b64_sft_b64_add_ten_powers_big_ten_powers_r_ten_powers_r_big_ten_powers_add_exponent__str_ext_cvt_ten_mult__ext_str_cvt__dbl_ext_cvt__ext_dbl_cvt_max_dI_3.loi_ldexp___huge_val.ngf8.cmf8.mlf8.adf8.csa4.sti.cfu.blm___ctype.cuf8_errno__fp_hook_frexp.sbf8.text.rom.data.bssgetenv.o:8[)[d[UVWUt}u16EEׅt%u>tG9uF>uր?=uэG1_^ "(-3_getenv__penviron.text.rom.data.bssgmtime.o:)d''$'UVWEUEQE1UE1ǹ<E1E1<1FE1FG1VEu%dEuEunm9wGEWu%dEuEunmZ)‰E|UlV~FEhu%dEuEu1k0Z‹N9}t Eu6uYtE1_^UVWUUuu Y} uuY1U UURU+UUE=<9}r79}u+UOJ}t EURU}?뼋Uu9ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^. 6  DSco  ^ |{ $)/_grow_malloc_realloc_free__bottom__top__empty__sbrk_memcpy_errno__brk.text.rom.data.bssmblen.o:#&&d&U}u1} u1 U 1_mblen.text.rom.data.bssmbstowcs.o:#7 7d7UVW} uNxGUEЄuU)U)_^_mbstowcs.text.rom.data.bssmbtowc.o:$33d3UVu u1!}u1}tU 1^_mbtowc.text.rom.data.bssmisc.o:&G!~ d   h UVWu 1>:u1G>t1-0= r">,t>-t>+t } U EFGʃ}1U_^U VW} 1}}tU1E}tUUE=0|=9G-0k 9}u1x|1i]?:G1=0|=9G-0k 9}u1|x<|1lk<]?:uDG1=0|=9G-0k 9}u1-x<|1 E0}tUM EUJ_^U(VWu }EEhEP->M>Ju FGEJEZu=0|#=9-0k] É]FG9uu1E1=JuC9]| }m~1UMۈ UMJEMFGuE=0|#=9-0k] É]FG9uu1JUM9L9L}14UM]E}}>.t}t1 UMۈ _^UVWu }h4VW ƅu1WWYZ׀>/u5Fuh4VEP ƅu19ut EEG>,t1jFhHVW ƅu1MWW\YZ׀>/u0FuhHVEP ƅu1EEGu>t1_^UVWuE}>:tVhxYY_$(4UD HUX VY=VhxYYVhwYYƅ>-uF>+uFjVEP ƅUUj h5$ 1 VhYYƅpj h5( >t>,tjVEP ƅt5U>t'>,u"FVY=xwVhYYƅu_^UheYPLY$,(0UVWu }V+V¤ЙU:|ClVЙu-lVdЙulVЙuG9}~E+UЙ)ډ_^UVW}U lJșu9U lJdșuU lJșu1E?Mt'w?Ju}t :}1Z)‰1EU9W~kE0J4EU M R+Q¤ЙЙUuW +UЙOIkkE0UM 9_^UVWuE4HE= u V = u1U:UtVuYYE VjYYYE?UtVWxYYEVhYYEU9U}U9V~(U9V} EU9VU9V}E}`U9Vt U9VLU9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E}t F 1_^SaturdayFridayThursdayWednesdayTuesdayMondaySundayDecemberNovemberOctoberSeptemberAugustJulyJuneMayAprilMarchFebruaryJanuaryTZGMTGDT U U <4,  xpd\PD $(,0\`dhlptx|  0D   -6?FPW a s x      # ( 1Z k y Got  $,4H\xa)4?HP]Ofaotxy_ntstr_dststr__timezone__dst_off__daylight__tzname_tzname_dststart_dstend__days__months__ytab_parseZoneName_parseTime_parseDate_parseRule_parseTZ__tzset_last_sunday_date_of__dstgetI_22I_21_strlen.blm_strncpy_strcmp_getenv_strcpy.text.rom.data.bssmktime.o:(  KdU VWu<Fyt)h(VYYt1!>t$1 E^<,,,,,,CCC    6A I0_setlocale__lc.csa4_strcmp.text.rom.data.bsssigmisc.o:+ QR=d=U 1Uujj Ujuj     4Ygt)___testsigset___newsigset___oldsigset__sigprocmask.csa4.text.rom.data.bsssignal.o:,}b?bdbUVu~  u6EPYEU UEPEPV yE^ . J>FR`gmrx_signal__sigaction__sigemptyset_errno.text.rom.data.bssstrcoll.o:,22d2UVWu }F9u Gu1 N)ۉ_^_strcoll.text.rom.data.bssstrcspn.o:-55d5UVW}?tu 9t>tF>uGމ+U_^_strcspn.text.rom.data.bssstrerror.o:-=49$d$UVux95^unknown error '-28_strerror__sys_errlist__sys_nerr.text.rom.data.bssstrftime.o:/a$ WdjZZUVu y$U:t} tEEU EM NԋE^UVWu} E1UE1EO y&}t Wu} tU J1PVƃ} t 0UF_^U VWu} }u1A:uU:tU:t:%t E FOU:EuURj4WVƉ+U)ډ뉋URj4WVƉ+U)ډ^URj4WVƉ+U)ډ3URj4WVTƉ+U)ډuhWVEt +U1uUjr WV9Ɖ+U)ډUjrWVƉ+U)ډU J șBjRWVƉ+U)ډ[URBjRWVƉ+U)ډ5URBjRWVƉ+U)ډUjrWVpƉ+U)ډUjz }PWVƉ+U)ډEj0WVƉ+U)ډUJ+JșjPWVƉ+U)ډ]UjrWVƉ+U)ډ9UJZjQؙY)ѻșPWVtƉ+U)ډuhWVEt +U1uuhWVEt +U1uUdBjRWVƉ+U)ډbUlJjQWVƉ+U)ډ8U1z j4WVSƉ+U)ډ%FOU:EEEt +U1_^%A@BHI9MSU5WX YgZabkcdjnmpwlxy:%H:%M:%S%a %b %d %YPMAM%a %b %d %H:%M:%S %Y $,4<DLT\dlt| #Kv        9$*29BKQV\_s_prnt_u_prnt_strftime.csb4__tzset__days__months__tzname.text.rom.data.bssstrpbrk.o:/44d4UVW}?t!u >t 9tF>tG1_^_strpbrk.text.rom.data.bssstrspn.o:055d5UVW}?tu >t 9tF>tGމ+U_^_strspn.text.rom.data.bssstrstr.o:0CL/LdLUVWu} WYEu(9uuWV t Fu1_^  0$-38>_strstr_strlen_strncmp.text.rom.data.bssstrtok.o:1f3fdfUVW}u=u1EWu WYYZЉE8u1 u uYYƅtF5E_^ #6 I[RZ^fouz_strtokI_1_strspn_strpbrk.text.rom.data.bssstrtol.o:2 Dd222UVujuu V!^UVujuu V^UVWuEEEu} tE 0tFǃ-t+u -uEFu}u,>0uF>xt>Xu EF)E E }u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} t9uu UE E 0}u'}t!}y }w}~ }vE}t+"}t}y UU_^i6_strtol_strtoul_string2long___ctype_errno.text.rom.data.bssstrxfrm.o:299d9UVW}u >t}v MFGF}tG+U _^_strxfrm.text.rom.data.bsssystem.o:3 Yd$<LU VW}Eyt 1}uE VYFu=2hh jYEPYE9Et}u}uEu}u EEE_^-csh/bin/shcd .    > K QW ^ c h r |<FNU\gov_exec_tab_system__fork__exit__penviron__close__wait__execve.text.rom.data.bsstolower.o:3dUUAs UEý_tolower.text.rom.data.bsstoupper.o:4dUUas U Eý_toupper.text.rom.data.bsstzset.o:4 % d nnnU _tzset__tzset.text.rom.data.bsswcstombs.o:5. .d.UVW} uNxGUEЄuU)_^_wcstombs.text.rom.data.bsswctomb.o:6dU}u1 UM ü_wctomb.text.rom.data.bssfltpr.o:u BCd UhhYYjYcannot print floating point   2<FLV_ejp__fp_hook__f_print_exit___stderr_fprintf.text.rom.data.bssstrtod.o:Y>7d UhhYYjYcannot print floating point   "*0:CINT_strtod_exit___stderr_fprintf.text.rom.data.bssdhcp_gettag.o:#d[[[U(VWUcSct1UUE4UlUEU,UE1tTT9{UF}g}u1FSXE؋U 9Uu }tE0}tU؋E2}4utEtE@uuGb1_^×_dhcp_gettag.text.rom.data.bssdhcp_settag.o:T GdyyyUhju UǂcScUh4hR UVW} ~ } |1uU$9]>tXV9U u=U)ʉ$RQVX UWh $P; 1뒃}t4VUM$9wU FUFuuV 1_^  7    @%-6>DIO_dhcp_init_dhcp_settag_memcpy_memmove_memset.text.rom.data.bssether_line.o:3dEEEUVWU: t: t: uE1}?jEPu Ɓw EE8:t ʋU  GjEPu Ɓw U: t: t IʋU  U: t: t: uEUuEMEU1_^ - l_ether_line___ctype_strtol.text.rom.data.bssethera2n.o:|~.~d~U VW}u1e1UjEPu Džx~17}U::u u U:t1UUF뢸_^ *evNZ^flqw_ether_atonI_1_strtol.text.rom.data.bssethere2a.o: vBbdbUVWu} u jYDžt+FPFPFPFPFPPhW _^UhuYY%x:%x:%x:%x:%x:%x ; ARfqN}_ether_e2a_ether_ntoaI_2_malloc_sprintf.text.rom.data.bssetherh2n.o: OdUVhhYYƅubVhP t=Pu P uuPYYuVY1 V|Y^r/etc/ethers   6 S i u _ether_hostton_fgets_fclose_fopen_strcmp_ether_line.text.rom.data.bssethern2h.o: OdU VhhYYƅu eVhP t@uPP uju P uVY1 VvY^r/etc/ethers   9 V n {  _ether_ntohost_memcmp_fgets_fclose_fopen_ether_line.text.rom.data.bssgetdomain.o:rCndnUVhPYYyCEj.PYYƅuu FPu } t U JU1^.  6C RVenv_getdomainname_strncpy_strchr_gethostname.text.rom.data.bssgethnmadr.o: >rVdV8U8VWEU UUUUfRf  ىM؋UfRf  ىME0Eu }}`uuVuuKDžy1W΋UuYljUUU)UVuVYYZMԃ}~DVuVYYZ߃}t&UBt  1+EEEEEM9uuuVuu;DžV"YEVYEVYǃ}u@ց},sUEEuYljUUU)U]}tE} u?uuVuuDžy +֋U}u}t }t&9=t U9UtQ=UŨ}u1}u UuuYZЉEE1UU1s-UEȉEWVR UUE;}tEE 1_^UVW}-0= >N>.W/Y4=u1=4X-0= r>.uF\hPjjWy1jPi _^UVW}}t1PGPGPGPhP#hPj jPEy1HjuP ƅu1*UVU V 44_^%u.%u.%u.%u.in-addr.arpa%,6U\f~     (KWix|          # ^  3  I   #)37< n   6:@L   $ 0- 48 A L T \ g r }    _getanswer_gethostbyname_gethostbyaddr_h_addr_ptrs_host_host_aliases_hostbuf_host_addr_h_errno_res_query_strlen_memcpy_inet_addr__getshort_dn_expand_dn_skipname_sprintf__tmp_res_search.text.rom.data.bssgethostent.o:7bd,,UU=t5Y U VW=u7= u1h5 YYu  :xX@ 5MYE=t} t sF봃}u%5Y D8= w>tF>t/>#t*t"7= v>tF>tF뺁unh 5{YYuX5jY 5JY=~5h.YY ]Qh5YY7_^/etc/hostsincluder/etc/hosts   $.2(BKZ` elv     3]ov|         z  8 _HOSTS_hosts__sethostent__endhostent__gethostent_hfpI_7I_4I_3I_2_strlen_inet_aton___fillbuf_fclose_fopen_strcmp_strcpy.text.rom.data.bssgethostname.o: >mdmU VjhYYƅyHu uV EVY}u"U JUj uYYEt1^/etc/hostname.file  * 6 Xy_gethostname_close_strchr_read_open.text.rom.data.bssgetnetbyaddr.o: @T@d@UVW} 5Yƅt 9~uU9V u=u_^  . 68FQ`kv|_getnetbyaddr_endnetent__net_stayopen_getnetent_setnetent.text.rom.data.bssgetnetbyname.o: ]\]d]UVW5YDžt-u7YYtw>tu6YYt=u_^   " :K Sq_getnetbyname_endnetent__net_stayopen_getnetent_setnetent_strcmp.text.rom.data.bssgetnetent.o:%d88==U=uhhYY 5YU U=t5YUVW=u!h$h(wYYu15hhP Eu1U:#th u*YYƅtUhu YYƅtF> t> uFhVYYEtEVY ׃}tut8>t3> t> uFs7hV|YYƅtF_^r/etc/networks # r/etc/networks   & +5@I  NU_s{            ,28AGnz  =H;Si^djo|_setnetent_endnetent_getnetent_netf_line_net_net_aliases__net_stayopen_rewind_inet_network_fgets_fclose_fopen_strpbrk.text.rom.data.bssgetproto.o: 8`8d8UVW}5Yƅt9~u=u_^  & .0BS`mz_getprotobynumber__proto_stayopen_endprotoent_getprotoent_setprotoent.text.rom.data.bssgetprotoent.o:  d838koU=uhhYY 5YU U=t5YUVW=u!h$h(wYYu15hhP Eu1U:#th uYYƅtUhuYYƅtF> t> uFhV|YYEtEVY ׃}t?ut8>t3> t> uFs7hVYYƅtF_^UVW}Utu >t]9uFG1_^r/etc/protocols # r/etc/protocols   &  +5@I  NU_s{      ,27=dpGO\;iiv{_protof_setprotoent_endprotoent_getprotoent_any_line_proto_proto_aliases__proto_stayopen_rewind_atoi_fgets_fclose_fopen.text.rom.data.bssgetservent.o:e%[d<<U=uhhYY 5YU U=t5YUVW=u!h(h,wYYu1D5hhP Eu1U:#th$u YYƅtUh uYYEtEU: t: uEhuYYƅjFuY%f  ى 5hVWYYƅtFt8>t3> t> uFs7hVYYƅtF_^UVW}Utu >t]9uFG1_^r/etc/services ,/ # r/etc/services   &  +5@I  NU_s{      9ELVjpu{;i%-3:BIOUZ`_servf_setservent_endservent_getservent_any_line_serv_serv_aliases__serv_stayopen_rewind_atoi_fgets_fclose_fopen__tmp.text.rom.data.bssgetsrvbyname.o: xaxdxUVW5YDžD7uYYtw>t6uYYt} tu w YYu=u_^   & > Zf n_getservbyname__serv_stayopen_endservent_getservent_setservent_strcmp.text.rom.data.bssgetsrvbyport.o: MaMdMUV5YƅtU9Vu} tu v YYuփ=u^   0< DYhx_getservbyport__serv_stayopen_endservent_getservent_setservent_strcmp.text.rom.data.bsshton.o:$dddd__tmp__tmp_l.text.rom.data.bssinet_addr.o: FJ*d*UVuEPVYYtE^U$VWuUU1E >0uF>xt>Xu EFEUE=s&E-0= sE-0UF}uLE=sAEDt4E ]aPsaAZ)‰Fo>.u&U9Usv1 E܉8EF>t=s u1UM)ѻș@Ecv1U Wv1UM 6v1xUM ыU E+} tF=  ً ʋ  ыE _^e~! <  1_inet_addr_inet_aton.csa4__tmp_l___ctype_errno.text.rom.data.bssinet_network.o:2I-IdIU(VWuUU1E >0uEF>xt>XuEFUjE-0= sE-0UF̃}u>EDt1E ]aPsaAZ)‰F눀>.u!U9Ur }E܉8EF:>tu SE܉8EUM)ѻșE=v'1EU9UsU؋T E_^y"'-_inet_network___ctype.text.rom.data.bssinet_ntoa.o:F@.4d4 UVuFPFPFPPhh^%d.%d.%d.%d %-#'06;A_inet_ntoaI_1_sprintf.text.rom.data.bssmemcspn.o:UUdUUVWuEU 9Us0}E9tU9UsGEU9UuFEȉ+U_^ _memcspn.text.rom.data.bssrcmd.o:+Y \e de    U@VWEuCEf#M сf }|hYEuEE0{YEu!]3hh_ EEEJf} fju YYDžy'5YPuh|h7E!ff  فfM#U fUURUEPh0n@Wu ƅy9=:u W]Y5LYPhXh; EEPh0n@W ƅy$5 YPh4h LEEPh2n@W ƅy= ujYy = tʅy-=:t$5YPhh y M}0}uhh\YY}u?jhW= =/5$YPhh gjuYYEy'5YPuhh-E"ff  فfMEPh0n@u ƅy$5nYPhh] PEЅy$5>YPhh- }jYjj YYjYEEPh3n@u ƅy= ujYy = tȅy0=:t'5YPhth jYx jYjxYjpYPhpEPY EPMYPEPW< PEP/YZ9t$5YPhXh \uYPuW uYPuW uYPuW jEPW =t$5YPhDh} }t5jEPWc =jEPjH } u}UEEPh1nu ƅy!5YPh h IfUf  ف|hhYYxWY}x uY_^U8VWDžDžu>tF>.uu +UFG-A=s FPYFG} t1hhYYE}t;uuPuuuY1uY=u } DžuzYu rPPYYhP=YYhP*YYEu]UPrYYu0tB9uuY_^UVWuhP > t2> t-> t(>t#-A=s P]YFɀ> t> u*F> t> uF> t> t> t >tFuPu 7 N?tEPuYY/1_^UVW} }uWuYY1ۅÉ uWu t1WuYYu U:t1=t1=hh9YY=u1j.h YYu1Tր>t-A=s PYF݋UUR5YY1ۅÉ_^unable to setup 2nd channel unable to ioctl(NWIOGTCPCONF): %s unable to read: %s unable to write: %s %dunable to ioctl(NWIOTCPLISTEN): %s unable to fork: %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s unable to write: %scan't get port unable to ioctl(NWIOTCPCONN): %s unable to ioctl(NWIOSTCPCONF): %s unable to ioctl(NWIOSTCPCONF): %s unable to open %s: %s %s: unknown host /dev/tcpTCP_DEVICEr/.rhostsr/etc/hosts.equiv*  ***3*L*V(c h(w ( #**** & ( #*/$6$=$G   ( #  ( # "1 ;FS\ a(hm #r( #(   ( # &  ( ##*9$@$G$Q z ( #   ( #      # -8EN S(Z_ #d  n  z   *( !     ( #      / :  J "Yi n(uz # "    ( # $$!$+(FK #P b q ((   ? O)c %  ( (   2 b   C _ v ) ) *  ) * *  ) ) ) ) 7 )M R 9?S\Gh0 ty}$,4<IQZ`ioy_rcmd__check_rhosts_file_ruserok__validuser__checkhostI_25I_1_strerror_strlen_fork_getpid_alarm_write_exit_sleep_index_tolower_strncmp_gethostbyname_strcat_fgets_close_fclose___stderr_fopen_fstat_ioctl_errno_signal_strcmp_getenv_gethostname_strcpy_sprintf_read_fprintf__tmp_getpwnam_open.text.rom.data.bssres_comp.o: rdHHGGUVWEEu}UUUGЉU9ut9uw .FU9Uw UBUMxGЉU<.uU9Uw \FUF9} wȸ}y +UBU?#U ʋM9}w9} wIEU +U9U+/(#U}y+UUE_^U$VW}u UU}t,EEU܅t#UUE8tEUUEUG}#}zuuu܍GP|Ex;V9Uw UFEF+U }tU9UsE0EEFE}.u UGD}\u GЉUt19uw}t E|UFGЉUu+UJUu }uN/}~}?~}t E3UM 9uw}t E F+U _^UVWu9u v3FЉׄt'F!+U_^UVWUUU9UuE8}GЉUsMx$>.>\uFF'G9tmFЉUu?u U+U \}.uH뚸M?#U ыU w#U0>u U+U E4_^UU Z ˁUVuN V N щ^UVWu }V_^UVWu} WWW_^; g       $ ,   0 < D  [f4o|,+Up_dn_expand_dn_comp_dn_skipname_dn_find__getshort__getlong___putshort___putlong.csb4.text.rom.data.bssres_init.o:9-dHIHU VWDžDž $jh@YYug#Jfh4gYƅthVh$P hh 8YYE(uhP jhP _u> t> uF>t> thVh$ j h$YYƅtDždjh P| 9> t> uF>> hVh$/ j h$ YYƅt$$7E>t3<s+> t> u E}t 7EFȀ>t > t> tFDžoj hP Q= D> t> uF>(>  PV6YY ff U uY= u"ff =$u=hPYYu&j.PYYƅtFPh$YY]$$$E>t >.uEF$}|0sj.V@YYF7M 1_^nameserversearchdomainr/etc/resolv.confLOCALDOMAINdomain!+5?IQ  Vh      ? DN  St    i u   *  >  Rc  h|  1;@AJU^emt}_res_init__res_h_errno_inet_aton_strncmp_fgets_fclose_fopen_strncpy_strchr_getenv_gethostname_strcpy_getservbyname.text.rom.data.bssres_mkquery.o:$ 3edUt >.uEF}u)uYƅtuuuu V_}u €u$}N>.$?quuuu 7uE~=;ul=uE=t =ut놃}t"uuuu ju%E~}t _^UVW}} uBWtuF>nuP.YYuFu>tDG?tuG1҈hVh uY uY1_^%.*s.%.*srHOSTALIASES    JY w  - 7NX0<EN   L Q^ f          "(  2@'19EKT[cjsz_res_query_res_search_res_querydomain___hostalias_h_errnoI_3_strlen_res_init_memcpy_strcasecmp.csa4___ctype_fgets_fclose_fopen_strncpy_errno__res_getenv_res_mkquery_sprintf_res_send__tmp.text.rom.data.bssres_send.o::ud0" 0R V U@VWEEEUUЋUUE=u=u u } ~1EUffUE9UYE 9U;}DžU=y2UMEPUP4w =#U f  فfMjEP5 =t$U5Y^u u5 9E t$U5NY}fEU܅t2EPW5 ƅ~U)fUU܅tBU5Y}<}EM}ff  ىM9M}#UfUDž #UfUU܅t2EPW5@ ƅ~U)fUU܅t$U5YUJÜJU+UfUU܅VU܁vE܉VP5 ƅU)fU멃=yyU'UMUP4u u5(9E MUԃ}~ Eԙ= Eԃ}Euuu5E=u=EEUM9u u+UBt"5{YE}tt}u u56YEaEE=x5Y}u}u ;= Uȉ_^U=t5YU$VWh YDžujWtYYƃuEE1UUfU fUEPh0n@V2 E=uEVYGEEPh2n@V E=uEVY E_^UVWuut.Vu u Dž U)U U )΋E_^U VWh$hYDžujWTYYƃuEE73EPh@n@V. E=u UVYU_^UVWURYƅu wUWfUfW fG #UfWuu FP URVu EUVoY}r UUUE_^Uhj@YYj7YUVWURYDžu hjYYEuYEURWu ƋUxw7~1WYjYujYYuYU@RGPu t WkYjcYujXYYuNY_^/dev/tcpTCP_DEVICE/dev/udpUDP_DEVICE5  ?V B]f kr   $X_i  i n":h|   &5GP U\o t     $  Y      $ c  x           (3  K  S ^  hr        NQ[Bgft? $*/5_s_res_send__res_close_tcp_connect_tcpip_writeall_udp_connect_udp_sendto_alarm_handler_udp_receive_free_malloc_res_init_alarm_write_memcpy_close_ioctl_errno__res_signal_getenv_read__tmp_open.text.rom.data.bssservxcheck.o: ,$Z>d88U VW}EJxGGSXWY=u #u Eà u E뵃}u ~U U:t;uU EXU 9Us U EJxGGSXWFYƃt ~ :t;ut WV#YYUU _^UVWU:u1j/uYYƅuuY] /FE 8u11-0= sF-0k ǃ ~1x>uu1ku1 )Ѻ )У ʋ  ы ʋE_^UVWU-A=w U -A=w *uE U :*t-A=w u jt@9u U MRQ|YYtBEU-A=w 1"tu 19u@9u EE 41_^UVWEjjEP& ƅM6u YYu Yƅt2~u,1V<t!jEP4 u EGփ}t uYPu YYE_^UVWEPh1nu y Ut9Uu h5SYYEu1ۃ=tCDžDžDžDžDžPuYY=:u Džу;uDžDž붃t\Pu YYtu PpYYtm`DžQlu3hP;YYu(Dž-t3+t.}P5hdhu+u1u@1ۃ+uC9u-uPPPX t-3UM-u5uPuYYu PPYY-uuY%uPu^YY}t1u@SPUYYh P hhhTYYY=@P:Y@P-YdCOz@HVwpY|b@n7?  2> \nt y       4BH S[a f s{           !' , 9AG L Yag l y       '- 2:@ E bx#)/5;DJQ[agmsx~_asin_acos_asin_acos.ngf8.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8_sqrt.sbf8.text.rom.data.bssatan.o: GZd@>@h~hUVWu u551ۅÉu uYYt!u utu uEE u u5 5~&55u ueYYEE 1u u55=sF5$5 u uYY5,5(YY5450YYu uYY5<58u uYYYYEE u uu uYYEE55uuYY55|YYuuoYY5 5\YYuuOYY55 \ n t y                # . 5 N \ b m u {                    ! & 3 ; A F S [ a f m z      _atan.ngf8.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8.sbf8.text.rom.data.bssatan2.o:, mRdhihUuu55u9u u5 5u!55u u55y u uzu uEEuu5$5 Uy uuCuuEEuuuu$YYuuu@u u5,5(y54505<58uuuuYYuuu@ DUM u uuuYYYYEUuu5L5H`~uuRu u5T5P:yuu5\5XYYuu5d5`YYXZ-DT!-DT!?-DT! @-DT! @    , 2 7D N T e k p           ! ' = J W ] v }             _atan2_atan.ngf8.cmf8.adf8_errno__fp_hook.dvf8.sbf8.text.rom.data.bssceil.o: g8WdWUEPu u RP55~uu5 5YYuuXZ? " ':@ Eou{_ceil.cmf8.adf8_modf__fp_hook.text.rom.data.bssexp.o:HFewdHIH88U(VWu u551ۅÉu uYYt!u uu u5 5y"55Uu u55_~"IRP!tu u3EE u u5$5 YY5,5(YYjj ^VjEEu ujj jEEu uuuYYE؏Euuuu5450YYYYuu}YYuu5<58dYY]YYEEtuuFEEuuuu-YYEE55uuYY5 5YYuuYY55YYuuYYEE FVu u5450uuYY5,5(YYuuYY5$5 tYYuugYY55TYYu uGYY@YY5D5@-YY& RPXZ_^Ҽz+#9B.@+eG??0? a\+??*K?*D??Q(?(\ D?U c3>  2 >Y_ d q{         %  /  F`f k  r          ! .DJ U]c h u}           &,28=C_exp_ldexp___huge_val.ngf8.cmf8.mlf8___IsNan.adf8.cfi_errno__fp_hook.dvf8.sbf8.cif8.text.rom.data.bssfabs.o:V@28d8Uu u55y u uu uXZ   ($*06@FKQ_fabs.ngf8.cmf8__fp_hook.text.rom.data.bssfloor.o: g9WdWUEPu u RP55yuu5 5YYuuXZ? " ':@ Eov|_floor.cmf8_modf__fp_hook.sbf8.text.rom.data.bssfmod.o: EtdtUuu55u!5 54EPu uuuYY EURPuuYYXZ &06 M T j_fmod.cmf8.mlf8_modf_errno__fp_hook.dvf8.text.rom.data.bssfrexp.o:#dUu uPEXZ _frexp.fef8.text.rom.data.bsshugeval.o:,dt||U ___huge_val__fp_hook.text.rom.data.bssisnan.o:#4/4d4UVu uY^!ut1^   ___IsNan__fp_hook.cff4.text.rom.data.bssldexp.o:$:hd8f8UVWuu uYYt!u uu u55u5 5u u55yu urEE u u55P~$"Wj7u u,YY!EPu u EU u~%"RPWjYY~$5$5 u uYYEE ׉Rju uYYEE j}5,5(f}$u u5450NYYEE ׉ډѺu uRj&!YYEE Wju uYYXZ_^AA # > D I V \ m s x             2 8 C  a l           ry_ldexp___huge_val.ngf8.cmf8.mlf8___IsNan_errno__fp_hook.dvf8_frexp.cif8.text.rom.data.bsslog.o:Qr1d1hh885U$u uYYt!u uu u55y!RPu u5 5u"nRPgu u55K~ u ufEPu u* EU RP55fu u5$5 YY5,5(YYEEu u5450YY5<58YYEERu u5D5@YYZYUMQR5L5HiYY5T5PVYYEEMuuuu:YYZYUMQRQR'YYEE55uuYY5 5YYuuYY55YY5450uuYY5,5(YYuuYY5$5 YYuu|YY55iYYbYYuuuuOYYHYYuu;YYEE uj)ZYUMQR5\5XYYu uYYEE uu5d5`YYu uYYXZ;f???????? a\+0?P Jb0@)VDw ~&s@gKA?  4: ?L U \ms x           #7= BJP Ukq  v        " '/5 @HN S `hn s             '_log___huge_val.ngf8.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8_frexp.sbf8.cif8.text.rom.data.bsslog10.o: Zd77Uu uYYt!u uu u55y!RPXu u5 5u"tRPm"u u`YYRP55KYYXZUk@   1 7 <I R Y g m r     cjv|_log10___huge_val.ngf8.cmf8_log___IsNan_errno__fp_hook.dvf8.text.rom.data.bssmodf.o:)()d)Uu ujjPYUY[ ZXZ   _modf.fif8.cif8.text.rom.data.bsspow.o:2`?d?``UV1u u55uuu5 5tJu u55yGEPuu RP55xt!5$5 u u5,5(?u u ugu u5450yUEPuu5<58YY RP5D5@tu uEE u uYYEU RP5L5Hy"u uEE uuqEEu u5T5PT~P5\5Xu u6YYuu)y%"tRP@RP7u uuuYYYYEU t u uu uXZ^@?    / 5 : M S X n y                % < M ] c h z                .GLX^diou|_pow___huge_val.ngf8.cmf8_log.mlf8_modf_errno__fp_hook.dvf8_exp.text.rom.data.bsssin.o:T{edh7h@@UVu uYYt!u uCu u55yu uEE }t&5 5u uxYYEE UM UMuu55KYY558YYZYUMQR5$5 x5,5(xEPuu EP5450uuYY RP5<58tރ}tuu5D5@YYEEEPu u| EUuuuu5L5HVYYOYYEE uuu u6YYZYUM QRuu5T5PYY YYZYUM QR5\5Xyu uEE u uu uYYEE5<58uuYY5450YYuuYY5,5(rYYuueYY5$5 RYYuuEYY552YYuu%YY55YYuuYY5 5YYuuYY55YYu uuuYYYYu uYYEE u u uu uXZ^Uju uv Uu u5d5`Wyu uEEE ju u2 -DT!?m0_??m0_??" @KUUUUUUſ?>*c$>]KEZ0jh<=I jߓi<   : @ E W s y            & - 8 > C ^ d  i                 ! 8FL W_e j w           % * = D Q i    ?FzKPV\bkqw~_sinus_sin_cos.ngf8.cmf8.mlf8___IsNan.adf8_modf_errno__fp_hook.sbf8.text.rom.data.bsssinh.o:I|SdSPP@@GUVu u551ۅÉޅt u uu uEEu uYYt!u u}Fuu5 5r$uuuuVYYEE55uu7YY55$YYuuYY5 5YYuuYY55YYu uuuYYYY5<58uuYY5450YYuuYY5,5(~YYuuqYY5$5 ^YYWYYu uJYY8uu55,uu55 YYZYUMQR5$5 yDuuYYEU 5,5(u uYYu uYYEE "EU fuu}YYEU}t5450 5<58uuJYYuu=YY5D5@*YYEE t u uu uXZ^Uju u Uu u5L5Hyu uEE ju u ?9B.@`.?~B.@e~ ???4SVy•JcAxdoDg@^#W@Ɂ[q?  5 N Z          + 2:@ KSY ^ ksy ~            !/5 @ M ` i         % 7grx~_sinh_cosh_sinh_cosh___huge_val.ngf8.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8.sbf8_exp.text.rom.data.bsssqrt.o: \wdw88U u uYYt!u uGu u559u u5 5y !55u u55f~ u uEPu uE EUUt"M5$5 uuYYEEEHPuu5,5(YY EUE}x>u uuuYYuuYY5450YYEEMuuXZ@?@   4 : ? R X ]j t z           < I Q W \_sqrt_ldexp.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8_frexp.text.rom.data.bsstan.o: MG_dHrHHHU VWu u551ۅÉ1u uYYt!u utu uEE u u5 5YY55nYYZYUMQR55Qx5$5 AEPuu* EP5,5(uu YY RP5450tEPu u EUuuuu5<58YYYYEE uuu uYYZYUM QRuu5D5@kYYdYYZYUM QRQRQYYEE55uu2YY55YYuuYY5 5YYu uuuYYYYu uYYEE 5D5@uuYY5<58YYuuYY5450YYuuyYY5,5(fYYuuYYY5$5 FYYEEtu u/EE tuuu uYYu uuuYYXZ_^m0_??m0_?"?KҾ? Mߪ;l?$Ǣ.?GݿY!~G?AH do4xvt>    4@ ^ p v {              ( C I N  U n                   $ 2 8 C K Q V c k q v              !+17=BH_tan.ngf8.cmf8.mlf8___IsNan.adf8_modf_errno__fp_hook.dvf8.sbf8.text.rom.data.bsstanh.o: 8_PdP8888$U Vu u551ۅÉu uYYt!u utu uEE u u5 5x UM u u55Os5$5 5,5(u uu uYYYYRP5450YYYYYYZYUM QRQRYYEE u uu uYYEE55uuYY5 5YYuuYY55nYYu uuu[YYTYY5450uu;YY5,5((YYuuYY5$5 YYuuYY55YYYYu uYYEE t u uu uXZ^9B.v@? z????ɥ5\uX(NW<@Ms@/\@?    1= [ m s x                 < J P [ c i n {                     ( ?_tanh.ngf8.cmf8.mlf8___IsNan.adf8_errno__fp_hook.dvf8.sbf8_exp.text.rom.data.bss_brk.o: 7dU$9Ut*UUEPjj y U1UVW5}׃}~9r }y 9vWYu_^  7FLtz?__brk__sbrk__brksize__syscall.text.rom.data.bss_reboot.o: >)>d>U$Vu UUuV֋RUV֋RUEPjLj ^ 4 __reboot__syscall.text.rom.data.bss_seekdir.o: y9ydyUVuu TfFV V#U UU +UVjvP =uU 9Vs VYu1^ L kU_gqx~__seekdir__lseek__readdir_errno.text.rom.data.bss_svrctl.o: 6^d^((U$UUU U5EPjMj 6EPjMj $U8F&I&MS $  /:P X__svrctl.csb4_errno__syscall.text.rom.data.bssasynchio.o:+d44FFUUUBUVu {95tF9Et5EFEFEFUVUV395tF9EtuV FZ^Uuuju ujOUuuju uj2Ujuuu ujUjYU$VWu95tU t>uF1P}jYE]9 jYEEEPnYEEPEPjW E+U9}v}WKRZamsz_asyn_init_operation_asyn_read_asyn_write_asyn_ioctl_time_out_asyn_wait_asyn_synch_asyn_close_asyn_current__sigfillset__read__alarm_abort__sigaction.csa4_pause__time_errno__ioctl__write.text.rom.data.bssconfigfile.o:</I  d h) h  Uu uYYEu&55 hhjYEUVutu6uY^U VW}1t}?E0utu~6uiY_^UVu6YvYv YV8Y^U= u:xX@ 5Y=uAR t35YP55 h hjYUt'Z=#uL=tփ= uUUE=u4EP55 h8h(jYUVWEE j5jYYF VV F='t ="uU~EU9UuE URVYYƃ}u==p5hRYYuZ=t = u.v 55 hhj YU9u k=\t#UщMDt t8UщMD\U9UuE URVpYYƁN0 sTEU 0щMO~0 rԋEUщMDZ=xt =X4EDu&55 hhjYas W&As 7 0ЋU‰U#O~DuEUщMDocW K ? 3 '  \UщMDXVU}t Nr}u1\PEPFPA U:u  VPEPFP U:u O VG뛺URVYY_^UVWE}*==}=;ur}tv}^={uUOjjzYY VV ;FF7=}t`RE_^UVWEUUDžhHGPYY7t>u Ft#w 5 hhjYFt=VUUU U =\u EUMU:tEE̍FP_YWYE0E88Ujj1YY~WVW V FE0uE_^U@VWUԋ= ŰUEU:/ttj/WYYEt)@EuYE PjYYuWFP VUuRnYY5V hdu>YYt]Sp'YYyF=t*5 YPuhPhjYFUV E=tK=t 5YUԉ= ỦUȉE_^U,VWu_U}t;UEPREYYy=uEUM9Ju EU뿃}uVYU uYƅtDFPYEPVYYǺURWGP GG5YVY1_^UV}uUBƋUB^UV1}t FEU^"%s", line %u: Out of memory "%s", line %u: %s EOF"%s", line %u: parse error at '%s' VaVVVVVVVVV VVV#/V;"%s", line %u: bad hex escape "%s", line %u: string at line %u not closed "%s", line %u: 'include' command requires an argument include"%s", line 1: %s r!#$%&*+-./:<=>?[\]^_|~   ..,$!) *. 8 Y  ...... ..$) ..6.<,A!F *K U.`f.t....,..,! * +\+h+l+p+t+x+|++++++++++++++++.. .0.9.B.}..- %....,! * ....@F.Y......%+.4.:,?!D *I S.Z.h.u........ ..%.1.=,H.M R.W- #- .4.A.N.q..., &.7,<!A *F P. ...% C Z | (...., ". '$$ ,! *  . .- .? .M .V  [ .e .k .t .} ) $ $ . . + R .[ .l Bc\  0 ?HQW _gjtz&,17_allocate_delete_filelist_delete_config_config_delete_nextc_skipwhite_parse_err_read_word_read_line_read_list_read_file_config_read_config_renewed_config_length_c_files_c_flags_c_fp_c_file_c_line_c_strerror_free_strlen_memcpy_exit_memmove_strrchr.csa4___fillbuf___ctype_realloc_strtoul_fclose___stderr_fopen_strtol_errno_strchr_strcmp__fstat_strcpy__stat_fprintf.text.rom.data.bsscrypt.o:%vd%9UVWUUU UEEFt uWEEFt u:EPY(-Phu uvYumY}tjuWYYuMY}tjuuGuU 5_^/usr/lib/pwdauth    +H Xhn  v                  &  ;H P  ]jr-6=AHPW^fls{_PWDAUTH_cryptI_1__dup2__execl__pipe__read___exit.csa4__fork__close__waitpid__write.text.rom.data.bssctermid.o:).+"d" UVuuhVYY^/dev/tty   $_ctermidI_1_strcpy.text.rom.data.bsscuserid.o:k =>=d=UVWuuPYDžu1 7VYY_^   1-6:DMU[`f_cuseridI_1_getpwuid_geteuid_strcpy.text.rom.data.bssenviron.o:dddhSSSS_environ.text.rom.data.bsserrno.o:dddh_errno.text.rom.data.bssfdopen.o:5d8D8||UVW1}y11<t,|1Fρ(1E E U :tE E  |juYEu1EttEUMJUzUBUE_^Ha:r2w@+lbb  ,4Y ^{  LT]ekqv|_fdopen___iotab_malloc.csb4.text.rom.data.bssffs.o:**d*UVW}u1tF_^_ffs.text.rom.data.bssfslib.o: /Xd(k(UVU ։ 9UvF^U}t #U U  ˉU }tE <#U RjYYEU RjYYEU UUUVWu}Hjuu VKBjuu V8/juWVwjuWVf E _^UVWu} }PuYY%f_SuYYfFwuYYFwuYYFF FO NO NFHFLE} UOQPuqYYUNEPuUYY%f^Su>YYfGvuTYYGvuDYYGNO NO E} }'UN4uYY%UOfQE_^UVWu} }PuYY%f_SuYYfFGPuYYFGPukYYFwuYYFw urYYF wubYYFwuRYYFFHFLE} UO4uYYUNEPuYY%f^SuYYfG^SuYY%fG^SuYY%fGvuYYGv uYYG vuYYGvuvYYGE} }!UN4uSYYUOE_^h$$h $ O[bFiuK_bitmapsize_conv2_conv4_conv_inode_old_icopy_new_icopy.csb4.text.rom.data.bssfsversion.o: Wd070gHgUVjuYYƅy'u Yh YuYjhV jDhV =Dt+u YhYuYVyYAVkYDB=uDB=h$u^ cannot read super block on cannot open   % . F P V h n s |     D_fsversion_super_sp_perror_close_read_open_lseek_std_err.text.rom.data.bssgetgrent.o:5d'U= x 5 Y U= x=u j5YY y'j5 YY Pj5 m 1U^UU=u/hh5 ( 1V=u1< = uUUU:u12: t9Etz:u1 UEUV= y~y1u1j:nYtj:]Ytj:LYEtjju ։: t$j,Yts:u^UV3ƅt F9Eu^UVv ƅtu6aYYuV^/etc/group $3AJNV [bu z   15HQZit  8CS & ,4>.HS\@hrZ|_GROUP_grfd_buflen_endgrent_setgrent_setgrfile_getline_scan_punct_getgrent_getgrgid_getgrnam_grfile_buf_grline_entry_members_bufptr_lineptr__read__open__fcntl_strtol_strcmp__close.text.rom.data.bssgetlogin.o:i 3>3d3UVPYƅu16hYY^   %,+59CKSY^d_getloginI_1_getpwuid_getuid_strcpy.text.rom.data.bssgetopt.o:7f5d5@@  UVW=aU9} M :-uzu M h<4YYuM ǣ:tWucYYƅ}=t=E h0?YYhh$.YYhW!YYhj YYM :u? F>:M C;t!A M CU9|W=t=E h0nYYhh]YYhWPYYhj BYY?`A M 7M :u_^: option requires an argument -- : illegal option -- --    0 I Q  Y e u             2 ; M V` k t |              !'EMU]emt{_opterr_optind_getopt_optarg_optopt_fputc_fputs___stderr_strchr_strcmp.text.rom.data.bssgetpass.o:tdt  (UU`VW1jhYYDžy1<EPjj }t*EPYEEEPEPj EPWxYYEPEP dUfUUfUUfUUfUEPjW u YPuj jPW ~ t }FƆEPjW WYjEPj =tjY_^/dev/tty !6 G  Yh w       /  <  E S\  fl _catch_getpass_intrI_1_strlen__read__open__sigaction.blm__tcsetattr_raise__sigemptyset__close__tcgetattr__write.text.rom.data.bssgetpwent.o:5d$"U= x 5 Y U= x=u j5YY y'j5 YY Pj5 m 1U^UU =u/hh5 ( 1V= u1<   = u U U U :u1 : t  ::uҋUEUV= yy1u1txtjƅtjjV fLƅtjjV /t! yg :X^UV%ƅt F9Eu^UV{ƅtu6fYYu[^/etc/passwd $3AJNV [bu z   15HQZit   2@N  $..8CL@XbUl|v~ _PASSWD_pwfd_buflen_endpwent_setpwent_setpwfile_getline_scan_colon_getpwent_getpwuid_getpwnam_pwfile_buf_pwline_entry_bufptr_lineptr__read__open__fcntl_strtol_strcmp__close.text.rom.data.bssgetttyent.o:D_KdKU= x 5 Y U= xjhYY y'j5 YY Pj5 1U=u/hh5 E 1V=u1< = uU} t} u1UVPYt}u:#u1b5U:u1D: t(}t :"u*P_YtU>u1^UVUP'Yt:"uRjYƅt(>"t#=u1{0ʋ:"u;0jYƅu1C=u130=u1E^U= y _y1Du17jRYtjAYUVƅtu6YYu^/etc/ttytab $3B GNa fv { FZhz /3AGR]z~ 7'/ 5=H.S\#c=o|_TTYTAB_ttfd_buflen_endttyent_setttyent_getline_white_scan_white_scan_quoted_getttyent_getttynam_buf_ttline_ttargv_entry_bufptr_lineptr_argvptr__read__open__fcntl_strcmp__close.text.rom.data.bssgetw.o:9^'^d^UVWuE}UIMt!JxFFSXVYGҋVu tE_^ 9#).4_getw___fillbuf.text.rom.data.bsshypot.o:Y `Q8d8((Uu u55yu uEE uu5 5yuuEEu uuu~$UMUMUM UMUMUM uu55Iu55Ou uuu#YYZYUM QRQRYY5$5 YYYYRPuuYYXZUuuu u?    + = C H Z q         !'-7=CINT_hypot_cabs.ngf8.cmf8.mlf8.adf8__fp_hook.dvf8_sqrt.text.rom.data.bssitoa.o:  (d-- -U VWE}yA ƀ-]}uA ƀ0Z'~QEǃ}u~$G0A ӈE+UډU 뫡ƀ_^!*2BKS} _itoa_next_qbuf.text.rom.data.bssloadname.o:!5<1<d<UVuYƋU rU MJwU uRYY^  3%*0__loadname_strlen_strcpy.text.rom.data.bsslock.o:"Td(A(iiUuhh jYUVWuYE1juYY=u= uF|1-jY΃tWY=u hyY_^UuYP]Y=u hKYUh h6YYuh'YYcouldn't %s lockunlock/tmp/   > O c  q~     " &-5>DIO_syserr_lock_unlock_lockpathI_4_creat_exit_sleep_unlink_strcat_close___stderr_errno_strcpy_fprintf.text.rom.data.bsslrand.o:"}b+^d^UUUEUi§APi Z)‰y &5GOXRZ`gmrx__lseed_seed_lrand.text.rom.data.bsslsearch.o:#z-dUVWEUM ϋu 9sVuUYYuuuWu E_^UVEUU Uu 9uvVuUYYu u1^ >MVP]djou_lsearch_lfind_bcopy.text.rom.data.bssmemccpy.o:$WWdWUVW}u1A} uUʉMUU}t$GFSEZ9uM1_^ _memccpy.text.rom.data.bssmtab.o:%Z \.dll  UVWj5YYDžyh0u^YYhhW Eh u+YYU}u'uYh ~Y5rY%WdY>ttF1_^UVh5*YYƅyhTuYY?-PhV Eh@ugYY VY1^U=rU25uYY- =_s:u=s5u QYY- =_s:u=s5uYY- =_s:u=s5uYY- =_s:u=s1UVWugYEu [YEuOYuDYƋUUr u5YYU u 5YYU u5YY u5YY 1_^UumYu dY5XYhhMY/etc/mtab: file too large: : cannot read : cannot open could not write : cannot overwrite  < BQ sy ~       ,;?W _g|  '+3; CK`hsw          !'-9 >HNT` eou{     6   ' / 5 ; D J O U _etc_mtab_iptr_optr_load_mtab_rewrite_mtab_get_mtab_entry_put_mtab_entry_err_mtab_in_mtab_out_perror_strlen_creat_write___ctype_close_strcpy_read_open_std_err.text.rom.data.bssnlist.o:&  HdUTVWhuYYDžu qWjj0EP=u?}u9}u3UUUMjR ~ UỦ1ZPW tW|Y 1U t9U :t,U B U BU fBFE#UU}9uWjjEP=tWYsE9uMUU z u9UU jEPR uUU EPREEM_WpY+U_^r  1 s    U t  _nlist.blm_strncmp_fread_fclose_fopen_fseek.text.rom.data.bsspeekpoke.o:' <dD\dU=yjhYY=x5UU jR5 jEP5 =tEUUU=yjh rYY=x5UU jR5K jEP57 =tE/dev/mem/dev/mem $9 >M R{   lrmx_peek_poke_write_read_open_lseek.text.rom.data.bsspopen.o:'vd P UVWU :ru1U :wuǃtEPYx Ey1}Ps >t-PYtpY11ۅPtWYY1tEYjuhhh+j!YTM 1tYu tYY_^UVWUzjjYYEjjYYEuYEPY=t 94uuEujYYuj~YYE_^-csh/bin/sh 4 >[ao  }           $ 2 ?  IZ r ~ _popen_pclose_pids__dup2__execl__pipe__fork_fclose_signal__exit__close__wait_fdopen.text.rom.data.bssputenv.o:(1 BdUVW2}u1r:u ]j=uYYEcJ>@UUU:tEG9tU:u?=tȋU=U1U=2=kEt Eu E@k PYƅu U:2u2E u4@k P2YYƅu.2J]1_^  8 *6F Nckz!&,_putenv_malloc_realloc_strchr__penviron.text.rom.data.bssputw.o:)8\(\d\UVWu E}UIMt$JxG^FGVPYYϋV tE_^ >"(-3_putw___flushbuf.text.rom.data.bssregexp.o:,B$:4d$UVW}uh Y1zU h(YEPjAYYu10=|hY1`RgYDžuhVY1UW\ hYEPjYYu1GPGQGTGX]VN Y8|>uNOP>u GQ@GQUPEEt2>u"FPY9EwVUFPYEV YʋUWTUWX_^UVWE }t8= |h\8Y1UURWY E1EP*Yƅu1t VWYYUuE #UE :|uCEPYƅu1VWYYUuE #UE 벃}t U1PYEPWUYYtuVYYV Y}t8)thLY16}u.:t#:)uh<Y1h0Y1_^UVWEjYE1:K:|tF:)tAEPKYDžu1<#UE u#UE  WVfYY릅uj YE_^UVWEPYƅu1 M}*t}+t}?tUE|Uu}?thtY1\}+t]}*uUtVj VYY}*uKVjAYYjYPVYYVVYYjYPVuYYj YPVdYY}+uUtVj YY}+uHjqYWV)YYVj]YPYYjMYPWYYj <YPVYY=}?u7VjYYjYPVYYj YWVYYWV YY:*t :+t:?uhhY1_^UVWEjYjYjYNjEq:^ujeY jSYNj:]t:-uPfY::]:-g:]t:u j-*Y‹JA΋ MA9}hXY19u| VYFxPY^jY:]thH-Y1`EMEPjYYDžu15#UE !h8Y1h$Y1:uhY1jYǡPYjYE h 5_YYƅhMY1 M~}*t }+t}?uNEuEjGYDž~PfYNj[Y_^UVW= u MFFF5 _^U= t  MUVW= u >=   U9} sOPMUY u MFFF_^U VW}t@uVEYDžt>u +U UU )UUˆFUڈ^_^UVutt>uu FPYY^UVW}t} uheY1\thlMY1Tt9u WTPV/YYƅtwXwTV tFՅu1~}t U  Qt u WXYYPu Pt*GPPVYYƅt2VW1YYt FVWYYt Fu1_^UVWU UU( }u(E }~MU]R&YtU EU J(1_^UVWuVFYEo9j1x:T1b:u1P09t1)WoYE=~u5WU t1U:tPFPYYu1:tPFPYYt1r-E=uYtU <u<M1F-E=uzYtU <u< 1U:t VU=FP0Yt =VtYƅt>t1EU:uJM> u1E=FPYEU9U|;}t]9uuYtLMU181hPsY1"aueh<OY1_^U VW15UUnV$YljjU9YGF>tPPuYYt>GF>t5PuYYu#GFhY1Ud5_^UVWuu1*VNu1>u _^out of spaceregexp too bigNULL argumentjunk on endunmatched ()unmatched ()too many ()nested *?+*+ operand could be empty $()**+*.?*[\<^|internal disaster^$.[()|?+*\trailing \?+* follows nothinginternal urpunmatched []invalid [] rangecorrupted programNULL parameter '| # < R o - - - - - - - - - n n n n n n n n n corrupted pointersmemory corruption5 55 internal foulup! #%#+#5#?#C#l!w |# ! ### d y#! ###;#F##! #!  ! #I#! #N#W!k p             #######:#T#a!q v####! #! !+ 0#>!H M#d#j#!# ! ####"#(!0 5#F#L#T#o#~########### #c !  !    # # 8 # # # #                                     $ ( , 0 4 8#% #+ #> #T #f #y  #  # # #  # #  #$ #: #P #{ # # # #$ #E #r !  !  !   d p t x |  #    '!6 ;!K P#V#j)'1:?CyIT ]V h q| y  `   ",27=_regcomp_reg_regbranch_regpiece_regatom_regnode_regc_reginsert_regtail_regoptail_regexec_regtry_regmatch_regrepeat_regnext_regparse_regnpar_regdummy_regcode_regsize_reginput_regbol_regstartp_regendp_malloc_strlen_strcspn.csa4.csb4_strncmp_strchr_regerror.text.rom.data.bssregsub.o:,v1*d*LLUVW}t } t}uh8YUz\thYu }FEЄ}&u E/}\u"=0|=9F-0EE}y}\u>\t>&uFEMG덋UM<t(<tU(M]E+UR4W }׃}>4hYG_^damaged match stringdamaged regexp fed to regsubNULL parm to regsub  4 9  fnw_regsub_strncpy_regerror.text.rom.data.bssstderr.o:-%&%d%UVu>tF+URuj ^ _std_err_write.text.rom.data.bssswab.o:.55d5UVWu} NxEEMEEGMG_^_swab.text.rom.data.bsssyscall.o:.:A1AdAUVWuU VVuYYDžt~~yVډF_^ / $*/5__syscall_errno__sendrec.text.rom.data.bsssysconf.o:/,hdh44UT@ZdS<L1HA:3a ,% EH  %,3:A  $(,0JZ b_sysconf.csa4_errno.text.rom.data.bsstelldir.o:0"&"d"U}u UB _telldir_errno.text.rom.data.bsstermcap.o:1 =dy]aUVW}u YfE=h,YEu EPU:/tHhYEt/u uYYuhuW EhujYYEuE+UMuRQ- uuY1WY-E8\ttF>#tEPVu u&E8|t E8:uuY>t >|t>:tFF<|t<_^UV5t}uEF<:t ~u1tFjuV< uˀ~#uōFP&Y^UV5t}u7F<:t ~u1&tFjuV uθ^UVW5E 8t}u1F<:t ~u1tFjuV{ uˀ~=uŃ>>:F-@   yq iEE}}&-0= sUƒ0UEFԋUN'!F4 GF9GE UE 8E_^U VWEEU:D:%+E"E}uEE EUUˆF+UU}uEE NjUdЙ׹ 0F0F+UU}uEE NjUЙ׃c~d0F ~ 0F 0F+UU(%F"+EU1U FE_^UVuu>t FPUY^r/etc/termcapTERM/etc/termcapTERMCAP. 0123EbfnrtB\4B%+2dBirOOPS  $3B G Z  q      ( M       4@HPX`hpx= p 9  >L  Q}  i p y {  3 t       _capab_tgetent_tgetnum_tgetflag_tgetstr_tgoto_tputsI_8_strlen_atoi.csa4_strncat.csb4___ctype_strncmp_fgets_fclose_fopen_strcmp_getenv.text.rom.data.bssttyname.o:2 ddjnvUHVWEPuYYxU܁ t1hYƅu1VYDžU9uhhYYhhyYYGPhiYYEPhYYYxU uUM9uE]9pE]9`VY VY1_^//dev  4 9 M h m r y ~       _base_ttyname_path_readdir_opendir_strcat_fstat_strcpy_stat_closedir.text.rom.data.bssttyslot.o:3 Yd  UVj$Yƅu jYƅu jYƉ^U VWuYƅu1PjhV t18Et]3VYYu t Gh1_^/dev/ ;M S k }  / _ttyslot_fttyslot_strncmp_ttyname_endttyent_strcmp_getttyent.text.rom.data.bss__exit.o:4(dU$UUEPjj ___exit__syscall.text.rom.data.bss_access.o:5(,4,d,U$U UEPuYYEPj!j  ##__access__syscall__loadname.text.rom.data.bss_alarm.o:6(dU$UUEPjj __alarm__syscall.text.rom.data.bss_cfgetispeed.o:6 $ d oooUUBë__cfgetispeed.text.rom.data.bss_cfgetospeed.o:7 $ d oooUUB ë__cfgetospeed.text.rom.data.bss_cfsetispeed.o:7$dtttUUM J1ð__cfsetispeed.text.rom.data.bss_cfsetospeed.o:8$dtttUUM J 1ð__cfsetospeed.text.rom.data.bss_chdir.o:9!&3&d&U$EPuYYEPj j   __chdir__syscall__loadname.text.rom.data.bss_chmod.o:9',3,d,U$U UEPuYYEPjj  #"__chmod__syscall__loadname.text.rom.data.bss_chown.o::3;0;d;U$uYEU UUUUUEPjj  2 #(.__chown_strlen__syscall.text.rom.data.bss_chroot.o:;"&4&d&U$EPuYYEPj=j   __chroot__syscall__loadname.text.rom.data.bss_close.o:;(dU$UUEPjj __close__syscall.text.rom.data.bss_closedir.o:<L:6:d:U}u UEuYuY * 3!'.6<AG__closedir_free_errno__close.text.rom.data.bss_creat.o:=',3,d,U$U UEPuYYEPjj  #"__creat__syscall__loadname.text.rom.data.bss_dup.o:=$dxxxUjju  __dup__fcntl.text.rom.data.bss_dup2.o:@qY4YdYUVu x~ 5juYYy9uuVYVju ^ ' C O=DLS[afl__dup2__fcntl_errno__close.text.rom.data.bss_execl.o:@2dU2E Pu   __execl__penviron__execve.text.rom.data.bss_execle.o:A9(9d9UVu} t VփzuV֋RURE Pu ^ / __execle__execve.text.rom.data.bss_execlp.o:A(dwwwUE PuYY  __execlp__execvp.text.rom.data.bss_execv.o:B2dU2u u   __execv__penviron__execve.text.rom.data.bss_execve.o:C G d qqqULVWE1EEU UE8t+0YE9uvEEEE͋UUE8t(0YE9uvEEEЃ E V!փ}u sKVt >:tFG9}s/GuWXYYEPuJYY=t42u u. =t Ũ}t} uFuURYỦ_^PATH  % 1 7 F ^o       __execvp__sbrk_strlen_errno_strchr__penviron_getenv_strcpy__stat__execve.text.rom.data.bss_fcntl.o:D .`d`,,U(VuEEV֋RUV֋RU E UUU UEPj7j ^AAA'''  $(5 = V__fcntl.csa4__syscall.text.rom.data.bss_fork.o:E'd|||U$EPjj __fork__syscall.text.rom.data.bss_fpathconf.o:F:7d0033U EPuYYt vU@u]VOHA:3,% E c GNU\cqxj  $(,  $*/5__fpathconf.csa4_errno__fstat.text.rom.data.bss_fstat.o:G$($d$U$UUU UEPjj __fstat__syscall.text.rom.data.bss_getcwd.o:H3%Bd<j<UVW}E 0?tG9}s 9usON9uu N/E 01_^U VuU>t3FuF>t>/uEuYyUȋU1^UVW}t} w1?Uu NEPh8#YYy1E4EPuYYyV9Y1E]9uUM9uYDžuVY1E]9u1EfEWYEu=+WYWvYVY1_EEMUh0RuN/9us VuYYE_^óxB../...... N v   $     1 j z              )6 >         B #(._addpath_recover__getcwd__chdir__readdir.csa4.blm__opendir__rewinddir_errno_strcmp_strcpy__stat__closedir.text.rom.data.bss_getegid.o:H)*)d)U$EPj/j yE __getegid__syscall.text.rom.data.bss_geteuid.o:I)*)d)U$EPjj yE __geteuid__syscall.text.rom.data.bss_getgid.o:J)dU$EPj/j  __getgid__syscall.text.rom.data.bss_getgroups.o:J"dkkkU1ç__getgroups.text.rom.data.bss_getpgrp.o:K*d|||U$EPj?j __getpgrp__syscall.text.rom.data.bss_getpid.o:L)d|||U$EPjj __getpid__syscall.text.rom.data.bss_getppid.o:L&*&d&U$EPjj yE __getppid__syscall.text.rom.data.bss_getuid.o:M)dU$EPjj  __getuid__syscall.text.rom.data.bss_ioctl.o:N*(*d*U$UUU UUUEPj6j !__ioctl__syscall.text.rom.data.bss_isatty.o:O+dU$EPuYY1ۅÉ __isatty__tcgetattr.text.rom.data.bss_kill.o:O$'$d$U$UUU UEPj%j __kill__syscall.text.rom.data.bss_link.o:PEF/FdFU$uYEu YEUUU UEPj j   =%/5:@__link_strlen__syscall.text.rom.data.bss_lseek.o:Q8(8d8U$UUU UUUEPjj yE ! __lseek__syscall.text.rom.data.bss_mkdir.o:Q-505d5U$uYEU UUUEPj'j  , "(__mkdir_strlen__syscall.text.rom.data.bss_mkfifo.o:R'dU U jRu __mkfifo__mknod.text.rom.data.bss_mknod.o:S:B0BdBU$uYEU UUUUUEEPjj  9 $*/5__mknod_strlen__syscall.text.rom.data.bss_mktemp.o:Svu1qdqU VWEu>tFN>Xu E0EEF>t&azjuYYyEG߸_^/  ViENW`fkq__mktemp__getpid__access.text.rom.data.bss_mount.o:TLL0LdLU$uYEu YEUUUUU UEPjj   C$,6<AG__mount_strlen__syscall.text.rom.data.bss_open.o:Uyc:cdcU(VuU @t*uYEU UV֋RUUUEPuYYU UEPjj ^  D Y?FNXcint__open_strlen__syscall__loadname.text.rom.data.bss_opendir.o:V Ud___U0VWEPuYYy1U؁@t1huYYDžy1EPWYYxSU؁@u7jWlYYEx& PjWU xh$DYƅuUW.YUЉ1FfFF_^ 5 M fr    GQY`how__opendir_malloc__open__fcntl_errno__close__fstat__stat.text.rom.data.bss_pathconf.o:WR;;;d;UVjuYYƅyu VYYEVYE^  % 0"-4<BGM__pathconf_fpathconf__open__close.text.rom.data.bss_pause.o:W(d|||U$EPjj __pause__syscall.text.rom.data.bss_pipe.o:X6'6d6U$EPj*j yUEUMJ1  __pipe__syscall.text.rom.data.bss_ptrace.o:YFN0NdNU$U UUUUUUUEPjj y}u E 'A&06;A__ptrace_errno__syscall.text.rom.data.bss_read.o:Y*'*d*U$UUUUU UEPjj !__read__syscall.text.rom.data.bss_readdir.o:Z6dSSSUVWuu 1FQh^ SP fF^1FfFV VF=uFF~u~. VffGVjRGPX GWBVVFWB)ډfFWBV4_^ 3 __readdir__read_memcpy_errno.text.rom.data.bss_rename.o:[GF1FdFU$uYEu YEUUU UEPj&j   ='17<B__rename_strlen__syscall.text.rom.data.bss_rewinddir.o:\,duuuUjuYY  __rewinddir__seekdir.text.rom.data.bss_rmdir.o:\!&3&d&U$EPuYYEPj(j   __rmdir__syscall__loadname.text.rom.data.bss_setgid.o:])dU$EEEPj.j __setgid__syscall.text.rom.data.bss_setsid.o:^)d|||U$EPj>j __setsid__syscall.text.rom.data.bss_setuid.o:_)dU$UUEPjj __setuid__syscall.text.rom.data.bss_sigaction.o:`2191d1U$UUU UUUEEPjGj  ("'-__sigaction__syscall___sigreturn.text.rom.data.bss_sigpending.o:`.-.d.U$EPjIj y UEE  __sigpending__syscall.text.rom.data.bss_sigprocmask.o:a:X.XdXU$} uEEUUE UEPjJj y}tUEE 3 $*/5__sigprocmask__syscall.text.rom.data.bss_sigreturn.o:b Td$UHVuUVUVUV UVUЋU UEPY^UVuEPYjEPj V 5hjKj} ^ I W c k q v :__sigjmp__sigreturnI_1__sigprocmask__sigfillset__syscall.text.rom.data.bss_sigset.o:b ^dU} vM E 1U} vM ҋE!1UE1UE1U} vM Et1 8-\l|__sigaddset__sigdelset__sigemptyset__sigfillset__sigismember_errno.text.rom.data.bss_sigsetjmp.o:c(+5+d+UEtu uYY u uYY  # #_siglongjmp__longjmp_longjmp.text.rom.data.bss_sigsuspend.o:d - d U$EUEPjHj __sigsuspend__syscall.text.rom.data.bss_sleep.o:e}dOOOUU$VWEPYEPEPj jYƋ}t9uvEEPYEEPEPj WYUUjEP}YYEPrYWjiYZ)‰jEPjV jEPjF t9r)օu j*YV!YU)_^  " , D M d m        gpx_handler__sleep_sigprocmask_alarm_sigfillset_sigsuspend_sigaction_raise_sigemptyset_sigdelset.text.rom.data.bss_stat.o:e,5/5d5U$uYEUUU UEPjj  , !'__stat_strlen__syscall.text.rom.data.bss_stime.o:f ( d U$EUEPjj __stime__syscall.text.rom.data.bss_sync.o:g'd|||U$EPj$j __sync__syscall.text.rom.data.bss_tcdrain.o:g(d{{{Ujh T u __tcdrain__ioctl.text.rom.data.bss_tcflow.o:h'd}}}UE PhT@u __tcflow__ioctl.text.rom.data.bss_tcflush.o:h(d}}}UE PhT@u __tcflush__ioctl.text.rom.data.bss_tcgetattr.o:i*d|||Uu hT$u __tcgetattr__ioctl.text.rom.data.bss_tcsendbreak.o:i,d}}}UE Ph T@u __tcsendbreak__ioctl.text.rom.data.bss_tcsetattr.o:jc7KdKUV& T$@, T$@% T$@E uVu ^  - 5 Agsy__tcsetattr.csa4_errno__ioctl.text.rom.data.bss_time.o:k4'4d4U$EPj j y}tUEE  __time__syscall.text.rom.data.bss_times.o:k%I(IdIU$VuEEPj+j yUUVUVUV E^  __times__syscall.text.rom.data.bss_umask.o:l#(#d#U$UUEPj _9d9HH  UVWu>*uEERE F%1-0Ex}  k }FE 8_^UVWu}u}tBEv#JM_}tRUGRU8}tRU#RU`#U }t/}y -F]U t+F U t FUUU t }ou0F}u}`U t }xt }Xt}pu?0F}XuXxF$E)E E EE>uVuu/ƀ}Xu9utUPYUE_^U4VWuEEEE }%MJxUʋFF VuYY=u}t UډE1!,'"U`MEtUUԍE PEPu, E9EtU:.u+EUUԍE PEPu E}xt }y]uEttUЉU$ E#@EπE UmJxUʋFF VuJYY=u}t UډdZE0 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuE@UЉU}u 8U:,EMu E }ptEjuPuWE PEu EEjuPuWE PcEU U MREt }uEuE}rEEuPuWE PE6U U RU U RUEEE]E tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UUaUUU؃}\ME؋JxEEFFEEVPYY=}t UډmEJxEEFFEEVP.YY=t6JxEEFFEEVPYY=u}t UډJxUʋFF VuYY=u}t UډMuUUMRJxEEFFEEVPJYY=u}t UډdZ}~UUM#JxUʋFF VuYY=u˃}t Uډ E_^ i@Xbdiopux #+-0Luh_ljE)GXbcde)f)ginoprms9ux(null) $,4<DLT\     `lt| $,4< P      O a   p   L  e k St }    _gnum_o_print__doprnt__f_print__i_compute___flushbuf.csb4_toupper.text.rom.data.bssdoscan.o:{a; C dC    UVWu }E$E)E EEE-t+u-U EMtJxFFSXVYǃ}0}U EMtJxFFSXV9YǃxtXt}iNEB}tG?%u2JxFFSXVYEE}%GE?*uGM-0= GME-0= s*Gk] Ã0]߃M GM@GM܀G HE=cF}[t@}nt:JxFFSXVYEEuՃ}}nJxFFSXVYE=Eu}u}tEEWU tEUURf5U@tUURM UURM Et }vE}uE E]SuPVuE=r}u8-t8+uEE-EE}dt}iuuEPhX EuEPh? EU@tUURM )U t#UMMIfUURM EuEEuUURU}uE}C}t=Eu UMЈ EMt׋JxFFSXVgYEE볃}b}t VuEYYMIEuEEuUURU}uED}P}FEu:EuUEMtʋJxFFSXVYEEEuU}}t VuYYMEuE}uEG?^u EGEE}s UE?]u Gƀ?Z?]QGƀ?-uG?t2?]t-G9"G@E9EEƀEG-띀?uEE3]uVuYYEEuUURUEu UMЈ EMt"JxFFSXV;YEE}t}tE3]u}t}t VuYYMEUEt }vE}uEuVu E=r}u8-t8+uEE-EEEPhfYYEȉŰU€tUURM̉JKU@tUURMȋ]̉ Z*uuYUURY hEEEu }ntEGV}u}tE_^IXb2d io)pu xLhlE G X [ b cd e f g i no p su x  $,4<D@ E y  N   7 z   $ q    ,HT\dht|    ) c  -: qR[w       H y     4 C ] k    S \ x      B _o_collect_f_collect__doscan_Xtable_inp_buf_ungetc.csb4___fillbuf___ctype_strtoul_strtod_strtol__fp_hook.cff4.text.rom.data.bssecvt.o:{ nOndnU EPu u uuuuEPUjuuuu uUjuuuu u  )Z_2fPm{_cvt__ecvt__fcvt__dbl_ext_cvt__ext_str_cvt__fp_hook.text.rom.data.bssfclose.o:|= Zd   UVW11}U9u F߃| juYtUrYtURtUzt rY}t}t}t u`Y_^ = R x  '-28_fclose___iotab_free___stdout_fflush___stderr___stdin__close.text.rom.data.bssfeof.o:d{{{UU#J1÷_feof.text.rom.data.bssferror.o:d{{{UU #J1÷_ferror.text.rom.data.bssfflush.o: Bd   UVWuEu41}%<t4YtEG֋E ~tV€uFu1V€cE~tVuډUjuv] =uN VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<tBt 4aYF^ *  " E|n_fflush___cleanup___iotab__lseek__write.text.rom.data.bssfgetc.o:&(&d&UVuJxFFSXVY^ _fgetc___fillbuf.text.rom.data.bssfgetpos.o:#&#d#UuY] =u1 _fgetpos_ftell.text.rom.data.bssfgets.o:Gk(kdkUVWu}M } ~/JxFFSXVYE=t G} uȃ}uVt 9}u1 1E_^ .&17<B_fgets___fillbuf.text.rom.data.bssfileno.o:  d oooUUBë_fileno.text.rom.data.bssfillbuf.o: <E<d<UVWu~y V0t VuN FtN V€uNVu+~u%h|YF~uN NF 1}9<t,R@tBt 4%YGƒ~uFFF VVv vv >uNN FFSX_^   Xcgpx___fillbufI_1___iotab_malloc__read_fflush.text.rom.data.bssflushbuf.o: jd!!!UVW}Wu u ƅ~9})׉U U 1_^UVWu }~y UVu CV€tu ,fNV~u>5FNV_iqw|_do_write___flushbuf___cleanup__clean__lseek_malloc__isatty___stdout__write.text.rom.data.bssfopen.o:{ Kxdx88UVWEE11<tN|1DFρECEE0-EMP1E E {U :t! EE E  RU uuu?YYEy@Ut8hu!YYE~" tuYuuYYE}y1]jYEu uY1A!uEUMJUzUBUE_^kaXr3wB+b  ,4|        *m07@HOW]ekpv_fopen___iotab_malloc__open__creat.csb4__close.text.rom.data.bssfprintf.o:(dUUUuuu _fprintf__doprnt.text.rom.data.bssfputc.o: /)/d/UVu JxUʋFF VuYY^ &_fputc___flushbuf.text.rom.data.bssfputs.o:8[)[d[UVWu }E?t:JxG^FSX GVPYY=uEE_^ ;"(-3_fputs___flushbuf.text.rom.data.bssfread.o:Nr(rdrUVWu}E} LU9U@U UJxFFSXVYE=tGE MuE봋E_^ H&-8>CI_fread___fillbuf.text.rom.data.bssfreopen.o:pmdm88  UVW}EEL#WUWYwYYYEyAUt9hu YYEy# UtuYuuYYE}yC1}9<u FtttWY1UWUW_^kaWr6wC+b      , 4 &  / |      % 4<D Lu~_freopen___iotab_free___stdout__open__creat.csb4_fflush___stderr___stdin__close.text.rom.data.bssfscanf.o:'dUUURu u _fscanf__doscan.text.rom.data.bssfseek.o:}-dUVWu1fϋV€t}u ~tu>FtVYU )uRv EVt tfVV}u1_^ ? QPW_gmrx_fseek__lseek_fflush.text.rom.data.bssfsetpos.o:&d{{{UE j0u _fsetpos_fseek.text.rom.data.bssftell.o:Ho%odoUVWuEV€t ډU)Ft~tVu V+VUEjjv ǃu}_^ T#*28=C_ftell__lseek.text.rom.data.bssfwrite.o:Su*uduU VW}uE} OU9UCU UJxʋGG WPYY=uEFMuE뱋E_^ Q)1=CHN_fwrite___flushbuf.text.rom.data.bssgetc.o:&'&d&UVuJxFFSXVY^ _getc___fillbuf.text.rom.data.bssgetchar.o:L131d1UJxSX hY % *"-6<AG_getchar___fillbuf___stdin.text.rom.data.bssgets.o:^f0fdfUVW}JxFFSXVYE=t } tGσ}uVt 9}u1 1E_^ '.4?HNSY_gets___fillbuf___stdin.text.rom.data.bssicompute.o:W"WdWUVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^ __i_compute.text.rom.data.bssperror.o:X [dUVW5YNj5hYhY}t.U:t&uYPuV jhV WYPWV jhV~ _^ :    % * A L V \ e n x ~!)3:BHMS_perror_strerror_strlen___stdout_fflush___stderr_errno__write.text.rom.data.bssprintf.o:!1!d!UU Uhuu   _printf__doprnt___stdout.text.rom.data.bssputc.o: /(/d/UVu JxUʋFF VuYY^ &_putc___flushbuf.text.rom.data.bssputchar.o:W:5:d:UJxUʡhuYY * 2"+5AGLR_putchar___stdout___flushbuf.text.rom.data.bssputs.o:2dUVW}E?t:JxG^FSX GVPYY=uB4BdBUUURu huUUURuu u  9 "(.39_sprintf_snprintf_vsnprintf.text.rom.data.bsssscanf.o:=F/FdFU UUEEUUUUuYEuu EP * ='-28_sscanf_strlen__doscan.text.rom.data.bsstmpfile.o:# KpdpUV=u8hhYZУj5j PhhYYƅu1 hY^wb+/tmp/tmp. !) 0 6>FK Pa f _tmpfile_strlen__i_compute__getpid_remove_fopen.text.rom.data.bsstmpnam.o:| Cd-U=uGhhYZУj5j P.Bv jj5j 5wZ}thu^YY/tmp/tmp.   ( / 5=CLU\jx  9AIU^flqw_tmpnam_strlen__i_compute__getpid_strcpy.text.rom.data.bssungetc.o:UUdUUVWu }tV€u4V9Vu>t FN~U9tUE_^_ungetc.text.rom.data.bssvfprintf.o:)dzzzUuuu  _vfprintf__doprnt.text.rom.data.bssvprintf.o:2d|||Uhu u   _vprintf__doprnt___stdout.text.rom.data.bssvscanf.o:0d|||Uu uh   _vscanf__doscan___stdin.text.rom.data.bssvsprintf.o:@dUEEUUUUU JUEPuu EUJUx ]E EPjYYEUuu hu 2 \Vagkt_vsnprintf_vsprintf__doprnt___flushbuf.text.rom.data.bssvsscanf.o:8@0@d@UEEUUUUuYEuu EP $ 7"(-3_vsscanf_strlen__doscan.text.rom.data.bss_exit.o:n( Y`h__exit___exit.textaccess.o:p( Yaj_access__access.textalarm.o:n( Y`h_alarm__alarm.textbrk.o:j( Y^d_brk__brk.textcfgetispeed.o:z!( Yft_cfgetispeed__cfgetispeed.textcfgetospeed.o:z!( Yft_cfgetospeed__cfgetospeed.textcfsetispeed.o:z!( Yft_cfsetispeed__cfsetispeed.textcfsetospeed.o:z!( Yft_cfsetospeed__cfsetospeed.textchdir.o:n( Y`h_chdir__chdir.textchmod.o:n( Y`h_chmod__chmod.textchown.o:n( Y`h_chown__chown.textchroot.o:p( Yaj_chroot__chroot.textclose.o:n( Y`h_close__close.textclosedir.o:t( Ycn_closedir__closedir.textcreat.o:n( Y`h_creat__creat.textdup.o:j( Y^d_dup__dup.textdup2.o:l( Y_f_dup2__dup2.textexecl.o:n( Y`h_execl__execl.textexecle.o:p( Yaj_execle__execle.textexeclp.o:p( Yaj_execlp__execlp.textexecv.o:n( Y`h_execv__execv.textexecve.o:p( Yaj_execve__execve.textexecvp.o:p( Yaj_execvp__execvp.textfcntl.o:n( Y`h_fcntl__fcntl.textfork.o:l( Y_f_fork__fork.textfpathconf.o:v( Ydp_fpathconf__fpathconf.textfstat.o:n( Y`h_fstat__fstat.textgetcwd.o:p( Yaj_getcwd__getcwd.textgetegid.o:r( Ybl_getegid__getegid.textgeteuid.o:r( Ybl_geteuid__geteuid.textgetgid.o:p( Yaj_getgid__getgid.textgetgroups.o:v( Ydp_getgroups__getgroups.textgetpgrp.o:r( Ybl_getpgrp__getpgrp.textgetpid.o:p( Yaj_getpid__getpid.textgetppid.o:r( Ybl_getppid__getppid.textgetuid.o:p( Yaj_getuid__getuid.textioctl.o:n( Y`h_ioctl__ioctl.textisatty.o:p( Yaj_isatty__isatty.textkill.o:l( Y_f_kill__kill.textlink.o:l( Y_f_link__link.textlseek.o:n( Y`h_lseek__lseek.textmkdir.o:n( Y`h_mkdir__mkdir.textmkfifo.o:p( Yaj_mkfifo__mkfifo.textmknod.o:n( Y`h_mknod__mknod.textmktemp.o:p( Yaj_mktemp__mktemp.textmount.o:n( Y`h_mount__mount.textopen.o:l( Y_f_open__open.textopendir.o:r( Ybl_opendir__opendir.textpathconf.o:t( Ycn_pathconf__pathconf.textpause.o:n( Y`h_pause__pause.textpipe.o:l( Y_f_pipe__pipe.textptrace.o:p( Yaj_ptrace__ptrace.textread.o:l( Y_f_read__read.textreaddir.o:r( Ybl_readdir__readdir.textreboot.o:p( Yaj_reboot__reboot.textrename.o:p( Yaj_rename__rename.textrewinddir.o:v( Ydp_rewinddir__rewinddir.textrmdir.o:n( Y`h_rmdir__rmdir.textsbrk.o:l( Y_f_sbrk__sbrk.textseekdir.o:r( Ybl_seekdir__seekdir.textsetgid.o:p( Yaj_setgid__setgid.textsetsid.o:p( Yaj_setsid__setsid.textsetuid.o:p( Yaj_setuid__setuid.textsigaction.o:v( Ydp_sigaction__sigaction.textsigaddset.o:v( Ydp_sigaddset__sigaddset.textsigdelset.o:v( Ydp_sigdelset__sigdelset.textsigemptyset.o:z!( Yft_sigemptyset__sigemptyset.textsigfillset.o:x( Yer_sigfillset__sigfillset.textsigismember.o:z!( Yft_sigismember__sigismember.textsigpending.o:x( Yer_sigpending__sigpending.textsigprocmask.o:z!( Yft_sigprocmask__sigprocmask.textsigreturn.o:v( Ydp_sigreturn__sigreturn.textsigsuspend.o:x( Yer_sigsuspend__sigsuspend.textsleep.o:n( Y`h_sleep__sleep.textstat.o:l( Y_f_stat__stat.textstime.o:n( Y`h_stime__stime.textsvrctl.o:p( Yaj_svrctl__svrctl.textsync.o:l( Y_f_sync__sync.texttcdrain.o:r( Ybl_tcdrain__tcdrain.texttcflow.o:p( Yaj_tcflow__tcflow.texttcflush.o:r( Ybl_tcflush__tcflush.texttcgetattr.o:v( Ydp_tcgetattr__tcgetattr.texttcsendbreak.o:z!( Yft_tcsendbreak__tcsendbreak.texttcsetattr.o:v( Ydp_tcsetattr__tcsetattr.texttime.o:l( Y_f_time__time.texttimes.o:n( Y`h_times__times.textumask.o:n( Y`h_umask__umask.textumount.o:p( Yaj_umount__umount.textuname.o:n( Y`h_uname__uname.textunlink.o:p( Yaj_unlink__unlink.textutime.o:n( Y`h_utime__utime.textwait.o:l( Y_f_wait__wait.textwaitpid.o:r( Ybl_waitpid__waitpid.textwrite.o:n( Y`h_write__write.textadd64.o:g (D$T$T$T$ T$PZa_add64.textadd64u.o:|(D$T$T$T$ Pemv_add64u_add64ul.textcmp64.o:9$9(91Q+Q QQQ +QQQÉqAAÝ$$_cmp64cmp64_cmp64u_cmp64ul.textcv64u.o:r(D$|$t]dl_cv64u_cv64ul.textcvu64.o:s(D$T$@^em_cvu64_cvul64.textdiff64.o:W  ( D$+D$ IQ_diff64.textdiv64u.o:(1ҋD$t$ D$t$ Yiqy_div64u_rem64u.textex64.o:l  ( D$ËD$V^f_ex64lo_ex64hi.textmake64.o:`(D$T$T$ PRZ_make64.textmul64u.o:b(L$D$d$ QT\_mul64u.textsub64.o:g (D$T$+T$T$ T$PZa_sub64.textsub64u.o:|(D$T$+T$T$ Pemv_sub64u_sub64ul.textalloca.o:d{{{YX $)ĉs3P_alloca.text.rom.data.bssget_bp.o:dgggã_get_bp.text.rom.data.bssgetprocessor.o:FX6XdXU7t. &t`kdVD$aÜX1PXR1ЅE+G06;A_getprocessorgotprocessorflip.text.rom.data.bssiolib.o:mdUU1]UU1f]UUE ]UUE f]UWU} M_]UWU} Mf_]UVUu M^]UVUu Mf^]U]U]Ö #0BWi~_inb_inw_outb_outw_rep_inb_rep_inw_rep_outb_rep_outw_intr_disable_intr_enable.text.rom.data.bssoneC_sum.o: I< UVWEu }10ttOF"FFF FFsst#ff_^] z.@Ypz_oneC_sumalignalignedadd6add6testadd1add1testdonemask.text.rom__sigreturn.o:/dlll ___sigreturn__sigreturn.text.rom.data.bss_sendrec.o: <Z<d<USE] ![]USE] ![]USE] ![]<AIN!U] elv(SENDRECEIVEBOTHSYSVECSRCDESTMESSAGE__send__receive__sendrec.text.rom.data.bssbrksize.o:'dddh__brksizeendbss.text.rom.data.bss_memmove.o: SNSdSUVW}u M)9r/r uu fE_^]t|;EN(V5]<d>iEsy~__memmove__memcpyuplwordupwordupbytedonedownwards.text.rom.data.bss_strncat.o:0$0d0UVW}0OW} uA)ʉыu _󤪋E_^]__strncatno0.text.rom.data.bss_strncmp.o:+-+d+UVWtu} u ~tIu(_^] __strncmpcomparedone.text.rom.data.bss_strncpy.o: d{{{} 0)ʇʋu }÷__strncpy.text.rom.data.bss_strnlen.o:$dUW}0ʀuA)_]__strnlenno0.text.rom.data.bssbcmp.o:  * d Uuu ut +UJE)  _bcmpequal_memcmp.text.rom.data.bssbcopy.o:'duuuD$D$D$  _bcopy__memmove.text.rom.data.bssbzero.o:%dvvvUu ju  _bzero_memset.text.rom.data.bssindex.o:%diii _index_strchr.text.rom.data.bssmemchr.o: & d UW}E MuG_]1_]_memchrfailure.text.rom.data.bssmemcmp.o:e _6_d_UVWu} Mr6 u.uAfA(_^]/7 >6DJJLOUZ`_memcmpclwordcwordcbytelast.text.rom.data.bssmemcpy.o:'dwwwUVW}u M _memcpy__memcpy.text.rom.data.bssmemmove.o:)diii _memmove__memmove.text.rom.data.bssmemset.o:Q K6KdKUW}E Mr/u'uĉ fE_]#$*:0C6E;AFL_memsetslwordswordsbytedone.text.rom.data.bssrindex.o:'diii _rindex_strrchr.text.rom.data.bssstrcat.o: ( d nnn _strcat__strncat.text.rom.data.bssstrchr.o:2)2d2UW}0))ϊE tu1_]XG_] +_strchrnextfound.text.rom.data.bssstrcmp.o: ( d nnn _strcmp__strncmp.text.rom.data.bssstrcpy.o:(dzzzUVWE_^]  _strcpy__strncpy.text.rom.data.bssstrlen.o: ( d nnn _strlen__strnlen.text.rom.data.bssstrncat.o: ) d mmmT$ _strncat__strncat.text.rom.data.bssstrncmp.o: ) d mmmL$ _strncmp__strncmp.text.rom.data.bssstrncpy.o:)d|||UVWME_^]  _strncpy__strncpy.text.rom.data.bssstrnlen.o: ) d mmmL$ _strnlen__strnlen.text.rom.data.bssstrrchr.o:('(d(UW}0OE uG_]1_]#_strrchrfailure.text.rom.data.bss,__.SYMDEF:X$  | ((/(5(=(E(U(a(j(t({(((((((((((((((((((0(8(E(R(^(k(w((((((((((((((((((( ((((((#('(+(/(3(7 ?#F2%O,(Y()`8*g+o+w<1~<1<1<1<1<1<1^3^366666666 \=\=%@1@<~AA~AH~AN~AV~AZ~A`~Ah~ArF|FlGlGlGlGlGlGlGlGlGFIJSWX $\0]_*`2,b=cEdMgVh^^jekmmujop_beep_winch_mvinch_mvwinch_curs_set_fatal_outc_poscur_clrscr__cursgraftable__cursident_setterm_gettmode_LINES_COLS_NONL_curscr_stdscr__orig_tty__tty_ACS_ULCORNER_ACS_LLCORNER_ACS_URCORNER_ACS_LRCORNER_ACS_RTEE_ACS_LTEE_ACS_BTEE_ACS_TTEE_ACS_HLINE_ACS_VLINE_ACS_PLUS_ACS_S1_ACS_S9_ACS_DIAMOND_ACS_CKBOARD_ACS_DEGREE_ACS_PLMINUS_ACS_BULLET_ACS_LARROW_ACS_RARROW_ACS_DARROW_ACS_UARROW_ACS_BOARD_ACS_LANTERN_ACS_BLOCK__cursvar_termcap_tc_ttytype_arp_cp_cl_cm_so_se_mr_me_mb_md_us_ue_vi_ve_vs_as_ae_bl_vb_endwin_flash_initscr_longname_wmove_mvcur_newwin_subwin_idlok_clearok_leaveok_scrollok_nodelay_keypad_meta_overlay_overwrite_wprintw_printw_mvprintw_mvwprintw_wscanw_scanw_mvscanw_mvwscanw_wrefresh_wnoutrefresh_wsetscrreg_setscrreg_raw_noraw_echo_noecho_nl_nonl_cbreak_nocbreak_wtabsize_tabsize_fixterm_resetterm_saveoldterm_saveterm_baudrate_erasechar_killchar_savetty_setupterm_unctrl_doupdate_waddch_waddstr_wbox_wclear_wclrtobot_wclrtoeol_wdelch_wdeleteln_werase_wgetch_wgetstr_delwin_mvwin_winsch_scroll_winsertln_touchwinbeep.o:7 C1CdCU=thj5 =thj5   %-5 :SY_cgnty_beep_outc_bl_vb_tputs.text.rom.data.bsscharpick.o:8 =dUUER8][Uu u5 =u# R8[UVuuu V =uN8^^* /FLW xi_winch_mvinch_mvwinch_stdscr_wmove.text.rom.data.bsscurs_set.o:8 ?dU=hj5 q=dhj5 M=thj5 -=t$hj5r E`à/S   #1=E JU]e ju}  R\bhlpt{_curs_set_outc.csa4_ve_vi_vs_tputs.text.rom.data.bsscursesio.o::yOdd dnUuhh jYUJxUhuYYUh"juu 5 P Uh"j5k UVWuhQYY=t dEPhTj. u>UtE h`YUtE h\Y hXYhTYhhPYYhhLYYhhHYYhhDnYYhh@XYYhh<BYYhh8,YYhh4YYhh0YYhh,YYhh(YYhh$YYhh YYhhYYhh|YYhhfYYhhSYYhh =YYt,>t'1l9tGF Fԋ480,XT\`Hd<@P $(o 1_^UhjYYhjYY1P1ۅÉ P1@u@1ۅÉcurses: %s vbblacaeasvsveviueusmdmbmemrcmsesoclcolicoli><v^#: #+'#+++++- - _++++|+,.-0ahI`fgjklmnopqrstuvwx~LC G B@'@.@8@>@G AOK[/i Fn JwK. J) ? EL DL D  L D#L( D- 3,9*=,BLG IL.S,XL] Ib0i,nLs Ix1,L I/,L I2,L I3,L I4,L I5,L I6,L  I7,L# I(8/,4L9 I>9E,JLO IT:[,`Le Ij;q,vL{ I<,L I,L I=,L I>MMMMMM &M,2M8>MDJMPVM\bMhnMtzMMMMMM M!M"M#M$M%M&M'  . H5< HCL([b(ry( "Wl#,*6=CIQY$d$jx -9EQ]it (18?HS\cint_fatal_outc_poscur_clrscr__cursgraftable__cursident_setterm_gettmode_LINES_COLS_NONL_curscr_stdscr__orig_tty__tty_ACS_ULCORNER_ACS_LLCORNER_ACS_URCORNER_ACS_LRCORNER_ACS_RTEE_ACS_LTEE_ACS_BTEE_ACS_TTEE_ACS_HLINE_ACS_VLINE_ACS_PLUS_ACS_S1_ACS_S9_ACS_DIAMOND_ACS_CKBOARD_ACS_DEGREE_ACS_PLMINUS_ACS_BULLET_ACS_LARROW_ACS_RARROW_ACS_DARROW_ACS_UARROW_ACS_BOARD_ACS_LANTERN_ACS_BLOCK__cursvar_termcap_tc_ttytype_arp_cp_cl_cm_ "#$%&'()*+,-./0123456so_se_mr_me_mb_md_us_ue_vi_ve_vs_as_ae_bl_vb_tgetent___stdout___flushbuf_exit___stderr_tgetnum_ioctl_tgoto_fprintf_tcgetattr_tgetstr_tputs.text.rom.data.bssendwin.o::vvdvUjYJjRYY5Yhj5 5Y5Y5Yhjj 1    #)1  6?  D K  P W  \b k2:DKV\goy}_endwin_curs_set_LINES__orig_tty_outc_tcsetattr_stdscr_wrefresh_me__cursvar_poscur_curscr_delwin_tputs.text.rom.data.bssflash.o:; C2CdCU=thj5 =thj5   %-5 :SZ`dhouz_flash_outc_bl_vb_tputs.text.rom.data.bssinitscr.o:<rd!!UhYEu1uYjj55u1^jj55u19jj55qu1j5TYYTERM   # )39 > F[a f n  mv_initscr_clearok_gettmode_LINES_stdscr_COLS_newwin_setterm_getenv__cursvar_curscr.text.rom.data.bsslongname.o:= d n~~Unot implemented_longname.text.rom.data.bssmove.o:=99d9UVu}xU9V | U 9VD9VH} UVU 1^_wmove.text.rom.data.bssmvcursor.o:>y E<EdEUVWu}9=~95~xyVWYY=51_^  -5;=DKQ[cint_mvcur_LINES_COLS__cursvar_poscur.text.rom.data.bssnewwin.o:?V `R`d`UVW}jLYƅu djWYYF8uVYBjWYYFuEډ]؋E-E=t"E9~EډE؋]9} E؋]EE4_^U(VW} UO 9J }B G E܋UO9J}BGE#WUwuEډ]؋E-E=t"E9~EډE؋]9} E؋]EE&_^"#_overlay_overwrite.text.rom.data.bssprntscan.o:B8d444UUURu h huYY=u hYUU URuh h5YY=u hrYUUUu u5R =u>uuh1 h5YY=u hYUUUuu u =u;uuh huYY=u hYUUUuYhuwYY=uuu hW UU U5;Yh5*YY=uuuh UUUu u5 =u?5Yh5YY=uuuh UUUuu u| =u9ucYhuUYY=uuuh5    &;  @X  ]e k p          1  6> F[  `  w}            +  06 < A\ a      G g%.j8FNX`gqz_wprintw_printw_mvprintw_mvwprintw_wscanw_scanw_mvscanw_mvwscanw_printscanbuf_strlen_vsprintf_stdscr_wmove_wrefresh_vsscanf_waddstr_wgetstr.text.rom.data.bssrefresh.o:C uJuduU9Uu B$ uYU(VWuUVUVUEUU؋U9VN<< t'WuYY9=~> tۋPYGGEhY_^UVWMR<UR@UR8]׋R8]֋U9UW9uU9Ut:uu YYU9Uы9uU9Ut6YEӋE띋MR<MR@_^UVz$t5Y=z$t5Y#195~R<9~HEV8N  MV8M MU9Uw:EU9t*UU}uV8M+ șEUEE뾃}IVVU#V UV8N  MEV8M MMU9Uw:EU9t*UU}uV8M+ șEUEE뾃}IVVUV UV8M MV8M MMU9UsEEEE#V EV@M V<9~H~%BN8^8V<V@N G֋V<V@N VHN8]V UUU9UwUEE1_^7BHMS_wdeleteln.text.rom.data.bsswerase.o:Q1ssdsUVWu#V U~D9~H>V8UN UU9UwUEEV<V@N G빋VDF_^!&,_werase.text.rom.data.bsswgetch.o:R ed<<<UVWu1~,u#VtV J9VuVJ9u =t= uGJxSX hYE=tAVVNRQ5b =tEP5HYYEPV;YYt0E_^8A IPW^dp u    X`jrz_wgetch_nocbreak_waddch_cbreak___fillbuf_wmove___stdin__cursvar_curscr.text.rom.data.bsswgetstr.o:SC'CdCUVu uY=t> tF=u 1^  _wgetstr_wgetch.text.rom.data.bsswindel.o:SJR$RdRUVWuVu19~|V8<t 4YGv$+5<BHMS_mvwin_touchwin_LINES_COLS.text.rom.data.bsswinsch.o:U&d555UVWuVU>V UE = }*} t} t } t} uE PVYYV8M MV8M MME = }EU9UvEEEEV@M V<t>etF>euE_^U EPu u EPY)EGefg    GM R      $ , 4    % a  mhr{rP__fp_hook__pfloat__pscien__gcvt__f_print_strtod_strlen.cmf8__str_ext_cvt.csb4__ecvt__ext_dbl_cvt__fcvt.text.rom.data.bss,__.SYMDEF:$V x !r 'R ,X 1 7=zBHNSXp^djpuz<( 88 ~!"#D%z&''()t*~+,-./00 1234 5&6,71869=9D9KJ;Pl<U=Z>_?d@jApBvC{DJFlGHHIJKLMMMMMMMMM.adf4.adf8.adi.and.blm.cff4.cff8.cfi.cfu.cif4.cif8.cii.cmf4.cmf8.cms.com.csa4.csb4.cuf4.cuf8.ciu.cui.cuu.dup.dvf4.dvf8.dvi.dvu.error.Xtrp.exg.fat.fef4.fef8.fif4.fif8onebigmin.gtohol0.iaar.ilar.inn.ior.isar.lar4.los.loi.mlf4.mlf8.mli.mon.ngf4.ngf8.ngi.nopprintsprintdprintc.rck.rmi.rmu.rol.ror.sar4.sbf4.sbf8.sbi.set.sli.sri.sts.sti.stop.trp.unknown.xorERANGEESETEIDIVZEHEAPEILLINSEODDZECASE.trppc.ignmaskem_adf4.o:  d qqqCC[í.adf4.text.rom.data.bssem_adf8.o:  d qqqCC [ í.adf8.text.rom.data.bssem_adi.o:&dzzz[uYS .adi.trpEODDZ.text.rom.data.bssem_and.o:dxxx[X#.and.text.rom.data.bssem_blm.o:dyyy{sƉ.blm.text.rom.data.bssem_cff4.o:##d#C{Sck[Sk.cff4.text.rom.data.bssem_cff8.o:  d nnnC[ê.cff8.text.rom.data.bssem_cfi.o:00d0{SK k{uC [ SkC [.cfi.text.rom.data.bssem_cfu.o:GY"YdY{SK k{u#C [ C +C SkC [C+C!.DP%*17<B.cfubigmin.text.rom.data.bssem_cif4.o:  d nnnC[ê.cif4.text.rom.data.bssem_cif8.o:  d nnnC[ê.cif8.text.rom.data.bssem_cii.o:!1(1d1[u  u9uuP' - .ciiEILLINS.fat.text.rom.data.bssem_cmf4.o:d1CCtrIAû.cmf4.text.rom.data.bssem_cmf8.o:d1C CtrIAû.cmf8.text.rom.data.bssem_cms.o:d[VWʉtA_^.cms.text.rom.data.bssem_com.o:dtttð.com.text.rom.data.bssem_csa4.o:)')d)+C;Cw Ë[ uӅu P # .csa4ECASE.fat.text.rom.data.bssem_csb4.o:'''d'KI|;u[u P  .csb4ECASE.fat.text.rom.data.bssem_cuf4.o:#dC{} %%[ .cuf4bigmin.text.rom.data.bssem_cuf8.o:#dC{} %%[ .cuf8bigmin.text.rom.data.bssem_cuu.o:$ 2dvvv[9uP  .ciu.cui.cuuEILLINS.fat.text.rom.data.bssem_dup.o:dzzz[)̉Ɖ.dup.text.rom.data.bssem_dvf4.o:  d qqqCs[í.dvf4.text.rom.data.bssem_dvf8.o:  d qqqC s[ í.dvf8.text.rom.data.bssem_dvi.o: &d[=uXYPS .dvi.trpEODDZ.text.rom.data.bssem_dvu.o: &d[=u X1YPS .dvu.trpEODDZ.text.rom.data.bssem_error.o::-1-d-u`=}aa  ' @BCDEFGHIJKLM$*/5.error.Xtrp.ignmask.trp.text.rom.data.bssem_exg.o:dW_ý.exg.text.rom.data.bssem_fat.o: & d nnn  .fat.stop.trp.text.rom.data.bssem_fef4.o:5yydyC%t -~C% ?[C ËC%u [CËKʁuH [?S%*0.fef4.text.rom.data.bssem_fef8.o:JdC %t&-C % ?S[SC ËC % Cu [CCËK ʁu Hc ?K[SK.4:?E.fef8.text.rom.data.bssem_fif4.o:@ @d@CK rv%s[[0 .fif4one.text.rom.data.bssem_fif8.o:@ @d@CKrv%s[[0 .fif8one.text.rom.data.bssem_fp8087.o:%ddllonetwobigmin.text.rom.data.bssem_gto.o:dlllkc#.gto.text.rom.data.bssem_hol0.o:dddthol0.text.rom.data.bssem_iaar.o:%d{{{YZ[X+c[Q .iaar.unknown.text.rom.data.bssem_ilar.o:+dwwwYZ[XQ  .ilar.lar4.unknown.text.rom.data.bssem_inn.o: 6 .d.1һ9sӄt1[ @.innbits.text.rom.data.bssem_ior.o:dxxx[X .ior.text.rom.data.bssem_isar.o:+dyyyYX=[XQ  .isar.sar4.unknown.text.rom.data.bssem_lar4.o:77d7+K[Zs1Ps1fP։)ĉlj.lar4.text.rom.data.bssem_loi.o:7 7d7ZsPsPR[) [)։!.los.loi.text.rom.data.bssem_mlf4.o:  d qqqCK[í.mlf4.text.rom.data.bssem_mlf8.o:  d qqqCK [ í.mlf8.text.rom.data.bssem_mli.o:&d~~~[=uXYPS .mli.trpEODDZ.text.rom.data.bssem_mon.o:!diii .mon.stop.text.rom.data.bssem_ngf4.o:  d pppC[ì.ngf4.text.rom.data.bssem_ngf8.o:  d pppC[ì.ngf8.text.rom.data.bssem_ngi.o:&d}}}[=uYQS .ngi.trpEODDZ.text.rom.data.bssem_nop.o:.duuu     .nophol0printcprintd.text.rom.data.bssem_print.o:;<3<d<Ct1ҹ tRZ0PPSP[[[[ 3'%+06printsprintdprintc__write.text.rom.data.bssem_rck.o:)d{{{;|;CPX .rck.errorERANGE.text.rom.data.bssem_rmi.o: &d[=uXYRS .rmi.trpEODDZ.text.rom.data.bssem_rmu.o: &d[=u X1YRS .rmu.trpEODDZ.text.rom.data.bssem_rol.o:&d~~~Z=uXYPR .rol.trpEODDZ.text.rom.data.bssem_ror.o:&d~~~Z=uXYPR .ror.trpEODDZ.text.rom.data.bssem_sar4.o:..d.+K[ZsXsXfƉ.sar4.text.rom.data.bssem_sbf4.o:  d qqqCc[í.sbf4.text.rom.data.bssem_sbf8.o:  d qqqC c[ í.sbf8.text.rom.data.bssem_sbi.o:&d|||[uY)S .sbi.trpEODDZ.text.rom.data.bssem_set.o:LF*>d>[1)SW1T;9s׊W__ @&5 :"',16<AG.setbits.trpESET.text.rom.data.bssem_sli.o:&d~~~Z=uXYPR .sli.trpEODDZ.text.rom.data.bssem_sri.o:&d~~~Z=uXYPR .sri.trpEODDZ.text.rom.data.bssem_sti.o:2 2d2ZsXsXfR[[׉.sts.sti.text.rom.data.bssem_stop.o:$diii .stop___exit.text.rom.data.bssem_trp.o:(d{{{1ۇtPXP .trp.trppc.stop.text.rom.data.bssem_unknown.o: , d oooP .unknownEILLINS.fat.text.rom.data.bssem_xor.o:dxxx[X3.xor.text.rom.data.bssem_head.o:[ Sdddl!)/5<EKPVERANGEESETEIDIVZEHEAPEILLINSEODDZECASE.trppc.ignmask.text.rom.data.bss,__.SYMDEF:_$4PPP%l 4l Gl Vl `l ml ul l l l DD_strdup_rl_complete_rl_list_possib_rl_meta_chars_rl_reset_terminal_rl_initialize_readline_add_history_rl_eof_rl_erase_rl_intr_rl_kill_rl_quit_rl_ttyset_rl_add_slashcomplete.o:^ .8(d(  UVuYPYƅt uVYY^UUUU UE]03YYU0VWuYEu1E1u |YEEEubYEu>.u~tۀ~.u~tσ}tuu V' uEVYE܁}vtOU4Y@1uLW@RYEu EYtRuu uYUUEVYUuu uYEGugY}uN}t# E10NE1E׍U9vN VYƅtVuWZYhYƅt,VuWZYth/jWu_^UVWj/uYYƅu8hYDžu fuYƅuKWrYIubYDžu3+UBFVBYƅuW5Y E 8E01_^U(VWEPEPuL y1EPuu< EuuYuY1EuYE؃}E E0Y+EؿǍGPYE]UWRuc uXY]P3LYZP=YEuu&YYhuYYE0uYYuuYYuYE }|u؋E0YE9uv)9}vU] 9uGF9us8+UؿWYEt]UWRuh JUuTYuKY19uvU48YFu,YE_^U EPEPuU y1)u uuI EuYuYEchoices/.   $ L  `         I T } / :  R_   & / F g {            1 z        ,4/=TJGUbrx_strdup_compare_FindMatches_SplitPath_rl_complete_rl_list_possib_free_malloc_strlen_memcpy_strrchr_readdir_opendir_strncmp_strcat_rl_add_slash_strcmp_qsort_strcpy_closedir.text.rom.data.bsseditline.o:]R:2d2U=t 55 j UE B I9r"P5 YY UU:tEPYU}uj^Yj?{Ya}t!U }j^_YU@RQY:= t&Et jM8Yj-0YUR"Y EPYUU:tEPhYU=t8:t "jEPj =uEUMx!=t5YjqYUV=1҉hYƅu VPYYyPsPhYYt5YhYh~Y=~ =P^U VWE19u~U 4.Y9E}}FUѡEhYE}@E19uo9}VU URYEEMxUPYEU9U~EU9U} j Y}hYF_^UVWj Y5Y=5Ox PYF_^U=t5YjKY=J:t<J }'=t5SYfjYY= tPJt>=t5YjY=t5YjY}u UPY}uUjWY#UE_UUE_EEPYuUVW15֋9}*> tu}ujuYUV1UEuBF95uY^UhYUh YU1҉4aYUJ4BYUVuU  Mu 1/>t%]9uuu V u1Fָ^U VWut(>t#=t 5YVY!=t :u1o5>^u EG E W8YEUU t*uW4U uދ U1_^UV=t UR'Y=u E8ƋU5Yu=~)uVYYtu VXY^UV19}jYF95^UVu =t5Y~7FPYt$UVR5 ^UVW}~9u 82}J9t 5ֿj WY>t }j =Y#= ttj Yj YWzYU9}+U s}~u5YY5֋U+BOx U F+URVY_^UV1=tjYF95^UV1=tjYF95VYY^U=te9}&U6U+RY*9~j,Y+JRY?+R5eYYUVW=t =}UUEEP~YTBRYDžu9UMxUFW5YEWYE_^UVW=u [tCOuO<@1oƻ(+0 sO0I=t0 sk -054As VY!4t9uW k_^UVW}= t&ǀt!B,~t 9t~tVWYE=u E_^UVuƀt 95tu 95u)=tGX95u=u=u795u95u^UV1҉J=tVCO1KDyס612+`V5YXVY|1^UVW}WYDžt\=d}A <.5mY1c}BF<J_^UUUV=u"@RYu1jYh8YRY }tEP2Y[ƅtVYhYjY5 {YJ4aYt/>t*=tJ4V:YYtVY=~#Uu PYY^UU=tU=uP,YU9t UVW595s*N95s ~\uNPhLYYtF++BUR+YEu17}9v>\uF9tFGUWXYZ[\]^_`aE_^UVWJǍEPWYYƅtWYt,uV`YYNxU4YuYT_^UVWǍEPWjYYƅtW\YVMYEP:YEE>A |PhYYt}t~t U\EFUE붋UWY}t uPYEuY}tE_^U1U=9uj1YJ MjY I JPYAEP5 YZEPYUE=u uYU9~{D9~#UU+RYUUV=tu5.9r5^U=t:t5ZYU9~I9~+R5YY+R5YYUVWE=u9B֋95~9Uu 5 FG߸_^Uj-YUjY9t +UuAYUVW1595sVu jOYN95s ~ tVt j'YN؃=t G9=_^U~9t+RYUVW@URYE] u1utF> t>u11BVuWZY>> F>tӀ> tΉB9UW@URbYEuUVURuu7 E@u(YUUE BVuWZYWFQU_^U VW=tօu VYƅu qEPVYYǃ=t&9=}M4Y?[\]^`{|}~   -N  } S "  S   iN_99 .< > ?b@dflmuyw2 n$7=ELR\fm wryENW_j | ~  k$.C HOY ^di ynty y~ l l,x #AJQ\e{ ~06>DvTmv|v & {M qf%E lJReoy l j o i:@ oJS[ajp}    & - 4 L `         x6 f o it {     x  l        1 @ H N [ c j }         % i* 1 jB H R ] ob k         0 6 > D d q w         *39DJXgm}  j$? iS(4<DLT t#BsyO Q$,5DNU]fPv~RXdhlptx|3 s8D sI \ir{ i j p " j(.>C [c pu| i i | m }2ASYa} z j u1 i? i] ih r i l j z i i:X^q~AGV\dms| 7=LRZ`gv| $*IOWvcyv jv!vf j o i$. Dirz i i08@HPX`hpx8@HPX`hpx^5c5j5s5 55.55558555555556'66(666<6@H6W6b6t66 6: 6s 6 6 6 6 6 6P 6 6 6 6w 7 7 7"*777_=7fD7P7[7Re7x7777 7-7N77s77}7S7i789 888"82/8=8F8T8@]8k8s88,84888888888 8888889 999$919=9H9R9[9_9c9g9m9u9~999999999999999::::%:+:3:<:B:G:M:_NIL_Input_NEWLINE_rl_meta_chars_TTYflush_TTYput_TTYputs_TTYshow_TTYstring_TTYget_TTYbackn_TTYinfo_columns_reposition_left_right_ring_bell_do_macro_do_forward_do_case_case_down_word_case_up_word_ceol_clear_line_insert_string_redisplay_toggle_meta_mode_next_hist_prev_hist_do_insert_hist_do_hist_h_next_h_prev_h_first_h_last_substrcmp_search_hist_h_search_fd_char_save_yank_delete_string_bk_char_bk_del_char_kill_line_insert_char_meta_emacs_TTYspecial_editinput_hist_add_rl_reset_terminal_rl_initialize_readline_add_history_beg_line_del_char_end_line_SEPS_find_word_c_possible_c_complete_accept_line_transpose_quote_wipe_mk_set_exchange_yank_copy_region_move_to_char_fd_word_fd_kill_word_bk_word_bk_kill_word_argify_last_argument_Map_MetaMap_rl_eof_rl_erase_rl_intr_rl_kill_rl_quit_Line_Prompt_Yanked_Screen_H_Repeat_End_Mark_OldPoint_Point_PushBack_Pushed_Signal_Length_ScreenCount_ScreenSize_backspace_TTYwidth_TTYrowsI_8I_7I_1_free_malloc_tgetent_strlen_getpid_write_memcpy_rl_ttyset_tolower_rl_complete.csa4.csb4_rl_list_possib___ctype_realloc_strncmp_tgetnum_strchr_toupper_strcmp_kill_getenv_read_strdup_tgetstr.text.rom.data.bsssysunix.o:_\dW_$_U$}hjYYhEP U⎁fUEEEPjjh hjjU U EPu>YYx)U@uPu YY /  !'.4; AHNU[` n       %-8@FLQW_rl_ttyset_rl_add_slashI_1_rl_erase_rl_quit_rl_intr_rl_kill.blm_tcsetattr_strcat_tcgetattr_rl_eof_stat.text.rom.data.bss,__.SYMDEF:$`(| &l $ * / 4L:@F6LU&[axj4!p"v8$~&(z)@,:/:01>36789;=P>P>P>n@B CD.add_ext.b64_add.adf4.adf8.cff4.cff8.cfi.cfu.cif4.cif8.cmf4.cmf8.compact.cuf4.cuf8.div_ext.dvf4.dvf8.extend.fef4.fef8.fif4.fif8__fptrp.mlf4.mlf8.mul_ext.ngf4.ngf8.nrm_ext.sbf4.sbf8.sft_ext.b64_sft.b64_lsft.b64_rsft.sub_ext.zrf4.zrf8.zrf_extadd_ext.o:a_ IdfffU VWu} W WV VuWVWVYY9}V9Ww 9WuKV9WvCVEPWVU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP,YYtFPYNF@fFVY_^ * 6 j v   (-6?IOTZ.add_ext.nrm_ext.blm.sft_ext.b64_add.b64_rsft.text.rom.data.bssadder.o:bWWdWUVWu} +19v@E+V19Wv@EWV}tBuE_^ .b64_add.text.rom.data.bssadf4.o:ch6hdhUE} uUU K}tEjEPE P jEPEP EPEPYYjE PEP , > N _LR[dlrw}.adf4.compact.add_ext.extend.text.rom.data.bssadf8.o:ev6vdvU}u}uUM UMQ}u} tEjEPEP jEPEP EPEPYYjEPEP : L \ mZ`irz.adf8.compact.add_ext.extend.text.rom.data.bsscff4.o:f!,-,d,U jEPEP jE PEP  # .cff4.compact.extend.text.rom.data.bsscff8.o:g!,-,d,U jEPEP jEPEP  # .cff8.compact.extend.text.rom.data.bsscfi.o:h+d"""UVu EPEP Ey1} u@D1UfUE]9~;E@]9uUt}u}tjYE]fUE-؉UUt1} u@t^  z.cfi__fptrp.extend.text.rom.data.bsscfu.o:i+dUVu EPEP Ey1} u@D1QUJfUE]9~jYE]fUE-؉U1} u@t^  TV[ckqv|.cfu__fptrp.extend.text.rom.data.bsscif4.o:j7dUVWEPY}ufEu } U UfE}uEy1fEyډE}teEPYjWEPx _^  w kqz.cif4.compact.zrf_ext.nrm_ext.text.rom.data.bsscif8.o:k =dUVW}EPY}u fEu U UfEu WYEy1fEyډE}teEPYjWEPz _^  = u }.cif8.compact.zrf_ext.zrf8.nrm_ext.text.rom.data.bsscmf4.o:l@dUVW}u 9u1gyEyE9Et(u u1(}~9}E_^$*05;.cmf4.text.rom.data.bsscmf8.o:mvdUVW} uyEyE9Et.ut}~ YO9t9}E-UUUU9Uu1!U9Us EEUU_^Z`fkq.cmf8.text.rom.data.bsscompact.o:nF @dbbbUVWuE}} #V Vu WYFfF^~.jYfFFFUAMt7xF*FPmYFyFPFPTYYfFV V WWUN E#Vw!#VFWU EY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.jYfFFFUAMt7F*FPYFyFPFPYYfFVVʁwLFtCVut F@fFt/F@fFF=5'F t?_^ . W    I b&06;A.compact.zrf8__fptrp.b64_sft.b64_rsft.text.rom.data.bsscuf4.o:oo7odoUVWEPY}ufEu } U UfE}u%}tuEPYjWEP _^  W dKQZclrw}.cuf4.compact.zrf_ext.nrm_ext.text.rom.data.bsscuf8.o:p n=ndnUVEPY}u fEu U UfEu EPY(}tuEPYjEPEP ^  < T d^dmv|.cuf8.compact.zrf_ext.zrf8.nrm_ext.text.rom.data.bssdiv_ext.o:q 4I4d4UVWufEU M I JujY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEPYU R9VEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JN Wt1fEUtFPYWE`}E=~WE- fEG?t E?t E- ؉ UEEPFPVYF=}jYfF1҉ViklmnopqrstV!F=?|jYfF?1҉VV_^ " R _  ]    Xajrw.div_ext.nrm_ext__fptrp.blm.b64_lsft.b64_rsft.text.rom.data.bssdvf4.o:rgM6MdMUjEPE P jEPEP EPEPYYjE PEP  # 3 D17@HQW\b.dvf4.compact.extend.div_ext.text.rom.data.bss9dvf8.o:sgM6MdMUjEPEP jEPEP EPEPYYjEPEP  # 3 D17@HQW\b.dvf8.compact.extend.div_ext.text.rom.data.bss9extend.o:tTy'ydyU VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}rUVF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVY_^ p-5>DIO.extend.nrm_ext.text.rom.data.bssfef4.o:uOZ-ZdZU VujEPE P Uu}u}u E@fEjFPEP ^  P"(19?DJ.fef4.compact.extend.text.rom.data.bssfef8.o:vOZ-ZdZU VujEPE P Uu}u}u E@fEjFPEP ^  P"(19?DJ.fef8.compact.extend.text.rom.data.bssfif4.o:w MdzzzUVujEPEP jEPE P EPEPYYEPEPjEPEP EyUVE=~UF}E-?PEPUYYE-?PEP@YYjVEP2 jEPV# jEPEP EPEPYYjFPEP ^  ' 7 K Z        ^dmv.fif4.compact.mul_ext.sub_ext.blm.extend.b64_sft.text.rom.data.bssfif8.o:x :M:d:UVujEPEP jEPE P EPEPYYEPEPjEPEP Ey$FEPFPxE=3~"EPVYFF }E-?PEP1YYE-?PEPYYjVEP jEPV jEPEP EPEPYYjFPEP ^  ' 7 K Z         0.fif8.compact.mul_ext.sub_ext.blm.extend.b64_sft.text.rom.data.bssfptrp.o:x $ d qqqUE __fptrp.Xtrp.text.rom.data.bssmlf4.o:ygM6MdMUjEPE P jEPEP EPEPYYjE PEP  # 3 D17@IQW\b.mlf4.compact.mul_ext.extend.text.rom.data.bss mlf8.o:zgM6MdMUjEPEP jEPEP EPEPYYjEPEP  # 3 D17@IQW\b.mlf8.compact.mul_ext.extend.text.rom.data.bss mul_ext.o:{If'fdfUT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jYfF?1҉VVF=}jYfF_^ 2 U"+39>D.mul_ext__fptrp.text.rom.data.bssngf4.o:|dUV}tu ^û.ngf4.text.rom.data.bssngf8.o:}!!d!UV}u} tu^.ngf8.text.rom.data.bssUnrm_ext.o:~Vz(zdzUVWuV V_~uVVFF- fFFu3E@UVumOFfFWFPYY_^ p.7@FKQ.nrm_ext.b64_sft.text.rom.data.bsssbf4.o:mS6SdSU}tEjEPE P jEPEP EPEPYYjE PEP  ) 9 J7=FOW]bh.sbf4.compact.sub_ext.extend.text.rom.data.bsstsbf8.o:sY6YdYU}u} tEjEPEP jEPEP EPEPYYjEPEP  / ? P=CLU]chn.sbf8.compact.sub_ext.extend.text.rom.data.bsssft_ext.o:$H(HdHUVWUBU Z)ۉ߅t'yߋuu FfFWFPYY_^ >.sft_ext.b64_sft.text.rom.data.bssshifter.o:3d}}}UVWu} b?~F |V VV>{ )ы V^߅T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^.b64_sft.b64_lsft.b64_rsft.text.rom.data.bsssub_ext.o:o Id~~~UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPYNF@fFV9Ww9WLV9WvDW9Vv WWW+VWW+VWWV)t1f#V9Wv VVV+WVV+WVVY_^ ' F _ r  &/8=FOY_dj.sub_ext.nrm_ext.blm.sft_ext.b64_add.b64_rsft.text.rom.data.bsszrf4.o:drrrUEî.zrf4.text.rom.data.bsszrf8.o:d|||UEUBø.zrf8.text.rom.data.bsszrf_ext.o:##d#UVuFFfFf^.zrf_ext.text.rom.data.bss,__.SYMDEF:$Tp pp3pE*W*ds$+.G.a...11111133333(3<3T3i3z3333333333(36tJ?KOK_KrKKKKKKPPPPP'P:PHPZPiP|PPPPPPPP PP2PDPZPjP~PPPPPPPPP-PDP^P|PPP'7HXk8Qg  0 B O o   4 P f h h+ h> hT hh hv v  , C Z q  & 1 H ` w ~$~7~K~\~o~~$-$>$L$U4 ]4 a4 e4 i4 r4 {4 4 4 4 6 !"#++----z0z0z0r2 r2*40494B4H4N4V^7\8e8n8w.;.;.;.;@ABC EFFfIfIJLLL$__Arguments___Arguments__Argv__Arguments__GetEnv__Arguments__Argc__ArraySort__Sort__ArraySort___CSP__COBEGIN__CSP__COEND__CSP__StartProcess__CSP__StopProcess__CSP__InitChannel__CSP__GetChannel__CSP__Send__CSP__Receive__CSP__SELECT__CSP__NEXTGUARD__CSP__GUARD__CSP__ENDSELECT__CSP___Conversions__ConvertOctal__Conversions__ConvertHex__Conversions__ConvertCardinal__Conversions__ConvertInteger__Conversions__FIF_FEF_TRP_SIG_LINO_FILN__InOut__Read__InOut__Write__InOut__OpenInput__InOut__OpenInputFile__InOut__CloseInput__InOut__OpenOutput__InOut__OpenOutputFile__InOut__CloseOutput__InOut__ReadInt__InOut__ReadCard__InOut__ReadString__InOut__WriteCard__InOut__WriteInt__InOut__WriteHex__InOut__WriteLn__InOut__WriteOct__InOut__WriteString__InOut___InOut__termCH__InOut__Done_LtoUset__MathLib0__cos__MathLib0__sin__MathLib0__arctan__MathLib0__sqrt__MathLib0__ln__MathLib0__exp__MathLib0__entier__MathLib0__real__MathLib0___Mathlib__pow__Mathlib__longpow__Mathlib__sqrt__Mathlib__longsqrt__Mathlib__exp__Mathlib__longexp__Mathlib__ln__Mathlib__longln__Mathlib__log__Mathlib__longlog__Mathlib__sin__Mathlib__longsin__Mathlib__cos__Mathlib__longcos__Mathlib__tan__Mathlib__longtan__Mathlib__arcsin__Mathlib__longarcsin__Mathlib__arccos__Mathlib__longarccos__Mathlib__arctan__Mathlib__longarctan__Mathlib__sinh__Mathlib__longsinh__Mathlib__cosh__Mathlib__longcosh__Mathlib__tanh__Mathlib__longtanh__Mathlib__arcsinh__Mathlib__longarcsinh__Mathlib__arccosh__Mathlib__longarccosh__Mathlib__arctanh__Mathlib__longarctanh__Mathlib__RadianToDegree__Mathlib__longRadianToDegree__Mathlib__DegreeToRadian__Mathlib__longDegreeToRadian__Mathlib___PascalIO__Reset__PascalIO__Rewrite__PascalIO__CloseOutput__PascalIO__ReadChar__PascalIO__NextChar__PascalIO__Get__PascalIO__Eoln__PascalIO__Eof__PascalIO__ReadLn__PascalIO__WriteChar__PascalIO__WriteLn__PascalIO__Page__PascalIO__ReadInteger__PascalIO__ReadCardinal__PascalIO__ReadReal__PascalIO__ReadLongReal__PascalIO__WriteCardinal__PascalIO__WriteInteger__PascalIO__WriteBoolean__PascalIO__WriteReal__PascalIO__WriteLongReal__PascalIO__WriteString__PascalIO___PascalIO__Notext__PascalIO__Output__PascalIO__Input__Processes__StartProcess__Processes__SEND__Processes__WAIT__Processes__Awaited__Processes__Init__Processes___RealConversions__RealToString__RealConversions__LongRealToString__RealConversions__StringToReal__RealConversions__StringToLongReal__RealConversions___RealInOut__WriteReal__RealInOut__WriteLongReal__RealInOut__WriteFixPt__RealInOut__WriteLongFixPt__RealInOut__ReadReal__RealInOut__ReadLongReal__RealInOut__WriteRealOct__RealInOut__WriteLongRealOct__RealInOut___RealInOut__Done__SYSTEM__NEWPROCESS__SYSTEM__TRANSFER__Semaphores__StartProcess__Semaphores__Up__Semaphores__Down__Semaphores__NewSema__Semaphores__Level__Semaphores___Storage__ALLOCATE__Storage__Allocate__Storage__Available__Storage__DEALLOCATE__Storage__Deallocate__Storage__StringAssign__Streams__OpenStream__Streams__SetStreamBuffering__Streams__FlushStream__Streams__CloseStream__Streams__EndOfStream__Streams__Read__Streams__ReadByte__Streams__ReadBytes__Streams__Write__Streams__WriteByte__Streams__WriteBytes__Streams__GetPosition__Streams__SetPosition__Streams__isatty__Streams___Streams__ErrorStream__Streams__OutputStream__Streams__InputStream__Strings__Assign__Strings__Insert__Strings__Delete__Strings__Pos__Strings__Copy__Strings__Concat__Strings__Length__Strings__CompareStr__Strings___Termcap__Tgetent__Termcap__Tgetnum__Termcap__Tgetflag__Termcap__Tgoto__Termcap__Tgetstr__Termcap__Tputs__Termcap___Terminal__Read__Terminal__BusyRead__Terminal__ReadAgain__Terminal__Write__Terminal__WriteLn__Terminal__WriteString__Terminal___Traps__InstallTrapHandler__Traps__Message__Traps__Trap__Traps__ospeed_PC_BC_UP_tgetent_tgetnum_tgetflag_tgetstr_tgoto_tputs_absd_absf_absi_absl_blockmove_cap_catch_new_stackptr_copy_array_dvi_dvil_rmi_rmil__cleanup_CallAtEnd_halt__m_a_i_n_bkillbss_init_killbss_handler_argv_argc_MainLB_load_topsize_topsave_topload__random__Random__random__Uniform__random__StartSeed__random__rcka_rcki_rckil_rcku_rckul_sigtrp___signo_stackprio_unstackprio_store_adduchk_muluchk_subuchkArguments.o: dYYYUVWu }F9uG?u ~=u1_^UVW}1?t9urFGU E 9ur U F GtFF_^UU9U|1U uu 4 UVW:1?tPu.YYƅtu1u uV@ _^v|'..q;Masy_findname_scopy__Arguments___Arguments__Argv__Arguments__GetEnv__Arguments__Argc_argc_argv__penviron.text.rom.data.bssArraySort.o: 8z4d4UUU JUUuRu UVW}tUUU UU +U1NjuƉu9us>VuYYE}t)}u UU։ډWVu EU9UuuYYE}T9us*Wuu UUUUEVUUWuuu։u녀}uUUWuu cUUT}9urWRu UU,ډWuVuRUUUU9U _^UVWu }MMGMF}u_^UVWu} MU M EFMG}u_^U=u  l %.<N(Xez __ArraySort__Sort__1_qsort__2_exchange__3_threewayexchange__ArraySort___ArraySort__compareproc.text.rom.data.bssCSP.o|~:M-VzdzLL*.UVuF^UVW}u >u~:>_^UVuVE tVVE 9u^U1}UUUhhYY=uVMRQ>YYUVu~ uU V RVMJ^UVuVB VRV~u^U1zUUr2,YY1ۅÉUUz tUVEPhYY}u j,EPsYYUh R`YYuVF F(FPhv u0@ hu.YY^UVrV V ~ u hVYY5hVYYhhYY=uRFPYY^UVjuYYE0VYFFF ^UVu~tjjjhLDV^UVWEEP"YuYE0V5YYUB R$QYYR$UMJ(}1҉U9w+U+U׍] EuUY EtOE߃~ t!VN Jv{YhvYYe_^UVWEUR9tjj(jh @8E0[YEPuUYYUR$UUr(1҉U9w(})֋U] Qu EtNGhuYYh5YY5YEj0_YYEPuYYUR$UUr(1҉U9w(})֋U] Qu OEtNGh5KYYhuMSY^d__1_ConvertNum__Conversions__ConvertOctal__Conversions__ConvertHex__Conversions__ConvertCardinal__Conversions__ConvertInteger__Conversions_.sar4.text.rom.data.bssEM.o:;|[|d|U]PYUY[ ZXZUu uPEXZUEUU5XUU    9  M [ alv'FShr %+06_FIF_FEF_TRP_SIG_LINO_FILN.loihol0.fef8.Xtrp.fif8_handler.text.rom.data.bssInOut.o:d8 I dI  e i U=tU )hu5 1UM UhEP5 U|EPbYuWY9thh9YYjjjEPjujujjjh<0=tjjjEPa|UEEPYuY9thhYYjujueUEEPYuxY] 1ujZ-u*] uTZu3hjjjujuh 1eU9thhYYU|EPYuY9thhYYjjjEPjujujjjhTD0=tjjjEPa|UEEP/Yu$Y9thhYYjujueUEEPYuY] uZ-u*] uZu3hjjjujuhp 1eU9thh5YYUVWE]EP YuYEPYuYh5YYtjujuju0ju(1F],u(ZuhN],u({Z.W} 1҉U9w0U+UF]EuL],u(?tOEډB],ju(#e_^U4VWjjjEP=EU̍Mр9-uEŨU"U̍Mр9+uEŨUEE}t UU1TU̍M0ׁ  u"U9vjjjhlTLk ŨUU̍M0rU̍M9v}t ڋEE0U̍M vjjjh_^U,VWjjjEP=EE1TUM0ׁwu"U9vjjjh^Vk UUUM0rUM9vUM vjjjhE0_^UV1EPYEjjjjjjjh& uр=}EPYEPYM 9ur3] MQun=t U w] juMF=t U w=t EPyY^UV1hEP5 =u4U w] ju9uv] MQuF^UVEEPYuY19ur5] uZt#] huw5l FƋe^UjhjPu u<jhjPUjhjPu ujhjPUjhjPu ujhjPSUj YUjhjPu uljhjPUVEEP:Yu/Y1] uYF9ur] uZuՋe^U=u4Name of input file: Name of output file: integer too largeillegal integercardinal too largeillegal cardinal777 7(71 )67@L7W7a7k7v ({ $ ' 777 "5 $# '. 57;7B7G "L $y ' * * 777 37 7 77 " "7( $D 'OV7\7c7h "m5 $ '777 " $# '. *? *U`7fl7t7 37777 "7 $ ' $ '7 % #* *f * * ! ! 5 + ,5 + ,$*O5 + ,5 + , -HRw ! !7  )7 ! !3 $N 'Y *n7} * ( / . 2B % $ ' * * 6 6 & 1 0$  * 70 6 7< 7B Rg #i1E.Yq3=#" 5c Fp X m v 3ESoz8NTY___InOut__Read__1_UnRead__InOut__Write__InOut__OpenInput__InOut__OpenInputFile__2_openinput__InOut__CloseInput__InOut__OpenOutput__InOut__OpenOutputFile__3_openoutput__InOut__CloseOutput__4_MakeFileName__InOut__ReadInt__InOut__ReadCard__InOut__ReadString__5_XReadString__6_XWriteString__InOut__WriteCard__InOut__WriteInt__InOut__WriteHex__InOut__WriteLn__InOut__WriteOct__InOut__WriteString__InOut___InOut__result__InOut__CurrOut__InOut__CurrIn__InOut__unreadch__InOut__unread__InOut__termCH__InOut__Done__Streams__OutputStream__Streams__InputStream.sar4__Streams__CloseStream__Streams__isatty_new_stackptr__Conversions__ConvertOctal__Streams__copy_array__Streams__Write__Streams__Read.lar4__Traps__Message_halt.inn__Conversions__ConvertInteger__Conversions__ConvertCardinal__Traps___Conversions___Conversions__ConvertHex__Streams__OpenStream.text.rom.data.bssLtoUset.o:p M3MdMUM]U +UU U+UUU9U wME ME M]  / 7 G=FKPUZ`ek_LtoUset.los.set.sts.ior.text.rom.data.bssMathLib0.o:l 2dfjnUuYUuYUuYUuYUuYUuYUVW}W5YYy=WjjYY^VjxYWqlYYuډJ WjjKYYX_^U}yURj.Y(X ujYXU=u     # 1 ?  M_  d  p  y        :JZm*~8FT"1;KV\ag__MathLib0__cos__MathLib0__sin__MathLib0__arctan__MathLib0__sqrt__MathLib0__ln__MathLib0__exp__MathLib0__entier__MathLib0__real__MathLib0___Mathlib__cos.ngf4.cmf4__Mathlib__exp.cfu.cuf4__Mathlib__ln__Mathlib__arctan__Mathlib__sin__fp_hook__Mathlib__sqrt__Mathlib_.text.rom.data.bssMathlib.o:N;nA d,,!$!UUu jR RPYXUujEEu u55 yKu uYYRPuuYYYYYEUUt uugYuuQu u55Fu5 5%u unYYRPuuYYYYRPXZUUjR YYRPYXUVWu u5(5$Gu u505,yjjjh45P5L~EPu ul EUUt"5X5TuuDYYEEM5`5\5h5duuYYYYEE#uu5p5lYYEEm}#uu5x5tYYEEE}|#uu55|YYEEm}}#uu55mYYEEE}~׾1҉U9J})55uuu uuu!YYYYYYEEtNGuuXZ_^UVu"u u55YYEE } u u55YYEE N"u u55YYEE ~ u u55_YYEE Fx܋EU ^UUjR; YYRP-YXU(Vu u55 1ۅÈ]}tu uEE u u55YY55YYjj ^VjEEu ujj jEEu uuupYYE؏Euuuu55KYYDYYuu7YYuu55YYYYEE}tuuEEuuuuYYEEuu55uuYY55YYuuYY55YYYYEE FV55u u55uuSYY55@YYuu3YY55  YYuuYY55YYu uYYYYYY ^UUjR YYRPYXU$u u5 5jjjh$|EPu um EU RP5<58Qfu u5D5@/YY5L5HYYEEu u5T5PYY5\5XYYEERu u5d5`YYZYUMQR5l5hYY5t5pYYEEMuuuu}YYZYUMQRQRjYYE܏EuuuuuuKYY5|5xuu2YY55YYuuYY55YY55uuYY55YYuuYY55YYuuYY55YYYYYY~YYEE ujlEEu uuu55IYYBYYZYUM QRuu55YYYYXZUUjR YYRPYXUu u,YYRP55YYXZUUjRsYYRPYXUu u55yEu uvEE E}t%E55u uIYYEE UM UMuu55YY55 YYEEEP55uuRP55yEP55uuRP55tU1E}tuu5 5fYYEEEP55u uCEUuuuu55YYYYZYUM QRuuYYZYUM QRuu5$5 YYYYZYUM QR5,5(yU1Eu uEE u uu uYYEEu uu uuubYY5450uuIYY5<586YYuu)YY5D5@YYuu YY5L5HYYuuYY5T5PYYuuYY5\5XYYuuYY5d5`YYuuYY5l5hvYYoYYhYYEE }t u uOu uXZUju u UUjR YYRPYXUu u5t5pyu uEE ju u& UUjR YYRPYXU u u5|5x1ۅÈ]u u55iYY55VYYEEEP55uu3RP55yEP55uuRP551ۅÈ]EP55u uEUuuuu55YYYYZYUM QRuuyYYZYUM QRuu55VYYOYYZYUM QRQRYYEE }t}uu uEE U1U9u4u u55YY55YYEE D}t>}t8}t2u u55YY55YYEE }t}uu uwEE EU Uju u UUjRF YYRP8YXUju ui UUjR YYRPYXU V=1ҋ        Eu u55PyEu u:EE u u55~&55u uYYEE 1u u55sF5 5u uYY55YY55YYu uYY5$5 u uhYYaYYEE u uu uHYYEEu uu uuu)YY5,5(uuYY5450YYuuYY5<58YYuuYY5D5@YYYY5L5HuuYY5T5PYYuu}YY5\5XjYYuu]YY5d5`JYYuu=YY5l5h*YY#YYYYEE ~u uEE u u44YYEE }t u uu uXZ^UUjR YYRPYXUu ueYYEURP5t5puumYYfYY5|5xSYYXZUUjR? YYRP1YXUu uYYEURP55uuYYYY55YYXZUUjR YYRPYXUu uYYEURP55uuYYYYuu55uucYY\YYUYYXZUUjRA YYRP3YXUEu u55yEu uEE u uu uu uYY55YYYYRPYYYYEU }t u uu uXZUUjR~ YYRPpYXUu u55Ryjjjh;3u uu uu uYY55 YYYYRPYY:YYUUjR YYRPYXUu u55~u u55xjjjhw55u u`YY55 u uGYY@YYYYRP55$YYXZUUjR YYRPYXUu u5 5YYXZUUjR YYRPYXUu u5(5$YYXZU=usqrt: negative argument@??@@@@?@@@@9B.??0? a\+*D?*K???U c3>(\ D?Q(??ln: argument <= 0;f????????)VD Jb0@P?gKA~&s@w a\+0?Uk@-DT!?-DT! @?????" @Kߓi>*?UUUUUUſ-DT!?????"?KҾ$Ǣ.ߪ;l? Mxvt>AH do4Y!~G?Gݿ???arcsin or arccos: argument > 1??e浽K'9dN$@j,C 6L@b :U^;?n7pY|b@HVwCOz@̇+>d-DT!?-DT!?-DT!?-DT!?fs-8R?-DT!?fs-8R???V͞^&?Ul???LXz?zcj\? ˼4Q`+?JI .@ף 2 M@m U@ļ|D@?@?@????arccosh: argument < 1??arctanh: ABS(argument) >= 1??@cܥL@9RFߑ? 8 7 <0>B>H -M ,_ .s ,>> ->> . 8 7>(>. -3>F>L -Q>c 3h 5p>v>| 2>> .>>>> / .>>  .>.>4 99>Y>_ .d>> 9>> 9 / .>>  .%>C>I .N>i>o 9t>> 9 8 7>> - ,>!>' 9,>4>: /? 1J <V 0k <u ;>> . ; />> . ; , .>+>1 .<>D>J /O .\>d>j /o .v>>>> .>> / .>> / .>> / ;  9 / 82 7@>V>\ -a>s 3x 5 2>> ->> ;>> ;>> .>>  />(>. ;3>E>K .P>X>^ /c 9 . .>> .>> / .>> />>  .>>$ /) .6>>>D /I .V>^>d /i 9p .w /~ <>> . />> . / 8 7 >" >( 9- 8A 7O >e >k -p , > > / > > 9 > > / > > 4 >! >' -, >= >C 4N >Y >_ -d > > ; > > 4 > > . ; / > > . ;' >9 >? -D ,d .{ . > > . > > / . > > / . > > / . > >! /& .3 >; >A /F .S >[ >a /f .s >{ > / . / , 8 7 > > - , 8@ 7N >d >j -o > > 9 > > / > > 4 > > - > > 4> > ->.>4 4?>Z>` .e ;l />> . ; . .>> .>> /  .> >& /+ .2 /9>G>M .X>`>f /k .x>> / .>> / .>> / , 9 , 9 8/ 7=>S>Y -^ ,|>> ->> -> 3 5>>>> . ; ," /3 .R .q>y> .>> / .>> / .>> / .>> / .> > .>%>+ /0 .=>E>K /P .]>e>k /p .}>> / .>> / 9 / ,>> / >> / >H>N /S>[>a /f , 8 7 8 7@ @> >&@-@4>?>E@L@S>^>d@k@r>}>@@>> - ,>> ->> 9>>  -%>7>= .H>P>V ;[>c>i ;n /{>> / 9 . .>> .>> / . >> / .,>4>: /? .F>N>T ._>g>m /r .>> / .>> / .>> / 9 / ,@ @ / ,0 8K 7Y>~> 9 ;>> 9 8 7>> 9 />> 9 8/ 7=>b>h 9s ;z>> 9 / 9 8 7>> - , .!>)>/ /4 /D ,d 8~ 7>> -> 3 5 .>> ; / 8 7*>=>C -H>[>a -f>x 3} 5>> />> ; 9>> 9 8 7> > . 8, 7:>M>S .X?g?p :u@{77$777 778(8H$838 F87 U8W _8 r8 8 86 8V 8%8E8889&9<9AL9a`9p99%9E999t99:2&:@:^:"x:B:b:::::::::::;;;;;#;,;2;8;>;C;I;__Mathlib__pow__Mathlib__longpow__Mathlib__sqrt__Mathlib__longsqrt__1_ldexp__Mathlib__exp__Mathlib__longexp__Mathlib__ln__Mathlib__longln__Mathlib__log__Mathlib__longlog__Mathlib__sin__2_sinus__Mathlib__longsin__Mathlib__cos__Mathlib__longcos__Mathlib__tan__Mathlib__longtan__Mathlib__arcsin__3_arcsincos__Mathlib__longarcsin__Mathlib__arccos__Mathlib__longarccos__Mathlib__arctan__Mathlib__longarctan__Mathlib__sinh__Mathlib__longsinh__Mathlib__cosh__Mathlib__longcosh__Mathlib__tanh__Mathlib__longtanh__Mathlib__arcsinh__Mathlib__longarcsinh__Mathlib__arccosh__Mathlib__longarccosh__Mathlib__arctanh__Mathlib__longarctanh__Mathlib__RadianToDegree__Mathlib__longRadianToDegree__Mathlib__DegreeToRadian__Mathlib__longDegreeToRadian__Mathlib___Mathlib__arctaninit__Mathlib__A.ngf8.cmf8.mlf8.adf8.cfi.cfu_FEF__Traps__Message_FIF_halt__fp_hook.cff4.cff8.dvf8__Traps_.sbf8.cif8.text.rom.data.bssPascalIO.o:]A m d N F  J UVEE PYu YE0Yu$YE0hjjjuju FP =tjjjh FFe^UVEE P`Yu UYE0uYuYE0hjjjuju FP =tjjjh(e^UV5 V Yvu^UV9Utu>thFPYY^UE EREE8t:uE8u%j ujYYE JEU}ujjjhD4jjjhXUu0YU Uztjj jhpUBUVu>tjzY~u5hvYYt FFhFPv FF^UEPu]YYUuY1= uCUuoYuUzt1UEPu YY} uUVu>tjYhE Pv ^Uj uYYUj uYYUVWu} V,Yjjjjjjjh>VY uVYE}-uVYVYEE!}+uVYVsYEEEE}tEU0U9sRU0U?433| ?433u9Usjjjhk +EV?YVYEU0r U9v}ujjjh_^U VWu }WYjjjjjjjh>WvY EuWaYEEU0xU9kRU0U>w >u9Usjjjhk EW@YWYEU0r#U9vjjjh_^UEPu`YYuujYE UUM]UBMEpYEp@YU Džƅ uoYjjjjjjjh>uY uuY+t -u U?Y0%9 UY0r 9vۀ.uUUY0r59w) UY0r9vƅE}UsY+t -u UTY0r59w) U-Y0r9vƅƅt1Pu jhjP'ujj jh UjhjPju ujhjPu~UjhjPju ujhjPu8U} tujjjhuujjjhuUU uujR"uUVWuv}t.PjhjPuVuu $c s uu 55y ) )׍PjhjPWVuu f$jjhjPu_^UVEE P-Yu "Y1F9ur!]u Zu j uYYF9uw1]u uYYF9ur]u Zuыe^UV=VFFVF QB^could not open input filecould not open output fileinput text expectedoutput text expectedunexpected EOFinteger too largeinteger expectedcardinal too largecardinal expectedIllegal real TRUEFALSE % (@; <R@[>i /n 0v % (@ <@> / 0@1@C $L@] *@@> /> / 0>  / 0@A ;I@^ ,j@ ) 5q> /! 0)>k /p 0x 5> /  0(>b /g 0o 3 50 +> / 0 7 6d>> 4 1. >L >R &W 1 % ( . . .9 ?N ?[ :` 9e 8j 'o -t @y # @ "  ! @ @  !  ! @ >Pd|+X&|$8)I:azwE- EH Qdu#)4@Qe=FYh__PascalIO__Reset__PascalIO__Rewrite__PascalIO__CloseOutput__1_doclose__2_getstruct__3_Error__PascalIO__ReadChar__PascalIO__NextChar__PascalIO__Get__PascalIO__Eoln__PascalIO__Eof__PascalIO__ReadLn__PascalIO__WriteChar__PascalIO__WriteLn__PascalIO__Page__PascalIO__ReadInteger__PascalIO__ReadCardinal__PascalIO__ReadReal__4_inch__PascalIO__ReadLongReal__PascalIO__WriteCardinal__PascalIO__WriteInteger__PascalIO__WriteBoolean__PascalIO__WriteReal__PascalIO__WriteLongReal__PascalIO__WriteString__PascalIO___PascalIO__result__PascalIO__head__PascalIO__obuf__PascalIO__ibuf__PascalIO__Notext__PascalIO__Output__PascalIO__Input__Streams__OutputStream__Streams__InputStream__Streams__CloseStream_new_stackptr.cmf8__Streams__copy_array__Streams__Write__Storage__Allocate__RealConversions__StringToLongReal__Streams__Read__Storage_.lar4__Traps__Message_halt__RealConversions__LongRealToString__fp_hook.cff4.cff8.inn__Conversions__ConvertInteger__Conversions__ConvertCardinal__Traps___RealConversions___Conversions___Streams__EndOfStream__Streams__OpenStream.text.rom.data.bssProcesses.o:'-TDdD  U VWjYE=u EPYYjhYY5F FRu uuRGPYYuvY_^UVjcYE];tAU]֋VEF FMRQYYuY^U VWjYE];u EE0~~uV5z t95ujjjhF RFPuYYukY_^UjYYE1ۃ}SuCYXUj2YEEuYUVj YE=u7jhYY5F FuY^deadlock   !* /7AT  fo |     3<BJVc  h  pz               !'  <*<Ncu"__Processes__StartProcess__Processes__SEND__Processes__WAIT__Processes__Awaited__Processes__Init__Processes___Processes__cp__SYSTEM__TRANSFER__Storage__Allocate__SYSTEM__NEWPROCESS__Storage___Traps__Message_halt_unstackprio_stackprio__Traps_.text.rom.data.bssRealConver.o:GdxUUu$jujuuu jR$U0VWUM UM}yEUډU EUUܺU9U s]1juU(Euu55 ^1ۅÈ]}tuu@EEU(uu55YYuux UMU(uu5(5$Uuu505,~U9iU+U֋UJkE(Uuur rgYYEEUЋRUUUuur2@ytNEuu5854U9{U+U֋UJkE'Uuur2YYEEUЋM+JMUuur2YY5@5<xtNEE1U܉U}uU E UUUU 9U~U(]1ju-guujj Z0]Ru5H5Duuuujj jYYYYEEG9}w}M}]EuZ]ERui]Ej0uy}t&M]EubZ]ERuO-]Ej1u=E}ut]j0u!G]EuZ9w}u$u ]1uZ]1RuG}}9r3UԉU)֋UJ]u]EutNM׍]j.uG}O}9r3UԉU)֋UJ]uU]EuGtNMG]1j-u-W9U s]1juU(J]jEuGu u5P5LtM}y]]j-u]j+uGj0ujdYYZP]uujdYYEGj0uj uYYZP]ubGj0uj UYYZP]uB}}9r:UԉU)֋UJ]u UU]utNMЋUډ1҉U9w$U+U֍]Ej0utNE+UEUB։}9r3UԉU)֋UJ]u|]EuntNM׃}u]EjuNUJ8]Ej.u6UU9~UU׋UUB]ju}P1}9r7UԉU)֍]EuU]utNMӍ]1j-uGW9U r]Gju9}w U(}~M}9}1}9r7UԉU)֍]EuOUU)]u:tNMӍWM)щ1҉U9w$U+U֍]Ej utNE}W9U r-u WU9w }ԉ)֍]jutNG_^U EEPYuYuEPjuju!U:tuuqYEeU$VWE܍EPPYuEYU TX ZE1UEF9us U] uZ t܍] uZ tɍ] uZ-uEF] uZ+uF] uZUFEjjjjjjhj u UUr25`5\[~E;U5h5dr26YYU0Rj% YYUY[ Z9ur] uZUF9ur)Ejjjjjjhj [}.9u] uZUFEjjjjjjhj u UUr25p5lay>U5x5tr2AYYU0Rj0+YYUY[ ZM9ur] u ZUF9ur)Ejjjjjjhj ]}E9us U] uZUF1E}-t}+u1U1-u@E9us U] umZUFEjjjjjjhj Gu UEk U09ur] uZUF9ur%Ejjjjjjhj u}t}}y Uډ}| UMO"uu55YYEE } uu55wYYEEOy܃}y!Ur2uuQYYUY[ ZUr2uu0YYUY[ Z}tUr2UY[ Z9urU vUe_^UV=_1kց N VN F kց N VN Fkց N VN Fkց N VN Fkց N VN Fkց N VN F^$@$@?$@$@؅W4vC$@؅W4vC$@? _B$@nF3#I97yACؗҜ<חA:0yE>@-C6?Y@{Gz?$@?  u       "9?  D|        4  [ci  n       # (  / [ n         K Y u         : K X k u       9       . G `    3 S  ^       % ? S y          % M s           L     6 < Q W  \ z       ' 4 : @ K Q n t z             "(39V\bmss+C *06DJP\bglrx__RealConversions__RealToString__RealConversions__LongRealToString__RealConversions__StringToReal__RealConversions__StringToLongReal__RealConversions___RealConversions__Powers10.sar4.ngf8_new_stackptr.cmf8.mlf8_copy_array.adf8.cfu_rmi.lar4.cuf8__fp_hook.cff4.cff8.inn.dvf8_dvi.sbf8.text.rom.data.bssRealInOut.o:a1d1,,UUu jR U0Vu'v' s ڍEPjj(jEPRVu u$jj(jEP^UUuu jRyU0}'vE'EPjj(jEPuuu u=$jj(jEP+UEPYuu YEUjhjPPujhjPujj jhUVWEEPYuuYu1҉U9w:})֍] juPKYYjjjh(9tNGϋe_^UjjjEPUjjjEPhU=u(real expected  W i      9P U ] c  |          $ *3sKg}j $9MVz__RealInOut__WriteReal__RealInOut__WriteLongReal__RealInOut__WriteFixPt__RealInOut__WriteLongFixPt__RealInOut__ReadReal__RealInOut__ReadLongReal__1_wroct__RealInOut__WriteRealOct__RealInOut__WriteLongRealOct__RealInOut___RealInOut__Done__InOut__WriteOct_new_stackptr_copy_array__InOut__WriteString__InOut__ReadString__InOut___RealConversions__StringToLongReal.lar4__Traps__Message_halt__RealConversions__LongRealToString__fp_hook.cff4.cff8__RealConversions___Traps_.text.rom.data.bssSYSTEM.o:gduuyUVu EEPYE 9Esj@YUUVUVE0F PuYYuRjY^U=u EE 9tWR?YE 9sj@%Y Rq YYtE  RY  + N Z b  i y          q"+09BIQW\b_curproc__SYSTEM__NEWPROCESS__SYSTEM__TRANSFER_mainproc__cleanup_topsize_TRP_topload_topsave__exit_MainLB.text.rom.data.bssSemaphores.o:0Ud   U VWjYE5u EPYYj hYY=GRu uuRFPYYuzY_^UjhYE] uIYUVuj5YE:u Q cuY^UjYEjEPYYUEuuYXUjYE]3uYXUVWjYE=jjYYƉuRYYtNt'9=u9uujjjhJB9=tRGP%YYuY_^UVujYE~u"V:tNF1PuYX^UVjYE=u8j hYY5FuiY^deadlock    !*  /7AP  bk  x         * ; L _i r       3 FPY  ^  c ho  t| 2T'4<BSfz__Semaphores__StartProcess__Semaphores__Up__Semaphores__Down__Semaphores__NewSema__Semaphores__Level__1_ReSchedule__2_Runnable__Semaphores___Semaphores__cp__SYSTEM__TRANSFER__Storage__Allocate__SYSTEM__NEWPROCESS__random___Storage___Traps__Message_halt__random__Uniform_unstackprio_stackprio__Traps_.text.rom.data.bssStorage.o: :[?ododU VW}v1UUuE} UU<t=4 V9Ut VUU}UVFEEUU9UUU+UUU<s< U΋W+UVV4UWW9Ut WUU}UWG}t MEk5 16tU9VrU9Vt U9Vv6UϋV+UWW<UVV9Ut VUU}UVFV+UϋUWV+UVW9Ut WUU}UWG~=t1nUkPYE=u!uqYE1uUVV9Ut VUU}UVF_^Uu uYYUu Y]ujj jh UuYEtuEPYY1Uu uYYUVWE8ujj,jhE89t!jj?jhHcEU 9Vtjj1jh8U V9U t#EU U:}tjj#jh~wVV< = E_^UVWEU9w:U+U׋U49usuUuutOEЋ5 9usuUuu5CVU>u+9Ur&E8u+VM9QsQVVu9uwU9w"U+U׋UtOE 5suE8uNUzwREUR4 E5 UJUJ9us_^UVWU9w})tNG jYE1)QYEjY_^U=ucout of core(Warning) Deallocate: NIL pointer deallocated(Warning) Deallocate: area already deallocated or heap corrupted(Warning) Deallocate: wrong size or heap corrupted(Warning) Deallocate: heap corruptedDNW]F$Q l   j o   $,m-AKn  ' 28>EV_ d     A S = . Q9 I _ t      __1_MyAllocate__Storage__ALLOCATE__Storage__Allocate__Storage__Available__Storage__DEALLOCATE__Storage__Deallocate__2_ReOrganize__3_InitStorage__Storage___Storage__USED__Storage__FirstBlock__Storage__Compacted__Storage__Llist__Storage__FreeLists_sbrk__Traps__Message_halt__Traps_.text.rom.data.bssStrAss.o:,$,d,UVWu}} ~GFM M}~_^_StringAssign.text.rom.data.bssStreams.o:X-.d   L UE EREE8t:uE8u7hYt(huYYE JEUUUVWEE PrYu gY}u U$juMYE8u U$NEU}1҉U9w,U+U׍]Eu UUYJtOEދUMD } uEjRYYO} u)EjRYYƅxjjV yyEhRYYƅyU$E0YEmU$ErEM EM JEBEBEBEB} uEB  EB e_^UVuUt>uU7~t } u >uUuVYY} uFM N^UVU }tU:uU :u~uU )~ ~#V UF uFPv6 y^UVu>t::t3U zt u 6uYYrYy6VYU ^UVuU t>u U 17~t U 1'~tVGYu ~t1^UV5>t~u EPVYYvu^UVuV9V V LML~t1F9UuvFPv FF ~ FENME^UVU uuYYEU:u }tuV M TF ^UVU uuYYEU:u }tuV M TF ^U VWu1҉U9w,})։+UUU uRu tNG_^UVW}t?u UD?uuU1F V M LV9V } } u~u uWYY_^UVW}t?uU8?uuU%F V M LV9V | uWYY_^UVWEE P3Yu (Yu1҉U9w,})֍]uu u\ tNG݋e_^U V5uEPEPYYvu^UVWu} t>uU?~t uVYYjjv yU~u V+V B_^UVWu1t>u Ur~t uVYY FF~ujjv DžyU19} }U$ju v DžyUU_^U}tU:u U 1 UrYUV44FFFFFF FFFFFFF FEP5=YYtFFFFFFFF FEP5YYtFFhYt^U=up- #: "L-Y-g  ! % () (M )_ }   &- '  ! %-! )x ) ) Xh-lr-v|------ B]-c*h m,~, $  m x  t  )1 F S *c rw   b   C 6_"y-=M]4m"(/5;BHMS__1_getstruct__2_freestruct__Streams__OpenStream__Streams__SetStreamBuffering__Streams__FlushStream__Streams__CloseStream__Streams__EndOfStream__3_FlushLineBuffers__4_NextByte__Streams__Read__Streams__ReadByte__Streams__ReadBytes__Streams__Write__Streams__WriteByte__Streams__WriteBytes__5_EndIt__Streams__GetPosition__Streams__SetPosition__Streams__isatty__6_InitStreams__Streams___Streams__head__Streams__ebuf__Streams__obuf__Streams__ibuf__Streams__ErrorStream__Streams__OutputStream__Streams__InputStream_isatty_CallAtEnd_creat_new_stackptr_write_copy_array__Storage__Allocate__Storage__Available__Storage_.lar4_close_read_open_lseek.text.rom.data.bssStrings.o:r 6d U VWEEPYuY}9} s} 1] u]uF9w] uZu9u v]jue_^UVWEEPmYubYjujuEju juE9E(vE(uU9U s+u &J]uU]uN9u(rՋUJ1҉U9w:u)׋U(9U rG] uU(]utOFϋUU9U rUU]ju~e_^UVWu}Rjuju9r"8U] u9] u,FU9r׍] ju_^U(VWE]EPYuYEPYuYju juEjujuE9EsU }u1rU+UU1҉U9PU+U1GUJ9w%U]uG] u:ZY9t9}uEtNE뺺U ЉEe_^UVW}EEPYuYjuju+9G19u(r@}t&9}r!] u]$u FGM9u(r]$ju e_^UVWE]EPdYuYYEPOYuDY1$9u0] u)],u(F9ur] u Zu1!9u0rG]u],u(FG9} r]uZu9u0r],ju(e_^U VEEPYuY1] u{ZuF9usEe^UVWE]EPFYu;YEP1Yu&Y}9} s} 1k] u]uZY9s ] u]uZY9v Y] uZu1CF9v9ur] uZt 9u r]utZt1Ee_^U=u      :  G  Y  r       D  V  ~              (          N  [  v                    /  H  d  o                  -  J  j  } S + 6 < J V \ b g m __Strings__Assign__Strings__Insert__Strings__Delete__Strings__Pos__Strings__Copy__Strings__Concat__Strings__Length__Strings__CompareStr__Strings_.sar4_new_stackptr_copy_array.lar4.text.rom.data.bssTermcap.o:$i^d^44UVEEPYuYuhYYjYu fyEPjjjht1U EPjjjhtUEPjjjh tUueE^UEEPYuYuYEeUEEPYuYuY1=uC]eEUuu u UVEEPYu}YEEPu]YYƋE0u1U)UEe^Uuu u U jjjEPjjjh$ uh,EPjj jjjEPU=upcupbcTERMdumb  % *4  ?Kd}     * 3 Z t      !EN SMc @*:IQUclt__Termcap__Tgetent__Termcap__Tgetnum__Termcap__Tgetflag__Termcap__Tgoto__Termcap__Tgetstr__Termcap__Tputs__1_InitTermcap__Termcap___Termcap__BufCnt__Termcap__Buf1__Termcap__Buf_isatty_BC_StringAssign_tgetent_ospeed_new_stackptr_PC_copy_array_UP__Arguments__GetEnv_tgetflag_tgetnum_tgoto_tgetstr__Arguments__tputs.text.rom.data.bssTerminal.o:y"/d "&U= tU   ju5 yU UV= tU   kjj5 ƍFPj5s yju5\ uU U Vj54 y^U UjEP5 yUj YUVEEPYuY1] uYF9ur] uZuՋe^U=u6h hjj yjhjYY /dev/tty' ,>JV^n  s         ( : Sgpuz   J[Dp b )7>EQW]cint__Terminal__Read__Terminal__BusyRead__Terminal__ReadAgain__Terminal__Write__Terminal__WriteLn__Terminal__WriteString__Terminal___Terminal__tty__Terminal__unread__Terminal__unreadch__Terminal__fildes_StringAssign_new_stackptr_fcntl_write_copy_array.lar4_read_open.text.rom.data.bssTraps.o:k[d[  UuYUVWEPYuYEtL"U 5FEU:uƄ5"FVPj{ y:8jhjPj[E-PPjA y51, line y-Dž 10Wj YYu 5FuƄ5:V FPPj. y1F9ur] uZuVuj y jPj y_^UuYU=u   & 1  7      q       ;GP U;Wh4vB__Traps__InstallTrapHandler__Traps__Message__Traps__Trap__Traps__LINO_new_stackptr_write_copy_array_SIG__Arguments__Argv_TRP.lar4_FILN_dvi__Arguments_.text.rom.data.bssXXTermcap.o:h! d ; ` `  UVWu} u>tFGFЄuE_^UVWu} uGFЄuE_^UVuu>tF+U^UVWu }9t&?u(>u)ۉGu1F_^UVWu }UIM~:9t&?u&>u)ۉ GtF1_^UVWUt}u14EEׅt#u>t FG9t>u؀?=uӍG1_^UVW}M e 9r7hh uZ 9u12+ F u_^UVWu OYfEUh(YƅtD>/t8h YEt&uu -YYuVuYYjVYYDžyWhP #tڍPPY-Z‰U:\uWhu u1^u PSYYtPuYYWYu1WY1_^UVWu} ?t9uGF?u>|t >:t>u>t >|t>:tFF<|t1_^UVWURRYZ‰׃?:tO9=v1tuct =~1GP|P YY|>t>:tF|PPYY=t 10 >t>:tFVWYYU_^UVW5t }t>u F>t>:u>F> t> t > t> uFjuV N>t >:t>#tF>#tJ1F>t$=0|=9k Ã0F׉>r>:iF_^UV5t }t>u TF>t>:u>>F> t> t > t> uFjuV u>t>:tF1^U VW} 5t }t>u1`F>:u>OF> t> t > t> uFjuV  >t >:t>=tF>=t1UF>>:F-@   v lE>t(=0|=9Uƒ0UFӋEN+ #F0 F$E>>:F1_^U$VW}EEU:,:%u |$EEE9Uu tU:+]EUMU 9t}u = tCU 9t}t=t p PEPYYFU9uE 1JUU܋U UU܉U +UU(u `u`%FE Eu h PYʉu `RY)щu XUU9uE 1ǃ}d|dE0F U:3u F} |dE Й0FU:3t:2u F E0F"P7EUSU FEEPVcYY_^UVWu1u =0|=9F-0k k ǀ>.u7F=0|=9 F-0=0| =9F>*u U ׉F>t FPUYtX~M=s? J ЙljJWZtPUY_^/etc/termcap/etc/termcapTERMTERMCAP; 0123E\^bfnrt&\&~Q QQQQQQQ %+.2 3 >BDd inrkOOPSOOPSOOPSOOPSOOPSOOPS 5MS7)        (`g o} $9 C Wak0<DLT\dlt| "2 7 $,4<DL %,3F M     y        -Rq&/7o>GNSajet}j   _ospeed_PC_BC_UP_capab_strcat_strcpy_strlen_strcmp_strncmp_getenv_fgets_tgetent_match_name_check_for_tc_tgetnum_tgetflag_tgetstr_tgoto_tens_of_ms_p_char_tputsI_11I_1.csa4.csb4_close__penviron_read_open.text.rom.data.bssSabsd.o:V@28d8Uu u55xu u u uXZ   0$*06@FKQ_absd.ngf8.cmf8__fp_hook.text.rom.data.bssabsf.o:)#2#d#UujYYxE uX   $_absf.ngf4.cmf4__fp_hook.text.rom.data.bssabsi.o:d{{{U}xEUډ÷_absi.text.rom.data.bssabsl.o:d{{{U}xEUډ÷_absl.text.rom.data.bssblockmove.o:&!&d&UVWu} UуMtFG_^_blockmove.text.rom.data.bsscap.o:d{{{UVu>ar>zw^÷_cap.text.rom.data.bsscatch.o:0kd~NjU(VWU9t tWօt">tF+WjRjwwUUؾ UU܃}y]-F Eؙ0M܈Eܹ EؙE؅u؍U9Uv M܋U܊ F-jPjhB}Gu0j5,YY%5PYYu Y}DtuYhY_^got a unix signalinternal error; ask an expert for helpcardinal underflow(warning) FOR-loop control variable was changed in the bodycardinal overflowno RETURN from function proceduretoo many nested traps + handlersstack size of process too largeGTO descriptor errorargument if LIN too highbad monitor callbad argument of laeprogram counter out of rangebad pointer usedaddressing non existent memorycase errorillegal size argumentillegal instructionheap overflowstack overflowconversion errorundefined realundefined integerdivide by 0.0divide by 0real underflowreal overflowinteger overflowset bound errorrange bound errorarray bound errortdXH4 $ dP< @ABCDPE<FGerror number xxxxxxxxxxxxx     $ , 4 < D L T \ d l t |                > Q           _errors_catch__cleanup_getpid_SIG__Traps__Message___signo__exit_signal_kill.text.rom.data.bssconfarray.o: Fd  (UVWuVV !ׁ=(rjAY0ډ_^UVW}JJ MU ֋ UуMtGF_^ $ -39W`pJ _ppdescr_new_stackptr_copy_array_descrs_TRP.text.rom.data.bssldvi.o:g F1FdFUVWu} ujY11ۅ9tyމJىЙ_^UVWu} ujY11ۅ9tyމJىЙ_^UVWu }ujRYu1411ۅ9ty߉JЙ)_^UVWu }ujYu1411ۅ9ty߉JЙ)_^  ^  6;LAFLQW\b_dvi_dvil_rmi_rmil_TRP.text.rom.data.bssthalt.o: mMidiUJx U= |1A M UjY  ,9B L b'W_callindex__cleanup_CallAtEnd_halt_proclist__exit.text.rom.data.bsshead_m2.o:e bwbdbU-U U91U9Ru5ZYY  " ' ,  1 =C M SW9#+28@FOUZ`__m_a_i_n_trap_handler_bkillbss_argc.trppc_argv___M2M__catch_init_MainLB_halt_handler.text.rom.data.bsssinit.o:R QdUjjGYYjjGYYjjGYYjjYYjjGYYjjGYYjjGYYjjGYYj jGYYj jGYYj jGYYjjG{YYjjGpYYU    ) 4 ? J U ` k v  %-5<BGM_init_killbss_handler_argv_argc_MainLB_sigtrp_catch.text.rom.data.bssload.o:6a!adaUVW}us1utjFYuWZt E E FU)уuUU_^ ( &+1_load_TRP.text.rom.data.bsspar_misc.o:e HdAAAUVWE8uUEERZ)ډ_^UVWU55PURZ)ƒURPMPu _^UVWUE‹]P9rZZՋ"U5JPAYYZZ1_^2;A g   &,/w8<AJOUZ`_topsize_topsave_topload_svhol0.ignmask.blm.text.rom.data.bsssrandom.o:}11!d!  Uu 7u 7     UVu9u wVWU )1Yʉ^UVW79wJ)щiE{E tNɾ9)щ5j7YY@ U5jYYPj7sYY@M ktNy_^U=u2jY1҉ 1 PY6$+6@IPZdkr|7>J  QY`js  z      +7C OW\bgmrx__random__Random__random__Uniform__random__StartSeed__random___random__tm__random__k__random__j__random__X_getpid_rmi_time_dvi.text.rom.data.bssrcka.o:!dU} x UM 9J}jY _rcka_TRP.text.rom.data.bssrcki.o:"!"d"UEU 9 UM 9J}jY _rcki_TRP.text.rom.data.bssUrckil.o:"""d"UEU 9 UM 9J}jY _rckil_TRP.text.rom.data.bssrcku.o:"!"d"UEU 9w UM 9JsjY _rcku_TRP.text.rom.data.bssrckul.o:"""d"UEU 9w UM 9JsjY _rckul_TRP.text.rom.data.bsssigtrp.o:/ Od<<UhuYYUU4YU VWu ~0rz}u*}u1 }x }~CUWV^YYE=u}u jV=YY UE_^   ! &9H   - $*___traps___ctchsig_sigtrp___signo_TRP_errno_signal.text.rom.data.bssstackprio.o:F:46d6UU9Uv UEUU0#(06;A_prio_stackprio_unstackprio.text.rom.data.bssstore.o:/Y"YdYUVW}us(1utjFY#fUuWZt FU E _^ ( $*_store_TRP.text.rom.data.bssucheck.o:cQ6QdQU+U9U vjCYU}t1u9E vjCYUU9U sjEY  5 J-6?<HMSX^_adduchk_muluchk_subuchk_TRP.text.rom.data.bss,__.SYMDEF:$r    ( 1 7D =0C I$OU]"d$k$q%x%,-/`124?"@RABD@F:G@I@I@I@I@I@I@I @I@ILL$8S*8S18S78S>PUDjVLjVTjVZX`YhZp[v[|aabrdrefxhvijvlmnoooooo rNt(z{$|*~0~6<BHNJVJ`JhJrJ|“ʔԕ VVVНН __abi__abl__abr_argc_argv_argshift_environ__ass__asz__atn__bcp__bts_buff__catch_clock__xcls__cls__ecvt__fcvt_diag__dis__efl__eln_encaps__exp__fef__fif__get__gto__hlt__hol0__incpt__fp_hook__ini__extfl__extflc__m_lb__curfil__pargc__pargv__penviron__log__mdi__mdil__dvi__dvil__mdl__lastp__highp__new__nfa_nobuff_notext__opn__cre__flush__outcpt__pac_pclose_pcreat_procentry_perrno_procexit_popen__put__rcka__rdc__skipsp__getsig__fstdig__nxtdig__getint__rdi__rdl__rdr__rf__rln__rnd__sav__rst__sig__sin__cos__sqt_strbuf_strtobuf_strlen_strfetch_strstore_trap__trp__unp_uread_uwrite__wdw__wf__wrc__wln__pag__wrf__wsi__wri__wsl__wrl__wsr__wrr__wstrin__wsc__wss__wrs__wsb__wrb__wsz__wrzabi.o:d{{{U}xEUډ÷__abi.text.rom.data.bssabl.o:d{{{U}xEUډ÷__abl.text.rom.data.bssabr.o:V@28d8Uu u55xu u u uXZ   0$*06@FKQ__abr.ngf8.cmf8__fp_hook.text.rom.data.bssarg.o: zPzdzUU9U|1 U U=~ UVօtEtUIMy1^!/8>N *E_argc_argv_argshift_environ__pargc__pargv__penviron.text.rom.data.bssass.o:)dU} uujDY   __ass__hol0__trp.text.rom.data.bssasz.o:dyyyUURBMQõ__asz.text.rom.data.bssatn.o:E \Jd@@hXhUVWu u551ۅÉ߅tu uEE u u5 5~&55u uYYEE 1u u55csF5$5 u u@YY5,5(-YY5450YYu u YY5<58u uYYYYEE u uu uYYEE55uuYY55YYuuYY5 5YYuuuYY55bYYu uuuOYYHYY5D5@uu/YY5<58YYuuYY5450YYuuYY5,5(YYuuYY5$5 YYYYu uYYEE ~u uEE 4L4Hu uqYYEE t u uZu uXZ_^??V͞^&?Ul???LXz?Q`+˼4cj\? z꿩ļ|D@m U@ף 2 M@JI .@?fs-8R?-DT!?fs-8R?    6 H N S ` f q             ( 6 < G O U Z g o u z                       - 5 ; @ G T l y   x~__atn.ngf8.cmf8.mlf8.adf8__fp_hook.dvf8.sbf8.text.rom.data.bssbcp.o:BBdBUMx6UM  9}!EE] QE Y9~̸1__bcp.text.rom.data.bssbts.o:[ ;0;d;UM]U 9UMEMEM]   % 5+16;@EKPV__bts.los.set.sts.ior.text.rom.data.bssxx:UVWEUUЍuPׅt> EU9tUztE}؍@UUԅt= E10GE1EԅuU9v OU EU:EU EUE@#U`u.Ru xRtUzt R^dU}؃}y ]ЋU-E EЙ0GEЙEЅuU9v OU EU`uEt$}?tG+URujE yu4Yu+Y_^non-ASCII char readdigit expectedwrite errorread errorclose errorrewrite errorreset errortruncatedend of filenot readablenot writableillegal field widthfunction not assigneddispose errorfile not yet openonly positive j in 'i mod j'array bound error in unpackarray bound error in packassertion failederror in sqrterror in lnerror in expmore args expectedGTO descriptor errorargument if LIN too highbad monitor callbad argument of laeprogram counter out of rangebad pointer usedaddressing non existent memorycase errorillegal size argumentillegal instructionheap overflowstack overflowconversion errorundefined realundefined integerdivide by 0.0divide by 0real underflowreal overflowinteger overflowset bound errorrange bound errorarray bound error error number : file , L8(  lTH(@AtBhCXDDE(F GHIJK`a|bpcddXeHf<g0h$ij     $ , 4 < D L T \ d l t |                     $ , 4 < D L T \ d l  2 c r   &         _errors__catch__pargv__curfil__hol0__exit__write__trp.text.rom.data.bssclock.o: % d UEPYUU  _clock__times.text.rom.data.bsscls.o: qKqdqUVuFt#P#V@u  VYVY^UVu5Vu#VYv YtjfYF^ ' .? V b6__xcls__cls__outcpt__curfil__flush__close__trp.text.rom.data.bsscvt.o:+_d@V@"Ujuuuu u#Ujuuuu uUVW}yE}~EEEEu u55hyEu uMEE Eu u5 5'x UM u u55u u5$5 Cv6u u#v vu uYYEE VEƃ~u u5,5(fZv6u uKYY54508y'v6u u!YYEE E+VE믃~E}uEUUvE9}Zu ujj Z0Gu uu ujj jYY5<58YYEE 띁}U}=9~80v O@1E}uҁ}vU0E뾋U_^$@?$@$@nF3#I9 7yACؗҜ<חA:0yE>@-C6?Y@{Gz?$@???Ejs           ! ' , G _          8 W  a  f n t y:AHM<RV\bhmw}__ecvt__fcvt_p10_cvtI_1.ngf8.cmf8.mlf8.cfi__fp_hook.sbf8.cif8.text.rom.data.bssdiag.o:A9d9UVuVFFF FFF^DIAG_diag.text.rom.data.bssdis.o:! 9dDDDUVWu~9} sjIY9} t1U RVE _^UVWUUE 0ujIYUV=u6B9v95s=97s?79wVWTYYt>9v WV?YY96w55E _^  hu> _merge__dis__lastp__highp__trp.text.rom.data.bssefl.o:N?3?d?UVu5VtjHYFuVY #V1^  (!*28>CI__efl__curfil__incpt__trp.text.rom.data.bsseln.o:#4'4d4UuYUB tjbYU#J1   __eln__rf__trp.text.rom.data.bsscencaps.o: 6dUUUAUu UYUUUURURUJurQt ZYRYYYZYUA2;IUaA_encaps_handler_enc_lb.trppc.text.rom.data.bssexp.o:K hshd88UVWuu u55yu uEE EPu u EU u~O~$5 5u uYYEE ׉Rjcu uXYYEE Q}$u u552YYEE ׉ډѺu uRj YYEE Wju uYYXZ_^U(VWu u551ۅÉu u5$5 ( ,UMQR5450pt/u u5<58RyQ5D5@u u5L5H#y5T5P5\5Xu u5d5`xHu u5l5h~jAY5t5p25|5x!tu uEE u u55hYY55UYYjjJ ^Vj>EEu ujj) jEEu uuuYYE؏Euuuu55YYYYuuYYuu55YYYYEEtuuEEuuuuYYEE55uu`YY5 5MYYuu@YY55-YYuu YYEE FVu u5450uuYY5,5(YYuuYY5$5 YYuuYY55YYu uYYYY55YYx RPXZ_^AAҼz+#qmDCҼz+#9B.@9B.@+eG??0? a\+??*K?*D??Q(?(\ D?U c3> # 5  Ojp {        .4 9QW \ms    ,2 7  ELR]c w              -;A F  M d }         #+1 6 CKQ V  c jrx }       # ) / 5 ; @ F _Ldexp__exp.ngf8.cmf8.mlf8.adf8.cfi__fp_hook.dvf8__trp.sbf8.cif8__fef.text.rom.data.bssfef.o:"dUu uPEXZ __fef.fef8.text.rom.data.bssfif.o:'''d'U]PYUY[ ZXZ   __fif.loi.fif8.text.rom.data.bssget.o:)')d)UVuVYF tjbYf^   __get__rf__trp.text.rom.data.bssgto.o:hE/EdE UE }tEEU BU .7< A9?FMRX]c__gto_descr__m_lb.gto.text.rom.data.bsshead_pc.o:dddd.text.rom.data.bsshlt.o:\ 2:2d2UV195~<t 4YFuY^  *"(07=FLQW__hlt__extfl__exit__cls__extflc.text.rom.data.bsshol0.o: " d nnnU__hol0hol0.text.rom.data.bssincpt.o:2d***UVuF tjbYNfV~JVvFPv F~y=tjgY҃~uN BV+VV~yjciYF@t"tjjQY: u N ^  GY c  __incpt__read_errno__trp.text.rom.data.bssini.o: ydDTXUVW}hYUU } Uօt/VF@FF FFFRօt?VFFF Fj;YtFF_^OUTPUTINPUT "  '1:MS n  x__fp_hook__ini__extfl__extflc__m_lb__curfil__pargc__pargv__penviron__isatty__catch__sig.text.rom.data.bsslog.o:F?Vd` `8k8U$u u55jBY5 5fEPu u EU RP55fu u55vYY5$5 cYYEEu u5,5(DYY54501YYEERu u5<58YYZYUMQR5D5@YY5L5HYYEEMuuuuYYZYUMQRQRYYEE55uuYY5 5YYuurYY55_YY5450uuFYY5,5(3YYuu&YY5$5 YYuuYY55YYYYuuuuYYYYuuYYEE ujZYUMQR5T5PYYu uYYEE uu5\5XlYYu u_YYXZ;f???????? a\+0?P Jb0@)VDw ~&s@gKA?    ' . 4  H Y _ d {                 8 K Y _ j r x }                     # * 7 I Y _ d q    {__log.cmf8.mlf8.adf8__fp_hook.dvf8__trp.sbf8.cif8__fef.text.rom.data.bssmdi.o: 6dLLLUVu }jGY}օyu^UVu }jGY}օyu^UVWu 1}y UډUyډ1lj1uƅtډ_^UVWu 1}y UډUyډ1lj1uƅtډ_^  9)R__mdi__mdil__dvi__dvil__trp.text.rom.data.bssmdl.o:)")d)UVu }jGY}օyu^ __mdl__trp.text.rom.data.bssnew.o:$ 8d@@HUVWuV֋UzEU9r[R)MQUzu,9Uu E EE9Uu UUUJMM*UU9uEPVYUUEPDYUE }9}v _^ft}  __lastp__highp__new__sav__rst.text.rom.data.bssnfa.o:"dwwwU}ujJY  __nfa__trp.text.rom.data.bssnobuff.o:*&*d*UVu#VuVYVVV^ _nobuff__flush.text.rom.data.bssnotext.o:dsssUE`ï_notext.text.rom.data.bssopn.o:9]AdAU VWǾV U!0MEuUhVYYDžy,hVYYDžyhVYYDžx&WYujVwYYDžx ViYtje]Y_^UVWu5} u E M@19=~94tG9=ZFEu6Vu.VYjjv =jdYVYF sO19=j@YVVYEujv|YYF y(jdlYhv\YYF yjeLY} ~E } ډЉFU VVUV_^Uu uh t U BUu uh~ t U M RQLOCAL/usr/tmp/plf.xxxxx    >  T  j x       $ 0 P Y ` l     #).4_tmpfil_initfl__opn__cre__lseek__extfl__unlink__xcls__open__pargc__creat__getpid__pargv__curfil__close__trp__cls__extflc.text.rom.data.bssoutcpt.o: <dUVWuVV+Vׅ~3VVWFPv Ey =t 9}tjhY_^UVufVV+VV~VY^ +; JiqSz__flush__outcpt_errno__write__trp.text.rom.data.bsspac.o:"dUVWuU MI9JE+օxU JU9J}jEYURUUU RBM Qփyu}NJUEU zu}UUNx&UfENxEEU E_^ 9ou{__pac__trp.text.rom.data.bssepclose.o:$drrrUuY _pclose__cls.text.rom.data.bsspcreat.o:dV2VdVUVuVYVFU VFFFhu YYF yjeY^  > N2:BHNTY__pcreat__creat__trp__cls.text.rom.data.bsspentry.o:m :;2d2UVrVhj VuYYVY^call   " *2=EKQW]bh_procentry__extfl__wrs__wrz__wln.text.rom.data.bssperrno.o: % d nnnU_perrno_errno.text.rom.data.bsspexit.o:l ::2d2UVrVhj VuYYVY^exit   " *2<DJPV\ag_procexit__extfl__wrs__wrz__wln.text.rom.data.bsspopen.o:_S0SdSUVuVYVF@U VFFFju YYF yjdY^  ; K/6=CIOTZ_popen__open__trp__cls.text.rom.data.bssmput.o: *d{{{UuYuY  __put__outcpt__wf.text.rom.data.bssrcka.o:$#$d$UEU 9 UJ9M ~jY __rcka__trp.text.rom.data.bssordc.o:()(d(UuYE]uYE   __rdc__incpt__rf.text.rom.data.bssrdi.o: \dsssUE: t: u uYUE1Ƀ-uAMu E:+u uYEUVE0ރ v jiY1^UVu{YE0ރ v^UVWukYEuY1k )uYDžy}tډ_^UuYuYuY  J m  7@ITRy[djrw}__skipsp__getsig__fstdig__nxtdig__getint__rdi__incpt__rf__trp.text.rom.data.bssrdl.o: YEYdYUVW}WYWYWYEWYE1k +EWYEy}tډ_^    % 9]clu~__rdl__fstdig__nxtdig__getsig__rf__skipsp.text.rom.data.bssrdr.o:6d(L(t tU5555~<555 5YYujYYUVWu  V`YVYYVRYEVHYW?YV8YDžy:.u*V$YVYWY VYDžy:et:EuVYVYUy] UMMx!5$5 uuYYEEڃ=y'55uuxYY%uu55QYY}t55, 55XZ_^؅W4vC$@?$@  )17=C H T  Yagz           "28IO Zjsy   ,1m7:AJSY_ekt}_dig__rdr_r_pow10__fstdig__getint.ngf8.cmf8.mlf8.adf8__nxtdig__getsig__incpt__rf__skipsp__fp_hook.dvf8.cif8.text.rom.data.bssrf.o:WA2AdAUVu5VtjHYFtjaYFuVY^  ) 9%*3;AGLR__rf__curfil__incpt__trp.text.rom.data.bssVrln.o:*)*d*UVuVYFu VYf^   __rln__incpt__rf.text.rom.data.bssrnd.o:d2LdLUu u55y5 5 55u uYYXZ?  #)17 Bhntz__rnd.cmf8.adf8__fp_hook.text.rom.data.bsssav.o:"0dU]UE0  __sav__rst.reghp.strhp.text.rom.data.bsssig.o:#drrrUU__sig.trppc.text.rom.data.bsssin.o:#P@Wdhh@d@U$V1u u55yu uEE }t#15 5u uYYEE UM UMuu55wYY55dYYEEEP5$5 uuAEP5,5(uu#RP5450 t 1ƃ}tuu5<58YYEEEP5D5@u uE܉Uuuuu5L5HYYYYEE uuu uwYYZYUM QRuu5T5PTYYMYYZYUM QR5\5X0y1u uEE u uu uYYEE5<58uuYY5450YYuuYY5,5(YYuuYY5$5 YYuuYY55lYYuu_YY55LYYuu?YY5 5,YYuuYY55 YYu uuuYYYYu uYYEE t u uu uXZ^Uju u Uu u5d5`yu uEE ju um -DT!?m0_??????" @KUUUUUUſ?>*c$>]KEZ0jh<=I jߓi<    . G M X z              . 4 ? Z ` e  l               % + 0 = E K P ] e k p }                    . _ e j |?T _sinus__sin__cos__fif.ngf8.cmf8.mlf8.adf8__fp_hook.sbf8.text.rom.data.bss}sqt.o:1&]DdDHHUVWuu u55yu uEE EPu u EU u~O~$5 5u uYYEE ׉Rjcu uXYYEE Q}$u u552YYEE ׉ډѺu uRj YYEE Wju uYYXZ_^U u u557u u5$5 yjCY5,5(EPu ux EUUt"M5450uuMYYEEEHPuu5<58!YY EUE}x>u uuuYYuuYY5D5@YYEEMuuXZAA@?@   # 5  O j p {          , 2 7 J P U c j p             $ ) !&,_Ldexp__sqt.ngf8.cmf8.mlf8.adf8__fp_hook.dvf8__trp.cif8__fef.text.rom.data.bssstring.o: lDldlUEUV1MxEEM E tF^UV1EE8tF^UU JUUEU JU<DN0VI`Xjpu{_strbuf_strtobuf_strlen_strfetch_strstore.text.rom.data.bsstrap.o: " d qqqUE _trap.Xtrp.text.rom.data.bsstrp.o: " d qqqUE __trp.Xtrp.text.rom.data.bssunp.o:"dVVVUVWuU MI9JE+օxU JU9J}jFYURUUU RBM Qփyu0}N}tEEEEӋU zu=}UUNB}tEE%݋EENxEEU E_^ 9__unp__trp.text.rom.data.bssuread.o:$dzzzUuu u  _uread__read.text.rom.data.bssuwrite.o:&dzzzUuu u  _uwrite__write.text.rom.data.bsswdw.o:)-)d)UVu5#VuVY^ __wdw__curfil__incpt.text.rom.data.bsswf.o:/5*5d5UUURtjHYUBuj`Y  . $*__wf__curfil__trp.text.rom.data.bsswrc.o:p Z6ZdZUE] u Yu YUuj YYEHUuj YYEH  :@$F?LUZ`ek__wrc__wln__pag__outcpt__wf.text.rom.data.bsswrf.o: <d@@@UVW}x} yjKYiP~PEPEPWuuE}t-F}0F!U:tE0FM}߅~.FE} Ox0FOxU:tE0F㍕i)uiPQu +_^  @ __wrf__wstrin__fp_hook__trp__fcvt.text.rom.data.bsswri.o:1d   UVW}yjKYu} y"} uuhj uA߹ 0NDžu} yN-U)uVRu_^Uu uj k -2147483648 - 7 z__wsi__wri__wstrin__trp.text.rom.data.bsswrl.o:1d  UVW}yjKYu} y"} uuhj uH߹ UE0NDžuك} yN-U)uVRu{_^Uu uj d -2147483648 - 7 __wsl__wrl__wstrin__trp.text.rom.data.bsswrr.o:M Bd{{{UlVW}yjKYuUU}EEPEPuuu ǃ}t- F?0uEGF.FM}~GFeFMy ]-F+F}|*F*F*F3dE0F E0FE0FU)uEPQu_^Uuu uj   @   '17=BH__wsr__wrr__wstrin__ecvt__fp_hook__trp.text.rom.data.bsswrs.o: )Qd}UVWu}VY+U ׅ~ VYOM xEE VY_^U}yjKYuE PjuUVWu }xyjKuY9}uuVWa_^U}yjKJYuu uuU} tuhjuuhjurUu uj falsetrue  $ ? V    irJxq~__wstrin__wsc__wss__wrs__wsb__wrb__outcpt__wf__trp.text.rom.data.bsswrz.o:y ]4]d]UV}yjKYu >tF+U uu Ru^UVu>tF+Uu uR ^  - SEK7QW]cint__wsz__wrz__wrs__wss__trp.text.rom.data.bss,__.SYMDEF:$(Db_main_yyerrormain.o:+duuuUPY   _main_exit_yyparse.text.rom.data.bssyyerror.o:" 2dUuhh 1%s   _yyerror___stderr_fprintf.text.rom.data.bssXPdP1$T$Lsu;SSSSu QRPP )/@  E  K"'08?IOTZbegtextbegrombegdatabegbssm2rtso__penviron__fpu_present__penvp__edatahol0_environendtext__exit__m_a_i_n.text.rom.data.bss bZdZ1$T$Lsu;SSSSu QRP8P )/@ F O  U !/7?DMV^eouzbegtextbegrombegdatabegbssprtso__penviron__fpu_present__penvp__edatahol0.ignmask_environendtext__exit__m_a_i_n.text.rom.data.bss,__.SYMDEF:$z % 0 :\FvP^ h0tPv"N_malloc_free_realloc_printf_putk_sys_abort_sys_copy_sys_endsig_sys_exec_sys_findproc_sys_fork_sys_getmap_sys_getsp_sys_kill_sys_newmap_sys_oldsig_sys_sendsig_sys_sigreturn_sys_sysctl_sys_times_sys_trace_sys_xit__taskcallkmalloc.o: NFNdNU VW}sW!EE0t-VU9UuEURV9>sVUʅu'WY=u1C>FE0똍W9r!U)EUNJ>UVVEF_^UVW}t*uEE8t 9sWUE0~_^UVW}u1WЉEu YƋU 9UvE EPWV WzY_^ % e :JRXakrz_malloc_free_realloc_freelist__sbrk_memcpy.text.rom.data.bsskprintf.o:)*dP{P((Ut 5(U G9} h$ $YU (>5)fN=0|&=7FNÃ0fNNuN fNN%fN]f$=0|J=7@F$Ã0f$fNfNF'U G$ f$u u YYj<Yj4YXJ_^U VWEX_T_@hx hN;"YYNfNf\_\_ thl hp_"YYl_Vtv wYPVYYM[U :E t}t WhT "YYEhP WsYYNu Wh@ !YYWUY5NmY뜃}uNHh8 ,YNt|f|_^U VWUUU:tE:/uUU1 }V^FuYfN3113}S3<Ut?W€u2Wu*Nuw h 5!YYG fG?F1 }.V^ׅtVh YYV^F_^UVWNtUf \_f\_\_t5l_hp_YYf,X_T_@1 }W ^ ^GO~1)щO9vVN)  =uO~1)щO9vfFfFfF5N!Y5NhNYYf/_^UVujYt'95NthVh\I~u N\I5NNf`_Ntf\_f`_f`_fd_^UVW}5(EYu5(h YYhxeFYE~UO~1)щO9HUV VVNʉWV WVN)щO V WW UjW~GYYU$t1)MU_^UVWj!YNU}UrV€F%-1)‰ׁO u4WOʉUWVfWUVF%fF =uUOR)ʋMQ u UNJ t9 =tV€t VUFrjPv EU E}3S3U4Ut;F=u, =t Vjjhv ]6E$ tKO~1)щO9v(wV Y^PjSv _^UV %Ct u%Cu _t.uVY}0 cVYaVzYVVYK?ƃ t?u9jY*jYjY B1:NN:|NX@j5NV[jYYWV\YNNN:|NX@ 5NhYƃu1~ƀVYƉ5_^UVW11?4-&_U1s }t}FUNN:|UNX@U5NRfiYY_UN>NN:|ыUNX@ˉыU5NRiYY믾_fOUNN:|UNX@U5NRhYY1s }t}FUNN:|UNX@U5NRShYYOUN|JNN:|ыUNX@ωыU5NRgYY볋=O5ONNN:|GNKCG5NPgYY뿾_  E NN:|UNX@U5NRUgYYN|:NN:|GNKCG5NPgYY_^UVW11F?8E /E !E E EN|8eNN:|NX@ 5NeY EŋU_E_oNN:|NX@ 5NdYPY5_5O=O_ E[N|4NN:|NX@ 5N:dYGɋE_^UVN=tNfNNN:|NX@ 5NcY=u1Vr hD Yd_ t2l_l_:|l_X@5l_VdYY^UV_NN:|NX@ 5N1cY=u hX 3Y%_ 5_Mu^UVW} Ǿ)t9uf N_^U VW$JEPM|UGfE%Cu}_tUfNh$JYƅuGjVYh$J YF NCfN^33RVYY^=3}Vf_F 5__^UVW}|JEM} h YAs F%CuΉfNNǾ|JE >0u$EF>xu EF >buEF}tftbu h|JYH_FDžt/9~'09}w hx ^YU__Ǹ _^U VW=)u&)RgWYOu h Y5Oǃ tufNh Yw9}n\u~Nj)JO9wG+OU))P5OWYYOu h EYOu։F`+OO_^UVWƃ07v0E}}-ƃ0|7~ fNR0E͉?8 1 * # '" x_^UVW}G-0E= sNGu1 =tVYBfJUBfUV`YE#U fU#UfUUUjEP5YY^UV)J)}.hLYJu h OY))JJ ƋNUV5N^UVuVt Vt0 =u=Nt h YVBN1F^UVuVu1 U V^UVW}EEFu)+U)}-hKYLu h YY+U)5LGFЄu=L5L_^UVWu} uu!!9kcquu ]!!9uu tu%6uu% Er| t h Y1_^UVWL}#U F} OuN0 EHJH|HHhHuVUYYLwE_^UVd_l_l_:|l_X@ 5l_SY= }h_=| hD OZYKHJH|HH   !"#$%&'()*+,-./0123456789:;<=>?@ABCDE hHj TYYh_fh_h_|HJH|HH hHVZTYYl_l_:|l_X@ 5l_RY= ud_t8HJH|HH hHj SYYhHPYf,fh_f`_fd_^UVW=Uu$Nt1P=T_@X_T_=X_u0 u=LuLh AY1X_Yj2Y_N_t_PSxYY!BR5_YY6=_|% RY#_RYq^UVuVqY_t%hY#_RvYD_t%hWY#_R>Y_ =_|tʰ# _ QY_N_t_PSEYY!BR5_QYY RYjY_N_t_PSYY!BR5_YY=_uO=_uF R Y_N__jPuYY5_TY=_uL=_uC RY_N__jPYY5_Yg=_|% RvY#_R]Y6=_|% REY#_R4Y^UuY_=u _ uhY_j=u_u1PAYYt+jkY#_RY5_YPjiY#_RiY_N__jPYY5_YUVW___E_ta1҉UMfUU+Dž=_}_} _UU-Dž=_vnj}<:9_uZ}ra}\1EEUfh_Vd_=_> _3UUp/Džt/=_|'n}<:9_u}\1=_uhtY_=__UE-Džt\|TnL}<:=u=}ra}\1EEUfh_VcR}_Ew=__}*E+UыT__YUPv8YYvYE~|~ ~hdYFvYPY6Yd_t juY`_f`_fd_f,6Yd_t j*Y`_f`_fd_f,|6yYd_t jY\`_Mf`_fd_f,1Nd_t jY`_f`_fd_f,VN=Nth5O5NZB d_t j(Y`_f`_fd_f,zhTY_Nd_t jYG`_8f`_fd_f,d_tvjYYh_fh_Pv2YYvvsYYtf\_f`_Nf`_6Y6vjYY{ l6=Y_~U =Ch@Y3LL"$  =uVuh(vYN t.Vt"fFLr YFN#V^ vPOP:tO1PS $C  4 #VU  USPOP:tO1P; $   >t fNN@fNNU UQPSjw $g  X fNU  USjP5O% 6BY =UuJ Uf UUJUfJ FP4Y U f U f  tFPSwYYFPvYYd  tFPSHYYFPv[YY5 hY_f_ _f_ 6;Y_LB%f_ =Ot hRYO_f_ VN_ _ ~u~t1_NjSQ f_R ~t ~t1_NjSQc f_ V V_^jPS9 f_ V3V_^jPS f_ V#V_^jPS f_ V19Vu@_Nj>SQ f_n V19Vt@_Nj>SQ f_@ V19V}@_Nj>SQ[ f_ V19V~@_Nj>SQ- f_V19V@_Nj>SQ f_V19V|@_Nj>SQ f_NV_^jPS f_\NV_^jPSy f_0VV_^j+PSO f_V+V_^j-PS% f_VV_^jPS f_~u% =u h'Y_NF_^jPS f_Z~u% =u hY_NF_^jPSK f_V_jPj' f_Vډ_jPj f_V҉_jPj f_ U_U f_n%=t hYV_F_7_*__PYPxYPYFv6P@ FP_YFP2YjPYYvY=t hYFPYjFPLYZFPYJFPY:FPY*FPvYF% PYF%8PyYFPAYF% PXYF%8PDYF%PYFP YjPYYvqYFjPxYYvZYkhYFSYMVttFPYvY6YFP{YFPqYFP]YPTYjCYFP8YFP.YjYjYF%PYF%8PYm?#V9VtVRY#VRY1>uhYhY6YP}YFHPlYjPYYvYFPYFPuVYE^F^UVuV9Vv6V+VRvvo V+VV s,(N L VVVV^UVWU ʉցƴgVU> u9}~CVeYWu v U)UU U ~ s?,(N L-})E~E E U EOUV>t > VY#UUt?uu vX UU U eUV s,(N L}t0EVU)~E E U EOUV_^UVU ʉցƴgju v. F }|E #U ډ +NʉVV^UVhuB.YYP2.Yg,(sju:.YYF}1 M^UVg,(sVYv-YF ^UVWUJуUz jjYYWjYYUJWjYYUJ 1)WjYYuU ωFUJωFUJωFUJωFUJωFUJ ωFUz FFFUzFFFjEPj0 _^UVWU UUуMtG=M~=M}Ur5M3YYU MCrMLE몋U UU} gE5g9E sU UU +UU U+gډgUуME8FFFUzFFFUzFFFUz FFFUzFFFE5g} shgYc_^UVW}hg=,(|,( Z9=,(=,(yV+VRvv V+VV ,(N LV 9Ltj4Lvv) F #L ډ +NʉVV=,(_^Uu u=,(|,(P U VW}} E59E sU UU +UU U+ډUуMbFOFWUUFWUUFUFUF닉5} 3hY#_^UVW} * E59E sU UU +UU U1)+ ى UуME8FFFUJωFUJωFUzFFFE =5} hY_^Uu uj UVW} }t=U9CCEVWu& 9t ׋U)U_^U VWuEPEPuu uE}tF-UtF+UtF }F0}~U:t EF F0Oߋ}UtF.E O|F0O|U:t EF F0_^UVWuUBEPEPRu uǃ}tF-UtF+UtF GF}UtF.M|?t GFF0Feu u55"5tM}} F-]F+}d|!dE0FEU E0FE0F_^UVWUUEPEPuu uoEu}tF-UtF+UtF UuUJׅ~U:0uMO}| UB9UMEEF }UtF.M~EEF Fe}} F-]F+V}d}}Z}d}}Dž~& E0VֈEEO֋E}%U:0t F0F.}} EF09}|EEF 9}uF.G9}|BWZ9U|F0F.~.u UuNE_^U VW}U €tEEJRMUsEEJRMUXu uWuuMu uWuu4u WuuuPP"YZEB}Et}Gu>t>etF>euE_^U EPu u EPYU VWUU URYDžu1u9v V_^UV5(DN| 0(^U=,Dt,Du$!YUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWV?W Wuu V>u EP>WV>}F_)ۉ]}"ۉ]FfFuFPYY"}~GEfGuGP{YY9kV9Ww 9Wu9V9Wv1W9Vv WWW+VWW+VWWV>XV9Wv VVV+WVV+WV3GPFPYYt jFPYYNF@fFV Vtf~uVVFF- fFFu:E@EUVumMFEfFuFPaYY_^U Vu 1fEPVu 1f}u }u1Ut^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]SpFPW kE WGPEP .kE ]S0DPW kE WEPEP _^U(VW}EEE} tUE U%CtEffG1҉WWU fE :EE-0= r.UAM.tEwUWOUMjGPmYYjEP`YYEPGPYYE0UEPGPYYE}XMP},} t UE Et eEEE EEU9U-0= sUkE 0‰UUUU؁/ }}EUU-0= r} tE UUU}t iE/Eut H"ut5fG?GujGPYYGHfGuW YY_^U Vu 9] 9E@fE^fFVEPVc ^UDVW}EME} }E } ~E E MEMEtEfEXEVWYY| VֹE)ʹ ЙEk] WGSWS kE]tG9uF>uր?=uэG1_^UVH LNU9LNw*ULN9LNw VTYt1'LNrF5LNY5LN^UVW}u1H E}UUs1=HNu8jY=u1Vփ։HNLNFE5PNtOVUU9Ur69v2W9UvUW~>}t EPNu6uYtE#1_^UVWUUuu Y} uuY1U UURU+UUE=PNt<9}r79}u+UOJ}t EPNURU}?UU9Ur%9uw V9UvUVUrV7YE-u Yƅu1uuVp uY_^U VWUUb15PNt 9ur6E0tU UPNtU9ru NJEtU9Wu RWE_^UVu~  uH6EPYEU UEPEPV  }E^Uu uP#EXZU$(UVWuu uYYtH!u uu u505,u5854u u5@5<x}u uj&EE u u5H5DD~$H"Wju up#YYEPu u EU U|~%H"RPWjC#YY~$5P5Lu u"YYEE ׉Rju u"YYEE g}5X5Tf}$u u5`5\b YYEE ׉ډѺu uRj5 YYEE Wjyu uN"YYXZ_^U$UUEPjjg } UPI1UVW5PIPI}׃}~9r }} 9vWYu_^UVWuU VVu YYDžt~~}VډHF_^U$UUU UUUEzEPjGj U} vHM E 1U} vHM ҋE!1UE1UE1U} vHM Et1U EPu uC uuuuEPUjuuuu uUjuuuu uUVW11}U9Iu IF߃| jugYtUr YtURtUzt rVY}Ht}Ht}Ht u2Y_^UVWuEu41}%<It4IYtEG֋E~tV€uFu1V€tLE~t VuUjuv3 VtfVV1Vt1VtfV+VUVV}1YFt!jjv =u N /uvv EU9Uu1 N _^UV1}*<ItIBt 4IYF^UVWu~} V0t VuN FtN V€uNVu+~u%hYF~uN NF 1}9<It,IR@tIBt 4IYGƒ~uFTNFF VVv vvU >uNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu },Dr~} DVu 2V€tu fNV~Hu;5HYt+hYFuNLNHF 9hYYFuN!NF V@uVVVeUFt$jjv =uN 1jEPv =tN V@FF t V 9Ft$jjv* =uN Rvv uN VVvV+VUV JVV}~QFt!jjv =u N 0uvvz uNN N_^UVWEE11<ItN|1AFρECEE0-EMP1E E d#U :t! EE E #U uuuSYYE}@Ut8hu!YYE~" tuYuuYYE}}1]jYEu uY1A!uEUMJUzUBUIE_^UUUuuu  EUVW}EEL#WUWYwYtFVր:Xu E0EEۍVր:t&azjuN YY}EG߸_^U(VuU @t*uYEU UV֋RUUUEPu YYU UEPjj ^U$UUUUU UEPjj UHVuUVUVUV UVUЋU UEPY^UVuEP?YjEPj V|NtN5NhhNjKj% ^U$EPu YYEPj j U$UUUUU UEPjj UVWu>*uEERE F%1-0E|}  k }FE 8_^UVWu}u}}tBEs#JM\}tRUGRU8}tRU#RU`#U }t5}} F-]U tF+U tF UUU t }ouF0}u}gU t }xt }Xt}puFF0}XuXxF$E)E E EEuVuu_ƀ}Xu9utUPoYUE_^U4VWuEEEE}%tMJ|UʋFF VuYY=u}t UډE1!,'"U8EtUUԍE PEPu$ E9EtU:.u+UUԍE PEPu E}|t }}]uEttUЉU$ E*@EπEUhJ|UʋFF VuNYY=u}t Uډ^TE4 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuEUЉU}u ?U:3EMu E }ptEjuPuWE PEu EEjuPuWE PWEU U B]Et }uEuE}rEEuPuWE PE6U U RU U RUEEEE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UU]QUU؃}t\ME؋J|EEFFEEVPYY=}t UډmEJ|EEFFEEVP1YY=t6J|EEFFEEVPYY=u}t Uډ J|UʋFF VuYY=u}t UډMuUUM|OJ|EEFFEEVPQYY=uŃ}t UډaZ}~UUM-J|UʋFF VuYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUVu0YƋU BU MJwU uRYY^U$U UEPuYYEPj!j U$EPjj U$} uEEUUE UEPjJj }}tUEEUVWE_^]U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP YYjEPEP U jEPEP jE PEP UVu EPEPq E}1} u@D1QUJfUE]9~jYE]fUE-؉U1} u@T^UVW}EP Y}u fEu U UfEu Ws YE}1fE}ډE}teEP? YjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UVWuE}} #V Vu W> YFfF^~.j1YfFFFUAMt7pF*FP YF}FPFPYYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.j{YfFFFUAMt7F*FPYF}FPFPYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVEPY}u fEu U UfEu EP8Y(}tuEP$YjEPEP ^UjEPEP; jEPEP) EPEPe YYjEPEPP U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVIY_^U VujEPE Po Uu}u}u E@fEjFPEP| ^UEh UjEPEP jEPEP EPEPYYjEPEP UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jnYfF?1҉VVF=}jKYfF_^UV}u} tu^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPdYY_^U}u} tEjEPEP jEPEP EPEP)YYjEPEP UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPhYNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVQt1f#V9Wv VVV+WVV+WVV Y_^UEUBUVuFFfFf^U VWu} W WV VuWVWVNYY9zV9Ww 9WuHV9Wv@VEPbWVVU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFPYNF@fFVY_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWufEU M I JujbY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEP0YU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPVYF=}jYfF1҉VV!F=?|jmYfF?1҉VV_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7XIu`=}aa{nZsPsPR[) [)։ZsXsXfR[[׉1ۇTItPXPa.outverrverwsmswlmswstrltrsldtlldtsidtlidtsgdtlgdtlsllarcltsboundleaveenterarploutswoutsoutsbinswinsinsbpopapushafsubrpfsubrfsubpfsubfmulpfmulfdivrpfdivrfdivpfdivfaddpfaddffreefcompfcomfxchfstpfstfldfsubrdfsubrsfisubrlfisubrsfsubdfsubsfisublfisubsfstswfstenvfstcwfstpxfstpdfstpsfistplfistpsfistpqfstdfstsfistlfistsfsavefrstorfmuldfmulsfimullfimulsfldenvfldcwfldxflddfldsfildlfildsfildqfdivrdfdivrsfidivrlfidivrsfdivdfdivsfidivlfidivsfcompdfcompsficomplficompsfcomdfcomsficomlficomsfbstpfbldfadddfaddsfiaddlfiaddsfyl2pifyl2xfxtractfxamftstfstswaxfsqrtfscalefrndintfptanfpremfpatanfnopfldzfldpifldln2fldlg2fldl2tfldl2efld1finitfincstpfenifdisifdecstpfcomppfclexfchsfabsf2xm1stmovwmovmovbtesttestbxchgxchgbretfretintescldslesleajmpfcallfjmpcallidividivbdivdivbimulimulbmulmulbnegnegbnotnotbdecdecbincincbsarsarbshrshrbshlsalshlbsalbrcrrcrbrclrclbrorrorbrolrolbcmpcmpbxorxorbsubsubbandandbsbbsbbbadcadcbororbaddaddboutwoutoutbinwininbpoppushjnlejgjngjlejnljgejngejljpojnpjpejpjnsjsjnbejajnajbejnzjnejzjejncjnbjaejnaejcjbjnojojcxzlooploopzloopeloopnzloopneaadaamstdcldsticlistcclccmchltxlatiretintoscaswscasscasblodswlodslodsbstoswstosstosbcmpswcmpscmpsbmovswmovsmovsblahfsahfpopfpushfwaitcwdcbwnopaasaaadasdaarepzreperepnzrepnereplockdsegssegcsegesegdssscsesbhdhchahbldlclaldisibpspbxdxcxax.list.nolist.file.line.symd.symb.base.sect.comm.space.assert.align.asciz.ascii.data4.data2.data1..extern.defineT/bdCorsu-o needs filenameSTDINcan't open %srsecond source file %sasLXXXXXXasTXXXXXXundefined label %dundefined symbol %scan't create %s    ! " & ' < = > | ! !B33 non-ascii characterunexpected EOF in compact inputdigit exceeds radixnumber too longout of memorynon-terminated stringout of memory"'bfnrtbad numeric labelout of memoryillegal equatemultiple declaredmultiple declaredtoo many sections.base ignoredmultiple declaredbad sizeillegal alignmentout of memoryrelocation errorout of memory+-9>millegal operator0123456789ABCDEF \ N"""6"out of space for bit tablebit table overflow###'#:$#$:$$can't reopen %srcan't create %sw/tmp%s/%sTMPDIRno sectionswrite error (fatal) (warning) %s: "%s", line %ld: too bigV'&& 'bad operandbad operandsregister errorregister errorbad operandHqm777 8V8H88X9H999:F:W:s:::;;[<H<<H<='=?=n====>1>H>>>> ?6?d????@J@v@@@@!AxAAAB@BHHdBBBBBHHBBBBCC>ChCxCCCCCD'DgDDDD E0EeEEEEFF$F4FPFsFFFFFGBGhGGGGHH!H3HEHWHHyacc stack overflowillegal index in FP stackregister errormust be absolutedivide by zerodivide by zerotoo many charsexpr syntax errexpression undefinedassertion failedsyntax errorbad f/b labelsyntax errorXEZXGsXeZXfAXgsX3`+"`3``?a+*a?a#aAAAAAowa\wr7wwFww+wbw yaxrxwxOy+/yb%y/J ~@&VX?b$d6i6o-p?u6x?+ #!+-0&$Lhl#EGXbcdMefgiMnsoprsɂux(null);   |tld\TLD<4,#(#$# ##### $$$$$$$$%%%%&&&.&6&>&&&&&&'''/'7'?'|'x't'l'd'\'T'L'D'<'4','$''' ''''''''''''''''''(()))|)t)l)d)p`)q\)rX)rT)rL)sH)sD)s@)t<)t8)u4)u0)v,)v()w$)w)x)y)z)z ){){)|)|)})})~)~))**++++++,,,, ,,,,, |,!x,(p,)l,0d,1`,8X,9T-L-H-@- <-4-0-(-$- - -!-! -(-)-8-9.... ///// /!/(:)/0/1/8/900 1x1(p2l2h2d4`5\6X6P7H7@88809(9$9C>>>>>>>>>>>>>>>>>>>>x>p>h>`>X>P>H>@>8>0>(? ???? ?0?????????0?0?0?0?8?8?8?8x?(p?h?`?X?P?(H?(@? 8?0?(? ?? ?0?????8?????8?8?0?8? ? ? ? ?(x?(p?(h?(`@\@X@P@H@@@8@0A(A BBBBAABBBB'`'a'l'm'm'n'o'o3c;'|2bt(l<h<d=\=T=L= D=<=4=0=,=1$=!=(= ==><=<=><<>> ||!&&"I @(#)yaccpar 1.8 (Berkeley) 01/20/90     #;<!:"?DEF`B789poqHnsjJKLMPQSZ]^_NXab$456 kitUVYTWdfeghAm340*+Y~g&9AgDOggggPXg:ggggL`abgpgggg{djrggggggggggggggggggggggNjj#Zfjjggggg "-567J]|RM&CJ 23_V 2;q=omrn{p%&k2l22>222=,3=r1 222:2=-lr[ G(.31333331011281>I22.3333l11191'[\000l0[ G.2..r.33000011IO.../.stuqcv,om@n\p3R}001///../,,,,O///&/0c,,,,@.Rqomnp&&//&,, !"q&&o#$p7/bcde,xyz&22222222CCCCCCCCCCCCCCCCCCCCCCCCCCCCC3333333311111111-*00000000......----****----de**+)(////'//,,,,--,,+++**+)%))(()(''++'-))((*''%%&&%qjomnp++%%))((kl'qjomnp+%)k(li'qjomnpqjom%n&pkqlihomnpklqjomnkplqjhiomknlp(ikl----h--**i**h'%&qjiomnpqjhom%n&pklh++kl++())((''iqj(iomnp%'`abcdefghkl'`abcdefg{%& !"#$`abcdefg`abcdefg`abcde(/6`abcdefg`abcdeg' !"#$ !"#$`abcde`abcde )`abcde5Z !"\]^_#$w|||||||||||<=>?@ABCDEFGHIJKLMNOPQRSTUVWX|| ( ,% G I*+ -(/(+-,U ::=<&>() +,-) , , WX, ;:;<;> ;,; ; [&();+,-& (),; ]^ :;<;>;,,:;< >~, ;&|();;,;;;&|(),,]^:;<>]^; :;< >,,,%  #*+ -;/| #@]^|DEF&C()]^,C&P()S,C ;(,:;< >|,;:;<C>;,|,,,;%MNOP*+#-,/,,()]^,)#CCC]^%,:;(*)  #/)| |#$%] !"&'()*+,-./0123456789:;<=>?@AB !" !"  !"!"&(),&(),:;<> :;  !"]^!"&()]^,& ()(),,():;,|:;:;|:;()!",%&*+-/]^:;]^]^<>]%&(*+-/|]:|<|>]^|%&(*+-/%&)*++--/<%>^|*+-/<>%&*+-</>%&|^*+<->/[^<>|!"^!"|~+-%&^*+-/%&|*++--/<>|<>!"[#!"!"!"^%&[^*+-/!~ !"|<>~ !"(+-   !" !"# [  !" "~  JKQ#    su    %&'(  ?@ABCDEFGILMNOPSU`abcdefghijklmnopqrt{&'()*+,-./0123456789:;<=>?@AB ((((( AAAAAABBBBBB  @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%SSSSBHHH( \I$JxJ|JJ$J-L2L7L;L?)ILRLXJbKmLuM}C,TTV$FLP V8\}Nezmp$w$pqwl{9 s0h4ju _ F뺋9 sFx98js+ Pju W0 9 s(x9 h` hiNYP%RYdh19~p4NYF苕U9Ux`t ` NY91x+9~<ʉЉʉPSF봋x+x}s EcnxJʉuu PB^ Euu h*^ EU9UEcU1x+9~<ʉЉʉPSF봋x+xEc19~.`4uu ]EF`cLYCG%1=uC G jGЉЁ|G ʉGЉЁ|]G ʉ>GЉЁ|G ʉDž89x+Jʉuu PG\ EU9Ur Ec5 Džl 9l<lBl4ڋx+JʉZ KPO t+uu [ EU9UrEcs떃 JDžl 9l<0lzt7l KPQN t lBl4G%1=uCGЉЁ|G ʉ1)щȍS$>PYYc3YYt EcZtB)ʉǀ(9=(9u9,9u (9x+Jʉ8u9JuFMӁ<l1}$l|2u9 t F׃uu WY EU9U:EcAGЉЁ|G ʉPMYYujjA <1|2ujjSA FDž@9<hz0tR+Q0QB04G jGЉЁ|G ʉGЉЁ|]G ʉ>GЉЁ|G ʉDžP9LYY}-1҉  Ull- 94jPH@YYun- 94 A PRPYYt)- 94AlO y9xA}u Ec{ =t hZYuu hOV Eduu h4V EU9Ur Ec" uTtK19 ~A)ʉЃ(9uAF뷃u+ 19 FDž19oADžJ9}6889uFDž}DŽF틕PFYU+UDž9#jj,=  |C|t)ju PP,5Dž=Y9s2js +Pju W99sPCFYU9Us>EcM UjW<YYt Ec% Džjj; t8huu PP3EU9UrEcT<Y|A | |G%GЉ Ё|G  ʉ }t5# '~ 't,Y ,Y19GЉЁ|G ʉPmFYY}tu ,PP-YY~<EFc}t-U9UEEcLGЉЁ|G ʉPEYYGЉЁ|G ʉPqEYYU+URuu PP1EU9UtEc{GЉЁ|G ʉPDYYU+URuu P4EU9UEcGЉЁ|G ʉPfDYYP 4YGЉЁ|G ʉ1)щȍS$>PYY$8YG%19xGЉЁ|G ʉʍPfCYYjPpLYYF|195~1}u"xJʉjP8LYY xF19~Bʋ xCxىȍSP2F195|jj46 FG% -Ą9 ~k5|4Ћ +ĄPĄS螦Nȋ + + 19 GЉЁ|G ʉGЉЁ|G ʉ 1)ы1)Ӊ؍ S$>PYYF=19 BBB1) YB1MOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)щ J dB1) &YYB1)ѻ 骤F}G U 9GSXf=|G fGSXf=|G f\U~N\\ GYEU9UqEcx}t_#SEGЉЁ|G ʉ}t'YG% @}tU}cuL=uCxJʉuu PI EE_^UUVW} }tU:uOt?uEAuԄYPW̄YZ@P8YuV蕄YYhVhYYWV_YY_^UVW}W艄YPV8YWVXYY_^UVugbuZ 1)щȀu& 1)щVhP貂 1)щVhEP臂 EPDY^U8VWu }Et5_1)ډӍEP$>SYYUt }cUt4G1)‰Ѝ]S$>P~YYUt }'Wu7=tUxJʉEnG+xENUGH‰VUGHSFP`UGH‰VoEOI <SX8GH1)‰PV!G_ É^GFGHVWV)ʉ_K9V}|1}F1}FvEEUJ9U}MԺ!UEU#UUt9Uu1F*EEU9U}MԺ!UEU#U1FG1)‰PEP蛞}}u#YE̅_ٺPUGVfG1)‰PEP}t F.uH#Y1ۅÉ^G#P VGP VU19Uu@FuuYYuU9Uu1FU19Uu@FU19Ut@F{uuZYYuU9Uu11ۅÉ^JU19Ut@F7U19U~@F$U19U|@FU19U}@FU19U@F}u$G1)‰V$>P YYEPV舜}t$G1)‰V$>PYYEPVJoUUVauufYYFUUV=U+UV/U UV!U3UVU#UVUUVE}FE}VMUVMUV1}FU҉VGHVFz1}FiWu1=t U;xJʉEG+xEURUWt$U)ʉ_K9UЋUЉVFUVu/YFuX/YEԅ UԉVwUډVjGp YEȅtPVEF<Gp YEȅt @ FF _^U VWEL<NUAMLjV)YYu[EM9u~L8]89u)Ӊ(9PGP:YYtULLxU HUDj Y_^UVWH9UK= 195H~$4O L9 LF195HA4UWUE9uU)ʉЋU49PU# 4!1U)ʉӋUO9SUOѺ!1ۅ9uEZF.?j-YNj195H~W 4 F=@U DUE0~(UE)]4UBRbYN_^U VWu1E> t> uF>+uF >-uFEF-0E= sʉڃ}tډ_^UVut)hhV;v u VhAYYS =ttPhAYYR3,Y^Uhh5̊Ju UUVW+Ą==tǀĄA ցĄ|h@YFW YFV = o= N ǻ鐕J$x%EuFFUUxWzY=|FV 5YFhF5:YFiFV WZ YF,FWG YFV )LExW" YFu FuFV F_^UYYQ5 Yu - l j)Y-jTY5h>YY5hh4Ft j`YUh?YƋ=j`YU=uVu vjs Y h?cYPM YhQY=?V. Yj3 Y EEEh?YƁt=u}}U܋ LU UEeV YhY뻡:|X@ 5:mYE=q}t5uSsYY}tUԉUEPh4YY4Gj DY=u^j 3Y=t h=Yj Y=t h<YhY=h<Y=fj YUj YUj YUhY=t hg<Yuuu e= u6hVY=u h;Yj$Y&==u hx;Yh Y=uj|$YUЅ|Ej YUj YUȅ|}~ hX;Yh Y=u E&UhjY=t hD?;Yuuuuu!P!YY/5YjYPrYhh85̊n jYPFYhYP/Yhh,5̊En hYPYjYhYPYhh$5̊m j`]Y5 YDh`>Yo $A#5h 9YY鲎_^UVWƉǃu h@9Yօuu Wh(L9YY_^UV:|X@ 5)iYƁ}~ 5I}| 5,}|VaY^UV:|X@ 5hYƁ}|xVY^UVu:|X@ 5'hY:|X@ 5gY||mh\KDjYj`Y-j`YUU Ps^UVW:|X@ 5/gYǡ:|X@ 5fYƁ| _^UVW:|X@ 5fYơ:|X@ 5|fY ơ:|X@ 5FfY ơ:|X@ 5fYǁ| _^UVWj`FY=} h6Y9r05 YRX YB==5O|4:|X@ 5ReYFF_^UV55hhj5h hj 5hhj y5hhj \5rY>tF=|+F -F5hVVj EqhY^UVW}1t h@z4Y}t} u3=u*jsYWh4h05̊g4=jIY~Wu 'YZ)‰t h3Y_^UVuaYhh5̊mg hh5̊Fg 5jYY195~PjYYFࡸ]=~>5Y5YP5YY PE^UjYU9Ut/U|U4h5̊Pf UVW=4th4hh5̊f4GFЄu_^U=4th4h5̊e 4U=4th4h5̊e U=t-5h5̊e U5uh5Dg5YUVWu} t=uku=t ==5_^UV}t h01Y5wYƉ!RQh5̊d^UVWu1} t} t EPu.2YY} EfE}ufEU€t'uE@fEEEE=|fE1҉UUE-jEP=YYE}EPEP=YYfEE] ÉF]#U ډFUFUFjEP{=YYKEfE}ufEEt;#Uu$E}uE@fEE EEE=|fE1҉UUE-jEP<YYE}EPEP<YYfEE] ÉF]U ډFUFU FUFUM щFUFU jˍEP+<YY} uNNNNNNNt1_^UVWEP550 ǃu#5htha hd-Y55hP5̊au5hhda EPh5̊La 95~D5Ph5̊&a Fܡ̊̊:|̊X@ 5̊j ^YY_^U5̊h`YYUUVu} t$N}t}uփ}|^UĊȊUĊ99Ċu-9u-9ĊuJ-A5̊h0$`YY5̊h$`YY*5h5̊_ =Ȋu/5̊h _YY=tJ5̊h_YY6=Ȋu-5̊h_YY=Ċt5̊hx_YY=Ċ|5Ċh5̊3_ =|5h5̊_ Uh<ubYYu=Ȋu ȊU =Ȋu ȊU ĊU=Ȋu1=t5̊hp^YY`5̊hd^YYL=Ȋu1=Ċt5̊hX^YY&5̊hLk^YY5̊h@W^YYULuYhh|5̊ ^ hrYE=th[Y=t }tU}u ̊-hhu)^ ̊uuh)YYU=̊t 5̊]WYŮR t hX)YUU5̊4H`]YYU}uE} u U:u hY@uY5U R|+ Puhh^hYU}tU:uu h5̊\ 5̊u\YY} }P̊̊:|̊X@-5̊j-YYYU Rh5̊A\ N} ~H̊̊:|̊X@+5̊j+YYYu h5̊[ Ů̊:|̊X@ 5̊j FYYYUVW̊̊:|U ̊X@5̊u YYYE8u6UR)ʉӋ 95̊4Hb[YYEׁ<W HUEEƅ ~̊̊:|̊X@5̊VUXYY맋UI4h5̊Z 놋UIt4YYjUI)ʉЋ 95̊4HsZYY.JDZ{_^UU1)щh5̊Z UVWjYƋu1]Y@PYFuv\YY1U NG5_^UV5tuv\YYu61^UV1} ~E}t}t h$%YjYƋUVU VEfF 5^UVW}5t 9~u61_^UUtuYUVW} ЊM:- R9YыRn9YƉDUDUHU)ʉHUd)LULUPU)ʉPU5HU5DUYYơDU1DUHU1HU5PU5LUYYơLU1LUPU1PUBPh#YYBDx}~5Њht#YY}~1PY}|G1PY #jhj5h袳h\.#Y_^UVW} E1։}uE_^UVWu uYYt1(E 8];nU R)ʉыUR)ډӁ(9Q(9SWYYtYUR)ʉЃ(9t91U R)ʉu(9PYYt1pU rY;E8u3UR)ʉӁ(9Su YYt1'R|DFP KPu t F^P KPu _ u 뵋xʉu PzvxBʉuPTvxFjuuuP舱E--x] ;U R)ʉׁ 9M9u.UR)ʉс(9QGPuuGPuW<EE}EE8hUO )ʉЋU R9PU #Jt&GE}}MUO EEwE8u+UR)ʉu (9StE_^Uuh(9tUVW}=(9tNh(9WNYYt1?u1W)ʉh(9(9PYYt1tS|"FP KPW u׋xʉWPsxFjuuu P0E x_^UVW}GЉUЁ|GU ʉU} u }}1U 9Ut119u~G9 t1rF19uzu1)щǀ2&Y1)щˉ=u&1)ˉ؋R >1)ˉ؋R1)щǀF-GЉЁ|Gȉ ΅tNU1)щȍ]S$>PwYY}u}u U1 U_^U#UJ$x%qUVW}z=h=Ąv\-Ą+أ1EĄ95~"]EPS qFĄfUE3BfE]3Z f]]DuЋ$tU}tB}njUDu9uBRGPYYEtGW ЉEN1_^U VWU)ʉց 9~uU V}t0U V0(1}!VUtuu u G_^U VWU)ʉց 9~uv} tF01Z)‰@EE}})UNׅtu WYY9}}}EыE_^UVWU)ʉց 9VU<UFU )ЉƁ 9F| V OEEE 9<s~u-U9V xFdV O~MV<E1}6EE8u(V M9 uF|V OGŃ4f_^UVW 9<s"F| V O4_^UVjYƋԊ5ԊUVU VUV UVF^UVW} U PYYUE_^U VWu }u)E}UNMUPYYumYE~/UVE}UNMGE}UBOQuUNiUBOQ1)‰Ѝ]S$>P]YY}uUN],}uUNEPPa UN]Ed a_^U VWu UPYYUu]YE~/UVE} UNMxUE-@x_E}UBOQuUNUUUBOQ1)‰Ѝ]S$>PYYU}uUN],}uUNEPPr_ UN]EIUx 4 \__^UVWE] 9t1E8u E8uUM I9Jt1Eׁ<1UM  9 p1tUM  9 Q1UU M44@YYt14UM L9Lt1D7\ U^FZ_^U(VWEEuƌ"=xu1dEE%t ]F%E9x}'}t U+xU؋xUU9xt}u ExJʉׁEU9UFЉUЁ|FU ʉUUj KPW k}t uVYEW\YE9E~ dU9U}c+UU KPYu EE2UU9U}LFЉUЁ|FU ʉUU KPHYu8E멋U9Uu}u}t1 +UUU؉_^UVWL1}UrWrtF1_^UEDU15HU] LUP15PUZUU KUVu>uV)ʉЋ9 Ћ<^UVW}?uju w ?Ѝ<E}}"F<uUOju 4 E_^UVWuxJʉE)@9=@|1IىRHPyZGNjx+@x_^U VW1H9=@C>u U9Vu08<E1}U|:u VM9 t GG1_^UV195@~CʉЋxA xʉHPSYF@^UVu uYUFuhuuP谔EUK|E^UVWDžHDžLU9LUS<FP KPL F|ZF U@@Dt*D- 94jP~YYt @ăDxJʉl+Ld9d|5LIR pPWGËx+dx`|\19\~TGF|6|D- 94jj5 |Fjhuu P蟒H`19d~?ʋ xىȍpSPVxG빋\|19\~TGEH_^UVWS*}t/FP KPu uF}6Fju]SPju EP jHYF< U?b- 94E^PuEPS-ju EPe t! Cu땋:t5IY 1_^UVW<>t:VUUE}~MEEGUYfF_^Uh h3YYu(u$u uuuuu uh3(h h3YY!jYUh h3YYu(u$u uuuuu uhj3(h hX3YYjYUVW}1} E1}t] E 1EE 1Uu5H}EP}t{xU1)PW] u5H}}r8EP}t<}zPEP* u5H}UUW}tX|zU1)PEP u5H}5H}_^U VWu }EEEQ}tGH}ffF1҉VVEfG ERGE-0= r}.UAM}.tE~c~VVNUMjFP| YYjEPo YYEPFPhYYEU0UEPFPIYYE}KMC}uH}}Et }emEE EG  QE-0= s*UʋM0щMGE-0= r֋UUU~u~tfF?V YuV YYVL Y_^U,VWuE1EEtEfE ~E$zhzVYY|!Vh<}Vg E E uVYY|E GO1)щVX|PV 1)ыE E Ex}zsuV)YY|E GOE 8hxV YYh<}VYY}!VhzV E E Ed|uVYY}E GO1)щVzPVK E 1)+ًE VhxV" E E{1uVLYY}E G1)щVxPV E )E 1E U9UlEfEfEEE1)щxPEPNEPVYY|=EPEPN1)щȍ]SxPEP E볺0UԋMEfEVEPV O0Fu~kEfVfUfEVUF-؉U0ME}t.F-؉UUVEPV U0E~VhxVX }fUUU=9~*0}vMUU@֋U1E ɋUM}v U:0u_^U@VWuuEP4MH}EPEPEP ǃ}t-FGF.FE}~?tGF }u 0FM܋UMI JtM}NeF}} -F]+F}O E0OEEu݀?tGFFU҉)9M} H}uҋ} GFu_^U VWu }EPVW }u }u1Ut_^U$VWu }H}V VuWuKW WuVuK~VEPKWEPK}uF_)ۉ]}!]FEfFuFP\YY"}~GEfGuGP8YY9vwYYEvwYYE܃} }u4}~.}}OW+VWW+VWWuJ}~NV+WVV+WVVuJXVuJUGPRYYt4UjRhYYURMQUB@UfBuYuY_^UVu 1fuVu 1f^UVWu} +7RYY1ۅÉ]+VwR^YY1ۅÉ]WV}tB>u E_^UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUt(Ft!FFtFF@fFVnY_^UVWuV VufFf_~uVVFF- fFFu3E@UVu}OFfFWFPYY_^UVWu} ?}F |V ~IVVJыVV>t) )ы VVI߃ |VF ~7~t&VU) VV_^UVuF=@|H}fF@FFF=#H}fFFfF^UVWu }Wf#WfVWfV#WfV_^UVWu} 9u1.|9}}9}_^U VWuEPEPuu uE}tF-UtF+UtF }F0}~U:t EF F0Oߋ}UtF.E O|F0O|U:t EF F0_^UVWuUBEPEPRu uǃ}tF-UtF+UtF GF}UtF.M|?t GFF0Feu u55f3tM}} F-]F+}d|!dE0FEU E0FE0F_^UVWUUEPEPuu uEu}tF-UtF+UtF UuUJׅ~U:0uMO}| UB9UMEEF }UtF.M~EEF Fe}} F-]F+V}d}}Z}d}}Dž~& E0VֈEEO֋E}%U:0t F0F.}} EF09}|EEF 9}uF.G9}|BWZ9U|F0F.~.u UuNE_^U VW}U €tEEJRMUsEEJRMUXu uWuuMu uWuu4u WuuuPP"YZE@}Et}Gu>t>etF>euE_^U EPu u EPYU=X~tX~j?YUVWu1EQ}tF>+uF >-uEF-0= sk F-0߃}tډ_^UV5T~N|  ^U=X~tX~u !YUTu؉U f BLUtTu؉U f FUfUUMыUJUMыUJUt9E@Uzu)E@UzuBUB@UfB_^UVWu}U M I JuWV=W Wuu V<u EP<WV<}F_)ۉ]}"ۉ]FfFuFPYY"}~GEfGuGP{YY9kV9Ww 9Wu9V9Wv1W9Vv WWW+VWW+VWWV<XV9Wv VVV+WVV+WV3GPFPYYt jFPYYNF@fFV Vtf~uVVFF- fFFu:E@EUVumMFEfFuFPaYY_^U Vu 1fEPVu 1f}u }u1Ut^UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVW}+E 19vCދ+WM 19Qv@EQW}tBu_^UVWu }1Et޹EU}t0kE ]SPW kE WPEP .kE ]S\~PW kE WPEP _^U(VW}EEE} tUE UQ}tEffG1҉WWU fE L8EE-0= r.UAM.tEwUWOUMjGPmYYjEP`YYEPGPYYE0UEPGPYYE}XMP},} t UE Et eEEE EEUd7U-0= sUkE 0‰UUUU؁/ }}EUU-0= r} tE UUU}t iE/Eut "ut5fG?GujGPYYGHfGuW YY_^U Vu 7] 7E@fE^fFVEPVc ^UDVW}EE} }E } ~E E EEtEfEXVWYY| Vֹ)ʹ ЙEk] WSWS kE]h~sVW]YY| Vֹ\~)ʹ ЙE]h\~W)YYVWYY} Vֹ)ʹ ЙEk] WìSW Ek]+ۋEW?YEVWYY} - Ek] W\~SWY E+UEEE}uEUUvE쐄fEfEEEU9UU+U~EG}EfEfEEEkE \~PEP4EPWYY|1EPEP3kE ]S\~PEP E뿺0U]EfEWEPW M&fEEPEPh\~V fEG|]EfWfUfEG-؉WUЃ0]E_ۉًUUWEPW EE0WEPYYEPWYY~+tG=|U@GBEPYWY,EE0}gUUU=9~D0}vUU@ԋU1E}uÁ}vU0E믋U_^UVW}EPu uB EU RP55|!1ۅftu u*EE UJfG55u u'YYZYUM QRjj@ Gu uwj$*YYEE 55u ur'YYZYUM QRjj G_^U VuEf~u~u55uh55 VhYY}#EU"FF-?Pvj$55&YYvj$YY EU}tuu2)EEuu55 u~u~t "uuXZ^UV U9w*U9w V@Yt1'rF5Y5^UVW}u1 E}UUs1=u8jY=u1Vփ։FE5tOVUU9Ur69v2W9UvUW~>}t Eu6uYtE#1_^UVWUUuu Y} uuY1U UURU+UUE=t<9}r79}u+UOJ}t EURU}?UU9Ur%9uw V9UvUVUrV7YE-u Yƅu1uuV uY_^U VWUUb15t 9ur6E0tU UtU9ru NJEtU9Wu RWE_^U} t#UU JUUuRu UVW}U9U ZUU UU +U1EE9usuNN FFSX_^UVW}Wu u ƅ~9})׉U U 1_^UVWu }X~ȟ~} DVu 2V€tu fNV~u;5Yt+hDYFuNLNHF 9hYFuN!NF V@uVVVeUFt$jjv =uN 1jEPv' =tN V@FF t V 9Ft$jjv =uN Rvv uN VVvV+VUV JVV}~QFt!jjv =u N 0uvvz uNN N_^UUUuuu  EUVWu }E?t:J|G^FSX GVP-YY=uEE_^UVW}EEL#WUWYwYt"FNV׋M 9tUE_^USE] ![]USE] ![]USE] ![]UVW}u M * UVWE E_^]J UVu u% YZցut1^U$UUEPjjG U$UUEPjj' U$U UEPu YYEPjj U$EtUUEPj6j }1U$UUU UUUEPjj }EU(VuU @t*uYEU UV֋RUUUEPu, YYU UEPjj+ ^U$UUUUU UEPjj U$UUUUU UEPjj UVWu>*uEERE F%1-0E|}  k }FE 8_^UVWu}u}}tBEs#JM\}tRUGRU8}tRU#RU`#U ,*}t5}} F-]U tF+U tF UUU t }ouF0}u}gU t }xt }Xt}puFF0}XuXxF$E)E E EEDVuVuu_ƀ}Xu9utUPYUE_^U4VWuEEEE}%tMJ|UʋFF VuYY=u}t UډE1!,'"UiEtUUԍE PEPu$ E9EtU:.u+UUԍE PEPu E}|t }}]uEttUЉU$ E*@EπEUJ|UʋFF VuYY=u}t Uډ^TE4 tEU U Rf@tU U RM؉ U U RM؉ U U RUЅuElUЉU}u ?U:3EMu E }ptEjuPuWE PEu EEjuPuWE PWEU U B]Et }uEuE}rEEuPuWE P'E6U U RU U RUEEErE tE0U+UЉUEt7}xt}Xuu }pttUЀ:+t :-t: uE܋U+UU]QUU؃}t\ME؋J|EEFFEEVPYY=}t UډmEJ|EEFFEEVPYY=t6J|EEFFEEVPSYY=u}t Uډ J|UʋFF Vu YY=u}t UډMuUUM|OJ|EEFFEEVPYY=uŃ}t UډaZ}~UUM-J|UʋFF VuOYY=u˃}t Uډ E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^UVW}u M)9r/r uu fE_^]t|UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~tIu(_^]} 0)ʇʋu }UW}0ʀuA)_]UUas U EUVu`YƋU BU MJwU uRYY^U}u}uUM UMQ}u} tEjEPEP jEPEP EPEP YYjEPEP U jEPEP jE PEP UVu EPEPq E}1} u@D1QUJfUE]9~jYE]fUE-؉U1} u@T^UVW}EP Y}u fEu U UfEu Ws YE}1fE}ډE}teEP? YjWEP _^UVW} u}E}E9Et(ut}~VO9t9}E-UUUU9Uu1!U9Us EEUU_^UVWuE}} #V Vu W> YFfF^~.j1YfFFFUAMt7pF*FP YF}FPFPYYfFV V WWUN E#Vw!#VFWU EuY}EVut F@fF t&tG}EF@fFF=}#E}F ]t} EWUWU} Fu FfF^~.j{YfFFFUAMt7F*FPYF}FPFPYYfFVVʁwuLFtCVut F@fFt/F@fFF=9'F t?_^UVEPY}u fEu U UfEu EP8Y(}tuEP$YjEPEP ^UjEPEP; jEPEP) EPEPe YYjEPEPP U VWu E}W}uZfF^fN1fF}u^fFFfFF~E F@fF}qUW׋VF=u*~u$}ufFfFFV VF-fFU VU VNVVF=u!~ufFfFF2F-fFFN}ufVIY_^U VujEPE Po Uu}u}u E@fEjFPEP| ^UEh UjEPEP jEPEP EPEPYYjEPEP UT}؉U f BLUtT}؉U f GUfUUMщNUMщNUtFuFuFF@fFF=?|jnYfF?1҉VVF=}jKYfF_^UV}u} tu^UVWuV Vt_~uVVFF- fFFu3E@UVumOFfFWFPdYY_^U}u} tEjEPEP jEPEP EPEP)YYjEPEP UVWu} ~_?~F |V VV>v )ы V\ډ~T?~F@ |VF ~(~t )ыV VV_^UVu&FtVV^UVuVVtN.^UVWu} W WV Vu$WVt1fWVYY9t9GPFPYYFPhYNF@fF|V9Ww 9WuLV9WvDW9Vv WWW+VWW+VWWVQt1f#V9Wv VVV+WVV+WVV Y_^UEUBUVuFFfFf^U VWu} W WV VuWVWVNYY9zV9Ww 9WuHV9Wv@VEPbWVVU9Vs VVV+UVV+UVUV9Wv VVV+WVV+WV0GPFP/YYtFPYNF@fFVY_^UVWu} +19v@E+V19Wv@EWV}tBuE_^UVWufEU M I JujbY1҉VVfF?V Vu fFFPYU RYF@fFU ZCU fBU 1fFU J)ىfFfE@EEUHfEEP0YU R9VrEU R9Vu U R9Vr/EU N9Jv VVU N+JNU N+JNV׋ Jt1fEUtFPY[E~b}E=~WE- fEG?t EW׃:t E- ؉ UEEPFPVYF=}jYfF1҉VV!F=?|jmYfF?1҉VV_^UVWUBU Z)ۉt'}ߋuu FfFWFPYY_^{sƉ+C;Cw Ë[ uӅu P]KI|;u[u P7u`=}aa{nZsPsPR[) [)։ZsXsXfR[[׉s1ۇtPXPuuuxxxxv7xx- f!bT!=Qxvn!No regs available+%ld%lda$a$$w$$.$$$0%z%%%3&@'S'}'''''' ( (3(q(((()()7)F)V)f)w)$)))R**%'%'j*{*(( )&**standard-inputBad format %sCan't open %sr.sect .text; .sect .rom; .sect .data; .sect .bss %s/l//K/&/&/K/K/K/0 h000/ 000000G0unknown instruction byteQ1-1K611176 116<576|5w1h5535$2No table entry for %d%s: .extern %s .extern %s too many parametersBad type in register messagemes 3 not allowed heremes 3 not allowed heretoo many parameterstoo many parametersbad pointer sizebad word sizehol%dUnknown opcode %dNo table entry for %dbad argument type %dunexpected EOF8 71878N8,8=88U8N8N8l8l8l8string/identifier too long;::::";;;;?;";;;;;;;%d_%s%dI_%dI%x_%dbad BSS initializer.comm %s,%u bad BSS sizeL= a<a<<<<<L=L=<a<<<<.=.data2 %s .data2 %s %s %s = %s %s: %s: .data2 %ld %ld+hol%d .data2 %d,%d bad icon/ucon size,0%o.data1 0%oWarning: overflow in floating point constant %s !float %s sz %d bad fcon sizefloat constant size = %d push bp mov bp,sp C(DCCCCmov si,%ld(bp) mov di,%ld(bp) push di push si push si push di sub sp,%d push ax push ax sijmp .cret jmp .sret jmp .dsret jmp .dret jmp .sdret .define %s .sect .bss.sect .rom.sect .data.sect .textCan't create %swWrite error on output%s%c%ld0%ld%ld%ld'I'IdIHI%ld%s: incorrect value for fallthroughLp@KwSKBombed out of codegenUsage: %s [ EMfile ] [ asfile ]Unknown flag %c5S .S5S.S.S.S5S.S.S.S.S5S5S.SOut of memoryString table overflow``taaabDbDbycyccccd9d9d%f/fNfmffggg Error: Fatal: spbpdisidxcxbxaxcldhdlchbhblahal.Xtrp.strhp.trppc.rck.mon.reghphol0.ignmaskhol0+4.gto.exg.dup.csb4.csb2.csa4.csa2.blm.unknown.ret8.ret6.lfr8.lfr6.cmf8.cmf4.cms.cmu4.cmi42f.ilar.lar2.isar.sar2.iaar.set.inn.com.xor.ior.and.cff8.cff4.cfu.cfi.cuf8.cuf4.cif8.cif4.cuu.cii-.fef8.fef4.fif8.fif4.ngf8.ngf4.dvf8.dvf4.mlf8.mlf4.sbf8.sbf4.adf8.adf4.rmu4.dvu42:2b1f.rmi4.dvi4.mli4.sbi.adi.sts.sti.los.loi1:1b.sect .text.data2.sect .data! killxorbxorxchgtestbtestsubsxxshrshlsbbsarsalrorrolretrcrrclpushpopororbnotnopnegmulmovbmovloopleacalljmpjnejlejljgejgjejcxzjbejbjaejaincidivdivdeccwdcmpbcmpcbwandsyntax erroraddadc(bp)()()(bp)()4$Id: table,v 1.60 1995/03/29 11:57:27 ceriel Exp $r+rrr s+s s scEG/efg/3+"3?+*?#AAAAAӤarw+b֩ }@X˪bdªiªop˪uªx˪ #+-0Lh{lELG7Xbcd٭eLfLg7i٭noprsUux(null)$Id: codegen.c,v 0.36 1994/06/24 13:27:01 ceriel Exp $$Id: compute.c,v 0.16 1994/06/24 13:27:05 ceriel Exp $$Id: equiv.c,v 0.6 1994/06/24 13:27:11 ceriel Exp $$Id: fillem.c,v 0.19 1994/06/24 13:27:20 ceriel Exp $$Id: mach.c,v 1.10 1994/06/24 13:00:02 ceriel Exp $$Id: mach.h,v 1.6 1994/06/24 13:00:06 ceriel Exp $$Id: gencode.c,v 0.16 1994/06/24 13:27:25 ceriel Exp $$Id: glosym.c,v 0.4 1994/06/24 13:27:28 ceriel Exp $$Id: main.c,v 0.8 1994/06/24 13:27:36 ceriel Exp $$Id: move.c,v 0.6 1994/06/24 13:27:40 ceriel Exp $$Id: nextem.c,v 0.9 1994/06/24 13:27:43 ceriel Exp $$Id: reg.c,v 0.11 1994/06/24 13:27:53 ceriel Exp $$Id: regvar.c,v 0.6 1994/06/24 13:27:56 ceriel Exp $$Id: salloc.c,v 0.5 1994/06/24 13:28:05 ceriel Exp $$Id: state.c,v 0.3 1994/06/24 13:28:10 ceriel Exp $$Id: subr.c,v 0.19 1994/06/24 13:28:18 ceriel Exp $$Id: var.c,v 0.3 1994/06/24 13:28:27 ceriel Exp $ĄS"S S" S"S  S# S#S; S< S"S#S)S S(S !3+  !3+  ! 3+  !>B3?@3+  !  3+  ! 3+ 3+  S< S" S: 3*  !+S 3+  !,3+  ! 3+  !3+ 3+ S  S" S: 3*  ! ',!+S ,!  ,! ,!*,! ',!  S< ,!&S< ,3* ,,'LL,M* q!-LMqG!-LMqHM*e# ,,M* n!-LMnG!-LMnHM*c# ,,' ,mAqIM* h",",".,",,!, ,!,"-,#,$' $,%' $' &BS"' 3!( ,,)' $,*' $ %,*' $' &BS"' 3!( ,*-H !,+",,",-".,.",,/!,0",1",2".,3",,4!L5+"L6,"L7-",L8/".L9.!/S": 3;  A0/3< L=L>"L?!L@ "LA".LB",LC,"! '  !'  ''3* '! $M  $M'3* '!   3*!   3*! '  3=  ' 3*3=  A   #3* A   #3*D #3*E A, $R  #,$RS3* S A   A.   #.3* A  + #3*+ A  , #3*, A  - #3*- A.  . #.3*. A, $V / #,$VW3*/ W A 0 A 1 A 2 A. 3 A,$Y 4 -d!/S": 3F  A0/3G A LMqq@Mqq@A LMnnAMnnAa   H@ #3* 3*@ #' 3*I3*J #' 3*I3*J a   HK #3*D3*L #3*E3*M a, $a  HC #,$aSb3* S3*C b a.   HN #.3*3*N a   HO B*1,PB1*,QA2 S /,A 2S ,B 'S ,22 SH /SR L 22SH hSR iRLRHA033S, A 2S7 ,B2 S7 /3% /, 22S7H hS3R iRLRHA033T, A3 3$  ,|A  '3$  ,U|A343VLW A  ' 3  , 3XLW A '  3  ,W3YLW !23% /,A223% 3% /S3 L!2S1Z /,A22S1Z /S,Z LA22S1Z /S,Z S1Z /S,Z LA22S1Z /S,Z S1Z /S,Z S1Z /S,Z LA LA52S1[ ,a0223\NS1Z S,HZ h3!] BLH !2S2Z /,A22S2Z S-Z /LA22S2Z S-Z /S2Z S-Z /LA22S2Z S-Z /S2Z S-Z /S2Z S-Z /LA52S2[ ,a0223\NS2HZ hS-Z 3!] BLH --6-5MI4MF4MA4-)-(MI'MF'MA'-`-)-(MI'MF'MA'-6-5MI4MF4MA4-Q',EF n',EI q',EF n',EI qA '' 3  , 3^LW A '' 3  ,W3_LW -jMEj!2S5Z /,A LA52S5[ ,a0223\NS5HZ hS-Z 3!] BLH MMMMMMMM--mJ1 mJ1 mJ1mJ1"+,`"6,a".,b",,c",d!23 /,!73= /,e"1,f"+,`"6,a".,b",,c",d!23 /,!73= /,e"1,f"+,`"6,a".,b",,c",d!73= /,e"1,f!2S /,M qM nM hm Iom FoB*6,gB*+,hB.6,iB.+,jA +Sk fk,B*,lA+ Sm (m,B+*,nB6*,oB+.,pB6.,qB+Smk (m,rB1,,sB1.,tB.1,uB,1,vB .' ,wB. ' ,xA 7S ,A7 S /,B*+,yB*6,zB*,,{A+S7k fk,|A2S7 ,A8S7 ,!23 /,''3 '$M'3 '3!23 /,''3 '$M'3 '3,-q,-n-},Ll }:  B3+ 3!( !0  S2:Z B3+ 3!(  ! ''S ' ! S ! $M'S ' ! ' S3=  3' 33=  ! S A $'S 'S= = $'S~ 'S= =A SS>> ! S A SS A SS 3' 33=  ! ' S3=  A ' SS3=  A ' SS3=  ' 33=  ! ' S3=  ' 33=  ! ' S3=  ''S '''SZ 'SZ '''' S[ ' $M'S '$M'' S[ ' S' S[ ''3% '$M'3% '$'3%= 3% 'S3= =IHqIq',mIq',mIqqIq' ,mIq',-6',-)-6-)EI q''3' '$M'3' 'A* hH ' ,mAhAhA',mA4h',mA'hmA4hmA'hEA hIG4IoIG'IoEIG Io' ,IGIo',IG4Io',IG'Io' ,IGIo',IG4Io',IG'Io'  U3,U'  U3,U'  U3,U'  U3,U'  U3,U'  U3,U'  US,U'  US,U'  US,U3%3%>3%S3>>' ,mFn',-5',-(-5-(EF n3'FG4FoFG'FoEFG FoFH4FpFH'FpEFH Fpa0433,H-%-%a0433,H!)3 !)3 mE|mE!3 , B3   L "' , !3   LW "'   LW !3  LW A,mEE%mEE%!LA,ME*mE* !)3+3+3+ ME.A))3+3+3+ ME.ME0mE0 !)3+3+3+ ME1A))3+3+3+ ME1EE2@ EE2EE24@ EE5@ EE5EE54@ M7A))'3+3+3+3+ -8(A2 S  /,A 2S  ,!),M E22 S H /S R L 22S H hS R iRLRHME  E EA 2S  LA2 S  /LS": 3 !03 A2 S) /,A 2S) ,M E22 S)H /S)R L 22S)H hS)R iRLRHA2 S) /LME8  E8 EA 2S) LS": 3 !03 A2 S; /,A 2S; ,22 S;H /S;R L 22S;H hS;R iRLRHS": 3 !03 !23' /,A223' 3' /LS": 3 !03 !2S/Z /,A52S/[ ,a0223\NS1Z S,HZ hS 3!] B  !2S0Z /,A52S0[ ,a0223\3%: S: NS1Z S,HZ hS 3!] B  A52S5[ S Z ,!2S5Z /S Z /,!2S Z /,!3S": 3,  A033, !S83 !S83 !5'ZS4[ ,!3S": 3  A033 - M] !7S1Z /,- !7S1Z /,Mc !7S1Z /S1Z /,- !7S1Z /S1Z /,Mi !3 '3$U  ,- |!3 '3$U  ,Mn |B .' S1Z ,w-pA7 S1Z /S /,-pA27S1Z /S ,-pB .' S1Z ,wA7 S1Z /S /,A27S1Z /S ,A2 S1Z /S /,B .' S1Z S1Z ,w-pA7 S1Z /S1Z /S /,-pA27S1Z /S1Z /S ,-pB .' S1Z S1Z ,wA7 S1Z /S1Z /S /,A27S1Z /S1Z /S ,A2 S1Z /S1Z /S /,B .' ' S1[ ,w-pA7 ' S1[ /S /,-pA27' S1[ /S ,-pB .' ' S1[ ,wA7 ' S1[ /S /,A27' S1[ /S ,A2 ' S1[ /S /,A-8 S7+ 3$  ,- |A8 S7, 3$  ,- |A8 S7- 3$  ,- |A,8 S7/ 3$  ,- |A.8 S7. 3$  ,- |m9HUm9pU3, A/33 3A/33 3B 'S 33\3 3B3 N,A 'S 33\3 3B3 N,3, -3, B2 S7 /,A 2S7 , 22S7H hS3R iS)RH iR,R22 S7H /S3R S) ,S": 3,: !03,:3M@ 3Mx@ B 'S 33\3 3B3 N,A 'S 33\3 3B3 N,!'3\3 B,A23\S)Z B,a 2S 3\S)HZ hB,HA 'S 3\3 B,A 'S 3\3 B,A S 3 A S 3 S R33\S H3B  S R33\S H3B A ,-A ,-xA ,-~A ,-uA 'S 33\S 3\N3 B,A 'S 33\S 3\N3 B,!)3 !)3 !)'3\3 B,!23\S"Z /B,A 2S) 3 A2 S) /3 A 2S) 3 A2 S) /3 A 2'S) 3\3 B,A2 'S) /3\3 B,A 2S) 3\S"Z B,A2 S) /3\S"Z /B,A 2S  S 3 A2 S  /S 3 A 2S  S 3 A2 S  /S 3  S H3S R3  S H3S R3  S H3\S R3B  S H3\S R3B A S83 B S83 !S93 !)S93 "1S83 ! S 3 !S 3 ! S 3 !S 3 , !3, !33 3A S 3 A S 3 A S 3 A S 3 B !S 3 B! S 3 !3 !93 !93 3!3 #3* #S #, LW 33!3 A34 33" 3*  B 3* 3*  ,S   ! S   A S 3S   -S":} 3 !0S2:Z 3 A:0S 3S2:Z 3  !3'"3 A/33 a/343 !3'"3 A/33 a/343 !L!&LA S": 3 !03 A:0S 33  ALRHS": 3 !03 S" " 3 S""S" ,S"3,S" ,S" ,!33 A/33, a;/3S 33,  -X!2S: /,! S" ! S" ! S"  3!33     @  $ (@*,.                    $$ $ $ !A$ " "%&' ' !( !(")*)(*(!1  1") ) ( ( CD  9*"@:<*.  G1 J@KL*))J.FPQ(.J(;TU(((TXEF+ C)@)._P`(F- , "("f!! jGHIJK22r3ruvrxyrLM 2}~ ~1}1} }}}}}   OPQRSTUVWXYZ[\ ]^e(()g)f)_ef( IIK(@r%&r"}I "IrII} }}}III} 1&&'I1 I  } I1  } `a"#$%&2'8b8r3,c8,def grhi9:<=0@rrCDrrjHIKLrklm n1oU1VXWY XW[XU ^_Y_[ XbUdeYe[XhY XkXUmq}3p}}7))(7( Upqrstuvwxyz3}r0rr@r@"- .  p!{|}~$$ p l h d \ X T P H D @ < 8 4 , ( $       x p d \ P L H @ 8 0 (    | t p h ` X P H @ 8 0 (    | p h ` X P H @ 8 0 (    @ dAl@]z@ <``````cdA ` aAA        '  (+(,-.  /*  46 7  4 / ()()(( /()()((1 /  (9(:; < >?@ A (B /C(DEF  (N(OZ[ * C (\ (](^c(d e /glmn op1{| (+ (+-. (, /* /* f f f f f ( ( ( ( ( /f /f ( ( f ( f f f ' ' '     ' !GNOPQRSTU /7 (s(tu vxyz{|}~  " !,) 6*>*!G P X`g!nu|  +, 8+C P]*j o z&@9t999:D:x::@9;;;<:H;:;H;|;:;H;|;:L<;;H;|;;;;;PTtT|TTTTTTTTTTTU dUuE<X<0IqIuqIGuqIHe?KI*q"/FnF$jnFG$jnFH$ c=$ DF*q%A&ACA*q _hA(RG.38=B:Gk9JLMO0QO2TO3WO5]N0z!N2}*N3N5&MH3^H2Ƃ˂ЂՂoH8߂> H=K3?= >$*06<MBJI:pHEqIFOXqgsnhIho ҃܃4@J'p3 Xbpz8p2ބAp81p= s3+e8DcLXd `n̅߅ +3;AGUc8w k`3`8`kQ3yQ82-3A-8dY3pY8 U3? U8Ejq(Ejs2Ejt<EjwEjz4Oj3;j8IbElqplEls}vElt2Elwl3l8AEIqAEFnAEI~!AEF~'AEA~-AEIq3AEFn7AEI;A6EFAAEAGbMM*IEbqQB7FEbnUMCIEbYBOFEb_E[AEbeMhIEbqkBuFEbnoMIEbsBFEbyEAEbRBFEFnMIEIqBFEFnM IEIq.3.8Z3Z8k#Ek!Emq'AEmz4.m3;m8I@8pwS_8_fP8A Py,8,T8T18s108 02܊"',;EJOTY^cmr5q3 n3h3Io3PFo3N 3Nj͋ۋ %1?a3MSY_m{46I6<5')I)(   }3}8}} }j!}k;[lIIqIIqIIqIIq JI8q)N I{q;AAhA)AhA7AhAEAh BSA8h)FaA{h;yIIqIBIqI$IqIIq JI8q)NI{q;AVAhAAhArAhAAh BA8h)F A{h;DAUho%CA ho'CA'hoBA4hoDAUh%C A h'CA'hBA4hFBFnF=FnFOFnFFn EF8n)AF{n;?t?e<??e<??e< <?8e<))8P ?{e<;;<` ?<`e73<?a =8c)):={c;;!M IGIoM IGIoM IGIoM IGIo M IG8Io)M IG{Io;0J I>Id^J I>Id^J I>Id^ J- I>8Id^))J> I>{Id^;;FMR IHIpMc IHIpMt IHIp M IH8Ip))M IH{Ip;;[M IG4IoMt IG'IoMT IGUIo%Md IG Io'iM IGUIoQ%M IG IoQ'M IG'IoQM IG4IoQM IGIoM IGIoM IGIoM IGIo M- IG8Io)M= IG{Io;JI>IdJI>IdJI>Id JI>8Id))JI>{Id;;M IHIpOM IHIpOM IHIpO M IH8IpO))M IH{IpO;;B'FGUFo%BFG Fo'BFG'FoBFG4FoBFGFoB FGFoBFGFoBFGFo B~FG8Fo)BFG{Fo;BFHUFpM%BFH FpM'BFH'FpMBFH4FpMBFHFpBFHFpBFHFpBFHFp BFH8Fp)BFH{Fp;*MIE`q7MIEbq7MSIEjq1MbIEkq1MqIElq2MIEmq59MIEjqP1MIEkqP1MIElqP2MIEmqP5NMIEjq1MIEkq1M IElq2MIEmq5aMmIE`q7M|IEbq7M.IEjq1M=IEkq1MLIElq2M[IEmq5sMIEjq+1MIEkq+1MIElq+2MIEmq+5BFE`nj7BFEbnj7B>FEnjB5FEnjBFEjnj1BFEknj1BFElnj2BFEmnj5BFEjn1BTFEkn1BFEln2BFEmn5L0IUqLlIUq:?UeKWI*qHqKeI*qHK~I*qHq KI*qMI6 I))IIq2IIq6IIq:KI qDK"I qNAA*hG[CgA*hgAA*htCZA*4h~CA*'hA)AhA5AhAAhMOIGIoM]IGIoMIGIoM{IGIGIo MIGIG4Io MIGIG'Io MIG*IoMIG*4Io*MIG*'IoF($GFFnPFFnTFFnXDF nbBFGFohBFGFotBFGFoBFHFpBFHFpBFHFp$%A<EE|qAHEEqAWEEE|(AfEEE(AuEEq6AEEsJaAEEt~AEE)AEEAEE$AEE%AEE%tAEE%)AEEtAEE+AEE-A&EE/A EE#tAEE#+A#EE#-AEE#/A;EE)4AFEErBAEE3MA^EE)[AiEEriAEE3tAEE6AEE/3E;E>GE?8Δ<A<B<E <Fj*k:#83GUE8?cJE8JdZ88j9<8AD<8FO<8M<8Bc8j8kw{3{8{j/{k? 3L 8V jg kwE[q[3[8 E\q\3\873E7q0bE7?C7jP7kdFKE7|sFWE7?f3Hfjfk\9Zg9\r9`}9a9f9g9j)9lGCEjpohCEjo՘CEjpq7CEjqTnCEjpr֙C@Ejr !8O93f̚9;w9^wk"K^3.^k<];3F;kTq3^8383Л8j$k68DTc2xwtyuvex8sw8t8y8u8v8x8bw8bt8b y8bu8bv8bjx3w3t3y3u3v3xwtyuvt3y3r3NzXC76{+6N +' ] f z1 3mxp[x  Z<x] ! m%YJe^iSkF%E JA  . lgr\Q} O@Qg  Hcp >3#b~  .O { /:. l r  Q+.  < +776   90   `````|````  @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H% ((((( AAAAAABBBBBB  @P$ (k!$@C'+*焑. 11_58.;:k @v?#NJBxbE&zI2xnL?hW OSaQY@VoȥY': ]x9? Dǃet2#[ś[."yA"R0<E@4~cU/gD^\WʏU7^1Zqx"s m bJz-@JEag'::= ף ףpn;OX,eGŧ#G7ilՔּBzw̫aA_p6ۿ $ ̼̈PoB.K5$\ |٬:[M2wI6]}JadP{t,m'S;uDQ%۝XvtH~E/_}t5C}e.&?t 4*,Z̗0/u7EBEنu;H%SSSSB t$L,3;BFLMY`gn0ud| Dxz{X|psׁ<xLJ"ˊ+\~7GUg#uܔ`<! gԱ")05?*CLKXPTt[ctk rxN   U܂(KP."0fni"Z 6H8 Qn+]k4-i>8H Ta#]|f^imoUwFTT Ą$> jG F  e 9l[ U^']30P:GP@xM<UZS]LcQ=j`tI_U  K$+Ep.Eki4"" @J [8"Y,Z6> FJQYcHpxإ+ 4 D H L Z-.. .."^6*62?7:7B8I 9P :[:c;hO<m^=x==>=>x>>?N?BBCYC|CDE  % / 7 ? G O T \ 4d o w   Ċ Ȋ6ZX ̊Zxq<J lJ8 Wx%/V8o?$xHQ\F]VhIrvF}}hFGНL Њ̄DUHULUPUo tS R 8Q )S" $t+ <6 Ԋ> TUG |UT lU_ f O[n 7]v ؊| b S  ~_ _c h @  j j H L S  L S PT tT# |T+ T3 T; TC TK TS T[ Tc Tl Tu T~ U dU  w x{ t} y H} ~ x P} { z  @ L} ( 0 Ĵ6 D K Y ` X~h o T~z  j Ԓ  ` P Ƚ     p  0 d \  ئ ` < $$ * H3 9 4? |I S Ħ] ,f xn v ȟ      X     ±  < l  | ̲ P' 0 : xC $L 0T \ e k t }  | w d п   $   `       "*begrom_rcsidI_1_rcsid_rcsid_rcsid2_rcs_m_rcs_mh_rcsidI_4_rcsid_label_list_rcsid_rcsid_rcsid_rcsid_rcsid_rcsid_rcsid_rcsid_rcsid_s10pow_big_10pow_r_10pow_r_big_10pow_add_exponent_flt_ecvtI_3__pfloat__pscien__gcvt__calls_mul_ext_add_ext_cmp_ext_b64_sft_b64_add_ten_powers_big_ten_powers_r_ten_powers_r_big_ten_powers_add_exponent_ten_mult_max_dI_3_grow__bottom__top__empty_qsort1_qexchange_q3exchange_qcompar_cvtI_1_do_writeSENDRECEIVEBOTHSYSVECSRCDESTMESSAGE_gnum_o_printuplwordupwordupbytedonedownwardsno0comparedoneno0endrombegtextbegdatabegbsscrtso___main__fpu_present__penvp__end_exit_environendtext_main_startupcode_codegen_readcodebytes_dopseudo_distance_tsize_tostring_myfree_prtoken_stregclass_findcoerc_docoerc_costcalc_allsetno_curreglist_compute_nallreg_ssize_erasereg_genstr_getrefcount_chrefcount_emlines_enodes_fakestack_in_stack_gennl_tokpatlen_ad2str.csa4_allreg_eqtoken_machregs.blm_garbage_collect_reglist_restorestatus_savestatus_setcc_test_stackheight_tokens_nextem_move_swtxt_instance_printlabel_coderules_match_pattern_saveemp_machsets_emp_tuples_fatal_regreturn_stackupto_nemlines_tref_opdesc_mycat_mystrcpy_digstr_lookglo_salloc_strlen_isregvar_isregtyp_strcat_dollar_get_label_strcmp_curtoken_codestrings_strcpy_sprintf_permute_rar_lar_maxindex_regclass_perms_myalloc_holno_procno_curseg_part_size_part_word_regallowed_atol_in_init_in_start_in_finish_fillemlines_getarg_table1_table2_table3_get16_get32_getstring_strarg_bss_con_switchseg_savelab_dumplab_xdumplab_part_flush_holstr_con_part_con_mult_float_cst_con_float_prolog_regscore_i_regsave_f_regsave_regsave_mes_segname_emfile_nextispseu_savetab1_opcode_offtyp_argval_dlbval_str_argstr_labstr_maxstrsiz_strsiz_lbytes_si_off_di_off_firstreg_unlinkregs_fixregvars_codefile_popstr___flushbuf_flt_str2flt_ungetc_kill_labels_fputs_add_label.csb4___fillbuf_tryreg_em_ptyp___stderr_linkreg_error_em_flag___stdin_out_finish_cleanregs_enterglo_tstoutput_flt_b64_sft_fprintf_freopen_out_init_praddr___stdout_fclose_glolist_maxply_ggd_progname_atoi_cc1_cc2_cc3_cc4_itokcost_tests_moves_trypat_argtyp_pathash_clashlist_rvlist_nregvar_regassigned_rvnumbers_nstab_compar_chkstr_stab_free_malloc_qsort_bmove_cinstance_from_stack_aside_length_save_stack_rest_stack_aside_unstackset_c3coercs_abort_tokeninstances_c1coercs_rlist0_rlist1_rlist2_rlist3_rlist4_rlist5_rlist6_rlist7_rlist8_rlist9_rlist10_rlist11_rlist12_rlist13_rvtar0_ratar0_flt_flt2str_flt_mul__flt_nrm_flt_add_flt_status__flt_chk_flt_cmp___ctype__flt_64add_flt_sub__flt_ucmp__flt_split__fp_hook__f_print_strtod.cmf8__str_ext_cvt__ecvt__ext_dbl_cvt__fcvt__clean_raise___funccnt___functab__exit__ext_str_cvt__dbl_ext_cvt.loi_ldexp___huge_val.ngf8.mlf8.adf8.sti.cfu.cuf8_errno_frexp.sbf8_realloc__sbrk_memcpy__brk__kill__getpid.fef8___IsNan.dvf8.cif8__brksize__syscall__sendrec___iotab_fflush__close___cleanup__lseek__write__read__isatty__doprnt__open__creat___exit__send__receiveendbss__memcpy__strncat__strncmp__strncpy__strnlen.cff4__loadname__i_compute_toupper__memmove.compact.add_ext.extend__fptrp.zrf_ext.zrf8.nrm_ext.b64_sft.b64_rsft.div_ext.Xtrp.mul_ext.sub_ext.b64_lsft.sft_ext.b64_addECASE.fat.error.ignmask.trp.stop.los.sts.trppcERANGEESETEIDIVZEHEAPEILLINSEODDZenddata,__.SYMDEF/$pdddd$)0_edataendtextenddata__endendbss_end_etextedata.o/~dddd_edata.text.rom.data.bssem_end.o/~ 8xxxxx endtextenddata__endendbss.text.rom.data.bss.endend.o/ xxxxx_end.text.rom.data.bss.endetext.o/dddd_etext.text.rom.data.bss,__.SYMDEFy9$:d L 6 r j Z%R*60d6<BGLQFV0[~afhlsy    8()!)'*-,2:-7".=@/CD0IV1Ot2Tt2Y3^4d5i6n8s9z99:;<>>>>>> @nACVDEF$H$IRJKLNNO OLPbQ!bQ(bQ1bQ8R=SEtTMPU[W`WeWkWqWzWWWWW Y YZ[]]^ `a$bc&de f)g1h9iAjIkQlYmanjosp|qrt.adi.and.blm.cii.cmi4.cms.cmu4.com.csa2.csa4.csb2.csb4.ciu.cui.cuu.dup.dvi.dvi4.dvu.dvu4.error.XtrpECASE.exg.fat.adf4.adf8.sbf4.sbf8.mlf4.mlf8.dvf4.dvf8.ngf4.ngf8.fif4.fif8.fef4.fef8.cif4.cif8.cuf4.cuf8.cfi.cfu.cff4.cff8.cmf4.cmf8.gtohol0.iaar.ilar.inn.ior.isar.lar2.lfr6.lfr8.los.loi.mli.mli4.mon.ngi.nopprintsprintdprintc.rck.ret6.ret8.retarea.dsret.sret.cret.sdret.dret.rmi.rmi4.rmu.rmu4.rol.ror.sar2.sbi.set.sli.sri.sts.sti.trp.stop.unknown.reghp.limhp.ignmask.trppc.xor_alloca_get_bp_getprocessor_inb_inw_outb_outw_rep_inb_rep_inw_rep_outb_rep_outw_intr_disable_intr_enable__memmove__memcpy__strncat__strncmp__strncpy__strnlen_bcmp_bcopy_bzero_index_memchr_memcmp_memcpy_memmove_memset_rindex_strcat_strchr_strcmp_strcpy_strlen_strncat_strncmp_strncpy_strnlen_strrchr___sys_errlist_errno_strerrorem_adi.oy9ߔ!&!d![uYu ZYYRS  .adi.trpEODDZ.text.rom.data.bssem_and.oy9ߔdwww[X#.and.text.rom.data.bssem_blm.oy9ߔdyyywƉ.blm.text.rom.data.bssem_cii.oy9ߔ!1(1d1[u9tt uu ZuRPP+ / .ciiEILLINS.fat.text.rom.data.bssem_cmi4.oy9ߔ""d"[YZXV\^9|9w t1ø.cmi4.text.rom.data.bssem_cms.oy9ߔd~~~[VWʉtA_^.cms.text.rom.data.bssem_cmu4.oy9ߔ""d"[YZXV\^9wr9w t1ø.cmu4.text.rom.data.bssem_com.oy9ߔdrrrCCî.com.text.rom.data.bssem_csa2.oy9ߔ$'$d$+G;Gw Ë_u ӅuP  .csa2ECASE.fat.text.rom.data.bssem_csa4.oy9ߔ$'$d$+G;Gw Ë_ u ˅uP  .csa4ECASE.fat.text.rom.data.bssem_csb2.oy9ߔ#'#d#OI|;u_uP  .csb2ECASE.fat.text.rom.data.bssem_csb4.oy9ߔ('(d(7OI|;u;Wu[_uP[ ! .csb4ECASE.fat.text.rom.data.bssem_cuu.oy9ߔ; )2)d)[9tt uu Zu1RPP# '  %+06.ciu.cui.cuuEILLINS.fat.text.rom.data.bssem_dup.oy9ߔdyyy[)̉Ɖ.dup.text.rom.data.bssem_dvi.oy9ߔ3+,+d+[=uXYP=uXZ^_SWVRP[RPS % ) #(..dvi.trpEODDZ.dvi4.text.rom.data.bssem_dvi4.oy9ߔ (dVW\D9u3!}t+1ҋL D !}!}؃_^R1!}\ߋD T !} T9wr 9Tv+T@_Z]` c flrw}ylyhxlxh.dvi4.text.rom.data.bssem_dvu.oy9ߔ4,,,d,[=u X1YP=uXZ^_SWVRP[RPS & * $)/.dvu.dvu4.trpEODDZ.text.rom.data.bssem_dvu4.oy9F N(NdNVW\D u1ҋL D _^1ۋD T 9wr 9Tv+T@!$ ' *06;Aylyhxlxh.dvu4.text.rom.data.bssem_error.oy98+1+d+UVWRQSPuX[YZ_^]=}  )"(-3.error.Xtrp.ignmask.trp.text.rom.data.bssem_errors.oy9ddddECASE.text.rom.data.bssem_exg.oy9dW_ü.exg.text.rom.data.bssem_fat.oy9&djjj  .fat.stop.trp.text.rom.data.bssem_fp8087.oy9- B:d:GG_ÉGG _ ÉGg_ÉG g_ ÉGO_ÉGO _ ÉGw_ÉG w_ ÉG_ÉG_ÉSGOGrћGv&ћGs雋__[ÉSGO GrћGv&ћGs__[ÉG%t"-~G% ?W_GWËG% Gu1_GGËOʁ€u Hg O_O?WÉG %t.-G % ?www_GGGGËG % G G Gu1_GGGGËO ʁuHgWW ?Oww_WOGGÉu G_ÛG_Éu G_ÛG_ÉuGGGG_ÛG} &&_ÉuGG} &&_ÉSWO oXuG_uGWoÛG_ uG SWgOoXu+G_G+GuGWoÛG_ G +G u׋G ҉GWgo_WoÉG_ÉS1ɛGGٛGtrIA[ÉS1ɛG GٛGtrIA[#:yz~ 0@P`pKmO "(onetwobigmin.adf4.adf8.sbf4.sbf8.mlf4.mlf8.dvf4.dvf8.ngf4.ngf8.fif4.fif8.fef4.fef8.cif4.cif8.cuf4.cuf8.cfi.cfu.cff4.cff8.cmf4.cmf8.text.rom.data.bssem_gto.oy9dlllog'.gto.text.rom.data.bssem_hol0.oy9dddlhol0.text.rom.data.bssem_iaar.oy9%dzzzYZt[X+g[Q .iaar.unknown.text.rom.data.bssem_ilar.oy9+dtttYZt[XQ  .ilar.lar2.unknown.text.rom.data.bssem_inn.oy90 (d(1һ9sӄt1[ @.innbits.text.rom.data.bssem_ior.oy9dwww[X .ior.text.rom.data.bssem_isar.oy9+dtttYX=t[XQ  .isar.sar2.unknown.text.rom.data.bssem_lar2.oy9..d.YZQV+Os0^[PZG[)ĉlj.lar2.text.rom.data.bssem_lfr6.oy9%dsss[666 .lfr6.retarea.text.rom.data.bssem_lfr8.oy9%dwww[6666 .lfr8.retarea.text.rom.data.bssem_loi.oy9, ,d,[s0䬉P) [)։.los.loi.text.rom.data.bssem_mli.oy9JB,BdB[=uXYP=u)SىGGGGGGGOXZ[RPS 4< @#).4:?E.mli.mli4.trpEODDZ.text.rom.data.bssem_mli4.oy9"dRgZPgZ‰ȉgylyh.mli4.text.rom.data.bssem_mon.oy9!dggg .mon.stop.text.rom.data.bssem_ngi.oy9%&%d%[=uYQ=u ZXRPS #.ngi.trpEODDZ.text.rom.data.bssem_nop.oy9K @ d ooo    "'.5;@FSIO_SSIO_DRXRDY.nophol0printcprintd.text.rom.data.bssem_print.oy91232d2Ct1ҹ tRZ0PPSP[[[[ + !!&,printsprintdprintc__write.text.rom.data.bssem_rck.oy9)dwww;|;GPX .rck.errorERANGE.text.rom.data.bssem_ret6.oy9%dsss[ .ret6.retarea.text.rom.data.bssem_ret8.oy9%dwww[ .ret8.retarea.text.rom.data.bssem_retarea.oy9dddd.retarea.text.rom.data.bssem_return.oy9 6 d nnn_^]^_ .dsret.sret.cret.sdret.dret.text.rom.data.bssem_rmi.oy93+,+d+[=uXYR=uXZ^_SWVRP[RPS % ) #(..rmi.rmi4.trpEODDZ.text.rom.data.bssem_rmi4.oy9 (dVW\D9u7!}t/1ҋL D !}1ۃ| }ڃЉ_^1!}\ߋD T !}ڹ9wr 9Tv+T@WZ] ` ciotzylyhxlxh.rmi4.text.rom.data.bssem_rmu.oy94,,,d,[=u X1YR=uXZ^_SWVRP[RPS & * $)/.rmu.trp.rmu4EODDZ.text.rom.data.bssem_rmu4.oy9J R(RdRVW\D u1ҋL D 1ۉЉ_^1ۋD T 9wr 9Tv+T@"%( + .4:?Eylyhxlxh.rmu4.text.rom.data.bssem_rol.oy9+&+d+Z=uXYP=uY X[SPR% ) .rol.trpEODDZ.text.rom.data.bssem_ror.oy9-&-d-Z=uXYP=uYك X[SPR' + .ror.trpEODDZ.text.rom.data.bssem_sar2.oy9**d*YZQ+ORZs[X[Ɖ.sar2.text.rom.data.bssem_sbi.oy9%&%d%[uY)u ZY)YQS #.sbi.trpEODDZ.text.rom.data.bssem_set.oy9B<*4d4[1)SW1Q9s׊U__ @"/ 2"',27=.setbits.trpESET.text.rom.data.bssem_sli.oy9(&(d(Z=uXYP=uY X[SPR" & .sli.trpEODDZ.text.rom.data.bssem_sri.oy9(&(d(Z=uXYP=uY X[SPR" & .sri.trpEODDZ.text.rom.data.bssem_sti.oy9$ $d$[s X[׉.sts.sti.text.rom.data.bssem_trp.oy90dyyy1ۇtPX  .trp.stop.trppc___exit.text.rom.data.bssem_unknown.oy9,dkkkP .unknownEILLINS.fat.text.rom.data.bssem_vars.oy9" :dddl8 .reghp.limhp.ignmask.trppc__end.text.rom.data.bssem_xor.oy9dwww[X3.xor.text.rom.data.bssalloca.oy9dyyyYX$)ĉw7P_alloca.text.rom.data.bssget_bp.oy9dgggã_get_bp.text.rom.data.bssgetprocessor.oy9 IdUTX9t VtNIN~t93t* (tff`f1@dVGfaf]SfXZ1RPffXZSPf1څ[PfTbpa~eo32_getprocessornew_processorgot_processorflip.text.rom.data.bssiolib.oy9mdUV0]UV]UVF]UVF]UWV~N_]UWV~N_]UVVvN^]UVVvN^]U]U]Ô  ,?Tg|_inb_inw_outb_outw_rep_inb_rep_inw_rep_outb_rep_outw_intr_disable_intr_enable.text.rom.data.bss_memmove.oy9a ?F?d?UVW~vN)9rr uF_^]NO%.$5*<,A3KQV\__memmove__memcpyupwordupbytedonedownwards.text.rom.data.bss_strncat.oy9.$.d.UVW~0OW~uA)ʉыv_󤪋F_^]__strncatno0.text.rom.data.bss_strncmp.oy96 *<*d*UVW1tv~u |t Iuw-@_^]  %& &+1__strncmpcompareunequalafterequal.text.rom.data.bss_strncpy.oy9 d{{{~0)ʇʋv~÷__strncpy.text.rom.data.bss_strnlen.oy9$dUW~0ʀuA)_]__strnlenno0.text.rom.data.bssbcmp.oy9  * d Uvvvt +VJF)]  _bcmpequal_memcmp.text.rom.data.bssbcopy.oy9 ' d mmmYXZPRQ _bcopy__memmove.text.rom.data.bssbzero.oy9%dwwwUv1Pv]  _bzero_memset.text.rom.data.bssindex.oy9%dggg _index_strchr.text.rom.data.bssmemchr.oy9 & d UW~FNuE_]1_]_memchrfailure.text.rom.data.bssmemcmp.oy9W @;@d@UVW1v~Nr u))хtw-@_^]$*.0059;:AGLR_memcmpcwordcbytelastafterequal.text.rom.data.bssmemcpy.oy9'duuuUVW~vN _memcpy__memcpy.text.rom.data.bssmemmove.oy9)dggg _memmove__memmove.text.rom.data.bssmemset.oy9)/)d)UW~FNruF_]!# _memsetswordsbytedone.text.rom.data.bssrindex.oy9'dggg _rindex_strrchr.text.rom.data.bssstrcat.oy9(djjj _strcat__strncat.text.rom.data.bssstrchr.oy90)0d0UW~0))ϊFtu1_]XE_] ) _strchrnextfound.text.rom.data.bssstrcmp.oy9(djjj _strcmp__strncmp.text.rom.data.bssstrcpy.oy9(dvvvUVWF_^]  _strcpy__strncpy.text.rom.data.bssstrlen.oy9(djjj _strlen__strnlen.text.rom.data.bssstrncat.oy9)dlllW _strncat__strncat.text.rom.data.bssstrncmp.oy9)dlllO _strncmp__strncmp.text.rom.data.bssstrncpy.oy9)dzzzUVWNF_^]  _strncpy__strncpy.text.rom.data.bssstrnlen.oy9)dlllO _strnlen__strnlen.text.rom.data.bssstrrchr.oy9&'&d&UW~0OFuE_]1_]!_strrchrfailure.text.rom.data.bsserrlist.oy9 =BddError on send/receiveCan't send messageOperation already in progressOperation now in progressNo such connectionAlready shutdownNo connectionNo urgent data presentUrgent data presentConnection timed outConnection resetConnection refusedAddress in useAlready connectedDestination not reachableBad destination addressWould blockBad mode for ioctlIllegal ioctl for deviceNot enough buffers leftInvalid packet sizeToo many symbolic linksDirectory not emptyFunction not implementedNo locks availableFile name too longResource deadlock avoidedResult too largeMath argumentBroken pipeToo many linksRead-only file systemIllegal seekNo space left on deviceFile too largeText file busyNot a typewriterToo many open filesFile table overflowInvalid argumentIs a directoryNot a directoryNo such deviceCross-device linkFile existsResource busyBlock device requiredBad addressPermission deniedNot enough coreResource temporarily unavailableNo childrenBad file numberExec format errorArg list too longNo such device or addressI/O errorInterrupted system callNo such processNo such file or directoryNot ownerrbJ@&     rfTD4$|l` R!@"&#$%&'(23r4^5R6:7 89:;<=>?@vAbBHC*Def???? ????? ?$?(?,?0?4?8?<?@?D?H?L?P?T?X?\?`?d?h?l?p?t?x?|?????????????????????????????    * H b$ v+ 2 9 @ G N U \ c  j :q Rx ^ r        & @ R ` l |         $ 4' D. T5 f< rC J Q X _ f l r x ~ & @ J b r     ___sys_errlist__II60__II59__II58__II57__II56__II55__II54__II53__II52__II51__II50__II49__II48__II47__II46__II45__II44__II43__II42__II41__II40__II39__II38__II37__II36__II35__II34__II33__II32__II31__II30__II29__II28__II27__II26__II25__II24__II23__II22__II21__II20__II19__II18__II17__II16__II15__II14__II13__II12__II11__II10__II9__II8__II7__II6__II5__II4__II3__II2__II1__II0.text.rom.data.bsserrno.oy9dddf_errno.text.rom.data.bssostrerror.oy9 {DmdmUVWV9TuT<u ~y VډFǹ 10ИN1 u~yN-VP[[Error N_ ch k{_strerror__II0___sys_errlist_strcpy.dsret.text.rom.data.bssc,__.SYMDEF/$8 ___dummy__dummy.o/!dddd___dummy__.text.rom.data.bss,__.SYMDEFe7j\$8 ___dummy__dummy.oe7i\!dddd___dummy__.text.rom.data.bss,__.SYMDEFy9$Hddd" _malloc_free_realloc_printfkmalloc.oy9 :I:d:UVWF~sFVV-TV9^u^^WT V9s 5 u u v[=u1FVD5뤺V9r&VV+V^^TWVVTTDEUVWv t&\^ 9vv 5 uV^w UPVW~ u1UЉFv[ƋV9VvFFPWVW % d   , 8Zbhqw~_malloc_free_realloc__II0__sbrk_memcpy.dsret.text.rom.data.bsskprintf.oy9] FOd(^($$U*VW^^֋^F u%tV[^FF-uF^FF 0uF0^F1*u^փ^֋^F+0 s! 0‰׋^F-0= rF.u^^F=*u^փ^֋WV^F20 s(F f0‰V^F-0= rF1FFF FltLuF^F t~u^փ^ww^փ^֋GRPZYVN y ڃQRvvFF=F FF~u^փ^ww^փ^1PwFFvFvvvRP[N FvvRPFV u1v؋^փ^֋WF5v%F(^փ^֋wF V9V} F^?u+V׃~yO~0u~y-Pv[~uvg[O ~ u~y-PN[F1ۈS@[N~ =v)[O%P[?1P [1 %4XcdYopsAux0123456789ABCDEF0123456789abcdef         " & ' !             "(.4:@GMRX_printf__II0__II1__II2.dvu4.csb2.rmu4_putk.dsret.text.rom.data.bss/* libmath.b for bc for minix. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } /* Natural log. Uses the fact that ln(x^2) = 2*ln(x) The series used is: ln(x) = 2(a+a^3/3+a^5/5+...) where a=(x-1)/(x+1) */ define l(x) { auto e, f, i, m, n, v, z /* return something for the special case. */ if (x <= 0) return (1 - 10^scale) /* Precondition x to make .5 < x < 2.0. */ z = scale; scale += 4; f = 2; i=0 while (x >= 2) { /* for large numbers */ f *= 2; x = sqrt(x); } while (x <= .5) { /* for small numbers */ f *= 2; x = sqrt(x); } /* Set up the loop. */ v = n = (x-1)/(x+1) m = n*n /* Sum the series. */ for (i=3; 1; i+=2) { e = (n *= m) / i if (e == 0) { v = f*v scale = z return (v/1) } v += e } } /* Sin(x) uses the standard series: sin(x) = x - x^3/3! + x^5/5! - x^7/7! ... */ define s(x) { auto e, i, m, n, s, v, z /* precondition x. */ z = scale scale = 1.1*z + 1; v = a(1) if (x < 0) { m = 1; x = -x; } scale = 0 n = (x / v + 2 )/4 x = x - 4*n*v if (n%2) x = -x /* Do the loop. */ scale = z + 2; v = e = x s = -x*x for (i=3; 1; i+=2) { e *= s/(i*(i-1)) if (e == 0) { scale = z if (m) return (-v/1); return (v/1); } v += e } } /* Cosine : cos(x) = sin(x+pi/2) */ define c(x) { auto v; scale += 1; v = s(x+a(1)*2); scale -= 1; return (v/1); } /* Arctan: Using the formula: atan(x) = atan(c) + atan((x-c)/(1+xc)) for a small c (.2 here) For under .2, use the series: atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... */ define a(x) { auto a, e, f, i, m, n, s, v, z /* Special case and for fast answers */ if (x==1) { if (scale <= 25) return (.7853981633974483096156608/1) if (scale <= 40) return (.7853981633974483096156608458198757210492/1) if (scale <= 60) \ return (.785398163397448309615660845819875721049292349843776455243736/1) } if (x==.2) { if (scale <= 25) return (.1973955598498807583700497/1) if (scale <= 40) return (.1973955598498807583700497651947902934475/1) if (scale <= 60) \ return (.197395559849880758370049765194790293447585103787852101517688/1) } /* Negative x? */ if (x<0) { m = 1; x = -x; } /* Save the scale. */ z = scale; /* Note: a and f are known to be zero due to being auto vars. */ /* Calculate atan of a known number. */ if (x > .2) { scale = z+4; a = a(.2); } /* Precondition x. */ scale = z+2; while (x > .2) { f += 1; x = (x-.2) / (1+x*.2); } /* Initialize the series. */ v = n = x; s = -x*x; /* Calculate the series. */ for (i=3; 1; i+=2) { e = (n *= s) / i; if (e == 0) { scale = z; if (m) return ((f*a+v)/-1); return ((f*a+v)/1); } v += e } } /* Bessel function of integer order. Uses the following: j(-n,x) = (-1)^n*j(n,x) j(n,x) = x^n/(2^n*n!) * (1 - x^2/(2^2*1!*(n+1)) + x^4/(2^4*2!*(n+1)*(n+2)) - x^6/(2^6*3!*(n+1)*(n+2)*(n+3)) .... ) */ define j(n,x) { auto a, d, e, f, i, m, s, v, z /* Make n an integer and check for negative n. */ z = scale; scale = 0; n = n/1; if (n<0) { n = -n; if (n%2 == 1) m = 1; } /* Compute the factor of x^n/(2^n*n!) */ f = 1; for (i=2; i<=n; i++) f = f*i; scale = 1.5*z; f = x^n / 2^n / f; /* Initialize the loop .*/ v = e = 1; s = -x*x/4 scale = 1.5*z /* The Loop.... */ for (i=1; 1; i++) { e = e * s / i / (n+i); if (e == 0) { scale = z if (m) return (-f*v/1); return (f*v/1); } v += e; } } b.*..cASCII.defdArguments.defeArraySort.deffCSP.defgConversion.defhEM.defiEpilogue.defjInOut.defkMathLib0.deflMathlib.defmPascalIO.defnProcesses.defoRealConver.defpRealInOut.defqSemaphores.defrStorage.defsStreams.deftStrings.defuStripUnix.defvTermcap.defwTerminal.defxTraps.defyUnix.defzXXTermcap.def{random.def(*$Foreign*) DEFINITION MODULE ASCII; (* Module: Mnemonics for ASCII control characters From: ??? Version: $Header: ASCII.def,v 1.2 88/02/19 15:39:13 ceriel Exp $ *) CONST nul = 00C; soh = 01C; stx = 02C; etx = 03C; eot = 04C; enq = 05C; ack = 06C; bel = 07C; bs = 10C; ht = 11C; lf = 12C; vt = 13C; ff = 14C; cr = 15C; so = 16C; si = 17C; dle = 20C; dc1 = 21C; dc2 = 22C; dc3 = 23C; dc4 = 24C; nak = 25C; syn = 26C; etb = 27C; can = 30C; em = 31C; sub = 32C; esc = 33C; fs = 34C; gs = 35C; rs = 36C; us = 37C; del = 177C; END ASCII. DEFINITION MODULE Arguments; (* Module: Access to program arguments and environment Author: Ceriel J.H. Jacobs Version: $Header: Arguments.def,v 1.2 88/02/19 15:39:38 ceriel Exp $ *) VAR Argc: CARDINAL; (* Number of program arguments, including the program name, so it is at least 1. *) PROCEDURE Argv( argnum : CARDINAL; VAR argument : ARRAY OF CHAR ) : CARDINAL; (* Stores the "argnum'th" argument in "argument", and returns its length, including a terminating null-byte. If it returns 0, the argument was not present, and if it returns a number larger than the size of "argument", "argument" was'nt large enough. Argument 0 contains the program name. *) PROCEDURE GetEnv( name : ARRAY OF CHAR; VAR value : ARRAY OF CHAR ) : CARDINAL; (* Searches the environment list for a string of the form name=value and stores the value in "value", if such a string is present. It returns the length of the "value" part, including a terminating null-byte. If it returns 0, such a string is not present, and if it returns a number larger than the size of the "value", "value" was'nt large enough. The string in "name" must be null_terminated. *) END Arguments. DEFINITION MODULE ArraySort; (* Module: Array sorting module Author: Ceriel J.H. Jacobs Date: $Header: ArraySort.def,v 1.1 88/02/19 12:52:37 ceriel Exp $ Interface is like the qsort() interface in C, so that an array of values can be sorted. This does not mean that it has to be an ARRAY, but it does mean that the values must be consecutive in memory, and the order is the "memory" order. The user has to define a comparison procedure of type CompareProc. This routine gets two pointers as parameters. These are pointers to the opbjects that must be compared. The sorting takes place in ascending order, so that f.i. if the result of the comparison is "less", the first argument comes in front of the second. *) FROM SYSTEM IMPORT ADDRESS; (* no generics in Modula-2, sorry *) TYPE CompareResult = (less, equal, greater); CompareProc = PROCEDURE(ADDRESS, ADDRESS): CompareResult; PROCEDURE Sort(base: ADDRESS; (* address of array *) nel: CARDINAL; (* number of elements in array *) size: CARDINAL; (* size of each element *) compar: CompareProc); (* the comparison procedure *) END ArraySort. DEFINITION MODULE CSP; (* Module: Communicating Sequential Processes From: "A Modula-2 Implementation of CSP", M. Collado, R. Morales, J.J. Moreno, SIGPlan Notices, Volume 22, Number 6, June 1987. Version: $Header: CSP.def,v 1.2 88/02/19 15:39:59 ceriel Exp $ See this article for an explanation of the use of this module. *) FROM SYSTEM IMPORT BYTE; TYPE Channel; PROCEDURE COBEGIN; (* Beginning of a COBEGIN .. COEND structure *) PROCEDURE COEND; (* End of a COBEGIN .. COEND structure *) PROCEDURE StartProcess(P: PROC); (* Start an anonimous process that executes the procedure P *) PROCEDURE StopProcess; (* Terminate a Process (itself) *) PROCEDURE InitChannel(VAR ch: Channel); (* Initialize the channel ch *) PROCEDURE GetChannel(ch: Channel); (* Assign the channel ch to the process that gets it *) PROCEDURE Send(data: ARRAY OF BYTE; VAR ch: Channel); (* Send a message with the data to the cvhannel ch *) PROCEDURE Receive(VAR ch: Channel; VAR dest: ARRAY OF BYTE); (* Receive a message from the channel ch into the dest variable *) PROCEDURE SELECT(n: CARDINAL); (* Beginning of a SELECT structure with n guards *) PROCEDURE NEXTGUARD(): CARDINAL; (* Returns an index to the next guard to be evaluated in a SELECT *) PROCEDURE GUARD(cond: BOOLEAN; ch: Channel; VAR dest: ARRAY OF BYTE): BOOLEAN; (* Evaluates a guard, including reception management *) PROCEDURE ENDSELECT(): BOOLEAN; (* End of a SELECT structure *) END CSP. DEFINITION MODULE Conversions; (* Module: Numeric-to-string conversions Author: Ceriel J.H. Jacobs Version: $Header: Conversion.def,v 1.2 88/02/19 15:40:34 ceriel Exp $ *) PROCEDURE ConvertOctal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); (* Convert number "num" to right-justified octal representation of "len" positions, and put the result in "str". If the result does not fit in "str", it is truncated on the right. *) PROCEDURE ConvertHex(num, len: CARDINAL; VAR str: ARRAY OF CHAR); (* Convert a hexadecimal number to a string *) PROCEDURE ConvertCardinal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); (* Convert a cardinal number to a string *) PROCEDURE ConvertInteger(num: INTEGER; len: CARDINAL; VAR str: ARRAY OF CHAR); (* Convert an integer number to a string *) END Conversions. (*$Foreign *) DEFINITION MODULE EM; (* Module: Interface to some EM instructions and data Author: Ceriel J.H. Jacobs Version: $Header: EM.def,v 1.3 88/02/19 15:40:54 ceriel Exp $ *) FROM SYSTEM IMPORT ADDRESS; TYPE TrapHandler = PROCEDURE(INTEGER); PROCEDURE FIF(arg1, arg2: LONGREAL; VAR intres: LONGREAL) : LONGREAL; (* multiplies arg1 and arg2, and returns the integer part of the result in "intres" and the fraction part as the function result. *) PROCEDURE FEF(arg: LONGREAL; VAR exp: INTEGER) : LONGREAL; (* splits "arg" in mantissa and a base-2 exponent. The mantissa is returned, and the exponent is left in "exp". *) PROCEDURE TRP(trapno: INTEGER); (* Generate EM trap number "trapno" *) PROCEDURE SIG(t: TrapHandler): TrapHandler; (* install traphandler t; return previous handler *) PROCEDURE FILN(): ADDRESS; (* return current program file-name. This only works if file-name and line-number generation is not disabled during compilation *) PROCEDURE LINO(): INTEGER; (* return current program line-number. This only works if file-name and line-number generation is not disabled during compilation *) END EM. (*$Foreign*) DEFINITION MODULE Epilogue; (* Module: install module termination procedures to be called at program termination Author: Ceriel J.H. Jacobs Version: $Header: Epilogue.def,v 1.4 89/03/22 17:36:04 ceriel Exp $ MODULA-2 offers a facility for the initialization of modules, but there is no mechanism to have some code executed when the program finishes. This module is a feeble attempt at solving this problem. *) PROCEDURE CallAtEnd(p: PROC): BOOLEAN; (* Add procedure "p" to the list of procedures that must be executed when the program finishes. When the program finishes, these procedures are executed in the REVERSE order in which they were added to the list. This procedure returns FALSE when there are too many procedures to be called (the list has a fixed size). *) END Epilogue. DEFINITION MODULE InOut; (* Module: Wirth's Input/Output module From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: InOut.def,v 1.3 88/02/19 15:41:27 ceriel Exp $ *) CONST EOL = 12C; VAR Done : BOOLEAN; termCH : CHAR; PROCEDURE OpenInput(defext: ARRAY OF CHAR); (* Request a file name from the standard input stream and open this file for reading. If the filename ends with a '.', append the "defext" extension. Done := "file was successfully opened". If open, subsequent input is read from this file. *) PROCEDURE OpenOutput(defext : ARRAY OF CHAR); (* Request a file name from the standard input stream and open this file for writing. If the filename ends with a '.', append the "defext" extension. Done := "file was successfully opened". If open, subsequent output is written to this file. Files left open at program termination are automatically closed. *) PROCEDURE OpenInputFile(filename: ARRAY OF CHAR); (* Like OpenInput, but filename given as parameter. This procedure is not in Wirth's InOut. *) PROCEDURE OpenOutputFile(filename: ARRAY OF CHAR); (* Like OpenOutput, but filename given as parameter. This procedure is not in Wirth's InOut. *) PROCEDURE CloseInput; (* Close input file. Subsequent input is read from the standard input stream. *) PROCEDURE CloseOutput; (* Close output file. Subsequent output is written to the standard output stream. *) PROCEDURE Read(VAR ch : CHAR); (* Read a character from the current input stream and leave it in "ch". Done := NOT "end of file". *) PROCEDURE ReadString(VAR s : ARRAY OF CHAR); (* Read a string from the current input stream and leave it in "s". A string is any sequence of characters not containing blanks or control characters; leading blanks are ignored. Input is terminated by any character <= " ". This character is assigned to termCH. DEL or BACKSPACE is used for backspacing when input from terminal. *) PROCEDURE ReadInt(VAR x : INTEGER); (* Read a string and convert it to INTEGER. Syntax: integer = ['+'|'-'] digit {digit}. Leading blanks are ignored. Done := "integer was read". *) PROCEDURE ReadCard(VAR x : CARDINAL); (* Read a string and convert it to CARDINAL. Syntax: cardinal = digit {digit}. Leading blanks are ignored. Done := "cardinal was read". *) PROCEDURE Write(ch : CHAR); (* Write character "ch" to the current output stream. *) PROCEDURE WriteLn; (* Terminate line. *) PROCEDURE WriteString(s : ARRAY OF CHAR); (* Write string "s" to the current output stream *) PROCEDURE WriteInt(x : INTEGER; n : CARDINAL); (* Write integer x with (at least) n characters on the current output stream. If n is greater that the number of digits needed, blanks are added preceding the number. *) PROCEDURE WriteCard(x, n : CARDINAL); (* Write cardinal x with (at least) n characters on the current output stream. If n is greater that the number of digits needed, blanks are added preceding the number. *) PROCEDURE WriteOct(x, n : CARDINAL); (* Write cardinal x as an octal number with (at least) n characters on the current output stream. If n is greater that the number of digits needed, blanks are added preceding the number. *) PROCEDURE WriteHex(x, n : CARDINAL); (* Write cardinal x as a hexadecimal number with (at least) n characters on the current output stream. If n is greater that the number of digits needed, blanks are added preceding the number. *) END InOut. DEFINITION MODULE MathLib0; (* Module: Some mathematical functions From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: MathLib0.def,v 1.3 88/02/19 15:42:34 ceriel Exp $ Exists for compatibility. A more elaborate math lib can be found in Mathlib.def *) PROCEDURE sqrt(x : REAL) : REAL; PROCEDURE exp(x : REAL) : REAL; PROCEDURE ln(x : REAL) : REAL; PROCEDURE sin(x : REAL) : REAL; PROCEDURE cos(x : REAL) : REAL; PROCEDURE arctan(x : REAL) : REAL; PROCEDURE real(x : INTEGER) : REAL; PROCEDURE entier(x : REAL) : INTEGER; END MathLib0. DEFINITION MODULE Mathlib; (* Module: Mathematical functions Author: Ceriel J.H. Jacobs Version: $Header: Mathlib.def,v 1.4 88/07/25 16:41:41 ceriel Exp $ *) (* Some mathematical constants: *) CONST (* From: Computer Approximations Hart, Cheney, e.a. The SIAM Series in Applied Mathematics John Wiley & Sons, INC. New York London Sydney, 1968 *) pi = 3.14159265358979323846264338327950288; twicepi = 6.28318530717958647692528676655900576; halfpi = 1.57079632679489661923132169163975144; quartpi = 0.78539816339744830961566084581987572; e = 2.71828182845904523536028747135266250; ln2 = 0.69314718055994530941723212145817657; ln10 = 2.30258509299404568401799145468436421; longpi = 3.14159265358979323846264338327950288D; longtwicepi = 6.28318530717958647692528676655900576D; longhalfpi = 1.57079632679489661923132169163975144D; longquartpi = 0.78539816339744830961566084581987572D; longe = 2.71828182845904523536028747135266250D; longln2 = 0.69314718055994530941723212145817657D; longln10 = 2.30258509299404568401799145468436421D; (* basic functions *) PROCEDURE pow(x: REAL; i: INTEGER): REAL; PROCEDURE longpow(x: LONGREAL; i: INTEGER): LONGREAL; PROCEDURE sqrt(x: REAL): REAL; PROCEDURE longsqrt(x: LONGREAL): LONGREAL; PROCEDURE exp(x: REAL): REAL; PROCEDURE longexp(x: LONGREAL): LONGREAL; PROCEDURE ln(x: REAL): REAL; (* natural log *) PROCEDURE longln(x: LONGREAL): LONGREAL; (* natural log *) PROCEDURE log(x: REAL): REAL; (* log with base 10 *) PROCEDURE longlog(x: LONGREAL): LONGREAL; (* log with base 10 *) (* trigonometric functions; arguments in radians *) PROCEDURE sin(x: REAL): REAL; PROCEDURE longsin(x: LONGREAL): LONGREAL; PROCEDURE cos(x: REAL): REAL; PROCEDURE longcos(x: LONGREAL): LONGREAL; PROCEDURE tan(x: REAL): REAL; PROCEDURE longtan(x: LONGREAL): LONGREAL; PROCEDURE arcsin(x: REAL): REAL; PROCEDURE longarcsin(x: LONGREAL): LONGREAL; PROCEDURE arccos(x: REAL): REAL; PROCEDURE longarccos(x: LONGREAL): LONGREAL; PROCEDURE arctan(x: REAL): REAL; PROCEDURE longarctan(x: LONGREAL): LONGREAL; (* hyperbolic functions *) PROCEDURE sinh(x: REAL): REAL; PROCEDURE longsinh(x: LONGREAL): LONGREAL; PROCEDURE cosh(x: REAL): REAL; PROCEDURE longcosh(x: LONGREAL): LONGREAL; PROCEDURE tanh(x: REAL): REAL; PROCEDURE longtanh(x: LONGREAL): LONGREAL; PROCEDURE arcsinh(x: REAL): REAL; PROCEDURE longarcsinh(x: LONGREAL): LONGREAL; PROCEDURE arccosh(x: REAL): REAL; PROCEDURE longarccosh(x: LONGREAL): LONGREAL; PROCEDURE arctanh(x: REAL): REAL; PROCEDURE longarctanh(x: LONGREAL): LONGREAL; (* conversions *) PROCEDURE RadianToDegree(x: REAL): REAL; PROCEDURE longRadianToDegree(x: LONGREAL): LONGREAL; PROCEDURE DegreeToRadian(x: REAL): REAL; PROCEDURE longDegreeToRadian(x: LONGREAL): LONGREAL; END Mathlib. DEFINITION MODULE PascalIO; (* Module: Pascal-like Input/Output Author: Ceriel J.H. Jacobs Version: $Header: PascalIO.def,v 1.8 89/06/20 11:21:59 ceriel Exp $ This module provides for I/O that is essentially equivalent to the I/O provided by Pascal with "text", or "file of char". Output buffers are automatically flushed at program termination. The CloseOutput routine is just there for compatibility with earlier versions of this module. *) CONST Eos = 0C; (* End of string character *) TYPE Text; VAR Input, Output: Text; (* standard input and standard output available immediately. Standard output is not buffered when connected to a terminal. *) VAR Notext: Text; (* Initialize your Text variables with this *) PROCEDURE Reset(VAR InputText: Text; Filename: ARRAY OF CHAR); (* When InputText indicates an open textfile, it is first flushed and closed. Then, the file indicated by "Filename" is opened for reading. If this fails, a runtime error results. Otherwise, InputText is associated with the new input file. *) PROCEDURE Rewrite(VAR OutputText: Text; Filename: ARRAY OF CHAR); (* When OutputText indicates an open textfile, it is first flushed and closed. Then, the file indicated by "Filename" is opened for writing. If this fails, a runtime error results. Otherwise, OutputText is associated with the new output file. *) PROCEDURE CloseOutput(); (* To be called at the end of the program, to flush all output buffers. *) (*************************************************************************** Input routines; All these routines result in a runtime error when not called with either "Input", or a "Text" value obtained by Reset. Also, the routines that actually advance the "read pointer", result in a runtime error when end of file is reached prematurely. ****************************************************************************) PROCEDURE NextChar(InputText: Text): CHAR; (* Returns the next character from the InputText, 0C on end of file. Does not advance the "read pointer", so behaves much like "input^" in Pascal. However, unlike Pascal, if Eoln(InputText) is TRUE, it returns the newline character, rather than a space. *) PROCEDURE Get(InputText: Text); (* Advances the "read pointer" by one character. *) PROCEDURE Eoln(InputText: Text): BOOLEAN; (* Returns TRUE if the next character from the InputText is a linefeed. Unlike Pascal however, it does not produce a runtime error when called when Eof(InputText) is TRUE. *) PROCEDURE Eof(InputText: Text): BOOLEAN; (* Returns TRUE if the end of the InputText is reached. *) PROCEDURE ReadChar(InputText: Text; VAR Char: CHAR); (* Read a character from the InputText, and leave the result in "Char". Unlike Pascal, if Eoln(InputText) is TRUE, the newline character is put in "Char". *) PROCEDURE ReadLn(InputText: Text); (* Skip the rest of the current line from the InputText, including the linefeed. *) PROCEDURE ReadInteger(InputText: Text; VAR Integer: INTEGER); (* Skip leading blanks, read an optionally signed integer from the InputText, and leave the result in "Integer". If no integer is read, or when overflow occurs, a runtime error results. Input stops at the character following the integer. *) PROCEDURE ReadCardinal(InputText: Text; VAR Cardinal: CARDINAL); (* Skip leading blanks, read a cardinal from the InputText, and leave the result in "Cardinal". If no cardinal is read, or when overflow occurs, a runtime error results. Input stops at the character following the cardinal. *) PROCEDURE ReadReal(InputText: Text; VAR Real: REAL); (* Skip leading blanks, read a real from the InputText, and leave the result in "Real". Syntax: real --> [(+|-)] digit {digit} [. digit {digit}] [ E [(+|-)] digit {digit} ] If no real is read, or when overflow/underflow occurs, a runtime error results. Input stops at the character following the real. *) PROCEDURE ReadLongReal(InputText: Text; VAR Real: LONGREAL); (* Like ReadReal, but for LONGREAL *) (*************************************************************************** Output routines; All these routines result in a runtime error when not called with either "Output", or a "Text" value obtained by Rewrite. ****************************************************************************) PROCEDURE WriteChar(OutputText: Text; Char: CHAR); (* Writes the character "Char" to the OutputText. *) PROCEDURE WriteLn(OutputText: Text); (* Writes a linefeed to the OutputText. *) PROCEDURE Page(OutputText: Text); (* Writes a form-feed to the OutputText *) PROCEDURE WriteInteger(OutputText: Text; Integer: INTEGER; Width: CARDINAL); (* Write integer "Integer" to the OutputText, using at least "Width" places, blank-padding to the left if needed. *) PROCEDURE WriteCardinal(OutputText: Text; Cardinal, Width: CARDINAL); (* Write cardinal "Cardinal" to the OutputText, using at least "Width" places, blank-padding to the left if needed. *) PROCEDURE WriteBoolean(OutputText: Text; Boolean: BOOLEAN; Width: CARDINAL); (* Write boolean "Boolean" to the OutputText, using at least "Width" places, blank-padding to the left if needed. Equivalent to WriteString(OutputText, " TRUE", Width), or WriteString(OutputText, "FALSE", Width). *) PROCEDURE WriteString(OutputText: Text; String: ARRAY OF CHAR; Width: CARDINAL); (* Write string "String" to the OutputText, using at least "Width" places, blank-padding to the left if needed. The string is terminated either by the character Eos, or by the upperbound of the array "String". *) PROCEDURE WriteReal(OutputText: Text; Real: REAL; Width, Nfrac: CARDINAL); (* Write real "Real" to the OutputText. If "Nfrac" = 0, use scientific notation, otherwise use fixed-point notation with "Nfrac" digits behind the dot. Always use at least "Width" places, blank-padding to the left if needed. *) PROCEDURE WriteLongReal(OutputText: Text; Real: LONGREAL; Width, Nfrac: CARDINAL); (* Like WriteReal, but for LONGREAL *) END PascalIO. DEFINITION MODULE Processes; (* Module: Processes From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: Processes.def,v 1.3 88/04/26 13:04:04 ceriel Exp $ *) (* As discussed in "Unfair Process Scheduling in Modula-2", by D. Hemmendinger, SIGplan Notices Volume 23 nr 3, march 1988, the scheduler in this module is unfair, in that in some circumstances ready-to-run processes never get a turn. *) TYPE SIGNAL; PROCEDURE StartProcess(P: PROC; n: CARDINAL); (* Start a concurrent process with program "P" and workspace of size "n" *) PROCEDURE SEND(VAR s: SIGNAL); (* One process waiting for "s" is resumed *) PROCEDURE WAIT(VAR s: SIGNAL); (* Wait for some other process to send "s" *) PROCEDURE Awaited(s: SIGNAL): BOOLEAN; (* Return TRUE if at least one process is waiting for sinal "s". *) PROCEDURE Init(VAR s: SIGNAL); (* Compulsory initialization *) END Processes. DEFINITION MODULE RealConversions; (* Module: string-to-real and real-to-string conversions Author: Ceriel J.H. Jacobs Version: $Header: RealConver.def,v 1.5 89/03/08 17:27:47 ceriel Exp $ *) PROCEDURE StringToReal(str: ARRAY OF CHAR; VAR r: REAL; VAR ok: BOOLEAN); (* Convert string "str" to a real number "r" according to the syntax: ['+'|'-'] digit {digit} ['.' digit {digit}] ['E' ['+'|'-'] digit {digit}] ok := "conversion succeeded" Leading blanks are skipped; Input terminates with a blank or any control character. *) PROCEDURE StringToLongReal(str: ARRAY OF CHAR; VAR r: LONGREAL; VAR ok: BOOLEAN); PROCEDURE RealToString(r: REAL; width, digits: INTEGER; VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN); (* Convert real number "r" to string "str", either in fixed-point or exponent notation. "digits" is the number digits to the right of the decimal point, "width" is the maximum width of the notation. If digits < 0, exponent notation is used, otherwise fixed-point. If fewer than "width" characters are needed, leading blanks are inserted. If the representation does not fit in "width", then ok is set to FALSE. *) PROCEDURE LongRealToString(r: LONGREAL; width, digits: INTEGER; VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN); END RealConversions. DEFINITION MODULE RealInOut; (* Module: InOut for REAL numbers From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: RealInOut.def,v 1.5 89/06/20 11:23:34 ceriel Exp $ *) VAR Done: BOOLEAN; PROCEDURE ReadReal(VAR x: REAL); (* Read a real number "x" according to the syntax: ['+'|'-'] digit {digit} ['.' digit {digit}] [('E'|'e') ['+'|'-'] digit {digit}] Done := "a number was read". Input terminates with a blank or any control character. When reading from a terminal, backspacing may be done by either DEL or BACKSPACE, depending on the implementation of ReadString. *) PROCEDURE ReadLongReal(VAR x: LONGREAL); (* Like ReadReal, but for LONGREAL *) PROCEDURE WriteReal(x: REAL; n: CARDINAL); (* Write x using n characters. If fewer than n characters are needed, leading blanks are inserted. *) PROCEDURE WriteLongReal(x: LONGREAL; n: CARDINAL); (* Like WriteReal, but for LONGREAL *) PROCEDURE WriteFixPt(x: REAL; n, k: CARDINAL); (* Write x in fixed-point notation usign n characters with k digits after the decimal point. If fewer than n characters are needed, leading blanks are inserted. *) PROCEDURE WriteLongFixPt(x: LONGREAL; n, k: CARDINAL); (* Like WriteFixPt, but for LONGREAL *) PROCEDURE WriteRealOct(x: REAL); (* Write x in octal words. *) PROCEDURE WriteLongRealOct(x: LONGREAL); (* Like WriteRealOct, but for LONGREAL *) END RealInOut. DEFINITION MODULE Semaphores; (* Module: Processes with semaphores Author: Ceriel J.H. Jacobs Version: $Header: Semaphores.def,v 1.2 88/02/19 15:45:53 ceriel Exp $ On systems using quasi-concurrency, the only opportunities for process- switches are calls to Down and Up. *) TYPE Sema; PROCEDURE Level(s: Sema) : CARDINAL; (* Returns current value of semaphore s *) PROCEDURE NewSema(n: CARDINAL) : Sema; (* Creates a new semaphore with initial level "n" *) PROCEDURE Down(VAR s: Sema); (* If the value of "s" is > 0, then just decrement "s". Else, suspend the current process until the semaphore becomes positive again. *) PROCEDURE Up(VAR s: Sema); (* Increment the semaphore "s". *) PROCEDURE StartProcess(P: PROC; n: CARDINAL); (* Create a new process with procedure P and workspace of size "n". Also transfer control to it. *) END Semaphores. DEFINITION MODULE Storage; (* Module: Dynamic storage allocation From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: Storage.def,v 1.4 88/06/07 12:34:04 ceriel Exp $ *) (* Wirth's 3rd edition certainly is confusing: mostly it uses Allocate, but the module at the end of the book defines ALLOCATE. To avoid problems, I included them both. *) FROM SYSTEM IMPORT ADDRESS; PROCEDURE ALLOCATE(VAR a : ADDRESS; size : CARDINAL); (* Allocate an area of the given size and return the address in "a". If no space is available, the calling program is killed. *) PROCEDURE Allocate(VAR a : ADDRESS; size : CARDINAL); (* Identical to ALLOCATE *) PROCEDURE DEALLOCATE(VAR a : ADDRESS; size : CARDINAL); (* Free the area at address "a" with the given size. The area must have been allocated by "ALLOCATE", with the same size. *) PROCEDURE Deallocate(VAR a : ADDRESS; size : CARDINAL); (* Identical to DEALLOCATE *) PROCEDURE Available(size : CARDINAL) : BOOLEAN; (* Return TRUE if a contiguous area with the given size could be allocated. Notice that this only indicates if an ALLOCATE of this size would succeed, and that it gives no indication of the total available memory. *) END Storage. DEFINITION MODULE Streams; (* Module: Stream Input/Output Author: Ceriel J.H. Jacobs Version: $Header: Streams.def,v 1.3 89/03/20 12:46:00 ceriel Exp $ * This module provides sequential IO through streams. * A stream is either a text stream or a binary stream, and is either in * reading, writing or appending mode. * By default, there are three open text streams, connected to standard input, * standard output, and standard error respectively. * These are text streams. * When connected to a terminal, the standard output and standard error * streams are linebuffered. * The user can create more streams with the OpenStream call, and * delete streams with the CloseStream call. * Streams are automatically closed at program termination. *) FROM SYSTEM IMPORT BYTE; TYPE StreamKind = (text, binary, none); StreamMode = (reading, writing, appending); StreamResult = (succeeded, illegaloperation, nomemory, openfailed, nostream, endoffile); StreamBuffering = (unbuffered, linebuffered, blockbuffered); TYPE Stream; VAR InputStream, OutputStream, ErrorStream: Stream; PROCEDURE OpenStream(VAR stream: Stream; filename: ARRAY OF CHAR; kind: StreamKind; mode: StreamMode; VAR result: StreamResult); (* Associates a stream with the file named filename. If kind = none, result is set to illegaloperation. mode has one of the follwing values: reading: the file is opened for reading writing: the file is truncated or created for writing appending: the file is opened for writing at end of file, or created for writing. On failure, result is set to openfailed. On success, result is set to succeeded. *) PROCEDURE SetStreamBuffering( stream: Stream; b: StreamBuffering; VAR result: StreamResult); (* This procedure is only allowed for output streams. The three types of buffering available are unbuffered, linebuffered, and blockbuffered. When an output stream is unbuffered, the output appears as soon as written; when it is blockbuffered, output is saved up and written as a block; When it is linebufferded (only possible for text output streams), output is saved up until a newline is encountered or input is read from standard input. *) PROCEDURE CloseStream(VAR stream: Stream; VAR result: StreamResult); (* Closes the stream. result is set to nostream if "stream" was not associated with a stream. *) PROCEDURE FlushStream(stream: Stream; VAR result: StreamResult); (* Flushes the stream. result is set to nostream if "stream" was not associated with a stream. It is set to illegaloperation if "stream" is not an output or appending stream. *) PROCEDURE EndOfStream(stream: Stream; VAR result: StreamResult): BOOLEAN; (* Returns true if the stream is an input stream, and the end of the file has been reached. result is set to nostream if "stream" was not associated with a stream. It is set to illegaloperation if the stream is not an input stream. *) PROCEDURE Read(stream: Stream; VAR ch: CHAR; VAR result: StreamResult); (* reads a character from the stream. Certain character translations may occur, such as the mapping of the end-of-line sequence to the character 12C. result is set to nostream if "stream" was not associated with a stream. It is set to endoffile if EndOfStream would have returned TRUE before the call to Read. In this case, "ch" is set to 0C. It is set to illegaloperation if the stream is not a text input stream. *) PROCEDURE ReadByte(stream: Stream; VAR byte: BYTE; VAR result: StreamResult); (* reads a byte from the stream. No character translations occur. result is set to nostream if "stream" was not associated with a stream. It is set to endoffile if EndOfStream would have returned TRUE before the call to ReadByte. In this case, "byte" is set to 0C. It is set to illegaloperation if the stream is not a binary input stream. *) PROCEDURE ReadBytes(stream: Stream; VAR bytes: ARRAY OF BYTE; VAR result: StreamResult); (* reads bytes from the stream. No character translations occur. The number of bytes is determined by the size of the parameter. result is set to nostream if "stream" was not associated with a stream. It is set to endoffile if there are not enough bytes left on the stream. In this case, the rest of the bytes are set to 0C. It is set to illegaloperation if the stream is not a binary input stream. *) PROCEDURE Write(stream: Stream; ch: CHAR; VAR result: StreamResult); (* writes a character to the stream. Certain character translations may occur, such as the mapping of a line-feed or carriage return (12C or 15C) to the end-of-line sequence of the system. result is set to nostream if "stream" was not associated with a stream. It is set to illegaloperation if the stream is not a text output stream. *) PROCEDURE WriteByte(stream: Stream; byte: BYTE; VAR result: StreamResult); (* writes a byte to the stream. No character translations occur. result is set to nostream if "stream" was not associated with a stream. It is set to illegaloperation if the stream is not a binary output stream. *) PROCEDURE WriteBytes(stream: Stream; bytes: ARRAY OF BYTE; VAR result: StreamResult); (* writes bytes to the stream. No character translations occur. The number of bytes written is equal to the size of the parameter. result is set to nostream if "stream" was not associated with a stream. It is set to illegaloperation if the stream is not a binary output stream. *) PROCEDURE GetPosition(stream: Stream; VAR position: LONGINT; VAR result: StreamResult); (* gives the actual read/write position in "position". "result" is set to illegaloperation if "stream" is not a stream. *) PROCEDURE SetPosition(stream: Stream; position: LONGINT; VAR result: StreamResult); (* sets the actual read/write position to "position". "result" is set to nostream if "stream" is not a stream. It is set to illegaloperation if the stream was opened for appending and the position is in front of the current position, or it failed for some other reason (f.i. when the stream is connected to a terminal). *) PROCEDURE isatty(stream: Stream; VAR result: StreamResult): BOOLEAN; (* return TRUE if the stream is connected to a terminal. "result" is set to nostream if "stream" is not a stream, and set to illegaloperation if the operation failed for some other reason. *) END Streams. DEFINITION MODULE Strings; (* Module: String manipulations Author: Ceriel J.H. Jacobs Version: $Header: Strings.def,v 1.2 88/02/19 15:47:51 ceriel Exp $ *) (* Note: truncation of strings may occur if the user does not provide large enough variables to contain the result of the operation. *) (* Strings are of type ARRAY OF CHAR, and their length is the size of the array, unless a 0-byte occurs in the string to indicate the end of the string. *) PROCEDURE Assign(source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR); (* Assign string source to dest *) PROCEDURE Insert(substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR; inx: CARDINAL); (* Insert the string substr into str, starting at str[inx]. If inx is equal to or greater than Length(str) then substr is appended to the end of str. *) PROCEDURE Delete(VAR str: ARRAY OF CHAR; inx, len: CARDINAL); (* Delete len characters from str, starting at str[inx]. If inx >= Length(str) then nothing happens. If there are not len characters to delete, characters to the end of the string are deleted. *) PROCEDURE Pos(substr, str: ARRAY OF CHAR): CARDINAL; (* Return the index into str of the first occurrence of substr. Pos returns a value greater than HIGH(str) of no occurrence is found. *) PROCEDURE Copy(str: ARRAY OF CHAR; inx, len: CARDINAL; VAR result: ARRAY OF CHAR); (* Copy at most len characters from str into result, starting at str[inx]. *) PROCEDURE Concat(s1, s2: ARRAY OF CHAR; VAR result: ARRAY OF CHAR); (* Concatenate two strings. *) PROCEDURE Length(str: ARRAY OF CHAR): CARDINAL; (* Return number of characters in str. *) PROCEDURE CompareStr(s1, s2: ARRAY OF CHAR): INTEGER; (* Compare two strings, return -1 if s1 < s2, 0 if s1 = s2, and 1 if s1 > s2. *) END Strings. (*$Foreign language module *) DEFINITION MODULE StripUnix; (* Module: interface to some Unix systemcalls Author: Ceriel J.H. Jacobs Version: $Header: StripUnix.def,v 1.1 88/05/03 08:33:18 ceriel Exp $ This is a stripped down version of Unix.def, needed to compile some of the modules on small machines *) FROM SYSTEM IMPORT ADDRESS; CONST ILLBREAK = ADDRESS(NIL-1); VAR errno: INTEGER; PROCEDURE sbrk(incr: INTEGER) : ADDRESS; PROCEDURE close(fildes: INTEGER) : INTEGER; PROCEDURE creat(path: ADDRESS; mode: INTEGER) : INTEGER; (* Sys5 *) PROCEDURE fcntl(fildes, request, arg: INTEGER) : INTEGER; PROCEDURE getpid() : INTEGER; PROCEDURE ioctl(fildes, request: INTEGER; arg: ADDRESS) : INTEGER; PROCEDURE isatty(fildes: INTEGER) : BOOLEAN; PROCEDURE lseek(fildes: INTEGER; offset: LONGINT; whence: INTEGER) : LONGINT; PROCEDURE open(path: ADDRESS; oflag: INTEGER) : INTEGER; PROCEDURE read(fildes: INTEGER; buf: ADDRESS; nbyte: CARDINAL) : INTEGER; PROCEDURE time(tloc: ADDRESS) : LONGINT; PROCEDURE write(fildes: INTEGER; buf: ADDRESS; nbyte: CARDINAL) : INTEGER; END StripUnix. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (* Module: Interface to termcap database From: Unix manual chapter 3 Version: $Header: Termcap.def,v 1.3 88/11/25 13:49:07 ceriel Exp $ *) (* Use this like the C-version. In this Modula-2 version, some of the buffers, that are explicit in the C-version, are hidden. These buffers are initialized by a call to Tgetent. The "ARRAY OF CHAR" parameters must be null-terminated. You can call them with a constant string argument, as these are always null-terminated in our Modula-2 implementation. Unlike the C version, this version takes care of UP, BC, PC, and ospeed automatically. If Tgetent is not called by the user, it is called by the module itself, using the TERM environment variable, or "dumb" if TERM does not exist. *) DEFINITION MODULE Termcap; TYPE STRCAP; PUTPROC = PROCEDURE(CHAR); PROCEDURE Tgetent(name: ARRAY OF CHAR) : INTEGER; PROCEDURE Tgetnum(id: ARRAY OF CHAR): INTEGER; PROCEDURE Tgetflag(id: ARRAY OF CHAR): BOOLEAN; PROCEDURE Tgoto(cm: STRCAP; col, line: INTEGER): STRCAP; (* Result exists until next call to Tgoto *) PROCEDURE Tgetstr(id: ARRAY OF CHAR; VAR res: STRCAP) : BOOLEAN; (* Returns FALSE if capability does not exist; Result exists until next call to Tgetent. *) PROCEDURE Tputs(cp: STRCAP; affcnt: INTEGER; p: PUTPROC); END Termcap. DEFINITION MODULE Terminal; (* Module: Input/Output to/from terminals From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: Terminal.def,v 1.2 88/02/19 15:48:23 ceriel Exp $ *) PROCEDURE Read(VAR ch : CHAR); (* Read a character from the terminal and leave it in ch *) PROCEDURE BusyRead(VAR ch : CHAR); (* Read a character from the terminal and leave it in ch. This is a non-blocking call. It returns 0C in ch if no character was typed. *) PROCEDURE ReadAgain; (* Causes the last character read to be returned again upon the next call of Read. *) PROCEDURE Write(ch : CHAR); (* Write character ch to the terminal. *) PROCEDURE WriteLn; (* Terminate line. *) PROCEDURE WriteString(s : ARRAY OF CHAR); (* Write string s to the terminal. *) END Terminal. DEFINITION MODULE Traps; (* Module: Facility for handling traps Author: Ceriel J.H. Jacobs Version: $Header: Traps.def,v 1.8 88/04/29 14:37:44 ceriel Exp $ *) IMPORT EM; CONST ERRTOOLARGE = 64; (* stack size of process too large *) ERRTOOMANY = 65; (* too many nested traps + handlers *) ERRNORESULT = 66; (* no RETURN from function procedure *) ERRCARDOVFL = 67; (* CARDINAL overflow *) ERRFORLOOP = 68; (* value of FOR-loop control variable changed in loop *) ERRCARDUVFL = 69; (* CARDINAL underflow *) ERRINTERNAL = 70; (* Internal error; should not happen *) ERRUNIXSIG = 71; (* received unix signal *) TYPE TrapHandler = EM.TrapHandler; PROCEDURE InstallTrapHandler(t: TrapHandler): TrapHandler; (* Install a new trap handler, and return the previous one. Parameter of trap handler is the trap number. When a trap occurs, the default trap handler is re-installed before calling the new handler. *) PROCEDURE Message(str: ARRAY OF CHAR); (* Write message "str" on standard error, preceeded by filename and linenumber if possible *) PROCEDURE Trap(n: INTEGER); (* cause trap number "n" to occur *) END Traps. (*$Foreign language module *) DEFINITION MODULE Unix; (* Module: interface to some Unix systemcalls Author: Ceriel J.H. Jacobs Version: $Header: Unix.def,v 1.6 93/11/17 16:27:39 ceriel Exp $ *) FROM SYSTEM IMPORT WORD, ADDRESS; (* Type needed for Signal *) TYPE SignalPrc = PROCEDURE(INTEGER); CONST SIGDFL = SignalPrc(NIL); SIGIGN = SignalPrc(NIL+1); ILLBREAK = ADDRESS(NIL-1); VAR errno: INTEGER; (* Possible values of errno: *) CONST EPERM = 1; (* Not owner *) ENOENT = 2; (* No such file or directory *) ESRCH = 3; (* No such process *) EINTR = 4; (* Interrupted system call *) EIO = 5; (* I/O error *) ENXIO = 6; (* No such device or address *) E2BIG = 7; (* Arg list too long *) ENOEXEC = 8; (* Exec format error *) EBADF = 9; (* Bad file number *) ECHILD = 10; (* No child processes *) EAGAIN = 11; (* No more processes *) ENOMEM = 12; (* Not enough space *) EACCES = 13; (* Permission denied *) EFAULT = 14; (* Bad address *) ENOTBLK = 15; (* Block device required *) EBUSY = 16; (* Mount device busy *) EEXIST = 17; (* File exists *) EXDEV = 18; (* Cross-device link *) ENODEV = 19; (* No such device *) ENOTDIR = 20; (* Not a directory *) EISDIR = 21; (* Is a directory *) EINVAL = 22; (* Invalid argument *) ENFILE = 23; (* File table overflow *) EMFILE = 24; (* Too many open files *) ENOTTY = 25; (* Not a typewriter *) ETXTBSY = 26; (* Text file busy *) EFBIG = 27; (* File too large *) ENOSPC = 28; (* No space left on device *) ESPIPE = 29; (* Illegal seek *) EROFS = 30; (* Read-only file system *) EMLINK = 31; (* Too many links *) EPIPE = 32; (* Broken pipe *) EDOM = 33; (* Math argument *) ERANGE = 34; (* Result too large *) PROCEDURE access(path: ADDRESS; amode : INTEGER) : INTEGER; PROCEDURE acct(path: ADDRESS) : INTEGER; PROCEDURE alarm(sec: CARDINAL) : CARDINAL; PROCEDURE brk(endds: ADDRESS) : INTEGER; PROCEDURE sbrk(incr: INTEGER) : ADDRESS; PROCEDURE chdir(path: ADDRESS) : INTEGER; PROCEDURE chmod(path: ADDRESS; mode: INTEGER) : INTEGER; PROCEDURE chown(path: ADDRESS; owner, group: INTEGER) : INTEGER; PROCEDURE chroot(path: ADDRESS) : INTEGER; PROCEDURE close(fildes: INTEGER) : INTEGER; PROCEDURE creat(path: ADDRESS; mode: INTEGER) : INTEGER; PROCEDURE dup(fildes: INTEGER) : INTEGER; PROCEDURE execve(path: ADDRESS; argv: ADDRESS; envp: ADDRESS) : INTEGER; PROCEDURE exit(status: INTEGER); (* Sys5 *) PROCEDURE fcntl(fildes, request, arg: INTEGER) : INTEGER; PROCEDURE ftime(bufp:ADDRESS) : INTEGER; PROCEDURE fork() : INTEGER; PROCEDURE getpid() : INTEGER; PROCEDURE getppid() : INTEGER; PROCEDURE getuid() : INTEGER; PROCEDURE geteuid() : INTEGER; PROCEDURE getgid() : INTEGER; PROCEDURE getegid() : INTEGER; PROCEDURE ioctl(fildes, request: INTEGER; arg: ADDRESS) : INTEGER; PROCEDURE isatty(fildes: INTEGER) : BOOLEAN; PROCEDURE stty(fildes: INTEGER; buf: ADDRESS) : INTEGER; PROCEDURE gtty(fildes: INTEGER; buf: ADDRESS) : INTEGER; PROCEDURE kill(pid, sig: INTEGER) : INTEGER; PROCEDURE link(path1, path2: ADDRESS) : INTEGER; PROCEDURE lseek(fildes: INTEGER; offset: LONGINT; whence: INTEGER) : LONGINT; PROCEDURE mknod(path: ADDRESS; mode, dev: INTEGER) : INTEGER; PROCEDURE mount(spec, dir: ADDRESS; rwflag: INTEGER) : INTEGER; PROCEDURE nice(incr: INTEGER) : INTEGER; PROCEDURE open(path: ADDRESS; oflag: INTEGER) : INTEGER; PROCEDURE pause(); PROCEDURE pipe(fildes: ADDRESS) : INTEGER; PROCEDURE profil(buff: ADDRESS; bufsiz, offset, scale: INTEGER); PROCEDURE ptrace(request, pid, addr, data: WORD) : INTEGER; PROCEDURE read(fildes: INTEGER; buf: ADDRESS; nbyte: CARDINAL) : INTEGER; PROCEDURE setuid(uid: INTEGER) : INTEGER; PROCEDURE setgid(gid: INTEGER) : INTEGER; PROCEDURE signal(sig: INTEGER; func: SignalPrc) : SignalPrc; PROCEDURE sigtrp(trapno, signo: INTEGER) : INTEGER; (* Let Unix signal signo cause EM trap trapno to occur *) PROCEDURE stat(path: ADDRESS; statbuf: ADDRESS) : INTEGER; PROCEDURE fstat(fildes: INTEGER; statbuf: ADDRESS) : INTEGER; PROCEDURE stime(t: LONGINT) : INTEGER; PROCEDURE sync(); PROCEDURE time(tloc: ADDRESS) : LONGINT; PROCEDURE times(buffer: ADDRESS) : LONGINT; PROCEDURE umask(cmask: INTEGER) : INTEGER; PROCEDURE umount(spec: ADDRESS) : INTEGER; PROCEDURE unlink(path: ADDRESS) : INTEGER; PROCEDURE utime(path: ADDRESS; times: ADDRESS) : INTEGER; PROCEDURE wait(VAR statloc: INTEGER): INTEGER; PROCEDURE write(fildes: INTEGER; buf: ADDRESS; nbyte: CARDINAL) : INTEGER; END Unix. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (* Module: Interface to termcap database From: Unix manual chapter 3 Version: $Header: XXTermcap.def,v 1.1 88/11/23 10:58:32 ceriel Exp $ *) (*$Foreign*) DEFINITION MODULE XXTermcap; (* See the Unix termcap manual to see what this does. Interfaces directly to C routines. Not pretty. Use Termcap.def instead for a nicer interface. *) FROM SYSTEM IMPORT ADDRESS; TYPE PUTPROC = PROCEDURE(CHAR); VAR PC: CHAR; UP, BC: ADDRESS; ospeed: INTEGER[0..32767]; PROCEDURE tgetent(bp, name: ADDRESS): INTEGER; (* name must be null-terminated *) PROCEDURE tgetnum(id: ADDRESS): INTEGER; (* id must be null-terminated *) PROCEDURE tgetflag(id: ADDRESS): INTEGER; (* id must be null-terminated *) PROCEDURE tgetstr(id: ADDRESS; area: ADDRESS): ADDRESS; (* id must be null-terminated *) PROCEDURE tgoto(cm: ADDRESS; col, line: INTEGER) : ADDRESS; (* cm must be null-terminated *) PROCEDURE tputs(cp: ADDRESS; affcnt: INTEGER; p: PUTPROC); (* cp must be null-terminated *) END XXTermcap. DEFINITION MODULE random; (* Module: random numbers Author: Ceriel J.H. Jacobs Version: $Header: random.def,v 1.2 88/02/19 15:51:59 ceriel Exp $ *) PROCEDURE Random(): CARDINAL; (* Return a random CARDINAL *) PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL; (* Return CARDINALs, uniformly distributed between "lwb" and "upb". "lwb" must be smaller than "upb", or "lwb" is returned. *) PROCEDURE StartSeed(seed: CARDINAL); (* Initialize the generator. You don't have to call this procedure, unless you don't want the system to pick a starting value for itself. *) END random. \(en Display next page \(en Display next line CTRL-B \(en Go backward half a screenful CTRL-D \(en Go forward half a screenful CTRL-L \(en Redisplay the screen # \(en Go forward # lines = \(en Print current line number . \(en Repeat previous command ' \(en (single quote) Go back to start of last search ! \(en Escape to a shell #/ \(en Go to #-th occurrence of :f \(en Display current file name and line number #:n \(en Skip forward # files #:p \(en Skip backward # files b \(en Go backward half a screenful d \(en Go forward half a screenful #f \(en Skip # screenfuls h \(en Display \fI/usr/lib/more.help\fR #n \(en Go to #-th occurence of last q \(en Quit \fImore\fR Q \(en Quit \fImore\fR #s \(en Skip # lines v \(en Try to execute \fI/usr/bin/vi\fR #z \(en Go forward # lines and set screen size to # ? 6 * * * /usr/etc/daily cron ~...binincludelibmansrc.~...~...~...~...~.....macros.9man1man2man3 man4man5)man6,man72man8cman9mtemplate.1nwhatis...... cron.pid...atlockslpdcrontabs...past................ashrc.ellepro.b1.ellepro.e.exrc.profileoLICENSEpMakefileqbootcommandscrclistetcfsinetkernel;libmm test<tmp=tools# Ash initialization. test -z "$EDITOR" && { # Don't repeat in subshells. umask 022 # Favourite editor and pager, search path for binaries, etc. export EDITOR=vi export PAGER=more export PATH=/usr/local/bin:/bin:/usr/bin } # End of no-repeat. # Let cd display the current directory on the status line. if [ "$-" : '.*i.*' -a -t 0 -a -f /usr/bin/tget ] && tget -flag hs then hostname=$(expr $(uname -n) : '\([^.]*\)') eval "cd() { chdir \"\$@\" && echo -n '$(tget -str ts \ "$USER@$hostname:'\"\`pwd\`\"'" \ -str fs)' }" unset hostname cd . fi ,!, &SN %t  DrT<@\i[#V0_1_2_3_4_5_6_7_8_9_AkB2CEfF "Insert Self") (keybind ? "Insert Self") (keybind @ "Insert Self") (keybind [ "Insert Self") (keybind ] "Insert Self") (keybind ^ "Insert Self") (keybind # "Insert Self") (keybind $ "Insert Self") (keybind % "Insert Self") (keybind & "Insert Self") (keybind ' "Insert Self") (keybind * "Insert Self") (keybind + "Insert Self") (keybind , "Insert Self") (keybind - "Insert Self") (keybind . "Insert Self") (keybind ! "Insert Self") (keybind " " "Insert Self") (keybind """" "Insert Self") (keybind "(" "Insert Self") (keybind ")" "Insert Self") (keybind ";" "Insert Self") (keybind "\" "Insert Self") (keybind _ "Insert Self") (keybind ` "Insert Self") (keybind { "Insert Self") (keybind | "Insert Self") (keybind } "Insert Self") (keybind ~ "Insert Self") ; CTRL char (keybind ^A "Beginning of Line") (keybind ^B "Backward Word") (keybind ^C "Copy Region") (keybind ^D "Scroll Window Up") (keybind ^E "New Window") (keybind ^F "Forward Word") (keybind ^H "Backward Delete Character") (keybind ^I "Insert Self") ; open (keybind ^K "Kill Region") (keybind ^L "Replace in Line") (keybind ^M "CRLF") (keybind ^N "Kill Word") (keybind ^O "Open Line") (keybind ^P "Backward Kill Word") (keybind ^Q "Write Last Kill") (keybind ^R "Replace String") (keybind ^S "Push to Inferior") (keybind ^T "Kill Line") (keybind ^U "Scroll Window Down") (keybind ^V "Find File") (keybind ^W "Save File") (keybind ^X "Prefix Extend") (keybind ^Y "Un-kill") (keybind ^Z "End of Line") (keybind "^\" "Quoted Insert") (keybind ^_ "Move to Window Bottom") (keybind ^^ "Set/Pop Mark") (keybind ^] "Goto Line") ; ESC char (keybind ^[ "Prefix Meta") (keybind M-0 "Argument Digit") (keybind M-1 "Argument Digit") (keybind M-2 "Argument Digit") (keybind M-3 "Argument Digit") (keybind M-4 "Argument Digit") (keybind M-5 "Argument Digit") (keybind M-6 "Argument Digit") (keybind M-7 "Argument Digit") (keybind M-8 "Argument Digit") (keybind M-9 "Argument Digit") (keybind M-A "Append Next Kill") (keybind M-B "Select Buffer") (keybind M-C "Uppercase Word") (keybind M-E "Execute Kbd Macro") (keybind M-F "Find File") (keybind M-G "Insert File") (keybind M-H "Describe") (keybind M-I "Uppercase Initial") (keybind M-K "Kill Buffer") (keybind M-L "Lowercase Region") (keybind M-M "Mark Paragraph") (keybind M-N "Buffer Not Modified") (keybind M-O "Lowercase Word") (keybind M-P "Forward Paragraph") (keybind M-Q "Query Replace") (keybind M-R "Set Profile") (keybind M-S "Select Existing Buffer") (keybind M-T "Transpose Characters") (keybind M-U "Uppercase Region") (keybind M-W "Transpose Words") (keybind M-X "Return to Superior") (keybind M-Y "Un-kill Pop") (keybind M-Z "Incremental Search") (keybind M-^ "Exchange Point and Mark") (keybind M-* "View Kbd Macro") (keybind M-[ "Prefix Extend") (keybind M-] "Backward Paragraph") (keybind M-= "Delete Horizontal Space") (keybind M-| "Delete Blank Lines") (keybind "M-," "Move to Window Top") (keybind "M-;" "Indent for Comment") (keybind "M-." "Indent Relative") (keybind "M-/" "Start Kbd Macro") (keybind "M-\" "End Kbd Macro") ; CTRL-X char (keybind X-1 "One Window") (keybind X-2 "Two Windows") (keybind X-A "Up Real Line") (keybind X-B "Down Real Line") (keybind X-C "Forward Character") (keybind X-D "Backward Character") (keybind X-G "List Buffers") (keybind X-H "Goto Beginning") (keybind X-L "Grow Window") (keybind X-N "Other Window") (keybind X-P "Shrink Window") (keybind X-S "Reverse String Search") (keybind X-T "String Search") (keybind X-U "Next Screen") (keybind X-V "Previous Screen") (keybind X-X "Return to Superior") (keybind X-Y "Goto End") (keybind X-^A "Up Real Line") (keybind X-^B "Down Real Line") (keybind X-^C "Forward Character") (keybind X-^D "Backward Character") (keybind X-^G "List Buffers") (keybind X-^H "Goto Beginning") (keybind X-^L "Grow Window") (keybind X-^N "Other Window") (keybind X-^P "Shrink Window") (keybind X-^S "Reverse String Search") (keybind X-^T "String Search") (keybind X-^U "Next Screen") (keybind X-^V "Previous Screen") (keybind X-^W "New Window") (keybind X-^X "Return to Superior") (keybind X-^Y "Goto End") (keybind DEL "Delete Character") set autoindent autowrite report=2 showmatch # Login shell profile. # Erase character, erase line, and interrupt keys. stty sane erase '^H' kill '^U' intr '^?' # Check terminal type. case $TERM in dialup|unknown|network) echo -n "Terminal type? ($TERM) "; read term TERM="${term:-$TERM}" unset term esac # Shell configuration. unset EDITOR; . $HOME/.ashrc # Special prompt for bin. case $USER in bin) PS1='! ' esac /* The header file describes the format of executable files. */ #ifndef _AOUT_H #define _AOUT_H struct exec { /* a.out header */ unsigned char a_magic[2]; /* magic number */ unsigned char a_flags; /* flags, see below */ unsigned char a_cpu; /* cpu id */ unsigned char a_hdrlen; /* length of header */ unsigned char a_unused; /* reserved for future use */ unsigned short a_version; /* version stamp (not used at present) */ long a_text; /* size of text segement in bytes */ long a_data; /* size of data segment in bytes */ long a_bss; /* size of bss segment in bytes */ long a_entry; /* entry point */ long a_total; /* total memory allocated */ long a_syms; /* size of symbol table */ /* SHORT FORM ENDS HERE */ long a_trsize; /* text relocation size */ long a_drsize; /* data relocation size */ long a_tbase; /* text relocation base */ long a_dbase; /* data relocation base */ }; #define A_MAGIC0 (unsigned char) 0x01 #define A_MAGIC1 (unsigned char) 0x03 #define BADMAG(X) ((X).a_magic[0] != A_MAGIC0 ||(X).a_magic[1] != A_MAGIC1) /* CPU Id of TARGET machine (byte order coded in low order two bits) */ #define A_NONE 0x00 /* unknown */ #define A_I8086 0x04 /* intel i8086/8088 */ #define A_M68K 0x0B /* motorola m68000 */ #define A_NS16K 0x0C /* national semiconductor 16032 */ #define A_I80386 0x10 /* intel i80386 */ #define A_SPARC 0x17 /* Sun SPARC */ #define A_BLR(cputype) ((cputype&0x01)!=0) /* TRUE if bytes left-to-right */ #define A_WLR(cputype) ((cputype&0x02)!=0) /* TRUE if words left-to-right */ /* Flags. */ #define A_UZP 0x01 /* unmapped zero page (pages) */ #define A_PAL 0x02 /* page aligned executable */ #define A_NSYM 0x04 /* new style symbol table */ #define A_EXEC 0x10 /* executable */ #define A_SEP 0x20 /* separate I/D */ #define A_PURE 0x40 /* pure text */ /* not used */ #define A_TOVLY 0x80 /* text overlay */ /* not used */ /* Offsets of various things. */ #define A_MINHDR 32 #define A_TEXTPOS(X) ((long)(X).a_hdrlen) #define A_DATAPOS(X) (A_TEXTPOS(X) + (X).a_text) #define A_HASRELS(X) ((X).a_hdrlen > (unsigned char) A_MINHDR) #define A_HASEXT(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 8)) #define A_HASLNS(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 16)) #define A_HASTOFF(X) ((X).a_hdrlen > (unsigned char) (A_MINHDR + 24)) #define A_TRELPOS(X) (A_DATAPOS(X) + (X).a_data) #define A_DRELPOS(X) (A_TRELPOS(X) + (X).a_trsize) #define A_SYMPOS(X) (A_TRELPOS(X) + (A_HASRELS(X) ? \ ((X).a_trsize + (X).a_drsize) : 0)) struct reloc { long r_vaddr; /* virtual address of reference */ unsigned short r_symndx; /* internal segnum or extern symbol num */ unsigned short r_type; /* relocation type */ }; /* r_tyep values: */ #define R_ABBS 0 #define R_RELLBYTE 2 #define R_PCRBYTE 3 #define R_RELWORD 4 #define R_PCRWORD 5 #define R_RELLONG 6 #define R_PCRLONG 7 #define R_REL3BYTE 8 #define R_KBRANCHE 9 /* r_symndx for internal segments */ #define S_ABS ((unsigned short)-1) #define S_TEXT ((unsigned short)-2) #define S_DATA ((unsigned short)-3) #define S_BSS ((unsigned short)-4) struct nlist { /* symbol table entry */ char n_name[8]; /* symbol name */ long n_value; /* value */ unsigned char n_sclass; /* storage class */ unsigned char n_numaux; /* number of auxiliary entries (not used) */ unsigned short n_type; /* language base and derived type (not used) */ }; /* Low bits of storage class (section). */ #define N_SECT 07 /* section mask */ #define N_UNDF 00 /* undefined */ #define N_ABS 01 /* absolute */ #define N_TEXT 02 /* text */ #define N_DATA 03 /* data */ #define N_BSS 04 /* bss */ #define N_COMM 05 /* (common) */ /* High bits of storage class. */ #define N_CLASS 0370 /* storage class mask */ #define C_NULL #define C_EXT 0020 /* external symbol */ #define C_STAT 0030 /* static */ /* Function prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( int nlist, (char *_file, struct nlist *_nl) ); #endif /* _AOUT_H */ /* alloca.h - The dreaded alloca() function. */ #ifndef _ALLOCA_H #define _ALLOCA_H #ifndef _TYPES_H #include #endif #if __GNUC__ /* The compiler recognizes this special keyword, and inlines the code. */ #define alloca(size) __builtin_alloca(size) #endif /* __GCC__ */ #if __ACK__ || __CCC__ _PROTOTYPE(void *alloca, (size_t _size) ); #endif /* __ACK__ || __CCC__ */ #endif /* _ALLOCA_H */ /* The header attempts to decide whether the compiler has enough * conformance to Standard C for Minix to take advantage of. If so, the * symbol _ANSI is defined (as 31415). Otherwise _ANSI is not defined * here, but it may be defined by applications that want to bend the rules. * The magic number in the definition is to inhibit unnecessary bending * of the rules. (For consistency with the new '#ifdef _ANSI" tests in * the headers, _ANSI should really be defined as nothing, but that would * break many library routines that use "#if _ANSI".) * If _ANSI ends up being defined, a macro * * _PROTOTYPE(function, params) * * is defined. This macro expands in different ways, generating either * ANSI Standard C prototypes or old-style K&R (Kernighan & Ritchie) * prototypes, as needed. Finally, some programs use _CONST, _VOIDSTAR etc * in such a way that they are portable over both ANSI and K&R compilers. * The appropriate macros are defined here. */ #ifndef _ANSI_H #define _ANSI_H #if __STDC__ == 1 #define _ANSI 31459 /* compiler claims full ANSI conformance */ #endif #ifdef __GNUC__ #define _ANSI 31459 /* gcc conforms enough even in non-ANSI mode */ #endif #ifdef _ANSI /* Keep everything for ANSI prototypes. */ #define _PROTOTYPE(function, params) function params #define _ARGS(params) params #define _VOIDSTAR void * #define _VOID void #define _CONST const #define _VOLATILE volatile #define _SIZET size_t #else /* Throw away the parameters for K&R prototypes. */ #define _PROTOTYPE(function, params) function() #define _ARGS(params) () #define _VOIDSTAR void * #define _VOID void #define _CONST #define _VOLATILE #define _SIZET int #endif /* _ANSI */ /* Setting any of _MINIX, _POSIX_C_SOURCE or _POSIX2_SOURCE implies * _POSIX_SOURCE. (Seems wrong to put this here in ANSI space.) */ #if defined(_MINIX) || _POSIX_C_SOURCE > 0 || defined(_POSIX2_SOURCE) #undef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif #endif /* ANSI_H */ /* The header contains a macro called "assert" that allows * programmers to put assertions in the code. These assertions can be verified * at run time. If an assertion fails, an error message is printed and the * program aborts. * Assertion checking can be disabled by adding the statement * * #define NDEBUG * * to the program before the * * #include * * statement. */ #undef assert #ifndef _ANSI_H #include #endif #ifdef NDEBUG /* Debugging disabled -- do not evaluate assertions. */ #define assert(expr) ((void) 0) #else /* Debugging enabled -- verify assertions at run time. */ #ifdef _ANSI #define __str(x) # x #define __xstr(x) __str(x) _PROTOTYPE( void __bad_assertion, (const char *_mess) ); #define assert(expr) ((expr)? (void)0 : \ __bad_assertion("Assertion \"" #expr \ "\" failed, file " __xstr(__FILE__) \ ", line " __xstr(__LINE__) "\n")) #else #define assert(expr) ((void) ((expr) ? 0 : __assert( __FILE__, __LINE__))) #endif /* _ANSI */ #endif /* The header file defines some macros used to identify characters. * It works by using a table stored in chartab.c. When a character is presented * to one of these macros, the character is used as an index into the table * (__ctype) to retrieve a byte. The relevant bit is then extracted. */ #ifndef _CTYPE_H #define _CTYPE_H #ifndef _ANSI_H #include #endif extern char __ctype[]; /* property array defined in chartab.c */ #define _U 0x01 /* this bit is for upper-case letters [A-Z] */ #define _L 0x02 /* this bit is for lower-case letters [a-z] */ #define _N 0x04 /* this bit is for numbers [0-9] */ #define _S 0x08 /* this bit is for white space \t \n \f etc */ #define _P 0x10 /* this bit is for punctuation characters */ #define _C 0x20 /* this bit is for control characters */ #define _X 0x40 /* this bit is for hex digits [a-f] and [A-F]*/ /* Function Prototypes (have to go before the macros). */ _PROTOTYPE( int isalnum, (int _c) ); /* alphanumeric [a-z], [A-Z], [0-9] */ _PROTOTYPE( int isalpha, (int _c) ); /* alphabetic */ _PROTOTYPE( int iscntrl, (int _c) ); /* control characters */ _PROTOTYPE( int isdigit, (int _c) ); /* digit [0-9] */ _PROTOTYPE( int isgraph, (int _c) ); /* graphic character */ _PROTOTYPE( int islower, (int _c) ); /* lower-case letter [a-z] */ _PROTOTYPE( int isprint, (int _c) ); /* printable character */ _PROTOTYPE( int ispunct, (int _c) ); /* punctuation mark */ _PROTOTYPE( int isspace, (int _c) ); /* white space sp, \f, \n, \r, \t, \v*/ _PROTOTYPE( int isupper, (int _c) ); /* upper-case letter [A-Z] */ _PROTOTYPE( int isxdigit,(int _c) ); /* hex digit [0-9], [a-f], [A-F] */ _PROTOTYPE( int tolower, (int _c) ); /* convert to lower-case */ _PROTOTYPE( int toupper, (int _c) ); /* convert to upper-case */ /* Macros for identifying character classes. */ #define isalnum(c) ((__ctype+1)[c]&(_U|_L|_N)) #define isalpha(c) ((__ctype+1)[c]&(_U|_L)) #define iscntrl(c) ((__ctype+1)[c]&_C) #define isgraph(c) ((__ctype+1)[c]&(_P|_U|_L|_N)) #define ispunct(c) ((__ctype+1)[c]&_P) #define isspace(c) ((__ctype+1)[c]&_S) #define isxdigit(c) ((__ctype+1)[c]&(_N|_X)) #define isdigit(c) ((unsigned) ((c)-'0') < 10) #define islower(c) ((unsigned) ((c)-'a') < 26) #define isupper(c) ((unsigned) ((c)-'A') < 26) #define isprint(c) ((unsigned) ((c)-' ') < 95) #define isascii(c) ((unsigned) (c) < 128) #endif /* _CTYPE_H */ /* curses.h - defines macros and prototypes for curses */ #ifndef _CURSES_H #define _CURSES_H #include #include #include typedef int bool; #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef ERR #define ERR (-1) /* general error flag */ #endif #ifndef OK #define OK 0 /* general OK flag */ #endif /* Macros. */ #define box(win,vc,hc) wbox(win,0,0,0,0,vc,hc) #define addch(ch) waddch(stdscr,ch) #define mvaddch(y,x,ch) (wmove(stdscr,y,x)==ERR?ERR:waddch(stdscr,ch)) #define mvwaddch(win,y,x,ch) (wmove(win,y,x)==ERR?ERR:waddch(win,ch)) #define getch() wgetch(stdscr) #define mvgetch(y,x) (wmove(stdscr,y,x)==ERR?ERR:wgetch(stdscr)) #define mvwgetch(win,y,x) (wmove(win,y,x)==ERR?ERR:wgetch(win)) #define addstr(str) waddstr(stdscr,str) #define mvaddstr(y,x,str) (wmove(stdscr,y,x)==ERR?ERR:waddstr(stdscr,str)) #define mvwaddstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR:waddstr(win,str)) #define getstr(str) wgetstr(stdscr,str) #define mvgetstr(y,x,str) (wmove(stdscr,y,x)==ERR?ERR:wgetstr(stdscr,str)) #define mvwgetstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR:wgetstr(win,str)) #define move(y,x) wmove(stdscr,y,x) #define clear() wclear(stdscr) #define erase() werase(stdscr) #define clrtobot() wclrtobot(stdscr) #define mvclrtobot(y,x) (wmove(stdscr,y,x)==ERR?ERR:wclrtobot(stdscr)) #define mvwclrtobot(win,y,x) (wmove(win,y,x)==ERR?ERR:wclrtobot(win)) #define clrtoeol() wclrtoeol(stdscr) #define mvclrtoeol(y,x) (wmove(stdscr,y,x)==ERR?ERR:wclrtoeol(stdscr)) #define mvwclrtoeol(win,y,x) (wmove(win,y,x)==ERR?ERR:wclrtoeol(win)) #define insertln() winsertln(stdscr) #define mvinsertln(y,x) (wmove(stdscr,y,x)==ERR?ERR:winsertln(stdscr)) #define mvwinsertln(win,y,x) (wmove(win,y,x)==ERR?ERR:winsertln(win)) #define deleteln() wdeleteln(stdscr) #define mvdeleteln(y,x) (wmove(stdscr,y,x)==ERR?ERR:wdeleteln(stdscr)) #define mvwdeleteln(win,y,x) (wmove(win,y,x)==ERR?ERR:wdeleteln(win)) #define refresh() wrefresh(stdscr) #define inch() winch(stdscr) #define insch(ch) winsch(stdscr,ch) #define mvinsch(y,x,ch) (wmove(stdscr,y,x)==ERR?ERR:winsch(stdscr,ch)) #define mvwinsch(win,y,x,ch) (wmove(win,y,x)==ERR?ERR:winsch(win,ch)) #define delch() wdelch(stdscr) #define mvdelch(y,x) (wmove(stdscr,y,x)==ERR?ERR:wdelch(stdscr)) #define mvwdelch(win,y,x) (wmove(win,y,x)==ERR?ERR:wdelch(win)) #define standout() wstandout(stdscr) #define wstandout(win) ((win)->_attrs |= A_STANDOUT) #define standend() wstandend(stdscr) #define wstandend(win) ((win)->_attrs &= ~A_STANDOUT) #define attrset(attrs) wattrset(stdscr, attrs) #define wattrset(win, attrs) ((win)->_attrs = (attrs)) #define attron(attrs) wattron(stdscr, attrs) #define wattron(win, attrs) ((win)->_attrs |= (attrs)) #define attroff(attrs) wattroff(stdscr,attrs) #define wattroff(win, attrs) ((win)->_attrs &= ~(attrs)) #define resetty() tcsetattr(1, TCSANOW, &_orig_tty) #define getyx(win,y,x) (y = (win)->_cury, x = (win)->_curx) /* Video attribute definitions. */ #define A_BLINK 0x0100 #define A_BLANK 0 #define A_BOLD 0x0200 #define A_DIM 0 #define A_PROTECT 0 #define A_REVERSE 0x0400 #define A_STANDOUT 0x0800 #define A_UNDERLINE 0x1000 #define A_ALTCHARSET 0x2000 /* Type declarations. */ typedef struct { int _cury; /* current pseudo-cursor */ int _curx; int _maxy; /* max coordinates */ int _maxx; int _begy; /* origin on screen */ int _begx; int _flags; /* window properties */ int _attrs; /* attributes of written characters */ int _tabsize; /* tab character size */ bool _clear; /* causes clear at next refresh */ bool _leave; /* leaves cursor as it happens */ bool _scroll; /* allows window scrolling */ bool _nodelay; /* input character wait flag */ bool _keypad; /* flags keypad key mode active */ int **_line; /* pointer to line pointer array */ int *_minchng; /* First changed character in line */ int *_maxchng; /* Last changed character in line */ int _regtop; /* Top/bottom of scrolling region */ int _regbottom; } WINDOW; /* External variables */ extern int LINES; /* terminal height */ extern int COLS; /* terminal width */ extern bool NONL; /* \n causes CR too ? */ extern WINDOW *curscr; /* the current screen image */ extern WINDOW *stdscr; /* the default screen window */ extern struct termios _orig_tty, _tty; extern unsigned int ACS_ULCORNER; /* terminal dependent block grafic */ extern unsigned int ACS_LLCORNER; /* charcters. Forget IBM, we are */ extern unsigned int ACS_URCORNER; /* independent of their charset. :-) */ extern unsigned int ACS_LRCORNER; extern unsigned int ACS_RTEE; extern unsigned int ACS_LTEE; extern unsigned int ACS_BTEE; extern unsigned int ACS_TTEE; extern unsigned int ACS_HLINE; extern unsigned int ACS_VLINE; extern unsigned int ACS_PLUS; extern unsigned int ACS_S1; extern unsigned int ACS_S9; extern unsigned int ACS_DIAMOND; extern unsigned int ACS_CKBOARD; extern unsigned int ACS_DEGREE; extern unsigned int ACS_PLMINUS; extern unsigned int ACS_BULLET; extern unsigned int ACS_LARROW; extern unsigned int ACS_RARROW; extern unsigned int ACS_DARROW; extern unsigned int ACS_UARROW; extern unsigned int ACS_BOARD; extern unsigned int ACS_LANTERN; extern unsigned int ACS_BLOCK; _PROTOTYPE( char *unctrl, (int _c) ); _PROTOTYPE( int baudrate, (void)); _PROTOTYPE( void beep, (void)); _PROTOTYPE( void cbreak, (void)); _PROTOTYPE( void clearok, (WINDOW *_win, bool _flag) ); _PROTOTYPE( void clrscr, (void)); _PROTOTYPE( void curs_set, (int _visibility) ); _PROTOTYPE( void delwin, (WINDOW *_win) ); _PROTOTYPE( void doupdate, (void)); _PROTOTYPE( void echo, (void)); _PROTOTYPE( int endwin, (void)); _PROTOTYPE( int erasechar, (void)); _PROTOTYPE( void fatal, (char *_s) ); _PROTOTYPE( int fixterm, (void)); _PROTOTYPE( void flash, (void)); _PROTOTYPE( void gettmode, (void)); _PROTOTYPE( void idlok, (WINDOW *_win, bool _flag) ); _PROTOTYPE( WINDOW *initscr, (void)); _PROTOTYPE( void keypad, (WINDOW *_win, bool _flag) ); _PROTOTYPE( int killchar, (void)); _PROTOTYPE( void leaveok, (WINDOW *_win, bool _flag) ); _PROTOTYPE( char *longname, (void)); _PROTOTYPE( void meta, (WINDOW *_win, bool _flag) ); _PROTOTYPE( int mvcur, (int _oldy, int _oldx, int _newy, int _newx) ); _PROTOTYPE( int mvinch, (int _y, int _x) ); _PROTOTYPE( int mvprintw, (int _y, int _x, const char *_fmt, ...) ); _PROTOTYPE( int mvscanw, (int _y, int _x, const char *_fmt, ...) ); _PROTOTYPE( int mvwin, (WINDOW *_win, int _begy, int _begx) ); _PROTOTYPE( int mvwinch, (WINDOW *_win, int _y, int _x) ); _PROTOTYPE( int mvwprintw, (WINDOW *_win, int _y, int _x, const char *_fmt, ...) ); _PROTOTYPE( int mvwscanw, (WINDOW *_win, int _y, int _x, const char *_fmt, ...) ); _PROTOTYPE( WINDOW *newwin, (int _num_lines, int _num_cols, int _y, int _x)); _PROTOTYPE( void nl, (void)); _PROTOTYPE( void nocbreak, (void)); _PROTOTYPE( void nodelay, (WINDOW *_win, bool _flag) ); _PROTOTYPE( void noecho, (void)); _PROTOTYPE( void nonl, (void)); _PROTOTYPE( void noraw, (void)); _PROTOTYPE( void outc, (int _c) ); _PROTOTYPE( void overlay, (WINDOW *_win1, WINDOW *_win2) ); _PROTOTYPE( void overwrite, (WINDOW *_win1, WINDOW *_win2) ); _PROTOTYPE( void poscur, (int _r, int _c) ); _PROTOTYPE( int printw, (const char *_fmt, ...) ); _PROTOTYPE( void raw, (void)); _PROTOTYPE( int resetterm, (void)); _PROTOTYPE( int saveoldterm, (void)); _PROTOTYPE( int saveterm, (void)); _PROTOTYPE( int savetty, (void)); _PROTOTYPE( int scanw, (const char *_fmt, ...) ); _PROTOTYPE( void scroll, (WINDOW *_win) ); _PROTOTYPE( void scrollok, (WINDOW *_win, bool _flag) ); _PROTOTYPE( int setscrreg, (int _top, int _bottom) ); _PROTOTYPE( int setterm, (char *_type) ); _PROTOTYPE( int setupterm, (void)); _PROTOTYPE( WINDOW *subwin, (WINDOW *_orig, int _nlines, int _ncols, int _y, int _x)); _PROTOTYPE( int tabsize, (int _ts) ); _PROTOTYPE( void touchwin, (WINDOW *_win) ); _PROTOTYPE( int waddch, (WINDOW *_win, int _c) ); _PROTOTYPE( int waddstr, (WINDOW *_win, char *_str) ); _PROTOTYPE( int wbox, (WINDOW *_win, int _ymin, int _xmin, ;=int _ymax, int _xmax, unsigned int _v, unsigned int _h) ); _PROTOTYPE( void wclear, (WINDOW *_win) ); _PROTOTYPE( int wclrtobot, (WINDOW *_win) ); _PROTOTYPE( int wclrtoeol, (WINDOW *_win) ); _PROTOTYPE( int wdelch, (WINDOW *_win) ); _PROTOTYPE( int wdeleteln, (WINDOW *_win) ); _PROTOTYPE( void werase, (WINDOW *_win) ); _PROTOTYPE( int wgetch, (WINDOW *_win) ); _PROTOTYPE( int wgetstr, (WINDOW *_win, char *_str) ); _PROTOTYPE( int winch, (WINDOW *_win) ); _PROTOTYPE( int winsch, (WINDOW *_win, int _c) ); _PROTOTYPE( int winsertln, (WINDOW *_win) ); _PROTOTYPE( int wmove, (WINDOW *_win, int _y, int _x) ); _PROTOTYPE( void wnoutrefresh, (WINDOW *_win) ); _PROTOTYPE( int wprintw, (WINDOW *_win, const char *_fmt, ...)); _PROTOTYPE( void wrefresh, (WINDOW *_win) ); _PROTOTYPE( int wscanw, (WINDOW *_win, const char *_fmt, ...)); _PROTOTYPE( int wsetscrreg, (WINDOW *_win, int _top, int _bottom) ); _PROTOTYPE( int wtabsize, (WINDOW *_win, int _ts) ); #endif /* _CURSES_H */ /* dirent.h - Declarations for directory reading routines. * Author: Kees J. Bot * 24 Apr 1989 * * Note: The V7 format directory entries used under Minix must be transformed * into a struct dirent with a d_name of at least 15 characters. Given that * we have to transform V7 entries anyhow it is little trouble to let the * routines understand the so-called "flex" directory format too. */ #ifndef _DIRENT_H #define _DIRENT_H #ifndef _TYPES_H #include #endif /* _fl_direct is a flexible directory entry. Actually it's a union of 8 * characters and the 3 fields defined below. */ /* Flexible directory entry: */ struct _fl_direct { /* First slot in an entry */ ino_t d_ino; unsigned char d_extent; char d_name[5]; /* Four characters for the shortest name */ }; /* Name of length len needs _EXTENT(len) extra slots. */ #define _EXTENT(len) (((len) + 3) >> 3) /* Version 7 directory entry: */ struct _v7_direct { ino_t d_ino; char d_name[14]; }; /* Definitions for the directory(3) routines: */ typedef struct { char _fd; /* Filedescriptor of open directory */ char _v7; /* Directory is Version 7 */ short _count; /* This many objects in buf */ off_t _pos; /* Position in directory file */ struct _fl_direct *_ptr; /* Next slot in buf */ struct _fl_direct _buf[128]; /* One block of a directory file */ struct _fl_direct _v7f[3]; /* V7 entry transformed to flex */ } DIR; struct dirent { /* Largest entry (8 slots) */ ino_t d_ino; /* I-node number */ unsigned char d_extent; /* Extended with this many slots */ char d_name[61]; /* Null terminated name */ }; /* Function Prototypes. */ _PROTOTYPE( int closedir, (DIR *_dirp) ); _PROTOTYPE( DIR *opendir, (const char *_dirname) ); _PROTOTYPE( struct dirent *readdir, (DIR *_dirp) ); _PROTOTYPE( void rewinddir, (DIR *_dirp) ); #ifdef _MINIX _PROTOTYPE( int seekdir, (DIR *_dirp, off_t _loc) ); _PROTOTYPE( off_t telldir, (DIR *_dirp) ); #endif #endif /* _DIRENT_H */ /* The header defines the numbers of the various errors that can * occur during program execution. They are visible to user programs and * should be small positive integers. However, they are also used within * MINIX, where they must be negative. For example, the READ system call is * executed internally by calling do_read(). This function returns either a * (negative) error number or a (positive) number of bytes actually read. * * To solve the problem of having the error numbers be negative inside the * the system and positive outside, the following mechanism is used. All the * definitions are are the form: * * #define EPERM (_SIGN 1) * * If the macro _SYSTEM is defined, then _SIGN is set to "-", otherwise it is * set to "". Thus when compiling the operating system, the macro _SYSTEM * will be defined, setting EPERM to (- 1), whereas when when this * file is included in an ordinary user program, EPERM has the value ( 1). */ #ifndef _ERRNO_H /* check if is already included */ #define _ERRNO_H /* it is not included; note that fact */ /* Now define _SIGN as "" or "-" depending on _SYSTEM. */ #ifdef _SYSTEM # define _SIGN - # define OK 0 #else # define _SIGN #endif extern int errno; /* place where the error numbers go */ /* Here are the numerical values of the error numbers. */ #define _NERROR 70 /* number of errors */ #define EGENERIC (_SIGN 99) /* generic error */ #define EPERM (_SIGN 1) /* operation not permitted */ #define ENOENT (_SIGN 2) /* no such file or directory */ #define ESRCH (_SIGN 3) /* no such process */ #define EINTR (_SIGN 4) /* interrupted function call */ #define EIO (_SIGN 5) /* input/output error */ #define ENXIO (_SIGN 6) /* no such device or address */ #define E2BIG (_SIGN 7) /* arg list too long */ #define ENOEXEC (_SIGN 8) /* exec format error */ #define EBADF (_SIGN 9) /* bad file descriptor */ #define ECHILD (_SIGN 10) /* no child process */ #define EAGAIN (_SIGN 11) /* resource temporarily unavailable */ #define ENOMEM (_SIGN 12) /* not enough space */ #define EACCES (_SIGN 13) /* permission denied */ #define EFAULT (_SIGN 14) /* bad address */ #define ENOTBLK (_SIGN 15) /* Extension: not a block special file */ #define EBUSY (_SIGN 16) /* resource busy */ #define EEXIST (_SIGN 17) /* file exists */ #define EXDEV (_SIGN 18) /* improper link */ #define ENODEV (_SIGN 19) /* no such device */ #define ENOTDIR (_SIGN 20) /* not a directory */ #define EISDIR (_SIGN 21) /* is a directory */ #define EINVAL (_SIGN 22) /* invalid argument */ #define ENFILE (_SIGN 23) /* too many open files in system */ #define EMFILE (_SIGN 24) /* too many open files */ #define ENOTTY (_SIGN 25) /* inappropriate I/O control operation */ #define ETXTBSY (_SIGN 26) /* no longer used */ #define EFBIG (_SIGN 27) /* file too large */ #define ENOSPC (_SIGN 28) /* no space left on device */ #define ESPIPE (_SIGN 29) /* invalid seek */ #define EROFS (_SIGN 30) /* read-only file system */ #define EMLINK (_SIGN 31) /* too many links */ #define EPIPE (_SIGN 32) /* broken pipe */ #define EDOM (_SIGN 33) /* domain error (from ANSI C std) */ #define ERANGE (_SIGN 34) /* result too large (from ANSI C std) */ #define EDEADLK (_SIGN 35) /* resource deadlock avoided */ #define ENAMETOOLONG (_SIGN 36) /* file name too long */ #define ENOLCK (_SIGN 37) /* no locks available */ #define ENOSYS (_SIGN 38) /* function not implemented */ #define ENOTEMPTY (_SIGN 39) /* directory not empty */ /* The following errors relate to networking. */ #define EPACKSIZE (_SIGN 50) /* invalid packet size for some protocol */ #define EOUTOFBUFS (_SIGN 51) /* not enough buffers left */ #define EBADIOCTL (_SIGN 52) /* illegal ioctl for device */ #define EBADMODE (_SIGN 53) /* badmode in ioctl */ #define EWOULDBLOCK (_SIGN 54) #define EBADDEST (_SIGN 55) /* not a valid destination address */ #define EDSTNOTRCH (_SIGN 56) /* destination not reachable */ #define EISCONN (_SIGN 57) /* all ready connected */ #define EADDRINUSE (_SIGN 58) /* address in use */ #define ECONNREFUSED (_SIGN 59) /* connection refused */ #define ECONNRESET (_SIGN 60) /* connection reset */ #define ETIMEDOUT (_SIGN 61) /* connection timed out */ #define EURG (_SIGN 62) /* urgent data present */ #define ENOURG (_SIGN 63) /* no urgent data present */ #define ENOTCONN (_SIGN 64) /* no connection (yet or anymore) */ #define ESHUTDOWN (_SIGN 65) /* a write call to a shutdown connection */ #define ENOCONN (_SIGN 66) /* no such connection */ /* The following are not POSIX errors, but they can still happen. */ #define ELOCKED (_SIGN 101) /* can't send message */ #define EBADCALL (_SIGN 102) /* error on send/receive */ /* The following error codes are generated by the kernel itself. */ #ifdef _SYSTEM #define E_BAD_DEST -1001 /* destination address illegal */ #define E_BAD_SRC -1002 /* source address illegal */ #define E_TRY_AGAIN -1003 /* can't send-- tables full */ #define E_OVERRUN -1004 /* interrupt for task that is not waiting */ #define E_BAD_BUF -1005 /* message buf outside caller's addr space */ #define E_TASK -1006 /* can't send to task */ #define E_NO_MESSAGE -1007 /* RECEIVE failed: no message present */ #define E_NO_PERM -1008 /* ordinary users can't send to tasks */ #define E_BAD_FCN -1009 /* only valid fcns are SEND, RECEIVE, BOTH */ #define E_BAD_ADDR -1010 /* bad address given to utility routine */ #define E_BAD_PROC -1011 /* bad proc number given to utility */ #endif /* _SYSTEM */ #endif /* _ERRNO_H */ /* The header is needed by the open() and fcntl() system calls, * which have a variety of parameters and flags. They are described here. * The formats of the calls to each of these are: * * open(path, oflag [,mode]) open a file * fcntl(fd, cmd [,arg]) get or set file attributes * */ #ifndef _FCNTL_H #define _FCNTL_H #ifndef _TYPES_H #include #endif /* These values are used for cmd in fcntl(). POSIX Table 6-1. */ #define F_DUPFD 0 /* duplicate file descriptor */ #define F_GETFD 1 /* get file descriptor flags */ #define F_SETFD 2 /* set file descriptor flags */ #define F_GETFL 3 /* get file status flags */ #define F_SETFL 4 /* set file status flags */ #define F_GETLK 5 /* get record locking information */ #define F_SETLK 6 /* set record locking information */ #define F_SETLKW 7 /* set record locking info; wait if blocked */ /* File descriptor flags used for fcntl(). POSIX Table 6-2. */ #define FD_CLOEXEC 1 /* close on exec flag for third arg of fcntl */ /* L_type values for record locking with fcntl(). POSIX Table 6-3. */ #define F_RDLCK 1 /* shared or read lock */ #define F_WRLCK 2 /* exclusive or write lock */ #define F_UNLCK 3 /* unlock */ /* Oflag values for open(). POSIX Table 6-4. */ #define O_CREAT 00100 /* creat file if it doesn't exist */ #define O_EXCL 00200 /* exclusive use flag */ #define O_NOCTTY 00400 /* do not assign a controlling terminal */ #define O_TRUNC 01000 /* truncate flag */ /* File status flags for open() and fcntl(). POSIX Table 6-5. */ #define O_APPEND 02000 /* set append mode */ #define O_NONBLOCK 04000 /* no delay */ /* File access modes for open() and fcntl(). POSIX Table 6-6. */ #define O_RDONLY 0 /* open(name, O_RDONLY) opens read only */ #define O_WRONLY 1 /* open(name, O_WRONLY) opens write only */ #define O_RDWR 2 /* open(name, O_RDWR) opens read/write */ /* Mask for use with file access modes. POSIX Table 6-7. */ #define O_ACCMODE 03 /* mask for file access modes */ /* Struct used for locking. POSIX Table 6-8. */ struct flock { short l_type; /* type: F_RDLCK, F_WRLCK, or F_UNLCK */ short l_whence; /* flag for starting offset */ off_t l_start; /* relative offset in bytes */ off_t l_len; /* size; if 0, then until EOF */ pid_t l_pid; /* process id of the locks' owner */ }; /* Function Prototypes. */ _PROTOTYPE( int creat, (const char *_path, Mode_t _mode) ); _PROTOTYPE( int fcntl, (int _filedes, int _cmd, ...) ); _PROTOTYPE( int open, (const char *_path, int _oflag, ...) ); #endif /* _FCNTL_H */ /* The header defines some implementation limits for (IEEE) floating * point. Application programs can use it to find out how big and small * floating-point numbers can be, what epsilon to use for iteration, etc. */ #ifndef _FLOAT_H #define _FLOAT_H #define FLT_DIG 6 #define FLT_EPSILON 1.19209290e-07F #define FLT_MANT_DIG 24 #define FLT_MAX 3.40282347e+38F #define FLT_MAX_10_EXP 38 #define FLT_MAX_EXP 128 #define FLT_MIN 1.17549435e-38F #define FLT_MIN_10_EXP -37 #define FLT_MIN_EXP -125 #define DBL_DIG 15 #define DBL_EPSILON 2.2204460492503131e-16 #define DBL_MANT_DIG 53 #define DBL_MAX 1.7976931348623157e+308 #define DBL_MAX_10_EXP 308 #define DBL_MAX_EXP 1024 #define DBL_MIN 2.2250738585072014e-308 #define DBL_MIN_10_EXP -307 #define DBL_MIN_EXP -1021 #define LDBL_DIG 15 #define LDBL_EPSILON 2.2204460492503131e-16L #define LDBL_MANT_DIG 53 #define LDBL_MAX 1.7976931348623157e+308L #define LDBL_MAX_10_EXP 308 #define LDBL_MAX_EXP 1024 #define LDBL_MIN 2.2250738585072014e-308L #define LDBL_MIN_10_EXP -307 #define LDBL_MIN_EXP -1021 #define FLT_ROUNDS 1 #define FLT_RADIX 2 #endif /* _FLOAT_H */ /* The header is used for the getgrid() and getgrnam() calls. */ #ifndef _GRP_H #define _GRP_H #ifndef _TYPES_H #include #endif struct group { char *gr_name; /* the name of the group */ char *gr_passwd; /* the group passwd */ gid_t gr_gid; /* the numerical group ID */ char **gr_mem; /* a vector of pointers to the members */ }; /* Function Prototypes. */ _PROTOTYPE( struct group *getgrgid, (Gid_t _gid) ); _PROTOTYPE( struct group *getgrnam, (const char *_name) ); #ifdef _MINIX _PROTOTYPE( void endgrent, (void) ); _PROTOTYPE( struct group *getgrent, (void) ); _PROTOTYPE( int setgrent, (void) ); _PROTOTYPE( void setgrfile, (const char *_file) ); #endif #endif /* _GRP_H */ . ..diskparm.hpartition.hportio.hcmos.hint86.h/* PC (and AT) BIOS structure to hold disk parameters. Under Minix, it is * used mainly for formatting. */ #ifndef _DISKPARM_H #define _DISKPARM_H struct disk_parameter_s { char spec1; char spec2; char motor_turnoff_sec; char sector_size_code; char sectors_per_cylinder; char gap_length; char dtl; char gap_length_for_format; char fill_byte_for_format; char head_settle_msec; char motor_start_eigth_sec; }; #endif /* _DISKPARM_H */ /* Description of entry in partition table. */ #ifndef _PARTITION_H #define _PARTITION_H struct part_entry { unsigned char bootind; /* boot indicator 0/ACTIVE_FLAG */ unsigned char start_head; /* head value for first sector */ unsigned char start_sec; /* sector value + cyl bits for first sector */ unsigned char start_cyl; /* track value for first sector */ unsigned char sysind; /* system indicator */ unsigned char last_head; /* head value for last sector */ unsigned char last_sec; /* sector value + cyl bits for last sector */ unsigned char last_cyl; /* track value for last sector */ unsigned long lowsec; /* logical first sector */ unsigned long size; /* size of partition in sectors */ }; #define ACTIVE_FLAG 0x80 /* value for active in bootind field (hd0) */ #define NR_PARTITIONS 4 /* number of entries in partition table */ #define PART_TABLE_OFF 0x1BE /* offset of partition table in boot sector */ /* Partition types. */ #define NO_PART 0x00 /* unused entry */ #define MINIX_PART 0x81 /* Minix partition type */ #endif /* _PARTITION_H */ /* ibm/portio.h Created: Jan 15, 1992 by Philip Homburg */ #ifndef _PORTIO_H_ #define _PORTIO_H_ #ifndef _ANSI_H #include #endif _PROTOTYPE( unsigned inb, (U16_t _port) ); _PROTOTYPE( unsigned inw, (U16_t _port) ); _PROTOTYPE( unsigned inl, (U32_t _port) ); _PROTOTYPE( void outb, (U16_t _port, U8_t _value) ); _PROTOTYPE( void outw, (U16_t _port, U16_t _value) ); _PROTOTYPE( void outl, (U16_t _port, U32_t _value) ); _PROTOTYPE( void rep_inb, (U16_t _port, u8_t *_buf, size_t _count) ); _PROTOTYPE( void rep_inw, (U16_t _port, u16_t *_buf, size_t _count) ); _PROTOTYPE( void rep_inl, (U16_t _port, u32_t *_buf, size_t _count) ); _PROTOTYPE( void rep_outb, (U16_t _port, u8_t *_buf, size_t _count) ); _PROTOTYPE( void rep_outw, (U16_t _port, u16_t *_buf, size_t _count) ); _PROTOTYPE( void rep_outl, (U16_t _port, u32_t *_buf, size_t _count) ); _PROTOTYPE( void intr_enable, (void) ); _PROTOTYPE( void intr_disable, (void) ); #endif /* _PORTIO_H_ */ /* ibm/cmos.h Created: Dec 1998 by Philip Homburg Definitions for the CMOS/realtime clock. Based on the datasheet for the Dallas DS12887, compatible with the Motorola MC146818 */ #define RTC_INDEX 0x70 /* Bit 7 = NMI enable (1) / disable (0) * bits 0..6 index */ #define RTC_IO 0x71 /* Data register, * Note: the operation following a write to * RTC_INDEX should an access (read or write) * to RTC_IO */ #define RTC_SEC 0x0 /* Seconds register */ #define RTC_SEC_ALRM 0x1 /* Seconds register for alarm */ #define RTC_MIN 0x2 /* Minutes register */ #define RTC_MIN_ALRM 0x3 /* Minutes register for alarm */ #define RTC_HOUR 0x4 /* Hours register */ #define RTC_HOUR_ALRM 0x5 /* Hours register for alarm */ #define RTC_WDAY 0x6 /* Day of the week, 1..7, Sunday = 1 */ #define RTC_MDAY 0x7 /* Day of the month, 1..31 */ #define RTC_MONTH 0x8 /* Month, 1..12 */ #define RTC_YEAR 0x9 /* Year, 0..99 */ #define RTC_REG_A 0xA #define RTC_A_UIP 0x80 /* Update in progress. When clear, * no update will occur for 244 * micro seconds. */ #define RTC_A_DV 0x70 /* Divider bits, valid values are: */ #define RTC_A_DV_OK 0x20 /* Normal */ #define RTC_A_DV_STOP 0x70 /* Stop, a re-start starts * halfway through a cycle, * i.e. the update occurs after * 500ms. */ #define RTC_A_RS 0x0F /* Int. freq */ /* 0 None * 1 256 Hz * 2 128 Hz * 3 8192 Hz * 4 4096 Hz * 5 2048 Hz * 6 1024 Hz * 7 512 Hz * 8 256 Hz * 9 128 Hz * 10 64 Hz * 11 32 Hz * 12 16 Hz * 13 8 Hz * 14 4 Hz * 15 2 Hz */ #define RTC_A_RS_DEF 6 /* Default freq. */ #define RTC_REG_B 0xB #define RTC_B_SET 0x80 /* Inhibit updates */ #define RTC_B_PIE 0x40 /* Enable periodic interrupts */ #define RTC_B_AIE 0x20 /* Enable alarm interrupts */ #define RTC_B_UIE 0x10 /* Enable update ended interrupts */ #define RTC_B_SQWE 0x08 /* Enable square wave output */ #define RTC_B_DM_BCD 0x04 /* Data is in BCD (otherwise binary) */ #define RTC_B_24 0x02 /* Count hours in 24-hour mode */ #define RTC_B_DSE 0x01 /* Automatic (wrong) daylight savings * updates */ #define RTC_REG_C 0xC /* Contents of the general purpose CMOS RAM (source IBM reference manual) */ #define CMOS_STATUS 0xE #define CS_LOST_POWER 0x80 /* Chip lost power */ #define CS_BAD_CHKSUM 0x40 /* Checksum is incorrect */ #define CS_BAD_CONFIG 0x20 /* Bad configuration info */ #define CS_BAD_MEMSIZE 0x10 /* Wrong memory size of CMOS */ #define CS_BAD_HD 0x08 /* Harddisk failed */ #define CS_BAD_TIME 0x04 /* CMOS time is invalid */ /* bits 0 and 1 are reserved */ /* * $PchId: cmos.h,v 1.1 1998/12/16 09:14:21 philip Exp $ */ /* int86.h - 8086 interrupt types Author: Kees J. Bot * 3 May 2000 */ /* Registers used in an PC real mode call for BIOS or DOS services. A * driver is called through the vector if the interrupt number is zero. */ union reg86 { struct l { u32_t ef; /* 32 bit flags (output only) */ u32_t vec; /* Driver vector (input only) */ u32_t _ds_es[1]; u32_t eax; /* 32 bit general registers */ u32_t ebx; u32_t ecx; u32_t edx; u32_t esi; u32_t edi; u32_t ebp; } l; struct w { u16_t f, _ef[1]; /* 16 bit flags (output only) */ u16_t off, seg; /* Driver vector (input only) */ u16_t ds, es; /* DS and ES real mode segment regs */ u16_t ax, _eax[1]; /* 16 bit general registers */ u16_t bx, _ebx[1]; u16_t cx, _ecx[1]; u16_t dx, _edx[1]; u16_t si, _esi[1]; u16_t di, _edi[1]; u16_t bp, _ebp[1]; } w; struct b { u8_t intno, _intno[3]; /* Interrupt number (input only) */ u8_t _vec[4]; u8_t _ds_es[4]; u8_t al, ah, _eax[2]; /* 8 bit general registers */ u8_t bl, bh, _ebx[2]; u8_t cl, ch, _ecx[2]; u8_t dl, dh, _edx[2]; u8_t _esi[4]; u8_t _edi[4]; u8_t _ebp[4]; } b; }; #ifdef _SYSTEM /* Kernel: Registers used in an 8086 interrupt */ EXTERN union reg86 reg86; #endif /* Parameters passed on ioctls to the memory task. */ struct mio_int86 { /* MIOCINT86 */ union reg86 reg86; /* x86 registers as above */ u16_t off, seg; /* Address of kernel buffer */ void *buf; /* User data buffer */ size_t len; /* Size of user buffer */ }; struct mio_ldt86 { /* MIOCGLDT86, MIOCSLDT86 */ size_t idx; /* Index in process' LDT */ u16_t entry[4]; /* One LDT entry to get or set. */ }; /* The header is the master header used by the library. * All the C files in the lib subdirectories include it. */ #ifndef _LIB_H #define _LIB_H /* First come the defines. */ #define _POSIX_SOURCE 1 /* tell headers to include POSIX stuff */ #define _MINIX 1 /* tell headers to include MINIX stuff */ /* The following are so basic, all the lib files get them automatically. */ #include /* must be first */ #include #include #include #include #include #include #include #define MM 0 #define FS 1 _PROTOTYPE( int __execve, (const char *_path, char *const _argv[], char *const _envp[], int _nargs, int _nenvps) ); _PROTOTYPE( int _syscall, (int _who, int _syscallnr, message *_msgptr) ); _PROTOTYPE( void _loadname, (const char *_name, message *_msgptr) ); _PROTOTYPE( int _len, (const char *_s) ); _PROTOTYPE( void panic, (const char *_message, int _errnum) ); _PROTOTYPE( int _sendrec, (int _src_dest, message *_m_ptr) ); _PROTOTYPE( void _begsig, (int _dummy) ); #endif /* _LIB_H */ /* The header defines some basic sizes, both of the language types * (e.g., the number of bits in an integer), and of the operating system (e.g. * the number of characters in a file name. */ #ifndef _LIMITS_H #define _LIMITS_H /* Definitions about chars (8 bits in MINIX, and signed). */ #define CHAR_BIT 8 /* # bits in a char */ #define CHAR_MIN -128 /* minimum value of a char */ #define CHAR_MAX 127 /* maximum value of a char */ #define SCHAR_MIN -128 /* minimum value of a signed char */ #define SCHAR_MAX 127 /* maximum value of a signed char */ #define UCHAR_MAX 255 /* maximum value of an unsigned char */ #define MB_LEN_MAX 1 /* maximum length of a multibyte char */ /* Definitions about shorts (16 bits in MINIX). */ #define SHRT_MIN (-32767-1) /* minimum value of a short */ #define SHRT_MAX 32767 /* maximum value of a short */ #define USHRT_MAX 0xFFFF /* maximum value of unsigned short */ /* _EM_WSIZE is a compiler-generated symbol giving the word size in bytes. */ #if _EM_WSIZE == 2 #define INT_MIN (-32767-1) /* minimum value of a 16-bit int */ #define INT_MAX 32767 /* maximum value of a 16-bit int */ #define UINT_MAX 0xFFFF /* maximum value of an unsigned 16-bit int */ #endif #if _EM_WSIZE == 4 #define INT_MIN (-2147483647-1) /* minimum value of a 32-bit int */ #define INT_MAX 2147483647 /* maximum value of a 32-bit int */ #define UINT_MAX 0xFFFFFFFF /* maximum value of an unsigned 32-bit int */ #endif /*Definitions about longs (32 bits in MINIX). */ #define LONG_MIN (-2147483647L-1)/* minimum value of a long */ #define LONG_MAX 2147483647L /* maximum value of a long */ #define ULONG_MAX 0xFFFFFFFFL /* maximum value of an unsigned long */ /* Minimum sizes required by the POSIX P1003.1 standard (Table 2-3). */ #ifdef _POSIX_SOURCE /* these are only visible for POSIX */ #define _POSIX_ARG_MAX 4096 /* exec() may have 4K worth of args */ #define _POSIX_CHILD_MAX 6 /* a process may have 6 children */ #define _POSIX_LINK_MAX 8 /* a file may have 8 links */ #define _POSIX_MAX_CANON 255 /* size of the canonical input queue */ #define _POSIX_MAX_INPUT 255 /* you can type 255 chars ahead */ #define _POSIX_NAME_MAX 14 /* a file name may have 14 chars */ #define _POSIX_NGROUPS_MAX 0 /* supplementary group IDs are optional */ #define _POSIX_OPEN_MAX 16 /* a process may have 16 files open */ #define _POSIX_PATH_MAX 255 /* a pathname may contain 255 chars */ #define _POSIX_PIPE_BUF 512 /* pipes writes of 512 bytes must be atomic */ #define _POSIX_STREAM_MAX 8 /* at least 8 FILEs can be open at once */ #define _POSIX_TZNAME_MAX 3 /* time zone names can be at least 3 chars */ #define _POSIX_SSIZE_MAX 32767 /* read() must support 32767 byte reads */ /* Values actually implemented by MINIX (Tables 2-4, 2-5, 2-6, and 2-7). */ /* Some of these old names had better be defined when not POSIX. */ #define _NO_LIMIT 100 /* arbitrary number; limit not enforced */ #define NGROUPS_MAX 0 /* supplemental group IDs not available */ #if _EM_WSIZE > 2 #define ARG_MAX 16384 /* # bytes of args + environ for exec() */ #else #define ARG_MAX 4096 /* args + environ on small machines */ #endif #define CHILD_MAX _NO_LIMIT /* MINIX does not limit children */ #define OPEN_MAX 20 /* # open files a process may have */ #define LINK_MAX 127 /* # links a file may have */ #define MAX_CANON 255 /* size of the canonical input queue */ #define MAX_INPUT 255 /* size of the type-ahead buffer */ #define NAME_MAX 14 /* # chars in a file name */ #define PATH_MAX 255 /* # chars in a path name */ #define PIPE_BUF 7168 /* # bytes in atomic write to a pipe */ #define STREAM_MAX 20 /* must be the same as FOPEN_MAX in stdio.h */ #define TZNAME_MAX 3 /* maximum bytes in a time zone name is 3 */ #define SSIZE_MAX 32767 /* max defined byte count for read() */ #endif /* _POSIX_SOURCE */ #endif /* _LIMITS_H */ /* The header is used to custom tailor currency symbols, decimal * points, and other items to the local style. It is ANSI's attempt at * avoiding cultural imperialism. The locale given below is for C. */ #ifndef _LOCALE_H #define _LOCALE_H #ifndef _ANSI_H #include #endif struct lconv { char *decimal_point; /* "." */ char *thousands_sep; /* "" */ char *grouping; /* "" */ char *int_curr_symbol; /* "" */ char *currency_symbol; /* "" */ char *mon_decimal_point; /* "" */ char *mon_thousands_sep; /* "" */ char *mon_grouping; /* "" */ char *positive_sign; /* "" */ char *negative_sign; /* "" */ char int_frac_digits; /* CHAR_MAX */ char frac_digits; /* CHAR_MAX */ char p_cs_precedes; /* CHAR_MAX */ char p_sep_by_space; /* CHAR_MAX */ char n_cs_precedes; /* CHAR_MAX */ char n_sep_by_space; /* CHAR_MAX */ char p_sign_posn; /* CHAR_MAX */ char n_sign_posn; /* CHAR_MAX */ }; #define NULL ((void *)0) #define LC_ALL 1 #define LC_COLLATE 2 #define LC_CTYPE 3 #define LC_MONETARY 4 #define LC_NUMERIC 5 #define LC_TIME 6 /* Function Prototypes. */ _PROTOTYPE( char *setlocale, (int _category, const char *_locale) ); _PROTOTYPE( struct lconv *localeconv, (void) ); #endif /* _LOCALE_H */ /* The header contains prototypes for mathematical functions. */ #ifndef _MATH_H #define _MATH_H #ifndef _ANSI_H #include #endif #define HUGE_VAL (__huge_val()) /* may be infinity */ /* Function Prototypes. */ _PROTOTYPE( double __huge_val, (void) ); _PROTOTYPE( int __IsNan, (double _x) ); _PROTOTYPE( double acos, (double _x) ); _PROTOTYPE( double asin, (double _x) ); _PROTOTYPE( double atan, (double _x) ); _PROTOTYPE( double atan2, (double _y, double _x) ); _PROTOTYPE( double ceil, (double _x) ); _PROTOTYPE( double cos, (double _x) ); _PROTOTYPE( double cosh, (double _x) ); _PROTOTYPE( double exp, (double _x) ); _PROTOTYPE( double fabs, (double _x) ); _PROTOTYPE( double floor, (double _x) ); _PROTOTYPE( double fmod, (double _x, double _y) ); _PROTOTYPE( double frexp, (double _x, int *_exp) ); _PROTOTYPE( double ldexp, (double _x, int _exp) ); _PROTOTYPE( double log, (double _x) ); _PROTOTYPE( double log10, (double _x) ); _PROTOTYPE( double modf, (double _x, double *_iptr) ); _PROTOTYPE( double pow, (double _x, double _y) ); _PROTOTYPE( double sin, (double _x) ); _PROTOTYPE( double sinh, (double _x) ); _PROTOTYPE( double sqrt, (double _x) ); _PROTOTYPE( double tan, (double _x) ); _PROTOTYPE( double tanh, (double _x) ); #endif /* _MATH_H */ /* * mathconst.h - mathematic constants */ /* $Header: mathconst.h,v 1.3 89/12/18 13:59:33 eck Exp $ */ #ifndef _MATHCONST_H #define _MATHCONST_H /* Some constants (Hart & Cheney) */ #define M_PI 3.14159265358979323846264338327950288 #define M_2PI 6.28318530717958647692528676655900576 #define M_3PI_4 2.35619449019234492884698253745962716 #define M_PI_2 1.57079632679489661923132169163975144 #define M_3PI_8 1.17809724509617246442349126872981358 #define M_PI_4 0.78539816339744830961566084581987572 #define M_PI_8 0.39269908169872415480783042290993786 #define M_1_PI 0.31830988618379067153776752674502872 #define M_2_PI 0.63661977236758134307553505349005744 #define M_4_PI 1.27323954473516268615107010698011488 #define M_E 2.71828182845904523536028747135266250 #define M_LOG2E 1.44269504088896340735992468100189213 #define M_LOG10E 0.43429448190325182765112891891660508 #define M_LN2 0.69314718055994530941723212145817657 #define M_LN10 2.30258509299404568401799145468436421 #define M_SQRT2 1.41421356237309504880168872420969808 #define M_1_SQRT2 0.70710678118654752440084436210484904 #define M_EULER 0.57721566490153286060651209008240243 #endif /* _MATHCONST_H */ . ..swap.hcallnr.hcdrom.hcom.hconfig.hconst.hdl_eth.hfslib.hjmp_buf.hkeymap.hminlib.hpartition.hsound.hsyslib.htype.hu64.h/* minix/swap.h Defines the super block of swap partitions and some useful constants. Created: Aug 2, 1992 by Philip Homburg */ #ifndef _MINIX__SWAP_H #define _MINIX__SWAP_H /* Two possible layouts for a partition with swapspace: * * Sector Swap partition FS+swap partition * * 0 - 1 bootblock bootblock * 2 swap header FS header * 3 blank swap header * 4 - m swapspace file system * m+1 - n - swapspace */ #define SWAP_MAGIC0 0x9D #define SWAP_MAGIC1 0xC3 #define SWAP_MAGIC2 0x01 #define SWAP_MAGIC3 0x82 typedef struct swap_hdr { u8_t sh_magic[4]; u8_t sh_version; u8_t sh_dummy[3]; u32_t sh_offset; u32_t sh_swapsize; i32_t sh_priority; } swap_hdr_t; #define SWAP_BOOTOFF 1024 #define SWAP_OFFSET 2048 #define OPTSWAP_BOOTOFF (1024+512) #define SH_VERSION 1 #define SH_PRIORITY 0 #endif /* _MINIX__SWAP_H */ /* * $PchId: swap.h,v 1.6 1996/04/10 20:25:48 philip Exp $ */ #define NCALLS 78 /* number of system calls allowed */ #define EXIT 1 #define FORK 2 #define READ 3 #define WRITE 4 #define OPEN 5 #define CLOSE 6 #define WAIT 7 #define CREAT 8 #define LINK 9 #define UNLINK 10 #define WAITPID 11 #define CHDIR 12 #define TIME 13 #define MKNOD 14 #define CHMOD 15 #define CHOWN 16 #define BRK 17 #define STAT 18 #define LSEEK 19 #define GETPID 20 #define MOUNT 21 #define UMOUNT 22 #define SETUID 23 #define GETUID 24 #define STIME 25 #define PTRACE 26 #define ALARM 27 #define FSTAT 28 #define PAUSE 29 #define UTIME 30 #define ACCESS 33 #define SYNC 36 #define KILL 37 #define RENAME 38 #define MKDIR 39 #define RMDIR 40 #define DUP 41 #define PIPE 42 #define TIMES 43 #define SETGID 46 #define GETGID 47 #define SIGNAL 48 #define IOCTL 54 #define FCNTL 55 #define EXEC 59 #define UMASK 60 #define CHROOT 61 #define SETSID 62 #define GETPGRP 63 /* The following are not system calls, but are processed like them. */ #define KSIG 64 /* kernel detected a signal */ #define UNPAUSE 65 /* to MM or FS: check for EINTR */ #define REVIVE 67 /* to FS: revive a sleeping process */ #define TASK_REPLY 68 /* to FS: reply code from tty task */ /* Posix signal handling. */ #define SIGACTION 71 #define SIGSUSPEND 72 #define SIGPENDING 73 #define SIGPROCMASK 74 #define SIGRETURN 75 #define REBOOT 76 #define SVRCTL 77 /* This file contains some structures used by the Mitsumi cdrom driver. * * Feb 13 1995 Author: Michel R. Prevenier */ /* Index into the mss arrays */ #define MINUTES 0 #define SECONDS 1 #define SECTOR 2 struct cd_play_mss { u8_t begin_mss[3]; u8_t end_mss[3]; }; struct cd_play_track { u8_t begin_track; u8_t end_track; }; struct cd_disk_info { u8_t first_track; u8_t last_track; u8_t disk_length_mss[3]; u8_t first_track_mss[3]; }; struct cd_toc_entry { u8_t control_address; u8_t track_nr; u8_t index_nr; u8_t track_time_mss[3]; u8_t reserved; u8_t position_mss[3]; }; /* System calls. */ #define SEND 1 /* function code for sending messages */ #define RECEIVE 2 /* function code for receiving messages */ #define BOTH 3 /* function code for SEND + RECEIVE */ #define ANY 0x7ace /* a magic, invalid process number. * receive(ANY, buf) accepts from any source */ /* Task numbers, function codes and reply codes. */ /* The values of several task numbers depend on whether they or other tasks * are enabled. They are defined as (PREVIOUS_TASK - ENABLE_TASK) in general. * ENABLE_TASK is either 0 or 1, so a task either gets a new number, or gets * the same number as the previous task and is further unused. * The TTY task must always have the most negative number so that it is * initialized first. Many of the TTY function codes are shared with other * tasks. */ #define TTY (DP8390 - 1) /* terminal I/O class */ # define CANCEL 0 /* general req to force a task to cancel */ # define HARD_INT 2 /* fcn code for all hardware interrupts */ # define DEV_READ 3 /* fcn code for reading from tty */ # define DEV_WRITE 4 /* fcn code for writing to tty */ # define DEV_IOCTL 5 /* fcn code for ioctl */ # define DEV_OPEN 6 /* fcn code for opening tty */ # define DEV_CLOSE 7 /* fcn code for closing tty */ # define DEV_SCATTER 8 /* fcn code for writing from a vector */ # define DEV_GATHER 9 /* fcn code for reading into a vector */ # define TTY_SETPGRP 10 /* fcn code for setpgroup */ # define TTY_EXIT 11 /* a process group leader has exited */ # define SUSPEND -998 /* used in interrupts when tty has no data */ #define DP8390 (SB16 - ENABLE_DP8390) /* networking task */ /* Message type for data link layer reqests. */ # define DL_WRITE 3 # define DL_WRITEV 4 # define DL_READ 5 # define DL_READV 6 # define DL_INIT 7 # define DL_STOP 8 # define DL_GETSTAT 9 /* Message type for data link layer replies. */ # define DL_INIT_REPLY 20 # define DL_TASK_REPLY 21 # define DL_PORT m2_i1 # define DL_PROC m2_i2 # define DL_COUNT m2_i3 # define DL_MODE m2_l1 # define DL_CLCK m2_l2 # define DL_ADDR m2_p1 # define DL_STAT m2_l1 /* Bits in 'DL_STAT' field of DL replies. */ # define DL_PACK_SEND 0x01 # define DL_PACK_RECV 0x02 # define DL_READ_IP 0x04 /* Bits in 'DL_MODE' field of DL requests. */ # define DL_NOMODE 0x0 # define DL_PROMISC_REQ 0x2 # define DL_MULTI_REQ 0x4 # define DL_BROAD_REQ 0x8 # define NW_OPEN DEV_OPEN # define NW_CLOSE DEV_CLOSE # define NW_READ DEV_READ # define NW_WRITE DEV_WRITE # define NW_IOCTL DEV_IOCTL # define NW_CANCEL CANCEL #define SB16 (SB16MIXER - ENABLE_SB16) #define SB16MIXER (PRINTER - ENABLE_SB16) /* sb16 & mixer device tasks */ #define PRINTER (CTRLR(NR_CTRLRS-1) - ENABLE_PRINTER) /* printer I/O class */ #define CTRLR(n) (-8 - (n)) /* task number of controller n */ #define SYN_ALRM_TASK -7 /* task to send CLOCK_INT messages */ #define IDLE -6 /* task to run when there's nothing to run */ #define FLOPPY -5 /* floppy disk class */ #define MEM -4 /* /dev/ram, /dev/(k)mem and /dev/null class */ # define NULL_MAJOR 1 /* major device for /dev/null */ # define RAM_DEV 0 /* minor device for /dev/ram */ # define MEM_DEV 1 /* minor device for /dev/mem */ # define KMEM_DEV 2 /* minor device for /dev/kmem */ # define NULL_DEV 3 /* minor device for /dev/null */ #define CLOCK -3 /* clock class */ # define SET_ALARM 1 /* fcn code to CLOCK, set up alarm */ # define GET_TIME 3 /* fcn code to CLOCK, get real time */ # define SET_TIME 4 /* fcn code to CLOCK, set real time */ # define GET_UPTIME 5 /* fcn code to CLOCK, get uptime */ # define SET_SYNC_AL 6 /* fcn code to CLOCK, set up alarm which */ /* times out with a send */ # define REAL_TIME 1 /* reply from CLOCK: here is real time */ # define CLOCK_INT HARD_INT /* this code will only be sent by */ /* SYN_ALRM_TASK to a task that requested a */ /* synchronous alarm */ #define SYSTASK -2 /* internal functions */ # define SYS_XIT 1 /* fcn code for sys_xit(parent, proc) */ # define SYS_GETSP 2 /* fcn code for sys_sp(proc, &new_sp) */ # define SYS_OLDSIG 3 /* fcn code for sys_oldsig(proc, sig) */ # define SYS_FORK 4 /* fcn code for sys_fork(parent, child, pid) */ # define SYS_NEWMAP 5 /* fcn code for sys_newmap(procno, map_ptr) */ # define SYS_COPY 6 /* fcn code for sys_copy(ptr) */ # define SYS_EXEC 7 /* fcn code for sys_exec(procno, new_sp) */ # define SYS_TIMES 8 /* fcn code for sys_times(procno, bufptr) */ # define SYS_ABORT 9 /* fcn code for sys_abort() */ # define SYS_KILL 10 /* fcn code for sys_kill(proc, sig) */ # define SYS_UMAP 11 /* fcn code for sys_umap(procno, etc) */ # define SYS_MEM 12 /* fcn code for sys_mem() */ # define SYS_TRACE 13 /* fcn code for sys_trace(req,pid,addr,data) */ # define SYS_VCOPY 14 /* fnc code for sys_vcopy(src_proc, dest_proc, vcopy_s, vcopy_ptr) */ # define SYS_SENDSIG 15 /* fcn code for sys_sendsig(&sigmsg) */ # define SYS_SIGRETURN 16 /* fcn code for sys_sigreturn(&sigmsg) */ # define SYS_ENDSIG 17 /* fcn code for sys_endsig(procno) */ # define SYS_GETMAP 18 /* fcn code for sys_getmap(procno, map_ptr) */ # define SYS_SYSCTL 19 /* fcn code for sys_sysctl(proc, req, argp) */ # define SYS_PUTS 20 /* fcn code for sys_puts(count, buf) */ # define SYS_FINDPROC 21 /* fcn code for sys_findproc(name, &task_nr, flags) */ #define HARDWARE -1 /* used as source on interrupt generated msgs*/ /* Names of message fields for messages to CLOCK task. */ #define DELTA_TICKS m6_l1 /* alarm interval in clock ticks */ #define FUNC_TO_CALL m6_f1 /* pointer to function to call */ #define NEW_TIME m6_l1 /* value to set clock to (SET_TIME) */ #define CLOCK_PROC_NR m6_i1 /* which proc (or task) wants the alarm? */ #define SECONDS_LEFT m6_l1 /* how many seconds were remaining */ /* Names of message fields used for messages to block and character tasks. */ #define DEVICE m2_i1 /* major-minor device */ #define PROC_NR m2_i2 /* which (proc) wants I/O? */ #define COUNT m2_i3 /* how many bytes to transfer */ #define REQUEST m2_i3 /* ioctl request code */ #define POSITION m2_l1 /* file offset */ #define ADDRESS m2_p1 /* core buffer address */ /* Names of message fields for messages to TTY task. */ #define TTY_LINE DEVICE /* message parameter: terminal line */ #define TTY_REQUEST COUNT /* message parameter: ioctl request code */ #define TTY_SPEK POSITION /* message parameter: ioctl speed, erasing */ #define TTY_FLAGS m2_l2 /* message parameter: ioctl tty mode */ #define TTY_PGRP m2_i3 /* message parameter: process group */ /* Names of the message fields for QIC 02 status reply from tape driver */ #define TAPE_STAT0 m2_l1 #define TAPE_STAT1 m2_l2 /* Names of messages fields used in reply messages from tasks. */ #define REP_PROC_NR m2_i1 /* # of proc on whose behalf I/O was done */ #define REP_STATUS m2_i2 /* bytes transferred or error number */ /* Names of fields for copy message to SYSTASK. */ #define SRC_SPACE m5_c1 /* T or D space (stack is also D) */ #define SRC_PROC_NR m5_i1 /* process to copy from */ #define SRC_BUFFER m5_l1 /* virtual address where data come from */ #define DST_SPACE m5_c2 /* T or D space (stack is also D) */ #define DST_PROC_NR m5_i2 /* process to copy to */ #define DST_BUFFER m5_l2 /* virtual address where data go to */ #define COPY_BYTES m5_l3 /* number of bytes to copy */ /* Field names for accounting, SYSTASK and miscellaneous. */ #define USER_TIME m4_l1 /* user time consumed by process */ #define SYSTEM_TIME m4_l2 /* system time consumed by process */ #define CHILD_UTIME m4_l3 /* user time consumed by process' children */ #define CHILD_STIME m4_l4 /* sys time consumed by process' children */ #define BOOT_TICKS m4_l5 /* number of clock ticks since boot time */ #define PROC1 m1_i1 /* indicates a process */ #define PROC2 m1_i2 /* indicates a procnpess */ #define PID m1_i3 /* process id passed from MM to kernel */ #define STACK_PTR m1_p1 /* used for stack ptr in sys_exec, sys_getsp */ #define PR m6_i1 /* process number for sys_sig */ #define SIGNUM m6_i2 /* signal number for sys_sig */ #define FUNC m6_f1 /* function pointer for sys_sig */ #define MEM_PTR m1_p1 /* tells where memory map is for sys_newmap */ #define NAME_PTR m1_p2 /* tells where program name is for dmp */ #define IP_PTR m1_p3 /* initial value for ip after exec */ #define SIG_PROC m2_i1 /* process number for inform */ #define SIG_MAP m2_l1 /* used by kernel for passing signal bit map */ #define SIG_MSG_PTR m1_i1 /* pointer to info to build sig catch stack */ #define SIG_CTXT_PTR m1_p1 /* pointer to info to restore signal context */ #ifndef _CONFIG_H #define _CONFIG_H /* Minix release and version numbers. */ #define OS_RELEASE "2" #define OS_VERSION "0.3" /* This file sets configuration parameters for the MINIX kernel, FS, and MM. * It is divided up into two main sections. The first section contains * user-settable parameters. In the second section, various internal system * parameters are set based on the user-settable parameters. */ /*===========================================================================* * This section contains user-settable parameters * *===========================================================================*/ #define MACHINE IBM_PC /* Must be one of the names listed below */ #define IBM_PC 1 /* any 8088 or 80x86-based system */ #define SUN_4 40 /* any Sun SPARC-based system */ #define SUN_4_60 40 /* Sun-4/60 (aka SparcStation 1 or Campus) */ #define ATARI 60 /* ATARI ST/STe/TT (68000/68030) */ #define AMIGA 61 /* Commodore Amiga (68000) */ #define MACINTOSH 62 /* Apple Macintosh (68000) */ /* Word size in bytes (a constant equal to sizeof(int)). */ #if __ACK__ #define _WORD_SIZE _EM_WSIZE #endif /* Number of slots in the process table for user processes. */ #define NR_PROCS 32 /* The buffer cache should be made as large as you can afford. */ #if (MACHINE == IBM_PC && _WORD_SIZE == 2) #define NR_BUFS 40 /* # blocks in the buffer cache */ #define NR_BUF_HASH 64 /* size of buf hash table; MUST BE POWER OF 2*/ #endif #if (MACHINE == IBM_PC && _WORD_SIZE == 4) #define NR_BUFS 80 /* # blocks in the buffer cache */ #define NR_BUF_HASH 128 /* size of buf hash table; MUST BE POWER OF 2*/ #endif #if (MACHINE == SUN_4_60) #define NR_BUFS 512 /* # blocks in the buffer cache (<=1536) */ #define NR_BUF_HASH 512 /* size of buf hash table; MUST BE POWER OF 2*/ #endif /* Defines for kernel configuration. */ #define AUTO_BIOS 0 /* xt_wini.c - use Western's autoconfig BIOS */ #define LINEWRAP 1 /* console.c - wrap lines at column 80 */ #define ALLOW_GAP_MESSAGES 1 /* proc.c - allow messages in the gap between * the end of bss and lowest stack address */ /* Number of controller tasks (/dev/cN device classes). */ #define NR_CTRLRS 2 /* Enable or disable the second level file system cache on the RAM disk. */ #define ENABLE_CACHE2 1 /* Include or exclude device drivers. Set to 1 to include, 0 to exclude. */ #define ENABLE_AT_WINI 1 /* enable AT winchester driver */ #define ENABLE_ATAPI 1 /* add ATAPI support to AT driver */ #define ENABLE_BIOS_WINI 1 /* enable BIOS winchester driver */ #define ENABLE_ESDI_WINI 1 /* enable ESDI winchester driver */ #define ENABLE_XT_WINI 0 /* enable XT winchester driver */ #define ENABLE_AHA1540_SCSI 1 /* enable Adaptec 1540 SCSI driver */ #define ENABLE_FATFILE 1 /* enable FAT file virtual disk driver */ #define ENABLE_DOSFILE 1 /* enable DOS file virtual disk driver */ #define ENABLE_SB16 0 /* enable Soundblaster audio driver */ #define ENABLE_PRINTER 0 /* enable printer driver */ #define ENABLE_USERBIOS 0 /* enable user mode BIOS calls */ /* DMA_SECTORS may be increased to speed up DMA based drivers. */ #define DMA_SECTORS 1 /* DMA buffer size (must be >= 1) */ /* Enable or disable networking drivers. */ #define ENABLE_DP8390 0 /* enable DP8390 ethernet driver */ #define ENABLE_WDETH 1 /* add Western Digital WD80x3 to DP8390 */ #define ENABLE_NE2000 1 /* add Novell NE1000/NE2000 to DP8390 */ #define ENABLE_3C503 1 /* add 3Com Etherlink II (3C503) to DP8390 */ /* Include or exclude backwards compatibility code. */ #define ENABLE_BINCOMPAT 0 /* for binaries using obsolete calls */ #define ENABLE_SRCCOMPAT 0 /* for sources using obsolete calls */ /* NR_CONS, NR_RS_LINES, and NR_PTYS determine the number of terminals the * system can handle. */ #define NR_CONS 2 /* # system consoles (1 to 8) */ #define NR_RS_LINES 0 /* # rs232 terminals (0, 1, or 2) */ #define NR_PTYS 0 /* # pseudo terminals (0 to 64) */ /*===========================================================================* * There are no user-settable parameters after this line * *===========================================================================*/ /* Set the CHIP type based on the machine selected. The symbol CHIP is actually * indicative of more than just the CPU. For example, machines for which * CHIP == INTEL are expected to have 8259A interrrupt controllers and the * other properties of IBM PC/XT/AT/386 types machines in general. */ #define INTEL 1 /* CHIP type for PC, XT, AT, 386 and clones */ #define M68000 2 /* CHIP type for Atari, Amiga, Macintosh */ #define SPARC 3 /* CHIP type for SUN-4 (e.g. SPARCstation) */ /* Set the FP_FORMAT type based on the machine selected, either hw or sw */ #define FP_NONE 0 /* no floating point support */ #define FP_IEEE 1 /* conform IEEE floating point standard */ #if (MACHINE == IBM_PC) #define CHIP INTEL #endif #if (MACHINE == ATARI) || (MACHINE == AMIGA) || (MACHINE == MACINTOSH) #define CHIP M68000 #endif #if (MACHINE == SUN_4) || (MACHINE == SUN_4_60) #define CHIP SPARC #define FP_FORMAT FP_IEEE #endif #if (MACHINE == ATARI) || (MACHINE == SUN_4) #define ASKDEV 1 /* ask for boot device */ #define FASTLOAD 1 /* use multiple block transfers to init ram */ #endif #if (ATARI_TYPE == TT) /* and all other 68030's */ #define FPP #endif #ifndef FP_FORMAT #define FP_FORMAT FP_NONE #endif #ifndef MACHINE error "In please define MACHINE" #endif #ifndef CHIP error "In please define MACHINE to have a legal value" #endif #if (MACHINE == 0) error "MACHINE has incorrect value (0)" #endif #endif /* _CONFIG_H */ /* Copyright (C) 2001 by Prentice-Hall, Inc. See the copyright notice in * the file /usr/src/LICENSE. */ #ifndef CHIP #error CHIP is not defined #endif #define EXTERN extern /* used in *.h files */ #define PRIVATE static /* PRIVATE x limits the scope of x */ #define PUBLIC /* PUBLIC is the opposite of PRIVATE */ #define FORWARD static /* some compilers require this to be 'static'*/ #define TRUE 1 /* used for turning integers into Booleans */ #define FALSE 0 /* used for turning integers into Booleans */ #define HZ 60 /* clock freq (software settable on IBM-PC) */ #define BLOCK_SIZE 1024 /* # bytes in a disk block */ #define SUPER_USER (uid_t) 0 /* uid_t of superuser */ #define MAJOR 8 /* major device = (dev>>MAJOR) & 0377 */ #define MINOR 0 /* minor device = (dev>>MINOR) & 0377 */ #define NULL ((void *)0) /* null pointer */ #define CPVEC_NR 16 /* max # of entries in a SYS_VCOPY request */ #define NR_IOREQS MIN(NR_BUFS, 64) /* maximum number of entries in an iorequest */ #define NR_SEGS 3 /* # segments per process */ #define T 0 /* proc[i].mem_map[T] is for text */ #define D 1 /* proc[i].mem_map[D] is for data */ #define S 2 /* proc[i].mem_map[S] is for stack */ /* Process numbers of some important processes. */ #define MM_PROC_NR 0 /* process number of memory manager */ #define FS_PROC_NR 1 /* process number of file system */ #define INIT_PROC_NR 2 /* init -- the process that goes multiuser */ #define LOW_USER INIT_PROC_NR /* first user not part of operating system */ /* Miscellaneous */ #define BYTE 0377 /* mask for 8 bits */ #define READING 0 /* copy data to user */ #define WRITING 1 /* copy data from user */ #define NO_NUM 0x8000 /* used as numerical argument to panic() */ #define NIL_PTR (char *) 0 /* generally useful expression */ #define HAVE_SCATTERED_IO 1 /* scattered I/O is now standard */ /* Macros. */ #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) /* Number of tasks. */ #define NR_TASKS (8 + NR_CTRLRS + ENABLE_DP8390 + ENABLE_PRINTER \ + 2 * ENABLE_SB16) /* Memory is allocated in clicks. */ #if (CHIP == INTEL) #define CLICK_SIZE 1024 /* unit in which memory is allocated */ #define CLICK_SHIFT 10 /* log2 of CLICK_SIZE */ #endif #if (CHIP == SPARC) || (CHIP == M68000) #define CLICK_SIZE 4096 /* unit in which memory is alocated */ #define CLICK_SHIFT 12 /* 2log of CLICK_SIZE */ #endif #define ABS -999 /* this process means absolute memory */ /* Flag bits for i_mode in the inode. */ #define I_TYPE 0170000 /* this field gives inode type */ #define I_REGULAR 0100000 /* regular file, not dir or special */ #define I_BLOCK_SPECIAL 0060000 /* block special file */ #define I_DIRECTORY 0040000 /* file is a directory */ #define I_CHAR_SPECIAL 0020000 /* character special file */ #define I_NAMED_PIPE 0010000 /* named pipe (FIFO) */ #define I_SET_UID_BIT 0004000 /* set effective uid_t on exec */ #define I_SET_GID_BIT 0002000 /* set effective gid_t on exec */ #define ALL_MODES 0006777 /* all bits for user, group and others */ #define RWX_MODES 0000777 /* mode bits for RWX only */ #define R_BIT 0000004 /* Rwx protection bit */ #define W_BIT 0000002 /* rWx protection bit */ #define X_BIT 0000001 /* rwX protection bit */ #define I_NOT_ALLOC 0000000 /* this inode is free */ /* Some limits. */ #define MAX_BLOCK_NR ((block_t) 077777777) /* largest block number */ #define HIGHEST_ZONE ((zone_t) 077777777) /* largest zone number */ #define MAX_INODE_NR ((ino_t) 0177777) /* largest inode number */ #define MAX_FILE_POS ((off_t) 037777777777) /* largest legal file offset */ #define NO_BLOCK ((block_t) 0) /* absence of a block number */ #define NO_ENTRY ((ino_t) 0) /* absence of a dir entry */ #define NO_ZONE ((zone_t) 0) /* absence of a zone number */ #define NO_DEV ((dev_t) 0) /* absence of a device numb */ /* The eth_stat struct is used in a DL_GETSTAT request the the ehw_task. */ #ifndef _ETH_HW_H #define _ETH_HW_H typedef struct eth_stat { unsigned long ets_recvErr, /* # receive errors */ ets_sendErr, /* # send error */ ets_OVW, /* # buffer overwrite warnings */ ets_CRCerr, /* # crc errors of read */ ets_frameAll, /* # frames not alligned (# bits % 8 != 0) */ ets_missedP, /* # packets missed due to slow processing */ ets_packetR, /* # packets received */ ets_packetT, /* # packets transmitted */ ets_transDef, /* # transmission defered (Tx was busy) */ ets_collision, /* # collissions */ ets_transAb, /* # Tx aborted due to excess collisions */ ets_carrSense, /* # carrier sense lost */ ets_fifoUnder, /* # FIFO underruns (processor too busy) */ ets_fifoOver, /* # FIFO overruns (processor too busy) */ ets_CDheartbeat, /* # times unable to transmit collision sig*/ ets_OWC; /* # times out of window collision */ } eth_stat_t; #endif /* _ETH_HW_H */ /* V1 and V2 file system disk to/from memory support functions. */ _PROTOTYPE( int bitmapsize, (bit_t _nr_bits) ); _PROTOTYPE( unsigned conv2, (int _norm, int _w) ); _PROTOTYPE( long conv4, (int _norm, long _x) ); _PROTOTYPE( void conv_inode, (struct inode *_rip, d1_inode *_dip, d2_inode *_dip2, int _rw_flag, int _magic) ); _PROTOTYPE( void old_icopy, (struct inode *_rip, d1_inode *_dip, int _direction, int _norm)); _PROTOTYPE( void new_icopy, (struct inode *_rip, d2_inode *_dip, int _direction, int _norm)); /* This file is intended for use by assembly language programs that * need to manipulate a jmp_buf. It may only be used by those systems * for which a jmp_buf is identical to a struct sigcontext. */ #ifndef _JMP_BUF_H #define _JMP_BUF_H #if !defined(CHIP) #include "error, configuration is not known" #endif #if (CHIP == INTEL) #if _WORD_SIZE == 4 #define JB_FLAGS 0 #define JB_MASK 4 #define JB_GS 8 #define JB_FS 10 #define JB_ES 12 #define JB_DS 14 #define JB_DI 16 #define JB_SI 20 #define JB_BP 24 #define JB_ST 28 #define JB_BX 32 #define JB_DX 36 #define JB_CX 40 #define JB_AX 44 #define JB_RETADR 48 #define JB_IP 52 #define JB_CS 56 #define JB_PSW 60 #define JB_SP 64 #define JB_SS 68 #else /* _WORD_SIZE == 2 */ #define JB_FLAGS 0 #define JB_MASK 2 #define JB_ES 6 #define JB_DS 8 #define JB_DI 10 #define JB_SI 12 #define JB_BP 14 #define JB_ST 16 #define JB_BX 18 #define JB_DX 20 #define JB_CX 22 #define JB_AX 24 #define JB_RETADR 26 #define JB_IP 28 #define JB_CS 30 #define JB_PSW 32 #define JB_SP 34 #define JB_SS 36 #endif /* _WORD_SIZE == 2 */ #else /* !(CHIP == INTEL) */ #if (CHIP == M68000) #define JB_FLAGS 0 #define JB_MASK 2 #define JB_RETREG 6 #define JB_D1 10 #define JB_D2 14 #define JB_D3 18 #define JB_D4 22 #define JB_D5 26 #define JB_D6 20 #define JB_D7 34 #define JB_A0 38 #define JB_A1 42 #define JB_A2 46 #define JB_A3 50 #define JB_A4 54 #define JB_A5 58 #define JB_A6 62 #define JB_SP 66 #define JB_PC 70 #define JB_PSW 74 #else /* !(CHIP == INTEL) && !(CHIP == M68000) */ #include "error, CHIP is not supported" #endif /* (CHIP == INTEL) */ /* Defines from C headers needed in assembly code. The headers have too * much C stuff to used directly. */ #define SIG_BLOCK 0 /* must agree with */ #define SC_SIGCONTEXT 2 /* must agree with */ #define SC_NOREGLOCALS 4 /* must agree with */ #endif /* _JMP_BUF_H */ /* keymap.h - defines for keymapping Author: Marcus Hampel */ #ifndef _SYS__KEYMAP_H #define _SYS__KEYMAP_H #define C(c) ((c) & 0x1F) /* Map to control code */ #define A(c) ((c) | 0x80) /* Set eight bit (ALT) */ #define CA(c) A(C(c)) /* Control-Alt */ #define L(c) ((c) | HASCAPS) /* Add "Caps Lock has effect" attribute */ #define EXT 0x0100 /* Normal function keys */ #define CTRL 0x0200 /* Control key */ #define SHIFT 0x0400 /* Shift key */ #define ALT 0x0800 /* Alternate key */ #define EXTKEY 0x1000 /* extended keycode */ #define HASCAPS 0x8000 /* Caps Lock has effect */ /* Numeric keypad */ #define HOME (0x01 + EXT) #define END (0x02 + EXT) #define UP (0x03 + EXT) #define DOWN (0x04 + EXT) #define LEFT (0x05 + EXT) #define RIGHT (0x06 + EXT) #define PGUP (0x07 + EXT) #define PGDN (0x08 + EXT) #define MID (0x09 + EXT) #define NMIN (0x0A + EXT) #define PLUS (0x0B + EXT) #define INSRT (0x0C + EXT) /* Alt + Numeric keypad */ #define AHOME (0x01 + ALT) #define AEND (0x02 + ALT) #define AUP (0x03 + ALT) #define ADOWN (0x04 + ALT) #define ALEFT (0x05 + ALT) #define ARIGHT (0x06 + ALT) #define APGUP (0x07 + ALT) #define APGDN (0x08 + ALT) #define AMID (0x09 + ALT) #define ANMIN (0x0A + ALT) #define APLUS (0x0B + ALT) #define AINSRT (0x0C + ALT) /* Ctrl + Numeric keypad */ #define CHOME (0x01 + CTRL) #define CEND (0x02 + CTRL) #define CUP (0x03 + CTRL) #define CDOWN (0x04 + CTRL) #define CLEFT (0x05 + CTRL) #define CRIGHT (0x06 + CTRL) #define CPGUP (0x07 + CTRL) #define CPGDN (0x08 + CTRL) #define CMID (0x09 + CTRL) #define CNMIN (0x0A + CTRL) #define CPLUS (0x0B + CTRL) #define CINSRT (0x0C + CTRL) /* Lock keys */ #define CALOCK (0x0D + EXT) /* caps lock */ #define NLOCK (0x0E + EXT) /* number lock */ #define SLOCK (0x0F + EXT) /* scroll lock */ /* Function keys */ #define F1 (0x10 + EXT) #define F2 (0x11 + EXT) #define F3 (0x12 + EXT) #define F4 (0x13 + EXT) #define F5 (0x14 + EXT) #define F6 (0x15 + EXT) #define F7 (0x16 + EXT) #define F8 (0x17 + EXT) #define F9 (0x18 + EXT) #define F10 (0x19 + EXT) #define F11 (0x1A + EXT) #define F12 (0x1B + EXT) /* Alt+Fn */ #define AF1 (0x10 + ALT) #define AF2 (0x11 + ALT) #define AF3 (0x12 + ALT) #define AF4 (0x13 + ALT) #define AF5 (0x14 + ALT) #define AF6 (0x15 + ALT) #define AF7 (0x16 + ALT) #define AF8 (0x17 + ALT) #define AF9 (0x18 + ALT) #define AF10 (0x19 + ALT) #define AF11 (0x1A + ALT) #define AF12 (0x1B + ALT) /* Ctrl+Fn */ #define CF1 (0x10 + CTRL) #define CF2 (0x11 + CTRL) #define CF3 (0x12 + CTRL) #define CF4 (0x13 + CTRL) #define CF5 (0x14 + CTRL) #define CF6 (0x15 + CTRL) #define CF7 (0x16 + CTRL) #define CF8 (0x17 + CTRL) #define CF9 (0x18 + CTRL) #define CF10 (0x19 + CTRL) #define CF11 (0x1A + CTRL) #define CF12 (0x1B + CTRL) /* Shift+Fn */ #define SF1 (0x10 + SHIFT) #define SF2 (0x11 + SHIFT) #define SF3 (0x12 + SHIFT) #define SF4 (0x13 + SHIFT) #define SF5 (0x14 + SHIFT) #define SF6 (0x15 + SHIFT) #define SF7 (0x16 + SHIFT) #define SF8 (0x17 + SHIFT) #define SF9 (0x18 + SHIFT) #define SF10 (0x19 + SHIFT) #define SF11 (0x1A + SHIFT) #define SF12 (0x1B + SHIFT) /* Alt+Shift+Fn */ #define ASF1 (0x10 + ALT + SHIFT) #define ASF2 (0x11 + ALT + SHIFT) #define ASF3 (0x12 + ALT + SHIFT) #define ASF4 (0x13 + ALT + SHIFT) #define ASF5 (0x14 + ALT + SHIFT) #define ASF6 (0x15 + ALT + SHIFT) #define ASF7 (0x16 + ALT + SHIFT) #define ASF8 (0x17 + ALT + SHIFT) #define ASF9 (0x18 + ALT + SHIFT) #define ASF10 (0x19 + ALT + SHIFT) #define ASF11 (0x1A + ALT + SHIFT) #define ASF12 (0x1B + ALT + SHIFT) #define MAP_COLS 6 /* Number of columns in keymap */ #define NR_SCAN_CODES 0x80 /* Number of scan codes (rows in keymap) */ typedef unsigned short keymap_t[NR_SCAN_CODES * MAP_COLS]; #define KEY_MAGIC "KMAZ" /* Magic number of keymap file */ #endif /* _SYS__KEYMAP_H */ #ifndef _MINLIB #define _MINLIB #ifndef _ANSI_H #include #endif /* Miscellaneous BSD. */ _PROTOTYPE(void swab, (char *_from, char *_to, int _count)); _PROTOTYPE(char *itoa, (int _n)); _PROTOTYPE(char *getpass, (const char *_prompt)); /* Miscellaneous MINIX. */ _PROTOTYPE(void std_err, (char *_s)); _PROTOTYPE(void prints, (const char *_s, ...)); _PROTOTYPE(int fsversion, (char *_dev, char *_prog)); _PROTOTYPE(int getprocessor, (void)); _PROTOTYPE(int load_mtab, (char *_prog_name)); _PROTOTYPE(int rewrite_mtab, (char *_prog_name)); _PROTOTYPE(int get_mtab_entry, (char *_s1, char *_s2, char *_s3, char *_s4)); _PROTOTYPE(int put_mtab_entry, (char *_s1, char *_s2, char *_s3, char *_s4)); #endif /* minix/partition.h Author: Kees J. Bot * 7 Dec 1995 * Place of a partition on disk and the disk geometry, * for use with the DIOCGETP and DIOCSETP ioctl's. */ #ifndef _MINIX__PARTITION_H #define _MINIX__PARTITION_H #ifndef _TYPES_H #include #endif struct partition { u64_t base; /* byte offset to the partition start */ u64_t size; /* number of bytes in the partition */ unsigned cylinders; /* disk geometry */ unsigned heads; unsigned sectors; }; #endif /* _MINIX__PARTITION_H */ /* Definitions used by /dev/audio and /dev/mixer. * * Feb 13 1995 Author: Michel R. Prevenier */ #ifndef SOUND_H #define SOUND_H /* ------- Mixer stuff ------- */ /* Available devices */ enum Device { Master, /* Master volume */ Dac, /* DSP, digitized sound */ Fm, /* Fm synthesized sound */ Cd, /* Compact */ Line, /* Line in */ Mic, /* Microphone */ Speaker, /* Pc speaker */ Treble, /* Treble */ Bass /* Bass */ }; enum InputState { ON, OFF }; /* Volume levels range from 0 to 31, bass & treble range from 0 to 15 */ struct volume_level { enum Device device; int left; int right; }; struct inout_ctrl { enum Device device; enum InputState left; enum InputState right; }; #endif /* SOUND_H */ /* Prototypes for system library functions. */ #ifndef _SYSLIB_H #define _SYSLIB_H #ifndef _TYPES_H #include #endif /* Hide names to avoid name space pollution. */ #define sendrec _sendrec #define receive _receive #define send _send /* Minix user+system library. */ _PROTOTYPE( int printf, (const char *_fmt, ...) ); _PROTOTYPE( void putk, (int _c) ); _PROTOTYPE( int sendrec, (int _src_dest, message *_m_ptr) ); _PROTOTYPE( int _taskcall, (int _who, int _syscallnr, message *_msgptr) ); /* Minix system library. */ _PROTOTYPE( int receive, (int _src, message *_m_ptr) ); _PROTOTYPE( int send, (int _dest, message *_m_ptr) ); _PROTOTYPE( int sys_abort, (int _how, ...) ); _PROTOTYPE( int sys_adjmap, (int _proc, struct mem_map *_ptr, vir_clicks _data_clicks, vir_clicks _sp) ); _PROTOTYPE( int sys_copy, (int _src_proc, int _src_seg, phys_bytes _src_vir, int _dst_proc, int _dst_seg, phys_bytes _dst_vir, phys_bytes _bytes)); _PROTOTYPE( int sys_exec, (int _proc, char *_ptr, int _traced, char *_aout, vir_bytes _initpc) ); _PROTOTYPE( int sys_execmap, (int _proc, struct mem_map *_ptr) ); _PROTOTYPE( int sys_fork, (int _parent, int _child, int _pid) ); _PROTOTYPE( int sys_getsp, (int _proc, vir_bytes *_newsp) ); _PROTOTYPE( int sys_newmap, (int _proc, struct mem_map *_ptr) ); _PROTOTYPE( int sys_getmap, (int _proc, struct mem_map *_ptr) ); _PROTOTYPE( int sys_sendsig, (int _proc, struct sigmsg *_ptr) ); _PROTOTYPE( int sys_oldsig, (int _proc, int _sig, sighandler_t _sighandler)); _PROTOTYPE( int sys_endsig, (int _proc) ); _PROTOTYPE( int sys_sigreturn, (int _proc, vir_bytes _scp, int _flags) ); _PROTOTYPE( int sys_trace, (int _req, int _procnr, long _addr, long *_data_p)); _PROTOTYPE( int sys_xit, (int _parent, int _proc) ); _PROTOTYPE( int sys_kill, (int _proc, int _sig) ); _PROTOTYPE( int sys_times, (int _proc, clock_t _ptr[5]) ); _PROTOTYPE( int sys_sysctl, (int _proc, int _request, int priv, vir_bytes _argp) ); _PROTOTYPE( int sys_findproc, (char *_name, int *_proc_nr, int _flags) ); #endif /* _SYSLIB_H */ #ifndef _TYPE_H #define _TYPE_H #ifndef _TYPES_H #include #endif /* Type definitions. */ typedef unsigned int vir_clicks; /* virtual addresses and lengths in clicks */ typedef unsigned long phys_bytes;/* physical addresses and lengths in bytes */ typedef unsigned int phys_clicks;/* physical addresses and lengths in clicks */ #if (CHIP == INTEL) typedef unsigned int vir_bytes; /* virtual addresses and lengths in bytes */ #endif #if (CHIP == M68000) typedef unsigned long vir_bytes;/* virtual addresses and lengths in bytes */ #endif #if (CHIP == SPARC) typedef unsigned long vir_bytes;/* virtual addresses and lengths in bytes */ #endif /* Types relating to messages. */ #define M1 1 #define M3 3 #define M4 4 #define M3_STRING 14 typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1; typedef struct {int m2i1, m2i2, m2i3; long m2l1, m2l2; char *m2p1;} mess_2; typedef struct {int m3i1, m3i2; char *m3p1; char m3ca1[M3_STRING];} mess_3; typedef struct {long m4l1, m4l2, m4l3, m4l4, m4l5;} mess_4; typedef struct {char m5c1, m5c2; int m5i1, m5i2; long m5l1, m5l2, m5l3;}mess_5; typedef struct {int m6i1, m6i2, m6i3; long m6l1; sighandler_t m6f1;} mess_6; typedef struct { int m_source; /* who sent the message */ int m_type; /* what kind of message is it */ union { mess_1 m_m1; mess_2 m_m2; mess_3 m_m3; mess_4 m_m4; mess_5 m_m5; mess_6 m_m6; } m_u; } message; /* The following defines provide names for useful members. */ #define m1_i1 m_u.m_m1.m1i1 #define m1_i2 m_u.m_m1.m1i2 #define m1_i3 m_u.m_m1.m1i3 #define m1_p1 m_u.m_m1.m1p1 #define m1_p2 m_u.m_m1.m1p2 #define m1_p3 m_u.m_m1.m1p3 #define m2_i1 m_u.m_m2.m2i1 #define m2_i2 m_u.m_m2.m2i2 #define m2_i3 m_u.m_m2.m2i3 #define m2_l1 m_u.m_m2.m2l1 #define m2_l2 m_u.m_m2.m2l2 #define m2_p1 m_u.m_m2.m2p1 #define m3_i1 m_u.m_m3.m3i1 #define m3_i2 m_u.m_m3.m3i2 #define m3_p1 m_u.m_m3.m3p1 #define m3_ca1 m_u.m_m3.m3ca1 #define m4_l1 m_u.m_m4.m4l1 #define m4_l2 m_u.m_m4.m4l2 #define m4_l3 m_u.m_m4.m4l3 #define m4_l4 m_u.m_m4.m4l4 #define m4_l5 m_u.m_m4.m4l5 #define m5_c1 m_u.m_m5.m5c1 #define m5_c2 m_u.m_m5.m5c2 #define m5_i1 m_u.m_m5.m5i1 #define m5_i2 m_u.m_m5.m5i2 #define m5_l1 m_u.m_m5.m5l1 #define m5_l2 m_u.m_m5.m5l2 #define m5_l3 m_u.m_m5.m5l3 #define m6_i1 m_u.m_m6.m6i1 #define m6_i2 m_u.m_m6.m6i2 #define m6_i3 m_u.m_m6.m6i3 #define m6_l1 m_u.m_m6.m6l1 #define m6_f1 m_u.m_m6.m6f1 struct mem_map { vir_clicks mem_vir; /* virtual address */ phys_clicks mem_phys; /* physical address */ vir_clicks mem_len; /* length */ }; typedef struct { vir_bytes iov_addr; /* address of an I/O buffer */ vir_bytes iov_size; /* sizeof an I/O buffer */ } iovec_t; typedef struct { vir_bytes cpv_src; /* src address of data */ vir_bytes cpv_dst; /* dst address of data */ vir_bytes cpv_size; /* size of data */ } cpvec_t; /* MM passes the address of a structure of this type to KERNEL when * do_sendsig() is invoked as part of the signal catching mechanism. * The structure contain all the information that KERNEL needs to build * the signal stack. */ struct sigmsg { int sm_signo; /* signal number being caught */ unsigned long sm_mask; /* mask to restore when handler returns */ vir_bytes sm_sighandler; /* address of handler */ vir_bytes sm_sigreturn; /* address of _sigreturn in C library */ vir_bytes sm_stkptr; /* user stack pointer */ }; #define MESS_SIZE (sizeof(message)) /* might need usizeof from fs here */ #define NIL_MESS ((message *) 0) struct psinfo { /* information for the ps(1) program */ u16_t nr_tasks, nr_procs; /* NR_TASKS and NR_PROCS constants. */ vir_bytes proc, mproc, fproc; /* addresses of the main process tables. */ }; #endif /* _TYPE_H */ /* minix/u64.h Author: Kees J. Bot * 7 Dec 1995 * Functions to manipulate 64 bit disk addresses. */ #ifndef _MINIX__U64_H #define _MINIX__U64_H #ifndef _TYPES_H #include #endif u64_t add64(u64_t i, u64_t j); u64_t add64u(u64_t i, unsigned j); u64_t add64ul(u64_t i, unsigned long j); u64_t sub64(u64_t i, u64_t j); u64_t sub64u(u64_t i, unsigned j); u64_t sub64ul(u64_t i, unsigned long j); unsigned diff64(u64_t i, u64_t j); u64_t cvu64(unsigned i); u64_t cvul64(unsigned long i); unsigned cv64u(u64_t i); unsigned long cv64ul(u64_t i); unsigned long div64u(u64_t i, unsigned j); unsigned rem64u(u64_t i, unsigned j); u64_t mul64u(unsigned long i, unsigned j); int cmp64(u64_t i, u64_t j); int cmp64u(u64_t i, unsigned j); int cmp64ul(u64_t i, unsigned long j); unsigned long ex64lo(u64_t i); unsigned long ex64hi(u64_t i); u64_t make64(unsigned long lo, unsigned long hi); #endif /* _MINIX__U64_H */ . ..genhton.hnetlib.h...eth_hdr.heth_io.hether.hicmp.hicmp_hdr.hif_ether.hin.hinet.hip_hdr.hip_io.hnameser.hnetdb.honeCsum.hpsip_hdr.hpsip_io.hresolv.hrip.hroute.hsocket.htcp.htcp_hdr.htcp_io.hudp.hudp_hdr.hudp_io.hvjhc.hdhcp.h/* server/ip/gen/eth_hdr.h */ #ifndef __SERVER__IP__GEN__ETH_HDR_H__ #define __SERVER__IP__GEN__ETH_HDR_H__ typedef struct eth_hdr { ether_addr_t eh_dst; ether_addr_t eh_src; ether_type_t eh_proto; } eth_hdr_t; #endif /* __SERVER__IP__GEN__ETH_HDR_H__ */ /* server/gen/ip/eth_io.h */ #ifndef __SERVER__IP__GEN__ETH_IO_H__ #define __SERVER__IP__GEN__ETH_IO_H__ typedef struct nwio_ethopt { u32_t nweo_flags; ether_addr_t nweo_multi, nweo_rem; ether_type_t nweo_type; } nwio_ethopt_t; #define NWEO_NOFLAGS 0x0000L #define NWEO_ACC_MASK 0x0003L # define NWEO_EXCL 0x00000001L # define NWEO_SHARED 0x00000002L # define NWEO_COPY 0x00000003L #define NWEO_LOC_MASK 0x0010L # define NWEO_EN_LOC 0x00000010L # define NWEO_DI_LOC 0x00100000L #define NWEO_BROAD_MASK 0x0020L # define NWEO_EN_BROAD 0x00000020L # define NWEO_DI_BROAD 0x00200000L #define NWEO_MULTI_MASK 0x0040L # define NWEO_EN_MULTI 0x00000040L # define NWEO_DI_MULTI 0x00400000L #define NWEO_PROMISC_MASK 0x0080L # define NWEO_EN_PROMISC 0x00000080L # define NWEO_DI_PROMISC 0x00800000L #define NWEO_REM_MASK 0x0100L # define NWEO_REMSPEC 0x00000100L # define NWEO_REMANY 0x01000000L #define NWEO_TYPE_MASK 0x0200L # define NWEO_TYPESPEC 0x00000200L # define NWEO_TYPEANY 0x02000000L #define NWEO_RW_MASK 0x1000L # define NWEO_RWDATONLY 0x00001000L # define NWEO_RWDATALL 0x10000000L typedef struct eth_stat { unsigned long ets_recvErr, /* # receive errors */ ets_sendErr, /* # send error */ ets_OVW, /* # buffer overwrite warnings, (packets arrive faster than can be processed) */ ets_CRCerr, /* # crc errors of read */ ets_frameAll, /* # frames not alligned (# bits not a mutiple of 8) */ ets_missedP, /* # packets missed due to too slow packet processing */ ets_packetR, /* # packets received */ ets_packetT, /* # packets transmitted */ ets_transDef, /* # transmission defered (there was a transmission of an other station in progress */ ets_collision, /* # collissions */ ets_transAb, /* # transmissions aborted due to accesive collisions */ ets_carrSense, /* # carrier sense lost */ ets_fifoUnder, /* # fifo underruns (processor is too busy) */ ets_fifoOver, /* # fifo overruns (processor is too busy) */ ets_CDheartbeat, /* # times unable to transmit collision signal */ ets_OWC; /* # times out of window collision */ } eth_stat_t; typedef struct nwio_ethstat { ether_addr_t nwes_addr; eth_stat_t nwes_stat; } nwio_ethstat_t; #endif /* __SERVER__IP__GEN__ETH_IO_H__ */ /* server/ip/gen/ether.h */ #ifndef __SERVER__IP__GEN__ETHER_H__ #define __SERVER__IP__GEN__ETHER_H__ #define ETH_MIN_PACK_SIZE 60 #define ETH_MAX_PACK_SIZE 1514 #define ETH_HDR_SIZE 14 typedef struct ether_addr { u8_t ea_addr[6]; } ether_addr_t; typedef u16_t ether_type_t; typedef U16_t Ether_type_t; #define ETH_RARP_PROTO 0x8035 #define ETH_ARP_PROTO 0x806 #define ETH_IP_PROTO 0x800 #endif /* __SERVER__IP__GEN__ETHER_H__ */ /* server/ip/gen/icmp.h */ #ifndef __SERVER__IP__GEN__ICMP_H__ #define __SERVER__IP__GEN__ICMP_H__ #define ICMP_MIN_HDR_LEN 4 #define ICMP_TYPE_ECHO_REPL 0 #define ICMP_TYPE_DST_UNRCH 3 # define ICMP_NET_UNRCH 0 # define ICMP_HOST_UNRCH 1 # define ICMP_PROTOCOL_UNRCH 2 # define ICMP_PORT_UNRCH 3 # define ICMP_FRAGM_AND_DF 4 # define ICMP_SOURCE_ROUTE_FAILED 5 #define ICMP_TYPE_SRC_QUENCH 4 #define ICMP_TYPE_REDIRECT 5 # define ICMP_REDIRECT_NET 0 # define ICMP_REDIRECT_HOST 1 # define ICMP_REDIRECT_TOS_AND_NET 2 # define ICMP_REDIRECT_TOS_AND_HOST 3 #define ICMP_TYPE_ECHO_REQ 8 #define ICMP_TYPE_ROUTER_ADVER 9 #define ICMP_TYPE_ROUTE_SOL 10 #define ICMP_TYPE_TIME_EXCEEDED 11 # define ICMP_TTL_EXC 0 # define ICMP_FRAG_REASSEM 1 #define ICMP_TYPE_PARAM_PROBLEM 12 #define ICMP_TYPE_TS_REQ 13 #define ICMP_TYPE_TS_REPL 14 #define ICMP_TYPE_INFO_REQ 15 #define ICMP_TYPE_INFO_REPL 16 #endif /* __SERVER__IP__GEN__ICMP_H__ */ /* * $PchId: icmp.h,v 1.5 1995/11/17 22:38:46 philip Exp $ */ /* server/ip/gen/icmp_hdr.h */ #ifndef __SERVER__IP__GEN__ICMP_HDR_H__ #define __SERVER__IP__GEN__ICMP_HDR_H__ typedef struct icmp_id_seq { u16_t iis_id, iis_seq; } icmp_id_seq_t; typedef struct icmp_ip_id { ip_hdr_t iii_hdr; /* ip_hdr_options and 64 bytes of data */ } icmp_ip_id_t; typedef struct icmp_ram /* RFC 1256 */ { u8_t iram_na; u8_t iram_aes; u16_t iram_lt; } icmp_ram_t; typedef struct icmp_pp { u8_t ipp_ptr; u8_t ipp_unused[3]; } icmp_pp_t; typedef struct icmp_hdr { u8_t ih_type, ih_code; u16_t ih_chksum; union { u32_t ihh_unused; icmp_id_seq_t ihh_idseq; ipaddr_t ihh_gateway; icmp_ram_t ihh_ram; icmp_pp_t ihh_pp; } ih_hun; union { icmp_ip_id_t ihd_ipid; u8_t uhd_data[1]; } ih_dun; } icmp_hdr_t; #endif /* __SERVER__IP__GEN__ICMP_HDR_H__ */ /* * $PchId: icmp_hdr.h,v 1.4 1995/11/17 22:28:58 philip Exp $ */ /* server/ip/gen/if_ether.h */ #ifndef __SERVER__IP__GEN__IF_ETHER_H__ #define __SERVER__IP__GEN__IF_ETHER_H__ struct ether_addr; #define _PATH_ETHERS "/etc/ethers" char *ether_ntoa _ARGS(( struct ether_addr *e )); struct ether_addr *ether_aton _ARGS(( const char *s )); int ether_ntohost _ARGS(( char *hostname, struct ether_addr *e )); int ether_hostton _ARGS(( char *hostname, struct ether_addr *e )); int ether_line _ARGS(( char *l, struct ether_addr *e, char *hostname )); #endif /* __SERVER__IP__GEN__IF_ETHER_H__ */ /* server/ip/gen/in.h */ #ifndef __SERVER__IP__GEN__IN_H__ #define __SERVER__IP__GEN__IN_H__ #define IP_MIN_HDR_SIZE 20 #define IP_MAX_HDR_SIZE 60 /* 15 * 4 */ #define IP_VERSION 4 #define IP_MAX_TTL 255 #define IP_DEF_MSS 576 #define IP_MAX_PACKSIZE 40000 /* 8192 */ /* Note: this restriction is not part of the IP-protocol but introduced by this implementation. */ #define IPPROTO_ICMP 1 #define IPPROTO_TCP 6 #define IPPROTO_UDP 17 typedef u32_t ipaddr_t; typedef u8_t ipproto_t; typedef struct ip_hdropt { u8_t iho_opt_siz; u8_t iho_data[IP_MAX_HDR_SIZE-IP_MIN_HDR_SIZE]; } ip_hdropt_t; #endif /* __SERVER__IP__GEN__IN_H__ */ /* * $PchId: in.h,v 1.3 1995/11/17 22:27:50 philip Exp $ */ /* server/ip/gen/inet.h */ #ifndef __SERVER__IP__GEN__INET_H__ #define __SERVER__IP__GEN__INET_H__ ipaddr_t inet_addr _ARGS(( const char *addr )); ipaddr_t inet_network _ARGS(( const char *addr )); char *inet_ntoa _ARGS(( ipaddr_t addr )); int inet_aton _ARGS(( const char *cp, ipaddr_t *pin )); #endif /* __SERVER__IP__GEN__INET_H__ */ /* server/ip/gen/ip_hdr.h */ #ifndef __SERVER__IP__GEN__HDR_H__ #define __SERVER__IP__GEN__HDR_H__ typedef struct ip_hdr { u8_t ih_vers_ihl, ih_tos; u16_t ih_length, ih_id, ih_flags_fragoff; u8_t ih_ttl, ih_proto; u16_t ih_hdr_chk; ipaddr_t ih_src, ih_dst; } ip_hdr_t; #define IH_IHL_MASK 0xf #define IH_VERSION_MASK 0xf #define IH_FRAGOFF_MASK 0x1fff #define IH_MORE_FRAGS 0x2000 #define IH_DONT_FRAG 0x4000 #define IH_FLAGS_UNUSED 0x8000 #define IP_OPT_COPIED 0x80 #define IP_OPT_NUMBER 0x1f #define IP_OPT_EOL 0x00 #define IP_OPT_NOP 0x01 #define IP_OPT_LSRR 0x83 #define IP_OPT_RR 0x07 #define IP_OPT_RR_MIN 4 #endif /* __SERVER__IP__GEN__HDR_H__ */ /* * $PchId: ip_hdr.h,v 1.4 1995/11/17 22:26:00 philip Exp $ */ /* server/ip/gen/ip_io.h */ #ifndef __SERVER__IP__GEN__IP_IO_H__ #define __SERVER__IP__GEN__IP_IO_H__ typedef struct nwio_ipconf { u32_t nwic_flags; ipaddr_t nwic_ipaddr; ipaddr_t nwic_netmask; } nwio_ipconf_t; #define NWIC_NOFLAGS 0x0 #define NWIC_FLAGS 0x3 # define NWIC_IPADDR_SET 0x1 # define NWIC_NETMASK_SET 0x2 typedef struct nwio_ipopt { u32_t nwio_flags; ipaddr_t nwio_rem; ip_hdropt_t nwio_hdropt; u8_t nwio_tos; u8_t nwio_ttl; u8_t nwio_df; ipproto_t nwio_proto; } nwio_ipopt_t; #define NWIO_NOFLAGS 0x0000l #define NWIO_ACC_MASK 0x0003l # define NWIO_EXCL 0x00000001l # define NWIO_SHARED 0x00000002l # define NWIO_COPY 0x00000003l #define NWIO_LOC_MASK 0x0010l # define NWIO_EN_LOC 0x00000010l # define NWIO_DI_LOC 0x00100000l #define NWIO_BROAD_MASK 0x0020l # define NWIO_EN_BROAD 0x00000020l # define NWIO_DI_BROAD 0x00200000l #define NWIO_REM_MASK 0x0100l # define NWIO_REMSPEC 0x00000100l # define NWIO_REMANY 0x01000000l #define NWIO_PROTO_MASK 0x0200l # define NWIO_PROTOSPEC 0x00000200l # define NWIO_PROTOANY 0x02000000l #define NWIO_HDR_O_MASK 0x0400l # define NWIO_HDR_O_SPEC 0x00000400l # define NWIO_HDR_O_ANY 0x04000000l #define NWIO_RW_MASK 0x1000l # define NWIO_RWDATONLY 0x00001000l # define NWIO_RWDATALL 0x10000000l #endif /* __SERVER__IP__GEN__IP_IO_H__ */ /* * Copyright (c) 1983, 1989 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * @(#)nameser.h 5.24 (Berkeley) 6/1/90 */ /* server/ip/gen/nameser.h Created Sept 18, 1991 by Philip Homburg */ #ifndef __SERVER__IP__GEN__NAEMSER_H__ #define __SERVER__IP__GEN__NAEMSER_H__ typedef struct dns_hdr { u16_t dh_id; u8_t dh_flag1; u8_t dh_flag2; u16_t dh_qdcount; u16_t dh_ancount; u16_t dh_nscount; u16_t dh_arcount; } dns_hdr_t; #define DHF_QR 0x80 #define DHF_OPCODE 0x78 #define DHF_AA 0x04 #define DHF_TC 0x02 #define DHF_RD 0x01 #define DHF_RA 0x80 #define DHF_PR 0x40 #define DHF_UNUSED 0x30 #define DHF_RCODE 0x0F /* Define constants based on rfc883 */ #define PACKETSZ 512 /* maximum packet size */ #define MAXDNAME 256 /* maximum domain name */ #define MAXCDNAME 255 /* maximum compressed domain name */ #define MAXLABEL 63 /* maximum length of domain label */ /* Number of bytes of fixed size data in query structure */ #define QFIXEDSZ 4 /* number of bytes of fixed size data in resource record */ #define RRFIXEDSZ 10 #define INDIR_MASK 0xc0 /* Defines for handling compressed domain names */ /* Opcodes for DNS */ #define QUERY 0x0 /* standard query */ #define IQUERY 0x1 /* inverse query */ /* Error codes */ #define NOERROR 0 /* no error */ #define FORMERR 1 /* format error */ #define SERVFAIL 2 /* server failure */ #define NXDOMAIN 3 /* non existent domain */ #define NOTIMP 4 /* not implemented */ #define REFUSED 5 /* query refused */ /* non standard */ #define NOCHANGE 0xf /* update failed to change db */ /* Valid types */ #define T_A 1 /* host address */ #define T_NS 2 /* authoritative server */ #define T_MD 3 /* mail destination */ #define T_MF 4 /* mail forwarder */ #define T_CNAME 5 /* connonical name */ #define T_SOA 6 /* start of authority zone */ #define T_MB 7 /* mailbox domain name */ #define T_MG 8 /* mail group member */ #define T_MR 9 /* mail rename name */ #define T_NULL 10 /* null resource record */ #define T_WKS 11 /* well known service */ #define T_PTR 12 /* domain name pointer */ #define T_HINFO 13 /* host information */ #define T_MINFO 14 /* mailbox information */ #define T_MX 15 /* mail routing information */ #define T_TXT 16 /* text strings */ /* non standard */ #define T_UINFO 100 /* user (finger) information */ #define T_UID 101 /* user ID */ #define T_GID 102 /* group ID */ #define T_UNSPEC 103 /* Unspecified format (binary data) */ /* Query type values which do not appear in resource records */ #define T_AXFR 252 /* transfer zone of authority */ #define T_MAILB 253 /* transfer mailbox records */ #define T_MAILA 254 /* transfer mail agent records */ #define T_ANY 255 /* wildcard match */ /* Valid classes */ #define C_IN 1 /* the internet */ #define C_CHAOS 3 /* for chaos net (MIT) */ #define C_HS 4 /* for Hesiod name server at MIT */ #define C_ANY 255 /* wildcard */ #endif /* __SERVER__IP__GEN__NAEMSER_H__ */ /*- * Copyright (c) 1980, 1983, 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)netdb.h 5.15 (Berkeley) 4/3/91 */ #ifndef _NETDB_H_ #define _NETDB_H_ #define _PATH_HEQUIV "/etc/hosts.equiv" #define _PATH_HOSTS "/etc/hosts" #define _PATH_NETWORKS "/etc/networks" #define _PATH_PROTOCOLS "/etc/protocols" #define _PATH_SERVICES "/etc/services" #define _PATH_SERVACCES "/etc/serv.access" /* * Structures returned by network data base library. All addresses are * supplied in host order, and returned in network order (suitable for * use in system calls). */ struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses from name server */ #define h_addr h_addr_list[0] /* address, for backward compatiblity */ }; /* * Assumption here is that a network number * fits in 32 bits -- probably a poor one. */ struct netent { char *n_name; /* official name of net */ char **n_aliases; /* alias list */ int n_addrtype; /* net address type */ unsigned long n_net; /* network # */ }; struct servent { char *s_name; /* official service name */ char **s_aliases; /* alias list */ int s_port; /* port # */ char *s_proto; /* protocol to use */ }; struct protoent { char *p_name; /* official protocol name */ char **p_aliases; /* alias list */ int p_proto; /* protocol # */ }; /* * Error return codes from gethostbyname() and gethostbyaddr() * (left in extern int h_errno). */ extern int h_errno; #define HOST_NOT_FOUND 1 /* Authoritative Answer Host not found */ #define TRY_AGAIN 2 /* Non-Authoritive Host not found, or SERVERFAIL */ #define NO_RECOVERY 3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */ #define NO_DATA 4 /* Valid name, no data record of requested type */ #define NO_ADDRESS NO_DATA /* no address, look for MX record */ #ifndef _ANSI_H #include #endif void endhostent _ARGS((void)); void endnetent _ARGS((void)); void endprotoent _ARGS((void)); void endservent _ARGS((void)); struct hostent *gethostbyaddr _ARGS((const char *, int, int)); struct hostent *gethostbyname _ARGS((const char *)); struct hostent *gethostent _ARGS((void)); struct netent *getnetbyaddr _ARGS((long, int)); /* u_long? */ struct netent *getnetbyname _ARGS((const char *)); struct netent *getnetent _ARGS((void)); struct protoent *getprotobyname _ARGS((const char *)); struct protoent *getprotobynumber _ARGS((int)); struct protoent *getprotoent _ARGS((void)); struct servent *getservbyname _ARGS((const char *, const char *)); struct servent *getservbyport _ARGS((int, const char *)); struct servent *getservent _ARGS((void)); void herror _ARGS((const char *)); void sethostent _ARGS((int)); /* void sethostfile _ARGS((const char *)); */ void setnetent _ARGS((int)); void setprotoent _ARGS((int)); void setservent _ARGS((int)); #ifdef _MINIX int servxcheck _ARGS((int _fd, const char *_service, void (*_logf) _ARGS((int _pass, const char *_name)))); char *servxfile _ARGS((const char *_file)); #endif #endif /* !_NETDB_H_ */ /* server/ip/gen/oneCsum.h */ #ifndef __SERVER__IP__GEN__ONECSUM_H__ #define __SERVER__IP__GEN__ONECSUM_H__ u16_t oneC_sum _ARGS(( U16_t prev, void *data, size_t data_len )); #endif /* __SERVER__IP__GEN__ONECSUM_H__ */ /* server/ip/gen/psip_hdr.h */ #ifndef __SERVER__IP__GEN__PSIP_HDR_H__ #define __SERVER__IP__GEN__PSIP_HDR_H__ typedef struct psip_io_hdr { u8_t pih_flags; u8_t pih_dummy[3]; } psip_io_hdr_t; #define PF_LOC_REM_MASK 1 #define PF_LOC2REM 0 #define PF_REM2LOC 1 #endif /* __SERVER__IP__GEN__PSIP_HDR_H__ */ /* * $PchId: psip_hdr.h,v 1.2 1995/11/17 22:22:35 philip Exp $ */ /* server/ip/gen/psip_io.h */ #ifndef __SERVER__IP__GEN__PSIP_IO_H__ #define __SERVER__IP__GEN__PSIP_IO_H__ typedef struct nwio_psipopt { unsigned long nwpo_flags; } nwio_psipopt_t; #define NWPO_PROMISC_MASK 0x0001L #define NWPO_EN_PROMISC 0x00000001L #define NWUO_DI_PROMISC 0x00010000L #endif /* __SERVER__IP__GEN__PSIP_IO_H__ */ /* * $PchId: psip_io.h,v 1.2 1995/11/17 22:22:16 philip Exp $ */ /* * Copyright (c) 1983, 1987, 1989 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * @(#)resolv.h 5.10 (Berkeley) 6/1/90 */ #ifndef _NET__GEN__RESOLV_H #define _NET__GEN__RESOLV_H /* * Resolver configuration file. * Normally not present, but may contain the address of the * inital name server(s) to query and the domain search list. */ #ifndef _PATH_RESCONF #define _PATH_RESCONF "/etc/resolv.conf" #endif /* * Global defines and variables for resolver stub. */ #define MAXNS 3 /* max # name servers we'll track */ #define MAXDFLSRCH 3 /* # default domain levels to try */ #define MAXDNSRCH 6 /* max # domains in search path */ #define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */ #define RES_TIMEOUT 5 /* min. seconds between retries */ #define NAMESERVER_PORT 53 struct state { int retrans; /* retransmition time interval */ int retry; /* number of times to retransmit */ long options; /* option flags - see below. */ int nscount; /* number of name servers */ ipaddr_t nsaddr_list[MAXNS]; /* address of name server */ #define nsaddr nsaddr_list[0] /* for backward compatibility */ u16_t nsport_list[MAXNS]; /* port of name server */ u16_t id; /* current packet id */ char defdname[MAXDNAME]; /* default domain */ char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */ }; /* * Resolver options */ #define RES_INIT 0x0001 /* address initialized */ #define RES_DEBUG 0x0002 /* print debug messages */ #define RES_AAONLY 0x0004 /* authoritative answers only */ #define RES_USEVC 0x0008 /* use virtual circuit */ #define RES_PRIMARY 0x0010 /* query primary server only */ #define RES_IGNTC 0x0020 /* ignore trucation errors */ #define RES_RECURSE 0x0040 /* recursion desired */ #define RES_DEFNAMES 0x0080 /* use default domain name */ #define RES_STAYOPEN 0x0100 /* Keep TCP socket open */ #define RES_DNSRCH 0x0200 /* search up local domain tree */ #define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | RES_DNSRCH ) extern struct state _res; struct rrec; int res_init _ARGS(( void )); int res_mkquery _ARGS(( int op, const char *dname, int class, int type, const char *data, int datalen, const struct rrec *newrr, char *buf, int buflen )); int res_query _ARGS(( char *name, int class, int type, u8_t *answer, int anslen )); int res_querydomain _ARGS(( char *name, char *domain, int class, int type, u8_t *answer, int anslen )); int res_search _ARGS(( char *name, int class, int type, u8_t *answer, int anslen )); int res_send _ARGS(( const char *buf, int buflen, char *answer, int anslen )); void _res_close _ARGS(( void )); int dn_comp _ARGS(( const u8_t *exp_dn, u8_t *comp_dn, int length, u8_t **dnptrs, u8_t **lastdnptr )); int dn_expand _ARGS(( const u8_t *msg, const u8_t *eomorig, const u8_t *comp_dn, u8_t *exp_dn, int length )); int dn_skipname _ARGS(( const u8_t *comp_dn, const u8_t *eom )); char *__hostalias _ARGS(( const char *name )); u16_t _getshort _ARGS(( const u8_t *msgp )); u32_t _getlong _ARGS(( const u8_t *msgp )); void __putshort _ARGS(( U16_t s, u8_t *msgp )); void __putlong _ARGS(( u32_t l, u8_t *msgp )); void p_query _ARGS(( char *msg )); #endif /* _NET__GEN__RESOLV_H */ /* net/gen/rip.h Definitions for the Routing Information Protocol (RFC-1058). Created: Aug 16, 1993 by Philip Homburg */ #ifndef NET__GEN__RIP_H #define NET__GEN__RIP_H typedef struct rip_hdr { u8_t rh_command; u8_t rh_version; u16_t rh_zero; } rip_hdr_t; #define RHC_REQUEST 1 #define RHC_RESPONSE 2 #define RIP_ENTRY_MAX 25 typedef struct rip_entry { union { struct rip_entry_v1 { u16_t re_family; u16_t re_zero0; u32_t re_address; u32_t re_zero1; u32_t re_zero2; u32_t re_metric; } v1; struct rip_entry_v2 { u16_t re_family; u16_t re_tag; u32_t re_address; u32_t re_mask; u32_t re_nexthop; u32_t re_metric; } v2; } u; } rip_entry_t; #define RIP_FAMILY_IP 2 #define RIP_INFINITY 16 #define RIP_UDP_PORT 520 #define RIP_PERIOD 30 /* A responce is sent once every * RIP_PERIOD seconds */ #define RIP_FUZZ 10 /* The actual value used is RIP_FREQUENCE - * a random number of at most RIP_FUZZ. */ #define RIP_TIMEOUT 180 /* A route is dead after RIP_TIMEOUT seconds */ #define RIP_DELETE_TO 120 /* A dead route is removed after RIP_DELETE_TO * seconds */ #ifdef __RIP_DEBUG #undef RIP_PERIOD #define RIP_PERIOD 15 #undef RIP_TIMEOUT #define RIP_TIMEOUT 10 #undef RIP_DELETE_TO #define RIP_DELETE_TO 10 #endif /* __RIP_DEBUG */ #endif /* NET__GEN__RIP_H */ /* * $PchId: rip.h,v 1.3 1995/11/17 22:21:16 philip Exp $ */ /* server/ip/gen/route.h */ #ifndef __SERVER__IP__GEN__ROUTE_H__ #define __SERVER__IP__GEN__ROUTE_H__ typedef struct nwio_route { u32_t nwr_ent_no; u32_t nwr_ent_count; ipaddr_t nwr_dest; ipaddr_t nwr_netmask; ipaddr_t nwr_gateway; u32_t nwr_dist; u32_t nwr_flags; u32_t nwr_pref; u32_t nwr_mtu; /* Ignored, compatibility with VMD */ ipaddr_t nwr_ifaddr; } nwio_route_t; #define NWRF_EMPTY 0 #define NWRF_INUSE 1 #define NWRF_STATIC 2 #define NWRF_UNREACHABLE 4 #endif /* __SERVER__IP__GEN__ROUTE_H__ */ /* * $PchId: route.h,v 1.3 1995/11/17 22:19:50 philip Exp $ */ /* server/ip/gen/socket.h */ #ifndef __SERVER__IP__GEN__SOCKET_H__ #define __SERVER__IP__GEN__SOCKET_H__ /* From SunOS: /usr/include/sys/socketh */ /* * Address families. */ #define AF_UNSPEC 0 /* unspecified */ #define AF_UNIX 1 /* local to host (pipes, portals) */ #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ #define AF_IMPLINK 3 /* arpanet imp addresses */ #define AF_PUP 4 /* pup protocols: e.g. BSP */ #define AF_CHAOS 5 /* mit CHAOS protocols */ #define AF_NS 6 /* XEROX NS protocols */ #define AF_NBS 7 /* nbs protocols */ #define AF_ECMA 8 /* european computer manufacturers */ #define AF_DATAKIT 9 /* datakit protocols */ #define AF_CCITT 10 /* CCITT protocols, X.25 etc */ #define AF_SNA 11 /* IBM SNA */ #define AF_DECnet 12 /* DECnet */ #define AF_DLI 13 /* Direct data link interface */ #define AF_LAT 14 /* LAT */ #define AF_HYLINK 15 /* NSC Hyperchannel */ #define AF_APPLETALK 16 /* Apple Talk */ #define AF_NIT 17 /* Network Interface Tap */ #define AF_802 18 /* IEEE 802.2, also ISO 8802 */ #define AF_OSI 19 /* umbrella for all families used * by OSI (e.g. protosw lookup) */ #define AF_X25 20 /* CCITT X.25 in particular */ #define AF_OSINET 21 /* AFI = 47, IDI = 4 */ #define AF_GOSIP 22 /* U.S. Government OSI */ #define AF_MAX 21 #endif /* __SERVER__IP__GEN__SOCKET_H__ */ /* server/ip/gen/tcp.h */ #ifndef __SERVER__IP__GEN__TCP_H__ #define __SERVER__IP__GEN__TCP_H__ #define TCP_MIN_HDR_SIZE 20 #define TCP_MAX_HDR_SIZE 60 #define TCPPORT_TELNET 23 #define TCPPORT_FINGER 79 #define TCPPORT_RESERVED 1024 typedef u16_t tcpport_t; typedef U16_t Tcpport_t; /* for use in prototypes */ #endif /* __SERVER__IP__GEN__TCP_H__ */ /* server/ip/gen/tcp_hdr.h */ #ifndef __SERVER__IP__GEN__TCP_HDR_H__ #define __SERVER__IP__GEN__TCP_HDR_H__ typedef struct tcp_hdr { tcpport_t th_srcport; tcpport_t th_dstport; u32_t th_seq_nr; u32_t th_ack_nr; u8_t th_data_off; u8_t th_flags; u16_t th_window; u16_t th_chksum; u16_t th_urgptr; } tcp_hdr_t; #define TH_DO_MASK 0xf0 #define TH_FLAGS_MASK 0x3f #define THF_FIN 0x1 #define THF_SYN 0x2 #define THF_RST 0x4 #define THF_PSH 0x8 #define THF_ACK 0x10 #define THF_URG 0x20 typedef struct tcp_hdropt { int tho_opt_siz; u8_t tho_data[TCP_MAX_HDR_SIZE-TCP_MIN_HDR_SIZE]; } tcp_hdropt_t; #define TCP_OPT_EOL 0 #define TCP_OPT_NOP 1 #define TCP_OPT_MSS 2 #endif /* __SERVER__IP__GEN__TCP_HDR_H__ */ /* * $PchId: tcp_hdr.h,v 1.3 1995/11/17 22:18:13 philip Exp $ */ /* server/ip/gen/tcp_io.h */ #ifndef __SERVER__IP__GEN__TCP_IO_H__ #define __SERVER__IP__GEN__TCP_IO_H__ typedef struct nwio_tcpconf { u32_t nwtc_flags; ipaddr_t nwtc_locaddr; ipaddr_t nwtc_remaddr; tcpport_t nwtc_locport; tcpport_t nwtc_remport; } nwio_tcpconf_t; #define NWTC_NOFLAGS 0x0000L #define NWTC_ACC_MASK 0x0003L # define NWTC_EXCL 0x00000001L # define NWTC_SHARED 0x00000002L # define NWTC_COPY 0x00000003L #define NWTC_LOCPORT_MASK 0x0030L # define NWTC_LP_UNSET 0x00000010L # define NWTC_LP_SET 0x00000020L # define NWTC_LP_SEL 0x00000030L #define NWTC_REMADDR_MASK 0x0100L # define NWTC_SET_RA 0x00000100L # define NWTC_UNSET_RA 0x01000000L #define NWTC_REMPORT_MASK 0x0200L # define NWTC_SET_RP 0x00000200L # define NWTC_UNSET_RP 0x02000000L typedef struct nwio_tcpcl { long nwtcl_flags; long nwtcl_ttl; } nwio_tcpcl_t; typedef struct nwio_tcpatt { long nwta_flags; } nwio_tcpatt_t; typedef struct nwio_tcpopt { u32_t nwto_flags; } nwio_tcpopt_t; #define NWTO_NOFLAG 0x0000L #define NWTO_SND_URG_MASK 0x0001L # define NWTO_SND_URG 0x00000001L # define NWTO_SND_NOTURG 0x00010000L #define NWTO_RCV_URG_MASK 0x0002L # define NWTO_RCV_URG 0x00000002L # define NWTO_RCV_NOTURG 0x00020000L #define NWTO_BSD_URG_MASK 0x0004L # define NWTO_BSD_URG 0x00000004L # define NWTO_NOTBSD_URG 0x00040000L #define NWTO_DEL_RST_MASK 0x0008L # define NWTO_DEL_RST 0x00000008L #endif /* __SERVER__IP__GEN__TCP_IO_H__ */ /* * $PchId: tcp_io.h,v 1.4 1995/11/17 22:17:47 philip Exp $ */ /* server/ip/gen/udp.h */ #ifndef __SERVER__IP__GEN__UDP_H__ #define __SERVER__IP__GEN__UDP_H__ typedef u16_t udpport_t; typedef U16_t Udpport_t; #define UDP_HDR_SIZE 8 #define UDP_IO_HDR_SIZE 16 #endif /* __SERVER__IP__GEN__UDP_H__ */ /* server/ip/gen/udp_hdr.h */ #ifndef __SERVER__IP__GEN__UDP_HDR_H__ #define __SERVER__IP__GEN__UDP_HDR_H__ typedef struct udp_hdr { udpport_t uh_src_port; udpport_t uh_dst_port; u16_t uh_length; u16_t uh_chksum; } udp_hdr_t; typedef struct udp_io_hdr { ipaddr_t uih_src_addr; ipaddr_t uih_dst_addr; udpport_t uih_src_port; udpport_t uih_dst_port; u16_t uih_ip_opt_len; u16_t uih_data_len; } udp_io_hdr_t; #endif /* __SERVER__IP__GEN__UDP_HDR_H__ */ /* server/ip/gen/udp_io.h */ #ifndef __SERVER__IP__GEN__UDP_IO_H__ #define __SERVER__IP__GEN__UDP_IO_H__ typedef struct nwio_udpopt { unsigned long nwuo_flags; udpport_t nwuo_locport; udpport_t nwuo_remport; ipaddr_t nwuo_locaddr; ipaddr_t nwuo_remaddr; } nwio_udpopt_t; #define NWUO_NOFLAGS 0x0000L #define NWUO_ACC_MASK 0x0003L #define NWUO_EXCL 0x00000001L #define NWUO_SHARED 0x00000002L #define NWUO_COPY 0x00000003L #define NWUO_LOCPORT_MASK 0x000CL #define NWUO_LP_SEL 0x00000004L #define NWUO_LP_SET 0x00000008L #define NWUO_LP_ANY 0x0000000CL #define NWUO_LOCADDR_MASK 0x0010L #define NWUO_EN_LOC 0x00000010L #define NWUO_DI_LOC 0x00100000L #define NWUO_BROAD_MASK 0x0020L #define NWUO_EN_BROAD 0x00000020L #define NWUO_DI_BROAD 0x00200000L #define NWUO_REMPORT_MASK 0x0100L #define NWUO_RP_SET 0x00000100L #define NWUO_RP_ANY 0x01000000L #define NWUO_REMADDR_MASK 0x0200L #define NWUO_RA_SET 0x00000200L #define NWUO_RA_ANY 0x02000000L #define NWUO_RW_MASK 0x1000L #define NWUO_RWDATONLY 0x00001000L #define NWUO_RWDATALL 0x10000000L #define NWUO_IPOPT_MASK 0x2000L #define NWUO_EN_IPOPT 0x00002000L #define NWUO_DI_IPOPT 0x20000000L #endif /* __SERVER__IP__GEN__UDP_IO_H__ */ /* net/gen/vjhc.h Defines for Van Jacobson TCP/IP Header Compression as defined in RFC-1144 Created: Nov 15, 1993 by Philip Homburg */ #ifndef __NET__GEN__VJHC_H__ #define __NET__GEN__VJHC_H__ #define VJHC_FLAG_U 0x01 #define VJHC_FLAG_W 0x02 #define VJHC_FLAG_A 0x04 #define VJHC_FLAG_S 0x08 #define VJHC_FLAG_P 0x10 #define VJHC_FLAG_I 0x20 #define VJHC_FLAG_C 0x40 #define VJHC_SPEC_I (VJHC_FLAG_S | VJHC_FLAG_W | VJHC_FLAG_U) #define VJHC_SPEC_D (VJHC_FLAG_S | VJHC_FLAG_A | VJHC_FLAG_W | VJHC_FLAG_U) #define VJHC_SPEC_MASK (VJHC_FLAG_S | VJHC_FLAG_A | VJHC_FLAG_W | VJHC_FLAG_U) #define VJHC_ENCODE(cp, n) \ { \ if ((u16_t)(n) >= 256) \ { \ *(cp)++= 0; \ *(cp)++= (n >> 8); \ *(cp)++= (n); \ } \ else \ *(cp)++= (n); \ } #define VJHC_ENCODEZ(cp, n) \ { \ if ((u16_t)(n) == 0 || (u16_t)(n) >= 256) \ { \ *(cp)++= 0; \ *(cp)++= (n >> 8); \ *(cp)++= (n); \ } \ else \ *(cp)++= (n); \ } #define VJHC_DECODEL(cp, l) \ { \ if (*(cp) == 0) \ { \ (l)= htonl(ntohl((l)) + (((cp)[1] << 8) | (cp)[2])); \ (cp) += 3; \ } \ else \ (l)= htonl(ntohl((l)) + (u32_t)*(cp)++); \ } #define VJHC_DECODES(cp, s) \ { \ if (*(cp) == 0) \ { \ (s)= htons(ntohs((s)) + (((cp)[1] << 8) | (cp)[2])); \ (cp) += 3; \ } \ else \ (s)= htons(ntohs((s)) + (u16_t)*(cp)++); \ } #define VJHC_DECODEU(cp, s) \ { \ if (*(cp) == 0) \ { \ (s)= htons(((cp)[1] << 8) | (cp)[2]); \ (cp) += 3; \ } \ else \ (s)= htons((u16_t)*(cp)++); \ } #endif /* __NET__GEN__VJHC_H__ */ /* * $PchId: vjhc.h,v 1.2 1995/11/17 22:14:46 philip Exp $ */ /* net/gen/dhcp.h - DHCP packet format Author: Kees J. Bot * 1 Dec 2000 */ #ifndef __NET__GEN__DHCP_H__ #define __NET__GEN__DHCP_H__ typedef struct dhcp { u8_t op; /* Message opcode/type. */ u8_t htype; /* Hardware address type. */ u8_t hlen; /* Hardware address length. */ u8_t hops; /* Hop count when relaying. */ u32_t xid; /* Transaction ID. */ u16_t secs; /* Seconds past since client began. */ u16_t flags; /* Flags. */ ipaddr_t ciaddr; /* Client IP address. */ ipaddr_t yiaddr; /* "Your" IP address. */ ipaddr_t siaddr; /* Boot server IP address. */ ipaddr_t giaddr; /* Relay agent (gateway) IP address. */ u8_t chaddr[16]; /* Client hardware address. */ u8_t sname[64]; /* Server host name. */ u8_t file[128]; /* Boot file. */ u32_t magic; /* Magic number. */ u8_t options[308]; /* Optional parameters. */ } dhcp_t; /* DHCP operations and stuff: */ #define DHCP_BOOTREQUEST 1 /* Boot request message. */ #define DHCP_BOOTREPLY 2 /* Boot reply message. */ #define DHCP_HTYPE_ETH 1 /* Ethernet hardware type. */ #define DHCP_HLEN_ETH 6 /* Ethernet hardware address length. */ #define DHCP_FLAGS_BCAST 0x8000U /* Reply must be broadcast to client. */ /* "Magic" first four option bytes. */ #define DHCP_MAGIC HTONL(0x63825363UL) /* DHCP common tags: */ #define DHCP_TAG_NETMASK 1 /* Netmask. */ #define DHCP_TAG_GATEWAY 3 /* Gateway list. */ #define DHCP_TAG_DNS 6 /* DNS Nameserver list. */ #define DHCP_TAG_HOSTNAME 12 /* Host name. */ #define DHCP_TAG_DOMAIN 15 /* Domain. */ #define DHCP_TAG_IPMTU 26 /* Interface MTU. */ /* DHCP protocol tags: */ #define DHCP_TAG_REQIP 50 /* Request this IP. */ #define DHCP_TAG_LEASE 51 /* Lease time requested/offered. */ #define DHCP_TAG_OVERLOAD 52 /* Options continued in file/sname. */ #define DHCP_TAG_TYPE 53 /* DHCP message (values below). */ #define DHCP_TAG_SERVERID 54 /* Server identifier. */ #define DHCP_TAG_REQPAR 55 /* Parameters requested. */ #define DHCP_TAG_MESSAGE 56 /* Error message. */ #define DHCP_TAG_MAXDHCP 57 /* Max DHCP packet size. */ #define DHCP_TAG_RENEWAL 58 /* Time to go into renewal state. */ #define DHCP_TAG_REBINDING 59 /* Time to go into rebinding state. */ #define DHCP_TAG_CLASSID 60 /* Class identifier. */ #define DHCP_TAG_CLIENTID 61 /* Client identifier. */ /* DHCP messages: */ #define DHCP_DISCOVER 1 /* Locate available servers. */ #define DHCP_OFFER 2 /* Parameters offered to client. */ #define DHCP_REQUEST 3 /* (Re)request offered parameters. */ #define DHCP_DECLINE 4 /* Client declines offer. */ #define DHCP_ACK 5 /* Server acknowlegdes request. */ #define DHCP_NAK 6 /* Server denies request. */ #define DHCP_RELEASE 7 /* Client relinguishes address. */ #define DHCP_INFORM 8 /* Client requests just local config. */ void dhcp_init(dhcp_t *_dp); int dhcp_settag(dhcp_t *_dp, int _tag, void *_data, size_t _len); int dhcp_gettag(dhcp_t *_dp, int _searchtag, u8_t **_pdata, size_t *_plen); #endif /* __NET__GEN__DHCP_H__ */ /* The following macro definitions convert to and from the network standard byte order. The macros with their name in lower case guarantee to evaluate their argument exactly once. The function of the macros is encoded in their names; htons means convert a (unsigned) short in host byte order to network byte order. */ #ifndef _NET__HTON_H #define _NET__HTON_H #include extern u16_t _tmp; extern u32_t _tmp_l; /* Find out about the byte order. */ /* assume is included, let's check */ #if (CHIP == 0) #include "CHIP macro not set, include " #endif #if (CHIP == INTEL) #define LITTLE_ENDIAN 1 #endif #if (CHIP == M68000 || CHIP == SPARC) #define BIG_ENDIAN 1 #endif #if (LITTLE_ENDIAN) && (BIG_ENDIAN) #include "both LITTLE_ENDIAN and BIG_ENDIAN are defined" /* LITTLE_ENDIAN and BIG_ENDIAN are both defined */ #endif #if !(LITTLE_ENDIAN) && !(BIG_ENDIAN) #include "neither LITTLE_ENDIAN nor BIG_ENDIAN is defined" /* LITTLE_ENDIAN and BIG_ENDIAN are both NOT defined */ #endif #if LITTLE_ENDIAN #define HTONS(x) ( ( (((unsigned short)(x)) >>8) & 0xff) | \ ((((unsigned short)(x)) & 0xff)<<8) ) #define NTOHS(x) ( ( (((unsigned short)(x)) >>8) & 0xff) | \ ((((unsigned short)(x)) & 0xff)<<8) ) #define HTONL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \ (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L)) #define NTOHL(x) ((((x)>>24) & 0xffL) | (((x)>>8) & 0xff00L) | \ (((x)<<8) & 0xff0000L) | (((x)<<24) & 0xff000000L)) #if _WORD_SIZE > 2 #define htons(x) (_tmp=(x), ((_tmp>>8) & 0xff) | ((_tmp<<8) & 0xff00)) #define ntohs(x) (_tmp=(x), ((_tmp>>8) & 0xff) | ((_tmp<<8) & 0xff00)) #define htonl(x) (_tmp_l=(x), ((_tmp_l>>24) & 0xffL) | \ ((_tmp_l>>8) & 0xff00L) | \ ((_tmp_l<<8) & 0xff0000L) | ((_tmp_l<<24) & 0xff000000L)) #define ntohl(x) (_tmp_l=(x), ((_tmp_l>>24) & 0xffL) \ | ((_tmp_l>>8) & 0xff00L) | \ ((_tmp_l<<8) & 0xff0000L) | ((_tmp_l<<24) & 0xff000000L)) #else /* _WORD_SIZE == 2 */ /* The above macros are too unwieldy for a 16-bit machine. */ u16_t htons(u16_t x); u16_t ntohs(u16_t x); u32_t htonl(u32_t x); u32_t ntohl(u32_t x); #endif /* _WORD_SIZE == 2 */ #endif /* LITTLE_ENDIAN */ #if BIG_ENDIAN #define htons(x) (x) #define HTONS(x) (x) #define ntohs(x) (x) #define NTOHS(x) (x) #define htonl(x) (x) #define HTONL(x) (x) #define ntohl(x) (x) #define NTOHL(x) (x) #endif /* BIG_ENDIAN */ #endif /* _NET__HTON_H */ /* net/netlib.h */ #ifndef _NET__NETLIB_H_ #define _NET__NETLIB_H_ #ifndef _ANSI #include #endif _PROTOTYPE (int ruserok, (const char *rhost, int superuser, const char *ruser, const char *luser) ); _PROTOTYPE (int rcmd, (char **ahost, int rport, const char *locuser, const char *remuser, const char *cmd, int *fd2p) ); #define ETH_DEVICE "/dev/eth" #define IP_DEVICE "/dev/ip" #define TCP_DEVICE "/dev/tcp" #define UDP_DEVICE "/dev/udp" #endif /* _NET__NETLIB_H_ */ /* The header defines the items in the password file. */ #ifndef _PWD_H #define _PWD_H #ifndef _TYPES_H #include #endif struct passwd { char *pw_name; /* login name */ uid_t pw_uid; /* uid corresponding to the name */ gid_t pw_gid; /* gid corresponding to the name */ char *pw_dir; /* user's home directory */ char *pw_shell; /* name of the user's shell */ /* The following members are not defined by POSIX. */ char *pw_passwd; /* password information */ char *pw_gecos; /* just in case you have a GE 645 around */ }; /* Function Prototypes. */ _PROTOTYPE( struct passwd *getpwnam, (const char *_name) ); _PROTOTYPE( struct passwd *getpwuid, (Uid_t _uid) ); #ifdef _MINIX _PROTOTYPE( void endpwent, (void) ); _PROTOTYPE( struct passwd *getpwent, (void) ); _PROTOTYPE( int setpwent, (void) ); _PROTOTYPE( void setpwfile, (const char *_file) ); #endif #endif /* _PWD_H */ /* The header is used by the (V8-compatible) regexp(3) routines. */ #ifndef _REGEXP_H #define _REGEXP_H #ifndef _ANSI_H #include #endif #define CHARBITS 0377 #define NSUBEXP 10 typedef struct regexp { char *startp[NSUBEXP]; char *endp[NSUBEXP]; char regstart; /* Internal use only. */ char reganch; /* Internal use only. */ char *regmust; /* Internal use only. */ int regmlen; /* Internal use only. */ char program[1]; /* Unwarranted chumminess with compiler. */ } regexp; /* Function Prototypes. */ _PROTOTYPE( regexp *regcomp, (char *_exp) ); _PROTOTYPE( int regexec, (regexp *_prog, char *_string, int _bolflag) ); _PROTOTYPE( void regsub, (regexp *_prog, char *_source, char *_dest) ); _PROTOTYPE( void regerror, (char *_message) ); #endif /* _REGEXP_H */ /* The header relates to the C phenomenon known as setjmp/longjmp. * It is used to escape out of the current situation into a previous one. * A typical example is in an editor, where hitting DEL breaks off the current * command and puts the editor back in the main loop, though care has to be * taken when the DEL occurs while executing a library function, since * some of them are not reentrant. * * POSIX does not require the process signal mask to be saved and restored * during setjmp/longjmp. However, the current implementation does this * in order to agree with OSF/1 and other BSD derived systems. * * The pair of functions _setjmp/_longjmp may be used when the signal * mask is not to be saved/restored. These functions are traditional * in BSD systems. * * There are different ways of implementing setjmp/longjmp. Probably * the best way is to unify it with signal handling. This is true for the * following reasons: Both setjmp/longjmp and signal delivery must save * a context so that it may be restored later. The jmp_buf necessarily * contains signal information, namely the signal mask to restore. Both * longjmp and the return of a signal handler must trap to the operating * system to restore the previous signal mask. Finally, the jmp_buf * and the sigcontext structure contain the registers to restore. * * Some compilers, namely ACK, will not enregister any variables inside a * function containing a call to setjmp, even if those variables are * explicitly declared as register variables. Thus for ACK, the * identification of the jmp_buf with a sigcontext structure would cause * unnecessary overhead: the jmp_buf has room for all the registers, but * the only registers that need to be saved are the stack pointer, * frame pointer, and program counter. * * So, for ACK a jmp_buf is much smaller than a sigcontext structure, and * longjmp does not directly call sigreturn. Instead, longjmp calls a * front-end function which initializes the appropriate fields of a * sigcontext structure, marks this structure as containing no valid * general purpose registers, and then calls sigreturn. * * The POSIX sigjmp_buf is identical to the jmp_buf in all cases. * * Different compilers have different symbols that they recognize as * setjmp symbols. ACK recognizes __setjmp, the GNU C compiler * recognizes setjmp and _setjmp, and BCC recognizes all three. * When these symbols occur within a function, the compiler may keep * all local variables on the stack, avoid certain optimizations, or * pass hidden arguments to the setjmp function. * * Thus, setjmp implementations vary in two independent ways which may * be identified through the following preprocessor tokens: * * _SETJMP_SYMBOL -- If 0, this means the compiler treats setjmp and _setjmp * specially. If 1, this means the compiler treats __setjmp specially. * * _SETJMP_SAVES_REGS -- If 1, this means setjmp/longjmp must explicitly * save and restore all registers. This also implies that a jmp_buf is * different than a sigcontext structure. If 0, this means that the compiler * will not use register variables within a function that calls one of * its SETJMP_SYMBOLs. * * When _SETJMP_SYMBOL = 1, the implementation has a few dozen bytes of * unnecessary overhead. This happens in the following manner: a program uses * _setjmp/_longjmp because it is not interested in saving and restoring the * signal mask. Nevertheless, because _setjmp expands to the general purpose * function __setjmp, code for sigprocmask(2) is linked into the program. */ #ifndef _SETJMP_H #define _SETJMP_H #ifndef _ANSI_H #include #endif #if !defined(__ACK__) && !defined(__BCC__) && !defined(__GNUC__) #define __ACK__ #endif #ifdef __ACK__ #define _SETJMP_SYMBOL 1 #define _SETJMP_SAVES_REGS 0 #endif #ifdef __BCC__ #define _SETJMP_SYMBOL 0 #define _SETJMP_SAVES_REGS 1 #endif #ifdef __GNUC__ #define _SETJMP_SYMBOL 0 #define _SETJMP_SAVES_REGS 1 #endif /* The jmp_buf data type. Do not change the order of these fields -- some * C library code refers to these fields by name. When _SETJMP_SAVES_REGS * is 1, the file gives the usage of the sixteen registers. */ typedef struct { int __flags; /* XXX - long might give better alignment */ long __mask; /* must have size >= sizeof(sigset_t) */ #if (_SETJMP_SAVES_REGS == 0) _PROTOTYPE(void (*__pc),(void)); /* program counter */ void *__sp; /* stack pointer */ void *__lb; /* local base (ACKspeak for frame pointer) */ #else void *__regs[16]; /* size is machine dependent */ #endif } jmp_buf[1]; #if (_SETJMP_SYMBOL == 1) _PROTOTYPE( int __setjmp, (jmp_buf _env, int _savemask) ); _PROTOTYPE( void longjmp, (jmp_buf _env, int _val) ); _PROTOTYPE(int sigjmp, (jmp_buf _jb, int _retval) ); #define setjmp(env) __setjmp((env), 1) #ifdef _MINIX #define _setjmp(env) __setjmp((env), 0) _PROTOTYPE(void _longjmp, (jmp_buf _env, int _val) ); #endif #ifdef _POSIX_SOURCE typedef jmp_buf sigjmp_buf; _PROTOTYPE( void siglongjmp, (sigjmp_buf _env, int _val) ); #define sigsetjmp(env, savemask) __setjmp((env), (savemask)) #endif /* _POSIX_SOURCE */ #endif /* _SETJMP_SYMBOL == 1 */ #if (_SETJMP_SYMBOL == 0) _PROTOTYPE( int setjmp, (jmp_buf _env) ); _PROTOTYPE( void longjmp, (jmp_buf _env, int _val) ); #ifdef _MINIX _PROTOTYPE( int _setjmp, (jmp_buf _env) ); _PROTOTYPE( void _longjmp, (jmp_buf _env, int _val) ); #endif #ifdef _POSIX_SOURCE #define sigjmp_buf jmp_buf _PROTOTYPE( void siglongjmp, (sigjmp_buf _env, int _val) ); /* XXX - the name _setjmp is no good - that's why ACK used __setjmp. */ #define sigsetjmp(env, savemask) ((savemask) ? setjmp(env) : _setjmp(env)) #endif /* _POSIX_SOURCE */ #endif /* _SETJMP_SYMBOL == 0 */ #endif /* _SETJMP_H */ /* The header contains data structures for ioctl(). */ #ifndef _SGTTY_H #define _SGTTY_H /* Should not be used, nor extended. Termios.h is the replacement for * sgtty.h for tty functions, and ioctl replaced code should be moved to * sys/ioctl.h and specific header files in the sys, or minix directory. */ #include /* Ouch. */ struct sgttyb { char sg_ispeed; /* input speed */ char sg_ospeed; /* output speed */ char sg_erase; /* erase character */ char sg_kill; /* kill character */ int sg_flags; /* mode flags */ }; struct tchars { char t_intrc; /* SIGINT char */ char t_quitc; /* SIGQUIT char */ char t_startc; /* start output (initially CTRL-Q) */ char t_stopc; /* stop output (initially CTRL-S) */ char t_eofc; /* EOF (initially CTRL-D) */ char t_brkc; /* input delimiter (like nl) */ }; #if !_SYSTEM /* the kernel doesn't want to see the rest */ /* Field names */ #define XTABS 0006000 /* do tab expansion */ #define BITS8 0001400 /* 8 bits/char */ #define BITS7 0001000 /* 7 bits/char */ #define BITS6 0000400 /* 6 bits/char */ #define BITS5 0000000 /* 5 bits/char */ #define EVENP 0000200 /* even parity */ #define ODDP 0000100 /* odd parity */ #define RAW 0000040 /* enable raw mode */ #define CRMOD 0000020 /* map lf to cr + lf */ #define ECHO 0000010 /* echo input */ #define CBREAK 0000002 /* enable cbreak mode */ #define COOKED 0000000 /* neither CBREAK nor RAW */ #define DCD 0100000 /* Data Carrier Detect */ /* Line speeds */ #define B0 0 /* code for line-hangup */ #define B110 1 #define B300 3 #define B1200 12 #define B2400 24 #define B4800 48 #define B9600 96 #define B19200 192 #define B38400 195 #define B57600 194 #define B115200 193 /* Things Minix supports but not properly */ /* the divide-by-100 encoding ain't too hot */ #define ANYP 0000300 #define B50 0 #define B75 0 #define B134 0 #define B150 0 #define B200 2 #define B600 6 #define B1800 18 #define B3600 36 #define B7200 72 #define EXTA 192 #define EXTB 0 /* Things Minix doesn't support but are fairly harmless if used */ #define NLDELAY 0001400 #define TBDELAY 0006000 #define CRDELAY 0030000 #define VTDELAY 0040000 #define BSDELAY 0100000 #define ALLDELAY 0177400 /* Copied from termios.h: */ struct winsize { unsigned short ws_row; /* rows, in characters */ unsigned short ws_col; /* columns, in characters */ unsigned short ws_xpixel; /* horizontal size, pixels */ unsigned short ws_ypixel; /* vertical size, pixels */ }; #endif /* !_SYSTEM */ #endif /* _SGTTY_H */ /* The header defines all the ANSI and POSIX signals. * MINIX supports all the signals required by POSIX. They are defined below. * Some additional signals are also supported. */ #ifndef _SIGNAL_H #define _SIGNAL_H #ifndef _ANSI_H #include #endif #ifdef _POSIX_SOURCE #ifndef _TYPES_H #include #endif #endif /* Here are types that are closely associated with signal handling. */ typedef int sig_atomic_t; #ifdef _POSIX_SOURCE #ifndef _SIGSET_T #define _SIGSET_T typedef unsigned long sigset_t; #endif #endif #define _NSIG 17 /* number of signals used */ #define SIGHUP 1 /* hangup */ #define SIGINT 2 /* interrupt (DEL) */ #define SIGQUIT 3 /* quit (ASCII FS) */ #define SIGILL 4 /* illegal instruction */ #define SIGTRAP 5 /* trace trap (not reset when caught) */ #define SIGABRT 6 /* IOT instruction */ #define SIGIOT 6 /* SIGABRT for people who speak PDP-11 */ #define SIGUNUSED 7 /* spare code */ #define SIGFPE 8 /* floating point exception */ #define SIGKILL 9 /* kill (cannot be caught or ignored) */ #define SIGUSR1 10 /* user defined signal # 1 */ #define SIGSEGV 11 /* segmentation violation */ #define SIGUSR2 12 /* user defined signal # 2 */ #define SIGPIPE 13 /* write on a pipe with no one to read it */ #define SIGALRM 14 /* alarm clock */ #define SIGTERM 15 /* software termination signal from kill */ #define SIGCHLD 17 /* child process terminated or stopped */ #define SIGEMT 7 /* obsolete */ #define SIGBUS 10 /* obsolete */ /* POSIX requires the following signals to be defined, even if they are * not supported. Here are the definitions, but they are not supported. */ #define SIGCONT 18 /* continue if stopped */ #define SIGSTOP 19 /* stop signal */ #define SIGTSTP 20 /* interactive stop signal */ #define SIGTTIN 21 /* background process wants to read */ #define SIGTTOU 22 /* background process wants to write */ /* The sighandler_t type is not allowed unless _POSIX_SOURCE is defined. */ typedef void _PROTOTYPE( (*__sighandler_t), (int) ); /* Macros used as function pointers. */ #define SIG_ERR ((__sighandler_t) -1) /* error return */ #define SIG_DFL ((__sighandler_t) 0) /* default signal handling */ #define SIG_IGN ((__sighandler_t) 1) /* ignore signal */ #define SIG_HOLD ((__sighandler_t) 2) /* block signal */ #define SIG_CATCH ((__sighandler_t) 3) /* catch signal */ #ifdef _POSIX_SOURCE struct sigaction { __sighandler_t sa_handler; /* SIG_DFL, SIG_IGN, or pointer to function */ sigset_t sa_mask; /* signals to be blocked during handler */ int sa_flags; /* special flags */ }; /* Fields for sa_flags. */ #define SA_ONSTACK 0x0001 /* deliver signal on alternate stack */ #define SA_RESETHAND 0x0002 /* reset signal handler when signal caught */ #define SA_NODEFER 0x0004 /* don't block signal while catching it */ #define SA_RESTART 0x0008 /* automatic system call restart */ #define SA_SIGINFO 0x0010 /* extended signal handling */ #define SA_NOCLDWAIT 0x0020 /* don't create zombies */ #define SA_NOCLDSTOP 0x0040 /* don't receive SIGCHLD when child stops */ /* POSIX requires these values for use with sigprocmask(2). */ #define SIG_BLOCK 0 /* for blocking signals */ #define SIG_UNBLOCK 1 /* for unblocking signals */ #define SIG_SETMASK 2 /* for setting the signal mask */ #define SIG_INQUIRE 4 /* for internal use only */ #endif /* _POSIX_SOURCE */ /* POSIX and ANSI function prototypes. */ _PROTOTYPE( int raise, (int _sig) ); _PROTOTYPE( __sighandler_t signal, (int _sig, __sighandler_t _func) ); #ifdef _POSIX_SOURCE _PROTOTYPE( int kill, (pid_t _pid, int _sig) ); _PROTOTYPE( int sigaction, (int _sig, const struct sigaction *_act, struct sigaction *_oact) ); _PROTOTYPE( int sigaddset, (sigset_t *_set, int _sig) ); _PROTOTYPE( int sigdelset, (sigset_t *_set, int _sig) ); _PROTOTYPE( int sigemptyset, (sigset_t *_set) ); _PROTOTYPE( int sigfillset, (sigset_t *_set) ); _PROTOTYPE( int sigismember, (const sigset_t *_set, int _sig) ); _PROTOTYPE( int sigpending, (sigset_t *_set) ); _PROTOTYPE( int sigprocmask, (int _how, const sigset_t *_set, sigset_t *_oset) ); _PROTOTYPE( int sigsuspend, (const sigset_t *_sigmask) ); #endif #endif /* _SIGNAL_H */ /* The header is ANSI's way to handle variable numbers of params. * Some programming languages require a function that is declared with n * parameters to be called with n parameters. C does not. A function may * called with more parameters than it is declared with. The well-known * printf function, for example, may have arbitrarily many parameters. * The question arises how one can access all the parameters in a portable * way. The C standard defines three macros that programs can use to * advance through the parameter list. The definition of these macros for * MINIX are given in this file. The three macros are: * * va_start(ap, parmN) prepare to access parameters * va_arg(ap, type) get next parameter value and type * va_end(ap) access is finished * * Ken Thompson's famous line from V6 UNIX is equally applicable to this file: * * "You are not expected to understand this" * */ #ifndef _STDARG_H #define _STDARG_H #ifdef __GNUC__ /* The GNU C-compiler uses its own, but similar varargs mechanism. */ typedef char *va_list; /* Amount of space required in an argument list for an arg of type TYPE. * TYPE may alternatively be an expression whose type is used. */ #define __va_rounded_size(TYPE) \ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) #if __GNUC__ < 2 #ifndef __sparc__ #define va_start(AP, LASTARG) \ (AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) #else #define va_start(AP, LASTARG) \ (__builtin_saveregs (), \ AP = ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) #endif void va_end (va_list); /* Defined in gnulib */ #define va_end(AP) #define va_arg(AP, TYPE) \ (AP += __va_rounded_size (TYPE), \ *((TYPE *) (AP - __va_rounded_size (TYPE)))) #else /* __GNUC__ >= 2 */ #ifndef __sparc__ #define va_start(AP, LASTARG) \ (AP = ((char *) __builtin_next_arg ())) #else #define va_start(AP, LASTARG) \ (__builtin_saveregs (), AP = ((char *) __builtin_next_arg ())) #endif void va_end (va_list); /* Defined in libgcc.a */ #define va_end(AP) #define va_arg(AP, TYPE) \ (AP = ((char *) (AP)) += __va_rounded_size (TYPE), \ *((TYPE *) ((char *) (AP) - __va_rounded_size (TYPE)))) #endif /* __GNUC__ >= 2 */ #else /* not __GNUC__ */ typedef char *va_list; #define __vasz(x) ((sizeof(x)+sizeof(int)-1) & ~(sizeof(int) -1)) #define va_start(ap, parmN) ((ap) = (va_list)&parmN + __vasz(parmN)) #define va_arg(ap, type) \ (*((type *)((va_list)((ap) = (void *)((va_list)(ap) + __vasz(type))) \ - __vasz(type)))) #define va_end(ap) #endif /* __GNUC__ */ #endif /* _STDARG_H */ /* The header defines certain commonly used macros. */ #ifndef _STDDEF_H #define _STDDEF_H #define NULL ((void *)0) /* The following is not portable, but the compiler accepts it. */ #define offsetof(type, ident) ((size_t) (unsigned long) &((type *)0)->ident) #if _EM_PSIZE == _EM_WSIZE typedef int ptrdiff_t; /* result of subtracting two pointers */ #else /* _EM_PSIZE == _EM_LSIZE */ typedef long ptrdiff_t; #endif #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; /* type returned by sizeof */ #endif #ifndef _WCHAR_T #define _WCHAR_T typedef char wchar_t; /* type expanded character set */ #endif #endif /* _STDDEF_H */ /* * stdio.h - input/output definitions * * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: stdio.h,v 1.3 89/12/18 14:00:10 eck Exp $ */ #ifndef _STDIO_H #define _STDIO_H #ifndef _ANSI_H #include #endif /* * Focus point of all stdio activity. */ typedef struct __iobuf { int _count; int _fd; int _flags; int _bufsiz; unsigned char *_buf; unsigned char *_ptr; } FILE; #define _IOFBF 0x000 #define _IOREAD 0x001 #define _IOWRITE 0x002 #define _IONBF 0x004 #define _IOMYBUF 0x008 #define _IOEOF 0x010 #define _IOERR 0x020 #define _IOLBF 0x040 #define _IOREADING 0x080 #define _IOWRITING 0x100 #define _IOAPPEND 0x200 /* The following definitions are also in . They should not * conflict. */ #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 #define stdin (&__stdin) #define stdout (&__stdout) #define stderr (&__stderr) #define BUFSIZ 1024 #define NULL ((void *)0) #define EOF (-1) #define FOPEN_MAX 20 #define FILENAME_MAX 14 #define TMP_MAX 999 #define L_tmpnam (sizeof("/tmp/") + FILENAME_MAX) #define __STDIO_VA_LIST__ void * typedef long int fpos_t; #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; /* type returned by sizeof */ #endif /* _SIZE_T */ extern FILE *__iotab[FOPEN_MAX]; extern FILE __stdin, __stdout, __stderr; _PROTOTYPE( int remove, (const char *_filename) ); _PROTOTYPE( int rename, (const char *_old, const char *_new) ); _PROTOTYPE( FILE *tmpfile, (void) ); _PROTOTYPE( char *tmpnam, (char *_s) ); _PROTOTYPE( int fclose, (FILE *_stream) ); _PROTOTYPE( int fflush, (FILE *_stream) ); _PROTOTYPE( FILE *fopen, (const char *_filename, const char *_mode) ); _PROTOTYPE( FILE *freopen, (const char *_filename, const char *_mode, FILE *_stream) ); _PROTOTYPE( void setbuf, (FILE *_stream, char *_buf) ); _PROTOTYPE( int setvbuf, (FILE *_stream, char *_buf, int _mode, size_t _size) ); _PROTOTYPE( int fprintf, (FILE *_stream, const char *_format, ...) ); _PROTOTYPE( int printf, (const char *_format, ...) ); _PROTOTYPE( int sprintf, (char *_s, const char *_format, ...) ); _PROTOTYPE( int vfprintf, (FILE *_stream, const char *_format, char *_arg) ); _PROTOTYPE( int vprintf, (const char *_format, char *_arg) ); _PROTOTYPE( int vsprintf, (char *_s, const char *_format, char *_arg) ); _PROTOTYPE( int fscanf, (FILE *_stream, const char *_format, ...) ); _PROTOTYPE( int scanf, (const char *_format, ...) ); _PROTOTYPE( int sscanf, (const char *_s, const char *_format, ...) ); #define vfscanf _doscan _PROTOTYPE( int vfscanf, (FILE *_stream, const char *_format, char *_arg)); _PROTOTYPE( int vscanf, (const char *_format, char *_arg) ); _PROTOTYPE( int vsscanf, (const char *_s, const char *_format, char *_arg)); _PROTOTYPE( int fgetc, (FILE *_stream) ); _PROTOTYPE( char *fgets, (char *_s, int _n, FILE *_stream) ); _PROTOTYPE( int fputc, (int _c, FILE *_stream) ); _PROTOTYPE( int fputs, (const char *_s, FILE *_stream) ); _PROTOTYPE( int getc, (FILE *_stream) ); _PROTOTYPE( int getchar, (void) ); _PROTOTYPE( char *gets, (char *_s) ); _PROTOTYPE( int putc, (int _c, FILE *_stream) ); _PROTOTYPE( int putchar, (int _c) ); _PROTOTYPE( int puts, (const char *_s) ); _PROTOTYPE( int ungetc, (int _c, FILE *_stream) ); _PROTOTYPE( size_t fread, (void *_ptr, size_t _size, size_t _nmemb, FILE *_stream) ); _PROTOTYPE( size_t fwrite, (const void *_ptr, size_t _size, size_t _nmemb, FILE *_stream) ); _PROTOTYPE( int fgetpos, (FILE *_stream, fpos_t *_pos) ); _PROTOTYPE( int fseek, (FILE *_stream, long _offset, int _whence) ); _PROTOTYPE( int fsetpos, (FILE *_stream, fpos_t *_pos) ); _PROTOTYPE( long ftell, (FILE *_stream) ); _PROTOTYPE( void rewind, (FILE *_stream) ); _PROTOTYPE( void clearerr, (FILE *_stream) ); _PROTOTYPE( int feof, (FILE *_stream) ); _PROTOTYPE( int ferror, (FILE *_stream) ); _PROTOTYPE( void perror, (const char *_s) ); _PROTOTYPE( int __fillbuf, (FILE *_stream) ); _PROTOTYPE( int __flushbuf, (int _c, FILE *_stream) ); #define getchar() getc(stdin) #define putchar(c) putc(c,stdout) #define getc(p) (--(p)->_count >= 0 ? (int) (*(p)->_ptr++) : \ __fillbuf(p)) #define putc(c, p) (--(p)->_count >= 0 ? \ (int) (*(p)->_ptr++ = (c)) : \ __flushbuf((c),(p))) #define feof(p) (((p)->_flags & _IOEOF) != 0) #define ferror(p) (((p)->_flags & _IOERR) != 0) #define clearerr(p) ((p)->_flags &= ~(_IOERR|_IOEOF)) #ifdef _POSIX_SOURCE _PROTOTYPE( int fileno, (FILE *_stream) ); _PROTOTYPE (FILE *fdopen, (int _fildes, const char *_types) ); #define fileno(stream) ((stream)->_fd) #define L_ctermid 255 /* required by POSIX */ #define L_cuserid 255 /* required by POSIX */ #endif #ifdef _MINIX _PROTOTYPE(FILE *popen, (const char *_command, const char *_type)); _PROTOTYPE(int pclose, (FILE *_stream)); _PROTOTYPE(int snprintf, (char *_s, size_t _n, const char *_format, ...)); _PROTOTYPE(int vsnprintf, (char *_s, size_t _n, const char *_format, char *_arg) ); #endif #endif /* _STDIO_H */ /* The header defines certain common macros, types, and functions.*/ #ifndef _STDLIB_H #define _STDLIB_H #ifndef _ANSI_H #include #endif /* The macros are NULL, EXIT_FAILURE, EXIT_SUCCESS, RAND_MAX, and MB_CUR_MAX.*/ #define NULL ((void *)0) #define EXIT_FAILURE 1 /* standard error return using exit() */ #define EXIT_SUCCESS 0 /* successful return using exit() */ #define RAND_MAX 32767 /* largest value generated by rand() */ #define MB_CUR_MAX 1 /* max value of multibyte character in MINIX */ typedef struct { int quot, rem; } div_t; typedef struct { long quot, rem; } ldiv_t; /* The types are size_t, wchar_t, div_t, and ldiv_t. */ #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; /* type returned by sizeof */ #endif #ifndef _WCHAR_T #define _WCHAR_T typedef char wchar_t; /* type expanded character set */ #endif /* Function Prototypes. */ _PROTOTYPE( void abort, (void) ); _PROTOTYPE( int abs, (int _j) ); _PROTOTYPE( int atexit, (void (*_func)(void)) ); _PROTOTYPE( double atof, (const char *_nptr) ); _PROTOTYPE( int atoi, (const char *_nptr) ); _PROTOTYPE( long atol, (const char *_nptr) ); _PROTOTYPE( void *calloc, (size_t _nmemb, size_t _size) ); _PROTOTYPE( div_t div, (int _numer, int _denom) ); _PROTOTYPE( void exit, (int _status) ); _PROTOTYPE( void free, (void *_ptr) ); _PROTOTYPE( char *getenv, (const char *_name) ); _PROTOTYPE( long labs, (long _j) ); _PROTOTYPE( ldiv_t ldiv, (long _numer, long _denom) ); _PROTOTYPE( void *malloc, (size_t _size) ); _PROTOTYPE( int mblen, (const char *_s, size_t _n) ); _PROTOTYPE( size_t mbstowcs, (wchar_t *_pwcs, const char *_s, size_t _n)); _PROTOTYPE( int mbtowc, (wchar_t *_pwc, const char *_s, size_t _n) ); _PROTOTYPE( int rand, (void) ); _PROTOTYPE( void *realloc, (void *_ptr, size_t _size) ); _PROTOTYPE( void srand, (unsigned int _seed) ); _PROTOTYPE( double strtod, (const char *_nptr, char **_endptr) ); _PROTOTYPE( long strtol, (const char *_nptr, char **_endptr, int _base) ); _PROTOTYPE( int system, (const char *_string) ); _PROTOTYPE( size_t wcstombs, (char *_s, const wchar_t *_pwcs, size_t _n)); _PROTOTYPE( int wctomb, (char *_s, wchar_t _wchar) ); _PROTOTYPE( void *bsearch, (const void *_key, const void *_base, size_t _nmemb, size_t _size, int (*compar) (const void *, const void *)) ); _PROTOTYPE( void qsort, (void *_base, size_t _nmemb, size_t _size, int (*compar) (const void *, const void *)) ); _PROTOTYPE( unsigned long int strtoul, (const char *_nptr, char **_endptr, int _base) ); #ifdef _MINIX _PROTOTYPE( int putenv, (const char *_name) ); _PROTOTYPE(int getopt, (int _argc, char **_argv, char *_opts)); extern char *optarg; extern int optind, opterr, optopt; #endif /* _MINIX */ #endif /* STDLIB_H */ /* The header contains prototypes for the string handling * functions. */ #ifndef _STRING_H #define _STRING_H #define NULL ((void *)0) #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; /* type returned by sizeof */ #endif /*_SIZE_T */ /* Function Prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( void *memchr, (const void *_s, int _c, size_t _n) ); _PROTOTYPE( int memcmp, (const void *_s1, const void *_s2, size_t _n) ); _PROTOTYPE( void *memcpy, (void *_s1, const void *_s2, size_t _n) ); _PROTOTYPE( void *memmove, (void *_s1, const void *_s2, size_t _n) ); _PROTOTYPE( void *memset, (void *_s, int _c, size_t _n) ); _PROTOTYPE( char *strcat, (char *_s1, const char *_s2) ); _PROTOTYPE( char *strchr, (const char *_s, int _c) ); _PROTOTYPE( int strncmp, (const char *_s1, const char *_s2, size_t _n) ); _PROTOTYPE( int strcmp, (const char *_s1, const char *_s2) ); _PROTOTYPE( int strcoll, (const char *_s1, const char *_s2) ); _PROTOTYPE( char *strcpy, (char *_s1, const char *_s2) ); _PROTOTYPE( size_t strcspn, (const char *_s1, const char *_s2) ); _PROTOTYPE( char *strerror, (int _errnum) ); _PROTOTYPE( size_t strlen, (const char *_s) ); _PROTOTYPE( char *strncat, (char *_s1, const char *_s2, size_t _n) ); _PROTOTYPE( char *strncpy, (char *_s1, const char *_s2, size_t _n) ); _PROTOTYPE( char *strpbrk, (const char *_s1, const char *_s2) ); _PROTOTYPE( char *strrchr, (const char *_s, int _c) ); _PROTOTYPE( size_t strspn, (const char *_s1, const char *_s2) ); _PROTOTYPE( char *strstr, (const char *_s1, const char *_s2) ); _PROTOTYPE( char *strtok, (char *_s1, const char *_s2) ); _PROTOTYPE( size_t strxfrm, (char *_s1, const char *_s2, size_t _n) ); #ifdef _MINIX /* For backward compatibility. */ _PROTOTYPE( char *index, (const char *_s, int _charwanted) ); _PROTOTYPE( char *rindex, (const char *_s, int _charwanted) ); _PROTOTYPE( void bcopy, (const void *_src, void *_dst, size_t _length) ); _PROTOTYPE( int bcmp, (const void *_s1, const void *_s2, size_t _length)); _PROTOTYPE( void bzero, (void *_dst, size_t _length) ); _PROTOTYPE( void *memccpy, (char *_dst, const char *_src, int _ucharstop, size_t _size) ); /* Misc. extra functions */ _PROTOTYPE( int strcasecmp, (const char *_s1, const char *_s2) ); _PROTOTYPE( int strncasecmp, (const char *_s1, const char *_s2, size_t _len) ); _PROTOTYPE( size_t strnlen, (const char *_s, size_t _n) ); #endif #endif /* _STRING_H */ . ..asynchio.hdir.hioctl.hmtio.hptrace.hsigcontext.hstat.htimes.htypes.hutsname.hwait.hsvrctl.h/* asynchio.h - Asynchronous I/O Author: Kees J. Bot * 26 Jan 1995 * This is just a fake async I/O library to be used for programs * written for Minix-vmd that must also run under standard Minix. * This limits the number of ugly #ifdefs somewhat. The programs must * be restricted to performing just one service, of course. */ #ifndef _SYS__ASYNCHIO_H #define _SYS__ASYNCHIO_H #ifndef _ANSI_H #include #endif typedef struct { char state; char op; char fd; char req; void *data; ssize_t count; int errno; } asynchio_t; #define ASYN_NONBLOCK 0x01 struct timeval { long tv_sec, tv_usec; }; #define EINPROGRESS EINTR #define ASYN_INPROGRESS EINPROGRESS void asyn_init(asynchio_t *_asyn); ssize_t asyn_read(asynchio_t *_asyn, int _fd, void *_buf, size_t _len); ssize_t asyn_write(asynchio_t *_asyn, int _fd, const void *_buf, size_t _len); int asyn_ioctl(asynchio_t *_asyn, int _fd, unsigned long _request, void *_data); int asyn_wait(asynchio_t *_asyn, int _flags, struct timeval *to); int asyn_synch(asynchio_t *_asyn, int _fd); int asyn_close(asynchio_t *_asyn, int _fd); #endif /* _SYS__ASYNCHIO_H */ /* The header gives the layout of a directory. */ #ifndef _DIR_H #define _DIR_H #define DIRBLKSIZ 512 /* size of directory block */ #ifndef DIRSIZ #define DIRSIZ 14 #endif struct direct { ino_t d_ino; char d_name[DIRSIZ]; }; #endif /* _DIR_H */ /* The ioctl.h header declares device controlling operations. */ #ifndef _IOCTL_H #define _IOCTL_H #ifndef _TYPES_H #include #endif #if _EM_WSIZE >= 4 /* Ioctls have the command encoded in the low-order word, and the size * of the parameter in the high-order word. The 3 high bits of the high- * order word are used to encode the in/out/void status of the parameter. */ #define _IOCPARM_MASK 0x1FFF #define _IOC_VOID 0x20000000 #define _IOCTYPE_MASK 0xFFFF #define _IOC_IN 0x40000000 #define _IOC_OUT 0x80000000 #define _IOC_INOUT (_IOC_IN | _IOC_OUT) #define _IO(x,y) ((x << 8) | y | _IOC_VOID) #define _IOR(x,y,t) ((x << 8) | y | ((sizeof(t) & _IOCPARM_MASK) << 16) |\ _IOC_OUT) #define _IOW(x,y,t) ((x << 8) | y | ((sizeof(t) & _IOCPARM_MASK) << 16) |\ _IOC_IN) #define _IORW(x,y,t) ((x << 8) | y | ((sizeof(t) & _IOCPARM_MASK) << 16) |\ _IOC_INOUT) #else /* No fancy encoding on a 16-bit machine. */ #define _IO(x,y) ((x << 8) | y) #define _IOR(x,y,t) _IO(x,y) #define _IOW(x,y,t) _IO(x,y) #define _IORW(x,y,t) _IO(x,y) #endif /* Terminal ioctls. */ #define TCGETS _IOR('T', 8, struct termios) /* tcgetattr */ #define TCSETS _IOW('T', 9, struct termios) /* tcsetattr, TCSANOW */ #define TCSETSW _IOW('T', 10, struct termios) /* tcsetattr, TCSADRAIN */ #define TCSETSF _IOW('T', 11, struct termios) /* tcsetattr, TCSAFLUSH */ #define TCSBRK _IOW('T', 12, int) /* tcsendbreak */ #define TCDRAIN _IO ('T', 13) /* tcdrain */ #define TCFLOW _IOW('T', 14, int) /* tcflow */ #define TCFLSH _IOW('T', 15, int) /* tcflush */ #define TIOCGWINSZ _IOR('T', 16, struct winsize) #define TIOCSWINSZ _IOW('T', 17, struct winsize) #define TIOCGPGRP _IOW('T', 18, int) #define TIOCSPGRP _IOW('T', 19, int) #define TIOCSFON _IOW('T', 20, u8_t [8192]) #define TIOCGETP _IOR('t', 1, struct sgttyb) #define TIOCSETP _IOW('t', 2, struct sgttyb) #define TIOCGETC _IOR('t', 3, struct tchars) #define TIOCSETC _IOW('t', 4, struct tchars) /* Network ioctls. */ #define NWIOSETHOPT _IOW('n', 16, struct nwio_ethopt) #define NWIOGETHOPT _IOR('n', 17, struct nwio_ethopt) #define NWIOGETHSTAT _IOR('n', 18, struct nwio_ethstat) #define NWIOSIPCONF _IOW('n', 32, struct nwio_ipconf) #define NWIOGIPCONF _IOR('n', 33, struct nwio_ipconf) #define NWIOSIPOPT _IOW('n', 34, struct nwio_ipopt) #define NWIOGIPOPT _IOR('n', 35, struct nwio_ipopt) #define NWIOGIPOROUTE _IORW('n', 40, struct nwio_route) #define NWIOSIPOROUTE _IOW ('n', 41, struct nwio_route) #define NWIODIPOROUTE _IOW ('n', 42, struct nwio_route) #define NWIOGIPIROUTE _IORW('n', 43, struct nwio_route) #define NWIOSIPIROUTE _IOW ('n', 44, struct nwio_route) #define NWIODIPIROUTE _IOW ('n', 45, struct nwio_route) #define NWIOSTCPCONF _IOW('n', 48, struct nwio_tcpconf) #define NWIOGTCPCONF _IOR('n', 49, struct nwio_tcpconf) #define NWIOTCPCONN _IOW('n', 50, struct nwio_tcpcl) #define NWIOTCPLISTEN _IOW('n', 51, struct nwio_tcpcl) #define NWIOTCPATTACH _IOW('n', 52, struct nwio_tcpatt) #define NWIOTCPSHUTDOWN _IO ('n', 53) #define NWIOSTCPOPT _IOW('n', 54, struct nwio_tcpopt) #define NWIOGTCPOPT _IOR('n', 55, struct nwio_tcpopt) #define NWIOSUDPOPT _IOW('n', 64, struct nwio_udpopt) #define NWIOGUDPOPT _IOR('n', 65, struct nwio_udpopt) #define NWIOSPSIPOPT _IOW('n', 80, struct nwio_psipopt) #define NWIOGPSIPOPT _IOR('n', 81, struct nwio_psipopt) /* Disk ioctls. */ #define DIOCSETP _IOW('d', 3, struct partition) #define DIOCGETP _IOR('d', 4, struct partition) #define DIOCEJECT _IO ('d', 5) /* Keyboard ioctls. */ #define KIOCSMAP _IOW('k', 3, keymap_t) /* Memory ioctls. */ #define MIOCRAMSIZE _IOW('m', 3, u32_t) /* Size of the ramdisk */ #define MIOCSPSINFO _IOW('m', 4, void *) #define MIOCGPSINFO _IOR('m', 5, struct psinfo) #define MIOCINT86 _IORW('m', 6, struct mio_int86) #define MIOCGLDT86 _IORW('m', 7, struct mio_ldt86) #define MIOCSLDT86 _IOW('m', 8, struct mio_ldt86) /* Magnetic tape ioctls. */ #define MTIOCTOP _IOW('M', 1, struct mtop) #define MTIOCGET _IOR('M', 2, struct mtget) /* SCSI command. */ #define SCIOCCMD _IOW('S', 1, struct scsicmd) /* Soundcard DSP ioctls. */ #define DSPIORATE _IOR('s', 1, unsigned int) #define DSPIOSTEREO _IOR('s', 2, unsigned int) #define DSPIOSIZE _IOR('s', 3, unsigned int) #define DSPIOBITS _IOR('s', 4, unsigned int) #define DSPIOSIGN _IOR('s', 5, unsigned int) #define DSPIOMAX _IOW('s', 6, unsigned int) #define DSPIORESET _IO ('s', 7) /* Soundcard mixer ioctls. */ #define MIXIOGETVOLUME _IORW('s', 10, struct volume_level) #define MIXIOGETINPUTLEFT _IORW('s', 11, struct inout_ctrl) #define MIXIOGETINPUTRIGHT _IORW('s', 12, struct inout_ctrl) #define MIXIOGETOUTPUT _IORW('s', 13, struct inout_ctrl) #define MIXIOSETVOLUME _IORW('s', 20, struct volume_level) #define MIXIOSETINPUTLEFT _IORW('s', 21, struct inout_ctrl) #define MIXIOSETINPUTRIGHT _IORW('s', 22, struct inout_ctrl) #define MIXIOSETOUTPUT _IORW('s', 23, struct inout_ctrl) _PROTOTYPE( int ioctl, (int _fd, int _request, void *_data) ); #endif /* _IOCTL_H */ /* magnetic tape commands Author: Kees J. Bot */ #ifndef _SYS__MTIO_H #define _SYS__MTIO_H /* Tape operations: ioctl(fd, MTIOCTOP, &struct mtop) */ struct mtop { short mt_op; /* Operation (MTWEOF, etc.) */ int mt_count; /* Repeat count. */ }; #define MTWEOF 0 /* Write End-Of-File Marker */ #define MTFSF 1 /* Forward Space File mark */ #define MTBSF 2 /* Backward Space File mark */ #define MTFSR 3 /* Forward Space Record */ #define MTBSR 4 /* Backward Space Record */ #define MTREW 5 /* Rewind tape */ #define MTOFFL 6 /* Rewind and take Offline */ #define MTNOP 7 /* No-Operation, set status only */ #define MTRETEN 8 /* Retension (completely wind and rewind) */ #define MTERASE 9 /* Erase the tape and rewind */ #define MTEOM 10 /* Position at End-Of-Media */ #define MTMODE 11 /* Select tape density */ #define MTBLKZ 12 /* Select tape block size */ /* Tape status: ioctl(fd, MTIOCGET, &struct mtget) */ struct mtget { short mt_type; /* Type of tape device. */ /* Device dependent "registers". */ short mt_dsreg; /* Drive status register. */ short mt_erreg; /* Error register. */ short dummy; /* (alignment) */ /* Misc info. */ off_t mt_resid; /* Residual count. */ off_t mt_fileno; /* Current File Number. */ off_t mt_blkno; /* Current Block Number within file. */ off_t mt_blksize; /* Current block size. */ }; #endif /* _SYS__MTIO_H */ /* * definitions for ptrace(2) */ #ifndef _PTRACE_H #define _PTRACE_H #define T_STOP -1 /* stop the process */ #define T_OK 0 /* enable tracing by parent for this process */ #define T_GETINS 1 /* return value from instruction space */ #define T_GETDATA 2 /* return value from data space */ #define T_GETUSER 3 /* return value from user process table */ #define T_SETINS 4 /* set value from instruction space */ #define T_SETDATA 5 /* set value from data space */ #define T_SETUSER 6 /* set value in user process table */ #define T_RESUME 7 /* resume execution */ #define T_EXIT 8 /* exit */ #define T_STEP 9 /* set trace bit */ /* Function Prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( long ptrace, (int _req, pid_t _pid, long _addr, long _data) ); #endif /* _PTRACE_H */ #ifndef _SIGCONTEXT_H #define _SIGCONTEXT_H /* The sigcontext structure is used by the sigreturn(2) system call. * sigreturn() is seldom called by user programs, but it is used internally * by the signal catching mechanism. */ #ifndef _ANSI_H #include #endif #ifndef _CONFIG_H #include #endif #if !defined(CHIP) #include "error, configuration is not known" #endif /* The following structure should match the stackframe_s structure used * by the kernel's context switching code. Floating point registers should * be added in a different struct. */ #if (CHIP == INTEL) struct sigregs { #if _WORD_SIZE == 4 short sr_gs; short sr_fs; #endif /* _WORD_SIZE == 4 */ short sr_es; short sr_ds; int sr_di; int sr_si; int sr_bp; int sr_st; /* stack top -- used in kernel */ int sr_bx; int sr_dx; int sr_cx; int sr_retreg; int sr_retadr; /* return address to caller of save -- used * in kernel */ int sr_pc; int sr_cs; int sr_psw; int sr_sp; int sr_ss; }; struct sigframe { /* stack frame created for signalled process */ _PROTOTYPE( void (*sf_retadr), (void) ); int sf_signo; int sf_code; struct sigcontext *sf_scp; int sf_fp; _PROTOTYPE( void (*sf_retadr2), (void) ); struct sigcontext *sf_scpcopy; }; #else #if (CHIP == M68000) struct sigregs { long sr_retreg; /* d0 */ long sr_d1; long sr_d2; long sr_d3; long sr_d4; long sr_d5; long sr_d6; long sr_d7; long sr_a0; long sr_a1; long sr_a2; long sr_a3; long sr_a4; long sr_a5; long sr_a6; long sr_sp; /* also known as a7 */ long sr_pc; short sr_psw; short sr_dummy; /* make size multiple of 4 for system.c */ }; #else #include "error, CHIP is not supported" #endif #endif /* CHIP == INTEL */ struct sigcontext { int sc_flags; /* sigstack state to restore */ long sc_mask; /* signal mask to restore */ struct sigregs sc_regs; /* register set to restore */ }; #if (CHIP == INTEL) #if _WORD_SIZE == 4 #define sc_gs sc_regs.sr_gs #define sc_fs sc_regs.sr_fs #endif /* _WORD_SIZE == 4 */ #define sc_es sc_regs.sr_es #define sc_ds sc_regs.sr_ds #define sc_di sc_regs.sr_di #define sc_si sc_regs.sr_si #define sc_fp sc_regs.sr_bp #define sc_st sc_regs.sr_st /* stack top -- used in kernel */ #define sc_bx sc_regs.sr_bx #define sc_dx sc_regs.sr_dx #define sc_cx sc_regs.sr_cx #define sc_retreg sc_regs.sr_retreg #define sc_retadr sc_regs.sr_retadr /* return address to caller of save -- used in kernel */ #define sc_pc sc_regs.sr_pc #define sc_cs sc_regs.sr_cs #define sc_psw sc_regs.sr_psw #define sc_sp sc_regs.sr_sp #define sc_ss sc_regs.sr_ss #endif /* CHIP == INTEL */ #if (CHIP == M68000) #define sc_retreg sc_regs.sr_retreg #define sc_d1 sc_regs.sr_d1 #define sc_d2 sc_regs.sr_d2 #define sc_d3 sc_regs.sr_d3 #define sc_d4 sc_regs.sr_d4 #define sc_d5 sc_regs.sr_d5 #define sc_d6 sc_regs.sr_d6 #define sc_d7 sc_regs.sr_d7 #define sc_a0 sc_regs.sr_a0 #define sc_a1 sc_regs.sr_a1 #define sc_a2 sc_regs.sr_a2 #define sc_a3 sc_regs.sr_a3 #define sc_a4 sc_regs.sr_a4 #define sc_a5 sc_regs.sr_a5 #define sc_fp sc_regs.sr_a6 #define sc_sp sc_regs.sr_sp #define sc_pc sc_regs.sr_pc #define sc_psw sc_regs.sr_psw #endif /* CHIP == M68000 */ /* Values for sc_flags. Must agree with . */ #define SC_SIGCONTEXT 2 /* nonzero when signal context is included */ #define SC_NOREGLOCALS 4 /* nonzero when registers are not to be saved and restored */ _PROTOTYPE( int sigreturn, (struct sigcontext *_scp) ); #endif /* _SIGCONTEXT_H */ /* The header defines a struct that is used in the stat() and * fstat functions. The information in this struct comes from the i-node of * some file. These calls are the only approved way to inspect i-nodes. */ #ifndef _STAT_H #define _STAT_H #ifndef _TYPES_H #include #endif struct stat { dev_t st_dev; /* major/minor device number */ ino_t st_ino; /* i-node number */ mode_t st_mode; /* file mode, protection bits, etc. */ short int st_nlink; /* # links; TEMPORARY HACK: should be nlink_t*/ uid_t st_uid; /* uid of the file's owner */ short int st_gid; /* gid; TEMPORARY HACK: should be gid_t */ dev_t st_rdev; off_t st_size; /* file size */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last data modification */ time_t st_ctime; /* time of last file status change */ }; /* Traditional mask definitions for st_mode. */ /* The ugly casts on only some of the definitions are to avoid suprising sign * extensions such as S_IFREG != (mode_t) S_IFREG when ints are 32 bits. */ #define S_IFMT ((mode_t) 0170000) /* type of file */ #define S_IFREG ((mode_t) 0100000) /* regular */ #define S_IFBLK 0060000 /* block special */ #define S_IFDIR 0040000 /* directory */ #define S_IFCHR 0020000 /* character special */ #define S_IFIFO 0010000 /* this is a FIFO */ #define S_ISUID 0004000 /* set user id on execution */ #define S_ISGID 0002000 /* set group id on execution */ /* next is reserved for future use */ #define S_ISVTX 01000 /* save swapped text even after use */ /* POSIX masks for st_mode. */ #define S_IRWXU 00700 /* owner: rwx------ */ #define S_IRUSR 00400 /* owner: r-------- */ #define S_IWUSR 00200 /* owner: -w------- */ #define S_IXUSR 00100 /* owner: --x------ */ #define S_IRWXG 00070 /* group: ---rwx--- */ #define S_IRGRP 00040 /* group: ---r----- */ #define S_IWGRP 00020 /* group: ----w---- */ #define S_IXGRP 00010 /* group: -----x--- */ #define S_IRWXO 00007 /* others: ------rwx */ #define S_IROTH 00004 /* others: ------r-- */ #define S_IWOTH 00002 /* others: -------w- */ #define S_IXOTH 00001 /* others: --------x */ /* The following macros test st_mode (from POSIX Sec. 5.6.1.1). */ #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) /* is a reg file */ #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) /* is a directory */ #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) /* is a char spec */ #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) /* is a block spec */ #define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) /* is a pipe/FIFO */ /* Function Prototypes. */ _PROTOTYPE( int chmod, (const char *_path, Mode_t _mode) ); _PROTOTYPE( int fstat, (int _fildes, struct stat *_buf) ); _PROTOTYPE( int mkdir, (const char *_path, Mode_t _mode) ); _PROTOTYPE( int mkfifo, (const char *_path, Mode_t _mode) ); _PROTOTYPE( int stat, (const char *_path, struct stat *_buf) ); _PROTOTYPE( mode_t umask, (Mode_t _cmask) ); #endif /* _STAT_H */ /* The header is for time times() system call. */ #ifndef _TIMES_H #define _TIMES_H #ifndef _CLOCK_T #define _CLOCK_T typedef long clock_t; /* unit for system accounting */ #endif struct tms { clock_t tms_utime; clock_t tms_stime; clock_t tms_cutime; clock_t tms_cstime; }; /* Function Prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( clock_t times, (struct tms *_buffer) ); #endif /* _TIMES_H */ /* The header contains important data type definitions. * It is considered good programming practice to use these definitions, * instead of the underlying base type. By convention, all type names end * with _t. */ #ifndef _TYPES_H #define _TYPES_H #ifndef _ANSI_H #include #endif /* The type size_t holds all results of the sizeof operator. At first glance, * it seems obvious that it should be an unsigned int, but this is not always * the case. For example, MINIX-ST (68000) has 32-bit pointers and 16-bit * integers. When one asks for the size of a 70K struct or array, the result * requires 17 bits to express, so size_t must be a long type. The type * ssize_t is the signed version of size_t. */ #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; #endif #ifndef _SSIZE_T #define _SSIZE_T typedef int ssize_t; #endif #ifndef _TIME_T #define _TIME_T typedef long time_t; /* time in sec since 1 Jan 1970 0000 GMT */ #endif #ifndef _CLOCK_T #define _CLOCK_T typedef long clock_t; /* unit for system accounting */ #endif #ifndef _SIGSET_T #define _SIGSET_T typedef unsigned long sigset_t; #endif /* Types used in disk, inode, etc. data structures. */ typedef short dev_t; /* holds (major|minor) device pair */ typedef char gid_t; /* group id */ typedef unsigned short ino_t; /* i-node number */ typedef unsigned short mode_t; /* file type and permissions bits */ typedef char nlink_t; /* number of links to a file */ typedef unsigned long off_t; /* offset within a file */ typedef int pid_t; /* process id (must be signed) */ typedef short uid_t; /* user id */ typedef unsigned long zone_t; /* zone number */ typedef unsigned long block_t; /* block number */ typedef unsigned long bit_t; /* bit number in a bit map */ typedef unsigned short zone1_t; /* zone number for V1 file systems */ typedef unsigned short bitchunk_t; /* collection of bits in a bitmap */ typedef unsigned char u8_t; /* 8 bit type */ typedef unsigned short u16_t; /* 16 bit type */ typedef unsigned long u32_t; /* 32 bit type */ typedef char i8_t; /* 8 bit signed type */ typedef short i16_t; /* 16 bit signed type */ typedef long i32_t; /* 32 bit signed type */ typedef struct { u32_t _[2]; } u64_t; /* The following types are needed because MINIX uses K&R style function * definitions (for maximum portability). When a short, such as dev_t, is * passed to a function with a K&R definition, the compiler automatically * promotes it to an int. The prototype must contain an int as the parameter, * not a short, because an int is what an old-style function definition * expects. Thus using dev_t in a prototype would be incorrect. It would be * sufficient to just use int instead of dev_t in the prototypes, but Dev_t * is clearer. */ typedef int Dev_t; typedef int Gid_t; typedef int Nlink_t; typedef int Uid_t; typedef int U8_t; typedef unsigned long U32_t; typedef int I8_t; typedef int I16_t; typedef long I32_t; /* ANSI C makes writing down the promotion of unsigned types very messy. When * sizeof(short) == sizeof(int), there is no promotion, so the type stays * unsigned. When the compiler is not ANSI, there is usually no loss of * unsignedness, and there are usually no prototypes so the promoted type * doesn't matter. The use of types like Ino_t is an attempt to use ints * (which are not promoted) while providing information to the reader. */ #if _EM_WSIZE == 2 typedef unsigned int Ino_t; typedef unsigned int Zone1_t; typedef unsigned int Bitchunk_t; typedef unsigned int U16_t; typedef unsigned int Mode_t; #else /* _EM_WSIZE == 4, or _EM_WSIZE undefined */ typedef int Ino_t; typedef int Zone1_t; typedef int Bitchunk_t; typedef int U16_t; typedef int Mode_t; #endif /* _EM_WSIZE == 2, etc */ /* Signal handler type, e.g. SIG_IGN */ typedef void _PROTOTYPE( (*sighandler_t), (int) ); #endif /* _TYPES_H */ /* The header gives the system name. */ #ifndef _UTSNAME_H #define _UTSNAME_H #ifndef _ANSI_H #include #endif struct utsname { char sysname[15+1]; char nodename[255+1]; char release[11+1]; char version[7+1]; char machine[11+1]; char arch[11+1]; }; /* Function Prototypes. */ _PROTOTYPE( int uname, (struct utsname *_name) ); #endif /* _UTSNAME_H */ /* The header contains macros related to wait(). The value * returned by wait() and waitpid() depends on whether the process * terminated by an exit() call, was killed by a signal, or was stopped * due to job control, as follows: * * High byte Low byte * +---------------------+ * exit(status) | status | 0 | * +---------------------+ * killed by signal | 0 | signal | * +---------------------+ * stopped (job control) | signal | 0177 | * +---------------------+ */ #ifndef _WAIT_H #define _WAIT_H #ifndef _TYPES_H #include #endif #define _LOW(v) ( (v) & 0377) #define _HIGH(v) ( ((v) >> 8) & 0377) #define WNOHANG 1 /* do not wait for child to exit */ #define WUNTRACED 2 /* for job control; not implemented */ #define WIFEXITED(s) (_LOW(s) == 0) /* normal exit */ #define WEXITSTATUS(s) (_HIGH(s)) /* exit status */ #define WTERMSIG(s) (_LOW(s) & 0177) /* sig value */ #define WIFSIGNALED(s) (((unsigned int)(s)-1 & 0xFFFF) < 0xFF) /* signaled */ #define WIFSTOPPED(s) (_LOW(s) == 0177) /* stopped */ #define WSTOPSIG(s) (_HIGH(s) & 0377) /* stop signal */ /* Function Prototypes. */ _PROTOTYPE( pid_t wait, (int *_stat_loc) ); _PROTOTYPE( pid_t waitpid, (pid_t _pid, int *_stat_loc, int _options) ); #endif /* _WAIT_H */ /* sys/svrctl.h Created: Feb 15, 1994 by Philip Homburg */ #ifndef _SYS__SVRCTL_H #define _SYS__SVRCTL_H #ifndef _TYPES_H #include #endif /* Server control commands have the same encoding as the commands for ioctls. */ #include /* MM controls. */ #define MMSIGNON _IO ('M', 4) #define MMSWAPON _IOW('M', 5, struct mmswapon) #define MMSWAPOFF _IO ('M', 6) /* FS controls. */ #define FSSIGNON _IOW('F', 2, struct fssignon) #define FSDEVMAP _IORW('F', 5, struct fsdevmap) /* Kernel controls. */ #define SYSSIGNON _IOR('S', 2, struct systaskinfo) #define SYSGETENV _IOW('S', 5, struct sysgetenv) struct mmswapon { u32_t offset; /* Starting offset within file. */ u32_t size; /* Size of swap area. */ char file[128]; /* Name of swap file/device. */ }; enum fsdevstyle { STYLE_DEV, STYLE_NDEV, STYLE_TTY, STYLE_CLONE }; struct fssignon { dev_t dev; /* Example device to manage. */ enum fsdevstyle style; /* Management style. */ }; struct systaskinfo { int proc_nr; /* Process number of caller. */ }; struct sysgetenv { char *key; /* Name requested. */ size_t keylen; /* Length of name including \0. */ char *val; /* Buffer for returned data. */ size_t vallen; /* Size of return data buffer. */ }; _PROTOTYPE( int svrctl, (int _request, void *_data) ); #endif /* _SYS__SVRCTL_H */ /* The header is used with the tape archiver, tar. */ #ifndef _TAR_H #define _TAR_H #define TBLOCK 512 #define NAMSIZ 100 #define PFXSIZ 155 #define TMODLEN 8 #define TUIDLEN 8 #define TGIDLEN 8 #define TSIZLEN 12 #define TMTMLEN 12 #define TCKSLEN 8 #define TMAGIC "ustar" #define TMAGLEN 6 #define TVERSION "00" #define TVERSLEN 2 #define TUNMLEN 32 #define TGNMLEN 32 #define TDEVLEN 8 #define REGTYPE '0' #define AREGTYPE '\0' #define LNKTYPE '1' #define SYMTYPE '2' #define CHRTYPE '3' #define BLKTYPE '4' #define DIRTYPE '5' #define FIFOTYPE '6' #define CONTTYPE '7' #define TSUID 04000 #define TSGID 02000 #define TSVTX 01000 #define TUREAD 00400 #define TUWRITE 00200 #define TUEXEC 00100 #define TGREAD 00040 #define TGWRITE 00020 #define TGEXEC 00010 #define TOREAD 00004 #define TOWRITE 00002 #define TOEXEC 00001 union hblock { char dummy[TBLOCK]; struct header { char name[NAMSIZ]; char mode[TMODLEN]; char uid[TUIDLEN]; char gid[TGIDLEN]; char size[TSIZLEN]; char mtime[TMTMLEN]; char chksum[TCKSLEN]; char typeflag; char linkname[NAMSIZ]; char magic[TMAGLEN]; char version[TVERSLEN]; char uname[TUNMLEN]; char gname[TGNMLEN]; char devmajor[TDEVLEN]; char devminor[TDEVLEN]; char prefix[PFXSIZ]; } dbuf; }; #endif /* _TAR_H */ #ifndef _TERMCAP_H #define _TERMCAP_H #include _PROTOTYPE( int tgetent, (char *_bp, char *_name) ); _PROTOTYPE( int tgetflag, (char *_id) ); _PROTOTYPE( int tgetnum, (char *_id) ); _PROTOTYPE( char *tgetstr, (char *_id, char **_area) ); _PROTOTYPE( char *tgoto, (char *_cm, int _destcol, int _destline) ); _PROTOTYPE( int tputs, (char *_cp, int _affcnt, void (*_outc)(int)) ); #endif /* _TERMCAP_H */ /* The header is used for controlling tty modes. */ #ifndef _TERMIOS_H #define _TERMIOS_H typedef unsigned short tcflag_t; typedef unsigned char cc_t; typedef unsigned int speed_t; #define NCCS 20 /* size of cc_c array, some extra space * for extensions. */ /* Primary terminal control structure. POSIX Table 7-1. */ struct termios { tcflag_t c_iflag; /* input modes */ tcflag_t c_oflag; /* output modes */ tcflag_t c_cflag; /* control modes */ tcflag_t c_lflag; /* local modes */ speed_t c_ispeed; /* input speed */ speed_t c_ospeed; /* output speed */ cc_t c_cc[NCCS]; /* control characters */ }; /* Values for termios c_iflag bit map. POSIX Table 7-2. */ #define BRKINT 0x0001 /* signal interrupt on break */ #define ICRNL 0x0002 /* map CR to NL on input */ #define IGNBRK 0x0004 /* ignore break */ #define IGNCR 0x0008 /* ignore CR */ #define IGNPAR 0x0010 /* ignore characters with parity errors */ #define INLCR 0x0020 /* map NL to CR on input */ #define INPCK 0x0040 /* enable input parity check */ #define ISTRIP 0x0080 /* mask off 8th bit */ #define IXOFF 0x0100 /* enable start/stop input control */ #define IXON 0x0200 /* enable start/stop output control */ #define PARMRK 0x0400 /* mark parity errors in the input queue */ /* Values for termios c_oflag bit map. POSIX Sec. 7.1.2.3. */ #define OPOST 0x0001 /* perform output processing */ /* Values for termios c_cflag bit map. POSIX Table 7-3. */ #define CLOCAL 0x0001 /* ignore modem status lines */ #define CREAD 0x0002 /* enable receiver */ #define CSIZE 0x000C /* number of bits per character */ #define CS5 0x0000 /* if CSIZE is CS5, characters are 5 bits */ #define CS6 0x0004 /* if CSIZE is CS6, characters are 6 bits */ #define CS7 0x0008 /* if CSIZE is CS7, characters are 7 bits */ #define CS8 0x000C /* if CSIZE is CS8, characters are 8 bits */ #define CSTOPB 0x0010 /* send 2 stop bits if set, else 1 */ #define HUPCL 0x0020 /* hang up on last close */ #define PARENB 0x0040 /* enable parity on output */ #define PARODD 0x0080 /* use odd parity if set, else even */ /* Values for termios c_lflag bit map. POSIX Table 7-4. */ #define ECHO 0x0001 /* enable echoing of input characters */ #define ECHOE 0x0002 /* echo ERASE as backspace */ #define ECHOK 0x0004 /* echo KILL */ #define ECHONL 0x0008 /* echo NL */ #define ICANON 0x0010 /* canonical input (erase and kill enabled) */ #define IEXTEN 0x0020 /* enable extended functions */ #define ISIG 0x0040 /* enable signals */ #define NOFLSH 0x0080 /* disable flush after interrupt or quit */ #define TOSTOP 0x0100 /* send SIGTTOU (job control, not implemented*/ /* Indices into c_cc array. Default values in parentheses. POSIX Table 7-5. */ #define VEOF 0 /* cc_c[VEOF] = EOF char (^D) */ #define VEOL 1 /* cc_c[VEOL] = EOL char (undef) */ #define VERASE 2 /* cc_c[VERASE] = ERASE char (^H) */ #define VINTR 3 /* cc_c[VINTR] = INTR char (DEL) */ #define VKILL 4 /* cc_c[VKILL] = KILL char (^U) */ #define VMIN 5 /* cc_c[VMIN] = MIN value for timer */ #define VQUIT 6 /* cc_c[VQUIT] = QUIT char (^\) */ #define VTIME 7 /* cc_c[VTIME] = TIME value for timer */ #define VSUSP 8 /* cc_c[VSUSP] = SUSP (^Z, ignored) */ #define VSTART 9 /* cc_c[VSTART] = START char (^S) */ #define VSTOP 10 /* cc_c[VSTOP] = STOP char (^Q) */ #define _POSIX_VDISABLE (cc_t)0xFF /* You can't even generate this * character with 'normal' keyboards. * But some language specific keyboards * can generate 0xFF. It seems that all * 256 are used, so cc_t should be a * short... */ /* Values for the baud rate settings. POSIX Table 7-6. */ #define B0 0x0000 /* hang up the line */ #define B50 0x1000 /* 50 baud */ #define B75 0x2000 /* 75 baud */ #define B110 0x3000 /* 110 baud */ #define B134 0x4000 /* 134.5 baud */ #define B150 0x5000 /* 150 baud */ #define B200 0x6000 /* 200 baud */ #define B300 0x7000 /* 300 baud */ #define B600 0x8000 /* 600 baud */ #define B1200 0x9000 /* 1200 baud */ #define B1800 0xA000 /* 1800 baud */ #define B2400 0xB000 /* 2400 baud */ #define B4800 0xC000 /* 4800 baud */ #define B9600 0xD000 /* 9600 baud */ #define B19200 0xE000 /* 19200 baud */ #define B38400 0xF000 /* 38400 baud */ /* Optional actions for tcsetattr(). POSIX Sec. 7.2.1.2. */ #define TCSANOW 1 /* changes take effect immediately */ #define TCSADRAIN 2 /* changes take effect after output is done */ #define TCSAFLUSH 3 /* wait for output to finish and flush input */ /* Queue_selector values for tcflush(). POSIX Sec. 7.2.2.2. */ #define TCIFLUSH 1 /* flush accumulated input data */ #define TCOFLUSH 2 /* flush accumulated output data */ #define TCIOFLUSH 3 /* flush accumulated input and output data */ /* Action values for tcflow(). POSIX Sec. 7.2.2.2. */ #define TCOOFF 1 /* suspend output */ #define TCOON 2 /* restart suspended output */ #define TCIOFF 3 /* transmit a STOP character on the line */ #define TCION 4 /* transmit a START character on the line */ /* Function Prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( int tcsendbreak, (int _fildes, int _duration) ); _PROTOTYPE( int tcdrain, (int _filedes) ); _PROTOTYPE( int tcflush, (int _filedes, int _queue_selector) ); _PROTOTYPE( int tcflow, (int _filedes, int _action) ); _PROTOTYPE( speed_t cfgetispeed, (const struct termios *_termios_p) ); _PROTOTYPE( speed_t cfgetospeed, (const struct termios *_termios_p) ); _PROTOTYPE( int cfsetispeed, (struct termios *_termios_p, speed_t _speed) ); _PROTOTYPE( int cfsetospeed, (struct termios *_termios_p, speed_t _speed) ); _PROTOTYPE( int tcgetattr, (int _filedes, struct termios *_termios_p) ); _PROTOTYPE( int tcsetattr, \ (int _filedes, int _opt_actions, const struct termios *_termios_p) ); #define cfgetispeed(termios_p) ((termios_p)->c_ispeed) #define cfgetospeed(termios_p) ((termios_p)->c_ospeed) #define cfsetispeed(termios_p, speed) ((termios_p)->c_ispeed = (speed), 0) #define cfsetospeed(termios_p, speed) ((termios_p)->c_ospeed = (speed), 0) #ifdef _MINIX /* Here are the local extensions to the POSIX standard for Minix. Posix * conforming programs are not able to access these, and therefore they are * only defined when a Minix program is compiled. */ /* Extensions to the termios c_iflag bit map. */ #define IXANY 0x0800 /* allow any key to continue ouptut */ /* Extensions to the termios c_oflag bit map. They are only active iff * OPOST is enabled. */ #define ONLCR 0x0002 /* Map NL to CR-NL on output */ #define XTABS 0x0004 /* Expand tabs to spaces */ #define ONOEOT 0x0008 /* discard EOT's (^D) on output) */ /* Extensions to the termios c_lflag bit map. */ #define LFLUSHO 0x0200 /* Flush output. */ /* Extensions to the c_cc array. */ #define VREPRINT 11 /* cc_c[VREPRINT] (^R) */ #define VLNEXT 12 /* cc_c[VLNEXT] (^V) */ #define VDISCARD 13 /* cc_c[VDISCARD] (^O) */ /* Extensions to baud rate settings. */ #define B57600 0x0100 /* 57600 baud */ #define B115200 0x0200 /* 115200 baud */ /* These are the default settings used by the kernel and by 'stty sane' */ #define TCTRL_DEF (CREAD | CS8 | HUPCL) #define TINPUT_DEF (BRKINT | ICRNL | IXON | IXANY) #define TOUTPUT_DEF (OPOST | ONLCR) #define TLOCAL_DEF (ISIG | IEXTEN | ICANON | ECHO | ECHOE) #define TSPEED_DEF B9600 #define TEOF_DEF '\4' /* ^D */ #define TEOL_DEF _POSIX_VDISABLE #define TERASE_DEF '\10' /* ^H */ #define TINTR_DEF '\177' /* ^? */ #define TKILL_DEF '\25' /* ^U */ #define TMIN_DEF 1 #define TQUIT_DEF '\34' /* ^\ */ #define TSTART_DEF '\21' /* ^Q */ #define TSTOP_DEF '\23' /* ^S */ #define TSUSP_DEF '\32' /* ^Z */ #define TTIME_DEF 0 #define TREPRINT_DEF '\22' /* ^R */ #define TLNEXT_DEF '\26' /* ^V */ #define TDISCARD_DEF '\17' /* ^O */ /* Window size. This information is stored in the TTY driver but not used. * This can be used for screen  based applications in a window environment. * The ioctls TIOCGWINSZ and TIOCSWINSZ can be used to get and set this * information. */ struct winsize { unsigned short ws_row; /* rows, in characters */ unsigned short ws_col; /* columns, in characters */ unsigned short ws_xpixel; /* horizontal size, pixels */ unsigned short ws_ypixel; /* vertical size, pixels */ }; #endif /* _MINIX */ #endif /* _TERMIOS_H */ /* The header is used by the procedures that deal with time. * Handling time is surprisingly complicated, what with GMT, local time * and other factors. Although the Bishop of Ussher (1581-1656) once * calculated that based on the Bible, the world began on 12 Oct. 4004 BC * at 9 o'clock in the morning, in the UNIX world time begins at midnight, * 1 Jan. 1970 GMT. Before that, all was NULL and (void). */ #ifndef _TIME_H #define _TIME_H #define CLOCKS_PER_SEC 60 /* MINIX always uses 60 Hz, even in Europe */ #ifdef _POSIX_SOURCE #define CLK_TCK CLOCKS_PER_SEC /* obsolescent mame for CLOCKS_PER_SEC */ #endif #define NULL ((void *)0) #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; #endif #ifndef _TIME_T #define _TIME_T typedef long time_t; /* time in sec since 1 Jan 1970 0000 GMT */ #endif #ifndef _CLOCK_T #define _CLOCK_T typedef long clock_t; /* time in ticks since process started */ #endif struct tm { int tm_sec; /* seconds after the minute [0, 59] */ int tm_min; /* minutes after the hour [0, 59] */ int tm_hour; /* hours since midnight [0, 23] */ int tm_mday; /* day of the month [1, 31] */ int tm_mon; /* months since January [0, 11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday [0, 6] */ int tm_yday; /* days since January 1 [0, 365] */ int tm_isdst; /* Daylight Saving Time flag */ }; extern char *tzname[]; /* Function Prototypes. */ #ifndef _ANSI_H #include #endif _PROTOTYPE( clock_t clock, (void) ); _PROTOTYPE( double difftime, (time_t _time1, time_t _time0) ); _PROTOTYPE( time_t mktime, (struct tm *_timeptr) ); _PROTOTYPE( time_t time, (time_t *_timeptr) ); _PROTOTYPE( char *asctime, (const struct tm *_timeptr) ); _PROTOTYPE( char *ctime, (const time_t *_timer) ); _PROTOTYPE( struct tm *gmtime, (const time_t *_timer) ); _PROTOTYPE( struct tm *localtime, (const time_t *_timer) ); _PROTOTYPE( size_t strftime, (char *_s, size_t _max, const char *_fmt, const struct tm *_timep) ); #ifdef _POSIX_SOURCE _PROTOTYPE( void tzset, (void) ); #endif #ifdef _MINIX _PROTOTYPE( int stime, (time_t *_top) ); #endif #endif /* _TIME_H */ /* Constants describing the disk */ #define SECTOR_SIZE 512 #define SECTOR_SHIFT 9 #define RATIO (BLOCK_SIZE / SECTOR_SIZE) #define HRATIO (SECTOR_SIZE / HCLICK_SIZE) #define PARAMSEC 1 /* sector containing boot parameters */ #define DSKBASE 0x1E /* floppy disk parameter vector */ #define DSKPARSIZE 11 /* there are this many bytes of parameters */ #define ESC '\33' /* escape key */ #define HEADERSEG 0x0060 /* place for an array of struct exec's */ #define MINIXSEG 0x0080 /* MINIX loaded here (rounded up to a click) */ #define BOOTSEG 0x07C0 /* bootstraps are loaded here */ #define SIGNATURE 0xAA55 /* proper bootstraps have this signature */ #define SIGNATPOS 510 /* offset within bootblock */ #define FREESEG 0x0800 /* Memory from FREESEG to cseg is free */ #define MSEC_PER_TICK 55 /* 18.2 ticks per second */ /* Scan codes for four different keyboards (from kernel/keyboard.c) */ #define DUTCH_EXT_SCAN 32 /* 'd' */ #define OLIVETTI_SCAN 12 /* '=' key on olivetti */ #define STANDARD_SCAN 13 /* '=' key on IBM */ #define US_EXT_SCAN 22 /* 'u' */ /* Other */ #define ROOT_INO ((ino_t) 1) /* Inode nr of root dir. */ #define IM_NAME_MAX 63 /* Variables */ #ifndef EXTERN #define EXTERN extern #endif typedef struct vector { u16_t offset; u16_t segment; } vector; struct image_header { char name[IM_NAME_MAX + 1]; /* Null terminated. */ struct exec process; }; EXTERN vector rem_part; /* boot partition table entry */ EXTERN u16_t cseg, dseg; /* code and data segment of the boot program */ EXTERN u32_t runsize; /* size of this program */ EXTERN u16_t device; /* drive being booted from */ EXTERN u16_t heads, sectors; /* the drive's number of heads and sectors */ extern u16_t eqscancode; /* Set by peek/getch() if they see a '=' */ /* Sticky attributes */ #define E_SPECIAL 0x01 /* These are known to the program */ #define E_DEV 0x02 /* The value is a device name */ #define E_RESERVED 0x04 /* May not be set by user, e.g. scancode */ #define E_STICKY 0x07 /* Don't go once set */ /* Volatile attributes */ #define E_VAR 0x08 /* Variable */ #define E_FUNCTION 0x10 /* Function definition */ typedef struct environment { struct environment *next; char flags; char *name; /* name = value */ char *arg; /* name(arg) {value} */ char *value; char *defval; /* Safehouse for default values */ } environment; /* External variables */ EXTERN environment *env; /* Lists the environment */ EXTERN int fsok; /* True if the boot device contains an FS */ EXTERN u32_t lowsec; /* Offset to the file system on the boot dev */ /* Prototypes */ _PROTOTYPE( off_t r_super, (void)); _PROTOTYPE( void r_stat, (Ino_t _inum, struct stat *_stp )); _PROTOTYPE( ino_t r_readdir, (char *_name )); _PROTOTYPE( off_t r_vir2abs, (off_t _virblk )); _PROTOTYPE( ino_t r_lookup, (Ino_t _cwd, char *_path )); #ifdef _MONHEAD _PROTOTYPE( void readerr, (off_t _sec, int _err )); _PROTOTYPE( int numprefix, (char *_s, char **_ps )); _PROTOTYPE( int numeric, (char *_s )); _PROTOTYPE( dev_t name2dev, (char *_name )); _PROTOTYPE( int delay, (char *_msec )); _PROTOTYPE( char *unix_err, (int _err )); _PROTOTYPE( void init_cache, (void)); _PROTOTYPE( void invalidate_cache, (void)); _PROTOTYPE( char *b_value, (char *_name )); _PROTOTYPE( void raw_copy, (int _doff, int _dseg, int _soff, int _sseg, int _count)); _PROTOTYPE( void raw_clear, (int _off, int _seg, int _count)); _PROTOTYPE( void bootstrap, (int _device, int _partoff, int _partseg)); _PROTOTYPE( long a2l, (char *_a )); _PROTOTYPE( char *ul2a, (u32_t _n )); _PROTOTYPE( char *u2a, (int _n1 )); /* Functions defined in monhead.s and usable by other files. */ _PROTOTYPE( void reset_video, (int color)); _PROTOTYPE( int dev_geometry, (void)); _PROTOTYPE( u16_t get_ext_memsize, (void)); _PROTOTYPE( u16_t get_low_memsize, (void)); _PROTOTYPE( u16_t get_processor, (void)); _PROTOTYPE( u32_t get_tick, (void)); _PROTOTYPE( u16_t get_video, (void)); _PROTOTYPE( u16_t get_word, (int _off, int _seg)); _PROTOTYPE( int getchar, (void)); _PROTOTYPE( void minix, (void)); _PROTOTYPE( void minix86, (int _kcs, int _kds, char *_bpar, int _psize)); _PROTOTYPE( void minix386, (int _kcs, int _kds, char *_bpar, int _psize)); _PROTOTYPE( int peekchar, (void)); _PROTOTYPE( void put_word, (int _off, int _seg, int _word)); _PROTOTYPE( int putchar, (char _c)); _PROTOTYPE( int readsectors, (int _off, int _seg, off_t _adr, int _ct)); _PROTOTYPE( void reboot, (void)); _PROTOTYPE( void relocate, (void)); _PROTOTYPE( int writesectors, (int _off, int _seg, off_t _adr, int _ct)); #endif /* is used by getttyent(3). Author: Kees J. Bot * 28 Oct 1995 */ #ifndef _TTYENT_H #define _TTYENT_H #ifndef _ANSI_H #include #endif struct ttyent { char *ty_name; /* Name of the terminal device. */ char *ty_type; /* Terminal type name (termcap(3)). */ char **ty_getty; /* Program to run, normally getty. */ char **ty_init; /* Initialization command, normally stty. */ }; _PROTOTYPE( struct ttyent *getttyent, (void) ); _PROTOTYPE( struct ttyent *getttynam, (const char *_name) ); _PROTOTYPE( int setttyent, (void) ); _PROTOTYPE( void endttyent, (void) ); #endif /* _TTYENT_H */ /* The header contains a few miscellaneous manifest constants. */ #ifndef _UNISTD_H #define _UNISTD_H #ifndef _TYPES_H #include #endif /* Values used by access(). POSIX Table 2-8. */ #define F_OK 0 /* test if file exists */ #define X_OK 1 /* test if file is executable */ #define W_OK 2 /* test if file is writable */ #define R_OK 4 /* test if file is readable */ /* Values used for whence in lseek(fd, offset, whence). POSIX Table 2-9. */ #define SEEK_SET 0 /* offset is absolute */ #define SEEK_CUR 1 /* offset is relative to current position */ #define SEEK_END 2 /* offset is relative to end of file */ /* This value is required by POSIX Table 2-10. */ #define _POSIX_VERSION 199009L /* which standard is being conformed to */ /* These three definitions are required by POSIX Sec. 8.2.1.2. */ #define STDIN_FILENO 0 /* file descriptor for stdin */ #define STDOUT_FILENO 1 /* file descriptor for stdout */ #define STDERR_FILENO 2 /* file descriptor for stderr */ #ifdef _MINIX /* How to exit the system. */ #define RBT_HALT 0 #define RBT_REBOOT 1 #define RBT_PANIC 2 /* for servers */ #define RBT_MONITOR 3 /* let the monitor do this */ #define RBT_RESET 4 /* hard reset the system */ #endif /* NULL must be defined in according to POSIX Sec. 2.7.1. */ #define NULL ((void *)0) /* The following relate to configurable system variables. POSIX Table 4-2. */ #define _SC_ARG_MAX 1 #define _SC_CHILD_MAX 2 #define _SC_CLOCKS_PER_SEC 3 #define _SC_CLK_TCK 3 #define _SC_NGROUPS_MAX 4 #define _SC_OPEN_MAX 5 #define _SC_JOB_CONTROL 6 #define _SC_SAVED_IDS 7 #define _SC_VERSION 8 #define _SC_STREAM_MAX 9 #define _SC_TZNAME_MAX 10 /* The following relate to configurable pathname variables. POSIX Table 5-2. */ #define _PC_LINK_MAX 1 /* link count */ #define _PC_MAX_CANON 2 /* size of the canonical input queue */ #define _PC_MAX_INPUT 3 /* type-ahead buffer size */ #define _PC_NAME_MAX 4 /* file name size */ #define _PC_PATH_MAX 5 /* pathname size */ #define _PC_PIPE_BUF 6 /* pipe size */ #define _PC_NO_TRUNC 7 /* treatment of long name components */ #define _PC_VDISABLE 8 /* tty disable */ #define _PC_CHOWN_RESTRICTED 9 /* chown restricted or not */ /* POSIX defines several options that may be implemented or not, at the * implementer's whim. This implementer has made the following choices: * * _POSIX_JOB_CONTROL not defined: no job control * _POSIX_SAVED_IDS not defined: no saved uid/gid * _POSIX_NO_TRUNC defined as -1: long path names are truncated * _POSIX_CHOWN_RESTRICTED defined: you can't give away files * _POSIX_VDISABLE defined: tty functions can be disabled */ #define _POSIX_NO_TRUNC (-1) #define _POSIX_CHOWN_RESTRICTED 1 /* Function Prototypes. */ _PROTOTYPE( void _exit, (int _status) ); _PROTOTYPE( int access, (const char *_path, int _amode) ); _PROTOTYPE( unsigned int alarm, (unsigned int _seconds) ); _PROTOTYPE( int chdir, (const char *_path) ); _PROTOTYPE( int chown, (const char *_path, Uid_t _owner, Gid_t _group) ); _PROTOTYPE( int close, (int _fd) ); _PROTOTYPE( char *ctermid, (char *_s) ); _PROTOTYPE( char *cuserid, (char *_s) ); _PROTOTYPE( int dup, (int _fd) ); _PROTOTYPE( int dup2, (int _fd, int _fd2) ); _PROTOTYPE( int execl, (const char *_path, const char *_arg, ...) ); _PROTOTYPE( int execle, (const char *_path, const char *_arg, ...) ); _PROTOTYPE( int execlp, (const char *_file, const char *arg, ...) ); _PROTOTYPE( int execv, (const char *_path, char *const _argv[]) ); _PROTOTYPE( int execve, (const char *_path, char *const _argv[], char *const _envp[]) ); _PROTOTYPE( int execvp, (const char *_file, char *const _argv[]) ); _PROTOTYPE( pid_t fork, (void) ); _PROTOTYPE( long fpathconf, (int _fd, int _name) ); _PROTOTYPE( char *getcwd, (char *_buf, size_t _size) ); _PROTOTYPE( gid_t getegid, (void) ); _PROTOTYPE( uid_t geteuid, (void) ); _PROTOTYPE( gid_t getgid, (void) ); _PROTOTYPE( int getgroups, (int _gidsetsize, gid_t _grouplist[]) ); _PROTOTYPE( char *getlogin, (void) ); _PROTOTYPE( pid_t getpgrp, (void) ); _PROTOTYPE( pid_t getpid, (void) ); _PROTOTYPE( pid_t getppid, (void) ); _PROTOTYPE( uid_t getuid, (void) ); _PROTOTYPE( int isatty, (int _fd) ); _PROTOTYPE( int link, (const char *_existing, const char *_new) ); _PROTOTYPE( off_t lseek, (int _fd, off_t _offset, int _whence) ); _PROTOTYPE( long pathconf, (const char *_path, int _name) ); _PROTOTYPE( int pause, (void) ); _PROTOTYPE( int pipe, (int _fildes[2]) ); _PROTOTYPE( ssize_t read, (int _fd, void *_buf, size_t _n) ); _PROTOTYPE( int rmdir, (const char *_path) ); _PROTOTYPE( int setgid, (Gid_t _gid) ); _PROTOTYPE( int setpgid, (pid_t _pid, pid_t _pgid) ); _PROTOTYPE( pid_t setsid, (void) ); _PROTOTYPE( int setuid, (Uid_t _uid) ); _PROTOTYPE( unsigned int sleep, (unsigned int _seconds) ); _PROTOTYPE( long sysconf, (int _name) ); _PROTOTYPE( pid_t tcgetpgrp, (int _fd) ); _PROTOTYPE( int tcsetpgrp, (int _fd, pid_t _pgrp_id) ); _PROTOTYPE( char *ttyname, (int _fd) ); _PROTOTYPE( int unlink, (const char *_path) ); _PROTOTYPE( ssize_t write, (int _fd, const void *_buf, size_t _n) ); #ifdef _MINIX _PROTOTYPE( int brk, (char *_addr) ); _PROTOTYPE( int chroot, (const char *_name) ); _PROTOTYPE( int mknod, (const char *_name, Mode_t _mode, Dev_t _addr) ); _PROTOTYPE( int mknod4, (const char *_name, Mode_t _mode, Dev_t _addr, long _size) ); _PROTOTYPE( char *mktemp, (char *_template) ); _PROTOTYPE( int mount, (char *_spec, char *_name, int _flag) ); _PROTOTYPE( long ptrace, (int _req, pid_t _pid, long _addr, long _data) ); _PROTOTYPE( char *sbrk, (int _incr) ); _PROTOTYPE( int sync, (void) ); _PROTOTYPE( int umount, (const char *_name) ); _PROTOTYPE( int reboot, (int _how, ...) ); _PROTOTYPE( int gethostname, (char *_hostname, size_t _len) ); _PROTOTYPE( int getdomainname, (char *_domain, size_t _len) ); _PROTOTYPE( int ttyslot, (void) ); _PROTOTYPE( int fttyslot, (int _fd) ); _PROTOTYPE( char *crypt, (const char *_key, const char *_salt) ); #endif #endif /* _UNISTD_H */ /* The header is used for the utime() system call. */ #ifndef _UTIME_H #define _UTIME_H #ifndef _TYPES_H #include #endif struct utimbuf { time_t actime; /* access time */ time_t modtime; /* modification time */ }; /* Function Prototypes. */ _PROTOTYPE( int utime, (const char *_path, const struct utimbuf *_times) ); #endif /* _UTIME_H */ /* The header is used by init, login, who, etc. */ #ifndef _UTMP_H #define _UTMP_H #define WTMP "/usr/adm/wtmp" /* the login history file */ #define BTMP "/usr/adm/btmp" /* the bad-login history file */ #define UTMP "/etc/utmp" /* the user accouting file */ struct utmp { char ut_user[8]; /* user name */ char ut_id[4]; /* /etc/inittab ID */ char ut_line[12]; /* terminal name */ char ut_host[16]; /* host name, when remote */ short ut_pid; /* process id */ short int ut_type; /* type of entry */ long ut_time; /* login/logout time */ }; #define ut_name ut_user /* for compatibility with other systems */ /* Definitions for ut_type. */ #define RUN_LVL 1 /* this is a RUN_LEVEL record */ #define BOOT_TIME 2 /* this is a REBOOT record */ #define INIT_PROCESS 5 /* this process was spawned by INIT */ #define LOGIN_PROCESS 6 /* this is a 'getty' process waiting */ #define USER_PROCESS 7 /* any other user process */ #define DEAD_PROCESS 8 /* this process has died (wtmp only) */ #endif /* _UTMP_H */ /* configfile.h - Generic configuration file format. * Author: Kees J. Bot * 5 Jun 1999 */ #ifndef _CONFIGFILE_H #define _CONFIGFILE_H /* Data can only be modified inside the library. */ #ifndef _c #define _c const #endif typedef _c struct config { /* Contents of a generic configuration file. */ _c struct config *next; /* Next configuration file thing. */ _c struct config *list; /* For a { sublist }. */ const char *file; /* File and line where this is found. */ unsigned line; int flags; /* Special flags. */ char word[1]; /* Payload. */ } config_t; #define CFG_CLONG 0x0001 /* strtol(word, &end, 0) is valid. */ #define CFG_OLONG 0x0002 /* strtol(word, &end, 010). */ #define CFG_DLONG 0x0004 /* strtol(word, &end, 10). */ #define CFG_XLONG 0x0008 /* strtol(word, &end, 0x10). */ #define CFG_CULONG 0x0010 /* strtoul(word, &end, 0). */ #define CFG_OULONG 0x0020 /* strtoul(word, &end, 010). */ #define CFG_DULONG 0x0040 /* strtoul(word, &end, 10). */ #define CFG_XULONG 0x0080 /* strtoul(word, &end, 0x10). */ #define CFG_STRING 0x0100 /* The word is enclosed in quotes. */ #define CFG_SUBLIST 0x0200 /* This is a sublist, so no word. */ #define CFG_ESCAPED 0x0400 /* Escapes are still marked with \. */ config_t *config_read(const char *_file, int flags, config_t *_cfg); void config_delete(config_t *_cfg); int config_renewed(config_t *_cfg); size_t config_length(config_t *_cfg); #define config_issub(cfg) (!!((cfg)->flags & CFG_SUBLIST)) #define config_isatom(cfg) (!config_issub(cfg)) #define config_isstring(cfg) (!!((cfg)->flags & CFG_STRING)) #undef _c #endif /* _CONFIGFILE_H */ .\" Macro package for producing books (based on -ms) .nr PS 12 .nr PZ 12 .\" RT - reset everything to normal state .de RT .if !\\n(1T .BG .ce 0 .if !\\n(IK .if !\\n(IF .if !\\n(IX .if !\\n(BE .di .ul 0 .if \\n(QP \{\ . ll +\\n(QIu . in -\\n(QIu . nr QP -1\} .if \\n(NX<=1 .if \\n(AJ=0 .ll \\n(LLu .if \\n(IF=0 \{\ . ps \\n(PS . if \\n(VS>=41 .vs \\n(VSu . if \\n(VS<=40 .vs \\n(VSp\} .if \\n(IP .in -\\n(I\\n(IRu .if \\n(IP=0 .nr I0 \\n(PIu .if \\n(IP .nr IP -1 .ft 1 .bd 1 .ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n .fi .. . \"IZ - initialization .de IZ .nr TN 0 .em EM .if n .ds [. [ .if t .ds [. \s-2\v'-.4m'\f1 .if n .ds .] ] .if t .ds .] \v'.4m'\s+2\fP .if n .ds [o "" .if n .ds [c "" .if t .ds [o `` .if t .ds [c '' .ch FO \\n(YYu .if \\n(FM=0 .nr FM 1i .nr YY -\\n(FMu .nr XX 0 1 .nr IP 0 .nr PI 5n .nr QI 5n .nr I0 \\n(PIu .nr PZ 12 .nr VZ 13.8p .nr PS \n(PZ .nr VS \\n(VZu .if !\\n(PD .if n .nr PD 1v .if !\\n(PD .if t .nr PD 0.3v .nr ML 3v .ps \\n(PS .if \\n(VS>=41 .vs \\n(VSu .if \\n(VS<=40 .vs \\n(VSp .nr IR 0 .nr TB 0 .nr SJ \\n(.j .nr LL 6i .ll \\n(LLu .nr LT \\n(.l .lt \\n(LTu .ev 1 .nr FL \\n(LLu*11u/12u .ll \\n(FLu .ps 10 .vs 12p .ev .if \\*(CH .ds CH "\(hy \\\\n(PN \(hy .wh 0 NP .wh -\\n(FMu FO .ch FO 16i .wh -\\n(FMu FX .ch FO -\\n(FMu .if t .wh -\\n(FMu/2u BT .if n .wh -\\n(FMu/2u-1v BT .. . \"KS keep - for keep release features. As in IFM .de KS .nr KN \\n(.u .if \\n(IK=0 .if \\n(IF=0 .KQ .nr IK +1 .. . \"KQ - real keep processor .de KQ .br .nr KI \\n(.i .ev 2 .br .in \\n(KIu .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .ll \\n(LLu .lt \\n(LTu .if \\n(NX>1 .ll \\n(CWu .if \\n(NX>1 .lt \\n(CWu .di KK .nr TB 0 .nr KV 0 .. . \"KF - floating keep .de KF .nr KN \\n(.u .if !\\n(IK .FQ .nr IK +1 .. . \"FQ real floating keep processor .de FQ .nr KI \\n(.i .ev 2 .br .in \\n(KIu .ps \\n(PS .if \\n(VS>40 .vs \\n(VSu .if \\n(VS<=39 .vs \\n(VSp .ll \\n(LLu .lt \\n(LTu .if \\n(NX>1 .ll \\n(CWu .if \\n(NX>1 .lt \\n(CWu .di KK .nr TB 1 .nr KV 0 .. . \"KP - keep full page .de KP .nr KV 1 .. . \"KE release - everything between keep and release is together .de KE .if \\n(IK .if !\\n(IK-1 .if \\n(IF=0 .RQ .if \\n(IK .nr IK -1 .. . \"RQ real release .de RQ .br .di .nr NF 0 .if \\n(dn-\\n(.t .nr NF 1 .if \\n(TC .nr NF 1 .if \\n(KV .nr NF 1 \" if KV on full page needed, doesn't fit .if \\n(NF .if !\\n(TB .sp 11i .if !\\n(NF .if \\n(TB .nr TB 0 .nf .rs .nr TC 5 .in 0 .ls 1 .if \\n(TB=0 .ev .if \\n(TB=0 .br .if \\n(TB=0 .ev 2 .if \\n(TB=0 .KK .ls .ce 0 .if \\n(TB=0 .rm KK .if \\n(TB .da KJ .if \\n(TB \!.KD \\n(dn \\n(KV .if \\n(TB .KK .if \\n(TB .di .nr TC \\n(TB .if \\n(KN .fi .in .ev .. .de EQ \"equation, breakout and display .nr EF \\n(.u .rm EE .nr LE 1 \" 1 is center .ds EL \\$1 .if "\\$1"L" .ds EL \\$2 .if "\\$1"L" .nr LE 0 .if "\\$1"C" .ds EL \\$2 .if "\\$1"I" .nr LE 0 .if "\\$1"I" .ds EE \\h'|10n' .if "\\$1"I" .if !"\\$3"" .ds EE \\h'\\$3' .if "\\$1"I" .ds EL \\$2 .if \\n(YE>0 .nf .di EZ .. .de EN \" end of a displayed equation .br .di .rm EZ .nr ZN \\n(dn .if \\n(ZN>0 .if \\n(YE=0 .LP .if \\n(ZN=0 .if !"\\*(EL"" .nr ZN 1 .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if t .sp .5 .if "\\n(.z"" .if \\n(ZN>0 .if !\\n(nl=\\n(PE .if n .sp 1 .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if t .sp .5 .if !"\\n(.z"" .if \\n(ZN>0 .if !\\n(.d=\\n(PE .if n .sp 1 'pc .if \\n(BD>0 .nr LE 0 \" can't mean centering in this case. .if \\n(MK>0 .if \\n(LE=1 .ds EE \\h'|10n' .if \\n(MK>0 .nr LE 0 \" don't center if mark/lineup 'lt \\n(.lu .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\(ts\\*(10\(ts\\*(EL\(ts .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EE\\*(10\(ts\(ts\\*(EL\(ts .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts .if \\n(EP=0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\*(10\\t\\*(EL .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE>0 .tl \(ts\\*(EL\(ts\\*(10\(ts\(ts .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD=0 .tl \(ts\\*(EL\\*(EE\\*(10\(ts\(ts\(ts .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 .if \\n(BD<\\w\(ts\\*(10\(ts .nr BD \\w\(ts\\*(10\(ts .if \\n(EP>0 .if \\n(ZN>0 .if \\n(LE=0 .if \\n(BD>0 \!\\h'-\\\\n(.iu'\\*(EL\\h'|0'\\*(10 .\".di EZ \" GCOS patch .\"\\*(10 \" GCOS patch .\".br \" GCOS patch .\".di \" GCOS patch .\".rm EZ \" GCOS patch 'lt \\n(LLu 'pc % .if \\n(YE>0 .if \\n(EF>0 .fi .rm EL 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .rr 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .if \\n(ZN>0 .if t .sp .5 .if \\n(ZN>0 .if n .sp .if "\\n(.z"" .nr PE \\n(nl .if !"\\n(.z"" .nr PE \\n(.d .nr z 72-((\\n(nl-\\n(HM)%72) .if \\n(nl<\\n(HM .nr z 0 .if \\nz>0 .if \\nz<60 .sp \\nzu \"force post equation text to whole line .if \\nz>59 .if \\nz<72 .sp \\nzu-72u \"move backwards a fraction of a pica .. .de ME .nr SJ \\n(.j .if \\n(LL>0 .nr LT \\n(LL .nr YE 1 .if \\n(PO=0 .nr PO \\n(.o .if \\n(mo-0 .ds MO January .if \\n(mo-1 .ds MO February .if \\n(mo-2 .ds MO March .if \\n(mo-3 .ds MO April .if \\n(mo-4 .ds MO May .if \\n(mo-5 .ds MO June .if \\n(mo-6 .ds MO July .if \\n(mo-7 .ds MO August .if \\n(mo-8 .ds MO September .if \\n(mo-9 .ds MO October .if \\n(mo-10 .ds MO November .if \\n(mo-11 .ds MO December .if \\n(dw-0 .ds DW Sunday .if \\n(dw-1 .ds DW Monday .if \\n(dw-2 .ds DW Tuesday .if \\n(dw-3 .ds DW Wednesday .if \\n(dw-4 .ds DW Thursday .if \\n(dw-5 .ds DW Friday .if \\n(dw-6 .ds DW Saturday .if "\\*(DY"" .ds DY \\*(MO \\n(dy, 19\\n(yr .if "\\*(CF"" .if n .ds CF "\\*(DY .. . \"EM end up macro - process left over keep-release .de EM .br .if \\n(TB=0 .if t .wh -1p CM .if \\n(TB \&\c .if \\n(TB 'bp .if \\n(TB .NP .if \\n(TB .ch CM 160 .. . \"NP new page .de NP .if \\n(FM+\\n(HM>=\\n(.p .tm Margins bigger than page length. .if \\n(FM+\\n(HM>=\\n(.p .ab .if \\n(FM+\\n(HM>=\\n(.p .ex .nr PX \\n(.s .nr PF \\n(.f .nr PV \\n(.v .if t .CM .if \\n(HM=0 .nr HM 1i 'sp \\n(HMu/2u .lt \\n(LTu .ps \\n(PS .vs \\n(PS+2 .ft 1 .if \\n(PO>0 .po \\n(POu .PT .ps \\n(PX .vs \\n(PVu .ft \\n(PF 'sp |\\n(HMu .nr XX 0 1 .nr YY 0-\\n(FMu .ch FO 16i .ch FX 17i .ch FO \\n(.pu-\\n(FMu .ch FX \\n(.pu-\\n(FMu .if \\n(MF .FV .nr MF 0 .mk .os .ev 1 .if \\n(TD=0 .if \\n(TC<5 .XK .nr TC 0 .ns .ev .nr TQ \\n(.i .nr TK \\n(.u .if \\n(IT>0 \{\ . in 0 . nf . TT . in \\n(TQu . if \\n(TK .fi\ \} .mk #T .if t .if \\n(.o+\\n(LL>7.75i .tm Offset (\\n(.o) + line length (\\n(LL) exceeds 7.75 inches, too wide .. .de XK .nr TD 1 .nf .ls 1 .in 0 .rn KJ KL .KL .rm KL .if "\\n(.z"KJ" .di .nr TB 0 .if "\\n(.z"KJ" .nr TB 1 .br .in .ls .fi .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .if \\n(NX>1 .RC .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .if \\n(NX<1 .bp .nr TD 0 .. .de KD .nr KM 0 .if "\\n(.z"" .if \\$2>0 .if \\n(nl>\\n(HM .if (\\n(nl+1v)<(\\n(.p-\\n(FM) .di KJ .if "\\n(.z"" .if \\n(nl>\\n(HM .if \\$2>0 .sp 15i \" full page figure must have new page .if "\\n(.z"" .if \\n(nl>\\n(HM .if \\$2=0 .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .sp 15i .if "\\n(.z"KJ" .nr KM 1 \" KM is 1 if in a rediversion of keeps .if \\n(KM>0 \!.KD \\$1 \\$2 .nr KR \\n(.t .if \\n(nl<=\\n(HM .nr KR 32767 .if \\n(KM=0 .if \\n(KR<\\$1 .di KJ .if \\n(KM=0 .if \\n(KR<\\$1 .nr KM 1 .if \\n(KM=0 .if \\$2>0 .if (\\n(nl+1v)>(\\n(.p-\\n(FM) .sp 15i .rs .if \\n(KM=0 .if \\$2>0 .sp \\n(.tu-\\$1u .. .de PT .lt \\n(LLu .pc % .nr PN \\n% ....if \\n%-1 .tl '\\*(LH'\\*(CH'\\*(RH' .lt \\n(.lu .. . \"FO - footer of page .de FO .rn FO FZ .if \\n(K1>0 .tm This memo has a multi-page cover sheet. You are .if \\n(K1>0 .tm rebuked in the name of the Committee on Technical Memoranda. .if \\n(IT>0 .nr T. 1 .if \\n(IT>0 .if \\n(FC=0 .T# 1 .if \\n(IT>0 .br .nr FC +1 .if \\n(NX<2 .nr WF 0 .nr dn 0 .if \\n(FC<=1 .if \\n(XX .XF .rn FZ FO .nr MF 0 .if \\n(dn .nr MF 1 .if !\\n(WF .nr YY 0-\\n(FMu .if !\\n(WF .ch FO \\n(YYu .if !\\n(dn .nr WF 0 .if \\n(FC<=1 .if \\n(XX=0 .if \\n(NX>1 .RC .nr x 7176u-\\n(.d .if \nL=1 .if \\n(FC<=1 .if \\n(XX=0 .if \\n(NX<1 'tm Chap=\\na page=\\n% short=\\nx .if \\n(FC<=1 .if \\n(XX=0 .if \\n(NX<1 'bp .nr FC -1 .if \\n(ML>0 .ne \\n(MLu .. . \"2C - begin double column .de 2C .MC \" default MC is double column .. .de MC \" multiple columns- arg is line length .nr L1 \\n(LL*7/15 .if \\n(.$>0 .nr L1 \\$1n .nr GW 0-1 .if \\n(., . / 0 1 2 3 4 5 6 7 8 9 : ; < = > $>1 .nr GW \\$1n .nr NQ \\n(LL/\\n(L1 .if \\n(NQ<1 .nr NQ 1 .if \\n(NQ>2 .if (\\n(LL%\\n(L1)=0 .nr NQ -1 .if \\n(1T=0 \{\ . BG . if n .sp 4 . if t .sp 2\} .if \\n(NX=0 .nr NX 1 .if !\\n(NX=\\n(NQ \{\ . RT . if \\n(NX>1 .bp . mk . nr NC 1 . po \\n(POu\} .if \\n(NQ>1 .hy 14 .nr NX \\n(NQ .nr CW \\n(L1 .ll \\n(CWu .nr FL \\n(CWu*11u/12u .if \\n(NX>1 .nr GW (\\n(LL-(\\n(NX*\\n(CW))/(\\n(NX-1) .nr RO \\n(CW+\\n(GW .ns .. .de RC .ie \\n(NC>=\\n(NX .C2 .el .C1 .. .de C1 .rt .po +\\n(ROu .nr NC +1 .if \\n(NC>\\n(NX .nr NC 1 .nr XX 0 1 .if \\n(MF .FV .ch FX \\n(.pu-\\n(FMu .ev 1 .if \\n(TB .XK .nr TC 0 .ev .nr TQ \\n(.i .if \\n(IT>0 .in 0 .if \\n(IT>0 .TT .if \\n(IT>0 .in \\n(TQu .mk #T .ns .. .de C2 .po \\n(POu .nr NC +1 .if \\n(NC>\\n(NX .nr NC 1 'bp .. . \"1C - return to single column format .de 1C .MC \\n(LLu .hy 14 .. . \".de R3 . \".pl 102 . \".nr LT \\n(.l . \".. .de BT .nr PX \\n(.s .nr PF \\n(.f .ft 1 .ps \\n(PS 'lt \\n(LTu .po \\n(POu .if \\n%>0 .tl '\\*(LF'\\*(CF'\\*(RF' .ft \\n(PF .ps \\n(PX .. . \"PP - paragraph .de PP .RT .if \\n(1T .sp \\n(PDu .ti +\\n(PIu .. . \"SH - (unnumbered) section heading .de SH .ti \\n(.iu .RT .if \\n(1T .sp 1 .if !\\n(1T .BG .RT .ne 4 .ft 3 .. . \"NH - numbered heading .de NH .RT .if \\n(1T .sp 1 .if !\\n(1T .BG .RT .ne 4 .ft 3 .nr NS \\$1 .if !\\n(.$ .nr NS 1 .if !\\n(NS .nr NS 1 .nr H\\n(NS +1 .if !\\n(NS-4 .nr H5 0 .if !\\n(NS-3 .nr H4 0 .if !\\n(NS-2 .nr H3 0 .if !\\n(NS-1 .nr H2 0 .if !\\$1 .if \\n(.$ .nr H1 1 .ds SN \\n(H1. .if \\na=0 .ds SN \\*(CN. .ti \\n(.iu .if \\n(NS-1 .as SN \\n(H2. .if \\n(NS-2 .as SN \\n(H3. .if \\n(NS-3 .as SN \\n(H4. .if \\n(NS-4 .as SN \\n(H5. \\*(SN .. . \"BG - begin, execute at first PP .de BG .br .ME .rm ME .di .ce 0 .nr KI 0 .hy 14 .nr 1T 1 .S\\n(ST .rm S0 .rm S1 .rm S2 .rm S3 .rm OD .rm OK .rm TX .rm AX .rm WT .rm CS .rm TM .rm IM .rm MF .rm MR .rm RP .rm I1 .rm I2 .rm I3 .rm I4 .rm I5 .rm CB .rm E1 .rm E2 .de TL .ft 3 .sp .if n .ul 100 .ce 100 .ps +2 \\.. .de AU .ft 2 .if n .ul 0 .ce 100 .sp .NL \\.. .de AI .ft 1 .ce 100 .if n .ul 0 .if n .sp .if t .sp .5 .NL \\.. .RA .rm RA .rn FJ FS .rn FK FE .nf .ev 1 .ps \\n(PS-2 .vs \\n(.s+2p .ev .if \\n(KG=0 .nr FP 0 .if \\n(GA>1 .if \\n(KG=0 .nr GA 0 \" next UNIX must be flagged. .nr KG 0 .if \\n(FP>0 .FS .if \\n(FP>0 .FG .if \\n(FP>0 .FE .br .if \\n(TV>0 .if n .sp 2 .if \\n(TV>0 .if t .sp 1 .fi .ll \\n(LLu .. .de RA \"redefine abstract macros .de AB .br .if !\\n(1T .BG .ce 1 .sp 1 .if \\n(.$=0 ABSTRACT .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no" \\$1 .if \\n(.$=0 .sp .if \\n(.$>0 .if !"\\$1"-" .if !"\\$1"no" .sp .sp 1 .nr AJ 1 .in +\\n(.lu/12u .ll -\\n(.lu/12u .RT \\.. .de AE .nr AJ 0 .br .in 0 .ll \\n(LLu .if \\n(VS>=41 .vs \\n(VSu .if \\n(VS<=40 .vs \\n(VSp \\.. .. . \"IP - indented paragraph .de IP .RT .if !\\n(IP .nr IP +1 .sp \\n(PDu .if \\n(.$-1 .nr I\\n(IR \\$2n .in +\\n(I\\n(IRu .nr TY \\n(TZ-\\n(.i .ta \\n(I\\n(IRu \\n(TYuR .if \\n(.$>0 \{\ .ti -\\n(I\\n(IRu \&\\$1\t\c\} .. . \"LP - left aligned (block) paragraph .de LP .ti \\n(.iu .RT .if \\n(1T .sp \\n(PDu .. .de QP .ti \\n(.iu .RT .if \\n(1T .sp \\n(PDu .ne 1.1 .nr QP 1 .in +\\n(QIu .ll -\\n(QIu .ti \\n(.iu .. . \"IE - synonym for .LP .de IE .LP .. . \"LB - label paragraph .de LB .in +\\n(I\\n(IRu .ta \\n(I\\n(IRu .if \\n(.$ .ti -\\n(I\\n(IRu .if \\n(.$ \&\\$1\t\c .. .de XP .RT .if !\\n(IP .nr IP +1 .sp \\n(PDu .ne 3 .if \\n(.$=3 .nr I\\n(IR \\$3n .if \\n(.$=4 .nr I\\n(IR \\$4n .nr J\\n(IR \\n(IRu/2u .if \\n(.$=4 .nr J\\n(IR \\$3n .in +\\n(I\\n(IRu .ta \\n(J\\n(IRu \\n(I\\n(IRu .ti -\\n(I\\n(IRu \0\\$1\t\\$2\t\c .. . \"RS - prepare for double indenting .de RS .nr IS \\n(IP .RT .nr IP \\n(IS .if \\n(IP>0 .in +\\n(I\\n(IRu .nr IR +1 .nr I\\n(IR \\n(PIu .in +\\n(I\\n(IRu .nr TY \\n(TZ-\\n(.i .ta \\n(TYuR .. . \"RE - retreat to the left .de RE .nr IS \\n(IP .RT .nr IP \\n(IS .if \\n(IR>0 .nr IR -1 .if \\n(IP<=0 .in -\\n(I\\n(IRu .. .de TC .nr TZ \\n(.lu .if \\n(.$ .nr TZ \\$1n .ta \\n(TZuR .. .de TD .LP .nr TZ 0 .. . \"CM - cut mark .de CM .po 0 .lt 7.6i .ft 1 .ps 10 .vs 4p .po .vs .lt .ps .ft .. . \"B - bold font .de B .nr PQ \\n(.f .if t .ft 3 .if "\\$1"" .if n .ul 1000 .if !"\\$1"" .if n .ul 1 .if t .if !"\\$1"" \&\\$1\\f\\n(PQ\\$2 .if n .if \\n(.$=1 \&\\$1 .if n .if \\n(.$>1 \&\\$1\\c .if n .if \\n(.$>1 \\&\\$2 .. . \"R - Roman font .de R .if n .ul 0 .ft 1 .. . \"I - italic font .de I .nr PQ \\n(.f .if t .ft 2 .if "\\$1"" .if n .ul 1000 .if !"\\$1"" .if n .ul 1 .if t .if !"\\$1"" \&\\$1\\f\\n(PQ\\$2 .if n .if \\n(.$=1 \&\\$1 .if n .if \\n(.$>1 \&\\$1\\c .if n .if \\n(.$>1 \\&\\$2 .. . \"TA - tabs set in ens or chars .de TA .ta \\$1n \\$2n \\$3n \\$4n \\$5n \\$6n \\$7n \\$8n \\$9n .. . \"SM - make smaller size .de SM .if \\n(.$>0 \&\\$3\s-2\\$1\s0\\$2 .if \\n(.$=0 .ps -2 .. . \"LG - make larger size .de LG .ps +2 .. . \"NL - return to normal size .de NL .ps \\n(PS .. . \"DA - force date; ND - no date or new date. .de DA .if \\n(.$ .ds DY \\$1 \\$2 \\$3 \\$4 .ds CF \\*(DY .. .de ND .ME .rm ME .ds DY \\$1 \\$2 \\$3 \\$4 .rm CF .. .de FN .FS .. . \"FS - begin footnote .de FJ 'ce 0 .di .ev1 .ll \\n(FLu .da FF .br .if \\n(IF>0 .tm Footnote within footnote-illegal. .nr IF 1 .if !\\n+(XX-1 .FA .. . \"FE - footnote end .de FK .br .in 0 .nr IF 0 .di .ev .if !\\n(XX-1 .nr dn +\\n(.v .nr YY -\\n(dn .if \\n(NX=0 .nr WF 1 .if \\n(dl>\\n(CW .nr WF 1 .if (\\n(nl+\\n(.v)<=(\\n(.p+\\n(YY) .ch FO \\n(YYu .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl>(\\n(HM+1.5v) .ch FO \\n(nlu+\\n(.vu .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl+\\n(FM+1v>\\n(.p .ch FX \\n(.pu-\\n(FMu+2v .if (\\n(nl+\\n(.v)>(\\n(.p+\\n(YY) .if \\n(nl<=(\\n(HM+1.5v) .ch FO \\n(HMu+(4u*\\n(.vu) .. .\" First page footer. .de FS .ev1 .br .ll \\n(FLu .da FG .. .de FE .br .di .nr FP \\n(dn .if \\n(1T=0 .nr KG 1 \"not in abstract repeat next page. .if "\\n(.z"OD" .nr KG 0 \" if in OK, don't repeat. .ev .. .de FA .if n __________________________ .if t \l'1i' .br .. .de FV .FS .nf .ls 1 .FY .ls .fi .FE .. .de FX .if \\n(XX>0 .di FY .if \\n(XX>0 .ns .. .de XF .if \\n(nlu+1v>(\\n(.pu-\\n(FMu) .ch FX \\n(nlu+1.9v .ev1 .nf .ls 1 .FF .rm FF .nr XX 0 1 .br .ls .di .fi .ev .. .de FL .ev1 .nr FL \\$1n .ll \\$1 .ev .. .de UL \" underline argument, don't italicize .if t \\$1\l'|0\(ul'\\$2 .if n .I \\$1 \\$2 .. .de UX UNIX .. .de US the .UX operating system .. .de QS .br .LP .in +\\n(QIu .ll -\\n(QIu .. .de QE .br .ll +\\n(QIu .in -\\n(QIu .LP .. .de B1 \" begin boxed stuff .br .di BB .nr BC 0 .if "\\$1"C" .nr BC 1 .nr BE 1 .. .de B2 \" end boxed stuff .br .nr BI 1n .if \\n(.$>0 .nr BI \\$1n .di .nr BE 0 .nr BW \\n(dl .nr BH \\n(dn .ne \\n(BHu+\\n(.Vu .nr BQ \\n(.j .nf .ti 0 .if \\n(BC>0 .in +(\\n(.lu-\\n(BWu)/2u .in +\\n(BIu .BB .in -\\n(BIu .nr BW +2*\\n(BI .sp -1 \l'\\n(BWu\(ul'\L'-\\n(BHu'\l'|0\(ul'\h'|0'\L'\\n(BHu' .if \\n(BC>0 .in -(\\n(.lu-\\n(BWu)/2u .if \\n(BQ .fi .br .. .de AT .nf .sp .ne 2 Attached: .. .de CT .nf .sp .ne 2 .ie \\n(.$ Copy to \\$1: .el Copy to: .. .de BX .if t \(br\|\\$1\|\(br\l'|0\(rn'\l'|0\(ul' .if n \(br\\kA\|\\$1\|\\kB\(br\v'-1v'\h'|\\nBu'\l'|\\nAu'\v'1v'\l'|\\nAu' .. .IZ .rm IZ .\" ------------------- VARIABLES ------------------------------ .\" \na - Current chapter .\" \nb - Current section .\" \nc - Current subsection .\" \nd - Set to 0 initially, 1 by PT, 2 by .PB Used to control running head .\" \ne - Current equation number .\" \ng - Used to count items in numbered lists .\" \nh - Counts number of times CP has been invoked .\" \nj - Set to 1 iff footer page number needed .\" \nk - Last figure number used .\" \nL - 1 if depth printed for each page .\" \nl - 1 old Agfa length to be used .\" \np - Numbers end-of-chapter problems .\" \nq - 1 for double spaced text, smaller vert. margins .\" \ns - initial page number .\" \nt - Variable part of spacing inside .BI macro .\" \nv - Scratch register in lower case roman numerals .\" \nx - Scratch register .\" ------------------- GENERAL PARAMETERS --------------------- .nr BO 43 \" number of lines of text per page .nr PO 1.3i .po \n(PO .if \nq=1 .ls 2 \" -rq1 invokes double spacing .nr LL 5.67i .if t \{ .nr PL 29.73c .nr PI 0.25i\} .if n \{ .nr LL 80m .nr PL 11.0i .nr PI 3m\} .pl \n(PLu .nr HM (\n(PLu-(\n(BOu*\n(VSu))/2u .nr FM \n(PLu-(\n(HMu+((\n(BOu-1u)*\n(VSu)+1u) .nr xx \n(HMu%\n(VZu .nr HM \n(HMu-\n(xxu .nr FM \n(FMu+\n(xxu .nr t 0 0 .\" ------------------- INITIALIZATION ------------------------- .nr d 0 0 .nr e 0 1 .nr h 0 1 .nr j 1 0 .nr t 0 0 .tr ~ .ds CT "~ \"initially empty .ND \"suppress date on bottom of page .af v i \"register v is in lower case roman .ch FO -\n(FMu .ch BT -\n(FMu+0.5P .\" ------------------- ALIGN TEXT TO A WHOLE NUMBER OF PICAS ---- .de AL 'nr xx \\n(.du%\\n(VZu 'nr xy \\n(VZu-\\n(xx 'if \\n(xy=\\n(VZu .nr xy 0 'sp \\n(xyu .. .\" ------------------- DIVISION OF TEXT INTO LOGICAL UNITS ---- .\" Define chapter number .de CP .ds CN \\$1 .ds CX CHAP. .if '\\$1'A' .ds CX APPENDIX .if '\\$1'B' .ds CX APPENDIX .if '\\$1'C' .ds CX APPENDIX .if '\\$1'D' .ds CX APPENDIX .if '\\$1'E' .ds CX APPENDIX .if '\\$1'F' .ds CX APPENDIX .if '\\$1'A' .nr a 0 0 .if '\\$1'B' .nr a 0 0 .if '\\$1'C' .nr a 0 0 .if '\\$1'D' .nr a 0 0 .if '\\$1'E' .nr a 0 0 .if '\\$1'F' .nr a 0 0 .nr H1 \\$1 0 .nr H2 0 1 .nr a \\$1 0 .nr b 0 1 .nr c 0 1 .nr d 1 1 .nr e 0 1 .nr k 0 1 .nr s \\n% .if \\nq=1 .PH 6 .ll \\n(LLu .nr LT \\n(LLu .lt \\n(LLu .ll \\n(LLu .pl \n(PLu .po \n(POu .in 0 .nr PS \\n(PZ .nr VS \\n(VZu .nr PD 0i .ds ST .ds CT \\$2 .if !'\\$3'' .as CT " \\$3 .if \\nh .bp .rs .sp 16P .B .ps 30 .vs 32 .ce 1 \\$1 .sp 4P .ps 18 .vs 20 .ce 1 \\$2 .sp 0.25i .if !'\\$3'' .ce 1 .if !'\\$3'' \\$3 .ps 10 .vs 12 .R .nr x \\n(.pu/2u .sp |\\nxu .nr h +1 1 .tr _\\(ru .AL .. .de SP .sp \\$1 \"used for temporary (page balancing ) fill .. .de HS .sp 0.5 .. .\" Major section (numbered) .de SE .nr b +1 1 .nr c 0 1 .ds ST \\$1 .sp 1 .NH 2 \\$1 .sp 1 .. .\" Subsection (numbered) .de SS .nr c +1 1 .NH 3 \\$1 .sp 1 .. .de UU .SH \\$1 .sp 1 .. .\"-------------------- PAGE TRANSITION MACROS USED BY -MS ------ .de PH \"select special running heads .nr d \\$1 .if \\$1=4 .nr j 1 .ds CT \\$2 .. .de PT .AL .pc % .PN \\n% 'sp |\\n(HMu-0.35i .ps 10 .\" .\" nd = 0 means no running head this time, normal next time .if \\nd=0 \{\ .tl '''' \" no running head on initial page transition .nr j 1 0\} .\" .\" nd = 1 is normal case: chapter heading even (left) and section odd(right) .if \\nd=1\{\ .if e .tl '\fB\s+2%\s-2\fR'\\*(CT'\\*(CX~ \\*(CN' \"normal case even page .if o .if \\nb>0 .tl 'SEC.~ \\*(CN.\\nb'\\*(ST'\fB\s+2%\s-2\fR' .if o .if \\nb=0 .tl '''\fB\s+2%\s-2\fR'\} .if o .if \\nb=-999 .tl '\\*(CX~ \\*(CN'\\*(CT'\fB\s+2%\s-2\fR'\} .\" .\" nd = 2 is for PROBLEMS; even normal, odd CHAP. ... PROBLEMS % .if \\nd=2\{\ .if e .tl '\fB\s+2%\s-2\fR'\\*(CT'\\*(CX~ \\*(CN' \"even page PROBLEMS .if o .if \\nd=2 .tl '\\*(CX~ \\*(CN'PROBLEMS'\fB\s+2%\s-2\fR' \} .\" .\" nd = 3 is for index, problem solutions & other cases with same odd even hd .if \\nd=3\{\ .if e .tl '\fB\s+2%\s-2\fR'\\*(CT'' .if o .tl ''\\*(CT'\fB\s+2%\s-2\fR'\} .\" .\" nd = 4 is like nd = 3, except page numbers are lower case roman .if \\nd=4\{\ .nr v \\n% .if e .tl '\fB\s+2\\nv\s-2\fR'\\*(CT'' .if o .tl ''\\*(CT'\fB\s+2\\nv\s-2\fR'\} .\" .\" nd = 5 suppresses running heads like nd=0, only it keeps them suppressed .if \\nd=5 .tl '''' .\" nd = 6 gives page number in right-hand corner only .if \\nd=6 .tl '''%' .if \\nd=0 .nr d 1 0 \" henceforth normal running heads .. .de BT .if \\n%=\\ns\{\ .nr x \\n(HMu+(\\n(BO*\\n(VSu)+2P 'sp |\\nxu .nr v \\n% .ie \\nd=4 .tl ''\fB\s-1\\nv\s0\fP'' .el .tl ''\fB\s-1\\n%\s0\fP''\} .nr j 0 0 .if \\nd=0 .nr d 1 0 .. .\"--------------- CHECK FOR INITIAL PAGE NUMBER --------------- .de PC .if \n%<\\$1\{ .tm You forgot to set the page number. Run aborted. Use troff -n .ex\} .if \n%>\\$2\{ .tm You forgot to set the page number. Run aborted. Use troff -n .ex\} .. .\"-------------------- LISTS OF THINGS ------------------------ .\" Start list .de LI .nr g 0 1 .in +0.25i .nr LL -0.25i .ll -0.25i .ne 3v .HS .. .\" End list .de LX .sp 1 .in -0.25i .nr LL +0.25i .ll +0.25i .LP .. .\" List item .de IT .HS .nr g \\ng+1 1 .ie \\ng<10 .IP \0\\ng. 4 .el .IP \\ng. 4 .. .\"Short unnumbered lines .de UN .HS .. .\"-------------------- END OF CHAPTER EXERCISES --------------- .de PB .nr d 2 0 .if \\nq=1 .PH 6 .ne 1.5i .sp 0.5i .ce 1 .B PROBLEMS .sp 1 .nr p 0 1 .. .de PR .ps 11 .vs 13 .nr PS 11 .nr VS 13.01p .HS .nr p +1 1 .in \w'00. 'u .ti -\w'00. 'u .if \\np>9 \fB\\np.\fR~~\c .if \\np<10 \fB\0\\np.\fR~~\c .. .de AA .sp 3 .if n .nr LL 84m .nr PS \\n(PZ .nr VS \\n(VZu .nr a \\$1 1 .nr b 0 0 .nr p 0 1 .ce 1 .nr x 1 .if '\\$1'A' .nr x 0 .if '\\$1'B' .nr x 0 .if '\\$1'C' .nr x 0 .if \\nq=1 .PH 6 .if \\nx\fBSOLUTIONS TO CHAPTER \\$1 PROBLEMS\fR .if !\\nx\fBSOLUTIONS TO APPENDIX \\$1 PROBLEMS\fR .sp 1v .. .de AN .HS .ps \\n(PZ .vs \\n(VSu .nr PS \\n(PZ .nr VS \\n(VZu .nr p +1 1 .in \w'00. 'u .ti -\w'00. 'u .if \\np>9 \fB\\np.\fR~~\c .if \\np<10 \fB\0\\np.\fR~~\c .. .\"-------------------- BIBLIOGRAPHY --------------------------- .de BB .sp 2 .in 0.25i .. .de BI .ps 10 .vs 12 .sp \\ntu .HS .if n .HS .ti -0.30i .R .. .\"-------------------- QUOTES --------------------------------- .ds OQ `\h'-1p'` .ds CQ '\h'-1p'' .\"-------------------- FIGS.----------------------------------- .de FC 'sp 1v .ps 10 .vs 12 .in +0.5i .ll -0.5i .B .if '\\$1'C' .ce 1 Fig.\|\|\|\\*(CN-\\n+k.~\c .R .. .de BF .KF 'sp 1v .nr TP \\n(.s .nr TV \\n(.v .nr TF \\n(.f .nr r 0 0 .if \\nq=0 .if "\\$1"PAGE" .KP .if \\nq=0 .if "\\$1"PAGE" .nr r 1 0 .if \\nq=0 .if !"\\$1"PAGE" .sp \\$1 .if \\nq=1 .sp 0.5i .FC \\$2 .. .de EF .in -0.5i .ll +0.5i .ps \\n(TP .vs \\n(TV .ft \\n(TF 'if \\nr==0 'sp 30u 'AL .KE .. .de NF .nr x \\nk+1 .ie !'\\$1'X' Fig.~\\*(CN-\\nx\\$1 .el Figure \\*(CN-\\nx\\$2 .. .de PF .ie !'\\$1'X' Fig.~\\*(CN-\\nk\\$1 .el Figure \\*(CN-\\nk\\$2 .. .\"-------------------- MULTIPLE BLANK PAGES ------------------- .de MP .if \\$1 \{\ .KF .KP .KE .MP \\$1-1 .if \\$1<2 .nr k +1 1 \} .. .\"-------------------- TABLE OF CONTENTS ---------------------- .de XT .if t .ta 0.4i 0.8i 0.9i \\n(LLuR .if n .ta 0.3i 1.0i 1.1i 5.0iR .ps 11 .vs 13 .nr a \\$1 0 .nr b 0 1 .nr c 0 1 .sp 0.40i .ne 0.3i .B \\s18\\$1\\s12 \\$2 \\$3\\fR\\s11 .br .if !'\\$4'' \\fB\\$4\\fR .R .sp 0.5v .. .de XE .nr b +1 1 .nr c 0 1 .HS \\na.\\nb \\$1 \\$2 .. .de XS .nr c +1 1 \\na.\\nb.\\nc \\$1 \\$2 .. .\"------------------- INDEX ----------------------------------- .de IL .nr PS \\n(PZ-2 .nr VS 12.01p .LP .nf .na .sp 2v .ne 2 \fB\s+4\\$1\\s0\fR .sp 1v .. .\"------------------- NEW .B MACRO ---------------------------- .rm B .de B .nr PQ \\n(.f .ft 3 .if !"\\$1"" \&\\$1\\f\\n(PQ\\$2 .. .\"--------------------- FIXES NEEDED TO -MS ------------------- .\" Remove .if n .ul 1000 from .NH .\" Remove .if n .ul 1000 from .SH .\" Fix to allow letters as chapter "numbers" .\" .\" Here is the b3mac file .nr Cs 10 .fp 5 H .ds fm \(fm .ds em \(em .de F \\fI\\$1\\fR\\$2 .. .de CC .HS ~~~~~\\s\\n(Cs\\f5\\$1\\fP\\s0 .HS .LP .. .de Cx ~~~~~\\s\\n(Cs\\f5\\$1\\fP\\s0\\$2 .. .de Cb .in +0.25i \\s\\n(Cs .HS \\f5 .. .de Ce .HS \\fR .nr PS \\n(PZ .nr VS \\n(VZ .LP .in -0.25i .. .de SY \\$3\s-2\\$1\s+2\\$2 .. .de SM \\$3\s-1\\$1\s+1\\$2 .. .de FN \&\\fI\\$1\\fR\\$2 .. .de DI \&\\fI\\$1\\fR\\$2 .. .de FI \&\\fI\\$1\\fR\\$2 .. .de LN .nr x \\$1+\\$2 \\$4line .L4 \\nx \\$3 .. .de LS .nr x \\$1+\\$2 .nr y \\$1+\\$3 .nr z \\nx+1 \\$5lines .L4 \\nx .ie \\ny=\\nz and .el to .L4 \\ny \\$4 .. .ds SQ \(fm\h'-0.05c'\(fm .de L4 .ie \\$1<10 000\\$1\\$2 .el .ie \\$1<100 00\\$1\\$2 .el .ie \\$1<1000 0\\$1\\$2 .el \\$1\\$2 .. .de KW \f5\\$1\\$2\fR .. .ds M0 MINIX .ds M1 \\s-1MINIX\\s+1 .ds M2 \\s-2MINIX\\s+2 .ds M9 \\s-1MINIX\\s+1 .ds m0 minix .de MX \s-2MINIX\s+2\\$1 .. .de Ux \s-2UNIX\s+2\\$1 .. .tr _\(ru .de UX \s-2UNIX\s+2\\$1 .. .ds Mx \\s-1MINIX\\s0 .ds Mp \\s-1MINIX-PC\\s0 .ds Ms \\s-1MINIX-ST\\s0 .de CW \f5 .. .de Bu .HS .IP "\0\(bu" 4 .. .de CD .ne 2 .if t .ta 0.9i 1.15i 2.75i 3.25i 3.75i .if n .ta 11m 15m 40m .nr x 0 0 .nr y 0 0 .nr z 0 0 .if n #\\$1 .if n .br \\fBCommand:\& \\$1\\fR .br .. .de SX .if \\nx<=0 \\fBSyntax:\& \\$1 .if \\nx>0 \& \\fB\\$1 .nr x 1 1 .br .. .de FL .if \\ny<=0 \\fBFlags:\& \\fB\\$1 \\fR\\$2 .if \\ny>0 \& \\fB\\$1 \\fR\\$2 .nr y 1 1 .br .. .de EX .br .nf .if \\nz<=0 \\fB\&Examples: \\fR\\$1 \\fR# \\$2 .if \\nz>0 \& \\fR\\$1 \\fR# \\$2 .nr z 1 1 .br .. .de EY .br .nf .if \\nz<=0 \\fB\&Example: \\fR\\$1 \\fR# \\$2 .if \\nz>0 \& \\fR\\$1 \\fR# \\$2 .nr z 1 1 .br .. ...M.1acd.1anm.1ar.1xargs.1ash.1asize.1at.1banner.1basename.1bc.1bsfilt.1env.1 cal.1 calendar.1 cat.1 cawf.1 cc.1cdiff.1clear.1cgrep.1chgrp.1chmem.1chmod.1cksum.1cmp.1comm.1compress.1cp.1crc.1ctags.1cut.1date.1dd.1df.1dhrystone.1 diff.1!crontab.1"dosdir.1#dosread.1$doswrite.1%du.1&echo.1'ed.1(eject.1)elvis.1*elvrec.1+expand.1,expr.1-factor.1.fgrep.1/file.10find.11finger.12flex.13flexdoc.14fmt.15fold.16format.17fortune.18fsck.19stat.1.TH M 1 .SH NAME M, U \- conveniently mount and unmount .SH SYNOPSIS \fBM \fIdevice\fR [\fB\-r\fR]\fR .br \fBU \fIdevice\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-r" "Mount read-only" .SH EXAMPLES .EX "M root" "Mount the RAM image on /root" .EX "M 0" "Mount /dev/fd0 on /fd0" .EX "U fd1" "Unmount /dev/fd1 from /fd1" .SH DESCRIPTION .PP \fIM\fR and \fIU\fR allow easy mounting and unmounting of a device by using only an abbreviated device name or keyword. Special keywords are \fBroot\fR, \fBtmp\fR, and \fBusr\fR for the three hard disk partitions Minix runs in. Floppy devices are mounted on \fB/fd0\fR or \fB/fd1\fR. You can use \fB0\fR and \fB1\fR instead of \fBfd0\fR and \fBfd1\fP. A device it doesn't know about is mounted on \fB/mnt\fR. .SH "SEE ALSO" .BR mount (1), .BR umount (1). .TH ACD 1 .SH NAME acd \- a compiler driver .SH SYNOPSIS .B acd \fB\-v\fR[\fIn\fR] \fB\-vn\fR[\fIn\fR] .BI \-name " name" .BI \-descr " descr" .BI \-T " dir" .RI [ arg " ...]" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Acd is a compiler driver, a program that calls the several passes that are needed to compile a source file. It keeps track of all the temporary files used between the passes. It also defines the interface of the compiler, the options the user gets to see. .PP This text only describes .B acd itself, it says nothing about the different options the C-compiler accepts. (It has nothing to do with any language, other than being a tool to give a compiler a user interface.) .SH OPTIONS .B Acd itself takes five options: .TP \fB\-v\fR[\fIn\fR] Sets the diagnostic level to .I n (by default .BR 2 ). The higher .I n is, the more output .B acd generates: .B \-v0 does not produce any output. .B \-v1 prints the basenames of the programs called. .B \-v2 prints names and arguments of the programs called. .B \-v3 shows the commands executed from the description file too. .B \-v4 shows the program read from the description file too. Levels 3 and 4 use backspace overstrikes that look good when viewing the output with a smart pager. .TP \fB\-vn\fR[\fIn\fR] Like .B \-v except that no command is executed. The driver is just play-acting. .TP .BI \-name " name" .B Acd is normally linked to the name the compiler is to be called with by the user. The basename of this, say .BR cc , is the call name of the driver. It plays a role in selecting the proper description file. With the .B \-name option one can change this. .B Acd \-name cc has the same effect as calling the program as .BR cc . .TP .BI \-descr " descr" Allows one to choose the pass description file of the driver. By default .I descr is the same as .IR name , the call name of the program. If .I descr doesn't start with .BR / , .BR ./ , or .BR ../ then the file .BI /usr/lib/ descr /descr will be used for the description, otherwise .I descr itself. Thus .B cc \-descr newcc calls the C-compiler with a different description file without changing the call name. Finally, if .I descr is \fB"\-"\fP, standard input is read. (The default lib directory .BR /usr/lib , may be changed to .I dir at compile time by \fB\-DLIB=\e"\fP\fIdir\fP\fB\e"\fP. The default .I descr may be set with \fB\-DDESCR=\e"\fP\fIdescr\fP\fB\e"\fP for simple installations on a system without symlinks.) .TP .BI \-T " dir" Temporary files are made in .B /tmp by default, which may be overridden by the environment variable .BR TMPDIR , which may be overridden by the .B \-T option. .SH "THE DESCRIPTION FILE" The description file is a program interpreted by the driver. It has variables, lists of files, argument parsing commands, and rules for transforming input files. .SS Syntax There are four simple objects: .PP .RS Words, Substitutions, Letters, and Operators. .RE .PP And there are two ways to group objects: .PP .RS Lists, forming sequences of anything but letters, .SP Strings, forming sequences of anything but Words and Operators. .RE .PP Each object has the following syntax: .IP Words They are sequences of characters, like .BR cc , .BR \-I/usr/include , .BR /lib/cpp . No whitespace and no special characters. The backslash character .RB ( \e ) may be used to make special characters common, except whitespace. A backslash followed by whitespace is completely removed from the input. The sequence .B \en is changed to a newline. .IP Substitutions A substitution (henceforth called 'subst') is formed with a .BR $ , e.g. .BR $opt , .BR $PATH , .BR ${lib} , .BR $\(** . The variable name after the .B $ is made of letters, digits and underscores, or any sequence of characters between parentheses or braces, or a single other character. A subst indicates that the value of the named variable must be substituted in the list or string when fully evaluated. .IP Letters Letters are the single characters that would make up a word. .IP Operators The characters .BR = , .BR + , .BR \- , .BR \(** , .BR < , and .B > are the operators. The first four must be surrounded by whitespace if they are to be seen as special (they are often used in arguments). The last two are always special. .IP Lists One line of objects in the description file forms a list. Put parentheses around it and you have a sublist. The values of variables are lists. .IP Strings Anything that is not yet a word is a string. All it needs is that the substs in it are evaluated, e.g. .BR $LIBPATH/lib$key.a . A single subst doesn't make a string, it expands to a list. You need at least one letter or other subst next to it. Strings (and words) may also be formed by enclosing them in double quotes. Only .B \e and .B $ keep their special meaning within quotes. .SS Evaluation One thing has to be carefully understood: Substitutions are delayed until the last possible moment, and description files make heavy use of this. Only if a subst is tainted, either because its variable is declared local, or because a subst in its variable's value is tainted, is it immediately substituted. So if a list is assigned to a variable then this list is only checked for tainted substs. Those substs are replaced by the value of their variable. This is called partial evaluation. .PP Full evaluation expands all substs, the list is flattened, i.e. all parentheses are removed from sublists. .PP Implosive evaluation is the last that has to be done to a list before it can be used as a command to execute. The substs within a string have been evaluated to lists after full expansion, but a string must be turned into a single word, not a list. To make this happen, a string is first exploded to all possible combinations of words choosing one member of the lists within the string. These words are tried one by one to see if they exist as a file. The first one that exists is taken, if none exists than the first choice is used. As an example, assume .B LIBPATH equals .BR "(/lib /usr/lib)" , .B key is .B (c) and .B key happens to be local. Then we have: .PP .RS \fB"$LIBPATH/lib$key.a"\fP .RE .PP before evaluation, .PP .RS \fB"$LIBPATH/lib(c).a"\fP .RE .PP after partial evaluation, .PP .RS \fB"(/lib/libc.a /usr/lib/libc.a)"\fP .RE .PP after full evaluation, and finally .PP .RS .B /usr/lib/libc.a .RE .PP after implosion, if the file exists. .SS Operators The operators modify the way evaluation is done and perform a special function on a list: .TP .B \(** Forces full evaluation on all the list elements following it. Use it to force substitution of the current value of a variable. This is the only operator that forces immediate evaluation. .TP .B + When a .B + exists in a list that is fully evaluated, then all the elements before the .B + are imploded and all elements after the .B + are imploded and added to the list if they are not already in the list. So this operator can be used either for set addition, or to force implosive expansion within a sublist. .TP .B \- Like .BR + , except that elements after the .B \- are removed from the list. .PP The set operators can be used to gather options that exclude each other or for their side effect of implosive expansion. You may want to write: .PP .RS \fBcpp \-I$LIBPATH/include\fP .RE .PP to call cpp with an extra include directory, but .B $LIBPATH is expanded using a filename starting with .B \-I so this won't work. Given that any problem in Computer Science can be solved with an extra level of indirection, use this instead: .PP .RS .ft B cpp \-I$INCLUDE .br INCLUDE = $LIBPATH/include + .ft P .RE .SS "Special Variables" There are three special variables used in a description file: .BR $\(** , .BR $< , and .BR $> . These variables are always local and mostly read-only. They will be explained later. .SS "A Program" The lists in a description file form a program that is executed from the first to the last list. The first word in a list may be recognized as a builtin command (only if the first list element is indeed simply a word.) If it is not a builtin command then the list is imploded and used as a \s-2UNIX\s+2 command with arguments. .PP IndentatiH J K L M N O P Q R S T U V W X on (by tabs or spaces) is not just makeup for a program, but are used to group lines together. Some builtin commands need a body. These bodies are simply lines at a deeper indentation. .PP Empty lines are not ignored either, they have the same indentation level as the line before it. Comments (starting with a .B # and ending at end of line) have an indentation of their own and can be used as null commands. .PP .B Acd will complain about unexpected indentation shifts and empty bodies. Commands can share the same body by placing them at the same indentation level before the indented body. They are then "guards" to the same body, and are tried one by one until one succeeds, after which the body is executed. .PP Semicolons may be used to separate commands instead of newlines. The commands are then all at the indentation level of the first. .SS "Execution phases" The driver runs in three phases: Initialization, Argument scanning, and Compilation. Not all commands work in all phases. This is further explained below. .SS "The Commands" The commands accept arguments that are usually generic expressions that implode to a word or a list of words. When .I var is specified, then a single word or subst needs to be given, so an assignment can be either .I name .B = .IR value , or .BI $ name .B = .IR value . .TP .IB "var " = " expr ..." The partially evaluated list of expressions is assigned to .IR var . During the evaluation is .I var marked as local, and after the assignment set from undefined to defined. .TP .BI unset " var" .I Var is set to null and is marked as undefined. .TP .BI import " var" If .I var is defined in the environment of .B acd then it is assigned to .IR var . The environment variable is split into words at whitespace and colons. Empty space between two colons .RB ( :: ) is changed to a dot. .TP .BI mktemp " var " [ suffix ] Assigns to .I var the name of a new temporary file, usually something like /tmp/acd12345x. If .I suffix is present then it will be added to the temporary file's name. (Use it because some programs require it, or just because it looks good.) .B Acd remembers this file, and will delete it as soon as you stop referencing it. .TP .BI temporary " word" Mark the file named by .I word as a temporary file. You have to make sure that the name is stored in some list in imploded form, and not just temporarily created when .I word is evaluated, because then it will be immediately removed and forgotten. .TP .BI stop " suffix" Sets the target suffix for the compilation phase. Something like .B stop .o means that the source files must be compiled to object files. At least one .B stop command must be executed before the compilation phase begins. It may not be changed during the compilation phase. (Note: There is no restriction on .IR suffix , it need not start with a dot.) .TP .BI treat " file suffix" Marks the file as having the given suffix for the compile phase. Useful for sending a .B \-l option directly to the loader by treating it as having the .B .a suffix. .TP .BI numeric " arg" Checks if .I arg is a number. If not then .B acd will exit with a nice error message. .TP .BI error " expr ..." Makes the driver print the error message .I "expr ..." and exit. .TP .BI if " expr " = " expr" .B If tests if the two expressions are equal using set comparison, i.e. each expression should contain all the words in the other expression. If the test succeeds then the if-body is executed. .TP .BI ifdef " var" Executes the ifdef-body if .I var is defined. .TP .BI ifndef " var" Executes the ifndef-body if .I var is undefined. .TP .BI iftemp " arg" Executes the iftemp-body if .I arg is a temporary file. Use it when a command has the same file as input and output and you don't want to clobber the source file: .SP .RS .nf .ft B transform .o .o iftemp $\(** $> = $\(** else cp $\(** $> optimize $> .ft P .fi .RE .TP .BI ifhash " arg" Executes the ifhash-body if .I arg is an existing file with a '\fB#\fP' as the very first character. This usually indicates that the file must be pre-processed: .SP .RS .nf .ft B transform .s .o ifhash $\(** mktemp ASM .s $CPP $\(** > $ASM else ASM = $\(** $AS \-o $> $ASM unset ASM .ft P .fi .RE .TP .B else Executes the else-body if the last executed .BR if , .BR ifdef , .BR ifndef , .BR iftemp , or .B ifhash was unsuccessful. Note that .B else need not immediately follow an if, but you are advised not to make use of this. It is a "feature" that may not last. .TP .BI apply " suffix1 suffix2" Executed inside a transform rule body to transform the input file according to another transform rule that has the given input and output suffixes. The file under .B $\(** will be replaced by the new file. So if there is a .B .c .i preprocessor rule then the example of .B ifhash can be replaced by: .SP .RS .nf .ft B transform .s .o ifhash $\(** apply .c .i $AS \-o $> $* .ft P .fi .RE .TP .BI include " descr" Reads another description file and replaces the .B include with it. Execution continues with the first list in the new program. The search for .I descr is the same as used for the .B \-descr option. Use .B include to switch in different front ends or back ends, or to call a shared description file with a different initialization. Note that .I descr is only evaluated the first time the .B include is called. After that the .B include has been replaced with the included program, so changing its argument won't get you a different file. .TP .BI arg " string ..." .B Arg may be executed in the initialization and scanning phase to post an argument scanning rule, that's all the command itself does. Like an .B if that fails it allows more guards to share the same body. .TP .BI transform " suffix1 suffix2" .BR Transform , like .BR arg , only posts a rule to transform a file with the suffix .I suffix1 into a file with the suffix .IR suffix2 . .TP .BI prefer " suffix1 suffix2" Tells that the transformation rule from .I suffix1 to .I suffix2 is to be preferred when looking for a transformation path to the stop suffix. Normally the shortest route to the stop suffix is used. .B Prefer is ignored on a .BR combine , because the special nature of combines does not allow ambiguity. .SP The two suffixes on a .B transform or .B prefer may be the same, giving a rule that is only executed when preferred. .TP .BI combine " suffix-list suffix" .B Combine is like .B transform except that it allows a list of input suffixes to match several types of input files that must be combined into one. .TP .B scan The scanning phase may be run early from the initialization phase with the .B scan command. Use it if you need to make choices based on the arguments before posting the transformation rules. After running this, .B scan and .B arg become no-ops. .TP .B compile Move on to the compilation phase early, so that you have a chance to run a few extra commands before exiting. This command implies a .BR scan . .PP Any other command is seen as a \s-2UNIX\s+2 command. This is where the .B < and .B > operators come into play. They redirect standard input and standard output to the file mentioned after them, just like the shell. .B Acd will stop with an error if the command is not successful. .SS The Initialization Phase The driver starts by executing the program once from top to bottom to initialize variables and post argument scanning and transformation rules. .SS The Scanning Phase In this phase the driver makes a pass over the command line arguments to process options. Each .B arg rule is tried one by one in the order they were posted against the front of the argument list. If a match is made then the matched arguments are removed from the argument list and the arg-body is executed. If no match can be made then the first argument is moved to the list of files waiting to be transformed and the scan is restarted. .PP The match is done as follows: Each of the strings after .B arg must match one argument at the front of the argument list. A character in a string must match a character in an argument word, a subst in a string may match 1 to all remaining characters in the argument, preferring the shortest possible match. The hyphen in a argument starting with a hyphen cannot be matched by a subst. Therefore: .PP .RS .B arg \-i .RE .PP matches only the argument .BR \-i . .PP .RS .B arg \-O$n .RE .PP matches any argument that starts with .B \-O and is at least three characters long. Lastly, .PP .RS .B arg \-o $out .RE .PP matches .B \-o and the argument following it, unless that argument starts with a hyphen. .PP The variable .B $\(** is set to all the matched arguments before the arg-body is executed. All the substs in the arg strings are set to the characters they match. The variable .B $> is set to null. All the values of the variables are saved and the variables marked local. All variables except .B $> are marked read-only. After the arg-body is executed is the value of .B $> concatenated to the file list. This allows one to stuff new files into the transformation phase. These added names are not evaluated until the start of the next phase. .SS The Compilation Phase The files gathered in the file list in the scanning phase are now transformed one by one using the transformation rules. The shortest, or preferred route is computed for each file all the way to the stop suffix. Each file is transformed until it lands at the stop suffix, or at a combine rule. After a while all files are either fully transformed or at a combine rule. .PP The driver chooses a combine rule that is not on a path from another combine rule and executes it. The file that results is then transformed until it again lands at a combine rule or the stop suffix. This continues until all files are at the stop suffix and the program exits. .PP The paths through transform rules may be ambiguous and have cycles, they will be resolved. But paths through combines must be unambiguous, because of the many paths from the different files that meet there. A description file will usually have only one combine rule for the loader. However if you do have a combine conflict then put a no-op transform rule in front of one to resolve the problem. .PP If a file matches a long and a short suffix then the long suffix is preferred. By putting a null input suffix (\fB""\fP) in a rule one can match any file that no other rule matches. You can send unknown files to the loader this way. .PP The variable .B $\(** is set to the file to be transformed or the files to be combined before the transform or combine-body is executed. .B $> is set to the output file name, it may again be modified. .B $< is set to the original name of the first file of .B $\(** with the leading directories and the suffix removed. .B $\(** will be made up of temporary files after the first rule. .B $> will be another temporary file or the name of the target file .RB ( $< plus the stop suffix), if the stop suffix is reached. .PP .B $> is passed to the next rule; it is imploded and checked to be a single word. This driver does not store intermediate object files in the current directory like most other compilers, but keeps them in .B /tmp too. (Who knows if the current directory can have files created in?) As an example, here is how you can express the "normal" method: .PP .RS .nf .ft B transform .s .o if $> = $<.o # Stop suffix is .o else $> = $<.o temporary $> $AS \-o $> $\(** .ft P .fi .RE .PP Note that .B temporary is not called if the target is already the object file, or you would lose the intended result! .B $> is known to be a word, because .B $< is local. (Any string whose substs are all expanded changes to a word.) .SS "Predefined Variables" The driver has three variables predefined: .BR PROGRAM , set to the call name of the driver, .BR VERSION , the driver's version number, and .BR ARCH , set to the name of the default output architecture. The latter is optional, and only defined if .B acd was compiled with \fB\-DARCH=\e"\fP\fIarch-name\fP\fB\e"\fP. .SH EXAMPLE As an example a description file for a C compiler is given. It has a front end (ccom), an intermediate code optimizer (opt), a code generator (cg), an assembler (as), and a loader (ld). The compiler can pre-process, but there is also a separate cpp. If the .B \-D and options like it are changed to look like .B \-o then this example is even as required by \s-2POSIX\s+2. .RS .nf # The compiler support search path. C = /lib /usr/lib /usr/local/lib # Compiler passes. CPP = $C/cpp $CPP_F CCOM = $C/ccom $CPP_F OPT = $C/opt CG = $C/cg AS = $C/as LD = $C/ld # Predefined symbols. CPP_F = \-D__EXAMPLE_CC__ # Library path. LIBPATH = $USERLIBPATH $C # Default transformation target. stop .out # Preprocessor directives. arg \-D$name arg \-U$name arg \-I$dir CPP_F = $CPP_F $\(** # Stop suffix. arg \-c stop .o arg \-E stop .E # Optimization. arg \-O prefer .m .m OPT = $OPT -O1 arg \-O$n numeric $n prefer .m .m OPT = $OPT $\(** # Add debug info to the executable. arg \-g CCOM = $CCOM -g # Add directories to the library path. arg \-L$dir USERLIBPATH = $USERLIBPATH $dir # \-llib must be searched in $LIBPATH later. arg \-l$lib $> = $LIBPATH/lib$lib.a # Change output file. arg \-o$out arg \-o $out OUT = $out # Complain about a missing argument. arg \-o error "argument expected after '$\(**'" # Any other option (like \-s) are for the loader. arg \-$any LD = $LD $\(** # Preprocess C-source. transform .c .i $CPP $\(** > $> # Preprocess C-source and send it to standard output or $OUT. transform .c .E ifndef OUT $CPP $\(** else $CPP $\(** > $OUT # Compile C-source to intermediate code. transform .c .m transform .i .m $CCOM $\(** $> # Intermediate code optimizer. transform .m .m $OPT $\(** > $> # Intermediate to assembly. transform .m .s $CG $\(** > $> # Assembler to object code. transform .s .o if $> = $<.o ifdef OUT $> = $OUT $AS \-o $> $\(** # Combine object files and libraries to an executable. combine (.o .a) .out ifndef OUT OUT = a.out $LD \-o $OUT $C/crtso.o $\(** $C/libc.a .fi .RE .SH FILES .TP 25n .RI /usr/lib/ descr /descr \- compiler driver description file. .SH "SEE ALSO" .BR cc (1). .SH ACKNOWLEDGEMENTS Even though the end result doesn't look much like it, many ideas were nevertheless derived from the ACK compiler driver by Ed Keizer. .SH BUGS \s-2POSIX\s+2 requires that if compiling one source file to an object file fails then the compiler should continue with the next source file. There is no way .B acd can do this, it always stops after error. It doesn't even know what an object file is! (The requirement is stupid anyhow.) .PP If you don't think that tabs are 8 spaces wide, then don't mix them with spaces for indentation. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ANM 1 .SH NAME anm \- print name list .SH SYNOPSIS \fBanm \fR[\fB\-gnoprus\fR] \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-g" "Global symbols only" .FL "\-n" "Sort numerically" .FL "\-o" "Prepend the filename to each line" .FL "\-p" "No sorting\(emuse symbol table order" .FL "\-r" "Sort in reverse order" .FL "\-u" "List undefined symbols only" .FL "\-s" "Sort in section order" .SH EXAMPLES .EX "anm \-gn test.o" "Print global symbols in numerical order" .SH DESCRIPTION .PP .I Anm prints the name list (symbol table) of each ACK format object .I file in the argument list. If no file name is given, \fIa.out\fR is used. Each symbol name is preceded by its value, a section indicator and a type indicator. The section indicators are: .PP .ta 0.25i 0.50i .nf \fBU\fR Undefined symbol \fBA\fR Absolute symbol \fB\-\fR Other symbol .sp The type indicators are: .PP \fBF\fR Filename \fBM\fR Module name \fBS\fR Section name \fBE\fR External (global) symbol \fB\-\fR Local symbol .fi .PP The output is sorted alphabetically, unless otherwise specified. Notice that \fIanm\fR can only be used on ACK format object files (that is: \fI.o\fR and \fI.out\fR files). If you want to get the name list of an executable program use .I nm instead. .SH "SEE ALSO" .BR asize (1), .BR nm (1), .BR ar (1), .BR size (1). .TH AR 1 .SH NAME ar, aal \- archivers .SH SYNOPSIS \fBar\fR [\fBdmpqrtx\fR][\fBabciluv\fR]\fR [\fIposname\fR] \fIarchive\fR [\fIfile \fR...]\fR .br \fBaal\fR [\fBdpqrtx\fR][\fBclv\fR]\fR \fIarchive\fR [\fIfile \fR...]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "ar r libc.a sort.s" "Replace \fIsort\fR.s in \fIlibc.a\fR" .EX "ar rb a.s libc.a b.s" "Insert \fIb.s\fR before \fIa.s\fR in \fIlibc.a\fR" .SH DESCRIPTION .PP \fIAr\fR allows groups of files to be put together into a single archive. It is normally used for libraries of compiled procedures. \fIAal\fR is like \fIar\fP, but is to be used with the ACK compiler. The following keys are allowed: .PP .ta 0.25i 0.50i .nf \fBd\fR: Delete. \fIAr\fR will delete the named members. \fBm\fR: Move named files. \fIAr\fR expects \fIa\fR, \fIb\fR, or \fIi\fR to be specified. \fBp\fR: Print the named files (list them on \fIstdout\fR) \fBq\fR: Quickly append to the end of the archive file. \fBr\fR: Replace (append when not in archive). \fBt\fR: Print the archive's table of contents. \fBx\fR: Extract .fi .PP \fBThe keys may optionally concatencated with one or more of the following\fR: .nf .PP \fBa\fR: After \fIposname\fR \fBb\fR: Before \fIposname\fR \fBc\fR: Create (suppresses creation message) \fBi\fR: Before \fIposname\fR \fBl\fR: Local temporary file for work instead of \fI/tmp/ar.$$$$$\fR \fBu\fR: Replace only if dated later than member in archive \fBv\fR: Verbose .PP .fi .SH "SEE ALSO" .BR anm (1), .BR asize (1), .BR nm (1), .BR size (1). .\" Copyright (c) 1990 The Regents of the University of California. .\" All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" John B. Roll Jr. and the Institute of Electrical and Electronics .\" Engineers, Inc. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)xargs.1 5.5 (Berkeley) 6/27/91 .\" .TH XARGS 1 "June 27, 1991" .UC 7 .SH NAME xargs \- construct argument list(s) and execute utility. .SH SYNOPSIS .B xargs .RB [ \-ft0 ] .RB [[ \-x ] .B \-n .IR number ] .RB [ \-s .IR size ] .RI [ utility .RI [ argument " ...]]" .SH DESCRIPTION The .B xargs utility reads space, tab, newline and end-of-file delimited arguments from the standard input and executes the specified .I utility with them as arguments. .PP The utility and any arguments specified on the command line are given to the .I utility upon each invocation, followed by some number of the arguments read from standard input. The .I utility is repeatedly executed until standard input is exhausted. .PP Spaces, tabs and newlines may be embedded in arguments using single (`` ' '') or double (``"'') quotes or backslashes (``\e''). Single quotes escape all non-single quote characters, excluding newlines, up to the matching single quote. Double quotes escape all non-double quote characters, excluding newlines, up to the matching double quote. Any single character, including newlines, may be escaped by a backslash. .PP The options are as follows: .TP .B \-f Force .B xargs to ignore the exit status returned by .IR utility . By default, .B xargs will exit immediately if .I utility exits with a non-zero exit status. This does not include ignoring .I utility exiting due to a signal or without calling .BR exit (2). .TP .BI \-n " number" Set the maximum number of arguments taken from standard input for each invocation of the utility. An invocation of .I utility will use less than .I number standard input arguments if the number of bytes accumulated (see the .I \-s option) exceeds the specified .I size or there are fewer than .I number arguments remaining for the last invocation of .IR utility . The current default value for .I number is 5000. .TP .BI \-s " size" Set the maximum number of bytes for the command line length provided to .IR utility . The sum of the length of the utility name and the arguments passed to .I utility (including NULL terminators) will be less than or equal to this number. The current default value for .I size is ARG_MAX - 2048. .TP .B \-t Echo the command to be executed to standard error immediately before it is executed. .TP .B \-x Force .B xargs to terminate immediately if a command line containing .I number arguments will not fit in the specified (or default) command line length. .TP .B \-0 Read null-byte terminated pathnames from standard input as may have been produced by the .B \-print0 option of .BR find (1). This is a Minix specific extension to .BR xargs . .PP If no .I utility is specified, .BR echo (1) is used. .PP Undefined behavior may occur if .I utility reads from the standard input. .PP .B Xargs exits with an exit status of 0 if no error occurs. If .I utility cannot be invoked, is terminated by a signal or terminates without calling .BR exit (2), .B xargs exits with an exit status of 127. If .I utility exits with an exit status other than 0, .B xargs exits with that exit status. Otherwise, .B xargs exits with an exit status of 1. .SH "SEE ALSO" .BR echo (1), .BR find (1). .SH STANDARDS The .B xargs utility is expected to be POSIX 1003.2 compliant. .\" Copyright (c) 1991 The Regents of the University of California. .\" All rights reserved. .\" .\" This code is derived from software contributed to Berkeley by .\" Kenneth Almquist. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)sh.1 5.1 (Berkeley) 3/7/91 .\" .TH SH 1 "March 7, 1991" .UC 7 .de h \" subheading .sp .ti -0.3i .B "\\$1" .PP .. .de d \" begin display .sp .in +4 .nf .. .de e \" end display .in -4 .fi .sp .. .de c \" command, etc. .br .HP 3 \fB\\$1\fR .br .. .de b \" begin builtin command .HP 3 .B \\$1 .. .SH NAME ash, sh, ., break, case, cd, command, continue, eval, exec, exit, export, for, getopts, hash, if, jobs, local, read, readonly, return, set, setvar, shift, trap, umask, unset, wait, while \- a shell .SH SYNOPSIS .B ash [ .B -efIijnsxz ] [ .B +efIijnsxz ] [ .B -c .I command ] [ .I arg ] ... .SH COPYRIGHT Copyright 1989 by Kenneth Almquist. .SH DESCRIPTION .I Ash is a version of .I sh with features similar to those of the System V shell. This manual page lists all the features of .I ash but concentrates on the ones not in other shells. .h "Invocation" If the .B -c options is given, then the shell executes the specified shell command. The .B -s flag cause the shell to read commands from the standard input (after executing any command specified with the .B -c option. If neither the .B -s or .B -c options are set, then the first .I arg is taken as the name of a file to read commands from. If this is impossible because there are no arguments following the options, then .I ash will set the .B -s flag and will read commands from the standard input. .PP The shell sets the initial value of the positional parameters from the .IR arg s remaining after any .I arg used as the name of a file of commands is deleted. .PP The flags (other than .BR -c ) are set by preceding them with ``-'' and cleared by preceding them with ``+''; see the .I set builtin command for a list of flags. If no value is specified for the .B -i flag, the .B -s flag is set, and the standard input and output of the shell are connected to terminals, then the .B -i flag will be set. If no value is specified for the .B -j flag, then the .B -j flag will be set if the .B -i flag is set. .PP When the shell is invoked with the .B -c option, it is good practice to include the .I -i flag if the command was entered interactively by a user. For compatibility with the System V shell, the .I -i option should come after the .B -c option. .PP If the first character of argument zero to the shell is ``-'', the shell is assumed to be a login shell, and the files .B /etc/profile and .B .profile are read if they exist. If the environment variable SHINIT is set on entry to the shell, the commands in SHINIT are normally parsed and executed. SHINIT is not examined if the shell is a login shell, or if it the shell is running a shell procedure. (A shell is considered to be running a shell procedure if neither the .B -s nor the .B -c options are set.) .h "Control Structures" A .I list is a sequence of zero or more commands separated by newlines, semicolons, or ampersands, and optionally terminated by one of these three characters. (This differs from the System V shell, which requires a list to contain at least one command in most cases.) The commands in a list are executed in the order they are written. If command is followed by an ampersand, the shell starts the command and immediately proceed onto the next command; otherwise it waits for the command to terminate before proceeding to the next one. .PP ``&&'' and ``||'' are binary operators. ``&&'' executes the first command, and then executes the second command iff the exit status of the first command is zero. ``||'' is similar, but executes the second command iff the exit status of the first command is nonzero. ``&&'' and ``||'' both have the same priority. .PP The ``|'' operator is a binary operator which feeds the standard output of the first command into the standard input of the second command. The exit status of the ``|'' operator is the exit status of the second command. ``|'' has a higher priority than ``||'' or ``&&''. .PP An .I if command looks like .d \fBif\fR list \fBthen\fR list .ti -\w'[ 'u [ \fBelif\fR list \fBthen\fR list ] ... .ti -\w'[ 'u [ \fBelse\fR list ] \fBfi\fR .e .PP A .I while command looks like .d \fBwhile\fR list \fBdo\fR list \fBdone\fR .e The two lists are executed repeatedly while the exit status of the first list is zero. The .I until command is similar, but has the word .B until in place of .B while repeats until the exit status of the first list is zero. .PP The .I for command looks like .d \fBfor\fR variable \fBin\fR word... \fBdo\fR list \fBdone\fR .e The words are expanded, and then the list is executed repeatedly with the variable set to each word in turn. .B do and .B done may be replaced with ``{'' and ``}''. .PP The .I break and .I continue commands look like .d \fBbreak\fR [ num ] \fBcontinue\fR [ num ] .e .I Break terminates the .I num innermost .I for or .I while loops. .I Continue continues with the next iteration of the .IRnum'th innermost loop. These are implemented as builtin commands. .PP The .I case command looks like .d \fBcase\fR word \fBin\fR pattern\fB)\fR list \fB;;\fR \&... \fBesac\fR .e The pattern can actually be one or more patterns (see .I Patterns below), separated by ``|'' characters. .PP Commands may be grouped by writing either .d \fB(\fRlist\fB)\fR .e or .d \fB{\fR list; \fB}\fR .e The first of these executes the commands in a subshell. .PP A function definition looks like .d name \fB( )\fR command .e A function definition is an executable statement; when executed it installs a function named .B name and returns an exit status of zero. The command is normally a list enclosed between ``{'' and ``}''. .PP Variables may be declared to be local to a function by using a .I local command. This should appear as the first staement of a function, and looks like .d \fBlocal\fR [ variable | \fB-\fR ] ... .e .I Local is implemented as a builtin command. .PP When a variable is made local, it inherits the initial value and exported and readonly flags from the variable with the same name in the surrounding scope, if there is one. Otherwise, the variable is initially unset. .I Ash uses dynamic scoping, so that if you make the variable .B x local to function .IR f , which then calls function .IR g , references to the variable .B x made inside .I g will refer to the variable .B x declared j l m n o p q r s t u v w x y z { | } ~  inside .IR f , not to the global variable named .BR x . .PP The only special parameter than can be made local is ``\fB-\fR''. Making ``\fB-\fR'' local any shell options that are changed via the .I set command inside the function to be restored to their original values when the function returns. .PP The .I return command looks like .d \fBreturn\fR [ exitstatus ] .e It terminates the currently executing function. .I Return is implemented as a builtin command. .h "Simple Commands" A simple command is a sequence of words. The execution of a simple command proceeds as follows. First, the leading words of the form ``name=value'' are stripped off and assigned to the environment of the command. Second, the words are expanded. Third, the first remaining word is taken as the command name that command is located. Fourth, any redirections are performed. Fifth, the command is executed. We look at these operations in reverse order. .PP The execution of the command varies with the type of command. There are three types of commands: shell functions, builtin commands, and normal programs. .PP When a shell function is executed, all of the shell positional parameters (except $0, which remains unchanged) are set to the parameters to the shell function. The variables which are explicitly placed in the environment of the command (by placing assignments to them before the function name) are made local to the function and are set to values given. Then the command given in the function definition is executed. The positional parameters are restored to their original values when the command completes. .PP Shell builtins are executed internally to the shell, without spawning a new process. .PP When a normal program is executed, the shell runs the program, passing the parameters and the environment to the program. If the program is a shell procedure, the shell will interpret the program in a subshell. The shell will reinitialize itself in this case, so that the effect will be as if a new shell had been invoked to handle the shell procedure, except that the location of commands located in the parent shell will be remembered by the child. If the program is a file beginning with ``#!'', the remainder of the first line specifies an interpreter for the program. The shell (or the operating system, under Berkeley UNIX) will run the interpreter in this case. The arguments to the interpreter will consist of any arguments given on the first line of the program, followed by the name of the program, followed by the arguments passed to the program. .h "Redirection" Input/output redirections can be intermixed with the words in a simple command and can be placed following any of the other commands. When redirection occurs, the shell saves the old values of the file descriptors and restores them when the command completes. The ``<'', ``>'', and ``>>'' redirections open a file for input, output, and appending, respectively. The ``<&digit'' and ``>&digit'' makes the input or output a duplicate of the file descriptor numbered by the digit. If a minus sign is used in place of a digit, the standard input or standard output are closed. .PP The ``<<\ word'' redirection takes input from a .I here document. As the shell encounters ``<<'' redirections, it collects them. The next time it encounters an unescaped newline, it reads the documents in turn. The word following the ``<<'' specifies the contents of the line that terminates the document. If none of the quoting methods ('', "", or \e) are used to enter the word, then the document is treated like a word inside double quotes: ``$'' and backquote are expanded and backslash can be used to escape these and to continue long lines. The word cannot contain any variable or command substitutions, and its length (after quoting) must be in the range of 1 to 79 characters. If ``<<-'' is used in place of ``<<'', then leading tabs are deleted from the lines of the document. (This is to allow you do indent shell procedures containing here documents in a natural fashion.) .PP Any of the preceding redirection operators may be preceded by a single digit specifying the file descriptor to be redirected. There cannot be any white space between the digit and the redirection operator. .h "Path Search" When locating a command, the shell first looks to see if it has a shell function by that name. Then, if PATH does not contain an entry for "%builtin", it looks for a builtin command by that name. Finally, it searches each entry in PATH in turn for the command. .PP The value of the PATH variable should be a series of entries separated by colons. Each entry consists of a directory name, or a directory name followed by a flag beginning with a percent sign. The current directory should be indicated by an empty directory name. .PP If no percent sign is present, then the entry causes the shell to search for the command in the specified directory. If the flag is ``%builtin'' then the list of shell builtin commands is searched. If the flag is ``%func'' then the directory is searched for a file which is read as input to the shell. This file should define a function whose name is the name of the command being searched for. .PP Command names containing a slash are simply executed without performing any of the above searches. .h "The Environment" The environment of a command is a set of name/value pairs. When the shell is invoked, it reads these names and values, sets the shell variables with these names to the corresponding values, and marks the variables as exported. The .I export command can be used to mark additional variables as exported. .PP The environment of a command is constructed by constructing name/value pairs from all the exported shell variables, and then modifying this set by the assignments which precede the command, if any. .h "Expansion" The process of evaluating words when a shell procedure is executed is called .IR expansion . Expansion consists of four steps: variable substitution, command substitution, word splitting, and file name generation. If a word is the expression following the word .B case in a case statement, the file name which follows a redirection symbol, or an assignment to the environment of a command, then the word cannot be split into multiple words. In these cases, the last two steps of the expansion process are omitted. .h "Variable Substitution" To be written. .h "Command Substitution" .I Ash accepts two syntaxes for command substitution: .d `\fIlist\fR` .e and .d $(\fIlist\fR) .e Either of these may be included in a word. During the command substitution process, the command (syntactly a .IR list ) will be executed and anything that the command writes to the standard output will be captured by the shell. The final newline (if any) of the output will be deleted; the rest of the output will be substituted for the command in the word. .h "Word Splitting" When the value of a variable or the output of a command is substituted, the resulting text is subject to word splitting, unless the dollar sign introducing the variable or backquotes containing the text were enclosed in double quotes. In addition, ``$@'' is subject to a special type of splitting, even in the presence of double quotes. .PP Ash uses two different splitting algorithms. The normal approach, which is intended for splitting text separated by which space, is used if the first character of the shell variable IFS is a space. Otherwise an alternative experimental algorithm, which is useful for splitting (possibly empty) fields separated by a separator character, is used. .PP When performing splitting, the shell scans the replacement text looking for a character (when IFS does not begin with a space) or a sequence of characters (when IFS does begin with a space), deletes the character or sequence of characters, and spits the word into two strings at that point. When IFS begins with a space, the shell deletes either of the strings if they are null. As a special case, if the word containing the replacement text is the null string, the word is deleted. .PP The variable ``$@'' is special in two ways. First, splitting takes place between the positional parameters, even if the text is enclosed in double quotes. Second, if the word containing the replacement text is the null string and there are no positional parameters, then the word is deleted. The result of these rules is that "$@" is equivalent to "$1" "$2" ... "$\fIn\fR", where \fIn\fR is the number of positional parameters. (Note that this differs from the System V shell. The System V documentation claims that "$@" behaves this way; in fact on the System V shell "$@" is equivalent to "" when there are no positional paramteters.) .h "File Name Generation" Unless the .B -f flag is set, file name generation is performed after word splitting is complete. Each word is viewed as a series of patterns, separated by slashes. The process of expansion replaces the word with the names of all existing files whose names can be formed by replacing each pattern with a string that matches the specified pattern. There are two restrictions on this: first, a pattern cannot match a string containing a slash, and second, a pattern cannot match a string starting with a period unless the first character of the pattern is a period. .PP If a word fails to match any files and the .B -z flag is not set, then the word will be left unchanged (except that the meta-characters will be converted to normal characters). If the .B -z flag is set, then the word is only left unchanged if none of the patterns contain a character that can match anything besides itself. Otherwise the .B -z flag forces the word to be replaced with the names of the files that it matches, even if there are zero names. .h "Patterns" A .I pattern consists of normal characters, which match themselves, and meta-characters. The meta-characters are ``!'', ``*'', ``?'', and ``[''. These characters lose there special meanings if they are quoted. When command or variable substitution is performed and the dollar sign or back quotes are not double quoted, the value of the variable or the output of the command is scanned for these characters and they are turned into meta-characters. .PP Two exclamation points at the beginning of a pattern function as a ``not'' operator, causing the pattern to match any string that the remainder of the pattern does .I not match. Other occurances of exclamation points in a pattern match exclamation points. Two exclamation points are required rather than one to decrease the incompatibility with the System V shell (which does not treat exclamation points specially). .PP An asterisk (``*'') matches any string of characters. A question mark matches any single character. A left bracket (``['') introduces a character class. The end of the character class is indicated by a ``]''; if the ``]'' is missing then the ``['' matches a ``['' rather than introducing a character class. A character class matches any of the characters between the square brackets. A range of characters may be specified using a minus sign. The character class may be complemented by making an exclamation point the first character of the character class. .PP To include a ``]'' in a character class, make it the first character listed (after the ``!'', if any). To include a minus sign, make it the first or last character listed. .h "The /u Directory" By convention, the name ``/u/user'' refers to the home directory of the specified user. There are good reasons why this feature should be supported by the file system (using a feature such as symbolic links) rather than by the shell, but .I ash is capable of performing this mapping if the file system doesn't. If the mapping is done by .IR ash , setting the .B -f flag will turn it off. .h "Character Set" .I Ash silently discards nul characters. Any other character will be handled correctly by .IR ash , including characters with the high order bit set. .h "Job Names and Job Control" The term .I job refers to a process created by a shell command, or in the case of a pipeline, to the set of processes in the pipeline. The ways to refer to a job are: .d %\fInumber\fR %\fIstring\fR %% \fIprocess_id\fR .e The first form identifies a job by job number. When a command is run, .I ash assigns it a job number (the lowest unused number is assigned). The second form identifies a job by giving a prefix of the command used to create the job. The prefix must be unique. If there is only one job, then the null prefix will identify the job, so you can refer to the job by writing ``%''. The third form refers to the \fIcurrent job\fR. The current job is the last job to be stopped while it was in the foreground. (See the next paragraph.) The last form identifies a job by giving the process id of the last process in the job. .PP If the operating system that .I ash is running on supports job control, .I ash will allow you to use it. In this case, typing the suspend character (typically ^Z) while running a command will return you to .I ash and will make the suspended command the current job. You can then continue the job in the background by typing .IR bg , or you can continue it in the foreground by typing .IR fg . .h "Atty" If the shell variable ATTY is set, and the shell variable TERM is not set to ``emacs'', then \fIash\fR generates appropriate escape sequences to talk to .IR atty (1). .h "Exit Statuses" By tradition, an exit status of zero means that a command has succeeded and a nonzero exit status indicates that the command failed. This is better than no convention at all, but in practice it is extremely useful to allow commands that succeed to use the exit status to return information to the caller. A variety of better conventions have been proposed, but none of them has met with universal approval. The convention used by \fIash\fR and all the programs included in the \fIash\fR distribution is as follows: .ta 1i 2i .nf 0 Success. 1 Alternate success. 2 Failure. 129-... Command terminated by a signal. .fi The \fIalternate success\fR return is used by commands to indicate various conditions which are not errors but which can, with a little imagination, be conceived of as less successful than plain success. For example, .I test returns 1 when the tested condition is false and .I getopts returns 1 when there are no more options. Because this convention is not used universally, the .B -e option of .I ash causes the shell to exit when a command returns 1 even though that contradicts the convention described here. .PP When a command is terminated by a signal, the uses 128 plus the signal number as the exit code for the command. .h "Builtin Commands" This concluding section lists the builtin commands which are builtin because they need to perform some operation that can't be performed by a separate process. In addition to these, there are several other commands .RI ( catf , .IR echo , .IR expr , .IR line , .IR nlecho , .IR test , .RI `` : '', and .IR true ) which can optionally be compiled into the shell. The builtin commands described below that accept options use the System V Release 2 .IR getopt (3) syntax. .sp .b bg [ .I job ] ... .br Continue the specified jobs (or the current job if no jobs are given) in the background. This command is only available on systems with Bekeley job control. .b command .IR "command arg" ... .br Execute the specified builtin command. (This is useful when you have a shell function with the same name as a builtin command.) .b cd [ .I directory ] .br Switch to the specified directory (default $HOME). If the an entry for CDPATH appears in the environment of the cd command or the shell variable CDPATH is set and the directory name does not begin with a slash, then the directories listed in CDPATH will be searched for the specified directory. The format of CDPATH is the same as that of PATH. In an interactive shell, the cd command will print out the name of the directory that it actually switched to if this is different from the name that the user gave. These may be different either because the CDPATH mechanism was used or because a symbolic link was crossed. .\" .b ".\fI\h'0.1i'file" .\" Cawf can't do \h'0.1i' .b . .I file .br The commands in the specified file are read and executed by the shell. A path search is not done to find the file because the directories in PATH generally contain files that are intended to be executed, not read. .b eval .IR string ... .br The strings are parsed as shell commands and executed. (This differs from the System V shell, which concatenates the arguments (separated by spaces) and parses the result as a single command.) .b exec [ .IR "command arg" ... ] .br Unless .I command is omitted, the shell process is replaced with the specified program (which must be a real program, not a shell builtin or function). Any redirections on the exec command are marked as permanent, so that they are not undone when the exec command finishes. If the command is not found, the exec command causes the shell to exit. .b exit [ .I exitstatus ] .br Terminate the shell process. If .I exitstatus is given it is used as the exit status of the shell; otherwise the exit status of the preceding command is used. .b export .IR name ... .br The specified names are exported so that they will appear in the environment of subsequent commands. The only way to un-export a variable is to unset it. .I Ash allows the value of a variable to be set at the same time it is exported by writing .d \fBexport\fR name=value .e With no arguments the export command lists the names of all exported variables. .b fg [ .I job ] .br Move the specified job or the current job to the foreground. This command is only available on systems with Bekeley job control. .b getopts .I optstring .I var .br The System V .I getopts command. .b hash .B -rv .IR command ... .br The shell maintains a hash table which remembers the locations of commands. With no arguments whatsoever, the hash command prints out the contents of this table. Entries which have not been looked at since the last .I cd command are marked with an asterisk; it is possible for these entries to be invalid. .sp With arguments, the hash command removes the specified commands from the hash table (unless they are functions) and then locates them. With the .B -v option, .I hash prints the locations of the commands as it finds them. The .B -r option causes the .I hash command to delete all the entries in the hash table except for functions. .b jobid [ .I job ] .br Print the process id's of the processes in the job. If the job argument is omitted, use the current job. .b jobs .br This command lists out all the background processes which are children of the current shell process. .b pwd .br Print the current directory. The builtin command may differ from the program of the same name because the builtin command remembers what the current directory is rather than recomputing it each time. This makes it faster. However, if the current directory is renamed, the builtin version of pwd will continue to print the old name for the directory. .b read [ .B -p .I prompt ] [ .B -e ] .IR variable ... .br The prompt is printed if the .B -p option is specified and the standard input is a terminal. Then a line is read from the standard input. The trailing newline is deleted from the line and the line is split as described in the section on word splitting above, and the pieces are assigned to the variables in order. If there are more pieces than variables, the remaining pieces (along with the characters in IFS that separated them) are assigned to the last variable. If there are more variables than pieces, the remaining variables are assigned the null string. .sp The .B -e option causes any backslashes in the input to be treated specially. If a backslash is followed by a newline, the backslash and the newline will be deleted. If a backslash is followed by any other character, the backslash will be deleted and the following character will be treated as though it were not in IFS, even if it is. .b readonly .IR name ... .br The specified names are marked as read only, so that they cannot be subsequently modified or unset. .I Ash allows the value of a variable to be set at the same time it is marked read only by writing .d \fBreadonly\fR name=value .e With no arguments the readonly command lists the names of all read only variables. .b set [ { .BI - options | .BI + options | .B -- } ] .IR arg ... .br The .I set command performs three different functions. .sp With no arguments, it lists the values of all shell variables. .sp If options are given, it sets the specified option flags, or clears them if the option flags are introduced with a .B + rather than a .BR - . Only the first argument to .I set can contain options. The possible options are: .sp .ta 0.4i .in +0.4i .ti -0.4i \fB-e\fR Causes the shell to exit when a command terminates with a nonzero exit status, except when the exit status of the command is explicitly tested. The exit status of a command is considered to be explicitly tested if the command is used to control an .IR if , .IR elif , .IR while , or .IR until ; or if the command is the left hand operand of an ``&&'' or ``||'' operator. .sp .ti -0.4i \fB-f\fR Turn off file name generation. .sp .ti -0.4i \fB-I\fR Cause the shell to ignore end of file conditions. (This doesn't apply when the shell a script sourced using the ``.'' command.) The shell will in fact exit if it gets 50 eof's in a row. .sp .ti -0.4i \fB-i\fR Make the shell interactive. This causes the shell to prompt for input, to trap interrupts, to ignore quit and terminate signals, and to return to the main command loop rather than exiting on error. .sp .ti -0.4i \fB-j\fR Turns on Berkeley job control, on systems that support it. When the shell starts up, the .B -j is set by default if the .B -i flag is set. .sp .ti -0.4i \fB-n\fR Causes the shell to read commands but not execute them. (This is marginally useful for checking the syntax of scripts.) .sp .ti -0.4i \fB-s\fR If this flag is set when the shell starts up, the shell reads commands from its standard input. The shell doesn't examine the value of this flag any other time. .sp .ti -0.4i \fB-x\fR If this flag is set, the shell will print out each command before executing it. .sp .ti -0.4i \fB-z\fR If this flag is set, the file name generation process may generate zero files. If it is not set, then a pattern which does not match any files will be replaced by a quoted version of the pattern. .in -0.4i .sp The third use of the set command is to set the values of the shell's positional parameters to the specified .IR args . To change the positional parameters without changing any options, use ``\fB--\fR'' as the first argument to .IR set . If no args are present, the set command will leave the value of the positional parameters unchanged, so to set the positional parameters to set of values that may be empty, execute the command .d shift $# .e first to clear out the old values of the positional parameters. .b setvar .I variable .I value .br Assigns .I value to .IR variable . (In general it is better to write .I variable=value rather than using .IR setvar . .I Setvar is intended to be used in functions that assign values to variables whose names are passed as parameters.) .b shift [ .I n ] .br Shift the positional parameters .I n times. A shift sets the value of $1 to the value of $2, the value of $2 to the value of $3, and so on, decreasing the value of $# by one. If there are zero positional parameters, shifting doesn't do anything. .b trap [ .I action ] .IR signal ... .br Cause the shell to parse and execute .I action when any of the specified signals are received. The signals are specified by signal number. .I Action may be null or omitted; the former causes the specified signal to be ignored and the latter causes the default action to be taken. When the shell forks off a subshell, it resets trapped (but not ignored) signals to the default action. The trap command has no effect on signals that were ignored on entry to the shell. .b umask [ .I mask ] .br Set the value of umask (see .IR umask (2)) to the specified octal value. If the argument is omitted, the umask value is printed. .b unset .IR name ... .br The specified variables and functions are unset and unexported. If a given name corresponds to both a variable and a function, both the variable and the function are unset. .b wait [ .I job ] .br Wait for the specified job to complete and return the exit status of the last process in the job. If the argument is omitted, wait for all jobs to complete and the return an exit status of zero. .SH EXAMPLES The following function redefines the \fIcd\fR command: .d cd() { if command cd "$@" then if test -f .enter then . .enter else return 0 fi fi } .e This function causes the file ``.enter'' to be read when you enter a directory, if it exists. The \fIcommand\fR command is used to access the real \fIcd\fR command. The ``return 0'' ensures that the function will return an exit status of zero if it successfully changes to a directory that does not contain a ``.enter'' file. Redefining existing commands is not always a good idea, but this example shows that you can do it if you want to. .PP The suspend function distributed with .I ash looks like .d # Copyright (C) 1989 by Kenneth Almquist. All rights reserved. # This file is part of ash, which is distributed under the terms # specified by the Ash General Public License. suspend() { local - set +j kill -TSTP 0 } .e This turns off job control and then sends a stop signal to the current process group, which suspends the shell. (When job control is turned on, the shell ignores the TSTP signal.) Job control will be turned back on when the function returns because ``-'' is local to the function. As an example of what \fInot\fR to do, consider an earlier version of \fIsuspend\fR: .d suspend() { suspend_flag=$- set +j kill -TSTP 0 set -$suspend_flag } .e There are two problems with this. First, \fBsuspend_flag\fR is a global variable rather than a local one, which will cause problems in the (unlikely) circumstance that the user is using that variable for some other purpose. Second, consider what happens if shell received an interrupt signal after it executes the first \fIset\fR command but before it executes the second one. The interrupt signal will abort the shell function, so that the second \fIset\fR command will never be executed and job control will be left off. The first version of \fIsuspend\fR avoids this problem by turning job control off only in a local copy of the shell options. The local copy of the shell options is discarded when the function is terminated, no matter how it is terminated. .SH HINTS Shell variables can be used to provide abbreviations for things which you type frequently. For example, I set .br .\" \h'1i'export h=$HOME .\" Cawf can't do \h'1i' .in +1i export h=$HOME .in -1i .br in my .profile so that I can type the name of my home directory simply by typing ``$h''. .PP When writing shell procedures, try not to make assumptions about what is imported from the environment. Explicitly unset or initialize all variables, rather than assuming they will be unset. If you use cd, it is a good idea to unset CDPATH. .PP People sometimes use ``<&-'' or ``>&-'' to provide no input to a command or to discard the output of a command. A better way to do this is to redirect the input or output of the command to .BR /dev/null . .PP Word splitting and file name generation are performed by default, and you have to explicitly use double quotes to suppress it. This is backwards, but you can learn to live with it. Just get in the habit of writing double quotes around variable and command substitutions, and omit them only when you really want word splitting and file name generation. If you want word splitting but not file name generation, use the .B -f option. .SH AUTHORS Kenneth Almquist .SH "SEE ALSO" echo(1), expr(1), line(1), pwd(1), true(1). .SH BUGS When command substitution occurs inside a here document, the commands inside the here document are run with their standard input closed. For example, the following will not word because the standard input of the .I line command will be closed when the command is run: .d cat <<-! Line 1: $(line) Line 2: $(line) ! .e .PP Unsetting a function which is currently being executed may cause strange behavior. .PP The shell syntax allows a here document to be terminated by an end of file as well as by a line containing the terminator word which follows the ``<<''. What this means is that if you mistype the terminator line, the shell will silently swallow up the rest of your shell script and stick it in the here document. .TH ASIZE 1 .SH NAME asize \- report the size of an object file .SH SYNOPSIS \fBasize \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "asize test.o" "Give the size of \fItest.o\fR" .SH DESCRIPTION .PP .I Asize prints for each argument the (decimal) number of bytes used by the different sections, as well as their sum in decimal and hexadecimal. If no .I file is given \fIa.out\fR is used. .I Asize can only be used to obtain the size of a \(M2 \fI.o\fR or \fI.out\fR file. To obtain the size of an executable, use .I size instead. .SH "SEE ALSO" .BR anm (1), .BR nm (1), .BR ar (1), .BR size (1). .TH AT 1 .SH NAME at, atrun \- execute commands at a later time .SH SYNOPSIS \fBat \fItime\fR [\fImonth day\fR] [\fIfile\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "at 2315 Jan 31 myfile" "Myfile executed Jan 31 at 11:15 pm" .EX "at 0900" "Job input read from \fIstdin\fR" .EX "at 0711 4 29 " "Read from \fIstdin\fR, exec on April 29" .SH DESCRIPTION .PP \fBAt\fR prepares a file to be executed later at the specified time by creating a special entry in \fB/usr/spool/at\fR. The \fBcron\fR daemon takes care of executing these jobs. It checks to see if any files in \fB/usr/spool/at\fR should now be run, and if so, it runs them and then puts them in \fB/usr/spool/at/past\fR. The name of the file created in \fB/usr/spool/at\fR by \fBat\fR is YY.DDD.HHMM.UU (where YY, DDD, HH, and MM give the time to execute and UU is a unique number). Note that when the command runs, it will not be able to use standard input unless specifically redirected. Standard output will be mailed to the owner of the job. .SH "SEE ALSO" .BR cron (8). .TH BANNER 1 .SH NAME banner \- print a banner .SH SYNOPSIS \fBbanner \fIarg ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "banner happy birthday" "Print a banner saying happy birthday" .SH DESCRIPTION .PP \fIBanner\fR prints its arguments on \fIstdout\fR using a matrix of 6 x 6 pixels per character. .TH BASENAME 1 .SH NAME basename, dirname \- strip off file prefixes and suffixes .SH SYNOPSIS \fBbasename \fIfile\fR [\fIsuffix\fR]\fR .br \fBdirname \fIfile\fR .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "basename /user/ast/file.c" "Strips path to yield \fIfile.c\fP" .EX "basename /user/file.c .c" "Strips path and \fI.c\fP to yield \fIfile\fP" .EX "dirname /user/file.c" "Strips basename to yield \fI/user\fP" .SH DESCRIPTION .PP .I Basename removes the initial directory names (if any) yielding the name of the file itself. If a second argument is present, it is interpreted as a suffix and is also stripped, if present. .PP .I Dirname removes the final component of a path, yielding the directory a file is in. .PP These programs are primarily used in shell scripts. .\" .\" bc.1 - the *roff document processor source for the bc manual .\" .\" This file is part of bc written for MINIX. .\" Copyright (C) 1991, 1992 Free Software Foundation, Inc. .\" .\" This program is free software; you can redistribute it and/or modify .\" it under the terms of the GNU General Public License as published by .\" the Free Software Foundation; either version 2 of the License , or .\" (at your option) any later version. .\" .\" This program is distributed in the hope that it will be useful, .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with this program; see the file COPYING. If not, write to .\" the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. .\" .\" You may contact the author by: .\" e-mail: phil@cs.wwu.edu .\" us-mail: Philip A. Nelson .\" Computer Science Department, 9062 .\" Western Washington University .\" Bellingham, WA 98226-9062 .\" .\" .TH bc 1 .\" "Command Manual" v1.02 "Feb 3, 1992" .SH NAME bc - An arbitrary precision calculator language .SH SYNTAX \fBbc\fR [ \fB-lws\fR ] [ \fI file ...\fR ] .SH VERSION This man page documents GNU bc version 1.02. .SH DESCRIPTION \fBbc\fR is a language that supports arbitrary precision numbers with interactive execution of statements. There are some similarities in the syntax to the C programming language. A standard math library is available by command line option. If requested, the math library is defined before processing any files. \fBbc\fR starts by processing code from all the files listed on the command line in the order listed. After all files have been processed, \fBbc\fR reads from the standard input. All code is executed as it is read. (If a file contains a command to halt the processor, \fBbc\fR will never read from the standard input.) .PP This version of \fBbc\fR contains several extensions beyond traditional \fBbc\fR implementations and the POSIX draft standard. Command line options can cause these extensions to print a warning or to be rejected. This document describes the language accepted by this processor. Extensions will be identified as such. .SS OPTIONS .IP -l Define the standard math library. .IP -w Give warnings for extensions to POSIX \fBbc\fR. .IP -s Process exactly the POSIX \fBbc\fR language. .SS NUMBERS The most basic element in \fBbc\fR is the number. Numbers are arbitrary precision numbers. This precision is both in the integer part and the fractional part. All numbers are represented internally in decimal and all computation is done in decimal. (This version truncates results from divide and multiply operations.) There are two attributes of numbers, the length and the scale. The length is the total number of significant decimal digits in a number and the scale is the total number of decimal digits after the decimal point. For example: .nf .RS .000001 has a length of 6 and scale of 6. 1935.000 has a length of 7 and a scale of 3. .RE .fi .SS VARIABLES Numbers are stored in two types of variables, simple variables and arrays. Both simple variables and array variables are named. Names begin with a letter followed by any number of letters, digits and underscores. All letters must be lower case. (Full alpha-numeric names are an extension. In POSIX \fBbc\fR all names are a single lower case letter.) The type of variable is clear by the context because all array variable names will be followed by brackets ([]). .PP There are four special variables, \fBscale, ibase, obase,\fR and \fBlast\fR. \fBscale\fR defines how some operations use digits after the decimal point. The default value of \fBscale\fR is 0. \fBibase\fR and \fBobase\fR define the conversion base for input and output numbers. The default for both input and output is base 10. \fBlast\fR (an extension) is a variable that has the value of the last printed number. These will be discussed in further detail where appropriate. All of these variables may have values assigned to them as well as used in expressions. .SS COMMENTS Comments in \fBbc\fR start with the characters \fB/*\fR and end with the characters \fB*/\fR. Comments may start anywhere and appear as a single space in the input. (This causes comments to delimit other input items. For example, a comment can not be found in the middle of a variable name.) Comments include any newlines (end of line) between the start and the end of the comment. .SS EXPRESSIONS The numbers are manipulated by expressions and statements. Since the language was designed to be interactive, statements and expressions are executed as soon as possible. There is no "main" program. Instead, code is executed as it is encountered. (Functions, discussed in detail later, are defined when encountered.) .PP A simple expression is just a constant. \fBbc\fR converts constants into internal decimal numbers using the current input base, specified by the variable \fBibase\fR. (There is an exception in functions.) The legal values of \fBibase\fR are 2 through 16 (F). Assigning a value outside this range to \fBibase\fR will result in a value of 2 or 16. Input numbers may contain the characters 0-9 and A-F. (Note: They must be capitals. Lower case letters are variable names.) Single digit numbers always have the value of the digit regardless of the value of \fBibase\fR. (i.e. A = 10.) For multi-digit numbers, \fBbc\fR changes all input digits greater or equal to ibase to the value of \fBibase\fR-1. This makes the number \fBFFF\fR always be the largest 3 digit number of the input base. .PP Full expressions are similar to many other high level languages. Since there is only one kind of number, there are no rules for mixing types. Instead, there are rules on the scale of expressions. Every expression has a scale. This is derived from the scale of original numbers, the operation performed and in many cases, the value of the variable \fBscale\fR. Legal values of the variable \fBscale\fR are 0 to the maximum number representable by a C integer. .PP In the following descriptions of legal expressions, "expr" refers to a complete expression and "var" refers to a simple or an array variable. A simple variable is just a .RS \fIname\fR .RE and an array variable is specified as .RS \fIname\fR[\fIexpr\fR] .RE Unless specifically mentioned the scale of the result is the maximum scale of the expressions involved. .IP "- expr" The result is the negation of the expression. .IP "++ var" The variable is incremented by one and the new value is the result of the expression. .IP "-- var" The variable is decremented by one and the new value is the result of the expression. .IP "var ++" The result of the expression is the value of the variable and then the variable is incremented by one. .IP "var --" The result of the expression is the value of the variable and then the variable is decremented by one. .IP "expr + expr" The result of the expression is the sum of the two expressions. .IP "expr - expr" The result of the expression is the difference of the two expressions. .IP "expr * expr" The result of the expression is the product of the two expressions. .IP "expr / expr" The result of the expression is the quotient of the two expressions. The scale of the result is the value of the variable \fBscale\fR. .IP "expr % expr" The result of the expression is the "remainder" and it is computed in the following way. To compute a%b, first a/b is computed to \fBscale\fR digits. That result is used to compute a-(a/b)*b to the scale of the maximum of \fBscale\fR+scale(b) and scale(a). If \fBscale\fR is set to zero and both expressions are integers this expression is the integer remainder function. .IP "expr ^ expr" The result of the expression is the value of the first raised to the second. The second expression must be an integer. (If the second expression is not an integer, a warning is generated and the expression is truncated to get an integer value.) The scale of the result is \fBscale\fR if the exponent is negative. If the exponent is positive the scale of the result is the minimum of the scale of the first expression times the value of the exponent and the maximum of \fBscale\fR and the scale of the first expression. (e.g. scale(a^b) = min(scale(a)*b, max( \fBscale,\fR scale(a))).) It should be noted that expr^0 will always return the value of 1. .IP "( expr )" This alters the standard precedence to force the evaluation of the expression. .IP "var = expr" The variable is assigned the value of the expression. .IP "var = expr" This is equivalent to "var = var expr" with the exception that the "var" part is evaluated only once. This can make a difference if "var" is an array. .PP Relational expressions are a special kind of expression that always evaluate to 0 or 1, 0 if the relation is false and 1 if the relation is true. These may appear in any legal expression. (POSIX bc requires that relational expressions are used only in if, while, and for statements and that only one relational test may be done in them.) The relational operators are .IP "expr1 < expr2" The result is 1 if expr1 is strictly less than expr2. .IP "expr1 <= expr2" The result is 1 if expr1 is less than or equal to expr2. .IP "expr1 > expr2" The result is 1 if expr1 is strictly greater than expr2. .IP "expr1 >= expr2" The result is 1 if expr1 is greater than or equal to expr2. .IP "expr1 == expr2" The result is 1 if expr1 is equal to expr2. .IP "expr1 != expr2" The result is 1 if expr1 is not equal to expr2. .PP Boolean operations are also legal. (POSIX \fBbc\fR does NOT have boolean operations). The result of all boolean operations are 0 and 1 (for false and true) as in relational expressions. The boolean operators are: .IP "!expr" The result is 1 if expr is 0. .IP "expr && expr" The result is 1 if both expressions are non-zero. .IP "expr || expr" The result is 1 if either expression is non-zero. .PP The expression precedence is as follows: (lowest to highest) .nf .RS || operator, left associative && operator, left associative ! operator, nonassociative Relational operators, left associative Assignment operator, right associative + and - operators, left associative *, / and % operators, left associative ^ operator, right associative unary - operator, nonassociative ++ and -- operators, nonassociative .RE .fi .PP This precedence was chosen so that POSIX compliant \fBbc\fR programs will run correctly. This will cause the use of the relational and logical operators to have some unusual behavior when used with assignment expressions. Consider the expression: .RS a = 3 < 5 .RE .PP Most C programmers would assume this would assign the result of "3 < 5" (the value 1) to the variable "a". What this does in \fBbc\fR is assign the value 3 to the variable "a" and then compare 3 to 5. It is best to use parenthesis when using relational and logical operators with the assignment operators. .PP There are a few more special expressions that are provided in \fBbc\fR. These have to do with user defined functions and standard functions. They all appear as "\fIname\fB(\fIparameters\fB)\fR". See the section on functions for user defined functions. The standard functions are: .IP "length ( expression )" The value of the length function is the number of significant digits in the expression. .IP "read ( )" The read function (an extension) will read a number from the standard input, regardless of where the function occurs. Beware, this can cause problems with the mixing of data and program in the standard input. The best use for this function is in a previously written program that needs input from the user, but never allows program code to be input from the user. The value of the read function is the number read from the standard input using the current value of the variable \fBibase\fR for the conversion base. .IP "scale ( expression )" The value of the scale function is the number of digits after the decimal point in the expression. .IP "sqrt ( expression )" The value of the sqrt function is the square root of the expression. If the expression is negative, a run time error is generated. .SS STATEMENTS Statements (as in most algebraic languages) provide the sequencing of expression evaluation. In \fBbc\fR statements are executed "as soon as possible." Execution happens when a newline in encountered and there is one or more complete statements. Due to this immediate execution, newlines are very important in \fBbc\fR. In fact, both a semicolon and a newline are used as statement separators. An improperly placed newline will cause a syntax error. Because newlines are statement separators, it is possible to hide a newline by using the backslash character. The sequence "\e", where is the newline appears to \fBbc\fR as whitespace instead of a newline. A statement list is a series of statements separated by semicolons and newlines. The following is a list of \fBbc\fR statements and what they do: (Things enclosed in brackets ([]) are optional parts of the statement.) .IP "expression" This statement does one of two things. If the expression starts with " ...", it is considered to be an assignment statement. If the expression is not an assignment statement, the expression is evaluated and printed to the output. After the number is printed, a newline is printed. For example, "a=1" is an assignment statement and "(a=1)" is an expression that has an embedded assignment. All numbers that are printed are printed in the base specified by the variable \fBobase\fR. The legal values for \fB obase\fR are 2 through BC_BASE_MAX. (See the section LIMITS.) For bases 2 through 16, the usual method of writing numbers is used. For bases greater than 16, \fBbc\fR uses a multi-character digit method of printing the numbers where each higher base digit is printed as a base 10 number. The multi-character digits are separated by spaces. Each digit contains the number of characters required to represent the base ten value of "obase-1". Since numbers are of arbitrary precision, some numbers may not be printable on a single output line. These long numbers will be split across lines using the "\e" as the last character on a line. The maximum number of characters printed per line is 70. Due to the interactive nature of \fBbc\fR printing a number cause the side effect of assigning the printed value the the special variable \fBlast\fR. This allows the user to recover the last value printed without having to retype the expression that printed the number. Assigning to \fBlast\fR is legal and will overwrite the last printed value with the assigned value. The newly assigned value will remain until the next number is printed or another value is assigned to \fBlast\fR. .IP "string" The string is printed to the output. Strings start with a double quote character and contain all characters until the next double quote character. All characters are take literally, including any newline. No newline character is printed after the string. .IP "\fBprint\fR list" The print statement (an extension) provides another method of output. The "list" is a list of strings and expressions separated by commas. Each string or expression is printed in the order of the list. No terminating newline is printed. Expressions are evaluated and their value is printed and assigned the the variable \fBlast\fR. Strings in the print statement are printed to the output and may contain special characters. Special characters start with the backslash character (\e). The special characters recognized by \fBbc\fR are "b" (bell), "f" (form feed), "n" (newline), "r" (carriage return), "t" (tab), and "\e" (backslash). Any other character following the backslash will be ignored. This still does not allow the double quote character to be part of any string. .IP "{ statement_list }" This is the compound statement. It allows multiple statements to be grouped together for execution. .IP "\fBif\fR ( expression ) \fBthen\fR statement1 [\fBelse\fR statement2]" The if statement evaluates the expression and executes statement1 or statement2 depending on the value of the expression. If the expression is non-zero, statement1 is executed. If statement2 is present and the value of the expression is 0, then statement2 is executed. (The else clause is an extension.) .IP "\fBwhile\fR ( expression ) statement" The while statement will execute the statement while the expression is non-zero. It evaluates the expression before each execution of the statement. Termination of the loop is caused by a zero expression value or the execution of a break statement. .IP "\fBfor\fR ( [expression1] ; [expression2] ; [expression3] ) statement" The for statement controls repeated execution of the statement. Expression1 is evaluated before the loop. Expression2 is evaluated before each execution of the statement. If it is non-zero, the statement is evaluated. If it is zero, the loop is terminated. After each execution of the statement, expression3 is evaluated before the reevaluation of expression2. If expression1 or expression3 are missing, nothing is evaluated at the point they would be evaluated. If expression2 is missing, it is the same as substituting the value 1 for expression2. (The optional expressions are an extension. POSIX \fBbc\fR requires all three expressions.) The following is equivalent code for the for statement: .nf .RS expression1; while (expression2) { statement; expression3; } .RE .fi .IP "\fBbreak\fR" This statement causes a forced exit of the most recent enclosing while statement or for statement. .IP "\fBcontinue\fR" The continue statement (an extension) causes the most recent enclosing for statement to start the next iteration. .IP "\fBhalt\fR" The halt statement (an extension) is an executed statement that causes the \fBbc\fR processor to quit only when it is executed. For example, "if (0 == 1) halt" will not cause \fBbc\fR to terminate because the halt is not executed. .IP "\fBreturn\fR" Return the value 0 from a function. (See the section on functions.) .IP "\fBreturn\fR ( expression )" Return the value of the expression from a function. (See the section on functions.) .SS PSEUDO STATEMENTS These statements are not statements in the traditional sense. They are not executed statements. Their function is performed at "compile" time. .IP "\fBlimits\fR" Print the local limits enforced by the local version of \fBbc\fR. This is an extension. .IP "\fBquit\fR" When the quit statement is read, the \fBbc\fR processor is terminated, regardless of where the quit statement is found. For example, "if (0 == 1) quit" will cause \fBbc\fR to terminate. .IP "\fBwarranty\fR" Print a longer warranty notice. This is an extension. .SS FUNCTIONS Functions provide a method of defining a computation that can be executed later. Functions in .B bc always compute a value and return it to the caller. Function definitions are "dynamic" in the sense that a function is undefined until a definition is encountered in the input. That definition is then used until another definition function for the same name is encountered. The new definition then replaces the older definition. A function is defined as follows: .nf .RS \fBdefine \fIname \fB( \fIparameters \fB) { \fInewline \fI auto_list statement_list \fB}\fR .RE .fi A function call is just an expression of the form "\fIname\fB(\fIparameters\fB)\fR". .PP Parameters are numbers or arrays (an extension). In the function definition, zero or more parameters are defined by listing their names separated by commas. Numbers are only call by value parameters. Arrays are only call by variable. Arrays are specified in the parameter definition by the notation "\fIname\fB[]\fR". In the function call, actual parameters are full expressions for number parameters. The same notation is used for passing arrays as for defining array parameters. The named array is passed by variable to the function. Since function definitions are dynamic, parameter numbers and types are checked when a function is called. Any mismatch in number or types of parameters will cause a runtime error. A runtime error will also occur for the call to an undefined function. .PP The \fIauto_list\fR is an optional list of variables that are for "local" use. The syntax of the auto list (if present) is "\fBauto \fIname\fR, ... ;". (The semicolon is optional.) Each \fIname\fR is the name of an auto variable. Arrays may be specified by using the same notation as used in parameters. These variables have their values pushed onto a stack at the start of the function. The variables are then initialized to zero and used throughout the execution of the function. At function exit, these variables are popped so that the original value (at the time of the function call) of these variables are restored. The parameters are really auto variables that are initialized to a value provided in the function call. Auto variables are different than traditional local variables in the fact that if function A calls function B, B may access function A's auto variables by just using the same name, unless function B has called them auto variables. Due to the fact that auto variables and parameters are pushed onto a stack, \fBbc\fR supports recursive functions. .PP The function body is a list of \fBbc\fR statements. Again, statements are separated by semicolons or newlines. Return statements cause the termination of a function and the return of a value. There are two versions of the return statement. The first form, "\fBreturn\fR", returns the value 0 to the calling expression. The second form, "\fBreturn ( \fIexpression \fB)\fR", computes the value of the expression and returns that value to the calling expression. There is an implied "\fBreturn (0)\fR" at the end of every function. This allows a function to terminate and return 0 without an explicit return statement. .PP Functions also change the usage of the variable \fBibase\fR. All constants in the function body will be converted using the value of \fBibase\fR at the time of the function call. Changes of \fBibase\fR will be ignored during the execution of the function except for the standard function \fBread\fR, which will always use the current value of \fBibase\fR for conversion of numbers. .SS MATH LIBRARY If \fBbc\fR is invoked with the \fB-l\fR option, a math library is preloaded and the default scale is set to 20. The math functions will calculate their results to the scale set at the time of their call. The math library defines the following functions: .IP "s (\fIx\fR)" The sine of x in radians. .IP "c (\fIx\fR)" The cosine of x in radians. .IP "a (\fIx\fR)" The arctangent of x. .IP "l (\fIx\fR)" The natural logarithm of x. .IP "e (\fIx\fR)" The exponential function of raising e to the value x. .IP "j (\fIn,x\fR)" The bessel function of integer order n of x. .SS EXAMPLES In /bin/sh, the following will assign the value of "pi" to the shell variable \fBpi\fR. .RS \fB pi=$(echo "scale=10; 4*a(1)" | bc -l) \fR .RE .PP The following is the definition of the exponential function used in the math library. This function is written in POSIX \fBbc\fR. .nf .RS \fB scale = 20 /* Uses the fact that e^x = (e^(x/2))^2 When x is small enough, we use the series: e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Check the sign of x. */ if (x<0) { m = 1 x = -x } /* Precondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } \fR .RE .fi .PP The following is code that uses the extended features of \fBbc\fR to implement a simple program for calculating checkbook balances. This program is best kept in a file so that it can be used many times without having to retype it at every use. .nf .RS \fB scale=2 print "\enCheck book program!\en" print " Remember, deposits are negative transactions.\en" print " Exit by a 0 transaction.\en\en" print "Initial balance? "; bal = read() bal /= 1 print "\en" while (1) { "current balance = "; bal "transaction? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit \fR .RE .fi .PP The following is the definition of the recursive factorial function. .nf .RS \fB define f (x) { if (x <= 1) return (1); return (f(x-1) * x); } \fR .RE .fi .SS DIFFERENCES This version of .B bc was implemented from the POSIX P1003.2/D11 draft and contains several differences and extensions relative to the draft and traditional implementations. It is not implemented in the traditional way using .I dc(1). This version is a single process which parses and runs a byte code translation of the program. There is an "undocumented" option (-c) that causes the program to output the byte code to the standard output instead of running it. It was mainly used for debugging the parser and preparing the math library. .PP A major source of differences is extensions, where a feature is extended to add more functionality and additions, where new features are added. The following is the list of differences and extensions. .IP LANG 11n This version does not conform to the POSIX standard in the processing of the LANG environment variable and all environment variables starting with LC_. .IP names Traditional and POSIX .B bc have single letter names for functions, variables and arrays. They have been extended to be multi-character names that start with a letter and may contain letters, numbers and the underscore character. .IP Strings Strings are not allowed to contain NUL characters. POSIX says all characters must be included in strings. .IP last POSIX \fBbc\fR does not have a \fBlast\fR variable. Some implementations of \fBbc\fR use the period (.) in a similar way. .IP comparisons POSIX \fBbc\fR allows comparisons only in the if statement, the while statement, and the second expression of the for statement. Also, only one relational operation is allowed in each of those statements. .IP "if statement, else clause" POSIX \fBbc\fR does not have an else clause. .IP "for statement" POSIX \fBbc\fR requires all expressions to be present in the for statement. .IP "&&, ||, !" POSIX \fBbc\fR does not have the logical operators. .IP "read function" POSIX \fBbc\fR does not have a read function. .IP "print statement" POSIX \fBbc\fR does not have a print statement . .IP "continue statement" POSIX \fBbc\fR does not have a continue statement. .IP "array parameters" POSIX \fBbc\fR does not have array parameters. Other implementations of \fBbc\fR may have call by value array parameters. .IP "=+, =-, =*, =/, =%, =^" POSIX \fBbc\fR does not require these "old style" assignment operators to be defined. This version may allow these "old style" assignments. Use the limits statement to see if the installed version supports them. If it does support the "old style" assignment operators, the statement "a =- 1" will decrement \fBa\fR by 1 instead of setting \fBa\fR to the value -1. .IP "spaces in numbers" Other implementations of \fBbc\fR allow spaces in numbers. For example, "x=1 3" would assign the value 13 to the variable x. The same statement would cause a syntax error in this version of \fBbc\fR. .IP "errors and execution" This implementation varies from other implementations in terms of what code will be executed when syntax and other errors are found in the program. If a syntax error is found in a function definition, error recovery tries to find the beginning of a statement and continue to parse the function. Once a syntax error is found in the function, the function will not be callable and becomes undefined. Syntax errors in the interactive execution code will invalidate the current execution block. The execution block is terminated by an end of line that appears after a complete sequence of statements. For example, .nf .RS a = 1 b = 2 .RE .fi has two execution blocks and .nf .RS { a = 1 b = 2 } .RE .fi has one execution block. Any runtime error will terminate the execution of the current execution block. A runtime warning will not terminate the current execution block. .IP "Interrupts" During an interactive session, the SIGINT signal (usually generated by the control-C character from the terminal) will cause execution of the current execution block to be interrupted. It will display a "runtime" error indicating which function was interrupted. After all runtime structures have been cleaned up, a message will be printed to notify the user that \fBbc\fR is ready for more input. All previously defined functions remain defined and the value of all non-auto variables are the value at the point of interruption. All auto variables and function parameters are removed during the clean up process. During a non-interactive session, the SIGINT signal will terminate the entire run of \fBbc\fR. .SS LIMITS The following are the limits currently in place for this .B bc processor. Some of them may have been changed by an installation. Use the limits statement to see the actual values. .IP BC_BASE_MAX The maximum output base is currently set at 999. The maximum input base is 16. .IP BC_DIM_MAX This is currently an arbitrary limit of 65535 as distributed. Your installation may be different. .IP BC_SCALE_MAX The number of digits after the decimal point is limited to INT_MAX digits. Also, the number of digits before the decimal point is limited to INT_MAX digits. .IP BC_STRING_MAX The limit on the number of characters in a string is INT_MAX characters. .IP exponent The value of the exponent in the raise operation (^) is limited to LONG_MAX. .IP multiply The multiply routine may yield incorrect results if a number has more than LONG_MAX / 90 total digits. For 32 bit longs, this number is 23,860,929 digits. .IP "code size" Each function and the "main" program are limited to 10240 bytes of compiled byte code each. This limit (BC_MAX_SEGS) can be easily changed to have more than 10 segments of 1024 bytes. .IP "variable names" The current limit on the number of unique names is 32767 for each of simple variables, arrays and functions. .SH FILES In most installations, \fBbc\fR is completely self-contained. Where executable size is of importance or the C compiler does not deal with very long strings, \fBbc\fR will read the standard math library from the file /usr/local/lib/libmath.b. (The actual location may vary. It may be /lib/libmath.b.) .SH DIAGNOSTICS If any file on the command line can not be opened, \fBbc\fR will report that the file is unavailable and terminate. Also, there are compile and run time diagnostics that should be self-explanatory. .SH BUGS Error recovery is not very good yet. .SH AUTHOR .nf Philip A. Nelson phil@cs.wwu.edu .fi .SH ACKNOWLEDGEMENTS The author would like to thank Steve Sommars (sesv@iwtsf.att.com) for his extensive help in testing the implementation. Many great suggestions were given. This is a much better product due to his involvement. .\" manual page for bsfilt(1) .\" .\" .\" Copyright (c) 1991 Purdue University Research Foundation, .\" West Lafayette, Indiana 47907. All rights reserved. .\" .\" Written by Victor A. Abell , Purdue .\" University Computing Center. Not derived from licensed software; .\" derived from awf(1) by Henry Spencer of the University of Toronto. .\" .\" Permission is granted to anyone to use this software for any .\" purpose on any computer system, and to alter it and redistribute .\" it freely, subject to the following restrictions: .\" .\" 1. The author is not responsible for any consequences of use of .\" this software, even if they arise from flaws in it. .\" .\" 2. The origin of this software must not be misrepresented, either .\" by explicit claim or by omission. Credits must appear in the .\" documentation. .\" .\" 3. Altered versions must be plainly marked as such, and must not .\" be misrepresented as being the original software. Credits must .\" appear in the documentation. .\" .\" 4. This notice may not be removed or altered. .\" .TH BSFILT 1 "February, 1991" .BY "Purdue University" .SH NAME bsfilt, colcrt \- a colcrt-like backspace filter .SH SYNOPSIS .B bsfilt [ .B - ] [ .B -U ] [ file ... ] .SH DESCRIPTION .I Bsfilt filters backspace sequences from the input \fIfile\fR(s) (standard input if none) in an approximation of .IR colcrt (1). Both the backspace and the character it returns to are removed, unless they form an underline sequence. Underline sequences are treated according to the settings of the .B \- and .B \-U options. .SH OPTIONS .TP .B \- specifies that no underlining of any kind is to be propagated. Without this option or the .B \-U option, .I bsfilt approximates underlining with minus signs (`-') in following lines. .TP .B \-U specifies that underlining with underscore (`_') and backspace (`\b') character sequences is permitted. .SH SEE ALSO cawf(1), colcrt(1) and nroff(1). .SH DIAGNOSTICS Diagnostic messages are delivered to the standard error file. .SH HISTORY Vic Abell of Purdue University wrote .I bsfilt to have a backspace filter for .IR cawf (1) that is independent of licensed source code. .SH BUGS The maximum length of a line that can be underlined with minus signs is fixed. .LP .I Bsfilt does not examine the characters that are being overprinted via backspace operations. Thus, overprinting that is intended to form a new character from several different ones is ineffective and only the last character of the sequence is propagated \- e. g., ``o^H+'', intended to look like a bullet, is reduced to `+'. .TH ENV 1 .SH NAME env \- set environment for command .SH SYNOPSIS .B env .RB [ \-ia ] .RI [ name\fB=\fIvalue "] ..." .RI [ utility .RI [ argument "...]]" .SH DESCRIPTION .B Env modifies its environment according to the .IB name = value arguments, and executes .I utility with the given arguments with the modified environment. .PP If no utility is specified then the modified environment is printed as .IB name = value strings, one per line. .SH OPTIONS .TP .B \-i Use exactly the environment specified by the arguments; the inherited environment is ignored. .TP .B \-a Specify all arguments for the utility, i.e. the first of the arguments is used as .BR "argv[0]" , the program name. Normally the program name is .I utility itself. .SH ENVIRONMENT .TP 8n .B PATH The path used to find utility. It is as modified by .BR env , i.e. .B not the inherited .BR PATH . .SH "SEE ALSO" .BR sh (1), .BR execvp (3), .BR environ (5). .SH DIAGNOSTICS The return code is .B 0 after successfully printing the environment, .B 1 on an error within .BR env , .B 126 if the .I utility could not be executed, or .B 127 if .I utility could not be found. Appropriate diagnostic messages are printed on standard error. If .I utility can be executed then it replaces .BR env , so the return code is then the return code of .IR utility . .SH NOTES .B Env is only useful with options or without arguments. Otherwise the shell can do exactly what .B env can do, simply omit the word "env" on the command line. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CAL 1 .SH NAME cal \- print a calendar .SH SYNOPSIS \fBcal\fR [\fImonth\fR] \fIyear\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "cal 3 1992" "Print March 1992" .SH DESCRIPTION .PP \fICal\fR prints a calendar for a month or year. The year can be between 1 and 9999. Note that the year 91 is not a synonym for 1991, but is itself a valid year about 19 centuries ago. The calendar produced is the one used by England and her colonies. Try Sept. 1752, Feb 1900, and Feb 2000. If you do not understand what is going on, look up \fICalendar, Gregorian\fR in a good encyclopedia. .TH CALENDAR 1 .SH NAME calendar \- reminder service .SH SYNOPSIS \fBcalendar [\fB\-\fR] [\fB\-r\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-" "Work for every user and send mail to him" .FL "\-r" "Restrict multiple execution on the same day" .SH EXAMPLES .EX "calendar" "Check \fIcalendar\fR file in current directory" .EX "calendar" "Normary used under the control of cron(8)" .EX "calendar \-r" " Normary used in /etc/rc file" .SH DESCRIPTION .PP Basically \fIcalendar\fR program consults the file \fIcalendar\fR in the current directory and display lines which contain today's or tomorrow's date. Month-day formats such as '12/25', 'Dec. 25', 'december 25', '*/25', '12/*', '*/*' are recognized. The asterisk means 'all' days or 'all' months. On weekends 'tomorrow' extends through next Monday without any consideration about holidays. To prevent ambiguity, the formats '25 Dec.' and '25/12' are not recognized. .PP When an argument \fB\-\fR is present, \fIcalendar\fR works for all users with a file \fIcalendar\fR in their login directories and sends them mail. Normally this is done daily under the control of \fIcron\fR. .PP The \fB\-r\fR option does its the same job as \fB\-\fR option, but touches the \fIcalendar\fR to prevents further access on the same day. Normally this is done in the \fI/etc/rc\fR file on a machine which may be booted several times in one day. .SH "SEE ALSO" .BR cron (8). .TH CAT 1 .SH NAME cat \- concatenate files and write them to stdout .SH SYNOPSIS \fBcat\fR [\fB\-u\fR]\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-u" "Unbuffered output" .SH EXAMPLES .EX "cat file" "Display file on the terminal" .EX "cat file1 file2 | lp" "Concatenate 2 files and print result" .SH DESCRIPTION .PP .I Cat concatenates its input files and copies the result to \fIstdout\fR. If no input file is named, or \- is encountered as a file name, standard input is used. Output is buffered in 512 byte blocks unless the .B \-u flag is given. If you just want to copy a file, \fIcp\fR should be used since it is faster. .SH "SEE ALSO" .BR cp (1). .\" manual page for cawf(1) .\" .\" .\" Copyright (c) 1991 Purdue University Research Foundation, .\" West Lafayette, Indiana 47907. All rights reserved. .\" .\" Written by Victor A. Abell , Purdue .\" University Computing Center. Not derived from licensed software; .\" derived from awf(1) by Henry Spencer of the University of Toronto. .\" .\" Permission is granted to anyone to use this software for any .\" purpose on any computer system, and to alter it and redistribute .\" it freely, subject to the following restrictions: .\" .\" 1. The author is not responsible for any consequences of use of .\" this software, even if they arise from flaws in it. .\" .\" 2. The origin of this software must not be misrepresented, either .\" by explicit claim or by omission. Credits must appear in the .\" documentation. .\" .\" 3. Altered versions must be plainly marked as such, and must not .\" be misrepresented as being the original software. Credits must .\" appear in the documentation. .\" .\" 4. This notice may not be removed or altered. .\" .\" Some of the stuff in this file is a bit contorted, because it's also .\" the regression-test input. .nr ES 5n .de ES .PP .in +\\n(ESu .nf .. .de EE .in -\\n(ESu .fi .PP .. .de PT .ie \\n(.$>1 .TP "\\$2" .el .TP .ie !'\\$1'' \\$1 .el \(bu .. .ds Nr \fInroff\fR .TH CAWF 1 "November, 1992" .BY "Purdue University" .SH NAME cawf, nroff \- C version of the nroff-like, Amazingly Workable (text) Formatter .SH SYNOPSIS .B cawf .RB [ \-c\c .IR config ] .RB [ \-d\c .IR device ] .RB [ \-e ] .RB [ \-f\c .IR font ] .RB [ \-h ] .RB [ \-m\c .IR acros ] .RI [ file " ...]" .SH DESCRIPTION .I Cawf formats the text from the input \fIfile\fR(s) (standard input if none) in an approximation of \*(Nr. It comes closest to duplicating \*(Nr's .B man or .B ms macro package styles. It has some limited support for \*(Nr's .B me macros. .SH OPTIONS Options must precede file names. .TP .BI \-c config defines an alternate path to the device configuration file. Normally the device configuration file is found in .I device.cf in the .I cawf library (see the .B FILES section). .IP The device configuration file contains device character strings for selecting fonts and the bold or italic type faces. See the .B DEVICES section for more information. .TP .BI \-d device specifies the name of the output device. There are three built\-in devices \- ANSI, NONE and NORMAL \- and other devices may be defined in the device configuration file. See the .B DEVICES section for more information. .IP The NORMAL device is the default. .TP .B \-e directs .I cawf to issue an eject (FF or ^L) after the last page. .TP .BI \-f font specifies the one font for the device, declared with the .BI \-d device option, that is to be used for the entire document. .I Font must match a font associated with the device's stanza in the device configuration file. See the .B DEVICES section for more information. .IP No .I font may be specified for the built\-in devices ANSI, NONE or NORMAL. .TP .B \-h requests a help display. .TP .BI \-m acro specifies the macro file to be used. The standard .I cawf distribution supplies macro files to support ``\-man'', ``\-me'' or ``\-ms''. .I Cawf finds a macro file by constructing its name from `m', .I acro and .B .mac \- e. g., .BI \-m an is converted to .BR man.mac . The default directory for macro files is defined when .I cawf is compiled; it's \fIC:\\SYS\\LIB\\CAWF\fP in the MS\-DOS environment; .I /usr/lib/cawf in the UNIX environment. .TP file ... are the names of files containing \*(Nr source text. .SH NROFF COMPATIBILITY .I Cawf accepts the following raw \*(Nr requests: .ES \&.\e" .ad .bp .br .ce .de .di .ds \&.el .fi .fl .ft .i0 .ie .if .in \&.it .lg .li .ll .ls .na .ne .nf \&.nr .ns .pl .po .ps .rm .rn .rr \&.rs .so .sp .ta .ti .tm .tr .EE and the following in-text codes: .ES \e$ \e% \e* \e" \ec \ef \eh \ek \en \es \ew .EE plus the full list of \*(Nr/\c .I troff special characters in the original V7 \fItroff\fR manual. .PP Many restrictions are present; the behavior in general is a subset of \*(Nr's. Of particular note are the following: .IP \(bu 2 The fully supported nroff request control character is the period. There is limited support for the non\-break, acute accent control character. .PT Point sizes do not exist; .B .ps is ignored. .PT Special vertical spacing \- the .B .vs request included \- is ignored. .PT Conditionals cover only the numeric comparisons >, =, <, >= and <= on .BR \en(.$ ; string com\%par\%isons between a macro parameter and a literal; .B n (always true); and .BR t (always false). Only single line input is accepted from conditionals; multi\-line input \- e.g., \\(\fIanything\fP\\) \- is not supported. .PT The handling of strings is generally primitive. .IP \(bu Horizontal motion via .B \eh must be supplied with a number register interpolation and must be positive - e. g., .BR \ew\en(NN , where the value in NN is >= 0. .IP \(bu The .B \ek function is reliable only after TAB characters, so it is useful only for measuring table positions. .IP \(bu The .B .di request only turns output on and off \- any macro name is ignored. .IP \(bu Expressions - e. g., .B .sp - are reasonably general, but the .BR | , .BR & , and .BR :\& operators do not exist, there must be white space between the end of the \*(Nr function and the beginning of the expression, and .B \ew requires that quote (') be used as the delimiters. .B \ew counts the characters inside the quotes and scales the result in ens, so that, for example, \ew'\e(bu' equals 4n, and \ew'\e(bu'/1n equals 4. .PT The only acceptable count for the .B .it request is one, and it is effective only with .BR man , .B me or .B ms macros. .PT The default scaling factor is `v' for the .BR .ne , .BR .sp , and .B .pl raw \*(Nr requests; it is `u' for .BR .nr ; and `n' for .BR .in , .BR .ll , .BR .ls , .BR .po , .BR .ta and .BR .ti . (A different scaling factor may be specified with a trailing character.) .PT Some obsolete or meaningless requests \- .BR .i0 , .B .lg and .B .li \&\- are silently ignored. .P White space at the beginning of lines, and embedded white space within lines is dealt with properly. Sentence terminators at ends of lines are understood to imply extra space afterward in filled lines. Tabs are im\%plemented crudely and not exactly, although usually they work as expected. Hyphenation is done only at explicit hyphens, em-dashes, and \*(Nr discretionary hyphens. By default bold and italic characters are emulated with backspacing and overprinting, but the .B \-d and .B \-f options, combined with the contents of the device configuration file, may be used to generate special codes for bold and italic characters. (See the .B DEVICES section for more information.) .SH "MAN MACROS" The .B man macro set replicates the full V7 manual macros, plus a few semi-random oddballs. The full list is: .ES \&.AT .B .BI .BR .BY .DE .DT .HP \&.I .IB .IP .IR .IX .LP .NB .P \&.PD .PP .RB .RE .RI .RS .SH .SM \&.SS .TH .TP .UC .EE .B .BY and .B .NB each take a single string argument (respectively, an indi\%cation of authorship and a note about the status of the manual page) and arrange to place it in the page footer. .B .AT and .B .IX do nothing. .SH "ME MACROS" The .B me macro subset has been derived from the .I cawf .B ms macros by Chet Creider . It includes: .ES \&.(l .(q .)l .)q .b .bu .i .ip \&.lp .np .pp .r .sh .sm .u .uh .EE The .(l C and .(l L options are supported. In addition, the .AB, .AE, .AI, .AU, .DA, .ND, .TL and .UX macros have been retained from the .B ms set, and the .XP macro has been borrowed from the Berkeley additions to the .B ms macro set. .SH "MS MACROS" The .B ms macro set is a substantial subset of the V7 manuscript macros. The macros are: .ES \&.AB .AE .AI .AU .B .CD .DA .DE \&.DS .I .ID .IP .LD .LG .LP .ND \&.NH .NL .PP .QE .QP .QS .R .RE \&.RP .RS .SH .SM .TL .TP .UL .UX .EE Size changes are recognized but ignored, as are .B .RP and .BR .ND . .B .UL just prints its argument in italics. .BR .DS / .DE does not do a keep, nor do any of the other macros that normally imply keeps. .LP The .B DY string varia ble is available. The .BR PD , .BR PI , and .BR LL number registers exist and can be changed. .SH "HEADERS AND FOOTERS" .I Cawf allows the placement of text into the five line header and footer sections from the .BR LH , .BR CH , .BR RF , .BR LF , .BR CF , and .B RF string variables, via the control of the .B .^b request: .LP .ta \w'.^b HF 0'u+3n .nf \&.^b fh 1 enables header string placement on the first page \&.^b fh 0 disables header string placement on the first page \&.^b HF 1 enables header/footer string placement \&.^b HF 0 disables header/footer string placement .fi .LP There are appropriate .B .^b requests in the distribution .BR man , .B me and .B ms macro files. (The .B me and .B ms macro files use another .B .^b request, \fB.^b NH\fP, to enable numbered header processing.) .SH OUTPUT The default output format supported by .IR cawf , in its distributed form, is that appropriate to a dumb terminal, using overprinting for italics (via underlining) and bold. The \*(Nr special characters are printed as some vague approximation (it's sometimes extremely vague) to their correct appearance. .PP One part of .IR cawf 's knowledge of the output device, related to the formation of characters, is established by a device file, which is read before the user's input. The search for it begins in .IR cawf 's library directory, under the name \fIterm\fP.\fBdev\fP (where \fIterm\fR is the value of the TERM environment variable). Failing to find that, .I cawf searches for .BR dumb.dev . (See the .B FILES section for a description of the path to .IR cawf 's library directory.) The device file uses special internal requests to set up resolution, special characters and more normal \*(Nr functions to set up page length, etc. .PP .I Cawf has limited support for fonts special forms of bold and italic characters. It is provided through the .B \-c .IR config , .BI \-d device and .BI \-f font options. See the .B DEVICES section for more information. .PP Note the distinction between the device and the output device configuration files. The device file typically defines characters and constant output parameters. The output device configuration file defines font and type face codes. It is usually not necessary to define a separate device file for each device represented in the output device configuration file \- the .I dumb.dev device file will suffice for almost all representations. .SH DEVICES .I Cawf supports primitive output device configuration for font and type face control. One font may be selected for the entire document by directing .I cawf to issue a font selection control character string at the beginning of the document, and control character strings may be selected for switching between the bold, italic and Roman type faces. .PP The .B \-c .IR config, .BI \-d device and .BI \-f font options direct the font and type face selections. .PP The .BI \-d device option specifies the name of the device. .I Cawf has three built\-in devices \- ANSI, NONE and NORMAL. When the ANSI device is selected, .I cawf issues the ANSI shadow mode control codes, ``ESC [ 7 m'', to represent the bold face; the ANSI underscore control codes, ``ESC [ 4 m'', to represent the italic face; and the ANSI control codes, ``ESC [ 0 m'', to represent the ROMAN face. No .BI \-f font specification is permitted with the ANSI device. .PP When the NONE device is selected, .I cawf uses no special output codes to represent the type faces. No .BI \-f font specification is permitted with the ANSI device. .PP The NORMAL output device is the default. When it's selected, .I cawf overprints each bold character two times, using three issuances of each bold character, separated by backspace characters; it issues an underscore and backspace before each italic character. No .BI \-f font specification is permitted with the ANSI device. The .IR bsfilt (1) filter may be used to further process the backspace codes output for a NORMAL device. .PP All other devices named in the .BI \-d device option must be represented by a stanza in the device configuration file. The device configuration file is usually contained in .I device.cf in .IR cawf's library directory (see the .B FILES section for more information). An alternate device configuration file path may be specified with the .BI \-c config option. .PP The .B DEVICE CONFIGURATION FILE section describes the organization of the device configuration file. It is easy to add devices to the .I device.cf supplied in the .I cawf distribution. .PP The .BI \-f font option may be used with the .BI \-d device option, when the appropriate stanza in the device configuration file contains an entry for the named .IR font . The .B DEVICE CONFIGURATION FILE section describes how fonts are defined in device configuration file stanzas. .SH DEVICE CONFIGURATION FILE The device configuration file defines the special character codes necessary to direct output devices to select fonts and to produce bold, italic and Roman type faces. .PP The configuration file is usually found in .I device.cf in .IR cawf 's library directory (see the .B FILES section for more information). It is organized into two main parts \- comments and device stanzas. Comments are any lines that begin with the pound sign (`#') character. They are informational only and .I cawf ignores them. .I Cawf also ignores empty lines, so they may be used as vertical white space. .PP Stanzas name devices and define their font and type face control strings. A stanza begins with the name of the device, starting at the beginning of a line and occupying the entire line. The body of the stanza, defining fonts and type faces, is formed of lines beginning with white space (a TAB or space characters) that directly follow the device name. .PP Individual lines of the stanza body contain a key character, followed by a equal sign, followed by the font name (if a font key) and the output device control codes. .I Cawf issues the font control codes once, at the beginning of output, so only one font may be selected. The type face control codes are issued at each change of type face. .PP The key characters are: .ne 4 .PP .RS .nf b for bold f for font definition i for italic r for Roman .fi .RE .PP The `b', `i' and `r' key codes are followed by an equal sign (`=') and their control code definition. The `f' key code is followed by an equal sign (`='), the font name, another equal sign and the font control code definition. .PP Control code definitions may contain any printable ASCII characters. Non\-printable characters may be encoded in octal notation with the `\\nnn' form or in hexadecimal with the `\\xnn' form. The special code, `\\E' (or `\\e') represents the ESC control character (\\033 or \\x1b). .PP Here's a sample showing the definition for the HP LaserJet III. The stanza name is ``lj3''. All its non\-printable characters are ESCs; the first is coded in octal form; the second with '\\E'; the rest, in hexadecimal form. TAB is used as the leading white space character for the stanza body lines. .PP .RS .nf # HP LaserJet III lj3 b=\\033(s7B i=\\E(s1S r=\\x1b(s0B\\x1b(s0S f=c10=\x1b&l0O\x1b(8U\x1b(s0p12h10v0s0b3T f=c12ibm=\x1b&l0O\x1b(10U\x1b(s0p10.00h12.0v0s0b3T f=lg12=\x1b&l0O\x1b(8U\x1b(s12h12v0s0b6T .fi .RE .PP The distribution .I device.cf file defines the following devices and fonts. .LP .ta \w'kxp1180'u+3n +\w'Italic:'u+3n +\w'bps10'u+6n .nf .ne 3 epson dot matrix printer in Epson FX-86e/FX-800 mode Bold: Double-strike Fonts: none .ne 4 ibmppds IBM Personal Printer Data Stream (PPDS) protocol Bold: Double-strike Italic: Underline Fonts: none .ne 12 kxp1124 Panasonic KX\-P1124 dot matrix printer in PGM mode Bold: Emphasized Fonts: c10 10 Characters Per Inch (CPI) Courier c12 12 CPI Courier bps10 10 CPI Bold PS bps12 12 CPI Bold PS p10 10 CPI Prestige p12 12 CPI Prestige s10 10 CPI Script s12 12 CPI Script ss10 10 CPI Sans Serif ss12 12 CPI Sans Serif .ne 10 kxp1180 Panasonic KX\-P1180 dot matrix printer in PGM mode Bold: Emphasized Fonts: c10 10 Characters Per Inch (CPI) Courier c12 12 CPI Courier bps10 10 CPI Bold PS bps12 12 CPI Bold PS p10 10 CPI Prestige p12 12 CPI Prestige ss10 10 CPI Sans Serif ss12 12 CPI Sans Serif .ne 6 lj3 HP LaserJet III Fonts: c10 10 point, 12 Characters Per Inch (CPI) Courier c12ibm 12 point, 10 CPI Courier, IBM\-PC Symbol Set lg12 12 point, 12 CPI Letter Gothic .ne 4 vgamono VGA monochrome monitor for MS\-DOS (ANSI.SYS driver required for MS\-DOS) Italic: Reverse-video Fonts: none .SH FILES .I Cawf resource files are located in the .I cawf library directory \- \fI C:\\SYS\\LIB\\CAWF\fP, the MS\-DOS environment default; or .IR /usr/lib/cawf , the UNIX environment default. These defaults can be overridden by the CAWFLIB environment variable, or changed in the cawflib.h header file. .ta \w'device.cf'u+3n .nf common common device-independent initialization device.cf output device configurations *.dev device-specific initialization m*.mac macro package files .SH DIAGNOSTICS Unlike .IR nroff , .I cawf complains whenever it sees unknown requests. All diagnostics appear on the standard error file. .ad .SH HISTORY Vic Abell of Purdue University derived .I cawf from .IR awf , \&``the Amazingly Workable (text) Formatter,'' written by Henry Spencer of the University of Toronto. The Toronto work was a supplement to the C News project. The Purdue effort was aimed at producing a C language version that would run on small systems, particularly MS\-DOS ones. The adaptation of the .B me macros was done by Chet Creider . Chet also contributed ideas for device, font and type face support. .PP The MS\-DOS version of .I cawf has been compiled with version 2.5 of Microsoft's Quick-C compiler. It runs under the Mortis Kern Systems Toolkit KornShell, .IR ksh (1), and COMMAND.COM. .SH BUGS Nroff and troff mavens will have many complaints. Some may even represent bugs and not deliberate omissions. .PP Watch out for scaling factors - especially on requests like .BR \ew . .PP The overprinting required to create bold and italicized characters is tiresome on a slow printer. The .IR bsfilt (1) post\-filter from this distribution may be used to alleviate that nuisance by managing the backspacing codes from .IR cawf 's NORMAL device output. .PP The printing of bold and italic characters is sometimes better handled by special printer codes. Use .IR cawf 's .B \-c .IR config , .BI \-d device and .BI \-f font options to produce special font and device output control codes. .PP .I Cawf has a small amount of built-in code for the .BR man , .B me and .B ms macro packages, but none for any others. .PP The stacking for the .B .so request is limited. .SH SEE ALSO bsfilt(1), colcrt(1), man(7), me(7), ms(7) and nroff(1). .TH CC 1 .SH NAME cc, pc, m2 \- Minix C, Pascal, and Modula-2 compilers .SH SYNOPSIS .in +.5i .ti -.5i .BR cc |\c .BR pc |\c .BR m2 .RB [ "\-D \fIname\fR[\fB=\fIvalue" ]] \&... .RB [ "\-U \fIname" ] \&... .RB [ "\-I \fIdirectory" ] \&... .RB [ \-.\fIsuffix ] \&... .RB [ \-c ] .RB [ \-E ] .RB [ \-P ] .RB [ \-S ] .RB [ \-c.\fIsuffix ] .RB [ \-O ] .RB [ \-O\fIlevel ] .RB [ \-OS ] .RB [ \-OT ] .RB [ \-g ] .RB [ \-n ] .RB [ \-a ] .RB [ \-R ] .RB [ \-A ] .RB [ \-s ] .RB [ \-fsoft ] .RB [ \-fnone ] .RB [ \-w ] .RB [ \-wo ] .RB [ \-ws ] .RB [ \-wa ] .RB [ \-3 ] .RB [ \-_ ] .RB [ \-W\fIname\fB\-\fIoption ] \&... .RB [ \-m\fIarch ] .RB [ "\-o \fIoutfile" ] .RB [ "\-L \fIdirectory" ] \&... .RB [ \-i ] .RB [ \-sep ] .RB [ \-com ] .RB [ \-r ] .RB [ "\-stack \fIsize" ] .I operand \&... .sp .4v .ti -.5i (Minix-86 subset:) .ti -.5i .BR cc |\c .BR pc |\c .BR m2 .RB [ "\-D\fIname\fR[\fB=\fIvalue" ]] \&... .RB [ "\-U\fIname" ] \&... .RB [ "\-I\fIdirectory" ] \&... .RB [ \-.o ] \&... .RB [ \-c ] .RB [ \-E ] .RB [ \-P ] .RB [ \-S ] .RB [ \-c.\fIsuffix ] .RB [ \-O ] .RB [ \-O\fIlevel ] .RB [ \-n ] .RB [ \-a ] .RB [ \-R ] .RB [ \-A ] .RB [ \-s ] .RB [ \-f ] .RB [ \-w ] .RB [ \-wo ] .RB [ \-ws ] .RB [ \-wa ] .RB [ \-3 ] .RB [ \-_ ] \&... .RB [ \-m ] .RB [ "\-o \fIoutfile" ] .RB [ "\-L\fIdirectory" ] \&... .RB [ \-i ] .RB [ \-sep ] .RB [ \-com ] .I operand \&... .in -.5i .SH DESCRIPTION .BR Cc , .BR pc , and .BR m2 are the call names of the Minix C, Pascal, and Modula-2 compilers from the Amsterdam Compiler Kit (ACK). .PP All these call names are links to the .B acd driver program. .B Acd uses the driver description file .B /usr/lib/descr that describes the steps necessary to compile a source file. The .BR acd (1) manual page describes a few more flags, like .BR \-v , that may be useful for debugging compiler problems. .PP Minix-86 uses a C program as the compiler driver. This driver is not as flexible as the one implemented with the .B acd driver, and offers a smaller number of options. The second line of the synopsis above shows the options that the Minix-86 driver supports. The rest of this manual page is geared towards the .B acd driver. People writing software for Minix-86, or that should be portable to all Minix versions should stick to the options listed under the Minix-86 compiler. .SH OPTIONS The transformations done by the compiler are modified by the following options. They are a superset of the options required by \s-2POSIX\s+2, with the Minix or compiler specific ones are marked as such. Options for one specific compiler are ignored for others. Read the OPTIONS section of .BR acd (1) for the driver specific options. .PP .TP .BI \-D " name\fR[\fB=\fIvalue\fR]" Same as if .BI #define " name value" had been given. .B 1 is assumed if .I value is omitted. This argument, like all the other double arguments, may also be given as a single argument. (I.e. either as .BI \-D "\0name" or .BI \-D name\fR.) (The Minix-86 driver is not so flexible, the proper form can be seen in the synopsis.) .TP .BI \-U " \fIname" Undefine the pre-defined symbol .IR name . .TP .BI \-I " directory" Extend the include directory path with the given directory. These directories are searched for include files in the given order before the standard places. The standard place for the C compiler is .BR /usr/include , and for the Modula-2 compiler it is .BR /usr/lib/m2 . .TP .BI \-. suffix Act as if a source file with the given suffix is present on the command line. For each language found on the command line the appropriate libraries are selected. The first language mentioned selects the runtime startoff. The call name of the driver also chooses the language, so \fBcc\fP is an implicit .BR \-.c . The runtime startoff can be omitted by specifying .B \-.o for those rare cases where you want to supply your own startoff. (Minix) .TP .B \-c Transform the input files to object files and stop. The .B \-o option may be used under Minix to set the name of the object file. .BR Make (1) likes this, because .BI "cc \-c" " dir/file" .c puts .IB file .o in the current directory, but .BI "cc \-c" " dir/file" .c .BI \-o " dir/file" .o puts the .B .o file where .B make expects it to be by its builtin .B .c.o rule. (Minix-86 can only use .B \-o to name an executable.) .TP .B \-E Run the preprocessor over the input files and send the result to standard output or the file named by .BR \-o . Standard input is read if an input file is named "\fB\-\fR". .TP .B \-P Run the preprocessor over the input files and put the result to files with the suffix .BR .i . File and line number information is omitted from the output. Use .B \-P \-E under Minix to omit this info for .B \-E too. .TP .B \-S Transform the input files to assembly files with suffix .BR .s . .TP .BI \-c. suffix Transform the input files to files with the given suffix. This can only succeed if there is a valid transformation from the input file to the given suffix. The same goes for .B \-c and other options that are just special cases of this option, except for .BR \-P , .B \-c.i keeps the line number info. The option .B \-c.a makes the driver transform the input files to object files and add them to a library. (So you do not need to know how the archiver works.) Note that you need to give object files as arguments if you want to replace old object files. Transformed files are added under a (unique) temporary name. With .B \-o you can name the library. (Minix) (Minix-86 can't do .BR \-c.a .) .TP .B \-O Optimize code. This option is a no-op, because all the compilers already use the .BR \-O1 optimization level to get code of reasonable quality. Use .BR \-O0 to turn off optimization to speed up compilation at debug time. .TP .BI \-O level Compile with the given optimization level. (Minix) .PP .B \-OS .br .B \-OT .RS Optimize for space or for time. (Minix) .RE .TP .B \-g Compile the C source with debugging information. (The way .BR \-g , .B \-s and .B \-O interact is left unspecified.) .TP .B \-n Omit the file and line number tracking that is used for runtime error reports from Pascal or Modula-2 programs. The .B \-n flag is normally used to compile library modules, but may also be useful to make a program smaller and faster once debugged. (Pascal & Modula-2) .TP .B \-a Enable assertions, i.e. statements of the form \fBassert\fI\ test\fR that cause a descriptive runtime error if the boolean expression .I test evaluates false. (Pascal & Modula-2) .TP .B \-R Disable runtime checks like overflow checking. (Pascal & Modula-2) .TP .B \-A Enable array bound checks. (Pascal & Modula-2) .TP .B \-s Strip the resulting executable of its symbol table. .PP .B \-fsoft .br .B \-f .RS Use software floating point instead of hardware floating point. This is a loader flag, but in general it is best to specify this flag in all phases of the compilation. (Minix) .RE .TP .B \-fnone Ignored. Used under Minix-vmd to omit floating point printing/scanning code. The standard Minix compiler figures this out automatically using a special loader trick. (Minix) .TP .B \-w Do not produce warnings about dubious C language constructs. Normally the compiler is configured to do the maximum amount of checking without being too annoying. (Minix) .TP .B \-wo Omit warnings about old (K&R) style. (Minix) .TP .B \-ws Omit strict warnings. (Minix) .TP .B \-wa Omit all warnings. (Minix) .TP .B \-3 Only accept 3rd edition Modula-2. (Modula-2) .TP .B \-_ Allow underscores in Pascal or Modula-2 identifiers, but not at the beginning of an identifier. (Pascal & Modula-2) .TP .BI \-W name \- option If .I name is the name of the compiler this driver is working for, then .I option is activated for that compiler. See below for a per-compiler list. Any other .B \-W option is ignored. (\fB\-W\fP is described by \s-2POSIX\s+2 as an optional flag to send options to the different compiler passes with a totally different (and nicely ignored) syntax as described here.) (Minix-86 ignores any .B \-W flag.) .TP .B \-m Under Minix-86 this option transforms the function declarations (prototypes) to the old K&R form, i.e. the arguments declarations are removed. Thi s saves a lot of memory in the compiler and may allow a large program to be compiled. One must make sure that function arguments are properly type-cast where necessary. (Minix) .TP .BI \-m arch Set the target architecture for a cross compiler. Normally the compiler produces code for the same architecture it itself is compiled for. The .B ARCH environment variable may also be used to set the architecture. Architectures names are: .B i86 (Intel 8086 and 286), .B i386 (Intel 386, 486, ...), .B m68000 (Motorola MC68000 & MC68010, 16-bit ints), .B m68010 (Motorola MC68000 & MC68010, 32-bit ints), .B m68020 (Motorola MC68020, 32-bit ints), .B sparc (Sun SPARC). (Minix) (Ignored under Minix-86.) .TP .BI \-o " outfile" Set the output file for the .BR \-c , .BR \-c.a , and .BR \-E options, or choose the executable name instead of the default .BR a.out . (Minix-86 can only choose the executable name.) .TP .BI \-L " directory" Extend the library search path with .IR directory . These directories are searched for libraries named by .B \-l in the given order before the standard places. The standard places are .B /lib/\c .IR arch , and .B /usr/lib/\c .IR arch . The search for libaries in directories added with .B \-L looks in .IB directory /\c .IR arch and .I directory itself. .RI ( Arch is the machine architecture name. This is Minix dependent, compilers on other systems usually only look in .IR directory .) (Minix-86 only has .B /lib and .B /usr/lib as the standard places.) .PP .B \-sep .br .B \-com .RS Create a Separate I&D or a common I&D executable. The text segment of a separate I&D executable is read-only and shareable. For an .B i86 binary this also means that the text and data segment can each be 64 kilobytes large instead of just 64 kilobytes together. Separate I&D is the default. Common I&D is probably only useful for the bootstraps. The .B \-i option has the same meaning as .BR \-sep , but should no longer be used. (Minix) .RE .TP .B \-r Makes the loader produce a relocatable object file, i.e. a file that may be loaded again. The runtime startoff and the default libraries are omitted, only the files mentioned are combined. (Minix) .TP .BI \-stack " size" Allow the process .I size bytes of heap and stack. .I Size is a C-style decimal, octal, or hexadecimal number, optionally followed by the multipliers .BR m , .BR k , .BR w , and .B b for mega (1024*1024), kilo (1024), "word" (2 or 4), and byte (1). Uppercase letters are accepted too. A size of .B 32kw is used by default, translating to 64k for .BR i86 , and 132k for other architectures. Too large a size is rounded down to keep the data segment within 64 kilobytes for the .BR i86 . (Minix) .SH OPERANDS All leftover operands are treated as files to be compiled, with one exception. The construct .BI \-l " library" is used to denote a library, usually .BI lib library .a\fR, that is to be searched in the directories mentioned with .B \-L or the standard places. These libraries keep their place among the (transformed) input files when presented to the loader. (It is a common mistake to write .BR "cc\ \-lcurses\ x.c" instead of .BR "cc\ x.c\ \-lcurses" .) .SH IMPLEMENTATION The Minix compiler implementation uses the ACK compilers adapted for use under Minix as described below. Read .BR ACK (7) for more detailed information on the ACK compilers themselves. .SS "Feature test macros" The preprocessors are given these arguments to define feature test macros: .B \-D__ACK__ tells what compiler is used. .B \-D__minix tells that this is Minix. .BI \-D__ arch tells the architecture. (More macros are defined, but they are only to be used in the include files.) .PP The symbols above are predefined by the preprocessor so that your program is able to "sense" the environment it is in. It is also possible for your program to do the opposite, to tell what kind of environment it likes to have. By default, .B cc compiles a standard C program. If you want the extensions described in POSIX.1 to become visible, then you have to set .BR _POSIX_SOURCE " to " 1 at the start of your program. To enable \s-2UNIX\s+2 or Minix extensions you need to also set .BR _MINIX " to " 1 . If you don't want to clutter your source files with these symbols then you can use .B cc \-D_MINIX \-D_POSIX_SOURCE to get the POSIX.1 and the Minix extensions. .SS "Preprocessing" Pascal, Modula-2, EM source (see below), and Assembly source are preprocessed by the C preprocessor if the very first character in the file is a '\fB#\fP' character. .SS "Assembly dialects" No two compilers use the same assembly language. To be able to use the same assembly dialect for the low level support routines an assembly converter is provided. The input of this converter can be of type .BR ack , .BR ncc , or .BR bas , and the output can be of type .BR ack , .BR ncc , or .BR gnu . The suffix of the file tells the assembly dialect (see below), or one can use the option .BI \-Was\- dialect to tell the driver what the dialect of a plain .B .s file is. The assembly converter is not as smart as the assembler, the translation is more or less a text substitution. It leaves a lot of checking to the target assembler. You have to restrict yourself to a subset that is understood by both assemblers. The ACK assembler for instance doesn't care if you use `ax' or `eax' for a 32 bit register, it looks at the instruction type. The GNU assembler doesn't like this, so you have to use the proper register name in ACK assembly that is to be translated to GNU assembly. Expressions are converted as is, even if the operator precedence rules of the two assembly languages differ. So use parentheses. The converter does promise one thing: compiler output can be properly translated. (Note that under Minix-86 .B \-W is ignored. All assembly should therefore be in the "ncc" dialect.) .SH FILES .TP 10 .B /usr/lib/descr The compiler description file. .TP .B .c Suffix of a C source file. .TP .B .mod Modula-2. .TP .B .p Pascal. .TP .B .i Preprocessed C source. .TP .B .k ACK machine independent compact EM code produced by the C, Pascal, or Modula-2 front end (or any other ACK front end.) The ACK compilers are based on the UNCOL idea where several front ends compile to a common intermediate language, and several back ends transform the intermediate language to the target machine language. The ACK intermediate language is named "EM". .TP .B .m Peephole optimized EM. .TP .B .gk Result of the (optional) EM global optimizer. .TP .B .g Result of the second EM peephole optimizer used after the global optimizer. .TP .B .e Human readable EM. (Human created or decoded compact EM.) .TP .B .s Target machine assembly. (Current compiler dialect.) .TP .B .ack.s ACK assembly. .TP .B .ncc.s ACK Xenix style assembly. This dialect is used by the 16 bit ACK ANSI C compiler. .TP .B .gnu.s GNU assembly. .TP .B .bas.s BCC assembly. (Used by the Bruce Evans' BCC compiler, for many years the compiler for Minix-386.) .TP .B .o Object code. .TP .B .a Object code library. .TP .B a.out Default output executable. .SH "SEE ALSO" .BR acd (1), .BR ACK (7). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CDIFF 1 .SH NAME cdiff \- context diff .SH SYNOPSIS \fBcdiff\fR [\fB\-c\fIn\fR] \fIoldfile \fInewfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Provide \fIn\fR lines of context" .SH EXAMPLES .EX "cdiff old new >f" "Write context diff on \fIf\fR" .EX "cdiff \-c1 old new >f" "Use only 1 line of context" .SH DESCRIPTION .PP \fICdiff\fR produces a context diff by first running \fIdiff\fR and then adding context. Some update programs, like \fIpatch\fR, can use context diffs to update files, even in the presence of other, independent changes. .SH "SEE ALSO" .BR cmp (1), .BR diff (1), .BR patch (1). .TH CLEAR 1 .SH NAME clear, clr \- clear the screen .SH SYNOPSIS .B clear .br .B clr .SH DESCRIPTION .B Clear or its synonym .B clr clears the screen. It is exactly equivalent to .BR "tget -str cl" . .SH "SEE ALSO" .BR tget (1). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CGREP 1 .SH NAME cgrep \- grep and display context .SH SYNOPSIS \fBcgrep\fR [\fB\-a \fIn\fR]\fR [\fB\-b \fIn\fR] [\fB\-f\fR] [\fB\-l \fIn\fR] [\fB\-n\fR] [\fB\-w \fIn\fR] \fIpattern\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "How many lines to display after the matching line" .FL "\-b" "How many lines to display before the matching line" .FL "\-f" "Suppress file name in the output" .FL "\-l" "Lines are truncated to this length before comparison" .FL "\-n" "Suppress line numbers in the output" .FL "\-w" "Sets window size (same as \fB\-a\fR n \fB\-b\fR n)" .SH EXAMPLES .EX "cgrep \-w 3 hello file1" "Print 3 lines of context each way" .SH DESCRIPTION .PP \fICgrep\fR is a program like \fIgrep\fR, except that it also can print a few lines above and/or below the matching lines. It also prints the line numbers of the output. .SH "SEE ALSO" .BR grep (1), .BR fgrep (1). .TH CHGRP 1 .SH NAME chgrp \- change group .SH SYNOPSIS \fBchgrp [\fB\-R\fR] [\fIowner:\fR]\fIgroup \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-R" "Change directory hierarchies" .SH EXAMPLES .EX "chgrp system file1 file2" "Make \fIsystem\fR the group of the files" .EX "chrgp \-R other dir1" "Make \fIother\fR the group of all files below dir1" .SH DESCRIPTION .PP The group field (and optionally owner field) of the named files is changed to .I group and .I owner . Alternatively, a decimal gid (uid) may be specified instead of a group name. If the \fB\-R\fR flag is used, the changes will be applied recursively to all files in named directories. Only the superuser may execute this command to set arbitrary groups. Normal users can only change the group if they own the file, and the group is their own group (Minix), or one of their supplementary groups (Minix-vmd). .SH "SEE ALSO" .BR chown (8), .BR chmod (1), .BR ls (1), .BR chown (2). .TH CHMEM 1 .SH NAME chmem \- change memory allocation .SH SYNOPSIS \fBchmem\fR [\fB+\fR]\fR [\fB\-\fR] [\fB=\fR] \fIamount file\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "chmem =50000 a.out" "Give \fIa.out\fP 50K of stack space" .EX "chmem \-4000 a.out" "Reduce the stack space by 4000 bytes" .EX "chmem +1000 file1" "Increase each stack by 1000 bytes" .SH DESCRIPTION .PP When a program is loaded into memory, it is allocated enough memory for the text and data+bss segments, plus an area for the stack. Data segment growth using .I malloc , .I brk , or .I sbrk eats up stack space from the low end. The amount of stack space to allocate is derived from a field in the executable program's file header. If the combined stack and data segment growth exceeds the stack space allocated, the program will be terminated. .PP It is therefore important to set the amount of stack space carefully. If too little is provided, the program may crash. If too much is provided, memory will be wasted, and fewer programs will be able to fit in memory and run simultaneously. \s-2MINIX\s+2 does not swap, so that when memory is full, subsequent attempts to fork will fail. The compiler sets the stack space to the largest possible value (for the Intel CPUs, 64K \- text \- data). For many programs, this value is far too large. Nonrecursive programs that do not call .I brk , .I sbrk , or .I malloc , and do not have any local arrays usually do not need more than 8K of stack space. .PP The .I chmem command changes the value of the header field that determines the stack allocation, and thus indirectly the total memory required to run the program. The = option sets the stack size to a specific value; the + and \- options increment and decrement the current value by the indicated amount. The old and new stack sizes are printed. .SH "SEE ALSO" .BR install (1), .BR brk (2). .TH CHMOD 1 .SH NAME chmod \- change access mode for files .SH SYNOPSIS \fBchmod [\fB\-R\fR] \fImode \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-R" "Change hierarchies recursively" .SH EXAMPLES .EX "chmod 755 file" "Owner: rwx Group: r\-x Others: r\-x" .EX "chmod +x file1 file2" "Make \fIfile1\fR and \fIfile2\fR executable" .EX "chmod a\-w file" "Make \fIfile\fR read only" .EX "chmod u+s file" "Turn on SETUID for \fIfile\fR" .EX "chmod \-R o+w dir" "Allow writing for all files in dir" .SH DESCRIPTION .PP The given mode is applied to each file in the file list. If the \fB\-R\fR flag is present, the files in a directory will be changed as well. The mode can be either absolute or symbolic. Absolute modes are given as an octal number that represents the new file mode. The mode bits are defined as follows: .ta 0.25i .nf .PP 4000 Set effective user id on execution to file's owner id 2000 Set effective group id on execution to file's group id 0400 file is readable by the owner of the file 0200 writeable by owner 0100 executable by owner 0070 same as above, for other users in the same group 0007 same as above, for all other users .PP .fi Symbolic modes modify the current file mode in a specified way. The form is: .PP [who] op permissions { op permissions ...} {, [who] op ... } .PP The possibilities for \fIwho\fR are \fIu\fR, \fIg\fR, \fIo\fR, and \fIa\fR, standing for user, group, other and all, respectively. If \fIwho\fR is omitted, \fIa\fR is assumed, but the current umask is used. The op can be \fI+\fR, \fI-\fR, or \fI=\fR; \fI+\fR turns on the given permissions, \fI\- \fRturns them off; \fI=\fR sets the permissions exclusively for the given \fIwho\fR. For example \fIg=x\fR sets the group permissions to \fI--x\fR. .PP The possible permissions are \fIr\fR, \fIw\fR, \fIx\fR; which stand for read, write, and execute; \fIs\fR turns on the set effective user/group id bits. \fIs\fR only makes sense with \fIu\fR and \fIg\fR;\fR o+s\fR is harmless. .SH "SEE ALSO" .BR ls (1), .BR chmod (2). .TH CKSUM 1 .SH NAME cksum \- display file checksum and size .SH SYNOPSIS \fBcksum \fR[\fIfile\fR ...]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "cksum" "Display CRC and size of \fIstdin\fR" .EX "cksum *.c" "Display CRC and size of \fI.c\fP files" .SH DESCRIPTION .PP .I Cksum calculates and writes to standard output the 32-bits CRC of the input .I files , or of stdin if no .I files were specified. The size in bytes of each .I file will be displayed after a space. The name of each .I file will be displayed after another space. .SH "SEE ALSO" .BR crc (1), .BR sum (1). .TH CMP 1 .SH NAME cmp \- compare two files .SH SYNOPSIS \fBcmp\fR [\fB\-ls\fR] \fIfile1 file2\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-l" "Loud mode. Print bytes that differ (in octal)" .FL "\-s" "Silent mode. Print nothing, just return exit status" .SH EXAMPLES .EX "cmp file1 file2" "Tell whether the files are the same" .EX "cmp \-l file1 file2" "Print all corresponding bytes that differ" .SH DESCRIPTION .PP Two files are compared. If they are identical, exit status 0 is returned. If they differ, exit status 1 is returned. If the files cannot be opened, exit status 2 is returned. If one of the file arguments is \-, then \fIstdin\fR is compared to the other file. .SH "SEE ALSO" .BR comm (1), .BR diff (1). .TH COMM 1 .SH NAME comm \- print lines common to two sorted files .SH SYNOPSIS \fBcomm\fR [\fB\-123\fR] \fIfile1 file2\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-1" "Suppress column 1 (lines present only in \fIfile1\fP)" .FL "\-2" "Suppress column 2 (lines present only in \fIfile2\fP)" .FL "\-3" "Suppress column 3 (lines present in both files)" .SH EXAMPLES .EX "comm file1 file2" "Print all three columns" .EX "comm \-12 file1 file2" "Print only lines common to both files" .SH DESCRIPTION .PP Two sorted files are read and compared. A three column listing is produced. Files only in .I file1 are in column 1; files only in .I file2 are in column 2; files common to both files are in column 3. The file name \- means \fIstdin\fR. .SH "SEE ALSO" .BR cmp (1), .BR diff (1), .BR sort (1). .TH COMPRESS 1 .SH NAME compress, uncompress, zcat \- compress a file using modified Lempel-Ziv coding .SH SYNOPSIS \fBcompress\fR [\fB\-cdfv\fR]\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Put output on \fIstdout\fR instead of on \fIfile.Z\fR" .FL "\-d" "Decompress instead of compress" .FL "\-f" "Force output even if there is no saving" .FL "\-v" "Verbose mode" .SH EXAMPLES .EX "compress outfile" "Compress 1 file" .EX "compress x y z" "Compress 3 files to \fIx.Z\fR, \fIy.Z\fR, and \fIz.Z\fR" .EX "compress \-d file.Z" "Decompress \fIfile.Z\fR to \fIfile\fR" .SH DESCRIPTION .PP The listed files (or \fIstdin\fR, if none are given) are compressed using the Ziv-Lempel algorithm. If the output is smaller than the input, the output is put on \fIfile.Z\fR or \fIstdout\fR if no files are listed. If \fIcompress\fR is linked to \fIuncompress\fR, the latter is the same as giving the \fB\-d\fP flag. Similarly, a link to \fIzcat\fR decompresses to \fIstdout\fR. The \s-2MINIX\s+2 version of \fIcompress\fR uses 13-bit compression. This means that when compressing files on other systems for transmission to \s-2MINIX\s+2, be sure that only 13-bit compression is used. On many systems, the default is 16-bit (too big). .SH "SEE ALSO" .BR tar (1). .TH CP 1 .SH NAME cp, mv, rm, ln, cpdir, clone \- copy, move, remove, link .SH SYNOPSIS .B cp .RB [ \-pifsmrRvx ] .I file1 file2 .br .B cp .RB [ \-pifsrRvx ] .IR file " ... " dir .PP .B mv .RB [ \-ifsmvx ] .I file1 file2 .br .B mv .RB [ \-ifsvx ] .IR file " ... " dir .PP .B rm .RB [ \-ifrRvx ] .IR file " ..." .PP .B ln .RB [ \-ifsSmrRvx ] .I file1 file2 .br .B ln .RB [ \-ifsSrRvx ] .IR file " ... " dir .PP .B cpdir .RB [ \-ifvx ] .I file1 file2 .PP .B clone .RB [ \-ifsSvx ] .I file1 file2 .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The utilities .BR cp , .BR mv , .BR rm , and .B ln do basic file management: copying, renaming or moving, deletion, and creating links. (The .B cpdir and .B clone utilities are easy to use aliases for copying or linking whole trees. They are the same as .B cp \-psmr and .BR "ln \-fmr" ) .PP The first synopsis form of the utilities .BR cp , .BR mv , and .B ln is used if only two arguments are given, and the second argument is not a directory. The source and target file are then the two files given. .PP If the second synopsis form is used then the last argument must be a directory. Each of the files is copied, moved or linked into this directory. .PP A file is by default copied by .B cp without looking at its type, so symlinks are followed and devices are opened and read from or written to. Links between files are ignored. This behavior can be changed by using the proper options. .PP The .B mv utility uses the .BR rename (2) call to rename or move files. If source and target are on different devices however, then .B mv will use .B cp \-pr to copy the files or directory trees. .PP Each utility continues with the next file on errors, except on I/O errors. .SH OPTIONS .TP .B \-p Copy the file attributes like mode, owner, group and time of last modification. Normally only the mode is copied to a new file with the file creation mask applied. Setuid bits are cleared if setting the ownership fails. .TP .B \-i Ask if ok to overwrite, replace or remove. .B Mv and .B rm will ask this automatically if interactive and the target file is writable. .B Cp will fail if the target cannot be written, .B ln will always fail if the target exists. .TP .B \-f Makes .B cp remove a target file before copying if it is not writable, .B mv removes an existing target without asking, .B rm does not report any errors, and .B ln removes an existing target file before linking. The last of .B \-i and .B \-f wins for .B mv if both flags are set, the other utilities do something sensible, like asking before forcefully removing. .TP .B \-s Make a symlink instead of a normal link. For utilities other than .B ln this flag means "copy similar". The modified time is always copied for .B cp \-s and the other attributes are copied if a new file is created. The normal \s-2POSIX\s+2 required patronizing like applying the file creation mask or clearing setuid bits is not done. .TP .B \-S Make a symlink if a normal link cannot be made because source and target are on different devices. The symlink is required to really refer back to the source, meaning that a/b must exist in the call .BR "ln \-S a/b c/d" , and that the symlink from c/d must lead back to a/b. So the symlink will be created as if .B "ln \-s ../a/b c/d" was called. If the target is a full path, but the source is not then an error will be given saying that this is "too difficult." .TP .B \-m Merge trees. The first synopsis form is assumed, and the files from one tree are merged into the other. There is no "if it's a directory the put it into that directory" trickery here. .TP .BR \-r ", " \-R Recursively copy, remove, or link. If the source is a directory then the files in this directory are copied to similarly named files in the target directory. Special files are copied as new special files, they are not read or written. Symlinks are still expanded and the link structure ignored with .BR \-R . The .B \-r flag does copy symlinks as symlinks and keeps the link structure intact. (Note that .B \-R is invented by \s-2POSIX\s+2 as a replacement for the classic .B \-r option of older copy commands that did read special files. The standard says that .B \-r is implementation defined, so that's why this flag is better than .B \-R in this implementation of .BR cp .) For .B rm and .B ln both flags mean the same. .B Ln will recursively link the files in the trees, except symlinks, they are copied. If symlinks are created with .B ln \-rs or .B ln \-rS then they are required "to work" as described with the .B \-S flag. .TP .B \-v Verbose. Show what is done on standard output. .TP .B \-x Do not cross mount points. Empty directories will be created if the source directory is a mount point on a copy, move or link. A mount point will not be removed or traversed recursively. This flag allows one to copy the root device, e.g. .BR "cpdir \-x / /mnt" . .SH "SEE ALSO" .BR cat (1), .BR mkdir (1), .BR rmdir (1), .BR mkdir (2), .BR rmdir (2), .BR link (2), .BR unlink (2), .BR rename (2), .BR open (2), .BR read (2), .BR write (2), .BR opendir (3). .SH NOTES All the utilities described are links to the same program. .SH BUGS .B Mv should first copy a tree across devices and then remove the source tree if there was no error. Instead, each file in the tree is copied and immediately removed. On error you may be left with two half-filled trees, together containing all of the files. You may have to restart the move with .BR "mv \-m" . .PP .B Rm should be able to remove arbitrarily deep trees. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CRC 1 .SH NAME crc \- print the checksum of the file data .SH SYNOPSIS \fBcrc \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "crc *.c" "Print checksums of all the C programs" .SH DESCRIPTION .PP The checksum of each argument is computed and printed, along with the file length and its name, one file per line. This program is useful for seeing if a file transmitted to another machine has arrived correctly. It is conceptually similar to \fIsum\fR, except that it uses a stronger checksum algorithm and also prints the length. .SH "SEE ALSO" .BR cksum (1), .BR sum (1). .TH CTAGS 1 .SH NAME ctags - Generates "tags" and (optionally) "refs" files .SH SYNOPSIS \fBctags\fP [\fB-stvra\fP] \fIfilesnames\fP... .SH DESCRIPTION \fIctags\fP generates the "tags" and "refs" files from a group of C source files. The "tags" file is used by Elvis' ":tag" command, control-] command, and -t option. The "refs" file is sometimes used by the \fIref(1)\fP program. .PP Each C source file is scanned for #define statements and global function definitions. The name of the macro or function becomes the name of a tag. For each tag, a line is added to the "tags" file which contains: .RS .nf - the name of the tag - a tab character - the name of the file containing the tag - a tab character - a way to find the particular line within the file. .RE .fi .PP The filenames list will typically be the names of all C source files in the current directory, like this: .RS .nf $ ctags -stv *.[ch] .RE .fi .SH OPTIONS .IP \fB-t\fR Include typedefs. A tag will be generated for each user-defined type. Also tags will be generated for struct and enum names. Types are considered to be global if they are defined in a header file, and static if they are defined in a C source file. .IP \fB-v\fR Include variable declarations. A tag will be generated for each variable, except for those that are declared inside the body of a function. .IP \fB-s\fR Include static tags. \fICtags\fR will normally put global tags in the "tags" file, and silently ignore the static tags. This flag causes both global and static tags to be added. The name of a static tag is generated by prefixing the name of the declared item with the name of the file where it is defined, with a colon in between. For example, "static foo(){}" in "bar.c" results in a tag named "bar.c:foo". .IP \fB-r\fP This causes \fIctags\fP to generate both "tags" and "refs". Without \fB-r\fP, it would only generate "tags". .IP \fB-a\fR Append to "tags", and maybe "refs". Normally, \fIctags\fR overwrites these files each time it is invoked. This flag is useful when you have to many files in the current directory for you to list them on a single command-line; it allows you to split the arguments among several invocations. .SH FILES .IP tags A cross-reference that lists each tag name, the name of the source file that contains it, and a way to locate a particular line in the source file. .IP refs The "refs" file contains the definitions for each tag in the "tags" file, and very little else. This file can be useful, for example, when licensing restrictions prevent you from making the source code to the standard C library readable by everybody, but you still everybody to know what arguments the library functions need. .SH BUGS .PP \fIctags\fR is sensitive to indenting and line breaks. Consequently, it might not discover all of the tags in a file that is formatted in an unusual way. .SH "SEE ALSO" elvis(1), refs(1) .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .TH CUT 1 .SH NAME cut \- select out columns of a file .SH SYNOPSIS \fBcut [ \fB \-b \fR|\fB \-c\fR] \fIlist\fR [\fIfile...\fR]\fR .br \fBcut \-f \fIlist\fR [\fB\-d \fIdelim\fR] [\fB \-s\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-b" "Cut specified bytes" .FL "\-c" "Select out specific characters" .FL "\-d" "Change the column delimiter to \fIdelim\fR" .FL "\-f" "Select out specific fields that are separated by the .FL "\-i" "Runs of delimiters count as one" .FL "\-s" "Suppres lines with no delimiter characters, when used .SH EXAMPLES .EX "cut \-f 2 file" "Extract field 2" .EX "cut \-c 1\-2,5 file" "Extract character columns 1, 2, and 5" .EX "cut \-c 1\-5,7\- file" "Extract all columns except 6" .SH DESCRIPTION [\fIfile...\fR]" delimiter character ( see \fIdelim\fR)" with the \-f option. Lines with no delimiters are passwd through untouched" .PP \fICut\fR extracts one or more fields or columns from a file and writes them on standard output. If the \fB\-f\fR flag is used, the fields are separated by a delimiter character, normally a tab, but can be changed using the \fB\-d\fR flag. If the \fB\-c\fR flag is used, specific columns can be specified. The list can be comma or BLANK separated. The \fB\-f\fR and \fB\-c\fR flags are mutually exclusive. Note: The POSIX1003.2 standard requires the option \-b to cut out specific bytes in a file. It is intended for systems with multi byte characters (e.g. kanji), since MINIX uses only one byte characters, this option is equivalent to \-c. For the same reason, the option \-n has no effect and is not listed in this manual page. .SH "SEE ALSO" .BR sed (1), .BR awk (9). .TH DATE 1 .SH NAME date \- print or set the date and time .SH SYNOPSIS \fBdate [\fB\-qsuS\fR] [\fB\-r\fI seconds\fR] [[\fIMMDDYY\fR]\fIhhmm\fR[\fIss\fR]] [\fI+format\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-q" "Read the date from \fIstdin\fR" .FL "\-s" "Set the time (implicit for \fB\-q\fR or a date string)" .FL "\-u" "Print the date as GMT" .FL "\-S" "Date within Eternal September" .FL "\-r" "Use this number of seconds instead of current time" .SH EXAMPLES .EX "date" "Print the date and time" .EX "date 0221921610" "Set date to Feb 21, 1992 at 4:10 p.m." .SH DESCRIPTION .PP With the \fB\-q\fR flag or a numeric argument, .I date sets the GMT time and date. .I MMDDYY refers to the month, day, and year; .I hhmmss refers to the hour, minute and second. Each of the six fields must be exactly two digits, no more and no less. .I date always display the date and time, with the default format for the system. The \fB\-u\fR flag request GMT time instead of local time. A format may be specified with a + followed by a printf-like string with the following options: .ta 0.25i .nf .PP %% % character %A Name of the day %B Name of the month %D mm/dd/yy %H Decimal hour on 2 digits %I Decimal hour modulo 12 on 2 digits %M Decimal minute on 2 digits %S Decimal seconds on 2 digits %T HH:MM:SS %U Decimal week number, Sunday being first day of week %W Decimal week number, Monday being first day of week %X Same as %T %Y Decimal year on 4 digits %Z Time Zone (if any) %a Abbreviated name of the day %b Abbreviated name of the month %c Appropriate date & time (default format) %d Decimal day of the month on 2 digits %e Same as %d, but a space replaces leading 0 %h Same as %b %j Decimal dey of the year on 3 digits %m Decimal month on 2 digits %n Newline character %p AM or PM %r 12-hour clock time with AM/PM %s Number of seconds since the epoch %t Tab character %w Decimal day of the week (0=Sunday) %x Same as %D %y Decimal year on 2 digits .SH "SEE ALSO" .BR time (2), .BR ctime (3), .BR readclock (8). .TH DD 1 .SH NAME dd \- convert and copy a file .SH SYNOPSIS \fBdd\fR [\fIoption = value\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "dd if=/dev/fd0 of=/dev/fd1" "Copy disk 0 to disk 1" .EX "dd if=x of=y bs=1w skip=4" "Copy \fIx\fP to \fIy\fP, skipping 4 words" .EX "dd if=x of=y count=3" "Copy three 512\-byte blocks" .SH DESCRIPTION .PP This command is intended for copying partial files. The block size, skip count, and number of blocks to copy can be specified. The options are: .PP .ta 0.25i 1.5i \fBif\fR = file \- Input file (default is \fIstdin\fR) .br \fBof\fR = file \- Output file (default is standard output) .br \fBibs\fR = n \- Input block size (default 512 bytes) .br \fBobs\fR = n \- Output block size (default is 512 bytes) .br \fBbs\fR = n \- Block size; sets \fIibs\fP and \fIobs\fP (default is 512 bytes) .br \fBskip\fR = n \- Skip \fIn\fP input blocks before reading .br \fBseek\fR = n \- Skip \fIn\fP output blocks before writing .br \fBcount\fR = n \- Copy only \fIn\fP input blocks .br \fBconv = lcase\fR \- Convert upper case letters to lower case .br \fBconv = ucase\fR \- Convert lower case letters to upper case .br \fBconv = swab\fR \- Swap every pair of bytes .br \fBconv = noerror\fR \- Ignore errors and just keep going .br \fBconv = silent\fR \- Suppress statistics (Minix specific flag) .PP Where sizes are expected, they are in bytes. However, the letters \fBw\fR, \fBb\fR, or \fBk\fR may be appended to the number to indicate words (2 bytes), blocks (512 bytes), or K (1024 bytes), respectively. When .I dd is finished, it reports the number of full and partial blocks read and written. .SH "SEE ALSO" .BR vol (1). .TH DF 1 .SH NAME df \- report on free disk space .SH SYNOPSIS \fBdf\fP [\fB\-ikP\fP] [\fB\-t\fP \fItype\fP] [\fIfile\fP ...] .SH DESCRIPTION .B Df lists the amount of free space on the currently mounted devices (no arguments), or the devices given as arguments. If the argument is not a device then the device it resides on is listed. .SH OPTIONS Without options, .B df will give a listing like this: .sp .nf .if t .ft C Filesystem 1k-Blocks free used % FUsed% Mounted on /dev/c0d0p1s0 1440 635 805 56% 26% / /dev/c0d0p1s1 32768 32390 378 2% 1% /tmp /dev/c0d0p1s2 784657 517809 266848 35% 29% /usr .if t .ft R .fi .PP The .B \-i option shifts the focus to the files: .sp .nf .if t .ft C Filesystem Files free used % BUsed% Mounted on /dev/c0d0p1s0 1024 759 265 26% 56% / /dev/c0d0p1s1 5472 5468 4 1% 2% /tmp /dev/c0d0p1s2 65535 46734 18801 29% 35% /usr .if t .ft R .fi .PP Option .B \-P makes .B df use \s-2POSIX\s+2 defined output in 512 byte units: .sp .nf .if t .ft C Filesystem 512-blocks Used Available Capacity Mounted on /dev/c0d0p1s0 2880 1628 1252 57% / /dev/c0d0p1s1 65536 756 64780 2% /tmp /dev/c0d0p1s2 1569314 533748 1035566 35% /usr .if t .ft R .fi .PP With .B \-k 1024 byte units would be used. .PP The .B \-t option limits .BR df 's output to file systems of the given .IR type . .SH FILES .TP 15n .B /etc/mtab List of mounted file systems. .SH "SEE ALSO" .BR du (1), .BR fstab (5). .SH BUGS Default output should also be in 512 byte units says \s-2POSIX\s+2. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: df.1,v 1.5 1998/07/27 19:48:47 philip Exp $ .TH DHRYSTONE 1 .SH NAME dhrystone \- integer benchmark .SH SYNOPSIS \fBdhrystone\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "dhrystone" "Run the dhrystone benchmark" .SH DESCRIPTION .PP Many years ago, a floating-point benchmark called \fIwhetstone\fR was popular for benchmarking FORTRAN programs. Nowadays, an integer benchmark called \fIdhrystone\fR is widely used for benchmarking UNIX systems. This is it. Be warned, however, that \fIdhrystone\fR is entirely CPU bound, and goes blindingly fast on machines with high-speed caches. Although this is a good measure for programs that spend most of their time in some inner loop, it is a poor benchmark for I/O bound applications. .TH DIFF 1 .SH NAME diff \- print differences between two files .SH SYNOPSIS \fBdiff \fR [\fB\-c \fR|\fB \-e \fR|\fB \-C \fIn\fR\] [\fB\-br\fR]\fIfile1 file2\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-C \fIn" "Produce output that contains \fIn\fR lines of context" .FL "\-b" "Ignore white space when comparing" .FL "\-c" "Produce output that contains three lines of context" .FL "\-e" "Produce an \fIed\fR-script to convert \fIfile1\fR into \fIfile2\fR" .FL "\-r" "Apply \fIdiff\fR recursively to files and directories of .SH EXAMPLES .EX "diff file1 file2" "Print differences between 2 files" .EX "diff -C 0 file1 file2" "Same as above" .EX "diff -C 3 file1 file2" "Output three lines of context with every .EX "diff -c file1 file2" Same as above" .EX "diff /etc /dev" "Compares recursively the directories \fI/etc\fR and \fI/dev\fR" .EX "diff passwd /etc" "Compares \fI./passwd\fR to \fI/etc/passwd" .SH DESCRIPTION the same name, when \fIfile1\fR and \fIfile2\fR are both directories" difference encountered" .PP \fIDiff\fR compares two files and generates a list of lines telling how the two files differ. Lines may not be longer than 128 characters. If the two arguments on the command line are both directories, \fIdiff\fR recursively steps through all subdirectories comparing files of the same name. If a file name is found only in one directory, a diagnostic message is written to \fIstdout\fR. A file that is of either block special, character special or FIFO special type, cannot be compared to any other file. On the other hand, if there is one directory and one file given on the command line, \fIdiff\fR tries to compare the file with the same name as \fIfile\fR in the directory \fIdirectory\fR. .SH "SEE ALSO" .BR cdiff (1), .BR cmp (1), .BR comm (1), .BR patch (1). .TH CRONTAB 1 .SH NAME crontab \- User crontab manipulation .SH SYNOPSIS .B crontab \-c .RI [ user ] .I file .br .B crontab \-l .RI [ user ] .br .B crontab \-r .RI [ user ] .br .B crontab \-p .SH DESCRIPTION The .B crontab program allows users to manipulate their personal crontab files. These files are hidden in .BI /usr/spool/crontabs/ user where .I user is the login name of a given user. The system daemon .B cron uses these crontabs, among others, to run tasks that are to be repeated at regular intervals. See .BR crontab (5) on what a good crontab file should look like. .PP Only the superuser can specify a user name to manipulate the crontab of a given user. Any other user can only touch their own crontab file. .SH OPTIONS .TP \fB\-c\fR [\fIuser\fR] \fIfile\fR Install .I file as the crontab file of .IR user . .TP \fB\-l\fR [\fIuser\fR] List the crontab file of .I user to standard output. .TP \fB\-r\fR [\fIuser\fR] Remove the crontab file of .IR user . .TP \fB\-p\fR Tell cron to reload its tables. Useful for system administrators to signal a change to any of the system crontab files. Changes made by the .B crontab program are signalled automatically. (Mnemonic: \-p = "ping".) .SH FILES .TP \w'/usr/spool/crontabs/user'u+5n .BI /usr/spool/crontabs/ user Per user personal crontab file. .SH "SEE ALSO" .BR crontab (5), .BR cron (8). .SH DIAGNOSTICS .B Crontab preparses a new crontab and only installs it if correct. All errors are sent to standard error, messages about installing a new table and telling .B cron to reload are sent to standard output. .SH BUGS .B Crontab misses a .B \-e option that other implementations of this command allow one to edit the current crontab and install the result. Seems quite handy until you try to install a new crontab from an automated script. That's why this command has a .B \-c option that installs a prepared crontab file. Use .PP .RS .nf crontab \-l >/tmp/tab ${EDITOR\-vi} /tmp/tab crontab \-c /tmp/tab .fi .RE .PP to get the same effect as .BR "crontab \-e" . .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: crontab.1,v 1.3 2000/07/17 18:51:04 philip Exp $ .TH DOSDIR 1 .SH NAME dosdir \- list an MS-DOS directory [IBM] .SH SYNOPSIS \fBdosdir\fR [\fB\-lr\fR] \fIdrive\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-l" "Long listing" .FL "\-r" "Recursively descend and print subdirectories" .SH EXAMPLES .EX "dosdir \-l A" "List root directory on drive A" .EX "dosdir \-r C x/y" "Recursively list directory \fIx/y\fR" .EX "dosdir \-r fd1" "List device \fI/dev/fd1\fR" .SH DESCRIPTION .PP .I Dosdir reads standard IBM PC diskettes or hard disk partitions in \s-2MS-DOS\s+2 format and lists their contents on standard output. Directory names should contain slashes to separate components, even though \s-2MS-DOS\s+2 uses backslashes. The names .I dosdir , .I dosread , and .I doswrite are all links to the same program. The program sees which function to perform by seeing how it was called. A drive code of .I A causes the program to use \fI/dev/dosA\fR, for example, a link to \fI/dev/fd0\fR. Similarly, to have hard disk partition 1 be DOS drive C, \fI/dev/dosC\fR could be a link to \fI/dev/hd1\fR, and so on for other drive codes. A normal device name may also be used instead of a drive code. .TH DOSREAD 1 .SH NAME dosread \- read a file from an MS-DOS diskette [IBM] .SH SYNOPSIS \fBdosread\fR [\fB\-a\fR] \fIdrive \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "ASCII file" .SH EXAMPLES .EX "dosread C g/adv >adv" "Read file \fIg/adv\fR from hard disk" .EX "dosread \-a A prog.c >x" "Read ASCII file \fIprog.c\fR from drive A" .SH DESCRIPTION .PP .I Dosread reads one \s-2MS-DOS\s+2 file and writes it on standard output. The file name must use slash, not backslash as a separator. ASCII files have the final CTRL-Z stripped, and carriage return plus line feed are mapped to line feed only, the usual \s-2MINIX\s+2 convention. See \fBdosdir\fR on the use of single letter drive codes. .TH DOSWRITE 1 .SH NAME doswrite \- write a file onto an MS-DOS diskette [IBM] .SH SYNOPSIS \fBdoswrite\fR [\fB\-a\fR] \fIdrive \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "ASCII file" .SH EXAMPLES .EX "doswrite A x/y &2 .SH BUGS The octal character escape mechanism (\e0\fIdigits\fR) differs from the C language mechanism. .SH AUTHOR Kenneth Almquist. .TH ED 1 .SH NAME ed \- editor .SH SYNOPSIS \fBed \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-" "Suppress line/byte count messages (for in scripts)" .SH EXAMPLES .EX "ed prog.c" "Edit \fIprog.c\fR" .EX "echo '1,$p' | ed - file" "Odd way to write 'cat file'" .SH DESCRIPTION .PP \fIEd\fR is functionally equivalent to the standard V7 editor, ed. It supports the following commands: .PP .nf .ta 0.5i 0.95i (.) a: append (.,.) c: change (.,.) d: delete e: edit new file" f: print name of edited file" (1,$) g: global command (.) i: insert (.,.+1) j: join lines together (.) k: mark (.) l: print with special characters in octal (.,.) m: move (.,.) p: print q: quit editor" (.) r: read in new file (.,.) s: substitute (1,$) v: like g, except select lines that do not match (1,$) w: write out edited file .fi Many of the commands can take one or two addresses, as indicated above. The defaults are shown in parentheses. Thus \fIa\fR appends to the current line, and \fIg\fR works on the whole file as default. The dot refers to the current line. Below is a sample editing session with comments given following the # symbol. .PP .nf .ta 0.5i 2.5i ed prog.c # Edit prog.c 3,20p # Print lines 3 through 20 /whole/ # Find next occurence of \fIwhole\fR s/whole/while/ # Replace \fIwhole\fR by \fIwhile\fR g/Buf/s//BUF/g # Replace \fIBuf\fR by \fIBUF\fR everywhere w # Write the file back q # Exit the editor .fi \fIEd\fR is provided for its sentimental value. If you want a line-oriented editor, try \fIex\fR. If you want a good editor, use \fIelle\fR, \fIelvis\fR, or \fImined\fR. .SH "SEE ALSO" .BR elvis (1), .BR elle (9), .BR mined (9). .TH EJECT 1 .SH NAME eject \- eject removable media .SH SYNOPSIS .B eject .I device .SH DESCRIPTION .B Eject tells a device to eject removable media, usually a floppy or CD-ROM. .B Eject invokes the .B DIOCEJECT ioctl on the device. The media will then be ejected, or allowed to be removed. The call will fail if the device is still in use. .PP Tapes can't be unloaded with this command, use .B mt offline instead. .SH "SEE ALSO" .BR mt (1), .BR hd (4), .BR sd (4). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ELVIS 1 .SH NAME elvis, ex, vi \- The editor .SH SYNOPSIS \fBelvis\fP [\fIflags\fP] [\fB+\fP\fIcmd\fP] [\fIfiles\fP...] .SH DESCRIPTION \fBElvis\fP is a text editor which emulates \fBvi\fP/\fBex\fP. .PP On systems which pass the program name as an argument, such as Unix and Minix, you may also install \fBelvis\fP under the names "ex", "vi", "view", and "input". These extra names would normally be links to elvis; see the "ln" shell command. .PP When \fBelvis\fP is invoked as "vi", it behaves exactly as though it was invoked as "elvis". However, if you invoke \fBelvis\fP as "view", then the readonly option is set as though you had given it the "-R" flag. If you invoke \fBelvis\fP as "ex", then \fBelvis\fP will start up in the colon command mode instead of the visual command mode, as though you had given it the "-e" flag. If you invoke \fBelvis\fP as "input" or "edit", then \fBelvis\fP will start up in input mode, as though the "-i" flag was given. .SH OPTIONS .IP \fB-r\fP To the real vi, this flag means that a previous edit should be recovered. \fBElvis\fP, though, has a separate program, called \fIelvrec\fP(1), for recovering files. When you invoke \fBelvis\fP with -r, \fBelvis\fP will tell you to run \fBelvrec\fP. .IP \fB-R\fP This sets the "readonly" option, so you won't accidentally overwrite a file. .IP "\fB-t\fP \fItag\fP" This causes \fBelvis\fP to start editing at the given tag. .IP "\fB-m\fP [\fIfile\fP]" \fBElvis\fP will search through \fIfile\fP for something that looks like an error message from a compiler. It will then begin editing the source file that caused the error, with the cursor sitting on the line where the error was detected. If you don't explicitly name a \fIfile\fP, then "errlist" is assumed. .IP \fB-e\fP \fBElvis\fP will start up in colon command mode. .IP \fB-v\fP \fBElvis\fP will start up in visual command mode. .IP \fB-i\fP \fBElvis\fP will start up in input mode. .IP "\fB-w\fR \fIwinsize\fR" Sets the "window" option's value to \fIwinsize\fR. .IP "\fB+\fP\fIcommand\fP or \fB-c\fP \fIcommand\fP" If you use the +\fIcommand\fP parameter, then after the first file is loaded \fIcommand\fP is executed as an EX command. A typical example would be "elvis +237 foo", which would cause \fBelvis\fP to start editing foo and then move directly to line 237. The "-c \fIcommand\fP" variant was added for UNIX SysV compatibility. .SH FILES .IP /tmp/elv* During editing, \fBelvis\fP stores text in a temporary file. For UNIX, this file will usually be stored in the /tmp directory, and the first three characters will be "elv". For other systems, the temporary files may be stored someplace else; see the version-specific section of the documentation. .IP tags This is the database used by the \fB:tags\fP command and the \fB-t\fP option. It is usually created by the \fBctags\fP(1) program. .IP ".exrc or elvis.rc" On UNIX-like systems, a file called ".exrc" in your home directory is executed as a series of \fBex\fR commands. A file by the same name may be executed in the current directory, too. On non-UNIX systems, ".exrc" is usually an invalid file name; there, the initialization file is called "elvis.rc" instead. .SH "SEE ALSO" .BR ctags (1), .BR ref (1), .BR virec (1), .BR elvis (9). .PP \fIElvis - A Clone of Vi/Ex\fP, the complete \fBelvis\fP documentation. .SH BUGS There is no LISP support. Certain other features are missing, too. .PP Auto-indent mode is not quite compatible with the real vi. Among other things, 0^D and ^^D don't do what you might expect. .PP Long lines are displayed differently. The real vi wraps long lines onto multiple rows of the screen, but \fBelvis\fP scrolls sideways. .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .PP Many other people have worked to port \fBelvis\fP to various operating systems. To see who deserves credit, run the \fB:version\fP command from within \fBelvis\fP, or look in the system-specific section of the complete documentation. .TH ELVREC 1 .SH NAME elvrec - Recover the modified version of a file after a crash .SH SYNOPSIS .nf \fBelvrec\fP [\fIpreservedfile\fP [\fInewfile\fR]] .fi .SH DESCRIPTION .PP If you're editing a file when \fIelvis\fP dies, the system crashes, or power fails, the most recent version of your text will be preserved. The preserved text is stored in a special directory; it does NOT overwrite your text file automatically. .PP The \fIelvrec\fP program locates the preserved version of a given file, and writes it over the top of your text file -- or to a new file, if you prefer. The recovered file will have nearly all of your changes. .PP To see a list of all recoverable files, run \fIelvrec\fP with no arguments. .SH FILES .IP /usr/preserve/p* The text that was preserved when \fIelvis\fP died. .IP /usr/preserve/Index A text file which lists the names of all preserved files, and the names of the /usr/preserve/p* files which contain their preserved text. .SH BUGS .PP \fIelvrec\fP is very picky about filenames. You must tell it to recover the file using exactly the same pathname as when you were editing it. The simplest way to do this is to go into the same directory that you were editing, and invoke \fIelvrec\fP with the same filename as \fIelvis\fP. If that doesn't work, then try running \fIelvrec\fP with no arguments, to see exactly which pathname it is using for the desired file. .PP Due to the permissions on the /usr/preserve directory, on UNIX systems \fIelvrec\fP must be run as superuser. This is accomplished by making the \fIelvrec\fP executable be owned by "root" and setting its "set user id" bit. .PP If you're editing a nameless buffer when \fIelvis\fP dies, then \fIelvrec\fP will pretend that the file was named "foo". .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .TH EXPAND 1 .SH NAME expand \- convert tabs to spaces .SH SYNOPSIS \fBexpand\fR [\fB\-\fIt1,t2, ...\fR]\fR [\fIfile\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-\fIt\fR" "Tab stop positions" .SH EXAMPLES .EX "expand \-16,32,48,64" "Expand \fIstdin\fR with tabs every 16 columns" .SH DESCRIPTION .PP \fIExpand\fR replaces tabs in the named files with the equivalent numbers of spaces. If no files are listed, \fIstdin\fR is given. If only one tab is given, the rest are multiples of it. The default is a tab every 8 spaces. .SH "SEE ALSO" .BR unexpand (1). .TH EXPR 1 .SH NAME \" Copyright (C) 1989 by Kenneth Almquist. expr, test, [ \- evaluate expressions .SH SYNOPSIS .B expr .I expression .br .B test .I expression .br .B [ .I expression .B ] .SH DESCRIPTION .B Expr evaluates the expression and prints the result. .B Test evaluates the expression without printing the result. The ``['' command is a synonym for .BR test ; when invoked under this name the last argument to .B expr must be a ``]'', which is deleted and not considered part of the expression. .PP Three data types may occur in the .IR expression : string, integer, and boolean. The rules for conversion are as follows: .sp .nr i 2 .ta \nii .in +\nii .ti -\nii \fIstring\fR\->\fIinteger\fR Done via .BR atoi (3). .ti -\nii \fIinteger\fR\->\fIstring\fR Convert to decimal representation. .ti -\nii \fIstring\fR\->\fIboolean\fR "" \-> false, everything else to true. .ti -\nii \fIboolean\fR\->\fIstring\fR false \-> "", true \-> "true". .ti -\nii \fIinteger\fR\->\fIboolean\fR 0 \-> false, everything else to true. .ti -\nii \fIboolean\fR\->\fIinteger\fR false \-> 0, true \-> 1. .in -\nii .PP Any argument to .B expr which is not a legal operator is treated as a string operand of type .BR string . .PP As a special case, if .I expression is omitted, the result is false. .PP We now list the operators. The syntax .sp .ti +8 \fIinteger\fB op \fIinteger\fR \-> \fIboolean\fB (3)\fR .sp means that \fBop\fR is a binary operator which takes operands of type \fIinteger\fR and produces a result of type \fIboolean\fR. The ``(3)'' means that the priority of \fBop\fR is 3. Operands are automatically converted to the appropriate type. The type \fIany\fR is used for operator that take operands of any type. .nr p 1 .de b .TP 0.5i \fI\\$1\fB \\$2 \fI\\$3\fR \-> \\fI\\$4\\fR (\\np) .. .de u .TP 0.5i \\$1 \fI\\$2\fR \-> \\fI\\$3\\fR (\\np) .. .b any \-o any any Returns the value of the left hand operand if the left hand operand would yield .B true if converted to type .BR boolean , and the value of the right hand operand otherwise. The right hand operand is evaluated only if necessary. ``|'' is a synonym for ``\-o''. .nr p \np+1 .b any -a any any Returns the value of the left hand operand if the left hand operand would yield .B false if converted to type .BR boolean , and the value of the right hand operand otherwise. The right hand operand is evaluated only if necessary. ``&'' is a synonym for ``\-a''. .nr p \np+1 .u ! boolean boolean Returns true if the operand is false, and false if the operand is true. .nr p \np+1 .b string = string boolean True if the two strings are equal. .b string != string boolean True if the two strings are not equal. .b integer \-eq integer boolean True if the two operands are equal. .b integer \-ne integer boolean True if the two operands are not equal. .b integer \-gt integer boolean True if the first operand is greater than the second one. .b integer \-lt integer boolean True if the first operand is less than the second one. .b integer \-ge integer boolean True if the first operand is greater than or equal to the second one. .b integer \-le integer boolean True if the first operand is less than or equal to the second one. .nr p \np+1 .b integer + integer integer Add two integers. .b integer \- integer integer Subtract two integers. .nr p \np+1 .b integer * integer integer Multiply two integers. ``*'' is special to the shell, so you generally have to write this operator as ``\e*''. .b integer / integer integer Divide two integers. .b integer % integer integer Returns the remainder when the first operand is divided by the second one. .nr p \np+1 .b string : string "integer or string" The second operand is interpreted as a regular expression (as in the System V .B ed program). This operator attempts to match part (or all) of the first operand with the regular expression. The match must start at the beginning of the first operand. If the regular expression contains \e( \e) pairs, then the result of this operator is the string which is matched by the regular expression between these pairs, or the null string if no match occurred. Otherwise, the result is the number of characters matched by the regular expression, or zero if no no match occurred. .nr p \np+1 .u \-n string integer Returns the number of characters in the string. .u \-z string boolean Returns true if the string contains zero characters. .u \-t integer boolean Returns true if the specified file descriptor is associated with a tty. .PP The remaining operators all deal with files. Except as noted, they return false if the specified file does not exist. The ones dealing with permission use the effective user and group ids of the shell. .u \-r string boolean True if you have read permission on the file. .u \-w string boolean True if you have write permission on the file. .u \-x string boolean True if you have execute permission on the file. .u \-f string boolean True if the file is a regular file. .u \-d string boolean True if the file is a directory. .u \-c string boolean True if the file is a character special file. .u \-b string boolean True if the file is a block special file. .u \-p string boolean True if the file is a named pipe (i.e. a fifo). .u \-u string boolean True if the file is setuid. .u \-g string boolean True if the file is setgid. .u \-k string boolean True if the file has the sticky bit set. .u \-s string "integer or boolean" Returns the size of the file, or 0 if the file does not exist. .u \-h string boolean True if the file is a symlink. This is the only file test operator that does not follow symlinks, all others do. So ``\-d'' and ``\-h'' are both true on a symlink pointing to a directory. ``\-L'' is a synonym for ``\-h''. .SH "EXIT CODE" 0 if the result of .I expression would be .B true if the result were converted to .BR boolean . .br 1 if the result of .I expression would be .B false if the result were converted to .BR boolean . .br 2 if .I expression is syntactically incorrect. .SH EXAMPLES .TP 0.5i filesize=`expr \-s file` Sets the shell variable .I filesize to the size of .IR file . .TP 0.5i if [ \-s file ]; then command; fi Execute .I command if .I file exists and is not empty. .TP 0.5i x=`expr "$x" : '.\\{4\\}\\(.\\{0,3\\}\\)'` Sets .I x to the substring of .I x beginning after the fourth character of .I x and continuing for three characters or until the end of the string, whichever comes first. .TP 0.5i x=`expr X"$x" : X'.\\{4\\}\\(.\\{0,3\\}\\)'` This example is the same as the previous one, but it uses a leading ``X'' to make things work when the value of .I x looks like an operator. .SH BUGS The relational operators of the System V .B expr command are not implemented. .PP Certain features of this version of .B expr are not present in System V, so care should be used when writing portable code. .SH COPYRIGHT Kenneth Almquist. .TH FACTOR 1 .SH NAME factor \- factor an integer less than 2**31 .SH SYNOPSIS \fBfactor \fInumber\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "factor 450180" "Print the prime factors of 450180" .SH DESCRIPTION .PP \fIFactor\fR prints the prime factors of its argument in increasing order. Each factor is printed as many times as it appears in the number. .TH FGREP 1 .SH NAME fgrep \- fixed grep .SH SYNOPSIS \fBfgrep\fR [\fB\-cfhlnsv\fR]\fR [\fIstring_file\fR] [\fIstring\fR] [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Count matching lines and only print count, not the lines" .FL "\-f" "Take strings from file named in following argument" .FL "\-h" "Omit file headers from printout" .FL "\-l" "List file names once only" .FL "\-n" "Each line is preceded by its line number" .FL "\-s" "Status only, no output" .FL "\-v" "Print only lines not matching" .SH EXAMPLES .EX "fgrep % prog.c" "Print lines containing % sign" .EX "fgrep \-f pattern prog.c" "Take strings from \fIpattern\fR" .SH DESCRIPTION .PP \fIFgrep\fR is essentially the same as grep, except that it only searches for lines containing literal strings (no wildcard characters). The pattern may consist of several lines with one string to search on each line. .SH "SEE ALSO" .BR cgrep (1), .BR grep (1). .TH FILE 1 .SH NAME file \- make a guess as to a file's type based on contents .SH SYNOPSIS \fBfile \fIname ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "file a.out ar.h" "Guess at types" .SH DESCRIPTION .PP \fIFile\fR reads the first block of a file and tries to make an intelligent guess about what kind of file it is. It understands about archives, C source programs, executable binaries, shell scripts, and English text. .TH FIND 1 .SH NAME find \- find files meeting a given condition .SH SYNOPSIS \fBfind \fIdirectory \fIexpression\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "find / \-name a.out \-print" "Print all \fIa.out\fR paths" .EX "find /usr/ast ! \-newer f \-ok rm {} \e;" "Ask before removing" .EX "find /usr \-size +20 \-exec mv {} /big \e^;" "move files > 10k" .EX "find / \e( \-name a.out \-o \-name \(fm*.o\(fm \e) \-exec rm {} \e;" "2 conds" .SH DESCRIPTION .PP \fIFind\fR descends the file tree starting at the given directory checking each file in that directory and its subdirectories against a predicate. If the predicate is true, an action is taken. The predicates may be connected by \fB\-a\fR (Boolean and), \fB\-o\fR (Boolean or) and ! (Boolean negation). Each predicate is true under the conditions specified below. The integer \fIn\fR may also be +\fIn\fR to mean any value greater than \fIn\fR, \fI\-n\fR to mean any value less than \fIn\fR, or just \fIn\fR for exactly \fIn\fR. .PP .RS .ta +\w'\-mtime nmm'u .in +\w'\-mtime nmm'u .ti -\w'\-mtime nmm'u \-name s true if current filename is \fIs\fR (include shell wild cards) .ti -\w'\-mtime nmm'u \-size n true if file size is \fIn\fR blocks .ti -\w'\-mtime nmm'u \-inum n true if the current file's i-node number is \fIn\fR .ti -\w'\-mtime nmm'u \-mtime n true if modification time relative to today (in days) is \fIn\fR .ti -\w'\-mtime nmm'u \-links n true if the number of links to the file is \fIn\fR .ti -\w'\-mtime nmm'u \-newer f true if the file is newer than \fIf\fR .ti -\w'\-mtime nmm'u \-perm n true if the file's permission bits = \fIn\fR (\fIn\fR is in octal) .ti -\w'\-mtime nmm'u \-user u true if the uid = \fIu\fR (a numerical value, not a login name) .ti -\w'\-mtime nmm'u \-group g true if the gid = \fIg\fR (a numerical value, not a group name) .ti -\w'\-mtime nmm'u \-type x where \fIx\fR is \fBbcdfug\fR (block, char, dir, regular file, setuid, setgid) .ti -\w'\-mtime nmm'u \-xdev do not cross devices to search mounted file systems .in -\w'\-mtime nmm'u .fi .RE .PP Following the expression can be one of the following, telling what to do when a file is found: .PP .RS .ta +\w'\-mtime nmm'u .in +\w'\-mtime nmm'u .ti -\w'\-mtime nmm'u \-print print the file name on standard output .ti -\w'\-mtime nmm'u \-print0 print the file name terminated by a null character, to be used with .BR "xargs \-0" . (Minix extension). .ti -\w'\-mtime nmm'u \-exec execute a command, {} stands for the file name .ti -\w'\-mtime nmm'u \-ok prompts before executing the command .in -\w'\-mtime nmm'u .RE .SH "SEE ALSO" .BR test (1), .BR xargs (1). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)finger.1 6.4 (Berkeley) 5/10/86 .\" .TH FINGER 1 "May 10, 1986" .UC 4 .SH NAME finger \- user information lookup program .SH SYNOPSIS .B finger [ options ] name ... .SH DESCRIPTION By default .B finger lists the login name, full name, terminal name and write status (as a `*' before the terminal name if write permission is denied), idle time, login time, and office location and phone number (if they are known) for each current UNIX user. (Idle time is minutes if it is a single integer, hours and minutes if a ':' is present, or days and hours if a 'd' is present.) .PP A longer format also exists and is used by .B finger whenever a list of people's names is given. (Account names as well as first and last names of users are accepted.) This format is multi-line, and includes all the information described above as well as the user's home directory and login shell, any plan which the person has placed in the file .B \&.plan in their home directory, and the project on which they are working from the file .B \&.project also in the home directory. .PP .B Finger may be used to lookup users on a remote machine. The format is to specify the user as ``user@host.'' If the user name is left off, the standard format listing is provided on the remote machine. .PP .B Finger options include: .TP .B \-m Match arguments only on user name. .TP .B \-l Force long output format. .TP .B \-p Suppress printing of the .B \&.plan files .TP .B \-s Force short output format. .SH FILES .ta 2i /etc/utmp who file .br /etc/passwd for users names, offices, ... .br /usr/adm/lastlog last login times .br ~/.plan plans .br ~/.project projects .SH "SEE ALSO" .BR chfn (1), .BR w (1), .BR who (1). .SH AUTHOR Earl T. Cohen .SH BUGS Only the first line of the .B .project file is printed. .PP There is no way to pass arguments to the remote machine as .B finger uses an internet standard port. .TH FLEX 1 "26 May 1990" "Version 2.3" .SH NAME flex, lex - fast lexical analyzer generator .SH SYNOPSIS .B flex .B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton] .I [filename ...] .SH DESCRIPTION .I flex is a tool for generating .I scanners: programs which recognized lexical patterns in text. .I flex reads the given input files, or its standard input if no file names are given, for a description of a scanner to generate. The description is in the form of pairs of regular expressions and C code, called .I rules. flex generates as output a C source file, .B lex.yy.c, which defines a routine .B yylex(). This file is compiled and linked with the .B -lfl library to produce an executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding C code. .LP For full documentation, see .B flexdoc(1). This manual entry is intended for use as a quick reference. .SH OPTIONS .I flex has the following options: .TP .B -b Generate backtracking information to .I lex.backtrack. This is a list of scanner states which require backtracking and the input characters on which they do so. By adding rules one can remove backtracking states. If all backtracking states are eliminated and .B -f or .B -F is used, the generated scanner will run faster. .TP .B -c is a do-nothing, deprecated option included for POSIX compliance. .IP .B NOTE: in previous releases of .I flex .B -c specified table-compression options. This functionality is now given by the .B -C flag. To ease the the impact of this change, when .I flex encounters .B -c, it currently issues a warning message and assumes that .B -C was desired instead. In the future this "promotion" of .B -c to .B -C will go away in the name of full POSIX compliance (unless the POSIX meaning is removed first). .TP .B -d makes the generated scanner run in .I debug mode. Whenever a pattern is recognized and the global .B yy_flex_debug is non-zero (which is the default), the scanner will write to .I stderr a line of the form: .nf --accepting rule at line 53 ("the matched text") .fi The line number refers to the location of the rule in the file defining the scanner (i.e., the file that was fed to flex). Messages are also generated when the scanner backtracks, accepts the default rule, reaches the end of its input buffer (or encounters a NUL; the two look the same as far as the scanner's concerned), or reaches an end-of-file. .TP .B -f specifies (take your pick) .I full table or .I fast scanner. No table compression is done. The result is large but fast. This option is equivalent to .B -Cf (see below). .TP .B -i instructs .I flex to generate a .I case-insensitive scanner. The case of letters given in the .I flex input patterns will be ignored, and tokens in the input will be matched regardless of case. The matched text given in .I yytext will have the preserved case (i.e., it will not be folded). .TP .B -n is another do-nothing, deprecated option included only for POSIX compliance. .TP .B -p generates a performance report to stderr. The report consists of comments regarding features of the .I flex input file which will cause a loss of performance in the resulting scanner. .TP .B -s causes the .I default rule (that unmatched scanner input is echoed to .I stdout) to be suppressed. If the scanner encounters input that does not match any of its rules, it aborts with an error. .TP .B -t instructs .I flex to write the scanner it generates to standard output instead of .B lex.yy.c. .TP .B -v specifies that .I flex should write to .I stderr a summary of statistics regarding the scanner it generates. .TP .B -F specifies that the .I fast scanner table representation should be used. This representation is about as fast as the full table representation .RB ( \-f ), and for some sets of patterns will be considerably smaller (and for others, larger). See .B flexdoc(1) for details. .IP This option is equivalent to .B -CF (see below). .TP .B -I instructs .I flex to generate an .I interactive scanner, that is, a scanner which stops immediately rather than looking ahead if it knows that the currently scanned text cannot be part of a longer rule's match. Again, see .B flexdoc(1) for details. .IP Note, .B -I cannot be used in conjunction with .I full or .I fast tables, i.e., the .B -f, -F, -Cf, or .B -CF flags. .TP .B -L instructs .I flex not to generate .B #line directives in .B lex.yy.c. The default is to generate such directives so error messages in the actions will be correctly located with respect to the original .I flex input file, and not to the fairly meaningless line numbers of .B lex.yy.c. .TP .B -T makes .I flex run in .I trace mode. It will generate a lot of messages to .I stdout concerning the form of the input and the resultant non-deterministic and deterministic finite automata. This option is mostly for use in maintaining .I flex. .TP .B -8 instructs .I flex to generate an 8-bit scanner. On some sites, this is the default. On others, the default is 7-bit characters. To see which is the case, check the verbose .B (-v) output for "equivalence classes created". If the denominator of the number shown is 128, then by default .I flex is generating 7-bit characters. If it is 256, then the default is 8-bit characters. .TP .B -C[efmF] controls the degree of table compression. .IP .B -Ce directs .I flex to construct .I equivalence classes, i.e., sets of characters which have identical lexical properties. Equivalence classes usually give dramatic reductions in the final table/object file sizes (typically a factor of 2-5) and are pretty cheap performance-wise (one array look-up per character scanned). .IP .B -Cf specifies that the .I full scanner tables should be generated - .I flex should not compress the tables by taking advantages of similar transition functions for different states. .IP .B -CF specifies that the alternate fast scanner representation (described in .B flexdoc(1)) should be used. .IP .B -Cm directs .I flex to construct .I meta-equivalence classes, which are sets of equivalence classes (or characters, if equivalence classes are not being used) that are commonly used together. Meta-equivalence classes are often a big win when using compressed tables, but they have a moderate performance impact (one or two "if" tests and one array look-up per character scanned). .IP A lone .B -C specifies that the scanner tables should be compressed but neither equivalence classes nor meta-equivalence classes should be used. .IP The options .B -Cf or .B -CF and .B -Cm do not make sense together - there is no opportunity for meta-equivalence classes if the table is not being compressed. Otherwise the options may be freely mixed. .IP The default setting is .B -Cem, which specifies that .I flex should generate equivalence classes and meta-equivalence classes. This setting provides the highest degree of table compression. You can trade off faster-executing scanners at the cost of larger tables with the following generally being true: .nf slowest & smallest -Cem -Cm -Ce -C -C{f,F}e -C{f,F} fastest & largest .fi .IP .B -C options are not cumulative; whenever the flag is encountered, the previous -C settings are forgotten. .TP .B -Sskeleton_file overrides the default skeleton file from which .I flex constructs its scanners. You'll never need this option unless you are doing .I flex maintenance or development. .SH SUMMARY OF FLEX REGULAR EXPRESSIONS The patterns in the input are written using an extended set of regular expressions. These are: .nf x match the character 'x' . any character except newline [xyz] a "character class"; in this case, the pattern matches either an 'x', a 'y', or a 'z' [abj-oZ] a "character class" with a range in it; matches an 'a', a 'b', any letter from 'j' through 'o', or a 'Z' [^A-Z] a "negated character class", i.e., any character but those in the class. In this case, any character EXCEPT an uppercase let+!-!.!/!0!1!2!3!4!5!6!7!8!9!ter. [^A-Z\\n] any character EXCEPT an uppercase letter or a newline r* zero or more r's, where r is any regular expression r+ one or more r's r? zero or one r's (that is, "an optional r") r{2,5} anywhere from two to five r's r{2,} two or more r's r{4} exactly 4 r's {name} the expansion of the "name" definition (see above) "[xyz]\\"foo" the literal string: [xyz]"foo \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v', then the ANSI-C interpretation of \\x. Otherwise, a literal 'X' (used to escape operators such as '*') \\123 the character with octal value 123 \\x2a the character with hexadecimal value 2a (r) match an r; parentheses are used to override precedence (see below) rs the regular expression r followed by the regular expression s; called "concatenation" r|s either an r or an s r/s an r but only if it is followed by an s. The s is not part of the matched text. This type of pattern is called as "trailing context". ^r an r, but only at the beginning of a line r$ an r, but only at the end of a line. Equivalent to "r/\\n". r an r, but only in start condition s (see below for discussion of start conditions) r same, but in any of start conditions s1, s2, or s3 <> an end-of-file <> an end-of-file when in start condition s1 or s2 .fi The regular expressions listed above are grouped according to precedence, from highest precedence at the top to lowest at the bottom. Those grouped together have equal precedence. .LP Some notes on patterns: .IP - Negated character classes .I match newlines unless "\\n" (or an equivalent escape sequence) is one of the characters explicitly present in the negated character class (e.g., "[^A-Z\\n]"). .IP - A rule can have at most one instance of trailing context (the '/' operator or the '$' operator). The start condition, '^', and "<>" patterns can only occur at the beginning of a pattern, and, as well as with '/' and '$', cannot be grouped inside parentheses. The following are all illegal: .nf foo/bar$ foo|(bar$) foo|^bar foobar .fi .SH SUMMARY OF SPECIAL ACTIONS In addition to arbitrary C code, the following can appear in actions: .IP - .B ECHO copies yytext to the scanner's output. .IP - .B BEGIN followed by the name of a start condition places the scanner in the corresponding start condition. .IP - .B REJECT directs the scanner to proceed on to the "second best" rule which matched the input (or a prefix of the input). .B yytext and .B yyleng are set up appropriately. Note that .B REJECT is a particularly expensive feature in terms scanner performance; if it is used in .I any of the scanner's actions it will slow down .I all of the scanner's matching. Furthermore, .B REJECT cannot be used with the .I -f or .I -F options. .IP Note also that unlike the other special actions, .B REJECT is a .I branch; code immediately following it in the action will .I not be executed. .IP - .B yymore() tells the scanner that the next time it matches a rule, the corresponding token should be .I appended onto the current value of .B yytext rather than replacing it. .IP - .B yyless(n) returns all but the first .I n characters of the current token back to the input stream, where they will be rescanned when the scanner looks for the next match. .B yytext and .B yyleng are adjusted appropriately (e.g., .B yyleng will now be equal to .I n ). .IP - .B unput(c) puts the character .I c back onto the input stream. It will be the next character scanned. .IP - .B input() reads the next character from the input stream (this routine is called .B yyinput() if the scanner is compiled using .B C++). .IP - .B yyterminate() can be used in lieu of a return statement in an action. It terminates the scanner and returns a 0 to the scanner's caller, indicating "all done". .IP By default, .B yyterminate() is also called when an end-of-file is encountered. It is a macro and may be redefined. .IP - .B YY_NEW_FILE is an action available only in <> rules. It means "Okay, I've set up a new input file, continue scanning". .IP - .B yy_create_buffer( file, size ) takes a .I FILE pointer and an integer .I size. It returns a YY_BUFFER_STATE handle to a new input buffer large enough to accomodate .I size characters and associated with the given file. When in doubt, use .B YY_BUF_SIZE for the size. .IP - .B yy_switch_to_buffer( new_buffer ) switches the scanner's processing to scan for tokens from the given buffer, which must be a YY_BUFFER_STATE. .IP - .B yy_delete_buffer( buffer ) deletes the given buffer. .SH VALUES AVAILABLE TO THE USER .IP - .B char *yytext holds the text of the current token. It may not be modified. .IP - .B int yyleng holds the length of the current token. It may not be modified. .IP - .B FILE *yyin is the file which by default .I flex reads from. It may be redefined but doing so only makes sense before scanning begins. Changing it in the middle of scanning will have unexpected results since .I flex buffers its input. Once scanning terminates because an end-of-file has been seen, .B void yyrestart( FILE *new_file ) may be called to point .I yyin at the new input file. .IP - .B FILE *yyout is the file to which .B ECHO actions are done. It can be reassigned by the user. .IP - .B YY_CURRENT_BUFFER returns a .B YY_BUFFER_STATE handle to the current buffer. .SH MACROS THE USER CAN REDEFINE .IP - .B YY_DECL controls how the scanning routine is declared. By default, it is "int yylex()", or, if prototypes are being used, "int yylex(void)". This definition may be changed by redefining the "YY_DECL" macro. Note that if you give arguments to the scanning routine using a K&R-style/non-prototyped function declaration, you must terminate the definition with a semi-colon (;). .IP - The nature of how the scanner gets its input can be controlled by redefining the .B YY_INPUT macro. YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its action is to place up to .I max_size characters in the character array .I buf and return in the integer variable .I result either the number of characters read or the constant YY_NULL (0 on Unix systems) to indicate EOF. The default YY_INPUT reads from the global file-pointer "yyin". A sample redefinition of YY_INPUT (in the definitions section of the input file): .nf %{ #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %} .fi .IP - When the scanner receives an end-of-file indication from YY_INPUT, it then checks the .B yywrap() function. If .B yywrap() returns false (zero), then it is assumed that the function has gone ahead and set up .I yyin to point to another input file, and scanning continues. If it returns true (non-zero), then the scanner terminates, returning 0 to its caller. .IP The default .B yywrap() always returns 1. Presently, to redefine it you must first "#undef yywrap", as it is currently implemented as a macro. It is likely that .B yywrap() will soon be defined to be a function rather than a macro. .IP - YY_USER_ACTION can be redefined to provide an action which is always executed prior to the matched rule's action. .IP - The macro .B YY_USER_INIT may be redefined to provide an action which is always executed before the first scan. .IP - In the generated scanner, the actions are all gathered in one large switch statement and separated using .B YY_BREAK, which may be redefined. By default, it is simply a "break", to separate each rule's action from the following rule's. .SH FILES .TP .I flex.skel skeleton scanner. .TP .I lex.yy.c generated scanner (called .I lexyy.c on some systems). .TP .I lex.backtrack backtracking information for .B -b flag (called .I lex.bck on some systems). .TP .B -lfl library with which to link the scanners. .SH "SEE ALSO" .LP flexdoc(1), lex(1), yacc(1), sed(1), awk(1). .LP M. E. Lesk and E. Schmidt, .I LEX - Lexical Analyzer Generator .SH DIAGNOSTICS .I reject_used_but_not_detected undefined or .LP .I yymore_used_but_not_detected undefined - These errors can occur at compile time. They indicate that the scanner uses .B REJECT or .B yymore() but that .I flex failed to notice the fact, meaning that .I flex scanned the first two sections looking for occurrences of these actions and failed to find any, but somehow you snuck some in (via a #include file, for example). Make an explicit reference to the action in your .I flex input file. (Note that previously .I flex supported a .B %used/%unused mechanism for dealing with this problem; this feature is still supported but now deprecated, and will go away soon unless the author hears from people who can argue compellingly that they need it.) .LP .I flex scanner jammed - a scanner compiled with .B -s has encountered an input string which wasn't matched by any of its rules. .LP .I flex input buffer overflowed - a scanner rule matched a string long enough to overflow the scanner's internal input buffer (16K bytes - controlled by .B YY_BUF_MAX in "flex.skel"). .LP .I scanner requires -8 flag - Your scanner specification includes recognizing 8-bit characters and you did not specify the -8 flag (and your site has not installed flex with -8 as the default). .LP .I fatal flex scanner internal error--end of buffer missed - This can occur in an scanner which is reentered after a long-jump has jumped out (or over) the scanner's activation frame. Before reentering the scanner, use: .nf yyrestart( yyin ); .fi .LP .I too many %t classes! - You managed to put every single character into its own %t class. .I flex requires that at least one of the classes share characters. .SH AUTHOR Vern Paxson, with the help of many ideas and much inspiration from Van Jacobson. Original version by Jef Poskanzer. .LP See flexdoc(1) for additional credits and the address to send comments to. .SH DEFICIENCIES / BUGS .LP Some trailing context patterns cannot be properly matched and generate warning messages ("Dangerous trailing context"). These are patterns where the ending of the first part of the rule matches the beginning of the second part, such as "zx*/xy*", where the 'x*' matches the 'x' at the beginning of the trailing context. (Note that the POSIX draft states that the text matched by such patterns is undefined.) .LP For some trailing context rules, parts which are actually fixed-length are not recognized as such, leading to the abovementioned performance loss. In particular, parts using '|' or {n} (such as "foo{3}") are always considered variable-length. .LP Combining trailing context with the special '|' action can result in .I fixed trailing context being turned into the more expensive .I variable trailing context. For example, this happens in the following example: .nf %% abc | xyz/def .fi .LP Use of unput() invalidates yytext and yyleng. .LP Use of unput() to push back more text than was matched can result in the pushed-back text matching a beginning-of-line ('^') rule even though it didn't come at the beginning of the line (though this is rare!). .LP Pattern-matching of NUL's is substantially slower than matching other characters. .LP .I flex does not generate correct #line directives for code internal to the scanner; thus, bugs in .I flex.skel yield bogus line numbers. .LP Due to both buffering of input and read-ahead, you cannot intermix calls to routines, such as, for example, .B getchar(), with .I flex rules and expect it to work. Call .B input() instead. .LP The total table entries listed by the .B -v flag excludes the number of table entries needed to determine what rule has been matched. The number of entries is equal to the number of DFA states if the scanner does not use .B REJECT, and somewhat greater than the number of states if it does. .LP .B REJECT cannot be used with the .I -f or .I -F options. .LP Some of the macros, such as .B yywrap(), may in the future become functions which live in the .B -lfl library. This will doubtless break a lot of code, but may be required for POSIX-compliance. .LP The .I flex internal algorithms need documentation. .TH FLEX 1 "26 May 1990" "Version 2.3" .SH NAME flexdoc - fast lexical analyzer generator .SH SYNOPSIS .B flex .B [-bcdfinpstvFILT8 -C[efmF] -Sskeleton] .I [filename ...] .SH DESCRIPTION .I flex is a tool for generating .I scanners: programs which recognized lexical patterns in text. .I flex reads the given input files, or its standard input if no file names are given, for a description of a scanner to generate. The description is in the form of pairs of regular expressions and C code, called .I rules. flex generates as output a C source file, .B lex.yy.c, which defines a routine .B yylex(). This file is compiled and linked with the .B -lfl library to produce an executable. When the executable is run, it analyzes its input for occurrences of the regular expressions. Whenever it finds one, it executes the corresponding C code. .SH SOME SIMPLE EXAMPLES .LP First some simple examples to get the flavor of how one uses .I flex. The following .I flex input specifies a scanner which whenever it encounters the string "username" will replace it with the user's login name: .nf %% username printf( "%s", getlogin() ); .fi By default, any text not matched by a .I flex scanner is copied to the output, so the net effect of this scanner is to copy its input file to its output with each occurrence of "username" expanded. In this input, there is just one rule. "username" is the .I pattern and the "printf" is the .I action. The "%%" marks the beginning of the rules. .LP Here's another simple example: .nf int num_lines = 0, num_chars = 0; %% \\n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\\n", num_lines, num_chars ); } .fi This scanner counts the number of characters and the number of lines in its input (it produces no output other than the final report on the counts). The first line declares two globals, "num_lines" and "num_chars", which are accessible both inside .B yylex() and in the .B main() routine declared after the second "%%". There are two rules, one which matches a newline ("\\n") and increments both the line count and the character count, and one which matches any character other than a newline (indicated by the "." regular expression). .LP A somewhat more complicated example: .nf /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\\n", yytext ); } {ID} printf( "An identifier: %s\\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\\n", yytext ); "{"[^}\\n]*"}" /* eat up one-line comments */ [ \\t\\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } .fi This is the beginnings of a simple scanner for a language like Pascal. It identifies different types of .I tokens and reports on what it has seen. .LP The details of this example will be explained in the following sections. .SH FORMAT OF THE INPUT FILE The .I flex input file consists of three sections, separated by a line with just .B %% in it: .nf definitions %% rules %% user code .fi The .I definitions section contains declarations of simple .I name definitions to simplify the scanner specification, and declarations of .I start conditions, which are explained in a later section. .LP Name definitions have the form: .nf name definition .fi The "name" is a word beginning with a letter or an underscore ('_') followed by zero or more letters, digits, '_', or '-' (dash). The definition is taken to begin at the first non-white-space character following the name and continuing to the end of the line. The definition can subsequently be referred to using "{name}", which will expand to "(definition)". For example, .nf DIGIT [0-9] ID [a-z][a-z0-9]* .fi defines "DIGIT" to be a regular expression which matches a single digit, and "ID" to be a regular expression which matches a letter followed by zero-or-more letters-or-digits. A subsequent reference to .nf {DIGIT}+"."{DIGIT}* .fi is identical to .nf ([0-9])+"."([0-9])* .fi and matches one-or-more digits followed by a '.' followed by zero-or-more digits. .LP The .I rules section of the .I flex input contains a series of rules of the form: .nf pattern action .fi where the pattern must be unindented and the action must begin on the same line. .LP See below for a further description of patterns and actions. .LP Finally, the user code section is simply copied to .B lex.yy.c verbatim. It is used for companion routines which call or are called by the scanner. The presence of this section is optional; if it is missing, the second .B %% in the input file may be skipped, too. .LP In the definitions and rules sections, any .I indented text or text enclosed in .B %{ and .B %} is copied verbatim to the output (with the %{}'s removed). The %{}'s must appear unindented on lines by themselves. .LP In the rules section, any indented or %{} text appearing before the first rule may be used to declare variables which are local to the scanning routine and (after the declarations) code which is to be executed whenever the scanning routine is entered. Other indented or %{} text in the rule section is still copied to the output, but its meaning is not well-defined and it may well cause compile-time errors (this feature is present for .I POSIX compliance; see below for other such features). .LP In the definitions section, an unindented comment (i.e., a line beginning with "/*") is also copied verbatim to the output up to the next "*/". Also, any line in the definitions section beginning with '#' is ignored, though this style of comment is deprecated and may go away in the future. .SH PATTERNS The patterns in the input are written using an extended set of regular expressions. These are: .nf x match the character 'x' . any character except newline [xyz] a "character class"; in this case, the pattern matches either an 'x', a 'y', or a 'z' [abj-oZ] a "character class" with a range in it; matches an 'a', a 'b', any letter from 'j' through 'o', or a 'Z' [^A-Z] a "negated character class", i.e., any character but those in the class. In this case, any character EXCEPT an uppercase letter. [^A-Z\\n] any character EXCEPT an uppercase letter or a newline r* zero or more r's, where r is any regular expression r+ one or more r's r? zero or one r's (that is, "an optional r") r{2,5} anywhere from two to five r's r{2,} two or more r's r{4} exactly 4 r's {name} the expansion of the "name" definition (see above) "[xyz]\\"foo" the literal string: [xyz]"foo \\X if X is an 'a', 'b', 'f', 'n', 'r', 't', or 'v', then the ANSI-C interpretation of \\x. Otherwise, a literal 'X' (used to escape operators such as '*') \\123 the character with octal value 123 \\x2a the character with hexadecimal value 2a (r) match an r; parentheses are used to override precedence (see below) rs the regular expression r followed bA!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!y the regular expression s; called "concatenation" r|s either an r or an s r/s an r but only if it is followed by an s. The s is not part of the matched text. This type of pattern is called as "trailing context". ^r an r, but only at the beginning of a line r$ an r, but only at the end of a line. Equivalent to "r/\\n". r an r, but only in start condition s (see below for discussion of start conditions) r same, but in any of start conditions s1, s2, or s3 <> an end-of-file <> an end-of-file when in start condition s1 or s2 .fi The regular expressions listed above are grouped according to precedence, from highest precedence at the top to lowest at the bottom. Those grouped together have equal precedence. For example, .nf foo|bar* .fi is the same as .nf (foo)|(ba(r*)) .fi since the '*' operator has higher precedence than concatenation, and concatenation higher than alternation ('|'). This pattern therefore matches .I either the string "foo" .I or the string "ba" followed by zero-or-more r's. To match "foo" or zero-or-more "bar"'s, use: .nf foo|(bar)* .fi and to match zero-or-more "foo"'s-or-"bar"'s: .nf (foo|bar)* .fi .LP Some notes on patterns: .IP - A negated character class such as the example "[^A-Z]" above .I will match a newline unless "\\n" (or an equivalent escape sequence) is one of the characters explicitly present in the negated character class (e.g., "[^A-Z\\n]"). This is unlike how many other regular expression tools treat negated character classes, but unfortunately the inconsistency is historically entrenched. Matching newlines means that a pattern like [^"]* can match an entire input (overflowing the scanner's input buffer) unless there's another quote in the input. .IP - A rule can have at most one instance of trailing context (the '/' operator or the '$' operator). The start condition, '^', and "<>" patterns can only occur at the beginning of a pattern, and, as well as with '/' and '$', cannot be grouped inside parentheses. A '^' which does not occur at the beginning of a rule or a '$' which does not occur at the end of a rule loses its special properties and is treated as a normal character. .IP The following are illegal: .nf foo/bar$ foobar .fi Note that the first of these, can be written "foo/bar\\n". .IP The following will result in '$' or '^' being treated as a normal character: .nf foo|(bar$) foo|^bar .fi If what's wanted is a "foo" or a bar-followed-by-a-newline, the following could be used (the special '|' action is explained below): .nf foo | bar$ /* action goes here */ .fi A similar trick will work for matching a foo or a bar-at-the-beginning-of-a-line. .SH HOW THE INPUT IS MATCHED When the generated scanner is run, it analyzes its input looking for strings which match any of its patterns. If it finds more than one match, it takes the one matching the most text (for trailing context rules, this includes the length of the trailing part, even though it will then be returned to the input). If it finds two or more matches of the same length, the rule listed first in the .I flex input file is chosen. .LP Once the match is determined, the text corresponding to the match (called the .I token) is made available in the global character pointer .B yytext, and its length in the global integer .B yyleng. The .I action corresponding to the matched pattern is then executed (a more detailed description of actions follows), and then the remaining input is scanned for another match. .LP If no match is found, then the .I default rule is executed: the next character in the input is considered matched and copied to the standard output. Thus, the simplest legal .I flex input is: .nf %% .fi which generates a scanner that simply copies its input (one character at a time) to its output. .SH ACTIONS Each pattern in a rule has a corresponding action, which can be any arbitrary C statement. The pattern ends at the first non-escaped whitespace character; the remainder of the line is its action. If the action is empty, then when the pattern is matched the input token is simply discarded. For example, here is the specification for a program which deletes all occurrences of "zap me" from its input: .nf %% "zap me" .fi (It will copy all other characters in the input to the output since they will be matched by the default rule.) .LP Here is a program which compresses multiple blanks and tabs down to a single blank, and throws away whitespace found at the end of a line: .nf %% [ \\t]+ putchar( ' ' ); [ \\t]+$ /* ignore this token */ .fi .LP If the action contains a '{', then the action spans till the balancing '}' is found, and the action may cross multiple lines. .I flex knows about C strings and comments and won't be fooled by braces found within them, but also allows actions to begin with .B %{ and will consider the action to be all the text up to the next .B %} (regardless of ordinary braces inside the action). .LP An action consisting solely of a vertical bar ('|') means "same as the action for the next rule." See below for an illustration. .LP Actions can include arbitrary C code, including .B return statements to return a value to whatever routine called .B yylex(). Each time .B yylex() is called it continues processing tokens from where it last left off until it either reaches the end of the file or executes a return. Once it reaches an end-of-file, however, then any subsequent call to .B yylex() will simply immediately return, unless .B yyrestart() is first called (see below). .LP Actions are not allowed to modify yytext or yyleng. .LP There are a number of special directives which can be included within an action: .IP - .B ECHO copies yytext to the scanner's output. .IP - .B BEGIN followed by the name of a start condition places the scanner in the corresponding start condition (see below). .IP - .B REJECT directs the scanner to proceed on to the "second best" rule which matched the input (or a prefix of the input). The rule is chosen as described above in "How the Input is Matched", and .B yytext and .B yyleng set up appropriately. It may either be one which matched as much text as the originally chosen rule but came later in the .I flex input file, or one which matched less text. For example, the following will both count the words in the input and call the routine special() whenever "frob" is seen: .nf int word_count = 0; %% frob special(); REJECT; [^ \\t\\n]+ ++word_count; .fi Without the .B REJECT, any "frob"'s in the input would not be counted as words, since the scanner normally executes only one action per token. Multiple .B REJECT's are allowed, each one finding the next best choice to the currently active rule. For example, when the following scanner scans the token "abcd", it will write "abcdabcaba" to the output: .nf %% a | ab | abc | abcd ECHO; REJECT; .|\\n /* eat up any unmatched character */ .fi (The first three rules share the fourth's action since they use the special '|' action.) .B REJECT is a particularly expensive feature in terms scanner performance; if it is used in .I any of the scanner's actions it will slow down .I all of the scanner's matching. Furthermore, .B REJECT cannot be used with the .I -f or .I -F options (see below). .IP Note also that unlike the other special actions, .B REJECT is a .I branch; code immediately following it in the action will .I not be executed. .IP - .B yymore() tells the scanner that the next time it matches a rule, the corresponding token should be .I appended onto the current value of .B yytext rather than replacing it. For example, given the input "mega-kludge" the following will write "mega-mega-kludge" to the output: .nf %% mega- ECHO; yymore(); kludge ECHO; .fi First "mega-" is matched and echoed to the output. Then "kludge" is matched, but the previous "mega-" is still hanging around at the beginning of .B yytext so the .B ECHO for the "kludge" rule will actually write "mega-kludge". The presence of .B yymore() in the scanner's action entails a minor performance penalty in the scanner's matching speed. .IP - .B yyless(n) returns all but the first .I n characters of the current token back to the input stream, where they will be rescanned when the scanner looks for the next match. .B yytext and .B yyleng are adjusted appropriately (e.g., .B yyleng will now be equal to .I n ). For example, on the input "foobar" the following will write out "foobarbar": .nf %% foobar ECHO; yyless(3); [a-z]+ ECHO; .fi An argument of 0 to .B yyless will cause the entire current input string to be scanned again. Unless you've changed how the scanner will subsequently process its input (using .B BEGIN, for example), this will result in an endless loop. .IP - .B unput(c) puts the character .I c back onto the input stream. It will be the next character scanned. The following action will take the current token and cause it to be rescanned enclosed in parentheses. .nf { int i; unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yytext[i] ); unput( '(' ); } .fi Note that since each .B unput() puts the given character back at the .I beginning of the input stream, pushing back strings must be done back-to-front. .IP - .B input() reads the next character from the input stream. For example, the following is one way to eat up C comments: .nf %% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } } .fi (Note that if the scanner is compiled using .B C++, then .B input() is instead referred to as .B yyinput(), in order to avoid a name clash with the .B C++ stream by the name of .I input.) .IP - .B yyterminate() can be used in lieu of a return statement in an action. It terminates the scanner and returns a 0 to the scanner's caller, indicating "all done". Subsequent calls to the scanner will immediately return unless preceded by a call to .B yyrestart() (see below). By default, .B yyterminate() is also called when an end-of-file is encountered. It is a macro and may be redefined. .SH THE GENERATED SCANNER The output of .I flex is the file .B lex.yy.c, which contains the scanning routine .B yylex(), a number of tables used by it for matching tokens, and a number of auxiliary routines and macros. By default, .B yylex() is declared as follows: .nf int yylex() { ... various definitions and the actions in here ... } .fi (If your environment supports function prototypes, then it will be "int yylex( void )".) This definition may be changed by redefining the "YY_DECL" macro. For example, you could use: .nf #undef YY_DECL #define YY_DECL float lexscan( a, b ) float a, b; .fi to give the scanning routine the name .I lexscan, returning a float, and taking two floats as arguments. Note that if you give arguments to the scanning routine using a K&R-style/non-prototyped function declaration, you must terminate the definition with a semi-colon (;). .LP Whenever .B yylex() is called, it scans tokens from the global input file .I yyin (which defaults to stdin). It continues until it either reaches an end-of-file (at which point it returns the value 0) or one of its actions executes a .I return statement. In the former case, when called again the scanner will immediately return unless .B yyrestart() is called to point .I yyin at the new input file. ( .B yyrestart() takes one argument, a .B FILE * pointer.) In the latter case (i.e., when an action executes a return), the scanner may then be called again and it will resume scanning where it left off. .LP By default (and for purposes of efficiency), the scanner uses block-reads rather than simple .I getc() calls to read characters from .I yyin. The nature of how it gets its input can be controlled by redefining the .B YY_INPUT macro. YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its action is to place up to .I max_size characters in the character array .I buf and return in the integer variable .I result either the number of characters read or the constant YY_NULL (0 on Unix systems) to indicate EOF. The default YY_INPUT reads from the global file-pointer "yyin". .LP A sample redefinition of YY_INPUT (in the definitions section of the input file): .nf %{ #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %} .fi This definition will change the input processing to occur one character at a time. .LP You also can add in things like keeping track of the input line number this way; but don't expect your scanner to go very fast. .LP When the scanner receives an end-of-file indication from YY_INPUT, it then checks the .B yywrap() function. If .B yywrap() returns false (zero), then it is assumed that the function has gone ahead and set up .I yyin to point to another input file, and scanning continues. If it returns true (non-zero), then the scanner terminates, returning 0 to its caller. .LP The default .B yywrap() always returns 1. Presently, to redefine it you must first "#undef yywrap", as it is currently implemented as a macro. As indicated by the hedging in the previous sentence, it may be changed to a true function in the near future. .LP The scanner writes its .B ECHO output to the .I yyout global (default, stdout), which may be redefined by the user simply by assigning it to some other .B FILE pointer. .SH START CONDITIONS .I flex provides a mechanism for conditionally activating rules. Any rule whose pattern is prefixed with "" will only be active when the scanner is in the start condition named "sc". For example, .nf [^"]* { /* eat up the string body ... */ ... } .fi will be active only when the scanner is in the "STRING" start condition, and .nf \\. { /* handle an escape ... */ ... } .fi will be active only when the current start condition is either "INITIAL", "STRING", or "QUOTE". .LP Start conditions are declared in the definitions (first) section of the input using unindented lines beginning with either .B %s or .B %x followed by a list of names. The former declares .I inclusive start conditions, the latter .I exclusive start conditions. A start condition is activated using the .B BEGIN action. Until the next .B BEGIN action is executed, rules with the given start condition will be active and rules with other start conditions will be inactive. If the start condition is .I inclusive, then rules with no start conditions at all will also be active. If it is .I exclusive, then .I only rules qualified with the start condition will be active. A set of rules contingent on the same exclusive start condition describe a scanner which is independent of any of the other rules in the .I flex input. Because of this, exclusive start conditions make it easy to specify "mini-scanners" which scan portions of the input that are syntactically different from the rest (e.g., comments). .LP If the distinction between inclusive and exclusive start conditions is still a little vague, here's a simple example illustrating the connection between the two. The set of rules: .nf %s example %% foo /* do something */ .fi is equivalent to .nf %x example %% foo /* do something */ .fi .LP The default rule (to .B ECHO any unmatched character) remains active in start conditions. .LP .B BEGIN(0) returns to the original state where only the rules with no start conditions are active. This state can also be referred to as the start-condition "INITIAL", so .B BEGIN(INITIAL) is equivalent to .B BEGIN(0). (The parentheses around the start condition name are not required but are considered good style.) .LP .B BEGIN actions can also be given as indented code at the beginning of the rules section. For example, the following will cause the scanner to enter the "SPECIAL" start condition whenever .I yylex() is called and the global variable .I enter_special is true: .nf int enter_special; %x SPECIAL %% if ( enter_special ) BEGIN(SPECIAL); blahblahblah ...more rules follow... .fi .LP To illustrate the uses of start conditions, here is a scanner which provides two different interpretations of a string like "123.456". By default it will treat it as as three tokens, the integer "123", a dot ('.'), and the integer "456". But if the string is preceded earlier in the line by the string "expect-floats" it will treat it as a single token, the floating-point number 123.456: .nf %{ #include %} %s expect %% expect-floats BEGIN(expect); [0-9]+"."[0-9]+ { printf( "found a float, = %f\\n", atof( yytext ) ); } \\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); } [0-9]+ { printf( "found an integer, = %d\\n", atoi( yytext ) ); } "." printf( "found a dot\\n" ); .fi Here is a scanner which recognizes (and discards) C comments while maintaining a count of the current input line. .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi Note that start-conditions names are really integer values and can be stored as such. Thus, the above could be extended in the following fashion: .nf %x comment foo %% int line_num = 1; int comment_caller; "/*" { comment_caller = INITIAL; BEGIN(comment); } ... "/*" { comment_caller = foo; BEGIN(comment); } [^*\\n]* /* eat anything that's not a '*' */ "*"+[^*/\\n]* /* eat up '*'s not followed by '/'s */ \\n ++line_num; "*"+"/" BEGIN(comment_caller); .fi One can then implement a "stack" of start conditions using an array of integers. (It is likely that such stacks will become a full-fledged .I flex feature in the future.) Note, though, that start conditions do not have their own name-space; %s's and %x's declare names in the same fashion as #define's. .SH MULTIPLE INPUT BUFFERS Some scanners (such as those which support "include" files) require reading from several input streams. As .I flex scanners do a large amount of buffering, one cannot control where the next input will be read from by simply writing a .B YY_INPUT which is sensitive to the scanning context. .B YY_INPUT is only called when the scanner reaches the end of its buffer, which may be a long time after scanning a statement such as an "include" which requires switching the input source. .LP To negotiate these sorts of problems, .I flex provides a mechanism for creating and switching between multiple input buffers. An input buffer is created by using: .nf YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) .fi which takes a .I FILE pointer and a size and creates a buffer associated with the given file and large enough to hold .I size characters (when in doubt, use .B YY_BUF_SIZE for the size). It returns a .B YY_BUFFER_STATE handle, which may then be passed to other routines: .nf void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) .fi switches the scanner's input buffer so subsequent tokens will come from .I new_buffer. Note that .B yy_switch_to_buffer() may be used by yywrap() to sets things up for continued scanning, instead of opening a new file and pointing .I yyin at it. .nf void yy_delete_buffer( YY_BUFFER_STATE buffer ) .fi is used to reclaim the storage associated with a buffer. .LP .B yy_new_buffer() is an alias for .B yy_create_buffer(), provided for compatibility with the C++ use of .I new and .I delete for creating and destroying dynamic objects. .LP Finally, the .B YY_CURRENT_BUFFER macro returns a .B YY_BUFFER_STATE handle to the current buffer. .LP Here is an example of using these features for writing a scanner which expands include files (the .B <> feature is discussed below): .nf /* the "incl" state is used for picking up the name * of an include file */ %x incl %{ #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; %} %% include BEGIN(incl); [a-z]+ ECHO; [^a-z\\n]*\\n? ECHO; [ \\t]* /* eat the whitespace */ [^ \\t\\n]+ { /* got the include file name */ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "Includes nested too deeply" ); exit( 1 ); } include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ) error( ... ); yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) ); BEGIN(INITIAL); } <> { if ( --include_stack_ptr < 0 ) { yyterminate(); } else yy_switch_to_buffer( include_stack[include_stack_ptr] ); } .fi .SH END-OF-FILE RULES The special rule "<>" indicates actions which are to be taken when an end-of-file is encountered and yywrap() returns non-zero (i.e., indicates no further files to process). The action must finish by doing one of four things: .IP - the special .B YY_NEW_FILE action, if .I yyin has been pointed at a new file to process; .IP - a .I return statement; .IP - the special .B yyterminate() action; .IP - or, switching to a new buffer using .B yy_switch_to_buffer() as shown in the example above. .LP <> rules may not be used with other patterns; they may only be qualified with a list of start conditions. If an unqualified <> rule is given, it applies to .I all start conditions which do not already have <> actions. To specify an <> rule for only the initial start condition, use .nf <> .fi .LP These rules are useful for catching things like unclosed comments. An example: .nf %x quote %% ...other rules for dealing with quotes... <> { error( "unterminated quote" ); yyterminate(); } <> { if ( *++filelist ) { yyin = fopen( *filelist, "r" ); YY_NEW_FILE; } else yyterminate(); } .fi .SH MISCELLANEOUS MACROS The macro .B YY_USER_ACTION can be redefined to provide an action which is always executed prior to the matched rule's action. For example, it could be #define'd to call a routine to convert yytext to lower-case. .LP The macro .B YY_USER_INIT may be redefined to provide an action which is always executed before the first scan (and before the scanner's internal initializations are done). For example, it could be used to call a routine to read in a data table or open a logging file. .LP In the generated scanner, the actions are all gathered in one large switch statement and separated using .B YY_BREAK, which may be redefined. By default, it is simply a "break", to separate each rule's action from the following rule's. Redefining .B YY_BREAK allows, for example, C++ users to #define YY_BREAK to do nothing (while being very careful that every rule ends with a "break" or a "return"!) to avoid suffering from unreachable statement warnings where because a rule's action ends with "return", the .B YY_BREAK is inaccessible. .SH INTERFACING WITH YACC One of the main uses of .I flex is as a companion to the .I yacc parser-generator. .I yacc parsers expect to call a routine named .B yylex() to find the next input token. The routine is supposed to return the type of the next token as well as putting any associated value in the global .B yylval. To use .I flex with .I yacc, one specifies the .B -d option to .I yacc to instruct it to generate the file .B y.tab.h containing definitions of all the .B %tokens appearing in the .I yacc input. This file is then included in the .I flex scanner. For example, if one of the tokens is "TOK_NUMBER", part of the scanner might look like: .nf %{ #include "y.tab.h" %} %% [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER; .fi .SH TRANSLATION TABLE In the name of POSIX compliance, .I flex supports a .I translation table for mapping input characters into groups. The table is specified in the first section, and its format looks like: .nf %t 1 abcd 2 ABCDEFGHIJKLMNOPQRSTUVWXYZ 52 0123456789 6 \\t\\ \\n %t .fi This example specifies that the characters 'a', 'b', 'c', and 'd' are to all be lumped into group #1, upper-case letters in group #2, digits in group #52, tabs, blanks, and newlines into group #6, and .I no other characters will appear in the patterns. The group numbers are actually disregarded by .I flex; .B %t serves, though, to lump characters together. Given the above table, for example, the pattern "a(AA)*5" is equivalent to "d(ZQ)*0". They both say, "match any character in group #1, followed by zero-or-more pairs of characters from group #2, followed by a character from group #52." Thus .B %t provides a crude way for introducing equivalence classes into the scanner specification. .LP Note that the .B -i option (see below) coupled with the equivalence classes which .I flex automatically generates take care of virtually all the instances when one might consider using .B %t. But what the hell, it's there if you want it. .SH OPTIONS .I flex has the following options: .TP .B -b Generate backtracking information to .I lex.backtrack. This is a list of scanner states which require backtracking and the input characters on which they do so. By adding rules one can remove backtracking states. If all backtracking states are eliminated and .B -f or .B -F is used, the generated scanner will run faster (see the .B -p flag). Only users who wish to squeeze every last cycle out of their scanners need worry about this option. (See the section on PERFORMANCE CONSIDERATIONS below.) .TP .B -c is a do-nothing, deprecated option included for POSIX compliance. .IP .B NOTE: in previous releases of .I flex .B -c specified table-compression options. This functionality is now given by the .B -C flag. To ease the the impact of this change, when .I flex encounters .B -c, it currently issues a warning message and assumes that .B -C was desired instead. In the future this "promotion" of .B -c to .B -C will go away in the name of full POSIX compliance (unless the POSIX meaning is removed first). .TP .B -d makes the generated scanner run in .I debug mode. Whenever a pattern is recognized and the global .B yy_flex_debug is non-zero (which is the default), the scanner will write to .I stderr a line of the form: .nf --accepting rule at line 53 ("the matched text") .fi The line number refers to the location of the rule in the file defining the scanner (i.e., the file that was fed to flex). Messages are also generated when the scanner backtracks, accepts the default rule, reaches the end of its input buffer (or encounters a NUL; at this point, the two look the same as far as the scanner's concerned), or reaches an end-of-file. .TP .B -f specifies (take your pick) .I full table or .I fast scanner. No table compression is done. The result is large but fast. This option is equivalent to .B -Cf (see below). .TP .B -i instructs .I flex to generate a .I case-insensitive scanner. The case of letters given in the .I flex input patterns will be ignored, and tokens in the input will be matched regardless of case. The matched text given in .I yytext will have the preserved case (i.e., it will not be folded). .TP .B -n is another do-nothing, deprecated option included only for POSIX compliance. .TP .B -p generates a performance report to stderr. The report consists of comments regarding features of the .I flex input file which will cause a loss of performance in the resulting scanner. Note that the use of .I REJECT and variable trailing context (see the BUGS section in flex(1)) entails a substantial performance penalty; use of .I yymore(), the .B ^ operator, and the .B -I flag entail minor performance penalties. .TP .B -s causes the .I default rule (that unmatched scanner input is echoed to .I stdout) to be suppressed. If the scanner encounters input that does not match any of its rules, it aborts with an error. This option is useful for finding holes in a scanner's rule set. .TP .B -t instructs .I flex to write the scanner it generates to standard output instead of .B lex.yy.c. .TP .B -v specifies that .I flex should write to .I stderr a summary of statistics regarding the scanner it generates. Most of the statistics are meaningless to the casual .I flex user, but the first line identifies the version of .I flex, which is useful for figuring out where you stand with respect to patches and new releases, and the next two lines give the date when the scanner was created and a summary of the flags which were in effect. .TP .B -F specifies that the .I fast scanner table representation should be used. This representation is about as fast as the full table representation .RB ( \-f ), and for some sets of patterns will be considerably smaller (and for others, larger). In general, if the pattern set contains both "keywords" and a catch-all, "identifier" rule, such as in the set: .nf "case" return TOK_CASE; "switch" return TOK_SWITCH; ... "default" return TOK_DEFAULT; [a-z]+ return TOK_ID; .fi then you're better off using the full table representation. If only the "identifier" rule is present and you then use a hash table or some such to detect the keywords, you're better off using .BR \-F . .IP This option is equivalent to .B -CF (see below). .TP .B -I instructs .I flex to generate an .I interactive scanner. Normally, scanners generated by .I flex always look ahead one character before deciding that a rule has been matched. At the cost of some scanning overhead, .I flex will generate a scanner which only looks ahead when needed. Such scanners are called .I interactive because if you want to write a scanner for an interactive system such as a command shell, you will probably want the user's input to be terminated with a newline, and without .B -I the user will have to type a character in addition to the newline in order to have the newline recognized. This leads to dreadful interactive performance. .IP If all this seems to confusing, here's the general rule: if a human will be typing in input to your scanner, use .B -I, otherwise don't; if you don't care about squeezing the utmost performance from your scanner and you don't want to make any assumptions about the input to your scanner, use .B -I. .IP Note, .B -I cannot be used in conjunction with .I full or .I fast tables, i.e., the .B -f, -F, -Cf, or .B -CF flags. .TP .B -L instructs .I flex not to generate .B #line directives. Without this option, .I flex peppers the generated scanner with #line directives so error messages in the actions will be correctly located with respect to the original .I flex input file, and not to the fairly meaningless line numbers of .B lex.yy.c. (Unfortunately .I flex does not presently generate the necessary directives to "retarget" the line numbers for those parts of .B lex.yy.c which it generated. So if there is an error in the generated code, a meaningless line number is reported.) .TP .B -T makes .I flex run in .I trace mode. It will generate a lot of messages to .I stdout concerning the form of the input and the resultant non-deterministic and deterministic finite automata. This option is mostly for use in maintaining .I flex. .TP .B -8 instructs .I flex to generate an 8-bit scanner, i.e., one which can recognize 8-bit characters. On some sites, .I flex is installed with this option as the default. On others, the default is 7-bit characters. To see which is the case, check the verbose .B (-v) output for "equivalence classes created". If the denominator of the number shown is 128, then by default .I flex is generating 7-bit characters. If it is 256, then the default is 8-bit characters and the .B -8 flag is not required (but may be a good idea to keep the scanner specification portable). Feeding a 7-bit scanner 8-bit characters will result in infinite loops, bus errors, or other such fireworks, so when in doubt, use the flag. Note that if equivalence classes are used, 8-bit scanners take only slightly more table space than 7-bit scanners (128 bytes, to be exact); if equivalence classes are not used, however, then the tables may grow up to twice their 7-bit size. .TP .B -C[efmF] controls the degree of table compression. .IP .B -Ce directs .I flex to construct .I equivalence classes, i.e., sets of characters which have identical lexical properties (for example, if the only appearance of digits in the .I flex input is in the character class "[0-9]" then the digits '0', '1', ..., '9' will all be put in the same equivalence class). Equivalence classes usually give dramatic reductions in the final table/object file sizes (typically a factor of 2-5) and are pretty cheap performance-wise (one array look-up per character scanned). .IP .B -Cf specifies that the .I full scanner tables should be generated - .I flex should not compress the tables by taking advantages of similar transition functions for different states. .IP .B -CF specifies that the alternate fast scanner representation (described above under the .B -F flag) should be used. .IP .B -Cm directs .I flex to construct .I meta-equivalence classes, which are sets of equivalence classes (or characters, if equivalence classes are not being used) that are commonly used together. Meta-equivalence classes are often a big win when using compressed tables, but they have a moderate performance impact (one or two "if" tests and one array look-up per character scanned). .IP A lone .B -C specifies that the scanner tables should be compressed but neither equivalence classes nor meta-equivalence classes should be used. .IP The options .B -Cf or .B -CF and .B -Cm do not make sense together - there is no opportunity for meta-equivalence classes if the table is not being compressed. Otherwise the options may be freely mixed. .IP The default setting is .B -Cem, which specifies that .I flex should generate equivalence classes and meta-equivalence classes. This setting provides the highest degree of table compression. You can trade off faster-executing scanners at the cost of larger tables with the following generally being true: .nf slowest & smallest -Cem -Cm -Ce -C -C{f,F}e -C{f,F} fastest & largest .fi Note that scanners with the smallest tables are usually generated and compiled the quickest, so during development you will usually want to use the default, maximal compression. .IP .B -Cfe is often a good compromise between speed and size for production scanners. .IP .B -C options are not cumulative; whenever the flag is encountered, the previous -C settings are forgotten. .TP .B -Sskeleton_file overrides the default skeleton file from which .I flex constructs its scanners. You'll never need this option unless you are doing .I flex maintenance or development. .SH PERFORMANCE CONSIDERATIONS The main design goal of .I flex is that it generate high-performance scanners. It has been optimized for dealing well with large sets of rules. Aside from the effects of table compression on scanner speed outlined above, there are a number of options/actions which degrade performance. These are, from most expensive to least: .nf REJECT pattern sets that require backtracking arbitrary trailing context '^' beginning-of-line operator yymore() .fi with the first three all being quite expensive and the last two being quite cheap. .LP .B REJECT should be avoided at all costs when performance is important. It is a particularly expensive option. .LP Getting rid of backtracking is messy and often may be an enormous amount of work for a complicated scanner. In principal, one begins by using the .B -b flag to generate a .I lex.backtrack file. For example, on the input .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; .fi the file looks like: .nf State #6 is non-accepting - associated rule line numbers: 2 3 out-transitions: [ o ] jam-transitions: EOF [ \\001-n p-\\177 ] State #8 is non-accepting - associated rule line numbers: 3 out-transitions: [ a ] jam-transitions: EOF [ \\001-` b-\\177 ] State #9 is non-accepting - associated rule line numbers: 3 out-transitions: [ r ] jam-transitions: EOF [ \\001-q s-\\177 ] Compressed tables always backtrack. .fi The first few lines tell us that there's a scanner state in which it can make a transition on an 'o' but not on any other character, and that in that state the currently scanned text does not match any rule. The state occurs when trying to match the rules found at lines 2 and 3 in the input file. If the scanner is in that state and then reads something other than an 'o', it will have to backtrack to find a rule which is matched. With a bit of headscratching one can see that this must be the state it's in when it has seen "fo". When this has happened, if anything other than another 'o' is seen, the scanner will have to back up to simply match the 'f' (by the default rule). .LP The comment regarding State #8 indicates there's a problem when "foob" has been scanned. Indeed, on any character other than a 'b', the scanner will have to back up to accept "foo". Similarly, the comment for State #9 concerns when "fooba" has been scanned. .LP The final comment reminds us that there's no point going to all the trouble of removing backtracking from the rules unless we're using .B -f or .B -F, since there's no performance gain doing so with compressed scanners. .LP The way to remove the backtracking is to add "error" rules: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; fooba | foob | fo { /* false alarm, not really a keyword */ return TOK_ID; } .fi .LP Eliminating backtracking among a list of keywords can also be done using a "catch-all" rule: .nf %% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; [a-z]+ return TOK_ID; .fi This is usually the best solution when appropriate. .LP Backtracking messages tend to cascade. With a complicated set of rules it's not uncommon to get hundreds of messages. If one can decipher them, though, it often only takes a dozen or so rules to eliminate the backtracking (though it's easy to make a mistake and have an error rule accidentally match a valid token. A possible future .I flex feature will be to automatically add rules to eliminate backtracking). .LP .I Variable trailing context (where both the leading and trailing parts do not have a fixed length) entails almost the same performance loss as .I REJECT (i.e., substantial). So when possible a rule like: .nf %% mouse|rat/(cat|dog) run(); .fi is better written: .nf %% mouse/cat|dog run(); rat/cat|dog run(); .fi or as .nf %% mouse|rat/cat run(); mouse|rat/dog run(); .fi Note that here the special '|' action does .I not provide any savings, and can even make things worse (see .B BUGS in flex(1)). .LP Another area where the user can increase a scanner's performance (and one that's easier to implement) arises from the fact that the longer the tokens matched, the faster the scanner will run. This is because with long tokens the processing of most input characters takes place in the (short) inner scanning loop, and does not often have to go through the additional work of setting up the scanning environment (e.g., .B yytext) for the action. Recall the scanner for C comments: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* "*"+[^*/\\n]* \\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi This could be sped up by writing it as: .nf %x comment %% int line_num = 1; "/*" BEGIN(comment); [^*\\n]* [^*\\n]*\\n ++line_num; "*"+[^*/\\n]* "*"+[^*/\\n]*\\n ++line_num; "*"+"/" BEGIN(INITIAL); .fi Now instead of each newline requiring the processing of another action, recognizing the newlines is "distributed" over the other rules to keep the matched text as long as possible. Note that .I adding rules does .I not slow down the scanner! The speed of the scanner is independent of the number of rules or (modulo the considerations given at the beginning of this section) how complicated the rules are with regard to operators such as '*' and '|'. .LP A final example in speeding up a scanner: suppose you want to scan through a file containing identifiers and keywords, one per line and with no other extraneous characters, and recognize all the keywords. A natural first approach is: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ .|\\n /* it's not a keyword */ .fi To eliminate the back-tracking, introduce a catch-all rule: .nf %% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ [a-z]+ | .|\\n /* it's not a keyword */ .fi Now, if it's guaranteed that there's exactly one word per line, then we can reduce the total number of matches by a half by merging in the recognition of newlines with that of the other tokens: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | .|\\n /* it's not a keyword */ .fi One has to be careful here, as we have now reintroduced backtracking into the scanner. In particular, while .I we know that there will never be any characters in the input stream other than letters or newlines, .I flex can't figure this out, and it will plan for possibly needing backtracking when it has scanned a token like "auto" and then the next character is something other than a newline or a letter. Previously it would then just match the "auto" rule and be done, but now it has no "auto" rule, only a "auto\\n" rule. To eliminate the possibility of backtracking, we could either duplicate all rules but without final newlines, or, since we never expect to encounter such an input and therefore don't how it's classified, we can introduce one more catch-all rule, this one which doesn't include a newline: .nf %% asm\\n | auto\\n | break\\n | ... etc ... volatile\\n | while\\n /* it's a keyword */ [a-z]+\\n | [a-z]+ | .|\\n /* it's not a keyword */ .fi Compiled with .B -Cf, this is about as fast as one can get a .I flex scanner to go for this particular problem. .LP A final note: .I flex is slow when matching NUL's, particularly when a token contains multiple NUL's. It's best to write rules which match .I short amounts of text if it's anticipated that the text will often include NUL's. .SH INCOMPATIBILITIES WITH LEX AND POSIX .I flex is a rewrite of the Unix .I lex tool (the two implementations do not share any code, though), with some extensions and incompatibilities, both of which are of concern to those who wish to write scanners acceptable to either implementation. At present, the POSIX .I lex draft is very close to the original .I lex implementation, so some of these incompatibilities are also in conflict with the POSIX draft. But the intent is that except as noted below, .I flex as it presently stands will ultimately be POSIX conformant (i.e., that those areas of conflict with the POSIX draft will be resolved in .I flex's favor). Please bear in mind that all the comments which follow are with regard to the POSIX .I draft standard of Summer 1989, and not the final document (or subsequent drafts); they are included so .I flex users can be aware of the standardization issues and those areas where .I flex may in the near future undergo changes incompatible with its current definition. .LP .I flex is fully compatible with .I lex with the following exceptions: .IP - The undocumented .I lex scanner internal variable .B yylineno is not supported. It is difficult to support this option efficiently, since it requires examining every character scanned and reexamining the characters when the scanner backs up. Things get more complicated when the end of buffer or file is reached or a NUL is scanned (since the scan must then be restarted with the proper line number count), or the user uses the yyless(), unput(), or REJECT actions, or the multiple input buffer functions. .IP The fix is to add rules which, upon seeing a newline, increment yylineno. This is usually an easy process, though it can be a drag if some of the patterns can match multiple newlines along with other characters. .IP yylineno is not part of the POSIX draft. .IP - The .B input() routine is not redefinable, though it may be called to read characters following whatever has been matched by a rule. If .B input() encounters an end-of-file the normal .B yywrap() processing is done. A ``real'' end-of-file is returned by .B input() as .I EOF. .IP Input is instead controlled by redefining the .B YY_INPUT macro. .IP The .I flex restriction that .B input() cannot be redefined is in accordance with the POSIX draft, but .B YY_INPUT has not yet been accepted into the draft (and probably won't; it looks like the draft will simply not specify any way of controlling the scanner's input other than by making an initial assignment to .I yyin). .IP - .I flex scanners do not use stdio for input. Because of this, when writing an interactive scanner one must explicitly call fflush() on the stream associated with the terminal after writing out a prompt. With .I lex such writes are automatically flushed since .I lex scanners use .B getchar() for their input. Also, when writing interactive scanners with .I flex, the .B -I flag must be used. .IP - .I flex scanners are not as reentrant as .I lex scanners. In particular, if you have an interactive scanner and an interrupt handler which long-jumps out of the scanner, and the scanner is subsequently called again, you may get the following message: .nf fatal flex scanner internal error--end of buffer missed .fi To reenter the scanner, first use .nf yyrestart( yyin ); .fi .IP - .B output() is not supported. Output from the .B ECHO macro is done to the file-pointer .I yyout (default .I stdout). .IP The POSIX draft mentions that an .B output() routine exists but currently gives no details as to what it does. .IP - .I lex does not support exclusive start conditions (%x), though they are in the current POSIX draft. .IP - When definitions are expanded, .I flex encloses them in parentheses. With lex, the following: .nf NAME [A-Z][A-Z0-9]* %% foo{NAME}? printf( "Found it\\n" ); %% .fi will not match the string "foo" because when the macro is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?" and the precedence is such that the '?' is associated with "[A-Z0-9]*". With .I flex, the rule will be expanded to "foo([A-Z][A-Z0-9]*)?" and so the string "foo" will match. Note that because of this, the .B ^, $, , /, and .B <> operators cannot be used in a .I flex definition. .IP The POSIX draft interpretation is the same as .I flex's. .IP - To specify a character class which matches anything but a left bracket (']'), in .I lex one can use "[^]]" but with .I flex one must use "[^\\]]". The latter works with .I lex, too. .IP - The .I lex .B %r (generate a Ratfor scanner) option is not supported. It is not part of the POSIX draft. .IP - If you are providing your own yywrap() routine, you must include a "#undef yywrap" in the definitions section (section 1). Note that the "#undef" will have to be enclosed in %{}'s. .IP The POSIX draft specifies that yywrap() is a function and this is very unlikely to change; so .I flex users are warned that .B yywrap() is likely to be changed to a function in the near future. .IP - After a call to .B unput(), .I yytext and .I yyleng are undefined until the next token is matched. This is not the case with .I lex or the present POSIX draft. .IP - The precedence of the .B {} (numeric range) operator is different. .I lex interprets "abc{1,3}" as "match one, two, or three occurrences of 'abc'", whereas .I flex interprets it as "match 'ab' followed by one, two, or three occurrences of 'c'". The latter is in agreement with the current POSIX draft. .IP - The precedence of the .B ^ operator is different. .I lex interprets "^foo|bar" as "match either 'foo' at the beginning of a line, or 'bar' anywhere", whereas .I flex interprets it as "match either 'foo' or 'bar' if they come at the beginning of a line". The latter is in agreement with the current POSIX draft. .IP - To refer to yytext outside of the scanner source file, the correct definition with .I flex is "extern char *yytext" rather than "extern char yytext[]". This is contrary to the current POSIX draft but a point on which .I flex will not be changing, as the array representation entails a serious performance penalty. It is hoped that the POSIX draft will be emended to support the .I flex variety of declaration (as this is a fairly painless change to require of .I lex users). .IP - .I yyin is .I initialized by .I lex to be .I stdin; .I flex, on the other hand, initializes .I yyin to NULL and then .I assigns it to .I stdin the first time the scanner is called, providing .I yyin has not already been assigned to a non-NULL value. The difference is subtle, but the net effect is that with .I flex scanners, .I yyin does not have a valid value until the scanner has been called. .IP - The special table-size declarations such as .B %a supported by .I lex are not required by .I flex scanners; .I flex ignores them. .IP - The name .B FLEX_SCANNER is #define'd so scanners may be written for use with either .I flex or .I lex. .LP The following .I flex features are not included in .I lex or the POSIX draft standard: .nf yyterminate() <> YY_DECL #line directives %{}'s around actions yyrestart() comments beginning with '#' (deprecated) multiple actions on a line .fi This last feature refers to the fact that with .I flex you can put multiple actions on the same line, separated with semi-colons, while with .I lex, the following .nf foo handle_foo(); ++num_foos_seen; .fi is (rather surprisingly) truncated to .nf foo handle_foo(); .fi .I flex does not truncate the action. Actions that are not enclosed in braces are simply terminated at the end of the line. .SH DIAGNOSTICS .I reject_used_but_not_detected undefined or .I yymore_used_but_not_detected undefined - These errors can occur at compile time. They indicate that the scanner uses .B REJECT or .B yymore() but that .I flex failed to notice the fact, meaning that .I flex scanned the first two sections looking for occurrences of these actions and failed to find any, but somehow you snuck some in (via a #include file, for example). Make an explicit reference to the action in your .I flex input file. (Note that previously .I flex supported a .B %used/%unused mechanism for dealing with this problem; this feature is still supported but now deprecated, and will go away soon unless the author hears from people who can argue compellingly that they need it.) .LP .I flex scanner jammed - a scanner compiled with .B -s has encountered an input string which wasn't matched by any of its rules. .LP .I flex input buffer overflowed - a scanner rule matched a string long enough to overflow the scanner's internal input buffer (16K bytes by default - controlled by .B YY_BUF_SIZE in "flex.skel". Note that to redefine this macro, you must first .B #undefine it). .LP .I scanner requires -8 flag - Your scanner specification includes recognizing 8-bit characters and you did not specify the -8 flag (and your site has not installed flex with -8 as the default). .LP .I fatal flex scanner internal error--end of buffer missed - This can occur in an scanner which is reentered after a long-jump has jumped out (or over) the scanner's activation frame. Before reentering the scanner, use: .nf yyrestart( yyin ); .fi .LP .I too many %t classes! - You managed to put every single character into its own %t class. .I flex requires that at least one of the classes share characters. .SH DEFICIENCIES / BUGS See flex(1). .SH "SEE ALSO" .LP flex(1), lex(1), yacc(1), sed(1), awk(1). .LP M. E. Lesk and E. Schmidt, .I LEX - Lexical Analyzer Generator .SH AUTHOR Vern Paxson, with the help of many ideas and much inspiration from Van Jacobson. Original version by Jef Poskanzer. The fast table representation is a partial implementation of a design done by Van Jacobson. The implementation was done by Kevin Gong and Vern Paxson. .LP Thanks to the many .I flex beta-testers, feedbackers, and contributors, especially Casey Leedom, benson@odi.com, Keith Bostic, Frederic Brehm, Nick Christopher, Jason Coughlin, Scott David Daniels, Leo Eskin, Chris Faylor, Eric Goldman, Eric Hughes, Jeffrey R. Jones, Kevin B. Kenny, Ronald Lamprecht, Greg Lee, Craig Leres, Mohamed el Lozy, Jim Meyering, Marc Nozell, Esmond Pitt, Jef Poskanzer, Jim Roskind, Dave Tallman, Frank Whaley, Ken Yap, and those whose names have slipped my marginal mail-archiving skills but whose contributions are appreciated all the same. .LP Thanks to Keith Bostic, John Gilmore, Craig Leres, Bob Mulcahy, Rich Salz, and Richard Stallman for help with various distribution headaches. .LP Thanks to Esmond Pitt and Earle Horton for 8-bit character support; to Benson Margulies and Fred Burke for C++ support; to Ove Ewerlid for the basics of support for NUL's; and to Eric Hughes for the basics of support for multiple buffers. .LP Work is being done on extending .I flex to generate scanners in which the state machine is directly represented in C code rather than tables. These scanners may well be substantially faster than those generated using -f or -F. If you are working in this area and are interested in comparing notes and seeing whether redundant work can be avoided, contact Ove Ewerlid (ewerlid@mizar.DoCS.UU.SE). .LP This work was primarily done when I was at the Real Time Systems Group at the Lawrence Berkeley Laboratory in Berkeley, CA. Many thanks to all there for the support I received. .LP Send comments to: .nf Vern Paxson Computer Science Department 4126 Upson Hall Cornell University Ithaca, NY 14853-7501 vern@cs.cornell.edu decvax!cornell!vern .fi .TH FMT 1 .SH NAME fmt - adjust line-length for paragraphs of text .SH SYNOPSIS \fBfmt\fP [\-\fIwidth\fP] [\fIfiles\fP]... .SH DESCRIPTION \fIfmt\fR is a simple text formatter. It inserts or deletes newlines, as necessary, to make all lines in a paragraph be approximately the same width. It preserves indentation and word spacing. .PP The default line width is 72 characters. You can override this with the \-\fIwidth\fR flag. If you don't name any files on the command line, then \fIfmt\fR will read from stdin. .PP It is typically used from within \fIvi\fR to adjust the line breaks in a single paragraph. To do this, move the cursor to the top of the paragraph, type "!}fmt", and hit . .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .TH FOLD 1 .SH NAME fold \- fold long lines .SH SYNOPSIS \fBfold\fR [\fB\-\fIn\fR]\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-\fIn\fR" "How long should the output lines be" .SH EXAMPLES .EX "fold \-60" "Fold \fIstdin\fR to 60 characters" .EX "fold file" "Fold \fIfile\fP to 80 characters" .SH DESCRIPTION .PP \fIFold\fR takes copies its input from the named file (or \fIstdin\fR, if none is specified) to standard output. However, lines longer than the given maximum (default 80) are broken into multiple lines of the maximum length by inserting new line characters. .SH "SEE ALSO" .BR width (1). .TH FORMAT 1 .SH NAME format \- format a PC floppy diskette .SH SYNOPSIS .B format .RB [ \-v ] .I device .RI [ media-size .RI [ drive-size ]] .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Format allows a user with read-write permission to .I device to format a floppy. Either one of the special floppy devices must be used, see .BR fd (4), or an automatic device may be used with the size of the floppy specified on the command line. Two sizes must be given when formatting a low density diskette in a high density drive. For example: .PP .RS .ft B .nf format /dev/at1 format /dev/fd1 1200 format /dev/fd1 360 1200 .fi .ft P .RE .PP The first two commands format a 1.2M diskette, the last formats a 360k diskette in a 1.2M drive. A 1.44M drive knows when it's dealing with a low density floppy, so all these commands format a 720k diskette: .PP .RS .ft B .nf format /dev/fd0 720 format /dev/fd0 720 1440 format /dev/ps0 .fi .ft P .RE .PP No sizes may be specified when using a special floppy device, a size must be specified when using an automatic device. .SH OPTIONS .TP .B \-v Verify the process by reading each track after formatting it. Formatting is normally blind, the controller has no idea whether it succeeds or not. Use .B \-v on a new box of cheap diskettes, or on a diskette that may have gone bad. Verifying will increase formatting time by 50%. .SH "SEE ALSO" .BR mkfs (1), .BR fd (4). .SH DIAGNOSTICS Numbers will be printed on standard output to show that it is busy. The locations of bad sectors are printed on standard error when verifying. The exit code is zero unless there are too many bad spots. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH FORTUNE 1 .SH NAME fortune \- print a fortune .SH SYNOPSIS \fBfortune\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "fortune" "Print a fortune" .SH DESCRIPTION .PP \fIFortune\fR prints a fortune at random from the fortunes file, \fI/usr/lib/fortune.dat\fR. This file consists of pieces of text separated by a line containing only %%. .TH FSCK 1 .SH NAME fsck, fsck1 \- perform file system consistency check .SH SYNOPSIS \fBfsck\fR [\fB\-aclmrs\fR]\fR [\fIdevice\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "Automatically repair inconsistencies" .FL "\-c" "Check and list only the specified i-nodes .FL "\-l" "List the files and directories in the filesytem .FL "\-r" "Prompt user for repairs if inconsistencies are found .FL "\-s" "List the superblock of the file system" .SH EXAMPLES .EX "fsck /dev/hd4" "Check file system on \fI/dev/hd4\fR" .EX "fsck \-a /dev/at0" "Automatically fix errors on \fI/dev/at0\fR" .EX "fsck \-l /dev/fd0" "List the contents of \fI/dev/fd0\fR" .EX "fsck \-c 2 3 /dev/hd3" "Check and list \fI/dev/hd3\fR i-nodes 2 & 3" .SH DESCRIPTION .PP \fIFsck\fR performs consistency checks on the file systems which reside on the specified devices. \fIFsck1\fR is an alternate version for use on obsolete V1 file systems. When either the \fB\-a\fR or \fB\-r\fR flags are given, the file system will be repaired if errors are found. Before running \fIfsck\fR on a mounted file system, it must first be unmounted. Trying to repair a mounted file system is dangerous and should not be attempted. .PP To repair the root file system (which cannot be unmounted), first type CTRL-F9 at the console to kill any and all processes. Log back in as \fBroot\fR, type \fIsync\fR to force any buffered changes to disk, run \fIfsck\fR on the root file system and immediately reboot the computer by typing \fIreboot\fR. .PP It is necessary to kill all processes before repairing the root file system to prevent them from modifying any disk blocks while \fIfsck\fR is running. This is only necessary for the root file system, any other file system can simply be unmounted before it is checked. .SH "SEE ALSO" .BR mkfs (1), .BR mount (1). .TH STAT 1 .SH NAME stat, lstat \- provide a shell interface to the stat(2) system call .SH SYNOPSIS .B stat .RB [ - ] .RB [ -\fIfd ] .RB [ -all ] .RB [ -s ] .RB [ -\fIfield " ...]" .RI [ file1 " ...]" .SH DESCRIPTION .B Stat does little more than provide access to the fields in the .B struct stat as defined in the .BR stat (2) manual page. Each field that is to be listed is specified as the field name without the leading .BR st_ . This and the other two options are described below. All options are then applied to the files listed. If .B stat is called as .B lstat then the .BR lstat (2) system call is used, otherwise symbolic links are expanded with .BR stat (2). .PP If no fields are named then all fields are printed. If no files are listed then all open filedescriptors are printed. .SH OPTIONS .TP .B \- If the first argument is ``\-'', the list of files is assumed to come from stdin. This is useful for things like ``ls | stat \-uid \-mtime.'' .B \-\fIfd If an argument is a ``\-'' followed by a number then that number is used as a file descriptor whose information is to be printed. .TP .B \-all List all fields for each file. .TP .B \-s Use .BR lstat (2). .TP .B \-mode List the .B mode field. Similarly for .BR ino , .BR dev , .BR rdev , .BR nlink , .BR uid , .BR gid , .BR size , .BR atime , .BR mtime , and .BR ctime . Under BSD derived systems you also have .B blksize and .BR blocks . .PP .B \-Atime .br .B \-Mtime .br .B \-Ctime .RS The lower case versions of these three options display the time as an integer that is the ``seconds since 00:00 Jan 1. 1970.'' Listing the fields with the first letter in caps causes the times to be printed in .BR ctime (3) format (i.e., human readable). .RE .SH EXAMPLES .LP # Find out the number of links to each file .br $ stat \-nlink *.c .LP # sort files by age (much like ls \-t) .br $ stat \-atime * | sort +1 .LP # Find out which file is older in sh(1) .br if test `stat -mtime $1` -lt `stat -mtime $2`; then .br echo $1 is older than $2 .br else .br echo $2 is older than $1 .br fi .SH "SEE ALSO" .BR stat (2). .SH AUTHOR Larry McVoy (mcvoy@rsch.wisc.edu) :grep.1;head.1<host.1=hostaddr.1>sysenv.1?id.1@ifdef.1Ainstall.1Bisodir.1Cisoinfo.1Disoread.1Ejoin.1Fkill.1Glast.1Hleave.1Iloadfont.1Jloadkeys.1Klogin.1Llook.1Mlp.1Nls.1Omail.1Pmake.1Qmakewhatis.1Rman.1Smesg.1Tmixer.1Umkdir.1Vmkfifo.1Wmkfs.1Xmkproto.1Ymodem.1Zmount.1[mt.1\nm.1]od.1^passwd.1_paste.1`patch.1aplaywave.1bpostmort.1cpr.1dprep.1eps.1fpwd.1grcp.1hreadall.1ireadfs.1jrecwave.1kref.1lremsync.1mrlogin.1nrmdir.1orsh.1prz.1qsed.1rshar.1ssize.1tsleep.1usort.1vspell.1wsplit.1xstrings.1ystrip.1.TH GREP 1 .SH NAME grep \- search a file for lines containing a given pattern .SH SYNOPSIS \fBgrep\fR [\fB\-elnsv\fR] \fIpattern\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-e" "\fB\-e \fIpattern\fR is the same as \fIpattern\fP .FL "\-c" "Print a count of lines matched" .FL "\-i" "Ignore case" .FL "\-l" "Print file names, no lines" .FL "\-n" "Print line numbers" .FL "\-s" "Status only, no printed output" .FL "\-v" "Select lines that do not match" .SH EXAMPLES .EX "grep mouse file " "Find lines in \fIfile\fP containing \fImouse\fP" .EX "grep [0\-9] file" "Print lines containing a digit" .SH DESCRIPTION .PP .I Grep searches one or more files (by default, \fIstdin\fR) and selects out all the lines that match the pattern. All the regular expressions accepted by .I ed and .I mined are allowed. In addition, + can be used instead of \(** to mean 1 or more occurrences, ? can be used to mean 0 or 1 occurrences, and | can be used between two regular expressions to mean either one of them. Parentheses can be used for grouping. If a match is found, exit status 0 is returned. If no match is found, exit status 1 is returned. If an error is detected, exit status 2 is returned. .SH "SEE ALSO" .BR cgrep (1), .BR fgrep (1), .BR sed (1), .BR awk (9). .TH HEAD 1 .SH NAME head \- print the first few lines of a file .SH SYNOPSIS \fBhead\fR [\fB\-\fIn\fR]\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-\fIn\fR" "How many lines to print" .SH EXAMPLES .EX "head \-6" "Print first 6 lines of \fIstdin\fR" .EX "head \-1 file1 file2" "Print first line of two files" .SH DESCRIPTION .PP The first few lines of one or more files are printed. The default count is 10 lines. The default file is \fIstdin\fR. .SH "SEE ALSO" .BR tail (1). .\" ++Copyright++ 1993 .\" - .\" Copyright (c) 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" - .\" Portions Copyright (c) 1993 by Digital Equipment Corporation. .\" .\" Permission to use, copy, modify, and distribute this software for any .\" purpose with or without fee is hereby granted, provided that the above .\" copyright notice and this permission notice appear in all copies, and that .\" the name of Digital Equipment Corporation not be used in advertising or .\" publicity pertaining to distribution of the document or software without .\" specific, written prior permission. .\" .\" THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL .\" WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES .\" OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT .\" CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL .\" DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR .\" PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS .\" ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS .\" SOFTWARE. .\" - .\" --Copyright-- .\" $Id: host.1,v 4.9.1.1 1993/05/02 23:50:13 vixie Rel vixie $ .TH HOST 1 .SH NAME host \- look up host names using domain server .SH SYNOPSIS host [-l] [-v] [-w] [-r] [-d] [-t querytype] [-a] host [ server ] .SH DESCRIPTION .I Host looks for information about Internet hosts. It gets this information from a set of interconnected servers that are spread across the country. By default, it simply converts between host names and Internet addresses. However with the -t or -a options, it can be used to find all of the information about this host that is maintained by the domain server. .PP The arguments can be either host names or host numbers. The program first attempts to interpret them as host numbers. If this fails, it will treat them as host names. A host number consists of first decimal numbers separated by dots, e.g. 128.6.4.194 A host name consists of names separated by dots, e.g. topaz.rutgers.edu. Unless the name ends in a dot, the local domain is automatically tacked on the end. Thus a Rutgers user can say "host topaz", and it will actually look up "topaz.rutgers.edu". If this fails, the name is tried unchanged (in this case, "topaz"). This same convention is used for mail and other network utilities. The actual suffix to tack on the end is obtained by looking at the results of a "hostname" call, and using everything starting at the first dot. (See below for a description of how to customize the host name lookup.) .PP The first argument is the host name you want to look up. If this is a number, an "inverse query" is done, i.e. the domain system looks in a separate set of databases used to convert numbers to names. .PP The second argument is optional. It allows you to specify a particular server to query. If you don't specify this argument, the default server (normally the local machine) is used. .PP If a name is specified, you may see output of three different kinds. Here is an example that shows all of them: .br % host sun4 .br sun4.rutgers.edu is a nickname for ATHOS.RUTGERS.EDU .br ATHOS.RUTGERS.EDU has address 128.6.5.46 .br ATHOS.RUTGERS.EDU has address 128.6.4.4 .br ATHOS.RUTGERS.EDU mail is handled by ARAMIS.RUTGERS.EDU .br The user has typed the command "host sun4". The first line indicates that the name "sun4.rutgers.edu" is actually a nickname. The official host name is "ATHOS.RUTGERS.EDU'. The next two lines show the address. If a system has more than one network interface, there will be a separate address for each. The last line indicates that ATHOS.RUTGERS.EDU does not receive its own mail. Mail for it is taken by ARAMIS.RUTGERS.EDU. There may be more than one such line, since some systems have more than one other system that will handle mail for them. Technically, every system that can receive mail is supposed to have an entry of this kind. If the system receives its own mail, there should be an entry the mentions the system itself, for example "XXX mail is handled by XXX". However many systems that receive their own mail do not bother to mention that fact. If a system has a "mail is handled by" entry, but no address, this indicates that it is not really part of the Internet, but a system that is on the network will forward mail to it. Systems on Usenet, Bitnet, and a number of other networks have entries of this kind. .PP There are a number of options that can be used before the host name. Most of these options are meaningful only to the staff who have to maintain the domain database. .PP The option -w causes host to wait forever for a response. Normally it will time out after around a minute. .PP The option -v causes printout to be in a "verbose" format. This is the official domain master file format, which is documented in the man page for "named". Without this option, output still follows this format in general terms, but some attempt is made to make it more intelligible to normal users. Without -v, "a", "mx", and "cname" records are written out as "has address", "mail is handled by", and "is a nickname for", and TTL and class fields are not shown. .PP The option -r causes recursion to be turned off in the request. This means that the name server will return only data it has in its own database. It will not ask other servers for more information. .PP The option -d turns on debugging. Network transactions are shown in detail. .PP The option -t allows you to specify a particular type of information to be looked up. The arguments are defined in the man page for "named". Currently supported types are a, ns, md, mf, cname, soa, mb, mg, mr, null, wks, ptr, hinfo, minfo, mx, uinfo, uid, gid, unspec, and the wildcard, which may be written as either "any" or "*". Types must be given in lower case. Note that the default is to look first for "a", and then "mx", except that if the verbose option is turned on, the default is only "a". .PP The option -a (for "all") is equivalent to "-v -t any". .PP The option -l causes a listing of a complete domain. E.g. .br host -l rutgers.edu .br will give a listing of all hosts in the rutgers.edu domain. The -t option is used to filter what information is presented, as you would expect. The default is address information, !!!which also include PTR and NS records. The command .br host -l -v -t any rutgers.edu .br will give a complete download of the zone data for rutgers.edu, in the official master file format. (However the SOA record is listed twice, for arcane reasons.) NOTE: -l is implemented by doing a complete zone transfer and then filtering out the information the you have asked for. This command should be used only if it is absolutely necessary. .SH CUSTOMIZING HOST NAME LOOKUP In general, if the name supplied by the user does not have any dots in it, a default domain is appended to the end. This domain can be defined in /etc/resolv.conf, but is normally derived by taking the local hostname after its first dot. The user can override this, and specify a different default domain, using the environment variable .IR LOCALDOMAIN . In addition, the user can supply his own abbreviations for host names. They should be in a file consisting of one line per abbreviation. Each line contains an abbreviation, a space, and then the full host name. This file must be pointed to by an environment variable .IR HOSTALIASES , which is the name of the file. .SH "See Also" named (8) .SH BUGS Unexpected effects can happen when you type a name that is not part of the local domain. Please always keep in mind the fact that the local domain name is tacked onto the end of every name, unless it ends in a dot. Only if this fails is the name used unchanged. .PP The -l option only tries the first name server listed for the domain that you have requested. If this server is dead, you may need to specify a server manually. E.g. to get a listing of foo.edu, you could try "host -t ns foo.edu" to get a list of all the name servers for foo.edu, and then try "host -l foo.edu xxx" for all xxx on the list of name servers, until you find one that works. .TH HOSTADDR 1 .SH NAME hostaddr \- show ethernet address, IP address or hostname .SH SYNOPSIS .B hostaddr .RB [ \-eiah ] .RB [ \-E .IR eth-device ] .RB [ \-I .IR ip-device ] .SH DESCRIPTION Without any of the .B \-eia options, .B hostaddr shows the ethernet address, IP address and hostname of the local host on one line in the given order. With options only the wanted fields are shown, still in the same order, not in option order. .SH OPTIONS .TP .B \-e Show the ethernet address. .TP .B \-i Show the IP address. .TP .B \-a Show the fully qualified hostname. The IP address is shown if it can't be translated to a host name. This usually indicates that the DNS reverse address translation tables are incomplete or that the name daemon couldn't be contacted. .TP .B \-h Set the hostname of the machine if the caller is the superuser. (Used at boot time by the network initialization scripts.) .SH "SEE ALSO" .BR ifconfig (8), .BR dhcpd (8), .BR nonamed (8), .BR inet (8), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH SYSENV 1 .SH NAME sysenv \- request system boot parameter .SH SYNOPSIS .B sysenv .RI [ boot-variable "] ..." .SH DESCRIPTION .B Sysenv requests the value of one or more boot variables. For example .B "sysenv\ memory" returns the list of free memory at system startup. Note that some parameters have undergone "device translation" from a device name to a decimal device number. .PP If no variable names are given then the entire boot environment is listed. .SH "SEE ALSO" .BR svrctl (2), .BR monitor (8), .BR boot (8). .SH DIAGNOSTICS Exit code 0 with the variable's value printed to standard output if all requested variables exist in the boot environment, exit code 1 on any weird error, exit code 2 if one of the variables is not set, and exit code 3 if both kind of errors occurred. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ID 1 .SH NAME id \- print the uid and gid .SH SYNOPSIS \fBid\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "id" "Print the uid and gid" .SH DESCRIPTION .PP \fIId\fR prints the current uid and gid, both numerically and symbolically. If the effective uid and gid are different from the real ones, all of them are printed. .PP Under Minix-vmd the supplementary group IDs are also printed. .SH "SEE ALSO" .BR getuid (2), .BR getgid (2), .BR getgroups (2). .TH IFDEF 1 .SH NAME ifdef \- remove #ifdefs from a file .SH SYNOPSIS \fBifdef \fR[\fB\-t\fR] [\fB\-d\fIsymbol\fR] [\fB\-D\fIsymbol\fR] [\fB\-U\fIsymbol\fR] [\fB\-I\fIsymbol\fR] [file]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-D" "Define symbol permanently" .FL "\-I" "Ignore symbol" .FL "\-U" "Undefine symbol permanently" .FL "\-d" "Define symbol. It may be #undef'ed later" .FL "\-t" "Produce a table of the symbols on \fIstdout\fR" .SH EXAMPLES .EX "ifdef \-DUNIX file.c >newfile.c" "Define \fIUNIX\fR" .EX "ifdef \-D_MINIX \-UDOS y.c "Define \fI_MINIX\fR, undefine \fIDOS\fR" .SH DESCRIPTION .PP \fIIfdef\fR allows conditional code [ #ifdef ... #endif ] to be selectively removed from C files, but at the same time leaving all other C preprocessor commands intact such as #define, #include etc. Input to .I ifdef is either the file named as the last argument, or \fIstdin\fR if no file is named. Output goes to \fIstdout\fR. .PP Symbols may be defined with the \fB\-d\fR or \fB\-D\fR flags just like \fIcpp\fR, except that the latter option ignores subsequent \fI#undefs\fR. It is not permitted to give values to symbols. Similarly, \fB\-U\fR undefines a symbol and ignores subsequent \fI#defines\fRs. Symbols defined with \fB\-I\fR are ignored; any \fI#ifdef\fR using an ignored symbol will be left intact. .TH INSTALL 1 .SH NAME install \- install files .SH SYNOPSIS .in +5 .ti -5 .B install .RB [ \-lcsz\fIN\fP "] [" \-o .IR owner ] .RB [ \-g .IR group ] .RB [ \-m .IR mode ] .RB [ \-S .IR stack ] .RI [ file1 ] .I file2 .br .ti -5 .B install .RB [ \-lcsz\fIN\fP "] [" \-o .IR owner ] .RB [ \-g .IR group ] .RB [ \-m .IR mode ] .RB [ \-S .IR stack ] .IR file " ... " dir .br .ti -5 .B install \-d .RB [ \-o .IR owner ] .RB [ \-g .IR group ] .RB [ \-m .IR mode ] .I directory .in -5 .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Install puts executables, manual pages, and library files in their proper place in the bin, man, and lib directories. The first two forms of the command are like .BR cp (1) copying either one file to another or copying several files to a directory. The "\fB\-d\fP" form is like .BR mkdir (1) with the .B \-p flag. .I File1 may be omitted if neither .B \-l nor .B \-c is given to change the attributes of .IR file2 . .PP Attributes are always copied from the source file, use the options to change. Note that the source file's attributes are changed with the destination file if they are linked. So copy the file if you change it in a way that makes it read-only. You would otherwise not be able to compile a command again. .SH OPTIONS .TP .B \-l Link the destination to the source file instead of copying it. This is done to either save space on a file system with both the source and the bin directories on it, or to install synonyms to a command. .TP .B \-c Copy the source file to its proper place. This option is the default if .B \-l is not given. With .BR \-l , the file is copied if the link fails. .TP .B \-s Strip the destination file of its symbol table, .I if it is an executable, and .I if it is actually copied. It has no effect on a link or a non-executable. .TP .B \-z Compress the executable using .BR compress (1) and prepend a header line that calls .BR zexec (1) to decompress and execute the binary. This will on average save 40% disk space at the expense of a slower startup time. Like .B \-s the file must be actually copied for the flag to have effect. .TP .BI \- N Use .BI "gzip \-" N to compress the binary. You may see up to 60% space savings, but it will take much longer. .I N is a digit from 1 to 9 telling the compression effort, see .BR gzip (1). .TP .B \-d Make a directory, usually to install files in a separate directory in a library. Intermediate directories in the path are created with the same attributes as the final directory. Only the attributes of the final directory are set if the directory exists. .TP .BI \-o " owner" Set the owner of the target. This only works if the invoker is the super-user, or if .B install is run setuid root and the invoker is a member of group zero. If .B \-o is omitted then the ownership is copied from the source file, or set to the id of the invoker if a directory is made. .TP .BI \-g " group" Like .BR \-o , but for the group ownership of the target. .TP .BI \-m " mode" .I Mode is an octal number that specifies the mode the target should get. The default is the source file's mode with a .B chmod a+rX applied to it, or 755 for a new directory. Implies .BR "\-o 0" , or .BR "\-g 0" if a file is to be set-uid or set-gid and the invoker has permission to change ownership. This trick allows a group 0 member to install third party software, even though it expects to be installed by root. .TP .BI \-S " stack" Sets the maximum amount of heap + stack that an executable may have when running. The argument is a C-style decimal, octal or hexadecimal number, optionally followed by the multipliers .BR m , .BR k , .BR w , and .B b for mega (1024*1024), kilo (1024), "word" (2 or 4), and byte (1). Uppercase .B M is also accepted for those who know what S.I. means. The compilers use .B \-S 32kw by default, that translates to 64kb for an 8086, and 128kb for other architectures. This option is ignored on a non-executable. .SH "SEE ALSO" .BR ln (1), .BR cp (1), .BR strip (1), .BR compress (1), .BR gzip (1), .BR zexec (1), .BR chown (8), .BR chgrp (1), .BR chmod (1), .BR chmem (1), .BR mkdir (1). .SH BUGS Uppercase .BR K , .BR W , and .B B are also accepted for those who don't know what S.I. means. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ISODIR 1 .SH NAME isodir \- list ISO9660 or High Sierra directories .SH SYNOPSIS \fBisodir\fP \-[\fBlr\fP] \fIinput_file\fP [\fIdir\fP] .SH DESCRIPTION \fBIsodir\fP reads directories on a file system in ISO9660 or High Sierra Group format (usually residing on cdrom) and lists their contents on standard output. Directory names should contain slashes to separate components. The names \fBisodir\fP, \fBisoread\fP, and \fBisoinfo\fP are all links to the same program. The program sees which function to perform by looking how it was called. .PP .IP \-l Lists all info on files and directories (size, date, time) .IP \-r Recursively descend and print subdirectories .SH "BUGS" Only Interchange level-1 is supported. The Red Rock extensions and Interchange level-2 are not implemented. .SH "SEE ALSO" .BR isoread (1), .BR isoinfo (1). .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .TH ISOINFO 1 .SH NAME isoinfo \- list an ISO9660 or High Sierra volume descriptor .SH SYNOPSIS \fBisoinfo\fP [\fIinput_file\fP] .SH DESCRIPTION \fBIsoinfo\fP reads the volume descriptor from an ISO9660 or High Sierra Group file system (usually residing on cdrom) and lists its contents on standard output. \fBisodir\fP, \fBisoread\fP, and \fBisoinfo\fP are all links to the same program. The program sees which function to perform by looking how it was called. .SH "BUGS" Only Interchange level-1 is supported. The Red Rock extensions and Interchange level-2 are not implemented. .SH "SEE ALSO" .BR isodir (1), .BR isoread (1). .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .TH ISOREAD 1 .SH NAME isoread \- read a file in ISO9660 or High Sierra format .SH SYNOPSIS \fBisoread\fP \-[\fBa\fP] [\fIinput_file\fP] \fIfile\fP .SH DESCRIPTION \fBIsoread\fP reads a file in ISO9660 or High Sierra Group format (usually residing on cdrom) and lists its contents on standard output. The file path should contain slashes to separate components. The names \fBisodir\fP, \fBisoread\fP, and \fBisoinfo\fP are all links to the same program. The program sees which function to perform by looking how it was called. .PP .IP \-a (ASCII) -- convert MS-DOS text files to Minix-style text files by dropping the ^M at the end of each line. .SH "BUGS" Only Interchange level-1 is supported. The Red Rock extensions and Interchange level-2 are not implemented. .SH "SEE ALSO" .BR isodir (1), .BR isoinfo (1). .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .\" @(#)join.1 6.1 (Berkeley) 4/29/85 .\" .TH JOIN 1 "April 29, 1985" .AT 3 .SH NAME join \- relational database operator .SH SYNOPSIS .B join .RB [ \-a\fIn ] .RB [ \-e .IR s ] .RB [ \-o .IR list ] .RB [ \-t\fIc ] file1 file2 .SH DESCRIPTION .B Join forms, on the standard output, a join of the two relations specified by the lines of .I file1 and .IR file2 . If .I file1 is `\-', the standard input is used. .PP .I File1 and .I file2 must be sorted in increasing ASCII collating sequence on the fields on which they are to be joined, normally the first in each line. .PP There is one line in the output for each pair of lines in .I file1 and .I file2 that have identical join fields. The output line normally consists of the common field, then the rest of the line from .IR file1 , then the rest of the line from .IR file2 . .PP Fields are normally separated by blank, tab or newline. In this case, multiple separators count as one, and leading separators are discarded. .PP These options are recognized: .TP .BI \-a n In addition to the normal output, produce a line for each unpairable line in file .IR n , where .I n is 1 or 2. .TP .BI \-e " s" Replace empty output fields by string .IR s . .ig .TP .BI \-j "n m" Join on the .IR m th field of file .IR n . If .I n is missing, use the .IR m th field in each file. .. .TP .BI \-o " list" Each output line comprises the fields specified in .IR list , each element of which has the form .IR n . m , where .I n is a file number and .I m is a field number. .PP .TP .BI \-t c Use character .I c as a separator (tab character). Every appearance of .I c in a line is significant. .SH "SEE ALSO" .BR sort (1), .BR comm (1), .BR awk (1). .SH BUGS With default field separation, the collating sequence is that of .BR "sort \-b" ; with .BR \-t , the sequence is that of a plain sort. .PP The conventions of .BR join , .BR sort , .BR comm , .BR uniq , .BR look and .BR awk (1) are wildly incongruous. .TH KILL 1 .SH NAME kill \- send a signal to a process .SH SYNOPSIS \fBkill\fR [\fB\-\fIn\fR] \fIprocess\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-\fIn\fR" "Signal number to send" .FL "\-\fINAME\fR" "Named signal to send" .SH EXAMPLES .EX "kill 35" "Send signal 15 to process 35" .EX "kill \-9 40" "Send signal 9 to process 40" .EX "kill \-2 0" "Send signal 2 to whole terminal process group" .EX "kill \-HUP -123" "Send a hangup to process group 123" .SH DESCRIPTION .PP A signal is sent to a given process. By default signal 15 (SIGTERM) is sent. Process 0 means all the processes in the sender's process group. A process group can be signalled by the negative value of the process group ID. Signals may be numerical, or the name of the signal without \fBSIG\fP. .SH "SEE ALSO" .BR kill (2), .BR sigaction (2). .TH LAST 1 .SH NAME last, uptime \- display recent on-line session records, show uptime .SH SYNOPSIS \fBlast\fR [\fB\-f \fIfile\fR]\fR [\fB\-r\fR] [\fB\-\fIn\fR] [\fIname\fR] [\fItty\fR] ...\fR .br \fBuptime\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-f" "Use \fIfile\fR instead of /usr/adm/wtmp" .FL "\-r" "Search backwards only to last reboot" .FL "\-u" "Print uptime since last reboot" .FL "\-\fIn\fP" "Print a maximum of \fIn\fR lines" .SH EXAMPLES .EX "last reboot" "When was the system last rebooted?" .EX "last ast" "When was the last login for ast?" .EX "last \-10 tty00 tty01" "Display last 10 logins on tty00 or tty01" .EX "uptime" "Display uptime (likewise \fBlast \-u\fR)" .SH DESCRIPTION .PP .I Last Searches backward through the login administration file (default is \fI/usr/adm/wtmp\fR), printing information about previous logins and reboots. During a long search, the SIGQUIT signal (CTRL-\\) causes \fIlast\fR to display how far back it has gone; it then continues. .PP .IR Uptime , an alias for .IR "last \-u" , displays the time the system is running since the last reboot. .SH "SEE ALSO" .BR who (1), .BR utmp (5). .TH LEAVE 1 .SH NAME leave \- warn when it is time to go home .SH SYNOPSIS \fBleave\fR [\fR [\fB+\fR] \fIhh\fR[\fB:\fR]\fImm\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "leave 1500" "Issue a warning at 2:55 p.m." .EX "leave 10:00" "Issue a warning at 9:55 a.m." .EX "leave + 30" "Issue a warning in 25 minutes" .SH DESCRIPTION .PP \fILeave\fR sets an alarm clock to a specified time and issues a warning 5 minutes before, 1 minute before, and at the time to leave. It then keeps issuing warnings every minute for 10 minutes, then quits. If no time is provided, the program prompts for one. .TH LOADFONT 1 .SH NAME loadfont \- load a font into the video card .SH SYNOPSIS \fBloadfont \fIfontfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "loadfont iso1.fnt" "Loads the ISO 8859-1 (Latin-1) font" .SH DESCRIPTION .PP .I Loadfont loads a custom font into the video card (EGA or VGA). The font character size has to be 8x16 pixels and the font file must contain 256 characters for a total size of 4 kilobytes. .PP .I Loadfont together with .I loadkeys allow the console and keyboard to be customized to national conventions. .PP If it exists, the file .I /etc/font is loaded as a custom font by .B /usr/etc/rc at boot time. .SH "SEE ALSO" .BR console (4). .TH LOADKEYS 1 .SH NAME loadkeys \- load a keyboard map into the keyboard driver .SH SYNOPSIS \fBloadkeys \fImapfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "loadkeys spanish.map" "Load a map for a Spanish keyboard" .SH DESCRIPTION .PP .I Loadkeys changes the key number to character mapping. This is necessary for national keyboards that have different symbols on the keys that the standard U.S. English keyboard. The file .I /etc/keymap is the first thing loaded by .I /etc/rc at boot time if it exists. .SH "SEE ALSO" .BR console (4). .TH LOGIN 1 .SH NAME login \- log into the computer .SH SYNOPSIS \fBlogin\fR [\fIuser\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "login ast" "Login as ast" .SH DESCRIPTION .PP \fILogin\fR allows a logged in user to login as someone else without first logging out. If a password is needed, \fIlogin\fR will prompt for it. .SH "SEE ALSO" .BR su (1), .BR init (8), .BR getty (8), .BR rlogin (1). .TH LOOK 1 .SH NAME look \- find lines in a sorted list .SH SYNOPSIS .B look .RB [ \-df ] .I string .RI [ file ] .SH DESCRIPTION .B Look consults a sorted file and prints all lines that begin with .IR string . It uses binary search. The options .B \-d and .B \-f affect comparisons as in .BR sort (1). If no file is specified, .B /usr/lib/dict/words is assumed with collating sequence .BR \-df . .SH OPTIONS .TP 5 .B \-d Dictionary order: compare letters, digits and whitespace. .TP 5 .B \-f Fold. Upper case letters compare equal to lower case. .SH FILES .TP 25 .B /usr/lib/dict/words Sorted list of English words. .SH "SEE ALSO" .BR sort (1), .BR spell (1). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH LP 1 .SH NAME lp, lpd \- copy a file to the line printer .SH SYNOPSIS .B lp .RI [ file " ...]" .SH DESCRIPTION Each file argument to .B lp is send to the line printer to be printed. Standard input is read and printed if there are no arguments. .B Lp executes .B /usr/lib/lpd with each file as input. .B Lpd puts the file in .B /usr/spool/lpd and starts printing the jobs on .B /dev/lp unless another .B lpd is already running. If .B lpd finds any character in the input that it doesn't know how to handle then it will print the rest of the file without any special treatment. This also means that no formfeed is sent after the file has been printed to force out the page. .B Lpd simply assumes that you know what you are doing. (dumb, eh?) .PP Note: Don't do anything with a file until it is printed, .B lpd only makes a copy of a file in the spool directory when it is not world readable. If it can be read then it is printed directly. .SH FILES .TP 20 .BI /usr/spool/lpd/job XXXXX Information about a job. .TP .BI /usr/spool/lpd/tmp XXXXX Associated file to be printed. .TP .B /etc/termcap The 'lp' entry describes the printer by the "li#" and "co#" fields. By default 66 lines (li#66), and 80 columns (co#80). .SH "SEE ALSO" .BR lp (4), .BR termcap (5), .BR termcap (7). .SH BUGS Not spooling a world readable file may not be such a smart idea. .PP A formfeed should be printed and the printer reset after a job full of escape codes, but this may cost paper. .PP No banner page. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH LS 1 .SH NAME ls \- list the contents of a directory .SH SYNOPSIS \fBls\fP [\fB\-acdfgilpqrstu1ACDFLMRTX\fP] [\fIname\fP...] .SH DESCRIPTION For each file argument, list it. For each directory argument, list its contents. The current working directory is listed when no files are named. Information is printed multicolumn on terminals, single column if the output is redirected. The options control what information is shown and how. .PP .B Ls has two sources other then the command line to draw options from, one is the environment variable .B LSOPTS that is scanned for option letters when the output of .B ls is displayed on a terminal. The other is the name of .B ls itself. If .B ls is linked to another name, then all the characters after the l are used as flags too, except that d, f, r, t and x are translated to D, F, R, T and X. Useful links are .BR ll , .BR lf , .B lm and .BR lx . .PP Files whose names start with a dot are by default not listed. .PP Note that standard Minix doesn't have symbolic links or sockets and .B \-u and .B \-c are no-ops on a V1 file system, since only modified times are stored in V1 inodes. .SH OPTIONS .TP .B \-a All entries are listed, even .B . and .B .. .TP .B \-c Use inode changed time for sorting, listing or searching. .TP .B \-d Do not list contents of directories, but list the directory itself. .TP .B \-f Do not sort (should also be: treat a file as a directory, but that can't be implemented portably). .TP .B \-g Suppress the owner name on a long listing (implies .BR \-l ). .TP .B \-i I-node number printed in the first column. .TP .B \-l Long listing: mode, links, owner, group, size and time. .RB ( "ls \-lC" uses columns in a wide enough window!) .TP .B \-n Print numerical user and group id's. .TP .B \-p Mark directories with a '\fB/\fP'. .TP .B \-q Print nongraphic characters as '\fB?\fP' (default on terminals). .TP .B \-r Reverse the sort order. .TP .B \-s Give the size in kilobytes in the first .RB ( \-s ) or second column .RB ( \-is ). .TP .B \-t Sort by time (modified time default), latest first. .TP .B \-u Use last accessed time for sorting, listing or searching. .TP .B \-1 Print in one column. .TP .B \-A List all entries, but not .B . and .B .. (This is the default for privileged users.) .TP .B \-C Print multicolumn (default on terminals). .TP .B \-D Distinguish files by type, i.e. regular files together, directories together, etc. .TP .B \-F Mark directories with a '\fB/\fP', executables with a '\fB*\fP', \s-2UNIX\s+2 domain sockets with a '\fB=\fP', named pipes with a '\fB|\fP' and symbolic links with a '\fB@\fP' behind the name. .TP .B \-L Print the file referenced by a symbolic link instead of the link. .TP .B \-M List mode before name (implies .BR \-C ). .TP .B \-R List directory trees recursively. .TP .B \-T Print file times in a long format, e.g. "Oct 24 21:37:41 1996". .TP .B \-X Print crunched mode and size before name (implies .BR \-C ). Only the rwx permissions that its caller has on the file are shown, but they are in upper case if the caller owns the file and has given the permission to the callers group or other users. The size is listed in bytes (<= 5K), or rounded up kilo, mega or gigabytes. .SH "SEE ALSO" .BR du (1), .BR stat (1), .BR stat (2). .SH BUGS Having to type .B ls \-C when viewing files through .BR more (1). .PP Is only portable to systems with the same .B st_mode (see .BR stat (2)). .PP The .B LSOPTS variable and the .BR -D , .B -M and .B -X flags are not found on other .B ls implementations. (They have their own nonstandard flags.) .SH AUTHOR Kees J. Bot .TH MAIL 1 .SH NAME mail \- send and receive electronic mail .SH SYNOPSIS \fBmail\fR [\fB\-dpqrv\fR]\fR [\fB\-f \fIfile\fR] [\fIuser\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-d" "Force use of the shell variable \fIMAILER\fR" .FL "\-f" "Use \fIfile\fR instead of \fI/usr/spool/mail/user\fR as mailbox" .FL "\-p" "Print all mail and then exit" .FL "\-q" "Quit program if SIGINT received" .FL "\-r" "Reverse print order, i.e., print oldest first" .FL "\-v" "Verbose mode" .SH EXAMPLES .EX "mail ast" "Send a message to \fIast\fR" .EX "mail" "Read your mail" .SH DESCRIPTION .PP \fIMail\fR is an extremely simple electronic mail program. It can be used to send or receive email on a single \s-2MINIX\s+2 system, in which case it functions as user agent and local delivery agent. If the flag \fIMAILER\fR is defined in \fImail.c\fR, it can also call a trans\%port agent to handle remote mail as well. No such agent is supplied with \s-2MINIX\s+2. .PP When called by \fIuser\fR with no arguments, it examines the mailbox \fI/usr/spool/mail/user\fR, prints one message (depending on the \fB\-r\fR flag), and waits for one of the following commands: .PP .nf .ta 0.25i 1.25i Go to the next message \- Print the previous message !command Fork off a shell and execute \fIcommand\fR CTRL-D Update the mailbox and quit (same as q) d Delete the current message and go to the next one q Update the mailbox and quit (same as CTRL-D) p Print the current message again s [\fIfile\fR] Save message in the named file x Exit without updating the mailbox .PP .PP To send mail, the program is called with the name of the recipient as an argument. The mail is sent, along with a postmark line containing the date. For local delivery, a file named after the recipient in the directory \fI/usr/spool/mail\fR must be writable. .PP If the directory \fI/usr/spool/mail\fR does not exist then the mail is dumped on the console, so that system programs have a way to notify a user on a system that does not have a mail spool. .TH MAKE 1 .SH NAME make \- a program for maintaining large programs .SH SYNOPSIS \fBmake\fR [\fB\-f \fIfile\fR]\fR [\fB\-adeiknpqrst\fR] [\fIoption\fR] ... [\fItarget\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-f" "Use \fIfile\fP as the makefile" .FL "\-d" "Print debugging information" .FL "\-e" "Environment overrides makefile macros" .FL "\-i" "Ignore status returned by commands" .FL "\-k" "On error, skip to next command" .FL "\-n" "Report, but do not execute" .FL "\-p" "Print macros and targets" .FL "\-q" "Question up-to-dateness of target" .FL "\-r" "Rule inhibit; do not use default rules" .FL "\-s" "Silent mode" .FL "\-t" "Touch files instead of making them" .SH EXAMPLES .EX "make kernel" "Make \fIkernel\fP up to date" .EX "make \-n \-f mfile" "Tell what needs to be done" .SH DESCRIPTION .PP .I Make is a program that is normally used for developing large programs consisting of multiple files. It keeps track of which object files depend on which source and header files. When called, it does the minimum amount of recompilation to bring the target file up to date. .PP The file dependencies are expected in .I makefile or .I Makefile , unless another file is specified with \fB\-f\fR. .I Make has some default rules built in, for example, it knows how to make .I .o files from .I .c files. Here is a sample .I makefile . .PP .nf .ta +0.2i +\w'program:'u+1m +\w'cc \-o program head.o tail.o'u+2m d=/user/ast # \fId\fP is a macro program: head.o tail.o # \fIprogram\fR depends on these cc \-o program head.o tail.o # tells how to make \fIprogram\fP echo Program done. # announce completion head.o: $d/def.h head.c # \fIhead.o\fP depends on these .br tail.o: $d/var.h tail.c # \fItail.o\fP depends on these .PP .fi A complete description of \fImake\fR would require too much space here. Many books on \s-2UNIX\s+2 discuss .I make . Study the numerous \fIMakefiles\fR in the \s-2MINIX\s+2 source tree for examples. .SH "SEE ALSO" .BR cc (1). .TH MAKEWHATIS 1 .SH NAME makewhatis \- build the whatis(5) database .SH SYNOPSIS .B makewhatis .I directory .SH DESCRIPTION .B Makewhatis makes the .BR whatis (5) database in the given manual page directory. This database is used by .BR man (1) to map titles to manual page names and by .BR whatis (1) to give one line descriptions. See .BR whatis (5) for a desciption of what a whatis database should look like and the restrictions that are placed on the NAME sections so that .B makewhatis can make whatis lines out of the manual pages. .SH "SEE ALSO" .BR whatis (5). .SH BUGS Removing only font and size changes from the NAME section is often not enough. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH MAN 1 .SH NAME man \- display online manual pages .SH SYNOPSIS .B man .RB [ \-antkfq ] .RB [ \-M .IR path ] .RB [ \-s .IR section ] .IR title " ..." .SH DESCRIPTION .B Man displays the online manual pages for the specified titles in the specified sections. The sections are as follows: .PP .TP .B 1 User Commands .br Generic commands such as .BR ls , .BR cp , .BR grep . .TP .B 2 System Calls .br Low level routines that directly interface with the kernel. .TP .B 3 Library Routines .br Higher level C language subroutines. .TP .B 4 Device Files .br Describes devices in .BR /dev . .TP .B 5 File Formats .br Formats of files handled by various utilities and subroutines. .TP .B 6 Games .br It's not \s-2UNIX\s+2 without an adventure game. .TP .B 7 Miscellaneous .br Macro packages, miscellaneous tidbits. .TP .B 8 System Utilities .br Commands for the System Administrator. .TP .B 9 Documents .br Larger manuals explaining some commands in more detail. .PP (If you are new to Minix then try .BR "man hier" , it will show you around the file system and give you many pointers to other manual pages.) .PP By default, .B man will try the following files in a manual page directory for the command .BR "man \-s 1 ls" : .PP .RS .ft B .nf cat1/ls.1 cat1/ls.1.Z man1/ls.1 man1/ls.1.Z .fi .ft P .RE .PP Files in the man[1\-8] directories are formatted with .BR "nroff \-man" . Those in man9 are formatted with .BR "nroff \-mnx" . Files in the cat? directories are preformatted. Files with names ending in .B .Z are decompressed first with .B zcat (see .BR compress (1)). The end result is presented to the user using a pager if displaying on the screen. .PP For each manual page directory in its search path, .B man will first try all the subdirectories of the manual page directory for the files above, and then the directory itself. The directory .B /usr/man contains the standard manual pages, with manual pages for optional packages installed in a subdirectory of /usr/man, with the same structure as /usr/man. The directory .B /usr/local/man contains manual pages for locally added software. By default /usr/local/man is searched first, then /usr/man. .PP A title is not simply used as a filename, because several titles may refer to the same manual page. Each manual page directory contains a database of titles in the .BR whatis (5) file that is created by .BR makewhatis (1) from the NAME sections of all the manual pages. A title is searched in this database and the first title on a whatis line is used as a filename. .SH OPTIONS The options may be interspersed with the titles to search, and take effect for the titles after them. .TP .B \-a Show all the manual pages or one line descriptions with the given title in all the specified sections in all the manual directories in the search path. Normally only the first page found is shown. .TP .B \-n Use .B nroff \-man to format manual pages (default). .TP .B \-t Use .B troff \-man to format manual pages. .TP .B \-f Use .BR whatis (1) to show a one line description of the title from the .BR whatis (5) file. .TP .B \-k Use .BR apropos (1) to show all the one line descriptions of the title anywhere in the .BR whatis (5) files (implies .BR \-a ). .TP .B \-q Quietly check if all requested manual pages exist. No output, no errors, just an exit code. .TP .BI \-M " path" Use .I path as the search path for manual directories. .TP .BI \-s " section" .I Section is the section number the page is to be found in, or a comma separated list of sections to use. Normally all sections are searched. The search is always in numerical order no matter what your section list looks like. A single digit is treated as a section number without the .B \-s for compatibility with BSD-style .B man commands. .SH ENVIRONMENT .TP 15n .B MANPATH This is a colon separated list of directories to search for manual pages, by default .BR /usr/local/man:/usr/man . .TP .B PAGER The program to use to display the manual page or one line descriptions on the screen page by page. By default .BR more . .SH FILES .TP 25n /usr/man/whatis One of the .BR whatis (5) databases. .SH "SEE ALSO" .BR nroff (1), .BR troff (1), .BR more (1), .BR whatis (1), .BR makewhatis (1), .BR catman (1), .BR whatis (5), .BR man (7). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" @(#)mesg.1 6.1 (Berkeley) 4/29/85 .\" .TH MESG 1 "April 29, 1985" .AT 3 .SH NAME mesg \- permit or deny messages .SH SYNOPSIS .B mesg [ .B n ] [ .B y ] .SH DESCRIPTION .B Mesg with argument .B n forbids messages via .B write and .BR talk (1) by revoking non-user write permission on the user's terminal. .B Mesg with argument .B y reinstates permission. All by itself, .B mesg reports the current state without changing it. .SH FILES /dev/tty* .SH "SEE ALSO" .BR write (1), .BR talk (1). .SH DIAGNOSTICS Exit status is 0 if messages are receivable, 1 if not, 2 on error. .TH MIXER 1 .SH NAME mixer \- manipulate mixer settings on a sound card .SH SYNOPSIS \fBmixer\fP [\-\fBr\fP] .SH DESCRIPTION \fBMixer\fP, invoked without arguments, turns the screen into a sound mixer. Levels can be changed with the cursor-left and cursor-right keys. Input and output settings can be toggled with the space bar. For every sound source there are two, or one when mono, sliders. The input controls have only effect when recording with the Dac. These settings can also be used to switch the left and right channels or, when both channels are enabled on both Dac channels, record in mono. To exit the mixer use the 'e' key. Mixer settings can be stored and restored with the 's' (store) and 'r' keys. When the store function is used \fBMixer\fP will write the settings to a file in the user's home directory called \fI\.mixer\fP. The restore function reads this file to restore saved settings. .SH OPTIONS .IP \-r restore settings saved in \fI\.mixer\fP and exit immediately .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .TH MKDIR 1 .SH NAME mkdir \- make a directory .SH SYNOPSIS \fBmkdir [\fB\-p\fR] [\fB\-m \fImode\fR] \fIdirectory ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-m" "Create directory with mode" .FL "\-p" "Create missing intermediate directories" .SH EXAMPLES .EX "mkdir dir" "Create \fIdir\fP in the current directory" .EX "mkdir \-p /user/ast/dir" "Create the \fI/user/ast\fP and \fI/user/ast/dir\fP" .SH DESCRIPTION .PP The specified directory or directories are created and initialized. If any intermediate directory is missing and \fB\-p\fR is specified, the missing component will be created and no error displayed if directory already exists. If the \fB\-m\fR flag is used, this will be equivalent to a chmod on the directory after its creation. .SH "SEE ALSO" .BR chmod (1), .BR rmdir (1), .BR mkdir (2). .TH MKFIFO 1 .SH NAME mkfifo \- make a named pipe .SH SYNOPSIS \fBmkfifo [\fB\-m \fImode\fR] \fIfifo ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-m" "Create fifo with specified mode" .SH EXAMPLES .EX "mkfifo pipe" "Create \fIpipe\fP in the current directory" .EX "mkfifo -m a+w systatus" "Create the \fIsystatus\fP writable by all" .SH DESCRIPTION .PP The specified fifo special files are created. If the \fB\-m\fR flag is used, this will be equivalent to a chmod on the fifo special file after its creation. .SH "SEE ALSO" .BR chmod (1), .BR mknod (2), .BR mknod (8). .TH MKFS 1 .SH NAME mkfs \- make a file system .SH SYNOPSIS \fBmkfs \fR[\fB\-Ldot\fR] [\fB\-i \fIinodes\fR] [\fB\-b \fIblocks\fR] \fIspecial \fIprototype\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-L" "Make a listing on standard output" .FL "\-d" "Use mod time of \fImkfs\fR binary for all files" .FL "\-o" "Use a drive other than 0 or 1 (safety precaution)" .FL "\-t" "Do not test if file system fits on the medium" .FL "\-1" "Make a version 1 file system (for backward compatibility)" .FL "\-i" "Number of i-nodes (files)" .FL "\-b" "Filesystem size" .SH EXAMPLES .EX "mkfs /dev/fd1 proto" "Make a file system on \fI/dev/fd1\fR" .EX "mkfs -b 360 /dev/fd1" "Make empty 360 block file system" .EX "mkfs /dev/fd1 360" "Alternate way to specify the size" .SH DESCRIPTION .PP .I Mkfs builds a file system and copies specified files to it. The prototype file tells which directories and files to copy to it. If the prototype file cannot be opened, and its name is just a string of digits, an empty file system will be made with the specified number of blocks. A sample prototype file follows. The text following the \fI#\fR sign in the example below is comment. In real prototype files, comments are not allowed. .PP .nf .ta 0.20i 0.70i 1.10i 3i 3.5i 4i boot # boot block file (ignored) 360 63 # blocks and i-nodes d--755 1 1 # root directory bin d--755 \|2 1 # bin dir: mode (755), uid (2), gid (1) sh \|---755 2 1 /user/bin/shell # shell has mode \fIrwxr-xr-x\fP mv -u-755 2 1 /user/bin/mv # u = SETUID bit login -ug755 2 1 /user/bin/login # SETUID and SETGID $ # end of \fI/bin\fP dev d--755 2 1 # special files: tty (char), fd0 (block) tty c--777 2 1 4 0 # uid=2, gid=1, major=4, minor=0 fd0 b--644 2 1 2 0 360 # uid, gid, major, minor, blocks $ # end of \fI/dev\fP user d--755 12 1 # user dir: mode (755), uid (12), gid (1) ast d--755 12 1 # \fI/user/ast\fP $ # \fI/user/ast\fP is empty $ # end of \fI/user\fP $ # end of root directory .PP .fi The first entry on each line (except the first 3 and the $ lines, which terminate directories) is the name the file or directory will get on the new file system. Next comes its mode, with the first character being \fB\-dbc\fR for regular files, directories, block special files and character special files, respectively. The next two characters are used to specify the SETUID and SETGID bits, as shown above. The last three characters of the mode are the .I rwx protection bits. .PP Following the mode are the uid and gid. For special files, the major and minor devices are needed. The size in blocks must also be specified for block special files (the \s-2MINIX\s+2 block size is 1K; this can only be changed by changing .I BLOCK_SIZE and then recompiling the operating system). .PP The maximum size of a file system is 1 Gb for a version 2 file system, and 64 Mb for a version 1 file system. Alas the 8086 .I fsck runs out of memory on a V2 file system larger than 128 Mb, so for the 8086 version of \s-2MINIX\s+2 you have to limit yourself to file systems of that size. .SH "SEE ALSO" .BR mkproto (1), .BR fsck (1), .BR mount (1). .TH MKPROTO 1 .SH NAME mkproto \- create a MINIX prototype file .SH SYNOPSIS \fBmkproto \fR[\fB\-b \fIn\fR] [\fB\-d \fIstr\fR] [\fB\-g \fIn\fR] [\fB\-i \fIn\fR] [\fB\-p \fInnn\fR] [\fB\-s\fR] [\fB\-t \fIroot\fR] [\fB\-u \fIn\fR] \fIsource_directory\fR [\fIprototype_file\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-b" "Number of blocks in the prototype is \fIn\fR" .FL "\-d" "Indent the prototype file using \fIstr\fR instead of tab" .FL "\-g" "Use \fIn\fR as the gid for all files and directories" .FL "\-i" "Number of i-nodes in the prototype is \fIn\fR" .FL "\-p" "Use \fInnn\fR (3 octal digits) as the protection mode" .FL "\-s" "Use the same uid, gid and mode as the source files have" .FL "\-t" "Use the string \fIroot\fR as the path prefix for every file" .FL "\-u" "Use \fIn\fR as the uid for all files and directories" .SH EXAMPLES .EX "mkproto \-b360" "Make a 360K prototype of this directory" .EX "mkproto \-u2 \-g1 \-p644" "Give all files uid 2, gid 1 and mode 644" .SH DESCRIPTION .PP \fIMkproto\fR creates an \fImkfs\fR prototype file for the specified source-directory. The prototype file is either written to \fIstdout\fR or, if specified, the proto-file. .SH "SEE ALSO" .BR mkfs (1). .TH MODEM 1 .SH NAME modem \- switch the modem and getty state .SH SYNOPSIS \fBmodem \fR[\fB\-o\fR] [\fB\-i \fInum\fR] \fBtty\fIn\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-o" "Turn getty off and set modem to dialout" .FL "\-i" "Set line to dialin" .SH EXAMPLES .EX "modem \-o tty00" "Set tty00 to dialout" .EX "modem \-i2 tty00" "Set tty00 to dialin (2 rings)" .SH DESCRIPTION .PP The \fIgetty\fR program allows a terminal port to be used for both dialin and dialout. This little program switches the getty state, and also sends some commands to the modem attached to the specified line. If the \fB\-o\fR flag is presnt, \fImodem\fR will put the getty process (if any) connected to the specified line into SUSPEND state, which means that it will not pay attention to that line until it is reset to RESTART state. Also, \fImodem\fR will send some (Hayes) commands to the attached modem to disable the auto-nanswer mode. The \fB\-i\fR flag specifies the number of times the telephone has to ring before the modem may answer the call (to give the operator a chance). .SH "SEE ALSO" .BR term (1), .BR getty (8). .TH MOUNT 1 .SH NAME mount \- mount a file system .SH SYNOPSIS \fBmount [\fB\-r\fR] \fIspecial \fIfile\fR .br \fBmount [\fB\-s\fR] \fIswapfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-r" "File system is mounted read-only" .FL "\-s" "Mount swap space" .SH EXAMPLES .EX "mount /dev/fd1 /user" "Mount diskette 1 on \fI/user\fP" .SH DESCRIPTION .PP The file system contained on the special file is mounted on \fIfile\fP. In the example above, the root directory of the file system in drive 1 can be accessed as .B /user after the mount. When the file system is no longer needed, it must be unmounted before being removed from the drive. .PP With the .B \-s flag a device or file is mounted as swap space. .SH "SEE ALSO" .BR df (1), .BR mkfs (1), .BR fsck (1), .BR mkswap (8), .BR umount (1), .BR mount (2), .BR fstab (5). .TH MT 1 .SH NAME mt \- magnetic tape control .SH SYNOPSIS .B mt .RB [ \-f .IR device ] .RI [ count ] .SH DESCRIPTION .B Mt is a user interface to the magnetic tape commands described in .BR mtio (4). It allows one to space a tape forwards or backwards, write end of file markers, etc. .PP With the .B \-f option a tape device can be named, otherwise the environment variable .B TAPE is used if set. Standard input is used if the tape name is a dash (\-). The .I count argument is used to tell how many blocks or files to space or how many file markers to write. It may be a C-style decimal, octal or hexadecimal constant, by default "1". .PP .I Command is the action to perform, it may be one of the following, or any unambiguous prefix (like .B st for .BR status ): .TP 15 .B eof, weof Write .I count end-of-file markers. .TP .B fsf Forward space .I count file markers. .TP .B fsr Forward space .I count records. (The size of a record depends on the tape, and may even be variable, depending on the size of the writes.) .TP .B bsf Backwards space .I count files. The count may be zero to backspace to the start of the current file. (A tape device need not support backwards movement, or may be very slow doing it. Rewinding and forward spacing may be better.) .TP .B bsr Backwards space .I count records. The tape is positioned after the last block of the previous file if you hit a filemark when spacing backwards. The block count is set to -1 to indicate that the driver has no idea where it is on the previous file. .TP .B eom Forward space to the end of media. .TP .B rewind Rewind the tape. .TP .B offline, rewoffl Rewind and take offline. This may cause some drives to eject the tape. .TP .B status Shows the status of the drive, the sense key of the last SCSI error, current file number, current record number, residual count if the last command that encountered end-of-file, and the current block size. .TP .B retension Removes tape tension by winding and rewinding the tape completely. .TP .B erase Erases the tape completely and rewinds it. .TP .B density Sets the density code to read or write the tape to .IR count . Density codes supported depend on the drive. This command need not be used if the drive senses the proper density on read and can only write one density. .TP .B blksize, blocksize Sets the block size used to read or write the tape to .IR count . This command may be used to select a fixed block size for a variable block size tape. This will speed up I/O for small block sizes. Use a zero .I count to use variable sized blocks again. .SH ENVIRONMENT .TP 15n .B TAPE Tape drive to use if set. .SH FILES .TP 15n .B /dev/nrst4 Default tape device. .SH "SEE ALSO" .BR mtio (4), .BR st (4). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH NM 1 .SH NAME nm \- print name list .SH SYNOPSIS \fBnm\fR [\fB\-dgnopru\fR]\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-d" "Print the offsets in decimal instead of in hex" .FL "\-g" "Print only external symbols" .FL "\-n" "Sort numerically rather than alphabetically" .FL "\-o" "Prepend file name to each line rather than only once" .FL "\-p" "Do not sort, print in symbol-table order" .FL "\-r" "Sort in reverse order" .FL "\-u" "Print only undefined symbols" .SH EXAMPLES .EX "nm \-n a.out" "Print all symbols in numerical order" .EX "nm \-dg a.out" "Print globals alphabetically in decimal" .SH DESCRIPTION .PP \fINm\fR prints the symbol table of executable files when it is available. If no file is given, the symbols in \fIa.out\fR are used. The format of the table is somewhat compatible with the one produced by \fIasld\fR when used with the \fB\-s\fR option. The symbol table can be added with \fIast\fR. Assembly language files do not have symbol tables. .SH "SEE ALSO" .BR anm (1), .BR asize (1), .BR ar (1), .BR size (1). .TH OD 1 .SH NAME od \- octal dump .SH SYNOPSIS \fBod\fR [\fB\-bcdhox\fR]\fR [\fIfile\fR] [ [\fB+\fR] \fIoffset\fR [\fB.\fR][\fBb\fR]\fR ]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-b" "Dump bytes in octal" .FL "\-c" "Dump bytes as ASCII characters" .FL "\-d" "Dump words in decimal" .FL "\-h" "Print addresses in hex (default is octal)" .FL "\-o" "Dump words in octal (default)" .FL "\-v" "Verbose (list duplicate lines)" .FL "\-x" "Dump words in hex" .SH EXAMPLES .EX "od \-ox file" "Dump \fIfile\fP in octal and hex" .EX "od \-d file +1000" "Dump \fIfile\fP starting at byte 01000" .EX "od \-c file +10.b" "Dump \fIfile\fP starting at block 10" .SH DESCRIPTION .PP .I Od dumps a file in one or more formats. If \fIfile\fP is missing, \fIstdin\fR is dumped. The \fIoffset\fP argument tells .I od to skip a certain number of bytes or blocks before starting. The offset is in octal bytes, unless it is followed by a \&'.\&' for decimal or \fBb\fP for blocks or both. .TH PASSWD 1 .SH NAME passwd, chfn, chsh \- change a login password, full name or shell .SH SYNOPSIS \fBpasswd\fR [\fIuser\fR]\fR .br \fBchfn\fR [\fIuser\fR] \fIfullname\fR\fR .br \fBchfn\fR [\fIuser\fR] \fIshell\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "passwd" "Change current user's password" .EX "passwd ast" "Change ast's password (super\-user only)" .EX "chsh /usr/bin/mail" "For those who only read mail" .EX "chfn 'Jane Doe'" "Current user is Jane Doe" .SH DESCRIPTION .PP .I Passwd is used to change your password. It prompts for the old and new passwords. It asks for the new password twice, to reduce the effect of a typing error. .I Chfn changes the full name (GECOS field) in the password file. .I Chsh changes your login shell. Do not forget to copy the modified password file back to the root file system, or the changes will be lost when the system is rebooted. .SH "SEE ALSO" .BR login (1), .BR su (1), .BR crypt (3), .BR getpwent (3), .BR passwd (5), .BR adduser (8). .TH PASTE 1 .SH NAME paste \- paste multiple files together .SH SYNOPSIS \fBpaste\fR [\fB\-s\fR]\fR [\fB\-d\fI list\fR] \fIfile...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-d" "Set delimiter used to separate columns to \fIlist\fR. .FL "\-s" "Print files sequentially, file \fIk\fR on line \fIk\fR. .SH EXAMPLES .EX "paste file1 file2" "Print \fIfile1\fR in col 1, \fIfile2\fR in col 2" .EX "paste \-s f1 f2" "Print \fIf1\fR on line 1 and \fIf2\fR on line 2" .EX "paste -d : file1 file2" "Print the lines separated by a colon" .SH DESCRIPTION .PP \fIPaste\fR concatenates corresponding lines of the given input files and writes them to standard output. The lines of the different files are separated by the delimiters given with the option \-s\fR. If no list is given, a tab is substituted for every linefeed, except the last one. If end-of-file is hit on an input file, subsequent lines are empty. Suppose a set of \fIk\fR files each has one word per line. Then the \fIpaste\fR output will have \fIk\fR columns, with the contents of file \fIj\fR in column \fIj\fR. If the \fB\-s\fR flag is given, then the first file is on line 1, the second file on line 2, etc. In effect, \fB\-s\fR turns the output sideways. .PP If a list of delimiters is given, they are used in turn. The C escape sequences \\n, \\t, \\\\, and \\0 are used for linefeed, tab, backslash, and the null string, respectively. .\" -*- nroff -*- .rn '' }` '\" $Header: patch.man,v 2.0.1.2 88/06/22 20:47:18 lwall Locked $ '\" '\" $Log: patch.man,v $ '\" Revision 2.0.1.2 88/06/22 20:47:18 lwall '\" patch12: now avoids Bell System Logo '\" '\" Revision 2.0.1.1 88/06/03 15:12:51 lwall '\" patch10: -B switch was contributed. '\" '\" Revision 2.0 86/09/17 15:39:09 lwall '\" Baseline for netwide release. '\" '\" Revision 1.4 86/08/01 19:23:22 lwall '\" Documented -v, -p, -F. '\" Added notes to patch senders. '\" '\" Revision 1.3 85/03/26 15:11:06 lwall '\" Frozen. '\" '\" Revision 1.2.1.4 85/03/12 16:14:27 lwall '\" Documented -p. '\" '\" Revision 1.2.1.3 85/03/12 16:09:41 lwall '\" Documented -D. '\" '\" Revision 1.2.1.2 84/12/05 11:06:55 lwall '\" Added -l switch, and noted bistability bug. '\" '\" Revision 1.2.1.1 84/12/04 17:23:39 lwall '\" Branch for sdcrdcf changes. '\" '\" Revision 1.2 84/12/04 17:22:02 lwall '\" Baseline version. '\" .de Sh .br .ne 5 .PP \fB\\$1\fR .PP .. .de Sp .if t .sp .5v .if n .sp .. '\" '\" Set up \*(-- to give an unbreakable dash; '\" string Tr holds user defined translation string. '\" Bell System Logo is used as a dummy character. '\" '\" Shut up a groff -ww warning. '\".if \n(.g .if !dTr .ds Tr '\".ie n \{\ .tr \(*W-\*(Tr '\".ds -- \(*W- '\".if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch '\".if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch .ds L" "" .ds R" "" .ds L' ' .ds R' ' '\"'br \} '\".el \{\ .ds -- \(em\| .tr \*(Tr .ds L" `` .ds R" '' .ds L' ` .ds R' ' '\"'br\} .TH PATCH 1 LOCAL .SH NAME patch - apply a diff file to an original .SH SYNOPSIS .B patch [options] [origfile [patchfile]] [+ [options] [origfile]]... .sp but usually just .sp .B patch sets the maximum fuzz factor. This switch only applies to context diffs, and causes .I patch to ignore up to that many lines in looking for places to install a hunk. Note that a larger fuzz factor increases the odds of a faulty patch. The default fuzz factor is 2, and it may not be set to more than the number of lines of context in the context diff, ordinarily 3. .TP 5 .B \-l causes the pattern matching to be done loosely, in case the tabs and spaces have been munged in your input file. Any sequence of whitespace in the pattern line will match any sequence in the input file. Normal characters must still match exactly. Each line of the context must still match a line in the input file. .TP 5 .B \-n forces .I patch to interpret the patch file as a normal diff. .TP 5 .B \-N causes .I patch to ignore patches that it thinks are reversed or already applied. See also .B \-R . .TP 5 .B \-o causes the next argument to be interpreted as the output file name. .TP 5 .B \-p sets the pathname strip count, which controls how pathnames found in the patch file are treated, in case the you keep your files in a different directory than the person who sent out the patch. The strip count specifies how many slashes are to be stripped from the front of the pathname. (Any intervening directory names also go away.) For example, supposing the filename in the patch file was .sp /u/howard/src/blurfl/blurfl.c .sp setting .B \-p or .B \-p0 gives the entire pathname unmodified, .B \-p1 gives .sp u/howard/src/blurfl/blurfl.c .sp without the leading slash, .B \-p4 gives .sp blurfl/blurfl.c .sp and not specifying .B \-p at all just gives you "blurfl.c", unless all of the directories in the leading path (u/howard/src/blurfl) exist and that path is relative, in which case you get the entire pathname unmodified. Whatever you end up with is looked for either in the current directory, or the directory specified by the .B \-d switch. .TP 5 .B \-r causes the next argument to be interpreted as the reject file name. .TP 5 .B \-R tells .I patch that this patch was created with the old and new files swapped. (Yes, I'm afraid that does happen occasionally, human nature being what it is.) .I Patch will attempt to swap each hunk around before applying it. Rejects will come out in the swapped format. The .B \-R switch will not work with ed diff scripts because there is too little information to reconstruct the reverse operation. .Sp If the first hunk of a patch fails, .I patch will reverse the hunk to see if it can be applied that way. If it can, you will be asked if you want to have the .B \-R switch set. If it can't, the patch will continue to be applied normally. (Note: this method cannot detect a reversed patch if it is a normal diff and if the first command is an append (i.e. it should have been a delete) since appends always succeed, due to the fact that a null context will match anywhere. Luckily, most patches add or change lines rather than delete them, so most reversed normal diffs will begin with a delete, which will fail, triggering the heuristic.) .TP 5 .B \-s makes .I patch do its work silently, unless an error occurs. .TP 5 .B \-S causes .I patch to ignore this patch from the patch file, but continue on looking for the next patch in the file. Thus .sp patch -S + -S + sets internal debugging flags, and is of interest only to .I patch patchers. .SH AUTHOR Larry Wall .br with many other contributors. .SH ENVIRONMENT .TP .B TMPDIR Directory to put temporary files in; default is /tmp. .TP .B SIMPLE_BACKUP_SUFFIX Extension to use for backup file names instead of \*(L".orig\*(R" or \*(L"~\*(R". .TP .B VERSION_CONTROL Selects when numbered backup files are made. .SH FILES $TMPDIR/patch* .SH SEE ALSO diff(1) .SH NOTES FOR PATCH SENDERS There are several things you should bear in mind if you are going to be sending out patches. First, you can save people a lot of grief by keeping a patchlevel.h file which is patched to increment the patch level as the first diff in the patch file you send out. If you put a Prereq: line in with the patch, it won't let them apply patches out of order without some warning. Second, make sure you've specified the filenames right, either in a context diff header, or with an Index: line. If you are patching something in a subdirectory, be sure to tell the patch user to specify a .B \-p switch as needed. Third, you can create a file by sending out a diff that compares a null file to the file you want to create. This will only work if the file you want to create doesn't exist already in the target directory. Fourth, take care not to send out reversed patches, since it makes people wonder whether they already applied the patch. Fifth, while you may be able to get away with putting 582 diff listings into one file, it is probably wiser to group related patches into separate files in case something goes haywire. .SH DIAGNOSTICS Too many to list here, but generally indicative that .I patch couldn't parse your patch file. .PP The message \*(L"Hmm...\*(R" indicates that there is unprocessed text in the patch file and that .I patch is attempting to intuit whether there is a patch in that text and, if so, what kind of patch it is. .PP .I Patch will exit with a non-zero status if any reject files were created. When applying a set of patches in a loop it behooves you to check this exit status so you don't apply a later patch to a partially patched file. .SH CAVEATS .I Patch cannot tell if the line numbers are off in an ed script, and can only detect bad line numbers in a normal diff when it finds a \*(L"change\*(R" or a \*(L"delete\*(R" command. A context diff using fuzz factor 3 may have the same problem. Until a suitable interactive interface is added, you should probably do a context diff in these cases to see if the changes made sense. Of course, compiling without errors is a pretty good indication that the patch worked, but not always. .PP .I Patch usually produces the correct results, even when it has to do a lot of guessing. However, the results are guaranteed to be correct only when the patch is applied to exactly the same version of the file that the patch was generated from. .SH BUGS Could be smarter about partial matches, excessively \&deviant offsets and swapped code, but that would take an extra pass. .PP If code has been duplicated (for instance with #ifdef OLDCODE ... #else ... #endif), .I patch is incapable of patching both versions, and, if it works at all, will likely patch the wrong one, and tell you that it succeeded to boot. .PP If you apply a patch you've already applied, .I patch will think it is a reversed patch, and offer to un-apply the patch. This could be construed as a feature. .rn }` '' .TH PLAYWAVE 1 .SH NAME playwave \- play an audio file in MicroSoft PCM wave format .SH SYNOPSIS \fBplaywave\fP [\-\fBi\fP] file .SH DESCRIPTION \fBPlaywave\fP writes the samples in a wave file to \fI/dev/audio\fP. The wave file must be in Microsoft PCM format. .SH OPTIONS .IP \-i display information about wave file .SH BUGS The highest sample rate that can be used depends on the speed of the system and the size of the DMA buffer used in the driver. (/usr/src/kernel/sb16.h) .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .TH POSTMORT 1 .SH NAME postmort \- perform post-mortem on PC Minix core files .SH SYNOPSIS \fBpostmort\fR [\fB\-dpt\fR] \fB\-c \fIcorefile \fB\-s \fIsymbfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Use the named corefile" .FL "\-d" "Dump all text symbols and segment data" .FL "\-p" "Display the kernel process table" .FL "\-s" "Use the named symbol file" .FL "\-t" "Display a stack backtrace" .SH EXAMPLES .EX "postmort" "display the data from the file 'core'" .SH DESCRIPTION .PP .I Postmort does a simple static analysis of a PC Minix core file; By default, it looks for the file 'core' in the local directory and loads that for analysis; it also searches for the file 'symbol.out', and if that fails 'a.out', expecting them to contain symbol information for the core file. It is not a fatal error if the symbol files don't exist. .PP The stack backtrace is slightly tricky, and may go on longer than is really justified, since there's no easy way for it to know when to stop. Treat its results with caution. .TH PR 1 .SH NAME pr \- print a file .SH SYNOPSIS \fBpr\fR [\fB\-Mfnt\fR]\fR [\fB\-h \fIn\fR] [\fB\-l \fIn\fR] [\fB\-w \fIn\fR] [\fB\-\fRcolumns\fR] [\fB+\fIpage\fR] [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-M" "Use MINIX style line number" .FL "\-f" "Do not fold long lines" .FL "\-h" "Take next argument as page header" .FL "\-l" "Sets page length in lines" .FL "\-n" "Number the output lines" .FL "\-t" "Do not print page header or trailer" .FL "\-w" "Sets line length in characters" .SH EXAMPLES .EX "pr \-w85 \-l60 file" "Use 85 character line, 60 line page" .EX "pr \-3 file" "List \fIfile\fP three columns to a page" .EX "pr +4 file" "Start printing with page 4" .SH DESCRIPTION .PP .I Pr formats one or more files for printing. If no files are specified, \fIstdin\fR is printed. Options are provided for setting the width and height of the page, the number of columns to use (default 1), and the page to start with, among others. .SH "SEE ALSO" .BR lp (1). .TH PREP 1 .SH NAME prep \- prepare a text file for statistical analysis .SH SYNOPSIS \fBprep\fR [\fIfile\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "prep infile >outfile" "Prepare \fIinfile\fR" .SH DESCRIPTION .PP \fIPrep\fR strips off most of the troff commands from a text file and then outputs all the words, one word per line, in the order they occur in the file. This file can then be sorted and compared to a dictionary (as a spelling checker), or used for statistical analyses. .SH "SEE ALSO" .BR nroff (1), .BR spell (1). .TH PS 1 .SH NAME ps \- process status .SH SYNOPSIS \fBps \fR[\fB\-alxU\fR] [\fBkernel mm fs\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "Print all processes with controlling terminals" .FL "\-l" "Give long listing" .FL "\-x" "Include processes without a terminal" .SH EXAMPLES .EX "ps \-axl" "Print all processes and tasks in long format" .SH DESCRIPTION .PP \fIPs\fR prints the status of active processes. Normally only the caller's own processes are listed in short format (the PID, TTY, TIME and CMD fields as explained below). The long listing contains: .PP .ta 0.5i 1.0i F Kernel flags: 001: free slot 002: no memory map 004: sending; 010: receiving 020: inform on pending signals 040: pending signals 100: being traced. .PP S State: R: runnable W: waiting (on a message) S: sleeping (i.e.,suspended on MM or FS) Z: zombie T: stopped .PP UID, PID, PPID, PGRP The user, process, parent process and process group ID's. .PP SZ Size of the process in kilobytes. .PP RECV Process/task on which a receiving process is waiting or sleeping. .PP TTY Controlling tty for the process. .PP TIME Process' cumulative (user + system) execution time. .PP CMD Command line arguments of the process. .PP .PP The files \fI/dev/{mem,kmem}\fR are used to read the system tables and command line arguments from. Terminal names in \fI/dev\fR are used to generate the mnemonic names in the TTY column, so \fIps\fR is independent of terminal naming conventions. .TH PWD 1 .SH NAME pwd \- print working directory .SH SYNOPSIS \fBpwd\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "pwd " "Print the name of the working directory" .SH DESCRIPTION .PP The full path name of the current working directory is printed. .SH "SEE ALSO" .BR getcwd (3). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rcp.1c 6.4 (Berkeley) 5/12/86 .\" .TH RCP 1 "May 12, 1986" .UC 5 .SH NAME rcp \- remote file copy .SH SYNOPSIS .B rcp .RB [ \-p ] .I file1 file2 .br .B rcp .RB [ \-pr ] .I file \&... .I directory .SH DESCRIPTION .B Rcp copies files between machines. Each .I file or .I directory argument is either a remote file name of the form ``rhost:path'', or a local file name (containing no `:' characters, or a `/' before any `:'s). .PP If the .B \-r option is specified and any of the source files are directories, .B rcp copies each subtree rooted at that name; in this case the destination must be a directory. .PP By default, the mode and owner of .I file2 are preserved if it already existed; otherwise the mode of the source file modified by the .BR umask (2) on the destination host is used. The .B \-p option causes .B rcp to attempt to preserve (duplicate) in its copies the modification times and modes of the source files, ignoring the .BR umask . .PP If .I path is not a full path name, it is interpreted relative to your login directory on .IR rhost . A .I path on a remote host may be quoted (using \e, ", or \(aa) so that the metacharacters are interpreted remotely. .PP .B Rcp does not prompt for passwords; your current local user name must exist on .I rhost and allow remote command execution via .BR rsh (1). .PP .B Rcp handles third party copies, where neither source nor target files are on the current machine. Hostnames may also take the form ``rname@rhost'' to use .I rname rather than the current user name on the remote host. The destination hostname may also take the form ``rhost.rname'' to support destination machines that are running 4.2BSD versions of .BR rcp . .SH SEE ALSO .BR cp (1), .BR ftp (1), .BR rsh (1), .BR rlogin (1). .SH BUGS Doesn't detect all cases where the target of a copy might be a file in cases where only a directory should be legal. .br Is confused by any output generated by commands in a \&.profile, or \&.*shrc file on the remote host. .TH READALL 1 .SH NAME readall \- read a device quickly to check for bad blocks .SH SYNOPSIS \fBreadall\fR [\fB\-bt\fR] \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-b" "Produce shell script on \fIstdout\fR that calls \fIbadblocks\fR" .FL "\-t" "Just print device size" .SH EXAMPLES .EX "readall /dev/hd0" "Read all of \fI/dev/hd0\fR" .EX "readall -b /dev/hd1 >s" "Generate shell script on \fIs\fR" .SH DESCRIPTION .PP \fIReadall\fR reads all of the named device in large chunks. It reports about blocks that it cannot read. Unlike \fIdiskcheck\fR, it does not attempt to write on the disk, making it safer to use when one is worried about a sick system. When the \fB\-b\fR flag is given, the output is a shell script that calls the \fIbadblocks\fR program to marked all the bad blocks. Whenever installing \s-2MINIX\s+2, it is wise to run \fIreadall\fR with the \fB\-b\fR flag first on all the hard disks. .SH "SEE ALSO" .BR badblocks (8). .TH READFS 1 .SH NAME readfs \- read a MINIX file system .SH SYNOPSIS \fBreadfs\fR [\fB\-il\fR] \fIblock_special\fR [\fIdir\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-i" "Give information about the file, but do not extract files" .FL "\-l" "List the files extracted on standard output" .SH EXAMPLES .EX "readfs \-l /dev/fd0" "List contents of diskette" .SH DESCRIPTION .PP \fIReadfs\fR reads a diskette containing a \s-2MINIX\s+2 file system. It can extract all the files from it, give a listing of them, or both. The files extracted can be put in a user-specified directory (default: current directory). If subdirectories are needed, they will be created automatically. .SH "SEE ALSO" .BR mkproto (1). .TH RECWAVE 1 .SH NAME recwave \- record an audio file in MicroSoft PCM wave format .SH SYNOPSIS \fBrecwave\fP [\-\fBb\fP \-\fBs\fP \-\fBr\fP] file .SH DESCRIPTION \fBRecwav\fP takes samples from \fI/dev/audio\fP and writes them to \fIfile\fP in Microsoft PCM wave format. .SH OPTIONS .IP \-b number of bits to use for one sample. Must be 8 or 16, default is 8 .IP \-s enable stereo sampling. 0 = mono (default), 1 = stereo .IP \-r sample rate in samples/sec. 4000 - 44100 (default 22050) .SH BUGS The highest sample rate that can be used depends on the speed of the system and the size of the DMA buffer used in the driver. (/usr/src/kernel/sb16.h) .SH AUTHOR Michel R. Prevenier (mrpreve@cs.vu.nl) .TH REF 1 .SH NAME ref - Display a C function header .SH SYNOPSIS \fBref\fR [-t] [-c \fIclass\fR]... [-f \fIfile\fR]... \fItag\fR .SH DESCRIPTION \fIref\fP quickly locates and displays the header of a function. To do this, \fIref\fR looks in the "tags" file for the line that describes the function, and then scans the source file for the function. When it locates the function, it displays an introductory comment (if there is one), the function's declaration, and the declarations of all arguments. .SH "SEARCH METHOD" .PP \fIref\fR uses a fairly sophisticated tag look-up algorithm. If you supply a filename via \fB-f\fR \fIfile\fR, then elvis first scans the tags file for a static tag from that file. This search is limited to the tags file in the current directory. .PP If you supply a classname via \fB-c\fR \fIclass\fR, then elvis searches for a tag from that class. This search is not limited to the current directory; You can supply a list of directories in the environment variable \fITAGPATH\fR, and \fIref\fR will search through the "tags" file in each directory until it finds a tag in the desired class. .PP If that fails, \fIref\fR will then try to look up an ordinary global tag. This search checks all of the directories listed in \fITAGPATH\fR, too. .PP If you've given the \fB-t\fR flag, then \fIref\fR will simply output the tag line that it found, and then exit. Without \fB-t\fR, though, \fIref\fR will search for the tag line. It will try to open the source file, which should be in the same directory as the tags file where the tag was discovered. If the source file doesn't exist, or is unreadable, then \fIref\fR will try to open a file called "\fIrefs\fR" in that directory. Either way, \fIref\fR will try to locate the tag, and display whatever it finds. .SH "INTERACTION WITH ELVIS" .PP \fIref\fP is used by \fIelvis\fR' shift-K command. If the cursor is located on a word such as "splat", in the file "foo.c", then \fIelvis\fR will invoke \fIref\fR with the command "ref -f foo.c splat". .PP If \fIelvis\fR has been compiled with the -DEXTERNAL_TAGS flag, then \fIelvis\fR will use \fIref\fR \fB\fRto scan the tags files. This is slower than the built-in tag searching, but it allows \fIelvis\fR to access the more sophisticated tag lookup provided by \fIref\fR. Other than that, external tags should act exactly like internal tags. .SH OPTIONS .IP \fB-t\fR Output tag info, instead of the function header. .IP "\fB-f\fR \fIfile\fR" The tag might be a static function in \fIfile\fR. You can use several -f flags to have \fIref\fR consider static tags from more than one file. .IP "\fB-c\fR \fIclass\fR" The tag might be a member of class \fIclass\fR. You can use several -c flags to have \fIref\fR consider tags from more than one class. .SH FILES .IP \fBtags\fR List of function names and their locations, generated by \fIctags\fR. .IP \fBrefs\fR Function headers extracted from source files (optional). .SH ENVIRONMENT .IP \fBTAGPATH\fR List of directories to be searched. The elements in the list are separated by either semicolons (for MS-DOS, Atari TOS, and AmigaDos), or by colons (every other operating system). For each operating system, \fIref\fR has a built-in default which is probably adequate. .SH NOTES .PP You might want to generate a "tags" file the directory that contains the source code for standard C library on your system. If licensing restrictions prevent you from making the library source readable by everybody, then you can have \fIctags\fR generate a "refs" file, and make "refs" readable by everybody. .PP If your system doesn't come with the library source code, then perhaps you can produce something workable from the \fIlint\fR libraries. .SH "SEE ALSO" elvis(1), ctags(1) .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .TH REMSYNC 1 .SH NAME remsync - remotely synchronize file trees .SH SYNOPSIS .B remsync .B \-sxv .I tree .RI [ state-file ] .br .B remsync .B \-duxvD .I tree .RI [ state-file .RI [ diff-file ]] .br .B remsync .RB [ \-xv ] .I tree .RI [ diff-file ] .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Remsync synchronizes file trees of distant machines, i.e. machines that do not have a fast network between them. It accomplishes this in three steps: .PP .RS Create a state file containing a description of the machine to be updated. .RE .PP .RS Compute a file of differences on the source machine using the state file to compare the two file trees. .RE .PP .RS Update the target machine using the data in the differences file. .RE .PP This process requires that you move two files, a state file from the target machine to the source machine, and a differences file from the source machine to the target machine. The state file is an ASCII file that may be edited, usually to make .B remsync ignore some files or file trees. .PP The argument .I tree may be a single file or a directory. A directory is traversed recursively. The .I state-file and .I diff-file arguments may be of any file type. The differences file contains an end marker, so it may be followed by trailing junk. Standard input or output is used if these arguments are omitted or replaced by a minus sign. .SS "State file format" A state file has a line for each file in a tree. A line looks like this formally for a simple file: .PP .RS .I "name mode owner group length date" .RI [ link-number .RB [ last ]] .RE .PP The best way to show how each type of file is represented is by example: .PP .RS .nf .ta +10 +8 +4 +4 +6 +12 +4 / d755 0 0 bin d755 2 0 .in +2 [ 644 2 0 233 759160857 1 cat 755 2 0 3772 768742021 test 755 2 0 233 759160857 1 last .in -2 dev d755 0 0 .in +2 fd0 b666 0 0 200 console c600 10 0 400 sd2 b600 0 0 a02 fifo p700 2 0 .in -2 opt -> usr/opt usr ignore (Cross-device link) .fi .RE .PP The root of the tree is always represented by a /, no matter what type of file it may be. Directory entries of the root follow at the same level. Files in subdirectories are indented by two spaces. (Eight spaces are replaced by a TAB.) Normal files have their length and modified time in the state file, devices have their device number in hex, etc. If files are hard linked to each other then they all get an extra "link number" to bind them together. The last link is marked with the word .BR last . .PP One usually only modifies a state file to ignore differences between two files. One does this by replacing the file attributes with the word .BR ignore . .RB ( Remsync generates this keyword too, with the reason why added in parentheses.) .SH OPTIONS .TP .B \-s Generate a state file. .TP .B \-d Generate a differences file. (The default is to apply a differences file.) .TP .B \-u Only add new files or update files with newer versions. .TP .B \-x Do not cross device boundaries. This allows one to operate on the root file system for instance ignoring the .B /usr file system. .TP .B \-D Debug differences file generation. With this flag no file contents are added to the differences file. The result is then human readable. .TP .B \-v Lists the commands added to the differences file, or the actions done applying a differences file. The output looks like \s-2UNIX\s+2 commands except for the words "add", "restore" and "update" indicating addition of a new file, replacing a file with an older version, or replacement by a newer version. .SH EXAMPLES Actions taken by the author to update his notebook "finiah" from his main machine "darask": .PP .RS .nf finiah# remsync -s /usr /tmp/finiah.state .SP Edit the state file to ignore .Xauthority files and /usr/var. .SP finiah# tar cvf /dev/fd0 /tmp/finiah.state .SP darask# tar xvf /dev/fd0 .br darask# remsync -dv /usr /tmp/finiah.state | vol 1440 /dev/fd0 .SP finiah# vol 1440 /dev/fd0 | remsync -v /usr .fi .RE .PP One could add a file compression/decompression program between .B remsync and .BR vol , to reduce the number of floppies to move about, but that actually slows things down! (Note that one only needs to shuffle two floppies about if the two machines are adjacent. To update a remote machine it does make sense to use compression to reduce the number of floppies to carry.) .SH "SEE ALSO" .BR synctree (1), .BR vol (1), .BR tar (1). .SH NOTES Nothing stops you from using .B remsync over a fast network of course. .B Synctree can be a bit tedious if you only want to ignore a few files. Editing a state file is then easier. .SH BUGS Files are overwritten, not removed, when they are updated. This means that links outside the tree are also updated. The less desirable alternative to this is to break the link before the update. .PP The verbose option may say that a link is to be created when making a differences file. The link is often already there when the update takes place, so no action is taken, and thus no talk about it. So you may miss a few mutterings about links if you compare the messages. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rlogin.1c 6.8 (Berkeley) 5/12/86 .\" .TH RLOGIN 1 "May 12, 1986" .UC 5 .SH NAME rlogin \- remote login .SH SYNOPSIS .B rlogin .RB [ \-8EL ] .RB [ \-e .IR char ] .RB [ \-l .IR username ] .I rhost .br .I rhost .RB [ \-8EL ] .RB [ \-e .IR char ] .RB [ \-l .IR username ] .SH DESCRIPTION .B Rlogin connects your terminal on the current local host system .I lhost to the remote host system .I rhost. .PP Each host has a file .B /etc/hosts.equiv which contains a list of \fIrhost\fR's with which it shares account names. (The host names must be the standard names as described in .BR rsh (1).) When you .B rlogin as the same user on an equivalent host, you don't need to give a password. Each user may also have a private equivalence list in a file \&.rhosts in his login directory. Each line in this file should contain an \fIrhost\fP and a \fIusername\fP separated by a space, giving additional cases where logins without passwords are to be permitted. If the originating user is not equivalent to the remote user, then a login and password will be prompted for on the remote machine as in .BR login (1). To avoid some security problems, the \&.rhosts file must be owned by either the remote user or root. .PP The remote terminal type is the same as your local terminal type (as given in your environment TERM variable). The terminal or window size is also copied to the remote system if the server supports the option, and changes in size are reflected as well. All echoing takes place at the remote site, so that (except for delays) the rlogin is transparent. Flow control via ^S and ^Q and flushing of input and output on interrupts are handled properly. The optional argument .B \-8 allows an eight-bit input data path at all times; otherwise parity bits are stripped except when the remote side's stop and start characters are other than ^S/^Q. The argument .B \-L allows the rlogin session to be run in litout mode. A line of the form ``~.'' disconnects from the remote host, where ``~'' is the escape character. Similarly, the line ``~^Z'' (where ^Z, control-Z, is the suspend character) will suspend the rlogin session. Substitution of the delayed-suspend character (normally ^Y) for the suspend character suspends the send portion of the rlogin, but allows output from the remote system. A different escape character may be specified by the .B \-e option. There is no space separating this option flag and the argument character. With the .B \-E option the escape can be turned off. .SH SEE ALSO .BR rsh (1), .BR rhosts (5). .SH BUGS More of the environment should be propagated. .TH RMDIR 1 .SH NAME rmdir \- remove a directory .SH SYNOPSIS \fBrmdir \fIdirectory ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "rmdir /user/ast/foobar" "Remove directory \fIfoobar\fP" .EX "rmdir /user/ast/f*" "Remove 0 or more directories" .SH DESCRIPTION .PP The specified directories are removed. Ordinary files are not removed. The directories must be empty. .SH "SEE ALSO" .BR mkdir (1), .BR rmdir (2). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rsh.1c 6.1 (Berkeley) 4/29/85 .\" .TH RSH 1 "April 29, 1985" .UC 5 .SH NAME rsh \- remote shell .SH SYNOPSIS .B rsh .RB [ \-n ] .RB [ \-l .IR username ] .I host .RI [ command ] .br .I host .RB [ \-n ] .RB [ \-l .IR username ] .RI [ command ] .SH DESCRIPTION .B Rsh connects to the specified .IR host , and executes the specified \fIcommand\fR. .B Rsh copies its standard input to the remote command, the standard output of the remote command to its standard output, and the standard error of the remote command to its standard error. Interrupt, quit and terminate signals are propagated to the remote command; \fBrsh\fP normally terminates when the remote command does. .PP The remote username used is the same as your local username, unless you specify a different remote name with the .B \-l option. This remote name must be equivalent (in the sense of .BR rlogin (1)) to the originating account; no provision is made for specifying a password with a command. .PP If you omit .IR command , then instead of executing a single command, you will be logged in on the remote host using .BR rlogin (1). .PP Shell metacharacters which are not quoted are interpreted on local machine, while quoted metacharacters are interpreted on the remote machine. Thus the command .PP .RS rsh otherhost cat remotefile >> localfile .RE .PP appends the remote file .I remotefile to the localfile .IR localfile , while .PP .RS rsh otherhost cat remotefile ">>" otherremotefile .RE .PP appends .I remotefile to .IR otherremotefile . .SH OPTIONS .TP .BI \-l " username" Specify the remote user name. .TP .B \-n Connect standard input of the remote command to /dev/null. Do this if .B rsh should not inadvertently read from standard input. .SH SEE ALSO .BR rcp (1), .BR rlogin (1), .BR rhosts (5). .SH BUGS You cannot run an interactive command (like .BR rogue (6) or .BR vi (1)); use .BR rlogin (1). .TH RZ 1 .SH NAME rz \- receive a file using the zmodem protocol .SH SYNOPSIS \fBrz\fR [\-\fBabepqvy\fR]\fR [\fB\-t \fItimeout\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "CP/M to UNIX conventions" .FL "\-b" "Binary file" .FL "\-e" "Escape for all control characters" .FL "\-p" "Protect file if it already exists" .FL "\-q" "Quiet; opposite of verbose" .FL "\-t" "Set \fItimeout\fR in tenths of a second" .FL "\-v" "Verbose; opposite of quiet" .FL "\-y" "Yes, clobber existing files" .SH EXAMPLES .EX "rz /dev/tty01" "Receive a file" .SH DESCRIPTION .PP The XMODEM, YMODEM, and ZMODEM family of file transfer programs are widely used on personal computers. \s-2MINIX\s+2 supports ZMODEM, the most advanced of the set. The programs \fIsz\fR and \fIrz\fR are used for sending and receiving, respectively. .PP \fIRz\fR and \fIsz\fR are programs that uses an error correcting protocol to transfer files over a dial-in serial port from a variety of programs running under various operating systems. \fIRz\fR (Receive ZMODEM) receives files with the ZMODEM batch protocol. Pathnames are supplied by the sending program, and directories are made if necessary (and possible). The meanings of the available options are: .in +0.25i .ti -0.25i .B \-a .br Convert files to \s-2UNIX\s+2 conventions by stripping carriage returns and all characters beginning with the first Control Z (CP/M end of file). .ti -0.25i .B \-b .br Binary (tell it like it is) file transfer override. .ti -0.25i .B \-c .br Request 16 bit CRC. XMODEM file transfers default to 8 bit checksum. YMODEM and ZMODEM normally use 16 bit CRC. .ti -0.25i .B \-D .br Output file data to /dev/null; for testing. .ti -0.25i .B \-e .br Force sender to escape all control characters; normally XON, XOFF, DLE, CR-@-CR, and Ctrl-X are escaped. .ti -0.25i .B \-p .br Protect: skip file if destination file exists. .ti -0.25i .B \-q .br Quiet suppresses verbosity. .ti -0.25i .B \-t .br Change timeout tenths of seconds (timeout follows flag). .ti -0.25i .B \-v .br Verbose causes a list of file names to be appended to \fI/tmp/rzlog\fR. More v's generate more output. .ti -0.25i .B \-y .br Yes, clobber any existing files with the same name. .in -0.25i .SH "SEE ALSO" .BR sz (1), .BR term (1). .TH sed 1 "November 19, 1995" .SH NAME sed \- the stream editor .SH SYNOPSIS .B sed .RB [ \-n ] .RB [ \-g ] .RB [ \-e .IR script ] .RB [ \-f .IR sfile ] .RI [ file " ...]" .SH DESCRIPTION Sed copies the named files (standard input default) to the standard output, edited according to a script of commands. .P An .B \-e option supplies a single edit command from the next argument; if there are several of these they are executed in the order in which they appear. If there is just one .B \-e option and no .BR \-f "'s," the .B \-e flag may be omitted. .P An .B \-f option causes commands to be taken from the file "sfile"; if there are several of these they are executed in the order in which they appear; .B \-e and .B \-f commands may be mixed. .P The .B \-g option causes .B sed to act as though every substitute command in the script has a .B g suffix. .P The .B \-n option suppresses the default output. .P A script consists of commands, one per line, of the following form: .PP [address [, address] ] function [arguments] .PP Normally .B sed cyclically copies a line of input into a current text buffer, then applies all commands whose addresses select the buffer in sequence, then copies the buffer to standard output and clears it. .P The .B \-n option suppresses normal output (so that only .B p and .B w output is done). Also, some commands .RB ( n , .BR N ) do their own line reads, and some others .RB ( d , .BR D ) cause all commands following in the script to be skipped (the .B D command also suppresses the clearing of the current text buffer that would normally occur before the next cycle). .P It is also helpful to know that there's a second buffer (called the `hold space' that can be copied or appended to or from or swapped with the current text buffer. .P An address is: a decimal numeral (which matches the line it numbers where line numbers start at 1 and run cumulatively across files), or a `$' that addresses the last line of input, or a context address, which is a `/regular expression/', in the style of .BR ed (1) modified thus: .P .TP 5 (1) The escape sequence `\en' matches a newline embedded in the buffer, and `\et' matches a tab. .TP 5 (2) A command line with no addresses selects every buffer. .TP 5 (3) A command line with one address selects every buffer that matches that address. .TP 5 (4) A command line with two addresses selects the inclusive range from the first input buffer that matches the first address through the next input buffer that matches the second. (If the second address is a number less than or equal to the line number first selected, only one line is selected.) Once the second address is matched .B sed starts looking for the first one again; thus, any number of these ranges will be matched. .P The negation operator '!' can prefix a command to apply it to every line not selected by the address(es). .P In the following list of functions, the maximum number of addresses permitted for each function is indicated in parentheses. .P An argument denoted "text" consists of one or more lines, with all but the last ending with `\e' to hide the newline. .P Backslashes in text are treated like backslashes in the replacement string of an .B s command and may be used to protect initial whitespace (blanks and tabs) against the stripping that is done on every line of the script. .P An argument denoted "rfile" or "wfile" must be last on the command line. Each wfile is created before processing begins. There can be at most 10 distinct wfile arguments. .ta +\w'nm'u +\w'"command"m'u .TP 5 a "text" (1) Append. Place text on output before reading the next input line. .TP 5 b "label" (2) Branch to the `:' command bearing the label. If no label is given, branch to the end of the script. .TP 5 c "text" (2) Change. Delete the current text buffer. With 0 or 1 address, or at the end of a 2-address range, place text on the output. Start the next cycle. .TP 5 d (2) Delete the current text buffer. Start the next cycle. .TP 5 D (2) Delete the first line of the current text buffer (all chars up to the first newline). Start the next cycle. .TP 5 g (2) Replace the contents of the current text buffer with the contents of the hold space. .TP 5 G (2) Append the contents of the hold space to the current text buffer. .TP 5 h (2) Copy the current text buffer into the hold space. .TP 5 H (2) Append a copy of the current text buffer to the hold space. .TP 5 i "text" (1) Insert. Place text on the standard output. .TP 5 l (2) List. Sends the pattern space to standard output. A "w" option may follow as in the .B s command below. Non-printable characters expand to: .sp .4v .in +3 .nf .ta +\w'xxxn'u +\w'nnnn'u +\w'backspace 'u \eb \-\- backspace (ASCII 08) \et \-\- tab (ASCII 09) \en \-\- newline (ASCII 10) \er \-\- return (ASCII 13) \ee \-\- escape (ASCII 27) \exx \-\- the ASCII character corresponding to 2 hex digits xx. .fi .in -3 .ta +\w'nm'u +\w'"command"m'u .TP 5 n (2) Copy the current text buffer to standard output. Read the next line of input into it. .TP 5 N (2) Append the next line of input to the current text buffer, inserting an embedded newline between the two. The current line number changes. .TP 5 p (2) Print. Copy the current text buffer to the standard output. .TP 5 P (2) Copy the first line of the current text buffer (all chars up to the first newline) to standard output. .TP 5 q (1) Quit. Branch to the end of the script. Do not start a new cycle. .TP 5 r "rfile" (1) Read the contents of rfile. Place them on the output before reading the next input line. .TP 5 s /regular-expression/replacement/flags\0\0\0\0\0\0(2) Substitute the replacement for instances of the regular expression in the current text buffer. Any character may be used instead of `/'. For a fuller description see ed (1). Flags is zero or more of the following: .sp .4v .ta +\w'gm'u +\w'nnm'u .in +\w'gmnnm'u .ti -\w'gmnnm'u g \-\- Global. Substitute for all nonoverlapping instances of the string rather than just the first one. .sp .4v .ti -\w'gmnnm'u p \-\- Print the pattern space if a replacement was made. .sp .4v .ti -\w'gmnnm'u w \-\- Write. Append the current text buffer to a file argument as in a w command if a replacement is made. Standard output is used if no file argument is given .in -\w'gmnnm'u .ta +\w'nm'u +\w'"command"m'u .TP 5 t "label" (2) Branch-if-test. Branch to the .B : command with the given label if any substitutes have been made since the most recent read of an input line or execution of a .B t or .BR T . If no label is given, branch to the end of the script. .TP 5 T "label" (2) Branch-on-error. Branch to the .B : command with the given label if no substitutes have succeeded since the last input line or .B t or .B T command. Branch to the end of the script if no label is given. .TP 5 w "wfile" (2) Write. Append the current text buffer to wfile. .TP 5 W "wfile" (2) Write first line. Append first line of the current text buffer to wfile. .TP 5 x (2) Exchange the contents of the current text buffer and hold space. .TP 5 y /string1/string2/\0\0\0\0\0\0(2) Translate. Replace each occurrence of a character in string1 with the corresponding character in string2. The lengths of these strings must be equal. .TP 5 ! "command" (2) All-but. Apply the function (or group, if function is .BR { ) only to lines not selected by the address(es). .TP 5 : "label" (0) This command does nothing but hold a label for .B b and .B t commands to branch to. .TP 5 = (1) Place the current line number on the standard output as a line. .TP 5 { (2) Execute the following commands through a matching `}' only when the current line matches the address or address range given. .P An empty command is ignored. .P .SH PORTABILITY This tool was reverse-engineered from BSD 4.1 UNIX .BR sed , and (as far as the author's knowledge and tests can determine) is compatible with it. All documented features of BSD 4.1 sed are supported. .P One undocumented feature (a leading 'n' in the first comment having the same effect as an .B \-n command-line option) has been omitted. .P The following bugs and limitations have been fixed: .TP 5 \(bu There is no hidden length limi"""t (40 in BSD sed) on .B w file names. .TP 5 \(bu There is no limit (8 in BSD sed) on the length of labels. .TP 5 \(bu The exchange command now works for long pattern and hold spaces. .P The following enhancements to existing commands have been made: .TP 5 \(bu .BR a , .B i commands don't insist on a leading backslash-\en in the text. .TP 5 \(bu .BR r , .B w commands don't insist on whitespace before the filename. .TP 5 \(bu The .BR g , .B p and .B P options on .B s commands may be given in any order. .P Some enhancements to regular-expression syntax have been made: .TP 5 \(bu \et is recognized in REs (and elsewhere) as an escape for tab. .TP 5 \(bu In an RE, + calls for 1..n repeats of the previous pattern. .P The following are completely new features: .TP 5 \(bu The .B l command (list, undocumented and weaker in BSD) .TP 5 \(bu The .B W command (write first line of pattern space to file). .TP 5 \(bu The .B T command (branch on last substitute failed). .TP 5 \(bu Trailing comments are now allowed on command lines. .P In addition, .BR sed "'s" error messages have been made more specific and informative. .P The implementation is also significantly smaller and faster than BSD 4.1 sed. It uses only the standard I/O library and exit(3). .P .SH NOTE .P This is a freeware component of the GNU and MINIX operating systems. The user is hereby granted permission to use, modify, reproduce and distribute it subject to the following conditions: .P 1. The authorship notice appearing in each source file may not be altered or deleted. .P 2. The object form may not be distributed without source. .P .SH SEE ALSO .P .BR cgrep (1), .BR fgrep (1), .BR grep (1), .BR lex (1), .BR regexp (5), .BR awk (9). .P .SH AUTHOR Eric S. Raymond .TH SHAR 1 .SH NAME shar \- shell archiver .SH SYNOPSIS \fBshar \fIfile ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "shar *.c >s" "Collect C programs in shell archive" .EX "sh 4 chars in \fIa.out\fR" .EX "strings \- /bin/sh" "Search entire shell file (text and data)" .SH DESCRIPTION .PP \fIStrings\fR looks for sequences of ASCII characters followed by a zero byte. These are usually strings. This program is typically used to help identify unknown binary programs .TH STRIP 1 .SH NAME strip \- remove symbol table from executable file .SH SYNOPSIS \fBstrip\fR [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "strip a.out" "Remove symbols from \fIa.out\fR" .SH DESCRIPTION .PP For each file argument, \fIstrip\fR removes the symbol table. Strip makes a copy of the file being stripped, so links are lost. .SH "SEE ALSO" .BR install (1). zstty.1{su.1|sum.1}svc.1~synctree.1sz.1tail.1tar.1tee.1telnet.1term.1termcap.1tget.1time.1touch.1tr.1true.1tsort.1tty.1umount.1uname.1unexpand.1uniq.1uud.1uue.1vol.1wc.1whatis.1whereis.1which.1who.1whoami.1write.1yacc.1yap.1yes.1.TH STTY 1 .SH NAME stty \- set terminal parameters .SH SYNOPSIS .de SP .if t .sp 0.4 .if n .sp .. .in +4n .ti -4n .B stty .RB [ \-ag] .SP .ti -4n .B stty .I encoded-form .SP .ti -4n .B stty .I speed .B ispeed .I speed .B ospeed .I speed .B "cs5 cs6 cs7 cs8" .RB [ \- ] parenb .RB [ \- ] parodd .RB [ \- ] hupcl .RB [ \- ] cstopb .RB [ \- ] cread .RB [ \- ] clocal .RB [ \- ] ignbrk .RB [ \- ] brkint .RB [ \- ] ignpar .RB [ \- ] parmrk .RB [ \- ] inpck .RB [ \- ] istrip .RB [ \- ] inlcr .RB [ \- ] igncr .RB [ \- ] icrnl .RB [ \- ] ixon .RB [ \- ] ixoff .RB [ \- ] ixany .RB [ \- ] opost .RB [ \- ] onlcr .RB [ \- ] xtabs .RB [ \- ] onoeot .RB [ \- ] isig .RB [ \- ] icanon .RB [ \- ] iexten .RB [ \- ] echo .RB [ \- ] echoe .RB [ \- ] echok .RB [ \- ] echonl .RB [ \- ] noflsh .RB [ \- ] lflusho .BR eof =\fIc .BR eol =\fIc .BR erase =\fIc .BR erase =\fIc .BR intr =\fIc .BR kill =\fIc .BR quit =\fIc .BR susp =\fIc .BR start =\fIc .BR stop =\fIc .BR rprnt =\fIc .BR lnext =\fIc .BR flush =\fIc .BR min =\fIn .BR time =\fIn .B rows .I n .B cols .I n .B xpixels .I n .B ypixels .I n .B cooked .B raw .RB [ \- ] evenp .RB [ \- ] parity .RB [ \- ] oddp .RB [ \- ] nl .B ek .B sane .in -4n .SH DESCRIPTION .B Stty shows or changes the parameters of the terminal connected to standard input. .B Stty takes a myriad of arguments most of which are mapped directly to the flags and special characters described in .BR tty (4), so we won't describe them here. .PP .B Stty has three forms of operation. First, without any arguments .B stty shows all terminal attributes that are different from the default state. Option .B \-a makes .B stty print all terminal attributes, and .B \-g lets .B stty print the attributes in a special encoded form, a simple row of colon separated hexadecimal numbers. .PP In the second form of operation .B stty takes an encoded form as produced by the .B \-g option and sets the terminals attributes to its decoded value. .PP In the third form .B stty interprets a series of flags and parameters settings and modifies the terminal attributes accordingly. Flags can be given as .B icanon or .B \-icanon for instance, either setting or clearing the .B ICANON flag. Special character values can by set like .B "intr=^C" for example, which sets the interrupt character to CTRL-C. You can either use a real CTRL-C, or the two characters `^' and `C'. In any case it is probably necessary to use quotes to guard it from the shell: .BR "intr='^C'" . .PP A number alone is interpreted as a baud rate setting for both the input and output rate. The input or the output rate can be set separately with use of the .B ispeed and .B ospeed prefixes to the number. The character size can be set with .BR cs5 , .BR cs6 , .BR cs7 or .BR cs8 . .PP The .B MIN and .B TIME value, the number of rows and columns, and the xpixels and ypixels of the window can also be set using one of the keywords .BR min , .BR time , .BR rows , .BR cols , .BR xpixels or .BR ypixels , followed by a decimal number that is the value of the setting. .PP .B Stty accepts several keywords that are not named by corresponding flags or parameters in .BR tty (4). They set several attributes at once: .TP .B cooked Same as .BR "icrnl ixon opost onlcr isig icanon iexten echo" , setting all the attributes that are needed for line oriented mode. .TP .B raw Same as .BR "\-icrnl \-ixon \-opost \-onlcr \-isig \-icanon \-iexten \-echo" , setting all the attributes for a raw data channel. .TP .B evenp parity These synonyms are equal to .BR "cs7 parenb \-parodd" , setting the line to 7 bits even parity. .TP .B oddp Same as .BR "cs7 parenb parodd" , setting the line to 7 bits odd parity. .TP .B "\-parity \-evenp \-oddp" All synonyms for .BR "cs8 \-parenb" , setting the line to 8 bits, no parity. .TP .B nl Same as .BR icrnl , setting carriage return to line feed input translation. .TP .B \-nl Same as .BR "\-icrnl \-inlcr \-igncr" , disabling any carriage return or line feed handling. .TP .B ek Set the .B ERASE and .B KILL special characters back to the default. .TP .B sane Set all attributes to the default except things like the line speed and parity, because their "sane" value is probably what it is right now. The default values are compiled into .B stty from the include file. Use .B "stty sane; stty -a" to know what they are. .SH FILES .TP 15n .B /etc/ttytab The .B init field of this file may contain an .B stty command to set the attributes to match an attached RS232 terminal or modem. .SH "SEE ALSO" .BR tty (4), .BR ttytab (5). .SH NOTES The .BR cooked , .BR raw , .BR rows , .BR cols , .BR xpixels and .BR ypixels keywords are Minix additions beyond the keywords defined by POSIX. .B Rows and .B cols are common UNIX extensions, however. There are more Minix specific flags that match the Minix specific attributes described in .BR tty (4). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH SU 1 .SH NAME su \- temporarily log in as superuser or another user .SH SYNOPSIS \fBsu\fR [\fIname\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "su " "Become superuser" .EX "su ast" "Become \fIast\fR" .SH DESCRIPTION .PP .I Su can be used to temporarily login as another user. It prompts for the superuser password. If the correct password is entered, .I su creates a shell with the desired uid. If no name is specified, \fIroot\fR is assumed. To exit the temporary shell, type CTRL-D. When memory is tight, it is better to become superuser by logging out and then logging in again as \fIroot\fR, rather than using \fIsu\fR since the latter creates an extra shell in memory. Any user with a zero group id need not type a password. This makes life easier for the system administrator. .SH "SEE ALSO" .BR login (1). .TH SUM 1 .SH NAME sum \- compute the checksum and block count of a file .SH SYNOPSIS \fBsum \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "sum /user/ast/xyz" "Checksum \fI/user/ast/xyz" .SH DESCRIPTION .PP .I Sum computes the checksum of one or more files. It is most often used to see if a file copied from another machine has been correctly received. This program works best when both machines use the same checksum algorithm. See also \fIcrc\fR. .SH "SEE ALSO" .BR cksum (1), .BR crc (1). .TH SVC 1 .SH NAME svc, ci, co, svclog \- shell version control system .SH SYNOPSIS \fBci\fR [\fB\-lu\fR]\fR \fIfile\fR .br \fBco\fR [\fB\-l\fR]\fR [\fB\-r \fIrev\fR] \fIfile\fR .br \fBsvclog \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-l" "For \fIci\fR, checkin, checkout again, and lock file" .FL "\-l" "For \fIco\fR, checkout file and then lock the archive" .FL "\-u" "After checking in, do not delete the file" .FL "\-r" "Check out revision \fIrev\fR instead most recent revision .SH EXAMPLES .EX "ci \-u file" "Check in \fIfile\fR" .EX "co \-l file" "Check out \fIfile\fR and lock archive" .EX "co \-r 2 file" "Check out version 2" .SH DESCRIPTION .PP \fISvc\fR is the Shell Version Control system, patterned on RCS. It maintains a sequence of versions in archive files, so that new versions can be checked in (added to the archive), and old versions can be checked out (made available). To create an archive for \fIfile\fR, check it in with the \fB\-u\fR flag. This action will prompt for a log message and then create an archive called \fIfile,S\fR in the current directory, or in the subdirectory \fISVC\fR if it exists. The file will not be deleted, but will be made unwritable. .PP To update the file, check it out with the \fB\-l\fR flag. Then modify it, and check it back in, giving a new message when prompted. After this process has been repeated many times, the archive will contain the entire history. Any version can be checked out using the \fB\-r\fR flag. To get a printout of the history, use \fIsvclog\fR. .TH SYNCTREE 1 .SH NAME synctree \- synchronize directory trees. .SH SYNOPSIS .nf \fBsynctree\fP [\fB\-iuf\fP] [[\fIuser1\fP@]\fImachine1\fP:]\fIdir1\fP [[\fIuser2\fP@]\fImachine2\fP:]\fIdir2\fP .fi .SH DESCRIPTION .B Synctree synchronizes the directory tree rooted at \fIdir2\fP with \fIdir1\fP. It walks recursively through both trees, and deletes and adds files in \fIdir2\fP to make it equal to \fIdir1\fP. Mode, owner and group are set for each file unless the \fB\-u\fP flag is given. In its normal mode of operation, synctree will ask if it may delete or add directories assuming that you don't want to. Non-directories are simply deleted or added, but synctree will ask if it needs to update a normal file with a default answer of 'y'. Simply typing return will choose the default answer, typing end-of-file is like typing return to this question and all other questions. .PP You can specify a hostname and user-id to be used to access \fIdir1\fP or \fIdir2\fP. Synctree will use \fBrsh\fP(1) to run a copy of itself on the remote machine. The call interface mimics that of \fBrcp\fP(1), but you can use more than one user@machine prefix if you want to make things really interesting. .PP Hard links are enforced, an update is done by first deleting the old file so that links to unknown files are broken. Links to files within \fIdir2\fP will be restored. .PP If either directory contains the file \fB.backup\fP, then this file will be used as an alternate inode table. This allows one to make a backup copy of a file tree full of special files and differing user-ids on a remote machine under an unpriviledged user-id. .PP .SH OPTIONS .TP 5 .B \-i Ask for permission (with default answer 'n') to delete or add any file or directory. .TP 5 .B \-u Only install newer files, i.e. merge the directory trees. .TP 5 .B \-f Don't ask, think 'yes' on any question. .SH "SEE ALSO" .BR remsync (1), .BR cpdir (1), .BR rsh (1), .BR rcp (1), .BR perror (3). .SH DIAGNOSTICS Messages may come from three different processes. One named "Slave" running in \fIdir1\fP, one named "Master" running in \fIdir2\fP, and synctree itself in a mediator role. The mediator will also perform the task of either the master or the slave if one of them is running locally. You need to know this to interpret the error messages coming from one of these processes. The messages are normally based on \fBperror\fP(3). Failure to contact a remote machine will be reported by \fBrsh\fP. \fBSynctree\fP should have a zero exit status if no errors have been encountered. .SH BUGS Directory \fIdir2\fP will be created without asking. .PP The master and slave processes get their error output mixed up sometimes (nice puzzle). .PP The local and remote machine must use the same file type encoding. .PP The link replacement strategy may lead to lack of space on a small device. Let \fBsynctree\fP run to completion and then rerun it to pick up the pieces. .PP Letting the local process keep its "synctree" name may be a mistake. .PP It talks too much. .SH AUTHOR Kees J. Bot, (kjb@cs.vu.nl) .TH SZ 1 .SH NAME sz \- send a file using the zmodem protocol .SH SYNOPSIS \fBsz\fR [\fB\-LNbdefnopqruvy+\fR]\fR [\fB\-ci \fIcommand\fR] [\fB\-Ll\fR n\fR] [\fB\-t \fItimeout\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-L" "Use \fIn\fR-byte packets" .FL "\-N" "Overwrite if source is newer/longer" .FL "\-b" "Binary file" .FL "\-c" "Send command for execution" .FL "\-d" "Convert dot to slash in names" .FL "\-e" "Escape for all control characters" .FL "\-f" "Send full path name" .FL "\-i" "Send command and return immediately" .FL "\-l" "Flow control every \fIn\fR packets" .FL "\-n" "Overwrite destination if source is newer" .FL "\-o" "Use old (16-bit) checksum" .FL "\-p" "Protect file if it already exists" .FL "\-q" "Quiet; opposite of verbose" .FL "\-r" "Resume interrupt file transfer" .FL "\-t" "Set \fItimeout\fR in tenths of a second" .FL "\-u" "Unlink file after successful transmission" .FL "\-v" "Verbose; opposite of quiet" .FL "\-y" "Yes, clobber existing files" .FL "\-+" "Append to an existing file" .SH EXAMPLES .EX "sz file /dev/tty01" "Send \fIfile\fR" .SH DESCRIPTION .PP XMODEM, YMODEM, and ZMODEM are a family of protocols that are widely used is the \s-2MS-DOS\s0 world for transferring information reliably from one computer to another. In all of these protocols, a series of bytes are sent from one computer to the other, and then an acknowledgement is sent back to confirm correct reception. Checksums are used to detect errors so that transmission is reliable even in the face of noisy telephone lines. \fISz\fR is a program that sends a file sent from another computer using the zmodem protocol. The file can be received using \fIrz\fR. .PP \fISz\fR uses the ZMODEM error correcting protocol to send one or more files over a dial-in serial port to a variety of programs running under \s-2MINIX\s+2, \s-2UNIX\s+2, \s-2MS-DOS\s0, \s-2CP/M\s0, \s-2VMS\s0, and other operating systems. It is the successor to XMODEM and YMODEM. .PP ZMODEM greatly simplifies file transfers compared to XMODEM. In addition to a friendly user interface, ZMODEM provides Personal Computer and other users an efficient, accurate, and robust file transfer method. .PP ZMODEM provides complete end-to-end data integrity between application programs. ZMODEM's 32 bit CRC catches errors that sneak into even the most advanced networks. .PP Output from another program may be piped to \fIsz\fR for transmission by denoting standard input with \-: .PP .B " ""ls \-l | sz \-" .PP The program output is transmitted with the filename \fIsPID.sz\fR where PID is the process ID of the \fIsz\fR program. If the environment variable \fIONAME\fR is set, that is used instead. In this case, the command: .PP .B " ""ls \-l | ONAME=con sz \-ay \-" .PP will send a \&'file\&' to the PC-DOS console display. The \fB\-y\fR option instructs the receiver to open the file for writing unconditionally. The \fB\-a\fR option causes the receiver to convert \s-2UNIX\s+2 newlines to PC-DOS carriage returns and linefeeds. On \s-2UNIX\s+2 systems, additional information about the file is transmitted. If the receiving program uses this information, the transmitted file length controls the exact number of bytes written to the output dataset, and the modify time and file mode are set accordingly. .PP If \fIsz\fR is invoked with $SHELL set and if that variable contains the string \fIrsh\fR or \fIrksh\fR (restricted shell), \fIsz\fR operates in restricted mode. Restricted mode restricts pathnames to the current directory and \fIPUBDIR\fR (usually \fI/usr/spool/uucppublic\fR) and/or subdirectories thereof. .PP The options and flags available are: .in +0.25i .ti -0.25i .B \-+ .br Instruct the receiver to append transmitted data to an existing file. .ti -0.25i .B \-a .br Convert NL characters in the transmitted file to CR/LF. This is done by the sender for XMODEM and YMODEM, by the receiver for ZMODEM. .ti -0.25i .B \-b .br Binary override: transfer file without any translation. .ti -0.25i .B \-c .br Send COMMAND (follows \fIc\fR) to the receiver for execution, return with COMMAND's exit status. .ti -0.25i .B \-d .br Change all instances of \&'.\&' to \&'/\&' in the transmitted pathname. Thus, C.omenB0000 (which is unacceptable to \s-2MS-DOS\s0 or CP/M) is transmitted as C/omenB0000. If the resultant filename has more than 8 characters in the stem, a \&'.\&' is inserted to allow a total of eleven. .ti -0.25i .B \-e .br Escape all control characters; normally XON, XOFF, DLE, CR-@-CR, and Ctrl-X are escaped. .ti -0.25i .B \-f .br Send Full pathname. Normally directory prefixes are stripped from the transmitted filename. .ti -0.25i .B \-i .br Send COMMAND (follows \fIi\fR) to the receiver for execution, return Immediately upon the receiving program's successful reception of the command. .ti -0.25i .B \-L .br Use ZMODEM sub-packets of length \fIn\fR (follows \fIL\fR). A larger \fIn\fR (32 <= \fIn\fR <= 1024) gives slightly higher throughput, a smaller one speeds error recovery. The default is 128 below 300 baud, 256 above 300 baud, or 1024 above 2400 baud. .ti -0.25i .B \-l .br Wait for the receiver to acknowledge correct data every \fIn\fR (32 <= \fIn\fR <= 1024) characters. This may be used to avoid network overrun when XOFF flow control is lacking. .ti -0.25i .B \-n .br Send each file if destination file does not exist. Overwrite destination file if source file is newer than the destination file. .ti -0.25i .B \-N .br Send each file if destination file does not exist. Overwrite destination file if source file is newer or longer than the destination file. .ti -0.25i .B \-o .br Disable automatic selection of 32 bit CRC. .ti -0.25i .B \-p .br Protect existing destination files by skipping transfer if the destination file exists. .ti -0.25i .B \-q .br Quiet suppresses verbosity. .ti -0.25i .B \-r .br Resume interrupted file transfer. If the source file is longer than the destination file, the transfer commences at the offset in the source file that equals the length of the destination file. .ti -0.25i .B \-t .br Change timeout. The timeout, in tenths of seconds, follows, the \fB\-t\fR flag. .ti -0.25i .B \-u .br Unlink the file after successful transmission. .ti -0.25i .B \-w .br Limit the transmit window size to \fIn\fR bytes (\fIn follows \fB(enw\fR). .ti -0.25i .B \-v .br Verbose causes a list of file names to be appended to \fI/tmp/szlog\fR. .ti -0.25i .B \-y .br Instruct a ZMODEM receiving program to overwrite any existing file with the same name. .ti -0.25i .B \-Y .br Instruct a ZMODEM receiving program to overwrite any existing file with the same name, and to skip any source files that do have a file with the same pathname on the destination system. .in -0.25i .SS "Examples" .PP Below are some examples of the use of \fIsz\fR. .PP .B " ""sz \-a \d\s+2*\s0\u.c" .PP This single command transfers all .c files in the current directory with conversion (\fB\-a\fR) to end-of-line conventions appropriate to the receiving environment. .sp .B " ""sz \-Yan \d\s+2*\s0\u.c \d\s+2*\s0\u.h" .PP .LP Send only the \fI.c\fR and \fI.h\fR files that exist on both systems, and are newer on the sending system than the corresponding version on the receiving system, converting \s-2MINIX\s+2 to \s-2MS-DOS\s0 text format. .SH "SEE ALSO" .BR rz (1), .BR term (1). 1".TH TAIL 1 .SH NAME tail \- print the last few lines of a file .SH SYNOPSIS \fBtail\fR [\fB\-c \fIn\fR] [\fB\-f] [\fB\-n \fIn\fR] [\fIfile\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "The count refers to characters" .FL "\-f" "On FIFO or special file, keep reading after EOF" .FL "\-n" "The count refers to lines" .SH EXAMPLES .EX "tail \-n 6" "Print last 6 lines of \fIstdin\fR" .EX "tail \-c 20 file" "Print the last 20 characters of \fIfile\fR" .EX "tail \-n 1 file1 file2" "Print last line of two files" .EX "tail \-n +8 file" "Print the tail starting with line 8" .SH DESCRIPTION .PP The last few lines of one or more files are printed. The default count is 10 lines. The default file is \fIstdin\fR. If the value of \fIn\fR for the \fB\-c\fR or \fB\-n\fR flags starts with a + sign, counting starts at the beginning, rather than the end of the file. .SH "SEE ALSO" .BR head (1). .TH TAR 1 .SH NAME tar \- tape archiver .SH SYNOPSIS \fBtar\fR [\fBFcotvxp\fR]\fR [\fBf\fR] \fItarfile \fIfile ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "F" "Force tar to continue after an error" .FL "c" "Create a new archive; add named files" .FL "o" "Set uid/gid to original values on extraction" .FL "f" "Next argument is name of tarfile" .FL "t" "Print a table listing the archive's contents" .FL "v" "Verbose mode-tell what is going on as it happens" .FL "x" "The named files are extracted from the archive" .FL "p" "Restore file modes, ignore creation mask" .FL "D" "Directory only, do not recurse" .SH EXAMPLES .EX "tar c /dev/fd1 ." "Back up current directory to \fI/dev/fd1\fR" .EX "tar xv /dev/fd1 file1 file2" "Extract two files from the archive" .EX "tar cf \- | (cd dest; tar xf \-)" "Copy current directory to \fIdest\fR" .SH DESCRIPTION .PP \fITar\fR is a POSIX-compatible archiver, except that it does not use tape. It's primary advantage over .I ar is that the .I tar format is somewhat more standardized than the .I ar format, making it theoretically possible to transport \s-2MINIX\s+2 files to another computer, but do not bet on it. If the target machine runs \&MS-DOS , try .I doswrite . .SH "SEE ALSO" .BR compress (1), .BR vol (1). .TH TEE 1 .SH NAME tee \- divert stdin to a file .SH SYNOPSIS \fBtee\fR [\fB\-ai\fR] \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "Append to the files, rather than overwriting" .FL "\-i" "Ignore interrupts" .SH EXAMPLES .EX "cat file1 file2 | tee x" "Save and display two files" .EX "pr file | tee x | lp" "Save the output of \fIpr\fP on \fIx\fP" .SH DESCRIPTION .PP .I Tee copies \fIstdin\fR to standard output. It also makes copies on all the files listed as arguments. .SH "SEE ALSO" .BR cat (1). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)telnet.1c 6.5 (Berkeley) 5/10/86 .\" .TH TELNET 1 "May 10, 1986" .UC 5 .SH NAME telnet \- user interface to the \s-1TELNET\s0 protocol .SH SYNOPSIS telnet [ .I host [ .I port ] ] .SH DESCRIPTION .I Telnet is used to communicate with another host using the .B TELNET protocol. If .I telnet is invoked without arguments, it enters command mode, indicated by its prompt (\*(lqtelnet>\*(rq). In this mode, it accepts and executes the commands listed below. If it is invoked with arguments, it performs an .B open command (see below) with those arguments. .PP Once a connection has been opened, .I telnet enters an input mode. The input mode entered will be either \*(lqcharacter at a time\*(rq or \*(lqline by line\*(rq depending on what the remote system supports. .PP In \*(lqcharacter at a time\*(rq mode, most text typed is immediately sent to the remote host for processing. .PP In \*(lqline by line\*(rq mode, all text is echoed locally, and (normally) only completed lines are sent to the remote host. The \*(lqlocal echo character\*(rq (initially \*(lq^E\*(rq) may be used to turn off and on the local echo (this would mostly be used to enter passwords without the password being echoed). .PP In either mode, if the .I localchars toggle is TRUE (the default in line mode; see below), the user's .IR quit , .IR intr , and .I flush characters are trapped locally, and sent as .B TELNET protocol sequences to the remote side. There are options (see .B toggle .I autoflush and .B toggle .I autosynch below) which cause this action to flush subsequent output to the terminal (until the remote host acknowledges the .B TELNET sequence) and flush previous terminal input (in the case of .I quit and .IR intr ). .PP While connected to a remote host, .I telnet command mode may be entered by typing the .I telnet \*(lqescape character\*(rq (initially \*(lq^]\*(rq). When in command mode, the normal terminal editing conventions are available. .PP .B COMMANDS .PP The following commands are available. Only enough of each command to uniquely identify it need be typed (this is also true for arguments to the .BR mode , .BR set , .BR toggle , and .B display commands). .PP .TP .B open \fIhost\fP \fR[\fP \fIport\fP \fR]\fP .br Open a connection to the named host. If no port number is specified, .I telnet will attempt to contact a .B TELNET server at the default port. The host specification may be either a host name (see .IR hosts (5)) or an Internet address specified in the \*(lqdot notation\*(rq (see .IR inet (3N)). .TP .B close .br Close a .B TELNET session and return to command mode. .TP .B quit .br Close any open .B TELNET session and exit .IR telnet . An end of file (in command mode) will also close a session and exit. .TP .B z .br Suspend .IR telnet . This command only works when the user is using the .IR csh (1). .TP .B mode \fItype\fP .br .I Type is either .I line (for \*(lqline by line\*(rq mode) or .I character (for \*(lqcharacter at a time\*(rq mode). The remote host is asked for permission to go into the requested mode. If the remote host is capable of entering that mode, the requested mode will be entered. .TP .B status .br Show the current status of .IR telnet . This includes the peer one is connected to, as well as the current mode. .TP .B display \fR[\fP \fIargument...\fP \fR]\fP .br Displays all, or some, of the .B set and .B toggle values (see below). .TP .B ? \fR[\fP \fIcommand\fP \fR]\fP .br Get help. With no arguments, .I telnet prints a help summary. If a command is specified, .I telnet will print the help information for just that command. .TP .B send \fIarguments\fP .br Sends one or more special character sequences to the remote host. The following are the arguments which may be specified (more than one argument may be specified at a time): .RS .TP .I escape .br Sends the current .I telnet escape character (initially \*(lq^]\*(rq). .TP .I synch .br Sends the .B TELNET SYNCH sequence. This sequence causes the remote system to discard all previously typed (but not yet read) input. This sequence is sent as TCP urgent data (and may not work if the remote system is a 4.2 BSD system -- if it doesn't work, a lower case \*(lqr\*(rq may be echoed on the terminal). .TP .I brk .br Sends the .B TELNET BRK (Break) sequence, which may have significance to the remote system. .TP .I ip .br Sends the .B TELNET IP (Interrupt Process) sequence, which should cause the remote system to abort the currently running process. .TP .I ao .br Sends the .B TELNET AO (Abort Output) sequence, which should cause the remote system to flush all output .B from the remote system .B to the user's terminal. .TP .I ayt .br Sends the .B TELNET AYT (Are You There) sequence, to which the remote system may or may not choose to respond. .TP .I ec .br Sends the .B TELNET EC (Erase Character) sequence, which should cause the remote system to erase the last character entered. .TP .I el .br Sends the .B TELNET EL (Erase Line) sequence, which should cause the remote system to erase the line currently being entered. .TP .I ga .br Sends the .B TELNET GA (Go Ahead) sequence, which likely has no significance to the remote system. .TP .I nop .br Sends the .B TELNET NOP (No OPeration) sequence. .TP .I ? .br Prints out help information for the .B send command. .RE .TP .B set \fIargument value\fP .br Set any one of a number of .I telnet variables to a specific value. The special value \*(lqoff\*(rq turns off the function associated with the variable. The values of variables may be interrogated with the .B display command. The variables which may be specified are: .RS .TP .I echo .br This is the value (initially \*(lq^E\*(rq) which, when in \*(lqline by line\*(rq mode, toggles between doing local echoing of entered characters (for normal processing), and suppressing echoing of entered characters (for entering, say, a password). .TP .I escape .br This is the .I telnet escape character (initially \*(lq^[\*(rq) which causes entry into .I telnet command mode (when connected to a remote system). .TP .I interrupt .br If .I telnet is in .I localchars mode (see .B toggle .I localchars below) and the .I interrupt character is typed, a .B TELNET IP sequence (see .B send .I ip above) is sent to the remote host. The initial value for the interrupt character is taken to be the terminal's .B intr character. .TP .I quit .br If .I telnet is in .I localchars mode (see .B toggle .I localchars below) and the .I quit character is typed, a .B TELNET BRK sequence (see .B send .I brk above) is sent to the remote host. The initial value for the quit character is taken to be the terminal's .B quit character. .TP .I flushoutput .br If .I telnet is in .I localchars mode (see .B toggle .I localchars below) and the .I flushoutput character is typed, a .B TELNET AO sequence (see .B send .I ao above) is sent to the remote host. The initial value for the flush character is taken to be the terminal's .B flush character. .TP .I erase .br If .I telnet is in .I localchars mode (see .B toggle .I localchars below), .B and if .I telnet is operating in \*(lqcharacter at a time\*(rq mode, then when this character is typed, a .B TELNET EC sequence (see .B send .I ec above) is sent to the remote system. The initial value for the erase character is taken to be the terminal's .B erase character. .TP .I kill .br If .I telnet is in .I localchars mode (see .B toggle .I localchars below), .B and if .I telnet is operating in \*(lqcharacter at a time\*(rq mode, then when this character is typed, a .B TELNET EL sequence (see .B send .I el above) is sent to the remote system. The initial value for the kill character is taken to be the terminal's .B kill character. .TP .I eof .br If .I telnet is operating in \*(lqline by line\*(rq mode, entering this character as the first character on a line will cause this character to be sent to the remote system. The initial value of the eof character is taken to be the terminal's .B eof character. .RE .TP .B toggle \fIargumen>"@"A"B"C"ts...\fP .br Toggle (between TRUE and FALSE) various flags that control how .I telnet responds to events. More than one argument may be specified. The state of these flags may be interrogated with the .B display command. Valid arguments are: .RS .TP .I localchars .br If this is TRUE, then the .IR flush , .IR interrupt , .IR quit , .IR erase , and .I kill characters (see .B set above) are recognized locally, and transformed into (hopefully) appropriate .B TELNET control sequences (respectively .IR ao , .IR ip , .IR brk , .IR ec , and .IR el ; see .B send above). The initial value for this toggle is TRUE in \*(lqline by line\*(rq mode, and FALSE in \*(lqcharacter at a time\*(rq mode. .TP .I autoflush .br If .I autoflush and .I localchars are both TRUE, then when the .IR ao , .IR intr , or .I quit characters are recognized (and transformed into .B TELNET sequences; see .B set above for details), .I telnet refuses to display any data on the user's terminal until the remote system acknowledges (via a .B TELNET .I Timing Mark option) that it has processed those .B TELNET sequences. The initial value for this toggle is TRUE if the terminal user had not done an "stty noflsh", otherwise FALSE (see .IR stty(1)). .TP .I autosynch If .I autosynch and .I localchars are both TRUE, then when either the .I intr or .I quit characters is typed (see .B set above for descriptions of the .I intr and .I quit characters), the resulting .B TELNET sequence sent is followed by the .B TELNET SYNCH sequence. This procedure .B should cause the remote system to begin throwing away all previously typed input until both of the .B TELNET sequences have been read and acted upon. The initial value of this toggle is FALSE. .TP .I crmod .br Toggle carriage return mode. When this mode is enabled, most carriage return characters received from the remote host will be mapped into a carriage return followed by a line feed. This mode does not affect those characters typed by the user, only those received from the remote host. This mode is not very useful unless the remote host only sends carriage return, but never line feed. The initial value for this toggle is FALSE. .TP .I debug .br Toggles socket level debugging (useful only to the .IR super user ). The initial value for this toggle is FALSE. .TP .I options .br Toggles the display of some internal .I telnet protocol processing (having to do with .B TELNET options). The initial value for this toggle is FALSE. .TP .I netdata .br Toggles the display of all network data (in hexadecimal format). The initial value for this toggle is FALSE. .TP .I ? .br Displays the legal .B toggle commands. .RE .SH BUGS .PP There is no adequate way for dealing with flow control. .PP On some remote systems, echo has to be turned off manually when in \*(lqline by line\*(rq mode. .PP There is enough settable state to justify a .RI . telnetrc file. .PP No capability for a .RI . telnetrc file is provided. .PP In \*(lqline by line\*(rq mode, the terminal's .I eof character is only recognized (and sent to the remote system) when it is the first character on a line. .TH TERM 1 .SH NAME term \- turn PC into a dumb terminal [IBM] .SH SYNOPSIS .in +.5i .ti -.5i \fBterm\fR [\fIbaudrate\fR]\fR [\fIparity\fR] [\fIbits_per_character\fR] [\fB\-\fIdial_string\fR] [\fB\-c\fIkcmd\fR] [\fIdevice\fR]\fR .in -.5i .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "term 2400" "Talk to modem at 2400 baud" .EX "term 1200 7 even" "1200 baud, 7 bits/char, even parity" .EX "term 8 9600 /dev/tty01" "9600 baud, 8 bits/char, no parity, use tty01" .EX "term -atdt12345 /dev/tty01" "Start with a command to dial out" .EX "term -cH'echo Hello World!' ..." "Bind a shell command to the 'H' key" .SH DESCRIPTION .PP \fITerm\fR allows \s-2MINIX\s+2 to talk to a terminal or modem over RS232 port 1. The program first sets the baudrate, parity and character length, and then forks. The parent sits in a loop copying from \fIstdin\fR (usually the console's keyboard), to the terminal or modem (\fI/dev/tty00\fR). The child sits in a loop copying from the terminal or modem (\fI/dev/tty00\fR) to standard output. Thus when RS232 port 1 is connected to a modem, every keystroke typed on the keyboard is sent to the modem, and every character arriving from the modem is displayed. Standard input and output may be redirected, to provide a primitive file transfer program, with no checking. Any argument that starts with .B \-at is sent out to the modem, usually to dial out. \fITerm\fP accepts several commands that are formed by typing the escape character, CTRL-], and a letter. Type CTRL-]? to see a list of commands. The subshell command is very important, it allows you to type in a ZMODEM command to transfer data. Do not quit \fIterm\fR to do this, or your modem line will be reset! \fITerm\fP keeps the modem line open on file descriptor 9 while running the subshell, so you can type .PP .in +.5i <&9 >&9 .in -.5i .PP at the end of your ZMODEM command to connect it to the modem. With .BI \-c kcmd arguments you can bind shell commands to keys. The character just after .BR \-c is the key to use, the rest of the characters form the command to bind to the key. This command also has the modem open on file descriptor 9. .LP Important note: to use \fIterm\fR, it is essential that \fI/etc/ttytab\fR is configured so that there is no login session started on the modem line. If there is, both the login session and term will try to read from the modem, and nothing will work. .SH "SEE ALSO" .BR rz (1), .BR sz (1). .TH TERMCAP 1 .SH NAME termcap \- print the current termcap entry .SH SYNOPSIS \fBtermcap\fR [\fItype\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "termcap" "Print the termcap entry" .SH DESCRIPTION .PP \fITermcap\fR reads the /etc/termcap entry corresponding to the terminal type supplied as the argument. If none is given, the current $TERM is used. It then prints out all the parameters that apply. .SH "SEE ALSO" .BR termcap (3). .TH TGET 1 .SH NAME tget \- get termcap values .SH SYNOPSIS .B tget .RB [ \-flag .IR id ] .RB [ \-num .IR id ] .RB [ \-str .IR id ] .RB [ \-goto .IR "col line" ] .RB [[ \-echo ] .IR string ] .SH DESCRIPTION .B Tget allows shell scripts access to the .BR termcap (3) functions. Flags, numbers and strings can be queried from the termcap database under the entry denoted by the environment variable .BR $TERM . .SH OPTIONS .TP .BI \-flag " id" Set the exit status to zero if the flag .I id is set. All other options except .B \-echo set the exit status to .I id being available or not. The last option sets the final exit code. .TP .BI \-num " id" Print the value of the numeric variable .IR id . .TP .BI \-str " id" Print the value of the string variable .IR id . .TP .BI \-goto " col line" Generates instructions to go to the given column and line if the .B cm capability exists. .TP .BI \-echo " string" Prints .IR string . Any other argument that does not start with a dash is also printed. .SH EXAMPLE Try this: .B "tget -str so 'Reverse Video' -str se" .SH ENVIRONMENT .TP 15n .B TERM Terminal type. .TP .B TERMCAP Path to the termcap database, by default /etc/termcap:/usr/etc/termcap. .SH "SEE ALSO" .BR termcap (3). .SH DIAGNOSTICS .B Tget will fail immediately with a descriptive message if the termcap entry can't be found. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH TIME 1 .SH NAME time \- report how long a command takes .SH SYNOPSIS \fBtime \fIcommand\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "time a.out" "Report how long \fIa.out\fR takes" .EX "time ls \-l *.c" "Report how long \fIls\fR takes" .SH DESCRIPTION .PP The command is executed and the real time, user time, and system time (in hours, minutes, and seconds) are printed. Shell scripts cannot be timed. .SH "SEE ALSO" .BR times (2). .TH TOUCH 1 .SH NAME touch \- update a file's time of last modification .SH SYNOPSIS \fBtouch\fR [\fB\-c\fR] \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Do not create the file" .SH EXAMPLES .EX "touch *.h" "Make the \fI.h\fP files look recent" .SH DESCRIPTION ############ NEXT ENTRY HAS NOT BEEN CHECKED ############# .PP The time of last modification is set to the current time. This command is mostly used to trick .I make into thinking that a file is more recent than it really is. If the file being touched does not exist, it is created, unless the \fB\-c\fR flag is present. .SH "SEE ALSO" .BR utime (2). .TH TR 1 .SH NAME tr \- translate character codes .SH SYNOPSIS \fBtr\fR [\fB\-cds\fR]\fR [\fIstring1\fR] [\fIstring2\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Complement the set of characters in \fIstring1\fR" .FL "\-d" "Delete all characters specified in \fIstring1\fR" .FL "\-s" "Squeeze all runs of characters in \fIstring1\fR to one character" .SH EXAMPLES .EX "tr \(fm[A\-Z]\(fm \(fm[a\-z]\(fm y " "Convert upper case to lower case" .EX "tr \-d \(fm0123456789\(fm f2 " "Delete all digits from \fIf1\fR" .SH DESCRIPTION .PP .I Tr performs simple character translation. When no flag is specified, each character in .I string1 is mapped onto the corresponding character in .I string2 . .TH TRUE 1 .SH NAME true, false \- exit with the value true or false .SH SYNOPSIS \fBtrue\fR .br \fBfalse\fR .SH EXAMPLES .ta +20n .ft B .nf while true \fR# List the directory until DEL is hit\fP do ls \-l done .fi .ft P .SH DESCRIPTION These commands return the value .I true or .I false . They are used for shell programming. .SH "SEE ALSO" .BR sh (1). .TH TSORT 1 .SH NAME tsort \- topological sort [IBM] .SH SYNOPSIS \fBtsort \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "lorder *.s | tsort" "Give library ordering" .EX "ar cr libc.a \`lorder *.s | tsort\`" "Build library" .SH DESCRIPTION .PP \fITsort\fR accepts a file of lines containing ordered pairs and builds a total ordering from the partial orderings. .TH TTY 1 .SH NAME tty \- print the device name of this tty .SH SYNOPSIS \fBtty \fR[\fB\-s\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-s" "Silent mode, only the exit status is affected." .SH EXAMPLES .EX "tty " "Print the tty name" .SH DESCRIPTION .PP Print the name of the controlling tty. If the flag \fB\-s\fR is given, \fItty\fR is equivalent to the call \fBtest \-t 0\fR. .SH "SEE ALSO" .BR ttyname (3). .TH UMOUNT 1 .SH NAME umount \- unmount a mounted file system .SH SYNOPSIS \fBumount \fR[\fB\-s\fR] \fIspecial\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-s" "Unmount swapspace instead of a file system" .SH EXAMPLES .EX "umount /dev/fd1" "Unmount diskette 1" .SH DESCRIPTION .PP A mounted file system is unmounted after the cache has been flushed to disk. A diskette should never be removed while it is mounted. If this happens, and is discovered before another diskette is inserted, the original one can be replaced without harm. Attempts to unmount a file system holding working directories or open files will be rejected with a \&'device busy\&' message. .PP With the .B \-s flag one can unmount swap space. .SH "SEE ALSO" .BR mount (1), .BR umount (2). .TH UNAME 1 .SH NAME uname, arch \- system info .SH SYNOPSIS \fBuname\fR [\fB\-snrvmpa\fR]\fR .br \fBarch\fR [\fB\-snrvmpa\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-s" "System name" .FL "\-n" "Node/network name" .FL "\-r" "Operating system release" .FL "\-v" "Operating system version" .FL "\-m" "Machine type" .FL "\-p" "Processor family" .FL "\-a" "Short for \fB\-snrvm\fR" .SH EXAMPLES .EX "uname -n" "Print the name of the system" .EX "arch" "Print the name of the system architecture" .SH DESCRIPTION .PP \fIUname\fP and \fIarch\fP give information about the system. The options indicate which information strings must be printed. These strings are always in the same order. \fIUname\fP and \fIarch\fP only differ w.r.t. the default string to print, \fB\-s\fP and \fB\-p\fP respectively. .PP The strings are compiled into the commands except for the node name, it is obtained from the file \fI/etc/hostname.file\fP. \fBUname \-m\fP should return the actual machine type, not the same string as with \fB\-p\fP. .SH "SEE ALSO" .BR uname (3). .TH UNEXPAND 1 .SH NAME unexpand \- convert spaces to tabs .SH SYNOPSIS \fBunexpand\fR [\fB\-a\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-a" "All spaces are unexpanded" .SH EXAMPLES .EX "unexpand oldfile >newfile" "Convert leading spaces to tabs" .SH DESCRIPTION .PP \fIUnexpand\fR replaces spaces in the named files with tabs. If no files are listed, \fIstdin\fR is given. The \fB\-a\fR flag is used to force all sequences of spaces to be expanded, instead of just leading spaces (the default). .SH "SEE ALSO" .BR expand (1). .TH UNIQ 1 .SH NAME uniq \- delete consecutive identical lines in a file .SH SYNOPSIS \fBuniq\fR [\fB\-cdu\fR]\fR [\fB\-\fIn\fR] [\fB+\fIn\fR] [\fIinput [\fIoutput\fR]\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Give count of identical lines in the input" .FL "\-d" "Only duplicate lines are written to output" .FL "\-u" "Only unique lines are written to output" .FL "\-\fIn\fR" "Skip the first \fIn\fR columns when matching" .FL "+\fIn\fR" "Skip the first \fIn\fR fields when matching" .SH EXAMPLES .EX "uniq +2 file" "Ignore first 2 fields when comparing" .EX "uniq \-d inf outf" "Write duplicate lines to \fIoutf\fP" .SH DESCRIPTION .PP .I Uniq examines a file for consecutive lines that are identical. All but duplicate entries are deleted, and the file is written to output. The +\fIn\fR option skips the first \fIn\fR fields, where a field is defined as a run of characters separated by white space. The \-\fIn\fP option skips the first \fIn\fR spaces. Fields are skipped first. .SH "SEE ALSO" .BR sort (1). .TH UUD 1 .SH NAME uud, uudecode \- decode a binary file encoded with uue .SH SYNOPSIS \fBuud\fR [\fB\-n\fR]\fR [\fB\-s \fIsrcdir\fR] [\fB\-t \fIdstdir/\fR] \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-n" "Do not verify checksums" .FL "\-s" "Name of directory where \fI.uue\fR file is" .FL "\-t" "Name of directory where output goes" .SH EXAMPLES .EX "uud file.uue " "Re-create the original file" .EX "uud \- x" "Encode \fIfile\fR and write on \fIstdout\fR" .EX "uue \-800 file" "Output on \fIfile.uaa\fR, \fIfile.uab\fR etc." .SH DESCRIPTION .PP \fIUuencode\fR is a famous program that converts an arbitrary (usually binary) file to an encoding using only 64 ASCII characters. \fIUudecode\fR converts it back to the original file. The \fIuue\fR and \fIuud\fR programs are the \s-2MINIX\s+2 versions of these programs, and are compatible with the \s-2UNIX\s0 ones. The files produced can even be sent successfully over BITNET, which is notorious for mangling files. It is possible to have \fIuue\fR automatically split the encoded file up into small chunks. The output files then get the suffixes \fI.uaa\fR, \fI.uab\fR, etc., instead of \fI.uue\fR. When \fIuud\fR is given \fIfile.uaa\fR to decode, it automatically includes the subsequent pieces. The encoding takes 3 bytes (24 bits) from the input file and renders it as 4 bytes in the output file. .SH "SEE ALSO" .BR btoa (1), .BR uud (1). .TH VOL 1 .SH NAME vol \- split input on or combine output from several volumes .SH SYNOPSIS .B vol .RB [ \-rw1 ] .RB [ \-b .IR blocksize ] .RB [ \-m .IR multiple ] .RI [ size ] .I device .SH DESCRIPTION .B Vol either reads a large input stream from standard input and distributes it over several volumes or combines volumes and sends them to standard output. The size of the volumes is determined automatically if the device supports this, but may be specified before the argument naming the device if automated detection is not possible or if only part of the physical volume is used. The direction of the data is automatically determined by checking whether the input or output of .B vol is a file or pipe. Use the .B \-r or .B \-w flag if you want to specify the direction explicitly, in shell scripts for instance. .PP .B Vol waits for each new volume to be inserted, typing return makes it continue. If no size is explicitely given then the size of the device is determined each time before it is read or written, so it is possible to mix floppies of different sizes. If the size cannot be determined (probably a tape) then the device is assumed to be infinitely big. .B Vol can be used both for block or character devices. It will buffer the data and use a block size appropriate for fixed or variable block sized tapes. .PP .B Vol reads or writes 8192 bytes to block devices, usually floppies. Character devices are read or written using a multiple of 512 bytes. This multiple has an upper limit of 32767 bytes (16-bit machine), 64 kb (32-bit), or even 1 Mb (32-bit VM). The last partial write to a character device is padded with zeros to the block size. If a character device is a tape device that responds to the .BR mtio (4) status call then the reported tape block size will be used as the smallest unit. If the tape is a variable block length device then it is read or written like a block device, 8192 bytes at the time, with a minimum unit of one byte. .PP All sizes may be suffixed by the letters .BR M , .BR k , .BR b or .BR w to multiply the number by mega, kilo, block (512), or word (2). The volume size by default in kilobytes if there is no suffix. .SH OPTIONS .TP .B \-rw Explicitly specify reading or writing. Almost mandatory in scripts. .TP .B \-1 Just one volume, start immediately. .TP .BI \-b " blocksize" Specify the device block size. .TP .BI \-m " multiple" Specify the maximum read or write size of multiple blocks. The .B \-b and .B \-m options allow one to modify the block size assumptions that are made above. These assumptions are .B "\-b 1 \-m 8192" for block devices or variable length tapes, and .B "\-b 512 \-m 65536" for character devices (32 bit machine.) These options will not override the tape block size found out with an .BR mtio (4) call. The multiple may be larger then the default if .B vol can allocate the memory required. .SH EXAMPLES To back up a tree to floppies as a compressed tarfile: .PP .RS tar cf \- . | compress | vol /dev/fd0 .RE .PP To restore a tree from 720 kb images from possibly bigger floppies: .PP .RS vol 720 /dev/fd0 | uncompress | tar xfp \- .RE .PP Read or write a device with 1024 byte blocks: .PP .RS vol \-b 1k /dev/rsd15 .RE .PP Read or write a variable block length tape using blocking factor 20 as used by default by many .BR tar (1) commands: .PP .RS vol \-m 20b /dev/rst5 .RE .PP Note that .B \-m was used in the last example. It sets the size to use to read or write, .B \-b sets the basic block size that may be written in multiples. .SH "SEE ALSO" .BR dd (1), .BR tar (1), .BR mt (1), .BR mtio (4). .TH WC 1 .SH NAME wc \- count characters, words, and lines in a file .SH SYNOPSIS \fBwc\fR [\fB\-clw\fR] \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Print character count" .FL "\-l" "Print line count" .FL "\-w" "Print word count" .SH EXAMPLES .EX "wc file1 file2" "Print all three counts for both files" .EX "wc \-l file" "Print line count only" .SH DESCRIPTION .PP .I Wc reads each argument and computes the number of characters, words and lines it contains. A word is delimited by white space (space, tab, or line feed). If no flags are present, all three counts are printed. .TH WHATIS 1 .SH NAME whatis, apropos \- give single line descriptions for manual pages .SH SYNOPSIS .B whatis .RB [ \-a ] .I title .br .B apropos .I keyword .SH DESCRIPTION .B Whatis lists the one line description from the .BR whatis (5) database describing the title given. It displays all the lines with the title from the first whatis file that has those titles. It uses the same search path as .BR man (1). .PP .B Apropos searches through all whatis files for the given keywords. It lists any line that has the keyword anywhere on the line. .SH OPTIONS .TP .B \-a Search all whatis files. .SH "SEE ALSO" .BR man (1), .BR grep (1), .BR whatis (5). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH WHEREIS 1 .SH NAME whereis \- examine system directories for a given file .SH SYNOPSIS \fBwhereis \fIfile\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "whereis stat.h" "Prints: \fI/usr/include/sys/stat.h\fR" .SH DESCRIPTION .PP \fIWhereis\fR searches a fixed set of system directories, \fI/bin\fR, \fI/lib\fR, \fI/usr/bin\fR, and others, and prints all occurrences of the argument name in any of them. .SH "SEE ALSO" .BR man (1), .BR which (1). .TH WHICH 1 .SH NAME which \- examine $PATH to see which file will be executed .SH SYNOPSIS \fBwhich \fIname\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "which a.out" "Tells which \fIa.out\fR will be executed" .SH DESCRIPTION .PP The $PATH shell variable controls the \s-2MINIX\s+2 search rules. If a command \fIa.out\fR is given, the shell first tries to find an executable file in the working directory. If that fails, it looks in various system directories, such as \fI/bin\fR and \fI/usr/bin\fR. The\fR which\fR command makes the same search and gives the absolute path of the program that will be chosen, followed by other occurrences of the file name along the path. .SH "SEE ALSO" .BR man (1). .TH WHO 1 .SH NAME who \- print list of currently logged in users .SH SYNOPSIS \fBwho\fR [\fIfile\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "who " "Print user names, terminals and times" .SH DESCRIPTION .PP \fIWho\fR prints a list of currently logged in users. For each one, the user name, terminal, and login time is printed. This program gets its information from the file \fI/etc/utmp\fR, which is updated by init and login. If the file does not exist, neither of these will create it, and \fIwho\fR will not work. Note that if you decide to create an empty \fI/usr/adm/wtmp\fR to enable the login accounting, it will grow forever and eventually fill up your disk unless you manually truncate it from time to time. If an optional file name is provided, the logins in that file will be printed. .SH "SEE ALSO" .BR utmp (5). .TH WHOAMI 1 .SH NAME whoami \- print current user name .SH SYNOPSIS \fBwhoami\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "whoami" "Print user name" .SH DESCRIPTION .PP In case you forget who you are logged in as, \fIwhoami\fR will tell you. If you use \fIsu\fR to become somebody else, \fIwhoami\fR will give the current effective user. .SH "SEE ALSO" .BR id (1), .BR who (1). .TH WRITE 1 .SH NAME write \- send a message to a logged-in user .SH SYNOPSIS \fBwrite\fR [\fB\-cv\fR] \fIuser\fR [\fItty\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-c" "Use cbreak mode" .FL "\-v" "Verbose mode" .SH EXAMPLES .EX "write ast" "Send a message to ast" .EX "write ast tty00" "Send a message to ast on tty00" .SH DESCRIPTION .PP \fIWrite\fR lets a user send messages to another logged-in user. Lines typed by the user appear on the other user's screen a line at a time (a character at a time in the case of cbreak mode). The file \fI/usr/adm/wtmp\fR is searched to determine which tty to send to. If the user is logged onto more than one terminal, the \fItty\fR argument selects the terminal. Type CTRL- D to terminate the command. Use ! as a shell escape. .SH "SEE ALSO" .BR mail (1). .\" %W% %R% (Berkeley) %E% .\" .TH YACC 1 "July 15, 1990" .UC 6 .SH NAME yacc \- an LALR(1) parser generator .SH SYNOPSIS .B yacc [ -dlrtv ] [ -b .I file_prefix .B ] [ -p .I symbol_prefix .B ] .I filename .SH DESCRIPTION .I Yacc reads the grammar specification in the file .I filename and generates an LR(1) parser for it. The parsers consist of a set of LALR(1) parsing tables and a driver routine written in the C programming language. .I Yacc normally writes the parse tables and the driver routine to the file .IR y.tab.c. .PP The following options are available: .RS .TP \fB-b \fIfile_prefix\fR The .B -b option changes the prefix prepended to the output file names to the string denoted by .IR file_prefix. The default prefix is the character .IR y. .TP .B -d The \fB-d\fR option causes the header file .IR y.tab.h to be written. .TP .B -l If the .B -l option is not specified, .I yacc will insert #line directives in the generated code. The #line directives let the C compiler relate errors in the generated code to the user's original code. If the \fB-l\fR option is specified, .I yacc will not insert the #line directives. \&#line directives specified by the user will be retained. .TP \fB-p \fIsymbol_prefix\fR The .B -p option changes the prefix prepended to yacc-generated symbols to the string denoted by .IR symbol_prefix. The default prefix is the string .IR yy. .TP .B -r The .B -r option causes .I yacc to produce separate files for code and tables. The code file is named .IR y.code.c, and the tables file is named .IR y.tab.c. .TP .B -t The .B -t option changes the preprocessor directives generated by .I yacc so that debugging statements will be incorporated in the compiled code. .TP .B -v The .B -v option causes a human-readable description of the generated parser to be written to the file .IR y.output. .RE .PP If the environment variable TMPDIR is set, the string denoted by TMPDIR will be used as the name of the directory where the temporary files are created. .SH FILES .IR y.code.c .br .IR y.tab.c .br .IR y.tab.h .br .IR y.output .br .IR /tmp/yacc.aXXXXXX .br .IR /tmp/yacc.tXXXXXX .br .IR /tmp/yacc.uXXXXXX .SH DIAGNOSTICS If there are rules that are never reduced, the number of such rules is reported on standard error. If there are any LALR(1) conflicts, the number of conflicts is reported on standard error. .\" $Header: yap.1,v 6.2 88/04/29 11:47:43 ceriel Exp $ .\" nroff -man yap.1 .tr ~ .TH YAP 1 local .SH NAME yap, more \- yet another pager .SH SYNOPSIS .B yap .RB [ \-cnuq ] .RB [ \-\fIn\fP ] .RB [ +\fIcommand\fP ] .RI [ file " ...]" .SH DESCRIPTION .B Yap is a program allowing the user to examine a continuous text one screenful at a time on a video display terminal. It does so by pausing after each screenful, waiting for the user to type a command. The commands are enumerated later. .BR Yap 's main feature is, that it can page both forwards and backwards, even when reading from standard input. .PP The command line options are: .TP .I \-n An integer which is the size (in lines) of a page (the initial .IR page-size . .TP .B \-c Normally, .B yap will display each page by beginning at the top of the screen and erasing each line just before it displays on it. If your terminal cannot erase a line, .B yap will clear the screen before it displays a page. .br This avoids scrolling the screen, making it easier to read while .B yap is writing. The .B -c option causes .B yap to scroll the screen instead of beginning at the top of the screen. This is also done if your terminal cannot either erase a line or clear the screen. .TP .B \-u Normally, .B yap handles underlining such as produced by nroff in a manner appropriate to the particular terminal: if the terminal can perform underlining well (t.i., the escape sequences for underlining do not occupy space on the screen), .B yap will underline underlined information in the input. The .B -u option supresses this underlining. .TP .B \-n Normally, .B yap also recognises escape sequences for stand-out mode or underlining mode in the input, and knows how much space these escape sequences will occupy on the screen, so that .B yap will not fold lines erroneously. The .B -n option supresses this pattern matching. .TP .B \-q This option will cause .B yap to exit only on the "quit" command. .TP .BI + command \fIcommand\fP is taken to be an initial command to .BR yap . .PP .B Yap looks in the .B YAP environment variable to pre-set flags. For instance, if you prefer the .B -c mode of operation, just set the .B YAP environment variable to .BR -c . .PP The commands of .B yap can be bound to sequences of keystrokes. The environment variable .B YAPKEYS may contain the bindings in the form of a list of colon-separated `name=sequence' pairs. The .I name is a short mnemonic for the command, the .I sequence is the sequence of keystrokes to be typed to invoke the command. This sequence may contain a ^X escape, which means control-X, and a \\X escape, which means X. The latter can be used to get the characters `^', `\\' and `:' in the sequence. There are two keymaps available, the default one and a user-defined one. You can switch between one and the other with the .I change keymap command. .PP The .B yap commands are described below. The mnemonics for the commands are given in parentheses. The default key sequences (if any) are given after the mnemonic. Every command takes an optional integer argument, which may be typed before the command. Some commands just ignore it. The integer argument is referred to as .IR i . Usually, if .I i is not given, it defaults to 1. .de Nc .PP \&\\$1 .RI ( \\$2 ) .BR \\$3 .br .RS .. .de Ec .RE .. .Nc "visit previous file" bf P Visit the .IR i -th previous file given in the command line. .Ec .Nc "scroll one line up or go to line" bl "^K ~or~ k" If .I i is not given, scroll one line up. Otherwise, .I i will be interpreted as a line number. A page starting with the line indicated will then be displayed. .Ec .Nc "bottom" bot "l ~or~ $" Go to the last line of the input. .Ec .Nc "display previous page" bp - Display the previous page, consisting of .I i lines, (or .I page-size lines if no argument is given). .Ec .Nc "display previous page and set pagesize" bps Z Display the previous page, consisting of .I i lines, (or .I page-size lines if no argument is given). If .I i is given, the .I page-size is set to .IR i . .Ec .Nc "scroll up" bs ^B Scroll up .I i lines (or .I scroll-size lines if .I i is not given. Initially, the .I scroll-size is 11). .Ec .Nc "search backwards for pattern" bse ? Search backwards for the .IR i -th occurrence of a regular expression which will be prompted for. If there are less than .I i occurrences of the expression, the position in the file remains unchanged. Otherwise, a page is displayed, starting two lines before the place where the expression was found. The user's erase and kill characters may be used to edit the expression. Erasing back past the first character cancels the search command. .br Note: Some systems do not have .BR regex (3). On those systems, searches are still supported, but regular expressions are not. .Ec .Nc "skip lines backwards" bsl S Skip .I i lines backwards and display a page. .Ec .Nc "skip pages backwards" bsp F Skip .I i pages backwards and display a page. .Ec .Nc "scroll up and set scrollsize" bss b Scroll up .I i lines (or .I scroll-size lines if .I i is not given. If .I i is given, the .I scroll-size is set to .IR i . .Ec .Nc "change key map" chm X Change from the current key map to the other (if there is one). .Ec .Nc "exchange current page and mark" exg x Set the mark to the current page, and display the previously marked page. .Ec .Nc "visit next file" ff N Visit the .IR i -th next file given in the command line. .Ec .Nc "scroll one line down or go to line" fl "^J ~or~ ^M ~or~ j" If .I i is not given, scroll one line down. Otherwise, .I i will be interpreted as a line number. A page starting with the line indicated will then be displayed. .Ec .Nc "display next page" fp Display the next page, consisting of .I i lines, (or .I page-size lines if no argument is given). .Ec .Nc "display next page and set pagesize" fps z Display the next page, consisting of .I i lines, (or .I page-size lines if no argument is given). If .I i is given, the .I page-size is set to .IR i . .Ec .Nc "scroll down" fs ^D Scroll down .I i lines (or .I scroll-size lines if no argument is given). .Ec .Nc "search forwards for pattern" fse / Search forwards for the .IR i -th occurrence of a regular expression which will be prompted for. If there are less than .I i occurrences of the expression, the position in the file remains unchanged. Otherwise, a page is displayed, starting two lines before the place where the expression was found. The user's erase and kill characters may be used to edit the expression. Erasing back past the first character cancels the search command. .br Note: Some systems do not have .BR regex (3). On those systems, searches are still supported, but regular expressions are not. .Ec .Nc "skip lines forwards" fsl s Skip .I i lines and display a page. .Ec .Nc "skip pages forwards" fsp f Skip .I i pages and display a page. .Ec .Nc "scroll down and set scrollsize" fss d Scroll down .I i lines (or .I scroll-size lines if .I i is not given. If .I i is given, the .I scroll-size is set to .IR i . .Ec .Nc "help" hlp h Give a short description of all commands that are bound to a key sequence. .Ec .Nc "set a mark" mar m Set a mark on the current page. .Ec .Nc "repeat last search" nse n Search for the .IR i -th occurrence of the last regular expression entered, in the direction of the last search. .Ec .Nc "repeat last search in other direction" nsr r Search for the .IR i -th occurrence of the last regular expression entered, but in the other direction. .Ec .Nc "quit" qui "Q ~or~ q" Exit from .BR yap . .Ec .Nc "redraw" red ^L Redraw the current page. .Ec .Nc "repeat" rep . Repeat the last command. This does not always make sense, so not all commands can be repeated. .Ec .Nc "shell escape" shl ! Invoke the shell with a command that will be prompted for. In the command, the characters `%' and `!' are replaced with the current file name and the previous shell command respectively. The sequences `\\%' and `\\!' are replaced by `%' and `!' respectively. The user's erase and kill characters can be used to edit the command. Erasing back past the first character cancels the command. .Ec .Nc "pipe to shell command" pip | Pipe the current input file into a shen"p"q"ll command that will be prompted for. The comments given in the description of the shell escape command apply here too. .Ec .Nc "go to mark" tom ' Display the marked page. .Ec .Nc "top" top ^^ Display a page starting with the first line of the input. .Ec .Nc "visit file" vis e Visit a new file. The filename will be prompted for. If you just type a return, the current file is revisited. .Ec .Nc "write input to a file" wrf w Write the input to a file, whose name will be prompted for. .Ec .PP The commands take effect immediately, i.e., it is not necessary to type a carriage return. Up to the time when the command sequence itself is given, the user may give an interrupt to cancel the command being formed. .SH AUTHOR Ceriel J.H. Jacobs .SH SEE ALSO .BR regex (3). .SH BUGS .B Yap will find your terminal very stupid and act like it, if it has no way of placing the cursor on the home position, or cannot either erase a line or insert one. .PP In lines longer than about 2000 characters, a linefeed is silently inserted. .PP The percentage, given in the prompt when .B yap reads from a file (and knows it), is not always very accurate. .TH YES 1 .SH NAME yes \- an endless stream of the same word .SH SYNOPSIS \fByes\fR [\fIanswer\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "yes | script" "Answer yes to all questions from the script" .SH DESCRIPTION .PP \fIYes\fP sends out an endless stream of y's, each on one line. One uses it to automatically say "yes" to all questions a command may ask. This is useful for commands that ask too many "Are you sure?" questions. The optional argument makes \fIyes\fP use \fIanswer\fP as the word to print instead of a single y character. ...access.2alarm.2brk.2chdir.2chmod.2chown.2chroot.2close.2creat.2dup.2execve.2exit.2fcntl.2fork.2getgid.2getpid.2getuid.2intro.2ioctl.2kill.2link.2lseek.2mkdir.2mknod.2mount.2open.2pause.2pipe.2ptrace.2read.2reboot.2rename.2rmdir.2setsid.2setuid.2sigaction.2sigpending.2sigprocmask.2sigsuspend.2stat.2sync.2time.2times.2umask.2uname.2unlink.2utime.2wait.2write.2svrctl.2.\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)access.2 6.5 (Berkeley) 5/22/86 .\" .TH ACCESS 2 "May 22, 1986" .UC 4 .SH NAME access \- determine accessibility of file .SH SYNOPSIS .ft B .nf #include #include .PP .ft B .ta 1.25i 1.6i .nf #define R_OK 4 /* test for read permission */ #define W_OK 2 /* test for write permission */ #define X_OK 1 /* test for execute (search) permission */ #define F_OK 0 /* test for presence of file */ .PP .ft B .nf int access(const char *\fIpath\fP, mode_t \fImode\fP) .ft R .fi .SH DESCRIPTION .B Access checks the given file .I path for accessibility according to .IR mode , which is an inclusive or of the bits .BR R_OK , .BR W_OK and .BR X_OK . Specifying .I mode as .B F_OK (i.e., 0) tests whether the directories leading to the file can be searched and the file exists. .PP The real user ID and the group access list (including the real group ID) are used in verifying permission, so this call is useful to set-UID programs. .PP Notice that only access bits are checked. A directory may be indicated as writable by .BR access , but an attempt to open it for writing will fail (although files may be created there); a file may look executable, but .B execve will fail unless it is in proper format. .SH "RETURN VALUE If .I path cannot be found or if any of the desired access modes would not be granted, then a \-1 value is returned; otherwise a 0 value is returned. .SH "ERRORS Access to the file is denied if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EROFS] Write access is requested for a file on a read-only file system. .TP 15 [EACCES] Permission bits of the file mode do not permit the requested access, or search permission is denied on a component of the path prefix. The owner of a file has permission checked with respect to the ``owner'' read, write, and execute mode bits, members of the file's group other than the owner have permission checked with respect to the ``group'' mode bits, and all others have permissions checked with respect to the ``other'' mode bits. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .SH "SEE ALSO .BR chmod (2), .BR stat (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)alarm.3c 6.3 (Berkeley) 5/27/86 .\" .TH ALARM 2 "May 27, 1986" .UC 4 .SH NAME alarm \- schedule signal after specified time .SH SYNOPSIS .nf .ft B #include unsigned int alarm(unsigned int \fIseconds\fP) .ft R .fi .SH DESCRIPTION .B Alarm causes signal SIGALRM, see .BR sigaction (2), to be sent to the invoking process in a number of seconds given by the argument. Unless caught or ignored, the signal terminates the process. .PP Alarm requests are not stacked; successive calls reset the alarm clock. If the argument is 0, any alarm request is canceled. Because of scheduling delays, resumption of execution of when the signal is caught may be delayed an arbitrary amount. .PP The return value is the amount of time previously remaining in the alarm clock. .SH "SEE ALSO" .BR pause (2), .BR sigsuspend (2), .BR sigaction (2), .BR sleep (3). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)brk.2 6.3 (Berkeley) 5/22/86 .\" .TH BRK 2 "May 22, 1986" .UC 4 .SH NAME brk, sbrk \- change data segment size .SH SYNOPSIS .nf #include .PP .ft B char *brk(char *\fIaddr\fP) .PP .ft B char *sbrk(int \fIincr\fP) .fi .SH DESCRIPTION .B Brk sets the system's idea of the lowest data segment location not used by the program (called the break) to .IR addr . Locations greater than .I addr and below the stack pointer are not in the address space and will thus cause a memory violation if accessed. .PP In the alternate function .BR sbrk , .I incr more bytes are added to the program's data space and a pointer to the start of the new area is returned. .PP When a program begins execution via .B execve the break is set at the highest location defined by the program and data storage areas. Ordinarily, therefore, only programs with growing data areas need to use .BR sbrk . .SH "RETURN VALUE The address of the new break is returned if .B brk succeeds; .B \-1 if the program requests more memory than the system limit. .B Sbrk returns .B \-1 if the break could not be set. .SH ERRORS .B Sbrk will fail and no additional memory will be allocated if one of the following are true: .TP 15 [ENOMEM] The maximum possible size of a data segment (as set by .BR chmem (1)) was exceeded. .TP 15 [ENOMEM] Insufficient virtual memory space existed to support the expansion. (Minix-vmd) .SH "SEE ALSO" .BR chmem (1), .BR execve (2), .BR malloc (3), .BR end (3). .SH NOTES Minix-vmd rounds a small data segment limit up to 3 megabytes. .SH BUGS Setting the break may fail due to a temporary lack of virtual memory under Minix-vmd. It is not possible to distinguish this from a failure caused by exceeding the maximum size of the data segment. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)chdir.2 6.3 (Berkeley) 8/26/85 .\" .TH CHDIR 2 "August 26, 1985" .UC 4 .SH NAME chdir \- change current working directory .SH SYNOPSIS .nf .ft B #include int chdir(const char *\fIpath\fP) .ft R .fi .SH DESCRIPTION .I Path is the pathname of a directory. .B Chdir causes this directory to become the current working directory, the starting point for path names not beginning with ``/''. .PP In order for a directory to become the current directory, a process must have execute (search) access to the directory. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate the error. .SH ERRORS .B Chdir will fail and the current working directory will be unchanged if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named directory does not exist. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EACCES] Search permission is denied for any component of the path name. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .SH "SEE ALSO" .BR chroot (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)chmod.2 6.5 (Berkeley) 5/13/86 .\" .TH CHMOD 2 "May 13, 1986" .UC 4 .SH NAME chmod \- change mode of file .SH SYNOPSIS .nf .ft B #include #include int chmod(const char *\fIpath\fP, mode_t \fImode\fP) .ig \" You never know .PP .ft B int fchmod(int \fIfd\fP, mode_t \fImode\fP) .. .fi .SH DESCRIPTION The file whose name is given by \fIpath\fP .ig or referenced by the descriptor .I fd .. has its mode changed to .IR mode . Modes are constructed by .IR or 'ing together some combination of the following, defined in .IR : .PP .RS .nf .ta \w'S_ISUID\ \ 'u +\w'04000\ \ \ 'u S_ISUID 04000 set user ID on execution S_ISGID 02000 set group ID on execution S_ISVTX 01000 `sticky bit' (see below) S_IRWXU 00700 read, write, execute by owner S_IRUSR 00400 read by owner S_IWUSR 00200 write by owner S_IXUSR 00100 execute (search on directory) by owner S_IRWXG 00070 read, write, execute by group S_IRGRP 00040 read by group S_IWGRP 00020 write by group S_IXGRP 00010 execute (search on directory) by group S_IRWXO 00007 read, write, execute by others S_IROTH 00004 read by others S_IWOTH 00002 write by others S_IXOTH 00001 execute (search on directory) by others .fi .RE .PP If mode ISVTX (the `sticky bit') is set on a directory, an unprivileged user may not delete or rename files of other users in that directory. (Minix-vmd) .PP Only the owner of a file (or the super-user) may change the mode. .PP Writing or changing the owner of a file turns off the set-user-id and set-group-id bits unless the user is the super-user. This makes the system somewhat more secure by protecting set-user-id (set-group-id) files from remaining set-user-id (set-group-id) if they are modified, at the expense of a degree of compatibility. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS .B Chmod will fail and the file mode will be unchanged if: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EPERM] The effective user ID does not match the owner of the file and the effective user ID is not the super-user. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .ig .PP .I Fchmod will fail if: .TP 15 [EBADF] The descriptor is not valid. .TP 15 [EROFS] The file resides on a read-only file system. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .. .SH "SEE ALSO" .BR chmod (1), .BR open (2), .BR chown (2), .BR stat (2). .SH NOTES The sticky bit was historically used to lock important executables into memory. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)chown.2 6.6 (Berkeley) 5/22/86 .\" .TH CHOWN 2 "May 22, 1986" .UC 4 .SH NAME chown \- change owner and group of a file .SH SYNOPSIS .nf .ft B int chown(const char *\fIpath\fP, int \fIowner\fP, int \fIgroup\fP) .ig \" You never know .PP .ft B int fchown(int \fIfd\fP, int \fIowner\fP, int \fIgroup\fP) .. .fi .SH DESCRIPTION The file that is named by \fIpath\fP .ig or referenced by \fIfd\fP .. has its .I owner and .I group changed as specified. Only the super-user may change the owner of the file, because if users were able to give files away, they could defeat file-space accounting procedures. The owner of the file may change the group to a group of which he is a member. .PP On some systems, .I chown clears the set-user-id and set-group-id bits on the file to prevent accidental creation of set-user-id and set-group-id programs. .SH "RETURN VALUE Zero is returned if the operation was successful; \-1 is returned if an error occurs, with a more specific error code being placed in the global variable \fBerrno\fP. .SH "ERRORS .B Chown will fail and the file will be unchanged if: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EPERM] The effective user ID is not the super-user. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .ig .PP .B Fchown will fail if: .TP 15 [EBADF] .I Fd does not refer to a valid descriptor. .TP 15 [EPERM] The effective user ID is not the super-user. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .. .SH "SEE ALSO" .BR chown (8), .BR chgrp (1), .BR chmod (2). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)chroot.2 6.3 (Berkeley) 8/26/85 .\" .TH CHROOT 2 "August 26, 1985" .UC 5 .SH NAME chroot \- change root directory .SH SYNOPSIS .nf .ft B #include int chroot(const char *\fIdirname\fP) .ft R .fi .SH DESCRIPTION .I Dirname is the address of the pathname of a directory, terminated by a null byte. .B Chroot causes this directory to become the root directory, the starting point for path names beginning with ``/''. .PP In order for a directory to become the root directory a process must have execute (search) access to the directory. .PP This call is restricted to the super-user. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate an error. .SH ERRORS .B Chroot will fail and the root directory will be unchanged if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path name is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named directory does not exist. .TP 15 [EACCES] Search permission is denied for any component of the path name. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .SH "SEE ALSO" .BR chdir (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)close.2 6.3 (Berkeley) 5/22/86 .\" .TH CLOSE 2 "May 22, 1986" .UC 4 .SH NAME close \- delete a descriptor .SH SYNOPSIS .nf .ft B #include int close(int \fId\fP) .ft R .fi .SH DESCRIPTION The .B close call deletes a descriptor from the per-process object reference table. If this is the last reference to the underlying object, then it will be deactivated. For example, on the last close of a file the current \fIseek\fP pointer associated with the file is lost; on the last close of a TCP/IP descriptor associated naming information and queued data are discarded; on the last close of a file holding an advisory lock the lock is released (see further .BR fcntl (2)). .PP A close of all of a process's descriptors is automatic on .IR exit , but since there is a limit on the number of active descriptors per process, .B close is necessary for programs that deal with many descriptors. .PP When a process forks (see .BR fork (2)), all descriptors for the new child process reference the same objects as they did in the parent before the fork. If a new process is then to be run using .BR execve (2), the process would normally inherit these descriptors. Most of the descriptors can be rearranged with .BR dup2 (2) or deleted with .B close before the .B execve is attempted, but if some of these descriptors will still be needed if the .B execve fails, it is necessary to arrange for them to be closed if the .B execve succeeds. For this reason, the call ``fcntl(d, F_SETFD, \fIflags\fR)'' is provided, that can be used to mark a descriptor "close on exec" by setting the .B FD_CLOEXEC flag: .PP .RS fcntl(d, F_SETFD, fcntl(d, F_GETFD) | FD_CLOEXEC); .RE .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and the global integer variable .B errno is set to indicate the error. .SH ERRORS .B Close will fail if: .TP 15 [EBADF] \fID\fP is not an active descriptor. .SH "SEE ALSO" .BR open (2), .BR pipe (2), .BR execve (2), .BR fcntl (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)creat.2 6.6 (Berkeley) 5/22/86 .\" .TH CREAT 2 "May 22, 1986" .UC 4 .SH NAME creat \- create a new file .SH SYNOPSIS .nf .ft B #include #include int creat(const char *\fIname\fP, mode_t \fImode\fP) .ft R .fi .SH DESCRIPTION .ft B This interface is made obsolete by open(2), it is equivalent to .ft R .PP .RS open(\fIname\fP, O_WRONLY | O_CREAT | O_TRUNC, \fImode\fP) .RE .PP .B Creat creates a new file or prepares to rewrite an existing file called .IR name , given as the address of a null-terminated string. If the file did not exist, it is given mode .IR mode , as modified by the process's mode mask (see .BR umask (2)). Also see .BR chmod (2) for the construction of the .I mode argument. .PP If the file did exist, its mode and owner remain unchanged but it is truncated to 0 length. .PP The file is also opened for writing, and its file descriptor is returned. .SH NOTES The .I mode given is arbitrary; it need not allow writing. This feature has been used in the past by programs to construct a simple, exclusive locking mechanism. It is replaced by the O_EXCL open mode, or the advisory locking of the .BR fcntl (2) facility. .SH "RETURN VALUE The value \-1 is returned if an error occurs. Otherwise, the call returns a non-negative descriptor that only permits writing. .SH ERRORS .I Creat will fail and the file will not be created or truncated if one of the following occur: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EACCES] The file does not exist and the directory in which it is to be created is not writable. .TP 15 [EACCES] The file exists, but it is unwritable. .TP 15 [EISDIR] The file is a directory. .TP 15 [EMFILE] There are already too many files open. .TP 15 [ENFILE] The system file table is full. .TP 15 [ENOSPC] The directory in which the entry for the new file is being placed cannot be extended because there is no space left on the file system containing the directory. .TP 15 [ENOSPC] There are no free inodes on the file system on which the file is being created. .ig .TP 15 [EDQUOT] The directory in which the entry for the new file is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .TP 15 [EDQUOT] The user's quota of inodes on the file system on which the file is being created has been exhausted. .. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [ENXIO] The file is a character special or block special file, and the associated device does not exist. .TP 15 [EIO] An I/O error occurred while making the directory entry or allocating the inode. .TP 15 [EFAULT] .I Name points outside the process's allocated address space. .SH "SEE ALSO" .BR open (2), .BR write (2), .BR close (2), .BR chmod (2), .BR umask (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)dup.2 6.3 (Berkeley) 5/13/86 .\" .TH DUP 2 "May 13, 1986" .UC 4 .SH NAME dup, dup2 \- duplicate a descriptor .SH SYNOPSIS .nf .ft B #include int dup(int \fIoldd\fP) int dup2(int \fIoldd\fP, int \fInewd\fP) .SH DESCRIPTION .B Dup duplicates an existing descriptor. The argument \fIoldd\fP is a small non-negative integer index in the per-process descriptor table. The value must be less than OPEN_MAX, the size of the table. The new descriptor returned by the call, let's name it .I newd, is the lowest numbered descriptor that is not currently in use by the process. .PP The object referenced by the descriptor does not distinguish between references using \fIoldd\fP and \fInewd\fP in any way. Thus if \fInewd\fP and \fIoldd\fP are duplicate references to an open file, .BR read (2), .BR write (2) and .BR lseek (2) calls all move a single pointer into the file, and append mode, non-blocking I/O and asynchronous I/O options are shared between the references. If a separate pointer into the file is desired, a different object reference to the file must be obtained by issuing an additional .BR open (2) call. The close-on-exec flag on the new file descriptor is unset. .PP In the second form of the call, the value of .IR newd desired is specified. If this descriptor is already in use, the descriptor is first deallocated as if a .BR close (2) call had been done first. .I Newd is not closed if it equals .IR oldd . .SH "RETURN VALUE The value \-1 is returned if an error occurs in either call. The external variable .B errno indicates the cause of the error. .SH "ERRORS .B Dup and .B dup2 fail if: .TP 15 [EBADF] \fIOldd\fP or \fInewd\fP is not a valid active descriptor .TP 15 [EMFILE] Too many descriptors are active. .SH NOTES .B Dup and .B dup2 are now implemented using the .B F_DUPFD function of .BR fcntl (2), although the old system call interfaces still exist to support old programs. .SH "SEE ALSO" .BR open (2), .BR close (2), .BR fcntl (2), .BR pipe (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)execve.2 6.7 (Berkeley) 5/22/86 .\" .TH EXECVE 2 "May 22, 1986" .UC 4 .SH NAME execve \- execute a file .SH SYNOPSIS .nf .ft B #include int execve(const char *\fIname\fP, char *const \fIargv\fP[], char *const \fIenvp\fP[]) .ft R .fi .SH DESCRIPTION .B Execve transforms the calling process into a new process. The new process is constructed from an ordinary file called the \fInew process file\fP. This file is either an executable object file, or a file of data for an interpreter. An executable object file consists of an identifying header, followed by pages of data representing the initial program (text) and initialized data pages. Additional pages may be specified by the header to be initialized with zero data. See .BR a.out (5). .PP An interpreter file begins with a line of the form ``#! \fIinterpreter\fP''. When an interpreter file is .BR execve\| 'd, the system \fBexecve\fP\|'s the specified \fIinterpreter\fP, giving it the name of the originally exec'd file as an argument and shifting over the rest of the original arguments. .PP There can be no return from a successful \fBexecve\fP because the calling core image is lost. This is the mechanism whereby different process images become active. .PP The argument \fIargv\fP is a null-terminated array of character pointers to null-terminated character strings. These strings constitute the argument list to be made available to the new process. By convention, at least one argument must be present in this array, and the first element of this array should be the name of the executed program (i.e., the last component of \fIname\fP). .PP The argument \fIenvp\fP is also a null-terminated array of character pointers to null-terminated strings. These strings pass information to the new process that is not directly an argument to the command (see .BR environ (7)). .PP Descriptors open in the calling process remain open in the new process, except for those for which the close-on-exec flag is set (see .BR close (2)). Descriptors that remain open are unaffected by .BR execve . .PP Ignored signals remain ignored across an .BR execve , but signals that are caught are reset to their default values. Blocked signals remain blocked regardless of changes to the signal action. The signal stack is reset to be undefined (see .BR sigaction (2) for more information). .PP Each process has .I real user and group IDs and an .I effective user and group IDs. The .I real ID identifies the person using the system; the .I effective ID determines his access privileges. .B Execve changes the effective user and group ID to the owner of the executed file if the file has the \*(lqset-user-ID\*(rq or \*(lqset-group-ID\*(rq modes. The .I real user ID is not affected. .PP The new process also inherits the following attributes from the calling process: .PP .in +5n .nf .ta +2i process ID see \fBgetpid\fP\|(2) parent process ID see \fBgetppid\fP\|(2) process group ID see \fBgetpgrp\fP\|(2) access groups see \fBgetgroups\fP\|(2) working directory see \fBchdir\fP\|(2) root directory see \fBchroot\fP\|(2) control terminal see \fBtty\fP\|(4) alarm timer see \fBalarm\fP\|(2) file mode mask see \fBumask\fP\|(2) signal mask see \fBsigaction\fP\|(2), \fBsigprocmask\fP\|(2) .in -5n .fi .PP When the executed program begins, it is called as follows: .PP .RS .ft B .nf int main(int \fIargc\fP, char *const \fIargv\fP[], char *const \fIenvp\fP[]); exit(main(\fIargc\fP, \fIargv\fP, \fIenvp\fP)); .fi .ft R .RE .PP where .I argc is the number of elements in \fIargv\fP (the ``arg count'') and .I argv is the array of character pointers to the arguments themselves. .PP .I Envp is a pointer to an array of strings that constitute the .I environment of the process. A pointer to this array is also stored in the global variable ``environ''. Each string consists of a name, an \*(lq=\*(rq, and a null-terminated value. The array of pointers is terminated by a null pointer. The shell .BR sh (1) passes an environment entry for each global shell variable defined when the program is called. See .BR environ (7) for some conventionally used names. .SH "RETURN VALUE If .B execve returns to the calling process an error has occurred; the return value will be \-1 and the global variable .B errno will contain an error code. .SH ERRORS .B Execve will fail and return to the calling process if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The new process file does not exist. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EACCES] The new process file is not an ordinary file. .TP 15 [EACCES] The new process file mode denies execute permission. .TP 15 [ENOEXEC] The new process file has the appropriate access permission, but has an invalid magic number in its header. .TP 15 [ENOMEM] The new process requires more (virtual) memory than is currently available. .TP 15 [E2BIG] The number of bytes in the new process's argument list is larger than the system-imposed limit ARG_MAX. The limit in the system as released is 4096 bytes for 16-bit Minix, 16384 bytes for 32-bit Minix, and unlimited for Minix-vmd. .TP 15 [EFAULT] \fIPath\fP\|, \fIargv\fP\|, or \fIenvp\fP point to an illegal address. .TP 15 [EIO] An I/O error occurred while reading from the file system. .SH CAVEATS If a program is .I setuid to a non-super-user, but is executed when the real \fBuid\fP is ``root'', then the program has some of the powers of a super-user as well. .SH "SEE ALSO" .BR exit (2), .BR fork (2), .BR execl (3), .BR environ (7). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)exit.2 6.4 (Berkeley) 5/22/86 .\" .TH EXIT 2 "May 22, 1986" .UC 4 .SH NAME exit, _exit \- terminate a process .SH SYNOPSIS .nf .ft B void _exit(int \fIstatus\fP) .fi .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B _exit terminates a process with the following consequences: .RS .SP All of the descriptors open in the calling process are closed. This may entail delays, for example, waiting for output to drain; a process in this state may not be killed, as it is already dying. .SP If the parent process of the calling process is executing a .B wait or is interested in the SIGCHLD signal (Minix-vmd), then it is notified of the calling process's termination and the low-order eight bits of \fIstatus\fP are made available to it; see .BR wait (2). .SP The parent process ID of all of the calling process's existing child processes are also set to 1. This means that the initialization process (see .BR intro (2)) inherits each of these processes as well. .ig Any stopped children are restarted with a hangup signal (SIGHUP). .. .RE .PP Most C programs call the library routine .BR exit (3), which performs cleanup actions in the standard I/O library before calling \fI_exit\fP\|. .SH "RETURN VALUE" This call never returns. .SH "SEE ALSO" .BR fork (2), .BR sigaction (2), .BR wait (2), .BR exit (3). .TH FCNTL 2 .SH NAME fcntl \- miscellaneous file descriptor control functions .SH SYNOPSIS .nf .ft B #include int fcntl(int \fIfd\fP, int *\fIcmd\fP, \fR[\fP\fIdata\fP\fR]\fP) .ft P .fi .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Fcntl() performs several file descriptor related functions, like duplicating a file descriptor, setting the "close on exec" attribute, etc. The .I fd argument is the file descriptor to operate on, .I cmd is the command code of the operation to perform, and .I data is an optional argument to give or receive parameters. The command codes and other symbols and types are declared in . The commands are: .SP .BI "fcntl(" fd ", F_DUPFD, int " fd2 ")" .RS Returns a new file descriptor that is a duplicate of file descriptor .IR fd . It shares the same file pointer and the same file status flags, but has separate file descriptor flags that are initially off. The value of the duplicate file descriptor is the first free file descriptor greater than or equal to .IR fd2 . .RE .SP .BI "fcntl(" fd ", F_GETFD)" .RS Returns the file descriptor flags associated with file descriptor .IR fd . The flags are the "close on exec" flag .B FD_CLOEXEC that, when set, causes the file descriptor to be closed when the process executes another program. The Minix-vmd specific .B FD_ASYNCHIO flag marks a file descriptor for asynchronous I/O operation. .RE .SP .BI "fcntl(" fd ", F_SETFD, int " flags ")" .RS Set the file descriptor flags of .I fd to .IR flags . .RE .SP .BI "fcntl(" fd ", F_GETFL)" .RS Return the file status flags and file access modes associated with the file associated with file descriptor .IR fd . The file status flags are .B O_NONBLOCK (non blocking I/O) and .B O_APPEND (append mode). The file access modes are .B O_RDONLY (read-only), .B O_WRONLY (write-only) and .B O_RDWR (read-write). These flags are also used in the second argument of .BR open (2). .RE .SP .BI "fcntl(" fd ", F_SETFL, int " flags ")" .RS Set the file status flags of the file referenced by .I fd to .IR flags . Only .B O_NONBLOCK and .B O_APPEND may be changed. Access mode flags are ignored. .RE .SP The next four commands use a parameter of type .B struct flock that is defined in as: .SP .RS .nf .ta +4n +8n +12n struct flock { short l_type; /* F_RDLCK, F_WRLCK, or F_UNLCK */ short l_whence; /* SEEK_SET, SEEK_CUR, or SEEK_END */ off_t l_start; /* byte offset to start of segment */ off_t l_len; /* length of segment */ pid_t l_pid; /* process id of the locks' owner */ }; .fi .RE .SP This structure describes a segment of a file. .B L_type is the lock operation performed on the file segment: .B F_RDLCK to set a read lock, .B F_WRLCK to set a write lock, and .B F_UNLCK to remove a lock. Several processes may have a read lock on a segment, but only one process can have a write lock. .B L_whence tells if the .B l_start offset must be interpreted from the start of the file .RB ( SEEK_SET ), the current file position .RB ( SEEK_CUR ), or the end of the file .RB ( SEEK_END ). This is analogous to the third parameter of .BR lseek (2). These .B SEEK_* symbols are declared in . .B L_start is the starting offset of the segment of the file. .B L_end is the length of the segment. If zero then the segment extends until end of file. .B L_pid is the process-id of the process currently holding a lock on the segment. It is returned by .BR F_GETLK . .SP .BI "fcntl(" fd ", F_GETLK, struct flock *" lkp ")" .RS Find out if some other process has a lock on a segment of the file associated by file descriptor .I fd that overlaps with the segment described by the .B flock structure pointed to by .IR lkp . If the segment is not locked then .B l_type is set to .BR F_UNLCK . Otherwise an .B flock structure is returned through .I lkp that describes the lock held by the other process. .B L_start is set relative to the start of the file. .RE .SP .BI "fcntl(" fd ", F_SETLK, struct flock *" lkp ")" .RS Register a lock on a segment of the file associated with file descriptor .IR fd . The file segment is described by the .B struct flock pointed to by .IR lkp . This call returns an error if any part of the segment is already locked. .RE .SP .BI "fcntl(" fd ", F_SETLKW, struct flock *" lkp ")" .RS Register a lock on a segment of the file associated with file descriptor .IR fd . The file segment is described by the .B struct flock pointed to by .IR lkp . This call blocks waiting for the lock to be released if any part of the segment is already locked. .RE .SP .BI "fcntl(" fd ", F_FREESP, struct flock *" lkp ")" .RS Free a segment of disk space occupied by the file associated with file descriptor .IR fd . The segment is described by the .B struct flock pointed to by .IR lkp . The file is truncated in length to the byte position indicated by .B l_start if .B l_len is zero. If .B l_len is nonzero then the file keeps its size, but the freed bytes now read as zeros. (Other than sharing the flock structure, this call has nothing to do with locking.) .RE .SP .BI "fcntl(" fd ", F_SEEK, u64_t " pos ")" .RS This Minix-vmd specific call sets the file position of the file associated with file descriptor .I fd to the byte offset indicated by the 64-bit number .IR pos . This is analogous to the call .SP .RS .BI "lseek(" fd ", " pos ", SEEK_SET)" .RE .SP except that .B F_SEEK can be used on devices larger than 4 gigabyte. .RE .SH "SEE ALSO" .BR open (2), .BR dup (2), .BR lseek (2), .BR ftruncate (3), .BR int64 (3). .SH DIAGNOSTICS .B Fcntl returns a file descriptor, flags, or .B 0 to indicate success. On error .B \-1 is returned, with .B errno set to the appropriate error code. The most notable errors are: .TP 5 .B EINTR If a blocked .B F_SETLKW operation is interrupted by a signal that is caught. .TP .B EAGAIN By .B F_SETLK if a segment cannot be locked. .TP .B EBADF A bad file descriptor in general, or an attempt to place a write lock on a file that is not open for writing, etc. .TP .B ENOLCK No locks available, the file system code has run out of internal table space. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)fork.2 6.4 (Berkeley) 5/22/86 .\" .TH FORK 2 "May 22, 1986" .UC .SH NAME fork \- create a new process .SH SYNOPSIS .nf .ft B #include #include pid_t fork(void) .ft R .fi .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Fork causes creation of a new process. The new process (child process) is an exact copy of the calling process except for the following: .RS .SP The child process has a unique process ID. .SP The child process has a different parent process ID (i.e., the process ID of the parent process). .SP The child process has its own copy of the parent's descriptors. These descriptors reference the same underlying objects, so that, for instance, file pointers in file objects are shared between the child and the parent, so that an .BR lseek (2) on a descriptor in the child process can affect a subsequent .B read or .B write by the parent. This descriptor copying is also used by the shell to establish standard input and output for newly created processes as well as to set up pipes. .SP The child starts with no pending signals and an inactive alarm timer. .RE .SH "RETURN VALUE Upon successful completion, \fBfork\fP returns a value of 0 to the child process and returns the process ID of the child process to the parent process. Otherwise, a value of \-1 is returned to the parent process, no child process is created, and the global variable \fBerrno\fP is set to indicate the error. .SH ERRORS .B Fork will fail and no child process will be created if one or more of the following are true: .TP 15 [EAGAIN] The system-imposed limit on the total number of processes under execution would be exceeded. This limit is configuration-dependent. (The kernel variable NR_PROCS in (Minix), or (Minix-vmd).) .TP 15 [ENOMEM] There is insufficient (virtual) memory for the new process. .SH "SEE ALSO" .BR execve (2), .BR wait (2). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getgid.2 6.2 (Berkeley) 1/7/86 .\" .TH GETGID 2 "January 7, 1986" .UC 5 .SH NAME getgid, getegid \- get group identity .SH SYNOPSIS .nf .ft B #include #include gid_t getgid(void) gid_t getegid(void) .fi .SH DESCRIPTION .B Getgid returns the real group ID of the current process, .B getegid the effective group ID. .PP The real group ID is specified at login time. .PP The effective group ID is more transient, and determines additional access permission during execution of a ``set-group-ID'' process, and it is for such processes that \fBgetgid\fP is most useful. .SH "SEE ALSO" .BR getuid (2), .BR setgid (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getpid.2 6.3 (Berkeley) 5/13/86 .\" .TH GETPID 2 "May 13, 1986" .UC 4 .SH NAME getpid, getppid \- get process identification .SH SYNOPSIS .ft B .nf #include #include pid_t getpid(void) pid_t getppid(void) .fi .ft R .SH DESCRIPTION .B Getpid returns the process ID of the current process. Most often it is used to generate uniquely-named temporary files. .PP .B Getppid returns the process ID of the parent of the current process. .SH "SEE ALSO .BR fork (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getuid.2 6.3 (Berkeley) 1/7/86 .\" .TH GETUID 2 "January 7, 1986" .UC 4 .SH NAME getuid, geteuid \- get user identity .SH SYNOPSIS .nf .ft B #include #include uid_t getuid(void) uid_t geteuid(void) .fi .SH DESCRIPTION .B Getuid returns the real user ID of the current process, .B geteuid the effective user ID. .PP The real user ID identifies the person who is logged in. The effective user ID gives the process additional permissions during execution of \*(lqset-user-ID\*(rq mode processes, which use \fBgetuid\fP to determine the real-user-id of the process that invoked them. .SH "SEE ALSO" .BR getgid (2), .BR setuid (2). .\" Copyright (c) 1980,1983,1986 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)intro.2 6.7 (Berkeley) 5/23/86 .\" .TH INTRO 2 "June 30, 1986" .UC 4 .de en .HP \\$1 \\$2 \\$3 .br .. .SH NAME intro, errno \- introduction to system calls and error numbers .SH SYNOPSIS .B "#include " .SH DESCRIPTION This section describes all of the system calls. Most of these calls have one or more error returns. An error condition is indicated by an otherwise impossible return value. This is almost always \-1; the individual descriptions specify the details. Note that a number of system calls overload the meanings of these error numbers, and that the meanings must be interpreted according to the type and circumstances of the call. .PP As with normal arguments, all return codes and values from functions are of type integer unless otherwise noted. An error number is also made available in the external variable \fBerrno\fP, which is not cleared on successful calls. Thus \fBerrno\fP should be tested only after an error has occurred. .PP The following is a complete list of the errors and their names as given in .RI < sys/errno.h >: .en 0 OK "Error 0 Unused. (The symbol "OK" is only used inside the kernel source.) .en 1 EPERM "Not owner Typically this error indicates an attempt to modify a file in some way forbidden except to its owner or super-user. It is also returned for attempts by ordinary users to do things allowed only to the super-user. .en 2 ENOENT "No such file or directory This error occurs when a file name is specified and the file should exist but doesn't, or when one of the directories in a path name does not exist. .en 3 ESRCH "No such process The process or process group whose number was given does not exist, or any such process is already dead. .en 4 EINTR "Interrupted system call An asynchronous signal (such as interrupt or quit) that the user has elected to catch occurred during a system call. If execution is resumed after processing the signal and the system call is not restarted, it will appear as if the interrupted system call returned this error condition. .en 5 EIO "I/O error Some physical I/O error occurred during an I/O operation, usually .B read or .BR write . Operations on file descriptors that refer to devices that are forcefully taken away or in a bad state will also provoke this error. .en 6 ENXIO "No such device or address I/O on a special file refers to a subdevice that does not exist, or beyond the limits of the device. It may also occur when, for example, an illegal tape drive unit number is selected or a disk pack is not loaded on a drive. .en 7 E2BIG "Arg list too long An argument list longer than ARG_MAX bytes is presented to .BR execve . ARG_MAX is set to 4096 bytes for 16-bit Minix, 16384 bytes for 32-bit Minix, and unlimited for Minix-vmd as these systems are released. .en 8 ENOEXEC "Exec format error A request is made to execute a file that, although it has the appropriate permissions, does not start with a valid magic number, (see .BR a.out (5)). .en 9 EBADF "Bad file number Either a file descriptor refers to no open file, or a read (resp. write) request is made to a file that is open only for writing (resp. reading). .en 10 ECHILD "No children .B Wait and the process has no living or unwaited-for children. .en 11 EAGAIN "Resource temporarily unavailable In a .B fork, the system's process table is full or the user is not allowed to create any more processes, otherwise an operation that would cause a process to block was attempted on an object in non-blocking mode (see \fBfcntl\fP(2)). .en 12 ENOMEM "Not enough core During an .B execve or .B brk, a program asks for more (virtual) memory than the system is able to supply, or a process size limit would be exceeded. The maximum size of the data+stack segment is set by the .BR chmem (1) program. For Minix-vmd a small data+stack size is increased to 3 megabytes when a program is executed. .en 13 EACCES "Permission denied An attempt was made to access a file in a way forbidden by the protection system. Also an attempt to open a device for writing that is physically write protected. .en 14 EFAULT "Bad address An argument of a system call is outside the address space allocated to a process. .en 15 ENOTBLK "Block device required A plain file was mentioned where a block device was required, e.g., in .BR mount . .en 16 EBUSY "Resource busy An attempt to mount a device that was already mounted or an attempt was made to dismount a device on which there is an active file (open file, current directory, mounted-on file, or active text segment). A request was made to an exclusive access device that was already in use. .en 17 EEXIST "File exists An existing file was mentioned in an inappropriate context, e.g., .BR link . .en 18 EXDEV "Cross-device link A hard link to a file on another device was attempted. .en 19 ENODEV "No such device An attempt was made to access a device that is not configured by the system, i.e., there is no driver for the device. .en 20 ENOTDIR "Not a directory A non-directory was specified where a directory is required, for example, in a path name or as an argument to .BR chdir . .en 21 EISDIR "Is a directory An attempt to write on a directory. .en 22 EINVAL "Invalid argument Some invalid argument: dismounting a non-mounted device, mentioning an unknown signal in .B signal, or some other argument inappropriate for the call. Also set by math functions, (see .BR math (3)). .en 23 ENFILE "File table overflow The system's table of open files is full, and temporarily no more .I opens can be accepted. .en 24 EMFILE "Too many open files The limit on the number of open files per process, OPEN_MAX, is reached. As released, this limit is 20 for Minix, and 30 for Minix-vmd. .en 25 ENOTTY "Not a typewriter The file mentioned in an .B ioctl is not a terminal or one of the devices to which this call applies. (Often seen error from programs with bugs in their error reporting code.) .en 26 ETXTBSY "Text file busy Attempt to execute a program that is open for writing. Obsolete under Minix. .en 27 EFBIG "File too large The size of a file exceeded the maximum (little over 64 megabytes for the V2 file system). .en 28 ENOSPC "No space left on device A .B write to an ordinary file, the creation of a directory or symbolic link, or the creation of a directory entry failed because no more disk blocks are available on the file system, or the allocation of an inode for a newly created file failed because no more inodes are available on the file system. .en 29 ESPIPE "Illegal seek An .B lseek was issued to a pipe or TCP/IP channel. This error may also be issued for other non-seekable devices. .en 30 EROFS "Read-only file system An attempt to modify a file or directory was made on a device mounted read-only. .en 31 EMLINK "Too many links An attempt to make more than a certain number of hard links to a file. The advertized maximum, LINK_MAX, is 127, but Minix-vmd uses a much larger maximum of 32767 for the V2 file system. .en 32 EPIPE "Broken pipe A write on a pipe or TCP/IP channel for which there is no process to read the data. This condition normally generates the signal SIGPIPE; the error is returned if the signal is caught or ignored. .en 33 EDOM "Math argument The argument of a function in the math package is out of the domain of the function. .en 34 ERANGE "Result too large The value of a function in the math package is unrepresentable within machine precision. .en 35 EDEADLK "Resource deadlock avoided A process attempts to place a blocking lock on a file that is already locked by another process and that process is waiting for the first process to unlock a file that first process already has a lock on. (The classic "lock A, lock B" by process 1, and "lock B, lock A" by process 2.) .en 36 ENAMETOOLONG "File name too long" The path name exceeds PATH_MAX characters. PATH_MAX equals 255 as distributed. .en 37 ENOLCK "No locks available The system's table of active locks is full. .en 38 ENOSYS "Function not implemented The system call is no""""""""""t supported. Either an old program uses an obsolete call, or a program for a more capable system is run on a less capable system. .en 39 ENOTEMPTY "Directory not empty" A directory with entries other than \*(lq.\*(rq and \*(lq..\*(rq was supplied to a remove directory or rename call. .en 40 ELOOP "Too many symbolic links" A path name lookup involved more than SYMLOOP symbolic links. SYMLOOP equals 8 as distributed. (Minix-vmd) .en 50 EPACKSIZE "Invalid packet size .en 51 EOUTOFBUFS "Not enough buffers left .en 52 EBADIOCTL "Illegal ioctl for device .en 53 EBADMODE "Bad mode in ioctl .en 54 EWOULDBLOCK "Would block .en 55 EBADDEST "Bad destination address .en 56 EDSTNOTRCH "Destination not reachable .en 57 EISCONN "Already connected .en 58 EADDRINUSE "Address in use .en 59 ECONNREFUSED "Connection refused .en 60 ECONNRESET "Connection reset .en 61 ETIMEDOUT "Connection timed out .en 62 EURG "Urgent data present .en 63 ENOURG "No urgent data present .en 64 ENOTCONN "No connection .en 65 ESHUTDOWN "Already shutdown .en 66 ENOCONN "No such connection .en 67 EINPROGRESS "Operation now in progress .en 68 EALREADY "Operation already in progress .ig .en XXX EDQUOT "Disc quota exceeded" A .B write to an ordinary file, the creation of a directory or symbolic link, or the creation of a directory entry failed because the user's quota of disk blocks was exhausted, or the allocation of an inode for a newly created file failed because the user's quota of inodes was exhausted. .en XXX ESTALE "Stale NFS file handle" A client referenced a an open file, when the file has been deleted. .en XXX EREMOTE "Too many levels of remote in path" An attempt was made to remotely mount a file system into a path which already has a remotely mounted component. .. .SH DEFINITIONS .TP 5 Process ID .br Each active process in the system is uniquely identified by a positive integer called a process ID. The range of this ID is from 1 to 29999. The special process with process ID 1 is .BR init , the ancestor of all processes. .TP 5 Parent process ID .br A new process is created by a currently active process; (see .BR fork (2)). The parent process ID of a process is the process ID of its creator, unless the creator dies, then .B init becomes the parent of the orphaned process. .TP 5 Process Group ID .br Each active process is a member of a process group that is identified by a positive integer called the process group ID. This is the process ID of the group leader. This grouping permits the signaling of related processes (see .BR kill (2)). .TP 5 Real User ID and Real Group ID .br Each user on the system is identified by a positive integer termed the real user ID. .IP Each user is also a member of one or more groups. One of these groups is distinguished from others and used in implementing accounting facilities. The positive integer corresponding to this distinguished group is termed the real group ID. (Under standard Minix this is the only group a process can be a member of.) .IP All processes have a real user ID and real group ID. These are initialized from the equivalent attributes of the process that created it. .TP 5 Effective User Id, Effective Group Id, and Access Groups .br Access to system resources is governed by three values: the effective user ID, the effective group ID, and the group access list. .IP The effective user ID and effective group ID are initially the process's real user ID and real group ID respectively. Either may be modified through execution of a set-user-ID or set-group-ID file (possibly by one its ancestors) (see .BR execve (2)). .IP The group access list is an additional set of group ID's used only in determining resource accessibility. Access checks are performed as described below in ``File Access Permissions''. The maximum number of additional group ID's is NGROUPS_MAX. For Minix this is 0, but Minix-vmd supports a list of up to 16 additional group ID's. (Also known as ``supplemental'' group ID's.) .TP 5 Super-user .br A process is recognized as a .I super-user process and is granted special privileges if its effective user ID is 0. .TP 5 Descriptor .br An integer assigned by the system when a file or device is referenced by .BR open (2), .BR dup (2) or .BR fcntl (2) which uniquely identifies an access path to that file or device from a given process or any of its children. .TP 5 File Descriptor Older, and often used name for a descriptor. .TP 5 File Name .br Names consisting of up to NAME_MAX characters may be used to name an ordinary file, special file, or directory. NAME_MAX is the maximum of the maximum file name lengths of the supported file systems. Excess characters are ignored when too long file names are used for files in a given file system. The maximum file name length of the V1 and V2 file systems is 14 characters. The Minix-vmd "flex" variants of V1 and V2 have a 60 character maximum. .IP The characters in a file name may assume any value representable in eight bits excluding 0 (null) and the ASCII code for / (slash). .IP Note that it is generally unwise to use one of \e'"<>();~$^&*|{}[]? as part of file names because of the special meaning attached to these characters by the shell. .TP 5 Path Name .br A path name is a null-terminated character string starting with an optional slash (/), followed by zero or more directory names separated by slashes, optionally followed by a file name. The total length of a path name must be less than PATH_MAX characters (255 as distributed.) .IP If a path name begins with a slash, the path search begins at the .I root directory. Otherwise, the search begins from the current working directory. A slash by itself names the root directory. A null pathname is illegal, use "." to refer to the current working directory. .TP 5 Directory .br A directory is a special type of file that contains entries that are references to other files. Directory entries are called links. By convention, a directory contains at least two links, . and .., referred to as .I dot and .I dot-dot respectively. Dot refers to the directory itself and dot-dot refers to its parent directory. .TP 5 Root Directory and Current Working Directory .br Each process has associated with it a concept of a root directory and a current working directory for the purpose of resolving path name searches. A process's root directory need not be the root directory of the root file system. .TP 5 File Access Permissions .br Every file in the file system has a set of access permissions. These permissions are used in determining whether a process may perform a requested operation on the file (such as opening a file for writing). Access permissions are established at the time a file is created. They may be changed at some later time through the .BR chmod (2) call. .IP File access is broken down according to whether a file may be: read, written, or executed. Directory files use the execute permission to control if the directory may be searched. .IP File access permissions are interpreted by the system as they apply to three different classes of users: the owner of the file, those users in the file's group, anyone else. Every file has an independent set of access permissions for each of these classes. When an access check is made, the system decides if permission should be granted by checking the access information applicable to the caller. .IP Read, write, and execute/search permissions on a file are granted to a process if: .IP The process's effective user ID is that of the super-user. .IP The process's effective user ID matches the user ID of the owner of the file and the owner permissions allow the access. .IP The process's effective user ID does not match the user ID of the owner of the file, and either the process's effective group ID matches the group ID of the file, or the group ID of the file is in the process's group access list, and the group permissions allow the access. .IP Neither the effective user ID nor effective group ID and group access list of the process match the corresponding user ID and group ID of the file, but the permissions for ``other users'' allow access. .IP Otherwise, permission is denied. .SH SEE ALSO .BR intro (3), .BR strerror (3). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)ioctl.2 6.3 (Berkeley) 3/4/86 .\" .TH IOCTL 2 "March 4, 1986" .UC 4 .SH NAME ioctl \- control device .SH SYNOPSIS .nf .ft B #include #include .ta +54n int ioctl(int \fId\fP, int \fIrequest\fP, void *\fIargp\fP) (Minix) int ioctl(int \fId\fP, ioreq_t \fIrequest\fP, void *\fIargp\fP) (Minix-vmd) .DT .fi .ft R .SH DESCRIPTION .B Ioctl performs a variety of functions on open descriptors. In particular, many operating characteristics of character special files (e.g. terminals) may be controlled with .B ioctl requests. The writeups of various devices in section 4 discuss how .B ioctl applies to them. .PP An ioctl .I request has encoded in it whether the argument is an \*(lqin\*(rq parameter or \*(lqout\*(rq parameter, and the size of the argument \fIargp\fP in bytes. Macros and defines used in specifying an ioctl .I request are located in the file .IR . .SH "RETURN VALUE If an error has occurred, a value of \-1 is returned and .B errno is set to indicate the error. .SH ERRORS .B Ioctl will fail if one or more of the following are true: .TP 15 [EBADF] \fID\fP is not a valid descriptor. .TP 15 [ENOTTY] \fID\fP is not associated with a character special device. .TP 15 [ENOTTY] The specified request does not apply to the kind of object that the descriptor \fId\fP references. .TP 15 [EINVAL] \fIRequest\fP or \fIargp\fP is not valid. .SH "SEE ALSO" .BR execve (2), .BR fcntl (2), .BR mt (4), .BR tty (4), .BR intro (4). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)kill.2 6.5 (Berkeley) 5/14/86 .\" .TH KILL 2 "May 14, 1986" .UC 4 .SH NAME kill \- send signal to a process .SH SYNOPSIS .nf .ft B #include #include int kill(pid_t \fIpid\fP, int \fIsig\fP) .ft R .fi .SH DESCRIPTION .B Kill sends the signal \fIsig\fP to a process, specified by the process number .IR pid . .I Sig may be one of the signals specified in .BR sigaction (2), or it may be 0, in which case error checking is performed but no signal is actually sent. This can be used to check the validity of .IR pid . .PP The sending and receiving processes must have the same effective user ID, otherwise this call is restricted to the super-user. .ig A single exception is the signal SIGCONT, which may always be sent to any descendant of the current process. .. .PP If the process number is 0, the signal is sent to all processes in the sender's process group. .PP If the process number is \-1 and the user is the super-user, the signal is broadcast universally except to .B init and the process sending the signal. If the process number is \-1 and the user is not the super-user, the signal is broadcast universally to all processes with the same uid as the user except the process sending the signal. No error is returned if any process could be signaled. .PP If the process number is negative but not \-1, the signal is sent to all processes whose process group ID is equal to the absolute value of the process number. .PP Processes may send signals to themselves. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS .B Kill will fail and no signal will be sent if any of the following occur: .TP 15 [EINVAL] \fISig\fP is not a valid signal number. .TP 15 [ESRCH] No process can be found corresponding to that specified by \fIpid\fP. .TP 15 [ESRCH] The process id was given as 0 but the sending process does not have a process group. .TP 15 [EPERM] The sending process is not the super-user and its effective user id does not match the effective user-id of the receiving process. When signaling a process group, this error was returned if any members of the group could not be signaled. .SH "SEE ALSO" .BR getpid (2), .BR getpgrp (2), .BR sigaction (2), .BR raise (3). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)link.2 6.3 (Berkeley) 8/26/85 .\" .TH LINK 2 "August 26, 1985" .UC 4 .SH NAME link \- make a hard link to a file .SH SYNOPSIS .nf .ft B #include int link(const char *\fIname1\fP, const char *\fIname2\fP) .fi .ft R .SH DESCRIPTION A hard link to .I name1 is created; the link has the name .IR name2 . .I Name1 must exist. .PP With hard links, both .I name1 and .I name2 must be in the same file system. .I Name1 must not be a directory. Both the old and the new .I link share equal access and rights to the underlying object. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS .B Link will fail and no link will be created if one or more of the following are true: .TP 15 [ENOTDIR] A component of either path prefix is not a directory. .TP 15 [ENAMETOOLONG] A path name exceeds PATH_MAX characters. .TP 15 [ENOENT] A component of either path prefix does not exist. .TP 15 [EACCES] A component of either path prefix denies search permission. .TP 15 [EACCES] The requested link requires writing in a directory with a mode that denies write permission. .TP 15 [ELOOP] Too many symbolic links were encountered in translating one of the pathnames. (Minix-vmd) .TP 15 [ENOENT] The file named by \fIname1\fP does not exist. .TP 15 [EEXIST] The link named by \fIname2\fP does exist. .TP 15 [EPERM] The file named by \fIname1\fP is a directory and the effective user ID is not super-user. .TP 15 [EXDEV] The link named by \fIname2\fP and the file named by \fIname1\fP are on different file systems. .TP 15 [ENOSPC] The directory in which the entry for the new link is being placed cannot be extended because there is no space left on the file system containing the directory. .ig .TP 15 [EDQUOT] The directory in which the entry for the new link is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system to make the directory entry. .TP 15 [EROFS] The requested link requires writing in a directory on a read-only file system. .TP 15 [EFAULT] One of the pathnames specified is outside the process's allocated address space. .SH "SEE ALSO" .BR symlink (2), .BR unlink (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)lseek.2 6.3 (Berkeley) 2/24/86 .\" .TH LSEEK 2 "February 24, 1986" .UC 4 .SH NAME lseek \- move read/write pointer .SH SYNOPSIS .nf .ft B #include #include .ta +1.8i +0.6i #define SEEK_SET 0 /* offset is absolute */ #define SEEK_CUR 1 /* relative to current position */ #define SEEK_END 2 /* relative to end of file */ off_t lseek(int d, off_t offset, int whence) .fi .ft R .SH DESCRIPTION The descriptor .I d refers to a file or device open for reading and/or writing. .B Lseek sets the file pointer of .I d as follows: .IP If .I whence is SEEK_SET, the pointer is set to .I offset bytes. .IP If .I whence is SEEK_CUR, the pointer is set to its current location plus .IR offset . .IP If .I whence is SEEK_END, the pointer is set to the size of the file plus .IR offset . .PP Upon successful completion, the resulting pointer location as measured in bytes from beginning of the file is returned. Some devices are incapable of seeking. The value of the pointer associated with such a device is undefined. .SH NOTES Seeking far beyond the end of a file, then writing, creates a gap or \*(lqhole\*(rq, which occupies no physical space and reads as zeros. .SH "RETURN VALUE Upon successful completion, the current file pointer value is returned. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate the error. .SH "ERRORS .B Lseek will fail and the file pointer will remain unchanged if: .TP 15 [EBADF] .I Fildes is not an open file descriptor. .TP 15 [ESPIPE] .I Fildes is associated with a pipe or a socket. .TP 15 [EINVAL] .I Whence is not a proper value. .SH "SEE ALSO" .BR fcntl (2), .BR open (2). .SH BUGS This document's use of .I whence is incorrect English, but maintained for historical reasons. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)mkdir.2 6.4 (Berkeley) 8/26/85 .\" .TH MKDIR 2 "August 26, 1985" .UC 5 .SH NAME mkdir \- make a directory file .SH SYNOPSIS .nf .ft B #include #include int mkdir(const char *\fIpath\fP, mode_t \fImode\fP) .fi .ft R .SH DESCRIPTION .B Mkdir creates a new directory file with name .IR path . The mode of the new file is initialized from .IR mode . (The protection part of the mode is modified by the process's mode mask; see .BR umask (2)). .PP The directory's owner ID is set to the process's effective user ID. The directory's group ID is set to that of the parent directory in which it is created. .PP The low-order 9 bits of mode are modified by the process's file mode creation mask: all bits set in the process's file mode creation mask are cleared. See .BR umask (2). .SH "RETURN VALUE A 0 return value indicates success. A \-1 return value indicates an error, and an error code is stored in .B errno. .SH "ERRORS .B Mkdir will fail and no directory will be created if: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] A component of the path prefix does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EEXIST] The named file exists. .TP 15 [ENOSPC] The directory in which the entry for the new directory is being placed cannot be extended because there is no space left on the file system containing the directory. .TP 15 [ENOSPC] The new directory cannot be created because there there is no space left on the file system that will contain the directory. .TP 15 [ENOSPC] There are no free inodes on the file system on which the directory is being created. .ig .TP 15 [EDQUOT] The directory in which the entry for the new directory is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .TP 15 [EDQUOT] The new directory cannot be created because the user's quota of disk blocks on the file system that will contain the directory has been exhausted. .TP 15 [EDQUOT] The user's quota of inodes on the file system on which the directory is being created has been exhausted. .. .TP 15 [EIO] An I/O error occurred while making the directory entry or allocating the inode. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .SH "SEE ALSO" .BR chmod (2), .BR stat (2), .BR umask (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)mknod.2 6.4 (Berkeley) 5/23/86 .\" .TH MKNOD 2 "May 23, 1986" .UC 4 .SH NAME mknod, mkfifo \- make a special file .SH SYNOPSIS .nf .ft B #include #include #include int mknod(const char *\fIpath\fP, mode_t \fImode\fP, dev_t \fIdev\fP) int mkfifo(const char *\fIpath\fP, mode_t \fImode\fP) .fi .ft R .SH DESCRIPTION .B Mknod creates a new file whose name is .I path. The mode of the new file (including special file bits) is initialized from .IR mode , as defined in .IR . (The protection part of the mode is modified by the process's mode mask (see .BR umask (2))). The first block pointer of the i-node is initialized from .I dev and is used to specify which device the special file refers to. .PP If mode indicates a block or character special file, .I dev is the device number of a character or block I/O device. The low eight bits of the device number hold the minor device number that selects a device among the devices governed by the same driver. The driver is selected by the major device number, the next eight bits of the device number. .PP If .I mode does not indicate a block special or character special device, .I dev is ignored. (For example, when creating a ``fifo'' special file.) .PP .B Mknod may be invoked only by the super-user, unless it is being used to create a fifo. .PP The call .BI "mkfifo(" path ", " mode ")" is equivalent to .PP .RS .BI "mknod(" path ", (" mode " & 0777) | S_IFIFO, 0)" .RE .SH "RETURN VALUE Upon successful completion a value of 0 is returned. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate the error. .SH ERRORS .B Mknod will fail and the file mode will be unchanged if: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] A component of the path prefix does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EPERM] The process's effective user ID is not super-user. .TP 15 [EIO] An I/O error occurred while making the directory entry or allocating the inode. .TP 15 [ENOSPC] The directory in which the entry for the new node is being placed cannot be extended because there is no space left on the file system containing the directory. .TP 15 [ENOSPC] There are no free inodes on the file system on which the node is being created. .ig .TP 15 [EDQUOT] The directory in which the entry for the new node is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .TP 15 [EDQUOT] The user's quota of inodes on the file system on which the node is being created has been exhausted. .. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EEXIST] The named file exists. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .SH "SEE ALSO" .BR chmod (2), .BR stat (2), .BR umask (2). .TH MOUNT 2 .SH NAME mount, umount \- mount or umount a file system .SH SYNOPSIS .ft B .nf #include #include int mount(char *\fIspecial\fP, char *\fIname\fP, int \fIflag\fP) int umount(char *\fIname\fP) .fi .ft P .SH DESCRIPTION .B Mount() tells the system that the file system .I special is to be mounted on the file .IR name , effectively overlaying .I name with the file tree on .IR special . .I Name may of any type, except that if the root of .I special is a directory, then .I name must also be a directory. .I Special must be a block special file, except for loopback mounts. For loopback mounts a normal file or directory is used for .IR special , which must be seen as the root of a virtual device. .I Flag is 0 for a read-write mount, 1 for read-only. .PP .B Umount() removes the connection between a device and a mount point, .I name may refer to either of them. If more than one device is mounted on the same mount point then unmounting at the mount point removes the last mounted device, unmounting a device removes precisely that device. The unmount will only succeed if none of the files on the device are in use. .PP Both calls may only be executed by the super-user. .SH "SEE ALSO" .BR mount (1), .BR umount (1). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)open.2 6.4 (Berkeley) 5/14/86 .\" .TH OPEN 2 "May 14, 1986" .UC 4 .SH NAME open \- open a file for reading or writing, or create a new file .SH SYNOPSIS .nf .ft B #include #include int open(const char *\fIpath\fP, int \fIflags\fP \fR[\fP, mode_t \fImode\fP\fR]\fP) .ft R .fi .SH DESCRIPTION .B Open opens the file .I path for reading and/or writing, as specified by the .I flags argument and returns a descriptor for that file. The .I flags argument may indicate the file is to be created if it does not already exist (by specifying the O_CREAT flag), in which case the file is created with mode .I mode as described in .BR chmod (2) and modified by the process' umask value (see .BR umask (2)). .PP .I Path is the address of a string of ASCII characters representing a path name, terminated by a null character. The flags specified are formed by .IR or 'ing the following values .PP .RS .ta +12n .nf O_RDONLY open for reading only O_WRONLY open for writing only O_RDWR open for reading and writing O_NONBLOCK do not block on open O_APPEND append on each write O_CREAT create file if it does not exist O_TRUNC truncate size to 0 O_EXCL error if create and file exists .fi .DT .RE .PP Opening a file with O_APPEND set causes each write on the file to be appended to the end. If O_TRUNC is specified and the file exists, the file is truncated to zero length. If O_EXCL is set with O_CREAT, then if the file already exists, the open returns an error. This can be used to implement a simple exclusive access locking mechanism. If O_EXCL is set and the last component of the pathname is a symbolic link, the open will fail even if the symbolic link points to a non-existent name. If the O_NONBLOCK flag is specified and the open call would result in the process being blocked for some reason, the open returns immediately. .PP Upon successful completion a non-negative integer termed a file descriptor is returned. The file pointer used to mark the current position within the file is set to the beginning of the file. .PP The new descriptor is set to remain open across .BR execve system calls; see .BR close (2). .PP The system imposes a limit on the number of descriptors open simultaneously by one process. .SH "ERRORS The named file is opened unless one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] O_CREAT is not set and the named file does not exist. .TP 15 [ENOENT] A component of the path name that must exist does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EACCES] The required permissions (for reading and/or writing) are denied for the named file. .TP 15 [EACCES] O_CREAT is specified, the file does not exist, and the directory in which it is to be created does not permit writing. .TP 15 [EACCES] A device to be opened for writing is physically write protected. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EISDIR] The named file is a directory, and the arguments specify it is to be opened for writing. .TP 15 [EROFS] The named file resides on a read-only file system, and the file is to be modified. .TP 15 [EMFILE] The system limit for open file descriptors per process has already been reached. .TP 15 [ENFILE] The system file table is full. .TP 15 [ENXIO] The named file is a character special or block special file, and the device associated with this special file does not exist. .TP 15 [ENOSPC] O_CREAT is specified, the file does not exist, and the directory in which the entry for the new file is being placed cannot be extended because there is no space left on the file system containing the directory. .TP 15 [ENOSPC] O_CREAT is specified, the file does not exist, and there are no free inodes on the file system on which the file is being created. .ig .TP 15 [EDQUOT] O_CREAT is specified, the file does not exist, and the directory in which the entry for the new fie is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .TP 15 [EDQUOT] O_CREAT is specified, the file does not exist, and the user's quota of inodes on the file system on which the file is being created has been exhausted. .. .TP 15 [EIO] An I/O error occurred while making the directory entry or allocating the inode for O_CREAT. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EEXIST] O_CREAT and O_EXCL were specified and the file exists. .SH "SEE ALSO" .BR chmod (2), .BR close (2), .BR dup (2), .BR fcntl (2), .BR lseek (2), .BR read (2), .BR write (2), .BR umask (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)pause.3c 6.1 (Berkeley) 5/9/85 .\" .TH PAUSE 2 "May 9, 1985" .UC 4 .SH NAME pause \- stop until signal .SH SYNOPSIS .nf .ft B #include int pause(void) .ft R .fi .SH DESCRIPTION .B Pause never returns normally. It is used to give up control while waiting for a signal from .BR kill (2) or the alarm timer, see .BR alarm (2). Upon termination of a signal handler started during a .B pause, the .B pause call will return. .SH "RETURN VALUE Always returns \-1. .SH ERRORS .B Pause always returns: .TP 15 [EINTR] The call was interrupted. .SH "SEE ALSO .BR alarm (2), .BR kill (2), .BR sigsuspend (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)pipe.2 6.2 (Berkeley) 8/26/85 .\" .TH PIPE 2 "August 26, 1985" .UC 4 .SH NAME pipe \- create an interprocess communication channel .SH SYNOPSIS .nf .ft B #include int pipe(int \fIfildes\fP[2]) .fi .ft R .SH DESCRIPTION The .B pipe system call creates an I/O mechanism called a pipe. The file descriptors returned can be used in read and write operations. When the pipe is written using the descriptor .IR fildes [1] up to PIPE_MAX bytes of data are buffered before the writing process is suspended. A read using the descriptor .IR fildes [0] will pick up the data. .PP PIPE_MAX equals 7168 under Minix, but note that most systems use 4096. .PP It is assumed that after the pipe has been set up, two (or more) cooperating processes (created by subsequent .B fork calls) will pass data through the pipe with .B read and .B write calls. .PP The shell has a syntax to set up a linear array of processes connected by pipes. .PP Read calls on an empty pipe (no buffered data) with only one end (all write file descriptors closed) returns an end-of-file. .PP The signal SIGPIPE is generated if a write on a pipe with only one end is attempted. .SH "RETURN VALUE The function value zero is returned if the pipe was created; \-1 if an error occurred. .SH ERRORS The \fBpipe\fP call will fail if: .TP 15 [EMFILE] Too many descriptors are active. .TP 15 [ENFILE] The system file table is full. .TP 15 [ENOSPC] The pipe file system (usually the root file system) has no free inodes. .TP 15 [EFAULT] The \fIfildes\fP buffer is in an invalid area of the process's address space. .SH "SEE ALSO" .BR sh (1), .BR read (2), .BR write (2), .BR fork (2). .SH NOTES Writes may return ENOSPC errors if no pipe data can be buffered, because the pipe file system is full. .SH BUGS Should more than PIPE_MAX bytes be necessary in any pipe among a loop of processes, deadlock will occur. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)ptrace.2 6.4 (Berkeley) 5/23/86 .\" .TH PTRACE 2 "May 23, 1986" .UC 4 .SH NAME ptrace \- process trace .SH SYNOPSIS .nf .ft B #include #include #include int ptrace(int \fIrequest\fP, pid_t \fIpid\fP, long \fIaddr\fP, long \fIdata\fP) .ft R .fi .SH DESCRIPTION .ft B Note: This manual page has no relation to Minix. Someone who knows ptrace() has to check, or rewrite, this page. (kjb) .ft R .PP .B Ptrace provides a means by which a parent process may control the execution of a child process, and examine and change its core image. Its primary use is for the implementation of breakpoint debugging. There are four arguments whose interpretation depends on a .I request argument. Generally, .I pid is the process ID of the traced process, which must be a child (no more distant descendant) of the tracing process. A process being traced behaves normally until it encounters some signal whether internally generated like \*(lqillegal instruction\*(rq or externally generated like \*(lqinterrupt\*(rq. See .BR sigaction (2) for the list. Then the traced process enters a stopped state and its parent is notified via .BR wait (2). When the child is in the stopped state, its core image can be examined and modified using .BR ptrace . If desired, another .B ptrace request can then cause the child either to terminate or to continue, possibly ignoring the signal. .PP The value of the .I request argument determines the precise action of the call: .TP 4 PT_TRACE_ME This request is the only one used by the child process; it declares that the process is to be traced by its parent. All the other arguments are ignored. Peculiar results will ensue if the parent does not expect to trace the child. .TP 4 PT_READ_I, PT_READ_D The word in the child process's address space at .I addr is returned. If I and D space are separated (e.g. historically on a pdp-11), request PT_READ_I indicates I space, PT_READ_D D space. .I Addr must be even on some machines. The child must be stopped. The input .I data is ignored. .TP 4 PT_READ_U The word of the system's per-process data area corresponding to .I addr is returned. .I Addr must be even on some machines and less than 512. This space contains the registers and other information about the process; its layout corresponds to the .I user structure in the system. .TP 4 PT_WRITE_I, PT_WRITE_D The given .I data is written at the word in the process's address space corresponding to .I addr, which must be even on some machines. No useful value is returned. If I and D space are separated, request PT_WRITE_I indicates I space, PT_WRITE_D D space. Attempts to write in pure procedure fail if another process is executing the same file. .TP 4 PT_WRITE_U The process's system data is written, as it is read with request PT_READ_U. Only a few locations can be written in this way: the general registers, the floating point status and registers, and certain bits of the processor status word. .TP 4 PT_CONTINUE The .I data argument is taken as a signal number and the child's execution continues at location .I addr as if it had incurred that signal. Normally the signal number will be either 0 to indicate that the signal that caused the stop should be ignored, or that value fetched out of the process's image indicating which signal caused the stop. If .I addr is (int *)1 then execution continues from where it stopped. .TP 4 PT_KILL The traced process terminates. .TP 4 PT_STEP Execution continues as in request PT_CONTINUE; however, as soon as possible after execution of at least one instruction, execution stops again. The signal number from the stop is SIGTRAP. (On the VAX-11 the T-bit is used and just one instruction is executed.) This is part of the mechanism for implementing breakpoints. .PP As indicated, these calls (except for request PT_TRACE_ME) can be used only when the subject process has stopped. The .B wait call is used to determine when a process stops; in such a case the \*(lqtermination\*(rq status returned by .B wait has the value 0177 to indicate stoppage rather than genuine termination. .PP To forestall possible fraud, .B ptrace inhibits the set-user-id and set-group-id facilities on subsequent .BR execve (2) calls. If a traced process calls .BR execve , it will stop before executing the first instruction of the new image showing signal SIGTRAP. .PP On a VAX-11, \*(lqword\*(rq also means a 32-bit integer, but the \*(lqeven\*(rq restriction does not apply. .SH "RETURN VALUE A 0 value is returned if the call succeeds. If the call fails then a \-1 is returned and the global variable \fIerrno\fP is set to indicate the error. .SH "ERRORS .TP 15 [EIO] The request code is invalid. .TP 15 [ESRCH] The specified process does not exist. .TP 15 [EIO] The given signal number is invalid. .TP 15 [EIO] The specified address is out of bounds. .TP 15 [EPERM] The specified process cannot be traced. .SH "SEE ALSO" .BR wait (2), .BR sigaction (2), .BR mdb (1). .SH BUGS .B Ptrace is unique and arcane; it should be replaced with a special file that can be opened and read and written. The control functions could then be implemented with .BR ioctl (2) calls on this file. This would be simpler to understand and have much higher performance. .PP The request PT_TRACE_ME call should be able to specify signals that are to be treated normally and not cause a stop. In this way, for example, programs with simulated floating point (which use \*(lqillegal instruction\*(rq signals at a very high rate) could be efficiently debugged. .PP The error indication, \-1, is a legitimate function value; .BR errno , (see .BR intro (2)), can be used to disambiguate. .PP It should be possible to stop a process on occurrence of a system call; in this way a completely controlled environment could be provided. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)read.2 6.6 (Berkeley) 5/23/86 .\" .TH READ 2 "May 23, 1986" .UC 4 .SH NAME read \- read input .SH SYNOPSIS .nf .ft B #include #include ssize_t read(int \fId\fP, void *\fIbuf\fP, size_t \fInbytes\fP) .fi .SH DESCRIPTION .B Read attempts to read .I nbytes of data from the object referenced by the descriptor .I d into the buffer pointed to by .IR buf . .PP On objects capable of seeking, the .B read starts at a position given by the pointer associated with .IR d (see .BR lseek (2)). Upon return from .BR read , the pointer is incremented by the number of bytes actually read. .PP Objects that are not capable of seeking always read from the current position. The value of the pointer associated with such an object is undefined. .PP Upon successful completion, .B read return the number of bytes actually read and placed in the buffer. The system guarantees to read the number of bytes requested if the descriptor references a normal file that has that many bytes left before the end-of-file, but in no other case. .PP If the returned value is 0, then end-of-file has been reached. .SH "RETURN VALUE If successful, the number of bytes actually read is returned. Otherwise, a \-1 is returned and the global variable .B errno is set to indicate the error. .SH "ERRORS .B Read will fail if one or more of the following are true: .TP 15 [EBADF] \fID\fP is not a valid descriptor open for reading. .TP 15 [EFAULT] \fIBuf\fP points outside the allocated address space. .TP 15 [EIO] An I/O error occurred while reading from the file system. .TP 15 [EINTR] A read from a slow device was interrupted before any data arrived by the delivery of a signal. .TP 15 [EAGAIN] The file was marked for non-blocking I/O, and no data were ready to be read. .SH "SEE ALSO" .BR dup (2), .BR fcntl (2), .BR open (2), .BR pipe (2), .BR write (2). .TH REBOOT 2 .SH NAME reboot \- close down the system or reboot .SH SYNTAX .ft B .nf #define _MINIX_SOURCE 1 #include int reboot(int \fIhow\fP, ...) .fi .ft P .SH DESCRIPTION .B Reboot() is used to close down the system. It allows several ways of shutting down depending on .IR how : .PP .TP 5 .BI "reboot(RBT_HALT)" Halt the system and return to the monitor prompt. .TP .BI "reboot(RBT_REBOOT)" Reboot the system by letting the monitor execute the "boot" command. .TP .BI "reboot(RBT_PANIC)" Cause a system panic. This is not normally done from user mode, but by servers using the .B sys_abort() kernel call. .TP .BI "reboot(RBT_MONITOR" ", code, length" ")" Halt the system and let the monitor execute the given code of the given length. .RI ( code is of type .B "char *" and .I length of type .BR size_t .) .TP .BI "reboot(RBT_RESET)" Reboot the system with a hardware reset. .PP .B Reboot() may only be executed by the super-user. .SH DIAGNOSTICS If the call succeeds, it never returns. If something went wrong, the return value is -1 and an error is indicated by .BR errno . .SH SEE ALSO .BR shutdown (8), .BR reboot (8), .BR halt (8), .BR sync (2). .SH NOTES Minix can not return to the monitor if running in real mode. This means that most of the reboot functions will change to a system reset. .SH AUTHOR Edvard Tuinder (v892231@si.hhs.NL) .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rename.2 6.4 (Berkeley) 5/22/86 .\" .TH RENAME 2 "May 22, 1986" .UC 5 .SH NAME rename \- change the name of a file .SH SYNOPSIS .ft B .nf #include int rename(const char *\fIfrom\fP, const char *\fIto\fP) .fi .ft R .SH DESCRIPTION .B Rename causes the link named .I from to be renamed as .IR to . If .I to exists, then it is first removed. Both .I from and .I to must be of the same type (that is, both directories or both non-directories), and must reside on the same file system. .PP .B Rename guarantees that an instance of .I to will always exist, even if the system should crash in the middle of the operation. .PP If the final component of .I from is a symbolic link, the symbolic link is renamed, not the file or directory to which it points. .SH "RETURN VALUE" A 0 value is returned if the operation succeeds, otherwise .B rename returns \-1 and the global variable .B errno indicates the reason for the failure. .SH "ERRORS .B Rename will fail and neither of the argument files will be affected if any of the following are true: .TP 15 [ENAMETOOLONG] A path name exceeds PATH_MAX characters. .TP 15 [ENOENT] A component of the \fIfrom\fP path does not exist, or a path prefix of \fIto\fP does not exist. .TP 15 [EACCES] A component of either path prefix denies search permission. .TP 15 [EACCES] The requested link requires writing in a directory with a mode that denies write permission. .TP 15 [EPERM] The directory containing \fIfrom\fP is marked sticky, and neither the containing directory nor \fIfrom\fP are owned by the effective user ID. .TP 15 [EPERM] The \fIto\fP file exists, the directory containing \fIto\fP is marked sticky, and neither the containing directory nor \fIto\fP are owned by the effective user ID. .TP 15 [ELOOP] Too many symbolic links were encountered in translating either pathname. (Minix-vmd) .TP 15 [ENOTDIR] A component of either path prefix is not a directory. .TP 15 [ENOTDIR] .I From is a directory, but \fIto\fP is not a directory. .TP 15 [EISDIR] .I To is a directory, but \fIfrom\fP is not a directory. .TP 15 [EXDEV] The link named by \fIto\fP and the file named by \fIfrom\fP are on different logical devices (file systems). .TP 15 [ENOSPC] The directory in which the entry for the new name is being placed cannot be extended because there is no space left on the file system containing the directory. .ig .TP 15 [EDQUOT] The directory in which the entry for the new name is being placed cannot be extended because the user's quota of disk blocks on the file system containing the directory has been exhausted. .. .TP 15 [EIO] An I/O error occurred while making or updating a directory entry. .TP 15 [EROFS] The requested link requires writing in a directory on a read-only file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .TP 15 [EINVAL] .I From is a parent directory of .IR to , or an attempt is made to rename ``.'' or ``..''. .TP 15 [ENOTEMPTY] .I To is a directory and is not empty. .SH "SEE ALSO" .BR open (2) .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rmdir.2 6.3 (Berkeley) 8/26/85 .\" .TH RMDIR 2 "August 26, 1985" .UC 5 .SH NAME rmdir \- remove a directory file .SH SYNOPSIS .nf .ft B #include int rmdir(const char *\fIpath\fP) .fi .ft R .SH DESCRIPTION .B Rmdir removes a directory file whose name is given by .I path. The directory must not have any entries other than \*(lq.\*(rq and \*(lq..\*(rq. .SH "RETURN VALUE A 0 is returned if the remove succeeds; otherwise a \-1 is returned and an error code is stored in the global location \fIerrno\fP\|. .SH ERRORS The named file is removed unless one or more of the following are true: .TP 15 [ENOTDIR] A component of the path is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named directory does not exist. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [ENOTEMPTY] The named directory contains files other than ``.'' and ``..'' in it. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EACCES] Write permission is denied on the directory containing the link to be removed. .TP 15 [EPERM] The directory containing the directory to be removed is marked sticky, and neither the containing directory nor the directory to be removed are owned by the effective user ID. .TP 15 [EBUSY] The directory to be removed is the mount point for a mounted file system. .TP 15 [EIO] An I/O error occurred while deleting the directory entry or deallocating the inode. .TP 15 [EROFS] The directory entry to be removed resides on a read-only file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .SH "SEE ALSO" .BR mkdir (2), .BR unlink (2). .TH SETSID 2 .SH NAME setsid, getpgrp \- create process group, get process group id .SH SYNOPSIS .ft B .nf #include #include pid_t setsid(void) pid_t getpgrp(void) .fi .ft P .SH DESCRIPTION .B Setsid() creates a new session if the calling process is not already a session leader. The calling process becomes the session leader of a new process group and the process group ID of this new process group will be equal to the process ID of the new session leader. The process group ID is inherited on a .BR fork (2). .PP .B Getpgrp() returns the process group ID of the calling process. .SH "SEE ALSO" .BR kill (2), .BR termios (3), .BR tty (4). .SH DIAGNOSTICS .B Setsid() returns the new process group ID on success, or \-1 with .B errno set to .B EPERM if the process is already a session leader. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: setsid.2,v 1.2 1996/04/11 06:06:36 philip Exp $ .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)setreuid.2 6.1 (Berkeley) 5/9/85 .\" .TH SETUID 2 "May 9, 1985" .UC 4 .SH NAME setuid, setgid \- set user or group ID's .SH SYNOPSIS .nf .ft B #include int setuid(uid_t \fIuid\fP) int setgid(gid_t \fIgid\fP) .ft R .fi .SH DESCRIPTION .B Setuid sets the real and effective user ID's of the current process to .IR uid . Unprivileged users may only change both user ID's to the real user ID; only the super-user may make other changes. .B Setgid does the same for the real and effective group ID's. .PP Minix-vmd allows an unprivileged user to change ID's to the original real or effective ID as they were at the time the process was executed. .B Setgid may also set the group ID's to any of the additional group ID's. If one of the remembered user ID's was 0 then any user or group ID may be chosen. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate the error. .SH "ERRORS .TP 15 [EPERM] The current process is not the super-user and a change other than one of the allowed changes was attempted. .SH "SEE ALSO" .BR getuid (2), .BR getgid (2). .TH SIGACTION 2 .SH NAME sigaction, signal \- manage signal state and handlers .SH SYNOPSIS .ft B #include .in +5 .ti -5 int sigaction(int \fIsig\fP, const struct sigaction *\fIact\fP, struct sigaction *\fIoact\fP) .in -5 .br void (*signal(int \fIsig\fP, void (*\fIhandler\fP)(int)))(int); .ft P .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Sigaction() is used to examine, set, or modify the attributes of a signal. The argument .I sig is the signal in question. The .I act argument points to a structure containing the new attributes of the signal, the structure pointed to by .I oact will receive the old attributes that were in effect before the call. .PP The .I act and .I oact arguments may be .B NULL to indicate that either no new attributes are to be set, or that the old attributes are not of interest. .PP The structure containing the signal attributes is defined in and looks like this: .PP .RS .nf .ft B .ta +4n +12n struct sigaction { void (*sa_handler)(int sig); sigset_t sa_mask; int sa_flags; }; .ft R .fi .RE .PP The .B sa_handler field contains the address of a signal handler, a function that is called when the process is signalled, or one of these special constants: .PP .TP 12 .B SIG_DFL Default signal handling is to be performed. This usually means that the process is killed, but some signals may be ignored by default. .TP .B SIG_IGN Ignore the signal. .PP The .B sa_mask field indicates a set of signals that must be blocked when the signal is being handled. Whether the signal .I sig itself is blocked when being handled is not controlled by this mask. The mask is of a "signal set" type that is to be manipulated by the .BR sigset (3) functions. .PP How the signal is handled precisely is specified by bits in .BR sa_flags . If none of the flags is set then the handler is called when the signal arrives. The signal is blocked during the call to the handler, and unblocked when the handler returns. A system call that is interrupted returns .B \-1 with .B errno set to .BR EINTR . The following bit flags can be set to modify this behaviour: .PP .TP 15 .B SA_RESETHAND Reset the signal handler to .B SIG_DFL when the signal is caught. .TP .B SA_NODEFER Do not block the signal on entry to the handler. .TP .B SA_COMPAT Handle the signal in a way that is compatible with the the old .B signal() call. .PP The old .B signal() signal system call sets a signal handler for a given signal and returns the old signal handler. No signals are blocked, the flags are .BR "SA_RESETHAND | SA_NODEFER | SA_COMPAT" . New code should not use .BR signal() . Note that .B signal() and all of the .B SA_* flags are Minix extensions. .PP Signal handlers are reset to .B SIG_DFL on an .BR execve (2). Signals that are ignored stay ignored. .SS Signals Minix knows about the following signals: .PP .nf .ta +11n +7n +8n signal num notes description .SP SIGHUP 1 k Hangup SIGINT 2 k Interrupt (usually DEL or CTRL\-C) SIGQUIT 3 kc Quit (usually CTRL\-\e) SIGILL 4 kc Illegal instruction SIGTRAP 5 xkc Trace trap SIGABRT 6 kc Abort program SIGFPE 8 k Floating point exception SIGKILL 9 k Kill SIGUSR1 10 k User defined signal #1 SIGSEGV 11 kc Segmentation fault SIGUSR2 12 k User defined signal #2 SIGPIPE 13 k Write to a pipe with no reader SIGALRM 14 k Alarm clock SIGTERM 15 k Terminate (default for kill(1)) SIGCHLD 17 pvi Child process terminated SIGCONT 18 p Continue if stopped SIGSTOP 19 ps Stop signal SIGTSTP 20 ps Interactive stop signal SIGTTIN 21 ps Background read SIGTTOU 22 ps Background write SIGWINCH 23 xvi Window size change .ft R .fi .PP The letters in the notes column indicate: .PP .TP 5 .B k The process is killed if the signal is not caught. .TP .B c The signal causes a core dump. .TP .B i The signal is ignored if not caught. .TP .B v Only Minix-vmd implements this signal. .TP .B x Minix extension, not defined by \s-2POSIX\s+2. .TP .B p These signals are not implemented, but \s-2POSIX\s+2 requires that they are defined. .TP .B s The process should be stopped, but is killed instead. .PP The .B SIGKILL signal cannot be caught or ignored. The .B SIGILL and .B SIGTRAP signals cannot be automatically reset. The system silently enforces these restrictions. This may or may not be reflected by the attributes of these signals and the signal masks. .SS Types \s-2POSIX\s+2 prescribes that has the following definition: .PP .RS .B "typedef int (*sighandler_t)(int)" .RE .PP With this type the following declarations can be made: .PP .RS .ft B .nf sighandler_t sa_handler; sighandler_t signal(int \fIsig\fP, sighandler_t \fIhandler\fP); .fi .ft R .RE .PP This may help you to understand the earlier declarations better. The .B sighandler_t type is also very useful in old style C code that is compiled by a compiler for standard C. .SH "SEE ALSO" .BR kill (1), .BR kill (2), .BR pause (2), .BR sigprocmask (2), .BR sigsuspend (2), .BR sigpending (2), .BR sigset (3). .SH DIAGNOSTICS .B Sigaction() returns .B 0 on success or .B \-1 on error. .B Signal() returns the old handler on success or .B SIG_ERR on error. The error code may be: .PP .TP 10 .B EINVAL Bad signal number. .TP .B EFAULT Bad .I act or .I oact addresses. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: sigaction.2,v 1.2 1996/04/11 06:00:28 philip Exp $ .TH SIGPENDING 2 .SH NAME sigpending \- report pending signals .SH SYNOPSIS .ft B #include int sigpending(sigset_t *\fIset\fP) .ft P .SH DESCRIPTION .B Sigpending() returns the set of signals that are waiting to be delivered. They are currently blocked by the signal mask. .SH "SEE ALSO" .BR sigaction (2), .BR sigprocmask (2), .BR sigsuspend (2), .BR sigset (3). .SH DIAGNOSTICS Returns .B 0 on success and .B \-1 on error. The only possible error code is .B EFAULT for a bad .I set address. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: sigpending.2,v 1.2 1996/04/11 06:01:22 philip Exp $ .TH SIGPROCMASK 2 .SH NAME sigprocmask \- manipulate the signal mask .SH SYNOPSIS .ft B #include int sigprocmask(int \fIhow\fP, const sigset_t *\fIset\fP, sigset_t *\fIoset\fP) .ft P .SH DESCRIPTION .B Sigprocmask() examines or manipulates the signal mask. This mask is the set of signals that are currently blocked. The .I how argument determines the action that must be performed. In all cases the signal set referenced by .IR oset , if not .BR NULL , will be used to receive the old signal mask. The .I set argument, if not .BR NULL , will be used to set or modify the current signal mask. .PP .I How can be one of: .PP .TP 15 .B SIG_BLOCK Add the signals referenced by .I set to the mask. .TP .B SIG_UNBLOCK Remove the signals referenced by .I set from the mask. .TP .B SIG_SETMASK Set the signal mask to the set referenced by .IR set . .PP The value of .I how is ignored if .I set is .BR NULL . .SH "SEE ALSO" .BR sigaction (2), .BR sigpending (2), .BR sigsuspend (2), .BR sigset (3). .SH DIAGNOSTICS Returns .B 0 on success and .B \-1 on error. The error code is .B EFAULT for a bad .I set or .I oset address, or .B EINVAL for a bad .I how argument. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: sigprocmask.2,v 1.2 1996/04/11 06:02:09 philip Exp $ .TH SIGSUSPEND 2 .SH NAME sigsuspend \- suspend until signalled .SH SYNOPSIS .ft B #include int sigsuspend(const sigset_t *\fIset\fP) .ft P .SH DESCRIPTION .B Sigsuspend() installs the signal mask referenced by .I set and suspends the process until signalled. The signal is handled, the signal mask is restored to the value it had before the .B sigsuspend() call and call returns. .SH "SEE ALSO" .BR pause (2), .BR sigaction (2), .BR sigpending (2), .BR sigprocmask (2), .BR sigset (3). .SH DIAGNOSTICS .B Sigsuspend() never returns normally, so it always returns .BR \-1 . The error code is either .B EINTR indicating that a signal has arrived, or .B EFAULT for a bad .I set address. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: sigsuspend.2,v 1.2 1996/04/11 06:02:41 philip Exp $ .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)stat.2 6.5 (Berkeley) 5/12/86 .\" .TH STAT 2 "May 12, 1986" .UC 4 .SH NAME stat, lstat, fstat \- get file status .SH SYNOPSIS .nf .ft B #include #include .ta +54n int stat(const char *\fIpath\fP, struct stat *\fIbuf\fP) int lstat(const char *\fIpath\fP, struct stat *\fIbuf\fP) (Minix-vmd) int fstat(int \fIfd\fP, struct stat *\fIbuf\fP) .fi .ft R .SH DESCRIPTION .B Stat obtains information about the file .IR path . Read, write or execute permission of the named file is not required, but all directories listed in the path name leading to the file must be reachable. .PP .B Lstat is like \fBstat\fP except in the case where the named file is a symbolic link, in which case .B lstat returns information about the link, while .B stat returns information about the file the link references. (Minix-vmd) .PP .B Fstat obtains the same information about an open file referenced by the argument descriptor, such as would be obtained by an \fBopen\fP call. Pipe descriptors look like named pipes with a link count of zero. The st_size field of pipes or named pipes shows the amount of bytes currently buffered in the pipe. .PP .I Buf is a pointer to a .B stat structure into which information is placed concerning the file. The contents of the structure pointed to by .I buf is as follows: .PP .if t .RS .nf .ta +0.4i +0.8i +1i struct stat { dev_t st_dev; /* device inode resides on */ ino_t st_ino; /* this inode's number */ mode_t st_mode; /* file mode, protection bits, etc. */ nlink_t st_nlink; /* number or hard links to the file */ uid_t st_uid; /* user-id of the file's owner */ gid_t st_gid; /* group-id of the file's owner */ dev_t st_rdev; /* the device type, for inode that is device */ off_t st_size; /* total size of file */ time_t st_atime; /* time of last access */ time_t st_mtime; /* time of last data modification */ time_t st_ctime; /* time of last file status change */ }; .fi .if t .RE .DT .PP .TP 12 st_atime Time when file data was last read or modified. Changed by the following system calls: .BR mknod (2), .BR utime (2), .BR read (2), and .BR write (2). For reasons of efficiency, st_atime is not set when a directory is searched, although this would be more logical. .TP 12 st_mtime Time when data was last modified. It is not set by changes of owner, group, link count, or mode. Changed by the following system calls: .BR mknod (2), .BR utime (2), .BR write (2). .TP 12 st_ctime Time when file status was last changed. It is set both both by writing and changing the i-node. Changed by the following system calls: .BR chmod (2) .BR chown (2), .BR link (2), .BR mknod (2), .BR rename (2), .BR unlink (2), .BR utime (2), .BR write (2). .PP The file type information in \fBst_mode\fP has bits: .PP .nf .in +5n .ta 1.6i 2.5i 3i #define S_IFMT 0170000 /* type of file */ #define\ \ \ \ S_IFIFO 0010000 /* named pipe */ #define\ \ \ \ S_IFCHR 0020000 /* character special */ #define\ \ \ \ S_IFDIR 0040000 /* directory */ #define\ \ \ \ S_IFBLK 0060000 /* block special */ #define\ \ \ \ S_IFREG 0100000 /* regular */ #define\ \ \ \ S_IFLNK 0120000 /* symbolic link (Minix-vmd) */ .fi .in -5n .PP The mode bits 0007777 encode set-uid/gid bits and permission bits (see .BR chmod (2)). .SH "RETURN VALUE Upon successful completion a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS .B Stat and .B lstat will fail if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EFAULT] .I Buf or .I name points to an invalid address. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .PP .B Fstat will fail if one or both of the following are true: .TP 15 [EBADF] .I Fildes is not a valid open file descriptor. .TP 15 [EFAULT] .I Buf points to an invalid address. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .SH "SEE ALSO" .BR chmod (2), .BR chown (2), .BR utime (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)sync.2 6.2 (Berkeley) 6/30/85 .\" .TH SYNC 2 "June 30, 1985" .UC 4 .SH NAME sync \- update super-block .SH SYNOPSIS .nf .ft B #include int sync(void) .ft R .fi .SH DESCRIPTION .B Sync causes all information in the file system buffers that should be on disk to be written out. This includes modified super blocks, modified i-nodes, and delayed block I/O. .SH "SEE ALSO" .BR reboot (2), .BR sync (8). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)gettimeofday.2 6.7 (Berkeley) 5/14/86 .\" .TH TIME 2 "May 14, 1986" .UC 4 .SH NAME time, stime \- get/set date and time .SH SYNOPSIS .nf .ft B #include #include time_t time(time_t *\fItp\fP) int stime(time_t *\fItp\fP) .fi .SH DESCRIPTION The system's notion of the current Greenwich time is obtained with the .B time call, and set with the .B stime call. The time is expressed in seconds since midnight (0 hour), January 1, 1970. The time is both returned by .B time and stored in the variable pointed to by .I tp unless .I tp is the null pointer. .PP .B Stime obtains the time to set from the variable pointed to by .IR tp . .PP Only the super-user may set the time of day. .SH RETURN A 0 return value from .B stime indicates that the call succeeded. .B Time returns the current time on success. A \-1 return value indicates an error occurred, and in this case an error code is stored into the global variable \fBerrno\fP. .SH "ERRORS The following error codes may be set in \fBerrno\fP: .TP 15 [EFAULT] The .I tp address referenced invalid memory. .TP 15 [EPERM] A user other than the super-user attempted to set the time. .SH "SEE ALSO" .BR date (1), .BR ctime (3). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)times.3c 6.1 (Berkeley) 5/9/85 .\" .TH TIMES 2 "May 9, 1985" .UC 4 .SH NAME times \- get process times .SH SYNOPSIS .nf .ft B #include #include #include int times(struct tms *\fIbuffer\fP) .fi .SH DESCRIPTION .B Times returns time-accounting information for the current process and for the terminated child processes of the current process. All times are in 1/CLOCKS_PER_SEC seconds. .PP This is the structure returned by .BR times : .PP .RS .nf .ta +0.4i +0.8i +1.2i struct tms { clock_t tms_utime; /* user time for this process */ clock_t tms_stime; /* system time for this process */ clock_t tms_cutime; /* children's user time */ clock_t tms_cstime; /* children's system time */ }; .fi .RE .PP The user time is the number of clock ticks used by a process on its own computations. The system time is the number of clock ticks spent inside the kernel on behalf of a process. This does not include time spent waiting for I/O to happen, only actual CPU instruction times. .PP The children times are the sum of the children's process times and their children's times. .SH RETURN .B Times returns 0 on success, otherwise \-1 with the error code stored into the global variable .BR errno . .SH ERRORS The following error code may be set in .BR errno : .TP 15 [EFAULT] The address specified by the .I buffer parameter is not in a valid part of the process address space. .SH "SEE ALSO" .BR time (1), .BR wait (2), .BR time (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)umask.2 6.1 (Berkeley) 5/9/85 .\" .TH UMASK 2 "May 9, 1985" .UC 4 .SH NAME umask \- set file creation mode mask .SH SYNOPSIS .nf .ft B #include #include mode_t umask(mode_t \fImask\fP) .ft R .fi .SH DESCRIPTION .B Umask sets the process's file mode creation mask to \fImask\fP and returns the previous value of the mask. The low-order 9 bits of \fImask\fP are used whenever a file is created, clearing corresponding bits in the file mode (see .BR chmod (2)). This clearing allows each user to restrict the default access to his files. .PP The value is initially 022 (write access for owner only). The mask is inherited by child processes. .SH "RETURN VALUE The previous value of the file mode mask is returned by the call. .SH SEE ALSO .BR chmod (2), .BR mknod (2), .BR open (2). .TH UNAME 2 .SH NAME uname \- get system info .SH SYNOPSIS .ft B .nf #include int uname(struct utsname *name) .fi .ft P .SH DESCRIPTION .B Uname() fills a struct utsname with system information. This structure is described in as follows: .PP .nf .ta +4n +6n +25n struct utsname { char sysname[15+1]; /* System name */ char nodename[255+1]; /* Node/Network name */ char release[11+1]; /* O.S. release */ char version[7+1]; /* O.S. version */ char machine[11+1]; /* Machine hardware */ char arch[11+1]; /* Architecture */ }; .fi .PP The strings are always null terminated, and may be of a different length then shown here. The first five are required by \s-2POSIX\s+2, the last is Minix specific. .SH "SEE ALSO" .BR uname (1). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)unlink.2 6.2 (Berkeley) 5/22/85 .\" .TH UNLINK 2 "May 22, 1985" .UC 4 .SH NAME unlink \- remove directory entry .SH SYNOPSIS .nf .ft B #include int unlink(const char *path) .fi .ft R .SH DESCRIPTION .B Unlink removes the entry for the file .I path from its directory. If this entry was the last link to the file, and no process has the file open, then all resources associated with the file are reclaimed. If, however, the file was open in any process, the actual resource reclamation is delayed until it is closed, even though the directory entry has disappeared. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS The \fIunlink\fP succeeds unless: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EACCES] Write permission is denied on the directory containing the link to be removed. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EPERM] The named file is a directory. .TP 15 [EPERM] The directory containing the file is marked sticky, and neither the containing directory nor the file to be removed are owned by the effective user ID. (Minix-vmd) .TP 15 [EBUSY] The entry to be unlinked is the mount point for a mounted file system. .TP 15 [EIO] An I/O error occurred while deleting the directory entry or deallocating the inode. .TP 15 [EROFS] The named file resides on a read-only file system. .TP 15 [EFAULT] .I Path points outside the process's allocated address space. .SH "SEE ALSO" .BR close (2), .BR link (2), .BR rmdir (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)utimes.2 6.4 (Berkeley) 8/26/85 .\" .TH UTIME 2 "August 26, 1985" .UC 4 .SH NAME utime \- set file times .SH SYNOPSIS .nf .ft B #include #include int utime(const char *\fIfile\fP, struct utimbuf *\fItimes\fP) .fi .SH DESCRIPTION The .B utime call uses the \*(lqaccessed\*(rq and \*(lqupdated\*(rq times from the utimbuf structure pointed to by .I times to set the corresponding recorded times for .I file. .PP Struct utimbuf is defined in as follows: .PP .RS .nf .ta +0.4i +0.8i +1.0i struct utimbuf { time_t actime; /* access time */ time_t modtime; /* modification time */ }; .fi .RE .PP The caller must be the owner of the file or the super-user. The \*(lqinode-changed\*(rq time of the file is set to the current time. .SH "RETURN VALUE Upon successful completion, a value of 0 is returned. Otherwise, a value of \-1 is returned and .B errno is set to indicate the error. .SH "ERRORS .B Utime will fail if one or more of the following are true: .TP 15 [ENOTDIR] A component of the path prefix is not a directory. .TP 15 [EINVAL] The pathname contains a character with the high-order bit set. .TP 15 [ENAMETOOLONG] The path name exceeds PATH_MAX characters. .TP 15 [ENOENT] The named file does not exist. .TP 15 [ELOOP] Too many symbolic links were encountered in translating the pathname. (Minix-vmd) .TP 15 [EPERM] The process is not super-user and not the owner of the file. .TP 15 [EACCES] Search permission is denied for a component of the path prefix. .TP 15 [EROFS] The file system containing the file is mounted read-only. .TP 15 [EFAULT] .I File or \fItimes\fP points outside the process's allocated address space. .TP 15 [EIO] An I/O error occurred while reading or writing the affected inode. .SH SEE ALSO .BR stat (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)wait.2 6.2 (Berkeley) 6/30/85 .\" .TH WAIT 2 "June 30, 1985" .UC 4 .SH NAME wait, waitpid \- wait for process to terminate .SH SYNOPSIS .ft B .nf #include #include pid_t wait(int *\fIstatus\fP) pid_t waitpid(pid_t \fIpid\fP, int *\fIstatus\fP, int \fIoptions\fP) .fi .SH DESCRIPTION .B Wait causes its caller to delay until a signal is received or one of its child processes terminates. If any child has died since the last .BR wait , return is immediate, returning the process id and exit status of one of the terminated children. If there are no children, return is immediate with the value \-1 returned. .PP On return from a successful .B wait call, .I status is nonzero, and the high byte of .I status contains the low byte of the argument to .B exit supplied by the child process; the low byte of .I status contains the termination status of the process. A more precise definition of the .I status word is given in .RI < sys/wait.h >. .B Wait can be called with a null pointer argument to indicate that no status need be returned. .PP .B Waitpid provides an alternate interface for programs that must not block when collecting the status of child processes, or that wish to wait for one particular child. The pid parameter is the process ID of the child to wait for, \-1 for any child. The .I status parameter is defined as above. The .I options parameter is used to indicate the call should not block if there are no processes that wish to report status (WNOHANG), and/or that children of the current process that are stopped due to a SIGTTIN, SIGTTOU, SIGTSTP, or SIGSTOP signal should also have their status reported (WUNTRACED). (Job control is not implemented for Minix, but these symbols and signals are.) .PP When the WNOHANG option is specified and no processes wish to report status, .B waitpid either returns 0 under some implementations, or \-1 with .B errno set to .B EAGAIN under others. (Under Minix it returns 0.) The WNOHANG and WUNTRACED options may be combined by .IR or 'ing the two values. .SH NOTES The call .BI "wait(&" status ")" is equivalent to .BI "waitpid(\-1, &" status ", 0)\fR." .PP See .BR sigaction (2) for a list of termination statuses (signals); 0 status indicates normal termination. A special status (0177) is returned for a stopped process that has not terminated and can be restarted; see .BR ptrace (2). If the 0200 bit of the termination status is set, a core image of the process was produced by the system. .PP If the parent process terminates without waiting on its children, the initialization process (process ID = 1) inherits the children. .PP .I defines a number of macros that operate on a status word: .TP 5 .BI "WIFEXITED(" status ")" True if normal exit. .TP 5 .BI "WEXITSTATUS(" status ")" Exit status if the process returned by a normal exit, zero otherwise. .TP 5 .BI "WTERMSIG(" status ")" Signal number if the process died by a signal, zero otherwise. .TP 5 .BI "WIFSIGNALED(" status ")" True if the process died by a signal. .TP 5 .BI "WIFSTOPPED(" status ")" True if the process is stopped. (Never true under Minix.) .TP 5 .BI "WSTOPSIG(" status ")" Signal number of the signal that stopped the process. .SH "RETURN VALUE If \fBwait\fP returns due to a stopped or terminated child process, the process ID of the child is returned to the calling process. Otherwise, a value of \-1 is returned and \fBerrno\fP is set to indicate the error. .PP .B Waitpid returns \-1 if there are no children not previously waited for or if the process that it wants to wait for doesn't exist. .PP .B Waitpid returns 0 if WNOHANG is specified and there are no stopped or exited children. (Under other implementations it may return \-1 instead. Portable code should test for both possibilities.) .SH ERRORS .B Wait will fail and return immediately if one or more of the following are true: .TP 15 [ECHILD] The calling process has no existing unwaited-for child processes. .TP 15 [EFAULT] The \fIstatus\fP argument points to an illegal address. .TP 15 [EAGAIN] .B Waitpid is called with the WNOHANG option and no child has exited yet. (Not under Minix, it'll return 0 in this case and leave .B errno alone.) .SH "SEE ALSO" .BR execve (2), .BR exit (2), .BR sigaction (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)write.2 6.5 (Berkeley) 5/14/86 .\" .TH WRITE 2 "May 14, 1986" .UC 4 .SH NAME write \- write output .SH SYNOPSIS .nf .ft B #include #include ssize_t write(int \fId\fP, const void *\fIbuf\fP, size_t \fInbytes\fP) .fi .SH DESCRIPTION .B Write attempts to write .I nbytes of data to the object referenced by the descriptor .I d from the buffer pointed to by .IR buf . .PP On objects capable of seeking, the \fBwrite\fP starts at a position given by the pointer associated with .IR d , see .BR lseek (2). Upon return from .BR write , the pointer is incremented by the number of bytes actually written. .PP Objects that are not capable of seeking always write from the current position. The value of the pointer associated with such an object is undefined. .PP When using non-blocking I/O on objects such as TCP/IP channels that are subject to flow control, .B write may write fewer bytes than requested; the return value must be noted, and the remainder of the operation should be retried when possible. .SH "RETURN VALUE Upon successful completion the number of bytes actually written is returned. Otherwise a \-1 is returned and the global variable .B errno is set to indicate the error. .SH ERRORS .B Write will fail and the file pointer will remain unchanged if one or more of the following are true: .TP 15 [EBADF] \fID\fP is not a valid descriptor open for writing. .TP 15 [EPIPE] An attempt is made to write to a pipe that is not open for reading by any process. .TP 15 [EPIPE] An attempt is made to write to a TCP channel that is not connected to a peer socket. .TP 15 [EFBIG] An attempt was made to write a file that exceeds the process's file size limit or the maximum file size. .TP 15 [EFAULT] Part of the data to be written to the file points outside the process's allocated address space. .TP 15 [ENOSPC] There is no free space remaining on the file system containing the file. .ig .TP 15 [EDQUOT] The user's quota of disk blocks on the file system containing the file has been exhausted. .. .TP 15 [EIO] An I/O error occurred while reading from or writing to the file system. .TP 15 [EAGAIN] The file was marked for non-blocking I/O, and no data could be written immediately. .SH "SEE ALSO" .BR fcntl (2), .BR lseek (2), .BR open (2), .BR pipe (2), .BR read (2). .\" svrctl.2 .\" .\" Created: July, 1994 by Philip Homburg .TH svrctl 2 .SH NAME svrctl \- special server control functions .SH SYNOPSIS .nf .ft B #include int svrctl(u32_t \fIrequest\fP, void *\fIdata\fP); .ft R .fi .SH DESCRIPTION .B Svrctl allows root to control the kernel in various ways, or implements some very Minix specific system calls that don't deserve their own system call number. .PP This system call makes it easy to add new ways of setting and getting kernel parameters, but at the same time, backwards compatibility is not guaranteed. Read the include file to see what the struct's mentioned below look like. Most calls are root-only, unless specified otherwise. .PP The only way to know how to properly use these calls is to study the associated kernel or server code, or the programs that already use these calls. .PP Current requests are: .TP 5 .B MMSIGNON Inform MM that the current process wants to become a server. .TP .B MMSWAPON Instruct MM to mount a file or device as swapspace. .TP .B MMSWAPOFF Tell MM to stop using swapspace. .TP .B FSSIGNON Register a new device with FS. .ig .TP .B FSDEVMAP Translate a device number to a task number, minor device pair using a \fBstruct fsdevmap\fP .. .TP .B SYSSIGNON Inform the kernel that the process want to become a server. The processes task number is filled-in in a \fBstruct systaskinfo\fP. .TP .B SYSGETENV Request the value of one or all boot parameters. Can be used by non-root. .SH "RETURN VALUES" .B Svrctl returns 0 upon success and -1 upon failure. .SH AUTHOR Philip Homburg ...abort.3abs.3assert.3atof.3bstring.3crypt.3ctime.3ctype.3curses.3directory.3editline.3end.3execl.3exit.3fclose.3ferror.3fopen.3fread.3fseek.3g_h_b_n.3getc.3getcwd.3getenv.3getgrent.3getlogin.3getopt.3getpass.3getpwent.3gets.3getttyent.3hton.3malloc.3oneC_sum.3popen.3printf.3putc.3puts.3qsort.3rand.3random.3resolver.3scanf.3setbuf.3sigset.3sleep.3stdarg.3stdio.3string.3system.3termcap.3termios.3ttyname.3ttyslot.3ungetc.3servxcheck.3 int64.3 configfile.3 getservent.3 rcmd.3.\" @(#)abort.3 6.3 (Berkeley) 5/27/86 .\" .TH ABORT 3 "May 27, 1986" .AT 3 .SH NAME abort \- generate a fault .SH SYNOPSIS .nf .ft B #include void abort(void) .ft R .fi .SH DESCRIPTION .B Abort executes an instruction which is illegal in user mode. This causes a signal that normally terminates the process with a core dump, which may be used for debugging. .SH SEE ALSO .BR sigaction (2), .BR exit (2). .SH DIAGNOSTICS Usually ``abort \- core dumped'' from the shell. .SH BUGS The abort() function does not flush standard I/O buffers. Use .BR fflush (3). .\" @(#)abs.3 6.1 (Berkeley) 5/15/85 .\" .TH ABS 3 "May 15, 1985" .AT 3 .SH NAME abs \- integer absolute value .SH SYNOPSIS .nf .ft B #include int abs(int \fIi\fP) .ft R .fi .SH DESCRIPTION .B Abs returns the absolute value of its integer operand. .SH SEE ALSO .BR floor (3). .SH BUGS Applying the \fIabs\fP function to the most negative integer generates a result which is the most negative integer. That is, abs(0x80000000) returns 0x80000000 as a result on a machine with 32-bit ints. Using the result in unsigned computations is sound however. .\" @(#)assert.3 6.2 (Berkeley) 5/12/86 .\" .TH ASSERT 3 "May 12, 1986" .AT 3 .SH NAME assert \- program verification .SH SYNOPSIS .nf .ft B #include void assert(int \fIexpression\fP) .fi .SH DESCRIPTION .B Assert is a macro that indicates .I expression is expected to be true at this point in the program. It causes an .BR abort (3) with a diagnostic comment on the standard output when .I expression is false (0). Compiling with the .BR cc (1) option .SM .B \-DNDEBUG effectively deletes .B assert from the program. .SH DIAGNOSTICS `Assertion "\fIexpression\fR" failed: file .I f line .IR n .' .I F is the source file and .I n the source line number of the .B assert statement. .\" @(#)atof.3 6.1 (Berkeley) 5/15/85 .\" .TH ATOF 3 "May 15, 1985" .AT 3 .SH NAME atof, atoi, atol \- convert ASCII to numbers .SH SYNOPSIS .nf .ft B #include double atof(const char *\fInptr\fP) int atoi(const char *\fInptr\fP) long atol(const char *\fInptr\fP) .ft R .fi .SH DESCRIPTION These functions convert a string pointed to by .I nptr to floating, integer, and long integer representation respectively. The first unrecognized character ends the string. .PP .B Atof recognizes an optional string of spaces, then an optional sign, then a string of digits optionally containing a decimal point, then an optional `e' or `E' followed by an optionally signed integer. .PP .B Atoi and .B atol recognize an optional string of spaces, then an optional sign, then a string of digits. .SH SEE ALSO .BR strtol (3), .BR strtod (3), .BR scanf (3). .SH BUGS There are no provisions for overflow. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)bstring.3 6.1 (Berkeley) 5/15/85 .\" .TH BSTRING 3 "May 15, 1985" .UC 5 .SH NAME bstring, bcopy, bcmp, bzero, ffs \- bit and byte string operations .SH SYNOPSIS .nf .ft B #include #include #include void bcopy(const void *\fIsrc\fP, void *\fIdst\fP, size_t \fIlength\fP) int bcmp(const void *\fIb1\fP, const void *\fIb2\fP, size_t \fIlength\fP) void bzero(void *\fIdst\fP, size_t \fIlength\fP) int ffs(int \fIi\fP) .ft R .fi .SH DESCRIPTION The functions .BR bcopy , .BR bcmp , and .B bzero operate on variable length strings of bytes. They do not check for null bytes as the routines in .BR string (3) do. .PP .B Bcopy copies .I length bytes from string .I src to the string .IR dst . .PP .B Bcmp compares byte string .I b1 against byte string .IR b2 , returning zero if they are identical, non-zero otherwise. Both strings are assumed to be .I length bytes long. .PP .B Bzero places .I length 0 bytes in the string .IR b1 . .PP .B Ffs find the first bit set in the argument passed it and returns the index of that bit. Bits are numbered starting at 1. A return value of 0 indicates the value passed is zero. .SH BUGS The .BR bcopy , .BR bcmp , and .BR bzero functions are obsolete; new code should use .BR memmove , .BR memcmp , and .BR memset respectively. .PP The .B bcopy routine takes parameters backwards from .BR memcpy , .BR memmove , and .BR strcpy . .TH CRYPT 3 .SH NAME crypt \- one-way password encryption function .SH SYNOPSIS .ft B .nf #define _MINIX_SOURCE 1 #include char *crypt(const char *\fIkey\fP, const char *\fIsalt\fP) .fi .ft P .SH DESCRIPTION The first use of .B crypt() is to encrypt a password. Its second use is to authenticate a shadow password. In both cases .B crypt() calls .BR pwdauth (8) to do the real work. .PP .B Crypt() encrypts a password if called with a user typed key, and a salt whose first two characters are in the set [./0-9A-Za-z]. The result is a character string in the [./0-9A-Za-z] alphabet of which the first two characters are equal to the salt, and the rest is the result of encrypting the key and the salt. .PP If .B crypt() is called with a salt that has the form .BI "##" user then the key is encrypted and compared to the encrypted password of .I user in the shadow password file. If they are equal then .B crypt() returns the .BI "##" user argument, if not then some other string is returned. This trick assures that the normal way to authenticate a password still works: .PP .RS .nf if (strcmp(pw->pw_passwd, crypt(key, pw->pw_passwd))) ... .fi .RE .PP If .I key is a null string, and the shadow password is a null string or the salt is a null string then the result equals .IR salt . (This is because the caller can't tell if a password field is empty in the shadow password file.) .PP The key and salt are limited to 1024 bytes total including the null bytes. .SH FILES .TP 25 /usr/lib/pwdauth The password authentication program .SH "SEE ALSO" .BR getpass (3), .BR getpwent (3), .BR passwd (5), .BR pwdauth (8). .SH NOTES The result of an encryption is returned in a static array that is overwritten by each call. The return value should not be modified. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)ctime.3 6.8 (Berkeley) 4/2/87 .\" .TH CTIME 3 "April 2, 1987" .UC 4 .SH NAME ctime, localtime, gmtime, asctime, tzset \- convert date and time to ASCII .SH SYNOPSIS .nf .ft B #include #include void tzset(void) char *ctime(const time_t *\fIclock\fP) char *asctime(const struct tm *\fItm\fP) struct tm *localtime(const time_t *\fIclock\fP) struct tm *gmtime(const time_t *\fIclock\fP) .fi .SH DESCRIPTION \fBTzset\fP uses the value of the environment variable \fBTZ\fP to set up the time conversion information used by \fBlocaltime\fP. .PP If \fBTZ\fP does not appear in the environment, the \fBTZDEFAULT\fP file (as defined in \fI\fP) is used by \fBlocaltime\fP. If this file fails for any reason, the GMT offset as provided by the kernel is used. In this case, DST is ignored, resulting in the time being incorrect by some amount if DST is currently in effect. If this fails for any reason, GMT is used. .PP If \fBTZ\fP appears in the environment but its value is a null string, Greenwich Mean Time is used; if \fBTZ\fP appears and begins with a slash, it is used as the absolute pathname of the \fBtzfile\fP(5)-format file from which to read the time conversion information; if \fBTZ\fP appears and begins with a character other than a slash, it's used as a pathname relative to the system time conversion information directory, defined as \fBTZDIR\fP in the include file \fBtzfile.h\fP. If this file fails for any reason, the GMT offset as provided by the kernel is used, as described above. If this fails for any reason, GMT is used. See .BR TZ (5) for a proper description of the .B TZ variable. .PP \fBCtime\fP converts a time value, pointed to by \fIclock\fP, such as returned by \fBtime\fP(2) into ASCII and returns a pointer to a 26-character string in the following form. All the fields have constant width. .PP .RS .nf Sun Sep 16 01:03:52 1973\en\e0 .fi .RE .PP .B Localtime and .B gmtime return pointers to structures containing the broken-down time. .B Localtime corrects for the time zone and possible daylight savings time; .B gmtime converts directly to GMT, which is the time UNIX uses. .B Asctime converts a broken-down time to ASCII and returns a pointer to a 26-character string. .PP The structure declaration from the include file is: .PP .RS .nf .nr .0 .8i+\w'int tm_isdst'u .ta .5i \n(.0u \n(.0u+\w'/* 0-000'u+1n struct tm { int tm_sec; /* 0-59 seconds */ int tm_min; /* 0-59 minutes */ int tm_hour; /* 0-23 hour */ int tm_mday; /* 1-31 day of month */ int tm_mon; /* 0-11 month */ int tm_year; /* 0- year \- 1900 */ int tm_wday; /* 0-6 day of week (Sunday = 0) */ int tm_yday; /* 0-365 day of year */ int tm_isdst; /* flag: daylight savings time in effect */ long tm_gmtoff; /* offset from GMT in seconds */ char **tm_zone; /* abbreviation of timezone name */ }; .fi .RE .PP \fBTm_isdst\fP is non-zero if a time zone adjustment such as Daylight Savings time is in effect. .PP \fBTm_gmtoff\fP is the offset (in seconds) of the time represented from GMT, with positive values indicating East of Greenwich. .SH FILES .ta \w'/usr/lib/zoneinfo\0\0'u /usr/lib/zoneinfo time zone information directory .br /etc/localtime local time zone file .SH SEE ALSO .BR time (2), .BR getenv (3), .BR tzfile (5), .BR TZ (5), .BR environ (7), .BR zic (8). .SH NOTE The return values point to static data whose content is overwritten by each call. The \fBtm_zone\fP field of a returned \fBstruct tm\fP points to a static array of characters, which will also be overwritten at the next call (and by calls to \fBtzset\fP). .\" @(#)ctype.3 6.4 (Berkeley) 5/12/86 .\" .TH CTYPE 3 "May 12, 1986" .AT 3 .SH NAME ctype, isalpha, isupper, islower, isdigit, isxdigit, isalnum, isspace, ispunct, isprint, isgraph, iscntrl, isascii, toupper, tolower, toascii \- character classification macros .SH SYNOPSIS .nf .ft B #include int isalpha(int \fIc\fP) \&... .fi .SH DESCRIPTION These macros classify characters by table lookup. Each is a predicate returning nonzero for true, zero for false. .B Isascii and .B toascii are defined on all integer values; the rest are defined only on the range of .B "unsigned char" and on the special value EOF (see .BR stdio (3)). .TP 15n .B isalpha .I c is a letter .TP .B isupper .I c is an upper case letter .TP .B islower .I c is a lower case letter .TP .B isdigit .I c is a digit .TP .B isxdigit .I c is a hex digit .TP .B isalnum .I c is an alphanumeric character .TP .B isspace .I c is a space, tab, carriage return, newline, vertical tab, or formfeed .TP .B ispunct .I c is a punctuation character (neither control nor alphanumeric) .TP .B isprint .I c is a printing character, code 040(8) (space) through 0176 (tilde) .TP .B isgraph .I c is a printing character, similar to .B isprint except false for space. .TP .B iscntrl .I c is a delete character (0177) or ordinary control character (less than 040). .TP .B isascii .I c is an ASCII character, code less than 0200 .TP .B tolower .I c is converted to lower case. Return value is undefined if not .BR isupper (\fIc\fR). .TP .B toupper .I c is converted to upper case. Return value is undefined if not .BR islower (\fIc\fR). .TP .B toascii .I c is converted to be a valid ascii character. .SH "SEE ALSO" .BR ascii (7) .TH CURSES 3 .SH NAME curses \- screen/window management library .SH SYNOPSIS cc demo.c -lcurses .SH DESCRIPTION Curses is a library of screen and window management routines. It is modeled after the UNIX curses and ncurses libraries. Normally, programs written for curses should be easily ported to UNIX, and vice versa. .PP To use the routines, the function initscr() must first be called. This creates two 'windows' for the user: stdscr and curscr. Stdscr is the default window for the user to make changes on, and curscr reflects the current contents of the physical display screen. The user writes or edits the stdscr window to his liking, then calls the refresh() function to make curscr and the physical screen look like stdscr. When the user program terminates, it should call the endwin() function to restore things to normal. .PP There are all sorts of window manipulation routines available to the programmer: auxiliary windows may be created, edited, moved and deleted. The terminal may be set in many different modes, output text may be attributed with blink, blank, bold and reverse attributes. Screen colors may also be set, foreground and background. There are window-specific printf- and scanf-like routines, routines for scrolling, box-drawing, window overlaying, clearing routines etc. .PP For more and detailed information, see the library source codes. All curses functions are preceded by a complete description. .SH FUNCTIONS Below is a list over the available functions, together with a brief description of what they do. In general, functions whose names start with 'w' differ from the one without 'w' (like wmove vs. move) signify that a specific window is used. Without a 'w', sdtscr is implied. The functions that start with 'mv' before the 'genereic' function name signify that a cursor motion should be made before the actual work. 'mv' and 'w' combine as expected. .PP Most routines that return an int will return the manifest constant ERR if there is a failure during execution. Routines that return a char actually return an int, so that ERR does not conflict with the character code 0xff. All characters from 0 to 0xff are allowed for usage with curses. .PP Some routines, like {mv}{w} printw() and {mv}{w}scanw() return a meaningful positive value if the operation is successful. .PP The curses package uses some predefined types, variables and manifest constants that are also available to the programmer. There are also a few globally accessible variables that should not be touched by the application program. Those untouchable variables have names starting with an underscore (_) to avoid conflicts. The user-accessible types, variables and constants are (there are a number of other constants defining character attribute names and function key names - consult for details): .sp .nf .ta 3i (manifest constants) .RS TRUE boolean true FALSE boolean false ERR unsuccessfull operation OK successfull operation .RE .sp (types) .RS WINDOW a window structure type bool boolean flag type .RE .sp (variables) .RS WINDOW curscr physical display image WINDOW stdscr default user drawing board int LINES terminal height int COLS terminal width int NONL \\n causes CR and LF when TRUE .RE .sp .fi The following is an alphabetical list of the curses functions, together with their types, parameters and a short comment for each (win is a window, ch, vc, hc are characters, buf is a character buffer, attrs is an attribute bit map, bf is a boolean flag. Note that `characters' in this context usually can have 16 bits): .nf .sp int waddch(win,ch) put char in stdscr int addch(ch) int mvaddch(y,x,ch) int mvwaddch(win,y,x,ch) int waddstr(win,str) put string in stdscr int addstr(str) int mvaddstr(y,x,str) int mvwaddstr(win,y,x,str) void wattroff(win,attrs) clear attribute(s) in window void attroff(attrs) void wattron(win,attrs) add attribute(s) in window void attron(attrs) void wattrset(win,attrs) set window char attributes void attrset(attrs) int baudrate() dummy for compatibility void beep() ring the bell or visible bell if no bell available void flash() flash terminal screen or rings bell if no visible bell available void wbox(win,miny,minx,maxy,maxx,vc,hc) box in a window, with given characters void box(win,vc,hc) void cbreak() set terminal cbreak mode void wclear(win) clear stdscr void clear() void clearok(win,bf) marks window for screen clear int wclrtobot(win) clear from cursor to end of line and all lines down this line int clrtobot() int mvclrtoeol(y,x) int mvwclrtobot(win,y,x) int wclrtoeol(win) clear from cursor to end of line int clrtoeol() int mvclrtoeol(y,x) int mvwclrtoeol(win,y,x) int wdelch(win) delete a char in a window int delch() int mvdelch(y,x) int mvwdelch(win,y,x) int wdeleteln(win) delete a line in a window int deleteln() int mvdeleteln(y,x) int mvwdeleteln(win,y,x) void delwin(win) delete a window or a subwindow void doupdate() update physical screen void echo() set terminal echo mode int endwin() cleanup and curses finitialization void werase(win) erase a window void erase() int erasechar() return char delete character int fixterm() dummy for compatibility void flushinp() kill pending keyboard input int wgetch(win) get char via a window int getch() int mvgetch(y,x) int mvwgetch(win,y,x) int wgetstr(win,str) get string via window to a buffer int getstr(str) int mvgetstr(y,x,str) int mvwgetstr(win,y,x,str) void getyx(win,y,x) get a window's cursor position int gettmode() dummy for compatibility void idlok(win,bf) dummy for compatibility WINDOW *initscr() curses initialization (ret stdscr or NULL) int winch(win) get char at window cursor int inch() int mvinch(y,x) int mvwinch(win,y,x) int winsch(win,ch) insert character in a window int insch(ch) int mvinsch(y,x,ch) int mvwinsch(win,y,x,ch) int winsertln(win) insert new line in a window int insertln() int mvinsertln(y,x) int mvwinsertln(win,y,x) void keypad(win,bf) marks a window for keypad usage int killchar() return line delete character char *longname() returns terminal description string void leaveok(win,bf) marks window for cursor 'update leave' void meta(win,bf) marks window for meta int move(y,x) move cursor in stdscr int mvcur(oldy,oldx,y,x) move terminal cursor to int mvprintw(y,x,fmt,args) move & print string in stdscr int mvscanw(y,x,fmt,args) move & get values via stdscr int mvwin(win,y,x) move window on physical screen int mvwprintw(win,x,y,fmt,args) move & print string in a window int mvwscanw(win,y,x,fmt,args) move & get values via a window WINDOW *newwin(lines,cols,begy,begx) create a new window void nl() set terminal cr-crlf mapping mode void nocbreak() unset terminal cbreak mod void nodelay(win,bf) marks window for no input wait void noecho() unset terminal echo mode void nonl() unset terminal cr-crlf mapping mode void noraw() unset raw terminal mode void overlay(win1,win2) overlay one window on another void overwrite(win1,win2) overwrite one window on another int printw(fmt,args) print string in stdscr void raw() set raw terminal mode void refrbrk(bf) set screen update break mode void refresh() refresh stdscr int resetterm() dummy for compatibility int resetty() restore terminal I/O modes int saveoldterm() dummy for compatibility int saveterm() dummy for compatibility int savetty() save terminal I/O modes int scanw(fmt,args) get values via stdscr void scroll(win) scroll scrolling region of a window void scrollok(win,bf) marks a window to allow scroll void setcolors(A_COLOR(for,back)) sets the forground and background colors of stdscr void set_curs(visibility) 0 for invisible, 1 for visible, 2 for good visible int setsrcreg(miny,maxy) define stdscr's scroll region int setterm() dummy for compatibility int setupterm(term,fd,errret) set up terminal void standend() start normal chars in stdscr void standout() start standout chars in stdscr WINDOW *subwin(win,lines,cols,begy,begx) create a sub-window in window win int tabsize(ts) set/get tabsize of stdscr void touchwin(win) mark a window as totally modified char *unctrl(ch) char-to-string converter int wmove(win,y,x) move cursor in a window void wnoutrefresh(win) create internal sc #"#reen image int wprintw(win,fmt,args) print string in a window void wrefresh(win) refresh window int wscanw(win,fmt,args) get values via a window void wsetcolors(win,A_COLOR(for,back)) sets the forground and background colors of the specified window int wsetsrcreg(win,miny,maxy) define a window's scrolling region void wstandend(win) start normal chars in window void wstandout(win) start standout chars in window int wtabsize(win,ts) set/get tabsize of a window .SH BUGS Function keys are not available under the MINIX version. .\" $PchId: curses.3,v 1.3 1996/02/22 21:26:28 philip Exp $ .TH DIRECTORY 3 .SH NAME directory, opendir, readdir, rewinddir, closedir, telldir, seekdir \- directory routines .SH SYNOPSIS .nf .ft B #include #include DIR *opendir(const char *\fIdirname\fP) struct dirent *readdir(DIR *\fIdirp\fP) void rewinddir(DIR *\fIdirp\fP) int closedir(DIR *\fIdirp\fP) #define _MINIX 1 #include #include long telldir(DIR *\fIdirp\fP) int seekdir(DIR *\fIdirp\fP, long \fIpos\fP) .SH DESCRIPTION These routines form a system independent interface to access directories. .PP .B Opendir() opens the directory .I dirname and returns a pointer to this open directory stream. .PP .B Readdir() reads one entry from the directory as a pointer to a structure containing the field .BR d_name , a character array containing the null-terminated name of the entry. .PP .B Rewinddir() allows the directory to be read again from the beginning. .PP .B Closedir() closes the directory and releases administrative data. .PP The Minix specific functions .B telldir() and .B seekdir() allow one to get the current position in the directory file and to return there later. .B Seekdir() may only be called with a position returned by .B telldir() or 0 (rewind). These functions should not be used in portable programs. .SH "SEE ALSO" .BR dir (5). .SH DIAGNOSTICS .B Opendir() returns a null pointer if .I dirname can't be opened, or if it can't allocate enough memory for the .B DIR structure. .PP .B Readdir() returns null if there are no more directory entries or on error. .PP .B Closedir() and .B seekdir() returns 0 on success, -1 on error. .PP .B Telldir() returns -1 on error. .PP All of them set .B errno appropriately. .B Readdir() will only set .B errno on error, not on end-of-dir, so you should set .B errno to zero beforehand, and check its value if .B readdir() returns null. .SH NOTES The return value of .B readdir() needs to be copied before the next operation on the same directory if it is to be saved. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" $Revision: 1.2 $ .TH EDITLINE 3 .SH NAME editline \- command-line editing library with history .SH SYNOPSIS .ft B char *readline(char *\fIprompt\fP) .ft P .SH DESCRIPTION .I Editline is a library that provides an line-editing interface with text recall. It is intended to be compatible with the .I readline library provided by the Free Software Foundation, but much smaller. The bulk of this manual page describes the user interface. .PP The .I readline routine returns a line of text with the trailing newline removed. The data is returned in a buffer allocated with .IR malloc (3), so the space should be released with .IR free (3) when the calling program is done with it. Before accepting input from the user, the specified .I prompt is displayed on the terminal. .PP Each line returned is copied to the internal history list, unless it happens to be equal to the previous line. .SS "User Interface" A program that uses this library provides a simple emacs-like editing interface to its users. A line may be edited before it is sent to the calling program by typing either control characters or escape sequences. A control character, shown as a caret followed by a letter, is typed by holding down the ``control'' key while the letter is typed. For example, ``^A'' is a control-A. An escape sequence is entered by typing the ``escape'' key followed by one or more characters. The escape key is abbreviated as ``ESC.'' Note that unlike control keys, case matters in escape sequences; ``ESC\ F'' is not the same as ``ESC\ f''. .PP An editing command may be typed anywhere on the line, not just at the beginning. In addition, a return may also be typed anywhere on the line, not just at the end. .PP Most editing commands may be given a repeat count, .IR n , where .I n is a number. To enter a repeat count, type the escape key, the number, and then the command to execute. For example, ``ESC\ 4\ ^f'' moves forward four characters. If a command may be given a repeat count then the text ``[n]'' is given at the end of its description. .PP The following control characters are accepted: .RS .nf .ta \w'ESC DEL 'u ^A Move to the beginning of the line ^B Move left (backwards) [n] ^D Delete character [n] ^E Move to end of line ^F Move right (forwards) [n] ^G Ring the bell ^H Delete character before cursor (backspace key) [n] ^I Complete filename (tab key); see below ^J Done with line (return key) ^K Kill to end of line (or column [n]) ^L Redisplay line ^M Done with line (alternate return key) ^N Get next line from history [n] ^P Get previous line from history [n] ^R Search backward (forward if [n]) through history for text; \& must start line if text begins with an uparrow ^T Transpose characters ^V Insert next character, even if it is an edit command ^W Wipe to the mark ^X^X Exchange current location and mark ^Y Yank back last killed text ^[ Start an escape sequence (escape key) ^]c Move forward to next character ``c'' ^? Delete character before cursor (delete key) [n] .fi .RE .PP The following escape sequences are provided. .RS .nf .ta \w'ESC DEL 'u ESC\ ^H Delete previous word (backspace key) [n] ESC\ DEL Delete previous word (delete key) [n] ESC\ SP Set the mark (space key); see ^X^X and ^Y above ESC\ \. Get the last (or [n]'th) word from previous line ESC\ \? Show possible completions; see below ESC\ < Move to start of history ESC\ > Move to end of history ESC\ b Move backward a word [n] ESC\ d Delete word under cursor [n] ESC\ f Move forward a word [n] ESC\ l Make word lowercase [n] ESC\ m Toggle if 8bit chars display normally or with ``M\-'' prefix ESC\ u Make word uppercase [n] ESC\ y Yank back last killed text ESC\ v Show library version ESC\ w Make area up to mark yankable ESC\ nn Set repeat count to the number nn ESC\ C Read from environment variable ``_C_'', where C is \& an uppercase letter .fi .RE .PP The .I editline library has a small macro facility. If you type the escape key followed by an uppercase letter, .IR C , then the contents of the environment variable .I _C_ are read in as if you had typed them at the keyboard. For example, if the variable .I _L_ contains the following: .RS ^A^Kecho '^V^[[H^V^[[2J'^M .RE Then typing ``ESC L'' will move to the beginning of the line, kill the entire line, enter the echo command needed to clear the terminal (if your terminal is like a VT-100), and send the line back to the shell. .PP The .I editline library also does filename completion. Suppose the root directory has the following files in it: .RS .nf .ta \w'core 'u bin vmunix core vmunix.old .fi .RE If you type ``rm\ /v'' and then the tab key. .I Editline will then finish off as much of the name as possible by adding ``munix''. Because the name is not unique, it will then beep. If you type the escape key and a question mark, it will display the two choices. If you then type a period and a tab, the library will finish off the filename for you: .RS .nf .RI "rm /v[TAB]" munix .TAB old .fi .RE The tab key is shown by ``[TAB]'' and the automatically-entered text is shown in italics. .SH "BUGS AND LIMITATIONS" Doesn't know how to handle multiple lines. .SH AUTHORS Simmule R. Turner and Rich $alz . Original manual page by DaviD W. Sanderson . .\" $PchId: editline.3,v 1.3 1996/02/22 21:18:51 philip Exp $ .\" @(#)end.3 6.2 (Berkeley) 5/12/86 .\" .TH END 3 "May 12, 1986" .AT 3 .SH NAME end, etext, edata \- last locations in program .SH SYNOPSIS .nf .ft B extern int etext; extern int edata; extern int end, _end; .ft R .fi .SH DESCRIPTION These names refer neither to routines nor to locations with interesting contents. The address of .B etext is the first address above the program text, .B edata above the initialized data region, and .B end above the uninitialized data region. .B _end is the same as .BR end , but in the implementers name space, i.e. for use in libraries. .PP When execution begins, the program break coincides with .BR end , but it is reset by the routines .BR brk (2), .BR malloc (3), standard input/output .RB ( stdio (3)), etc. The current value of the program break is reliably returned by `sbrk(0)', see .BR brk (2). .SH "SEE ALSO" .BR brk (2), .BR malloc (3). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)execl.3 6.2 (Berkeley) 4/25/86 .\" .TH EXECL 3 "April 25, 1986" .UC 5 .SH NAME execl, execv, execle, execlp, execvp, exec, environ \- execute a file .SH SYNOPSIS .ft B #include .in +.5i .ti -.5i int execl(const char *\fIname\fP, const char *\fIarg0\fP, ..., (char *) NULL) .ti -.5i int execv(const char *\fIname\fP, char *const \fIargv\fP[]) .ti -.5i int execle(const char *\fIname\fP, const char *\fIarg0\fP, ..., (char *) NULL, char *const \fIenvp\fP[]) .ti -.5i int execlp(const char *\fIname\fP, const char *\fIarg0\fP, ..., (char *) NULL) .ti -.5i int execvp(const char *\fIname\fP, char *const \fIargv\fP[]) .in -.5i extern char *const *environ; .fi .SH DESCRIPTION These routines provide various interfaces to the .B execve system call. Refer to .BR execve (2) for a description of their properties; only brief descriptions are provided here. .PP .B Exec in all its forms overlays the calling process with the named file, then transfers to the entry point of the core image of the file. There can be no return from a successful exec; the calling core image is lost. .PP The .I name argument is a pointer to the name of the file to be executed. The pointers .IR arg [ 0 ], .IR arg [ 1 "] ..." address null-terminated strings. Conventionally .IR arg [ 0 ] is the name of the file. .PP Two interfaces are available. .B execl is useful when a known file with known arguments is being called; the arguments to .B execl are the character strings constituting the file and the arguments; the first argument is conventionally the same as the file name (or its last component). A null pointer argument must end the argument list. (Note that the .B execl* functions are variable argument functions. This means that the type of the arguments beyond .I arg0 is not checked. So the null pointer requires an explicit cast to type .B "(char *)" if not of that type already.) .PP The .B execv version is useful when the number of arguments is unknown in advance; the arguments to .B execv are the name of the file to be executed and a vector of strings containing the arguments. The last argument string must be followed by a null pointer. .PP When a C program is executed, it is called as follows: .PP .RS .ft B .nf int main(int \fIargc\fP, char *const \fIargv\fP[], char *const \fIenvp\fP[]); exit(main(\fIargc\fP, \fIargv\fP, \fIenvp\fP)); .fi .ft R .RE .PP where .I argc is the argument count and .I argv is an array of character pointers to the arguments themselves. As indicated, .I argc is conventionally at least one and the first member of the array points to a string containing the name of the file. .PP .I Argv is directly usable in another .B execv because .IR argv [ argc ] is 0. .PP .I Envp is a pointer to an array of strings that constitute the .I environment of the process. Each string consists of a name, an \*(lq=\*(rq, and a null-terminated value. The array of pointers is terminated by a null pointer. The shell .BR sh (1) passes an environment entry for each global shell variable defined when the program is called. See .BR environ (7) for some conventionally used names. The C run-time start-off routine places a copy of .I envp in the global cell .BR environ , which is used by .B execv and .B execl to pass the environment to any subprograms executed by the current program. .PP .B Execlp and .B execvp are called with the same arguments as .B execl and .BR execv , but duplicate the shell's actions in searching for an executable file in a list of directories. The directory list is obtained from the environment variable .BR PATH . Under standard Minix, if a file is found that is executable, but does not have the proper executable header then it is assumed to be a shell script. .B Execlp and .B execvp execute .B /bin/sh to interpret the script. Under Minix-vmd this does not happen, a script must begin with .B #! and the full path name of the interpreter if it is to be an executable script. .SH "SEE ALSO" .BR execve (2), .BR fork (2), .BR environ (7), .BR sh (1). .SH DIAGNOSTICS If the file cannot be found, if it is not executable, if it does not start with a valid magic number (see .BR a.out (5)), if maximum memory is exceeded, or if the arguments require too much space, a return constitutes the diagnostic; the return value is \-1 and .B errno is set as for .BR execve . Even for the super-user, at least one of the execute-permission bits must be set for a file to be executed. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)exit.3 6.2 (Berkeley) 5/12/86 .\" .TH EXIT 3 "May 12, 1986" .UC 5 .SH NAME exit, atexit \- terminate a process after flushing any pending output .SH SYNOPSIS .nf .ft B #include void exit(int \fIstatus\fP) int atexit(void (*\fIfunc\fP)(void)) .ft R .fi .SH DESCRIPTION .B Exit first calls all functions registered by .BR atexit , flushes all data buffered by the Standard I/O library, and finally terminates the process. .B Exit never returns. .PP .B Atexit registers the function .I func into a table of functions to be called on exit. .SH "SEE ALSO" .BR exit (2). .SH DIAGNOSTICS .B Atexit returns 0 on success, \-1 if .B malloc cannot allocate more memory for the list of registered functions. .\" @(#)fclose.3s 6.1 (Berkeley) 5/15/85 .\" .TH FCLOSE 3 "May 15, 1985" .AT 3 .SH NAME fclose, fflush \- close or flush a stream .SH SYNOPSIS .nf .ft B #include int fclose(FILE *\fIstream\fP) int fflush(FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Fclose causes any buffers for the named .I stream to be emptied, and the file to be closed. Buffers allocated by the standard input/output system are freed. .PP .B Fclose is performed automatically upon calling .BR exit (3). .PP .B Fflush causes any buffered data for the named output .I stream to be written to that file. The stream remains open. .SH "SEE ALSO" .BR close (2), .BR fopen (3), .BR setbuf (3). .SH DIAGNOSTICS These routines return .SM .B EOF if .I stream is not associated with an output file, or if buffered data cannot be transferred to that file. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)ferror.3s 6.3 (Berkeley) 5/14/86 .\" .TH FERROR 3 "May 14, 1986" .UC 4 .SH NAME ferror, feof, clearerr, fileno \- stream status inquiries .SH SYNOPSIS .nf .ft B #include int feof(FILE *\fIstream\fP) int ferror(FILE *\fIstream\fP) int clearerr(FILE *\fIstream\fP) int fileno(FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Feof returns non-zero when end of file is read on the named input .IR stream , otherwise zero. Unless cleared by .BR clearerr , the end-of-file indication lasts until the stream is closed. .PP .B Ferror returns non-zero when an error has occurred reading or writing the named .IR stream , otherwise zero. Unless cleared by .BR clearerr , the error indication lasts until the stream is closed. .PP .B Clearerr resets the error and end-of-file indicators on the named .IR stream . .PP .B Fileno returns the integer file descriptor associated with the .IR stream , see .BR open (2). .PP Currently all of these functions are implemented as macros; they cannot be redeclared. .SH "SEE ALSO" .BR fopen (3), .BR open (2). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)fopen.3s 6.3 (Berkeley) 5/27/86 .\" .TH FOPEN 3 "May 27, 1986" .UC 4 .SH NAME fopen, freopen, fdopen \- open a stream .SH SYNOPSIS .nf .ft B #include FILE *fopen(const char *\fIfilename\fP, const char *\fItype\fP) FILE *freopen(const char *\fIfilename\fP, const char *\fItype\fP, FILE *\fIstream\fP) FILE *fdopen(int \fIfildes\fP, const char *\fItype\fP) .ft R .fi .SH DESCRIPTION .B Fopen opens the file named by .I filename and associates a stream with it. .B Fopen returns a pointer to be used to identify the stream in subsequent operations. .PP .I Type is a character string having one of the following values: .TP 5 "r" open for reading .ns .TP 5 "w" create for writing .ns .TP 5 "a" append: open for writing at end of file, or create for writing .PP In addition, each .I type may be followed by a "+" to have the file opened for reading and writing. "r+" positions the stream at the beginning of the file, "w+" creates or truncates it, and "a+" positions it at the end. Both reads and writes may be used on read/write streams, with the limitation that an .BR fseek , .BR rewind , or reading an end-of-file must be used between a read and a write or vice-versa. .PP .B Freopen substitutes the named file in place of the open .IR stream . It returns the original value of .IR stream . The original stream is closed. .PP .B Freopen is typically used to attach the preopened constant names, .B stdin, stdout, stderr, to specified files. .PP .B Fdopen associates a stream with a file descriptor obtained from .BR open , .BR dup , .BR creat , or .BR pipe (2). The .I type of the stream must agree with the mode of the open file. .SH "SEE ALSO" .BR open (2), .BR fclose (3). .SH DIAGNOSTICS .B Fopen and .B freopen return the pointer .SM .B NULL if .I filename cannot be accessed, if too many files are already open, or if other resources needed cannot be allocated. .SH BUGS .B Fdopen is not portable to systems other than UNIX. .PP The read/write .I types do not exist on all systems. Those systems without read/write modes will probably treat the .I type as if the "+" was not present. These are unreliable in any event. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)fread.3s 6.1 (Berkeley) 5/15/85 .\" .TH FREAD 3 "May 15, 1985" .UC 4 .SH NAME fread, fwrite \- buffered binary input/output .SH SYNOPSIS .nf .ft B #include #include size_t fread(void *\fIptr\fP, size_t \fIitemsize\fP, size_t \fInitems\fP, FILE *\fIstream\fP) size_t fwrite(void *\fIptr\fP, size_t \fIitemsize\fP, size_t \fInitems\fP, FILE *\fIstream\fP) .SH DESCRIPTION .B Fread reads, into a block beginning at .IR ptr , .I nitems of data of the type of .I *ptr from the named input .IR stream . It returns the number of items actually read. .PP If .I stream is .B stdin and the standard output is line buffered, then any partial output line will be flushed before any call to .BR read (2) to satisfy the .BR fread . .PP .B Fwrite appends at most .I nitems of data of the type of .I *ptr beginning at .I ptr to the named output .IR stream . It returns the number of items actually written. .SH "SEE ALSO" .BR read (2), .BR write (2), .BR fopen (3), .BR getc (3), .BR putc (3), .BR gets (3), .BR puts (3), .BR printf (3), .BR scanf (3). .SH DIAGNOSTICS .B Fread and .B fwrite return 0 upon end of file or error. .\" @(#)fseek.3s 6.3 (Berkeley) 2/24/86 .\" .TH FSEEK 3 "February 24, 1986" .AT 3 .SH NAME fseek, ftell, rewind \- reposition a stream .SH SYNOPSIS .nf .ft B #include int fseek(FILE *\fIstream\fP, long \fIoffset\fP, int \fIptrname\fP) long ftell(FILE *\fIstream\fP) void rewind(FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Fseek sets the position of the next input or output operation on the .IR stream . The new position is at the signed distance .I offset bytes from the beginning, the current position, or the end of the file, according as .I ptrname has the value 0, 1, or 2. .PP .B Fseek undoes any effects of .BR ungetc (3). .PP .B Ftell returns the current value of the offset relative to the beginning of the file associated with the named .IR stream . It is measured in bytes on UNIX; on some other systems it is a magic cookie, and the only foolproof way to obtain an .I offset for .BR fseek . .PP .BR Rewind "(\fIstream\fR)" is equivalent to .BR fseek "(\fIstream\fR, 0L, 0)." .SH "SEE ALSO" .BR lseek (2), .BR fopen (3). .SH DIAGNOSTICS .B Fseek returns \-1 for improper seeks, otherwise zero. .\" Copyright (c) 1983, 1987 The Regents of the University of California. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms are permitted provided .\" that: (1) source distributions retain this entire copyright notice and .\" comment, and (2) distributions including binaries display the following .\" acknowledgement: ``This product includes software developed by the .\" University of California, Berkeley and its contributors'' in the .\" documentation or other materials provided with the distribution and in .\" all advertising materials mentioning features or use of this software. .\" Neither the name of the University nor the names of its contributors may .\" be used to endorse or promote products derived from this software without .\" specific prior written permission. .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .\" @(#)gethostbyname.3 6.12 (Berkeley) 6/23/90 .\" .TH GETHOSTBYNAME 3 "June 23, 1990" .UC 5 .SH NAME g_h_b_n, gethostbyname, gethostbyaddr, gethostent, sethostent, endhostent, herror \- get network host entry .SH SYNOPSIS .B "#include .PP .B "extern int h_errno; .PP .B "struct hostent *gethostbyname(name) .br .B "char *name; .PP .B "struct hostent *gethostbyaddr(addr, len, type) .br .B "char *addr; int len, type; .PP .B "struct hostent *gethostent() .PP .B "sethostent(stayopen) .br .B "int stayopen; .PP .B "endhostent() .PP .B "herror(string) .br .B "char *string; .PP .SH DESCRIPTION .I Gethostbyname and .I gethostbyaddr each return a pointer to an object with the following structure describing an internet host referenced by name or by address, respectively. This structure contains the information obtained from the name server. .PP .nf struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses from name server */ }; #define h_addr h_addr_list[0] /* address, for backward compatibility */ .ft R .ad .fi .PP The members of this structure are: .TP \w'h_addr_list'u+2n h_name Official name of the host. .TP \w'h_addr_list'u+2n h_aliases A zero terminated array of alternate names for the host. .TP \w'h_addr_list'u+2n h_addrtype The type of address being returned; currently always AF_INET. .TP \w'h_addr_list'u+2n h_length The length, in bytes, of the address. .TP \w'h_addr_list'u+2n h_addr_list A zero terminated array of network addresses for the host. Host addresses are returned in network byte order. .TP \w'h_addr_list'u+2n h_addr The first address in h_addr_list; this is for backward compatiblity. .PP When using the nameserver, .I gethostbyname will search for the named host in the current domain and its parents unless the name ends in a dot. If the name contains no dot, and if the environment variable ``HOSTALAIASES'' contains the name of an alias file, the alias file will first be searched for an alias matching the input name. See .IR hostname (7) for the domain search procedure and the alias file format. .PP .I Sethostent may be used to request the use of a connected TCP socket for queries. If the .I stayopen flag is non-zero, this sets the option to send all queries to the name server using TCP and to retain the connection after each call to .I gethostbyname or .IR gethostbyaddr . Otherwise, queries are performed using UDP datagrams. .PP .I Endhostent closes the TCP connection. .SH DIAGNOSTICS .PP Error return status from .I gethostbyname and .I gethostbyaddr is indicated by return of a null pointer. The external integer .IR h_errno may then be checked to see whether this is a temporary failure or an invalid or unknown host. The routine .I herror can be used to print an error message describing the failure. If its argument .I string is non-NULL, it is printed, followed by a colon and a space. The error message is printed with a trailing newline. .PP .IR h_errno can have the following values: .RS .IP HOST_NOT_FOUND \w'HOST_NOT_FOUND'u+2n No such host is known. .IP TRY_AGAIN \w'HOST_NOT_FOUND'u+2n This is usually a temporary error and means that the local server did not receive a response from an authoritative server. A retry at some later time may succeed. .IP NO_RECOVERY \w'HOST_NOT_FOUND'u+2n Some unexpected server failure was encountered. This is a non-recoverable error. .IP NO_DATA \w'HOST_NOT_FOUND'u+2n The requested name is valid but does not have an IP address; this is not a temporary error. This means that the name is known to the name server but there is no address associated with this name. Another type of request to the name server using this domain name will result in an answer; for example, a mail-forwarder may be registered for this domain. .RE .SH "SEE ALSO" resolver(3), hostname(7), nonamed(8), named(8) .SH BUGS All information is contained in a static area so it must be copied if it is to be saved. Only the Internet address format is currently understood. .\" @(#)getc.3s 6.2 (Berkeley) 5/14/86 .\" .TH GETC 3 "May 14, 1986" .AT 3 .SH NAME getc, getchar, fgetc, getw \- get character or word from stream .SH SYNOPSIS .nf .ft B #include int getc(FILE *\fIstream\fP) int getchar(void) int fgetc(FILE *\fIstream\fP) int getw(FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Getc returns the next character from the named input .IR stream . .PP .BR Getchar () is identical to .BR getc ( stdin ). .PP .B Fgetc behaves like .BR getc , but is a genuine function, not a macro; it may be used to save object text. .PP .B Getw returns the next .B int from the named input .IR stream . It returns the constant .SM .B EOF upon end of file or error, but since that is a good integer value, .B feof and .BR ferror (3) should be used to check the success of .BR getw . .B Getw assumes no special alignment in the file. .SH "SEE ALSO" .BR clearerr (3), .BR fopen (3), .BR putc (3), .BR gets (3), .BR scanf (3), .BR fread (3), .BR ungetc (3). .SH DIAGNOSTICS These functions return the integer constant .SM .B EOF at end of file, upon read error, or if an attempt is made to read a file not opened by .BR fopen . The end-of-file condition is remembered, even on a terminal, and all subsequent attempts to read will return .B EOF until the condition is cleared with .BR clearerr (3). .SH BUGS Because it is implemented as a macro, .B getc treats a .I stream argument with side effects incorrectly. In particular, `getc(*f++);' doesn't work sensibly. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getwd.3 6.2 (Berkeley) 5/12/86 .\" .TH GETCWD 3 "May 12, 1986" .UC 5 .SH NAME getcwd \- get current working directory pathname .SH SYNOPSIS .nf .ft B #include char *getcwd(char *\fIpathname\fP, size_t \fIlen\fP) .fi .SH DESCRIPTION .B Getcwd copies the absolute pathname of the current working directory to .I pathname and returns a pointer to the result. .I Pathname is a character array of length .IR len . .SH DIAGNOSTICS .B Getcwd returns a null pointer and sets .B errno if an error occurs. The error will reflect the system call errors that may occur if the path to the current directory is searched upwards to the root directory. The error .B ERANGE is returned if the result does not fit within .I len bytes. .\" @(#)getenv.3 6.1 (Berkeley) 5/15/85 .\" .TH GETENV 3 "May 15, 1985" .AT 3 .SH NAME getenv \- value for environment name .SH SYNOPSIS .nf .ft B #include char *getenv(const char *\fIname\fP) .ft R .fi .SH DESCRIPTION .B Getenv searches the environment list (see .BR environ (7)) for a string of the form .IB name = value and returns a pointer to the string .I value if such a string is present, otherwise .B getenv returns the null pointer. .SH SEE ALSO .BR environ (7), .BR execve (2). .TH GETGRENT 3 .SH NAME getgrent, getgrnam, getgrgid, setgrent, endgrent, setgrfile \- group file routines .SH SYNOPSIS .ft B .nf #include struct group *getgrent(void) struct group *getgrnam(const char *\fIname\fP) struct group *getgrgid(gid_t \fIgid\fP) int setgrent(void) void endgrent(void) void setgrfile(const char *\fIfile\fP) .fi .ft P .SH DESCRIPTION These functions are used to obtain information from the group file. They return this information in a .B struct group as defined by : .PP .nf .ta +4n +6n +15n struct group { char *gr_name; /* login name */ char *gr_passwd; /* encrypted password */ gid_t gr_gid; /* numeric group id */ char **gr_mem; /* null-terminated list of group members */ }; .fi .PP .B Getgrent() reads the group file entry by entry. .B Getgrnam() scans the entire group file for the group with the given .IR name . .B Getgrgid() looks for the first group with the given .IR gid . The .B setgrent() and .B endgrent() functions are used to open and later close the group file. With .B setgrfile() one can specify the file to read other than the normal group file. This only sets the name, the next .B setgrent() call will open the file. Do not touch the file name while it is active. Use .B setgrfile(NULL) to revert back to the normal group file. .PP The usual way to scan the group file is (error checking omitted): .PP .RS .nf .DT setgrent(); while ((gr = getgrent()) != NULL) if (appropriate_test(gr)) break; endgrent(); .fi .RE .PP The .B gr variable contains the entry that is wanted if non-NULL. The .B getgrnam() and .B getgrgid() functions are implemented as in this example, with error checking of course. .PP .B Getgrent() calls .B setgrent() if this has not yet been done. .B Setgrent() first calls .B endgrent() if the group file is still open. (Other implementations may simply rewind the file.) .SH FILES .TP 15 .B /etc/group The group file database. .SH "SEE ALSO" .BR getgroups (2), .BR initgroups (3), .BR getpwent (3), .BR passwd (5). .SH DIAGNOSTICS .B Setgrent() has the same return value and error codes as the .BR open (2) call it uses to open the group file. The .BI get xxx () functions return NULL on end of file, entry not found, or error. You can set .B errno to zero before the call and check it after. .SH NOTES All .BI get xxx () routines return a pointer to static storage that is overwritten in each call. .PP Only .B getgrnam() and .B getgrgid() are defined by \s-2POSIX\s+2. The .B _MINIX_SOURCE macro must be defined before including to make the other functions visible. The .B gr_passwd field is also not defined by \s-2POSIX\s+2, but is always visible. Portable code cannot reliably detect errors by setting .B errno to zero. Under Minix it is better to make a .B getgrent() scan if you need to look up several group-id's or names, but portable code had better use several .B getgrgid() or .B getgrnam() calls. The .B getgrent() is usually available on other systems, but may be very expensive. See .BR initgroups (3) if you are after supplementary group id's. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: getgrent.3,v 1.2 1996/04/11 06:35:01 philip Exp $ .\" @(#)getlogin.3 6.2 (Berkeley) 5/9/86 .\" .TH GETLOGIN 3 "May 9, 1986" .AT 3 .SH NAME getlogin \- get login name .SH SYNOPSIS .nf .ft B #include char *getlogin(void) .fi .SH DESCRIPTION .B Getlogin returns a pointer to the login name as found in .BR /etc/utmp . It may be used in conjunction with .B getpwnam to locate the correct password file entry when the same user ID is shared by several login names. .PP If .B getlogin is called within a process that is not attached to a terminal, or if there is no entry in .B /etc/utmp for the process's terminal, .B getlogin returns a null pointer. A reasonable procedure for determining the login name is to first call .B getlogin and if it fails, to call .BR getpwuid ( getuid ()). .SH FILES /etc/utmp .SH "SEE ALSO" .BR getpwent (3), .BR utmp (5), .BR ttyslot (3) .SH DIAGNOSTICS Returns a null pointer if the name cannot be found. .SH BUGS The return values point to static data whose content is overwritten by each call. .\" Copyright (c) 1985 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getopt.3 6.4 (Berkeley) 5/27/86 .\" .TH GETOPT 3 "May 27, 1986" .UC 6 .SH NAME getopt \- get option letter from argv .SH SYNOPSIS .ft B int getopt(argc, argv, optstring) .br int argc; .br char **argv; .br char *optstring; .sp extern char *optarg; .br extern int optind; .ft .SH DESCRIPTION .I Getopt returns the next option letter in .I argv that matches a letter in .IR optstring . .I Optstring is a string of recognized option letters; if a letter is followed by a colon, the option is expected to have an argument that may or may not be separated from it by white space. .I Optarg is set to point to the start of the option argument on return from .IR getopt . .PP .I Getopt places in .I optind the .I argv index of the next argument to be processed. Because .I optind is external, it is normally initialized to zero automatically before the first call to .IR getopt . .PP When all options have been processed (i.e., up to the first non-option argument), .I getopt returns .BR EOF . The special option .B \-\- may be used to delimit the end of the options; .B EOF will be returned, and .B \-\- will be skipped. .SH DIAGNOSTICS .I Getopt prints an error message on .I stderr and returns a question mark .RB ( ? ) when it encounters an option letter not included in .IR optstring . .SH EXAMPLE The following code fragment shows how one might process the arguments for a command that can take the mutually exclusive options .B a and .BR b , and the options .B f and .BR o , both of which require arguments: .PP .RS .nf main(argc, argv) int argc; char **argv; { int c; extern int optind; extern char *optarg; \&. \&. \&. while ((c = getopt(argc, argv, "abf:o:")) != EOF) switch (c) { case `a': if (bflg) errflg++; else aflg++; break; case `b': if (aflg) errflg++; else bproc(); break; case `f': ifile = optarg; break; case `o': ofile = optarg; break; case `?': default: errflg++; break; } if (errflg) { fprintf(stderr, "Usage: ..."); exit(2); } for (; optind < argc; optind++) { \&. \&. \&. } \&. \&. \&. } .RE .SH HISTORY Written by Henry Spencer, working from a Bell Labs manual page. Modified by Keith Bostic to behave more like the System V version. .SH BUGS It is not obvious how `\-' standing alone should be treated; this version treats it as a non-option argument, which is not always right. .PP Option arguments are allowed to begin with `\-'; this is reasonable but reduces the amount of error checking possible. .PP .I Getopt is quite flexible but the obvious price must be paid: there is much it could do that it doesn't, like checking mutually exclusive options, checking type of option arguments, etc. .\" @(#)getpass.3 6.1 (Berkeley) 5/15/85 .\" .TH GETPASS 3 "May 15, 1985" .AT 3 .SH NAME getpass \- read a password .SH SYNOPSIS .nf .ft B #include char *getpass(const char *\fIprompt\fP) .fi .SH DESCRIPTION .B Getpass reads a password from the file .BR /dev/tty , or if that cannot be opened, from the standard input, after prompting with the null-terminated string .I prompt and disabling echoing. A pointer is returned to a null-terminated string of at most 32 characters, excluding the null. .SH "SEE ALSO" .BR crypt (3). .SH BUGS The return value points to static data whose content is overwritten by each call. .TH GETPWENT 3 .SH NAME getpwent, getpwnam, getpwuid, setpwent, endpwent, setpwfile \- password file routines .SH SYNOPSIS .ft B .nf #include struct passwd *getpwent(void) struct passwd *getpwnam(const char *\fIname\fP) struct passwd *getpwuid(uid_t \fIuid\fP) int setpwent(void) void endpwent(void) void setpwfile(const char *\fIfile\fP) .fi .ft P .SH DESCRIPTION These functions are used to obtain information from the password file. They return this information in a .B struct passwd as defined by : .PP .nf .ta +4n +6n +15n struct passwd { char *pw_name; /* login name */ char *pw_passwd; /* encrypted password */ uid_t pw_uid; /* numeric user id */ gid_t pw_gid; /* numeric group id */ char *pw_gecos; /* user full name and other info */ char *pw_dir; /* user's home directory */ char *pw_shell; /* name of the user's shell */ }; .fi .PP .B Getpwent() reads the password file entry by entry. .B Getpwnam() scans the entire password file for the user with the given .IR name . .B Getpwuid() looks for the first user with the given .IR uid . The .B setpwent() and .B endpwent() functions are used to open and later close the password file. With .B setpwfile() one can specify the file to read other than the normal password file. This only sets the name, the next .B setpwent() call will open the file. Do not touch the file name while it is active. Use .B setpwfile(NULL) to revert back to the normal password file. .PP The usual way to scan the password file is (error checking omitted): .PP .RS .nf .DT setpwent(); while ((pw = getpwent()) != NULL) if (appropriate_test(pw)) break; endpwent(); .fi .RE .PP The .B pw variable contains the entry that is wanted if non-NULL. The .B getpwnam() and .B getpwuid() functions are implemented as in this example, with error checking of course. .PP .B Getpwent() calls .B setpwent() if this has not yet been done. .B Setpwent() first calls .B endpwent() if the password file is still open. (Other implementations may simply rewind the file.) .SH FILES .TP 15 .B /etc/passwd The password file database. .SH "SEE ALSO" .BR cuserid (3), .BR getlogin (3), .BR getgrent (3), .BR passwd (5). .SH DIAGNOSTICS .B Setpwent() has the same return value and error codes as the .BR open (2) call it uses to open the password file. The .BI get xxx () functions return NULL on end of file, entry not found, or error. You can set .B errno to zero before the call and check it after. .SH NOTES All .BI get xxx () routines return a pointer to static storage that is overwritten in each call. .PP Only .B getpwnam() and .B getpwuid() are defined by \s-2POSIX\s+2. The .B _MINIX_SOURCE macro must be defined before including to make the other functions visible. The .B pw_passwd and .B pw_gecos fields are also not defined by \s-2POSIX\s+2, but are always visible. Portable code cannot reliably detect errors by setting .B errno to zero. Under Minix it is better to make a .B getpwent() scan if you need to look up several user-id's or names, but portable code had better use several .B getpwuid() or .B getpwnam() calls. The .B getpwent() is usually available on other systems, but may be very expensive. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: getpwent.3,v 1.2 1996/04/11 06:37:43 philip Exp $ .\" @(#)gets.3s 6.1 (Berkeley) 5/15/85 .\" .TH GETS 3 "May 15, 1985" .AT 3 .SH NAME gets, fgets \- get a string from a stream .SH SYNOPSIS .nf .ft B #include char *gets(char *\fIs\fP) char *fgets(char *\fIs\fP, int \fIn\fP, FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Gets reads a string into .I s from the standard input stream .BR stdin . The string is terminated by a newline character, which is replaced in .I s by a null character. .B Gets returns its argument. .PP .B Fgets reads .IR n \-1 characters, or up through a newline character, whichever comes first, from the .I stream into the string .IR s . The last character read into .I s is followed by a null character. .B Fgets returns its first argument. .SH "SEE ALSO" .BR puts (3), .BR getc (3), .BR scanf (3), .BR fread (3), .BR ferror (3). .SH DIAGNOSTICS .B Gets and .B fgets return the constant pointer .SM .B NULL upon end of file or error. .SH BUGS .B Gets deletes a newline, .B fgets keeps it, all in the name of backward compatibility. .PP .B Gets is not present in the Minix-vmd C library for reasons that should be obvious. Use .B fgets instead. .TH GETTTYENT 3 .SH NAME getttyent, getttynam, setttyent, endttyent \- interface to /etc/ttytab .SH SYNOPSIS .ft B .nf #include struct ttyent *getttyent(void) struct ttyent *getttynam(const char *\fIname\fP) int setttyent(void) void endttyent(void) .fi .ft P .SH DESCRIPTION The .B getttyent functions provide an interface to the /etc/ttytab. (See .BR ttytab (5)). .PP To read one of these files one calls .B getttyent() several times to read the entries in the table until NULL is returned for end-of-file. .PP .B Getttyname() searches the .B ttytab file for the given terminal device. It is equivalent to a call to .BR setttyent(), several calls to .B getttyent() to locate the entry, and a final .B endttyent() to close the file. .PP .B Setttyent() opens or rewinds the ttytab database, and .B endttyent() closes it. .B Getttyent() opens the database if not already open, but does not close it. .PP The struct ttyent is defined by as follows: .sp .nf .ta +4n +6n +15n struct ttyent { char *ty_name; /* Name of the terminal device. */ char *ty_type; /* Terminal type name (termcap(3)). */ char **ty_getty; /* Program to run, normally getty. */ char **ty_init; /* Initialization command, normally stty. */ }; .fi .PP A valid entry has at least two strings, so both .B ty_name and .B ty_type are filled in. The optional .B ty_getty and .B ty_init may be NULL (field omitted), point to a pointer that is NULL (null lenght field, i.e. ""), or an array of strings terminated by a NULL (field present). For now no useful distinction can be made between a omitted field and an empty field, so treat both cases as an omission. .SH FILES .TP 15 .B /etc/ttytab The terminal device database .SH "SEE ALSO" .BR ttyname (3), .BR ttyslot (3), .BR ttytab (5), .BR init (8). .SH DIAGNOSTICS .B Setttyent() has the same return value and error codes as the .BR open (2) call it uses to open the ttytab file. The .BI get xxx () functions return NULL on end of file, entry not found, or error. You can set .B errno to zero before the call and check it after. .SH NOTES .B Getttyent() and .B getttynam() return a pointer to static storage that is overwritten in each call. .PP The Minix .B struct ttyent has only the .B ty_name and .B ty_type fields in common with the BSD implementation. This does not seem to be a problem, because most third party software that need to know about terminals only look at the .B ty_name field. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: getttyent.3,v 1.2 1996/04/11 06:57:26 philip Exp $ .TH HTON 3 .SH NAME hton, htons, htonl, ntohs, ntohl \- host to network byte order conversion .SH SYNOPSIS .ft B .nf #define _MINIX_SOURCE 1 #include #include #include u16_t htons(u16_t \fIhost_word\fP) u32_t htonl(u32_t \fIhost_dword\fP) u16_t ntohs(u16_t \fInetwork_word\fP) u32_t ntohl(u32_t \fInetwork_dword\fP) u16_t HTONS(u16_t \fIhost_word\fP) u32_t HTONL(u32_t \fIhost_dword\fP) u16_t NTOHS(u16_t \fInetwork_word\fP) u32_t NTOHL(u32_t \fInetwork_dword\fP) .fi .ft R .SH DESCRIPTION These macros convert 16-bit and 32-bit quantities to and from the network byte order used by the TCP/IP protocols. The function of the macros is encoded in their name. .B H means host byte order, .B n means network byte order, .B s means a 16-bit quantity and .B l means a 32-bit quantity. Thus .B htons converts a 16-bit quantity from host byte order to network byte order. The difference between the lower case and upper case variants is that the lower case variants evaluate the argument at most once and the upper case variants can be used for constant folding. That is, .PP .RS htonl(f(x)) .RE .PP will call f(x) at most once and .PP .RS HTONS(0x10) .RE .PP will be equivalent to 0x10 on a big-endian machine and 0x1000 on a little-endian machine. .SH "SEE ALSO" .BR ip (4). .SH AUTHOR Philip Homburg (philip@cs.vu.nl) .\" .\" $PchId: hton.3,v 1.3 1996/02/22 21:10:01 philip Exp $ .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)malloc.3 6.3 (Berkeley) 5/14/86 .\" .TH MALLOC 3 "May 14, 1986" .UC 4 .SH NAME malloc, free, realloc, calloc, alloca \- memory allocator .SH SYNOPSIS .nf .ft B #include #include #include void *malloc(size_t \fIsize\fP) void free(void *\fIptr\fP) void *realloc(void *\fIptr\fP, size_t \fIsize\fP) void *calloc(size_t \fInelem\fP, size_t \fIelsize\fP) void *alloca(size_t \fIsize\fP) .ft R .fi .SH DESCRIPTION .B Malloc and .B free provide a general-purpose memory allocation package. .B Malloc returns a pointer to a block of at least .I size bytes beginning on a word boundary. .PP The argument to .B free is a pointer to a block previously allocated by .BR malloc ; this space is made available for further allocation, but its contents are left undisturbed. A call with a null .I ptr is legal and does nothing. .PP Needless to say, grave disorder will result if the space assigned by .B malloc is overrun or if some random number is handed to .BR free . .PP .B Malloc maintains multiple lists of free blocks according to size, allocating space from the appropriate list. It calls .B sbrk (see .BR brk (2)) to get more memory from the system when there is no suitable space already free. .PP .B Realloc changes the size of the block pointed to by .I ptr to .I size bytes and returns a pointer to the (possibly moved) block. The contents will be unchanged up to the lesser of the new and old sizes. A call with a null .I ptr is legal and has the same result as .BI malloc( size )\fR. .PP .B Calloc allocates space for an array of .I nelem elements of size .I elsize. The space is initialized to zeros. .PP .B Alloca allocates .I size bytes of space in the stack frame of the caller. This temporary space is automatically freed on return. .PP Each of the allocation routines returns a pointer to space suitably aligned (after possible pointer coercion) for storage of any type of object. .SH SEE ALSO .BR brk (2). .SH DIAGNOSTICS .BR Malloc , .BR realloc and .B calloc return a null pointer if there is no available memory or if the arena has been detectably corrupted by storing outside the bounds of a block. .SH NOTES Other implementations of .BR malloc , .BR realloc or .BR calloc may return a null pointer if the size of the requested block is zero. This implementation will always return a zero length block at a unique address, but you should keep in mind that a null return is possible if the program is run to another system and that this should not be mistakenly seen as an error. .SH BUGS When .B realloc returns a null pointer, the block pointed to by .I ptr may be destroyed. .PP .B Alloca is machine dependent; its use is discouraged. .TH ONEC_SUM 3 .SH NAME oneC_sum \- One's complement internet checksum .SH SYNOPSIS .ft B .nf #define _MINIX_SOURCE 1 #include #include #include u16_t oneC_sum(u16_t \fIprev\fP, void *\fIdata\fP, size_t \fIsize\fP) .fi .ft R .SH DESCRIPTION .B OneC_sum is used to calculate the one's complement checksum needed for IP network packets. A good document about the Internet Checksum is RFC-1071 (Computing the Internet checksum). .PP .B OneC_sum expects three parameters: .TP 10 .I prev The checksum of previous blocks of data that are to be included in the checksum. The value of prev in first call to oneC_sum should be 0. .TP .I data A pointer to the block of data. The data is interpreted as a series of 16 bit numbers in network byte order, but an odd number of bytes is also allowed. .TP .I size The size of the data in bytes. .SH "SEE ALSO" .BR ip (4). .br .B RFC-1071 .SH AUTHOR Philip Homburg (philip@cs.vu.nl) .\" .\" $PchId: oneC_sum.3,v 1.3 1996/02/22 21:05:31 philip Exp $ .\" @(#)popen.3 6.1 (Berkeley) 5/15/85 .\" .TH POPEN 3 "May 15, 1985" .AT 3 .SH NAME popen, pclose \- initiate I/O to/from a process .SH SYNOPSIS .nf .ft B #include FILE *popen(const char *command, const char *type) int pclose(FILE *stream) .SH DESCRIPTION The arguments to .B popen are pointers to null-terminated strings containing respectively a shell command line and an I/O mode, either "r" for reading or "w" for writing. It creates a pipe between the calling process and the command to be executed. The value returned is a stream pointer that can be used (as appropriate) to write to the standard input of the command or read from its standard output. .PP A stream opened by .B popen should be closed by .BR pclose , which waits for the associated process to terminate and returns the exit status of the command. .PP Because open files are shared, a type "r" command may be used as an input filter, and a type "w" as an output filter. .SH "SEE ALSO" .BR pipe (2), .BR fopen (3), .BR fclose (3), .BR system (3), .BR wait (2), .BR sh (1). .SH DIAGNOSTICS .B Popen returns a null pointer if files or processes cannot be created, or the shell cannot be accessed. .SH BUGS Buffered reading before opening an input filter may leave the standard input of that filter mispositioned. Similar problems with an output filter may be forestalled by careful buffer flushing, for instance, with .BR fflush , see .BR fclose (3). .\" @(#)printf.3s 6.3 (Berkeley) 6/5/86 .\" .TH PRINTF 3 "June 5, 1986" .AT 3 .SH NAME printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf \- formatted output conversion .SH SYNOPSIS .nf .ft B #include #include #include int printf(const char *\fIformat\fP \fR[\fP, \fIarg\fP\fR] ...\fP); int fprintf(FILE *\fIstream\fP, const char *\fIformat\fP \fR[\fP, \fIarg\fP\fR] ...\fP); int sprintf(char *\fIs\fP, const char *\fIformat\fP \fR[\fP, \fIarg\fP\fR] ...\fP); int snprintf(char *\fIs\fP, size_t \fIn\fP, const char *\fIformat\fP \fR[\fP, \fIarg\fP\fR] ...\fP); int vprintf(const char *\fIformat\fP, va_list \fIargs\fP); int vfprintf(FILE *\fIstream\fP, const char *\fIformat\fP, va_list \fIargs\fP); int vsprintf(char *\fIs\fP, const char *\fIformat\fP, va_list \fIargs\fP); int vsnprintf(char *\fIs\fP, size_t \fIn\fP, const char *\fIformat\fP, va_list \fIargs\fP); .ft R .fi .SH DESCRIPTION .B Printf places output on the standard output stream .BR stdout . .B Fprintf places output on the named output .IR stream . .B Sprintf places `output' in the string .IR s , followed by the character `\e0'. .B Snprintf (Minix-vmd only) is like .B sprintf except that no more than .IR n \-1 characters are written to .I s followed by a `\e0'. .PP The .B v*printf functions can be used to make functions like the first four by using the .BR stdarg (3) method to process the argument. .PP Each of these functions converts, formats, and prints its arguments after the first under control of the first argument. The first argument is a character string which contains two types of objects: plain characters, which are simply copied to the output stream, and conversion specifications, each of which causes conversion and printing of the next successive .IR arg . .PP Each conversion specification is introduced by the character .BR % . The remainder of the conversion specification includes in the following order .TP \(bu Zero or more of following flags: .RS .TP \(bu a `#' character specifying that the value should be converted to an ``alternate form''. For .BR c , .BR d , .BR s , and .BR u conversions, this option has no effect. For .B o conversions, the precision of the number is increased to force the first character of the output string to a zero. For .BR x ( X ) conversion, a non-zero result has the string .BR 0x ( 0X ) prepended to it. For .BR e , .BR E , .BR f , .BR g , and .BR G conversions, the result will always contain a decimal point, even if no digits follow the point (normally, a decimal point only appears in the results of those conversions if a digit follows the decimal point). For .B g and .B G conversions, trailing zeros are not removed from the result as they would otherwise be. .TP \(bu a minus sign `\-' which specifies .I "left adjustment" of the converted value in the indicated field; .TP \(bu a `+' character specifying that there should always be a sign placed before the number when using signed conversions. .TP \(bu a space specifying that a blank should be left before a positive number during a signed conversion. A `+' overrides a space if both are used. .RE .TP \(bu an optional digit string specifying a .I "field width;" if the converted value has fewer characters than the field width it will be blank-padded on the left (or right, if the left-adjustment indicator has been given) to make up the field width; if the field width begins with a zero, zero-padding will be done instead of blank-padding; .TP \(bu an optional period .RB ` . ' which serves to separate the field width from the next digit string; .TP \(bu an optional digit string specifying a .I precision which specifies the number of digits to appear after the decimal point, for e- and f-conversion, or the maximum number of characters to be printed from a string; .TP \(bu the character .B l specifying that a following .BR d , .BR o , .BR x , or .B u corresponds to a long integer .IR arg . .TP \(bu a character which indicates the type of conversion to be applied. .PP A field width or precision may be `*' instead of a digit string. In this case an integer .I arg supplies the field width or precision. .PP The conversion characters and their meanings are .TP .B dox The integer .I arg is converted to decimal, octal, or hexadecimal notation respectively. .TP .B X Like .BR x , but use upper case instead of lower case. .TP .B f The float or double .I arg is converted to decimal notation in the style `[\fB\-\fR]ddd.ddd' where the number of d's after the decimal point is equal to the precision specification for the argument. If the precision is missing, 6 digits are given; if the precision is explicitly 0, no digits and no decimal point are printed. .TP .B e The float or double .I arg is converted in the style `[\fB\-\fR]d\fB.\fRddd\fBe\fR\(+-dd' where there is one digit before the decimal point and the number after is equal to the precision specification for the argument; when the precision is missing, 6 digits are produced. .TP .B g The float or double .I arg is printed in style .BR d , in style .BR f , or in style .BR e , whichever gives full precision in minimum space. .TP .B c The character .I arg is printed. .TP .B s .I Arg is taken to be a string (character pointer) and characters from the string are printed until a null character or until the number of characters indicated by the precision specification is reached; however if the precision is 0 or missing all characters up to a null are printed. .TP .B u The unsigned integer .I arg is converted to decimal and printed. .TP .B % Print a `%'; no argument is converted. .PP In no case does a non-existent or small field width cause truncation of a field; padding takes place only if the specified field width exceeds the actual width. Characters generated by .B printf are printed by .BR putc (3). .PP .B Examples .br To print a date and time in the form `Sunday, July 3, 10:02', where .I weekday and .I month are pointers to null-terminated strings: .PP .RS printf("%s, %s %d, %02d:%02d", weekday, month, day, hour, min); .RE .PP To print .if n pi .if t \(*p to 5 decimals: .IP printf("pi = %.5f", 4*atan(1.0)); .SH "SEE ALSO" .BR putc (3), .BR scanf (3), .BR ecvt (3), .BR stdarg (3). .\" @(#)putc.3s 6.2 (Berkeley) 11/6/85 .\" .TH PUTC 3 "November 6, 1985" .AT 3 .SH NAME putc, putchar, fputc, putw \- put character or word on a stream .SH SYNOPSIS .nf .ft B #include int putc(int \fIc\fP, FILE *\fIstream\fP) int putchar(int \fIc\fP) int fputc(int \fIc\fP, FILE *\fIstream\fP) int putw(int \fIw\fP, FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Putc appends the character .I c to the named output .IR stream . It returns the character written. .PP .BI Putchar( c ) is defined as .BI putc( c ", stdout)\fR." .PP .B Fputc behaves like .BR putc , but is a genuine function rather than a macro. .PP .B Putw appends word (that is, .BR int ) .I w to the output .IR stream . It returns the word written. .B Putw neither assumes nor causes special alignment in the file. .SH "SEE ALSO" .BR fopen (3), .BR fclose (3), .BR getc (3), .BR puts (3), .BR printf (3), .BR fread (3). .SH DIAGNOSTICS These functions return the constant .SM .B EOF upon error. Since this is a good integer, .BR ferror (3) should be used to detect .B putw errors. .SH BUGS Because it is implemented as a macro, .B putc treats a .I stream argument with side effects improperly. In particular `putc(c,\ *f++);' doesn't work sensibly. .PP Errors can occur long after the call to .BR putc . .\" @(#)puts.3s 6.1 (Berkeley) 5/15/85 .\" .TH PUTS 3 "May 15, 1985" .AT 3 .SH NAME puts, fputs \- put a string on a stream .SH SYNOPSIS .nf .ft B #include int puts(char *\fIs\fP) int fputs(char *\fIs\fP, FILE *\fIstream\fP) .ft P .fi .SH DESCRIPTION .B Puts copies the null-terminated string .I s to the standard output stream .B stdout and appends a newline character. .PP .B Fputs copies the null-terminated string .I s to the named output .IR stream . .PP Neither routine copies the terminal null character. .SH "SEE ALSO" .BR fopen (3), .BR gets (3), .BR putc (3), .BR printf (3), .BR ferror (3), .BR fread (3). .SH BUGS .B Puts appends a newline, .B fputs does not, all in the name of backward compatibility. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)qsort.3 6.1 (Berkeley) 5/15/85 .\" .TH QSORT 3 "May 15, 1985" .UC 4 .SH NAME qsort \- quicker sort .SH SYNOPSIS .nf .ft B #include #include .fi .in +.5i .ti -.5i void qsort(void *\fIbase\fP, size_t \fInel\fP, size_t \fIwidth\fP, int (*\fIcompar\fP)(const void *, const void *)) .in -.5i .ft R .SH DESCRIPTION .B Qsort is an implementation of the quicker-sort algorithm. The first argument is a pointer to the base of the data; the second is the number of elements; the third is the width of an element in bytes; the last is the name of the comparison routine to be called with two arguments which are pointers to the elements being compared. The routine must return an integer less than, equal to, or greater than 0 according as the first argument is to be considered less than, equal to, or greater than the second. .SH "SEE ALSO" .BR sort (1). .\" @(#)rand.3c 6.2 (Berkeley) 9/29/85 .\" .TH RAND 3 "September 29, 1985" .AT 3 .SH NAME rand, srand \- random number generator .SH SYNOPSIS .nf .ft B #include void srand(unsigned \fIseed\fP) unsigned rand(void) .ft R .fi .SH DESCRIPTION .B Rand uses a multiplicative congruential random number generator with period .if t 2\u\s732\s0\d .if n 2**32 to return successive pseudo-random numbers in the range from 0 to .BR RAND_MAX . .PP The generator is reinitialized by calling .B srand with 1 as argument. It can be set to a random starting point by calling .B srand with whatever you like as argument. .SH "SEE ALSO" .BR random (3). .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)random.3 6.2 (Berkeley) 9/29/85 .\" .TH RANDOM 3 "September 29, 1985" .UC 5 .SH NAME random, srandom, initstate, setstate \- better random number generator; routines for changing generators .SH SYNOPSIS .nf .ft B #include long random(void) void srandom(unsigned \fIseed\fP) char *initstate(unsigned \fIseed\fP, char *\fIstate\fP, int \fIn\fP) char *setstate(char *\fIstate\fP) .ft R .fi .SH DESCRIPTION .PP .B Random uses a non-linear additive feedback random number generator employing a default table of size 31 long integers to return successive pseudo-random numbers in the range from 0 to .if t 2\u\s731\s10\d\(mi1. .if n (2**31)\(mi1. The period of this random number generator is very large, approximately .if t 16\(mu(2\u\s731\s10\d\(mi1). .if n 16*((2**31)\(mi1). .PP .B Random/srandom have (almost) the same calling sequence and initialization properties as .B rand/srand. The difference is that .BR rand (3) produces a much less random sequence \(em in fact, the low dozen bits generated by rand go through a cyclic pattern. All the bits generated by .B random are usable. For example, ``random()&01'' will produce a random binary value. .PP Unlike .BR srand , .B srandom does not return the old seed; the reason for this is that the amount of state information used is much more than a single word. (Two other routines are provided to deal with restarting/changing random number generators). Like .BR rand (3), however, .B random will by default produce a sequence of numbers that can be duplicated by calling .B srandom with .B 1 as the seed. .PP The .B initstate routine allows a state array, passed in as an argument, to be initialized for future use. The size of the state array (in bytes) is used by .B initstate to decide how sophisticated a random number generator it should use -- the more state, the better the random numbers will be. (Current "optimal" values for the amount of state information are 8, 32, 64, 128, and 256 bytes; other amounts will be rounded down to the nearest known amount. Using less than 8 bytes will cause an error). The seed for the initialization (which specifies a starting point for the random number sequence, and provides for restarting at the same point) is also an argument. .B Initstate returns a pointer to the previous state information array. .PP Once a state has been initialized, the .B setstate routine provides for rapid switching between states. .B Setstate returns a pointer to the previous state array; its argument state array is used for further random number generation until the next call to .B initstate or .BR setstate . .PP Once a state array has been initialized, it may be restarted at a different point either by calling .B initstate (with the desired seed, the state array, and its size) or by calling both .B setstate (with the state array) and .B srandom (with the desired seed). The advantage of calling both .B setstate and .B srandom is that the size of the state array does not have to be remembered after it is initialized. .PP With 256 bytes of state information, the period of the random number generator is greater than .if t 2\u\s769\s10\d, .if n 2**69 which should be sufficient for most purposes. .SH AUTHOR Earl T. Cohen .SH DIAGNOSTICS .PP If .B initstate is called with less than 8 bytes of state information, or if .B setstate detects that the state information has been garbled, error messages are printed on the standard error output. .SH "SEE ALSO" .BR rand (3). .SH NOTES .B initstate and .B setstate are not declared in .IR , programmers must provide their own declarations. .SH BUGS About 2/3 the speed of .BR rand (3). .\" Copyright (c) 1985 The Regents of the University of California. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms are permitted provided .\" that: (1) source distributions retain this entire copyright notice and .\" comment, and (2) distributions including binaries display the following .\" acknowledgement: ``This product includes software developed by the .\" University of California, Berkeley and its contributors'' in the .\" documentation or other materials provided with the distribution and in .\" all advertising materials mentioning features or use of this software. .\" Neither the name of the University nor the names of its contributors may .\" be used to endorse or promote products derived from this software without .\" specific prior written permission. .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .\" @(#)resolver.3 6.5 (Berkeley) 6/23/90 .\" .TH RESOLVER 3 "June 23, 1990" .UC 4 .SH NAME resolver, res_query, res_search, res_mkquery, res_send, res_init, dn_comp, dn_expand \- resolver routines .SH SYNOPSIS .B #include .br .B #include .br .B #include .br .B #include .PP .B "res_query(dname, class, type, answer, anslen)" .br .B char *dname; .br .B int class, type; .br .B u_char *answer; .br .B int anslen; .PP .B "res_search(dname, class, type, answer, anslen)" .br .B char *dname; .br .B int class, type; .br .B u_char *answer; .br .B int anslen; .PP .B "res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)" .br .B int op; .br .B char *dname; .br .B int class, type; .br .B char *data; .br .B int datalen; .br .B struct rrec *newrr; .br .B char *buf; .br .B int buflen; .PP .B res_send(msg, msglen, answer, anslen) .br .B char *msg; .br .B int msglen; .br .B char *answer; .br .B int anslen; .PP .B res_init() .PP .B dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr) .br .B char *exp_dn, *comp_dn; .br .B int length; .br .B char **dnptrs, **lastdnptr; .PP .B dn_expand(msg, eomorig, comp_dn, exp_dn, length) .br .B char *msg, *eomorig, *comp_dn, exp_dn; .br .B int length; .SH DESCRIPTION These routines are used for making, sending and interpreting query and reply messages with Internet domain name servers. .PP Global configuration and state information that is used by the resolver routines is kept in the structure .IR _res . Most of the values have reasonable defaults and can be ignored. Options stored in .I _res.options are defined in .I resolv.h and are as follows. Options are stored as a simple bit mask containing the bitwise ``or'' of the options enabled. .IP RES_INIT True if the initial name server address and default domain name are initialized (i.e., .I res_init has been called). .IP RES_DEBUG Print debugging messages. .IP RES_AAONLY Accept authoritative answers only. With this option, .I res_send should continue until it finds an authoritative answer or finds an error. Currently this is not implemented. .IP RES_USEVC Use TCP connections for queries instead of UDP datagrams. .IP RES_STAYOPEN Used with RES_USEVC to keep the TCP connection open between queries. This is useful only in programs that regularly do many queries. UDP should be the normal mode used. .IP RES_IGNTC Unused currently (ignore truncation errors, i.e., don't retry with TCP). .IP RES_RECURSE Set the recursion-desired bit in queries. This is the default. (\c .I res_send does not do iterative queries and expects the name server to handle recursion.) .IP RES_DEFNAMES If set, .I res_search will append the default domain name to single-component names (those that do not contain a dot). This option is enabled by default. .IP RES_DNSRCH If this option is set, .I res_search will search for host names in the current domain and in parent domains; see .IR hostname (7). This is used by the standard host lookup routine .IR gethostbyname (3). This option is enabled by default. .PP The .I res_init routine reads the configuration file (if any; see .IR resolver (5)) to get the default domain name, search list and the Internet address of the local name server(s). If no server is configured, the host running the resolver is tried. The current domain name is defined by the hostname if not specified in the configuration file; it can be overridden by the environment variable LOCALDOMAIN. Initialization normally occurs on the first call to one of the following routines. .PP The .I res_query function provides an interface to the server query mechanism. It constructs a query, sends it to the local server, awaits a response, and makes preliminary checks on the reply. The query requests information of the specified .I type and .I class for the specified fully-qualified domain name .I dname . The reply message is left in the .I answer buffer with length .I anslen supplied by the caller. .PP The .I res_search routine makes a query and awaits a response like .IR res_query , but in addition, it implements the default and search rules controlled by the RES_DEFNAMES and RES_DNSRCH options. It returns the first successful reply. .PP The remaining routines are lower-level routines used by .IR res_query . The .I res_mkquery function constructs a standard query message and places it in .IR buf . It returns the size of the query, or \-1 if the query is larger than .IR buflen . The query type .I op is usually QUERY, but can be any of the query types defined in .IR . The domain name for the query is given by .IR dname . .I Newrr is currently unused but is intended for making update messages. .PP The .I res_send routine sends a pre-formatted query and returns an answer. It will call .I res_init if RES_INIT is not set, send the query to the local name server, and handle timeouts and retries. The length of the reply message is returned, or \-1 if there were errors. .PP The .I dn_comp function compresses the domain name .I exp_dn and stores it in .IR comp_dn . The size of the compressed name is returned or \-1 if there were errors. The size of the array pointed to by .I comp_dn is given by .IR length . The compression uses an array of pointers .I dnptrs to previously-compressed names in the current message. The first pointer points to to the beginning of the message and the list ends with NULL. The limit to the array is specified by .IR lastdnptr . A side effect of .I dn_comp is to update the list of pointers for labels inserted into the message as the name is compressed. If .I dnptr is NULL, names are not compressed. If .I lastdnptr is NULL, the list of labels is not updated. .PP The .I dn_expand entry expands the compressed domain name .I comp_dn to a full domain name The compressed name is contained in a query or reply message; .I msg is a pointer to the beginning of the message. The uncompressed name is placed in the buffer indicated by .I exp_dn which is of size .IR length . The size of compressed name is returned or \-1 if there was an error. .SH FILES /etc/resolv.conf see resolver(5) .SH "SEE ALSO" gethostbyname(3), named(8), resolver(5), hostname(7), .br RFC1032, RFC1033, RFC1034, RFC1035, RFC974, .br SMM:11 Name Server Operations Guide for BIND y#.\" @(#)scanf.3s 6.1 (Berkeley) 5/15/85 .\" .TH SCANF 3 "May 15, 1985" .AT 3 .SH NAME scanf, fscanf, sscanf, vscanf, vfscanf, vsscanf \- formatted input conversion .SH SYNOPSIS .nf .ft B #include #include int scanf(const char *\fIformat\fP \fR[\fP, \fIpointer\fP\fR] ...\fP) int fscanf(FILE *\fIstream\fP, const char *\fIformat\fP \fR[\fP, \fIpointer\fP\fR] ...\fP) int sscanf(const char *\fIs\fP, const char *\fIformat\fP \fR[\fP, \fIpointer\fP\fR] ...\fP) int vscanf(const char *\fIformat\fP, va_list \fIargs\fP) int vfscanf(FILE *\fIstream\fP, const char *\fIformat\fP, va_list \fIargs\fP) int vsscanf(const char *\fIs\fP, const char *\fIformat\fP, va_list \fIargs\fP) .SH DESCRIPTION .B Scanf reads from the standard input stream .BR stdin . .B Fscanf reads from the named input .IR stream . .B Sscanf reads from the character string .IR s . Each function reads characters, interprets them according to a format, and stores the results in its arguments. Each expects as arguments a control string .IR format , described below, and a set of .I pointer arguments indicating where the converted input should be stored. .PP The .B v*scanf functions can be used to make functions like the first three by using the .BR stdarg (3) method to process the argument pointers. .PP The control string usually contains conversion specifications, which are used to direct interpretation of input sequences. The control string may contain: .TP 4 1. Blanks, tabs or newlines, which match optional white space in the input. .TP 4 2. An ordinary character (not %) which must match the next character of the input stream. .TP 4 3. Conversion specifications, consisting of the character .BR % , an optional assignment suppressing character .BR * , an optional numerical maximum field width, and a conversion character. .PP A conversion specification directs the conversion of the next input field; the result is placed in the variable pointed to by the corresponding argument, unless assignment suppression was indicated by .BR * . An input field is defined as a string of non-space characters; it extends to the next inappropriate character or until the field width, if specified, is exhausted. .PP The conversion character indicates the interpretation of the input field; the corresponding pointer argument must usually be of a restricted type. The following conversion characters are legal: .TP 4 .B % a single `%' is expected in the input at this point; no assignment is done. .TP 4 .B d a decimal integer is expected; the corresponding argument should be an integer pointer. .TP 4 .B o an octal integer is expected; the corresponding argument should be a integer pointer. .TP 4 .B x a hexadecimal integer is expected; the corresponding argument should be an integer pointer. .ti -0.2i .TP 4 .B s a character string is expected; the corresponding argument should be a character pointer pointing to an array of characters large enough to accept the string and a terminating `\e0', which will be added. The input field is terminated by a space character or a newline. .TP 4 .B c a character is expected; the corresponding argument should be a character pointer. The normal skip over space characters is suppressed in this case; to read the next non-space character, try `%1s'. If a field width is given, the corresponding argument should refer to a character array, and the indicated number of characters is read. .TP 4 .B efg a floating point number is expected; the next field is converted accordingly and stored through the corresponding argument, which should be a pointer to a .BR float . The input format for floating point numbers is an optionally signed string of digits possibly containing a decimal point, followed by an optional exponent field consisting of an E or e followed by an optionally signed integer. .TP 4 .B [ indicates a string not to be delimited by space characters. The left bracket is followed by a set of characters and a right bracket; the characters between the brackets define a set of characters making up the string. If the first character is not circumflex (\|^\|), the input field is all characters until the first character not in the set between the brackets; if the first character after the left bracket is ^, the input field is all characters until the first character which is in the remaining set of characters between the brackets. The corresponding argument must point to a character array. .PP The conversion characters .BR d , .B o and .B x may be capitalized or preceded by .B l to indicate that a pointer to .B long rather than to .B int is in the argument list. Similarly, the conversion characters .BR e , .B f or .B g may be capitalized or preceded by .B l to indicate a pointer to .B double rather than to .BR float . The conversion characters .BR d , .B o and .B x may be preceded by .B h to indicate a pointer to .B short rather than to .BR int . .PP The .B scanf functions return the number of successfully matched and assigned input items. This can be used to decide how many input items were found. The constant .SM .B EOF is returned upon end of input; note that this is different from 0, which means that no conversion was done; if conversion was intended, it was frustrated by an inappropriate character in the input. .PP For example, the call .IP "\&" 10 int i; float x; char name[50]; .br scanf("%d%f%s", &i, &x, name); .PP with the input line .IP 25 54.32E\(mi1 thompson .PP will assign to .B i the value 25, .B x the value 5.432, and .B name will contain `\fBthompson\e0\fP' . Or, .IP int i; float x; char name[50]; .br scanf("%2d%f%*d%[1234567890]", &i, &x, name); .PP with input .IP 56789 0123 56a72 .PP will assign 56 to .BR i , 789.0 to .BR x , skip `0123', and place the string `56\e0' in .BR name . The next call to .B getchar will return `a'. .SH "SEE ALSO" .BR atof (3), .BR getc (3), .BR printf (3), .BR stdarg (3). .SH DIAGNOSTICS The .B scanf functions return .SM .B EOF on end of input, and a short count for missing or illegal data items. .SH BUGS The success of literal matches and suppressed assignments is not directly determinable. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)setbuf.3s 6.2 (Berkeley) 5/12/86 .\" .TH SETBUF 3 "May 12, 1986" .UC 4 .SH NAME setbuf, setvbuf \- assign buffering to a stream .SH SYNOPSIS .nf .ft B #include int setbuf(FILE *\fIstream\fP, char *\fIbuf\fP) int setvbuf(FILE *\fIstream\fP, char *\fIbuf\fP, int \fItype\fP, size_t \fIsize\fP) .SH DESCRIPTION The three types of buffering available are unbuffered, block buffered, and line buffered. When an output stream is unbuffered, information appears on the destination file or terminal as soon as written; when it is block buffered many characters are saved up and written as a block; when it is line buffered characters are saved up until a newline is encountered or input is read from stdin. .B Fflush (see .BR fclose (3)) may be used to force the block out early. Normally all files are block buffered. A buffer is obtained from .BR malloc (3) upon the first .B getc or .BR putc (3) on the file. If the standard stream .B stdout refers to a terminal it is line buffered. The standard stream .B stderr is always unbuffered. .PP .B Setbuf is used after a stream has been opened but before it is read or written. The character array .I buf is used instead of an automatically allocated buffer. If .I buf is the constant pointer .SM .BR NULL , input/output will be completely unbuffered. A manifest constant .SM .B BUFSIZ tells how big an array is needed: .IP .B char buf[BUFSIZ]; .PP .BR Setvbuf , an alternate form of .BR setbuf , is used after a stream has been opened but before it is read or written. It has three uses, depending on the value of the .IR type argument: .TP 5 .B "setvbuf(\fIstream\fP, \fIbuf\fP, _IOFBF, \fIsize\fP)" Causes input/output to be fully buffered using the character array .I buf whose size is determined by the .I size argument. If .I buf is the constant pointer .SM .BR NULL , then an automatically allocated buffer will be used. .TP 5 .B "setvbuf(\fIstream\fP, \fIbuf\fP, _IOLBF, \fIsize\fP)" Like above, except that output will be line buffered, i.e. the buffer will be flushed when a newline is written, the buffer is full, or input is requested. .TP 5 .B "setvbuf(\fIstream\fP, \fIbuf\fP, _IONBF, \fIsize\fP)" Causes input/output to be completely unbuffered. .I Buf and .I size are ignored. .PP A file can be changed between unbuffered, line buffered, or block buffered by using .B freopen (see .BR fopen (3)) followed by the appropriate .B setvbuf call. .SH "SEE ALSO" .BR fopen (3), .BR getc (3), .BR putc (3), .BR malloc (3), .BR fclose (3), .BR puts (3), .BR printf (3), .BR fread (3). .TH SIGSET 3 .SH NAME sigset, sigaddset, sigdelset, sigemptyset, sigfillset, sigismember \- manipulate signal sets .SH SYNOPSIS .ft B #include .nf int sigaddset(sigset_t *\fIset\fP, int \fIsig\fP) int sigdelset(sigset_t *\fIset\fP, int \fIsig\fP) int sigemptyset(sigset_t *\fIset\fP) int sigfillset(sigset_t *\fIset\fP) int sigismember(const sigset_t *\fIset\fP, int \fIsig\fP) .fi .ft P .SH DESCRIPTION The system calls that handle signals, such as .BR sigaction (2) and .BR sigprocmask (2) use sets of signals to keep a process from being interrupted by those signals while executing a signal handler or a critical code segment. These signal sets are manipulated by the following functions: .TP 5 .B "int sigaddset(sigset_t *\fIset\fP, int \fIsig\fP)" Add signal .I sig to the signal set referenced by .IR set . .TP .B "int sigdelset(sigset_t *\fIset\fP, int \fIsig\fP)" Remove signal .I sig from the signal set referenced by .IR set . .TP .B "int sigemptyset(sigset_t *\fIset\fP)" Initialize the signal set referenced by .I set to an empty set. .TP .B "int sigfillset(sigset_t *\fIset\fP)" Initialize the signal set referenced by .I set to an full set, i.e. all signals are in the set. .TP .B "int sigismember(const sigset_t *\fIset\fP, int \fIsig\fP)" Return .B 1 if the signal .I sig is present in the set referenced by .IR set , .B 0 otherwise. .SH "SEE ALSO" .BR sigaction (2), .BR sigpending (2), .BR sigprocmask (2), .BR sigsuspend (2). .SH DIAGNOSTICS All functions except .B sigismember return .B 0 on success. .B Sigismember returns .B 0 or .B 1 on success. They return .B \-1 with error code .B EINVAL for an invalid signal number. (They do not use .B EFAULT for a bad .I set address, but will simply cause a segmentation violation.) .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: sigset.3,v 1.2 1996/04/11 06:39:09 philip Exp $ .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)sleep.3 6.2 (Berkeley) 5/12/86 .\" .TH SLEEP 3 "May 12, 1986" .UC 4 .SH NAME sleep \- suspend execution for interval .SH SYNOPSIS .nf .ft B #include unsigned int sleep(unsigned int \fIseconds\fP) .fi .SH DESCRIPTION The current process is suspended from execution for the number of seconds specified by the argument. .PP The routine is implemented by setting an alarm timer and pausing until it occurs. The previous state of this timer is saved and restored. If the sleep time exceeds the time to the expiration of the previous timer, the process sleeps only until the signal would have occurred, and the signal is sent 1 second later. .SH "SEE ALSO" .BR alarm (2), .BR pause (2). .\" @(#)varargs.3 6.3 (Berkeley) 5/15/86 .\" .TH STDARG 3 "May 15, 1986" .AT 3 .SH NAME stdarg \- variable argument list .SH SYNOPSIS .nf .ft B #include void va_start(va_list \fIap\fP, \fIargtypeN\fP \fIparmN\fP) \fItype\fP va_arg(va_list \fIap\fP, \fItype\fP) void va_end(va_list \fIap\fP) .ft R .fi .SH DESCRIPTION This set of macros provides a means of writing portable procedures that accept variable argument lists. Routines having variable argument lists (such as .BR printf (3)) that do not use .B stdarg are inherently nonportable, since different machines use different argument passing conventions. .PP A function that accepts a variable argument list is declared with "..." at the end of its parameter list. It must have at least one normal argument before the "...". For example: .PP .RS .nf int printf(const char *format, ...) { /* code */ } int fprintf(FILE *stream, const char *format, ...) { /* code */ } .fi .RE .PP .B va_list is a type which is used for the variable .I ap within the body of a variable argument function which is used to traverse the list. .PP .B va_start\c .RI ( ap , .IR parmN ) is called to initialize .I ap to the beginning of the list. The last true parameter of the function, .IR parmN , must be supplied to allow .B va_start to compute the address of the first variable parameter. .PP .B va_arg\c .RI ( ap , .IR type ) will return the next argument in the list pointed to by .IR ap . .I Type is the type to which the expected argument will be converted when passed as an argument. .PP Different types can be mixed, but it is up to the routine to know what type of argument is expected, since it cannot be determined at runtime. .PP .B va_end\c .RI ( ap ) must be used to finish up. .PP Multiple traversals, each bracketed by .B va_start \&... .B va_end, are possible. .SH EXAMPLE .nf .ta +4n +4n +4n +4n \fB#include\fP .sp 0.4 execl(\fBconst char\fP *path, \fB...\fP) { \fBva_list\fP ap; \fBchar\fP *args[100]; \fBint\fP argno = 0; \fBva_start\fP(ap, path); \fBwhile\fP ((args[argno++] = \fBva_arg\fP(ap, \fBchar\fP *)) != NULL) {} \fBva_end\fP(ap); \fBreturn\fP execv(path, args); } .DT .fi .SH NOTES It is up to the calling routine to determine how many arguments there are, since it is not possible to determine this from the stack frame. For example, .B execl passes a null pointer to signal the end of the list. .B Printf can tell how many arguments are supposed to be there by the format. .PP The macros .B va_start and .B va_end may be arbitrarily complex; for example, .B va_start might contain an opening brace, which is closed by a matching brace in .BR va_end . Thus, they should only be used where they could be placed within a single complex statement. .SH BUGS It is impossible to properly show the macros as C declarations as is done in the synopsis. They can never be coded as C functions, because all three macros use their arguments by address, and the .I type field is certainly impossible. Just look at them as being part of the C language, like .BR sizeof . .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)stdio.3s 6.2 (Berkeley) 5/13/86 .\" .TH STDIO 3 "May 13, 1986" .UC 4 .SH NAME stdio \- standard buffered input/output package .SH SYNOPSIS .nf .ft B #include FILE *stdin; FILE *stdout; FILE *stderr; .ft R .fi .SH DESCRIPTION The functions in the standard I/O library constitute a user-level buffering scheme. The in-line macros .B getc and .BR putc (3) handle characters quickly. The higher level routines .BR gets , .BR fgets , .BR scanf , .BR fscanf , .BR fread , .BR puts , .BR fputs , .BR printf , .BR fprintf , .BR fwrite all use .B getc and .BR putc ; they can be freely intermixed. .PP A file with associated buffering is called a .IR stream , and is declared to be a pointer to a defined type .SM .BR FILE . .BR Fopen (3) creates certain descriptive data for a stream and returns a pointer to designate the stream in all further transactions. There are three normally open streams with constant pointers declared in the include file and associated with the standard open files: .TP 10n .B stdin standard input file .br .ns .TP .B stdout standard output file .br .ns .TP .B stderr standard error file .PP A constant `pointer' .SM .B NULL (0) designates no stream at all. .PP An integer constant .SM .B EOF (\-1) is returned upon end of file or error by integer functions that deal with streams. .PP Any routine that uses the standard input/output package must include the header file .RI < stdio.h > of pertinent macro definitions. The functions and constants mentioned in the standard I/O manual pages are declared in the include file and need no further declaration. The constants, and the following `functions' are implemented as macros; redeclaration of these names is perilous: .BR clearerr , .BR getc , .BR getchar , .BR putc , .BR putchar , .BR feof , .BR ferror , .BR fileno . .SH "SEE ALSO" .BR open (2), .BR close (2), .BR read (2), .BR write (2), .BR fclose (3), .BR ferror (3), .BR fopen (3), .BR fread (3), .BR fseek (3), .BR getc (3), .BR gets (3), .BR printf (3), .BR putc (3), .BR puts (3), .BR scanf (3), .BR setbuf (3), .BR ungetc (3). .SH DIAGNOSTICS The value .SM .B EOF is returned uniformly to indicate that a .SM .B FILE pointer has not been initialized with .BR fopen , input (output) has been attempted on an output (input) stream, or a .SM .B FILE pointer designates corrupt or otherwise unintelligible .SM .B FILE data. .PP For purposes of efficiency, this implementation of the standard library has been changed to line buffer output to a terminal by default and attempts to do this transparently by flushing the output whenever a .BR read (2) from the standard input is necessary. This is almost always transparent, but may cause confusion or malfunctioning of programs which use standard i/o routines but use .BR read (2) themselves to read from the standard input. .PP In cases where a large amount of computation is done after printing part of a line on an output terminal, it is necessary to .BR fflush (3) the standard output before going off and computing so that the output will appear. .SH BUGS The standard buffered functions do not interact well with certain other library and system functions, especially \fBfork\fP and \fBabort\fP. .SH "LIST OF FUNCTIONS" .sp 2 .nf .ta \w'setlinebuf'u+2n +\w'setbuf(3)'u+10n \fBName\fP \fBAppears on Page\fP \fBDescription\fP .ta \w'setlinebuf'u+4n +\w'setbuf(3)'u+4n .sp 5p clearerr ferror(3) stream status inquiries fclose fclose(3) close or flush a stream fdopen fopen(3) open a stream feof ferror(3) stream status inquiries ferror ferror(3) stream status inquiries fflush fclose(3) close or flush a stream fgetc getc(3) get character or word from stream fgets gets(3) get a string from a stream fileno ferror(3) stream status inquiries fopen fopen(3) open a stream fprintf printf(3) formatted output conversion fputc putc(3) put character or word on a stream fputs puts(3) put a string on a stream fread fread(3) buffered binary input/output freopen fopen(3) open a stream fscanf scanf(3) formatted input conversion fseek fseek(3) reposition a stream ftell fseek(3) reposition a stream fwrite fread(3) buffered binary input/output getc getc(3) get character or word from stream getchar getc(3) get character or word from stream gets gets(3) get a string from a stream getw getc(3) get character or word from stream printf printf(3) formatted output conversion putc putc(3) put character or word on a stream putchar putc(3) put character or word on a stream puts puts(3) put a string on a stream putw putc(3) put character or word on a stream rewind fseek(3) reposition a stream scanf scanf(3) formatted input conversion setbuf setbuf(3) assign buffering to a stream setvbuf setbuf(3) assign buffering to a stream snprintf printf(3) formatted output conversion sprintf printf(3) formatted output conversion sscanf scanf(3) formatted input conversion ungetc ungetc(3) push character back into input stream vfprintf printf(3) formatted output conversion vfscanf scanf(3) formatted input conversion vprintf printf(3) formatted output conversion vscanf scanf(3) formatted input conversion vsnprintf printf(3) formatted output conversion vsprintf printf(3) formatted output conversion vsscanf scanf(3) formatted input conversion .fi .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)string.3 6.1 (Berkeley) 5/15/85 .\" .TH STRING 3 "May 15, 1985" .UC 4 .SH NAME string, strcat, strncat, strcmp, strncmp, strcpy, strncpy, strlen, strchr, strrchr, strerror, memcmp, memcpy, memmove, memchr, memset, index, rindex \- string operations .SH SYNOPSIS .nf .ft B #include char *strcat(char *\fIs1\fP, const char *\fIs2\fP) char *strncat(char *\fIs1\fP, const char *\fIs2\fP, size_t \fIn\fP) int strcmp(const char *\fIs1\fP, const char *\fIs2\fP) int strncmp(const char *\fIs1\fP, const char *\fIs2\fP, size_t \fIn\fP) char *strcpy(char *\fIs1\fP, const char *\fIs2\fP) char *strncpy(char *\fIs1\fP, const char *\fIs2\fP, size_t \fIn\fP) size_t strlen(const char *\fIs\fP) char *strchr(const char *\fIs\fP, int \fIc\fP) char *strrchr(const char *\fIs\fP, int \fIc\fP) char *strerror(int \fIerrnum\fP) int memcmp(const void *\fIs1\fP, const void *\fIs2\fP, size_t \fIn\fP) void *memcpy(void *\fIs1\fP, const void *\fIs2\fP, size_t \fIn\fP) void *memmove(void *\fIs1\fP, const void *\fIs2\fP, size_t \fIn\fP) void *memchr(const void *\fIs\fP, int \fIc\fP, size_t \fIn\fP) void *memset(void *\fIs\fP, int \fIc\fP, size_t \fIn\fP) char *index(const char *\fIs\fP, int \fIc\fP) char *rindex(const char *\fIs\fP, int \fIc\fP) .ft R .fi .SH DESCRIPTION These functions operate on null-terminated strings. They do not check for overflow of any receiving string. .PP .B Strcat appends a copy of string .I s2 to the end of string .IR s1 . .B Strncat copies at most .I n characters. Both return a pointer to the null-terminated result. .PP .B Strcmp compares its arguments and returns an integer greater than, equal to, or less than 0, according as .I s1 is lexicographically greater than, equal to, or less than .IR s2 . .B Strncmp makes the same comparison but looks at at most .I n characters. .PP .B Strcpy copies string .I s2 to .IR s1 , stopping after the null character has been moved. .B Strncpy copies exactly .I n characters, truncating or null-padding .I s2; the target may not be null-terminated if the length of .I s2 is .I n or more. Both return .IR s1 . .PP .B Strlen returns the number of non-null characters in .IR s . .PP .B Strchr .RB ( strrchr ) returns a pointer to the first (last) occurrence of character .I c in string .I s, or null if .I c does not occur in the string. .PP .B Strerror returns the error string for the system call error .IR errnum . See .BR intro (2). .PP .B Memcmp is like .B strcmp except that the strings are memory blocks of length .IR n . Null characters are treated as ordinary characters. .PP .B Memcpy copies .I n bytes from the location pointed to by .I s2 to .IR s1 . .B Memmove is like memcpy, except that it can handle overlap between the two strings. Both functions return .IR s1 . .PP .B Memchr returns a pointer to the first occurrence of character .I c in string .I s, or null if .I c does not occur in the string. .PP .B Memset sets .I n bytes to .I c starting at location .IR s . It returns .IR s . .PP .B Index and .B rindex are obsolete versions of .B strchr and .BR strrchr . New code should avoid using them. .SH NOTES Characters are compared as .BR "unsigned char" , whether .B char itself is signed or not. .\" @(#)system.3 6.1 (Berkeley) 5/15/85 .\" .TH SYSTEM 3 "May 15, 1985" .AT 3 .SH NAME system \- issue a shell command .SH SYNOPSIS .nf .ft B #include int system(const char *\fIstring\fP) .fi .SH DESCRIPTION .B System causes the .I string to be given to .BR sh (1) as input as if the string had been typed as a command at a terminal. The current process waits until the shell has completed, then returns the exit status of the shell. .SH "SEE ALSO" .BR sh (1), .BR popen (3), .BR execve (2), .BR wait (2). .SH DIAGNOSTICS Exit status 127 indicates the shell couldn't be executed. .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)termcap.3x 6.1 (Berkeley) 5/15/85 .\" .TH TERMCAP 3 "May 15, 1985" .UC 4 .SH NAME termcap, tgetent, tgetnum, tgetflag, tgetstr, tgoto, tputs \- terminal independent operation routines .SH SYNOPSIS .nf .ft B #include int tgetent(char *\fIbp\fP, char *\fIname\fP) int tgetflag(char *\fIid\fP) int tgetnum(char *\fIid\fP) char *tgetstr(char *\fIid\fP, char **\fIarea\fP) char *tgoto(char *\fIcm\fP, int \fIdestcol\fP, int \fIdestline\fP) int tputs(char *\fIcp\fP, int \fIaffcnt\fP, void (*\fIoutc\fP)(int)) .ft R .fi .SH DESCRIPTION These functions extract and use capabilities from the terminal capability data base .BR termcap (5). These are low level routines; see .BR curses (3) for a higher level package. .PP .B Tgetent extracts the entry for terminal .I name into the buffer at .IR bp . .I Bp should be a character buffer of size 1024 and must be retained through all subsequent calls to .BR tgetnum , .BR tgetflag , and .BR tgetstr . .B Tgetent returns \-1 if it cannot find a termcap file, 0 if the terminal name given does not have an entry, and 1 if all goes well. .PP .B Tgetent uses the following recipe to find the termcap file and entry .IR name : .PP .in +5n if $TERMCAP is itself a termcap entry for .I name .br then .in +5n use $TERMCAP .in -5n elif $TERMCAP names a file .br then .in +5n use entry .I name found in that file .in -5n elif this is Minix-vmd .br then .in +5n if $TERMPATH is defined .br then .in +5n search the termcap files named in $TERMPATH for the first occurance of a .I name entry and use that entry .in -5n else .in +5n the path .B $HOME/.termcap:/etc/termcap:/usr/etc/termcap" is searched for entry .I name .in -5n fi .in -5n fi .in -5n .RE .PP .B Tgetnum gets the numeric value of capability .IR id , returning \-1 if is not given for the terminal. .B Tgetflag returns 1 if the specified capability is present in the terminal's entry, 0 if it is not. .B Tgetstr returns the string value of the capability .IR id , places it in the buffer at .IR area , and advances the .I area pointer. It decodes the abbreviations for this field described in .BR termcap (5), except for cursor addressing and padding information. .B Tgetstr returns NULL if the capability was not found. .PP .B Tgoto returns a cursor addressing string decoded from .I cm to go to column .I destcol in line .IR destline . It uses the external variables .B UP (from the \fBup\fR capability) and .B BC (if \fBbc\fR is given rather than \fBbs\fR) if necessary to avoid placing \fB\en\fR, \fB^D\fR or \fB^@\fR in the returned string. (Programs which call tgoto should be sure to turn off the XTABS bit(s), since .B tgoto may now output a tab. Note that programs using termcap should in general turn off XTABS anyway since some terminals use CTRL-I for other functions, such as nondestructive space.) If a \fB%\fR sequence is given which is not understood, then .B tgoto returns \*(lqOOPS\*(rq. .PP .B Tputs decodes the leading padding information of the string .IR cp ; .I affcnt gives the number of lines affected by the operation, or 1 if this is not applicable, .I outc is a routine which is called with each character in turn. The external variable .B ospeed should contain the output speed of the terminal as encoded by .BR stty (3). The external variable .B PC should contain a pad character to be used (from the \fBpc\fR capability) if a null (\fB^@\fR) is inappropriate. .SH SEE ALSO .BR curses (3), .BR termcap (5). .SH AUTHOR William Joy .SH NOTES The Minix implementation does not support any of the external variables, only the functions calls. The Minix-vmd termcap does support it all, although noone in his right mind meddles with those variables. .TH TERMIOS 3 .SH NAME termios, tcgetattr, tcsetattr, cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed, tcsendbreak, tcdrain, tcflush, tcflow \- change terminal attributes .SH SYNOPSIS .ft B .nf #include int tcgetattr(int \fIfd\fP, struct termios *\fItp\fP) int tcsetattr(int \fIfd\fP, int \fIaction\fP, const struct termios *\fItp\fP) speed_t cfgetispeed(const struct termios *\fItp\fP) speed_t cfgetospeed(const struct termios *\fItp\fP) int cfsetispeed(struct termios *\fItp\fP, speed_t \fIspeed\fP) int cfsetospeed(struct termios *\fItp\fP, speed_t \fIspeed\fP) int tcsendbreak(int \fIfd\fP, int \fIduration\fP) int tcdrain(int \fIfd\fP) int tcflush(int \fIfd\fP, int \fIqueue_selector\fP) int tcflow(int \fIfd\fP, int \fIaction\fP) .fi .ft P .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. These are the user functions that modify the tty attributes mentioned in .BR tty (4). In the following, .I fd refers to an open terminal device file, .I tp is the address of a .BR "struct termios" , and .I speed and values of type .B speed_t are equal to one of the .BR B0 , .BR B50 , etc. baud rate symbols. All functions, symbols, and types are declared in .BR . .PP The effects of the tty functions are: .TP .B tcgetattr(\fIfd\fP, \fItp\fP) Get the current settings of the tty attributes. .TP .B tcsetattr(\fIfd\fP, TCSANOW, \fItp\fP) Set the terminal attributes. The change occurs immediately. .TP .B tcsetattr(\fIfd\fP, TCSADRAIN, \fItp\fP) Set the terminal attributes. The change occurs once all the output waiting in the output queues has been transmitted. This should be used when options affecting output are changed. .TP .B tcsetattr(\fIfd\fP, TCSAFLUSH, \fItp\fP) Set the terminal attributes. But first wait until all the output waiting in the output queues has been transmitted. All input waiting in the input queues is then discarded and the change is made. This should be used when switching from canonical to non-canonical mode or vice-versa. (Oddly enough, this is seldom what you want, because it discards typeahead. An editing shell does the Right Thing if it uses .B TCSANOW instead. \s-2POSIX\s+2 may not guarantee good results, but in practice most systems make the canonical input available in raw mode.) .TP .B cfgetispeed(\fItp\fP) Return the input baud rate encoded in the termios structure. .TP .B cfgetospeed(\fItp\fP) Return the output baud rate encoded in the termios structure. .TP .B cfsetispeed(\fItp\fP, \fIspeed\fP) Encode the new input baud rate into the termios structure. .TP .B cfsetospeed(\fItp\fP, \fIspeed\fP) Encode the new output baud rate into the termios structure. .TP .B tcsendbreak(\fIfd\fP, \fIduration\fP) Emit a break condition on a serial line for a time indicated by .IR duration . (Always 0.4 seconds under Minix, .I duration is ignored.) .TP .B tcdrain(\fIfd\fP) Wait until all output waiting in the output queues has been transmitted. .TP .B tcflush(\fIfd\fP, TCIFLUSH) Flush the input queue. (I.e. discard it.) .TP .B tcflush(\fIfd\fP, TCOFLUSH) Flush the output queue. .TP .B tcflush(\fIfd\fP, TCIOFLUSH) Flush the input and output queues. .TP .B tcflow(\fIfd\fP, TCOOFF) Suspend output. (Like the effect of .BR STOP .) .TP .B tcflow(\fIfd\fP, TCOON) Restart output. (Like the effect of .BR START .) .TP .B tcflow(\fIfd\fP, TCIOFF) Transmit a .B STOP character intended to make the remote device stop transmitting data. .TP .B tcflow(\fIfd\fP, TCION) Transmit a .B START character to restart the remote device. .SH "SEE ALSO" .BR stty (1), .BR tty (4). .SH DIAGNOSTICS All functions return 0 unless otherwise specified, and \-1 on error with .B errno set to indicate the type of error. The most notable errors are .B ENOTTY if .I fd does not refer to a terminal device, and .B EINTR if one of the functions waiting for output to drain is interrupted. .SH NOTES It may be interesting to know that the functions operating on the tty are directly translated into the following Minix .B ioctl requests: .BR TCGETS , .BR TCSETS (now), .BR TCSETSW (drain), .BR TCSETSF , (flush), .BR TCSBRK , .BR TCDRAIN , .BR TCFLSH , and .BR TCFLOW . You should only use this knowledge when trying to understand the tty driver code, of course. .SH BUGS .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: termios.3,v 1.2 1996/04/11 06:41:24 philip Exp $ .TH TTYNAME 3 .SH NAME ttyname \- file descriptor to terminal device name .SH SYNOPSIS .nf .ft B #define _POSIX_SOURCE 1 #include char *ttyname(int \fIfd\fP) .ft P .fi .SH DESCRIPTION .B Ttyname searches through the .B /dev directory for the terminal device file that is associated with file descriptor .IR fd . It returns the full path name of the terminal file if found, NULL is returned otherwise. .SH "SEE ALSO" .BR ttyslot (3). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: ttyname.3,v 1.2 1996/04/11 06:42:17 philip Exp $ .TH TTYSLOT 3 .SH NAME ttyslot, fttyslot \- utmp slot number .SH SYNOPSIS .nf .ft B #define _MINIX_SOURCE 1 #include int ttyslot(void) int fttyslot(int \fIfd\fP) .fi .ft P .SH DESCRIPTION .B Ttyslot() returns the index of the login terminal in the .B utmp file. It tries .B fttyslot() on file descriptors .BR 0, .BR 1, and .BR 2 to find the index. .PP .B Fttyslot() returns the utmp index of the terminal associated with file descriptor .IR fd . First it tries to map .I fd to a terminal name with .BR ttyname (3), then it searches the .BR ttytab (5) database with the .BR getttyent (3) function for this terminal. This means that the utmp slot number is the same as the ttytab entry number counting from 1. The value 0 is returned if no slot number can be found for a file descriptor. .SH "SEE ALSO" .BR ttyname (3), .BR getttyent (3), .BR utmp (5), .BR ttytab (5), .BR init (8). .SH NOTES Since 0 is used as an error return this means that the first entry in the utmp file is not used. .PP .B Ttyslot() is often found in a UNIX implementation, .B fttyslot() is Minix specific. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" @(#)ungetc.3s 6.1 (Berkeley) 5/15/85 .\" .TH UNGETC 3 "May 15, 1985" .AT 3 .SH NAME ungetc \- push character back into input stream .SH SYNOPSIS .nf .ft B #include int ungetc(int \fIc\fP, FILE *\fIstream\fP) .ft R .fi .SH DESCRIPTION .B Ungetc pushes the character .I c back on an input stream. That character will be returned by the next .B getc call on that stream. .B Ungetc returns .IR c . .PP One character of pushback is guaranteed provided something has been read from the stream and the stream is actually buffered. Attempts to push EOF are rejected. .PP .BR Fseek (3) erases all memory of pushed back characters. .SH "SEE ALSO" .BR getc (3), .BR setbuf (3), .BR fseek (3). .SH DIAGNOSTICS .B Ungetc returns .SM .B EOF if it can't push a character back. .TH SERVXCHECK 3 .SH NAME servxcheck \- Internet service access check .SH SYNOPSIS .ft B .nf #define _MINIX_SOURCE 1 #include int servxcheck(int \fIfd\fP, const char *\fIservice\fP, void (*\fIlogf\fP)(int \fIpass\fP, const char *\fIname\fP)); char *servxfile(const char *\fIfile\fP); .fi .ft R .SH DESCRIPTION .B Servxcheck() is used by programs like .B inetd to perform an access check on the host connected to the other end of the TCP channel referenced by file descriptor .IR fd . .PP .B Servxcheck() determines the IP address of the remote host, translates it to the associated host name if necessary, and checks if the host is granted access as guided by the file .BR /etc/serv.access . (See .BR serv.access (5).) The service name used to search the access file is passed by the caller as .IR service . These names should be the same as the service names in .BR /etc/services . .PP An attempt to connect to a service is logged if the access is denied. You can use the special checkword "\fBlog\fP" to also log if access is granted. Logging will be done to .BR /usr/adm/log . One may do one's own logging by supplying a .I logf function that will be called by .B servxcheck with a first argument that is true if access is granted, false if denied, and a second argument that is the name of the remote host whose access has been checked. .PP The default is to fail the check unless the access file says otherwise. Strange errors make the check succeed. We do not want remote access to fail because of some system error. Note that this function is not meant to check access to the system, that's what passwords and such are for, but only to limit access to those who are allowed to use the services the system offers. .PP Connections from a machine to itself are accepted immediately. No further checks, no logging. .PP .B Servxfile() may be used to specify a file other than the default .BR /etc/serv.access . This is useful for programs started from .B inetd that want to handle the access check themselves, using a private access file. The return value of .B servxfile() is the pathname of the old access file. Only a pointer to the new path is saved, the caller must keep the string it points to intact. .SH FILES .TP 25n .B /etc/serv.access Default access check file. .SH "SEE ALSO" .BR serv.access (5), .BR services (5), .BR inetd (8). .SH DIAGNOSTICS .B Servxcheck() returns 0 if the access is denied, 1 if granted. .PP Typical log message: .PP .RS Apr 10 13:27:59 service 'shell' granted to jetsam.cs.vu.nl .RE .SH BUGS IP and DNS based access checks will stop most crackers, but not the really determined ones. Luckily Minix is sufficiently strange to thwart the well known cracking schemes. But don't ever allow yourself to feel secure. .SH AUTHOR Kees J. Bot .TH INT64 3 .SH NAME int64, add64, add64u, add64ul, sub64, sub64u, sub64ul, diff64, cvu64, cvul64, cv64u, cv64ul, div64u, rem64u, mul64u, cmp64, cmp64u, cmp64ul, ex64lo, ex64hi, make64 \- 64 bit disk offset computations .SH SYNOPSIS .ft B .nf #include u64_t add64(u64_t \fIi\fP, u64_t \fIj\fP) u64_t add64u(u64_t \fIi\fP, unsigned \fIj\fP) u64_t add64ul(u64_t \fIi\fP, unsigned long \fIj\fP) u64_t sub64(u64_t \fIi\fP, u64_t \fIj\fP) u64_t sub64u(u64_t \fIi\fP, unsigned \fIj\fP) u64_t sub64ul(u64_t \fIi\fP, unsigned long \fIj\fP) unsigned diff64(u64_t \fIi\fP, u64_t \fIj\fP) u64_t cvu64(unsigned \fIi\fP) u64_t cvul64(unsigned long \fIi\fP) unsigned cv64u(u64_t \fIi\fP) unsigned long cv64ul(u64_t \fIi\fP) unsigned long div64u(u64_t \fIi\fP, unsigned \fIj\fP) unsigned rem64u(u64_t \fIi\fP, unsigned \fIj\fP) u64_t mul64u(unsigned long \fIi\fP, unsigned \fIj\fP) int cmp64(u64_t \fIi\fP, u64_t \fIj\fP) int cmp64u(u64_t \fIi\fP, unsigned \fIj\fP) int cmp64ul(u64_t \fIi\fP, unsigned long \fIj\fP) unsigned long ex64lo(u64_t \fIi\fP) unsigned long ex64hi(u64_t \fIi\fP) u64_t make64(unsigned long \fIlo\fP, unsigned long \fIhi\fP) .fi .ft P .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B int64 family of functions allow Minix to handle disks of up to 4 terabytes using 32 bit sector numbers and 64 bit byte offsets on a machine where the C type .B long is 32 bits. The include file defines a 64 bit data type, .BR u64_t , and a number of functions to operate on them. Note that these functions are geared towards common disk offset and block computations, and do not provide a full set of 64 bit operations. They are: .PP .TP .B "u64_t add64(u64_t \fIi\fP, u64_t \fIj\fP)" Add the 64 bit numbers .I i and .I j forming a 64 bit result. .TP .B "u64_t add64u(u64_t \fIi\fP, unsigned \fIj\fP)" Add an unsigned .I j to a 64 bit number .I i forming a 64 bit result. .TP .B "u64_t add64ul(u64_t \fIi\fP, unsigned long \fIj\fP)" Add an unsigned long .I j to a 64 bit number .I i forming a 64 bit result. .TP .B "u64_t sub64(u64_t \fIi\fP, u64_t \fIj\fP)" Subtract the 64 bit number .I j from the 64 bit number .I i forming a 64 bit result. .TP .B "u64_t sub64u(u64_t \fIi\fP, unsigned \fIj\fP)" Subtract the unsigned .I j from the 64 bit number .I i forming a 64 bit result. .TP .B "u64_t sub64ul(u64_t \fIi\fP, unsigned long \fIj\fP)" Subtract the unsigned long .I j from the 64 bit number .I i forming a 64 bit result. .TP .B "unsigned diff64(u64_t \fIi\fP, u64_t \fIj\fP)" Subtract the 64 bit number .I j from the 64 bit number .I i forming an unsigned. Overflow is not checked. .TP .B "u64_t cvu64(unsigned \fIi\fP)" Convert an unsigned to a 64 bit number. .TP .B "u64_t cvul64(unsigned long \fIi\fP)" Convert an unsigned long to a 64 bit number. .TP .B "unsigned cv64u(u64_t \fIi\fP)" Convert a 64 bit number to an unsigned if it fits, otherwise return .BR UINT_MAX . .TP .B "unsigned long cv64ul(u64_t \fIi\fP)" Convert a 64 bit number to an unsigned long if it fits, otherwise return .BR ULONG_MAX . .TP .B "unsigned long div64u(u64_t \fIi\fP, unsigned \fIj\fP)" Divide the 64 bit number .I i by the unsigned .I j giving an unsigned long. Overflow is not checked. (Typical "byte offset to block number" conversion.) .TP .B "unsigned rem64u(u64_t \fIi\fP, unsigned \fIj\fP)" Compute the remainder of the division of the 64 bit number .I i by the unsigned .I j as an unsigned. (Typical "byte offset within a block" computation.) .TP .B "u64_t mul64u(unsigned long \fIi\fP, unsigned \fIj\fP)" Multiply the unsigned long .I i by the unsigned .I j giving a 64 bit number. (Typical "block number to byte offset" conversion.) .TP .B "int cmp64(u64_t \fIi\fP, u64_t \fIj\fP)" Compare two 64 bit numbers. Returns .B -1 if .I i < .IR j , .B 0 if .I i == .IR j , and .B 1 if .I i > .IR j . .TP .B "int cmp64u(u64_t \fIi\fP, unsigned \fIj\fP)" Likewise compare a 64 bit number with an unsigned. .TP .B "int cmp64ul(u64_t \fIi\fP, unsigned long \fIj\fP)" Likewise compare a 64 bit number with an unsigned long. .TP .B "unsigned long ex64lo(u64_t \fIi\fP)" Extract the low 32 bits of a 64 bit number. .TP .B "unsigned long ex64hi(u64_t \fIi\fP)" Extract the high 32 bits of a 64 bit number. .TP .B "u64_t make64(unsigned long \fIlo\fP, unsigned long \fIhi\fP)" Combine the low and high parts of a 64 bit number to a 64 bit number. (The last three functions are used to pass 64 bit numbers in messages within the kernel. They should not be used for anything else.) .SH "SEE ALSO" .BR fcntl (2), .BR controller (4). .SH NOTES With the usual disk block size of 512 bytes the maximum disk size is 512 \(** 4 gigabytes = 2 terabytes. .PP Standard Minix only uses 64 bit computations withing the disk drivers, so individual partitions are still limited to 4 gigabytes. Minix-vmd has 64 bit computations also in the file system code. .PP Special care must be taken when accessing disk devices. For Minix one may have to temporarily change the start of the partition to go beyond 4 G. Minix-vmd can go beyond 4 G, but the .B lseek system call is still limited to a 32 bit offset. One needs to use .PP .RS .BI "fcntl(" fd ", F_SEEK, u64_t " offset ")" .RE .PP to seek to a 64 bit position. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CONFIGFILE 3 .SH NAME configfile, config_read, config_delete, config_renewed, config_length, config_issub, config_isatom, config_isstring \- generic configuration file functions .SH SYNOPSIS .ft B .nf #include config_t *config_read(const char *\fIfile\fP, int \fIflags\fP, config_t *\fIcfg\fP) void config_delete(config_t *\fIcfg\fP) int config_renewed(config_t *\fIcfg\fP) size_t config_length(config_t *\fIcfg\fP) int config_issub(config_t *\fIcfg\fP) int config_isatom(config_t *\fIcfg\fP) int config_isstring(config_t *\fIcfg\fP) .fi .ft P .SH DESCRIPTION The .B configfile routines operate on a generic configuration file that follows the syntax described in .BR configfile (5). .PP The interface presented by the functions above uses the following type and definitions from : .PP .if n .in +2 .if t .RS .nf .ta +\w'type'u +\w'const charmm'u +\w'word[];mm'u typedef const struct config { config_t *next; /* Next configuration file thing. */ config_t *list; /* For a { sublist }. */ const char *file; /* File and line where this is found. */ unsigned line; int flags; /* Special flags. */ char word[]; /* Payload. */ } config_t; .ta +\w'#definem'u +\w'CFG_SUBLISTm'u +\w'0x0000mm'u #define CFG_CLONG 0x0001 /* strtol(word, &end, 0) is valid. */ #define CFG_OLONG 0x0002 /* strtol(word, &end, 010). */ #define CFG_DLONG 0x0004 /* strtol(word, &end, 10). */ #define CFG_XLONG 0x0008 /* strtol(word, &end, 0x10). */ #define CFG_CULONG 0x0010 /* strtoul(word, &end, 0). */ #define CFG_OULONG 0x0020 /* strtoul(word, &end, 010). */ #define CFG_DULONG 0x0040 /* strtoul(word, &end, 10). */ #define CFG_XULONG 0x0080 /* strtoul(word, &end, 0x10). */ #define CFG_STRING 0x0100 /* The word is enclosed in quotes. */ #define CFG_SUBLIST 0x0200 /* This is a sublist, so no word. */ #define CFG_ESCAPED 0x0400 /* Escapes are still marked with \e. */ .fi .if n .in -2 .if t .RE .PP In memory a configuration file is represented as a list of .B config_t cells linked together with the .B next field ending with a null pointer. A sublist between braces is attached to a cell at the .B list field. Words and strings are put in the .B word field, a null terminated string. The .B flags field records the type and features of a cell. The .B CFG_*LONG flags are set if a word is a number according to one of the .B strtol or .B strtoul calls. Purely a number, no quotes or trailing garbage. The .B CFG_STRING flag is set if the object was enclosed in double quotes. Lastly .B CFG_SUBLIST tells if the cell is only a pointer to a sublist in braces. .PP Characters in a word or string may have been formed with the .B \e escape character. They have been parsed and expanded, but the \e is still present if .B CFG_ESCAPED is set. The .B word array may be changed, as long as it doesn't grow longer, so one may remove the \es like this: .PP .RS .ta +4n +4n .nf if (cfg->flags & CFG_ESCAPED) { char *p, *q; p= q= cfg->word; for (;;) { if ((*q = *p) == '\e\e') *q = *++p; if (*q == 0) break; p++; q++; } } .fi .RE .PP The low level syntax of a config file is checked when it is read. If an error is encountered a message is printed and the program exits with exit code 1. What the data means is not checked, that should be done by the program using the data. Only the atom .B include at the beginning of a list is special. It should be followed by a string. The string is seen as the name of a file, that is opened, read, and inserted in place of the .BR include . Unless the name of the file starts with a .BR / , it is sought relative to the directory the current file is found in. Nonexistent files are treated as being empty. .PP The .B file and .B line fields in each cell tell where the cell was read. .SS Functions A configuration file is read with .BR config_read . The first argument is the file to read. The second is either .B 0 or .B CFG_ESCAPED to tell whether \e escapes should be fully expanded without leaving a trace, or if they should still be marked with a \e so that the caller knows where the excapes are. The third argument, .IR cfg , should be a null pointer on the first call. If you want to reread a config file that may have changed then .I cfg should be what you previously read. .PP With .B config_delete one can free up the memory that has been acquired with .BR malloc (3) to hold the contents of the configuration file. .PP To determine if the contents of configuration file has changed when reread one uses .BR config_renewed after .BR config_read . It returns a "changed" flag that is set when the configuration file changed and then clears that flag. It returns true on the very first call. For the function to work you need to feed the old data back into .BR config_read , not delete and reread. .PP The length of a series of config structures is told by .BR config_length . It follows the .B next fields, so a sublist between braces counts as one extra. .PP The .BR config_issub , .BR config_isatom and .BR config_isstring functions are just pretty macros to test if a cell references a sublist, is a word/string, or is just a string. .B CFG_SUBLIST and .B CFG_STRING tell the same story. .SH FILES .TP \w'*/etc/*.confmmmm'u .B */etc/*.conf Several files in several .B etc directories. .SH "SEE ALSO" .BR configfile (5). .SH NOTES The syntax of a config file puts some constraints on what you find in memory. The top level list consists entirely of sublist cells. These point to lists that start with at least an atom, followed by a mix of atoms and sublist cells. These sublists in turn point to a list of only sublist cells (recurse now.) .PP The struct config shown above is not exactly proper C to aid readability, read itself to see why. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)getservent.3n 6.3 (Berkeley) 5/19/86 .\" .TH GETSERVENT 3 "May 19, 1986" .UC 5 .SH NAME getservent, getservbyport, getservbyname, setservent, endservent \- get service entry .SH SYNOPSIS .nf .ft B #include .PP .ft B struct servent *getservent() .PP .ft B struct servent *getservbyname(name, proto) char *name, *proto; .PP .ft B struct servent *getservbyport(port, proto) int port; char *proto; .PP .ft B setservent(stayopen) int stayopen .PP .ft B endservent() .fi .SH DESCRIPTION .IR Getservent , .IR getservbyname , and .I getservbyport each return a pointer to an object with the following structure containing the broken-out fields of a line in the network services data base, .IR /etc/services . .RS .PP .nf struct servent { char *s_name; /* official name of service */ char **s_aliases; /* alias list */ int s_port; /* port service resides at */ char *s_proto; /* protocol to use */ }; .ft R .ad .fi .RE .PP The members of this structure are: .TP \w's_aliases'u+2n s_name The official name of the service. .TP \w's_aliases'u+2n s_aliases A zero terminated list of alternate names for the service. .TP \w's_aliases'u+2n s_port The port number at which the service resides. Port numbers are returned in network byte order. .TP \w's_aliases'u+2n s_proto The name of the protocol to use when contacting the service. .PP .I Getservent reads the next line of the file, opening the file if necessary. .PP .I Setservent opens and rewinds the file. If the .I stayopen flag is non-zero, the net data base will not be closed after each call to .I getservbyname or .IR getservbyport . .PP .I Endservent closes the file. .PP .I Getservbyname and .I getservbyport sequentially search from the beginning of the file until a matching protocol name or port number is found, or until EOF is encountered. If a protocol name is also supplied (non-NULL), searches must also match the protocol. .SH FILES /etc/services .SH "SEE ALSO" getprotoent(3), services(5) .SH DIAGNOSTICS Null pointer (0) returned on EOF or error. .SH BUGS All information is contained in a static area so it must be copied if it is to be saved. Expecting port numbers to fit in a 32 bit quantity is probably naive. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rcmd.3 6.7 (Berkeley) 5/14/86 .\" .TH RCMD 3 "May 14, 1986" .UC 5 .SH NAME rcmd, rresvport, ruserok \- routines for returning a stream to a remote command .SH SYNOPSIS .nf .B "#include " .B "#include " .PP .B "rem = rcmd(ahost, inport, locuser, remuser, cmd, fd2p);" .B char **ahost; .B int inport; .B "char *locuser, *remuser, *cmd;" .B int *fd2p; .PP .B s = rresvport(port); .B int *port; .PP .B "ruserok(rhost, superuser, ruser, luser);" .B char *rhost; .B int superuser; .B char *ruser, *luser; .fi .SH DESCRIPTION .I Rcmd is a routine used by the super-user to execute a command on a remote machine using an authentication scheme based on reserved port numbers. .I Rresvport is a routine which returns a descriptor to a socket with an address in the privileged port space. .I Ruserok is a routine used by servers to authenticate clients requesting service with .IR rcmd . All three functions are present in the same file and are used by the .IR rshd (8) server (among others). .PP .I Rcmd looks up the host .I *ahost using .IR gethostbyname (3), returning \-1 if the host does not exist. Otherwise .I *ahost is set to the standard name of the host and a connection is established to a server residing at the well-known Internet port .IR inport . .PP If the connection succeeds, a socket in the Internet domain of type SOCK_STREAM is returned to the caller, and given to the remote command as .B stdin and .BR stdout . If .I fd2p is non-zero, then an auxiliary channel to a control process will be set up, and a descriptor for it will be placed in .IR *fd2p . The control process will return diagnostic output from the command (unit 2) on this channel, and will also accept bytes on this channel as being UNIX signal numbers, to be forwarded to the process group of the command. If .I fd2p is 0, then the .B stderr (unit 2 of the remote command) will be made the same as the .B stdout and no provision is made for sending arbitrary signals to the remote process, although you may be able to get its attention by using out-of-band data. .PP The protocol is described in detail in .IR rshd (8). .PP The .I rresvport routine is used to obtain a socket with a privileged address bound to it. This socket is suitable for use by .I rcmd and several other routines. Privileged Internet ports are those in the range 0 to 1023. Only the super-user is allowed to bind an address of this sort to a socket. .PP .I Ruserok takes a remote host's name, as returned by a .IR gethostbyaddr (3) routine, two user names and a flag indicating whether the local user's name is that of the super-user. It then checks the files .I /etc/hosts.equiv and, possibly, .I .rhosts in the current working directory (normally the local user's home directory) to see if the request for service is allowed. A 0 is returned if the machine name is listed in the ``hosts.equiv'' file, or the host and remote user name are found in the ``.rhosts'' file; otherwise .I ruserok returns \-1. If the .I superuser flag is 1, the checking of the ``host.equiv'' file is bypassed. If the local domain (as obtained from \fIgethostname\fP\|(3)) is the same as the remote domain, only the machine name need be specified. .SH SEE ALSO rlogin(1), rsh(1), intro(2), rexec(3), rexecd(8), rlogind(8), rshd(8) .SH DIAGNOSTICS .I Rcmd returns a valid socket descriptor on success. It returns -1 on error and prints a diagnostic message on the standard error. .PP .I Rresvport returns a valid, bound socket descriptor on success. It returns -1 on error with the global value .I errno set according to the reason for failure. The error code EAGAIN is overloaded to mean ``All network ports in use.'' ...console.4dev.4fd.4ip.4lp.4mtio.4tty.4controller.4.TH CONSOLE 4 .SH NAME console, keyboard, log \- system console .SH DESCRIPTION The TTY device driver manages two devices related to the main user interface, the system screen and the keyboard. These two together are named "the Console". .SS "The Screen" The screen of a PC can be managed by a Monochrome Display Adapter, a Hercules card, a Color Graphics Adapter, an Enhanced Graphics Adapter, or a Video Graphics Array. To the console driver these devices are seen as a block of video memory into which characters can be written to be displayed, an I/O register that sets the video memory origin to the character that is to be displayed on the top-left position of the screen, and an I/O register that sets the position of the hardware cursor. Each character within video memory is a two-byte word. The low byte is the character code, and the high byte is the "attribute byte", a set of bits that controls the way the character is displayed, character and background colours for a colour card, or intensity/underline/reverse video for monochrome. .PP These are the characteristics of the adapters in text mode: .PP .RS .nf .ta +15n +15n Adapter Usable memory Mono/Colour .ta +1n +15n +15n MDA 4K M Hercules 4K M CGA 16K C EGA 32K M or C VGA 32K M or C .fi .RE .PP MDA and Hercules are the same to the console driver, because the graphics mode of the Hercules is of no use to Minix. EGA and VGA are also mostly seen as the same in text mode. An EGA adapter is either a monochrome or a colour device depending on the screen attached to it. A VGA adapter can run in either monochrome or colour (grayscale) mode depending on how the Boot Monitor has initialized it. .PP The driver uses the video origin to avoid copying the screen contents when scrolling up or down. Instead the origin is simply moved one line. This is named "hardware scrolling", as opposed to copying memory: "software scrolling". .PP The video origin is also used to implement several virtual consoles inside the video memory of the adapter. Each virtual console gets a segment of video memory. The driver chooses which console to display by moving the video origin. Note that an MDA or Hercules adapter can only support one console. CGA can support up to four 80x25 consoles, and EGA and VGA can have eight. It is best to configure one less console to leave some video memory free so that hardware scrolling has some space to work in. .PP Character codes are used as indices into a display font that is stored in the adapter. The default font is the IBM character set, which is an ASCII character set in the low 128 codes, and a number of mathematical, greek, silly graphics, and accented characters in the upper 128 codes. This font is fixed in the MDA, Hercules and CGA adapters, but can be replaced by a user selected font for the EGA and VGA adapters. .PP A number of control characters and escape sequences are implemented by the driver. The result is upward compatible with the ANSI standard terminal. The .BR termcap (5) type is .BR minix . Normal characters written to the console are displayed at the cursor position and the cursor is advanced one column to the right. If an entire line is filled then the cursor wraps to the first column of the next line when the next character must be displayed. The screen is scrolled up if needed to start a new line. Some characters have special effects when sent to the console. Some even have arguments in the form of comma separated decimal numbers. These numbers default to the lowest possible value when omitted. The top-left character is at position (1, 1). The following control characters and escape sequences are implemented by the console: .PP .ta +10n +20n Sequence Name Function .in +31n .ti -30n ^@ Null Ignored (padding character) .ti -30n ^G Bell Produce a short tone from the speaker .ti -30n ^H Backspace Move the cursor back one column, wrapping from the left edge up one line to the right edge .ti -30n ^I Horizontal Tab Move to the next tab stop, with each tab stop at columns 1, 9, 25, etc. Wrap to the next line if necessary. .ti -30n ^J Line Feed Move one line down, scrolling the screen up if necessary .ti -30n ^K Vertical Tab Same as LF .ti -30n ^L Form Feed Same as LF .ti -30n ^M Carriage Return Move to column 1 .ti -30n ^[ Escape Start of an escape sequence .ti -30n ^[M Reverse Index Move one line up, scrolling the screen down if necessary .ti -30n ^[[\fIn\fPA Cursor Up Move the cursor up \fIn\fP lines .ti -30n ^[[\fIn\fPB Cursor Down Move the cursor down \fIn\fP lines .ti -30n ^[[\fIn\fPC Cursor Forward Move the cursor right \fIn\fP columns .ti -30n ^[[\fIn\fPD Cursor Backward Move the cursor left \fIn\fP columns .ti -30n ^[[\fIm\fP;\fIn\fPH Cursor Position Move the cursor to line \fIm\fP, column \fIn\fP .ti -30n ^[[\fIs\fPJ Erase in Display Clear characters as follows: .br \fIs\fP = 0: From cursor to end of screen .br \fIs\fP = 1: From start of screen to cursor .br \fIs\fP = 2: Entire screen .ti -30n ^[[\fIs\fPK Erase in Line Clear characters as follows: .br \fIs\fP = 0: From cursor to end of line .br \fIs\fP = 1: From start of line to cursor .br \fIs\fP = 2: Entire line .ti -30n ^[[\fIn\fPL Insert Lines Insert \fIn\fP blank lines .ti -30n ^[[\fIn\fPM Delete Lines Delete \fIn\fP lines .ti -30n ^[[\fIn\fP@ Insert Characters Insert \fIn\fP blank characters .ti -30n ^[[\fIn\fPP Delete Characters Delete \fIn\fP characters .ti -30n ^[[\fIn\fPm Character Attribute Set character attribute as follows: .br \fIn\fP = 0: Normal (default) attribute .br \fIn\fP = 1: Bold (high intensity fg colour) .br \fIn\fP = 4: Underline (mono) / Cyan (colour) .br \fIn\fP = 5: Blinking .br \fIn\fP = 7: Reverse Video .br \fIn\fP = 30: Black foreground colour .br \fIn\fP = 31: Red .br \fIn\fP = 32: Green .br \fIn\fP = 33: Brown .br \fIn\fP = 34: Blue .br \fIn\fP = 35: Magenta .br \fIn\fP = 36: Cyan .br \fIn\fP = 37: Light Gray .br \fIn\fP = 39: Default fg colour (lt gray) .br \fIn\fP = 40\-47: Same for background colour .br \fIn\fP = 49: Default bg colour (black) .br Note: The "bold" versions of black, brown and lt gray become dark gray, yellow and white. .in -31n .PP The console device implements the following ioctl to copy a font into font memory on EGA and VGA adapters: .PP .RS .BI "ioctl(" fd ", TIOCSFON, u8_t " font "[256][32]);" .RE .PP Font memory consists of 256 character definitions of 32 lines per character and 8 pixels per line. The first line is the topmost line of the character. The leftmost pixel is lit if the most significant bit of a line is set, etc. How many lines are used depends on the current video mode. The 80x25 video mode used by Minix has an 8x16 character cell, 80x28 has 8x14 characters, and 132x43 or 132x50 has 8x8 characters. The boot variable .B console is used by both the Boot Monitor and the console driver to set the video mode, software scrolling on/off, and VGA screen blank timeout. See .BR boot (8). .SS "The Keyboard" The keyboard produces key codes for each key that is pressed. These keys are transformed into character codes or sequences according to the current keyboard translation table. The format of this table is described in .BR keymap (5). The character codes can be read from the console device unless they map to special hotkeys. The hotkeys are as follows: .PP .ta +17n Name Key Function .in +18n .ti -17n CTRL\-ALT\-DEL Send an abort signal to process 1 (init). Init then halts the system .ti -17n CTRL\-ALT\-KP-. Likewise for keypad period .ti -17n F1 Process table dump .ti -17n F2 Show memory map .ti -17n F3 Toggle software/hardware scrolling .ti -17n F5 Show network statistics .ti -17n CTRL\-F7 Send a quit signal to all processes connected to the console .ti -17n CTRL\-F8 Send an interrupt signal .ti -17n CTRL\-F9 Send a kill signal. If CTRL\-F8 or CTRL\-F7 don't get 'em, then this surely will. These keys are for disaster recovery. You would normally use DEL and CTRL\-\e to send interrupt and quit signals. .\" .ig VC .ti -17n ALT\-F1 Select virtual console 0 (/dev/console) .ti -17n ALT\-F2 Select virtual console 1 (/dev/ttyc1) .ti -17n ALT\-F(\fIn\fP+1) Select virtual console \fIn\fP (/dev/ttyc\fIn\fP) .ti -17n AL##T\-Left Select previous virtual console .ti -17n ALT\-Right Select next virtual console .\" .. .in -18n .PP .\"XXX The keyboard map is set with the .B KIOCSMAP ioctl whose precise details are currently hidden in the .B loadkeys utility. .SS "Log device" The .B log device can be used by processes to print debug messages onto the console. The console is a terminal type device, so it is taken from processes when a session leader exits. This does not happen with the log device. .SH "SEE ALSO" .BR tty (4), .BR loadkeys (1), .BR keymap (5), .BR boot (8). .SH NOTES Output processing turns Line Feeds into CR LF sequences. Don't let this surprise you. Either turn off output processing or use one of the synonyms for LF. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" minor editing of man page by asw 07.08.96 .TH DEV 4 .SH NAME dev \- device files in /dev .SH DESCRIPTION Device files are the eyes and ears of the system. Through the device files one has access to the disks, terminals and other parts of the machine. Single bytes or disk blocks may be transferred to or from a device with ordinary .BR read (2) or .BR write (2) calls, byte positions set with .BR lseek (2), or more complicated control functions performed with .BR ioctl(2). .PP Device files as found in .B /dev have several attributes that must be considered. Here are two examples as .B "ls \-l" shows them: .PP .RS .nf .if t .ft C brw-rw-rw- 1 root operator 2, 1 Jun 10 1995 fd1 crw--w---- 1 kjb tty 4, 0 May 11 09:41 console .if t .ft P .fi .RE .PP Most attributes are the same as for a regular file and have the same function. The file type and the major and minor device numbers are special to devices. .PP Character devices are marked with a .B c as a file type letter. Any I/O on a character device is sent down to the device driver without any interpretation. This means that a process doing the I/O must know the characteristics of the device and deal with them appropriately. .PP Block devices provoke the file system server into buffering the data on those devices. Data read or written by processes is passed through the file system block cache. Unaligned bytes read or written are extracted or reassembled by the file server from or to whole blocks in the cache. The file server transfers data to or from the device driver as blocks to positions at block size boundaries. These blocks are Minix blocks of 1024 bytes, disk devices usually have a 512 byte block size. Only block devices can be mounted as part of the file system tree if they contain a Minix file system. .PP The major device number (2 for .B fd1 and 4 for .BR console ) are used by FS to find the device driver that manages a device. The minor device number (1 for .B fd1 and 0 for .BR console ) is passed to the driver to select a device among a number of related devices that are all managed by that driver. The device drivers are usually kernel tasks under Minix, small processes that are contained within the address space of the kernel. The following tasks and associated devices exist: .SS "Memory (major 1)" The .BR ram , .BR mem , .BR kmem , and .BR null devices are managed by the memory task. The .B ram device is a block device for a chunk of memory that is the RAM disk. Any byte read from or written to the .B ram device is copied from or to that memory chunk. The .B mem device is a character device for the entire address space of the system, but .B kmem only for the kernel data area. These two devices allow programs like .BR ps (1) to hunt around the system looking for interesting bits. The .B null device is a data sink. It happily swallows any bytes written to it, and returns nothing on a read. .SS "Floppy disk (major 2)" The .BR fd0 , .BR fd0p0 , .BR fd0p1 , .BR fd0p2 , and .BR fd0p3 block devices are the first floppy disk and the four partitions that may exist on a that floppy disk. Likewise are .BR fd1 and .BR fd1p[0\-3] the device and partitions for the second floppy disk. The floppy disk devices are described in detail in .BR fd (4). Partitioning in general is explained in .BR controller (4). .SS "Controller 0 (major 3)" The first hard disk on controller 0 can be accessed by block device .BR c0d0 . This device addresses the entire hard disk from the first to the last sector. A hard disk is normally partitioned in up to four primary partitions, .BR c0d0p0 , .BR c0d0p1 , .BR c0d0p2 , and .BR c0d0p3 . Each of these devices accesses a range of sectors on the .B c0d0 device. It is customary to give each operating system on a disk a primary partition. So the Windows C: "drive" can be on .BR c0d0p0 , and Minix can be on .BR c0d0p1 . Minix wants to have several partitions on its own, so .B c0d0p1 can be further subdivided into the subpartitions .BR c0d0p1s0 , .BR c0d0p1s1 , .BR c0d0p1s2 , and .BR c0d0p1s3 . .B /dev contains devices for the first and second hard disk .RB ( c0d0 and .BR c0d1 ), their primary partitions .RB ( c0d[01]p[0\-3] ) and subpartitions thereof .RB ( c0d[01]p[0\-3]s[0\-3] ). More detail can be found in .BR controller (4). .SS "Terminals (minor 4)" The TTY driver manages the system console device, aptly named .BR console , the serial lines, .BR tty00 and .BR tty01 , and the pseudo ttys. Through the console device one can display characters on a screen attached to a monochrome, Hercules, color, or VGA adapter. The .BR ttyc1 , .BR ttyc2 , etc. devices are the so-called "virtual consoles" that share the one console display. One can select which virtual console is to be visible on the screen and take input from the keyboard. To allow remote login the devices with minor numbers of 128 or higher offer virtual terminals. These pseudo ttys come in tty, pty pairs that form a pipe between processes running under the tty, and a controlling process attached to the pty side. See also .BR console (4), and .BR tty (4). .SS "Anonymous TTY (major 5)" This is just one device named .BR tty that is a synonym for the controlling tty of a process. This device is not managed by any device driver, but is handled by FS itself. A process can get access to the terminal it is running under by using .BR /dev/tty . .SS "Line printer (major 6)" The .B lp device sends any bytes written to it to the printer. .SS "TCP/IP (major 7)" The TCP/IP task is not a kernel task, but a server like MM and FS. It sits between FS and the DP8390 task that manages the ethernet boards. Together they implement the TCP/IP protocol. See also .BR ip (4). .SS "Controller 1 (major 8)" Like controller 0 (major 3), but managing a second controller with devices .BR /dev/c1* . .SS "Controller 2 (major 10)" Like controller 0. .SS "Controller 3 (major 12)" Like controller 0. .SS "Audio (major 13)" The .B audio device can be used to produce or record air vibrations using a Soundblaster 16 type audio card. See .BR audio (4). .SS "Mixer (major 14)" The .B mixer device is used to control the audio driver. .SH FILES .TP 10 .B /dev/* All Minix devices .SH "SEE ALSO" .BR read (2), .BR write (2), .BR lseek (2), .BR ioctl (2), .BR console (4), .BR fd (4), .BR controller (4), .BR ip (4), .BR tty (4), .BR MAKEDEV (8). .SH DIAGNOSTICS There are five prominent errors that processes accessing device files may provoke: .IP "ENODEV \- No such device" 5 There is no driver managing the device class this device belongs to. Either the driver is configured out, or it is not loaded (inet). .IP "ENXIO \- No such device or address" This device is not available. Either the driver does not support it at all, or the hardware isn't available, i.e. accessing the second disk on a system with only one disk. .IP "EACCES \- Permission denied" This error may cause a lot of head scratching if .B ls \-l shows a device file to be writable. The media you are trying to access is simply physically write protected! .IP "EINVAL \- Invalid argument" Devices may not like reads or writes that are not block multiples, or very big transfers, etc. The device manual page should list the limits. .IP "EIO \- I/O error" This may be a real I/O error, i.e. a read or write on the device failing due to a media error. But it may also be the result of an operation that a device can't do, or an empty tape drive, etc. .SH NOTES Some devices are not present by default. The .BR MAKEDEV script knows how to make them. .SS "MS-DOS/Windows equivalents" The names of MS-DOS/Windows devices probably map to Minix devices as follows: .PP .RS .nf .ta +\w'COM1mmm'u +\w'c0d1, c0d2, c0d3mmm'u A: fd0 B: fd1 C: c0d0p0 (usually the first partition) D: c0d1p0, c0d2p0 (if it's another disk) D: c0d0p1s0 (if it's an extended partition) D: c0d1, c0d2, c0d3 (if it's a CD-ROM) CON console COM1 tty00 (UNIX counts from 0) LPT1 lp .fi .RE .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) #.TH FD 4 .SH NAME fd \- floppy disk .SH DESCRIPTION The .B fd* devices refer to the Floppy disk driver using the NEC PD765 floppy disk controller. These diskettes are arrays of 512 byte sectors, although Minix always works with two sectors at a time due to its 1024 byte block size. You can read or write any number of bytes however, Minix takes care of cutting and pasting incomplete blocks together. .PP The driver is normally configured for two floppy disk devices .B fd0 and .BR fd1 . It can handle two more, but it is unlikely that the average PC can. .PP On the first access to an .B fd device (by .BR open (2) or .BR mount (2)), the driver will execute a series of read tests to determine the floppy type. This works ok for all floppy types except the true 360k type, because it is indistinguishable from the 720k type. This only means that the size of the floppy is not estimated right. .PP Bits 2\-6 of the minor device number may be set to the floppy disk type to make it known to the driver what type of diskette it is reading or writing. The non-auto devices should be used for formatting, or when one wants to be absolutely sure that the device is accessed right. These devices exist for drive 0: .sp .nf .ta +4n +7n +9n +8n type device minor media .ta +5n +7n +9n +7n 0 fd0 0 autodetect 1 pc0 4 360k, 5.25" 2 at0 8 1.2M, 5.25" 3 qd0 12 360k in a 720k, 5.25" drive 4 ps0 16 720k, 3.5" 5 pat0 20 360k in a 1.2M, 5.25" drive 6 qh0 24 720k in a 1.2M, 5.25" drive 7 PS0 28 1.44M, 3.5" .fi .DT .PP Type 4 may also be used for the rarely seen 720k, 5.25" floppies (type 2 made them obsolete fast.) Note that these "types" only describe the floppies from a software point of view, type 1 and 4 drives use the same parameters. .PP If the format bit (bit 7) is set, then the driver interprets write commands as track formatting requests. This is used by the .BR format (1) command. .PP If the type bits are set to 28, 29, 30, or 31, then the driver uses a partition table found in sector 0 to partition the floppy. The partitions of .B fd0 may be accessed as .B fd0p0 through .BR fd0p3 . See .BR controller (4) for a description of the partition table, and associated ioctl commands. .SH FILES /dev/fd[0\-3], /dev/pc[0\-3], /dev/at[0\-3], /dev/qd[0\-3], /dev/ps[0\-3], /dev/pat[0\-3], /dev/qh[0\-3], /dev/PS[0\-3], /dev/fd[0\-3]p[0\-3] .SH "SEE ALSO" .BR format (1), .BR controller (4), .BR part (8). .SH BUGS The driver does not know the size of a 360k diskette in a 360k 5.25" drive, because it uses the 720k parameters for it. So it will happily try to read past the end making all kinds of interesting noises. It's a good thing these drives are practically obsolete. .PP The partition table is only read when the drive motor is off and only for an auto or partition device. The driver assumes that a floppy in a drive with a running motor can't have been replaced all of a sudden. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" Copyright 1994 Vrije Universiteit, The Netherlands. .\" For full copyright and restrictions on use see the file COPYRIGHT in the .\" top level of the Amoeba distribution. .\" .ig Software: Philip Homburg, 1991 Document: Philip Homburg, Sept 3, 1991 Modified: Greg Sharp and Philip Homburg, March 1992 - merged with udp(L) and made a little more complete. Greg Sharp, April 1992 - updated keywords for auto index generation Modified: Kees J. Bot, June 1994 - changed to man(7) format for Minix. .. .TH IP 4 .SH NAME ip, eth, psip, udp, tcp \- Internet Protocol server devices and definitions .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .BR ip* , .BR eth* , .BR psip* , .BR tcp* , and .B udp* devices give access to the Internet Protocol (IP) services in Minix. There can be up to 16 different networks, with 4 network devices each (a network has either an .B eth* or a .B psip* device, not both.) The .B * in the device names is a decimal number, so one may see names from .B ip0 to .BR ip15 . A program scanning all networks must try all 16, and not stop if one in between is missing. One network is the default network. Its devices are linked to names without numbers. .PP The .B eth* and .B psip* devices give direct access to the network packets at the lowest level. The .BR ip* , .BR tcp* , and .B udp* devices give access to IP, TCP, or UDP services. .PP Most programs that use TCP/IP use code like the following to access the proper devices: .PP .RS .nf if ((tcp_device= getenv("TCP_DEVICE")) == NULL) tcp_device= "/dev/tcp"; .fi .RE .PP The low level networking programs such as .BR ifconfig (8) also have options to select the device they are working with. The convention is: .PP .RS .BI ETH_DEVICE= device .br .BI -E " device" .RS Device to use as raw ethernet device instead of the default /dev/eth. .RE .SP .BI PSIP_DEVICE= device .br .BI -P " device" .RS Pseudo IP device to use instead of .BR /dev/psip . .RE .SP .BI IP_DEVICE= device .br .BI -I " device" .RS IP device to use instead of .BR /dev/ip . .RE .SP .BI TCP_DEVICE= device .br .BI -T " device" .RS TCP device to use instead of .BR /dev/tcp . .RE .SP .BI UDP_DEVICE= device .br .BI -U " device" .RS UDP device to use instead of .BR /dev/udp . .RE .RE .SS Programming Access to the IP services is provided using filedescriptors to open IP devices. These open IP channels can be configured with .BR ioctl (2) calls, and data can be transferred by calls to .BR read (2), and .BR write (2). .SS "Types (general)" .IP .br Defines .BR u8_t , .BR u16_t , .B u32_t and .B i32_t (and .BR U8_t , .BR U16_t , .B U32_t and .B I32_t for use in prototypes). .SS "Types (eth)" .IP .br Defines struct ether_addr (\fBether_addr_t\fP) and .B ether_type_t and .B Ether_type_t for use in prototypes. .IP .br Defines struct nwio_ethopt (\fBnwio_ethopt_t\fP) and struct nwio_ethstat (\fBnwio_ethstat_t\fP) .IP .br Defines struct eth_hdr (\fBeth_hdr_t\fP) .SS "Types (psip)" .IP .br [[[No description available yet.]]] .IP .br [[[No description available yet.]]] .SS "Types (ip)" .IP .br Defines .BR ipaddr_t , .BR ipproto_t and struct ip_hdropt (\fBip_hdropt_t\fP). .IP .br Defines struct nwio_ipconf (\fBnwio_ipconf_t\fP) and struct nwio_ipopt (\fBnwio_ipopt_t\fP) .IP .br Defines struct ip_hdr (\fBip_hdr_t\fP) .IP .br Defines struct nwio_route (\fBnwio_route_t\fP) .SS "Types (tcp)" .IP .br Defines .B tcpport_t and .B Tcpport_t for use in prototypes. .IP .br Defines struct nwio_tcpconf (\fBnwio_tcpconf_t\fP), struct nwio_tcpcl (\fBnwio_tcpcl_t\fP), struct nwio_tcpatt (\fBnwio_tcpatt_t\fP) and struct nwio_tcpopt (\fBnwio_tcpopt_t\fP). .IP .br Defines struct tcp_hdr (\fBtcp_hdr_t\fP) and struct tcp_hdropt (\fBtcp_hdropt_t\fP). .SS "Types (udp)" .IP .br Defines .B udpport_t and .B Udpport_t for use in prototypes. .IP .br Defines struct nwio_udpopt (\fBnwio_udpopt_t\fP). .IP .br Defines struct udp_hdr (\fBudp_hdr_t\fP) and struct udp_io_hdr (\fBudp_io_hdr_t\fP). .SS "Byte Order Conversion" All 16-bit and 32-bit quantities in IP headers must be in network byte order. The macros described in .BR hton (3) can be used to convert these values to and from the byte order used by the host machine. .SS "The Internet Checksum" The .B oneC_sum function (see .BR oneC_sum (3)) is used to calculate the one's complement checksum needed for IP network packets. .SS "General Functions" .PP .ft B \fIfd\fP = open(\fItcpip_device\fP, O_RDWR) .ft R .PP This is how one normally obtains a filedescriptor for a new TCP/IP channel. .I tcpip_device names one of the TCP/IP devices. The channel may be used both to send or to receive data. .PP .ft B \fIn\fP = read(\fIfd\fP, \fIbuf\fP, \fIsize\fP) .ft R .PP Receives one packet (low level devices) or a number of bytes (TCP stream). Returns the the number of bytes placed into .IR buf , or returns -1 with an error code placed into .BR errno . .PP .ft B \fIn\fP = write(\fIfd\fP, \fIbuf\fP, \fIsize\fP) .ft R .PP Sends one packet (low level devices) or a number of bytes (TCP stream). Returns .I size or -1 with the error code placed into .BR errno . The TCP/IP .B read and .B write functions behave like reads and writes on pipes when it comes to signals. .SS "ETH Functions" .PP .ft B ioctl(\fIfd\fP, NWIOGETHSTAT, &struct nwio_ethstat) .ft R .PP The .B NWIOGETHSTAT ioctl returns the Ethernet address and some statistics of the Ethernet server of the channel .IR fd . The result is returned in the nwio_ethstat structure. The \fBstruct nwio_ethstat\fP is defined in : .PP .RS .nf .if t .ft C typedef struct nwio_ethstat { ether_addr_t nwes_addr; eth_stat_t nwes_stat; } nwio_ethstat_t; .SP typedef struct eth_stat { unsigned long ets_recvErr, /* # receive errors */ ets_sendErr, /* # send error */ ets_OVW, /* # buffer overwrite warnings, (packets arrive faster than can be processed) */ ets_CRCerr, /* # crc errors of read */ ets_frameAll, /* # frames not aligned (# bits not a multiple of 8) */ ets_missedP, /* # packets missed due to too slow packet processing */ ets_packetR, /* # packets received */ ets_packetT, /* # packets transmitted */ ets_transDef, /* # transmission deferred (there was a transmission of an other station in progress */ ets_collision, /* # collisions */ ets_transAb, /* # transmissions aborted due to excessive collisions */ ets_carrSense, /* # carrier sense lost */ ets_fifoUnder, /* # fifo underruns (processor is too busy) */ ets_fifoOver, /* # fifo overruns (processor is too busy) */ ets_CDheartbeat, /* # times unable to transmit collision signal */ ets_OWC; /* # times out of window collision */ } eth_stat_t; .if t .ft R .fi .RE .PP .ft B ioctl(\fIfd\fP, NWIOSETHOPT, &struct nwio_ethopt) .ft R .PP Before an Ethernet channel can be used to send or receive Ethernet packets, it has to be configured using the .B NWIOSETHOPT ioctl. The structure .B nwio_ethopt is defined in : .PP .RS .nf .if t .ft C typedef struct nwio_ethopt { u32_t nweo_flags; ether_addr_t nweo_multi, nweo_rem; ether_type_t nweo_type; } nwio_ethopt_t; .SP #define NWEO_NOFLAGS 0x0000L #define NWEO_ACC_MASK 0x0003L # define NWEO_EXCL 0x00000001L # define NWEO_SHARED 0x00000002L # define NWEO_COPY 0x00000003L #define NWEO_LOC_MASK 0x0010L # define NWEO_EN_LOC 0x00000010L # ############################### define NWEO_DI_LOC 0x00100000L #define NWEO_BROAD_MASK 0x0020L # define NWEO_EN_BROAD 0x00000020L # define NWEO_DI_BROAD 0x00200000L #define NWEO_MULTI_MASK 0x0040L # define NWEO_EN_MULTI 0x00000040L # define NWEO_DI_MULTI 0x00400000L #define NWEO_PROMISC_MASK 0x0080L # define NWEO_EN_PROMISC 0x00000080L # define NWEO_DI_PROMISC 0x00800000L #define NWEO_REM_MASK 0x0100L # define NWEO_REMSPEC 0x00000100L # define NWEO_REMANY 0x01000000L #define NWEO_TYPE_MASK 0x0200L # define NWEO_TYPESPEC 0x00000200L # define NWEO_TYPEANY 0x02000000L #define NWEO_RW_MASK 0x1000L # define NWEO_RWDATONLY 0x00001000L # define NWEO_RWDATALL 0x10000000L .if t .ft R .fi .RE .PP The configuration is divided in a number of section (covered by the xx_MASK macros). Options can be set in the .B nweo_flags field. The first section (\fBNWEO_ACC_MASK\fP) controls the access to a certain Ethernet packet type. If .B NWEO_EXCL is selected then this is the only channel that can send or receive Ethernet packets of the selected type. If .B NWEO_SHARED is selected then multiple channels (which all have to select .BR NWEO_SHARED ) can use the same Ethernet type, they all can send packets but incoming packets will be delivered to at most one of them. If .B NWEO_COPY is selected then multiple channels have access to the same Ethernet type and all receive a copy of an incoming packet. .LP The .B NWEO_LOC_MASK flags control the delivery of packets with a destination address equal to the Ethernet address of the machine. If .B NWEO_EN_LOC is selected then these packets will be delivered and with .B NWEO_DI_LOC they will be discarded. .PP .BR NWEO_BROAD_MASK , .BR NWEO_MULTI_MASK , and .B NWEO_PROMISC_MASK do the same to broadcast packets, multicast packets and promiscuous mode packets as .B NWEO_LOC_MASK does for local packets. Except that the precise multicast address is taken from the \fBnweo_multi\fP field. .LP The .B NWEO_REM_MASK flags control whether communication is restricted to single destination or not. .B NWEO_REMSPEC restricts sending and receiving of packets to the single remote computer specified in the \fBnweo_rem\fP field. .B NWEO_REMANY allows sending to and receiving from any remote computer. .PP .B NWEO_TYPESPEC restricts sending and receiving of packets to the type specified in \fBnweo_type\fP. The type has to be in network byte order (using .BR hton (3)). .B NWEO_TYPEANY allows any type. .PP If the Ethernet header is completely specified by the .B nweo_flags i.e., all of .BR NWEO_EN_LOC , .BR NWEO_DI_BROAD , .BR NWEO_DI_MULTI , .BR NWEO_DI_PROMISC , .BR NWEO_REMSPEC and .B NWEO_TYPESPEC are specified, then .B NWEO_RWDATONLY can be used to send and receive only the data part of an Ethernet packet. If .B NWEO_RWDATALL is specified then both Ethernet header and data are used. .SS "PSIP Functions" .PP [[[No description available yet.]]] .SS "IP Functions" .PP .ft B ioctl(\fIfd\fP, NWIOGIPCONF, &struct nwio_ipconf) .ft R .PP The .B NWIOGIPCONF ioctl reports the Internet Address and the netmask. For the \fInwio_ipconf\fP structure see the \fBNWIOSIPCONF\fP ioctl below. .PP .ft B ioctl(\fIfd\fP, NWIOGIPOROUTE, &struct nwio_route) .ft R .PP The .B NWIOGIPOROUTE ioctl can be used to query an IP server about its routing table. [[[NWIODIPOROUTE, NWIOGIPIROUTE, NWIODIPIROUTE?]]] The structure \fBnwio_route\fP is defined in : .PP .RS .nf .if t .ft C typedef struct nwio_route { u32_t nwr_ent_no; u32_t nwr_ent_count; ipaddr_t nwr_dest; ipaddr_t nwr_netmask; ipaddr_t nwr_gateway; u32_t nwr_dist; u32_t nwr_flags; u32_t nwr_pref; } nwio_route_t; .SP #define NWRF_EMPTY 0 #define NWRF_INUSE 1 #define NWRF_FIXED 2 .if t .ft R .fi .RE .PP The requested entry is taken from \fBnwr_ent_no\fP. Entries are counted from 0, so the value 0 can be used for an initial query. The size of the routing table is returned in \fBnwr_ent_count\fP. The \fBnwr_flags\fP indicates if the entry is in use (\fBNWRF_INUSE\fP) and if the entry was inserted manually (using \fBNWIOSIPOROUTE\fP) or generated by the IP server itself. The route is described by .BR nwr_dest , .BR nwr_netmask , .BR nwr_gateway , .BR nwr_dist , and .BR nwr_pref . \fBNwr_dest\fP and \fBnwr_netmask\fP select the destination addresses. A value of 0.0.0.0 (0x0) in both \fBnwr_dest\fP and \fBnwr_netmask\fP means every host. A value of 255.255.255.255 (0xffffffff) in \fBnwr_netmask\fP means a single host. Other values of \fBnwr_netmask\fP are netmasks for the network specified by \fBnwr_dest\fP. \fBNwr_gateway\fP is gateway that should be used. \fBNwr_dist\fP is a minimal distance. Packets with a time to live smaller than \fBnwr_dist\fP will not reach the destination. If two routes have equal netmask and distance fields but different gateways then the gateway with highest value in \fBnwr_pref\fP is used. .PP .ft B ioctl(\fIfd\fP, NWIOSIPCONF, &struct nwio_ipconf) .ft R .PP The .B NWIOSIPCONF ioctl can be used to inform the IP server about its Internet Address and/or its netmask. Normally an IP server will discover its Internet Address using the RARP protocol. .B NWIOSIPCONF can be used in the case that the RARP failed, or the netmask has to be changed. Note that higher level protocols (TCP and UDP) assume that the Internet Address of an IP device does not change, therefore TCP and UDP stop functioning if the Internet Address is changed. .PP The structure \fBnwio_ipconf\fP is defined in : .PP .RS .nf .if t .ft C typedef struct nwio_ipconf { u32_t nwic_flags; ipaddr_t nwic_ipaddr; ipaddr_t nwic_netmask; } nwio_ipconf_t; .SP #define NWIC_NOFLAGS 0x0 #define NWIC_FLAGS 0x3 # define NWIC_IPADDR_SET 0x1 # define NWIC_NETMASK_SET 0x2 .if t .ft R .fi .RE .PP The function of \fBnwio_ipconf\fP depends on the value of \fBnwic_flags\fP. If .B NWIC_IPADDR_SET is set then the Internet Address will be set to \fBnwic_ipaddr\fP. If .B NWIC_NETMASK_SET is set then the Internet Address will be set to \fBnwic_netmask\fP. .PP .ft B ioctl(\fIfd\fP, NWIOSIPOPT, &struct nwio_ipopt) .ft R .PP Before an IP channel can be used, it has to be configured using the .B NWIOSIPOPT ioctl. The structure \fBnwio_ipopt\fP is defined in : .PP .RS .nf .if t .ft C typedef struct nwio_ipopt { u32_t nwio_flags; ipaddr_t nwio_rem; ip_hdropt_t nwio_hdropt; u8_t nwio_tos; u8_t nwio_ttl; u8_t nwio_df; ipproto_t nwio_proto; } nwio_ipopt_t; .SP #define NWIO_NOFLAGS 0x0000L #define NWIO_ACC_MASK 0x0003L # define NWIO_EXCL 0x00000001L # define NWIO_SHARED 0x00000002L # define NWIO_COPY 0x00000003L #define NWIO_LOC_MASK 0x0010L # define NWIO_EN_LOC 0x00000010L # define NWIO_DI_LOC 0x00100000L #define NWIO_BROAD_MASK 0x0020L # define NWIO_EN_BROAD 0x00000020L # define NWIO_DI_BROAD 0x00200000L #define NWIO_REM_MASK 0x0100L # define NWIO_REMSPEC 0x00000100L # define NWIO_REMANY 0x01000000L #define NWIO_PROTO_MASK 0x0200L # define NWIO_PROTOSPEC 0x00000200L # define NWIO_PROTOANY 0x02000000L #define NWIO_HDR_O_MASK 0x0400L # define NWIO_HDR_O_SPEC 0x00000400L # define NWIO_HDR_O_ANY 0x04000000L #define NWIO_RW_MASK 0x1000L # define NWIO_RWDATONLY 0x00001000L # define NWIO_RWDATALL 0x10000000L .if t .ft R .fi .RE .PP The options are divided in several categories: .BR NWIO_ACC_MASK , .BR NWIO_LOC_MASK , .BR NWIO_BROAD_MASK , .BR NWIO_REM_MASK , .BR NWIO_PROTO_MASK , .B NWIO_HDR_O_MASK and .BR NWIO_RW_MASK . A channel is configured when one option of each category is set. .PP The options covered by .B NWIO_ACC_MASK control the number of channels that can use one IP protocol. If .B NWIO_EXCL is specified then only that channel can use a certain IP protocol. If .B NWIO_SHARED then multiple channels that all have to specify .B NWIO_SHARED can use the same IP protocol, but incoming packets will be delivered to a most one channel. .B NWIO_COPY does not impose any restrictions. Every channel gets a copy of an incoming packet. .PP .B NWIO_LOC_MASK and .B NWIO_BROAD_MASK control the delivery of packets. If .B NWIO_EN_LOC is specified then packets that are explicitly send to the IP server are delivered. If .B NWIO_EN_BROAD is specified then broadcast packets are delivered. Either one or both of them can be disabled with .B NWIO_DI_LOC and .BR NWIO_DI_BROAD . .PP .B NWIO_REMSPEC can be used to restrict communication to one remote host. This host is taken from the \fBnwio_rem\fP field. If any remote host is to be allowed then .B NWIO_REMANY can be used. .PP .B NWIO_PROTOSPEC restricts communication to one IP protocol, specified in \fBnwio_proto\fP. .B NWIO_PROTOANY allows any protocol to be sent or received. .PP .B NWIO_HDR_O_SPEC specifies all IP header options in advance. The values are taken from .BR nwio_hdropt , .BR nwio_tos , .BR nwio_ttl , and .BR nwio_df . \fBNwio_hdropt\fP specifies the IP options that should be present in an outgoing packet. \fBIp_hdropt_t\fP is defined in : .PP .RS .nf .if t .ft C typedef struct ip_hdropt { u8_t iho_opt_siz; u8_t iho_data[IP_MAX_HDR_SIZE-IP_MIN_HDR_SIZE]; } ip_hdropt_t; .if t .ft R .fi .RE .PP The bytes of size \fBiho_opt_siz\fP in \fBiho_data\fP are appended to the IP header. \fBNwio_tos\fP specifies the value of the ``type of service'' bits, \fBnwio_ttl\fP gives the value of the ``time to live'' field and \fBnwio_df\fP specifies whether fragmentation is disallowed or not. .B NWIO_HDR_O_ANY specifies that the header options should be specified at each write request. .PP .B NWIO_RWDATONLY specifies that the header should be omitted from a write request. This option can only be used when all header fields are specified in previous options: .BR NWIO_EN_LOC , .BR NWIO_DI_BROAD , .BR NWIO_REMSPEC , .B NWIO_PROTOSPEC and .BR NWIO_HDR_O_SPEC . A read operation will also only return the data part, so the IP options will be lost. .PP .ft B ioctl(\fIfd\fP, NWIOSIPOROUTE, &struct nwio_route) .ft R .PP The .B NWIOSIPOROUTE ioctl adds a route to the routing table. See \fBNWIOGIPOROUTE\fP above for a description of the \fBnwio_route\fP structure. The fields \fBnwr_ent_no\fP and \fBnwr_ent_count\fP are ignored. .SS "TCP Functions" .PP .ft B ioctl(\fIfd\fP, NWIOTCPCONN, &struct nwio_tcpcl) .ft R .PP The .B NWIOTCPCONN ioctl tries to setup a connection with a remote TCP/IP server. The channel must be fully configured (see .BR NWIOSTCPCONF ) and values for the local port, the remote port and the remote address have be specified using .B NWTC_LP_SET or .BR NWTC_LP_SEL , .B NWTC_SET_RA and .BR NWTC_SET_RP . The struct nwio_tcpcl is defined in as: .PP .RS .nf .if t .ft C typedef struct nwio_tcpcl { long nwtcl_flags; long nwtcl_ttl; } nwio_tcpcl_t; .if t .ft R .fi .RE .PP Set the .B nwtcl_flags field to zero before the connect or listen call. [[[Further explanation of nwio_tcpcl?]]] .PP .ft B ioctl(\fIfd\fP, NWIOGTCPCONF, &struct nwio_tcpconf) .ft R .PP This call reports the current configuration of a TCP channel. The .B nwtc_flags field shows the status of the .BR access , .BR locport , .B remaddr and .B remport fields. .B Nwtc_locaddr contains the Internet address of the TCP/IP server. .B Remaddr contains the Internet address of the remote TCP/IP server when set with .B NWTC_SET_RA or after a successful connect or listen (see .B NWIOTCPCONN or .BR NWIOTCPLISTEN ). .B Nwio_locport contains the local TCP/IP port set with .B NWTC_LP_SET or the selected port set with .BR NWTC_LP_SEL . .B Nwtc_remport contains the TCP port of the remote TCP/IP server as set with .B NWIO_SET_RP or after a successful connect or listen. .PP A value of 0 (zero) is reported for .BR nwtc_remaddr , .B nwtc_locport or .B nwtc_remport when no value is set either explicitly or implicitly. .PP .ft B ioctl(\fIfd\fP, NWIOTCPLISTEN, &struct nwio_tcpcl) .ft R .PP The .B NWIOTCPLISTEN ioctl waits until a remote TCP/IP server tries to connect to this channel. The channel has to be configured (see .BR NWIOSTCPCONF ). An additional restriction is that the local port must be set (with .BR NWTC_LP_SET ) or selected (with .BR NWTC_LP_SEL ). When a remote address is set only connections for that host are accepted, and when a remote port is set only connections from that port are accepted. After a successful listen .B NWIOGTCPCONF can be used to find out what the address and port of the other side are. .PP .ft B ioctl(\fIfd\fP, NWIOSTCPCONF, &struct nwio_tcpconf) .ft R .PP Before a TCP channel can be used it must configured using the .B NWIOSTCPCONF ioctl. The parameters to .B NWIOSTCPCONF are the channel file descriptor and a .B struct nwio_tcpconf as defined in : .PP .RS .nf .if t .ft C typedef struct nwio_tcpconf { u32_t nwtc_flags; ipaddr_t nwtc_locaddr; ipaddr_t nwtc_remaddr; tcpport_t nwtc_locport; tcpport_t nwtc_remport; } nwio_tcpconf_t; .SP #define NWTC_NOFLAGS 0x0000L #define NWTC_ACC_MASK 0x0003L # define NWTC_EXCL 0x00000001L # define NWTC_SHARED 0x00000002L # define NWTC_COPY 0x00000003L #define NWTC_LOCPORT_MASK 0x0030L # define NWTC_LP_UNSET 0x00000010L # define NWTC_LP_SET 0x00000020L # define NWTC_LP_SEL 0x00000030L #define NWTC_REMADDR_MASK 0x0100L # define NWTC_SET_RA 0x00000100L # define NWTC_UNSET_RA 0x01000000L #define NWTC_REMPORT_MASK 0x0200L # define NWTC_SET_RP 0x00000200L # define NWTC_UNSET_RP 0x02000000L .if t .ft R .fi .RE .PP A tcp channel is considered configured when one flag in each category has been selected. Thus one of .BR NWTC_EXCL , .B NWTC_SHARED or .BR NWTC_COPY , one of .BR NWTC_LP_UNSET , .B NWTC_LP_SET or .BR NWTC_LP_SEL , one of .B NWTC_SET_RA or .BR NWTC_UNSET_RA , and one of .B NWTC_SET_RP or .BR NWTC_UNSET_RP . .PP The acc flags control the access to a certain TCP port. .B NWTC_EXCL means exclusive access. An attempt to configure a channel will be denied if the same port is specified as that of a channel that requested exclusive access. .B NWTC_SHARED indicates that several channels use the same port but cooperate. If the shared mode is specified for one channel than all other channel that use the same port should also be configured with the .B NWTC_SHARED flag. .B NWTC_COPY is specified when the programmer does not care about other channels. This is the default. .PP The locport flags control which TCP port is used for communication. .B NWTC_LP_UNSET indicates the absence of a local port. This is the default. .B NWTC_LP_SET means that the .B nwtc_locport field contains the local port to be used by TCP. This value must be in network byte order (see .BR hton (3).) .B NWTC_LP_SEL requests the TCP server to pick a port. This port will be in the range from 32768 to 65535 and will be unique. .LP The .B remaddr flags specify which hosts are acceptable for connections. .B NWTC_SET_RA indicates that only connection to the host specified in .B nwtc_remaddr are acceptable. .B Nwtc_remaddr should be in network byte order (see .BR hton (3).) .B NWTC_UNSET_RA allows every host on the other side of a connection. This is the default. .PP The .B remport flags specify which remote ports are acceptable for connections. .B NWTC_SET_RP indicates that only the port specified in .B nwtc_remport is acceptable. .B NWTC_UNSET_RP allows every port on the other side of a connection. This is the default. .PP .ft B ioctl(\fIfd\fP, NWIOTCPSHUTDOWN) .ft R .PP The .B NWIOTCPSHUTDOWN tells the TCP/IP server that no more data will be sent over the channel specified by .IR fd . This command can be issued when the channel is connected to a remote TCP/IP server. The TCP/IP server will tell the remote TCP/IP server and the client of the remote TCP/IP server will receive an end-of-file indication. .PP .ft B ioctl(\fIfd\fP, NWIOGTCPOPT, &struct nwio_tcpopt) .br ioctl(\fIfd\fP, NWIOSTCPOPT, &struct nwio_tcpopt) .ft R .PP The behaviour of a TCP channel may be changed by setting a number of options. The TCP options can be obtained with the .B NWIOGTCPOPT ioctl and set with the .B NWIOSTCPOPT ioctl. The options are passed in a .B struct nwio_tcpopt as defined in : .PP .RS .nf .if t .ft C typedef struct nwio_tcpopt { u32_t nwto_flags; } nwio_tcpopt_t; .SP #define NWTO_NOFLAG 0x0000L #define NWTO_SND_URG_MASK 0x0001L # define NWTO_SND_URG 0x00000001L # define NWTO_SND_NOTURG 0x00010000L #define NWTO_RCV_URG_MASK 0x0002L # define NWTO_RCV_URG 0x00000002L # define NWTO_RCV_NOTURG 0x00020000L #define NWTO_BSD_URG_MASK 0x0004L # define NWTO_BSD_URG 0x00000004L #define NWTO_DEL_RST_MASK 0x0008L # define NWTO_DEL_RST 0x00000008L .if t .ft R .fi .RE .PP The .B NWTO_SND_URG option causes bytes written to the channel to be send out as urgent data. On receiving an .B EURG error the .B NWTO_RCV_URG option must be set to switch over to reading urgent data. When all urgent data has been read an .B ENOURG error will follow, indicating that the option must be cleared with .BR NWTO_RCV_NOTURG . Alas the BSD implementation of urgent data disagrees with the RFC's, so to be BSD compatible one must set the .B NWTO_BSD_URG option beforehand on a channel that is to send or receive urgent data. Given that the BSD implementation is the regarded as the TCP/IP standard one should always use the BSD style. The .B NWTO_DEL_RST option delays a failure response on a connect to the same port as the current open connection. Without this option a connect would fail if a server is not yet listening. With this option a connect will linger on until the server starts listening. This option is useful for a server that opens a connection, tells the remote end the local port number and then listens (FTP), or for a program that forks off servers for incoming connections (TELNET). A new connection may come in before a new listen can be started, so it is nice if the new connect doesn't fail. Use this option only when it is clearly needed. .SS "UDP Functions" .PP .ft B ioctl(\fIfd\fP, NWIOGUDPOPT, &struct nwio_udpopt) .ft R .PP The .B NWIOGUDPOPT ioctl returns the current options that result from the default options and the options set with .BR NWIOSUDPOPT . When .B NWUO_LP_SEL or .B NWUO_LP_SET is selected the local port is returned in .BR nwuo_locport . When .B NWUO_RP_SET is selected the remote port is returned in .BR nwuo_remport . The local address is always returned in .BR nwuo_locaddr , and when .B NWUO_RA_SET is selected the remote address is returned in .BR nwuo_remaddr . .PP .ft B ioctl(\fIfd\fP, NWIOSUDPOPT, &struct nwio_udpopt) .ft R .PP A UDP channel must be configured using the .B NWIOSUDPOPT ioctl before any data can be read or written. .B NWIOSUDPOPT takes two parameters, a file descriptor to an open UDP device and pointer to a .B nwio_udpopt structure that describes the requested configuration. The .B nwio_udpopt structure is defined in as: .PP .RS .nf .if t .ft C typedef struct nwio_udpopt { unsigned long nwuo_flags; udpport_t nwuo_locport; udpport_t nwuo_remport; ipaddr_t nwuo_locaddr; ipaddr_t nwuo_remaddr; } nwio_udpopt_t; .SP #define NWUO_NOFLAGS 0x0000L #define NWUO_ACC_MASK 0x0003L #define NWUO_EXCL 0x00000001L #define NWUO_SHARED 0x00000002L #define NWUO_COPY 0x00000003L #define NWUO_LOCPORT_MASK 0x000CL #define NWUO_LP_SEL 0x00000004L #define NWUO_LP_SET 0x00000008L #define NWUO_LP_ANY 0x0000000CL #define NWUO_LOCADDR_MASK 0x0010L #define NWUO_EN_LOC 0x00000010L #define NWUO_DI_LOC 0x00100000L #define NWUO_BROAD_MASK 0x0020L #define NWUO_EN_BROAD 0x00000020L #define NWUO_DI_BROAD 0x00200000L #define NWUO_REMPORT_MASK 0x0100L #define NWUO_RP_SET 0x00000100L #define NWUO_RP_ANY 0x01000000L #define NWUO_REMADDR_MASK 0x0200L #define NWUO_RA_SET 0x00000200L #define NWUO_RA_ANY 0x02000000L #define NWUO_RW_MASK 0x1000L #define NWUO_RWDATONLY 0x00001000L #define NWUO_RWDATALL 0x10000000L #define NWUO_IPOPT_MASK 0x2000L #define NWUO_EN_IPOPT 0x00002000L #define NWUO_DI_IPOPT 0x20000000L .if t .ft R .fi .RE .PP A UDP channel is considered configured when one flag in each category has been selected. Thus one of .BR NWUO_EXCL , .B NWUO_SHARED or .BR NWUO_COPY , one of .BR NWUO_LP_SEL , .B NWUO_LP_SET or .BR NWUO_LP_ANY , one of .B NWUO_EN_LOC or .BR NWUO_DI_LOC , one of .BR NWUO_EN_BROAD , or .BR NWUO_DI_BROAD , one of .BR NWUO_RP_SET , or .BR NWUO_RP_ANY , one of .BR NWUO_RA_SET , or .BR NWUO_RA_ANY , one of .BR NWUO_RWDATONLY , or .BR NWUO_RWDATALL , and one of .BR NWUO_EN_IPOPT , or .BR NWUO_DI_IPOPT . The acc flags control the access to a certain UDP port. .B NWUO_EXCL means exclusive access: no other channel can use this port. .B NWUO_SHARED means shared access: only channels that specify shared access can use this port and all packets that are received are handed to at most one channel. .B NWUO_COPY imposes no access restriction and all channels get a copy of every received packet for that port. .PP The .B locport flags control the selection of the UDP port for this channel. .B NWUO_LP_SEL requests the server to pick a port. This port will be in the range from 32768 to 65535 and it will be unique. .B NWUO_LP_SET sets the local port to the value of the .B nwuo_locport field. .B NWUO_LP_ANY does not select a port. Reception of data is therefore not possible but it is possible to send data. .PP The .B locaddr flags control the reception of packets. .B NWUO_EN_LOC enables the reception of packets with the local IP address as destination. .B NWUO_DI_LOC disables the reception of packet for the local IP address. .PP The .B broad flags control the reception of broadcast packets. .B NWUO_EN_BROAD enables the reception of broadcast packets and .B NWUO_DI_BROAD disables the reception of broadcast packets. .PP The .B remport flags let the client to specify one specific remote UDP port or to allow any remote port. .B NWUO_RP_SET sets the remote UDP port to the value of .BR nwuo_remport . Only packets with a matching remote port will be delivered and all packets will be sent to that port. .B NWUO_RP_ANY allows reception of packets form any port and when transmitting packets the remote port has to be specified. .PP The .B remaddr flags control the remote IP address. .B NWUO_RA_SET sets the remote IP address the value of .BR nwuo_remaddr . Only packets from that address will be delivered and all packets will be sent to that address. .B NWUO_RA_ANY allows reception of packets from any host and when transmitting packets the remote host has to be specified. .PP The .B rw flags control the format of the data to be sent or received. With .B NWUO_RWDATONLY only the data part of a UDP packet is sent to the server and only the data part is received from the server. The .B NWUO_RWDATALL mode presents the data part of a UDP packet with a header that contains the source and destination IP address, source and destination UDP ports, the IP options, etc. The server expects such a header in front of the data to be transmitted. .ig \" Some for Philip to explain properly: The header is defined in and looks like this: .PP .RS .nf .if t .ft C typedef struct udp_io_hdr { ipaddr_t uih_src_addr; ipaddr_t uih_dst_addr; udpport_t uih_src_port; udpport_t uih_dst_port; u16_t uih_ip_opt_len; u16_t uih_data_len; } udp_io_hdr_t; .if t .ft R .fi .RE .PP The first four fields are the source and destination IP addresses and ports. .B Uih_ip_opt_len is ???. .B Uih_data_len should equal the length of the packet data (packet lenght minus the header.) ??? .. .PP The .B ipopt flags control the delivery and transmission of IP options. When .B NWUO_EN_IPOPT is set IP, options will be delivered and sent. When .B NWUO_DI_IPOPT is set IP option will be stripped from received packets and no IP options will be sent. .ig \" Minix doesn't have this stuff (yet? ever?) .SS "UDP Library Functions" .PP The following routines provide an somewhat easier to use interface to UDP than the routines described above (\fBtcpip_open\fP, \fBudp_ioc_setopt\fP, \fBtcpip_read\fP and \fBtcpip_write\fP). .LP .sC errstat udp_connect(udp_cap, chan_cap, srcport, dstport, dstaddr, flags) capability *udp_cap; capability *chan_cap; udpport_t srcport; udpport_t dstport; ipaddr_t dstaddr; int flags; .eC .kW "\fIudp_connect\fP" \fIUdp_connect\fP combines the functionality of \fItcpip_open\fP and \fIudp_ioc_setopt\fP. A pointer to a UDP server capability should be passed in \fIudp_cap\fP, and the channel capability will be returned in the capability pointed to by \fIchan_cap\fP. If \fIsrcport\fP is 0 then an unused port will be selected, otherwise the local port will be set to \fIsrcport\fP. If \fIdstport\fP is non-zero then communication will be restricted to remote ports that equal to \fIdstport\fP, otherwise any data can be sent to or received from any remote port. The same thing applies to \fIdstaddr\fP; if \fIdstaddr\fP is non-zero then only \fIdstaddr\fP can be reached. Currently no flags are defined so \fIflags\fP should be 0. .sH udp_reconnect .LP .sC errstat udp_reconnect(chan_cap, srcport, dstport, dstaddr, flags) capability *chan_cap; udpport_t srcport; udpport_t dstport; ipaddr_t dstaddr; int flags; .eC .kW "\fIudp_reconnect\fP" \fIUdp_reconnect\fP is the same as \fIudp_connect\fP except that an existing channel capability is (re)used. .sH udp_read_msg .LP .sC errstat udp_read_msg(chan_cap, msg, msglen, actlen, flags) capability *chan_cap; char *msg; int msglen; int *actlen; int flags; .eC .kW "\fIudp_read_msg\fP" \fIUdp_read_msg\fP delivers a UDP packet. The data part of the UDP packet is prepended with an \fIudp_io_hdr\fP. The actual length of the possibly truncated packet is returned in \fIactlen\fP. No flags are defined so \fIflags\fP should be 0. .sH udp_write_msg .LP .sC errstat udp_write_msg(chan_cap, msg, msglen, flags) capability *chan_cap; char *msg; int msglen; int flags; .eC .kW "\fIudp_write_msg\fP" A UDP packet can be sent with \fIudp_write_msg\fP. \fIMsg\fP should point to a \fIudp_io_hdr\fP followed by the data part of the UDP packet. The \fIuih_dst_addr\fP and \fIuih_dst_port\fP fields of the \fIudp_io_hdr\fP should be filled in if no values are specified in the \fIudp_connect\fP, or \fIudp_reconnect\fP. .sH udp_close .LP .sC errstat udp_close(chan_cap, flags) capability *chan_cap; int flags; .eC .kW "\fIudp_close\fP" \fIUdp_close\fP cleans up the administration kept by the UDP library but does not destroy the capability. The function should be used if the capability is passed to another process and should continue to exist. No flags are defined so \fIflags\fP should be 0. .sH udp_destroy .LP .sC errstat udp_destroy(chan_cap, flags) capability *chan_cap; int flags; .eC .kW "\fIudp_destroy\fP" \fIUdp_destroy\fP not only cleans up the administration kept by the UDP library but also destroys the channel capability. .. .SH FILES .IP /dev/eth* \w'/dev/psip*mmm'u Raw ethernet. The numbers in the device names are decimal, so one may see names from .B eth0 to .BR eth15 . .IP /dev/psip* First and second Pseudo IP network. .IP /dev/ip* IP devices for two ethernets and two Pseudo IP networks. .IP /dev/tcp* TCP devices for same four networks. .IP /dev/udp* UDP devices. .IP "/dev/eth, /dev/psip, /dev/ip, /dev/tcp, /dev/udp" Devices for the default network, links to the devices above. .B Eth is only present if ethernet is the default, .B psip only for pseudo IP. .SH "SEE ALSO" .BR hton (3), .BR oneC_sum (3), .BR inet (8), .BR boot (8). .SH DIAGNOSTICS Several errors may be returned by the TCP/IP server. The error code is found in the .B errno variable if the .BR read , .BR write , or .B ioctl call returns -1. The TCP/IP error codes defined in are: .IP EPACKSIZE 5c This indicates an attempt to read or write with a buffer that is too large or too small. .IP EOUTOFBUFS The TCP/IP server has insufficient memory to execute the request. .IP EBADIOCTL This indicates an attempt to execute a command the particular server does not understand. For example, a .B NWIOGTCPCONF on an ETH channel. .IP EBADMODE The request is refused because the channel is not fully configured, in the wrong state or the parameters are invalid. .IP EBADDEST This indicates an illegal destination address for a packet. .IP EDSTNORCH The destination is not reachable. .IP EISCONN The channel is already connected so a second request is refused. .IP EADDRINUSE This address is in use. .IP ECONNREFUSED The connection is refused by the other side. .IP ECONNRESET The connection is reset (non-gracefully terminated) by the other side. .IP ETIMEDOUT The connection is terminated due to an expired timer. .IP EURG Urgent data is present and the current receive mode does not allow urgent data to be transferred. .IP ENOURG No urgent data is present and a request came for urgent data. .IP ENOTCONN The request requires a connected channel and the channel is not connected. .IP ESHUTDOWN The connection is shut down. That is, a .B NWIOTCPSHUTDOWN has been executed so no more data can be transmitted. .IP ENOCONN The connection does not exist. .IP EGENERIC A generic error code for extremely weird cases. .SH AUTHOR Philip Homburg (philip@cs.vu.nl) .\" .\" $PchId: ip.4,v 1.4 2001/01/08 19:58:14 philip Exp $ .TH LP 4 .SH NAME lp \- line printer .SH DESCRIPTION The .B lp device refers to the line printer attached to the parallel port. Any byte written to this device is printed. Only one process may have the device open. .PP The .B write (2) call may return with a smaller count then the number of bytes requested to write. The next write call is then likely to fail with the error code .B EAGAIN if the printer is out of paper, or .B EIO if the printer is turned off. .SH FILES .TP 10 /dev/lp Parallel port device. .SH "SEE ALSO" .BR lp (1). .SH BUGS Only one parallel port is supported. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH MTIO 4 .SH NAME mtio \- magnetic tape commands .SH SYNOPSIS .B "#include " .br .B "#include " .br .B "#include " .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The magnetic tape devices described in .BR sd (4) may be sent commands or queried for their status using the following ioctl calls: .PP .RS .BR ioctl ( \fIfd , .BR MTIOCTOP , .RB & "struct mtop" ) .br .BR ioctl ( \fIfd , .BR MTIOCGET , .RB & "struct mtget" ) .RE .PP The struct mtop, struct mtget and associated definitions are defined in as follows: .PP .nf /* Tape operations: ioctl(fd, MTIOCTOP, &struct mtop) */ .ta +4n +7n +15n struct mtop { short mt_op; /* Operation (MTWEOF, etc.) */ int mt_count; /* Repeat count. */ }; .ta +17n +5n #define MTWEOF 0 /* Write End-Of-File Marker */ #define MTFSF 1 /* Forward Space File mark */ #define MTBSF 2 /* Backward Space File mark */ #define MTFSR 3 /* Forward Space Record */ #define MTBSR 4 /* Backward Space Record */ #define MTREW 5 /* Rewind tape */ #define MTOFFL 6 /* Rewind and take Offline */ #define MTNOP 7 /* No-Operation, set status only */ #define MTRETEN 8 /* Retension (completely wind and rewind) */ #define MTERASE 9 /* Erase the tape and rewind */ #define MTEOM 10 /* Position at End-Of-Media */ #define MTMODE 11 /* Select tape density */ #define MTBLKZ 12 /* Select tape block size */ /* Tape status: ioctl(fd, MTIOCGET, &struct mtget) */ .ta +4n +7n +15n struct mtget { short mt_type; /* Type of tape device. */ /* Device dependent "registers". */ short mt_dsreg; /* Drive status register. */ short mt_erreg; /* Error register. */ /* Misc info. */ off_t mt_resid; /* Residual count. */ off_t mt_fileno; /* Current File Number. */ off_t mt_blkno; /* Current Block Number within file. */ off_t mt_blksize; /* Current block size. */ }; .fi .PP See .BR mt (1) for a detailed description on what each operation does. The mt_type field is always zero, there is no use for it yet. Mt_dsreg is 0 (OK), 1 (Error), or 2 (EOF encountered.) Mt_erreg holds the SCSI sense key of the last operation. Mt_blksize is the current tape block size in bytes, zero if the block size is variable. .PP Note that one can issue these commands on a file descriptor that is in use to read or write data, something that .B mt can't do. So you can add eof markers in the middle of an output stream, or get the status of a device before a rewind-on-close tape rewinds. .PP The driver will automatically add an end of file marker to a tape that is written to if you execute a space command. If you write eof markers yourself then the driver will not add one extra on close. .SH "SEE ALSO" .BR mt (1), .BR sd (4). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH TTY 4 .SH NAME tty, termios \- terminals .SH DESCRIPTION The .B tty driver family takes care of all user input and output. It governs the keyboard, the console, the serial lines, and pseudo ttys. Input on any of these devices undergoes "input processing", and output undergoes "output processing" according to the standard termios terminal interface. .SS "Input processing" Each terminal device has an input queue. This queue is used to store preprocessed input characters, and to perform the backspacing and erase functions. Some special characters like a newline make the contents of the queue available to a process reading from the terminal. Characters up to and including the newline, or another so-called "line break", may be read by a process. The process need not read all characters at once. An input line may be read byte by byte if one wants to. A line break just makes characters available for reading, thats all. .PP When data is made available depends on whether the tty is in canonical mode or not. In canonical mode the terminal processes input line by line. A line ends with a newline .RB ( NL ), end-of-file .RB ( EOF ), or end-of-line .RB ( EOL ). Characters that have not been delimited by such a line break may be erased one by one with the .B ERASE character or all at once with the .B KILL character. Once a line break is typed the characters become available to a reading process and can no longer be erased. Once read they are removed from the input queue. Several lines may be gathered in the input queue if no reader is present to read them, but a new reader will only receive one line. Two line breaks are never returned in one read call. The input queue has a maximum length of .B MAX_CANON characters. Any more characters are discarded. One must use .B ERASE or .B KILL to make the terminal functioning again if the input queue fills up. If nonblocking I/O is set then \-1 is returned with .B errno set to .B EAGAIN if the reader would otherwise be blocked. .PP In non-canonical mode (raw mode for short) all characters are immediately available to the reader in principle. One may however tune the terminal to bursty input with the .B MIN and .B TIME parameters, see the raw I/O parameters section below. In raw mode no characters are discarded if the input queue threatens to overflow if the device supports flow control. .SS "Output processing" Characters written to a terminal device may undergo output processing, which is usually just inserting a carriage returns before newlines. A writer may return before all characters are output if the characters can be stored in the output buffers. If not then the writer may be blocked until space is available. If non-blocking I/O is set then only the count of the number of bytes that can be processed immediately is returned. If no characters can be written at all then \-1 is returned with .B errno set to .BR EAGAIN . .SS "Special characters" Some characters have special functions in some of the terminal modes. These characters are as follows, with the Minix defaults shown in parentheses: .TP 5 .BR INTR " (^?)" Special input character that is recognized if .B ISIG is set. (For .B ISIG and other flags see the various modes sections below.) It causes a .B SIGINT signal to be sent to all processes in the terminal process group. (See the section on session leaders below.) .TP .BR QUIT " (^\e)" Special input character if .B ISIG is set. Causes a .B SIGQUIT signal to be sent to the terminal process group. .TP .BR ERASE " (^H)" Special input character if .B ICANON is set. Erases the last character in the current line. .TP .BR KILL " (^U)" Special input character if .B ICANON is set. Erases the entire line. .TP .BR EOF " (^D)" Special input character if .B ICANON is set. It is a line break character that is not itself returned to a reader. If EOF is typed with no input present then the read returns zero, which normally causes the reader to assume that end-of-file is reached. .TP .BR CR " (^M)" Special input character if .B IGNCR or .B ICRNL is set. It is a carriage return ('\er'). If .B IGNCR is set then .B CR is discarded. If .B ICRNL is set and .B IGNCR is not set then .B CR is changed into an .B NL and has the same function as .BR NL. .TP .BR NL " (^J)" Special input character if .B ICANON is set. It is both a newline ('\en') and a line break. .br Special output character if .B OPOST and .B ONLCR are set. A .B CR NL sequence is output instead of just .BR NL . (Minix specific, but almost mandatory on any UNIX-like system.) .TP .BR TAB " (^I)" Special character on output if .B OPOST and .B XTABS are set. It is transformed into the number of spaces necessary to reach a column position that is a multiple of eight. (Only needed for terminals without hardware tabs.) .TP .BR EOL " (undefined)" Special input character if .B ICANON is set. It is an additional line break. .TP .BR SUSP " (^Z)" Special input character if job control is implemented and .B ISIG is set. It causes a .B SIGTSTP signal to be send to the terminal process group. (Minix does not have job control.) .TP .BR STOP " (^S)" Special input character if .B IXON is set. It suspends terminal output and is then discarded. .TP .BR START " (^Q)" Special output character if .B IXON is set. It starts terminal output if suspended and is then discarded. If .B IXANY is also set then any other character also starts terminal output, but they are not discarded. .TP .BR REPRINT " (^R)" Special input character if .B IEXTEN and .B ECHO are set. Reprints the input queue from the last line break onwards. A reprint also happens automatically if the echoed input has been messed up by other output and .B ERASE is typed. .TP .BR LNEXT " (^V)" Special input character if .B IEXTEN is set. It is the "literal next" character that causes the next character to be input without any special processing. .TP .BR DISCARD " (^O)" Special input character if .B IEXTEN is set. Causes output to be discarded until it is typed again. (Implemented only under Minix-vmd.) .PP All of these characters except .BR CR , .B NL and .B TAB may be changed or disabled under Minix. (Changes to .B START and .B STOP may be ignored under other termios implementations.) The .B REPRINT and .B LNEXT characters are Minix extensions that are commonly present in other implementations. \s-2POSIX\s+2 is unclear on whether .BR IEXTEN, .BR IGNCR and .BR ICRNL should be active in non-canonical mode, but under Minix they are. .SS "Terminal attributes" The attributes of a terminal, such as whether the mode should be canonical or non-canonical, are controlled by routines that use the .B termios structure as defined in .BR : .PP .RS .nf .ta +4n +10n +15n struct termios { tcflag_t c_iflag; /* input modes */ tcflag_t c_oflag; /* output modes */ tcflag_t c_cflag; /* control modes */ tcflag_t c_lflag; /* local modes */ speed_t c_ispeed; /* input speed */ speed_t c_ospeed; /* output speed */ cc_t c_cc[NCCS]; /* control characters */ }; .fi .RE .PP The types .BR tcflag , .B speed_t and .B cc_t are defined in .B as unsigned integral types. .SS "Input Modes" The .B c_iflag field contains the following single bit flags that control input processing: .TP 5 .B ICRNL Map .B CR to .B NL on input. .TP .B IGNCR Ignore .B CR on input. This flag overrides .BR ICRNL . .TP .B INLCR Map .B NL to .B CR on input. This is done after the .B IGNCR check. .TP .B IXON Enable start/stop output control. .TP .B IXOFF Enable start/stop input control. (Not implemented.) .TP .B IXANY Allow any character to restart output. (Minix specific.) .TP .B ISTRIP Strip characters to seven bits. .TP .B IGNPAR Ignore characters with parity errors. (Not implemented.) .TP .B INPCK Enable input parity checking. (Not implemented.) .TP .B PARMRK Mark parity errors by preceding the faulty character with '\e377', '\e0'. The character '\e377' is preceded by another '\e377' to avoid ambiguity. (Not implemented.) .TP .B BRKINT Send the signal .B SIGINT to the terminal process group when receiving a break condition. (Not implemented.) .TP .B IGNBRK Ignore break condition. If neither .B BR$$$$$$$ $ $ $ $ $KINT or .B IGNBRK is set a break is input as a single '\e0', or if .B PARMRK is set as '\e377', '\e0', '\e0'. (Breaks are always ignored.) .SS "Output Modes" The .B c_oflag field contains the following single bit flags that control output processing: .TP .B OPOST Perform output processing. This flag is the "main switch" on output processing. All other flags are Minix specific. .TP .B ONLCR Transform an .B NL to a .B CR NL sequence on output. Note that a key labeled "RETURN" or "ENTER" usually sends a .BR CR . In line oriented mode this is normally transformed into .B NL by .BR ICRNL . .B NL is the normal UNIX line delimiter ('\en'). On output an .B NL is transformed into the .B CR NL sequence that is necessary to reach the first column of the next line. (This is a common output processing function for UNIX-like systems, but not always separately switchable by an .B ONLCR flag.) .TP .B XTABS Transform a .B TAB into the number of spaces necessary to reach a column position that is a multiple of eight. .TP .B ONOEOT Discard .B EOT (^D) characters. (Minix-vmd only.) .SS "Control Modes" The .B c_cflag field contains the following single bit flags and bit field for basic hardware control: .TP .B CLOCAL Ignore modem status lines. .TP .B CREAD Enable receiver. (The receiver is always enabled.) .TP .B CSIZE Number of bits per byte. .B CSIZE masks off the values .BR CS5 , .BR CS6 , .BR CS7 and .BR CS8 that indicate that 5, 6, 7 or 8 bits are used. .TP .B CSTOPB Send two stop bits instead of one. Two stop bits are normally used at 110 baud or less. .TP .B PARENB Enable parity generation. .TP .B PARODD Generate odd parity if parity is generated, otherwise even parity. .TP .B HUPCL Drop the modem control lines on the last close of the terminal line. (Not implemented.) .SS "Local Modes" The .B c_lflag field contains the following single bit flags that control various functions: .TP .B ECHO Enable echoing of input characters. Most input characters are echoed as they are. Control characters are echoed as .BI "^" X where .I X is the letter used to say that the control character is .BI CTRL\- X\fR. The .BR CR , .BR NL and .BR TAB characters are echoed with their normal effect unless they are escaped by .BR LNEXT . .TP .B ECHOE If .B ICANON and .B ECHO are set then echo .B ERASE and .B KILL as one or more backspace-space-backspace sequences to wipe out the last character or the entire line, otherwise they are echoed as they are. .TP .B ECHOK If .B ICANON and .B ECHO are set and .B ECHOE is not set then output an .B NL after the .B KILL character. (For hardcopy terminals it is best to unset .B ECHOE and to set .BR ECHOK .) .TP .B ECHONL Echo .B NL even if .B ECHO is not set, but .B ICANON is set. .TP .B ICANON Canonical input. This enables line oriented input and erase and kill processing. .TP .B IEXTEN Enable implementation defined input extensions. .TP .B ISIG Enable the signal characters .BR INTR , .BR QUIT and .BR SUSP . .TP .B NOFLSH Disable the flushing of the input and output queues that is normally done if a signal is sent. .TP .B TOSTOP Send a .B SIGTTOU signal if job control is implemented and a background process tries to write. (Minix has no job control.) .SS "Input and output speed" The input and output speed are encoded into the .B c_ispeed and .B c_ospeed fields. .B defines the symbols .BR B0 , .BR B50 , .BR B75 , .BR B110 , .BR B134 , .BR B150 , .BR B200 , .BR B300 , .BR B600 , .BR B1200 , .BR B1800 , .BR B2400 , .BR B4800 , .BR B9600 , .BR B19200 , .BR B38400 , .BR B57600 and .BR B115200 as values used to indicate the given baud rates. The zero baud rate, .BR B0 , if used for the input speed causes the input speed to be equal to the output speed. Setting the output speed to zero hangs up the line. One should use the functions .BR cfgetispeed() , .BR cfgetospeed() , .BR cfsetispeed() and .BR cfsetospeed() to get or set a speed, because the .B c_ispeed and .B c_ospeed fields may not be visible under other implementations. (The .B c_ispeed and .B c_ospeed fields and the .B B57600 and .B B115200 symbols are Minix specific.) .SS "Special characters" The .B c_cc array contains the special characters that can be modified. The array has length .B NCCS and is subscripted by the symbols .BR VEOF , .BR VEOL , .BR VERASE , .BR VINTR , .BR VKILL , .BR VMIN , .BR VQUIT , .BR VTIME , .BR VSUSP , .BR VSTART , .BR VSTOP , .BR VREPRINT , .BR VLNEXT and .BR VDISCARD . All these symbols are defined in .BR . Some implementations may give the same values to the .B VMIN and .B VTIME subscripts and the .B VEOF and .B VEOL subscripts respectively, and may ignore changes to .B START and .BR STOP . (Under Minix all special characters have their own .I c_cc slot and can all be modified.) .SS "Raw I/O Parameters" The .B MIN and .B TIME parameters can be used to adjust a raw connection to bursty input. .B MIN represents a minimum number of bytes that must be received before a read call returns. .B TIME is a timer of 0.1 second granularity that can be used to time out a read. Setting either of these parameters to zero has special meaning, which leads to the following four possibilities: .TP 5 .B "MIN > 0, TIME > 0" .B TIME is an inter-byte timer that is started (and restarted) when a byte is received. A read succeeds when either the minimum number of characters is received or the timer expires. Note that the timer starts .B after the first character, so the read returns at least one byte. .TP .B "MIN > 0, TIME = 0" Now the timer is disabled, and a reader blocks indefinitely until at least .B MIN characters are received. .TP .B "MIN = 0, TIME > 0" .B TIME is now a read timer that is started when a read is executed. The read will return if the read timer expires or if at least one byte is input. (Note that a value of zero may be returned to the reader.) .TP .B "MIN = 0, TIME = 0" The bytes currently available are returned. Zero is returned if no bytes are available. .SS "User Level Functions" Termios attributes are set or examined, and special functions can be performed by using the functions described in .BR termios (3). .SS "Session Leaders and Process Groups" With the use of the .B setsid() function can a process become a session leader. A session leader forms a process group with a process group id equal to the process id of the session leader. If a session leader opens a terminal device file then this terminal becomes the controlling tty of the session leader. Unless the terminal is already the controlling tty of another process, or unless the .B O_NOCTTY flag is used to prevent the allocation of a controlling tty. The process group of the session leader is now remembered as the terminal process group for signals sent by the terminal driver. All the children and grandchildren of the session leader inherit the controlling terminal and process group until they themselves use .BR setsid() . .PP The controlling tty becomes inaccessible to the children of the session leader when the session leader exits, and a hangup signal is sent to all the members of the process group. The input and output queues are flushed on the last close of a terminal and all attributes are reset to the default state. .PP A special device .B /dev/tty is a synonym for the controlling tty of a process. It allows a process to reach the terminal even when standard input, output and error are redirected. Opening this device can also be used as a test to see if a process has a controlling tty or not. .PP For Minix a special write-only device .B /dev/log exists for processes that want to write messages to the system console. Unlike the console this device is still accessible when a session leader exits. .PP Minix-vmd also has a .B /dev/log device, but this device is read-write. All messages written to the log device or to the console when X11 is active can be read from .BR /dev/log . The system tries to preserve the log buffer over a reboot so that panic messages reappear in the log if the system happens to crash. .SS "Pseudo Terminals" Pseudo ttys allow a process such as a remote login daemon to set up a terminal for a remote login session. The login session uses a device like .B /dev/ttyp0 for input and output, and the remote login daemon uses the device .B /dev/ptyp0 to supply input to or take output from the login session and transfer this to or from the originating system. So the character flow may be: Local user input sent to the remote system is written to .B /dev/ptyp0 by the remote login daemon, undergoes input processing and appears on .B /dev/ttyp0 as input to the login session. Output from the login session to .B /dev/ttyp0 undergoes output processing, is read from .B /dev/ptyp0 by the remote login daemon and is send over to the local system to be displayed for the user. (So there are only four data streams to worry about in a pseudo terminal.) .PP A pseudo terminal can be allocated by trying to open all the controlling devices .BI /dev/pty nn one by one until it succeeds. Further opens will fail once a pty is open. The process should now fork, the child should become session leader, open the tty side of the pty and start a login session. .PP If the tty side is eventually closed down then reads from the pty side will return zero and writes return \-1 with .B errno set to .BR EIO . If the pty side is closed first then a .B SIGHUP signal is sent to the session leader and further reads from the tty side return zero and writes return \-1 with .B errno set to .BR EIO . (Special note: A line erase may cause up to three times the size of the tty input queue to be sent to the pty reader as backspace overstrikes. Some of this output may get lost if the pty reader cannot accept it all at once in a single read call.) .SS "Backwards compatibility" The .BR TIOCGETP , .BR TIOCSETP , .BR TIOCGETC and .BR TIOCSETC ioctl functions that are used by the old .B sgtty terminal interface are still supported by the terminal driver by emulation. Note that these old functions cannot control all termios attributes, so the terminal must be in a relatively sane state to avoid problems. .SH FILES The list below shows all devices that Minix and Minix-vmd have. Not all of these devices are configured in by default, as indicated by the numbers (i/j/k, l/m/n) that tell the minimum, default and maximum possible number of these devices for Minix (i/j/k) and Minix-vmd (l/m/n). .TP 20 .B /dev/console System console. .TP .B /dev/ttyc[1-7] Virtual consoles. (0/1/7, 0/1/7) .TP .BR /dev/log Console log device. .TP .B /dev/tty0[0-3] Serial lines. (0/2/2, 4/4/4) .TP .B /dev/tty[p-w][0-f] Pseudo ttys. (0/0/64, 1/32/128) .TP .B /dev/pty[p-w][0-f] Associated pseudo tty controllers. .SH "SEE ALSO" .BR stty (1), .BR termios (3), .BR setsid (2), .BR read (2), .BR write (2). .SH BUGS A fair number of flags are not implemented under Minix (yet). Luckily they are very limited utility and only apply to RS-232, not to the user interface. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CONTROLLER 4 .SH NAME controller, disk, tape, at, bios, esdi, aha1540, ncr810, dosfile, fatfile \- controllers, disks and tapes .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .BI c n * family of devices refer to drivers that control disks, disk like devices, and tapes. Minix contains a number of drivers for several different controllers. These controllers can have disks, cdroms and tapes attached to them. Boot Monitor variables specify which drivers are activated using the variables .BR c0 , .BR c1 , etc. The names of the devices in .BR /dev that correspond with the driver for controller 0 are all named beginning with .BR c0 . .PP For each controller, the minor device numbers are organized as follows: .PP .RS .nf .ta +\w'122-127nnmm'u +\w'd0p0s0nnmm'u +\w'disk 0, part 0, subpart 0nnmm'u .ft B minor device what? obsolete .ft P 0 d0 disk 0 hd0 1 d0p0 disk 0, partition 0 hd1 2 d0p1 disk 0, partition 1 hd2 3 d0p2 disk 0, partition 2 hd3 4 d0p3 disk 0, partition 3 hd4 5 d1 disk 1 hd5 6 d1p0 disk 1, partition 0 hd6 7 d1p1 disk 1, partition 1 hd7 8 d1p2 disk 1, partition 2 hd8 9 d1p3 disk 1, partition 3 hd9 \&... ... 39 d7p3 disk 7, partition 3 hd39 .SP 64 t0n tape 0, non-rewinding 65 t0 tape 0, rewind on close 66 t1n tape 1, non-rewinding 67 t1 tape 1, rewind on close \&... ... 78 t7n tape 7, non-rewinding 79 t7 tape 7, rewind on close .SP 120 r0 raw access device 0 121 r1 raw access device 1 \&... ... 127 r7 raw access device 7 .SP 128 d0p0s0 disk 0, part 0, subpart 0 hd1a 129 d0p0s1 disk 0, part 0, subpart 1 hd1b 130 d0p0s2 disk 0, part 0, subpart 2 hd1c 131 d0p0s3 disk 0, part 0, subpart 3 hd1d 132 d0p1s0 disk 0, part 1, subpart 0 hd2a \&... ... 144 d1p0s0 disk 1, part 0, subpart 0 hd6a \&... ... 255 d7p3s3 disk 7, part 3, subpart 3 hd39d .fi .RE .PP The device names in .B /dev also name the controller, of course, so the usual place for the Minix root device, the first subpartition of the second partition of disk 0 on controller 0 is .BR /dev/c0d0p1s0 . Note that everything is numbered from 0! The first controller is controller 0, the first disk is disk 0, etc. So the second partition is .BR p1 . .PP The fourth column in the table above shows the disk devices names that were used by previous versions of Minix for what is now controller 0. These devices are no longer present in .BR /dev . .SS Disks Most disks are arrays of 512 byte sectors. The disk devices are normally block devices, which means they are block buffered by the Minix file system cache using 1024 byte blocks. The FS cache allows I/O at any byte offset, and takes care of cutting and pasting incomplete blocks together. If one creates a character device for a disk device, then I/O must be in multiples of the disk block size. .PP For each disk there is a device that covers the entire disk, these are named .BR c0d0 , .BR c0d1 , etc, up to .B c0d7 for controller 0. If a partition table is placed in the first sector of the disk, then the disk is subdivided into regions named partitions. Up to four partitions may be defined, named .BR c0d0p0 to .BR c0d0p3 for disk 0 on controller 0. To make things interesting you can also place a partition table in the first sector of a Minix partition, which divides the partition into up to four subpartitions. Normally Minix is installed into a single partition, with the root, swap and /usr file systems in subpartitions. .PP If a partition is an extended partition then it contains a linked list of partition tables each of which may specify a logical partition. Up to four of these logical partitions are presented by the driver as subpartitions of the extended partition. .PP A sector containing a partition table starts with 446 bytes of boot code, followed by four partition table entries of 16 bytes each, and ends with the magic number 0xAA55 (little endian, so first 0x55 then 0xAA.) Partition table information is defined in : .PP .nf .ta +2n +29n +37n /* Description of entry in the partition table. */ struct part_entry { unsigned char bootind; /* boot indicator 0/ACTIVE_FLAG */ unsigned char start_head; /* head value for first sector */ unsigned char start_sec; /* sector value + high 2 cyl bits */ unsigned char start_cyl; /* low 8 cylinder bits */ unsigned char sysind; /* system indicator */ unsigned char last_head; /* h/s/c for the last sector */ unsigned char last_sec; unsigned char last_cyl; unsigned long lowsec; /* logical first sector */ unsigned long size; /* size of partition in sectors */ }; .ta +24n +7n +37n #define ACTIVE_FLAG 0x80 /* value for active in bootind field */ #define NR_PARTITIONS 4 /* number of entries in table */ #define PART_TABLE_OFF 0x1BE /* offset of table in boot sector */ /* Partition types (sysind). */ #define NO_PART 0x00 /* unused entry */ #define MINIX_PART 0x81 /* Minix partition type */ .fi .PP The cylinder numbers are encoded in a very strange way, bits 8 and 9 are in the high two bits of the sector number. The sector numbers count from 1, not 0! More useful are the lowsec and size fields however, they simply give the location of the partition as an absolute sector offset and length within the drive. .PP The partition table entry defined above is specific to IBM type disks. The device drivers use another partition entry structure to pass information on a partition. This is what looks like: .sp .nf .ta +2n +25n struct partition { u64_t base; /* byte offset to the partition start */ u64_t size; /* number of bytes in the partition */ unsigned cylinders; /* disk geometry for partitioning */ unsigned heads; unsigned sectors; }; .fi .PP The base and size fields are the byte offset and length of a partition. The geometry of the disk is also given for the benefit of partition table editors. This information can be obtained from an open disk device with the call: .sp .RS .ft B ioctl(\fIfd\fP, DIOCGETP, &\fIentry\fP); .ft R .RE .sp One can change the placement of the device to the lowsec and size fields of .I entry by using the .B DIOCSETP call instead. Only the base and size fields are used for .BR DIOCSETP . .PP The partition tables when read from disk by the driver are checked and truncated to fit within the primary partition or drive. The first sector is normally left free for the partition table. .PP The partition tables are read when the in-use count (opens and mounts) changes from 0 to 1. So an idle disk is automatically repartitioned on the next access. This means that DIOCSETP only has effect if the disk is in use. .SS "Disk-like devices" Devices like a CD-ROM are treated as read-only disks, and can be accessed using disk devices. A CD-ROM usually has a block size of 2048 bytes, but the driver knows this, and allows one to read at any byte offset by reading what isn't needed into a scratch buffer. .SS Tapes There are two kinds of tape devices: Non-rewinding, and rewind-on-close. The non-rewinding devices treat the tape as a series of files. The rewind-on-close devices look at the tape as a single file, and when you close such a device the tape is told to rewind. See .BR mt (1), and .BR mtio (4) for a description of the commands that may be sent to the tape, either from the command prompt or from a program. .PP There are two kinds of tape drives: Fixed and variable block size tape drives. Examples of the first kind are cartridge tapes, with a fixed 512 bytes block size. An Exabyte tape drive has a variable block size, with a minimum of 1 byte and a maximum of 245760 bytes (see the documentation of such devices.) The maximum is truncated to 32767 bytes for Minix-86 and 61440 bytes for Minix-vmd, because the driver can't move more bytes in a single request. .PP A read or write to a fixed block size tape must be a precise multiple of the block size, any other count gives results in an I/O error. A read from a variable block sized tape must be large enough to accept the block that is read, otherwise an I/O error will be returned. A write can be any size above the minimum, creating a block of that size. If the write count is larger than the maximum block size then more blocks are written until the count becomes zero. The$$$$$$$ last block must be larger than the minimum of course. (This minimum is often as small as 1 byte, as for the Exabyte.) .PP The .B mt blksize command may be used to select a fixed block size for a variable block sized tape. This will speed up I/O considerably for small block sizes. (Some systems can only use fixed mode and will write an Exabyte tape with 1024 byte blocks, which read very slow in variable mode.) .PP A tape is a sequence of blocks and filemarks. A tape may be opened and blocks may be read from it upto a filemark, after that all further reads return 0. After the tape is closed and reopened one can read the blocks following the filemark if using a non-rewinding device. This makes the tape look like a sequence of files. .PP If a tape has been written to or opened in write-only mode, then a filemark is written if the tape is closed or if a space command is issued. No extra filemark is written if the drive is instructed to write filemarks. .SS "Raw Access Devices" Under Minix-vmd one can use the raw access devices to program a SCSI device entirely from user mode. The disk and tape devices probe for devices when opened, start disks and load tapes, but the raw access devices do nothing at all. Given an open file descriptor to any SCSI character device (not just the raw access devices) one can use the following ioctl: .PP .RS ioctl(fd, SCIOCCMD, &scsicmd) .RE .PP The structure whose address is passed as the third argument is defined in as follows: .PP .RS .nf struct scsicmd { void *cmd; size_t cmdlen; void *buf; size_t buflen; void *sense; size_t senselen; int dir; }; .fi .RE .PP .B Cmd and .B cmdlen hold the address and length of an object holding a Group 0 or Group 1 SCSI command. The next two fields describe a buffer of at most 8 kilobytes used in the data in or out phase. .B Dir is 0 if data is to be read from the device, 1 if data is written to the device. If the ioctl succeeds then 0 is returned, otherwise -1 with .B errno set to .B EIO and the request sense info returned in the buffer described by the sense and senselen fields. If the sense key is zero on error then a host adapter error occurred, this means that the device is most likely turned off or not present. .SH DRIVERS By setting the Boot variables .BR c0 to .BR c3 under Minix, or .BR c0 to .BR c4 under Minix-vmd one attaches a set of disk and tape devices to a driver. See .BR boot (8) for a list of boot variables that configure each of these drivers. The following drivers are available: .SS at The standard IBM/AT disk driver that also supports IDE disks. This is the default driver for controller 0 on AT class machines. (Most PCs are in that class.) .SS bios A disk driver that uses BIOS calls to do disk I/O. This is the default driver on anything but an AT. (Old XTs and PS/2s.) On an XT this is the best driver you can use, but on any other machine this driver may be somewhat slow, because the system has to switch out of protected mode to make a BIOS call. On a fast enough machine with a high enough setting of DMA_SECTORS (see .BR config (8)) it works well enough. .SS esdi A hard disk driver for use on some PS/2 models. .SS "xt \fR(Minix only)" A hard disk driver for IBM/XT type hard disks. Useful for old 286 based machines that have such a disk. On XTs you are better off with the .B bios driver. .SS aha1540 A SCSI driver for the Adaptec 1540 host adapter family, which includes the 1540, 1540A, 1540B, 1540C, 1540CF, 1640, and 1740. Also supported is the compatible BusLogic 545. .SS ncr810 This will eventually become a Symbios 810 SCSI driver. (Formerly owned by NCR.) KJB has read the docs on this card three times, but has still done nothing, the lazy bum. .SS dosfile The "DOS file as disk" driver that is used when Minix is running under DOS. It treats a large DOS file as a Minix disk. Only primary partitions are supported, there are no subpartitions. This is the default driver when Minix is started under DOS. .SS fatfile Uses a large file on a FAT file system as a disk. It needs one of the other disk drivers to do the actual I/O. This driver only knows how to interpret a FAT file system to find the file to use. With a fast native disk driver this driver is much faster than the .B dosfile driver. .SH FILES .TP 25 /dev/c*d* Disks devices. .TP /dev/c*d*p* Partitions. .TP /dev/c*d*p*s* Subpartitions. .TP /dev/c*t*n, /dev/c*t* Tapes. .TP /dev/c*r* Raw access devices. .SH "SEE ALSO" .BR dd (1), .BR mt (1), .BR eject (1), .BR ioctl (2), .BR int64 (3), .BR mtio (4), .BR boot (8), .BR config (8), .BR monitor (8), .BR part (8), .BR repartition (8). .SH BUGS The subpartitioning is incompatible with the MS-DOS method of extended partitions. The latter does not map well to the sparse minor device number space. .PP The primary partition table is sorted by lowsec like MS-DOS does, subpartition tables are not. Just think about what happens when you delete a partition in the MS-DOS scheme. .PP Don't move a partition that is mounted or kept open by some process. The file system may write cached blocks to the new location. .PP The BIOS driver is not slow at all on a buffered disk. .PP Some IDE disks send an interrupt when they spin down under hardware power management. The driver acknowledges the interrupt as it is supposed to do by reading the status register. The disk then spins up again... You have to disable the spin down in the computer setup to fix the problem. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) ...TZ.5dir.5ethers.5fstab.5hosts.5keymap.5passwd.5resolv.conf.5resolver.5 rhosts.5!termcap.5"ttytab.5#utmp.5$whatis.5%serv.access.5&crontab.5'configfile.5(dhcp.conf.5.TH TZ 5 .SH NAME TZ \- Time zone environment variable .SH SYNOPSIS \fBTZ=\fIzone\fR[\fB\-\fR]\fIoffset\fR[\fIdst\fR[\fIoffset\fR][\fB,\fIstart\fR[\fB/\fItime\fR]\fB,\fIend\fR[\fB/\fItime\fR]]] .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B TZ environment variable tells functions such as the .BR ctime (3) family and programs like .B date what the time zone and daylight saving rule is. The value of .B TZ has the \s-2POSIX\s+2 standardized form shown in the synopsis. This form specifies the zone names, offsets from GMT, and daylight saving changeover times for at least the current year. .TP .I zone A three or more letter name for the time zone in normal (winter) time. .TP .BI [\-] offset A signed time telling the offset of the time zone westwards from Greenwich. The time has the form .I hh[:mm[:ss]] with a one of two digit hour, and optional two digit minutes and seconds. .TP .I dst The name of the time zone when daylight saving is in effect. It may be followed by an offset telling how big the clock correction is other than the default of 1 hour. .TP \fIstart\fR/\fItime\fR,\fIend\fR/\fItime\fR Specifies the start and end of the daylight saving period. The .I start and .I end fields indicate on what day the changeover occurs. They must be in one of the following formats: .SP .ta +5 .in +5 .ti -5 \fBJ\fIn\fR The Julian day .I n (1 <= .I n <= 365) ignoring leap days, i.e. there is no February 29. .SP .ti -5 \fIn\fR The zero-based Julian day (0 <= .I n <= 365). Leap days are not ignored. .SP .ti -5 .BI M m . n . d .br This indicates month .IR m , the .IR n -th occurrence of day .I d (1 <= .I m <= 12, 1 <= .I n <= 5, 0 <= .I d <= 6, 0=Sunday). The 5-th occurrence means the last occurrence of that day in a month. So .B M4.1.0 is the first Sunday in April, .B M9.5.0 is the last Sunday in September. .in -5 .SP The .I time field indicates the time the changeover occurs on the given day. .SH EXAMPLES Greenwich Mean Time: .PP .RS .B TZ=GMT0 .RE .PP Central European Time, 1 hour east from Greenwich, daylight saving starts on the last Sunday in March at 2 AM and ends on the last Sunday in October at 3 AM: .PP .RS .B TZ='CET\-1CEST,M3.5.0/2,M10.5.0/3' .RE .PP British time, daylight saving starts and ends at the same moment as CET, but in an earlier time zone: .PP .RS .B TZ=GMT0BST,M3.5.0/1,M10.5.0/2 .RE .PP The eastern european time zones also have the changeovers at the same absolute time as British time and CET. .PP U.S. Eastern Standard Time, 5 hours west from Greenwich, daylight saving starts on the first Sunday in April at 2 AM and ends on the last Sunday in October at 2 AM: .PP .RS .B TZ=EST5EDT,M4.1.0/2,M10.5.0/2 .RE .PP It shouldn't surprise you that daylight saving in New Zealand is observed in the months opposite from the previous examples. It starts on the first Sunday in October at 2 AM and ends on the third Sunday in March at 3 AM: .PP .RS .B TZ=NZST\-12NZDT,M10.1.0/2,M3.3.0/3 .RE .SH "SEE ALSO" .BR readclock (8), .BR date (1). .SH BUGS You may have noticed that many fields are optional. Do no omit them, because the defaults are bogus. If you need daylight saving then fully specify the changeovers. .PP West is negative, east is positive, ask any sailor. .PP Next year's time zone and daylight saving time are determined by politicians. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH DIR 5 .SH NAME dir \- directory layout .SH SYNOPSIS .nf .ft B #include #include .SH DESCRIPTION The directories of the V1 and V2 file systems are arrays of the following structure defined in : .PP .nf .ta +5n +15n +15n struct direct { ino_t d_ino; /* I-node number */ char d_name[14]; /* Name of up to 14 characters */ }; .fi .DT .PP The .B d_ino field is the inode number of the file named by .BR d_name . .B D_ino is zero if the directory slot isn't allocated. This number is the same as .B st_ino returned by .BR stat (2) unless the entry is mounted on. .B D_name is the name of up to 14 characters, null-terminated only if less then 14 in length. Any character other than null or '\fB/\fP' is allowed. .PP See .BR directory (3) for a portable way to access directories, Minix is probably the last system with these old V7 format directories. .SH "SEE ALSO" .BR directory (3). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ETHERS 5 .SH NAME ethers \- ethernet address to hostname database .SH SYNOPSIS .B /etc/ethers .SH DESCRIPTION The ethers database translates ethernet addresses to hostnames for use by the RARP daemon (see .BR rarpd (8).) .B /etc/ethers may look like this: .PP .RS .ta +20n +10n 0:0:c0:a:77:23 flotsam .br 0:0:c0:a:68:ce jetsam .RE .PP The six octet ethernet numbers must be entered as shown above, the hex constants must use lowercase letters and may not have leading zeros. Comments are marked with '#'. .PP See .BR rarpd (8) on why you shouldn't list Sun hosts in this file. .SH FILES .TP 15n /etc/ethers Ethernet addresses database. .SH "SEE ALSO" .BR hosts (5), .BR rarpd (8), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH FSTAB 5 .SH NAME fstab, mtab \- list of file systems to mount, mounted file system table. .SH SYNOPSIS .B /etc/fstab .sp .B /etc/mtab .SH DESCRIPTION .B /etc/fstab is a table of file system to mount at boot time, .B /etc/mtab is a table of currently mounted file systems as maintained by .B mount and .BR umount . .PP .B /etc/fstab is not read by .B mount as it should be. It is instead a simple shell script listing the two or three devices that Minix needs to operate: The device names of the root file system, the swap file system (optional), and the file system for .BR /usr . .PP .B /etc/mtab contains lines of four fields. The layout is: .sp .RS .nf .ft B .ta +10n +13n +8n device directory type options .ft P .fi .RE .PP These fields may be explained as follows: .sp .B device .br .RS A block special device. .RE .sp .B directory .br .RS Mount point. .RE .sp .B type .br .RS Either .BR 1 , .BR 2 , or .BR swap , indicating a V1 or a V2 file system, or swap space. .RE .sp .B options .br .RS Either .BR ro , or .BR rw , indicating a read-only or read-write mounted file system. .RE .SH FILES .TP 15n .B /etc/fstab Shell script naming three important file systems. .TP .B /etc/mtab List of mounted file systems. .SH "SEE ALSO" .BR printroot (8), .BR mount (1), .BR fsck (1), .BR mkfs (1). .SH BUGS .B /etc/fstab is a joke. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH HOSTS 5 .SH NAME hosts \- hostname to IP address database .SH SYNOPSIS .B /etc/hosts .SH DESCRIPTION The hosts database lists the IP addresses and the hostnames that translate to these IP addresses. It is used by .BR nonamed (8) in a network without name servers. A simple .B /etc/hosts may look like this: .PP .RS .ta +15n .nf 10.0.0.1 flotsam 10.0.0.2 jetsam .fi .RE .PP These two entries give names to two IP addresses. The file may contain comments marked with '#'. .PP You can have aliases (more hostnames on the same line) to give a machine more than one name, like .BR www , if you run a web server on one. .PP If your PC is Internet connected then you can specify the name server(s) to get more information from with %nameserver entries: .PP .RS .ta +\w'172.16.24.3'u+4m +\w'%nameserver'u+4m .nf 172.16.24.3 %nameserver # dns1.example.com 172.16.24.6 %nameserver # dns2.example.com .fi .RE .PP Read .BR nonamed (8) for all the details on special host file entries that configure .B nonamed for use on the Internet, and on home machines that are occasionally connected to the Internet. .SH FILES .TP 15n /etc/hosts Hosts database. .SH "SEE ALSO" .BR ethers (5), .BR nonamed (8), .BR dhcpd (8), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH KEYMAP 5 .SH NAME keymap \- keyboard maps .SH SYNOPSIS .B /etc/keymap .SH DESCRIPTION .B /etc/keymap is the compressed mapping from keyboard scan codes to ASCII. It is made from a keymap source file consisting of MAP_COLS columns (MINIX assigns the value 6 to MAX_COLS, corresponding to key pressed, key+SHIFT, key+LEFT_ALT, key+RIGHT_ALT, key+ALT+SHIFT and key+CTRL) and NR_SCAN_CODES rows (MINIX assigns the value 0x80 to NR_SCAN_CODES, corresponding to the number of scan codes to be provided by the keyboard), and each element is 2 bytes in length (see u16_t in type definitions). The low order byte corresponds to the character represented by the scan code, and the high order byte corresponds to the special meaning (when CAPS LOCK has effect, if it is a function key, etc.), which is converted to binary keymap format using the .BR genmap utility. .PP .SS "Types (general): " defines the .B u8_t and .B u16_t types, corresponding to 8 and 16 bit values. .SS "Macros: " .TP .BI "C(" c ") - Control" Maps to control code .TP .BI "A(" c ") - Alt" Sets the eight bit .TP .BI "CA(" c ") - Control-Alt" Short for .BI "A(C(" c "))" .TP .BI "L(" c ") - Caps Lock" Adds Caps Lock effect .PP These macros are used in a keymap source file to help define keys. So instead of writing .B 032 to put a CTRL-Z in the map you write .BR "C('Z')" . The .BI "L(" c ")" macro is used in column 0 to tell that the Caps Lock key is active for this key. (Caps Lock should only have effect on letters.) .SS "Definitions: " contains a large number of definitions for special keys, like function keys, and keys on the numeric keypad. They are: .PP Escape key and modifiers: .BR EXT , .BR CTRL , .BR SHIFT , .BR ALT . .PP Numeric keypad keys: .BR HOME , .BR END , .BR UP , .BR DOWN , .BR LEFT , .BR RIGHT , .BR PGUP , .BR PGDN , .BR MID " (numeric '5')," .BR PLUS , .BR INSRT . .PP ALT + numpad key: .BR AHOME , .BR AEND ", ...," .BR AINSRT . .PP CTRL + numpad: .BR CHOME , .BR CEND ", ...," .BR CINSRT . .PP Lock keys: .BR CALOCK " (Caps Lock)," .BR NLOCK " (Num Lock)," .BR SLOCK " (Scroll Lock)." .PP Function keys: .BR F1 ", ...," .BR F12 . .PP ALT - function key: .BR AF1 ", ...," .BR AF12 . .PP CTRL - function key: .BR CF1 ", ...," .BR CF12 . .PP SHIFT - function key: .BR SF1 ", ...," .BR SF12 . .PP ALT - SHIFT - function key: .BR ASF1 ", ...," .BR ASF12 . .PP There is one key definition that isn't a key at all: .BR EXTKEY . This keycode is sent by the keyboard as an indicator that the next keycode is special. For instance both ALT keys have the same keycode, but the right ALT key is sent by the keyboard preceded by the EXTKEY keycode. The same is true for the '/' key on the numeric pad versus the other '/' key on the US keyboard. (On other keyboards this key may have a different symbol.) The keyboard driver knows that a different key is presses if it is preceded by EXTKEY. .SS "Creating/changing keyboard mapping" You can create your own keyboard mapping by copying one of the existing keymap source files (Standard Minix: .BR kernel/keymaps/*.src , Minix-vmd: .BR kernel/ibm/keymaps/*.src ) and modifying the desired keys. Once this has been done, you need to recompile the genmap.c file, either by adding a new entry to the Makefile, or by running the following commands: .PP .RS .ft B cc -DKEYSRC=\e"\fIkeymap\fP.src\e" genmap.c .ft P .RE .PP After this, the .BR keymap file can be generated by running: .PP .RS .BI "a.out > " keymap .map .RE .PP The keymap can be loaded in the keyboard driver by: .PP .RS .BI "loadkeys " keymap .map .RE .PP It is wise to first run .B loadkeys on one of the maps in .B /usr/lib/keymaps so that you can easily revert back to a known keymap with a few taps on the up-arrow key and pressing return. You will otherwise have to fix the keymap with a faulty keymap loaded into the keyboard driver, which is no fun. .PP When the keymap is to your satisfaction you can copy it to .B /etc/keymap to have it loaded automatically at reboot. .SH FILES .TP 15 .B /etc/keymap Default keymap file .SH "SEE ALSO" .B loadkeys (1). .SH AUTHOR Victor A. Rodriguez - El bit Fantasma (Bit-Man@Tasa.Com.AR) .TH PASSWD 5 .SH NAME passwd, group, shadow \- user and group databases, shadow passwords .SH SYNOPSIS .B /etc/passwd .br .B /etc/group .br .B /etc/shadow .SH DESCRIPTION .B /etc/passwd lists all the users of the system, and .B /etc/group lists all the groups the users may belong to. Both files also contain encrypted passwords, numeric ID's etc. Encrypted passwords may be hidden in the file .B /etc/shadow if extra protection is warranted. .PP Each file is an text file containing one line per user or group. The data fields on a line are separated by colons. Each line in the password file has the following form: .PP .RS .I name:passwd:uid:gid:gecos:dir:shell .RE .PP The .I name field is the login name of a user, it is up to 8 letters or numbers long starting with a letter. The login name must be unique. The .I password field is either empty (no password), a 13 character encrypted password as returned by .BR crypt (3), or a login name preceded by two number signs (#) to index the shadow password file. Anything else (usually \(**) is invalid. The .I uid and .I gid fields are two numbers indicating the users user-id and group-id. These id's do not have to be unique, there may be more than one name with the same id's. The .I gecos field can be set by the user. It is expected to be a comma separated list of personal data where the first item is the full name of the user. The .I dir field is the path name of the users home directory. Lastly the .I shell field is the path name of the users login shell, it may be empty to indicate .BR /bin/sh . A Minix specific extension allows the shell field to contain extra space separated arguments for the shell. .PP Lines in the group file consist of four fields: .PP .RS .I name:passwd:gid:mem .RE .PP The .I name field is the name of the group, same restrictions as a login name. The .I passwd field may be used to let users change groups. The .I gid field is a number telling the group-id. The group-id is unique for a group. The .I mem field is a comma separated list of login names that are special members of the group. If a system supports supplementary group id's then a user's set of supplementary group id's is set to all the groups they are a member of. If a system allows one to change groups then one can change to a group one is a member of without using the group's password. .PP The shadow password file has precisely the same form as the password file, except that only the .I name or .I passwd fields are used as yet. The other fields are zero or empty. A password in the password file may have the form .BI "##" user to indicate the entry .I user in the shadow password file. The password in this entry is then used for authentication of the user. The shadow file can only be read by the privileged utility .BR pwdauth (8), so that the encrypted passwords in the shadow file are kept secret, and thus safe from a dictionary attack. .SS "Special password and group file entries" There are several entries in the password and group files that are preallocated for current or future use. All id's less than 10 are reserved. The special password file entries are: .PP .RS .nf root:##root:0:0:Big Brother:/usr/src: daemon:*:1:1:The Deuce:/etc: bin:##root:2:0:Binaries:/usr/src: uucp:*:5:5:UNIX to UNIX copy:/usr/spool/uucp:/usr/sbin/uucico news:*:6:6:Usenet news:/usr/spool/news: ftp:*:7:7:Anonymous FTP:/usr/ftp: nobody:*:9999:99::/tmp: ast:*:8:3:Andrew S. Tanenbaum:/usr/ast: .fi .RE .PP The .B root id is of course the super user. The .B daemon id is used by some daemons. Some devices are protected so that only those daemons can access them. The .B bin id owns all sources and most binaries. The .BR uucp , .BR news and .BR ftp id's are for serial line data transfer, usenet news, or ftp if so needed. The .B nobody id is used in those cases that a program may not have any privileges at all. The .B ast id is the honorary home directory for Andrew S. Tanenbaum, the creator of Minix. You can also find the initial contents for a new home directory there. .PP The special group file entries are: .PP .RS .nf operator:*:0: daemon:*:1: bin:*:2: other:*:3: tty:*:4: uucp:*:5: news:*:6: ftp:*:7: kmem:*:8: nogroup:*:99: .fi .RE .PP Groups with the same name as special user id are used with those id's. The .B operator group is for the administrators of the system. Users in this group are granted special privileges. The .B other group is for ordinary users. The .B tty group is for terminal devices, and associated set-gid commands. Same thing with the .B kmem group and memory devices. .SH FILES .TP 15n .B /etc/passwd The user database. .TP .B /etc/group The group database. .TP .B /etc/shadow The shadow password file. .SH "SEE ALSO" .BR login (1), .BR passwd (1), .BR su (1), .BR crypt (3), .BR getpwent (3), .BR getgrent (3), .BR pwdauth (8). .SH NOTES The .B nobody and .B nogroup id's are likely to be renumbered to the highest possible id's once it is figured out what they are. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH RESOLV.CONF 5 .SH NAME resolv.conf \- Domain Name System resolver configuration .SH SYNOPSIS .B /etc/resolv.conf .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B /etc/resolv.conf is used to configure how the host will use the Domain Name System to resolve hostnames to IP addresses. It may contain these two lines: .PP .RS .ta +15n nameserver \fIIP-address\fP .br domain \fIdomain-name\fP .RE .PP The nameserver entry tells the IP address of the host to use for DNS queries. If it is set to 127.0.0.1 (which is the default) then the local name daemon is used that may use the .B /etc/hosts database to translate host names. You normally only need a nameserver entry if the name server is at the other side of a router. The default .B nonamed name server can't look beyond the local network. .PP The domain entry tells the default domain to use for unqualified hostnames. This entry is usually not given in which case the domain of the local host is used. .PP The long version of this story can be found in .BR resolver (5). .SH FILES .TP 20n /etc/resolv.conf DNS resolver configuration file. .SH "SEE ALSO" .BR resolver (5), .BR hosts (5), .BR nonamed (8), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1986 The Regents of the University of California. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms are permitted .\" provided that the above copyright notice and this paragraph are .\" duplicated in all such forms and that any documentation, .\" advertising materials, and other materials related to such .\" distribution and use acknowledge that the software was developed .\" by the University of California, Berkeley. The name of the .\" University may not be used to endorse or promote products derived .\" from this software without specific prior written permission. .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR .\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED .\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. .\" .\" @(#)resolver.5 5.9 (Berkeley) 12/14/89 .\" .TH RESOLVER 5 "December 14, 1989" .UC 4 .SH NAME resolver \- resolver configuration file .SH SYNOPSIS /etc/resolv.conf .SH DESCRIPTION .LP The .I resolver is a set of routines in the C library (\c .IR resolv (3)) that provide access to the Internet Domain Name System. The resolver configuration file contains information that is read by the resolver routines the first time they are invoked by a process. The file is designed to be human readable and contains a list of keywords with values that provide various types of resolver information. .LP On a normally configured system this file should not be necessary. The only name server to be queried will be on the local machine, the domain name is determined from the host name, and the domain search path is constructed from the domain name. .LP The different configuration options are: .TP \fBnameserver\fP Internet address (in dot notation) of a name server that the resolver should query. Up to MAXNS (currently 3) name servers may be listed, one per keyword. If there are multiple servers, the resolver library queries them in the order listed. If no \fBnameserver\fP entries are present, the default is to use the name server on the local machine. (The algorithm used is to try a name server, and if the query times out, try the next, until out of name servers, then repeat trying all the name servers until a maximum number of retries are made). .TP \fBdomain\fP Local domain name. Most queries for names within this domain can use short names relative to the local domain. If no \fBdomain\fP entry is present, the domain is determined from the local host name returned by \fIgethostname\fP\|(2); the domain part is taken to be everything after the first `.'. Finally, if the host name does not contain a domain part, the root domain is assumed. .TP \fBsearch\fP Search list for host-name lookup. The search list is normally determined from the local domain name; by default, it begins with the local domain name, then successive parent domains that have at least two components in their names. This may be changed by listing the desired domain search path following the \fIsearch\fP keyword with spaces or tabs separating the names. Most resolver queries will be attempted using each component of the search path in turn until a match is found. Note that this process may be slow and will generate a lot of network traffic if the servers for the listed domains are not local, and that queries will time out if no server is available for one of the domains. .IP The search list is currently limited to six domains with a total of 256 characters. .LP The \fIdomain\fP and \fIsearch\fP keywords are mutually exclusive. If more than one instance of these keywords is present, the last instance will override. .LP The keyword and value must appear on a single line, and the keyword (e.g. \fBnameserver\fP) must start the line. The value follows the keyword, separated by white space. .SH FILES .I /etc/resolv.conf .SH SEE ALSO gethostbyname(3N), resolver(3), hostname(7), named(8) .br Name Server Operations Guide for BIND .TH RHOSTS 5 .SH NAME rhosts, hosts.equiv \- trusted remote users or hosts .SH SYNOPSIS .BI ~ user /.rhosts .br .B /etc/hosts.equiv .SH DESCRIPTION The per user .B .rhosts and the per system .B hosts.equiv files can be used to allow users to use .B rlogin or .B rsh without a password. The remote login services first check the system wide .B /etc/hosts.equiv file and then the .BI ~ user /.rhosts of the intended user. Both files contain lines of one of two forms: .PP .RS .I host .br .I host ruser .RE .PP The first form tells that any user from .I host is allowed to login to this system under the same name. The second form allows .I ruser from .I host to login. .PP The .B .rhosts file is checked to be owned by .I user or root, and only its owner may be able to write it. .SH "SEE ALSO" .BR rlogin (1), .BR rsh (1). .SH NOTES Minix has no restrictions on becoming super-user remotely. Other systems usually do. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)termcap.5 6.4 (Berkeley) 5/15/86 .\" .tr || .tr *\(** .TH TERMCAP 5 "1 November 1985" .UC .SH NAME termcap \- terminal capability data base .SH SYNOPSIS .B /etc/termcap .SH DESCRIPTION .B Termcap\^ is a data base describing terminals, used, .IR e.g. , by .BR vi\^ (1) and .BR curses\^ (3). Terminals are described in .B termcap\^ by giving a set of capabilities that they have and by describing how operations are performed. Padding requirements and initialization sequences are included in .BR termcap\^ . .PP Entries in .B termcap\^ consist of a number of `:'-separated fields. The first entry for each terminal gives the names that are known for the terminal, separated by `|' characters. The first name is always two characters long and is used by older systems which store the terminal type in a 16-bit word in a system-wide data base. The second name given is the most common abbreviation for the terminal, the last name given should be a long name fully identifying the terminal, and all others are understood as synonyms for the terminal name. All names but the first and last should be in lower case and contain no blanks; the last name may well contain upper case and blanks for readability. .PP Terminal names (except for the last, verbose entry) should be chosen using the following conventions. The particular piece of hardware making up the terminal should have a root name chosen, thus \*(lqhp2621\*(rq. This name should not contain hyphens. Modes that the hardware can be in or user preferences should be indicated by appending a hyphen and an indicator of the mode. Therefore, a \*(lqvt100\*(rq in 132-column mode would be \*(lqvt100-w\*(rq. The following suffixes should be used where possible: .sp .ta .if t .ta \w'\fBSuffix\fP\ \ \ 'u +\w'With automatic margins (usually default)\ \ 'u .if n .ta \w'Suffix\ \ \ 'u +\w'With automatic margins (usually default)\ \ 'u .nf .if t .nr Xx \n(.lu-\n(.i-\w'\fBSuffix\fP\ \ \ With automatic margins (usually default)\ \ vt100-am'u .if t .in +\n(Xxu/2u \fBSuffix Meaning Example\fP -w Wide mode (more than 80 columns) vt100-w -am With automatic margins (usually default) vt100-am -nam Without automatic margins vt100-nam -\fIn\fP Number of lines on the screen aaa-60 -na No arrow keys (leave them in local) concept100-na -\fIn\^\fPp Number of pages of memory concept100-4p -rv Reverse video concept100-rv .fi .SH CAPABILITIES .PP The characters in the .B Notes field in the table have the following meanings (more than one may apply to a capability): .PP .ta .ta \w'N\ \ \ 'u .nr fi \w'N\ \ \ ' .in +\n(fiu .ti -\n(fiu N indicates numeric parameter(s) .ti -\n(fiu P indicates that padding may be specified .ti -\n(fiu * indicates that padding may be based on the number of lines affected .ti -\n(fiu o indicates capability is obsolete .in +\n(fiu .PP \*(lqObsolete\*(rq capabilities have no .B terminfo\^ equivalents, since they were considered useless, or are subsumed by other capabilities. New software should not rely on them at all. .PP .if t .ta \w'\fBName \fP'u +\w'\fBType \fP'u +\w'\fBNotes \fP'u .if n .ta \w'Name 'u +\w'Type 'u +\w'Notes 'u \" Cawf troubled by \w'\fB .if t .nr fi \w'\fBName Type Notes \fP' .if n .nr fi \w'Name Type Notes ' .in +\n(fiu .ti -\n(fiu \fBName Type Notes Description\fP .ti -\n(fiu ae str (P) End alternate character set .ti -\n(fiu AL str (NP*) Add \fIn\^\fP new blank lines .ti -\n(fiu al str (P*) Add new blank line .ti -\n(fiu am bool Terminal has automatic margins .ti -\n(fiu as str (P) Start alternate character set .ti -\n(fiu bc str (o) Backspace if not \fB^H\fP .ti -\n(fiu bl str (P) Audible signal (bell) .ti -\n(fiu bs bool (o) Terminal can backspace with \fB^H\fP .ti -\n(fiu bt str (P) Back tab .ti -\n(fiu bw bool \fBle\fP (backspace) wraps from column 0 to last column .ti -\n(fiu CC str Terminal settable command character in prototype .ti -\n(fiu cd str (P*) Clear to end of display .ti -\n(fiu ce str (P) Clear to end of line .ti -\n(fiu ch str (NP) Set cursor column (horizontal position) .ti -\n(fiu cl str (P*) Clear screen and home cursor .ti -\n(fiu CM str (NP) Memory-relative cursor addressing .ti -\n(fiu cm str (NP) Screen-relative cursor motion .ti -\n(fiu co num Number of columns in a line (See BUGS section below) .ti -\n(fiu cr str (P) Carriage return .ti -\n(fiu cs str (NP) Change scrolling region (VT100) .ti -\n(fiu ct str (P) Clear all tab stops .ti -\n(fiu cv str (NP) Set cursor row (vertical position) .ti -\n(fiu da bool Display may be retained above the screen .ti -\n(fiu dB num (o) Milliseconds of \fBbs\fP delay needed (default 0) .ti -\n(fiu db bool Display may be retained below the screen .ti -\n(fiu DC str (NP*) Delete \fIn\^\fP characters .ti -\n(fiu dC num (o) Milliseconds of \fBcr\fP delay needed (default 0) .ti -\n(fiu dc str (P*) Delete character .ti -\n(fiu dF num (o) Milliseconds of \fBff\fP delay needed (default 0) .ti -\n(fiu DL str (NP*) Delete \fIn\^\fP lines .ti -\n(fiu dl str (P*) Delete line .ti -\n(fiu dm str Enter delete mode .ti -\n(fiu dN num (o) Milliseconds of \fBnl\fP delay needed (default 0) .ti -\n(fiu DO str (NP*) Move cursor down \fIn\^\fP lines .ti -\n(fiu do str Down one line .ti -\n(fiu ds str Disable status line .ti -\n(fiu dT num (o) Milliseconds of horizontal tab delay needed (default 0) .ti -\n(fiu dV num (o) Milliseconds of vertical tab delay needed (default 0) .ti -\n(fiu ec str (NP) Erase \fIn\^\fP characters .ti -\n(fiu ed str End delete mode .ti -\n(fiu ei str End insert mode .ti -\n(fiu eo bool Can erase overstrikes with a blank .ti -\n(fiu EP bool (o) Even parity .ti -\n(fiu es bool Escape can be used on the status line .ti -\n(fiu ff str (P*) Hardcopy terminal page eject .ti -\n(fiu fs str Return from status line .ti -\n(fiu gn bool Generic line type (\fIe.g.\fP dialup, switch) .ti -\n(fiu hc bool Hardcopy terminal .ti -\n(fiu HD bool (o) Half-duplex .ti -\n(fiu hd str Half-line down (forward 1/2 linefeed) .ti -\n(fiu ho str (P) Home cursor .ti -\n(fiu hs bool Has extra \*(lqstatus line\*(rq .ti -\n(fiu hu str Half-line up (reverse 1/2 linefeed) .ti -\n(fiu hz bool Cannot print ~s (Hazeltine) .ti -\n(fiu i1-i3 str Terminal initialization strings (\fBterminfo\^\fP only) .ti -\n(fiu IC str (NP*) Insert \fIn\^\fP blank characters .ti -\n(fiu ic str (P*) Insert character .ti -\n(fiu if str Name of file containing initialization string .ti -\n(fiu im str Enter insert mode .ti -\n(fiu in bool Insert mode distinguishes nulls .ti -\n(fiu iP str Pathname of program for initialization (\fBterminfo\^\fP only) .ti -\n(fiu ip str (P*) Insert pad after character inserted .ti -\n(fiu is str Terminal initialization string (\fBtermcap\^\fP only) .ti -\n(fiu it num Tabs initially every \fIn\^\fP positions .ti -\n(fiu K1 str Sent by keypad upper left .ti -\n(fiu K2 str Sent by keypad upper right .ti -\n(fiu K3 str Sent by keypad center .ti -\n(fiu K4 str Sent by keypad lower left .ti -\n(fiu K5 str Sent by keypad lower right .ti -\n(fiu k0-k9 str Sent by function keys 0-9 .ti -\n(fiu kA str Sent by insert-line key .ti -\n(fiu ka str Sent by clear-all-tabs key .ti -\n(fiu kb str Sent by backspace key .ti -\n(fiu kC str Sent by clear-screen or erase key .ti -\n(fiu kD str Sent by delete-character key .ti -\n(fiu kd str Sent by down-arrow key .ti -\n(fiu kE str Sent by clear-to-end-of-line key .ti -\n(fiu ke str Out of \*(lqkeypad transmit\*(rq mode .ti -\n(fiu kF str Sent by scroll-forward/down key .ti -\n(fiu kH str Sent by home-down key .ti -\n(fiu kh str Sent by home key .ti -\n(fiu kI str Sent by insert-character or enter-insert-mode key .ti -\n(fiu kL str Sent by delete-line key .ti -\n(fiu kl str Sent by left-arrow key .ti -\n(fiu kM str Sent by insert key while in insert mode .ti -\n(fiu km bool Has a \*(lqmeta\*(rq key (shift, sets parity bit) .ti -\n(fiu kN str Sent by next-page key .ti -\n(fiu kn num (o) Number of function (\fBk0\fP\-\fBk9\fP) keys (default 0) .ti -\n(fiu ko str (o) T@$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$ermcap entries for other non-function keys .ti -\n(fiu kP str Sent by previous-page key .ti -\n(fiu kR str Sent by scroll-backward/up key .ti -\n(fiu kr str Sent by right-arrow key .ti -\n(fiu kS str Sent by clear-to-end-of-screen key .ti -\n(fiu ks str Put terminal in \*(lqkeypad transmit\*(rq mode .ti -\n(fiu kT str Sent by set-tab key .ti -\n(fiu kt str Sent by clear-tab key .ti -\n(fiu ku str Sent by up-arrow key .ti -\n(fiu l0-l9 str Labels on function keys if not \*(lqf\fIn\^\fP\*(rq .ti -\n(fiu LC bool (o) Lower-case only .ti -\n(fiu LE str (NP) Move cursor left \fIn\^\fP positions .ti -\n(fiu le str (P) Move cursor left one position .ti -\n(fiu li num Number of lines on screen or page (See BUGS section below) .ti -\n(fiu ll str Last line, first column .ti -\n(fiu lm num Lines of memory if > \fBli\fP (0 means varies) .ti -\n(fiu ma str (o) Arrow key map (used by \fBvi\^\fP version 2 only) .ti -\n(fiu mb str Turn on blinking attribute .ti -\n(fiu md str Turn on bold (extra bright) attribute .ti -\n(fiu me str Turn off all attributes .ti -\n(fiu mh str Turn on half-bright attribute .ti -\n(fiu mi bool Safe to move while in insert mode .ti -\n(fiu mk str Turn on blank attribute (characters invisible) .ti -\n(fiu ml str (o) Memory lock on above cursor .ti -\n(fiu mm str Turn on \*(lqmeta mode\*(rq (8th bit) .ti -\n(fiu mo str Turn off \*(lqmeta mode\*(rq .ti -\n(fiu mp str Turn on protected attribute .ti -\n(fiu mr str Turn on reverse-video attibute .ti -\n(fiu ms bool Safe to move in standout modes .ti -\n(fiu mu str (o) Memory unlock (turn off memory lock) .ti -\n(fiu nc bool (o) No correctly-working \fBcr\fP (Datamedia 2500, Hazeltine 2000) .ti -\n(fiu nd str Non-destructive space (cursor right) .ti -\n(fiu NL bool (o) \fB\\n\fP is newline, not line feed .ti -\n(fiu nl str (o) Newline character if not \fB\\n\fP .ti -\n(fiu ns bool (o) Terminal is a \s-1CRT\s0 but doesn't scroll .ti -\n(fiu nw str (P) Newline (behaves like \fBcr\fP followed by \fBdo\fP) .ti -\n(fiu OP bool (o) Odd parity .ti -\n(fiu os bool Terminal overstrikes .ti -\n(fiu pb num Lowest baud where delays are required .ti -\n(fiu pc str Pad character (default \s-2NUL\s0) .ti -\n(fiu pf str Turn off the printer .ti -\n(fiu pk str Program function key \fIn\^\fP to type string \fIs\fP (\fBterminfo\^\fP only) .ti -\n(fiu pl str Program function key \fIn\^\fP to execute string \fIs\fP (\fBterminfo\^\fP only) .ti -\n(fiu pO str (N) Turn on the printer for \fIn\^\fP bytes .ti -\n(fiu po str Turn on the printer .ti -\n(fiu ps str Print contents of the screen .ti -\n(fiu pt bool (o) Has hardware tabs (may need to be set with \fBis\fP) .ti -\n(fiu px str Program function key \fIn\^\fP to transmit string \fIs\fP (\fBterminfo\^\fP only) .ti -\n(fiu r1-r3 str Reset terminal completely to sane modes (\fBterminfo\^\fP only) .ti -\n(fiu rc str (P) Restore cursor to position of last \fBsc\fP .ti -\n(fiu rf str Name of file containing reset codes .ti -\n(fiu RI str (NP) Move cursor right \fIn\^\fP positions .ti -\n(fiu rp str (NP*) Repeat character \fIc n\^\fP times .ti -\n(fiu rs str Reset terminal completely to sane modes (\fBtermcap\^\fP only) .ti -\n(fiu sa str (NP) Define the video attributes .ti -\n(fiu sc str (P) Save cursor position .ti -\n(fiu se str End standout mode .ti -\n(fiu SF str (NP*) Scroll forward \fIn\^\fP lines .ti -\n(fiu sf str (P) Scroll text up .ti -\n(fiu sg num Number of garbage chars left by \fBso\fP or \fBse\fP (default 0) .ti -\n(fiu so str Begin standout mode .ti -\n(fiu SR str (NP*) Scroll backward \fIn\^\fP lines .ti -\n(fiu sr str (P) Scroll text down .ti -\n(fiu st str Set a tab in all rows, current column .ti -\n(fiu ta str (P) Tab to next 8-position hardware tab stop .ti -\n(fiu tc str Entry of similar terminal \- must be last .ti -\n(fiu te str String to end programs that use \fBtermcap\fP .ti -\n(fiu ti str String to begin programs that use \fBtermcap\fP .ti -\n(fiu ts str (N) Go to status line, column \fIn\^\fP .ti -\n(fiu UC bool (o) Upper-case only .ti -\n(fiu uc str Underscore one character and move past it .ti -\n(fiu ue str End underscore mode .ti -\n(fiu ug num Number of garbage chars left by \fBus\fP or \fBue\fP (default 0) .ti -\n(fiu ul bool Underline character overstrikes .ti -\n(fiu UP str (NP*) Move cursor up \fIn\^\fP lines .ti -\n(fiu up str Upline (cursor up) .ti -\n(fiu us str Start underscore mode .ti -\n(fiu vb str Visible bell (must not move cursor) .ti -\n(fiu ve str Make cursor appear normal (undo \fBvs\fP/\fBvi\fP) .ti -\n(fiu vi str Make cursor invisible .ti -\n(fiu vs str Make cursor very visible .ti -\n(fiu vt num Virtual terminal number (not supported on all systems) .ti -\n(fiu wi str (N) Set current window .ti -\n(fiu ws num Number of columns in status line .ti -\n(fiu xb bool Beehive (f1=\s-2ESC\s0, f2=^C) .ti -\n(fiu xn bool Newline ignored after 80 cols (Concept) .ti -\n(fiu xo bool Terminal uses xoff/xon (\s-2DC3\s0/\s-2DC1\s0) handshaking .ti -\n(fiu xr bool (o) Return acts like \fBce cr nl\fP (Delta Data) .ti -\n(fiu xs bool Standout not erased by overwriting (Hewlett-Packard) .ti -\n(fiu xt bool Tabs ruin, magic \fBso\fP char (Teleray 1061) .ti -\n(fiu xx bool (o) Tektronix 4025 insert-line .in -\n(fiu .PP .B A Sample Entry .PP The following entry, which describes the Concept\-100, is among the more complex entries in the .B termcap\^ file as of this writing. .PP .nf .if t .ta 8n +8n .if n .ta 2n +2n ca\||\|concept100\||\|c100\||\|concept\||\|c104\||\|concept100-4p\||\|HDS Concept\-100:\e :al=3*\eE^R:am:bl=^G:cd=16*\eE^C:ce=16\eE^U:cl=2*^L:cm=\eEa%+ %+ :\e :co#80:.cr=9^M:db:dc=16\eE^A:dl=3*\eE^B:do=^J:ei=\eE\e200:eo:im=\eE^P:in:\e :ip=16*:is=\eEU\eEf\eE7\eE5\eE8\eEl\eENH\eEK\eE\e200\eEo&\e200\eEo\e47\eE:k1=\eE5:\e :k2=\eE6:k3=\eE7:kb=^h:kd=\eE<:ke=\eEx:kh=\eE?:kl=\eE>:kr=\eE=:ks=\eEX:\e :ku=\eE;:le=^H:li#24:mb=\eEC:me=\eEN\e200:mh=\eEE:mi:mk=\eEH:mp=\eEI:\e :mr=\eED:nd=\eE=:pb#9600:rp=0.2*\eEr%.%+ :se=\eEd\eEe:sf=^J:so=\eEE\eED:\e :.ta=8\et:te=\eEv \e200\e200\e200\e200\e200\e200\eEp\er\en:\e :ti=\eEU\eEv 8p\eEp\er:ue=\eEg:ul:up=\eE;:us=\eEG:\e :vb=\eEk\e200\e200\e200\e200\e200\e200\e200\e200\e200\e200\e200\e200\e200\e200\eEK:\e :ve=\eEw:vs=\eEW:vt#8:xn:\e :bs:cr=^M:dC#9:dT#8:nl=^J:ta=^I:pt: .fi .PP Entries may continue onto multiple lines by giving a \e as the last character of a line, and empty fields may be included for readability (here between the last field on a line and the first field on the next). Comments may be included on lines beginning with \*(lq#\*(rq. .br .ne 5 .PP .B Types of Capabilities .PP Capabilities in .B termcap\^ are of three types: Boolean capabilities, which indicate particular features that the terminal has; numeric capabilities, giving the size of the display or the size of other attributes; and string capabilities, which give character sequences that can be used to perform particular terminal operations. All capabilities have two-letter codes. For instance, the fact that the Concept has .I automatic margins .RI ( i.e. , an automatic return and linefeed when the end of a line is reached) is indicated by the Boolean capability .BR am . Hence the description of the Concept includes .BR am . .PP Numeric capabilities are followed by the character `#' then the value. In the example above .BR co , which indicates the number of columns the display has, gives the value `80' for the Concept. .PP Finally, string-valued capabilities, such as .B ce (clear-to-end-of-line sequence) are given by the two-letter code, an `=', then a string ending at the next following `:'. A delay in milliseconds may appear after the `=' in such a capability, which causes padding characters to be supplied by .B tputs\^ after the remainder of the string is sent to provide this delay. The delay can be either a number, .I e.g. `20', or a number followed by an `*', .IR i.e. , `3*'. An `*' indicates that the padding required is proportional to the number of lines affected by the operation, and the amount given is the per-affected-line padding required. (In the case of insert-character, the factor is still the number of .I lines\^ affected; this is always 1 unless the terminal has .B in and the software uses it.) When an `*' is specified, it is sometimes useful to give a delay of the form `3.5' to specify a delay per line to tenths of milliseconds. (Only one decimal place is allowed.) .PP A number of escape sequences are provided in the string-valued capabilities for easy encoding of control characters there. .B \eE maps to an \s-2ESC\s0 character, .B ^X maps to a control-X for any appropriate X, and the sequences .B \en .B \er .B \et .B \eb .B \ef map to linefeed, return, tab, backspace, and formfeed, respectively. Finally, characters may be given as three octal digits after a .BR \e , and the characters .B ^ and .B \e may be given as .B \e^ and .BR \e\e . If it is necessary to place a .B : in a capability it must be escaped in octal as .BR \e072 . If it is necessary to place a \s-2NUL\s0 character in a string capability it must be encoded as .BR \e200 . (The routines that deal with .B termcap\^ use C strings and strip the high bits of the output very late, so that a .B \e200 comes out as a .B \e000 would.) .PP Sometimes individual capabilities must be commented out. To do this, put a period before the capability name. For example, see the first .B cr and .B ta in the example above. .br .ne 5 .PP .B Preparing Descriptions .PP We now outline how to prepare descriptions of terminals. The most effective way to prepare a terminal description is by imitating the description of a similar terminal in .B termcap\^ and to build up a description gradually, using partial descriptions with .B vi\^ to check that they are correct. Be aware that a very unusual terminal may expose deficiencies in the ability of the .B termcap\^ file to describe it or bugs in .BR vi\^ . To easily test a new terminal description you can set the environment variable .B .SM TERMCAP to the absolute pathname of a file containing the description you are working on and programs will look there rather than in .BR /etc/termcap\^ . .B .SM TERMCAP can also be set to the .B termcap\^ entry itself to avoid reading the file when starting up a program. .PP To get the padding for insert-line right (if the terminal manufacturer did not document it), a severe test is to use .B vi\^ to edit .B /etc/passwd\^ at 9600 baud, delete roughly 16 lines from the middle of the screen, then hit the `u' key several times quickly. If the display messes up, more padding is usually needed. A similar test can be used for insert-character. .br .ne 5 .PP .B Basic Capabilities .PP The number of columns on each line of the display is given by the .B co numeric capability. If the display is a \s-1CRT\s0, then the number of lines on the screen is given by the .B li capability. If the display wraps around to the beginning of the next line when the cursor reaches the right margin, then it should have the .B am capability. If the terminal can clear its screen, the code to do this is given by the .B cl string capability. If the terminal overstrikes (rather than clearing the position when a character is overwritten), it should have the .B os capability. If the terminal is a printing terminal, with no soft copy unit, give it both .B hc and .BR os . .RB ( os applies to storage scope terminals, such as the Tektronix 4010 series, as well as to hard copy and .SM APL terminals.) If there is a code to move the cursor to the left edge of the current row, give this as .BR cr . (Normally this will be carriage-return, .BR ^M .) If there is a code to produce an audible signal (bell, beep, .IR etc.\^ ), give this as .BR bl . .PP If there is a code (such as backspace) to move the cursor one position to the left, that capability should be given as .BR le . Similarly, codes to move to the right, up, and down should be given as .BR nd , .BR up , and .BR do , respectively. These .I local cursor motions\^ should not alter the text they pass over; for example, you would not normally use \*(lqnd=\ \*(rq unless the terminal has the .B os capability, because the space would erase the character moved over. .PP A very important point here is that the local cursor motions encoded in .B termcap\^ have undefined behavior at the left and top edges of a .SM CRT display. Programs should never attempt to backspace around the left edge, unless .B bw is given, and never attempt to go up off the top using local cursor motions. .PP In order to scroll text up, a program goes to the bottom left corner of the screen and sends the .B sf (index) string. To scroll text down, a program goes to the top left corner of the screen and sends the .B sr (reverse index) string. The strings .B sf and .B sr have undefined behavior when not on their respective corners of the screen. Parameterized versions of the scrolling sequences are .B SF and .BR SR , which have the same semantics as .B sf and .B sr except that they take one parameter and scroll that many lines. They also have undefined behavior except at the appropriate corner of the screen. .PP The .B am capability tells whether the cursor sticks at the right edge of the screen when text is output there, but this does not necessarily apply to .B nd from the last column. Leftward local motion is defined from the left edge only when .B bw is given; then an .B le from the left edge will move to the right edge of the previous row. This is useful for drawing a box around the edge of the screen, for example. If the terminal has switch-selectable automatic margins, the .B termcap\^ description usually assumes that this feature is on, .IR i.e. , .BR am . If the terminal has a command that moves to the first column of the next line, that command can be given as .B nw (newline). It is permissible for this to clear the remainder of the current line, so if the terminal has no correctly-working \s-2CR\s0 and \s-2LF\s0 it may still be possible to craft a working .B nw out of one or both of them. .PP These capabilities suffice to describe hardcopy and \*(lqglass-tty\*(rq terminals. Thus the Teletype model 33 is described as .PP .nf T3\||\|tty33\||\|33\||\|tty\||\|Teletype model 33:\e :bl=^G:co#72:cr=^M:do=^J:hc:os: .fi .PP and the Lear Siegler \s-1ADM\s0\-3 is described as .PP .nf l3\||\|adm3\||\|3\||\|LSI \s-1ADM\s0-3:\e :am:bl=^G:cl=^Z:co#80:cr=^M:do=^J:le=^H:li#24:sf=^J: .fi .br .ne 5 .PP .B Parameterized Strings .PP Cursor addressing and other strings requiring parameters are described by a parameterized string capability, with .BR printf\^ (3)-like escapes .B %x in it, while other characters are passed through unchanged. For example, to address the cursor the .B cm capability is given, using two parameters: the row and column to move to. (Rows and columns are numbered from zero and refer to the physical screen visible to the user, not to any unseen memory. If the terminal has memory-relative cursor addressing, that can be indicated by an analogous .B CM capability.) .PP The .B % encodings have the following meanings: .PP .in +16n .ta +8n .ti -8n %% output `%' .ti -8n %d output value as in \fBprintf\^\fP %d .ti -8n %2 output value as in \fBprintf\^\fP %2d .ti -8n %3 output value as in \fBprintf\^\fP %3d .ti -8n %. output value as in \fBprintf\^\fP %c .ti -8n %+\fIx\fP add \fIx\^\fP to value, then do %. .ti -8n %>\fIxy\fP if value > \fIx\^\fP then add \fIy\^\fP, no output .ti -8n %r reverse order of two parameters, no output .ti -8n %i increment by one, no output .ti -8n %n exclusive-or all parameters with 0140 (Datamedia 2500) .ti -8n %B BCD (16*(value/10)) + (value%10), no output .ti -8n %D Reverse coding (value \- 2*(value%16)), no output (Delta Data) .ti -16n .fi .PP Consider the Hewlett-Packard 2645, which, to get to row 3 and column 12, needs to be sent \*(lq\eE&a12c03Y\*(rq padded for 6 milliseconds. Note that the order of the row and column coordinates is reversed here and that the row and column are sent as two-digit integers. Thus its .B cm capability is \*(lqcm=6\eE&%r%2c%2Y\*(rq. .PP The Microterm .SM ACT-IV needs the current row and column sent simply encoded in binary preceded by a .BR ^T , \*(lqcm=^T%.%.\*(rq. Terminals that use \*(lq%.\*(rq need to be able to backspace the cursor .RB ( le ) and to move the cursor up one line on the screen .RB ( up ). This is necessary because it is not always safe to transmit .BR \en , .BR ^D , and .BR \er , as the system may change or discard them. (Programs using .B termcap\^ must set terminal modes so that tabs are not expanded, so .B \et is safe to send. This turns out to be essential for the Ann Arbor 4080.) .PP A final example is the Lear Siegler \s-1ADM\s0\-3a, which offsets row and column by a blank character, thus \*(lqcm=\eE=%+ %+ \*(rq. .PP Row or column absolute cursor addressing can be given as single parameter capabilities .B ch (horizontal position absolute) and .B cv (vertical position absolute). Sometimes these are shorter than the more general two-parameter sequence (as with the Hewlett-Packard 2645) and can be used in preference to .BR cm . If there are parameterized local motions .RI ( e.g. , move .I n\^ positions to the right) these can be given as .BR DO , .BR LE , .BR RI , and .B UP with a single parameter indicating how many positions to move. These are primarily useful if the terminal does not have .BR cm , such as the Tektronix 4025. .br .ne 5 .PP .B Cursor Motions .PP If the terminal has a fast way to home the cursor (to the very upper left corner of the screen), this can be given as .BR ho . Similarly, a fast way of getting to the lower left-hand corner can be given as .BR ll ; this may involve going up with .B up from the home position, but a program should never do this itself (unless .B ll does), because it can make no assumption about the effect of moving up from the home position. Note that the home position is the same as cursor address (0,0): to the top left corner of the screen, not of memory. (Therefore, the \*(lq\eEH\*(rq sequence on Hewlett-Packard terminals cannot be used for .BR ho .) .br .ne 5 .PP .B Area Clears .PP If the terminal can clear from the current position to the end of the line, leaving the cursor where it is, this should be given as .BR ce . If the terminal can clear from the current position to the end of the display, this should be given as .BR cd . .B cd must only be invoked from the first column of a line. (Therefore, it can be simulated by a request to delete a large number of lines, if a true .B cd is not available.) .br .ne 5 .PP .B Insert/Delete Line .PP If the terminal can open a new blank line before the line containing the cursor, this should be given as .BR al ; this must be invoked only from the first position of a line. The cursor must then appear at the left of the newly blank line. If the terminal can delete the line that the cursor is on, this should be given as .BR dl ; this must only be used from the first position on the line to be deleted. Versions of .B al and .B dl which take a single parameter and insert or delete that many lines can be given as .B AL and .BR DL . If the terminal has a settable scrolling region (like the VT100), the command to set this can be described with the .B cs capability, which takes two parameters: the top and bottom lines of the scrolling region. The cursor position is, alas, undefined after using this command. It is possible to get the effect of insert or delete line using this command \(em the .B sc and .B rc (save and restore cursor) commands are also useful. Inserting lines at the top or bottom of the screen can also be done using .B sr or .B sf on many terminals without a true insert/delete line, and is often faster even on terminals with those features. .PP If the terminal has the ability to define a window as part of memory which all commands affect, it should be given as the parameterized string .BR wi . The four parameters are the starting and ending lines in memory and the starting and ending columns in memory, in that order. (This .B terminfo\^ capability is described for completeness. It is unlikely that any .BR termcap\^ -using program will support it.) .PP If the terminal can retain display memory above the screen, then the .B da capability should be given; if display memory can be retained below, then .B db should be given. These indicate that deleting a line or scrolling may bring non-blank lines up from below or that scrolling back with .B sr may bring down non-blank lines. .br .ne 5 .PP .B Insert/Delete Character .PP There are two basic kinds of intelligent terminals with respect to insert/delete character that can be described using .BR termcap\^ . The most common insert/delete character operations affect only the characters on the current line and shift characters off the end of the line rigidly. Other terminals, such as the Concept\-100 and the Perkin Elmer Owl, make a distinction between typed and untyped blanks on the screen, shifting upon an insert or delete only to an untyped blank on the screen which is either eliminated or expanded to two untyped blanks. You can determine the kind of terminal you have by clearing the screen then typing text separated by cursor motions. Type \*(lqabc\ \ \ \ def\*(rq using local cursor motions (not spaces) between the \*(lqabc\*(rq and the \*(lqdef\*(rq. Then position the cursor before the \*(lqabc\*(rq and put the terminal in insert mode. If typing characters causes the rest of the line to shift rigidly and characters to fall off the end, then your terminal does not distinguish between blanks and untyped positions. If the \*(lqabc\*(rq shifts over to the \*(lqdef\*(rq which then move together around the end of the current line and onto the next as you insert, then you have the second type of terminal and should give the capability \fBin\fP, which stands for \*(lqinsert null\*(rq. While these are two logically separate attributes (one line .I vs. multi-line insert mode, and special treatment of untyped spaces), we have seen no terminals whose insert mode cannot be described with the single attribute. .PP .B Termcap\^ can describe both terminals that have an insert mode and terminals that send a simple sequence to open a blank position on the current line. Give as .B im the sequence to get into insert mode. Give as .B ei the sequence to leave insert mode. Now give as .B ic any sequence that needs to be sent just before each character to be inserted. Most terminals with a true insert mode will not give .BR ic ; terminals that use a sequence to open a screen position should give it here. (If your terminal has both, insert mode is usually preferable to .BR ic . Do not give both unless the terminal actually requires both to be used in combination.) If post-insert padding is needed, give this as a number of milliseconds in .B ip (a string option). Any other sequence that may need to be sent after insertion of a single character can also be given in .BR ip . If your terminal needs to be placed into an `insert mode' and needs a special code preceding each inserted character, then both .BR im / ei and .B ic can be given, and both will be used. The .B IC capability, with one parameter .IR n\^ , will repeat the effects of .B ic .I n\^ times. .PP It is occasionally necessary to move around while in insert mode to delete characters on the same line .RI ( e.g. , if there is a tab after the insertion position). If your terminal allows motion while in insert mode, you can give the capability .B mi to speed up inserting in this case. Omitting .B mi will affect only speed. Some terminals (notably Datamedia's) must not have .B mi because of the way their insert mode works. .PP Finally, you can specify .B dc to delete a single character, .B DC with one parameter .I n\^ to delete .I n\^ characters, and delete mode by giving .B dm and .B ed to enter and exit delete mode (which is any mode the terminal needs to be placed in for .B dc to work). .br .ne 5 .PP .B Highlighting, Underlining, and Visible Bells .PP If your terminal has one or more kinds of display attributes, these can be represented in a number of different ways. You should choose one display form as .IR "standout mode" , representing a good high-contrast, easy-on-the-eyes format for highlighting error messages and other attention getters. (If you have a choice, reverse video plus half-bright is good, or reverse video alone.) The sequences to enter and exit standout mode are given as .B so and .BR se , respectively. If the code to change into or out of standout mode leaves one or even two blank spaces or garbage characters on the screen, as the TVI 912 and Teleray 1061 do, then .B sg should be given to tell how many characters are left. .PP Codes to begin underlining and end underlining can be given as .B us and .BR ue , respectively. Underline mode change garbage is specified by .BR ug , similar to .BR sg . If the terminal has a code to underline the current character and move the cursor one position to the right, such as the Microterm Mime, this can be given as .BR uc . .PP Other capabilities to enter various highlighting modes include .B mb (blinking), .B md (bold or extra bright), .B mh (dim or half-bright), .B mk (blanking or invisible text), .B mp (protected), .B mr (reverse video), .B me (turn off .I all attribute modes), .B as (enter alternate character set mode), and .B ae (exit alternate character set mode). Turning on any of these modes singly may or may not turn off other modes. .PP If there is a sequence to set arbitrary combinations of mode, this should be given as .B sa (set attributes), taking 9 parameters. Each parameter is either 0 or 1, as the corresponding attributes is on or off. The 9 parameters are, in order: standout, underline, reverse, blink, dim, bold, blank, protect, and alternate character set. Not all modes need be supported by .BR sa , only those for which corresponding attribute commands exist. (It is unlikely that a .BR termcap\^ -using program will support this capability, which is defined for compatibility with .BR terminfo\^ .) .PP Terminals with the \*(lqmagic cookie\*(rq glitches .RB ( sg and .BR ug ), rather than maintaining extra attribute bits for each character cell, instead deposit special \*(lqcookies\*(rq, or \*(lqgarbage characters\*(rq, when they receive mode-setting sequences, which affect the display algorithm. .PP Some terminals, such as the Hewlett-Packard 2621, automatically leave standout mode when they move to a new line or when the cursor is addressed. Programs using standout mode should exit standout mode on such terminals before moving the cursor or sending a newline. On terminals where this is not a problem, the .B ms capability should be present to say that this overhead is unnecessary. .PP If the terminal has a way of flashing the screen to indicate an error quietly (a bell replacement), this can be given as .BR vb ; it must not move the cursor. .PP If the cursor needs to be made more visible than normal when it is not on the bottom line (to change, for example, a non-blinking underline into an easier-to-find block or blinking underline), give this sequence as .BR vs . If there is a way to make the cursor completely invisible, give that as .BR vi . The capability .BR ve , which undoes the effects of both of these modes, should also be given. .PP If your terminal correctly displays underlined characters (with no special codes needed) even though it does not overstrike, then you should give the capability .BR ul . If overstrikes are erasable with a blank, this should be indicated by giving .BR eo . .br .ne 5 .PP .B Keypad .PP If the terminal has a keypad that transmits codes when the keys are pressed, this information can be given. Note that it is not possible to handle terminals where the keypad only works in local mode (this applies, for example, to the unshifted Hewlett-Packard 2621 keys). If the keypad can be set to transmit or not transmit, give these codes as .B ks and .BR ke . Otherwise the keypad is assumed to always transmit. The codes sent by the left-arrow, right-arrow, up-arrow, down-arrow, and home keys can be given as .BR kl , .BR kr , .BR ku , .BR kd , and .BR kh , respectively. If there are function keys such as f0, f1, ..., f9, the codes they send can be given as .BR k0 , .BR k1 , "" ..., .BR k9 . If these keys have labels other than the default f0 through f9, the labels can be given as .BR l0 , .BR l1 , "" ..., .BR l9 . The codes transmitted by certain other special keys can be given: .B kH (home down), .B kb (backspace), .B ka (clear all tabs), .B kt (clear the tab stop in this column), .B kC (clear screen or erase), .B kD (delete character), .B kL (delete line), .B kM (exit insert mode), .B kE (clear to end of line), .B kS (clear to end of screen), .B kI (insert character or enter insert mode), .B kA (insert line), .B kN (next page), .B kP (previous page), .B kF (scroll forward/down), .B kR (scroll backward/up), and .B kT (set a tab stop in this column). In addition, if the keypad has a 3 by 3 array of keys including the four arrow keys, then the other five keys can be given as .BR K1 , .BR K2 , .BR K3 , .BR K4 , and .BR K5 . These keys are useful when the effects of a 3 by 3 directional pad are needed. The obsolete .B ko capability formerly used to describe \*(lqother\*(rq function keys has been completely supplanted by the above capabilities. .PP The .B ma entry is also used to indicate arrow keys on terminals that have single-character arrow keys. It is obsolete but still in use in version 2 of .B vi\^ which must be run on some minicomputers due to memory limitations. This field is redundant with .BR kl , .BR kr , .BR ku , .BR kd , and .BR kh . It consists of groups of two characters. In each group, the first character is what an arrow key sends, and the second character is the corresponding .B vi\^ command. These commands are .B h for .BR kl , .B j for .BR kd , .B k for .BR ku , .B l for .BR kr , and .B H for .BR kh . For example, the Mime would have \*(lqma=^Hh^Kj^Zk^Xl\*(rq indicating arrow keys left (^H), down (^K), up (^Z), and right (^X). (There is no home key on the Mime.) .br .ne 5 .PP .B Tabs and Initialization .PP If the terminal needs to be in a special mode when running a program that uses these capabilities, the codes to enter and exit this mode can be given as .B ti and .BR te . This arises, for example, from terminals like the Concept with more than one page of memory. If the terminal has only memory-relative cursor addressing and not screen-relative cursor addressing, a screen-sized window must be fixed into the display for cursor addressing to work properly. This is also used for the Tektronix 4025, where .B ti sets the command character to be the one used by .BR termcap\^ . .PP Other capabilities include .BR is , an initialization string for the terminal, and .BR if , the name of a file containing long initialization strings. These strings are expected to set the terminal into modes consistent with the rest of the .B termcap\^ description. They are normally sent to the terminal by the .B tset\^ program each time the user logs in. They will be printed in the following order: .BR is ; setting tabs using .B ct and .BR st ; and finally .BR if . .RI ( Terminfo\^ uses .B i1-i2 instead of .B is and runs the program .B iP and prints .B i3 after the other initializations.) A pair of sequences that does a harder reset from a totally unknown state can be analogously given as .B rs and .BR if . These strings are output by the .B reset\^ program, which is used when the terminal gets into a wedged state. .RI ( Terminfo\^ uses .B r1-r3 instead of .BR rs .) Commands are normally placed in .B rs and .B rf only if they produce annoying effects on the screen and are not necessary when logging in. For example, the command to set the VT100 into 80-column mode would normally be part of .BR is , but it causes an annoying glitch of the screen and is not normally needed since the terminal is usually already in 80-column mode. .PP If the terminal has hardware tabs, the command to advance to the next tab stop can be given as .B ta (usually .BR ^I ). A \*(lqbacktab\*(rq command which moves leftward to the previous tab stop can be given as .BR bt . By convention, if the terminal driver modes indicate that tab stops are being expanded by the computer rather than being sent to the terminal, programs should not use .B ta or .B bt even if they are present, since the user may not have the tab stops properly set. If the terminal has hardware tabs that are initially set every .I n\^ positions when the terminal is powered up, then the numeric parameter .B it is given, showing the number of positions between tab stops. This is normally used by the .B tset\^ command to determine whether to set the driver mode for hardware tab expansion, and whether to set the tab stops. If the terminal has tab stops that can be saved in nonvolatile memory, the .B termcap\^ description can assume that they are properly set. .PP If there are commands to set and clear tab stops, they can be given as .B ct (clear all tab stops) and .B st (set a tab stop in the current column of every row). If a more complex sequence is needed to set the tabs than can be described by this, the sequence can be placed in .B is or .BR if . .br .ne 5 .PP .B Delays .PP Certain capabilities control padding in the terminal driver. These are primarily needed by hardcopy terminals and are used by the .B tset\^ program to set terminal driver modes appropriately. Delays embedded in the capabilities .BR cr , .BR sf , .BR le , .BR ff , and .B ta will cause the appropriate delay bits to be set in the terminal driver. If .B pb (padding baud rate) is given, these values can be ignored at baud rates below the value of .BR pb . For 4.2BSD .BR tset\^ , the delays are given as numeric capabilities .BR dC , .BR dN , .BR dB , .BR dF , and .BR dT instead. .br .ne 5 .PP .B Miscellaneous .PP If the terminal requires other than a \s-2NUL\s0 (zero) character as a pad, this can be given as .BR pc . Only the first character of the .B pc string is used. .PP If the terminal has commands to save and restore the position of the cursor, give them as .B sc and .BR rc . .PP If the terminal has an extra \*(lqstatus line\*(rq that is not normally used by software, this fact can be indicated. If the status line is viewed as an extra line below the bottom line, then the capability .B hs should be given. Special strings to go to a position in the status line and to return from the status line can be given as .B ts and .BR fs . .RB ( fs must leave the cursor position in the same place that it was before .BR ts . If necessary, the .B sc and .B rc strings can be included in .B ts and .B fs to get this effect.) The capability .B ts takes one parameter, which is the column number of the status line to which the cursor is to be moved. If escape sequences and other special commands such as tab work while in the status line, the flag .B es can be given. A string that turns off the status line (or otherwise erases its contents) should be given as .BR ds . The status line is normally assumed to be the same width as the rest of the screen, .IR i.e. , .BR co . If the status line is a different width (possibly because the terminal does not allow an entire line to be loaded), then its width in columns can be indicated with the numeric parameter .BR ws . .PP If the terminal can move up or down half a line, this can be indicated with .B hu (half-line up) and .B hd (half-line down). This is primarily useful for superscripts and subscripts on hardcopy terminals. If a hardcopy terminal can eject to the next page (form feed), give this as .B ff (usually .BR ^L ). .PP If there is a command to repeat a given character a given number of times (to save time transmitting a large number of identical characters), this can be indicated with the parameterized string .BR rp . The first parameter is the character to be repeated and the second is the number of times to repeat it. (This is a .B terminfo\^ feature that is unlikely to be supported by a program that uses .BR termcap\^ .) .PP If the terminal has a settable command character, such as the Tektronix 4025, this can be indicated with .BR CC . A prototype command character is chosen which is used in all capabilities. This character is given in the .B CC capability to identify it. The following convention is supported on some UNIX systems: The environment is to be searched for a .B .SM CC variable, and if found, all occurrences of the prototype character are replaced by the character in the environment variable. This use of the .B .SM CC environment variable is a very bad idea, as it conflicts with .BR make\^ (1). .PP Terminal descriptions that do not represent a specific kind of known terminal, such as .BR switch\^ , .BR dialup\^ , .BR patch\^ , and .BR network\^ , should include the .B gn (generic) capability so that programs can complain that they do not know how to talk to the terminal. (This capability does not apply to .I virtual\^ terminal descriptions for which the escape sequences are known.) .PP If the terminal uses xoff/xon (\s-2DC3\s0/\s-2DC1\s0) handshaking for flow control, give .BR xo . Padding information should still be included so that routines can make better decisions about costs, but actual pad characters will not be transmitted. .PP If the terminal has a \*(lqmeta key\*(rq which acts as a shift key, setting the 8th bit of any character transmitted, then this fact can be indicated with .BR km . Otherwise, software will assume that the 8th bit is parity and it will usually be cleared. If strings exist to turn this \*(lqmeta mode\*(rq on and off, they can be given as .B mm and .BR mo . .PP If the terminal has more lines of memory than will fit on the screen at once, the number of lines of memory can be indicated with .BR lm . An explicit value of 0 indicates that the number of lines is not fixed, but that there is still more memory than fits on the screen. .PP If the terminal is one of those supported by the UNIX system virtual terminal protocol, the terminal number can be given as .BR vt . .PP Media copy strings which control an auxiliary printer connected to the terminal can be given as .BR ps : print the contents of the screen; .BR pf : turn off the printer; and .BR po : turn on the printer. When the printer is on, all text sent to the terminal will be sent to the printer. It is undefined whether the text is also displayed on the terminal screen when the printer is on. A variation .B pO takes one parameter and leaves the printer on for as many characters as the value of the parameter, then turns the printer off. The parameter should not exceed 255. All text, including .BR pf , is transparently passed to the printer while .B pO is in effect. .PP Strings to program function keys can be given as .BR pk , .BR pl , and .BR px . Each of these strings takes two parameters: the function key number to program (from 0 to 9) and the string to program it with. Function key numbers out of this range may program undefined keys in a terminal-dependent manner. The differences among the capabilities are that .B pk causes pressing the given key to be the same as the user typing the given string; .B pl causes the string to be executed by the terminal in local mode; and .B px causes the string to be transmitted to the computer. Unfortunately, due to lack of a definition for string parameters in .BR termcap\^ , only .B terminfo\^ supports these capabilities. .br .ne 5 .PP .B Glitches and Braindamage .PP Hazeltine terminals, which do not allow `~' characters to be displayed, should indicate .BR hz . .PP The .B nc capability, now obsolete, formerly indicated Datamedia terminals, which echo .B \er \en for carriage return then ignore a following linefeed. .PP Terminals that ignore a linefeed immediately after an .B am wrap, such as the Concept, should indicate .BR xn . .PP If .B ce is required to get rid of standout (instead of merely writing normal text on top of it), .B xs should be given. .PP Teleray terminals, where tabs turn all characters moved over to blanks, should indicate .B xt (destructive tabs). This glitch is also taken to mean that it is not possible to position the cursor on top of a \*(lqmagic cookie\*(rq, and that to erase standout mode it is necessary to use delete and insert line. .PP The Beehive Superbee, which is unable to correctly transmit the \s-2ESC\s0 or ^C characters, has .BR xb , indicating that the \*(lqf1\*(rq key is used for \s-2ESC\s0 and \*(lqf2\*(rq for ^C. (Only certain Superbees have this problem, depending on the ROM.) .PP Other specific terminal problems may be corrected by adding more capabilities of the form \fBx\fIx\^\fP. .br .ne 5 .PP .B Similar Terminals .PP If there are two very similar terminals, one can be defined as being just like the other with certain exceptions. The string capability .B tc can be given with the name of the similar terminal. This capability must be .IR last\^ , and the combined length of the entries must not exceed 1024. The capabilities given before .B tc override those in the terminal type invoked by .BR tc . A capability can be canceled by placing .B xx@ to the left of the .B tc invocation, where .I xx\^ is the capability. For example, the entry .PP hn\||\|2621\-nl:ks@:ke@:tc=2621: .PP defines a \*(lq2621\-nl\*(rq that does not have the .B ks or .B ke capabilities, hence does not turn on the function key labels when in visual mode. This is useful for different modes for a terminal, or for different user preferences. .SH AUTHOR William Joy .br Mark Horton added underlining and keypad support .SH FILES .TP 15 .B /etc/termcap file containing terminal descriptions .B /usr/etc/termcap file containing more terminal descriptions (Minix-vmd) .SH SEE ALSO .BR elvis (1), .BR more (1), .BR termcap (3), .BR printf (3). .SH "CAVEATS AND BUGS" Lines and columns are now stored by the kernel as well as in the termcap entry. Most programs now use the kernel information primarily; the information in this file is used only if the kernel does not have any information. .PP Not all programs support all entries. .PP The Minix .BR termcap (3) does not understand everything described here, unlike the one Minix-vmd uses. .TH TTYTAB .SH NAME ttytab \- table of login terminals .SH SYNOPSIS .B /etc/ttytab .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B ttytab file lists all the terminal devices that one can login on. It is a simple text file that contains lines of the form: .PP .RS .ft I .ta +\w'namennn'u +\w'typennn'u +\w'"getty"nnn'u name type "getty" "init" .DT .ft R .RE .PP The .I name and .I type fields are simple words, .I name is the name of the terminal device with .B /dev stripped off, and .I type tells the type of terminal to initialize the .B TERM environment variable. .PP The .I getty and .I init fields may name commands that are run to allow one to login on the line, or to initialize the line. Both these fields may be more than one word if the whole field is enclosed in double quotes. .I Getty is usually simply the word .BR getty , the command that prints a system identification banner and allows on to type a name to log in. .I Init is usually an .B stty command to set the baud rate and parity of a serial line. .PP The .I init field may be omitted to indicate that no initialization is necessary, and the .I getty field may be left out to not start a login process. Terminals should not be left out, because their place in the .B ttytab file determines their slot number as returned by .BR ttyslot (3). .PP Comments (introduced by #) and empty lines are ignored. .SH EXAMPLE A .B ttytab for the console, two serial lines, and a pseudo tty entry: .PP .RS .nf .ta +\w'consolennn'u +\w'networknnn'u +\w'gettynnnn'u console minix getty tty00 vt100 getty "stty 9600" tty01 dialup getty "stty 38400" ttyp0 network .DT .fi .RE .SH ENVIRONMENT .TP 15n .B TERM Terminal type .SH NOTES It is customary to set the type to .B dialup for a dialin line. One can check for that name in one's .BR .profile . .SH "SEE ALSO" .BR getttyent (3), .BR ttyslot (3), .BR init (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH UTMP 5 .SH NAME utmp, wtmp \- logged in users, login and logout history .SH SYNOPSIS .nf .ft B #include #include .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The files .B /etc/utmp and .B /usr/adm/wtmp respectively contain the currently logged in users, and the history of logins and logouts. .PP Each file is an array of the following structure defined in : .PP .nf .ta +5n +15n +15n struct utmp { char ut_user[8]; /* user name */ char ut_line[12]; /* terminal name */ char ut_host[16]; /* host name, when remote */ time_t ut_time; /* login/logout time */ }; .SP .ta +15n #define ut_name ut_user /* for compatibility with other systems */ .fi .DT .PP The structure contains more fields than those listed, but they are only of interest to .B init and .BR login . Note that the .B ut_name field is a compatibility alias for .BR ut_user , it is actually better to use it. .PP A login entry is completely specified. A logout entry has a null string for .BR ut_name . A shutdown or reboot entry has an .B ut_line field containing a "~" (tilde). The .B ut_name field is usually the name of the program that did the shutdown, or "reboot" at reboot. This is a bit confusing, but note that there should always be two such entries. If you see just one entry then the system has crashed, if you see two entries then the system was properly shut down and later rebooted. .SH FILES .TP 25n .B /etc/utmp Currently logged in users. .TP .B /usr/adm/wtmp History of logins and logouts. .SH "SEE ALSO" .BR who (1), .BR ttyslot (3). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH WHATIS 5 .SH NAME whatis \- database of online manual pages .SH SYNOPSIS .B /usr/man/*/whatis .br .B /usr/man/whatis .SH DESCRIPTION The .B whatis file in each manual page directory is a database of titles for manual pages. This database is used by .BR man (1) to map titles to manual pages names. The database is created by .BR makewhatis (1) from the NAME sections of the manual pages. .PP The NAME secions must be simple lines with no troff fluff but one backslash like these two: .PP .RS whatis \e\- database of online manual pages .br cawf, nroff \e\- C version of the nroff-like, Amazingly Workable (text) Formatter .RE .PP These lines are transformed by .B makewhatis to these two lines for the database: .PP .RS cawf, nroff (1) \- C version of the nroff-like, Amazingly Workable (text) Formatter .br whatis (5) \- database of online manual pages .RE .PP As you can see they are in section number order, so that .B man searches them in section order. .PP Each entry is just a single line, restricting the NAME section to a single line too with just one dash, and commas and spaces before the dash as you see above. .SH "SEE ALSO" .BR man (1), .BR whatis (1), .BR makewhatis (1), .BR man (7). .SH BUGS It seems to be impossible for many manual page writers to keep the NAME section simple. They also like to use every font available in their documents. My simple scripts can't read their NAME sections, my simple me can't read their texts. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH SERV.ACCESS 5 .SH NAME serv.access \- Internet service access list .SH SYNOPSIS .B /etc/serv.access .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B serv.access file contains a list of rules that guide the access checks made by the .BR servxcheck (3) function. The file is a text file containing entries that look as follows: .PP .RS .I service1 service2 .RB ... : .I check1 check2 .RB ... ; .RE .PP Each of the service names is a service name from the .B /etc/services file. The same names are used in the .B /etc/inetd.conf configuration file that guides .BR inetd (8). .PP The checks may look as follows: .PP .BI + .br .BI - .RS Allow all, or allow none. Used to explicitly set the initial state. .RE .PP .BI + name .RS Grant access to one of the services if the host name of the remote system matches .BR name . .RE .SP .BI \- name .RS Deny access to one of the services if the host name of the remote system matches .BR name . .RE .PP .BI + ipaddr .br .BI \- ipaddr .br .BI + netaddr / len .br .BI \- netaddr / len .RS Grants or denies access to a remote host with IP address .IR ipaddr , or the remote host whose IP address is within the network .IR netaddr . .I Len tells the number of bits used for the network address, i.e. the top .I len bits of the network address must equal the host address. .RE .PP .BR log .RS This is not a check, but a flag that instruct .B servxcheck() to log the result of the access check whether it succeeds or not to .BR /usr/adm/log . By default only failure is logged. .RE .PP The first "+" or "\-" access check sets the tone. Read it as "access denied unless +...", or "access granted unless \-...". An access check will therefore almost always start with a "+" check. To make the initial state clear you can start with a lone "+" or "\-". Checks are done from left to right. A check that doesn't match does not change the outcome. A check that can't change the outcome is skipped. .PP Both the service and the host names may contain the .B "\(**" wildcard that matches any number of characters including none. Letters are compared ignoring case. A service name may appear in more than one rule, but a service mentioned explicitly is not matched by wildcard patterns in later rules. .PP A check for a hostname causes .B servxcheck() to do a reverse lookup on the IP address of the remote host to find its name. This name is then looked up to find the host's IP address(es). If those lookups fail then all .BI \- name checks cause access to be denied, and no .BI + name check grants access. The DNS lookup failures may be a misconfiguration, but could indicate a break-in attempt from a badly maintained host. You can use a simple "+*" in an otherwise empty list to just deny misconfigured hosts. .PP An IP or network address check is simply done on the remote hosts IP address. Such a check has no overhead, but a .B log flag will cause a reverse lookup anyway. .PP Comments start with "#" and continue until end of line. The "\e" is a line continuation character. It, any whitespace or a comment following it and a newline are treated as a single space. .SH EXAMPLES Example access file on a machine that offers most services only to hosts within the cs.vu.nl domain, and news (nntp) only to two machines and a specific network. .PP .RS .nf .ta +2.2i +.4i # Service # Access list login shell: +*.cs.vu.nl log; telnet pop smtp finger: + log; nntp: +flotsam.cs.vu.nl +jetsam.cs.vu.nl +172.16.102.0/24 log; *: +*.cs.vu.nl; .fi .RE .PP More paranoid example that limits all services by default, but allows ftp and http to the world: .PP .RS .nf .ta +2.2i +.4i # Service # Access list ftp http: +; smtp finger: + log; nntp: +flotsam.cs.vu.nl +jetsam.cs.vu.nl +172.16.102.0/24 log; *: +*.cs.vu.nl log; .fi .RE .PP (Note that the last rule doesn't match any of the services mentioned explicitly earlier.) .SH FILES .TP 25n .B /etc/serv.access The service access check file. .SH "SEE ALSO" .BR servxcheck (3), .BR services (5), .BR inetd.conf (5). .SH NOTES It may be wise not to put checks on telnet. It is reasonably secure, since it always requires a password, and your only way in if things are seriously hosed. .SH BUGS IP and DNS based access checks will stop most crackers, but not the really determined ones. Luckily Minix is sufficiently strange to thwart the well known cracking schemes. But don't ever allow yourself to feel secure. .SH AUTHOR Kees J. Bot .TH CRONTAB 5 .SH NAME crontab \- table of jobs to be performed by cron .SH SYNOPSIS .nf .ft B /usr/lib/crontab /usr/local/lib/crontab /var/lib/crontab /var/opt/\fIname\fP/lib/crontab\ \ \fR(Minix-vmd only)\fB /usr/spool/crontabs/\fIuser\fP .ft R .fi .SH DESCRIPTION The .BR cron (8) daemon runs jobs at regular intervals. These jobs are listed in .B crontab files. The format of entries in a crontab file are five fields of numbers specifying the minute (0\-59), hour (0\-23), day of the month (1\-31), month (1\-12), and day of the week (0\-6 with 0 = Sunday) that a task must be executed. The task to be executed follows as a shell command. .PP The time numbers can be given as a comma separated list of simple numbers, ranges ("2\-5" is the same as "2,3,4,5"), and repeats ("2:5" means "2,7,12,17,22" in the hour field). A repeat is cyclic affair, i.e. 2:5 and 12:5 are the same thing. A single "*" can be used in a field to indicate all valid numbers in that field, so it translates to "always". In the minute field you can use "?" for the current minute that the crontab file is loaded. It can be used in a repeat, i.e. "?:10" for every 10 minutes. This keeps machines with identical crontabs from executing tasks at exactly the same time, causing a burst of traffic if anything is done over a network. .PP If a given time is valid in all five fields then a command is executed. Here are a few examples that illustrate the possibilities: .PP .if t .RS .if t .ft C .nf # min hour mday mon wday command ? 3 * * * /usr/etc/daily # Daily system cleanup 0 * * * * date # Print date on the hour 30 4 * * 2\-6 /var/etc/backup # After workdays on 4:30 0 9 25 12 * \-u ast sing # Andy sings on Xmas morning 0 0 13 * 5 echo Beware! # For the superstitious .fi .if t .ft P .if t .RE .PP The command may optionally be prefixed by .BI \-u " user" to specify under which user the command should be run. Commands from crontabs in the spool directory are always run under the id of the crontab's owner, the .B \-u flag is ignored. .PP A command can be placed on the same line as the time fields, or on the next line indented by one TAB character. (A TAB, not eight spaces.) More TAB indented lines can be added for a multiline command. The tabs are removed from the command when passed to the shell. If a command is put on the same line as the time fields then percent characters are changed into newlines, this is not done for a TAB indented command. The following three entries give the same output: .PP .RS .if t .ft C .nf .ta +8n 0 12 * * * echo 'Hello'; echo ' World!' #1 0 12 * * * echo 'Hello% World!' #2 0 12 * * * #3 cat <?[\e]^_|~" . A backslash .RB ( \e ) may be followed by a character in the set .B abefnrstv to form a BEL, BS, ESC, FF, NL, CR, SP, TAB, or VT character. Followed by up to three octal digits a character of that value is formed, and likewise for an .B x followed by up to two hexadecimal digits. Any other character is left as-is. A backslash followed by whitespace is completely removed from the input. (This includes comments.) .PP A string is started by a single or double quote, a series of characters, and ended by the same type of quote it started with. Any character or escape with .B \e may be found in a string. Strings may not span lines. .PP Tokens are separated by whitespace, being the usual whitespace characters and comments. A comment starts with the .B # character, and ends at a newline. .PP The special word .B include tells that the file mentioned in the following string must be read and included at that point. The file is found relative to the directory the current configuration file is found in, unless its name starts with a .BR / . A file that doesn't exist is seen as empty. .PP A generic configuration file can be read with the functions described in .BR configfile (3). .SH EXAMPLES Have a look at .BR /etc/dhcp.conf . .SH "SEE ALSO" .BR configfile (3). .SH NOTES Inspired by the configuration file of Paul Vixie's .BR bind . .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH DHCP.CONF 5 .SH NAME dhcp.conf \- dynamic host configuration protocol configuration .SH SYNOPSIS .B /etc/dhcp.conf .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The file .B /etc/dhcp.conf contains the configuration for the DHCP client/server program .BR dhcpd . This text is a long summation of all the elements that can be found in this configuration file. For a more "just tell me what to do" approach see .BR boot (8). .PP The syntax used is that of the common configuration file described in .BR configfile (5). .PP To find information for a client we first need its IP address. Occasionally this IP address is already known (the special "INFORM" query), but normally we have to make a first pass through the configuration file for a .B client entry. If that fails then we use an IP address from the pool file. If we now have an IP address then the real information gathering can begin. .PP The DHCP daemon reads the configuration file from beginning to end and gathers all information that matches, and information from all macros that are mentioned within the elements that match. If we end up with DHCP information that includes at least a netmask definition, and is good for the network the request came in from, then it is returned to the client. If a DHCP tag is specified twice then the last one wins. .PP In the description below we use [ and ] to denote optional things, and | to show a choice between two things. .PP Client IDs can be either ordinary Ethernet addresses, that are treated as a seven octet string (01 followed by the Ethernet address), or any random octet string in hexadecimal. .PP IP addresses can be simply that, or host names. These host names are searched in .B /etc/hosts by .B dhcpd itself using a domain based prefix match, i.e. you can use "flotsam" for "flotsam.example.com", but not "alpha" for "alphabeta". Once the program decides to be a server it will also look up names normally in the DNS. If a host has more than one IP address then the address on the network the query was seen on is used. .PP Case isn't important in the configuration file, "client", "CLIENT" and "ClIeNt" are all treated the same. .PP Some elements may optionally name a macro or a curly braces enclosed parameter list of more elements. If the element matches then the data in the macro body or parameter list is gathered. .PP The following elements can be used: .PP .B client .I client-ID .RB [ ip #] .I host .RI [ macro |{ params }]; .PP .RS Defines a client with a given client ID that is to have the IP address denoted by .I host . On the first pass only the client ID is matched looking for an IP address that lies on the network the request came in on. On the information gathering pass both client ID and IP address must match. If a machine has the same Ethernet address on two or more interfaces then the IP address given out is the one on the same network as the request came in on. The optional interface name .RB ( ip #) must be used if the DHCP daemon is gathering data for itself at boot time to differentiate interfaces with the same ethernet addresses. This is only necessary under Minix-vmd when ethernets on different VLANs share the same physical ethernet. The interface name is only used for a machine's own networks, it ignored on entries for other hosts. .RE .PP .B class .IR class-name " ..." .IR macro |{ params }; .PP .RS Includes the macro or parameters if one of the class names is matched. A host normally includes a class ID in its request. Minix and Minix-vmd use "Minix" as the class name. For Windows the class ID starts with "MSFT", and Solaris' starts with "SUNW". (Use .B dhcpd \-d3 to find out what the full IDs are exactly.) The class names are matched if a .I class-name is a prefix of the class ID sent by the client. .RE .PP .B host .I host-spec .IR macro |{ params }; .PP .RS Includes the macro or parameters if the IP address of the client matches the host specification. This can either be an ordinary hostname, or a netblock in CIDR notation, e.g. 172.35.0.0/16. The example includes all IP addresses whose top 16 bits are the same as the top 16 bits of 172.35.0.0. Such a netblock automatically defines a netmask (255.255.0.0 in the example) if no netmask has been specified yet. .RE .PP .B interface .BR ip # .I host .RI [ macro |{ params }]; .PP .RS Makes .B dhcpd set the IP address of interface .BR ip # (where # is a number) to the IP address denoted by .IR host . This element should only be used for interfaces that are not true Ethernets, and so do not have a unique Ethernet address that can be used for a client element. If the machine has at least one true Ethernet then all interface elements should be added to the parameter list of a host or client element for that Ethernet interface. This binds them to that machine and allows a single configuration file to be shared among machines. Especially a server should never have "free" interface elements. The macro or parameters are only evaluated if data is gathered for the given interface. (Note that they will be hidden by a client element for another interface.) .RE .PP .B macro .IR macro-name ; .PP .RS Include the parameter list of the macro named .I macro-name defined elsewhere. (This means that "host flotsam stuff" is just short for "host flotsam { macro stuff; }".) .RE .PP .B macro .I macro-name .RI { params }; .PP .RS Defines a macro with the given parameter list. Whenever the macro is used the parameter list is substituted instead. A macro can not be defined within another parameter list. .RE .PP .B option .RB [ ip #] .BR server ; .br .B option .RB [ ip #] .B relay .IR host ; .br .B option .RB [ ip #] .BR possessive ; .br .B option .RB [ ip #] .B hostname .IR name ; .PP .RS Makes .B dhcpd set special options for the interface that it is gathering data for, or the interface denoted by the optional .BR ip # argument. The options are: .SP .B server .RS Be a DHCP server on the network connected to the interface. .RE .SP .B relay .I host .RS Be a DHCP relay to the indicated host. .RE .SP .B possessive .RS Do not disable the interface if the DHCP lease expires. Useful when the IP address given is almost always the same, but the DHCP server of the ISP is unreliable. (Think twice before turning this option on.) .RE .SP .B hostname .I name .RS Use the given name as our hostname in the DHCP queries. Some sites key on that bit of information instead of a client ID. .RE .RE .PP .B tag .I number name type granularity .IR max ; .PP .RS Defines a DHCP tag for the given tag number and gives it a name. The name can be used in the configuration file to set tag values when gathering data. The .I type field can be one of .BR ascii , .BR boolean , .BR ip , .BR number or .BR octet to specify the type of the tag as a simple string, a boolean, an IP address, a number, or a string of octet values. The .I granularity field specifies that that number of items must be given or a multiple thereof, unless the type is a number, then it is the size of the number (1, 2 or 4). The .I max field tells the maximum number of items that may be used with the tag, with 0 meaning "unlimited". .SP Three tags, the ones that Minix really cares about, have been predefined, and there are also a few pseudotags predefined for the static fields in a DHCP packet that one may want to set: .SP .RS .nf tag ? siaddr ip 1 1; tag ? sname ascii 1 64; tag ? file ascii 1 128; tag 1 netmask ip 1 1; tag 3 gateway ip 1 0; tag 6 DNSserver ip 1 0; .fi .RE .SP The file .B /usr/etc/dhcptags.conf contains tag definitions for all standard DHCP tags. It is wise to include this file at the top of any DHCP configuration file. .RE .PP .B no .IR tag-name ; .PP .RS Removes a tag with the given name from the data gathered at this point. Useful if one host is different from all others, for instance if it doesn't need a gateway definition, because it happens to be the gateway. .RE .PP .IR "ascii-tag string" ; .PP .RS Adds an ASCII tag to the gathered data. The string can be a simple word, or a quoted string. .RE .PP .I boolean-tag .BR false | true ; .PP .RS Set a boolean tag to be false or true. (Encoded as a octet of value 0 or 1.$$$$$$$ Note that if you prefer to use 0 or 1 instead of false or true then you can define a boolean tag as a size 1 number instead.) .RE .PP .IR "ip-tag host" " ...;" .PP .RS Sets a tag that needs one or more IP addresses. The host names are translated as usual. To make it easier to specify netmasks one can use a slash followed by a number, e.g. .BR "netmask /27" , which is a handy alternative for .BR "netmask 255.255.255.224" . .RE .PP .IR "number-tag number" " ...;" .PP .RS Set a number tag. .RE .PP .IR "octet-tag hexdigits" ; .PP .RS Set an octet string tag. .I Hexdigits is a series of hexadecimal digits that are two by two used to set the octets. .RE .PP .SH EXAMPLE As an example the DHCP configuration used by the author of this document is included. His network at home consists of a number of PCs, an ISDN router named rhone and a PC named saone serving as router/tunnel to/via a cable ISP. Both the rhone and the saone connect the home net to the network of the Vrije Universiteit, but the rhone is only active if the cable doesn't work. .PP The saone is a DHCP server, and one of the ordinary PCs is a backup DHCP server. Both use the same configuration file, which is added below, with extra commentary introduced by .B ## at a deeper indent level: .RS .de xS \" Example start .sp .nf .ft C .. .de xE \" Example end .fi .ft R .. .de cS \" Commentary start .sp .in +12m .ti -\w'## 'u ##\ \c .. .de cE \" Commentary end .in -12m .. .xS .ta +8m +16m include /usr/etc/dhcptags.conf; .xE .cS With the help of the tag definitions we can use tags like "DHCPlease". .cE .xS host 130.37.102.64/27 { DNSserver saone darask; host 130.37.102.88/29 { DHCPlease 259200; } }; .xE .cS This defines the network 130.37.102.64/27, with netmask 255.255.255.224 (implicit from the network definition). The DNS servers for this net are saone and darask. A smaller subrange of addresses is used as an address pool on the saone, so a lease of 259200 seconds (3 days) is defined. The netmask is still /27, as set by the outer network definition. .cE .xS host 130.37.102.248/30 {}; .xE .cS A network of two addresses for routing tests. .cE .xS host saone { option server; option ip1 possessive; interface ip2 saone-net2; DNSserver 130.37.24.3 130.37.24.6; }; .xE .cS With the network definitions done we turn our attention to the hosts. Saone is a DHCP server on its main interface. The second interface .RB ( ip1 ) is connected to the cable modem. It gets its address from the cableco's DHCP server, and if that server decides to go deaf then the saone keeps the interface up ("possessive") even if the lease expires. The pseudo IP interface .B ip2 is set to the IP address of .BR saone-net2 , one side of the encrypted tunnel over the cable to a Minix-vmd box at the VU. The DNS servers specified override the default setting for the network, naming two external servers at the VU that know the world. .cE .xS host darask { option server; DNSserver saone; class Minix { DNSserver saone 130.37.24.3 130.37.24.6; }; }; .xE .cS The darask is also a server, the backup for saone on the odd chance that it is unavailable. It uses saone and the external name servers, but only when it is running Minix. When running Windows it only uses saone. .cE .xS .ta +32m +16m client 0:1:1b:a:68:ce darask; # NE2000 client 0:1:1b:a:77:23 burask; # NE2000 #lient 0:0:c0:b0:da:64 burask; # WD8013EWC client 8:0:5a:38:b2:f finiah; # PCMCIA NE2000 client 0:0:c0:3a:12:10 bardelask; # WD8003 #lient 2:60:8c:ab:8a:6d bardelask; # 3C503 client 0:a0:c5:20:9:6d rhone; client 0:1:1b:a:4c:3b saone; # NE2000 #lient 0:0:c0:fb:2:6a saone-net1; # WD8013EWC .xE .cS Lastly the ethernet addresses of all the hosts are listed, so that they can be translated to IP addresses. The lines that are commented out are for extra network cards that are currently unused. The last is used to connect to the cable modem, so it's only here because it's nice to have the ethernet address written down somewhere. .cE .RE .PP The host names shown above are translated by DHCP using this .BR /etc/hosts : .RS .xS .ta +\w'130.37.102.249mm'u 604800 %ttl 2419200 %stale 130.37.102.65 darask.kjb.upwind.org 130.37.102.66 burask.kjb.upwind.org 130.37.102.67 finiah.kjb.upwind.org 130.37.102.68 bardelask.kjb.upwind.org 130.37.102.69 roniah.kjb.upwind.org 130.37.102.70 saone.kjb.upwind.org 130.37.102.2 saone-net2.kjb.upwind.org 130.37.102.88 rhone.kjb.upwind.org 130.37.102.89 dyn89.kjb.upwind.org 130.37.102.90 dyn90.kjb.upwind.org 130.37.102.91 dyn91.kjb.upwind.org 130.37.102.92 dyn92.kjb.upwind.org 130.37.102.93 dyn93.kjb.upwind.org 130.37.102.94 dyn94.kjb.upwind.org 130.37.102.249 tst1.kjb.upwind.org 130.37.102.250 tst2.kjb.upwind.org .xE .RE .SH FILES .TP .B /usr/etc/dhcptags.conf A supplied list of standard tag definitions as per RFC-1533. (Well, the tag numbers and their meaning are standard, the names are made up.) .SH "SEE ALSO" .BR RFC-2131 , .BR RFC-1533 , .BR configfile (5), .BR hosts (5), .BR boot (8), .BR dhcpd (8). .SH NOTES The amount of memory .B dhcpd needs increases with the size of configuration file. Minix can handle .B dhcptags.conf and a modest sized .BR dhcp.conf . You have to increase the stack size to accommodate more. (No problem under Minix-vmd, of course.) .SH NOTES Items that are only necessary for a certain host should only be specified for that host. Items for a whole network are best added to a netblock specification. Use class elements for a certain type of host, and macros for exceptions. Try to limit information as much as possibly to those hosts that need it. (Don't go overboard. A Minix machine won't be bothered by a few NetBIOS tags.) .SH BUGS There are a few too many subtle mistakes one can make. .SH AUTHOR Kees J. Bot )...*advent.6+ttt.6.\" @(#)adventure.6 6.2 (Berkeley) 5/6/86 .\" .TH ADVENT 6 "May 6, 1986" .AT 3 .SH NAME advent, adventure \- an exploration game .SH SYNOPSIS .B advent .SH DESCRIPTION The object of the game is to locate and explore Colossal Cave, find the treasures hidden there, and bring them back to the building with you. The program is self-descriptive to a point, but part of the game is to discover its rules. .PP To terminate a game, type `quit'; to save a game for later resumption, type `save' now, and `restore' when you resume. .SH FILES .TP 15 .B advent.sav A saved adventure game. .TH TTT 6 .SH NAME ttt \- tic tac toe .SH SYNOPSIS \fBttt\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "ttt " "Start the game" .SH DESCRIPTION .PP This program allows the user to engage in a game of tic tac toe (noughts and crosses) with the computer. The program uses the alpha-beta algorithm, so the user had better be sharp. ,...-ACK.7.ascii.7/environ.70hier.71man.7.TH ACK 7 .SH NAME ACK \- Additional information on the Amsterdam Compiler Kit compilers .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .de XS .SP .in +.5i .nf .. .de XE .fi .in -.5i .SP .. .de NS .PP .B ANS\ \\$1 .. .de UX \s-2UNIX\s+2 .. .de MX .if n Minix .if t \s-2MINIX\s+2 .. .if n .ds Mx Minix .if t .ds Mx \s-2MINIX\s+2 .if n .ds Mp Minix-PC .if t .ds Mx \s-2MINIX-PC\s+2 .if n .ds Mv Minix-vmd .if t .ds Mv \s-2MINIX\s+2-vmd .if n .ds Cw \fR .if t .ds Cw \fC .de CW .if n .ft R .if t .ft C .. .\" These are the details on the Amsterdam Compiler Kit compilers for the languages C, Modula-2, and Pascal. The design decisions that were made where the respective standards allowed or mandated this, and the extensions that were implemented. .SH "ANSI C REPORT" This section specifies the implementation-defined behavior of the ANSI-C compiler as required by ANS X3.159-1989. .NS A.6.3.1 .IP \(bu Diagnostics are placed on the standard error output. They have the following specification: .XS "", line : [()] .XE There are three classes of diagnostics: 'error', 'strict' and 'warning'. When the class is 'error', the class specification is absent. The class 'strict' is used for violations of the standard which are not severe enough to stop compilation, for example the occurrence of non white-space after an '#endif' preprocessing directive. The class 'warning' is used for legal but dubious constructions, for example the declaration of a structure-tag in a parameter type list. .NS A.6.3.2 .IP \(bu The function 'main' can have zero or two parameters. When it has two parameters, the first parameter is an integer specifying the number of arguments on the command line (including the command). The second parameter is a pointer to an array of pointers to the arguments (as strings). .IP \(bu Interactive devices are terminals. .NS A.6.3.3 .IP \(bu The number of significant characters is 64. Corresponding upper-case and lower-case letters are different. .NS A.6.3.4 .IP \(bu The compiler assumes ASCII-characters in both the source and execution character set. .IP \(bu There are no multibyte characters. .IP \(bu There are 8 bits in a character. .IP \(bu Character constants that cannot be represented in 8 bits are truncated. .IP \(bu Character constants that are more than 1 character wide will have the first character specified in the least significant byte. .IP \(bu The only supported locale is 'C'. .IP \(bu A plain 'char' has the same range of values as 'signed char'. .NS A.6.3.5 .IP \(bu The i80x86 and 68000 both have a two's complement binary-number system. Shorts are 2 bytes; ints are 2 bytes under 16-bits \*(Mp and 68000 \*(Mx, 4 bytes under 32-bits \*(Mp; longs occupy 4 bytes. .IP \(bu Converting an integer to a shorter signed integer is implemented by ignoring the high-order byte(s) of the former. Converting a unsigned integer to a signed integer of the same type is only done in administration. This means that the bit-pattern remains unchanged. .IP \(bu The result of bitwise operations on signed integers are what can be expected on a two's complement machine. .IP \(bu When either operand is negative, the result of the / operator is the largest integer less than or equal to the algebraic quotient. The sign of the remainder on integer division is the sign of the enumerator. .IP \(bu The right-shift of a negative value is negative. .NS A.6.3.6 .IP \(bu The compiler uses IEEE format for floating-point numbers. High-precision floating-point is used for constant folding. .IP \(bu Truncation is done to the nearest floating-point number that can be represented. .NS A.6.3.7 .IP \(bu The type of the sizeof-operator (also known as size_t) is 'unsigned int'. .IP \(bu Casting an integer to a pointer or vice versa has no effect in bit-pattern when the sizes are equal. Otherwise the value will be truncated or zero-extended (depending on the direction of the conversion and the relative sizes). .IP \(bu The type of a 'ptrdiff_t' is 'int' on \*(Mp, and 'long' on the 68000 \*(Mx versions. .NS A.6.3.8 .IP \(bu Since the front end has only limited control over the registers, it can only make it more likely that variables that are declared as registers also end up in registers. The only things that can possibly be put into registers are plain ints and pointers. .NS A.6.3.9 .IP \(bu When a member of a union object is accessed using a member of a different type, the resulting value will usually be garbage. The compiler makes no effort to catch these errors. .IP \(bu The alignment of types under 16-bit \*(Mp is 1 byte for characters and 2 bytes for all other types. Under other Minix versions 'int' and smaller types are aligned to a multiple of their size, bigger scalar types are aligned like 'int'. Arrays have the same alignment as their elements; structs and unions are aligned like their field with the worst alignment. .IP \(bu A plain 'int' bit-field is taken as a 'signed int'. This means that a field with a size 1 bit-field can only store the values 0 and \(mi1. .IP \(bu In bit-fields, high-order bits are allocated first. .IP \(bu An enum has the same size as a plain 'int'. .NS A.6.3.10 .IP \(bu An access to a volatile object is either a load or a store. Just mentioning a volatile variable is not enough. E.g. the statement 'x;' where x is declared volatile, does not constitute an access. When a volatile object should be read, but its value ignored, 'if (x);' should do the trick. .NS A.6.3.11 .IP \(bu There is no fixed limit on the number of declarators that may modify an arithmetic, structure or union type, although specifying too many may cause the compiler to run out of memory. .NS A.6.3.12 .IP \(bu The maximum number of cases in a switch-statement is in the order of 1e9, although the compiler may run out of memory somewhat earlier. .NS A.6.3.13 .IP \(bu Since both the preprocessor and the compiler assume ASCII-characters, a single character constant in a conditional-inclusion directive matches the same value in the execution character set. .IP \(bu The preprocessor recognizes \fI\(enI...\fR command-line options. The directories thus specified are searched first. After that, /usr/include is visited. .IP \(bu Quoted names are first looked for in the directory in which the file which does the include resides. .IP \(bu The characters in a h- or q- char-sequence are taken to be .UX paths. .IP \(bu Neither the front-end nor the preprocessor know any pragmas. .IP \(bu Since the compiler runs on .MX , _\^_DATE_\^_ and _\^_TIME_\^_ will always be defined. .NS A.6.3.14 .IP \(bu NULL is defined as ((void *)0). This in order to detect dubious constructions like 'int x = NULL;'. .IP \(bu The diagnostic printed by 'assert' is as follows: .XS Assertion "" failed, file "", line .XE where is the argument to the assert macro, printed as string. (the and should be clear) .IP \(bu The sets for character test macros for the C locale are as follows: .XS .ta +\w'isalnum 'u \fBName Set\fR \fIisalnum\fR 0-9A-Za-z \fIisalpha\fR A-Za-z \fIiscntrl\fR \e000-\e037\e177 \fIislower\fR a-z \fIisupper\fR A-Z \fIisprint\fR \e040-\e176 .DT .XE As an addition, there is an \fIisascii\fR macro, which tests whether a character is an ASCII character. Characters in the range from \e000 to \e177 are ASCII characters. .IP \(bu The behavior of ACK mathematical functions on domain error is as follows: .XS .ta +\w'log10 'u \fBName Returns\fR \fIasin\fR 0.0 \fIacos\fR 0.0 \fIatan2\fR 0.0 \fIfmod\fR 0.0 \fIlog\fR \(miHUGE_VAL \fIlog10\fR \(miHUGE_VAL \fIpow\fR 0.0 \fIsqrt\fR 0.0 .DT .XE \*(Mv uses the BSD4.4 C library and the Sun FDLIBM C math library instead of the ACK library. See .BR math (3) for details about the math functions. The \*(Mv libraries offer at least the same functionality as the ACK library. .IP \(bu Underflow range errors do not cause \fIerrno\fR to be set. .IP \(bu The function \fIfmod\fR returns 0.0 and sets \fIerrno\fR to EDOM when the second argument is 0.0. .IP \(bu The set of signals for the \fIsignal\fR function is as described by .BR sigaction (2). .IP \(bu A text-stream need not end in a new-line $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$character. .IP \(bu White space characters before a new-line appear when read in. .IP \(bu There may be any number of null characters appended to a binary stream. .IP \(bu The file position indicator of an append mode stream is initially positioned at the beginning of the file. .IP \(bu A write on a text stream does not cause the associated file to be truncated beyond that point. .IP \(bu The buffering intended by the standard is fully supported. .IP \(bu A zero-length file actually exists. .IP \(bu A file name can consist of any character, except for the '\e0' and the '/'. .IP \(bu A file can be open multiple times. .IP \(bu When a \fIremove\fR is done on an open file, reading and writing behave just as can be expected from a non-removed file. When the associated stream is closed, however, all written data will be lost. .IP \(bu When a file exists prior to a call to \fIrename\fR, it is removed. .IP \(bu The %p conversion in \fIfprintf\fR has the same effect as %#x on \*(Mp and %#lx on the 68000 versions of \*(Mx. .IP \(bu The %p conversion in \fIfscanf\fR has the same effect as %x on \*(Mp and %lx on the 68000 versions of \*(Mx. .IP \(bu A \(mi character that is neither the first nor the last character in the scanlist for %[ conversion is taken to be a range indicator. When the first character has a higher ASCII-value than the second, the \(mi will just be put into the scanlist. .IP \(bu The value of \fIerrno\fR when \fIfgetpos\fR or \fIftell\fR failed is that of \fIlseek\fR. This means: .XS .ta +\w'ESPIPE 'u +\w'\- 'u EBADF \- when the stream is not valid ESPIPE \- when fildes is associated with a pipe EINVAL \- the resulting file pointer would be negative .XE .IP \(bu The messages generated by \fIperror\fR depend on the value of \fIerrno\fR. The mapping of errors to strings is done by \fIstrerror\fR. .IP \(bu When the requested size is zero, \fImalloc\fR, \fIcalloc\fR and \fIrealloc\fR return a null-pointer under \*(Mx. Under \*(Mv a unique non-null pointer is returned. .IP \(bu When \fIabort\fR is called, output buffers will be flushed. Temporary files (made with the \fItmpfile\fR function) will have disappeared when SIGABRT is not caught or ignored. .IP \(bu The \fIexit\fR function returns the low-order eight bits of its argument to the environment. .IP \(bu The predefined environment names are controlled by the user. Setting environment variables is done through the \fIputenv\fR function. This function accepts a pointer to char as its argument. To set, for example, the environment variable TERM to a230 one writes .XS static char terminal[] = "TERM=a230"; putenv(terminal); .XE The argument to \fIputenv\fR is stored in an internal table, so malloc'ed strings cannot be freed until another call to \fIputenv\fR (which sets the same environment variable) is made. The argument to \fIputenv\fR must be writable, which means that officially, the argument cannot be a string constant. The function returns 1 if it fails, 0 otherwise. .LP .IP \(bu The argument to \fIsystem\fR is passed as argument to \fI/bin/sh \(enc\fR. .IP \(bu The strings returned by \fIstrerror\fR depend on \fIerrno\fR. They are listed in .BR intro (2). Everything else causes \fIstrerror\fR to return "unknown error" under \*(Mx, or the result of sprintf("Error %d", errno) under \*(Mv. .IP \(bu The local time zone is per default GMT. This can be changed through the TZ environment variable, e.g. TZ=EST6. See .BR TZ (5). .IP \(bu The \fIclock\fR function returns the number of ticks since process startup. .SS References .IP [1] ANS X3.159-1989 .ft I American National Standard for Information Systems - Programming Language C .ft R .SH "THE MINIX MODULA-2 COMPILER" This section describes the implementation-specific features of the .MX Modula-2 compiler. It is not intended to teach Modula-2 programming. For a description of the Modula-2 language, the reader is referred to [1]. .SS "The language implemented" .PP This paragraph discusses the deviations from the Modula-2 language as described in the 'Report on The Programming Language Modula-2', as it appeared in [1], from now on referred to as 'the Report'. Also, the Report sometimes leaves room for interpretation. The section numbers mentioned are the section numbers of the Report. .SS "Syntax (section 2)" .PP The syntax recognized is that of the Report, with some extensions to also recognize the syntax of an earlier definition, given in [2]. Only one compilation unit per file is accepted. .SS "Vocabulary and Representation (section 3)" .PP The input '\*(Cw10..\fR' is parsed as two tokens: '\*(Cw10\fR' and '\*(Cw..\fR'. .PP The empty string \*(Cw""\fR has type .XS .CW ARRAY [0 .. 0] OF CHAR .ft P .XE and contains one character: \*(Cw0C\fR. .PP When the text of a comment starts with a '\*(Cw$\fR', it may be a pragma. Currently, the following pragmas exist: .nf .SP .CW (*$F (F stands for Foreign) *) (*$R[+|-] (Runtime checks, on or off, default on) *) (*$A[+|-] (Array bound checks, on or off, default off) *) (*$U (Allow for underscores within identifiers) *) .ft P .SP .fi The Foreign pragma is only meaningful in a \*(CwDEFINITION MODULE\fR, and indicates that this \*(CwDEFINITION MODULE\fR describes an interface to a module written in another language (for instance C or Pascal). Runtime checks that can be disabled are: range checks, \*(CwCARDINAL\fR overflow checks, checks when assigning a \*(CwCARDINAL\fR to an \*(CwINTEGER\fR and vice versa, and checks that \*(CwFOR\fR-loop control-variables are not changed in the body of the loop. Array bound checks can be enabled, because many EM implementations do not implement the array bound checking of the EM array instructions. When enabled, the compiler generates a check before generating an EM array instruction. Even when underscores are enabled, they still may not start an identifier. .PP Constants of type \*(CwLONGINT\fR are integers with a suffix letter \*(CwD\fR (for instance \*(Cw1987D\fR). Constants of type \*(CwLONGREAL\fR have suffix \*(CwD\fR if a scale factor is missing, or have \*(CwD\fR in place of \*(CwE\fR in the scale factor (f.i. \*(Cw1.0D\fR, \*(Cw0.314D1\fR). This addition was made, because there was no way to indicate long constants, and also because the addition was made in Wirth's newest Modula-2 compiler. .SS "Declarations and scope rules (section 4)" .PP Standard identifiers are predeclared, and valid in all parts of a program. They are called \fIpervasive\fR. Unfortunately, the Report does not state how this pervasiveness is accomplished. However, page 87 of [1] states: 'Standard identifiers are automatically imported into all modules'. Our implementation therefore allows redeclarations of standard identifiers within procedures, but not within modules. .SS "Constant expressions (section 5)" .PP Each operand of a constant expression must be a constant: a string, a number, a set, an enumeration literal, a qualifier denoting a constant expression, a type transfer with a constant argument, or one of the standard procedures \*(CwABS\fR, \*(CwCAP\fR, \*(CwCHR\fR, \*(CwLONG\fR, \*(CwMAX\fR, \*(CwMIN\fR, \*(CwODD\fR, \*(CwORD\fR, \*(CwSIZE\fR, \*(CwSHORT\fR, \*(CwTSIZE\fR, or \*(CwVAL\fR, with constant argument(s); \*(CwTSIZE\fR and \*(CwSIZE\fR may also have a variable as argument. .SS "Type declarations (section 6)" .LP .ft I 1. Basic types (section 6.1) .PP The type \*(CwCHAR\fR includes the ASCII character set as a subset. Values range from \*(Cw0C\fR to \*(Cw377C\fR, not from \*(Cw0C\fR to \*(Cw177C\fR. .LP .ft I 2. Enumerations (section 6.2) .PP The maximum number of enumeration literals in any one enumeration type is \*(CwMAX(INTEGER)\fR. .LP .ft I 3. Record types (section 6.5) .PP The syntax of variant sections in [1] is different from the one in [2]. Our implementation recognizes both, giving a warning for the older one. .LP .ft I 4. Set types (section 6.6) .PP The only limitation imposed by the compiler is that the base type of the set must be a subrange type, an enumeration type, \*(CwCHAR\fR, or \*(CwBOOLEAN\fR. So, the lower bound may be negative. However, if a negative lower bound is used, the compiler gives a warning of the \fIrestricted\fR class. .PP The standard type \*(CwBITSET\fR is defined as .XS .CW TYPE BITSET = SET OF [0 .. 8*SIZE(INTEGER)-1]; .ft P .XE .SS "Expressions (section 8)" .LP .ft I 1. Operators (section 8.2) .LP .ft I 1.1. Arithmetic operators (section 8.2.1) .PP The Report does not specify the priority of the unary operators \*(Cw+\fR or \*(Cw-\fR: It does not specify whether .XS .CW - 1 + 1 .ft P .XE means .XS .CW - (1 + 1) .ft P .XE or .XS .CW (-1) + 1 .ft P .XE The .MX Modula-2 compiler implements the second alternative. .SS "Statements (section 9)" .LP .ft I 1. Assignments (section 9.1) .PP The Report does not define the evaluation order in an assignment. Our compiler certainly chooses an evaluation order, but it is explicitly left undefined. Therefore, programs that depend on it may cease to work later. .PP The types \*(CwINTEGER\fR and \*(CwCARDINAL\fR are assignment-compatible with \*(CwLONGINT\fR, and \*(CwREAL\fR is assignment-compatible with \*(CwLONGREAL\fR. .LP .ft I 2. Case statements (section 9.5) .PP The size of the type of the case-expression must be less than or equal to the word-size. .PP The Report does not specify what happens if the value of the case-expression does not occur as a label of any case, and there is no \*(CwELSE\fR-part. In our implementation, this results in a runtime error. .LP .ft I 3. For statements (section 9.8) .PP The Report does not specify the legal types for a control variable. Our implementation allows the basic types (except \*(CwREAL\fR), enumeration types, and subranges. A runtime warning is generated when the value of the control variable is changed by the statement sequence that forms the body of the loop, unless runtime checking is disabled. .LP .ft I 4. Return and exit statements (section 9.11) .PP The Report does not specify which result-types are legal. Our implementation allows any result type. .SS "Procedure declarations (section 10)" .PP Function procedures must exit through a RETURN statement, or a runtime error occurs. .LP .ft I 1. Standard procedures (section 10.2) .PP Our implementation supports \*(CwNEW\fR and \*(CwDISPOSE\fR for backwards compatibility, but issues warnings for their use. .PP Also, some new standard procedures were added, similar to the new standard procedures in Wirth's newest compiler: .IP \- \*(CwLONG\fR converts an argument of type \*(CwINTEGER\fR or \*(CwREAL\fR to the types \*(CwLONGINT\fR or \*(CwLONGREAL\fR. .IP \- \*(CwSHORT\fR performs the inverse transformation, without range checks. .IP \- \*(CwFLOATD\fR is analogous to \*(CwFLOAT\fR, but yields a result of type \*(CwLONGREAL\fR. .IP \- \*(CwTRUNCD\fR is analogous to \*(CwTRUNC\fR, but yields a result of type \*(CwLONGINT\fR. .SS "System-dependent facilities (section 12)" .PP The type \*(CwBYTE\fR is added to the \*(CwSYSTEM\fR module. It occupies a storage unit of 8 bits. \*(CwARRAY OF BYTE\fR has a similar effect to \*(CwARRAY OF WORD\fR, but is safer. In some obscure cases the \*(CwARRAY OF WORD\fR mechanism does not quite work properly. .PP The procedure \*(CwIOTRANSFER\fR is not implemented. .SS "Backwards compatibility" .PP Besides recognizing the language as described in [1], the compiler recognizes most of the language described in [2], for backwards compatibility. It warns the user for old-fashioned constructions (constructions that [1] does not allow). If the \fI\(en3\fR option is passed to \fIm2\fR, this backwards compatibility feature is disabled. .SS "Compile time errors" .PP The compile time error messages are intended to be self-explanatory, and not listed here. The compiler also sometimes issues warnings, recognizable by a warning-classification between parentheses. There are 3 classifications: .IP "(old-fashioned use)" .br These warnings are given on constructions that are not allowed by [1], but are allowed by [2]. .IP (strict) .br These warnings are given on constructions that are supported by the .MX Modula-2 compiler, but might not be supported by others. Examples: functions returning structured types, SET types of subranges with negative lower bound. .IP (warning) .br The other warnings, such as warnings about variables that are never assigned, never used, etc. .SS "Runtime errors" .PP The \fITraps\fR module enables the user to install his own runtime error handler. The default one just displays what happened and exits. Basically, a trap handler is just a procedure that takes an INTEGER as parameter. The INTEGER is the trap number. This INTEGER can be one of the EM trap numbers, listed in [3], or one of the numbers listed in the \fITraps\fR definition module. .PP The following runtime errors may occur: .IP "array bound error" .br This error is detected if the \fI\(enA\fR option is given to \fIm2\fR. .IP "range bound error" .br Range bound errors are always detected, unless runtime checks are disabled. .IP "set bound error" .IP "cardinal overflow" .br This error is detected, unless runtime checks are disabled. .IP "cardinal underflow" .br This error is detected, unless runtime checks are disabled. .IP "divide by 0" .IP "divide by 0.0" .IP "conversion error" .br This error occurs when assigning a negative value of type INTEGER to a variable of type CARDINAL, or when assigning a value of CARDINAL that is > MAX(INTEGER), to a variable of type INTEGER. It is detected, unless runtime checking is disabled. .IP "heap overflow" .br This might happen when ALLOCATE fails. .IP "case error" .br This error occurs when non of the cases in a CASE statement are selected, and the CASE statement has no ELSE part. .IP "stack size of process too large" .br This is most likely to happen if the reserved space for a coroutine stack is too small. In this case, increase the size of the area given to \*(CwNEWPROCESS\fR. It can also happen if the stack needed for the main process is too large and there are coroutines. In this case, the only fix is to reduce the stack size needed by the main process, f.i. by avoiding local arrays. .IP "too many nested traps + handlers" .br This error can only occur when the user has installed his own trap handler. It means that during execution of the trap handler another trap has occurred, and that several times. In some cases, this is an error because of overflow of some internal tables. .IP "no RETURN from function procedure" .br This error occurs when a function procedure does not return properly ('falls' through). .IP "illegal instruction" .br This error might occur when you use floating point operations on an implementation that does not have floating point. .PP In addition, some of the library modules may give error messages. The \fBTraps\fR-module has a suitable mechanism for this. .SS "The procedure call interface" .PP Parameters are pushed on the stack in reversed order. For VAR parameters, its address is passed, for value parameters its value. The only exception to this rule is with conformant arrays. For conformant arrays, the address is passed, and an array descriptor is passed. The descriptor is an EM array descriptor. It consists of three fields: the lower bound (always 0), upper bound \(mi lower bound, and the size of the elements. The descriptor is pushed first. If the parameter is a value parameter, the called routine must make sure that its value is never changed, for instance by making its own copy of the array. .PP When the size of the return value of a function procedure is larger than the maximum of \*(CwSIZE(LONGREAL)\fR and twice the pointer-size, the caller reserves this space on the stack, above the parameters. Callee then stores its result there, and returns no other value. .SS "The Modula-2 runtime library" .PP The definition modules of the modules available in the .MX Modula-2 runtime library reside in the directory \fI/usr/lib/ack/m2\fR. .SS References .IP [1] Niklaus Wirth, .ft I Programming in Modula-2, third, corrected edition, .ft R Springer-Verlag, Berlin (1985) .IP [2] Niklaus Wirth, .ft I Programming in Modula-2, .ft R Stringer-Verlag, Berlin (1983) .IP [3] A.S.Tanenbaum, J.W.Stevenson, Hans van Staveren, E.G.Keizer, .ft I Description of a machine architecture for use with block structured languages, .ft R Informatica rapport IR-81, Vrije Universiteit, Amsterdam .SH "THE MINIX PASCAL COMPILER" .PP .de IT .PP .B BS\ \\$1: .. .de IS .PP .in +.5i .. .PP This section refers to the (1982) BSI standard for Pascal [1]. .MX Pascal complies with the requirements of level 1 of BS 6192: 1982, with the exceptions as listed in this section. .PP The standard requires an accompanying document describing the implementation-defined and implementation-dependent features, the reaction on errors and the extensions to standard Pascal. These four items will be treated in the rest of this section. .SS "Implementation-defined features" .PP For each implementation-defined feature mentioned in the BSI standard we give the section number, the quotation from that section and the definition. First we quote the definition of implementation-defined: .PP .RS Possibly differing between processors, but defined for any particular processor. .RE .IT 6.1.7 Each string-character shall denote an implementation-defined value of the required char-type. .IS All 7-bit ASCII characters except linefeed LF (10) are allowed. .IT 6.4.2.2 The values of type real shall be an implementation-defined subset of the real numbers denoted as specified by 6.1.5 by the signed-real values. .IS The set of real values range from a low of \(mi1.7976931348623157e+308 to a high of 1.7976931348623157e+308. .IT 6.4.2.2 The type char shall be the enumeration of a set of implementation-defined characters, some possibly without graphic representations. .IS The 7-bit ASCII character set is used, where LF (10) denotes the end-of-line marker on text-files. .IT 6.4.2.2 The ordinal numbers of the character values shall be values of integer-type, that are implementation-defined, and that are determined by mapping the character values on to consecutive non-negative integer values starting at zero. .IS The normal ASCII ordering is used: ord('0')=48, ord('A')=65, ord('a')=97, etc. .IT 6.6.5.2 The post-assertions imply corresponding activities on the external entities, if any, to which the file-variables are bound. These activities, and the point at which they are actually performed, shall be implementation-defined. .IS The reading and writing writing of objects on files is buffered. This means that when a program terminates abnormally, I/O may be unfinished. Terminal I/O is unbuffered. Files are closed whenever they are rewritten or reset, or on program termination. .IT 6.7.2.2 The predefined constant \fImaxint\fR shall be of integer-type and shall denote an implementation-defined value, that satisfies the following conditions: .IP (a) All integral values in the closed interval from \fI\(mimaxint\fR to \fI+maxint\fR shall be values of the integer-type. .IP (b) Any monadic operation performed on an integer value in this interval shall be correctly performed according to the mathematical rules for integer arithmetic. .IP (c) Any dyadic integer operation on two integer values in this same interval shall be correctly performed according to the mathematical rules for integer arithmetic, provided that the result is also in this interval. .IP (d) Any relational operation on two integer values in this same interval shall be correctly performed according to the mathematical rules for integer arithmetic. .SP The representation of integers under 16-bit \*(Mp or under 68000 \*(Mx is a 16-bit word using two's complement arithmetic. The integers range from \(mi32768 to +32767. Under 32-bit \*(Mp a 32-bit integer is used ranging from \(mi2147483648 to +2147483647. .IT 6.7.2.2 The result of the real arithmetic operators and functions shall be approximations to the corresponding mathematical results. The accuracy of this approximation shall be implementation-defined .IS The default size of reals is 8 bytes, the accuracy is 11 bits for the exponent, and 53 bits for the mantissa. This gives an accuracy of about 16 digits. and exponents ranging from \(mi307 to +307. .IT 6.9.3.1 The default TotalWidth values for integer, Boolean and real types shall be implementation-defined. .IS The defaults are: .XS .ta +\w'Boolean 'u +\w'14 'u integer 6 (16-bit) integer 11 (32-bit) Boolean 5 real 14 .DT .XE .IT 6.9.3.4.1 ExpDigits, the number of digits written in an exponent part of a real, shall be implementation-defined. .IS ExpDigits is defined as 3. .IT 6.9.3.4.1 The character written as part of the representation of a real to indicate the beginning of the exponent part shall be implementation-defined, either 'E' or 'e'. .IS The exponent part starts with 'e'. .IT 6.9.3.5 The case of the characters written as representation of the Boolean values shall be implementation-defined. .IS The representations of true and false are 'true' and 'false'. .IT 6.9.5 The effect caused by the standard procedure page on a text file shall be implementation-defined. .IS The ASCII character form feed FF (12) is written. .IT 6.10 The binding of the variables denoted by the program-parameters to entities external to the program shall be implementation-defined if the variable is of a file-type. .IS The program parameters must be files and all, except input and output, must be declared as such in the program block. .PP The program parameters input and output, if specified, will correspond with the UNIX streams 'standard input' and 'standard output'. .PP The other program parameters will be mapped to the argument strings provided by the caller of this program. The argument strings are supposed to be path names of the files to be opened or created. The order of the program parameters determines the mapping: the first parameter is mapped onto the first argument string, etc. Note that input and output are ignored in this mapping. .PP The mapping is recalculated each time a program parameter is opened for reading or writing by a call to the standard procedures reset or rewrite. This gives the programmer the opportunity to manipulate the list of string arguments using the external procedures argc, argv and argshift available in the Pascal library. .IT 6.10 The effect of an explicit use of reset or rewrite on the standard text files input or output shall be implementation-defined. .IS The procedures reset and rewrite are no-ops if applied to input or output. .in 0 .SS "Implementation-dependent features" .PP For each implementation-dependent feature mentioned in the BSI standard, we give the section number, the quotation from that section and the way this feature is treated by the .MX Pascal system. First we quote the definition of 'implementation-dependent': .PP .RS Possibly differing between processors and not necessarily defined for any particular processor. .RE .IT 6.7.2.1 The order of evaluation of the operands of a dyadic operator shall be implementation-dependent. .IS Operands are always evaluated, so the program part .XS if (p<>nil) and (p^.value<>0) then .XE is probably incorrect. .PP The left-hand operand of a dyadic operator is almost always evaluated before the right-hand side. Some peculiar evaluations exist for the following cases: .IP 1. The modulo operation is performed by a library routine to check for negative values of the right operand. .IP 2. The expression .XS set1 <= set2 .XE where set1 and set2 are compatible set types is evaluated in the following steps: .XS .ta +\w'\- 'u \- evaluate set2; \- evaluate set1; \- compute set2+set1; \- test set2 and set2+set1 for equality. .DT .XE .IP 3. The expression .XS set1 >= set2 .XE where set1 and set2 are compatible set types is evaluated in the following steps: .XS .ta +\w'\- 'u \- evaluate set1; \- evaluate set2; \- compute set1+set2; \- test set1 and set1+set2 for equality. .DT .XE .IT 6.7.3 The order of evaluation, accessing and binding of the actual-parameters for functions shall be implementation-dependent. .IS The order of evaluation is from right to left. .IT 6.8.2.2 The decision as to the order of accessing the variable and evaluating the expression in an assignment-statement, shall be implementation-dependent. .IS The expression is evaluated first. .IT 6.8.2.3 The order of evaluation and binding of the actual-parameters for procedures shall be implementation-dependent. .IS The same as for functions. .IT 6.9.5 The effect of inspecting a text file to which the page procedure was applied during generation is implementation-dependent. .IS The formfeed character written by page is treated like a normal character, with ordinal value 12. .IT 6.10 The binding of the variables denoted by the program-parameters to entities external to the program shall be implementation-dependent unless the variable is of a file-type. .IS Only variables of a file-type are allowed as program parameters. .in 0 .SS "Error handling" .PP There are three classes of errors to be distinguished. In the first class are the error messages generated by the compiler. The second class consists of the occasional errors generated by the other programs involved in the compilation process. Errors of the third class are the errors as defined in the standard by: .PP .RS An error is a violation by a program of the requirements of this standard that a processor is permitted to leave undetected. .RE .LP .ft I Compiler errors .PP Error are written on the standard error output. Each line has the form: .XS , line : .XE Every time the compiler detects an error that does not have influence on the code produced by the compiler or on the syntax decisions, a warning messages is given. If only warnings are generated, compilation proceeds and probably results in a correctly compiled program. .PP Sometimes the compiler produces several errors for the same line. They are only shown up to a maximum of 5 errors per line. Warning are also shown up to a maximum of 5 per line. .PP Extensive treatment of these errors is outside the scope of this manual. .LP .ft I Runtime errors .PP Errors detected at run time cause an error message to be generated on the diagnostic output stream (UNIX file descriptor 2). The message consists of the name of the program followed by a message describing the error, possibly followed by the source line number. Unless the \fI\(enn\fR option is turned on, the compiler generates code to keep track of which source line causes which instructions to be generated. .PP For each error mentioned in the standard we give the section number, the quotation from that section and the way it is processed by the Pascal-compiler or runtime system. .PP For detected errors the corresponding message and trap number are given. Trap numbers are useful for exception-handling routines. Normally, each error causes the program to terminate. By using exception-handling routines one can ignore errors or perform alternate actions. Only some of the errors can be ignored by restarting the failing instruction. These errors are marked as non-fatal, all others as fatal. A list of errors with trap number between 0 and 63 (EM errors) can be found in [2]. Errors with trap number between 64 and 127 (Pascal errors) are listed below. .IT 6.4.6 It shall be an error if a value of type T2 must be assignment-compatible with type T1, while T1 and T2 are compatible ordinal-types and the value of type T2 is not in the closed interval specified by T1. .IS The compiler distinguishes between array-index expressions and the other places where assignment-compatibility is required. .PP Array subscripting errors are only detected when the 'A' option is used. In the other cases, a range bound error occurs when the value of type T2 is not in the closed interval specified by T1, unless range checks are disabled. .IT 6.4.6 It shall be an error if a value of type T2 must be assignment-compatible with type T1, while T1 and T2 are compatible set-types and any member of the value of type T2 is not in the closed interval specified by the base-type of the type T1. .IS This error is not detected. .IT 6.5.3.3 It shall be an error if a component of a variant-part of a variant, where the selector of the variant-part is not a field, is accessed unless the variant is active for the entirety of each reference and access to each component of the variant. .IS This error is not detected. .IT 6.5.4 It shall be an error if the pointer-variable of an identified-variable either denotes a nil-value or is undefined. .IS This error is not detected. .IT 6.5.4 It shall be an error to remove the identifying-value of an identified variable from its pointer-type when a reference to the variable exists. .IS When the identified variable is an element of the record-variable-list of a with-statement, a warning is given at compile-time. Otherwise, this error is not detected. .IT 6.5.5 It shall be an error to alter the value of a file-variable f when a reference to the buffer-variable f^ exists. .IS When f is altered when it is an element of the record-variable-list of a with-statement, a warning is given. When a buffer-variable is used as a variable-parameter, an error is given. This is done at compile-time. .IT 6.6.5.2 It shall be an error if the stated pre-assertion does not hold immediately prior to any use of the file handling procedures rewrite, put, reset and get. .IS For each of these four operations the pre-assertions can be reformulated as: .XS .ta +\w'rewrite(f): 'u rewrite(f): no pre-assertion. put(f): f is opened for writing and f^ is not undefined. reset(f): f exists. get(f): f is opened for reading and eof(f) is false. .DT .XE The following errors are detected for these operations: .SP rewrite(f): .in +6 .ti -3 more args expected, trap 64, fatal: .br f is a program-parameter and the corresponding file name is not supplied by the caller of the program. .ti -3 rewrite error, trap 101, fatal: .br the caller of the program lacks the necessary access rights to create the file in the file system or operating system problems like table overflow prevent creation of the file. .in -6 .SP put(f): .in +6 .ti -3 file not yet open, trap 72, fatal: .br reset or rewrite are never applied to the file. The checks performed by the run time system are not foolproof. .ti -3 not writable, trap 96, fatal: .br f is opened for reading. .ti -3 write error, trap 104, fatal: .br probably caused by file system problems. For instance, the file storage is exhausted. Because I/O is buffered to improve performance, it might happen that this error occurs if the file is closed. Files are closed whenever they are rewritten or reset, or on program termination. .in -6 .SP reset(f): .in +6 .ti -3 more args expected, trap 64, fatal: .br same as for rewrite(f). .ti -3 reset error, trap 100, fatal: .br f does not exist, or the caller has insufficient access rights, or operating system tables are exhausted. .in -6 .SP get(f): .in +6 .ti -3 file not yet open, trap 72, fatal: .br as for put(f). .ti -3 not readable, trap 97, fatal: .br f is opened for writing. .ti -3 end of file, trap 98, fatal: .br eof(f) is true just before the call to get(f). .ti -3 read error, trap 103, fatal: .br unlikely to happen. Probably caused by hardware problems or by errors elsewhere in your program that destroyed the file information maintained by the run time system. .ti -3 truncated, trap 99, fatal: .br the file is not properly formed by an integer number of file elements. For instance, the size of a file of integer is odd. .ti -3 non-ASCII char read, trap 106, non-fatal: .br the character value of the next character-type file element is out of range (0..127). Only for text files. .in -6 .IT 6.6.5.3 It shall be an error if a variant of a variant-part within the new variable becomes active and a different variant of the variant-part is one of the specified variants. .IS This error is not detected. .IT 6.6.5.3 It shall be an error to use dispose(q) if the identifying variable has been allocated using the form new(p,c1,...,cn). .IS This error is not detected. However, this error can cause more memory to be freed then was allocated. Dispose causes a fatal trap 73 when memory already on the free list is freed again. .IT 6.6.5.3 It shall be an error to use dispose(q,k1,...,km) if the identifying variable has been allocated using the form new(p,c1,...,cn) and m is not equal to n. .IS This error is not detected. However, this error can cause more memory to be freed then was allocated. Dispose causes a fatal trap 73 when memory already on the free list is freed again. .IT 6.6.5.3 It shall be an error if the variants of a variable to be disposed are different from those specified by the case-constants to dispose. .IS This error is not detected. .IT 6.6.5.3 It shall be an error if the value of the pointer parameter of dispose has nil-value or is undefined. .IS This error is detected for nil-value (dispose error, trap 73, fatal). .IT 6.6.5.3 It shall be an error if a variable created using the second form of new is accessed by the identified variable of the variable-access of a factor, of an assignment-statement, or of an actual-parameter. .IS This error is not detected. .IT 6.6.6.2 It shall be an error if the value of sqr(x) does not exist. .IS This error is detected for real-type arguments (real overflow, trap 4, non-fatal). .IT 6.6.6.2 It shall be an error if x in ln(x) is smaller than or equal to 0. .IS This error is detected (error in ln, trap 66, non-fatal) .IT 6.6.6.2 It shall be an error if x in sqrt(x) is smaller than 0. .IS This error is detected (error in sqrt, trap 67, non-fatal) .SP In addition to these errors, overflow in the expression exp(x) is detected (error in exp, trap 65, non-fatal; real overflow, trap 4, non-fatal) .IT 6.6.6.3 It shall be an error if the integer value of trunc(x) does not exist. .IS This error is detected (conversion error, trap 10, non-fatal). .IT 6.6.6.3 It shall be an error if the integer value of round(x) does not exist. .IS This error is detected (conversion error, trap 10, non-fatal). .IT 6.6.6.4 It shall be an error if the integer value of ord(x) does not exist. .IS This error can not occur, because the compiler will not allow such ordinal types. .IT 6.6.6.4 It shall be an error if the character value of chr(x) does not exist. .IS This error is detected (range bound error, trap 1, non-fatal). .IT 6.6.6.4 It shall be an error if the value of succ(x) does not exist. .IS Same comments as for chr(x). .IT 6.6.6.4 It shall be an error if the value of pred(x) does not exist. .IS Same comments as for chr(x). .IT 6.6.6.5 It shall be an error if f in eof(f) is undefined. .IS This error is detected (file not yet open, trap 72, fatal). .IT 6.6.6.5 It shall be an error if f in eoln(f) is undefined, or if eof(f) is true at that time. .IS The following errors may occur: .IS file not yet open, trap 72, fatal; .br not readable, trap 97, fatal; .br end of file, trap 98, fatal. .IT 6.7.1 It shall be an error if a variable-access used as an operand in an expression is undefined at the time of its use. .IS The compiler performs some limited checks to see if identifiers are used before they are set. Since it can not always be sure (one could, for instance, jump out of a loop), only a warning is generated. When an expression contains a function-call, an error occurs if the function is not assigned at run-time. .IT 6.7.2.2 A term of the form x/y shall be an error if y is zero. .IS This error is detected (divide by 0.0, trap 7, non-fatal). .IT 6.7.2.2 It shall be an error if j is zero in 'i div j'. .IS This error is detected (divide by 0, trap 6, non-fatal). .IT 6.7.2.2 It shall be an error if j is zero or negative in i MOD j. .IS This error is detected (only positive j in 'i mod j', trap 71, non-fatal). .IT 6.7.2.2 It shall be an error if the result of any operation on integer operands is not performed according to the mathematical rules for integer arithmetic. .IS This implementation does not detect integer overflow. .IT 6.8.3.5 It shall be an error if none of the case-constants is equal to the value of the case-index upon entry to the case-statement. .IS This error is detected (case error, trap 20, fatal). .IT 6.9.1 It shall be an error if the sequence of characters read looking for an integer does not form a signed-integer as specified in 6.1.5. .IS This error is detected (digit expected, trap 105, non-fatal). .IT 6.9.1 It shall be an error if the sequence of characters read looking for a real does not form a signed-number as specified in 6.1.5. .IS This error is detected (digit expected, trap 105, non-fatal). .IT 6.9.1 When read is applied to f, it shall be an error if the buffer-variable f^ is undefined or the pre-assertions for get do not hold. .IS This error is detected (see get(f)). .IT 6.9.3 When write is applied to a text file f, it shall be an error if f is undefined or f is opened for reading. .IS This error is detected (see put(f)). Furthermore, this error is also detected when f is not a text file. .IT 6.9.3.1 The values of TotalWidth or FracDigits shall be greater than or equal to one; it shall be an error if either value is less then one. .IS When either value is less than zero, an error (illegal field width, trap 75, non-fatal) occurs. Zero values are allowed, in order to maintain some compatibility with the old .MX Pascal compiler. .IT 6.9.5 It shall be an error if the pre-assertion required for writeln(f) doe not hold prior to the invocation of page(f); .IS This error is detected (see put(f)). .in 0 .SS "Extensions to the standard" .LP .ft I 1. External routines .LP Except for the required directive 'forward' the .MX Pascal compiler recognizes the directive 'extern'. This directive tells the compiler that the procedure block of this procedure will not be present in the current program. The code for the body of this procedure must be included at a later stage of the compilation process. .PP This feature allows one to build libraries containing often used routines. These routines do not have to be included in all the programs using them. Maintenance is much simpler if there is only one library module to be changed instead of many Pascal programs. .PP Another advantage is that these library modules may be written in a different language, for instance C. .PP The use of external routines, however, is dangerous. The compiler normally checks for the correct number and type of parameters when a procedure is called and for the result type of functions. If an external routine is called these checks are not sufficient, because the compiler can not check whether the procedure heading of the external routine as given in the Pascal program matches the actual routine implementation. It should be the loader's task to check this. However, the current loaders are not that smart. .PP For those who wish the use the interface between C and Pascal we give an incomplete list of corresponding formal parameters in C and Pascal. .SP .XS .ta +\w'function a(pars):type 'u \fBPascal C\fR a:integer int a a:char int a a:boolean int a a:real double a a:^type type *a var a:type type *a procedure a(pars) struct { void (*a)() ; char *static_link ; } function a(pars):type struct { type (*a)() ; char *static_link ; } .DT .XE The Pascal runtime system uses the following algorithm when calling function/procedures passed as parameters. .XS if (static_link) { (*a)(static_link, pars); } else { (*a)(pars); } .XE .LP .ft I 2. Separate compilation. .LP The compiler is able to (separately) compile a collection of declarations, procedures and functions to form a library. The library may be linked with the main program, compiled later. The syntax of these modules is .XS .in +\w'module = 'u .ti -\w'module = 'u module = [constant-definition-part] [type-definition-part] [var-declaration-part] [procedure-and-function-declaration-part] .in -\w'module = 'u .XE The compiler accepts a program or a module: .XS unit = program | module .XE All variables declared outside a module must be imported by parameters, even the files input and output. Access to a variable declared in a module is only possible using the procedures and functions declared in that same module. By giving the correct procedure/function heading followed by the directive 'extern' you may use procedures and functions declared in other units. .LP .ft I 3. Assertions. .LP When the s-option is off, .MX Pascal compiler recognizes an additional statement, the assertion. Assertions can be used as an aid in debugging and documentation. The syntax is: .XS assertion = 'assert' Boolean-expression .XE An assertion is a simple-statement, so .XS .in +\w'simple-statement = ['u .ti -\w'simple-statement = ['u simple-statement = [assignment-statement | procedure-statement | goto-statement | assertion .in -\w'['u ] .in -\w'simple-statement = 'u .XE An assertion causes an error if the Boolean-expression is false. That is its only purpose. It does not change any of the variables, at least it should not. Therefore, do not use functions with side-effects in the Boolean-expression. If the a-option is turned on, then assertions are skipped by the compiler. 'assert' is not a word-symbol (keyword) and may be used as identifier. However, assignment to a variable and calling of a procedure with that name will be impossible. If the s-option is turned on, the compiler will not know a thing about assertions, so using assertions will then give a parse error. .LP .ft I 4. Additional procedures. .LP Three additional standard procedures are available: .IP "halt:" a call of this procedure is equivalent to jumping to the end of your program. It is always the last statement executed. The exit status of the program may be supplied as optional argument. If not, it will be zero. .IP release: .IP mark: for most applications it is sufficient to use the heap as second stack. Mark and release are suited for this type of use, more suited than dispose. mark(p), with p of type pointer, stores the current value of the heap pointer in p. release(p), with p initialized by a call of mark(p), restores the heap pointer to its old value. All the heap objects, created by calls of new between the call of mark and the call of release, are removed and the space they used can be reallocated. Never use mark and release together with dispose! .RE .LP .ft I 5. UNIX interfacing. .LP If the c-option is turned on, then some special features are available to simplify an interface with the UNIX environment. First of all, the compiler allows you to use a different type of string constants. These string constants are delimited by double quotes ('"'). To put a double quote into these strings, you must repeat the double quote, like the single quote in normal string constants. These special string constants are terminated by a zero byte (chr(0)). The type of these constants is a pointer to a packed array of characters, with lower bound 1 and unknown upper bound. .br Secondly, the compiler predefines a new type identifier 'string' denoting this just described string type. .PP The only thing you can do with these features is declaration of constants and variables of type 'string'. String objects may not be allocated on the heap and string pointers may not be de-referenced. Still these strings are very useful in combination with external routines. The procedure write is extended to print these zero-terminated strings correctly. .LP .ft I 6. Double length (32 bit) integers. .LP If the d-option is turned on, then the additional type 'long' is known to the compiler. Long variables have integer values in the range \(mi2147483648 .. +2147483647. Long constants can not be declared. Longs can not be used as control-variables. It is not allowed to form subranges of type long. All operations allowed on integers are also allowed on longs and are indicated by the same operators: '+', '-', '*', '/', 'div', 'mod'. The procedures read and write have been extended to handle long arguments correctly. It is possible to read longs from a file of integers and vice-versa, but only if longs and integers have the same size. The default width for longs is 11. The standard procedures 'abs' and 'sqr' have been extended to work on long arguments. Conversion from integer to long, long to real, real to long and long to integer are automatic, like the conversion from integer to real. These conversions may cause a .PP .RS conversion error, trap 10, non-fatal .RE .LP .ft I 7. Underscore as letter. .LP The character '_' may be used in forming identifiers, if the u- or U-option is turned on. It is forbidden to start identifiers with underscores, since this may cause name-clashes with run-time routines. .LP .ft I 8. Zero field width in write. .LP Zero TotalWidth arguments are allowed. In this case, no characters are written for character, string or Boolean type arguments. A zero FracDigits argument for fixed-point representation of reals causes the fraction and the character '.' to be suppressed. .LP .ft I 9. Pre-processing. .LP If the very first character of a file containing a Pascal program is the sharp ('#', ASCII 23(hex)) the file is preprocessed in the same way as C programs. Lines beginning with a '#' are taken as preprocessor command lines and not fed to the Pascal compiler proper. C style comments, /*......*/, are removed by the C preprocessor, thus C comments inside Pascal programs are also removed when they are fed through the preprocessor. .in 0 .SS "Deviations from the standard" .PP .MX Pascal deviates from the standard in the following ways: .IP 1. Standard procedures and functions are not allowed as parameters in .MX Pascal. You can obtain the same result with negligible loss of performance by declaring some user routines like: .XS .CW function sine(x:real):real; begin sine:=sin(x) end; .ft R .XE .IP 2. The standard procedures read, readln, write and writeln are implemented as word-symbols, and can therefore not be redeclared. .SS "Compiler options" .PP Some options of the compiler may be controlled by using '{$....}'. Each option consists of a lower case letter followed by +, \(mi or an unsigned number. Options are separated by commas. The following options exist: .IP a+/\(mi This option switches assertions on and off. If this option is on, then code is included to test these assertions at run time. Default +. .IP c+/\(mi This option, if on, allows you to use C-type string constants surrounded by double quotes. Moreover, a new type identifier 'string' is predefined. Default \(mi. .IP d+/\(mi This option, if on, allows you to use variables of type 'long'. Default \(mi. .IP i .br With this flag the setsize for a set of integers can be manipulated. The number must be the number of bits per set. The default value is 16. .IP l+/\(mi If + then code is inserted to keep track of the source line number. When this flag is switched on and off, an incorrect line number may appear if the error occurs in a part of your program for which this flag is off. Default +. .IP r+/\(mi If + then code is inserted to check subrange variables against lower and upper subrange limits. Default +. .IP s+/\(mi If + then the compiler will hunt for places in your program where non-standard features are used, and for each place found it will generate a warning. Default \(mi. .IP t+/\(mi If + then each time a procedure is entered, the routine 'procentry' is called, and each time a procedure exits, the procedure 'procexit' is called. Both 'procentry' and 'procexit' have a 'string' as parameter. This means that when a user specifies his or her own procedures, the c-option must be used. Default procedures are present in the run time library. Default \(mi. .IP u+/\(mi If + then the character '_' is treated like a letter, so that it may be used in identifiers. Procedure and function identifiers are not allowed to start with an underscore because they may collide with library routine names. Default \(mi. .PP Some of these flags (c, d, i, s, u, C and U) are only effective when they appear before the 'program' symbol. The others may be switched on and off. .PP A very powerful debugging tool is the knowledge that inaccessible statements and useless tests are removed by the optimizer. For instance, a statement like: .XS .CW if debug then writeln('initialization done'); .ft R .XE is completely removed by the optimizer if debug is a constant with value false. The first line is removed if debug is a constant with value true. Of course, if debug is a variable nothing can be removed. .SS "Library routines" .PP The following library of external routines for Pascal programs is available: .nf .SP .CW .ta 12n const bufsize = ?; type br1 = 1..bufsize; br2 = 0..bufsize; br3 = -1..bufsize; ok = -1..0; buf = packed array[br1] of char; alfa = packed array[1..8] of char; string = ^packed array[1..?] of char; filetype = file of ?; long = ?; .SP {all routines must be declared extern} .SP function argc:integer; function argv(i:integer):string; function environ(i:integer):string; procedure argshift; .SP procedure buff(var f:filetype); procedure nobuff(var f:filetype); procedure notext(var f:text); procedure diag(var f:text); procedure pcreat(var f:text; s:string); procedure popen(var f:text; s:string); procedure pclose(var f:filetype); .SP procedure trap(err:integer); procedure encaps(procedure p; procedure q(n:integer)); .SP function perrno:integer; function uread(fd:integer; var b:buf; len:br1):br3; function uwrite(fd:integer; var b:buf; len:br1):br3; .SP function strbuf(var b:buf):string; function strtobuf(s:string; var b:buf; len:br1):br2; function strlen(s:string):integer; function strfetch(s:string; i:integer):char; procedure strstore(s:string; i:integer; c:char); .SP function clock:integer; .fi .ft R .PP This library contains some often used external routines for Pascal programs. The routines can be divided into several categories: .PP .ti -2 Argument control: .RS .IP argc 10 Gives the number of arguments provided when the program is called. .IP argv Selects the specified argument from the argument list and returns a pointer to it. This pointer is nil if the index is out of bounds (<0 or >=argc). .IP environ Returns a pointer to the i-th environment string (i>=0). Returns nil if i is beyond the end of the environment list (UNIX version 7). .IP argshift Effectively deletes the first argument from the argument list. Its function is equivalent to \fIshift\fR in the UNIX shell: argv[2] becomes argv[1], argv[3] becomes argv[2], etc. It is a useful procedure to skip optional flag arguments. Note that the matching of arguments and files is done at the time a file is opened by a call to reset or rewrite. .PP .ti -2 Additional file handling routines: .IP buff Turn on buffering of a file. Not very useful, because all files are buffered except standard output to a terminal and diagnostic output. Input files are always buffered. .IP nobuff Turn off buffering of an output file. It causes the current contents of the buffer to be flushed. .IP notext Only useful for input files. End of line characters are not replaced by a space and character codes out of the ASCII range (0..127) do not cause an error message. .IP diag Initialize a file for output on the diagnostic output stream (fd=2). Output is not buffered. .IP pcreat The same as rewrite(f), except that you must provide the file name yourself. The name must be zero terminated. Only text files are allowed. .IP popen The same as reset(f), except that you must provide the file name yourself. The name must be zero terminated. Only text files are allowed. .IP pclose Gives you the opportunity to close files hidden in records or arrays. All other files are closed automatically. .PP .ti -2 String handling: .IP strbuf Type conversion from character array to string. It is your own responsibility that the string is zero terminated. .IP strtobuf Copy string into buffer until the string terminating zero byte is found or until the buffer if full, whatever comes first. The zero byte is also copied. The number of copied characters, excluding the zero byte, is returned. So if the result is equal to the buffer length, then the end of buffer is reached before the end of string. .IP strlen Returns the string length excluding the terminating zero byte. .IP strfetch Fetches the i-th character from a string. There is no check against the string length. .IP strstore Stores a character in a string. There is no check against string length, so this is a dangerous procedure. .PP .ti -2 Trap handling: .PP These routines allow you to handle almost all the possible error situations yourself. You may define your own trap handler, replacing the default handler that produces an error message and quits. You may also generate traps yourself. .IP trap Trap generates the trap passed as argument (0..252). The trap numbers 128..252 may be used freely. The others are reserved. .IP encaps Encapsulate the execution of \fIp\fR with the trap handler \fIq\fR. Encaps replaces the previous trap handler by \fIq\fR, calls \fIp\fR and restores the previous handler when \fIp\fR returns. If, during the execution of \fIp\fR, a trap occurs, then \fIq\fR is called with the trap number as parameter. For the duration of \fIq\fR the previous trap handler is restored, so that you may handle only some of the errors in \fIq\fR. All the other errors must then be raised again by a call to \fItrap\fR. .br Encapsulations may be nested: you may encapsulate a procedure while executing an encapsulated routine. .br Jumping out of an encapsulated procedure (non-local goto) is dangerous, because the previous trap handler must be restored. Therefore, you may only jump out of procedure \fIp\fR from inside \fIq\fR and you may only jump out of one level of encapsulation. If you want to exit several levels of encapsulation, use traps. See pc_prlib(7) for lists of trap numbers for EM machine errors and Pascal run time system errors. Note that \fIp\fR may not have parameters. .PP .ti -2 UNIX system calls: .IP uread Equal to the read system call. Its normal name is blocked by the standard Pascal routine read. .IP uwrite As above but for write(2). .IP perrno Because external data references are not possible in Pascal, this routine returns the global variable \fIerrno\fR, indicating the result of the last system call. .PP .ti -2 Miscellaneous: .IP clock Return the number of ticks of user and system time consumed by the program. .PP The following program presents an example of how these routines can be used. This program is equivalent to the UNIX command cat(1). .nf .SP .CW {$c+} .CW program cat(input,inp,output); .CW var inp:text; .CW s:string; .SP .CW function argc:integer; extern; .CW function argv(i:integer):string; extern; .CW procedure argshift; extern; .CW function strlen(s:string):integer; extern; .CW function strfetch(s:string; i:integer):char; extern; .SP .CW procedure copy(var fi:text); .CW var c:char; .CW begin reset(fi); .CW while not eof(fi) do .CW begin .CW while not eoln(fi) do .CW begin .CW read(fi,c); .CW write(c) .CW end; .CW readln(fi); .CW writeln .CW end .CW end; .SP .CW begin {main} .CW if argc = 1 then .CW copy(input) .CW else .CW repeat .CW s := argv(1); .CW if (strlen(s) = 1) and (strfetch(s,1) = '-') .CW then copy(input) .CW else copy(inp); .CW argshift; .CW until argc <= 1; .CW end. .fi .ft R .PP Another example gives some idea of the way to manage trap handling: .nf .SP .CW program bigreal(output); .CW const EFOVFL=4; .CW var trapped:boolean; .CW .SP .CW procedure encaps(procedure p; procedure q(n:integer)); extern; .CW procedure trap(n:integer); extern; .CW .SP .CW procedure traphandler(n:integer); .CW begin if n=EFOVFL then trapped:=true else trap(n) end; .CW .SP .CW procedure work; .CW var i,j:real; .CW begin trapped:=false; i:=1; .CW while not trapped do .CW begin j:=i; i:=i*2 end; .CW writeln('bigreal = ',j); .CW end; .CW .SP .CW begin .CW encaps(work,traphandler); .CW end. .fi .ft R .PP Two routines may cause fatal error messages to be generated. These are: .IP pcreat Rewrite error (trap 77) if the file cannot be created. .IP popen Reset error (trap 76) if the file cannot be opened for reading .SS References .IP [1] BSI standard BS 6192: 1982 (ISO 7185). .IP [2] A.S.Tanenbaum, J.W.Stevenson, Hans van Staveren, E.G.Keizer, "Description of a machine architecture for use with block structured languages", Informatica rapport IR-81. .TH ASCII 7 .SH NAME ascii \- the ASCII character set. .SH DESCRIPTION The ASCII character set is as follows: .PP .nf .if t .ft C |000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel| |010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si | |020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb| |030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us | |040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' | |050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / | |060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 | |070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? | |100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G | |110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O | |120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W | |130 X |131 Y |132 Z |133 [ |134 \e |135 ] |136 ^ |137 _ | |140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g | |150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o | |160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w | |170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del| |00 nul|01 soh|02 stx|03 etx|04 eot|05 enq|06 ack|07 bel| |08 bs |09 ht |0A nl |0B vt |0C np |0D cr |0E so |0F si | |10 dle|11 dc1|12 dc2|13 dc3|14 dc4|15 nak|16 syn|17 etb| |18 can|19 em |1A sub|1B esc|1C fs |1D gs |1E rs |1F us | |20 sp |21 ! |22 " |23 # |24 $ |25 % |26 & |27 ' | |28 ( |29 ) |2A * |2B + |2C , |2D - |2E . |2F / | |30 0 |31 1 |32 2 |33 3 |34 4 |35 5 |36 6 |37 7 | |38 8 |39 9 |3A : |3B ; |3C < |3D = |3E > |3F ? | |40 @ |41 A |42 B |43 C |44 D |45 E |46 F |47 G | |48 H |49 I |4A J |4B K |4C L |4D M |4E N |4F O | |50 P |51 Q |52 R |53 S |54 T |55 U |56 V |57 W | |58 X |59 Y |5A Z |5B [ |5C \e |5D ] |5E ^ |5F _ | |60 ` |61 a |62 b |63 c |64 d |65 e |66 f |67 g | |68 h |69 i |6A j |6B k |6C l |6D m |6E n |6F o | |70 p |71 q |72 r |73 s |74 t |75 u |76 v |77 w | |78 x |79 y |7A z |7B { |7C | |7D } |7E ~ |7F del| .if t .ft P .nf .bp These are what your terminal shows for the top 96 codes: .PP .nf .if t .ft C |240 |241 |242 |243 |244 |245 |246 |247 | |250 |251 |252 |253 |254 |255 |256 |257 | |260 |261 |262 |263 |264 |265 |266 |267 | |270 |271 |272 |273 |274 |275 |276 |277 | |300 |301 |302 |303 |304 |305 |306 |307 | |310 |311 |312 |313 |314 |315 |316 |317 | |320 |321 |322 |323 |324 |325 |326 |327 | |330 |331 |332 |333 |334 |335 |336 |337 | |340 |341 |342 |343 |344 |345 |346 |347 | |350 |351 |352 |353 |354 |355 |356 |357 | |360 |361 |362 |363 |364 |365 |366 |367 | |370 |371 |372 |373 |374 |375 |376 |377 | |A0 |A1 |A2 |A3 |A4 |A5 |A6 |A7 | |A8 |A9 |AA |AB |AC |AD |AE |AF | |B0 |B1 |B2 |B3 |B4 |B5 |B6 |B7 | |B8 |B9 |BA |BB |BC |BD |BE |BF | |C0 |C1 |C2 |C3 |C4 |C5 |C6 |C7 | |C8 |C9 |CA |CB |CC |CD |CE |CF | |D0 |D1 |D2 |D3 |D4 |D5 |D6 |D7 | |D8 |D9 |DA |DB |DC |DD |DE |DF | |E0 |E1 |E2 |E3 |E4 |E5 |E6 |E7 | |E8 |E9 |EA |EB |EC |ED |EE |EF | |F0 |F1 |F2 |F3 |F4 |F5 |F6 |F7 | |F8 |F9 |FA |FB |FC |FD |FE |FF | .if t .ft P .nf .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)environ.7 6.1 (Berkeley) 5/20/85 .\" .TH ENVIRON 7 "May 20, 1985" .UC 5 .SH NAME environ \- user environment .SH SYNOPSIS .B "extern char *const *environ;" .SH DESCRIPTION An array of strings called the `environment' is made available by .BR execve (2) when a process begins. By convention these strings have the form .RI ` name = value '. The following names are used by various commands: .TP "\w'TERMCAP 'u" .B PATH The sequence of directory prefixes that .BR sh , .BR time , .BR nice (1), etc., apply in searching for a file known by an incomplete path name. The prefixes are separated by `:'. Login shells set .BR PATH=:/bin:/usr/bin . Note that the empty space between the `=' and the `:' indicates the current directory. Security aware people move the extra `:' to the end of their path or omit it. .TP .B HOME A user's login directory, set by .BR login (1) from the password file .BR passwd (5). .TP .B TERM The kind of terminal for which output is to be prepared. This information is used by programs that wish to exploit special terminal capabilities, a screen oriented text editor for instance. The terminal type is set by .BR login (1) from the tty database .BR ttytab (5). .TP .B SHELL The file name of the users login shell, set by .BR login (1) from the password file .BR passwd (5). .TP .B TERMCAP The string describing the terminal in TERM, or the name of the termcap file, see .BR termcap (5), .BR termcap (3). .TP .B EXINIT A startup list of commands read by .BR elvis (1). .TP .B USER The login name of the user, set by .BR login (1) from the password file .BR passwd (5). .TP .B LOGNAME Set to the same value as .BR USER . BSD derived systems have .BR USER , System V has .BR LOGNAME , so modern systems have both to avoid problems. .TP .PP Further names may be placed in the environment by the .B export command and .RI ` name = value ' arguments in .BR sh (1). Arguments may also be placed in their environment by programs if they use .BR putenv (3). Or in the environment of another program by building a new environment for one of the exec functions that accepts an environment list, like .BR execle (2) or .BR execve (2). It is unwise to conflict with certain .BR sh (1) variables that are frequently set and/or exported by `.profile' files: .BR MAIL , .BR PS1 , .BR PS2 , .BR IFS . .SH SEE ALSO .BR elvis (1), .BR login (1), .BR sh (1), .BR execl (3), .BR execve (2), .BR system (3), .BR termcap (3), .BR termcap (5), .BR passwd (5), .BR ttytab (5). .TH HIER 7 .SH NAME hier \- file system hierarchy .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. A tour through the Minix directory hierarchy. .nf .SP / root .SP /bin/ Utility programs, cf /usr/bin/ (1) cat Show files, \fBcat\fP(1) sh Shell, \fBsh\fP(1) mount Mount file systems, \fBmount\fP(8) ... .SP /boot Boot Monitor, \fBmonitor\fP(8) .SP /dev/ devices (4) console Main console, \fBtty\fP(4) tty* Terminals, \fBtty\fP(4) hd* Hard disk, \fBhd\fP(4) fd* Floppy disk, \fBfd\fP(4) ... .SP /etc/ System configuration and data files, cf /usr/etc/ (1,5,8) ethers Ethernet addresses database, \fBethers\fP(5) fstab File system table, \fBfstab\fP(5) group Groups database, \fBgroup\fP(5) hostname.file Name of the local system, \fBusage\fP(5) hosts TCP/IP hosts database, \fBhosts\fP(5) hosts.equiv Network equivalent hosts, \fBhosts.equiv\fP(5) inet.conf Inet server config file, \fBinet\fP(8) keymap Keymap for custom keyboard, \fBloadkeys\fP(8) motd Message of the day, \fBlogin\fP(1) mtab Mounted file system table, \fBfstab\fP(5) passwd User database, \fBpasswd\fP(5) profile System wide shell profile, \fBsh\fP(1) rc System startup script, \fBboot\fP(8) resolv.conf TCP/IP domain name system, \fBresolv.conf\fP(5) services TCP/IP names to services, \fBservices\fP(5) serv.access Internet service access control, \fBserv.access\fP(5) shadow Shadow password database, \fBpasswd\fP(5) termcap Terminal type descriptions, \fBtermcap\fP(5) ttytab Terminals device table, \fBttytab\fP(5) utmp User login database, \fBlogin\fP(1) ... .SP /minix Minix kernel image, \fBmonitor\fP(8) .SP /tmp/ Small, short-lived temporary files, cf /usr/tmp/ .SP /usr/ Home directories and more system files .SP adm/ System administration files (1,5,8) lastlog Last logins, \fBlogin\fP(1) log Default log file old Last weeks log files wtmp User logins and logouts, \fBlogin\fP(1) *.cache Cached data of some programs ... .SP ast/ Honorary home directory of Andrew S. Tanenbaum Also new user initial files .SP \fIuser\fP/ Home directory of \fIuser\fP .ashrc Ash (shell) startup, \fBash\fP(1) .ellepro.b1 Elle (editor) startup (compiled), \fBelle\fP(1) .ellepro.e Elle (editor) startup (text), \fBelle\fP(1) .exrc Ex/vi (editor) startup, \fBex\fP(1) .profile Custom user shell profile, \fBsh\fP(1) .rhosts Remote user permission file, \fBrhosts\fP(5) ... .SP bin/ User programs cc C compiler, \fBcc\fP(1) cp Copy files, \fBcp\fP(1) ls List files, \fBls\fP(1) man Show manual pages, \fBman\fP(1) ... .SP etc/ More system data files, cf /etc (8) rc Continued system startup, \fBboot\fP(8) daily Daily system cleanup ... .SP include/ C-compiler include files minix/ Minix kernel include files ... ... .SP lib/ Compiler libraries and other support stuff cawf/ Text formatter support files, \fBcawf\fP(1) crontab Cron jobs, \fBcron\fP(8) dict/ Word lists words American English word list, \fBlook\fP(1) ... libc.a C library (Minix-8086 only), \fBcc\fP(1) \fIarch\fP Per architecture compiler binaries and libaries, \fBcc\fP(1) ... .SP local/ Local software, cf /usr/ bin/ Local utilities etc/ Local data files rc Local system startup ... man/ Local manual pages src/ Local sources ... .SP man/ Manual pages, \fBman\fP(1) cat*/ Preformatted manual pages man0/ Section 0, Book style user commands man1/ User commands man2/ System calls man3/ Library routines man4/ Device files man5/ File formats man6/ Games man7/ Miscellaneous man8/ System utilities whatis Table of manual pages, \fBwhatis\fP(5) ... .SP mdec/ boot Bootstrap code, \fBinstallboot\fP(8) ... .SP preserve/ Saved elvis editor buffers, \fBelvprsv\fP(8), \fBelvrec\fP(1) .SP spool/ Mail and command spooling at/ At jobs, \fBat\fP(1) past/ Completed at jobs mail/ Mail drops, \fBmail\fP(1) \fIuser\fP Mailbox of \fIuser\fP ... ... .SP src/ System and command sources (home of bin) LICENSE Minix license to use commands/ Utility sources crclist CRC checksums of the source tree, \fBsrccrc\fP(8) lib/ Library sources fs/ File system inet/ TCP/IP task kernel/ Kernel mm/ Memory manager boot/ Boot Monitor tools/ Kernel image making tools, \fBtools\fP(8) .SP tmp/ Large temporary files .fi .SH "SEE ALSO" .BR ls (1), .BR man (1), .BR find (1), .BR grep (1), .BR checkhier (8). .SH NOTES Not all of the directories and files shown are present. They must be created as needed. .SH BUGS Many of the listed manual references do not yet exist. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" man(7) manpage by rosenkra@hall.cray.com (Bill Rosenkranz) .\" Modified a bit for Minix by Kees J. Bot (kjb@cs.vu.nl) .\" .TH MAN 7 .SH NAME man - nroff macro package for manual pages .SH SYNOPSIS .B nroff \-man .IR file " ..." .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. These macros are used to lay out reference pages for manuals. .PP Any text argument .I t may be zero to six words. Quotes may be used to include blanks in a 'word'. .I Text can be empty, but unlike normal \s-2UNIX\s+2 macros, the next line is not used. .PP A prevailing indent distance is remembered between successive indented paragraphs, and is reset to default value upon reaching a non-indented paragraph (i.e. at .SH or .SS). .SH FILES .TP 25n /usr/lib/tmac/tmac.an For standard Minix nroff. .TP /usr/lib/cawf/man.mac For cawf. .SH SEE ALSO .BR nroff (1), .BR man (1). .SH "REQUEST SUMMARY" .nf .ta +15n +9n Request Cause Explanation Break? \&.B t no Text t is bold. Quote to imbed blanks. \&.I t no Text t is italic. Quote to imbed blanks. \&.IP x yes Set prevailing indent to 5. Begin indented paragraph with hanging tag given by first argument. Tag x is always placed on a separate line. \&.LP yes Same as .PP. \&.PP yes Begin paragraph. Set prevailing indent to 5. \&.RE yes End of relative indent. Set prevailing indent to amount of starting .RS. \&.RS yes Start relative indent, move left margin in distance 5. \&.SH t yes Subhead. Quote to imbed blanks. \&.SS t yes Subsection. Quote to imbed blanks. No indent for t. \&.TH n s c v d yes Begin page named n of chapter s; c is the chapter name; d is the date of the most recent change; v is version number. Sets prevailing indent and tabs to 5. .fi .SH EXAMPLE The following illustrates some of the requests available with this macro package: .RS .nf \&.\e" this is a comment \&.TH DEMO 1 \&.SH NAME demo \e- show how to use \e-man package \&.SH SYNOPSIS \&.B demo \&.RI [ options ] \&.IR file " ..." \&.SH DESCRIPTION This is a test for showing how to use the \&.BR nroff (1) man package. It shows how to use .TH, .SH, .PP, .B, .I, and .IP commands. \&.PP This will be a new paragraph. You can also use normal \&.BR nroff (1) commands in the text. \&.SS Nroff Commands \&.IP '\ee"' This is the comment command. \e" You won't see this. \&.IP nf No fill mode (the normal mode is fill mode where things get justified right and left). \&.IP fi Re-enter fill mode. \&.IP br Break line here no matter what. \&.IP sp Vertical space (also causes a break to occur). \&.sp Note that to continue an indent and make a new paragraph (as is the case here), just put in a space (.sp). \&.PP Now we should be at a new paragraph. .fi .RE .PP Executing .B nroff \-man demo.man results in the following output: (Ignoring page headers and footers) .PP .RS .B NAME .RS demo \e- show how to use \e-man package .RE .SP .B SYNOPSIS .RS .B demo .RI [ options ] .IR file " ..." .RE .SP .B DESCRIPTION .RS This is a test for showing how to use the .BR nroff (1) man package. It shows how to use .TH, .SH, .PP, .B, .I, and .IP commands. .SP This will be a new paragraph. You can also use normal .BR nroff (1) commands in the text. .RE .SP .ti +2n .B Nroff Commands .RS .RS .ta +5n .SP .ti -5n \&'\e"' This is the comment command. .SP .ti -5n nf No fill mode (the normal mode is fill mode where things get justified right and left). .SP .ti -5n fi Re-enter fill mode. .SP .ti -5n br Break line here no matter what. .SP .ti -5n sp Vertical space (also causes a break to occur). .sp Note that to continue an indent and make a new paragraph (as is the case here), just put in a space (.sp). .RE .SP Now we should be at a new paragraph. .RE .RE .SH CONVENTIONS A typical manual page for a command or function is laid out as follows: .nf .TH TITLE [1-8] The name of the command or function in upper-case, which serves as the title of the manual page. This is followed by the number of the section in which it appears. .SH NAME name - one-line summary The name, or list of names, by which the command is called, followed by a dash and then a one-line summary of the action performed. All in roman font, this sec- tion contains no troff(1) commands or escapes, and no macro requests. It is used to generate the whatis(1) database. .SH SYNOPSIS Commands: The syntax of the command and its arguments as typed on the command line. When in boldface, a word must be typed exactly as printed. When in italics, a word can be replaced with text that you supply. Syntactic symbols appear in roman face: [ ] An argument, when surrounded by brackets is optional. | Arguments separated by a vertical bar are exclusive. You can supply only item from such a list. ... Arguments followed by an elipsis can be repeated. When an elipsis follows a brack- eted set, the expression within the brackets can be repeated. Functions: If required, the data declaration, or #include directive, is shown first, followed by the func- tion declaration. Otherwise, the function declara- tion is shown. .SH DESCRIPTION A narrative description of the command or function in detail, including how it interacts with files or data, and how it handles the standard input, standard output and standard error. Filenames, and references to commands or functions described elswhere in the manual, are italicised. The names of options, variables and other literal terms are in boldface. .SH OPTIONS The list of options along with a description of how each affects the commands operation. .SH ENVIRONMENT Environment variables used. .SH FILES A list of files associated with the command or func- tion. .SH "SEE ALSO" A comma-separated list of related manual pages, followed by references to other published materials. This section contains no troff(1) escapes or commands, and no macro requests. .SH DIAGNOSTICS A list of diagnostic messages and an explanation of each. .SH NOTES Any additional notes such as installation-dependent functionality. .SH BUGS A description of limitations, known defects, and possi- ble problems associated with the command or function. .SH AUTHOR The program's author and any pertinent release info. .SH VERSION The program's current version number and release date. .fi .SH BUGS Even though .BR cawf (1) has a better chance at formatting a random manual page then the standard Minix nroff, it has two annoying bugs in its macro set. Both .PP and .IP reset the indentation level to the level set by .SH. This means that you can't use them in a piece of text indented by .RS. For .IP this is troublesome, you can see why in the unformatted source of this text. .PP can simply be replaced by .sp, or better yet, by .SP with the following macro defined somewhere in your text: .PP .RS .nf \&.de SP \&.if t .sp 0.4 \&.if n .sp \&.. .fi .RE .PP This will make .SP use 4/10 of a line if formatted by troff, just like .PP. $2...3MAKEDEV.84add_route.85adduser.86backup.87badblocks.88boot.89checkhier.8:chown.8;cron.8<elvprsv.8=fdisk.8>fingerd.8?ftpd.8@getty.8Ahalt.8Bifconfig.8Cinet.8Dinit.8Econfig.8Finstallboot.8Girdpd.8Hmkdist.8Imknod.8Jmonitor.8Kdosminix.8Lnonamed.8Mpart.8Npartition.8Opr_routes.8Pprintroot.8Qpwdauth.8Rrarpd.8Sreadclock.8Treboot.8Urepartition.8Vrlogind.8Wrshd.8Xscreendump.8Yserial-ip.8Zshutdown.8[slip.8\srccrc.8]sync.8^update.8_usage.8`intr.8acleantmp.8bdhcpd.8.TH MAKEDEV 8 .SH NAME MAKEDEV, DESCRIBE \- make/describe device files .SH SYNOPSIS .B MAKEDEV .RB [ \-n ] .IR key " ..." .br .B DESCRIBE .RI [ device "] ..." .SH DESCRIPTION .B MAKEDEV may be used to create the device files normally found in the .B /dev directory. The .I key arguments are simply the names of the devices you want. .B MAKEDEV knows about all supported devices and will create them in the current directory with the proper owner and mode. For many devices .B MAKEDEV will not only create the device you want, but also the devices related to it that you will probably want too. Naming one floppy device will create all floppy devices for the same drive for instance. .PP Call .B MAKEDEV without arguments to see a list of keys that it understands. Then use the .B \-n flag to make the script echo the commands it will execute the next time when you call it without that flag. .PP The special key .B std must be given alone to .BR MAKEDEV . This key will create all standard devices. .PP The command .B DESCRIBE will give you a one-line description of a given device. It will by default list all devices in .BR /dev . .SH "SEE ALSO" .BR dev (4), .BR mknod (8). .SH BUGS .BR MAKEDEV "'s" eagerness to create devices may cause many "File exists" errors from .BR mknod . .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH ADD_ROUTE 8 .SH NAME add_route \- configure IP routing. .SH SYNOPSIS .B add_route .RB \-g .RI gateway .RB [ \-d .RI destination .RB [ \-n .RI netmask " ]]" .RB [ \-i .RI "ip device]" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Add_route is used for manual entry of routes in the IP routing table. .SH OPTIONS .TP .B \-g .I gateway specifies the gateway IP address to use. .TP .B \-d .I destination specifies the destination(s) reached via this gateway. .TP .B \-n .I netmask specifies a netmask when the destination is a net. .TP .B \-i .I "ip device" specifies the ip device. .SH "SEE ALSO" .BR irdp (8), .BR pr_routes (8). .SH AUTHOR .I Add_route.c was created August 7, 1991 by Philip Homburg. This manual page by A. S. Woodhull, last revised 13.02.96. .TH ADDUSER 8 .SH NAME adduser \- add a new user to the system .SH SYNOPSIS \fBadduser \fIuser group home-dir\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "adduser ast other /usr/ast" "How user ast could be added" .EX "adduser bin operator /usr/src" "How user bin could be added" .SH DESCRIPTION .PP .I Adduser adds a new user to the system by making new entries in .B /etc/passwd and .B /etc/shadow for the new user, creating a new home directory, and copying the contents of the template home directory .B /usr/ast into it. The user-id of this new user will be the first free number not less than 10. The password is initially empty, the full name must be set, and the shell is the Bourne Shell, .B /bin/sh . Use .I passwd , .I chfn , and .I chsh to change. .SH "SEE ALSO" .BR login (1), .BR passwd (1), .BR passwd (5). .TH BACKUP 8 .SH NAME backup \- backup files .SH SYNOPSIS \fBbackup\fR [\fB\-djmnorstvz\fR] \fIdir1 dir2\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-d" "At top level, only directories are backed up" .FL "\-j" "Do not copy junk: \fI *.Z, *.bak, a.out, core\fR, etc" .FL "\-m" "If device full, prompt for new diskette" .FL "\-n" "Do not backup top-level directories" .FL "\-o" "Do not copy \fI*.o\fR files" .FL "\-r" "Restore files" .FL "\-s" "Do not copy \fI*.s\fR files" .FL "\-t" "Preserve creation times" .FL "\-v" "Verbose; list files being backed up" .FL "\-z" "Compress the files on the backup medium" .SH EXAMPLES .EX "backup \-mz . /f0" "Backup current directory compressed" .EX "backup /bin /usr/bin" "Backup bin from RAM disk to hard disk" .SH DESCRIPTION .PP \fIBackup\fR (recursively) backs up the contents of a given directory and its subdirectories to another part of the file system. It has two typical uses. First, some portion of the file system can be backed up onto 1 or more diskettes. When a diskette fills up, the user is prompted for a new one. The backups are in the form of mountable file systems. Second, a directory on RAM disk can be backed up onto hard disk. If the target directory is empty, the entire source directory is copied there, optionally compressed to save space. If the target directory is an old backup, only those files in the target directory that are older than similar names in the source directory are replaced. \fIBackup\fR uses times for this purpose, like \fImake\fR. Calling \fIBackup\fR as \fIRestore\fR is equivalent to using the -r option; this replaces newer files in the target directory with older files from the source directory, uncompressing them if necessary. The target directory contents are thus returned to some previous state. .SH "SEE ALSO" .BR tar (1). .TH BADBLOCKS 8 .SH NAME badblocks \- put a list of bad blocks in a file .SH SYNOPSIS \fBbadblocks \fIblock_special\fR [\fIblock\fR] ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "badblocks /dev/hd1 " "Handle bad blocks on \fI/dev/hd1\fP" .EX "badblocks /dev/hd3 310 570 1680 " "Three bad blocks on \fI/dev/hd3\fP" .SH DESCRIPTION .PP If a device contains bad sectors, it is important to not have them allocated to important files. This program makes it possible to collect up to 7 bad blocks into a dummy file, so they will not be allocated for a \&'real\&' file. When the program starts up, it asks for a list of bad blocks, unless they are provided as arguments. Then it creates a file whose name is of the form \fI.Bad_xxxxx\fR, where \fIxxxxx\fR is a pid. .SH "SEE ALSO" .BR readall (1). .\" .\" $PchId: badblocks.8,v 1.2 1998/07/27 19:47:04 philip Exp $ .TH BOOT 8 .SH NAME boot \- from power on to the login prompt .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. At power on the machine reads the first sector of the boot device into memory and executes it. This bootstrap code loads .BR /boot , the Minix Boot Monitor. The monitor loads the kernel binaries from .BR /minix , or the newest file in .B /minix if it is a directory. .PP The Minix system is now running, the different tasks initialize themselves and control is transferred to the last one, .BR init . .PP .B Init is the grandparent of all Minix processes, it is responsible for starting login processes on each terminal, but first it runs .BR /etc/rc . .PP .B /etc/rc checks the state of the system and starts daemons. First it sets the keyboard translation to the mapping in .B /etc/keymap if present, followed by a call to .BR readclock (8) to set Minix time from the hardware clock. Next the file systems are checked if necessary and the .B /usr file system is mounted. .PP The system is now ready for multiuser startup, .B /etc/rc calls .B /usr/etc/rc that cleans out /tmp, /usr/tmp, and resets or cycles log files by running .BR /usr/etc/daily , starts the .BR update (8) and .BR cron (8) daemons, and initializes the network services. .B /etc/rc finally runs .BR /usr/local/etc to initialize the system in a site or host dependent way. .PP .B Init reads .B /etc/ttytab and starts a .BR getty (8) for each enabled terminal line to allow a user to log in. .SH OPTIONS .TP .B bootopts=\-s The value of the boot variable .B bootopts is passed to .BR /etc/rc . If it contains .B \-s then the system will run a single user shell before continuing with multiuser startup. (Note that one normally uses .B boot \-s instead of setting .BR bootopts .) .TP .B bootopts=\-a This flag tells that .B /etc/fstab must be ignored. The system asks for a device to use as /usr instead. This will also be done if the root device is not as mentioned in .BR /etc/fstab . .TP .B bootopts=\-f Force a file system check, even if the system was shut down properly. (Do this once in a while to be sure about the state of the file systems.) .TP .BI servers= program\fR[,\fIprogram\fR...] Names the special servers that must be started in /usr/etc/rc. The setting .BR "servers=inet" will start the TCP/IP server. .SH "BOOT ENVIRONMENT" Many features of the drivers inside the kernel are controlled by settings in the boot environmenti, like .B bootopts above does for .BR /etc/rc . The values of these variables are usually colon or comma separated numbers configuring the driver. .B "DPETH0 = 300:10" tells the DP ethernet driver to use I/O address 0x300, interrupt request 10, and the default memory address (0xD0000, values may be omitted) for the first ethernet board. (Note that IRQ 2 is redirected to IRQ 9 on AT's and PS/2's, so use 9 if a device is jumpered for 2.) .PP Variables that are special to both the monitor and the kernel are described in .BR monitor (8). This section lists extra variables or variable settings: .TP \fBc\fIn\fR = \fBat\fR | \fBbios\fR | \fBesdi\fR | \fBxt\fR | \fBaha1540\fR | \fBdosfile\fR | \fBfatfile\fR Choose the driver that is to be used as controller .IR n , in order: IBM/AT (classic AT or newer IDE), BIOS (any disk), ESDI (some PS/2s), IBM/XT, Adaptec 154x, Minix under DOS "file as disk", FAT file system "file as disk". By default .B at is used on AT bus systems, .B bios on PS/2s and XTs, and .B dosfile when running under DOS. Most drivers are present in the kernel as distributed, but may be taken out by modifying .BR /usr/include/minix/config.h . See .BR controller (4). (An XT should always use the BIOS driver, not the XT driver, because BIOS calls are cheap on an XT. The XT driver can be used on AT machines with an old XT controller.) .TP \fBDPETH\fIn\fR = \fBon\fR | \fBoff\fR Turn an ethernet board on or off. The driver is by default in "sink" mode for all boards. The sink mode allows one to use the driver without an ethernet board installed. The driver will play /dev/null for that device, i.e. nothing comes in, and anything send out is dropped on the floor. If the board is turned on then the driver will use it to send out packets, if it is turned off then the driver will fail for that board. .PP .if n .ta \w'DPETHn = I/O-addr:irq:mem_addr:mem_size'u+2m .if t .ta \w'\fBDPETH\fIn\fR = \fII/O-addr\fR:\fIirq\fR:\fImem_addr\fR:\fImem_size\fR'u+2m \fBDPETH\fIn\fR = \fII/O-addr\fR:\fIirq\fR:\fImem_addr\fR:\fImem_size\fR (WD80x3) .br \fBDPETH\fIn\fR = \fII/O-addr\fR:\fIirq\fR:\fB0\fR (NE2000) .br \fBDPETH\fIn\fR = \fII/O-addr\fR:\fIirq\fR:\fIflags\fR (3c503) .RS Set the I/O address (hex), IRQ (decimal), memory address (hex), memory size (hex), or flags (hex) of the .IR n -th ethernet board and turn it on. By default they are configured as 280:3:D0000 and 300:5:C8000 with the memory size set to 2000, 4000, or 8000 depending on the type of board found. For the Western Digital cards the IRQ must be what the board expects, but the memory address is programmed into the board by the driver. The SMC EtherEZ board, a WD8013 successor, has only 8K memory. This confuses the driver, so you need to explicitly specify the board size as being 2000. The memory address and size have no meaning for the Novell ethernet boards, but the address may be explicitly set to zero to indicate that the board .B is a Novell ethernet board. For the 3Com 3c503 the third parameter are flags, with the low bit indicates that the on-board tranceiver must be used if 0 (thin ethernet), or that an external tranceiver is used on the AUI port if set to 1. The IRQ is software settable, and must be specified as 2 (XT), 3, 4, 5, or 9 (AT). The memory address is set on the board by jumpers. The driver does not support I/O mode for the 3c503. (Note the little differences between board types. For the 8003/8013 and NE1000/NE2000 the IRQ is fixed and the memory address variable, for the 3c503 the IRQ is variable and the memory address is fixed, but need not be specified. Messy.) .RE .TP \fBDPETH\fIn\fB_EA\fR = \fIe0\fR:\fIe1\fR:\fIe2\fR:\fIe3\fR:\fIe4\fR:\fIe5\fR Set the ethernet address of the .IR n -th ethernet board. The address is normally obtained from the ethernet board, so only in exceptional circumstances is this setting ever needed. (Use the address of the main server if you want a career change.) .TP \fBAHA0\fR = \fII/O-addr\fR:\fIbus-on\fR:\fIbus-off\fR:\fItr-speed\fR Configure the Adaptec 154xA SCSI host adapter to use the given I/O address (hex), Bus-on time (decimal), Bus-off time (decimal) and transfer speed (hex). The default is 330:15:1:00. The default transfer speed is always 5.0 Mb/s (code 00) ignoring the jumper settings. .TP \fBaha1540-d\fIn\fR = \fIsleep-time\fR:\fItarget\fR,\fIlun\fR Program SCSI disk .I n to have the given target and logical unit number. The target and lun of a tape or other SCSI device may be changed by setting the .BI aha1540-d n variable that would be used had it been a disk. So tape device c0t7 can be set to target 4, lun 1 with aha1540-d7=:4,1. (The .I sleep-time parameter is present but ignored to be compatible with Minix-vmd.) .TP \fBdosfile-d\fIn\fR = \fIfile\fR Tells the DOS virtual disk driver for disk .I n to use a given file as a disk. The file is a DOS file name that the boot monitor must be able to open. .TP \fBfatfile-d\fIn\fR = \fIdriver:minor:file\fR Tells the FAT virtual disk driver for disk .I n to use a given file as a disk. The .I driver parameter is the name of driver that handles the disk, and .I minor is the device number of the partition where the file is found. See .BR controller (4) for names and numbers. The .I file argument is the path to the file from the root directory down. The driver named must also be tied to a controller with a .BI c n variable, so that the FAT file driver can find it. .TP .BR TZ " = " GMT0 This sets the time zone the hardware clock is running in. .B Readclock uses this to correctly obtain the time of the clock. The timezone of the system is set in .BR /etc/profile . This boot variable is normally not set, only a few UNIX die-hards who don't care about the time Windows sees and don't want t$$$$$$$$o change the clock twice a year for daylight savings use this option. (Set Windows time to the time zone of Casablanca to match.) .SH "TCP/IP CONFIGURATION" To use TCP/IP you need to run the .B inet server, and unless you are running standalone you have to enable the ethernet driver. See the .B servers and .BI DPETH n boot variables above. The driver supports these ethernet cards: Western Digital 8003, Western Digital 8013, SMC Elite Ultra 16, Novell NE1000 and NE2000, 3Com Etherlink II (3c503). Many newer variants of the WD8013, now under the SMC brand, may also work. .PP You are likely to use TCP/IP in one of three situations: .PP .RS Standalone with no connection to a network. .SP In a small network with no support from a "big" host. .SP Connected to a large network with address and name servers. .RE .PP In each situation you need a different set of configuration files. .SS Standalone All you need is a name and an IP address. Suppose the name is "flotsam" and the IP address is 192.168.0.1 from the private IP space, then this is put in .BR /etc/hosts : .PP .RS .ta +\w'192.168.0.1'u+3n 192.168.0.1 flotsam .RE .PP And this in .BR /etc/dhcpd.conf : .PP .RS .nf host 192.168.0.0/24 {}; interface ip0 flotsam; .fi .RE .SS "Small Network" In a network where the Minix machine can't obtain its IP address and name from a different host you need specify the ethernet address of your machine and host names of all machines in the hosts and DHCP configuration files. Suppose your machine is to be named "flotsam", and another machine in the network is named "jetsam", and let's use network 192.168.0.0/24 again. The file .B /etc/hosts now looks like this: .PP .RS .ta +\w'192.168.0.1'u+3n .nf 192.168.0.1 flotsam 192.168.0.2 jetsam .fi .RE .PP And .B /etc/dhcp.conf like this: .PP .RS .nf host 192.168.0.0/24 {}; client 0:1:1b:a:68:ce flotsam; .fi .RE .PP Use .B hostaddr \-e to find out what the ethernet address of your network card is. (The address above is an example.) .PP A host needs to have all hostnames used on your little network in its host file. In the DHCP configuration you only need the client entry of the system itself, but it may be useful to add all client entries to make them all the same. .PP If one of the machines is always on when any of the others is, then you can let it be a DHCP server. The other machines don't need a hosts or DHCP file anymore. If flotsam is the server then its .BR /etc/dhcp.conf looks like this: .PP .RS .nf .ta +4m host 192.168.0.0/24 { DNSserver flotsam; }; client 0:1:1b:a:68:ce flotsam { option server; }; client 0:0:c0:3a:12:10 jetsam; .fi .RE .SS "Large Network" In a network with a central network administration your machine's IP address and name are given by the DHCP server. You don't need any configuration files. If you want your machine to do more, like being a router or something, then see .BR inet (8) on setting up more networks. .PP .SS "Simpler configuration tools" The .BR dhcpd and .BR nonamed daemons are complex little programs that try to obtain information about their surroundings automatically to tell the machine what its place in the network is. It should come as no surprise that there are simpler utilities to configure a machine. On a memory starved machine it may even be wise to configure a machine statically to get rid of the daemons. The first daemon, .BR dhcpd , can be replaced by: .PP .RS .B ifconfig \-h .I host-IP-address .B \-n .I netmask .br .B add_route \-g .I gateway-IP-address .RE .PP to set the IP address and netmask of the machine. Note that you can only do this if the machine has a static IP address, or chaos will follow. Remove .BR /usr/adm/dhcp.cache if the DHCP daemon has run before. .PP The name daemon, .BR nonamed , can be replaced by an entry in .B /etc/resolv.conf that specifies an external name daemon: .PP .RS .B nameserver .I nameserver-IP-address .RE .PP The .B ifconfig and .B add_route calls can be placed in the file .BR /etc/rc.net . Check .B /usr/etc/rc to see how .BR /etc/rc.net can be used to override running the normal series of network deamons. Note that .BR /etc/rc.net is sourced, so you can use the same variables and functions that .BR /usr/etc/rc uses. These changes undo all the efforts to make Minix TCP/IP autoconfigurable. Make very sure that all the IP addresses are correct, and that the IP address of your machine is unique. (Mistakenly using the address of a main server will make all other machines look at your machine, and will make all the users of all other machines look at you.) .SH FILES .TP 20n /boot Minix Boot Monitor. .TP /minix Kernel image, or directory containing them. .TP /etc/rc Basic system initialization. .TP /usr/etc/rc Complete system initialization. .TP /etc/rc.net Specialized network initialization. .TP /usr/local/etc/rc Per site initialization. .TP /etc/hosts Name to IP address mapping. .TP /etc/dhcp.conf Network initialization. .TP /etc/resolv.conf Name resolver configuration. .SH "SEE ALSO" .BR monitor (8), .BR init (8), .BR inet (8), .BR loadkeys (8), .BR readclock (8), .BR fsck (1), .BR fstab (5), .BR update (8), .BR cron (8), .BR ttytab (5), .BR getty (8), .BR hostaddr (1), .BR ifconfig (8), .BR dhcpd (8), .BR nonamed (8), .BR tcpd (8), .BR hosts (5), .BR ethers (5), .BR resolv.conf (5), .BR inet (8). .SH DIAGNOSTICS .TP 5n Checking File Systems. If the system has crashed then .B fsck is called for the root and /usr file systems. It is wise to reboot if the root file system must be fixed. .TP Finish the name of device to mount as /usr: /dev/ The prompt for the .B \-a option, or if the name of the /usr file system has not been set in /etc/fstab. You can type a device name, say .BR fd0 . .TP Unable to obtain an IP address after 10 seconds. TCP/IP misconfiguration. The DHCP daemon may have failed because the ethernet address of the machine is not known to the DHCP server, the DHCP configuration is not filled in properly, or the DHCP server can not be reached. Either talk to your Network Administrator, or make a dhcp.conf and a hosts file. .TP 1.2.3.4 login: If you see an IP address instead of a host name then the system failed to translate the IP address. Either talk to your Network Administrator to have the reverse address translation tables fixed, or make a hosts file. .SH NOTES The 10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16 networks can be used for private networks. (This so-called CIDR notation names an IP address and the number of bits in the network number. So 172.16.0.0/12 includes all addresses from 172.16.0.0 to 172.31.255.255.) RFC-1597 will tell you why private networks are good, and RFC-1627 why they are bad. .SH BUGS Indefinite hangs are possible if I/O addresses or IRQ's are wrong. A driver may babble about addresses and IRQ's, but that does not mean that what it says is true, it may just be configured that way. It is very difficult to find peripherals on a PC automatically, and Minix doesn't even try. .SH AUTHOR Kees J. Bot .TH CHECKHIER 8 .SH NAME checkhier \- check the directory hierarchy .SH SYNOPSIS .B checkhier .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Checkhier checks a number of files and directories that make up the top level file system hierarchy. The output of the command is a script that could be applied to fix things like bad mode, wrong owner or group, etc. .PP The script should never be executed without checking. I might be better to examine the differences oneself and to fix any problems by hand. .PP .B Checkhier must be run by the superuser. .SH "SEE ALSO" .BR chmod (1), .BR chown (8), .BR hier (7). .SH DIAGNOSTICS The exit code is 0 if all checks out right, otherwise a script is output and the exit code is 1. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CHOWN 8 .SH NAME chown \- change owner .SH SYNOPSIS \fBchown [\fB\-R\fR] \fIowner\fR[:\fIgroup\fR] \fIfile\fR ...\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-R" "Change directory hierarchies" .SH EXAMPLES .EX "chown ast file1 file2" "Make \fIast\fR the owner of the files" .EX "chown \-R ast:other dir" "Change the owner and group of all files in dir" .SH DESCRIPTION .PP The owner field (and optionally group field) of the named files is changed to .I owner (i.e., login name specified) and .I group . Alternatively, a decimal uid(gid) may be specified instead of a user name. Only the superuser may execute this command. .SH "SEE ALSO" .BR chgrp (1), .BR chmod (1), .BR ls (1), .BR chown (2). .TH CRON 8 .SH NAME cron \- clock daemon .SH SYNOPSIS .B cron .RB [ \-d\c .RI [ level ]] .SH DESCRIPTION The .B cron daemon executes tasks that must be repeated every now and then (cron jobs), and tasks that must be run just once (at jobs). It is normally used to run daily or weekly system maintenance scripts. What it needs to run and when is specified in a number of "cron tables", or crontab files for short. These tables are: .PP .RS .nf .ft B /usr/lib/crontab /usr/local/lib/crontab /var/lib/crontab /var/opt/\fIname\fP/lib/crontab\ \ \fR(Minix-vmd only)\fB /usr/spool/crontabs/\fIuser\fP .ft R .fi .RE .PP These files follow the usual pattern: One for the standard things, one for local tasks per organization, one for tasks per system, and one crontab per installed package. (Cron reads .B /usr/lib/packages to find names of installed packages, it doesn't just grab everything in .BR /var/opt .) The last set of files fall outside the normal pattern, they are per user crontabs that one can create with the .BR crontab (1) command. The file names in .B /usr/spool/crontabs/ are login names of the file owners. .PP The format of a crontab file is described in .BR crontab (5). .SS "AT jobs" .B Cron also takes care of the execution of jobs issued by .BR at (1) that are found in .BR /usr/spool/at/ . Cron simply runs the AT job as if there were an "sh at-job" as a cron job at the appropriate time under the user-id of the owner of the script. The script takes care of the rest. See .BR at (1) for the details. .SS "Job I/O" Standard input, output and error are the same as cron's if the job is started by the system crontabs or from package crontabs. This means that output from system jobs usually ends up on the console and in the log file. Output from personal cron jobs or at jobs are mailed to the owner of the job. No mail is sent if the job is silent. .SH OPTIONS .TP 5 [\fB\-d\fR[\fIlevel\fR]] Set the debug level, by default 1. Makes .B cron print info on what it happens to be doing. Level 1 just tells about sleep times and what job is executed, level 2 also shows the internal crontab data on a table load. (With time fields translated to match those of .BR "struct tm" , see .BR ctime (3).) .SS SIGNALS .B Cron takes the following actions when sent one of the following signals: .TP 12 .B SIGHUP Reload the crontab tables if they changed since the last time they were loaded, and reexamine the AT job spool. Used by .BR at (1) and .BR crontab (1). .TP .B SIGUSR1 Increase the debug level by 1. .TP .B SIGUSR2 Turn debugging off. .SH ENVIRONMENT .B Cron sets the environment variables .BR USER , .BR LOGNAME , .BR HOME , and .BR SHELL to the user's login name (2x), home directory, and shell if a job is executed for a given user. The working directory is set to the user's home directory. Everything else is inherited from .BR cron , exactly as .B cron got it when it started. Note that commands are always passed to .BR /bin/sh , not to the user's shell. .PP System cron jobs are in principle executed with .BR cron 's environment, use .B "\-u root" or the crontab file .B /usr/spool/crontabs/root if you want to give root the same treatment as ordinary users. .SH FILES .TP 25n .B /usr/lib/crontab Main Minix crontab file. .TP .B /usr/local/lib/crontab Local jobs for all systems in an organization. .TP .B /var/lib/crontab System specific jobs. .TP .B /var/opt/\fIname\fP/lib/crontab Per package jobs for Minix-vmd. .TP .B /usr/lib/packages List of installed packages. .TP .B /usr/spool/crontabs/\fIuser\fP Per user jobs. .TP .B /usr/spool/at/* Jobs issued by .BR at (1). .TP .B /usr/run/cron.pid Process id of cron when cron is running. Used by .BR at (1) and .BR crontab (1) to send cron a hangup signal. .SH "SEE ALSO" .BR at (1), .BR crontab (1). .SH NOTES A job is not reissued until a previous instance of it has exited. The next time to execute is computed from the previous time it ran. If job issuing lags behind on the system time then the next time to run it is computed from the current system time. .SH BUGS .B Cron doesn't like it if the system time is changed. If set forward then cron will react when it next wakes up by running all jobs within the skipped time once or twice before it catches up. Setting the clock backwards makes cron play dead until the system time passes the old time. (Changing the system time is bad idea anyway, and not just because of cron.) .PP Jobs that fall in the missing hour in a change to Daylight Saving Time are skipped. Nothing is done in the extra hour on the change out of DST. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" .\" $PchId: cron.8,v 1.3 2000/07/17 18:49:18 philip Exp $ .TH ELVPRSV 8 .SH NAME elvprsv - Preserve the the modified version of a file after a crash. .SH SYNOPSIS .nf \fB\fBelvprsv\fP ["-\fIwhy elvis died\fP"] /tmp/\fIfilename\fP... \fB\fBelvprsv\fP -R /tmp/\fIfilename\fP... .fi .SH DESCRIPTION .PP \fIelvprsv\fP preserves your edited text after \fIelvis\fP dies. The text can be recovered later, via the \fIelvprsv\fP program. .PP For UNIX-like systems, you should never need to run this program from the command line. It is run automatically when \fIelvis\fP is about to die, and it should be run (via /etc/rc) when the computer is booted. THAT'S ALL! .PP For non-UNIX systems such as MS-DOS, you can either use \fIelvprsv\fP the same way as under UNIX systems (by running it from your AUTOEXEC.BAT file), or you can run it separately with the "-R" flag to recover the files in one step. .PP If you're editing a file when \fIelvis\fP dies (due to a bug, system crash, power failure, etc.) then \fIelvprsv\fP will preserve the most recent version of your text. The preserved text is stored in a special directory; it does NOT overwrite your text file automatically. .PP \fIelvprsv\fP will send mail to any user whose work it preserves, if your operating system normally supports mail. .SH FILES .IP /tmp/elv* The temporary file that \fIelvis\fP was using when it died. .IP /usr/preserve/p* The text that is preserved by \fIelvprsv\fP. .IP /usr/preserve/Index A text file which lists the names of all preserved files, and the names of the /usr/preserve/p* files which contain their preserved text. .SH BUGS .PP Due to the permissions on the /usr/preserve directory, on UNIX systems \fIelvprsv\fP must be run as superuser. This is accomplished by making the \fIelvprsv\fP executable be owned by "root" and turning on its "set user id" bit. .PP If you're editing a nameless buffer when \fIelvis\fP dies, then \fIelvprsv\fP will pretend that the file was named "foo". .SH AUTHOR .nf Steve Kirkendall kirkenda@cs.pdx.edu .fi .TH FDISK 8 .SH NAME fdisk \- partition a hard disk [IBM] .SH SYNOPSIS \fBfdisk\fR [\fB\-h\fIm\fR]\fR [\fB\-s\fIn\fR]\fR [\fIfile\fR]\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\fB\-h" "Number of disk heads is \fIm\fR" .FL "\fB\-s" "Number of sectors per track is \fIn\fR" .SH EXAMPLES .EX "fdisk /dev/hd0" "Examine disk partitions" .EX "fdisk \-h9 /dev/hd0" "Examine disk with 9 heads" .SH DESCRIPTION .PP When \fIfdisk\fR starts up, it reads in the partition table and displays it. It then presents a menu to allow the user to modify partitions, store the partition table on a file, or load it from a file. Partitions can be marked as \s-2MINIX\s+2, DOS or other, as well as active or not. Using \fIfdisk\fR is self-explanatory. However, be aware that repartitioning a disk will cause information on it to be lost. Rebooting the system \fIimmediately\fR is mandatory after changing partition sizes and parameters. \s-2MINIX\s+2, \&\s-2XENIX\s0, \s-2PC-IX\s0, and \s-2MS-DOS\s0 all have different partition numbering schemes. Thus when using multiple systems on the same disk, be careful. .PP Note that \s-2MINIX\s+2, unlike \&MS-DOS , cannot access the last sector in a partition with an odd number of sectors. The reason that odd partition sizes do not cause a problem with \s-2MS-DOS\s0 is that \s-2MS-DOS\s0 allocates disk space in units of 512-byte sectors, whereas \s-2MINIX\s+2 uses 1K blocks. \fIFdisk\fR has a variety of other features that can be seen by typing \fIh\fR. .PP .I Fdisk normally knows the geometry of the device by asking the driver. You can use the \fB\-h\fP and \fB\-s\fP options to override the numbers found. .SH "SEE ALSO" .BR part (8). .\" Copyright (c) 1980 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)fingerd.8c 6.1 (Berkeley) 5/23/86 .\" .TH FINGERD 8 "May 23, 1986" .UC 6 .SH NAME fingerd, in.fingerd \- remote user information server .SH SYNOPSIS .B "finger stream tcp nowait nobody /usr/sbin/in.fingerd in.fingerd" .br .B "tcpd finger /usr/sbin/in.fingerd in.fingerd" .SH DESCRIPTION .B Fingerd is a simple protocol based on RFC742 that provides an interface to the Name and Finger programs at several network sites. The program is supposed to return a friendly, human-oriented status report on either the system at the moment or a particular person in depth. There is no required format and the protocol consists mostly of specifying a single ``command line''. .PP .B Fingerd listens for TCP requests at port 79. Once connected it reads a single command line terminated by a which is passed to .BR finger (1). .B Fingerd closes its connections as soon as the output is finished. .PP If the line is null (i.e. just a is sent) then .B finger returns a ``default'' report that lists all people logged into the system at that moment. .PP If a user name is specified (e.g. eric) then the response lists more extended information for only that particular user, whether logged in or not. Allowable ``names'' in the command line include both ``login names'' and ``user names''. If a name is ambiguous, all possible derivations are returned. .SH SEE ALSO .BR finger (1). .SH BUGS Connecting directly to the server from a TIP or an equally narrow-minded TELNET-protocol user program can result in meaningless attempts at option negotiation being sent to the server, which will foul up the command line interpretation. .B Fingerd should be taught to filter out IAC's and perhaps even respond negatively (IAC WON'T) to all option commands received. .\" Copyright (c) 1985 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)ftpd.8c 6.4 (Berkeley) 5/28/86 .\" .TH FTPD 8 .SH NAME ftpd, in.ftpd, setup.anonftp \- DARPA Internet File Transfer Protocol server .SH SYNOPSIS .B "ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd" .br .B "tcpd ftp /usr/sbin/in.ftpd" .SH DESCRIPTION .B Ftpd is the DARPA Internet File Transfer Prototocol server process. The server uses the TCP protocol and listens at the port specified in the ``ftp'' service specification; see .BR services (5). .PP The ftp server currently supports the following ftp requests; case is not distinguished. .PP .nf .ta \w'Request 'u \fBRequest Description\fP ABOR abort previous command ACCT specify account (ignored) ALLO allocate storage (vacuously) APPE append to a file CDUP change to parent of current working directory CWD change working directory DELE delete a file HELP give help information LIST give list files in a directory (``ls -lA'') MKD make a directory MODE specify data transfer \fImode\fP NLST give name list of files in directory (``ls'') NOOP do nothing PASS specify password PASV prepare for server-to-server transfer PORT specify data connection port PWD print the current working directory QUIT terminate session RETR retrieve a file RMD remove a directory RNFR specify rename-from file name RNTO specify rename-to file name STOR store a file STOU store a file with a unique name STRU specify data transfer \fIstructure\fP TYPE specify data transfer \fItype\fP USER specify user name XCUP change to parent of current working directory XCWD change working directory XMKD make a directory XPWD print the current working directory XRMD remove a directory .fi .PP The remaining ftp requests specified in Internet RFC 959 are recognized, but not implemented. .PP The ftp server will abort an active file transfer only when the ABOR command is preceded by a Telnet "Interrupt Process" (IP) signal and a Telnet "Synch" signal in the command Telnet stream, as described in Internet RFC 959. .PP .B Ftpd interprets file names according to the ``globbing'' conventions used by .BR csh (1). This allows users to utilize the metacharacters ``*?[]{}~''. .PP .B Ftpd authenticates users according to three rules. .IP 1) The user name must be in the password data base, .BR /etc/passwd , and not have a null password. In this case a password must be provided by the client before any file operations may be performed. .IP 2) The user name must not appear in the file .BR /etc/ftpusers . .IP 3) If the user name is ``anonymous'' or ``ftp'', an anonymous ftp account must be present in the password file (user ``ftp''). In this case the user is allowed to log in by specifying any password (by convention this is given as the client host's name). .PP In the last case, .B ftpd takes special measures to restrict the client's access privileges. The server performs a .BR chroot (2) command to the home directory of the ``ftp'' user. In order that system security is not breached, it is recommended that the ``ftp'' subtree be constructed with care; the following rules are recommended. .IP ~ftp) Make the home directory owned by ``ftp'' and unwritable by anyone. .IP ~ftp/bin) Make this directory owned by the super-user and unwritable by anyone. The program .BR ls (1) must be present to support the list commands. This program should have mode 111. .IP ~ftp/etc) Make this directory owned by the super-user and unwritable by anyone. The files .BR passwd (5) and .BR group (5) must be present for the .B ls command to work properly. These files should be mode 444. .IP ~ftp/pub) Make this directory mode 755 and owned by the super-user. Create directories in it owned by users if those users want to manage an anonymous ftp directory. .IP ~ftp/pub/incoming) Optionally create this directory for anonymous uploads. Make it mode 777. The FTP daemon will create files with mode 266, so remote users can write a file, but only local users can do something with it. .PP The script .B setup.anonftp can be used to create or check an anonymous FTP tree. .SH "SEE ALSO" .BR ftp (1). .SH BUGS The anonymous account is inherently dangerous and should avoided when possible. .ig \" Minix doesn't have privileged port numbers (yet?) .PP The server must run as the super-user to create sockets with privileged port numbers. It maintains an effective user id of the logged in user, reverting to the super-user only when binding addresses to sockets. The possible security holes have been extensively scrutinized, but are possibly incomplete. .. .TH GETTY 8 .SH NAME getty \- system login banner .SH SYNOPSIS .B getty .RI [ banner " ...]" .SH DESCRIPTION .B Getty displays a system identification banner, reads a user name from standard input and executes .B login with that name as argument. .PP .B Getty uses its arguments separated by spaces as a login banner. The character sequences .BR \en , .BR \es and .BR \et are printed as newline, space and tab. Any other .BI \e x prints that .IR x . The character sequences .BR %s , .BR %n , etc. produce the same output as .BR "uname \-s" , .BR "uname \-n" , etc. The default banner is .PP .RS %s\es\esRelease\es%r\esVersion\es%v\en\en%n\eslogin:\es .RE .PP The only other useful functionality offered by .B getty is that it can be suspended by signal SIGUSR1 and restarted by SIGUSR2. This allows a program such as .BR modem (1) to temporarily claim a dialin line for dialout. .SH "SEE ALSO" .BR modem (1), .BR ttytab (5), .BR init (8). .SH BUGS .B Getty should be taught about modems and modem lines. The signal trick is an awful hack. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH HALT 8 .SH NAME halt \- abruptly stop the system .SH SYNOPSIS \fBhalt\fP [\fB\-f\fP] .SH DESCRIPTION .B Halt stops the system almost immediately. The users are not informed about the things to come. .B Halt is logged in .B /usr/adm/wtmp and in .BR /usr/adm/log , if these files exist. .B Halt should only be run by the super-user, any other caller will be refused. .PP .B Halt is a rather rude program. .BR Shutdown (8) is preferred for it performs a more gentle halt routine. .PP .B Halt \-f is even worse, it omits the terminate signals that are normally sent first to all processes to give them a chance to die peacefully. .SH "SEE ALSO" .BR reboot (2), .BR shutdown (8), .BR reboot (8), .BR boot (8). .SH AUTHOR Edvard Tuinder (v892231@si.hhs.NL) .TH IFCONFIG 8 .SH NAME ifconfig \- configure a TCP/IP device .SH SYNOPSIS .B ifconfig .RB [ \-I .IR ip-device ] .RB [ \-h .IR ipaddr ] .RB [ \-n .IR netmask ] .RB [ \-m .IR mtu ] .RB [ \-iva ] .SH DESCRIPTION .B Ifconfig initializes a TCP/IP device setting the IP address and/or netmask. It will report the address and netmask set. This command may be used if the system has not been configured properly yet. It is only used at boot time to set a fixed address for a system without a physical ethernet. Normally the .B inet task will find it out by itself from the RARP server. .SH OPTIONS .TP .B \-h The decimal TCP/IP address to set. .TP .B \-n The netmask to set. .TP .B \-m The mtu to set. (Minix-vmd only.) .TP .B \-i Don't set the IP address or netmask if already set. This way ifconfig cannot interfere if the numbers have been found out by RARP. .TP .B \-v Report IP address and netmask. This is the default action if there are no other options. .TP .B \-a Report the IP addresses and netmasks of all configured interfaces. .SH "SEE ALSO" .BR hostaddr (1), .BR rarpd (8), .BR inet (8), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH INET 8 .SH NAME inet \- TCP/IP server .SH SYNOPSIS .B inet .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Inet is the TCP/IP server. It is a device driver that interfaces between the file server and the low level ethernet device driver. The interface to this server is described in .BR ip (4). .PP .B Inet starts as a normal process, reads a the configuration file .B /etc/inet.conf to see what it should do, and uses a few special low level system calls to turn itself into a server. The format of the configuration file is as follows: .SS Configuration The inet configuration file is fairly simple, here is an example: .PP .RS .ft C .nf eth0 DP8390 0 { default; }; psip1; .fi .ft P .RS .PP It tells that network 0 (the one containing devices .BR eth0 , .BR ip0 , .BR tcp0 and .BR udp0 ) uses the ethernet device driver handled by task "DP8390" at port 0. This network is marked as the default network, so most programs use it through the unnumbered devices like .B /dev/tcp or .BR /dev/udp . Network 1 is a Pseudo IP network that can be used for a serial IP over a modem for instance. .PP The configuration file may look like a common configuration file as described by .BR configfile (5), but it is currently just a simple subset allowing only what you see here. The following network definitions are possible: .PP .BI eth N .I task port .RI { options }; .RS This sets up an ethernet with device name .BI /dev/eth N\fR, built on the given ethernet device driver at the given port at that driver. (If a network driver manages two network cards then they are at port 0 and 1.) .br .RE .PP .BI eth N .B vlan .I id .BI eth M .RI { options }; \0\0\0\0(Minix-vmd only) .RS The ethernet .BI eth N uses VLAN number .I id and is built on ethernet .BI eth M\fR. A packet given to this network has a VLAN tag prefixed to it and is then handed over to another ethernet for transmission. Likewise a packet on that ethernet carrying the appropriate VLAN tag has this tag removed and is sent on to this network. The VLAN ethernet behaves like an ordinary ethernet as far as applications are concerned. .RE .PP .BI psip N .RI { options }; .RS Creates pseudo IP network .BI /dev/psip N\fR, usable for IP over serial lines, tunnels and whatnot. .RE .SH OPTIONS Some options can be given between braces. Minix only understands one of these options, "default". Minix-vmd does them all, of course. .PP .BR default ; .RS Mark this network as the default network. Exactly one of the networks must be so marked. When .B inet is started it will check and create all the necessary network devices before becoming a server. To know what major device number to use it checks .BR /dev/ip , so that device must already exist. It can be created by .B MAKEDEV if need be. .RE .PP .BR "no ip" ; .br .BR "no tcp" ; .br .BR "no udp" ; .RS These options turn the IP, TCP, or UDP layer off. Inet will not enable the devices for these layers, and will deactivate code for these layers. Disabling IP will also disable TCP or UDP, because they need IP to function. An ethernet without an IP layer can be used as for stealth listening. An IP network without TCP or UDP can be used to pester students into creating the missing functionality. Keeps them off the streets, and maybe they'll learn something. .RE .SH "SEE ALSO" .BR ip (4), .BR boot (8). .SH NOTES The number of networks that can be defined are 2 (Minix-86), 4 (Minix-386) or 16 (Minix-vmd). This limits both the total number and the highest device number you can use. .SH NOTES Getting a network administrator to give you a trunk or multi-VLAN port to run multiple networks on can be a challenge. It questions their idea that VLANs are separate networks, while in reality it is just one big ethernet. .SH ACKNOWLEDGMENTS Cindy Crawford, for providing invaluable help debugging this server. .SH AUTHOR .ta \w'Manual:'u+2n Code: Philip Homburg .br Manual: Kees J. Bot .\" .\" $PchId: inet.8,v 1.5 2001/04/20 06:19:56 philip Exp $ .TH INIT 8 .SH NAME init \- grandparent of all processes .SH DESCRIPTION The first program started by Minix is .BR init . The actions performed by .B init can be summarized by this pseudo shell program: .RS .nf .if t .ft C # Open 0, 1, 2. exec /dev/log 2>&1 # Run the system initialization script. sh /etc/rc $bootopts >/etc/utmp echo reboot >>/usr/adm/wtmp while :; do # Wait for a process to exit, but don't always block. wait # Record logout. (Not in this dumb way, of course.) if "pid is in my tables" $pid then echo "logout $pid" >/etc/utmp echo "logout $pid" >>/usr/adm/wtmp fi # Start a new session. while read line type getty init do if idle $line then $init ... <$tty >$tty $getty <$tty >$tty 2>&1 & pid=$! "add pid to tables" $pid echo "login $line $pid" >/etc/utmp echo "login $line $pid" >>/usr/adm/wtmp fi done < /dev/ttytab done .if t .ft R .fi .RE The first action of .B init is to run .B /etc/rc to initialize the system as described in .BR boot (8). .B Init then enters its main loop where it waits for processes to exit, and starts processes on each enabled terminal line. The file .B /etc/ttytab contains a list of terminal devices, their terminal types, the program to execute on them to allow one to login (usually .BR getty (8)), and the program to execute first to initialize the line (usually .BR stty (1)). These fields may be left out to indicate that a line is disabled or that initialization is not necessary. The commands are searched using the path .BR /sbin:/bin:/usr/sbin:/usr/bin . .PP .B Init accepts several signals that must be sent to process id 1. (It is the first process, so natually its process id is 1.) The signals are: .TP .B SIGHUP When receiving a hangup signal, .B init will forget about errors and rescan .B ttytab for processes to execute. .B Init normally rescans .B ttytab each time it feels the need to respawn a process, so the hangup signal is only needed if a line has been shut down, or after a terminate signal. Note that after turning a line off you will have to kill the process running on that line manually, .B init doesn't do that for you. .TP .B SIGTERM Normally sent by programs that halt or reboot Minix. Causes .B init to stop spawning new processes. .TP .B SIGABRT Sent by the keyboard driver when the .B CTRL-ALT-DEL key combination is typed. Causes .B init to run the .B shutdown command. A second abort signal makes .B init halt the system directly with a system call. The keyboard driver halts the system, without a sync, after the third CTRL-ALT-DEL. .SS "Minix vs. Minix-vmd" There are a few differences between standard Minix and Minix-vmd on how .B init is run. The .B /etc/rc file is executed under standard Minix with input connected to .BR /dev/console , but under Minix-vmd this is still .BR /dev/null . This means that under Minix-vmd processes must be reconnected to .B /dev/console with the .BR intr (8) program if they need user interaction. Minix-vmd passes the value of the .B bootopts boot variable to /etc/rc. Standard Minix does not. .SH FILES .TP 25n .B /etc/ttytab List of terminals devices. .TP .B /etc/utmp List of currently logged in users. .TP .B /usr/adm/wtmp Login/logout history. .SH "SEE ALSO" .BR ttytab (5), .BR utmp (5), .BR getty (8), .BR stty (1), .BR boot (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CONFIG 8 .SH NAME config \- configuring Minix tasks and servers .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. Minix has a number of configuration files containing parameters that can be changed to enable or disable a device driver, to change the number of times a resource can be used, or to tune the performance of the system. We will name the file that contains the parameter, the name of the parameter, and the values it can be set to. Some comments are prefixed by "8086" for Minix running in 16-bit real mode, "286" for 16-bit protected mode, and "386" for 32-bit protected mode. Configuration file names can be .RI < file.h > for a file in .BR /usr/include/ , or a simple file name for a file in .BR /usr/src/ . .PP There may be several definitions for a parameter with only one that is active. Which one this is is easy to find if you know that .B "(\s-2CPU\s+2\ ==\ \s-2INTEL\s+2)" is true, and .SB _WORD_SIZE equals .B 2 in 16-bit mode, and .B 4 in 32-bit mode. .PP .ti 2m .RB < minix/config.h > .br This is the main configuration file for the Minix. It contains lots of boolean variables to enable or disable drivers and a number of parameters that specify the sizes of system data structures: .TP .SB NR_PROCS The number of slots in the process table, and thus the maximum number of processes that can be run concurrently. Should be increased from the default .B 32 if networking is enabled (add .B 8 for deamons), and if more users are using the system (add .B 4 for each active session). There are a lot of loops in the kernel scanning the process table, so setting .SB NR_PROCS too high will slow things down a little bit, so don't overdo it. .TP .SB NR_BUFS The number of disk buffers in the file system server. It is used to keep frequently used disk blocks in memory. .BR 8086 " & " 286 : The default is .BR 40 , and that's about as high as it can be set. .BR 386 : The default is .BR 80 , which is best increased to .B 1024 if you can spare the memory. More will help, but the effect won't be as pronounced as .B 1024 is more than enough to contain the working set of one active user. .TP .SB NR_CTRLRS Number of tasks used for disk or tape controllers. By default 2, maximum 4. You need a controller task for each device class to be handled through a .BI /dev/c n "*" set of devices. .TP .SB ENABLE_CACHE2 If set to 1 allows the RAM disk to be used as a second level file system cache. Any block that is evicted from the normal cache is both written to disk (if dirty), and copied to the second level cache. If it is needed again then the block is reloaded from the RAM disk if it is still there. .BR 8086 : Forget it, you don't have any memory for it. .BR 286 : Turn it on and set the boot environment variable .B ramsize to .B 512 if you have the memory. That's enough to contain the working set of one active user, and is also the maximum FS can handle. .BR 386 : The installation scripts sets .B ramsize to .B 1024 if there is enough memory. Your first point of call is to compile a new kernel with .SB ENABLE_CACHE2 off, .SB NR_BUFS set to a large value, and .B ramsize set back to zero. A normal block cache works much better than a two level arrangement. .TP .SB ENABLE_AT_WINI Enables the AT or IDE disk driver. (The IDE interface grew out of the old AT disk interface.) Any run of the mill PC needs this driver. You need to assign a driver like this one to a controller task using one of the .BI c n boot variables. See .BR boot (8). .TP .SB ENABLE_BIOS_WINI Enables the BIOS disk driver. The BIOS driver uses the system BIOS to read or write disk blocks. .BR 8086 : The preferred disk driver for XT class machines. .BR 286 " & " 386 : Use a native driver if possible to avoid switching back to real mode to make BIOS calls. Especially on the 286 this is a painful affair. .TP .SB ENABLE_ESDI_WINI Enables the ESDI disk driver. Some PS/2 models have this disk. .TP .SB ENABLE_XT_WINI Enables the XT disk driver. Useful for early IBM/AT machines that have XT disks. In real mode it is best to use the BIOS driver. .TP .SB ENABLE_AHA1540_SCSI Enables the Adaptec 1540 series SCSI driver. .TP .SB ENABLE_DOSFILE Enable the "DOS file as disk" driver that is used when Minix is run from MS-DOS to access a large file as a disk. .TP .SB ENABLE_FATFILE Enable the "FAT file as disk" driver that interprets a FAT file system to find a large file to use as a disk. This driver combined with a fast native Minix disk driver is a better choice then the previous driver. (And it works when Minix is not started from MS-DOS.) This is the last driver that needs to be assigned to a controller task. .TP .SB ENABLE_SB16 Enable the Soundblaster-16 audio driver. .TP .SB ENABLE_PRINTER Enable the Printer driver. .TP .SB DMA_SECTORS The size of the DMA buffer for drivers that use DMA or other drivers that can only do I/O to a single chunk of memory. (BIOS, ESDI, XT, DOSFILE.) Choose a number between .B 1 and .B 128 for the sector size of this buffer. The memory cost is twice this amount, because of trouble getting it aligned in memory properly. A value of .B 16 is the minimum to work well, choose .B 64 if you have enough memory. .TP .SB NR_CONSOLES Number of virtual consoles. By default .BR 2 , so you can have two login sessions that can be switched to by ALT-F1, ALT-F2 or ALT-left/rightarrow. If you have an EGA screen then you can specify up to .B 4 virtual consoles, for VGA you can have .BR 8 . It is best to choose one less to leave some video memory to keep text scrolling fast. You really should read .BR console (4) on this. Note also the .B console boot variable, you can use it to put more characters on the screen, at the cost of video memory. .TP .SB ENABLE_DP8390 Master switch to enable the network drivers. They are required by the network server, .BR inet . See .BR boot (8) for information on configuring network support. .TP .SB ENABLE_WDETH Enable code for the WD8003 and WD8013 cards in the network driver. .TP .SB ENABLE_NE2000 Enable code for the NE1000 and NE2000 cards. .TP .SB ENABLE_3C503 Enable code for the 3Com Etherlink II (3C503). .TP .SB NR_PTYS Number of pseudo terminals supported, by default .BR 0 , which disables the driver. Pseudo terminals are used for incoming network logins by telnet or rlogin. One pty is needed per session. .TP .SB NR_RS_LINES Number of RS-232 lines supported. By default .B 2 for a normal kernel, but .B 0 for a tiny kernel used for XT installation. You can save a bit of memory by setting this parameter to zero if you don't need serial lines. .PP .ti 2m .BR fs/const.h .br This file contains most of the parameters used by the file system code. Most of these cannot be changed, with the exception of these four: .TP .SB NR_FILPS Maximum number of open file descriptors for all processes combined. A "File table overflow" error might indicate that this number must be increased. .TP .SB NR_INODES Maximum number of in-use files for all processes combined. Like above a "File table overflow" error may also indicate that this number should be increased. In cases like these one usually doubles both parameters. (If one table runs out then the other one is likely to run out also anyway.) .TP .SB NR_SUPERS Number of file systems that can be mounted. Again a "file table overflow" error is given if this table is full, but it will be produced by the .B mount command, so you know what's wrong in this case. .TP .SB NR_LOCKS Number of active file locks by .BR fcntl (2). These locks are often used by programs that update a shared file, like mail programs do with mail boxes. A "no locks available" error indicates that this table has run out. .PP .ti 2m .B kernel/bios_wini.c .ti 2m .B kernel/dosfile.c .ti 2m .B kernel/fatfile.c .br The number of disks each of these drivers can handle is specified by: .TP .B MAX_DRIVES This parameter is set to .B 4 for the BIOS and "DOS file" drivers, and to .B 2 for the "FAT file" driver. It can be set as high as you need to allow for more disks, or files as disks. (The "FAT" driver needs quite some memory per disk, which is why it by default only allows 2 disks.) You will need to run .BR MAKEDEV (8) to create t%%'%(%)%he extra disk devices in .BR /dev/ . .PP .ti 2m .B inet/inet_config.h .br The maximum number of TCP/IP networks is: .TP .B IP_PORT_MAX Sets the maximum number of networks that can be defined in .BR /etc/inet.conf . .BR 8086 , .BR 286 : By default 2. .BR 386 : By default 4. .PP .ti 2m .B inet/buf.c .br The number of 512 byte buffers allocated for data within the TCP/IP server is: .TP .B BUF512_NR These buffers are a shared resource used by the server for any data it wants to play with. For incoming data this number of buffers determines the time packets are kept around, with each new packet evicting an old packet. It's no big deal if packets get lost before a user process reads them, packets get lost all the time. The only real problem is outgoing TCP data. The default setting for .SB BUF512_NR allows up to four backlogged TCP streams, i.e. when data is output faster then it is read. If more buffers are needed then one of the TCP connections is shut down. When this happens you will see a "not enough buffers left" error. This could happen for instance if a Minix web server is assaulted by a browser that likes to open several connections to the server simultaneously. The fix is to increase .SB BUF512_NR to allow more slow outgoing TCP streams. .BR 86 : The default of .B 32 buffers can be increased up to .BR 64 . (The "TCP window size" has been limited in 16-bit mode to keep the buffer use by TCP down.) .BR 386 : The default of .B 128 can be increased to any value you like, but .B 512 seems to be more than enough. Minix-vmd uses 512 by default, and it seems happy that way. .SH "SEE ALSO" .BR controller (4), .BR usage (8), .BR boot (8), .BR MAKEDEV (8). .SH NOTES Associated with drivers there are device files to access the devices controlled by the drivers that may have to be created. Let's simplify this sentence: Type .BR "ls /dev" , note that there are only .B c0* and .B c1* devices, and only for two disks each. Some devices, like the audio devices, are not even present. So if you enable a driver, or increase some limits, you also need to use .BR MAKEDEV (8) in .B /dev to allow programs to talk to the drivers. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH INSTALLBOOT 8 .SH NAME installboot \- make a device bootable .SH SYNOPSIS .B installboot \-i(mage) .I image .RI [ label :] kernel .IR "mm fs" " ... " init .br .B installboot \-(e)x(tract) .I image .br .B installboot \-d(evice) .I device bootblock boot .RI [[ label :] image \&...] .br .B installboot \-b(oot) .I device bootblock boot .RI [ label :] image \&... .br .B installboot \-m(aster) .I device masterboot .RI [ keys " [" logical ]] .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Installboot may be used to make a device bootable by constructing a kernel image and installing bootstrap code into the boot block of a Minix file system. To understand how this can be done one first has to know what happens when a PC is booted. .PP When the power is turned on the typical PC will try to read the first sector from the first floppy disk or from the first hard disk into memory and execute it. The code obtained from the hard disk (from the so-called master boot sector) will immediately replace itself by the code found in the first sector of the active partition. Thus the PC is now executing the bootstrap code found in the first sector of /dev/fd0, /dev/c0d0p0, /dev/c0d0p1, /dev/c0d0p2, or /dev/c0d0p3 (assuming the boot disk is attached to controller 0.) The bootstrap will locate the operating system on the device it itself was loaded from, load it, and execute it. .PP To make a Minix file system .B /dev/fd0 mounted on .B /mnt bootable, enter the following: .SP .RS .ft B cp /usr/mdec/boot /mnt/boot .SP installboot \-i /mnt/minix kernel mm fs init .SP installboot \-d /dev/fd0 /usr/mdec/bootblock boot .ft P .RE .PP The "boot" program in the example is named the "Boot Monitor". It is loaded by the bootblock code placed in the boot sector of /dev/fd0 and it will take care of loading the kernel image "minix" from the root directory of the file system. See .BR monitor (8) for a description of the Boot Monitor. Note that .B boot is a name in the file system on .B /dev/fd0 in this example, the same file as .BR /mnt/boot . Making .B /mnt/minix is normally not necessary, there is usually a kernel image in the .B tools directory. .SH OPTIONS .B \-i(mage) .I image .RI [ label :] kernel .IR "mm fs" " ... " init .RS The .B \-image option (or the .B \-i shorthand) combines the executable files needed to run Minix in one file. Only the names and a few zero bytes are inserted into the image. The name is for identification and the zeros are used to pad separate pieces to sector boundaries for fast loading. .SP An executable may be prefixed by a label. The Monitor may be instructed to load processes by label. So more than one kernel process may be included in the image, each with a different winchester driver for instance. So if you have compiled two different kernels with an AT or XT driver then .SP .RS .BI "installboot \-i" " image AT:at_kernel XT:xt_kernel mm fs init" .RE .SP will make an image with two different labeled kernels and one unlabeled set of the other binaries. .RE .PP .B \-(e)x(tract) .I image .RS Extract the binaries from .I image under the names stored in the image. (The name includes the optional label.) .RE .PP .B \-d(evice) .I device bootblock boot .RI [[ label :] image \&...] .RS Installs .I bootblock in the boot sector of .I device together with the disk addresses to .IR boot . These disk addresses are needed to load .I boot from the file system at boot time. The argument .I boot is first searched in the file system on .IR device . If it is not found then it is read as a normal file and added at the end of the file system. The file system should be smaller than the device it is on to allow this. Any extra images are also added to the end as described under .BR \-boot . (Make sure you understand all this.) .SP The device need not be mounted when .B installboot is run, nor does it matter if it is. .SP .B Installboot needs to be run again if .I boot is rewritten, because it will then occupy a new place on the disk. .SP Old boot parameters are kept if there are no images added. .RE .PP .B \-b(oot) .I device bootblock boot .RI [ label :] image \&... .RS This option fills a blank floppy in .I device with boot code and kernel images. This "boot disk" does not have a root file system, only the Boot Monitor and Minix kernels. The boot parameters sector is filled with code that enables menu options for selecting an image. After loading an image, the Monitor will ask you to insert a root file system diskette before starting Minix. .SP The labels used on the images should match those on the executables used inside the image. You can put a comma separated list of labels on an image for each label used within the image. For the image created earlier one would create a boot floppy like this: .SP .RS .nf .BI "installboot \-b /dev/fd0 bootblock boot" " AT,XT:image" .fi .RE .SP If a label-list is omitted on an image, then that image will be selected by default. (Like in the normal one image, no labels case.) .SP Note that .B \-device and .B \-boot together allow you to make a boot floppy with or without a root file system. With the boot code in the file system, attached to the end of it, or after the boot block. And with one or more kernel images in the file system or at the end of the device. Somewhat confusing. .RE .PP .B \-m(aster) .I device masterboot .RI [ keys " [" logical ]] .RS This option installs the .I masterboot program into the boot sector of the given device. If another device is given instead of .I masterboot then its bootstrap code is copied to .IR device . The master bootstrap on a hard disk boots the active partition on that disk at boot time. The MS-DOS fdisk command normally puts a master bootstrap on the hard disk. Minix has two bootstraps that can be used as a master bootstrap, .B masterboot and .BR jumpboot. .SP .B Masterboot is a fairly normal master bootstrap that works as follows: .RS .SP If installed on a hard disk then it will load the bootstrap of the active partition and run it. .B Masterboot can be put in the first sector of a hard disk to boot the active partition, or in the first sector of a Minix partition to boot the active subpartition. .SP If installed on a Minix floppy then it will try to boot the next floppy or the first hard disk. Ideal for floppies with just data on it, they will no longer obstruct the boot process if left in the drive. Also a very useful trick to boot from floppy drive 1. .RE .SP The other bootstrap named .B jumpboot is used for the weird cases: .SP .RS If your default operating system is installed on another disk then .B jumpboot can be installed on the first disk and instructed to boot the disk, partition or subpartition that must be booted by default. .SP If one of your operating systems insists on being active when booted then use .B jumpboot to ignore the active flag and boot your preferred O.S. instead. The Boot Monitor's "\fBboot\ \(**\fP" trick to activate the partition to boot is useful here. .SP To boot a logical partition within an extended partition. Note that you can put .B jumpboot in the first sector of the extended partition in this case, with the extended partition marked active. .SP If you hold down the ALT key while .B jumpboot is being executed, then you can type the disk, partition or subpartition you want to boot as one to three digits followed by typing ENTER. .RE .SP .B Jumpboot can be programmed to boot a certain partition with the .I keys argument and optionally also the .I logical argument. .I Keys are one to three digits naming the disk, partition or subpartition. If the device to boot is .BR /dev/c0d1p3s0 , then .I keys is .BR 130 . These are the same three digits you can type manually if you hold down ALT at boot. To program .B jumpboot to boot a logical partition within an extended partition, let .I keys be just a disk number, and specify .I logical as the name of the logical partition on that disk that is to be booted. (Actually .I logical can be any device name, but this form should be avoided because it offers less checking to see if the device is still there after a disk rearrangement.) .SP A backup copy of the current master boo1%3%4%5%tstrap (including the partition table) can be made with: .RS .SP dd if=\fIdevice\fP of=\fIbackup-file\fP count=1 .SP .RE A simple 'cp \fIbackup-file\fP \fIdevice\fP' will put it back. You can also use .B fdisk /mbr under MS-DOS 5.0 (or newer) to restore the master bootstrap. .RE .RE .SH FILES .TP 25 .B /usr/mdec/bootblock Minix bootstrap for the Minix root device. To be placed in the boot sector. .TP .B /usr/mdec/boot Minix Boot Monitor. Can usually be found in the root directory of a bootable device. .TP .B /usr/mdec/masterboot Master bootstrap. Can be placed in the first sector of a disk to select the active partition. In a Minix primary partition it selects the active subpartition. .TP .B /usr/mdec/jumpboot Special "boot this" bootstrap. .SH "SEE ALSO" .BR part (8), .BR monitor (8). .SH DIAGNOSTICS .I File is not an executable .RS What you think is boot code or part of the kernel isn't. .RE .SP .I Program will crash, text/data segment larger then 64K .RS One of the 16-bit programs added to an image has a text or data segment that is larger than 64K. You probably enabled too many drivers, or configured too many buffers. .RE .SP .I File can't be attached to .I device .RS You are trying to put the boot monitor or an image after a file system, but there is no or not enough space. Did you specify the full path of the monitor instead of just "boot"? .RE .SP .I Device is not a Minix file system .RS You are using .B \-device on a device that doesn't contain a file system. Maybe you specified the wrong device, maybe you should make a file system, or maybe you should use .BR \-boot . .RE .SP .I Device contains a file system .RS You are about to destroy a file system with .BR \-boot . Maybe you meant to use .BR \-device ? You have 10 seconds to make up your mind... .RE .SP .I File is too big .RS Several types of messages like these will tell you that .I file can't be installed in a boot sector, or that there is no room to add some parameters, etc. Is .I file really a bootstrap? .RE .SS "Bootstrap errors" Read error .RS A read error trying to get the next bit of boot code. You may even get the BIOS error code in hex. Either the device has a bad block, or jumpboot is told to read a nonexistent disk. .RE .SP No active partition .RS None of the partitions in a partition table is marked active. .RE .SP Not bootable .RS Partition does not exist (jumpboot), or it's bootstrap isn't executable. .RE .SH NOTES The Minix bootstraps can boot beyond the 8G disk size limit if the BIOS supports the IBM/MS INT 13 Extensions. Alas only Minix-vmd can make use of this, standard Minix has a 4G disk size limit. .SH BUGS It has four more options than the SunOS installboot program it is modeled after. .PP The bootblock code has been crunched to such ugliness that you can use it to scare little kids out of your garden. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH IRDPD 8 .SH NAME irdpd \- internet router discovery protocol daemon .SH SYNOPSIS .B irdpd .RB [ \-bd ] .RB [ \-U .IR udp-device ] .RB [ \-I .IR ip-device ] .RB [ \-o .IR priority-offset ] .SH DESCRIPTION .B Irdpd looks for routers. This should be a simple task, but some routers are hard to find because they do not implement the router discovery protocol. This daemon collects information that routers do send out and makes it available. .PP At startup .B irdpd sends out several router solicitation broadcasts. A good router should respond to this with a router advertisement. .PP If a router advertisement arrives then no more solicitations are sent. The TCP/IP server has filled its routing table with the info from the advertisement, so it now has at least one router. If the advertisement is sent by a genuine router (the sender is in the table) then the .B irdpd daemon goes dormant for the time the advert is valid. Routers send new adverts periodically, keeping the daemon silent. .PP Otherwise .B irdpd will listen for RIP (Router Information Protocol) packets. These packets are sent between routers to exchange routing information. .B Irdpd uses this information to build a routing table. .PP Every now and then a router advertisement is sent to the local host to give it router information build from the RIP packets. .SH OPTIONS .TP .B \-b Broadcast advertisements instead of sending them to the local host only. This may be used to keep (non-Minix) hosts alive on a net without adverts. .TP .B \-d Debug mode, tell where info is coming from and where it is sent. Debugging can also be turned on at runtime by sending signal .B SIGUSR1 or turned off with .BR SIGUSR2 . .TP .BI \-o " priority-offset Offset used to make the gateway's preferences collected from RIP packets look worse than those found in genuine router adverts. By default .BR -1024 . .SH "SEE ALSO" .BR inet (8), .BR boot (8), .BR dhcpd (8), .BR inetd (8), .BR nonamed (8). .SH BUGS This daemon has gone out of favour thanks to .BR dhcpd , that also does router solicitations among other things. .PP Under standard Minix this daemon can't listen to both IRDP and RIP at the same time, so it starts out with IRDP. It switches over to RIP if it can't find a router, or if it threatens to lose its router. It does not switch back. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH MKDIST 8 .SH NAME mkdist \- make a Minix distribution .SH SYNOPSIS .B mkdist .SH DESCRIPTION .B Mkdist makes a Minix distribution on floppies. Run the command as .B root and follow the instructions. It will make one or two bootable installation floppies and a compressed tar file of .B /usr on several floppies using .BR vol (1). .PP The result can be installed on another system as described in .BR usage (8), except that all of .B /usr is saved on one set of floppies instead of being nicely split in binary and source packages. .SH "SEE ALSO" .BR tar (1), .BR compress (1), .BR vol (1), .BR usage (8). .SH NOTES Also very useful for making backups. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH MKNOD 8 .SH NAME mknod \- create a special file .SH SYNOPSIS \fBmknod \fIfile\fR [\fBb\fR] [\fBc\fR] \fImajor \fIminor\fR .br \fBmknod \fIfile\fR \fBp\fR\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "mknod /dev/plotter c 7 0" "Create special file for a plotter" .EX "mknod /dev/fd3 b 2 3" "Create a device for diskette drive 3" .EX "mknod /tmp/stream p" "Create a named pipe" .SH DESCRIPTION .PP .I Mknod creates a special file named .I file , with the indicated major and minor device numbers. The second argument specifies a block special, a character special, or a named pipe. Named pipes do not have device numbers so they are omitted. .SH "SEE ALSO" .BR mkfifo (1), .BR mknod (2). .TH MONITOR 8 .SH NAME monitor, edparams \- load and start Minix, modify boot parameters .SH SYNOPSIS .B /boot .br .B edparams .I device .RI [ command " ...]" .br .B boot.com .I virdisk .RI [ command " ...]" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. This text describes the Boot Monitor, a boot time interactive program designed not only to load and start Minix, its most important task, but to also provide an interface to configure Minix and to boot other operating systems. .PP The monitor is controlled with an environment that is modeled after the Bourne shell. This environment is filled at startup with default values that depend on the machine the monitor is running on and the environment settings saved into the boot parameters sector (the second sector on a device). When the environment is loaded, the monitor executes the function named .BR main , which by default starts a simple menu. .PP The environment can be manipulated at boot time from the monitor prompt, but may also be edited using .B edparams on a given device. .B Edparams simulates the monitor as much as it can, echoing commands it can't execute between brackets. It can also be used in Makefiles and scripts by giving it commands as arguments. .PP The DOS version of the monitor, usually named .B boot.com under DOS, boots Minix from a "DOS virtual disk". .B Boot.com is a simple COM program that interprets a DOS file as a disk, loads a Minix kernel from the active partition in the same way as the BIOS based monitor, and executes it to start Minix. All the monitor commands function in the same way, except for the .B boot command, it can only load Minix. The monitor grabs as much free memory as it can for Minix to work in, as the .B memory variable shows. Further details on how to run Minix under DOS, Windows 95, or even Windows NT are written down in .BR dosminix (8). .SH COMMANDS The monitor is best described by the commands you can type to the '>' prompt. This is known as the "monitor mode". You can enter this mode by hitting the Escape key. These are the monitor commands: .PP \fIname\fP = [\fBdevice\fP] \fIvalue\fP .SP .RS Set environment variable. .br Changes the value of .I name to .IR value . The optional word .B device marks .I name as being subject to device translation. (See the section on devices.) These (name, value) pairs are passed to the kernel who uses them to configure itself. These variables are passed by default: .SP .B rootdev .RS This is the device used as your root device. It is by default set to .BR ram, which means that the device specified by .B ramimagedev will be loaded into the RAM disk and used as root. If you change this variable then a physical device will be used as root, and the RAM disk will be uninitialized and have the size specified by .BR ramsize . .RE .SP .B ramimagedev .RS Describes the device to use to initialize the RAM disk if .B rootdev is set to .BR ram . It's by default set to .BR bootdev , a special name for the device the monitor booted from. .RE .SP .B ramsize .RS The size of the RAM disk. If the RAM disk is used for the root file system then the root file system is stretched out to .B ramsize if possible. .RE .SP .B processor .RS Set by default to .BR 86 , .BR 186 , .BR 286 , .BR 386 , .BR 486 ", ..." depending on the hardware you have. You can set it to a smaller value to test your kernel in a more limited environment. .RE .SP .B bus .RS The type of system bus, either .BR xt , .BR at or .BR mca . This answers basic questions like: "How many interrupt controllers and how to initialize?" Or: "Does the keyboard have LEDs?" .RE .SP .B memory .RS List of memory free for use by Minix. It is a comma separated list of .IR base:size pairs denoting the byte offsets and sizes of free memory in hexadecimal. .B "800:925E0,100000:F00000" is a typical example of about 585K starting at 2K, and 15M starting at 1M. (The first 2K are BIOS parameters and the 53K under the 640K boundary is the monitor itself.) The very last number you can play with if you know what you are doing. Either increase it if the monitor has it wrong, or decrease it to test if Minix still runs with less memory then normal. .RE .SP .B video .RS Describes capabilities of the VDU: .BR mda , .BR cga , .B ega or .BR vga . .RE .SP .B chrome .RS Either .B color or .BR mono . .RE .SP .B c0 .RS By default .B at (AT compatibles), .B bios (XT or PS/2), or .B dosfile (running under DOS). The .B c0 variable binds a driver to the first controller, i.e. the .B /dev/c0* devices. The monitor sets .B c0 to a suitable default, so that most machines can find their disk. .RE .SP .B console .RS If set to a hexadecimal value makes the monitor set the BIOS video mode to this value when the screen is cleared by .BR "echo \ec" , usually from the .B leader or .B trailer function. This allows the use of video modes with more rows or colums than the standard 80x25 mode. If you add 8000 to the mode number then the monitor will try to put the video card into 8x8 pixel font mode. This means that a 25 row mode will change to 50 rows. Try 8007 (mono) or 8003 (color). More parameters may follow the mode number that are of interest to the console driver, see .BR boot (8). .B Warning: Not all monitors can handle all of the modes, some may generate frequencies that can damage your monitor. Read the manual of card and monitor for details. The 8x8 font trick is perfectly safe however. .RE .SP .B dosfile-d0 .RS Set by the DOS version of the monitor to the name of the virtual disk, i.e. the .I virdisk argument as shown above. The "dosfile" driver will use this as the name of the file to use as a disk. .RE .SP Two variables are only used by the monitor, even though they are passed to the kernel too: .SP .B image .RS The name of the file containing the kernel image, by default .BR minix . If it refers to a directory however then the newest file inside the directory is chosen to be the kernel image. The names inside .B /minix/ are best set to the Minix version you are using, which looks good when the monitor prints its name. Rules for pretty printing image names: .RS .SP A '/' or '_' is changed to a space. .SP The first letter is changed from lowercase to uppercase. .SP An 'r' if followed by a digit changes to " revision ". .RE .RE .SP .B label .RS If set then only processes marked with this label or without a label are loaded from the image. .RE .SP .B Installboot \-boot will create functions to select images and labels. These functions will set .B label and .B image and echo what you selected. The two numbers separated by a colon used as an image name tell the starting sector and sector count of the image on disk. .RE .SP \fIname\fP() \fIcommand\fP .RS Define function. .br Functions may be used to bundle a set of commands, so that you can easily boot Minix with a different set of parameters then normal. E.g. .SP .RS ram() { rootdev=ram; boot } .RE .SP will allow you to run Minix with the root device on RAM for a change, if you normally use a real device as root. There are three predefined functions, .BR leader , with default value an .B echo command that shows the monitor's startup banner, .BR main , with default value .BR menu , and .BR trailer , with default value a command that clears the screen. The monitor executes .B leader;main at startup to show the banner message and a menu. The .B trailer function is executed just before Minix is started. These three functions can be redefined as you please. .RE .SP \fIname\fP(\fIkey\fP) \fIcommand\fP .RS Define kernel selecting function. .br The menu command uses functions like these to add menu entries to select a different kernel from a boot disk. .B Installboot \-boot produces these functions when the images are labeled. The label .B AT would give: .SP .RS AT(a) {label=AT;image=42:626;echo AT kernel selected;menu} .RE .SP With the menu option: .SP .RS a Select AT kernel .RE .SP Typing .B a will then execute the .B AT function above. .RE .SP \fIname\fP(\fIkey\fP,\fItext\fP) \fIcommand\fP .RS User defined menu option. .br This variant may be used to make any menu entry you like: .SP .RS dos(d,Boot MS-DOS) boot d0p0 .RE .SP .I TexB%D%E%F%G%H%I%J%K%t may be anything, even parentheses if they match. .RE .SP .I name .RS Call function. .br If .I name is a user defined function then its value is expanded and executed in place of .IR name . Try a recursive one like 'rec() {rec;xx}' one day. You can see the monitor run out of space with nice messages about using .BR chmem (1) to increase it's heap. .RE .SP \fBboot\fP [\fB\-\fP\fIopts\fP] .br \fBboot\fP \fIdevice\fP .RS Boot Minix or another O.S. .br Without an argument, .B boot will load and execute the Minix image named by the .B image variable. With options the variable .B bootopts is first set to .BI \- opts before Minix is started, and unset when Minix returns. With a .I device argument, .B boot loads the boot sector of .I device into memory and jumps to it, starting another operating system. You would normally use partitions on the first hard disk for this command (d0p[0\-3]), using d0 will also work (choosing the active partition). One can also boot devices on the second hard disk (d1, d1p[0\-3]) if the bootstrap writer did not hardwire the disk number to disk 0. .br Some Operating Systems can only be booted from the active partition, if you use a '*', e.g. .BR "boot *d0p2" , then partition 2 is first made active. You'll then need to use .SP .RS .BI "installboot \-m /dev/c0d0 /usr/mdec/jumpboot" " keys" .RE .SP with .I keys chosen so that Minix is booted at startup. (See .BR installboot (8).) .RE .SP \fBdelay\fP [\fImsec\fP] .RS Delay (500 msec default). .br Fast booting speed was one of the objectives when this program was created, so a hard disk boot usually takes only a fraction of a second. If you need some time (to hit Escape, or stare at the numbers) you can use .B delay to make the monitor pause for a specified number of milliseconds. .RE .SP \fBecho\fP \fIword\fP ... .RS Print these words. .br Used to display messages, like the startup banner. Echo normally prints the words with spaces in between and a newline at the end. Echo understands special '\e' escape sequences as follows: .RS .SP \e (At the end) Don't print a newline. .br \en Print a newline. .br \ev Print the monitor's version numbers. .br \ec Clear the screen. .br \ew Wait until a RETURN is typed .br \e\e Print a backslash. .RE .RE .SP \fBls\fP [\fIdirectory\fP] .RS List contents of a directory. .br Useful when looking for kernel images. .RE .SP .B menu .RS Menu driven startup. .br This command allows you to execute functions defined with a .IR key . If no menu functions have been defined then .B menu will use this one hidden built-in function: .SP .RS *(=,Start Minix) boot .SP .RE Kernel selecting functions only add new options to this set, but if you define a two argument function yourself then the above one is no longer shown, allowing you to customize the menu completely. Your first function definition should therefore be one that starts Minix. .SP Menu entries are shown in the same order as .B set shows them. If you don't like the order then you have to unset the functions and retype them in the proper order. .SP If you type a key then a scheduled trap is killed and the appropriate menu function is executed. If you need more time to choose then hit the spacebar. A key not on the menu also kills a trap, but does nothing more. .RE .SP .B save .RS Save environment. .br This will save all the environment variables and functions with nondefault values to the parameter sector (the second sector on the boot device), so they are automatically set the next time you boot the monitor. .RE .SP .B set .RS Show environment. .br Show the current values of the environment variables and functions. Default values are shown between parentheses to distinguish them from values that were explicitly set. .RE .SP \fBtrap\fP \fImsec\fP \fIfunction\fP .RS Schedule function. .br Schedules a function to be executed after .I msec milliseconds. Only the monitor mode cannot be interrupted, a scheduled trap is killed when the prompt is printed. Example: .SP .RS main() {trap 10000 boot; menu} .RE .SP This gives you 10 seconds to choose a menu option before Minix is booted. .RE .SP \fBunset\fP \fIname\fP ... .RS Unset environment variables. .br Removes the named variables and functions from the environment, and sets special variables back to their default values. This is also the only way to remove the "device name translation" property from a variable. .RE .SP \fBexit\fP .RS Exit the monitor. .br Reboot the machine, exit to Minix or exit to DOS as appropriate. .RE .SP \fB{\fP \fIcommand\fP; ... \fB}\fP .RS Bundle commands. .br Treat a number of commands as a single command. Used for function definitions when a function body must contain more than one command. .RE .SH DEVICES The Minix kernel can't do anything with device names, so they have to be translated to device numbers before they are passed to the kernel. This number is found under the st_rdev field (see .BR stat (2)) of the file on the boot file system. The monitor will look for the device file with the working directory set to '/dev'. If it can't find the device name then it will translate names like 'ram', 'fd1', 'c0d1p0', 'c1d0p2s0', and even the obsolete 'hd2a' to what it itself thinks the numbers should be. .PP The special name .B bootdev is translated to the name of the device booted from, like 'fd0', or 'c0d0p1s0', and then searched for in /dev. .B Bootdev can only be translated to a device for the first controller, and only if the disks on that controller are numbered without "gaps". (The master device on the second IDE channel is always d2 on Minix. The BIOS will call it disk 0, 1, or 2 depending on the number of disks on the first IDE channel.) .SP Controller numbers are meaningless to the BIOS, so everything is assumed to be attached to controller 0. You can omit .B c0 for device names, and it is best to always omit .B c0 for the .B boot command, and to always use the full name for variables passed to Minix. .SH EXTENSIONS A few extensions have been made to this program for kernel hackers. They may be triggered by setting bits in the flags word in the kernel startup code (the mpx file.) The flag bits are: .TP 10 0x0001 Call kernel in 386 mode. .TP 0x0002 Do not make space for the bss areas of processes other then the kernel. .TP 0x0004 Use the stack size set by .BR chmem (1). .TP 0x0008 Load MM, FS, etc. into extended memory. .TP 0x0010 No need to patch process sizes into the kernel. .TP 0x0020 The kernel can return to the monitor on halt or reboot. .TP 0x0040 Offer generic BIOS support instead of just INT 13 (disk I/O). .TP 0x0080 Pass memory lists for free and used memory (processes). .TP 0x0100 Kernel returns monitor code on shutdown in boot parameters array. .SH "SEE ALSO" .BR controller (4), .BR installboot (8), .BR usage (8), .BR boot (8), .BR dosminix (8). .SH BUGS The .B delay command will hang forever on the original IBM PC (not the XT!). Not that it matters, as everything takes forever on that box. .PP By redefining .B leader one can easily hide the identity of this program. .SH ACKNOWLEDGMENTS Earl Chew, for the inspiration his ShoeLace package provided, unless he wants to file a "look and feel" suit against me, then I will say I modeled it after the Sun ROM boot monitor, which is also true. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH DOSMINIX 8 .SH NAME dosminix, mkfile \- Running Minix under DOS .SH SYNOPSIS .RB "C:\eMINIX> " "boot disk0.mnx" "\0\0\0\0\0(Typical example)" .br .RB "C:\eMINIX> " "mkfile \fIsize disk" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. This text describes running Minix .\" or Minix-vmd under DOS. The DOS version of the Boot Monitor, described in .BR monitor (8), grabs as much memory as DOS is willing to give, loads Minix into that memory from the active partition of a "file as disk", and jumps to the Minix kernel to let Minix take control. As far as DOS is concerned Minix is just a part of the .B boot.com program. .PP In the example above .B disk0.mnx is the "file as disk". It is a file of many megabytes that is used by Minix as a disk of four partitions. These partitions will normally be .B /dev/dosd1 through .BR /dev/dosd4 , with .BR /dev/dosd0 for the whole "disk". The Boot Monitor will set the .B dosd0 boot variable to the name of the disk (its first argument), the root file system will be the active partition, usually .BR dosd1 . It is better to use the special name .B bootdev to indicate this device, usually in the setting .BR rootdev = bootdev . .PP Once Minix is running it will operate the same as if started from a regular disk partition until it is shut down. On shutdown from protected mode it will return to the Boot Monitor prompt, and with the .B exit command you leave the Boot Monitor and return to DOS. Shutting down from real mode will reboot the machine, just like when run from a disk partition. (This more or less crashes DOS, but DOS is used to such abuse.) .SS EMM386 Minix can't run in protected mode (286 or 386 mode) if DOS is using a memory manager like .BR EMM386 . You can either temporarily comment out EMM386 from .BR CONFIG.SYS , or you can press .B F8 on startup to bypass CONFIG.SYS. This is only possible with the later DOS versions. .SS "Windows 95" Press F8 at startup to make the boot menu visible. Choose "\fBCommand prompt\fP", or "\fBSafe mode command prompt\fP" to run DOS. Use the "safe mode" if EMM386 is started in CONFIG.SYS. .PP Typing F8 at the right moment isn't easy, so you may want to change the way Windows boots by editing the .B MSDOS.SYS file found in the root directory of your Windows system. This is alas not trivial. Open a window on your main drive, click on "\fBView\fP" and choose "\fBOptions\fP." In the Options window choose "\fBView\fP" and enable "\fBShow all files\fP". The MSDOS.SYS file should now be visible, among several other hidden files. Right-click on the MSDOS.SYS icon, choose "\fBProperties\fP" and disable "\fBRead-only\fP". Bring MSDOS.SYS into a simple text editor such as Notepad. In the .B "[Options]" segment add the following lines (or change existing lines into): .PP .RS .nf BootMenu=2 BootMenuDelay=5 .fi .RE .PP The first setting makes the Windows boot menu always visible, and the second line changes the delay before booting to 5 seconds. Take care not to change anything else, or things will go horribly wrong. Save MSDOS.SYS and exit. Don't forget to make MSDOS.SYS read-only again, and also hide all the hidden files again, unless you like it this way. .SS "DOS compatibility box" The 16-bit version of standard Minix can be run in real mode in a DOS box. This is somewhat surprising, because it means Windows 95 simulates devices like the keyboard, timer, and interrupt controller well enough to fool Minix into thinking that all is well. Alas it doesn't work as well under Windows NT. Keypresses get lost if you type to fast, and using the floppy occasionally locks Minix up. This is a bit disappointing, because it is the only way to run Minix under NT. Under Windows 95 one is better off putting the system in DOS at boot and then to run Minix in protected mode. .PP One thing that is better under NT is that the Boot Monitor is able to get a so-called "Upper Memory Block", thereby raising useful memory to about 750K. Windows 95 however hogs leftover UMB memory in a process named .BR vmm32 , whatever that may be. To get some of this memory you can put .B "BOOT /U" at the start of .BR autoexec.bat . The monitor will grab a 64K UMB if it can get it, and keep that memory safe for use by Minix when it is later started from Windows. .PP The easiest way to start Minix is to give all Minix disk files the suffix .BR MNX . Doubleclick on the disk you want to run to make the "\fBOpen With\fP" window appear. Click on "\fBOther\fP" and browse to the .B BOOT.COM program. Set the name of the .mnx files to "\fBMinix "disk" file\fP" in the description box if you want everything right. In the future you can just click on a Minix disk file to run it, you don't have to start a DOS box first. (To make it perfect use "View", "Options", "File Types", choose "Minix "disk" file", "Edit", "Change Icon", "Browse", select MINIX.ICO.) .PP When Minix shuts down it will try to reboot what it thinks is a PC. Windows seems to assume that the DOS session has exited. Right-click on the BOOT.COM program, "Properties", "Program", and enable "Close on exit" to make the DOS box disappear automatically when Minix thinks it reboots. You may also want to lock the font to .BR 7x12 , or any other font that isn't ugly. .PP Minix disk files are opened in a write-exclusive mode. A second Minix session can only open it read-only, which may lead to a "can't open root device" error. .SS "Mkfile" Minix disk files can be created or resized with the .B mkfile utility. Its two arguments are the size and name of the disk file. The size is a number optionally followed by the letter .BR k , .BR m or .BR g to specify kilobytes, megabytes, or even gigabytes. So the call .PP .RS .B "mkfile 50m disk5.mnx" .RE .PP will create a 50 megabyte file named .BR disk5.mnx . If the file already exist then it is shrunk or grown to 50 megabytes. No data is lost if the file is grown. If the file is shrunk then only the data that is cut off is lost. These features allow one to inrease the size of a Minix /usr partition with the following recipe: .PP .RS .ta +24n+2m .nf copy disk0.mnx disk0.new Copy the disk to disk0.new mkfile 100M disk0.new Enlarge to 100 megabytes boot disk0.mnx Boot the old "disk" [ESC] Get the attention of the monitor dosd5=disk0.new /dev/dosd5 becomes disk0.new boot \&... login: root .fi .in +(24n+2m) .ti -(24n+2m) part Choose dosd5, move to the Size field of dosd7 partition, hit 'm' to fill it out to the end of the "disk". Write and quit. .in -(24n+2m) .nf mkfs /dev/dosd7 Recreate the file system, but larger mount /dev/dosd7 /mnt cpdir -v /usr /mnt Copy /usr to the new disk's /usr to be shutdown Back to the monitor exit Back to DOS ren disk0.mnx disk0.old ren disk0.new disk0.mnx Replace old by new boot disk0.mnx Run the larger system .fi .RE .PP Now Minix runs from a larger "disk". Don't worry if it claims to have crashed, there wasn't a "shutdown" entry in /usr/adm/wtmp at the time it was copied. .PP The above recipe is for a ordinary standard Minix installation with /usr on the second and last partition. .\" Minix-vmd usually has /usr on the third and .\" last partition (dosd3 / dosd8), its .\" .B mkfs .\" command requires a .\" .B "-t\ 2f" .\" option to specify the file system type as "V2 flex", and it knows if .\" it has crashed or not. .SS Backups In the recipe above you saw how simple it is to create a new system, just copy a disk file. It is equally simple to make a backup, you just copy the disk file. To make a test system: copy the disk file. To make another test system: copy the disk file. Let friends have their own Minix: copy the disk file again. (Exciting, eh?) .PP You may want to save a Minix disk file in a ZIP file to save space. It may look as a good idea to first run .B "make clean" in .B /usr/src to remove all the binary junk, but alas that has no effect at all. The disk file is compressed under DOS, and there it is unknown which blocks are in use and which are free. With the following trick you can make those deleted blocks compress really well: .PP .RS .nf cd /usr/tmp echo >junk while cat junk >>junk; do :; done sync rm junk .fi .RE .PP After these commands all free blocS%U%V%W%ks contain newlines. Long runs of the same byte happen to compress by a factor 1000, so the unused disk blocks will almost disappear in the ZIP file. .\" Under Minix-vmd you can use .\" .PP .\" .RS .\" cp /dev/zero junk .\" .RE .\" .PP .\" instead of the echo/while pair of lines above. Standard Minix doesn't have .\" /dev/zero. .SS "FAT driver" The dos disk driver, described in .BR dosd (4), has two identities. By default you get the "\fBfile\fP" driver, that uses DOS file I/O calls to access a large DOS file as a disk. The other alternative is the "\fBFAT\fP" driver. The FAT driver sits on top of an ordinary Minix disk driver, and interprets a partition as a FAT (File Access Table) file system to find a file to use as a Minix disk. The result has the same effect as the file driver, except that no costly calls to DOS are made. To enable this feature you have to use the following Boot environment settings: .PP .RS .nf dosd = fat dosd0 = hd1:\eminix\edisk0.mnx .fi .RE .PP The .B dosd setting tells Minix to use the FAT driver, and the .B dosd0 setting tells the Minix device and DOS file name to use. Disk I/O should be sped up nicely by this change, although typical use of Minix doesn't require fast disk I/O, so the difference won't be too noticable. .PP Support for FAT-32 (big file system support added in the later Windows 95 releases) has not been tested very well. The FAT-12 and FAT-16 code has been used a lot, and seems safe. Note the risks inherent in these drivers: The file driver uses simple DOS file I/O calls, leaving it to DOS to know its own file system. The FAT driver interprets FAT file system structures by itself. Minix booted from a real hard disk partition can only use DOS disk files through the FAT driver. .SH "SEE ALSO" .BR dosd (4), .BR monitor (8), .BR usage (8). .SH NOTES Use at your own risk. .SH BUGS Hasn't been tried under Windows 98 yet. .PP Pray the deity of your choice will forgive you for running a UNIX-like system as an ordinary DOS program. The author of this code is already doomed. When his time comes the daemons wi*(&%*$%*& .br Memory fault \- core dumped .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" These numbers should match those in nonamed.c: .ds ST "two seconds" .ds MT "four seconds" .ds LT "five minutes" .ds HT "one hour" .ds NI "256" .TH NONAMED 8 .SH NAME nonamed \- not a name daemon, but acts like one .SH SYNOPSIS .B nonamed .RB [ \-qs ] .RB [ \-d [\fIlevel\fP]] .RB [ \-p .IR port ] .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Nonamed is not a name daemon. It can answer simple queries from .BR /etc/hosts , but anything else is relayed to a real name daemon. .B Nonamed maintaines a small cache of replies it has seen from a name daemon, and will use this cache to minimize traffic if the machine is permanently connected to the Internet, or to answer requests if the machine is often disconnected from the Internet, i.e. a computer at home. .PP On startup .B nonamed sends a simple query to each of its name servers to see if one is up. This is repeated every \*(LT in an "at home" situation, or when necessary if the current name daemon doesn't respond. The first name server to answer is used as the current name server to answer queries. .PP If no name servers are found in the DHCP data or .BR /etc/hosts then only the hosts file is used to answer queries, and any query for a name not in that file gets a failure response. .PP .B Nonamed accepts both UDP and TCP queries under Minix-vmd. Under standard Minix only UDP queries are accepted. \*(NI relayed UDP queries can be outstanding before it forgets where the first one came from. .PP Using the hosts file, .B nonamed can answer simple DNS queries to translate a host name to an IP address, or an IP address to a host name. Suppose .B /etc/hosts looks like this: .PP .RS .ta +15n .nf 10.0.0.1 flotsam.cs.vu.nl\0www 10.0.0.2 jetsam.cs.vu.nl .fi .RE .PP Then queries for the host names listed can be answered with the IP addresses to the left of them. An alias like "www" above is seen as a CNAME for the first host name on the line, in the same domain as the first host name if unqualified (no dots). A reverse lookup for an IP address on the left is answered by the first host name on the right. If more than one match is possible then all matches are put in the answer, so all IP addresses of multihomed hosts can be listed by multiple entries in the hosts file. .PP Requests for names like "flotsam.cs.vu.nl.cs.vu.nl" that are often generated on a domain search for an already fully qualified domain name are recognized and made to fail. This kludge avoids a lot of unnecessary requests to possibly unreachable name servers and client timeouts. .PP The name "localhost" in any domain is given the IP address 127.0.0.1. .PP .B Nonamed employs several timeouts for efficient operation: .PP If no UDP reply is seen in \*(MT then a new search is started for a name server in the hope of finding one that does work. A failing TCP connection will also invoke a search, the TCP connection is then made to the new name server. A client using UDP will retry eventually, a client using TCP will notice nothing but a short delay. If a TCP connection fails after 5 tries then an answer is sought in the hosts file, and failing that the connection is closed. .PP Any TCP operation is given \*(LT to show any action before the connection is aborted. .PP UDP replies from a name server are put in a cache of by default 8 (16-bit system) or 16 kilobytes (32-bit system). New queries are first sought in the cache, and if found answered from the cache. An entry in the cache is expired when the resource record with the smallest TTL (time to live) expires, unless its expire time is artificially extended by the "%stale" parameter (see below). An answer from the cache has all TTLs appropriately lowered, and the AA bit ("answer authoritive") is cleared. Any request answered by stale data is refreshed as soon as .B nonamed notices that one of the external name daemons is reachable. .PP Data is only cached if it is has "no error" result code, or a "no such domain" result code with a SOA record in the name server section, and all records have a nonzero TTL. The %stale parameter has no effect on the decision to cache a result. .PP The cache is rewritten to the cache file \*(LT after a new entry has been added. Mere changes to the order in the cache don't cause a rewrite. .SS Configuration through /etc/hosts The real name servers, stale data extension, and cache size can be configured by special entries in the hosts file. For example: .PP .RS .ta +\w'172.16.24.3'u+2m +\w'%nameserver'u+2m .nf 86400 %ttl # Answers from this file get this TTL 2419200 %stale # Stale data may linger on for 4 weeks 32768 %memory # 32k cache size 10.0.0.1 %nameserver # flotsam 172.16.24.3 %nameserver # dns1.example.com 172.16.24.6 %nameserver # dns2.example.com .SP 10.0.0.1 flotsam.home.example.com\0www 10.0.0.2 jetsam.home.example.com .fi .RE .PP In this example we have two machines, flotsam and jetsam, that are at home. Answers from the hosts file get a TTL of one day, by default this is \*(HT. Normally there is no connection to the Internet, so any stale data in the cache is allowed to linger on for 2419200 seconds (4 weeks) before it is finally discarded. The cache size is set to 32 kilobytes. The first name server is the flotsam. On the flotsam itself this entry is ignored, but the jetsam will now run its requests through flotsam if possible. This means that both flotsam and jetsam use the cache of the flotsam. The other nameserver entries are external name servers of the Internet provider. .PP If no nameservers are listed in the hosts file then they are obtained from data gathered by DHCP. This is the preferred situation. .PP If the hosts file contains a line that says: .PP .RS .BI include " file" .RE .PP Then the current hosts file is closed and the file named is read next. .SS "Automatic calling" If your connection to the Internet is set up on demand, either in software on the machine that has the modem, or by a special box such as an ISDN router, then you need to filter the name server probes that .B nonamed sends out every \*(LT to see if a real name daemon is reachable. These probes need to be recognized as packets that must not trigger a call, and that must not keep the line up. You can either filter all IP packets destined for port 53 decimal (the .B domain port). This may be a bit too much, the first packet out is often a normal DNS request (not a probe), so you may want to do better. A probe by .B nonamed is a nonrecursive request for the name servers of the root domain. You can recognize them by looking at the flags, they are all off. Here is a typical probe in hex (twenty octets per line), followed by the names of interesting fields, and the octets values you should look for: .PP .RS .nf 45 00 00 2D C8 19 00 00 1D 11 53 18 AC 10 66 41 AC 10 18 03 00 35 00 35 00 19 79 93 00 00 00 00 00 01 00 00 00 00 00 00 00 00 02 00 01 .SP ip ip ip ip ip ip ip ip ip ip ip ip si si si si di di di di sp sp dp dp xx xx xx xx id id fl fl qd qd an an ns ns ar ar dn ty ty cl cl .SP 45 xx xx xx xx xx xx xx xx 11 xx xx xx xx xx xx xx xx xx xx xx xx 00 35 xx xx xx xx xx xx 00 00 xx xx xx xx xx xx xx xx xx xx xx xx xx .SP .fi (ip = IP header, si = source IP, di = dest IP, sp = source port, dp = dest port, id = DNS ID, fl = DNS flags, qd = query count, an = answer count, ns = nameserver count, ar = additional records count, dn = domain (""), ty = type (NS), cl = class (IN).) .RE .PP So if a packet has octets 45, 11, 00 35, and 00 00 at the appropriate places then don't let it cause a call. Read the documentation of your software/router to find out how to do this. Hopefully it is possible to view the contents of the packet that triggered the last call. If so you simply let .B nonamed bring up the line once with a probe. .SS "Remote information" The program version and name servers it is working with can be obtained with: .PP .RS host \-r \-v \-c chaos \-t txt version.bind. \fIserver\fP .RE .PP .I Server is the name or IP address of the host whose name server you want to know this of. (This call is really an undocumented hack to ask the version numbers of the BIND name daemon. It just had to be implemented for .B nonamed as well.) .PP The _%a%b%c%% variables in the hosts file can be viewed like this: .PP .RS host \-r \-t a %nameserver. \fIserver\fP .RE .PP Don't forget the dot at the end of the name. %ttl and %stale will be shown as a dotted quad, e.g. 0.36.234.0. The proper value can be computed as 36 * 65536 + 234 * 256 + 0 = 2419200. .SH OPTIONS The options are only useful when debugging .BR nonamed , although it can be very instructive to watch DNS queries being done. .TP .BR \-d [\fIlevel\fP] Set debugging level to .I level (by default .BR 1 .) Debug mode 1 makes .B nonamed decode and display the DNS queries and replies that it receives, sends and relays. In debug mode 2 it prints tracing information about the internal jobs it executes. In debug mode 3 it core dumps when an error causes it to exit. The debugging level may also be increased by 1 at runtime by sending signal .B SIGUSR1 or turned off (set to 0) with .BR SIGUSR2 . .TP .RB [ \-p " \fIport\fP] Port to listen on instead of the normal .B domain port. .TP .RB [ \-q ] Read the cache file with the debug level set to 2, causing its contents to be printed, then exit. .TP .RB [ \-s ] Run single: ignore hosts or cache file, only use the DHCP information. This allows another .B nonamed to be run on a different interface to serve a few programs that run there. .SH FILES .TP 15n /etc/hosts Hosts to address translation table and configuration file. .TP /usr/run/nonamed.pid Process ID of the currently running .BR nonamed . .TP /usr/adm/nonamed.cache Copy of the cache. Read when the program starts, written \*(LT after something has been added to it, and written when a SIGTERM signal is received, which is normally sent at system shutdown. .TP /usr/adm/dhcp.cache Data gathered by the DHCP daemon. Among lots of other junk it lists name servers that we should use. .SH "SEE ALSO" .BR gethostbyname (3), .BR resolver (3), .BR hosts (5), .BR inet (8), .BR boot (8), .BR inetd (8), .BR dhcpd (8). .SP .BR RFC-1034 and .BR RFC-1035 . .SH NOTES Do not use the %stale parameter for a PC that is directly connected to the Internet. You run the risk of getting wrong answers, a risk that is only worth taking for a system that is mostly disconnected from the Internet. .PP You can specify one or more remote name servers in .B /etc/resolv.conf so that nonamed isn't needed. This will save memory, but you'll lose .BR nonamed 's cache and its "offline" tricks. That's no problem if you can use a neighbouring name daemon on another PC at home. .PP The default cache size seems to be more than enough for normal use, but if you do decide to make it larger then don't forget to increase the stack size of the program under standard Minix. .PP Don't let two .BR nonamed 's forward queries to each other. They will pingpong a query over the network as fast as they can. .SH BUGS The idea of serving "stale DNS data" will probably make some purists violently sick... .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH PART 8 .SH NAME part \- partition table editor .SH SYNOPSIS .B part .RI [ device "] ..." .SH DESCRIPTION .B Part is a screen oriented partition table editor. .PP While editing you will see six lines of numbers, the first line shows the device name and its geometry (number of cylinders, heads and sectors), the second shows the start and end of the drive or partition you are working on, the last four lines show the different partitions or subpartitions. All numbers except those on the second line can be edited. Question marks are showed instead of numbers if the partition table is not loaded yet. You have to select a device and type 'r'. .PP Editing is a simple matter of moving around with the arrow keys and changing the values with + and \- (or PgUp and PgDn), or by typing the desired value. The '?' key will give a small list of commands, the '!' key gives advice on how to make a new entry. .PP The spacebar toggles between showing the size of the partition and the last sector on the partition. Useful to check if a partition is adjacent to the next. .PP The 'm' key is "magical", it lets you cycle through a set of interesting values for the base or size of a partition. These values are: Aligned to a cylinder, taped to other partitions (inside or outside), or filling out holes. .BR "Use this key" ! .PP Minix subpartition tables or extended partitions may be edited after hitting the '>' key. The number of this partition will be shown after the device name on the second row, e.g. .BR /dev/hd0:2 . Minix subpartition tables are shown as is, but extended partition bases are translated to absolute offsets on the screen to hide the gory details of their implementation from the innocent user. (Hit 'p' if you dare.) The '<' key will bring you back to the enclosing partition table. .PP With arguments, .B part will use the given devices or files. Without arguments, .B part will use all interesting block devices in .B /dev sorted by device number and starting with .BR /dev/hd0 . .PP Values that are out of range, overlapping, or otherwise strange are shown in reverse video. Values that may possibly be a problem for operating systems other then Minix are shown in bold characters. .PP The name of the device is highlighted when it has not been read yet. .PP Head or sector numbers are highlighted if the partition does not start or end at a cylinder boundary. .PP The base and/or size field is highlighted if they fall outside the device, if they are inside some other partition, if the base equals the device's base (no room for the boot sector), or if the size is zero. .PP .B Part complies with the good old \s-2UNIX\s+2 tradition of trusting the user. It will write any table, no matter how bad. You have been warned. .PP By the way, as far as Minix is concerned there is absolutely no reason to make partitions start precisely on a cylinder or track nor does it have to be an exact number of cylinders long. Minix only looks at the base and size of a partition, the geometry of the drive doesn't have to be correct. Other Operating systems can be very picky about partitions that are not aligned. Some partition editors may refuse to edit a table, others may even make a mess of the table. The only exception is the first partition, it traditionally starts on the first track, not the first cylinder. All editors must understand this. (Subpartition tables are Minix specific, so there is no reason at all for any alignment.) .SS "Extended Partitions" Extended partitions are a mess that is only made slightly better by .B part by translating the base offsets to absolute numbers. It is better to use DOS .B fdisk to create them, but if you insist on using .B part then this is what they should look like: .RS .sp The extended partition entry in the primary partition table must cover the whole logical partition space within it. .sp The area thus created is split in segments, each segment contains a partition table in sector 0 and one (just one) logical partition. .sp The first entry of a segment's partition table describes this logical partition: it's partition ID, base and size. .sp The second entry is an extended partition that describes base and size of the next segment (partition table and logical partition). The last segment's partition table is empty, or contains one logical partition. .SH "SEE ALSO" .BR mkfs (1), .BR fd (4), .BR hd (4). .SH BUGS You can have a table read, messed up, and written in no time, be careful. .PP You can't type head or sector numbers directly. .PP Sectors are counted from 0 for consistency, but the partition table counts from 1 like DOS addresses them. Most confusing. .PP You can't write a backup copy to a file, that's what .BR dd (1) with count=1 is for. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH PARTITION 8 .SH NAME partition \- make a partition table .SH SYNOPSIS .B partition .RB [ \-mfn ] .I device [\fItype\fP:]\fIlength\fP[\fB+*\fP] ... .SH DESCRIPTION .B Partition makes a partition table on .I device using the types and sizes given. It may be used in combination with .BR repartition (8) for automatic installation of Minix. .PP You may give up to four \fItype\fP:\fIlength\fP[\fB+*\fP] specifications for the partitions. You may also specify holes before, between, and after the partitions. A hole differs from a partition specification by not having a type. .PP The first hole is by default 1 sector to make space for the primary bootstrap and the partition table. The other holes are 0. .PP The .I type field is the type of the partitition in hexadecimal. The .I length field is the partition's size in sectors. The .B + or .B * may optionally be added to indicate that the partition must be expanded to contain any leftover space on the device or to mark the partition active. .PP Instead of a lenght you may use the word .B exist to indicate that an existing partition of the given type must be kept from the old partition table. .PP Partitions are padded out to cylinder boundaries, except for the first one, it starts on track 1. Some operating systems care about this. Minix and MS-DOS do not. .SH OPTIONS .TP .B \-m Minix only, no need to pad partitions. This is the default for subpartition tables. .TP .B \-f Force making a partition table even if the device is too small. .TP .B \-n Play-act, don't write the new table, just show what it would look like. .SH EXAMPLE .B "partition /dev/hd0 01:16384 81:40000 81:2880* 06:20000+" .PP Partitions disk 0 into an 8 Mb DOS partition, 20 Mb Minix /usr, 1.44 Mb Minix / (active), and a DOS partition of at least 10 Mb at the end of the disk. (06:0+ would have been ok too, it's just a sanity check.) .SH "SEE ALSO" .BR hd (4), .BR part (8), .BR repartition (8). .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH PR_ROUTE 8 .SH NAME pr_routes \- show IP routing. .SH SYNOPSIS .B pr_routes .RB [ \-i .RI "ip device]" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Pr_routes displays the IP routing table. .SH OPTIONS .TP .B \-i .I "ip device" specifies the ip device. .SH "SEE ALSO" .BR add_routes (8), .BR irdp (8). .SH AUTHOR .I Pr_routes.c was written by Philip Homburg. This manual page by A. S. Woodhull, last revised 13.02.96. .TH PRINTROOT 8 .SH NAME printroot \- print the name of the root device on standard output .SH SYNOPSIS \fBprintroot\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .FL "\-r" "Print only the root device, not a full mtab line" .SH EXAMPLES .EX "printroot" "Print the name of the root device" .SH DESCRIPTION .PP .I Printroot is useful for initializing the \fI/etc/mtab\fR when the system is booted. It figures out what the root device is by searching \fI/dev\fR until it finds a block special file with the right major/minor device numbers. .SH "SEE ALSO" .BR fstab (5), .BR boot (8). .TH PWDAUTH .SH NAME pwdauth \- password authentication program .SH SYNOPSIS .B /usr/lib/pwdauth .SH DESCRIPTION .B Pwdauth is a program that is used by the .BR crypt (3) function to do the hard work. It is a setuid root utility so that it is able to read the shadow password file. .PP .B Pwdauth expects on standard input two null terminated strings, the password typed by the user, and the salt. That is, the two arguments of the .B crypt function. The input read in a single read call must be 1024 characters or less including the nulls. .B Pwdauth takes one of two actions depending on the salt. .PP If the salt has the form "\fB##\fIuser\fR" then the .I user is used to index the shadow password file to obtain the encrypted password. The input password is encrypted with the one-way encryption function contained within .B pwdauth and compared to the encrypted password from the shadow password file. If equal then .B pwdauth returns the string "\fB##\fIuser\fR" with exit code 0, otherwise exit code 2 to signal failure. The string "\fB##\fIuser\fR" is also returned if both the shadow password and the input password are null strings to allow a password-less login. .PP If the salt is not of the form "\fB##\fIuser\fR" then the password is encrypted and the result of the encryption is returned. If salt and password are null strings then a null string is returned. .PP The return value is written to standard output as a null terminated string of 1024 characters or less including the null. .PP The exit code is 1 on any error. .SH "SEE ALSO" .BR crypt (3), .BR passwd (5). .SH NOTES A password must be checked like in this example: .PP .RS pw_ok = (strcmp(crypt(key, pw->pw_passwd), pw->pw_passwd) == 0); .RE .PP The second argument of crypt must be the entire encrypted password and not just the two character salt. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH RARPD 8 .SH NAME rarpd \- reverse address resolution protocol daemon .SH SYNOPSIS .B rarpd .RB [ \-d [\fIlevel\fR]] .I network-name \&... .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Rarpd listens on the given networks for broadcast packets asking for reverse address resolution. These packets are sent by hosts at boot time to find out their IP address. .B Rarpd looks up the six octet ethernet number in the .B /etc/ethers file finding a host name. This name is translated to the IP address of the host by a DNS lookup. The IP address is then sent to the host. .PP Under Minix the program forks as needed to give each network its own server. Under Minix-vmd all networks are handled in the same program using async I/O. .SS "Private Ethernet Addresses" For VU practical work, where students have to create their own IP stack starting at the bottom with RARP, this implementation recognizes Ethernet addresses starting with octet 0x76 as special. The next octet is used as a additional host number and the next and last four octets as an IP address that this Ethernet address is additional for. The IP address is translated back to a name, and the first component of that name gets a dash and the additional host number added to it. That hostname is then looked up and its IP address returned in a RARP reply. Example: .PP .RS .ta +\w'flotsam-3.example.commmm'u 76:3:c0:a8:e7:fa Additional 3, IP 192.168.231.250 .SP flotsam.example.com Reverse lookup on 192.168.231.250 .SP flotsam-3.example.com Splicing in additional number .SP 192.168.231.42 Forward lookup .RE .PP In this example a RARP query for 76:3:c0:a8:e7:fa gets 192.168.231.42 as reply. .SH OPTIONS .TP .BR \-d [\fIlevel\fP] Turns on debugging messages at the given level, by default 1. At level 1 you will be shown what answers are sent, and at level 2 or higher you will be told about queries from unknown hosts or host on the wrong network. The debug level can also be increased by 1 at runtime by sending signal .B SIGUSR1 or turned off (set to 0) with .BR SIGUSR2 . .SH "SEE ALSO" .BR ifconfig (8), .BR ethers (5), .BR hosts (5), .BR inet (8), .BR boot (8), .BR dhcpd (8), .BR irdpd (8), .BR inetd (8), .BR nonamed (8). .SH NOTES A "network name" is the device name of the IP device of a network, i.e. .BR ip0 , .BR ip1 ", ..." .PP The RARP protocol has gone out of fashion in favour of DHCP. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH READCLOCK 8 .SH NAME readclock \- read the AT's real time clock .SH SYNOPSIS \fBreadclock\fP [\fB\-nwW2\fP] .SH DESCRIPTION .B Readclock reads the AT's real time clock and sets the machine's time. It is usually the second thing done in .BR /etc/rc , the first thing is setting the time zone by sourcing .BR /etc/profile . This means that the clock is assumed to tell the wall clock time. If you want to run the clock in GMT then you can put .B "TZ=GMT" (or any other TZ value) in front of the readclock command. .SH OPTIONS .TP .B \-n Play-act, don't set the time nor change the calibration data, just show what would be done. .TP .B \-w Write the current time to the CMOS clock. Dangerous, see .BR BUGS . Don't forget to use .B "TZ=GMT" in front of readclock if the clock should run in GMT. .TP .B \-W Like .BR \-w , but also sets the status registers of the CMOS clock to their proper values. (For if the clock suddenly runs at an odd pace or has stopped and the BIOS doesn't repair it.) .TP .BR \-2 , Add 20 to any year before 2000. If your CMOS clock year can't run past 2000, then you can set it to 1980 and use .B \-2 to correct the year. Together with .B \-w the year minus 20 is written to the clock. .SH FILES .TP 20n /etc/profile Timezone and other shell initialization code. .SH "SEE ALSO" .BR date (1), .BR utime (1). .SH BUGS Reported to not work on some AT's. .PP May mess up the clock royally when setting it .RB ( \-w ). Only if you have a very standard AT and you are not afraid of having your CMOS setup reset to the default with a "checksum error" should you use .BR readclock to set the time of the CMOS clock. You have been warned. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH REBOOT 8 .SH NAME reboot \- reboot the system immediately .SH SYNOPSIS \fBreboot\fP [\fB\-f\fP] .SH DESCRIPTION .B Reboot can be used to reboot the system after installing a new kernel. It does not inform the users, but does log it's actions in .B /usr/adm/wtmp and .BR /usr/adm/log . The system is then rebooted with the .BR reboot (2) systemcall. .PP If the .B \-f flag is not given then all processes are sent terminate signals to give them a chance to die peacefully before the .B reboot() call. .PP If the wtmp file exists, .B reboot logs itself as if it were a shutdown. This is done to prevent .BR last (1) from talking about system-crashes. .B Reboot is registered as is in the log file. .PP .B Reboot can only be executed by the super-user. Any other caller will be refused, either by .BR reboot (8) or by .BR reboot (2). .SH "SEE ALSO" .BR reboot (2), .BR shutdown (8), .BR halt(8), .BR boot (8). .SH BUGS The error message's given by .B reboot are not always useful. There are several routines that can fail, but which are not fatal for the program. .SH AUTHOR Edvard Tuinder (v892231@si.hhs.NL) .TH REPARTITION 8 .SH NAME repartition \- load a partition table .SH SYNOPSIS \fBrepartition\fP \fIdevice\fP [\fIpartition-file\fP] .SH DESCRIPTION .B Repartition uploads a new partition table for the partitions of .IR device . The table is obtained from the first sector of .I partition-file if given, .I device otherwise. .I Device may refer to the whole drive or a primary partition, depending on whether you want to upload a partition or a subpartition table. The partitions will be truncated to fit within the enclosing device like the disk driver does, unless the numbers are coming from .IR partition-file . .SH EXAMPLES repartition /dev/hd0 .br repartition /dev/hd4 /etc/hd4.table .PP Reload the partition table of drive 0 setting /dev/hd[1\-4], and the subpartition table of /dev/hd4 setting /dev/hd4[a\-d] using a file. The latter may be useful if you need more than the 4 subpartitions a single Minix partition gives you. .SH DIAGNOSTICS The new table is printed on standard output. .SH FILES /dev/hd[0-9] .SH "SEE ALSO" .BR hd (4), .BR part (8). .SH BUGS The disk must be in use for the changes to stick. The partition table of an idle disk will be reloaded on the first open. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rlogind.8c 6.3 (Berkeley) 5/24/86 .\" .TH RLOGIND 8 "May 24, 1986" .UC 5 .SH NAME rlogind, in.rld \- remote login server .SH SYNOPSIS .B "login stream tcp nowait root /usr/sbin/in.rld in.rld" .br .B "tcpd login /usr/sbin/in.rld" .SH DESCRIPTION .B Rlogind is the server for the .BR rlogin (1) program. The server provides a remote login facility with authentication based on privileged port numbers from trusted hosts. .PP .B Rlogind listens for service requests at the port indicated in the ``login'' service specification; see .BR services (5). When a service request is received the following protocol is initiated: .IP 1) The server checks the client's source port. If the port is not in the range 0-1023, the server aborts the connection. .IP 2) The server checks the client's source address and requests the corresponding host name (see .BR gethostbyaddr (3), .BR hosts (5) and .BR named (8)). If the hostname cannot be determined, the dot-notation representation of the host address is used. .PP Once the source port and address have been checked, .B rlogind allocates a pseudo terminal (see .BR tty (4)), and manipulates file descriptors so that the slave half of the pseudo terminal becomes the .B stdin , .B stdout , and .B stderr for a login process. The login process is an instance of the .BR login (1) program, invoked with the .B \-r option. The login process then proceeds with the authentication process as described in .BR rshd (8), but if automatic authentication fails, it reprompts the user to login as one finds on a standard terminal line. .PP The parent of the login process manipulates the master side of the pseduo terminal, operating as an intermediary between the login process and the client instance of the .B rlogin program. In normal operation, the packet protocol described in .BR tty (4) is invoked to provide ^S/^Q type facilities and propagate interrupt signals to the remote programs. The login process propagates the client terminal's baud rate and terminal type, as found in the environment variable, ``TERM''; see .BR environ (7). The screen or window size of the terminal is requested from the client, and window size changes from the client are propagated to the pseudo terminal. .SH "SEE ALSO" .BR rlogin (1). .SH DIAGNOSTICS All diagnostic messages are returned on the connection associated with the .BR stderr , after which any network connections are closed. An error is indicated by a leading byte with a value of 1. .PP .B ``Try again.'' .br A .B fork by the server failed. .PP .B ``/bin/sh: ...'' .br The user's login shell could not be started. .SH BUGS The authentication procedure used here assumes the integrity of each client machine and the connecting medium. This is insecure, but is useful in an ``open'' environment. .PP A facility to allow all data exchanges to be encrypted should be present. .PP A more extensible protocol should be used. .\" Copyright (c) 1983 Regents of the University of California. .\" All rights reserved. The Berkeley software License Agreement .\" specifies the terms and conditions for redistribution. .\" .\" @(#)rshd.8c 6.3 (Berkeley) 5/24/86 .\" .TH RSHD 8 "May 24, 1986" .UC 5 .SH NAME rshd \- remote shell server .SH SYNOPSIS .B "shell stream tcp nowait root /usr/sbin/in.rshd in.rshd" .br .B "tcpd shell /usr/sbin/in.rshd" .SH DESCRIPTION .B Rshd is the server for the .BR rcmd (3) routine and, consequently, for the .BR rsh (1) program. The server provides remote execution facilities with authentication based on privileged port numbers from trusted hosts. .PP .B Rshd listens for service requests at the port indicated in the ``cmd'' service specification; see .BR services (5). When a service request is received the following protocol is initiated: .IP 1) The server checks the client's source port. If the port is not in the range 0-1023, the server aborts the connection. .IP 2) The server reads characters from the socket up to a null (`\e0') byte. The resultant string is interpreted as an ASCII number, base 10. .IP 3) If the number received in step 1 is non-zero, it is interpreted as the port number of a secondary stream to be used for the .BR stderr . A second connection is then created to the specified port on the client's machine. The source port of this second connection is also in the range 0-1023. .IP 4) The server checks the client's source address and requests the corresponding host name (see .BR gethostbyaddr (3N), .BR hosts (5) and .BR named (8)). If the hostname cannot be determined, the dot-notation representation of the host address is used. .IP 5) A null terminated user name of at most 16 characters is retrieved on the initial socket. This user name is interpreted as the user identity on the .BR client 's machine. .IP 6) A null terminated user name of at most 16 characters is retrieved on the initial socket. This user name is interpreted as a user identity to use on the .BR server 's machine. .IP 7) A null terminated command to be passed to a shell is retrieved on the initial socket. The length of the command is limited by the upper bound on the size of the system's argument list. .IP 8) .B Rshd then validates the user according to the following steps. The local (server-end) user name is looked up in the password file and a .B chdir is performed to the user's home directory. If either the lookup or .B chdir fail, the connection is terminated. If the user is not the super-user, (user id 0), the file .B /etc/hosts.equiv is consulted for a list of hosts considered ``equivalent''. If the client's host name is present in this file, the authentication is considered successful. If the lookup fails, or the user is the super-user, then the file .B .rhosts in the home directory of the remote user is checked for the machine name and identity of the user on the client's machine. If this lookup fails, the connection is terminated. .IP 9) A null byte is returned on the initial socket and the command line is passed to the normal login shell of the user. The shell inherits the network connections established by .IR rshd . .SH DIAGNOSTICS Except for the last one listed below, all diagnostic messages are returned on the initial socket, after which any network connections are closed. An error is indicated by a leading byte with a value of 1 (0 is returned in step 9 above upon successful completion of all the steps prior to the execution of the login shell). .PP .B ``locuser too long'' .br The name of the user on the client's machine is longer than 16 characters. .PP .B ``remuser too long'' .br The name of the user on the remote machine is longer than 16 characters. .PP .B ``command too long '' .br The command line passed exceeds the size of the argument list (as configured into the system). .PP .B ``Login incorrect.'' .br No password file entry for the user name existed. .PP .B ``No remote directory.'' .br The .B chdir command to the home directory failed. .PP .B ``Permission denied.'' .br The authentication procedure described above failed. .PP .B ``Can't make pipe.'' .br The pipe needed for the .BR stderr , wasn't created. .PP .B ``Try again.'' .br A .B fork by the server failed. .PP .B ``: ...'' .br The user's login shell could not be started. This message is returned on the connection associated with the .BR stderr , and is not preceded by a flag byte. .SH SEE ALSO .BR rsh (1), .BR rcmd (3). .SH BUGS The authentication procedure used here assumes the integrity of each client machine and the connecting medium. This is insecure, but is useful in an ``open'' environment. .PP A facility to allow all data exchanges to be encrypted should be present. .PP A more extensible protocol should be used. .TH SCREENDUMP 8 .SH NAME screendump \- write current console screen to standard output .SH SYNOPSIS .B screendump .SH DESCRIPTION .B Screendump prints the contents of the console screen to standard output. It does this by reading the screen memory, skipping over attribute bytes, omitting trailing blanks and inserting a newline character at the end of each line. .SH NOTES The most common use of .BR screendump is with output redirected to a file. This allows screen displays (including output of F-keys) to be captured for inclusion in other documents. .PP This version is for IBM-PC architecture only. .SH BUGS A network user captures an image of the main console, not his or her own screen. The output will usually not be what you expect if the display is in hardware scrolling mode, since in that mode the order of the lines in screen memory may not be the same as what appears on the screen. If you expect to use .BR screendump to send notes to someone about problems that occur while using .BR MINIX you must remember to toggle to software scrolling before you make the dump. It will also be necessary to use .BR su , because .BR /dev/mem is normally not world readable. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .\" preliminary man file by Al Woodhull (awoodhull@hampshire.edu) 01.08.95 .TH SERIAL-IP 8 .SH NAME serial-ip \- Serial IP (SLIP or PPP) setup .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. \-\-\-\-\-\-\- .br .B Note: This text and the serial IP code is not finished. Code needs to be added to .B nonamed to allow it to be used both with and without a connection to the Internet, and by now there is a PPP program for standard Minix "out there" that will change everything that is said in this text. So much to do, so little time... .br \-\-\-\-\-\-\- .PP This manual page describes the Minix network setup to use serial line IP. The serial IP protocol used can either be the older SLIP by means of the .BR slip (8) program, or PPP (Point-to-Point Protocol), the newer and better serial IP protocol implemented by the .BR ppp (8) program. Alas standard Minix only supports SLIP. .PP In the following text all descriptions and examples will name SLIP or the .BR slip program, but one may just as well read PPP or .BR ppp . Where necessary the differences will be noted. .PP A typical use of the .B slip program is like this: .PP .RS .B "slip /dev/psip2 /dev/tty01" .RE .PP The argument of the program, the .B /dev/psip2 device, is one of the so-called "Pseudo IP" devices that the Minix TCP/IP driver .BR inet (8) offers to implement a virtual network on. On an ethernet IP packets are received or transmitted by the ethernet card, but packets on a pseudo IP network are channeled back to or received from a program running in user space, such as .BR slip . Standard input and output are used by .B slip to exchange packets with another SLIP implementation. This is normally through an RS-232 serial line like the second serial line .B /dev/tty01 as used in the example above. .PP If we look at the flow of data over normal ethernet then this is what a TCP connection between two Minix machines, .B telnet for instance, looks like: .PP .in 0 .ce 13 [telnet] | /dev/tcp0 | inet | [ethernet] | inet | /dev/tcp0 | [in.telnetd] .PP One-half (!) of a SLIP connection would look like this: .PP .in 0 .ce 12 [telnet] | /dev/tcp2 | inet | /dev/psip2 | slip | [serial line] \&... .SS "Configuration for a SLIP network only" It is important to know that as far as .B inet is concerned the pseudo IP network is just another network, nothing special. So you have to convince .B inet that it has to send packets out over that network. One does this by setting a default route that makes .B inet believe that there is a router somewhere on the pseudo-IP network. .PP Assume your machine has been given the IP address .B 192.168.0.13 by your service provider. Let's choose another address on that network, .B 192.168.0.1 for instance. (You can use the address of the SLIP gateway if you want to make it look pretty, but it doesn't really matter, anything "out there" is ok.) To make Minix aware of the situation you have to configure the pseudo IP network. For Minix-vmd you need to look for the .B if-then-else-fi code in .B /usr/etc/rc that tests if .B /etc/rc.net should be run. Copy the lines in the .B else clause that starts network daemons to .B /etc/rc.net and add the following lines to make it look like this: .PP .RS .nf # My SLIP interface address. ifconfig -h 192.168.0.13 -n 255.255.255.0 .SP # Standard network daemons. daemonize rarpd $named irdpd rip inetd .SP # Default route to the outside world. add_route -g 192.168.0.1 .fi .RE .PP For standard Minix one has to edit .B /etc/rc instead at the point of the XXX comments. The .B ifconfig goes at the first XXX, the .B add_route at the second XXX. The result is conceptually the same as the example above. The important thing is the order: Configuration, Daemons, Routes. (First give addresses to the networks, let the daemons meditate over the results and possibly configure more networks (rarpd), then add routes to the configured networks.) .PP Just one thing left to do. The system uses the first ethernet network .RB ( eth0 , .BR ip0 , .BR tcp0 , and .BR udp0 ) as the default network. With the program .BR netdefault (8) you have to change the links to the default devices .RB ( eth / psip , .BR ip , .BR tcp , and .BR udp ) to point to the first pseudo IP network .RB ( psip2 , .BR ip2 , .BR tcp2 , and .BR udp2 ): .PP .RS .B "netdefault psip2" .RE .PP In .B /etc/hosts list at least .B localhost and the name of your machine with its SLIP address. This way your machine will boot and know its own name. Now you need to find a way to let your system know the addresses of other machines. There are three ways: .PP .RS List the names and addresses of any other machine you wish to talk to in .BR /etc/hosts . Drawback: This will quickly become a pretty long list. .SP Create an .B /etc/resolv.conf that lists a nameserver at your ISP and .B 127.0.0.1 (localhost). Drawback: With the SLIP link down it takes 5 to 10 seconds for a name lookup to time out on the remote name server before the local name server is tried. .SP Install the above .B /etc/resolv.conf when .B slip is started, and remove it when .B slip exits. Drawback: Long running programs only read .B /etc/resolv.conf at startup, so they don't notice it changing. .SP Run a real Internet name daemon from the .B named package. Drawback: Nontrivial to set up. .SS "Configuration for a SLIP - Ethernet router (simple case)" XXX .SS "Configuration for a SLIP - Ethernet router (complex case)" XXX .SH FILES .TP \w'/dev/psip*'u+5n .B /dev/psip* Pseudo-IP devices for use by .BR slip and .BR ppp . .SH "SEE ALSO" .BR boot (8), .BR inet (8), .BR netdefault (8), .BR term (1), .BR chat (1). .SH BUGS .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH SHUTDOWN 8 .SH NAME shutdown \- graciously close the system down .SH SYNOPSIS .B shutdown .RB [ \-hrRmk ] .RB [ \-x .IR code ] .RI [ time-specification .RI [ message ]] .SH DESCRIPTION .B Shutdown is a program which allows a system operator to close down the system in an nice way. .B Shutdown informs the users why and when the system is going down. This warning is issued 10 minutes before shutdown time and every minute in the last 5 minutes. At this time (5 minutes), .B shutdown creates a file .B /etc/nologin to prevent new users from logging in. .PP .B Shutdown keeps a logfile of shutdowns. Every shutdown is registered in .BR /usr/adm/wtmp , if this file exists, and by .BR syslog (3) (level .BR auth . notice ). After these actions, a call is done to .BR reboot (2) which actually brings the system down. .PP .I Time-specification may be something like .BR 15:00 , .BR 15.00 , .BR +15 , or .B now for a shutdown at 3pm (twice), 15 minutes from now, or immediately. .PP The message may be used to describe why the system is going down, it may also be typed on standard input with the .B \-m option. .SH OPTIONS .TP .B \-h This flag prevents the system from rebooting after the shutdown. The system can now be powered off. This is the default. .TP .B \-r This flag indicates that the system should reboot after shutting down. .TP .B \-R Reboot the system by resetting it. Normally the kernel will try to return to the Boot Monitor. With .B \-R the system will receive a hardware reset. .TP .BI \-x " code" Halt the system and let the Monitor execute the given code as if typed at the monitor prompt. You can for instance use .B "\-x 'boot hd0'" as a very fast way to reboot "from the top." .TP .B \-m Allows the operator to type a shutdown message on standard input, that will be added to the messages displayed on all terminals. .TP .B \-k This option gives the possibility of terminating an already started shutdown. This is only possible if shutdown time has not yet arrived. .TP .B \-C Check if the system crashed. This option is not used at shutdown time, but at reboot time. It tells if the file systems should be checked by testing if the last entry in the wtmp file is a shutdown entry. (A crude replacement for a file system clean flag.) .SH "SEE ALSO" .BR reboot (2), .BR syslog (3), .BR halt (8), .BR boot (8). .SH AUTHOR Edvard Tuinder (v892231@si.hhs.NL) .TH SLIP 8 .SH NAME slip \- Serial Line IP .SH SYNOPSIS .B slip .I pseudo-ip-device .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. The .B slip program implements an Internet network connection over a bidirectional 8-bit transport, usually a serial line. The protocol used for this connection is the Serial Line Internet Protocol, SLIP for short. .PP The .I pseudo-ip-device argument names one of the .B /dev/psip* devices that is offered by the Minix TCP/IP driver .BR inet (8). The .B slip program reads IP packets from standard input and writes them to the pseudo IP device, and reads packets from the pseudo IP device and writes them to standard output. A typical use is like this: .PP .RS .B "slip /dev/psip2 /dev/tty01" .RE .PP The SLIP protocol is just a very simple packet framing protocol. It defines two characters as markers on a byte stream to frame packets. SLIP does not implement any higher level addressing, error detection, or compression. Thanks to its simplicity it can be used under Minix, any other system would prefer to use the Point-to-Point protocol: PPP. .PP The SLIP packet framing protocol as defined in RFC-1055 is as follows: .IP "\-" Packets are delimited by an END character, octal 300. END is often send at the start of a packet too to reset the logic of the receiver, so that random noise isn't added to the beginning of a packet. .IP "\-" An ESC character (octal 333) is used to escape any END or ESC characters that may occur in an IP packet. END and ESC are changed to ESC 334 and ESC 335 in the data stream. (Note that END doesn't occur within the data stream at all by escaping it this way, making finding the framing END easier.) .ig .PP The manual page .BR serial-ip (8) describes how to configure the Minix network devices to be used with a serial IP connection. .. .SH FILES .TP \w'/dev/psip*'u+5n .B /dev/psip* Pseudo-IP devices for use by .BR slip . .SH "SEE ALSO" .ig .BR ppp (8). .br .. .BR RFC-1055 . .SH NOTES Under Minix .B slip forks in two to handle the two data streams in or out of the serial line. Under Minix-vmd it uses asynchronous I/O to handle the two streams within one program. .SH AUTHOR Kees J. Bot .TH SRCCRC 8 .SH NAME srccrc \- compute CRC checksums of the entire source tree .SH SYNOPSIS \fBsrccrc\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH OPTIONS .SH EXAMPLES .SH DESCRIPTION .PP \fISrccrc\fP traverses the entire /usr/include and /usr/src tree to run the crc command on all files found. The result is a long list of filenames with their checksums. The filenames are relative to /usr. .PP The command makes an effort to remove most junk files such as .o, .bak and files in bin directories. It cannot find single binaries however, so you will have to run \fBmake clean\fP in /usr/src to be able to make a crc list that contains only source files. .PP Two crc files can be compared easily with the \fIdiff\fP command. A crc list of the original source tree can be found in /usr/src/crclist. .SH "SEE ALSO" .BR crc (1). .TH SYNC 8 .SH NAME sync \- flush the cache to disk .SH SYNOPSIS \fBsync\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "sync" "Write out all modified cache blocks" .SH DESCRIPTION .PP \s-2MINIX\s+2 maintains a cache of recently used disk blocks. The .I sync command writes any modified cache blocks back to the disk. This is essential before stopping the system, and should be done before running any .I a.out program that might crash. .SH "SEE ALSO" .BR sync (2), .BR update (8), .BR shutdown (8). .TH UPDATE 8 .SH NAME update \- periodically write the buffer cache to disk .SH SYNOPSIS \fBupdate\fR .br .de FL .TP \\fB\\$1\\fR \\$2 .. .de EX .TP 20 \\fB\\$1\\fR # \\$2 .. .SH EXAMPLES .EX "update &" "Start a process that flushes the cache" .SH DESCRIPTION .PP When the system is booted, .I update is started up in the background from .I /etc/rc to issue a \&SYNC system call every 30 sec. .SH "SEE ALSO" .BR boot (8). .TH USAGE 8 .SH NAME usage \- installing and using MINIX .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .de XB \" An example in bold print. .RS .nf .ft B \&\\$1 .ft R .fi .RE .. .de 3A \" Three Letter Acronym at 1 point size smaller. \&\\$3\s-1\\$1\s+1\\$2 .. .de 3B \" TLA in bold. \&\\$3\fB\s-1\\$1\s+1\fR\\$2 .. This manual page describes the installation and use of MINIX from a System Administrators point of view. It contains an installation guide, instructions on how to do the initial configuration and some other info. Please read this document entirely before attempting to install MINIX. The installation steps are in the proper order, but not all the information you may need is presented at the right moment. Other detailed information that may be useful can be found in .BR boot (8), .BR hier (7), and in .BR dosminix (8) if you run MINIX under DOS. .SS "1. MINIX UNDER DOS" Installation of MINIX to run under DOS is a nonevent. Chances are, you are reading this manual page from an already running MINIX system, but if not then the setup goes like this: .PP Unpack the DOSMINIX.ZIP file using one of the popular ZIP utilities, such as PKZIP or WinZIP. Next reboot Windows and hit F8 just when you see the "Booting Windows" message. From the menu that appears choose "Command prompt only", or if that doesn't work "Safe mode command prompt only". Under Windows Me you can use a startup disk to boot the PC into DOS. Move to the directory containing the MINIX files and type: .PP .XB "boot minix.mnx" .PP Type '=' and presto, you are running MINIX. Most of the rest of this manual, which deals mainly with running MINIX in a true hard disk partition, does not apply to you. Your system is already installed completely, with all binaries and sources present, so all the talk about getting MINIX on your disk can be skimmed over. Pay attention again when the focus shifts to the configuration of the system. Section 9 is where this happens first. (The main challange to a DOS installation is to figure out which parts of the installation manual do not apply.) .SS "2. REQUIREMENTS" The minimum system MINIX can be installed on comfortably is an IBM PC/AT or PS/2 with a 286 processor, 2 MB memory, a 720 kb diskette drive, and 35 MB free space on an AT, ESDI, or SCSI hard disk (the latter controlled by an Adaptec 1540.) MINIX for the 386 (MINIX-386 for short) can be installed on a machine with at least a 386sx processor, 3 MB memory and at least 35 MB of disk space. .PP The minimum system MINIX can be installed on .BR un comfortably is an IBM PC/XT with 640 kb memory. MINIX-386 can more or less run in 2 MB memory. See sections 16 and 17 on "low memory" issues. .SS "3. MINIX INSTALLATION BACKGROUND" The objective of the installation is to create a partition on your disk and to put MINIX into it. MINIX really requires at least two partitions however, so the single "primary" partition is split into two or three subpartitions. The .B s0 subpartition will contain the root file system, the .B s1 subpartition may optionally contain swapspace, and the .B s2 subpartition will contain the .B /usr file system. What Windows calls "drives", i.e C:, D:, E:, MINIX calls "file systems". MINIX does not use drive letters, but requires that one file system is made a part of another file system by "mounting" one on the other. The "root" file system is always present and starts with the directory "/", the root of the directory tree. The root file system contains a few programs in .BR /bin , device files in .BR /dev , and configuration files in .BR /etc . This is just enough to get the system started. MINIX will soon extend its directory tree by mounting a file system on the .B /usr directory. What is henceforth known as the /usr file system contains all MINIX programs in .BR /usr/bin , file system sources in .BR /usr/src , etc, etc. The \s-2ROOT.MNX\s+2 image contains the complete MINIX root file system, but \s-2USR\s+2 contains just a small subset of the /usr file system, with just enough utilities to install MINIX. The complete /usr file system is split up into the \s-2USR.TAZ\s+2, \s-2SYS.TAZ\s+2 and \s-2CMD.TAZ\s+2 archives that are installed later to fill /usr. .PP Let's suppose your first hard disk, which has device name .BR /dev/c0d0 , has Windows already present in the first primary partition .RB ( /dev/c0d0p0 ), and some free space left after that. After MINIX is installed in that free space the disk will look like this: .PP .nf .in +4n .ta +\w'/dev/c0d0p1s0mmmm'u /dev/c0d0 Whole hard disk #0 /dev/c0d0p0 Windows C: drive /dev/c0d0p1 MINIX primary partition /dev/c0d0p1s0 MINIX root partition /dev/c0d0p1s1 MINIX swap partition (optional) /dev/c0d0p1s2 MINIX /usr partition .in -8n .fi .PP /dev/c0d0 is the sum of a partition table, /dev/c0d0p0 and /dev/c0d0p1. Likewise is /dev/c0d0p1 the sum of a subpartition table, /dev/c0d0p1s0 and /dev/c0d0p1s2. Read the "DEVICES" sections for more information on MINIX devices. .SS "4. INSTALLATION" .ig \" Only relevant when on CD-ROM. If you have not already copied MINIX to floppy disks, please read the README.TXT file in the MINIX directory now, for it tells how to do this. You should also print out EXAMPLE.TXT and read it in parallel with this document. This one tells you what to do; that one shows you what the screen is supposed to look like at each step, so you can see if everything is OK. .PP .. You can install MINIX automatically or manually as described in the sections below. The end result is the same, but manual installation allows one to deviate from the preconfigured choices. You may wish to read the manual pages of the programs used below before you start. You may especially want to read .BR boot (8) if your machine is different from what the majority buys, because you may need to set a few boot parameters to configure drivers. To do this type .B ESC to get to the Boot Monitor prompt, set the appropriate variables, use .B save to store the settings and .B menu to continue where you left off. .PP To install the system you need two diskettes: a bootable root diskette and a diskette full of binaries to use as .BR /usr . These diskettes are named .B \s-2ROOT\s+2 and .BR \s-2USR\s+2 . These two diskettes may also be combined on a single high density diskette. In that case the \s-2USR\s+2 part is on the .B p2 partition. .PP Insert the \s-2ROOT\s+2 diskette, boot the machine and type '=' to the menu. The MINIX kernel is loaded and takes control when you see the copyright banner. After loading the root diskette into the RAM disk you will be asked to finish the name of the device to mount on .BR /usr . Type .BR fd0p2 for a diskette that contains both \s-2ROOT\s+2 and \s-2USR\s+2, otherwise replace \s-2ROOT\s+2 by \s-2USR\s+2 and type .BR fd0 . Login as .BR root . .SS "5. AUTOMATIC INSTALLATION" Before starting the installation, you must either have a free partition available or have at least 35 MB not in any partition so you can create a MINIX partition. .PP Type .B setup to start the installation script. First it offers to install a national keyboard map. The names should be clear, except for .BR us-swap , which swaps the CTRL and CAPS LOCK keys of a standard US style keyboard for people who believe that the natural place of CTRL is next to A. The default suggested between [ and ] is the US standard keyboard. .PP The next thing to do is to make a partition, for this you are placed in a partition table editor named .BR part . This partition table editor is very easy to use (in the author's opinion), but you will probably hate it. You can move all over the place with the arrow keys, change values, and make a mess of your partition table real quick. So if you get into trouble, type 'q' to quit, 'n' to not write the table, and RETURN to start over. Use the '?' key to get help. .PP With the '+' and '\-' keys you can select the disk device to install on, probably .BR /dev/c0d0 , the first hard disk. Type 'r' to load the partition table of the selected disk. Either create one new partition by modifying a partition marked "None", or reuse an existing partition by changing its type to "MINIX" (hex code 81). D%%%%%%%%%%%%%%%%%%%%%%%%%%%O NOT use part to shrink an existing partition! It will destroy all data in that partition. MINIX needs a partition of at least 20 MB, but not larger than 128 MB (MINIX-86) or 1 GB (MINIX-386). The system needs 35 MB in compiled state. .PP The script then wants to know the name of the partition you've created. The partition name is probably still visible on the screen. Combined with the drive name you have to type c0d0p1, c0d2p0 or something. .PP The next question is the amount of swapspace you want to give MINIX. There will be a suggested value based on the amount of memory your system has. If you have more then enough memory then don't bother with swap. MINIX doesn't handle it very well yet, or ever, only memory starved systems need it so that .B "make world" can run. .PP The new partition table is reloaded into the disk driver, and the new MINIX partition is carved up into two or three subpartitions, a 1440 kb root, maybe some amount of swap, and the rest for /usr. .PP After making /usr, it is immediately put to use to replace the installation /usr file system so that you can remove the \s-2USR\s+2 diskette and insert the \s-2ROOT\s+2 diskette (unless they are one and the same). The root file system is filled with the contents of the \s-2ROOT\s+2 diskette and slightly patched up to work on the hard disk (/etc/fstab.) .PP You can now skip the next section and move to "TESTING", but it may be instructive to read it anyway. .SS "6. MANUAL INSTALLATION" The instructions that follow are at a very low level and require you to be very careful. The big advantage is that you know precisely what tools have been used and how everything works. The disadvantage is that you may easily make a mistake that either forces you to start over if you are lucky, or wipes out the contents of your hard disk if you are not. Only if you really want to do something different should you use a manual installation. Slavishly following the steps shown below will only make you end up with the same result as an automatic installation. .PP Run .B part to make partitions to load the system into. The best thing to do is to make one large primary partition of type "MINIX" and to carve this partition up into three subpartitions for root, swap and /usr. The assumption is that you will use the second partition on the first hard disk, .BR /dev/c0d0p1 , and that .B c0d0p1s0 is the root subpartition, .B c0d0p1s1 is swap and .B c0d0p1s2 is /usr. If you want to use the first partition on the second hard disk for instance, then substitute c0d1p0 and c0d1p0s[012] for the above. See the section on devices below, and the manual pages of .BR part (8) and .BR controller (4). Start .B part and select the disk that you want to install MINIX onto. In our example it will be .BR /dev/c0d0 . .PP Use .B part to make a single partition in the primary partition table of type "MINIX", then hit '>' on this new partition to make a subpartition table. .PP For the root subpartition you are advised to use 1440 kb exactly. You can make it larger if you want to, but it is advisable never to let the contents outgrow a floppy. (The \s-2ROOT\s+2 diskette is a copy of a root file system, and will be used to fill your root subpartition.) .PP The second subpartition is for swapspace. You can use it to enlarge the amount of total memory (real + swap) if your system has less than 2M (16-bit mode) or 4M (32-bit mode). Note that only one MINIX swap partition is needed on your system, so if you have another MINIX partition then you can use its swap partition instead. .PP Use the rest of the partition for .BR s2 , the /usr subpartition. .PP When you are done check that /dev/c0d0p1s0 is active (the * after the partition number) so you can boot from it later. .PP If your disk has bad blocks then don't put the root or swap subpartition on top of them. Make sure the inode tables in the other partitions don't have bad blocks either. You can put the subpartitions out of order on the disk if that helps. Subpartition tables, unlike the main partition table, are not sorted by the driver. .PP After making the partitions you do not have to reboot. The disk driver reloads the partition tables on the next access if the disk is not in use. (Open or mounted.) .PP To be able to boot from /dev/c0d0p1s0 you must place a master bootstrap in /dev/c0d0p1. It has been placed there by .B part if it told you that it was creating a new partition table, but .PP .XB "installboot\0\-m\0/dev/c0d0p1\0/usr/mdec/masterboot" .RE .PP will put it there for sure. .PP Let's start by initializing the swap partition first, if you allocated one. We may need it already, so mount it. .PP .XB "mkswap\0/dev/c0d0p1s1" .XB "mount\0\-s\0/dev/c0d0p1s1" .PP Next make a file system for on-disk /usr and copy the floppy /usr on to it. .PP .XB "mkfs\0/dev/c0d0p1s2" .XB "readall\0\-b\0/dev/c0d0p1s2 | sh" .XB "mount\0/dev/c0d0p1s2\0/mnt" .XB "cpdir\0\-v\0/usr\0/mnt" .PP This will create a file system on /dev/c0d0p1s2, mount it on /mnt, and copy the contents of the \s-2USR\s+2 floppy onto it. The call to .B readall marks bad blocks on the file system as unusable, you can omit this on a drive known to be spotless (\s-2IDE\s+2 or \s-2SCSI\s+2.) .PP You can now use the new /usr in place of the \s-2USR\s+2 floppy: .PP .XB "umount\0/dev/c0d0p1s2" .XB "umount\0/dev/fd0\0\0\0\0\0\0\0\0\0# fd0p2 if combined" .XB "mount\0/dev/c0d0p1s2\0/usr" .PP This little dance has freed up your floppy drive, so please remove the \s-2USR\s+2 diskette and replace it by the \s-2ROOT\s+2 diskette. Make a file system for the root with at least 512 inodes (files), and fill it from the floppy: .PP .XB "mkfs\0\-i\0512\0/dev/c0d0p1s0" .XB "mount\0/dev/fd0\0/fd0" .XB "mount\0/dev/c0d0p1s0\0/mnt" .XB "cpdir\0\-v\0/fd0\0/mnt" .XB "umount\0/dev/fd0" .PP Remove .B /mnt/etc/issue to get rid of the "use setup" message that greets you when you boot, and edit the file .B /mnt/etc/fstab to name the devices MINIX has been installed on. In our example it should look like this: .PP .XB "root=/dev/c0d0p1s0" .XB "swap=/dev/c0d0p1s1" .XB "usr=/dev/c0d0p1s2" .PP Unmount the new root: .PP .XB "umount\0/dev/c0d0p1s0" .PP Make it bootable: .PP .XB "installboot\0\-d\0/dev/c0d0p1s0\0/usr/mdec/bootblock\0boot" .PP The automatic script would now set the .B rootdev and .B ramimagedev boot variables. You can do this now using the .B edparams command, but it is easier to postpone it until the testing phase. The settings should be: .PP .XB "rootdev=c0d0p1s0" .XB "ramimagedev=c0d0p1s0" .SS "7. TESTING" By now a new MINIX system is present on your hard disk. Time to see if it works. Leave the \s-2ROOT\s+2 diskette in the drive and type .BR halt . You are now going to use the power of the Boot Monitor on the diskette to boot the MINIX partition on the hard disk. Use the monitor command .B boot c0d0p1 to boot the primary partition MINIX has been installed in. (It is "c0d0p1" in our example.) .PP The hard disk bootstrap is now showing the menu again. You can type '=' to start MINIX, but you probably want to change the boot parameters. Hit .B ESC once more to get to the command prompt. The command .B set shows what the current parameters are. Here is an example that shows how to make a menu to either start MINIX or boot Windows: .PP .XB "minix(=,Minix)\0boot" .XB "win(w,Windows)\0boot\0c0d0p0" .XB "save" .PP Windows is assumed to be in the first partition in the example above (c0d0p0). When finished type .B menu to see if the menu looks right. If so hit '=' to start MINIX. Log in as root. .SS "8. ADDING PROGRAMS AND SOURCES TO /usr" The .B setup command can also be used to add files from floppy sets to the system. The .B \s-2USR.TAZ\s+2 (programs and stuff), .B \s-2SYS.TAZ\s+2 (system sources), and .B \s-2CMD.TAZ\s+2 (commands sources) are all installed relative to the .B /usr directory, so the command to use three times is .PP .XB setup\0/usr .PP .B Setup will ask for the size of data on the floppies, which is by default simply the entire floppy. You will see some "Cannot make directory" errors while extracting, as some directories already exist. Ignore these messages. You need the .B \s-2USR.TAZ\s+2 set if you want a working MINIX system, .B \s-2SYS.TAZ\s+2 if you want recompile the system or study it, and .B \s-2CMD.TAZ\s+2 if you also want the sources of the commands. On a disk space starved machine you could opt to do without the commands sources, as they are not absolutely necessary to understand MINIX. .PP If your machine does not have enough memory to run .B setup\0/usr then type these commands manually: .PP .XB "cd\0/usr" .XB "vol\0/dev/fd0 | zcat | tar\0xvfp\0\-" .PP If .3B USR.TAZ is already present on the hard disk in an .3A DOS or Windows partition, then this command can be used under MINIX-386 to extract it to avoid the floppy detour: .PP .XB "cd\0/usr" .XB "mtools\0copy\0c0d0p0:USR.TAZ\0\- | setup\0/usr" .PP In 16-bit mode you don't have mtools, but maybe dosread will work: .PP .XB "cd\0/usr" .XB "dosread\0c0d0p0\0USR.TAZ | setup\0/usr" .PP The file doesn't have to be in the root directory of .BR c0d0p0 , of course, .B "c0d1p0:/TMP/USR.TAZ" would name a file on the first partition of the second hard disk in the directory .BR \eTMP . .PP The /usr file system can also be filled through a network from a remote host if MINIX if you can get networking going with the NET.TAZ supplement. Use .B "setup\0/" to install NET.TAZ (note that it goes into / instead of /usr), then follow the instructions in .BR boot (8) to configure TCP/IP and boot MINIX. There are now two ways to fill /usr. One is to add the host name and login name of a remote host and a remote user to .BR /.rhosts , as root, and to use the following command on the remote host: .PP .XB "rsh\0\-l\0root\0\fIminix-box\fP\0setup\0/usr\0< USR.TAZ" .PP Two is to use .B urlget to copy the data directly from a Web or FTP site by using these commands under MINIX: .PP .XB "cd\0/usr" .XB "urlget\0\fIurl\fP.../USR.TAZ | setup\0/usr" .PP The sources may be installed using exactly the same commands, but with .3B USR.TAZ replaced by .3B SRC.TAZ . Note that this means that the sources must also be extracted relative to .BR /usr . .SS "9. NAMES" A standalone machine will have to be given a name. As .B root type .PP .XB "echo\0\fIname\fB\0>/etc/hostname.file" .PP to change the host name of your machine to .IR name . .SS "10. ACTIVE ON BOOT" You may want to make the MINIX partition active so that it is automatically booted. With Windows .B fdisk or MINIX .BR part , mark the primary partition that contains MINIX active. Using the menu you made earlier you can boot either MINIX or Windows at a keypress. You can even set timeouts. To boot MINIX automatically after 5 seconds: .PP .XB "main()\0{trap\05000\0minix;\0menu}" .PP See .BR monitor (8) for all the details on the monitor. .PP If you don't trust this then you can rig up a diskette that boots the MINIX partition when left in the drive: .PP .XB "installboot\0\-m\0/dev/fd0\0/usr/mdec/jumpboot\0010" .PP The numbers 010 indicate the device (disk or partition) that must be booted, i.e. .B /dev/c0d0p1s0 in this example. Take the name of the device, and use the disk, partition and subpartition numbers, or less. So c0d1p2s0 -> 120, c0d3 -> 3, c0d2p0 -> 20.) .SS "11. DEVICES" A crash course on the MINIX devices in .BR /dev : The first two hard disks are named .BR c0d0 and .BR c0d1 . These devices address the entire hard disk, from the first to the last byte. Each disk has four partitions, for disk 0 they are .BR c0d0p0 , .BR c0d0p1 , .BR c0d0p2 , and .BR c0d0p3 . And for disk 1 they are named .BR c0d1p0 to .BR c0d1p3 . These partitions may contain file systems, .B c0d0p0 often contains the .3A MS-DOS or Windows "C:" file system. MINIX can use these partitions for file systems too, but you can also partition one of these "primary partitions" into four so-called "subpartitions". The subpartitions of .B c0d0p0 are named .BR c0d0p0s0 , .BR c0d0p0s1 , .BR c0d0p0s2 , and .BR c0d0p0s3 . The other partitions may have four subpartitions that are named in the same way. See .BR controller (4) for an elaborate description. .PP You may need to add devices to .BR /dev , because not all devices are present to keep down the clutter. The command .3B MAKEDEV knows how to make devices, and .3B DESCRIBE can tell you what an unknown device may be, or even what all devices in .B /dev may be if called without arguments. Devices are described in .BR dev (4), with pointers to more specific pages. .SS "12. EDITORS" The editors available are .B elvis (a .B vi clone), .B elle (a simple .B emacs clone), and the old MINIX .B mined editor. Of these editors only elvis can recover your file after a system crash. Only .B mined is available at installation time. (All you need to know about mined right now is that CTRL-X gets you out of it.) .SS "13. BOOT MONITOR VS. MINIX" The Boot Monitor uses the .3A BIOS to address disks, so it has no idea of controllers, it just lumps everything together and ignores controller numbers. So what the monitor thinks are .BR d0 , .BR d1 , and .BR d2 , may be .BR c0d0 (IDE primary master), .BR c0d2 (IDE secondary master), and .BR c1d3 (SCSI disk at target 3). One must keep this in mind when MINIX is installed on a disk other than the very first. So if MINIX is installed in the third partition of the SCSI disk, then .B "boot d2p2" will boot it, and .B "rootdev=c1d3p2s0" will tell MINIX where its root file system is. .SS "14. NATIONAL KEYBOARDS" The directory .B /usr/lib/keymaps contains keymap tables for several national keyboards. If you have a German keyboard for instance, then .PP .XB "loadkeys\0/usr/lib/keymaps/german.map" .PP will load the German key translation table into the keyboard driver. Copy the map to .B /etc/keymap once MINIX is installed on the hard disk, because having to type a key sequence like one of these: .PP .XB "loadkezs\0\-usr\-lib\-kezmaps\-german.map" .XB "loqdkeys\0=usr=lib=key,qps=french.,qp" .PP on a reboot gets a bit annoying after a while. Send corrections and new keymaps to the person named below. (Do not send a Dutch keymap, buy yourself a real keyboard instead.) .SH SUGGESTIONS Below are a few useful suggestions. Some of the information can be of use in other situations than described here. .SS "15. VIRTUAL CONSOLES" Hold down the ALT key and press the left or right arrow key, F1, or F2. This switches the console between two login sessions. (Unless you have an old mono adapter, because virtual consoles sit in video memory, and a mono adapter only has memory for one.) .PP Note that kernel messages, including function key output, only appear on the first console. This may be confusing, but it keeps the other consoles clean. .SS "16. LOW ON MEMORY" The normal installation requires that you have enough memory for a large RAM disk. You can still install MINIX normally if you either have a high density diskette drive for a combined root+usr floppy, or you have two floppy drives of at least 720 kb. Before booting you have to set the variable .B rootdev to the same value as .BR ramimagedev . This is slower then a RAM disk, but saves a lot of memory. .PP The automatic installation script knows how to handle this new situation. If you install manually then you have to use .PP .XB "cpdir\0\-vx\0/\0/mnt" .PP to copy the root device to disk. When it is time to fill /usr and you only have one floppy drive then hit DEL to get out of the installation script and reboot as described in "TESTING". You can then finish the installation manually. .ig See the XT640K.TXT file for more advice on small machines. .. .SS "17. LOW ON MEMORY AND ONLY ONE 720 KB FLOPPY DRIVE" If you only have one 720 kb floppy drive and your system is low on memory then you can use the \s-2TINYROOT.MNX\s+2 boot image. This image contains a small kernel with only the BIOS disk driver, and a small root file system. You can use this disk to boot your machine. Use the normal \s-2ROOT.MNX\s+2 to install the root file system. Keep booting your machine with \s-2TINYROOT\s+2 until you have compiled a small kernel for your system. Use the .B rootdev boot variable to select the hard disk root file system. Do .B not use \s-2TINYROOT\s+2 for anything other than booting, always use \s-2ROOT\s+2 when mentioned. .SS "18. FLOPPY DRIVE 1 IS A HIGH DENSITY DRIVE" If you would like to install from floppy drive 1 then you need to copy at least one sector from the \s-2USR\s+2 image onto a diskette for drive 0. The \s-2USR\s+2 bootstrap has been rigged to boot the other drive. .SS "19. INSTALLING ON A SECOND HARD DISK" MINIX doesn't care if it is installed on the second disk of a system with two disks. The only problem is to get it booted. You can either rig up a diskette to boot MINIX as shown earlier, or you can use the same trick on the first disk. The command .PP .XB "installboot\0\-m\0/dev/c0d0\0/usr/mdec/jumpboot\01" .PP will lock the first disk into booting the second disk. Note that this command modifies the disk outside a MINIX partition, overwriting a bit of code that has likely been put there by Windows fdisk. First verify that the Boot Monitor can boot a Windows partition, because then the MINIX master bootstrap can do it too. .SS "20. LOTS OF MEMORY ON A 286" You will have a hard time making MINIX use up 3 MB memory. Memory you can spare can be used for a "second level block cache" on the RAM disk. The File System uses the second level cache to store copies of disk blocks that are pushed out of the normal (primary) block cache. The size of the primary cache is compiled into the FS server, but the size of the second level cache can be set with the .B ramsize boot variable. Set it to a number between 0 and 512. 512 kilobytes is enough to keep most of the compiler cached. .SS "21. LOTS OF MEMORY ON A 386+" Processes can be as big as you would like on a 386, but in practice 4 MB is a lot, and 8 MB is infinite. The installation script sets up a second level cache for MINIX-386 of up to 1024 kilobytes. This is because the default file system cache is only 80 kb. Your first point of call is to get rid of the poorly performing second level cache by setting .B ENABLE_CACHE2 to 0 and to assign the memory used by it to the normal block cache by enlarging the appropriate .B NR_BUFS and .B NR_BUF_HASH constants in with as much as you can spare. (1024 for NR_BUFS is the minimum to keep .B "cc \-c" cached. 2048 is then a nice value for NR_BUF_HASH.) Disable the second level cache, compile a new kernel, reboot and set .B ramsize to 0. .SS "22. LOTS OF DISK SPACE" The maximum file system size is 1 GB for MINIX-386 and 128 MB for MINIX-86. (MINIX-86 can handle larger file systems, but .B fsck can't check them.) Note that a MINIX file system can only contain 65535 inodes (files), so the average file should be 16 kb to completely fill it. It may be better to make two smaller file systems. Besides, fsck takes forever on a large file system. .SH SYSTEM ADMINISTRATION The system has been set up with the idea that working as root is a bad thing to do. As root you are in no way protected from doing stupid things. So don't do development as root, but work as .BR bin ! Only in exceptional cases do you want to become root. Being root is fun for wannabe hackers; administrators know better. .PP To make life easier for bin, some programs like .BR su (1), .BR install (1) and .BR shutdown (8) treat bin and other members of the operator group as special and allow them the privileges of root. (One is an operator if one's group id is zero.) Operators should share the shadow password of root by having .B ##root in their password field. This way they all have one face (password) to the outside world, forming no greater security risk than root alone. .PP The home directory of bin contains one important Makefile. You can use it to recompile all the commands and libraries of the system. Type .B make to see the usage message. If you want to compile just one command then you can simply type .B make to do so. To put it in its proper place you have to type .BR "make install" . Read the Makefiles in the .B commands and .B lib subdirectories to understand how everything is put together. If you are tight on memory then .B make may fail to traverse down the source tree and also compile things. You will have to type .B make in each subdirectory. You can run make in /usr/src at the end to see if you've missed something or not. .PP The shell used by MINIX is a minimal version of .BR ash , the BSD shell. It has been modified to offer simple line editing using the .BR editline (3) library. .PP The kernel is not compiled from the master Makefile. To make a new kernel you have to step into the .B tools directory. There you can run four different make commands: .PP .TP .B make This makes all the different kernel parts and combines them in the file named .BR image . .TP .B make fdboot As above and then makes a boot floppy that you can use to restart your system with. You are prompted for the floppy device name. .TP .B make hdboot First makes the image file and then copies it into the directory .BR /minix . If there are already two images in that directory then the newest image will be removed to make space for this newer image. It is assumed that the oldest image is the most stable system image, one that always works, and that the newest image is experimental. Check beforehand what .B /minix contains before you run .BR "make hdboot" . Remove the oldest image if you want another image to become the stable image. The Boot Monitor chooses the newest image in .B /minix to boot. You can use the monitor command .B ls minix to view the images present, and set the .B image variable to the full name of the image you want to use instead if the newest doesn't work. The images in .B /minix are named using the MINIX release and version numbers with an extra revision number added to distinguish the images. .PP The first new kernel you would like to make is one configured for your system. The kernel you are running now contains several drivers you don't need, or may be missing drivers that you might want. In you can find a number of .BI ENABLE_ XXX variables that can be set to .B 0 to exclude, or .B 1 to include a particular driver. The full list of configurable parameters and what they do are described in .BR config (8). It is invaluable in figuring out what to change and how in . .PP Configuring a new kernel is sometimes not enough to enable new devices, you sometimes need to use the .B MAKEDEV command to make new device files in .BR /dev . For pseudo-ttys you also have to check if .B /etc/ttytab mentiones the new devices. .PP New additions to the system can be made in the .B /usr/local tree. An empty directory tree has been set up for you and binaries and manual pages are already in the search paths. You can make a new user entry with the .B adduser command. .PP The .B TZ variable in .B /etc/profile tells the time zone offset from the wall clock time to GMT. You have to change it for your time zone. (See .BR TZ (5).) .PP The function keys produce debug dumps, showing various interesting data about the system. F1 lists processes and F5 shows ethernet stats, which may be of use now. Read .BR console (4) to know all the details of the screen and keyboard. .SS "23. SYSTEM SHUTDOWN" You can't just turn a MINIX system off. MINIX must be told to flush the modified data in the file system cache first. The following commands/keystrokes can be used to exit MINIX properly: .TP .B shutdown First alert all users and then all processes of the impending shutdown then halt or reboot the system in one of various ways. See .BR shutdown (8). .TP .B reboot / halt Alert all processes of the system shutdown then reboot or halt. .TP .B \s-2CTRL\-ALT\-DEL\s+2 Halt the system by running .BR "shutdown \-h now" . .PP MINIX halts by returning to the Boot Monitor, MINIX reboots by instructing the monitor to reboot MINIX. (MINIX is just a subprocess to the monitor.) Either halt MINIX and use monitor commands to escape MINIX, or use .B shutdown \-R to reset the system. .PP When exiting MINIX running under DOS the Boot Monitor's .B exit command will return you to the DOS prompt. The Boot Monitor and MINIX are together just a pretty big DOS program as far DOS is concerned. .SH FILES .TP 12 .B /usr/ast Honorary home directory of Andrew S. Tanenbaum. Doubles as the place where the default setup for a new user is found. .SH "SEE ALSO" .BR dosminix (8), .BR monitor (8), .BR boot (8), .BR part (8), .BR mkfs (1), .BR mount (8), .BR M (8), .BR fstab (5), .BR hier (7), .BR config (8), .BR console (4), .BR dev (4), .BR adduser (8), .BR TZ (5), .BR mkdist (8), .BR shutdown (8). .br "Operating Systems \- Design and Implementation 2/e" by Andrew S. Tanenbaum and Albert S. Woodhull. .SH NOTES The notation .BI < file .h> refers to a C language include file in /usr/include. .PP .B Root and .B bin do not have the current directory in their program search path to avoid executing programs left around by malicious people. This means that to run .B foo from the current directory, .B ./foo must be typed. .SH BUGS There are many PS/2 models, all different. Some will run MINIX, some won't, some crippled if you lie to MINIX by setting .B processor to .BR 86 . Almost no PS/2 has a standard disk, so setting .B c0 to .B esdi or .B bios will be necessary. .PP Except for the floppy driver, none of the DMA based drivers know about DMA being limited to a 24 bits address, i.e. the first 16 MB. So under MINIX-386 you run a slight risk that a .B tar or .B dd command may use a buffer above 16 MB for reading or writing to a character device. This only happens if the low 16 MB is taken by some huge processes, and you have more than 16 MB, of course. .SH AUTHOR Kees J. Bot .TH INTR 8 .SH NAME intr \- run a command with interrupts enabled .SH SYNOPSIS .B intr .RB [ \-d ] .RB [ \-t .IR seconds ] .I command .RI [arg "...]" .SH DESCRIPTION .B Intr executes a command with keyboard interrupts enabled, and standard input, output and error redirected to the terminal or the console. It may also be used for the opposite: to detach a process from the terminal. .PP There are three situations where intr may be used: From a process that has no controlling tty, like the shell running .B /etc/rc at boot time, from a script that runs in the background, or by the System Administrator to restart a daemon. .PP In the first case .B intr will use .B /dev/console as a controlling tty and as standard input, output and error. In the second case .B intr will use .B /dev/tty to connect the command to the controlling tty. In the third case the process will be removed from the process group, and will have I/O redirected to .B /dev/null as input, and .B /dev/log for output. .SH OPTIONS .TP .B \-d Daemonize a process instead of bringing it to the foreground. Don't forget to use '&' to make the shell not wait for the process, because you won't be able to kill it with the interrupt key. .TP .BI \-t " seconds" Schedule an alarm to kill the process in the given number of seconds. Use it for a process that may wait indefinitely for a service that may not be available. .SH FILES .TP 20 .B /dev/console Main computer console. .TP .B /dev/log Message logging device. .TP .B /dev/tty Name for the controlling tty. .SH "SEE ALSO" .BR boot (8), .BR tty (4), .BR setsid (2), .BR alarm (2). .SH BUGS Maybe .B intr \-d should fork to daemonize a process, but the author likes it if the process stays in the jobs list of his shell. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH CLEANTMP 8 .SH NAME cleantmp \- clean out a tmp dir .SH SYNOPSIS .B cleantmp .RB [ \-d "[\fIlevel\fR]]" .RB [ \-i .IR file "] ..." .BR \-\fIdays\fB | \-f .RI [ directory " ...]" .SH DESCRIPTION .B Cleantmp removes all files in each of the given directories and their subdirectories that have not been accessed for at least .I 'days' days. Empty subdirectories are removed if their modified times are more than .I 'days' days old. .B Cleantmp looks at days as humans do, i.e. they last from midnight to midnight. Meaning that .B cleantmp -1 /tmp removes all files that were not touched after midnight last night. This may be very helpful, because in many cases that big file that clogs up .B /tmp was created yesterday, but less than 24 hours ago. .PP The 'days' flag may be replaced by .B \-f causing .B cleantmp to remove all files in the directory no matter what age. Specifying zero days doesn't work, because it is assumed to be a mistake. .PP .B Cleantmp knows that files and directories that have a name starting with a '.' are special and will not delete them or files within them if they are not at least 14 days old. .SH OPTIONS .TP 5 .BR \-d "[\fIlevel\fR]]" Set the debug level to .I level (by default 1). Normally only errors are reported. Debug level 1 lists the actions taken on standard error, level 2 also prints the file times used, and level 3 makes .B cleantmp playact, i.e. nothing is really removed. .TP .BI \-i " file " One or more .B \-i options name files to be ignored. Files are not removed if they are in the list of ignored files by either a directory entry match, or a full pathname match. This option is useful to keep things like named pipes that some longlived programs foolishly put in temporary directories. .SH "SEE ALSO" .BR find (1). .SH BUGS Don't use '\fBcleantmp -1\fP' shortly after midnight. .PP It would be nice if one could delete files that are, say, 2 hours old. .SH AUTHOR Kees J. Bot (kjb@cs.vu.nl) .TH DHCPD 1 .SH NAME dhcpd \- dynamic host configuration protocol daemon .SH SYNOPSIS .in +.5i .ti -.5i .B dhdpd .RB [ \-qar ] .RB [ \-t [\fIlevel\fP]] .RB [ \-d [\fIlevel\fP]] .RB [ \-f .IR configfile ] .RB [ \-c .IR cachefile ] .RB [ \-p .IR poolfile ] .RI [ host " ...]" .in -.5i .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Dhcpd is a client and a server for the Dynamic Host Configuration Protocol. As a client it collects DHCP data to configure the Ethernet networks with, and as a server it answers DHCP queries from other machines. .PP This manual page describes the operation of .BR dhcpd , the associated configuration file is described in .BR dhcp.conf (5). (The latter, together with .BR boot (8), is of more practical value when it comes to getting a machine's networks interfaces up and running. See the options section below for debugging DCHP problems.) .SS Initialization On a normal startup, i.e. none of the .BR \-q , .BR \-a or .BR \-r options are given, .B dhcpd determines what IP devices are present, and which of those are Ethernets. For each network it looks for information in the configuration file as if it were a server answering a query for that network. If any information is found then the IP address is configured and the information stored in the cache file. .SS "Client Operation" For each still unconfigured network a DHCP DISCOVER request is broadcast on that network. If a DHCP OFFER reply is received then a DHCP REQUEST is broadcast for the IP address offered, and if a DHCP ACK is received then the network is configured and the information stored in the cache file. .PP If no reply is received then another query is sent after 4 seconds, and then again after 8 seconds, doubling each time until 64 seconds. Every 64 seconds thereafter a request is broadcast until a reply is received. .PP Once configured the DHCP lease, rebind and renew times are computed. At the renew time a DHCP REQUEST is sent to the DHCP server to extend the lease. Normally we get an answer and refresh our information, but if no reply is received we wait for half the remaining time until the rebind time and keep retrying and halving the remaining time. When the rebind time is reached the DHCP REQUEST is broadcast to try and reach some other DHCP server. Halving the remaining time again and again until the lease expires. At that point we go back to square one and broadcast a DHCP DISCOVER. .PP If at any point a DHCP NAK is received we start over completely. After a DHCP OFFER an ARP request is transmitted just before the DHCP REQUEST to check if the address offered is already in use. If an ARP reply is received before the DHCP ACK then after the ACK we send a DHCP DECLINE to the server to tell that the address isn't what we want and again we start over. .SS "Router Discovery" The gateway offered by the DHCP server is made known to the TCP/IP server by sending an ICMP router advertisement to the local interface with a short lifetime and a low priority. Then up to three router solicitations are broadcast three seconds apart to look for a router. If a router answers with a router advertisement then we no longer worry about routing for that interface. Otherwise the router information is refreshed before it expires and another solicitation is sent out. This happens about twice an hour. .SS "Server Operation" When all networks are configured, or after about five minutes after startup the programs changes to server mode for those networks that have serving or relaying turned on. DHCP requests are answered if information for a client can be found in the configuration file, or if a free address can be found in the pool file, or if a client rerequests an address it already owns. .PP If a query can't (or shouldn't) be answered then the request is relayed to another server if so configured. .SS "Nothing more to do?" If the daemon finds out that all networks have an infinite lease (configured with a fixed address), there is no router information to keep warm, and it isn't a server then it simply exits. .SS "Asynchronous I/O?" Minix doesn't have the asynchronous I/O that Minix-vmd has, so under Minix the daemon only works with one network at a time. If it's stuck on the same network for 32 seconds then that network is closed and another network is tried for 32 seconds. This usually works ok as a client, but as a server it can only handle one network. .SH OPTIONS .TP .B \-q Read and print the cache and pool file contents, showing DHCP information for each network, and the IP addresses in the pool with lease times and current/last owners of those addresses. .TP .B \-a Add the named hosts (or IP addresses) to the pool file. .TP .B \-r Remove hosts from the pool file. .TP .RB [ \-t [\fIlevel\fP]] Set the test level (by default 1). At test level 1 all networks are seen as unconfigured, will not be configured and no data will be put in the cache. The program will just act as-if. At test level 2 the interfaces will not be configured from the configuration file, the data must come from a remote server. At level 3 the renewal, rebind and lease time will be 60, 120 and 180 seconds. At level 4 these times will be 60, 60, and 120. At level 5 these times will be 60, 60, and 60. These test levels are meant to debug the DHCP client code, and are best used with a high debug level. .TP .RB [ \-d [\fIlevel\fP]] Set the debug level (by default 1). At debug level 1 the program shows Ethernet and IP addresses as they are determined or configured, DHCP messages sent and received with little detail (one line per message), and memory use. At debug level 2 each DHCP packet is decoded and shown in detail. At debug level 3 device opens and closes are shown. The debugging level may also be increased by 1 at runtime by sending signal .BR SIGUSR1 or turned off (set to 0) with .BR SIGUSR2 . .TP .BI \-f " configfile" Names the configuration file, by default .BR /etc/dhcp.conf . .TP .BI \-c " cachefile" Names the cache file, by default .BR /usr/adm/dhcp.cache . .TP .BI \-p " poolfile" Names the IP address pool, by default .BR /usr/adm/dhcp.pool . .SH "SEE ALSO" .BR RFC-2131 , .BR RFC-1533 , .BR dhcp.conf (5), .BR hosts (5), .BR ifconfig (8), .BR inet (8), .BR boot (8), .BR inetd (8), .BR nonamed (8). .SH DIAGNOSTICS .TP "'/etc/dhcp.conf', line ..." The program exits on any configuration file error. You have to correct the error and restart the program. .TP "No lease set for address ..." There must be a lease time defined for addresses in the pool. Correct and restart the program. .TP "###### declines #.#.#.# saying '...'" A client with the given client identifier (usually 01 followed by the client's Ethernet address) declines an IP address, hopefully with a message telling why. This usually means that the IP address is already in use by another host. This program, acting as a client, will tell what other host in its message, but Windows has no additional info alas. .TP "Got a NAK from #.#.#.# [through #.#.#.#] saying '...'" The server with the given IP address doesn't want us to have or keep the IP address we were offered or are rerequesting. This could mean that the server has forgotten about us and has given our address to another machine. This is bad if our lease hasn't yet expired. There may be a relay involved, and there may even be a text message with precise information. .TP "#.#.#.# offered by #.#.#.# is already in use by #:#:#:#:#:#" We got an ARP reply for an offered address. We won't accept it, and send out a DECLINE when we get an ACK. .TP "DHCP packet too big, ..." You've got way to much information in the configuration file, more than fits in a minimum size DHCP packet. (Notify the author if you really need to send more information. He doesn't think anyone needs to.) .TP "Pool table is corrupt" You will have to remove and refill the pool file. Chaos may ensue if there are active clients and they don't use ARP to detect each other. (Most do.) .SH BUGS There is no randomization of timers. Modern systems don't blink under the load of several clients broadcasting a few packets in sync. .PP There is no extra time spent waiting for an ARP reply. I%%t is assumed that any IP stack will immediately respond, so that the DHCP server can't possibly beat it at sending out an ACK. (The DHCP server has to commit the lease to stable storage first anyway.) .PP Way more nonsense can be sent in a DHCP packet that Minix could do something with, but nobody does so we don't bother. .PP DHCP was invented by a rabid gerbil on speed. .SH AUTHOR Kees J. Bot c...das.9eawk.9fde.9gdis88.9helle.9ielvis.9jkermit.9km4.9lmined.9.\" unchecked (kjb) .CD "as \(en assembler" .SE "AS\(emASSEMBLER [IBM]" .SP 1 .PP This document describes the language accepted by the 80386 assembler that is part of the Amsterdam Compiler Kit. Note that only the syntax is described, only a few 386 instructions are shown as examples. .SS "Tokens, Numbers, Character Constants, and Strings" .PP The syntax of numbers is the same as in C. The constants 32, 040, and 0x20 all represent the same number, but are written in decimal, octal, and hex, respectively. The rules for character constants and strings are also the same as in C. For example, \(fma\(fm is a character constant. A typical string is "string". Expressions may be formed with C operators, but must use [ and ] for parentheses. (Normal parentheses are claimed by the operand syntax.) .SS "Symbols" .PP Symbols contain letters and digits, as well as three special characters: dot, tilde, and underscore. The first character may not be a digit or tilde. .PP The names of the 80386 registers are reserved. These are: .HS ~~~al, bl, cl, dl .br ~~~ah, bh, ch, dh .br ~~~ax, bx, cx, dx, eax, ebx, ecx, edx .br ~~~si, di, bp, sp, esi, edi, ebp, esp .br ~~~cs, ds, ss, es, fs, gs .HS The xx and exx variants of the eight general registers are treated as synonyms by the assembler. Normally "ax" is the 16-bit low half of the 32-bit "eax" register. The assembler determines if a 16 or 32 bit operation is meant solely by looking at the instruction or the instruction prefixes. It is however best to use the proper registers when writing assembly to not confuse those who read the code. .HS The last group of 6 segment registers are used for selector + offset mode addressing, in which the effective address is at a given offset in one of the 6 segments. .PP Names of instructions and pseudo-ops are not reserved. Alphabetic characters in opcodes and pseudo-ops must be in lower case. .SS "Separators" .PP Commas, blanks, and tabs are separators and can be interspersed freely between tokens, but not within tokens. Commas are only legal between operands. .SS "Comments" .PP The comment character is \*(OQ!\*(CQ. The rest of the line is ignored. .SS "Opcodes" .PP The opcodes are listed below. Notes: (1) Different names for the same instruction are separated by \*(OQ/\*(CQ. (2) Square brackets ([]) indicate that 0 or 1 of the enclosed characters can be included. (3) Curly brackets ({}) work similarly, except that one of the enclosed characters \fImust\fR be included. Thus square brackets indicate an option, whereas curly brackets indicate that a choice must be made. .sp .if t .ta 0.25i 1.2i 3i .if n .ta 2 10 24 .nf .B "Data Transfer" .HS mov[b] dest, source ! Move word/byte from source to dest pop dest ! Pop stack push source ! Push stack xchg[b] op1, op2 ! Exchange word/byte xlat ! Translate o16 ! Operate on a 16 bit object instead of 32 bit .B "Input/Output" .HS in[b] source ! Input from source I/O port in[b] ! Input from DX I/O port out[b] dest ! Output to dest I/O port out[b] ! Output to DX I/O port .B "Address Object" .HS lds reg,source ! Load reg and DS from source les reg,source ! Load reg and ES from source lea reg,source ! Load effect address of source to reg and DS {cdsefg}seg ! Specify seg register for next instruction a16 ! Use 16 bit addressing mode instead of 32 bit .B "Flag Transfer" .HS lahf ! Load AH from flag register popf ! Pop flags pushf ! Push flags sahf ! Store AH in flag register .B "Addition" .HS aaa ! Adjust result of BCD addition add[b] dest,source ! Add adc[b] dest,source ! Add with carry daa ! Decimal Adjust after addition inc[b] dest ! Increment by 1 .B "Subtraction" .HS aas ! Adjust result of BCD subtraction sub[b] dest,source ! Subtract sbb[b] dest,source ! Subtract with borrow from dest das ! Decimal adjust after subtraction dec[b] dest ! Decrement by one neg[b] dest ! Negate cmp[b] dest,source ! Compare .B "Multiplication" .HS aam ! Adjust result of BCD multiply imul[b] source ! Signed multiply mul[b] source ! Unsigned multiply .B "Division" .HS aad ! Adjust AX for BCD division o16 cbw ! Sign extend AL into AH o16 cwd ! Sign extend AX into DX cwde ! Sign extend AX into EAX cdq ! Sign extend EAX into EDX idiv[b] source ! Signed divide div[b] source ! Unsigned divide .B "Logical" .HS and[b] dest,source ! Logical and not[b] dest ! Logical not or[b] dest,source ! Logical inclusive or test[b] dest,source ! Logical test xor[b] dest,source ! Logical exclusive or .B "Shift" .HS sal[b]/shl[b] dest,CL ! Shift logical left sar[b] dest,CL ! Shift arithmetic right shr[b] dest,CL ! Shift logical right .B "Rotate" .HS rcl[b] dest,CL ! Rotate left, with carry rcr[b] dest,CL ! Rotate right, with carry rol[b] dest,CL ! Rotate left ror[b] dest,CL ! Rotate right .B "String Manipulation" .HS cmps[b] ! Compare string element ds:esi with es:edi lods[b] ! Load from ds:esi into AL, AX, or EAX movs[b] ! Move from ds:esi to es:edi rep ! Repeat next instruction until ECX=0 repe/repz ! Repeat next instruction until ECX=0 and ZF=1 repne/repnz ! Repeat next instruction until ECX!=0 and ZF=0 scas[b] ! Compare ds:esi with AL/AX/EAX stos[b] ! Store AL/AX/EAX in es:edi .fi .B "Control Transfer" .PP \fIAs\fR accepts a number of special jump opcodes that can assemble to instructions with either a byte displacement, which can only reach to targets within \(mi126 to +129 bytes of the branch, or an instruction with a 32-bit displacement. The assembler automatically chooses a byte or word displacement instruction. .PP The English translation of the opcodes should be obvious, with \*(OQl(ess)\*(CQ and \*(OQg(reater)\*(CQ for signed comparisions, and \*(OQb(elow)\*(CQ and \*(OQa(bove)*(CQ for unsigned comparisions. There are lots of synonyms to allow you to write "jump if not that" instead of "jump if this". .PP The \*(OQcall\*(CQ, \*(OQjmp\*(CQ, and \*(OQret\*(CQ instructions can be either intrasegment or intersegment. The intersegment versions are indicated with the suffix \*(OQf\*(CQ. .if t .ta 0.25i 1.2i 3i .if n .ta 2 10 24 .nf .B Unconditional .HS jmp[f] dest ! jump to dest (8 or 32-bit displacement) call[f] dest ! call procedure ret[f] ! return from procedure .B "Conditional" .HS ja/jnbe ! if above/not below or equal (unsigned) jae/jnb/jnc ! if above or equal/not below/not carry (uns.) jb/jnae/jc ! if not above nor equal/below/carry (unsigned) jbe/jna ! if below or equal/not above (unsigned) jg/jnle ! if greater/not less nor equal (signed) jge/jnl ! if greater or equal/not less (signed) jl/jnqe ! if less/not greater nor equal (signed) jle/jgl ! if less or equal/not greater (signed) je/jz ! if equal/zero jne/jnz ! if not equal/not zero jno ! if overflow not set jo ! if overflow set jnp/jpo ! if parity not set/parity odd jp/jpe ! if parity set/parity even jns ! if sign not set js ! if sign set .B "Iteration Control" .HS jcxz dest ! jump if ECX = 0 loop dest ! Decrement ECX and jump if CX != 0 loope/loopz dest ! Decrement ECX and jump if ECX = 0 and ZF = 1 loopne/loopnz dest ! Decrement ECX and jump if ECX != 0 and ZF = 0 .B "Interrupt" .HS int n ! Software interrupt n into ! Interrupt if overflow set iretd ! Return from interrupt .B "Flag Operations" .HS clc ! Clear carry flag cld ! Clear direction flag cli ! Clear interrupt enable flag cmc ! Complement carry flag stc ! Set carry flag std ! Set direction flag sti ! Set interrupt enable flag .fi .SS "Location Counter" .PP The special symbol \*(OQ.\*(CQ is the location counter and its value is the address of the first byte of the instruction in which the symbol appears and can be used in expressions. .SS "Segments" .PP There are four different assembly segments: text, rom, data and bss. Segments are declared and selected by the \fI.sect\fR pseudo-op. It is customary to declare all segments at the top of an assembly file like this: .HS ~~~.sect .text; .sect .rom; .sect .data; .sect .bss .HS The assembler accepts up to 16 different segments, but .MX expects only four to be used. Anything can in principle be assembled into any segment,%%%%%% but the .MX bss segment may only contain uninitialized data. Note that the \*(OQ.\*(CQ symbol refers to the location in the current segment. .SS "Labels" .PP There are two types: name and numeric. Name labels consist of a name followed by a colon (:). .PP The numeric labels are single digits. The nearest 0: label may be referenced as 0f in the forward direction, or 0b backwards. .SS "Statement Syntax" .PP Each line consists of a single statement. Blank or comment lines are allowed. .SS "Instruction Statements" .PP The most general form of an instruction is .HS ~~~label: opcode operand1, operand2 ! comment .HS .SS "Expression Semantics" .PP .tr ~~ The following operators can be used: + \(mi * / & | ^ ~ << (shift left) >> (shift right) \(mi (unary minus). .tr ~ 32-bit integer arithmetic is used. Division produces a truncated quotient. .SS "Addressing Modes" .PP Below is a list of the addressing modes supported. Each one is followed by an example. .HS .ta 0.25i 3i .nf constant mov eax, 123456 direct access mov eax, (counter) register mov eax, esi indirect mov eax, (esi) base + disp. mov eax, 6(ebp) scaled index mov eax, (4*esi) base + index mov eax, (ebp)(2*esi) base + index + disp. mov eax, 10(edi)(1*esi) .HS .fi Any of the constants or symbols may be replacement by expressions. Direct access, constants and displacements may be any type of expression. A scaled index with scale 1 may be written without the \*(OQ1*\*(CQ. .SS "Call and Jmp" .PP The \*(OQcall\*(CQ and \*(OQjmp\*(CQ instructions can be interpreted as a load into the instruction pointer. .HS .ta 0.25i 3i .nf call _routine ! Direct, intrasegment call (subloc) ! Indirect, intrasegment call 6(ebp) ! Indirect, intrasegment call ebx ! Direct, intrasegment call (ebx) ! Indirect, intrasegment callf (subloc) ! Indirect, intersegment callf seg:offs ! Direct, intersegment .HS .fi .SP 1 .SS "Symbol Assigment" .SP 1 .PP Symbols can acquire values in one of two ways. Using a symbol as a label sets it to \*(OQ.\*(CQ for the current segment with type relocatable. Alternative, a symbol may be given a name via an assignment of the form .HS ~~~symbol = expression .HS in which the symbol is assigned the value and type of its arguments. .SP 1 .SS "Storage Allocation" .SP 1 .PP Space can be reserved for bytes, words, and longs using pseudo-ops. They take one or more operands, and for each generate a value whose size is a byte, word (2 bytes) or long (4 bytes). For example: .HS .if t .ta 0.25i 3i .if n .ta 2 24 .data1 2, 6 ! allocate 2 bytes initialized to 2 and 6 .br .data2 3, 0x10 ! allocate 2 words initialized to 3 and 16 .br .data4 010 ! allocate a longword initialized to 8 .br .space 40 ! allocates 40 bytes of zeros .HS allocates 50 (decimal) bytes of storage, initializing the first two bytes to 2 and 6, the next two words to 3 and 16, then one longword with value 8 (010 octal), last 40 bytes of zeros. .SS "String Allocation" .PP The pseudo-ops \fI.ascii\fR and \fI.asciz\fR take one string argument and generate the ASCII character codes for the letters in the string. The latter automatically terminates the string with a null (0) byte. For example, .HS ~~~.ascii "hello" .br ~~~.asciz "world\en" .HS .SS "Alignment" .PP Sometimes it is necessary to force the next item to begin at a word, longword or even a 16 byte address boundary. The \fI.align\fR pseudo-op zero or more null byte if the current location is a multiple of the argument of .align. .SS "Segment Control" .PP Every item assembled goes in one of the four segments: text, rom, data, or bss. By using the \fI.sect\fR pseudo-op with argument \fI.text, .rom, .data\fR or \fI.bss\fR, the programmer can force the next items to go in a particular segment. .SS "External Names" .PP A symbol can be given global scope by including it in a \fI.define\fR pseudo-op. Multiple names may be listed, separate by commas. It must be used to export symbols defined in the current program. Names not defined in the current program are treated as "undefined external" automatically, although it is customary to make this explicit with the \fI.extern\fR pseudo-op. .SS "Common" .PP The \fI.comm\fR pseudo-op declares storage that can be common to more than one module. There are two arguments: a name and an absolute expression giving the size in bytes of the area named by the symbol. The type of the symbol becomes external. The statement can appear in any segment. If you think this has something to do with FORTRAN, you are right. .SS "Examples" .PP In the kernel directory, there are several assembly code files that are worth inspecting as examples. However, note that these files, are designed to first be run through the C preprocessor. (The very first character is a # to signal this.) Thus they contain numerous constructs that are not pure assembler. For true assembler examples, compile any C program provided with .MX using the \fB\(enS\fR flag. This will result in an assembly language file with a suffix with the same name as the C source file, but ending with the .s suffix. .CD "awk \(en pattern matching language" .SX "awk \fIrules\fR [\fIfile\fR] ... .FL "\fR(none)" .EX "awk rules input" "Process \fIinput\fR according to \fIrules\fR" .EX "awk rules \(en >out" "Input from terminal, output to \fIout\fR" .PP AWK is a programming language devised by Aho, Weinberger, and Kernighan at Bell Labs (hence the name). \fIAwk\fR programs search files for specific patterns and performs \*(OQactions\*(CQ for every occurrence of these patterns. The patterns can be \*(OQregular expressions\*(CQ as used in the \fIed\fR editor. The actions are expressed using a subset of the C language. .PP The patterns and actions are usually placed in a \*(OQrules\*(CQ file whose name must be the first argument in the command line, preceded by the flag \fB\(enf\fR. Otherwise, the first argument on the command line is taken to be a string containing the rules themselves. All other arguments are taken to be the names of text files on which the rules are to be applied, with \fB\(en\fR being the standard input. To take rules from the standard input, use \fB\(enf \(en\fR. .PP The command: .HS .Cx "awk rules prog.\d\s+2*\s0\u" .HS would read the patterns and actions rules from the file \fIrules\fR and apply them to all the arguments. .PP The general format of a rules file is: .HS ~~~ { } ~~~ { } ~~~... .HS There may be any number of these { } sequences in the rules file. \fIAwk\fR reads a line of input from the current input file and applies every { } in sequence to the line. .PP If the corresponding to any { } is missing, the action is applied to every line of input. The default { } is to print the matched input line. .SS "Patterns" .PP The s may consist of any valid C expression. If the consists of two expressions separated by a comma, it is taken to be a range and the is performed on all lines of input that match the range. s may contain \*(OQregular expressions\*(CQ delimited by an @ symbol. Regular expressions can be thought of as a generalized \*(OQwildcard\*(CQ string matching mechanism, similar to that used by many operating systems to specify file names. Regular expressions may contain any of the following characters: .HS .in +0.75i .ta +0.5i .ti -0.5i x An ordinary character .ti -0.5i \\ The backslash quotes any character .ti -0.5i ^ A circumflex at the beginning of an expr matches the beginning of a line. .ti -0.5i $ A dollar-sign at the end of an expression matches the end of a line. .ti -0.5i \&. A period matches any single character except newline. .ti -0.5i * An expression followed by an asterisk matches zero or more occurrences of that expression: \*(OQfo*\*(CQ matches \*(OQf\*(CQ, \*(OQfo\*(CQ, \*(OQfoo\*(CQ, \*(OQfooo\*(CQ, etc. .ti -0.5i + An expression followed by a plus sign matches one or more occurrences of that expression: \*(OQfo+\*(CQ matches \*(OQfo\*(CQ, \*(OQfoo\*(CQ, \*(OQfooo\*(CQ, etc. .ti -0.5i [] A string enclosed in square brackets matches any single character in that string, but no others. If the first character in the string is a circumflex, the expression matches any character except newline and the characters in the string. For example, \*(OQ[xyz]\*(CQ matches \*(OQxx\*(CQ and \*(OQzyx\*(CQ, while \*(OQ[^xyz]\*(CQ matches \*(OQabc\*(CQ but not \*(OQaxb\*(CQ. A range of characters may be specified by two characters separated by \*(OQ-\*(CQ. .in -0.75i .SS "Actions" .PP Actions are expressed as a subset of the C language. All variables are global and default to int's if not formally declared. Only char's and int's and pointers and arrays of char and int are allowed. \fIAwk\fR allows only decimal integer constants to be used\(emno hex (0xnn) or octal (0nn). String and character constants may contain all of the special C escapes (\\n, \\r, etc.). .PP \fIAwk\fR supports the \*(OQif\*(CQ, \*(OQelse\*(CQ, \*(OQwhile\*(CQ and \*(OQbreak\*(CQ flow of control constructs, which behave exactly as in C. .PP Also supported are the following unary and binary operators, listed in order from highest to lowest precedence: .HS .ta 0.25i 1.75i 3.0i .nf \fB Operator Type Associativity\fR () [] unary left to right .tr ~~ ! ~ ++ \(en\(en \(en * & unary right to left .tr ~ * / % binary left to right + \(en binary left to right << >> binary left to right < <= > >= binary left to right == != binary left to right & binary left to right ^ binary left to right | binary left to right && binary left to right || binary left to right = binary right to left .fi .HS Comments are introduced by a '#' symbol and are terminated by the first newline character. The standard \*(OQ/*\*(CQ and \*(OQ*/\*(CQ comment delimiters are not supported and will result in a syntax error. .SP 0.5 .SS "Fields" .SP 0.5 .PP When \fIawk\fR reads a line from the current input file, the record is automatically separated into \*(OQfields.\*(CQ A field is simply a string of consecutive characters delimited by either the beginning or end of line, or a \*(OQfield separator\*(CQ character. Initially, the field separators are the space and tab character. The special unary operator '$' is used to reference one of the fields in the current input record (line). The fields are numbered sequentially starting at 1. The expression \*(OQ$0\*(CQ references the entire input line. .PP Similarly, the \*(OQrecord separator\*(CQ is used to determine the end of an input \*(OQline,\*(CQ initially the newline character. The field and record separators may be changed programatically by one of the actions and will remain in effect until changed again. .PP Multiple (up to 10) field separators are allowed at a time, but only one record separator. .PP Fields behave exactly like strings; and can be used in the same context as a character array. These \*(OQarrays\*(CQ can be considered to have been declared as: .SP 0.15 .HS ~~~~~char ($n)[ 128 ]; .HS .SP 0.15 In other words, they are 128 bytes long. Notice that the parentheses are necessary because the operators [] and $ associate from right to left; without them, the statement would have parsed as: .HS .SP 0.15 ~~~~~char $(1[ 128 ]); .HS .SP 0.15 which is obviously ridiculous. .PP If the contents of one of these field arrays is altered, the \*(OQ$0\*(CQ field will reflect this change. For example, this expression: .HS .SP 0.15 ~~~~~*$4 = 'A'; .HS .SP 0.15 will change the first character of the fourth field to an upper- case letter 'A'. Then, when the following input line: .HS .SP 0.15 ~~~~~120 PRINT "Name address Zip" .SP 0.15 .HS is processed, it would be printed as: .HS .SP 0.15 ~~~~~120 PRINT "Name Address Zip" .HS .SP 0.15 Fields may also be modified with the strcpy() function (see below). For example, the expression: .HS ~~~~~strcpy( $4, "Addr." ); .HS applied to the same line above would yield: .HS ~~~~~120 PRINT "Name Addr. Zip" .HS .SS "Predefined Variables" .PP The following variables are pre-defined: .HS .in +1.5i .ta +1.25i .ti -1.25i FS Field separator (see below). .ti -1.25i RS Record separator (see below also). .ti -1.25i NF Number of fields in current input record (line). .ti -1.25i NR Number of records processed thus far. .ti -1.25i FILENAME Name of current input file. .ti -1.25i BEGIN A special that matches the beginning of input text. .ti -1.25i END A special that matches the end of input text. .in -1.5i .HS \fIAwk\fR also provides some useful built-in functions for string manipulation and printing: .HS .in +1.5i .ta +1.25i .ti -1.25i print(arg) Simple printing of strings only, terminated by '\\n'. .ti -1.25i printf(arg...) Exactly the printf() function from C. .ti -1.25i getline() Reads the next record and returns 0 on end of file. .ti -1.25i nextfile() Closes the current input file and begins processing the next file .ti -1.25i strlen(s) Returns the length of its string argument. .ti -1.25i strcpy(s,t) Copies the string \*(OQt\*(CQ to the string \*(OQs\*(CQ. .ti -1.25i strcmp(s,t) Compares the \*(OQs\*(CQ to \*(OQt\*(CQ and returns 0 if they match. .ti -1.25i toupper(c) Return%%s its character argument converted to upper-case. .ti -1.25i tolower(c) Returns its character argument converted to lower-case. .ti -1.25i match(s,@re@) Compares the string \*(OQs\*(CQ to the regular expression \*(OQre\*(CQ and returns the number of matches found (zero if none). .in -1.5i .SS "Authors" .PP \fIAwk\fR was written by Saeko Hirabauashi and Kouichi Hirabayashi. .CD "de \(en disk editor" .SX "de\fR [\fB\(enw\fR] \fIblock_device" .SX "de \(enr \fIfile .FL "\(enr" "Recover a file that has been removed" .FL "\(enw" "Enable writing, so device can be modified" .EX "de \(enr /usr/ast/prog.c" "Undo the effects of: \fIrm /usr/ast/prog.c\fR" .EX "de \(enw /dev/fd0" "Edit \fI/dev/fd0\fR for writing" .PP The \fIde\fR program allows a system administrator to examine and modify a \s-2MINIX\s0 file system device. Commands are available to move to any address on the disk and display the disk block contents. This information may be presented in one of three visual modes: as two-byte words, as ASCII characters or as a bit map. The disk may be searched for a string of characters. If the \fB\(enw\fR option is given, \fIde\fR will open the device for writing and words may be modified. Without this flag, writing is prohibited. Lost blocks and files can be recovered using a variety of commands. The \fB\(enr\fR option supports automated recovery of files removed by \fIunlink\fR. .SS "Positioning" .PP Disks are divided into blocks (also called \*(OQzones\*(CQ) of 1024 bytes. \fIDe\fR keeps a current address on the disk as a block number and a byte offset within the block. In some visual modes the offset is rounded off, for example, in \*(OQword\*(CQ mode the offset must be even. .PP There are different types of blocks on a file system device, including a super block, bit maps, i-nodes and data blocks. \fIDe\fR knows the type of the current block, but will allow most positioning commands and visual modes to function anywhere on the disk. .PP The \fIf\fR command (or PGDN on the keypad) moves forward to the next block, similarly \fIb\fR (PGUP) moves backwards one block. \fIF\fR (END) moves to the last block and \fIB\fR (HOME) moves to the first block. .PP The arrow keys (or \fIu\fR, \fId\fR, \fIl\fR, and \fIr\fR) change the current address by small increments. The size of the increment depends on the current display mode, as shown below. The various sizes suit each display and pointers move on the screen to follow each press of an arrow key. .HS .if t .ta .75iR 1.5iR 2.25iR 3.0iR 3.75iR .if n .ta .75i 1.5i 2.25i 3.0i 3.75i .nf \fB Mode Up Down Left Right\fR Word \(mi2 +2 \(mi32 +32 Block \(mi64 +64 \(mi1 +1 Map \(mi256 +256 \(mi4 +4 .fi .HS The \fIg\fR command allows movement to any specified block. Like all commands that take arguments, a prompt and subsequent input are written to the bottom line of the screen. Numerical entry may be decimal, octal or hexadecimal, for example 234, \(mi1, 070, 0xf3, \(miX3C. .PP While checking an i-node one may want to move to a block listed as a zone of the file. The \fIG\fR command takes the contents at the current address in the device as a block number and indirectly jumps to that block. .PP The address may be set to the start of any i-node using the \fI\fR command and supplying an i-node number. The \fII\fR command maps a given file name into an i-node address. The file must exist on the current device and this device must be mounted. .SS "The Display" .PP The first line of the display contains the device name, the name of the current output file (if one is open) and the current search string. If \fIde\fR is being run with the \fB\(enw\fR option then the device name is flagged with \*(OQ(w).\*(CQ If a string is too long to fit on the line it is marked with \*(OQ...\*(CQ. .PP The second line contains the current block number, the total number of blocks, and the type of the current block. The types are: boot, super, i-node bit map, zone bit map, i-nodes and data block. If the current address is within a data block then the string \*(OQin use\*(CQ is displayed if the block corresponds to a set in the zone bit map. .PP The third line shows the offset in the current block. If the current address is within either the i-node or zone bit maps then the i-node or block number corresponding to the current bit is shown. If the current address is within an i-node then the i-node number and \*(OQin use\*(CQ status is displayed. If the address is within a bit map or i-node block, but past the last usable entry, then the string \*(OQpadding\*(CQ is shown. .PP The rest of the screen is used to display data from the current block. There are three visual display modes: \*(OQword,\*(CQ \*(OQblock,\*(CQ and \*(OQmap.\*(CQ The \fIv\fR command followed by \fIw\fR, \fIb\fR, or \fIm\fR sets the current display mode. .PP In \*(OQword\*(CQ mode 16 words, of two bytes each, are shown in either base 2, 8, 10 or 16. The current base is displayed to the far right of the screen. It can be changed using the \fIo\fR command followed by either an \fIh\fR (hexadecimal), \fId\fR (decimal), \fIo\fR (octal) or \fIb\fR (binary). .PP \fIDe\fR knows where i-nodes are, and will display the contents in a readable format, including the \fIrwx\fR bits, the user name and the time field. If the current page is at the beginning of the super block, or an executable file or an \fIar\fR archive, then \fIde\fR will also inform the user. In all other cases the contents of the 16 words are shown to the right as equivalent ASCII characters. .PP In \*(OQblock\*(CQ mode a whole block of 1024 bytes is displayed as ASCII characters, 64 columns by 16 lines. Control codes are shown as highlighted characters. If the high order bit is set in any of the 1024 bytes then an \*(OQMSB\*(CQ flag is shown on the far right of the screen, but these bytes are not individually marked. .PP In \*(OQmap\*(CQ mode 2048 bits (256 bytes) are displayed from the top to the bottom (32 bits) and from the left to the right of the screen. Bit zero of a byte is towards the top of the screen. This visual mode is generally used to observe the bit map blocks. The number of set bits displayed is written on the far right of the screen. .SS "Searching" .PP A search for an ASCII string is initiated by the \fI/\fR command. Control characters not used for other purposes may be entered in the search string, for example CTRL-J is an end-of-line character. The search is from the current position to the end of the current device. .PP Once a search string has been defined by a use of \fI/\fR, the next search may be initiated with the \fIn\fR command, (a \fI/\fR followed immediately by an ENTER is equivalent to an \fIn\fR). .PP Whenever a search is in progress \fIde\fR will append one \fI.\fR to the prompt line for every 500 blocks searched. If the string is found between the end of the file system and the actual end of the device, then the current address is set to the end of the file system. .PP Some of the positioning commands push the current address and visual mode in a stack before going to a new address. These commands are \fIB\fR, \fIF\fR, \fIg\fR, \fIG\fR, \fIi\fR, \fII\fR, \fIn\fR, \fIx\fR and \fI/\fR. The \fIp\fR (previous) command pops the last address and visual mode from the stack. This stack is eight entries deep. .SS "Modifying the File System" .PP The \fIs\fR command will prompt for a data word and store it at the current address on the disk. This is used to change information that can not be easily changed by any other means. .PP The data word is 16 bits wide, it may be entered in decimal, octal or hexadecimal. Remember that the \fB\(enw\fR option must be specified for the \fIs\fR command to operate. Be careful when modifying a mounted file system. .SS "Recovering Files" .PP Any block on the disk may be written to an output file. This is used to recover blocks marked as free on the disk. A write command will request a file name the first time it is used, on subsequent writes the data is appended to the current output file. .PP The name of the current output file is changed using the \fIc\fR command. This file should be on a different file system, to avoid overwriting an i-node or block before it is recovered. .PP An ASCII block is usually recovered using the \fIw\fR command. All bytes will have their most significant bit cleared before being written to the output file. Bytes containing '\\0' or '\\177' are not copied. The \fIW\fR command writes the current block (1024 bytes exactly) to the output file. .PP When a file is deleted using \fIunlink\fR the i-no%%%%%%de number in the directory is zeroed, but before its removal, it is copied into the end of the file name field. This allows the i-node of a deleted file to be found by searching through a directory. The \fIx\fR command asks for the path name of a lost file, extracts the old i-node number and changes the current disk address to the start of the i-node. .PP Once an i-node is found, all of the freed blocks may be recovered by checking the i-node zone fields, using 'G' to go to a block, writing it back out using 'w', going back to the i-node with \fIp\fR and advancing to the next block. This file extraction process is automated by using the \fIX\fR command, which goes through the i-node, indirect and double indirect blocks finding all the block pointers and recovering all the blocks of the file. .PP The \fIX\fR command closes the current output file and asks for the name of a new output file. All of the disk blocks must be marked as free, if they are not the command stops and the file must be recovered manually. .PP When extracting lost blocks \fIde\fR will maintain \*(OQholes\*(CQ in the file. Thus, a recovered sparse file does not allocate unused blocks and will keep its efficient storage scheme. This property of the \fIX\fR command may be used to move a sparse file from one device to another. .PP Automatic recovery may be initiated by the \fB\(enr\fR option on the command line. Also specified is the path name of a file just removed by \fIunlink\fR. \fIDe\fR determines which mounted file system device held the file and opens it for reading. The lost i-node is found and the file extracted by automatically performing an \fIx\fR and an \fIX\fR command. .PP The recovered file will be written to \fI/tmp\fR. \fIDe\fR will refuse to automatically recover a file on the same file system as \fI/tmp\fR. The lost file must have belonged to the user. If automatic recovery will not complete, then manual recovery may be performed. .SS "Miscellaneous" .PP The user can terminate a session with \fIde\fR by typing \fIq\fR, CTRL-D, or the key associated with SIGQUIT. .PP The \fIm\fR command invokes the \s-2MINIX\s0 \fIsh\fR shell as a subprocess. .PP For help while using \fIde\fR use \fIh\fR. .SS "Command Summary" .LP .ta 0.25i 1.0i 1.5i .nf .sp PGUP b Back one block PGDN f Forward one block HOME B Goto first block END F Goto last block UP u Move back 2/64/256 bytes DOWN d Move forward 2/64/256 bytes LEFT l Move back 32/1/4 bytes RIGHT r Move forward 32/1/4 bytes g Goto specified block G Goto block indirectly i Goto specified i-node I Filename to i-node / Search n Next occurrence p Previous address h Help EOF q Quit m \s-2MINIX\s0 shell v Visual mode (w b m) o Output base (h d o b) c Change file name w Write ASCII block W Write block exactly x Extract lost directory entry X Extract lost file blocks s Store word .fi .sp NOTES: When entering a line in response to a prompt from \fIde\fR there are a couple of editing characters available. The previous character may be erased by typing CTRL-H and the whole line may be erased by typing CTRL-U. ENTER terminates the input. If DELETE or a non-ASCII character is typed then the command requesting the input is aborted. .PP The commands \fIG\fR, \fIs\fR and \fIX\fR will only function if the current visual display mode is \*(OQword.\*(CQ The commands \fIi\fR, \fII\fR and \fIx\fR change the mode to \*(OQword\*(CQ on completion. The commands \fIG\fR and \fI/\fR change the mode to \*(OQblock\*(CQ. These restrictions and automatic mode conversions are intended to aid the user. .PP The \*(OQmap\*(CQ mode uses special graphic characters, and only functions if the user is at the console. .PP \fIDe\fR generates warnings for illegal user input or if erroneous data is found on the disk, for example a corrupted magic number. Warnings appear in the middle of the screen for two seconds, then the current page is redrawn. Some minor errors, for example, setting an unknown visual mode, simply ring the bell. Major errors, for example I/O problems on the file system device cause an immediate exit from \fIde\fR. .PP The i-node and zone bit maps are read from the device when \fIde\fR starts up. These determine whether \*(OQin use\*(CQ or \*(OQnot in use\*(CQ is displayed in the status field at the top of the screen. The bit maps are not re-read while using \fIde\fR and will become out-of-date if observing a mounted file system. .PP \fIDe\fR requires termcap definitions for \*(OQcm\*(CQ and \*(OQcl\*(CQ. Furthermore, \*(OQso\*(CQ and \*(OQse\*(CQ will also be used if available. The ANSI strings generated by the keypad arrows are recognized, as well as any single character codes defined by \*(OQku\*(CQ, \*(OQkd\*(CQ, \*(OQkl\*(CQ and \*(OQkr\*(CQ. .SS "Author" .PP The \fIde\fR program was written by Terrence Holm. .CD "dis88 \(en disassembler [IBM]" .SX "dis88\fR [\fB\(eno\fR] \fIinfile\fR [\fIoutfile\fR]" .FL "\(eno" "List the object code along with the assembly code" .EX "dis88 a.out >listing" "Disassemble \fIa.out\fR" .EX "dis88 \(eno a.out listing" "Ditto, but with object code" .PP \fIDis88\fR disassembles 8088 object code to the assembly language format used by .MX . It makes full use of symbol table information, supports separate instruction and data space, and generates synthetic labels when needed. It does not support 8087 mnemonics, symbolic data segment references, or the ESC mnemonic. .PP The program is invoked by: .HS .Cx "dis88 [\(eno] infile [outfile]" .HS The \(eno flag causes object code to be listed. If no outfile is given, \fIstdout\fR is used. .PP The text segment of an object file is always padded to an even address. In addition, if the file has split I/D space, the text segment will be padded to a paragraph boundary (i.e., an address divisible by 16). Due to padding, the disassembler may produce a few spurious, but harmless, instructions at the end of the text segment. .PP Because the information to which initialized data refers cannot generally be inferred from context, the data segment is treated literally. Byte values (in hexadecimal) are output, and long stretches of null data are represented by appropriate \fI.zerow\fR pseudo-ops. Disassembly of the bss segment, on the other hand, is quite straightforward, because uninitialized data is all zero by definition. No data is output in the bss segment, but symbolic labels are output as appropriate. .PP The output of operands in symbolic form is complicated somewhat by the existence of assembler symbolic constants and segment override opcodes. Thus, the program's symbol lookup routine attempts to apply a certain amount of intelligence when it is asked to find a symbol. If it cannot match on a symbol of the preferred type, it may output a symbol of some other type, depending on preassigned (and somewhat arbitrary) rankings within each type. Finally, if all else fails, it will output a string containing the address sought as a hex constant. For user convenience, the targets of branches are also output, in comments, as hexadecimal constants. .SS "Error Messages" .PP Various error messages may be generated as a result of problems encountered during the disassembly. They are listed below .HS. .in +3.20i .ta +2.75i +0.2i .ti -2.95i Cannot access input file \(en Input file cannot be opened or read .ti -2.95i Cannot open output file \(en Output file cannot be created .ti -2.95i Input file not in object format \(en Bad magic number .ti -2.95i Not an 8086/8088 object file \(en CPU ID of the file header is incorrect .ti -2.95i Reloc table overflow \(en Relocation table exceeds 1500 entries .ti -2.95i Symbol table overflow \(en Symbol table exceeds 1500 entries .ti -2.95i Lseek error \(en Input file corrupted (should never happen) .ti -2.95i Warning: no symbols \(en Symbol table is missing (use ast) .ti -2.95i Cannot reopen input file \(en Input file was removed during execution .in -3.20i .SS "Author" .PP \fIDis88\fR was written and copyrighted by G. M. Harding and is included here by permission. It may be freely redistributed provided that complete source code, with all copyright notices, accompanies any redistribution. This provision also applies to any modifications you may make. You are urged to comment such changes, giving, as a minimum, your name and complete address. .CD "elle \(en ELLE Looks Like Emacs" .SX "elle \fIfile\fR [\fIfile2\fR]" .FL "\fR(none)" .EY "elle file.c" "Start the editor" .PP \fIELLE\fR (ELLE Looks Like Emacs) is an Emacs clone for .MX . ELLE is not full Emacs but it has about 80 commands and is quite fast. .SP 0.5 .SS "Key bindings" .SP 0.5 .PP \fIMined\fR only has a small number of commands. All of them are either of the form CTRL-x or are on the numeric keypad. Emacs, in contrast, has so many commands, that not only are all the CTRL-x commands used up, but so are all the ESC x (escape followed by x; escape is not a shift character, like CTRL). Even this is not enough, so CTRL-X is used as a prefix for additional commands. Thus CTRL-X CTRL-L is a command, and so is CTRL-X K. Note that what is conventionally written as CTRL-X K really means CTRL-X k. In some contexts it is traditional to write CTRL-X as ^X. Please note that they mean the same thing. .PP As a result, many Emacs commands need three or four key strokes to execute. Some people think 3-4 key strokes is too many. For this reason, Emacs and ELLE allow users to assign their own key bindings. In ELLE this is done with \*(OQuser profiles.\*(CQ A user profile is a file listing which function is invoked by which key stroke. The user profile is then compiled by a program called ellec into binary form. When ELLE starts up it checks to see if a file .ellepro.b1 exists in $HOME. If it does, this file is read in and overrides the default bindings. .PP A user profile that simulates the \fImined\fR commands fairly well is provided. Its installation is described later. If you have never used Emacs, it is suggested that you use the \fImined\fR profile. If you normally use Emacs, then do not install the \fImined\fR profile. You can also make your own using \fIellec\fR. There is no Mock Lisp. .PP ELLE has a character-oriented view of the world, not a line oriented view, like \fIed\fR. It does not have magic characters for searching. However, you can use line feed in search patterns. For example, to find a line consisting of the three characters \*(OQfoo\*(CQ all by themselves on a line, using the mined bindings (see below), use the pattern: CTRL-\\ CTRL-J f o o CTRL-\\ CTRL-J. The CTRL-\ means to interpret the next character literally, in this case it is CTRL-J, which is line feed. You can also search for patterns involving multiple lines. For example, to find a line ending in an \*(OQx\*(CQ followed by a line beginning with a \*(OQy\*(CQ, use as pattern: x CTRL-\ CTRL-J y. .SS "Mined Key Bindings" .PP These are the key bindings if the binary user profile, \fI.ellepro.b1\fR, is installed in $HOME. The ESCAPE key followed by a number followed by a command causes that command to be executed \*(OQnumber\*(CQ times. This applies both to control characters and insertable characters. CTRL-X refers to a \*(OQcontrol character.\*(CQ ESC x refers to an escape character followed by x. In other words, ^X is a synonym for CTRL-X. ^X Y refers to CTRL-X followed by y. To abort the current command and go back to the main loop of the editor, type CTRL-G, rather than CTRL-\\. .PP Only a few commands are of the form CTRL-X Y. All of these are also bound to CTRL-X CTRL-Y, so you can hold down CTRL and then hit X Y, or release control after the X, as you prefer. .PP The key bindings that are not listed should not be used. Some of them actually do things. For example, the ANSI escape codes ESC [ x are bound to ^X Y for a variety of y. .PP Some commands work on regions. A region is defined as the text between the most recently set mark and the cursor. .SP 0.5 .SS "Mined Commands" .SP 0.5 .PP If the \fImined\fR profile, .I .ellepro.b1 is installed in your home directory, the following commands will work. .sp .in +1.75i .ta +1.25i .ti -1.5i \fBCURSOR MOTION\fR .ti -1.25i arrows Move the cursor in the indicated direction .ti -1.25i CTRL-A Move cursor to start of current line .ti -1.25i CTRL-Z Move cursor to end of current line .ti -1.25i CTRL-F Move cursor forward word .ti -1.25i CTRL-B Move cursor backward to start of previous word .sp .ti -1.5i \fBSCREEN MOTION\fR .ti -1.25i Home key Move to first character of the file .ti -1.25i End key Move to last character of the file .ti -1.25i PgUp key Scroll window up 22 lines (closer to start of the file) .ti -1.25i PgDn key Scroll window down 22 lines (closer to end of the file) .ti -1.25i CTRL-U Scroll window up 1 line .ti -1.25i CTRL-D Scroll window down 1 line .ti -1.25i ESC , Move to top of screen .ti -1.25i CTRL-_ Move to bottom of screen .sp .ti -1.5i \fBMODIFYING TEXT\fR .ti -1.25i DEL key Delete the character under the cursor .ti -1.25i Backsp Delete the character to left of the cursor .ti -1.25i CTRL-N Delete the next word .ti -1.25i CTRL-P Delete the previous word .ti -1.25i CTRL-T Delete tail of line (all characters from cursor to end of line) .ti -1.25i CTRL-O Open up the line (insert line feed and back up) .ti -1.25i ESC G Get and insert a file at the cursor position (CTRL-G in mined) .sp .ti -1.5i \fBREGIONS\fR .ti -1.25i CTRL-^ Set mark at current position for use with CTRL-C and CTRL-K .ti -1.25i CTRL-C Copy the text between the mark and the cursor into the buffer .ti -1.25i CTRL-K Delete text between mark and cursor; also copy it to the buffer .ti -1.25i CTRL-Y Yank contents of the buffer out and insert it at the cursor .sp .ti -1.5i \fBMISCELLANEOUS\fR .ti -1.25i numeric + Search forward (prompts for expression) .ti -1.25i numeric \(mi Search backward (prompts for expression) .ti -1.25i CTRL-] ESC n CTRL-[ goes to line n (slightly different syntax than mined) .ti -1.25i CTRL-R Global replace pattern with string (from cursor to end) .ti -1.25i CTRL-L Replace pattern with string within the current line only .ti -1.25i CTRL-W Write the edited file back to the disk .ti -1.25i CTRL-S Fork off a shell (use CTRL-D to get back to the editor) .ti -1.25i CTRL-G Abort whatever the editor was doing and wait for command (CTRL-\) .ti -1.25i CTRL-E Redraw screen with cursor line positioned in the middle .ti -1.25i CTRL-V Visit (edit) a new file .ti -1.25i CTRL-Q Write buffer to a file .ti -1.25i ESC X Exit the editor .SP 0.5 .in -1.75i .SS "Non-Mined Commands" .LP .SP 0.5 .in +1.75i .ta +1.25i .ti -1.5i \fBCURSOR MOTION\fR .ti -1.25i ESC P Forward paragraph (a paragraph is a line beginning with a dot) .ti -1.25i ESC ] Backward paragraph .ti -1.25i ESC . Indent this line as much as the previous one .sp .ti -1.5i \fBMODIFYING TEXT\fR .ti -1.25i CTRL-\\ Insert the next character (used for inserting control characters) .ti -1.25i ESC T Transpose characters .ti -1.25i ESC W Transpose words .ti -1.25i ESC = Delete white space (horizontal space) .ti -1.25i ESC | Delete blank lines (vertical space) .sp .ti -1.5i \fBREGIONS\fR .ti -1.25i ESC M Mark current paragraph .ti -1.25i ESC ^ Exchange cursor and mark .ti -1.25i ESC Y Yank back the next-to-the-last kill (CTRL-Y yanks the last one) .ti -1.25i ESC A Append next kill to kill buffer .sp .ti -1.5i \fBKEYBOARD MACROS\fR .ti -1.25i ESC / Start Keyboard Macro .ti -1.25i ESC \\ End Keyboard Macro .ti -1.25i ESC * View Keyboard Macro (the PrtSc key on the numeric pad is also a *) .ti -1.25i ESC E Execute Keyboard Macro .sp .ti -1.5i \fBWINDOW MANAGEMENT\fR .ti -1.25i ^X 1 Enter one window mode .ti -1.25i ^X 2 Enter two window mode .ti -1.25i ^X L Make the current window larger .ti -1.25i ^X P Make the window more petit/petite (Yes, Virginia, they are English) .ti -1.25i ^X N Next window .ti -1.25i ^X W New window .sp .ti -1.5i \fBBUFFER MANAGEMENT\fR .ti -1.25i numeric 5 Display the list of current files and buffers .ti -1.25i ESC B Select a buffer .ti -1.25i ESC S Select an existing buffer .ti -1.25i ESC N Mark a buffer as NOT modified (even if it really is) .sp .ti -1.5i \fBUPPER AND LOW CASE MANIPULATION\fR .ti -1.25i ESC I Set first character of word to upper case .ti -1.25i ESC C Capitalize current word .ti -1.25i ESC O Make current word ordinary (i.e., lower case) .ti -1.25i ESC U Set entire region between mark and cursor to upper case .ti -1.25i ESC L Set entire region between mark and cursor to lower case .sp .ti -1.5i \fBMISC%%%%%%%%%ELLANEOUS\fR .ti -1.25i ESC F Find file and read it into its own buffer .ti -1.25i ESC Z Incremental search .ti -1.25i ESC Q Like CTRL-R, but queries at each occurrence (type ? for options) .ti -1.25i ESC R Reset the user profile from a file .ti -1.25i ESC H Help (ELLE prompts for the 1 or 2 character command to describe) .ti -1.25i ESC ; Insert a comment in a C program (generates /* */ for you) .ti -1.25i ^X X Exit the editor (same as ESC X and CTRL-X CTRL-X) .in -1.75i .fi .sp The major differences between ELLE with the \fImined\fR profile and \fImined\fR itself are: .sp .nf .in +0.25i 1. The definition of a \*(OQword\*(CQ is different for forward and backward word 2. The mark is set with CTRL-^ instead of CTRL-@ 3. Use CTRL-G to abort a command instead of CTRL-\\ 4. Use CTRL-\ to literally insert the next character, instead of ALT 5. CTRL-E adjusts the window to put the cursor in the middle of it 6. To get and insert a file, use ESC G instead of CTRL-G 7. To go to line n, type ESC n CTRL-[ instead of CTRL-[ n 8. You exit with CTRL-X CTRL-X and then answer the question with \*(OQy\*(CQ. 9. There are many new commands, windows, larger files, etc. .fi .in -0.25i .sp .SS "Emacs Key Bindings" .PP If you do not have the \fImined\fR profile installed, you get the standard Emacs key bindings. These are listed below. Commands not listed are not implemented. .sp .in +1.75i .ta +1.25i .ti -1.5i \fBCURSOR MOVEMENT\fR .ti -1.25i CTRL-F Forward one character. .ti -1.25i CTRL-B Backward one character. .ti -1.25i CTRL-H Same as CTRL-B: move backward one character. .ti -1.25i ESC F Forward one word. .ti -1.25i ESC B Backward one word. .ti -1.25i CTRL-A Beginning of current line. .ti -1.25i CTRL-E End of current line. .ti -1.25i CTRL-N Next line (goes to the next line). .ti -1.25i CTRL-P Previous line (goes to the previous line). .ti -1.25i CTRL-V Beginning of next screenful. .ti -1.25i ESC V Beginning of previous screenful. .ti -1.25i ESC ]~ Forward Paragraph. .ti -1.25i ESC [~ Backward Paragraph. .ti -1.25i ESC < Beginning of whole buffer. .ti -1.25i ESC > End of whole buffer. .sp .ti -1.5i \fBDELETING\fR .ti -1.25i CTRL-D Deletes forward one character (the one the cursor is under). .ti -1.25i DELETE Deletes backward one character (the one to left of cursor). .ti -1.25i ESC D Kills forward one word. .ti -1.25i ESC DEL Kills backward one word. .ti -1.25i CTRL-K Kills the rest of the line (to the right of the cursor). .ti -1.25i ESC \\ Deletes spaces around the cursor. .ti -1.25i ^X CTRL-O Deletes blank lines around the cursor. .sp .ti -1.5i \fBCASE CHANGE\fR .ti -1.25i ESC C Capitalizes word : first letter becomes uppercase; rest lower .ti -1.25i ESC L Makes the whole next word lowercase. .ti -1.25i ESC U Makes the whole next word uppercase. .ti -1.25i ^X CTRL-L Makes whole region lowercase. .ti -1.25i ^X CTRL-U Makes whole region uppercase. .sp .ti -1.5i \fBSEARCHING\fR (If no string is given, previous string is used) .ti -1.25i CTRL-S Incremental Search forward; prompts \*(OQI-search:\*(CQ .ti -1.25i CTRL-R Reverse Incremental Search; prompts \*(OQR-search:\*(CQ .HS During an incremental search, the following characters have special effects: .HS .in +1.2i .ta +1.0i +0.2i .ti -1.2i \*(OQnormal\*(CQ - Begin searching immediately. .ti -1.2i ^G - Cancel I-search, return to start. .ti -1.2i DEL - Erase last char, return to last match. .ti -1.2i ^S, ^R - Repeat search (or change direction). .ti -1.2i ESC or CR - Exit I-search at current point. .sp .in -1.2i .ta +1.25i .ti -1.25i ESC % Query Replace. Interactive replace. Type \*(OQ?\*(CQ to see options. .ti -1.25i ^X % Replace String. Like Query Replace, but not interactive .sp .ti -1.5i \fBMARKING AREAS\fR .ti -1.25i CTRL-^ Set mark .ti -1.25i ^X CTRL-X Exchange cursor and mark. .ti -1.25i ESC H Mark Paragraph. Sets mark and cursor to surround a para. .ti -1.25i CTRL-W Wipe-out -- kills a \*(OQregion\*(CQ: .ti -1.25i ESC W Copy region. Like CTRL-W then CTRL-Y but modifies buffer .ti -1.25i CTRL-Y Yanks-back (un-kills) whatever you have most recently killed. .ti -1.25i ESC Y Yanks-back (un-kills) the next most recently killed text. .ti -1.25i ESC CTRL-W Append Next Kill. Accumulates stuff from several kills .sp .ti -1.5i \fBFILLING TEXT\fR .ti -1.25i ESC Q Fill the paragraph to the size of the Fill Column. .ti -1.25i ESC G Fill the region. .ti -1.25i ^X F Set Fill Column. ESC Q will use this line size. .ti -1.25i ^X . Set Fill Prefix. Asks for prefix string .ti -1.25i ^X T Toggles Auto Fill Mode. .sp .ti -1.5i \fBWINDOWS\fR .ti -1.25i ^X 2 Make two windows (split screen). .ti -1.25i ^X 1 Make one window (delete window) (make one screen). .ti -1.25i ^X O Go to Other window. .ti -1.25i ^X ^ Grow window: makes current window bigger. .sp .ti -1.5i \fBBUFFERS\fR .ti -1.25i ^X CTRL-F Find a file and make a buffer for it. .ti -1.25i ^X B Select Buffer: goes to specified buffer or makes new one .ti -1.25i ^X CTRL-B Show the names of the buffers used in this editing session. .ti -1.25i ^X K Kill Buffer. .ti -1.25i ESC tilde Say buffer is not modified. .ti -1.25i ^X CTRL-M Toggle EOL mode (per-buffer flag). .sp .ti -1.5i \fBKEYBOARD MACRO\fR .ti -1.25i ^X ( Start collecting a keyboard macro. .ti -1.25i ^X ) Stop collecting. .ti -1.25i ^X E Execute the collected macro. .ti -1.25i ^X * Display the collected macro. .sp .ti -1.5i \fBFILES\fR .ti -1.25i ^X CTRL-I Insert a file where cursor is. .ti -1.25i ^X CTRL-R Read a new file into current buffer. .ti -1.25i ^X CTRL-V Same as ^X ^R above (reads a file). .ti -1.25i ^X CTRL-W Write buffer out to new file name. .ti -1.25i ^X CTRL-S Save file: write out buffer to its file name. .ti -1.25i ^X CTRL-E Write region out to new file name. .sp .ti -1.5i \fBMISCELLANEOUS\fR .ti -1.25i ^X CTRL-Z Exit from ELLE. .ti -1.25i ^X ! Escape to shell (CTRL-D to return) .ti -1.25i CTRL-O Open up line .ti -1.25i LINEFEED Same as typing RETURN and TAB. .ti -1.25i CTRL-T Transposes characters. .ti -1.25i ESC T Transposes words. .ti -1.25i CTRL-U Makes the next command happen four times. .ti -1.25i CTRL-U number Makes the next command happen \*(OQnumber\*(CQ times. .ti -1.25i ESC number Same as CTRL-U number. .ti -1.25i CTRL-L Refreshes screen. .ti -1.25i CTRL-U CTRL-L Refresh only the line cursor is on. .ti -1.25i CTRL-U n CTRL-L Change window so the cursor is on line n .ti -1.25i CTRL-Q Quote: insert the next character no matter what it is. .ti -1.25i CTRL-G Quit: use to avoid answering a question. .ti -1.25i ESC ; Inserts comment (for writing C programs). .ti -1.25i ESC I Inserts indentation equal to previous line. .ti -1.25i ESC M Move to end of this line's indentation. .ti -1.25i CTRL-_ Describe a command (if the command database is online) .sp .ti -1.5i \fBUNUSED CONTROLS\fR .ti -1.25i CTRL-C Not used. .ti -1.25i CTRL-Z Not used. .ti -1.25i CTRL-] Not used. .fi .in -1.75i .sp .SP 0.5 .SS "ELLE profile" .PP It is possible to create your own user profile. The mechanism is different from Emacs, since ELLE does not have Mock Lisp. Proceed as follows. .LI .IT Modify \fI.ellepro.e\fR to suit your taste. .IT Install \fI.ellepro.e\fR in your home directory. .IT Type: .HS .Cx "ellec \(enProfile" .HS .IT Check to see if \fI.ellepro.b1\fR has been created. If it has, you are ready to go. .LX .SS "Author" .PP ELLE was written by Ken Harrenstien of SRI (klh@sri.com). .CD "elvis \(en clone of the Berkeley vi editor" .SX "elvis \fR[\fB\(enRerv\fR] [\fB\(ent \fItag\fR] \fR[\fIfile\fR] ..." .FL "\(enR" "Set the read-only option" .FL "\(ene" "Start up emulating \fIex\fR" .FL "\(enr" "Tell the user to use \fIelvrec\fR instead .FL "\(ent" "Start editing at the given tag" .FL "\(env" "Start up emulating \fIvi\fR" .EX "elvis" "Call the editor" .EX "elvis prog.c" "edit \fIprog.c\fR" .PP \fIElvis\fR is a full-screen editor closely modeled on the famous Berkeley \fIvi\fR editor. It provides essentially the same interface to the user as \fIvi\fR, but the code is completely new, written from scratch. This document provides a brief introduction to \fIvi\fR. It is not intended as a tutorial for beginners. Most books on .Ux cover \fIvi\fR. .PP Like \fIvi\fR, \fIelvis\fR can operate as a screen editor (\fIvi\fR mode) or as a line editor (\fIex\fR) mode. It can be called either as \fIelvis\fR \fIvi\fR,or as \fIex\fR, depending on which is desired. They are all links to the same file. .SS "Vi Commands" .PP Below is a list of the \fIvi\fR commands supported. The following symbols are used in the table: .HS .in +1.25i .ta +1.0i .ti -1.0i count Integer parameter telling how many or how much .ti -1.0i key One character parameter to the command .ti -1.0i inp Interactive input expected .ti -1.0i mv Indicates how much for commands like \fIdelete\fR and \fIchange\fR: .in +0.8i .ta +0.3i .ti -0.3i ( Previous sentence .ti -0.3i ) Next sentence .ti -0.3i { Previous paragraph .ti -0.3i } Next paragraph (delimited by blank line, \fI.PP, .LP, .IP\fR etc.) .ti -0.3i [ Previous section (delimited by \fI.SH\fR or \fI.NH\fR) .br A repeated command character means the scope is this line .in -0.8i .ta +1.0i .ti -1.0i MOVE Indicates commands that may also be used where \fImv\fR is specified .ti -1.0i EDIT These commands affect text and may be repeated by the \fI.\fR command .in -1.25i .HS In addition to the above notation, the caret (^) is used as an abbreviation for CTRL. For example, ^A means CTRL-A. .HS .in +2i .ta +1i +1i +3.3i .ti -2i \fBCount~~~~ Command Description Type\fR .ti -2i ^A (Not defined) .ti -2i ^B Move toward the top of the file by 1 screenful .ti -2i ^C (Not defined) .ti -2i count ^D Scroll down \fIcount\fR lines (default 1/2 screen) .ti -2i count ^E Scroll up \fIcount\fR lines .ti -2i ^F Move toward the bottom of the file by 1 screenful .ti -2i ^G Show file status, and the current line .ti -2i count ^H Move left, like \fIh\fR MOVE .ti -2i ^I (Not defined) .ti -2i count ^J Move down MOVE .ti -2i ^K (Not defined) .ti -2i ^l Redraw the screen .ti -2i count ^M Move to the front of the next line MOVE .ti -2i count ^N Move down MOVE .ti -2i ^O (Not defined) .ti -2i count ^P Move up MOVE .ti -2i ^Q (Not defined) .ti -2i ^R Redraw the screen .ti -2i ^S (Not defined) .ti -2i ^T (Not defined) .ti -2i count ^U Scroll up \fIcount\fR lines (default 1/2 screen) .ti -2i ^V (Not defined) .ti -2i ^W (Not defined) .ti -2i ^X (Not defined) .ti -2i count ^Y Scroll down \fIcount\fR lines .ti -2i ^Z (Not defined) .ti -2i ESC (Not defined) .ti -2i ^\e (Not defined) .ti -2i ^] If the cursor is on a tag name, go to that tag .ti -2i ^^ Save this file and edit the previous file .ti -2i ^_ (Not defined) .ti -2i count SPACE Move right,like \fIl\fR MOVE .ti -2i ! mv Run the selected lines thru an external filter program .ti -2i " key Select which cut buffer to use next .ti -2i # (Not defined) .ti -2i $ Move to the rear of the current line MOVE .ti -2i % move to the matching (){}[] character MOVE .ti -2i & (Not defined) .ti -2i ' key Move to a marked line MOVE .ti -2i count ( Move backward \fIcount\fR sentences MOVE .ti -2i count ) Move forward \fIcount\fR sentences MOVE .ti -2i * (Not defined) .ti -2i count + Move to the front of the next line MOVE .ti -2i count , Repeat the previous [\fIfFtT\fR] but the other way MOVE .ti -2i count \(en Move to the front of the preceding line MOVE .ti -2i . Repeat the previous \*(OQedit\*(CQ command .ti -2i / Text search forward for a given regular expr MOVE .ti -2i 0 If not part of count, move to 1st char of this line MOVE .ti -2i 1 Part of count .ti -2i 2 Part of count .ti -2i 3 Part of count .ti -2i 4 Part of count .ti -2i 5 Part of count .ti -2i 6 Part of count .ti -2i 7 Part of count .ti -2i 8 Part of count .ti -2i 9 Part of count .ti -2i : Text. Run single \fIex\fR cmd .ti -2i count ; Repeat the previous [fFtT] cmd MOVE .ti -2i count < mv Shift text left EDIT .ti -2i = (Not defined) .ti -2i count > mv Shift text right EDIT .ti -2i ? text Search backward for a given regular expression MOVE .ti -2i @ (Not defined) .ti -2i count A inp Append at end of the line EDIT .ti -2i count B Move back Word MOVE .ti -2i C inp Change text from cursor through end of line EDIT .ti -2i D Delete text from cursor through end of line EDIT .ti -2i count E Move end of Word MOVE .ti -2i count F key Move leftward to a given character MOVE .ti -2i count G Move to line #\fIcount\fR (default is the bottom line) MOVE .ti -2i count H Move to home row (the line at the top of the screen) .ti -2i count I inp Insert at the front of the line (after indents) EDIT .ti -2i count J Join lines, to form one big line EDIT .ti -2i K Look up keyword .ti -2i count L Move to last row (the line at the bottom of the screen) .ti -2i M Move to middle row (the line in the middle) .ti -2i N Repeat previous search, but the opposite way MOVE .ti -2i count O inp Open up a new line above the current line EDIT .ti -2i P Paste text before the cursor .ti -2i Q Quit to EX mode .ti -2i R inp Overtype EDIT .ti -2i count S inp Change lines, like \fIcount\fRcc .ti -2i count T key Move leftward \fIalmost\fR to a given character MOVE .ti -2i U Undo all recent changes to the current line .ti -2i V (Not defined) .ti -2i count W Move forward \fIcount\fR Words MOVE .ti -2i count X Delete the character(s) to the left of the cursor EDIT .ti -2i count Y Yank text line(s) (copy them into a cut buffer) .ti -2i Z Z Save the file & exit .ti -2i [ [ Move back 1 section MOVE .ti -2i \e (Not defined) .ti -2i ] ] Move forward 1 section MOVE .ti -2i ^ Move to the front of the current line (after indent) MOVE .ti -2i \(ul (Not defined) .ti -2i ` key Move to a marked character MOVE .ti -2i count a inp Insert text after the cursor EDIT .ti -2i count b Move back \fIcount\fR words MOVE .ti -2i c mv Change text EDIT .ti -2i d mv Delete text EDIT .ti -2i count e Move forward to the end of the current word MOVE .ti -2i count f key Move rightward to a given character MOVE .ti -2i g (Not defined) .ti -2i count h Move left MOVE .ti -2i count i inp Insert text at the cursor EDIT .ti -2i count j Move down MOVE .ti -2i count k Move up MOVE .ti -2i count l Move right MOVE .ti -2i m key Mark a line or character .ti -2i n Repeat the previous search MOVE .ti -2i count o inp Open a new line below the current line EDIT .ti -2i p Paste text after the cursor .ti -2i q (Not defined) .ti -2i count r key Replace \fIcount\fR chars by a given character EDIT .ti -2i count s inp Replace \fIcount\fR chars with text from the user EDIT .ti -2i count t key Move rightward \fIalmost\fR to a given character MOVE .ti -2i u Undo the previous edit command .ti -2i v (Not defined) .ti -2i count w Move forward \fIcount\fR words MOVE .ti -2i count x Delete the character that the cursor's on EDIT .ti -2i y mv Yank text (copy it into a cut buffer) .ti -2i z key Scroll current line to the screen's +=top -=bottom .=middle .ti -2i count { Move back \fIcount\fR paragraphs MOVE .ti -2i count | Move to column \fIcount\fR (the leftmost column is 1) .ti -2i count } Move forward \fIcount\fR paragraphs MOVE .ti -2i .tr ~~ count \(ap Switch a character between upper & lower case EDIT .tr ~ .ti -2i DEL (Not defined) .in -2i .SS "Ex Commands" .PP Below is a list of the \fIex\fR commands supported. All can be abbreviated. .UU "General" .LP .nf .ta 1.2i 2.4i [line] append args [files] cd [directory] chdir [directory] [line][,line] change [line][,line] copy line [line][,line] debug[!] [line][,line] Delete [\*(CQx] edit[!] [file] ex[!] [file] file [line][,line&& & & & & &&&&&&&&&&&&&&&&&&& &!&"&#&$&] global /regexp/ command [line] Insert [line][,line] join [line][,line] list map[!] key mapped_to [line] mark x mkexrc [line][,line] Move line next[!] [files] Next[!] previous[!] [line][,line] print [line] put [\*(CQx] quit[!] [line] read file rewind[!] set [options] [line][,line] substitute /regexp/replacement/[p][g] tag[!] tagname [line][,line] to line Undo unmap[!] key validate[!] version [line][,line] vglobal /regexp/ command visual wq [line][,line] write[!] [[>>]file] xit[!] [line][,line] yank [\*(CQx] [line][,line] ! command [line][,line] < [line][,line] = [line][,line] > .SP 0.25 .UU "Text Entry" .SP 0.25 .LP .ta 1.2i 2.4i .nf [line] append [line][,line] change [\*(CQx] [line] Insert .fi The (a)ppend command inserts text after the specified line. The (i)nsert command inserts text before the specified line. The (c)hange command copies the range of lines into a cut buffer, deletes them, and inserts new text where the old text used to be. For all of these commands, you indicate the end of the text you're inserting by hitting ^D or by entering a line which contains only a period. .SP 0.25 .UU "Cut & Paste" .SP 0.25 .LP .ta 1.2i 2.4i .nf [line][,line] Delete [\*(CQx] [line][,line] yank [\*(CQx] [line] put[!] [\*(CQx] [line][,line] copy line [line][,line] to line [line][,line] Move line .fi The (d)elete command copies the specified range of lines into a cut buffer, and then deletes them. The (y)ank command copies the specified range of lines into a cut buffer, but does \fInot\fR delete them. The (pu)t command inserts text from a cut buffer after the specified line\(emor before it if the ! is present. The (co)py and (t)o commands yank the specified range of lines and then immediately paste them after some other line. The (m)ove command deletes the specified range of lines and then immediately pastes them after some other line. If the destination line comes after the deleted text, then it will be adjusted automatically to account for the deleted lines. .UU "Displaying Text" .LP .ta 1.2i 2.4i .nf [line][,line] print [line][,line] list .fi The (p)rint command displays the specified range of lines. The (l)ist command also displays them, but it is careful to make control characters visible. .UU "Global Operations" .LP .ta 1.2i 2.4i .nf [line][,line] global /regexp/ command [line][,line] vglobal /regexp/ command .fi The (g)lobal command searches through the lines of the specified range (or through the whole file if no range is specified) for lines that contain a given regular expression. It then moves the cursor to each of these lines and runs some other command on them. The (v)global command is similar, but it searches for lines that \fIdo not\fR contain the regular expression. .UU "Line Editing" .LP .ta 1.2i 2.4i .nf [line][,line] join [line][,line] ! program [line][,line] < [line][,line] > [line][,line] substitute /regexp/replacement/[p][g] .fi The (j)oin command concatenates all lines in the specified range together to form one big line. If only a single line is specified, then the following line is catenated onto it. The ! command runs an external filter program, and feeds the specified range of lines to it's stdin. The lines are then replaced by the output of the filter. A typical example would be \*(OQ:'a,'z!sort -n\*(CQ to sort the lines 'a,'z according to their numeric values. The < and > commands shift the specified range of lines left or right, normally by the width of 1 tab character. The \*(OQshiftwidth\*(CQ option determines the shifting amount. The (s)ubstitute command finds the regular expression in each line, and replaces it with the replacement text. The \*(OQp\*(CQ option causes the altered lines to be printed, and the \*(OQg\*(CQ option permits all instances of the regular expression to be found & replaced. (Without \*(OQg\*(CQ, only the first occurrence is replaced.) .SP 0.25 .UU "Undo" .SP 0.25 .LP .ta 1.2i 2.4i .nf undo .fi The (u)ndo command restores the file to the state it was in before your most recent command which changed text. .SP 0.25 .UU "Configuration & Status" .SP 0.25 .LP .ta 1.2i 2.4i .nf map[!] [key mapped_to] unmap[!] key set [options] mkexrc [line] mark x visual version [line][,line] = file .fi The (ma)p command allows you to configure \fIelvis\fR to recognize your function keys, and treat them as though they transmitted some other sequence of characters. Normally this mapping is done only when in the visual command mode, but with the [!] present it will map keys under all contexts. When this command is given with no arguments, it prints a table showing all mappings currently in effect. When called with two arguments, the first is the sequence that your function key really sends, and the second is the sequence that you want \fIelvis\fR to treat it as having sent. The (unm)ap command removes key definitions that were made via the map command. The (se)t command allows you examine or set various options. With no arguments, it displays the values of options that have been changed. With the single argument \*(OQall\*(CQ it displays the values of all options, regardless of whether they've been explicitly set or not. Otherwise, the arguments are treated as options to be set. The (mk)exrc command saves the current configuration to a file called \fI.exrc\fR in the current directory. The mar(k) command defines a named mark to refer to a specific place in the file. This mark may be used later to specify lines for other commands. The (vi)sual command puts the editor into visual mode. Instead of emulating ex, \fIelvis\fR will start emulating vi. The (ve)rsion command tells you that what version of \fIelvis\fR this is. The = command tells you what line you specified, or, if you specified a range of lines, it will tell you both endpoints and the number of lines included in the range. The file command tells you the name of the file, whether it has been modified, the number of lines in the file, and the current line number. .UU "Multiple Files" .LP .ta 1.2i 2.4i .nf args [files] next[!] [files] Next[!] previous[!] rewind[!] .fi When you invoke \fIelvis\fR from your shell's command line, any filenames that you give to \fIelvis\fR as arguments are stored in the args list. The (ar)gs command will display this list, or define a new one. The (n)ext command switches from the current file to the next one in the args list. You may specify a new args list here, too. The (N)ext and (pre)vious commands (they're really aliases for the same command) switch from the current file to the preceding file in the args list. The (rew)ind command switches from the current file to the first file in the args list. .SP 1 .UU "Switching Files" .SP 1 .LP .ta 1.2i 2.4i .nf edit[!] [file] tag[!] tagname .fi The (e)dit command allows to switch from the current file to some other file. This has nothing to do with the args list, by the way. The (ta)g command looks up a given tagname in a file called \*(OQtags". This tells it which file the tag is in, and how to find it in that file. \fIElvis\fR then switches to the tag's file and finds the tag. .SP 1 .UU "Exiting" .SP 1 .LP .ta 1.2i 2.4i .nf quit[!] wq xit .fi The (q)uit command exits from the editor without saving your file. The (wq) and (x)it commands (really two names for the same command) both write the file before exiting. .UU "File I/O" .LP .ta 1.2i 2.4i .nf [line] read file [line][,line] write[!][[>>]file] .fi The (r)ead command gets text from another file and inserts it after the specified line. .fi The (w)rite command writes the whole file, or just part of it, to some other file. The !, if present, will permit the lines to be written even if you've set the readonly option. If you precede the filename by >> then the lies will be appended to the file. .UU "Directory" .LP .ta 1.2i 2.4i .nf cd [directory] chdir [directory] shell .fi The (cd) and (chd)ir commands (really two names for one command) switch the current working directory. The (sh)ell command starts an interactive shell. .SP 0.5 .UU "Debugging" .SP 0.5 .LP .ta 1.2i 2.4i .nf [line][,line] debug[!] validate[!] .fi These commands are only available if you compile \fIelvis\fR with the \fB-DDEBUG\fR flag. The de(b)ug command lists stats for the blocks which contain the specified range of lines. If the ! is present, then the contents of those blocks is displayed, too. The (va)lidate command checks certain variables for internal consistency. Normally it does not output anything unless it detects a problem. With the !, though, it will always produce *some* output. .SP 0.5 .SS "Extensions" .SP 0.5 .PP. .ta 1i .in +0.25i In addition to the standard commands, a variety of extra features are present in \fIelvis\fR that are not present in \fIvi\fR. They are described below. .ti -0.25i .B .exrc .br \fIElvis\fR first runs a \fI.exrc\fR file (if there is one) from your $HOME directory. After that, it runs a \fI.exrc\fR (if there is one) from the current directory. The one in the current directory may override settings made by the one in the $HOME directory. .ti -0.25i .B :mkexrc .ti -0.25i .B :mk .br This EX command saves the current :set and :map configurations in the \*(OQ.exrc\*(CQ file in your current directory. .ti -0.25i .B :args .ti -0.25i .B :ar .br You can use the :args command to define a new args list, as in: :args *.h After you have defined a new args list, the next time you issue a :next command \fIelvis\fR will switch to the first file of the new list. .ti -0.25i .B :Next .ti -0.25i .B :previous .ti -0.25i .B :N .ti -0.25i .B :pre .br These commands move backwards through the args list. .ti -0.25i .B zz .br In VI, the (lowercase) \*(OQzz\*(CQ command will center the current line on the screen, like \*(OQz=" .ti -0.25i .B . .br The default count value for . is the same as the previous command which . is meant to repeat. However, you can supply a new count if you wish. For example, after \*(OQ3dw\*(CQ, \*(OQ.\*(CQ will delete 3 words, but \*(OQ5.\*(CQ will delete 5 words. .ti -0.25i \fB"\fR .br The text which was most recently input (via a \*(OQcw\*(CQ command, or something similar) is saved in a cut buffer called ". (which is a pretty hard name to write in an English sentence). You can use this with the \*(OQp\*(CQ or \*(OQP\*(CQ commands thusly: .HS ".p .HS .ti -0.25i .B K .br You can move the cursor onto a word and press shift-K to have \fIelvis\fR run a reference program to look that word up. This command alone is worth the price of admission! See the ctags and ref programs. .ti -0.25i .B input .br You can backspace back past the beginning of the line. If you type CTRL-A, then the text that you input last time is inserted. You will remain in input mode, so you can backspace over part of it, or add more to it. (This is sort of like CTRL-@ on the real vi, except that CTRL-A really works.) Real \fIvi\fR can only remember up to 128 characters of input, but \fIelvis\fR can remember any amount. .ti -0.25i .B :set charattr .ti -0.25i .B :se ca .br \fIElvis\fR can display \*(OQbackslash-f\*(CQ style character attributes on the screen as you edit. The following example shows the recognized attributes: normal \fBboldface\fR \fIitalics\fR NOTE: you must compile \fIelvis\fR without the \(enDSET_NOCHARATTR flag for this to work. .in -0.25i .SS "Omissions" .PP A few \fIvi\fR features are missing. The replace mode is a hack. It does not save the text that it overwrites. .PP Long lines are displayed differently\(emwhere the real vi would wrap a long line onto several rows of the screen, \fIelvis\fR simply displays part of the line, and allows you to scroll the screen sideways to see the rest of it. .PP The \*(OQ:preserve\*(CQ and \*(OQ:recover\*(CQ commands are missing, as is the \fB\(enr\fR flag. \*(OQ:Preserve" is practically never used and since use of \*(OQ:recover\\*(CQ is so rare, it was decided to implement it as a separate program. There's no need to load the recovery code into memory every time you edit a file. .PP LISP support is missing. The \*(OQ@\*(CQ and \*(OQ:@\*(CQ commands are missing. You cannot APPEND to a cut buffer. .SS "Options" .PP A variety of options can be set as described below: .HS .nf .in +0.25i .ta 0.9i 1.35i 2.1i 3.0i \fBName Abbr Type Default Description\fR autoindent as Bool FALSE autoindent during input? autowrite aw Bool FALSE write file for :n command? charattr ca Bool FALSE display bold & underline chars? columns co Number 80 width of screen, in characters directory dir String /usr/tmp where tmp files are kept errorbells eb Bool TRUE ring bell on error? exrefresh er Bool TRUE EX mode calls write() often? ignorecase ic Bool FALSE searches: upper/lowercase OK? keytime kt Number 1 allow slow receipt of ESC seq? keywordprg kp String /usr/bin/ref program to run for shift-K lines ln Number 25 height of screen, in lines list li Bool FALSE show tabs as \*(OQ^I\*(CQ? magic ma Bool TRUE searches: allow metacharacters? paragraphs pa String PPppPApa paragraphs start with .PP, etc. readonly ro Bool FALSE no file should be written back? report re Number 5 report changes to X lines? scroll sc Number 12 default #lines for ^U and ^D sections se String SEseSHsh sections start with .SE, etc. shell sh String \fI/bin/sh\fR shell program, from environment shiftwidth sw Number 8 width of < or > commands sidescroll ss Number 8 #chars to scroll sideways by sync sy Bool FALSE call sync() after each change? tabstop ts Number 8 width of a tab character term te String "?" terminal type, from environment vbell vb Bool TRUE use visible bell if possible? warn wa Bool TRUE warn if file not saved for :!cmd wrapmargin wm Number 0 Insert newline after which col? wrapscan ws Bool TRUE searches: wrap at EOF? .fi .ti -0.25i .B autoindent .br During input mode, the autoindent option will cause each added line to begin with the same amount of leading whitespace as the line above it. Without autoindent, added lines are initially empty. .ti -0.25i .B autowrite .br When you're editing one file and decide to switch to another\(emvia the :tag command, or :next command, perhaps\(emif your current file has been modified, then \fIelvis\fR will normally print an error message and refuse to switch. However, if the autowrite option is on, then \fIelvis\fR will write the modified version of the current file and successfully switch to the new file. .ti -0.25i .B charattr .br Many text formatting programs allow you to designate portions of your text to be underlined, italicized, or boldface by embedding the special strings \\fU, \\fI, and \\fB in your text. The special string \\fR marks the end of underlined or boldface text. \fIElvis\fR normally treats those special strings just like any other text. However, if the \fIcharattr\fR option is on, then \fIelvis\fR will interpret those special strings correctly, to display underlined or boldface text on the screen. (This only works, of course, if your terminal can display underlined and boldface, and if the TERMCAP entry says how to do it.) .ti -0.25i .B columns .br This is a \*(OQread only\*(CQ option. You cannot change its value, but you can have \fIelvis\fR print it. It shows how wide your screen is. .ti -0.25i .B directory .br Elvis uses temporary files to store changed text. This option allows you to control where those temporary files will be. Ideally, you should store them on in fast non-volatile memory, such as a hard disk. This option can only be set in the ".exrc" file. .ti -0.25i .B errorbells .br Normally, \fIelvis\fR will ring your terminal's bell if you make an error. However, in noerrorbells mode, your terminal will remain silent. .ti -0.25i .B exrefresh .br The EX mode of \fIelvis\fR writes many lines to the screen. You can make \fIelvis\fR either write each line to the screen separately, or save up many lines and write them all at once. The exrefresh option is normally on, so each line is written to the screen separately. You may wish to turn the exrefresh option off (:se noer) if the \*(OQwrite\*(CQ system call is costly on your machine, or if you're using a windowing environment. (Windowing environments scroll text a lot faster when you write many lines at once.) This option has no effect in \fIvi\fR mode. .ti -0.25i .B ignorecase .br Normally, when \fIelvis\fR searches for text, it treats uppercase letters as being different for lowercase letters. When the ignorecase option is on, uppercase and lowercase are treated as equal. .ti -0.25i .B keytime .br The arrow keys of most terminals send a multi-character sequence. It takes a measurable amount of time for these sequences to be transmitted. The keytime option allows you to control the maximum amount of time to allow for an arrow key (or other mapped key) to be received in full. The default keytime value is 2. Because of the way .Ux timekeeping works, the actual amount of time allowed will vary slightly, but it will always be between 1 and 2 seconds. If you set keytime to 1, then the actual amount of time allowed will be between 0 and 1 second. This will generally make the keyboard's response be a little faster (mostly for the ESC key), but on those occasions where the time allowed happens to be closer to 0 than 1 second, \fIelvis\fR may fail to allow enough time for an arrow key's sequence to be received fully. Ugh. As a special case, you can set keytime to 0 to disable this time limit stuff altogether. The big problem here is: If your arrow keys' sequences start with an ESC, then every time you hit your ESC key \fIelvis\fR will wait... and wait... to see if maybe that ESC was part of an arrow key's sequence. NOTE: this option is a generalization of the timeout option of the real vi. .ti -0.25i .B keywordprg .br \fIElvis\fR has a special keyword lookup feature. You move the cursor onto a word, and hit shift-K, and \fIelvis\fR uses another program to look up the word and display information about it. This option says which program gets run. It should contain the full pathname of the program; your whole execution path is \fInot\fR checked. The default value of this option is \fI/usr/bin/ref\fR, which is a program that looks up the definition of a function in C. It looks up the function name in a file called \*(OQrefs\*(CQ which is created by ctags. You can substitute other programs, such as an English dictionary program or the online manual. \fIelvis\fR runs the program, using the keyword as its only argument. The program should write information to stdout. The program's exit status should be 0, unless you want \fIelvis\fR to print \*(OQ<<< failed >>>". .ti -0.25i .B lines .br This \*(OQread only\*(CQ option shows how many lines you screen has. .ti -0.25i .B list .br Normally (in \*(OQnolist" mode) \fIelvis\fR will expand tabs to the proper number of spaces on the screen, so that the file appears the same would it would be if you printed it or looked at it with \fImore\fR. Sometimes, though, it can be handy to have the tabs displayed as \*(OQ^I". In \*(OQlist" mode, \fIelvis\fR does this, and also displays a \*(OQ$" after the end of the line. .ti -0.25i .B magic .br The search mechanism in \fIelvis\fR can accept \*(OQregular expressions\*(CQ\(emstrings in which certain characters have special meaning. The magic option is normally on, which causes these characters to be treated specially. If you turn the magic option off (:se noma), then all characters except ^ and $ are treated literally. ^ and $ retain their special meanings regardless of the setting of magic. .ti -0.25i .B paragraphs .br The { and } commands move the cursor forward or backward in increments of one paragraph. Paragraphs may be separated by blank lines, or by a \*(OQdot\*(CQ command of a text formatter. Different text formatters use different \*(OQdot\*(CQ commands. This option allows you to configure \fIelvis\fR to work with your text formatter. It is assumed that your formatter uses commands that start with a ".\*(CQ character at the front of a line, and then have a one- or two-character command name. The value of the paragraphs option is a string in which each pair of characters is one possible form of your text formatter's paragraph command. .ti -0.25i .B readonly .br Normally, \fIelvis\fR will let you write back any file to which you have write permission. If you do not have write permission, then you can only write the changed version of the file to a \fIdifferent\fR file. If you set the readonly option, then \fIelvis\fR will pretend you do not have write permission to \fIany\fR file you edit. It is useful when you really only mean to use \fIelvis\fR to look at a file, not to change it. This way you cannot change it accidentally. This option is normally off, unless you use the \*(OQview\*(CQ alias of \fIelvis\fR. \*(OQView\*(CQ is like \fIvi\fR except that the readonly option is on. .ti -0.25i .B report .br Commands in \fIelvis\fR may affect many lines. For commands that affect a lot of lines, \fIelvis\fR will output a message saying what was done and how many lines were affected. This option allows you to define what \*(OQa lot of lines\*(CQ means. The default is 5, so any command which affects 5 or more lines will cause a message to be shown. .ti -0.25i .B scroll .br The CTRL-U and CTRL-D keys normally scroll backward or forward by half a screenful, but this is adjustable. The value of this option says how many lines those keys should scroll by. .ti -0.25i .B sections .br The [[ and ]] commands move the cursor backward or forward in increment of 1 section. Sections may be delimited by a { character in column 1 (which is useful for C source code) or by means of a text formatter's \*(OQdot\*(CQ commands. This option allows you to configure \fIelvis\fR to work with your text formatter's \*(OQsection\*(CQ command, in exactly the same way that the paragraphs option makes it work with the formatter's \*(OQparagraphs" command. .ti -0.25i .B shell .br When \fIelvis\fR forks a shell (perhaps for the :! or :shell commands) this is the program that is uses as a shell. This is \fI/bin/sh\fR by default, unless you have set the SHELL environment variable, it which case the default value is copied from the environment. .ti -0.25i .B shiftwidth .br The < and > commands shift text left or right by some uniform number of columns. The shiftwidth option defines that uniform number. The default is 8. .ti -0.25i .B sidescroll .br For long lines, \fIelvis\fR scrolls sideways. (This is different from the real \fIvi\fR, which wraps a single long line onto several rows of the screen.) To minimize the number of scrolls needed, \fIelvis\fR moves the screen sideways by several characters at a time. The value of this option says how many characters' widths to scroll at a time. Generally, the faster your screen can be redrawn, the lower the value you will want in this option. .ti -0.25i .B sync .br If the system crashes during an edit session, then most of your work can be recovered from the temporary file that \fIelvis\fR uses to store changes. However, sometimes .MX will not copy changes to the hard disk immediately, so recovery might not be possible. The [no]sync option lets you control this. In nosync mode (which is the default), \fIelvis\fR lets the operating system control when data is written to the disk. This is generally faster. In sync mode, \fIelvis\fR forces all changes out to disk every time you make a change. This is generally safer, but slower. .ti -0.25i .B tabstop .br Tab characters are normally 8 characters wide, but you can change their widths by means of this option. .ti -0.25i .B term .br This \*(OQread only\*(CQ option shows the name of the termcap entry that \fIelvis\fR is using for your terminal. .ti -0.25i .B vbell .br If your termcap entry describes a visible alternative to ringing your terminal's bell, then this option will say whether the visible version gets used or not. Normally it will be. If your termcap does NOT include a visible bell capability, then the vbell option will be off, and you cannot turn it on. .ti -0.25i .B warn .br \fIElvis\fR will normally warn you if you run a shell command without saving your changed version of a file. The \*(OQnowarn" option prevents this warning. .ti -0.25i .B wrapmargin .br Normally (with wrapmargin=0) \fIelvis\fR will let you type in extremely long lines, if you wish. However, with wrapmargin set to something other that 0 (wrapmargin=65 is nice), \fIelvis\fR will automatically cause long lines to be \*(OQwrapped" on a word break for lines longer than wrapmargin's setting. .ti -0.25i .B wrapscan .br Normally, when you search for something, \fIelvis\fR will find it no matter where it is in the file. \fIelvis\fR starts at the cursor position, and searches forward. If \fIelvis\fR hits EOF without finding what you're looking for, then it wraps around to continue searching from line 1. If you turn off the wrapscan option (:se nows), then when \fIelvis\fR hits EOF during a search, it will stop and say so. .in -0.25i .SS "Cflags" .PP \fIElvis\fR uses many preprocessor symbols to control compilation. Most of these flags allow you to disable small sets of features. \s-2MINIX\s0-ST users will probably want all features enabled, but \s-2MINIX\s0-PC users will have to disable one or two feature sets because otherwise \fIelvis\fR would be too large to compile and run. These symbols can be defined via flags passed to the compiler. The best way to do this is to edit the Makefile, and append the flag to the \*(OQCFLAGS=\*(CQ line. After you do that, you must recompile elvis completely by saying .HS .Cx "make clean" .br .Cx "make" .HS .in +0.25i .ti -0.25i .B \(enDM_SYSV .br This flag causes \fIelvis\fR to use System-V ioctl() calls for controlling your terminal; normally it uses v7/BSD/\s-2MINIX\s0 ioctl() calls. .ti -0.25i .B \(enDDATE .br The symbol DATE should be defined to look like a string constant, giving the date when \fIelvis\fR was compiled. This date is reported by the \*(OQ:version\*(CQ command. You can also leave DATE undefined, in which case \*(OQ:version\*(CQ will not report the compilation date. .ti -0.25i .B \(enDCRUNCH .br This flag causes several large often-used macros to be replaced by equivalent functions. This saves about 4K of space in the \*(OQ.text\*(CQ segment, and it does not cost you any features. .ti -0.25i .B \(enDDEBUG .br This adds many internal consistency checks and the \*(OQ:debug\*(CQ and \*(OQ:validate\*(CQ commands. It increases the size of \*(OQtext\*(CQ by about 5K bytes. .ti -0.25i .B \(enDNO_CHARATTR .br This permanenently disables the \*(OQcharattr\*(CQ option. It reduces the size of \*(OQ.text\*(CQ by about 850 bytes. .ti -0.25i .B \(enDNO_RECYCLE .br Normally, \fIelvis\fR will recycle space in the temporary file which contains totally obsolete text. The \fB\(enDNO_RECYCLE\fR option disables this, making your \*(OQ.text\*(CQ segment smaller by about 1K but also permitting the temporary file to grow very quickly. If you have less than two megabytes of free space on your disk, then do not even consider using this flag. .ti -0.25i .B \(enDNO_SENTENCE .br This leaves out the \*(OQ(\*(CQ and \*(OQ)\*(CQ visual commands, and removes the code that allows the \*(OQ[[\*(CQ, \*(OQ]]\*(CQ, \*(OQ{\*(CQ, and \*(OQ}\*(CQ commands to recognize \fRnroff\fR macros. The \*(OQ[[\*(CQ and \*(OQ]]\*(CQ commands will still move to the start of the previous/next C function source code, though, and \*(OQ{\*(CQ and \*(OQ}\*(CQ will move to the previous/next blank line. This saves about 650 bytes from the \*(OQ.text\*(CQ segment. .ti -0.25i .B \(enDNO_CHARSEARCH .br This leaves out the visual commands which locate a given character in the current line: \*(OQf\*(CQ, \*(OQt\*(CQ, \*(OQF\*(CQ, \*(OQT\*(CQ, \*(OQ;\*(CQ, and \*(OQ,\*(CQ. This saves about 900 bytes. .ti -0.25i .B \(enDNO_EXTENSIONS .br This leaves out the \*(OQ:mkexrc\*(CQ command, and the \*(OQK\*(CQ and \*(OQ#\*(CQ visual commands. Other extensions are either inherent in the design of \fIelvis\fR, or are too tiny to be worth removing. This saves about 500 bytes. .ti -0.25i .B \(enDNO_MAGIC .br This permanently disables the \*(OQmagic\*(CQ option, so that most meta-characters in a regular expression are not recognized. This saves about 3K bytes from the \*(OQ.text\*(CQ segment. .HS .in -0.25i .SS "Termcap" \fIElvis\fR can use standard termcap entries, but it also recognizes and uses several extra capabilities, if you give them. All of these are optional. .nf .in +0.25i .ta 1.5i .HS \fBCapability Description\fR :PU=: sequence received from the key :PD=: sequence received from the key :HM=: sequence received from the key :EN=: sequence received from the key :VB=: sequence sent to start bold printing :Vb=: sequence sent to end bold printing .in -0.25i .SS "Author" .PP \fIElvis\fR was written by Steve Kirkendall. He can be reached by email at: kirkenda@cs.pdx.edu for comments regarding \fIelvis\fR. .CD "kermit \(en transfer a file using the kermit protocol" .SX "kermit" .FL "\fR(many)" .EY "kermit" "Start kermit" .PP This is a slightly lobotomized \fIkermit\fR. The help command, the script facility, and the automatic dial support have been removed. The ? and ESC commands still work, so there is still reasonable built-in help. The only V7 \fIkermit\fR feature that does not work is the ability to see whether there are input characters waiting. This means that you will not be able to ask for status during a file transfer (though this is not critical, because \fIkermit\fR prints a dot every so often and other special characters whenever there is an error or timeout). .PP Start \fIkermit\fR, and then type the following to open a 2400 baud session, for example: .HS .nf .Cx "set line /dev/tty1" .Cx "set speed 2400" .Cx "connect" .HS .fi (It is more convenient if you put these commands in \fI.kermrc\fR in your home directory, so that they get done automatically whenever you run \fIkermit\fR.) This will connect you to the modem or whatever on the serial port. Now log into the other system. .PP When you want to transfer files, run \fIkermit\fR on the other system. To it, type .HS .Cx "server" .HS This puts its \fIkermit\fR into a sort of \*(OQslave mode\*(CQ where it expects commands from the \fIkermit\fR running on your \s-2MINIX\s0 system. Now come back to the command level on \s-2MINIX\s0 \fIkermit\fR, by typing the escape character followed by \fIc\fR. (\fIKermit\fR will tell you the current escape character when you do the connect command.) At this point you can issue various commands. Your \fIkermit\fR will coordinate things with \fIkermit\fR on the other machine so that you only have to type commands at one end. Common commands are .HS .Cx "get \fI\s+2filename\fP\s0" .br .Cx "put \fI\s+2filename\fP\s0" .br .Cx "remote \fI\s+2dir\fP\s0" .HS \fRFilenames can include wildcards. By default, \fIkermit\fR works in a system-independent, text mode. (In effect it assumes that the whole world is \s-2MS-DOS\s0 and converts end of line and file names accordingly.) To send binary files, you will want to type .HS .Cx "set file type bin" .HS on both ends before starting any transfers. This disables CR LF to newline conversion. If both of your systems are some flavor of \s-2UNIX\s0, you might as well put this in \fI.kermrc\fR on both ends and run in binary mode all the time. Also, if both systems are \s-2UNIX\s0 it is recommended that you use .HS .Cx "set file name lit" .HS on both ends. This causes it to keep file names unchanged, rather than mapping to legal \s-2MS-DOS\s0 names. .PP Here is a typical \fI.kermrc\fR for use on .MX : .HS .nf .Cx "set line /dev/tty1" .Cx "set speed 1200" .Cx "set esc 29" .Cx "set file type bin" .Cx "set file name lit" .Cx "set retry 90" .Cx "set prompt MINIX kermit>" .Cx "connect" .fi .PP On the other end of the line, for example, the host at your local computer center to which you want to transfer files, a typical profile might be: .HS .nf .Cx "set rec packet 1000" .Cx "set fil name lit" .Cx "set fil type bin" .Cx "server" .fi .HS .PP \fIKermit\fR has many other options and features. For a pleasant and highly readable description of it, see the following book: .HS .in +0.25i .nf Title: Kermit: A File Transfer Protocol Author: Frank da Cruz Publisher: Digital Press Date: 1987 ISBN: 0-932376-88 .fi .in -0.25i .HS .PP For information about recent \fIkermit\fR developments, versions for other systems, and so forth, please contact: .nf .HS .in +0.25i Christine M. Gianone Manager, Kermit Development and Distribution University Center for Computing Activities Columbia University 612 West 115th Street New York, N.Y. 10025 .in -0.25i .HS .fi Over 400 versions of \fIkermit\fR are available, so it is likely there is one for any computer your .MX system might want to talk to. Columbia University also publishes a newsletter about \fIkermit\fR that can be requested from the above address. .CD "m4 \(en macro processor" .SX "m4\fR [\fB\(enD \fIname\fR = \fIvalue\fR]\fR [\fB\(enU \fIname\fR] .FL "\(enD" "Define a symbol" .FL "\(enU" "Undefine a symbol" .EY "m4 > << < > <= >= == != & ^ | && || .in -0.5i .HS or the unary operators - ! or tilde or by the ternary operator ? : . Parentheses may be used for grouping. Octal numbers may be specified as in C. .PP \fBlen "(string)"\fR returns the number of characters in its argument. .PP \fBindex "(search-string, string)"\fR returns the position in its first argument where the second argument begins (zero origin), or 1 if the second argument does not occur. .PP \fBsubstr "(string, index [, length])"\fR returns a substring of its first argument. The second argument is a zero origin number selecting the first character (internally treated as an expression); the third argument indicates the length of the substring. A missing third argument is taken to be large enough to extend to the end of the first string. .PP \fBtranslit "(source, from [, to])"\fR transliterates the characters in its first argument from the set given by the second argument to the set given by the third. If the third argument is shorter than the second, all extra characters in the second argument are deleted from the first argument. If the third argument is missing altogether, all characters in the second argument are deleted from the first argument. .PP \fBinclude "(filename)"\fR returns the contents of the file that is named in the argument. .PP \fBsinclude "(filename)"\fRis identical to include, except that it says nothing if the file is inaccessable. .PP \fBpaste "(filename)"\fR returns the contents of the file named in the argument without any processing, unlike include. .PP \fBspaste "(filename)"\fR is identical to paste, except that it says nothing if the file is inaccessibl[De. .PP \fBsyscmd "(command)"\fR executes the .Ux command given in the first argument. No value is returned. .PP \fBsysval "()"\fR is the return code from the last call to syscmd. .PP \fBmaketemp \*(OQ(string)"\fR fills in a string of XXXXXX in its argument with the current process ID. .PP \fBm4exit "([exitcode])"\fR causes immediate exit from M4. Argument 1, if given, is the exit code; the default is 0. .PP \fBm4wrap "(m4-macro-or-built-n)"\fR argument 1 will be pushed back at final EOF; example: m4wrap(`dumptable()'). .PP \fBerrprint "(str [, str, str, ...])"\fR prints its argument(s) on stderr. If there is more than one argument, each argument is separated by a space during the output. An arbitrary number of arguments may be supplied. .PP \fBdumpdef "([name, name, ...])"\fR prints current names and definitions, for the named it0&2&ems, or for all if no arguments are given. .SP 1 .SS "Author" .SP 1 .PP \fIM4\fR was written by Ozan S. Yigif. .CD "mined \(en \*(M2 editor" .SX "mined\fR [\fIfile\fR] .FL "\fR(none)" .EX "mined /user/ast/book.3" "Edit an existing file" .EX "mined" "Call editor to create a new file" .EX "ls \(enl | mined" "Use \fImined\fR as a pager to inspect listing" .PP \fIMined\fR is a simple screen editor. At any instant, a window of 24 lines is visible on the screen. The current position in the file is shown by the cursor. Ordinary characters typed in are inserted at the cursor. Control characters and keys on the numeric keypad (at the right-hand side of the keyboard) are used to move the cursor and perform other functions. .PP Commands exist to move forward and backward a word, and delete words either in front of the cursor or behind it. A word in this context is a sequence of characters delimited on both ends by white space (space, tab, line feed, start of file, or end of file). The commands for deleting characters and words also work on line feeds, making it possible to join two consecutive lines by deleting the line feed between them. .PP The editor maintains one save buffer (not displayed). Commands are present to move text from the file to the buffer, from the buffer to the file, and to write the buffer onto a new file. If the edited text cannot be written out due to a full disk, it may still be possible to copy the whole text to the save buffer and then write it to a different file on a different disk with CTRL-Q. It may also be possible to escape from the editor with CTRL-S and remove some files. .PP Some of the commands prompt for arguments (file names, search patterns, etc.). All commands that might result in loss of the file being edited prompt to ask for confirmation. .PP A key (command or ordinary character) can be repeated .I n times by typing .I "ESC n key" where .I ESC is the \*(OQescape\*(CQ key. .PP Forward and backward searching requires a regular expression as the search pattern. Regular expressions follow the same rules as in the .Ux editor, .I ed . These rules can be stated as: .LI .IT Any displayable character matches itself. .IT \&. (period) matches any character except line feed. .IT \&^ (circumflex) matches the start of the line. .IT \&$ (dollar sign) matches the end of the line. .IT \&\\c matches the character \fIc\fR (including period, circumflex, etc). .IT [\fIstring\fR] matches any of the characters in the string. .IT [^string] matches any of the characters except those in the string. .IT [\fIx\(eny\fR] matches any characters between \fIx\fR and \fIy\fR (e.g., [\fIa\(enz\fR]). .IT Pattern\(** matches any number of occurrences of \fIpattern\fR. .LX Some examples of regular expressions are: .HS .in +1.25i .ta +1.0i .ti -1.0i The boy matches the string \*(OQThe boy\*(CQ .ti -1.0i ^$ matches any empty line. .ti -1.0i ^.$ matches any line containing exactly 1 character .ti -1.0i ^A.*\\.$ matches any line starting with an \fIA\fR, ending with a period. .ti -1.0i ^[A\(enZ]*$ matches any line containing only capital letters (or empty). .ti -1.0i [A\(enZ0\(en9] matches any line containing either a capital letter or a digit. .ti -1.0i \&.*X$ matches any line ending in \*(OQX\*(CQ .ti -1.0i A.*B matches any line containing an \*(OQA\*(CQ and then a \*(OQB\*(CQ .in -1.25i .sp .PP Control characters cannot be entered into a file simply by typing them because all of them are editor commands. To enter a control character, depress the ALT key, and then while holding it down, hit the ESC key. Release both ALT and ESC and type the control character. Control characters are displayed in reverse video. .PP The .I mined commands are as follows. .sp .in +1.25i .ta +1.0i .ti -1.25i \fBCURSOR MOTION\fR .ti -1.0i \fBarrows\fR Move the cursor in the indicated direction .ti -1.0i \fBCTRL-A\fR Move cursor to start of current line .ti -1.0i \fBCTRL-Z\fR Move cursor to end of current line .ti -1.0i \fBCTRL-^\fR Move cursor to top of screen .ti -1.0i \fBCTRL-_\fR Move cursor to end of screen .ti -1.0i \fBCTRL-F\fR Move cursor forward to start of next word .ti -1.0i \fBCTRL-B\fR Move cursor backward to start of previous word .ti -1.25i \fBSCREEN MOTION\fR .ti -1.0i \fBHome key\fR Move to first character of the file .ti -1.0i \fBEnd key\fR Move to last character of the file .ti -1.0i \fBPgUp key\fR Scroll window up 23 lines (closer to start of the file) .ti -1.0i \fBPgDn key\fR Scroll window down 23 lines (closer to end of the file) .ti -1.0i \fBCTRL-U\fR Scroll window up 1 line .ti -1.0i \fBCTRL-D\fR Scroll window down 1 line .ti -1.25i \fBMODIFYING TEXT\fR .ti -1.0i \fBDel key\fR Delete the character under the cursor .ti -1.0i \fBBackspace\fR Delete the character to left of the cursor .ti -1.0i \fBCTRL-N\fR Delete the next word .ti -1.0i \fBCTRL-P\fR Delete the previous word .ti -1.0i \fBCTRL-T\fR Delete tail of line (all characters from cursor to end of line) .ti -1.0i \fBCTRL-O\fR Open up the line (insert line feed and back up) .ti -1.0i \fBCTRL-G\fR Get and insert a file at the cursor position .ti -1.25i \fBBUFFER OPERATIONS\fR .ti -1.0i \fBCTRL-@\fR Set mark at current position for use with CTRL-C and CTRL-K .ti -1.0i \fBCTRL-C\fR Copy the text between the mark and the cursor into the buffer .ti -1.0i \fBCTRL-K\fR Delete text between mark and cursor; also copy it to the buffer .ti -1.0i \fBCTRL-Y\fR Yank contents of the buffer out and insert it at the cursor .ti -1.0i \fBCTRL-Q\fR Write the contents of the buffer onto a file .ti -1.25i \fBMISCELLANEOUS\fR .ti -1.0i \fBnumeric +\fR Search forward (prompts for regular expression) .ti -1.0i \fBnumeric \(mi\fR Search backward (prompts for regular expression) .ti -1.0i \fBnumeric 5\fR Display the file status .ti -1.0i \fBCTRL-]\fR Go to specific line .ti -1.0i \fBCTRL-R\fR Global replace \fIpattern\fR with \fIstring\fR (from cursor to end) .ti -1.0i \fBCTRL-L\fR Line replace \fIpattern\fR with \fIstring\fR .ti -1.0i \fBCTRL-W\fR Write the edited file back to the disk .ti -1.0i \fBCTRL-X\fR Exit the editor .ti -1.0i \fBCTRL-S\fR Fork off a shell (use CTRL-D to get back to the editor) .ti -1.0i \fBCTRL-\\\fR Abort whatever the editor was doing and wait for command .ti -1.0i \fBCTRL-E\fR Erase screen and redraw it .ti -1.0i \fBCTRL-V\fR Visit (edit) a new file .in -1.25i .SS "Author" .PP \fIMined\fR was designed by Andy Tanenbaum and written by Michiel Huisjes. .TH TEMPLATE 1 .SH NAME template, blueprint \- a blueprint for making manual pages .SH SYNOPSIS .B template .RB [ \-az ] .RI [ arguments " ...]" .SH DESCRIPTION .de SP .if t .sp 0.4 .if n .sp .. .B Template shows what a manual page should look like. Options for instance: .SH OPTIONS .TP .B \-a Use boldface for characters that have to be typed as is. .TP .B \-z Italics for variable .IR arguments . .SH ENVIRONMENT .TP 15n .B MANPATH The path to knowledge. .SH FILES .TP 25n .B /usr/man/template.1 This file. .SH "SEE ALSO" .BR man (7). .SH DIAGNOSTICS man: No manual on template. .SH NOTES Use at your own risk. .SH BUGS A lot. The .BR whatis (5) database is usually generated automatically on most systems. This fails if the "NAME" section has more n/troff fluff than just an "\e" before the '\-', or is more than one line. Apply the KISS principle, try to use a minimum of smart macros, match your .RS and .RE's, etc. .SH AUTHOR Kees J. Bot bc (1) - An arbitrary precision calculator language cawf, nroff (1) - C version of the nroff-like, Amazingly Workable (text) Formatter ref (1) - Display a C function header ctags (1) - Generates "tags" and (optionally) "refs" files cc, pc, m2 (1) - Minix C, Pascal, and Modula-2 compilers elvrec (1) - Recover the modified version of a file after a crash elvis, ex, vi (1) - The editor crontab (1) - User crontab manipulation bsfilt, colcrt (1) - a colcrt-like backspace filter acd (1) - a compiler driver make (1) - a program for maintaining large programs ash, sh, ., break, case, cd, command, continue, eval, exec, exit, export, for, getopts, hash, if, jobs, local, read, readonly, return, set, setvar, shift, trap, umask, unset, wait, while (1) - a shell fmt (1) - adjust line-length for paragraphs of text yacc (1) - an LALR(1) parser generator yes (1) - an endless stream of the same word patch (1) - apply a diff file to an original ar, aal (1) - archivers makewhatis (1) - build the whatis(5) database passwd, chfn, chsh (1) - change a login password, full name or shell chmod (1) - change access mode for files chgrp (1) - change group chmem (1) - change memory allocation clear, clr (1) - clear the screen cmp (1) - compare two files compress, uncompress, zcat (1) - compress a file using modified Lempel-Ziv coding sum (1) - compute the checksum and block count of a file cat (1) - concatenate files and write them to stdout xargs (1) - construct argument list(s) and execute utility. cdiff (1) - context diff M, U (1) - conveniently mount and unmount dd (1) - convert and copy a file unexpand (1) - convert spaces to tabs expand (1) - convert tabs to spaces lp, lpd (1) - copy a file to the line printer cp, mv, rm, ln, cpdir, clone (1) - copy, move, remove, link wc (1) - count characters, words, and lines in a file mkproto (1) - create a MINIX prototype file uud, uudecode (1) - decode a binary file encoded with uue uniq (1) - delete consecutive identical lines in a file cksum (1) - display file checksum and size man (1) - display online manual pages last, uptime (1) - display recent on-line session records, show uptime tee (1) - divert stdin to a file ed (1) - editor eject (1) - eject removable media uue, uuencode (1) - encode a binary file to ASCII (e.g., for mailing) expr, test, [ (1) - evaluate expressions which (1) - examine $PATH to see which file will be executed whereis (1) - examine system directories for a given file at, atrun (1) - execute commands at a later time true, false (1) - exit with the value true or false factor (1) - factor an integer less than 2**31 flex, lex (1) - fast lexical analyzer generator flexdoc (1) - fast lexical analyzer generator find (1) - find files meeting a given condition look (1) - find lines in a sorted list fgrep (1) - fixed grep fold (1) - fold long lines format (1) - format a PC floppy diskette tget (1) - get termcap values whatis, apropos (1) - give single line descriptions for manual pages cgrep (1) - grep and display context install (1) - install files dhrystone (1) - integer benchmark isodir (1) - list ISO9660 or High Sierra directories isoinfo (1) - list an ISO9660 or High Sierra volume descriptor dosdir (1) - list an MS-DOS directory [IBM] ls (1) - list the contents of a directory loadfont (1) - load a font into the video card loadkeys (1) - load a keyboard map into the keyboard driver login (1) - log into the computer host (1) - look up host names using domain server mt (1) - magnetic tape control mkdir (1) - make a directory mkfs (1) - make a file system file (1) - make a guess as to a file's type based on contents mkfifo (1) - make a named pipe mixer (1) - manipulate mixer settings on a sound card mount (1) - mount a file system od (1) - octal dump paste (1) - paste multiple files together fsck, fsck1 (1) - perform file system consistency check postmort (1) - perform post-mortem on PC Minix core files mesg (1) - permit or deny messages playwave (1) - play an audio file in MicroSoft PCM wave format prep (1) - prepare a text file for statistical analysis banner (1) - print a banner cal (1) - print a calendar pr (1) - print a file fortune (1) - print a fortune strings (1) - print all the strings in a binary file spell (1) - print all words in a file not present in the dictionary whoami (1) - print current user name diff (1) - print differences between two files du (1) - print disk usage comm (1) - print lines common to two sorted files who (1) - print list of currently logged in users nm (1) - print name list anm (1) - print name list date (1) - print or set the date and time size (1) - print text, data, and bss size of a program crc (1) - print the checksum of the file data termcap (1) - print the current termcap entry tty (1) - print the device name of this tty head (1) - print the first few lines of a file tail (1) - print the last few lines of a file id (1) - print the uid and gid pwd (1) - print working directory ps (1) - process status echo (1) - produce message in a shell script stat, lstat (1) - provide a shell interface to the stat(2) system call readfs (1) - read a MINIX file system readall (1) - read a device quickly to check for bad blocks dosread (1) - read a file from an MS-DOS diskette [IBM] isoread (1) - read a file in ISO9660 or High Sierra format rz (1) - receive a file using the zmodem protocol recwave (1) - record an audio file in MicroSoft PCM wave format join (1) - relational database operator calendar (1) - reminder service rcp (1) - remote file copy rlogin (1) - remote login rsh (1) - remote shell remsync (1) - remotely synchronize file trees ifdef (1) - remove #ifdefs from a file rmdir (1) - remove a directory strip (1) - remove symbol table from executable file time (1) - report how long a command takes df (1) - report on free disk space asize (1) - report the size of an object file sysenv (1) - request system boot parameter grep (1) - search a file for lines containing a given pattern cut (1) - select out columns of a file sz (1) - send a file using the zmodem protocol write (1) - send a message to a logged-in user kill (1) - send a signal to a process mail (1) - send and receive electronic mail env (1) - set environment for command stty (1) - set terminal parameters shar (1) - shell archiver svc, ci, co, svclog (1) - shell version control system hostaddr (1) - show ethernet address, IP address or hostname sort (1) - sort a file of ASCII lines split (1) - split a large file into several smaller files vol (1) - split input on or combine output from several volumes basename, dirname (1) - strip off file prefixes and suffixes sleep (1) - suspend execution for a given number of seconds modem (1) - switch the modem and getty state synctree (1) - synchronize directory trees. uname, arch (1) - system info tar (1) - tape archiver su (1) - temporarily log in as superuser or another user sed (1) - the stream editor tsort (1) - topological sort [IBM] tr (1) - translate character codes term (1) - turn PC into a dumb terminal [IBM] umount (1) - unmount a mounted file system touch (1) - update a file's time of last modification finger (1) - user information lookup program telnet (1) - user interface to the TELNET protocol leave (1) - warn when it is time to go home doswrite (1) - write a file onto an MS-DOS diskette [IBM] yap, more (1) - yet another pager chdir (2) - change current working directory brk, sbrk (2) - change data segment size chmod (2) - change mode of file chown (2) - change owner and group of a file chroot (2) - change root directory rename (2) - change the name of a file reboot (2) - close down the system or reboot ioctl (2) - control device creat (2) - create a new file fork (2) - create a new process pipe (2) - create an interprocess communication channel setsid, getpgrp (2) - create process group, get process group id close (2) - delete a descriptor access (2) - determine accessibility of file dup, dup2 (2) - duplicate a descriptor execve (2) - execute a file stat, lstat, fstat (2) - get file status getgid, getegid (2) - get group identity getpid, getppid (2) - get process identification times (2) - get process times uname (2) - get system info getuid, geteuid (2) - get uB&D&E&F&G&H&I&J&K&L&M&ser identity time, stime (2) - get/set date and time intro, errno (2) - introduction to system calls and error numbers mkdir (2) - make a directory file link (2) - make a hard link to a file mknod, mkfifo (2) - make a special file sigaction, signal (2) - manage signal state and handlers sigprocmask (2) - manipulate the signal mask fcntl (2) - miscellaneous file descriptor control functions mount, umount (2) - mount or umount a file system lseek (2) - move read/write pointer open (2) - open a file for reading or writing, or create a new file ptrace (2) - process trace read (2) - read input rmdir (2) - remove a directory file unlink (2) - remove directory entry sigpending (2) - report pending signals alarm (2) - schedule signal after specified time kill (2) - send signal to a process umask (2) - set file creation mode mask utime (2) - set file times setuid, setgid (2) - set user or group ID's svrctl (2) - special server control functions pause (2) - stop until signal sigsuspend (2) - suspend until signalled exit, _exit (2) - terminate a process sync (2) - update super-block wait, waitpid (2) - wait for process to terminate write (2) - write output int64, add64, add64u, add64ul, sub64, sub64u, sub64ul, diff64, cvu64, cvul64, cv64u, cv64ul, div64u, rem64u, mul64u, cmp64, cmp64u, cmp64ul, ex64lo, ex64hi, make64 (3) - 64 bit disk offset computations servxcheck (3) - Internet service access check oneC_sum (3) - One's complement internet checksum setbuf, setvbuf (3) - assign buffering to a stream random, srandom, initstate, setstate (3) - better random number generator; routines for changing generators bstring, bcopy, bcmp, bzero, ffs (3) - bit and byte string operations fread, fwrite (3) - buffered binary input/output termios, tcgetattr, tcsetattr, cfgetispeed, cfgetospeed, cfsetispeed, cfsetospeed, tcsendbreak, tcdrain, tcflush, tcflow (3) - change terminal attributes ctype, isalpha, isupper, islower, isdigit, isxdigit, isalnum, isspace, ispunct, isprint, isgraph, iscntrl, isascii, toupper, tolower, toascii (3) - character classification macros fclose, fflush (3) - close or flush a stream editline (3) - command-line editing library with history atof, atoi, atol (3) - convert ASCII to numbers ctime, localtime, gmtime, asctime, tzset (3) - convert date and time to ASCII directory, opendir, readdir, rewinddir, closedir, telldir, seekdir (3) - directory routines execl, execv, execle, execlp, execvp, exec, environ (3) - execute a file ttyname (3) - file descriptor to terminal device name scanf, fscanf, sscanf, vscanf, vfscanf, vsscanf (3) - formatted input conversion printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf (3) - formatted output conversion abort (3) - generate a fault configfile, config_read, config_delete, config_renewed, config_length, config_issub, config_isatom, config_isstring (3) - generic configuration file functions gets, fgets (3) - get a string from a stream getc, getchar, fgetc, getw (3) - get character or word from stream getcwd (3) - get current working directory pathname getlogin (3) - get login name g_h_b_n, gethostbyname, gethostbyaddr, gethostent, sethostent, endhostent, herror (3) - get network host entry getopt (3) - get option letter from argv getservent, getservbyport, getservbyname, setservent, endservent (3) - get service entry getgrent, getgrnam, getgrgid, setgrent, endgrent, setgrfile (3) - group file routines hton, htons, htonl, ntohs, ntohl (3) - host to network byte order conversion popen, pclose (3) - initiate I/O to/from a process abs (3) - integer absolute value getttyent, getttynam, setttyent, endttyent (3) - interface to /etc/ttytab system (3) - issue a shell command end, etext, edata (3) - last locations in program sigset, sigaddset, sigdelset, sigemptyset, sigfillset, sigismember (3) - manipulate signal sets malloc, free, realloc, calloc, alloca (3) - memory allocator crypt (3) - one-way password encryption function fopen, freopen, fdopen (3) - open a stream getpwent, getpwnam, getpwuid, setpwent, endpwent, setpwfile (3) - password file routines assert (3) - program verification ungetc (3) - push character back into input stream puts, fputs (3) - put a string on a stream putc, putchar, fputc, putw (3) - put character or word on a stream qsort (3) - quicker sort rand, srand (3) - random number generator getpass (3) - read a password fseek, ftell, rewind (3) - reposition a stream resolver, res_query, res_search, res_mkquery, res_send, res_init, dn_comp, dn_expand (3) - resolver routines rcmd, rresvport, ruserok (3) - routines for returning a stream to a remote command curses (3) - screen/window management library stdio (3) - standard buffered input/output package ferror, feof, clearerr, fileno (3) - stream status inquiries string, strcat, strncat, strcmp, strncmp, strcpy, strncpy, strlen, strchr, strrchr, strerror, memcmp, memcpy, memmove, memchr, memset, index, rindex (3) - string operations sleep (3) - suspend execution for interval termcap, tgetent, tgetnum, tgetflag, tgetstr, tgoto, tputs (3) - terminal independent operation routines exit, atexit (3) - terminate a process after flushing any pending output ttyslot, fttyslot (3) - utmp slot number getenv (3) - value for environment name stdarg (3) - variable argument list ip, eth, psip, udp, tcp (4) - Internet Protocol server devices and definitions controller, disk, tape, at, bios, esdi, aha1540, ncr810, dosfile, fatfile (4) - controllers, disks and tapes dev (4) - device files in /dev fd (4) - floppy disk lp (4) - line printer mtio (4) - magnetic tape commands console, keyboard, log (4) - system console tty, termios (4) - terminals resolv.conf (5) - Domain Name System resolver configuration serv.access (5) - Internet service access list TZ (5) - Time zone environment variable whatis (5) - database of online manual pages dir (5) - directory layout dhcp.conf (5) - dynamic host configuration protocol configuration ethers (5) - ethernet address to hostname database configfile (5) - generic configuration file format hosts (5) - hostname to IP address database keymap (5) - keyboard maps fstab, mtab (5) - list of file systems to mount, mounted file system table. utmp, wtmp (5) - logged in users, login and logout history resolver (5) - resolver configuration file crontab (5) - table of jobs to be performed by cron ttytab (5) - table of login terminals termcap (5) - terminal capability data base rhosts, hosts.equiv (5) - trusted remote users or hosts passwd, group, shadow (5) - user and group databases, shadow passwords advent, adventure (6) - an exploration game ttt (6) - tic tac toe ACK (7) - Additional information on the Amsterdam Compiler Kit compilers hier (7) - file system hierarchy man (7) - nroff macro package for manual pages ascii (7) - the ASCII character set. environ (7) - user environment ftpd, in.ftpd, setup.anonftp (8) - DARPA Internet File Transfer Protocol server elvprsv (8) - Preserve the the modified version of a file after a crash. dosminix, mkfile (8) - Running Minix under DOS serial-ip (8) - Serial IP (SLIP or PPP) setup slip (8) - Serial Line IP inet (8) - TCP/IP server halt (8) - abruptly stop the system adduser (8) - add a new user to the system backup (8) - backup files chown (8) - change owner checkhier (8) - check the directory hierarchy cleantmp (8) - clean out a tmp dir cron (8) - clock daemon srccrc (8) - compute CRC checksums of the entire source tree add_route (8) - configure IP routing. ifconfig (8) - configure a TCP/IP device config (8) - configuring Minix tasks and servers mknod (8) - create a special file dhcpd (8) - dynamic host configuration protocol daemon sync (8) - flush the cache to disk boot (8) - from power on to the login prompt shutdown (8) - graciously close the system down init (8) - grandparent of all processes usage (8) - installing and using MINIX irdpd (8) - internet router discovery protocol daemon repartition (8) - load a partition table monitor, edparams (8) - load and start Minix, modify boot parameters mkdist (8) - make a Minix distribution installboot (8) - make a device bootable partition (8) - make a partition table MAKEDEV, DESCRIBE (8) - make/describe device files nonamed (8) - not a name daemon, but acts like one fdisk (8) - partition a hard disk [IBM] part (8) - partition table editor pwdauth (8) - password authentication program update (8) - periodically write the buffer cache to disk printroot (8) - print the name of the root device on standard output badblocks (8) - put a list of bad blocks in a file readclock (8) - read the AT's real time clock reboot (8) - reboot the system immediately rlogind, in.rld (8) - remote login server rshd (8) - remote shell server fingerd, in.fingerd (8) - remote user information server rarpd (8) - reverse address resolution protocol daemon intr (8) - run a command with interrupts enabled pr_routes (8) - show IP routing. getty (8) - system login banner screendump (8) - write current console screen to standard output elle (9) - ELLE Looks Like Emacs mined (9) - MINIX editor as (9) - assembler elvis (9) - clone of the Berkeley vi editor dis88 (9) - disassembler [IBM] de (9) - disk editor m4 (9) - macro processor awk (9) - pattern matching language kermit (9) - transfer a file using the kermit protocol Copyright (c) 1987,1997,2001 Prentice Hall All rights reserved. Redistribution and use of the MINIX operating system in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Prentice Hall nor the names of the software authors or contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS, AUTHORS, AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PRENTICE HALL OR ANY AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Master Makefile to compile everything in /usr/src except the kernel. MAKE = exec make -$(MAKEFLAGS) usage: @echo "Usage:" >&2 @echo " make world # Compile everything (libraries & commands)" >&2 @echo " make libraries # Compile libraries" >&2 @echo " make all # Compile commands, but don't install" >&2 @echo " make install # Compile and install commands" >&2 @echo " make clean # Remove all compiler results" >&2 @echo " (Run 'make' in tools to make a kernel)" >&2; exit 1 world: libraries install libraries: cd lib && $(MAKE) install all:: @echo "Are the libraries up to date?"; sleep 2 clean:: cd lib && $(MAKE) $@ all install clean:: cd boot && $(MAKE) $@ test ! -d commands || { cd commands && $(MAKE) $@; } cd inet && $(MAKE) $@ cd tools && $(MAKE) $@ q...rMakefilesboot.ctboot.hubootblock.svboothead.swbootimage.cxjumpboot.syimage.hzinstallboot.c{masterboot.s|rawfs.c}rawfs.h~a.out2commkfile.cdoshead.smkfhead.s# Makefile for the boot monitor package. SYS = .. CC = exec cc CC86 = exec cc -mi86 -Was-ncc CFLAGS = -I$(SYS) -O LIBS = -lsys LD = $(CC) -s -.o LD86 = $(CC86) -.o BIN = /usr/bin MDEC = /usr/mdec all: bootblock boot edparams masterboot jumpboot installboot dos: boot.com mkfile.com bootblock: bootblock.s $(LD86) -com -o $@ bootblock.s masterboot: masterboot.s $(LD86) -com -o $@ masterboot.s jumpboot: jumpboot.s $(LD86) -com -o $@ jumpboot.s boot.o: boot.c $(CC86) $(CFLAGS) -c boot.c bootimage.o: bootimage.c $(CC86) $(CFLAGS) -c bootimage.c rawfs86.o: rawfs.c rawfs.o ln -f rawfs.c rawfs86.c $(CC86) $(CFLAGS) -c rawfs86.c rm rawfs86.c -cmp -s rawfs.o rawfs86.o && ln -f rawfs.o rawfs86.o boot: boothead.s boot.o bootimage.o rawfs86.o $(LD86) -o $@ \ boothead.s boot.o bootimage.o rawfs86.o $(LIBS) install -S 12kb boot edparams.o: boot.c ln -f boot.c edparams.c $(CC) $(CFLAGS) -DUNIX -c edparams.c rm edparams.c edparams: edparams.o rawfs.o $(CC) $(CFLAGS) $(STRIP) -o $@ edparams.o rawfs.o install -S 16kw edparams dosboot.o: boot.c $(CC86) $(CFLAGS) -DDOS -o $@ -c boot.c doshead.o: doshead.s $(CC) -mi386 -o $@ -c doshead.s dosboot: doshead.o dosboot.o bootimage.o rawfs86.o $(LD86) -com -o $@ \ doshead.o dosboot.o bootimage.o rawfs86.o $(LIBS) boot.com: dosboot ./a.out2com dosboot boot.com mkfile: mkfhead.s mkfile.c $(LD) -.o -mi86 -com -o $@ mkfhead.s mkfile.c $(LIBS) mkfile.com: mkfile ./a.out2com mkfile mkfile.com installboot: installboot.o rawfs.o $(CC) $(STRIP) -o installboot installboot.o rawfs.o install -S 6kw installboot installboot.o bootimage.o: image.h boot.o bootimage.o dosboot.o edparams.o: boot.h rawfs.o rawfs86.o installboot.o boot.o bootimage.o: rawfs.h install: $(MDEC)/bootblock $(MDEC)/boot $(MDEC)/masterboot \ $(MDEC)/jumpboot $(BIN)/installboot $(BIN)/edparams dosinstall: $(MDEC)/boot.com $(MDEC)/mkfile.com $(MDEC)/bootblock: bootblock install -cs -o bin -m 644 $? $@ $(MDEC)/boot: boot install -cs -o bin -m 644 $? $@ $(MDEC)/boot.com: boot.com install -c -m 644 $? $@ $(MDEC)/mkfile.com: mkfile.com install -c -m 644 $? $@ $(MDEC)/masterboot: masterboot install -cs -o bin -m 644 $? $@ $(MDEC)/jumpboot: jumpboot install -cs -o bin -m 644 $? $@ $(BIN)/installboot: installboot install -cs -o bin $? $@ $(BIN)/edparams: edparams install -cs -o bin $? $@ clean: rm -f *.bak *.o rm -f bootblock installboot boot masterboot jumpboot edparams rm -f dosboot boot.com mkfile mkfile.com /* boot.c - Load and start Minix. Author: Kees J. Bot * 27 Dec 1991 */ char version[]= "2.16"; #define BIOS (!UNIX) /* Either uses BIOS or UNIX syscalls. */ #define nil 0 #define _POSIX_SOURCE 1 #define _MINIX 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #if BIOS #include #include #endif #if UNIX #include #include #include #include #include #include #endif #include "rawfs.h" #undef EXTERN #define EXTERN /* Empty */ #include "boot.h" #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define between(a, c, z) ((unsigned) ((c) - (a)) <= ((z) - (a))) #if BIOS char *bios_err(int err) /* Translate BIOS error code to a readable string. (This is a rare trait * known as error checking and reporting. Take a good look at it, you won't * see it often.) */ { static struct errlist { int err; char *what; } errlist[] = { #if !DOS { 0x00, "No error" }, { 0x01, "Invalid command" }, { 0x02, "Address mark not found" }, { 0x03, "Disk write-protected" }, { 0x04, "Sector not found" }, { 0x05, "Reset failed" }, { 0x06, "Floppy disk removed" }, { 0x07, "Bad parameter table" }, { 0x08, "DMA overrun" }, { 0x09, "DMA crossed 64 KB boundary" }, { 0x0A, "Bad sector flag" }, { 0x0B, "Bad track flag" }, { 0x0C, "Media type not found" }, { 0x0D, "Invalid number of sectors on format" }, { 0x0E, "Control data address mark detected" }, { 0x0F, "DMA arbitration level out of range" }, { 0x10, "Uncorrectable CRC or ECC data error" }, { 0x11, "ECC corrected data error" }, { 0x20, "Controller failed" }, { 0x40, "Seek failed" }, { 0x80, "Disk timed-out" }, { 0xAA, "Drive not ready" }, { 0xBB, "Undefined error" }, { 0xCC, "Write fault" }, { 0xE0, "Status register error" }, { 0xFF, "Sense operation failed" } #else /* DOS */ { 0x00, "No error" }, { 0x01, "Function number invalid" }, { 0x02, "File not found" }, { 0x03, "Path not found" }, { 0x04, "Too many open files" }, { 0x05, "Access denied" }, { 0x06, "Invalid handle" }, { 0x0C, "Access code invalid" }, #endif /* DOS */ }; struct errlist *errp; for (errp= errlist; errp < arraylimit(errlist); errp++) { if (errp->err == err) return errp->what; } return "Unknown error"; } char *unix_err(int err) /* Translate the few errors rawfs can give. */ { switch (err) { case ENOENT: return "No such file or directory"; case ENOTDIR: return "Not a directory"; default: return "Unknown error"; } } void rwerr(char *rw, off_t sec, int err) { printf("\n%s error 0x%02x (%s) at sector %ld absolute\n", rw, err, bios_err(err), sec); } void readerr(off_t sec, int err) { rwerr("Read", sec, err); } void writerr(off_t sec, int err) { rwerr("Write", sec, err); } void readblock(off_t blk, char *buf) /* Read blocks for the rawfs package. */ { int r; u32_t sec= lowsec + blk * RATIO; if ((r= readsectors(mon2abs(buf), sec, 1 * RATIO)) != 0) { readerr(sec, r); exit(1); } } #define istty (1) #define alarm(n) (0) #endif /* BIOS */ #if UNIX /* The Minix boot block must start with these bytes: */ char boot_magic[] = { 0x31, 0xC0, 0x8E, 0xD8, 0xFA, 0x8E, 0xD0, 0xBC }; struct biosdev { char *name; /* Name of device. */ int device; /* Device to edit parameters. */ } bootdev; struct termios termbuf; int istty; void quit(int status) { if (istty) (void) tcsetattr(0, TCSANOW, &termbuf); exit(status); } #define exit(s) quit(s) void report(char *label) /* edparams: label: No such file or directory */ { fprintf(stderr, "edparams: %s: %s\n", label, strerror(errno)); } void fatal(char *label) { report(label); exit(1); } void *alloc(void *m, size_t n) { m= m == nil ? malloc(n) : realloc(m, n); if (m == nil) fatal(""); return m; } #define malloc(n) alloc(nil, n) #define realloc(m, n) alloc(m, n) #define mon2abs(addr) ((void *) (addr)) int rwsectors(int rw, void *addr, u32_t sec, int nsec) { ssize_t r; size_t len= nsec * SECTOR_SIZE; if (lseek(bootdev.device, sec * SECTOR_SIZE, SEEK_SET) == -1) return errno; if (rw == 0) { r= read(bootdev.device, (char *) addr, len); } else { r= write(bootdev.device, (char *) addr, len); } if (r == -1) return errno; if (r != len) return EIO; return 0; } #define readsectors(a, s, n) rwsectors(0, (a), (s), (n)) #define writesectors(a, s, n) rwsectors(1, (a), (s), (n)) #define readerr(sec, err) (errno= (err), report(bootdev.name)) #define writerr(sec, err) (errno= (err), report(bootdev.name)) #define putch(c) putchar(c) #define unix_err(err) strerror(err) void readblock(off_t blk, char *buf) /* Read blocks for the rawfs package. */ { errno= EIO; if (lseek(bootdev.device, blk * BLOCK_SIZE, SEEK_SET) == -1 || read(bootdev.device, buf, BLOCK_SIZE) != BLOCK_SIZE) { fatal(bootdev.name); } } int trapsig; void trap(int sig) { trapsig= sig; signal(sig, trap); } int escape(void) { if (trapsig == SIGINT) { trapsig= 0; return 1; } return 0; } static unsigned char unchar; int getch(void) { unsigned char c; fflush(stdout); if (unchar != 0) { c= unchar; unchar= 0; return c; } switch (read(0, &c, 1)) { case -1: if (errno != EINTR) fatal(""); return(ESC); case 0: if (istty) putch('\n'); exit(0); default: if (istty && c == termbuf.c_cc[VEOF]) { putch('\n'); exit(0); } return c; } } #define ungetch(c) ((void) (unchar = (c))) #define get_tick() ((u32_t) time(nil)) #define clear_screen() printf("[clear]") #define boot_device(device) printf("[boot %s]\n", device) #define bootminix() (run_trailer() && printf("[boot]\n")) #endif /* UNIX */ char *readline(void) /* Read a line including a newline with echoing. */ { char *line; size_t i, z; int c; i= 0; z= 20; line= malloc(z * sizeof(char)); do { c= getch(); if (strchr("\b\177\25\30", c) != nil) { /* Backspace, DEL, ctrl-U, or ctrl-X. */ do { if (i == 0) break; printf("\b \b"); i--; } while (c == '\25' || c == '\30'); } else if (c < ' ' && c != '\n') { putch('\7'); } else { putch(c); line[i++]= c; if (i == z) { z*= 2; line= realloc(line, z * sizeof(char)); } } } while (c != '\n'); line[i]= 0; return line; } int sugar(char *tok) /* Recognize special tokens. */ { return strchr("=(){};\n", tok[0]) != nil; } char *onetoken(char **aline) /* Returns a string with one token for tokenize. */ { char *line= *aline; size_t n; char *tok; /* Skip spaces and runs of newlines. */ while (*line == ' ' || (*line == '\n' && line[1] == '\n')) line++; *aline= line; /* Don't do odd junk (nor the terminating 0!). */ if ((unsigned) *line < ' ' && *line != '\n') return nil; if (*line == '(') { /* Function argument, anything goes but () must match. */ int depth= 0; while ((unsigned) *line >= ' ') { if (*line == '(') depth++; if (*line++ == ')' && --depth == 0) break; } } else if (sugar(line)) { /* Single character token. */ line++; } else { /* Multicharacter token. */ do line++; while ((unsigned) *line > ' ' && !sugar(line)); } n= line - *aline; tok= malloc((n + 1) * sizeof(char)); memcpy(tok, *aline, n); tok[n]= 0; if (tok[0] == '\n') tok[0]= ';'; /* ';' same as '\n' */ *aline= line; return tok; } /* Typed commands form strings of tokens. */ typedef struct token { struct token *next; /* Next in a command chain. */ char *token; } token; token **tokenize(token **acmds, char *line) /* Takes a line apart to form tokens. The tokens are inserted into a command * chain at *acmds. Tokenize returns a reference to where another line could * be added. Tokenize looks at spaces as token separators, and recognizes only * ';', '=', '{', '}', and '\n' as single character tokens. One token is * formed from '(' and ')' with anything in between as long as more () match. */ { char *tok; token *newcmd; while ((t\&^&_&`&a&b&c&d&e&f&g&h&i&j&k&l&m&n&o&p&q&r&s&t&u&v&w&x&y&z&{&|&ok= onetoken(&line)) != nil) { newcmd= malloc(sizeof(*newcmd)); newcmd->token= tok; newcmd->next= *acmds; *acmds= newcmd; acmds= &newcmd->next; } return acmds; } token *cmds; /* String of commands to execute. */ int err; /* Set on an error. */ char *poptoken(void) /* Pop one token off the command chain. */ { token *cmd= cmds; char *tok= cmd->token; cmds= cmd->next; free(cmd); return tok; } void voidtoken(void) /* Remove one token from the command chain. */ { free(poptoken()); } void parse_code(char *code) /* Tokenize a string of monitor code, making sure there is a delimiter. It is * to be executed next. (Prepended to the current input.) */ { if (cmds != nil && cmds->token[0] != ';') (void) tokenize(&cmds, ";"); (void) tokenize(&cmds, code); } int interrupt(void) /* Clean up after an ESC has been typed. */ { if (escape()) { printf("[ESC]\n"); err= 1; return 1; } return 0; } #if BIOS int activate; struct biosdev { char name[8]; int device, primary, secondary; } bootdev, tmpdev; int get_master(char *master, struct part_entry **table, u32_t pos) /* Read a master boot sector and its partition table. */ { int r, n; struct part_entry *pe, **pt; if ((r= readsectors(mon2abs(master), pos, 1)) != 0) return r; pe= (struct part_entry *) (master + PART_TABLE_OFF); for (pt= table; pt < table + NR_PARTITIONS; pt++) *pt= pe++; /* DOS has the misguided idea that partition tables must be sorted. */ if (pos != 0) return 0; /* But only the primary. */ n= NR_PARTITIONS; do { for (pt= table; pt < table + NR_PARTITIONS-1; pt++) { if (pt[0]->sysind == NO_PART || pt[0]->lowsec > pt[1]->lowsec) { pe= pt[0]; pt[0]= pt[1]; pt[1]= pe; } } } while (--n > 0); return 0; } void initialize(void) { char master[SECTOR_SIZE]; struct part_entry *table[NR_PARTITIONS]; int r, p; u32_t masterpos; char *argp; /* Copy the boot program to the far end of low memory, this must be * done to get out of the way of Minix, and to put the data area * cleanly inside a 64K chunk if using BIOS I/O (no DMA problems). */ u32_t oldaddr= caddr; u32_t memend= mem[0].base + mem[0].size; u32_t newaddr= (memend - runsize) & ~0x0000FL; #if !DOS u32_t dma64k= (memend - 1) & ~0x0FFFFL; /* Check if data segment crosses a 64K boundary. */ if (newaddr + (daddr - caddr) < dma64k) newaddr= dma64k - runsize; #endif /* Set the new caddr for relocate. */ caddr= newaddr; /* Copy code and data. */ raw_copy(newaddr, oldaddr, runsize); /* Make the copy running. */ relocate(); #if !DOS /* Take the monitor out of the memory map if we have memory to spare, * and also keep the BIOS data area safe (1.5K), plus a bit extra for * where we may have to put a.out headers for older kernels. */ if (mem[1].size > 0) mem[0].size = newaddr; mem[0].base += 2048; mem[0].size -= 2048; /* Set the parameters for the BIOS boot device. */ (void) dev_open(); /* Find out what the boot device and partition was. */ bootdev.name[0]= 0; bootdev.device= device; bootdev.primary= -1; bootdev.secondary= -1; if (device < 0x80) { /* Floppy. */ strcpy(bootdev.name, "fd0"); bootdev.name[2] += bootdev.device; return; } /* Disk: Get the partition table from the very first sector, and * determine the partition we booted from using the information from * the booted partition entry as passed on by the bootstrap (rem_part). * All we need from it is the partition offset. */ raw_copy(mon2abs(&lowsec), vec2abs(&rem_part) + offsetof(struct part_entry, lowsec), sizeof(lowsec)); masterpos= 0; /* Master bootsector position. */ for (;;) { /* Extract the partition table from the master boot sector. */ if ((r= get_master(master, table, masterpos)) != 0) { readerr(masterpos, r); exit(1); } /* See if you can find "lowsec" back. */ for (p= 0; p < NR_PARTITIONS; p++) { if (lowsec - table[p]->lowsec < table[p]->size) break; } if (lowsec == table[p]->lowsec) { /* Found! */ if (bootdev.primary < 0) bootdev.primary= p; else bootdev.secondary= p; break; } if (p == NR_PARTITIONS || bootdev.primary >= 0 || table[p]->sysind != MINIX_PART) { /* The boot partition cannot be named, this only means * that "bootdev" doesn't work. */ bootdev.device= -1; return; } /* See if the primary partition is subpartitioned. */ bootdev.primary= p; masterpos= table[p]->lowsec; } strcpy(bootdev.name, "d0p0"); bootdev.name[1] += (device - 0x80); bootdev.name[3] += bootdev.primary; if (bootdev.secondary >= 0) { strcat(bootdev.name, "s0"); bootdev.name[5] += bootdev.secondary; } #else /* DOS */ /* Take the monitor out of the memory map if we have memory to spare, * note that only half our PSP is needed at the new place, the first * half is to be kept in its place. */ if (mem[1].size > 0) mem[0].size = newaddr + 0x80 - mem[0].base; /* Parse the command line. */ argp= PSP + 0x81; argp[PSP[0x80]]= 0; while (between('\1', *argp, ' ')) argp++; vdisk= argp; while (!between('\0', *argp, ' ')) argp++; while (between('\1', *argp, ' ')) *argp++= 0; if (*vdisk == 0) { printf("\nUsage: boot [commands ...]\n"); exit(1); } drun= *argp == 0 ? "main" : argp; if ((r= dev_open()) != 0) { printf("\n%s: Error %02x (%s)\n", vdisk, r, bios_err(r)); exit(1); } /* Find the active partition on the virtual disk. */ if ((r= get_master(master, table, 0)) != 0) { readerr(0, r); exit(1); } strcpy(bootdev.name, "d0"); bootdev.primary= -1; for (p= 0; p < NR_PARTITIONS; p++) { if (table[p]->bootind != 0 && table[p]->sysind == MINIX_PART) { bootdev.primary= p; strcat(bootdev.name, "p0"); bootdev.name[3] += p; lowsec= table[p]->lowsec; break; } } #endif /* DOS */ } #endif /* BIOS */ /* Reserved names: */ enum resnames { R_NULL, R_BOOT, R_DELAY, R_ECHO, R_EXIT, R_HELP, R_LS, R_MENU, R_SAVE, R_SET, R_TRAP, R_UNSET }; char resnames[][6] = { "", "boot", "delay", "echo", "exit", "help", "ls", "menu", "save", "set", "trap", "unset", }; /* Using this for all null strings saves a lot of memory. */ #define null (resnames[0]) int reserved(char *s) /* Recognize reserved strings. */ { int r; for (r= R_BOOT; r <= R_UNSET; r++) { if (strcmp(s, resnames[r]) == 0) return r; } return R_NULL; } void sfree(char *s) /* Free a non-null string. */ { if (s != nil && s != null) free(s); } char *copystr(char *s) /* Copy a non-null string using malloc. */ { char *c; if (*s == 0) return null; c= malloc((strlen(s) + 1) * sizeof(char)); strcpy(c, s); return c; } int is_default(environment *e) { return (e->flags & E_SPECIAL) && e->defval == nil; } environment **searchenv(char *name) { environment **aenv= &env; while (*aenv != nil && strcmp((*aenv)->name, name) != 0) { aenv= &(*aenv)->next; } return aenv; } #define b_getenv(name) (*searchenv(name)) /* Return the environment *structure* belonging to name, or nil if not found. */ char *b_value(char *name) /* The value of a variable. */ { environment *e= b_getenv(name); return e == nil || !(e->flags & E_VAR) ? nil : e->value; } char *b_body(char *name) /* The value of a function. */ { environment *e= b_getenv(name); return e == nil || !(e->flags & E_FUNCTION) ? nil : e->value; } int b_setenv(int flags, char *name, char *arg, char *value) /* Change the value of an environment variable. Returns the flags of the * variable if you are not allowed to change it, 0 otherwise. */ { environment **aenv, *e; if (*(aenv= searchenv(name)) == nil) { if (reserved(name)) return E_RESERVED; e= malloc(sizeof(*e)); e->name= copystr(name); e->flags= flags; e->defval= nil; e->next= nil; *aenv= e; } else { e= *aenv; /* Don't change special variables to functions or vv. */ if (e->flags & E_SPECIAL && (e->flags & E_FUNCTION) != (flags & E_FUNCTION) ) return e->flags; e->flags= (e->flags & E_STICKY) | flags; if (is_default(e)) { e->defval= e->value; } else { sfree(e->value); } sfree(e->arg); } e->arg= copystr(arg); e->value= copystr(value); return 0; } int b_setvar(int flags, char *name, char *value) /* Set variable or simple function. */ { return b_setenv(flags, name, null, value); } void b_unset(char *name) /* Remove a variable from the environment. A special variable is reset to * its default value. */ { environment **aenv, *e; if ((e= *(aenv= searchenv(name))) == nil) return; if (e->flags & E_SPECIAL) { if (e->defval != nil) { sfree(e->arg); e->arg= null; sfree(e->value); e->value= e->defval; e->defval= nil; } } else { sfree(e->name); sfree(e->arg); sfree(e->value); *aenv= e->next; free(e); } } long a2l(char *a) /* Cheap atol(). */ { int sign= 1; long n= 0; if (*a == '-') { sign= -1; a++; } while (between('0', *a, '9')) n= n * 10 + (*a++ - '0'); return sign * n; } char *ul2a(u32_t n, unsigned b) /* Transform a long number to ascii at base b, (b >= 8). */ { static char num[(CHAR_BIT * sizeof(n) + 2) / 3 + 1]; char *a= arraylimit(num) - 1; static char hex[16] = "0123456789ABCDEF"; do *--a = hex[(int) (n % b)]; while ((n/= b) > 0); return a; } char *ul2a10(u32_t n) /* Transform a long number to ascii at base 10. */ { return ul2a(n, 10); } unsigned a2x(char *a) /* Ascii to hex. */ { unsigned n= 0; int c; for (;;) { c= *a; if (between('0', c, '9')) c= c - '0' + 0x0; else if (between('A', c, 'F')) c= c - 'A' + 0xA; else if (between('a', c, 'f')) c= c - 'a' + 0xa; else break; n= (n<<4) | c; a++; } return n; } void get_parameters(void) { char params[SECTOR_SIZE + 1]; token **acmds; int r, bus; memory *mp; static char bus_type[][4] = { "xt", "at", "mca" }; static char vid_type[][4] = { "mda", "cga", "ega", "ega", "vga", "vga" }; static char vid_chrome[][6] = { "mono", "color" }; /* Variables that Minix needs: */ b_setvar(E_SPECIAL|E_VAR|E_DEV, "rootdev", "ram"); b_setvar(E_SPECIAL|E_VAR|E_DEV, "ramimagedev", "bootdev"); b_setvar(E_SPECIAL|E_VAR, "ramsize", "0"); #if BIOS b_setvar(E_SPECIAL|E_VAR, "processor", ul2a10(getprocessor())); b_setvar(E_SPECIAL|E_VAR, "bus", bus_type[get_bus()]); b_setvar(E_SPECIAL|E_VAR, "video", vid_type[get_video()]); b_setvar(E_SPECIAL|E_VAR, "chrome", vid_chrome[get_video() & 1]); params[0]= 0; for (mp= mem; mp < arraylimit(mem); mp++) { if (mp->size == 0) continue; if (params[0] != 0) strcat(params, ","); strcat(params, ul2a(mp->base, 0x10)); strcat(params, ":"); strcat(params, ul2a(mp->size, 0x10)); } b_setvar(E_SPECIAL|E_VAR, "memory", params); b_setvar(E_SPECIAL|E_VAR, "c0", DOS ? "dosfile" : get_bus() == 1 ? "at" : "bios"); #if DOS b_setvar(E_SPECIAL|E_VAR, "dosfile-d0", vdisk); #endif #endif #if UNIX b_setvar(E_SPECIAL|E_VAR, "processor", "?"); b_setvar(E_SPECIAL|E_VAR, "bus", "?"); b_setvar(E_SPECIAL|E_VAR, "video", "?"); b_setvar(E_SPECIAL|E_VAR, "chrome", "?"); b_setvar(E_SPECIAL|E_VAR, "memory", "?"); b_setvar(E_SPECIAL|E_VAR, "c0", "?"); #endif /* Variables boot needs: */ b_setvar(E_SPECIAL|E_VAR, "image", "minix"); b_setvar(E_SPECIAL|E_FUNCTION, "leader", "echo \\cMinix boot monitor \\v\\n" "\\nPress ESC to enter the monitor"); b_setvar(E_SPECIAL|E_FUNCTION, "main", "menu"); b_setvar(E_SPECIAL|E_FUNCTION, "trailer", "echo \\c"); /* Default hidden menu function: */ b_setenv(E_RESERVED|E_FUNCTION, null, "=,Start Minix", "boot"); /* Tokenize bootparams sector. */ if ((r= readsectors(mon2abs(params), lowsec+PARAMSEC, 1)) != 0) { readerr(lowsec+PARAMSEC, r); exit(1); } params[SECTOR_SIZE]= 0; acmds= tokenize(&cmds, params); /* Stuff the default action into the command chain. */ #if UNIX (void) tokenize(acmds, ":;"); #elif DOS (void) tokenize(tokenize(acmds, ":;leader;"), drun); #else /* BIOS */ (void) tokenize(acmds, ":;leader;main"); #endif } char *addptr; void addparm(char *n) { while (*n != 0 && *addptr != 0) *addptr++ = *n++; } void save_parameters(void) /* Save nondefault environment variables to the bootparams sector. */ { environment *e; char params[SECTOR_SIZE + 1]; int r; /* Default filling: */ memset(params, '\n', SECTOR_SIZE); /* Don't touch the 0! */ params[SECTOR_SIZE]= 0; addptr= params; for (e= env; e != nil; e= e->next) { if (e->flags & E_RESERVED || is_default(e)) continue; addparm(e->name); if (e->flags & E_FUNCTION) { addparm("("); addparm(e->arg); addparm(")"); } else { addparm((e->flags & (E_DEV|E_SPECIAL)) != E_DEV ? "=" : "=d "); } addparm(e->value); if (*addptr == 0) { printf("The environment is too big\n"); return; } *addptr++= '\n'; } /* Save the parameters on disk. */ if ((r= writesectors(mon2abs(params), lowsec+PARAMSEC, 1)) != 0) { writerr(lowsec+PARAMSEC, r); printf("Can't save environment\n"); } } void show_env(void) /* Show the environment settings. */ { environment *e; unsigned more= 0; int c; for (e= env; e != nil; e= e->next) { if (e->flags & E_RESERVED) continue; if (!istty && is_default(e)) continue; if (e->flags & E_FUNCTION) { printf("%s(%s) %s\n", e->name, e->arg, e->value); } else { printf(is_default(e) ? "%s = (%s)\n" : "%s = %s\n", e->name, e->value); } if (e->next != nil && istty && ++more % 20 == 0) { printf("More? "); c= getch(); if (c == ESC || c > ' ') { putch('\n'); if (c > ' ') ungetch(c); break; } printf("\b\b\b\b\b\b"); } } } int numprefix(char *s, char **ps) /* True iff s is a string of digits. *ps will be set to the first nondigit * if non-nil, otherwise the string should end. */ { char *n= s; while (between('0', *n, '9')) n++; if (n == s) return 0; if (ps == nil) return *n == 0; *ps= n; return 1; } int numeric(char *s) { return numprefix(s, (char **) nil); } #if BIOS /* Device numbers of standard Minix devices. */ #define DEV_RAM 0x0100 #define DEV_FD0 0x0200 static dev_t dev_cNd0[] = { 0x0300, 0x0800, 0x0A00, 0x0C00, 0x1000 }; #define minor_p0s0 128 dev_t name2dev(char *name) /* Translate, say, /dev/c0d0p2 to a device number. If the name can't be * found on the boot device, then do some guesswork. The global structure * "tmpdev" will be filled in based on the name, so that "boot d1p0" knows * what device to boot without interpreting device numbers. */ { dev_t dev; ino_t ino; int drive; struct stat st; char *n, *s; /* "boot *d0p2" means: make partition 2 active before you boot it. */ if ((activate= (name[0] == '*'))) name++; /* The special name "bootdev" must be translated to the boot device. */ if (strcmp(name, "bootdev") == 0) { if (bootdev.device == -1) { printf("The boot device could not be named\n"); errno= 0; return -1; } name= bootdev.name; } /* If our boot device doesn't have a file system, or we want to know * what a name means for the BIOS, then we need to interpret the * device name ourselves: "fd" = floppy, "c0d0" = hard disk, etc. */ tmpdev.device= tmpdev.primary= tmpdev.secondary= -1; dev= -1; n= name; if (strncmp(n, "/dev/", 5) == 0) n+= 5; if (strcmp(n, "ram") == 0) { dev= DEV_RAM; } else if (n[0] == 'f' && n[1] == 'd' && numeric(n+2)) { /* Floppy. */ tmpdev.device= a2l(n+2); dev= DEV_FD0 + tmpdev.device; } else if ((n[0] == 'h' || n[0] == 's') && n[1] == 'd' && numprefix(n+2, &s) && (*s == 0 || (between('a', *s, 'd') && s[1] == 0)) ) { /* Old style hard disk (backwards compatibility.) */ dev= a2l(n+2); tmpdev.device= dev / (1 + NR_PARTITIONS); tmpdev.primary= (dev % (1 + NR_PARTITIONS)) - 1; if (*s != 0) { /* Subpartition. */ tmpdev.secondary= *s - 'a'; dev= minor_p0s0 + (tmpdev.device * NR_PARTITIONS + tmpdev.primary) * NR_PARTITIONS + tmpdev.secondary; } tmpdev.device+= 0x80; dev+= n[0] == 'h' ? dev_cNd0[0] : dev_cNd0[2]; } else { /* Hard disk. */ int ctrlr= 0; if (n[0] == 'c' && between('0', n[1], '4')) { ctrlr= (n[1] - '0'); tmpdev.device= 0; n+= 2; } if (n[0] == 'd' && between('0', n[1], '7')) { tmpdev.device= (n[1] - '0'); n+= 2; if (n[0] == 'p' && between('0', n[1], '3')) { tmpdev.primary= (n[1] - '0'); n+= 2; if (n[0] == 's' && between('0', n[1], '3')) { tmpdev.secondary= (n[1] - '0'); n+= 2; } } } if (*n == 0) { dev= dev_cNd0[ctrlr]; if (tmpdev.secondary < 0) { dev += tmpdev.device * (NR_PARTITIONS+1) + (tmpdev.primary + 1); } else { dev += minor_p0s0 + (tmpdev.device * NR_PARTITIONS + tmpdev.primary) * NR_PARTITIONS + tmpdev.secondary; } tmpdev.device+= 0x80; } } /* Look the name up on the boot device for the UNIX device number. */ if (fsok) { /* The current working directory is "/dev". */ ino= r_lookup(r_lookup(ROOT_INO, "dev"), name); if (ino != 0) { /* Name has been found, extract the device number. */ r_stat(ino, &st); if (!S_ISBLK(st.st_mode)) { printf("%s is not a block device\n", name); errno= 0; return (dev_t) -1; } dev= st.st_rdev; } } if (tmpdev.primary < 0) activate= 0; /* Careful now! */ if (dev == -1) { printf("Can't recognize '%s' as a device\n", name); errno= 0; } return dev; } #if !DOS #define B_NOSIG -1 /* "No signature" error code. */ int exec_bootstrap(void) /* Load boot sector from the disk or floppy described by tmpdev and execute it. */ { int r, n, dirty= 0; char master[SECTOR_SIZE]; struct part_entry *table[NR_PARTITIONS], dummy, *active= &dummy; u32_t masterpos; active->lowsec= 0; /* Select a partition table entry. */ while (tmpdev.primary >= 0) { masterpos= active->lowsec; if ((r= get_master(master, table, masterpos)) != 0) return r; active= table[tmpdev.primary]; /* How does one check a partition table entry? */ if (active->sysind == NO_PART) return B_NOSIG; tmpdev.primary= tmpdev.secondary; tmpdev.secondary= -1; } if (activate && !active->bootind) { for (n= 0; n < NR_PARTITIONS; n++) table[n]->bootind= 0; active->bootind= ACTIVE_FLAG; dirty= 1; } /* Read the boot sector. */ if ((r= readsectors(BOOTPOS, active->lowsec, 1)) != 0) return r; /* Check signature word. */ if (get_word(BOOTPOS+SIGNATOFF) != SIGNATURE) return B_NOSIG; /* Write the partition table if a member must be made active. */ if (dirty && (r= writesectors(mon2abs(master), masterpos, 1)) != 0) return r; bootstrap(device, active); } void boot_device(char *devname) /* Boot the device named by devname. */ { dev_t dev= name2dev(devname); int save_dev= device; int r; char *err; if (tmpdev.device < 0) { if (dev != -1) printf("Can't boot from %s\n", devname); return; } /* Change current device and try to load and execute its bootstrap. */ device= tmpdev.device; if ((r= dev_open()) == 0) r= exec_bootstrap(); err= r == B_NOSIG ? "Not bootable" : bios_err(r); printf("Can't boot %s: %s\n", devname, err); /* Restore boot device setting. */ device= save_dev; (void) dev_open(); } #else /* DOS */ void boot_device(char *devname) /* No booting of other devices under DOS */ { printf("Can't boot devices under MS-DOS\n"); } #endif /* DOS */ #endif /* BIOS */ void ls(char *dir) /* List the contents of a directory. */ { ino_t ino; struct stat st; char name[NAME_MAX+1]; if (!fsok) return; if ((ino= r_lookup(ROOT_INO, dir)) == 0 || (r_stat(ino, &st), r_readdir(name)) == -1 ) { printf("ls: %s: %s\n", dir, unix_err(errno)); return; } (void) r_readdir(name); /* Skip ".." too. */ while ((ino= r_readdir(name)) != 0) printf("%s/%s\n", dir, name); } u32_t milli_time(void) { return get_tick() * MSEC_PER_TICK; } u32_t milli_since(u32_t base) { return (milli_time() + (TICKS_PER_DAY*MSEC_PER_TICK) - base) % (TICKS_PER_DAY*MSEC_PER_TICK); } char *Thandler; u32_t Tbase, Tcount; void unschedule(void) /* Invalidate a waiting command. */ { alarm(0); if (Thandler != nil) { free(Thandler); Thandler= nil; } } void schedule(long msec, char *cmd) /* Schedule command at a certain time from now. */ { unschedule(); Thandler= cmd; Tbase= milli_time(); Tcount= msec; alarm(1); } int expired(void) /* Check if the timer expired for getch(). */ { return (Thandler != nil && milli_since(Tbase) >= Tcount); } void delay(char *msec) /* Delay for a given time. */ { u32_t base, count; if ((count= a2l(msec)) == 0) return; base= milli_time(); alarm(1); do { pause(); } while (!interrupt() && !expired() && milli_since(base) < count); } enum whatfun { NOFUN, SELECT, DEFFUN, USERFUN } menufun(environment *e) { if (!(e->flags & E_FUNCTION) || e->arg[0] == 0) return NOFUN; if (e->arg[1] != ',') return SELECT; return e->flags & E_RESERVED ? DEFFUN : USERFUN; } void menu(void) /* By default: Show a simple menu. * Multiple kernels/images: Show extra selection options. * User defined function: Kill the defaults and show these. * Wait for a keypress and execute the given function. */ { int c, def= 1; char *choice= nil; environment *e; /* Just a default menu? */ for (e= env; e != nil; e= e->next) if (menufun(e) == USERFUN) def= 0; printf("\nHit a key as follows:\n\n"); /* Show the choices. */ for (e= env; e != nil; e= e->next) { switch (menufun(e)) { case DEFFUN: if (!def) break; /*FALL THROUGH*/ case USERFUN: printf(" %c %s\n", e->arg[0], e->arg+2); break; case SELECT: printf(" %c Select %s kernel\n", e->arg[0],e->name); break; default:; } } /* Wait for a keypress. */ do { c= getch(); if (interrupt() || expired()) return; unschedule(); for (e= env; e != nil; e= e->next) { switch (menufun(e)) { case DEFFUN: if (!def) break; case USERFUN: case SELECT: if (c == e->arg[0]) choice= e->value; } } } while (choice == nil); /* Execute the chosen function. */ printf("%c\n", c); (void) tokenize(&cmds, choice); } void help(void) /* Not everyone is a rocket scientist. */ { struct help { char *thing; char *help; } *pi; static struct help info[] = { { nil, "Names:" }, { "rootdev", "Root device" }, { "ramimagedev", "RAM disk image if root is RAM" }, { "ramsize", "RAM disk size" }, { "bootdev", "Special name for the boot device" }, { "fd0, d0p2, c0d0p1s0", "Devices (as in /dev)" }, { "image", "Name of the kernel image" }, { "main", "Startup function" }, { nil, "Commands:" }, { "name = [device] value", "Set environment variable" }, { "name() { ... }", "Define function" }, { "name(key,text) { ... }", "A menu function like: minix(=,Start Minix) {boot}" }, { "name", "Call function" }, { "boot [device]", "Boot Minix or another O.S." }, { "delay [msec]", "Delay (500 msec default)" }, { "echo word ...", "Print the words" }, { "ls [directory]", "List contents of directory" }, { "menu", "Choose a menu function" }, { "save", "Save environment" }, { "set", "Show environment" }, { "trap msec command", "Schedule command" }, { "unset name ...", "Unset variable or set to default" }, { "exit", "Exit the Monitor" }, }; for (pi= info; pi < arraylimit(info); pi++) { if (pi->thing != nil) printf(" %-24s- ", pi->thing); printf("%s\n", pi->help); } } void execute(void) /* Get one command from the command chain and execute it. */ { token *second, *third, *fourth, *sep; char *name; int res; size_t n= 0; if (err) { /* An error occured, stop interpreting. */ while (cmds != nil) voidtoken(); return; } if (expired()) { /* Timer expired? */ parse_code(Thandler); unschedule(); } /* There must be a separator lurking somewhere. */ for (sep= cmds; sep != nil && sep->token[0] != ';'; sep= sep->next) n++; name= cmds->token; res= reserved(name); if ((second= cmds->next) != nil && (third= second->next) != nil) fourth= third->next; /* Null command? */ if (n == 0) { voidtoken(); return; } else /* name = [device] value? */ if ((n == 3 || n == 4) && !sugar(name) && second->token[0] == '=' && !sugar(third->token) && (n == 3 || (n == 4 && third->token[0] == 'd' && !sugar(fourth->token) ))) { char *value= third->token; int flags= E_VAR; if (n == 4) { value= fourth->token; flags|= E_DEV; } if ((flags= b_setvar(flags, name, value)) != 0) { printf("%s is a %s\n", name, flags & E_RESERVED ? "reserved word" : "special function"); err= 1; } while (cmds != sep) voidtoken(); return; } else /* name '(arg)' ... ? */ if (n >= 3 && !sugar(name) && second->token[0] == '(' ) { token *fun; int c, flags, depth; char *body; size_t len; sep= fun= third; depth= 0; len= 1; while (sep != nil) { if ((c= sep->token[0]) == ';' && depth == 0) break; len+= strlen(sep->token) + 1; sep= sep->next; if (c == '{') depth++; if (c == '}' && --depth == 0) break; } body= malloc(len * sizeof(char)); *body= 0; while (fun != sep) { strcat(body, fun->token); if (!sugar(fun->token) && !sugar(fun->next->token) ) strcat(body, " "); fun= fun->next; } second->token[strlen(second->token)-1]= 0; if (depth != 0) { printf("Missing '}'\n"); err= 1; } else if ((flags= b_setenv(E_FUNCTION, name, second->token+1, body)) != 0) { printf("%s is a %s\n", name, flags & E_RESERVED ? "reserved word" : "special variable"); err= 1; } while (cmds != sep) voidtoken(); free(body); return; } else /* Grouping? */ if (name[0] == '{') { token **acmds= &cmds->next; char *t; int depth= 1; /* Find and remove matching '}' */ depth= 1; while (*acmds != nil) { t= (*acmds)->token; if (t[0] == '{') depth++; if (t[0] == '}' && --depth == 0) { t[0]= ';'; break; } acmds= &(*acmds)->next; } voidtoken(); return; } else /* Command coming up, check if ESC typed. */ if (interrupt()) { return; } else /* unset name ..., echo word ...? */ if (n >= 1 && (res == R_UNSET || res == R_ECHO)) { char *arg= poptoken(), *p; for (;;) { free(arg); if (cmds == sep) break; arg= poptoken(); if (res == R_UNSET) { /* unset arg */ b_unset(arg); } else { /* echo arg */ p= arg; while (*p != 0) { if (*p != '\\') { putch(*p); } else switch (*++p) { case 0: if (cmds == sep) return; continue; case 'n': putch('\n'); break; case 'v': printf(version); break; case 'c': clear_screen(); break; case 'w': for (;;) { if (interrupt()) return; if (getch() == '\n') break; } break; default: putch(*p); } p++; } putch(cmds != sep ? ' ' : '\n'); } } return; } else /* boot -opts? */ if (n == 2 && res == R_BOOT && second->token[0] == '-') { static char optsvar[]= "bootopts"; (void) b_setvar(E_VAR, optsvar, second->token); voidtoken(); voidtoken(); bootminix(); b_unset(optsvar); return; } else /* boot device, ls dir, delay msec? */ if (n == 2 && (res == R_BOOT || res == R_DELAY || res == R_LS)) { if (res == R_BOOT) boot_device(second->token); if (res == R_DELAY) delay(second->token); if (res == R_LS) ls(second->token); voidtoken(); voidtoken(); return; } else /* trap msec command? */ if (n == 3 && res == R_TRAP && numeric(second->token)) { long msec= a2l(second->token); voidtoken(); voidtoken(); schedule(msec, poptoken()); return; } else /* Simple command. */ if (n == 1) { char *body; int ok= 0; name= poptoken(); switch (res) { case R_BOOT: bootminix(); ok= 1; break; case R_DELAY: delay("500"); ok= 1; break; case R_LS: ls(null); ok= 1; break; case R_MENU: menu(); ok= 1; break; case R_SAVE: save_parameters(); ok= 1;break; case R_SET: show_env(); ok= 1; break; case R_HELP: help(); ok= 1; break; case R_EXIT: exit(0); } /* Command to check bootparams: */ if (strcmp(name, ":") == 0) ok= 1; /* User defined function. */ if (!ok && (body= b_body(name)) != nil) { (void) tokenize(&cmds, body); ok= 1; } if (!ok) printf("%s: unknown function", name); free(name); if (ok) return; } else { /* Syntax error. */ printf("Can't parse:"); while (cmds != sep) { printf(" %s", cmds->token); voidtoken(); } } /* Getting here means that the command is not understood. */ printf("\nTry 'help'\n"); err= 1; } int run_trailer(void) /* Run the trailer function between loading Minix and handing control to it. * Return true iff there was no error. */ { token *save_cmds= cmds; cmds= nil; (void) tokenize(&cmds, "trailer"); while (cmds != nil) execute(); cmds= save_cmds; return !err; } void monitor(void) /* Read a line and tokenize it. */ { char *line; unschedule(); /* Kill a trap. */ err= 0; /* Clear error state. */ if (istty) printf("%s>", bootdev.name); line= readline(); (void) tokenize(&cmds, line); free(line); (void) escape(); /* Forget if ESC typed. */ } #if BIOS void boot(void) /* Load Minix and start it, among other things. */ { /* Initialize tables. */ initialize(); /* Get environment variables from the parameter sector. */ get_parameters(); /* Read and check the superblock. */ fsok= r_super() != 0; while (1) { /* While there are commands, execute them! */ while (cmds != nil) execute(); /* The "monitor" is just a "read one command" thing. */ monitor(); } } #endif /* BIOS */ #if UNIX void main(int argc, char **argv) /* Do not load or start anything, just edit parameters. */ { int i; char bootcode[SECTOR_SIZE]; struct termios rawterm; istty= (argc <= 2 && tcgetattr(0, &termbuf) == 0); if (argc < 2) { fprintf(stderr, "Usage: edparams device [command ...]\n"); exit(1); } /* Go over the arguments, changing control characters to spaces. */ for (i= 2; i < argc; i++) { char *p; for (p= argv[i]; *p != 0; p++) { if ((unsigned) *p < ' ' && *p != '\n') *p= ' '; } } bootdev.name= argv[1]; if (strncmp(bootdev.name, "/dev/", 5) == 0) bootdev.name+= 5; if ((bootdev.device= open(argv[1], O_RDWR, 0666)) < 0) fatal(bootdev.name); /* Check if it is a bootable Minix device. */ if (readsectors(mon2abs(bootcode), lowsec, 1) != 0 || memcmp(bootcode, boot_magic, sizeof(boot_magic)) != 0) { fprintf(stderr, "edparams: %s: not a bootable Minix device\n", bootdev.name); exit(1); } /* Print greeting message. */ if (istty) printf("Boot parameters editor.\n"); signal(SIGINT, trap); signal(SIGALRM, trap); if (istty) { rawterm= termbuf; rawterm.c_lflag&= ~(ICANON|ECHO|IEXTEN); rawterm.c_cc[VINTR]= ESC; if (tcsetattr(0, TCSANOW, &rawterm) < 0) fatal(""); } /* Get environment variables from the parameter sector. */ get_parameters(); /* Read and check the superblock. */ fsok= r_super() != 0; i= 2; for (;;) { /* While there are commands, execute them! */ while (cmds != nil || i < argc) { if (cmds == nil) { /* A command line command. */ parse_code(argv[i++]); } execute(); /* Bail out on errors if not interactive. */ if (err && !istty) exit(1); } /* Commands on the command line? */ if (argc > 2) break; /* The "monitor" is just a "read one command" thing. */ monitor(); } exit(0); } #endif /* UNIX */ /* boot.h - Info between different parts of boot. Author: Kees J. Bot */ /* Constants describing the metal: */ #define SECTOR_SIZE 512 #define SECTOR_SHIFT 9 #define RATIO (BLOCK_SIZE / SECTOR_SIZE) #define PARAMSEC 1 /* Sector containing boot parameters. */ #define DSKBASE 0x1E /* Floppy disk parameter vector. */ #define DSKPARSIZE 11 /* There are this many bytes of parameters. */ #define ESC '\33' /* Escape key. */ #define HEADERPOS 0x00600L /* Place for an array of struct exec's. */ #define FREEPOS 0x08000L /* Memory from FREEPOS to caddr is free to * play with. */ #if BIOS #define MSEC_PER_TICK 55 /* Clock does 18.2 ticks per second. */ #define TICKS_PER_DAY 0x1800B0L /* After 24 hours it wraps. */ #endif #if UNIX #define MSEC_PER_TICK 1000 /* Clock does 18.2 ticks per second. */ #define TICKS_PER_DAY 86400L /* Doesn't wrap, but that doesn't matter. */ #endif #define BOOTPOS 0x07C00L /* Bootstraps are loaded here. */ #define SIGNATURE 0xAA55 /* Proper bootstraps have this signature. */ #define SIGNATOFF 510 /* Offset within bootblock. */ /* BIOS video modes. */ #define MONO_MODE 0x07 /* 80x25 monochrome. */ #define COLOR_MODE 0x03 /* 80x25 color. */ /* Variables shared with boothead.s: */ #ifndef EXTERN #define EXTERN extern #endif typedef struct vector { /* 8086 vector */ u16_t offset; u16_t segment; } vector; EXTERN vector rem_part; /* Boot partition table entry. */ EXTERN u32_t caddr, daddr; /* Code and data address of the boot program. */ EXTERN u32_t runsize; /* Size of this program. */ EXTERN u16_t device; /* Drive being booted from. */ typedef struct { /* One chunk of free memory. */ u32_t base; /* Start byte. */ u32_t size; /* Number of bytes. */ } memory; EXTERN memory mem[3]; /* List of available memory. */ /* Functions defined by boothead.s: */ void exit(int code); /* Exit the monitor. */ u32_t mon2abs(void *ptr); /* Local monitor address to absolute address. */ u32_t vec2abs(vector *vec); /* Vector to absolute address. */ void raw_copy(u32_t dstaddr, u32_t srcaddr, u32_t count); /* Copy bytes from anywhere to anywhere. */ u16_t get_word(u32_t addr); /* Get a word from anywhere. */ void put_word(u32_t addr, U16_t word); /* Put a word anywhere. */ void relocate(void); /* Switch to a copy of this program. */ int dev_open(void), dev_close(void); /* Open device and determine params / close device. */ int dev_boundary(u32_t sector); /* True if sector is on a track boundary. */ int readsectors(u32_t bufaddr, u32_t sector, U8_t count); /* Read 1 or more sectors from "device". */ int writesectors(u32_t bufaddr, u32_t sector, U8_t count); /* Write 1 or more sectors to "device". */ int getch(void); /* Read a keypress. */ void ungetch(int c); /* Undo a keypress. */ int escape(void); /* True if escape typed. */ void putch(int c); /* Send a character to the screen. */ #if BIOS void pause(void); #endif /* Wait for an interrupt. */ void set_mode(unsigned mode); void clear_screen(void); /* Set video mode / clear the screen. */ u16_t get_bus(void); /* System bus type, XT, AT, or MCA. */ u16_t get_video(void); /* Display type, MDA to VGA. */ u32_t get_tick(void); /* Current value of the clock tick counter. */ void bootstrap(int device, struct part_entry *entry); /* Execute a bootstrap routine for a different O.S. */ void minix(u32_t koff, u32_t kcs, u32_t kds, char *bootparams, size_t paramsize, u32_t aout); /* Start Minix. */ /* Shared between boot.c and bootimage.c: */ /* Sticky attributes. */ #define E_SPECIAL 0x01 /* These are known to the program. */ #define E_DEV 0x02 /* The value is a device name. */ #define E_RESERVED 0x04 /* May not be set by user, e.g. 'boot' */ #define E_STICKY 0x07 /* Don't go once set. */ /* Volatile attributes. */ #define E_VAR 0x08 /* Variable */ #define E_FUNCTION 0x10 /* Function definition. */ /* Variables, functions, and commands. */ typedef struct environment { struct environment *next; char flags; char *name; /* name = value */ char *arg; /* name(arg) {value} */ char *value; char *defval; /* Safehouse for default values. */ } environment; EXTERN environment *env; /* Lists the environment. */ char *b_value(char *name); /* Get/set the value of a variable. */ int b_setvar(int flags, char *name, char *value); void parse_code(char *code); /* Parse boot monitor commands. */ EXTERN int fsok; /* True if the boot device contains an FS. */ EXTERN u32_t lowsec; /* Offset to the file system on the boot device. */ /* Called by boot.c: */ void bootminix(void); /* Load and start a Minix image. */ /* Called by bootimage.c: */ void readerr(off_t sec, int err); /* Report a read error. */ char *ul2a(u32_t n, unsigned b), *ul2a10(u32_t n); /* Transform u32_t to ASCII at base b or base 10. */ long a2l(char *a); /* Cheap atol(). */ unsigned a2x(char *a); /* ASCII to hex. */ dev_t name2dev(char *name); /* Translate a device name to a device number. */ int numprefix(char *s, char **ps); /* True for a numeric prefix. */ int numeric(char *s); /* True for a numeric string. */ char *unix_err(int err); /* Give a descriptive text for some UNIX errors. */ int run_trailer(void); /* Run the trailer function. */ #if DOS /* The monitor runs under MS-DOS. */ extern char PSP[256]; /* Program Segment Prefix. */ EXTERN char *vdisk; /* Name of the virtual disk. */ EXTERN char *drun; /* Initial command from DOS command line. */ #else /* The monitor uses only the BIOS. */ #define DOS 0 #endif ! Bootblock 1.5 - Minix boot block. Author: Kees J. Bot ! 21 Dec 1991 ! ! When the PC is powered on, it will try to read the first sector of floppy ! disk 0 at address 0x7C00. If this fails due to the absence of flexible ! magnetic media, it will read the master boot record from the first sector ! of the hard disk. This sector not only contains executable code, but also ! the partition table of the hard disk. When executed, it will select the ! active partition and load the first sector of that at address 0x7C00. ! This file contains the code that is eventually read from either the floppy ! disk, or the hard disk partition. It is just smart enough to load /boot ! from the boot device into memory at address 0x10000 and execute that. The ! disk addresses for /boot are patched into this code by installboot as 24-bit ! sector numbers and 8-bit sector counts above enddata upwards. /boot is in ! turn smart enough to load the different parts of the Minix kernel into ! memory and execute them to finally get Minix started. ! LOADOFF = 0x7C00 ! 0x0000:LOADOFF is where this code is loaded BOOTSEG = 0x1000 ! Secondary boot code segment. BOOTOFF = 0x0030 ! Offset into /boot above header BUFFER = 0x0600 ! First free memory LOWSEC = 8 ! Offset of logical first sector in partition ! table ! Variables addressed using bp register device = 0 ! The boot device lowsec = 2 ! Offset of boot partition within drive secpcyl = 6 ! Sectors per cylinder = heads * sectors .text ! Start boot procedure. boot: xor ax, ax ! ax = 0x0000, the vector segment mov ds, ax cli ! Ignore interrupts while setting stack mov ss, ax ! ss = ds = vector segment mov sp, #LOADOFF ! Usual place for a bootstrap stack sti push ax push ax ! Push a zero lowsec(bp) push dx ! Boot device in dl will be device(bp) mov bp, sp ! Using var(bp) is one byte cheaper then var. push es push si ! es:si = partition table entry if hard disk mov di, #LOADOFF+sectors ! char *di = sectors; testb dl, dl ! Winchester disks if dl >= 0x80 jge floppy winchester: ! Get the offset of the first sector of the boot partition from the partition ! table. The table is found at es:si, the lowsec parameter at offset LOWSEC. eseg les ax, LOWSEC(si) ! es:ax = LOWSEC+2(si):LOWSEC(si) mov lowsec+0(bp), ax ! Low 16 bits of partition's first sector mov lowsec+2(bp), es ! High 16 bits of partition's first sector ! Get the drive parameters, the number of sectors is bluntly written into the ! floppy disk sectors/track array. movb ah, #0x08 ! Code for drive parameters int 0x13 ! dl still contains drive andb cl, #0x3F ! cl = max sector number (1-origin) movb (di), cl ! Number of sectors per track incb dh ! dh = 1 + max head number (0-origin) jmp loadboot ! Floppy: ! Execute three read tests to determine the drive type. Test for each floppy ! type by reading the last sector on the first track. If it fails, try a type ! that has less sectors. Therefore we start with 1.44M (18 sectors) then 1.2M ! (15 sectors) ending with 720K/360K (both 9 sectors). next: inc di ! Next number of sectors per track floppy: xorb ah, ah ! Reset drive int 0x13 movb cl, (di) ! cl = number of last sector on track cmpb cl, #9 ! No need to do the last 720K/360K test je success ! Try to read the last sector on track 0 mov es, lowsec(bp) ! es = vector segment (lowsec = 0) mov bx, #BUFFER ! es:bx buffer = 0x0000:0x0600 mov ax, #0x0201 ! Read sector, #sectors = 1 xorb ch, ch ! Track 0, last sector xorb dh, dh ! Drive dl, head 0 int 0x13 jc next ! Error, try the next floppy type success:movb dh, #2 ! Load number of heads for multiply loadboot: ! Load /boot from the boot device movb al, (di) ! al = (di) = sectors per track mulb dh ! dh = heads, ax = heads * sectors mov secpcyl(bp), ax ! Sectors per cylinder = heads * sectors mov ax, #BOOTSEG ! Segment to load /boot into mov es, ax xor bx, bx ! Load first sector at es:bx = BOOTSEG:0x0000 mov si, #LOADOFF+addresses ! Start of the boot code addresses load: mov ax, 1(si) ! Get next sector number: low 16 bits movb dl, 3(si) ! Bits 16-23 for your up to 8GB partition xorb dh, dh ! dx:ax = sector within partition add ax, lowsec+0(bp) adc dx, lowsec+2(bp)! dx:ax = sector within drive cmp dx, #[1024*255*63-255]>>16 ! Near 8G limit? jae bigdisk div secpcyl(bp) ! ax = cylinder, dx = sector within cylinder xchg ax, dx ! ax = sector within cylinder, dx = cylinder movb ch, dl ! ch = low 8 bits of cylinder divb (di) ! al = head, ah = sector (0-origin) xorb dl, dl ! About to shift bits 8-9 of cylinder into dl shr dx, #1 shr dx, #1 ! dl[6..7] = high cylinder orb dl, ah ! dl[0..5] = sector (0-origin) movb cl, dl ! cl[0..5] = sector, cl[6..7] = high cyl incb cl ! cl[0..5] = sector (1-origin) movb dh, al ! dh = al = head movb dl, device(bp) ! dl = device to read movb al, (di) ! Sectors per track - Sector number (0-origin) subb al, ah ! = Sectors left on this track cmpb al, (si) ! Compare with # sectors to read jbe read ! Can't read past the end of a cylinder? movb al, (si) ! (si) < sectors left on this track read: push ax ! Save al = sectors to read movb ah, #0x02 ! Code for disk read (all registers in use now!) int 0x13 ! Call the BIOS for a read pop cx ! Restore al in cl jmp rdeval bigdisk: movb cl, (si) ! Number of sectors to read push si ! Save si mov si, #LOADOFF+ext_rw ! si = extended read/write parameter packet movb 2(si), cl ! Fill in # blocks to transfer mov 4(si), bx ! Buffer address mov 8(si), ax ! Starting block number = dx:ax mov 10(si), dx movb dl, device(bp) ! dl = device to read movb ah, #0x42 ! Extended read int 0x13 pop si ! Restore si to point to the addresses array !jmp rdeval rdeval: jc error ! Jump on disk read error movb al, cl ! Restore al = sectors read addb bh, al ! bx += 2 * al * 256 (add bytes read) addb bh, al ! es:bx = where next sector must be read add 1(si), ax ! Update address by sectors read adcb 3(si), ah ! Don't forget bits 16-23 (add ah = 0) subb (si), al ! Decrement sector count by sectors read jnz load ! Not all sectors have been read add si, #4 ! Next (address, count) pair cmpb ah, (si) ! Done when no sectors to read jnz load ! Read next chunk of /boot done: ! Call /boot, assuming a long a.out header (48 bytes). The a.out header is ! usually short (32 bytes), but to be sure /boot has two entry points: ! One at offset 0 for the long, and one at offset 16 for the short header. ! Parameters passed in registers are: ! ! dl = Boot-device. ! es:si = Partition table entry if hard disk. ! pop si ! Restore es:si = partition table entry pop es ! dl is still loaded jmpf BOOTOFF, BOOTSEG ! jmp to sec. boot (skipping header). ! Read error: print message, hang forever error: mov si, #LOADOFF+errno+1 prnum: movb al, ah ! Error number in ah andb al, #0x0F ! Low 4 bits cmpb al, #10 ! A-F? jb digit ! 0-9! addb al, #7 ! 'A' - ':' digit: addb (si), al ! Modify '0' in string dec si movb cl, #4 ! Next 4 bits shrb ah, cl jnz prnum ! Again if digit > 0 mov si, #LOADOFF+rderr ! String to print print: lodsb ! al = *si++ is char to be printed testb al, al ! Null byte marks end hang: jz hang ! Hang forever waiting for CTRL-ALT-DEL movb ah, #0x0E ! Print character in teletype mode mov bx, #0x0001 ! Page 0, foreground color int 0x10 ! Call BIOS VIDEO_IO jmp print .data rderr: .ascii "Read error " errno: .ascii "00 \0" errend: ! Floppy disk sectors per track for the 1.44M, 1.2M and 360K/720K types: sectors: .data1 18, 15, 9 ! Extended read/write commands require a parameter packet. ext_rw: .data1 0x10 ! Length of extended r/w packet .data1 0 ! Reserved .data2 0 ! Blocks to transfer (to be filled in) .data2 0 ! Buffer address offset (tbfi) .data2 BOOTSEG ! Buffer address segment .data4 0 ! Starting block number low 32 bits (tbfi) .data4 0 ! Starting block number high 32 bits .align 2 addresses: ! The space below this is for disk addresses for a 38K /boot program (worst ! case, i.e. file is completely fragmented). It should be enou&&gh. ! Boothead.s - BIOS support for boot.c Author: Kees J. Bot ! ! ! This file contains the startup and low level support for the secondary ! boot program. It contains functions for disk, tty and keyboard I/O, ! copying memory to arbitrary locations, etc. ! ! The primary bootstrap code supplies the following parameters in registers: ! dl = Boot-device. ! es:si = Partition table entry if hard disk. ! .text o32 = 0x66 ! This assembler doesn't know 386 extensions BOOTOFF = 0x7C00 ! 0x0000:BOOTOFF load a bootstrap here LOADSEG = 0x1000 ! Where this code is loaded. BUFFER = 0x0600 ! First free memory PENTRYSIZE = 16 ! Partition table entry size. a_flags = 2 ! From a.out.h, struct exec a_text = 8 a_data = 12 a_bss = 16 a_total = 24 A_SEP = 0x20 ! Separate I&D flag K_I386 = 0x0001 ! Call Minix in 386 mode K_RET = 0x0020 ! Returns to the monitor on reboot K_INT86 = 0x0040 ! Requires generic INT support K_MEML = 0x0080 ! Pass a list of free memory DS_SELECTOR = 3*8 ! Kernel data selector ES_SELECTOR = 4*8 ! Flat 4 Gb SS_SELECTOR = 5*8 ! Monitor stack CS_SELECTOR = 6*8 ! Kernel code MCS_SELECTOR= 7*8 ! Monitor code ESC = 0x1B ! Escape character ! Imported variables and functions: .extern _caddr, _daddr, _runsize, _edata, _end ! Runtime environment .extern _device ! BIOS device number .extern _rem_part ! To pass partition info .extern _k_flags ! Special kernel flags .extern _mem ! Free memory list .text ! Set segment registers and stack pointer using the programs own header! ! The header is either 32 bytes (short form) or 48 bytes (long form). The ! bootblock will jump to address 0x10030 in both cases, calling one of the ! two jmpf instructions below. jmpf boot, LOADSEG+3 ! Set cs right (skipping long a.out header) .space 11 ! jmpf + 11 = 16 bytes jmpf boot, LOADSEG+2 ! Set cs right (skipping short a.out header) boot: mov ax, #LOADSEG mov ds, ax ! ds = header movb al, a_flags testb al, #A_SEP ! Separate I&D? jnz sepID comID: xor ax, ax xchg ax, a_text ! No text add a_data, ax ! Treat all text as data sepID: mov ax, a_total ! Total nontext memory usage and ax, #0xFFFE ! Round down to even mov a_total, ax ! total - text = data + bss + heap + stack cli ! Ignore interrupts while stack in limbo mov sp, ax ! Set sp at the top of all that mov ax, a_text ! Determine offset of ds above cs movb cl, #4 shr ax, cl mov cx, cs add ax, cx mov ds, ax ! ds = cs + text / 16 mov ss, ax sti ! Stack ok now push es ! Save es, we need it for the partition table mov es, ax cld ! C compiler wants UP ! Clear bss xor ax, ax ! Zero mov di, #_edata ! Start of bss is at end of data mov cx, #_end ! End of bss (begin of heap) sub cx, di ! Number of bss bytes shr cx, #1 ! Number of words rep stos ! Clear bss ! Copy primary boot parameters to variables. (Can do this now that bss is ! cleared and may be written into). xorb dh, dh mov _device, dx ! Boot device (probably 0x00 or 0x80) mov _rem_part+0, si ! Remote partition table offset pop _rem_part+2 ! and segment (saved es) ! Remember the current video mode for restoration on exit. movb ah, #0x0F ! Get current video mode int 0x10 andb al, #0x7F ! Mask off bit 7 (no blanking) movb old_vid_mode, al movb cur_vid_mode, al ! Give C code access to the code segment, data segment and the size of this ! process. xor ax, ax mov dx, cs call seg2abs mov _caddr+0, ax mov _caddr+2, dx xor ax, ax mov dx, ds call seg2abs mov _daddr+0, ax mov _daddr+2, dx push ds mov ax, #LOADSEG mov ds, ax ! Back to the header once more mov ax, a_total+0 mov dx, a_total+2 ! dx:ax = data + bss + heap + stack add ax, a_text+0 adc dx, a_text+2 ! dx:ax = text + data + bss + heap + stack pop ds mov _runsize+0, ax mov _runsize+2, dx ! 32 bit size of this process ! Determine available memory as a list of (base,size) pairs as follows: ! mem[0] = low memory, mem[1] = memory between 1M and 16M, mem[2] = memory ! above 16M. Last two coalesced into mem[1] if adjacent. mov di, #_mem ! di = memory list int 0x12 ! Returns low memory size (in K) in ax mul c1024 mov 4(di), ax ! mem[0].size = low memory size in bytes mov 6(di), dx call _getprocessor cmp ax, #286 ! Only 286s and above have extended memory jb no_ext cmp ax, #486 ! Assume 486s were the first to have >64M jb small_ext ! (It helps to be paranoid when using the BIOS) big_ext: mov ax, #0xE801 ! Code for get memory size for >64M int 0x15 ! ax = mem at 1M per 1K, bx = mem at 16M per 64K jnc got_ext small_ext: movb ah, #0x88 ! Code for get extended memory size clc ! Carry will stay clear if call exists int 0x15 ! Returns size (in K) in ax for AT's jc no_ext test ax, ax ! An AT with no extended memory? jz no_ext xor bx, bx ! bx = mem above 16M per 64K = 0 got_ext: mov cx, ax ! cx = copy of ext mem at 1M mov 10(di), #0x0010 ! mem[1].base = 0x00100000 (1M) mul c1024 mov 12(di), ax ! mem[1].size = "ext mem at 1M" * 1024 mov 14(di), dx test bx, bx jz no_ext ! No more ext mem above 16M? cmp cx, #15*1024 ! Chunks adjacent? (precisely 15M at 1M?) je adj_ext mov 18(di), #0x0100 ! mem[2].base = 0x01000000 (16M) mov 22(di), bx ! mem[2].size = "ext mem at 16M" * 64K jmp no_ext adj_ext: add 14(di), bx ! Add ext mem above 16M to mem below 16M no_ext: ! Time to switch to a higher level language (not much higher) call _boot ! void ..exit(int status) ! Exit the monitor by rebooting the system. .define _exit, __exit, ___exit ! Make various compilers happy _exit: __exit: ___exit: mov bx, sp cmp 2(bx), #0 ! Good exit status? jz reboot quit: mov ax, #any_key push ax call _printf xorb ah, ah ! Read character from keyboard int 0x16 reboot: call restore_video int 0x19 ! Reboot the system .data any_key: .ascii "\nHit any key to reboot\n\0" .text ! u32_t mon2abs(void *ptr) ! Address in monitor data to absolute address. .define _mon2abs _mon2abs: mov bx, sp mov ax, 2(bx) ! ptr mov dx, ds ! Monitor data segment jmp seg2abs ! u32_t vec2abs(vector *vec) ! 8086 interrupt vector to absolute address. .define _vec2abs _vec2abs: mov bx, sp mov bx, 2(bx) mov ax, (bx) mov dx, 2(bx) ! dx:ax vector !jmp seg2abs ! Translate seg2abs: ! Translate dx:ax to the 32 bit address dx-ax push cx movb ch, dh movb cl, #4 shl dx, cl shrb ch, cl ! ch-dx = dx << 4 add ax, dx adcb ch, #0 ! ch-ax = ch-dx + ax movb dl, ch xorb dh, dh ! dx-ax = ch-ax pop cx ret abs2seg: ! Translate the 32 bit address dx-ax to dx:ax push cx movb ch, dl mov dx, ax ! ch-dx = dx-ax and ax, #0x000F ! Offset in ax movb cl, #4 shr dx, cl shlb ch, cl orb dh, ch ! dx = ch-dx >> 4 pop cx ret ! void raw_copy(u32_t dstaddr, u32_t srcaddr, u32_t count) ! Copy count bytes from srcaddr to dstaddr. Don't do overlaps. ! Also handles copying words to or from extended memory. .define _raw_copy _raw_copy: push bp mov bp, sp push si push di ! Save C variable registers copy: cmp 14(bp), #0 jnz bigcopy mov cx, 12(bp) jcxz copydone ! Count is zero, end copy cmp cx, #0xFFF0 jb smallcopy bigcopy:mov cx, #0xFFF0 ! Don't copy more than about 64K at once smallcopy: push cx ! Save copying count mov ax, 4(bp) mov dx, 6(bp) cmp dx, #0x0010 ! Copy to extended memory? jae ext_copy cmp 10(bp), #0x0010 ! Copy from extended memory? jae ext_copy call abs2seg mov di, ax mov es, dx ! es:di = dstaddr mov ax, 8(bp) mov dx, 10(bp) call abs2seg mov si, ax mov ds, dx ! ds:si = srcaddr shr cx, #1 ! Words to move rep movs ! Do the word copy adc cx, cx ! One more byte? rep movsb ! Do the byte copy mov ax, ss ! Restore ds and es from the remaining ss mov ds, ax mov es, ax jmp copyadjust ext_copy: mov x_dst_desc+2, ax movb x_dst_desc+4, dl ! Set base of destination segment mov ax, 8(bp) mov dx, 10(bp) mov x_src_desc+2, ax movb x_src_desc+4, dl ! Set base of source segment mov si, #x_gdt ! es:si = global descriptor table shr cx, #1 ! Words to move movb ah, #0x87 ! Code for extended memory move int 0x15 copyadjust: pop cx ! Restore count add 4(bp), cx a&&&&&&&&&&&&&&&&&&&&&&&&&&&&dc 6(bp), #0 ! srcaddr += copycount add 8(bp), cx adc 10(bp), #0 ! dstaddr += copycount sub 12(bp), cx sbb 14(bp), #0 ! count -= copycount jmp copy ! and repeat copydone: pop di pop si ! Restore C variable registers pop bp ret ! u16_t get_word(u32_t addr); ! void put_word(u32_t addr, u16_t word); ! Read or write a 16 bits word at an arbitrary location. .define _get_word, _put_word _get_word: mov bx, sp call gp_getaddr mov ax, (bx) ! Word to get from addr jmp gp_ret _put_word: mov bx, sp push 6(bx) ! Word to store at addr call gp_getaddr pop (bx) ! Store the word jmp gp_ret gp_getaddr: mov ax, 2(bx) mov dx, 4(bx) call abs2seg mov bx, ax mov ds, dx ! ds:bx = addr ret gp_ret: push es pop ds ! Restore ds ret ! void relocate(void); ! After the program has copied itself to a safer place, it needs to change ! the segment registers. Caddr has already been set to the new location. .define _relocate _relocate: pop bx ! Return address mov ax, _caddr+0 mov dx, _caddr+2 call abs2seg mov cx, dx ! cx = new code segment mov ax, cs ! Old code segment sub ax, cx ! ax = -(new - old) = -Moving offset mov dx, ds sub dx, ax mov ds, dx ! ds += (new - old) mov es, dx mov ss, dx xor ax, ax call seg2abs mov _daddr+0, ax mov _daddr+2, dx ! New data address push cx ! New text segment push bx ! Return offset of this function retf ! Relocate ! void *brk(void *addr) ! void *sbrk(size_t incr) ! Cannot fail implementations of brk(2) and sbrk(3), so we can use ! malloc(3). They reboot on stack collision instead of returning -1. .data .align 2 break: .data2 _end ! A fake heap pointer .text .define _brk, __brk, _sbrk, __sbrk _brk: __brk: ! __brk is for the standard C compiler xor ax, ax jmp sbrk ! break= 0; return sbrk(addr); _sbrk: __sbrk: mov ax, break ! ax= current break sbrk: push ax ! save it as future return value mov bx, sp ! Stack is now: (retval, retaddr, incr, ...) add ax, 4(bx) ! ax= break + increment mov break, ax ! Set new break lea dx, -1024(bx) ! sp minus a bit of breathing space cmp dx, ax ! Compare with the new break jb heaperr ! Suffocating noises lea dx, -4096(bx) ! A warning when heap+stack goes < 4K cmp dx, ax jae plenty ! No reason to complain mov ax, #memwarn push ax call _printf ! Warn about memory running low pop ax movb memwarn, #0 ! No more warnings plenty: pop ax ! Return old break (0 for brk) ret heaperr:mov ax, #chmem push ax mov ax, #nomem push ax call _printf jmp quit .data nomem: .ascii "\nOut of%s\0" memwarn:.ascii "\nLow on" chmem: .ascii " memory, use chmem to increase the heap\n\0" .text ! int dev_open(void); ! Given the device "_device" figure out if it exists and what its number ! of heads and sectors may be. Return the BIOS error code on error, ! otherwise 0. .define _dev_open _dev_open: push es push di ! Save registers used by BIOS calls movb dl, _device ! The default device cmpb dl, #0x80 ! Floppy < 0x80, winchester >= 0x80 jae winchester floppy: mov di, #3 ! Three tries to init drive by reading sector 0 finit0: xor ax, ax mov es, ax mov bx, #BUFFER ! es:bx = scratch buffer mov ax, #0x0201 ! Read sector, #sectors = 1 mov cx, #0x0001 ! Track 0, first sector xorb dh, dh ! Drive dl, head 0 int 0x13 jnc finit0ok ! Sector 0 read ok? cmpb ah, #0x80 ! Disk timed out? (Floppy drive empty) je geoerr dec di jz geoerr xorb ah, ah ! Reset drive int 0x13 jc geoerr jmp finit0 ! Retry once more, it may need to spin up finit0ok: mov di, #seclist ! List of per floppy type sectors/track flast: movb cl, (di) ! Sectors per track to test cmpb cl, #9 ! No need to do the last 720K/360K test je ftestok xor ax, ax mov es, ax mov bx, #BUFFER ! es:bx = scratch buffer mov ax, #0x0201 ! Read sector, #sectors = 1 xorb ch, ch ! Track 0, last sector xorb dh, dh ! Drive dl, head 0 int 0x13 jnc ftestok ! Sector cl read ok? xorb ah, ah ! Reset drive int 0x13 jc geoerr inc di ! Try next sec/track number jmp flast ftestok: movb dh, #2 ! Floppies have two sides jmp geoboth winchester: movb ah, #0x08 ! Code for drive parameters int 0x13 ! dl still contains drive jc geoerr ! No such drive? andb cl, #0x3F ! cl = max sector number (1-origin) incb dh ! dh = 1 + max head number (0-origin) geoboth: movb sectors, cl ! Sectors per track movb al, cl ! al = sectors per track mulb dh ! ax = heads * sectors mov secspcyl, ax ! Sectors per cylinder = heads * sectors xor ax, ax ! Code for success geodone: pop di pop es ! Restore di and es registers ret geoerr: movb al, ah xorb ah, ah ! ax = BIOS error code jmp geodone .data seclist: .data1 18, 15, 9 ! 1.44M, 1.2M, and 360K/720K floppy sec/track .text ! int dev_close(void); ! Close the current device. Under the BIOS this does nothing. .define _dev_close _dev_close: xor ax, ax ret ! int dev_boundary(u32_t sector); ! True if a sector is on a boundary, i.e. sector % sectors == 0. .define _dev_boundary _dev_boundary: mov bx, sp xor dx, dx mov ax, 4(bx) ! divide high half of sector number div sectors mov ax, 2(bx) ! divide low half of sector number div sectors ! dx = sector % sectors sub dx, #1 ! CF = dx == 0 sbb ax, ax ! ax = -CF neg ax ! ax = (sector % sectors) == 0 ret ! int readsectors(u32_t bufaddr, u32_t sector, u8_t count) ! int writesectors(u32_t bufaddr, u32_t sector, u8_t count) ! Read/write several sectors from/to disk or floppy. The buffer must ! be between 64K boundaries! Count must fit in a byte. The external ! variables _device, sectors and secspcyl describe the disk and its ! geometry. Returns 0 for success, otherwise the BIOS error code. ! .define _readsectors, _writesectors _writesectors: push bp mov bp, sp movb 13(bp), #0x03 ! Code for a disk write jmp rwsec _readsectors: push bp mov bp, sp movb 13(bp), #0x02 ! Code for a disk read rwsec: push si push di push es mov ax, 4(bp) mov dx, 6(bp) call abs2seg mov bx, ax mov es, dx ! es:bx = bufaddr mov di, #3 ! Execute 3 resets on floppy error cmpb _device, #0x80 jb nohd mov di, #1 ! But only 1 reset on hard disk error nohd: cmpb 12(bp), #0 ! count equals zero? jz done more: mov ax, 8(bp) mov dx, 10(bp) ! dx:ax = abs sector. Divide it by sectors/cyl cmp dx, #[1024*255*63-255]>>16 ! Near 8G limit? jae bigdisk div secspcyl ! ax = cylinder, dx = sector within cylinder xchg ax, dx ! ax = sector within cylinder, dx = cylinder movb ch, dl ! ch = low 8 bits of cylinder divb sectors ! al = head, ah = sector (0-origin) xorb dl, dl ! About to shift bits 8-9 of cylinder into dl shr dx, #1 shr dx, #1 ! dl[6..7] = high cylinder orb dl, ah ! dl[0..5] = sector (0-origin) movb cl, dl ! cl[0..5] = sector, cl[6..7] = high cyl incb cl ! cl[0..5] = sector (1-origin) movb dh, al ! dh = head movb dl, _device ! dl = device to use movb al, sectors ! Sectors per track - Sector number (0-origin) subb al, ah ! = Sectors left on this track cmpb al, 12(bp) ! Compare with # sectors to transfer jbe doit ! Can't go past the end of a cylinder? movb al, 12(bp) ! 12(bp) < sectors left on this track doit: movb ah, 13(bp) ! Code for disk read (0x02) or write (0x03) push ax ! Save al = sectors to read int 0x13 ! call the BIOS to do the transfer pop cx ! Restore al in cl jmp rdeval bigdisk: mov si, #ext_rw ! si = extended read/write parameter packet movb cl, 12(bp) movb 2(si), cl ! Fill in # blocks to transfer mov 4(si), bx ! Buffer address = es:bx mov 6(si), es mov 8(si), ax ! Starting block number = dx:ax mov 10(si), dx movb dl, _device ! dl = device to use movb ah, 13(bp) ! Code for disk read (0x02) or write (0x03) orb ah, #0x40 ! Extended read (0x42) or write (0x43) int 0x13 !jmp rdeval rdeval: jc ioerr ! I/O error movb al, cl ! Restore al = sectors read addb bh, al ! bx += 2 * al * 256 (add bytes transferred) addb bh, al ! es:bx = where next sector is located add 8(bp), ax ! Update address by sectors transferred adc 10(bp), #0 ! Don't forget high word subb 12(bp), al ! Decrement sector count by sectors transferred jnz more ! Not all sectors have been transferred done: xorb ah, ah ! No error here! jmp finish ioerr: cmpb ah, #0x80 ! Disk timed out? (Floppy drive empty) je finish cmpb ah, #0x03 ! Disk write protected? je finish dec di ! Do we allow another reset? jl finish ! No, report the error xorb ah, ah ! Code for a reset (0) int 0x13 jnc more ! Succesful reset, try request again finish: movb al, ah xorb ah, ah ! ax = error number pop es pop di pop si pop bp ret .data .align 4 ! Extended read/write commands require a parameter packet. ext_rw: .data1 0x10 ! Length of extended r/w packet .data1 0 ! Reserved .data2 0 ! Blocks to transfer (to be filled in) .data2 0 ! Buffer address offset (tbfi) .data2 0 ! Buffer address segment (tbfi) .data4 0 ! Starting block number low 32 bits (tbfi) .data4 0 ! Starting block number high 32 bits .text ! int getch(void); ! Read a character from the keyboard, and check for an expired timer. ! A carriage return is changed into a linefeed for UNIX compatibility. .define _getch _getch: xor ax, ax xchg ax, unchar ! Ungotten character? test ax, ax jnz gotch getch: hlt ! Play dead until interrupted (see pause()) movb ah, #0x01 ! Keyboard status int 0x16 jnz press ! Keypress? call _expired ! Timer expired? test ax, ax jz getch mov ax, #ESC ! Return ESC ret press: xorb ah, ah ! Read character from keyboard int 0x16 cmpb al, #0x0D ! Carriage return? jnz nocr movb al, #0x0A ! Change to linefeed nocr: cmpb al, #ESC ! Escape typed? jne noesc inc escape ! Set flag noesc: xorb ah, ah ! ax = al gotch: ret ! int ungetch(void); ! Return a character to undo a getch(). .define _ungetch _ungetch: mov bx, sp mov ax, 2(bx) mov unchar, ax ret ! int escape(void); ! True if ESC has been typed. .define _escape _escape: movb ah, #0x01 ! Keyboard status int 0x16 jz escflg ! Keypress? cmpb al, #ESC ! Escape typed? jne escflg xorb ah, ah ! Discard the escape int 0x16 inc escape ! Set flag escflg: xor ax, ax xchg ax, escape ! Escape typed flag ret ! int putch(int c); ! Write a character in teletype mode. The putk synonym is ! for the kernel printf function that uses it. ! Newlines are automatically preceded by a carriage return. ! .define _putch, _putk _putch: _putk: mov bx, sp movb al, 2(bx) ! al = character to be printed testb al, al ! Kernel printf adds a null char to flush queue jz nulch cmpb al, #0x0A ! al = newline? jnz putc movb al, #0x0D call putc ! putc('\r') movb al, #0x0A ! Restore the '\n' and print it putc: movb ah, #0x0E ! Print character in teletype mode mov bx, #0x0001 ! Page 0, foreground color int 0x10 ! Call BIOS VIDEO_IO nulch: ret ! void pause(void); ! Wait for an interrupt using the HLT instruction. This either saves ! power, or tells an x86 emulator that nothing is happening right now. .define _pause _pause: hlt ret ! void set_mode(unsigned mode); ! void clear_screen(void); ! Set video mode / clear the screen. .define _set_mode, _clear_screen _set_mode: mov bx, sp mov ax, 2(bx) ! Video mode cmp ax, cur_vid_mode je modeok ! Mode already as requested? mov cur_vid_mode, ax _clear_screen: mov ax, cur_vid_mode andb ah, #0x7F ! Test bits 8-14, clear bit 15 (8x8 flag) jnz xvesa ! VESA extended mode? int 0x10 ! Reset video (ah = 0) jmp mdset xvesa: mov bx, ax ! bx = extended mode mov ax, #0x4F02 ! Reset video int 0x10 mdset: testb cur_vid_mode+1, #0x80 jz setcur ! 8x8 font requested? mov ax, #0x1112 ! Load ROM 8 by 8 double-dot patterns xorb bl, bl ! Load block 0 int 0x10 setcur: xor dx, dx ! dl = column = 0, dh = row = 0 xorb bh, bh ! Page 0 movb ah, #0x02 ! Set cursor position int 0x10 modeok: ret restore_video: ! To restore the video mode on exit mov ax, old_vid_mode push ax call _set_mode pop ax ret ! u32_t get_tick(void); ! Return the current value of the clock tick counter. This counter ! increments 18.2 times per second. Poll it to do delays. Does not ! work on the original PC, but works on the PC/XT. .define _get_tick _get_tick: xorb ah, ah ! Code for get tick count int 0x1A mov ax, dx mov dx, cx ! dx:ax = cx:dx = tick count ret ! Functions used to obtain info about the hardware. Boot uses this information ! itself, but will also pass them on to a pure 386 kernel, because one can't ! make BIOS calls from protected mode. The video type could probably be ! determined by the kernel too by looking at the hardware, but there is a small ! chance on errors that the monitor allows you to correct by setting variables. .define _get_bus ! returns type of system bus .define _get_video ! returns type of display ! u16_t get_bus(void) ! Return type of system bus, in order: XT, AT, MCA. _get_bus: call _getprocessor xor dx, dx ! Assume XT cmp ax, #286 ! An AT has at least a 286 jb got_bus inc dx ! Assume AT movb ah, #0xC0 ! Code for get configuration int 0x15 jc got_bus ! Carry clear and ah = 00 if supported testb ah, ah jne got_bus eseg movb al, 5(bx) ! Load feature byte #1 inc dx ! Assume MCA testb al, #0x02 ! Test bit 1 - "bus is Micro Channel" jnz got_bus dec dx ! Assume AT testb al, #0x40 ! Test bit 6 - "2nd 8259 installed" jnz got_bus dec dx ! It is an XT got_bus: push ds pop es ! Restore es mov ax, dx ! Return bus code mov bus, ax ! Keep bus code, A20 handler likes to know ret ! u16_t get_video(void) ! Return type of display, in order: MDA, CGA, mono EGA, color EGA, ! mono VGA, color VGA. _get_video: mov ax, #0x1A00 ! Function 1A returns display code int 0x10 ! al = 1A if supported cmpb al, #0x1A jnz no_dc ! No display code function supported mov ax, #2 cmpb bl, #5 ! Is it a monochrome EGA? jz got_video inc ax cmpb bl, #4 ! Is it a color EGA? jz got_video inc ax cmpb bl, #7 ! Is it a monochrome VGA? jz got_video inc ax cmpb bl, #8 ! Is it a color VGA? jz got_video no_dc: movb ah, #0x12 ! Get information about the EGA movb bl, #0x10 int 0x10 cmpb bl, #0x10 ! Did it come back as 0x10? (No EGA) jz no_ega mov ax, #2 cmpb bh, #1 ! Is it monochrome? jz got_video inc ax jmp got_video no_ega: int 0x11 ! Get bit pattern for equipment and ax, #0x30 ! Isolate color/mono field sub ax, #0x30 jz got_video ! Is it an MDA? mov ax, #1 ! No it's CGA got_video: ret ! Functions to leave the boot monitor. .define _bootstrap ! Call another bootstrap .define _minix ! Call Minix ! void _bootstrap(int device, struct part_entry *entry) ! Call another bootstrap routine to boot MS-DOS for instance. (No real ! need for that anymore, now that you can format floppies under Minix). ! The bootstrap must have been loaded at BOOTSEG from "device". _bootstrap: call restore_video mov bx, sp movb dl, 2(bx) ! Device to boot from mov si, 4(bx) ! ds:si = partition table entry xor ax, ax mov es, ax ! Vector segment mov di, #BUFFER ! es:di = buffer in low core mov cx, #PENTRYSIZE ! cx = size of partition table entry rep movsb ! Copy the entry to low core mov si, #BUFFER ! es:si = partition table entry mov ds, ax ! Some bootstraps need zero segment registers cli mov ss, ax mov sp, #BOOTOFF ! This should do it sti jmpf BOOTOFF, 0 ! Back to where the BIOS loads the boot code ! void minix(u32_t koff, u32_t kcs, u32_t kds, ! char *bootparams, size_t paramsize, u32_t aout); ! Call Minix. _minix: push bp mov bp, sp ! Pointer to arguments mov dx, #0x03F2 ! Floppy motor drive control bits movb al, #0x0C ! Bits 4-7 for floppy 0-3 are off outb dx ! Kill the motors push ds xor ax, ax ! Vector & BIOS data segments mov ds, ax andb 0x043F, #0xF0 ! Clear diskette motor status bits of BIOS pop ds cli ! No more interruptions test _k_flags, #K_I386 ! Switch to 386 mode? jnz minix386 ! Call Minix in real mode. minix86: test _k_flags, #K_MEML ! New memory arrangements? jz 0f push 22(bp) ! Address of a.out headers push 20(bp) 0: push 18(bp) ! # bytes of boot parameters push 16(bp) ! Address of boot parameters test _k_flags, #K_RET ! Can the kernel return? jz noret86 mov dx, cs ! Monitor far return address mov ax, #ret86 cmp _mem+14, #0 ! Any extended memory? (mem[1].size > 0 ?) jnz 0f xor dx, dx ! If no ext mem then monitor not preserved xor ax, ax 0: push dx ! Push monitor far return address or zero push ax noret86: mov ax, 8(bp) mov dx, 10(bp) call abs2seg push dx ! Kernel code segment push 4(bp) ! Kernel code offset mov ax, 12(bp) mov dx, 14(bp) call abs2seg mov ds, dx ! Kernel data segment mov es, dx ! Set es to kernel data too retf ! Make a far call to the kernel ! Call Minix in 386 mode. minix386: cseg mov cs_real-2, cs ! Patch CS and DS into the instructions that cseg mov ds_real-2, ds ! reload them when switching back to real mode .data1 0x0F,0x20,0xC0 ! mov eax, cr0 orb al, #0x01 ! Set PE (protection enable) bit .data1 o32 mov msw, ax ! Save as protected mode machine status word mov dx, ds ! Monitor ds mov ax, #p_gdt ! dx:ax = Global descriptor table call seg2abs mov p_gdt_desc+2, ax movb p_gdt_desc+4, dl ! Set base of global descriptor table mov ax, 12(bp) mov dx, 14(bp) ! Kernel ds (absolute address) mov p_ds_desc+2, ax movb p_ds_desc+4, dl ! Set base of kernel data segment mov dx, ss ! Monitor ss xor ax, ax ! dx:ax = Monitor stack segment call seg2abs ! Minix starts with the stack of the monitor mov p_ss_desc+2, ax movb p_ss_desc+4, dl mov ax, 8(bp) mov dx, 10(bp) ! Kernel cs (absolute address) mov p_cs_desc+2, ax movb p_cs_desc+4, dl mov dx, cs ! Monitor cs xor ax, ax ! dx:ax = Monitor code segment call seg2abs mov p_mcs_desc+2, ax movb p_mcs_desc+4, dl push #MCS_SELECTOR test _k_flags, #K_INT86 ! Generic INT86 support? jz 0f push #int86 ! Far address to INT86 support jmp 1f 0: push #bios13 ! Far address to BIOS int 13 support 1: test _k_flags, #K_MEML ! New memory arrangements? jz 0f .data1 o32 push 20(bp) ! Address of a.out headers 0: push #0 push 18(bp) ! 32 bit size of parameters on stack push #0 push 16(bp) ! 32 bit address of parameters (ss relative) test _k_flags, #K_RET ! Can the kernel return? jz noret386 push #MCS_SELECTOR push #ret386 ! Monitor far return address noret386: push #0 push #CS_SELECTOR push 6(bp) push 4(bp) ! 32 bit far address to kernel entry point call real2prot ! Switch to protected mode mov ax, #DS_SELECTOR ! Kernel data mov ds, ax mov ax, #ES_SELECTOR ! Flat 4 Gb mov es, ax .data1 o32 ! Make a far call to the kernel retf ! Minix-86 returns here on a halt or reboot. ret86: mov _reboot_code+0, ax mov _reboot_code+2, dx ! Return value (obsolete method) jmp return ! Minix-386 returns here on a halt or reboot. ret386: .data1 o32 mov _reboot_code, ax ! Return value (obsolete method) call prot2real ! Switch to real mode return: mov sp, bp ! Pop parameters sti ! Can take interrupts again call _get_video ! MDA, CGA, EGA, ... movb dh, #24 ! dh = row 24 cmp ax, #2 ! At least EGA? jb is25 ! Otherwise 25 rows push ds xor ax, ax ! Vector & BIOS data segments mov ds, ax movb dh, 0x0484 ! Number of rows on display minus one pop ds is25: xorb dl, dl ! dl = column 0 xorb bh, bh ! Page 0 movb ah, #0x02 ! Set cursor position int 0x10 xorb ah, ah ! Whack the disk system, Minix may have messed movb dl, #0x80 ! it up int 0x13 call _getprocessor cmp ax, #286 jb noclock xorb al, al tryclk: decb al jz noclock movb ah, #0x02 ! Get real-time clock time (from CMOS clock) int 0x1A jc tryclk ! Carry set, not running or being updated movb al, ch ! ch = hour in BCD call bcd ! al = (al >> 4) * 10 + (al & 0x0F) mulb c60 ! 60 minutes in an hour mov bx, ax ! bx = hour * 60 movb al, cl ! cl = minutes in BCD call bcd add bx, ax ! bx = hour * 60 + minutes movb al, dh ! dh = seconds in BCD call bcd xchg ax, bx ! ax = hour * 60 + minutes, bx = seconds mul c60 ! dx-ax = (hour * 60 + minutes) * 60 add bx, ax adc dx, #0 ! dx-bx = seconds since midnight mov ax, dx mul c19663 xchg ax, bx mul c19663 add dx, bx ! dx-ax = dx-bx * (0x1800B0 / (2*2*2*2*5)) mov cx, ax ! (0x1800B0 = ticks per day of BIOS clock) mov ax, dx xor dx, dx div c1080 xchg ax, cx div c1080 ! cx-ax = dx-ax / (24*60*60 / (2*2*2*2*5)) mov dx, ax ! cx-dx = ticks since midnight movb ah, #0x01 ! Set system time int 0x1A noclock: pop bp ret ! Return to monitor as if nothing much happened ! Transform BCD number in al to a regular value in ax. bcd: movb ah, al shrb ah, #4 andb al, #0x0F .data1 0xD5,10 ! aad ! ax = (al >> 4) * 10 + (al & 0x0F) ret ! (BUG: assembler messes up aad & aam!) ! Support function for Minix-386 to make a BIOS int 13 call (disk I/O). bios13: mov bp, sp call prot2real sti ! Enable interrupts mov ax, 8(bp) ! Load parameters mov bx, 10(bp) mov cx, 12(bp) mov dx, 14(bp) mov es, 16(bp) int 0x13 ! Make the BIOS call mov 8(bp), ax ! Save results mov 10(bp), bx mov 12(bp), cx mov 14(bp), dx mov 16(bp), es cli ! Disable interrupts call real2prot mov ax, #DS_SELECTOR ! Kernel data mov ds, ax .data1 o32 retf ! Return to the kernel ! Support function for Minix-386 to make an 8086 interrupt call. int86: mov bp, sp call prot2real .data1 o32 xor ax, ax mov es, ax ! Vector & BIOS data segments .data1 o32 eseg mov 0x046C, ax ! Clear BIOS clock tick counter sti ! Enable interrupts movb al, #0xCD ! INT instruction movb ah, 8(bp) ! Interrupt number? testb ah, ah jnz 0f ! Nonzero if INT, otherwise far call push cs push #intret+2 ! Far return address .data1 o32 push 12(bp) ! Far driver address mov ax, #0x90CB ! RETF; NOP 0: cseg mov intret, ax ! Patch `INT n' or `RETF; NOP' into code jmp .+2 ! Clear instruction queue mov ds, 16(bp) ! Load parameters mov es, 18(bp) .data1 o32 mov ax, 20(bp) .data1 o32 mov bx, 24(bp) .data1 o32 mov cx, 28(bp) .data1 o32 mov dx, 32(bp) .data1 o32 mov si, 36(bp) .data1 o32 mov di, 40(bp) .data1 o32 mov bp, 44(bp) intret: int 0xFF ! Do the interrupt or far call .data1 o32 ! Save results push bp .data1 o32 pushf mov bp, sp .data1 o32 pop 8+8(bp) ! eflags mov 8+16(bp), ds mov 8+18(bp), es .data1 o32 mov 8+20(bp), ax .data1 o32 mov 8+24(bp), bx .data1 o32 mov 8+28(bp), cx .data1 o32 mov 8+32(bp), dx .data1 o32 mov 8+36(bp), si .data1 o32 mov 8+40(bp), di .data1 o32 pop 8+44(bp) ! ebp cli ! Disable interrupts xor ax, ax mov ds, ax ! Vector & BIOS data segments .data1 o32 mov cx, 0x046C ! Collect lost clock ticks in ecx mov ax, ss mov ds, ax ! Restore monitor ds call real2prot mov ax, #DS_SELECTOR ! Kernel data mov ds, ax .data1 o32 retf ! Return to the kernel ! Switch from real to protected mode. real2prot: movb ah, #0x02 ! Code for A20 enable call gate_A20 lgdt p_gdt_desc ! Global descriptor table .data1 o32 mov ax, pdbr ! Load page directory base register .data1 0x0F,0x22,0xD8 ! mov cr3, eax .data1 0x0F,0x20,0xC0 ! mov eax, cr0 .data1 o32 xchg ax, msw ! Exchange real mode msw for protected mode msw .data1 0x0F,0x22,0xC0 ! mov cr0, eax jmpf cs_prot, MCS_SELECTOR ! Set code segment selector cs_prot: mov ax, #SS_SELECTOR ! Set data selectors mov ds, ax mov es, ax mov ss, ax ret ! Switch from protected to real mode. prot2real: lidt p_idt_desc ! Real mode interrupt vectors .data1 0x0F,0x20,0xD8 ! mov eax, cr3 .data1 o32 mov pdbr, ax ! Save page directory base register .data1 0x0F,0x20,0xC0 ! mov eax, cr0 .data1 o32 xchg ax, msw ! Exchange protected mode msw for real mode msw .data1 0x0F,0x22,0xC0 ! mov cr0, eax jmpf cs_real, 0xDEAD ! Reload cs register cs_real: mov ax, #0xBEEF ds_real: mov ds, ax ! Reload data segment registers mov es, ax mov ss, ax xorb ah, ah ! Code for A20 disable !jmp gate_A20 ! Enable (ah = 0x02) or disable (ah = 0x00) the A20 address line. gate_A20: cmp bus, #2 ! PS/2 bus? je gate_PS_A20 call kb_wait movb al, #0xD1 ! Tell keyboard that a command is coming outb 0x64 call kb_wait movb al, #0xDD ! 0xDD = A20 disable code if ah = 0x00 orb al, ah ! 0xDF = A20 enable code if ah = 0x02 outb 0x60 call kb_wait movb al, #0xFF ! Pulse output port outb 0x64 call kb_wait ! Wait for the A20 line to settle down ret kb_wait: inb 0x64 testb al, #0x02 ! Keyboard input buffer full? jnz kb_wait ! If so, wait ret gate_PS_A20: ! The PS/2 can twiddle A20 using port A inb 0x92 ! Read port A andb al, #0xFD orb al, ah ! Set A20 bit to the required state outb 0x92 ! Write port A jmp .+2 ! Small delay A20ok: inb 0x92 ! Check port A andb al, #0x02 cmpb al, ah ! A20 line settled down to the new state? jne A20ok ! If not then wait ret .data .ascii "(null)\0" ! Just in case someone follows a null pointer .align 2 c60: .data2 60 ! Constants for MUL and DIV c1024: .data2 1024 c1080: .data2 1080 c19663: .data2 19663 ! Global descriptor tables. UNSET = 0 ! Must be computed ! For "Extended Memory Block Move". x_gdt: x_null_desc: ! Null descriptor .data2 0x0000, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 x_gdt_desc: ! Descriptor for this descriptor table .data2 6*8-1, UNSET .data1 UNSET, 0x00, 0x00, 0x00 x_src_desc: ! Source segment descriptor .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 x_dst_desc: ! Destination segment descriptor .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 x_bios_desc: ! BIOS segment descriptor (scratch for int 0x15) .data2 UNSET, UNSET .data1 UNSET, UNSET, UNSET, UNSET x_ss_desc: ! BIOS stack segment descriptor (scratch for int 0x15) .data2 UNSET, UNSET .data1 UNSET, UNSET, UNSET, UNSET ! Protected mode descriptor table. p_gdt: p_null_desc: ! Null descriptor .data2 0x0000, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 p_gdt_desc: ! Descriptor for this descriptor table .data2 8*8-1, UNSET .data1 UNSET, 0x00, 0x00, 0x00 p_idt_desc: ! Real mode interrupt descriptor table descriptor .data2 0x03FF, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 p_ds_desc: ! Kernel data segment descriptor (4 Gb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0xCF, 0x00 p_es_desc: ! Physical memory descriptor (4 Gb flat) .data2 0xFFFF, 0x0000 .data1 0x00, 0x92, 0xCF, 0x00 p_ss_desc: ! Monitor data segment descriptor (64 kb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 p_cs_desc: ! Kernel code segment descriptor (4 Gb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x9A, 0xCF, 0x00 p_mcs_desc: ! Monitor code segment descriptor (64 kb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x9A, 0x00, 0x00 .bss .comm old_vid_mode, 2 ! Video mode at startup .comm cur_vid_mode, 2 ! Current video mode .comm sectors, 2 ! # sectors of current device .comm secspcyl, 2 ! (Sectors * heads) of current device .comm msw, 4 ! Saved machine status word (cr0) .comm pdbr, 4 ! Saved page directory base register (cr3) .comm escape, 2 ! Escape typed? .comm bus, 2 ! Saved return value of _get_bus .comm unchar, 2 ! Char returned by ungetch(c) /* bootimage.c - Load an image and start it. Author: Kees J. Bot * 19 Jan 1992 */ #define BIOS 1 /* Can only be used under the BIOS. */ #define nil 0 #define _POSIX_SOURCE 1 #define _MINIX 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rawfs.h" #include "image.h" #include "boot.h" #define click_shift clck_shft /* 7 char clash with click_size. */ /* Some kernels have extra features: */ #define K_I386 0x0001 /* Make the 386 transition before you call me. */ #define K_CLAIM 0x0002 /* I will acquire my own bss pages, thank you. */ #define K_CHMEM 0x0004 /* This kernel listens to chmem for its stack size. */ #define K_HIGH 0x0008 /* Load mm, fs, etc. in extended memory. */ #define K_HDR 0x0010 /* No need to patch sizes, kernel uses the headers. */ #define K_RET 0x0020 /* Returns to the monitor on reboot. */ #define K_INT86 0x0040 /* Requires generic INT support. */ #define K_MEML 0x0080 /* Pass a list of free memory. */ #define K_BRET 0x0100 /* New monitor code on shutdown in boot parameters. */ #define K_ALL 0x01FF /* All feature bits this monitor supports. */ /* Data about the different processes. */ #define PROCESS_MAX 16 /* Must match the space in kernel/mpx.x */ #define KERNEL 0 /* The first process is the kernel. */ #define FS 2 /* The third must be fs. */ struct process { /* Per-process memory adresses. */ u32_t entry; /* Entry point. */ u32_t cs; /* Code segment. */ u32_t ds; /* Data segment. */ u32_t data; /* To access the data segment. */ u32_t end; /* End of this process, size = (end - cs). */ } process[PROCESS_MAX]; int n_procs; /* Number of processes. */ /* Magic numbers in process' data space. */ #define MAGIC_OFF 0 /* Offset of magic # in data seg. */ #define CLICK_OFF 2 /* Offset in kernel text to click_shift. */ #define FLAGS_OFF 4 /* Offset in kernel text to flags. */ #define KERNEL_D_MAGIC 0x526F /* Kernel magic number. */ /* Offsets of sizes to be patched into kernel and fs. */ #define P_SIZ_OFF 0 /* Process' sizes into kernel data. */ #define P_INIT_OFF 4 /* Init cs & sizes into fs data. */ #define between(a, c, z) ((unsigned) ((c) - (a)) <= ((z) - (a))) void pretty_image(char *image) /* Pretty print the name of the image to load. Translate '/' and '_' to * space, first letter goes uppercase. An 'r' before a digit prints as * 'revision'. E.g. 'minix/1.6.16r10' -> 'Minix 1.6.16 revision 10'. * The idea is that the part before the 'r' is the official Minix release * and after the 'r' you can put version numbers for your own changes. */ { int up= 0, c; while ((c= *image++) != 0) { if (c == '/' || c == '_') c= ' '; if (c == 'r' && between('0', *image, '9')) { printf(" revision "); continue; } if (!up && between('a', c, 'z')) c= c - 'a' + 'A'; if (between('A', c, 'Z')) up= 1; putch(c); } } void raw_clear(u32_t addr, u32_t count) /* Clear "count" bytes at absolute address "addr". */ { static char zeros[128]; u32_t dst; u32_t zct; zct= sizeof(zeros); if (zct > count) zct= count; raw_copy(addr, mon2abs(&zeros), zct); count-= zct; while (count > 0) { dst= addr + zct; if (zct > count) zct= count; raw_copy(dst, addr, zct); count-= zct; zct*= 2; } } /* Align a to a multiple of n (a power of 2): */ #define align(a, n) (((u32_t)(a) + ((u32_t)(n) - 1)) & ~((u32_t)(n) - 1)) unsigned click_shift; unsigned click_size; /* click_size = Smallest kernel memory object. */ unsigned k_flags; /* Not all kernels are created equal. */ u32_t reboot_code; /* Obsolete reboot code return pointer. */ int params2params(char *params, size_t psize) /* Repackage the environment settings for the kernel. */ { size_t i, n; environment *e; char *name, *value; dev_t dev; i= 0; for (e= env; e != nil; e= e->next) { name= e->name; value= e->value; if (!(e->flags & E_VAR)) continue; if (e->flags & E_DEV) { if ((dev= name2dev(value)) == -1) return 0; value= ul2a10((u16_t) dev); } n= i + strlen(name) + 1 + strlen(value) + 1; if (n < psize) { strcpy(params + i, name); strcat(params + i, "="); strcat(params + i, value); } i= n; } if (!(k_flags & K_MEML)) { /* Require old memory size variables. */ value= ul2a10((mem[0].base + mem[0].size) / 1024); n= i + 7 + 1 + strlen(value) + 1; if (n < psize) { strcpy(params + i, "memsize="); strcat(params + i, value); } i= n; value= ul2a10(mem[1].size / 1024); n= i + 7 + 1 + strlen(value) + 1; if (n < psize) { strcpy(params + i, "emssize="); strcat(params + i, value); } i= n; } if (i >= psize) { printf("Too many boot parameters\n"); return 0; } params[i]= 0; /* End marked with empty string. */ return 1; } void patch_sizes(void) /* Patch sizes of each process into kernel data space, kernel ds into kernel * text space, and sizes of init into data space of fs. All the patched * numbers are based on the kernel click size, not hardware segments. */ { u16_t text_size, data_size; int i; struct process *procp, *initp; u32_t doff; if (k_flags & K_HDR) return; /* Uses the headers. */ /* Patch text and data sizes of the processes into kernel data space. */ doff= process[KERNEL].data + P_SIZ_OFF; for (i= 0; i < n_procs; i++) { procp= &process[i]; text_size= (procp->ds - procp->cs) >> click_shift; data_size= (procp->end - procp->ds) >> click_shift; /* Two words per process, the text and data size: */ put_word(doff, text_size); doff+= 2; put_word(doff, data_size); doff+= 2; initp= procp; /* The last process must be init. */ } if (k_flags & (K_HIGH|K_MEML)) return; /* Doesn't need FS patching. */ /* Patch cs and sizes of init into fs data. */ put_word(process[FS].data + P_INIT_OFF+0, initp->cs >> click_shift); put_word(process[FS].data + P_INIT_OFF+2, text_size); put_word(process[FS].data + P_INIT_OFF+4, data_size); } int selected(char *name) /* True iff name has no label or the proper label. */ { char *colon, *label; int cmp; if ((colon= strchr(name, ':')) == nil) return 1; if ((label= b_value("label")) == nil) return 1; *colon= 0; cmp= strcmp(label, name); *colon= ':'; return cmp == 0; } u32_t proc_size(struct image_header *hdr) /* Return the size of a process in sectors as found in an image. */ { u32_t len= hdr->process.a_text; if (hdr->process.a_flags & A_PAL) len+= hdr->process.a_hdrlen; if (hdr->process.a_flags & A_SEP) len= align(len, SECTOR_SIZE); len= align(len + hdr->process.a_data, SECTOR_SIZE); return len >> SECTOR_SHIFT; } off_t image_off, image_size; u32_t (*vir2sec)(u32_t vsec); /* Where is a sector on disk? */ u32_t file_vir2sec(u32_t vsec) /* Translate a virtual sector number to an absolute disk sector. */ { off_t blk; if ((blk= r_vir2abs(vsec / RATIO)) == -1) { errno= EIO; return -1; } return blk == 0 ? 0 : lowsec + blk * RATIO + vsec % RATIO; } u32_t flat_vir2sec(u32_t vsec) /* Simply add an absolute sector offset to vsec. */ { return lowsec + image_off + vsec; } char *get_sector(u32_t vsec) /* Read a sector "vsec" from the image into memory and return its address. * Return nil on error. (This routine tries to read an entire track, so * the next request is usually satisfied from the track buffer.) */ { u32_t sec; int r; static char buf[32 * SECTOR_SIZE]; static size_t count; /* Number of sectors in the buffer. */ static u32_t bufsec; /* First Sector now in the buffer. */ if (vsec == 0) count= 0; /* First sector; initialize. */ if ((sec= (*vir2sec)(vsec)) == -1) return nil; if (sec == 0) { /* A hole. */ count= 0; memset(buf, 0, SECTOR_SIZE); return buf; } /* Can we return a sector from the buffer? */ if ((sec - bufsec) < count) { return buf + ((size_t) (sec - bufsec) << SECTOR_SHIFT); } /* Not in the buffer. */ count= 0; bufsec= sec; /* Read a whole track if possible. */ while (++count < 32 && !dev_boundary(bufsec + count)) {&&&&&&&&&&& vsec++; if ((sec= (*vir2sec)(vsec)) == -1) break; /* Consecutive? */ if (sec != bufsec + count) break; } /* Actually read the sectors. */ if ((r= readsectors(mon2abs(buf), bufsec, count)) != 0) { readerr(bufsec, r); count= 0; errno= 0; return nil; } return buf; } int get_clickshift(u32_t ksec, struct image_header *hdr) /* Get the click shift and special flags from kernel text. */ { char *textp; if ((textp= get_sector(ksec)) == nil) return 0; if (hdr->process.a_flags & A_PAL) textp+= hdr->process.a_hdrlen; click_shift= * (u16_t *) (textp + CLICK_OFF); k_flags= * (u16_t *) (textp + FLAGS_OFF); if ((k_flags & ~K_ALL) != 0) { printf("%s requires features this monitor doesn't offer\n", hdr->name); return 0; } if (click_shift < HCLICK_SHIFT || click_shift > 16) { printf("%s click size is bad\n", hdr->name); errno= 0; return 0; } click_size= 1 << click_shift; return 1; } int get_segment(u32_t *vsec, long *size, u32_t *addr, u32_t limit) /* Read *size bytes starting at virtual sector *vsec to memory at *addr. */ { char *buf; size_t cnt, n; cnt= 0; while (*size > 0) { if (cnt == 0) { if ((buf= get_sector((*vsec)++)) == nil) return 0; cnt= SECTOR_SIZE; } if (*addr + click_size > limit) { errno= ENOMEM; return 0; } n= click_size; if (n > cnt) n= cnt; raw_copy(*addr, mon2abs(buf), n); *addr+= n; *size-= n; buf+= n; cnt-= n; } /* Zero extend to a click. */ n= align(*addr, click_size) - *addr; raw_clear(*addr, n); *addr+= n; *size-= n; return 1; } void exec_image(char *image) /* Get a Minix image into core, patch it up and execute. */ { int i; struct image_header hdr; char *buf; u32_t vsec, addr, limit, aout, n; struct process *procp; /* Process under construction. */ long a_text, a_data, a_bss, a_stack; int banner= 0; long processor= a2l(b_value("processor")); u16_t mode; char *console; char params[SECTOR_SIZE]; extern char *sbrk(int); /* The stack is pretty deep here, so check if heap and stack collide. */ (void) sbrk(0); printf("\nLoading "); pretty_image(image); printf(".\n\n"); vsec= 0; /* Load this sector from image next. */ addr= mem[0].base; /* Into this memory block. */ limit= mem[0].base + mem[0].size; if (limit > caddr) limit= caddr; /* Allocate and clear the area where the headers will be placed. */ aout = (limit -= PROCESS_MAX * A_MINHDR); /* Clear the area where the headers will be placed. */ raw_clear(aout, PROCESS_MAX * A_MINHDR); /* Read the many different processes: */ for (i= 0; vsec < image_size; i++) { if (i == PROCESS_MAX) { printf("There are more then %d programs in %s\n", PROCESS_MAX, image); errno= 0; return; } procp= &process[i]; /* Read header. */ for (;;) { if ((buf= get_sector(vsec++)) == nil) return; memcpy(&hdr, buf, sizeof(hdr)); if (BADMAG(hdr.process)) { errno= ENOEXEC; return; } /* Check the optional label on the process. */ if (selected(hdr.name)) break; /* Bad label, skip this process. */ vsec+= proc_size(&hdr); } /* Sanity check: an 8086 can't run a 386 kernel. */ if (hdr.process.a_cpu == A_I80386 && processor < 386) { printf("You can't run a 386 kernel on this 80%ld\n", processor); errno= 0; return; } /* Get the click shift from the kernel text segment. */ if (i == KERNEL) { if (!get_clickshift(vsec, &hdr)) return; addr= align(addr, click_size); } /* Save a copy of the header for the kernel, with a_syms * misused as the address where the process is loaded at. */ hdr.process.a_syms= addr; raw_copy(aout + i * A_MINHDR, mon2abs(&hdr.process), A_MINHDR); if (!banner) { printf(" cs ds text data bss"); if (k_flags & K_CHMEM) printf(" stack"); putch('\n'); banner= 1; } /* Segment sizes. */ a_text= hdr.process.a_text; a_data= hdr.process.a_data; a_bss= hdr.process.a_bss; if (k_flags & K_CHMEM) { a_stack= hdr.process.a_total - a_data - a_bss; if (!(hdr.process.a_flags & A_SEP)) a_stack-= a_text; } else { a_stack= 0; } /* Collect info about the process to be. */ procp->cs= addr; /* Process may be page aligned so that the text segment contains * the header, or have an unmapped zero page against vaxisms. */ procp->entry= hdr.process.a_entry; if (hdr.process.a_flags & A_PAL) a_text+= hdr.process.a_hdrlen; if (hdr.process.a_flags & A_UZP) procp->cs-= click_size; /* Separate I&D: two segments. Common I&D: only one. */ if (hdr.process.a_flags & A_SEP) { /* Read the text segment. */ if (!get_segment(&vsec, &a_text, &addr, limit)) return; /* The data segment follows. */ procp->ds= addr; if (hdr.process.a_flags & A_UZP) procp->ds-= click_size; procp->data= addr; } else { /* Add text to data to form one segment. */ procp->data= addr + a_text; procp->ds= procp->cs; a_data+= a_text; } printf("%06lx %06lx %7ld %7ld %7ld", procp->cs, procp->ds, hdr.process.a_text, hdr.process.a_data, hdr.process.a_bss ); if (k_flags & K_CHMEM) printf(" %8ld", a_stack); printf(" %s\n", hdr.name); /* Read the data segment. */ if (!get_segment(&vsec, &a_data, &addr, limit)) return; /* Make space for bss and stack unless... */ if (i != KERNEL && (k_flags & K_CLAIM)) a_bss= a_stack= 0; /* Note that a_data may be negative now, but we can look at it * as -a_data bss bytes. */ /* Compute the number of bss clicks left. */ a_bss+= a_data; n= align(a_bss, click_size); a_bss-= n; /* Zero out bss. */ if (addr + n > limit) { errno= ENOMEM; return; } raw_clear(addr, n); addr+= n; /* And the number of stack clicks. */ a_stack+= a_bss; n= align(a_stack, click_size); a_stack-= n; /* Add space for the stack. */ addr+= n; /* Process endpoint. */ procp->end= addr; if (i == 0 && (k_flags & K_HIGH)) { /* Load the rest in extended memory. */ addr= mem[1].base; limit= mem[1].base + mem[1].size; } } if ((n_procs= i) == 0) { printf("There are no programs in %s\n", image); errno= 0; return; } /* Check the kernel magic number. */ if (get_word(process[KERNEL].data + MAGIC_OFF) != KERNEL_D_MAGIC) { printf("Kernel magic number is incorrect\n"); errno= 0; return; } /* Patch sizes, etc. into kernel data. */ patch_sizes(); #if !DOS if (!(k_flags & K_MEML)) { /* Copy the a.out headers to the old place. */ raw_copy(HEADERPOS, aout, PROCESS_MAX * A_MINHDR); } #endif /* Run the trailer function just before starting Minix. */ if (!run_trailer()) { errno= 0; return; } /* Translate the boot parameters to what Minix likes best. */ if (!params2params(params, sizeof(params))) { errno= 0; return; } /* Set the video to the required mode. */ if ((console= b_value("console")) == nil || (mode= a2x(console)) == 0) { mode= strcmp(b_value("chrome"), "color") == 0 ? COLOR_MODE : MONO_MODE; } set_mode(mode); /* Close the disk. */ (void) dev_close(); /* Minix. */ minix(process[KERNEL].entry, process[KERNEL].cs, process[KERNEL].ds, params, sizeof(params), aout); if (!(k_flags & K_BRET)) { extern u32_t reboot_code; raw_copy(mon2abs(params), reboot_code, sizeof(params)); } parse_code(params); /* Return from Minix; boot file system still around? */ (void) dev_open(); fsok= r_super() != 0; errno= 0; } ino_t latest_version(char *version, struct stat *stp) /* Recursively read the current directory, selecting the newest image on * the way up. (One can't use r_stat while reading a directory.) */ { char name[NAME_MAX + 1]; ino_t ino, newest; time_t mtime; if ((ino= r_readdir(name)) == 0) { stp->st_mtime= 0; return 0; } newest= latest_version(version, stp); mtime= stp->st_mtime; r_stat(ino, stp); if (S_ISREG(stp->st_mode) && stp->st_mtime > mtime) { newest= ino; strcpy(version, name); } else { stp->st_mtime= mtime; } return newest; } char *select_image(char *image) /* Look image up on the filesystem, if it is a file then we're done, but * if its a directory then we want the newest file in that directory. If * it doesn't exist at all, then see if it is 'number:number' and get the * image from that absolute offset off the disk. */ { ino_t image_ino; struct stat st; image= strcpy(malloc((strlen(image) + 1 + NAME_MAX + 1) * sizeof(char)), image); if (!fsok || (image_ino= r_lookup(ROOT_INO, image)) == 0) { char *size; if (numprefix(image, &size) && *size++ == ':' && numeric(size)) { vir2sec= flat_vir2sec; image_off= a2l(image); image_size= a2l(size); strcpy(image, "Minix"); return image; } if (!fsok) printf("No image selected\n"); else printf("Can't load %s: %s\n", image, unix_err(errno)); goto bail_out; } r_stat(image_ino, &st); if (!S_ISREG(st.st_mode)) { char *version= image + strlen(image); char dots[NAME_MAX + 1]; if (!S_ISDIR(st.st_mode)) { printf("%s: %s\n", image, unix_err(ENOTDIR)); goto bail_out; } (void) r_readdir(dots); (void) r_readdir(dots); /* "." & ".." */ *version++= '/'; *version= 0; if ((image_ino= latest_version(version, &st)) == 0) { printf("There are no images in %s\n", image); goto bail_out; } r_stat(image_ino, &st); } vir2sec= file_vir2sec; image_size= (st.st_size + SECTOR_SIZE - 1) >> SECTOR_SHIFT; return image; bail_out: free(image); return nil; } void bootminix(void) /* Load Minix and run it. (Given the size of this program it is surprising * that it ever gets to that.) */ { char *image; if ((image= select_image(b_value("image"))) == nil) return; exec_image(image); switch (errno) { case ENOEXEC: printf("%s contains a bad program header\n", image); break; case ENOMEM: printf("Not enough memory to load %s\n", image); break; case EIO: printf("Unsuspected EOF on %s\n", image); case 0: /* No error or error already reported. */; } free(image); } ! jumpboot 1.0 - Jump to another bootstrap Author: Kees J. Bot ! 14 Apr 1999 ! ! This code may be placed into any free boot sector, like the first sector ! of an extended partition, a file system partition other than the root, ! or even the master bootstrap. It will load and run another bootstrap whose ! disk, partition, and slice number (not necessarily all three) are patched ! into this code by installboot. If the ALT key is held down when this code ! is booted then you can type the disk, partition, and slice numbers manually. ! The manual interface is default if no numbers are patched in by installboot. ! o32 = 0x66 ! This assembler doesn't know 386 extensions LOADOFF = 0x7C00 ! 0x0000:LOADOFF is where this code is loaded BUFFER = 0x0600 ! First free memory PART_TABLE = 446 ! Location of partition table within master PENTRYSIZE = 16 ! Size of one partition table entry MAGIC = 510 ! Location of the AA55 magic number ! : MINIX_PART = 0x81 sysind = 4 lowsec = 8 .text ! Find and load another bootstrap and jump to it. jumpboot: xor ax, ax mov ds, ax mov es, ax cli mov ss, ax ! ds = es = ss = Vector segment mov sp, #LOADOFF sti ! Move this code to safety, then jump to it. mov si, sp ! si = start of this code mov di, #BUFFER ! di = Buffer area mov cx, #512/2 ! One sector cld rep movs jmpf BUFFER+migrate, 0 ! To safety migrate: mov bp, #BUFFER+guide ! Patched guiding characters altkey: movb ah, #0x02 ! Keyboard shift status int 0x16 testb al, #0x08 ! Bit 3 = ALT key jz noalt ! ALT key pressed? again: mov bp, #zero ! Ignore patched stuff noalt: ! Follow guide characters to find the boot partition. call print .ascii "d?\b\0" ! Initial greeting ! Disk number? disk: movb dl, #0x80 - 0x30 ! Prepare to add an ASCII digit call getch ! Get number to tell which disk addb dl, al ! dl = 0x80 + (al - '0') jns n0nboot ! Result should be >= 0x80 mov si, #BUFFER+zero-lowsec ! si = where lowsec(si) is zero cmpb (bp), #0x23 ! Next guide character is '#'? jne notlogical lea si, 1-lowsec(bp) ! Logical sector offset follows '#' notlogical: call load ! Load chosen sector of chosen disk cmpb (bp), #0x23 je boot ! Run bootstrap if a logical is chosen call print ! Intro to partition number .ascii "p?\b\0" part: call getch ! Get character to tell partition call gettable ! Get partition table call sort ! Sort partition table call choose_load ! Compute chosen entry and load cmpb sysind(si), #MINIX_PART ! Minix subpartition table possible? jne waitboot call print ! Intro to slice number .ascii "s?\b\0" slice: call getch ! Get character to tell slice call gettable ! Get partition table call choose_load ! Compute chosen entry and load waitboot: call print ! Intro to nothing .ascii " ?\b\0" call getch ! Supposed to type RETURN now n0nboot:jmp nonboot ! Sorry, can't go further ! Get a character, either the patched-in, or one from the keyboard. getch: movb al, (bp) ! Get patched-in character testb al, al jz getkey inc bp jmp gotkey getkey: xorb ah, ah ! Wait for keypress int 0x16 gotkey: testb dl, dl ! Ignore CR if disk number not yet set jns putch cmpb al, #0x0D ! Carriage return? je boot !jmp putch ! Print a character putch: movb ah, #0x0E ! Print character in teletype mode mov bx, #0x0001 ! Page 0, foreground color int 0x10 ret ! Print a message. print: mov cx, si ! Save si pop si ! si = String following 'call print' prnext: lodsb ! al = *si++ is char to be printed testb al, al ! Null marks end jz prdone call putch jmp prnext prdone: xchg si, cx ! Restore si jmp (cx) ! Continue after the string ! Return typed (or in patched data) means to run the bootstrap now in core! boot: call print ! Make line on screen look proper .ascii "\b \r\n\0" jmp LOADOFF-BUFFER ! Jump to LOADOFF ! Compute address of chosen partition entry from choice al into si, then ! continue to load the boot sector of that partition. choose_load: subb al, #0x30 ! al -= '0' cmpb al, #4 ! Only four partitions ja n0nboot movb ah, #PENTRYSIZE mulb ah ! al *= PENTRYSIZE add ax, #BUFFER+PART_TABLE mov si, ax ! si = &part_table[al - '0'] movb al, sysind(si) ! System indicator testb al, al ! Unused partition? jz n0nboot !jmp load ! Continue to load boot sector ! Load boot sector of the current partition. load: push dx ! Save drive code push es ! Next call sets es movb ah, #0x08 ! Code for drive parameters int 0x13 pop es andb cl, #0x3F ! cl = max sector number (1-origin) incb dh ! dh = 1 + max head number (0-origin) movb al, cl ! al = cl = sectors per track mulb dh ! dh = heads, ax = heads * sectors mov bx, ax ! bx = sectors per cylinder = heads * sectors mov ax, lowsec+0(si) mov dx, lowsec+2(si) ! dx:ax = sector within drive cmp dx, #[1024*255*63-255]>>16 ! Near 8G limit? jae bigdisk div bx ! ax = cylinder, dx = sector within cylinder xchg ax, dx ! ax = sector within cylinder, dx = cylinder movb ch, dl ! ch = low 8 bits of cylinder divb cl ! al = head, ah = sector (0-origin) xorb dl, dl ! About to shift bits 8-9 of cylinder into dl shr dx, #1 shr dx, #1 ! dl[6..7] = high cylinder orb dl, ah ! dl[0..5] = sector (0-origin) movb cl, dl ! cl[0..5] = sector, cl[6..7] = high cyl incb cl ! cl[0..5] = sector (1-origin) pop dx ! Restore drive code in dl movb dh, al ! dh = al = head mov bx, #LOADOFF ! es:bx = where sector is loaded mov ax, #0x0201 ! ah = Code for read / al = one sector int 0x13 jmp rdeval ! Evaluate read result bigdisk: mov bx, dx ! bx:ax = dx:ax = sector to read pop dx ! Restore drive code in dl push si ! Save si mov si, #BUFFER+ext_rw ! si = extended read/write parameter packet mov 8(si), ax ! Starting block number = bx:ax mov 10(si), bx movb ah, #0x42 ! Extended read int 0x13 pop si ! Restore si to point to partition entry !jmp rdeval rdeval: jnc rdok rderr: call print .ascii "\r\nRead error\r\n\0" jmp again rdok: cmp LOADOFF+MAGIC, #0xAA55 je sigok ! Signature ok? nonboot: call print .ascii "\r\nNot bootable\r\n\0" jmp again sigok: ret ! Get the partition table into my space. gettable: mov si, #LOADOFF+PART_TABLE mov di, #BUFFER+PART_TABLE mov cx, #4*PENTRYSIZE/2 rep movs ret ! Sort the partition table. sort: mov cx, #4 ! Four times is enough to sort bubble: mov si, #BUFFER+PART_TABLE ! First table entry bubble1:lea di, PENTRYSIZE(si) ! Next entry cmpb sysind(si), ch ! Partition type, nonzero when in use jz exchg ! Unused entries sort to the end inuse: mov bx, lowsec+0(di) sub bx, lowsec+0(si) ! Compute di->lowsec - si->lowsec mov bx, lowsec+2(di) sbb bx, lowsec+2(si) jae order ! In order if si->lowsec <= di->lowsec exchg: movb bl, (si) xchgb bl, PENTRYSIZE(si) ! Exchange entries byte by byte movb (si), bl inc si cmp si, di jb exchg order: mov si, di cmp si, #BUFFER+PART_TABLE+3*PENTRYSIZE jb bubble1 loop bubble ret .data ! Extended read/write commands require a parameter packet. ext_rw: .data1 0x10 ! Length of extended r/w packet .data1 0 ! Reserved .data2 1 ! Blocks to transfer (just one) .data2 LOADOFF ! Buffer address offset .data2 0 ! Buffer address segment .data4 0 ! Starting block number low 32 bits (tbfi) zero: .data4 0 ! Starting block number high 32 bits .align 2 guide: ! Guide characters and possibly a logical partition number patched here by ! installboot, up to 6 bytes maximum. &/* image.h - Info between installboot and boot. Author: Kees J. Bot */ #define IM_NAME_MAX 63 struct image_header { char name[IM_NAME_MAX + 1]; /* Null terminated. */ struct exec process; }; /* installboot 3.0 - Make a device bootable Author: Kees J. Bot * 21 Dec 1991 * * Either make a device bootable or make an image from kernel, mm, fs, etc. */ #define nil 0 #define _POSIX_SOURCE 1 #define _MINIX 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rawfs.h" #include "image.h" #define BOOTBLOCK 0 /* Of course */ #define SECTOR_SIZE 512 /* Disk sector size. */ #define RATIO (BLOCK_SIZE/SECTOR_SIZE) #define SIGNATURE 0xAA55 /* Boot block signature. */ #define BOOT_MAX 64 /* Absolute maximum size of secondary boot */ #define SIGPOS 510 /* Where to put signature word. */ #define PARTPOS 446 /* Offset to the partition table in a master * boot block. */ #define between(a, c, z) ((unsigned) ((c) - (a)) <= ((z) - (a))) #define control(c) between('\0', (c), '\37') void report(char *label) /* installboot: label: No such file or directory */ { fprintf(stderr, "installboot: %s: %s\n", label, strerror(errno)); } void fatal(char *label) { report(label); exit(1); } char *basename(char *name) /* Return the last component of name, stripping trailing slashes from name. * Precondition: name != "/". If name is prefixed by a label, then the * label is copied to the basename too. */ { static char base[IM_NAME_MAX]; char *p, *bp= base; if ((p= strchr(name, ':')) != nil) { while (name <= p && bp < base + IM_NAME_MAX - 1) *bp++ = *name++; } for (;;) { if ((p= strrchr(name, '/')) == nil) { p= name; break; } if (*++p != 0) break; *--p= 0; } while (*p != 0 && bp < base + IM_NAME_MAX - 1) *bp++ = *p++; *bp= 0; return base; } void bread(FILE *f, char *name, void *buf, size_t len) /* Read len bytes. Don't dare return without them. */ { if (len > 0 && fread(buf, len, 1, f) != 1) { if (ferror(f)) fatal(name); fprintf(stderr, "installboot: Unexpected EOF on %s\n", name); exit(1); } } void bwrite(FILE *f, char *name, void *buf, size_t len) { if (len > 0 && fwrite(buf, len, 1, f) != 1) fatal(name); } long total_text= 0, total_data= 0, total_bss= 0; int making_image= 0; void read_header(int talk, char *proc, FILE *procf, struct image_header *ihdr) /* Read the a.out header of a program and check it. If procf happens to be * nil then the header is already in *image_hdr and need only be checked. */ { int n, big= 0; static int banner= 0; struct exec *phdr= &ihdr->process; if (procf == nil) { /* Header already present. */ n= phdr->a_hdrlen; } else { memset(ihdr, 0, sizeof(*ihdr)); /* Put the basename of proc in the header. */ strncpy(ihdr->name, basename(proc), IM_NAME_MAX); /* Read the header. */ n= fread(phdr, sizeof(char), A_MINHDR, procf); if (ferror(procf)) fatal(proc); } if (n < A_MINHDR || BADMAG(*phdr)) { fprintf(stderr, "installboot: %s is not an executable\n", proc); exit(1); } /* Get the rest of the exec header. */ if (procf != nil) { bread(procf, proc, ((char *) phdr) + A_MINHDR, phdr->a_hdrlen - A_MINHDR); } if (talk && !banner) { printf(" text data bss size\n"); banner= 1; } if (talk) { printf("%8ld%8ld%8ld%9ld %s\n", phdr->a_text, phdr->a_data, phdr->a_bss, phdr->a_text + phdr->a_data + phdr->a_bss, proc); } total_text+= phdr->a_text; total_data+= phdr->a_data; total_bss+= phdr->a_bss; if (phdr->a_cpu == A_I8086) { long data= phdr->a_data + phdr->a_bss; if (!(phdr->a_flags & A_SEP)) data+= phdr->a_text; if (phdr->a_text >= 65536) big|= 1; if (data >= 65536) big|= 2; } if (big) { fprintf(stderr, "%s will crash, %s%s%s segment%s larger then 64K\n", proc, big & 1 ? "text" : "", big == 3 ? " and " : "", big & 2 ? "data" : "", big == 3 ? "s are" : " is"); } } void padimage(char *image, FILE *imagef, int n) /* Add n zeros to image to pad it to a sector boundary. */ { while (n > 0) { if (putc(0, imagef) == EOF) fatal(image); n--; } } #define align(n) (((n) + ((SECTOR_SIZE) - 1)) & ~((SECTOR_SIZE) - 1)) void copyexec(char *proc, FILE *procf, char *image, FILE *imagef, long n) /* Copy n bytes from proc to image padded to fill a sector. */ { int pad, c; /* Compute number of padding bytes. */ pad= align(n) - n; while (n > 0) { if ((c= getc(procf)) == EOF) { if (ferror(procf)) fatal(proc); fprintf(stderr, "installboot: premature EOF on %s\n", proc); exit(1); } if (putc(c, imagef) == EOF) fatal(image); n--; } padimage(image, imagef, pad); } void make_image(char *image, char **procv) /* Collect a set of files in an image, each "segment" is nicely padded out * to SECTOR_SIZE, so it may be read from disk into memory without trickery. */ { FILE *imagef, *procf; char *proc, *file; int procn; struct image_header ihdr; struct exec phdr; struct stat st; making_image= 1; if ((imagef= fopen(image, "w")) == nil) fatal(image); for (procn= 0; (proc= *procv++) != nil; procn++) { /* Remove the label from the file name. */ if ((file= strchr(proc, ':')) != nil) file++; else file= proc; /* Real files please, may need to seek. */ if (stat(file, &st) < 0 || (errno= EISDIR, !S_ISREG(st.st_mode)) || (procf= fopen(file, "r")) == nil ) fatal(proc); /* Read a.out header. */ read_header(1, proc, procf, &ihdr); /* Scratch. */ phdr= ihdr.process; /* The symbol table is always stripped off. */ ihdr.process.a_syms= 0; ihdr.process.a_flags &= ~A_NSYM; /* Write header padded to fill a sector */ bwrite(imagef, image, &ihdr, sizeof(ihdr)); padimage(image, imagef, SECTOR_SIZE - sizeof(ihdr)); /* A page aligned executable needs the header in text. */ if (phdr.a_flags & A_PAL) { rewind(procf); phdr.a_text+= phdr.a_hdrlen; } /* Copy text and data of proc to image. */ if (phdr.a_flags & A_SEP) { /* Separate I&D: pad text & data separately. */ copyexec(proc, procf, image, imagef, phdr.a_text); copyexec(proc, procf, image, imagef, phdr.a_data); } else { /* Common I&D: keep text and data together. */ copyexec(proc, procf, image, imagef, phdr.a_text + phdr.a_data); } /* Done with proc. */ (void) fclose(procf); } /* Done with image. */ if (fclose(imagef) == EOF) fatal(image); printf(" ------ ------ ------ -------\n"); printf("%8ld%8ld%8ld%9ld total\n", total_text, total_data, total_bss, total_text + total_data + total_bss); } void extractexec(FILE *imagef, char *image, FILE *procf, char *proc, long count, off_t *alen) /* Copy a segment of an executable. It is padded to a sector in image. */ { char buf[SECTOR_SIZE]; while (count > 0) { bread(imagef, image, buf, sizeof(buf)); *alen-= sizeof(buf); bwrite(procf, proc, buf, count < sizeof(buf) ? (size_t) count : sizeof(buf)); count-= sizeof(buf); } } void extract_image(char *image) /* Extract the executables from an image. */ { FILE *imagef, *procf; off_t len; struct stat st; struct image_header ihdr; struct exec phdr; char buf[SECTOR_SIZE]; if (stat(image, &st) < 0) fatal(image); /* Size of the image. */ len= S_ISREG(st.st_mode) ? st.st_size : -1; if ((imagef= fopen(image, "r")) == nil) fatal(image); while (len != 0) { /* Extract a program, first sector is an extended header. */ bread(imagef, image, buf, sizeof(buf)); len-= sizeof(buf); memcpy(&ihdr, buf, sizeof(ihdr)); phdr= ihdr.process; /* Check header. */ read_header(1, ihdr.name, nil, &ihdr); if ((procf= fopen(ihdr.name, "w")) == nil) fatal(ihdr.name); if (phdr.a_flags & A_PAL) { /* A page aligned process contains a header in text. */ phdr.a_text+= phdr.a_hdrlen; } else { bwrite(procf, ihdr.name, &ihdr.process, phdr.a_hdrlen); } /* Extract text and data segments. */ if (phdr.a_flags & A_SEP) { extractexec(imagef, image, procf, ihdr.name, phdr.a_text, &len); extractexec(imagef, image, procf, ihdr.name, phdr.a_data, &len); } else { extractexec(imagef, image, procf, ihdr.name&&&&&&&&&&&&&&, phdr.a_text + phdr.a_data, &len); } if (fclose(procf) == EOF) fatal(ihdr.name); } } int rawfd; /* File descriptor to open device. */ char *rawdev; /* Name of device. */ void readblock(off_t blk, char *buf) /* For rawfs, so that it can read blocks. */ { int n; if (lseek(rawfd, blk * BLOCK_SIZE, SEEK_SET) < 0 || (n= read(rawfd, buf, BLOCK_SIZE)) < 0 ) fatal(rawdev); if (n < BLOCK_SIZE) { fprintf(stderr, "installboot: Unexpected EOF on %s\n", rawdev); exit(1); } } void writeblock(off_t blk, char *buf) /* Add a function to write blocks for local use. */ { if (lseek(rawfd, blk * BLOCK_SIZE, SEEK_SET) < 0 || write(rawfd, buf, BLOCK_SIZE) < 0 ) fatal(rawdev); } int raw_install(char *file, off_t *start, off_t *len) /* Copy bootcode or an image to the boot device at the given absolute disk * block number. This "raw" installation is used to place bootcode and * image on a disk without a filesystem to make a simple boot disk. Useful * in automated scripts for J. Random User. * Note: *len == 0 when an image is read. It is set right afterwards. */ { static char buf[BLOCK_SIZE]; /* Nonvolatile block buffer. */ FILE *f; off_t sec; unsigned long devsize; static int banner= 0; struct partition entry; /* See if the device has a maximum size. */ devsize= -1; if (ioctl(rawfd, DIOCGETP, &entry) == 0) devsize= cv64ul(entry.size); if ((f= fopen(file, "r")) == nil) fatal(file); /* Copy sectors from file onto the boot device. */ sec= *start; do { int off= sec % RATIO; if (fread(buf + off * SECTOR_SIZE, 1, SECTOR_SIZE, f) == 0) break; if (sec >= devsize) { fprintf(stderr, "installboot: %s can't be attached to %s\n", file, rawdev); return 0; } if (off == RATIO - 1) writeblock(sec / RATIO, buf); } while (++sec != *start + *len); if (ferror(f)) fatal(file); (void) fclose(f); /* Write a partial block, this may be the last image. */ if (sec % RATIO != 0) writeblock(sec / RATIO, buf); if (!banner) { printf(" sector length\n"); banner= 1; } *len= sec - *start; printf("%8ld%8ld %s\n", *start, *len, file); *start= sec; return 1; } enum howto { FS, BOOT }; void make_bootable(enum howto how, char *device, char *bootblock, char *bootcode, char **imagev) /* Install bootblock on the bootsector of device with the disk addresses to * bootcode patched into the data segment of bootblock. "How" tells if there * should or shoudn't be a file system on the disk. The images in the imagev * vector are added to the end of the device. */ { char buf[BLOCK_SIZE + 256], *adrp, *parmp; struct fileaddr { off_t address; int count; } bootaddr[BOOT_MAX + 1], *bap= bootaddr; struct exec boothdr; struct image_header dummy; struct stat st; ino_t ino; off_t sector, max_sector; FILE *bootf; off_t addr, fssize, pos, len; char *labels, *label, *image; int nolabel; /* Open device and set variables for readblock. */ if ((rawfd= open(rawdev= device, O_RDWR)) < 0) fatal(device); /* Read and check the superblock. */ fssize= r_super(); switch (how) { case FS: if (fssize == 0) { fprintf(stderr, "installboot: %s is not a Minix file system\n", device); exit(1); } break; case BOOT: if (fssize != 0) { int s; printf("%s contains a file system!\n", device); printf("Scribbling in 10 seconds"); for (s= 0; s < 10; s++) { fputc('.', stdout); fflush(stdout); sleep(1); } fputc('\n', stdout); } fssize= 1; /* Just a boot block. */ } if (how == FS) { /* See if the boot code can be found on the file system. */ if ((ino= r_lookup(ROOT_INO, bootcode)) == 0) { if (errno != ENOENT) fatal(bootcode); } } else { /* Boot code must be attached at the end. */ ino= 0; } if (ino == 0) { /* For a raw installation, we need to copy the boot code onto * the device, so we need to look at the file to be copied. */ if (stat(bootcode, &st) < 0) fatal(bootcode); if ((bootf= fopen(bootcode, "r")) == nil) fatal(bootcode); } else { /* Boot code is present in the file system. */ r_stat(ino, &st); /* Get the header from the first block. */ if ((addr= r_vir2abs((off_t) 0)) == 0) { boothdr.a_magic[0]= !A_MAGIC0; } else { readblock(addr, buf); memcpy(&boothdr, buf, sizeof(struct exec)); } bootf= nil; dummy.process= boothdr; } /* See if it is an executable (read_header does the check). */ read_header(0, bootcode, bootf, &dummy); boothdr= dummy.process; if (bootf != nil) fclose(bootf); /* Get all the sector addresses of the secondary boot code. */ max_sector= (boothdr.a_hdrlen + boothdr.a_text + boothdr.a_data + SECTOR_SIZE - 1) / SECTOR_SIZE; if (max_sector > BOOT_MAX * RATIO) { fprintf(stderr, "installboot: %s is way too big\n", bootcode); exit(0); } /* Determine the addresses to the boot code to be patched into the * boot block. */ bap->count= 0; /* Trick to get the address recording going. */ for (sector= 0; sector < max_sector; sector++) { if (ino == 0) { addr= fssize + (sector / RATIO); } else if ((addr= r_vir2abs(sector / RATIO)) == 0) { fprintf(stderr, "installboot: %s has holes!\n", bootcode); exit(1); } addr= (addr * RATIO) + (sector % RATIO); /* First address of the addresses array? */ if (bap->count == 0) bap->address= addr; /* Paste sectors together in a multisector read. */ if (bap->address + bap->count == addr) bap->count++; else { /* New address. */ bap++; bap->address= addr; bap->count= 1; } } (++bap)->count= 0; /* No more. */ /* Get the boot block and patch the pieces in. */ readblock(BOOTBLOCK, buf); if ((bootf= fopen(bootblock, "r")) == nil) fatal(bootblock); read_header(0, bootblock, bootf, &dummy); boothdr= dummy.process; if (boothdr.a_text + boothdr.a_data + 4 * (bap - bootaddr) + 1 > PARTPOS) { fprintf(stderr, "installboot: %s + addresses to %s don't fit in the boot sector\n", bootblock, bootcode); fprintf(stderr, "You can try copying/reinstalling %s to defragment it\n", bootcode); exit(1); } /* All checks out right. Read bootblock into the boot block! */ bread(bootf, bootblock, buf, boothdr.a_text + boothdr.a_data); (void) fclose(bootf); /* Patch the addresses in. */ adrp= buf + (int) (boothdr.a_text + boothdr.a_data); for (bap= bootaddr; bap->count != 0; bap++) { *adrp++= bap->count; *adrp++= (bap->address >> 0) & 0xFF; *adrp++= (bap->address >> 8) & 0xFF; *adrp++= (bap->address >> 16) & 0xFF; } /* Zero count stops bootblock's reading loop. */ *adrp++= 0; if (bap > bootaddr+1) { printf("%s and %d addresses to %s patched into %s\n", bootblock, (int)(bap - bootaddr), bootcode, device); } /* Boot block signature. */ buf[SIGPOS+0]= (SIGNATURE >> 0) & 0xFF; buf[SIGPOS+1]= (SIGNATURE >> 8) & 0xFF; /* Sector 2 of the boot block is used for boot parameters, initially * filled with null commands (newlines). Initialize it only if * necessary. */ for (parmp= buf + SECTOR_SIZE; parmp < buf + 2*SECTOR_SIZE; parmp++) { if (*imagev != nil || (control(*parmp) && *parmp != '\n')) { /* Param sector must be initialized. */ memset(buf + SECTOR_SIZE, '\n', SECTOR_SIZE); break; } } /* Offset to the end of the file system to add boot code and images. */ pos= fssize * RATIO; if (ino == 0) { /* Place the boot code onto the boot device. */ len= max_sector; if (!raw_install(bootcode, &pos, &len)) { if (how == FS) { fprintf(stderr, "\t(Isn't there a copy of %s on %s that can be used?)\n", bootcode, device); } exit(1); } } parmp= buf + SECTOR_SIZE; nolabel= 0; if (how == BOOT) { /* A boot only disk needs to have floppies swapped. */ strcpy(parmp, "trailer()echo \\nInsert the root diskette then hit RETURN\\n\\w\\c\n"); parmp+= strlen(parmp); } while ((labels= *imagev++) != nil) { /* Place each kernel image on the boot device. */ if ((image= strchr(labels, ':')) != nil) *image++= 0; else { if (nolabel) { fprintf(stderr, "installboot: Only one image can be the default\n"); exit(1); } nolabel= 1; image= labels; labels= nil; } len= 0; if (!raw_install(image, &pos, &len)) exit(1); if (labels == nil) { /* Let this image be the default. */ sprintf(parmp, "image=%ld:%ld\n", pos-len, len); parmp+= strlen(parmp); } while (labels != nil) { /* Image is prefixed by a comma separated list of * labels. Define functions to select label and image. */ label= labels; if ((labels= strchr(labels, ',')) != nil) *labels++ = 0; sprintf(parmp, "%s(%c){label=%s;image=%ld:%ld;echo %s kernel selected;menu}\n", label, between('A', label[0], 'Z') ? label[0]-'A'+'a' : label[0], label, pos-len, len, label); parmp+= strlen(parmp); } if (parmp > buf + BLOCK_SIZE) { fprintf(stderr, "installboot: Out of parameter space, too many images\n"); exit(1); } } /* Install boot block. */ writeblock((off_t) BOOTBLOCK, buf); if (pos > fssize * RATIO) { /* Tell the total size of the data on the device. */ printf("%16ld (%ld kb) total\n", pos, (pos + RATIO - 1) / RATIO); } } void install_master(char *device, char *masterboot, char **guide) /* Booting a hard disk is a two stage process: The master bootstrap in sector * 0 loads the bootstrap from sector 0 of the active partition which in turn * starts the operating system. This code installs such a master bootstrap * on a hard disk. If guide[0] is non-null then the master bootstrap is * guided into booting a certain device. */ { FILE *masf; unsigned long size; struct stat st; char buf[BLOCK_SIZE]; /* Open device. */ if ((rawfd= open(rawdev= device, O_RDWR)) < 0) fatal(device); /* Open the master boot code. */ if ((masf= fopen(masterboot, "r")) == nil) fatal(masterboot); /* See if the user is cloning a device. */ if (fstat(fileno(masf), &st) >=0 && S_ISBLK(st.st_mode)) size= PARTPOS; else { /* Read and check header otherwise. */ struct image_header ihdr; read_header(1, masterboot, masf, &ihdr); size= ihdr.process.a_text + ihdr.process.a_data; } if (size > PARTPOS) { fprintf(stderr, "installboot: %s is too big\n", masterboot); exit(1); } /* Read the master boot block, patch it, write. */ readblock(BOOTBLOCK, buf); memset(buf, 0, PARTPOS); (void) bread(masf, masterboot, buf, size); if (guide[0] != nil) { /* Fixate partition to boot. */ char *keys= guide[0]; char *logical= guide[1]; size_t i; int logfd; u32_t offset; struct partition geometry; /* A string of digits to be seen as keystrokes. */ i= 0; do { if (!between('0', keys[i], '9')) { fprintf(stderr, "installboot: bad guide keys '%s'\n", keys); exit(1); } } while (keys[++i] != 0); if (size + i + 1 > PARTPOS) { fprintf(stderr, "installboot: not enough space after '%s' for '%s'\n", masterboot, keys); exit(1); } memcpy(buf + size, keys, i); size += i; buf[size]= '\r'; if (logical != nil) { if ((logfd= open(logical, O_RDONLY)) < 0 || ioctl(logfd, DIOCGETP, &geometry) < 0 ) { fatal(logical); } offset= div64u(geometry.base, SECTOR_SIZE); if (size + 5 > PARTPOS) { fprintf(stderr, "installboot: not enough space " "after '%s' for '%s' and an offset " "to '%s'\n", masterboot, keys, logical); exit(1); } buf[size]= '#'; memcpy(buf+size+1, &offset, 4); } } /* Install signature. */ buf[SIGPOS+0]= (SIGNATURE >> 0) & 0xFF; buf[SIGPOS+1]= (SIGNATURE >> 8) & 0xFF; writeblock(BOOTBLOCK, buf); } void usage(void) { fprintf(stderr, "Usage: installboot -i(mage) image kernel mm fs ... init\n" " installboot -(e)x(tract) image\n" " installboot -d(evice) device bootblock boot [image ...]\n" " installboot -b(oot) device bootblock boot image ...\n" " installboot -m(aster) device masterboot [keys [logical]]\n"); exit(1); } int isoption(char *option, char *test) /* Check if the option argument is equals "test". Also accept -i as short * for -image, and the special case -x for -extract. */ { if (strcmp(option, test) == 0) return 1; if (option[0] != '-' && strlen(option) != 2) return 0; if (option[1] == test[1]) return 1; if (option[1] == 'x' && test[1] == 'e') return 1; return 0; } int main(int argc, char **argv) { if (argc < 2) usage(); if (argc >= 4 && isoption(argv[1], "-image")) { make_image(argv[2], argv + 3); } else if (argc == 3 && isoption(argv[1], "-extract")) { extract_image(argv[2]); } else if (argc >= 5 && isoption(argv[1], "-device")) { make_bootable(FS, argv[2], argv[3], argv[4], argv + 5); } else if (argc >= 6 && isoption(argv[1], "-boot")) { make_bootable(BOOT, argv[2], argv[3], argv[4], argv + 5); } else if ((4 <= argc && argc <= 6) && isoption(argv[1], "-master")) { install_master(argv[2], argv[3], argv + 4); } else { usage(); } exit(0); } ! masterboot 2.0 - Master boot block code Author: Kees J. Bot ! ! This code may be placed in the first sector (the boot sector) of a floppy, ! hard disk or hard disk primary partition. There it will perform the ! following actions at boot time: ! ! - If the booted device is a hard disk and one of the partitions is active ! then the active partition is booted. ! ! - Otherwise the next floppy or hard disk device is booted, trying them one ! by one. ! ! To make things a little clearer, the boot path might be: ! /dev/fd0 - Floppy disk containing data, tries fd1 then d0 ! [/dev/fd1] - Drive empty ! /dev/c0d0 - Master boot block, selects active partition 2 ! /dev/c0d0p2 - Submaster, selects active subpartition 0 ! /dev/c0d0p2s0 - Minix bootblock, reads Boot Monitor /boot ! Minix - Started by /boot from a kernel image in /minix LOADOFF = 0x7C00 ! 0x0000:LOADOFF is where this code is loaded BUFFER = 0x0600 ! First free memory PART_TABLE = 446 ! Location of partition table within this code PENTRYSIZE = 16 ! Size of one partition table entry MAGIC = 510 ! Location of the AA55 magic number ! .h: bootind = 0 sysind = 4 lowsec = 8 .text ! Find active (sub)partition, load its first sector, run it. master: xor ax, ax mov ds, ax mov es, ax cli mov ss, ax ! ds = es = ss = Vector segment mov sp, #LOADOFF sti ! Copy this code to safety, then jump to it. mov si, sp ! si = start of this code push si ! Also where we'll return to eventually mov di, #BUFFER ! Buffer area mov cx, #512/2 ! One sector cld rep movs jmpf BUFFER+migrate, 0 ! To safety migrate: ! Find the active partition findactive: testb dl, dl jns nextdisk ! No bootable partitions on floppies mov si, #BUFFER+PART_TABLE find: cmpb sysind(si), #0 ! Partition type, nonzero when in use jz nextpart testb bootind(si), #0x80 ! Active partition flag in bit 7 jz nextpart ! It's not active loadpart: call load ! Load partition bootstrap jc error1 ! Not supposed to fail bootstrap: ret ! Jump to the master bootstrap nextpart: add si, #PENTRYSIZE cmp si, #BUFFER+PART_TABLE+4*PENTRYSIZE jb find ! No active partition, tell 'em call print .ascii "No active partition\0" jmp reboot ! There are no active partitions on this drive, try the next drive. nextdisk: incb dl ! Increment dl for the next drive testb dl, dl js nexthd ! Hard disk if negative int 0x11 ! Get equipment configuration shl ax, #1 ! Highest floppy drive # in bits 6-7 shl ax, #1 ! Now in bits 0-1 of ah andb ah, #0x03 ! Extract bits cmpb dl, ah ! Must be dl <= ah for drive to exist ja nextdisk ! Otherwise try disk 0 eventually call load0 ! Read the next floppy bootstrap jc nextdisk ! It failed, next disk please ret ! Jump to the next master bootstrap nexthd: call load0 ! Read the hard disk bootstrap error1: jc error ! No disk? ret ! Load sector 0 from the current device. It's either a floppy bootstrap or ! a hard disk master bootstrap. load0: mov si, #BUFFER+zero-lowsec ! si = where lowsec(si) is zero !jmp load ! Load sector lowsec(si) from the current device. The obvious head, sector, ! and cylinder numbers are ignored in favour of the more trustworthy absolute ! start of partition. load: mov di, #3 ! Three retries for floppy spinup retry: push dx ! Save drive code push es push di ! Next call destroys es and di movb ah, #0x08 ! Code for drive parameters int 0x13 pop di pop es andb cl, #0x3F ! cl = max sector number (1-origin) incb dh ! dh = 1 + max head number (0-origin) movb al, cl ! al = cl = sectors per track mulb dh ! dh = heads, ax = heads * sectors mov bx, ax ! bx = sectors per cylinder = heads * sectors mov ax, lowsec+0(si) mov dx, lowsec+2(si)! dx:ax = sector within drive cmp dx, #[1024*255*63-255]>>16 ! Near 8G limit? jae bigdisk div bx ! ax = cylinder, dx = sector within cylinder xchg ax, dx ! ax = sector within cylinder, dx = cylinder movb ch, dl ! ch = low 8 bits of cylinder divb cl ! al = head, ah = sector (0-origin) xorb dl, dl ! About to shift bits 8-9 of cylinder into dl shr dx, #1 shr dx, #1 ! dl[6..7] = high cylinder orb dl, ah ! dl[0..5] = sector (0-origin) movb cl, dl ! cl[0..5] = sector, cl[6..7] = high cyl incb cl ! cl[0..5] = sector (1-origin) pop dx ! Restore drive code in dl movb dh, al ! dh = al = head mov bx, #LOADOFF ! es:bx = where sector is loaded mov ax, #0x0201 ! Code for read, just one sector int 0x13 ! Call the BIOS for a read jmp rdeval ! Evaluate read result bigdisk: mov bx, dx ! bx:ax = dx:ax = sector to read pop dx ! Restore drive code in dl push si ! Save si mov si, #BUFFER+ext_rw ! si = extended read/write parameter packet mov 8(si), ax ! Starting block number = bx:ax mov 10(si), bx movb ah, #0x42 ! Extended read int 0x13 pop si ! Restore si to point to partition entry !jmp rdeval rdeval: jnc rdok ! Read succeeded cmpb ah, #0x80 ! Disk timed out? (Floppy drive empty) je rdbad dec di jl rdbad ! Retry count expired xorb ah, ah int 0x13 ! Reset jnc retry ! Try again rdbad: stc ! Set carry flag ret rdok: cmp LOADOFF+MAGIC, #0xAA55 jne nosig ! Error if signature wrong ret ! Return with carry still clear nosig: call print .ascii "Not bootable\0" jmp reboot ! A read error occurred, complain and hang error: mov si, #LOADOFF+errno+1 prnum: movb al, ah ! Error number in ah andb al, #0x0F ! Low 4 bits cmpb al, #10 ! A-F? jb digit ! 0-9! addb al, #7 ! 'A' - ':' digit: addb (si), al ! Modify '0' in string dec si movb cl, #4 ! Next 4 bits shrb ah, cl jnz prnum ! Again if digit > 0 call print .ascii "Read error " errno: .ascii "00\0" !jmp reboot reboot: call print .ascii ". Hit any key to reboot.\0" xorb ah, ah ! Wait for keypress int 0x16 call print .ascii "\r\n\0" int 0x19 ! Print a message. print: pop si ! si = String following 'call print' prnext: lodsb ! al = *si++ is char to be printed testb al, al ! Null marks end jz prdone movb ah, #0x0E ! Print character in teletype mode mov bx, #0x0001 ! Page 0, foreground color int 0x10 jmp prnext prdone: jmp (si) ! Continue after the string .data ! Extended read/write commands require a parameter packet. ext_rw: .data1 0x10 ! Length of extended r/w packet .data1 0 ! Reserved .data2 1 ! Blocks to transfer (just one) .data2 LOADOFF ! Buffer address offset .data2 0 ! Buffer address segment .data4 0 ! Starting block number low 32 bits (tbfi) zero: .data4 0 ! Starting block number high 32 bits /* rawfs.c - Raw Minix file system support. Author: Kees J. Bot * 23 Dec 1991 * Based on readfs by Paul Polderman */ #define nil 0 #define _POSIX_SOURCE 1 #define _MINIX 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rawfs.h" void readblock(off_t blockno, char *buf); /* The following code handles two file system types: Version 1 with small * inodes and 16-bit disk addresses and Version 2 with big inodes and 32-bit * disk addresses. #ifdef FLEX * To make matters worse, Minix-vmd knows about the normal Unix Version 7 * directories and directories with flexible entries. #endif */ /* File system parameters. */ static unsigned nr_dzones; /* Fill these in after reading superblock. */ static unsigned nr_indirects; static unsigned inodes_per_block; #ifdef FLEX #include #define direct _v7_direct #else #include #endif #if __minix_vmd static struct v12_super_block super; /* Superblock of file system */ #define s_log_zone_size s_dummy /* Zones are obsolete. */ #else static struct super_block super; /* Superblock of file system */ #define SUPER_V1 SUPER_MAGIC /* V1 magic has a weird name. */ #endif static struct inode curfil; /* Inode of file under examination */ static char indir[BLOCK_SIZE]; /* Single indirect block. */ static char dindir[BLOCK_SIZE]; /* Double indirect block. */ static char dirbuf[BLOCK_SIZE]; /* Scratch/Directory block. */ #define scratch dirbuf static block_t a_indir, a_dindir; /* Addresses of the indirects. */ static off_t dirpos; /* Reading pos in a dir. */ #define fsbuf(b) (* (struct buf *) (b)) #define zone_shift (super.s_log_zone_size) /* zone to block ratio */ off_t r_super(void) /* Initialize variables, return size of file system in blocks, * (zero on error). */ { /* Read superblock. */ readblock(SUPER_BLOCK, scratch); memcpy(&super, scratch, sizeof(super)); /* Is it really a MINIX file system ? */ if (super.s_magic == SUPER_V2) { nr_dzones= V2_NR_DZONES; nr_indirects= V2_INDIRECTS; inodes_per_block= V2_INODES_PER_BLOCK; return (off_t) super.s_zones << zone_shift; } else if (super.s_magic == SUPER_V1) { nr_dzones= V1_NR_DZONES; nr_indirects= V1_INDIRECTS; inodes_per_block= V1_INODES_PER_BLOCK; return (off_t) super.s_nzones << zone_shift; } else { /* Filesystem not recognized as Minix. */ return 0; } } void r_stat(Ino_t inum, struct stat *stp) /* Return information about a file like stat(2) and remember it. */ { block_t block; block_t ino_block; ino_t ino_offset; /* Calculate start of i-list */ block = SUPER_BLOCK + 1 + super.s_imap_blocks + super.s_zmap_blocks; /* Calculate block with inode inum */ ino_block = ((inum - 1) / inodes_per_block); ino_offset = ((inum - 1) % inodes_per_block); block += ino_block; /* Fetch the block */ readblock(block, scratch); if (super.s_magic == SUPER_V2) { d2_inode *dip; int i; dip= &fsbuf(scratch).b_v2_ino[ino_offset]; curfil.i_mode= dip->d2_mode; curfil.i_nlinks= dip->d2_nlinks; curfil.i_uid= dip->d2_uid; curfil.i_gid= dip->d2_gid; curfil.i_size= dip->d2_size; curfil.i_atime= dip->d2_atime; curfil.i_mtime= dip->d2_mtime; curfil.i_ctime= dip->d2_ctime; for (i= 0; i < V2_NR_TZONES; i++) curfil.i_zone[i]= dip->d2_zone[i]; } else { d1_inode *dip; int i; dip= &fsbuf(scratch).b_v1_ino[ino_offset]; curfil.i_mode= dip->d1_mode; curfil.i_nlinks= dip->d1_nlinks; curfil.i_uid= dip->d1_uid; curfil.i_gid= dip->d1_gid; curfil.i_size= dip->d1_size; curfil.i_atime= dip->d1_mtime; curfil.i_mtime= dip->d1_mtime; curfil.i_ctime= dip->d1_mtime; for (i= 0; i < V1_NR_TZONES; i++) curfil.i_zone[i]= dip->d1_zone[i]; } curfil.i_dev= -1; /* Can't fill this in alas. */ curfil.i_num= inum; stp->st_dev= curfil.i_dev; stp->st_ino= curfil.i_num; stp->st_mode= curfil.i_mode; stp->st_nlink= curfil.i_nlinks; stp->st_uid= curfil.i_uid; stp->st_gid= curfil.i_gid; stp->st_rdev= (dev_t) curfil.i_zone[0]; stp->st_size= curfil.i_size; stp->st_atime= curfil.i_atime; stp->st_mtime= curfil.i_mtime; stp->st_ctime= curfil.i_ctime; a_indir= a_dindir= 0; dirpos= 0; } ino_t r_readdir(char *name) /* Read next directory entry at "dirpos" from file "curfil". */ { ino_t inum= 0; int blkpos; struct direct *dp; if (!S_ISDIR(curfil.i_mode)) { errno= ENOTDIR; return -1; } while (inum == 0 && dirpos < curfil.i_size) { if ((blkpos= (int) (dirpos % BLOCK_SIZE)) == 0) { /* Need to fetch a new directory block. */ readblock(r_vir2abs(dirpos / BLOCK_SIZE), dirbuf); } #ifdef FLEX if (super.s_flags & S_FLEX) { struct _fl_direct *dp; dp= (struct _fl_direct *) (dirbuf + blkpos); if ((inum= dp->d_ino) != 0) strcpy(name, dp->d_name); dirpos+= (1 + dp->d_extent) * FL_DIR_ENTRY_SIZE; continue; } #endif /* Let dp point to the next entry. */ dp= (struct direct *) (dirbuf + blkpos); if ((inum= dp->d_ino) != 0) { /* This entry is occupied, return name. */ strncpy(name, dp->d_name, sizeof(dp->d_name)); name[sizeof(dp->d_name)]= 0; } dirpos+= DIR_ENTRY_SIZE; } return inum; } off_t r_vir2abs(off_t virblk) /* Translate a block number in a file to an absolute disk block number. * Returns 0 for a hole and -1 if block is past end of file. */ { block_t b= virblk; zone_t zone, ind_zone; block_t z, zone_index; int i; /* Check if virblk within file. */ if (virblk * BLOCK_SIZE >= curfil.i_size) return -1; /* Calculate zone in which the datablock number is contained */ zone = (zone_t) (b >> zone_shift); /* Calculate index of the block number in the zone */ zone_index = b - ((block_t) zone << zone_shift); /* Go get the zone */ if (zone < (zone_t) nr_dzones) { /* direct block */ zone = curfil.i_zone[(int) zone]; z = ((block_t) zone << zone_shift) + zone_index; return z; } /* The zone is not a direct one */ zone -= (zone_t) nr_dzones; /* Is it single indirect ? */ if (zone < (zone_t) nr_indirects) { /* single indirect block */ ind_zone = curfil.i_zone[nr_dzones]; } else { /* double indirect block */ /* Fetch the double indirect block */ if ((ind_zone = curfil.i_zone[nr_dzones + 1]) == 0) return 0; z = (block_t) ind_zone << zone_shift; if (a_dindir != z) { readblock(z, dindir); a_dindir= z; } /* Extract the indirect zone number from it */ zone -= (zone_t) nr_indirects; i = zone / (zone_t) nr_indirects; ind_zone = super.s_magic == SUPER_V2 ? fsbuf(dindir).b_v2_ind[i] : fsbuf(dindir).b_v1_ind[i]; zone %= (zone_t) nr_indirects; } if (ind_zone == 0) return 0; /* Extract the datablock number from the indirect zone */ z = (block_t) ind_zone << zone_shift; if (a_indir != z) { readblock(z, indir); a_indir= z; } zone = super.s_magic == SUPER_V2 ? fsbuf(indir).b_v2_ind[(int) zone] : fsbuf(indir).b_v1_ind[(int) zone]; /* Calculate absolute datablock number */ z = ((block_t) zone << zone_shift) + zone_index; return z; } ino_t r_lookup(Ino_t cwd, char *path) /* Translates a pathname to an inode number. This is just a nice utility * function, it only needs r_stat and r_readdir. */ { char name[NAME_MAX+1], r_name[NAME_MAX+1]; char *n; struct stat st; ino_t ino; ino= path[0] == '/' ? ROOT_INO : cwd; for (;;) { if (ino == 0) { errno= ENOENT; return 0; } while (*path == '/') path++; if (*path == 0) return ino; r_stat(ino, &st); if (!S_ISDIR(st.st_mode)) { errno= ENOTDIR; return 0; } n= name; while (*path != 0 && *path != '/') if (n < name + NAME_MAX) *n++ = *path++; *n= 0; while ((ino= r_readdir(r_name)) != 0 && strcmp(name, r_name) != 0) {} } } &/* rawfs.h - Raw Minix file system support. Author: Kees J. Bot * * off_t r_super(void); * Initialize variables, returns the size of a valid Minix * file system blocks, but zero on error. * * void r_stat(ino_t file, struct stat *stp); * Return information about a file like stat(2) and * remembers file for the next two calls. * * off_t r_vir2abs(off_t virblockno); * Translate virtual block number in file to absolute * disk block number. Returns 0 if the file contains * a hole, or -1 if the block lies past the end of file. * * ino_t r_readdir(char *name); * Return next directory entry or 0 if there are no more. * Returns -1 and sets errno on error. * * ino_t r_lookup(ino_t cwd, char *path); * A utility function that translates a pathname to an * inode number. It starts from directory "cwd" unless * path starts with a '/', then from ROOT_INO. * Returns 0 and sets errno on error. * * One function needs to be provided by the outside world: * * void readblock(off_t blockno, char *buf); * Read a block into the buffer. Outside world handles * errors. */ #define ROOT_INO ((ino_t) 1) /* Inode nr of root dir. */ off_t r_super(void); void r_stat(Ino_t file, struct stat *stp); off_t r_vir2abs(off_t virblockno); ino_t r_readdir(char *name); ino_t r_lookup(Ino_t cwd, char *path); #!/bin/sh # # a.out2com - Minix a.out to DOS .COM Author: Kees J. Bot # 17 Jun 1995 # Transform a Minix a.out to the COM format of MS-DOS, # the executable must be common I&D with 256 scratch bytes at the start of # the text segment to make space for the Program Segment Prefix. The Minix # a.out header and these 256 bytes are removed to make a COM file. case $# in 2) aout="$1" com="$2" ;; *) echo "Usage: $0 " >&2 exit 1 esac size "$aout" >/dev/null || exit set `size "$aout" | sed 1d` count=`expr \( $1 + $2 - 256 + 31 \) / 32` exec dd if="$aout" of="$com" bs=32 skip=9 count=$count conv=silent /* mkfile 1.0 - create a file under DOS for use as a Minix "disk". * Author: Kees J. Bot * 9 May 1998 */ #define nil 0 #include #include #include /* Stuff normally found in , , etc. */ extern int errno; int creat(const char *file, int mode); int open(const char *file, int oflag); off_t lseek(int fd, off_t offset, int whence); ssize_t write(int fd, const char *buf, size_t len); void exit(int status); int printf(const char *fmt, ...); #define O_WRONLY 1 #define SEEK_SET 0 #define SEEK_END 2 /* Kernel printf requires a putk() function. */ int putk(int c) { char ch = c; if (c == 0) return; if (c == '\n') putk('\r'); (void) write(2, &ch, 1); } static void usage(void) { printf("Usage: mkfile [gmk] \n" "(Example sizes, all 50 meg: 52428800, 51200k, 50m)\n"); exit(1); } char *strerror(int err) /* Translate some DOS error numbers to text. */ { static struct errlist { int err; char *what; } errlist[] = { { 0, "No error" }, { 1, "Function number invalid" }, { 2, "File not found" }, { 3, "Path not found" }, { 4, "Too many open files" }, { 5, "Access denied" }, { 6, "Invalid handle" }, { 12, "Access code invalid" }, { 39, "Insufficient disk space" }, }; struct errlist *ep; static char unknown[]= "Error 65535"; unsigned e; char *p; for (ep= errlist; ep < errlist + sizeof(errlist)/sizeof(errlist[0]); ep++) { if (ep->err == err) return ep->what; } p= unknown + sizeof(unknown) - 1; e= err; do *--p= '0' + (e % 10); while ((e /= 10) > 0); strcpy(unknown + 6, p); return unknown; } int main(int argc, char **argv) { int i; static char buf[512]; unsigned long size, mul; off_t offset; char *cp; int fd; char *file; if (argc != 3) usage(); cp= argv[1]; size= 0; while ((unsigned) (*cp - '0') < 10) { unsigned d= *cp++ - '0'; if (size <= (ULONG_MAX-9) / 10) { size= size * 10 + d; } else { size= ULONG_MAX; } } if (cp == argv[1]) usage(); while (*cp != 0) { mul = 1; switch (*cp++) { case 'G': case 'g': mul *= 1024; case 'M': case 'm': mul *= 1024; case 'K': case 'k': mul *= 1024; case 'B': case 'b': break; default: usage(); } if (size <= ULONG_MAX / mul) { size *= mul; } else { size= ULONG_MAX; } } if (size > 1024L*1024*1024) { printf("mkfile: A file size over 1G is a bit too much\n"); exit(1); } /* Open existing file, or create a new file. */ file= argv[2]; if ((fd= open(file, O_WRONLY)) < 0) { if (errno == 2) { fd= creat(file, 0666); } } if (fd < 0) { printf("mkfile: Can't open %s: %s\n", file, strerror(errno)); exit(1); } /* How big is the file now? */ if ((offset= lseek(fd, 0, SEEK_END)) == -1) { printf("mkfile: Can't seek in %s: %s\n", file, strerror(errno)); exit(1); } if (offset == 0 && size == 0) exit(0); /* Huh? */ /* Write the first bit if the file is zero length. This is necessary * to circumvent a DOS bug by extending a new file by lseek. We also * want to make sure there are zeros in the first sector. */ if (offset == 0) { if (write(fd, buf, sizeof(buf)) == -1) { printf("mkfile: Can't write to %s: %s\n", file, strerror(errno)); exit(1); } } /* Seek to the required size and write 0 bytes to extend/truncate the * file to that size. */ if (lseek(fd, size, SEEK_SET) == -1) { printf("mkfile: Can't seek in %s: %s\n", file, strerror(errno)); exit(1); } if (write(fd, buf, 0) == -1) { printf("mkfile: Can't write to %s: %s\n", file, strerror(errno)); exit(1); } /* Did the file become the required size? */ if ((offset= lseek(fd, 0, SEEK_END)) == -1) { printf("mkfile: Can't seek in %s: %s\n", file, strerror(errno)); exit(1); } if (offset != size) { printf("mkfile: Failed to extend %s. Disk full?\n", file); exit(1); } return 0; } ! Doshead.s - DOS & BIOS support for boot.c Author: Kees J. Bot ! ! ! This file contains the startup and low level support for the secondary ! boot program. It contains functions for disk, tty and keyboard I/O, ! copying memory to arbitrary locations, etc. ! ! This runs under MS-DOS as a .COM file. A .COM file is what Minix calls ! a common I&D executable, except that the first 256 bytes contains DOS ! thingies. ! .sect .text; .sect .rom; .sect .data; .sect .bss K_I386 = 0x0001 ! Call Minix in 386 mode STACK = 16384 ! Number of bytes for the stack DS_SELECTOR = 3*8 ! Kernel data selector ES_SELECTOR = 4*8 ! Flat 4 Gb SS_SELECTOR = 5*8 ! Monitor stack CS_SELECTOR = 6*8 ! Kernel code MCS_SELECTOR= 7*8 ! Monitor code ESC = 0x1B ! Escape character ! Imported variables and functions: .extern _caddr, _daddr, _runsize, _edata, _end ! Runtime environment .extern _k_flags ! Special kernel flags .extern _mem ! Free memory list .extern _vdisk ! Name of the virtual disk .sect .text .use16 ! Tell 386 assembler we're in 16-bit mode .define _PSP _PSP: .space 256 ! Program Segment Prefix dosboot: cld ! C compiler wants UP xor ax, ax ! Zero mov di, _edata ! Start of bss is at end of data mov cx, _end ! End of bss (begin of heap) sub cx, di ! Number of bss bytes shr cx, 1 ! Number of words rep stos ! Clear bss cmp sp, _end+STACK jb 0f mov sp, _end+STACK ! "chmem" to 16 kb 0: ! Are we called with the /U option? movb cl, (_PSP+0x80) ! Argument byte count xorb ch, ch mov bx, _PSP+0x81 ! Argument string 0: jcxz notuflag cmpb (bx), 0x20 ! Whitespace? ja 1f inc bx dec cx jmp 0b 1: cmp cx, 2 ! '/U' is two bytes jne notuflag cmpb (bx), 0x2F ! '/'? jne notuflag movb al, 1(bx) andb al, ~0x20 ! Ignore case cmpb al, 0x55 ! 'U'? jne notuflag jmp keepumb ! Go grab an UMB notuflag: ! Remember the current video mode for restoration on exit. movb ah, 0x0F ! Get current video mode int 0x10 andb al, 0x7F ! Mask off bit 7 (no blanking) movb (old_vid_mode), al movb (cur_vid_mode), al ! We require at least MS-DOS 3.0. mov ax, 0x3000 ! Get DOS version int 0x21 cmpb al, 3 ! DOS 3.0+ ? jae dosok push tellbaddos call _printf jmp quit .sect .rom tellbaddos: .ascii "MS-DOS 3.0 or better required\n\0" .sect .text dosok: ! Find out how much "low" memory there is available, where it starts and ! where it ends. mov di, _mem ! di = memory list mov ax, _PSP+0x80 ! From PSP:80 to next PSP is ours mov dx, ds call seg2abs mov (di), ax mov 2(di), dx ! mem[0].base = ds * 16 + 0x80 xor ax, ax mov dx, (_PSP+2) ! First in-use segment far above us call seg2abs sub ax, (di) sbb dx, 2(di) ! Minus base gives size mov 4(di), ax mov 6(di), dx ! mem[1].size = free low memory size ! Give C code access to the code segment, data segment and the size of this ! process. xor ax, ax mov dx, cs call seg2abs mov (_caddr+0), ax mov (_caddr+2), dx xor ax, ax mov dx, ds call seg2abs mov (_daddr+0), ax mov (_daddr+2), dx mov ax, sp mov dx, ss ! End of stack = end of program call seg2abs sub ax, (_caddr+0) sbb dx, (_caddr+2) ! Minus start of our code mov (_runsize+0), ax mov (_runsize+2), dx ! Is our size ! Patch the regular _getprocessor library routine to jump to 'getprocessor', ! that checks if we happen to be in a V8086 straightjacket by returning '86'. cseg movb (_getprocessor+0), 0xE9 mov ax, getprocessor sub ax, _getprocessor+3 cseg mov (_getprocessor+1), ax ! Grab the largest chunk of extended memory available. call _getprocessor cmp ax, 286 ! Only 286s and above have extended memory jb no_ext mov ax, 0x4300 ! XMS driver check int 0x2F cmpb al, 0x80 ! XMS driver exists? je xmsthere get_ext: ! No driver, so can use all ext memory directly call _getprocessor cmp ax, 486 ! Assume 486s were the first to have >64M jb small_ext ! (It helps to be paranoid when using the BIOS) big_ext: mov ax, 0xE801 ! Code for get memory size for >64M int 0x15 ! ax = mem at 1M per 1K, bx = mem at 16M per 64K jnc got_ext small_ext: movb ah, 0x88 ! Code for get extended memory size clc ! Carry will stay clear if call exists int 0x15 ! Returns size (in K) in ax for AT's jc no_ext test ax, ax ! An AT with no extended memory? jz no_ext xor bx, bx ! bx = mem above 16M per 64K = 0 got_ext: mov cx, ax ! cx = copy of ext mem at 1M mov 10(di), 0x0010 ! mem[1].base = 0x00100000 (1M) mul (c1024) mov 12(di), ax ! mem[1].size = "ext mem at 1M" * 1024 mov 14(di), dx test bx, bx jz no_ext ! No more ext mem above 16M? cmp cx, 15*1024 ! Chunks adjacent? (precisely 15M at 1M?) je adj_ext mov 18(di), 0x0100 ! mem[2].base = 0x01000000 (16M) mov 22(di), bx ! mem[2].size = "ext mem at 16M" * 64K jmp no_ext adj_ext: add 14(di), bx ! Add ext mem above 16M to mem below 16M no_ext: jmp gotxms xmsthere: mov ax, 0x4310 ! Get XMS driver address int 0x2F mov (xms_driver+0), bx mov (xms_driver+2), es push ds pop es movb ah, 0x08 ! Query free extended memory xorb bl, bl callf (xms_driver) testb bl, bl jnz xmserr push ax ! ax = size of largest block in kb mul (c1024) mov 12(di), ax mov 14(di), dx ! mem[1].size = ax * 1024 pop dx ! dx = size of largest block in kb movb ah, 0x09 ! Allocate XMS block of size dx callf (xms_driver) test ax, ax jz xmserr mov (xms_handle), dx ! Save handle movb ah, 0x0C ! Lock XMS block (handle in dx) callf (xms_driver) test ax, ax jz xmserr mov 8(di), bx mov 10(di), dx ! mem[1].base = Address of locked block gotxms: ! If we're running in a DOS box then they're might be an Upper Memory Block ! we can use. Every little bit helps when in real mode. mov ax, 20(di) or ax, 22(di) ! Can we use mem[2]? jnz gotumb mov dx, 0xFFFF ! dx = Maximum size, i.e. gimme all call getumb ! Get UMB, dx = segment, cx = length test cx, cx ! Did we get a block? jz gotumb xor ax, ax ! dx:ax = memory block call seg2abs mov 16(di), ax mov 18(di), dx ! mem[2].base = memory block base mov dx, cx xor ax, ax ! dx:ax = length of memory block call seg2abs mov 20(di), ax mov 22(di), dx ! mem[2].size = memory block length gotumb: ! Set up an INT 24 "critical error" handler that returns "fail". This way ! Minix won't suffer from "(A)bort, (R)etry, (I)nfluence with a large hammer?". mov (0x007C), 0x03B0 ! movb al, 0x03 (fail code) movb (0x007E), 0xCF ! iret movb ah, 0x25 ! Set interrupt vector mov dx, 0x007C ! ds:dx = ds:0x007C = interrupt handler int 0x21 ! Time to switch to a higher level language (not much higher) call _boot ! void ..exit(int status) ! Exit the monitor by returning to DOS. .define _exit, __exit, ___exit ! Make various compilers happy _exit: __exit: ___exit: mov dx, (xms_handle) cmp dx, -1 ! Is there an ext mem block in use? je nohandle movb ah, 0x0D ! Unlock extended memory block callf (xms_driver) mov dx, (xms_handle) movb ah, 0x0A ! Free extended memory block callf (xms_driver) nohandle: call restore_video pop ax pop ax ! Return code in al movb ah, 0x4C ! Terminate with return code int 0x21 quit: ! exit(1) movb al, 1 push ax call _exit xmserr: xorb bh, bh push bx push tellxmserr call _printf jmp quit .sect .rom tellxmserr: .ascii "Extended memory problem, error 0x%02x\n\0" .sect .text ! int getprocessor(void) ! Prefix for the regular _getprocessor call that first checks if we're ! running in a virtual 8086 box. getprocessor: push sp ! Is pushed sp equal to sp? pop ax cmp ax, sp jne gettrueproc ! If not then it's a plain 8086 or 80186 .data1 0x0F,0x01,0xE0 ! Use old 286 SMSW instruction to get the MSW testb al, 0x01 ! Protected mode enabled? jz gettrueproc ! If not then a 286 or better in real mode mov ax, 86 ! Forget fancy tricks, say it's an 8086 ret gettrueproc: ! Get the true processor type push bp ! _getprocessor prologue that is patched over. mov bp, sp jmp _getprocessor+3 ! Try to get an Upper Memory Block under MS-DOS 5+. Try to get one up to size ! dx, return segment of UMB found in dx and size in paragraphs in cx. getumb: xor cx, cx ! Initially nothing found mov ax, 0x3000 ! Get DOS version int 0x2'''''' ' ' ' ' '''''''''''''''''1 cmpb al, 5 ! MS-DOS 5.0 or better? jb retumb mov ax, 0x544D ! Get UMB kept by BOOT /U int 0x15 ! Returns dx = segment, cx = size jc 0f cmp ax, 0x4D54 ! Carry clear and ax byte swapped? je retumb 0: mov ax, 0x5802 ! Get UMB link state int 0x21 xorb ah, ah push ax ! Save UMB link state mov ax, 0x5803 ! Set UMB link state mov bx, 0x0001 ! Add UMBs to DOS memory chain int 0x21 mov ax, 0x5800 ! Get memory allocation strategy int 0x21 push ax ! Save allocation strategy mov ax, 0x5801 ! Set memory allocation strategy mov bx, 0x0080 ! First fit, try high then low memory int 0x21 movb ah, 0x48 ! Allocate memory mov bx, dx ! Number of paragraphs wanted int 0x21 ! Fails with bx = size of largest jnc 0f ! Succeeds with ax = allocated block test bx, bx ! Is there any? jz no_umb movb ah, 0x48 ! Allocate memory int 0x21 jc no_umb ! Did we get some? 0: mov dx, ax ! dx = segment mov cx, bx ! cx = size no_umb: mov ax, 0x5801 ! Set memory allocation strategy pop bx ! bx = saved former strategy int 0x21 mov ax, 0x5803 ! Set UMB link state pop bx ! bx = saved former link state int 0x21 retumb: ret ! 'BOOT /U' instructs this program to grab the biggest available UMB and to ! sit on it until the next invocation of BOOT wants it back. These shenanigans ! are necessary because Windows 95 keeps all UMBs to itself unless you get hold ! of them first. umb = 0x80 ! UMB base and size old15 = 0x84 ! Old 15 interrupt vector new15 = 0x88 ! New 15 interrupt handler keepumb: mov ax, 0x544D ! "Keep UMB" handler already present? int 0x15 jc 0f cmp ax, 0x4D54 je exitumb ! Already present, so quit 0: mov si, new15start mov di, new15 mov cx, new15end sub cx, si rep movsb ! Copy handler into place add di, 15 movb cl, 4 shr di, cl ! di = first segment above handler mov cx, cs cmp cx, 0xA000 ! Are we loaded high perchance? jb nothigh werehigh: add cx, di mov (umb+0), cx ! Use my own memory as the UMB to keep mov ax, (_PSP+2) ! Up to the next in-use segment sub ax, dx ! ax = size of my free memory cmp ax, 0x1000 ! At least 64K? jb exitumb ! Don't bother if less mov (umb+2), 0x1000 ! Size of UMB add di, 0x1000 ! Keep my code plus 64K when TSR jmp hook15 nothigh: mov dx, 0x1000 call getumb ! Grab an UMB of at most 64K cmp cx, 0x1000 ! Did we get 64K? jb exitumb ! Otherwise don't bother mov (umb+0), dx mov (umb+2), cx hook15: mov ax, 0x3515 ! Get interrupt vector int 0x21 mov (old15+0), bx mov (old15+2), es ! Old 15 interrupt mov ax, 0x2515 ! Set interrupt vector mov dx, new15 ! ds:dx = new 15 handler int 0x21 mov ax, 0x3100 ! Terminate and stay resident mov dx, di ! dx = di = paragraphs we keep int 0x21 exitumb: mov ax, 0x4C00 ! exit(0) int 0x21 new15start: ! New interrupt 15 handler pushf cmp ax, 0x544D ! Is it my call? je my15 popf cseg jmpf (old15) ! No, continue with old 15 my15: popf push bp mov bp, sp andb 6(bp), ~0x01 ! clear carry, call will succeed xchgb al, ah ! ax = 4D54, also means call works cseg mov dx, (umb+0) ! dx = base of UMB cseg mov cx, (umb+2) ! cx = size of UMB pop bp iret ! return to caller new15end: ! u32_t mon2abs(void *ptr) ! Address in monitor data to absolute address. .define _mon2abs _mon2abs: mov bx, sp mov ax, 2(bx) ! ptr mov dx, ds ! Monitor data segment !jmp seg2abs seg2abs: ! Translate dx:ax to the 32 bit address dx-ax push cx movb ch, dh movb cl, 4 shl dx, cl shrb ch, cl ! ch-dx = dx << 4 add ax, dx adcb ch, 0 ! ch-ax = ch-dx + ax movb dl, ch xorb dh, dh ! dx-ax = ch-ax pop cx ret abs2seg: ! Translate the 32 bit address dx-ax to dx:ax push cx movb ch, dl mov dx, ax ! ch-dx = dx-ax and ax, 0x000F ! Offset in ax movb cl, 4 shr dx, cl shlb ch, cl orb dh, ch ! dx = ch-dx >> 4 pop cx ret ! void raw_copy(u32_t dstaddr, u32_t srcaddr, u32_t count) ! Copy count bytes from srcaddr to dstaddr. Don't do overlaps. ! Also handles copying words to or from extended memory. .define _raw_copy _raw_copy: push bp mov bp, sp push si push di ! Save C variable registers copy: cmp 14(bp), 0 jnz bigcopy mov cx, 12(bp) jcxz copydone ! Count is zero, end copy cmp cx, 0xFFF0 jb smallcopy bigcopy:mov cx, 0xFFF0 ! Don't copy more than about 64K at once smallcopy: push cx ! Save copying count mov ax, 4(bp) mov dx, 6(bp) cmp dx, 0x0010 ! Copy to extended memory? jae ext_copy cmp 10(bp), 0x0010 ! Copy from extended memory? jae ext_copy call abs2seg mov di, ax mov es, dx ! es:di = dstaddr mov ax, 8(bp) mov dx, 10(bp) call abs2seg mov si, ax mov ds, dx ! ds:si = srcaddr shr cx, 1 ! Words to move rep movs ! Do the word copy adc cx, cx ! One more byte? rep movsb ! Do the byte copy mov ax, ss ! Restore ds and es from the remaining ss mov ds, ax mov es, ax jmp copyadjust ext_copy: mov (x_dst_desc+2), ax movb (x_dst_desc+4), dl ! Set base of destination segment mov ax, 8(bp) mov dx, 10(bp) mov (x_src_desc+2), ax movb (x_src_desc+4), dl ! Set base of source segment mov si, x_gdt ! es:si = global descriptor table shr cx, 1 ! Words to move movb ah, 0x87 ! Code for extended memory move int 0x15 copyadjust: pop cx ! Restore count add 4(bp), cx adc 6(bp), 0 ! srcaddr += copycount add 8(bp), cx adc 10(bp), 0 ! dstaddr += copycount sub 12(bp), cx sbb 14(bp), 0 ! count -= copycount jmp copy ! and repeat copydone: pop di pop si ! Restore C variable registers pop bp ret ! u16_t get_word(u32_t addr); ! void put_word(u32_t addr, u16_t word); ! Read or write a 16 bits word at an arbitrary location. .define _get_word, _put_word _get_word: mov bx, sp call gp_getaddr mov ax, (bx) ! Word to get from addr jmp gp_ret _put_word: mov bx, sp push 6(bx) ! Word to store at addr call gp_getaddr pop (bx) ! Store the word jmp gp_ret gp_getaddr: mov ax, 2(bx) mov dx, 4(bx) call abs2seg mov bx, ax mov ds, dx ! ds:bx = addr ret gp_ret: push es pop ds ! Restore ds ret ! void relocate(void); ! After the program has copied itself to a safer place, it needs to change ! the segment registers. Caddr has already been set to the new location. .define _relocate _relocate: pop bx ! Return address mov ax, (_caddr+0) mov dx, (_caddr+2) call abs2seg mov cx, dx ! cx = new code segment mov ax, cs ! Old code segment sub ax, cx ! ax = -(new - old) = -Moving offset mov dx, ds sub dx, ax mov ds, dx ! ds += (new - old) mov es, dx mov ss, dx xor ax, ax call seg2abs mov (_daddr+0), ax mov (_daddr+2), dx ! New data address push cx ! New text segment push bx ! Return offset of this function retf ! Relocate ! void *brk(void *addr) ! void *sbrk(size_t incr) ! Cannot fail implementations of brk(2) and sbrk(3), so we can use ! malloc(3). They reboot on stack collision instead of returning -1. .sect .data .align 2 break: .data2 _end ! A fake heap pointer .sect .text .define _brk, __brk, _sbrk, __sbrk _brk: __brk: ! __brk is for the standard C compiler xor ax, ax jmp sbrk ! break= 0; return sbrk(addr); _sbrk: __sbrk: mov ax, (break) ! ax= current break sbrk: push ax ! save it as future return value mov bx, sp ! Stack is now: (retval, retaddr, incr, ...) add ax, 4(bx) ! ax= break + increment mov (break), ax ! Set new break lea dx, -1024(bx) ! sp minus a bit of breathing space cmp dx, ax ! Compare with the new break jb heaperr ! Suffocating noises pop ax ! Return old break (0 for brk) ret heaperr:push nomem call _printf call quit .sect .rom nomem: .ascii "\nOut of memory\n\0" .sect .text ! int dev_open(void); ! Open file 'vdisk' to use as the Minix virtual disk. Store handle in ! vfd. Returns 0 for success, otherwise the DOS error code. .define _dev_open _dev_open: call _dev_close ! If already open then first close mov dx, (_vdisk) ! ds:dx = Address of file name mov ax, 0x3D22 ! Open file read-write & deny write int 0x21 jnc opok ! Open succeeded? cmp ax, 5 ! Open failed, "access denied"? jne opbad mov ax, 0x3D40 ! Open file read-only int 0x21 jc opbad opok: mov (vfd), ax ! File handle to open file xor ax, ax ! Zero for success opbad: ret ! int dev_close(void); ! Close the dos virtual disk. .define _dev_close _dev_close: mov bx, -1 cmp (vfd), bx ! Already closed? je 1f movb ah, 0x3E ! Close file xchg bx, (vfd) ! bx = vfd; vfd = -1; int 0x21 jc 0f 1: xor ax, ax 0: ret ! int dev_boundary(u32_t sector); ! Returns false; files have no visible boundaries. .define _dev_boundary _dev_boundary: xor ax, ax ret ! int readsectors(u32_t bufaddr, u32_t sector, u8_t count) ! int writesectors(u32_t bufaddr, u32_t sector, u8_t count) ! Read/write several sectors from/to the Minix virtual disk. Count ! must fit in a byte. The external variable vfd is the file handle. ! Returns 0 for success, otherwise the DOS error code. ! .define _readsectors, _writesectors _writesectors: push bp mov bp, sp movb 13(bp), 0x40 ! Code for a file write jmp rwsec _readsectors: push bp mov bp, sp movb 13(bp), 0x3F ! Code for a file read rwsec: mov dx, 8(bp) mov bx, 10(bp) ! bx-dx = Sector number mov cx, 9 mul512: shl dx, 1 rcl bx, 1 ! bx-dx *= 512 loop mul512 mov cx, bx ! cx-dx = Byte position in file mov bx, (vfd) ! bx = File handle mov ax, 0x4200 ! Lseek absolute int 0x21 jb rwerr mov bx, (vfd) ! bx = File handle mov ax, 4(bp) mov dx, 6(bp) ! dx-ax = Address to transfer data to/from call abs2seg mov ds, dx mov dx, ax ! ds:dx = Address to transfer data to/from xorb cl, cl movb ch, 12(bp) ! ch = Number of sectors to transfer shl cx, 1 ! cx = Number of bytes to transfer push cx ! Save count movb ah, 13(bp) ! Read or write int 0x21 pop cx ! Restore count push es pop ds ! Restore ds jb rwerr cmp ax, cx ! All bytes transferred? je rwall mov ax, 0x05 ! The DOS code for "I/O error", but different jmp rwerr rwall: call wheel ! Display tricks xor ax, ax rwerr: pop bp ret ! int getch(void); ! Read a character from the keyboard, and check for an expired timer. ! A carriage return is changed into a linefeed for UNIX compatibility. .define _getch _getch: xor ax, ax xchg ax, (unchar) ! Ungotten character? test ax, ax jnz gotch getch: hlt ! Play dead until interrupted (see pause()) movb ah, 0x01 ! Keyboard status int 0x16 jnz press ! Keypress? call _expired ! Timer expired? test ax, ax jz getch mov ax, ESC ! Return ESC ret press: xorb ah, ah ! Read character from keyboard int 0x16 cmpb al, 0x0D ! Carriage return? jnz nocr movb al, 0x0A ! Change to linefeed nocr: cmpb al, ESC ! Escape typed? jne noesc inc (escape) ! Set flag noesc: xorb ah, ah ! ax = al gotch: ret ! int ungetch(void); ! Return a character to undo a getch(). .define _ungetch _ungetch: mov bx, sp mov ax, 2(bx) mov (unchar), ax ret ! int escape(void); ! True if ESC has been typed. .define _escape _escape: movb ah, 0x01 ! Keyboard status int 0x16 jz escflg ! Keypress? cmpb al, ESC ! Escape typed? jne escflg xorb ah, ah ! Discard the escape int 0x16 inc (escape) ! Set flag escflg: xor ax, ax xchg ax, (escape) ! Escape typed flag ret ! int putch(int c); ! Write a character in teletype mode. The putk synonym is ! for the kernel printf function that uses it. ! Newlines are automatically preceded by a carriage return. ! .define _putch, _putk _putch: _putk: mov bx, sp movb al, 2(bx) ! al = character to be printed testb al, al ! Kernel printf adds a null char to flush queue jz nulch cmpb al, 0x0A ! al = newline? jnz putc movb al, 0x20 ! Erase wheel and do a carriage return call plotc ! plotc(' '); nodirt: movb al, 0x0D call putc ! putc('\r') movb al, 0x0A ! Restore the '\n' and print it putc: movb ah, 0x0E ! Print character in teletype mode mov bx, 0x0001 ! Page 0, foreground color int 0x10 ! Call BIOS VIDEO_IO nulch: ret ! |/-\|/-\|/-\|/-\|/-\ (playtime) wheel: mov bx, (gp) movb al, (bx) inc bx ! al = *gp++; cmp bx, glyphs+4 jne 0f mov bx, glyphs 0: mov (gp), bx ! gp= gp == glyphs + 4 ? glyphs : gp; !jmp plotc plotc: movb ah, 0x0A ! 0x0A = write character at cursor mov bx, 0x0001 ! Page 0, foreground color mov cx, 0x0001 ! Just one character int 0x10 ret .sect .data .align 2 gp: .data2 glyphs glyphs: .ascii "|/-\\" .sect .text ! void pause(void); ! Wait for an interrupt using the HLT instruction. This either saves ! power, or tells an x86 emulator that nothing is happening right now. .define _pause _pause: hlt ret ! void set_mode(unsigned mode); ! void clear_screen(void); ! Set video mode / clear the screen. .define _set_mode, _clear_screen _set_mode: mov bx, sp mov ax, 2(bx) ! Video mode cmp ax, (cur_vid_mode) je modeok ! Mode already as requested? mov (cur_vid_mode), ax _clear_screen: mov ax, (cur_vid_mode) andb ah, 0x7F ! Test bits 8-14, clear bit 15 (8x8 flag) jnz xvesa ! VESA extended mode? int 0x10 ! Reset video (ah = 0) jmp mdset xvesa: mov bx, ax ! bx = extended mode mov ax, 0x4F02 ! Reset video int 0x10 mdset: testb (cur_vid_mode+1), 0x80 jz setcur ! 8x8 font requested? mov ax, 0x1112 ! Load ROM 8 by 8 double-dot patterns xorb bl, bl ! Load block 0 int 0x10 setcur: xor dx, dx ! dl = column = 0, dh = row = 0 xorb bh, bh ! Page 0 movb ah, 0x02 ! Set cursor position int 0x10 modeok: ret restore_video: ! To restore the video mode on exit movb al, 0x20 call plotc ! Erase wheel push (old_vid_mode) call _set_mode pop ax ret ! u32_t get_tick(void); ! Return the current value of the clock tick counter. This counter ! increments 18.2 times per second. Poll it to do delays. Does not ! work on the original PC, but works on the PC/XT. .define _get_tick _get_tick: xorb ah, ah ! Code for get tick count int 0x1A mov ax, dx mov dx, cx ! dx:ax = cx:dx = tick count ret ! Functions used to obtain info about the hardware. Boot uses this information ! itself, but will also pass them on to a pure 386 kernel, because one can't ! make BIOS calls from protected mode. The video type could probably be ! determined by the kernel too by looking at the hardware, but there is a small ! chance on errors that the monitor allows you to correct by setting variables. .define _get_bus ! returns type of system bus .define _get_video ! returns type of display ! u16_t get_bus(void) ! Return type of system bus, in order: XT, AT, MCA. _get_bus: call gettrueproc xor dx, dx ! Assume XT cmp ax, 286 ! An AT has at least a 286 jb got_bus inc dx ! Assume AT movb ah, 0xC0 ! Code for get configuration int 0x15 jc got_bus ! Carry clear and ah = 00 if supported testb ah, ah jne got_bus eseg movb al, 5(bx) ! Load feature byte #1 inc dx ! Assume MCA testb al, 0x02 ! Test bit 1 - "bus is Micro Channel" jnz got_bus dec dx ! Assume AT testb al, 0x40 ! Test bit 6 - "2nd 8259 installed" jnz got_bus dec dx ! It is an XT got_bus: push ds pop es ! Restore es mov ax, dx ! Return bus code mov (bus), ax ! Keep bus code, A20 handler likes to know ret ! u16_t get_video(void) ! Return type of display, in order: MDA, CGA, mono EGA, color EGA, ! mono VGA, color VGA. _get_video: mov ax, 0x1A00 ! Function 1A returns display code int 0x10 ! al = 1A if supported cmpb al, 0x1A jnz no_dc ! No display code function supported mov ax, 2 cmpb bl, 5 ! Is it a monochrome EGA? jz got_video inc ax cmpb bl, 4 ! Is it a color EGA? jz got_video inc ax cmpb bl, 7 ! Is it a monochrome VGA? jz got_video inc ax cmpb bl, 8 ! Is it a color VGA? jz got_video no_dc: movb ah, 0x12 ! Get information about the EGA movb bl, 0x10 int 0x10 cmpb bl, 0x10 ! Did it come back as 0x10? (No EGA) jz no_ega mov ax, 2 cmpb bh, 1 ! Is it monochrome? jz got_video inc ax jmp got_video no_ega: int 0x11 ! Get bit pattern for equipment and ax, 0x30 ! Isolate color/mono field sub ax, 0x30 jz got_video ! Is it an MDA? mov ax, 1 ! No it's CGA got_video: ret ! Function to leave the boot monitor and run Minix. .define _minix ! void minix(u32_t koff, u32_t kcs, u32_t kds, ! char *bootparams, size_t paramsize, u32_t aout); _minix: push bp mov bp, sp ! Pointer to arguments mov dx, 0x03F2 ! Floppy motor drive control bits movb al, 0x0C ! Bits 4-7 for floppy 0-3 are off outb dx ! Kill the motors push ds xor ax, ax ! Vector & BIOS data segments mov ds, ax andb (0x043F), 0xF0 ! Clear diskette motor status bits of BIOS pop ds cli ! No more interruptions test (_k_flags), K_I386 ! Minix-386? jnz minix386 ! Call Minix in real mode. minix86: push 22(bp) ! Address of a.out headers push 20(bp) push 18(bp) ! # bytes of boot parameters push 16(bp) ! Address of boot parameters mov dx, cs ! Monitor far return address mov ax, ret86 cmp (_mem+14), 0 ! Any extended memory? (mem[1].size > 0 ?) jnz 0f xor dx, dx ! If no ext mem then monitor not preserved xor ax, ax 0: push dx ! Push monitor far return address or zero push ax mov ax, 8(bp) mov dx, 10(bp) call abs2seg push dx ! Kernel code segment push 4(bp) ! Kernel code offset mov ax, 12(bp) mov dx, 14(bp) call abs2seg mov ds, dx ! Kernel data segment mov es, dx ! Set es to kernel data too retf ! Make a far call to the kernel ! Call 386 Minix in 386 mode. minix386: cseg mov (cs_real-2), cs ! Patch CS and DS into the instructions that cseg mov (ds_real-2), ds ! reload them when switching back to real mode mov eax, cr0 orb al, 0x01 ! Set PE (protection enable) bit o32 mov (msw), eax ! Save as protected mode machine status word mov dx, ds ! Monitor ds mov ax, p_gdt ! dx:ax = Global descriptor table call seg2abs mov (p_gdt_desc+2), ax movb (p_gdt_desc+4), dl ! Set base of global descriptor table mov ax, 12(bp) mov dx, 14(bp) ! Kernel ds (absolute address) mov (p_ds_desc+2), ax movb (p_ds_desc+4), dl ! Set base of kernel data segment mov dx, ss ! Monitor ss xor ax, ax ! dx:ax = Monitor stack segment call seg2abs ! Minix starts with the stack of the monitor mov (p_ss_desc+2), ax movb (p_ss_desc+4), dl mov ax, 8(bp) mov dx, 10(bp) ! Kernel cs (absolute address) mov (p_cs_desc+2), ax movb (p_cs_desc+4), dl mov dx, cs ! Monitor cs xor ax, ax ! dx:ax = Monitor code segment call seg2abs mov (p_mcs_desc+2), ax movb (p_mcs_desc+4), dl push MCS_SELECTOR push int86 ! Far address to INT86 support o32 push 20(bp) ! Address of a.out headers push 0 push 18(bp) ! 32 bit size of parameters on stack push 0 push 16(bp) ! 32 bit address of parameters (ss relative) push MCS_SELECTOR push ret386 ! Monitor far return address push 0 push CS_SELECTOR push 6(bp) push 4(bp) ! 32 bit far address to kernel entry point call real2prot ! Switch to protected mode mov ax, DS_SELECTOR mov ds, ax ! Kernel data mov ax, ES_SELECTOR mov es, ax ! Flat 4 Gb o32 retf ! Make a far call to the kernel ! Minix-86 returns here on a halt or reboot. ret86: mov 8(bp), ax mov 10(bp), dx ! Return value jmp return ! Minix-386 returns here on a halt or reboot. ret386: o32 mov 8(bp), eax ! Return value call prot2real ! Switch to real mode return: mov sp, bp ! Pop parameters sti ! Can take interrupts again call _get_video ! MDA, CGA, EGA, ... movb dh, 24 ! dh = row 24 cmp ax, 2 ! At least EGA? jb is25 ! Otherwise 25 rows push ds xor ax, ax ! Vector & BIOS data segments mov ds, ax movb dh, (0x0484) ! Number of rows on display minus one pop ds is25: xorb dl, dl ! dl = column 0 xorb bh, bh ! Page 0 movb ah, 0x02 ! Set cursor position int 0x10 xorb ah, ah ! Whack the disk system, Minix may have messed movb dl, 0x80 ! it up int 0x13 call gettrueproc cmp ax, 286 jb noclock xorb al, al tryclk: decb al jz noclock movb ah, 0x02 ! Get real-time clock time (from CMOS clock) int 0x1A jc tryclk ! Carry set, not running or being updated movb al, ch ! ch = hour in BCD call bcd ! al = (al >> 4) * 10 + (al & 0x0F) mulb (c60) ! 60 minutes in an hour mov bx, ax ! bx = hour * 60 movb al, cl ! cl = minutes in BCD call bcd add bx, ax ! bx = hour * 60 + minutes movb al, dh ! dh = seconds in BCD call bcd xchg ax, bx ! ax = hour * 60 + minutes, bx = seconds mul (c60) ! dx-ax = (hour * 60 + minutes) * 60 add bx, ax adc dx, 0 ! dx-bx = seconds since midnight mov ax, dx mul (c19663) xchg ax, bx mul (c19663) add dx, bx ! dx-ax = dx-bx * (0x1800B0 / (2*2*2*2*5)) mov cx, ax ! (0x1800B0 = ticks per day of BIOS clock) mov ax, dx xor dx, dx div (c1080) xchg ax, cx div (c1080) ! cx-ax = dx-ax / (24*60*60 / (2*2*2*2*5)) mov dx, ax ! cx-dx = ticks since midnight movb ah, 0x01 ! Set system time int 0x1A noclock: mov ax, 8(bp) mov dx, 10(bp) ! dx-ax = return value from the kernel pop bp ret ! Return to monitor as if nothing much happened ! Transform BCD number in al to a regular value in ax. bcd: movb ah, al shrb ah, 4 andb al, 0x0F aad ! ax = (al >> 4) * 10 + (al & 0x0F) ret ! Support function for Minix-386 to make an 8086 interrupt call. int86: mov bp, sp call prot2real o32 xor eax, eax mov es, ax ! Vector & BIOS data segments o32 eseg mov (0x046C), eax ! Clear BIOS clock tick counter sti ! Enable interrupts movb al, 0xCD ! INT instruction movb ah, 8(bp) ! Interrupt number? testb ah, ah jnz 0f ! Nonzero if INT, otherwise far call push cs push intret+2 ! Far return address o32 push 12(bp) ! Far driver address mov ax, 0x90CB ! RETF; NOP 0: cseg mov (intret), ax ! Patch `INT n' or `RETF; NOP' into code mov ds, 16(bp) ! Load parameters mov es, 18(bp) o32 mov eax, 20(bp) o32 mov ebx, 24(bp) o32 mov ecx, 28(bp) o32 mov edx, 32(bp) o32 mov esi, 36(bp) o32 mov edi, 40(bp) o32 mov ebp, 44(bp) intret: int 0xFF ! Do the interrupt or far call o32 push ebp ! Save results o32 pushf mov bp, sp o32 pop 8+8(bp) ! eflags mov 8+16(bp), ds mov 8+18(bp), es o32 mov 8+20(bp), eax o32 mov 8+24(bp), ebx o32 mov 8+28(bp), ecx o32 mov 8+32(bp), edx o32 mov 8+36(bp), esi o32 mov 8+40(bp), edi o32 pop 8+44(bp) ! ebp cli ! Disable interrupts xor ax, ax mov ds, ax ! Vector & BIOS data segments o32 mov cx, (0x046C) ! Collect lost clock ticks in ecx mov ax, ss mov ds, ax ! Restore monitor ds call real2prot mov ax, DS_SELECTOR ! Kernel data mov ds, ax o32 retf ! Return to the kernel ! Switch from real to protected mode. real2prot: movb ah, 0x02 ! Code for A20 enable call gate_A20 lgdt (p_gdt_desc) ! Global descriptor table o32 mov eax, (pdbr) ! Load page directory base register mov cr3, eax mov eax, cr0 o32 xchg eax, (msw) ! Exchange real mode msw for protected mode msw mov cr0, eax jmpf MCS_SELECTOR:cs_prot ! Set code segment selector cs_prot: mov ax, SS_SELECTOR ! Set data selectors mov ds, ax mov es, ax mov ss, ax ret ! Switch from protected to real mode. prot2real: lidt (p_idt_desc) ! Real mode interrupt vectors mov eax, cr3 o32 mov (pdbr), eax ! Save page directory base register mov eax, cr0 o32 xchg eax, (msw) ! Exchange protected mode msw for real mode msw mov cr0, eax jmpf 0xDEAD:cs_real ! Reload cs register cs_real: mov ax, 0xBEEF ds_real: mov ds, ax ! Reload data segment registers mov es, ax mov ss, ax xorb ah, ah ! Code for A20 disable !jmp gate_A20 ! Enable (ah = 0x02) or disable (ah = 0x00) the A20 address line. gate_A20: cmp (bus), 2 ! PS/2 bus? je gate_PS_A20 call kb_wait movb al, 0xD1 ! Tell keyboard that a command is coming outb 0x64 call kb_wait movb al, 0xDD ! 0xDD = A20 disable code if ah = 0x00 orb al, ah ! 0xDF = A20 enable code if ah = 0x02 outb 0x60 call kb_wait movb al, 0xFF ! Pulse output port outb 0x64 call kb_wait ! Wait for the A20 line to settle down ret kb_wait: inb 0x64 testb al, 0x02 ! Keyboard input buffer full? jnz kb_wait ! If so, wait ret gate_PS_A20: ! The PS/2 can twiddle A20 using port A inb 0x92 ! Read port A andb al, 0xFD orb al, ah ! Set A20 bit to the required state outb 0x92 ! Write port A jmp .+2 ! Small delay A20ok: inb 0x92 ! Check port A andb al, 0x02 cmpb al, ah ! A20 line settled down to the new state? jne A20ok ! If not then wait ret .sect .rom .align 4 c60: .data2 60 ! Constants for MUL and DIV c1024: .data2 1024 c1080: .data2 1080 c19663: .data2 19663 .sect .data .align 4 ! Global descriptor tables. UNSET = 0 ! Must be computed ! For "Extended Memory Block Move". x_gdt: x_null_desc: ! Null descriptor .data2 0x0000, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 x_gdt_desc: ! Descriptor for this descriptor table .data2 6*8-1, UNSET .data1 UNSET, 0x00, 0x00, 0x00 x_src_desc: ! Source segment descriptor .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 x_dst_desc: ! Destination segment descriptor .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 x_bios_desc: ! BIOS segment descriptor (scratch for int 0x15) .data2 UNSET, UNSET .data1 UNSET, UNSET, UNSET, UNSET x_ss_desc: ! BIOS stack segment descriptor (scratch for int 0x15) .data2 UNSET, UNSET .data1 UNSET, UNSET, UNSET, UNSET ! Protected mode descriptor table. p_gdt: p_null_desc: ! Null descriptor .data2 0x0000, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 p_gdt_desc: ! Descriptor for this descriptor table .data2 8*8-1, UNSET .data1 UNSET, 0x00, 0x00, 0x00 p_idt_desc: ! Real mode interrupt descriptor table descriptor .data2 0x03FF, 0x0000 .data1 0x00, 0x00, 0x00, 0x00 p_ds_desc: ! Kernel data segment descriptor (4Gb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0xCF, 0x00 p_es_desc: ! Physical memory descriptor (4Gb flat) .data2 0xFFFF, 0x0000 .data1 0x00, 0x92, 0xCF, 0x00 p_ss_desc: ! Monitor data segment descriptor (64Kb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x92, 0x00, 0x00 p_cs_desc: ! Kernel code segment descriptor (4Gb flat) .data2 0xFFFF, UNSET .data1 UNSET, 0x9A, 0xCF, 0x00 p_mcs_desc: ! Monitor code segment descriptor (64 kb flat) (unused) .data2 0xFFFF, UNSET .data1 UNSET, 0x9A, 0x00, 0x00 xms_handle: .data2 -1 ! Handle of allocated XMS block vfd: .data2 -1 ! Virtual disk file handle .sect .bss .comm xms_driver, 4 ! Vector to XMS driver .comm old_vid_mode, 2 ! Video mode at startup .comm cur_vid_mode, 2 ! Current video mode .comm msw, 4 ! Saved machine status word (cr0) .comm pdbr, 4 ! Saved page directory base register (cr3) .comm escape, 2 ! Escape typed? .comm bus, 2 ! Saved return value of _get_bus .comm unchar, 2 ! Char returned by ungetch(c) ! Mkfhead.s - DOS & BIOS support for mkfile.c Author: Kees J. Bot ! 9 May 1998 ! ! This file contains the startup and low level support for the MKFILE.COM ! utility. See doshead.ack.s for more comments on .COM files. ! .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define _PSP _PSP: .space 256 ! Program Segment Prefix mkfile: cld ! C compiler wants UP xor ax, ax ! Zero mov di, _edata ! Start of bss is at end of data mov cx, _end ! End of bss (begin of heap) sub cx, di ! Number of bss bytes shr cx, 1 ! Number of words rep stos ! Clear bss xor cx, cx ! cx = argc xor bx, bx push bx ! argv[argc] = NULL movb bl, (_PSP+0x80) ! Argument byte count 0: movb _PSP+0x81(bx), ch ! Null terminate dec bx js 9f cmpb _PSP+0x81(bx), 0x20 ! Whitespace? jbe 0b 1: dec bx ! One argument character js 2f cmpb _PSP+0x81(bx), 0x20 ! More argument characters? ja 1b 2: lea ax, _PSP+0x81+1(bx) ! Address of argument push ax ! argv[n] inc cx ! argc++; test bx, bx jns 0b ! More arguments? 9: movb _PSP+0x81(bx), ch ! Make a null string lea ax, _PSP+0x81(bx) push ax ! to use as argv[0] inc cx ! Final value of argc mov ax, sp push ax ! argv push cx ! argc call _main ! main(argc, argv) push ax call _exit ! exit(main(argc, argv)) ! int creat(const char *path, mode_t mode) ! Create a file with the old creat() call. .define _creat _creat: mov bx, sp mov dx, 2(bx) ! Filename xor cx, cx ! Ignore mode, always read-write movb ah, 0x3C ! "CREAT" dos: int 0x21 ! ax = creat(path, 0666); jc seterrno ret seterrno: mov (_errno), ax ! Set errno to the DOS error code mov ax, -1 cwd ! return -1L; ret ! int open(const char *path, int oflag) ! Open a file with the oldfashioned two-argument open() call. .define _open _open: mov bx, sp mov dx, 2(bx) ! Filename movb al, 4(bx) ! O_RDONLY, O_WRONLY, O_RDWR movb ah, 0x3D ! "OPEN" jmp dos ! int close(int fd) ! Close an open file. .define _close _close: mov bx, sp mov bx, 2(bx) ! bx = file handle movb ah, 0x3E ! "CLOSE" jmp dos ! void exit(int status) ! void _exit(int status) ! Return to DOS. .define _exit, __exit, ___exit _exit: __exit: ___exit: pop ax pop ax ! al = status movb ah, 0x4C ! "EXIT" int 0x21 hlt ! ssize_t read(int fd, void *buf, size_t n) ! Read bytes from an open file. .define _read _read: mov bx, sp mov cx, 6(bx) mov dx, 4(bx) mov bx, 2(bx) movb ah, 0x3F ! "READ" jmp dos ! ssize_t write(int fd, const void *buf, size_t n) ! Write bytes to an open file. .define _write _write: mov bx, sp mov cx, 6(bx) mov dx, 4(bx) mov bx, 2(bx) movb ah, 0x40 ! "WRITE" jmp dos ! off_t lseek(int fd, off_t offset, int whence) ! Set file position for read or write. .define _lseek _lseek: mov bx, sp movb al, 8(bx) ! SEEK_SET, SEEK_CUR, SEEK_END mov dx, 4(bx) mov cx, 6(bx) ! cx:dx = offset mov bx, 2(bx) movb ah, 0x42 ! "LSEEK" jmp dos ...CMakefileDaal_adventtashautilawkbcbyacc cawf' de0 dis889 ellee elvis flex-2.3.7 ftp ftpd i386( i86+ ibm< cronD dhcpdL kermita m4t make mined patch reboot scripts sh simpleO talkY talkdd telneti telnetdr yap zmodem rlogind urlget12854 4039 include/a.out.h 29626 418 include/alloca.h 38914 1999 include/ansi.h 15284 1035 include/assert.h 63917 1636 include/configfile.h 18970 2418 include/ctype.h 02501 9177 include/curses.h 45344 2016 include/dirent.h 11962 6035 include/errno.h 06865 2761 include/fcntl.h 36951 1168 include/float.h 20185 740 include/grp.h 01900 2880 include/ibm/cmos.h 28321 458 include/ibm/diskparm.h 08963 1657 include/ibm/int86.h 27115 1090 include/ibm/partition.h 04371 991 include/ibm/portio.h 45729 1171 include/lib.h 58935 4071 include/limits.h 19097 1340 include/locale.h 54176 1392 include/math.h 13358 1187 include/mathconst.h 26071 1558 include/minix/callnr.h 37432 611 include/minix/cdrom.h 24395 9038 include/minix/com.h 62321 5967 include/minix/config.h 45544 4216 include/minix/const.h 16912 988 include/minix/dl_eth.h 14710 554 include/minix/fslib.h 29684 1970 include/minix/jmp_buf.h 61078 3805 include/minix/keymap.h 43307 712 include/minix/minlib.h 54906 525 include/minix/partition.h 43140 812 include/minix/sound.h 58706 942 include/minix/swap.h 05203 2105 include/minix/syslib.h 49985 3831 include/minix/type.h 57431 933 include/minix/u64.h 43136 3025 include/net/gen/dhcp.h 06827 261 include/net/gen/eth_hdr.h 26462 2322 include/net/gen/eth_io.h 13419 438 include/net/gen/ether.h 43221 1014 include/net/gen/icmp.h 00003 867 include/net/gen/icmp_hdr.h 04604 528 include/net/gen/if_ether.h 46791 716 include/net/gen/in.h 26913 340 include/net/gen/inet.h 08566 743 include/net/gen/ip_hdr.h 24765 1309 include/net/gen/ip_io.h 34373 3928 include/net/gen/nameser.h 04226 4889 include/net/gen/netdb.h 05838 222 include/net/gen/oneCsum.h 05867 382 include/net/gen/psip_hdr.h 42373 409 include/net/gen/psip_io.h 58277 4136 include/net/gen/resolv.h 28096 1432 include/net/gen/rip.h 53590 588 include/net/gen/route.h 52712 1356 include/net/gen/socket.h 42558 360 include/net/gen/tcp.h 16378 794 include/net/gen/tcp_hdr.h 04396 1502 include/net/gen/tcp_io.h 35011 240 include/net/gen/udp.h 27307 464 include/net/gen/udp_hdr.h 57170 1237 include/net/gen/udp_io.h 04573 1583 include/net/gen/vjhc.h 64255 2428 include/net/hton.h 65465 484 include/net/netlib.h 09073 943 include/pwd.h 06356 804 include/regexp.h 13694 5848 include/setjmp.h 04022 2846 include/sgtty.h 37254 4521 include/signal.h 12749 2859 include/stdarg.h 22676 656 include/stddef.h 24703 5174 include/stdio.h 59896 2850 include/stdlib.h 30121 2500 include/string.h 32657 1139 include/sys/asynchio.h 06891 262 include/sys/dir.h 12234 5029 include/sys/ioctl.h 53742 1394 include/sys/mtio.h 11313 827 include/sys/ptrace.h 04267 3552 include/sys/sigcontext.h 33734 3018 include/sys/stat.h 06923 1369 include/sys/svrctl.h 33089 443 include/sys/times.h 44104 4173 include/sys/types.h 05036 394 include/sys/utsname.h 18247 1374 include/sys/wait.h 51086 1313 include/tar.h 48167 425 include/termcap.h 24826 8613 include/termios.h 59905 2210 include/time.h 43787 4581 include/tools.h 04296 630 include/ttyent.h 48039 6352 include/unistd.h 54399 378 include/utime.h 24223 1086 include/utmp.h 61264 1813 src/LICENSE 08069 801 src/Makefile 39846 2496 src/boot/Makefile 15610 631 src/boot/a.out2com 15262 39400 src/boot/boot.c 21648 5581 src/boot/boot.h 53857 8196 src/boot/bootblock.s 51904 35204 src/boot/boothead.s 01758 18123 src/boot/bootimage.c 61063 34604 src/boot/doshead.s 24477 197 src/boot/image.h 27354 21177 src/boot/installboot.c 64775 7530 src/boot/jumpboot.s 27834 6581 src/boot/masterboot.s 50027 2938 src/boot/mkfhead.s 32680 3883 src/boot/mkfile.c 54753 7904 src/boot/rawfs.c 45214 1357 src/boot/rawfs.h 18311 1142 src/commands/Makefile 00068 746 src/commands/aal/Makefile 39342 508 src/commands/aal/arch.h 58746 15510 src/commands/aal/archiver.c 21786 220 src/commands/aal/byte_order.h 07100 1772 src/commands/aal/format.c 21240 683 src/commands/aal/local.h 47153 1386 src/commands/aal/long2str.c 44408 1753 src/commands/aal/object.h 00077 3584 src/commands/aal/out.h 29347 244 src/commands/aal/param.h 30073 691 src/commands/aal/print.c 25361 981 src/commands/aal/ranlib.h 39789 4538 src/commands/aal/rd.c 30158 846 src/commands/aal/rd_arhdr.c 28230 785 src/commands/aal/rd_bytes.c 08065 342 src/commands/aal/rd_unsig2.c 10760 702 src/commands/aal/sprint.c 04851 499 src/commands/aal/system.c 54657 1053 src/commands/aal/system.h 31773 587 src/commands/aal/varargs.h 41021 736 src/commands/aal/wr_arhdr.c 56816 753 src/commands/aal/wr_bytes.c 38847 320 src/commands/aal/wr_int2.c 24166 329 src/commands/aal/wr_long.c 53809 819 src/commands/aal/wr_ranlib.c 38983 395 src/commands/aal/write.c 47429 1573 src/commands/advent/Makefile 51223 24181 src/commands/advent/advcave.h 17715 2156 src/commands/advent/advdec.h 60880 2840 src/commands/advent/advent.c 05406 9304 src/commands/advent/advent.h 05395 33686 src/commands/advent/advent1.txt 37072 11124 src/commands/advent/advent2.txt 28923 10624 src/commands/advent/advent3.txt 11378 32258 src/commands/advent/advent4.txt 40873 2424 src/commands/advent/database.c 15937 17475 src/commands/advent/english.c 22074 11089 src/commands/advent/initial.c 56658 11174 src/commands/advent/itverb.c 28326 5388 src/commands/advent/score.c 44358 2499 src/commands/advent/setup.c 29202 6763 src/commands/advent/travel.c 26343 15383 src/commands/advent/turn.c 47503 13819 src/commands/advent/utility.c 19923 39428 src/commands/advent/verb.c 05750 14422 src/commands/advent/vocab.c 37385 2624 src/commands/ash/Makefile 10613 16794 src/commands/ash/TOUR 17956 2230 src/commands/ash/bltin/LICENSE 48357 617 src/commands/ash/bltin/binary_op 27993 1011 src/commands/ash/bltin/bltin.h 34742 1795 src/commands/ash/bltin/catf.c 53366 1460 src/commands/ash/bltin/echo.c 08413 422 src/commands/ash/bltin/error.c 62326 11137 src/commands/ash/bltin/expr.c 03743 562 src/commands/ash/bltin/line.c 12117 1653 src/commands/ash/bltin/makefile.not 58662 1602 src/commands/ash/bltin/mkexpr 32372 613 src/commands/ash/bltin/nlecho.c 07905 5072 src/commands/ash/bltin/regexp.c 42820 413 src/commands/ash/bltin/stalloc.c 63512 461 src/commands/ash/bltin/umask.c 31684 680 src/commands/ash/bltin/unary_op 38557 3034 src/commands/ash/builtins.table 30546 8499 src/commands/ash/cd.c 48857 4885 src/commands/ash/dirent.c 50419 6299 src/commands/ash/error.c 44242 4132 src/commands/ash/error.h 10488 20289 src/commands/ash/eval.c 27918 2726 src/commands/ash/eval.h 08493 17594 src/commands/ash/exec.c 40583 2779 src/commands/ash/exec.h 19014 23554 src/commands/ash/expand.c 41129 2392 src/commands/ash/expand.h 25463 2116 src/commands/ash/funcs/cmv 23262 2518 src/commands/ash/funcs/dirs 50031 2103 src/commands/ash/funcs/kill 40600 1981 src/commands/ash/funcs/login 23210 1937 src/commands/ash/funcs/newgrp 37963 2518 src/commands/ash/funcs/popd 47701 2519 src/commands/ash/funcs/pushd 61148 1957 src/commands/ash/funcs/suspend 64039 2093 src/commands/ash/init.h 43481 9235 src/commands/ash/input.c 17914 3112 src/commands/ash/input.h 11431 22743 src/commands/ash/jobs.c 18927 3421 src/commands/ash/jobs.h 37390 2256 src/commands/ash/machdep.h 48887 3355 src/commands/ash/mail.c 27082 2018 src/commands/ash/mail.h 44987 7839 src/commands/ash/main.c 03802 2181 src/commands/ash/main.h 02080 7028 src/commands/ash/memalloc.c 30807 3514 src/commands/ash/memalloc.h 21414 4152 src/commands/ash/miscbltin.c 15798 3211 src/commands/ash/mkbuiltins 42000 11375 src/commands/ash/mkinit.c 60806 10540 src/commands/ash/mknodes.c 18299 5331 src/commands/ash/mksignames.c 07847 9059 src/commands/ash/mksyntax.c 06587 3279 src/commands/ash/mktokens 61008 4193 src/commands/ash/mystring.c 30334 2840 src/commands/ash/mystring.h 37335 4292 src/commands/ash/nodes.c.pat 49690 5202 src/commands/ash/nodetypes 01572 8935 src/commands/ash/option)'+','-'.'/'0'1'2'3'4'5'6'7'8'9':';'<'='>'?'@'A'B'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'['\']'^'_'`'a'b'c'd'e'f'g'h'i'j'k'l'm'n'o'p'q's.c 50357 3263 src/commands/ash/options.h 17796 10290 src/commands/ash/output.c 29142 3122 src/commands/ash/output.h 02994 29858 src/commands/ash/parser.c 46875 3002 src/commands/ash/parser.h 39763 8365 src/commands/ash/redir.c 04650 2381 src/commands/ash/redir.h 32059 3565 src/commands/ash/shell.h 39010 7434 src/commands/ash/show.c 11224 281 src/commands/ash/sys/cdefs.h 33191 32050 src/commands/ash/test/malloc.c 13684 6938 src/commands/ash/trap.c 12684 2250 src/commands/ash/trap.h 62524 13252 src/commands/ash/var.c 36493 4021 src/commands/ash/var.h 48349 376 src/commands/autil/Makefile 25630 5966 src/commands/autil/anm.c 38682 1564 src/commands/autil/asize.c 26708 3584 src/commands/autil/out.h 46145 440 src/commands/awk/Makefile 13373 1815 src/commands/awk/NOTE 37730 567 src/commands/awk/README 52122 4440 src/commands/awk/awk.h 26059 16994 src/commands/awk/e.c 38356 740 src/commands/awk/k.c 46043 6392 src/commands/awk/l.c 01637 2427 src/commands/awk/m.c 09684 2693 src/commands/awk/n.c 40499 10532 src/commands/awk/r.c 32561 31391 src/commands/awk/regexp.c 64220 638 src/commands/awk/regexp.h 00591 12963 src/commands/awk/v.c 47879 17619 src/commands/awk/y.c 62276 17984 src/commands/bc/COPYING 30802 1727 src/commands/bc/Makefile 19704 43648 src/commands/bc/bc.c 58885 14817 src/commands/bc/bc.y 52747 4227 src/commands/bc/bcdefs.h 49096 94 src/commands/bc/config.h 65224 2535 src/commands/bc/const.h 37995 17712 src/commands/bc/execute.c 28981 93 src/commands/bc/fix_math.h 55469 1467 src/commands/bc/global.c 06187 2904 src/commands/bc/global.h 19963 5372 src/commands/bc/libmath.b 37171 7338 src/commands/bc/load.c 39685 4685 src/commands/bc/main.c 34000 31825 src/commands/bc/number.c 53362 1957 src/commands/bc/number.h 36338 6277 src/commands/bc/proto.h 62563 10843 src/commands/bc/sbc.y 36766 36253 src/commands/bc/scan.c 36355 5251 src/commands/bc/scan.l 36397 20421 src/commands/bc/storage.c 15021 16346 src/commands/bc/util.c 29573 102 src/commands/bc/version.h 38008 731 src/commands/bc/y.tab.h 58077 771 src/commands/byacc/ACKNOWLEDGEMEN 61109 1075 src/commands/byacc/MANIFEST 29639 1330 src/commands/byacc/Makefile 52844 2050 src/commands/byacc/NEW_FEATURES 18606 504 src/commands/byacc/NOTES 11676 156 src/commands/byacc/NO_WARRANTY 41483 1152 src/commands/byacc/README 20311 4275 src/commands/byacc/closure.c 31773 6214 src/commands/byacc/defs.h 25413 6051 src/commands/byacc/error.c 50677 10213 src/commands/byacc/lalr.c 02159 9587 src/commands/byacc/lr0.c 49919 6653 src/commands/byacc/main.c 57482 6316 src/commands/byacc/mkpar.c 65170 22738 src/commands/byacc/output.c 44189 30469 src/commands/byacc/reader.c 28490 8596 src/commands/byacc/skeleton.c 52043 1841 src/commands/byacc/symtab.c 21140 6329 src/commands/byacc/verbose.c 18176 1191 src/commands/byacc/warshall.c 18348 2731 src/commands/cawf/Makefile 19314 9585 src/commands/cawf/README 25403 1681 src/commands/cawf/ansi.h 03187 4130 src/commands/cawf/bsfilt.c 21913 11810 src/commands/cawf/cawf.c 62351 9786 src/commands/cawf/cawf.h 07967 1355 src/commands/cawf/cawflib.h 58136 189 src/commands/cawf/common 56980 9225 src/commands/cawf/device.c 29366 1797 src/commands/cawf/device.cf 62049 5730 src/commands/cawf/diffs 35771 2771 src/commands/cawf/dumb.dev 13898 2427 src/commands/cawf/error.c 53406 7221 src/commands/cawf/expand.c 09875 3692 src/commands/cawf/expr.c 26529 1644 src/commands/cawf/getopt.c 56053 3987 src/commands/cawf/macsup.c 52053 2712 src/commands/cawf/man.mac 30994 2605 src/commands/cawf/me.mac 36536 1510 src/commands/cawf/mnx.mac 23215 2426 src/commands/cawf/ms.mac 06251 17708 src/commands/cawf/nreq.c 59220 2209 src/commands/cawf/output.c 32875 19925 src/commands/cawf/pass2.c 16109 13228 src/commands/cawf/pass3.c 41449 4345 src/commands/cawf/proto.h 56723 299 src/commands/cawf/regerror.c 30957 29346 src/commands/cawf/regexp.c 64581 551 src/commands/cawf/regexp.h 30424 153 src/commands/cawf/regmagic.h 36699 7997 src/commands/cawf/store.c 39972 7055 src/commands/cawf/string.c 55718 581 src/commands/cron/Makefile 33417 10626 src/commands/cron/cron.c 49722 5451 src/commands/cron/crontab.c 16220 1263 src/commands/cron/misc.c 64004 940 src/commands/cron/misc.h 41195 19073 src/commands/cron/tab.c 34927 2189 src/commands/cron/tab.h 48502 318 src/commands/de/Makefile 20628 6269 src/commands/de/README 17773 24376 src/commands/de/de.c 44577 10912 src/commands/de/de.h 30523 8236 src/commands/de/de_diskio.c 61882 13077 src/commands/de/de_recover.c 22958 5089 src/commands/de/de_stdin.c 39063 25794 src/commands/de/de_stdout.c 12634 335 src/commands/dhcpd/Makefile 11670 768 src/commands/dhcpd/arp.h 57398 7469 src/commands/dhcpd/devices.c 57340 37227 src/commands/dhcpd/dhcpd.c 40485 5927 src/commands/dhcpd/dhcpd.h 37022 5780 src/commands/dhcpd/ether.c 01506 24840 src/commands/dhcpd/tags.c 54011 1648 src/commands/dis88/Makefile 17960 11073 src/commands/dis88/README 21510 5625 src/commands/dis88/dis.h 03273 5589 src/commands/dis88/disfp.c 61857 25688 src/commands/dis88/dishand.c 57529 17926 src/commands/dis88/dismain.c 16516 777 src/commands/dis88/disrel.c 12188 30238 src/commands/dis88/distabs.c 59311 1815 src/commands/elle/Makefile 58774 7235 src/commands/elle/deffun.e 06866 8140 src/commands/elle/defprf.c 00916 8822 src/commands/elle/defprf.e 59047 1426 src/commands/elle/eebit.c 21644 26206 src/commands/elle/eebuff.c 29470 7485 src/commands/elle/eecmds.c 42615 7989 src/commands/elle/eediag.c 55413 51996 src/commands/elle/eedisp.c 46032 15535 src/commands/elle/eeedit.c 48064 4693 src/commands/elle/eeerr.c 14815 6145 src/commands/elle/eef1.c 60630 6029 src/commands/elle/eef2.c 30083 6514 src/commands/elle/eef3.c 36925 11340 src/commands/elle/eefd.c 52218 7900 src/commands/elle/eefdef.h 14526 6091 src/commands/elle/eefed.c 39137 9857 src/commands/elle/eefidx.h 38843 20398 src/commands/elle/eefile.c 10454 15418 src/commands/elle/eefill.c 28627 1791 src/commands/elle/eehelp.c 63064 4270 src/commands/elle/eekmac.c 23964 12233 src/commands/elle/eemain.c 49963 7081 src/commands/elle/eemake.c 31203 494 src/commands/elle/eeprof.h 29193 16066 src/commands/elle/eeproto.h 15996 4678 src/commands/elle/eequer.c 57240 9404 src/commands/elle/eeques.c 07314 1471 src/commands/elle/eesigs.h 18277 9798 src/commands/elle/eesite.c 10662 6097 src/commands/elle/eesite.h 50379 7011 src/commands/elle/eesrch.c 18312 30962 src/commands/elle/eeterm.c 30771 3635 src/commands/elle/eevini.c 09712 12985 src/commands/elle/elle.h 48711 32681 src/commands/elle/ellec.c 05810 10659 src/commands/elle/sb.h 12292 1639 src/commands/elle/sbbcpy.c 56702 18054 src/commands/elle/sberr.c 45816 30825 src/commands/elle/sbm.c 59486 5360 src/commands/elle/sbproto.h 60525 66267 src/commands/elle/sbstr.c 62583 1508 src/commands/elle/sbvall.c 60704 132727 src/commands/elvis/Doc.sh 52074 3415 src/commands/elvis/Knownbug.txt 36190 2528 src/commands/elvis/Makedoc 60721 2531 src/commands/elvis/Makefile 02561 15958 src/commands/elvis/Man.sh 34961 1238 src/commands/elvis/Readme.txt 07709 9257 src/commands/elvis/blk.c 13768 34255 src/commands/elvis/cmd1.c 30512 17549 src/commands/elvis/cmd2.c 47589 12930 src/commands/elvis/config.h 57013 18413 src/commands/elvis/ctags.c 45102 1975 src/commands/elvis/ctype.c 13686 1265 src/commands/elvis/ctype.h 35078 19465 src/commands/elvis/curses.c 13711 10677 src/commands/elvis/curses.h 34454 13532 src/commands/elvis/cut.c 53307 6744 src/commands/elvis/elvprsv.c 14780 3873 src/commands/elvis/elvrec.c 07832 16377 src/commands/elvis/ex.c 51862 5076 src/commands/elvis/fmt.c 61280 16523 src/commands/elvis/input.c 16836 10230 src/commands/elvis/main.c 61624 2166 src/commands/elvis/misc.c 57105 9840 src/commands/elvis/modify.c 37051 10246 src/commands/elvis/move1.c 58606 5394 src/commands/elvis/move2.c 19844 2697 src/commands/elvis/move3.c 01396 3635 src/commands/elvis/move4.c 63985 4290 src/commands/elvis/move5.c 47586 17258 src/commands/elvis/opts.c 41358 2507 src/commands/elvis/prsvunix.c 13925 3808 src/commands/elvis/recycle.c 06023 25582 src/commands/elvis/redraw.c 30055 11129 src/commands/elvis/ref.c 46334 18740 src/commands/elvis/regexp.c 12538 579 src/commands/elvis/regexp.h 06067 4781 src/commands/elvis/regsub.c 05935 8702 src/commands/elvis/system.c 12873 4818 src/commands/elvis/tinyprnt.c 18960 10399 src/commands/elvis/tinytcap.c 12410 21216 src/commands/elvis/tio.c 39263 16591 src/commands/elvis/tmp.c 63173 4855 src/commands/elvis/unix.c 54023 3561 src/commands/elvis/vars.c 30928 17304 src/commands/elvis/vcmd.c 61883 21067 src/commands/elvis/vi.c 07708 20697 src/commands/elvis/vi.h 18662 1802 src/commands/flex-2.3.7/COPYING 50841 12614 src/commands/flex-2.3.7/Changes 54043 4364 src/commands/flex-2.3.7/Makefile 48033 1599 src/commands/flex-2.3.7/README 59835 4115 src/commands/flex-2.3.7/ccl.c 61191 26919 src/commands/flex-2.3.7/dfa.c 38629 8758 src/commands/flex-2.3.7/ecs.c 22604 19796 src/commands/flex-2.3.7/flex.skel 37306 29063 src/commands/flex-2.3.7/flexdef.h 49518 31617 src/commands/flex-2.3.7/gen.c 11761 67749 src/commands/flex-2.3.7/initscan.c 56475 256 src/commands/flex-2.3.7/libmain.c 54791 19459 src/commands/flex-2.3.7/main.c 55179 14912 src/commands/flex-2.3.7/misc.c 23922 17603 src/commands/flex-2.3.7/nfa.c 42787 14498 src/commands/flex-2.3.7/parse.y 11761 67749 src/commands/flex-2.3.7/scan.c 60928 12439 src/commands/flex-2.3.7/scan.l 49468 7527 src/commands/flex-2.3.7/sym.c 40733 25169 src/commands/flex-2.3.7/tblcmp.c 45172 4244 src/commands/flex-2.3.7/yylex.c 51419 587 src/commands/ftp/Makefile 29187 13525 src/commands/ftp/file.c 63391 861 src/commands/ftp/file.h 47534 7364 src/commands/ftp/ftp.c 58785 681 src/commands/ftp/ftp.h 41899 1932 src/commands/ftp/local.c 43142 352 src/commands/ftp/local.h 07407 8469 src/commands/ftp/net.c 30522 326 src/commands/ftp/net.h 39246 2384 src/commands/ftp/other.c 39220 421 src/commands/ftp/other.h 06134 666 src/commands/ftpd/Makefile 22116 2490 src/commands/ftpd/access.c 18101 272 src/commands/ftpd/access.h 63891 19932 src/commands/ftpd/file.c 19181 1033 src/commands/ftpd/file.h 32795 6386 src/commands/ftpd/ftpd.c 12001 694 src/commands/ftpd/ftpd.h 08732 8994 src/commands/ftpd/net.c 26344 307 src/commands/ftpd/net.h 62497 1980 src/commands/ftpd/setup.anonftp 09766 512 src/commands/i386/Makefile 37977 58501 src/commands/i386/acd.c 22917 726 src/commands/i386/asmconv/Makefile 36465 1649 src/commands/i386/asmconv/asm86.c 09400 4663 src/commands/i386/asmconv/asm86.h 09257 3830 src/commands/i386/asmconv/asmconv.c 29936 710 src/commands/i386/asmconv/asmconv.h 64333 14055 src/commands/i386/asmconv/emit_ack.c 52546 15807 src/commands/i386/asmconv/emit_gnu.c 41436 678 src/commands/i386/asmconv/languages.h 20948 21988 src/commands/i386/asmconv/parse_ack.c 65244 23086 src/commands/i386/asmconv/parse_bas.c 16959 20834 src/commands/i386/asmconv/parse_gnu.c 43316 1642 src/commands/i386/asmconv/syntax.ack 37318 669 src/commands/i386/asmconv/token.h 23387 5591 src/commands/i386/asmconv/tokenize.c 53917 18194 src/commands/i386/mtools-3.9.7/COPYING 65164 11025 src/commands/i386/mtools-3.9.7/Makefile 42668 1794 src/commands/i386/mtools-3.9.7/README 59013 8492 src/commands/i386/mtools-3.9.7/buffer.c 53608 175 src/commands/i386/mtools-3.9.7/buffer.h 55338 746 src/commands/i386/mtools-3.9.7/codepage.h 15542 19046 src/commands/i386/mtools-3.9.7/config.c 52475 8029 src/commands/i386/mtools-3.9.7/config.h 02348 1105 src/commands/i386/mtools-3.9.7/copyfile.c 27010 26246 src/commands/i386/mtools-3.9.7/devices.c 57260 3385 src/commands/i386/mtools-3.9.7/devices.h 53809 6850 src/commands/i386/mtools-3.9.7/dirCache.c 20076 1077 src/commands/i386/mtools-3.9.7/dirCache.h 42189 2494 src/commands/i386/mtools-3.9.7/directory.c 33555 2200 src/commands/i386/mtools-3.9.7/direntry.c 52881 1396 src/commands/i386/mtools-3.9.7/expand.c 22585 21647 src/commands/i386/mtools-3.9.7/fat.c 03917 1210 src/commands/i386/mtools-3.9.7/fat_free.c 26647 14255 src/commands/i386/mtools-3.9.7/file.c 18912 259 src/commands/i386/mtools-3.9.7/file.h 34132 4152 src/commands/i386/mtools-3.9.7/file_name.c 36356 641 src/commands/i386/mtools-3.9.7/file_read.c 12338 2460 src/commands/i386/mtools-3.9.7/filter.c 36604 10133 src/commands/i386/mtools-3.9.7/floppyd_io.c 32499 645 src/commands/i386/mtools-3.9.7/floppyd_io.h 41990 852 src/commands/i386/mtools-3.9.7/force_io.c 40191 520 src/commands/i386/mtools-3.9.7/fs.h 00107 2001 src/commands/i386/mtools-3.9.7/fsP.h 61213 4564 src/commands/i386/mtools-3.9.7/hash.c 32997 522 src/commands/i386/mtools-3.9.7/htable.h 58421 8986 src/commands/i386/mtools-3.9.7/init.c 15663 1874 src/commands/i386/mtools-3.9.7/llong.c 23263 1694 src/commands/i386/mtools-3.9.7/llong.h 40172 12049 src/commands/i386/mtools-3.9.7/mainloop.c 48654 2641 src/commands/i386/mtools-3.9.7/mainloop.h 11834 2427 src/commands/i386/mtools-3.9.7/match.c 48039 4209 src/commands/i386/mtools-3.9.7/mattrib.c 28842 1558 src/commands/i386/mtools-3.9.7/mbadblocks.c 18579 2792 src/commands/i386/mtools-3.9.7/mcat.c 12979 836 src/commands/i386/mtools-3.9.7/mcd.c 54669 12104 src/commands/i386/mtools-3.9.7/mcopy.c 40038 3317 src/commands/i386/mtools-3.9.7/mdel.c 55334 11382 src/commands/i386/mtools-3.9.7/mdir.c 27075 3090 src/commands/i386/mtools-3.9.7/mdoctorfat.c 19391 2365 src/commands/i386/mtools-3.9.7/mdu.c 61309 26431 src/commands/i386/mtools-3.9.7/mformat.c 50119 4399 src/commands/i386/mtools-3.9.7/minfo.c 46311 5267 src/commands/i386/mtools-3.9.7/misc.c 15008 7219 src/commands/i386/mtools-3.9.7/missFuncs.c 56115 14559 src/commands/i386/mtools-3.9.7/mk_direntry.c 18076 5254 src/commands/i386/mtools-3.9.7/mlabel.c 10361 3444 src/commands/i386/mtools-3.9.7/mmd.c 50167 1495 src/commands/i386/mtools-3.9.7/mmount.c 14592 6796 src/commands/i386/mtools-3.9.7/mmove.c 33606 17201 src/commands/i386/mtools-3.9.7/mpartition.c 51838 7521 src/commands/i386/mtools-3.9.7/msdos.h 05295 1440 src/commands/i386/mtools-3.9.7/mshowfat.c 12592 3985 src/commands/i386/mtools-3.9.7/mtools.c 53573 6703 src/commands/i386/mtools-3.9.7/mtools.h 19736 1281 src/commands/i386/mtools-3.9.7/mtoolsDirent.h 59233 686 src/commands/i386/mtools-3.9.7/mtoolsPaths.h 05637 1454 src/commands/i386/mtools-3.9.7/nameclash.h 05718 944 src/commands/i386/mtools-3.9.7/partition.h 50515 64 src/commands/i386/mtools-3.9.7/patchlevel.c 12344 18215 src/commands/i386/mtools-3.9.7/plain_io.c 59819 490 src/commands/i386/mtools-3.9.7/plain_io.h 21203 433 src/commands/i386/mtools-3.9.7/precmd.c 18527 3754 src/commands/i386/mtools-3.9.7/privileges.c 24230 6244 src/commands/i386/mtools-3.9.7/scsi.c 04321 615 src/commands/i386/mtools-3.9.7/scsi.h 30962 614 src/commands/i386/mtools-3.9.7/signal.c 09871 1395 src/commands/i386/mtools-3.9.7/stream.c 02766 1986 src/commands/i386/mtools-3.9.7/stream.h 25007 1210 src/commands/i386/mtools-3.9.7/streamcache.c 38877 418 src/commands/i386/mtools-3.9.7/subdir.c 06434 11120 src/commands/i386/mtools-3.9.7/sysincludes.h 35363 19367 src/commands/i386/mtools-3.9.7/toupper.c 01718 3923 src/commands/i386/mtools-3.9.7/tty.c 16007 2471 src/commands/i386/mtools-3.9.7/unixdir.c 53762 17795 src/commands/i386/mtools-3.9.7/vfat.c 22223 2454 src/commands/i386/mtools-3.9.7/vfat.h 11162 14196 src/commands/i386/mtools-3.9.7/xdf_io.c 32173 271 src/commands/i386/mtools-3.9.7/xdf_io.h 37915 352 src/commands/i86/Makefile 54654 22836 src/commands/i86/cc.c 39492 2663 src/commands/ibm/Makefile 31928 29545 src/commands/ibm/dosread.c 11532 27196 src/commands/ibm/fdisk.c 26689 11067 src/commands/ibm/format.c 43921 1950 src/commands/ibm/loadfont.c 22528 1602 src/commands/ibm/loadkeys.c 35251 15861 src/commands/ibm/mixer.c 33202 53616 src/commands/ibm/part.c 11893 7355 src/commands/ibm/partition.c 63615 4414 src/commands/ibm/playwave.c 33264 17028 src/commands/ibm/postmort.c 43405 10967 src/commands/ibm/readclock.c 50332 5451 src/commands/ibm/recwave.c 53063 6885 src/commands/ibm/repartition.c 07354 3097 src/commands/ibm/screendump.c 52657 5177 src/commands/ibm/sdump.c 53158 1739 src/commands/kermit/Makefile 16060 3594 src/commands/kermit/ckcdeb.h 62171 14689 src/commands/kermit/ckcfn2.c 62555 32532 src/commands/kermit/ckcfns.c 16027 3854 src/commands/kermit/ckcker.h 41685 13372 src/commands/kermit/ckcmai.c 09467 16466 src/commands/kermit/ckcpro.c 56554 689 src/commands/kermit/ckcsym.h 01938 36812 src/commands/kermit/ckucmd.c 12583 1805 src/commands/kermit/ckucmd.h 55256 7944 src/commands/kermit/ckucon.c 41374 26809 src/commands/kermit/ckudia.c 60504 28911 src/commands/kermit/ckufio.c 57577 9500 src/commands/kermit/ckuscr.c 01777 65684 src/commands/kermit/ckutio.c 03246 26250 src/commands/kermit/ckuus2.c 19611 26314 src/commands/kermit/ckuus3.c 62275 34279 src/commands/kermit/ckuusr.c 21093 4655 src/commands/kermit/ckuusr.h 49588 12731 src/commands/kermit/ckwart.c 33153 95 src/commands/m4/Ack.m4 31610 189 src/commands/m4/Hanoi.m4 58718 425 src/commands/m4/Hash.m4 50241 11708 src/commands/m4/M4.out 34671 552 src/commands/m4/Makefile 28342 1052 src/commands/m4/READ_ME 53358 238 src/commands/m4/Sqroot.m4 05302 204 src/commands/m4/String.m4 17963 7841 src/commands/m4/Test.m4 35996 5641 src/commands/m4/eval.c 05344 12141 src/commands/m4/expr.c 36661 1150 src/commands/m4/extr.h 28377 1606 src/commands/m4/look.c 34240 11013 src/commands/m4/main.c 01195 7130 src/commands/m4/mdef.h 19176 5064 src/commands/m4/misc.c 34521 21 src/commands/m4/patchlevel.h 13547 11549 src/commands/m4/serv.c 35927 335 src/commands/make/Makefile 20027 6404 src/commands/make/archive.c 24232 2960 src/commands/make/check.c 21966 8797 src/commands/make/h.h 07382 11230 src/commands/make/input.c 44366 4234 src/commands/make/macro.c 51795 7347 src/commands/make/main.c 59117 18813 src/commands/make/make.c 25088 3040 src/commands/make/reader.c 56606 9317 src/commands/make/rules.c 27104 291 src/commands/mined/Makefile 26819 11958 src/commands/mined/mined.h 46963 58752 src/commands/mined/mined1.c 11304 44950 src/commands/mined/mined2.c 15763 241 src/commands/patch/EXTERN.h 55718 239 src/commands/patch/INTERN.h 19812 581 src/commands/patch/Makefile 50037 4021 src/commands/patch/common.h 06953 435 src/commands/patch/config.h 41926 8213 src/commands/patch/inp.c 17957 630 src/commands/patch/inp.h 36431 19669 src/commands/patch/patch.c 04164 22 src/commands/patch/patchlevel.h 34046 31784 src/commands/patch/pch.c 33270 1514 src/commands/patch/pch.h 42854 7315 src/commands/patch/util.c 23661 2234 src/commands/patch/util.h 55264 489 src/commands/patch/version.c 31244 204 src/commands/patch/version.h 02080 887 src/commands/reboot/Makefile 23561 2057 src/commands/reboot/README 16497 2746 src/commands/reboot/halt.c 40121 1914 src/commands/reboot/log.c 25165 2639 src/commands/reboot/sh_wall.c 14613 9061 src/commands/reboot/shutdown.c 57981 832 src/commands/reboot/tinyhalt.c 05129 303 src/commands/rlogind/Makefile 16285 9345 src/commands/rlogind/in.rld.c 64696 402 src/commands/rlogind/in.rld.h 22957 2095 src/commands/rlogind/setup.c 48535 4181 src/commands/scripts/DESCRIBE.sh 23765 480 src/commands/scripts/M.sh 10658 5516 src/commands/scripts/MAKEDEV.sh 23982 2392 src/commands/scripts/Makefile 37403 2787 src/commands/scripts/adduser.sh 39556 181 src/commands/scripts/cd.sh 37566 4717 src/commands/scripts/checkhier.sh 37834 130 src/commands/scripts/clear.sh 57778 1727 src/commands/scripts/makewhatis.sh 07218 4726 src/commands/scripts/mkdist.sh 51096 9093 src/commands/scripts/setup.sh 50789 436 src/commands/scripts/spell.sh 59604 442 src/commands/scripts/srccrc.sh 13823 121 src/commands/scripts/svclog.sh 29787 700 src/commands/scripts/whatis.sh 02217 425 src/commands/scripts/whereis.sh 37888 392 src/commands/sh/Makefile 53118 10395 src/commands/sh/sh.h 12010 14884 src/commands/sh/sh1.c 19964 12605 src/commands/sh/sh2.c 13605 19768 src/commands/sh/sh3.c 33424 13812 src/commands/sh/sh4.c 19554 11147 src/commands/sh/sh5.c 49180 115 src/commands/sh/sh6.c 54440 23004 src/commands/simple/Makefile 02273 6898 src/commands/simple/add_route.c 52335 6225 src/commands/simple/at.c 52423 1905 src/commands/simple/atrun.c 65506 15557 src/commands/simple/backup.c 13054 15478 src/commands/simple/badblocks.c 52356 6710 src/commands/simple/banner.c 16635 1896 src/commands/simple/basename.c 23300 8328 src/commands/simple/cal.c 15440 5133 src/commands/simple/calendar.c 21395 2076 src/commands/simple/cat.c 41225 7712 src/commands/simple/cdiff.c 50864 9281 src/commands/simple/cgrep.c 11962 3289 src/commands/simple/chmem.c 15977 5056 src/commands/simple/chmod.c 40975 3409 src/commands/simple/chown.c 40916 7973 src/commands/simple/ci.c 24286 5327 src/commands/simple/cksum.c 16054 7081 src/commands/simple/cleantmp.c 14596 2401 src/commands/simple/cmp.c 20440 5786 src/commands/simple/co.c 41699 4036 src/commands/simple/comm.c 12830 39040 src/commands/simple/compress.c 14640 30360 src/commands/simple/cp.c 56563 4085 src/commands/simple/crc.c 63369 7671 src/commands/simple/cut.c 03809 9747 src/commands/simple/date.c 36527 7091 src/commands/simple/dd.c 56513 14163 src/commands/simple/decomp16.c 22658 11049 src/commands/simple/df.c 26201 12809 src/commands/simple/dhrystone.c 23176 31170 src/commands/simple/diff.c 56135 818 src/commands/simple/dirname.c 11282 5324 src/commands/simple/du.c 00964 43988 src/commands/simple/ed.c 25497 746 src/commands/simple/eject.c 07375 1557 src/commands/simple/env.c 60044 1767 src/commands/simple/expand.c 17500 885 src/commands/simple/factor.c 02577 9135 src/commands/simple/fgrep.c 28134 6574 src/commands/simple/file.c 02187 21388 src/commands/simple/find.c 34775 25414 src/commands/simple/finger.c 26968 5238 src/commands/simple/fix.c 32557 1175 src/commands/simple/fold.c 41815 1781 src/commands/simple/fortune.c 05393 39363 src/commands/simple/fsck.c 26310 38348 src/commands/simple/fsck1.c 41392 5545 src/commands/simple/getty.c 05199 16148 src/commands/simple/gomoku.c 62125 9651 src/commands/simple/grep.c 11021 1347 src/commands/simple/head.c 16677 32159 src/commands/simple/host.c 34247 5896 src/commands/simple/hostaddr.c 27853 1301 src/commands/simple/id.c 57917 6380 src/commands/simple/ifconfig.c 30892 11952 src/commands/simple/ifdef.c 34680 1774 src/commands/simple/in.fingerd.c 41758 8999 src/commands/simple/in.rshd.c 16313 12755 src/commands/simple/install.c 22975 2752 src/commands/simple/intr.c 52279 15379 src/commands/simple/irdpd.c 44700 20498 src/commands/simple/isoread.c 62893 7813 src/commands/simple/join.c 29042 2054 src/commands/simple/kill.c 59139 11653 src/commands/simple/last.c 00192 4642 src/commands/simple/leave.c 00652 5740 src/commands/simple/life.c 12218 11071 src/commands/simple/login.c 08942 3681 src/commands/simple/look.c 48592 1707 src/commands/simple/lp.c 37037 6641 src/commands/simple/lpd.c 43784 25703 src/commands/simple/ls.c 31008 17439 src/commands/simple/mail.c 20110 14946 src/commands/simple/man.c 08211 1121 src/commands/simple/mesg.c 48240 5456 src/commands/simple/mkdir.c 03726 4008 src/commands/simple/mkfifo.c 54121 34060 src/commands/simple/mkfs.c 49435 1421 src/commands/simple/mknod.c 01158 6046 src/commands/simple/mkproto.c 06626 4875 src/commands/simple/mkswap.c 50844 5897 src/commands/simple/modem.c 17981 4275 src/commands/simple/mount.c 45099 5338 src/commands/simple/mt.c 23842 5227 src/commands/simple/nm.c 39069 59074 src/commands/simple/nonamed.c 18818 5667 src/commands/simple/od.c 56153 5135 src/commands/simple/passwd.c 50702 12595 src/commands/simple/paste.c 09006 2697 src/commands/simple/ping.c 12214 12261 src/commands/simple/pr.c 62272 4182 src/commands/simple/pr_routes.c 47756 2381 src/commands/simple/prep.c 29357 9147 src/commands/simple/printf.c 50041 2252 src/commands/simple/printroot.c 09793 14672 src/commands/simple/proto.c 56553 1163 src/commands/simple/pwd.c 45228 8528 src/commands/simple/pwdauth.c 59349 9179 src/commands/simple/rarpd.c 22597 16922 src/commands/simple/rcp.c 18100 3558 src/commands/simple/readall.c 48860 16190 src/commands/simple/readfs.c 55266 34616 src/commands/simple/remsync.c 55210 33728 src/commands/simple/rlogin.c 40599 652 src/commands/simple/rmdir.c 13935 11592 src/commands/simple/rsh.c 59827 46126 src/commands/simple/sed.c 37758 1532 src/commands/simple/shar.c 09391 1419 src/commands/simple/size.c 62351 569 src/commands/simple/sleep.c 21199 7818 src/commands/simple/slip.c 16681 33124 src/commands/simple/sort.c 33384 2321 src/commands/simple/split.c 06091 9546 src/commands/simple/stat.c 16504 4030 src/commands/simple/strings.c 06067 3637 src/commands/simple/strip.c 53383 24464 src/commands/simple/stty.c 07574 2100 src/commands/simple/su.c 46598 2185 src/commands/simple/sum.c 65482 25563 src/commands/simple/swapfs.c 59668 269 src/commands/simple/sync.c 46687 32961 src/commands/simple/synctree.c 51634 1496 src/commands/simple/sysenv.c 65416 10417 src/commands/simple/tail.c 31333 27652 src/commands/simple/tar.c 60654 6064 src/commands/simple/tcpd.c 49041 1314 src/commands/simple/tee.c 60270 13648 src/commands/simple/term.c 56233 3999 src/commands/simple/termcap.c 48385 1717 src/commands/simple/tget.c 19712 3497 src/commands/simple/time.c 31084 5408 src/commands/simple/touch.c 07333 3651 src/commands/simple/tr.c 59946 8272 src/commands/simple/tsort.c 16634 6928 src/commands/simple/ttt.c 08336 646 src/commands/simple/tty.c 54971 1891 src/commands/simple/umount.c 60485 3094 src/commands/simple/uname.c 47878 2247 src/commands/simple/unexpand.c 30516 3586 src/commands/simple/uniq.c 61307 418 src/commands/simple/update.c 24941 11844 src/commands/simple/uud.c 16716 4952 src/commands/simple/uue.c 17553 8597 src/commands/simple/vol.c 10174 2945 src/commands/simple/wc.c 34746 1502 src/commands/simple/which.c 26191 1397 src/commands/simple/who.c 48748 351 src/commands/simple/whoami.c 27651 5934 src/commands/simple/write.c 10734 10649 src/commands/simple/xargs.c 57993 374 src/commands/simple/yes.c 11215 548 src/commands/talk/Makefile 02676 5652 src/commands/talk/net.c 29570 515 src/commands/talk/net.h 36004 3277 src/commands/talk/proto.c 34803 105 src/commands/talk/proto.h 04941 3652 src/commands/talk/screen.c 46847 420 src/commands/talk/screen.h 29736 4954 src/commands/talk/talk.c 26346 1525 src/commands/talk/talk.h 03225 578 src/commands/talkd/Makefile 10766 906 src/commands/talkd/finduser.c 32681 126 src/commands/talkd/finduser.h 40347 4792 src/commands/talkd/net.c 44825 247 src/commands/talkd/net.h 29263 5862 src/commands/talkd/process.c 47547 163 src/commands/talkd/process.h 26346 1525 src/commands/talkd/talk.h 41247 1065 src/commands/talkd/talkd.c 33870 134 src/commands/talkd/talkd.h 33362 268 src/commands/telnet/Makefile 07777 11285 src/commands/telnet/ttn.c 46279 815 src/commands/telnet/ttn.h 56264 225 src/commands/telnet/ttn_conf.c 27605 562 src/commands/telnetd/Makefile 06540 3812 src/commands/telnetd/main.c 56929 1705 src/commands/telnetd/pty.c 08641 4258 src/commands/telnetd/telnet.c 25540 2996 src/commands/telnetd/telnet.h 23952 732 src/commands/telnetd/telnetd.h 05023 1913 src/commands/telnetd/term.c 48140 2977 src/commands/telnetd/wtmp.c 14847 587 src/commands/urlget/Makefile 58680 1941 src/commands/urlget/net.c 49097 169 src/commands/urlget/net.h 01368 11994 src/commands/urlget/urlget.c 16037 3678 src/commands/yap/Makefile 36372 548 src/commands/yap/NOTICE 06518 1402 src/commands/yap/READ_ME 10752 548 src/commands/yap/assert.c 33732 634 src/commands/yap/assert.h 32290 14865 src/commands/yap/commands.c 14268 1581 src/commands/yap/commands.h 11734 11149 src/commands/yap/display.c 40836 3055 src/commands/yap/display.h 43128 5661 src/commands/yap/getcomm.c 22148 799 src/commands/yap/getcomm.h 58051 15851 src/commands/yap/getline.c 43338 1511 src/commands/yap/getline.h 14074 2292 src/commands/yap/help.c 53159 342 src/commands/yap/help.h 59007 2890 src/commands/yap/in_all.h 11076 3886 src/commands/yap/keys.c 35756 904 src/commands/yap/keys.h 39666 2637 src/commands/yap/machine.c 18821 1781 src/commands/yap/machine.h 39598 3600 src/commands/yap/main.c 16404 1310 src/commands/yap/main.h 00031 1350 src/commands/yap/options.c 63719 698 src/commands/yap/options.h 56239 1350 src/commands/yap/output.c 60263 1178 src/commands/yap/output.h 28614 2669 src/commands/yap/pattern.c 63618 231 src/commands/yap/pattern.h 32392 2096 src/commands/yap/process.c 13817 1020 src/commands/yap/process.h 38004 3437 src/commands/yap/prompt.c 59756 552 src/commands/yap/prompt.h 50870 10247 src/commands/yap/term.c 01492 3156 src/commands/yap/term.h 27523 396 src/commands/zmodem/Makefile 11715 8737 src/commands/zmodem/crctab.c 40455 8969 src/commands/zmodem/rbsb.c 36391 32546 src/commands/zmodem/rz.c 07010 37699 src/commands/zmodem/sz.c 25265 15116 src/commands/zmodem/zm.c 50786 6687 src/commands/zmodem/zmodem.h 30529 37615 src/crclist 56038 61 src/etc/fstab 42701 117 src/etc/group 35507 28 src/etc/inet.conf 01958 328 src/etc/passwd 25083 37 src/etc/profile 38188 670 src/etc/protocols 36735 2427 src/etc/rc 17231 2435 src/etc/services 04254 13 src/etc/shadow 48899 1944 src/etc/termcap 42970 314 src/etc/ttytab 52519 3578 src/fs/Makefile 08712 3228 src/fs/buf.h 47940 14433 src/fs/cache.c 07228 4265 src/fs/cache2.c 15518 4293 src/fs/const.h 63344 316 src/fs/dev.h 31889 13193 src/fs/device.c 56242 583 src/fs/file.h 47412 3287 src/fs/filedes.c 31337 1773 src/fs/fproc.h 03156 701 src/fs/fs.h 07070 1556 src/fs/glo.h 40263 13825 src/fs/inode.c 31419 2367 src/fs/inode.h 04623 14821 src/fs/link.c 35812 5934 src/fs/lock.c 10431 493 src/fs/lock.h 25422 11260 src/fs/main.c 53004 11505 src/fs/misc.c 10600 5962 src/fs/mount.c 63181 15699 src/fs/open.c 37464 1708 src/fs/param.h 05654 12501 src/fs/path.c 16690 10055 src/fs/pipe.c 20148 6705 src/fs/protect.c 30196 6262 src/fs/proto.h 26319 985 src/fs/putk.c 51104 17288 src/fs/read.c 41699 5969 src/fs/stadir.c 65013 8939 src/fs/super.c 27565 2507 src/fs/super.h 25158 5013 src/fs/table.c 47180 2817 src/fs/time.c 63692 1144 src/fs/type.h 27325 4737 src/fs/utility.c 15220 8248 src/fs/write.c 05734 8099 src/inet/Makefile 22387 24755 src/inet/buf.c 07061 3408 src/inet/clock.c 53067 523 src/inet/const.h 23610 17240 src/inet/generic/arp.c 34648 601 src/inet/generic/arp.h 30774 619 src/inet/generic/assert.h 56556 6454 src/inet/generic/buf.h 43509 841 src/inet/generic/clock.h 05983 20713 src/inet/generic/eth.c 43580 893 src/inet/generic/eth.h 21756 1164 src/inet/generic/eth_int.h 62420 936 src/inet/generic/event.c 31046 773 src/inet/generic/event.h 43737 22956 src/inet/generic/icmp.c 28517 300 src/inet/generic/icmp.h 32982 525 src/inet/generic/icmp_lib.h 18918 607 src/inet/generic/io.c 50181 303 src/inet/generic/io.h 63138 9229 src/inet/generic/ip.c 26120 576 src/inet/generic/ip.h 50870 16444 src/inet/generic/ip_eth.c 38951 4158 src/inet/generic/ip_int.h 20511 11571 src/inet/generic/ip_ioctl.c 53717 4397 src/inet/generic/ip_lib.c 13358 3077 src/inet/generic/ip_ps.c 61175 19615 src/inet/generic/ip_read.c 38055 10642 src/inet/generic/ip_write.c 33678 22089 src/inet/generic/ipr.c 15271 2151 src/inet/generic/ipr.h 13410 15129 src/inet/generic/psip.c 16577 420 src/inet/generic/psip.h 10415 940 src/inet/generic/sr.h 40109 46498 src/inet/generic/tcp.c 20707 1977 src/inet/generic/tcp.h 59240 5938 src/inet/generic/tcp_int.h 09736 12325 src/inet/generic/tcp_lib.c 34482 27931 src/inet/generic/tcp_recv.c 57577 25933 src/inet/generic/tcp_send.c 42569 453 src/inet/generic/type.h 06916 34885 src/inet/generic/udp.c 27641 772 src/inet/generic/udp.h 25535 6044 src/inet/inet.c 12853 2470 src/inet/inet.h 60837 6634 src/inet/inet_config.c 35007 1876 src/inet/inet_config.h 13033 12885 src/inet/mnx_eth.c 07117 797 src/inet/mq.c 28129 414 src/inet/mq.h 59042 590 src/inet/osdep_eth.h 13700 349 src/inet/proto.h 40370 15998 src/inet/sr.c 54064 509 src/inet/stacktrace.c 35536 163 src/inet/version.c 06155 6147 src/kernel/3c503.c 13493 2497 src/kernel/3c503.h 47000 4277 src/kernel/Makefile 12842 63392 src/kernel/aha1540.c 38544 653 src/kernel/assert.h 51286 36083 src/kernel/at_wini.c 49515 11913 src/kernel/bios_wini.c 26753 21361 src/kernel/clock.c 55473 30504 src/kernel/console.c 49662 5494 src/kernel/const.h 04919 5942 src/kernel/dmp.c 44629 12278 src/kernel/dosfile.c 32236 46900 src/kernel/dp8390.c 26706 11878 src/kernel/dp8390.h 48236 10943 src/kernel/driver.c 10019 2104 src/kernel/driver.h 05631 6408 src/kernel/drvlib.c 61034 816 src/kernel/drvlib.h 31156 21842 src/kernel/esdi_wini.c 25868 2090 src/kernel/exception.c 54041 18879 src/kernel/fatfile.c 30567 41034 src/kernel/floppy.c 11170 3107 src/kernel/glo.h 04742 4954 src/kernel/i8259.c 25621 728 src/kernel/kernel.h 28776 14907 src/kernel/keyboard.c 17163 1242 src/kernel/keymaps/Makefile 12606 6608 src/kernel/keymaps/french.src 25059 1082 src/kernel/keymaps/genmap.c 50919 6203 src/kernel/keymaps/german.src 16820 6306 src/kernel/keymaps/italian.src 43189 7112 src/kernel/keymaps/japanese.src 41453 9806 src/kernel/keymaps/latin-am.src 34922 6625 src/kernel/keymaps/olivetti.src 33528 6663 src/kernel/keymaps/polish.src 54754 6280 src/kernel/keymaps/scandinavn.src 15153 6275 src/kernel/keymaps/spanish.src 59961 6556 src/kernel/keymaps/uk.src 05080 6531 src/kernel/keymaps/us-std.src 18818 6574 src/kernel/keymaps/us-swap.src 35847 177 src/kernel/klib.s 07825 18549 src/kernel/klib386.s 53232 30962 src/kernel/klib88.s 37293 5144 src/kernel/main.c 10151 9504 src/kernel/memory.c 48289 5109 src/kernel/misc.c 46271 172 src/kernel/mpx.s 55756 16630 src/kernel/mpx386.s 31826 21408 src/kernel/mpx88.s 20119 7317 src/kernel/ne2000.c 12359 641 src/kernel/ne2000.h 48425 12925 src/kernel/printer.c 34361 19139 src/kernel/proc.c 61398 4962 src/kernel/proc.h 34020 10804 src/kernel/protect.c 50615 5660 src/kernel/protect.h 28006 13501 src/kernel/proto.h 29007 12379 src/kernel/pty.c 57323 29902 src/kernel/rs232.c 24106 6153 src/kernel/sb16.h 15999 18577 src/kernel/sb16_dsp.c 55279 11963 src/kernel/sb16_mixer.c 33354 847 src/kernel/sconst.h 50535 2846 src/kernel/start.c 43417 42101 src/kernel/system.c 62509 5290 src/kernel/table.c 06596 50959 src/kernel/tty.c 36560 4594 src/kernel/tty.h 51779 3339 src/kernel/type.h 40659 9728 src/kernel/wdeth.c 59587 3256 src/kernel/wdeth.h 33833 27822 src/kernel/xt_wini.c 07751 3329 src/lib/Makefile 29911 6404 src/lib/ansi/Makefile 23286 442 src/lib/ansi/abort.c 04638 294 src/lib/ansi/abs.c 46727 1158 src/lib/ansi/asctime.c 00239 228 src/lib/ansi/assert.c 31784 278 src/lib/ansi/atexit.c 11799 381 src/lib/ansi/atof.c 11116 346 src/lib/ansi/atoi.c 58968 643 src/lib/ansi/atol.c 61752 741 src/lib/ansi/bsearch.c 41870 357 src/lib/ansi/calloc.c 30123 992 src/lib/ansi/chartab.c 21979 1981 src/lib/ansi/clock.c 39762 206 src/lib/ansi/ctime.c 44977 365 src/lib/ansi/difftime.c 27437 738 src/lib/ansi/div.c 38444 2955 src/lib/ansi/errlist.c 50704 667 src/lib/ansi/exit.c 38210 15870 src/lib/ansi/ext_comp.c 28755 187 src/lib/ansi/ext_fmt.h 10947 606 src/lib/ansi/getenv.c 38846 999 src/lib/ansi/gmtime.c 10605 65 src/lib/ansi/isalnum.c 41275 65 src/lib/ansi/isalpha.c 38173 65 src/lib/ansi/isascii.c 20427 65 src/lib/ansi/iscntrl.c 47821 65 src/lib/ansi/isdigit.c 50654 65 src/lib/ansi/isgraph.c 64796 65 src/lib/ansi/islower.c 47436 65 src/lib/ansi/isprint.c 20557 65 src/lib/ansi/ispunct.c 22556 65 src/lib/ansi/isspace.c 23651 65 src/lib/ansi/isupper.c 29767 67 src/lib/ansi/isxdigit.c 10896 298 src/lib/ansi/labs.c 17363 745 src/lib/ansi/ldiv.c 30041 807 src/lib/ansi/loc_time.h 49482 816 src/lib/ansi/localeconv.c 35853 915 src/lib/ansi/localtime.c 59843 4612 src/lib/ansi/malloc.c 16037 439 src/lib/ansi/mblen.c 61754 431 src/lib/ansi/mbstowcs.c 05610 430 src/lib/ansi/mbtowc.c 48638 488 src/lib/ansi/memchr.c 03343 466 src/lib/ansi/memcmp.c 45318 439 src/lib/ansi/memcpy.c 12644 604 src/lib/ansi/memmove.c 61556 402 src/lib/ansi/memset.c 37584 9236 src/lib/ansi/misc.c 49160 3528 src/lib/ansi/mktime.c 48789 3380 src/lib/ansi/qsort.c 12532 447 src/lib/ansi/raise.c 07493 451 src/lib/ansi/rand.c 13548 506 src/lib/ansi/setlocale.c 36652 763 src/lib/ansi/sigmisc.c 54231 871 src/lib/ansi/signal.c 22096 426 src/lib/ansi/strcat.c 40145 392 src/lib/ansi/strchr.c 44253 487 src/lib/ansi/strcmp.c 12163 419 src/lib/ansi/strcoll.c 20841 381 src/lib/ansi/strcpy.c 35511 472 src/lib/ansi/strcspn.c 02594 601 src/lib/ansi/strerror.c 59243 3757 src/lib/ansi/strftime.c 19683 361 src/lib/ansi/strlen.c 41825 507 src/lib/ansi/strncat.c 60764 586 src/lib/ansi/strncmp.c 04539 514 src/lib/ansi/strncpy.c 54306 502 src/lib/ansi/strpbrk.c 22731 435 src/lib/ansi/strrchr.c 59855 473 src/lib/ansi/strspn.c 16349 507 src/lib/ansi/strstr.c 59937 659 src/lib/ansi/strtok.c 40022 2293 src/lib/ansi/strtol.c 30546 487 src/lib/ansi/strxfrm.c 19902 1455 src/lib/ansi/system.c 26107 84 src/lib/ansi/tolower.c 61636 84 src/lib/ansi/toupper.c 12494 250 src/lib/ansi/tzset.c 02742 463 src/lib/ansi/wcstombs.c 14998 484 src/lib/ansi/wctomb.c 34688 3094 src/lib/curses/Makefile 23577 209 src/lib/curses/beep.c 08376 1175 src/lib/curses/charpick.c 08368 439 src/lib/curses/curs_set.c 51968 5577 src/lib/curses/cursesio.c 59763 1221 src/lib/curses/curspriv.h 15893 265 src/lib/curses/endwin.c 25030 214 src/lib/curses/flash.c 14465 479 src/lib/curses/initscr.c 16339 316 src/lib/curses/longname.c 50972 435 src/lib/curses/move.c 13872 496 src/lib/curses/mvcursor.c 32730 4518 src/lib/curses/newwin.c 09279 2568 src/lib/curses/options.c 22361 3406 src/lib/curses/overlay.c 08364 4536 src/lib/curses/prntscan.c 17089 1984 src/lib/curses/refresh.c 33790 1875 src/lib/curses/scrreg.c 50661 1182 src/lib/curses/setterm.c 37557 1699 src/lib/curses/tabsize.c 61430 1268 src/lib/curses/termmisc.c 37732 1569 src/lib/curses/unctrl.c 39825 4297 src/lib/curses/update.c 01113 2248 src/lib/curses/waddch.c 02823 466 src/lib/curses/waddstr.c 10515 1873 src/lib/curses/wbox.c 11786 393 src/lib/curses/wclear.c 25722 1009 src/lib/curses/wclrtobot.c 16389 942 src/lib/curses/wclrtoeol.c 43017 651 src/lib/curses/wdelch.c 47614 803 src/lib/curses/wdeleteln.c 55919 722 src/lib/curses/werase.c 37808 516 src/lib/curses/wgetch.c 36076 583 src/lib/curses/wgetstr.c 45639 1576 src/lib/curses/windel.c 22328 1397 src/lib/curses/winmove.c 11741 769 src/lib/curses/winsch.c 16632 2072 src/lib/curses/winscrol.c 27052 778 src/lib/curses/winsertln.c 18311 1424 src/lib/curses/wintouch.c 54884 183 src/lib/dummy/Makefile 06565 2029 src/lib/editline/Makefile 51960 2409 src/lib/editline/README 40603 4819 src/lib/editline/complete.c 36690 24195 src/lib/editline/editline.c 07501 1655 src/lib/editline/editline.h 57679 2321 src/lib/editline/sysunix.c 15840 1201 src/lib/editline/testit.c 33663 497 src/lib/editline/unix.h 47913 408 src/lib/end/Makefile 60448 77 src/lib/end/edata.s 28868 322 src/lib/end/em_end.s 47895 125 src/lib/end/end.s 44470 54 src/lib/end/etext.s 32702 533 src/lib/float/FP.compile 40330 661 src/lib/float/FP.script 15480 919 src/lib/float/FP_bias.h 30133 1038 src/lib/float/FP_shift.h 51346 674 src/lib/float/FP_trap.h 08572 3416 src/lib/float/FP_types.h 30073 2732 src/lib/float/Makefile 33879 1357 src/lib/float/add_ext.c 00626 1122 src/lib/float/adder.c 59760 396 src/lib/float/adder.h 58323 557 src/lib/float/adf4.c 38158 582 src/lib/float/adf8.c 33963 178 src/lib/float/byte_order.h 12887 659 src/lib/float/cff4.c 53812 600 src/lib/float/cff8.c 41121 1188 src/lib/float/cfi.c 35552 971 src/lib/float/cfu.c 34065 1256 src/lib/float/cif4.c 53277 1209 src/lib/float/cif8.c 21268 783 src/lib/float/cmf4.c 31606 1164 src/lib/float/cmf8.c 54861 4140 src/lib/float/compact.c 53244 1111 src/lib/float/cuf4.c 36128 1058 src/lib/float/cuf8.c 14306 6253 src/lib/float/div_ext.c 20938 490 src/lib/float/dvf4.c 34227 504 src/lib/float/dvf8.c 20699 2587 src/lib/float/extend.c 61004 656 src/lib/float/fef4.c 44638 676 src/lib/float/fef8.c 36747 962 src/lib/float/fif4.c 01636 1053 src/lib/float/fif8.c 06914 245 src/lib/float/fptrp.s 09051 1196 src/lib/float/get_put.h 38577 488 src/lib/float/mlf4.c 50970 503 src/lib/float/mlf8.c 04040 2281 src/lib/float/mul_ext.c 19525 568 src/lib/float/ngf4.c 30644 614 src/lib/float/ngf8.c 21597 1140 src/lib/float/nrm_ext.c 63130 507 src/lib/float/sbf4.c 00077 536 src/lib/float/sbf8.c 24786 728 src/lib/float/sft_ext.c 26115 1142 src/lib/float/shifter.c 28718 1219 src/lib/float/sub_ext.c 61397 319 src/lib/float/zrf4.c 63354 341 src/lib/float/zrf8.c 10317 374 src/lib/float/zrf_ext.c 57422 866 src/lib/fphook/Makefile 53212 237 src/lib/fphook/fltpr.c 10192 3692 src/lib/fphook/fphook.c 11834 155 src/lib/fphook/strtod.c 27626 1001 src/lib/h/em_abs.h 51704 691 src/lib/h/m2_traps.h 10771 633 src/lib/h/pc_err.h 38877 510 src/lib/h/pc_file.h 01889 2000 src/lib/h/pc_math.h 33316 187 src/lib/i386/Makefile 60045 5405 src/lib/i386/em/Makefile 33963 178 src/lib/i386/em/byte_order.h 51583 144 src/lib/i386/em/em_adf4.s 26255 146 src/lib/i386/em/em_adf8.s 53976 307 src/lib/i386/em/em_adi.s 01308 286 src/lib/i386/em/em_and.s 64343 219 src/lib/i386/em/em_blm.s 44586 257 src/lib/i386/em/em_cff4.s 31301 131 src/lib/i386/em/em_cff8.s 27382 352 src/lib/i386/em/em_cfi.s 15631 514 src/lib/i386/em/em_cfu.s 21267 132 src/lib/i386/em/em_cif4.s 19954 132 src/lib/i386/em/em_cif8.s 21785 469 src/lib/i386/em/em_cii.s 01014 249 src/lib/i386/em/em_cmf4.s 44153 250 src/lib/i386/em/em_cmf8.s 60935 349 src/lib/i386/em/em_cms.s 35892 173 src/lib/i386/em/em_com.s 19760 435 src/lib/i386/em/em_csa4.s 20445 391 src/lib/i386/em/em_csb4.s 37809 190 src/lib/i386/em/em_cuf4.s 54219 190 src/lib/i386/em/em_cuf8.s 22234 365 src/lib/i386/em/em_cuu.s 52868 247 src/lib/i386/em/em_dup.s 00615 144 src/lib/i386/em/em_dvf4.s 63919 146 src/lib/i386/em/em_dvf8.s 04493 406 src/lib/i386/em/em_dvi.s 32092 327 src/lib/i386/em/em_dvu.s 51691 429 src/lib/i386/em/em_error.s 32650 270 src/lib/i386/em/em_exg.s 27950 150 src/lib/i386/em/em_fat.s 09782 827 src/lib/i386/em/em_fef4.s 45197 926 src/lib/i386/em/em_fef8.s 31821 692 src/lib/i386/em/em_fif4.s 59782 696 src/lib/i386/em/em_fif8.s 59730 141 src/lib/i386/em/em_fp8087.s 36166 136 src/lib/i386/em/em_gto.s 01527 107 src/lib/i386/em/em_hol0.s 43550 311 src/lib/i386/em/em_iaar.s 00853 265 src/lib/i386/em/em_ilar.s 06527 437 src/lib/i386/em/em_inn.s 63387 238 src/lib/i386/em/em_ior.s 32439 265 src/lib/i386/em/em_isar.s 24026 571 src/lib/i386/em/em_lar4.s 45514 600 src/lib/i386/em/em_loi.s 55280 144 src/lib/i386/em/em_mlf4.s 09876 146 src/lib/i386/em/em_mlf8.s 64755 309 src/lib/i386/em/em_mli.s 14849 110 src/lib/i386/em/em_mon.s 35689 137 src/lib/i386/em/em_ngf4.s 29669 137 src/lib/i386/em/em_ngf8.s 32672 296 src/lib/i386/em/em_ngi.s 61219 179 src/lib/i386/em/em_nop.s 36349 532 src/lib/i386/em/em_print.s 02239 314 src/lib/i386/em/em_rck.s 60616 314 src/lib/i386/em/em_rmi.s 27218 326 src/lib/i386/em/em_rmu.s 42082 312 src/lib/i386/em/em_rol.s 42381 312 src/lib/i386/em/em_ror.s 18822 528 src/lib/i386/em/em_sar4.s 32749 144 src/lib/i386/em/em_sbf4.s 02862 146 src/lib/i386/em/em_sbf8.s 49208 322 src/lib/i386/em/em_sbi.s 38726 597 src/lib/i386/em/em_set.s 03542 312 src/lib/i386/em/em_sli.s 33042 312 src/lib/i386/em/em_sri.s 57063 568 src/lib/i386/em/em_sti.s 36993 95 src/lib/i386/em/em_stop.s 52730 266 src/lib/i386/em/em_trp.s 02737 150 src/lib/i386/em/em_unknown.s 06623 239 src/lib/i386/em/em_xor.s 18351 209 src/lib/i386/head/Makefile 27626 1001 src/lib/i386/head/em_abs.h 32734 325 src/lib/i386/head/em_head.s 61308 1051 src/lib/i386/int64/Makefile 23751 332 src/lib/i386/int64/add64.s 09148 409 src/lib/i386/int64/add64u.s 01307 649 src/lib/i386/int64/cmp64.s 37234 358 src/lib/i386/int64/cv64u.s 50386 335 src/lib/i386/int64/cvu64.s 23645 271 src/lib/i386/int64/diff64.s 38728 526 src/lib/i386/int64/div64u.s 25495 341 src/lib/i386/int64/ex64.s 24017 355 src/lib/i386/int64/make64.s 48585 366 src/lib/i386/int64/mul64u.s 32354 335 src/lib/i386/int64/sub64.s 37549 412 src/lib/i386/int64/sub64u.s 24566 595 src/lib/i386/misc/Makefile 21851 801 src/lib/i386/misc/alloca.s 07796 247 src/lib/i386/misc/get_bp.s 58453 1265 src/lib/i386/misc/getprocessor.s 46676 2096 src/lib/i386/misc/iolib.s 24703 1764 src/lib/i386/misc/oneC_sum.s 43023 686 src/lib/i386/rts/Makefile 53221 328 src/lib/i386/rts/__sigreturn.s 37684 1226 src/lib/i386/rts/_sendrec.s 30337 130 src/lib/i386/rts/brksize.s 13368 1998 src/lib/i386/rts/crtso.s 52155 1718 src/lib/i386/rts/m2rtso.s 05809 1733 src/lib/i386/rts/prtso.s 31947 2026 src/lib/i386/string/Makefile 23450 2139 src/lib/i386/string/README 59535 1314 src/lib/i386/string/_memmove.s 54577 874 src/lib/i386/string/_strncat.s 07794 711 src/lib/i386/string/_strncmp.s 41099 561 src/lib/i386/string/_strncpy.s 55622 584 src/lib/i386/string/_strnlen.s 14903 758 src/lib/i386/string/bcmp.s 64409 432 src/lib/i386/string/bcopy.s 59701 422 src/lib/i386/string/bzero.s 24791 291 src/lib/i386/string/index.s 44542 559 src/lib/i386/string/memchr.s 35749 1308 src/lib/i386/string/memcmp.s 21322 702 src/lib/i386/string/memcpy.s 59946 287 src/lib/i386/string/memmove.s 14669 1015 src/lib/i386/string/memset.s 55704 316 src/lib/i386/string/rindex.s 41144 284 src/lib/i386/string/strcat.s 63620 884 src/lib/i386/string/strchr.s 09942 285 src/lib/i386/string/strcmp.s 22862 388 src/lib/i386/string/strcpy.s 30287 281 src/lib/i386/string/strlen.s 11229 301 src/lib/i386/string/strncat.s 43385 301 src/lib/i386/string/strncmp.s 65226 509 src/lib/i386/string/strncpy.s 54456 296 src/lib/i386/string/strnlen.s 32289 736 src/lib/i386/string/strrchr.s 04596 166 src/lib/i86/Makefile 58317 4078 src/lib/i86/em/Makefile 04051 277 src/lib/i86/em/em_adi.s 02541 218 src/lib/i86/em/em_and.s 17076 148 src/lib/i86/em/em_blm.s 50771 513 src/lib/i86/em/em_cii.s 47034 285 src/lib/i86/em/em_cmi4.s 05581 276 src/lib/i86/em/em_cms.s 20417 285 src/lib/i86/em/em_cmu4.s 07404 124 src/lib/i86/em/em_com.s 03708 358 src/lib/i86/em/em_csa2.s 46383 494 src/lib/i86/em/em_csa4.s 10705 318 src/lib/i86/em/em_csb2.s 47202 489 src/lib/i86/em/em_csb4.s 49555 527 src/lib/i86/em/em_cuu.s 27280 177 src/lib/i86/em/em_dup.s 55283 1217 src/lib/i86/em/em_dvi4.s 15409 682 src/lib/i86/em/em_dvu4.s 29139 468 src/lib/i86/em/em_error.s 58730 200 src/lib/i86/em/em_exg.s 61606 95 src/lib/i86/em/em_fat.s 34967 7295 src/lib/i86/em/em_fp8087.s 51906 77 src/lib/i86/em/em_gto.s 55889 51 src/lib/i86/em/em_hol0.s 48797 256 src/lib/i86/em/em_iaar.s 61159 205 src/lib/i86/em/em_ilar.s 50915 357 src/lib/i86/em/em_inn.s 26917 171 src/lib/i86/em/em_ior.s 32126 205 src/lib/i86/em/em_isar.s 11912 448 src/lib/i86/em/em_lar2.s 28359 112 src/lib/i86/em/em_lfr6.s 26231 129 src/lib/i86/em/em_lfr8.s 58881 426 src/lib/i86/em/em_loi.s 07709 313 src/lib/i86/em/em_mli4.s 57432 55 src/lib/i86/em/em_mon.s 54938 30 src/lib/i86/em/em_nop.s 14923 247 src/lib/i86/em/em_rck.s 04934 109 src/lib/i86/em/em_ret6.s 31590 125 src/lib/i86/em/em_ret8.s 61399 45 src/lib/i86/em/em_retarea.s 11663 157 src/lib/i86/em/em_return.s 09353 1173 src/lib/i86/em/em_rmi4.s 26596 789 src/lib/i86/em/em_rmu4.s 02213 419 src/lib/i86/em/em_sar2.s 23772 372 src/lib/i86/em/em_sbi.s 21668 515 src/lib/i86/em/em_set.s 21536 165 src/lib/i86/em/em_stb.s 49476 433 src/lib/i86/em/em_sti.s 51255 40 src/lib/i86/em/em_stop.s 39255 1733 src/lib/i86/em/em_trp.s 37430 98 src/lib/i86/em/em_unknown.s 42620 184 src/lib/i86/em/em_vars.s 03734 172 src/lib/i86/em/em_xor.s 10544 1051 src/lib/i86/int64/Makefile 45849 389 src/lib/i86/int64/add64.s 62713 518 src/lib/i86/int64/add64u.s 21800 877 src/lib/i86/int64/cmp64.s 15778 400 src/lib/i86/int64/cv64u.s 62205 370 src/lib/i86/int64/cvu64.s 54239 215 src/lib/i86/int64/diff64.s 23839 553 src/lib/i86/int64/div64u.s 32799 329 src/lib/i86/int64/ex64.s 07446 358 src/lib/i86/int64/make64.s 61087 404 src/lib/i86/int64/mul64u.s 07266 392 src/lib/i86/int64/sub64.s 32573 522 src/lib/i86/int64/sub64u.s 29778 667 src/lib/i86/misc/Makefile 51166 602 src/lib/i86/misc/alloca.s 30706 242 src/lib/i86/misc/get_bp.s 13482 2035 src/lib/i86/misc/getprocessor.s 08499 561 src/lib/i86/misc/hton86.s 17289 1913 src/lib/i86/misc/iolib.s 57265 1417 src/lib/i86/misc/oneC_sum.s 41208 700 src/lib/i86/rts/Makefile 26177 327 src/lib/i86/rts/__sigreturn.s 22148 827 src/lib/i86/rts/_sendrec.s 64590 75 src/lib/i86/rts/brksize.s 04194 1453 src/lib/i86/rts/ncrtso.s 24899 1240 src/lib/i86/rts/nm2rtso.s 42143 1254 src/lib/i86/rts/nprtso.s 62719 2025 src/lib/i86/string/Makefile 65256 180 src/lib/i86/string/README 16650 1072 src/lib/i86/string/_memmove.s 10291 836 src/lib/i86/string/_strncat.s 04583 703 src/lib/i86/string/_strncmp.s 34974 537 src/lib/i86/string/_strncpy.s 24371 559 src/lib/i86/string/_strnlen.s 61712 742 src/lib/i86/string/bcmp.s 52727 469 src/lib/i86/string/bcopy.s 37879 432 src/lib/i86/string/bzero.s 33335 281 src/lib/i86/string/index.s 52244 529 src/lib/i86/string/memchr.s 33020 981 src/lib/i86/string/memcmp.s 30488 679 src/lib/i86/string/memcpy.s 15205 277 src/lib/i86/string/memmove.s 21582 713 src/lib/i86/string/memset.s 41178 306 src/lib/i86/string/rindex.s 07439 274 src/lib/i86/string/strcat.s 15975 851 src/lib/i86/string/strchr.s 53789 275 src/lib/i86/string/strcmp.s 31406 368 src/lib/i86/string/strcpy.s 28901 271 src/lib/i86/string/strlen.s 26061 300 src/lib/i86/string/strncat.s 05618 300 src/lib/i86/string/strncmp.s 57396 487 src/lib/i86/string/strncpy.s 14224 296 src/lib/i86/string/strnlen.s 29118 706 src/lib/i86/string/strrchr.s 08515 3120 src/lib/ip/Makefile 58383 1434 src/lib/ip/dhcp_gettag.c 27331 1452 src/lib/ip/dhcp_settag.c 04258 414 src/lib/ip/domainname.c 53949 3510 src/lib/ip/ether.h 63282 1592 src/lib/ip/ether_line.c 63030 695 src/lib/ip/ethera2n.c 51695 982 src/lib/ip/ethere2a.c 18558 490 src/lib/ip/etherh2n.c 59967 583 src/lib/ip/ethern2h.c 08844 480 src/lib/ip/getdomain.c 21440 7963 src/lib/ip/gethnmadr.c 20299 4085 src/lib/ip/gethostent.c 46473 489 src/lib/ip/gethostname.c 03421 2304 src/lib/ip/getnetbyaddr.c 15738 2417 src/lib/ip/getnetbyname.c 10211 3374 src/lib/ip/getnetent.c 45203 1508 src/lib/ip/getproto.c 60137 2772 src/lib/ip/getprotoent.c 44966 2820 src/lib/ip/getservent.c 36618 1686 src/lib/ip/getsrvbyname.c 12046 1588 src/lib/ip/getsrvbyport.c 38517 112 src/lib/ip/hton.c 30911 3553 src/lib/ip/inet_addr.c 26595 3060 src/lib/ip/inet_network.c 08102 1492 src/lib/ip/inet_ntoa.c 48168 565 src/lib/ip/memcspn.c 31514 1081 src/lib/ip/oneC_sum.c 55185 13063 src/lib/ip/rcmd.c 49216 7833 src/lib/ip/res_comp.c 07949 5757 src/lib/ip/res_init.c 41031 6071 src/lib/ip/res_mkquery.c 01972 8055 src/lib/ip/res_query.c 12477 20214 src/lib/ip/res_send.c 46225 7356 src/lib/ip/servxcheck.c 36595 651 src/lib/ip/strcasecmp.c 44125 1288 src/lib/libm2/Arguments.c 16037 4313 src/lib/libm2/ArraySort.mod 38426 6949 src/lib/libm2/CSP.mod 24690 1827 src/lib/libm2/Conversion.mod 38392 1855 src/lib/libm2/EM.e 48850 7606 src/lib/libm2/InOut.mod 11269 1377 src/lib/libm2/LtoUset.e 60749 3790 src/lib/libm2/Makefile 26255 1199 src/lib/libm2/MathLib0.mod 16053 12612 src/lib/libm2/Mathlib.mod 42630 9237 src/lib/libm2/PascalIO.mod 41451 1843 src/lib/libm2/Processes.mod 44918 7377 src/lib/libm2/RealConver.mod 63536 2100 src/lib/libm2/RealInOut.mod 55614 3191 src/lib/libm2/SYSTEM.c 55569 2282 src/lib/libm2/Semaphores.mod 26957 7544 src/lib/libm2/Storage.mod 02508 540 src/lib/libm2/StrAss.c 14403 9500 src/lib/libm2/Streams.mod 42504 4336 src/lib/libm2/Strings.mod 26120 2174 src/lib/libm2/Termcap.mod 32888 2047 src/lib/libm2/Terminal.mod 08898 2069 src/lib/libm2/Traps.mod 54603 10491 src/lib/libm2/XXTermcap.c 30946 369 src/lib/libm2/absd.c 35450 506 src/lib/libm2/absf.e 30000 330 src/lib/libm2/absi.c 43380 343 src/lib/libm2/absl.c 58272 478 src/lib/libm2/blockmove.c 17511 395 src/lib/libm2/cap.c 36961 2461 src/lib/libm2/catch.c 30319 1460 src/lib/libm2/confarray.c 44050 1125 src/lib/libm2/dvi.c 52650 621 src/lib/libm2/halt.c 27035 951 src/lib/libm2/head_m2.e 08877 1012 src/lib/libm2/init.c 33994 1033 src/lib/libm2/load.c 35697 3413 src/lib/libm2/par_misc.e 19418 1213 src/lib/libm2/random.mod 56828 551 src/lib/libm2/rcka.c 45568 487 src/lib/libm2/rcki.c 24722 502 src/lib/libm2/rckil.c 60722 509 src/lib/libm2/rcku.c 30439 521 src/lib/libm2/rckul.c 08742 1824 src/lib/libm2/sigtrp.c 28252 463 src/lib/libm2/stackprio.c 21146 999 src/lib/libm2/store.c 45841 1098 src/lib/libm2/ucheck.c 15223 4820 src/lib/libp/Makefile 54110 596 src/lib/libp/abi.c 33811 598 src/lib/libp/abl.c 32007 602 src/lib/libp/abr.c 48458 1077 src/lib/libp/arg.c 45693 713 src/lib/libp/ass.c 30541 671 src/lib/libp/asz.c 23549 1366 src/lib/libp/atn.c 03567 699 src/lib/libp/bcp.c 55037 1221 src/lib/libp/bts.e 49366 825 src/lib/libp/buff.c 48452 3399 src/lib/libp/catch.c 23329 874 src/lib/libp/clock.c 18783 1235 src/lib/libp/cls.c 52152 2122 src/lib/libp/cvt.c 07989 781 src/lib/libp/diag.c 34894 1981 src/lib/libp/dis.c 56654 846 src/lib/libp/efl.c 03125 738 src/lib/libp/eln.c 58707 2948 src/lib/libp/encaps.e 02154 2146 src/lib/libp/exp.c 18305 887 src/lib/libp/fef.e 07999 923 src/lib/libp/fif.e 05601 689 src/lib/libp/get.c 55821 1804 src/lib/libp/gto.e 01694 87 src/lib/libp/head_pc.e 30008 797 src/lib/libp/hlt.c 54978 637 src/lib/libp/hol0.e 48437 1441 src/lib/libp/incpt.c 24930 1778 src/lib/libp/ini.c 46694 1257 src/lib/libp/log.c 29010 1251 src/lib/libp/mdi.c 61181 690 src/lib/libp/mdl.c 07429 1439 src/lib/libp/new.c 19059 331 src/lib/libp/nfa.c 31503 770 src/lib/libp/nobuff.c 06733 596 src/lib/libp/notext.c 35717 2430 src/lib/libp/opn.c 56170 1023 src/lib/libp/outcpt.c 35265 1329 src/lib/libp/pac.c 37498 644 src/lib/libp/pclose.c 64886 967 src/lib/libp/pcreat.c 18191 766 src/lib/libp/pentry.c 46264 614 src/lib/libp/perrno.c 58528 734 src/lib/libp/pexit.c 55604 932 src/lib/libp/popen.c 37446 626 src/lib/libp/put.c 58649 563 src/lib/libp/rcka.c 56978 663 src/lib/libp/rdc.c 62485 1391 src/lib/libp/rdi.c 62837 889 src/lib/libp/rdl.c 54819 1400 src/lib/libp/rdr.c 42257 797 src/lib/libp/rf.c 12437 682 src/lib/libp/rln.c 29063 581 src/lib/libp/rnd.c 38670 928 src/lib/libp/sav.e 31501 837 src/lib/libp/sig.e 52202 1743 src/lib/libp/sin.c 63677 1206 src/lib/libp/sqt.c 46778 1132 src/lib/libp/string.c 60764 660 src/lib/libp/trap.e 34379 914 src/lib/libp/trp.e 30627 1444 src/lib/libp/unp.c 28992 672 src/lib/libp/uread.c 10238 677 src/lib/libp/uwrite.c 08805 717 src/lib/libp/wdw.c 02118 742 src/lib/libp/wf.c 43589 814 src/lib/libp/wrc.c 63648 1522 src/lib/libp/wrf.c 60744 1334 src/lib/libp/wri.c 26053 1040 src/lib/libp/wrl.c 08005 1296 src/lib/libp/wrr.c 16261 1327 src/lib/libp/wrs.c 10901 820 src/lib/libp/wrz.c 07491 331 src/lib/liby/Makefile 27892 1979 src/lib/liby/main.c 45491 2050 src/lib/liby/yyerror.c 64175 1566 src/lib/math/Makefile 56977 1423 src/lib/math/asin.c 63411 1439 src/lib/math/atan.c 31427 848 src/lib/math/atan2.c 43076 435 src/lib/math/ceil.c 52123 1374 src/lib/math/exp.c 22070 305 src/lib/math/fabs.c 40318 437 src/lib/math/floor.c 20558 548 src/lib/math/fmod.c 54899 433 src/lib/math/frexp.s 10469 351 src/lib/math/hugeval.c 31697 201 src/lib/math/isnan.c 09597 1016 src/lib/math/ldexp.c 14257 1999 src/lib/math/localmath.h 04473 1342 src/lib/math/log.c 07539 536 src/lib/math/log10.c 13103 576 src/lib/math/modf.s 35834 1088 src/lib/math/pow.c 16439 1794 src/lib/math/sin.c 20891 1562 src/lib/math/sinh.c 31661 830 src/lib/math/sqrt.c 29279 1609 src/lib/math/tan.c 42255 1142 src/lib/math/tanh.c 51681 3908 src/lib/other/Makefile 17304 1151 src/lib/other/_brk.c 39796 429 src/lib/other/_reboot.c 19888 601 src/lib/other/_seekdir.c 62951 540 src/lib/other/_svrctl.c 48506 3231 src/lib/other/asynchio.c 01415 242 src/lib/other/bcmp.c 45677 195 src/lib/other/bcopy.c 53320 166 src/lib/other/bzero.c 37074 12795 src/lib/other/configfile.c 07091 2018 src/lib/other/crypt.c 37854 690 src/lib/other/ctermid.c 07585 565 src/lib/other/cuserid.c 45139 780 src/lib/other/environ.c 11963 108 src/lib/other/errno.c 18912 1136 src/lib/other/fdopen.c 39361 243 src/lib/other/ffs.c 33463 7218 src/lib/other/fslib.c 25648 1227 src/lib/other/fsversion.c 41650 3351 src/lib/other/getgrent.c 44987 453 src/lib/other/getlogin.c 59599 1212 src/lib/other/getopt.c 60547 1559 src/lib/other/getpass.c 30118 3288 src/lib/other/getpwent.c 35725 3542 src/lib/other/getttyent.c 47792 382 src/lib/other/getw.c 11271 812 src/lib/other/hypot.c 59956 233 src/lib/other/index.c 36168 496 src/lib/other/itoa.c 50469 446 src/lib/other/loadname.c 54806 1185 src/lib/other/lock.c 13967 1121 src/lib/other/lrand.c 44046 1143 src/lib/other/lsearch.c 54578 857 src/lib/other/memccpy.c 28898 4968 src/lib/other/mtab.c 22043 1846 src/lib/other/nlist.c 52212 1242 src/lib/other/peekpoke.c 18101 2303 src/lib/other/popen.c 42098 1625 src/lib/other/putenv.c 52227 375 src/lib/other/putw.c 14336 28263 src/lib/other/regexp.c 23055 2153 src/lib/other/regsub.c 11482 236 src/lib/other/rindex.c 38563 207 src/lib/other/stderr.c 15913 326 src/lib/other/swab.c 49455 424 src/lib/other/syscall.c 64506 1031 src/lib/other/sysconf.c 14403 303 src/lib/other/telldir.c 60493 7052 src/lib/other/termcap.c 04434 1295 src/lib/other/ttyname.c 39585 1156 src/lib/other/ttyslot.c 31838 6936 src/lib/posix/Makefile 18123 161 src/lib/posix/__exit.c 14095 215 src/lib/posix/_access.c 25374 196 src/lib/posix/_alarm.c 32652 178 src/lib/posix/_cfgetispeed.c 45653 178 src/lib/posix/_cfgetospeed.c 26347 195 src/lib/posix/_cfsetispeed.c 16508 195 src/lib/posix/_cfsetospeed.c 61777 177 src/lib/posix/_chdir.c 48447 216 src/lib/posix/_chmod.c 34102 303 src/lib/posix/_chown.c 43074 181 src/lib/posix/_chroot.c 20373 157 src/lib/posix/_close.c 47237 412 src/lib/posix/_closedir.c 57626 213 src/lib/posix/_creat.c 11406 159 src/lib/posix/_dup.c 25042 561 src/lib/posix/_dup2.c 24249 557 src/lib/posix/_execl.c 20052 590 src/lib/posix/_execle.c 02907 310 src/lib/posix/_execlp.c 63938 313 src/lib/posix/_execv.c 52076 2618 src/lib/posix/_execve.c 33391 1905 src/lib/posix/_execvp.c 15172 809 src/lib/posix/_fcntl.c 17912 129 src/lib/posix/_fork.c 46053 1368 src/lib/posix/_fpathconf.c 18078 217 src/lib/posix/_fstat.c 43070 3066 src/lib/posix/_getcwd.c 21616 442 src/lib/posix/_getegid.c 12170 442 src/lib/posix/_geteuid.c 06926 146 src/lib/posix/_getgid.c 34553 347 src/lib/posix/_getgroups.c 15684 141 src/lib/posix/_getpgrp.c 17603 137 src/lib/posix/_getpid.c 42806 440 src/lib/posix/_getppid.c 09344 146 src/lib/posix/_getuid.c 15942 282 src/lib/posix/_ioctl.c 38770 208 src/lib/posix/_isatty.c 59175 259 src/lib/posix/_kill.c 16680 301 src/lib/posix/_link.c 35083 290 src/lib/posix/_lseek.c 19854 270 src/lib/posix/_mkdir.c 35910 219 src/lib/posix/_mkfifo.c 08543 380 src/lib/posix/_mknod.c 56045 714 src/lib/posix/_mktemp.c 33500 328 src/lib/posix/_mount.c 22564 524 src/lib/posix/_open.c 17259 1059 src/lib/posix/_opendir.c 23866 738 src/lib/posix/_pathconf.c 36334 131 src/lib/posix/_pause.c 02678 211 src/lib/posix/_pipe.c 57530 512 src/lib/posix/_ptrace.c 24270 251 src/lib/posix/_read.c 23121 1317 src/lib/posix/_readdir.c 25143 308 src/lib/posix/_rename.c 36439 246 src/lib/posix/_rewinddir.c 31474 177 src/lib/posix/_rmdir.c 02689 172 src/lib/posix/_setgid.c 09413 137 src/lib/posix/_setsid.c 35236 166 src/lib/posix/_setuid.c 40468 471 src/lib/posix/_sigaction.c 37636 230 src/lib/posix/_sigpending.c 25425 438 src/lib/posix/_sigprocmask.c 10522 1490 src/lib/posix/_sigreturn.c 20882 1659 src/lib/posix/_sigset.c 57004 214 src/lib/posix/_sigsetjmp.c 64065 201 src/lib/posix/_sigsuspend.c 61297 1788 src/lib/posix/_sleep.c 36407 287 src/lib/posix/_stat.c 22382 187 src/lib/posix/_stime.c 19811 127 src/lib/posix/_sync.c 40650 226 src/lib/posix/_tcdrain.c 55015 238 src/lib/posix/_tcflow.c 36120 269 src/lib/posix/_tcflush.c 59633 222 src/lib/posix/_tcgetattr.c 13847 261 src/lib/posix/_tcsendbreak.c 08905 585 src/lib/posix/_tcsetattr.c 55813 224 src/lib/posix/_time.c 46875 388 src/lib/posix/_times.c 61209 196 src/lib/posix/_umask.c 01674 181 src/lib/posix/_umount.c 10141 1418 src/lib/posix/_uname.c 51800 181 src/lib/posix/_unlink.c 16032 526 src/lib/posix/_utime.c 13746 220 src/lib/posix/_wait.c 14744 307 src/lib/posix/_waitpid.c 62382 262 src/lib/posix/_write.c 25055 261 src/lib/rts/Makefile 15879 2409 src/lib/rts/setjmp.e 44981 3832 src/lib/stdio/Makefile 57537 211 src/lib/stdio/clearerr.c 53835 525 src/lib/stdio/data.c 13624 6610 src/lib/stdio/doprnt.c 59396 10180 src/lib/stdio/doscan.c 48725 690 src/lib/stdio/ecvt.c 52880 601 src/lib/stdio/fclose.c 49535 180 src/lib/stdio/feof.c 33946 194 src/lib/stdio/ferror.c 32966 1722 src/lib/stdio/fflush.c 30188 196 src/lib/stdio/fgetc.c 25339 236 src/lib/stdio/fgetpos.c 06247 454 src/lib/stdio/fgets.c 58676 187 src/lib/stdio/fileno.c 20931 1576 src/lib/stdio/fillbuf.c 01730 2971 src/lib/stdio/flushbuf.c 03183 2917 src/lib/stdio/fopen.c 32801 345 src/lib/stdio/fprintf.c 59627 186 src/lib/stdio/fputc.c 08575 276 src/lib/stdio/fputs.c 01752 487 src/lib/stdio/fread.c 00092 1996 src/lib/stdio/freopen.c 42981 350 src/lib/stdio/fscanf.c 36056 1047 src/lib/stdio/fseek.c 59185 213 src/lib/stdio/fsetpos.c 53842 777 src/lib/stdio/ftell.c 62279 500 src/lib/stdio/fwrite.c 17785 174 src/lib/stdio/getc.c 22135 193 src/lib/stdio/getchar.c 15460 416 src/lib/stdio/gets.c 15250 436 src/lib/stdio/icompute.c 07726 1457 src/lib/stdio/loc_incl.h 36595 593 src/lib/stdio/perror.c 65114 337 src/lib/stdio/printf.c 48686 189 src/lib/stdio/putc.c 18213 207 src/lib/stdio/putchar.c 10197 362 src/lib/stdio/puts.c 56840 210 src/lib/stdio/remove.c 35487 265 src/lib/stdio/rewind.c 39373 353 src/lib/stdio/scanf.c 00570 274 src/lib/stdio/setbuf.c 61090 928 src/lib/stdio/setvbuf.c 02466 557 src/lib/stdio/sprintf.c 06826 594 src/lib/stdio/sscanf.c 63706 606 src/lib/stdio/tmpfile.c 41530 701 src/lib/stdio/tmpnam.c 50992 584 src/lib/stdio/ungetc.c 15316 281 src/lib/stdio/vfprintf.c 57297 293 src/lib/stdio/vprintf.c 31014 219 src/lib/stdio/vscanf.c 52427 728 src/lib/stdio/vsprintf.c 24119 462 src/lib/stdio/vsscanf.c 60350 7155 src/lib/syscall/Makefile 08172 74 src/lib/syscall/_exit.s 64623 78 src/lib/syscall/access.s 27592 74 src/lib/syscall/alarm.s 23966 66 src/lib/syscall/brk.s 48011 98 src/lib/syscall/cfgetispeed.s 62948 98 src/lib/syscall/cfgetospeed.s 63003 98 src/lib/syscall/cfsetispeed.s 47220 98 src/lib/syscall/cfsetospeed.s 55611 74 src/lib/syscall/chdir.s 02448 74 src/lib/syscall/chmod.s 22898 74 src/lib/syscall/chown.s 11407 78 src/lib/syscall/chroot.s 51907 74 src/lib/syscall/close.s 33511 86 src/lib/syscall/closedir.s 60915 74 src/lib/syscall/creat.s 55833 66 src/lib/syscall/dup.s 59259 70 src/lib/syscall/dup2.s 54806 74 src/lib/syscall/execl.s 00645 78 src/lib/syscall/execle.s 42490 78 src/lib/syscall/execlp.s 12555 74 src/lib/syscall/execv.s 39355 78 src/lib/syscall/execve.s 16068 78 src/lib/syscall/execvp.s 20771 74 src/lib/syscall/fcntl.s 46974 70 src/lib/syscall/fork.s 14818 90 src/lib/syscall/fpathconf.s 10394 74 src/lib/syscall/fstat.s 03545 78 src/lib/syscall/getcwd.s 33798 82 src/lib/syscall/getegid.s 53749 82 src/lib/syscall/geteuid.s 19947 78 src/lib/syscall/getgid.s 62453 90 src/lib/syscall/getgroups.s 59632 82 src/lib/syscall/getpgrp.s 18256 78 src/lib/syscall/getpid.s 54524 82 src/lib/syscall/getppid.s 17809 78 src/lib/syscall/getuid.s 51068 74 src/lib/syscall/ioctl.s 28766 78 src/lib/syscall/isatty.s 10173 70 src/lib/syscall/kill.s 20420 70 src/lib/syscall/link.s 36362 74 src/lib/syscall/lseek.s 13455 74 src/lib/syscall/mkdir.s 16233 78 src/lib/syscall/mkfifo.s 61565 74 src/lib/syscall/mknod.s 02436 78 src/lib/syscall/mktemp.s 60780 74 src/lib/syscall/mount.s 07616 70 src/lib/syscall/open.s 35041 82 src/lib/syscall/opendir.s 08881 86 src/lib/syscall/pathconf.s 25049 74 src/lib/syscall/pause.s 50619 70 src/lib/syscall/pipe.s 26568 78 src/lib/syscall/ptrace.s 59810 70 src/lib/syscall/read.s 40218 82 src/lib/syscall/readdir.s 52671 78 src/lib/syscall/reboot.s 49198 78 src/lib/syscall/rename.s 13896 90 src/lib/syscall/rewinddir.s 64429 74 src/lib/syscall/rmdir.s 20328 70 src/lib/syscall/sbrk.s 34002 82 src/lib/syscall/seekdir.s 29150 78 src/lib/syscall/setgid.s 31450 78 src/lib/syscall/setsid.s 31140 78 src/lib/syscall/setuid.s 17893 90 src/lib/syscall/sigaction.s 14079 90 src/lib/syscall/sigaddset.s 14254 90 src/lib/syscall/sigdelset.s 61916 98 src/lib/syscall/sigemptyset.s 56107 94 src/lib/syscall/sigfillset.s 13601 98 src/lib/syscall/sigismember.s 00581 94 src/lib/syscall/sigpending.s 63570 98 src/lib/syscall/sigprocmask.s 36729 90 src/lib/syscall/sigreturn.s 31770 94 src/lib/syscall/sigsuspend.s 41407 74 src/lib/syscall/sleep.s 52335 70 src/lib/syscall/stat.s 19323 74 src/lib/syscall/stime.s 06841 78 src/lib/syscall/svrctl.s 46267 70 src/lib/syscall/sync.s 35314 82 src/lib/syscall/tcdrain.s 45475 78 src/lib/syscall/tcflow.s 10116 82 src/lib/syscall/tcflush.s 45390 90 src/lib/syscall/tcgetattr.s 32289 98 src/lib/syscall/tcsendbreak.s 49120 90 src/lib/syscall/tcsetattr.s 39554 70 src/lib/syscall/time.s 12804 74 src/lib/syscall/times.s 44625 74 src/lib/syscall/umask.s 37827 78 src/lib/syscall/umount.s 33412 74 src/lib/syscall/uname.s 25913 78 src/lib/syscall/unlink.s 17325 74 src/lib/syscall/utime.s 03615 70 src/lib/syscall/wait.s 53713 82 src/lib/syscall/waitpid.s 19752 74 src/lib/syscall/write.s 57633 1909 src/lib/syslib/Makefile 64952 4071 src/lib/syslib/kmalloc.c 08495 3545 src/lib/syslib/kprintf.c 14593 1273 src/lib/syslib/putk.c 31100 395 src/lib/syslib/sys_abort.c 59235 1007 src/lib/syslib/sys_copy.c 37895 141 src/lib/syslib/sys_endsig.c 28471 477 src/lib/syslib/sys_exec.c 65476 439 src/lib/syslib/sys_findproc.c 02695 371 src/lib/syslib/sys_fork.c 54252 316 src/lib/syslib/sys_getmap.c 60057 331 src/lib/syslib/sys_getsp.c 31142 293 src/lib/syslib/sys_kill.c 50392 333 src/lib/syslib/sys_newmap.c 27469 424 src/lib/syslib/sys_oldsig.c 17773 194 src/lib/syslib/sys_sendsig.c 51557 230 src/lib/syslib/sys_sigret.c 26735 233 src/lib/syslib/sys_sysctl.c 14450 441 src/lib/syslib/sys_times.c 29473 308 src/lib/syslib/sys_trace.c 14853 289 src/lib/syslib/sys_xit.c 04284 136 src/lib/syslib/syslib.h 39797 444 src/lib/syslib/taskcall.c 21788 1843 src/mm/Makefile 24271 14689 src/mm/alloc.c 26111 6514 src/mm/break.c 58160 536 src/mm/const.h 32268 22509 src/mm/exec.c 47065 10892 src/mm/forkexit.c 42505 1854 src/mm/getset.c 05757 757 src/mm/glo.h 04466 6096 src/mm/main.c 25746 3080 src/mm/misc.c 16283 740 src/mm/mm.h 20851 2910 src/mm/mproc.h 43756 1206 src/mm/param.h 27913 2555 src/mm/proto.h 18437 1440 src/mm/putk.c 35084 20209 src/mm/signal.c 45242 2775 src/mm/table.c 14405 3436 src/mm/trace.c 45176 215 src/mm/type.h 35187 3831 src/mm/utility.c 61481 1443 src/test/Makefile 64013 2480 src/test/common.c 04871 934 src/test/run 65006 6472 src/test/sh1 08941 5358 src/test/sh2 50844 78 src/test/t10a.c 06351 1345 src/test/t11a.c 23473 934 src/test/t11b.c 04313 2029 src/test/test1.c 56980 2549 src/test/test10.c 14097 4967 src/test/test11.c 40133 880 src/test/test12.c 36652 1254 src/test/test13.c 34909 1391 src/test/test14.c 36420 23926 src/test/test15.c 39237 6607 src/test/test16.c 27502 31446 src/test/test17.c 19069 33253 src/test/test18.c 17076 14694 src/test/test19.c 58155 7710 src/test/test2.c 64772 19331 src/test/test20.c 05592 20005 src/test/test21.c 48045 4778 src/test/test22.c 17227 12474 src/test/test23.c 50938 11875 src/test/test24.c 01362 23627 src/test/test25.c 18295 10711 src/test/test26.c 59706 10181 src/test/test27.c 37193 13762 src/test/test28.c 38098 21086 src/test/test29.c 40242 6773 src/test/test3.c 48919 9232 src/test/test30.c 58230 6734 src/test/test31.c 14642 10191 src/test/test32.c 58921 18864 src/test/test33.c 55598 17859 src/test/test34.c 31471 10060 src/test/test35.c 60024 5047 src/test/test36.c 40365 6536 src/test/test37.c 59446 6328 src/test/test38.c 50085 11299 src/test/test39.c 23128 1682 src/test/test4.c 50606 7314 src/test/test40.c 28922 7330 src/test/test5.c 55588 4437 src/test/test6.c 35450 19126 src/test/test7.c 55612 26460 src/test/test8.c 28810 4388 src/test/test9.c 34587 965 src/tools/Makefile 01179 11061 src/tools/init.c 42515 3033 src/tools/mkboot 04873 18211 src/tools/ps.c 41775 206 src/tools/tell_config ...fstabgrouppasswdprofileprotocolsrcservicesshadowtermcapttytabinet.confhostname.filemotdmtabutmp# Poor man's File System Table. root=/dev/ROOT usr=/dev/USR operator:*:0: daemon:*:1: bin:*:2: other:*:3: tty:*:4: uucp:*:5: news:*:6: ftp:*:7: kmem:*:8: www:*:9: nogroup:*:99: root:##root:0:0:Big Brother:/: daemon:*:1:1:The Deuce:/etc: bin:##root:2:0:Binaries:/usr/src: uucp:*:5:5:UNIX to UNIX copy:/usr/spool/uucp:/usr/bin/uucico news:*:6:6:Usenet news:/usr/spool/news: ftp:*:7:7:Anonymous FTP:/usr/ftp: ast:*:8:3:Andrew S. Tanenbaum:/usr/ast: www:*:9:9:World Wide Web:/usr/www: nobody:*:9999:99::/tmp: # Set timezone. TZ='GMT0' export TZ # # Internet (IP) protocols # # @(#)protocols 8.1 (Berkeley) 6/9/93 # ip 0 IP # internet protocol, pseudo protocol number icmp 1 ICMP # internet control message protocol igmp 2 IGMP # internet group management protocol ggp 3 GGP # gateway-gateway protocol tcp 6 TCP # transmission control protocol egp 8 EGP # exterior gateway protocol pup 12 PUP # PARC universal packet protocol udp 17 UDP # user datagram protocol hmp 20 HMP # host monitoring protocol xns-idp 22 XNS-IDP # Xerox NS IDP rdp 27 RDP # reliable data protocol iso-tp4 29 ISO-TP4 # ISO Transport Protocol Class 4 iso-ip 80 ISO-IP # ISO Internet Protocol encap 98 ENCAP # RFC1241 encapsulation # /etc/rc - System startup script run by init before going multiuser. umask 022 TERM="${TERM-minix}" PATH=/usr/local/bin:/bin:/usr/bin export TERM PATH usage() { echo >&2 "Usage: $0 [-saf] start|stop|down" exec intr sh } while getopts 'saf' opt do case $opt in s) sflag=t ;; # Single user a) aflag=t ;; # Ask for /usr f) fflag=t ;; # Force a full file system check *) usage esac done shift `expr $OPTIND - 1` case "$#:$1" in 1:start|1:stop|1:down) action=$1 ;; *) usage esac case $action in start) # National keyboard? test -f /etc/keymap && loadkeys /etc/keymap # Set timezone. . /etc/profile # Try to read the hardware real-time clock, otherwise do it manually. readclock || intr date -q # Initialize files. printroot >/etc/mtab # /etc/mtab keeps track of mounts >/etc/utmp # /etc/utmp keeps track of logins # /etc/fstab lists the root, tmp and usr devices. . /etc/fstab # Any swapspace on a device? test "$swap" : '/dev/' && mount -s $swap # Mount the /usr partition unless this is a single floppy Minix. if [ ! -d /usr/bin ] then if [ "$aflag" -o "$usr" = unknown ] then # We need to ask what the /usr du jour is. intr sh -c ' echo -n "Finish the name of device to mount as /usr: /dev/" read usr echo "usr=/dev/$usr" >/tmp/usr' . /tmp/usr fi mount $usr /usr || { echo "\ Please try to mount something else as /usr, then hit CTRL-D to continue startup. Mount $usr /usr failed -- Single user." intr sh } rm -f /tmp/usr fi # Check if the system crashed. if shutdown -C then echo echo "The system was not properly shut down. Checking file systems." fflag=t fi if [ "$fflag" ] then umount $usr intr fsck -r $root intr fsck -r $usr mount $usr /usr fi if [ "$sflag" ] then echo "Single user." intr sh fi # Any swapspace on a file? test -n "$swap" -a ! "$swap" : '/dev/' && mount -s $swap case "`printroot -r`" in /dev/ram) # Remove boot-only things to make space. rm -rf /boot /minix esac # Things should be alright now. echo;echo "Multiuser startup in progress." esac # Further initialization. test -f /usr/etc/rc && sh /usr/etc/rc $action test -f /usr/local/etc/rc && sh /usr/local/etc/rc $action # Any messages? test "$action" = start -a -f /etc/issue && cat /etc/issue exit 0 # # Network services, Internet style # # @(#)services 8.1 (Berkeley) 6/9/93 # tcpmux 1/tcp # TCP port multiplexer (RFC1078) echo 7/tcp echo 7/udp discard 9/tcp sink null discard 9/udp sink null systat 11/tcp users daytime 13/tcp daytime 13/udp netstat 15/tcp qotd 17/tcp quote chargen 19/tcp ttytst source chargen 19/udp ttytst source ftp 21/tcp telnet 23/tcp smtp 25/tcp mail time 37/tcp timserver time 37/udp timserver rlp 39/udp resource # resource location nameserver 42/tcp name # IEN 116 whois 43/tcp nicname domain 53/tcp nameserver # name-domain server domain 53/udp nameserver mtp 57/tcp # deprecated bootps 67/udp # Bootstrap Protocol Server bootpc 68/udp # Bootstrap Protocol Client tftp 69/udp rje 77/tcp netrjs finger 79/tcp http 80/tcp # World Wide Web link 87/tcp ttylink supdup 95/tcp hostnames 101/tcp hostname # usually from sri-nic tsap 102/tcp # part of ISODE. pop 110/tcp postoffice sunrpc 111/tcp sunrpc 111/udp auth 113/tcp authentication sftp 115/tcp uucp-path 117/tcp nntp 119/tcp readnews untp # USENET News Transfer Protocol ntp 123/udp netbios-ns 137/tcp # NETBIOS Name Service netbios-ns 137/udp # NETBIOS Name Service netbios-dgm 138/tcp # NETBIOS Datagram Service netbios-dgm 138/udp # NETBIOS Datagram Service netbios-ssn 139/tcp # NETBIOS Session Service netbios-ssn 139/udp # NETBIOS Session Service imap 143/tcp snmp 161/udp snmp-trap 162/udp # # UNIX specific services # exec 512/tcp biff 512/udp comsat login 513/tcp who 513/udp whod shell 514/tcp cmd # no passwords used syslog 514/udp printer 515/tcp spooler # line printer spooler talk 517/udp ntalk 518/udp route 520/udp router routed timed 525/udp timeserver tempo 526/tcp newdate courier 530/tcp rpc conference 531/tcp chat netnews 532/tcp readnews netwall 533/udp # -for emergency broadcasts uucp 540/tcp uucpd # uucp daemon rdist 541/tcp rdistd # rdist daemon remotefs 556/tcp rfs_server rfs # Brunhoff remote filesystem ingreslock 1524/tcp # # Kerberos (Project Athena/MIT) services # kerberos 750/udp kdc # Kerberos (server) udp kerberos 750/tcp kdc # Kerberos (server) tcp krbupdate 760/tcp kreg # Kerberos registration kpasswd 761/tcp kpwd # Kerberos "passwd" klogin 543/tcp # Kerberos rlogin eklogin 2105/tcp # Kerberos encrypted rlogin kshell 544/tcp krcmd # Kerberos remote shell root::0:0::: mx|minix|minix console:\ :am:xn:bs:\ :co#80:li#25:\ :is=\E[0m:\ :cd=\E[0J:cl=\E[H\E[0J:\ :so=\E[7m:se=\E[0m:\ :us=\E[4m:ue=\E[0m:\ :mb=\E[5m:md=\E[1m:\ :mr=\E[7m:me=\E[0m:\ :sr=\EM:\ :cm=\E[%i%d;%dH:\ :ho=\E[H:\ :al=\E[L:AL=\E[%dL:\ :ce=\E[K:\ :DC=\E[%dP:dc=\E[P:\ :DL=\E[%dM:dl=\E[M:\ :DO=\E[%dB:do=\E[B:\ :IC=\E[%d@:ic=\E[@:\ :it#8:\ :le=^H:LE=\E[%dD:\ :nd=\E[C:RI=\E[%dC:\ :up=\E[A:UP=\E[%dA:\ :ku=\E[A:kd=\E[B:\ :kl=\E[D:kr=\E[C:\ :kh=\E[H:kb=^H:\ :kD=\177:kI=\E[@:\ :kN=\E[U:kP=\E[V: du|dialup|Dialup line:\ :bs:co#80:li#24: db|dumb|Really dumb terminal:\ :bs:co#80:li#24: lp|lp|Line Printer:\ :co#80:li#66: li|ansi|Ansi standard crt:\ :am:bs:cd=\E[J:ce=\E[K:cl=\E[2J\E[H:cm=\E[%i%d;%dH:co#80:\ :dn=\E[B:me=\E[0m:mb=\E[5m:mr=\E[7m:md=\E[1m:ho=\E[H:li#24:\ :nd=\E[C:ms:pt:so=\E[7m:se=\E[0m:us=\E[4m:ue=\E[0m:up=\E[A:\ :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C: vs|xterm|xterms|vs100|xterm terminal emulator (X window system):\ :am:cr=^M:do=^J:nl=^J:bl=^G:le=^H:ho=\E[H:\ :co#80:li#24:cl=\E[H\E[2J:bs:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :md=\E[1m:mr=\E[7m:me=\E[m:\ :ku=\E[A:kd=\E[B:kr=\E[C:kl=\E[D:kb=^H:kD=\177:\ :kI=\E[@:kN=\E[U:kP=\E[V:ta=^I:pt:sf=\n:sr=\EM:\ :al=\E[L:dl=\E[M:ic=\E[@:dc=\E[P:\ :MT:ks=\E[?1h\E=:ke=\E[?1l\E>:\ :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:\ :rs=\E[r\E<\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l:xn:\ :AL=\E[%dL:DL=\E[%dM:IC=\E[%d@:DC=\E[%dP:\ :hs:ts=\E]2;:fs=^G:ds=\E]2;^G: d0|vt100|vt100-am|vt100am|dec-vt100|dec vt100:\ :do=^J:co#80:li#24:cl=\E[;H\E[2J:sf=\ED:\ :le=^H:bs:am:cm=\E[%i%d;%dH:nd=\E[C:up=\E[A:\ :ce=\E[K:cd=\E[J:so=\E[7m:se=\E[m:us=\E[4m:ue=\E[m:\ :md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:is=\E[1;24r\E[24;1H:\ :rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h:ks=\E[?1h\E=:ke=\E[?1l\E>:\ :ku=\EOA:kd=\EOB:kr=\EOC:kl=\EOD:kb=^H:\ :ho=\E[H:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:pt:sr=\EM:vt#3:xn:\ :sc=\E7:rc=\E8:cs=\E[%i%d;%dr: # ttytab - terminals # # Device Type Program Init console minix getty ttyc1 minix getty ttyc2 minix getty ttyc3 minix getty tty00 unknown tty01 unknown ttyp0 network ttyp1 network ttyp2 network ttyp3 network ttyp4 network ttyp5 network ttyp6 network ttyp7 network ttyp8 network ttyp9 network eth0 DP8390 0 { default; }; noname ...Makefilebuf.hcache.ccache2.cconst.hdev.hdevice.cfile.hfiledes.cfproc.hfs.hglo.hinode.cinode.hlink.clock.clock.hmain.cmisc.cmount.copen.cparam.hpath.cpipe.cprotect.cproto.hputk.cread.cstadir.csuper.csuper.htable.ctime.ctype.hutility.cwrite.c# Makefile for fs # Directories u = /usr i = $u/include s = $i/sys h = $i/minix # Programs, flags, etc. CC = exec cc CFLAGS = -I$i LDFLAGS = -i OBJ = main.o open.o read.o write.o pipe.o \ device.o path.o mount.o link.o super.o inode.o \ cache.o cache2.o filedes.o stadir.o protect.o time.o \ lock.c misc.o utility.o table.o putk.o fs: $(OBJ) $(CC) -o $@ $(LDFLAGS) $(OBJ) -lsys install -S 512w $@ all install: # Nothing. clean: rm -f *.o *.bak fs # Dependencies a= fs.h $h/config.h $s/types.h $h/const.h $h/type.h \ $i/limits.h $i/errno.h $i/ansi.h $h/syslib.h \ const.h type.h proto.h glo.h $s/dir.h cache.o: $a cache.o: $h/com.h cache.o: buf.h cache.o: file.h cache.o: fproc.h cache.o: super.h cache2.o: $a cache2.o: $h/com.h cache2.o: buf.h device.o: $a device.o: $i/fcntl.h device.o: $h/callnr.h device.o: $h/com.h device.o: dev.h device.o: file.h device.o: fproc.h device.o: inode.h device.o: param.h filedes.o: $a filedes.o: file.h filedes.o: fproc.h filedes.o: inode.h inode.o: $a inode.o: buf.h inode.o: file.h inode.o: fproc.h inode.o: inode.h inode.o: super.h link.o: $a link.o: $s/stat.h link.o: $i/string.h link.o: $h/callnr.h link.o: buf.h link.o: file.h link.o: fproc.h link.o: inode.h link.o: param.h link.o: super.h lock.o: $a lock.o: $i/fcntl.h lock.o: $i/unistd.h lock.o: file.h lock.o: fproc.h lock.o: inode.h lock.o: lock.h lock.o: param.h main.o: $a main.o: $i/fcntl.h main.o: $i/string.h main.o: $i/stdlib.h main.o: $s/ioctl.h main.o: $s/svrctl.h main.o: $h/callnr.h main.o: $h/com.h main.o: buf.h main.o: dev.h main.o: file.h main.o: fproc.h main.o: inode.h main.o: param.h main.o: super.h misc.o: $a misc.o: $i/fcntl.h misc.o: $i/unistd.h misc.o: $h/callnr.h misc.o: $h/com.h misc.o: $s/svrctl.h misc.o: buf.h misc.o: file.h misc.o: fproc.h misc.o: inode.h misc.o: dev.h misc.o: param.h mount.o: $a mount.o: $i/fcntl.h mount.o: $h/com.h mount.o: $s/stat.h mount.o: buf.h mount.o: dev.h mount.o: file.h mount.o: fproc.h mount.o: inode.h mount.o: param.h mount.o: super.h open.o: $a open.o: $s/stat.h open.o: $i/fcntl.h open.o: $h/callnr.h open.o: $h/com.h open.o: buf.h open.o: dev.h open.o: file.h open.o: fproc.h open.o: inode.h open.o: lock.h open.o: param.h path.o: $a path.o: $i/string.h path.o: $h/callnr.h path.o: buf.h path.o: file.h path.o: fproc.h path.o: inode.h path.o: super.h pipe.o: $a pipe.o: $i/fcntl.h pipe.o: $i/signal.h pipe.o: $h/callnr.h pipe.o: $h/com.h pipe.o: dev.h pipe.o: file.h pipe.o: fproc.h pipe.o: inode.h pipe.o: param.h protect.o: $a protect.o: $i/unistd.h protect.o: $h/callnr.h protect.o: buf.h protect.o: file.h protect.o: fproc.h protect.o: inode.h protect.o: param.h protect.o: super.h putk.o: $a putk.o: $h/com.h read.o: $a read.o: $i/fcntl.h read.o: $h/com.h read.o: buf.h read.o: file.h read.o: fproc.h read.o: inode.h read.o: param.h read.o: super.h stadir.o: $a stadir.o: $s/stat.h stadir.o: file.h stadir.o: fproc.h stadir.o: inode.h stadir.o: param.h super.o: $a super.o: $i/string.h super.o: buf.h super.o: inode.h super.o: super.h table.o: $a table.o: $h/callnr.h table.o: $h/com.h table.o: buf.h table.o: dev.h table.o: file.h table.o: fproc.h table.o: inode.h table.o: lock.h table.o: super.h time.o: $a time.o: $h/callnr.h time.o: $h/com.h time.o: file.h time.o: fproc.h time.o: inode.h time.o: param.h utility.o: $a utility.o: $h/com.h utility.o: $i/unistd.h utility.o: buf.h utility.o: file.h utility.o: fproc.h utility.o: inode.h utility.o: param.h write.o: $a write.o: $i/string.h write.o: buf.h write.o: file.h write.o: fproc.h write.o: inode.h write.o: super.h /* Buffer (block) cache. To acquire a block, a routine calls get_block(), * telling which block it wants. The block is then regarded as "in use" * and has its 'b_count' field incremented. All the blocks that are not * in use are chained together in an LRU list, with 'front' pointing * to the least recently used block, and 'rear' to the most recently used * block. A reverse chain, using the field b_prev is also maintained. * Usage for LRU is measured by the time the put_block() is done. The second * parameter to put_block() can violate the LRU order and put a block on the * front of the list, if it will probably not be needed soon. If a block * is modified, the modifying routine must set b_dirt to DIRTY, so the block * will eventually be rewritten to the disk. */ #include /* need struct direct */ EXTERN struct buf { /* Data portion of the buffer. */ union { char b__data[BLOCK_SIZE]; /* ordinary user data */ struct direct b__dir[NR_DIR_ENTRIES]; /* directory block */ zone1_t b__v1_ind[V1_INDIRECTS]; /* V1 indirect block */ zone_t b__v2_ind[V2_INDIRECTS]; /* V2 indirect block */ d1_inode b__v1_ino[V1_INODES_PER_BLOCK]; /* V1 inode block */ d2_inode b__v2_ino[V2_INODES_PER_BLOCK]; /* V2 inode block */ bitchunk_t b__bitmap[BITMAP_CHUNKS]; /* bit map block */ } b; /* Header portion of the buffer. */ struct buf *b_next; /* used to link all free bufs in a chain */ struct buf *b_prev; /* used to link all free bufs the other way */ struct buf *b_hash; /* used to link bufs on hash chains */ block_t b_blocknr; /* block number of its (minor) device */ dev_t b_dev; /* major | minor device where block resides */ char b_dirt; /* CLEAN or DIRTY */ char b_count; /* number of users of this buffer */ } buf[NR_BUFS]; /* A block is free if b_dev == NO_DEV. */ #define NIL_BUF ((struct buf *) 0) /* indicates absence of a buffer */ /* These defs make it possible to use to bp->b_data instead of bp->b.b__data */ #define b_data b.b__data #define b_dir b.b__dir #define b_v1_ind b.b__v1_ind #define b_v2_ind b.b__v2_ind #define b_v1_ino b.b__v1_ino #define b_v2_ino b.b__v2_ino #define b_bitmap b.b__bitmap EXTERN struct buf *buf_hash[NR_BUF_HASH]; /* the buffer hash table */ EXTERN struct buf *front; /* points to least recently used free block */ EXTERN struct buf *rear; /* points to most recently used free block */ EXTERN int bufs_in_use; /* # bufs currently in use (not on free list)*/ /* When a block is released, the type of usage is passed to put_block(). */ #define WRITE_IMMED 0100 /* block should be written to disk now */ #define ONE_SHOT 0200 /* set if block not likely to be needed soon */ #define INODE_BLOCK 0 /* inode block */ #define DIRECTORY_BLOCK 1 /* directory block */ #define INDIRECT_BLOCK 2 /* pointer block */ #define MAP_BLOCK 3 /* bit map */ #define ZUPER_BLOCK (4 + WRITE_IMMED + ONE_SHOT) /* super block */ #define FULL_DATA_BLOCK 5 /* data, fully used */ #define PARTIAL_DATA_BLOCK 6 /* data, partly used*/ #define HASH_MASK (NR_BUF_HASH - 1) /* mask for hashing block numbers */ /* The file system maintains a buffer cache to reduce the number of disk * accesses needed. Whenever a read or write to the disk is done, a check is * first made to see if the block is in the cache. This file manages the * cache. * * The entry points into this file are: * get_block: request to fetch a block for reading or writing from cache * put_block: return a block previously requested with get_block * alloc_zone: allocate a new zone (to increase the length of a file) * free_zone: release a zone (when a file is removed) * rw_block: read or write a block from the disk itself * invalidate: remove all the cache blocks on some device */ #include "fs.h" #include #include "buf.h" #include "file.h" #include "fproc.h" #include "super.h" FORWARD _PROTOTYPE( void rm_lru, (struct buf *bp) ); /*===========================================================================* * get_block * *===========================================================================*/ PUBLIC struct buf *get_block(dev, block, only_search) register dev_t dev; /* on which device is the block? */ register block_t block; /* which block is wanted? */ int only_search; /* if NO_READ, don't read, else act normal */ { /* Check to see if the requested block is in the block cache. If so, return * a pointer to it. If not, evict some other block and fetch it (unless * 'only_search' is 1). All the blocks in the cache that are not in use * are linked together in a chain, with 'front' pointing to the least recently * used block and 'rear' to the most recently used block. If 'only_search' is * 1, the block being requested will be overwritten in its entirety, so it is * only necessary to see if it is in the cache; if it is not, any free buffer * will do. It is not necessary to actually read the block in from disk. * If 'only_search' is PREFETCH, the block need not be read from the disk, * and the device is not to be marked on the block, so callers can tell if * the block returned is valid. * In addition to the LRU chain, there is also a hash chain to link together * blocks whose block numbers end with the same bit strings, for fast lookup. */ int b; register struct buf *bp, *prev_ptr; /* Search the hash chain for (dev, block). Do_read() can use * get_block(NO_DEV ...) to get an unnamed block to fill with zeros when * someone wants to read from a hole in a file, in which case this search * is skipped */ if (dev != NO_DEV) { b = (int) block & HASH_MASK; bp = buf_hash[b]; while (bp != NIL_BUF) { if (bp->b_blocknr == block && bp->b_dev == dev) { /* Block needed has been found. */ if (bp->b_count == 0) rm_lru(bp); bp->b_count++; /* record that block is in use */ return(bp); } else { /* This block is not the one sought. */ bp = bp->b_hash; /* move to next block on hash chain */ } } } /* Desired block is not on available chain. Take oldest block ('front'). */ if ((bp = front) == NIL_BUF) panic("all buffers in use", NR_BUFS); rm_lru(bp); /* Remove the block that was just taken from its hash chain. */ b = (int) bp->b_blocknr & HASH_MASK; prev_ptr = buf_hash[b]; if (prev_ptr == bp) { buf_hash[b] = bp->b_hash; } else { /* The block just taken is not on the front of its hash chain. */ while (prev_ptr->b_hash != NIL_BUF) if (prev_ptr->b_hash == bp) { prev_ptr->b_hash = bp->b_hash; /* found it */ break; } else { prev_ptr = prev_ptr->b_hash; /* keep looking */ } } /* If the block taken is dirty, make it clean by writing it to the disk. * Avoid hysteresis by flushing all other dirty blocks for the same device. */ if (bp->b_dev != NO_DEV) { if (bp->b_dirt == DIRTY) flushall(bp->b_dev); #if ENABLE_CACHE2 put_block2(bp); #endif } /* Fill in block's parameters and add it to the hash chain where it goes. */ bp->b_dev = dev; /* fill in device number */ bp->b_blocknr = block; /* fill in block number */ bp->b_count++; /* record that block is being used */ b = (int) bp->b_blocknr & HASH_MASK; bp->b_hash = buf_hash[b]; buf_hash[b] = bp; /* add to hash list */ /* Go get the requested block unless searching or prefetching. */ if (dev != NO_DEV) { #if ENABLE_CACHE2 if (get_block2(bp, only_search)) /* in 2nd level cache */; else #endif if (only_search == PREFETCH) bp->b_dev = NO_DEV; else if (only_search == NORMAL) rw_block(bp, READING); } return(bp); /* return the newly acquired block */ } /*===========================================================================* * put_block * *===========================================================================*/ PUBLIC void put_block(bp, block_type) register struct buf *bp; /* pointer to the buffer to be released */ int block_type; /* INODE_BLOCK, DIRECTORY_BLOCK, or whatever */ { /* Return a block to the list of available blocks. Depending on 'block_type' * it may be put on the front or rear of the LRU chain. Blocks that are * expected to be needed again shortly (e.g., partially full data blocks) * go on the rear; blocks that are unlikely to be needed again shortly * (e.g., full data blocks) go on the front. Blocks whose loss can hurt * the integrity of the file system (e.g., inode blocks) are written to * disk immediately if they are dirty. */ if (bp == NIL_BUF) return; /* it is easier to check here than in caller */ bp->b_count--; /* there is one use fewer now */ if (bp->b_count != 0) return; /* block is still in use */ bufs_in_use--; /* one fewer block buffers in use */ /* Put this block back on the LRU chain. If the ONE_SHOT bit is set in * 'block_type', the block is not likely to be needed again shortly, so put * it on the front of the LRU chain where it will be the first one to be * taken when a free buffer is needed later. */ if (block_type & ONE_SHOT) { /* Block probably won't be needed quickly. Put it on front of chain. * It will be the next block to be evicted from the cache. */ bp->b_prev = NIL_BUF; bp->b_next = front; if (front == NIL_BUF) rear = bp; /* LRU chain was empty */ else front->b_prev = bp; front = bp; } else { /* Block probably will be needed quickly. Put it on rear of chain. * It will not be evicted from the cache for a long time. */ bp->b_prev = rear; bp->b_next = NIL_BUF; if (rear == NIL_BUF) front = bp; else rear->b_next = bp; rear = bp; } /* Some blocks are so important (e.g., inodes, indirect blocks) that they * should be written to the disk immediately to avoid messing up the file * system in the event of a crash. */ if ((block_type & WRITE_IMMED) && bp->b_dirt==DIRTY && bp->b_dev != NO_DEV) rw_block(bp, WRITING); } /*===========================================================================* * alloc_zone * *===========================================================================*/ PUBLIC zone_t alloc_zone(dev, z) dev_t dev; /* device where zone wanted */ zone_t z; /* try to allocate new zone near this one */ { /* Allocate a new zone on the indicated device and return its number. */ int major, minor; bit_t b, bit; struct super_block *sp; /* Note that the routine alloc_bit() returns 1 for the lowest possible * zone, which corresponds to sp->s_firstdatazone. To convert a value * between the bit number, 'b', used by alloc_bit() and the zone number, 'z', * stored in the inode, use the formula: * z = b + sp->s_firstdatazone - 1 * Alloc_bit() never returns 0, since this is used for NO_BIT (failure). */ sp = get_super(dev); /* find the super_block for this device */ /* If z is 0, skip initial part of the map known to be fully in use. */ if (z == sp->s_firstdatazone) { bit = sp->s_zsearch; } else { bit = (bit_t) z - (sp->s_firstdatazone - 1); } b = alloc_bit(sp, ZMAP, bit); if (b == NO_BIT) { err_code = ENOSPC; major = (int) (sp->s_dev >> MAJOR) & BYTE; minor = (int) (sp->s_dev >> MINOR) & BYTE; printf("No space on %sdevice %d/%d\n", sp->s_dev == root_dev ? "root " : "", major, minor); return(NO_ZONE); } if (z == sp->s_firstdat''''''''azone) sp->s_zsearch = b; /* for next time */ return(sp->s_firstdatazone - 1 + (zone_t) b); } /*===========================================================================* * free_zone * *===========================================================================*/ PUBLIC void free_zone(dev, numb) dev_t dev; /* device where zone located */ zone_t numb; /* zone to be returned */ { /* Return a zone. */ register struct super_block *sp; bit_t bit; /* Locate the appropriate super_block and return bit. */ sp = get_super(dev); if (numb < sp->s_firstdatazone || numb >= sp->s_zones) return; bit = (bit_t) (numb - (sp->s_firstdatazone - 1)); free_bit(sp, ZMAP, bit); if (bit < sp->s_zsearch) sp->s_zsearch = bit; } /*===========================================================================* * rw_block * *===========================================================================*/ PUBLIC void rw_block(bp, rw_flag) register struct buf *bp; /* buffer pointer */ int rw_flag; /* READING or WRITING */ { /* Read or write a disk block. This is the only routine in which actual disk * I/O is invoked. If an error occurs, a message is printed here, but the error * is not reported to the caller. If the error occurred while purging a block * from the cache, it is not clear what the caller could do about it anyway. */ int r, op; off_t pos; dev_t dev; if ( (dev = bp->b_dev) != NO_DEV) { pos = (off_t) bp->b_blocknr * BLOCK_SIZE; op = (rw_flag == READING ? DEV_READ : DEV_WRITE); r = dev_io(op, dev, FS_PROC_NR, bp->b_data, pos, BLOCK_SIZE, 0); if (r != BLOCK_SIZE) { if (r >= 0) r = END_OF_FILE; if (r != END_OF_FILE) printf("Unrecoverable disk error on device %d/%d, block %ld\n", (dev>>MAJOR)&BYTE, (dev>>MINOR)&BYTE, bp->b_blocknr); bp->b_dev = NO_DEV; /* invalidate block */ /* Report read errors to interested parties. */ if (rw_flag == READING) rdwt_err = r; } } bp->b_dirt = CLEAN; } /*===========================================================================* * invalidate * *===========================================================================*/ PUBLIC void invalidate(device) dev_t device; /* device whose blocks are to be purged */ { /* Remove all the blocks belonging to some device from the cache. */ register struct buf *bp; for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) if (bp->b_dev == device) bp->b_dev = NO_DEV; #if ENABLE_CACHE2 invalidate2(device); #endif } /*==========================================================================* * flushall * *==========================================================================*/ PUBLIC void flushall(dev) dev_t dev; /* device to flush */ { /* Flush all dirty blocks for one device. */ register struct buf *bp; static struct buf *dirty[NR_BUFS]; /* static so it isn't on stack */ int ndirty; for (bp = &buf[0], ndirty = 0; bp < &buf[NR_BUFS]; bp++) if (bp->b_dirt == DIRTY && bp->b_dev == dev) dirty[ndirty++] = bp; rw_scattered(dev, dirty, ndirty, WRITING); } /*===========================================================================* * rw_scattered * *===========================================================================*/ PUBLIC void rw_scattered(dev, bufq, bufqsize, rw_flag) dev_t dev; /* major-minor device number */ struct buf **bufq; /* pointer to array of buffers */ int bufqsize; /* number of buffers */ int rw_flag; /* READING or WRITING */ { /* Read or write scattered data from a device. */ register struct buf *bp; int gap; register int i; register iovec_t *iop; static iovec_t iovec[NR_IOREQS]; /* static so it isn't on stack */ int j, r; /* (Shell) sort buffers on b_blocknr. */ gap = 1; do gap = 3 * gap + 1; while (gap <= bufqsize); while (gap != 1) { gap /= 3; for (j = gap; j < bufqsize; j++) { for (i = j - gap; i >= 0 && bufq[i]->b_blocknr > bufq[i + gap]->b_blocknr; i -= gap) { bp = bufq[i]; bufq[i] = bufq[i + gap]; bufq[i + gap] = bp; } } } /* Set up I/O vector and do I/O. The result of dev_io is OK if everything * went fine, otherwise the error code for the first failed transfer. */ while (bufqsize > 0) { for (j = 0, iop = iovec; j < NR_IOREQS && j < bufqsize; j++, iop++) { bp = bufq[j]; if (bp->b_blocknr != bufq[0]->b_blocknr + j) break; iop->iov_addr = (vir_bytes) bp->b_data; iop->iov_size = BLOCK_SIZE; } r = dev_io(rw_flag == WRITING ? DEV_SCATTER : DEV_GATHER, dev, FS_PROC_NR, iovec, (off_t) bufq[0]->b_blocknr * BLOCK_SIZE, j, 0); /* Harvest the results. Dev_io reports the first error it may have * encountered, but we only care if it's the first block that failed. */ for (i = 0, iop = iovec; i < j; i++, iop++) { bp = bufq[i]; if (iop->iov_size != 0) { /* Transfer failed. An error? Do we care? */ if (r != OK && i == 0) { printf( "fs: I/O error on device %d/%d, block %lu\n", (dev>>MAJOR)&BYTE, (dev>>MINOR)&BYTE, bp->b_blocknr); bp->b_dev = NO_DEV; /* invalidate block */ } break; } if (rw_flag == READING) { bp->b_dev = dev; /* validate block */ put_block(bp, PARTIAL_DATA_BLOCK); } else { bp->b_dirt = CLEAN; } } bufq += i; bufqsize -= i; if (rw_flag == READING) { /* Don't bother reading more than the device is willing to * give at this time. Don't forget to release those extras. */ while (bufqsize > 0) { put_block(*bufq++, PARTIAL_DATA_BLOCK); bufqsize--; } } } } /*===========================================================================* * rm_lru * *===========================================================================*/ PRIVATE void rm_lru(bp) struct buf *bp; { /* Remove a block from its LRU chain. */ struct buf *next_ptr, *prev_ptr; bufs_in_use++; next_ptr = bp->b_next; /* successor on LRU chain */ prev_ptr = bp->b_prev; /* predecessor on LRU chain */ if (prev_ptr != NIL_BUF) prev_ptr->b_next = next_ptr; else front = next_ptr; /* this block was at front of chain */ if (next_ptr != NIL_BUF) next_ptr->b_prev = prev_ptr; else rear = prev_ptr; /* this block was at rear of chain */ } /* Second level block cache to supplement the file system cache. The block * cache of a 16-bit Minix system is very small, too small to prevent trashing. * A generic 32-bit system also doesn't have a very large cache to allow it * to run on systems with little memory. On a system with lots of memory one * can use the RAM disk as a read-only second level cache. Any blocks pushed * out of the primary cache are cached on the RAM disk. This code manages the * second level cache. The cache is a simple FIFO where old blocks are put * into and drop out at the other end. Must be searched backwards. * * The entry points into this file are: * init_cache2: initialize the second level cache * get_block2: get a block from the 2nd level cache * put_block2: store a block in the 2nd level cache * invalidate2: remove all the cache blocks on some device */ #include "fs.h" #include #include "buf.h" #if ENABLE_CACHE2 #define MAX_BUF2 (256 * sizeof(char *)) PRIVATE struct buf2 { /* 2nd level cache per block administration */ block_t b2_blocknr; /* block number */ dev_t b2_dev; /* device number */ u16_t b2_count; /* count of in-cache block groups */ } buf2[MAX_BUF2]; PRIVATE unsigned nr_buf2; /* actual cache size */ PRIVATE unsigned buf2_idx; /* round-robin reuse index */ #define hash2(block) ((unsigned) ((block) & (MAX_BUF2 - 1))) /*===========================================================================* * init_cache2 * *===========================================================================*/ PUBLIC void init_cache2(size) unsigned long size; { /* Initialize the second level disk buffer cache of 'size' blocks. */ nr_buf2 = size > MAX_BUF2 ? MAX_BUF2 : (unsigned) size; } /*===========================================================================* * get_block2 * *===========================================================================*/ PUBLIC int get_block2(bp, only_search) struct buf *bp; /* buffer to get from the 2nd level cache */ int only_search; /* if NO_READ, do nothing, else act normal */ { /* Fill a buffer from the 2nd level cache. Return true iff block acquired. */ unsigned b; struct buf2 *bp2; /* If the block wanted is in the RAM disk then our game is over. */ if (bp->b_dev == DEV_RAM) nr_buf2 = 0; /* Cache enabled? NO_READ? Any blocks with the same hash key? */ if (nr_buf2 == 0 || only_search == NO_READ || buf2[hash2(bp->b_blocknr)].b2_count == 0) return(0); /* Search backwards (there may be older versions). */ b = buf2_idx; for (;;) { if (b == 0) b = nr_buf2; bp2 = &buf2[--b]; if (bp2->b2_blocknr == bp->b_blocknr && bp2->b2_dev == bp->b_dev) break; if (b == buf2_idx) return(0); } /* Block is in the cache, get it. */ if (dev_io(DEV_READ, DEV_RAM, FS_PROC_NR, bp->b_data, (off_t) b * BLOCK_SIZE, BLOCK_SIZE, 0) == BLOCK_SIZE) { return(1); } return(0); } /*===========================================================================* * put_block2 * *===========================================================================*/ PUBLIC void put_block2(bp) struct buf *bp; /* buffer to store in the 2nd level cache */ { /* Store a buffer into the 2nd level cache. */ unsigned b; struct buf2 *bp2; if (nr_buf2 == 0) return; /* no 2nd level cache */ b = buf2_idx++; if (buf2_idx == nr_buf2) buf2_idx = 0; bp2 = &buf2[b]; if (dev_io(DEV_WRITE, DEV_RAM, FS_PROC_NR, bp->b_data, (off_t) b * BLOCK_SIZE, BLOCK_SIZE, 0) == BLOCK_SIZE) { if (bp2->b2_dev != NO_DEV) buf2[hash2(bp2->b2_blocknr)].b2_count--; bp2->b2_dev = bp->b_dev; bp2->b2_blocknr = bp->b_blocknr; buf2[hash2(bp2->b2_blocknr)].b2_count++; } } /*===========================================================================* * invalidate2 * *===========================================================================*/ PUBLIC void invalidate2(device) dev_t device; { /* Invalidate all blocks from a given device in the 2nd level cache. */ unsigned b; struct buf2 *bp2; for (b = 0; b < nr_buf2; b++) { bp2 = &buf2[b]; if (bp2->b2_dev == device) { bp2->b2_dev = NO_DEV; buf2[hash2(bp2->b2_blocknr)].b2_count--; } } } #endif /* ENABLE_CACHE2 */ /* Tables sizes */ #define V1_NR_DZONES 7 /* # direct zone numbers in a V1 inode */ #define V1_NR_TZONES 9 /* total # zone numbers in a V1 inode */ #define V2_NR_DZONES 7 /* # direct zone numbers in a V2 inode */ #define V2_NR_TZONES 10 /* total # zone numbers in a V2 inode */ #define NR_FILPS 128 /* # slots in filp table */ #define NR_INODES 64 /* # slots in "in core" inode table */ #define NR_SUPERS 8 /* # slots in super block table */ #define NR_LOCKS 8 /* # slots in the file locking table */ /* The type of sizeof may be (unsigned) long. Use the following macro for * taking the sizes of small objects so that there are no surprises like * (small) long constants being passed to routines expecting an int. */ #define usizeof(t) ((unsigned) sizeof(t)) /* File system types. */ #define SUPER_MAGIC 0x137F /* magic number contained in super-block */ #define SUPER_REV 0x7F13 /* magic # when 68000 disk read on PC or vv */ #define SUPER_V2 0x2468 /* magic # for V2 file systems */ #define SUPER_V2_REV 0x6824 /* V2 magic written on PC, read on 68K or vv */ #define V1 1 /* version number of V1 file systems */ #define V2 2 /* version number of V2 file systems */ /* Miscellaneous constants */ #define SU_UID ((uid_t) 0) /* super_user's uid_t */ #define SYS_UID ((uid_t) 0) /* uid_t for processes MM and INIT */ #define SYS_GID ((gid_t) 0) /* gid_t for processes MM and INIT */ #define NORMAL 0 /* forces get_block to do disk read */ #define NO_READ 1 /* prevents get_block from doing disk read */ #define PREFETCH 2 /* tells get_block not to read or mark dev */ #define XPIPE (-NR_TASKS-1) /* used in fp_task when susp'd on pipe */ #define XLOCK (-NR_TASKS-2) /* used in fp_task when susp'd on lock */ #define XPOPEN (-NR_TASKS-3) /* used in fp_task when susp'd on pipe open */ #define NO_BIT ((bit_t) 0) /* returned by alloc_bit() to signal failure */ #define DUP_MASK 0100 /* mask to distinguish dup2 from dup */ #define LOOK_UP 0 /* tells search_dir to lookup string */ #define ENTER 1 /* tells search_dir to make dir entry */ #define DELETE 2 /* tells search_dir to delete entry */ #define IS_EMPTY 3 /* tells search_dir to ret. OK or ENOTEMPTY */ #define CLEAN 0 /* disk and memory copies identical */ #define DIRTY 1 /* disk and memory copies differ */ #define ATIME 002 /* set if atime field needs updating */ #define CTIME 004 /* set if ctime field needs updating */ #define MTIME 010 /* set if mtime field needs updating */ #define BYTE_SWAP 0 /* tells conv2/conv4 to swap bytes */ #define DONT_SWAP 1 /* tells conv2/conv4 not to swap bytes */ #define END_OF_FILE (-104) /* eof detected */ #define DEV_RAM ((dev_t) 0x100) /* device number of /dev/ram */ #define ROOT_INODE 1 /* inode number for root directory */ #define BOOT_BLOCK ((block_t) 0) /* block number of boot block */ #define SUPER_BLOCK ((block_t) 1) /* block number of super block */ #define DIR_ENTRY_SIZE usizeof (struct direct) /* # bytes/dir entry */ #define NR_DIR_ENTRIES (BLOCK_SIZE/DIR_ENTRY_SIZE) /* # dir entries/blk */ #define SUPER_SIZE usizeof (struct super_block) /* super_block size */ #define PIPE_SIZE (V1_NR_DZONES*BLOCK_SIZE) /* pipe size in bytes */ #define BITMAP_CHUNKS (BLOCK_SIZE/usizeof (bitchunk_t))/* # map chunks/blk */ /* Derived sizes pertaining to the V1 file system. */ #define V1_ZONE_NUM_SIZE usizeof (zone1_t) /* # bytes in V1 zone */ #define V1_INODE_SIZE usizeof (d1_inode) /* bytes in V1 dsk ino */ #define V1_INDIRECTS (BLOCK_SIZE/V1_ZONE_NUM_SIZE) /* # zones/indir block */ #define V1_INODES_PER_BLOCK (BLOCK_SIZE/V1_INODE_SIZE)/* # V1 dsk inodes/blk */ /* Derived sizes pertaining to the V2 file system. */ #define V2_ZONE_NUM_SIZE usizeof (zone_t) /* # bytes in V2 zone */ #define V2_INODE_SIZE usizeof (d2_inode) /* bytes in V2 dsk ino */ #define V2_INDIRECTS (BLOCK_SIZE/V2_ZONE_NUM_SIZE) /* # zones/indir block */ #define V2_INODES_PER_BLOCK (BLOCK_SIZE/V2_INODE_SIZE)/* # V2 dsk inodes/blk */ /* Device table. This table is indexed by major device number. It provides * the link between major device numbers and the routines that process them. */ extern struct dmap { int _PROTOTYPE ((*dmap_opcl), (int, Dev_t, int, int) ); void _PROTOTYPE ((*dmap_io), (int, message *) ); int dmap_task; } dmap[]; /* When a needed block is not in the cache, it must be fetched from the disk. * Special character files also require I/O. The routines for these are here. * * The entry points in this file are: * dev_open: FS opens a device * dev_close: FS closes a device * dev_io: FS does a read or write on a device * gen_opcl: generic call to a task to perform an open/close * gen_io: generic call to a task to perform an I/O operation * no_dev: open/close processing for devices that don't exist * tty_opcl: perform tty-specific processing for open/close * ctty_opcl: perform controlling-tty-specific processing for open/close * ctty_io: perform controlling-tty-specific processing for I/O * do_ioctl: perform the IOCTL system call * do_setsid: perform the SETSID system call (FS side) */ #include "fs.h" #include #include #include #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" /*===========================================================================* * dev_open * *===========================================================================*/ PUBLIC int dev_open(dev, proc, flags) dev_t dev; /* device to open */ int proc; /* process to open for */ int flags; /* mode bits and flags */ { int major, r; struct dmap *dp; /* Determine the major device number call the device class specific * open/close routine. (This is the only routine that must check the * device number for being in range. All others can trust this check.) */ major = (dev >> MAJOR) & BYTE; if (major >= max_major) major = 0; dp = &dmap[major]; r = (*dp->dmap_opcl)(DEV_OPEN, dev, proc, flags); if (r == SUSPEND) panic("Suspend on open from", dp->dmap_task); return(r); } /*===========================================================================* * dev_close * *===========================================================================*/ PUBLIC void dev_close(dev) dev_t dev; /* device to close */ { (void) (*dmap[(dev >> MAJOR) & BYTE].dmap_opcl)(DEV_CLOSE, dev, 0, 0); } /*===========================================================================* * dev_io * *===========================================================================*/ PUBLIC int dev_io(op, dev, proc, buf, pos, bytes, flags) int op; /* DEV_READ, DEV_WRITE, DEV_IOCTL, etc. */ dev_t dev; /* major-minor device number */ int proc; /* in whose address space is buf? */ void *buf; /* virtual address of the buffer */ off_t pos; /* byte position */ int bytes; /* how many bytes to transfer */ int flags; /* special flags, like O_NONBLOCK */ { /* Read or write from a device. The parameter 'dev' tells which one. */ struct dmap *dp; message dev_mess; /* Determine task dmap. */ dp = &dmap[(dev >> MAJOR) & BYTE]; /* Set up the message passed to task. */ dev_mess.m_type = op; dev_mess.DEVICE = (dev >> MINOR) & BYTE; dev_mess.POSITION = pos; dev_mess.PROC_NR = proc; dev_mess.ADDRESS = buf; dev_mess.COUNT = bytes; dev_mess.TTY_FLAGS = flags; /* Call the task. */ (*dp->dmap_io)(dp->dmap_task, &dev_mess); /* Task has completed. See if call completed. */ if (dev_mess.REP_STATUS == SUSPEND) { if (flags & O_NONBLOCK) { /* Not supposed to block. */ dev_mess.m_type = CANCEL; dev_mess.PROC_NR = proc; dev_mess.DEVICE = (dev >> MINOR) & BYTE; (*dp->dmap_io)(dp->dmap_task, &dev_mess); if (dev_mess.REP_STATUS == EINTR) dev_mess.REP_STATUS = EAGAIN; } else { /* Suspend user. */ suspend(dp->dmap_task); } } return(dev_mess.REP_STATUS); } /*===========================================================================* * gen_opcl * *===========================================================================*/ PUBLIC int gen_opcl(op, dev, proc, flags) int op; /* operation, DEV_OPEN or DEV_CLOSE */ dev_t dev; /* device to open or close */ int proc; /* process to open/close for */ int flags; /* mode bits and flags */ { /* Called from the dmap struct in table.c on opens & closes of special files.*/ struct dmap *dp; message dev_mess; /* Determine task dmap. */ dp = &dmap[(dev >> MAJOR) & BYTE]; dev_mess.m_type = op; dev_mess.DEVICE = (dev >> MINOR) & BYTE; dev_mess.PROC_NR = proc; dev_mess.COUNT = flags; /* Call the task. */ (*dp->dmap_io)(dp->dmap_task, &dev_mess); return(dev_mess.REP_STATUS); } /*===========================================================================* * tty_opcl * *===========================================================================*/ PUBLIC int tty_opcl(op, dev, proc, flags) int op; /* operation, DEV_OPEN or DEV_CLOSE */ dev_t dev; /* device to open or close */ int proc; /* process to open/close for */ int flags; /* mode bits and flags */ { /* This procedure is called from the dmap struct on tty open/close. */ int r; register struct fproc *rfp; /* Add O_NOCTTY to the flags if this process is not a session leader, or * if it already has a controlling tty, or if it is someone elses * controlling tty. */ if (!fp->fp_sesldr || fp->fp_tty != 0) { flags |= O_NOCTTY; } else { for (rfp = &fproc[LOW_USER]; rfp < &fproc[NR_PROCS]; rfp++) { if (rfp->fp_tty == dev) flags |= O_NOCTTY; } } r = gen_opcl(op, dev, proc, flags); /* Did this call make the tty the controlling tty? */ if (r == 1) { fp->fp_tty = dev; r = OK; } return(r); } /*===========================================================================* * ctty_opcl * *===========================================================================*/ PUBLIC int ctty_opcl(op, dev, proc, flags) int op; /* operation, DEV_OPEN or DEV_CLOSE */ dev_t dev; /* device to open or close */ int proc; /* process to open/close for */ int flags; /* mode bits and flags */ { /* This procedure is called from the dmap struct in table.c on opening/closing * /dev/tty, the magic device that translates to the controlling tty. */ return(fp->fp_tty == 0 ? ENXIO : OK); } /*===========================================================================* * do_setsid * *===========================================================================*/ PUBLIC int do_setsid() { /* Perform the FS side of the SETSID call, i.e. get rid of the controlling * terminal of a process, and make the process a session leader. */ register struct fproc *rfp; /* Only MM may do the SETSID call directly. */ if (who != MM_PROC_NR) return(ENOSYS); /* Make the process a session leader with no controlling tty. */ rfp = &fproc[slot1]; rfp->fp_sesldr = TRUE; rfp->fp_tty = 0; } /*===========================================================================* * do_ioctl * *===========================================================================*/ PUBLIC int do_ioctl() { /* Perform the ioctl(ls_fd, request, argx) system call (uses m2 fmt). */ struct filp *f; register struct inode *rip; dev_t dev; if ( (f = get_filp(ls_fd)) == NIL_FILP) return(err_code); rip = f->filp_ino; /* get inode pointer */ if ( (rip->i_mode & I_TYPE) != I_CHAR_SPECIAL && (rip->i_mode & I_TYPE) != I_BLOCK_SPECIAL) return(ENOTTY); dev = (dev_t) rip->i_zone[0]; #if ENABLE_BINCOMPAT if ((m.TTY_REQUEST >> 8) == 't') { /* Obsolete sgtty ioctl, message contains more than is sane. */ struct dmap *dp; message dev_mess; dp = &dmap[(dev >> MAJOR) & BYTE]; dev_mess = m; /* Copy full message with all the weird bits. */ dev_mess.m_type = DEV_IOCTL; dev_mess.PROC_NR = who; dev_mess.TTY_LINE = (dev >> MINOR) & BYTE; /* Call the task. */ (*dp->dmap_io)(dp->dmap_task, &dev_mess); m1.TTY_SPEK = dev_mess.TTY_SPEK; /* erase and kill */ m1.TTY_FLAGS = dev_mess.TTY_FLAGS; /* flags */ return(dev_mess.REP_STATUS); } #endif return(dev_io(DEV_IOCTL, dev, who, m.ADDRESS, 0L, m.REQUEST, f->filp_flags)); } /*===========================================================================* * gen_io * *============================================================''''''===============*/ PUBLIC void gen_io(task_nr, mess_ptr) int task_nr; /* which task to call */ message *mess_ptr; /* pointer to message for task */ { /* All file system I/O ultimately comes down to I/O on major/minor device * pairs. These lead to calls on the following routines via the dmap table. */ int r, proc_nr; message local_m; proc_nr = mess_ptr->PROC_NR; while ((r = sendrec(task_nr, mess_ptr)) == ELOCKED) { /* sendrec() failed to avoid deadlock. The task 'task_nr' is * trying to send a REVIVE message for an earlier request. * Handle it and go try again. */ if ((r = receive(task_nr, &local_m)) != OK) break; /* If we're trying to send a cancel message to a task which has just * sent a completion reply, ignore the reply and abort the cancel * request. The caller will do the revive for the process. */ if (mess_ptr->m_type == CANCEL && local_m.REP_PROC_NR == proc_nr) return; /* Otherwise it should be a REVIVE. */ if (local_m.m_type != REVIVE) { printf( "fs: strange device reply from %d, type = %d, proc = %d\n", local_m.m_source, local_m.m_type, local_m.REP_PROC_NR); continue; } revive(local_m.REP_PROC_NR, local_m.REP_STATUS); } /* The message received may be a reply to this call, or a REVIVE for some * other process. */ for (;;) { if (r != OK) panic("call_task: can't send/receive", NO_NUM); /* Did the process we did the sendrec() for get a result? */ if (mess_ptr->REP_PROC_NR == proc_nr) break; /* Otherwise it should be a REVIVE. */ if (mess_ptr->m_type != REVIVE) { printf( "fs: strange device reply from %d, type = %d, proc = %d\n", mess_ptr->m_source, mess_ptr->m_type, mess_ptr->REP_PROC_NR); continue; } revive(mess_ptr->REP_PROC_NR, mess_ptr->REP_STATUS); r = receive(task_nr, mess_ptr); } } /*===========================================================================* * ctty_io * *===========================================================================*/ PUBLIC void ctty_io(task_nr, mess_ptr) int task_nr; /* not used - for compatibility with dmap_t */ message *mess_ptr; /* pointer to message for task */ { /* This routine is only called for one device, namely /dev/tty. Its job * is to change the message to use the controlling terminal, instead of the * major/minor pair for /dev/tty itself. */ struct dmap *dp; if (fp->fp_tty == 0) { /* No controlling tty present anymore, return an I/O error. */ mess_ptr->REP_STATUS = EIO; } else { /* Substitute the controlling terminal device. */ dp = &dmap[(fp->fp_tty >> MAJOR) & BYTE]; mess_ptr->DEVICE = (fp->fp_tty >> MINOR) & BYTE; (*dp->dmap_io)(dp->dmap_task, mess_ptr); } } /*===========================================================================* * no_dev * *===========================================================================*/ PUBLIC int no_dev(op, dev, proc, flags) int op; /* operation, DEV_OPEN or DEV_CLOSE */ dev_t dev; /* device to open or close */ int proc; /* process to open/close for */ int flags; /* mode bits and flags */ { /* Called when opening a nonexistent device. */ return(ENODEV); } /*===========================================================================* * clone_opcl * *===========================================================================*/ PUBLIC int clone_opcl(op, dev, proc, flags) int op; /* operation, DEV_OPEN or DEV_CLOSE */ dev_t dev; /* device to open or close */ int proc; /* process to open/close for */ int flags; /* mode bits and flags */ { /* Some devices need special processing upon open. Such a device is "cloned", * i.e. on a succesful open it is replaced by a new device with a new unique * minor device number. This new device number identifies a new object (such * as a new network connection) that has been allocated within a task. */ struct dmap *dp; int minor; message dev_mess; /* Determine task dmap. */ dp = &dmap[(dev >> MAJOR) & BYTE]; minor = (dev >> MINOR) & BYTE; dev_mess.m_type = op; dev_mess.DEVICE = minor; dev_mess.PROC_NR = proc; dev_mess.COUNT = flags; /* Call the task. */ (*dp->dmap_io)(dp->dmap_task, &dev_mess); if (op == DEV_OPEN && dev_mess.REP_STATUS >= 0) { if (dev_mess.REP_STATUS != minor) { /* A new minor device number has been returned. Create a * temporary device file to hold it. */ struct inode *ip; /* Device number of the new device. */ dev = (dev & ~(BYTE << MINOR)) | (dev_mess.REP_STATUS << MINOR); ip = alloc_inode(root_dev, ALL_MODES | I_CHAR_SPECIAL); if (ip == NIL_INODE) { /* Oops, that didn't work. Undo open. */ (void) clone_opcl(DEV_CLOSE, dev, proc, 0); return(err_code); } ip->i_zone[0] = dev; put_inode(fp->fp_filp[fd]->filp_ino); fp->fp_filp[fd]->filp_ino = ip; } dev_mess.REP_STATUS = OK; } return(dev_mess.REP_STATUS); } /* This is the filp table. It is an intermediary between file descriptors and * inodes. A slot is free if filp_count == 0. */ EXTERN struct filp { mode_t filp_mode; /* RW bits, telling how file is opened */ int filp_flags; /* flags from open and fcntl */ int filp_count; /* how many file descriptors share this slot?*/ struct inode *filp_ino; /* pointer to the inode */ off_t filp_pos; /* file position */ } filp[NR_FILPS]; #define FILP_CLOSED 0 /* filp_mode: associated device closed */ #define NIL_FILP (struct filp *) 0 /* indicates absence of a filp slot */ /* This file contains the procedures that manipulate file descriptors. * * The entry points into this file are * get_fd: look for free file descriptor and free filp slots * get_filp: look up the filp entry for a given file descriptor * find_filp: find a filp slot that points to a given inode */ #include "fs.h" #include "file.h" #include "fproc.h" #include "inode.h" /*===========================================================================* * get_fd * *===========================================================================*/ PUBLIC int get_fd(start, bits, k, fpt) int start; /* start of search (used for F_DUPFD) */ mode_t bits; /* mode of the file to be created (RWX bits) */ int *k; /* place to return file descriptor */ struct filp **fpt; /* place to return filp slot */ { /* Look for a free file descriptor and a free filp slot. Fill in the mode word * in the latter, but don't claim either one yet, since the open() or creat() * may yet fail. */ register struct filp *f; register int i; *k = -1; /* we need a way to tell if file desc found */ /* Search the fproc fp_filp table for a free file descriptor. */ for (i = start; i < OPEN_MAX; i++) { if (fp->fp_filp[i] == NIL_FILP) { /* A file descriptor has been located. */ *k = i; break; } } /* Check to see if a file descriptor has been found. */ if (*k < 0) return(EMFILE); /* this is why we initialized k to -1 */ /* Now that a file descriptor has been found, look for a free filp slot. */ for (f = &filp[0]; f < &filp[NR_FILPS]; f++) { if (f->filp_count == 0) { f->filp_mode = bits; f->filp_pos = 0L; f->filp_flags = 0; *fpt = f; return(OK); } } /* If control passes here, the filp table must be full. Report that back. */ return(ENFILE); } /*===========================================================================* * get_filp * *===========================================================================*/ PUBLIC struct filp *get_filp(fild) int fild; /* file descriptor */ { /* See if 'fild' refers to a valid file descr. If so, return its filp ptr. */ err_code = EBADF; if (fild < 0 || fild >= OPEN_MAX ) return(NIL_FILP); return(fp->fp_filp[fild]); /* may also be NIL_FILP */ } /*===========================================================================* * find_filp * *===========================================================================*/ PUBLIC struct filp *find_filp(rip, bits) register struct inode *rip; /* inode referred to by the filp to be found */ Mode_t bits; /* mode of the filp to be found (RWX bits) */ { /* Find a filp slot that refers to the inode 'rip' in a way as described * by the mode bit 'bits'. Used for determining whether somebody is still * interested in either end of a pipe. Also used when opening a FIFO to * find partners to share a filp field with (to shared the file position). * Like 'get_fd' it performs its job by linear search through the filp table. */ register struct filp *f; for (f = &filp[0]; f < &filp[NR_FILPS]; f++) { if (f->filp_count != 0 && f->filp_ino == rip && (f->filp_mode & bits)){ return(f); } } /* If control passes here, the filp wasn't there. Report that back. */ return(NIL_FILP); } /* This is the per-process information. A slot is reserved for each potential * process. Thus NR_PROCS must be the same as in the kernel. It is not possible * or even necessary to tell when a slot is free here. */ EXTERN struct fproc { mode_t fp_umask; /* mask set by umask system call */ struct inode *fp_workdir; /* pointer to working directory's inode */ struct inode *fp_rootdir; /* pointer to current root dir (see chroot) */ struct filp *fp_filp[OPEN_MAX];/* the file descriptor table */ uid_t fp_realuid; /* real user id */ uid_t fp_effuid; /* effective user id */ gid_t fp_realgid; /* real group id */ gid_t fp_effgid; /* effective group id */ dev_t fp_tty; /* major/minor of controlling tty */ int fp_fd; /* place to save fd if rd/wr can't finish */ char *fp_buffer; /* place to save buffer if rd/wr can't finish*/ int fp_nbytes; /* place to save bytes if rd/wr can't finish */ int fp_cum_io_partial; /* partial byte count if rd/wr can't finish */ char fp_suspended; /* set to indicate process hanging */ char fp_revived; /* set to indicate process being revived */ char fp_task; /* which task is proc suspended on */ char fp_sesldr; /* true if proc is a session leader */ pid_t fp_pid; /* process id */ long fp_cloexec; /* bit map for POSIX Table 6-2 FD_CLOEXEC */ } fproc[NR_PROCS]; /* Field values. */ #define NOT_SUSPENDED 0 /* process is not suspended on pipe or task */ #define SUSPENDED 1 /* process is suspended on pipe or task */ #define NOT_REVIVING 0 /* process is not being revived */ #define REVIVING 1 /* process is being revived from suspension */ #define PID_FREE 0 /* process slot free */ #define PID_SERVER (-1) /* process has become a server */ /* This is the master header for fs. It includes some other files * and defines the principal constants. */ #define _POSIX_SOURCE 1 /* tell headers to include POSIX stuff */ #define _MINIX 1 /* tell headers to include MINIX stuff */ #define _SYSTEM 1 /* tell headers that this is the kernel */ /* The following are so basic, all the *.c files get them automatically. */ #include /* MUST be first */ #include /* MUST be second */ #include #include #include #include #include #include #include "const.h" #include "type.h" #include "proto.h" #include "glo.h" /* EXTERN should be extern except for the table file */ #ifdef _TABLE #undef EXTERN #define EXTERN #endif /* File System global variables */ EXTERN struct fproc *fp; /* pointer to caller's fproc struct */ EXTERN int super_user; /* 1 if caller is super_user, else 0 */ EXTERN int dont_reply; /* normally 0; set to 1 to inhibit reply */ EXTERN int susp_count; /* number of procs suspended on pipe */ EXTERN int nr_locks; /* number of locks currently in place */ EXTERN int reviving; /* number of pipe processes to be revived */ EXTERN off_t rdahedpos; /* position to read ahead */ EXTERN struct inode *rdahed_inode; /* pointer to inode to read ahead */ EXTERN Dev_t root_dev; /* device number of the root device */ /* The parameters of the call are kept here. */ EXTERN message m; /* the input message itself */ EXTERN message m1; /* the output message used for reply */ EXTERN int who; /* caller's proc number */ EXTERN int fs_call; /* system call number */ EXTERN char user_path[PATH_MAX];/* storage for user path name */ /* The following variables are used for returning results to the caller. */ EXTERN int err_code; /* temporary storage for error number */ EXTERN int rdwt_err; /* status of last disk i/o request */ /* Data initialized elsewhere. */ extern _PROTOTYPE (int (*call_vec[]), (void) ); /* sys call table */ extern int max_major; /* maximum major device (+ 1) */ extern char dot1[2]; /* dot1 (&dot1[0]) and dot2 (&dot2[0]) have a special */ extern char dot2[3]; /* meaning to search_dir: no access permission check. */ /* This file manages the inode table. There are procedures to allocate and * deallocate inodes, acquire, erase, and release them, and read and write * them from the disk. * * The entry points into this file are * get_inode: search inode table for a given inode; if not there, read it * put_inode: indicate that an inode is no longer needed in memory * alloc_inode: allocate a new, unused inode * wipe_inode: erase some fields of a newly allocated inode * free_inode: mark an inode as available for a new file * update_times: update atime, ctime, and mtime * rw_inode: read a disk block and extract an inode, or corresp. write * old_icopy: copy to/from in-core inode struct and disk inode (V1.x) * new_icopy: copy to/from in-core inode struct and disk inode (V2.x) * dup_inode: indicate that someone else is using an inode table entry */ #include "fs.h" #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "super.h" FORWARD _PROTOTYPE( void old_icopy, (struct inode *rip, d1_inode *dip, int direction, int norm)); FORWARD _PROTOTYPE( void new_icopy, (struct inode *rip, d2_inode *dip, int direction, int norm)); /*===========================================================================* * get_inode * *===========================================================================*/ PUBLIC struct inode *get_inode(dev, numb) dev_t dev; /* device on which inode resides */ int numb; /* inode number (ANSI: may not be unshort) */ { /* Find a slot in the inode table, load the specified inode into it, and * return a pointer to the slot. If 'dev' == NO_DEV, just return a free slot. */ register struct inode *rip, *xp; /* Search the inode table both for (dev, numb) and a free slot. */ xp = NIL_INODE; for (rip = &inode[0]; rip < &inode[NR_INODES]; rip++) { if (rip->i_count > 0) { /* only check used slots for (dev, numb) */ if (rip->i_dev == dev && rip->i_num == numb) { /* This is the inode that we are looking for. */ rip->i_count++; return(rip); /* (dev, numb) found */ } } else { xp = rip; /* remember this free slot for later */ } } /* Inode we want is not currently in use. Did we find a free slot? */ if (xp == NIL_INODE) { /* inode table completely full */ err_code = ENFILE; return(NIL_INODE); } /* A free inode slot has been located. Load the inode into it. */ xp->i_dev = dev; xp->i_num = numb; xp->i_count = 1; if (dev != NO_DEV) rw_inode(xp, READING); /* get inode from disk */ xp->i_update = 0; /* all the times are initially up-to-date */ return(xp); } /*===========================================================================* * put_inode * *===========================================================================*/ PUBLIC void put_inode(rip) register struct inode *rip; /* pointer to inode to be released */ { /* The caller is no longer using this inode. If no one else is using it either * write it back to the disk immediately. If it has no links, truncate it and * return it to the pool of available inodes. */ if (rip == NIL_INODE) return; /* checking here is easier than in caller */ if (--rip->i_count == 0) { /* i_count == 0 means no one is using it now */ if ((rip->i_nlinks & BYTE) == 0) { /* i_nlinks == 0 means free the inode. */ truncate(rip); /* return all the disk blocks */ rip->i_mode = I_NOT_ALLOC; /* clear I_TYPE field */ rip->i_dirt = DIRTY; free_inode(rip->i_dev, rip->i_num); } else { if (rip->i_pipe == I_PIPE) truncate(rip); } rip->i_pipe = NO_PIPE; /* should always be cleared */ if (rip->i_dirt == DIRTY) rw_inode(rip, WRITING); } } /*===========================================================================* * alloc_inode * *===========================================================================*/ PUBLIC struct inode *alloc_inode(dev, bits) dev_t dev; /* device on which to allocate the inode */ mode_t bits; /* mode of the inode */ { /* Allocate a free inode on 'dev', and return a pointer to it. */ register struct inode *rip; register struct super_block *sp; int major, minor, inumb; bit_t b; sp = get_super(dev); /* get pointer to super_block */ if (sp->s_rd_only) { /* can't allocate an inode on a read only device. */ err_code = EROFS; return(NIL_INODE); } /* Acquire an inode from the bit map. */ b = alloc_bit(sp, IMAP, sp->s_isearch); if (b == NO_BIT) { err_code = ENFILE; major = (int) (sp->s_dev >> MAJOR) & BYTE; minor = (int) (sp->s_dev >> MINOR) & BYTE; printf("Out of i-nodes on %sdevice %d/%d\n", sp->s_dev == root_dev ? "root " : "", major, minor); return(NIL_INODE); } sp->s_isearch = b; /* next time start here */ inumb = (int) b; /* be careful not to pass unshort as param */ /* Try to acquire a slot in the inode table. */ if ((rip = get_inode(NO_DEV, inumb)) == NIL_INODE) { /* No inode table slots available. Free the inode just allocated. */ free_bit(sp, IMAP, b); } else { /* An inode slot is available. Put the inode just allocated into it. */ rip->i_mode = bits; /* set up RWX bits */ rip->i_nlinks = (nlink_t) 0; /* initial no links */ rip->i_uid = fp->fp_effuid; /* file's uid is owner's */ rip->i_gid = fp->fp_effgid; /* ditto group id */ rip->i_dev = dev; /* mark which device it is on */ rip->i_ndzones = sp->s_ndzones; /* number of direct zones */ rip->i_nindirs = sp->s_nindirs; /* number of indirect zones per blk*/ rip->i_sp = sp; /* pointer to super block */ /* Fields not cleared already are cleared in wipe_inode(). They have * been put there because truncate() needs to clear the same fields if * the file happens to be open while being truncated. It saves space * not to repeat the code twice. */ wipe_inode(rip); } return(rip); } /*===========================================================================* * wipe_inode * *===========================================================================*/ PUBLIC void wipe_inode(rip) register struct inode *rip; /* the inode to be erased */ { /* Erase some fields in the inode. This function is called from alloc_inode() * when a new inode is to be allocated, and from truncate(), when an existing * inode is to be truncated. */ register int i; rip->i_size = 0; rip->i_update = ATIME | CTIME | MTIME; /* update all times later */ rip->i_dirt = DIRTY; for (i = 0; i < V2_NR_TZONES; i++) rip->i_zone[i] = NO_ZONE; } /*===========================================================================* * free_inode * *===========================================================================*/ PUBLIC void free_inode(dev, inumb) dev_t dev; /* on which device is the inode */ ino_t inumb; /* number of inode to be freed */ { /* Return an inode to the pool of unallocated inodes. */ register struct super_block *sp; bit_t b; /* Locate the appropriate super_block. */ sp = get_super(dev); if (inumb <= 0 || inumb > sp->s_ninodes) return; b = inumb; free_bit(sp, IMAP, b); if (b < sp->s_isearch) sp->s_isearch = b; } /*===========================================================================* * update_times * *===========================================================================*/ PUBLIC void update_times(rip) register struct inode *rip; /* pointer to inode to be read/written */ { /* Various system calls are required by the standard to update atime, ctime, * or mtime. Since updating a time requires sending a message to the clock * task--an expensive business--the times are marked for update by setting * bits in i_update. When a stat, fstat, or sync is done, or an inode is * released, update_times() may be called to actually fill in the times. */ time_t cur_time; struct super_block *sp; sp = rip->i_sp; /* get pointer to super block. */ if (sp->s_rd_only) return; /* no updates for read-only file systems */ cur_time = clock_time(); if (rip->i_update & ATIME) rip->i_atime = cur_time; if (rip->i_update & CTIME) rip->i_ctime = cur_time; if (rip->i_update & MTIME) rip->i_mtime = cur_time; rip->i_'''''''update = 0; /* they are all up-to-date now */ } /*===========================================================================* * rw_inode * *===========================================================================*/ PUBLIC void rw_inode(rip, rw_flag) register struct inode *rip; /* pointer to inode to be read/written */ int rw_flag; /* READING or WRITING */ { /* An entry in the inode table is to be copied to or from the disk. */ register struct buf *bp; register struct super_block *sp; d1_inode *dip; d2_inode *dip2; block_t b, offset; /* Get the block where the inode resides. */ sp = get_super(rip->i_dev); /* get pointer to super block */ rip->i_sp = sp; /* inode must contain super block pointer */ offset = sp->s_imap_blocks + sp->s_zmap_blocks + 2; b = (block_t) (rip->i_num - 1)/sp->s_inodes_per_block + offset; bp = get_block(rip->i_dev, b, NORMAL); dip = bp->b_v1_ino + (rip->i_num - 1) % V1_INODES_PER_BLOCK; dip2 = bp->b_v2_ino + (rip->i_num - 1) % V2_INODES_PER_BLOCK; /* Do the read or write. */ if (rw_flag == WRITING) { if (rip->i_update) update_times(rip); /* times need updating */ if (sp->s_rd_only == FALSE) bp->b_dirt = DIRTY; } /* Copy the inode from the disk block to the in-core table or vice versa. * If the fourth parameter below is FALSE, the bytes are swapped. */ if (sp->s_version == V1) old_icopy(rip, dip, rw_flag, sp->s_native); else new_icopy(rip, dip2, rw_flag, sp->s_native); put_block(bp, INODE_BLOCK); rip->i_dirt = CLEAN; } /*===========================================================================* * old_icopy * *===========================================================================*/ PRIVATE void old_icopy(rip, dip, direction, norm) register struct inode *rip; /* pointer to the in-core inode struct */ register d1_inode *dip; /* pointer to the d1_inode inode struct */ int direction; /* READING (from disk) or WRITING (to disk) */ int norm; /* TRUE = do not swap bytes; FALSE = swap */ { /* The V1.x IBM disk, the V1.x 68000 disk, and the V2 disk (same for IBM and * 68000) all have different inode layouts. When an inode is read or written * this routine handles the conversions so that the information in the inode * table is independent of the disk structure from which the inode came. * The old_icopy routine copies to and from V1 disks. */ int i; if (direction == READING) { /* Copy V1.x inode to the in-core table, swapping bytes if need be. */ rip->i_mode = conv2(norm, (int) dip->d1_mode); rip->i_uid = conv2(norm, (int) dip->d1_uid ); rip->i_size = conv4(norm, dip->d1_size); rip->i_mtime = conv4(norm, dip->d1_mtime); rip->i_atime = rip->i_mtime; rip->i_ctime = rip->i_mtime; rip->i_nlinks = (nlink_t) dip->d1_nlinks; /* 1 char */ rip->i_gid = (gid_t) dip->d1_gid; /* 1 char */ rip->i_ndzones = V1_NR_DZONES; rip->i_nindirs = V1_INDIRECTS; for (i = 0; i < V1_NR_TZONES; i++) rip->i_zone[i] = conv2(norm, (int) dip->d1_zone[i]); } else { /* Copying V1.x inode to disk from the in-core table. */ dip->d1_mode = conv2(norm, (int) rip->i_mode); dip->d1_uid = conv2(norm, (int) rip->i_uid ); dip->d1_size = conv4(norm, rip->i_size); dip->d1_mtime = conv4(norm, rip->i_mtime); dip->d1_nlinks = (nlink_t) rip->i_nlinks; /* 1 char */ dip->d1_gid = (gid_t) rip->i_gid; /* 1 char */ for (i = 0; i < V1_NR_TZONES; i++) dip->d1_zone[i] = conv2(norm, (int) rip->i_zone[i]); } } /*===========================================================================* * new_icopy * *===========================================================================*/ PRIVATE void new_icopy(rip, dip, direction, norm) register struct inode *rip; /* pointer to the in-core inode struct */ register d2_inode *dip; /* pointer to the d2_inode struct */ int direction; /* READING (from disk) or WRITING (to disk) */ int norm; /* TRUE = do not swap bytes; FALSE = swap */ { /* Same as old_icopy, but to/from V2 disk layout. */ int i; if (direction == READING) { /* Copy V2.x inode to the in-core table, swapping bytes if need be. */ rip->i_mode = conv2(norm,dip->d2_mode); rip->i_uid = conv2(norm,dip->d2_uid ); rip->i_nlinks = conv2(norm,(int) dip->d2_nlinks); rip->i_gid = conv2(norm,(int) dip->d2_gid ); rip->i_size = conv4(norm,dip->d2_size); rip->i_atime = conv4(norm,dip->d2_atime); rip->i_ctime = conv4(norm,dip->d2_ctime); rip->i_mtime = conv4(norm,dip->d2_mtime); rip->i_ndzones = V2_NR_DZONES; rip->i_nindirs = V2_INDIRECTS; for (i = 0; i < V2_NR_TZONES; i++) rip->i_zone[i] = conv4(norm, (long) dip->d2_zone[i]); } else { /* Copying V2.x inode to disk from the in-core table. */ dip->d2_mode = conv2(norm,rip->i_mode); dip->d2_uid = conv2(norm,rip->i_uid ); dip->d2_nlinks = conv2(norm,rip->i_nlinks); dip->d2_gid = conv2(norm,rip->i_gid ); dip->d2_size = conv4(norm,rip->i_size); dip->d2_atime = conv4(norm,rip->i_atime); dip->d2_ctime = conv4(norm,rip->i_ctime); dip->d2_mtime = conv4(norm,rip->i_mtime); for (i = 0; i < V2_NR_TZONES; i++) dip->d2_zone[i] = conv4(norm, (long) rip->i_zone[i]); } } /*===========================================================================* * dup_inode * *===========================================================================*/ PUBLIC void dup_inode(ip) struct inode *ip; /* The inode to be duplicated. */ { /* This routine is a simplified form of get_inode() for the case where * the inode pointer is already known. */ ip->i_count++; } /* Inode table. This table holds inodes that are currently in use. In some * cases they have been opened by an open() or creat() system call, in other * cases the file system itself needs the inode for one reason or another, * such as to search a directory for a path name. * The first part of the struct holds fields that are present on the * disk; the second part holds fields not present on the disk. * The disk inode part is also declared in "type.h" as 'd1_inode' for V1 * file systems and 'd2_inode' for V2 file systems. */ EXTERN struct inode { mode_t i_mode; /* file type, protection, etc. */ nlink_t i_nlinks; /* how many links to this file */ uid_t i_uid; /* user id of the file's owner */ gid_t i_gid; /* group number */ off_t i_size; /* current file size in bytes */ time_t i_atime; /* time of last access (V2 only) */ time_t i_mtime; /* when was file data last changed */ time_t i_ctime; /* when was inode itself changed (V2 only)*/ zone_t i_zone[V2_NR_TZONES]; /* zone numbers for direct, ind, and dbl ind */ /* The following items are not present on the disk. */ dev_t i_dev; /* which device is the inode on */ ino_t i_num; /* inode number on its (minor) device */ int i_count; /* # times inode used; 0 means slot is free */ int i_ndzones; /* # direct zones (Vx_NR_DZONES) */ int i_nindirs; /* # indirect zones per indirect block */ struct super_block *i_sp; /* pointer to super block for inode's device */ char i_dirt; /* CLEAN or DIRTY */ char i_pipe; /* set to I_PIPE if pipe */ char i_mount; /* this bit is set if file mounted on */ char i_seek; /* set on LSEEK, cleared on READ/WRITE */ char i_update; /* the ATIME, CTIME, and MTIME bits are here */ } inode[NR_INODES]; #define NIL_INODE (struct inode *) 0 /* indicates absence of inode slot */ /* Field values. Note that CLEAN and DIRTY are defined in "const.h" */ #define NO_PIPE 0 /* i_pipe is NO_PIPE if inode is not a pipe */ #define I_PIPE 1 /* i_pipe is I_PIPE if inode is a pipe */ #define NO_MOUNT 0 /* i_mount is NO_MOUNT if file not mounted on*/ #define I_MOUNT 1 /* i_mount is I_MOUNT if file mounted on */ #define NO_SEEK 0 /* i_seek = NO_SEEK if last op was not SEEK */ #define ISEEK 1 /* i_seek = ISEEK if last op was SEEK */ /* This file handles the LINK and UNLINK system calls. It also deals with * deallocating the storage used by a file when the last UNLINK is done to a * file and the blocks must be returned to the free block pool. * * The entry points into this file are * do_link: perform the LINK system call * do_unlink: perform the UNLINK and RMDIR system calls * do_rename: perform the RENAME system call * truncate: release all the blocks associated with an inode */ #include "fs.h" #include #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" #include "super.h" #define SAME 1000 FORWARD _PROTOTYPE( int remove_dir, (struct inode *rldirp, struct inode *rip, char dir_name[NAME_MAX]) ); FORWARD _PROTOTYPE( int unlink_file, (struct inode *dirp, struct inode *rip, char file_name[NAME_MAX]) ); /*===========================================================================* * do_link * *===========================================================================*/ PUBLIC int do_link() { /* Perform the link(name1, name2) system call. */ register struct inode *ip, *rip; register int r; char string[NAME_MAX]; struct inode *new_ip; /* See if 'name' (file to be linked) exists. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* Check to see if the file has maximum number of links already. */ r = OK; if ( (rip->i_nlinks & BYTE) >= LINK_MAX) r = EMLINK; /* Only super_user may link to directories. */ if (r == OK) if ( (rip->i_mode & I_TYPE) == I_DIRECTORY && !super_user) r = EPERM; /* If error with 'name', return the inode. */ if (r != OK) { put_inode(rip); return(r); } /* Does the final directory of 'name2' exist? */ if (fetch_name(name2, name2_length, M1) != OK) { put_inode(rip); return(err_code); } if ( (ip = last_dir(user_path, string)) == NIL_INODE) r = err_code; /* If 'name2' exists in full (even if no space) set 'r' to error. */ if (r == OK) { if ( (new_ip = advance(ip, string)) == NIL_INODE) { r = err_code; if (r == ENOENT) r = OK; } else { put_inode(new_ip); r = EEXIST; } } /* Check for links across devices. */ if (r == OK) if (rip->i_dev != ip->i_dev) r = EXDEV; /* Try to link. */ if (r == OK) r = search_dir(ip, string, &rip->i_num, ENTER); /* If success, register the linking. */ if (r == OK) { rip->i_nlinks++; rip->i_update |= CTIME; rip->i_dirt = DIRTY; } /* Done. Release both inodes. */ put_inode(rip); put_inode(ip); return(r); } /*===========================================================================* * do_unlink * *===========================================================================*/ PUBLIC int do_unlink() { /* Perform the unlink(name) or rmdir(name) system call. The code for these two * is almost the same. They differ only in some condition testing. Unlink() * may be used by the superuser to do dangerous things; rmdir() may not. */ register struct inode *rip; struct inode *rldirp; int r; char string[NAME_MAX]; /* Get the last directory in the path. */ if (fetch_name(name, name_length, M3) != OK) return(err_code); if ( (rldirp = last_dir(user_path, string)) == NIL_INODE) return(err_code); /* The last directory exists. Does the file also exist? */ r = OK; if ( (rip = advance(rldirp, string)) == NIL_INODE) r = err_code; /* If error, return inode. */ if (r != OK) { put_inode(rldirp); return(r); } /* Do not remove a mount point. */ if (rip->i_num == ROOT_INODE) { put_inode(rldirp); put_inode(rip); return(EBUSY); } /* Now test if the call is allowed, separately for unlink() and rmdir(). */ if (fs_call == UNLINK) { /* Only the su may unlink directories, but the su can unlink any dir.*/ if ( (rip->i_mode & I_TYPE) == I_DIRECTORY && !super_user) r = EPERM; /* Don't unlink a file if it is the root of a mounted file system. */ if (rip->i_num == ROOT_INODE) r = EBUSY; /* Actually try to unlink the file; fails if parent is mode 0 etc. */ if (r == OK) r = unlink_file(rldirp, rip, string); } else { r = remove_dir(rldirp, rip, string); /* call is RMDIR */ } /* If unlink was possible, it has been done, otherwise it has not. */ put_inode(rip); put_inode(rldirp); return(r); } /*===========================================================================* * do_rename * *===========================================================================*/ PUBLIC int do_rename() { /* Perform the rename(name1, name2) system call. */ struct inode *old_dirp, *old_ip; /* ptrs to old dir, file inodes */ struct inode *new_dirp, *new_ip; /* ptrs to new dir, file inodes */ struct inode *new_superdirp, *next_new_superdirp; int r = OK; /* error flag; initially no error */ int odir, ndir; /* TRUE iff {old|new} file is dir */ int same_pdir; /* TRUE iff parent dirs are the same */ char old_name[NAME_MAX], new_name[NAME_MAX]; ino_t numb; int r1; /* See if 'name1' (existing file) exists. Get dir and file inodes. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); if ( (old_dirp = last_dir(user_path, old_name))==NIL_INODE) return(err_code); if ( (old_ip = advance(old_dirp, old_name)) == NIL_INODE) r = err_code; /* See if 'name2' (new name) exists. Get dir and file inodes. */ if (fetch_name(name2, name2_length, M1) != OK) r = err_code; if ( (new_dirp = last_dir(user_path, new_name)) == NIL_INODE) r = err_code; new_ip = advance(new_dirp, new_name); /* not required to exist */ if (old_ip != NIL_INODE) odir = ((old_ip->i_mode & I_TYPE) == I_DIRECTORY); /* TRUE iff dir */ /* If it is ok, check for a variety of possible errors. */ if (r == OK) { same_pdir = (old_dirp == new_dirp); /* The old inode must not be a superdirectory of the new last dir. */ if (odir && !same_pdir) { dup_inode(new_superdirp = new_dirp); while (TRUE) { /* may hang in a file system loop */ if (new_superdirp == old_ip) { r = EINVAL; break; } next_new_superdirp = advance(new_superdirp, dot2); put_inode(new_superdirp); if (next_new_superdirp == new_superdirp) break; /* back at system root directory */ new_superdirp = next_new_superdirp; if (new_superdirp == NIL_INODE) { /* Missing ".." entry. Assume the worst. */ r = EINVAL; break; } } put_inode(new_superdirp); } /* The old or new name must not be . or .. */ if (strcmp(old_name, ".")==0 || strcmp(old_name, "..")==0 || strcmp(new_name, ".")==0 || strcmp(new_name, "..")==0) r = EINVAL; /* Both parent directories must be on the same device. */ if (old_dirp->i_dev != new_dirp->i_dev) r = EXDEV; /* Parent dirs must be writable, searchable and on a writable device */ if ((r1 = forbidden(old_dirp, W_BIT | X_BIT)) != OK || (r1 = forbidden(new_dirp, W_BIT | X_BIT)) != OK) r = r1; /* Some tests apply only if the new path exists. */ if (new_ip == NIL_INODE) { /* don't rename a file with a file system mounted on it. */ if (old_ip->i_dev != old_dirp->i_dev) r = EXDEV; if (odir && (new_dirp->i_nlinks & BYTE) >= LINK_MAX && !same_pdir && r == OK) r = EMLINK; } else { if (old_ip == new_ip) r = SAME; /* old=new */ /* has the old file or new file a file system mounted on it? */ if (old_ip->i_dev != new_ip->i_dev) r = EXDEV; ndir = ((new_ip->i_mode & I_TYPE) == I_DIRECTORY); /* dir ? */ if (odir == TRUE && ndir == FALSE) r = ENOTDIR; if (odir == FALSE && ndir == TRUE) r = EISDIR; } } /* If a process has another root directory than the system root, we might * "accidently" be moving it's working directory to a place where it's * root directory isn't a super directory of it anymore. This can make * the function chroot useless. If chroot will be used often we should * probably check for it here. */ /* The rename will probably work. Only two things can go wrong now: * 1. being unable to remove the new file. (when new file already exists) * 2. being unable'''''''' to make the new directory entry. (new file doesn't exists) * [directory has to grow by one block and cannot because the disk * is completely full]. */ if (r == OK) { if (new_ip != NIL_INODE) { /* There is already an entry for 'new'. Try to remove it. */ if (odir) r = remove_dir(new_dirp, new_ip, new_name); else r = unlink_file(new_dirp, new_ip, new_name); } /* if r is OK, the rename will succeed, while there is now an * unused entry in the new parent directory. */ } if (r == OK) { /* If the new name will be in the same parent directory as the old one, * first remove the old name to free an entry for the new name, * otherwise first try to create the new name entry to make sure * the rename will succeed. */ numb = old_ip->i_num; /* inode number of old file */ if (same_pdir) { r = search_dir(old_dirp, old_name, (ino_t *) 0, DELETE); /* shouldn't go wrong. */ if (r==OK) (void) search_dir(old_dirp, new_name, &numb, ENTER); } else { r = search_dir(new_dirp, new_name, &numb, ENTER); if (r == OK) (void) search_dir(old_dirp, old_name, (ino_t *) 0, DELETE); } } /* If r is OK, the ctime and mtime of old_dirp and new_dirp have been marked * for update in search_dir. */ if (r == OK && odir && !same_pdir) { /* Update the .. entry in the directory (still points to old_dirp). */ numb = new_dirp->i_num; (void) unlink_file(old_ip, NIL_INODE, dot2); if (search_dir(old_ip, dot2, &numb, ENTER) == OK) { /* New link created. */ new_dirp->i_nlinks++; new_dirp->i_dirt = DIRTY; } } /* Release the inodes. */ put_inode(old_dirp); put_inode(old_ip); put_inode(new_dirp); put_inode(new_ip); return(r == SAME ? OK : r); } /*===========================================================================* * truncate * *===========================================================================*/ PUBLIC void truncate(rip) register struct inode *rip; /* pointer to inode to be truncated */ { /* Remove all the zones from the inode 'rip' and mark it dirty. */ register block_t b; zone_t z, zone_size, z1; off_t position; int i, scale, file_type, waspipe, single, nr_indirects; struct buf *bp; dev_t dev; file_type = rip->i_mode & I_TYPE; /* check to see if file is special */ if (file_type == I_CHAR_SPECIAL || file_type == I_BLOCK_SPECIAL) return; dev = rip->i_dev; /* device on which inode resides */ scale = rip->i_sp->s_log_zone_size; zone_size = (zone_t) BLOCK_SIZE << scale; nr_indirects = rip->i_nindirs; /* Pipes can shrink, so adjust size to make sure all zones are removed. */ waspipe = rip->i_pipe == I_PIPE; /* TRUE is this was a pipe */ if (waspipe) rip->i_size = PIPE_SIZE; /* Step through the file a zone at a time, finding and freeing the zones. */ for (position = 0; position < rip->i_size; position += zone_size) { if ( (b = read_map(rip, position)) != NO_BLOCK) { z = (zone_t) b >> scale; free_zone(dev, z); } } /* All the data zones have been freed. Now free the indirect zones. */ rip->i_dirt = DIRTY; if (waspipe) { wipe_inode(rip); /* clear out inode for pipes */ return; /* indirect slots contain file positions */ } single = rip->i_ndzones; free_zone(dev, rip->i_zone[single]); /* single indirect zone */ if ( (z = rip->i_zone[single+1]) != NO_ZONE) { /* Free all the single indirect zones pointed to by the double. */ b = (block_t) z << scale; bp = get_block(dev, b, NORMAL); /* get double indirect zone */ for (i = 0; i < nr_indirects; i++) { z1 = rd_indir(bp, i); free_zone(dev, z1); } /* Now free the double indirect zone itself. */ put_block(bp, INDIRECT_BLOCK); free_zone(dev, z); } /* Leave zone numbers for de(1) to recover file after an unlink(2). */ } /*===========================================================================* * remove_dir * *===========================================================================*/ PRIVATE int remove_dir(rldirp, rip, dir_name) struct inode *rldirp; /* parent directory */ struct inode *rip; /* directory to be removed */ char dir_name[NAME_MAX]; /* name of directory to be removed */ { /* A directory file has to be removed. Five conditions have to met: * - The file must be a directory * - The directory must be empty (except for . and ..) * - The final component of the path must not be . or .. * - The directory must not be the root of a mounted file system * - The directory must not be anybody's root/working directory */ int r; register struct fproc *rfp; /* search_dir checks that rip is a directory too. */ if ((r = search_dir(rip, "", (ino_t *) 0, IS_EMPTY)) != OK) return r; if (strcmp(dir_name, ".") == 0 || strcmp(dir_name, "..") == 0)return(EINVAL); if (rip->i_num == ROOT_INODE) return(EBUSY); /* can't remove 'root' */ for (rfp = &fproc[INIT_PROC_NR + 1]; rfp < &fproc[NR_PROCS]; rfp++) if (rfp->fp_workdir == rip || rfp->fp_rootdir == rip) return(EBUSY); /* can't remove anybody's working dir */ /* Actually try to unlink the file; fails if parent is mode 0 etc. */ if ((r = unlink_file(rldirp, rip, dir_name)) != OK) return r; /* Unlink . and .. from the dir. The super user can link and unlink any dir, * so don't make too many assumptions about them. */ (void) unlink_file(rip, NIL_INODE, dot1); (void) unlink_file(rip, NIL_INODE, dot2); return(OK); } /*===========================================================================* * unlink_file * *===========================================================================*/ PRIVATE int unlink_file(dirp, rip, file_name) struct inode *dirp; /* parent directory of file */ struct inode *rip; /* inode of file, may be NIL_INODE too. */ char file_name[NAME_MAX]; /* name of file to be removed */ { /* Unlink 'file_name'; rip must be the inode of 'file_name' or NIL_INODE. */ ino_t numb; /* inode number */ int r; /* If rip is not NIL_INODE, it is used to get faster access to the inode. */ if (rip == NIL_INODE) { /* Search for file in directory and try to get its inode. */ err_code = search_dir(dirp, file_name, &numb, LOOK_UP); if (err_code == OK) rip = get_inode(dirp->i_dev, (int) numb); if (err_code != OK || rip == NIL_INODE) return(err_code); } else { dup_inode(rip); /* inode will be returned with put_inode */ } r = search_dir(dirp, file_name, (ino_t *) 0, DELETE); if (r == OK) { rip->i_nlinks--; /* entry deleted from parent's dir */ rip->i_update |= CTIME; rip->i_dirt = DIRTY; } put_inode(rip); return(r); } /* This file handles advisory file locking as required by POSIX. * * The entry points into this file are * lock_op: perform locking operations for FCNTL system call * lock_revive: revive processes when a lock is released */ #include "fs.h" #include #include #include "file.h" #include "fproc.h" #include "inode.h" #include "lock.h" #include "param.h" /*===========================================================================* * lock_op * *===========================================================================*/ PUBLIC int lock_op(f, req) struct filp *f; int req; /* either F_SETLK or F_SETLKW */ { /* Perform the advisory locking required by POSIX. */ int r, ltype, i, conflict = 0, unlocking = 0; mode_t mo; off_t first, last; struct flock flock; vir_bytes user_flock; struct file_lock *flp, *flp2, *empty; /* Fetch the flock structure from user space. */ user_flock = (vir_bytes) name1; r = sys_copy(who, D, (phys_bytes) user_flock, FS_PROC_NR, D, (phys_bytes) &flock, (phys_bytes) sizeof(flock)); if (r != OK) return(EINVAL); /* Make some error checks. */ ltype = flock.l_type; mo = f->filp_mode; if (ltype != F_UNLCK && ltype != F_RDLCK && ltype != F_WRLCK) return(EINVAL); if (req == F_GETLK && ltype == F_UNLCK) return(EINVAL); if ( (f->filp_ino->i_mode & I_TYPE) != I_REGULAR) return(EINVAL); if (req != F_GETLK && ltype == F_RDLCK && (mo & R_BIT) == 0) return(EBADF); if (req != F_GETLK && ltype == F_WRLCK && (mo & W_BIT) == 0) return(EBADF); /* Compute the first and last bytes in the lock region. */ switch (flock.l_whence) { case SEEK_SET: first = 0; break; case SEEK_CUR: first = f->filp_pos; break; case SEEK_END: first = f->filp_ino->i_size; break; default: return(EINVAL); } /* Check for overflow. */ if (((long)flock.l_start > 0) && ((first + flock.l_start) < first)) return(EINVAL); if (((long)flock.l_start < 0) && ((first + flock.l_start) > first)) return(EINVAL); first = first + flock.l_start; last = first + flock.l_len - 1; if (flock.l_len == 0) last = MAX_FILE_POS; if (last < first) return(EINVAL); /* Check if this region conflicts with any existing lock. */ empty = (struct file_lock *) 0; for (flp = &file_lock[0]; flp < & file_lock[NR_LOCKS]; flp++) { if (flp->lock_type == 0) { if (empty == (struct file_lock *) 0) empty = flp; continue; /* 0 means unused slot */ } if (flp->lock_inode != f->filp_ino) continue; /* different file */ if (last < flp->lock_first) continue; /* new one is in front */ if (first > flp->lock_last) continue; /* new one is afterwards */ if (ltype == F_RDLCK && flp->lock_type == F_RDLCK) continue; if (ltype != F_UNLCK && flp->lock_pid == fp->fp_pid) continue; /* There might be a conflict. Process it. */ conflict = 1; if (req == F_GETLK) break; /* If we are trying to set a lock, it just failed. */ if (ltype == F_RDLCK || ltype == F_WRLCK) { if (req == F_SETLK) { /* For F_SETLK, just report back failure. */ return(EAGAIN); } else { /* For F_SETLKW, suspend the process. */ suspend(XLOCK); return(0); } } /* We are clearing a lock and we found something that overlaps. */ unlocking = 1; if (first <= flp->lock_first && last >= flp->lock_last) { flp->lock_type = 0; /* mark slot as unused */ nr_locks--; /* number of locks is now 1 less */ continue; } /* Part of a locked region has been unlocked. */ if (first <= flp->lock_first) { flp->lock_first = last + 1; continue; } if (last >= flp->lock_last) { flp->lock_last = first - 1; continue; } /* Bad luck. A lock has been split in two by unlocking the middle. */ if (nr_locks == NR_LOCKS) return(ENOLCK); for (i = 0; i < NR_LOCKS; i++) if (file_lock[i].lock_type == 0) break; flp2 = &file_lock[i]; flp2->lock_type = flp->lock_type; flp2->lock_pid = flp->lock_pid; flp2->lock_inode = flp->lock_inode; flp2->lock_first = last + 1; flp2->lock_last = flp->lock_last; flp->lock_last = first - 1; nr_locks++; } if (unlocking) lock_revive(); if (req == F_GETLK) { if (conflict) { /* GETLK and conflict. Report on the conflicting lock. */ flock.l_type = flp->lock_type; flock.l_whence = SEEK_SET; flock.l_start = flp->lock_first; flock.l_len = flp->lock_last - flp->lock_first + 1; flock.l_pid = flp->lock_pid; } else { /* It is GETLK and there is no conflict. */ flock.l_type = F_UNLCK; } /* Copy the flock structure back to the caller. */ r = sys_copy(FS_PROC_NR, D, (phys_bytes) &flock, who, D, (phys_bytes) user_flock, (phys_bytes) sizeof(flock)); return(r); } if (ltype == F_UNLCK) return(OK); /* unlocked a region with no locks */ /* There is no conflict. If space exists, store new lock in the table. */ if (empty == (struct file_lock *) 0) return(ENOLCK); /* table full */ empty->lock_type = ltype; empty->lock_pid = fp->fp_pid; empty->lock_inode = f->filp_ino; empty->lock_first = first; empty->lock_last = last; nr_locks++; return(OK); } /*===========================================================================* * lock_revive * *===========================================================================*/ PUBLIC void lock_revive() { /* Go find all the processes that are waiting for any kind of lock and * revive them all. The ones that are still blocked will block again when * they run. The others will complete. This strategy is a space-time * tradeoff. Figuring out exactly which ones to unblock now would take * extra code, and the only thing it would win would be some performance in * extremely rare circumstances (namely, that somebody actually used * locking). */ int task; struct fproc *fptr; for (fptr = &fproc[INIT_PROC_NR + 1]; fptr < &fproc[NR_PROCS]; fptr++){ task = -fptr->fp_task; if (fptr->fp_suspended == SUSPENDED && task == XLOCK) { revive( (int) (fptr - fproc), 0); } } } /* This is the file locking table. Like the filp table, it points to the * inode table, however, in this case to achieve advisory locking. */ EXTERN struct file_lock { short lock_type; /* F_RDLOCK or F_WRLOCK; 0 means unused slot */ pid_t lock_pid; /* pid of the process holding the lock */ struct inode *lock_inode; /* pointer to the inode locked */ off_t lock_first; /* offset of first byte locked */ off_t lock_last; /* offset of last byte locked */ } file_lock[NR_LOCKS]; /* This file contains the main program of the File System. It consists of * a loop that gets messages requesting work, carries out the work, and sends * replies. * * The entry points into this file are * main: main program of the File System * reply: send a reply to a process after the requested work is done */ struct super_block; /* proto.h needs to know this */ #include "fs.h" #include #include #include #include #include #include #include #include "buf.h" #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" #include "super.h" FORWARD _PROTOTYPE( void buf_pool, (void) ); FORWARD _PROTOTYPE( void fs_init, (void) ); FORWARD _PROTOTYPE( int igetenv, (char *var) ); FORWARD _PROTOTYPE( void get_work, (void) ); FORWARD _PROTOTYPE( void load_ram, (void) ); FORWARD _PROTOTYPE( void load_super, (Dev_t super_dev) ); /*===========================================================================* * main * *===========================================================================*/ PUBLIC void main() { /* This is the main program of the file system. The main loop consists of * three major activities: getting new work, processing the work, and sending * the reply. This loop never terminates as long as the file system runs. */ int error; fs_init(); /* This is the main loop that gets work, processes it, and sends replies. */ while (TRUE) { get_work(); /* sets who and fs_call */ fp = &fproc[who]; /* pointer to proc table struct */ super_user = (fp->fp_effuid == SU_UID ? TRUE : FALSE); /* su? */ dont_reply = FALSE; /* in other words, do reply is default */ /* Call the internal function that does the work. */ if (fs_call < 0 || fs_call >= NCALLS) error = ENOSYS; else error = (*call_vec[fs_call])(); /* Copy the results back to the user and send reply. */ if (dont_reply) continue; reply(who, error); if (rdahed_inode != NIL_INODE) read_ahead(); /* do block read ahead */ } } /*===========================================================================* * get_work * *===========================================================================*/ PRIVATE void get_work() { /* Normally wait for new input. However, if 'reviving' is * nonzero, a suspended process must be awakened. */ register struct fproc *rp; if (reviving != 0) { /* Revive a suspended process. */ for (rp = &fproc[0]; rp < &fproc[NR_PROCS]; rp++) if (rp->fp_revived == REVIVING) { who = (int)(rp - fproc); fs_call = rp->fp_fd & BYTE; fd = (rp->fp_fd >>8) & BYTE; buffer = rp->fp_buffer; nbytes = rp->fp_nbytes; rp->fp_suspended = NOT_SUSPENDED; /*no longer hanging*/ rp->fp_revived = NOT_REVIVING; reviving--; return; } panic("get_work couldn't revive anyone", NO_NUM); } /* Normal case. No one to revive. */ if (receive(ANY, &m) != OK) panic("fs receive error", NO_NUM); who = m.m_source; fs_call = m.m_type; } /*===========================================================================* * reply * *===========================================================================*/ PUBLIC void reply(whom, result) int whom; /* process to reply to */ int result; /* result of the call (usually OK or error #) */ { /* Send a reply to a user process. It may fail (if the process has just * been killed by a signal), so don't check the return code. If the send * fails, just ignore it. */ reply_type = result; send(whom, &m1); } /*===========================================================================* * fs_init * *===========================================================================*/ PRIVATE void fs_init() { /* Initialize global variables, tables, etc. */ register struct inode *rip; int i; message mess; /* The following initializations are needed to let dev_opcl succeed .*/ fp = (struct fproc *) NULL; who = FS_PROC_NR; buf_pool(); /* initialize buffer pool */ load_ram(); /* init RAM disk, load if it is root */ load_super(root_dev); /* load super block for root device */ /* Initialize the 'fproc' fields for process 0 .. INIT. */ for (i = 0; i <= LOW_USER; i+= 1) { if (i == FS_PROC_NR) continue; /* do not initialize FS */ fp = &fproc[i]; rip = get_inode(root_dev, ROOT_INODE); fp->fp_rootdir = rip; dup_inode(rip); fp->fp_workdir = rip; fp->fp_realuid = (uid_t) SYS_UID; fp->fp_effuid = (uid_t) SYS_UID; fp->fp_realgid = (gid_t) SYS_GID; fp->fp_effgid = (gid_t) SYS_GID; fp->fp_umask = ~0; fp->fp_pid = i < LOW_USER ? PID_SERVER : 1; } /* Certain relations must hold for the file system to work at all. */ if (SUPER_SIZE > BLOCK_SIZE) panic("SUPER_SIZE > BLOCK_SIZE", NO_NUM); if (BLOCK_SIZE % V2_INODE_SIZE != 0) /* this checks V1_INODE_SIZE too */ panic("BLOCK_SIZE % V2_INODE_SIZE != 0", NO_NUM); if (OPEN_MAX > 127) panic("OPEN_MAX > 127", NO_NUM); if (NR_BUFS < 6) panic("NR_BUFS < 6", NO_NUM); if (V1_INODE_SIZE != 32) panic("V1 inode size != 32", NO_NUM); if (V2_INODE_SIZE != 64) panic("V2 inode size != 64", NO_NUM); if (OPEN_MAX > 8 * sizeof(long)) panic("Too few bits in fp_cloexec", NO_NUM); /* Tell the memory task where my process table is for the sake of ps(1). */ mess.m_type = DEV_IOCTL; mess.PROC_NR = FS_PROC_NR; mess.DEVICE = RAM_DEV; mess.REQUEST = MIOCSPSINFO; mess.ADDRESS = (void *) fproc; (void) sendrec(MEM, &mess); } /*===========================================================================* * buf_pool * *===========================================================================*/ PRIVATE void buf_pool() { /* Initialize the buffer pool. */ register struct buf *bp; bufs_in_use = 0; front = &buf[0]; rear = &buf[NR_BUFS - 1]; for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) { bp->b_blocknr = NO_BLOCK; bp->b_dev = NO_DEV; bp->b_next = bp + 1; bp->b_prev = bp - 1; } buf[0].b_prev = NIL_BUF; buf[NR_BUFS - 1].b_next = NIL_BUF; for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) bp->b_hash = bp->b_next; buf_hash[0] = front; } /*===========================================================================* * igetenv * *===========================================================================*/ PRIVATE int igetenv(var) char *var; { /* Ask kernel for an integer valued boot environment variable. */ struct sysgetenv sysgetenv; char value[64]; sysgetenv.key = var; sysgetenv.keylen = strlen(var)+1; sysgetenv.val = value; sysgetenv.vallen = sizeof(value); (void) sys_sysctl(FS_PROC_NR, SYSGETENV, 1, (vir_bytes) &sysgetenv); return(atoi(value)); } /*===========================================================================* * load_ram * *===========================================================================*/ PRIVATE void load_ram() { /* If the root device is the RAM disk, copy the entire root image device * block-by-block to a RAM disk with the same size as the image. * Otherwise, just allocate a RAM disk with size given in the boot parameters. */ register struct buf *bp, *bp1; u32_t lcount, ram_size, fsmax; zone_t zones; struct super_block *sp, *dsp; block_t b; Dev_t image_dev; /* Get some boot environment variables. */ root_dev = igetenv("rootdev"); image_dev = igetenv("ramimagedev"); ram_size = igetenv("ramsize"); /* Open the root device. */ if (dev_open(root_dev, FS_PROC_NR, R_BIT|W_BIT) != OK) panic("Cannot open root device",NO_NUM); /* If the root device is the ram disk then fill it from the image device. */ if (root_dev == DEV_RAM) { if (dev_open(image_dev, FS_PROC_NR, R_BIT) != OK) panic("Cannot open RAM image device", NO_NUM); /* Get size of RAM disk by reading root file system's super block. */ sp = &super_block[0]; sp->s_dev = image_dev; if (read_super(sp) != OK) panic("Bad root file system", NO_NUM); lcount = sp->s_zones << sp->s_log_zone_size; /* # blks on root dev*/ /* Stretch the RAM disk file system to the boot parameters size, but * no further than the last'''' zone bit map block allows. */ if (ram_size < lcount) ram_size = lcount; fsmax = (u32_t) sp->s_zmap_blocks * CHAR_BIT * BLOCK_SIZE; fsmax = (fsmax + (sp->s_firstdatazone-1)) << sp->s_log_zone_size; if (ram_size > fsmax) ram_size = fsmax; } /* Tell RAM driver how big the RAM disk must be. */ m1.m_type = DEV_IOCTL; m1.PROC_NR = FS_PROC_NR; m1.DEVICE = RAM_DEV; m1.REQUEST = MIOCRAMSIZE; m1.POSITION = ram_size; if (sendrec(MEM, &m1) != OK || m1.REP_STATUS != OK) panic("Can't set RAM disk size", NO_NUM); /* Tell MM the RAM disk size, and wait for it to come "on-line". */ m1.m1_i1 = ((long) ram_size * BLOCK_SIZE) >> CLICK_SHIFT; if (sendrec(MM_PROC_NR, &m1) != OK) panic("FS can't sync up with MM", NO_NUM); #if ENABLE_CACHE2 /* The RAM disk is a second level block cache while not otherwise used. */ init_cache2(ram_size); #endif /* If the root device is not the RAM disk, it doesn't need loading. */ if (root_dev != DEV_RAM) return; /* Copy the blocks one at a time from the image to the RAM disk. */ printf("Loading RAM disk.\33[23CLoaded: 0K "); inode[0].i_mode = I_BLOCK_SPECIAL; /* temp inode for rahead() */ inode[0].i_size = LONG_MAX; inode[0].i_dev = image_dev; inode[0].i_zone[0] = image_dev; for (b = 0; b < (block_t) lcount; b++) { bp = rahead(&inode[0], b, (off_t)BLOCK_SIZE * b, BLOCK_SIZE); bp1 = get_block(root_dev, b, NO_READ); memcpy(bp1->b_data, bp->b_data, (size_t) BLOCK_SIZE); bp1->b_dirt = DIRTY; put_block(bp, FULL_DATA_BLOCK); put_block(bp1, FULL_DATA_BLOCK); printf("\b\b\b\b\b\b\b%5ldK ", ((long) b * BLOCK_SIZE)/1024L); } printf("\rRAM disk loaded.\33[K\n\n"); /* Invalidate and close the image device. */ invalidate(image_dev); dev_close(image_dev); /* Resize the RAM disk root file system. */ bp = get_block(root_dev, SUPER_BLOCK, NORMAL); dsp = (struct super_block *) bp->b_data; zones = ram_size >> sp->s_log_zone_size; dsp->s_nzones = conv2(sp->s_native, (u16_t) zones); dsp->s_zones = conv4(sp->s_native, zones); bp->b_dirt = DIRTY; put_block(bp, ZUPER_BLOCK); } /*===========================================================================* * load_super * *===========================================================================*/ PRIVATE void load_super(super_dev) dev_t super_dev; /* place to get superblock from */ { int bad; register struct super_block *sp; register struct inode *rip; /* Initialize the super_block table. */ for (sp = &super_block[0]; sp < &super_block[NR_SUPERS]; sp++) sp->s_dev = NO_DEV; /* Read in super_block for the root file system. */ sp = &super_block[0]; sp->s_dev = super_dev; /* Check super_block for consistency. */ bad = (read_super(sp) != OK); if (!bad) { rip = get_inode(super_dev, ROOT_INODE); /* inode for root dir */ if ( (rip->i_mode & I_TYPE) != I_DIRECTORY || rip->i_nlinks < 3) bad++; } if (bad) panic("Invalid root file system", NO_NUM); sp->s_imount = rip; dup_inode(rip); sp->s_isup = rip; sp->s_rd_only = 0; return; } /* This file contains a collection of miscellaneous procedures. Some of them * perform simple system calls. Some others do a little part of system calls * that are mostly performed by the Memory Manager. * * The entry points into this file are * do_dup: perform the DUP system call * do_fcntl: perform the FCNTL system call * do_sync: perform the SYNC system call * do_fork: adjust the tables after MM has performed a FORK system call * do_exec: handle files with FD_CLOEXEC on after MM has done an EXEC * do_exit: a process has exited; note that in the tables * do_set: set uid or gid for some process * do_revive: revive a process that was waiting for something (e.g. TTY) * do_svrctl: file system control */ #include "fs.h" #include #include /* cc runs out of memory with unistd.h :-( */ #include #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "dev.h" #include "param.h" /*===========================================================================* * do_dup * *===========================================================================*/ PUBLIC int do_dup() { /* Perform the dup(fd) or dup2(fd,fd2) system call. These system calls are * obsolete. In fact, it is not even possible to invoke them using the * current library because the library routines call fcntl(). They are * provided to permit old binary programs to continue to run. */ register int rfd; register struct filp *f; struct filp *dummy; int r; /* Is the file descriptor valid? */ rfd = fd & ~DUP_MASK; /* kill off dup2 bit, if on */ if ((f = get_filp(rfd)) == NIL_FILP) return(err_code); /* Distinguish between dup and dup2. */ if (fd == rfd) { /* bit not on */ /* dup(fd) */ if ( (r = get_fd(0, 0, &fd2, &dummy)) != OK) return(r); } else { /* dup2(fd, fd2) */ if (fd2 < 0 || fd2 >= OPEN_MAX) return(EBADF); if (rfd == fd2) return(fd2); /* ignore the call: dup2(x, x) */ fd = fd2; /* prepare to close fd2 */ (void) do_close(); /* cannot fail */ } /* Success. Set up new file descriptors. */ f->filp_count++; fp->fp_filp[fd2] = f; return(fd2); } /*===========================================================================* * do_fcntl * *===========================================================================*/ PUBLIC int do_fcntl() { /* Perform the fcntl(fd, request, ...) system call. */ register struct filp *f; int new_fd, r, fl; long cloexec_mask; /* bit map for the FD_CLOEXEC flag */ long clo_value; /* FD_CLOEXEC flag in proper position */ struct filp *dummy; /* Is the file descriptor valid? */ if ((f = get_filp(fd)) == NIL_FILP) return(err_code); switch (request) { case F_DUPFD: /* This replaces the old dup() system call. */ if (addr < 0 || addr >= OPEN_MAX) return(EINVAL); if ((r = get_fd(addr, 0, &new_fd, &dummy)) != OK) return(r); f->filp_count++; fp->fp_filp[new_fd] = f; return(new_fd); case F_GETFD: /* Get close-on-exec flag (FD_CLOEXEC in POSIX Table 6-2). */ return( ((fp->fp_cloexec >> fd) & 01) ? FD_CLOEXEC : 0); case F_SETFD: /* Set close-on-exec flag (FD_CLOEXEC in POSIX Table 6-2). */ cloexec_mask = 1L << fd; /* singleton set position ok */ clo_value = (addr & FD_CLOEXEC ? cloexec_mask : 0L); fp->fp_cloexec = (fp->fp_cloexec & ~cloexec_mask) | clo_value; return(OK); case F_GETFL: /* Get file status flags (O_NONBLOCK and O_APPEND). */ fl = f->filp_flags & (O_NONBLOCK | O_APPEND | O_ACCMODE); return(fl); case F_SETFL: /* Set file status flags (O_NONBLOCK and O_APPEND). */ fl = O_NONBLOCK | O_APPEND; f->filp_flags = (f->filp_flags & ~fl) | (addr & fl); return(OK); case F_GETLK: case F_SETLK: case F_SETLKW: /* Set or clear a file lock. */ r = lock_op(f, request); return(r); default: return(EINVAL); } } /*===========================================================================* * do_sync * *===========================================================================*/ PUBLIC int do_sync() { /* Perform the sync() system call. Flush all the tables. */ register struct inode *rip; register struct buf *bp; /* The order in which the various tables are flushed is critical. The * blocks must be flushed last, since rw_inode() leaves its results in * the block cache. */ /* Write all the dirty inodes to the disk. */ for (rip = &inode[0]; rip < &inode[NR_INODES]; rip++) if (rip->i_count > 0 && rip->i_dirt == DIRTY) rw_inode(rip, WRITING); /* Write all the dirty blocks to the disk, one drive at a time. */ for (bp = &buf[0]; bp < &buf[NR_BUFS]; bp++) if (bp->b_dev != NO_DEV && bp->b_dirt == DIRTY) flushall(bp->b_dev); return(OK); /* sync() can't fail */ } /*===========================================================================* * do_fork * *===========================================================================*/ PUBLIC int do_fork() { /* Perform those aspects of the fork() system call that relate to files. * In particular, let the child inherit its parent's file descriptors. * The parent and child parameters tell who forked off whom. The file * system uses the same slot numbers as the kernel. Only MM makes this call. */ register struct fproc *cp; int i; /* Only MM may make this call directly. */ if (who != MM_PROC_NR) return(EGENERIC); /* Copy the parent's fproc struct to the child. */ fproc[child] = fproc[parent]; /* Increase the counters in the 'filp' table. */ cp = &fproc[child]; for (i = 0; i < OPEN_MAX; i++) if (cp->fp_filp[i] != NIL_FILP) cp->fp_filp[i]->filp_count++; /* Fill in new process id. */ cp->fp_pid = pid; /* A child is not a process leader. */ cp->fp_sesldr = 0; /* Record the fact that both root and working dir have another user. */ dup_inode(cp->fp_rootdir); dup_inode(cp->fp_workdir); return(OK); } /*===========================================================================* * do_exec * *===========================================================================*/ PUBLIC int do_exec() { /* Files can be marked with the FD_CLOEXEC bit (in fp->fp_cloexec). When * MM does an EXEC, it calls FS to allow FS to find these files and close them. */ register int i; long bitmap; /* Only MM may make this call directly. */ if (who != MM_PROC_NR) return(EGENERIC); /* The array of FD_CLOEXEC bits is in the fp_cloexec bit map. */ fp = &fproc[slot1]; /* get_filp() needs 'fp' */ bitmap = fp->fp_cloexec; if (bitmap == 0) return(OK); /* normal case, no FD_CLOEXECs */ /* Check the file desriptors one by one for presence of FD_CLOEXEC. */ for (i = 0; i < OPEN_MAX; i++) { fd = i; if ( (bitmap >> i) & 01) (void) do_close(); } return(OK); } /*===========================================================================* * do_exit * *===========================================================================*/ PUBLIC int do_exit() { /* Perform the file system portion of the exit(status) system call. */ register int i, exitee, task; register struct fproc *rfp; register struct filp *rfilp; register struct inode *rip; dev_t dev; /* Only MM may do the EXIT call directly. */ if (who != MM_PROC_NR) return(EGENERIC); /* Nevertheless, pretend that the call came from the user. */ fp = &fproc[slot1]; /* get_filp() needs 'fp' */ exitee = slot1; if (fp->fp_suspended == SUSPENDED) { task = -fp->fp_task; if (task == XPIPE || task == XPOPEN) susp_count--; pro = exitee; (void) do_unpause(); /* this always succeeds for MM */ fp->fp_suspended = NOT_SUSPENDED; } /* Loop on file descriptors, closing any that are open. */ for (i = 0; i < OPEN_MAX; i++) { fd = i; (void) do_close(); } /* Release root and working directories. */ put_inode(fp->fp_rootdir); put_inode(fp->fp_workdir); fp->fp_rootdir = NIL_INODE; fp->fp_workdir = NIL_INODE; /* If a session leader exits then revoke access to its controlling tty from * all other processe'''((s using it. */ if (!fp->fp_sesldr) return(OK); /* not a session leader */ fp->fp_sesldr = FALSE; if (fp->fp_tty == 0) return(OK); /* no controlling tty */ dev = fp->fp_tty; for (rfp = &fproc[LOW_USER]; rfp < &fproc[NR_PROCS]; rfp++) { if (rfp->fp_tty == dev) rfp->fp_tty = 0; for (i = 0; i < OPEN_MAX; i++) { if ((rfilp = rfp->fp_filp[i]) == NIL_FILP) continue; if (rfilp->filp_mode == FILP_CLOSED) continue; rip = rfilp->filp_ino; if ((rip->i_mode & I_TYPE) != I_CHAR_SPECIAL) continue; if ((dev_t) rip->i_zone[0] != dev) continue; dev_close(dev); rfilp->filp_mode = FILP_CLOSED; } } /* Truly exiting, or becoming a server? */ fp->fp_pid = PID_FREE; return(OK); } /*===========================================================================* * do_set * *===========================================================================*/ PUBLIC int do_set() { /* Set uid_t or gid_t field. */ register struct fproc *tfp; /* Only MM may make this call directly. */ if (who != MM_PROC_NR) return(EGENERIC); tfp = &fproc[slot1]; if (fs_call == SETUID) { tfp->fp_realuid = (uid_t) real_user_id; tfp->fp_effuid = (uid_t) eff_user_id; } if (fs_call == SETGID) { tfp->fp_effgid = (gid_t) eff_grp_id; tfp->fp_realgid = (gid_t) real_grp_id; } return(OK); } /*===========================================================================* * do_revive * *===========================================================================*/ PUBLIC int do_revive() { /* A task, typically TTY, has now gotten the characters that were needed for a * previous read. The process did not get a reply when it made the call. * Instead it was suspended. Now we can send the reply to wake it up. This * business has to be done carefully, since the incoming message is from * a task (to which no reply can be sent), and the reply must go to a process * that blocked earlier. The reply to the caller is inhibited by setting the * 'dont_reply' flag, and the reply to the blocked process is done explicitly * in revive(). */ if (who >= LOW_USER && fp->fp_pid != PID_SERVER) return(EPERM); revive(m.REP_PROC_NR, m.REP_STATUS); dont_reply = TRUE; /* don't reply to the TTY task */ return(OK); } /*===========================================================================* * do_svrctl * *===========================================================================*/ PUBLIC int do_svrctl() { switch (svrctl_req) { case FSSIGNON: { /* A server in user space calls in to manage a device. */ struct fssignon device; int r, major; struct dmap *dp; if (fp->fp_effuid != SU_UID) return(EPERM); r = sys_copy(who, D, (phys_bytes) svrctl_argp, FS_PROC_NR, D, (phys_bytes) &device, (phys_bytes) sizeof(device)); if (r != OK) return(r); major= (device.dev >> MAJOR) & BYTE; if (major >= max_major) return(ENODEV); dp = &dmap[major]; if (dp->dmap_task != ANY) return(EBUSY); switch (device.style) { case STYLE_DEV: dp->dmap_opcl = gen_opcl; break; case STYLE_TTY: dp->dmap_opcl = tty_opcl; break; case STYLE_CLONE: dp->dmap_opcl = clone_opcl; break; default: return(EINVAL); } dp->dmap_io = gen_io; dp->dmap_task = who; fp->fp_pid = PID_SERVER; return(OK); } default: return(EINVAL); } } /* This file performs the MOUNT and UMOUNT system calls. * * The entry points into this file are * do_mount: perform the MOUNT system call * do_umount: perform the UMOUNT system call */ #include "fs.h" #include #include #include #include "buf.h" #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" #include "super.h" FORWARD _PROTOTYPE( dev_t name_to_dev, (char *path) ); /*===========================================================================* * do_mount * *===========================================================================*/ PUBLIC int do_mount() { /* Perform the mount(name, mfile, rd_only) system call. */ register struct inode *rip, *root_ip; struct super_block *xp, *sp; dev_t dev; mode_t bits; int rdir, mdir; /* TRUE iff {root|mount} file is dir */ int r, found; /* Only the super-user may do MOUNT. */ if (!super_user) return(EPERM); /* If 'name' is not for a block special file, return error. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); if ( (dev = name_to_dev(user_path)) == NO_DEV) return(err_code); /* Scan super block table to see if dev already mounted & find a free slot.*/ sp = NIL_SUPER; found = FALSE; for (xp = &super_block[0]; xp < &super_block[NR_SUPERS]; xp++) { if (xp->s_dev == dev) found = TRUE; /* is it mounted already? */ if (xp->s_dev == NO_DEV) sp = xp; /* record free slot */ } if (found) return(EBUSY); /* already mounted */ if (sp == NIL_SUPER) return(ENFILE); /* no super block available */ /* Open the device the file system lives on. */ if (dev_open(dev, who, rd_only ? R_BIT : (R_BIT|W_BIT)) != OK) return(EINVAL); /* Fill in the super block. */ sp->s_dev = dev; /* read_super() needs to know which dev */ r = read_super(sp); /* Is it recognized as a Minix filesystem? */ if (r != OK) { dev_close(dev); return(r); } /* Now get the inode of the file to be mounted on. */ if (fetch_name(name2, name2_length, M1) != OK) { sp->s_dev = NO_DEV; dev_close(dev); return(err_code); } if ( (rip = eat_path(user_path)) == NIL_INODE) { sp->s_dev = NO_DEV; dev_close(dev); return(err_code); } /* It may not be busy. */ r = OK; if (rip->i_count > 1) r = EBUSY; /* It may not be special. */ bits = rip->i_mode & I_TYPE; if (bits == I_BLOCK_SPECIAL || bits == I_CHAR_SPECIAL) r = ENOTDIR; /* Get the root inode of the mounted file system. */ root_ip = NIL_INODE; /* if 'r' not OK, make sure this is defined */ if (r == OK) { if ( (root_ip = get_inode(dev, ROOT_INODE)) == NIL_INODE) r = err_code; } if (root_ip != NIL_INODE && root_ip->i_mode == 0) r = EINVAL; /* File types of 'rip' and 'root_ip' may not conflict. */ if (r == OK) { mdir = ((rip->i_mode & I_TYPE) == I_DIRECTORY); /* TRUE iff dir */ rdir = ((root_ip->i_mode & I_TYPE) == I_DIRECTORY); if (!mdir && rdir) r = EISDIR; } /* If error, return the super block and both inodes; release the maps. */ if (r != OK) { put_inode(rip); put_inode(root_ip); (void) do_sync(); invalidate(dev); dev_close(dev); return(r); } /* Nothing else can go wrong. Perform the mount. */ rip->i_mount = I_MOUNT; /* this bit says the inode is mounted on */ sp->s_imount = rip; sp->s_isup = root_ip; sp->s_rd_only = rd_only; return(OK); } /*===========================================================================* * do_umount * *===========================================================================*/ PUBLIC int do_umount() { /* Perform the umount(name) system call. */ register struct inode *rip; struct super_block *sp, *sp1; dev_t dev; int count; /* Only the super-user may do UMOUNT. */ if (!super_user) return(EPERM); /* If 'name' is not for a block special file, return error. */ if (fetch_name(name, name_length, M3) != OK) return(err_code); if ( (dev = name_to_dev(user_path)) == NO_DEV) return(err_code); /* See if the mounted device is busy. Only 1 inode using it should be * open -- the root inode -- and that inode only 1 time. */ count = 0; for (rip = &inode[0]; rip< &inode[NR_INODES]; rip++) if (rip->i_count > 0 && rip->i_dev == dev) count += rip->i_count; if (count > 1) return(EBUSY); /* can't umount a busy file system */ /* Find the super block. */ sp = NIL_SUPER; for (sp1 = &super_block[0]; sp1 < &super_block[NR_SUPERS]; sp1++) { if (sp1->s_dev == dev) { sp = sp1; break; } } /* Sync the disk, and invalidate cache. */ (void) do_sync(); /* force any cached blocks out of memory */ invalidate(dev); /* invalidate cache entries for this dev */ if (sp == NIL_SUPER) return(EINVAL); /* Close the device the file system lives on. */ dev_close(dev); /* Finish off the unmount. */ sp->s_imount->i_mount = NO_MOUNT; /* inode returns to normal */ put_inode(sp->s_imount); /* release the inode mounted on */ put_inode(sp->s_isup); /* release the root inode of the mounted fs */ sp->s_imount = NIL_INODE; sp->s_dev = NO_DEV; return(OK); } /*===========================================================================* * name_to_dev * *===========================================================================*/ PRIVATE dev_t name_to_dev(path) char *path; /* pointer to path name */ { /* Convert the block special file 'path' to a device number. If 'path' * is not a block special file, return error code in 'err_code'. */ register struct inode *rip; register dev_t dev; /* If 'path' can't be opened, give up immediately. */ if ( (rip = eat_path(path)) == NIL_INODE) return(NO_DEV); /* If 'path' is not a block special file, return error. */ if ( (rip->i_mode & I_TYPE) != I_BLOCK_SPECIAL) { err_code = ENOTBLK; put_inode(rip); return(NO_DEV); } /* Extract the device number. */ dev = (dev_t) rip->i_zone[0]; put_inode(rip); return(dev); } /* This file contains the procedures for creating, opening, closing, and * seeking on files. * * The entry points into this file are * do_creat: perform the CREAT system call * do_open: perform the OPEN system call * do_mknod: perform the MKNOD system call * do_mkdir: perform the MKDIR system call * do_close: perform the CLOSE system call * do_lseek: perform the LSEEK system call */ #include "fs.h" #include #include #include #include #include "buf.h" #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "lock.h" #include "param.h" PRIVATE char mode_map[] = {R_BIT, W_BIT, R_BIT|W_BIT, 0}; FORWARD _PROTOTYPE( int common_open, (int oflags, Mode_t omode) ); FORWARD _PROTOTYPE( int pipe_open, (struct inode *rip,Mode_t bits,int oflags)); FORWARD _PROTOTYPE( struct inode *new_node, (char *path, Mode_t bits, zone_t z0) ); /*===========================================================================* * do_creat * *===========================================================================*/ PUBLIC int do_creat() { /* Perform the creat(name, mode) system call. */ int r; if (fetch_name(name, name_length, M3) != OK) return(err_code); r = common_open(O_WRONLY | O_CREAT | O_TRUNC, (mode_t) mode); return(r); } /*===========================================================================* * do_open * *===========================================================================*/ PUBLIC int do_open() { /* Perform the open(name, flags,...) system call. */ int create_mode = 0; /* is really mode_t but this gives problems */ int r; /* If O_CREAT is set, open has three parameters, otherwise two. */ if (mode & O_CREAT) { create_mode = c_mode; r = fetch_name(c_name, name1_length, M1); } else { r = fetch_name(name, name_length, M3); } if (r != OK) return(err_code); /* name was bad */ r = common_open(mode, create_mode); return(r); } /*===========================================================================* * common_open * *===========================================================================*/ PRIVATE int common_open(oflags, omode) register int oflags; mode_t omode; { /* Common code from do_creat and do_open. */ register struct inode *rip; int r, b, exist = TRUE; dev_t dev; mode_t bits; off_t pos; struct filp *fil_ptr, *filp2; /* Remap the bottom two bits of oflags. */ bits = (mode_t) mode_map[oflags & O_ACCMODE]; /* See if file descriptor and filp slots are available. */ if ( (r = get_fd(0, bits, &fd, &fil_ptr)) != OK) return(r); /* If O_CREATE is set, try to make the file. */ if (oflags & O_CREAT) { /* Create a new inode by calling new_node(). */ omode = I_REGULAR | (omode & ALL_MODES & fp->fp_umask); rip = new_node(user_path, omode, NO_ZONE); r = err_code; if (r == OK) exist = FALSE; /* we just created the file */ else if (r != EEXIST) return(r); /* other error */ else exist = !(oflags & O_EXCL); /* file exists, if the O_EXCL flag is set this is an error */ } else { /* Scan path name. */ if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); } /* Claim the file descriptor and filp slot and fill them in. */ fp->fp_filp[fd] = fil_ptr; fil_ptr->filp_count = 1; fil_ptr->filp_ino = rip; fil_ptr->filp_flags = oflags; /* Only do the normal open code if we didn't just create the file. */ if (exist) { /* Check protections. */ if ((r = forbidden(rip, bits)) == OK) { /* Opening reg. files directories and special files differ. */ switch (rip->i_mode & I_TYPE) { case I_REGULAR: /* Truncate regular file if O_TRUNC. */ if (oflags & O_TRUNC) { if ((r = forbidden(rip, W_BIT)) !=OK) break; truncate(rip); wipe_inode(rip); /* Send the inode from the inode cache to the * block cache, so it gets written on the next * cache flush. */ rw_inode(rip, WRITING); } break; case I_DIRECTORY: /* Directories may be read but not written. */ r = (bits & W_BIT ? EISDIR : OK); break; case I_CHAR_SPECIAL: case I_BLOCK_SPECIAL: /* Invoke the driver for special processing. */ dev = (dev_t) rip->i_zone[0]; r = dev_open(dev, who, bits | (oflags & ~O_ACCMODE)); break; case I_NAMED_PIPE: oflags |= O_APPEND; /* force append mode */ fil_ptr->filp_flags = oflags; r = pipe_open(rip, bits, oflags); if (r == OK) { /* See if someone else is doing a rd or wt on * the FIFO. If so, use its filp entry so the * file position will be automatically shared. */ b = (bits & R_BIT ? R_BIT : W_BIT); fil_ptr->filp_count = 0; /* don't find self */ if ((filp2 = find_filp(rip, b)) != NIL_FILP) { /* Co-reader or writer found. Use it.*/ fp->fp_filp[fd] = filp2; filp2->filp_count++; filp2->filp_ino = rip; filp2->filp_flags = oflags; /* i_count was incremented incorrectly * by eatpath above, not knowing that * we were going to use an existing * filp entry. Correct this error. */ rip->i_count--; } else { /* Nobody else found. Restore filp. */ fil_ptr->filp_count = 1; if (b == R_BIT) pos = rip->i_zone[V2_NR_DZONES+0]; else pos = rip->i_zone[V2_NR_DZONES+1]; fil_ptr->filp_pos = pos; } } break; } } } /* If error, release inode. */ if (r != OK) { fp->fp_filp[fd] = NIL_FILP; fil_ptr->filp_count= 0; put_inode(rip); return(r); } return(fd); } /*===========================================================================* * new_node * *===========================================================================*/ PRIVATE struct inode *new_node(path, bits, z0) char *path; /* pointer to path name */ mode_t bits; /* mode of the new inode */ zone_t z0; /* zone number 0 for new inode */ { /* New_node() is called by common_open(), do_mknod(), and do_mkdir(). * In all cases it allocates a new inode, makes a directory entry for it on * the path 'path', and initializes it. It returns a pointer to the inode if * it can do this; otherwise it returns NIL_INODE. It always sets 'err_code' * to an appropriate value (OK or an error code). */ register struct inode *rlast_dir_ptr, *rip; register int r; char string[NAME_MAX]; /* See if the path can be opened down to the last directory. */ if ((rlast_dir_ptr = last_dir(path, string)) == NIL_INODE) return(NIL_INODE); /* The final directory is accessible. Get final component of the path. */ rip = advance(rlast_dir_ptr, string); if ( rip == NIL_INODE && err_code == ENOENT) { /* Last path component does not exist. Make new directory entry. */ if ( (rip = alloc_inode(rlast_dir_ptr->i_dev, bits)) == NIL_INODE) { /* Can't creat new inode: out of inodes. */ put_inode(rlast_dir_ptr); return(NIL_INODE); } /* Force inode to the disk before making directory entry to make * the system more robust in the face of a crash: an inode with * no directory entry is much better than the opposite. */ rip->i_nlinks++; rip->i_zone[0] = z0; /* major/minor device numbers */ rw_inode(rip, WRITING); /* force inode to disk now */ /* New inode acquired. Try to make directory entry. */ if ((r = search_dir(rlast_dir_ptr, string, &rip->i_num,ENTER)) != OK) { put_inode(rlast_dir_ptr); rip->i_nlinks--; /* pity, have to free disk inode */ rip->i_dirt = DIRTY; /* dirty inodes are written out */ put_inode(rip); /* this call frees the inode */ err_code = r; return(NIL_INODE); } } else { /* Either last component exists, or there is some problem. */ if (rip != NIL_INODE) r = EEXIST; else r = err_code; } /* Return the directory inode and exit. */ put_inode(rlast_dir_ptr); err_code = r; return(rip); } /*===========================================================================* * pipe_open * *===========================================================================*/ PRIVATE int pipe_open(rip, bits, of(((((((((lags) register struct inode *rip; register mode_t bits; register int oflags; { /* This function is called from common_open. It checks if * there is at least one reader/writer pair for the pipe, if not * it suspends the caller, otherwise it revives all other blocked * processes hanging on the pipe. */ if (find_filp(rip, bits & W_BIT ? R_BIT : W_BIT) == NIL_FILP) { if (oflags & O_NONBLOCK) { if (bits & W_BIT) return(ENXIO); } else suspend(XPOPEN); /* suspend caller */ } else if (susp_count > 0) {/* revive blocked processes */ release(rip, OPEN, susp_count); release(rip, CREAT, susp_count); } rip->i_pipe = I_PIPE; return(OK); } /*===========================================================================* * do_mknod * *===========================================================================*/ PUBLIC int do_mknod() { /* Perform the mknod(name, mode, addr) system call. */ register mode_t bits, mode_bits; struct inode *ip; /* Only the super_user may make nodes other than fifos. */ mode_bits = (mode_t) m.m1_i2; /* mode of the inode */ if (!super_user && ((mode_bits & I_TYPE) != I_NAMED_PIPE)) return(EPERM); if (fetch_name(m.m1_p1, m.m1_i1, M1) != OK) return(err_code); bits = (mode_bits & I_TYPE) | (mode_bits & ALL_MODES & fp->fp_umask); ip = new_node(user_path, bits, (zone_t) m.m1_i3); put_inode(ip); return(err_code); } /*===========================================================================* * do_mkdir * *===========================================================================*/ PUBLIC int do_mkdir() { /* Perform the mkdir(name, mode) system call. */ int r1, r2; /* status codes */ ino_t dot, dotdot; /* inode numbers for . and .. */ mode_t bits; /* mode bits for the new inode */ char string[NAME_MAX]; /* last component of the new dir's path name */ register struct inode *rip, *ldirp; /* Check to see if it is possible to make another link in the parent dir. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); ldirp = last_dir(user_path, string); /* pointer to new dir's parent */ if (ldirp == NIL_INODE) return(err_code); if ( (ldirp->i_nlinks & BYTE) >= LINK_MAX) { put_inode(ldirp); /* return parent */ return(EMLINK); } /* Next make the inode. If that fails, return error code. */ bits = I_DIRECTORY | (mode & RWX_MODES & fp->fp_umask); rip = new_node(user_path, bits, (zone_t) 0); if (rip == NIL_INODE || err_code == EEXIST) { put_inode(rip); /* can't make dir: it already exists */ put_inode(ldirp); /* return parent too */ return(err_code); } /* Get the inode numbers for . and .. to enter in the directory. */ dotdot = ldirp->i_num; /* parent's inode number */ dot = rip->i_num; /* inode number of the new dir itself */ /* Now make dir entries for . and .. unless the disk is completely full. */ /* Use dot1 and dot2, so the mode of the directory isn't important. */ rip->i_mode = bits; /* set mode */ r1 = search_dir(rip, dot1, &dot, ENTER); /* enter . in the new dir */ r2 = search_dir(rip, dot2, &dotdot, ENTER); /* enter .. in the new dir */ /* If both . and .. were successfully entered, increment the link counts. */ if (r1 == OK && r2 == OK) { /* Normal case. It was possible to enter . and .. in the new dir. */ rip->i_nlinks++; /* this accounts for . */ ldirp->i_nlinks++; /* this accounts for .. */ ldirp->i_dirt = DIRTY; /* mark parent's inode as dirty */ } else { /* It was not possible to enter . or .. probably disk was full. */ (void) search_dir(ldirp, string, (ino_t *) 0, DELETE); rip->i_nlinks--; /* undo the increment done in new_node() */ } rip->i_dirt = DIRTY; /* either way, i_nlinks has changed */ put_inode(ldirp); /* return the inode of the parent dir */ put_inode(rip); /* return the inode of the newly made dir */ return(err_code); /* new_node() always sets 'err_code' */ } /*===========================================================================* * do_close * *===========================================================================*/ PUBLIC int do_close() { /* Perform the close(fd) system call. */ register struct filp *rfilp; register struct inode *rip; struct file_lock *flp; int rw, mode_word, lock_count; dev_t dev; /* First locate the inode that belongs to the file descriptor. */ if ( (rfilp = get_filp(fd)) == NIL_FILP) return(err_code); rip = rfilp->filp_ino; /* 'rip' points to the inode */ if (rfilp->filp_count - 1 == 0 && rfilp->filp_mode != FILP_CLOSED) { /* Check to see if the file is special. */ mode_word = rip->i_mode & I_TYPE; if (mode_word == I_CHAR_SPECIAL || mode_word == I_BLOCK_SPECIAL) { dev = (dev_t) rip->i_zone[0]; if (mode_word == I_BLOCK_SPECIAL) { /* Invalidate cache entries unless special is mounted * or ROOT */ if (!mounted(rip)) { (void) do_sync(); /* purge cache */ invalidate(dev); } } /* Do any special processing on device close. */ dev_close(dev); } } /* If the inode being closed is a pipe, release everyone hanging on it. */ if (rip->i_pipe == I_PIPE) { rw = (rfilp->filp_mode & R_BIT ? WRITE : READ); release(rip, rw, NR_PROCS); } /* If a write has been done, the inode is already marked as DIRTY. */ if (--rfilp->filp_count == 0) { if (rip->i_pipe == I_PIPE && rip->i_count > 1) { /* Save the file position in the i-node in case needed later. * The read and write positions are saved separately. The * last 3 zones in the i-node are not used for (named) pipes. */ if (rfilp->filp_mode == R_BIT) rip->i_zone[V2_NR_DZONES+0] = (zone_t) rfilp->filp_pos; else rip->i_zone[V2_NR_DZONES+1] = (zone_t) rfilp->filp_pos; } put_inode(rip); } fp->fp_cloexec &= ~(1L << fd); /* turn off close-on-exec bit */ fp->fp_filp[fd] = NIL_FILP; /* Check to see if the file is locked. If so, release all locks. */ if (nr_locks == 0) return(OK); lock_count = nr_locks; /* save count of locks */ for (flp = &file_lock[0]; flp < &file_lock[NR_LOCKS]; flp++) { if (flp->lock_type == 0) continue; /* slot not in use */ if (flp->lock_inode == rip && flp->lock_pid == fp->fp_pid) { flp->lock_type = 0; nr_locks--; } } if (nr_locks < lock_count) lock_revive(); /* lock released */ return(OK); } /*===========================================================================* * do_lseek * *===========================================================================*/ PUBLIC int do_lseek() { /* Perform the lseek(ls_fd, offset, whence) system call. */ register struct filp *rfilp; register off_t pos; /* Check to see if the file descriptor is valid. */ if ( (rfilp = get_filp(ls_fd)) == NIL_FILP) return(err_code); /* No lseek on pipes. */ if (rfilp->filp_ino->i_pipe == I_PIPE) return(ESPIPE); /* The value of 'whence' determines the start position to use. */ switch(whence) { case 0: pos = 0; break; case 1: pos = rfilp->filp_pos; break; case 2: pos = rfilp->filp_ino->i_size; break; default: return(EINVAL); } /* Check for overflow. */ if (((long)offset > 0) && ((long)(pos + offset) < (long)pos)) return(EINVAL); if (((long)offset < 0) && ((long)(pos + offset) > (long)pos)) return(EINVAL); pos = pos + offset; if (pos != rfilp->filp_pos) rfilp->filp_ino->i_seek = ISEEK; /* inhibit read ahead */ rfilp->filp_pos = pos; reply_l1 = pos; /* insert the long into the output message */ return(OK); } /* The following names are synonyms for the variables in the input message. */ #define acc_time m.m2_l1 #define addr m.m1_i3 #define buffer m.m1_p1 #define child m.m1_i2 #define co_mode m.m1_i1 #define eff_grp_id m.m1_i3 #define eff_user_id m.m1_i3 #define erki m.m1_p1 #define fd m.m1_i1 #define fd2 m.m1_i2 #define ioflags m.m1_i3 #define group m.m1_i3 #define real_grp_id m.m1_i2 #define ls_fd m.m2_i1 #define mk_mode m.m1_i2 #define mode m.m3_i2 #define c_mode m.m1_i3 #define c_name m.m1_p1 #define name m.m3_p1 #define name1 m.m1_p1 #define name2 m.m1_p2 #define name_length m.m3_i1 #define name1_length m.m1_i1 #define name2_length m.m1_i2 #define nbytes m.m1_i2 #define offset m.m2_l1 #define owner m.m1_i2 #define parent m.m1_i1 #define pathname m.m3_ca1 #define pid m.m1_i3 #define pro m.m1_i1 #define rd_only m.m1_i3 #define real_user_id m.m1_i2 #define request m.m1_i2 #define sig m.m1_i2 #define slot1 m.m1_i1 #define tp m.m2_l1 #define utime_actime m.m2_l1 #define utime_modtime m.m2_l2 #define utime_file m.m2_p1 #define utime_length m.m2_i1 #define whence m.m2_i2 #define svrctl_req m.m2_i1 #define svrctl_argp m.m2_p1 /* The following names are synonyms for the variables in the output message. */ #define reply_type m1.m_type #define reply_l1 m1.m2_l1 #define reply_i1 m1.m1_i1 #define reply_i2 m1.m1_i2 #define reply_t1 m1.m4_l1 #define reply_t2 m1.m4_l2 #define reply_t3 m1.m4_l3 #define reply_t4 m1.m4_l4 #define reply_t5 m1.m4_l5 /* This file contains the procedures that look up path names in the directory * system and determine the inode number that goes with a given path name. * * The entry points into this file are * eat_path: the 'main' routine of the path-to-inode conversion mechanism * last_dir: find the final directory on a given path * advance: parse one component of a path name * search_dir: search a directory for a string and return its inode number */ #include "fs.h" #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "super.h" PUBLIC char dot1[2] = "."; /* used for search_dir to bypass the access */ PUBLIC char dot2[3] = ".."; /* permissions for . and .. */ FORWARD _PROTOTYPE( char *get_name, (char *old_name, char string [NAME_MAX]) ); /*===========================================================================* * eat_path * *===========================================================================*/ PUBLIC struct inode *eat_path(path) char *path; /* the path name to be parsed */ { /* Parse the path 'path' and put its inode in the inode table. If not possible, * return NIL_INODE as function value and an error code in 'err_code'. */ register struct inode *ldip, *rip; char string[NAME_MAX]; /* hold 1 path component name here */ /* First open the path down to the final directory. */ if ( (ldip = last_dir(path, string)) == NIL_INODE) return(NIL_INODE); /* we couldn't open final directory */ /* The path consisting only of "/" is a special case, check for it. */ if (string[0] == '\0') return(ldip); /* Get final component of the path. */ rip = advance(ldip, string); put_inode(ldip); return(rip); } /*===========================================================================* * last_dir * *===========================================================================*/ PUBLIC struct inode *last_dir(path, string) char *path; /* the path name to be parsed */ char string[NAME_MAX]; /* the final component is returned here */ { /* Given a path, 'path', located in the fs address space, parse it as * far as the last directory, fetch the inode for the last directory into * the inode table, and return a pointer to the inode. In * addition, return the final component of the path in 'string'. * If the last directory can't be opened, return NIL_INODE and * the reason for failure in 'err_code'. */ register struct inode *rip; register char *new_name; register struct inode *new_ip; /* Is the path absolute or relative? Initialize 'rip' accordingly. */ rip = (*path == '/' ? fp->fp_rootdir : fp->fp_workdir); /* If dir has been removed or path is empty, return ENOENT. */ if (rip->i_nlinks == 0 || *path == '\0') { err_code = ENOENT; return(NIL_INODE); } dup_inode(rip); /* inode will be returned with put_inode */ /* Scan the path component by component. */ while (TRUE) { /* Extract one component. */ if ( (new_name = get_name(path, string)) == (char*) 0) { put_inode(rip); /* bad path in user space */ return(NIL_INODE); } if (*new_name == '\0') if ( (rip->i_mode & I_TYPE) == I_DIRECTORY) return(rip); /* normal exit */ else { /* last file of path prefix is not a directory */ put_inode(rip); err_code = ENOTDIR; return(NIL_INODE); } /* There is more path. Keep parsing. */ new_ip = advance(rip, string); put_inode(rip); /* rip either obsolete or irrelevant */ if (new_ip == NIL_INODE) return(NIL_INODE); /* The call to advance() succeeded. Fetch next component. */ path = new_name; rip = new_ip; } } /*===========================================================================* * get_name * *===========================================================================*/ PRIVATE char *get_name(old_name, string) char *old_name; /* path name to parse */ char string[NAME_MAX]; /* component extracted from 'old_name' */ { /* Given a pointer to a path name in fs space, 'old_name', copy the next * component to 'string' and pad with zeros. A pointer to that part of * the name as yet unparsed is returned. Roughly speaking, * 'get_name' = 'old_name' - 'string'. * * This routine follows the standard convention that /usr/ast, /usr//ast, * //usr///ast and /usr/ast/ are all equivalent. */ register int c; register char *np, *rnp; np = string; /* 'np' points to current position */ rnp = old_name; /* 'rnp' points to unparsed string */ while ( (c = *rnp) == '/') rnp++; /* skip leading slashes */ /* Copy the unparsed path, 'old_name', to the array, 'string'. */ while ( rnp < &old_name[PATH_MAX] && c != '/' && c != '\0') { if (np < &string[NAME_MAX]) *np++ = c; c = *++rnp; /* advance to next character */ } /* To make /usr/ast/ equivalent to /usr/ast, skip trailing slashes. */ while (c == '/' && rnp < &old_name[PATH_MAX]) c = *++rnp; if (np < &string[NAME_MAX]) *np = '\0'; /* Terminate string */ if (rnp >= &old_name[PATH_MAX]) { err_code = ENAMETOOLONG; return((char *) 0); } return(rnp); } /*===========================================================================* * advance * *===========================================================================*/ PUBLIC struct inode *advance(dirp, string) struct inode *dirp; /* inode for directory to be searched */ char string[NAME_MAX]; /* component name to look for */ { /* Given a directory and a component of a path, look up the component in * the directory, find the inode, open it, and return a pointer to its inode * slot. If it can't be done, return NIL_INODE. */ register struct inode *rip; struct inode *rip2; register struct super_block *sp; int r, inumb; dev_t mnt_dev; ino_t numb; /* If 'string' is empty, yield same inode straight away. */ if (string[0] == '\0') return(get_inode(dirp->i_dev, (int) dirp->i_num)); /* Check for NIL_INODE. */ if (dirp == NIL_INODE) return(NIL_INODE); /* If 'string' is not present in the directory, signal error. */ if ( (r = search_dir(dirp, string, &numb, LOOK_UP)) != OK) { err_code = r; return(NIL_INODE); } /* Don't go beyond the current root directory, unless the string is dot2. */ if (dirp == fp->fp_rootdir && strcmp(string, "..") == 0 && string != dot2) return(get_inode(dirp->i_dev, (int) dirp->i_num)); /* The component has been found in the directory. Get inode. */ if ( (rip = get_inode(dirp->i_dev, (int) numb)) == NIL_INODE) return(NIL_INODE); if (rip->i_num == ROOT_INODE) if (dirp->i_num == ROOT_INODE) { if (string[1] == '.') { for (sp = &super_block[1]; sp < &super_block[NR_SUPERS]; sp++){ if (sp->s_dev == rip->i_dev) { /* Release the root inode. Replace by the * inode mounted on. */ put_inode(rip); mnt_dev = sp->s_imount->i_dev; inumb = (int) sp->s_imount->i_num; rip2 = get_inode(mnt_dev, inumb); rip = advance(rip2, string); put_inode(rip2); break; } } } } if (rip == NIL_INODE) return(NIL_INODE); /* See if the inode is mounted on. If so, switch to root directory of the * mounted file system. The super_block provides the linkage between the * inode mounted on and the root directory of the mounted file system. */ while (rip != NIL_INODE && rip->i_mount == I_MOUNT) { /* The inode is indeed mounted on. */ for (sp = &super_block[0]; sp < &super_block[NR_SUPERS]; sp++) { if (sp->s_imount == rip) { /* Release the inode mounted on. Replace by the * inode of the root inode of the mounted device. */ put_inode(rip); rip = get_inode(sp->s_dev, ROOT_INODE); break; } } } return(rip); /* return pointer to inode's component */ } /*===========================================================================* * search_dir * *===========================================================================*/ PUBLIC int search_dir(ldir_ptr, string, numb, flag) register struct inode *ldir_ptr; /* ptr to inode for dir to search */ char string[NAME_MAX]; /* component to search for */ ino_t *numb; /* pointer to inode number */ int flag; "($(%(&('((( /* LOOK_UP, ENTER, DELETE or IS_EMPTY */ { /* This function searches the directory whose inode is pointed to by 'ldip': * if (flag == ENTER) enter 'string' in the directory with inode # '*numb'; * if (flag == DELETE) delete 'string' from the directory; * if (flag == LOOK_UP) search for 'string' and return inode # in 'numb'; * if (flag == IS_EMPTY) return OK if only . and .. in dir else ENOTEMPTY; * * if 'string' is dot1 or dot2, no access permissions are checked. */ register struct direct *dp; register struct buf *bp; int i, r, e_hit, t, match; mode_t bits; off_t pos; unsigned new_slots, old_slots; block_t b; struct super_block *sp; int extended = 0; /* If 'ldir_ptr' is not a pointer to a dir inode, error. */ if ( (ldir_ptr->i_mode & I_TYPE) != I_DIRECTORY) return(ENOTDIR); r = OK; if (flag != IS_EMPTY) { bits = (flag == LOOK_UP ? X_BIT : W_BIT | X_BIT); if (string == dot1 || string == dot2) { if (flag != LOOK_UP) r = read_only(ldir_ptr); /* only a writable device is required. */ } else r = forbidden(ldir_ptr, bits); /* check access permissions */ } if (r != OK) return(r); /* Step through the directory one block at a time. */ old_slots = (unsigned) (ldir_ptr->i_size/DIR_ENTRY_SIZE); new_slots = 0; e_hit = FALSE; match = 0; /* set when a string match occurs */ for (pos = 0; pos < ldir_ptr->i_size; pos += BLOCK_SIZE) { b = read_map(ldir_ptr, pos); /* get block number */ /* Since directories don't have holes, 'b' cannot be NO_BLOCK. */ bp = get_block(ldir_ptr->i_dev, b, NORMAL); /* get a dir block */ /* Search a directory block. */ for (dp = &bp->b_dir[0]; dp < &bp->b_dir[NR_DIR_ENTRIES]; dp++) { if (++new_slots > old_slots) { /* not found, but room left */ if (flag == ENTER) e_hit = TRUE; break; } /* Match occurs if string found. */ if (flag != ENTER && dp->d_ino != 0) { if (flag == IS_EMPTY) { /* If this test succeeds, dir is not empty. */ if (strcmp(dp->d_name, "." ) != 0 && strcmp(dp->d_name, "..") != 0) match = 1; } else { if (strncmp(dp->d_name, string, NAME_MAX) == 0) match = 1; } } if (match) { /* LOOK_UP or DELETE found what it wanted. */ r = OK; if (flag == IS_EMPTY) r = ENOTEMPTY; else if (flag == DELETE) { /* Save d_ino for recovery. */ t = NAME_MAX - sizeof(ino_t); *((ino_t *) &dp->d_name[t]) = dp->d_ino; dp->d_ino = 0; /* erase entry */ bp->b_dirt = DIRTY; ldir_ptr->i_update |= CTIME | MTIME; ldir_ptr->i_dirt = DIRTY; } else { sp = ldir_ptr->i_sp; /* 'flag' is LOOK_UP */ *numb = conv2(sp->s_native, (int) dp->d_ino); } put_block(bp, DIRECTORY_BLOCK); return(r); } /* Check for free slot for the benefit of ENTER. */ if (flag == ENTER && dp->d_ino == 0) { e_hit = TRUE; /* we found a free slot */ break; } } /* The whole block has been searched or ENTER has a free slot. */ if (e_hit) break; /* e_hit set if ENTER can be performed now */ put_block(bp, DIRECTORY_BLOCK); /* otherwise, continue searching dir */ } /* The whole directory has now been searched. */ if (flag != ENTER) return(flag == IS_EMPTY ? OK : ENOENT); /* This call is for ENTER. If no free slot has been found so far, try to * extend directory. */ if (e_hit == FALSE) { /* directory is full and no room left in last block */ new_slots++; /* increase directory size by 1 entry */ if (new_slots == 0) return(EFBIG); /* dir size limited by slot count */ if ( (bp = new_block(ldir_ptr, ldir_ptr->i_size)) == NIL_BUF) return(err_code); dp = &bp->b_dir[0]; extended = 1; } /* 'bp' now points to a directory block with space. 'dp' points to slot. */ (void) memset(dp->d_name, 0, (size_t) NAME_MAX); /* clear entry */ for (i = 0; string[i] && i < NAME_MAX; i++) dp->d_name[i] = string[i]; sp = ldir_ptr->i_sp; dp->d_ino = conv2(sp->s_native, (int) *numb); bp->b_dirt = DIRTY; put_block(bp, DIRECTORY_BLOCK); ldir_ptr->i_update |= CTIME | MTIME; /* mark mtime for update later */ ldir_ptr->i_dirt = DIRTY; if (new_slots > old_slots) { ldir_ptr->i_size = (off_t) new_slots * DIR_ENTRY_SIZE; /* Send the change to disk if the directory is extended. */ if (extended) rw_inode(ldir_ptr, WRITING); } return(OK); } /* This file deals with the suspension and revival of processes. A process can * be suspended because it wants to read or write from a pipe and can't, or * because it wants to read or write from a special file and can't. When a * process can't continue it is suspended, and revived later when it is able * to continue. * * The entry points into this file are * do_pipe: perform the PIPE system call * pipe_check: check to see that a read or write on a pipe is feasible now * suspend: suspend a process that cannot do a requested read or write * release: check to see if a suspended process can be released and do it * revive: mark a suspended process as able to run again * do_unpause: a signal has been sent to a process; see if it suspended */ #include "fs.h" #include #include #include #include #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" /*===========================================================================* * do_pipe * *===========================================================================*/ PUBLIC int do_pipe() { /* Perform the pipe(fil_des) system call. */ register struct fproc *rfp; register struct inode *rip; int r; struct filp *fil_ptr0, *fil_ptr1; int fil_des[2]; /* reply goes here */ /* Acquire two file descriptors. */ rfp = fp; if ( (r = get_fd(0, R_BIT, &fil_des[0], &fil_ptr0)) != OK) return(r); rfp->fp_filp[fil_des[0]] = fil_ptr0; fil_ptr0->filp_count = 1; if ( (r = get_fd(0, W_BIT, &fil_des[1], &fil_ptr1)) != OK) { rfp->fp_filp[fil_des[0]] = NIL_FILP; fil_ptr0->filp_count = 0; return(r); } rfp->fp_filp[fil_des[1]] = fil_ptr1; fil_ptr1->filp_count = 1; /* Make the inode on the pipe device. */ if ( (rip = alloc_inode(root_dev, I_REGULAR) ) == NIL_INODE) { rfp->fp_filp[fil_des[0]] = NIL_FILP; fil_ptr0->filp_count = 0; rfp->fp_filp[fil_des[1]] = NIL_FILP; fil_ptr1->filp_count = 0; return(err_code); } if (read_only(rip) != OK) panic("pipe device is read only", NO_NUM); rip->i_pipe = I_PIPE; rip->i_mode &= ~I_REGULAR; rip->i_mode |= I_NAMED_PIPE; /* pipes and FIFOs have this bit set */ fil_ptr0->filp_ino = rip; fil_ptr0->filp_flags = O_RDONLY; dup_inode(rip); /* for double usage */ fil_ptr1->filp_ino = rip; fil_ptr1->filp_flags = O_WRONLY; rw_inode(rip, WRITING); /* mark inode as allocated */ reply_i1 = fil_des[0]; reply_i2 = fil_des[1]; rip->i_update = ATIME | CTIME | MTIME; return(OK); } /*===========================================================================* * pipe_check * *===========================================================================*/ PUBLIC int pipe_check(rip, rw_flag, oflags, bytes, position, canwrite) register struct inode *rip; /* the inode of the pipe */ int rw_flag; /* READING or WRITING */ int oflags; /* flags set by open or fcntl */ register int bytes; /* bytes to be read or written (all chunks) */ register off_t position; /* current file position */ int *canwrite; /* return: number of bytes we can write */ { /* Pipes are a little different. If a process reads from an empty pipe for * which a writer still exists, suspend the reader. If the pipe is empty * and there is no writer, return 0 bytes. If a process is writing to a * pipe and no one is reading from it, give a broken pipe error. */ int r = 0; /* If reading, check for empty pipe. */ if (rw_flag == READING) { if (position >= rip->i_size) { /* Process is reading from an empty pipe. */ if (find_filp(rip, W_BIT) != NIL_FILP) { /* Writer exists */ if (oflags & O_NONBLOCK) r = EAGAIN; else suspend(XPIPE); /* block reader */ /* If need be, activate sleeping writers. */ if (susp_count > 0) release(rip, WRITE, susp_count); } return(r); } } else { /* Process is writing to a pipe. */ /* if (bytes > PIPE_SIZE) return(EFBIG); */ if (find_filp(rip, R_BIT) == NIL_FILP) { /* Tell kernel to generate a SIGPIPE signal. */ sys_kill((int)(fp - fproc), SIGPIPE); return(EPIPE); } if (position + bytes > PIPE_SIZE) { if ((oflags & O_NONBLOCK) && bytes < PIPE_SIZE) return(EAGAIN); else if ((oflags & O_NONBLOCK) && bytes > PIPE_SIZE) { if ( (*canwrite = (PIPE_SIZE - position)) > 0) { /* Do a partial write. Need to wakeup reader */ release(rip, READ, susp_count); return(1); } else { return(EAGAIN); } } if (bytes > PIPE_SIZE) { if ((*canwrite = PIPE_SIZE - position) > 0) { /* Do a partial write. Need to wakeup reader * since we'll suspend ourself in read_write() */ release(rip, READ, susp_count); return(1); } } suspend(XPIPE); /* stop writer -- pipe full */ return(0); } /* Writing to an empty pipe. Search for suspended reader. */ if (position == 0) release(rip, READ, susp_count); } *canwrite = 0; return(1); } /*===========================================================================* * suspend * *===========================================================================*/ PUBLIC void suspend(task) int task; /* who is proc waiting for? (PIPE = pipe) */ { /* Take measures to suspend the processing of the present system call. * Store the parameters to be used upon resuming in the process table. * (Actually they are not used when a process is waiting for an I/O device, * but they are needed for pipes, and it is not worth making the distinction.) */ if (task == XPIPE || task == XPOPEN) susp_count++;/* #procs susp'ed on pipe*/ fp->fp_suspended = SUSPENDED; fp->fp_fd = fd << 8 | fs_call; fp->fp_task = -task; if (task == XLOCK) { fp->fp_buffer = (char *) name1; /* third arg to fcntl() */ fp->fp_nbytes =request; /* second arg to fcntl() */ } else { fp->fp_buffer = buffer; /* for reads and writes */ fp->fp_nbytes = nbytes; } dont_reply = TRUE; /* do not send caller a reply message now */ } /*===========================================================================* * release * *===========================================================================*/ PUBLIC void release(ip, call_nr, count) register struct inode *ip; /* inode of pipe */ int call_nr; /* READ, WRITE, OPEN or CREAT */ int count; /* max number of processes to release */ { /* Check to see if any process is hanging on the pipe whose inode is in 'ip'. * If one is, and it was trying to perform the call indicated by 'call_nr', * release it. */ register struct fproc *rp; /* Search the proc table. */ for (rp = &fproc[0]; rp < &fproc[NR_PROCS]; rp++) { if (rp->fp_suspended == SUSPENDED && rp->fp_revived == NOT_REVIVING && (rp->fp_fd & BYTE) == call_nr && rp->fp_filp[rp->fp_fd>>8]->filp_ino == ip) { revive((int)(rp - fproc), 0); susp_count--; /* keep track of who is suspended */ if (--count == 0) return; } } } /*===========================================================================* * revive * *===========================================================================*/ PUBLIC void revive(proc_nr, bytes) int proc_nr; /* process to revive */ int bytes; /* if hanging on task, how many bytes read */ { /* Revive a previously blocked process. When a process hangs on tty, this * is the way it is eventually released. */ register struct fproc *rfp; register int task; if (proc_nr < 0 || proc_nr >= NR_PROCS) panic("revive err", proc_nr); rfp = &fproc[proc_nr]; if (rfp->fp_suspended == NOT_SUSPENDED || rfp->fp_revived == REVIVING)return; /* The 'reviving' flag only applies to pipes. Processes waiting for TTY get * a message right away. The revival process is different for TTY and pipes. * For TTY revival, the work is already done, for pipes it is not: the proc * must be restarted so it can try again. */ task = -rfp->fp_task; if (task == XPIPE || task == XLOCK) { /* Revive a process suspended on a pipe or lock. */ rfp->fp_revived = REVIVING; reviving++; /* process was waiting on pipe or lock */ } else { rfp->fp_suspended = NOT_SUSPENDED; if (task == XPOPEN) /* proc0(2(3(ess blocked in open or create */ reply(proc_nr, rfp->fp_fd>>8); else { /* Revive a process suspended on TTY or other device. */ rfp->fp_nbytes = bytes; /*pretend it wants only what there is*/ reply(proc_nr, bytes); /* unblock the process */ } } } /*===========================================================================* * do_unpause * *===========================================================================*/ PUBLIC int do_unpause() { /* A signal has been sent to a user who is paused on the file system. * Abort the system call with the EINTR error message. */ register struct fproc *rfp; int proc_nr, task, fild; struct filp *f; dev_t dev; message mess; if (who > MM_PROC_NR) return(EPERM); proc_nr = pro; if (proc_nr < 0 || proc_nr >= NR_PROCS) panic("unpause err 1", proc_nr); rfp = &fproc[proc_nr]; if (rfp->fp_suspended == NOT_SUSPENDED) return(OK); task = -rfp->fp_task; switch (task) { case XPIPE: /* process trying to read or write a pipe */ break; case XLOCK: /* process trying to set a lock with FCNTL */ break; case XPOPEN: /* process trying to open a fifo */ break; default: /* process trying to do device I/O (e.g. tty)*/ fild = (rfp->fp_fd >> 8) & BYTE;/* extract file descriptor */ if (fild < 0 || fild >= OPEN_MAX)panic("unpause err 2",NO_NUM); f = rfp->fp_filp[fild]; dev = (dev_t) f->filp_ino->i_zone[0]; /* device hung on */ mess.TTY_LINE = (dev >> MINOR) & BYTE; mess.PROC_NR = proc_nr; /* Tell kernel R or W. Mode is from current call, not open. */ mess.COUNT = (rfp->fp_fd & BYTE) == READ ? R_BIT : W_BIT; mess.m_type = CANCEL; fp = rfp; /* hack - ctty_io uses fp */ (*dmap[(dev >> MAJOR) & BYTE].dmap_io)(task, &mess); } rfp->fp_suspended = NOT_SUSPENDED; reply(proc_nr, EINTR); /* signal interrupted call */ return(OK); } /* This file deals with protection in the file system. It contains the code * for four system calls that relate to protection. * * The entry points into this file are * do_chmod: perform the CHMOD system call * do_chown: perform the CHOWN system call * do_umask: perform the UMASK system call * do_access: perform the ACCESS system call * forbidden: check to see if a given access is allowed on a given inode */ #include "fs.h" #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" #include "super.h" /*===========================================================================* * do_chmod * *===========================================================================*/ PUBLIC int do_chmod() { /* Perform the chmod(name, mode) system call. */ register struct inode *rip; register int r; /* Temporarily open the file. */ if (fetch_name(name, name_length, M3) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* Only the owner or the super_user may change the mode of a file. * No one may change the mode of a file on a read-only file system. */ if (rip->i_uid != fp->fp_effuid && !super_user) r = EPERM; else r = read_only(rip); /* If error, return inode. */ if (r != OK) { put_inode(rip); return(r); } /* Now make the change. Clear setgid bit if file is not in caller's grp */ rip->i_mode = (rip->i_mode & ~ALL_MODES) | (mode & ALL_MODES); if (!super_user && rip->i_gid != fp->fp_effgid)rip->i_mode &= ~I_SET_GID_BIT; rip->i_update |= CTIME; rip->i_dirt = DIRTY; put_inode(rip); return(OK); } /*===========================================================================* * do_chown * *===========================================================================*/ PUBLIC int do_chown() { /* Perform the chown(name, owner, group) system call. */ register struct inode *rip; register int r; /* Temporarily open the file. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* Not permitted to change the owner of a file on a read-only file sys. */ r = read_only(rip); if (r == OK) { /* FS is R/W. Whether call is allowed depends on ownership, etc. */ if (super_user) { /* The super user can do anything. */ rip->i_uid = owner; /* others later */ } else { /* Regular users can only change groups of their own files. */ if (rip->i_uid != fp->fp_effuid) r = EPERM; if (rip->i_uid != owner) r = EPERM; /* no giving away */ if (fp->fp_effgid != group) r = EPERM; } } if (r == OK) { rip->i_gid = group; rip->i_mode &= ~(I_SET_UID_BIT | I_SET_GID_BIT); rip->i_update |= CTIME; rip->i_dirt = DIRTY; } put_inode(rip); return(r); } /*===========================================================================* * do_umask * *===========================================================================*/ PUBLIC int do_umask() { /* Perform the umask(co_mode) system call. */ register mode_t r; r = ~fp->fp_umask; /* set 'r' to complement of old mask */ fp->fp_umask = ~(co_mode & RWX_MODES); return(r); /* return complement of old mask */ } /*===========================================================================* * do_access * *===========================================================================*/ PUBLIC int do_access() { /* Perform the access(name, mode) system call. */ struct inode *rip; register int r; /* First check to see if the mode is correct. */ if ( (mode & ~(R_OK | W_OK | X_OK)) != 0 && mode != F_OK) return(EINVAL); /* Temporarily open the file whose access is to be checked. */ if (fetch_name(name, name_length, M3) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* Now check the permissions. */ r = forbidden(rip, (mode_t) mode); put_inode(rip); return(r); } /*===========================================================================* * forbidden * *===========================================================================*/ PUBLIC int forbidden(rip, access_desired) register struct inode *rip; /* pointer to inode to be checked */ mode_t access_desired; /* RWX bits */ { /* Given a pointer to an inode, 'rip', and the access desired, determine * if the access is allowed, and if not why not. The routine looks up the * caller's uid in the 'fproc' table. If access is allowed, OK is returned * if it is forbidden, EACCES is returned. */ register struct inode *old_rip = rip; register struct super_block *sp; register mode_t bits, perm_bits; int r, shift, test_uid, test_gid; if (rip->i_mount == I_MOUNT) /* The inode is mounted on. */ for (sp = &super_block[1]; sp < &super_block[NR_SUPERS]; sp++) if (sp->s_imount == rip) { rip = get_inode(sp->s_dev, ROOT_INODE); break; } /* if */ /* Isolate the relevant rwx bits from the mode. */ bits = rip->i_mode; test_uid = (fs_call == ACCESS ? fp->fp_realuid : fp->fp_effuid); test_gid = (fs_call == ACCESS ? fp->fp_realgid : fp->fp_effgid); if (test_uid == SU_UID) { /* Grant read and write permission. Grant search permission for * directories. Grant execute permission (for non-directories) if * and only if one of the 'X' bits is set. */ if ( (bits & I_TYPE) == I_DIRECTORY || bits & ((X_BIT << 6) | (X_BIT << 3) | X_BIT)) perm_bits = R_BIT | W_BIT | X_BIT; else perm_bits = R_BIT | W_BIT; } else { if (test_uid == rip->i_uid) shift = 6; /* owner */ else if (test_gid == rip->i_gid ) shift = 3; /* group */ else shift = 0; /* other */ perm_bits = (bits >> shift) & (R_BIT | W_BIT | X_BIT); } /* If access desired is not a subset of what is allowed, it is refused. */ r = OK; if ((perm_bits | access_desired) != perm_bits) r = EACCES; /* Check to see if someone is trying to write on a file system that is * mounted read-only. */ if (r == OK) if (access_desired & W_BIT) r = read_only(rip); if (rip != old_rip) put_inode(rip); return(r); } /*===========================================================================* * read_only * *===========================================================================*/ PUBLIC int read_only(ip) struct inode *ip; /* ptr to inode whose file sys is to be cked */ { /* Check to see if the file system on which the inode 'ip' resides is mounted * read only. If so, return EROFS, else return OK. */ register struct super_block *sp; sp = ip->i_sp; return(sp->s_rd_only ? EROFS : OK); } /* Function prototypes. */ /* Structs used in prototypes must be declared as such first. */ struct buf; struct filp; struct inode; struct super_block; /* cache.c */ _PROTOTYPE( zone_t alloc_zone, (Dev_t dev, zone_t z) ); _PROTOTYPE( void flushall, (Dev_t dev) ); _PROTOTYPE( void free_zone, (Dev_t dev, zone_t numb) ); _PROTOTYPE( struct buf *get_block, (Dev_t dev, block_t block,int only_search)); _PROTOTYPE( void invalidate, (Dev_t device) ); _PROTOTYPE( void put_block, (struct buf *bp, int block_type) ); _PROTOTYPE( void rw_block, (struct buf *bp, int rw_flag) ); _PROTOTYPE( void rw_scattered, (Dev_t dev, struct buf **bufq, int bufqsize, int rw_flag) ); #if ENABLE_CACHE2 /* cache2.c */ _PROTOTYPE( void init_cache2, (unsigned long size) ); _PROTOTYPE( int get_block2, (struct buf *bp, int only_search) ); _PROTOTYPE( void put_block2, (struct buf *bp) ); _PROTOTYPE( void invalidate2, (Dev_t device) ); #endif /* device.c */ _PROTOTYPE( int dev_open, (Dev_t dev, int proc, int flags) ); _PROTOTYPE( void dev_close, (Dev_t dev) ); _PROTOTYPE( int dev_io, (int op, Dev_t dev, int proc, void *buf, off_t pos, int bytes, int flags) ); _PROTOTYPE( int gen_opcl, (int op, Dev_t dev, int proc, int flags) ); _PROTOTYPE( void gen_io, (int task_nr, message *mess_ptr) ); _PROTOTYPE( int no_dev, (int op, Dev_t dev, int proc, int flags) ); _PROTOTYPE( int tty_opcl, (int op, Dev_t dev, int proc, int flags) ); _PROTOTYPE( int ctty_opcl, (int op, Dev_t dev, int proc, int flags) ); _PROTOTYPE( int clone_opcl, (int op, Dev_t dev, int proc, int flags) ); _PROTOTYPE( void ctty_io, (int task_nr, message *mess_ptr) ); _PROTOTYPE( int do_ioctl, (void) ); _PROTOTYPE( int do_setsid, (void) ); /* filedes.c */ _PROTOTYPE( struct filp *find_filp, (struct inode *rip, Mode_t bits) ); _PROTOTYPE( int get_fd, (int start, Mode_t bits, int *k, struct filp **fpt) ); _PROTOTYPE( struct filp *get_filp, (int fild) ); /* inode.c */ _PROTOTYPE( struct inode *alloc_inode, (Dev_t dev, Mode_t bits) ); _PROTOTYPE( void dup_inode, (struct inode *ip) ); _PROTOTYPE( void free_inode, (Dev_t dev, Ino_t numb) ); _PROTOTYPE( struct inode *get_inode, (Dev_t dev, int numb) ); _PROTOTYPE( void put_inode, (struct inode *rip) ); _PROTOTYPE( void update_times, (struct inode *rip) ); _PROTOTYPE( void rw_inode, (struct inode *rip, int rw_flag) ); _PROTOTYPE( void wipe_inode, (struct inode *rip) ); /* link.c */ _PROTOTYPE( int do_link, (void) ); _PROTOTYPE( int do_unlink, (void) ); _PROTOTYPE( int do_rename, (void) ); _PROTOTYPE( void truncate, (struct inode *rip) ); /* lock.c */ _PROTOTYPE( int lock_op, (struct filp *f, int req) ); _PROTOTYPE( void lock_revive, (void) ); /* main.c */ _PROTOTYPE( void main, (void) ); _PROTOTYPE( void reply, (int whom, int result) ); /* misc.c */ _PROTOTYPE( int do_dup, (void) ); _PROTOTYPE( int do_exit, (void) ); _PROTOTYPE( int do_fcntl, (void) ); _PROTOTYPE( int do_fork, (void) ); _PROTOTYPE( int do_exec, (void) ); _PROTOTYPE( int do_revive, (void) ); _PROTOTYPE( int do_set, (void) ); _PROTOTYPE( int do_sync, (void) ); _PROTOTYPE( int do_svrctl, (void) ); /* mount.c */ _PROTOTYPE( int do_mount, (void) ); _PROTOTYPE( int do_umount, (void) ); /* open.c */ _PROTOTYPE( int do_close, (void) ); _PROTOTYPE( int do_creat, (void) ); _PROTOTYPE( int do_lseek, (void) ); _PROTOTYPE( int do_mknod, (void) ); _PROTOTYPE( int do_mkdir, (void) ); _PROTOTYPE( int do_open, (void) ); /* path.c */ _PROTOTYPE( struct inode *advance,(struct inode *dirp, char string[NAME_MAX])); _PROTOTYPE( int search_dir, (struct inode *ldir_ptr, char string [NAME_MAX], ino_t *numb, int flag) ); _PROTOTYPE( struct inode *eat_path, (char *path) ); _PROTOTYPE( struct inode *last_dir, (char *path, char string [NAME_MAX])); /* pipe.c */ _PROTOTYPE( int do_pipe, (void) ); _PROTOTYPE( int do_unpause, (void) ); _PROTOTYPE( int pipe_check, (struct inode *rip, int rw_flag, int oflags, int bytes, off_t position, int *canwrite)); _PROTOTYPE( void release, (struct inode *ip, int call_nr, int count) ); _PROTOTYPE( void revive, (int proc_nr, int bytes) ); _PROTOTYPE( void suspend, (int task) ); /* protect.c */ _PROTOTYPE( int do_access, (void) ); _PROTOTYPE( int do_chmod, (void) ); _PROTOTYPE( int do_chown, (void) ); _PROTOTYPE( int do_umask, (void) ); _PROTOTYPE( int forbidden, (struct inode *rip, Mode_t access_desired) ); _PROTOTYPE( int read_only, (struct inode *ip) ); /* read.c */ _PROTOTYPE( int do_read, (void) ); _PROTOTYPE( struct buf *rahead, (struct inode *rip, block_t baseblock, off_t position, unsigned bytes_ahead) ); _PROTOTYPE( void read_ahead, (void) ); _PROTOTYPE( block_t read_map, (struct inode *rip, off_t position) ); _PROTOTYPE( int read_write, (int rw_flag) ); _PROTOTYPE( zone_t rd_indir, (struct buf *bp, int index) ); /* stadir.c */ _PROTOTYPE( int do_chdir, (void) ); _PROTOTYPE( int do_chroot, (void) ); _PROTOTYPE( int do_fstat, (void) ); _PROTOTYPE( int do_stat, (void) ); /* super.c */ _PROTOTYPE( bit_t alloc_bit, (struct super_block *sp, int map, bit_t origin)); _PROTOTYPE( void free_bit, (struct super_block *sp, int map, bit_t bit_returned) ); _PROTOTYPE( struct super_block *get_super, (Dev_t dev) ); _PROTOTYPE( int mounted, (struct inode *rip) ); _PROTOTYPE( int read_super, (struct super_block *sp) ); /* time.c */ _PROTOTYPE( int do_stime, (void) ); _PROTOTYPE( int do_time, (void) ); _PROTOTYPE( int do_tims, (void) ); _PROTOTYPE( int do_utime, (void) ); /* utility.c */ _PROTOTYPE( time_t clock_time, (void) ); _PROTOTYPE( unsigned conv2, (int norm, int w) ); _PROTOTYPE( long conv4, (int norm, long x) ); _PROTOTYPE( int fetch_name, (char *path, int len, int flag) ); _PROTOTYPE( int no_sys, (void) ); _PROTOTYPE( void panic, (char *format, int num) ); /* write.c */ _PROTOTYPE( void clear_zone, (struct inode *rip, off_t pos, int flag) ); _PROTOTYPE( int do_write, (void) ); _PROTOTYPE( struct buf *new_block, (struct inode *rip, off_t position) ); _PROTOTYPE( void zero_block, (struct buf *bp) ); /* FS must occasionally print some message. It uses a special version of * the standard library routine printf() that calls putk() to print characters. * Printing is done by calling the TTY task directly, not going through FS. */ #include "fs.h" #include /*===========================================================================* * putk * *===========================================================================*/ PUBLIC void putk(c) int c; { /* Accumulate another character. If 0 or buffer full, print it. */ static size_t buf_count; /* # characters in the buffer */ static char print_buf[80]; /* output is buffered here */ if ((c == 0 && buf_count > 0) || buf_count == sizeof(print_buf)) { /* Flush the print buffer by writing it to /dev/tty00. */ (void) dev_io(DEV_WRITE, (4 << MAJOR), FS_PROC_NR, print_buf, 0L, buf_count, 0); buf_count = 0; } if (c == '\n') putk('\r'); if (c != 0) print_buf[buf_count++] = c; } /* This file contains the heart of the mechanism used to read (and write) * files. Read and write requests are split up into chunks that do not cross * block boundaries. Each chunk is then processed in turn. Reads on special * files are also detected and handled. * * The entry points into this file are * do_read: perform the READ system call by calling read_write * read_write: actually do the work of READ and WRITE * read_map: given an inode and file position, look up its zone number * rd_indir: read an entry in an indirect block * read_ahead: manage the block read ahead business */ #include "fs.h" #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" #include "super.h" PRIVATE message umess; /* message for asking SYSTASK for user copy */ FORWARD _PROTOTYPE( int rw_chunk, (struct inode *rip, off_t position, unsigned off, int chunk, unsigned left, int rw_flag, char *buff, int seg, int usr) ); /*===========================================================================* * do_read * *===========================================================================*/ PUBLIC int do_read() { return(read_write(READING)); } /*===========================================================================* * read_write * *===========================================================================*/ PUBLIC int read_write(rw_flag) int rw_flag; /* READING or WRITING */ { /* Perform read(fd, buffer, nbytes) or write(fd, buffer, nbytes) call. */ register struct inode *rip; register struct filp *f; off_t bytes_left, f_size, position; unsigned int off, cum_io; int op, oflags, r, chunk, usr, seg, block_spec, char_spec; int regular, partial_pipe = 0, partial_cnt = 0; dev_t dev; mode_t mode_word; struct filp *wf; /* MM loads segments by putting funny things in upper 10 bits of 'fd'. */ if (who == MM_PROC_NR && (fd & (~BYTE)) ) { usr = fd >> 7; seg = (fd >> 5) & 03; fd &= 037; /* get rid of user and segment bits */ } else { usr = who; /* normal case */ seg = D; } /* If the file descriptor is valid, get the inode, size and mode. */ if (nbytes < 0) return(EINVAL); if ((f = get_filp(fd)) == NIL_FILP) return(err_code); if (((f->filp_mode) & (rw_flag == READING ? R_BIT : W_BIT)) == 0) { return(f->filp_mode == FILP_CLOSED ? EIO : EBADF); } if (nbytes == 0) return(0); /* so char special files need not check for 0*/ position = f->filp_pos; oflags = f->filp_flags; rip = f->filp_ino; f_size = rip->i_size; r = OK; if (rip->i_pipe == I_PIPE) { /* fp->fp_cum_io_partial is only nonzero when doing partial writes */ cum_io = fp->fp_cum_io_partial; } else { cum_io = 0; } op = (rw_flag == READING ? DEV_READ : DEV_WRITE); mode_word = rip->i_mode & I_TYPE; regular = mode_word == I_REGULAR || mode_word == I_NAMED_PIPE; char_spec = (mode_word == I_CHAR_SPECIAL ? 1 : 0); block_spec = (mode_word == I_BLOCK_SPECIAL ? 1 : 0); if (block_spec) f_size = LONG_MAX; rdwt_err = OK; /* set to EIO if disk error occurs */ /* Check for character special files. */ if (char_spec) { dev = (dev_t) rip->i_zone[0]; r = dev_io(op, dev, usr, buffer, position, nbytes, oflags); if (r >= 0) { cum_io = r; position += r; r = OK; } } else { if (rw_flag == WRITING && block_spec == 0) { /* Check in advance to see if file will grow too big. */ if (position > rip->i_sp->s_max_size - nbytes) return(EFBIG); /* Check for O_APPEND flag. */ if (oflags & O_APPEND) position = f_size; /* Clear the zone containing present EOF if hole about * to be created. This is necessary because all unwritten * blocks prior to the EOF must read as zeros. */ if (position > f_size) clear_zone(rip, f_size, 0); } /* Pipes are a little different. Check. */ if (rip->i_pipe == I_PIPE) { r = pipe_check(rip,rw_flag,oflags,nbytes,position,&partial_cnt); if (r <= 0) return(r); } if (partial_cnt > 0) partial_pipe = 1; /* Split the transfer into chunks that don't span two blocks. */ while (nbytes != 0) { off = (unsigned int) (position % BLOCK_SIZE);/* offset in blk*/ if (partial_pipe) { /* pipes only */ chunk = MIN(partial_cnt, BLOCK_SIZE - off); } else chunk = MIN(nbytes, BLOCK_SIZE - off); if (chunk < 0) chunk = BLOCK_SIZE - off; if (rw_flag == READING) { bytes_left = f_size - position; if (position >= f_size) break; /* we are beyond EOF */ if (chunk > bytes_left) chunk = (int) bytes_left; } /* Read or write 'chunk' bytes. */ r = rw_chunk(rip, position, off, chunk, (unsigned) nbytes, rw_flag, buffer, seg, usr); if (r != OK) break; /* EOF reached */ if (rdwt_err < 0) break; /* Update counters and pointers. */ buffer += chunk; /* user buffer address */ nbytes -= chunk; /* bytes yet to be read */ cum_io += chunk; /* bytes read so far */ position += chunk; /* position within the file */ if (partial_pipe) { partial_cnt -= chunk; if (partial_cnt <= 0) break; } } } /* On write, update file size and access time. */ if (rw_flag == WRITING) { if (regular || mode_word == I_DIRECTORY) { if (position > f_size) rip->i_size = position; } } else { if (rip->i_pipe == I_PIPE && position >= rip->i_size) { /* Reset pipe pointers. */ rip->i_size = 0; /* no data left */ position = 0; /* reset reader(s) */ if ( (wf = find_filp(rip, W_BIT)) != NIL_FILP) wf->filp_pos =0; } } f->filp_pos = position; /* Check to see if read-ahead is called for, and if so, set it up. */ if (rw_flag == READING && rip->i_seek == NO_SEEK && position % BLOCK_SIZE== 0 && (regular || mode_word == I_DIRECTORY)) { rdahed_inode = rip; rdahedpos = position; } rip->i_seek = NO_SEEK; if (rdwt_err != OK) r = rdwt_err; /* check for disk error */ if (rdwt_err == END_OF_FILE) r = OK; if (r == OK) { if (rw_flag == READING) rip->i_update |= ATIME; if (rw_flag == WRITING) rip->i_update |= CTIME | MTIME; rip->i_dirt = DIRTY; /* inode is thus now dirty */ if (partial_pipe) { partial_pipe = 0; /* partial write on pipe with */ /* O_NONBLOCK, return write count */ if (!(oflags & O_NONBLOCK)) { fp->fp_cum_io_partial = cum_io; suspend(XPIPE); /* partial write on pipe with */ return(0); /* nbyte > PIPE_SIZE - non-atomic */ } } fp->fp_cum_io_partial = 0; return(cum_io); } else { return(r); } } /*===========================================================================* * rw_chunk * *===========================================================================*/ PRIVATE int rw_chunk(rip, position, off, chunk, left, rw_flag, buff, seg, usr) register struct inode *rip; /* pointer to inode for file to be rd/wr */ off_t position; /* position within file to read or write */ unsigned off; /* off within the current block */ int chunk; /* number of bytes to read or write */ unsigned left; /* max number of bytes wanted after position */ int rw_flag; /* READING or WRITING */ char *buff; /* virtual address of the user buffer */ int seg; /* T or D segment in user space */ int usr; /* which user process */ { /* Read or write (part of) a block. */ register struct buf *bp; register int r; int n, block_spec; block_t b; dev_t dev; block_spec = (rip->i_mode & I_TYPE) == I_BLOCK_SPECIAL; if (block_spec) { b = position/BLOCK_SIZE; dev = (dev_t) rip->i_zone[0]; } else { b = read_map(rip, position); dev = rip->i_dev; } if (!block_spec && b == NO_BLOCK) { if (rw_flag == READING) { /* Reading from a nonexistent block. Must read as all zeros.*/ bp = get_block(NO_DEV, NO_BLOCK, NORMAL); /* get a buffer */ zero_block(bp); } else { /* Writing to a nonexistent block. Create and enter in inode.*/ if ((bp= new_block(rip, position)) == NIL_BUF)return(err_code); } } else if (rw_flag == READING) { /* Read and read ahead if convenient. */ bp = rahead(rip, b, position, left); } else { /* Normally an existing block to be partially overwritten is first read * in. However, a full block need not be read in. If it is already in J(L(M(N(O(P(Q(R(S(T( * the cache, acquire it, otherwise just acquire a free buffer. */ n = (chunk == BLOCK_SIZE ? NO_READ : NORMAL); if (!block_spec && off == 0 && position >= rip->i_size) n = NO_READ; bp = get_block(dev, b, n); } /* In all cases, bp now points to a valid buffer. */ if (rw_flag == WRITING && chunk != BLOCK_SIZE && !block_spec && position >= rip->i_size && off == 0) { zero_block(bp); } if (rw_flag == READING) { /* Copy a chunk from the block buffer to user space. */ r = sys_copy(FS_PROC_NR, D, (phys_bytes) (bp->b_data+off), usr, seg, (phys_bytes) buff, (phys_bytes) chunk); } else { /* Copy a chunk from user space to the block buffer. */ r = sys_copy(usr, seg, (phys_bytes) buff, FS_PROC_NR, D, (phys_bytes) (bp->b_data+off), (phys_bytes) chunk); bp->b_dirt = DIRTY; } n = (off + chunk == BLOCK_SIZE ? FULL_DATA_BLOCK : PARTIAL_DATA_BLOCK); put_block(bp, n); return(r); } /*===========================================================================* * read_map * *===========================================================================*/ PUBLIC block_t read_map(rip, position) register struct inode *rip; /* ptr to inode to map from */ off_t position; /* position in file whose blk wanted */ { /* Given an inode and a position within the corresponding file, locate the * block (not zone) number in which that position is to be found and return it. */ register struct buf *bp; register zone_t z; int scale, boff, dzones, nr_indirects, index, zind, ex; block_t b; long excess, zone, block_pos; scale = rip->i_sp->s_log_zone_size; /* for block-zone conversion */ block_pos = position/BLOCK_SIZE; /* relative blk # in file */ zone = block_pos >> scale; /* position's zone */ boff = (int) (block_pos - (zone << scale) ); /* relative blk # within zone */ dzones = rip->i_ndzones; nr_indirects = rip->i_nindirs; /* Is 'position' to be found in the inode itself? */ if (zone < dzones) { zind = (int) zone; /* index should be an int */ z = rip->i_zone[zind]; if (z == NO_ZONE) return(NO_BLOCK); b = ((block_t) z << scale) + boff; return(b); } /* It is not in the inode, so it must be single or double indirect. */ excess = zone - dzones; /* first Vx_NR_DZONES don't count */ if (excess < nr_indirects) { /* 'position' can be located via the single indirect block. */ z = rip->i_zone[dzones]; } else { /* 'position' can be located via the double indirect block. */ if ( (z = rip->i_zone[dzones+1]) == NO_ZONE) return(NO_BLOCK); excess -= nr_indirects; /* single indir doesn't count*/ b = (block_t) z << scale; bp = get_block(rip->i_dev, b, NORMAL); /* get double indirect block */ index = (int) (excess/nr_indirects); z = rd_indir(bp, index); /* z= zone for single*/ put_block(bp, INDIRECT_BLOCK); /* release double ind block */ excess = excess % nr_indirects; /* index into single ind blk */ } /* 'z' is zone num for single indirect block; 'excess' is index into it. */ if (z == NO_ZONE) return(NO_BLOCK); b = (block_t) z << scale; /* b is blk # for single ind */ bp = get_block(rip->i_dev, b, NORMAL); /* get single indirect block */ ex = (int) excess; /* need an integer */ z = rd_indir(bp, ex); /* get block pointed to */ put_block(bp, INDIRECT_BLOCK); /* release single indir blk */ if (z == NO_ZONE) return(NO_BLOCK); b = ((block_t) z << scale) + boff; return(b); } /*===========================================================================* * rd_indir * *===========================================================================*/ PUBLIC zone_t rd_indir(bp, index) struct buf *bp; /* pointer to indirect block */ int index; /* index into *bp */ { /* Given a pointer to an indirect block, read one entry. The reason for * making a separate routine out of this is that there are four cases: * V1 (IBM and 68000), and V2 (IBM and 68000). */ struct super_block *sp; zone_t zone; /* V2 zones are longs (shorts in V1) */ sp = get_super(bp->b_dev); /* need super block to find file sys type */ /* read a zone from an indirect block */ if (sp->s_version == V1) zone = (zone_t) conv2(sp->s_native, (int) bp->b_v1_ind[index]); else zone = (zone_t) conv4(sp->s_native, (long) bp->b_v2_ind[index]); if (zone != NO_ZONE && (zone < (zone_t) sp->s_firstdatazone || zone >= sp->s_zones)) { printf("Illegal zone number %ld in indirect block, index %d\n", (long) zone, index); panic("check file system", NO_NUM); } return(zone); } /*===========================================================================* * read_ahead * *===========================================================================*/ PUBLIC void read_ahead() { /* Read a block into the cache before it is needed. */ register struct inode *rip; struct buf *bp; block_t b; rip = rdahed_inode; /* pointer to inode to read ahead from */ rdahed_inode = NIL_INODE; /* turn off read ahead */ if ( (b = read_map(rip, rdahedpos)) == NO_BLOCK) return; /* at EOF */ bp = rahead(rip, b, rdahedpos, BLOCK_SIZE); put_block(bp, PARTIAL_DATA_BLOCK); } /*===========================================================================* * rahead * *===========================================================================*/ PUBLIC struct buf *rahead(rip, baseblock, position, bytes_ahead) register struct inode *rip; /* pointer to inode for file to be read */ block_t baseblock; /* block at current position */ off_t position; /* position within file */ unsigned bytes_ahead; /* bytes beyond position for immediate use */ { /* Fetch a block from the cache or the device. If a physical read is * required, prefetch as many more blocks as convenient into the cache. * This usually covers bytes_ahead and is at least BLOCKS_MINIMUM. * The device driver may decide it knows better and stop reading at a * cylinder boundary (or after an error). Rw_scattered() puts an optional * flag on all reads to allow this. */ /* Minimum number of blocks to prefetch. */ # define BLOCKS_MINIMUM (NR_BUFS < 50 ? 18 : 32) int block_spec, scale, read_q_size; unsigned int blocks_ahead, fragment; block_t block, blocks_left; off_t ind1_pos; dev_t dev; struct buf *bp; static struct buf *read_q[NR_BUFS]; block_spec = (rip->i_mode & I_TYPE) == I_BLOCK_SPECIAL; if (block_spec) { dev = (dev_t) rip->i_zone[0]; } else { dev = rip->i_dev; } block = baseblock; bp = get_block(dev, block, PREFETCH); if (bp->b_dev != NO_DEV) return(bp); /* The best guess for the number of blocks to prefetch: A lot. * It is impossible to tell what the device looks like, so we don't even * try to guess the geometry, but leave it to the driver. * * The floppy driver can read a full track with no rotational delay, and it * avoids reading partial tracks if it can, so handing it enough buffers to * read two tracks is perfect. (Two, because some diskette types have * an odd number of sectors per track, so a block may span tracks.) * * The disk drivers don't try to be smart. With todays disks it is * impossible to tell what the real geometry looks like, so it is best to * read as much as you can. With luck the caching on the drive allows * for a little time to start the next read. * * The current solution below is a bit of a hack, it just reads blocks from * the current file position hoping that more of the file can be found. A * better solution must look at the already available zone pointers and * indirect blocks (but don't call read_map!). */ fragment = position % BLOCK_SIZE; position -= fragment; bytes_ahead += fragment; blocks_ahead = (bytes_ahead + BLOCK_SIZE - 1) / BLOCK_SIZE; if (block_spec && rip->i_size == 0) { blocks_left = NR_IOREQS; } else { blocks_left = (rip->i_size - position + BLOCK_SIZE - 1) / BLOCK_SIZE; /* Go for the first indirect block if we are in its neighborhood. */ if (!block_spec) { scale = rip->i_sp->s_log_zone_size; ind1_pos = (off_t) rip->i_ndzones * (BLOCK_SIZE << scale); if (position <= ind1_pos && rip->i_size > ind1_pos) { blocks_ahead++; blocks_left++; } } } /* No more than the maximum request. */ if (blocks_ahead > NR_IOREQS) blocks_ahead = NR_IOREQS; /* Read at least the minimum number of blocks, but not after a seek. */ if (blocks_ahead < BLOCKS_MINIMUM && rip->i_seek == NO_SEEK) blocks_ahead = BLOCKS_MINIMUM; /* Can't go past end of file. */ if (blocks_ahead > blocks_left) blocks_ahead = blocks_left; read_q_size = 0; /* Acquire block buffers. */ for (;;) { read_q[read_q_size++] = bp; if (--blocks_ahead == 0) break; /* Don't trash the cache, leave 4 free. */ if (bufs_in_use >= NR_BUFS - 4) break; block++; bp = get_block(dev, block, PREFETCH); if (bp->b_dev != NO_DEV) { /* Oops, block already in the cache, get out. */ put_block(bp, FULL_DATA_BLOCK); break; } } rw_scattered(dev, read_q, read_q_size, READING); return(get_block(dev, baseblock, NORMAL)); } /* This file contains the code for performing four system calls relating to * status and directories. * * The entry points into this file are * do_chdir: perform the CHDIR system call * do_chroot: perform the CHROOT system call * do_stat: perform the STAT system call * do_fstat: perform the FSTAT system call */ #include "fs.h" #include #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" FORWARD _PROTOTYPE( int change, (struct inode **iip, char *name_ptr, int len)); FORWARD _PROTOTYPE( int stat_inode, (struct inode *rip, struct filp *fil_ptr, char *user_addr) ); /*===========================================================================* * do_chdir * *===========================================================================*/ PUBLIC int do_chdir() { /* Change directory. This function is also called by MM to simulate a chdir * in order to do EXEC, etc. It also changes the root directory, the uids and * gids, and the umask. */ int r; register struct fproc *rfp; if (who == MM_PROC_NR) { rfp = &fproc[slot1]; put_inode(fp->fp_rootdir); dup_inode(fp->fp_rootdir = rfp->fp_rootdir); put_inode(fp->fp_workdir); dup_inode(fp->fp_workdir = rfp->fp_workdir); /* MM uses access() to check permissions. To make this work, pretend * that the user's real ids are the same as the user's effective ids. * FS calls other than access() do not use the real ids, so are not * affected. */ fp->fp_realuid = fp->fp_effuid = rfp->fp_effuid; fp->fp_realgid = fp->fp_effgid = rfp->fp_effgid; fp->fp_umask = rfp->fp_umask; return(OK); } /* Perform the chdir(name) system call. */ r = change(&fp->fp_workdir, name, name_length); return(r); } /*===========================================================================* * do_chroot * *===========================================================================*/ PUBLIC int do_chroot() { /* Perform the chroot(name) system call. */ register int r; if (!super_user) return(EPERM); /* only su may chroot() */ r = change(&fp->fp_rootdir, name, name_length); return(r); } /*===========================================================================* * change * *===========================================================================*/ PRIVATE int change(iip, name_ptr, len) struct inode **iip; /* pointer to the inode pointer for the dir */ char *name_ptr; /* pointer to the directory name to change to */ int len; /* length of the directory name string */ { /* Do the actual work for chdir() and chroot(). */ struct inode *rip; register int r; /* Try to open the new directory. */ if (fetch_name(name_ptr, len, M3) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* It must be a directory and also be searchable. */ if ( (rip->i_mode & I_TYPE) != I_DIRECTORY) r = ENOTDIR; else r = forbidden(rip, X_BIT); /* check if dir is searchable */ /* If error, return inode. */ if (r != OK) { put_inode(rip); return(r); } /* Everything is OK. Make the change. */ put_inode(*iip); /* release the old directory */ *iip = rip; /* acquire the new one */ return(OK); } /*===========================================================================* * do_stat * *===========================================================================*/ PUBLIC int do_stat() { /* Perform the stat(name, buf) system call. */ register struct inode *rip; register int r; /* Both stat() and fstat() use the same routine to do the real work. That * routine expects an inode, so acquire it temporarily. */ if (fetch_name(name1, name1_length, M1) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); r = stat_inode(rip, NIL_FILP, name2); /* actually do the work.*/ put_inode(rip); /* release the inode */ return(r); } /*===========================================================================* * do_fstat * *===========================================================================*/ PUBLIC int do_fstat() { /* Perform the fstat(fd, buf) system call. */ register struct filp *rfilp; /* Is the file descriptor valid? */ if ( (rfilp = get_filp(fd)) == NIL_FILP) return(err_code); return(stat_inode(rfilp->filp_ino, rfilp, buffer)); } /*===========================================================================* * stat_inode * *===========================================================================*/ PRIVATE int stat_inode(rip, fil_ptr, user_addr) register struct inode *rip; /* pointer to inode to stat */ struct filp *fil_ptr; /* filp pointer, supplied by 'fstat' */ char *user_addr; /* user space address where stat buf goes */ { /* Common code for stat and fstat system calls. */ struct stat statbuf; mode_t mo; int r, s; /* Update the atime, ctime, and mtime fields in the inode, if need be. */ if (rip->i_update) update_times(rip); /* Fill in the statbuf struct. */ mo = rip->i_mode & I_TYPE; s = (mo == I_CHAR_SPECIAL || mo == I_BLOCK_SPECIAL); /* true iff special */ statbuf.st_dev = rip->i_dev; statbuf.st_ino = rip->i_num; statbuf.st_mode = rip->i_mode; statbuf.st_nlink = rip->i_nlinks & BYTE; statbuf.st_uid = rip->i_uid; statbuf.st_gid = rip->i_gid & BYTE; statbuf.st_rdev = (dev_t) (s ? rip->i_zone[0] : NO_DEV); statbuf.st_size = rip->i_size; if (rip->i_pipe == I_PIPE) { statbuf.st_mode &= ~I_REGULAR; /* wipe out I_REGULAR bit for pipes */ if (fil_ptr != NIL_FILP && fil_ptr->filp_mode & R_BIT) statbuf.st_size -= fil_ptr->filp_pos; } statbuf.st_atime = rip->i_atime; statbuf.st_mtime = rip->i_mtime; statbuf.st_ctime = rip->i_ctime; /* Copy the struct to user space. */ r = sys_copy(FS_PROC_NR, D, (phys_bytes) &statbuf, who, D, (phys_bytes) user_addr, (phys_bytes) sizeof(statbuf)); return(r); } /* This file manages the super block table and the related data structures, * namely, the bit maps that keep track of which zones and which inodes are * allocated and which are free. When a new inode or zone is needed, the * appropriate bit map is searched for a free entry. * * The entry points into this file are * alloc_bit: somebody wants to allocate a zone or inode; find one * free_bit: indicate that a zone or inode is available for allocation * get_super: search the 'superblock' table for a device * mounted: tells if file inode is on mounted (or ROOT) file system * read_super: read a superblock */ #include "fs.h" #include #include "buf.h" #include "inode.h" #include "super.h" #define BITCHUNK_BITS (usizeof(bitchunk_t) * CHAR_BIT) #define BITS_PER_BLOCK (BITMAP_CHUNKS * BITCHUNK_BITS) /*===========================================================================* * alloc_bit * *===========================================================================*/ PUBLIC bit_t alloc_bit(sp, map, origin) struct super_block *sp; /* the filesystem to allocate from */ int map; /* IMAP (inode map) or ZMAP (zone map) */ bit_t origin; /* number of bit to start searching at */ { /* Allocate a bit from a bit map and return its bit number. */ block_t start_block; /* first bit block */ bit_t map_bits; /* how many bits are there in the bit map? */ unsigned bit_blocks; /* how many blocks are there in the bit map? */ unsigned block, word, bcount, wcount; struct buf *bp; bitchunk_t *wptr, *wlim, k; bit_t i, b; if (sp->s_rd_only) panic("can't allocate bit on read-only filesys.", NO_NUM); if (map == IMAP) { start_block = SUPER_BLOCK + 1; map_bits = sp->s_ninodes + 1; bit_blocks = sp->s_imap_blocks; } else { start_block = SUPER_BLOCK + 1 + sp->s_imap_blocks; map_bits = sp->s_zones - (sp->s_firstdatazone - 1); bit_blocks = sp->s_zmap_blocks; } /* Figure out where to start the bit search (depends on 'origin'). */ if (origin >= map_bits) origin = 0; /* for robustness */ /* Locate the starting place. */ block = origin / BITS_PER_BLOCK; word = (origin % BITS_PER_BLOCK) / BITCHUNK_BITS; /* Iterate over all blocks plus one, because we start in the middle. */ bcount = bit_blocks + 1; do { bp = get_block(sp->s_dev, start_block + block, NORMAL); wlim = &bp->b_bitmap[BITMAP_CHUNKS]; /* Iterate over the words in block. */ for (wptr = &bp->b_bitmap[word]; wptr < wlim; wptr++) { /* Does this word contain a free bit? */ if (*wptr == (bitchunk_t) ~0) continue; /* Find and allocate the free bit. */ k = conv2(sp->s_native, (int) *wptr); for (i = 0; (k & (1 << i)) != 0; ++i) {} /* Bit number from the start of the bit map. */ b = ((bit_t) block * BITS_PER_BLOCK) + (wptr - &bp->b_bitmap[0]) * BITCHUNK_BITS + i; /* Don't allocate bits beyond the end of the map. */ if (b >= map_bits) break; /* Allocate and return bit number. */ k |= 1 << i; *wptr = conv2(sp->s_native, (int) k); bp->b_dirt = DIRTY; put_block(bp, MAP_BLOCK); return(b); } put_block(bp, MAP_BLOCK); if (++block >= bit_blocks) block = 0; /* last block, wrap around */ word = 0; } while (--bcount > 0); return(NO_BIT); /* no bit could be allocated */ } /*===========================================================================* * free_bit * *===========================================================================*/ PUBLIC void free_bit(sp, map, bit_returned) struct super_block *sp; /* the filesystem to operate on */ int map; /* IMAP (inode map) or ZMAP (zone map) */ bit_t bit_returned; /* number of bit to insert into the map */ { /* Return a zone or inode by turning off its bitmap bit. */ unsigned block, word, bit; struct buf *bp; bitchunk_t k, mask; block_t start_block; if (sp->s_rd_only) panic("can't free bit on read-only filesys.", NO_NUM); if (map == IMAP) { start_block = SUPER_BLOCK + 1; } else { start_block = SUPER_BLOCK + 1 + sp->s_imap_blocks; } block = bit_returned / BITS_PER_BLOCK; word = (bit_returned % BITS_PER_BLOCK) / BITCHUNK_BITS; bit = bit_returned % BITCHUNK_BITS; mask = 1 << bit; bp = get_block(sp->s_dev, start_block + block, NORMAL); k = conv2(sp->s_native, (int) bp->b_bitmap[word]); if (!(k & mask)) { panic(map == IMAP ? "tried to free unused inode" : "tried to free unused block", NO_NUM); } k &= ~mask; bp->b_bitmap[word] = conv2(sp->s_native, (int) k); bp->b_dirt = DIRTY; put_block(bp, MAP_BLOCK); } /*===========================================================================* * get_super * *===========================================================================*/ PUBLIC struct super_block *get_super(dev) dev_t dev; /* device number whose super_block is sought */ { /* Search the superblock table for this device. It is supposed to be there. */ register struct super_block *sp; for (sp = &super_block[0]; sp < &super_block[NR_SUPERS]; sp++) if (sp->s_dev == dev) return(sp); /* Search failed. Something wrong. */ panic("can't find superblock for device (in decimal)", (int) dev); return(NIL_SUPER); /* to keep the compiler and lint quiet */ } /*===========================================================================* * mounted * *===========================================================================*/ PUBLIC int mounted(rip) register struct inode *rip; /* pointer to inode */ { /* Report on whether the given inode is on a mounted (or ROOT) file system. */ register struct super_block *sp; register dev_t dev; dev = (dev_t) rip->i_zone[0]; if (dev == root_dev) return(TRUE); /* inode is on root file system */ for (sp = &super_block[0]; sp < &super_block[NR_SUPERS]; sp++) if (sp->s_dev == dev) return(TRUE); return(FALSE); } /*===========================================================================* * read_super * *===========================================================================*/ PUBLIC int read_super(sp) register struct super_block *sp; /* pointer to a superblock */ { /* Read a superblock. */ register struct buf *bp; dev_t dev; int magic; int version, native; dev = sp->s_dev; /* save device (will be overwritten by copy) */ bp = get_block(sp->s_dev, SUPER_BLOCK, NORMAL); memcpy( (char *) sp, bp->b_data, (size_t) SUPER_SIZE); put_block(bp, ZUPER_BLOCK); sp->s_dev = NO_DEV; /* restore later */ magic = sp->s_magic; /* determines file system type */ /* Get file system version and type. */ if (magic == SUPER_MAGIC || magic == conv2(BYTE_SWAP, SUPER_MAGIC)) { version = V1; native = (magic == SUPER_MAGIC); } else if (magic == SUPER_V2 || magic == conv2(BYTE_SWAP, SUPER_V2)) { version = V2; native = (magic == SUPER_V2); } else { return(EINVAL); } /* If the super block has the wrong byte order, swap the fields; the magic * number doesn't need conversion. */ sp->s_ninodes = conv2(native, (int) sp->s_ninodes); sp->s_nzones = conv2(native, (int) sp->s_nzones); sp->s_imap_blocks = conv2(native, (int) sp->s_imap_blocks); sp->s_zmap_blocks = conv2(native, (int) sp->s_zmap_blocks); sp->s_firstdatazone = conv2(native, (int) sp->s_firstdatazone); sp->s_log_zone_size = conv2(native, (int) sp->s_log_zone_size); sp->s_max_size = conv4(native, sp->s_max_size); sp->s_zones = conv4(native, sp->s_zones); /* In V1, the device size was kept in a short, s_nzones, which limited * devices to 32K zones. For V2, it was decided to keep the size as a * long. However, just changing s_nzones to a long would not work, since * then the position of s_magic in the super block would not be the same * in V1 and V2 file systems, and there would be no way to tell whether * a newly mounted file system was V1 or V2. The solution was to introduce * a new variable, s_zones, and copy the size there. * * Calculate some other numbers that depend on the version here too, to * hide some of the differences. */ if (version == V1) { sp->s_zones = sp->s_nzoneb(d(s; /* only V1 needs this copy */ sp->s_inodes_per_block = V1_INODES_PER_BLOCK; sp->s_ndzones = V1_NR_DZONES; sp->s_nindirs = V1_INDIRECTS; } else { sp->s_inodes_per_block = V2_INODES_PER_BLOCK; sp->s_ndzones = V2_NR_DZONES; sp->s_nindirs = V2_INDIRECTS; } sp->s_isearch = 0; /* inode searches initially start at 0 */ sp->s_zsearch = 0; /* zone searches initially start at 0 */ sp->s_version = version; sp->s_native = native; /* Make a few basic checks to see if super block looks reasonable. */ if (sp->s_imap_blocks < 1 || sp->s_zmap_blocks < 1 || sp->s_ninodes < 1 || sp->s_zones < 1 || (unsigned) sp->s_log_zone_size > 4) { return(EINVAL); } sp->s_dev = dev; /* restore device number */ return(OK); } /* Super block table. The root file system and every mounted file system * has an entry here. The entry holds information about the sizes of the bit * maps and inodes. The s_ninodes field gives the number of inodes available * for files and directories, including the root directory. Inode 0 is * on the disk, but not used. Thus s_ninodes = 4 means that 5 bits will be * used in the bit map, bit 0, which is always 1 and not used, and bits 1-4 * for files and directories. The disk layout is: * * Item # blocks * boot block 1 * super block 1 * inode map s_imap_blocks * zone map s_zmap_blocks * inodes (s_ninodes + 'inodes per block' - 1)/'inodes per block' * unused whatever is needed to fill out the current zone * data zones (s_zones - s_firstdatazone) << s_log_zone_size * * A super_block slot is free if s_dev == NO_DEV. */ EXTERN struct super_block { ino_t s_ninodes; /* # usable inodes on the minor device */ zone1_t s_nzones; /* total device size, including bit maps etc */ short s_imap_blocks; /* # of blocks used by inode bit map */ short s_zmap_blocks; /* # of blocks used by zone bit map */ zone1_t s_firstdatazone; /* number of first data zone */ short s_log_zone_size; /* log2 of blocks/zone */ off_t s_max_size; /* maximum file size on this device */ short s_magic; /* magic number to recognize super-blocks */ short s_pad; /* try to avoid compiler-dependent padding */ zone_t s_zones; /* number of zones (replaces s_nzones in V2) */ /* The following items are only used when the super_block is in memory. */ struct inode *s_isup; /* inode for root dir of mounted file sys */ struct inode *s_imount; /* inode mounted on */ unsigned s_inodes_per_block; /* precalculated from magic number */ dev_t s_dev; /* whose super block is this? */ int s_rd_only; /* set to 1 iff file sys mounted read only */ int s_native; /* set to 1 iff not byte swapped file system */ int s_version; /* file system version, zero means bad magic */ int s_ndzones; /* # direct zones in an inode */ int s_nindirs; /* # indirect zones per indirect block */ bit_t s_isearch; /* inodes below this bit number are in use */ bit_t s_zsearch; /* all zones below this bit number are in use*/ } super_block[NR_SUPERS]; #define NIL_SUPER (struct super_block *) 0 #define IMAP 0 /* operating on the inode bit map */ #define ZMAP 1 /* operating on the zone bit map */ /* This file contains the table used to map system call numbers onto the * routines that perform them. */ #define _TABLE #include "fs.h" #include #include #include "buf.h" #include "dev.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "lock.h" #include "super.h" PUBLIC _PROTOTYPE (int (*call_vec[]), (void) ) = { no_sys, /* 0 = unused */ do_exit, /* 1 = exit */ do_fork, /* 2 = fork */ do_read, /* 3 = read */ do_write, /* 4 = write */ do_open, /* 5 = open */ do_close, /* 6 = close */ no_sys, /* 7 = wait */ do_creat, /* 8 = creat */ do_link, /* 9 = link */ do_unlink, /* 10 = unlink */ no_sys, /* 11 = waitpid */ do_chdir, /* 12 = chdir */ do_time, /* 13 = time */ do_mknod, /* 14 = mknod */ do_chmod, /* 15 = chmod */ do_chown, /* 16 = chown */ no_sys, /* 17 = break */ do_stat, /* 18 = stat */ do_lseek, /* 19 = lseek */ no_sys, /* 20 = getpid */ do_mount, /* 21 = mount */ do_umount, /* 22 = umount */ do_set, /* 23 = setuid */ no_sys, /* 24 = getuid */ do_stime, /* 25 = stime */ no_sys, /* 26 = ptrace */ no_sys, /* 27 = alarm */ do_fstat, /* 28 = fstat */ no_sys, /* 29 = pause */ do_utime, /* 30 = utime */ no_sys, /* 31 = (stty) */ no_sys, /* 32 = (gtty) */ do_access, /* 33 = access */ no_sys, /* 34 = (nice) */ no_sys, /* 35 = (ftime) */ do_sync, /* 36 = sync */ no_sys, /* 37 = kill */ do_rename, /* 38 = rename */ do_mkdir, /* 39 = mkdir */ do_unlink, /* 40 = rmdir */ do_dup, /* 41 = dup */ do_pipe, /* 42 = pipe */ do_tims, /* 43 = times */ no_sys, /* 44 = (prof) */ no_sys, /* 45 = unused */ do_set, /* 46 = setgid */ no_sys, /* 47 = getgid */ no_sys, /* 48 = (signal)*/ no_sys, /* 49 = unused */ no_sys, /* 50 = unused */ no_sys, /* 51 = (acct) */ no_sys, /* 52 = (phys) */ no_sys, /* 53 = (lock) */ do_ioctl, /* 54 = ioctl */ do_fcntl, /* 55 = fcntl */ no_sys, /* 56 = (mpx) */ no_sys, /* 57 = unused */ no_sys, /* 58 = unused */ do_exec, /* 59 = execve */ do_umask, /* 60 = umask */ do_chroot, /* 61 = chroot */ do_setsid, /* 62 = setsid */ no_sys, /* 63 = getpgrp */ no_sys, /* 64 = KSIG: signals originating in the kernel */ do_unpause, /* 65 = UNPAUSE */ no_sys, /* 66 = unused */ do_revive, /* 67 = REVIVE */ no_sys, /* 68 = TASK_REPLY */ no_sys, /* 69 = unused */ no_sys, /* 70 = unused */ no_sys, /* 71 = SIGACTION */ no_sys, /* 72 = SIGSUSPEND */ no_sys, /* 73 = SIGPENDING */ no_sys, /* 74 = SIGPROCMASK */ no_sys, /* 75 = SIGRETURN */ no_sys, /* 76 = REBOOT */ do_svrctl, /* 77 = SVRCTL */ }; /* This should not fail with "array size is negative": */ extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; /* Some devices may or may not be there in the next table. */ #define DT(enable, opcl, io, task) \ { (enable ? (opcl) : no_dev), (enable ? (io) : 0), (enable ? (task) : 0) }, /* The order of the entries here determines the mapping between major device * numbers and tasks. The first entry (major device 0) is not used. The * next entry is major device 1, etc. Character and block devices can be * intermixed at random. This ordering determines the device numbers in * /dev/ and is thereby more or less cast in stone once allocated. * Note that the major device numbers used in /dev are NOT the same as the * task numbers used inside the kernel (as defined in ). * Also note that FS knows the device number of /dev/ram to load the RAM disk. */ PUBLIC struct dmap dmap[] = { /* ? Open/Close I/O Task # Device File - ---------- -------- ----------- ------ ---- */ DT(1, no_dev, 0, 0) /* 0 = not used */ DT(1, gen_opcl, gen_io, MEM) /* 1 = /dev/mem */ DT(1, gen_opcl, gen_io, FLOPPY) /* 2 = /dev/fd0 */ DT(NR_CTRLRS >= 1, gen_opcl, gen_io, CTRLR(0)) /* 3 = /dev/c0 */ DT(1, tty_opcl, gen_io, TTY) /* 4 = /dev/tty00 */ DT(1, ctty_opcl, ctty_io, TTY) /* 5 = /dev/tty */ DT(ENABLE_PRINTER, gen_opcl, gen_io, PRINTER) /* 6 = /dev/lp */ #if (MACHINE == IBM_PC) DT(1, no_dev, 0, ANY) /* 7 = /dev/ip */ DT(NR_CTRLRS >= 2, gen_opcl, gen_io, CTRLR(1)) /* 8 = /dev/c1 */ DT(0, 0, 0, 0) /* 9 = not used */ DT(NR_CTRLRS >= 3, gen_opcl, gen_io, CTRLR(2)) /*10 = /dev/c2 */ DT(0, 0, 0, 0) /*11 = not used */ DT(NR_CTRLRS >= 4, gen_opcl, gen_io, CTRLR(3)) /*12 = /dev/c3 */ DT(ENABLE_SB16, gen_opcl, gen_io, SB16) /*13 = /dev/audio */ DT(ENABLE_SB16, gen_opcl, gen_io, SB16MIXER) /*14 = /dev/mixer */ #endif /* IBM_PC */ }; PUBLIC int max_major = sizeof(dmap)/sizeof(struct dmap); /* This file takes care of those system calls that deal with time. * * The entry points into this file are * do_utime: perform the UTIME system call * do_time: perform the TIME system call * do_stime: perform the STIME system call * do_tims: perform the TIMES system call */ #include "fs.h" #include #include #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" PRIVATE message clock_mess; /*===========================================================================* * do_utime * *===========================================================================*/ PUBLIC int do_utime() { /* Perform the utime(name, timep) system call. */ register struct inode *rip; register int len, r; /* Adjust for case of NULL 'timep'. */ len = utime_length; if (len == 0) len = m.m2_i2; /* Temporarily open the file. */ if (fetch_name(utime_file, len, M1) != OK) return(err_code); if ( (rip = eat_path(user_path)) == NIL_INODE) return(err_code); /* Only the owner of a file or the super_user can change its time. */ r = OK; if (rip->i_uid != fp->fp_effuid && !super_user) r = EPERM; if (utime_length == 0 && r != OK) r = forbidden(rip, W_BIT); if (read_only(rip) != OK) r = EROFS; /* not even su can touch if R/O */ if (r == OK) { if (utime_length == 0) { rip->i_atime = clock_time(); rip->i_mtime = rip->i_atime; } else { rip->i_atime = utime_actime; rip->i_mtime = utime_modtime; } rip->i_update = CTIME; /* discard any stale ATIME and MTIME flags */ rip->i_dirt = DIRTY; } put_inode(rip); return(r); } /*===========================================================================* * do_time * *===========================================================================*/ PUBLIC int do_time() { /* Perform the time(tp) system call. */ reply_l1 = clock_time(); /* return time in seconds */ return(OK); } /*===========================================================================* * do_stime * *===========================================================================*/ PUBLIC int do_stime() { /* Perform the stime(tp) system call. */ register int k; if (!super_user) return(EPERM); clock_mess.m_type = SET_TIME; clock_mess.NEW_TIME = (long) tp; if ( (k = sendrec(CLOCK, &clock_mess)) != OK) panic("do_stime error", k); return(OK); } /*===========================================================================* * do_tims * *===========================================================================*/ PUBLIC int do_tims() { /* Perform the times(buffer) system call. */ clock_t t[5]; sys_times(who, t); reply_t1 = t[0]; reply_t2 = t[1]; reply_t3 = t[2]; reply_t4 = t[3]; reply_t5 = t[4]; return(OK); } /* Declaration of the V1 inode as it is on the disk (not in core). */ typedef struct { /* V1.x disk inode */ mode_t d1_mode; /* file type, protection, etc. */ uid_t d1_uid; /* user id of the file's owner */ off_t d1_size; /* current file size in bytes */ time_t d1_mtime; /* when was file data last changed */ gid_t d1_gid; /* group number */ nlink_t d1_nlinks; /* how many links to this file */ u16_t d1_zone[V1_NR_TZONES]; /* block nums for direct, ind, and dbl ind */ } d1_inode; /* Declaration of the V2 inode as it is on the disk (not in core). */ typedef struct { /* V2.x disk inode */ mode_t d2_mode; /* file type, protection, etc. */ u16_t d2_nlinks; /* how many links to this file. HACK! */ uid_t d2_uid; /* user id of the file's owner. */ u16_t d2_gid; /* group number HACK! */ off_t d2_size; /* current file size in bytes */ time_t d2_atime; /* when was file data last accessed */ time_t d2_mtime; /* when was file data last changed */ time_t d2_ctime; /* when was inode data last changed */ zone_t d2_zone[V2_NR_TZONES]; /* block nums for direct, ind, and dbl ind */ } d2_inode; /* This file contains a few general purpose utility routines. * * The entry points into this file are * clock_time: ask the clock task for the real time * copy: copy a block of data * fetch_name: go get a path name from user space * no_sys: reject a system call that FS does not handle * panic: something awful has occurred; MINIX cannot continue * conv2: do byte swapping on a 16-bit int * conv4: do byte swapping on a 32-bit long */ #include "fs.h" #include #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "param.h" PRIVATE int panicking; /* inhibits recursive panics during sync */ PRIVATE message clock_mess; /*===========================================================================* * clock_time * *===========================================================================*/ PUBLIC time_t clock_time() { /* This routine returns the time in seconds since 1.1.1970. MINIX is an * astrophysically naive system that assumes the earth rotates at a constant * rate and that such things as leap seconds do not exist. */ register int k; clock_mess.m_type = GET_TIME; if ( (k = sendrec(CLOCK, &clock_mess)) != OK) panic("clock_time err", k); return( (time_t) clock_mess.NEW_TIME); } /*===========================================================================* * fetch_name * *===========================================================================*/ PUBLIC int fetch_name(path, len, flag) char *path; /* pointer to the path in user space */ int len; /* path length, including 0 byte */ int flag; /* M3 means path may be in message */ { /* Go get path and put it in 'user_path'. * If 'flag' = M3 and 'len' <= M3_STRING, the path is present in 'message'. * If it is not, go copy it from user space. */ register char *rpu, *rpm; int r; /* Check name length for validity. */ if (len <= 0) { err_code = EINVAL; return(EGENERIC); } if (len > PATH_MAX) { err_code = ENAMETOOLONG; return(EGENERIC); } if (flag == M3 && len <= M3_STRING) { /* Just copy the path from the message to 'user_path'. */ rpu = &user_path[0]; rpm = pathname; /* contained in input message */ do { *rpu++ = *rpm++; } while (--len); r = OK; } else { /* String is not contained in the message. Get it from user space. */ r = sys_copy(who, D, (phys_bytes) path, FS_PROC_NR, D, (phys_bytes) user_path, (phys_bytes) len); } return(r); } /*===========================================================================* * no_sys * *===========================================================================*/ PUBLIC int no_sys() { /* Somebody has used an illegal system call number */ return(EINVAL); } /*===========================================================================* * panic * *===========================================================================*/ PUBLIC void panic(format, num) char *format; /* format string */ int num; /* number to go with format string */ { /* Something awful has happened. Panics are caused when an internal * inconsistency is detected, e.g., a programming error or illegal value of a * defined constant. */ if (panicking) return; /* do not panic during a sync */ panicking = TRUE; /* prevent another panic during the sync */ printf("File system panic: %s ", format); if (num != NO_NUM) printf("%d",num); printf("\n"); (void) do_sync(); /* flush everything to the disk */ sys_abort(RBT_PANIC); } /*===========================================================================* * conv2 * *===========================================================================*/ PUBLIC unsigned conv2(norm, w) int norm; /* TRUE if no swap, FALSE for byte swap */ int w; /* promotion of 16-bit word to be swapped */ { /* Possibly swap a 16-bit word between 8086 and 68000 byte order. */ if (norm) return( (unsigned) w & 0xFFFF); return( ((w&BYTE) << 8) | ( (w>>8) & BYTE)); } /*===========================================================================* * conv4 * *===========================================================================*/ PUBLIC long conv4(norm, x) int norm; /* TRUE if no swap, FALSE for byte swap */ long x; /* 32-bit long to be byte swapped */ { /* Possibly swap a 32-bit long between 8086 and 68000 byte order. */ unsigned lo, hi; long l; if (norm) return(x); /* byte order was already ok */ lo = conv2(FALSE, (int) x & 0xFFFF); /* low-order half, byte swapped */ hi = conv2(FALSE, (int) (x>>16) & 0xFFFF); /* high-order half, swapped */ l = ( (long) lo <<16) | hi; return(l); } /* This file is the counterpart of "read.c". It contains the code for writing * insofar as this is not contained in read_write(). * * The entry points into this file are * do_write: call read_write to perform the WRITE system call * clear_zone: erase a zone in the middle of a file * new_block: acquire a new block */ #include "fs.h" #include #include "buf.h" #include "file.h" #include "fproc.h" #include "inode.h" #include "super.h" FORWARD _PROTOTYPE( int write_map, (struct inode *rip, off_t position, zone_t new_zone) ); FORWARD _PROTOTYPE( void wr_indir, (struct buf *bp, int index, zone_t zone) ); /*===========================================================================* * do_write * *===========================================================================*/ PUBLIC int do_write() { /* Perform the write(fd, buffer, nbytes) system call. */ return(read_write(WRITING)); } /*===========================================================================* * write_map * *===========================================================================*/ PRIVATE int write_map(rip, position, new_zone) register struct inode *rip; /* pointer to inode to be changed */ off_t position; /* file address to be mapped */ zone_t new_zone; /* zone # to be inserted */ { /* Write a new zone into an inode. */ int scale, ind_ex, new_ind, new_dbl, zones, nr_indirects, single, zindex, ex; zone_t z, z1; register block_t b; long excess, zone; struct buf *bp; rip->i_dirt = DIRTY; /* inode will be changed */ bp = NIL_BUF; scale = rip->i_sp->s_log_zone_size; /* for zone-block conversion */ zone = (position/BLOCK_SIZE) >> scale; /* relative zone # to insert */ zones = rip->i_ndzones; /* # direct zones in the inode */ nr_indirects = rip->i_nindirs;/* # indirect zones per indirect block */ /* Is 'position' to be found in the inode itself? */ if (zone < zones) { zindex = (int) zone; /* we need an integer here */ rip->i_zone[zindex] = new_zone; return(OK); } /* It is not in the inode, so it must be single or double indirect. */ excess = zone - zones; /* first Vx_NR_DZONES don't count */ new_ind = FALSE; new_dbl = FALSE; if (excess < nr_indirects) { /* 'position' can be located via the single indirect block. */ z1 = rip->i_zone[zones]; /* single indirect zone */ single = TRUE; } else { /* 'position' can be located via the double indirect block. */ if ( (z = rip->i_zone[zones+1]) == NO_ZONE) { /* Create the double indirect block. */ if ( (z = alloc_zone(rip->i_dev, rip->i_zone[0])) == NO_ZONE) return(err_code); rip->i_zone[zones+1] = z; new_dbl = TRUE; /* set flag for later */ } /* Either way, 'z' is zone number for double indirect block. */ excess -= nr_indirects; /* single indirect doesn't count */ ind_ex = (int) (excess / nr_indirects); excess = excess % nr_indirects; if (ind_ex >= nr_indirects) return(EFBIG); b = (block_t) z << scale; bp = get_block(rip->i_dev, b, (new_dbl ? NO_READ : NORMAL)); if (new_dbl) zero_block(bp); z1 = rd_indir(bp, ind_ex); single = FALSE; } /* z1 is now single indirect zone; 'excess' is index. */ if (z1 == NO_ZONE) { /* Create indirect block and store zone # in inode or dbl indir blk. */ z1 = alloc_zone(rip->i_dev, rip->i_zone[0]); if (single) rip->i_zone[zones] = z1; /* update inode */ else wr_indir(bp, ind_ex, z1); /* update dbl indir */ new_ind = TRUE; if (bp != NIL_BUF) bp->b_dirt = DIRTY; /* if double ind, it is dirty*/ if (z1 == NO_ZONE) { put_block(bp, INDIRECT_BLOCK); /* release dbl indirect blk */ return(err_code); /* couldn't create single ind */ } } put_block(bp, INDIRECT_BLOCK); /* release double indirect blk */ /* z1 is indirect block's zone number. */ b = (block_t) z1 << scale; bp = get_block(rip->i_dev, b, (new_ind ? NO_READ : NORMAL) ); if (new_ind) zero_block(bp); ex = (int) excess; /* we need an int here */ wr_indir(bp, ex, new_zone); bp->b_dirt = DIRTY; put_block(bp, INDIRECT_BLOCK); return(OK); } /*===========================================================================* * wr_indir * *===========================================================================*/ PRIVATE void wr_indir(bp, index, zone) struct buf *bp; /* pointer to indirect block */ int index; /* index into *bp */ zone_t zone; /* zone to write */ { /* Given a pointer to an indirect block, write one entry. */ struct super_block *sp; sp = get_super(bp->b_dev); /* need super block to find file sys type */ /* write a zone into an indirect block */ if (sp->s_version == V1) bp->b_v1_ind[index] = (zone1_t) conv2(sp->s_native, (int) zone); else bp->b_v2_ind[index] = (zone_t) conv4(sp->s_native, (long) zone); } /*===========================================================================* * clear_zone * *===========================================================================*/ PUBLIC void clear_zone(rip, pos, flag) register struct inode *rip; /* inode to clear */ off_t pos; /* points to block to clear */ int flag; /* 0 if called by read_write, 1 by new_block */ { /* Zero a zone, possibly starting in the middle. The parameter 'pos' gives * a byte in the first block to be zeroed. Clearzone() is called from * read_write and new_block(). */ register struct buf *bp; register block_t b, blo, bhi; register off_t next; register int scale; register zone_t zone_size; /* If the block size and zone size are the same, clear_zone() not needed. */ scale = rip->i_sp->s_log_zone_size; if (scale == 0) return; zone_size = (zone_t) BLOCK_SIZE << scale; if (flag == 1) pos = (pos/zone_size) * zone_size; next = pos + BLOCK_SIZE - 1; /* If 'pos' is in the last block of a zone, do not clear the zone. */ if (next/zone_size != pos/zone_size) return; if ( (blo = read_map(rip, next)) == NO_BLOCK) return; bhi = ( ((blo>>scale)+1) << scale) - 1; /* Clear all the blocks between 'blo' and 'bhi'. */ for (b = blo; b <= bhi; b++) { bp = get_block(rip->i_dev, b, NO_READ); zero_block(bp); put_block(bp, FULL_DATA_BLOCK); } } /*===========================================================================* * new_block * *===========================================================================*/ PUBLIC struct buf *new_block(rip, position) register struct inode *rip; /* pointer to inode */ off_t position; /* file pointer */ { /* Acquire a new block and return a pointer to it. Doing so may require * allocating a complete zone, and then returning the initial block. * On the other hand, the current zone may still have some unused blocks. */ register struct buf *bp; block_t b, base_block; zone_t z; zone_t zone_size; int scale, r; struct super_block *sp; /* Is another block available in the current zone? */ if ( (b = read_map(rip, position)) == NO_BLOCK) { /* Choose first zone if possible. */ /* Lose if the file is nonempty but the first zone number is NO_ZONE * corresponding to a zone full of zeros. It would be better to * search near the last real zone. */ if (rip->i_zone[0] == NO_ZONE) { sp = rip->i_sp; z = sp->s_firstdatazone; } else { z = rip->i_zone[0]; /* hunt near first zone */ } if ( (z = alloc_zone(rip->i_dev, z)) == NO_ZONE) return(NIL_BUF); if ( (r = write_map(rip, position, z)) != OK) { free_zone(rip->i_dev, z); err_code = r; return(NIL_BUF); } /* If we are not writing at EOF, clear the zone, just to be safe. */ if ( position != rip->i_size) clear_zone(rip, position, 1); scale = rip->i_sp->s_log_zone_size; base_block = (block_t) z << scale; zone_size = (zone_t) BLOCK_SIZE << scale; b = base_block + (block_t)((position % zone_size)/BLOCK_SIZE); } bp = get_block(rip->i_dev, b, NO_READ); zero_block(bp); return(bp); } /*===========================================================================* * zero_block * *===========================================================================*/ PUBLIC void zero_block(bp) register struct buf *bp; /* pointer to buffer to zero */ { /* Zero a block. */ mem~((set(bp->b_data, 0, BLOCK_SIZE); bp->b_dirt = DIRTY; } ...Makefilebuf.cclock.cconst.hgenericinet.cinet.hinet_config.cinet_config.hmnx_eth.cmq.cmq.hosdep_eth.hproto.hsr.cstacktrace.cversion.c# Makefile for inet. # Directories u = /usr i = $u/include s = $i/sys h = $i/minix n = $i/net g = generic # Programs, flags, and libraries CC = cc CPPFLAGS = -I. -I.. CFLAGS = $(OPT) $(CPPFLAGS) -m LDFLAGS = -i LIBS = -lsys OBJ = buf.o clock.o inet.o inet_config.o \ mnx_eth.o mq.o sr.o stacktrace.o \ $g/udp.o $g/arp.o $g/eth.o $g/event.o \ $g/icmp.o $g/io.o $g/ip.o $g/ip_ioctl.o \ $g/ip_lib.o $g/ip_read.o $g/ip_write.o \ $g/ipr.o $g/tcp.o $g/tcp_lib.o \ $g/tcp_recv.o $g/tcp_send.o $g/ip_eth.o \ $g/ip_ps.o $g/psip.o all: inet inet: inet.a $(CC) -o $@ $(LDFLAGS) inet.a version.c $(LIBS) install -S 2kw $@ install: /usr/bin/inet /usr/bin/inet: inet install -cs $? $@ inet.a: $(OBJ) @rm -f $@ aal cr $@ $(OBJ) clean: rm -f $(OBJ) inet.a inet *.bak .all # Depencencies .all: $h/com.h .all: $h/config.h .all: $h/const.h .all: $h/syslib.h .all: $h/type.h .all: $i/ansi.h .all: $i/errno.h .all: $i/stddef.h .all: $i/stdlib.h .all: $i/string.h .all: $n/gen/eth_hdr.h .all: $n/gen/eth_io.h .all: $n/gen/ether.h .all: $n/gen/icmp.h .all: $n/gen/icmp_hdr.h .all: $n/gen/in.h .all: $n/gen/ip_hdr.h .all: $n/gen/ip_io.h .all: $n/gen/oneCsum.h .all: $n/gen/psip_hdr.h .all: $n/gen/psip_io.h .all: $n/gen/route.h .all: $n/gen/tcp.h .all: $n/gen/tcp_hdr.h .all: $n/gen/tcp_io.h .all: $n/gen/udp.h .all: $n/gen/udp_hdr.h .all: $n/gen/udp_io.h .all: $n/hton.h .all: $s/ioctl.h .all: $s/types.h .all: const.h .all: inet_config.h .all: inet.h touch .all a = .all # Trick to avoid many dependencies (that overload make) buf.o: $g/assert.h buf.o: $g/buf.h buf.o: $g/type.h buf.o: $i/stdlib.h buf.o: $i/string.h buf.o: inet.h buf.o: $a clock.o: $g/assert.h clock.o: $g/buf.h clock.o: $g/clock.h clock.o: $g/type.h clock.o: inet.h clock.o: proto.h clock.o: $a inet.o: $g/arp.h inet.o: $g/assert.h inet.o: $g/buf.h inet.o: $g/clock.h inet.o: $g/eth.h inet.o: $g/event.h inet.o: $g/ip.h inet.o: $g/psip.h inet.o: $g/sr.h inet.o: $g/tcp.h inet.o: $g/type.h inet.o: $g/udp.h inet.o: $i/unistd.h inet.o: $s/svrctl.h inet.o: inet.h inet.o: mq.h inet.o: proto.h inet.o: $a inet_config.o: $i/unistd.h inet_config.o: $i/fcntl.h inet_config.o: $s/stat.h inet_config.o: $a mnx_eth.o: $g/assert.h mnx_eth.o: $g/buf.h mnx_eth.o: $g/clock.h mnx_eth.o: $g/eth.h mnx_eth.o: $g/eth_int.h mnx_eth.o: $g/sr.h mnx_eth.o: $g/type.h mnx_eth.o: inet.h mnx_eth.o: osdep_eth.h mnx_eth.o: $g/event.h mnx_eth.o: proto.h mnx_eth.o: $a mq.o: $g/assert.h mq.o: inet.h mq.o: mq.h mq.o: $a sr.o: $g/assert.h sr.o: $g/buf.h sr.o: $g/sr.h sr.o: $g/type.h sr.o: $h/callnr.h sr.o: inet.h sr.o: mq.h sr.o: proto.h sr.o: $a stacktrace.o: inet.h stacktrace.o: $a $g/arp.o: $g/arp.h $g/arp.o: $g/assert.h $g/arp.o: $g/buf.h $g/arp.o: $g/clock.h $g/arp.o: $g/eth.h $g/arp.o: inet.h $g/arp.o: $g/io.h $g/arp.o: $g/sr.h $g/arp.o: $g/type.h $g/arp.o: $a $g/arp.o: $g/arp.c cd generic && $(CC) -c $(CFLAGS) arp.c $g/eth.o: $g/assert.h $g/eth.o: $g/buf.h $g/eth.o: $g/buf.h $g/eth.o: $g/clock.h $g/eth.o: $g/eth.h $g/eth.o: $g/eth_int.h $g/eth.o: $g/event.h $g/eth.o: inet.h $g/eth.o: $g/io.h $g/eth.o: osdep_eth.h $g/eth.o: $g/event.h $g/eth.o: $g/sr.h $g/eth.o: $g/type.h $g/eth.o: $a $g/eth.o: $g/eth.c cd generic && $(CC) -c $(CFLAGS) eth.c $g/event.o: $g/assert.h $g/event.o: $g/event.h $g/event.o: inet.h $g/event.o: $a $g/event.o: $g/event.c cd generic && $(CC) -c $(CFLAGS) event.c $g/icmp.o: $g/assert.h $g/icmp.o: $g/buf.h $g/icmp.o: $g/event.h $g/icmp.o: $g/icmp.h $g/icmp.o: $g/icmp_lib.h $g/icmp.o: inet.h $g/icmp.o: $g/io.h $g/icmp.o: $g/ip.h $g/icmp.o: $g/ip_int.h $g/icmp.o: $g/ipr.h $g/icmp.o: $g/type.h $g/icmp.o: $a $g/icmp.o: $g/icmp.c cd generic && $(CC) -c $(CFLAGS) icmp.c $g/io.o: $i/stdlib.h $g/io.o: inet.h $g/io.o: $g/io.h $g/io.o: $a $g/io.o: $g/io.c cd generic && $(CC) -c $(CFLAGS) io.c $g/ip.o: $g/arp.h $g/ip.o: $g/assert.h $g/ip.o: $g/buf.h $g/ip.o: $g/clock.h $g/ip.o: $g/eth.h $g/ip.o: $g/event.h $g/ip.o: $g/icmp.h $g/ip.o: $g/icmp_lib.h $g/ip.o: inet.h $g/ip.o: $g/io.h $g/ip.o: $g/ip.h $g/ip.o: $g/ip_int.h $g/ip.o: $g/ipr.h $g/ip.o: $g/sr.h $g/ip.o: $g/type.h $g/ip.o: $a $g/ip.o: $g/ip.c cd generic && $(CC) -c $(CFLAGS) ip.c $g/ip_eth.o: $g/arp.h $g/ip_eth.o: $g/assert.h $g/ip_eth.o: $g/buf.h $g/ip_eth.o: $g/clock.h $g/ip_eth.o: $g/eth.h $g/ip_eth.o: $g/event.h $g/ip_eth.o: inet.h $g/ip_eth.o: $g/ip.h $g/ip_eth.o: $g/ip_int.h $g/ip_eth.o: $g/type.h $g/ip_eth.o: $a $g/ip_eth.o: $g/ip_eth.c cd generic && $(CC) -c $(CFLAGS) ip_eth.c $g/ip_ioctl.o: $g/arp.h $g/ip_ioctl.o: $g/assert.h $g/ip_ioctl.o: $g/buf.h $g/ip_ioctl.o: $g/clock.h $g/ip_ioctl.o: $g/event.h $g/ip_ioctl.o: $g/icmp_lib.h $g/ip_ioctl.o: inet.h $g/ip_ioctl.o: $g/ip.h $g/ip_ioctl.o: $g/ip_int.h $g/ip_ioctl.o: $g/ipr.h $g/ip_ioctl.o: $g/type.h $g/ip_ioctl.o: $a $g/ip_ioctl.o: $g/ip_ioctl.c cd generic && $(CC) -c $(CFLAGS) ip_ioctl.c $g/ip_lib.o: $g/assert.h $g/ip_lib.o: $g/buf.h $g/ip_lib.o: $g/event.h $g/ip_lib.o: inet.h $g/ip_lib.o: $g/io.h $g/ip_lib.o: $g/ip_int.h $g/ip_lib.o: $g/type.h $g/ip_lib.o: $a $g/ip_lib.o: $g/ip_lib.c cd generic && $(CC) -c $(CFLAGS) ip_lib.c $g/ip_ps.o: $g/assert.h $g/ip_ps.o: $g/buf.h $g/ip_ps.o: $g/event.h $g/ip_ps.o: inet.h $g/ip_ps.o: $g/ip.h $g/ip_ps.o: $g/ip_int.h $g/ip_ps.o: $g/psip.h $g/ip_ps.o: $g/type.h $g/ip_ps.o: $a $g/ip_ps.o: $g/ip_ps.c cd generic && $(CC) -c $(CFLAGS) ip_ps.c $g/ip_read.o: $g/assert.h $g/ip_read.o: $g/buf.h $g/ip_read.o: $g/clock.h $g/ip_read.o: $g/event.h $g/ip_read.o: $g/icmp_lib.h $g/ip_read.o: inet.h $g/ip_read.o: $g/io.h $g/ip_read.o: $g/ip.h $g/ip_read.o: $g/ip_int.h $g/ip_read.o: $g/ipr.h $g/ip_read.o: $g/type.h $g/ip_read.o: $a $g/ip_read.o: $g/ip_read.c cd generic && $(CC) -c $(CFLAGS) ip_read.c $g/ip_write.o: $g/arp.h $g/ip_write.o: $g/assert.h $g/ip_write.o: $g/buf.h $g/ip_write.o: $g/clock.h $g/ip_write.o: $g/eth.h $g/ip_write.o: $g/event.h $g/ip_write.o: $g/icmp_lib.h $g/ip_write.o: inet.h $g/ip_write.o: $g/io.h $g/ip_write.o: $g/ip.h $g/ip_write.o: $g/ip_int.h $g/ip_write.o: $g/ipr.h $g/ip_write.o: $g/type.h $g/ip_write.o: $a $g/ip_write.o: $g/ip_write.c cd generic && $(CC) -c $(CFLAGS) ip_write.c $g/ipr.o: $g/assert.h $g/ipr.o: $g/buf.h $g/ipr.o: $g/clock.h $g/ipr.o: $g/event.h $g/ipr.o: inet.h $g/ipr.o: $g/io.h $g/ipr.o: $g/ip_int.h $g/ipr.o: $g/ipr.h $g/ipr.o: $g/type.h $g/ipr.o: $a $g/ipr.o: $g/ipr.c cd generic && $(CC) -c $(CFLAGS) ipr.c $g/psip.o: $g/assert.h $g/psip.o: $g/buf.h $g/psip.o: $g/event.h $g/psip.o: inet.h $g/psip.o: $g/ip_int.h $g/psip.o: $g/psip.h $g/psip.o: $g/sr.h $g/psip.o: $g/type.h $g/psip.o: $a $g/psip.o: $g/psip.c cd generic && $(CC) -c $(CFLAGS) psip.c $g/tcp.o: $g/assert.h $g/tcp.o: $g/buf.h $g/tcp.o: $g/clock.h $g/tcp.o: $g/event.h $g/tcp.o: inet.h $g/tcp.o: $g/io.h $g/tcp.o: $g/ip.h $g/tcp.o: $g/sr.h $g/tcp.o: $g/tcp.h $g/tcp.o: $g/tcp_int.h $g/tcp.o: $g/type.h $g/tcp.o: $a $g/tcp.o: $g/tcp.c cd generic && $(CC) -c $(CFLAGS) tcp.c $g/tcp_lib.o: $g/assert.h $g/tcp_lib.o: $g/buf.h $g/tcp_lib.o: $g/clock.h $g/tcp_lib.o: $g/event.h $g/tcp_lib.o: inet.h $g/tcp_lib.o: $g/io.h $g/tcp_lib.o: $g/tcp_int.h $g/tcp_lib.o: $g/type.h $g/tcp_lib.o: $a $g/tcp_lib.o: $g/tcp_lib.c cd generic && $(CC) -c $(CFLAGS) tcp_lib.c $g/tcp_recv.o: $g/assert.h $g/tcp_recv.o: $g/buf.h $g/tcp_recv.o: $g/clock.h $g/tcp_recv.o: $g/event.h $g/tcp_recv.o: inet.h $g/tcp_recv.o: $g/io.h $g/tcp_recv.o: $g/tcp.h $g/tcp_recv.o: $g/tcp_int.h $g/tcp_recv.o: $g/type.h $g/tcp_recv.o: $a $g/tcp_recv.o: $g/tcp_recv.c cd generic && $(CC) -c $(CFLAGS) tcp_recv.c $g/tcp_send.o: $g/assert.h $g/tcp_send.o: $g/buf.h $g/tcp_send.o: $g/clock.h $g/tcp_send.o: $g/event.h $g/tcp_send.o: inet.h $g/tcp_send.o: $g/io.h $g/tcp_send.o: $g/ip.h $g/tcp_send.o: $g/tcp.h $g/tcp_send.o: $g/tcp_int.h $g/tcp_send.o: $g/type.h $g/tcp_send.o: $a $g/tcp_send.o: $g/tcp_send.c cd generic && $(CC) -c $(CFLAGS) tcp_send.c $g/udp.o: $g/assert.h $g/udp.o: $g/buf.h $g/udp.o: $g/clock.h $g/udp.o: $g/icmp_lib.h $g/udp.o: inet.h $g/udp.o: $g/io.h $g/udp.o: $g/ip.h $g/udp.o: $g/sr.h $g/udp.o: $g/type.h $g/udp.o: $g/udp.h $g/udp.o: $a $g/udp.o: $g/udp.c cd generic && $(CC) -c $(CFLAGS) udp.c (/* This file contains routines for buffer management. Copyright 1995 Philip Homburg */ #define BUF_IMPLEMENTATION 1 /* Avoid some macros */ #include "inet.h" #include #include #include "generic/assert.h" #include "generic/buf.h" #include "generic/type.h" THIS_FILE #ifndef BUF_USEMALLOC #define BUF_USEMALLOC 0 #endif #ifndef BUF512_NR #if CRAMPED #define BUF512_NR 32 #else #define BUF512_NR 128 #endif #endif #ifndef BUF2K_NR #define BUF2K_NR 0 #endif #ifndef BUF32K_NR #define BUF32K_NR 0 #endif #define ACC_NR ((BUF512_NR+BUF2K_NR+BUF32K_NR)*3/2) #define CLIENT_NR 6 #define DECLARE_TYPE(Tag, Type, Size) \ typedef struct Tag \ { \ buf_t buf_header; \ char buf_data[Size]; \ } Type #if BUF_USEMALLOC #define DECLARE_STORAGE(Type, Ident, Nitems) \ PRIVATE Type *Ident #define ALLOC_STORAGE(Ident, Nitems, Label) \ do \ { \ printf("buf.c: malloc %d %s\n", Nitems, Label); \ Ident= malloc(sizeof(*Ident) * Nitems); \ if (!Ident) \ ip_panic(( "unable to alloc %s", Label )); \ } while(0) #else #define DECLARE_STORAGE(Type, Ident, Nitems) \ PRIVATE Type Ident[Nitems] #define ALLOC_STORAGE(Ident, Nitems, Label) \ (void)0 #endif #if BUF512_NR DECLARE_TYPE(buf512, buf512_t, 512); PRIVATE acc_t *buf512_freelist; DECLARE_STORAGE(buf512_t, buffers512, BUF512_NR); FORWARD void bf_512free ARGS(( acc_t *acc )); #endif #if BUF2K_NR DECLARE_TYPE(buf2K, buf2K_t, (2*1024)); PRIVATE acc_t *buf2K_freelist; DECLARE_STORAGE(buf2K_t, buffers2K, BUF2K_NR); FORWARD void bf_2Kfree ARGS(( acc_t *acc )); #endif #if BUF32K_NR DECLARE_TYPE(buf32K, buf32K_t, (32*1024)); PRIVATE acc_t *buf32K_freelist; DECLARE_STORAGE(buf32K_t, buffers32K, BUF32K_NR); FORWARD void bf_32Kfree ARGS(( acc_t *acc )); #endif PRIVATE acc_t *acc_freelist; DECLARE_STORAGE(acc_t, accessors, ACC_NR); PRIVATE bf_freereq_t freereq[CLIENT_NR]; PRIVATE size_t bf_buf_gran; PUBLIC size_t bf_free_bufsize; PUBLIC acc_t *bf_temporary_acc; #ifdef BUF_CONSISTENCY_CHECK int inet_buf_debug; unsigned buf_generation; PRIVATE bf_checkreq_t checkreq[CLIENT_NR]; #endif #ifndef BUF_TRACK_ALLOC_FREE FORWARD acc_t *bf_small_memreq ARGS(( size_t size )); #else FORWARD acc_t *_bf_small_memreq ARGS(( char *clnt_file, int clnt_line, size_t size )); #define bf_small_memreq(a) _bf_small_memreq(clnt_file, clnt_line, a) #endif FORWARD void free_accs ARGS(( void )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void count_free_bufs ARGS(( acc_t *list )); FORWARD int report_buffer ARGS(( buf_t *buf, char *label, int i )); #endif PUBLIC void bf_init() { int i; size_t size; size_t buf_s; acc_t *acc; bf_buf_gran= BUF_S; buf_s= 0; for (i=0;iacc_next; \ acc->acc_linkC= 0; \ \ memset(&Ident[i], '\0', sizeof(Ident[i])); \ Ident[i].buf_header.buf_linkC= 0; \ Ident[i].buf_header.buf_free= Freefunc; \ Ident[i].buf_header.buf_size= \ sizeof(Ident[i].buf_data); \ Ident[i].buf_header.buf_data_p= \ Ident[i].buf_data; \ \ acc->acc_buffer= &Ident[i].buf_header; \ acc->acc_next= Freelist; \ Freelist= acc; \ } \ if (sizeof(Ident[0].buf_data) < bf_buf_gran) \ bf_buf_gran= sizeof(Ident[0].buf_data); \ if (sizeof(Ident[0].buf_data) > buf_s) \ buf_s= sizeof(Ident[0].buf_data); \ } while(0) #if BUF512_NR INIT_BUFFERS(buffers512, BUF512_NR, buf512_freelist, bf_512free); #endif #if BUF2K_NR INIT_BUFFERS(buffers2K, BUF2K_NR, buf2K_freelist, bf_2Kfree); #endif #if BUF32K_NR INIT_BUFFERS(buffers32K, BUF32K_NR, buf32K_freelist, bf_32Kfree); #endif #undef INIT_BUFFERS assert (buf_s == BUF_S); } #ifndef BUF_CONSISTENCY_CHECK PUBLIC void bf_logon(func) bf_freereq_t func; #else PUBLIC void bf_logon(func, checkfunc) bf_freereq_t func; bf_checkreq_t checkfunc; #endif { int i; for (i=0;i0); head= NULL; while (size) { new_acc= NULL; /* Note the tricky dangling else... */ #define ALLOC_BUF(Freelist, Bufsize) \ if (Freelist && (Bufsize == BUF_S || size <= Bufsize)) \ { \ new_acc= Freelist; \ Freelist= new_acc->acc_next; \ \ assert(new_acc->acc_linkC == 0); \ new_acc->acc_linkC= 1; \ buf= new_acc->acc_buffer; \ assert(buf->buf_linkC == 0); \ buf->buf_linkC= 1; \ } \ else /* Sort attempts by buffer size */ #if BUF512_NR ALLOC_BUF(buf512_freelist, 512) #endif #if BUF2K_NR ALLOC_BUF(buf2K_freelist, 2*1024) #endif #if BUF32K_NR ALLOC_BUF(buf32K_freelist, 32*1024) #endif #undef ALLOC_BUF { DBLOCK(1, printf("freeing buffers\n")); bf_free_bufsize= 0; for (i=0; bf_free_bufsizeacc_next) j++; printf("# of free 512-bytes buffer is now %d\n", j); } #endif } #if DEBUG { printf("last level was level %d\n", i-1); } #endif if (bf_free_bufsizeacc_alloc_file= clnt_file; new_acc->acc_alloc_line= clnt_line; buf->buf_alloc_file= clnt_file; buf->buf_alloc_line= clnt_line; #endif if (!head) head= new_acc; else tail->acc_next= new_acc; tail= new_acc; count= tail->acc_buffer->buf_size; if (count > size) count= size; tail->acc_offset= 0; tail->acc_length= count; size -= count; } tail->acc_next= 0; #if DEBUG bf_chkbuf(head); #endif return head; } /* bf_small_memreq */ #ifndef BUF_TRACK_ALLOC_FREE PRIVATE acc_t *bf_small_memreq(size) #else PRIVATE acc_t *_bf_small_memreq(clnt_file, clnt_line, size) char *clnt_file; int clnt_line; #endif size_t size; { return bf_memreq(size); } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC void bf_afree(acc) #else PUBLIC void _bf_afree(clnt_file, clnt_line, acc) char *clnt_file; int clnt_line; #endif acc_t *acc; { acc_t *next_acc; buf_t *buf; while (acc) { #if defined(bf_afree) DIFBLOCK(1, (acc->acc_linkC <= 0), printf("clnt_file= %s, clnt_line= %d\n", clnt_file, clnt_line)); #endif assert (acc->acc_linkC>0); if (--acc->acc_linkC > 0) break; #ifdef BUF_TRACK_ALLOC_FREE acc->acc_free_file= clnt_file; acc->acc_free_line= clnt_line; #endif buf= acc->acc_buffer; assert (buf); #if defined(bf_afree) DIFBLOCK(1, (buf->buf_linkC == 0), printf("clnt_file= %s, clnt_line= %d\n", clnt_file, clnt_line)); #endif assert (buf->buf_linkC>0); if (--buf->buf_linkC > 0) { acc->acc_buffer= NULL; next_acc= acc->acc_next; acc->acc_next= acc_freelist; acc_freelist= acc; #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) { acc->acc_offset= 0xdeadbeaf; acc->acc_length= 0xdeadbeaf; acc->acc_buffer= (buf_t *)0xdeadbeaf; acc->acc_ext_link= (acc_t *)((((((((((((((((((0xdeadbeaf; } #endif acc= next_acc; continue; } bf_free_bufsize += buf->buf_size; #ifdef BUF_TRACK_ALLOC_FREE buf->buf_free_file= clnt_file; buf->buf_free_line= clnt_line; #endif next_acc= acc->acc_next; buf->buf_free(acc); acc= next_acc; continue; } } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_dupacc(acc_ptr) #else PUBLIC acc_t *_bf_dupacc(clnt_file, clnt_line, acc_ptr) char *clnt_file; int clnt_line; #endif register acc_t *acc_ptr; { register acc_t *new_acc; int i, j; if (!acc_freelist) { free_accs(); if (!acc_freelist) ip_panic(( "buf.c: out of accessors" )); } new_acc= acc_freelist; acc_freelist= new_acc->acc_next; *new_acc= *acc_ptr; if (acc_ptr->acc_next) acc_ptr->acc_next->acc_linkC++; if (acc_ptr->acc_buffer) acc_ptr->acc_buffer->buf_linkC++; new_acc->acc_linkC= 1; #ifdef BUF_TRACK_ALLOC_FREE new_acc->acc_alloc_file= clnt_file; new_acc->acc_alloc_line= clnt_line; #endif return new_acc; } PUBLIC size_t bf_bufsize(acc_ptr) register acc_t *acc_ptr; { register size_t size; assert(acc_ptr); size=0; while (acc_ptr) { assert(acc_ptr >= accessors && acc_ptr <= &accessors[ACC_NR-1]); size += acc_ptr->acc_length; acc_ptr= acc_ptr->acc_next; } return size; } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_packIffLess(pack, min_len) #else PUBLIC acc_t *_bf_packIffLess(clnt_file, clnt_line, pack, min_len) char *clnt_file; int clnt_line; #endif acc_t *pack; int min_len; { if (!pack || pack->acc_length >= min_len) return pack; #if DEBUG #ifdef bf_packIffLess { where(); printf("calling bf_pack because of %s %d: %d\n", bf_pack_file, bf_pack_line, min_len); } #endif #endif return bf_pack(pack); } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_pack(old_acc) #else PUBLIC acc_t *_bf_pack(clnt_file, clnt_line, old_acc) char *clnt_file; int clnt_line; #endif acc_t *old_acc; { acc_t *new_acc, *acc_ptr_old, *acc_ptr_new; size_t size, offset_old, offset_new, block_size, block_size_old; /* Check if old acc is good enough. */ if (!old_acc || !old_acc->acc_next && old_acc->acc_linkC == 1 && old_acc->acc_buffer->buf_linkC == 1) { return old_acc; } size= bf_bufsize(old_acc); assert(size > 0); new_acc= bf_memreq(size); acc_ptr_old= old_acc; acc_ptr_new= new_acc; offset_old= 0; offset_new= 0; while (size) { assert (acc_ptr_old); if (offset_old == acc_ptr_old->acc_length) { offset_old= 0; acc_ptr_old= acc_ptr_old->acc_next; continue; } assert (offset_old < acc_ptr_old->acc_length); block_size_old= acc_ptr_old->acc_length - offset_old; assert (acc_ptr_new); if (offset_new == acc_ptr_new->acc_length) { offset_new= 0; acc_ptr_new= acc_ptr_new->acc_next; continue; } assert (offset_new < acc_ptr_new->acc_length); block_size= acc_ptr_new->acc_length - offset_new; if (block_size > block_size_old) block_size= block_size_old; memcpy(ptr2acc_data(acc_ptr_new)+offset_new, ptr2acc_data(acc_ptr_old)+offset_old, block_size); offset_new += block_size; offset_old += block_size; size -= block_size; } bf_afree(old_acc); return new_acc; } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_cut (data, offset, length) #else PUBLIC acc_t *_bf_cut (clnt_file, clnt_line, data, offset, length) char *clnt_file; int clnt_line; #endif register acc_t *data; register unsigned offset; register unsigned length; { register acc_t *head, *tail; if (!data && !offset && !length) return 0; #ifdef BUF_TRACK_ALLOC_FREE assert(data || (printf("from %s, %d: %u, %u\n", clnt_file, clnt_line, offset, length), 0)); #else assert(data); #endif assert(data); #if DEBUG bf_chkbuf(data); #endif if (!length) { head= bf_dupacc(data); bf_afree(head->acc_next); head->acc_next= 0; head->acc_length= 0; #if DEBUG bf_chkbuf(data); #endif return head; } while (data && offset>=data->acc_length) { offset -= data->acc_length; data= data->acc_next; } assert (data); head= bf_dupacc(data); bf_afree(head->acc_next); head->acc_next= 0; head->acc_offset += offset; head->acc_length -= offset; if (length >= head->acc_length) length -= head->acc_length; else { head->acc_length= length; length= 0; } tail= head; data= data->acc_next; while (data && length && length>=data->acc_length) { tail->acc_next= bf_dupacc(data); tail= tail->acc_next; bf_afree(tail->acc_next); tail->acc_next= 0; data= data->acc_next; length -= tail->acc_length; } if (length) { #ifdef bf_cut assert (data || (printf("bf_cut called from %s:%d\n", clnt_file, clnt_line), 0)); #else assert (data); #endif tail->acc_next= bf_dupacc(data); tail= tail->acc_next; bf_afree(tail->acc_next); tail->acc_next= 0; tail->acc_length= length; } #if DEBUG bf_chkbuf(data); #endif return head; } #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_delhead (data, offset) #else PUBLIC acc_t *_bf_delhead (clnt_file, clnt_line, data, offset) char *clnt_file; int clnt_line; #endif register acc_t *data; register unsigned offset; { acc_t *new_acc; assert(data); /* Find the acc we need to modify. */ new_acc= data; while(offset >= new_acc->acc_length) { offset -= new_acc->acc_length; new_acc= new_acc->acc_next; #ifdef BUF_TRACK_ALLOC_FREE assert(new_acc || (printf("called from %s, %d\n", clnt_file, clnt_line),0)); #else assert(new_acc); #endif } /* Discard the old acc(s) */ if (new_acc != data) { new_acc->acc_linkC++; bf_afree(data); data= new_acc; } /* Make sure that acc_linkC == 1 */ if (data->acc_linkC != 1) { new_acc= bf_dupacc(data); bf_afree(data); data= new_acc; } /* Delete the last bit by modifying acc_offset and acc_length */ data->acc_offset += offset; data->acc_length -= offset; return data; } /* bf_append */ #ifndef BUF_TRACK_ALLOC_FREE PUBLIC acc_t *bf_append(data_first, data_second) #else PUBLIC acc_t *_bf_append(clnt_file, clnt_line, data_first, data_second) char *clnt_file; int clnt_line; #endif acc_t *data_first; acc_t *data_second; { acc_t *head, *tail, *new_acc, *acc_ptr_new, tmp_acc, *curr; char *src_ptr, *dst_ptr; size_t size, offset_old, offset_new, block_size_old, block_size; if (!data_first) return data_second; if (!data_second) return data_first; head= 0; while (data_first) { if (data_first->acc_linkC == 1) curr= data_first; else { curr= bf_dupacc(data_first); assert (curr->acc_linkC == 1); bf_afree(data_first); } data_first= curr->acc_next; if (!curr->acc_length) { curr->acc_next= 0; bf_afree(curr); continue; } if (!head) head= curr; else tail->acc_next= curr; tail= curr; } if (!head) return data_second; tail->acc_next= 0; while (data_second && !data_second->acc_length) { curr= data_second; data_second= data_second->acc_next; if (data_second) data_second->acc_linkC++; bf_afree(curr); } if (!data_second) return head; if (tail->acc_length + data_second->acc_length > tail->acc_buffer->buf_size) { tail->acc_next= data_second; return head; } if (tail->acc_buffer->buf_size == bf_buf_gran && tail->acc_buffer->buf_linkC == 1) { if (tail->acc_offset) { memmove(tail->acc_buffer->buf_data_p, ptr2acc_data(tail), tail->acc_length); tail->acc_offset= 0; } dst_ptr= ptr2acc_data(tail) + tail->acc_length; src_ptr= ptr2acc_data(data_second); memcpy(dst_ptr, src_ptr, data_second->acc_length); tail->acc_length += data_second->acc_length; tail->acc_next= data_second->acc_next; if (data_second->acc_next) data_second->acc_next->acc_linkC++; bf_afree(data_second); return head; } new_acc= bf_small_memreq(tail->acc_length+data_second->acc_length); acc_ptr_new= new_acc; offset_old= 0; offset_new= 0; size= tail->acc_length; while (size) { assert (acc_ptr_new); if (offset_new == acc_ptr_new->acc_length) { offset_new= 0; acc_ptr_new= acc_ptr_new->acc_next; continue; } assert (offset_new < acc_ptr_new->acc_length); assert (offset_old < tail->acc_length); block_size_old= tail->acc_length - offset_old; block_size= acc_ptr_new->acc_length - offset_new; if (block_size > block_size_old) block_size= block_size_old; memcpy(ptr2acc_data(acc_ptr_new)+offset_new, ptr2acc_data(tail)+offset_old, block_size); offset_new += block_size; offset_old += block_size; size -= block_size; } offset_old= 0; size= data_second->acc_length; while (size) { assert (acc_ptr_new); if (offset_new == acc_ptr_new->acc_length) { offset_new= 0; acc_ptr_new= acc_ptr_new->acc_next; continue; } assert (offset_new < acc_ptr_new->acc_length); assert (offset_old < data_second->acc_length); block_size_old= data_second->acc_length - offset_old; block_size= acc_ptr_new->acc_length - offset_new; if (block_size > block_size_old) block_size= block_size_old; memcpy(ptr2acc_data(acc_ptr_new)+offset_new, ptr2acc_data(data_second)+offset_old, block_size); offset_new += block_size; offset_old += block_size; size -= block_size; } tmp_acc= *tail; *tail= *new_acc; *new_acc= tmp_acc; bf_afree(new_acc); while (tail->acc_next) tail= tail->acc_next; tail->acc_next= data_second->acc_next; if (data_second->acc_next) data_second->acc_next->acc_linkC++; bf_afree(data_second); return head; } #if BUF512_NR PRIVATE void bf_512free(acc) acc_t *acc; { #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) memset(acc->acc_buffer->buf_data_p, 0xa5, 512); #endif acc->acc_next= buf512_freelist; buf512_freelist= acc; } #endif #if BUF2K_NR PRIVATE void bf_2Kfree(acc) acc_t *acc; { #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) memset(acc->acc_buffer->buf_data_p, 0xa5, 2*1024); #endif acc->acc_next= buf2K_freelist; buf2K_freelist= acc; } #endif #if BUF32K_NR PRIVATE void bf_32Kfree(acc) acc_t *acc; { #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) memset(acc->acc_buffer->buf_data_p, 0xa5, 32*1024); #endif acc->acc_next= buf32K_freelist; buf32K_freelist= acc; } #endif #ifdef BUF_CONSISTENCY_CHECK PUBLIC int bf_consistency_check() { acc_t *acc; buf_t *buf; int silent; int error; int i; buf_generation++; for (i=0; iacc_next) { if (acc->acc_generation == buf_generation-1) { acc->acc_generation= buf_generation; acc->acc_check_linkC= 0; } else { assert(acc->acc_generation == buf_generation && acc->acc_check_linkC > 0); acc->acc_check_linkC= -acc->acc_check_linkC; } } #if BUF512_NR count_free_bufs(buf512_freelist); #endif #if BUF2K_NR count_free_bufs(buf2K_freelist); #endif #if BUF32K_NR count_free_bufs(buf32K_freelist); #endif error= 0; /* Report about accessors */ silent= 0; for (i=0, acc= accessors; iacc_generation != buf_generation) { error++; assert(acc->acc_generation == buf_generation-1); acc->acc_generation= buf_generation; if (!silent) { printf( "acc[%d] (0x%x) has been lost with count %d, last allocated at %s, %d\n", i, acc, acc->acc_linkC, acc->acc_alloc_file, acc->acc_alloc_line); #if 0 silent= 1; #endif } continue; } if (acc->acc_check_linkC == acc->acc_linkC) continue; error++; if (acc->acc_check_linkC < 0) { if (!silent) { printf( "acc[%d] is freed but still in use, allocated at %s, %d, freed at %s, %d\n", i, acc->acc_alloc_file, acc->acc_alloc_line, acc->acc_free_file, acc->acc_free_line); } acc->acc_check_linkC= -acc->acc_check_linkC; if (acc->acc_check_linkC == acc->acc_linkC) { silent= 1; continue; } } if (!silent) { printf( "# of tracked links (%d) for acc[%d] don't match with stored link count %d\n", acc->acc_check_linkC, i, acc->acc_linkC); printf("acc[%d] was allocated at %s, %d\n", i, acc->acc_alloc_file, acc->acc_alloc_line); silent=1; } } /* Report about buffers */ #if BUF512_NR { for (i= 0; iacc_next) { if (acc->acc_generation != buf_generation-1) { assert(acc->acc_generation == buf_generation && acc->acc_check_linkC > 0); acc->acc_check_linkC= -acc->acc_check_linkC; continue; } acc->acc_generation= buf_generation; acc->acc_check_linkC= 0; buf= acc->acc_buffer; if (buf->buf_generation == buf_generation-1) { buf->buf_generation= buf_generation; buf->buf_check_linkC= 0; continue; } assert(buf->buf_generation == buf_generation && buf->buf_check_linkC > 0); buf->buf_check_linkC= -buf->buf_check_linkC; } } PRIVATE int report_buffer(buf, label, i) buf_t *buf; char *label; int i; { if (buf->buf_generation != buf_generation) { assert(buf->buf_generation == buf_generation-1); buf->buf_generation= buf_generation; printf( "%s[%d] (0x%x) has been lost with count %d, last allocated at %s, %d\n", label, i, buf, buf->buf_linkC, buf->buf_alloc_file, buf->buf_alloc_line); return 1; } if (buf->buf_check_linkC == buf->buf_linkC) return 0; if (buf->buf_check_linkC < 0) { printf( "%s[%d] is freed but still in use, allocated at %s, %d, freed at %s, %d\n", label, i, buf->buf_alloc_file, buf->buf_alloc_line, buf->buf_free_file, buf->buf_free_line); buf->buf_check_linkC= -buf->buf_check_linkC; if (buf->buf_check_linkC == buf->buf_linkC) return 1; } printf( "# of tracked links (%d) for %s[%d] don't match with stored link count %d\n", buf->buf_check_linkC, label, i, buf->buf_linkC); printf("%s[%d] was allocated at %s, %d\n", label, i, buf->buf_alloc_file, buf->buf_alloc_line); return 1; } PUBLIC void bf_check_acc(acc) acc_t *acc; { buf_t *buf; while(acc != NULL) { if (acc->acc_generation == buf_generation) { assert(acc->acc_check_linkC > 0); acc->acc_check_linkC++; return; } assert(acc->acc_generation == buf_generation-1); acc->acc_generation= buf_generation; acc->acc_check_linkC= 1; buf= acc->acc_buffer; if (buf->buf_generation == buf_generation) { assert(buf->buf_check_linkC > 0); buf->buf_check_linkC++; } else { assert(buf->buf_generation == buf_generation-1); buf->buf_generation= buf_generation; buf->buf_check_linkC= 1; } acc= acc->acc_next; } } PUBLIC void _bf_mark_acc(clnt_file, clnt_line, acc) char *clnt_file; int clnt_line; acc_t *acc; { buf_t *buf; for (; acc; acc= acc->acc_next) { acc->acc_alloc_file= clnt_file; acc->acc_alloc_line= clnt_line; buf= acc->acc_buffer; buf->buf_alloc_file= clnt_file; buf->buf_alloc_line= clnt_line; } } #endif PRIVATE void free_accs() { int i, j; DBLOCK(1, printf("free_accs\n")); for (i=0; !acc_freelist && iacc_length >= size) { ptr= ptr2acc_data(acc); if (((unsigned)ptr & (alignment-1)) == 0) return acc; } buf_size= bf_bufsize(acc); #ifdef bf_align assert(size != 0 && buf_size != 0 || (printf("bf_align(..., %d, %d) from %s, %d\n", size, alignment, clnt_file, clnt_line),0)); #else assert(size != 0 && buf_size != 0); #endif if (buf_size <= size) { acc= bf_pack(acc); return acc; } head= bf_cut(acc, 0, size); tail= bf_cut(acc, size, buf_size-size); bf_afree(acc); head= bf_pack(head); assert(head->acc_next == NULL); head->acc_next= tail; return head; } #if 0 int chk_acc(acc) acc_t *acc; { int acc_nr; if (!acc) return 1; if (acc < accessors || acc >= &accessors[ACC_NR]) return 0; acc_nr= acc-accessors; return acc == &accessors[acc_nr]; } #endif /* * $PchId: buf.c,v 1.10 1995/11/23 11:25:25 philip Exp $ */ /* clock.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "proto.h" #include "generic/assert.h" #include "generic/buf.h" #include "generic/clock.h" #include "generic/type.h" THIS_FILE PUBLIC int clck_call_expire; PRIVATE time_t curr_time; PRIVATE timer_t *timer_chain; PRIVATE time_t next_timeout; FORWARD _PROTOTYPE( void clck_fast_release, (timer_t *timer) ); FORWARD _PROTOTYPE( void set_timer, (void) ); PUBLIC void clck_init() { #if ZERO clck_call_expire= 0; curr_time= 0; next_timeout= 0; timer_chain= 0; #endif } PUBLIC time_t get_time() { if (!curr_time) { static message mess; mess.m_type= GET_UPTIME; if (sendrec (CLOCK, &mess) < 0 || mess.m_type != OK) ip_panic(("can't read clock")); curr_time= mess.NEW_TIME; } return curr_time; } PUBLIC void set_time (tim) time_t tim; { if (!curr_time) { /* Some code assumes that no time elapses while it is * running. */ curr_time= tim; } } PUBLIC void reset_time() { curr_time= 0; } PUBLIC void clck_timer(timer, timeout, func, fd) timer_t *timer; time_t timeout; timer_func_t func; int fd; { timer_t *timer_index; if (timer->tim_active) clck_fast_release(timer); assert(!timer->tim_active); timer->tim_next= 0; timer->tim_func= func; timer->tim_ref= fd; timer->tim_time= timeout; timer->tim_active= 1; if (!timer_chain) timer_chain= timer; else if (timeout < timer_chain->tim_time) { timer->tim_next= timer_chain; timer_chain= timer; } else { timer_index= timer_chain; while (timer_index->tim_next && timer_index->tim_next->tim_time < timeout) timer_index= timer_index->tim_next; timer->tim_next= timer_index->tim_next; timer_index->tim_next= timer; } if (next_timeout == 0 || timer_chain->tim_time < next_timeout) set_timer(); } PUBLIC void clck_tick (mess) message *mess; { next_timeout= 0; set_timer(); } PRIVATE void clck_fast_release (timer) timer_t *timer; { timer_t *timer_index; if (!timer->tim_active) return; if (timer == timer_chain) timer_chain= timer_chain->tim_next; else { timer_index= timer_chain; while (timer_index && timer_index->tim_next != timer) timer_index= timer_index->tim_next; assert(timer_index); timer_index->tim_next= timer->tim_next; } timer->tim_active= 0; } PRIVATE void set_timer() { time_t new_time; time_t curr_time; if (!timer_chain) return; curr_time= get_time(); new_time= timer_chain->tim_time; if (new_time <= curr_time) { clck_call_expire= 1; return; } if (next_timeout == 0 || new_time < next_timeout) { static message mess; next_timeout= new_time; new_time -= curr_time; mess.m_type= SET_SYNC_AL; mess.CLOCK_PROC_NR= this_proc; mess.DELTA_TICKS= new_time; if (sendrec (CLOCK, &mess) < 0 || mess.m_type != OK) ip_panic(("can't set timer")); } } PUBLIC void clck_untimer (timer) timer_t *timer; { clck_fast_release (timer); set_timer(); } PUBLIC void clck_expire_timers() { time_t curr_time; timer_t *timer_index; clck_call_expire= 0; if (timer_chain == NULL) return; curr_time= get_time(); while (timer_chain && timer_chain->tim_time<=curr_time) { assert(timer_chain->tim_active); timer_chain->tim_active= 0; timer_index= timer_chain; timer_chain= timer_chain->tim_next; (*timer_index->tim_func)(timer_index->tim_ref, timer_index); } set_timer(); } /* * $PchId: clock.c,v 1.6 1995/11/21 06:54:39 philip Exp $ */ /* inet/const.h Created: Dec 30, 1991 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef INET__CONST_H #define INET__CONST_H #ifndef DEBUG #define DEBUG 0 #endif #ifndef NDEBUG #define NDEBUG (CRAMPED) #endif #define CLOCK_GRAN 1 /* in HZ */ #if DEBUG #define where() printf("%s, %d: ", __FILE__, __LINE__) #endif #define NW_SUSPEND SUSPEND #define NW_WOULDBLOCK EWOULDBLOCK #define NW_OK OK #define BUF_S 512 #endif /* INET__CONST_H */ /* * $PchId: const.h,v 1.6 1995/11/21 06:54:39 philip Exp $ */ ...arp.carp.hassert.hbuf.hclock.heth.ceth.heth_int.hevent.cevent.hicmp.cicmp.hicmp_lib.hio.cio.hip.cip.hip_eth.cip_int.hip_ioctl.cip_lib.cip_ps.cip_read.cip_write.cipr.cipr.hpsip.cpsip.hsr.htcp.ctcp.htcp_int.htcp_lib.ctcp_recv.ctcp_send.ctype.hudp.cudp.h/* arp.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "type.h" #include "arp.h" #include "assert.h" #include "buf.h" #include "clock.h" #include "eth.h" #include "io.h" #include "sr.h" THIS_FILE #define ARP_CACHE_NR 64 #define MAX_ARP_RETRIES 5 #define ARP_TIMEOUT (HZ/2+1) /* .5 seconds */ #ifndef ARP_EXP_TIME #define ARP_EXP_TIME (20L*60L*HZ) /* 20 minutes */ #endif #define ARP_NOTRCH_EXP_TIME (5*HZ) /* 5 seconds */ #define ARP_INUSE_OFFSET (60*HZ) /* an entry in the cache can be deleted if its not used for 1 minute */ typedef struct arp46 { ether_addr_t a46_dstaddr; ether_addr_t a46_srcaddr; ether_type_t a46_ethtype; union { struct { u16_t a_hdr, a_pro; u8_t a_hln, a_pln; u16_t a_op; ether_addr_t a_sha; u8_t a_spa[4]; ether_addr_t a_tha; u8_t a_tpa[4]; } a46_data; char a46_dummy[ETH_MIN_PACK_SIZE-ETH_HDR_SIZE]; } a46_data; } arp46_t; #define a46_hdr a46_data.a46_data.a_hdr #define a46_pro a46_data.a46_data.a_pro #define a46_hln a46_data.a46_data.a_hln #define a46_pln a46_data.a46_data.a_pln #define a46_op a46_data.a46_data.a_op #define a46_sha a46_data.a46_data.a_sha #define a46_spa a46_data.a46_data.a_spa #define a46_tha a46_data.a46_data.a_tha #define a46_tpa a46_data.a46_data.a_tpa typedef struct arp_port { int ap_flags; int ap_state; int ap_eth_port; int ap_ip_port; int ap_eth_fd; ether_addr_t ap_ethaddr; ipaddr_t ap_ipaddr; timer_t ap_timer; ether_addr_t ap_write_ethaddr; ipaddr_t ap_write_ipaddr; int ap_write_code; ipaddr_t ap_req_ipaddr; int ap_req_count; arp_func_t ap_arp_func; } arp_port_t; #define APF_EMPTY 0 #define APF_ARP_RD_IP 0x4 #define APF_ARP_RD_SP 0x8 #define APF_ARP_WR_IP 0x10 #define APF_ARP_WR_SP 0x20 #define APF_INADDR_SET 0x100 #define APF_MORE2WRITE 0x200 #define APF_CLIENTREQ 0x400 #define APF_CLIENTWRITE 0x1000 #define APF_SUSPEND 0x2000 #define APS_INITIAL 0x00 #define APS_GETADDR 0x01 #define APS_ARPSTART 0x10 #define APS_ARPPROTO 0x20 #define APS_ARPMAIN 0x40 #define APS_ERROR 0x80 typedef struct arp_cache { int ac_flags; int ac_state; ether_addr_t ac_ethaddr; ipaddr_t ac_ipaddr; arp_port_t *ac_port; time_t ac_expire; time_t ac_lastuse; } arp_cache_t; #define ACF_EMPTY 0 #define ACF_GOTREQ 1 #define ACS_UNUSED 0 #define ACS_INCOMPLETE 1 #define ACS_VALID 2 #define ACS_UNREACHABLE 3 FORWARD acc_t *arp_getdata ARGS(( int fd, size_t offset, size_t count, int for_ioctl )); FORWARD int arp_putdata ARGS(( int fd, size_t offset, acc_t *data, int for_ioctl )); FORWARD void arp_main ARGS(( arp_port_t *arp_port )); FORWARD void arp_timeout ARGS(( int fd, timer_t *timer )); FORWARD void setup_write ARGS(( arp_port_t *arp_port )); FORWARD void setup_read ARGS(( arp_port_t *arp_port )); FORWARD void process_arp_req ARGS(( arp_port_t *arp_port, acc_t *data )); FORWARD void client_reply ARGS(( arp_port_t *arp_port, ipaddr_t ipaddr, ether_addr_t *ethaddr )); FORWARD arp_cache_t *find_cache_ent ARGS(( arp_port_t *arp_port, ipaddr_t ipaddr )); FORWARD arp_cache_t *alloc_cache_ent ARGS(( void )); PRIVATE arp_port_t *arp_port_table; PRIVATE arp_cache_t arp_cache[ARP_CACHE_NR]; PUBLIC void arp_prep() { arp_port_table= alloc(eth_conf_nr * sizeof(arp_port_table[0])); } PUBLIC void arp_init() { arp_port_t *arp_port; int i; assert (BUF_S >= sizeof(struct nwio_ethstat)); assert (BUF_S >= sizeof(struct nwio_ethopt)); assert (BUF_S >= sizeof(arp46_t)); for (i=0, arp_port= arp_port_table; iap_state= APS_ERROR; /* Mark all ports as * unavailable */ } } PRIVATE void arp_main(arp_port) arp_port_t *arp_port; { int result; switch (arp_port->ap_state) { case APS_INITIAL: arp_port->ap_eth_fd= eth_open(arp_port->ap_eth_port, arp_port->ap_eth_port, arp_getdata, arp_putdata, 0); if (arp_port->ap_eth_fd<0) { DBLOCK(1, printf("arp.c: unable to open ethernet\n")); return; } arp_port->ap_state= APS_GETADDR; result= eth_ioctl (arp_port->ap_eth_fd, NWIOGETHSTAT); if ( result == NW_SUSPEND) { arp_port->ap_flags |= APF_SUSPEND; return; } assert(result == NW_OK); /* fall through */ case APS_GETADDR: /* Wait for IP address */ if (!(arp_port->ap_flags & APF_INADDR_SET)) return; /* fall through */ case APS_ARPSTART: arp_port->ap_state= APS_ARPPROTO; { arp_cache_t *cache; int i; cache= arp_cache; for (i=0; iac_state= ACS_UNUSED; cache->ac_flags= ACF_EMPTY; cache->ac_expire= 0; cache->ac_lastuse= 0; } } result= eth_ioctl (arp_port->ap_eth_fd, NWIOSETHOPT); if (result==NW_SUSPEND) { arp_port->ap_flags |= APF_SUSPEND; return; } assert(result == NW_OK); /* fall through */ case APS_ARPPROTO: arp_port->ap_state= APS_ARPMAIN; if (arp_port->ap_flags & APF_MORE2WRITE) setup_write(arp_port); setup_read(arp_port); return; #if !CRAMPED default: ip_panic(( "arp_main(&arp_port_table[%d]) called but ap_state=0x%x\n", arp_port->ap_eth_port, arp_port->ap_state )); #endif } } PRIVATE acc_t *arp_getdata (fd, offset, count, for_ioctl) int fd; size_t offset; size_t count; int for_ioctl; { arp_port_t *arp_port; arp46_t *arp; acc_t *data; int result; arp_port= &arp_port_table[fd]; switch (arp_port->ap_state) { case APS_ARPPROTO: if (!count) { result= (int)offset; if (result<0) { arp_port->ap_state= APS_ERROR; break; } if (arp_port->ap_flags & APF_SUSPEND) { arp_port->ap_flags &= ~APF_SUSPEND; arp_main(arp_port); } return NW_OK; } assert ((!offset) && (count == sizeof(struct nwio_ethopt))); { struct nwio_ethopt *ethopt; acc_t *acc; acc= bf_memreq(sizeof(*ethopt)); ethopt= (struct nwio_ethopt *)ptr2acc_data(acc); ethopt->nweo_flags= NWEO_COPY|NWEO_EN_BROAD| NWEO_TYPESPEC; ethopt->nweo_type= HTONS(ETH_ARP_PROTO); return acc; } case APS_ARPMAIN: assert (arp_port->ap_flags & APF_ARP_WR_IP); if (!count) { result= (int)offset; if (result<0) { DIFBLOCK(1, (result != NW_SUSPEND), printf( "arp.c: write error on port %d: error %d\n", fd, result)); arp_port->ap_state= APS_ERROR; break; } arp_port->ap_flags &= ~APF_ARP_WR_IP; if (arp_port->ap_flags & APF_ARP_WR_SP) setup_write(arp_port); return NW_OK; } assert (offset+count <= sizeof(arp46_t)); data= bf_memreq(sizeof(arp46_t)); arp= (arp46_t *)ptr2acc_data(data); data->acc_offset += offset; data->acc_length= count; if (arp_port->ap_write_code == ARP_REPLY) arp->a46_dstaddr= arp_port->ap_write_ethaddr; else { arp->a46_dstaddr.ea_addr[0]= 0xff; arp->a46_dstaddr.ea_addr[1]= 0xff; arp->a46_dstaddr.ea_addr[2]= 0xff; arp->a46_dstaddr.ea_addr[3]= 0xff; arp->a46_dstaddr.ea_addr[4]= 0xff; arp->a46_dstaddr.ea_addr[5]= 0xff; } arp->a46_hdr= HTONS(ARP_ETHERNET); arp->a46_pro= HTONS(ETH_IP_PROTO); arp->a46_hln= 6; arp->a46_pln= 4; arp->a46_op= htons(arp_port->ap_write_code); arp->a46_sha= arp_port->ap_ethaddr; memcpy (arp->a46_spa, &arp_port->ap_ipaddr, sizeof(ipaddr_t)); arp->a46_tha= arp_port->ap_write_ethaddr; memcpy (arp->a46_tpa, &arp_port->ap_write_ipaddr, sizeof(ipaddr_t)); return data; default: #if !CRAMPED printf("arp_getdata(%d, 0x%d, 0x%d) called but ap_state=0x%x\n", fd, offset, count, arp_port->ap_state); #endif break; } return 0; } PRIVATE int arp_putdata (fd, offset, data, for_ioctl) int fd; size_t offset; acc_t *data; int for_ioctl; { arp_port_t *arp_port; int result; struct nwio_ethstat *ethstat; arp_port= &arp_port_table[fd]; if (arp_port->ap_flags & APF_ARP_RD_IP) { if (!data) { result= (int)offset; if (result<0) { DIFBLOCK(1, (result != NW_SUSPEND), printf( "arp.c: read error on port %d: error %d\n", fd, result)); return NW_OK; } if (arp_port->ap_flags & APF_ARP_RD_SP) { arp_port->ap_flags &= ~(APF_ARP_RD_IP| APF_ARP_RD_SP); setup_read(arp_port); } else arp_port->ap_flags &= ~(APF_ARP_RD_IP| APF_ARP_RD_SP); return NW_OK; } assert (!offset); /* Warning: the above assertion is illega((((((((((l; puts and gets of data can be brokenup in any piece the server likes. However we assume that the server is eth.c and it transfers only whole packets. */ data= bf_packIffLess(data, sizeof(arp46_t)); if (data->acc_length >= sizeof(arp46_t)) process_arp_req(arp_port,data); bf_afree(data); return NW_OK; } switch (arp_port->ap_state) { case APS_GETADDR: if (!data) { result= (int)offset; if (result<0) { arp_port->ap_state= APS_ERROR; break; } if (arp_port->ap_flags & APF_SUSPEND) { arp_port->ap_flags &= ~APF_SUSPEND; arp_main(arp_port); } return NW_OK; } compare (bf_bufsize(data), ==, sizeof(*ethstat)); data= bf_packIffLess(data, sizeof(*ethstat)); compare (data->acc_length, ==, sizeof(*ethstat)); ethstat= (struct nwio_ethstat *)ptr2acc_data(data); arp_port->ap_ethaddr= ethstat->nwes_addr; bf_afree(data); return NW_OK; default: #if !CRAMPED printf("arp_putdata(%d, 0x%d, 0x%lx) called but ap_state=0x%x\n", fd, offset, (unsigned long)data, arp_port->ap_state); #endif break; } return EGENERIC; } PRIVATE void setup_read(arp_port) arp_port_t *arp_port; { int result; while (!(arp_port->ap_flags & APF_ARP_RD_IP)) { arp_port->ap_flags |= APF_ARP_RD_IP; result= eth_read (arp_port->ap_eth_fd, ETH_MAX_PACK_SIZE); if (result == NW_SUSPEND) { arp_port->ap_flags |= APF_ARP_RD_SP; return; } DIFBLOCK(1, (result != NW_OK), printf("arp.c: eth_read(..,%d)=%d\n", ETH_MAX_PACK_SIZE, result)); } } PRIVATE void setup_write(arp_port) arp_port_t *arp_port; { int i, result; while (arp_port->ap_flags & APF_MORE2WRITE) { if (arp_port->ap_flags & APF_CLIENTWRITE) { arp_port->ap_flags &= ~APF_CLIENTWRITE; arp_port->ap_write_ipaddr= arp_port->ap_req_ipaddr; arp_port->ap_write_code= ARP_REQUEST; clck_timer(&arp_port->ap_timer, get_time() + ARP_TIMEOUT, arp_timeout, arp_port->ap_eth_port); } else { arp_cache_t *cache; cache= arp_cache; for (i=0; iac_flags & ACF_GOTREQ) && cache->ac_port == arp_port) { cache->ac_flags &= ~ACF_GOTREQ; arp_port->ap_write_ethaddr= cache-> ac_ethaddr; arp_port->ap_write_ipaddr= cache-> ac_ipaddr; arp_port->ap_write_code= ARP_REPLY; break; } } if (i>=ARP_CACHE_NR) { arp_port->ap_flags &= ~APF_MORE2WRITE; break; } } arp_port->ap_flags= (arp_port->ap_flags & ~APF_ARP_WR_SP) | APF_ARP_WR_IP; result= eth_write(arp_port->ap_eth_fd, sizeof(arp46_t)); if (result == NW_SUSPEND) arp_port->ap_flags |= APF_ARP_WR_SP; if (result<0) { DIFBLOCK(1, (result != NW_SUSPEND), printf("arp.c: eth_write(..,%d)=%d\n", sizeof(arp46_t), result)); return; } } } PRIVATE void process_arp_req (arp_port, data) arp_port_t *arp_port; acc_t *data; { arp46_t *arp; arp_cache_t *ce; int level; time_t curr_time; ipaddr_t spa, tpa; curr_time= get_time(); arp= (arp46_t *)ptr2acc_data(data); memcpy(&spa, arp->a46_spa, sizeof(ipaddr_t)); memcpy(&tpa, arp->a46_tpa, sizeof(ipaddr_t)); if (arp->a46_hdr != HTONS(ARP_ETHERNET) || arp->a46_hln != 6 || arp->a46_pro != HTONS(ETH_IP_PROTO) || arp->a46_pln != 4) return; ce= find_cache_ent(arp_port, spa); if (ce && ce->ac_expire < curr_time) { DBLOCK(0x10, printf("arp: expiring entry for "); writeIpAddr(ce->ac_ipaddr); printf("\n")); ce->ac_state= ACS_UNUSED; ce= NULL; } if (ce == NULL) { if (tpa != arp_port->ap_ipaddr) return; DBLOCK(0x10, printf("arp: allocating entry for "); writeIpAddr(spa); printf("\n")); ce= alloc_cache_ent(); ce->ac_flags= ACF_EMPTY; ce->ac_state= ACS_VALID; ce->ac_ethaddr= arp->a46_sha; ce->ac_ipaddr= spa; ce->ac_port= arp_port; ce->ac_expire= curr_time+ARP_EXP_TIME; ce->ac_lastuse= curr_time-ARP_INUSE_OFFSET; /* never used */ } if (ce->ac_state == ACS_INCOMPLETE || ce->ac_state == ACS_UNREACHABLE) { ce->ac_ethaddr= arp->a46_sha; if (ce->ac_state == ACS_INCOMPLETE) { ce->ac_state= ACS_VALID; client_reply(arp_port, spa, &arp->a46_sha); } else ce->ac_state= ACS_VALID; } /* Update fields in the arp cache. */ #if !CRAMPED if (memcmp(&ce->ac_ethaddr, &arp->a46_sha, sizeof(ce->ac_ethaddr)) != 0) { printf("arp: ethernet address for IP address "); writeIpAddr(spa); printf(" changed from "); writeEtherAddr(&ce->ac_ethaddr); printf(" to "); writeEtherAddr(&arp->a46_sha); printf("\n"); ce->ac_ethaddr= arp->a46_sha; } #else ce->ac_ethaddr= arp->a46_sha; #endif ce->ac_expire= curr_time+ARP_EXP_TIME; if (arp->a46_op == HTONS(ARP_REQUEST) && (tpa == arp_port->ap_ipaddr)) { ce->ac_flags |= ACF_GOTREQ; arp_port->ap_flags |= APF_MORE2WRITE; if (!(arp_port->ap_flags & APF_ARP_WR_IP)) setup_write(arp_port); } } PRIVATE void client_reply (arp_port, ipaddr, ethaddr) arp_port_t *arp_port; ipaddr_t ipaddr; ether_addr_t *ethaddr; { if ((arp_port->ap_flags & APF_CLIENTREQ) && ipaddr == arp_port->ap_req_ipaddr) { arp_port->ap_flags &= ~(APF_CLIENTREQ|APF_CLIENTWRITE); clck_untimer(&arp_port->ap_timer); } (*arp_port->ap_arp_func)(arp_port->ap_eth_port, ipaddr, ethaddr); } PRIVATE arp_cache_t *find_cache_ent (arp_port, ipaddr) arp_port_t *arp_port; ipaddr_t ipaddr; { arp_cache_t *cache; int i; for (i=0, cache= arp_cache; iac_state != ACS_UNUSED && cache->ac_port == arp_port && cache->ac_ipaddr == ipaddr) { return cache; } } return NULL; } PRIVATE arp_cache_t *alloc_cache_ent() { arp_cache_t *cache, *old; int i; old= NULL; for (i=0, cache= arp_cache; iac_state == ACS_UNUSED) return cache; if (cache->ac_state == ACS_INCOMPLETE) continue; if (!old || cache->ac_lastuse < old->ac_lastuse) old= cache; } assert(old); return old; } PUBLIC void arp_set_ipaddr (eth_port, ipaddr) int eth_port; ipaddr_t ipaddr; { arp_port_t *arp_port; int i; if (eth_port < 0 || eth_port >= eth_conf_nr) return; arp_port= &arp_port_table[eth_port]; arp_port->ap_ipaddr= ipaddr; arp_port->ap_flags |= APF_INADDR_SET; arp_port->ap_flags &= ~APF_SUSPEND; if (arp_port->ap_state == APS_GETADDR) arp_main(arp_port); } PUBLIC int arp_set_cb(eth_port, ip_port, arp_func) int eth_port; int ip_port; arp_func_t arp_func; { arp_port_t *arp_port; int i; assert(eth_port >= 0); if (eth_port >= eth_conf_nr) return ENXIO; arp_port= &arp_port_table[eth_port]; arp_port->ap_eth_port= eth_port; arp_port->ap_ip_port= ip_port; arp_port->ap_state= APS_INITIAL; arp_port->ap_flags= APF_EMPTY; arp_port->ap_arp_func= arp_func; arp_main(arp_port); return NW_OK; } PUBLIC int arp_ip_eth (eth_port, ipaddr, ethaddr) int eth_port; ipaddr_t ipaddr; ether_addr_t *ethaddr; { arp_port_t *arp_port; int i; arp_cache_t *ce; time_t curr_time; assert(eth_port >= 0 && eth_port < eth_conf_nr); arp_port= &arp_port_table[eth_port]; assert(arp_port->ap_state == APS_ARPMAIN || (printf("ap_state= %d\n", arp_port->ap_state), 0)); curr_time= get_time(); ce= find_cache_ent (arp_port, ipaddr); if (ce && ce->ac_expire < curr_time) { ce->ac_state= ACS_UNUSED; ce= NULL; } if (ce) { /* Found an entry. This entry should be valid, unreachable * or incomplete. */ ce->ac_lastuse= curr_time; if (ce->ac_state == ACS_VALID) { *ethaddr= ce->ac_ethaddr; return NW_OK; } if (ce->ac_state == ACS_UNREACHABLE) return EDSTNOTRCH; assert(ce->ac_state == ACS_INCOMPLETE); return NW_SUSPEND; } if (arp_port->ap_flags & APF_CLIENTREQ) { /* We should implement something to be able to do * multiple arp lookups at the same time. At the moment * we just return SUSPEND. */ return NW_SUSPEND; } ce= alloc_cache_ent(); ce->ac_flags= 0; ce->ac_state= ACS_INCOMPLETE; ce->ac_ipaddr= ipaddr; ce->ac_port= arp_port; ce->ac_expire= curr_time+ARP_EXP_TIME; ce->ac_lastuse= curr_time; arp_port->ap_flags |= APF_CLIENTREQ|APF_MORE2WRITE | APF_CLIENTWRITE; arp_port->ap_req_ipaddr= ipaddr; arp_port->ap_req_count= 0; if (!(arp_port->ap_flags & APF_ARP_WR_IP)) setup_write(arp_port); return NW_SUSPEND; } PRIVATE void arp_timeout (fd, timer) int fd; timer_t *timer; { arp_port_t *arp_port; arp_cache_t *ce; int level; time_t curr_time; arp_port= &arp_port_table[fd]; assert (timer == &arp_port->ap_timer); if (++arp_port->ap_req_count < MAX_ARP_RETRIES) { arp_port->ap_flags |= APF_CLIENTWRITE|APF_MORE2WRITE; if (!(arp_port->ap_flags & APF_ARP_WR_IP)) setup_write(arp_port); } else { ce= find_cache_ent(arp_port, arp_port->ap_req_ipaddr); if (ce) { assert(ce->ac_state == ACS_INCOMPLETE || (printf("ce->ac_state= %d\n", ce->ac_state),0)); curr_time= get_time(); ce->ac_state= ACS_UNREACHABLE; ce->ac_expire= curr_time+ ARP_NOTRCH_EXP_TIME; ce->ac_lastuse= curr_time; client_reply(arp_port, ce->ac_ipaddr, NULL); } } } /* * $PchId: arp.c,v 1.6 1995/11/21 06:45:27 philip Exp $ */ /* arp.h Copyright 1995 Philip Homburg */ #ifndef ARP_H #define ARP_H #define ARP_ETHERNET 1 #define ARP_REQUEST 1 #define ARP_REPLY 2 /* Prototypes */ typedef void (*arp_func_t) ARGS(( int fd, ipaddr_t ipaddr, ether_addr_t *ethaddr )); void arp_prep ARGS(( void )); void arp_init ARGS(( void )); void arp_set_ipaddr ARGS(( int eth_port, ipaddr_t ipaddr )); int arp_set_cb ARGS(( int eth_port, int ip_port, arp_func_t arp_func )); int arp_ip_eth ARGS(( int eth_port, ipaddr_t ipaddr, ether_addr_t *ethaddr )); #endif /* ARP_H */ /* * $PchId: arp.h,v 1.5 1995/11/21 06:45:27 philip Exp $ */ /* assert.h Copyright 1995 Philip Homburg */ #ifndef INET_ASSERT_H #define INET_ASSERT_H #if !NDEBUG void bad_assertion(char *file, int line, char *what); void bad_compare(char *file, int line, int lhs, char *what, int rhs); #define assert(x) (!(x) ? bad_assertion(this_file, __LINE__, #x) \ : (void) 0) #define compare(a,t,b) (!((a) t (b)) ? bad_compare(this_file, __LINE__, \ (a), #a " " #t " " #b, (b)) : (void) 0) #else /* NDEBUG */ #define assert(x) 0 #define compare(a,t,b) 0 #endif /* NDEBUG */ #endif /* INET_ASSERT_H */ /* * $PchId: assert.h,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* buf.h Copyright 1995 Philip Homburg */ #ifndef BUF_H #define BUF_H /* Note: BUF_S should be defined in const.h */ #define MAX_BUFREQ_PRI 10 #define ETH_PRI_PORTBUFS 3 #define ETH_PRI_FDBUFS_EXTRA 5 #define ETH_PRI_FDBUFS 6 #define IP_PRI_PORTBUFS 3 #define IP_PRI_ASSBUFS 4 #define IP_PRI_FDBUFS_EXTRA 5 #define IP_PRI_FDBUFS 6 #define ICMP_PRI_QUEUE 1 #define TCP_PRI_FRAG2SEND 4 #define TCP_PRI_CONN_EXTRA 5 #define TCP_PRI_CONNwoUSER 7 #define TCP_PRI_CONN_INUSE 9 #define UDP_PRI_FDBUFS_EXTRA 5 #define UDP_PRI_FDBUFS 6 #define PSIP_PRI_EXP_PROMISC 2 struct acc; typedef void (*buffree_t) ARGS(( struct acc *acc )); typedef void (*bf_freereq_t) ARGS(( int priority )); #ifdef BUF_CONSISTENCY_CHECK typedef void (*bf_checkreq_t) ARGS(( void )); #endif typedef struct buf { int buf_linkC; buffree_t buf_free; size_t buf_size; char *buf_data_p; #ifdef BUF_TRACK_ALLOC_FREE char *buf_alloc_file; int buf_alloc_line; char *buf_free_file; int buf_free_line; #endif #ifdef BUF_CONSISTENCY_CHECK unsigned buf_generation; int buf_check_linkC; #endif } buf_t; typedef struct acc { int acc_linkC; int acc_offset, acc_length; buf_t *acc_buffer; struct acc *acc_next, *acc_ext_link; #ifdef BUF_TRACK_ALLOC_FREE char *acc_alloc_file; int acc_alloc_line; char *acc_free_file; int acc_free_line; #endif #ifdef BUF_CONSISTENCY_CHECK unsigned acc_generation; int acc_check_linkC; #endif } acc_t; extern acc_t *bf_temporary_acc; /* For debugging... */ #ifdef BUF_TRACK_ALLOC_FREE #ifndef BUF_IMPLEMENTATION #define bf_memreq(a) _bf_memreq(this_file, __LINE__, a) #define bf_cut(a,b,c) _bf_cut(this_file, __LINE__, a, b, c) #define bf_delhead(a,b) _bf_delhead(this_file, __LINE__, a, b) #define bf_packIffLess(a,b) _bf_packIffLess(this_file, __LINE__, \ a, b) #define bf_afree(a) _bf_afree(this_file, __LINE__, a) #define bf_pack(a) _bf_pack(this_file, __LINE__, a) #define bf_append(a,b) _bf_append(this_file, __LINE__, a, b) #define bf_dupacc(a) _bf_dupacc(this_file, __LINE__, a) #define bf_mark_acc(a) _bf_mark_acc(this_file, __LINE__, a) #define bf_align(a,s,al) _bf_align(this_file, __LINE__, a, s, al) #else /* BUF_IMPLEMENTATION */ #define bf_afree(a) _bf_afree(clnt_file, clnt_line, a) #define bf_pack(a) _bf_pack(clnt_file, clnt_line, a) #define bf_memreq(a) _bf_memreq(clnt_file, clnt_line, a) #define bf_dupacc(a) _bf_dupacc(clnt_file, clnt_line, a) #define bf_cut(a,b,c) _bf_cut(clnt_file, clnt_line, a, b, c) #define bf_delhead(a,b) _bf_delhead(clnt_file, clnt_line, a, b) #define bf_align(a,s,al) _bf_align(clnt_file, clnt_line, a, s, al) #endif /* !BUF_IMPLEMENTATION */ #else #define bf_mark_acc(acc) ((void)0) #endif /* BUF_TRACK_ALLOC_FREE */ /* Prototypes */ void bf_init ARGS(( void )); #ifndef BUF_CONSISTENCY_CHECK void bf_logon ARGS(( bf_freereq_t func )); #else void bf_logon ARGS(( bf_freereq_t func, bf_checkreq_t checkfunc )); #endif #ifndef BUF_TRACK_ALLOC_FREE acc_t *bf_memreq ARGS(( unsigned size)); #else acc_t *_bf_memreq ARGS(( char *clnt_file, int clnt_line, unsigned size)); #endif /* the result is an acc with linkC == 1 */ #ifndef BUF_TRACK_ALLOC_FREE acc_t *bf_dupacc ARGS(( acc_t *acc )); #else acc_t *_bf_dupacc ARGS(( char *clnt_file, int clnt_line, acc_t *acc )); #endif /* the result is an acc with linkC == 1 identical to the given one */ #ifndef BUF_TRACK_ALLOC_FREE void bf_afree ARGS(( acc_t *acc)); #else void _bf_afree ARGS(( char *clnt_file, int clnt_line, acc_t *acc)); #endif /* this reduces the linkC off the given acc with one */ #ifndef BUF_TRACK_ALLOC_FREE acc_t *bf_pack ARGS(( acc_t *pack)); #else acc_t *_bf_pack ARGS(( char *clnt_file, int clnt_line, acc_t *pack)); #endif /* this gives a packed copy of the given acc, the linkC of the given acc is reduced by one, the linkC of the result == 1 */ #ifndef BUF_TRACK_ALLOC_FREE acc_t *bf_packIffLess ARGS(( acc_t *pack, int min_len )); #else acc_t *_bf_packIffLess ARGS(( char *clnt_file, int clnt_line, acc_t *pack, int min_len )); #endif /* this performs a bf_pack iff pack->acc_lengthacc_buffer->buf_data_p[bf_temporary_acc-> \ acc_offset])) #define bf_chkbuf(buf) ((buf)? (compare((buf)->acc_linkC,>,0), \ compare((buf)->acc_buffer, !=, 0), \ compare((buf)->acc_buffer->buf_linkC,>,0)) : 0) #ifdef BUF_CONSISTENCY_CHECK int bf_consistency_check ARGS(( void )); void bf_check_acc ARGS(( acc_t *acc )); void _bf_mark_acc ARGS(( char *clnt_file, int clnt_line, acc_t *acc )); #endif #endif /* BUF_H */ /* * $PchId: buf.h,v 1.8 1995/11/21 06:45:27 philip Exp $ */ /* clock.h Copyright 1995 Philip Homburg */ #ifndef CLOCK_H #define CLOCK_H struct timer; typedef void (*timer_func_t) ARGS(( int fd, struct timer *timer )); typedef struct timer { struct timer *tim_next; timer_func_t tim_func; int tim_ref; time_t tim_time; int tim_active; } timer_t; extern int clck_call_expire; /* Call clck_expire_timer from the mainloop */ void clck_init ARGS(( void )); void set_time ARGS(( time_t time )); time_t get_time ARGS(( void )); void reset_time ARGS(( void )); /* set a timer to go off at the time specified by timeout */ void clck_timer ARGS(( struct timer *timer, time_t timeout, timer_func_t func, int fd )); void clck_untimer ARGS(( struct timer *timer )); void clck_expire_timers ARGS(( void )); #endif /* CLOCK_H */ /* * $PchId: clock.h,v 1.5 1995/11/21 06:45:27 philip Exp $ */ /* eth.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "osdep_eth.h" #include "type.h" #include "assert.h" #include "buf.h" #include "eth.h" #include "eth_int.h" #include "io.h" #include "sr.h" THIS_FILE #define ETH_FD_NR (4*IP_PORT_MAX) #define EXPIRE_TIME 60*HZ /* seconds */ typedef struct eth_fd { int ef_flags; nwio_ethopt_t ef_ethopt; eth_port_t *ef_port; struct eth_fd *ef_type_next; int ef_srfd; acc_t *ef_rdbuf_head; acc_t *ef_rdbuf_tail; get_userdata_t ef_get_userdata; put_userdata_t ef_put_userdata; put_pkt_t ef_put_pkt; time_t ef_exp_time; size_t ef_write_count; } eth_fd_t; #define EFF_FLAGS 0xf # define EFF_EMPTY 0x0 # define EFF_INUSE 0x1 # define EFF_BUSY 0x6 # define EFF_READ_IP 0x2 # define EFF_WRITE_IP 0x4 # define EFF_OPTSET 0x8 FORWARD int eth_checkopt ARGS(( eth_fd_t *eth_fd )); FORWARD void hash_fd ARGS(( eth_fd_t *eth_fd )); FORWARD void unhash_fd ARGS(( eth_fd_t *eth_fd )); FORWARD void eth_buffree ARGS(( int priority )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void eth_bufcheck ARGS(( void )); #endif FORWARD void packet2user ARGS(( eth_fd_t *fd, acc_t *pack, time_t exp_time )); FORWARD void reply_thr_get ARGS(( eth_fd_t *eth_fd, size_t result, int for_ioctl )); FORWARD void reply_thr_put ARGS(( eth_fd_t *eth_fd, size_t result, int for_ioctl )); FORWARD u32_t compute_rec_conf ARGS(( eth_port_t *eth_port )); PUBLIC eth_port_t *eth_port_table; PRIVATE eth_fd_t eth_fd_table[ETH_FD_NR]; PRIVATE ether_addr_t broadcast= { { 255, 255, 255, 255, 255, 255 } }; PUBLIC void eth_prep() { eth_port_table= alloc(eth_conf_nr * sizeof(eth_port_table[0])); } PUBLIC void eth_init() { int i, j; assert (BUF_S >= sizeof(nwio_ethopt_t)); assert (BUF_S >= ETH_HDR_SIZE); /* these are in fact static assertions, thus a good compiler doesn't generate any code for this */ #if ZERO for (i=0; ietp_flags & EPF_ENABLED)) return EGENERIC; for (i=0; i=ETH_FD_NR) { DBLOCK(1, printf("out of fds\n")); return EAGAIN; } eth_fd= ð_fd_table[i]; eth_fd->ef_flags= EFF_INUSE; eth_fd->ef_ethopt.nweo_flags=NWEO_DEFAULT; eth_fd->ef_port= eth_port; eth_fd->ef_srfd= srfd; assert(eth_fd->ef_rdbuf_head == NULL); eth_fd->ef_get_userdata= get_userdata; eth_fd->ef_put_userdata= put_userdata; eth_fd->ef_put_pkt= put_pkt; return i; } PUBLIC int eth_ioctl(fd, req) int fd; ioreq_t req; { acc_t *data; eth_fd_t *eth_fd; eth_port_t *eth_port; DBLOCK(0x20, printf("eth_ioctl (%d, %lu)\n", fd, req)); eth_fd= ð_fd_table[fd]; eth_port= eth_fd->ef_port; assert (eth_fd->ef_flags & EFF_INUSE); switch (req) { case NWIOSETHOPT: { nwio_ethopt_t *ethopt; nwio_ethopt_t oldopt, newopt; int result; u32_t new_en_flags, new_di_flags, old_en_flags, old_di_flags; u32_t flags; data= (*eth_fd->ef_get_userdata)(eth_fd-> ef_srfd, 0, sizeof(nwio_ethopt_t), TRUE); ethopt= (nwio_ethopt_t *)ptr2acc_data(data); oldopt= eth_fd->ef_ethopt; newopt= *ethopt; old_en_flags= oldopt.nweo_flags & 0xffff; old_di_flags= (oldopt.nweo_flags >> 16) & 0xffff; new_en_flags= newopt.nweo_flags & 0xffff; new_di_flags= (newopt.nweo_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) { bf_afree(data); reply_thr_get (eth_fd, EBADMODE, TRUE); return NW_OK; } /* NWEO_ACC_MASK */ if (new_di_flags & NWEO_ACC_MASK) { bf_afree(data); reply_thr_get (eth_fd, EBADMODE, TRUE); return NW_OK; } /* you can't disable access modes */ if (!(new_en_flags & NWEO_ACC_MASK)) new_en_flags |= (old_en_flags & NWEO_ACC_MASK); /* NWEO_LOC_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_LOC_MASK)) { new_en_flags |= (old_en_flags & NWEO_LOC_MASK); new_di_flags |= (old_di_flags & NWEO_LOC_MASK); } /* NWEO_BROAD_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_BROAD_MASK)) { new_en_flags |= (old_en_flags & NWEO_BROAD_MASK); new_di_flags |= (old_di_flags & NWEO_BROAD_MASK); } /* NWEO_MULTI_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_MULTI_MASK)) { new_en_flags |= (old_en_flags & NWEO_MULTI_MASK); new_di_flags |= (old_di_flags & NWEO_MULTI_MASK); newopt.nweo_multi= oldopt.nweo_multi; } /* NWEO_PROMISC_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_PROMISC_MASK)) { new_en_flags |= (old_en_flags & NWEO_PROMISC_MASK); new_di_flags |= (old_di_flags & NWEO_PROMISC_MASK); } /* NWEO_REM_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_REM_MASK)) { new_en_flags |= (old_en_flags & NWEO_REM_MASK); new_di_flags |= (old_di_flags & NWEO_REM_MASK); newopt.nweo_rem= oldopt.nweo_rem; } /* NWEO_TYPE_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_TYPE_MASK)) { new_en_flags |= (old_en_flags & NWEO_TYPE_MASK); new_di_flags |= (old_di_flags & NWEO_TYPE_MASK); newopt.nweo_type= oldopt.nweo_type; } /* NWEO_RW_MASK */ if (!((new_en_flags | new_di_flags) & NWEO_RW_MASK)) { new_en_flags |= (old_en_flags & NWEO_RW_MASK); new_di_flags |= (old_di_flags & NWEO_RW_MASK); } if (eth_fd->ef_flags & EFF_OPTSET) unhash_fd(eth_fd); newopt.nweo_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; eth_fd->ef_ethopt= newopt; result= eth_checkopt(eth_fd); if (result<0) eth_fd->ef_ethopt= oldopt; else { unsigned long opt_flags; unsigned changes; opt_flags= oldopt.nweo_flags ^ eth_fd->ef_ethopt.nweo_flags; changes= ((opt_flags >> 16) | opt_flags) & 0xffff; if (changes & (NWEO_BROAD_MASK | NWEO_MULTI_MASK | NWEO_PROMISC_MASK)) { flags= compute_rec_conf(eth_port); eth_set_rec_conf(eth_port, flags); } } if (eth_fd->ef_flags & EFF_OPTSET) hash_fd(eth_fd); bf_afree(data); reply_thr_get (eth_fd, result, TRUE); return NW_OK; } case NWIOGETHOPT: { nwio_ethopt_t *ethopt; acc_t *acc; int result; acc= bf_memreq(sizeof(nwio_ethopt_t)); ethopt= (nwio_ethopt_t *)ptr2acc_data(acc); *ethopt= eth_fd->ef_ethopt; result= (*eth_fd->ef_put_userdata)(eth_fd-> ef_srfd, 0, acc, TRUE); if (result >= 0) reply_thr_put(eth_fd, NW_OK, TRUE); return result; } case NWIOGETHSTAT: { nwio_ethstat_t *ethstat; acc_t *acc; int result; assert (sizeof(nwio_ethstat_t) <= BUF_S); eth_port= eth_fd->ef_port; if (!(eth_port->etp_flags & EPF_ENABLED)) { reply_thr_put(eth_fd, EGENERIC, TRUE); return NW_OK; } acc= bf_memreq(sizeof(nwio_ethstat_t)); compare (bf_bufsize(acc), ==, sizeof(*ethstat)); ethstat= (nwio_ethstat_t *)ptr2acc_data(acc); ethstat->nwes_addr= eth_port->etp_ethaddr; result= eth_get_stat(eth_port, ðstat->nwes_stat); assert (result == 0); compare (bf_bufsize(acc), ==, sizeof(*ethstat)); result= (*eth_fd->ef_put_userdata)(eth_fd-> ef_srfd, 0, acc, TRUE); if (result >= 0) reply_thr_put(eth_fd, NW_OK, TRUE); return result; } default: break; } reply_thr_put(eth_fd, EBADIOCTL, TRUE); return NW_OK; } PUBLIC int eth_write(fd, count) int fd; size_t count; { eth_fd_t *eth_fd; eth_port_t *eth_port; acc_t *user_data; int r; eth_fd= ð_fd((((((((((((((_table[fd]; eth_port= eth_fd->ef_port; if (!(eth_fd->ef_flags & EFF_OPTSET)) { reply_thr_get (eth_fd, EBADMODE, FALSE); return NW_OK; } assert (!(eth_fd->ef_flags & EFF_WRITE_IP)); eth_fd->ef_write_count= count; if (eth_fd->ef_ethopt.nweo_flags & NWEO_RWDATONLY) count += ETH_HDR_SIZE; if (countETH_MAX_PACK_SIZE) { DBLOCK(1, printf("illegal packetsize (%d)\n",count)); reply_thr_get (eth_fd, EPACKSIZE, FALSE); return NW_OK; } eth_fd->ef_flags |= EFF_WRITE_IP; if (eth_port->etp_wr_pack) { eth_port->etp_flags |= EPF_MORE2WRITE; return NW_SUSPEND; } user_data= (*eth_fd->ef_get_userdata)(eth_fd->ef_srfd, 0, eth_fd->ef_write_count, FALSE); if (!user_data) { eth_fd->ef_flags &= ~EFF_WRITE_IP; reply_thr_get (eth_fd, EFAULT, FALSE); return NW_OK; } r= eth_send(fd, user_data, eth_fd->ef_write_count); assert(r == NW_OK); eth_fd->ef_flags &= ~EFF_WRITE_IP; reply_thr_get(eth_fd, eth_fd->ef_write_count, FALSE); return NW_OK; } PUBLIC int eth_send(fd, data, data_len) int fd; acc_t *data; size_t data_len; { eth_fd_t *eth_fd; eth_port_t *eth_port; eth_hdr_t *eth_hdr; acc_t *eth_pack; unsigned long nweo_flags; size_t count; ev_arg_t ev_arg; eth_fd= ð_fd_table[fd]; eth_port= eth_fd->ef_port; if (!(eth_fd->ef_flags & EFF_OPTSET)) return EBADMODE; count= data_len; if (eth_fd->ef_ethopt.nweo_flags & NWEO_RWDATONLY) count += ETH_HDR_SIZE; if (countETH_MAX_PACK_SIZE) { DBLOCK(1, printf("illegal packetsize (%d)\n",count)); return EPACKSIZE; } if (eth_port->etp_wr_pack) return NW_WOULDBLOCK; nweo_flags= eth_fd->ef_ethopt.nweo_flags; if (nweo_flags & NWEO_RWDATONLY) { eth_pack= bf_memreq(ETH_HDR_SIZE); eth_pack->acc_next= data; } else eth_pack= bf_packIffLess(data, ETH_HDR_SIZE); eth_hdr= (eth_hdr_t *)ptr2acc_data(eth_pack); if (nweo_flags & NWEO_REMSPEC) eth_hdr->eh_dst= eth_fd->ef_ethopt.nweo_rem; if (!(nweo_flags & NWEO_EN_PROMISC)) eth_hdr->eh_src= eth_port->etp_ethaddr; if (nweo_flags & NWEO_TYPESPEC) eth_hdr->eh_proto= eth_fd->ef_ethopt.nweo_type; if (eth_addrcmp(eth_hdr->eh_dst, eth_port->etp_ethaddr) == 0) { /* Local loopback. */ eth_port->etp_wr_pack= eth_pack; ev_arg.ev_ptr= eth_port; ev_enqueue(ð_port->etp_sendev, eth_loop_ev, ev_arg); } else eth_write_port(eth_port, eth_pack); return NW_OK; } PUBLIC int eth_read (fd, count) int fd; size_t count; { eth_fd_t *eth_fd; acc_t *pack; eth_fd= ð_fd_table[fd]; if (!(eth_fd->ef_flags & EFF_OPTSET)) { reply_thr_put(eth_fd, EBADMODE, FALSE); return NW_OK; } if (count < ETH_MAX_PACK_SIZE) { reply_thr_put(eth_fd, EPACKSIZE, FALSE); return NW_OK; } assert(!(eth_fd->ef_flags & EFF_READ_IP)); eth_fd->ef_flags |= EFF_READ_IP; while (eth_fd->ef_rdbuf_head) { pack= eth_fd->ef_rdbuf_head; eth_fd->ef_rdbuf_head= pack->acc_ext_link; if (get_time() <= eth_fd->ef_exp_time) { packet2user(eth_fd, pack, eth_fd->ef_exp_time); if (!(eth_fd->ef_flags & EFF_READ_IP)) return NW_OK; } else bf_afree(pack); } return NW_SUSPEND; } PUBLIC int eth_cancel(fd, which_operation) int fd; int which_operation; { eth_fd_t *eth_fd; DBLOCK(2, printf("eth_cancel (%d)\n", fd)); eth_fd= ð_fd_table[fd]; switch (which_operation) { case SR_CANCEL_READ: assert (eth_fd->ef_flags & EFF_READ_IP); eth_fd->ef_flags &= ~EFF_READ_IP; reply_thr_put(eth_fd, EINTR, FALSE); break; case SR_CANCEL_WRITE: assert (eth_fd->ef_flags & EFF_WRITE_IP); eth_fd->ef_flags &= ~EFF_WRITE_IP; reply_thr_get(eth_fd, EINTR, FALSE); break; #if !CRAMPED default: ip_panic(( "got unknown cancel request" )); #endif } return NW_OK; } PUBLIC void eth_close(fd) int fd; { eth_fd_t *eth_fd; eth_port_t *eth_port; u32_t flags; acc_t *pack; eth_fd= ð_fd_table[fd]; assert ((eth_fd->ef_flags & EFF_INUSE) && !(eth_fd->ef_flags & EFF_BUSY)); if (eth_fd->ef_flags & EFF_OPTSET) unhash_fd(eth_fd); while (eth_fd->ef_rdbuf_head != NULL) { pack= eth_fd->ef_rdbuf_head; eth_fd->ef_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } eth_fd->ef_flags= EFF_EMPTY; eth_port= eth_fd->ef_port; flags= compute_rec_conf(eth_port); eth_set_rec_conf(eth_port, flags); } PUBLIC void eth_loop_ev(ev, ev_arg) event_t *ev; ev_arg_t ev_arg; { acc_t *pack; eth_port_t *eth_port; eth_port= ev_arg.ev_ptr; assert(ev == ð_port->etp_sendev); pack= eth_port->etp_wr_pack; eth_arrive(eth_port, pack, bf_bufsize(pack)); eth_port->etp_wr_pack= NULL; eth_restart_write(eth_port); } PRIVATE int eth_checkopt (eth_fd) eth_fd_t *eth_fd; { /* bug: we don't check access modes yet */ unsigned long flags; unsigned int en_di_flags; eth_port_t *eth_port; acc_t *pack; eth_port= eth_fd->ef_port; flags= eth_fd->ef_ethopt.nweo_flags; en_di_flags= (flags >>16) | (flags & 0xffff); if ((en_di_flags & NWEO_ACC_MASK) && (en_di_flags & NWEO_LOC_MASK) && (en_di_flags & NWEO_BROAD_MASK) && (en_di_flags & NWEO_MULTI_MASK) && (en_di_flags & NWEO_PROMISC_MASK) && (en_di_flags & NWEO_REM_MASK) && (en_di_flags & NWEO_TYPE_MASK) && (en_di_flags & NWEO_RW_MASK)) { eth_fd->ef_flags |= EFF_OPTSET; } else eth_fd->ef_flags &= ~EFF_OPTSET; while (eth_fd->ef_rdbuf_head != NULL) { pack= eth_fd->ef_rdbuf_head; eth_fd->ef_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } return NW_OK; } PRIVATE void hash_fd(eth_fd) eth_fd_t *eth_fd; { eth_port_t *eth_port; int hash; eth_port= eth_fd->ef_port; if (eth_fd->ef_ethopt.nweo_flags & NWEO_TYPEANY) { eth_fd->ef_type_next= eth_port->etp_type_any; eth_port->etp_type_any= eth_fd; } else { hash= eth_fd->ef_ethopt.nweo_type; hash ^= (hash >> 8); hash &= (ETH_TYPE_HASH_NR-1); eth_fd->ef_type_next= eth_port->etp_type[hash]; eth_port->etp_type[hash]= eth_fd; } } PRIVATE void unhash_fd(eth_fd) eth_fd_t *eth_fd; { eth_port_t *eth_port; eth_fd_t *prev, *curr, **eth_fd_p; int hash; eth_port= eth_fd->ef_port; if (eth_fd->ef_ethopt.nweo_flags & NWEO_TYPEANY) { eth_fd_p= ð_port->etp_type_any; } else { hash= eth_fd->ef_ethopt.nweo_type; hash ^= (hash >> 8); hash &= (ETH_TYPE_HASH_NR-1); eth_fd_p= ð_port->etp_type[hash]; } for (prev= NULL, curr= *eth_fd_p; curr; prev= curr, curr= curr->ef_type_next) { if (curr == eth_fd) break; } assert(curr); if (prev) prev->ef_type_next= curr->ef_type_next; else *eth_fd_p= curr->ef_type_next; } PUBLIC void eth_restart_write(eth_port) eth_port_t *eth_port; { eth_fd_t *eth_fd; int i, r; if (eth_port->etp_wr_pack) return; if (!(eth_port->etp_flags & EPF_MORE2WRITE)) return; eth_port->etp_flags &= ~EPF_MORE2WRITE; for (i=0, eth_fd= eth_fd_table; ief_flags & (EFF_INUSE|EFF_WRITE_IP)) != (EFF_INUSE|EFF_WRITE_IP)) { continue; } if (eth_fd->ef_port != eth_port) continue; if (eth_port->etp_wr_pack) { eth_port->etp_flags |= EPF_MORE2WRITE; return; } eth_fd->ef_flags &= ~EFF_WRITE_IP; r= eth_write(eth_fd-eth_fd_table, eth_fd->ef_write_count); assert(r == NW_OK); } } PUBLIC void eth_arrive (eth_port, pack, pack_size) eth_port_t *eth_port; acc_t *pack; size_t pack_size; { eth_hdr_t *eth_hdr; ether_addr_t *dst_addr; int pack_stat; ether_type_t type; eth_fd_t *eth_fd, *first_fd, *share_fd; int hash, i; time_t exp_time; exp_time= get_time() + EXPIRE_TIME; pack= bf_packIffLess(pack, ETH_HDR_SIZE); eth_hdr= (eth_hdr_t*)ptr2acc_data(pack); dst_addr= ð_hdr->eh_dst; DIFBLOCK(0x20, dst_addr->ea_addr[0] != 0xFF && (dst_addr->ea_addr[0] & 0x1), printf("got multicast packet\n")); if (dst_addr->ea_addr[0] & 0x1) { /* multi cast or broadcast */ if (eth_addrcmp(*dst_addr, broadcast) == 0) pack_stat= NWEO_EN_BROAD; else pack_stat= NWEO_EN_MULTI; } else { if (eth_addrcmp (*dst_addr, eth_port->etp_ethaddr) == 0) pack_stat= NWEO_EN_LOC; else pack_stat= NWEO_EN_PROMISC; } type= eth_hdr->eh_proto; hash= type; hash ^= (hash >> 8); hash &= (ETH_TYPE_HASH_NR-1); first_fd= NULL; for (i= 0; i<2; i++) { share_fd= NULL; eth_fd= (i == 0) ? eth_port->etp_type_any : eth_port->etp_type[hash]; for (; eth_fd; eth_fd= eth_fd->ef_type_next) { if (i && eth_fd->ef_ethopt.nweo_type != type) continue; if (!(eth_fd->ef_ethopt.nweo_flags & pack_stat)) continue; if (eth_fd->ef_ethopt.nweo_flags & NWEO_REMSPEC && eth_addrcmp(eth_hdr->eh_src, eth_fd->ef_ethopt.nweo_rem) != 0) { continue; } if ((eth_fd->ef_ethopt.nweo_flags & NWEO_ACC_MASK) == NWEO_SHARED) { if (!share_fd) { share_fd= eth_fd; continue; } if (!eth_fd->ef_rdbuf_head) share_fd= eth_fd; continue; } if (!first_fd) { first_fd= eth_fd; continue; } pack->acc_linkC++; packet2user(eth_fd, pack, exp_time); } if (share_fd) { pack->acc_linkC++; packet2user(share_fd, pack, exp_time); } } if (first_fd) { if (first_fd->ef_put_pkt && (first_fd->ef_flags & EFF_READ_IP) && !(first_fd->ef_ethopt.nweo_flags & NWEO_RWDATONLY)) { (*first_fd->ef_put_pkt)(first_fd->ef_srfd, pack, pack_size); } else packet2user(first_fd, pack, exp_time); } else { if (pack_stat == NWEO_EN_LOC) { DBLOCK(0x01, printf("eth_arrive: dropping packet for proto 0x%x\n", ntohs(type))); } else { DBLOCK(0x20, printf("dropping packet for proto 0x%x\n", ntohs(type))); } bf_afree(pack); } } PRIVATE void packet2user (eth_fd, pack, exp_time) eth_fd_t *eth_fd; acc_t *pack; time_t exp_time; { int result; acc_t *tmp_pack; size_t size; assert (eth_fd->ef_flags & EFF_INUSE); if (!(eth_fd->ef_flags & EFF_READ_IP)) { if (pack->acc_linkC != 1) { tmp_pack= bf_dupacc(pack); bf_afree(pack); pack= tmp_pack; tmp_pack= NULL; } pack->acc_ext_link= NULL; if (eth_fd->ef_rdbuf_head == NULL) { eth_fd->ef_rdbuf_head= pack; eth_fd->ef_exp_time= exp_time; } else eth_fd->ef_rdbuf_tail->acc_ext_link= pack; eth_fd->ef_rdbuf_tail= pack; return; } if (eth_fd->ef_ethopt.nweo_flags & NWEO_RWDATONLY) pack= bf_delhead(pack, ETH_HDR_SIZE); size= bf_bufsize(pack); if (eth_fd->ef_put_pkt) { (*eth_fd->ef_put_pkt)(eth_fd->ef_srfd, pack, size); return; } eth_fd->ef_flags &= ~EFF_READ_IP; result= (*eth_fd->ef_put_userdata)(eth_fd->ef_srfd, (size_t)0, pack, FALSE); if (result >=0) reply_thr_put(eth_fd, size, FALSE); else reply_thr_put(eth_fd, result, FALSE); } PRIVATE void eth_buffree (priority) int priority; { int i; eth_fd_t *eth_fd; acc_t *pack; if (priority == ETH_PRI_FDBUFS_EXTRA) { for (i= 0, eth_fd= eth_fd_table; ief_rdbuf_head && eth_fd->ef_rdbuf_head->acc_ext_link) { pack= eth_fd->ef_rdbuf_head; eth_fd->ef_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } } } if (priority == ETH_PRI_FDBUFS) { for (i= 0, eth_fd= eth_fd_table; ief_rdbuf_head) { pack= eth_fd->ef_rdbuf_head; eth_fd->ef_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } } } } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void eth_bufcheck() { int i; eth_fd_t *eth_fd; acc_t *pack; for (i= 0; ief_rdbuf_head; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } } } #endif PRIVATE u32_t compute_rec_conf(eth_port) eth_port_t *eth_port; { eth_fd_t *eth_fd; u32_t flags; int i; flags= NWEO_NOFLAGS; for (i=0, eth_fd= eth_fd_table; ief_flags & (EFF_INUSE|EFF_OPTSET)) != (EFF_INUSE|EFF_OPTSET)) { continue; } if (eth_fd->ef_port != eth_port) continue; flags |= eth_fd->ef_ethopt.nweo_flags; } return flags; } PRIVATE void reply_thr_get (eth_fd, result, for_ioctl) eth_fd_t *eth_fd; size_t result; int for_ioctl; { acc_t *data; data= (*eth_fd->ef_get_userdata)(eth_fd->ef_srfd, result, 0, for_ioctl); assert (!data); } PRIVATE void reply_thr_put (eth_fd, result, for_ioctl) eth_fd_t *eth_fd; size_t result; int for_ioctl; { int error; error= (*eth_fd->ef_put_userdata)(eth_fd->ef_srfd, result, (acc_t *)0, for_ioctl); assert(error == NW_OK); } /* * $PchId: eth.c,v 1.11 1996/08/02 07:04:58 philip Exp $ */ /* eth.h Copyright 1995 Philip Homburg */ #ifndef ETH_H #define ETH_H #define NWEO_DEFAULT (NWEO_EN_LOC | NWEO_DI_BROAD | NWEO_DI_MULTI | \ NWEO_DI_PROMISC | NWEO_REMANY | NWEO_RWDATALL) #define eth_addrcmp(a,b) (memcmp((_VOIDSTAR)&a, (_VOIDSTAR)&b, \ sizeof(a))) /* Forward declatations */ struct acc; /* prototypes */ void eth_prep ARGS(( void )); void eth_init ARGS(( void )); int eth_open ARGS(( int port, int srfd, get_userdata_t get_userdata, put_userdata_t put_userdata, put_pkt_t put_pkt )); int eth_ioctl ARGS(( int fd, ioreq_t req)); int eth_read ARGS(( int port, size_t count )); int eth_write ARGS(( int port, size_t count )); int eth_cancel ARGS(( int fd, int which_operation )); void eth_close ARGS(( int fd )); int eth_send ARGS(( int port, struct acc *data, size_t data_len )); #endif /* ETH_H */ /* * $PchId: eth.h,v 1.6 1996/05/07 20:49:07 philip Exp $ */ /* eth_int.h Copyright 1995 Philip Homburg */ #ifndef ETH_INT_H #define ETH_INT_H #define ETH_TYPE_HASH_NR 16 typedef struct eth_port { int etp_flags; ether_addr_t etp_ethaddr; acc_t *etp_wr_pack, *etp_rd_pack; struct eth_fd *etp_type_any; struct eth_fd *etp_type[ETH_TYPE_HASH_NR]; event_t etp_sendev; osdep_eth_port_t etp_osdep; } eth_port_t; #define EPF_EMPTY 0x0 #define EPF_ENABLED 0x1 #define EPF_MORE2WRITE 0x10 #define EPF_READ_IP 0x20 #define EPF_READ_SP 0x40 #if 0 #define EPS_EMPTY 0x0 #define EPS_LOC 0x1 #define EPS_BROAD 0x2 #define EPS_MULTI 0x4 #define EPS_PROMISC 0x8 #endif extern eth_port_t *eth_port_table; void osdep_eth_init ARGS(( void )); int eth_get_stat ARGS(( eth_port_t *eth_port, eth_stat_t *eth_stat )); void eth_write_port ARGS(( eth_port_t *eth_port, acc_t *pack )); void eth_arrive ARGS(( eth_port_t *port, acc_t *pack, size_t pack_size )); void eth_set_rec_conf ARGS(( eth_port_t *eth_port, u32_t flags )); void eth_restart_write ARGS(( eth_port_t *eth_port )); void eth_loop_ev ARGS(( event_t *ev, ev_arg_t ev_arg )); #endif /* ETH_INT_H */ /* * $PchId: eth_int.h,v 1.6 1995/11/21 06:45:27 philip Exp $ */ /* inet/generic/event.c Created: April 1995 by Philip Homburg Implementation of an event queue. Copyright 1995 Philip Homburg */ #include "inet.h" #include "assert.h" #include "event.h" THIS_FILE event_t *ev_head; static event_t *ev_tail; void ev_init(ev) event_t *ev; { ev->ev_func= 0; ev->ev_next= NULL; } void ev_enqueue(ev, func, ev_arg) event_t *ev; ev_func_t func; ev_arg_t ev_arg; { assert(ev->ev_func == 0); ev->ev_func= func; ev->ev_arg= ev_arg; ev->ev_next= NULL; if (ev_head == NULL) ev_head= ev; else ev_tail->ev_next= ev; ev_tail= ev; } void ev_process() { ev_func_t func; event_t *curr; while (ev_head) { curr= ev_head; ev_head= curr->ev_next; func= curr->ev_func; curr->ev_func= 0; assert(func != 0); func(curr, curr->ev_arg); } } int ev_in_queue(ev) event_t *ev; { return ev->ev_func != 0; } /* * $PchId: event.c,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* inet/generic/event.h Created: April 1995 by Philip Homburg Header file for an event mechanism. Copyright 1995 Philip Homburg */ #ifndef INET__GENERIC__EVENT_H #define INET__GENERIC__EVENT_H struct event; typedef union ev_arg { int ev_int; void *ev_ptr; } ev_arg_t; typedef void (*ev_func_t) ARGS(( struct event *ev, union ev_arg eva )); typedef struct event { ev_func_t ev_func; ev_arg_t ev_arg; struct event *ev_next; } event_t; extern event_t *ev_head; void ev_init ARGS(( event_t *ev )); void ev_enqueue ARGS(( event_t *ev, ev_func_t func, ev_arg_t ev_arg )); void ev_process ARGS(( void )); int ev_in_queue ARGS(( event_t *ev )); #endif /* INET__GENERIC__EVENT_H */ /* * $PchId: event.h,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* icmp.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "event.h" #include "type.h" #include "assert.h" #include "icmp.h" #include "icmp_lib.h" #include "io.h" #include "ip.h" #include "ip_int.h" #include "ipr.h" THIS_FILE typedef struct icmp_port { int icp_flags; int icp_state; int icp_ipport; int icp_ipfd; acc_t *icp_head_queue; acc_t *icp_tail_queue; acc_t *icp_write_pack; } icmp_port_t; #define ICPF_EMPTY 0x0 #define ICPF_SUSPEND 0x1 #define ICPF_READ_IP 0x2 #define ICPF_READ_SP 0x4 #define ICPF_WRITE_IP 0x8 #define ICPF_WRITE_SP 0x10 #define ICPS_BEGIN 0 #define ICPS_IPOPT 1 #define ICPS_MAIN 2 #define ICPS_ERROR 3 PRIVATE icmp_port_t *icmp_port_table; FORWARD void icmp_main ARGS(( icmp_port_t *icmp_port )); FORWARD acc_t *icmp_getdata ARGS(( int port, size_t offset, size_t count, int for_ioctl )); FORWARD int icmp_putdata ARGS(( int port, size_t offset, acc_t *data, int for_ioctl )); FORWARD void icmp_read ARGS(( icmp_port_t *icmp_port )); FORWARD void process_data ARGS(( icmp_port_t *icmp_port, acc_t *data )); FORWARD u16_t icmp_pack_oneCsum ARGS(( acc_t *ip_pack )); FORWARD void icmp_echo_request ARGS(( icmp_port_t *icmp_port, acc_t *ip_pack, int ip_hdr_len, ip_hdr_t *ip_hdr, acc_t *icmp_pack, int icmp_len, icmp_hdr_t *icmp_hdr )); FORWARD void icmp_dst_unreach ARGS(( icmp_port_t *icmp_port, acc_t *ip_pack, int ip_hdr_len, ip_hdr_t *ip_hdr, acc_t *icmp_pack, int icmp_len, icmp_hdr_t *icmp_hdr )); FORWARD void icmp_time_exceeded ARGS(( icmp_port_t *icmp_port, acc_t *ip_pack, int ip_hdr_len, ip_hdr_t *ip_hdr, acc_t *icmp_pack, int icmp_len, icmp_hdr_t *icmp_hdr )); FORWARD void icmp_router_advertisement ARGS(( icmp_port_t *icmp_port, acc_t *icmp_pack, int icmp_len, icmp_hdr_t *icmp_hdr )); FORWARD void icmp_redirect ARGS(( icmp_port_t *icmp_port, ip_hdr_t *ip_hdr, acc_t *icmp_pack, int icmp_len, icmp_hdr_t *icmp_hdr )); FORWARD acc_t *make_repl_ip ARGS(( ip_hdr_t *ip_hdr, int ip_len )); FORWARD void enqueue_pack ARGS(( icmp_port_t *icmp_port, acc_t *reply_ip_hdr )); FORWARD void icmp_write ARGS(( icmp_port_t *icmp_port )); FORWARD void icmp_buffree ARGS(( int priority )); FORWARD acc_t *icmp_err_pack ARGS(( acc_t *pack, icmp_hdr_t **icmp_hdr )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void icmp_bufcheck ARGS(( void )); #endif PUBLIC void icmp_prep() { icmp_port_table= alloc(ip_conf_nr * sizeof(icmp_port_table[0])); } PUBLIC void icmp_init() { int i; icmp_port_t *icmp_port; assert (BUF_S >= sizeof (nwio_ipopt_t)); for (i= 0, icmp_port= icmp_port_table; iicp_flags= ICPF_EMPTY; icmp_port->icp_state= ICPS_BEGIN; #endif icmp_port->icp_ipport= i; } #ifndef BUF_CONSISTENCY_CHECK bf_logon(icmp_buffree); #else bf_logon(icmp_buffree, icmp_bufcheck); #endif for (i= 0, icmp_port= icmp_port_table; iicp_state) { case ICPS_BEGIN: icmp_port->icp_head_queue= 0; icmp_port->icp_ipfd= ip_open (icmp_port->icp_ipport, icmp_port->icp_ipport, icmp_getdata, icmp_putdata, 0); if (icmp_port->icp_ipfd<0) { DBLOCK(1, printf("unable to open ip_port %d\n", icmp_port->icp_ipport)); break; } icmp_port->icp_state= ICPS_IPOPT; icmp_port->icp_flags &= ~ICPF_SUSPEND; result= ip_ioctl (icmp_port->icp_ipfd, NWIOSIPOPT); if (result == NW_SUSPEND) { icmp_port->icp_flags |= ICPF_SUSPEND; break; } assert(result == NW_OK); /* falls through */ case ICPS_IPOPT: icmp_port->icp_state= ICPS_MAIN; icmp_port->icp_flags &= ~ICPF_SUSPEND; icmp_read(icmp_port); break; default: DBLOCK(1, printf("unknown state %d\n", icmp_port->icp_state)); break; } } PRIVATE acc_t *icmp_getdata(port, offset, count, for_ioctl) int port; size_t offset, count; int for_ioctl; { icmp_port_t *icmp_port; nwio_ipopt_t *ipopt; acc_t *data; int result; icmp_port= &icmp_port_table[port]; if (icmp_port->icp_flags & ICPF_WRITE_IP) { if (!count) { bf_afree(icmp_port->icp_write_pack); icmp_port->icp_write_pack= 0; result= (int)offset; if (result<0) { DBLOCK(1, printf("got write error %d\n", result)); } if (icmp_port->icp_flags & ICPF_WRITE_SP) { icmp_port->icp_flags &= ~(ICPF_WRITE_IP|ICPF_WRITE_SP); icmp_write (icmp_port); } return NW_OK; } return bf_cut(icmp_port->icp_write_pack, offset, count); } switch (icmp_port->icp_state) { case ICPS_IPOPT: if (!count) { result= (int)offset; assert(result == NW_OK); if (result < 0) { icmp_port->icp_state= ICPS_ERROR; break; } if (icmp_port->icp_flags & ICPF_SUSPEND) icmp_main(icmp_port); return NW_OK; } assert (count == sizeof (*ipopt)); data= bf_memreq (sizeof (*ipopt)); assert (data->acc_length == sizeof(*ipopt)); ipopt= (nwio_ipopt_t *)ptr2acc_data(data); ipopt->nwio_flags= NWIO_COPY | NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | NWIO_PROTOSPEC | NWIO_HDR_O_ANY | NWIO_RWDATALL; ipopt->nwio_proto= IPPROTO_ICMP; return data; default: DBLOCK(1, printf("unknown state %d\n", icmp_port->icp_state)); return 0; } } PRIVATE int icmp_putdata(port, offset, data, for_ioctl) int port; size_t offset; acc_t *data; int for_ioctl; { icmp_port_t *icmp_port; int result; icmp_port= &icmp_port_table[port]; if (icmp_port->icp_flags & ICPF_READ_IP) { assert (!for_ioctl); if (!data) { result= (int)offset; if (result<0) { DBLOCK(1, printf("got read error %d\n", result)); } if (icmp_port->icp_flags & ICPF_READ_SP) { icmp_port->icp_flags &= ~(ICPF_READ_IP|ICPF_READ_SP); icmp_read (icmp_port); } return NW_OK; } process_data(icmp_port, data); return NW_OK; } switch (icmp_port->icp_state) { default: DBLOCK(1, printf("unknown state %d\n", icmp_port->icp_state)); return 0; } } PRIVATE void icmp_read(icmp_port) icmp_port_t *icmp_port; { int result; assert (!(icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP) || (icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP)) == (ICPF_READ_IP|ICPF_READ_SP))); for (;;) { icmp_port->icp_flags |= ICPF_READ_IP; icmp_port->icp_flags &= ~ICPF_READ_SP; result= ip_read(icmp_port->icp_ipfd, ICMP_MAX_DATAGRAM); if (result == NW_SUSPEND) { icmp_port->icp_flags |= ICPF_READ_SP; return; } } } PUBLIC void icmp_snd_time_exceeded(port_nr, pack, code) int port_nr; acc_t *pack; int code; { acc_t *icmp_acc; icmp_hdr_t *icmp_hdr; icmp_port_t *icmp_port; assert(0 <= port_nr && port_nr < ip_conf_nr); icmp_port= &icmp_port_table[port_nr]; pack= icmp_err_pack(pack, &icmp_hdr); if (pack == NULL) return; icmp_hdr->ih_type= ICMP_TYPE_TIME_EXCEEDED; icmp_hdr->ih_code= code; icmp_hdr->ih_chksum= ~oneC_sum(~icmp_hdr->ih_chksum, (u16_t *)&icmp_hdr->ih_type, 2); enqueue_pack(icmp_port, pack); } PUBLIC void icmp_snd_redirect(port_nr, pack, code, gw) int port_nr; acc_t *pack; int code; ipaddr_t gw; { acc_t *icmp_acc; icmp_hdr_t *icmp_hdr; icmp_port_t *icmp_port; assert(0 <= port_nr && port_nr < ip_conf_nr); icmp_port= &icmp_port_table[port_nr]; pack= icmp_err_pack(pack, &icmp_hdr); if (pack == NULL) return; icmp_hdr->ih_type= ICMP_TYPE_REDIRECT; icmp_hdr->ih_code= code; icmp_hdr->ih_hun.ihh_gateway= gw; icmp_hdr->ih_chksum= ~oneC_sum(~icmp_hdr->ih_chksum, (u16_t *)&icmp_hdr->ih_type, 2); icmp_hdr->ih_chksum= ~oneC_sum(~icmp_hdr->ih_chksum, (u16_t *)&icmp_hdr->ih_hun.ihh_gateway, 4); enqueue_pack(icmp_port, pack); } PUBLIC void icmp_snd_unreachable(port_nr, pack, code) int port_nr; acc_t *pack; int code; { acc_t *icmp_acc; icmp_hdr_t *icmp_hdr; icmp_port_t *icmp_port; assert(0 <= port_nr && port_nr < ip_conf_nr); icmp_port= &icmp_port_table[port_nr]; pack= icmp_err_pack(pack, &icmp_hdr); if (pack == NULL) return; icmp_hdr->ih_type= ICMP_TYPE_DST_UNRCH; icmp_hdr->ih_code= code; icmp_hdr->ih_chksum= ~oneC_sum(~icmp_hdr->ih_chksum, (u16_t *)&icmp_hdr->ih_type, 2); enqueue_pack(icmp_port, pack); } PRIVATE void process_data(icmp_port, data) icmp_port_t *icmp_p((((((((((((((((ort; acc_t *data; { ip_hdr_t *ip_hdr; icmp_hdr_t *icmp_hdr; acc_t *icmp_data; int ip_hdr_len; size_t pack_len; /* Align entire packet */ data= bf_align(data, BUF_S, 4); data= bf_packIffLess(data, IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(data); DIFBLOCK(0x10, (ip_hdr->ih_dst & HTONL(0xf0000000)) == HTONL(0xe0000000), printf("got multicast packet\n")); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (ip_hdr_len>IP_MIN_HDR_SIZE) { data= bf_packIffLess(data, ip_hdr_len); ip_hdr= (ip_hdr_t *)ptr2acc_data(data); } pack_len= bf_bufsize(data); pack_len -= ip_hdr_len; if (pack_len < ICMP_MIN_HDR_LEN) { DBLOCK(1, printf("got an incomplete icmp packet\n")); bf_afree(data); return; } icmp_data= bf_cut(data, ip_hdr_len, pack_len); icmp_data= bf_packIffLess (icmp_data, ICMP_MIN_HDR_LEN); icmp_hdr= (icmp_hdr_t *)ptr2acc_data(icmp_data); if ((u16_t)~icmp_pack_oneCsum(icmp_data)) { DBLOCK(1, printf( "got packet with bad checksum (= 0x%x, 0x%x)\n", icmp_hdr->ih_chksum, (u16_t)~icmp_pack_oneCsum(icmp_data))); bf_afree(data); bf_afree(icmp_data); return; } switch (icmp_hdr->ih_type) { case ICMP_TYPE_ECHO_REPL: break; case ICMP_TYPE_DST_UNRCH: icmp_dst_unreach (icmp_port, data, ip_hdr_len, ip_hdr, icmp_data, pack_len, icmp_hdr); break; case ICMP_TYPE_SRC_QUENCH: /* Ignore src quench ICMPs */ DBLOCK(2, printf("ignoring SRC QUENCH ICMP.\n")); break; case ICMP_TYPE_REDIRECT: icmp_redirect (icmp_port, ip_hdr, icmp_data, pack_len, icmp_hdr); break; case ICMP_TYPE_ECHO_REQ: icmp_echo_request(icmp_port, data, ip_hdr_len, ip_hdr, icmp_data, pack_len, icmp_hdr); return; case ICMP_TYPE_ROUTER_ADVER: icmp_router_advertisement(icmp_port, icmp_data, pack_len, icmp_hdr); break; case ICMP_TYPE_ROUTE_SOL: break; /* Should be handled by a routing deamon. */ case ICMP_TYPE_TIME_EXCEEDED: icmp_time_exceeded (icmp_port, data, ip_hdr_len, ip_hdr, icmp_data, pack_len, icmp_hdr); break; default: DBLOCK(1, printf("got an unknown icmp (%d) from ", icmp_hdr->ih_type); writeIpAddr(ip_hdr->ih_src); printf("\n")); break; } bf_afree(data); bf_afree(icmp_data); } PRIVATE void icmp_echo_request(icmp_port, ip_data, ip_len, ip_hdr, icmp_data, icmp_len, icmp_hdr) icmp_port_t *icmp_port; acc_t *ip_data, *icmp_data; int ip_len, icmp_len; ip_hdr_t *ip_hdr; icmp_hdr_t *icmp_hdr; { acc_t *repl_ip_hdr, *repl_icmp; icmp_hdr_t *repl_icmp_hdr; i32_t tmp_chksum; u16_t u16; if (icmp_hdr->ih_code != 0) { DBLOCK(1, printf("got an icmp echo request with unknown code (%d)\n", icmp_hdr->ih_code)); bf_afree(ip_data); bf_afree(icmp_data); return; } if (icmp_len < ICMP_MIN_HDR_LEN + sizeof(icmp_id_seq_t)) { DBLOCK(1, printf("got an incomplete icmp echo request\n")); bf_afree(ip_data); bf_afree(icmp_data); return; } repl_ip_hdr= make_repl_ip(ip_hdr, ip_len); repl_icmp= bf_memreq (ICMP_MIN_HDR_LEN); assert (repl_icmp->acc_length == ICMP_MIN_HDR_LEN); repl_icmp_hdr= (icmp_hdr_t *)ptr2acc_data(repl_icmp); repl_icmp_hdr->ih_type= ICMP_TYPE_ECHO_REPL; repl_icmp_hdr->ih_code= 0; DBLOCK(2, printf("ih_chksum= 0x%x, ih_type= 0x%x, repl->ih_type= 0x%x\n", icmp_hdr->ih_chksum, *(u16_t *)&icmp_hdr->ih_type, *(u16_t *)&repl_icmp_hdr->ih_type)); tmp_chksum= (~icmp_hdr->ih_chksum & 0xffff) - (i32_t)*(u16_t *)&icmp_hdr->ih_type+ *(u16_t *)&repl_icmp_hdr->ih_type; tmp_chksum= (tmp_chksum >> 16) + (tmp_chksum & 0xffff); tmp_chksum= (tmp_chksum >> 16) + (tmp_chksum & 0xffff); repl_icmp_hdr->ih_chksum= ~tmp_chksum; DBLOCK(2, printf("sending chksum 0x%x\n", repl_icmp_hdr->ih_chksum)); repl_ip_hdr->acc_next= repl_icmp; repl_icmp->acc_next= bf_cut (icmp_data, ICMP_MIN_HDR_LEN, icmp_len - ICMP_MIN_HDR_LEN); bf_afree(ip_data); bf_afree(icmp_data); enqueue_pack(icmp_port, repl_ip_hdr); } PRIVATE u16_t icmp_pack_oneCsum(icmp_pack) acc_t *icmp_pack; { u16_t prev; int odd_byte; char *data_ptr; int length; char byte_buf[2]; assert (icmp_pack); prev= 0; odd_byte= FALSE; for (; icmp_pack; icmp_pack= icmp_pack->acc_next) { data_ptr= ptr2acc_data(icmp_pack); length= icmp_pack->acc_length; if (!length) continue; if (odd_byte) { byte_buf[1]= *data_ptr; prev= oneC_sum(prev, (u16_t *)byte_buf, 2); data_ptr++; length--; odd_byte= FALSE; } if (length & 1) { odd_byte= TRUE; length--; byte_buf[0]= data_ptr[length]; } if (!length) continue; prev= oneC_sum (prev, (u16_t *)data_ptr, length); } if (odd_byte) prev= oneC_sum (prev, (u16_t *)byte_buf, 1); return prev; } PRIVATE acc_t *make_repl_ip(ip_hdr, ip_len) ip_hdr_t *ip_hdr; int ip_len; { ip_hdr_t *repl_ip_hdr; acc_t *repl; int repl_hdr_len; if (ip_len>IP_MIN_HDR_SIZE) { DBLOCK(1, printf("ip_hdr options NOT supported (yet?)\n")); ip_len= IP_MIN_HDR_SIZE; } repl_hdr_len= IP_MIN_HDR_SIZE; repl= bf_memreq(repl_hdr_len); assert (repl->acc_length == repl_hdr_len); repl_ip_hdr= (ip_hdr_t *)ptr2acc_data(repl); repl_ip_hdr->ih_vers_ihl= repl_hdr_len >> 2; repl_ip_hdr->ih_tos= ip_hdr->ih_tos; repl_ip_hdr->ih_ttl= ICMP_DEF_TTL; repl_ip_hdr->ih_proto= IPPROTO_ICMP; repl_ip_hdr->ih_dst= ip_hdr->ih_src; repl_ip_hdr->ih_flags_fragoff= 0; return repl; } PRIVATE void enqueue_pack(icmp_port, reply_ip_hdr) icmp_port_t *icmp_port; acc_t *reply_ip_hdr; { reply_ip_hdr->acc_ext_link= 0; if (icmp_port->icp_head_queue) { icmp_port->icp_tail_queue->acc_ext_link= reply_ip_hdr; } else { icmp_port->icp_head_queue= reply_ip_hdr; } reply_ip_hdr->acc_ext_link= NULL; icmp_port->icp_tail_queue= reply_ip_hdr; if (!(icmp_port->icp_flags & ICPF_WRITE_IP)) icmp_write(icmp_port); } PRIVATE void icmp_write(icmp_port) icmp_port_t *icmp_port; { int result; assert (!(icmp_port->icp_flags & ICPF_WRITE_IP)); while (icmp_port->icp_head_queue != NULL) { assert(icmp_port->icp_write_pack == NULL); icmp_port->icp_write_pack= icmp_port->icp_head_queue; icmp_port->icp_head_queue= icmp_port->icp_head_queue-> acc_ext_link; icmp_port->icp_flags |= ICPF_WRITE_IP; result= ip_write(icmp_port->icp_ipfd, bf_bufsize(icmp_port->icp_write_pack)); if (result == NW_SUSPEND) { icmp_port->icp_flags |= ICPF_WRITE_SP; return; } icmp_port->icp_flags &= ~ICPF_WRITE_IP; } } PRIVATE void icmp_buffree(priority) int priority; { acc_t *tmp_acc; int i; icmp_port_t *icmp_port; if (priority == ICMP_PRI_QUEUE) { for (i=0, icmp_port= icmp_port_table; iicp_head_queue) { tmp_acc= icmp_port->icp_head_queue; icmp_port->icp_head_queue= tmp_acc->acc_ext_link; bf_afree(tmp_acc); } } } } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void icmp_bufcheck() { int i; icmp_port_t *icmp_port; acc_t *pack; for (i= 0, icmp_port= icmp_port_table; iicp_head_queue; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } bf_check_acc(icmp_port->icp_write_pack); } } #endif PRIVATE void icmp_dst_unreach(icmp_port, ip_pack, ip_hdr_len, ip_hdr, icmp_pack, icmp_len, icmp_hdr) icmp_port_t *icmp_port; acc_t *ip_pack; int ip_hdr_len; ip_hdr_t *ip_hdr; acc_t *icmp_pack; int icmp_len; icmp_hdr_t *icmp_hdr; { acc_t *old_ip_pack; ip_hdr_t *old_ip_hdr; int ip_port_nr; ipaddr_t dst, mask; if (icmp_len < 8 + IP_MIN_HDR_SIZE) { DBLOCK(1, printf("dest unrch with wrong size\n")); return; } old_ip_pack= bf_cut (icmp_pack, 8, icmp_len-8); old_ip_pack= bf_packIffLess(old_ip_pack, IP_MIN_HDR_SIZE); old_ip_hdr= (ip_hdr_t *)ptr2acc_data(old_ip_pack); if (old_ip_hdr->ih_src != ip_hdr->ih_dst) { DBLOCK(1, printf("dest unrch based on wrong packet\n")); bf_afree(old_ip_pack); return; } ip_port_nr= icmp_port->icp_ipport; switch(icmp_hdr->ih_code) { case ICMP_NET_UNRCH: dst= old_ip_hdr->ih_dst; mask= ip_get_netmask(dst); ipr_destunrch (ip_port_nr, dst & mask, mask, IPR_UNRCH_TIMEOUT); break; case ICMP_HOST_UNRCH: ipr_destunrch (ip_port_nr, old_ip_hdr->ih_dst, (ipaddr_t)-1, IPR_UNRCH_TIMEOUT); break; case ICMP_PORT_UNRCH: /* At the moment we don't do anything with this information. * It should be handed to the appropriate transport layer. */ break; default: DBLOCK(1, printf("icmp_dst_unreach: got strange code %d from ", icmp_hdr->ih_code); writeIpAddr(ip_hdr->ih_src); printf("; original destination: "); writeIpAddr(old_ip_hdr->ih_dst); printf("; protocol: %d\n", old_ip_hdr->ih_proto)); break; } bf_afree(old_ip_pack); } PRIVATE void icmp_time_exceeded(icmp_port, ip_pack, ip_hdr_len, ip_hdr, icmp_pack, icmp_len, icmp_hdr) icmp_port_t *icmp_port; acc_t *ip_pack; int ip_hdr_len; ip_hdr_t *ip_hdr; acc_t *icmp_pack; int icmp_len; icmp_hdr_t *icmp_hdr; { acc_t *old_ip_pack; ip_hdr_t *old_ip_hdr; int ip_port_nr; if (icmp_len < 8 + IP_MIN_HDR_SIZE) { DBLOCK(1, printf("time exceeded with wrong size\n")); return; } old_ip_pack= bf_cut (icmp_pack, 8, icmp_len-8); old_ip_pack= bf_packIffLess(old_ip_pack, IP_MIN_HDR_SIZE); old_ip_hdr= (ip_hdr_t *)ptr2acc_data(old_ip_pack); if (old_ip_hdr->ih_src != ip_hdr->ih_dst) { DBLOCK(1, printf("time exceeded based on wrong packet\n")); bf_afree(old_ip_pack); return; } ip_port_nr= icmp_port->icp_ipport; switch(icmp_hdr->ih_code) { case ICMP_TTL_EXC: ipr_ttl_exc (ip_port_nr, old_ip_hdr->ih_dst, (ipaddr_t)-1, IPR_TTL_TIMEOUT); break; case ICMP_FRAG_REASSEM: /* Ignore reassembly time-outs. */ break; default: DBLOCK(1, printf("got strange code: %d\n", icmp_hdr->ih_code)); break; } bf_afree(old_ip_pack); } PRIVATE void icmp_router_advertisement(icmp_port, icmp_pack, icmp_len, icmp_hdr) icmp_port_t *icmp_port; acc_t *icmp_pack; int icmp_len; icmp_hdr_t *icmp_hdr; { int entries; int entry_size; u16_t lifetime; int i; char *bufp; if (icmp_len < 8) { DBLOCK(1, printf("router advertisement with wrong size (%d)\n", icmp_len)); return; } if (icmp_hdr->ih_code != 0) { DBLOCK(1, printf("router advertisement with wrong code (%d)\n", icmp_hdr->ih_code)); return; } entries= icmp_hdr->ih_hun.ihh_ram.iram_na; entry_size= icmp_hdr->ih_hun.ihh_ram.iram_aes * 4; if (entries < 1) { DBLOCK(1, printf( "router advertisement with wrong number of entries (%d)\n", entries)); return; } if (entry_size < 8) { DBLOCK(1, printf( "router advertisement with wrong entry size (%d)\n", entry_size)); return; } if (icmp_len < 8 + entries * entry_size) { DBLOCK(1, printf("router advertisement with wrong size\n"); printf( "\t(entries= %d, entry_size= %d, icmp_len= %d)\n", entries, entry_size, icmp_len)); return; } lifetime= ntohs(icmp_hdr->ih_hun.ihh_ram.iram_lt); if (lifetime > 9000) { DBLOCK(1, printf( "router advertisement with wrong lifetime (%d)\n", lifetime)); return; } for (i= 0, bufp= (char *)&icmp_hdr->ih_dun.uhd_data[0]; i< entries; i++, bufp += entry_size) { ipr_add_oroute(icmp_port->icp_ipport, HTONL(0L), HTONL(0L), *(ipaddr_t *)bufp, lifetime * HZ, 1, 0, ntohl(*(i32_t *)(bufp+4)), NULL); } } PRIVATE void icmp_redirect(icmp_port, ip_hdr, icmp_pack, icmp_len, icmp_hdr) icmp_port_t *icmp_port; ip_hdr_t *ip_hdr; acc_t *icmp_pack; int icmp_len; icmp_hdr_t *icmp_hdr; { acc_t *old_ip_pack; ip_hdr_t *old_ip_hdr; int ip_port_nr; ipaddr_t dst, mask; if (icmp_len < 8 + IP_MIN_HDR_SIZE) { DBLOCK(1, printf("redirect with wrong size\n")); return; } old_ip_pack= bf_cut (icmp_pack, 8, icmp_len-8); old_ip_pack= bf_packIffLess(old_ip_pack, IP_MIN_HDR_SIZE); old_ip_hdr= (ip_hdr_t *)ptr2acc_data(old_ip_pack); ip_port_nr= icmp_port->icp_ipport; switch(icmp_hdr->ih_code) { case ICMP_REDIRECT_NET: dst= old_ip_hdr->ih_dst; mask= ip_get_netmask(dst); ipr_redirect (ip_port_nr, dst & mask, mask, ip_hdr->ih_src, icmp_hdr->ih_hun.ihh_gateway, IPR_REDIRECT_TIMEOUT); break; case ICMP_REDIRECT_HOST: ipr_redirect (ip_port_nr, old_ip_hdr->ih_dst, (ipaddr_t)-1, ip_hdr->ih_src, icmp_hdr->ih_hun.ihh_gateway, IPR_REDIRECT_TIMEOUT); break; default: DBLOCK(1, printf("got strange code: %d\n", icmp_hdr->ih_code)); break; } bf_afree(old_ip_pack); } PRIVATE acc_t *icmp_err_pack(pack, icmp_hdr) acc_t *pack; icmp_hdr_t **icmp_hdr; { ip_hdr_t *ip_hdr; acc_t *ip_pack, *icmp_pack, *tmp_pack; int ip_hdr_len, icmp_hdr_len; size_t size; ipaddr_t dest, netmask; nettype_t nettype; pack= bf_packIffLess(pack, IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); /* If the IP protocol is ICMP or the fragment offset is non-zero, * drop the packet. Also check if the source address is valid. */ if (ip_hdr->ih_proto == IPPROTO_ICMP || (ntohs(ip_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK) != 0) { bf_afree(pack); return NULL; } dest= ip_hdr->ih_src; nettype= ip_nettype(dest); netmask= ip_netmask(nettype); if ((nettype != IPNT_CLASS_A && nettype != IPNT_LOCAL && nettype != IPNT_CLASS_B && nettype != IPNT_CLASS_C) || (dest & ~netmask) == 0 || (dest & ~netmask) == ~netmask) { #if !CRAMPED printf("icmp_err_pack: invalid source address: "); writeIpAddr(dest); printf("\n"); #endif bf_afree(pack); return NULL; } /* Take the IP header and the first 64 bits of user data. */ size= ntohs(ip_hdr->ih_length); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (size < ip_hdr_len || bf_bufsize(pack) < size) { #if !CRAMPED printf("icmp_err_pack: wrong packet size:\n"); printf("\thdrlen= %d, ih_length= %d, bufsize= %d\n", ip_hdr_len, size, bf_bufsize(pack)); #endif bf_afree(pack); return NULL; } if (ip_hdr_len + 8 < size) size= ip_hdr_len+8; tmp_pack= bf_cut(pack, 0, size); bf_afree(pack); pack= tmp_pack; tmp_pack= NULL; /* Create a minimal size ICMP hdr. */ icmp_hdr_len= offsetof(icmp_hdr_t, ih_dun); icmp_pack= bf_memreq(icmp_hdr_len); pack= bf_append(icmp_pack, pack); size += icmp_hdr_len; pack= bf_packIffLess(pack, icmp_hdr_len); *icmp_hdr= (icmp_hdr_t *)ptr2acc_data(pack); (*icmp_hdr)->ih_type= 0; (*icmp_hdr)->ih_code= 0; (*icmp_hdr)->ih_chksum= 0; (*icmp_hdr)->ih_hun.ihh_unused= 0; (*icmp_hdr)->ih_chksum= ~icmp_pack_oneCsum(pack); /* Create an IP header */ ip_hdr_len= IP_MIN_HDR_SIZE; ip_pack= bf_memreq(ip_hdr_len); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_pack); ip_hdr->ih_vers_ihl= ip_hdr_len >> 2; ip_hdr->ih_tos= 0; ip_hdr->ih_length= htons(ip_hdr_len + size); ip_hdr->ih_flags_fragoff= 0; ip_hdr->ih_ttl= ICMP_DEF_TTL; ip_hdr->ih_proto= IPPROTO_ICMP; ip_hdr->ih_dst= dest; assert(ip_pack->acc_next == NULL); ip_pack->acc_next= pack; return ip_pack; } /* * $PchId: icmp.c,v 1.8 1996/12/17 07:53:34 philip Exp $ */ /* icmp.h Copyright 1995 Philip Homburg */ #ifndef ICMP_H #define ICMP_H #define ICMP_MAX_DATAGRAM 8196 #define ICMP_DEF_TTL 60 /* Prototypes */ void icmp_prep ARGS(( void )); void icmp_init ARGS(( void )); #endif /* ICMP_H */ /* * $PchId: icmp.h,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* icmp_lib.h Created Sept 30, 1991 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef ICMP_LIB_H #define ICMP_LIB_H /* Prototypes */ void icmp_snd_parmproblem ARGS(( acc_t *pack )); void icmp_snd_time_exceeded ARGS(( int port_nr, acc_t *pack, int code )); void icmp_snd_unreachable ARGS(( int port_nr, acc_t *pack, int code )); void icmp_snd_redirect ARGS(( int port_nr, acc_t *pack, int code, ipaddr_t gw )); #endif /* ICMP_LIB_H */ /* * $PchId: icmp_lib.h,v 1.5 1996/12/17 07:54:09 philip Exp $ */ /* io.c Copyright 1995 Philip Homburg */ #include #include "inet.h" #include "io.h" PUBLIC void writeIpAddr(addr) ipaddr_t addr; { #define addrInBytes ((u8_t *)&addr) printf("%d.%d.%d.%d", addrInBytes[0], addrInBytes[1], addrInBytes[2], addrInBytes[3]); #undef addrInBytes } PUBLIC void writeEtherAddr(addr) ether_addr_t *addr; { #define addrInBytes ((u8_t *)addr->ea_addr) printf("%x:%x:%x:%x:%x:%x", addrInBytes[0], addrInBytes[1], addrInBytes[2], addrInBytes[3], addrInBytes[4], addrInBytes[5]); #undef addrInBytes } /* * $PchId: io.c,v 1.5 1995/11/21 06:45:27 philip Exp $ */ /* io.h Created Sept 30, 1991 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef IO_H #define IO_H /* Prototypes */ void writeIpAddr ARGS(( ipaddr_t addr )); void writeEtherAddr ARGS(( ether_addr_t *addr )); #endif /* IO_H */ /* * $PchId: io.h,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* ip.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "event.h" #include "type.h" #include "arp.h" #include "assert.h" #include "clock.h" #include "eth.h" #include "icmp.h" #include "icmp_lib.h" #include "io.h" #include "ip.h" #include "ip_int.h" #include "ipr.h" #include "sr.h" THIS_FILE FORWARD void ip_close ARGS(( int fd )); FORWARD int ip_cancel ARGS(( int fd, int which_operation )); FORWARD void ip_buffree ARGS(( int priority )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void ip_bufcheck ARGS(( void )); #endif FORWARD void ip_bad_callback ARGS(( struct ip_port *ip_port )); PUBLIC ip_port_t *ip_port_table; PUBLIC ip_fd_t ip_fd_table[IP_FD_NR]; PUBLIC ip_ass_t ip_ass_table[IP_ASS_NR]; PUBLIC void ip_prep() { ip_port_table= alloc(ip_conf_nr * sizeof(ip_port_table[0])); icmp_prep(); } PUBLIC void ip_init() { int i, j, result; ip_ass_t *ip_ass; ip_fd_t *ip_fd; ip_port_t *ip_port; struct ip_conf *icp; assert (BUF_S >= sizeof(struct nwio_ethopt)); assert (BUF_S >= IP_MAX_HDR_SIZE + ETH_HDR_SIZE); assert (BUF_S >= sizeof(nwio_ipopt_t)); assert (BUF_S >= sizeof(nwio_route_t)); #if ZERO for (i=0, ip_ass= ip_ass_table; iia_frags= 0; ip_ass->ia_first_time= 0; ip_ass->ia_port= 0; } for (i=0, ip_fd= ip_fd_table; iif_flags= IFF_EMPTY; ip_fd->if_rdbuf_head= 0; } #endif for (i=0, ip_port= ip_port_table, icp= ip_conf; iip_port= i; #if ZERO ip_port->ip_flags= IPF_EMPTY; #endif ip_port->ip_dev_main= (ip_dev_t)ip_bad_callback; ip_port->ip_dev_set_ipaddr= (ip_dev_t)ip_bad_callback; ip_port->ip_dev_send= (ip_dev_send_t)ip_bad_callback; ip_port->ip_dl_type= icp->ic_devtype; ip_port->ip_mss= IP_DEF_MSS; switch(ip_port->ip_dl_type) { case IPDL_ETH: ip_port->ip_dl.dl_eth.de_port= icp->ic_port; result= ipeth_init(ip_port); if (result == -1) continue; assert(result == NW_OK); break; #if ENABLE_PSIP case IPDL_PSIP: ip_port->ip_dl.dl_ps.ps_port= icp->ic_port; result= ipps_init(ip_port); if (result == -1) continue; assert(result == NW_OK); break; #endif #if !CRAMPED default: ip_panic(( "unknown ip_dl_type %d", ip_port->ip_dl_type )); #endif } #if ZERO ip_port->ip_loopb_head= NULL; ip_port->ip_loopb_tail= NULL; ev_init(&ip_port->ip_loopb_event); #endif ip_port->ip_flags |= IPF_CONFIGURED; #if ZERO ip_port->ip_proto_any= NULL; for (j= 0; jip_proto[j]= NULL; #endif } #ifndef BUF_CONSISTENCY_CHECK bf_logon(ip_buffree); #else bf_logon(ip_buffree, ip_bufcheck); #endif icmp_init(); ipr_init(); for (i=0, ip_port= ip_port_table; iip_flags & IPF_CONFIGURED)) continue; ip_port->ip_frame_id= (u16_t)get_time(); sr_add_minor(if2minor(ip_conf[i].ic_ifno, IP_DEV_OFF), i, ip_open, ip_close, ip_read, ip_write, ip_ioctl, ip_cancel); (*ip_port->ip_dev_main)(ip_port); } } PRIVATE int ip_cancel (fd, which_operation) int fd; int which_operation; { ip_fd_t *ip_fd; acc_t *repl_res; int result; ip_fd= &ip_fd_table[fd]; switch (which_operation) { case SR_CANCEL_IOCTL: assert (ip_fd->if_flags & IFF_GIPCONF_IP); ip_fd->if_flags &= ~IFF_GIPCONF_IP; repl_res= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, (size_t)EINTR, (size_t)0, TRUE); assert (!repl_res); break; case SR_CANCEL_READ: assert (ip_fd->if_flags & IFF_READ_IP); ip_fd->if_flags &= ~IFF_READ_IP; result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, (size_t)EINTR, (acc_t *)0, FALSE); assert (!result); break; #if 0 case SR_CANCEL_WRITE: assert(0); assert (ip_fd->if_flags & IFF_WRITE_MASK); ip_fd->if_flags &= ~IFF_WRITE_MASK; repl_res= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, (size_t)EINTR, (size_t)0, FALSE); assert (!repl_res); break; #endif #if !CRAMPED default: ip_panic(( "unknown cancel request" )); #endif } return NW_OK; } PUBLIC int ip_open (port, srfd, get_userdata, put_userdata, put_pkt) int port; int srfd; get_userdata_t get_userdata; put_userdata_t put_userdata; put_pkt_t put_pkt; { int i; ip_fd_t *ip_fd; ip_port_t *ip_port; ip_port= &ip_port_table[port]; if (!(ip_port->ip_flags & IPF_CONFIGURED)) return ENXIO; for (i=0; i=IP_FD_NR) { DBLOCK(1, printf("out of fds\n")); return EAGAIN; } ip_fd= &ip_fd_table[i]; ip_fd->if_flags= IFF_INUSE; ip_fd->if_ipopt.nwio_flags= NWIO_DEFAULT; ip_fd->if_ipopt.nwio_tos= 0; ip_fd->if_ipopt.nwio_df= FALSE; ip_fd->if_ipopt.nwio_ttl= 255; ip_fd->if_ipopt.nwio_hdropt.iho_opt_siz= 0; ip_fd->if_port= ip_port; ip_fd->if_srfd= srfd; assert(ip_fd->if_rdbuf_head == NULL); ip_fd->if_get_userdata= get_userdata; ip_fd->if_put_userdata= put_userdata; ip_fd->if_put_pkt= put_pkt; return i; } PRIVATE void ip_close (fd) int fd; { ip_fd_t *ip_fd; acc_t *pack; ip_fd= &ip_fd_table[fd]; assert ((ip_fd->if_flags & IFF_INUSE) && !(ip_fd->if_flags & IFF_BUSY)); if (ip_fd->if_flags & IFF_OPTSET) ip_unhash_proto(ip_fd); while (ip_fd->if_rdbuf_head) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } ip_fd->if_flags= IFF_EMPTY; } PRIVATE void ip_buffree(priority) int priority; { int i; ip_port_t *ip_port; ip_fd_t *ip_fd; ip_ass_t *ip_ass; acc_t *pack, *next_pack; for (i= 0, ip_port= ip_port_table; iip_dl_type == IPDL_ETH) { /* Can't free de_frame. * bf_check_acc(ip_port->ip_dl.dl_eth.de_frame); */ if (priority == IP_PRI_PORTBUFS) { next_pack= ip_port->ip_dl.dl_eth.de_arp_head; while(next_pack != NULL) { pack= next_pack; next_pack= pack->acc_ext_link; bf_afree(pack); } ip_port->ip_dl.dl_eth.de_arp_head= next_pack; next_pack= ip_port->ip_dl.dl_eth.de_q_head; while(next_pack != NULL) { pack= next_pack; next_pack= pack->acc_ext_link; bf_afree(pack); } ip_port->ip_dl.dl_eth.de_q_head= next_pack; } } else if (ip_port->ip_dl_type == IPDL_PSIP) { if (priority == IP_PRI_PORTBUFS) { next_pack= ip_port->ip_dl.dl_ps.ps_send_head; while(next_pack != NULL) { pack= next_pack; next_pack= pack->acc_ext_link; bf_afree(pack); } ip_port->ip_dl.dl_ps.ps_send_head= next_pack; } } if (priority == IP_PRI_PORTBUFS) { next_pack= ip_port->ip_loopb_head; while(next_pack && next_pack->acc_ext_link) { pack= next_pack; next_pack= pack->acc_ext_link; bf_afree(pack); } if (next_pack) { if (ev_in_queue(&ip_port->ip_loopb_event)) { #if !CRAMPED printf( "not freeing ip_loopb_head, ip_loopb_event enqueued\n"); #endif } else { bf_afree(next_pack); next_pack= NULL; } } ip_port->ip_loopb_head= next_pack; } } if (priority == IP_PRI_FDBUFS_EXTRA) { for (i= 0, ip_fd= ip_fd_table; iif_rdbuf_head && ip_fd->if_rdbuf_head->acc_ext_link) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } } } if (priority == IP_PRI_FDBUFS) { for (i= 0, ip_fd= ip_fd_table; iif_rdbuf_head) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } } } if (priority == IP_PRI_ASSBUFS) { for (i= 0, ip_ass= ip_ass_table; iia_frags; while(ip_ass->ia_frags != NULL) { pack= ip_ass->ia_frags; ip_ass->ia_frags= pack->acc_ext_link; bf_afree(pack); } ip_ass->ia_first_time= 0; } } } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void ip_bufcheck() { int i; ip_port_t *ip_port; ip_fd_t *ip_fd; ip_ass_t *ip_ass; acc_t *pack; for (i= 0, ip_port= ip_port_table; iip_dl_type == IPDL_ETH) { bf_check_acc(ip_port->ip_dl.dl_eth.de_frame); for (pack= ip_port->ip_dl.dl_eth.de_q_head; pack; p)))ack= pack->acc_ext_link) { bf_check_acc(pack); } for (pack= ip_port->ip_dl.dl_eth.de_arp_head; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } } else if (ip_port->ip_dl_type == IPDL_PSIP) { for (pack= ip_port->ip_dl.dl_ps.ps_send_head; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } } for (pack= ip_port->ip_loopb_head; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } } for (i= 0, ip_fd= ip_fd_table; iif_rdbuf_head; pack; pack= pack->acc_ext_link) { bf_check_acc(pack); } } for (i= 0, ip_ass= ip_ass_table; iia_frags; pack; pack= pack->acc_ext_link) bf_check_acc(pack); } } #endif /* BUF_CONSISTENCY_CHECK */ PRIVATE void ip_bad_callback(ip_port) struct ip_port *ip_port; { #if !CRAMPED ip_panic(( "no callback filled in for port %d", ip_port->ip_port )); #endif } /* * $PchId: ip.c,v 1.7 1996/12/17 07:54:47 philip Exp $ */ /* ip.h Copyright 1995 Philip Homburg */ #ifndef INET_IP_H #define INET_IP_H /* Prototypes */ struct acc; void ip_prep ARGS(( void )); void ip_init ARGS(( void )); int ip_open ARGS(( int port, int srfd, get_userdata_t get_userdata, put_userdata_t put_userdata, put_pkt_t put_pkt )); int ip_ioctl ARGS(( int fd, ioreq_t req )); int ip_read ARGS(( int fd, size_t count )); int ip_write ARGS(( int fd, size_t count )); int ip_send ARGS(( int fd, struct acc *data, size_t data_len )); #endif /* INET_IP_H */ /* * $PchId: ip.h,v 1.6 1996/05/07 20:49:28 philip Exp $ */ /* generic/ip_eth.c Ethernet specific part of the IP implementation Created: Apr 22, 1993 by Philip Homburg Copyright 1995 Philip Homburg */ #include "inet.h" #include "type.h" #include "arp.h" #include "assert.h" #include "buf.h" #include "clock.h" #include "eth.h" #include "event.h" #include "ip.h" #include "ip_int.h" THIS_FILE typedef struct xmit_hdr { time_t xh_time; ipaddr_t xh_ipaddr; } xmit_hdr_t; PRIVATE ether_addr_t broadcast_ethaddr= { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; PRIVATE ipaddr_t broadcast_ipaddr= 0xFFFFFFFFL; FORWARD void do_eth_read ARGS(( ip_port_t *port )); FORWARD acc_t *get_eth_data ARGS(( int fd, size_t offset, size_t count, int for_ioctl )); FORWARD int put_eth_data ARGS(( int fd, size_t offset, acc_t *data, int for_ioctl )); FORWARD void ipeth_main ARGS(( ip_port_t *port )); FORWARD void ipeth_set_ipaddr ARGS(( ip_port_t *port )); FORWARD void ipeth_restart_send ARGS(( ip_port_t *ip_port )); FORWARD int ipeth_send ARGS(( struct ip_port *ip_port, ipaddr_t dest, acc_t *pack, int broadcast )); FORWARD void ipeth_arp_reply ARGS(( int ip_port_nr, ipaddr_t ipaddr, ether_addr_t *dst_ether_ptr )); FORWARD int ipeth_update_ttl ARGS(( time_t enq_time, time_t now, acc_t *eth_pack )); FORWARD void ip_eth_arrived ARGS(( int port, acc_t *pack, size_t pack_size )); PUBLIC int ipeth_init(ip_port) ip_port_t *ip_port; { assert(BUF_S >= sizeof(xmit_hdr_t)); assert(BUF_S >= sizeof(eth_hdr_t)); ip_port->ip_dl.dl_eth.de_fd= eth_open(ip_port-> ip_dl.dl_eth.de_port, ip_port->ip_port, get_eth_data, put_eth_data, ip_eth_arrived); if (ip_port->ip_dl.dl_eth.de_fd < 0) { DBLOCK(1, printf("ip.c: unable to open eth port\n")); return -1; } ip_port->ip_dl.dl_eth.de_state= IES_EMPTY; ip_port->ip_dl.dl_eth.de_flags= IEF_EMPTY; ip_port->ip_dl.dl_eth.de_q_head= NULL; ip_port->ip_dl.dl_eth.de_q_tail= NULL; ip_port->ip_dl.dl_eth.de_arp_head= NULL; ip_port->ip_dl.dl_eth.de_arp_tail= NULL; ip_port->ip_dev_main= ipeth_main; ip_port->ip_dev_set_ipaddr= ipeth_set_ipaddr; ip_port->ip_dev_send= ipeth_send; ip_port->ip_mss= ETH_MAX_PACK_SIZE-ETH_HDR_SIZE; return 0; } PRIVATE void ipeth_main(ip_port) ip_port_t *ip_port; { int result, i; ip_fd_t *ip_fd; switch (ip_port->ip_dl.dl_eth.de_state) { case IES_EMPTY: ip_port->ip_dl.dl_eth.de_state= IES_SETPROTO; result= eth_ioctl(ip_port->ip_dl.dl_eth.de_fd, NWIOSETHOPT); if (result == NW_SUSPEND) ip_port->ip_dl.dl_eth.de_flags |= IEF_SUSPEND; if (result<0) { DBLOCK(1, printf("eth_ioctl(..,%lx)=%d\n", NWIOSETHOPT, result)); return; } if (ip_port->ip_dl.dl_eth.de_state != IES_SETPROTO) return; /* drops through */ case IES_SETPROTO: result= arp_set_cb(ip_port->ip_dl.dl_eth.de_port, ip_port->ip_port, ipeth_arp_reply); if (result != NW_OK) { #if !CRAMPED printf("ipeth_main: arp_set_cb failed: %d\n", result); #endif return; } /* Wait until the interface is configured up. */ ip_port->ip_dl.dl_eth.de_state= IES_GETIPADDR; if (!(ip_port->ip_flags & IPF_IPADDRSET)) { ip_port->ip_dl.dl_eth.de_flags |= IEF_SUSPEND; return; } /* fall through */ case IES_GETIPADDR: ip_port->ip_dl.dl_eth.de_state= IES_MAIN; for (i=0, ip_fd= ip_fd_table; iif_flags & IFF_INUSE)) { continue; } if (ip_fd->if_port != ip_port) { continue; } if (ip_fd->if_flags & IFF_GIPCONF_IP) { ip_ioctl (i, NWIOGIPCONF); } } do_eth_read(ip_port); return; #if !CRAMPED default: ip_panic(( "unknown state: %d", ip_port->ip_dl.dl_eth.de_state)); #endif } } PRIVATE acc_t *get_eth_data (fd, offset, count, for_ioctl) int fd; size_t offset; size_t count; int for_ioctl; { ip_port_t *ip_port; acc_t *data; int result; ip_port= &ip_port_table[fd]; switch (ip_port->ip_dl.dl_eth.de_state) { case IES_SETPROTO: if (!count) { result= (int)offset; if (result<0) { ip_port->ip_dl.dl_eth.de_state= IES_ERROR; break; } if (ip_port->ip_dl.dl_eth.de_flags & IEF_SUSPEND) ipeth_main(ip_port); return NW_OK; } assert ((!offset) && (count == sizeof(struct nwio_ethopt))); { struct nwio_ethopt *ethopt; acc_t *acc; acc= bf_memreq(sizeof(*ethopt)); ethopt= (struct nwio_ethopt *)ptr2acc_data(acc); ethopt->nweo_flags= NWEO_COPY|NWEO_EN_BROAD| NWEO_EN_MULTI|NWEO_TYPESPEC; ethopt->nweo_type= HTONS(ETH_IP_PROTO); return acc; } case IES_MAIN: if (!count) { result= (int)offset; if (result<0) ip_warning(( "error on write: %d\n", result )); bf_afree (ip_port->ip_dl.dl_eth.de_frame); ip_port->ip_dl.dl_eth.de_frame= 0; if (ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP) { ip_port->ip_dl.dl_eth.de_flags &= ~IEF_WRITE_SP; ipeth_restart_send(ip_port); } return NW_OK; } data= bf_cut (ip_port->ip_dl.dl_eth.de_frame, offset, count); assert (data); return data; default: #if !CRAMPED printf( "get_eth_data(%d, 0x%d, 0x%d) called but ip_state=0x%x\n", fd, offset, count, ip_port->ip_dl.dl_eth.de_state); #endif break; } return 0; } PRIVATE int put_eth_data (port, offset, data, for_ioctl) int port; size_t offset; acc_t *data; int for_ioctl; { ip_port_t *ip_port; acc_t *pack; int result; ip_port= &ip_port_table[port]; assert(0); if (ip_port->ip_dl.dl_eth.de_flags & IEF_READ_IP) { if (!data) { result= (int)offset; if (result<0) { DBLOCK(1, printf( "ip.c: put_eth_data(..,%d,..)\n", result)); return NW_OK; } if (ip_port->ip_dl.dl_eth.de_flags & IEF_READ_SP) { ip_port->ip_dl.dl_eth.de_flags &= ~(IEF_READ_IP|IEF_READ_SP); do_eth_read(ip_port); } else ip_port->ip_dl.dl_eth.de_flags &= ~IEF_READ_IP; return NW_OK; } assert (!offset); /* Warning: the above assertion is illegal; puts and gets of data can be brokenup in any piece the server likes. However we assume that the server is eth.c and it transfers only whole packets. */ ip_eth_arrived(port, data, bf_bufsize(data)); return NW_OK; } #if !CRAMPED printf("ip_port->ip_dl.dl_eth.de_state= 0x%x", ip_port->ip_dl.dl_eth.de_state); ip_panic (( "strange status" )); #endif } PRIVATE void ipeth_set_ipaddr(ip_port) ip_port_t *ip_port; { arp_set_ipaddr (ip_port->ip_dl.dl_eth.de_port, ip_port->ip_ipaddr); if (ip_port->ip_dl.dl_eth.de_state == IES_GETIPADDR) ipeth_main(ip_port); } PRIVATE int ipeth_send(ip_port, dest, pack, broadcast) struct ip_port *ip_port; ipaddr_t dest; acc_t *pack; int broadcast; { int r; acc_t *eth_pack, *tail; size_t pack_size; eth_hdr_t *eth_hdr; xmit_hdr_t *xmit_hdr; ipaddr_t hostpart; time_t t; /* Start optimistic: the arp will succeed without blocking and the * ethernet packet can be sent without blocking also. Start with * the allocation of the ethernet header. */ eth_pack= bf_memreq(sizeof(*eth_hdr)); assert(eth_pack->acc_next == NULL); eth_pack->acc_next= pack; pack_size= bf_bufsize(eth_pack); if (pack_sizeeh_dst= broadcast_ethaddr; else { if ((dest & ip_port->ip_subnetmask) != (ip_port->ip_ipaddr & ip_port->ip_subnetmask)) { #if !CRAMPED ip_panic(( "invalid destination" )); #endif } hostpart= (dest & ~ip_port->ip_subnetmask); assert(hostpart != 0); assert(dest != ip_port->ip_ipaddr); r= arp_ip_eth(ip_port->ip_dl.dl_eth.de_port, dest, ð_hdr->eh_dst); if (r == NW_SUSPEND) { /* Unfortunately, the arp takes some time, use * the ethernet header to store the next hop * ip address and the current time. */ xmit_hdr= (xmit_hdr_t *)eth_hdr; xmit_hdr->xh_time= get_time(); xmit_hdr->xh_ipaddr= dest; eth_pack->acc_ext_link= NULL; if (ip_port->ip_dl.dl_eth.de_arp_head == NULL) ip_port->ip_dl.dl_eth.de_arp_head= eth_pack; else { ip_port->ip_dl.dl_eth.de_arp_tail-> acc_ext_link= eth_pack; } ip_port->ip_dl.dl_eth.de_arp_tail= eth_pack; return NW_OK; } if (r == EDSTNOTR))))))))))CH) { bf_afree(eth_pack); return EDSTNOTRCH; } assert(r == NW_OK); } /* If we have no write in progress, we can try to send the ethernet * packet using eth_send. If the IP packet is larger than mss, * unqueue the packet and let ipeth_restart_send deal with it. */ pack_size= bf_bufsize(eth_pack); if (ip_port->ip_dl.dl_eth.de_frame == NULL && pack_size <= ip_port->ip_mss + sizeof(*eth_hdr)) { r= eth_send(ip_port->ip_dl.dl_eth.de_fd, eth_pack, pack_size); if (r == NW_OK) return NW_OK; /* A non-blocking send is not possible, start a regular * send. */ assert(r == NW_WOULDBLOCK); ip_port->ip_dl.dl_eth.de_frame= eth_pack; r= eth_write(ip_port->ip_dl.dl_eth.de_fd, pack_size); if (r == NW_SUSPEND) { assert(!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)); ip_port->ip_dl.dl_eth.de_flags |= IEF_WRITE_SP; } assert(r == NW_OK || r == NW_SUSPEND); return NW_OK; } /* Enqueue the packet, and store the current time, in the * room for the ethernet source address. */ t= get_time(); assert(sizeof(t) <= sizeof(eth_hdr->eh_src)); memcpy(ð_hdr->eh_src, &t, sizeof(t)); eth_pack->acc_ext_link= NULL; if (ip_port->ip_dl.dl_eth.de_q_head == NULL) ip_port->ip_dl.dl_eth.de_q_head= eth_pack; else { ip_port->ip_dl.dl_eth.de_q_tail->acc_ext_link= eth_pack; } ip_port->ip_dl.dl_eth.de_q_tail= eth_pack; if (ip_port->ip_dl.dl_eth.de_frame == NULL) ipeth_restart_send(ip_port); return NW_OK; } PRIVATE void ipeth_restart_send(ip_port) ip_port_t *ip_port; { time_t now, enq_time; int r; acc_t *eth_pack, *ip_pack, *next_eth_pack, *next_part, *tail; size_t pack_size; eth_hdr_t *eth_hdr, *next_eth_hdr; now= get_time(); while (ip_port->ip_dl.dl_eth.de_q_head != NULL) { eth_pack= ip_port->ip_dl.dl_eth.de_q_head; ip_port->ip_dl.dl_eth.de_q_head= eth_pack->acc_ext_link; eth_hdr= (eth_hdr_t *)ptr2acc_data(eth_pack); pack_size= bf_bufsize(eth_pack); if (pack_size > ip_port->ip_mss+sizeof(*eth_hdr)) { /* Split the IP packet */ ip_pack= eth_pack->acc_next; next_part= ip_pack; ip_pack= ip_split_pack(ip_port, &next_part, ip_port->ip_mss); if (ip_pack == NULL) { bf_afree(eth_pack); continue; } /* Allocate new ethernet header */ next_eth_pack= bf_memreq(sizeof(*next_eth_hdr)); next_eth_hdr= (eth_hdr_t *)ptr2acc_data(next_eth_pack); *next_eth_hdr= *eth_hdr; next_eth_pack->acc_next= next_part; next_eth_pack->acc_ext_link= NULL; if (ip_port->ip_dl.dl_eth.de_q_head == NULL) ip_port->ip_dl.dl_eth.de_q_head= next_eth_pack; else ip_port->ip_dl.dl_eth.de_q_tail->acc_ext_link= next_eth_pack; ip_port->ip_dl.dl_eth.de_q_tail= next_eth_pack; eth_pack->acc_next= ip_pack; pack_size= bf_bufsize(eth_pack); } memcpy(&enq_time, ð_hdr->eh_src, sizeof(enq_time)); if (enq_time + HZ < now) { r= ipeth_update_ttl(enq_time, now, eth_pack); if (r == ETIMEDOUT) { ip_warning(( "should send ICMP ttl exceded" )); bf_afree(eth_pack); continue; } assert(r == NW_OK); } if (pack_sizeip_dl.dl_eth.de_frame == NULL); r= eth_send(ip_port->ip_dl.dl_eth.de_fd, eth_pack, pack_size); if (r == NW_OK) continue; /* A non-blocking send is not possible, start a regular * send. */ assert(r == NW_WOULDBLOCK); ip_port->ip_dl.dl_eth.de_frame= eth_pack; r= eth_write(ip_port->ip_dl.dl_eth.de_fd, pack_size); if (r == NW_SUSPEND) { assert(!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)); ip_port->ip_dl.dl_eth.de_flags |= IEF_WRITE_SP; return; } assert(r == NW_OK); } } PRIVATE void ipeth_arp_reply(ip_port_nr, ipaddr, eth_addr) int ip_port_nr; ipaddr_t ipaddr; ether_addr_t *eth_addr; { acc_t *prev, *eth_pack; int r; xmit_hdr_t *xmit_hdr; ip_port_t *ip_port; time_t t; eth_hdr_t *eth_hdr; ether_addr_t tmp_eth_addr; assert (ip_port_nr >= 0 && ip_port_nr < ip_conf_nr); ip_port= &ip_port_table[ip_port_nr]; for (;;) { for (prev= 0, eth_pack= ip_port->ip_dl.dl_eth.de_arp_head; eth_pack; prev= eth_pack, eth_pack= eth_pack->acc_ext_link) { xmit_hdr= (xmit_hdr_t *)ptr2acc_data(eth_pack); if (xmit_hdr->xh_ipaddr == ipaddr) break; } if (eth_pack == NULL) { /* No packet found. */ break; } /* Delete packet from the queue. */ if (prev == NULL) { ip_port->ip_dl.dl_eth.de_arp_head= eth_pack->acc_ext_link; } else { prev->acc_ext_link= eth_pack->acc_ext_link; if (prev->acc_ext_link == NULL) ip_port->ip_dl.dl_eth.de_arp_tail= prev; } if (eth_addr == NULL) { /* Destination is unreachable, delete packet. */ bf_afree(eth_pack); continue; } /* Fill in the ethernet address and put the packet on the * transmit queue. */ t= xmit_hdr->xh_time; eth_hdr= (eth_hdr_t *)ptr2acc_data(eth_pack); eth_hdr->eh_dst= *eth_addr; memcpy(ð_hdr->eh_src, &t, sizeof(t)); eth_pack->acc_ext_link= NULL; if (ip_port->ip_dl.dl_eth.de_q_head == NULL) ip_port->ip_dl.dl_eth.de_q_head= eth_pack; else { ip_port->ip_dl.dl_eth.de_q_tail->acc_ext_link= eth_pack; } ip_port->ip_dl.dl_eth.de_q_tail= eth_pack; } /* Try to get some more ARPs in progress. */ while (ip_port->ip_dl.dl_eth.de_arp_head) { eth_pack= ip_port->ip_dl.dl_eth.de_arp_head; xmit_hdr= (xmit_hdr_t *)ptr2acc_data(eth_pack); r= arp_ip_eth(ip_port->ip_dl.dl_eth.de_port, xmit_hdr->xh_ipaddr, &tmp_eth_addr); if (r == NW_SUSPEND) break; /* Normal case */ /* Dequeue the packet */ ip_port->ip_dl.dl_eth.de_arp_head= eth_pack->acc_ext_link; if (r == EDSTNOTRCH) { bf_afree(eth_pack); continue; } assert(r == NW_OK); /* Fill in the ethernet address and put the packet on the * transmit queue. */ t= xmit_hdr->xh_time; eth_hdr= (eth_hdr_t *)ptr2acc_data(eth_pack); eth_hdr->eh_dst= tmp_eth_addr; memcpy(ð_hdr->eh_src, &t, sizeof(t)); eth_pack->acc_ext_link= NULL; if (ip_port->ip_dl.dl_eth.de_q_head == NULL) ip_port->ip_dl.dl_eth.de_q_head= eth_pack; else { ip_port->ip_dl.dl_eth.de_q_tail->acc_ext_link= eth_pack; } ip_port->ip_dl.dl_eth.de_q_tail= eth_pack; } /* Restart sending ethernet packets. */ if (ip_port->ip_dl.dl_eth.de_frame == NULL) ipeth_restart_send(ip_port); } PRIVATE int ipeth_update_ttl(enq_time, now, eth_pack) time_t enq_time; time_t now; acc_t *eth_pack; { int ttl_diff; ip_hdr_t *ip_hdr; u32_t sum; u16_t word; acc_t *ip_pack; ttl_diff= (now-enq_time)/HZ; enq_time += ttl_diff*HZ; assert(enq_time <= now && enq_time + HZ > now); ip_pack= eth_pack->acc_next; assert(ip_pack->acc_length >= sizeof(*ip_hdr)); assert(ip_pack->acc_linkC == 1 && ip_pack->acc_buffer->buf_linkC == 1); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_pack); if (ip_hdr->ih_ttl <= ttl_diff) return ETIMEDOUT; sum= (u16_t)~ip_hdr->ih_hdr_chk; word= *(u16_t *)&ip_hdr->ih_ttl; if (word > sum) sum += 0xffff - word; else sum -= word; ip_hdr->ih_ttl -= ttl_diff; word= *(u16_t *)&ip_hdr->ih_ttl; sum += word; if (sum > 0xffff) sum -= 0xffff; assert(!(sum & 0xffff0000)); ip_hdr->ih_hdr_chk= ~sum; assert(ip_hdr->ih_ttl > 0); return NW_OK; } PRIVATE void do_eth_read(ip_port) ip_port_t *ip_port; { int result; assert(!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_IP)); for (;;) { ip_port->ip_dl.dl_eth.de_flags |= IEF_READ_IP; result= eth_read (ip_port->ip_dl.dl_eth.de_fd, ETH_MAX_PACK_SIZE); if (result == NW_SUSPEND) { assert(!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_SP)); ip_port->ip_dl.dl_eth.de_flags |= IEF_READ_SP; return; } ip_port->ip_dl.dl_eth.de_flags &= ~IEF_READ_IP; if (result<0) { return; } } } PRIVATE void ip_eth_arrived(port, pack, pack_size) int port; acc_t *pack; size_t pack_size; { int broadcast; ip_port_t *ip_port; ip_port= &ip_port_table[port]; broadcast= (*(u8_t *)ptr2acc_data(pack) & 1); pack= bf_delhead(pack, ETH_HDR_SIZE); if (broadcast) ip_arrived_broadcast(ip_port, pack); else ip_arrived(ip_port, pack); } /* * $PchId: ip_eth.c,v 1.9 1996/12/17 07:55:21 philip Exp $ */ /* ip_int.h Copyright 1995 Philip Homburg */ #ifndef INET_IP_INT_H #define INET_IP_INT_H #define IP_FD_NR (8*IP_PORT_MAX) #define IP_ASS_NR 3 #define IP_42BSD_BCAST 1 /* hostnumber 0 is also network broadcast */ struct ip_port; struct ip_fd; typedef void (*ip_dev_t) ARGS(( struct ip_port *ip_port )); typedef int (*ip_dev_send_t) ARGS(( struct ip_port *ip_port, ipaddr_t dest, acc_t *pack, int broadcast )); #define IP_PROTO_HASH_NR 32 typedef struct ip_port { int ip_flags, ip_dl_type; int ip_port; union { struct { int de_state; int de_flags; int de_port; int de_fd; acc_t *de_frame; acc_t *de_q_head; acc_t *de_q_tail; acc_t *de_arp_head; acc_t *de_arp_tail; } dl_eth; struct { int ps_port; acc_t *ps_send_head; acc_t *ps_send_tail; } dl_ps; } ip_dl; ipaddr_t ip_ipaddr; ipaddr_t ip_netmask; ipaddr_t ip_subnetmask; u16_t ip_frame_id; u16_t ip_mss; ip_dev_t ip_dev_main; ip_dev_t ip_dev_set_ipaddr; ip_dev_send_t ip_dev_send; acc_t *ip_loopb_head; acc_t *ip_loopb_tail; event_t ip_loopb_event; struct ip_fd *ip_proto_any; struct ip_fd *ip_proto[IP_PROTO_HASH_NR]; } ip_port_t; #define IES_EMPTY 0x0 #define IES_SETPROTO 0x1 #define IES_GETIPADDR 0x2 #define IES_MAIN 0x3 #define IES_ERROR 0x4 #define IEF_EMPTY 0x1 #define IEF_SUSPEND 0x8 #define IEF_READ_IP 0x10 #define IEF_READ_SP 0x20 #define IEF_WRITE_SP 0x80 #define IPF_EMPTY 0x0 #define IPF_CONFIGURED 0x1 #define IPF_IPADDRSET 0x2 #define IPF_NETMASKSET 0x4 #define IPDL_ETH NETTYPE_ETH #define IPDL_PSIP NETTYPE_PSIP typedef struct ip_ass { acc_t *ia_frags; int ia_min_ttl; ip_port_t *ia_port; time_t ia_first_time; ipaddr_t ia_srcaddr, ia_dstaddr; int ia_proto, ia_id; } ip_ass_t; typedef struct ip_fd { int if_flags; struct nwio_ipopt if_ipopt; ip_port_t *if_port; struct ip_fd *if_proto_next; int if_srfd; acc_t *if_rdbuf_head; acc_t *if_rdbuf_tail; get_userdata_t if_get_userdata; put_userdata_t if_put_userdata; put_pkt_t if_put_pkt; time_t if_exp_time; size_t if_rd_count; } ip_fd_t; #define IFF_EMPTY 0x0 #define IFF_INUSE 0x1 #define IFF_OPTSET 0x2 #define IFF_BUSY 0xC # define IFF_READ_IP 0x4 # define IFF_GIPCONF_IP 0x8 typedef enum nettype { IPNT_ZERO, /* 0.xx.xx.xx */ IPNT_CLASS_A, /* 1.xx.xx.xx .. 126.xx.xx.xx */ IPNT_LOCAL, /* 127.xx.xx.xx */ IPNT_CLASS_B, /* 128.xx.xx.xx .. 191.xx.xx.xx */ IPNT_CLASS_C, /* 192.xx.xx.xx .. 223.xx.xx.xx */ IPNT_CLASS_D, /* 224.xx.xx.xx .. 239.xx.xx.xx */ IPNT_CLASS_E, /* 240.xx.xx.xx .. 247.xx.xx.xx */ IPNT_MARTIAN, /* 248.xx.xx.xx .. 254.xx.xx.xx + others */ IPNT_BROADCAST /* 255.255.255.255 */ } nettype_t; /* ip_eth.c */ int ipeth_init ARGS(( ip_port_t *ip_port )); /* ip_ioctl.c */ void ip_hash_proto ARGS(( ip_fd_t *ip_fd )); void ip_unhash_proto ARGS(( ip_fd_t *ip_fd )); /* ip_lib.c */ ipaddr_t ip_get_netmask ARGS(( ipaddr_t hostaddr )); ipaddr_t ip_get_ifaddr ARGS(( int ip_port_nr )); int ip_chk_hdropt ARGS(( u8_t *opt, int optlen )); void ip_print_frags ARGS(( acc_t *acc )); nettype_t ip_nettype ARGS(( ipaddr_t ipaddr )); ipaddr_t ip_netmask ARGS(( nettype_t nettype )); char *ip_nettoa ARGS(( nettype_t nettype )); /* ip_ps.c */ int ipps_init ARGS(( ip_port_t *ip_port )); void ipps_get ARGS(( int ip_port_nr )); void ipps_put ARGS(( int ip_port_nr, acc_t *pack )); /* ip_read.c */ void ip_port_arrive ARGS(( ip_port_t *port, acc_t *pack, ip_hdr_t *ip_hdr )); void ip_arrived ARGS(( ip_port_t *port, acc_t *pack )); void ip_arrived_broadcast ARGS(( ip_port_t *port, acc_t *pack )); void ip_process_loopb ARGS(( event_t *ev, ev_arg_t arg )); /* ip_write.c */ void dll_eth_write_frame ARGS(( ip_port_t *port )); acc_t *ip_split_pack ARGS(( ip_port_t *ip_port, acc_t **ref_last, int first_size )); void ip_hdr_chksum ARGS(( ip_hdr_t *ip_hdr, int ip_hdr_len )); extern ip_fd_t ip_fd_table[IP_FD_NR]; extern ip_port_t *ip_port_table; extern ip_ass_t ip_ass_table[IP_ASS_NR]; #define NWIO_DEFAULT (NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | \ NWIO_RWDATALL | NWIO_HDR_O_SPEC) #endif /* INET_IP_INT_H */ /* * $PchId: ip_int.h,v 1.6 1996/12/17 07:59:36 philip Exp $ */ /* ip_ioctl.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "event.h" #include "type.h" #include "arp.h" #include "assert.h" #include "clock.h" #include "icmp_lib.h" #include "ip.h" #include "ip_int.h" #include "ipr.h" THIS_FILE FORWARD int ip_checkopt ARGS(( ip_fd_t *ip_fd )); FORWARD void reply_thr_get ARGS(( ip_fd_t *ip_fd, size_t reply, int for_ioctl )); PUBLIC int ip_ioctl (fd, req) int fd; ioreq_t req; { ip_fd_t *ip_fd; ip_port_t *ip_port; nwio_ipopt_t *ipopt; nwio_ipopt_t oldopt, newopt; nwio_ipconf_t *ipconf; nwio_route_t *route_ent; acc_t *data; int result; unsigned int new_en_flags, new_di_flags, old_en_flags, old_di_flags; unsigned long new_flags; int old_ip_flags; int ent_no; assert (fd>=0 && fd<=IP_FD_NR); ip_fd= &ip_fd_table[fd]; assert (ip_fd->if_flags & IFF_INUSE); switch (req) { case NWIOSIPOPT: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_ipopt_t), TRUE); data= bf_packIffLess (data, sizeof(nwio_ipopt_t)); assert (data->acc_length == sizeof(nwio_ipopt_t)); ipopt= (nwio_ipopt_t *)ptr2acc_data(data); oldopt= ip_fd->if_ipopt; newopt= *ipopt; old_en_flags= oldopt.nwio_flags & 0xffff; old_di_flags= (oldopt.nwio_flags >> 16) & 0xffff; new_en_flags= newopt.nwio_flags & 0xffff; new_di_flags= (newopt.nwio_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) { bf_afree(data); reply_thr_get (ip_fd, EBADMODE, TRUE); return NW_OK; } /* NWIO_ACC_MASK */ if (new_di_flags & NWIO_ACC_MASK) { bf_afree(data); reply_thr_get (ip_fd, EBADMODE, TRUE); return NW_OK; /* access modes can't be disable */ } if (!(new_en_flags & NWIO_ACC_MASK)) new_en_flags |= (old_en_flags & NWIO_ACC_MASK); /* NWIO_LOC_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_LOC_MASK)) { new_en_flags |= (old_en_flags & NWIO_LOC_MASK); new_di_flags |= (old_di_flags & NWIO_LOC_MASK); } /* NWIO_BROAD_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_BROAD_MASK)) { new_en_flags |= (old_en_flags & NWIO_BROAD_MASK); new_di_flags |= (old_di_flags & NWIO_BROAD_MASK); } /* NWIO_REM_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_REM_MASK)) { new_en_flags |= (old_en_flags & NWIO_REM_MASK); new_di_flags |= (old_di_flags & NWIO_REM_MASK); newopt.nwio_rem= oldopt.nwio_rem; } /* NWIO_PROTO_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_PROTO_MASK)) { new_en_flags |= (old_en_flags & NWIO_PROTO_MASK); new_di_flags |= (old_di_flags & NWIO_PROTO_MASK); newopt.nwio_proto= oldopt.nwio_proto; } /* NWIO_HDR_O_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_HDR_O_MASK)) { new_en_flags |= (old_en_flags & NWIO_HDR_O_MASK); new_di_flags |= (old_di_flags & NWIO_HDR_O_MASK); newopt.nwio_tos= oldopt.nwio_tos; newopt.nwio_ttl= oldopt.nwio_ttl; newopt.nwio_df= oldopt.nwio_df; newopt.nwio_hdropt= oldopt.nwio_hdropt; } /* NWIO_RW_MASK */ if (!((new_en_flags|new_di_flags) & NWIO_RW_MASK)) { new_en_flags |= (old_en_flags & NWIO_RW_MASK); new_di_flags |= (old_di_flags & NWIO_RW_MASK); } new_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; if ((new_flags & NWIO_RWDATONLY) && (new_flags & (NWIO_REMANY|NWIO_PROTOANY|NWIO_HDR_O_ANY))) { bf_afree(data); reply_thr_get(ip_fd, EBADMODE, TRUE); return NW_OK; } if (ip_fd->if_flags & IFF_OPTSET) ip_unhash_proto(ip_fd); newopt.nwio_flags= new_flags; ip_fd->if_ipopt= newopt; result= ip_checkopt(ip_fd); if (result<0) ip_fd->if_ipopt= oldopt; bf_afree(data); reply_thr_get (ip_fd, result, TRUE); return NW_OK; case NWIOGIPOPT: data= bf_memreq(sizeof(nwio_ipopt_t)); ipopt= (nwio_ipopt_t *)ptr2acc_data(data); *ipopt= ip_fd->if_ipopt; result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, 0, data, TRUE); return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIOSIPCONF: ip_port= ip_fd->if_port; data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_ipconf_t), TRUE); data= bf_packIffLess (data, sizeof(nwio_ipconf_t)); assert (data->acc_length == sizeof(nwio_ipconf_t)); old_ip_flags= ip_port->ip_flags; ipconf= (nwio_ipconf_t *)ptr2acc_data(data); if (ipconf->nwic_flags & ~NWIC_FLAGS) { bf_afree(data); return (*ip_fd->if_put_userdata)(ip_fd-> if_srfd, EBADMODE, (acc_t *)0, TRUE); } if (ipconf->nwic_flags & NWIC_IPADDR_SET) { ip_port->ip_ipaddr= ipconf->nwic_ipaddr; ip_port->ip_flags |= IPF_IPADDRSET; ip_port->ip_netmask= ip_netmask(ip_nettype(ipconf->nwic_ipaddr)); if (!(ip_port->ip_flags & IPF_NETMASKSET)) { ip_port->ip_subnetmask= ip_port->ip_netmask; } (*ip_port->ip_dev_set_ipaddr)(ip_port); } if (ipconf->nwic_flags & NWIC_NETMASK_SET) { ip_port->ip_subnetmask= ipconf->nwic_netmask; ip_port->ip_flags |= IPF_NETMASKSET; } bf_afree(data); return (*ip_fd->if_put_userdata)(ip_fd-> if_srfd, NW_OK, (acc_t *)0, TRUE); case NWIOGIPCONF: ip_port= ip_fd->if_port; if (!(ip_port->ip_flags & IPF_IPADDRSET)) { ip_fd->if_flags |= IFF_GIPCONF_IP; return NW_SUSPEND; } ip_fd->if_flags &= ~IFF_GIPCONF_IP; data= bf_memreq(sizeof(nwio_ipconf_t)); ipconf= (nwio_ipconf_t *)ptr2acc_data(data); ipconf->nwic_flags= NWIC_IPADDR_SET; ipconf->nwic_ipaddr= ip_port->ip_ipaddr; ipconf->nwic_netmask= ip_port->ip_subnetmask; if (ip_port->ip_flags & IPF_NETMASKSET) ipconf->nwic_flags |= NWIC_NETMASK_SET; result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, 0, data, TRUE); return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIOGIPIROUTE: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_route_t), TRUE); if (data == NULL) { return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EFAULT, NULL, TRUE); } data= bf_packIffLess (data, sizeof(nwio_route_t) ); route_ent= (nwio_route_t *)ptr2acc_data(data); ent_no= route_ent->nwr_ent_no; bf_afree(data); data= bf_memreq(sizeof(nwio_route_t)); route_ent= (nwio_route_t *)ptr2acc_data(data); result= ipr_get_iroute(ent_no, route_ent); if (result < 0) bf_afree(data); else { assert(result == NW_OK); result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, 0, data, TRUE); } return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIOSIPIROUTE: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_route_t), TRUE); if (data == NULL) { return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EFAULT, NULL, TRUE); } data= bf_packIffLess (data, sizeof(nwio_route_t) ); route_ent= (nwio_route_t *)ptr2acc_data(data); result= ipr_add_iroute(ip_fd->if_port->ip_port, route_ent->nwr_dest, route_ent->nwr_netmask, route_ent->nwr_gateway, (route_ent->nwr_flags & NWRF_UNREACHABLE) ? IRTD_UNREACHABLE : route_ent->nwr_dist, !!(route_ent->nwr_flags & NWRF_STATIC), NULL); bf_afree(data); return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIOGIPOROUTE: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_route_t), TRUE); if (data == NULL) { return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EFAULT, NULL, TRUE); } data= bf_packIffLess (data, sizeof(nwio_route_t) ); route_ent= (nwio_route_t *)ptr2acc_data(data); ent_no= route_ent->nwr_ent_no; bf_afree(data); data= bf_memreq(sizeof(nwio_route_t)); route_ent= (nwio_route_t *)ptr2acc_data(data); result= ipr_get_oroute(ent_no, route_ent); if (result < 0) bf_afree(data); else { assert(result == NW_OK); result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, 0, data, TRUE); } return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIODIPIROUTE: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_route_t), TRUE); if (data == NULL) { return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EFAULT, NULL, TRUE); } data= bf_packIffLess (data, sizeof(nwio_route_t) ); route_ent= (nwio_route_t *)ptr2acc_data(data); resul()*)+),)-)t= ipr_del_iroute(ip_fd->if_port->ip_port, route_ent->nwr_dest, route_ent->nwr_netmask, route_ent->nwr_gateway, (route_ent->nwr_flags & NWRF_UNREACHABLE) ? IRTD_UNREACHABLE : route_ent->nwr_dist, !!(route_ent->nwr_flags & NWRF_STATIC)); bf_afree(data); return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); case NWIOSIPOROUTE: data= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, 0, sizeof(nwio_route_t), TRUE); if (data == NULL) { return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EFAULT, NULL, TRUE); } data= bf_packIffLess (data, sizeof(nwio_route_t) ); route_ent= (nwio_route_t *)ptr2acc_data(data); result= ipr_add_oroute(ip_fd->if_port->ip_port, route_ent->nwr_dest, route_ent->nwr_netmask, route_ent->nwr_gateway, (time_t)0, route_ent->nwr_dist, !!(route_ent->nwr_flags & NWRF_STATIC), route_ent->nwr_pref, NULL); bf_afree(data); return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, TRUE); default: break; } DBLOCK(1, printf("replying EBADIOCTL\n")); return (*ip_fd->if_put_userdata)(ip_fd-> if_srfd, EBADIOCTL, (acc_t *)0, TRUE); } PUBLIC void ip_hash_proto(ip_fd) ip_fd_t *ip_fd; { ip_port_t *ip_port; int hash; ip_port= ip_fd->if_port; if (ip_fd->if_ipopt.nwio_flags & NWIO_PROTOANY) { ip_fd->if_proto_next= ip_port->ip_proto_any; ip_port->ip_proto_any= ip_fd; } else { hash= ip_fd->if_ipopt.nwio_proto & (IP_PROTO_HASH_NR-1); ip_fd->if_proto_next= ip_port->ip_proto[hash]; ip_port->ip_proto[hash]= ip_fd; } } PUBLIC void ip_unhash_proto(ip_fd) ip_fd_t *ip_fd; { ip_port_t *ip_port; ip_fd_t *prev, *curr, **ip_fd_p; int hash; ip_port= ip_fd->if_port; if (ip_fd->if_ipopt.nwio_flags & NWIO_PROTOANY) { ip_fd_p= &ip_port->ip_proto_any; } else { hash= ip_fd->if_ipopt.nwio_proto & (IP_PROTO_HASH_NR-1); ip_fd_p= &ip_port->ip_proto[hash]; } for (prev= NULL, curr= *ip_fd_p; curr; prev= curr, curr= curr->if_proto_next) { if (curr == ip_fd) break; } assert(curr); if (prev) prev->if_proto_next= curr->if_proto_next; else *ip_fd_p= curr->if_proto_next; } PRIVATE int ip_checkopt (ip_fd) ip_fd_t *ip_fd; { /* bug: we don't check access modes yet */ unsigned long flags; unsigned int en_di_flags; ip_port_t *port; acc_t *pack; int result; flags= ip_fd->if_ipopt.nwio_flags; en_di_flags= (flags >>16) | (flags & 0xffff); if (flags & NWIO_HDR_O_SPEC) { result= ip_chk_hdropt (ip_fd->if_ipopt.nwio_hdropt.iho_data, ip_fd->if_ipopt.nwio_hdropt.iho_opt_siz); if (result<0) return result; } if ((en_di_flags & NWIO_ACC_MASK) && (en_di_flags & NWIO_LOC_MASK) && (en_di_flags & NWIO_BROAD_MASK) && (en_di_flags & NWIO_REM_MASK) && (en_di_flags & NWIO_PROTO_MASK) && (en_di_flags & NWIO_HDR_O_MASK) && (en_di_flags & NWIO_RW_MASK)) { ip_fd->if_flags |= IFF_OPTSET; ip_hash_proto(ip_fd); } else ip_fd->if_flags &= ~IFF_OPTSET; while (ip_fd->if_rdbuf_head) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } return NW_OK; } PRIVATE void reply_thr_get(ip_fd, reply, for_ioctl) ip_fd_t *ip_fd; size_t reply; int for_ioctl; { acc_t *result; result= (ip_fd->if_get_userdata)(ip_fd->if_srfd, reply, (size_t)0, for_ioctl); assert (!result); } /* * $PchId: ip_ioctl.c,v 1.8 1996/12/17 07:56:18 philip Exp $ */ /* ip_lib.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "event.h" #include "type.h" #include "assert.h" #include "io.h" #include "ip_int.h" THIS_FILE PUBLIC ipaddr_t ip_get_netmask (hostaddr) ipaddr_t hostaddr; { return ip_netmask(ip_nettype(hostaddr)); } PUBLIC int ip_chk_hdropt (opt, optlen) u8_t *opt; int optlen; { int i, security_present= FALSE, lose_source_present= FALSE, strict_source_present= FALSE, record_route_present= FALSE, timestamp_present= FALSE; assert (!(optlen & 3)); i= 0; while (i optlen) { DBLOCK(1, printf("option of wrong length\n")); return EINVAL; } return NW_OK; } PUBLIC void ip_print_frags(acc) acc_t *acc; { #if DEBUG ip_hdr_t *ip_hdr; int first; if (!acc) printf("(null)"); for (first= 1; acc; acc= acc->acc_ext_link, first= 0) { assert (acc->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(acc); if (first) { writeIpAddr(ip_hdr->ih_src); printf(" > "); writeIpAddr(ip_hdr->ih_dst); } printf(" {%x:%d@%d%c}", ntohs(ip_hdr->ih_id), ntohs(ip_hdr->ih_length), (ntohs(ip_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK)*8, (ntohs(ip_hdr->ih_flags_fragoff) & IH_MORE_FRAGS) ? '+' : '\0'); } #endif } PUBLIC ipaddr_t ip_get_ifaddr(port_nr) int port_nr; { assert(port_nr >= 0 && port_nr < ip_conf_nr); return ip_port_table[port_nr].ip_ipaddr; } PUBLIC nettype_t ip_nettype(ipaddr) ipaddr_t ipaddr; { u8_t highbyte; nettype_t nettype; ipaddr= ntohl(ipaddr); highbyte= (ipaddr >> 24) & 0xff; if (highbyte == 0) { if (ipaddr == 0) nettype= IPNT_ZERO; else nettype= IPNT_MARTIAN; } else if (highbyte < 127) nettype= IPNT_CLASS_A; else if (highbyte == 127) nettype= IPNT_LOCAL; else if (highbyte < 192) nettype= IPNT_CLASS_B; else if (highbyte < 224) nettype= IPNT_CLASS_C; else if (highbyte < 240) nettype= IPNT_CLASS_D; else if (highbyte < 248) nettype= IPNT_CLASS_E; else if (highbyte < 255) nettype= IPNT_MARTIAN; else { if (ipaddr == (ipaddr_t)-1) nettype= IPNT_BROADCAST; else nettype= IPNT_MARTIAN; } return nettype; } PUBLIC ipaddr_t ip_netmask(nettype) nettype_t nettype; { switch(nettype) { case IPNT_ZERO: return HTONL(0x00000000); case IPNT_CLASS_A: case IPNT_LOCAL: return HTONL(0xff000000); case IPNT_CLASS_B: return HTONL(0xffff0000); case IPNT_CLASS_C: return HTONL(0xffffff00); default: return HTONL(0xffffffff); } } #if 0 PUBLIC char *ip_nettoa(nettype) nettype_t nettype; { switch(nettype) { case IPNT_ZERO: return "zero"; case IPNT_CLASS_A: return "class A"; case IPNT_LOCAL: return "local"; case IPNT_CLASS_B: return "class B"; case IPNT_CLASS_C: return "class C"; case IPNT_CLASS_D: return "class D"; case IPNT_CLASS_E: return "class E"; case IPNT_MARTIAN: return "martian"; case IPNT_BROADCAST: return "broadcast"; default: return ""; } } #endif /* * $PchId: ip_lib.c,v 1.6 1996/12/17 07:59:36 philip Exp $ */ /* generic/ip_ps.c pseudo IP specific part of the IP implementation Created: Apr 23, 1993 by Philip Homburg Copyright 1995 Philip Homburg */ #include "inet.h" #include "assert.h" #include "type.h" #include "buf.h" #include "event.h" #include "ip.h" #include "ip_int.h" #include "psip.h" THIS_FILE FORWARD void ipps_main ARGS(( ip_port_t *ip_port )); FORWARD void ipps_set_ipaddr ARGS(( ip_port_t *ip_port )); FORWARD int ipps_send ARGS(( struct ip_port *ip_port, ipaddr_t dest, acc_t *pack, int broadcast )); PUBLIC int ipps_init(ip_port) ip_port_t *ip_port; { int result; result= psip_enable(ip_port->ip_dl.dl_ps.ps_port, ip_port->ip_port); if (result == -1) return -1; #if ZERO ip_port->ip_dl.dl_ps.ps_send_head= NULL; ip_port->ip_dl.dl_ps.ps_send_tail= NULL; #endif ip_port->ip_dev_main= ipps_main; ip_port->ip_dev_set_ipaddr= ipps_set_ipaddr; ip_port->ip_dev_send= ipps_send; return result; } PUBLIC void ipps_get(ip_port_nr) int ip_port_nr; { int result; acc_t *pack; ip_port_t *ip_port; assert(ip_port_nr >= 0 && ip_port_nr < ip_conf_nr); ip_port= &ip_port_table[ip_port_nr]; assert(ip_port->ip_dl_type == IPDL_PSIP); while (ip_port->ip_dl.dl_ps.ps_send_head != NULL) { pack= ip_port->ip_dl.dl_ps.ps_send_head; ip_port->ip_dl.dl_ps.ps_send_head= pack->acc_ext_link; result= psip_send(ip_port->ip_dl.dl_ps.ps_port, pack); if (result != NW_SUSPEND) { assert(result == NW_OK); continue; } pack->acc_ext_link= ip_port->ip_dl.dl_ps.ps_send_head; ip_port->ip_dl.dl_ps.ps_send_head= pack; if (pack->acc_ext_link == NULL) ip_port->ip_dl.dl_ps.ps_send_tail= pack; break; } } PUBLIC void ipps_put(ip_port_nr, pack) int ip_port_nr; acc_t *pack; { ip_port_t *ip_port; assert(ip_port_nr >= 0 && ip_port_nr < ip_conf_nr); ip_port= &ip_port_table[ip_port_nr]; assert(ip_port->ip_dl_type == IPDL_PSIP); ip_arrived(ip_port, pack); } PRIVATE void ipps_main(ip_port) ip_port_t *ip_port; { /* nothing to do */ } PRIVATE void ipps_set_ipaddr(ip_port) ip_port_t *ip_port; { int i; ip_fd_t *ip_fd; /* revive calls waiting for an ip addresses */ for (i=0, ip_fd= ip_fd_table; iif_flags & IFF_INUSE)) { continue; } if (ip_fd->if_port != ip_port) { continue; } if (ip_fd->if_flags & IFF_GIPCONF_IP) { ip_ioctl (i, NWIOGIPCONF); } } } PRIVATE int ipps_send(ip_port, dest, pack, broadcast) struct ip_port *ip_port; ipaddr_t dest; acc_t *pack; int broadcast; { int result; if (broadcast) ip_arrived_broadcast(ip_port, bf_dupacc(pack)); if (ip_port->ip_dl.dl_ps.ps_send_head == NULL) { result= psip_send(ip_port->ip_dl.dl_ps.ps_port, pack); if (result != NW_SUSPEND) { assert(result == NW_OK); return result; } assert (ip_port->ip_dl.dl_ps.ps_send_head == NULL); ip_port->ip_dl.dl_ps.ps_send_head= pack; } else ip_port->ip_dl.dl_ps.ps_send_tail->acc_ext_link= pack; ip_port->ip_dl.dl_ps.ps_send_tail= pack; pack->acc_ext_link= NULL; return NW_OK; } /* * $PchId: ip_ps.c,v 1.5 1995/11/21 06:45:27 philip Exp $ */ /* ip_read.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "type.h" #include "assert.h" #include "icmp_lib.h" #include "io.h" #include "ip.h" #include "ip_int.h" #include "ipr.h" THIS_FILE FORWARD ip_ass_t *find_ass_ent ARGS(( ip_port_t *ip_port, U16_t id, int proto, ipaddr_t src, ipaddr_t dst )); FORWARD acc_t *merge_frags ARGS(( acc_t *first, acc_t *second )); FORWARD int ip_frag_chk ARGS(( acc_t *pack )); FORWARD acc_t *reassemble ARGS(( ip_port_t *ip_port, acc_t *pack, ip_hdr_t *ip_hdr )); FORWARD int broadcast_dst ARGS(( ip_port_t *ip_port, ipaddr_t dest )); FORWARD void packet2user ARGS(( ip_fd_t *ip_fd, acc_t *pack, time_t exp_time )); PUBLIC int ip_read (fd, count) int fd; size_t count; { ip_fd_t *ip_fd; acc_t *pack; ip_fd= &ip_fd_table[fd]; if (!(ip_fd->if_flags & IFF_OPTSET)) return (*ip_fd->if_put_userdata)(ip_fd->if_srfd, EBADMODE, (acc_t *)0, FALSE); ip_fd->if_rd_count= count; ip_fd->if_flags |= IFF_READ_IP; if (ip_fd->if_rdbuf_head) { if (get_time() <= ip_fd->if_exp_time) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; packet2user (ip_fd, pack, ip_fd->if_exp_time); assert(!(ip_fd->if_flags & IFF_READ_IP)); return NW_OK; } while (ip_fd->if_rdbuf_head) { pack= ip_fd->if_rdbuf_head; ip_fd->if_rdbuf_head= pack->acc_ext_link; bf_afree(pack); } } return NW_SUSPEND; } PRIVATE acc_t *reassemble (ip_port, pack, pack_hdr) ip_port_t *ip_port; acc_t *pack; ip_hdr_t *pack_hdr; { ip_ass_t *ass_ent; size_t pack_hdr_len, pack_data_len, pack_offset, tmp_offset; u16_t pack_flags_fragoff; acc_t *prev_acc, *curr_acc, *next_acc, *head_acc, *tmp_acc; ip_hdr_t *tmp_hdr; time_t first_time; ass_ent= find_ass_ent (ip_port, pack_hdr->ih_id, pack_hdr->ih_proto, pack_hdr->ih_src, pack_hdr->ih_dst); pack_flags_fragoff= ntohs(pack_hdr->ih_flags_fragoff); pack_hdr_len= (pack_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; pack_data_len= ntohs(pack_hdr->ih_length)-pack_hdr_len; pack_offset= (pack_flags_fragoff & IH_FRAGOFF_MASK)*8; pack->acc_ext_link= NULL; head_acc= ass_ent->ia_frags; ass_ent->ia_frags= NULL; if (head_acc == NULL) { ass_ent->ia_frags= pack; return NULL; } prev_acc= NULL; curr_acc= NULL; next_acc= head_acc; while(next_acc) { tmp_hdr= (ip_hdr_t *)ptr2acc_data(next_acc); tmp_offset= (ntohs(tmp_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK)*8; if (pack_offset < tmp_offset) break; prev_acc= curr_acc; curr_acc= next_acc; next_acc= next_acc->acc_ext_link; } if (curr_acc == NULL) { assert(prev_acc == NULL); assert(next_acc != NULL); curr_acc= merge_frags(pack, next_acc); head_acc= curr_acc; } else { curr_acc= merge_frags(curr_acc, pack); if (next_acc != NULL) curr_acc= merge_frags(curr_acc, next_acc); if (prev_acc != NULL) prev_acc->acc_ext_link= curr_acc; else head_acc= curr_acc; } ass_ent->ia_frags= head_acc; pack= ass_ent->ia_frags; pack_hdr= (ip_hdr_t *)ptr2acc_data(pack); pack_flags_fragoff= ntohs(pack_hdr->ih_flags_fragoff); if (!(pack_flags_fragoff & (IH_FRAGOFF_MASK|IH_MORE_FRAGS))) /* it's now a complete packet */ { first_time= ass_ent->ia_first_time; ass_ent->ia_frags= 0; ass_ent->ia_first_time= 0; while (pack->acc_ext_link) { tmp_acc= pack->acc_ext_link; pack->acc_ext_link= tmp_acc->acc_ext_link; bf_afree(tmp_acc); } if ((ass_ent->ia_min_ttl) * HZ + first_time < get_time()) icmp_snd_time_exceeded(ip_port->ip_port, pack, ICMP_FRAG_REASSEM); else return pack; } return NULL; } PRIVATE acc_t *merge_frags (first, second) acc_t *first, *second; { ip_hdr_t *first_hdr, *second_hdr; size_t first_hdr_size, second_hdr_size, first_datasize, second_datasize, first_offset, second_offset; acc_t *cut_second, *tmp_acc; if (!second) { first->acc_ext_link= NULL; return first; } assert (first->acc_length >= IP_MIN_HDR_SIZE); assert (second->acc_length >= IP_MIN_HDR_SIZE); first_hdr= (ip_hdr_t *)ptr2acc_data(first); first_offset= (ntohs(first_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK) * 8; first_hdr_size= (first_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; first_datasize= ntohs(first_hdr->ih_length) - first_hdr_size; second_hdr= (ip_hdr_t *)ptr2acc_data(second); second_offset= (ntohs(second_hdr->ih_flags_fragoff) & IH_FRAGOFF_MASK) * 8; second_hdr_size= (second_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; second_datasize= ntohs(second_hdr->ih_length) - second_hdr_size; assert (first_hdr_size + first_datasize == bf_bufsize(first)); assert (second_hdr_size + second_datasize == bf_bufsize(second)); assert (second_offset >= first_offset); if (second_offset > first_offset+first_datasize) { DBLOCK(1, printf("ip fragments out of order\n")); first->acc_ext_link= second; return first; } if (second_offset + second_datasize <= first_offset + first_datasize) { /* May cause problems if we try to merge. */ bf_afree(first); return second; } if (!(second_hdr->ih_flags_fragoff & HTONS(IH_MORE_FRAGS))) first_hdr->ih_flags_fragoff &= ~HTONS(IH_MORE_FRAGS); second_datasize= second_offset+second_datasize-(first_offset+ first_datasize); cut_second= bf_cut(second, second_hdr_size + first_offset+ first_datasize-second_offset, second_datasize); tmp_acc= second->acc_ext_link; bf_afree(second); second= tmp_acc; first_datasize += second_datasize; first_hdr->ih_length= htons(first_hdr_size + first_datasize); first= bf_append (first, cut_second); first->acc_ext_link= second; assert (first_hdr_size + first_datasize == bf_bufsize(first)); return first; } PRIVATE ip_ass_t *find_ass_ent (ip_port, id, proto, src, dst) ip_port_t *ip_port; u16_t id; ipproto_t proto; ipaddr_t src; ipaddr_t dst; { ip_ass_t *new_ass_ent, *tmp_ass_ent; int i; acc_t *tmp_acc, *curr_acc; new_ass_ent= 0; for (i=0, tmp_ass_ent= ip_ass_table; iia_frags && tmp_ass_ent->ia_first_time) { DBLOCK(1, printf("strange ip_ass entry (can be a race condition)\n")); continue; } if ((tmp_ass_ent->ia_srcaddr == src) && (tmp_ass_ent->ia_dstaddr == dst) && (tmp_ass_ent->ia_proto == proto) && (tmp_ass_ent->ia_id == id) && (tmp_ass_ent->ia_port == ip_port)) { return tmp_ass_ent; } if (!new_ass_ent || tmp_ass_ent->ia_first_time < new_ass_ent->ia_first_time) { new_ass_ent= tmp_ass_ent; } } if (new_ass_ent->ia_frags) { DBLOCK(1, printf("old frags id= %u, proto= %u, src= ", ntohs(new_ass_ent->ia_id), ntohs(new_ass_ent->ia_proto)); writeIpAddr(new_ass_ent->ia_srcaddr); printf(" dst= "); writeIpAddr(new_ass_ent->ia_dstaddr); printf(": "); ip_print_frags(new_ass_ent->ia_frags); printf("\n")); curr_acc= new_ass_ent->ia_frags->acc_ext_link; while (curr_acc) { tmp_acc= curr_acc->acc_ext_link; bf_afree(curr_acc); curr_acc= tmp_acc; } curr_acc= new_ass_ent->ia_frags; new_ass_ent->ia_frags= 0; icmp_snd_time_exceeded(ip_port->ip_port, curr_acc, ICMP_FRAG_REASSEM); } new_ass_ent->ia_min_ttl= IP_MAX_TTL; new_ass_ent->ia_port= ip_port; new_ass_ent->ia_first_time= get_time(); new_ass_ent->ia_srcaddr= src; new_ass_ent->ia_dstaddr= dst; new_ass_ent->ia_proto= proto; new_ass_ent->ia_id= id; return new_ass_ent; } PRIVATE int ip_frag_chk(pack) acc_t *pack; { ip_hdr_t *ip_hdr; int hdr_len; if (pack->acc_length < sizeof(ip_hdr_t)) { DBLOCK(1, printf("wrong length\n")); return FALSE; } ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; if (pack->acc_length < hdr_len) { DBLOCK(1, printf("wrong length\n")); return FALSE; } if (((ip_hdr->ih_vers_ihl >> 4) & IH_VERSION_MASK) != IP_VERSION) { DBLOCK(1, printf("wrong version (ih_vers_ihl=0x%x)\n", ip_hdr->ih_vers_ihl)); return FALSE; } if (ntohs(ip_hdr->ih_length) != bf_bufsize(pack)) { DBLOCK(1, printf("wrong size\n")); return FALSE; } if ((u16_t)~oneC_sum(0, (u16_t *)ip_hdr, hdr_len)) { DBLOCK(1, printf("packet with wrong checksum (= %x)\n", (u16_t)~oneC_sum(0, (u16_t *)ip_hdr, hdr_len))); return FALSE; } if (hdr_len>IP_M>)@)A)B)C)D)E)F)G)H)I)J)K)IN_HDR_SIZE && ip_chk_hdropt((u8_t *) (ptr2acc_data(pack) + IP_MIN_HDR_SIZE), hdr_len-IP_MIN_HDR_SIZE)) { DBLOCK(1, printf("packet with wrong options\n")); return FALSE; } return TRUE; } PRIVATE void packet2user (ip_fd, pack, exp_time) ip_fd_t *ip_fd; acc_t *pack; time_t exp_time; { acc_t *tmp_pack; ip_hdr_t *ip_hdr; int result, ip_hdr_len; size_t size, transf_size; assert (ip_fd->if_flags & IFF_INUSE); if (!(ip_fd->if_flags & IFF_READ_IP)) { if (pack->acc_linkC != 1) { tmp_pack= bf_dupacc(pack); bf_afree(pack); pack= tmp_pack; tmp_pack= NULL; } pack->acc_ext_link= NULL; if (ip_fd->if_rdbuf_head == NULL) { ip_fd->if_rdbuf_head= pack; ip_fd->if_exp_time= exp_time; } else ip_fd->if_rdbuf_tail->acc_ext_link= pack; ip_fd->if_rdbuf_tail= pack; return; } size= bf_bufsize (pack); if (ip_fd->if_ipopt.nwio_flags & NWIO_RWDATONLY) { pack= bf_packIffLess (pack, IP_MIN_HDR_SIZE); assert (pack->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; assert (size >= ip_hdr_len); size -= ip_hdr_len; pack= bf_delhead(pack, ip_hdr_len); } if (size>ip_fd->if_rd_count) { tmp_pack= bf_cut (pack, 0, ip_fd->if_rd_count); bf_afree(pack); pack= tmp_pack; transf_size= ip_fd->if_rd_count; } else transf_size= size; if (ip_fd->if_put_pkt) { (*ip_fd->if_put_pkt)(ip_fd->if_srfd, pack, transf_size); return; } result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, (size_t)0, pack, FALSE); if (result >= 0) if (size > transf_size) result= EPACKSIZE; else result= transf_size; ip_fd->if_flags &= ~IFF_READ_IP; result= (*ip_fd->if_put_userdata)(ip_fd->if_srfd, result, (acc_t *)0, FALSE); assert (result >= 0); return; } PUBLIC void ip_port_arrive (ip_port, pack, ip_hdr) ip_port_t *ip_port; acc_t *pack; ip_hdr_t *ip_hdr; { ip_fd_t *ip_fd, *first_fd, *share_fd; ip_hdr_t *hdr; int port_nr; unsigned long ip_pack_stat; int i; int hash, proto; time_t exp_time; assert (pack->acc_linkC>0); assert (pack->acc_length >= IP_MIN_HDR_SIZE); if (ntohs(ip_hdr->ih_flags_fragoff) & (IH_FRAGOFF_MASK|IH_MORE_FRAGS)) { pack= reassemble (ip_port, pack, ip_hdr); if (!pack) return; assert (pack->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); assert (!(ntohs(ip_hdr->ih_flags_fragoff) & (IH_FRAGOFF_MASK|IH_MORE_FRAGS))); } exp_time= get_time() + (ip_hdr->ih_ttl+1) * HZ; if (ip_hdr->ih_dst == ip_port->ip_ipaddr) ip_pack_stat= NWIO_EN_LOC; else ip_pack_stat= NWIO_EN_BROAD; proto= ip_hdr->ih_proto; hash= proto & (IP_PROTO_HASH_NR-1); first_fd= NULL; for (i= 0; i<2; i++) { share_fd= NULL; ip_fd= (i == 0) ? ip_port->ip_proto_any : ip_port->ip_proto[hash]; for (; ip_fd; ip_fd= ip_fd->if_proto_next) { if (i && ip_fd->if_ipopt.nwio_proto != proto) continue; if (!(ip_fd->if_ipopt.nwio_flags & ip_pack_stat)) continue; if ((ip_fd->if_ipopt.nwio_flags & NWIO_REMSPEC) && ip_hdr->ih_src != ip_fd->if_ipopt.nwio_rem) { continue; } if ((ip_fd->if_ipopt.nwio_flags & NWIO_ACC_MASK) == NWIO_SHARED) { if (!share_fd) { share_fd= ip_fd; continue; } if (!ip_fd->if_rdbuf_head) share_fd= ip_fd; continue; } if (!first_fd) { first_fd= ip_fd; continue; } pack->acc_linkC++; packet2user(ip_fd, pack, exp_time); } if (share_fd) { pack->acc_linkC++; packet2user(share_fd, pack, exp_time); } } if (first_fd) { if (first_fd->if_put_pkt && (first_fd->if_flags & IFF_READ_IP) && !(first_fd->if_ipopt.nwio_flags & NWIO_RWDATONLY)) { (*first_fd->if_put_pkt)(first_fd->if_srfd, pack, ntohs(ip_hdr->ih_length)); } else packet2user(first_fd, pack, exp_time); } else { if (ip_pack_stat == NWIO_EN_LOC) { DBLOCK(0x01, printf("ip_port_arrive: dropping packet for proto %d\n", proto)); } else { DBLOCK(0x20, printf("dropping packet for proto %d\n", proto)); } bf_afree(pack); } } PUBLIC void ip_arrived(ip_port, pack) ip_port_t *ip_port; acc_t *pack; { ip_port_t *next_port; ip_hdr_t *ip_hdr; iroute_t *iroute; ipaddr_t dest; nettype_t nettype; int ip_frag_len, ip_hdr_len; size_t pack_size; acc_t *tmp_pack; int broadcast; pack_size= bf_bufsize(pack); if (pack_size < IP_MIN_HDR_SIZE) { DBLOCK(1, printf("wrong acc_length\n")); bf_afree(pack); return; } pack= bf_align(pack, IP_MIN_HDR_SIZE, 4); pack= bf_packIffLess(pack, IP_MIN_HDR_SIZE); assert (pack->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (ip_hdr_len>IP_MIN_HDR_SIZE) { pack= bf_align(pack, IP_MIN_HDR_SIZE, 4); pack= bf_packIffLess(pack, ip_hdr_len); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); } ip_frag_len= ntohs(ip_hdr->ih_length); if (ip_frag_lenih_dst; if (dest == ip_port->ip_ipaddr) { ip_port_arrive (ip_port, pack, ip_hdr); return; } if (broadcast_dst(ip_port, dest)) { ip_port_arrive (ip_port, pack, ip_hdr); return; } /* Try to decrement the ttl field with one. */ if (ip_hdr->ih_ttl < 2) { icmp_snd_time_exceeded(ip_port->ip_port, pack, ICMP_TTL_EXC); return; } ip_hdr->ih_ttl--; ip_hdr_chksum(ip_hdr, ip_hdr_len); /* Avoid routing to bad destinations. */ nettype= ip_nettype(dest); if (nettype != IPNT_CLASS_A && nettype != IPNT_CLASS_B && nettype != IPNT_CLASS_C) { /* Bogus destination address */ if (nettype == IPNT_CLASS_D || nettype == IPNT_CLASS_E) bf_afree(pack); else { icmp_snd_unreachable(ip_port->ip_port, pack, ICMP_HOST_UNRCH); } return; } iroute= iroute_frag(ip_port->ip_port, dest); if (iroute == NULL || iroute->irt_dist == IRTD_UNREACHABLE) { /* Also unreachable */ /* Finding out if we send a network unreachable is too much * trouble. */ icmp_snd_unreachable(ip_port->ip_port, pack, ICMP_HOST_UNRCH); return; } next_port= &ip_port_table[iroute->irt_port]; if (next_port != ip_port) { if (iroute->irt_gateway != 0) { /* Just send the packet to the next gateway */ next_port->ip_dev_send(next_port, iroute->irt_gateway, pack, /* no bradcast */ 0); return; } /* The packet is for the attached network. Special addresses * are the ip address of the interface and net.0 if * no IP_42BSD_BCAST. */ if (dest == next_port->ip_ipaddr) { ip_port_arrive (next_port, pack, ip_hdr); return; } if (dest == iroute->irt_dest) { #if IP_42BSD_BCAST broadcast= 1; #else /* Bogus destination address */ icmp_snd_dstunrch(pack); return; #endif } else if (dest == (iroute->irt_dest | ~iroute->irt_subnetmask)) broadcast= 1; else broadcast= 0; /* Just send the packet to it's destination */ next_port->ip_dev_send(next_port, dest, pack, broadcast); return; } /* Now we know that the packet should be route over the same network * as it came from. If there is a next hop gateway, we can send * the packet to that gateway and send a redirect ICMP to the sender * if the sender is on the attached network. If there is no gateway * complain. */ if (iroute->irt_gateway == 0) { #if !CRAMPED printf("packet should not be here, src="); writeIpAddr(ip_hdr->ih_src); printf(" dst="); writeIpAddr(ip_hdr->ih_dst); printf("\n"); #endif bf_afree(pack); return; } if (((ip_hdr->ih_src ^ ip_port->ip_ipaddr) & ip_port->ip_subnetmask) == 0) { /* Finding out if we can send a network redirect instead of * a host redirect is too much trouble. */ pack->acc_linkC++; icmp_snd_redirect(ip_port->ip_port, pack, ICMP_REDIRECT_HOST, iroute->irt_gateway); } else { #if !CRAMPED printf("packet is wrongly routed, src="); writeIpAddr(ip_hdr->ih_src); printf(" dst="); writeIpAddr(ip_hdr->ih_dst); printf("\n"); #endif bf_afree(pack); return; } ip_port->ip_dev_send(ip_port, iroute->irt_gateway, pack, /* no broadcast */ 0); } PUBLIC void ip_arrived_broadcast(ip_port, pack) ip_port_t *ip_port; acc_t *pack; { ip_hdr_t *ip_hdr; int ip_frag_len, ip_hdr_len; size_t pack_size; acc_t *tmp_pack; pack_size= bf_bufsize(pack); if (pack_size < IP_MIN_HDR_SIZE) { DBLOCK(1, printf("wrong acc_length\n")); bf_afree(pack); return; } pack= bf_align(pack, IP_MIN_HDR_SIZE, 4); pack= bf_packIffLess(pack, IP_MIN_HDR_SIZE); assert (pack->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); DIFBLOCK(0x20, (ip_hdr->ih_dst & HTONL(0xf0000000)) == HTONL(0xe0000000), printf("got multicast packet\n")); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (ip_hdr_len>IP_MIN_HDR_SIZE) { pack= bf_align(pack, IP_MIN_HDR_SIZE, 4); pack= bf_packIffLess(pack, ip_hdr_len); ip_hdr= (ip_hdr_t *)ptr2acc_data(pack); } ip_frag_len= ntohs(ip_hdr->ih_length); if (ip_frag_lenih_dst)) { #if !CRAMPED printf( "ip[%d]: broadcast packet for ip-nonbroadcast addr, src=", ip_port->ip_port); writeIpAddr(ip_hdr->ih_src); printf(" dst="); writeIpAddr(ip_hdr->ih_dst); printf("\n"); #endif bf_afree(pack); return; } ip_port_arrive (ip_port, pack, ip_hdr); } PRIVATE int broadcast_dst(ip_port, dest) ip_port_t *ip_port; ipaddr_t dest; { /* Treat class D (multicast) address as broadcasts. */ if ((dest & HTONL(0xF0000000)) == HTONL(0xE0000000)) { return 1; } /* Accept without complaint if netmask not yet configured. */ if (!(ip_port->ip_flags & IPF_NETMASKSET)) { return 1; } if (((ip_port->ip_ipaddr ^ dest) & ip_port->ip_netmask) != 0) { /* Two possibilities, 0 (iff IP_42BSD_BCAST) and -1 */ if (dest == HTONL((ipaddr_t)-1)) return 1; #if IP_42BSD_BCAST if (dest == HTONL((ipaddr_t)0)) return 1; #endif return 0; } if (((ip_port->ip_ipaddr ^ dest) & ip_port->ip_subnetmask) != 0) { /* Two possibilities, netwerk.0 (iff IP_42BSD_BCAST) and * netwerk.-1 */ if ((dest & ~ip_port->ip_netmask) == ~ip_port->ip_netmask) return 1; #if IP_42BSD_BCAST if ((dest & ~ip_port->ip_netmask) == 0) return 1; #endif return 0; } /* Two possibilities, netwerk.subnet.0 (iff IP_42BSD_BCAST) and * netwerk.subnet.-1 */ if ((dest & ~ip_port->ip_subnetmask) == ~ip_port->ip_subnetmask) return 1; #if IP_42BSD_BCAST if ((dest & ~ip_port->ip_subnetmask) == 0) return 1; #endif return 0; } void ip_process_loopb(ev, arg) event_t *ev; ev_arg_t arg; { ip_port_t *ip_port; acc_t *pack; ip_port= arg.ev_ptr; assert(ev == &ip_port->ip_loopb_event); while(pack= ip_port->ip_loopb_head) { ip_port->ip_loopb_head= pack->acc_ext_link; ip_arrived(ip_port, pack); } } /* * $PchId: ip_read.c,v 1.9 1997/01/31 08:51:39 philip Exp $ */ /* ip_write.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "event.h" #include "type.h" #include "arp.h" #include "assert.h" #include "clock.h" #include "eth.h" #include "icmp_lib.h" #include "io.h" #include "ip.h" #include "ip_int.h" #include "ipr.h" THIS_FILE FORWARD void error_reply ARGS(( ip_fd_t *fd, int error )); PUBLIC int ip_write (fd, count) int fd; size_t count; { ip_fd_t *ip_fd; acc_t *pack; int r; ip_fd= &ip_fd_table[fd]; if (count > IP_MAX_PACKSIZE) { error_reply (ip_fd, EPACKSIZE); return NW_OK; } pack= (*ip_fd->if_get_userdata)(ip_fd->if_srfd, (size_t)0, count, FALSE); if (!pack) return NW_OK; r= ip_send(fd, pack, count); assert(r != NW_WOULDBLOCK); if (r == NW_OK) error_reply (ip_fd, count); else error_reply (ip_fd, r); return NW_OK; } PUBLIC int ip_send(fd, data, data_len) int fd; acc_t *data; size_t data_len; { ip_port_t *ip_port; ip_fd_t *ip_fd; ip_hdr_t *ip_hdr, *tmp_hdr; ipaddr_t dstaddr, netmask, nexthop, hostrep_dst; u8_t *addrInBytes; acc_t *tmp_pack, *tmp_pack1; int hdr_len, hdr_opt_len, r; int broadcast, ttl; ev_arg_t arg; ip_fd= &ip_fd_table[fd]; ip_port= ip_fd->if_port; if (!(ip_fd->if_flags & IFF_OPTSET)) { bf_afree(data); return EBADMODE; } data_len= bf_bufsize(data); assert(ip_fd->if_port->ip_flags & IPF_IPADDRSET); if (ip_fd->if_ipopt.nwio_flags & NWIO_RWDATONLY) { tmp_pack= bf_memreq(IP_MIN_HDR_SIZE); tmp_pack->acc_next= data; data= tmp_pack; data_len += IP_MIN_HDR_SIZE; } if (data_lenacc_linkC != 1 || data->acc_buffer->buf_linkC != 1) { tmp_pack= bf_memreq(IP_MIN_HDR_SIZE); tmp_hdr= (ip_hdr_t *)ptr2acc_data(tmp_pack); *tmp_hdr= *ip_hdr; tmp_pack->acc_next= bf_cut(data, IP_MIN_HDR_SIZE, data_len-IP_MIN_HDR_SIZE); bf_afree(data); ip_hdr= tmp_hdr; data= tmp_pack; assert (data->acc_length >= IP_MIN_HDR_SIZE); } if (ip_fd->if_ipopt.nwio_flags & NWIO_HDR_O_SPEC) { hdr_opt_len= ip_fd->if_ipopt.nwio_hdropt.iho_opt_siz; if (hdr_opt_len) { tmp_pack= bf_cut(data, 0, IP_MIN_HDR_SIZE); tmp_pack1= bf_cut (data, IP_MIN_HDR_SIZE, data_len-IP_MIN_HDR_SIZE); bf_afree(data); data= bf_packIffLess(tmp_pack, IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(data); tmp_pack= bf_memreq (hdr_opt_len); memcpy (ptr2acc_data(tmp_pack), ip_fd->if_ipopt. nwio_hdropt.iho_data, hdr_opt_len); data->acc_next= tmp_pack; tmp_pack->acc_next= tmp_pack1; hdr_len= IP_MIN_HDR_SIZE+hdr_opt_len; } else hdr_len= IP_MIN_HDR_SIZE; ip_hdr->ih_vers_ihl= hdr_len/4; ip_hdr->ih_tos= ip_fd->if_ipopt.nwio_tos; ip_hdr->ih_flags_fragoff= 0; if (ip_fd->if_ipopt.nwio_df) ip_hdr->ih_flags_fragoff |= HTONS(IH_DONT_FRAG); ip_hdr->ih_ttl= ip_fd->if_ipopt.nwio_ttl; ttl= ORTD_UNREACHABLE+1; /* Don't check TTL */ } else { hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK)*4; r= NW_OK; if (hdr_lendata_len) r= EPACKSIZE; else if (!ip_hdr->ih_ttl) r= EINVAL; if (r != NW_OK) { bf_afree(data); return r; } data= bf_packIffLess(data, hdr_len); ip_hdr= (ip_hdr_t *)ptr2acc_data(data); if (hdr_len != IP_MIN_HDR_SIZE) { r= ip_chk_hdropt((u8_t *)(ptr2acc_data(data) + IP_MIN_HDR_SIZE), hdr_len-IP_MIN_HDR_SIZE); if (r != NW_OK) { bf_afree(data); return r; } } ttl= ip_hdr->ih_ttl; } ip_hdr->ih_vers_ihl= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) | (IP_VERSION << 4); ip_hdr->ih_length= htons(data_len); ip_hdr->ih_flags_fragoff &= ~HTONS(IH_FRAGOFF_MASK | IH_FLAGS_UNUSED | IH_MORE_FRAGS); if (ip_fd->if_ipopt.nwio_flags & NWIO_PROTOSPEC) ip_hdr->ih_proto= ip_fd->if_ipopt.nwio_proto; ip_hdr->ih_id= htons(ip_port->ip_frame_id++); ip_hdr->ih_src= ip_fd->if_port->ip_ipaddr; if (ip_fd->if_ipopt.nwio_flags & NWIO_REMSPEC) ip_hdr->ih_dst= ip_fd->if_ipopt.nwio_rem; dstaddr= ip_hdr->ih_dst; hostrep_dst= ntohl(dstaddr); r= 0; if (hostrep_dst == (ipaddr_t)-1) ; /* OK, local broadcast */ else if ((hostrep_dst & 0xe0000000l) == 0xe0000000l) ; /* OK, Multicast */ else if ((hostrep_dst & 0xf0000000l) == 0xf0000000l) r= EBADDEST; /* Bad class */ else if ((dstaddr ^ ip_port->ip_ipaddr) & ip_port->ip_subnetmask) ; /* OK, remote destination */ else if (!(dstaddr & ~ip_port->ip_subnetmask)) r= EBADDEST; /* Zero host part */ if (r<0) { DIFBLOCK(1, r == EBADDEST, printf("bad destination: "); writeIpAddr(ip_hdr->ih_dst); printf("\n")); bf_afree(data); return r; } ip_hdr_chksum(ip_hdr, hdr_len); data= bf_packIffLess(data, IP_MIN_HDR_SIZE); assert (data->acc_length >= IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(data); addrInBytes= (u8_t *)&dstaddr; if ((addrInBytes[0] & 0xff) == 0x7f) /* local loopback */ { assert (data->acc_linkC == 1); dstaddr= ip_hdr->ih_dst; /* swap src and dst * addresses */ ip_hdr->ih_dst= ip_hdr->ih_src; ip_hdr->ih_src= dstaddr; data->acc_ext_link= NULL; if (ip_port->ip_loopb_head == NULL) { ip_port->ip_loopb_head= data; arg.ev_ptr= ip_port; ev_enqueue(&ip_port->ip_loopb_event, ip_process_loopb, arg); } else ip_port->ip_loopb_tail->acc_ext_link= data; ip_port->ip_loopb_tail= data; return NW_OK; } if (dstaddr == (ipaddr_t)-1) { r= (*ip_port->ip_dev_send)(ip_port, dstaddr, data, /* broadcast */ 1); return r; } netmask= ip_get_netmask(dstaddr); if (dstaddr == ip_port->ip_ipaddr) { assert (data->acc_linkC == 1); data->acc_ext_link= NULL; if (ip_port->ip_loopb_head == NULL) { ip_port->ip_loopb_head= data; arg.ev_ptr= ip_port; ev_enqueue(&ip_port->ip_loopb_event, ip_process_loopb, arg); } else ip_port->ip_loopb_tail->acc_ext_link= data; ip_port->ip_loopb_tail= data; return NW_OK; } if (((dstaddr ^ ip_port->ip_ipaddr) & ip_port->ip_subnetmask) == 0) { broadcast= (dstaddr == (ip_port->ip_ipaddr | ~ip_port->ip_subnetmask)); r= (*ip_port->ip_dev_send)(ip_port, dstaddr, data, broadcast); return r; } r= oroute_frag (ip_port - ip_port_table, dstaddr, ttl, &nexthop); if (r == NW_OK) { if (nexthop == ip_port->ip_ipaddr) { data->acc_ext_link= NULL; if (ip_port->ip_loopb_head == NULL) { ip_port->ip_loopb_head= data; arg.ev_ptr= ip_port; ev_enqueue(&ip_port->ip_loopb_event, ip_process_loopb, arg); } else ip_port->ip_loopb_tail->acc_ext_link= data; ip_port->ip_loopb_tail= data; } else { r= (*ip_port->ip_dev_send)(ip_port, nexthop, data, /* no broadcast */ 0); } } else { DBLOCK(0x10, printf("got error %d\n", r)); bf_afree(data); } return r; } PUBLIC void ip_hdr_chksum(ip_hdr, ip_hdr_len) ip_hdr_t *ip_hdr; int ip_hdr_len; { ip_hdr->ih_hdr_chk= 0; ip_hdr->ih_hdr_chk= ~oneC_sum (0, (u16_t *)ip_hdr, ip_hdr_len); } PUBLIC acc_t *ip_split_pack (ip_port, ref_last, first_size) ip_port_t *ip_port; acc_t **ref_last; int first_size; { int pack_siz; ip_hdr_t *first_hdr, *second_hdr; int first_hdr_len, second_hdr_len; int first_data_len, second_data_len; int new_first_data_len; int first_opt_size, second_opt_size; acc_t *first_pack, *second_pack, *tmp_pack, *tmp_pack1; u8_t *first_optptr, *second_optptr; int i, optlen; first_pack= *ref_last; *ref_last= 0; second_pack= 0; first_pack= bf_packIffLess(first_pack, IP_MIN_HDR_SIZE); assert (first_pack->acc_length >= IP_MIN_HDR_SIZE); first_hdr= (ip_hdr_t *)ptr2acc_data(first_pack); first_hdr_len= (first_hdr->ih_vers_ihl & IH_IHL_MASK) * 4; pack_siz= bf_bufsize(first_pack); assert(pack_siz > first_size); if (first_hdr->ih_flags_fragoff & HTONS(IH_DONT_FRAG)) { icmp_snd_unreachable(ip_port->ip_port, first_pack, ICMP_FRAGM_AND_DF); return NULL; } first_data_len= ntohs(first_hdr->ih_length) - first_hdr_len; new_first_data_len= (first_size- first_hdr_len) & ~7; /* data goes in 8 byte chuncks */ second_data_len= first_data_len-new_first_data_len; second_pack= bf_cut(first_pack, first_hdr_len+ new_first_data_len, second_S)U)V)W)data_len); tmp_pack= first_pack; first_data_len= new_first_data_len; first_pack= bf_cut (tmp_pack, 0, first_hdr_len+first_data_len); bf_afree(tmp_pack); tmp_pack= bf_memreq(first_hdr_len); tmp_pack->acc_next= second_pack; second_pack= tmp_pack; second_hdr= (ip_hdr_t *)ptr2acc_data(second_pack); *second_hdr= *first_hdr; second_hdr->ih_flags_fragoff= htons( ntohs(first_hdr->ih_flags_fragoff)+(first_data_len/8)); first_opt_size= first_hdr_len-IP_MIN_HDR_SIZE; second_opt_size= 0; if (first_opt_size) { first_pack= bf_packIffLess (first_pack, first_hdr_len); first_hdr= (ip_hdr_t *)ptr2acc_data(first_pack); assert (first_pack->acc_length>=first_hdr_len); first_optptr= (u8_t *)ptr2acc_data(first_pack)+ IP_MIN_HDR_SIZE; second_optptr= (u8_t *)ptr2acc_data( second_pack)+IP_MIN_HDR_SIZE; i= 0; while (iih_vers_ihl= second_hdr->ih_vers_ihl & 0xf0 + (second_hdr_len/4); second_hdr->ih_length= htons(second_data_len+ second_hdr_len); second_pack->acc_length= second_hdr_len; assert(first_pack->acc_linkC == 1); assert(first_pack->acc_buffer->buf_linkC == 1); first_hdr->ih_flags_fragoff |= HTONS(IH_MORE_FRAGS); first_hdr->ih_length= htons(first_data_len+ first_hdr_len); assert (!(second_hdr->ih_flags_fragoff & HTONS(IH_DONT_FRAG))); ip_hdr_chksum(first_hdr, first_hdr_len); if (second_data_len+second_hdr_len <= first_size) { /* second_pack will not be split any further, so we have to * calculate the header checksum. */ ip_hdr_chksum(second_hdr, second_hdr_len); } *ref_last= second_pack; return first_pack; } PRIVATE void error_reply (ip_fd, error) ip_fd_t *ip_fd; int error; { if ((*ip_fd->if_get_userdata)(ip_fd->if_srfd, (size_t)error, (size_t)0, FALSE)) { #if !CRAMPED ip_panic(( "can't error_reply" )); #endif } } /* * $PchId: ip_write.c,v 1.7.1.1.1.1 2001/01/22 19:59:07 philip Exp $ */ /* ipr.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "clock.h" #include "type.h" #include "assert.h" #include "buf.h" #include "event.h" #include "io.h" #include "ip_int.h" #include "ipr.h" THIS_FILE #define OROUTE_NR 32 #define OROUTE_STATIC_NR 16 #define OROUTE_HASH_ASS_NR 4 #define OROUTE_HASH_NR 32 #define OROUTE_HASH_MASK (OROUTE_HASH_NR-1) #define hash_oroute(port_nr, ipaddr, hash_tmp) (hash_tmp= (ipaddr), \ hash_tmp= (hash_tmp >> 20) ^ hash_tmp, \ hash_tmp= (hash_tmp >> 10) ^ hash_tmp, \ hash_tmp= (hash_tmp >> 5) ^ hash_tmp, \ (hash_tmp + (port_nr)) & OROUTE_HASH_MASK) typedef struct oroute_hash { ipaddr_t orh_addr; oroute_t *orh_route; } oroute_hash_t; PRIVATE oroute_t oroute_table[OROUTE_NR]; PRIVATE oroute_t *oroute_head; PRIVATE int static_oroute_nr; PRIVATE oroute_hash_t oroute_hash_table[OROUTE_HASH_NR][OROUTE_HASH_ASS_NR]; #define IROUTE_NR (sizeof(int) == 2 ? 64 : 512) #define IROUTE_HASH_ASS_NR 4 #define IROUTE_HASH_NR 32 #define IROUTE_HASH_MASK (IROUTE_HASH_NR-1) #define hash_iroute(port_nr, ipaddr, hash_tmp) (hash_tmp= (ipaddr), \ hash_tmp= (hash_tmp >> 20) ^ hash_tmp, \ hash_tmp= (hash_tmp >> 10) ^ hash_tmp, \ hash_tmp= (hash_tmp >> 5) ^ hash_tmp, \ (hash_tmp + (port_nr)) & IROUTE_HASH_MASK) typedef struct iroute_hash { ipaddr_t irh_addr; iroute_t *irh_route; } iroute_hash_t; PRIVATE iroute_t iroute_table[IROUTE_NR]; PRIVATE iroute_hash_t iroute_hash_table[IROUTE_HASH_NR][IROUTE_HASH_ASS_NR]; FORWARD oroute_t *oroute_find_ent ARGS(( int port_nr, ipaddr_t dest )); FORWARD void oroute_del ARGS(( oroute_t *oroute )); FORWARD oroute_t *sort_dists ARGS(( oroute_t *oroute )); FORWARD oroute_t *sort_gws ARGS(( oroute_t *oroute )); FORWARD oroute_uncache_nw ARGS(( ipaddr_t dest, ipaddr_t netmask )); FORWARD iroute_uncache_nw ARGS(( ipaddr_t dest, ipaddr_t netmask )); PUBLIC void ipr_init() { int i; oroute_t *oroute; iroute_t *iroute; #if ZERO for (i= 0, oroute= oroute_table; iort_flags= ORTF_EMPTY; static_oroute_nr= 0; #endif assert(OROUTE_HASH_ASS_NR == 4); #if ZERO for (i= 0, iroute= iroute_table; iirt_flags= IRTF_EMPTY; #endif assert(IROUTE_HASH_ASS_NR == 4); } PUBLIC iroute_t *iroute_frag(port_nr, dest) int port_nr; ipaddr_t dest; { int hash, i, r_hash_ind; iroute_hash_t *iroute_hash; iroute_hash_t tmp_hash; iroute_t *iroute, *bestroute; time_t currtim; unsigned long hash_tmp; currtim= get_time(); hash= hash_iroute(port_nr, dest, hash_tmp); iroute_hash= &iroute_hash_table[hash][0]; if (iroute_hash[0].irh_addr == dest) iroute= iroute_hash[0].irh_route; else if (iroute_hash[1].irh_addr == dest) { tmp_hash= iroute_hash[1]; iroute_hash[1]= iroute_hash[0]; iroute_hash[0]= tmp_hash; iroute= tmp_hash.irh_route; } else if (iroute_hash[2].irh_addr == dest) { tmp_hash= iroute_hash[2]; iroute_hash[2]= iroute_hash[1]; iroute_hash[1]= iroute_hash[0]; iroute_hash[0]= tmp_hash; iroute= tmp_hash.irh_route; } else if (iroute_hash[3].irh_addr == dest) { tmp_hash= iroute_hash[3]; iroute_hash[3]= iroute_hash[2]; iroute_hash[2]= iroute_hash[1]; iroute_hash[1]= iroute_hash[0]; iroute_hash[0]= tmp_hash; iroute= tmp_hash.irh_route; } else iroute= NULL; if (iroute) return iroute; bestroute= NULL; for (i= 0, iroute= iroute_table; i < IROUTE_NR; i++, iroute++) { if (!(iroute->irt_flags & IRTF_INUSE)) continue; if (((dest ^ iroute->irt_dest) & iroute->irt_subnetmask) != 0) continue; if (!bestroute) { bestroute= iroute; continue; } /* More specific netmasks are better */ if (iroute->irt_subnetmask != bestroute->irt_subnetmask) { if (ntohl(iroute->irt_subnetmask) > ntohl(bestroute->irt_subnetmask)) { bestroute= iroute; } continue; } /* Dynamic routes override static routes */ if ((iroute->irt_flags & IRTF_STATIC) != (bestroute->irt_flags & IRTF_STATIC)) { if (bestroute->irt_flags & IRTF_STATIC) bestroute= iroute; continue; } /* A route to the local interface give an opportunity * to send redirects. */ if (iroute->irt_port != bestroute->irt_port) { if (iroute->irt_port == port_nr) bestroute= iroute; continue; } } if (bestroute == NULL) return NULL; iroute_hash[3]= iroute_hash[2]; iroute_hash[2]= iroute_hash[1]; iroute_hash[1]= iroute_hash[0]; iroute_hash[0].irh_addr= dest; iroute_hash[0].irh_route= bestroute; return bestroute; } PUBLIC int oroute_frag(port_nr, dest, ttl, nexthop) int port_nr; ipaddr_t dest; int ttl; ipaddr_t *nexthop; { oroute_t *oroute; oroute= oroute_find_ent(port_nr, dest); if (!oroute || oroute->ort_dist > ttl) return EDSTNOTRCH; *nexthop= oroute->ort_gateway; return NW_OK; } PUBLIC int ipr_add_oroute(port_nr, dest, subnetmask, gateway, timeout, dist, static_route, preference, oroute_p) int port_nr; ipaddr_t dest; ipaddr_t subnetmask; ipaddr_t gateway; time_t timeout; int dist; int static_route; i32_t preference; oroute_t **oroute_p; { int i; ip_port_t *ip_port; oroute_t *oroute, *oldest_route, *prev, *nw_route, *gw_route, *prev_route; time_t currtim; oldest_route= 0; currtim= get_time(); DBLOCK(0x10, printf("adding oroute to "); writeIpAddr(dest); printf("["); writeIpAddr(subnetmask); printf("] through "); writeIpAddr(gateway); printf(" timeout: %lds, distance %d\n", (long)timeout/HZ, dist)); ip_port= &ip_port_table[port_nr]; /* Validate gateway */ if (((gateway ^ ip_port->ip_ipaddr) & ip_port->ip_subnetmask) != 0) { DBLOCK(2, printf("ipr_add_oroute: invalid gateway: "); writeIpAddr(gateway); printf("\n")); return EINVAL; } if (static_route) { if (static_oroute_nr >= OROUTE_STATIC_NR) return ENOMEM; static_oroute_nr++; } else { /* Try to track down any old routes. */ for(oroute= oroute_head; oroute; oroute= oroute->ort_nextnw) { if (oroute->ort_port != port_nr) continue; if (oroute->ort_dest == dest && oroute->ort_subnetmask == subnetmask) { break; } } for(; oroute; oroute= oroute->ort_nextgw) { if (oroute->ort_gateway == gateway) break; } for(; oroute; oroute= oroute->ort_nextdist) { if ((oroute->ort_flags & ORTF_STATIC) != 0) continue; if (oroute->ort_dist > dist) continue; if (oroute->ort_dist == dist && oroute->ort_pref == preference) { if (timeout) oroute->ort_exp_tim= currtim + timeout; else oroute->ort_exp_tim= 0; oroute->ort_timestamp= currtim; assert(oroute->ort_port == port_nr); if (oroute_p != NULL) *oroute_p= oroute; return NW_OK; } break; } if (oroute) { assert(oroute->ort_port == port_nr); oroute_del(oroute); oroute->ort_flags= 0; oldest_route= oroute; } } if (oldest_route == NULL) { /* Look for an unused entry, or remove an existing one */ for (i= 0, oroute= oroute_table; iort_flags & ORTF_INUSE) == 0) break; if (oroute->ort_exp_tim && oroute->ort_exp_tim < currtim) { oroute_del(oroute); oroute->ort_flags= 0; break; } if (oroute->ort_flags & ORTF_STATIC) continue; if (oroute->ort_dest == 0) { /* Never remove default routes. */ continue; } if (oldest_route == NULL) { oldest_route= oroute; continue; } if (oroute->ort_timestamp < oldest_route->ort_timestamp) { oldest_route= oroute; } } if (i < OROUTE_NR) oldest_route= oroute; else { assert(oldest_route); oroute_del(oldest_route); oldest_route->ort_flags= 0; } } oldest_route->ort_dest= dest; oldest_route->ort_gateway= gateway; oldest_route->ort_subnetmask= subnetmask; if (timeout) oldest_route->ort_exp_tim= currtim + timeout; else oldest_route->ort_exp_tim= 0; oldest_route->ort_timestamp= currtim; oldest_route->ort_dist= dist; oldest_route->ort_port= port_nr; oldest_route->ort_flags= ORTF_INUSE; oldest_route->ort_pref= preference; if (static_route) oldest_route->ort_flags |= ORTF_STATIC; /* Insert the route by tearing apart the routing table, * and insert the entry during the reconst_)a)b)c)d)e)f)g)h)i)j)k)l)m)n)ruction. */ for (prev= 0, nw_route= oroute_head; nw_route; prev= nw_route, nw_route= nw_route->ort_nextnw) { if (nw_route->ort_port != port_nr) continue; if (nw_route->ort_dest == dest && nw_route->ort_subnetmask == subnetmask) { if (prev) prev->ort_nextnw= nw_route->ort_nextnw; else oroute_head= nw_route->ort_nextnw; break; } } prev_route= nw_route; for(prev= NULL, gw_route= nw_route; gw_route; prev= gw_route, gw_route= gw_route->ort_nextgw) { if (gw_route->ort_gateway == gateway) { if (prev) prev->ort_nextgw= gw_route->ort_nextgw; else nw_route= gw_route->ort_nextgw; break; } } oldest_route->ort_nextdist= gw_route; gw_route= oldest_route; gw_route= sort_dists(gw_route); gw_route->ort_nextgw= nw_route; nw_route= gw_route; nw_route= sort_gws(nw_route); nw_route->ort_nextnw= oroute_head; oroute_head= nw_route; if (nw_route != prev_route) oroute_uncache_nw(nw_route->ort_dest, nw_route->ort_subnetmask); if (oroute_p != NULL) *oroute_p= oldest_route; return NW_OK; } PUBLIC void ipr_gateway_down(port_nr, gateway, timeout) int port_nr; ipaddr_t gateway; time_t timeout; { oroute_t *route_ind; time_t currtim; int i; int result; currtim= get_time(); for (i= 0, route_ind= oroute_table; iort_flags & ORTF_INUSE)) continue; if (route_ind->ort_gateway != gateway) continue; if (route_ind->ort_exp_tim && route_ind->ort_exp_tim < currtim) continue; result= ipr_add_oroute(port_nr, route_ind->ort_dest, route_ind->ort_subnetmask, gateway, timeout, ORTD_UNREACHABLE, FALSE, 0, NULL); assert(result == NW_OK); } } PUBLIC void ipr_destunrch(port_nr, dest, netmask, timeout) int port_nr; ipaddr_t dest; ipaddr_t netmask; time_t timeout; { oroute_t *oroute; int result; oroute= oroute_find_ent(port_nr, dest); if (!oroute) { DBLOCK(1, printf("got a dest unreachable for "); writeIpAddr(dest); printf("but no route present\n")); return; } result= ipr_add_oroute(port_nr, dest, netmask, oroute->ort_gateway, timeout, ORTD_UNREACHABLE, FALSE, 0, NULL); assert(result == NW_OK); } PUBLIC void ipr_redirect(port_nr, dest, netmask, old_gateway, new_gateway, timeout) int port_nr; ipaddr_t dest; ipaddr_t netmask; ipaddr_t old_gateway; ipaddr_t new_gateway; time_t timeout; { oroute_t *oroute; int result; oroute= oroute_find_ent(port_nr, dest); if (!oroute) { DBLOCK(1, printf("got a redirect for "); writeIpAddr(dest); printf("but no route present\n")); return; } if (oroute->ort_gateway != old_gateway) { DBLOCK(1, printf("got a redirect from "); writeIpAddr(old_gateway); printf(" for "); writeIpAddr(dest); printf(" but curr gateway is "); writeIpAddr(oroute->ort_gateway); printf("\n")); return; } if (oroute->ort_flags & ORTF_STATIC) { if (oroute->ort_dest == dest) { DBLOCK(1, printf("got a redirect for "); writeIpAddr(dest); printf("but route is fixed\n")); return; } } else { result= ipr_add_oroute(port_nr, dest, netmask, oroute->ort_gateway, HZ, ORTD_UNREACHABLE, FALSE, 0, NULL); assert(result == NW_OK); } result= ipr_add_oroute(port_nr, dest, netmask, new_gateway, timeout, 1, FALSE, 0, NULL); assert(result == NW_OK); } PUBLIC void ipr_ttl_exc(port_nr, dest, netmask, timeout) int port_nr; ipaddr_t dest; ipaddr_t netmask; time_t timeout; { oroute_t *oroute; int new_dist; int result; oroute= oroute_find_ent(port_nr, dest); if (!oroute) { DBLOCK(1, printf("got a ttl exceeded for "); writeIpAddr(dest); printf("but no route present\n")); return; } new_dist= oroute->ort_dist * 2; if (new_dist>IP_MAX_TTL) { new_dist= oroute->ort_dist+1; if (new_dist>IP_MAX_TTL) { DBLOCK(1, printf("got a ttl exceeded for "); writeIpAddr(dest); printf(" but dist is %d\n", oroute->ort_dist)); return; } } result= ipr_add_oroute(port_nr, dest, netmask, oroute->ort_gateway, timeout, new_dist, FALSE, 0, NULL); assert(result == NW_OK); } PUBLIC int ipr_get_oroute(ent_no, route_ent) int ent_no; nwio_route_t *route_ent; { oroute_t *oroute; if (ent_no<0 || ent_no>= OROUTE_NR) return ENOENT; oroute= &oroute_table[ent_no]; if ((oroute->ort_flags & ORTF_INUSE) && oroute->ort_exp_tim && oroute->ort_exp_tim < get_time()) { oroute_del(oroute); oroute->ort_flags &= ~ORTF_INUSE; } route_ent->nwr_ent_no= ent_no; route_ent->nwr_ent_count= OROUTE_NR; route_ent->nwr_dest= oroute->ort_dest; route_ent->nwr_netmask= oroute->ort_subnetmask; route_ent->nwr_gateway= oroute->ort_gateway; route_ent->nwr_dist= oroute->ort_dist; route_ent->nwr_flags= NWRF_EMPTY; if (oroute->ort_flags & ORTF_INUSE) { route_ent->nwr_flags |= NWRF_INUSE; if (oroute->ort_flags & ORTF_STATIC) route_ent->nwr_flags |= NWRF_STATIC; } route_ent->nwr_pref= oroute->ort_pref; route_ent->nwr_ifaddr= ip_get_ifaddr(oroute->ort_port); return NW_OK; } PRIVATE oroute_t *oroute_find_ent(port_nr, dest) int port_nr; ipaddr_t dest; { int hash, i, r_hash_ind; oroute_hash_t *oroute_hash; oroute_hash_t tmp_hash; oroute_t *oroute, *bestroute; time_t currtim; unsigned long hash_tmp; currtim= get_time(); hash= hash_oroute(port_nr, dest, hash_tmp); oroute_hash= &oroute_hash_table[hash][0]; if (oroute_hash[0].orh_addr == dest) oroute= oroute_hash[0].orh_route; else if (oroute_hash[1].orh_addr == dest) { tmp_hash= oroute_hash[1]; oroute_hash[1]= oroute_hash[0]; oroute_hash[0]= tmp_hash; oroute= tmp_hash.orh_route; } else if (oroute_hash[2].orh_addr == dest) { tmp_hash= oroute_hash[2]; oroute_hash[2]= oroute_hash[1]; oroute_hash[1]= oroute_hash[0]; oroute_hash[0]= tmp_hash; oroute= tmp_hash.orh_route; } else if (oroute_hash[3].orh_addr == dest) { tmp_hash= oroute_hash[3]; oroute_hash[3]= oroute_hash[2]; oroute_hash[2]= oroute_hash[1]; oroute_hash[1]= oroute_hash[0]; oroute_hash[0]= tmp_hash; oroute= tmp_hash.orh_route; } else oroute= NULL; if (oroute) { assert(oroute->ort_port == port_nr); if (oroute->ort_exp_tim && oroute->ort_exp_timort_flags &= ~ORTF_INUSE; } else return oroute; } bestroute= NULL; for (oroute= oroute_head; oroute; oroute= oroute->ort_nextnw) { if (((dest ^ oroute->ort_dest) & oroute->ort_subnetmask) != 0) continue; if (oroute->ort_port != port_nr) continue; if (!bestroute) { bestroute= oroute; continue; } assert(oroute->ort_dest != bestroute->ort_dest); if (ntohl(oroute->ort_subnetmask) > ntohl(bestroute->ort_subnetmask)) { bestroute= oroute; continue; } } if (bestroute == NULL) return NULL; oroute_hash[3]= oroute_hash[2]; oroute_hash[2]= oroute_hash[1]; oroute_hash[1]= oroute_hash[0]; oroute_hash[0].orh_addr= dest; oroute_hash[0].orh_route= bestroute; return bestroute; } PRIVATE void oroute_del(oroute) oroute_t *oroute; { oroute_t *prev, *nw_route, *gw_route, *dist_route, *prev_route; for (prev= NULL, nw_route= oroute_head; nw_route; prev= nw_route, nw_route= nw_route->ort_nextnw) { if (oroute->ort_port == nw_route->ort_port && oroute->ort_dest == nw_route->ort_dest && oroute->ort_subnetmask == nw_route->ort_subnetmask) { break; } } assert(nw_route); if (prev) prev->ort_nextnw= nw_route->ort_nextnw; else oroute_head= nw_route->ort_nextnw; prev_route= nw_route; for (prev= NULL, gw_route= nw_route; gw_route; prev= gw_route, gw_route= gw_route->ort_nextgw) { if (oroute->ort_gateway == gw_route->ort_gateway) break; } assert(gw_route); if (prev) prev->ort_nextgw= gw_route->ort_nextgw; else nw_route= gw_route->ort_nextgw; for (prev= NULL, dist_route= gw_route; dist_route; prev= dist_route, dist_route= dist_route->ort_nextdist) { if (oroute == dist_route) break; } assert(dist_route); if (prev) prev->ort_nextdist= dist_route->ort_nextdist; else gw_route= dist_route->ort_nextdist; gw_route= sort_dists(gw_route); if (gw_route != NULL) { gw_route->ort_nextgw= nw_route; nw_route= gw_route; } nw_route= sort_gws(nw_route); if (nw_route != NULL) { nw_route->ort_nextnw= oroute_head; oroute_head= nw_route; } if (nw_route != prev_route) { oroute_uncache_nw(prev_route->ort_dest, prev_route->ort_subnetmask); } } PRIVATE oroute_t *sort_dists(oroute) oroute_t *oroute; { oroute_t *r, *prev, *best, *best_prev; int best_dist, best_pref; best= NULL; for (prev= NULL, r= oroute; r; prev= r, r= r->ort_nextdist) { if (best == NULL) ; /* Force assignment to best */ else if (r->ort_dist != best_dist) { if (r->ort_dist > best_dist) continue; } else { if (r->ort_pref <= best_pref) continue; } best= r; best_prev= prev; best_dist= r->ort_dist; best_pref= r->ort_pref; } if (!best) { assert(oroute == NULL); return oroute; } if (!best_prev) { assert(best == oroute); return oroute; } best_prev->ort_nextdist= best->ort_nextdist; best->ort_nextdist= oroute; return best; } PRIVATE oroute_t *sort_gws(oroute) oroute_t *oroute; { oroute_t *r, *prev, *best, *best_prev; int best_dist, best_pref; best= NULL; for (prev= NULL, r= oroute; r; prev= r, r= r->ort_nextgw) { if (best == NULL) ; /* Force assignment to best */ else if (r->ort_dist != best_dist) { if (r->ort_dist > best_dist) continue; } else { if (r->ort_pref <= best_pref) continue; } best= r; best_prev= prev; best_dist= r->ort_dist; best_pref= r->ort_pref; } if (!best) { assert(oroute == NULL); return oroute; } if (!best_prev) { assert(best == oroute); return oroute; } best_prev->ort_nextgw= best->ort_nextgw; best->ort_nextgw= oroute; return best; } PRIVATE oroute_uncache_nw(dest, netmask) ipaddr_t dest; ipaddr_t netmask; { int i, j; oroute_hash_t *oroute_hash; for (i= 0, oroute_hash= &oroute_hash_table[0][0]; i= IROUTE_NR) return ENOENT; iroute= &iroute_table[ent_no]; route_ent->nwr_ent_count= IROUTE_NR; route_ent->nwr_dest= iroute->irt_dest; route_ent->nwr_netmask= iroute->irt_subnetmask; route_ent->nwr_gateway= iroute->irt_gateway; route_ent->nwr_dist= iroute->irt_dist; route_ent->nwr_flags= NWRF_EMPTY; if (iroute->irt_flags & IRTF_INUSE) { route_ent->nwr_flags |= NWRF_INUSE; if (iroute->irt_flags & IRTF_STATIC) route_ent->nwr_flags |= NWRF_STATIC; if (iroute->irt_dist == IRTD_UNREACHABLE) route_ent->nwr_flags |= NWRF_UNREACHABLE; } route_ent->nwr_pref= 0; route_ent->nwr_ifaddr= ip_get_ifaddr(iroute->irt_port); return NW_OK; } PUBLIC int ipr_add_iroute(port_nr, dest, subnetmask, gateway, dist, static_route, iroute_p) int port_nr; ipaddr_t dest; ipaddr_t subnetmask; ipaddr_t gateway; int dist; int static_route; iroute_t **iroute_p; { int i; iroute_t *iroute, *unused_route; unused_route= NULL; if (static_route) { /* Static routes are not reused automatically, so we look * for an unused entry. */ for(i= 0, iroute= iroute_table; iirt_flags & IRTF_INUSE) == 0) break; } if (i != IROUTE_NR) unused_route= iroute; } else { /* Try to track down any old routes, and look for an * unused one. */ for(i= 0, iroute= iroute_table; iirt_flags & IRTF_INUSE) == 0) { unused_route= iroute; continue; } if ((iroute->irt_flags & IRTF_STATIC) != 0) continue; if (iroute->irt_port != port_nr || iroute->irt_dest != dest || iroute->irt_subnetmask != subnetmask || iroute->irt_gateway != gateway) { continue; } break; } if (i != IROUTE_NR) unused_route= iroute; } if (unused_route == NULL) return ENOMEM; iroute= unused_route; iroute->irt_port= port_nr; iroute->irt_dest= dest; iroute->irt_subnetmask= subnetmask; iroute->irt_gateway= gateway; iroute->irt_dist= dist; iroute->irt_flags= IRTF_INUSE; if (static_route) iroute->irt_flags |= IRTF_STATIC; iroute_uncache_nw(iroute->irt_dest, iroute->irt_subnetmask); if (iroute_p != NULL) *iroute_p= iroute; return NW_OK; } PUBLIC int ipr_del_iroute(port_nr, dest, subnetmask, gateway, dist, static_route) int port_nr; ipaddr_t dest; ipaddr_t subnetmask; ipaddr_t gateway; int dist; int static_route; { int i; iroute_t *iroute; /* Try to track down any old routes, and look for an * unused one. */ for(i= 0, iroute= iroute_table; iirt_flags & IRTF_INUSE) == 0) continue; if (iroute->irt_port != port_nr || iroute->irt_dest != dest || iroute->irt_subnetmask != subnetmask || iroute->irt_gateway != gateway) { continue; } if (!!(iroute->irt_flags & IRTF_STATIC) != static_route) continue; break; } if (i == IROUTE_NR) return ESRCH; iroute_uncache_nw(iroute->irt_dest, iroute->irt_subnetmask); iroute->irt_flags= IRTF_EMPTY; return NW_OK; } PRIVATE iroute_uncache_nw(dest, netmask) ipaddr_t dest; ipaddr_t netmask; { int i, j; iroute_hash_t *iroute_hash; for (i= 0, iroute_hash= &iroute_hash_table[0][0]; ipp_flags= PPF_EMPTY; for (i=0, psip_fd= psip_fd_table; ipf_flags= PFF_EMPTY; #endif for (i=0, psip_port= psip_port_table; ipp_flags |= PPF_CONFIGURED; #if ZERO psip_port->pp_opencnt= 0; psip_port->pp_rd_head= NULL; psip_port->pp_promisc_head= NULL; #endif } #ifndef BUF_CONSISTENCY_CHECK bf_logon(psip_buffree); #else bf_logon(psip_buffree, psip_bufcheck); #endif } PUBLIC int psip_enable(port_nr, ip_port_nr) int port_nr; int ip_port_nr; { psip_port_t *psip_port; assert(port_nr >= 0 && port_nr < psip_conf_nr); psip_port= &psip_port_table[port_nr]; assert(psip_port->pp_flags & PPF_CONFIGURED); psip_port->pp_ipdev= ip_port_nr; psip_port->pp_flags |= PPF_ENABLED; sr_add_minor(if2minor(psip_conf[port_nr].pc_ifno, PSIP_DEV_OFF), port_nr, psip_open, psip_close, psip_read, psip_write, psip_ioctl, psip_cancel); return NW_OK; } PUBLIC int psip_send(port_nr, pack) int port_nr; acc_t *pack; { psip_port_t *psip_port; psip_fd_t *psip_fd, *mark_fd; int i, result, result1; size_t buf_size; acc_t *hdr_pack; psip_io_hdr_t *hdr; assert(port_nr >= 0 && port_nr < psip_conf_nr); psip_port= &psip_port_table[port_nr]; if (psip_port->pp_opencnt == 0) { bf_afree(pack); return NW_OK; } for(;;) { mark_fd= psip_port->pp_rd_tail; for(i= 0; ipp_rd_head; if (!psip_fd) return NW_SUSPEND; psip_port->pp_rd_head= psip_fd->pf_rd_next; if (!(psip_fd->pf_flags & PFF_PROMISC)) break; psip_fd->pf_rd_next= NULL; if (psip_port->pp_rd_head == NULL) psip_port->pp_rd_head= psip_fd; else psip_port->pp_rd_tail->pf_rd_next= psip_fd; psip_port->pp_rd_tail= psip_fd; if (psip_fd == mark_fd) return NW_SUSPEND; } if (i == PSIP_FD_NR) ip_panic(( "psip_send: loop" )); assert(psip_fd->pf_flags & PFF_READ_IP); psip_fd->pf_flags &= ~PFF_READ_IP; buf_size= bf_bufsize(pack); if (buf_size <= psip_fd->pf_rd_count) { if (psip_port->pp_flags & PPF_PROMISC) { /* Deal with promiscuous mode. */ hdr_pack= bf_memreq(sizeof(*hdr)); hdr= (psip_io_hdr_t *)ptr2acc_data(hdr_pack); memset(hdr, '\0', sizeof(*hdr)); hdr->pih_flags |= PF_LOC2REM; pack->acc_linkC++; hdr_pack->acc_next= pack; hdr_pack->acc_ext_link= NULL; if (psip_port->pp_promisc_head) { /* Append at the end. */ psip_port->pp_promisc_tail-> acc_ext_link= hdr_pack; psip_port->pp_promisc_tail= hdr_pack; } else { /* First packet. */ psip_port->pp_promisc_head= hdr_pack; psip_port->pp_promisc_tail= hdr_pack; if (psip_port->pp_rd_head) promisc_restart_read(psip_port); } } result= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, (size_t)0, pack, FALSE); if (result == NW_OK) result= buf_size; } else result= EPACKSIZE; result1= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, (size_t)result, NULL, FALSE); assert(result1 == NW_OK); if (result == EPACKSIZE) continue; return NW_OK; } return NW_SUSPEND; } PRIVATE int psip_open(port, srfd, get_userdata, put_userdata, put_pkt) int port; int srfd; get_userdata_t get_userdata; put_userdata_t put_userdata; put_pkt_t put_pkt; { psip_port_t *psip_port; psip_fd_t *psip_fd; int i; assert(port >= 0 && port < psip_conf_nr); psip_port= &psip_port_table[port]; if (!(psip_port->pp_flags & PPF_ENABLED)) return ENXIO; for (i= 0, psip_fd= psip_fd_table; ipf_flags & PFF_INUSE) continue; break; } if (i == PSIP_FD_NR) return ENFILE; psip_fd->pf_flags |= PFF_INUSE; psip_fd->pf_srfd= srfd; psip_fd->pf_port= psip_port; psip_fd->pf_get_userdata= get_userdata; psip_fd->pf_put_userdata= put_userdata; psip_port->pp_opencnt++; return i; } PRIVATE int psip_ioctl(fd, req) int fd; ioreq_t req; { int result; psip_fd_t *psip_fd; acc_t *data; nwio_psipopt_t *psip_opt, *newoptp; assert(fd >= 0 && fd < PSIP_FD_NR); psip_fd= &psip_fd_table[fd]; switch(req) { case NWIOSPSIPOPT: data= (*psip_fd->pf_get_userdata)(psip_fd->pf_srfd, 0, sizeof(*psip_opt), TRUE); if (!data) { result= EFAULT; break; } data= bf_packIffLess(data, sizeof(*psip_opt)); assert (data->acc_length == sizeof(*psip_opt)); newoptp= (nwio_psipopt_t *)ptr2acc_data(data); result= psip_setopt(psip_fd, newoptp); bf_afree(data); if (result == NW_OK) { if (psip_fd->pf_psipopt.nwpo_flags & NWPO_EN_PROMISC) { psip_fd->pf_flags |= PFF_PROMISC; psip_fd->pf_port->pp_flags |= PPF_PROMISC; } else { psip_fd->pf_flags &= ~PFF_PROMISC; /* XXX check port flags */ } } reply_thr_get(psip_fd, result, TRUE); break; case NWIOGPSIPOPT: data= bf_memreq(sizeof(*psip_opt)); psip_opt= (nwio_psipopt_t *)ptr2acc_data(data); *psip_opt= psip_fd->pf_psipopt; result= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, 0, data, TRUE); if (result == NW_OK) reply_thr_put(psip_fd, NW_OK, TRUE); break; default: reply_thr_put(psip_fd, ENOTTY, TRUE); break; } return NW_OK; } PRIVATE int psip_read(fd, count) int fd; size_t count; { psip_port_t *psip_port; psip_fd_t *psip_fd; assert(fd >= 0 && fd < PSIP_FD_NR); psip_fd= &psip_fd_table[fd]; psip_port= psip_fd->pf_port; psip_fd->pf_rd_count= count; if (psip_port->pp_rd_head == NULL) psip_port->pp_rd_head= psip_fd; else psip_port->pp_rd_tail->pf_rd_next= psip_fd; psip_fd->pf_rd_next= NULL; psip_port->pp_rd_tail= psip_fd; psip_fd->pf_flags |= PFF_READ_IP; if (psip_fd->pf_flags & PFF_PROMISC) promisc_restart_read(psip_port); else ipps_get(psip_port->pp_ipdev); if (psip_fd->pf_flags & PFF_READ_IP) return NW_SUSPEND; return NW_OK; } PRIVATE int psip_write(fd, count) int fd; size_t count; { psip_port_t *psip_port; psip_fd_t *psip_fd; acc_t *pack, *hdr_pack; psip_io_hdr_t *hdr; assert(fd >= 0 && fd < PSIP_FD_NR); psip_fd= &psip_fd_table[fd]; psip_port= psip_fd-y){)|)})~))))>pf_port; pack= (*psip_fd->pf_get_userdata)(psip_fd->pf_srfd, (size_t)0, count, FALSE); if (pack == NULL) { pack= (*psip_fd->pf_get_userdata)(psip_fd->pf_srfd, (size_t)EFAULT, (size_t)0, FALSE); assert(pack == NULL); return NW_OK; } if (psip_port->pp_flags & PPF_PROMISC) { /* Deal with promiscuous mode. */ hdr_pack= bf_memreq(sizeof(*hdr)); hdr= (psip_io_hdr_t *)ptr2acc_data(hdr_pack); memset(hdr, '\0', sizeof(*hdr)); hdr->pih_flags |= PF_REM2LOC; pack->acc_linkC++; hdr_pack->acc_next= pack; hdr_pack->acc_ext_link= NULL; if (psip_port->pp_promisc_head) { /* Append at the end. */ psip_port->pp_promisc_tail->acc_ext_link= hdr_pack; } else { /* First packet. */ psip_port->pp_promisc_head= hdr_pack; if (psip_port->pp_rd_head) promisc_restart_read(psip_port); } } ipps_put(psip_port->pp_ipdev, pack); pack= (*psip_fd->pf_get_userdata)(psip_fd->pf_srfd, (size_t)count, (size_t)0, FALSE); assert(pack == NULL); return NW_OK; } PRIVATE void psip_close(fd) int fd; { psip_port_t *psip_port; psip_fd_t *psip_fd; acc_t *acc, *acc_next; int i; assert(fd >= 0 && fd < PSIP_FD_NR); psip_fd= &psip_fd_table[fd]; psip_port= psip_fd->pf_port; assert(psip_port->pp_opencnt >0); psip_port->pp_opencnt--; psip_fd->pf_flags= PFF_EMPTY; ipps_get(psip_port->pp_ipdev); /* Check if the port should still be in promiscuous mode. */ if (psip_port->pp_flags & PPF_PROMISC) { psip_port->pp_flags &= ~PPF_PROMISC; for (i= 0, psip_fd= psip_fd_table; ipf_flags & (PFF_INUSE|PFF_PROMISC)) != (PFF_INUSE|PFF_PROMISC)) { continue; } if (psip_fd->pf_port != psip_port) continue; psip_port->pp_flags |= PPF_PROMISC; break; } if (!(psip_port->pp_flags & PPF_PROMISC)) { /* Delete queued packets. */ acc= psip_port->pp_promisc_head; psip_port->pp_promisc_head= NULL; while (acc) { acc_next= acc->acc_ext_link; bf_afree(acc); acc= acc_next; } } } } PRIVATE int psip_cancel(fd, which_operation) int fd; int which_operation; { psip_port_t *psip_port; psip_fd_t *psip_fd, *prev_fd, *tmp_fd; int result; DBLOCK(1, printf("psip_cancel(%d, %d)\n", fd, which_operation)); assert(fd >= 0 && fd < PSIP_FD_NR); psip_fd= &psip_fd_table[fd]; psip_port= psip_fd->pf_port; switch(which_operation) { #if !CRAMPED case SR_CANCEL_IOCTL: ip_panic(( "should not be here" )); #endif case SR_CANCEL_READ: assert(psip_fd->pf_flags & PFF_READ_IP); for (prev_fd= NULL, tmp_fd= psip_port->pp_rd_head; tmp_fd; prev_fd= tmp_fd, tmp_fd= tmp_fd->pf_rd_next) { if (tmp_fd == psip_fd) break; } #if !CRAMPED if (tmp_fd == NULL) ip_panic(( "unable to find to request to cancel" )); #endif if (prev_fd == NULL) psip_port->pp_rd_head= psip_fd->pf_rd_next; else prev_fd->pf_rd_next= psip_fd->pf_rd_next; if (psip_fd->pf_rd_next == NULL) psip_port->pp_rd_tail= prev_fd; psip_fd->pf_flags &= ~PFF_READ_IP; result= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, (size_t)EINTR, NULL, FALSE); assert(result == NW_OK); break; #if !CRAMPED case SR_CANCEL_WRITE: ip_panic(( "should not be here" )); default: ip_panic(( "invalid operation for cancel" )); #endif } return NW_OK; } PRIVATE void promisc_restart_read(psip_port) psip_port_t *psip_port; { psip_fd_t *psip_fd, *mark_fd; acc_t *pack; size_t buf_size; int i, result, result1; while (psip_port->pp_promisc_head) { mark_fd= psip_port->pp_rd_tail; for(i= 0; ipp_rd_head; if (!psip_fd) return; psip_port->pp_rd_head= psip_fd->pf_rd_next; if (psip_fd->pf_flags & PFF_PROMISC) break; psip_fd->pf_rd_next= NULL; if (psip_port->pp_rd_head == NULL) psip_port->pp_rd_head= psip_fd; else psip_port->pp_rd_tail->pf_rd_next= psip_fd; psip_port->pp_rd_tail= psip_fd; if (psip_fd == mark_fd) return; } if (i == PSIP_FD_NR) ip_panic(( "psip'promisc_restart_read: loop" )); assert(psip_fd->pf_flags & PFF_READ_IP); psip_fd->pf_flags &= ~PFF_READ_IP; pack= psip_port->pp_promisc_head; buf_size= bf_bufsize(pack); if (buf_size <= psip_fd->pf_rd_count) { psip_port->pp_promisc_head= pack->acc_ext_link; result= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, (size_t)0, pack, FALSE); if (result == NW_OK) result= buf_size; } else result= EPACKSIZE; result1= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, (size_t)result, NULL, FALSE); assert(result1 == NW_OK); } } PRIVATE int psip_setopt(psip_fd, newoptp) psip_fd_t *psip_fd; nwio_psipopt_t *newoptp; { nwio_psipopt_t oldopt; int result; unsigned int new_en_flags, new_di_flags, old_en_flags, old_di_flags, all_flags, flags; unsigned long new_flags; int i; oldopt= psip_fd->pf_psipopt; old_en_flags= oldopt.nwpo_flags & 0xffff; old_di_flags= (oldopt.nwpo_flags >> 16) & 0xffff; new_en_flags= newoptp->nwpo_flags & 0xffff; new_di_flags= (newoptp->nwpo_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) return EBADMODE; /* NWUO_LOCADDR_MASK */ if (!((new_en_flags | new_di_flags) & NWPO_PROMISC_MASK)) { new_en_flags |= (old_en_flags & NWPO_PROMISC_MASK); new_di_flags |= (old_di_flags & NWPO_PROMISC_MASK); } new_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; psip_fd->pf_psipopt= *newoptp; psip_fd->pf_psipopt.nwpo_flags= new_flags; return NW_OK; } PRIVATE void psip_buffree (priority) int priority; { int i; psip_port_t *psip_port; acc_t *tmp_acc, *next_acc; if (priority == PSIP_PRI_EXP_PROMISC) { for (i=0, psip_port= psip_port_table; ipp_flags & PPF_CONFIGURED) ) continue; if (psip_port->pp_promisc_head) { tmp_acc= psip_port->pp_promisc_head; while(tmp_acc) { next_acc= tmp_acc->acc_ext_link; bf_afree(tmp_acc); tmp_acc= next_acc; } psip_port->pp_promisc_head= NULL; } } } } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void psip_bufcheck() { int i; psip_port_t *psip_port; acc_t *tmp_acc; for (i= 0, psip_port= psip_port_table; ipp_promisc_head; tmp_acc; tmp_acc= tmp_acc->acc_ext_link) { bf_check_acc(tmp_acc); } } } #endif /* reply_thr_put */ PRIVATE void reply_thr_put(psip_fd, reply, for_ioctl) psip_fd_t *psip_fd; int reply; int for_ioctl; { int result; result= (*psip_fd->pf_put_userdata)(psip_fd->pf_srfd, reply, (acc_t *)0, for_ioctl); assert(result == NW_OK); } /* reply_thr_get */ PRIVATE void reply_thr_get(psip_fd, reply, for_ioctl) psip_fd_t *psip_fd; int reply; int for_ioctl; { acc_t *result; result= (*psip_fd->pf_get_userdata)(psip_fd->pf_srfd, reply, (size_t)0, for_ioctl); assert (!result); } #endif /* ENABLE_PSIP */ /* * $PchId: psip.c,v 1.6 1996/05/07 20:50:31 philip Exp $ */ /* generic/psip.h Public interface to the pseudo IP module Created: Apr 22, 1993 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef PSIP_H #define PSIP_H void psip_prep ARGS(( void )); void psip_init ARGS(( void )); int psip_enable ARGS(( int port_nr, int ip_port_nr )); int psip_send ARGS(( int port_nr, acc_t *pack )); #endif /* PSIP_H */ /* * $PchId: psip.h,v 1.4 1995/11/21 06:45:27 philip Exp $ */ /* sr.h Copyright 1995 Philip Homburg */ #ifndef SR_H #define SR_H #define MAX_IOCTL_S 512 #define SR_CANCEL_IOCTL 1 #define SR_CANCEL_READ 2 #define SR_CANCEL_WRITE 3 /* Forward struct declarations */ struct acc; /* prototypes */ typedef int (*sr_open_t) ARGS(( int port, int srfd, get_userdata_t get_userdata, put_userdata_t put_userdata, put_pkt_t put_pkt )); typedef void (*sr_close_t) ARGS(( int fd )); typedef int (*sr_read_t) ARGS(( int fd, size_t count )); typedef int (*sr_write_t) ARGS(( int fd, size_t count )); typedef int (*sr_ioctl_t) ARGS(( int fd, ioreq_t req )); typedef int (*sr_cancel_t) ARGS(( int fd, int which_operation )); void sr_init ARGS(( void )); void sr_add_minor ARGS(( int minor, int port, sr_open_t openf, sr_close_t closef, sr_read_t sr_read, sr_write_t sr_write, sr_ioctl_t ioctlf, sr_cancel_t cancelf )); #endif /* SR_H */ /* * $PchId: sr.h,v 1.6 1996/05/07 20:50:51 philip Exp $ */ /* tcp.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "type.h" #if !CRAMPED #include "io.h" #include "ip.h" #endif #include "sr.h" #include "assert.h" #include "tcp.h" #include "tcp_int.h" THIS_FILE PUBLIC tcp_port_t *tcp_port_table; PUBLIC tcp_fd_t tcp_fd_table[TCP_FD_NR]; PUBLIC tcp_conn_t tcp_conn_table[TCP_CONN_NR]; FORWARD void tcp_main ARGS(( tcp_port_t *port )); FORWARD acc_t *tcp_get_data ARGS(( int fd, size_t offset, size_t count, int for_ioctl )); FORWARD int tcp_put_data ARGS(( int fd, size_t offset, acc_t *data, int for_ioctl )); FORWARD void tcp_put_pkt ARGS(( int fd, acc_t *data, size_t datalen )); FORWARD void read_ip_packets ARGS(( tcp_port_t *port )); FORWARD int tcp_setconf ARGS(( tcp_fd_t *tcp_fd )); FORWARD int tcp_setopt ARGS(( tcp_fd_t *tcp_fd )); FORWARD int tcp_connect ARGS(( tcp_fd_t *tcp_fd )); FORWARD int tcp_listen ARGS(( tcp_fd_t *tcp_fd )); FORWARD tcpport_t find_unused_port ARGS(( int fd )); FORWARD int is_unused_port ARGS(( Tcpport_t port )); FORWARD int reply_thr_put ARGS(( tcp_fd_t *tcp_fd, int reply, int for_ioctl )); FORWARD void reply_thr_get ARGS(( tcp_fd_t *tcp_fd, int reply, int for_ioctl )); FORWARD tcp_conn_t *find_conn_entry ARGS(( Tcpport_t locport, ipaddr_t locaddr, Tcpport_t remport, ipaddr_t readaddr )); FORWARD tcp_conn_t *find_empty_conn ARGS(( void )); FORWARD tcp_conn_t *find_best_conn ARGS(( ip_hdr_t *ip_hdr, tcp_hdr_t *tcp_hdr )); FORWARD int maybe_listen ARGS(( ipaddr_t locaddr, Tcpport_t locport, ipaddr_t remaddr, Tcpport_t remport )); FORWARD int conn_right4fd ARGS(( tcp_conn_t *tcp_conn, tcp_fd_t *tcp_fd )); FORWARD int tcp_su4connect ARGS(( tcp_fd_t *tcp_fd )); FORWARD void tcp_buffree ARGS(( int priority )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void tcp_bufcheck ARGS(( void )); #endif FORWARD void tcp_setup_conn ARGS(( tcp_conn_t *tcp_conn )); PUBLIC void tcp_prep() { tcp_port_table= alloc(ip_conf_nr * sizeof(tcp_port_table[0])); } PUBLIC void tcp_init() { int i, j, k; tcp_fd_t *tcp_fd; tcp_port_t *tcp_port; tcp_conn_t *tcp_conn; assert (BUF_S >= sizeof(struct nwio_ipopt)); assert (BUF_S >= sizeof(struct nwio_ipconf)); assert (BUF_S >= sizeof(struct nwio_tcpconf)); assert (BUF_S >= IP_MAX_HDR_SIZE + TCP_MAX_HDR_SIZE); #if ZERO for (i=0, tcp_fd= tcp_fd_table; itf_flags= TFF_EMPTY; } for (i=0, tcp_conn= tcp_conn_table; itc_flags= TCF_EMPTY; tcp_conn->tc_busy= 0; } #endif #ifndef BUF_CONSISTENCY_CHECK bf_logon(tcp_buffree); #else bf_logon(tcp_buffree, tcp_bufcheck); #endif for (i=0, tcp_port= tcp_port_table; itp_ipdev= i; #if ZERO tcp_port->tp_flags= TPF_EMPTY; tcp_port->tp_state= TPS_EMPTY; tcp_port->tp_snd_head= NULL; tcp_port->tp_snd_tail= NULL; ev_init(&tcp_port->tp_snd_event); #endif for (j= 0; jtp_conn_hash[j][k]= &tcp_conn_table[0]; } } sr_add_minor(if2minor(ip_conf[i].ic_ifno, TCP_DEV_OFF), i, tcp_open, tcp_close, tcp_read, tcp_write, tcp_ioctl, tcp_cancel); tcp_main(tcp_port); } } PRIVATE void tcp_main(tcp_port) tcp_port_t *tcp_port; { int result, i; tcp_conn_t *tcp_conn; tcp_fd_t *tcp_fd; switch (tcp_port->tp_state) { case TPS_EMPTY: tcp_port->tp_state= TPS_SETPROTO; tcp_port->tp_ipfd= ip_open(tcp_port->tp_ipdev, tcp_port->tp_ipdev, tcp_get_data, tcp_put_data, tcp_put_pkt); if (tcp_port->tp_ipfd < 0) { tcp_port->tp_state= TPS_ERROR; DBLOCK(1, printf("%s, %d: unable to open ip port\n", __FILE__, __LINE__)); return; } result= ip_ioctl(tcp_port->tp_ipfd, NWIOSIPOPT); if (result == NW_SUSPEND) tcp_port->tp_flags |= TPF_SUSPEND; if (result < 0) { return; } if (tcp_port->tp_state != TPS_GETCONF) return; /* drops through */ case TPS_GETCONF: tcp_port->tp_flags &= ~TPF_SUSPEND; result= ip_ioctl(tcp_port->tp_ipfd, NWIOGIPCONF); if (result == NW_SUSPEND) tcp_port->tp_flags |= TPF_SUSPEND; if (result < 0) { return; } if (tcp_port->tp_state != TPS_MAIN) return; /* drops through */ case TPS_MAIN: tcp_port->tp_flags &= ~TPF_SUSPEND; tcp_port->tp_pack= 0; tcp_conn= &tcp_conn_table[tcp_port->tp_ipdev]; tcp_conn->tc_flags= TCF_INUSE; assert(!tcp_conn->tc_busy); tcp_conn->tc_locport= 0; tcp_conn->tc_locaddr= tcp_port->tp_ipaddr; tcp_conn->tc_remport= 0; tcp_conn->tc_remaddr= 0; tcp_conn->tc_state= TCS_CLOSED; tcp_conn->tc_fd= 0; tcp_conn->tc_connInprogress= 0; tcp_conn->tc_orglisten= FALSE; tcp_conn->tc_senddis= 0; tcp_conn->tc_ISS= 0; tcp_conn->tc_SND_UNA= tcp_conn->tc_ISS; tcp_conn->tc_SND_TRM= tcp_conn->tc_ISS; tcp_conn->tc_SND_NXT= tcp_conn->tc_ISS; tcp_conn->tc_SND_UP= tcp_conn->tc_ISS; tcp_conn->tc_IRS= 0; tcp_conn->tc_RCV_LO= tcp_conn->tc_IRS; tcp_conn->tc_RCV_NXT= tcp_conn->tc_IRS; tcp_conn->tc_RCV_HI= tcp_conn->tc_IRS; tcp_conn->tc_RCV_UP= tcp_conn->tc_IRS; tcp_conn->tc_port= tcp_port; tcp_conn->tc_rcvd_data= NULL; tcp_conn->tc_adv_data= NULL; tcp_conn->tc_send_data= 0; tcp_conn->tc_remipopt= NULL; tcp_conn->tc_tcpopt= NULL; tcp_conn->tc_frag2send= 0; tcp_conn->tc_tos= TCP_DEF_TOS; tcp_conn->tc_ttl= IP_MAX_TTL; tcp_conn->tc_rcv_wnd= TCP_MAX_RCV_WND_SIZE; tcp_conn->tc_rt_dead= TCP_DEF_RT_DEAD; tcp_conn->tc_stt= 0; tcp_conn->tc_0wnd_to= 0; tcp_conn->tc_rtt= TCP_DEF_RTT; tcp_conn->tc_mss= TCP_DEF_MSS; tcp_conn->tc_error= NW_OK; tcp_conn->tc_snd_wnd= TCP_MAX_SND_WND_SIZE; tcp_conn->tc_snd_cinc= (long)TCP_DEF_MSS*TCP_DEF_MSS/TCP_MAX_SND_WND_SIZE+1; tcp_conn->tc_rt_time= 0; tcp_conn->tc_rt_seq= 0; tcp_conn->tc_rt_threshold= tcp_conn->tc_ISS; for (i=0, tcp_fd= tcp_fd_table; itf_flags & TFF_INUSE)) continue; if (tcp_fd->tf_port != tcp_port) continue; if (tcp_fd->tf_flags & TFF_IOC_INIT_SP) { tcp_fd->tf_flags &= ~TFF_IOC_INIT_SP; tcp_ioctl(i, tcp_fd->tf_ioreq); } } read_ip_packets(tcp_port); return; #if !CRAMPED default: ip_panic(( "unknown state" )); #endif } } PRIVATE acc_t *tcp_get_data (port, offset, count, for_ioctl) int port; size_t offset; size_t count; int for_ioctl; { tcp_port_t *tcp_port; int result; tcp_port= &tcp_port_table[port]; switch (tcp_port->tp_state) { case TPS_SETPROTO: if (!count) { result= (int)offset; if (result<0) { tcp_port->tp_state= TPS_ERROR; break; } tcp_port->tp_state= TPS_GETCONF; if (tcp_port->tp_flags & TPF_SUSPEND) tcp_main(tcp_port); return NW_OK; } assert (!offset); assert (count == sizeof(struct nwio_ipopt)); { struct nwio_ipopt *ipopt; acc_t *acc; acc= bf_memreq(sizeof(*ipopt)); ipopt= (struct nwio_ipopt *)ptr2acc_data(acc); ipopt->nwio_flags= NWIO_COPY | NWIO_EN_LOC | NWIO_DI_BROAD | NWIO_REMANY | NWIO_PROTOSPEC | NWIO_HDR_O_ANY | NWIO_RWDATALL; ipopt->nwio_proto= IPPROTO_TCP; return acc; } case TPS_MAIN: assert(tcp_port->tp_flags & TPF_WRITE_IP); if (!count) { result= (int)offset; if (result<0) { if (result == EDSTNOTRCH) { if (tcp_port->tp_snd_head) { tcp_notreach(tcp_port-> tp_snd_head); } } else { ip_warning(( "ip_write failed with error: %d\n", result )); } } assert (tcp_port->tp_pack); bf_afree (tcp_port->tp_pack); tcp_port->tp_pack= 0; if (tcp_port->tp_flags & TPF_WRITE_SP) { tcp_port->tp_flags &= ~(TPF_WRITE_SP| TPF_WRITE_IP); if (tcp_port->tp_snd_head) tcp_port_write(tcp_port); } else tcp_port->tp_flags &= ~TPF_WRITE_IP; } else { return bf_cut (tcp_port->tp_pack, offset, count); } break; default: #if !CRAMPED printf("tcp_get_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x\n", port, offset, count, tcp_port->tp_state); #endif break; } return NW_OK; } PRIVATE int tcp_put_data (fd, offset, data, for_ioctl) int fd; size_t offset; acc_t *data; int for_ioctl; { tcp_port_t *tcp_port; int re)))))))))))))))))))))))))))))))))))))))sult; tcp_port= &tcp_port_table[fd]; switch (tcp_port->tp_state) { case TPS_GETCONF: if (!data) { result= (int)offset; if (result<0) { tcp_port->tp_state= TPS_ERROR; return NW_OK; } tcp_port->tp_state= TPS_MAIN; if (tcp_port->tp_flags & TPF_SUSPEND) tcp_main(tcp_port); } else { struct nwio_ipconf *ipconf; data= bf_packIffLess(data, sizeof(*ipconf)); ipconf= (struct nwio_ipconf *)ptr2acc_data(data); assert (ipconf->nwic_flags & NWIC_IPADDR_SET); tcp_port->tp_ipaddr= ipconf->nwic_ipaddr; bf_afree(data); } break; case TPS_MAIN: assert(tcp_port->tp_flags & TPF_READ_IP); if (!data) { result= (int)offset; if (result<0) ip_panic(( "ip_read() failed" )); if (tcp_port->tp_flags & TPF_READ_SP) { tcp_port->tp_flags &= ~(TPF_READ_SP| TPF_READ_IP); read_ip_packets(tcp_port); } else tcp_port->tp_flags &= ~TPF_READ_IP; } else { assert(!offset); /* this is an invalid assertion but ip sends * only whole datagrams up */ tcp_put_pkt(fd, data, bf_bufsize(data)); } break; default: #if !CRAMPED printf("tcp_put_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x\n", fd, offset, data, tcp_port->tp_state); #endif break; } return NW_OK; } /* tcp_put_pkt */ PRIVATE void tcp_put_pkt(fd, data, datalen) int fd; acc_t *data; size_t datalen; { tcp_port_t *tcp_port; tcp_conn_t *tcp_conn, **conn_p; ip_hdr_t *ip_hdr; tcp_hdr_t *tcp_hdr; acc_t *ip_pack, *tcp_pack; size_t ip_datalen, tcp_datalen, ip_hdr_len, tcp_hdr_len; u16_t sum; u32_t bits; int hash; ipaddr_t srcaddr, dstaddr; tcpport_t srcport, dstport; tcp_port= &tcp_port_table[fd]; /* Extract the IP header. */ ip_hdr= (ip_hdr_t *)ptr2acc_data(data); ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; ip_datalen= datalen - ip_hdr_len; if (ip_datalen == 0) { DBLOCK(1, printf("tcp_put_pkt: no TCP header\n")); bf_afree(data); return; } data->acc_linkC++; ip_pack= data; ip_pack= bf_align(ip_pack, ip_hdr_len, 4); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_pack); data= bf_delhead(data, ip_hdr_len); /* Compute the checksum */ sum= tcp_pack_oneCsum(ip_hdr, data); /* Extract the TCP header */ if (ip_datalen < TCP_MIN_HDR_SIZE) { DBLOCK(1, printf("truncated TCP header\n")); bf_afree(ip_pack); bf_afree(data); return; } data= bf_packIffLess(data, TCP_MIN_HDR_SIZE); tcp_hdr= (tcp_hdr_t *)ptr2acc_data(data); tcp_hdr_len= (tcp_hdr->th_data_off & TH_DO_MASK) >> 2; /* actualy (>> 4) << 2 */ if (ip_datalen < tcp_hdr_len || tcp_hdr_len < TCP_MIN_HDR_SIZE) { if (tcp_hdr_len < TCP_MIN_HDR_SIZE) { DBLOCK(1, printf("strange tcp header length %d\n", tcp_hdr_len)); } else { DBLOCK(1, printf("truncated TCP header\n")); } bf_afree(ip_pack); bf_afree(data); return; } data->acc_linkC++; tcp_pack= data; tcp_pack= bf_align(tcp_pack, tcp_hdr_len, 4); tcp_hdr= (tcp_hdr_t *)ptr2acc_data(tcp_pack); if (ip_datalen == tcp_hdr_len) { bf_afree(data); data= NULL; } else data= bf_delhead(data, tcp_hdr_len); tcp_datalen= ip_datalen-tcp_hdr_len; if ((u16_t)~sum) { DBLOCK(1, printf("checksum error in tcp packet\n"); printf("tcp_pack_oneCsum(...)= 0x%x length= %d\n", (u16_t)~sum, tcp_datalen); printf("src ip_addr= "); writeIpAddr(ip_hdr->ih_src); printf("\n")); bf_afree(ip_pack); bf_afree(tcp_pack); bf_afree(data); return; } srcaddr= ip_hdr->ih_src; dstaddr= ip_hdr->ih_dst; srcport= tcp_hdr->th_srcport; dstport= tcp_hdr->th_dstport; bits= srcaddr ^ dstaddr ^ srcport ^ dstport; bits= (bits >> 16) ^ bits; bits= (bits >> 8) ^ bits; hash= ((bits >> TCP_CONN_HASH_SHIFT) ^ bits) & (TCP_CONN_HASH_NR-1); conn_p= tcp_port->tp_conn_hash[hash]; if (conn_p[0]->tc_locport == dstport && conn_p[0]->tc_remport == srcport && conn_p[0]->tc_remaddr == srcaddr && conn_p[0]->tc_locaddr == dstaddr) { tcp_conn= conn_p[0]; } else if (conn_p[1]->tc_locport == dstport && conn_p[1]->tc_remport == srcport && conn_p[1]->tc_remaddr == srcaddr && conn_p[1]->tc_locaddr == dstaddr) { tcp_conn= conn_p[1]; conn_p[1]= conn_p[0]; conn_p[0]= tcp_conn; } else if (conn_p[2]->tc_locport == dstport && conn_p[2]->tc_remport == srcport && conn_p[2]->tc_remaddr == srcaddr && conn_p[2]->tc_locaddr == dstaddr) { tcp_conn= conn_p[2]; conn_p[2]= conn_p[1]; conn_p[1]= conn_p[0]; conn_p[0]= tcp_conn; } else if (conn_p[3]->tc_locport == dstport && conn_p[3]->tc_remport == srcport && conn_p[3]->tc_remaddr == srcaddr && conn_p[3]->tc_locaddr == dstaddr) { tcp_conn= conn_p[3]; conn_p[3]= conn_p[2]; conn_p[2]= conn_p[1]; conn_p[1]= conn_p[0]; conn_p[0]= tcp_conn; } else tcp_conn= NULL; if (tcp_conn != NULL && tcp_conn->tc_state == TCS_CLOSED || (tcp_hdr->th_flags & THF_SYN)) { tcp_conn= NULL; } if (tcp_conn == NULL) { tcp_conn= find_best_conn(ip_hdr, tcp_hdr); if (!tcp_conn) { /* listen backlog hack */ bf_afree(ip_pack); bf_afree(tcp_pack); bf_afree(data); return; } if (tcp_conn->tc_state != TCS_CLOSED) { conn_p[3]= conn_p[2]; conn_p[2]= conn_p[1]; conn_p[1]= conn_p[0]; conn_p[0]= tcp_conn; } } assert(tcp_conn->tc_busy == 0); tcp_conn->tc_busy++; tcp_frag2conn(tcp_conn, ip_hdr, tcp_hdr, data, tcp_datalen); tcp_conn->tc_busy--; bf_afree(ip_pack); bf_afree(tcp_pack); } PUBLIC int tcp_open (port, srfd, get_userdata, put_userdata, put_pkt) int port; int srfd; get_userdata_t get_userdata; put_userdata_t put_userdata; put_pkt_t put_pkt; { int i; tcp_fd_t *tcp_fd; for (i=0; i=TCP_FD_NR) { return EAGAIN; } tcp_fd= &tcp_fd_table[i]; tcp_fd->tf_flags= TFF_INUSE; tcp_fd->tf_flags |= TFF_PUSH_DATA; /* XXX */ tcp_fd->tf_port= &tcp_port_table[port]; tcp_fd->tf_srfd= srfd; tcp_fd->tf_tcpconf.nwtc_flags= TCP_DEF_CONF; tcp_fd->tf_tcpconf.nwtc_remaddr= 0; tcp_fd->tf_tcpconf.nwtc_remport= 0; tcp_fd->tf_tcpopt.nwto_flags= TCP_DEF_OPT; tcp_fd->tf_get_userdata= get_userdata; tcp_fd->tf_put_userdata= put_userdata; tcp_fd->tf_conn= 0; return i; } /* tcp_ioctl */ PUBLIC int tcp_ioctl (fd, req) int fd; ioreq_t req; { tcp_fd_t *tcp_fd; tcp_port_t *tcp_port; tcp_conn_t *tcp_conn; nwio_tcpconf_t *tcp_conf; nwio_tcpopt_t *tcp_opt; acc_t *conf_acc, *opt_acc; int result; tcp_fd= &tcp_fd_table[fd]; assert (tcp_fd->tf_flags & TFF_INUSE); tcp_port= tcp_fd->tf_port; tcp_fd->tf_flags |= TFF_IOCTL_IP; tcp_fd->tf_ioreq= req; if (tcp_port->tp_state != TPS_MAIN) { tcp_fd->tf_flags |= TFF_IOC_INIT_SP; return NW_SUSPEND; } switch (req) { case NWIOSTCPCONF: if (tcp_fd->tf_flags & TFF_CONNECTED) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, EISCONN, TRUE); result= NW_OK; break; } result= tcp_setconf(tcp_fd); break; case NWIOGTCPCONF: conf_acc= bf_memreq(sizeof(*tcp_conf)); assert (conf_acc->acc_length == sizeof(*tcp_conf)); tcp_conf= (nwio_tcpconf_t *)ptr2acc_data(conf_acc); *tcp_conf= tcp_fd->tf_tcpconf; if (tcp_fd->tf_flags & TFF_CONNECTED) { tcp_conn= tcp_fd->tf_conn; tcp_conf->nwtc_locport= tcp_conn->tc_locport; tcp_conf->nwtc_remaddr= tcp_conn->tc_remaddr; tcp_conf->nwtc_remport= tcp_conn->tc_remport; } tcp_conf->nwtc_locaddr= tcp_fd->tf_port->tp_ipaddr; result= (*tcp_fd->tf_put_userdata)(tcp_fd->tf_srfd, 0, conf_acc, TRUE); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_put(tcp_fd, result, TRUE); result= NW_OK; break; case NWIOSTCPOPT: result= tcp_setopt(tcp_fd); break; case NWIOGTCPOPT: opt_acc= bf_memreq(sizeof(*tcp_opt)); assert (opt_acc->acc_length == sizeof(*tcp_opt)); tcp_opt= (nwio_tcpopt_t *)ptr2acc_data(opt_acc); *tcp_opt= tcp_fd->tf_tcpopt; result= (*tcp_fd->tf_put_userdata)(tcp_fd->tf_srfd, 0, opt_acc, TRUE); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_put(tcp_fd, result, TRUE); result= NW_OK; break; case NWIOTCPCONN: if (tcp_fd->tf_flags & TFF_CONNECTED) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, EISCONN, TRUE); result= NW_OK; break; } result= tcp_connect(tcp_fd); break; case NWIOTCPLISTEN: if (tcp_fd->tf_flags & TFF_CONNECTED) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, EISCONN, TRUE); result= NW_OK; break; } result= tcp_listen(tcp_fd); break; case NWIOTCPSHUTDOWN: if (!(tcp_fd->tf_flags & TFF_CONNECTED)) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, ENOTCONN, TRUE); result= NW_OK; break; } tcp_fd->tf_flags |= TFF_IOCTL_IP; tcp_fd->tf_ioreq= req; tcp_conn= tcp_fd->tf_conn; tcp_conn->tc_busy++; tcp_fd_write(tcp_conn); tcp_conn->tc_busy--; tcp_conn_write(tcp_conn, 0); if (!(tcp_fd->tf_flags & TFF_IOCTL_IP)) return NW_OK; else return NW_SUSPEND; break; default: tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADIOCTL, TRUE); result= NW_OK; break; } return result; } /* tcp_setconf */ PRIVATE int tcp_setconf(tcp_fd) tcp_fd_t *tcp_fd; { nwio_tcpconf_t *tcpconf; nwio_tcpconf_t oldconf, newconf; acc_t *data; int result; tcpport_t port; tcp_fd_t *fd_ptr; unsigned int new_en_flags, new_di_flags, old_en_flags, old_di_flags, all_flags, flags; int i; data= (*tcp_fd->tf_get_userdata) (tcp_fd->tf_srfd, 0, sizeof(nwio_tcpconf_t), TRUE); if (!data) return EFAULT; data= bf_packIffLess(data, sizeof(nwio_tcpconf_t)); assert (data->acc_length == sizeof(nwio_tcpconf_t)); tcpconf= (nwio_tcpconf_t *)ptr2acc_data(data); oldconf= tcp_fd->tf_tcpconf; newconf= *tcpconf; old_en_flags= oldconf.nwtc_flags & 0xffff; old_di_flags= (oldconf.nwtc_flags >> 16) & 0xffff; new_en_flags= newconf.nwtc_flags & 0xffff; new_di_flags= (newconf.nwtc_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; } /* NWTC_ACC_MASK */ if (new_di_flags & NWTC_ACC_MASK) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; /* access modes can't be disabled */ } if (!(new_en_flags & NWTC_ACC_MASK)) new_en_flags |= (old_en_flags & NWTC_ACC_MASK); /* NWTC_LOCPORT_MASK */ if (new_di_flags & NWTC_LOCPORT_MASK) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; /* the loc ports can't be disabled */ } if (!(new_en_flags & NWTC_LOCPORT_MASK)) { new_en_flags |= (old_en_flags & NWTC_LOCPORT_MASK); newconf.nwtc_locport= oldconf.nwtc_locport; } else if ((new_en_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SEL) { newconf.nwtc_locport= find_unused_port(tcp_fd- tcp_fd_table); } else if ((new_en_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET) { if (!newconf.nwtc_locport) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; } } /* NWTC_REMADDR_MASK */ if (!((new_en_flags | new_di_flags) & NWTC_REMADDR_MASK)) { new_en_flags |= (old_en_flags & NWTC_REMADDR_MASK); new_di_flags |= (old_di_flags & NWTC_REMADDR_MASK); newconf.nwtc_remaddr= oldconf.nwtc_remaddr; } else if (new_en_flags & NWTC_SET_RA) { if (!newconf.nwtc_remaddr) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; } } else { assert (new_di_flags & NWTC_REMADDR_MASK); newconf.nwtc_remaddr= 0; } /* NWTC_REMPORT_MASK */ if (!((new_en_flags | new_di_flags) & NWTC_REMPORT_MASK)) { new_en_flags |= (old_en_flags & NWTC_REMPORT_MASK); new_di_flags |= (old_di_flags & NWTC_REMPORT_MASK); newconf.nwtc_remport= oldconf.nwtc_remport; } else if (new_en_flags & NWTC_SET_RP) { if (!newconf.nwtc_remport) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); bf_afree(data); return NW_OK; } } else { assert (new_di_flags & NWTC_REMPORT_MASK); newconf.nwtc_remport= 0; } newconf.nwtc_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; all_flags= new_en_flags | new_di_flags; /* check the access modes */ if ((all_flags & NWTC_LOCPORT_MASK) != NWTC_LP_UNSET) { for (i=0, fd_ptr= tcp_fd_table; itf_flags & TFF_INUSE)) continue; if (fd_ptr->tf_port != tcp_fd->tf_port) continue; flags= fd_ptr->tf_tcpconf.nwtc_flags; if ((flags & NWTC_LOCPORT_MASK) == NWTC_LP_UNSET) continue; if (fd_ptr->tf_tcpconf.nwtc_locport != newconf.nwtc_locport) continue; if ((flags & NWTC_ACC_MASK) != (all_flags & NWTC_ACC_MASK) || (all_flags & NWTC_ACC_MASK) == NWTC_EXCL) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EADDRINUSE, TRUE); bf_afree(data); return NW_OK; } } } tcp_fd->tf_tcpconf= newconf; if ((all_flags & NWTC_ACC_MASK) && ((all_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SET || (all_flags & NWTC_LOCPORT_MASK) == NWTC_LP_SEL) && (all_flags & NWTC_REMADDR_MASK) && (all_flags & NWTC_REMPORT_MASK)) tcp_fd->tf_flags |= TFF_CONF_SET; else { tcp_fd->tf_flags &= ~TFF_CONF_SET; } bf_afree(data); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, NW_OK, TRUE); return NW_OK; } /* tcp_setopt */ PRIVATE int tcp_setopt(tcp_fd) tcp_fd_t *tcp_fd; { nwio_tcpopt_t *tcpopt; nwio_tcpopt_t oldopt, newopt; acc_t *data; int result; tcpport_t port; tcp_fd_t *fd_ptr; unsigned int new_en_flags, new_di_flags, old_en_flags, old_di_flags, all_flags, flags; int i; data= (*tcp_fd->tf_get_userdata) (tcp_fd->tf_srfd, 0, sizeof(nwio_tcpopt_t), TRUE); if (!data) return EFAULT; data= bf_packIffLess(data, sizeof(nwio_tcpopt_t)); assert (data->acc_length == sizeof(nwio_tcpopt_t)); tcpopt= (nwio_tcpopt_t *)ptr2acc_data(data); oldopt= tcp_fd->tf_tcpopt; newopt= *tcpopt; old_en_flags= oldopt.nwto_flags & 0xffff; old_di_flags= (oldopt.nwto_flags >> 16) & 0xffff; new_en_flags= newopt.nwto_flags & 0xffff; new_di_flags= (newopt.nwto_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); return NW_OK; } /* NWTO_SND_URG_MASK */ if (!((new_en_flags | new_di_flags) & NWTO_SND_URG_MASK)) { new_en_flags |= (old_en_flags & NWTO_SND_URG_MASK); new_di_flags |= (old_di_flags & NWTO_SND_URG_MASK); } /* NWTO_RCV_URG_MASK */ if (!((new_en_flags | new_di_flags) & NWTO_RCV_URG_MASK)) { new_en_flags |= (old_en_flags & NWTO_RCV_URG_MASK); new_di_flags |= (old_di_flags & NWTO_RCV_URG_MASK); } /* NWTO_BSD_URG_MASK */ if (!((new_en_flags | new_di_flags) & NWTO_BSD_URG_MASK)) { new_en_flags |= (old_en_flags & NWTO_BSD_URG_MASK); new_di_flags |= (old_di_flags & NWTO_BSD_URG_MASK); } else { if (tcp_fd->tf_conn == NULL) { bf_afree(data); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EINVAL, TRUE); return NW_OK; } } /* NWTO_DEL_RST_MASK */ if (!((new_en_flags | new_di_flags) & NWTO_DEL_RST_MASK)) { new_en_flags |= (old_en_flags & NWTO_DEL_RST_MASK); new_di_flags |= (old_di_flags & NWTO_DEL_RST_MASK); } newopt.nwto_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; tcp_fd->tf_tcpopt= newopt; if (newopt.nwto_flags & NWTO_SND_URG) tcp_fd->tf_flags |= TFF_WR_URG; else tcp_fd->tf_flags &= ~TFF_WR_URG; if (newopt.nwto_flags & NWTO_RCV_URG) tcp_fd->tf_flags |= TFF_RECV_URG; else tcp_fd->tf_flags &= ~TFF_RECV_URG; if (tcp_fd->tf_conn) { if (newopt.nwto_flags & NWTO_BSD_URG) { tcp_fd->tf_conn->tc_flags |= TCF_BSD_URG; } else { tcp_fd->tf_conn->tc_flags &= ~TCF_BSD_URG; } } if (newopt.nwto_flags & NWTO_DEL_RST) tcp_fd->tf_flags |= TFF_DEL_RST; else tcp_fd->tf_flags &= ~TFF_DEL_RST; bf_afree(data); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, NW_OK, TRUE); return NW_OK; } PRIVATE tcpport_t find_unused_port(fd) int fd; { tcpport_t port, nw_port; nw_port= htons(0xC000+fd); if (is_unused_port(nw_port)) return nw_port; for (port= 0xC000+TCP_FD_NR; port < 0xFFFF; port++) { nw_port= htons(port); if (is_unused_port(nw_port)) return nw_port; } #if !CRAMPED ip_panic(( "unable to find unused port (shouldn't occur)" )); return 0; #endif } PRIVATE int is_unused_port(port) tcpport_t port; { int i; tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; for (i= 0, tcp_fd= tcp_fd_table; itf_flags & TFF_CONF_SET)) continue; if (tcp_fd->tf_tcpconf.nwtc_locport == port) return FALSE; } for (i= ip_conf_nr, tcp_conn= tcp_conn_table+i; itc_flags & TCF_INUSE)) continue; if (tcp_conn->tc_locport == port) return FALSE; } return TRUE; } PRIVATE int reply_thr_put(tcp_fd, reply, for_ioctl) tcp_fd_t *tcp_fd; int reply; int for_ioctl; { assert (tcp_fd); return (*tcp_fd->tf_put_userdata)(tcp_fd->tf_srfd, reply, (acc_t *)0, for_ioctl); } PRIVATE void reply_thr_get(tcp_fd, reply, for_ioctl) tcp_fd_t *tcp_fd; int reply; int for_ioctl; { acc_t *result; result= (*tcp_fd->tf_get_userdata)(tcp_fd->tf_srfd, reply, (size_t)0, for_ioctl); assert (!result); } PUBLIC int tcp_su4listen(tcp_fd) tcp_fd_t *tcp_fd; { tcp_conn_t *tcp_conn; acc_t *tmp_acc; tcp_conn= tcp_fd->tf_conn; tcp_conn->tc_locport= tcp_fd->tf_tcpconf.nwtc_locport; tcp_conn->tc_locaddr= tcp_fd->tf_port->tp_ipaddr; if (tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RP) tcp_conn->tc_remport= tcp_fd->tf_tcpconf.nwtc_remport; else tcp_conn->tc_remport= 0; if (tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RA) tcp_conn->tc_remaddr= tcp_fd->tf_tcpconf.nwtc_remaddr; else tcp_conn->tc_remaddr= 0; tcp_setup_conn(tcp_conn); tcp_conn->tc_port= tcp_fd->tf_port; tcp_conn->tc_fd= tcp_fd; tcp_conn->tc_connInprogress= 1; tcp_conn->tc_orglisten= TRUE; tcp_conn->tc_state= TCS_LISTEN; tcp_conn->tc_rt_dead= TCP_DEF_RT_MAX_LISTEN; return NW_SUSPEND; } /* find_empty_conn This function returns a connection that is not inuse. This includes connections that are never used, and connections without a user that are not used for a while. */ PRIVATE tcp_conn_t *find_empty_conn() { int i; tcp_conn_t *tcp_conn; int state; for (i=ip_conf_nr, tcp_conn= tcp_conn_table+i; itc_flags == TCF_EMPTY) { tcp_conn->tc_connInprogress= 0; tcp_conn->tc_fd= NULL; return tcp_conn; } if (tcp_conn->tc_fd) continue; if (tcp_conn->tc_senddis > get_time()) continue; if (tcp_conn->tc_state != TCS_CLOSED) { tcp_close_connection (tcp_conn, ENOCONN); } tcp_conn->tc_flags= 0; return tcp_conn; } return NULL; } /* find_conn_entry This function return a connection matching locport, locaddr, remport, remaddr. If no such connection exists NULL is returned. If a connection exists without mainuser it is closed. */ PRIVATE tcp_conn_t *find_conn_entry(locport, locaddr, remport, remaddr) tcpport_t locport; ipaddr_t locaddr; tcpport_t remport; ipaddr_t remaddr; { tcp_conn_t *tcp_conn; int i, state; assert(remport); assert(remaddr); for (i=ip_conf_nr, tcp_conn= tcp_conn_table+i; itc_flags == TCF_EMPTY) continue; if (tcp_conn->tc_locport != locport || tcp_conn->tc_locaddr != locaddr || tcp_conn->tc_remport != remport || tcp_conn->tc_remaddr != remaddr) continue; if (tcp_conn->tc_fd) return tcp_conn; state= tcp_conn->tc_state; if (state != TCS_CLOSED) { tcp_close_connection(tcp_conn, ENOCONN); } return tcp_conn; } return NULL; } PRIVATE void read_ip_packets(tcp_port) tcp_port_t *tcp_port; { int result; do { tcp_port->tp_flags |= TPF_READ_IP; result= ip_read(tcp_port->tp_ipfd, TCP_MAX_DATAGRAM); if (result == NW_SUSPEND) { tcp_port->tp_flags |= TPF_READ_SP; return; } assert(result == NW_OK); tcp_port->tp_flags &= ~TPF_READ_IP; } while(!(tcp_port->tp_flags & TPF_READ_IP)); } /* find_best_conn */ PRIVATE tcp_conn_t *find_best_conn(ip_hdr, tcp_hdr) ip_hdr_t *ip_hdr; tcp_hdr_t *tcp_hdr; { int best_level, new_level; tcp_conn_t *best_conn, *listen_conn, *tcp_conn; tcp_fd_t *tcp_fd; int i; ipaddr_t locaddr; ipaddr_t remaddr; tcpport_t locport; tcpport_t remport; locaddr= ip_hdr->ih_dst; remaddr= ip_hdr->ih_src; locport= tcp_hdr->th_dstport; remport= tcp_hdr->th_srcport; if (!remport) /* This can interfere with a listen, so we reject it * by clearing the requested port */ locport= 0; best_level= 0; best_conn= NULL; listen_conn= NULL; for (i= ip_conf_nr, tcp_conn= tcp_conn_table+i; itc_flags & TCF_INUSE)) continue; /* First fast check for open connections. */ if (tcp_conn->tc_locaddr == locaddr && tcp_conn->tc_locport == locport && tcp_conn->tc_remport == remport && tcp_conn->tc_remaddr == remaddr && tcp_conn->tc_fd) { return tcp_conn; } /* Now check for listens and abandoned connections. */ if (tcp_conn->tc_locaddr != locaddr) { continue; } new_level= 0; if (tcp_conn->tc_locport) { if (tcp_conn->tc_locport != locport) { continue; } new_level += 4; } if (tcp_conn->tc_remport) { if (tcp_conn->tc_remport != remport) { continue; } new_level += 1; } if (tcp_conn->tc_remaddr) { if (tcp_conn->tc_remaddr != remaddr) { continue; } new_level += 2; } if (new_leveltc_state != TCS_LISTEN) continue; if (new_level == 7 && !tcp_conn->tc_fd) /* We found an abandoned connection */ { if (best_conn && tcp_Lmod4G(tcp_conn->tc_ISS, best_conn->tc_ISS)) { continue; } best_conn= tcp_conn; continue; } if (!(tcp_hdr->th_flags & THF_SYN)) continue; best_level= new_level; listen_conn= tcp_conn; } if (!best_conn && !listen_conn) { if ((tcp_hdr->th_flags & THF_SYN) && maybe_listen(locaddr, locport, remaddr, remport)) { /* Quick hack to implement listen back logs: * if a SYN arrives and there is no listen waiting * for that packet, then no reply is sent. */ return NULL; } for (i=0, tcp_conn= tcp_conn_table; itc_flags & TCF_INUSE) && tcp_conn->tc_locaddr==locaddr) { break; } } assert (tcp_conn); assert (tcp_conn->tc_state == TCS_CLOSED); tcp_conn->tc_locport= locport; tcp_conn->tc_locaddr= locaddr; tcp_conn->tc_remport= remport; tcp_conn->tc_remaddr= remaddr; assert (!tcp_conn->tc_fd); return tcp_conn; } if (best_conn) { assert(!best_conn->tc_fd); if (!listen_conn) return best_conn; tcp_fd= listen_conn->tc_fd; assert(tcp_fd && listen_conn->tc_connInprogress && tcp_fd->tf_conn == listen_conn); if (best_conn->tc_state != TCS_CLOSED) tcp_close_connection(best_conn, ENOCONN); listen_conn->tc_ISS= best_conn->tc_ISS; if (best_conn->tc_senddis > listen_conn->tc_senddis) listen_conn->tc_senddis= best_conn->tc_senddis; return listen_conn; } assert (listen_conn); return listen_conn; } /* maybe_listen */ PRIVATE int maybe_listen(locaddr, locport, remaddr, remport) ipaddr_t locaddr; tcpport_t locport; ipaddr_t remaddr; tcpport_t remport; { int i; tcp_conn_t *tcp_conn; tcp_fd_t *fd; for (i= ip_conf_nr, tcp_conn= tcp_conn_table+i; itc_flags & TCF_INUSE)) continue; if (tcp_conn->tc_locaddr != locaddr) { continue; } if (tcp_conn->tc_locport != locport ) { continue; } if (!tcp_conn->tc_orglisten) continue; fd= tcp_conn->tc_fd; if (!fd) continue; if ((fd->tf_tcpconf.nwtc_flags & NWTC_SET_RP) && tcp_conn->tc_remport != remport) { continue; } if ((fd->tf_tcpconf.nwtc_flags & NWTC_SET_RA) && tcp_conn->tc_remaddr != remaddr) { continue; } if (!(fd->tf_flags & TFF_DEL_RST)) continue; return 1; } return 0; } PUBLIC void tcp_reply_ioctl(tcp_fd, reply) tcp_fd_t *tcp_fd; int reply; { assert (tcp_fd->tf_flags & TFF_IOCTL_IP); assert (tcp_fd->tf_ioreq == NWIOTCPSHUTDOWN || tcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONN); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, reply, TRUE); } PUBLIC void tcp_reply_write(tcp_fd, reply) tcp_fd_t *tcp_fd; size_t reply; { assert (tcp_fd->tf_flags & TFF_WRITE_IP); tcp_fd->tf_flags &= ~TFF_WRITE_IP; reply_thr_get (tcp_fd, reply, FALSE); } PUBLIC void tcp_reply_read(tcp_fd, reply) tcp_fd_t *tcp_fd; size_t reply; { assert (tcp_fd->tf_flags & TFF_READ_IP); tcp_fd->tf_flags &= ~TFF_READ_IP; reply_thr_put (tcp_fd, reply, FALSE); } PUBLIC int tcp_write(fd, count) int fd; size_t count; { tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; tcp_fd= &tcp_fd_table[fd]; assert (tcp_fd->tf_flags & TFF_INUSE); if (!(tcp_fd->tf_flags & TFF_CONNECTED)) { reply_thr_get (tcp_fd, ENOTCONN, FALSE); return NW_OK; } tcp_conn= tcp_fd->tf_conn; if (tcp_conn->tc_state == TCS_CLOSED) { reply_thr_get(tcp_fd, tcp_conn->tc_error, FALSE); return NW_OK; } if (tcp_conn->tc_flags & TCF_FIN_SENT) { reply_thr_get (tcp_fd, ESHUTDOWN, FALSE); return NW_OK; } tcp_fd->tf_flags |= TFF_WRITE_IP; tcp_fd->tf_write_offset= 0; tcp_fd->tf_write_count= count; /* Start the timer (if necessary) */ if (tcp_conn->tc_SND_UNA == tcp_conn->tc_SND_NXT && tcp_conn->tc_transmit_seq == tcp_conn->tc_SND_UNA) { tcp_set_send_timer(tcp_conn); } assert(tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)); assert(tcp_conn->tc_busy == 0); tcp_conn->tc_busy++; tcp_fd_write(tcp_conn); tcp_conn->tc_busy--; tcp_conn_write(tcp_conn, 0); if (!(tcp_fd->tf_flags & TFF_WRITE_IP)) return NW_OK; else return NW_SUSPEND; } PUBLIC int tcp_read(fd, count) int fd; size_t count; { tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; tcp_fd= &tcp_fd_table[fd]; assert (tcp_fd->tf_flags & TFF_INUSE); if (!(tcp_fd->tf_flags & TFF_CONNECTED)) { reply_thr_put (tcp_fd, ENOTCONN, FALSE); return NW_OK; } tcp_conn= tcp_fd->tf_conn; tcp_fd->tf_flags |= TFF_READ_IP; tcp_fd->tf_read_offset= 0; tcp_fd->tf_read_count= count; assert(tcp_conn->tc_busy == 0); tcp_conn->tc_busy++; tcp_fd_read(tcp_conn, 0); tcp_conn->tc_busy--; if (!(tcp_fd->tf_flags & TFF_READ_IP)) return NW_OK; else return NW_SUSPEND; } /* tcp_restart_connect reply the success or failure of a connect to the user. */ PUBLIC void tcp_restart_connect(tcp_fd) tcp_fd_t *tcp_fd; { tcp_conn_t *tcp_conn; int reply; assert(tcp_fd); assert(tcp_fd->tf_flags & TFF_IOCTL_IP); assert(tcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONN); tcp_conn= tcp_fd->tf_conn; assert(tcp_conn); assert(tcp_conn->tc_connInprogress); if (tcp_conn->tc_state == TCS_CLOSED) { reply= tcp_conn->tc_error; assert(tcp_conn->tc_fd == tcp_fd); tcp_fd->tf_conn= NULL; tcp_conn->tc_fd= NULL; } else { tcp_fd->tf_flags |= TFF_CONNECTED; reply= NW_OK; } tcp_conn->tc_connInprogress= 0; tcp_reply_ioctl (tcp_fd, reply); } /* tcp_close */ PUBLIC void tcp_close(fd) int fd; { tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; tcp_fd= &tcp_fd_table[fd]; assert (tcp_fd->tf_flags & TFF_INUSE); assert (!(tcp_fd->tf_flags & (TFF_IOCTL_IP|TFF_READ_IP|TFF_WRITE_IP))); tcp_fd->tf_flags &= ~TFF_INUSE; if (!tcp_fd->tf_conn) return; tcp_conn= tcp_fd->tf_conn; assert(tcp_conn->tc_fd == tcp_fd); tcp_conn->tc_fd= 0; assert (!tcp_conn->tc_connInprogress); tcp_shutdown (tcp_conn); if (tcp_conn->tc_state == TCS_ESTABLISHED) { tcp_conn->tc_state= TCS_CLOSING; } /* Set the retransmission timeout a bit smaller. */ tcp_conn->tc_rt_dead= TCP_DEF_RT_MAX_CLOSING; /* If all data has been acknowledged, close the connection. */ if (tcp_conn->tc_SND_UNA == tcp_conn->tc_SND_NXT) tcp_close_connection(tcp_conn, ENOTCONN); } PUBLIC int tcp_cancel(fd, which_operation) int fd; int which_operation; { tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; int i; tcp_fd= &tcp_fd_table[fd]; assert (tcp_fd->tf_flags & TFF_INUSE); tcp_conn= tcp_fd->tf_conn; switch (which_operation) { case SR_CANCEL_WRITE: assert (tcp_fd->tf_flags & TFF_WRITE_IP); tcp_fd->tf_flags &= ~TFF_WRITE_IP; if (tcp_fd->tf_write_offset) reply_thr_get (tcp_fd, tcp_fd->tf_write_offset, FALSE); else reply_thr_get (tcp_fd, EINTR, FALSE); break; case SR_CANCEL_READ: assert (tcp_fd->tf_flags & TFF_READ_IP); tcp_fd->tf_flags &= ~TFF_READ_IP; if (tcp_fd->tf_read_offset) reply_thr_put (tcp_fd, tcp_fd->tf_read_offset, FALSE); else reply_thr_put (tcp_fd, EINTR, FALSE); break; case SR_CANCEL_IOCTL: assert (tcp_fd->tf_flags & TFF_IOCTL_IP); tcp_fd->tf_flags &= ~TFF_IOCTL_IP; switch (tcp_fd->tf_ioreq) { case NWIOGTCPCONF: reply_thr_put (tcp_fd, EINTR, TRUE); break; case NWIOSTCPCONF: case NWIOTCPSHUTDOWN: reply_thr_get (tcp_fd, EINTR, TRUE); break; case NWIOTCPCONN: case NWIOTCPLISTEN: assert (tcp_conn->tc_connInprogress); tcp_conn->tc_connInprogress= 0; tcp_conn->tc_fd= 0; tcp_fd->tf_conn= 0; tcp_close_connection(tcp_conn, ENOCONN); reply_thr_get (tcp_fd, EINTR, TRUE); break; default: ip_warning(( "unknown ioctl inprogress: 0x%x", tcp_fd->tf_ioreq )); reply_thr_get (tcp_fd, EINTR, TRUE); break; } break; #if !CRAMPED default: ip_panic(( "unknown cancel request" )); #endif } return NW_OK; } /* tcp_connect */ PRIVATE int tcp_connect(tcp_fd) tcp_fd_t *tcp_fd; { tcp_conn_t *tcp_conn; int state; if (!(tcp_fd->tf_flags & TFF_CONF_SET)) { tcp_reply_ioctl(tcp_fd, EBADMODE); return NW_OK; } if (tcp_fd->tf_flags & TFF_CONNECT) { tcp_reply_ioctl(tcp_fd, EISCONN); return NW_OK; } if ((tcp_fd->tf_tcpconf.nwtc_flags & (NWTC_SET_RA|NWTC_SET_RP)) != (NWTC_SET_RA|NWTC_SET_RP)) { tcp_reply_ioctl(tcp_fd, EBADMODE); return NW_OK; } assert(!tcp_fd->tf_conn); tcp_conn= find_conn_entry(tcp_fd->tf_tcpconf.nwtc_locport, tcp_fd->tf_port->tp_ipaddr, tcp_fd->tf_tcpconf.nwtc_remport, tcp_fd->tf_tcpconf.nwtc_remaddr); if (tcp_conn) { if (tcp_conn->tc_fd) { tcp_reply_ioctl(tcp_fd, EADDRINUSE); return NW_OK; } } else { tcp_conn= find_empty_conn(); if (!tcp_conn) { tcp_reply_ioctl(tcp_fd, EAGAIN); return NW_OK; } } tcp_fd->tf_conn= tcp_conn; return tcp_su4connect(tcp_fd); } /* tcp_su4connect */ PRIVATE int tcp_su4connect(tcp_fd) tcp_fd_t *tcp_fd; { tcp_conn_t *tcp_conn; acc_t *tmp_acc; tcp_conn= tcp_fd->tf_conn; tcp_conn->tc_locport= tcp_fd->tf_tcpconf.nwtc_locport; tcp_conn->tc_locaddr= tcp_fd->tf_port->tp_ipaddr; assert (tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RP); assert (tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RA); tcp_conn->tc_remport= tcp_fd->tf_tcpconf.nwtc_remport; tcp_conn->tc_remaddr= tcp_fd->tf_tcpconf.nwtc_remaddr; tcp_setup_conn(tcp_conn); tcp_conn->tc_fd= tcp_fd; tcp_conn->tc_port= tcp_fd->tf_port; tcp_conn->tc_connInprogress= 1; tcp_conn->tc_orglisten= FALSE; tcp_conn->tc_state= TCS_SYN_SENT; tcp_conn->tc_rt_dead= TCP_DEF_RT_MAX_CONNECT; /* Start the timer (if necessary) */ tcp_set_send_timer(tcp_conn); tcp_conn_write(tcp_conn, 0); if (tcp_conn->tc_connInprogress) return NW_SUSPEND; else return NW_OK; } PRIVATE int conn_right4fd(tcp_conn, tcp_fd) tcp_fd_t *tcp_fd; tcp_conn_t *tcp_conn; { unsigned long flags; flags= tcp_fd->tf_tcpconf.nwtc_flags; if (tcp_fd->tf_tcpconf.nwtc_locport != tcp_conn->tc_locport) return FALSE; if ((flags & NWTC_SET_RA) && tcp_fd->tf_tcpconf.nwtc_remaddr != tcp_conn->tc_remaddr) return FALSE; if ((flags & NWTC_SET_RP) && tcp_fd->tf_tcpconf.nwtc_remport != tcp_conn->tc_remport) return FALSE; if (tcp_fd->tf_port != tcp_conn->tc_port) return FALSE; return TRUE; } /* tcp_listen */ PRIVATE int tcp_listen(tcp_fd) tcp_fd_t *tcp_fd; { tcp_conn_t *tcp_conn; int state; if (!(tcp_fd->tf_flags & TFF_CONF_SET)) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EBADMODE, TRUE); return NW_OK; } if (tcp_fd->tf_flags & TFF_CONNECT) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get(tcp_fd, EISCONN, TRUE); return NW_OK; } tcp_conn= tcp_fd->tf_conn; assert(!tcp_conn); if ((tcp_fd->tf_tcpconf.nwtc_flags & (NWTC_SET_RA|NWTC_SET_RP)) == (NWTC_SET_RA|NWTC_SET_RP)) { tcp_conn= find_conn_entry( tcp_fd->tf_tcpconf.nwtc_locport, tcp_fd->tf_port->tp_ipaddr, tcp_fd->tf_tcpconf.nwtc_remport, tcp_fd->tf_tcpconf.nwtc_remaddr); if (tcp_conn) { if (tcp_conn->tc_fd) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, EADDRINUSE, TRUE); return NW_OK; } tcp_fd->tf_conn= tcp_conn; return tcp_su4listen(tcp_fd); } } tcp_conn= find_empty_conn(); if (!tcp_conn) { tcp_fd->tf_flags &= ~TFF_IOCTL_IP; reply_thr_get (tcp_fd, EAGAIN, TRUE); return NW_OK; } tcp_fd->tf_conn= tcp_conn; return tcp_su4listen(tcp_fd); } PRIVATE void tcp_buffree (priority) int priority; { int i; tcp_conn_t *tcp_conn; if (priority == TCP_PRI_FRAG2SEND) { for (i=0, tcp_conn= tcp_conn_table; itc_flags & TCF_INUSE)) continue; if (!tcp_conn->tc_frag2send) continue; if (tcp_conn->tc_busy) continue; bf_afree(tcp_conn->tc_frag2send); tcp_conn->tc_frag2send= 0; } } if (priority == TCP_PRI_CONN_EXTRA) { for (i=0, tcp_conn= tcp_conn_table; itc_flags & TCF_INUSE)) continue; if (tcp_conn->tc_busy) continue; if (tcp_conn->tc_adv_data) { bf_afree(tcp_conn->tc_adv_data); tcp_conn->tc_adv_data= NULL; } } } if (priority == TCP_PRI_CONNwoUSER) { for (i=0, tcp_conn= tcp_conn_table; itc_flags & TCF_INUSE)) continue; if (tcp_conn->tc_busy) continue; if (tcp_conn->tc_fd) continue; if (tcp_conn->tc_state == TCS_CLOSED) continue; if (tcp_conn->tc_rcvd_data == NULL && tcp_conn->tc_send_data == NULL) { continue; } tcp_close_connection (tcp_conn, EOUTOFBUFS); } } if (priority == TCP_PRI_CONN_INUSE) { for (i=0, tcp_conn= tcp_conn_table; itc_flags & TCF_INUSE)) continue; if (tcp_conn->tc_busy) continue; if (tcp_conn->tc_state == TCS_CLOSED) continue; if (tcp_conn->tc_rcvd_data == NULL && tcp_conn->tc_send_data == NULL) { continue; } tcp_close_connection (tcp_conn, EOUTOFBUFS); } } } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void tcp_bufcheck() { int i; tcp_conn_t *tcp_conn; tcp_port_t *tcp_port; for (i= 0, tcp_port= tcp_port_table; itp_pack) bf_check_acc(tcp_port->tp_pack); } for (i= 0, tcp_conn= tcp_conn_table; itc_busy); if (tcp_conn->tc_rcvd_data) bf_check_acc(tcp_conn->tc_rcvd_data); if (tcp_conn->tc_adv_data) bf_check_acc(tcp_conn->tc_adv_data); if (tcp_conn->tc_send_data) bf_check_acc(tcp_conn->tc_send_data); if (tcp_conn->tc_remipopt) bf_check_acc(tcp_conn->tc_remipopt); if (tcp_conn->tc_tcpopt) bf_check_acc(tcp_conn->tc_tcpopt); if (tcp_conn->tc_frag2send) bf_check_acc(tcp_conn->tc_frag2send); } } #endif PUBLIC void tcp_notreach(tcp_conn) tcp_conn_t *tcp_conn; { int new_ttl; new_ttl= tcp_conn->tc_ttl; if (new_ttl == IP_MAX_TTL) { if (tcp_conn->tc_state == TCS_SYN_SENT) tcp_close_connection(tcp_conn, EDSTNOTRCH); return; } else if (new_ttl == TCP_DEF_TTL) new_ttl= TCP_DEF_TTL_NEXT; else { new_ttl *= 2; if (new_ttl> IP_MAX_TTL) new_ttl= IP_MAX_TTL; } tcp_conn->tc_ttl= new_ttl; tcp_conn->tc_stt= 0; tcp_conn->tc_SND_TRM= tcp_conn->tc_SND_UNA; tcp_conn_write(tcp_conn, 1); } /* tcp_setup_conn */ PRIVATE void tcp_setup_conn(tcp_conn) tcp_conn_t *tcp_conn; { assert(!tcp_conn->tc_connInprogress); if (tcp_conn->tc_flags & TCF_INUSE) { assert (tcp_conn->tc_state == TCS_CLOSED); assert (!tcp_conn->tc_send_data); if (tcp_conn->tc_senddis < get_time()) tcp_conn->tc_ISS= 0; } else { assert(!tcp_conn->tc_busy); tcp_conn->tc_senddis= 0; tcp_conn->tc_ISS= 0; tcp_conn->tc_tos= TCP_DEF_TOS; tcp_conn->tc_ttl= TCP_DEF_TTL; tcp_conn->tc_rcv_wnd= TCP_MAX_RCV_WND_SIZE; tcp_conn->tc_fd= NULL; } if (!tcp_conn->tc_ISS) { tcp_conn->tc_ISS= (get_time()/HZ)*ISS_INC_FREQ; } tcp_conn->tc_SND_UNA= tcp_conn->tc_ISS; tcp_conn->tc_SND_TRM= tcp_conn->tc_ISS; tcp_conn->tc_SND_NXT= tcp_conn->tc_ISS+1; tcp_conn->tc_SND_UP= tcp_conn->tc_ISS; tcp_conn->tc_SND_PSH= tcp_conn->tc_ISS; tcp_conn->tc_IRS= 0; tcp_conn->tc_RCV_LO= tcp_conn->tc_IRS; tcp_conn->tc_RCV_NXT= tcp_conn->tc_IRS; tcp_conn->tc_RCV_HI= tcp_conn->tc_IRS; tcp_conn->tc_RCV_UP= tcp_conn->tc_IRS; assert(tcp_conn->tc_rcvd_data == NULL); assert(tcp_conn->tc_adv_data == NULL); assert(tcp_conn->tc_send_data == NULL); tcp_conn->tc_remipopt= NULL; tcp_conn->tc_tcpopt= NULL; assert(tcp_conn->tc_frag2send == NULL); tcp_conn->tc_stt= 0; tcp_conn->tc_rt_dead= TCP_DEF_RT_DEAD; tcp_conn->tc_0wnd_to= 0; tcp_conn->tc_rtt= TCP_DEF_RTT; tcp_conn->tc_mss= TCP_DEF_MSS; tcp_conn->tc_error= NW_OK; tcp_conn->tc_snd_cwnd= tcp_conn->tc_SND_UNA + 2*tcp_conn->tc_mss; tcp_conn->tc_snd_cthresh= TCP_MAX_SND_WND_SIZE; tcp_conn->tc_snd_cinc= (long)TCP_DEF_MSS*TCP_DEF_MSS/TCP_MAX_SND_WND_SIZE+1; tcp_conn->tc_snd_wnd= TCP_MAX_SND_WND_SIZE; tcp_conn->tc_rt_time= 0; tcp_conn->tc_rt_seq= 0; tcp_conn->tc_rt_threshold= tcp_conn->tc_ISS; tcp_conn->tc_flags= TCF_INUSE; clck_untimer(&tcp_conn->tc_transmit_timer); tcp_conn->tc_transmit_seq= 0; } /* * $PchId: tcp.c,v 1.14.2.2 1999/11/17 22:05:27 philip Exp $ */ /* tcp.h Copyright 1995 Philip Homburg */ #ifndef TCP_H #define TCP_H #define ISS_INC_FREQ 250000L #define TCP_MAX_DATAGRAM 8192 #ifndef TCP_MAX_SND_WND_SIZE #define TCP_MAX_SND_WND_SIZE ((CRAMPED ? 4 : 16) * 1024) #endif #ifndef TCP_MIN_RCV_WND_SIZE #define TCP_MIN_RCV_WND_SIZE (4 * 1024) #endif #ifndef TCP_MAX_RCV_WND_SIZE #define TCP_MAX_RCV_WND_SIZE ((CRAMPED ? 4 : 8) * 1024) #endif #define TCP_DEF_TOS 0 #define TCP_DEF_TTL 5 /* hops/seconds */ #define TCP_DEF_TTL_NEXT 30 /* hops/seconds */ /* An established TCP connection times out if no communication is possible * for TCP_DEF_RT_DEAD clock ticks */ #ifndef TCP_DEF_RT_DEAD #define TCP_DEF_RT_DEAD (20L*60*HZ) #endif #define TCP_DEF_RT_MAX_CONNECT (5L*60*HZ) /* 5 minutes in ticks */ #define TCP_DEF_RT_MAX_LISTEN (1L*60*HZ) /* 1 minute in ticks */ #define TCP_DEF_RT_MAX_CLOSING (1L*60*HZ) /* 1 minute in ticks */ /* Minimum and maximum intervals for zero window probes. */ #define TCP_0WND_MIN (HZ) #define TCP_0WND_MAX (5*60*HZ) #define TCP_DEF_RTT 15 /* initial retransmission time in * ticks */ #define TCP_RTT_GRAN 5 /* minimal value of the rtt is * TCP_RTT_GRAN * CLOCK_GRAN */ #define TCP_RTT_MAX (10*HZ) /* The maximum retransmission interval * is TCP_RTT_MAX ticks */ #ifndef TCP_DEF_MSS #define TCP_DEF_MSS 1400 #endif #define TCP_DEF_CONF (NWTC_COPY | NWTC_LP_UNSET | NWTC_UNSET_RA | \ NWTC_UNSET_RP) #define TCP_DEF_OPT (NWTO_NOFLAG) struct acc; void tcp_prep ARGS(( void )); void tcp_init ARGS(( void )); int tcp_open ARGS(( int port, int srfd, get_userdata_t get_userdata, put_userdata_t put_userdata, put_pkt_t put_pkt )); int tcp_read ARGS(( int fd, size_t count)); int tcp_write ARGS(( int fd, size_t count)); int tcp_ioctl ARGS(( int fd, ioreq_t req)); int tcp_cancel ARGS(( int fd, int which_operation )); void tcp_close ARGS(( int fd)); #endif /* TCP_H */ /* * $PchId: tcp.h,v 1.8 1996/05/07 20:51:37 philip Exp $ */ /* tcp_int.h Copyright 1995 Philip Homburg */ #ifndef TCP_INT_H #define TCP_INT_H #define TCP_CONN_HASH_SHIFT 4 #define TCP_CONN_HASH_NR (1 << TCP_CONN_HASH_SHIFT) typedef struct tcp_port { int tp_ipdev; int tp_flags; int tp_state; int tp_ipfd; acc_t *tp_pack; ipaddr_t tp_ipaddr; struct tcp_conn *tp_snd_head; struct tcp_conn *tp_snd_tail; event_t tp_snd_event; struct tcp_conn *tp_conn_hash[TCP_CONN_HASH_NR][4]; } tcp_port_t; #define TPF_EMPTY 0x0 #define TPF_SUSPEND 0x1 #define TPF_READ_IP 0x2 #define TPF_READ_SP 0x4 #define TPF_WRITE_IP 0x8 #define TPF_WRITE_SP 0x10 #define TPF_DELAY_TCP 0x40 #define TPS_EMPTY 0 #define TPS_SETPROTO 1 #define TPS_GETCONF 2 #define TPS_MAIN 3 #define TPS_ERROR 4 typedef struct tcp_fd { int tf_flags; tcp_port_t *tf_port; int tf_srfd; ioreq_t tf_ioreq; nwio_tcpconf_t tf_tcpconf; nwio_tcpopt_t tf_tcpopt; get_userdata_t tf_get_userdata; put_userdata_t tf_put_userdata; struct tcp_conn *tf_conn; size_t tf_write_offset; size_t tf_write_count; size_t tf_read_offset; size_t tf_read_count; } tcp_fd_t; #define TFF_EMPTY 0x0 #define TFF_INUSE 0x1 #define TFF_IOCTL_IP 0x2 #define TFF_CONF_SET 0x4 #define TFF_IOC_INIT_SP 0x8 #define TFF_CONNECT 0x20 #define TFF_WRITE_IP 0x80 #define TFF_WR_URG 0x100 #define TFF_PUSH_DATA 0x200 #define TFF_READ_IP 0x400 #define TFF_RECV_URG 0x800 #define TFF_CONNECTED 0x1000 #define TFF_DEL_RST 0x2000 typedef struct tcp_conn { int tc_flags; int tc_state; int tc_busy; /* do not steal buffer when a counnection is * busy */ tcp_port_t *tc_port; tcp_fd_t *tc_fd; tcpport_t tc_locport; ipaddr_t tc_locaddr; tcpport_t tc_remport; ipaddr_t tc_remaddr; #if 1 int tc_connInprogress; #endif int tc_orglisten; time_t tc_senddis; /* Sending side */ u32_t tc_ISS; /* initial sequence number */ u32_t tc_SND_UNA; /* least unacknowledged sequence number */ u32_t tc_SND_TRM; /* next sequence number to be transmitted */ u32_t tc_SND_NXT; /* next sequence number for new data */ u32_t tc_SND_UP; /* urgent pointer, first sequence number not * urgent */ u32_t tc_SND_PSH; /* push pointer, data should be pushed until * the push pointer is reached */ u32_t tc_snd_cwnd; /* highest sequence number to be sent */ u32_t tc_snd_cthresh; /* threshold for send window */ u32_t tc_snd_cinc; /* increment for send window threshold */ u16_t tc_snd_wnd; /* max send queue size */ /* round trip calculation. */ time_t tc_rt_time; u32_t tc_rt_seq; u32_t tc_rt_threshold; time_t tc_rtt; acc_t *tc_send_data; acc_t *tc_frag2send; struct tcp_conn *tc_send_link; /* Receiving side */ u32_t tc_IRS; u32_t tc_RCV_LO; u32_t tc_RCV_NXT; u32_t tc_RCV_HI; u32_t tc_RCV_UP; u16_t tc_rcv_wnd; acc_t *tc_rcvd_data; acc_t *tc_adv_data; u32_t tc_adv_seq; acc_t *tc_remipopt; acc_t *tc_tcpopt; u8_t tc_tos; u8_t tc_ttl; u16_t tc_mss; struct timer tc_transmit_timer; u32_t tc_transmit_seq; time_t tc_0wnd_to; time_t tc_stt; /* time of first send after last ack */ time_t tc_rt_dead; int tc_error; int tc_inconsistent; } tcp_conn_t; #define TCF_EMPTY 0x0 #define TCF_INUSE 0x1 #define TCF_FIN_RECV 0x2 #define TCF_RCV_PUSH 0x4 #define TCF_MORE2WRITE 0x8 #define TCF_SEND_ACK 0x10 #define TCF_FIN_SENT 0x20 #define TCF_BSD_URG 0x40 #if DEBUG & 0x200 #define TCF_DEBUG 0x1000 #endif #define TCS_CLOSED 0 #define TCS_LISTEN 1 #define TCS_SYN_RECEIVED 2 #define TCS_SYN_SENT 3 #define TCS_ESTABLISHED 4 #define TCS_CLOSING 5 /* tcp_recv.c */ void tcp_frag2conn ARGS(( tcp_conn_t *tcp_conn, ip_hdr_t *ip_hdr, tcp_hdr_t *tcp_hdr, acc_t *tcp_data, size_t data_len )); void tcp_fd_read ARGS(( tcp_conn_t *tcp_conn, int enq )); /* tcp_send.c */ void tcp_conn_write ARGS(( tcp_conn_t *tcp_conn, int enq )); void tcp_release_retrans ARGS(( tcp_conn_t *tcp_conn, u32_t seg_ack, U16_t new_win )); void tcp_set_send_timer ARGS(( tcp_conn_t *tcp_conn )); void tcp_fd_write ARGS(( tcp_conn_t *tcp_conn )); void tcp_close_connection ARGS(( tcp_conn_t *tcp_conn, int error )); void tcp_port_write ARGS(( tcp_port_t *tcp_port )); void tcp_shutdown ARGS(( tcp_conn_t *tcp_conn )); /* tcp_lib.c */ void tcp_extract_ipopt ARGS(( tcp_conn_t *tcp_conn, ip_hdr_t *ip_hdr )); void tcp_extract_tcpopt ARGS(( tcp_conn_t *tcp_conn, tcp_hdr_t *tcp_hdr )); void tcp_get_ipopt ARGS(( tcp_conn_t *tcp_conn, ip_hdropt_t *ip_hdropt )); void tcp_get_tcpopt ARGS(( tcp_conn_t *tcp_conn, tcp_hdropt_t *tcp_hdropt )); acc_t *tcp_make_header ARGS(( tcp_conn_t *tcp_conn, ip_hdr_t **ref_ip_hdr, tcp_hdr_t **ref_tcp_hdr, acc_t *data )); u16_t tcp_pack_oneCsum ARGS(( ip_hdr_t *ip_hdr, acc_t *tcp_pack )); int tcp_check_conn ARGS(( tcp_conn_t *tcp_conn )); void tcp_print_pack ARGS(( ip_hdr_t *ip_hdr, tcp_hdr_t *tcp_hdr )); void tcp_print_state ARGS(( tcp_conn_t *tcp_conn )); void tcp_print_conn ARGS(( tcp_conn_t *tcp_conn )); int tcp_LEmod4G ARGS(( u32_t n1, u32_t n2 )); int tcp_Lmod4G ARGS(( u32_t n1, u32_t n2 )); int tcp_GEmod4G ARGS(( u32_t n1, u32_t n2 )); int tcp_Gmod4G ARGS(( u32_t n1, u32_t n2 )); /* tcp.c */ void tcp_restart_connect ARGS(( tcp_fd_t *tcp_fd )); int tcp_su4listen ARGS(( tcp_fd_t *tcp_fd )); void tcp_reply_ioctl ARGS(( tcp_fd_t *tcp_fd, int reply )); void tcp_reply_write ARGS(( tcp_fd_t *tcp_fd, size_t reply )); void tcp_reply_read ARGS(( tcp_fd_t *tcp_fd, size_t reply )); void tcp_notreach ARGS(( tcp_conn_t *tcp_conn )); #define TCP_FD_NR (10*IP_PORT_MAX) #define TCP_CONN_NR (2*TCP_FD_NR) EXTERN tcp_port_t *tcp_port_table; EXTERN tcp_conn_t tcp_conn_table[TCP_CONN_NR]; EXTERN tcp_fd_t tcp_fd_table[TCP_FD_NR]; #define tcp_Lmod4G(n1,n2) (!!(((n1)-(n2)) & 0x80000000L)) #define tcp_GEmod4G(n1,n2) (!(((n1)-(n2)) & 0x80000000L)) #define tcp_Gmod4G(n1,n2) (!!(((n2)-(n1)) & 0x80000000L)) #define tcp_LEmod4G(n1,n2) (!(((n2)-(n1)) & 0x80000000L)) #endif /* TCP_INT_H */ /* * $PchId: tcp_int.h,v 1.10 1996/05/07 20:51:59 philip Exp $ */ /* tcp_lib.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "io.h" #include "type.h" #include "assert.h" #include "tcp_int.h" THIS_FILE #if you_want_to_be_complete #undef tcp_LEmod4G PUBLIC int tcp_LEmod4G(n1, n2) u32_t n1; u32_t n2; { return !((u32_t)(n2-n1) & 0x80000000L); } #undef tcp_GEmod4G PUBLIC int tcp_GEmod4G(n1, n2) u32_t n1; u32_t n2; { return !((u32_t)(n1-n2) & 0x80000000L); } #undef tcp_Lmod4G PUBLIC int tcp_Lmod4G(n1, n2) u32_t n1; u32_t n2; { return !!((u32_t)(n1-n2) & 0x80000000L); } #undef tcp_Gmod4G PUBLIC int tcp_Gmod4G(n1, n2) u32_t n1; u32_t n2; { return !!((u32_t)(n2-n1) & 0x80000000L); } #endif PUBLIC void tcp_extract_ipopt(tcp_conn, ip_hdr) tcp_conn_t *tcp_conn; ip_hdr_t *ip_hdr; { int ip_hdr_len; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (ip_hdr_len == IP_MIN_HDR_SIZE) return; DBLOCK(1, printf("ip_hdr options NOT supported (yet?)\n")); } PUBLIC void tcp_extract_tcpopt(tcp_conn, tcp_hdr) tcp_conn_t *tcp_conn; tcp_hdr_t *tcp_hdr; { int tcp_hdr_len; tcp_hdr_len= (tcp_hdr->th_data_off & TH_DO_MASK) >> 2; if (tcp_hdr_len == TCP_MIN_HDR_SIZE) return; DBLOCK(2, printf("tcp_hdr options NOT supported (yet?)\n")); } PUBLIC u16_t tcp_pack_oneCsum(ip_hdr, tcp_pack) ip_hdr_t *ip_hdr; acc_t *tcp_pack; { size_t ip_hdr_len; acc_t *pack; u16_t sum; u16_t word_buf[6]; int odd_length; char *data_ptr; int length; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; word_buf[0]= ip_hdr->ih_src & 0xffff; word_buf[1]= (ip_hdr->ih_src >> 16) & 0xffff; word_buf[2]= ip_hdr->ih_dst & 0xffff; word_buf[3]= (ip_hdr->ih_dst >> 16) & 0xffff; word_buf[4]= HTONS(IPPROTO_TCP); word_buf[5]= htons(ntohs(ip_hdr->ih_length)-ip_hdr_len); sum= oneC_sum(0, word_buf, sizeof(word_buf)); pack= tcp_pack; odd_length= 0; for (; pack; pack= pack->acc_next) { data_ptr= ptr2acc_data(pack); length= pack->acc_length; if (!length) continue; sum= oneC_sum (sum, (u16_t *)data_ptr, length); if (length & 1) { odd_length= !odd_length; sum= ((sum >> 8) & 0xff) | ((sum & 0xff) << 8); } } if (odd_length) { /* Undo the last swap */ sum= ((sum >> 8) & 0xff) | ((sum & 0xff) << 8); } return sum; } PUBLIC void tcp_get_ipopt(tcp_conn, ip_hdropt) tcp_conn_t *tcp_conn; ip_hdropt_t *ip_hdropt; { if (!tcp_conn->tc_remipopt) { ip_hdropt->iho_opt_siz= 0; return; } DBLOCK(1, printf("ip_hdr options NOT supported (yet?)\n")); ip_hdropt->iho_opt_siz= 0; return; } PUBLIC void tcp_get_tcpopt(tcp_conn, tcp_hdropt) tcp_conn_t *tcp_conn; tcp_hdropt_t *tcp_hdropt; { int optsiz; if (!tcp_conn->tc_tcpopt) { tcp_hdropt->tho_opt_siz= 0; return; } tcp_conn->tc_tcpopt= bf_pack(tcp_conn->tc_tcpopt); optsiz= bf_bufsize(tcp_conn->tc_tcpopt); memcpy(tcp_hdropt->tho_data, ptr2acc_data(tcp_conn->tc_tcpopt), optsiz); if ((optsiz & 3) != 0) { tcp_hdropt->tho_data[optsiz]= TCP_OPT_EOL; optsiz= (optsiz+3) & ~3; } tcp_hdropt->tho_opt_siz= optsiz; return; } PUBLIC acc_t *tcp_make_header(tcp_conn, ref_ip_hdr, ref_tcp_hdr, data) tcp_conn_t *tcp_conn; ip_hdr_t **ref_ip_hdr; tcp_hdr_t **ref_tcp_hdr; acc_t *data; { ip_hdropt_t ip_hdropt; tcp_hdropt_t tcp_hdropt; ip_hdr_t *ip_hdr; tcp_hdr_t *tcp_hdr; acc_t *hdr_acc; char *ptr2hdr; int closed_connection; closed_connection= (tcp_conn->tc_state == TCS_CLOSED); if (tcp_conn->tc_remipopt || tcp_conn->tc_tcpopt) { tcp_get_ipopt (tcp_conn, &ip_hdropt); tcp_get_tcpopt (tcp_conn, &tcp_hdropt); assert (!(ip_hdropt.iho_opt_siz & 3)); assert (!(tcp_hdropt.tho_opt_siz & 3)); hdr_acc= bf_memreq(IP_MIN_HDR_SIZE+ ip_hdropt.iho_opt_siz+TCP_MIN_HDR_SIZE+ tcp_hdropt.tho_opt_siz); ptr2hdr= ptr2acc_data(hdr_acc); ip_hdr= (ip_hdr_t *)ptr2hdr; ptr2hdr += IP_MIN_HDR_SIZE; if (ip_hdropt.iho_opt_siz) { memcpy(ptr2hdr, (char *)ip_hdropt.iho_data, ip_hdropt.iho_opt_siz); } ptr2hdr += ip_hdropt.iho_opt_siz; tcp_hdr= (tcp_hdr_t *)ptr2hdr; ptr2hdr += TCP_MIN_HDR_SIZE; if (tcp_hdropt.tho_opt_siz) { memcpy (ptr2hdr, (char *)tcp_hdropt.tho_data, tcp_hdropt.tho_opt_siz); } hdr_acc->acc_next= data; ip_hdr->ih_vers_ihl= (IP_MIN_HDR_SIZE+ ip_hdropt.iho_opt_siz) >> 2; tcp_hdr->th_data_off= (TCP_MIN_HDR_SIZE+ tcp_hdropt.tho_opt_siz) << 2; } else { hdr_acc= bf_memreq(IP_MIN_HDR_SIZE+TCP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(hdr_acc); tcp_hdr= (tcp_hdr_t *)&ip_hdr[1]; hdr_acc->acc_next= data; ip_hdr->ih_vers_ihl= IP_MIN_HDR_SIZE >> 2; tcp_hdr->th_data_off= TCP_MIN_HDR_SIZE << 2; } if (!closed_connection && (tcp_conn->tc_state == TCS_CLOSED)) { DBLOCK(1, printf("connection closed while inuse\n")); bf_afree(hdr_acc); return 0; } ip_hdr->ih_tos= tcp_conn->tc_tos; ip_hdr->ih_ttl= tcp_conn->tc_ttl; ip_hdr->ih_proto= IPPROTO_TCP; ip_hdr->ih_src= tcp_conn->tc_locaddr; ip_hdr->ih_dst= tcp_conn->tc_remaddr; ip_hdr->ih_flags_fragoff= 0; tcp_hdr->th_srcport= tcp_conn->tc_locport; tcp_hdr->th_dstport= tcp_conn->tc_remport; tcp_hdr->th_seq_nr= tcp_conn->tc_RCV_NXT; tcp_hdr->th_flags= 0; tcp_hdr->th_window= htons(tcp_conn->tc_RCV_HI-tcp_conn->tc_RCV_LO); tcp_hdr->th_chksum= 0; *ref_ip_hdr= ip_hdr; *ref_tcp_hdr= tcp_hdr; return hdr_acc; } #if !CRAMPED PUBLIC void tcp_print_state (tcp_conn) tcp_conn_t *tcp_conn; { printf("tcp_conn_table[%d]->tc_state= ", tcp_conn- tcp_conn_table); if (!(tcp_conn->tc_flags & TCF_INUSE)) { printf("not inuse\n"); return; } switch (tcp_conn->tc_state) { case TCS_CLOSED: printf("CLOSED"); break; case TCS_LISTEN: printf("LISTEN"); break; case TCS_SYN_RECEIVED: printf("SYN_RECEIVED"); break; case TCS_SYN_SENT: printf("SYN_SENT"); break; case TCS_ESTABLISHED: printf("ESTABLISHED"); break; case TCS_CLOSING: printf("CLOSING"); break; default: printf("unknown (=%d)", tcp_conn->tc_state); break; } } #endif PUBLIC int tcp_check_conn(tcp_conn) tcp_conn_t *tcp_conn; { int allright; u32_t lo_queue, hi_queue; int size; allright= TRUE; if (tcp_conn->tc_inconsistent) { assert(tcp_conn->tc_inconsistent == 1); #if !CRAMPED printf("tcp_check_conn: connection is inconsistent\n"); #endif return allright; } /* checking receive queue */ lo_queue= tcp_conn->tc_RCV_LO; if (lo_queue == tcp_conn->tc_IRS) lo_queue++; if (lo_queue == tcp_conn->tc_RCV_NXT && (tcp_conn->tc_flags & TCF_FIN_RECV)) lo_queue--; hi_queue= tcp_conn->tc_RCV_NXT; if (hi_queue == tcp_conn->tc_IRS) hi_queue++; if (tcp_conn->tc_flags & TCF_FIN_RECV) hi_queue--; size= hi_queue-lo_queue; if (size<0) { #if !CRAMPED printf("rcv hi_queue-lo_queue < 0\n"); printf("SND_NXT= 0x%x, SND_UNA= 0x%x\n", tcp_conn->tc_SND_NXT, tcp_conn->tc_SND_UNA); printf("lo_queue= 0x%x, hi_queue= 0x%x\n", lo_queue, hi_queue); printf("size= %d\n", size); #endif allright= FALSE; } else if (!tcp_conn->tc_rcvd_data) { if (size) { #if !CRAMPED printf("RCV_NXT-RCV_LO != 0\n"); tcp_print_conn(tcp_conn); printf("lo_queue= %lu, hi_queue= %lu\n", lo_queue, hi_queue); #endif allright= FALSE; } } else if (size != bf_bufsize(tcp_conn->tc_rcvd_data)) { #if !CRAMPED printf("RCV_NXT-RCV_LO != sizeof tc_rcvd_data\n"); tcp_print_conn(tcp_conn); printf( "lo_queue= %lu, hi_queue= %lu, sizeof tc_rcvd_data= %d\n", lo_queue, hi_queue, bf_bufsize(tcp_conn->tc_rcvd_data)); #endif allright= FALSE; } else if (size != 0 && (tcp_conn->tc_state == TCS_CLOSED || tcp_conn->tc_state == TCS_LISTEN || tcp_conn->tc_state == TCS_SYN_RECEIVED || tcp_conn->tc_state == TCS_SYN_SENT)) { #if !CRAMPED printf("received data but not connected\n"); tcp_print_conn(tcp_conn); #endif allright= FALSE; } if (tcp_Lmod4G(tcp_conn->tc_RCV_HI, tcp_conn->tc_RCV_NXT)) { #if !CRAMPED printf("tc_RCV_HI (%d) < tc_RCV_NXT (%d)\n", tcp_conn->tc_RCV_HI, tcp_conn->tc_RCV_NXT); #endif allright= FALSE; } /* checking send data */ lo_queue= tcp_conn->tc_SND_UNA; if (lo_queue == tcp_conn->tc_ISS) lo_queue++; if (lo_queue == tcp_conn->tc_SND_NXT && (tcp_conn->tc_flags & TCF_FIN_SENT)) { lo_queue--; } hi_queue= tcp_conn->tc_SND_NXT; if (hi_queue == tcp))))))_conn->tc_ISS) hi_queue++; if (tcp_conn->tc_flags & TCF_FIN_SENT) hi_queue--; size= hi_queue-lo_queue; if (size<0) { #if !CRAMPED printf("snd hi_queue-lo_queue < 0\n"); printf("SND_ISS= 0x%x, SND_UNA= 0x%x, SND_NXT= 0x%x\n", tcp_conn->tc_ISS, tcp_conn->tc_SND_UNA, tcp_conn->tc_SND_NXT); printf("hi_queue= 0x%x, lo_queue= 0x%x, size= %d\n", hi_queue, lo_queue, size); #endif allright= FALSE; } else if (!tcp_conn->tc_send_data) { if (size) { #if !CRAMPED printf("SND_NXT-SND_UNA != 0\n"); printf("SND_NXT= %d, SND_UNA= %d\n", tcp_conn->tc_SND_NXT, tcp_conn->tc_SND_UNA); printf("lo_queue= %d, hi_queue= %d\n", lo_queue, hi_queue); #endif allright= FALSE; } } else if (size != bf_bufsize(tcp_conn->tc_send_data)) { #if !CRAMPED printf("SND_NXT-SND_UNA != sizeof tc_send_data\n"); printf("SND_NXT= %d, SND_UNA= %d\n", tcp_conn->tc_SND_NXT, tcp_conn->tc_SND_UNA); printf("lo_queue= %d, lo_queue= %d\n", lo_queue, hi_queue); printf("bf_bufsize(data)= %d\n", bf_bufsize(tcp_conn->tc_send_data)); #endif allright= FALSE; } /* checking counters */ if (!tcp_GEmod4G(tcp_conn->tc_SND_UNA, tcp_conn->tc_ISS)) { #if !CRAMPED printf("SND_UNA < ISS\n"); #endif allright= FALSE; } if (!tcp_GEmod4G(tcp_conn->tc_SND_NXT, tcp_conn->tc_SND_UNA)) { #if !CRAMPED printf("SND_NXTtc_SND_TRM, tcp_conn->tc_SND_UNA)) { #if !CRAMPED printf("SND_TRMtc_SND_NXT, tcp_conn->tc_SND_TRM)) { #if !CRAMPED printf("SND_NXTih_src); else printf("???"); printf(",%u ", ntohs(tcp_hdr->th_srcport)); if (ip_hdr) writeIpAddr(ip_hdr->ih_dst); else printf("???"); printf(",%u ", ntohs(tcp_hdr->th_dstport)); printf(" 0x%lx", ntohl(tcp_hdr->th_seq_nr)); if (tcp_hdr->th_flags & THF_FIN) printf(" "); if (tcp_hdr->th_flags & THF_SYN) printf(" "); if (tcp_hdr->th_flags & THF_RST) printf(" "); if (tcp_hdr->th_flags & THF_PSH) printf(" "); if (tcp_hdr->th_flags & THF_ACK) printf(" ", ntohl(tcp_hdr->th_ack_nr), ntohs(tcp_hdr->th_window)); if (tcp_hdr->th_flags & THF_URG) printf(" ", tcp_hdr->th_urgptr); tcp_hdr_len= (tcp_hdr->th_data_off & TH_DO_MASK) >> 2; if (tcp_hdr_len != TCP_MIN_HDR_SIZE) printf(" ", tcp_hdr_len-TCP_MIN_HDR_SIZE); } #endif #if !CRAMPED PUBLIC void tcp_print_conn(tcp_conn) tcp_conn_t *tcp_conn; { int iss, irs; iss= tcp_conn->tc_ISS; irs= tcp_conn->tc_IRS; tcp_print_state (tcp_conn); printf( " ISS 0x%lx UNA +0x%lx(0x%lx) TRM +0x%lx(0x%lx) NXT +0x%lx(0x%lx)", iss, tcp_conn->tc_SND_UNA-iss, tcp_conn->tc_SND_UNA, tcp_conn->tc_SND_TRM-iss, tcp_conn->tc_SND_TRM, tcp_conn->tc_SND_NXT-iss, tcp_conn->tc_SND_NXT); printf(" snd_cwnd +0x%lx(0x%lx)", tcp_conn->tc_snd_cwnd-tcp_conn->tc_SND_UNA, tcp_conn->tc_snd_cwnd); printf(" transmit_seq "); if (tcp_conn->tc_transmit_seq == 0) printf("0"); else { printf("+0x%lx(0x%lx)", tcp_conn->tc_transmit_seq-iss, tcp_conn->tc_transmit_seq); } printf(" IRS 0x%lx LO +0x%x(0x%lx) NXT +0x%x(0x%lx) HI +0x%x(0x%lx)", irs, tcp_conn->tc_RCV_LO-irs, tcp_conn->tc_RCV_LO, tcp_conn->tc_RCV_NXT-irs, tcp_conn->tc_RCV_NXT, tcp_conn->tc_RCV_HI-irs, tcp_conn->tc_RCV_HI); if (tcp_conn->tc_flags & TCF_INUSE) printf(" TCF_INUSE"); if (tcp_conn->tc_flags & TCF_FIN_RECV) printf(" TCF_FIN_RECV"); if (tcp_conn->tc_flags & TCF_RCV_PUSH) printf(" TCF_RCV_PUSH"); if (tcp_conn->tc_flags & TCF_MORE2WRITE) printf(" TCF_MORE2WRITE"); if (tcp_conn->tc_flags & TCF_SEND_ACK) printf(" TCF_SEND_ACK"); if (tcp_conn->tc_flags & TCF_FIN_SENT) printf(" TCF_FIN_SENT"); } #endif /* * $PchId: tcp_lib.c,v 1.7 1995/11/21 06:45:27 philip Exp $ */ /* tcp_recv.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "type.h" #include "io.h" #include "tcp_int.h" #include "tcp.h" #include "assert.h" THIS_FILE FORWARD void create_RST ARGS(( tcp_conn_t *tcp_conn, ip_hdr_t *ip_hdr, tcp_hdr_t *tcp_hdr, int data_len )); FORWARD void process_data ARGS(( tcp_conn_t *tcp_conn, tcp_hdr_t *tcp_hdr, acc_t *tcp_data, int data_len )); FORWARD void process_advanced_data ARGS(( tcp_conn_t *tcp_conn, tcp_hdr_t *tcp_hdr, acc_t *tcp_data, int data_len )); PUBLIC void tcp_frag2conn(tcp_conn, ip_hdr, tcp_hdr, tcp_data, data_len) tcp_conn_t *tcp_conn; ip_hdr_t *ip_hdr; tcp_hdr_t *tcp_hdr; acc_t *tcp_data; size_t data_len; { tcp_fd_t *connuser; int tcp_hdr_flags; int ip_hdr_len, tcp_hdr_len; u32_t seg_ack, seg_seq, rcv_hi; u16_t seg_wnd; int acceptable_ACK, segm_acceptable; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; tcp_hdr_len= (tcp_hdr->th_data_off & TH_DO_MASK) >> 2; tcp_hdr_flags= tcp_hdr->th_flags & TH_FLAGS_MASK; seg_ack= ntohl(tcp_hdr->th_ack_nr); seg_seq= ntohl(tcp_hdr->th_seq_nr); seg_wnd= ntohs(tcp_hdr->th_window); switch (tcp_conn->tc_state) { case TCS_CLOSED: /* CLOSED: discard all data. !RST ? ACK ? exit : exit : discard packet exit */ if (!(tcp_hdr_flags & THF_RST)) { create_RST(tcp_conn, ip_hdr, tcp_hdr, data_len); tcp_conn_write(tcp_conn, 1); } break; case TCS_LISTEN: /* LISTEN: RST ? discard packet exit ACK ? exit SYN ? BUG: no security check RCV.NXT= SEG.SEQ+1 IRS= SEG.SEQ ISS should already be selected SND.NXT=ISS+1 SND.UNA=ISS state= SYN-RECEIVED exit : shouldnot occur discard packet exit */ if (tcp_hdr_flags & THF_RST) break; if (tcp_hdr_flags & THF_ACK) { create_RST (tcp_conn, ip_hdr, tcp_hdr, data_len); tcp_conn_write(tcp_conn, 1); break; } if (tcp_hdr_flags & THF_SYN) { tcp_extract_ipopt(tcp_conn, ip_hdr); tcp_extract_tcpopt(tcp_conn, tcp_hdr); tcp_conn->tc_RCV_LO= seg_seq+1; tcp_conn->tc_RCV_NXT= seg_seq+1; tcp_conn->tc_RCV_HI= tcp_conn->tc_RCV_LO+ tcp_conn->tc_rcv_wnd; tcp_conn->tc_RCV_UP= seg_seq; tcp_conn->tc_IRS= seg_seq; tcp_conn->tc_SND_UNA= tcp_conn->tc_ISS; tcp_conn->tc_SND_TRM= tcp_conn->tc_ISS; tcp_conn->tc_SND_NXT= tcp_conn->tc_ISS+1; tcp_conn->tc_SND_UP= tcp_conn->tc_ISS-1; tcp_conn->tc_SND_PSH= tcp_conn->tc_ISS-1; tcp_conn->tc_state= TCS_SYN_RECEIVED; tcp_conn->tc_stt= 0; assert (tcp_check_conn(tcp_conn)); tcp_conn->tc_locaddr= ip_hdr->ih_dst; tcp_conn->tc_locport= tcp_hdr->th_dstport; tcp_conn->tc_remaddr= ip_hdr->ih_src; tcp_conn->tc_remport= tcp_hdr->th_srcport; tcp_conn_write(tcp_conn, 1); DIFBLOCK(0x10, seg_seq == 0, printf("warning got 0 IRS from "); writeIpAddr(tcp_conn->tc_remaddr); printf("\n")); /* Start the timer (if necessary) */ tcp_set_send_timer(tcp_conn); break; } /* do nothing */ break; case TCS_SYN_SENT: /* SYN-SENT: ACK ? SEG.ACK <= ISS || SEG.ACK > SND.NXT ? RST ? discard packet exit : exit SND.UNA <= SEG.ACK && SEG.ACK <= SND.NXT ? ACK is acceptable : ACK is !acceptable : ACK is !acceptable RST ? ACK acceptable ? discard segment state= CLOSED error "connection refused" exit : discard packet exit BUG: no security check SYN ? IRS= SEG.SEQ RCV.NXT= IRS+1 ACK ? SND.UNA= SEG.ACK SND.UNA > ISS ? state= ESTABLISHED process ev. URG and text exit : state= SYN-RECEIVED SND.WND= SEG.WND SND.WL1= SEG.SEQ SND.WL2= SEG.ACK exit : discard segment exit */ if (tcp_hdr_flags & THF_ACK) { if (tcp_LEmod4G(seg_ack, tcp_conn->tc_ISS) || tcp_Gmod4G(seg_ack, tcp_conn->tc_SND_NXT)) if (tcp_hdr_flags & THF_RST) break; else { create_RST (tcp_conn, ip_hdr, tcp_hdr, data_len); tcp_conn_write(tcp_conn, 1); break; } acceptable_ACK= (tcp_LEmod4G(tcp_conn->tc_SND_UNA, seg_ack) && tcp_LEmod4G(seg_ack, tcp_conn->tc_SND_NXT)); } else acceptable_ACK= FALSE; if (tcp_hdr_flags & THF_RST) { if (acceptable_ACK) { DBLOCK(1, printf( "calling tcp_close_connection\n")); tcp_close_connection(tcp_conn, ECONNREFUSED); } break; } if (tcp_hdr_flags & THF_SYN) { tcp_conn->tc_RCV_LO= seg_seq+1; tcp_conn->tc_RCV_NXT= seg_seq+1; tcp_conn->tc_RCV_HI= tcp_conn->tc_RCV_LO + tcp_conn->tc_rcv_wnd; tcp_conn->tc_RCV_UP= seg_seq; tcp_conn->tc_IRS= seg_seq; if (tcp_hdr_flags & THF_ACK) tcp_conn->tc_SND_UNA= seg_ack; if (tcp_Gmod4G(tcp_conn->tc_SND_UNA, tcp_conn->tc_ISS)) { tcp_conn->tc_state= TCS_ESTABLISHED; tcp_conn->tc_rt_dead= TCP_DEF_RT_DEAD; assert (tcp_check_conn(tcp_conn)); assert(tcp_conn->tc_connInprogress); tcp_restart_connect(tcp_conn->tc_fd); tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); if (data_len != 0) { tcp_frag2conn(tcp_conn, ip_hdr, tcp_hdr, tcp_data, data_len); /* tcp_data is already freed */ return; } break; } tcp_conn->tc_state= TCS_SYN_RECEIVED; assert (tcp_check_conn(tcp_conn)); tcp_conn->tc_SND_TRM= tcp_conn->tc_ISS; tcp_conn_write(tcp_conn, 1); } break; case TCS_SYN_RECEIVED: /* SYN-RECEIVED: test if segment is acceptable: Segment Receive Test Length Window 0 0 SEG.SEQ == RCV.NXT 0 >0 RCV.NXT <= SEG.SEQ && SEG.SEQ < RCV.NXT+RCV.WND >0 0 not acceptable >0 >0 (RCV.NXT <= SEG.SEQ && SEG.SEQ < RCV.NXT+RCV.WND) || (RCV.NXT <= SEG.SEQ+SEG.LEN-1 && SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND) for urgent data: use RCV.WND+1 for RCV.WND */ rcv_hi= tcp_conn->tc_RCV_HI; if (tcp_hdr_flags & THF_URG) rcv_hi++; if (!data_len) { if (rcv_hi == tcp_conn->tc_RCV_NXT) segm_acceptable= (seg_seq == rcv_hi); else { assert (tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)); segm_acceptable= (tcp_LEmod4G(tcp_conn-> tc_RCV_NXT, seg_seq) && tcp_Lmod4G(seg_seq, rcv_hi)); } } else { if (tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)) { segm_acceptable= (tcp_LEmod4G(tcp_conn-> tc_RCV_NXT, seg_seq) && tcp_Lmod4G(seg_seq, rcv_hi)) || (tcp_LEmod4G(tcp_conn->tc_RCV_NXT, seg_seq+data_len-1) && tcp_Lmod4G(seg_seq+data_len-1, rcv_hi)); } else { segm_acceptable= FALSE; } } /* !segment acceptable ? RST ? discard packet exit : exit */ if (!segm_acceptable) { if (!(tcp_hdr_flags & THF_RST)) { tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); } break; } /* RST ? initiated by a LISTEN ? state= LISTEN exit : state= CLOSED error "connection refused" exit */ if (tcp_hdr_flags & THF_RST) { if (tcp_conn->tc_orglisten) { connuser= tcp_conn->tc_fd; tcp_conn->tc_connInprogress= 0; tcp_conn->tc_fd= NULL; tcp_close_connection (tcp_conn, ECONNREFUSED); if (connuser) (void)tcp_su4listen(connuser); break; } else { tcp_close_connection(tcp_conn, ECONNREFUSED); break; } } /* SYN in window ? initiated by a LISTEN ? state= LISTEN exit : state= CLOSED error "connection reset" exit */ if ((tcp_hdr_flags & THF_SYN) && tcp_GEmod4G(seg_seq, tcp_conn->tc_RCV_NXT)) { if (tcp_conn->tc_orglisten) { connuser= tcp_conn->tc_fd; tcp_conn->tc_connInprogress= 0; tcp_conn->tc_fd= NULL; tcp_close_connection(tcp_conn, ECONNRESET); if (connuser) (void)tcp_su4listen(connuser); break; } tcp_close_connection(tcp_conn, ECONNRESET); break; } /* !ACK ? discard packet exit */ if (!(tcp_hdr_flags & THF_ACK)) break; /* SND.UNA < SEG.ACK <= SND.NXT ? state= ESTABLISHED : exit */ if (tcp_Lmod4G(tcp_conn->tc_S)))))))))))))))))))))ND_UNA, seg_ack) && tcp_LEmod4G(seg_ack, tcp_conn->tc_SND_NXT)) { tcp_conn->tc_state= TCS_ESTABLISHED; tcp_conn->tc_rt_dead= TCP_DEF_RT_DEAD; tcp_release_retrans(tcp_conn, seg_ack, seg_wnd); assert (tcp_check_conn(tcp_conn)); assert(tcp_conn->tc_connInprogress); tcp_restart_connect(tcp_conn->tc_fd); tcp_frag2conn(tcp_conn, ip_hdr, tcp_hdr, tcp_data, data_len); /* tcp_data is already freed */ return; } else { create_RST (tcp_conn, ip_hdr, tcp_hdr, data_len); tcp_conn_write(tcp_conn, 1); break; } break; case TCS_ESTABLISHED: case TCS_CLOSING: /* ESTABLISHED: FIN-WAIT-1: FIN-WAIT-2: CLOSE-WAIT: CLOSING: LAST-ACK: TIME-WAIT: test if segment is acceptable: Segment Receive Test Length Window 0 0 SEG.SEQ == RCV.NXT 0 >0 RCV.NXT <= SEG.SEQ && SEG.SEQ < RCV.NXT+RCV.WND >0 0 not acceptable >0 >0 (RCV.NXT <= SEG.SEQ && SEG.SEQ < RCV.NXT+RCV.WND) || (RCV.NXT <= SEG.SEQ+SEG.LEN-1 && SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND) for urgent data: use RCV.WND+1 for RCV.WND */ rcv_hi= tcp_conn->tc_RCV_HI; if (tcp_hdr_flags & THF_URG) rcv_hi++; if (!data_len) { if (rcv_hi == tcp_conn->tc_RCV_NXT) segm_acceptable= (seg_seq == rcv_hi); else { assert (tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)); segm_acceptable= (tcp_LEmod4G(tcp_conn-> tc_RCV_NXT, seg_seq) && tcp_Lmod4G(seg_seq, rcv_hi)); } } else { if (tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)) { segm_acceptable= (tcp_LEmod4G(tcp_conn-> tc_RCV_NXT, seg_seq) && tcp_Lmod4G(seg_seq, rcv_hi)) || (tcp_LEmod4G(tcp_conn->tc_RCV_NXT, seg_seq+data_len-1) && tcp_Lmod4G(seg_seq+data_len-1, rcv_hi)); } else { segm_acceptable= FALSE; } } /* !segment acceptable ? RST ? discard packet exit : exit */ if (!segm_acceptable) { if (!(tcp_hdr_flags & THF_RST)) { DBLOCK(0x20, printf("segment is not acceptable\n"); printf("\t"); tcp_print_pack(ip_hdr, tcp_hdr); printf("\n\t"); tcp_print_conn(tcp_conn); printf("\n")); tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); /* Sometimes, a retransmission sets the PSH * flag (Solaris 2.4) */ if (tcp_conn->tc_rcvd_data != NULL && (tcp_hdr_flags & THF_PSH)) { tcp_conn->tc_flags |= TCF_RCV_PUSH; if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) { tcp_fd_read(tcp_conn, 1); } } } break; } /* RST ? state == CLOSING || state == LAST-ACK || state == TIME-WAIT ? state= CLOSED exit : state= CLOSED error "connection reset" exit */ if (tcp_hdr_flags & THF_RST) { if ((tcp_conn->tc_flags & (TCF_FIN_SENT|TCF_FIN_RECV)) == (TCF_FIN_SENT|TCF_FIN_RECV) && tcp_conn->tc_send_data == NULL) { /* Clean shutdown, but the other side * doesn't want to ACK our FIN. */ tcp_close_connection (tcp_conn, 0); } else tcp_close_connection(tcp_conn, ECONNRESET); break; } /* SYN in window ? state= CLOSED error "connection reset" exit */ if ((tcp_hdr_flags & THF_SYN) && tcp_GEmod4G(seg_seq, tcp_conn->tc_RCV_NXT)) { tcp_close_connection(tcp_conn, ECONNRESET); break; } /* !ACK ? discard packet exit */ if (!(tcp_hdr_flags & THF_ACK)) break; /* SND.UNA < SEG.ACK <= SND.NXT ? SND.UNA= SEG.ACK reply "send ok" SND.WL1 < SEG.SEQ || (SND.WL1 == SEG.SEQ && SND.WL2 <= SEG.ACK ? SND.WND= SEG.WND SND.Wl1= SEG.SEQ SND.WL2= SEG.ACK SEG.ACK <= SND.UNA ? ignore ACK SEG.ACK > SND.NXT ? discard packet exit */ /* Always reset the send timer after a valid ack is * received. The assumption is that either the ack really * acknowledges some data (normal case), contains a zero * window, or the remote host has another reason not * to accept any data. In all cases, the remote host is * alive, so the connection should stay alive too. * Do not reset stt if the state is CLOSING, i.e. if * the user closed the connection and we still have * some data to deliver. We don't want a zero window * to keep us from closing the connection. */ if (tcp_conn->tc_state != TCS_CLOSING) tcp_conn->tc_stt= 0; if (seg_ack == tcp_conn->tc_SND_UNA) { /* This ACK doesn't acknowledge any new data, this * is a likely situation if we are only receiving * data. We only update the window if we are * actually sending or if we currently have a * zero window. */ if (tcp_conn->tc_snd_cwnd == tcp_conn->tc_SND_UNA && seg_wnd != 0) { DBLOCK(2, printf("zero window opened\n")); /* The other side opened up its receive * window. */ if (seg_wnd > 2*tcp_conn->tc_mss) seg_wnd= 2*tcp_conn->tc_mss; tcp_conn->tc_snd_cwnd= tcp_conn->tc_SND_UNA+seg_wnd; tcp_conn_write(tcp_conn, 1); } if (seg_wnd == 0) { tcp_conn->tc_snd_cwnd= tcp_conn->tc_SND_TRM= tcp_conn->tc_SND_UNA; } } else if (tcp_Lmod4G(tcp_conn->tc_SND_UNA, seg_ack) && tcp_LEmod4G(seg_ack, tcp_conn-> tc_SND_NXT)) { tcp_release_retrans(tcp_conn, seg_ack, seg_wnd); if (tcp_conn->tc_state == TCS_CLOSED) break; } else if (tcp_Gmod4G(seg_ack, tcp_conn->tc_SND_NXT)) { tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); DBLOCK(1, printf( "got an ack of something I haven't send\n"); printf( "seg_ack= %lu, SND_NXT= %lu\n", seg_ack, tcp_conn->tc_SND_NXT)); break; } /* process data... */ tcp_extract_ipopt(tcp_conn, ip_hdr); tcp_extract_tcpopt(tcp_conn, tcp_hdr); if (data_len) { if (tcp_LEmod4G(seg_seq, tcp_conn->tc_RCV_NXT)) { process_data (tcp_conn, tcp_hdr, tcp_data, data_len); } else { process_advanced_data (tcp_conn, tcp_hdr, tcp_data, data_len); } tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); /* Don't process a FIN if we got new data */ break; } /* FIN ? reply pending receives advace RCV.NXT over the FIN state == ESTABLISHED ? state= CLOSE-WAIT state == FIN-WAIT-1 ? state= CLOSING state == FIN-WAIT-2 ? state= TIME-WAIT state == TIME-WAIT ? restart the TIME-WAIT timer exit */ if ((tcp_hdr_flags & THF_FIN) && tcp_LEmod4G(seg_seq, tcp_conn->tc_RCV_NXT)) { if (!(tcp_conn->tc_flags & TCF_FIN_RECV) && tcp_Lmod4G(tcp_conn->tc_RCV_NXT, tcp_conn->tc_RCV_HI)) { tcp_conn->tc_RCV_NXT++; tcp_conn->tc_flags |= TCF_FIN_RECV; } tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) { tcp_fd_read(tcp_conn, 1); } } break; default: #if !CRAMPED printf("tcp_frag2conn: unknown state "); tcp_print_state(tcp_conn); #endif break; } if (tcp_data != NULL) bf_afree(tcp_data); } PRIVATE void process_data(tcp_conn, tcp_hdr, tcp_data, data_len) tcp_conn_t *tcp_conn; tcp_hdr_t *tcp_hdr; acc_t *tcp_data; int data_len; { u32_t lo_seq, hi_seq, urg_seq, seq_nr, adv_seq, nxt; u16_t urgptr; int tcp_hdr_flags; unsigned int offset; acc_t *tmp_data, *rcvd_data, *adv_data; int len_diff; assert(tcp_conn->tc_busy); /* Note, tcp_data will be freed by the caller. */ assert (!(tcp_hdr->th_flags & THF_SYN)); seq_nr= ntohl(tcp_hdr->th_seq_nr); urgptr= ntohs(tcp_hdr->th_urgptr); tcp_data->acc_linkC++; lo_seq= seq_nr; tcp_hdr_flags= tcp_hdr->th_flags & TH_FLAGS_MASK; if (tcp_hdr_flags & THF_URG) { if (urgptr > data_len) urgptr= data_len; urg_seq= lo_seq+ urgptr; if (tcp_GEmod4G(urg_seq, tcp_conn->tc_RCV_HI)) urg_seq= tcp_conn->tc_RCV_HI; if (tcp_conn->tc_flags & TCF_BSD_URG) { if (tcp_Gmod4G(tcp_conn->tc_RCV_NXT, tcp_conn->tc_RCV_LO)) { DBLOCK(1, printf( "ignoring urgent data\n")); bf_afree(tcp_data); /* Should set advertised window to * zero */ /* Flush */ tcp_conn->tc_flags |= TCF_RCV_PUSH; if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) { tcp_fd_read(tcp_conn, 1); } return; } } if (tcp_Gmod4G(urg_seq, tcp_conn->tc_RCV_UP)) tcp_conn->tc_RCV_UP= urg_seq; if (urgptr < data_len) { data_len= urgptr; tmp_data= bf_cut(tcp_data, 0, data_len); bf_afree(tcp_data); tcp_data= tmp_data; tcp_hdr_flags &= ~THF_FIN; } tcp_conn->tc_flags |= TCF_RCV_PUSH; } else { /* Normal data. */ } if (tcp_hdr_flags & THF_PSH) { tcp_conn->tc_flags |= TCF_RCV_PUSH; } if (tcp_Lmod4G(lo_seq, tcp_conn->tc_RCV_NXT)) { DBLOCK(0x10, printf("segment is a retransmission\n")); offset= tcp_conn->tc_RCV_NXT-lo_seq; tcp_data= bf_delhead(tcp_data, offset); lo_seq += offset; data_len -= offset; } assert (lo_seq == tcp_conn->tc_RCV_NXT); hi_seq= lo_seq+data_len; if (tcp_Gmod4G(hi_seq, tcp_conn->tc_RCV_HI)) { data_len= tcp_conn->tc_RCV_HI-lo_seq; tmp_data= bf_cut(tcp_data, 0, data_len); bf_afree(tcp_data); tcp_data= tmp_data; hi_seq= lo_seq+data_len; tcp_hdr_flags &= ~THF_FIN; } assert (tcp_LEmod4G (hi_seq, tcp_conn->tc_RCV_HI)); rcvd_data= tcp_conn->tc_rcvd_data; tcp_conn->tc_rcvd_data= 0; tmp_data= bf_append(rcvd_data, tcp_data); tcp_conn->tc_rcvd_data= tmp_data; tcp_conn->tc_RCV_NXT= hi_seq; if ((tcp_hdr_flags & THF_FIN) && tcp_Lmod4G(tcp_conn->tc_RCV_NXT, tcp_conn->tc_RCV_HI) && !(tcp_conn->tc_flags & TCF_FIN_RECV)) { tcp_conn->tc_RCV_NXT++; tcp_conn->tc_flags |= TCF_FIN_RECV; } if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) tcp_fd_read(tcp_conn, 1); DIFBLOCK(2, (tcp_conn->tc_RCV_NXT == tcp_conn->tc_RCV_HI), printf("conn[[%d] full receive buffer\n", tcp_conn-tcp_conn_table)); if (tcp_conn->tc_adv_data == NULL) return; if (tcp_hdr_flags & THF_FIN) { #if !CRAMPED printf("conn[%d]: advanced data after FIN\n", tcp_conn-tcp_conn_table); #endif tcp_data= tcp_conn->tc_adv_data; tcp_conn->tc_adv_data= NULL; bf_afree(tcp_data); return; } lo_seq= tcp_conn->tc_adv_seq; if (tcp_Gmod4G(lo_seq, tcp_conn->tc_RCV_NXT)) return; /* Not yet */ tcp_data= tcp_conn->tc_adv_data; tcp_conn->tc_adv_data= NULL; data_len= bf_bufsize(tcp_data); if (tcp_Lmod4G(lo_seq, tcp_conn->tc_RCV_NXT)) { offset= tcp_conn->tc_RCV_NXT-lo_seq; if (offset >= data_len) { bf_afree(tcp_data); return; } tcp_data= bf_delhead(tcp_data, offset); lo_seq += offset; data_len -= offset; } assert (lo_seq == tcp_conn->tc_RCV_NXT); hi_seq= lo_seq+data_len; assert (tcp_LEmod4G (hi_seq, tcp_conn->tc_RCV_HI)); rcvd_data= tcp_conn->tc_rcvd_data; tcp_conn->tc_rcvd_data= 0; tmp_data= bf_append(rcvd_data, tcp_data); tcp_conn->tc_rcvd_data= tmp_data; tcp_conn->tc_RCV_NXT= hi_seq; assert (tcp_conn->tc_RCV_LO + bf_bufsize(tcp_conn->tc_rcvd_data) == tcp_conn->tc_RCV_NXT || (tcp_print_conn(tcp_conn), printf("\n"), 0)); if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) tcp_fd_read(tcp_conn, 1); adv_data= tcp_conn->tc_adv_data; if (adv_data != NULL) { /* Try to use advanced data. */ adv_seq= tcp_conn->tc_adv_seq; nxt= tcp_conn->tc_RCV_NXT; if (tcp_Gmod4G(adv_seq, nxt)) return; /* not yet */ tcp_conn->tc_adv_data= NULL; data_len= bf_bufsize(adv_data); if (tcp_Lmod4G(adv_seq, nxt)) { if (tcp_LEmod4G(adv_seq+data_len, nxt)) { /* Data is not needed anymore. */ bf_afree(adv_data); return; } len_diff= nxt-adv_seq; adv_data= bf_delhead(adv_data, len_diff); data_len -= len_diff; } DBLOCK(1, printf("using advanced data\n")); /* Append data to the input buffer */ if (tcp_conn->tc_rcvd_data == NULL) { tcp_conn->tc_rcvd_data= adv_data; } else { tcp_conn->tc_rcvd_data= bf_append(tcp_conn->tc_rcvd_data, adv_data); } tcp_conn->tc_SND_NXT += data_len; assert(tcp_check_conn(tcp_conn)); if (tcp_conn->tc_fd && (tcp_conn->tc_fd->tf_flags & TFF_READ_IP)) { tcp_fd_read(tcp_conn, 1); } } } PRIVATE void process_advanced_data(tcp_conn, tcp_hdr, tcp_data, data_len) tcp_conn_t *tcp_conn; tcp_hdr_t *tcp_hdr; acc_t *tcp_data; int data_len; { u32_t seq, adv_seq; acc_t *adv_data; assert(tcp_conn->tc_busy); /* Note, tcp_data will be freed by the caller. */ /* Always send an ACK, this allows the sender to do a fast * retransmit. */ tcp_conn->tc_flags |= TCF_SEND_ACK; tcp_conn_write(tcp_conn, 1); if (tcp_hdr->th_flags & THF_URG) return; /* Urgent data is to complicated */ if (tcp_hdr->th_flags & THF_PSH) tcp_conn->tc_flags |= TCF_RCV_PUSH; seq= ntohl(tcp_hdr->th_seq_nr); /* Make sure that the packet doesn't fall outside of the window * we offered. */ if (tcp_Gmod4G(seq+data_len, tcp_conn->tc_RCV_HI)) return; adv_data= tcp_conn->tc_adv_data; adv_seq= tcp_conn->tc_adv_seq; tcp_conn->tc_adv_data= NULL; tcp_data->acc_linkC++; if (adv_data == NULL) { adv_seq= seq; adv_data= tcp_data; } else if (seq + data_len == adv_seq) { /* New data fits right before exiting data. */ adv_data= bf_append(tcp_data, adv_data); adv_seq= seq; } else if (adv_seq + bf_bufsize(adv_data) == seq) { /* New data fits right after exiting data. */ adv_data= bf_append(adv_data, tcp_data); } else { /* New data doesn't fit. */ bf_afree(tcp_data); } tcp_conn->tc_adv_data= adv_data; tcp_conn->tc_adv_seq= adv_seq; } PRIVATE void create_RST(tcp_conn, ip_hdr, tcp_hdr, data_len) tcp_conn_t *tcp_conn; ip_hdr_t *ip_hdr; tcp_hdr_t *tcp_hdr; int data_len; { acc_t *tmp_ipopt, *tmp_tcpopt, *tcp_pack; ip_hdropt_t ip_hdropt; tcp_hdropt_t tcp_hdropt; acc_t *RST_acc; ip_hdr_t *RST_ip_hdr; tcp_hdr_t *RST_tcp_hdr; char *ptr2RSThdr; size_t pack_size, ip_hdr_len; DBLOCK(0x10, printf("in create_RST, bad pack is:\n"); tcp_print_pack(ip_hdr, tcp_hdr); tcp_print_state(tcp_conn); printf("\n")); assert(tcp_conn->tc_busy); /* Only send RST packets in reponse to actual data (or SYN, FIN) * this solves a problem during connection shutdown. The problem * is the follow senario: a senders closes the connection instead * of doing a shutdown and waiting for the receiver to shutdown. * The receiver is slow in processing the last data. After the * sender has completely closed the connection, the receiver * sends a window update which triggers the sender to send a * RST. The receiver closes the connection in reponse to the RST. */ if ((tcp_hdr->th_flags & (THF_FIN|THF_SYN)) == 0 && data_len == 0) { #if DEBUG { printf("tcp_recv`create_RST: no data, no RST\n"); } #endif return; } tmp_ipopt= tcp_conn->tc_remipopt; if (tmp_ipopt) tmp_ipopt->acc_linkC++; tmp_tcpopt= tcp_conn->tc_tcpopt; if (tmp_tcpopt) tmp_tcpopt->acc_linkC++; tcp_extract_ipopt (tcp_conn, ip_hdr); tcp_extract_tcpopt (tcp_conn, tcp_hdr); RST_acc= tcp_make_header (tcp_conn, &RST_ip_hdr, &RST_tcp_hdr, (acc_t *)0); if (tcp_conn->tc_remipopt) bf_afree(tcp_conn->tc_remipopt); tcp_conn->tc_remipopt= tmp_ipopt; if (tcp_conn->tc_tcpopt) bf_afree(tcp_conn->tc_tcpopt); tcp_conn->tc_tcpopt= tmp_tcpopt; RST_ip_hdr->ih_src= ip_hdr->ih_dst; RST_ip_hdr->ih_dst= ip_hdr->ih_src; RST_tcp_hdr->th_srcport= tcp_hdr->th_dstport; RST_tcp_hdr->th_dstport= tcp_hdr->th_srcport; if (tcp_hdr->th_flags & THF_ACK) { RST_tcp_hdr->th_seq_nr= tcp_hdr->th_ack_nr; RST_tcp_hdr->th_flags= THF_RST; } else { RST_tcp_hdr->th_seq_nr= 0; RST_tcp_hdr->th_ack_nr= htonl( ntohl(tcp_hdr->th_seq_nr)+ data_len + (tcp_hdr->th_flags & THF_SYN ? 1 : 0) + (tcp_hdr->th_flags & THF_FIN ? 1 : 0)); RST_tcp_hdr->th_flags= THF_RST|THF_ACK; } pack_size= bf_bufsize(RST_acc); RST_ip_hdr->ih_length= htons(pack_size); RST_tcp_hdr->th_window= htons(tcp_conn->tc_rcv_wnd); RST_tcp_hdr->th_chksum= 0; RST_acc->acc_linkC++; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; tcp_pack= bf_delhead(RST_acc, ip_hdr_len); RST_tcp_hdr->th_chksum= ~tcp_pack_oneCsum (RST_ip_hdr, tcp_pack); bf_afree(tcp_pack); DBLOCK(2, tcp_print_pack(ip_hdr, tcp_hdr); printf("\n"); tcp_print_pack(RST_ip_hdr, RST_tcp_hdr); printf("\n")); if (tcp_conn->tc_frag2send) bf_afree(tcp_conn->tc_frag2send); tcp_conn->tc_frag2send= RST_acc; tcp_conn_write(tcp_conn, 1); } PUBLIC void tcp_fd_read(tcp_conn, enq) tcp_conn_t *tcp_conn; int enq; /* Enqueue writes. */ { tcp_fd_t *tcp_fd; size_t data_size, read_size; acc_t *data; int fin_recv, urg, push, result; i32_t old_window, new_window; assert(tcp_conn->tc_busy); tcp_fd= tcp_conn->tc_fd; assert (tcp_fd->tf_flags & TFF_READ_IP); if (tcp_conn->tc_state == TCS_CLOSED) { if (tcp_fd->tf_read_offset) tcp_reply_read (tcp_fd, tcp_fd->tf_read_offset); else tcp_reply_read (tcp_fd, tcp_conn->tc_error); return; } urg= tcp_Gmod4G(tcp_conn->tc_RCV_UP, tcp_conn->tc_RCV_LO); push= (tcp_conn->tc_flags & TCF_RCV_PUSH); fin_recv= (tcp_conn->tc_flags & TCF_FIN_RECV); data_size= tcp_conn->tc_RCV_NXT-tcp_conn->tc_RCV_LO; if (fin_recv) data_size--; if (urg) read_size= tcp_conn->tc_RCV_UP-tcp_conn->tc_RCV_LO; else read_size= data_size; if (read_size >= tcp_fd->tf_read_count) read_size= tcp_fd->tf_read_count; else if (!push && !fin_recv && !urg && data_size < TCP_MIN_RCV_WND_SIZE) { /* Defer the copy out until later. */ return; } else if (data_size == 0 && !fin_recv) { /* No data, and no end of file. */ return; } if (read_size) { if (urg && !(tcp_fd->tf_flags & TFF_RECV_URG)) { if (tcp_fd->tf_read_offset) { tcp_reply_read (tcp_fd, tcp_fd->tf_read_offset); } else { tcp_reply_read (tcp_fd, EURG); } return; } else if (!urg && (tcp_fd->tf_flags & TFF_RECV_URG)) { if (tcp_fd->tf_read_offset) { tcp_reply_read (tcp_fd, tcp_fd->tf_read_offset); } else { tcp_reply_read(tcp_fd, ENOURG); } return; } if (read_size == data_size) { data= tcp_conn->tc_rcvd_data; data->acc_linkC++; } else { data= bf_cut(tcp_conn->tc_rcvd_data, 0, read_size); } result= (*tcp_fd->tf_put_userdata) (tcp_fd->tf_srfd, tcp_fd->tf_read_offset, data, FALSE); if (result<0) { if (tcp_fd->tf_read_offset) tcp_reply_read(tcp_fd, tcp_fd-> tf_read_offset); else tcp_reply_read(tcp_fd, result); return; } tcp_fd->tf_read_offset += read_size; tcp_fd->tf_read_count -= read_size; if (data_size == read_size) { bf_afree(tcp_conn->tc_rcvd_data); tcp_conn->tc_rcvd_data= 0; } else { tcp_conn->tc_rcvd_data= bf_delhead(tcp_conn->tc_rcvd_data, read_size); } tcp_conn->tc_RCV_LO += read_size; data_size -= read_size; } if (tcp_conn->tc_RCV_HI-tcp_conn->tc_RCV_LO <= (tcp_conn-> tc_rcv_wnd-tcp_conn->tc_mss)) { old_window= tcp_conn->tc_RCV_HI-tcp_conn->tc_RCV_NXT; tcp_conn->tc_RCV_HI= tcp_conn->tc_RCV_LO + tcp_conn->tc_rcv_wnd; new_window= tcp_conn->tc_RCV_HI-tcp_conn->tc_RCV_NXT; assert(old_window >=0 && new_window >= old_window); if (old_window < tcp_conn->tc_mss && new_window >= tcp_conn->tc_mss) { tcp_conn->tc_flags |= TCF_SEND_ACK; DBLOCK(2, printf("opening window\n")); tcp_conn_write(tcp_conn, 1); } } if (tcp_conn->tc_rcvd_data == NULL && tcp_conn->tc_adv_data == NULL) { /* Out of data, clear PUSH flag and reply to a read. */ tcp_conn->tc_flags &= ~TCF_RCV_PUSH; } if (fin_recv || urg || !tcp_fd->tf_read_count) { tcp_reply_read (tcp_fd, tcp_fd->tf_read_offset); return; } if (tcp_fd->tf_read_offset) { tcp_reply_read (tcp_fd, tcp_fd->tf_read_offset); return; } } /* * $PchId: tcp_recv.c,v 1.13.2.1 2000/05/02 18:53:06 philip Exp $ */ /* tcp_send.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "buf.h" #include "clock.h" #include "event.h" #include "type.h" #include "assert.h" #include "io.h" #include "ip.h" #include "tcp.h" #include "tcp_int.h" THIS_FILE FORWARD acc_t *make_pack ARGS(( tcp_conn_t *tcp_conn )); FORWARD void tcp_send_timeout ARGS(( int conn, struct timer *timer )); FORWARD void do_snd_event ARGS(( event_t *ev, ev_arg_t arg )); PUBLIC void tcp_conn_write (tcp_conn, enq) tcp_conn_t *tcp_conn; int enq; /* Writes need to be enqueued. */ { tcp_port_t *tcp_port; ev_arg_t snd_arg; assert (tcp_conn->tc_flags & TCF_INUSE); tcp_port= tcp_conn->tc_port; if (tcp_conn->tc_flags & TCF_MORE2WRITE) return; /* XXX - do we really have something to send here? */ tcp_conn->tc_flags |= TCF_MORE2WRITE; tcp_conn->tc_send_link= NULL; if (!tcp_port->tp_snd_head) { tcp_port->tp_snd_head= tcp_conn; tcp_port->tp_snd_tail= tcp_conn; if (enq) { snd_arg.ev_ptr= tcp_port; if (!ev_in_queue(&tcp_port->tp_snd_event)) { ev_enqueue(&tcp_port->tp_snd_event, do_snd_event, snd_arg); } } else tcp_port_write(tcp_port); } else { tcp_port->tp_snd_tail->tc_send_link= tcp_conn; tcp_port->tp_snd_tail= tcp_conn; } } PRIVATE void do_snd_event(ev, arg) event_t *ev; ev_arg_t arg; { tcp_port_t *tcp_port; tcp_port= arg.ev_ptr; assert(ev == &tcp_port->tp_snd_event); tcp_port_write(tcp_port); } PUBLIC void tcp_port_write(tcp_port) tcp_port_t *tcp_port; { tcp_conn_t *tcp_conn; acc_t *pack2write; int r; assert (!(tcp_port->tp_flags & TPF_WRITE_IP)); while(tcp_port->tp_snd_head) { tcp_conn= tcp_port->tp_snd_head; assert(tcp_conn->tc_flags & TCF_MORE2WRITE); for(;;) { if (tcp_conn->tc_frag2send) { pack2write= tcp_conn->tc_frag2send; tcp_conn->tc_frag2send= 0; } else { tcp_conn->tc_busy++; pack2write= make_pack(tcp_conn); tcp_conn->tc_busy--; if (!pack2write) break; } r= ip_send(tcp_port->tp_ipfd, pack2write, bf_bufsize(pack2write)); if (r != NW_OK) { if (r == NW_WOULDBLOCK) break; if (r == EDSTNOTRCH) { tcp_notreach(tcp_conn); continue; } else if (r == EBADDEST) continue; } assert(r == NW_OK || (printf("ip_send failed, error %d\n", r),0)); } if (pack2write) { tcp_port->tp_flags |= TPF_WRITE_IP; tcp_port->tp_pack= pack2write; r= ip_write (tcp_port->tp_ipfd, bf_bufsize(pack2write)); if (r == NW_SUSPEND) { tcp_port->tp_flags |= TPF_WRITE_SP; return; } assert(r == NW_OK); tcp_port->tp_flags &= ~TPF_WRITE_IP; assert(!(tcp_port->tp_flags & (TPF_WRITE_IP|TPF_WRITE_SP))); continue; } tcp_conn->tc_flags &= ~TCF_MORE2WRITE; tcp_port->tp_snd_head= tcp_conn->tc_send_link; } } PRIVATE acc_t *make_pack(tcp_conn) tcp_conn_t *tcp_conn; { acc_t *pack2write, *tmp_pack, *tcp_pack; tcp_hdr_t *tcp_hdr; ip_hdr_t *ip_hdr; int tot_hdr_size, ip_hdr_len; u32_t seg_seq, seg_lo_data, queue_lo_data, seg_hi, seg_hi_data; u16_t seg_up; u8_t seg_flags; time_t new_dis; size_t pack_size; time_t curr_time; u8_t *optptr; assert(tcp_conn->tc_busy); curr_time= get_time(); switch (tcp_conn->tc_state) { case TCS_CLOSED: return 0; case TCS_SYN_RECEIVED: case TCS_SYN_SENT: if (tcp_conn->tc_SND_TRM == tcp_conn->tc_SND_NXT && !(tcp_conn->tc_flags & TCF_SEND_ACK)) { return 0; } tcp_conn->tc_flags &= ~TCF_SEND_ACK; /* Include a max segment size option. */ assert(tcp_conn->tc_tcpopt == NULL); tcp_conn->tc_tcpopt= bf_memreq(4); optptr= (u8_t *)ptr2acc_data(tcp_conn->tc_tcpopt); optptr[0]= TCP_OPT_MSS; optptr[1]= 4; optptr[2]= tcp_conn->tc_mss >> 8; optptr[3]= tcp_conn->tc_mss & 0xFF; pack2write= tcp_make_header(tcp_conn, &ip_hdr, &tcp_hdr, (acc_t *)0); bf_afree(tcp_conn->tc_tcpopt); tcp_conn->tc_tcpopt= NULL; if (!pack2write) { DBLOCK(1, printf("connection closed while inuse\n")); return 0; } tot_hdr_size= bf_bufsize(pack2write); seg_seq= tcp_conn->tc_SND_TRM; if (tcp_conn->tc_state == TCS_SYN_SENT) seg_flags= 0; else seg_flags= THF_ACK; /* except for TCS_SYN_SENT * ack is always present */ if (seg_seq == tcp_conn->tc_ISS) { assert(tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)); seg_flags |= THF_SYN; tcp_conn->tc_SND_TRM++; } tcp_hdr->th_seq_nr= htonl(seg_seq); tcp_hdr->th_ack_nr= htonl(tcp_conn->tc_RCV_NXT); tcp_hdr->th_flags= seg_flags; tcp_hdr->th_window= htons(tcp_conn->tc_mss); /* Initially we allow one segment */ ip_hdr->ih_length= htons(tot_hdr_size); pack2write->acc_linkC++; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; tcp_pack= bf_delhead(pack2write, ip_hdr_len); tcp_hdr->th_chksum= ~tcp_pack_oneCsum(ip_hdr, tcp_pack); bf_afree(tcp_pack); new_dis= curr_time + 2*HZ*tcp_conn->tc_ttl; if (new_dis > tcp_conn->tc_senddis) tcp_conn->tc_senddis= new_dis; return pack2write; case TCS_ESTABLISHED: case TCS_CLOSING: seg_seq= tcp_conn->tc_SND_TRM; seg_flags= 0; pack2write= 0; seg_up= 0; if (tcp_conn->tc_flags & TCF_SEND_ACK) { seg_flags= THF_ACK; tcp_conn->tc_flags &= ~TCF_SEND_ACK; pack2write= tcp_make_header (tcp_conn, &ip_hdr, &tcp_hdr, (acc_t *)0); if (!pack2write) { return NULL; } } if (tcp_conn->tc_SND_UNA != tcp_conn->tc_SND_NXT) { assert(tcp_LEmod4G(seg_seq, tcp_conn->tc_SND_NXT)); if (seg_seq == tcp_conn->tc_snd_cwnd) { DBLOCK(2, printf("no data: window is closed\n")); goto after_data; } /* Assert that our SYN has been ACKed. */ assert(tcp_conn->tc_SND_UNA != tcp_conn->tc_ISS); seg_lo_data= seg_seq; queue_lo_data= tcp_conn->tc_SND_UNA; seg_hi= tcp_conn->tc_SND_NXT; seg_hi_data= seg_hi; if (tcp_conn->tc_flags & TCF_FIN_SENT) { if (seg_seq != seg_hi) seg_flags |= THF_FIN; if (queue_lo_data == seg_hi_data) queue_lo_data--; if (seg_lo_data == seg_hi_data) seg_lo_data--; seg_hi_data--; } if (!pack2write) { pack2write= tcp_make_header (tcp_conn, &ip_hdr, &tcp_hdr, (acc_t *)0); if (!pack2write) { return NULL; } } tot_hdr_size= bf_bufsize(pack2write); if (seg_hi_data - seg_lo_data > tcp_conn->tc_mss - tot_hdr_size) { seg_hi_data= seg_lo_data + tcp_conn->tc_mss - tot_hdr_size; seg_hi= seg_hi_data; seg_flags &= ~THF_FIN; } if (tcp_Gmod4G(seg_hi, tcp_conn->tc_snd_cwnd)) { seg_hi_data= tcp_conn->tc_snd_cwnd; seg_hi= seg_hi_data; seg_flags &= ~THF_FIN; } if (seg_hi-seg_seq == 0) { DBLOCK(0x20, printf("no data: no data available\n")); goto after_data; } if (seg_seq != tcp_conn->tc_SND_UNA && seg_hi_data-seg_lo_data+tot_hdr_size < tcp_conn->tc_mss) { DBLOCK(0x20, printf("no data: partial packet\n")); seg_flags &= ~THF_FIN; goto after_data; } if (tcp_GEmod4G(tcp_conn->tc_SND_UP, seg_lo_data)) { if (tcp_GEmod4G(tcp_conn->tc_SND_UP, seg_hi_data)) { seg_up= seg_hi_data-seg_seq; } else { seg_up= tcp_conn->tc_SND_UP-seg_seq; } seg_flags |= THF_URG; if ((tcp_conn->tc_flags & TCF_BSD_URG) && seg_up == 0) { /* A zero urgent pointer doesn't mean * anything when BSD semantics are * used (urgent pointer points to the * first no urgent byte). The use of * a zero urgent pointer also crashes * a Solaris 2.3 kernel. If urgent * pointer doesn't have BSD semantics * then an urgent pointer of zero * simply indicates that there is one * urgent byte. */ seg_flags &= ~THF_URG; } } else seg_up= 0; if (tcp_Gmod4G(tcp_conn->tc_SND_PSH, seg_lo_data) && tcp_LEmod4G(tcp_conn->tc_SND_PSH, seg_hi_data)) { seg_flags |= THF_PSH; } tcp_conn->tc_SND_TRM= seg_hi; assert(tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)); if (tcp_conn->tc_rt_seq == 0 && tcp_Gmod4G(seg_seq, tcp_conn->tc_rt_threshold)) { tcp_conn->tc_rt_))))))))))))))))))*time= curr_time; tcp_conn->tc_rt_seq= tcp_conn->tc_rt_threshold= seg_seq; } if (seg_hi_data-seg_lo_data) { #if DEBUG & 0 assert(tcp_check_conn(tcp_conn)); assert((seg_hi_data-queue_lo_data <= bf_bufsize(tcp_conn->tc_send_data) && seg_lo_data-queue_lo_data <= bf_bufsize(tcp_conn->tc_send_data) && seg_hi_data>seg_lo_data)|| (tcp_print_conn(tcp_conn), printf( " seg_hi_data= 0x%x, seg_lo_data= 0x%x, queue_lo_data= 0x%x\n", seg_hi_data, seg_lo_data, queue_lo_data), 0)); #endif tmp_pack= pack2write; while (tmp_pack->acc_next) tmp_pack= tmp_pack->acc_next; tmp_pack->acc_next= bf_cut(tcp_conn->tc_send_data, (unsigned)(seg_lo_data-queue_lo_data), (unsigned) (seg_hi_data-seg_lo_data)); } seg_flags |= THF_ACK; } after_data: if (!(seg_flags & THF_ACK)) { if (pack2write) bf_afree(pack2write); return NULL; } tcp_hdr->th_seq_nr= htonl(seg_seq); tcp_hdr->th_ack_nr= htonl(tcp_conn->tc_RCV_NXT); tcp_hdr->th_flags= seg_flags; tcp_hdr->th_window= htons(tcp_conn->tc_RCV_HI - tcp_conn->tc_RCV_NXT); tcp_hdr->th_urgptr= htons(seg_up); pack_size= bf_bufsize(pack2write); ip_hdr->ih_length= htons(pack_size); pack2write->acc_linkC++; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; tcp_pack= bf_delhead(pack2write, ip_hdr_len); tcp_hdr->th_chksum= ~tcp_pack_oneCsum(ip_hdr, tcp_pack); bf_afree(tcp_pack); new_dis= curr_time + 2*HZ*tcp_conn->tc_ttl; if (new_dis > tcp_conn->tc_senddis) tcp_conn->tc_senddis= new_dis; return pack2write; #if !CRAMPED default: DBLOCK(1, tcp_print_conn(tcp_conn); printf("\n")); ip_panic(( "Illegal state" )); #endif } assert(0); return NULL; } /* tcp_release_retrans */ PUBLIC void tcp_release_retrans(tcp_conn, seg_ack, new_win) tcp_conn_t *tcp_conn; u32_t seg_ack; u16_t new_win; { size_t size, offset; acc_t *pack; time_t retrans_time, curr_time, rtt; u32_t queue_lo, queue_hi; u16_t mss, cthresh; unsigned window; assert(tcp_conn->tc_busy); assert (tcp_GEmod4G(seg_ack, tcp_conn->tc_SND_UNA)); assert (tcp_LEmod4G(seg_ack, tcp_conn->tc_SND_NXT)); curr_time= get_time(); if (tcp_conn->tc_rt_seq != 0 && tcp_Gmod4G(seg_ack, tcp_conn->tc_rt_seq)) { assert(curr_time >= tcp_conn->tc_rt_time); retrans_time= curr_time-tcp_conn->tc_rt_time; rtt= tcp_conn->tc_rtt; DBLOCK(0x20, printf( "tcp_release_retrans, conn[%d]: retrans_time= %ld ms\n", tcp_conn-tcp_conn_table, retrans_time*1000/HZ)); tcp_conn->tc_rt_seq= 0; if (rtt == TCP_RTT_GRAN*CLOCK_GRAN && retrans_time <= TCP_RTT_GRAN*CLOCK_GRAN) { /* Common in fast networks. Nothing to do. */ } else if (rtt >= retrans_time && rtt <= 2*retrans_time) { /* Nothing to do. We assume that a factor 2 for * variance is enough. */ } else if (retrans_time > rtt) { /* Retrans time is really too small. */ tcp_conn->tc_rtt= rtt*2; if (tcp_conn->tc_rtt > TCP_RTT_MAX) { #if DEBUG static int warned /* = 0 */; if (!warned) { printf( "tcp_release_retrans: warning retransmission time is limited to %d ms\n", TCP_RTT_MAX*1000/HZ); warned= 1; } #endif tcp_conn->tc_rtt= TCP_RTT_MAX; } assert (tcp_conn->tc_rtt); DBLOCK(0x10, printf( "tcp_release_retrans, conn[%d]: (was too small) retrans_time= %ld ms, rtt= %ld ms\n", tcp_conn-tcp_conn_table, retrans_time*1000/HZ, tcp_conn->tc_rtt*1000/HZ)); } else if (seg_ack - tcp_conn->tc_rt_seq == tcp_conn->tc_mss) { /* Retrans time is really too big. */ rtt= (rtt*3)>>2; if (rtt < TCP_RTT_GRAN*CLOCK_GRAN) rtt= TCP_RTT_GRAN*CLOCK_GRAN; tcp_conn->tc_rtt= rtt; assert (tcp_conn->tc_rtt); DBLOCK(0x10, printf( "tcp_release_retrans, conn[%d]: (was too big) retrans_time= %ld ms, rtt= %ld ms\n", tcp_conn-tcp_conn_table, retrans_time*1000/HZ, tcp_conn->tc_rtt*1000/HZ)); } else { /* Retrans time might be too big. Try a bit smaller. */ rtt= (rtt*31)>>5; if (rtt < TCP_RTT_GRAN*CLOCK_GRAN) rtt= TCP_RTT_GRAN*CLOCK_GRAN; tcp_conn->tc_rtt= rtt; assert (tcp_conn->tc_rtt); DBLOCK(0x20, printf( "tcp_release_retrans, conn[%d]: (maybe too big) retrans_time= %ld ms, rtt= %ld ms\n", tcp_conn-tcp_conn_table, retrans_time*1000/HZ, tcp_conn->tc_rtt*1000/HZ)); } } /* Update the current window. */ window= tcp_conn->tc_snd_cwnd-tcp_conn->tc_SND_UNA; mss= tcp_conn->tc_mss; assert(seg_ack != tcp_conn->tc_SND_UNA); /* For every real ACK we try to increase the current window * with 1 mss. */ window += mss; /* If the window becomes larger than the current threshold, * increment the threshold by a small amount and set the * window to the threshold. */ cthresh= tcp_conn->tc_snd_cthresh; if (window > cthresh) { cthresh += tcp_conn->tc_snd_cinc; tcp_conn->tc_snd_cthresh= cthresh; window= cthresh; } /* If the window is larger than the window advertised by the * receiver, set the window size to the advertisement. */ if (window > new_win) window= new_win; tcp_conn->tc_snd_cwnd= seg_ack+window; /* Release data queued for retransmissions. */ queue_lo= tcp_conn->tc_SND_UNA; queue_hi= tcp_conn->tc_SND_NXT; tcp_conn->tc_SND_UNA= seg_ack; if (tcp_Lmod4G(tcp_conn->tc_SND_TRM, seg_ack)) { tcp_conn->tc_SND_TRM= seg_ack; } assert(tcp_GEmod4G(tcp_conn->tc_snd_cwnd, seg_ack)); if (queue_lo == tcp_conn->tc_ISS) queue_lo++; if (tcp_conn->tc_flags & TCF_FIN_SENT) { if (seg_ack == queue_hi) seg_ack--; if (queue_lo == queue_hi) queue_lo--; queue_hi--; } offset= seg_ack - queue_lo; size= queue_hi - seg_ack; pack= tcp_conn->tc_send_data; tcp_conn->tc_send_data= 0; if (!size) { bf_afree(pack); /* Reset window if a write is completed */ tcp_conn->tc_snd_cwnd= tcp_conn->tc_SND_UNA + 2*tcp_conn->tc_mss; } else { pack= bf_delhead(pack, offset); tcp_conn->tc_send_data= pack; } if (tcp_Gmod4G(tcp_conn->tc_SND_TRM, tcp_conn->tc_snd_cwnd)) tcp_conn->tc_SND_TRM= tcp_conn->tc_snd_cwnd; /* Copy in new data if a write request is pending and * SND_NXT-SND_TRM is less than 1 mss. */ if (tcp_conn->tc_fd) { if ((tcp_conn->tc_fd->tf_flags & (TFF_WRITE_IP|TFF_IOCTL_IP)) && tcp_conn->tc_SND_NXT-tcp_conn->tc_SND_TRM < tcp_conn->tc_mss) { tcp_fd_write(tcp_conn); } } else { if (tcp_conn->tc_SND_UNA == tcp_conn->tc_SND_NXT) { assert(tcp_conn->tc_state == TCS_CLOSING); DBLOCK(0x10, printf("all data sent in abondoned connection\n")); tcp_close_connection(tcp_conn, ENOTCONN); return; } } DIFBLOCK(2, (tcp_conn->tc_snd_cwnd == tcp_conn->tc_SND_TRM), printf("not sending: zero window\n")); if (tcp_conn->tc_snd_cwnd != tcp_conn->tc_SND_TRM && tcp_conn->tc_SND_NXT != tcp_conn->tc_SND_TRM) { tcp_conn_write(tcp_conn, 1); } } /* tcp_send_timeout */ PRIVATE void tcp_send_timeout(conn, timer) int conn; struct timer *timer; { tcp_conn_t *tcp_conn; u16_t mss, mss2; time_t curr_time, stt, timeout; curr_time= get_time(); tcp_conn= &tcp_conn_table[conn]; assert(tcp_conn->tc_flags & TCF_INUSE); assert(tcp_conn->tc_state != TCS_CLOSED); assert(tcp_conn->tc_state != TCS_LISTEN); if (tcp_conn->tc_SND_NXT == tcp_conn->tc_SND_UNA) { /* Nothing to do */ assert(tcp_conn->tc_SND_TRM == tcp_conn->tc_SND_UNA); /* A new write sets the timer if tc_transmit_seq == SND_UNA */ tcp_conn->tc_transmit_seq= tcp_conn->tc_SND_UNA; tcp_conn->tc_stt= 0; tcp_conn->tc_0wnd_to= 0; assert(!tcp_conn->tc_fd || !(tcp_conn->tc_fd->tf_flags & TFF_WRITE_IP)); return; } if (tcp_conn->tc_transmit_seq != tcp_conn->tc_SND_UNA) { /* Some data has been acknowledged since the last time the * timer was set, set the timer again. */ tcp_conn->tc_transmit_seq= tcp_conn->tc_SND_UNA; tcp_conn->tc_stt= 0; tcp_conn->tc_0wnd_to= 0; DBLOCK(0x20, printf( "tcp_send_timeout: conn[%d] setting timer to %ld ms (+%ld ms)\n", tcp_conn-tcp_conn_table, (curr_time+tcp_conn->tc_rtt)*1000/HZ, tcp_conn->tc_rtt*1000/HZ)); clck_timer(&tcp_conn->tc_transmit_timer, curr_time+tcp_conn->tc_rtt, tcp_send_timeout, tcp_conn-tcp_conn_table); return; } if (tcp_conn->tc_stt == 0) { /* Some packet arrived but did not acknowledge any data. * Apparently, the other side is still alive and has a * reason to transmit. We can asume a zero window. */ DBLOCK(0x10, printf("conn[%d] setting zero window timer\n", tcp_conn-tcp_conn_table)); if (tcp_conn->tc_0wnd_to < TCP_0WND_MIN) tcp_conn->tc_0wnd_to= TCP_0WND_MIN; else if (tcp_conn->tc_0wnd_to < tcp_conn->tc_rtt) tcp_conn->tc_0wnd_to= tcp_conn->tc_rtt; else { tcp_conn->tc_0wnd_to *= 2; if (tcp_conn->tc_0wnd_to > TCP_0WND_MAX) tcp_conn->tc_0wnd_to= TCP_0WND_MAX; } tcp_conn->tc_stt= curr_time; tcp_conn->tc_rt_seq= 0; DBLOCK(0x20, printf( "tcp_send_timeout: conn[%d] setting timer to %ld ms (+%ld ms)\n", tcp_conn-tcp_conn_table, (curr_time+tcp_conn->tc_0wnd_to)*1000/HZ, tcp_conn->tc_0wnd_to*1000/HZ)); clck_timer(&tcp_conn->tc_transmit_timer, curr_time+tcp_conn->tc_0wnd_to, tcp_send_timeout, tcp_conn-tcp_conn_table); return; } DIFBLOCK(0x10, (tcp_conn->tc_fd == 0), printf("conn[%d] timeout in abondoned connection\n", tcp_conn-tcp_conn_table)); /* At this point, we have do a retransmission, or send a zero window * probe, which is almost the same. */ DBLOCK(0x20, printf("tcp_send_timeout: conn[%d] una= %u, rtt= %dms\n", tcp_conn-tcp_conn_table, tcp_conn->tc_SND_UNA, tcp_conn->tc_rtt*1000/HZ)); /* Update threshold sequence number for retransmission calculation. */ if (tcp_Gmod4G(tcp_conn->tc_SND_TRM, tcp_conn->tc_rt_threshold)) tcp_conn->tc_rt_threshold= tcp_conn->tc_SND_TRM; tcp_conn->tc_SND_TRM= tcp_conn->tc_SND_UNA; mss= tcp_conn->tc_mss; mss2= 2*mss; if (tcp_conn->tc_snd_cwnd == tcp_conn->tc_SND_UNA) tcp_conn->tc_snd_cwnd++; if (tcp_Gmod4G(tcp_conn->tc_snd_cwnd, tcp_conn->tc_SND_UNA + mss2)) { tcp_conn->tc_snd_cwnd= tcp_conn->tc_SND_UNA + mss2; if (tcp_Gmod4G(tcp_conn->tc_SND_TRM, tcp_conn->tc_snd_cwnd)) tcp_conn->tc_SND_TRM= tcp_conn->tc_snd_cwnd; tcp_conn->tc_snd_cthresh /= 2; if (tcp_conn->tc_snd_cthresh < mss2) tcp_conn->tc_snd_cthresh= mss2; } stt= tcp_conn->tc_stt; assert(stt <= curr_time); if (curr_time-stt > tcp_conn->tc_rt_dead) { tcp_close_connection(tcp_conn, ETIMEDOUT); return; } timeout= (curr_time-stt) >> 3; if (timeout < tcp_conn->tc_rtt) timeout= tcp_conn->tc_rtt; timeout += curr_time; DBLOCK(0x20, printf( "tcp_send_timeout: conn[%d] setting timer to %ld ms (+%ld ms)\n", tcp_conn-tcp_conn_table, timeout*1000/HZ, (timeout-curr_time)*1000/HZ)); clck_timer(&tcp_conn->tc_transmit_timer, timeout, tcp_send_timeout, tcp_conn-tcp_conn_table); if (tcp_conn->tc_rt_seq == 0) { tcp_conn->tc_rt_time= curr_time-tcp_conn->tc_rtt; tcp_conn->tc_rt_seq= tcp_conn->tc_SND_UNA; } tcp_conn_write(tcp_conn, 0); } PUBLIC void tcp_fd_write(tcp_conn) tcp_conn_t *tcp_conn; { tcp_fd_t *tcp_fd; int urg, nourg, push; u32_t max_seq; size_t max_count, max_trans, write_count, send_count; acc_t *data, *tmp_acc, *send_data; assert(tcp_conn->tc_busy); tcp_fd= tcp_conn->tc_fd; if ((tcp_fd->tf_flags & TFF_IOCTL_IP) && !(tcp_fd->tf_flags & TFF_WRITE_IP)) { if (tcp_fd->tf_ioreq != NWIOTCPSHUTDOWN) return; DBLOCK(0x10, printf("NWIOTCPSHUTDOWN\n")); if (tcp_conn->tc_state == TCS_CLOSED) { tcp_reply_ioctl (tcp_fd, tcp_conn->tc_error); return; } if (!(tcp_conn->tc_flags & TCF_FIN_SENT)) { DBLOCK(0x10, printf("calling tcp_shutdown\n")); tcp_shutdown (tcp_conn); } else { if (tcp_conn->tc_SND_UNA == tcp_conn->tc_SND_NXT) { tcp_reply_ioctl (tcp_fd, NW_OK); DBLOCK(0x10, printf("shutdown completed\n")); } else { DBLOCK(0x10, printf("shutdown still inprogress\n")); } } return; } assert (tcp_fd->tf_flags & TFF_WRITE_IP); if (tcp_conn->tc_state == TCS_CLOSED) { if (tcp_fd->tf_write_offset) { tcp_reply_write(tcp_fd, tcp_fd->tf_write_offset); } else tcp_reply_write(tcp_fd, tcp_conn->tc_error); return; } urg= (tcp_fd->tf_flags & TFF_WR_URG); push= (tcp_fd->tf_flags & TFF_PUSH_DATA); max_seq= tcp_conn->tc_SND_UNA + tcp_conn->tc_snd_wnd; if (urg) max_seq++; max_count= max_seq - tcp_conn->tc_SND_UNA; max_trans= max_seq - tcp_conn->tc_SND_NXT; if (tcp_fd->tf_write_count <= max_trans) write_count= tcp_fd->tf_write_count; else write_count= max_trans; if (write_count) { if (tcp_conn->tc_flags & TCF_BSD_URG) { if (tcp_Gmod4G(tcp_conn->tc_SND_NXT, tcp_conn->tc_SND_UNA)) { nourg= tcp_LEmod4G(tcp_conn->tc_SND_UP, tcp_conn->tc_SND_UNA); if ((urg && nourg) || (!urg && !nourg)) { DBLOCK(0x20, printf("not sending\n")); return; } } } data= (*tcp_fd->tf_get_userdata) (tcp_fd->tf_srfd, tcp_fd->tf_write_offset, write_count, FALSE); if (!data) { if (tcp_fd->tf_write_offset) { tcp_reply_write(tcp_fd, tcp_fd->tf_write_offset); } else tcp_reply_write(tcp_fd, EFAULT); return; } tcp_fd->tf_write_offset += write_count; tcp_fd->tf_write_count -= write_count; send_data= tcp_conn->tc_send_data; tcp_conn->tc_send_data= 0; send_data= bf_append(send_data, data); tcp_conn->tc_send_data= send_data; tcp_conn->tc_SND_NXT += write_count; if (urg) { if (tcp_conn->tc_flags & TCF_BSD_URG) tcp_conn->tc_SND_UP= tcp_conn->tc_SND_NXT; else tcp_conn->tc_SND_UP= tcp_conn->tc_SND_NXT-1; } if (push && !tcp_fd->tf_write_count) tcp_conn->tc_SND_PSH= tcp_conn->tc_SND_NXT; } if (!tcp_fd->tf_write_count) { tcp_reply_write(tcp_fd, tcp_fd->tf_write_offset); } } /* tcp_shutdown */ PUBLIC void tcp_shutdown(tcp_conn) tcp_conn_t *tcp_conn; { switch (tcp_conn->tc_state) { case TCS_CLOSED: case TCS_LISTEN: case TCS_SYN_SENT: case TCS_SYN_RECEIVED: tcp_close_connection(tcp_conn, ENOTCONN); return; } if (tcp_conn->tc_flags & TCF_FIN_SENT) return; tcp_conn->tc_flags |= TCF_FIN_SENT; tcp_conn->tc_SND_NXT++; assert (tcp_check_conn(tcp_conn) || (tcp_print_conn(tcp_conn), printf("\n"), 0)); tcp_conn_write(tcp_conn, 1); /* Start the timer (if necessary) */ tcp_set_send_timer(tcp_conn); } PUBLIC void tcp_set_send_timer(tcp_conn) tcp_conn_t *tcp_conn; { time_t curr_time; assert(tcp_conn->tc_state != TCS_CLOSED); assert(tcp_conn->tc_state != TCS_LISTEN); curr_time= get_time(); /* Start the timer */ DBLOCK(0x20, printf( "tcp_set_send_timer: conn[%d] setting timer to %ld ms (+%ld ms)\n", tcp_conn-tcp_conn_table, (curr_time+tcp_conn->tc_rtt)*1000/HZ, tcp_conn->tc_rtt*1000/HZ)); clck_timer(&tcp_conn->tc_transmit_timer, curr_time+tcp_conn->tc_rtt, tcp_send_timeout, tcp_conn-tcp_conn_table); tcp_conn->tc_stt= curr_time; tcp_conn->tc_stt= curr_time; } /* tcp_close_connection */ PUBLIC void tcp_close_connection(tcp_conn, error) tcp_conn_t *tcp_conn; int error; { tcp_port_t *tcp_port; tcp_fd_t *tcp_fd; tcp_conn_t *tc; assert (tcp_check_conn(tcp_conn)); assert (tcp_conn->tc_flags & TCF_INUSE); tcp_conn->tc_error= error; tcp_port= tcp_conn->tc_port; tcp_fd= tcp_conn->tc_fd; if (tcp_conn->tc_state == TCS_CLOSED) return; tcp_conn->tc_state= TCS_CLOSED; DBLOCK(0x10, tcp_print_state(tcp_conn); printf("\n")); if (tcp_fd) { tcp_conn->tc_busy++; assert(tcp_fd->tf_conn == tcp_conn); if (tcp_fd->tf_flags & TFF_READ_IP) tcp_fd_read (tcp_conn, 1); assert (!(tcp_fd->tf_flags & TFF_READ_IP)); if (tcp_fd->tf_flags & TFF_WRITE_IP) { tcp_fd_write(tcp_conn); tcp_conn_write(tcp_conn, 1); } assert (!(tcp_fd->tf_flags & TFF_WRITE_IP)); if (tcp_fd->tf_flags & TFF_IOCTL_IP) { tcp_fd_write(tcp_conn); tcp_conn_write(tcp_conn, 1); } if (tcp_fd->tf_flags & TFF_IOCTL_IP) assert(tcp_fd->tf_ioreq != NWIOTCPSHUTDOWN); if (tcp_conn->tc_connInprogress) tcp_restart_connect(tcp_conn->tc_fd); assert (!tcp_conn->tc_connInprogress); assert (!(tcp_fd->tf_flags & TFF_IOCTL_IP) || (printf("req= 0x%lx\n", tcp_fd->tf_ioreq), 0)); tcp_conn->tc_busy--; } if (tcp_conn->tc_rcvd_data) { bf_afree(tcp_conn->tc_rcvd_data); tcp_conn->tc_rcvd_data= NULL; } tcp_conn->tc_flags &= ~TCF_FIN_RECV; tcp_conn->tc_RCV_LO= tcp_conn->tc_RCV_NXT; if (tcp_conn->tc_adv_data) { bf_afree(tcp_conn->tc_adv_data); tcp_conn->tc_adv_data= NULL; } if (tcp_conn->tc_send_data) { bf_afree(tcp_conn->tc_send_data); tcp_conn->tc_send_data= NULL; tcp_conn->tc_SND_TRM= tcp_conn->tc_SND_NXT= tcp_conn->tc_SND_UNA; } tcp_conn->tc_SND_TRM= tcp_conn->tc_SND_NXT= tcp_conn->tc_SND_UNA; if (tcp_conn->tc_remipopt) { bf_afree(tcp_conn->tc_remipopt); tcp_conn->tc_remipopt= NULL; } if (tcp_conn->tc_tcpopt) { bf_afree(tcp_conn->tc_tcpopt); tcp_conn->tc_tcpopt= NULL; } if (tcp_conn->tc_frag2send) { bf_afree(tcp_conn->tc_frag2send); tcp_conn->tc_frag2send= NULL; } if (tcp_conn->tc_flags & TCF_MORE2WRITE) { for (tc= tcp_port->tp_snd_head; tc; tc= tc->tc_send_link) { if (tc->tc_send_link == tcp_conn) break; } if (tc == NULL) { assert(tcp_port->tp_snd_head == tcp_conn); tcp_port->tp_snd_head= tcp_conn->tc_send_link; } else { tc->tc_send_link= tcp_conn->tc_send_link; if (tc->tc_send_link == NULL) tcp_port->tp_snd_tail= tc; } tcp_conn->tc_flags &= ~TCF_MORE2WRITE; } clck_untimer (&tcp_conn->tc_transmit_timer); tcp_conn->tc_transmit_seq= 0; /* clear all flags but TCF_INUSE */ tcp_conn->tc_flags &= TCF_INUSE; assert (tcp_check_conn(tcp_conn)); } /* * $PchId: tcp_send.c,v 1.12 1996/12/17 07:57:11 philip Exp $ */ /* type.h Copyright 1995 Philip Homburg */ #ifndef INET_TYPE_H #define INET_TYPE_H typedef struct acc *(*get_userdata_t) ARGS(( int fd, size_t offset, size_t count, int for_ioctl )); typedef int (*put_userdata_t) ARGS(( int fd, size_t offset, struct acc *data, int for_ioctl )); typedef void (*put_pkt_t) ARGS(( int fd, struct acc *data, size_t datalen )); #endif /* INET_TYPE_H */ /* * $PchId: type.h,v 1.5 1995/11/21 06:51:58 philip Exp $ */ /* udp.c Copyright 1995 Philip Homburg */ #include "inet.h" #include "type.h" #include "assert.h" #include "buf.h" #include "clock.h" #include "icmp_lib.h" #include "io.h" #include "ip.h" #include "sr.h" #include "udp.h" THIS_FILE #define UDP_FD_NR (4*IP_PORT_MAX) #define UDP_PORT_HASH_NR 16 /* Must be a power of 2 */ typedef struct udp_port { int up_flags; int up_state; int up_ipfd; int up_ipdev; acc_t *up_wr_pack; ipaddr_t up_ipaddr; struct udp_fd *up_next_fd; struct udp_fd *up_write_fd; struct udp_fd *up_port_any; struct udp_fd *up_port_hash[UDP_PORT_HASH_NR]; } udp_port_t; #define UPF_EMPTY 0x0 #define UPF_WRITE_IP 0x1 #define UPF_WRITE_SP 0x2 #define UPF_READ_IP 0x4 #define UPF_READ_SP 0x8 #define UPF_SUSPEND 0x10 #define UPF_MORE2WRITE 0x20 #define UPS_EMPTY 0 #define UPS_SETPROTO 1 #define UPS_GETCONF 2 #define UPS_MAIN 3 #define UPS_ERROR 4 typedef struct udp_fd { int uf_flags; udp_port_t *uf_port; ioreq_t uf_ioreq; int uf_srfd; nwio_udpopt_t uf_udpopt; get_userdata_t uf_get_userdata; put_userdata_t uf_put_userdata; acc_t *uf_rdbuf_head; acc_t *uf_rdbuf_tail; size_t uf_rd_count; size_t uf_wr_count; time_t uf_exp_tim; struct udp_fd *uf_port_next; } udp_fd_t; #define UFF_EMPTY 0x0 #define UFF_INUSE 0x1 #define UFF_IOCTL_IP 0x2 #define UFF_READ_IP 0x4 #define UFF_WRITE_IP 0x8 #define UFF_OPTSET 0x10 FORWARD void read_ip_packets ARGS(( udp_port_t *udp_port )); FORWARD void udp_buffree ARGS(( int priority )); #ifdef BUF_CONSISTENCY_CHECK FORWARD void udp_bufcheck ARGS(( void )); #endif FORWARD void udp_main ARGS(( udp_port_t *udp_port )); FORWARD acc_t *udp_get_data ARGS(( int fd, size_t offset, size_t count, int for_ioctl )); FORWARD int udp_put_data ARGS(( int fd, size_t offset, acc_t *data, int for_ioctl )); FORWARD void udp_restart_write_port ARGS(( udp_port_t *udp_port )); FORWARD void udp_ip_arrived ARGS(( int port, acc_t *pack, size_t pack_size )); FORWARD void reply_thr_put ARGS(( udp_fd_t *udp_fd, int reply, int for_ioctl )); FORWARD void reply_thr_get ARGS(( udp_fd_t *udp_fd, int reply, int for_ioctl )); FORWARD int udp_setopt ARGS(( udp_fd_t *udp_fd )); FORWARD udpport_t find_unused_port ARGS(( int fd )); FORWARD int is_unused_port ARGS(( Udpport_t port )); FORWARD int udp_packet2user ARGS(( udp_fd_t *udp_fd )); FORWARD void restart_write_fd ARGS(( udp_fd_t *udp_fd )); FORWARD u16_t pack_oneCsum ARGS(( acc_t *pack )); FORWARD void udp_rd_enqueue ARGS(( udp_fd_t *udp_fd, acc_t *pack, time_t exp_tim )); FORWARD void hash_fd ARGS(( udp_fd_t *udp_fd )); FORWARD void unhash_fd ARGS(( udp_fd_t *udp_fd )); PRIVATE udp_port_t *udp_port_table; PRIVATE udp_fd_t udp_fd_table[UDP_FD_NR]; PUBLIC void udp_prep() { udp_port_table= alloc(ip_conf_nr * sizeof(udp_port_table[0])); } PUBLIC void udp_init() { udp_fd_t *udp_fd; udp_port_t *udp_port; struct ip_conf *icp; int i, j; assert (BUF_S >= sizeof(struct nwio_ipopt)); assert (BUF_S >= sizeof(struct nwio_ipconf)); assert (BUF_S >= sizeof(struct nwio_udpopt)); assert (BUF_S >= sizeof(struct udp_io_hdr)); assert (UDP_HDR_SIZE == sizeof(udp_hdr_t)); assert (UDP_IO_HDR_SIZE == sizeof(udp_io_hdr_t)); #if ZERO for (i= 0, udp_fd= udp_fd_table; iuf_flags= UFF_EMPTY; udp_fd->uf_rdbuf_head= NULL; } #endif #ifndef BUF_CONSISTENCY_CHECK bf_logon(udp_buffree); #else bf_logon(udp_buffree, udp_bufcheck); #endif for (i= 0, udp_port= udp_port_table, icp= ip_conf; iup_ipdev= i; #if ZERO udp_port->up_flags= UPF_EMPTY; udp_port->up_state= UPS_EMPTY; #endif udp_port->up_next_fd= udp_fd_table; #if ZERO udp_port->up_write_fd= NULL; udp_port->up_port_any= NULL; for (j= 0; jup_port_hash[j]= NULL; #endif sr_add_minor(if2minor(icp->ic_ifno, UDP_DEV_OFF), i, udp_open, udp_close, udp_read, udp_write, udp_ioctl, udp_cancel); udp_main(udp_port); } } PRIVATE void udp_main(udp_port) udp_port_t *udp_port; { udp_fd_t *udp_fd; int result, i; switch (udp_port->up_state) { case UPS_EMPTY: udp_port->up_state= UPS_SETPROTO; udp_port->up_ipfd= ip_open(udp_port->up_ipdev, udp_port->up_ipdev, udp_get_data, udp_put_data, udp_ip_arrived); if (udp_port->up_ipfd < 0) { udp_port->up_state= UPS_ERROR; DBLOCK(1, printf("%s, %d: unable to open ip port\n", __FILE__, __LINE__)); return; } result= ip_ioctl(udp_port->up_ipfd, NWIOSIPOPT); if (result == NW_SUSPEND) udp_port->up_flags |= UPF_SUSPEND; if (result<0) { return; } if (udp_port->up_state != UPS_GETCONF) return; /* drops through */ case UPS_GETCONF: udp_port->up_flags &= ~UPF_SUSPEND; result= ip_ioctl(udp_port->up_ipfd, NWIOGIPCONF); if (result == NW_SUSPEND) udp_port->up_flags |= UPF_SUSPEND; if (result<0) { return; } if (udp_port->up_state != UPS_MAIN) return; /* drops through */ case UPS_MAIN: udp_port->up_flags &= ~UPF_SUSPEND; for (i= 0, udp_fd= udp_fd_table; iuf_flags & UFF_INUSE)) continue; if (udp_fd->uf_port != udp_port) continue; if (udp_fd->uf_flags & UFF_IOCTL_IP) udp_ioctl(i, udp_fd->uf_ioreq); } read_ip_packets(udp_port); return; #if !CRAMPED default: DBLOCK(1, printf("udp_port_table[%d].up_state= %d\n", udp_port->up_ipdev, udp_port->up_state)); ip_panic(( "unknown state" )); #endif } } int udp_open (port, srfd, get_userdata, put_userdata, put_pkt) int port; int srfd; get_userdata_t get_userdata; put_userdata_t put_userdata; put_pkt_t put_pkt; { int i; udp_fd_t *udp_fd; for (i= 0; i= UDP_FD_NR) { DBLOCK(1, printf("out of fds\n")); return EAGAIN; } udp_fd= &udp_fd_table[i]; udp_fd->uf_flags= UFF_INUSE; udp_fd->uf_port= &udp_port_table[port]; udp_fd->uf_srfd= srfd; udp_fd->uf_udpopt.nwuo_flags= UDP_DEF_OPT; udp_fd->uf_get_userdata= get_userdata; udp_fd->uf_put_userdata= put_userdata; assert(udp_fd->uf_rdbuf_head == NULL); udp_fd->uf_port_next= NULL; return i; } PRIVATE acc_t *udp_get_data (port, offset, count, for_ioctl) int port; size_t offset; size_t count; int for_ioctl; { udp_port_t *udp_port; udp_fd_t *udp_fd; int result; udp_port= &udp_port_table[port]; switch(udp_port->up_state) { case UPS_SETPROTO: assert (for_ioctl); if (!count) { result= (int)offset; if (result<0) { udp_port->up_state= UPS_ERROR; break; } udp_port->up_state= UPS_GETCONF; if (udp_port->up_flags & UPF_SUSPEND) udp_main(udp_port); return NULL; } else { struct nwio_ipopt *ipopt; acc_t *acc; assert (!offset); assert (count == sizeof(*ipopt)); acc= bf_memreq(sizeof(*ipopt)); ipopt= (struct nwio_ipopt *)ptr2acc_data(acc); ipopt->nwio_flags= NWIO_COPY | NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | NWIO_PROTOSPEC | NWIO_HDR_O_ANY | NWIO_RWDATALL; ipopt->nwio_proto= IPPROTO_UDP; return acc; } case UPS_MAIN: assert (!for_ioctl); assert (udp_port->up_flags & UPF_WRITE_IP); if (!count) { result= (int)offset; assert (udp_port->up_wr_pack); bf_afree(udp_port->up_wr_pack); udp_port->up_wr_pack= 0; if (udp_port->up_flags & UPF_WRITE_SP) { if (udp_port->up_write_fd) { udp_fd= udp_port->up_write_fd; udp_port->up_write_fd= NULL; udp_fd->uf_flags &= ~UFF_WRITE_IP; reply_thr_get(udp_fd, result, FALSE); } udp_port->up_flags &= ~(UPF_WRITE_SP | UPF_WRITE_IP); if (udp_port->up_flags & UPF_MORE2WRITE) { udp_restart_write_port(udp_port); } } else udp_port->up_flags &= ~UPF_WRITE_IP; } else { return bf_cut (udp_port->up_wr_pack, offset, count); } break; default: #if !CRAMPED printf("udp_get_data(%d, 0x%x, 0x%x) called but up_state= 0x%x\n", port, offset, count, udp_port->up_state); #endif break; } return NULL; } PRIVATE int udp_put_data (fd, offset, data, for_ioctl) int fd; size_t offset; acc_t *data; int for_ioctl; { udp_port_t *udp_port; int result; udp_port= &udp_port_table[fd]; switch (udp_port->up_state) { case UPS_GETCONF: * * * ******************* *!*"*#*$*%* if (!data) { result= (int)offset; if (result<0) { udp_port->up_state= UPS_ERROR; return NW_OK; } udp_port->up_state= UPS_MAIN; if (udp_port->up_flags & UPF_SUSPEND) udp_main(udp_port); } else { struct nwio_ipconf *ipconf; data= bf_packIffLess(data, sizeof(*ipconf)); ipconf= (struct nwio_ipconf *)ptr2acc_data(data); assert (ipconf->nwic_flags & NWIC_IPADDR_SET); udp_port->up_ipaddr= ipconf->nwic_ipaddr; bf_afree(data); } break; case UPS_MAIN: assert(0); assert (udp_port->up_flags & UPF_READ_IP); if (!data) { result= (int)offset; compare (result, >=, 0); if (udp_port->up_flags & UPF_READ_SP) { udp_port->up_flags &= ~(UPF_READ_SP| UPF_READ_IP); read_ip_packets(udp_port); } else udp_port->up_flags &= ~UPF_READ_IP; } else { assert (!offset); /* This isn't a valid assertion but ip sends only * whole datagrams up */ udp_ip_arrived(fd, data, bf_bufsize(data)); } break; #if !CRAMPED default: ip_panic(( "udp_put_data(%d, 0x%x, 0x%x) called but up_state= 0x%x\n", fd, offset, data, udp_port->up_state )); #endif } return NW_OK; } int udp_ioctl (fd, req) int fd; ioreq_t req; { udp_fd_t *udp_fd; udp_port_t *udp_port; nwio_udpopt_t *udp_opt; acc_t *opt_acc; int result; udp_fd= &udp_fd_table[fd]; assert (udp_fd->uf_flags & UFF_INUSE); udp_port= udp_fd->uf_port; udp_fd->uf_flags |= UFF_IOCTL_IP; udp_fd->uf_ioreq= req; if (udp_port->up_state != UPS_MAIN) return NW_SUSPEND; switch(req) { case NWIOSUDPOPT: result= udp_setopt(udp_fd); break; case NWIOGUDPOPT: opt_acc= bf_memreq(sizeof(*udp_opt)); assert (opt_acc->acc_length == sizeof(*udp_opt)); udp_opt= (nwio_udpopt_t *)ptr2acc_data(opt_acc); *udp_opt= udp_fd->uf_udpopt; udp_opt->nwuo_locaddr= udp_fd->uf_port->up_ipaddr; result= (*udp_fd->uf_put_userdata)(udp_fd->uf_srfd, 0, opt_acc, TRUE); if (result == NW_OK) reply_thr_put(udp_fd, NW_OK, TRUE); break; default: reply_thr_get(udp_fd, EBADIOCTL, TRUE); result= NW_OK; break; } if (result != NW_SUSPEND) udp_fd->uf_flags &= ~UFF_IOCTL_IP; return result; } PRIVATE int udp_setopt(udp_fd) udp_fd_t *udp_fd; { udp_fd_t *fd_ptr; nwio_udpopt_t oldopt, newopt; acc_t *data; int result; udpport_t port; unsigned int new_en_flags, new_di_flags, old_en_flags, old_di_flags, all_flags, flags; unsigned long new_flags; int i; data= (*udp_fd->uf_get_userdata)(udp_fd->uf_srfd, 0, sizeof(nwio_udpopt_t), TRUE); if (!data) return EFAULT; data= bf_packIffLess(data, sizeof(nwio_udpopt_t)); assert (data->acc_length == sizeof(nwio_udpopt_t)); newopt= *(nwio_udpopt_t *)ptr2acc_data(data); bf_afree(data); oldopt= udp_fd->uf_udpopt; old_en_flags= oldopt.nwuo_flags & 0xffff; old_di_flags= (oldopt.nwuo_flags >> 16) & 0xffff; new_en_flags= newopt.nwuo_flags & 0xffff; new_di_flags= (newopt.nwuo_flags >> 16) & 0xffff; if (new_en_flags & new_di_flags) { DBLOCK(1, printf("returning EBADMODE\n")); reply_thr_get(udp_fd, EBADMODE, TRUE); return NW_OK; } /* NWUO_ACC_MASK */ if (new_di_flags & NWUO_ACC_MASK) { DBLOCK(1, printf("returning EBADMODE\n")); reply_thr_get(udp_fd, EBADMODE, TRUE); return NW_OK; /* access modes can't be disabled */ } if (!(new_en_flags & NWUO_ACC_MASK)) new_en_flags |= (old_en_flags & NWUO_ACC_MASK); /* NWUO_LOCPORT_MASK */ if (new_di_flags & NWUO_LOCPORT_MASK) { DBLOCK(1, printf("returning EBADMODE\n")); reply_thr_get(udp_fd, EBADMODE, TRUE); return NW_OK; /* the loc ports can't be disabled */ } if (!(new_en_flags & NWUO_LOCPORT_MASK)) { new_en_flags |= (old_en_flags & NWUO_LOCPORT_MASK); newopt.nwuo_locport= oldopt.nwuo_locport; } else if ((new_en_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SEL) { newopt.nwuo_locport= find_unused_port(udp_fd-udp_fd_table); } else if ((new_en_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET) { if (!newopt.nwuo_locport) { DBLOCK(1, printf("returning EBADMODE\n")); reply_thr_get(udp_fd, EBADMODE, TRUE); return NW_OK; } } /* NWUO_LOCADDR_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_LOCADDR_MASK)) { new_en_flags |= (old_en_flags & NWUO_LOCADDR_MASK); new_di_flags |= (old_di_flags & NWUO_LOCADDR_MASK); } /* NWUO_BROAD_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_BROAD_MASK)) { new_en_flags |= (old_en_flags & NWUO_BROAD_MASK); new_di_flags |= (old_di_flags & NWUO_BROAD_MASK); } /* NWUO_REMPORT_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_REMPORT_MASK)) { new_en_flags |= (old_en_flags & NWUO_REMPORT_MASK); new_di_flags |= (old_di_flags & NWUO_REMPORT_MASK); newopt.nwuo_remport= oldopt.nwuo_remport; } /* NWUO_REMADDR_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_REMADDR_MASK)) { new_en_flags |= (old_en_flags & NWUO_REMADDR_MASK); new_di_flags |= (old_di_flags & NWUO_REMADDR_MASK); newopt.nwuo_remaddr= oldopt.nwuo_remaddr; } /* NWUO_RW_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_RW_MASK)) { new_en_flags |= (old_en_flags & NWUO_RW_MASK); new_di_flags |= (old_di_flags & NWUO_RW_MASK); } /* NWUO_IPOPT_MASK */ if (!((new_en_flags | new_di_flags) & NWUO_IPOPT_MASK)) { new_en_flags |= (old_en_flags & NWUO_IPOPT_MASK); new_di_flags |= (old_di_flags & NWUO_IPOPT_MASK); } new_flags= ((unsigned long)new_di_flags << 16) | new_en_flags; if ((new_flags & NWUO_RWDATONLY) && ((new_flags & NWUO_LOCPORT_MASK) == NWUO_LP_ANY || (new_flags & (NWUO_RP_ANY|NWUO_RA_ANY|NWUO_EN_IPOPT)))) { DBLOCK(1, printf("returning EBADMODE\n")); reply_thr_get(udp_fd, EBADMODE, TRUE); return NW_OK; } /* Check the access modes */ if ((new_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SEL || (new_flags & NWUO_LOCPORT_MASK) == NWUO_LP_SET) { for (i= 0, fd_ptr= udp_fd_table; iuf_flags & UFF_INUSE)) continue; if (fd_ptr->uf_port != udp_fd->uf_port) continue; flags= fd_ptr->uf_udpopt.nwuo_flags; if ((flags & NWUO_LOCPORT_MASK) != NWUO_LP_SEL && (flags & NWUO_LOCPORT_MASK) != NWUO_LP_SET) continue; if (fd_ptr->uf_udpopt.nwuo_locport != newopt.nwuo_locport) { continue; } if ((flags & NWUO_ACC_MASK) != (new_flags & NWUO_ACC_MASK)) { DBLOCK(1, printf( "address inuse: new fd= %d, old_fd= %d, port= %u\n", udp_fd-udp_fd_table, fd_ptr-udp_fd_table, newopt.nwuo_locport)); reply_thr_get(udp_fd, EADDRINUSE, TRUE); return NW_OK; } } } if (udp_fd->uf_flags & UFF_OPTSET) unhash_fd(udp_fd); newopt.nwuo_flags= new_flags; udp_fd->uf_udpopt= newopt; all_flags= new_en_flags | new_di_flags; if ((all_flags & NWUO_ACC_MASK) && (all_flags & NWUO_LOCPORT_MASK) && (all_flags & NWUO_LOCADDR_MASK) && (all_flags & NWUO_BROAD_MASK) && (all_flags & NWUO_REMPORT_MASK) && (all_flags & NWUO_REMADDR_MASK) && (all_flags & NWUO_RW_MASK) && (all_flags & NWUO_IPOPT_MASK)) udp_fd->uf_flags |= UFF_OPTSET; else { udp_fd->uf_flags &= ~UFF_OPTSET; } if (udp_fd->uf_flags & UFF_OPTSET) hash_fd(udp_fd); reply_thr_get(udp_fd, NW_OK, TRUE); return NW_OK; } PRIVATE udpport_t find_unused_port(fd) int fd; { udpport_t port, nw_port; nw_port= htons(0xC000+fd); if (is_unused_port(nw_port)) return nw_port; for (port= 0xC000+UDP_FD_NR; port < 0xFFFF; port++) { nw_port= htons(port); if (is_unused_port(nw_port)) return nw_port; } #if !CRAMPED ip_panic(( "unable to find unused port (shouldn't occur)" )); return 0; #endif } /* reply_thr_put */ PRIVATE void reply_thr_put(udp_fd, reply, for_ioctl) udp_fd_t *udp_fd; int reply; int for_ioctl; { int result; result= (*udp_fd->uf_put_userdata)(udp_fd->uf_srfd, reply, (acc_t *)0, for_ioctl); assert(result == NW_OK); } /* reply_thr_get */ PRIVATE void reply_thr_get(udp_fd, reply, for_ioctl) udp_fd_t *udp_fd; int reply; int for_ioctl; { acc_t *result; result= (*udp_fd->uf_get_userdata)(udp_fd->uf_srfd, reply, (size_t)0, for_ioctl); assert (!result); } PRIVATE int is_unused_port(port) udpport_t port; { int i; udp_fd_t *udp_fd; for (i= 0, udp_fd= udp_fd_table; iuf_flags & UFF_OPTSET)) continue; if (udp_fd->uf_udpopt.nwuo_locport == port) return FALSE; } return TRUE; } PRIVATE void read_ip_packets(udp_port) udp_port_t *udp_port; { int result; do { udp_port->up_flags |= UPF_READ_IP; result= ip_read(udp_port->up_ipfd, UDP_MAX_DATAGRAM); if (result == NW_SUSPEND) { udp_port->up_flags |= UPF_READ_SP; return; } assert(result == NW_OK); udp_port->up_flags &= ~UPF_READ_IP; } while(!(udp_port->up_flags & UPF_READ_IP)); } PUBLIC int udp_read (fd, count) int fd; size_t count; { udp_fd_t *udp_fd; acc_t *tmp_acc, *next_acc; udp_fd= &udp_fd_table[fd]; if (!(udp_fd->uf_flags & UFF_OPTSET)) { reply_thr_put(udp_fd, EBADMODE, FALSE); return NW_OK; } udp_fd->uf_rd_count= count; if (udp_fd->uf_rdbuf_head) { if (get_time() <= udp_fd->uf_exp_tim) return udp_packet2user (udp_fd); tmp_acc= udp_fd->uf_rdbuf_head; while (tmp_acc) { next_acc= tmp_acc->acc_ext_link; bf_afree(tmp_acc); tmp_acc= next_acc; } udp_fd->uf_rdbuf_head= NULL; } udp_fd->uf_flags |= UFF_READ_IP; return NW_SUSPEND; } PRIVATE int udp_packet2user (udp_fd) udp_fd_t *udp_fd; { acc_t *pack, *tmp_pack; udp_io_hdr_t *hdr; int result, hdr_len; size_t size, transf_size; pack= udp_fd->uf_rdbuf_head; udp_fd->uf_rdbuf_head= pack->acc_ext_link; size= bf_bufsize (pack); if (udp_fd->uf_udpopt.nwuo_flags & NWUO_RWDATONLY) { pack= bf_packIffLess (pack, UDP_IO_HDR_SIZE); assert (pack->acc_length >= UDP_IO_HDR_SIZE); hdr= (udp_io_hdr_t *)ptr2acc_data(pack); #if CONF_UDP_IO_NW_BYTE_ORDER hdr_len= UDP_IO_HDR_SIZE+NTOHS(hdr->uih_ip_opt_len); #else hdr_len= UDP_IO_HDR_SIZE+hdr->uih_ip_opt_len; #endif assert (size>= hdr_len); size -= hdr_len; tmp_pack= bf_cut(pack, hdr_len, size); bf_afree(pack); pack= tmp_pack; } if (size>udp_fd->uf_rd_count) { tmp_pack= bf_cut (pack, 0, udp_fd->uf_rd_count); bf_afree(pack); pack= tmp_pack; transf_size= udp_fd->uf_rd_count; } else transf_size= size; result= (*udp_fd->uf_put_userdata)(udp_fd->uf_srfd, (size_t)0, pack, FALSE); if (result >= 0) if (size > transf_size) result= EPACKSIZE; else result= transf_size; udp_fd->uf_flags &= ~UFF_READ_IP; result= (*udp_fd->uf_put_userdata)(udp_fd->uf_srfd, result, (acc_t *)0, FALSE); assert (result == 0); return result; } PRIVATE void udp_ip_arrived(port, pack, pack_size) int port; acc_t *pack; size_t pack_size; { udp_port_t *udp_port; udp_fd_t *udp_fd, *share_fd; acc_t *ip_hdr_acc, *udp_acc, *ipopt_pack, *no_ipopt_pack, *tmp_acc; ip_hdr_t *ip_hdr; udp_hdr_t *udp_hdr; udp_io_hdr_t *udp_io_hdr; size_t ip_hdr_size, udp_size, data_size, opt_size; ipaddr_t src_addr, dst_addr; udpport_t src_port, dst_port; u8_t u16[2]; u16_t chksum; unsigned long dst_type, flags; time_t exp_tim; int i, delivered, hash; udp_port= &udp_port_table[port]; ip_hdr_acc= bf_cut(pack, 0, IP_MIN_HDR_SIZE); ip_hdr_acc= bf_packIffLess(ip_hdr_acc, IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_hdr_acc); ip_hdr_size= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (ip_hdr_size != IP_MIN_HDR_SIZE) { bf_afree(ip_hdr_acc); ip_hdr_acc= bf_cut(pack, 0, ip_hdr_size); ip_hdr_acc= bf_packIffLess(ip_hdr_acc, ip_hdr_size); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_hdr_acc); } udp_acc= bf_delhead(pack, ip_hdr_size); pack= NULL; pack_size -= ip_hdr_size; if (pack_size < UDP_HDR_SIZE) { DBLOCK(1, printf("packet too small\n")); bf_afree(ip_hdr_acc); bf_afree(udp_acc); return; } udp_acc= bf_packIffLess(udp_acc, UDP_HDR_SIZE); udp_hdr= (udp_hdr_t *)ptr2acc_data(udp_acc); udp_size= ntohs(udp_hdr->uh_length); if (udp_size > pack_size) { DBLOCK(1, printf("packet too large\n")); bf_afree(ip_hdr_acc); bf_afree(udp_acc); return; } src_addr= ip_hdr->ih_src; dst_addr= ip_hdr->ih_dst; if (udp_hdr->uh_chksum) { u16[0]= 0; u16[1]= ip_hdr->ih_proto; chksum= pack_oneCsum(udp_acc); chksum= oneC_sum(chksum, (u16_t *)&src_addr, sizeof(ipaddr_t)); chksum= oneC_sum(chksum, (u16_t *)&dst_addr, sizeof(ipaddr_t)); chksum= oneC_sum(chksum, (u16_t *)u16, sizeof(u16)); chksum= oneC_sum(chksum, (u16_t *)&udp_hdr->uh_length, sizeof(udp_hdr->uh_length)); if (~chksum & 0xffff) { DBLOCK(1, printf("checksum error in udp packet\n"); printf("src ip_addr= "); writeIpAddr(src_addr); printf(" dst ip_addr= "); writeIpAddr(dst_addr); printf("\n"); printf("packet chksum= 0x%x, sum= 0x%x\n", udp_hdr->uh_chksum, chksum)); bf_afree(ip_hdr_acc); bf_afree(udp_acc); return; } } exp_tim= get_time() + UDP_READ_EXP_TIME; src_port= udp_hdr->uh_src_port; dst_port= udp_hdr->uh_dst_port; /* Send an ICMP port unreachable if the packet could not be * delivered. */ delivered= 0; if (dst_addr == udp_port->up_ipaddr) dst_type= NWUO_EN_LOC; else { dst_type= NWUO_EN_BROAD; /* Don't send ICMP error packets for broadcast packets */ delivered= 1; } DBLOCK(0x20, printf("udp: got packet from "); writeIpAddr(src_addr); printf(".%u to ", ntohs(src_port)); writeIpAddr(dst_addr); printf(".%u\n", ntohs(dst_port))); no_ipopt_pack= bf_memreq(UDP_IO_HDR_SIZE); udp_io_hdr= (udp_io_hdr_t *)ptr2acc_data(no_ipopt_pack); udp_io_hdr->uih_src_addr= src_addr; udp_io_hdr->uih_dst_addr= dst_addr; udp_io_hdr->uih_src_port= src_port; udp_io_hdr->uih_dst_port= dst_port; data_size = udp_size-UDP_HDR_SIZE; #if CONF_UDP_IO_NW_BYTE_ORDER udp_io_hdr->uih_ip_opt_len= HTONS(0); udp_io_hdr->uih_data_len= htons(data_size); #else udp_io_hdr->uih_ip_opt_len= 0; udp_io_hdr->uih_data_len= data_size; #endif no_ipopt_pack->acc_next= bf_cut(udp_acc, UDP_HDR_SIZE, data_size); if (ip_hdr_size == IP_MIN_HDR_SIZE) { ipopt_pack= no_ipopt_pack; ipopt_pack->acc_linkC++; } else { ipopt_pack= bf_memreq(UDP_IO_HDR_SIZE); *(udp_io_hdr_t *)ptr2acc_data(ipopt_pack)= *udp_io_hdr; udp_io_hdr= (udp_io_hdr_t *)ptr2acc_data(ipopt_pack); opt_size = ip_hdr_size-IP_MIN_HDR_SIZE; #if CONF_UDP_IO_NW_BYTE_ORDER udp_io_hdr->uih_ip_opt_len= htons(opt_size); #else udp_io_hdr->uih_ip_opt_len= opt_size; #endif tmp_acc= bf_cut(ip_hdr_acc, (size_t)IP_MIN_HDR_SIZE, opt_size); assert(tmp_acc->acc_linkC == 1); assert(tmp_acc->acc_next == NULL); ipopt_pack->acc_next= tmp_acc; tmp_acc->acc_next= no_ipopt_pack->acc_next; if (tmp_acc->acc_next) tmp_acc->acc_next->acc_linkC++; } hash= dst_port; hash ^= (hash >> 8); hash &= (UDP_PORT_HASH_NR-1); for (i= 0; i<2; i++) { share_fd= NULL; udp_fd= (i == 0) ? udp_port->up_port_any : udp_port->up_port_hash[hash]; for (; udp_fd; udp_fd= udp_fd->uf_port_next) { if (i && udp_fd->uf_udpopt.nwuo_locport != dst_port) continue; assert(udp_fd->uf_flags & UFF_INUSE); assert(udp_fd->uf_flags & UFF_OPTSET); if (udp_fd->uf_port != udp_port) continue; flags= udp_fd->uf_udpopt.nwuo_flags; if (!(flags & dst_type)) continue; if ((flags & NWUO_RP_SET) && udp_fd->uf_udpopt.nwuo_remport != src_port) { continue; } if ((flags & NWUO_RA_SET) && udp_fd->uf_udpopt.nwuo_remaddr != src_addr) { continue; } if (i) { /* Packet is considdered to be delivered */ delivered= 1; } if ((flags & NWUO_ACC_MASK) == NWUO_SHARED && (!share_fd || !udp_fd->uf_rdbuf_head)) { share_fd= udp_fd; continue; } if (flags & NWUO_EN_IPOPT) pack= ipopt_pack; else pack= no_ipopt_pack; pack->acc_linkC++; udp_rd_enqueue(udp_fd, pack, exp_tim); if (udp_fd->uf_flags & UFF_READ_IP) udp_packet2user(udp_fd); } if (share_fd) { flags= share_fd->uf_udpopt.nwuo_flags; if (flags & NWUO_EN_IPOPT) pack= ipopt_pack; else pack= no_ipopt_pack; pack->acc_linkC++; udp_rd_enqueue(share_fd, pack, exp_tim); if (share_fd->uf_flags & UFF_READ_IP) udp_packet2user(share_fd); } } if (ipopt_pack) bf_afree(ipopt_pack); if (no_ipopt_pack) bf_afree(no_ipopt_pack); if (!delivered) { DBLOCK(0x2, printf("udp: could not deliver packet from "); writeIpAddr(src_addr); printf(".%u to ", ntohs(src_port)); writeIpAddr(dst_addr); printf(".%u\n", ntohs(dst_port))); pack= bf_append(ip_hdr_acc, udp_acc); ip_hdr_acc= NULL; udp_acc= NULL; icmp_snd_unreachable(udp_port->up_ipdev, pack, ICMP_PORT_UNRCH); return; } assert (ip_hdr_acc); bf_afree(ip_hdr_acc); assert (udp_acc); bf_afree(udp_acc); } PUBLIC void udp_close(fd) int fd; { udp_fd_t *udp_fd; acc_t *tmp_acc, *next_acc; udp_fd= &udp_fd_table[fd]; assert (udp_fd->uf_flags & UFF_INUSE); if (udp_fd->uf_flags & UFF_OPTSET) unhash_fd(udp_fd); udp_fd->uf_flags= UFF_EMPTY; tmp_acc= udp_fd->uf_rdbuf_head; while (tmp_acc) { next_acc= tmp_acc->acc_ext_link; bf_afree(tmp_acc); tmp_acc= next_acc; } udp_fd->uf_rdbuf_head= NULL; } PUBLIC int udp_write(fd, count) int fd; size_t count; { udp_fd_t *udp_fd; udp_port_t *udp_port; udp_fd= &udp_fd_table[fd]; udp_port= udp_fd->uf_port; if (!(udp_fd->uf_flags & UFF_OPTSET)) { reply_thr_get (udp_fd, EBADMODE, FALSE); return NW_OK; } assert (!(udp_fd->uf_flags & UFF_WRITE_IP)); udp_fd->uf_wr_count= count; udp_fd->uf_flags |= UFF_WRITE_IP; restart_write_fd(udp_fd); if (udp_fd->uf_flags & UFF_WRITE_IP) { DBLOCK(1, printf("replying NW_SUSPEND\n")); return NW_SUSPEND; } else { return NW_OK; } } PRIVATE void restart_write_fd(udp_fd) udp_fd_t *udp_fd; { udp_port_t *udp_port; acc_t *pack, *ip_hdr_pack, *udp_hdr_pack, *ip_opt_pack, *user_data; udp_hdr_t *udp_hdr; udp_io_hdr_t *udp_io_hdr; ip_hdr_t *ip_hdr; size_t ip_opt_size, user_data_size; unsigned long flags; u16_t chksum; u8_t u16[2]; int result; udp_port= udp_fd->uf_port; if (udp_port->up_flags & UPF_WRITE_IP) { udp_port->up_flags |= UPF_MORE2WRITE; return; } assert (udp_fd->uf_flags & UFF_WRITE_IP); udp_fd->uf_flags &= ~UFF_WRITE_IP; assert (!udp_port->up_wr_pack); pack= (*udp_fd->uf_get_userdata)(udp_fd->uf_srfd, 0, udp_fd->uf_wr_count, FALSE); if (!pack) { udp_fd->uf_flags &= ~UFF_WRITE_IP; reply_thr_get (udp_fd, EFAULT, FALSE); return; } flags= udp_fd->uf_udpopt.nwuo_flags; ip_hdr_pack= bf_memreq(IP_MIN_HDR_SIZE); ip_hdr= (ip_hdr_t *)ptr2acc_data(ip_hdr_pack); udp_hdr_pack= bf_memreq(UDP_HDR_SIZE); udp_hdr= (udp_hdr_t *)ptr2acc_data(udp_hdr_pack); if (flags & NWUO_RWDATALL) { pack= bf_packIffLess(pack, UDP_IO_HDR_SIZE); udp_io_hdr= (udp_io_hdr_t *)ptr2acc_data(pack); #if CONF_UDP_IO_NW_BYTE_ORDER ip_opt_size= ntohs(udp_io_hdr->uih_ip_opt_len); #else ip_opt_size= udp_io_hdr->uih_ip_opt_len; #endif if (UDP_IO_HDR_SIZE+ip_opt_size>udp_fd->uf_wr_count) { bf_afree(ip_hdr_pack); bf_afree(udp_hdr_pack); bf_afree(pack); reply_thr_get (udp_fd, EINVAL, FALSE); return; } if (ip_opt_size & 3) { bf_afree(ip_hdr_pack); bf_afree(udp_hdr_pack); bf_afree(pack); reply_thr_get (udp_fd, EFAULT, FALSE); return; } if (ip_opt_size) ip_opt_pack= bf_cut(pack, UDP_IO_HDR_SIZE, ip_opt_size); else ip_opt_pack= 0; user_data_size= udp_fd->uf_wr_count-UDP_IO_HDR_SIZE- ip_opt_size; user_data= bf_cut(pack, UDP_IO_HDR_SIZE+ip_opt_size, user_data_size); bf_afree(pack); } else { udp_io_hdr= 0; ip_opt_size= 0; user_data_size= udp_fd->uf_wr_count; ip_opt_pack= 0; user_data= pack; } ip_hdr->ih_vers_ihl= (IP_MIN_HDR_SIZE+ip_opt_size) >> 2; ip_hdr->ih_tos= UDP_TOS; ip_hdr->ih_flags_fragoff= HTONS(UDP_IP_FLAGS); ip_hdr->ih_ttl= UDP_TTL; ip_hdr->ih_proto= IPPROTO_UDP; if (flags & NWUO_RA_SET) { DBLOCK(1, printf("NWUO_RA_SET\n")); ip_hdr->ih_dst= udp_fd->uf_udpopt.nwuo_remaddr; } else { assert (udp_io_hdr); ip_hdr->ih_dst= udp_io_hdr->uih_dst_addr; } if ((flags & NWUO_LOCPORT_MASK) != NWUO_LP_ANY) udp_hdr->uh_src_port= udp_fd->uf_udpopt.nwuo_locport; else { assert (udp_io_hdr); udp_hdr->uh_src_port= udp_io_hdr->uih_src_port; } if (flags & NWUO_RP_SET) udp_hdr->uh_dst_port= udp_fd->uf_udpopt.nwuo_remport; else { assert (udp_io_hdr); udp_hdr->uh_dst_port= udp_io_hdr->uih_dst_port; } udp_hdr->uh_length= htons(UDP_HDR_SIZE+user_data_size); udp_hdr->uh_chksum= 0; udp_hdr_pack->acc_next= user_data; chksum= pack_oneCsum(udp_hdr_pack); chksum= oneC_sum(chksum, (u16_t *)&udp_fd->uf_port->up_ipaddr, sizeof(ipaddr_t)); chksum= oneC_sum(chksum, (u16_t *)&ip_hdr->ih_dst, sizeof(ipaddr_t)); u16[0]= 0; u16[1]= IPPROTO_UDP; chksum= oneC_sum(chksum, (u16_t *)u16, sizeof(u16)); chksum= oneC_sum(chksum, (u16_t *)&udp_hdr->uh_length, sizeof(u16_t)); if (~chksum) chksum= ~chksum; udp_hdr->uh_chksum= chksum; if (ip_opt_pack) { ip_opt_pack= bf_packIffLess(ip_opt_pack, ip_opt_size); ip_opt_pack->acc_next= udp_hdr_pack; udp_hdr_pack= ip_opt_pack; } ip_hdr_pack->acc_next= udp_hdr_pack; assert (!udp_port->up_wr_pack); assert (!(udp_port->up_flags & UPF_WRITE_IP)); udp_port->up_wr_pack= ip_hdr_pack; udp_port->up_flags |= UPF_WRITE_IP; result= ip_write(udp_port->up_ipfd, bf_bufsize(ip_hdr_pack)); if (result == NW_SUSPEND) { udp_port->up_flags |= UPF_WRITE_SP; udp_fd->uf_flags |= UFF_WRITE_IP; udp_port->up_write_fd= udp_fd; } else if (result<0) reply_thr_get(udp_fd, result, FALSE); else reply_thr_get (udp_fd, udp_fd->uf_wr_count, FALSE); } PRIVATE u16_t pack_oneCsum(pack) acc_t *pack; { u16_t prev; int odd_byte; char *data_ptr; int length; char byte_buf[2]; assert (pack); prev= 0; odd_byte= FALSE; for (; pack; pack= pack->acc_next) { data_ptr= ptr2acc_data(pack); length= pack->acc_length; if (!length) continue; if (odd_byte) { byte_buf[1]= *data_ptr; prev= oneC_sum(prev, (u16_t *)byte_buf, 2); data_ptr++; length--; odd_byte= FALSE; } if (length & 1) { odd_byte= TRUE; length--; byte_buf[0]= data_ptr[length]; } if (!length) continue; prev= oneC_sum (prev, (u16_t *)data_ptr, length); } if (odd_byte) { byte_buf[1]= 0; prev= oneC_sum (prev, (u16_t *)byte_buf, 1); } return prev; } PRIVATE void udp_restart_write_port(udp_port ) udp_port_t *udp_port; { udp_fd_t *udp_fd; int i; assert (!udp_port->up_wr_pack); assert (!(udp_port->up_flags & (UPF_WRITE_IP|UPF_WRITE_SP))); while (udp_port->up_flags & UPF_MORE2WRITE) { udp_port->up_flags &= ~UPF_MORE2WRITE; for (i= 0, udp_fd= udp_port->up_next_fd; iuf_flags & UFF_INUSE)) continue; if (!(udp_fd->uf_flags & UFF_WRITE_IP)) continue; if (udp_fd->uf_port != udp_port) continue; restart_write_fd(udp_fd); if (udp_port->up_flags & UPF_WRITE_IP) { udp_port->up_next_fd= udp_fd+1; udp_port->up_flags |= UPF_MORE2WRITE; return; } } } } PUBLIC int udp_cancel(fd, which_operation) int fd; int which_operation; { udp_fd_t *udp_fd; DBLOCK(0x10, printf("udp_cancel(%d, %d)\n", fd, which_operation)); udp_fd= &udp_fd_table[fd]; switch (which_operation) { case SR_CANCEL_READ: assert (udp_fd->uf_flags & UFF_READ_IP); udp_fd->uf_flags &= ~UFF_READ_IP; reply_thr_put(udp_fd, EINTR, FALSE); break; case SR_CANCEL_WRITE: assert (udp_fd->uf_flags & UFF_WRITE_IP); udp_fd->uf_flags &= ~UFF_WRITE_IP; if (udp_fd->uf_port->up_write_fd == udp_fd) udp_fd->uf_port->up_write_fd= NULL; reply_thr_get(udp_fd, EINTR, FALSE); break; case SR_CANCEL_IOCTL: assert (udp_fd->uf_flags & UFF_IOCTL_IP); udp_fd->uf_flags &= ~UFF_IOCTL_IP; reply_thr_get(udp_fd, EINTR, TRUE); break; #if !CRAMPED default: ip_panic(( "got unknown cancel request" )); #endif } return NW_OK; } PRIVATE void udp_buffree (priority) int priority; { int i; time_t curr_tim; udp_fd_t *udp_fd; acc_t *tmp_acc, *next_acc; if (priority == UDP_PRI_FDBUFS_EXTRA) { for (i=0, udp_fd= udp_fd_table; iuf_rdbuf_head && udp_fd->uf_rdbuf_head->acc_ext_link) { tmp_acc= udp_fd->uf_rdbuf_head; udp_fd->uf_rdbuf_head= tmp_acc->acc_ext_link; bf_afree(tmp_acc); } } } if (priority == UDP_PRI_FDBUFS) { for (i=0, udp_fd= udp_fd_table; iuf_rdbuf_head) { tmp_acc= udp_fd->uf_rdbuf_head; udp_fd->uf_rdbuf_head= tmp_acc->acc_ext_link; bf_afree(tmp_acc); } } } } PRIVATE void udp_rd_enqueue(udp_fd, pack, exp_tim) udp_fd_t *udp_fd; acc_t *pack; time_t exp_tim; { acc_t *tmp_acc; if (pack->acc_linkC != 1) { tmp_acc= bf_dupacc(pack); bf_afree(pack); pack= tmp_acc; } pack->acc_ext_link= NULL; if (udp_fd->uf_rdbuf_head == NULL) { udp_fd->uf_exp_tim= exp_tim; udp_fd->uf_rdbuf_head= pack; } else udp_fd->uf_rdbuf_tail->acc_ext_link= pack; udp_fd->uf_rdbuf_tail= pack; } PRIVATE void hash_fd(udp_fd) udp_fd_t *udp_fd; { udp_port_t *udp_port; int hash; udp_port= udp_fd->uf_port; if ((udp_fd->uf_udpopt.nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_ANY) { udp_fd->uf_port_next= udp_port->up_port_any; udp_port->up_port_any= udp_fd; } else { hash= udp_fd->uf_udpopt.nwuo_locport; hash ^= (hash >> 8); hash &= (UDP_PORT_HASH_NR-1); udp_fd->uf_port_next= udp_port->up_port_hash[hash]; udp_port->up_port_hash[hash]= udp_fd; } } PRIVATE void unhash_fd(udp_fd) udp_fd_t *udp_fd; { udp_port_t *udp_port; udp_fd_t *prev, *curr, **udp_fd_p; int hash; udp_port= udp_fd->uf_port; if ((udp_fd->uf_udpopt.nwuo_flags & NWUO_LOCPORT_MASK) == NWUO_LP_ANY) { udp_fd_p= &udp_port->up_port_any; } else { hash= udp_fd->uf_udpopt.nwuo_locport; hash ^= (hash >> 8); hash &= (UDP_PORT_HASH_NR-1); udp_fd_p= &udp_port->up_port_hash[hash]; } for (prev= NULL, curr= *udp_fd_p; curr; prev= curr, curr= curr->uf_port_next) { if (curr == udp_fd) break; } assert(curr); if (prev) prev->uf_port_next= curr->uf_port_next; else *udp_fd_p= curr->uf_port_next; } #ifdef BUF_CONSISTENCY_CHECK PRIVATE void udp_bufcheck() { int i; udp_port_t *udp_port; udp_fd_t *udp_fd; acc_t *tmp_acc; for (i= 0, udp_port= udp_port_table; iup_wr_pack) bf_check_acc(udp_port->up_wr_pack); } for (i= 0, udp_fd= udp_fd_table; iuf_rdbuf_head; tmp_acc; tmp_acc= tmp_acc->acc_ext_link) { bf_check_acc(tmp_acc); } } } #endif /* * $PchId: udp.c,v 1.10 1996/08/06 06:48:05 philip Exp $ */ /* udp.h Copyright 1995 Philip Homburg */ #ifndef UDP_H #define UDP_H #define UDP_DEF_OPT NWUO_NOFLAGS #define UDP_MAX_DATAGRAM 40000 /* 8192 */ #define UDP_READ_EXP_TIME (10L * HZ) #define UDP_TOS 0 #define UDP_IP_FLAGS 0 #define UDP_TTL 30 #define UDP0 0 struct acc; void udp_prep ARGS(( void )); void udp_init ARGS(( void )); int udp_open ARGS(( int port, int srfd, get_userdata_t get_userdata, put_userdata_t put_userdata, put_pkt_t put_pkt )); int udp_ioctl ARGS(( int fd, ioreq_t req )); int udp_read ARGS(( int fd, size_t count )); int udp_write ARGS(( int fd, size_t count )); void udp_close ARGS(( int fd )); int udp_cancel ARGS(( int fd, int which_operation )); #endif /* UDP_H */ /* * $PchId: udp.h,v 1.6 1996/05/07 20:53:31 philip Exp $ */ /* this file contains the interface of the network software with rest of minix. Furthermore it contains the main loop of the network task. Copyright 1995 Philip Homburg The valid messages and their parameters are: from FS: __________________________________________________________________ | | | | | | | | m_type | DEVICE | PROC_NR | COUNT | POSITION | ADDRESS | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_OPEN | minor dev | proc nr | mode | | | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_CLOSE | minor dev | proc nr | | | | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_IOCTL | minor dev | proc nr | | NWIO.. | address | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_READ | minor dev | proc nr | count | | address | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_WRITE | minor dev | proc nr | count | | address | |_______________|___________|_________|_______|__________|_________| | | | | | | | | NW_CANCEL | minor dev | proc nr | | | | |_______________|___________|_________|_______|__________|_________| from the Ethernet task: _______________________________________________________________________ | | | | | | | | m_type | DL_PORT | DL_PROC | DL_COUNT | DL_STAT | DL_TIME | |_______________|___________|_________|__________|____________|_________| | | | | | | | | DL_TASK_INT | minor dev | proc nr | rd_count | 0 | stat | time | |_______________|___________|_________|__________|____________|_________| | | | | | | | | DL_TASK_REPLY | minor dev | proc nr | rd_count | err | stat | time | | |_______________|___________|_________|__________|____________|_________| */ #include "inet.h" #define _MINIX 1 #include #include #include "mq.h" #include "proto.h" #include "generic/type.h" #include "generic/assert.h" #include "generic/buf.h" #include "generic/clock.h" #include "generic/eth.h" #include "generic/event.h" #if !CRAMPED #include "generic/arp.h" #include "generic/ip.h" #include "generic/psip.h" #include "generic/sr.h" #include "generic/tcp.h" #include "generic/udp.h" #endif THIS_FILE int this_proc; /* Process number of this server. */ int synal_tasknr; /* Task number of the synchronous alarm task. */ #ifdef BUF_CONSISTENCY_CHECK extern int inet_buf_debug; #endif _PROTOTYPE( void main, (void) ); FORWARD _PROTOTYPE( void nw_init, (void) ); PUBLIC void main() { mq_t *mq; int r; int source; DBLOCK(1, printf("%s\n", version)); nw_init(); while (TRUE) { #ifdef BUF_CONSISTENCY_CHECK if (inet_buf_debug) { static int buf_debug_count= 0; if (buf_debug_count++ > inet_buf_debug) { buf_debug_count= 0; if (!bf_consistency_check()) break; } } #endif if (ev_head) { ev_process(); continue; } if (clck_call_expire) { clck_expire_timers(); continue; } mq= mq_get(); if (!mq) ip_panic(("out of messages")); r= receive (ANY, &mq->mq_mess); if (r<0) { ip_panic(("unable to receive: %d", r)); } reset_time(); source= mq->mq_mess.m_source; if (source == FS_PROC_NR) { sr_rec(mq); } else if (source == synal_tasknr) { clck_tick (&mq->mq_mess); mq_free(mq); } else { compare(mq->mq_mess.m_type, ==, DL_TASK_REPLY); eth_rec(&mq->mq_mess); mq_free(mq); } } ip_panic(("task is not allowed to terminate")); } PRIVATE void nw_init() { struct fssignon device; struct systaskinfo info; /* Read configuration. */ read_conf(); eth_prep(); arp_prep(); psip_prep(); ip_prep(); tcp_prep(); udp_prep(); /* Sign on as a server at all offices in the proper order. */ if (svrctl(MMSIGNON, (void *) NULL) == -1) { printf("inet: server signon failed\n"); exit(1); } if (svrctl(SYSSIGNON, (void *) &info) == -1) pause(); /* Our new identity as a server. */ this_proc = info.proc_nr; /* Register the device group. */ device.dev= ip_dev; device.style= STYLE_CLONE; if (svrctl(FSSIGNON, (void *) &device) == -1) { printf("inet: error %d on registering ethernet devices\n", errno); pause(); } #ifdef BUF_CONSISTENCY_CHECK inet_buf_debug= 100; if (inet_buf_debug) { ip_warning(( "buffer consistency check enabled" )); } #endif if (sys_findproc("SYN_AL", &synal_tasknr, 0) != OK) ip_panic(( "unable to find synchronous alarm task\n")); mq_init(); bf_init(); clck_init(); sr_init(); eth_init(); #if ENABLE_ARP arp_init(); #endif #if ENABLE_PSIP psip_init(); #endif #if ENABLE_IP ip_init(); #endif #if ENABLE_TCP tcp_init(); #endif #if ENABLE_UDP udp_init(); #endif } #if !CRAMPED PUBLIC void panic0(file, line) char *file; int line; { printf("panic at %s, %d: ", file, line); } PUBLIC void panic() { printf("\ninet stacktrace: "); stacktrace(); sys_abort(RBT_PANIC); } #else /* CRAMPED */ PUBLIC void panic(file, line) char *file; int line; { printf("panic at %s, %d\n", file, line); sys_abort(RBT_PANIC); } #endif #if !NDEBUG PUBLIC void bad_assertion(file, line, what) char *file; int line; char *what; { panic0(file, line); printf("assertion \"%s\" failed", what); panic(); } PUBLIC void bad_compare(file, line, lhs, what, rhs) char *file; int line; int lhs; char *what; int rhs; { panic0(file, line); printf("compare (%d) %s (%d) failed", lhs, what, rhs); panic(); } #endif /* !NDEBUG */ /* * $PchId: inet.c,v 1.12 1996/12/17 07:58:19 philip Exp $ */ /* inet/inet.h Created: Dec 30, 1991 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef INET__INET_H #define INET__INET_H #define _SYSTEM 1 /* get OK and negative error codes */ #include #define CRAMPED (_EM_WSIZE==2) /* 64K code and data is quite cramped. */ #define ZERO 0 /* Used to comment out initialization code that does nothing. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "const.h" #include "inet_config.h" #define PUBLIC #define EXTERN extern #define PRIVATE static #define FORWARD static typedef int ioreq_t; #define THIS_FILE static char *this_file= __FILE__; #if CRAMPED /* Minimum panic info. */ #define ip_panic(print_list) panic(this_file, __LINE__) _PROTOTYPE( void panic, (char *file, int line) ); #else /* !CRAMPED */ /* Maximum panic info. */ #define ip_panic(print_list) \ (panic0(this_file, __LINE__), printf print_list, panic()) _PROTOTYPE( void panic0, (char *file, int line) ); _PROTOTYPE( void panic, (void) ); #endif /* !CRAMPED */ #if DEBUG #define ip_warning(print_list) \ ( \ printf("warning at %s, %d: ", this_file, __LINE__), \ printf print_list, \ printf("\ninet stacktrace: "), \ stacktrace() \ ) #define DBLOCK(level, code) \ do { if ((level) & DEBUG) { where(); code; } } while(0) #define DIFBLOCK(level, condition, code) \ do { if (((level) & DEBUG) && (condition)) \ { where(); code; } } while(0) #else /* !DEBUG */ #define ip_warning(print_list) 0 #define DBLOCK(level, code) 0 #define DIFBLOCK(level, condition, code) 0 #endif #define ARGS(x) _ARGS(x) extern char version[]; extern int this_proc, synal_tasknr; void stacktrace ARGS(( void )); #endif /* INET__INET_H */ /* * $PchId: inet.h,v 1.8 1996/05/07 21:05:04 philip Exp $ */ /* inet/inet_config.c Created: Nov 11, 1992 by Philip Homburg Modified: Apr 07, 2001 by Kees J. Bot Read the configuration file and fill in the xx_conf[] arrays. Copyright 1995 Philip Homburg */ #define _MINIX 1 #include #include #include #include #include #include #include #include #include #include #include "inet_config.h" #define CRAMPED (_EM_WSIZE==2) /* 64K code and data is quite cramped. */ #if CRAMPED #endif struct eth_conf eth_conf[IP_PORT_MAX]; struct psip_conf psip_conf[IP_PORT_MAX]; struct ip_conf ip_conf[IP_PORT_MAX]; dev_t ip_dev; int eth_conf_nr; #if ENABLE_PSIP int psip_conf_nr; #endif int ip_conf_nr; static u8_t iftype[IP_PORT_MAX]; /* Interface in use as? */ static int ifdefault= -1; /* Default network interface. */ static void fatal(char *label) { printf("init: %s: Error %d\n", label, errno); exit(1); } static void check_rm(char *device) /* Check if a device is not among the living. */ { if (unlink(device) < 0) { if (errno == ENOENT) return; fatal(device); } printf("rm %s\n", device); } static void check_mknod(char *device, mode_t mode, int minor) /* Check if a device exists with the proper device number. */ { struct stat st; dev_t dev; dev= (ip_dev & 0xFF00) | minor; if (stat(device, &st) < 0) { if (errno != ENOENT) fatal(device); } else { if (S_ISCHR(st.st_mode) && st.st_rdev == dev) return; if (unlink(device) < 0) fatal(device); } if (mknod(device, S_IFCHR | mode, dev) < 0) fatal(device); printf("mknod %s c %d %d\n", device, (ip_dev >> 8), minor); } static void check_ln(char *old, char *new) /* Check if 'old' and 'new' are still properly linked. */ { struct stat st_old, st_new; if (stat(old, &st_old) < 0) fatal(old); if (stat(new, &st_new) < 0) { if (errno != ENOENT) fatal(new); } else { if (st_new.st_dev == st_old.st_dev && st_new.st_ino == st_old.st_ino) { return; } if (unlink(new) < 0) fatal(new); } if (link(old, new) < 0) fatal(new); printf("ln %s %s\n", old, new); } static void check_dev(int type, int ifno) /* Check if the device group with interface number 'ifno' exists and has the * proper device numbers. If 'type' is -1 then the device group must be * removed. */ { static struct devlist { char *defname; mode_t mode; u8_t minor_off; } devlist[] = { { "/dev/eth", 0600, ETH_DEV_OFF }, { "/dev/psip", 0600, PSIP_DEV_OFF }, { "/dev/ip", 0600, IP_DEV_OFF }, { "/dev/tcp", 0666, TCP_DEV_OFF }, { "/dev/udp", 0666, UDP_DEV_OFF }, }; struct devlist *dvp; int i; char device[sizeof("/dev/psip99")]; char *dp; for (i= 0; i < sizeof(devlist) / sizeof(devlist[0]); i++) { dvp= &devlist[i]; strcpy(device, dvp->defname); dp= device + strlen(device); if (ifno >= 10) *dp++ = '0' + (ifno / 10); *dp++ = '0' + (ifno % 10); *dp = 0; if (type == 0 || (i == 0 && type != NETTYPE_ETH) || (i == 1 && type != NETTYPE_PSIP) ) { check_rm(device); if (ifno == ifdefault) check_rm(dvp->defname); } else { check_mknod(device, dvp->mode, if2minor(ifno, dvp->minor_off)); if (ifno == ifdefault) check_ln(device, dvp->defname); } } } static int cfg_fd; static char word[16]; static unsigned line; static void error(void) { printf("inet: error on line %u\n", line); exit(1); } static void token(int need) { /* Read a word from the configuration file. Return a null string on * EOF. Return a punctiation as a one character word. If 'need' is * true then an actual word is expected at this point, so err out if * not. */ unsigned char *wp; static unsigned char c= '\n'; wp= (unsigned char *) word; *wp = 0; while (c <= ' ') { if (c == '\n') line++; if (read(cfg_fd, &c, 1) != 1) { if (need) error(); return; } } do { if (wp < (unsigned char *) word + sizeof(word)-1) *wp++ = c; if (read(cfg_fd, &c, 1) != 1) c= ' '; if (word[0] == ';' || word[0] == '{' || word[0] == '}') { if (need) error(); break; } } while (c > ' ' && c != ';' && c != '{' && c != '}'); *wp = 0; } static unsigned number(char *str, unsigned max) { /* Interpret a string as an unsigned decimal number, no bigger than * 'max'. Return this number. */ char *s; unsigned n, d; s= str; n= 0; while ((d= (*s - '0')) < 10 && n <= max) { n= n * 10 + d; s++; } if (*s != 0 || n > max) { printf("inet: '%s' is not a number <= %u\n", str, max); error(); } return n; } void read_conf(void) { int i, j, ifno, type, port; struct eth_conf *ecp; struct psip_conf *pcp; struct ip_conf *icp; struct stat st; /* Open the configuration file. */ if ((cfg_fd= open(PATH_INET_CONF, O_RDONLY)) == -1) fatal(PATH_INET_CONF); ecp= eth_conf; pcp= psip_conf; icp= ip_conf; while (token(0), word[0] != 0) { if (strncmp(word, "eth", 3) == 0) { ecp->ec_ifno= ifno= number(word+3, IP_PORT_MAX-1); type= NETTYPE_ETH; port= eth_conf_nr; token(1); ecp->ec_task= alloc(strlen(word)+1); strcpy(ecp->ec_task, word); token(1); ecp->ec_port= number(word, IP_PORT_MAX-1); ecp++; eth_conf_nr++; #if ENABLE_PSIP } else if (strncmp(word, "psip", 4) == 0) { pcp->pc_ifno= ifno= number(word+4, IP_PORT_MAX-1); type= NETTYPE_PSIP; port= psip_conf_nr; pcp++; psip_conf_nr++; #endif } else { printf("inet: Unknown device '%s'\n", word); error(); } iftype[ifno]= type; icp->ic_ifno= ifno; icp->ic_devtype= type; icp->ic_port= port; token(0); if (word[0] == '{') { token(0); if (strcmp(word, "default") == 0) { if (ifdefault != -1) { printf( "inet: ip%d and ip%d can't both be default\n", ifdefault, ifno); error(); } ifdefault= ifno; token(0); } if (word[0] == ';') token(0); if (word[0] != '}') error(); token(0); } if (word[0] != ';' && word[0] != 0) error(); icp++; ip_conf_nr++; } if (ifdefault == -1) { printf("inet: No networks or no default network defined\n"); exit(1); } /* Set umask 0 so we can creat mode 666 devices. */ (void) umask(0); /* See what the device number of /dev/ip is. That's what we * used last time for the network devices, so we keep doing so. */ if (stat("/dev/ip", &st) < 0) fatal("/dev/ip"); ip_dev= st.st_rdev; for (i= 0; i < IP_PORT_MAX; i++) { /* Create network devices. */ check_dev(iftype[i], i); } } void *alloc(size_t size) { /* Allocate memory on the heap with sbrk(). */ return sbrk((size + (sizeof(char *) - 1)) & ~(sizeof(char *) - 1)); } /* * $PchId: inet_config.c,v 1.6 1998/10/23 20:15:27 philip Exp $ */ /* inet/inet_config.h Created: Nov 11, 1992 by Philip Homburg Defines values for configurable parameters. The structure definitions for configuration information are also here. Copyright 1995 Philip Homburg */ #ifndef INET__INET_CONFIG_H #define INET__INET_CONFIG_H #define ENABLE_ARP 1 #define ENABLE_IP 1 #define ENABLE_PSIP 1 #define ENABLE_TCP 1 #define ENABLE_UDP 1 /* Inet configuration file. */ #define PATH_INET_CONF "/etc/inet.conf" #define IP_PORT_MAX (1*sizeof(char*)) /* Up to this many network devices */ extern int eth_conf_nr; /* Number of ethernets */ extern int psip_conf_nr; /* Number of Pseudo IP networks */ extern int ip_conf_nr; /* Number of configured TCP/IP layers */ extern dev_t ip_dev; /* Device number of /dev/ip */ struct eth_conf { char *ec_task; /* Kernel ethernet task name */ u8_t ec_port; /* Task port */ u8_t ec_ifno; /* Interface number of /dev/eth* */ }; struct psip_conf { u8_t pc_ifno; /* Interface number of /dev/psip* */ }; struct ip_conf { u8_t ic_devtype; /* Underlying device type: Ethernet / PSIP */ u8_t ic_port; /* Port of underlying device */ u8_t ic_ifno; /* Interface number of /dev/ip*, tcp*, udp* */ }; /* Types of networks. */ #define NETTYPE_ETH 1 #define NETTYPE_PSIP 2 /* To compute the minor device number for a device on an interface. */ #define if2minor(ifno, dev) ((ifno) * 16 + (dev)) /* Offsets of the minor device numbers within a group per interface. */ #define ETH_DEV_OFF 1 #define PSIP_DEV_OFF 1 #define IP_DEV_OFF 2 #define TCP_DEV_OFF 3 #define UDP_DEV_OFF 4 extern struct eth_conf eth_conf[IP_PORT_MAX]; extern struct psip_conf psip_conf[IP_PORT_MAX]; extern struct ip_conf ip_conf[IP_PORT_MAX]; void read_conf(void); extern char *sbrk(int); void *alloc(size_t size); #endif /* INET__INET_CONFIG_H */ /* * $PchId: inet_config.h,v 1.6 1998/10/23 20:14:28 philip Exp $ */ /* inet/mnx_eth.c Created: Jan 2, 1992 by Philip Homburg Copyright 1995 Philip Homburg */ #include "inet.h" #include "proto.h" #include "osdep_eth.h" #include "generic/type.h" #include "generic/assert.h" #include "generic/buf.h" #include "generic/clock.h" #include "generic/eth.h" #include "generic/eth_int.h" #include "generic/sr.h" THIS_FILE FORWARD _PROTOTYPE( void setup_read, (eth_port_t *eth_port) ); FORWARD _PROTOTYPE( void read_int, (eth_port_t *eth_port, int count) ); FORWARD _PROTOTYPE( void write_int, (eth_port_t *eth_port) ); FORWARD _PROTOTYPE( void eth_recvev, (event_t *ev, ev_arg_t ev_arg) ); FORWARD _PROTOTYPE( void eth_sendev, (event_t *ev, ev_arg_t ev_arg) ); FORWARD _PROTOTYPE( eth_port_t *find_port, (message *m) ); PUBLIC void osdep_eth_init() { int i, r, tasknr; struct eth_conf *ecp; eth_port_t *eth_port; message mess, repl_mess; for (i= 0, eth_port= eth_port_table, ecp= eth_conf; iec_task, &tasknr, 0); if (r != OK) { ip_panic(( "unable to find task %s: %d\n", ecp->ec_task, r )); } eth_port->etp_osdep.etp_port= ecp->ec_port; eth_port->etp_osdep.etp_task= tasknr; ev_init(ð_port->etp_osdep.etp_recvev); mess.m_type= DL_INIT; mess.DL_PORT= eth_port->etp_osdep.etp_port; mess.DL_PROC= this_proc; mess.DL_MODE= DL_NOMODE; r= send(eth_port->etp_osdep.etp_task, &mess); if (r<0) { #if !CRAMPED printf( "osdep_eth_init: unable to send to ethernet task, error= %d\n", r); #endif continue; } if (receive(eth_port->etp_osdep.etp_task, &mess)<0) ip_panic(("unable to receive")); if (mess.m3_i1 == ENXIO) { #if !CRAMPED printf( "osdep_eth_init: no ethernet device at task=%d,port=%d\n", eth_port->etp_osdep.etp_task, eth_port->etp_osdep.etp_port); #endif continue; } if (mess.m3_i1 != eth_port->etp_osdep.etp_port) ip_panic(("osdep_eth_init: DL_INIT error or wrong port: %d\n", mess.m3_i1)); eth_port->etp_ethaddr= *(ether_addr_t *)mess.m3_ca1; sr_add_minor(if2minor(ecp->ec_ifno, ETH_DEV_OFF), i, eth_open, eth_close, eth_read, eth_write, eth_ioctl, eth_cancel); eth_port->etp_flags |= EPF_ENABLED; eth_port->etp_wr_pack= 0; eth_port->etp_rd_pack= 0; setup_read (eth_port); eth_port++; } } PUBLIC void eth_write_port(eth_port, pack) eth_port_t *eth_port; acc_t *pack; { eth_port_t *loc_port; message mess1, block_msg; int i, pack_size; acc_t *pack_ptr; iovec_t *iovec; u8_t *eth_dst_ptr; int multicast, r; ev_arg_t ev_arg; assert(eth_port->etp_wr_pack == NULL); eth_port->etp_wr_pack= pack; iovec= eth_port->etp_osdep.etp_wr_iovec; pack_size= 0; for (i=0, pack_ptr= pack; iacc_next) { iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr); pack_size += iovec[i].iov_size= pack_ptr->acc_length; } if (i>= IOVEC_NR) { pack= bf_pack(pack); /* packet is too fragmented */ eth_port->etp_wr_pack= pack; pack_size= 0; for (i=0, pack_ptr= pack; iacc_next) { iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr); pack_size += iovec[i].iov_size= pack_ptr->acc_length; } } assert (i< IOVEC_NR); assert (pack_size >= ETH_MIN_PACK_SIZE); if (i == 1) { /* simple packets can be sent using DL_WRITE instead of * DL_WRITEV. */ mess1.DL_COUNT= iovec[0].iov_size; mess1.DL_ADDR= (char *)iovec[0].iov_addr; mess1.m_type= DL_WRITE; } else { mess1.DL_COUNT= i; mess1.DL_ADDR= (char *)iovec; mess1.m_type= DL_WRITEV; } mess1.DL_PORT= eth_port->etp_osdep.etp_port; mess1.DL_PROC= this_proc; mess1.DL_MODE= DL_NOMODE; for (;;) { r= send (eth_port->etp_osdep.etp_task, &mess1); if (r != ELOCKED) break; /* ethernet task is sending to this task, I hope */ r= receive(eth_port->etp_osdep.etp_task, &block_msg); if (r < 0) ip_panic(("unable to receive")); loc_port= eth_port; if (loc_port->etp_osdep.etp_port != block_msg.DL_PORT) { loc_port= find_port(&block_msg); } assert(block_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)); if (block_msg.DL_STAT & DL_PACK_SEND) { assert(loc_port != eth_port); loc_port->etp_osdep.etp_sendrepl= block_msg; ev_arg.ev_ptr= loc_port; ev_enqueue(&loc_port->etp_sendev, eth_sendev, ev_arg); } if (block_msg.DL_STAT & DL_PACK_RECV) { loc_port->etp_osdep.etp_recvrepl= block_msg; ev_arg.ev_ptr= loc_port; ev_enqueue(&loc_port->etp_osdep.etp_recvev, eth_recvev, ev_arg); } } if (r < 0) ip_panic(("unable to send")); r= receive(eth_port->etp_osdep.etp_task, &mess1); if (r < 0) ip_panic(("unable to receive")); assert(mess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_proc); assert((mess1.DL_STAT >> 16) == OK); if (mess1.DL_STAT & DL_PACK_RECV) { eth_port->etp_osdep.etp_recvrepl= mess1; ev_arg.ev_ptr= eth_port; ev_enqueue(ð_port->etp_osdep.etp_recvev, eth_recvev, ev_arg); } if (!(mess1.DL_STAT & DL_PACK_SEND)) { /* Packet is not yet sent. */ return; } /* If the port is in promiscuous mode or the packet is * broadcasted/multicasted, enqueue the reply packet. */ eth_dst_ptr= (u8_t *)ptr2acc_data(pack); multicast= (*eth_dst_ptr & 1); /* low order bit indicates multicast */ if (multicast || (eth_port->etp_osdep.etp_recvconf & NWEO_EN_PROMISC)) { eth_port->etp_osdep.etp_sendrepl= mess1; ev_arg.ev_ptr= eth_port; ev_enqueue(ð_port->etp_sendev, eth_sendev, ev_arg); /* Pretend that we didn't get a reply. */ return; } /* packet is sent */ bf_afree(eth_port->etp_wr_pack); eth_port->etp_wr_pack= NULL; } PUBLIC void eth_rec(m) message *m; { int i; eth_port_t *loc_port; int stat; assert(m->m_type == DL_TASK_REPLY); set_time (m->DL_CLCK); for (i=0, loc_port= eth_port_table; ietp_osdep.etp_port == m->DL_PORT && loc_port->etp_osdep.etp_task == m->m_source) break; } if (i == eth_conf_nr) { ip_panic(("message from unknown source: %d:%d", m->m_source, m->DL_PORT)); } stat= m->DL_STAT & 0xffff; assert(stat & (DL_PACK_SEND|DL_PACK_RECV)); if (stat & DL_PACK_SEND) write_int(loc_port); if (stat & DL_PACK_RECV) read_int(loc_port, m->DL_COUNT); } #ifndef notdef PUBLIC int eth_get_stat(eth_port, eth_stat) eth_port_t *eth_port; eth_stat_t *eth_stat; { acc_t *acc; int result; message mess, mlocked; mess.m_type= DL_GETSTAT; mess.DL_PORT= eth_port->etp_osdep.etp_port; mess.DL_PROC= this_proc; mess.DL_ADDR= (char *)eth_stat; for (;;) { result= send(eth_port->etp_osdep.etp_task, &mess); if (result != ELOCKED) break; result= receive(eth_port->etp_osdep.etp_task, &mlocked); assert(result == OK); compare(mlocked.m_type, ==, DL_TASK_REPLY); eth_rec(&mlocked); } assert(result == OK); result= receive(eth_port->etp_osdep.etp_task, &mess); assert(result == OK); assert(mess.m_type == DL_TASK_REPLY); result= mess.DL_STAT >> 16; assert (result == 0); if (mess.DL_STAT) { #if DEBUG { where(); printf("calling eth_rec()\n"); } #endif eth_rec(&mess); } return OK; } #endif #ifndef notdef PUBLIC void eth_set_rec_conf (eth_port, flags) eth_port_t *eth_port; u32_t flags; { int result; unsigned dl_flags; message mess, repl_mess; dl_flags= DL_NOMODE; if (flags & NWEO_EN_BROAD) dl_flags |= DL_BROAD_REQ; if (flags & NWEO_EN_MULTI) dl_flags |= DL_MULTI_REQ; if (flags & NWEO_EN_PROMISC) dl_flags |= DL_PROMISC_REQ; mess.m_type= DL_INIT; mess.DL_PORT= eth_port->etp_osdep.etp_port; mess.DL_PROC= this_proc; mess.DL_MODE= dl_flags; do { result= send (eth_port->etp_osdep.etp_task, &mess); if (result == ELOCKED) /* Ethernet task is sending to this task, I hope */ { if (receive (eth_port->etp_osdep.etp_task, &repl_mess)< 0) { ip_panic(("unable to receive")); } compare(repl_mess.m_type, ==, DL_TASK_REPLY); eth_rec(&repl_mess); } } while (result == ELOCKED); if (result < 0) ip_panic(("unable to send(%d)", result)); if (receive (eth_port->etp_osdep.etp_task, &repl_mess) < 0) ip_panic(("unable to receive")); assert (repl_mess.m_typ@*B*C*D*E*F*e == DL_INIT_REPLY); if (repl_mess.m3_i1 != eth_port->etp_osdep.etp_port) { ip_panic(("got reply for wrong port")); } eth_port->etp_osdep.etp_recvconf= flags; } #endif PRIVATE void write_int(eth_port) eth_port_t *eth_port; { acc_t *pack; int multicast; u8_t *eth_dst_ptr; pack= eth_port->etp_wr_pack; eth_port->etp_wr_pack= NULL; eth_dst_ptr= (u8_t *)ptr2acc_data(pack); multicast= (*eth_dst_ptr & 1); /* low order bit indicates multicast */ if (multicast || (eth_port->etp_osdep.etp_recvconf & NWEO_EN_PROMISC)) eth_arrive(eth_port, pack, bf_bufsize(pack)); else bf_afree(pack); eth_restart_write(eth_port); } PRIVATE void read_int(eth_port, count) eth_port_t *eth_port; int count; { acc_t *pack, *cut_pack; pack= eth_port->etp_rd_pack; eth_port->etp_rd_pack= NULL; cut_pack= bf_cut(pack, 0, count); bf_afree(pack); eth_arrive(eth_port, cut_pack, count); eth_port->etp_flags &= ~(EPF_READ_IP|EPF_READ_SP); setup_read(eth_port); } PRIVATE void setup_read(eth_port) eth_port_t *eth_port; { eth_port_t *loc_port; acc_t *pack, *pack_ptr; message mess1, block_msg; iovec_t *iovec; ev_arg_t ev_arg; int i, r; assert(!(eth_port->etp_flags & (EPF_READ_IP|EPF_READ_SP))); do { assert (!eth_port->etp_rd_pack); iovec= eth_port->etp_osdep.etp_rd_iovec; pack= bf_memreq (ETH_MAX_PACK_SIZE); for (i=0, pack_ptr= pack; iacc_next) { iovec[i].iov_addr= (vir_bytes)ptr2acc_data(pack_ptr); iovec[i].iov_size= (vir_bytes)pack_ptr->acc_length; } assert (!pack_ptr); mess1.m_type= DL_READV; mess1.DL_PORT= eth_port->etp_osdep.etp_port; mess1.DL_PROC= this_proc; mess1.DL_COUNT= i; mess1.DL_ADDR= (char *)iovec; for (;;) { r= send (eth_port->etp_osdep.etp_task, &mess1); if (r != ELOCKED) break; /* ethernet task is sending to this task, I hope */ r= receive(eth_port->etp_osdep.etp_task, &block_msg); if (r < 0) ip_panic(("unable to receive")); loc_port= eth_port; if (loc_port->etp_osdep.etp_port != block_msg.DL_PORT) { loc_port= find_port(&block_msg); } assert(block_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)); if (block_msg.DL_STAT & DL_PACK_SEND) { loc_port->etp_osdep.etp_sendrepl= block_msg; ev_arg.ev_ptr= loc_port; ev_enqueue(&loc_port->etp_sendev, eth_sendev, ev_arg); } if (block_msg.DL_STAT & DL_PACK_RECV) { assert(loc_port != eth_port); loc_port->etp_osdep.etp_recvrepl= block_msg; ev_arg.ev_ptr= loc_port; ev_enqueue(&loc_port->etp_osdep.etp_recvev, eth_recvev, ev_arg); } } if (r < 0) ip_panic(("unable to send")); r= receive (eth_port->etp_osdep.etp_task, &mess1); if (r < 0) ip_panic(("unable to receive")); assert (mess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_proc); compare((mess1.DL_STAT >> 16), ==, OK); if (mess1.DL_STAT & DL_PACK_RECV) { /* packet received */ pack_ptr= bf_cut(pack, 0, mess1.DL_COUNT); bf_afree(pack); eth_arrive(eth_port, pack_ptr, mess1.DL_COUNT); } else { /* no packet received */ eth_port->etp_rd_pack= pack; eth_port->etp_flags |= EPF_READ_IP; } if (mess1.DL_STAT & DL_PACK_SEND) { eth_port->etp_osdep.etp_sendrepl= mess1; ev_arg.ev_ptr= eth_port; ev_enqueue(ð_port->etp_sendev, eth_sendev, ev_arg); } } while (!(eth_port->etp_flags & EPF_READ_IP)); eth_port->etp_flags |= EPF_READ_SP; } PRIVATE void eth_recvev(ev, ev_arg) event_t *ev; ev_arg_t ev_arg; { eth_port_t *eth_port; message *m_ptr; eth_port= ev_arg.ev_ptr; assert(ev == ð_port->etp_osdep.etp_recvev); m_ptr= ð_port->etp_osdep.etp_recvrepl; assert(m_ptr->m_type == DL_TASK_REPLY); assert(eth_port->etp_osdep.etp_port == m_ptr->DL_PORT); assert(m_ptr->DL_STAT & DL_PACK_RECV); m_ptr->DL_STAT &= ~DL_PACK_RECV; read_int(eth_port, m_ptr->DL_COUNT); } PRIVATE void eth_sendev(ev, ev_arg) event_t *ev; ev_arg_t ev_arg; { eth_port_t *eth_port; message *m_ptr; eth_port= ev_arg.ev_ptr; assert(ev == ð_port->etp_sendev); m_ptr= ð_port->etp_osdep.etp_sendrepl; assert (m_ptr->m_type == DL_TASK_REPLY); assert(eth_port->etp_osdep.etp_port == m_ptr->DL_PORT); assert(m_ptr->DL_STAT & DL_PACK_SEND); m_ptr->DL_STAT &= ~DL_PACK_SEND; /* packet is sent */ write_int(eth_port); } PRIVATE eth_port_t *find_port(m) message *m; { eth_port_t *loc_port; int i; for (i=0, loc_port= eth_port_table; ietp_osdep.etp_port == m->DL_PORT) break; } assert (imq_next; mq->mq_next= NULL; assert(mq->mq_allocated == 0); mq->mq_allocated= 1; return mq; } void mq_free(mq) mq_t *mq; { mq->mq_next= mq_freelist; mq_freelist= mq; assert(mq->mq_allocated == 1); mq->mq_allocated= 0; } /* * $PchId: mq.c,v 1.6 1996/05/07 21:10:16 philip Exp $ */ /* inet/mq.h Created: Jan 3, 1992 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef INET__MQ_H #define INET__MQ_H typedef struct mq { message mq_mess; struct mq *mq_next; int mq_allocated; } mq_t; _PROTOTYPE( mq_t *mq_get, (void) ); _PROTOTYPE( void mq_free, (mq_t *mq) ); _PROTOTYPE( void mq_init, (void) ); #endif /* INET__MQ_H */ /* * $PchId: mq.h,v 1.4 1995/11/21 06:40:30 philip Exp $ */ /* inet/osdep_eth.h Created: Dec 30, 1991 by Philip Homburg Copyright 1995 Philip Homburg */ #ifndef INET__OSDEP_ETH_H #define INET__OSDEP_ETH_H #include "generic/event.h" #define IOVEC_NR 16 #define RD_IOVEC ((ETH_MAX_PACK_SIZE + BUF_S -1)/BUF_S) typedef struct osdep_eth_port { int etp_task; int etp_port; int etp_recvconf; iovec_t etp_wr_iovec[IOVEC_NR]; iovec_t etp_rd_iovec[RD_IOVEC]; event_t etp_recvev; message etp_sendrepl; message etp_recvrepl; } osdep_eth_port_t; #endif /* INET__OSDEP_ETH_H */ /* * $PchId: osdep_eth.h,v 1.5 1995/11/21 06:41:28 philip Exp $ */ /* inet/proto.h Created: Jan 2, 1992 by Philip Homburg Copyright 1995 Philip Homburg */ /* clock.c */ _PROTOTYPE( void clck_tick, (message *mess) ); /* mnx_eth.c */ _PROTOTYPE( void eth_rec, (message *m) ); /* sr.c */ struct mq; _PROTOTYPE( void sr_rec, (struct mq *m) ); /* * $PchId: proto.h,v 1.4 1995/11/21 06:36:37 philip Exp $ */ /* this file contains the interface of the network software with the file * system. * * Copyright 1995 Philip Homburg * * The valid messages and their parameters are: * * Requests: * * m_type NDEV_MINOR NDEV_PROC NDEV_REF NDEV_MODE * ------------------------------------------------------------- * | DEV_OPEN |minor dev | proc nr | fd | mode | * |-------------+-----------+-----------+-----------+----------+ * | DEV_CLOSE |minor dev | proc nr | fd | | * |-------------+-----------+-----------+-----------+----------+ * * m_type NDEV_MINOR NDEV_PROC NDEV_REF NDEV_COUNT NDEV_BUFFER * --------------------------------------------------------------------------- * | DEV_READ |minor dev | proc nr | fd | count | buf ptr | * |-------------+-----------+-----------+-----------+-----------+-----------| * | DEV_WRITE |minor dev | proc nr | fd | count | buf ptr | * |-------------+-----------+-----------+-----------+-----------+-----------| * * m_type NDEV_MINOR NDEV_PROC NDEV_REF NDEV_IOCTL NDEV_BUFFER * --------------------------------------------------------------------------- * | DEV_IOCTL3 |minor dev | proc nr | fd | command | buf ptr | * |-------------+-----------+-----------+-----------+-----------+-----------| * * m_type NDEV_MINOR NDEV_PROC NDEV_REF NDEV_OPERATION * -------------------------------------------------------------------| * | DEV_CANCEL |minor dev | proc nr | fd | which operation| * |-------------+-----------+-----------+-----------+----------------| * * Replies: * * m_type REP_PROC_NR REP_STATUS REP_REF REP_OPERATION * ----------------------------------------------------------------------| * | DEVICE_REPLY | proc nr | status | fd | which operation | * |--------------+-------------+------------+---------+-----------------| */ #include "inet.h" #include #include "mq.h" #include "proto.h" #include "generic/type.h" #include "generic/assert.h" #include "generic/buf.h" #include "generic/sr.h" THIS_FILE #define FD_NR (16*IP_PORT_MAX) typedef struct sr_fd { int srf_flags; int srf_fd; int srf_port; sr_open_t srf_open; sr_close_t srf_close; sr_write_t srf_write; sr_read_t srf_read; sr_ioctl_t srf_ioctl; sr_cancel_t srf_cancel; mq_t *srf_ioctl_q, *srf_ioctl_q_tail; mq_t *srf_read_q, *srf_read_q_tail; mq_t *srf_write_q, *srf_write_q_tail; } sr_fd_t; #define SFF_FLAGS 0x0F # define SFF_FREE 0x00 # define SFF_MINOR 0x01 # define SFF_INUSE 0x02 # define SFF_BUSY 0x3C # define SFF_IOCTL_IP 0x04 # define SFF_READ_IP 0x08 # define SFF_WRITE_IP 0x10 # define SFF_PENDING_REQ 0x30 # define SFF_SUSPENDED 0x1C0 # define SFF_IOCTL_SUSP 0x40 # define SFF_READ_SUSP 0x80 # define SFF_WRITE_SUSP 0x100 FORWARD _PROTOTYPE ( int sr_open, (message *m) ); FORWARD _PROTOTYPE ( void sr_close, (message *m) ); FORWARD _PROTOTYPE ( int sr_rwio, (mq_t *m) ); FORWARD _PROTOTYPE ( int sr_cancel, (message *m) ); FORWARD _PROTOTYPE ( void sr_reply, (mq_t *m, int reply, int can_enqueue) ); FORWARD _PROTOTYPE ( sr_fd_t *sr_getchannel, (int minor)); FORWARD _PROTOTYPE ( acc_t *sr_get_userdata, (int fd, vir_bytes offset, vir_bytes count, int for_ioctl) ); FORWARD _PROTOTYPE ( int sr_put_userdata, (int fd, vir_bytes offset, acc_t *data, int for_ioctl) ); FORWARD _PROTOTYPE ( int sr_repl_queue, (int proc, int ref, int operation) ); FORWARD _PROTOTYPE ( int walk_queue, (sr_fd_t *sr_fd, mq_t *q_head, mq_t **q_tail_ptr, int type, int proc_nr, int ref) ); FORWARD _PROTOTYPE ( void process_req_q, (mq_t *mq, mq_t *tail, mq_t **tail_ptr) ); FORWARD _PROTOTYPE ( int cp_u2b, (int proc, char *src, acc_t **var_acc_ptr, int size) ); FORWARD _PROTOTYPE ( int cp_b2u, (acc_t *acc_ptr, int proc, char *dest) ); PRIVATE sr_fd_t sr_fd_table[FD_NR]; PRIVATE mq_t *repl_queue, *repl_queue_tail; PRIVATE cpvec_t cpvec[CPVEC_NR]; PUBLIC void sr_init() { #if ZERO int i; for (i=0; imq_mess.m_type == NW_CANCEL) { result= sr_repl_queue(m->mq_mess.PROC_NR, 0, 0); if (result) { mq_free(m); return; /* canceled request in queue */ } } else sr_repl_queue(ANY, 0, 0); } switch (m->mq_mess.m_type) { case DEV_OPEN: result= sr_open(&m->mq_mess); send_reply= 1; free_mess= 1; break; case DEV_CLOSE: sr_close(&m->mq_mess); result= OK; send_reply= 1; free_mess= 1; break; case DEV_READ: case DEV_WRITE: case DEV_IOCTL: result= sr_rwio(m); assert(result == OK || result == SUSPEND); send_reply= (result == SUSPEND); free_mess= 0; break; case CANCEL: result= sr_cancel(&m->mq_mess); assert(result == OK || result == EINTR); send_reply= (result == EINTR); free_mess= 1; m->mq_mess.m_type= 0; break; #if !CRAMPED default: ip_panic(("unknown message, from %d, type %d", m->mq_mess.m_source, m->mq_mess.m_type)); #endif } if (send_reply) { sr_reply(m, result, FALSE); } if (free_mess) mq_free(m); } PUBLIC void sr_add_minor(minor, port, openf, closef, readf, writef, ioctlf, cancelf) int minor; int port; sr_open_t openf; sr_close_t closef; sr_read_t readf; sr_write_t writef; sr_ioctl_t ioctlf; sr_cancel_t cancelf; { sr_fd_t *sr_fd; assert (minor>=0 && minorsrf_flags & SFF_INUSE)); sr_fd->srf_flags= SFF_INUSE | SFF_MINOR; sr_fd->srf_port= port; sr_fd->srf_open= openf; sr_fd->srf_close= closef; sr_fd->srf_write= writef; sr_fd->srf_read= readf; sr_fd->srf_ioctl= ioctlf; sr_fd->srf_cancel= cancelf; } PRIVATE int sr_open(m) message *m; { sr_fd_t *sr_fd; int minor= m->DEVICE; int i, fd; if (minor<0 || minor>FD_NR) { DBLOCK(1, printf("replying EINVAL\n")); return EINVAL; } if (!(sr_fd_table[minor].srf_flags & SFF_MINOR)) { DBLOCK(1, printf("replying ENXIO\n")); return ENXIO; } for (i=0; i=FD_NR) { DBLOCK(1, printf("replying ENFILE\n")); return ENFILE; } sr_fd= &sr_fd_table[i]; *sr_fd= sr_fd_table[minor]; sr_fd->srf_flags= SFF_INUSE; fd= (*sr_fd->srf_open)(sr_fd->srf_port, i, sr_get_userdata, sr_put_userdata, 0); if (fd<0) { sr_fd->srf_flags= SFF_FREE; DBLOCK(1, printf("replying %d\n", fd)); return fd; } sr_fd->srf_fd= fd; return i; } PRIVATE void sr_close(m) message *m; { sr_fd_t *sr_fd; sr_fd= sr_getchannel(m->DEVICE); assert (sr_fd); assert (!(sr_fd->srf_flags & SFF_BUSY)); assert (!(sr_fd->srf_flags & SFF_MINOR)); (*sr_fd->srf_close)(sr_fd->srf_fd); sr_fd->srf_flags= SFF_FREE; } PRIVATE int sr_rwio(m) mq_t *m; { sr_fd_t *sr_fd; mq_t **q_head_ptr, **q_tail_ptr; int ip_flag, susp_flag; int r; ioreq_t request; size_t size; sr_fd= sr_getchannel(m->mq_mess.DEVICE); assert (sr_fd); switch(m->mq_mess.m_type) { case DEV_READ: q_head_ptr= &sr_fd->srf_read_q; q_tail_ptr= &sr_fd->srf_read_q_tail; ip_flag= SFF_READ_IP; susp_flag= SFF_READ_SUSP; break; case DEV_WRITE: q_head_ptr= &sr_fd->srf_write_q; q_tail_ptr= &sr_fd->srf_write_q_tail; ip_flag= SFF_WRITE_IP; susp_flag= SFF_WRITE_SUSP; break; case DEV_IOCTL: q_head_ptr= &sr_fd->srf_ioctl_q; q_tail_ptr= &sr_fd->srf_ioctl_q_tail; ip_flag= SFF_IOCTL_IP; susp_flag= SFF_IOCTL_SUSP; break; #if !CRAMPED default: ip_panic(("illegal case entry")); #endif } if (sr_fd->srf_flags & ip_flag) { assert(sr_fd->srf_flags & susp_flag); assert(*q_head_ptr); (*q_tail_ptr)->mq_next= m; *q_tail_ptr= m; return SUSPEND; } assert(!*q_head_ptr); *q_tail_ptr= *q_head_ptr= m; sr_fd->srf_flags |= ip_flag; switch(m->mq_mess.m_type) { case DEV_READ: r= (*sr_fd->srf_read)(sr_fd->srf_fd, m->mq_mess.COUNT); break; case DEV_WRITE: r= (*sr_fd->srf_write)(sr_fd->srf_fd, m->mq_mess.COUNT); break; case DEV_IOCTL: request= m->mq_mess.REQUEST; #ifdef _IOCPARM_MASK size= (request >> 16R*T*U*V*W*X*Y*Z*[*) & _IOCPARM_MASK; if (size>MAX_IOCTL_S) { DBLOCK(1, printf("replying EINVAL\n")); r= sr_put_userdata(sr_fd-sr_fd_table, EINVAL, NULL, 1); assert(r == OK); return OK; } #endif r= (*sr_fd->srf_ioctl)(sr_fd->srf_fd, request); break; #if !CRAMPED default: ip_panic(("illegal case entry")); #endif } assert(r == OK || r == SUSPEND || (printf("r= %d\n", r), 0)); if (r == SUSPEND) sr_fd->srf_flags |= susp_flag; return r; } PRIVATE int sr_cancel(m) message *m; { sr_fd_t *sr_fd; int i, result; mq_t *q_ptr, *q_ptr_prv; int proc_nr, ref, operation; result=EINTR; proc_nr= m->PROC_NR; ref= 0; operation= 0; sr_fd= sr_getchannel(m->DEVICE); assert (sr_fd); { result= walk_queue(sr_fd, sr_fd->srf_ioctl_q, &sr_fd->srf_ioctl_q_tail, SR_CANCEL_IOCTL, proc_nr, ref); if (result != EAGAIN) return result; } { result= walk_queue(sr_fd, sr_fd->srf_read_q, &sr_fd->srf_read_q_tail, SR_CANCEL_READ, proc_nr, ref); if (result != EAGAIN) return result; } { result= walk_queue(sr_fd, sr_fd->srf_write_q, &sr_fd->srf_write_q_tail, SR_CANCEL_WRITE, proc_nr, ref); if (result != EAGAIN) return result; } #if !CRAMPED ip_panic(( "request not found: from %d, type %d, MINOR= %d, PROC= %d, REF= %d OPERATION= %d", m->m_source, m->m_type, m->DEVICE, m->PROC_NR, 0, 0)); #endif } PRIVATE int walk_queue(sr_fd, q_head, q_tail_ptr, type, proc_nr, ref) sr_fd_t *sr_fd; mq_t *q_head, **q_tail_ptr; int type; int proc_nr; int ref; { mq_t *q_ptr_prv, *q_ptr; int result; for(q_ptr_prv= NULL, q_ptr= q_head; q_ptr; q_ptr_prv= q_ptr, q_ptr= q_ptr->mq_next) { if (q_ptr->mq_mess.PROC_NR != proc_nr) continue; if (!q_ptr_prv) { result= (*sr_fd->srf_cancel)(sr_fd->srf_fd, type); assert(result == OK); return OK; } q_ptr_prv->mq_next= q_ptr->mq_next; mq_free(q_ptr); if (!q_ptr_prv->mq_next) *q_tail_ptr= q_ptr_prv; return EINTR; } return EAGAIN; } PRIVATE sr_fd_t *sr_getchannel(minor) int minor; { sr_fd_t *loc_fd; compare(minor, >=, 0); compare(minor, <, FD_NR); loc_fd= &sr_fd_table[minor]; assert (!(loc_fd->srf_flags & SFF_MINOR) && (loc_fd->srf_flags & SFF_INUSE)); return loc_fd; } PRIVATE void sr_reply (mq, status, can_enqueue) mq_t *mq; int status; int can_enqueue; { int result, proc, ref,operation; message reply, *mp; proc= mq->mq_mess.PROC_NR; ref= 0; operation= mq->mq_mess.m_type; if (can_enqueue) mp= &mq->mq_mess; else mp= &reply; mp->m_type= REVIVE; mp->REP_PROC_NR= proc; mp->REP_STATUS= status; result= send(mq->mq_mess.m_source, mp); if (result == ELOCKED && can_enqueue) { if (repl_queue) repl_queue_tail->mq_next= mq; else repl_queue= mq; repl_queue_tail= mq; return; } if (result != OK) ip_panic(("unable to send")); if (can_enqueue) mq_free(mq); } PRIVATE acc_t *sr_get_userdata (fd, offset, count, for_ioctl) int fd; vir_bytes offset; vir_bytes count; int for_ioctl; { sr_fd_t *loc_fd; mq_t **head_ptr, **tail_ptr, *m, *tail, *mq; int ip_flag, susp_flag; int result; int suspended; char *src; acc_t *acc; loc_fd= &sr_fd_table[fd]; if (for_ioctl) { head_ptr= &loc_fd->srf_ioctl_q; tail_ptr= &loc_fd->srf_ioctl_q_tail; ip_flag= SFF_IOCTL_IP; susp_flag= SFF_IOCTL_SUSP; } else { head_ptr= &loc_fd->srf_write_q; tail_ptr= &loc_fd->srf_write_q_tail; ip_flag= SFF_WRITE_IP; susp_flag= SFF_WRITE_SUSP; } assert (loc_fd->srf_flags & ip_flag); if (!count) { m= *head_ptr; *head_ptr= NULL; tail= *tail_ptr; assert(m); mq= m->mq_next; result= (int)offset; sr_reply (m, result, 1); suspended= (loc_fd->srf_flags & susp_flag); loc_fd->srf_flags &= ~(ip_flag|susp_flag); if (suspended) { process_req_q(mq, tail, tail_ptr); } else { assert(!mq); } return NULL; } src= (*head_ptr)->mq_mess.ADDRESS + offset; result= cp_u2b ((*head_ptr)->mq_mess.PROC_NR, src, &acc, count); return result<0 ? NULL : acc; } PRIVATE int sr_put_userdata (fd, offset, data, for_ioctl) int fd; vir_bytes offset; acc_t *data; int for_ioctl; { sr_fd_t *loc_fd; mq_t **head_ptr, **tail_ptr, *m, *tail, *mq; int ip_flag, susp_flag; int result; int suspended; char *dst; loc_fd= &sr_fd_table[fd]; if (for_ioctl) { head_ptr= &loc_fd->srf_ioctl_q; tail_ptr= &loc_fd->srf_ioctl_q_tail; ip_flag= SFF_IOCTL_IP; susp_flag= SFF_IOCTL_SUSP; } else { head_ptr= &loc_fd->srf_read_q; tail_ptr= &loc_fd->srf_read_q_tail; ip_flag= SFF_READ_IP; susp_flag= SFF_READ_SUSP; } assert (loc_fd->srf_flags & ip_flag); if (!data) { m= *head_ptr; assert(m); *head_ptr= NULL; tail= *tail_ptr; mq= m->mq_next; result= (int)offset; sr_reply (m, result, 1); suspended= (loc_fd->srf_flags & susp_flag); loc_fd->srf_flags &= ~(ip_flag|susp_flag); if (suspended) { process_req_q(mq, tail, tail_ptr); } else { assert(!mq); } return OK; } dst= (*head_ptr)->mq_mess.ADDRESS + offset; return cp_b2u (data, (*head_ptr)->mq_mess.PROC_NR, dst); } PRIVATE void process_req_q(mq, tail, tail_ptr) mq_t *mq, *tail, **tail_ptr; { mq_t *m; int result; for(;mq;) { m= mq; mq= mq->mq_next; DBLOCK(1, printf("calling rwio\n")); result= sr_rwio(m); if (result == SUSPEND) { if (mq) { (*tail_ptr)->mq_next= mq; *tail_ptr= tail; } return; } } return; } PRIVATE int cp_u2b (proc, src, var_acc_ptr, size) int proc; char *src; acc_t **var_acc_ptr; int size; { static message mess; acc_t *acc; int i; acc= bf_memreq(size); *var_acc_ptr= acc; i=0; while (acc) { size= (vir_bytes)acc->acc_length; cpvec[i].cpv_src= (vir_bytes)src; cpvec[i].cpv_dst= (vir_bytes)ptr2acc_data(acc); cpvec[i].cpv_size= size; src += size; acc= acc->acc_next; i++; if (i == CPVEC_NR || acc == NULL) { mess.m_type= SYS_VCOPY; mess.m1_i1= proc; mess.m1_i2= this_proc; mess.m1_i3= i; mess.m1_p1= (char *)cpvec; if (sendrec(SYSTASK, &mess) <0) ip_panic(("unable to sendrec")); if (mess.m_type <0) { bf_afree(*var_acc_ptr); *var_acc_ptr= 0; return mess.m_type; } i= 0; } } return OK; } PRIVATE int cp_b2u (acc_ptr, proc, dest) acc_t *acc_ptr; int proc; char *dest; { static message mess; acc_t *acc; int i, size; acc= acc_ptr; i=0; while (acc) { size= (vir_bytes)acc->acc_length; if (size) { cpvec[i].cpv_src= (vir_bytes)ptr2acc_data(acc); cpvec[i].cpv_dst= (vir_bytes)dest; cpvec[i].cpv_size= size; i++; } dest += size; acc= acc->acc_next; if (i == CPVEC_NR || acc == NULL) { mess.m_type= SYS_VCOPY; mess.m1_i1= this_proc; mess.m1_i2= proc; mess.m1_i3= i; mess.m1_p1= (char *)cpvec; if (sendrec(SYSTASK, &mess) <0) ip_panic(("unable to sendrec")); if (mess.m_type <0) { bf_afree(acc_ptr); return mess.m_type; } i= 0; } } bf_afree(acc_ptr); return OK; } PRIVATE int sr_repl_queue(proc, ref, operation) int proc; int ref; int operation; { mq_t *m, *m_cancel, *m_tmp; int result; m_cancel= NULL; for (m= repl_queue; m;) { if (m->mq_mess.REP_PROC_NR == proc) { assert(!m_cancel); m_cancel= m; m= m->mq_next; continue; } assert(m->mq_mess.m_source != MM_PROC_NR); assert(m->mq_mess.m_type == REVIVE); result= send(m->mq_mess.m_source, &m->mq_mess); if (result != OK) ip_panic(("unable to send: %d", result)); m_tmp= m; m= m->mq_next; mq_free(m_tmp); } repl_queue= NULL; if (m_cancel) { assert(m_cancel->mq_mess.m_source != MM_PROC_NR); assert(m_cancel->mq_mess.m_type == REVIVE); result= send(m_cancel->mq_mess.m_source, &m_cancel->mq_mess); if (result != OK) ip_panic(("unable to send: %d", result)); mq_free(m_cancel); return 1; } return 0; } /* * $PchId: sr.c,v 1.9 1996/05/07 21:11:14 philip Exp $ */ /* stacktrace.c Created: Jan 19, 1993 by Philip Homburg Copyright 1995 Philip Homburg */ #include "inet.h" PUBLIC void stacktrace() { typedef unsigned int reg_t; reg_t bp, pc, hbp; extern reg_t get_bp ARGS(( void )); bp= get_bp(); while(bp) { pc= ((reg_t *)bp)[1]; hbp= ((reg_t *)bp)[0]; printf("0x%lx ", (unsigned long)pc); if (hbp != 0 && hbp <= bp) { printf("???"); break; } bp= hbp; } printf("\n"); } /* * $PchId: stacktrace.c,v 1.6 1996/05/07 21:11:34 philip Exp $ */ /* version.c */ char version[]= "inet 0.35K, last compiled on " __DATE__ " " __TIME__; /* * $PchId: version.c,v 1.9 1996/12/17 08:01:39 philip Exp philip $ */ ...3c503.c3c503.hMakefileaha1540.cassert.hat_wini.cbios_wini.cclock.cconsole.cconst.hdmp.cfatfile.cdp8390.cdp8390.hdriver.cdriver.hdrvlib.cdrvlib.hesdi_wini.cexception.cfloppy.cglo.hi8259.c kernel.h keyboard.c keymapsklib.sklib386.sklib88.smain.cpty.cmemory.c misc.c!mpx.s"mpx386.s#mpx88.s$ne2000.c%ne2000.h&printer.c'proc.c(proc.h)protect.c*protect.h+proto.h,tty.c-rs232.c.sb16.h/sb16_dsp.c0sb16_mixer.c1sconst.h2start.c3system.c4table.c5tty.h6type.h7wdeth.c8wdeth.h9dosfile.c:xt_wini.c/* * 3c503.c A shared memory driver for Etherlink II board. * * Created: Dec. 20, 1996 by G. Falzoni * * Inspired by the TNET package by M. Ostrowski, the driver for Linux * by D. Becker, the Crynwr 3c503 packet driver, and the Amoeba driver. * * It works in shared memory mode and should be used with the * device driver for NS 8390 based cards of Minix. Programmed * I/O could be used as well but would result in poor performance. */ #include "kernel.h" #include #include #include "dp8390.h" #include "3c503.h" #if (ENABLE_DP8390 && ENABLE_3C503) || __minix_vmd _PROTOTYPE(static void el2_init, (dpeth_t *dep)); _PROTOTYPE(static void el2_stop, (dpeth_t *dep)); /*===========================================================================* * el2_init * *===========================================================================*/ static void el2_init(dep) dpeth_t * dep; { /* Initalize hardware and data structures. */ int ix, irq; int sendq_nr; int cntr; /* Map the address PROM to lower I/O address range */ cntr = inb_el2(dep, EL2_CNTR); outb_el2(dep, EL2_CNTR, cntr | ECNTR_SAPROM); /* Read station address from PROM */ for (ix = EL2_EA0; ix <= EL2_EA5; ix += 1) dep->de_address.ea_addr[ix] = inb_el2(dep, ix); /* Map the 8390 back to lower I/O address range */ outb_el2(dep, EL2_CNTR, cntr); /* Enable memory, but turn off interrupts until we are ready */ outb_el2(dep, EL2_CFGR, ECFGR_IRQOFF); dep->de_data_port = dep->de_dp8390_port = dep->de_base_port; dep->de_prog_IO = 0; /* Programmed I/O not yet available */ /* Check width of data bus: * 1. Write 0 to WTS bit. The board will drive it to 1 if it is a * 16-bit card. * 2. Select page 2 * 3. See if it is a 16-bit card * 4. Select page 0 */ outb_el2(dep, DP_CR, CR_PS_P0|CR_DM_ABORT|CR_STP); outb_el2(dep, DP_DCR, 0); outb_el2(dep, DP_CR, CR_PS_P2|CR_DM_ABORT|CR_STP); dep->de_16bit = (inb_el2(dep, DP_DCR) & DCR_WTS) != 0; outb_el2(dep, DP_CR, CR_PS_P0|CR_DM_ABORT|CR_STP); /* Allocate one send buffer (1.5KB) per 8KB of on board memory. */ sendq_nr = (dep->de_ramsize - dep->de_offset_page) / 0x2000; if (sendq_nr < 1) sendq_nr = 1; else if (sendq_nr > SENDQ_NR) sendq_nr = SENDQ_NR; dep->de_sendq_nr = sendq_nr; for (ix = 0; ix < sendq_nr; ix++) dep->de_sendq[ix].sq_sendpage = (ix * SENDQ_PAGES) + EL2_SM_START_PG; dep->de_startpage = (ix * SENDQ_PAGES) + EL2_SM_START_PG; dep->de_stoppage = EL2_SM_STOP_PG; outb_el2(dep, EL2_STARTPG, dep->de_startpage); outb_el2(dep, EL2_STOPPG, dep->de_stoppage); /* Point the vector pointer registers somewhere ?harmless?. */ outb_el2(dep, EL2_VP2, 0xFF); /* Point at the ROM restart location */ outb_el2(dep, EL2_VP1, 0xFF); /* 0xFFFF:0000 (from original sources) */ outb_el2(dep, EL2_VP0, 0x00); /* - What for protected mode? */ /* Set interrupt level for 3c503 */ irq = (dep->de_irq &= ~DEI_DEFAULT); /* Strip the default flag. */ if (irq == 9) irq = 2; if (irq < 2 || irq > 5) panic("bad 3c503 irq configuration", irq); outb_el2(dep, EL2_IDCFG, (0x04 << irq)); outb_el2(dep, EL2_DRQCNT, 0x08); /* Set burst size to 8 */ outb_el2(dep, EL2_DMAAH, EL2_SM_START_PG); /* Put start of TX */ outb_el2(dep, EL2_DMAAL, 0x00); /* buffer in the GA DMA reg */ outb_el2(dep, EL2_CFGR, ECFGR_NORM); /* Enable shared memory */ if (!debug) { printf("%s: 3c503 at %X:%d:%lX\n", dep->de_name, dep->de_base_port, dep->de_irq, dep->de_linmem + dep->de_offset_page); } else { printf("%s: 3Com Etherlink II %sat I/O address 0x%X, " "memory address 0x%lX, irq %d\n", dep->de_name, dep->de_16bit ? "(16-bit) " : "", dep->de_base_port, dep->de_linmem + dep->de_offset_page, dep->de_irq); } } /*===========================================================================* * el2_stop * *===========================================================================*/ static void el2_stop(dep) dpeth_t * dep; { /* Stops board by disabling interrupts. */ #if DEBUG printf("%s: stopping Etherlink\n", dep->de_name); #endif outb_el2(dep, EL2_CFGR, ECFGR_IRQOFF); return; } /*===========================================================================* * el2_probe * *===========================================================================*/ int el2_probe(dep) dpeth_t * dep; { /* Probe for the presence of an EtherLink II card. Initialize memory * addressing if card detected. */ int iobase, membase; int thin; /* Thin ethernet or AUI? */ thin = (dep->de_linmem & 1) ? ECNTR_AUI : ECNTR_THIN; /* Location registers should have 1 bit set */ if (!(iobase = inb_el2(dep, EL2_IOBASE))) return 0; if (!((membase = inb_el2(dep, EL2_MEMBASE)) & 0xF0)) return 0; if ((iobase & (iobase - 1)) || (membase & (membase - 1))) return 0; /* Resets board */ outb_el2(dep, EL2_CNTR, ECNTR_RESET | thin); milli_delay(1); outb_el2(dep, EL2_CNTR, thin); milli_delay(5); /* Map the address PROM to lower I/O address range */ outb_el2(dep, EL2_CNTR, ECNTR_SAPROM | thin); if (inb_el2(dep, EL2_EA0) != 0x02 || /* Etherlink II Station address */ inb_el2(dep, EL2_EA1) != 0x60 || /* MUST be 02:60:8c:xx:xx:xx */ inb_el2(dep, EL2_EA2) != 0x8C) return 0; /* No Etherlink board at this address */ /* Map the 8390 back to lower I/O address range */ outb_el2(dep, EL2_CNTR, thin); /* Setup shared memory addressing for 3c503 */ dep->de_linmem = ((membase & 0xC0) ? EL2_BASE_0D8000 : EL2_BASE_0C8000) + ((membase & 0xA0) ? (EL2_BASE_0CC000 - EL2_BASE_0C8000) : 0x0000); dep->de_offset_page = (EL2_SM_START_PG * DP_PAGESIZE); dep->de_ramsize = (EL2_SM_STOP_PG - EL2_SM_START_PG) * DP_PAGESIZE; /* (Bad kludge, something Philip needs to look into. -- kjb) */ dep->de_linmem -= dep->de_offset_page; dep->de_ramsize += dep->de_offset_page; /* Board initialization and stop functions */ dep->de_initf = el2_init; dep->de_stopf = el2_stop; return 1; } #endif /* ENABLE_DP8390 && ENABLE_3C503 */ /** 3c503.c **/ /* * 3c503.h A shared memory driver for Etherlink II board. * * Created: Dec. 20, 1996 by G. Falzoni */ #define EL2_MEMTEST 0 /* Set to 1 for on board memory test */ #define EL2_GA 0x0400 /* Offset of registers in Gate Array */ /* EtherLink II card */ #define EL2_STARTPG (EL2_GA+0x00) /* Start page matching DP_PSTARTPG */ #define EL2_STOPPG (EL2_GA+0x01) /* Stop page matching DP_PSTOPPG */ #define EL2_DRQCNT (EL2_GA+0x02) /* DMA burst count */ #define EL2_IOBASE (EL2_GA+0x03) /* I/O base jumpers (bit coded) */ #define EL2_MEMBASE (EL2_GA+0x04) /* Memory base jumpers (bit coded) */ #define EL2_CFGR (EL2_GA+0x05) /* Configuration Register for GA */ #define EL2_CNTR (EL2_GA+0x06) /* Control(write) and status(read) */ #define EL2_STATUS (EL2_GA+0x07) #define EL2_IDCFG (EL2_GA+0x08) /* Interrupt/DMA configuration reg */ #define EL2_DMAAH (EL2_GA+0x09) /* DMA address register (High byte) */ #define EL2_DMAAL (EL2_GA+0x0A) /* DMA address register (Low byte) */ #define EL2_VP2 (EL2_GA+0x0B) /* Vector pointer - set to */ #define EL2_VP1 (EL2_GA+0x0C) /* reset address (0xFFFF:0) */ #define EL2_VP0 (EL2_GA+0x0D) /* */ #define EL2_FIFOH (EL2_GA+0x0E) /* FIFO for progr. I/O (High byte) */ #define EL2_FIFOL (EL2_GA+0x0F) /* FIFO for progr. I/O (Low byte) */ #define EL2_EA0 0x00 /* Most significant byte of ethernet address */ #define EL2_EA1 0x01 #define EL2_EA2 0x02 #define EL2_EA3 0x03 #define EL2_EA4 0x04 #define EL2_EA5 0x05 /* Least significant byte of ethernet address */ /* Bits in EL2_CNTR register */ #define ECNTR_RESET 0x01 /* Software Reset */ #define ECNTR_THIN 0x02 /* Onboard transceiver enable */ #define ECNTR_AUI 0x00 /* Onboard transceiver disable */ #define ECNTR_SAPROM 0x04 /* Map the station address prom */ /* Bits in EL2_CFGR register */ #define ECFGR_NORM 0x49 /* Enable 8k shared memory, no DMA, TC int */ #define ECFGR_IRQOFF 0xC9 /* As above, disable 8390 IRQ */ /* Shared memory management parameters */ #define EL2_SM_START_PG 0x20 /* First page of TX buffer */ #define EL2_SM_STOP_PG 0x40 /* Last page +1 of RX ring */ /* Physical addresses where an Etherlink board can be configured */ #define EL2_BASE_0C8000 0x0C8000 #define EL2_BASE_0CC000 0x0CC000 #define EL2_BASE_0D8000 0x0D8000 #define EL2_BASE_0DC000 0x0DC000 #define inb_el2(dep,reg) (in_byte((dep)->de_base_port+(reg))) #define outb_el2(dep,reg,data) (out_byte((dep)->de_base_port+(reg),(data))) /** 3c503.h **/ # Makefile for kernel # Directories u = /usr i = $u/include s = $i/sys h = $i/minix b = $i/ibm l = $u/lib # Programs, flags, etc. CC = exec cc CPP = $l/cpp LD = $(CC) -.o CFLAGS = -I$i LDFLAGS = -i HEAD = mpx.o OBJS = start.o protect.o klib.o table.o main.o proc.o \ exception.o system.o clock.o memory.o tty.o keyboard.o \ console.o i8259.o rs232.o dmp.o misc.o driver.o \ drvlib.o floppy.o at_wini.o bios_wini.o esdi_wini.o \ xt_wini.o printer.o aha1540.o dp8390.o pty.o \ wdeth.o ne2000.o 3c503.o sb16_dsp.o sb16_mixer.o \ fatfile.o dosfile.o # What to make. kernel: $(HEAD) $(OBJS) $(LD) $(LDFLAGS) -o $@ $(HEAD) $(OBJS) -lsys install -S 0 $@ all install: cd keymaps && $(MAKE) -$(MAKEFLAGS) $@ clean: cd keymaps && $(MAKE) -$(MAKEFLAGS) $@ rm -f *.o *.bak kernel # Dependencies a = kernel.h $h/config.h $h/const.h $h/type.h $h/syslib.h \ $s/types.h $i/string.h $i/limits.h $i/errno.h \ const.h type.h proto.h glo.h d = driver.h $h/callnr.h $h/com.h $h/partition.h $h/u64.h proc.h dl = drvlib.h $b/partition.h klib.o: $h/config.h $h/const.h const.h sconst.h protect.h klib.o: klib88.s klib386.s mpx.o: $h/config.h $h/const.h $h/com.h const.h protect.h sconst.h mpx.o: mpx88.s mpx386.s clock.o: $a clock.o: $i/signal.h clock.o: $h/callnr.h clock.o: $h/com.h clock.o: proc.h console.o: $a console.o: $i/termios.h console.o: $h/callnr.h console.o: $h/com.h console.o: protect.h console.o: tty.h console.o: proc.h start.o: $a start.o: $i/stdlib.h start.o: protect.h dmp.o: $a dmp.o: $h/com.h dmp.o: proc.h exception.o: $a exception.o: $i/signal.h exception.o: proc.h driver.o: $a $d driver.o: $s/ioctl.h drvlib.o: $a $d $(dl) floppy.o: $a $d $(dl) floppy.o: $b/diskparm.h i8259.o: $a keyboard.o: $a keyboard.o: $i/termios.h keyboard.o: $i/signal.h keyboard.o: $i/unistd.h keyboard.o: $h/callnr.h keyboard.o: $h/com.h keyboard.o: $h/keymap.h keyboard.o: tty.h keyboard.o: keymaps/us-std.src main.o: $a main.o: $i/unistd.h main.o: $i/signal.h main.o: $i/a.out.h main.o: $h/callnr.h main.o: $h/com.h main.o: proc.h memory.o: $a $d memory.o: $s/ioctl.h memory.o: protect.h memory.o: $b/int86.h misc.o: $a misc.o: $i/stdlib.h misc.o: $h/com.h misc.o: assert.h printer.o: $a printer.o: $h/callnr.h printer.o: $h/com.h printer.o: proc.h proc.o: $a proc.o: $h/callnr.h proc.o: $h/com.h proc.o: proc.h protect.o: $a protect.o: proc.h protect.o: protect.h pty.o: $a pty.o: $i/termios.h pty.o: $i/signal.h pty.o: $h/callnr.h pty.o: $h/com.h pty.o: tty.h pty.o: proc.h rs232.o: $a rs232.o: $i/termios.h rs232.o: $i/signal.h rs232.o: tty.h rs232.o: proc.h system.o: $a system.o: $i/stdlib.h system.o: $i/signal.h system.o: $i/unistd.h system.o: $s/sigcontext.h system.o: $s/ptrace.h system.o: $s/svrctl.h system.o: $h/callnr.h system.o: $h/com.h system.o: proc.h system.o: protect.h system.o: assert.h table.o: $a table.o: $i/stdlib.h table.o: $i/termios.h table.o: $h/com.h table.o: proc.h table.o: tty.h table.o: $b/int86.h tty.o: $a tty.o: $i/termios.h tty.o: $i/sgtty.h tty.o: $s/ioctl.h tty.o: $i/signal.h tty.o: $h/callnr.h tty.o: $h/com.h tty.o: $h/keymap.h tty.o: proc.h tty.o: tty.h aha1540.o: $a $d $(dl) aha1540.o: $i/fcntl.h aha1540.o: $s/mtio.h aha1540.o: $s/ioctl.h at_wini.o: $a $d $(dl) bios_wini.o: $a $d $(dl) bios_wini.o: $b/int86.h esdi_wini.o: $a $d $(dl) xt_wini.o: $a $d $(dl) fatfile.o: $a $d $(dl) fatfile.o: $i/stdlib.h fatfile.o: assert.h dosfile.o: $a $d $(dl) dosfile.o: $i/stdlib.h dosfile.o: $b/int86.h dp8390.o: $a dp8390.o: $i/stdlib.h dp8390.o: $h/com.h dp8390.o: $i/net/hton.h dp8390.o: $i/net/gen/ether.h dp8390.o: $i/net/gen/eth_io.h dp8390.o: assert.h dp8390.o: protect.h dp8390.o: dp8390.h dp8390.o: proc.h wdeth.o: $a wdeth.o: $i/net/gen/ether.h wdeth.o: $i/net/gen/eth_io.h wdeth.o: assert.h wdeth.o: dp8390.h wdeth.o: wdeth.h ne2000.o: $a ne2000.o: $i/net/gen/ether.h ne2000.o: $i/net/gen/eth_io.h ne2000.o: dp8390.h ne2000.o: ne2000.h 3c503.o: $a 3c503.o: $i/net/gen/ether.h 3c503.o: $i/net/gen/eth_io.h 3c503.o: dp8390.h 3c503.o: 3c503.h sb16_dsp.o: $a sb16_dsp.o: $h/com.h sb16_dsp.o: $h/callnr.h sb16_dsp.o: $s/ioctl.h sb16_dsp.o: sb16.h sb16_mixer.o: $a sb16_mixer.o: $h/com.h sb16_mixer.o: $h/callnr.h sb16_mixer.o: $s/ioctl.h sb16_mixer.o: $h/sound.h sb16_mixer.o: sb16.h /* * This file contains the device dependent part of an experimental disk * and tape driver for the Adaptec 154x SCSI Host Adapter family, written * by James da Silva (jds@cs.umd.edu). * * I wrote this driver using the technical documentation for the AHA available * from the Adaptec BBS at 1-408-945-7727, and from the SCSI standard drafts * available on NCR's SCSI BBS at 1-316-636-8700. I suggest you get both * these documents if you want to understand and hack this code. * * This code has been extensively modified by Kees J. Bot (kjb@cs.vu.nl) to * a point that James will barely recognize it as his. It is completely * remodeled and doubled in both size and functionality. It is no longer * considered experimental either. * * The supported device numbers are as follows: * # Name Device * 0 d0 disk 0 * 1 d0p0 disk 0, partition 0 * 2 d0p0 disk 0, partition 1 * 3 d0p0 disk 0, partition 2 * 4 d0p0 disk 0, partition 3 * 5 d1 disk 1 * 6 d1p0 disk 1, partition 0 * .. .... .... * 39 d7p3 disk 7, partition 3 * * 64 t0n tape 0, no rewind * 65 t0 tape 0, rewind * 66 t1n tape 1, no rewind * .. .... .... * 79 t7 tape 7, rewind * * 128 d0p0s0 disk 0, partition 0, subpartition 0 * 129 d0p0s1 disk 0, partition 0, subpartition 1 * ... .... .... * 255 d7p3s3 disk 7, partition 3, subpartition 3 * * The translation of device numbers to targets and logical units is very * simple: The target is the same as the disk or tape number, the logical * unit is always zero. Devices with logical unit numbers other then zero * are usually RAID enclosures. If you happen to be so lucky to have such * a thing, then you can reprogram (e.g.) d7 and t7 to target 0, lun 1 * from the Boot Monitor with 'aha1540-d7=:0,1'. * * * The file contains one entry point: * * aha1540_scsi_task: main entry when system is brought up * * * Changes: * 5 May 1992 by Kees J. Bot: device dependent/independent split. * 7 Jul 1992 by Kees J. Bot: speedup & features. * 28 Dec 1992 by Kees J. Bot: completely remodeled & virtual memory. * 18 Sep 1994 by Kees J. Bot: removed "send 2 commands at once" junk. * 14 May 2000 by Kees J. Bot: d-d/i rewrite. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #if ENABLE_AHA1540_SCSI #include #include #include #ifndef AHA_DEBUG #define AHA_DEBUG 0 /* 1=print all SCSI errors | 2=dump ccb * 4=show iov&request | 8=dump scsi cmd */ #endif /* AHA-154x port addresses */ #define AHA_BASEREG 0x330 /* default base port address of AHA registers */ #define AHA_CNTLREG aha_basereg+0 /* Control Register - write only */ #define AHA_STATREG aha_basereg+0 /* Status Register - read only */ #define AHA_DATAREG aha_basereg+1 /* Data Register - read/write */ #define AHA_INTRREG aha_basereg+2 /* Interrupt Flags - read only */ /* control register bits */ #define AHA_HRST 0x80 /* bit 7 - Hard Reset */ #define AHA_SRST 0x40 /* bit 6 - Soft Reset */ #define AHA_IRST 0x20 /* bit 5 - Interrupt Reset */ #define AHA_SCRST 0x10 /* bit 4 - SCSI Bus Reset */ /* 0x08 * bit 3 - Reserved (set to 0) */ /* 0x04 * bit 2 - Reserved (set to 0) */ /* 0x02 * bit 1 - Reserved (set to 0) */ /* 0x01 * bit 0 - Reserved (set to 0) */ /* status register bits */ #define AHA_STST 0x80 /* bit 7 - Self Test in Progress */ #define AHA_DIAGF 0x40 /* bit 6 - Internal Diagnostic Failure */ #define AHA_INIT 0x20 /* bit 5 - Mailbox Initialization Required */ #define AHA_IDLE 0x10 /* bit 4 - SCSI Host Adapter Idle */ #define AHA_CDF 0x08 /* bit 3 - Command/Data Out Port Full */ #define AHA_DF 0x04 /* bit 2 - Data In Port Full */ /* 0x02 * bit 1 - Reserved */ #define AHA_INVDCMD 0x01 /* bit 0 - Invalid Host Adapter Command */ /* interrupt flags register bits */ #define AHA_ANYINT 0x80 /* bit 7 - Any Interrupt */ /* 0x40 * bit 6 - Reserved */ /* 0x20 * bit 5 - Reserved */ /* 0x10 * bit 4 - Reserved */ #define AHA_SCRD 0x08 /* bit 3 - SCSI Reset Detected */ #define AHA_HACC 0x04 /* bit 2 - Host Adapter Command Complete */ #define AHA_MBOE 0x02 /* bit 1 - Mailbox Out Empty */ #define AHA_MBIF 0x01 /* bit 0 - Mailbox In Full */ /* AHA board models */ #define AHA1540 0x30 #define AHA1540A 0x41 #define AHA1640 0x42 #define AHA1740 0x43 #define AHA1540C 0x44 #define AHA1540CF 0x45 #define BT545 0x20 /* BusLogic */ /* AHA Command Codes */ #define AHACOM_INITBOX 0x01 /* Mailbox Initialization */ #define AHACOM_STARTSCSI 0x02 /* Start SCSI Command */ #define AHACOM_HAINQUIRY 0x04 /* Host Adapter Inquiry */ #define AHACOM_SETIMEOUT 0x06 /* Set SCSI selection time out value */ #define AHACOM_BUSON 0x07 /* Set DMA bus on time */ #define AHACOM_BUSOFF 0x08 /* Set DMA bus off time */ #define AHACOM_SPEED 0x09 /* Set DMA transfer speed */ #define AHACOM_INSTALLED 0x0A /* Return Installed Devices */ #define AHACOM_GETCONFIG 0x0B /* Return Configuration Data */ #define AHACOM_GETSETUP 0x0D /* Return Setup Data */ #define AHACOM_EXTBIOS 0x28 /* Return Extended BIOS Info */ #define AHACOM_MBOX_ENABLE 0x29 /* Enable Mailbox Interface */ /* AHA Mailbox Out Codes */ #define AHA_MBOXFREE 0x00 /* Mailbox is Free */ #define AHA_MBOXSTART 0x01 /* Start Command */ #define AHA_MBOXABORT 0x02 /* Abort Command */ /* AHA Mailbox In Codes */ #define AHA_MBOXOK 0x01 /* Command Completed Successfully */ #define AHA_MBOXERR 0x04 /* Command Completed with Error */ /* Basic types */ typedef unsigned char byte; typedef byte big16[2]; /* 16 bit big-endian values */ typedef byte big24[3]; /* AHA uses 24 bit, big-endian values! */ typedef byte big32[4]; /* Group 1 SCSI commands use 32 bit big-endian values */ /* AHA Mailbox structure */ typedef struct { byte status; /* Command or Status byte */ big24 ccbptr; /* pointer to Command Control Block */ } mailbox_t; /* SCSI Group 0 Command Descriptor Block structure */ typedef union { struct { /* Disk i/o commands */ byte d_scsi_op; /* SCSI Operation Code */ # define SCSI_UNITRDY 0x00 /* Test Unit Ready */ # define SCSI_REWIND 0x01 /* Rewind */ # define SCSI_REQSENSE 0x03 /* Request sense */ # define SCSI_RDLIMITS 0x05 /* Read Block Limits Opcode */ # define SCSI_READ 0x08 /* Group 0 Read Opcode */ # define SCSI_WRITE 0x0A /* Group 0 Write Opcode */ # define SCSI_WREOF 0x10 /* Write File Marks */ # define SCSI_SPACE 0x11 /* Space over filemarks/blocks */ # define SCSI_INQUIRY 0x12 /* Group 0 Inquiry Opcode */ # define SCSI_MDSELECT 0x15 /* Group 0 Mode Select Opcode */ # define SCSI_ERASE 0x19 /* Erase Tape */ # define SCSI_MDSENSE 0x1A /* Group 0 Mode Sense Opcode */ # define SCSI_STRTSTP 0x1B /* Start/Stop */ # define SCSI_LOADUNLD 0x1B /* Load/Unload */ big24 d_lba; /* LUN and logical block address */ byte d_nblocks; /* Transfer size in blocks */ byte d_control; /* Reserved and link bit fields, set to 0 */ } d; struct { /* Tape i/o commands */ byte t_scsi_op; /* SCSI Operation Code */ byte t_fixed; /* Fixed length? */ big24 t_trlength; /* Transfer length */ byte t_control; /* reserved and link bit fields, set to 0 */ } t; } cdb0_t; #define scsi_op d.d_scsi_op #define lba d.d_lba #define nblocks d.d_nblocks #define fixed t.t_fixed #define trlength t.t_trlength #define control d.d_control /* SCSI Group 1 Command Descriptor Block structure */ typedef union { struct { /* Disk i/o commands */ byte d_scsi_op; /* SCSI Operation Code */ # define SCSI_CAPACITY 0x25 /* Read Capacity */ # define SCSI_READ1 0x28 /* Group 1 Read Opcode */ # define SCSI_WRITE1 0x2A /* Group 1 Write Opcode */ byte d_lunra; /* LUN etc. */ big32 d_lba; /* Logical Block Address */ byte reserved; big16 d_nblocks; /* transfer size in blocks */ byte d_control; /* reserved and link bit fields, set to 0 */ } d; } cdb1_t; #define lunra d.d_lunra /* SCSI Request Sense Information */ typedef struct { byte errc; /* Error Code, Error Class, and Valid bit */ byte segnum; /* Segment Number */ byte key; /* Sense Key */ # define sense_key(key) (key & 0x0F) /* the key portion */ # defiu*w*x*y*z*{*|*}*~***********************************************ne sense_ili(key) (key & 0x20) /* illegal block size */ # define sense_eom(key) (key & 0x40) /* end-of-media */ # define sense_eof(key) (key & 0x80) /* filemark reached */ big32 info; /* sense info */ byte len; /* additional length */ big32 comspec; /* command specific info */ byte add_code; /* additional sense code */ byte add_qual; /* additional sense code qualifier */ } sense_t; /* Interesting SCSI sense key types. */ #define SENSE_NO_SENSE 0x00 #define SENSE_RECOVERED 0x01 #define SENSE_NOT_READY 0x02 #define SENSE_HARDWARE 0x04 #define SENSE_UNIT_ATT 0x06 #define SENSE_BLANK_CHECK 0x08 #define SENSE_VENDOR 0x09 #define SENSE_ABORTED_CMD 0x0B /* SCSI Inquiry Information */ typedef struct { byte devtype; /* Peripheral Device Type */ # define SCSI_DEVDISK 0 /* Direct-access */ # define SCSI_DEVTAPE 1 /* Sequential-access */ # define SCSI_DEVPRN 2 /* Printer */ # define SCSI_DEVCPU 3 /* Processor */ # define SCSI_DEVWORM 4 /* Write-Once Read-Multiple device */ # define SCSI_DEVCDROM 5 /* Read-Only Direct-access */ # define SCSI_DEVSCANNER 6 /* Scanner */ # define SCSI_DEVOPTICAL 7 /* Optical Memory */ # define SCSI_DEVJUKEBOX 8 /* Medium Changer device */ # define SCSI_DEVCOMM 9 /* Communications device */ # define SCSI_DEVMAX 9 /* Last device type we know about */ # define SCSI_DEVUNKNOWN 10 /* If we do not know or care. */ byte devqual; /* Device-Type Qualifier */ # define scsi_rmb(d) (((d) & 0x80) != 0) /* Removable? */ byte stdver; /* Version of standard compliance */ # define scsi_isover(v) (((v) & 0xC0) >> 6) /* ISO version */ # define scsi_ecmaver(v) (((v) & 0x38) >> 3) /* ECMA version */ # define scsi_ansiver(v) ((v) & 0x07) /* ANSI version */ byte format; /* Response data format */ byte len; /* length of remaining info */ byte reserved[2]; byte flags; # define scsi_sync(f) (((f) & 0x10) != 0) /* Sync SCSI? */ char vendor[8]; /* Vendor name */ char product[16]; /* Product name */ char revision[4]; /* Revision level */ char extra[20]; /* Vendor specific */ } inquiry_t; /* AHA Command Control Block structure */ typedef struct { byte opcode; /* Operation Code */ # define CCB_INIT 0x00 /* SCSI Initiator Command */ # define CCB_TARGET 0x01 /* Target Mode Command */ # define CCB_SCATTER 0x02 /* Initiator with scatter/gather */ byte addrcntl; /* Address and Direction Control: */ # define ccb_scid(id) (((id)<<5)&0xE0) /* SCSI ID field */ # define CCB_OUTCHECK 0x10 /* Outbound length check */ # define CCB_INCHECK 0x08 /* Inbound length check */ # define CCB_NOCHECK 0x00 /* No length check */ # define ccb_lun(lun) ((lun)&0x07) /* SCSI LUN field */ byte cmdlen; /* SCSI Command Length (6 for Group 0) */ byte senselen; /* Request/Disable Sense, Allocation Length */ # define CCB_SENSEREQ 0x0E /* Request Sense, 14 bytes */ # define CCB_SENSEOFF 0x01 /* Disable Request Sense */ big24 datalen; /* Data Length: 3 bytes, big endian */ big24 dataptr; /* Data Pointer: 3 bytes, big endian */ big24 linkptr; /* Link Pointer: 3 bytes, big endian */ byte linkid; /* Command Linking Identifier */ byte hastat; /* Host Adapter Status */ # define HST_TIMEOUT 0x11 /* SCSI selection timeout */ byte tarstat; /* Target Device Status */ # define TST_CHECK 0x02 /* Check status in sense[] */ # define TST_LUNBUSY 0x08 /* Unit is very busy */ byte reserved[2]; /* reserved, set to 0 */ byte cmd[sizeof(cdb1_t)]; /* SCSI Command Descriptor Block */ byte sense[sizeof(sense_t)];/* SCSI Request Sense Information */ } ccb_t; /* End of one chunk must be as "odd" as the start of the next. */ #define DMA_CHECK(end, start) ((((int) (end) ^ (int) (start)) & 1) == 0) /* Scatter/Gather DMA list */ typedef struct { big24 datalen; /* length of a memory segment */ big24 dataptr; /* address of a memory segment */ } dma_t; /* Miscellaneous parameters */ #define SCSI_TIMEOUT 250 /* SCSI selection timeout (ms), 0 = none */ #define AHA_TIMEOUT 500 /* max msec wait for controller reset */ #define MAX_DEVICES 8 /* 8 devices for the 8 SCSI targets */ #define NR_DISKDEVS (MAX_DEVICES * DEV_PER_DRIVE) #define NR_TAPEDEVS (MAX_DEVICES * 2) #define NR_GENDEVS (MAX_DEVICES) #define SUB_PER_DRIVE (NR_PARTITIONS * NR_PARTITIONS) #define NR_SUBDEVS (MAX_DEVICES * SUB_PER_DRIVE) #define TYPE_D 0 /* disk device number */ #define TYPE_TN 1 /* non rewind-on-close tape device */ #define TYPE_T 2 /* rewind-on-close tape device */ /* Variables */ PRIVATE struct scsi { /* Per-device table */ char targ; /* SCSI Target ID */ char lun; /* SCSI Logical Unit Number */ char state; /* online? */ # define S_PRESENT 0x01 /* Device exists */ # define S_READY 0x02 /* Device is ready */ # define S_RDONLY 0x04 /* Device is read-only */ char devtype; /* SCSI_DEVDISK, SCSI_DEVTAPE, ... */ unsigned block_size; /* device or media block size */ unsigned count_max; /* maximum single read or write */ unsigned open_ct; /* number of processes using the device */ union { struct { /* Tape data */ char open_mode; /* open for reading or writing? */ char at_eof; /* got EOF mark */ char need_eof; /* need to write an eof mark */ char tfixed; /* tape in fixed mode */ struct mtget tstat; /* tape status info */ struct device dummypart; /* something for s_prepare to return */ } tape; struct { /* Disk data */ struct device part[DEV_PER_DRIVE]; /* disks and partitions */ struct device subpart[SUB_PER_DRIVE]; /* subpartitions */ } disk; } u; } scsi[MAX_DEVICES]; #define open_mode u.tape.open_mode #define at_eof u.tape.at_eof #define need_eof u.tape.need_eof #define tfixed u.tape.tfixed #define tstat u.tape.tstat #define dummypart u.tape.dummypart #define part u.disk.part #define subpart u.disk.subpart /* Tape device status (tstat.mt_dsreg). */ #define DS_OK 0 /* Device OK */ #define DS_ERR 1 /* Error state */ #define DS_EOF 2 /* Last read or space hit EOF */ /* SCSI device types */ PRIVATE char *scsi_devstr[SCSI_DEVMAX+1] = { "DISK", "TAPE", "PRINTER", "CPU", "WORM", "CDROM", "SCANNER", "OPTICAL", "JUKEBOX", "COMM" }; /* SCSI sense key types */ PRIVATE char *str_scsi_sense[] = { "NO SENSE INFO", "RECOVERED ERROR", "NOT READY", "MEDIUM ERROR", "HARDWARE ERROR", "ILLEGAL REQUEST", "UNIT ATTENTION", "DATA PROTECT", "BLANK CHECK", "VENDOR UNIQUE ERROR", "COPY ABORTED", "ABORTED COMMAND", "EQUAL", "VOLUME OVERFLOW", "MISCOMPARE", "SENSE RESERVED" }; /* Some of the above errors must be printed on the console. */ #if AHA_DEBUG & 1 #define sense_serious(key) ((key) != 0) #else #define sense_serious(key) ((0xFE1C & (1 << (key))) != 0) #endif /* Administration for one SCSI request. */ typedef struct request { int opcode; /* DEV_GATHER or DEV_SCATTER */ unsigned count; /* number of bytes to transfer */ unsigned retry; /* number of tries allowed if retryable */ u64_t position; /* first byte on the device to transfer */ ccb_t ccb; /* Command Control Block */ dma_t dmalist[NR_IOREQS]; /* scatter/gather dma list */ dma_t *dmaptr; /* to add scatter/gather entries */ dma_t *dmalimit; /* adapter model dependent limit to list */ } request_t; PRIVATE request_t request; #define rq (&request) /* current request (there is only one) */ #define ccb_cmd0(rq) (* (cdb0_t *) (rq)->ccb.cmd) #define ccb_cmd1(rq) (* (cdb1_t *) (rq)->ccb.cmd) #define ccb_sense(rq) (* (sense_t *) ((rq)->ccb.cmd + (rq)->ccb.cmdlen)) PRIVATE int aha_tasknr; /* my task number */ PRIVATE int aha_basereg; /* base I/O register */ PRIVATE int aha_model; /* board model */ PRIVATE struct scsi *s_sp; /* active SCSI device struct */ PRIVATE struct device *s_dv; /* active partition */ PRIVATE int s_type; /* disk, nonrewind tape, rewind tape? */ PRIVATE int aha_irq; /* configured IRQ */ PRIVATE mailbox_t mailbox[2]; /* out and in mailboxes */ PRIVATE inquiry_t inqdata; /* results of Inquiry command */ /* Functions */ FORWARD _PROTOTYPE( void s_init, (void) ); FORWARD _PROTOTYPE( struct device *s_prepare, (int device) ); FORWARD _PROTOTYPE( char *s_name, (void) ); FORWARD _PROTOTYPE( int s_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int scsi_probe, (void) ); FORWARD _PROTOTYPE( int scsi_sense, (void) ); FORWARD _PROTOTYPE( int scsi_inquiry, (void) ); FORWARD _PROTOTYPE( int scsi_ndisk, (void) ); FORWARD _PROTOTYPE( int scsi_ntape, (void) ); FORWARD _PROTOTYPE( int s_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int s_rdcdrom, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int s_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int s_do_ioctl, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int scsi_simple, (int opcode, int count) ); FORWARD _PROTOTYPE( void group0, (void) ); FORWARD _PROTOTYPE( void group1, (void) ); FORWARD _PROTOTYPE( int scsi_command, (phys_bytes data, vir_bytes len) ); FORWARD _PROTOTYPE( void aha_command, (int outlen, byte *outptr, int inlen, byte *inptr) ); FORWARD _PROTOTYPE( int aha_reset, (void) ); FORWARD _PROTOTYPE( int s_handler, (int irq) ); FORWARD _PROTOTYPE( void h2b16, (big16 b, U16_t l) ); FORWARD _PROTOTYPE( void h2b24, (big24 b, u32_t l) ); FORWARD _PROTOTYPE( void h2b32, (big32 b, u32_t l) ); FORWARD _PROTOTYPE( u16_t b2h16, (big16 b) ); FORWARD _PROTOTYPE( u32_t b2h24, (big24 b) ); FORWARD _PROTOTYPE( u32_t b2h32, (big32 b) ); #if AHA_DEBUG & 2 FORWARD _PROTOTYPE( void errordump, (void) ); #else #define errordump() #endif #if AHA_DEBUG & 4 FORWARD _PROTOTYPE( void show_iov, (iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( void show_req, (void) ); #else #define show_iov(iov, nr_req) ((void)0) #define show_req() ((void)0) #endif #if AHA_DEBUG & 8 FORWARD _PROTOTYPE( void dump_scsi_cmd, (void) ); #else #define dump_scsi_cmd() #endif FORWARD _PROTOTYPE( void s_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver s_dtab = { s_name, /* current device's name */ s_do_open, /* open or mount request, initialize device */ s_do_close, /* release device */ s_do_ioctl, /* tape and partition ioctls */ s_prepare, /* prepare for I/O on a given minor device */ s_transfer, /* do the I/O */ nop_cleanup, /* no cleanup needed */ s_geometry /* tell the geometry of the disk */ }; /*===========================================================================* * aha1540_scsi_task * *===========================================================================*/ PUBLIC void aha1540_scsi_task() { /* Initialize special parameters, then call the generic main loop. */ aha_tasknr = proc_number(proc_ptr); s_init(); driver_task(&s_dtab); } /*===========================================================================* * s_init * *===========================================================================*/ PRIVATE void s_init() { /* Set target and logical unit numbers. */ int i; struct scsi *sp; long v; char *name; static char fmt[] = "d:d,d"; for (i = 0; i < MAX_DEVICES; i++) { (void) s_prepare(i * DEV_PER_DRIVE); sp = s_sp; /* Look into the environment for special parameters. */ name = s_name(); v = i; (void) env_parse(name, fmt, 1, &v, 0L, 7L); sp->targ = v; v = 0; (void) env_parse(name, fmt, 2, &v, 0L, 7L); sp->lun = v; } } /*===========================================================================* * s_prepare * *===========================================================================*/ PRIVATE struct device *s_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DISKDEVS) { /* d0, d0p[0-3], d1, ... */ s_type = TYPE_D; s_sp = &scsi[device / DEV_PER_DRIVE]; s_dv = &s_sp->part[device % DEV_PER_DRIVE]; } else if ((unsigned) (device - MINOR_d0p0s0) < NR_SUBDEVS) {/* d[0-7]p[0-3]s[0-3] */ device -= MINOR_d0p0s0; s_type = TYPE_D; s_sp = &scsi[device / SUB_PER_DRIVE]; s_dv = &s_sp->subpart[device % SUB_PER_DRIVE]; } else if ((unsigned) (device - MINOR_t0) < NR_TAPEDEVS) { /* t[0-7] */ device -= MINOR_t0; s_type = (device & 1) ? TYPE_T : TYPE_TN; s_sp = &scsi[device >> 1]; s_dv = &s_sp->dummypart; } else { return(NIL_DEV); } return(s_dv); } /*===========================================================================* * s_name * *===========================================================================*/ PRIVATE char *s_name() { /* Return a name for the current device. */ static char name[] = "aha1540-d0"; name[8]= "dtt"[s_type]; name[9]= '0' + (s_sp - scsi); return name; } /*===========================================================================* * s_do_open * *===========================================================================*/ PRIVATE int s_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { struct scsi *sp; int r; if (aha_irq == 0 && !aha_reset()) return(EIO); /* no controller, forget it */ if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); sp = s_sp; if ((r = scsi_probe()) != OK) return(r); if (sp->state & S_RDONLY && m_ptr->COUNT & W_BIT) return(EACCES); switch (sp->devtype) { case SCSI_DEVDISK: case SCSI_DEVWORM: case SCSI_DEVCDROM: case SCSI_DEVOPTICAL: /* Read partition tables on first open. */ if (sp->open_ct == 0) { partition(&s_dtab, (int) (sp-scsi) * DEV_PER_DRIVE, P_PRIMARY); } break; case SCSI_DEVTAPE: /* Make sure tape is not already open. */ if (sp->open_ct > 0) return(EBUSY); sp->open_mode = m_ptr->COUNT; /* If open(..., O_WRONLY) then write a filemark on close even if no * write is done. */ sp->need_eof = ((sp->open_mode & (R_BIT|W_BIT)) == W_BIT); break; } sp->open_ct++; return(OK); } /*===========================================================================* * scsi_probe * *===========================================================================*/ PRIVATE int scsi_probe() { /* See if a device exists and if it is ready. */ struct scsi *sp = s_sp; sense_t *sense; int r, key; /* Something out there? */ if ((r = scsi_sense()) != OK) { if (sp->state & S_PRESENT) { printf("%s: offline\n", s_name()); sp->state = 0; } return(r); } if (!(sp->state & S_PRESENT)) { /* First contact with a new device, what type is it? */ if ((r = scsi_inquiry()) != OK) return(r); sp->devtype = inqdata.devtype; } if (!(sp->state & S_READY)) { /* If it's a disk: start it, if it's a tape: load it. */ (void) scsi_simple(SCSI_STRTSTP, 1); } /* See if the unit is ready for I/O. A disk may be spinning up, a * floppy or tape drive may be empty. */ while ((key = scsi_simple(SCSI_UNITRDY, 0)) != SENSE_NO_SENSE) { /* Not ready, why? */ sp->state &= ~S_READY; switch (key) { case SENSE_UNIT_ATT: /* A media change or something, try again. */ break; case SENSE_NOT_READY: /* Look at the additional sense data to see why it isn't * ready. */ sense = &ccb_sense(rq); switch ((sense->add_code << 8) | sense->add_qual) { case 0x0401: /* "It is becoming ready." Fine, we wait. */ milli_delay(1000); break; case 0x0402: /* "Initialization command required." So we tell it * to spin up. */ if (scsi_simple(SCSI_STRTSTP, 1) != SENSE_NO_SENSE) return(EIO); break; case 0x0403: /* "Manual intervention required." */ case 0x3A00: /* "No media present." */ printf("%s: no media loaded\n", s_name()); return(EIO); default: /* For some reason it is not usable. */ printf("%s: not ready\n", s_name()); return(EIO); } break; default: /* The device is in some odd state. */ if (key != SENSE_NOT_READY) { printf("%s: hardware error\n", s_name()); return(EIO); } } } if (!(sp->state & S_PRESENT)) { /* Do the inquiry again, the message may have changed. */ if (scsi_inquiry() != OK) return(EIO); /* Tell what kind of device it is we have found. */ printf("%s: %-7s %.48s\n", s_name(), inqdata.devtype > SCSI_DEVMAX ? "UNKNOWN" : scsi_devstr[inqdata.devtype], inqdata.vendor /* + product + revision + extra */); } if (!(sp->state & S_READY)) { /* Get the geometry, limits, etc. */ switch (sp->devtype) { case SCSI_DEVDISK: case SCSI_DEVWORM: case SCSI_DEVCDROM: case SCSI_DEVOPTICAL: if (scsi_ndisk() != OK) return(EIO); break; case SCSI_DEVTAPE: if (scsi_ntape() != OK) return(EIO); break; default: printf("%s: unsupported\n", s_name()); return(EIO); } } return(OK); } /*===========================================================================* * scsi_sense * *===========================================================================*/ PRIVATE int scsi_sense() { int key; sense_t *sense = (sense_t *) tmp_buf; /* Do a request sense to find out if a target exists or to check out * a unit attention condition. */ key = scsi_simple(SCSI_REQSENSE, sizeof(sense_t)); if (rq->ccb.hastat == HST_TIMEOUT) return(ENXIO); /* nothing there */ if (rq->ccb.hastat != 0) return(EIO); /* something very bad */ /* There is something out there for sure. */ if (key == SENSE_UNIT_ATT || sense_key(sense->key) == SENSE_UNIT_ATT) { /* Device is in a "look at me" state, probably changed media. */ s_sp->state &= ~S_READY; } return(OK); } /*===========================================================================* * scsi_inquiry * *===========================================================================*/ PRIVATE int scsi_inquiry() { /* Prefill with nulls. */ memset(tmp_buf, '\0', sizeof(inquiry_t)); /* Do a SCSI inquiry. */ if (scsi_simple(SCSI_INQUIRY, sizeof(inquiry_t)) != SENSE_NO_SENSE) return(EIO); inqdata = * (inquiry_t *) tmp_buf; if (inqdata.len == 0) { /* The device doesn't return meaningful text fields. */ strcpy(inqdata.vendor, "(unknown)"); } /* The top three bits of devtype must be zero for the lun to exist. */ if ((inqdata.devtype & 0xE0) != 0) return(ENXIO); return(OK); } /*===========================================================================* * scsi_ndisk * *===========================================================================*/ PRIVATE int scsi_ndisk() { /* Gather disk data, capacity and block size. */ struct scsi *sp = s_sp; unsigned long capacity = -1, block_size = SECTOR_SIZE; byte *buf = tmp_buf; /* Minor device type must be for a disk. */ if (s_type != TYPE_D) return(EIO); if (sp->devtype == SCSI_DEVCDROM) { /* Read-only by definition. */ sp->state |= S_RDONLY; } else { /* SCSI modesense to find out if the disk is write protected. */ if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE) return(EIO); /* Write protected? */ sp->state &= ~S_RDONLY; if (buf[2] & 0x80) sp->state |= S_RDONLY; /* Don't write a worm disk, not wise at the moment. */ if (sp->devtype == SCSI_DEVWORM) sp->state |= S_RDONLY; } /* Get drive capacity and block size. */ group1(); rq->ccb.opcode = CCB_INIT; ccb_cmd1(rq).scsi_op = SCSI_CAPACITY; if (scsi_command(tmp_phys, 8) == SENSE_NO_SENSE) { capacity = b2h32(buf + 0) + 1; block_size = b2h32(buf + 4); printf("%s: capacity %lu x %lu bytes\n", s_name(), capacity, block_size); } else { printf("%s: unknown capacity\n", s_name()); } /* We do not believe block sizes over 4 kb. */ if (block_size > 4096) { printf("%s: can't handle %lu byte blocks\n", s_name(), block_size); return(EIO); } sp->block_size = block_size; sp->part[0].dv_size = mul64u(capacity, block_size); /* Keep it within reach of a group 0 command, and within 'unsigned'. */ sp->count_max = block_size > UINT_MAX/0x100 ? UINT_MAX : 0x100 * block_size; /* Finally we recognize its existence. */ sp->state |= S_PRESENT|S_READY; return(OK); } /*===========================================================================* * scsi_ntape * *===========================================================================*/ PRIVATE int scsi_ntape() { /* Gather tape data, block limits, fixed block size or not. */ struct scsi *sp = s_sp; unsigned minblk; unsigned long maxblk; byte *buf = tmp_buf; /* Minor device type must be for a tape. */ if (s_type != TYPE_T && s_type != TYPE_TN) return(EIO); /* Read limits. */ if (scsi_simple(SCSI_RDLIMITS, 6) != SENSE_NO_SENSE) return(EIO); minblk = b2h16(buf + 4); maxblk = b2h24(buf + 1); printf("%s: limits: min block len %u, max block len %lu\n", s_name(), minblk, maxblk); if (sp->state & S_PRESENT) { /* Keep the current block size. */ if (sp->tfixed) minblk= maxblk= sp->block_size; } sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_erreg = 0; sp->tstat.mt_fileno = 0; sp->tstat.mt_blkno = 0; sp->tstat.mt_resid = 0; if (minblk == maxblk) { /* Fixed block length. */ sp->tfixed = TRUE; sp->block_size = minblk; sp->tstat.mt_blksize = minblk; sp->count_max = UINT_MAX; } else { /* Variable block length. */ sp->tfixed = FALSE; sp->block_size = 1; sp->tstat.mt_blksize = 0; sp->count_max = maxblk == 0 ? UINT_MAX : maxblk; } /* SCSI modesense. */ if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE) return(EIO); /* Write protected? */ sp->state &= ~S_RDONLY; if (buf[2] & 0x80) sp->state |= S_RDONLY; /* Density and block size. */ if (buf[3] >= 8) { printf("%s: density 0x%02x, nblocks %lu, block len ", s_name(), buf[4], b2h24(buf + 4 + 1)); printf(sp->tfixed ? "%lu\n" : "variable\n", b2h24(buf + 4 + 5)); } sp->state |= S_PRESENT|S_READY; return(OK); } /*===========================================================================* * s_transfer * *===========================================================================*/ PRIVATE int s_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct scsi *sp = s_sp; iovec_t *iop, *iov_end = iov + nr_req; int key; unsigned nbytes, dma_count; vir_bytes addr, size; phys_bytes dma_phys; phys_bytes last_phys; unsigned last_count; unsigned long block; unsigned long dv_size = cv64ul(s_dv->dv_size); phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); rq->opcode = opcode; rq->retry = 2; while (nr_req > 0) { /* Probe the device if it isn't ready. */ if (!(sp->state & S_READY) && scsi_probe() != OK) return(EIO); show_iov(iov, nr_req); /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) nbytes += iop->iov_size; switch (sp->devtype) { case SCSI_DEVCDROM: case SCSI_DEVWORM: case SCSI_DEVDISK: case SCSI_DEVOPTICAL: /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; rq->position = add64ul(s_dv->dv_base, position); if ((nbytes % sp->block_size) != 0 || rem64u(rq->position, sp->block_size) != 0) { /* Not on a device block boundary. CD-ROM? */ return(s_rdcdrom(proc_nr, opcode, position, iov, nr_req)); } break; case SCSI_DEVTAPE: if ((nbytes % sp->block_size) != 0) return(EINVAL); /* Old error condition? */ if (sp->tstat.mt_dsreg == DS_ERR) return(EIO); if (opcode == DEV_GATHER && sp->at_eof) return(OK); break; default: return(EIO); } /* Construct a DMA scatter/gather vector from the I/O vector. */ rq->count = 0; rq->dmaptr = rq->dmalist; for (iop = iov; iop < iov_end; iop++) { addr = iop->iov_addr; size = iop->iov_size; while (size > 0) { /* DMA addresses. */ dma_phys = user_base + addr; dma_count = size; /* Several constraints... */ if (rq->count + dma_count > nbytes) dma_count = nbytes - rq->count; if (rq->count + dma_count > sp->count_max) dma_count = sp->count_max - rq->count; if (rq->count > 0 && dma_phys == last_phys) { /* Two blocks are adjacent! */ h2b24(rq->dmaptr[-1].datalen, (u32_t) (last_count += dma_count)); } else if (rq->dmaptr < rq->dmalimit && (rq->count == 0 || DMA_CHECK(last_phys, dma_phys)) ) { /* New scatter/gather entry. */ h2b24(rq->dmaptr->dataptr, dma_phys); h2b24(rq->dmaptr->datalen, (u32_t) (last_count = dma_count)); rq->dmaptr++; } else { /* End of DMA vector, or addresses not * compatible. */ goto dma_vec_done; } last_phys = dma_phys + dma_count; /* Update counters. */ rq->count += dma_count; addr += dma_count; size -= dma_count; if (rq->count == nbytes) goto dma_vec_done; if (rq->count == sp->count_max) goto dma_vec_done; } } dma_vec_done: show_req(); switch (sp->devtype) { case SCSI_DEVCDROM: case SCSI_DEVWORM: case SCSI_DEVDISK: case SCSI_DEVOPTICAL: /* A read or write SCSI command for a random access device. */ block = div64u(rq->position, sp->block_size); if (block < (1L << 21)) { /* We can use a group 0 command for small disks. */ group0(); rq->ccb.opcode = CCB_SCATTER; ccb_cmd0(rq).scsi_op = opcode == DEV_SCATTER ? SCSI_WRITE : SCSI_READ; h2b24(ccb_cmd0(rq).lba, block); ccb_cmd0(rq).nblocks = rq->count / sp->block_size; } else { /* Large disks require a group 1 command. */ group1(); rq->ccb.opcode = CCB_SCATTER; ccb_cmd1(rq).scsi_op = opcode == DEV_SCATTER ? SCSI_WRITE1 : SCSI_READ1; h2b32(ccb_cmd1(rq).lba, block); h2b16(ccb_cmd1(rq).nblocks, rq->count / sp->block_size); } key = scsi_command(0L, 0); if (key == SENSE_NO_SENSE) { /* fine */; } else if (key == SENSE_UNIT_ATT || key == SENSE_ABORTED_CMD) { /* Check condition? Bus reset most likely. */ /* Aborted command? Maybe retrying will help. */ if (--rq->retry > 0) continue; return(EIO); } else if (key == SENSE_RECOVERED) { /* Disk drive managed to recover from a read error. */ printf("%s: soft read error at block %lu (recovered)\n", s_name(), b2h32(ccb_sense(rq).info)); key = SENSE_NO_SENSE; break; } else { /* A fatal error occurred, bail out. */ return(EIO); } break; case SCSI_DEVTAPE: /* A read or write SCSI command for a sequential access device. */ group0(); rq->ccb.opcode = CCB_SCATTER; ccb_cmd0(rq).scsi_op = opcode == DEV_SCATTER ? SCSI_WRITE : SCSI_READ; ccb_cmd0(rq).fixed = sp->tfixed; h2b24(ccb_cmd0(rq).trlength, rq->count / sp->block_size); key = scsi_command(0L, 0); if (key != SENSE_NO_SENSE) { /* Either near/at EOF or EOM, or an I/O error. */ if (sense_eof(key) || sense_eom(key)) { /* Not an error, but near/at EOF or EOM. The * residual tells how much has not been read. */ rq->count -= sp->tstat.mt_resid * sp->block_size; if (opcode == DEV_SCATTER && sense_key(key) == SENSE_NO_SENSE ) { /* Early warning, ignore. */ sp->tstat.mt_dsreg = DS_OK; } else { /* EOF or EOM. */ sp->at_eof = TRUE; sp->tstat.mt_dsreg = DS_EOF; if (sense_eof(key)) { /* Went over a filemark. */ sp->tstat.mt_blkno = - (int) (rq->count / sp->block_size); if (!sp->tfixed) sp->tstat.mt_blkno = -1; sp->tstat.mt_fileno++; } } } if (sense_ili(key)) { /* Incorrect length on a variable block length * tape. */ if (sp->tstat.mt_resid <= 0) { /* Large block could not be read. */ return(EIO); } /* Small block read, this is ok. */ rq->count -= sp->tstat.mt_resid; sp->tstat.mt_dsreg = DS_OK; } if (key == SENSE_RECOVERED) { /* Tape drive managed to recover from an error. */ printf("%s: soft %s error (recovered)\n", s_name(), opcode == DEV_GATHER ? "read" : "write"); key = SENSE_NO_SENSE; sp->tstat.mt_dsreg = DS_OK; } if (sp->tstat.mt_dsreg == DS_ERR) { /* Error was fatal. */ return(EIO); } } else { sp->tstat.mt_dsreg = DS_OK; } if (!sp->tfixed) { /* Variable block length tape reads record by record. */ sp->tstat.mt_blkno++; } else { /* Fixed length tape, multiple blocks transferred. */ sp->tstat.mt_blkno += rq->count / sp->block_size; } sp->need_eof = (opcode == DEV_SCATTER); break; } /* Book the bytes successfully transferred. */ position += rq->count; for (;;) { if (rq->count < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += rq->count; iov->iov_size -= rq->count; break; } rq->count -= iov->iov_size; iov->iov_addr += iov->iov_size; iov->iov_size = 0; if (rq->count == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*===========================================================================* * s_rdcdrom * *===========================================================================*/ PRIVATE int s_rdcdrom(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { /* CD-ROM's have a basic block size of 2k. We could try to set a smaller * virtual block size, but many don't support it. So we use this function. */ struct scsi *sp = s_sp; int key; unsigned nbytes, offset, count; unsigned long block, curblock; unsigned long dv_size = cv64ul(s_dv->dv_size); phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); /* Only do reads. */ if (opcode != DEV_GATHER) return(EINVAL); rq->retry = 2; curblock = -1; while (nr_req > 0) { /* Number of bytes to transfer. */ nbytes = iov->iov_size; /* Which position on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; rq->position = add64ul(s_dv->dv_base, position); block = div64u(rq->position, sp->block_size); if (curblock != block) { /* Read a block that contains (some of) the bytes wanted. */ group1(); rq->ccb.opcode = CCB_INIT; ccb_cmd1(rq).scsi_op = SCSI_READ1; h2b32(ccb_cmd1(rq).lba, block); h2b16(ccb_cmd1(rq).nblocks, 1); key = scsi_command(tmp_phys, sp->block_size); if (key != SENSE_NO_SENSE) { if (key == SENSE_UNIT_ATT && --rq->retry > 0) continue; /* retry */ return(EIO); } curblock = block; } /* Copy the bytes wanted to user space. */ offset = rem64u(rq->position, sp->block_size); count = sp->block_size - offset; if (count > nbytes) count = nbytes; phys_copy(tmp_phys + offset, user_base + iov->iov_addr, (phys_bytes) count); position += count; iov->iov_addr += count; if ((iov->iov_size -= count) == 0) { iov++; nr_req--; } } return(OK); } /*===========================================================================* * s_do_close * *===========================================================================*/ PRIVATE int s_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { struct scsi *sp; if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); sp = s_sp; sp->open_ct--; /* Disks and such don't make trouble. */ if (sp->devtype != SCSI_DEVTAPE) return(OK); sp->at_eof = FALSE; /* Write filemark if writes have been done. */ if (sp->need_eof && sp->tstat.mt_dsreg != DS_ERR) { if (scsi_simple(SCSI_WREOF, 1) != SENSE_NO_SENSE) { printf("%s: failed to add filemark\n", s_name()); } else { sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno++; } } /* Rewind if rewind device. */ if (s_type == TYPE_T) { if (scsi_simple(SCSI_REWIND, 1) != SENSE_NO_SENSE) { printf("%s: failed to rewind\n", s_name()); } else { sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno = 0; } } return(OK); } /*===========================================================================* * s_do_ioctl * *===========================================================================*/ PRIVATE int s_do_ioctl(dp, m_ptr) struct driver *dp; message *m_ptr; { struct scsi *sp; if (s_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); sp = s_sp; /* Ioctls are device specific. */ switch (sp->devtype) { case SCSI_DEVDISK: case SCSI_DEVWORM: case SCSI_DEVCDROM: case SCSI_DEVOPTICAL: if (m_ptr->REQUEST == DIOCEJECT) { /* Eject disk. */ if (sp->open_ct > 1) return(EBUSY); /* Send a start/stop command with code 2: stop and eject. */ if (scsi_simple(SCSI_STRTSTP, 2) != SENSE_NO_SENSE) return(EIO); return(OK); } /* Call the common code for disks and disk like devices. */ return(do_diocntl(dp, m_ptr)); default: return(ENOTTY); case SCSI_DEVTAPE: break; } /* Further ioctls are for tapes. */ if (m_ptr->REQUEST == MTIOCTOP) { struct mtop op; long delta; int key; byte *buf = tmp_buf; /* Basic tape commands: rewind, space, write eof marks, ... */ if (vir_copy(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, aha_tasknr, (vir_bytes) &op, sizeof(op)) != OK) return(EINVAL); switch(op.mt_op) { case MTREW: case MTOFFL: case MTRETEN: case MTFSF: case MTFSR: case MTBSF: case MTBSR: case MTEOM: /* Write an EOF mark before spacing. */ if (sp->need_eof && sp->tstat.mt_dsreg != DS_ERR) { if (scsi_simple(SCSI_WREOF, 1) != SENSE_NO_SENSE) return(EIO); sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno++; sp->need_eof = FALSE; } sp->at_eof = FALSE; } switch(op.mt_op) { case MTREW: case MTOFFL: case MTRETEN: case MTERASE: /* Rewind, Offline, Retension, Erase. */ switch(op.mt_op) { case MTOFFL: if (scsi_simple(SCSI_LOADUNLD, 0) != SENSE_NO_SENSE) return(EIO); sp->state &= ~S_READY; break; case MTRETEN: if (scsi_simple(SCSI_LOADUNLD, 3) != SENSE_NO_SENSE) return(EIO); break; case MTERASE: if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE) return(EIO); if (scsi_simple(SCSI_ERASE, 1) != SENSE_NO_SENSE) return(EIO); /* Rewind once more. */ /*FALL THROUGH*/ case MTREW: if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE) return(EIO); } sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno = 0; break; case MTFSF: case MTFSR: case MTBSF: case MTBSR: if (sp->tstat.mt_dsreg == DS_ERR) return(EIO); group0(); rq->ccb.opcode = CCB_INIT; ccb_cmd0(rq).scsi_op = SCSI_SPACE; delta = op.mt_count; if (op.mt_op == MTBSR) delta = -delta; if (op.mt_op == MTBSF) delta = -delta - 1; h2b24(ccb_cmd0(rq).trlength, delta); ccb_cmd0(rq).fixed = op.mt_op == MTFSR || op.mt_op == MTBSR ? 0 : 1; if ((key = scsi_command(0L, 0)) != SENSE_NO_SENSE) { if (sense_key(key) != SENSE_NO_SENSE) return(EIO); if (sense_eom(key)) { /* Banging into end of tape. */ if (op.mt_op == MTBSF || op.mt_op == MTBSR) { /* Backspacing to start of tape. */ sp->tstat.mt_dsreg = DS_EOF; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno = 0; } else { /* Not forwards please! */ return(EIO); } } if (sense_eof(key)) { /* Reaching a filemark. */ sp->tstat.mt_dsreg = DS_EOF; sp->at_eof = TRUE; if (op.mt_op == MTFSR) { /* Forwards. */ sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno++; } else { /* Backwards (bad idea!) */ sp->tstat.mt_blkno = -1; sp->tstat.mt_fileno--; } } } else { if (op.mt_op == MTFSR || op.mt_op == MTBSR) { sp->tstat.mt_blkno += delta; } else { sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno += delta; } if (op.mt_op == MTBSF) { /* n+1 backwards, and 1 forward. */ group0(); rq->ccb.opcode = CCB_INIT; ccb_cmd0(rq).scsi_op = SCSI_SPACE; h2b24(ccb_cmd0(rq).trlength, 1L); ccb_cmd0(rq).fixed = 1; if (scsi_command(0L, 0) != SENSE_NO_SENSE) return(EIO); sp->tstat.mt_fileno++; } sp->tstat.mt_dsreg = DS_OK; } break; case MTWEOF: /* Write EOF marks. */ if (sp->tstat.mt_dsreg == DS_ERR) return(EIO); if (op.mt_count < 0) return(EIO); if (op.mt_count == 0) return(OK); group0(); rq->ccb.opcode = CCB_INIT; ccb_cmd0(rq).scsi_op = SCSI_WREOF; h2b24(ccb_cmd0(rq).trlength, op.mt_count); if (scsi_command(0L, 0) != SENSE_NO_SENSE) return(EIO); sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno += op.mt_count; sp->need_eof = FALSE; break; case MTEOM: /* Forward space to end of media. */ if (sp->tstat.mt_dsreg == DS_ERR) return(EIO); do { group0(); rq->ccb.opcode = CCB_INIT; ccb_cmd0(rq).scsi_op = SCSI_SPACE; h2b24(ccb_cmd0(rq).trlength, 0x7FFFFF); ccb_cmd0(rq).fixed = 1; key = scsi_command(0L, 0); sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno += 0x7FFFFF; if (key != SENSE_NO_SENSE) { if (key != SENSE_BLANK_CHECK) return(EIO); sp->tstat.mt_fileno -= sp->tstat.mt_resid; } } while (key == SENSE_NO_SENSE); sp->tstat.mt_dsreg = DS_OK; break; case MTBLKZ: case MTMODE: /* Select tape block size or tape density. */ /* Rewind tape. */ if (scsi_simple(SCSI_REWIND, 0) != SENSE_NO_SENSE) return(EIO); sp->tstat.mt_dsreg = DS_OK; sp->tstat.mt_blkno = 0; sp->tstat.mt_fileno = 0; if (op.mt_op == MTBLKZ && op.mt_count == 0) { /* Request for variable block size mode. */ sp->tfixed = FALSE; sp->block_size = 1; } else { /* First a modesense to get the current values. */ if (scsi_simple(SCSI_MDSENSE, 255) != SENSE_NO_SENSE) return(EIO); /* Must at least have one block descriptor. */ if (buf[3] < 8) return(EIO); buf[0] = 0; buf[1] = 0; /* buf[2]: buffered mode & speed */ buf[3] = 8; if (op.mt_op == MTMODE) /* New density */ buf[4 + 0] = op.mt_count; /* buf[4 + 1]: number of blocks */ buf[4 + 4] = 0; if (op.mt_op == MTBLKZ) /* New block size */ h2b24(buf + 4 + 5, (long) op.mt_count); /* Set the new density/blocksize. */ if (scsi_simple(SCSI_MDSELECT, 4+8) != SENSE_NO_SENSE) return(EIO); if (op.mt_op == MTBLKZ) { sp->tfixed = TRUE; sp->block_size= op.mt_count; } } sp->state &= ~S_READY; if (scsi_probe() != OK) return(EIO); break; default: /* Not implemented. */ return(ENOTTY); } } else if (m_ptr->REQUEST == MTIOCGET) { /* Request tape status. */ if (sp->tstat.mt_dsreg == DS_OK) { /* Old error data is never cleared (until now). */ sp->tstat.mt_erreg = 0; sp->tstat.mt_resid = 0; } if (vir_copy(aha_tasknr, (vir_bytes) &sp->tstat, m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(sp->tstat)) != OK) return(EINVAL); } else { /* Not implemented. */ return(ENOTTY); } return(OK); } /*===========================================================================* * scsi_simple * *===========================================================================*/ PRIVATE int scsi_simple(opcode, count) int opcode; /* SCSI opcode */ int count; /* count or flag */ { /* The average group 0 SCSI command with just a simple flag or count. */ vir_bytes len = 0; /* Sometimes a buffer is used. */ group0(); rq->ccb.opcode = CCB_INIT; ccb_cmd0(rq).scsi_op = opcode; /* Fill in the count argument at the proper place. */ switch (opcode) { case SCSI_REQSENSE: case SCSI_INQUIRY: case SCSI_MDSENSE: case SCSI_MDSELECT: ccb_cmd0(rq).nblocks = count; len = count; break; case SCSI_STRTSTP: /* SCSI_LOADUNLD: (synonym) */ ccb_cmd0(rq).nblocks = count; break; case SCSI_RDLIMITS: len = count; break; case SCSI_WREOF: h2b24(ccb_cmd0(rq).trlength, (long) count); break; case SCSI_REWIND: case SCSI_ERASE: ccb_cmd0(rq).fixed = count; break; } return(scsi_command(tmp_phys, len)); } /*===========================================================================* * group0 * *===========================================================================*/ PRIVATE void group0() { /* Prepare the ccb for a group 0 SCSI command. */ rq->ccb.cmdlen = sizeof(cdb0_t); /* Clear cdb to zeros the ugly way. */ * (u32_t *) (rq->ccb.cmd + 0) = 0; * (u16_t *) (rq->ccb.cmd + 4) = 0; } /*===========================================================================* * group1 * *===========================================================================*/ PRIVATE void group1() { rq->ccb.cmdlen = sizeof(cdb1_t); * (u32_t *) (rq->ccb.cmd + 0) = 0; * (u32_t *) (rq->ccb.cmd + 4) = 0; * (u16_t *) (rq->ccb.cmd + 8) = 0; } /*===========================================================================* * scsi_command * *===========================================================================*/ PRIVATE int scsi_command(data, len) phys_bytes data; vir_bytes len; { /* Execute a SCSI command and return the results. Unlike most other routines, * this routine returns the sense key of a SCSI command instead of OK or EIO. */ struct scsi *sp = s_sp; int key; message intr_mess; rq->ccb.addrcntl = ccb_scid(s_sp->targ) | ccb_lun(s_sp->lun); if (rq->ccb.opcode == CCB_SCATTER) { /* Device read/write; add checks and use scatter/gather vector. */ rq->ccb.addrcntl |= rq->opcode==DEV_GATHER ? CCB_INCHECK : CCB_OUTCHECK; data = vir2phys(rq->dmalist); len = (byte *) rq->dmaptr - (byte *) rq->dmalist; if (aha_model == AHA1540) { /* A plain 1540 can't do s/g. */ rq->ccb.opcode = CCB_INIT; data = b2h24(rq->dmalist[0].dataptr); len = b2h24(rq->dmalist[0].datalen); } } h2b24(rq->ccb.datalen, (u32_t) len); h2b24(rq->ccb.dataptr, data); dump_scsi_cmd(); mailbox[0].status = AHA_MBOXSTART; out_byte(AHA_DATAREG, AHACOM_STARTSCSI); /* hey, you've got mail! */ /* Wait for the SCSI command to complete. */ while (mailbox[1].status == AHA_MBOXFREE) { /* No mail yet, wait for an interrupt. */ receive(HARDWARE, &intr_mess); } mailbox[1].status = AHA_MBOXFREE; /* free up inbox */ /* Check the results of the operation. */ if (rq->ccb.hastat != 0) { /* Weird host adapter status. */ printf("%s: host adapter error 0x%02x%s\n", s_name(), rq->ccb.hastat, rq->ccb.hastat == HST_TIMEOUT ? " (Selection timeout)" : ""); errordump(); if (sp->devtype == SCSI_DEVTAPE) sp->tstat.mt_dsreg = DS_ERR; memset((void *) &ccb_sense(rq), 0, sizeof(sense_t)); return(SENSE_HARDWARE); } if (rq->ccb.tarstat != 0) { /* A SCSI error has occurred. */ sense_t *sense = &ccb_sense(rq); if (sense->len < 2) { /* No additional code and qualifier, zero them. */ sense->add_code = sense->add_qual = 0; } /* Check sense data, report error if interesting. */ if (rq->ccb.tarstat == TST_CHECK) { if ((sense->errc & 0x7E) == 0x70) { /* Standard SCSI error. */ key = sense->key; } else { /* Blame the vendor for any other nonsense. */ key = SENSE_VENDOR; } } else { if (rq->ccb.tarstat == TST_LUNBUSY) { /* Logical unit is too busy to react... */ key = SENSE_NOT_READY; } else { /* The adapter shoudn't do this... */ key = SENSE_HARDWARE; } memset((void *) sense, 0, sizeof(sense_t)); } if (sense_serious(sense_key(key))) { /* Something bad happened. */ printf("%s: error on command 0x%02x, ", s_name(), rq->ccb.cmd[0]); if (rq->ccb.tarstat != TST_CHECK) { printf("target status 0x%02x\n", rq->ccb.tarstat); } else { printf("sense key 0x%02x (%s), additional 0x%02x%02x\n", sense->key, str_scsi_sense[sense_key(key)], sense->add_code, sense->add_qual); } errordump(); } if (sp->devtype == SCSI_DEVTAPE) { /* Store details of tape error. */ sp->tstat.mt_dsreg = DS_ERR; sp->tstat.mt_erreg = key; sp->tstat.mt_resid = b2h32(sense->info); } /* Keep only the ILI, EOM and EOF bits of key 0. */ if (sense_key(key) != SENSE_NO_SENSE) key = sense_key(key); return(key); } return(SENSE_NO_SENSE); } /*===========================================================================* * aha_command * *===========================================================================*/ PRIVATE void aha_command(outlen, outptr, inlen, inptr) int outlen, inlen; byte *outptr, *inptr; { /* Send a low level command to the host adapter. */ int i; /* Send command bytes. */ for (i = 0; i < outlen; i++) { while (in_byte(AHA_STATREG) & AHA_CDF) {} /* !! timeout */ out_byte(AHA_DATAREG, *outptr++); } /* Receive data bytes. */ for (i = 0; i < inlen; i++) { while (!(in_byte(AHA_STATREG) & AHA_DF) && !(in_byte(AHA_INTRREG) & AHA_HACC)) {} /* !! timeout */ *inptr++ = in_byte(AHA_DATAREG); } /* Wait for command completion. */ while (!(in_byte(AHA_INTRREG) & AHA_HACC)) {} /* !! timeout */ out_byte(AHA_CNTLREG, AHA_IRST); /* clear interrupt */ if (aha_irq != 0) enable_irq(aha_irq); /* !! should check status register here for invalid command */ } /*===========================================================================* * aha_reset * *===========================================================================*/ PRIVATE int aha_reset() { int stat; int irq, bus_on, bus_off, tr_speed; unsigned sg_max; long v; static char aha0_env[] = "AHA0", aha_fmt[] = "x:d:d:x"; byte cmd[5], haidata[4], getcdata[3], extbios[2]; struct milli_state ms; /* Get the configuration info from the environment. */ v = AHA_BASEREG; if (env_parse(aha0_env, aha_fmt, 0, &v, 0x000L, 0x3FFL) == EP_OFF) return 0; aha_basereg = v; v = 15; (void) env_parse(aha0_env, aha_fmt, 1, &v, 2L, 15L); bus_on = v; v = 1; (void) env_parse(aha0_env, aha_fmt, 2, &v, 1L, 64L); bus_off = v; v = 0x00; (void) env_parse(aha0_env, aha_fmt, 3, &v, 0x00L, 0xFFL); tr_speed = v; /* Reset controller, wait for self test to complete. */ out_byte(AHA_CNTLREG, AHA_HRST); milli_start(&ms); while (((stat = in_byte(AHA_STATREG)) & (AHA_STST | AHA_DIAGF | AHA_INIT | AHA_IDLE | AHA_CDF | AHA_DF)) != (AHA_INIT | AHA_IDLE)) { if (milli_elapsed(&ms) >= AHA_TIMEOUT) { printf( "aha0: AHA154x controller not responding, status = 0x%02x\n", stat); return(0); } } /* Get information about controller type and configuration. */ cmd[0] = AHACOM_HAINQUIRY; aha_command(1, cmd, 4, haidata); cmd[0] = AHACOM_GETCONFIG; aha_command(1, cmd, 3, getcdata); /* First inquiry byte tells what type of board. */ aha_model = haidata[0]; /* Unlock the 1540C or 1540CF's mailbox interface. (This is to keep old * drivers from using the adapter if extended features are enabled.) */ if (aha_model >= AHA1540C) { cmd[0] = AHACOM_EXTBIOS; /* get extended BIOS information */ aha_command(1, cmd, 2, extbios); if (extbios[1] != 0) { /* Mailbox interface is locked, so unlock it. */ cmd[0] = AHACOM_MBOX_ENABLE; cmd[1] = 0; /* bit 0 = 0 (enable mailbox) */ cmd[2] = extbios[1]; /* lock code to unlock mailbox */ aha_command(3, cmd, 0, 0); } } /* The maximum scatter/gather DMA list length depends on the board model. */ sg_max = 16; if (aha_model == AHA1540) sg_max = 1; /* 1540 has no s/g */ if (aha_model >= AHA1540C) sg_max = 255; /* 1540C has plenty */ /* Set up the DMA channel. */ switch (getcdata[0]) { case 0x80: /* channel 7 */ out_byte(0xD6, 0xC3); out_byte(0xD4, 0x03); break; case 0x40: /* channel 6 */ out_byte(0xD6, 0xC2); out_byte(0xD4, 0x02); break; case 0x20: /* channel 5 */ out_byte(0xD6, 0xC1); out_byte(0xD4, 0x01); break; case 0x01: /* channel 0 */ out_byte(0x0B, 0x0C); out_byte(0x0A, 0x00); break; default: printf("aha0: AHA154x: strange DMA channel\n"); return(0); } /* Get the configured IRQ. */ switch (getcdata[1]) { case 0x40: irq = 15; break; case 0x20: irq = 14; break; case 0x08: irq = 12; break; case 0x04: irq = 11; break; case 0x02: irq = 10; break; case 0x01: irq = 9; break; default: printf("aha0: strange IRQ setting\n"); return(0); } /* Enable interrupts on the given irq. */ put_irq_handler(irq, s_handler); aha_irq = irq; enable_irq(irq); /* Initialize request related data: Command Control Block, mailboxes. * (We want to have the mailboxes initialized early, because the 1540C * wants to know it now.) */ /* Init ccb. */ rq->ccb.senselen = CCB_SENSEREQ; /* always want sense info */ h2b24(rq->ccb.linkptr, 0L); /* never link commands */ rq->ccb.linkid = 0; rq->ccb.reserved[0] = 0; rq->ccb.reserved[1] = 0; /* Scatter/gather maximum. */ rq->dmalimit = rq->dmalist + (sg_max < NR_IOREQS ? sg_max : NR_IOREQS); /* Outgoing mailbox. */ mailbox[0].status = AHA_MBOXFREE; h2b24(mailbox[0].ccbptr, vir2phys(&rq->ccb)); /* Incoming mailbox. */ mailbox[1].status = AHA_MBOXFREE; /* mailbox[1].ccbptr filled by adapter after command execution. */ /* Tell controller where the mailboxes are and how many. */ cmd[0] = AHACOM_INITBOX; cmd[1] = 1; h2b24(cmd + 2, vir2phys(mailbox)); aha_command(5, cmd, 0, 0); /* !! maybe sanity check: check status reg for initialization success */ /* Set bus on, bus off and transfer speed. */ cmd[0] = AHACOM_BUSON; cmd[1] = bus_on; aha_command(2, cmd, 0, 0); cmd[0] = AHACOM_BUSOFF; cmd[1] = bus_off; aha_command(2, cmd, 0, 0); cmd[0] = AHACOM_SPEED; cmd[1] = tr_speed; aha_command(2, cmd, 0, 0); /* Set SCSI selection timeout. */ cmd[0] = AHACOM_SETIMEOUT; cmd[1] = SCSI_TIMEOUT != 0; /* timeouts on/off */ cmd[2] = 0; /* reserved */ cmd[3] = SCSI_TIMEOUT / 256; /* MSB */ cmd[4] = SCSI_TIMEOUT % 256; /* LSB */ aha_command(5, cmd, 0, 0); return(1); } /*===========================================================================* * s_handler * *===========================================================================*/ PRIVATE int s_handler(irq) int irq; { /* Host adapter interrupt, send message to SCSI task and reenable interrupts. */ if (in_byte(AHA_INTRREG) & AHA_HACC) { /* Simple commands are polled. */ return 0; } else { out_byte(AHA_CNTLREG, AHA_IRST); /* clear interrupt */ interrupt(aha_tasknr); return 1; } } /*===========================================================================* * h2b16 * *===========================================================================*/ PRIVATE void h2b16(b, h) big16 b; U16_t h; { /* Host byte order to Big Endian conversion. */ b[0] = h >> 8; b[1] = h >> 0; } /*===========================================================================* * h2b24 * *===========================================================================*/ PRIVATE void h2b24(b, h) big24 b; u32_t h; { b[0] = h >> 16; b[1] = h >> 8; b[2] = h >> 0; } /*===========================================================================* * h2b32 * *===========================================================================*/ PRIVATE void h2b32(b, h) big32 b; u32_t h; { b[0] = h >> 24; b[1] = h >> 16; b[2] = h >> 8; b[3] = h >> 0; } /*===========================================================================* * b2h16 * *===========================================================================*/ PRIVATE u16_t b2h16(b) big16 b; { return ((u16_t) b[0] << 8) | ((u16_t) b[1] << 0); } /*===========================================================================* * b2h24 * *===========================================================================*/ PRIVATE u32_t b2h24(b) big24 b; { return ((u32_t) b[0] << 16) | ((u32_t) b[1] << 8) | ((u32_t) b[2] << 0); } /*===========================================================================* * b2h32 * *===========================================================================*/ PRIVATE u32_t b2h32(b) big32 b; { return ((u32_t) b[0] << 24) | ((u32_t) b[1] << 16) | ((u32_t) b[2] << 8) | ((u32_t) b[3] << 0); } #if AHA_DEBUG & 2 /*===========================================================================* * errordump * *===========================================================================*/ PRIVATE void errordump() { int i; printf("aha ccb dump:"); for (i = 0; i < sizeof(rq->ccb); i++) { if (i % 26 == 0) printf("\n"); printf(" %02x", ((byte *) &rq->ccb)[i]); } printf("\n"); } #endif /* AHA_DEBUG & 2 */ #if AHA_DEBUG & 4 /*===========================================================================* * show_iov * *===========================================================================*/ PRIVATE void show_iov(iov, nr_req) iovec_t *iov; unsigned nr_req; { printf("iov:"); while (nr_req > 0) { printf(" [%lx,%u]", (unsigned long) iov->iov_addr, (unsigned) iov->iov_size); iov++; nr_req--; } printf("\n"); } /*===========================================================================* * show_req * *===========================================================================*/ PRIVATE void show_req() { dma_t *dmap; unsigned count, len; dmap = rq->dmalist; count = rq->count; printf("%lu:%u", cv64ul(rq->position), count); while (count > 0) { printf(" (%lx,%lu)", b2h24(dmap->dataptr), len = b2h24(dmap->datalen)); dmap++; count -= len; } printf("\n"); } #endif /* AHA_DEBUG & 4 */ #if AHA_DEBUG & 8 /*===========================================================================* * dump_scsi_cmd * *===========================================================================*/ PRIVATE void dump_scsi_cmd() { int i; printf("scsi cmd:"); for (i = 0; i < rq->ccb.cmdlen; i++) printf(" %02x", rq->ccb.cmd[i]); printf("\n"); } #endif /* AHA_DEBUG & 8 */ /*============================================================================* * s_geometry * *============================================================================*/ PRIVATE void s_geometry(entry) struct partition *entry; { /* The geometry of a SCSI drive is a complete fake, the Adaptec onboard BIOS * makes the drive look like a regular drive on the outside. A DOS program * takes a logical block address, computes cylinder, head and sector like the * BIOS int 0x13 call expects, and the Adaptec turns this back into a block * address again. The only reason we care is because some idiot put cylinder, * head and sector numbers in the partition table, so fdisk needs to know the * geometry. */ u64_t size = s_sp->part[0].dv_size; unsigned heads, sectors; if (cmp64ul(size, 1024L * 64 * 32 * 512) < 0) { /* Small drive. */ heads = 64; sectors = 32; } else { /* Assume that this BIOS is configured for large drives. */ heads = 255; sectors = 63; } entry->cylinders = div64u(size, SECTOR_SIZE) / (heads * sectors); entry->heads = heads; entry->sectors = sectors; } #endif /* ENABLE_AHA1540_SCSI */ /* assert.h */ #ifndef NDEBUG /* 8086 must do without training wheels. */ #define NDEBUG (_WORD_SIZE == 2) #endif #if !NDEBUG #define INIT_ASSERT static char *assert_file= __FILE__; void bad_assertion(char *file, int line, char *what); void bad_compare(char *file, int line, int lhs, char *what, int rhs); #define assert(x) (!(x) ? bad_assertion(assert_file, __LINE__, #x) \ : (void) 0) #define compare(a,t,b) (!((a) t (b)) ? bad_compare(assert_file, __LINE__, \ (a), #a " " #t " " #b, (b)) : (void) 0) #else /* NDEBUG */ #define INIT_ASSERT /* nothing */ #define assert(x) (void)0 #define compare(a,t,b) (void)0 #endif /* NDEBUG */ /* This file contains the device dependent part of a driver for the IBM-AT * winchester controller. * It was written by Adri Koppes. * * The file contains one entry point: * * at_winchester_task: main entry when system is brought up * * * Changes: * 13 Apr 1992 by Kees J. Bot: device dependent/independent split. * 14 May 2000 by Kees J. Bot: d-d/i rewrite. * 23 Mar 2000 by Michael Temari: added ATAPI CDROM support. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #if ENABLE_AT_WINI #define ATAPI_DEBUG 0 /* To debug ATAPI code. */ /* I/O Ports used by winchester disk controllers. */ /* Read and write registers */ #define REG_BASE0 0x1F0 /* base register of controller 0 */ #define REG_BASE1 0x170 /* base register of controller 1 */ #define REG_DATA 0 /* data register (offset from the base reg.) */ #define REG_PRECOMP 1 /* start of write precompensation */ #define REG_COUNT 2 /* sectors to transfer */ #define REG_SECTOR 3 /* sector number */ #define REG_CYL_LO 4 /* low byte of cylinder number */ #define REG_CYL_HI 5 /* high byte of cylinder number */ #define REG_LDH 6 /* lba, drive and head */ #define LDH_DEFAULT 0xA0 /* ECC enable, 512 bytes per sector */ #define LDH_LBA 0x40 /* Use LBA addressing */ #define ldh_init(drive) (LDH_DEFAULT | ((drive) << 4)) /* Read only registers */ #define REG_STATUS 7 /* status */ #define STATUS_BSY 0x80 /* controller busy */ #define STATUS_RDY 0x40 /* drive ready */ #define STATUS_WF 0x20 /* write fault */ #define STATUS_SC 0x10 /* seek complete (obsolete) */ #define STATUS_DRQ 0x08 /* data transfer request */ #define STATUS_CRD 0x04 /* corrected data */ #define STATUS_IDX 0x02 /* index pulse */ #define STATUS_ERR 0x01 /* error */ #define STATUS_ADMBSY 0x100 /* administratively busy (software) */ #define REG_ERROR 1 /* error code */ #define ERROR_BB 0x80 /* bad block */ #define ERROR_ECC 0x40 /* bad ecc bytes */ #define ERROR_ID 0x10 /* id not found */ #define ERROR_AC 0x04 /* aborted command */ #define ERROR_TK 0x02 /* track zero error */ #define ERROR_DM 0x01 /* no data address mark */ /* Write only registers */ #define REG_COMMAND 7 /* command */ #define CMD_IDLE 0x00 /* for w_command: drive idle */ #define CMD_RECALIBRATE 0x10 /* recalibrate drive */ #define CMD_READ 0x20 /* read data */ #define CMD_WRITE 0x30 /* write data */ #define CMD_READVERIFY 0x40 /* read verify */ #define CMD_FORMAT 0x50 /* format track */ #define CMD_SEEK 0x70 /* seek cylinder */ #define CMD_DIAG 0x90 /* execute device diagnostics */ #define CMD_SPECIFY 0x91 /* specify parameters */ #define ATA_IDENTIFY 0xEC /* identify drive */ #define REG_CTL 0x206 /* control register */ #define CTL_NORETRY 0x80 /* disable access retry */ #define CTL_NOECC 0x40 /* disable ecc retry */ #define CTL_EIGHTHEADS 0x08 /* more than eight heads */ #define CTL_RESET 0x04 /* reset controller */ #define CTL_INTDISABLE 0x02 /* disable interrupts */ #if ENABLE_ATAPI #define ERROR_SENSE 0xF0 /* sense key mask */ #define SENSE_NONE 0x00 /* no sense key */ #define SENSE_RECERR 0x10 /* recovered error */ #define SENSE_NOTRDY 0x20 /* not ready */ #define SENSE_MEDERR 0x30 /* medium error */ #define SENSE_HRDERR 0x40 /* hardware error */ #define SENSE_ILRQST 0x50 /* illegal request */ #define SENSE_UATTN 0x60 /* unit attention */ #define SENSE_DPROT 0x70 /* data protect */ #define SENSE_ABRT 0xb0 /* aborted command */ #define SENSE_MISCOM 0xe0 /* miscompare */ #define ERROR_MCR 0x08 /* media change requested */ #define ERROR_ABRT 0x04 /* aborted command */ #define ERROR_EOM 0x02 /* end of media detected */ #define ERROR_ILI 0x01 /* illegal length indication */ #define REG_FEAT 1 /* features */ #define FEAT_OVERLAP 0x02 /* overlap */ #define FEAT_DMA 0x01 /* dma */ #define REG_IRR 2 /* interrupt reason register */ #define IRR_REL 0x04 /* release */ #define IRR_IO 0x02 /* direction for xfer */ #define IRR_COD 0x01 /* command or data */ #define REG_SAMTAG 3 #define REG_CNT_LO 4 /* low byte of cylinder number */ #define REG_CNT_HI 5 /* high byte of cylinder number */ #define REG_DRIVE 6 /* drive select */ #define REG_STATUS 7 /* status */ #define STATUS_BSY 0x80 /* controller busy */ #define STATUS_DRDY 0x40 /* drive ready */ #define STATUS_DMADF 0x20 /* dma ready/drive fault */ #define STATUS_SRVCDSC 0x10 /* service or dsc */ #define STATUS_DRQ 0x08 /* data transfer request */ #define STATUS_CORR 0x04 /* correctable error occurred */ #define STATUS_CHECK 0x01 /* check error */ #define ATAPI_PACKETCMD 0xA0 /* packet command */ #define ATAPI_IDENTIFY 0xA1 /* identify drive */ #define SCSI_READ10 0x28 /* read from disk */ #define CD_SECTOR_SIZE 2048 /* sector size of a CD-ROM */ #endif /* ATAPI */ /* Interrupt request lines. */ #define NO_IRQ 0 /* no IRQ set yet */ #define AT_IRQ0 14 /* interrupt number for controller 0 */ #define AT_IRQ1 15 /* interrupt number for controller 1 */ /* Common command block */ struct command { u8_t precomp; /* REG_PRECOMP, etc. */ u8_t count; u8_t sector; u8_t cyl_lo; u8_t cyl_hi; u8_t ldh; u8_t command; }; /* Error codes */ #define ERR (-1) /* general error */ #define ERR_BAD_SECTOR (-2) /* block marked bad detected */ /* Some controllers don't interrupt, the clock will wake us up. */ #define WAKEUP (32*HZ) /* drive may be out for 31 seconds max */ /* Miscellaneous. */ #define MAX_DRIVES 4 /* this driver supports 4 drives (d0 - d3) */ #if _WORD_SIZE > 2 #define MAX_SECS 256 /* controller can transfer this many sectors */ #else #define MAX_SECS 127 /* but not to a 16 bit process */ #endif #define MAX_ERRORS 4 /* how often to try rd/wt before quitting */ #define NR_DEVICES (MAX_DRIVES * DEV_PER_DRIVE) #define SUB_PER_DRIVE (NR_PARTITIONS * NR_PARTITIONS) #define NR_SUBDEVS (MAX_DRIVES * SUB_PER_DRIVE) #define TIMEOUT 31500 /* controller timeout in ms */ #define RECOVERYTIME 500 /* controller recovery time in ms */ #define INITIALIZED 0x01 /* drive is initialized */ #define DEAF 0x02 /* controller must be reset */ #define SMART 0x04 /* drive supports ATA commands */ #if ENABLE_ATAPI #define ATAPI 0x08 /* it is an ATAPI device */ #else #define ATAPI 0 /* don't bother with ATAPI; optimise out */ #endif /* Variables. */ PRIVATE struct wini { /* main drive struct, one entry per drive */ unsigned state; /* drive state: deaf, initialized, dead */ unsigned base; /* base register of the register file */ unsigned irq; /* interrupt request line */ unsigned lcylinders; /* logical number of cylinders (BIOS) */ unsigned lheads; /* logical number of heads */ unsigned lsectors; /* logical number of sectors per track */ unsigned pcylinders; /* physical number of cylinders (translated) */ unsigned pheads; /* physical number of heads */ unsigned psectors; /* physical number of sectors per track */ unsigned ldhpref; /* top four bytes of the LDH (head) register */ unsigned precomp; /* write precompensation cylinder / 4 */ unsigned max_count; /* max request for this drive */ unsigned open_ct; /* in-use count */ struct device part[DEV_PER_DRIVE]; /* disks and partitions */ struct device subpart[SUB_PER_DRIVE]; /* subpartitions */ } wini[MAX_DRIVES], *w_wn; PRIVATE int win_tasknr; /* my task number */ PRIVATE int w_command; /* current command in execution */ PRIVATE int w_status; /* status after interrupt */ PRIVATE int w_drive; /* selected drive */ PRIVATE struct device *w_dv; /* device's base and size */ FORWARD _PROTOTYP*****************************E( void init_params, (void) ); FORWARD _PROTOTYPE( int w_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( struct device *w_prepare, (int device) ); FORWARD _PROTOTYPE( int w_identify, (void) ); FORWARD _PROTOTYPE( char *w_name, (void) ); FORWARD _PROTOTYPE( int w_specify, (void) ); FORWARD _PROTOTYPE( int w_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int com_out, (struct command *cmd) ); FORWARD _PROTOTYPE( void w_need_reset, (void) ); FORWARD _PROTOTYPE( int w_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int com_simple, (struct command *cmd) ); FORWARD _PROTOTYPE( void w_timeout, (void) ); FORWARD _PROTOTYPE( int w_reset, (void) ); FORWARD _PROTOTYPE( void w_intr_wait, (void) ); FORWARD _PROTOTYPE( int at_intr_wait, (void) ); FORWARD _PROTOTYPE( int w_waitfor, (int mask, int value) ); FORWARD _PROTOTYPE( int w_handler, (int irq) ); FORWARD _PROTOTYPE( void w_geometry, (struct partition *entry) ); #if ENABLE_ATAPI FORWARD _PROTOTYPE( int atapi_sendpacket, (u8_t *packet, unsigned cnt) ); FORWARD _PROTOTYPE( int atapi_intr_wait, (void) ); FORWARD _PROTOTYPE( int atapi_open, (void) ); FORWARD _PROTOTYPE( void atapi_close, (void) ); FORWARD _PROTOTYPE( int atapi_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); #endif /* Entry points to this driver. */ PRIVATE struct driver w_dtab = { w_name, /* current device's name */ w_do_open, /* open or mount request, initialize device */ w_do_close, /* release device */ do_diocntl, /* get or set a partition's geometry */ w_prepare, /* prepare for I/O on a given minor device */ w_transfer, /* do the I/O */ nop_cleanup, /* nothing to clean up */ w_geometry, /* tell the geometry of the disk */ }; /*===========================================================================* * at_winchester_task * *===========================================================================*/ PUBLIC void at_winchester_task() { /* Set special disk parameters then call the generic main loop. */ win_tasknr = proc_number(proc_ptr); init_params(); driver_task(&w_dtab); } /*============================================================================* * init_params * *============================================================================*/ PRIVATE void init_params() { /* This routine is called at startup to initialize the drive parameters. */ u16_t parv[2]; unsigned int vector; int drive, nr_drives; struct wini *wn; u8_t params[16]; phys_bytes param_phys = vir2phys(params); /* Get the number of drives from the BIOS data area */ phys_copy(0x475L, param_phys, 1L); if ((nr_drives = params[0]) > 2) nr_drives = 2; for (drive = 0, wn = wini; drive < MAX_DRIVES; drive++, wn++) { if (drive < nr_drives) { /* Copy the BIOS parameter vector */ vector = drive == 0 ? WINI_0_PARM_VEC : WINI_1_PARM_VEC; phys_copy(vector * 4L, vir2phys(parv), 4L); /* Calculate the address of the parameters and copy them */ phys_copy(hclick_to_physb(parv[1]) + parv[0], param_phys, 16L); /* Copy the parameters to the structures of the drive */ wn->lcylinders = bp_cylinders(params); wn->lheads = bp_heads(params); wn->lsectors = bp_sectors(params); wn->precomp = bp_precomp(params) >> 2; } wn->ldhpref = ldh_init(drive); wn->max_count = MAX_SECS << SECTOR_SHIFT; /* Base I/O register to address controller. */ wn->base = drive < 2 ? REG_BASE0 : REG_BASE1; } } /*============================================================================* * w_do_open * *============================================================================*/ PRIVATE int w_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device open: Initialize the controller and read the partition table. */ struct wini *wn; if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); wn = w_wn; if (wn->state == 0) { /* Try to identify the device. */ if (w_identify() != OK) { printf("%s: probe failed\n", w_name()); if (wn->state & DEAF) w_reset(); wn->state = 0; return(ENXIO); } } if (wn->open_ct == 0) { #if ENABLE_ATAPI if (wn->state & ATAPI) { int r; if (m_ptr->COUNT & W_BIT) return(EACCES); if ((r = atapi_open()) != OK) return(r); } #endif /* Partition the disk. */ partition(&w_dtab, w_drive * DEV_PER_DRIVE, P_PRIMARY); wn->open_ct++; } return(OK); } /*===========================================================================* * w_prepare * *===========================================================================*/ PRIVATE struct device *w_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DEVICES) { /* d0, d0p[0-3], d1, ... */ w_drive = device / DEV_PER_DRIVE; /* save drive number */ w_wn = &wini[w_drive]; w_dv = &w_wn->part[device % DEV_PER_DRIVE]; } else if ((unsigned) (device -= MINOR_d0p0s0) < NR_SUBDEVS) {/*d[0-7]p[0-3]s[0-3]*/ w_drive = device / SUB_PER_DRIVE; w_wn = &wini[w_drive]; w_dv = &w_wn->subpart[device % SUB_PER_DRIVE]; } else { return(NIL_DEV); } return(w_dv); } /*===========================================================================* * w_identify * *===========================================================================*/ PRIVATE int w_identify() { /* Find out if a device exists, if it is an old AT disk, or a newer ATA * drive, a removable media device, etc. */ struct wini *wn = w_wn; struct command cmd; char id_string[40]; int i, r; unsigned long size; #define id_byte(n) (&tmp_buf[2 * (n)]) #define id_word(n) (((u16_t) id_byte(n)[0] << 0) \ |((u16_t) id_byte(n)[1] << 8)) #define id_longword(n) (((u32_t) id_byte(n)[0] << 0) \ |((u32_t) id_byte(n)[1] << 8) \ |((u32_t) id_byte(n)[2] << 16) \ |((u32_t) id_byte(n)[3] << 24)) /* Try to identify the device. */ cmd.ldh = wn->ldhpref; cmd.command = ATA_IDENTIFY; if (com_simple(&cmd) == OK) { /* This is an ATA device. */ wn->state |= SMART; /* Device information. */ port_read(wn->base + REG_DATA, tmp_phys, SECTOR_SIZE); /* Why are the strings byte swapped??? */ for (i = 0; i < 40; i++) id_string[i] = id_byte(27)[i^1]; /* Preferred CHS translation mode. */ wn->pcylinders = id_word(1); wn->pheads = id_word(3); wn->psectors = id_word(6); size = (u32_t) wn->pcylinders * wn->pheads * wn->psectors; if ((id_byte(49)[1] & 0x02) && size > 512L*1024*2) { /* Drive is LBA capable and is big enough to trust it to * not make a mess of it. */ wn->ldhpref |= LDH_LBA; size = id_longword(60); } if (wn->lcylinders == 0) { /* No BIOS parameters? Then make some up. */ wn->lcylinders = wn->pcylinders; wn->lheads = wn->pheads; wn->lsectors = wn->psectors; while (wn->lcylinders > 1024) { wn->lheads *= 2; wn->lcylinders /= 2; } } #if ENABLE_ATAPI } else if (cmd.command = ATAPI_IDENTIFY, com_simple(&cmd) == OK) { /* An ATAPI device. */ wn->state |= ATAPI; /* Device information. */ port_read(wn->base + REG_DATA, tmp_phys, 512); /* Why are the strings byte swapped??? */ for (i = 0; i < 40; i++) id_string[i] = id_byte(27)[i^1]; size = 0; /* Size set later. */ #endif } else { /* Not an ATA device; no translations, no special features. Don't * touch it unless the BIOS knows about it. */ if (wn->lcylinders == 0) return(ERR); /* no BIOS parameters */ wn->pcylinders = wn->lcylinders; wn->pheads = wn->lheads; wn->psectors = wn->lsectors; size = (u32_t) wn->pcylinders * wn->pheads * wn->psectors; } /* Size of the whole drive */ wn->part[0].dv_size = mul64u(size, SECTOR_SIZE); if (w_specify() != OK && w_specify() != OK) return(ERR); printf("%s: ", w_name()); if (wn->state & (SMART|ATAPI)) { printf("%.40s\n", id_string); } else { printf("%ux%ux%u\n", wn->pcylinders, wn->pheads, wn->psectors); } /* Everything looks OK; register IRQ so we can stop polling. */ wn->irq = w_drive < 2 ? AT_IRQ0 : AT_IRQ1; put_irq_handler(wn->irq, w_handler); enable_irq(wn->irq); return(OK); } /*===========================================================================* * w_name * *===========================================================================*/ PRIVATE char *w_name() { /* Return a name for the current device. */ static char name[] = "at-d0"; name[4] = '0' + w_drive; return name; } /*===========================================================================* * w_specify * *===========================================================================*/ PRIVATE int w_specify() { /* Routine to initialize the drive after boot or when a reset is needed. */ struct wini *wn = w_wn; struct command cmd; if ((wn->state & DEAF) && w_reset() != OK) return(ERR); if (!(wn->state & ATAPI)) { /* Specify parameters: precompensation, number of heads and sectors. */ cmd.precomp = wn->precomp; cmd.count = wn->psectors; cmd.ldh = w_wn->ldhpref | (wn->pheads - 1); cmd.command = CMD_SPECIFY; /* Specify some parameters */ /* Output command block and see if controller accepts the parameters. */ if (com_simple(&cmd) != OK) return(ERR); if (!(wn->state & SMART)) { /* Calibrate an old disk. */ cmd.sector = 0; cmd.cyl_lo = 0; cmd.cyl_hi = 0; cmd.ldh = w_wn->ldhpref; cmd.command = CMD_RECALIBRATE; if (com_simple(&cmd) != OK) return(ERR); } } wn->state |= INITIALIZED; return(OK); } /*===========================================================================* * w_transfer * *===========================================================================*/ PRIVATE int w_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct wini *wn = w_wn; iovec_t *iop, *iov_end = iov + nr_req; int r, errors; unsigned long block; unsigned long dv_size = cv64ul(w_dv->dv_size); struct command cmd; unsigned cylinder, head, sector, nbytes, count, chunk; unsigned secspcyl = wn->pheads * wn->psectors; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); #if ENABLE_ATAPI if (w_wn->state & ATAPI) { return atapi_transfer(proc_nr, opcode, position, iov, nr_req); } #endif /* Check disk address. */ if ((position & SECTOR_MASK) != 0) return(EINVAL); errors = 0; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) nbytes += iop->iov_size; if ((nbytes & SECTOR_MASK) != 0) return(EINVAL); /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE); if (nbytes >= wn->max_count) { /* The drive can't do more then max_count at once. */ nbytes = wn->max_count; } /* First check to see if a reinitialization is needed. */ if (!(wn->state & INITIALIZED) && w_specify() != OK) return(EIO); /* Tell the controller to transfer nbytes bytes. */ cmd.precomp = wn->precomp; cmd.count = (nbytes >> SECTOR_SHIFT) & BYTE; if (wn->ldhpref & LDH_LBA) { cmd.sector = (block >> 0) & 0xFF; cmd.cyl_lo = (block >> 8) & 0xFF; cmd.cyl_hi = (block >> 16) & 0xFF; cmd.ldh = wn->ldhpref | ((block >> 24) & 0xF); } else { cylinder = block / secspcyl; head = (block % secspcyl) / wn->psectors; sector = block % wn->psectors; cmd.sector = sector + 1; cmd.cyl_lo = cylinder & BYTE; cmd.cyl_hi = (cylinder >> 8) & BYTE; cmd.ldh = wn->ldhpref | head; } cmd.command = opcode == DEV_SCATTER ? CMD_WRITE : CMD_READ; r = com_out(&cmd); while (r == OK && nbytes > 0) { /* For each sector, wait for an interrupt and fetch the data * (read), or supply data to the controller and wait for an * interrupt (write). */ if (opcode == DEV_GATHER) { /* First an interrupt, then data. */ if ((r = at_intr_wait()) != OK) { /* An error, send data to the bit bucket. */ if (w_status & STATUS_DRQ) { port_read(w_wn->base + REG_DATA, tmp_phys, SECTOR_SIZE); } break; } } /* Wait for data transfer requested. */ if (!w_waitfor(STATUS_DRQ, STATUS_DRQ)) { r = ERR; break; } /* Copy bytes to or from the device's buffer. */ if (opcode == DEV_GATHER) { port_read(w_wn->base + REG_DATA, user_base + iov->iov_addr, SECTOR_SIZE); } else { port_write(w_wn->base + REG_DATA, user_base + iov->iov_addr, SECTOR_SIZE); /* Data sent, wait for an interrupt. */ if ((r = at_intr_wait()) != OK) break; } /* Book the bytes successfully transferred. */ nbytes -= SECTOR_SIZE; position += SECTOR_SIZE; iov->iov_addr += SECTOR_SIZE; if ((iov->iov_size -= SECTOR_SIZE) == 0) { iov++; nr_req--; } } /* Any errors? */ if (r != OK) { /* Don't retry if sector marked bad or too many errors. */ if (r == ERR_BAD_SECTOR || ++errors == MAX_ERRORS) { w_command = CMD_IDLE; return(EIO); } } } w_command = CMD_IDLE; return(OK); } /*============================================================================* * com_out * *============================================================================*/ PRIVATE int com_out(cmd) struct command *cmd; /* Command block */ { /* Output the command block to the winchester controller and return status */ struct wini *wn = w_wn; unsigned base = wn->base; if (!w_waitfor(STATUS_BSY, 0)) { printf("%s: controller not ready\n", w_name()); return(ERR); } /* Select drive. */ out_byte(base + REG_LDH, cmd->ldh); if (!w_waitfor(STATUS_BSY, 0)) { printf("%s: drive not ready\n", w_name()); return(ERR); } /* Schedule a wakeup call, some controllers are flaky. */ clock_mess(WAKEUP, w_timeout); out_byte(base + REG_CTL, wn->pheads >= 8 ? CTL_EIGHTHEADS : 0); out_byte(base + REG_PRECOMP, cmd->precomp); out_byte(base + REG_COUNT, cmd->count); out_byte(base + REG_SECTOR, cmd->sector); out_byte(base + REG_CYL_LO, cmd->cyl_lo); out_byte(base + REG_CYL_HI, cmd->cyl_hi); w_status = STATUS_ADMBSY; out_byte(base + REG_COMMAND, w_command = cmd->command); return(OK); } /*===========================================================================* * w_need_reset * *===========================================================================*/ PRIVATE void w_need_reset() { /* The controller needs to be reset. */ struct wini *wn; for (wn = wini; wn < &wini[MAX_DRIVES]; wn++) { wn->state |= DEAF; wn->state &= ~INITIALIZED; } } /*============================================================================* * w_do_close * *============================================================================*/ PRIVATE int w_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device close: Release a device. */ if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); w_wn->open_ct--; #if ENABLE_ATAPI if (w_wn->open_ct == 0 && (w_wn->state & ATAPI)) atapi_close(); #endif return(OK); } /*============================================================================* * com_simple * *============================================================================*/ PRIVATE int com_simple(cmd) struct command *cmd; /* Command block */ { /* A simple controller command, only one interrupt and no data-out phase. */ int r; if ((r = com_out(cmd)) == OK) r = at_intr_wait(); w_command = CMD_IDLE; return(r); } /*===========================================================================* * w_timeout * *===========================================================================*/ PRIVATE void w_timeout() { struct wini *wn = w_wn; switch (w_command) { case CMD_IDLE: break; /* fine */ case CMD_READ: case CMD_WRITE: /* Impossible, but not on PC's: The controller does not respond. */ /* Limiting multisector I/O seems to help. */ if (wn->max_count > 8 * SECTOR_SIZE) { wn->max_count = 8 * SECTOR_SIZE; } else { wn->max_count = SECTOR_SIZE; } /*FALL THROUGH*/ default: /* Some other command. */ printf("%s: timeout on command %02x\n", w_name(), w_command); w_need_reset(); w_status = 0; interrupt(win_tasknr); } } /*===========================================================================* * w_reset * *===========================================================================*/ PRIVATE int w_reset() { /* Issue a reset to the controller. This is done after any catastrophe, * like the controller refusing to respond. */ struct wini *wn; /* Wait for any internal drive recovery. */ milli_delay(RECOVERYTIME); /* Strobe reset bit */ out_byte(w_wn->base + REG_CTL, CTL_RESET); milli_delay(1); out_byte(w_wn->base + REG_CTL, 0); milli_delay(1); /* Wait for controller ready */ if (!w_waitfor(STATUS_BSY, 0)) { printf("%s: reset failed, drive busy\n", w_name()); return(ERR); } /* The error register should be checked now, but some drives mess it up. */ for (wn = wini; wn < &wini[MAX_DRIVES]; wn++) { if (wn->base == w_wn->base) wn->state &= ~DEAF; } return(OK); } /*============================================================================* * w_intr_wait * *============================================================================*/ PRIVATE void w_intr_wait() { /* Wait for a task completion interrupt. */ message mess; if (w_wn->irq != NO_IRQ) { /* Wait for an interrupt that sets w_status to "not busy". */ while (w_status & (STATUS_ADMBSY|STATUS_BSY)) receive(HARDWARE, &mess); } else { /* Interrupt not yet allocated; use polling. */ (void) w_waitfor(STATUS_BSY, 0); } } /*============================================================================* * at_intr_wait * *============================================================================*/ PRIVATE int at_intr_wait() { /* Wait for an interrupt, study the status bits and return error/success. */ int r; w_intr_wait(); if ((w_status & (STATUS_BSY | STATUS_WF | STATUS_ERR)) == 0) { r = OK; } else if ((w_status & STATUS_ERR) && (in_byte(w_wn->base + REG_ERROR) & ERROR_BB)) { r = ERR_BAD_SECTOR; /* sector marked bad, retries won't help */ } else { r = ERR; /* any other error */ } w_status |= STATUS_ADMBSY; /* assume still busy with I/O */ return(r); } /*==========================================================================* * w_waitfor * *==========================================================================*/ PRIVATE int w_waitfor(mask, value) int mask; /* status mask */ int value; /* required status */ { /* Wait until controller is in the required state. Return zero on timeout. */ struct milli_state ms; milli_start(&ms); do { w_status = in_byte(w_wn->base + REG_STATUS); if ((w_status & mask) == value) return 1; } while (milli_elapsed(&ms) < TIMEOUT); w_need_reset(); /* Controller gone deaf. */ return(0); } /*==========================================================================* * w_handler * *==========================================================================*/ PRIVATE int w_handler(irq) int irq; { /* Disk interrupt, send message to winchester task and reenable interrupts. */ w_status = in_byte(w_wn->base + REG_STATUS); /* acknowledge interrupt */ interrupt(win_tasknr); return 1; } /*============================================================================* * w_geometry * *============================================================================*/ PRIVATE void w_geometry(entry) struct partition *entry; { struct wini *wn = w_wn; if (wn->state & ATAPI) { /* Make up some numbers. */ entry->cylinders = div64u(wn->part[0].dv_size, SECTOR_SIZE) / (64*32); entry->heads = 64; entry->sectors = 32; } else { /* Return logical geometry. */ entry->cylinders = wn->lcylinders; entry->heads = wn->lheads; entry->sectors = wn->lsectors; } } #if ENABLE_ATAPI /*===========================================================================* * atapi_open * *===========================================================================*/ PRIVATE int atapi_open() { /* Should load and lock the device and obtain its size. For now just set the * size of the device to something big. What is really needed is a generic * SCSI layer that does all this stuff for ATAPI and SCSI devices (kjb). (XXX) */ w_wn->part[0].dv_size = mul64u(800L*1024, 1024); return(OK); } /*===========================================================================* * atapi_close * *===========================================================================*/ PRIVATE void atapi_close() { /* Should unlock the device. For now do nothing. (XXX) */ } /*===========================================================================* * atapi_transfer * *===========================================================================*/ PRIVATE int atapi_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct wini *wn = w_wn; iovec_t *iop, *iov_end = iov + nr_req; int r, errors, fresh; u64_t pos; unsigned long block; unsigned long dv_size = cv64ul(w_dv->dv_size); unsigned nbytes, nblocks, count, before, chunk; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); u8_t packet[12]; errors = fresh = 0; while (nr_req > 0 && !fresh) { /* The Minix block size is smaller than the CD block size, so we * may have to read extra before or after the good data. */ pos = add64ul(w_dv->dv_base, position); block = div64u(pos, CD_SECTOR_SIZE); before = rem64u(pos, CD_SECTOR_SIZE); /* How many bytes to transfer? */ nbytes = count = 0; for (iop = iov; iop < iov_end; iop++) { nbytes += iop->iov_size; if ((before + nbytes) % CD_SECTOR_SIZE == 0) count = nbytes; } /* Does one of the memory chunks end nicely on a CD sector multiple? */ if (count != 0) nbytes = count; /* Data comes in as words, so we have to enforce even byte counts. */ if ((before | nbytes) & 1) return(EINVAL); /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; nblocks = (before + nbytes + CD_SECTOR_SIZE - 1) / CD_SECTOR_SIZE; if (ATAPI_DEBUG) { printf("block=%lu, before=%u, nbytes=%u, nblocks=%u\n", block, before, nbytes, nblocks); } /* First check to see if a reinitialization is needed. */ if (!(wn->state & INITIALIZED) && w_specify() != OK) return(EIO); /* Build an ATAPI command packet. */ packet[0] = SCSI_READ10; packet[1] = 0; packet[2] = (block >> 24) & 0xFF; packet[3] = (block >> 16) & 0xFF; packet[4] = (block >> 8) & 0xFF; packet[5] = (block >> 0) & 0xFF; packet[7] = (nblocks >> 8) & 0xFF; packet[8] = (nblocks >> 0) & 0xFF; packet[9] = 0; packet[10] = 0; packet[11] = 0; /* Tell the controller to execute the packet command. */ r = atapi_sendpacket(packet, nblocks * CD_SECTOR_SIZE); if (r != OK) goto err; /* Read chunks of data. */ while ((r = atapi_intr_wait()) > 0) { count = r; if (ATAPI_DEBUG) { printf("before=%u, nbytes=%u, count=%u\n", before, nbytes, count); } while (before > 0 && count > 0) { /* Discard before. */ chunk = before; if (chunk > count) chunk = count; if (chunk > DMA_BUF_SIZE) chunk = DMA_BUF_SIZE; port_read(w_wn->base + REG_DATA, tmp_phys, chunk); before -= chunk; count -= chunk; } while (nbytes > 0 && count > 0) { /* Requested data. */ chunk = nbytes; if (chunk > count) chunk = count; if (chunk > iov->iov_size) chunk = iov->iov_size; port_read(w_wn->base + REG_DATA, user_base + iov->iov_addr, chunk); position += chunk; nbytes -= chunk; count -= chunk; iov->iov_addr += chunk; fresh = 0; if ((iov->iov_size -= chunk) == 0) { iov++; nr_req--; fresh = 1; /* new element is optional */ } } while (count > 0) { /* Excess data. */ chunk = count; if (chunk > DMA_BUF_SIZE) chunk = DMA_BUF_SIZE; port_read(w_wn->base + REG_DATA, tmp_phys, chunk); count -= chunk; } } if (r < 0) { err: /* Don't retry if too many errors. */ if (++errors == MAX_ERRORS) { w_command = CMD_IDLE; return(EIO); } } } w_command = CMD_IDLE; return(OK); } /*===========================================================================* * atapi_sendpacket * *===========================================================================*/ PRIVATE int atapi_sendpacket(packet, cnt) u8_t *packet; unsigned cnt; { /* Send an Atapi Packet Command */ struct wini *wn = w_wn; message mess; /* Select Master/Slave drive */ out_byte(wn->base + REG_DRIVE, wn->ldhpref); if (!w_waitfor(STATUS_BSY | STATUS_DRQ, 0)) { printf("%s: drive not ready\n", w_name()); return(ERR); } /* Schedule wakeup call. */ clock_mess(WAKEUP, w_timeout); #if _WORD_SIZE > 2 if (cnt > 0xFFFE) cnt = 0xFFFE; /* Max data per interrupt. */ #endif out_byte(wn->base + REG_FEAT, 0); out_byte(wn->base + REG_IRR, 0); out_byte(wn->base + REG_SAMTAG, 0); out_byte(wn->base + REG_CNT_LO, (cnt >> 0) & 0xFF); out_byte(wn->base + REG_CNT_HI, (cnt >> 8) & 0xFF); out_byte(wn->base + REG_COMMAND, w_command = ATAPI_PACKETCMD); if (!w_waitfor(STATUS_BSY | STATUS_DRQ, STATUS_DRQ)) { printf("%s: timeout (BSY|DRQ -> DRQ)\n"); return(ERR); } w_status |= STATUS_ADMBSY; /* Command not at all done yet. */ /* Send the command packet to the device. */ port_write(wn->base + REG_DATA, vir2phys(packet), 12); return(OK); } /*============================================================================* * atapi_intr_wait * *============================================================================*/ PRIVATE int atapi_intr_wait() { /* Wait for an interrupt and study the results. Returns a number of bytes * that need to be transferred, or an error code. */ struct wini *wn = w_wn; int e; int len; int irr; int r; int phase; w_intr_wait(); e = in_byte(wn->base + REG_ERROR); len = in_byte(wn->base + REG_CNT_LO); len |= in_byte(wn->base + REG_CNT_HI) << 8; irr = in_byte(wn->base + REG_IRR); if (ATAPI_DEBUG) { printf("S=%02x E=%02x L=%04x I=%02x\n", w_status, e, len, irr); } if (w_status & (STATUS_BSY | STATUS_CHECK)) return ERR; phase = (w_status & STATUS_DRQ) | (irr & (IRR_COD | IRR_IO)); switch (phase) { case IRR_COD | IRR_IO: if (ATAPI_DEBUG) printf("ACD: Phase Command Complete\n"); r = OK; break; case 0: if (ATAPI_DEBUG) printf("ACD: Phase Command Aborted\n"); r = ERR; break; case STATUS_DRQ | IRR_COD: if (ATAPI_DEBUG) printf("ACD: Phase Command Out\n"); r = ERR; break; case STATUS_DRQ: if (ATAPI_DEBUG) printf("ACD: Phase Data Out %d\n", len); r = len; break; case STATUS_DRQ | IRR_IO: if (ATAPI_DEBUG) printf("ACD: Phase Data In %d\n", len); r = len; break; default: if (ATAPI_DEBUG) printf("ACD: Phase Unknown\n"); r = ERR; break; } #if 0 /* retry if the media changed */ XXX while (phase == (IRR_IO | IRR_COD) && (w_status & STATUS_CHECK) && (e & ERROR_SENSE) == SENSE_UATTN && --try > 0); #endif w_status |= STATUS_ADMBSY; /* Assume not done yet. */ return(r); } #endif /* ENABLE_ATAPI */ #endif /* ENABLE_AT_WINI */ /* This file contains the "device dependent" part of a hard disk driver that * uses the ROM BIOS. It makes a call and just waits for the transfer to * happen. It is not interrupt driven and thus will (*) have poor performance. * The advantage is that it should work on virtually any PC, XT, 386, PS/2 * or clone. The demo disk uses this driver. It is suggested that all * MINIX users try the other drivers, and use this one only as a last resort, * if all else fails. * * (*) The performance is within 10% of the AT driver for reads on any disk * and writes on a 2:1 interleaved disk, it will be DMA_BUF_SIZE bytes * per revolution for a minimum of 60 kb/s for writes to 1:1 disks. * * The file contains one entry point: * * bios_winchester_task: main entry when system is brought up * * * Changes: * 30 Apr 1992 by Kees J. Bot: device dependent/independent split. * 14 May 2000 by Kees J. Bot: d-d/i rewrite. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #include #if ENABLE_BIOS_WINI /* Error codes */ #define ERR (-1) /* general error */ /* Parameters for the disk drive. */ #define MAX_DRIVES 4 /* this driver supports 4 drives (d0 - d3)*/ #define MAX_SECS 255 /* bios can transfer this many sectors */ #define NR_DEVICES (MAX_DRIVES * DEV_PER_DRIVE) #define SUB_PER_DRIVE (NR_PARTITIONS * NR_PARTITIONS) #define NR_SUBDEVS (MAX_DRIVES * SUB_PER_DRIVE) /* Variables. */ PRIVATE struct wini { /* main drive struct, one entry per drive */ unsigned cylinders; /* number of cylinders */ unsigned heads; /* number of heads */ unsigned sectors; /* number of sectors per track */ unsigned open_ct; /* in-use count */ int int13ext; /* IBM/MS INT 13 extensions supported? */ struct device part[DEV_PER_DRIVE]; /* disks and partitions */ struct device subpart[SUB_PER_DRIVE]; /* subpartitions */ } wini[MAX_DRIVES], *w_wn; PRIVATE int nr_drives = MAX_DRIVES; /* Number of drives */ PRIVATE int w_drive; /* selected drive */ PRIVATE struct device *w_dv; /* device's base and size */ FORWARD _PROTOTYPE( struct device *w_prepare, (int device) ); FORWARD _PROTOTYPE( char *w_name, (void) ); FORWARD _PROTOTYPE( int w_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int w_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int w_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void w_init, (void) ); FORWARD _PROTOTYPE( void w_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver w_dtab = { w_name, /* current device's name */ w_do_open, /* open or mount request, initialize device */ w_do_close, /* release device */ do_diocntl, /* get or set a partition's geometry */ w_prepare, /* prepare for I/O on a given minor device */ w_transfer, /* do the I/O */ nop_cleanup, /* no cleanup needed */ w_geometry /* tell the geometry of the disk */ }; /*===========================================================================* * bios_winchester_task * *===========================================================================*/ PUBLIC void bios_winchester_task() { driver_task(&w_dtab); } /*===========================================================================* * w_prepare * *===========================================================================*/ PRIVATE struct device *w_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DEVICES) { /* d0, d0p[0-3], d1, ... */ w_drive = device / DEV_PER_DRIVE; /* save drive number */ w_wn = &wini[w_drive]; w_dv = &w_wn->part[device % DEV_PER_DRIVE]; } else if ((unsigned) (device -= MINOR_d0p0s0) < NR_SUBDEVS) {/*d[0-7]p[0-3]s[0-3]*/ w_drive = device / SUB_PER_DRIVE; w_wn = &wini[w_drive]; w_dv = &w_wn->subpart[device % SUB_PER_DRIVE]; } else { return(NIL_DEV); } return(w_drive < nr_drives ? w_dv : NIL_DEV); } /*===========================================================================* * w_name * *===========================================================================*/ PRIVATE char *w_name() { /* Return a name for the current device. */ static char name[] = "bios-d0"; name[6] = '0' + w_drive; return name; } /*===========================================================================* * w_transfer * *===========================================================================*/ PRIVATE int w_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct wini *wn = w_wn; iovec_t *iop, *iov_end = iov + nr_req; int errors; unsigned nbytes, count, chunk; unsigned long block; unsigned long dv_size = cv64ul(w_dv->dv_size); unsigned secspcyl = wn->heads * wn->sectors; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); static struct int13ext_rw { u8_t len; u8_t res1; u16_t count; u16_t addr[2]; u32_t block[2]; } i13e_rw; /* Check disk address. */ if ((position & SECTOR_MASK) != 0) return(EINVAL); errors = 0; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) { if (nbytes + iop->iov_size > DMA_BUF_SIZE) { /* Don't do half a segment if you can avoid it. */ if (nbytes == 0) nbytes = DMA_BUF_SIZE; break; } nbytes += iop->iov_size; } if ((nbytes & SECTOR_MASK) != 0) return(EINVAL); /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE); /* Degrade to per-sector mode if there were errors. */ if (errors > 0) nbytes = SECTOR_SIZE; if (opcode == DEV_SCATTER) { /* Copy from user space to the DMA buffer. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(user_base + iop->iov_addr, tmp_phys + count, (phys_bytes) chunk); count += chunk; } } /* Do the transfer */ if (wn->int13ext) { /* Set up an extended read or write BIOS call. */ reg86.b.intno = 0x13; reg86.b.ah = opcode == DEV_SCATTER ? 0x43 : 0x42; reg86.b.dl = 0x80 + w_drive; reg86.w.si = vir2phys(&i13e_rw) % HCLICK_SIZE; reg86.w.ds = vir2phys(&i13e_rw) / HCLICK_SIZE; i13e_rw.len = 0x10; i13e_rw.res1 = 0; i13e_rw.count = nbytes >> SECTOR_SHIFT; i13e_rw.addr[0] = tmp_phys % HCLICK_SIZE; i13e_rw.addr[1] = tmp_phys / HCLICK_SIZE; i13e_rw.block[0] = block; i13e_rw.block[1] = 0; } else { /* Set up an ordinary read or write BIOS call. */ unsigned cylinder = block / secspcyl; unsigned sector = (block % wn->sectors) + 1; unsigned head = (block % secspcyl) / wn->sectors; reg86.b.intno = 0x13; reg86.b.ah = opcode == DEV_SCATTER ? 0x03 : 0x02; reg86.b.al = nbytes >> SECTOR_SHIFT; reg86.w.bx = tmp_phys % HCLICK_SIZE; reg86.w.es = tmp_phys / HCLICK_SIZE; reg86.b.ch = cylinder & 0xFF; reg86.b.cl = sector | ((cylinder & 0x300) >> 2); reg86.b.dh = head; reg86.b.dl = 0x80 + w_drive; } level0(int86); if (reg86.w.f & 0x0001) { /* An error occurred, try again sector by sector unless */ if (++errors == 2) return(EIO); continue; } if (opcode == DEV_GATHER) { /* Copy from the DMA buffer to user space. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(tmp_phys + count, user_base + iop->iov_addr, (phys_bytes) chunk); count += chunk; } } /* Book the bytes successfully transferred. */ position += nbytes; for (;;) { if (nbytes < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += nbytes; iov->iov_size -= nbytes; break; } nbytes -= iov->iov_size; iov->iov_addr += iov->iov_size; io*****v->iov_size = 0; if (nbytes == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*============================================================================* * w_do_open * *============================================================================*/ PRIVATE int w_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device open: Initialize the controller and read the partition table. */ static int init_done = FALSE; if (!init_done) { w_init(); init_done = TRUE; } if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); if (w_wn->open_ct++ == 0) { /* Partition the disk. */ partition(&w_dtab, w_drive * DEV_PER_DRIVE, P_PRIMARY); } return(OK); } /*============================================================================* * w_do_close * *============================================================================*/ PRIVATE int w_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device close: Release a device. */ if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); w_wn->open_ct--; return(OK); } /*===========================================================================* * w_init * *===========================================================================*/ PRIVATE void w_init() { /* This routine is called at startup to initialize the drive parameters. */ int drive; struct wini *wn; unsigned long capacity; static struct int13ext_params { u16_t len; u16_t flags; u32_t cylinders; u32_t heads; u32_t sectors; u32_t capacity[2]; u16_t bts_per_sec; u16_t config[2]; } i13e_par; /* Get the geometry of the drives */ for (drive = 0; drive < nr_drives; drive++) { (void) w_prepare(drive * DEV_PER_DRIVE); wn = w_wn; reg86.b.intno = 0x13; reg86.b.ah = 0x08; /* Get drive parameters. */ reg86.b.dl = 0x80 + drive; level0(int86); nr_drives = !(reg86.w.f & 0x0001) ? reg86.b.dl : drive; if (nr_drives > MAX_DRIVES) nr_drives = MAX_DRIVES; if (drive >= nr_drives) break; wn->heads = reg86.b.dh + 1; wn->sectors = reg86.b.cl & 0x3F; wn->cylinders = (reg86.b.ch | ((reg86.b.cl & 0xC0) << 2)) + 1; capacity = (unsigned long) wn->cylinders * wn->heads * wn->sectors; reg86.b.intno = 0x13; reg86.b.ah = 0x41; /* INT 13 Extensions - Installation check */ reg86.w.bx = 0x55AA; reg86.b.dl = 0x80 + drive; if (pc_at) level0(int86); if (!(reg86.w.f & 0x0001) && reg86.w.bx == 0xAA55 && (reg86.w.cx & 0x0001)) { /* INT 13 Extensions available. */ reg86.b.intno = 0x13; reg86.b.ah = 0x48; /* Ext. Get drive parameters. */ reg86.b.dl = 0x80 + drive; reg86.w.si = vir2phys(&i13e_par) % HCLICK_SIZE; reg86.w.ds = vir2phys(&i13e_par) / HCLICK_SIZE; i13e_par.len = 0x001E; /* Input size of parameter packet */ level0(int86); if (!(reg86.w.f & 0x0001)) { wn->int13ext = 1; /* Extensions can be used. */ capacity = i13e_par.capacity[0]; if (i13e_par.capacity[1] != 0) capacity = 0xFFFFFFFF; } } if (wn->int13ext) { printf("%s: %lu sectors\n", w_name(), capacity); } else { printf("%s: %d cylinders, %d heads, %d sectors per track\n", w_name(), wn->cylinders, wn->heads, wn->sectors); } wn->part[0].dv_size = mul64u(capacity, SECTOR_SIZE); } } /*============================================================================* * w_geometry * *============================================================================*/ PRIVATE void w_geometry(entry) struct partition *entry; { entry->cylinders = w_wn->cylinders; entry->heads = w_wn->heads; entry->sectors = w_wn->sectors; } #endif /* ENABLE_BIOS_WINI */ /* This file contains the code and data for the clock task. The clock task * accepts six message types: * * HARD_INT: a clock interrupt has occurred * GET_UPTIME: get the time since boot in ticks * GET_TIME: a process wants the real time in seconds * SET_TIME: a process wants to set the real time in seconds * SET_ALARM: a process wants to be alerted after a specified interval * SET_SYN_AL: set the sync alarm * * * The input message is format m6. The parameters are as follows: * * m_type CLOCK_PROC FUNC NEW_TIME * --------------------------------------------- * | HARD_INT | | | | * |------------+----------+---------+---------| * | GET_UPTIME | | | | * |------------+----------+---------+---------| * | GET_TIME | | | | * |------------+----------+---------+---------| * | SET_TIME | | | newtime | * |------------+----------+---------+---------| * | SET_ALARM | proc_nr |f to call| delta | * |------------+----------+---------+---------| * | SET_SYN_AL | proc_nr | | delta | * --------------------------------------------- * NEW_TIME, DELTA_CLICKS, and SECONDS_LEFT all refer to the same field in * the message, depending upon the message type. * * Reply messages are of type OK, except in the case of a HARD_INT, to * which no reply is generated. For the GET_* messages the time is returned * in the NEW_TIME field, and for the SET_ALARM and SET_SYN_AL the time * in seconds remaining until the alarm is returned is returned in the same * field. * * When an alarm goes off, if the caller is a user process, a SIGALRM signal * is sent to it. If it is a task, a function specified by the caller will * be invoked. This function may, for example, send a message, but only if * it is certain that the task will be blocked when the timer goes off. A * synchronous alarm sends a message to the synchronous alarm task, which * in turn can dispatch a message to another server. This is the only way * to send an alarm to a server, since servers cannot use the function-call * mechanism available to tasks and servers cannot receive signals. */ #include "kernel.h" #include #include #include #include "proc.h" /* Constant definitions. */ #define MILLISEC 100 /* how often to call the scheduler (msec) */ #define SCHED_RATE (MILLISEC*HZ/1000) /* number of ticks per schedule */ /* Clock parameters. */ #if (CHIP == INTEL) #define COUNTER_FREQ (2*TIMER_FREQ) /* counter frequency using sqare wave*/ #define LATCH_COUNT 0x00 /* cc00xxxx, c = channel, x = any */ #define SQUARE_WAVE 0x36 /* ccaammmb, a = access, m = mode, b = BCD */ /* 11x11, 11 = LSB then MSB, x11 = sq wave */ #define TIMER_COUNT ((unsigned) (TIMER_FREQ/HZ)) /* initial value for counter*/ #define TIMER_FREQ 1193182L /* clock frequency for timer in PC and AT */ #define CLOCK_ACK_BIT 0x80 /* PS/2 clock interrupt acknowledge bit */ #endif #if (CHIP == M68000) #define TIMER_FREQ 2457600L /* timer 3 input clock frequency */ #endif /* Clock task variables. */ PRIVATE clock_t realtime; /* real time clock */ PRIVATE time_t boot_time; /* time in seconds of system boot */ PRIVATE clock_t next_alarm; /* probable time of next alarm */ PRIVATE message mc; /* message buffer for both input and output */ PRIVATE int watchdog_proc; /* contains proc_nr at call of *watch_dog[]*/ PRIVATE watchdog_t watch_dog[NR_TASKS+NR_PROCS]; /* Variables used by both clock task and synchronous alarm task */ PRIVATE int syn_al_alive= TRUE; /* don't wake syn_alrm_task before inited*/ PRIVATE int syn_table[NR_TASKS+NR_PROCS]; /* which tasks get CLOCK_INT*/ /* Variables changed by interrupt handler */ PRIVATE clock_t pending_ticks; /* ticks seen by low level only */ PRIVATE int sched_ticks = SCHED_RATE; /* counter: when 0, call scheduler */ PRIVATE struct proc *prev_ptr; /* last user process run by clock task */ FORWARD _PROTOTYPE( void common_setalarm, (int proc_nr, long delta_ticks, watchdog_t fuction) ); FORWARD _PROTOTYPE( void do_clocktick, (void) ); FORWARD _PROTOTYPE( void do_get_time, (void) ); FORWARD _PROTOTYPE( void do_getuptime, (void) ); FORWARD _PROTOTYPE( void do_set_time, (message *m_ptr) ); FORWARD _PROTOTYPE( void do_setalarm, (message *m_ptr) ); FORWARD _PROTOTYPE( void init_clock, (void) ); FORWARD _PROTOTYPE( void cause_alarm, (void) ); FORWARD _PROTOTYPE( void do_setsyn_alrm, (message *m_ptr) ); FORWARD _PROTOTYPE( int clock_handler, (int irq) ); /*===========================================================================* * clock_task * *===========================================================================*/ PUBLIC void clock_task() { /* Main program of clock task. It corrects realtime by adding pending * ticks seen only by the interrupt service, then it determines which * of the 6 possible calls this is by looking at 'mc.m_type'. Then * it dispatches. */ int opcode; init_clock(); /* initialize clock task */ /* Main loop of the clock task. Get work, process it, sometimes reply. */ while (TRUE) { receive(ANY, &mc); /* go get a message */ opcode = mc.m_type; /* extract the function code */ lock(); realtime += pending_ticks; /* transfer ticks from low level handler */ pending_ticks = 0; /* so we don't have to worry about them */ unlock(); switch (opcode) { case HARD_INT: do_clocktick(); break; case GET_UPTIME: do_getuptime(); break; case GET_TIME: do_get_time(); break; case SET_TIME: do_set_time(&mc); break; case SET_ALARM: do_setalarm(&mc); break; case SET_SYNC_AL:do_setsyn_alrm(&mc); break; default: panic("clock task got bad message", mc.m_type); } /* Send reply, except for clock tick. */ mc.m_type = OK; if (opcode != HARD_INT) send(mc.m_source, &mc); } } /*===========================================================================* * do_clocktick * *===========================================================================*/ PRIVATE void do_clocktick() { /* Despite its name, this routine is not called on every clock tick. It * is called on those clock ticks when a lot of work needs to be done. */ register struct proc *rp; register int proc_nr; if (next_alarm <= realtime) { /* An alarm may have gone off, but proc may have exited, so check. */ next_alarm = LONG_MAX; /* start computing next alarm */ for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) { if (rp->p_alarm != 0) { /* See if this alarm time has been reached. */ if (rp->p_alarm <= realtime) { /* A timer has gone off. If it is a user proc, * send it a signal. If it is a task, call the * function previously specified by the task. */ proc_nr = proc_number(rp); if (watch_dog[proc_nr+NR_TASKS]) { watchdog_proc= proc_nr; (*watch_dog[proc_nr+NR_TASKS])(); } else cause_sig(proc_nr, SIGALRM); rp->p_alarm = 0; } /* Work on determining which alarm is next. */ if (rp->p_alarm != 0 && rp->p_alarm < next_alarm) next_alarm = rp->p_alarm; } } } /* If a user process has been running too long, pick another one. */ if (--sched_ticks == 0) { if (bill_ptr == prev_ptr) lock_sched(); /* process has run too long */ sched_ticks = SCHED_RATE; /* reset quantum */ prev_ptr = bill_ptr; /* new previous process */ } } /*===========================================================================* * do_getuptime * *===========================================================================*/ PRIVATE void do_getuptime() { /* Get and return the current clock uptime in ticks. */ mc.NEW_TIME = realtime; /* current uptime */ } /*===========================================================================* * get_uptime * *===========================================================================*/ PUBLIC clock_t get_uptime() { /* Get and return the current clock uptime in ticks. This function is * designed to be called from other tasks, so they can get uptime without * the over**************head of messages. It has to be careful about pending_ticks. */ clock_t uptime; lock(); uptime = realtime + pending_ticks; unlock(); return(uptime); } /*===========================================================================* * do_get_time * *===========================================================================*/ PRIVATE void do_get_time() { /* Get and return the current clock time in seconds. */ mc.NEW_TIME = boot_time + realtime/HZ; /* current real time */ } /*===========================================================================* * do_set_time * *===========================================================================*/ PRIVATE void do_set_time(m_ptr) message *m_ptr; /* pointer to request message */ { /* Set the real time clock. Only the superuser can use this call. */ boot_time = m_ptr->NEW_TIME - realtime/HZ; } /*===========================================================================* * do_setalarm * *===========================================================================*/ PRIVATE void do_setalarm(m_ptr) message *m_ptr; /* pointer to request message */ { /* A process wants an alarm signal or a task wants a given watch_dog function * called after a specified interval. */ register struct proc *rp; int proc_nr; /* which process wants the alarm */ long delta_ticks; /* in how many clock ticks does he want it? */ watchdog_t function; /* function to call (tasks only) */ /* Extract the parameters from the message. */ proc_nr = m_ptr->CLOCK_PROC_NR; /* process to interrupt later */ delta_ticks = m_ptr->DELTA_TICKS; /* how many ticks to wait */ function = (watchdog_t) m_ptr->FUNC_TO_CALL; /* function to call (tasks only) */ rp = proc_addr(proc_nr); mc.SECONDS_LEFT = (rp->p_alarm == 0 ? 0 : (rp->p_alarm-realtime+(HZ-1)) / HZ); if (!istaskp(rp)) function= 0; /* user processes get signaled */ common_setalarm(proc_nr, delta_ticks, function); } /*===========================================================================* * do_setsyn_alrm * *===========================================================================*/ PRIVATE void do_setsyn_alrm(m_ptr) message *m_ptr; /* pointer to request message */ { /* A process wants a synchronous alarm. */ register struct proc *rp; int proc_nr; /* which process wants the alarm */ long delta_ticks; /* in how many clock ticks does he want it? */ /* Extract the parameters from the message. */ proc_nr = m_ptr->CLOCK_PROC_NR; /* process to interrupt later */ delta_ticks = m_ptr->DELTA_TICKS; /* how many ticks to wait */ rp = proc_addr(proc_nr); mc.SECONDS_LEFT = (rp->p_alarm == 0 ? 0 : (rp->p_alarm-realtime+HZ-1)/HZ); common_setalarm(proc_nr, delta_ticks, cause_alarm); } /*===========================================================================* * common_setalarm * *===========================================================================*/ PRIVATE void common_setalarm(proc_nr, delta_ticks, function) int proc_nr; /* which process wants the alarm */ long delta_ticks; /* in how many clock ticks does he want it? */ watchdog_t function; /* function to call (0 if cause_sig is * to be called */ { /* Finish up work of do_set_alarm and do_setsyn_alrm. Record an alarm * request and check to see if it is the next alarm needed. */ register struct proc *rp; rp = proc_addr(proc_nr); rp->p_alarm = (delta_ticks == 0 ? 0 : realtime + delta_ticks); watch_dog[proc_nr+NR_TASKS] = function; /* Which alarm is next? */ next_alarm = LONG_MAX; for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) if(rp->p_alarm != 0 && rp->p_alarm < next_alarm)next_alarm=rp->p_alarm; } /*===========================================================================* * cause_alarm * *===========================================================================*/ PRIVATE void cause_alarm() { /* Routine called if a timer goes off and the process requested a synchronous * alarm. The process number is in the global variable watchdog_proc (HACK). */ message mess; syn_table[watchdog_proc + NR_TASKS]= TRUE; if (!syn_al_alive) send (SYN_ALRM_TASK, &mess); } /*===========================================================================* * syn_alrm_task * *===========================================================================*/ PUBLIC void syn_alrm_task() { /* Main program of the synchronous alarm task. * This task receives messages only from cause_alarm in the clock task. * It sends a CLOCK_INT message to a process that requested a syn_alrm. * Synchronous alarms are so called because, unlike a signals or the * activation of a watchdog, a synchronous alarm is received by a process * when it is in a known part of its code, that is, when it has issued * a call to receive a message. */ message mess; int work_done; /* ready to sleep ? */ int *al_ptr; /* pointer in syn_table */ int i; syn_al_alive= TRUE; for (i= 0, al_ptr= syn_table; iuser_time, rp->sys_time: * These are protected by explicit locks in system.c. They are * not properly protected in dmp.c (the increment here is not * atomic) but that hardly matters. * pending_ticks: * This is protected by explicit locks in clock.c. Don't * update realtime directly, since there are too many * references to it to guard conveniently. * lost_ticks: * Clock ticks counted outside the clock task. * sched_ticks, prev_ptr: * Updating these competes with similar code in do_clocktick(). * No lock is necessary, because if bad things happen here * (like sched_ticks going negative), the code in do_clocktick() * will restore the variables to reasonable values, and an * occasional missed or extra sched() is harmless. * * Are these complications worth the trouble? Well, they make the system 15% * faster on a 5MHz 8088, and make task debugging much easier since there are * no task switches on an inactive system. */ register struct proc *rp; register unsigned ticks; clock_t now; if (ps_mca) { /* Acknowledge the PS/2 clock interrupt. */ out_byte(PORT_B, in_byte(PORT_B) | CLOCK_ACK_BIT); } /* Update user and system accounting times. * First charge the current process for user time. * If the current process is not the billable process (usually because it * is a task), charge the billable process for system time as well. * Thus the unbillable tasks' user time is the billable users' system time. */ if (k_reenter != 0) rp = proc_addr(HARDWARE); else rp = proc_ptr; ticks = lost_ticks + 1; lost_ticks = 0; rp->user_time += ticks; if (rp != bill_ptr && rp != proc_addr(IDLE)) bill_ptr->sys_time += ticks; pending_ticks += ticks; now = realtime + pending_ticks; if (tty_timeout <= now) tty_wakeup(now); /* possibly wake up TTY */ #if (CHIP == INTEL) && ENABLE_PRINTER pr_restart(); /* possibly restart printer */ #endif #if (CHIP == M68000) kb_timer(); /* keyboard repeat */ if (sched_ticks == 1) fd_timer(); /* floppy deselect */ #endif if (next_alarm <= now || sched_ticks == 1 && bill_ptr == prev_ptr && rdy_head[USER_Q] != NIL_PROC) { interrupt(CLOCK); return 1; /* Reenable interrupts */ } if (--sched_ticks == 0) { /* If bill_ptr == prev_ptr, no ready users so don't need sched(). */ sched_ticks = SCHED_RATE; /* reset quantum */ prev_ptr = bill_ptr; /* new previous process */ } return 1; /* Reenable clock interrupt */ } #if (CHIP == INTEL) /*===========================================================================* * init_clock * *===========================================================================*/ PRIVATE void init_clock() { /* Initialize channel 0 of the 8253A timer to e.g. 60 Hz. */ out_byte(TIMER_MODE, SQUARE_WAVE); /* set timer to run continuously */ out_byte(TIMER0, TIMER_COUNT); /* load timer low byte */ out_byte(TIMER0, TIMER_COUNT >> 8); /* load timer high byte */ put_irq_handler(CLOCK_IRQ, clock_handler); /* set the interrupt handler */ enable_irq(CLOCK_IRQ); /* ready for clock interrupts */ } /*===========================================================================* * clock_stop * *===========================================================================*/ PUBLIC void clock_stop() { /* Reset the clock to the BIOS rate. (For rebooting) */ out_byte(TIMER_MODE, 0x36); out_byte(TIMER0, 0); out_byte(TIMER0, 0); } /*==========================================================================* * milli_delay * *==========================================================================*/ PUBLIC void milli_delay(millisec) unsigned millisec; { /* Delay some milliseconds. */ struct milli_state ms; milli_start(&ms); while (milli_elapsed(&ms) < millisec) {} } /*==========================================================================* * milli_start * *==========================================================================*/ PUBLIC void milli_start(msp) struct milli_state *msp; { /* Prepare for calls to milli_elapsed(). */ msp->prev_count = 0; msp->accum_count = 0; } /*==========================================================================* * milli_elapsed * *==========================================================================*/ PUBLIC unsigned milli_elapsed(msp) struct milli_state *msp; { /* Return the number of milliseconds since the call to milli_start(). Must be * polled rapidly. */ unsigned count; /* Read the counter for channel 0 of the 8253A timer. The counter * decrements at twice the timer frequency (one full cycle for each * half of square wave). The counter normally has a value between 0 * and TIMER_COUNT, but before the clock task has been initialized, * its maximum value is 65535, as set by the BIOS. */ out_byte(TIMER_MODE, LATCH_COUNT); /* make chip copy count to latch */ count = in_byte(TIMER0); /* countdown continues during 2-step read */ count |= in_byte(TIMER0) << 8; /* Add difference between previous and new count unless the counter has * increased (restarted its cycle). We may lose a tick now and then, but * microsecond precision is not needed. */ msp->accum_count += count <= msp->prev_count ? (msp->prev_count - count) : 1; msp->prev_count = count; return msp->accum_count / (TIMER_FREQ / 1000); } #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) #include "staddr.h" #include "stmfp.h" /*===========================================================================* * init_clock * *===========================================================================*/ PRIVATE void init_clock() { /* Initialize the timer C in the MFP 68901. * Reducing to HZ is not possible by hardware. The resulting interrupt * rate is further reduced by software with a factor of 4. * Note that the expression below works for both HZ=50 and HZ=60. */ do { MFP->mf_tcdr = TIMER_FREQ/(64*4*HZ); } while ((MFP->mf_tcdr & 0xFF) != TIMER_FREQ/(64*4*HZ)); MFP->mf_tcdcr |= (T_Q064<<4); } #endif /* (CHIP == M68000) */ /* Code and data for the IBM console driver. * * The 6845 video controller used by the IBM PC shares its video memory with * the CPU somewhere in the 0xB0000 memory bank. To the 6845 this memory * consists of 16-bit words. Each word has a character code in the low byte * and a so-called attribute byte in the high byte. The CPU directly modifies * video memory to display characters, and sets two registers on the 6845 that * specify the video origin and the cursor position. The video origin is the * place in video memory where the first character (upper left corner) can * be found. Moving the origin is a fast way to scroll the screen. Some * video adapters wrap around the top of video memory, so the origin can * move without bounds. For other adapters screen memory must sometimes be * moved to reset the origin. All computations on video memory use character * (word) addresses for simplicity and assume there is no wrapping. The * assembly support functions translate the word addresses to byte addresses * and the scrolling function worries about wrapping. */ #include "kernel.h" #include #include #include #include "protect.h" #include "tty.h" #include "proc.h" /* Definitions used by the console driver. */ #define MONO_BASE 0xB0000L /* base of mono video memory */ #define COLOR_BASE 0xB8000L /* base of color video memory */ #define MONO_SIZE 0x1000 /* 4K mono video memory */ #define COLOR_SIZE 0x4000 /* 16K color video memory */ #define EGA_SIZE 0x8000 /* EGA & VGA have at least 32K */ #define BLANK_COLOR 0x0700 /* determines cursor color on blank screen */ #define SCROLL_UP 0 /* scroll forward */ #define SCROLL_DOWN 1 /* scroll backward */ #define BLANK_MEM ((u16_t *) 0) /* tells mem_vid_copy() to blank the screen */ #define CONS_RAM_WORDS 80 /* video ram buffer size */ #define MAX_ESC_PARMS 4 /* number of escape sequence params allowed */ /* Constants relating to the controller chips. */ #define M_6845 0x3B4 /* port for 6845 mono */ #define C_6845 0x3D4 /* port for 6845 color */ #define EGA 0x3C4 /* port for EGA card */ #define INDEX 0 /* 6845's index register */ #define DATA 1 /* 6845's data register */ #define VID_ORG 12 /* 6845's origin register */ #define CURSOR 14 /* 6845's cursor register */ /* Beeper. */ #define BEEP_FREQ 0x0533 /* value to put into timer to set beep freq */ #define B_TIME 3 /* length of CTRL-G beep is ticks */ /* definitions used for font management */ #define GA_SEQUENCER_INDEX 0x3C4 #define GA_SEQUENCER_DATA 0x3C5 #define GA_GRAPHICS_INDEX 0x3CE #define GA_GRAPHICS_DATA 0x3CF #define GA_VIDEO_ADDRESS 0xA0000L #define GA_FONT_SIZE 8192 /* Global variables used by the console driver and assembly support. */ PUBLIC u16_t vid_seg; PUBLIC vir_bytes vid_off; /* video ram is found at vid_seg:vid_off */ PUBLIC unsigned vid_size; /* 0x2000 for color or 0x0800 for mono */ PUBLIC unsigned vid_mask; /* 0x1FFF for color or 0x07FF for mono */ PUBLIC unsigned blank_color = BLANK_COLOR; /* display code for blank */ /* Private variables used by the console driver. */ PRIVATE int vid_port; /* I/O port for accessing 6845 */ PRIVATE int wrap; /* hardware can wrap? */ PRIVATE int softscroll; /* 1 = software scrolling, 0 = hardware */ PRIVATE int beeping; /* speaker is beeping? */ PRIVATE unsigned font_lines; /* font lines per character */ PRIVATE unsigned scr_width; /* # characters on a line */ PRIVATE unsigned scr_lines; /* # lines on the screen */ PRIVATE unsigned scr_size; /* # characters on the screen */ /* Per console data. */ typedef struct console { tty_t *c_tty; /* associated TTY struct */ int c_column; /* current column number (0-origin) */ int c_row; /* current row (0 at top of screen) */ int c_rwords; /* number of WORDS (not bytes) in outqueue */ unsigned c_start; /* start of video memory of this console */ unsigned c_limit; /* limit of this console's video memory */ unsigned c_org; /* location in RAM where 6845 base points */ unsigned c_cur; /* current position of cursor in video RAM */ unsigned c_attr; /* character attribute */ unsigned c_blank; /* blank attribute */ char c_reverse; /* reverse video */ char c_esc_state; /* 0=normal, 1=ESC, 2=ESC[ */ char c_esc_intro; /* Distinguishing character following ESC */ int *c_esc_parmp; /* pointer to current escape parameter */ int c_esc_parmv[MAX_ESC_PARMS]; /* list of escape parameters */ u16_t c_ramqueue[CONS_RAM_WORDS]; /* buffer for video RAM */ } console_t; PRIVATE int nr_cons= 1; /* actual number of consoles */ PRIVATE console_t cons_table[NR_CONS]; PRIVATE console_t *curcons; /* currently visible */ /* Color if using a color controller. */ #define color (vid_port == C_6845) /* Map from ANSI colors to the attributes used by the PC */ PRIVATE int ansi_colors[8] = {0, 4, 2, 6, 1, 5, 3, 7}; /* Structure used for font management */ struct sequence { unsigned short index; unsigned char port; unsigned char value; }; FORWARD _PROTOTYPE( void cons_write, (struct tty *tp) ); FORWARD _PROTOTYPE( void cons_echo, (tty_t *tp, int c) ); FORWARD _PROTOTYPE( void out_char, (console_t *cons, int c) ); FORWARD _PROTOTYPE( void beep, (void) ); FORWARD _PROTOTYPE( void do_escape, (console_t *cons, int c) ); FORWARD _PROTOTYPE( void flush, (console_t *cons) ); FORWARD _PROTOTYPE( void parse_escape, (console_t *cons, int c) ); FORWARD _PROTOTYPE( void scroll_screen, (console_t *cons, int dir) ); FORWARD _PROTOTYPE( void set_6845, (int reg, unsigned val) ); FORWARD _PROTOTYPE( void stop_beep, (void) ); FORWARD _PROTOTYPE( void cons_org0, (void) ); FORWARD _PROTOTYPE( void ga_program, (struct sequence *seq) ); FORWARD _PROTOTYPE( void cons_ioctl, (tty_t *tp) ); /*===========================================================================* * cons_write * *===========================================================================*/ PRIVATE void cons_write(tp) register struct tty *tp; /* tells which terminal is to be used */ { /* Copy as much data as possible to the output queue, then start I/O. On * memory-mapped terminals, such as the IBM console, the I/O will also be * finished, and the counts updated. Keep repeating until all I/O done. */ int count; register char *tbuf; char buf[64]; phys_bytes user_phys; console_t *cons = tp->tty_priv; /* Check quickly for nothing to do, so this can be called often without * unmodular tests elsewhere. */ if ((count = tp->tty_outleft) == 0 || tp->tty_inhibited) return; /* Copy the user bytes to buf[] for decent addressing. Loop over the * copies, since the user buffer may be much larger than buf[]. */ do { if (count > sizeof(buf)) count = sizeof(buf); user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir); phys_copy(user_phys, vir2phys(buf), (phys_bytes) count); tbuf = buf; /* Update terminal data structure. */ tp->tty_out_vir += count; tp->tty_outcum += count; tp->tty_outleft -= count; /* Output each byte of the copy to the screen. Avoid calling * out_char() for the "easy" characters, put them into the buffer * directly. */ do { if ((unsigned) *tbuf < ' ' || cons->c_esc_state > 0 || cons->c_column >= scr_width || cons->c_rwords >= buflen(cons->c_ramqueue)) { out_char(cons, *tbuf++); } else { cons->c_ramqueue[cons->c_rwords++] = cons->c_attr | (*tbuf++ & BYTE); cons->c_column++; } } while (--count != 0); } while ((count = tp->tty_outleft) != 0 && !tp->tty_inhibited); flush(cons); /* transfer anything buffered to the screen */ /* Reply to the writer if all output is finished. */ if (tp->tty_outleft == 0) { tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, tp->tty_outcum); tp->tty_outcum = 0; } } /*===========================================================================* * cons_echo * *===========================================================================*/ PRIVATE void cons_echo(tp, c) register tty_t *t**+++++++++ + + + + ++++++++p; /* pointer to tty struct */ int c; /* character to be echoed */ { /* Echo keyboard input (print & flush). */ console_t *cons = tp->tty_priv; out_char(cons, c); flush(cons); } /*===========================================================================* * out_char * *===========================================================================*/ PRIVATE void out_char(cons, c) register console_t *cons; /* pointer to console struct */ int c; /* character to be output */ { /* Output a character on the console. Check for escape sequences first. */ if (cons->c_esc_state > 0) { parse_escape(cons, c); return; } switch(c) { case 000: /* null is typically used for padding */ return; /* better not do anything */ case 007: /* ring the bell */ flush(cons); /* print any chars queued for output */ beep(); return; case '\b': /* backspace */ if (--cons->c_column < 0) { if (--cons->c_row >= 0) cons->c_column += scr_width; } flush(cons); return; case '\n': /* line feed */ if ((cons->c_tty->tty_termios.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) { cons->c_column = 0; } /*FALL THROUGH*/ case 013: /* CTRL-K */ case 014: /* CTRL-L */ if (cons->c_row == scr_lines-1) { scroll_screen(cons, SCROLL_UP); } else { cons->c_row++; } flush(cons); return; case '\r': /* carriage return */ cons->c_column = 0; flush(cons); return; case '\t': /* tab */ cons->c_column = (cons->c_column + TAB_SIZE) & ~TAB_MASK; if (cons->c_column > scr_width) { cons->c_column -= scr_width; if (cons->c_row == scr_lines-1) { scroll_screen(cons, SCROLL_UP); } else { cons->c_row++; } } flush(cons); return; case 033: /* ESC - start of an escape sequence */ flush(cons); /* print any chars queued for output */ cons->c_esc_state = 1; /* mark ESC as seen */ return; default: /* printable chars are stored in ramqueue */ if (cons->c_column >= scr_width) { if (!LINEWRAP) return; if (cons->c_row == scr_lines-1) { scroll_screen(cons, SCROLL_UP); } else { cons->c_row++; } cons->c_column = 0; flush(cons); } if (cons->c_rwords == buflen(cons->c_ramqueue)) flush(cons); cons->c_ramqueue[cons->c_rwords++] = cons->c_attr | (c & BYTE); cons->c_column++; /* next column */ return; } } /*===========================================================================* * scroll_screen * *===========================================================================*/ PRIVATE void scroll_screen(cons, dir) register console_t *cons; /* pointer to console struct */ int dir; /* SCROLL_UP or SCROLL_DOWN */ { unsigned new_line, new_org, chars; flush(cons); chars = scr_size - scr_width; /* one screen minus one line */ /* Scrolling the screen is a real nuisance due to the various incompatible * video cards. This driver supports software scrolling (Hercules?), * hardware scrolling (mono and CGA cards) and hardware scrolling without * wrapping (EGA cards). In the latter case we must make sure that * c_start <= c_org && c_org + scr_size <= c_limit * holds, because EGA doesn't wrap around the end of video memory. */ if (dir == SCROLL_UP) { /* Scroll one line up in 3 ways: soft, avoid wrap, use origin. */ if (softscroll) { vid_vid_copy(cons->c_start + scr_width, cons->c_start, chars); } else if (!wrap && cons->c_org + scr_size + scr_width >= cons->c_limit) { vid_vid_copy(cons->c_org + scr_width, cons->c_start, chars); cons->c_org = cons->c_start; } else { cons->c_org = (cons->c_org + scr_width) & vid_mask; } new_line = (cons->c_org + chars) & vid_mask; } else { /* Scroll one line down in 3 ways: soft, avoid wrap, use origin. */ if (softscroll) { vid_vid_copy(cons->c_start, cons->c_start + scr_width, chars); } else if (!wrap && cons->c_org < cons->c_start + scr_width) { new_org = cons->c_limit - scr_size; vid_vid_copy(cons->c_org, new_org + scr_width, chars); cons->c_org = new_org; } else { cons->c_org = (cons->c_org - scr_width) & vid_mask; } new_line = cons->c_org; } /* Blank the new line at top or bottom. */ blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, new_line, scr_width); /* Set the new video origin. */ if (cons == curcons) set_6845(VID_ORG, cons->c_org); flush(cons); } /*===========================================================================* * flush * *===========================================================================*/ PRIVATE void flush(cons) register console_t *cons; /* pointer to console struct */ { /* Send characters buffered in 'ramqueue' to screen memory, check the new * cursor position, compute the new hardware cursor position and set it. */ unsigned cur; tty_t *tp = cons->c_tty; /* Have the characters in 'ramqueue' transferred to the screen. */ if (cons->c_rwords > 0) { mem_vid_copy(cons->c_ramqueue, cons->c_cur, cons->c_rwords); cons->c_rwords = 0; /* TTY likes to know the current column and if echoing messed up. */ tp->tty_position = cons->c_column; tp->tty_reprint = TRUE; } /* Check and update the cursor position. */ if (cons->c_column < 0) cons->c_column = 0; if (cons->c_column > scr_width) cons->c_column = scr_width; if (cons->c_row < 0) cons->c_row = 0; if (cons->c_row >= scr_lines) cons->c_row = scr_lines - 1; cur = cons->c_org + cons->c_row * scr_width + cons->c_column; if (cur != cons->c_cur) { if (cons == curcons) set_6845(CURSOR, cur); cons->c_cur = cur; } } /*===========================================================================* * parse_escape * *===========================================================================*/ PRIVATE void parse_escape(cons, c) register console_t *cons; /* pointer to console struct */ char c; /* next character in escape sequence */ { /* The following ANSI escape sequences are currently supported. * If n and/or m are omitted, they default to 1. * ESC [nA moves up n lines * ESC [nB moves down n lines * ESC [nC moves right n spaces * ESC [nD moves left n spaces * ESC [m;nH" moves cursor to (m,n) * ESC [J clears screen from cursor * ESC [K clears line from cursor * ESC [nL inserts n lines ar cursor * ESC [nM deletes n lines at cursor * ESC [nP deletes n chars at cursor * ESC [n@ inserts n chars at cursor * ESC [nm enables rendition n (0=normal, 4=bold, 5=blinking, 7=reverse) * ESC M scrolls the screen backwards if the cursor is on the top line */ switch (cons->c_esc_state) { case 1: /* ESC seen */ cons->c_esc_intro = '\0'; cons->c_esc_parmp = bufend(cons->c_esc_parmv); do { *--cons->c_esc_parmp = 0; } while (cons->c_esc_parmp > cons->c_esc_parmv); switch (c) { case '[': /* Control Sequence Introducer */ cons->c_esc_intro = c; cons->c_esc_state = 2; break; case 'M': /* Reverse Index */ do_escape(cons, c); break; default: cons->c_esc_state = 0; } break; case 2: /* ESC [ seen */ if (c >= '0' && c <= '9') { if (cons->c_esc_parmp < bufend(cons->c_esc_parmv)) *cons->c_esc_parmp = *cons->c_esc_parmp * 10 + (c-'0'); } else if (c == ';') { if (cons->c_esc_parmp < bufend(cons->c_esc_parmv)) cons->c_esc_parmp++; } else { do_escape(cons, c); } break; } } /*===========================================================================* * do_escape * *===========================================================================*/ PRIVATE void do_escape(cons, c) register console_t *cons; /* pointer to console struct */ char c; /* next character in escape sequence */ { int value, n; unsigned src, dst, count; int *parmp; /* Some of these things hack on screen RAM, so it had better be up to date */ flush(cons); if (cons->c_esc_intro == '\0') { /* Handle a sequence beginning with just ESC */ switch (c) { case 'M': /* Reverse Index */ if (cons->c_row == 0) { scroll_screen(cons, SCROLL_DOWN); } else { cons->c_row--; } flush(cons); break; default: break; } } else if (cons->c_esc_intro == '[') { /* Handle a sequence beginning with ESC [ and parameters */ value = cons->c_esc_parmv[0]; switch (c) { case 'A': /* ESC [nA moves up n lines */ n = (value == 0 ? 1 : value); cons->c_row -= n; flush(cons); break; case 'B': /* ESC [nB moves down n lines */ n = (value == 0 ? 1 : value); cons->c_row += n; flush(cons); break; case 'C': /* ESC [nC moves right n spaces */ n = (value == 0 ? 1 : value); cons->c_column += n; flush(cons); break; case 'D': /* ESC [nD moves left n spaces */ n = (value == 0 ? 1 : value); cons->c_column -= n; flush(cons); break; case 'H': /* ESC [m;nH" moves cursor to (m,n) */ cons->c_row = cons->c_esc_parmv[0] - 1; cons->c_column = cons->c_esc_parmv[1] - 1; flush(cons); break; case 'J': /* ESC [sJ clears in display */ switch (value) { case 0: /* Clear from cursor to end of screen */ count = scr_size - (cons->c_cur - cons->c_org); dst = cons->c_cur; break; case 1: /* Clear from start of screen to cursor */ count = cons->c_cur - cons->c_org; dst = cons->c_org; break; case 2: /* Clear entire screen */ count = scr_size; dst = cons->c_org; break; default: /* Do nothing */ count = 0; dst = cons->c_org; } blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, dst, count); break; case 'K': /* ESC [sK clears line from cursor */ switch (value) { case 0: /* Clear from cursor to end of line */ count = scr_width - cons->c_column; dst = cons->c_cur; break; case 1: /* Clear from beginning of line to cursor */ count = cons->c_column; dst = cons->c_cur - cons->c_column; break; case 2: /* Clear entire line */ count = scr_width; dst = cons->c_cur - cons->c_column; break; default: /* Do nothing */ count = 0; dst = cons->c_cur; } blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, dst, count); break; case 'L': /* ESC [nL inserts n lines at cursor */ n = value; if (n < 1) n = 1; if (n > (scr_lines - cons->c_row)) n = scr_lines - cons->c_row; src = cons->c_org + cons->c_row * scr_width; dst = src + n * scr_width; count = (scr_lines - cons->c_row - n) * scr_width; vid_vid_copy(src, dst, count); blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, src, n * scr_width); break; case 'M': /* ESC [nM deletes n lines at cursor */ n = value; if (n < 1) n = 1; if (n > (scr_lines - cons->c_row)) n = scr_lines - cons->c_row; dst = cons->c_org + cons->c_row * scr_width; src = dst + n * scr_width; count = (scr_lines - cons->c_row - n) * scr_width; vid_vid_copy(src, dst, count); blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, dst + count, n * scr_width); break; case '@': /* ESC [n@ inserts n chars at cursor */ n = value; if (n < 1) n = 1; if (n > (scr_width - cons->c_column)) n = scr_width - cons->c_column; src = cons->c_cur; dst = src + n; count = scr_width - cons->c_column - n; vid_vid_copy(src, dst, count); blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, src, n); break; case 'P': /* ESC [nP deletes n chars at cursor */ n = value; if (n < 1) n = 1; if (n > (scr_width - cons->c_column)) n = scr_width - cons->c_column; dst = cons->c_cur; src = dst + n; count = scr_width - cons->c_column - n; vid_vid_copy(src, dst, count); blank_color = cons->c_blank; mem_vid_copy(BLANK_MEM, dst + count, n); break; case 'm': /* ESC [nm enables rendition n */ for (parmp = cons->c_esc_parmv; parmp <= cons->c_esc_parmp && parmp < bufend(cons->c_esc_parmv); parmp++) { if (cons->c_reverse) { /* Unswap fg and bg colors */ cons->c_attr = ((cons->c_attr & 0x7000) >> 4) | ((cons->c_attr & 0x0700) << 4) | ((cons->c_attr & 0x8800)); } switch (n = *parmp) { case 0: /* NORMAL */ cons->c_attr = cons->c_blank = BLANK_COLOR; cons->c_reverse = FALSE; break; case 1: /* BOLD */ /* Set intensity bit */ cons->c_attr |= 0x0800; break; case 4: /* UNDERLINE */ if (color) { /* Change white to cyan, i.e. lose red */ cons->c_attr = (cons->c_attr & 0xBBFF); } else { /* Set underline attribute */ cons->c_attr = (cons->c_attr & 0x99FF); } break; case 5: /* BLINKING */ /* Set the blink bit */ cons->c_attr |= 0x8000; break; case 7: /* REVERSE */ cons->c_reverse = TRUE; break; default: /* COLOR */ if (n == 39) n = 37; /* set default color */ if (n == 49) n = 40; if (!color) { /* Don't mess up a monochrome screen */ } else if (30 <= n && n <= 37) { /* Foreground color */ cons->c_attr = (cons->c_attr & 0xF8FF) | (ansi_colors[(n - 30)] << 8); cons->c_blank = (cons->c_blank & 0xF8FF) | (ansi_colors[(n - 30)] << 8); } else if (40 <= n && n <= 47) { /* Background color */ cons->c_attr = (cons->c_attr & 0x8FFF) | (ansi_colors[(n - 40)] << 12); cons->c_blank = (cons->c_blank & 0x8FFF) | (ansi_colors[(n - 40)] << 12); } } if (cons->c_reverse) { /* Swap fg and bg colors */ cons->c_attr = ((cons->c_attr & 0x7000) >> 4) | ((cons->c_attr & 0x0700) << 4) | ((cons->c_attr & 0x8800)); } } break; } } cons->c_esc_state = 0; } /*===========================================================================* * set_6845 * *===========================================================================*/ PRIVATE void set_6845(reg, val) int reg; /* which register pair to set */ unsigned val; /* 16-bit value to set it to */ { /* Set a register pair inside the 6845. * Registers 12-13 tell the 6845 where in video ram to start * Registers 14-15 tell the 6845 where to put the cursor */ lock(); /* try to stop h/w loading in-between value */ out_byte(vid_port + INDEX, reg); /* set the index register */ out_byte(vid_port + DATA, (val>>8) & BYTE); /* output high byte */ out_byte(vid_port + INDEX, reg + 1); /* again */ out_byte(vid_port + DATA, val&BYTE); /* output low byte */ unlock(); } /*===========================================================================* * beep * *===========================================================================*/ PRIVATE void beep() { /* Making a beeping sound on the speaker (output for CRTL-G). * This routine works by turning on the bits 0 and 1 in port B of the 8255 * chip that drive the speaker. */ message mess; if (beeping) return; out_byte(TIMER_MODE, 0xB6); /* set up timer channel 2 (square wave) */ out_byte(TIMER2, BEEP_FREQ & BYTE); /* load low-order bits of frequency */ out_byte(TIMER2, (BEEP_FREQ >> 8) & BYTE); /* now high-order bits */ lock(); /* guard PORT_B from keyboard intr handler */ out_byte(PORT_B, in_byte(PORT_B) | 3); /* turn on beep bits */ unlock(); beeping = TRUE; mess.m_type = SET_ALARM; mess.CLOCK_PROC_NR = TTY; mess.DELTA_TICKS = B_TIME; mess.FUNC_TO_CALL = (sighandler_t) stop_beep; sendrec(CLOCK, &mess); } /*===========================================================================* * stop_beep * *===========================================================================*/ PRIVATE void stop_beep() { /* Turn off the beeper by turning off bits 0 and 1 in PORT_B. */ lock(); /* guard PORT_B from keyboard intr handler */ out_byte(PORT_B, in_byte(PORT_B) & ~3); beeping = FALSE; unlock(); } /*===========================================================================* * scr_init * *===========================================================================*/ PUBLIC void scr_init(tp) tty_t *tp; { /* Initialize the screen driver. */ console_t *cons; phys_bytes vid_base; u16_t bios_columns, bios_crtbase, bios_fontlines; u8_t bios_rows; int line; unsigned page_size; /* Associate console and TTY. */ line = tp - &tty_table[0]; if (line >= nr_cons) return; cons = &cons_table[line]; cons->c_tty = tp; tp->tty_priv = cons; /* Initialize the keyboard driver. */ kb_init(tp); /* Fill in TTY function hooks. */ tp->tty_devwrite = cons_write; tp->tty_echo = cons_echo; tp->tty_ioctl = cons_ioctl; /* Get the BIOS parameters that describe the VDU. */ phys_copy(0x44AL, vir2phys(&bios_columns), 2L); phys_copy(0x463L, vir2phys(&bios_crtbase), 2L); phys_copy(0x484L, vir2phys(&bios_rows), 1L); phys_copy(0x485L, vir2phys(&bios_fontlines), 2L); vid_port = bios_crtbase; scr_width = bios_columns; font_lines = bios_fontlines; scr_lines = ega ? bios_rows+1 : 25; if (color) { vid_base = COLOR_BASE; vid_size = COLOR_SIZE; } else { vid_base = MONO_BASE; vid_size = MONO_SIZE; } if (ega) vid_size = EGA_SIZE; wrap = !ega; phys2seg(&vid_seg, &vid_off, vid_base); vid_size >>= 1; /* word count */ vid_mask = vid_size - 1; /* Size of the screen (number of displayed characters.) */ scr_size = scr_lines * scr_width; /* There can be as many consoles as video memory allows. */ nr_cons = vid_size / scr_size; if (nr_cons > NR_CONS) nr_cons = NR_CONS; if (nr_cons > 1) wrap = 0; page_size = vid_size / nr_cons; cons->c_start = line * page_size; cons->c_limit = cons->c_start + page_size; cons->c_cur = cons->c_org = cons->c_start; cons->c_attr = cons->c_blank = BLANK_COLOR; /* Clear the screen. */ blank_color = BLANK_COLOR; mem_vid_copy(BLANK_MEM, cons->c_start, scr_size); select_console(0); cons_ioctl(tp); } /*===========================================================================* * putk * *===========================================================================*/ PUBLIC void putk(c) int c; /* character to print */ { /* This procedure is used by the version of printf() that is linked with * the kernel itself. The one in the library sends a message to FS, which is * not what is needed for printing within the kernel. This version just queues * the character and starts the output. */ if (c != 0) { if (c == '\n') putk('\r'); out_char(&cons_table[0], (int) c); } else { flush(&cons_table[0]); } } /*===========================================================================* * toggle_scroll * *===========================================================================*/ PUBLIC void toggle_scroll() { /* Toggle between hardware and software scroll. */ cons_org0(); softscroll = !softscroll; printf("%sware scrolling enabled.\n", softscroll ? "Soft" : "Hard"); } /*===========================================================================* * cons_stop * *===========================================================================*/ PUBLIC void cons_stop() { /* Prepare for halt or reboot. */ cons_org0(); softscroll = 1; select_console(0); cons_table[0].c_attr = cons_table[0].c_blank = BLANK_COLOR; } /*===========================================================================* * cons_org0 * *===========================================================================*/ PRIVATE void cons_org0() { /* Scroll video memory back to put the origin at 0. */ int cons_line; console_t *cons; unsigned n; for (cons_line = 0; cons_line < nr_cons; cons_line++) { cons = &cons_table[cons_line]; while (cons->c_org > cons->c_start) { n = vid_size - scr_size; /* amount of unused memory */ if (n > cons->c_org - cons->c_start) n = cons->c_org - cons->c_start; vid_vid_copy(cons->c_org, cons->c_org - n, scr_size); cons->c_org -= n; } flush(cons); } select_console(current); } /*===========================================================================* * select_console * *===========================================================================*/ PUBLIC void select_console(int cons_line) { /* Set the current console to console number 'cons_line'. */ if (cons_line < 0 || cons_line >= nr_cons) return; current = cons_line; curcons = &cons_table[cons_line]; set_6845(VID_ORG, curcons->c_org); set_6845(CURSOR, curcons->c_cur); } /*===========================================================================* * con_loadfont * *===========================================================================*/ PUBLIC int con_loadfont(user_phys) phys_bytes user_phys; { /* Load a font into the EGA or VGA adapter. */ static struct sequence seq1[7] = { { GA_SEQUENCER_INDEX, 0x00, 0x01 }, { GA_SEQUENCER_INDEX, 0x02, 0x04 }, { GA_SEQUENCER_INDEX, 0x04, 0x07 }, { GA_SEQUENCER_INDEX, 0x00, 0x03 }, { GA_GRAPHICS_INDEX, 0x04, 0x02 }, { GA_GRAPHICS_INDEX, 0x05, 0x00 }, { GA_GRAPHICS_INDEX, 0x06, 0x00 }, }; static struct sequence seq2[7] = { { GA_SEQUENCER_INDEX, 0x00, 0x01 }, { GA_SEQUENCER_INDEX, 0x02, 0x03 }, { GA_SEQUENCER_INDEX, 0x04, 0x03 }, { GA_SEQUENCER_INDEX, 0x00, 0x03 }, { GA_GRAPHICS_INDEX, 0x04, 0x00 }, { GA_GRAPHICS_INDEX, 0x05, 0x10 }, { GA_GRAPHICS_INDEX, 0x06, 0 }, }; seq2[6].value= color ? 0x0E : 0x0A; if (!ega) return(ENOTTY); lock(); ga_program(seq1); /* bring font memory into view */ phys_copy(user_phys, (phys_bytes)GA_VIDEO_ADDRESS, (phys_bytes)GA_FONT_SIZE); ga_program(seq2); /* restore */ unlock(); return(OK); } /*===========================================================================* * ga_program * *===========================================================================*/ PRIVATE void ga_program(seq) struct sequence *seq; { int len= 7; do { out_byte(seq->index, seq->port); out_byte(seq->index+1, seq->value); seq++; } while (--len > 0); } /*===========================================================================* * cons_ioctl * *===========================================================================*/ PRIVATE void cons_ioctl(tp) tty_t *tp; { /* Set the screen dimensions. */ tp->tty_winsize.ws_row= scr_lines; tp->tty_winsize.ws_col= scr_width; tp->tty_winsize.ws_xpixel= scr_width * 8; tp->tty_winsize.ws_ypixel= scr_lines * font_lines; } /* General constants used by the kernel. */ #if (CHIP == INTEL) #define K_STACK_BYTES 1024 /* how many bytes for the kernel stack */ #define INIT_PSW 0x0200 /* initial psw */ #define INIT_TASK_PSW 0x1200 /* initial psw for tasks (with IOPL 1) */ #define TRACEBIT 0x100 /* OR this with psw in proc[] for tracing */ #define SETPSW(rp, new) /* permits only certain bits to be set */ \ ((rp)->p_reg.psw = (rp)->p_reg.psw & ~0xCD5 | (new) & 0xCD5) /* Initial sp for mm, fs and init. * 2 bytes for short jump * 2 bytes unused * 3 words for init_org[] used by fs only * 3 words for real mode debugger trap (actually needs 1 more) * 3 words for save and restart temporaries * 3 words for interrupt * Leave no margin, to flush bugs early. */ #define INIT_SP (2 + 2 + 3 * 2 + 3 * 2 + 3 * 2 + 3 * 2) #define HCLICK_SHIFT 4 /* log2 of HCLICK_SIZE */ #define HCLICK_SIZE 16 /* hardware segment conversion magic */ #if CLICK_SIZE >= HCLICK_SIZE #define click_to_hclick(n) ((n) << (CLICK_SHIFT - HCLICK_SHIFT)) #else #define click_to_hclick(n) ((n) >> (HCLICK_SHIFT - CLICK_SHIFT)) #endif #define hclick_to_physb(n) ((phys_bytes) (n) << HCLICK_SHIFT) #define physb_to_hclick(n) ((n) >> HCLICK_SHIFT) /* Interrupt vectors defined/reserved by processor. */ #define DIVIDE_VECTOR 0 /* divide error */ #define DEBUG_VECTOR 1 /* single step (trace) */ #define NMI_VECTOR 2 /* non-maskable interrupt */ #define BREAKPOINT_VECTOR 3 /* software breakpoint */ #define OVERFLOW_VECTOR 4 /* from INTO */ /* Fixed system call vector. */ #define SYS_VECTOR 32 /* system calls are made with int SYSVEC */ #define SYS386_VECTOR 33 /* except 386 system calls use this */ #define LEVEL0_VECTOR 34 /* for execution of a function at level 0 */ /* Suitable irq bases for hardware interrupts. Reprogram the 8259(s) from * the PC BIOS defaults since the BIOS doesn't respect all the processor's * reserved vectors (0 to 31). */ #define BIOS_IRQ0_VEC 0x08 /* base of IRQ0-7 vectors used by BIOS */ #define BIOS_IRQ8_VEC 0x70 /* base of IRQ8-15 vectors used by BIOS */ #define IRQ0_VECTOR 0x50 /* nice vectors to relocate IRQ0-7 to */ #define IRQ8_VECTOR 0x70 /* no need to move IRQ8-15 */ /* Hardware interrupt numbers. */ #define NR_IRQ_VECTORS 16 #define CLOCK_IRQ 0 #define KEYBOARD_IRQ 1 #define CASCADE_IRQ 2 /* cascade enable for 2nd AT controller */ #define ETHER_IRQ 3 /* default ethernet interrupt vector */ #define SECONDARY_IRQ 3 /* RS232 interrupt vector for port 2 */ #define RS232_IRQ 4 /* RS232 interrupt vector for port 1 */ #define XT_WINI_IRQ 5 /* xt winchester */ #define FLOPPY_IRQ 6 /* floppy disk */ #define PRINTER_IRQ 7 #define AT_WINI_IRQ 14 /* at winchester */ /* Interrupt number to hardware vector. */ #define BIOS_VECTOR(irq) \ (((irq) < 8 ? BIOS_IRQ0_VEC : BIOS_IRQ8_VEC) + ((irq) & 0x07)) #define VECTOR(irq) \ (((irq) < 8 ? IRQ0_VECTOR : IRQ8_VECTOR) + ((irq) & 0x07)) /* BIOS hard disk parameter vectors. */ #define WINI_0_PARM_VEC 0x41 #define WINI_1_PARM_VEC 0x46 /* 8259A interrupt controller ports. */ #define INT_CTL 0x20 /* I/O port for interrupt controller */ #define INT_CTLMASK 0x21 /* setting bits in this port disables ints */ #define INT2_CTL 0xA0 /* I/O port for second interrupt controller */ #define INT2_CTLMASK 0xA1 /* setting bits in this port disables ints */ /* Magic numbers for interrupt controller. */ #define ENABLE 0x20 /* code used to re-enable after an interrupt */ /* Sizes of memory tables. */ #define NR_MEMS 8 /* number of chunks of memory */ /* Miscellaneous ports. */ #define PCR 0x65 /* Planar Control Register */ #define PORT_B 0x61 /* I/O port for 8255 port B (kbd, beeper...) */ #define TIMER0 0x40 /* I/O port for timer channel 0 */ #define TIMER2 0x42 /* I/O port for timer channel 2 */ #define TIMER_MODE 0x43 /* I/O port for timer mode control */ #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) #define K_STACK_BYTES 1024 /* how many bytes for the kernel stack */ /* Sizes of memory tables. */ #define NR_MEMS 2 /* number of chunks of memory */ /* p_reg contains: d0-d7, a0-a6, in that order. */ #define NR_REGS 15 /* number of general regs in each proc slot */ #define TRACEBIT 0x8000 /* or this with psw in proc[] for tracing */ #define SETPSW(rp, new) /* permits only certain bits to be set */ \ ((rp)->p_reg.psw = (rp)->p_reg.psw & ~0xFF | (new) & 0xFF) #define MEM_BYTES 0xffffffff /* memory size for /dev/mem */ #ifdef __ACK__ #define FSTRUCOPY #endif #endif /* (CHIP == M68000) */ /* The following items pertain to the scheduling queues. */ #define TASK_Q 0 /* ready tasks are scheduled via queue 0 */ #define SERVER_Q 1 /* ready servers are scheduled via queue 1 */ #define USER_Q 2 /* ready users are scheduled via queue 2 */ #define NQ 3 /* # of scheduling queues */ /* Env_parse() return values. */ #define EP_UNSET 0 /* variable not set */ #define EP_OFF 1 /* var = off */ #define EP_ON 2 /* var = on (or field left blank) */ #define EP_SET 3 /* var = 1:2:3 (nonblank field) */ /* To translate an address in kernel space to a physical address. This is * the same as umap(proc_ptr, D, vir, sizeof(*vir)), but a lot less costly. */ #define vir2phys(vir) (data_base + (vir_bytes) (vir)) /* This file contains some dumping routines for debugging. */ #include "kernel.h" #include #include "proc.h" FORWARD _PROTOTYPE(char *proc_name, (int proc_nr)); #define click_to_round_k(n) \ ((unsigned) ((((unsigned long) (n) << CLICK_SHIFT) + 512) / 1024)) /*===========================================================================* * p_dmp * *===========================================================================*/ #if (CHIP == INTEL) PUBLIC void p_dmp() { /* Proc table dump */ register struct proc *rp; static struct proc *oldrp = BEG_PROC_ADDR; int n = 0; phys_clicks text, data, size; printf("\n--pid --pc- ---sp- flag -user --sys-- -text- -data- -size- -recv- command\n"); for (rp = oldrp; rp < END_PROC_ADDR; rp++) { if (isemptyp(rp)) continue; if (++n > 20) break; text = rp->p_map[T].mem_phys; data = rp->p_map[D].mem_phys; size = rp->p_map[T].mem_len + ((rp->p_map[S].mem_phys + rp->p_map[S].mem_len) - data); if (rp->p_pid == 0) { printf("(%3d)", proc_number(rp)); } else { printf("%5d", rp->p_pid); } printf(" %5lx %6lx %2x %7lu %7lu %5uK %5uK %5uK ", (unsigned long) rp->p_reg.pc, (unsigned long) rp->p_reg.sp, rp->p_flags, rp->user_time, rp->sys_time, click_to_round_k(text), click_to_round_k(data), click_to_round_k(size)); if (rp->p_flags & RECEIVING) { printf("%-7.7s", proc_name(rp->p_getfrom)); } else if (rp->p_flags & SENDING) { printf("S:%-5.5s", proc_name(rp->p_sendto)); } else if (rp->p_flags == 0) { printf(" "); } printf("%s\n", rp->p_name); } if (rp == END_PROC_ADDR) rp = BEG_PROC_ADDR; else printf("--more--\r"); oldrp = rp; } #endif /* (CHIP == INTEL) */ /*===========================================================================* * map_dmp * *===========================================================================*/ PUBLIC void map_dmp() { register struct proc *rp; static struct proc *oldrp = cproc_addr(HARDWARE); int n = 0; phys_clicks size; printf("\nPROC NAME- -----TEXT----- -----DATA----- ----STACK----- -SIZE-\n"); for (rp = oldrp; rp < END_PROC_ADDR; rp++) { if (isemptyp(rp)) continue; if (++n > 20) break; size = rp->p_map[T].mem_len + ((rp->p_map[S].mem_phys + rp->p_map[S].mem_len) - rp->p_map[D].mem_phys); printf("%3d %-6.6s %4x %4x %4x %4x %4x %4x %4x %4x %4x %5uK\n", proc_number(rp), rp->p_name, rp->p_map[T].mem_vir, rp->p_map[T].mem_phys, rp->p_map[T].mem_len, rp->p_map[D].mem_vir, rp->p_map[D].mem_phys, rp->p_map[D].mem_len, rp->p_map[S].mem_vir, rp->p_map[S].mem_phys, rp->p_map[S].mem_len, click_to_round_k(size)); } if (rp == END_PROC_ADDR) rp = cproc_addr(HARDWARE); else printf("--more--\r"); oldrp = rp; } #if (CHIP == M68000) FORWARD _PROTOTYPE(void mem_dmp, (char *adr, int len)); /*===========================================================================* * p_dmp * *===========================================================================*/ PUBLIC void p_dmp() { /* Proc table dump */ register struct proc *rp; static struct proc *oldrp = BEG_PROC_ADDR; int n = 0; vir_clicks base, limit; printf( "\nproc pid pc sp splow flag user sys recv command\n"); for (rp = oldrp; rp < END_PROC_ADDR; rp++) { if (isemptyp(rp)) continue; if (++n > 20) break; base = rp->p_map[T].mem_phys; limit = rp->p_map[S].mem_phys + rp->p_map[S].mem_len; printf("%4u %4u %6lx %6lx %6lx %4x %5lu %6lu ", proc_number(rp), rp->p_pid, (unsigned long) rp->p_reg.pc, (unsigned long) rp->p_reg.sp, (unsigned long) rp->p_splow, rp->p_flags, rp->user_time, rp->sys_time); if (rp->p_flags & RECEIVING) { printf("%-7.7s", proc_name(rp->p_getfrom)); } else if (rp->p_flags & SENDING) { printf("S:%-5.5s", proc_name(rp->p_sendto)); } else if (rp->p_flags == 0) { printf(" "); } printf("%s\n", rp->p_name); } if (rp == END_PROC_ADDR) rp = BEG_PROC_ADDR; else printf("--more--\r"); oldrp = rp; } /*===========================================================================* * reg_dmp * *===========================================================================*/ PUBLIC void reg_dmp(rp) struct proc *rp; { register int i; static char *regs[NR_REGS] = { "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "a0", "a1", "a2", "a3", "a4", "a5", "a6" }; reg_t *regptr = (reg_t *) & rp->p_reg; printf("reg = %08lx, ", rp); printf("ksp = %08lx\n", (long) &rp + sizeof(rp)); printf(" pc = %08lx, ", rp->p_reg.pc); printf(" sr = %04x, ", rp->p_reg.psw); printf("trp = %2x\n", rp->p_trap); for (i = 0; i < NR_REGS; i++) printf("%3s = %08lx%s",regs[i], *regptr++, (i&3) == 3 ? "\n" : ", "); printf(" a7 = %08lx\n", rp->p_reg.sp); mem_dmp((char *) (((long) rp->p_reg.pc & ~31L) - 96), 128); mem_dmp((char *) (((long) rp->p_reg.sp & ~31L) - 32), 256); } /*===========================================================================* * mem_dmp * *===========================================================================*/ PRIVATE void mem_dmp(adr, len) char *adr; int len; { register i; register long *p; for (i = 0, p = (long *) adr; i < len; i += 4) { #if (CHIP == M68000) if ((i & 31) == 0) printf("\n%lX:", p); printf(" %8lX", *p++); #else if ((i & 31) == 0) printf("\n%X:", p); printf(" %8X", *p++); #endif /* (CHIP == M68000) */ } printf("\n"); } #endif /* (CHIP == M68000) */ /*===========================================================================* * proc_name * *===========================================================================*/ PRIVATE char *proc_name(proc_nr) int proc_nr; { if (proc_nr == ANY) return "ANY"; return proc_addr(proc_nr)->p_name; } /* fatfile.c Created: Feb 24, 1994 by Philip Homburg */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #if ENABLE_FATFILE #include #include "assert.h" INIT_ASSERT #define BOOT_POS ((unsigned long)0) #define BOOT_SIZE 512 struct bootsector { u8_t b_jmp[3]; /* JMP instruction to reach boot code */ u8_t b_oem_name[8]; /* OEM name and version */ u8_t b_bytes_per_sector[2]; u8_t b_sectors_per_cluster; u8_t b_reserved[2]; u8_t b_nr_fats; u8_t b_rootdir_entries[2]; u8_t b_nr_sectors16[2]; /* # sectors if < 32M, otherwise 0 */ u8_t b_media; u8_t b_sectors_per_fat16[2]; /* sec/fat if FAT-12 or FAT-16 */ u8_t b_sectors_per_track[2]; u8_t b_nr_heads[2]; u8_t b_hidden_sectors[4]; u8_t b_nr_sectors32[4]; /* # sectors if >= 32M */ /* Only for FAT-32: */ u8_t b_sectors_per_fat32[4]; /* sec/fat if FAT-32 */ u8_t b_flags[2]; u8_t b_version[2]; u8_t b_rootdir_cluster[4]; /* First cluster in root directory */ u8_t b_info_sector[2]; u8_t b_backup_boot[2]; }; #define B_MAGIC_POS 0x1FE #define B_MAGIC_OK(c1,c2) ((c1) == 0x55 && (c2) == 0xAA) #define MAX_FAT12_CLUSTERS 0xFEE /* Maximum for a 12 bit FAT. */ struct dirent { u8_t d_name[8]; u8_t d_ext[3]; u8_t d_attr; u8_t d_Case; u8_t d_ctime_ms; u16_t d_ctime; u16_t d_cdate; u16_t d_adate; u8_t d_cluster2; u8_t d_cluster3; u16_t d_time; u16_t d_date; u8_t d_cluster0; u8_t d_cluster1; u8_t d_size0; u8_t d_size1; u8_t d_size2; u8_t d_size3; }; #define DA_ISDIR 0x10 #if _WORD_SIZE == 2 #define CMAP_NO 129 /* [0..128] */ #else #define CMAP_NO 513 /* [0..512] */ #endif typedef struct ff { int ff_init; int ff_dead; int ff_dev_task; int ff_dev_minor; u32_t ff_rtdir_start; u32_t ff_fat_start; u32_t ff_data_start; u32_t ff_img_size; u32_t ff_nr_clusters; u32_t ff_cluster_map[CMAP_NO]; u32_t ff_map_step; u32_t ff_step_mask; u32_t ff_cache_pos; int ff_fat_bits; int ff_step_shift; unsigned ff_cluster_size; unsigned ff_cache_cluster; unsigned ff_rtdir_size; unsigned ff_open_ct; /* for driver.c */ struct device ff_part[DEV_PER_DRIVE]; } ff_t; #define MAX_DRIVES 2 static struct ff ff_table[MAX_DRIVES]; #define NR_DEVICES (MAX_DRIVES * DEV_PER_DRIVE) #define CACHE_NR (2 * sizeof(char *)) static struct { ff_t *c_device; u32_t c_sector; u8_t c_block[SECTOR_SIZE]; } cache[CACHE_NR]; static int cache_victim= 0; static int fatfile_tasknr= ANY; static int ff_drive; static ff_t *ff_curr; static struct device *ff_dv; #define islower(c) ((unsigned) ((c) - 'a') <= (unsigned) ('z' - 'a')) #define toupper(c) ((c) - 'a' + 'A') _PROTOTYPE( static char *ff_name, (void) ); _PROTOTYPE( static int ff_do_open, (struct driver *dp, message *m_ptr) ); _PROTOTYPE( static int ff_do_close, (struct driver *dp, message *m_ptr) ); _PROTOTYPE( static struct device *ff_prepare, (int device) ); _PROTOTYPE( static int ff_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); _PROTOTYPE( static void ff_geometry, (struct partition *entry) ); _PROTOTYPE( static void init, (ff_t *ffp) ); _PROTOTYPE( static int init_hd, (ff_t *ffp) ); _PROTOTYPE( static u8_t *read_bytes, (ff_t *ffp, unsigned long pos, unsigned size) ); _PROTOTYPE( static u16_t b2u16, (U8_t c0, U8_t c1) ); _PROTOTYPE( static u32_t b2u32, (U8_t c0, U8_t c1, U8_t c2, U8_t c3) ); _PROTOTYPE( static int dir_lookup, (ff_t *ffp, u8_t *name, unsigned long cluster, struct dirent *dirp) ); _PROTOTYPE( static unsigned long next_cluster, (ff_t *ffp, unsigned long cluster) ); _PROTOTYPE( static unsigned long cluster2block, (ff_t *ffp, unsigned long cluster) ); _PROTOTYPE( static unsigned long img_cluster2block, (ff_t *ffp, unsigned long pos) ); _PROTOTYPE( static int parse_env, (int drive, int *taskp, int *minorp, u8_t **namep) ); static struct driver ff_dtab= { ff_name, ff_do_open, ff_do_close, do_diocntl, ff_prepare, ff_transfer, nop_cleanup, ff_geometry, }; void fatfile_task() { fatfile_tasknr= proc_number(proc_ptr); driver_task(&ff_dtab); } static char *ff_name() { static char name[]= "fatfile-d0"; name[9]= '0' + ff_drive; return name; } static int ff_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { if (ff_prepare(m_ptr->DEVICE) == NULL) return ENXIO; if (!ff_curr->ff_init) init(ff_curr); if (ff_curr->ff_dead) return ENXIO; if (ff_curr->ff_open_ct++ == 0) { partition(&ff_dtab, ff_drive*DEV_PER_DRIVE, P_PRIMARY); } return OK; } static int ff_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { if (ff_prepare(m_ptr->DEVICE) == NULL) return ENXIO; ff_curr->ff_open_ct--; return OK; } static struct device *ff_prepare(device) int device; { if (device < NR_DEVICES) { ff_drive= device / DEV_PER_DRIVE; ff_curr= &ff_table[ff_drive]; ff_dv= &ff_curr->ff_part[device % DEV_PER_DRIVE]; } else return NULL; if (ff_curr->ff_dead) return NULL; return ff_dv; } /* ff_transfer */ static int ff_transfer(proc_nr, opcode, position, iovec, nr_req) int proc_nr; int opcode; off_t position; iovec_t *iovec; unsigned nr_req; { iovec_t *request, *iovec_end= iovec + nr_req; unsigned long first_dev_pos, dev_pos, pos; int r; unsigned dev_nr_req; unsigned nbytes, count; unsigned dev_size; unsigned long dv_size; iovec_t iovec1; message m; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes= 0; for (request= iovec; request < iovec_end; request++) nbytes += request->iov_size; /* Handle partition translation. */ dv_size = cv64ul(ff_dv->dv_size); pos = position; if (pos >= dv_size) return OK; if (pos + nbytes > dv_size) nbytes = dv_size - pos; pos += cv64ul(ff_dv->dv_base); if (pos >= ff_curr->ff_img_size) return EIO; if (pos + nbytes > ff_curr->ff_img_size) return EIO; /* How many bytes can be found in consecutive clusters? */ count= 0; while (count < nbytes) { dev_pos= img_cluster2block(ff_curr, pos); if (count == 0) { first_dev_pos= dev_pos; } else { if (dev_pos != first_dev_pos + count) break; } dev_size= ff_curr->ff_cluster_size - (pos % ff_curr->ff_cluster_size); if (count + dev_size > nbytes) dev_size = nbytes - count; pos += dev_size; count += dev_size; } /* How many I/O requests can be executed on those clusters? */ dev_nr_req= 0; request= iovec; while (count > 0) { if (count < request->iov_size) break; count -= request->iov_size; request++; dev_nr_req++; } if (dev_nr_req > 0) { /* Do those requests that can be done, then exit. */ m.m_type= opcode; m.DEVICE= ff_curr->ff_dev_minor; m.PROC_NR= proc_nr; m.POSITION= first_dev_pos; m.ADDRESS= (char *) iovec; m.COUNT= dev_nr_req; r= sendrec(ff_curr->ff_dev_task, &m); assert(r == OK); /* EOF is checked here, so no half-baked results. */ return iovec[0].iov_size == 0 ? OK : EIO; } /* The first request can only be partially executed. */ iovec1.iov_addr= iovec[0].iov_addr; iovec1.iov_size= count; m.m_type= opcode; m.DEVICE= ff_curr->ff_dev_minor; m.PROC_NR= proc_nr; m.POSITION= first_dev_pos; m.ADDRESS= (char *) &iovec1; m.COUNT= 1; r= sendrec(ff_curr->ff_dev_task, &m); assert(r == OK); if (iovec1.iov_size != 0) return EIO; /* Book the partial I/O and try again with the updated list. */ iovec[0].iov_addr+= count; iovec[0].iov_size-= count; position += count; } return OK; } static void ff_geometry(entry) struct partition *entry; { /* The number of sectors per track is chosen to match the cluster size * to make it easy for people to place partitions on cluster boundaries. */ entry->cylinders= ff_curr->ff_img_size / ff_curr->ff_cluster_size / 64; entry->heads= 64; entry->sectors= ff_curr->ff_cluster_size >> SECTOR_SHIFT; } /* init */ static void init(ffp) ff_t *ffp; { u8_t *cp, *name; struct bootsector *bp; struct dirent dirent; int i, r; unsigned long cluster; unsigned long off; unsigned rtdir_ents; unsigned bytespsec; unsigned long secspfat; unsigned long fatsize; unsigned secspclus; unsigned long nr_secs; unsigned long rtdir_cluster; unsigned long max_cl(+*+++,+-+.+/+0+1+2+3+4+uster; ffp->ff_init= 1; ffp->ff_dead= 1; if (parse_env(ff_drive, &ffp->ff_dev_task, &ffp->ff_dev_minor, &name) != OK) { return; } if (init_hd(ffp) != OK) { printf("%s: init_hd failed\n", ff_name()); return; } cp= read_bytes(ffp, BOOT_POS, BOOT_SIZE); if (cp == NULL) return; bp= (struct bootsector *) cp; if (!B_MAGIC_OK(cp[B_MAGIC_POS], cp[B_MAGIC_POS + 1])) { printf("%s: magic AA55 not found\n", ff_name()); return; } bytespsec= b2u16(bp->b_bytes_per_sector[0], bp->b_bytes_per_sector[1]); if (bp->b_nr_fats != 2) { printf("%s: strange number of fats: %d\n", ff_name(), bp->b_nr_fats); return; } ffp->ff_fat_bits= 12; /* Assume 12, later correct to 16 or 32 */ secspfat= b2u16(bp->b_sectors_per_fat16[0], bp->b_sectors_per_fat16[1]); if (secspfat == 0) { ffp->ff_fat_bits= 32; secspfat= b2u32(bp->b_sectors_per_fat32[0], bp->b_sectors_per_fat32[1], bp->b_sectors_per_fat32[2], bp->b_sectors_per_fat32[3]); } fatsize= secspfat * bytespsec; ffp->ff_fat_start= b2u16(bp->b_reserved[0], bp->b_reserved[1]) * bytespsec; rtdir_ents= b2u16(bp->b_rootdir_entries[0], bp->b_rootdir_entries[1]); ffp->ff_rtdir_size= rtdir_ents * sizeof(struct dirent); ffp->ff_rtdir_start= ffp->ff_fat_start + bp->b_nr_fats * fatsize; rtdir_cluster= b2u32(bp->b_rootdir_cluster[0], bp->b_rootdir_cluster[1], bp->b_rootdir_cluster[2], bp->b_rootdir_cluster[3]); secspclus= bp->b_sectors_per_cluster; nr_secs= b2u16(bp->b_nr_sectors16[0], bp->b_nr_sectors16[1]); if (nr_secs == 0) { nr_secs= b2u32(bp->b_nr_sectors32[0], bp->b_nr_sectors32[1], bp->b_nr_sectors32[2], bp->b_nr_sectors32[3]); } ffp->ff_nr_clusters= nr_secs / (secspclus == 0 ? 1 : secspclus); ffp->ff_cluster_size= bytespsec * secspclus; ffp->ff_data_start= ffp->ff_rtdir_start + ffp->ff_rtdir_size; if (ffp->ff_fat_bits == 12 && ffp->ff_nr_clusters > MAX_FAT12_CLUSTERS) { ffp->ff_fat_bits= 16; } max_cluster= ((u32_t) -1 - ffp->ff_data_start) / ffp->ff_cluster_size + 2; if (ffp->ff_nr_clusters > max_cluster) { /* A filesystem > 4G? I'm afraid we can't do that. */ ffp->ff_nr_clusters= max_cluster; } #if DEBUG printf("%s: os name is '%.8s'\n", ff_name(), bp->b_oem_name); #endif if (ffp->ff_fat_bits <= 16) { cluster= 0; /* Indicates root directory segment. */ } else { cluster= rtdir_cluster; /* FAT-32 root directory chain. */ } for (;;) { cp= name; while (*cp == '\\' || *cp == '/') cp++; name= cp; while (*name != 0) { if (*name == '\\' || *name == '/') { *name++ = 0; break; } name++; } r= dir_lookup(ffp, cp, cluster, &dirent); if (r != OK) return; if (ffp->ff_fat_bits <= 16) { cluster= b2u16(dirent.d_cluster0, dirent.d_cluster1); } else { cluster= b2u32(dirent.d_cluster0, dirent.d_cluster1, dirent.d_cluster2, dirent.d_cluster3); } if (*name == 0) break; if (!(dirent.d_attr & DA_ISDIR)) { printf("%s: '%s' is not a directory\n", ff_name(), cp); return; } } if (dirent.d_attr & DA_ISDIR) { printf("%s: '%s' is not a file\n", ff_name(), cp); return; } ffp->ff_img_size= b2u32(dirent.d_size0, dirent.d_size1, dirent.d_size2, dirent.d_size3); ffp->ff_map_step= ffp->ff_cluster_size; while (ffp->ff_map_step * (CMAP_NO-1) < ffp->ff_img_size) ffp->ff_map_step <<= 1; for (i= 0; (1L << i) < ffp->ff_map_step; i++) ; /* no nothing */ if ((1L << i) != ffp->ff_map_step) { printf("%s: ff_map_step (= %ld) is not a power of 2\n", ff_name(), ffp->ff_map_step); return; } ffp->ff_step_shift= i; ffp->ff_step_mask= ffp->ff_map_step-1; i= 0; for (off= 0; off < ffp->ff_img_size; off += ffp->ff_cluster_size) { if ((off & ffp->ff_step_mask) == 0) { ffp->ff_cluster_map[i++]= cluster; } if (cluster == 0) { printf("%s: cluster chain finishes early!\n", ff_name()); return; } cluster= next_cluster(ffp, cluster); } ffp->ff_cache_pos= 0; ffp->ff_cache_cluster= ffp->ff_cluster_map[0]; ffp->ff_dead= 0; ffp->ff_part[0].dv_size= cvul64(ffp->ff_img_size); } static int init_hd(ffp) ff_t *ffp; { message m; int r; m.m_type= DEV_OPEN; m.DEVICE= ffp->ff_dev_minor; m.PROC_NR= fatfile_tasknr; m.COUNT= R_BIT|W_BIT; r= sendrec(ffp->ff_dev_task, &m); assert (r == OK); r= m.REP_STATUS; if (r != OK) { printf("%s: dev_open failed: %d\n", ff_name(), r); return EIO; } return OK; } /* read_bytes */ static u8_t *read_bytes(ffp, pos, size) ff_t *ffp; unsigned long pos; unsigned size; { message m; unsigned long sector; unsigned off; int i, r; iovec_t iovec1; sector= pos >> SECTOR_SHIFT; off= pos & SECTOR_MASK; assert(off+size <= SECTOR_SIZE); /* search the cache */ for (i= 0; iff_dev_minor; m.POSITION= sector << SECTOR_SHIFT; m.PROC_NR= fatfile_tasknr; m.ADDRESS= (char *) &iovec1; m.COUNT= 1; r= sendrec(ffp->ff_dev_task, &m); assert(r == OK); if (iovec1.iov_size != 0) { printf("%s: dev_read failed: %d\n", ff_name(), m.REP_STATUS); return NULL; } cache[i].c_device= ffp; cache[i].c_sector= sector; return cache[i].c_block+off; } static u16_t b2u16(c0, c1) u8_t c0; u8_t c1; { return c0 | (c1 << 8); } static u32_t b2u32(c0, c1, c2, c3) u8_t c0; u8_t c1; u8_t c2; u8_t c3; { return (u32_t)c0 | ((u32_t)c1 << 8) | ((u32_t)c2 << 16) | ((u32_t)c3 << 24); } /* dir_lookup */ static int dir_lookup(ffp, name, cluster, dirp) ff_t *ffp; u8_t *name; unsigned long cluster; struct dirent *dirp; { struct dirent *direntp; u8_t base[8], ext[3]; int i; u8_t *cp; unsigned long offset; unsigned long cluster_block; unsigned off; cp= name; memset(base, ' ', 8); for (i= 0; *cp != '\0' && *cp != '.'; i++, cp++) { if (i >= 8) continue; if (islower(*cp)) base[i]= toupper(*cp); else base[i]= *cp; } if (*cp == '.') cp++; memset(ext, ' ', 3); for (i= 0; *cp != '\0'; i++, cp++) { if (i >= 3) continue; if (islower(*cp)) ext[i]= toupper(*cp); else ext[i]= *cp; } if (cluster == 0) { /* Root directory */ offset= 0; while(offset < ffp->ff_rtdir_size) { cp= read_bytes(ffp, ffp->ff_rtdir_start + offset, SECTOR_SIZE); if (cp == NULL) return EIO; for (i= 0; iff_rtdir_size; i += sizeof(struct dirent)) { direntp= (struct dirent *)&cp[i]; if (memcmp(direntp->d_name, base, 8) == 0 && memcmp(direntp->d_ext, ext, 3) == 0) { memcpy(dirp, cp+i, sizeof(struct dirent)); return OK; } offset += sizeof(struct dirent); } } } else { /* Any sub directory */ offset= 0; off= 0; cluster_block= cluster2block(ffp, cluster); for (;;) { cp= read_bytes(ffp, cluster_block + off, SECTOR_SIZE); if (cp == NULL) return EIO; for (i= 0; id_name, base, 8) == 0 && memcmp(direntp->d_ext, ext, 3) == 0) { memcpy(dirp, cp+i, sizeof(struct dirent)); return OK; } offset += sizeof(struct dirent); } off += SECTOR_SIZE; if (off >= ffp->ff_cluster_size) { cluster= next_cluster(ffp, cluster); off= 0; if (cluster == 0) break; } } } printf("%s: '%s' not found\n", ff_name(), name); return ENOENT; } /* next_cluster */ static unsigned long next_cluster(ffp, cluster) ff_t *ffp; unsigned long cluster; { unsigned long next; u8_t *pnext; switch (ffp->ff_fat_bits) { case 12: pnext= read_bytes(ffp, ffp->ff_fat_start + ((unsigned) cluster * 3 / 2), 2); if (pnext == 0) return 0; next= b2u16(pnext[0], pnext[1]); if ((cluster & 1) == 0) { next &= 0xfff; } else { next >>= 4; } break; case 16: pnext= read_bytes(ffp, ffp->ff_fat_start + ((unsigned) cluster * 2), 2); if (pnext == 0) return 0; next= b2u16(pnext[0], pnext[1]); break; case 32: pnext= read_bytes(ffp, ffp->ff_fat_start + (cluster * 4), 4); if (pnext == 0) return 0; next= b2u32(pnext[0], pnext[1], pnext[2], pnext[3]); break; } return next < ffp->ff_nr_clusters ? next : 0; } static unsigned long cluster2block(ffp, cluster) ff_t *ffp; unsigned long cluster; { return ffp->ff_data_start + (cluster-2) * ffp->ff_cluster_size; } static unsigned long img_cluster2block(ffp, pos) ff_t *ffp; unsigned long pos; { unsigned long posbase, cachebase; int posindx; posbase= (pos & ~ffp->ff_step_mask); cachebase= (ffp->ff_cache_pos & ~ffp->ff_step_mask); if (posbase != cachebase || pos < ffp->ff_cache_pos) { posindx= posbase >> ffp->ff_step_shift; ffp->ff_cache_pos= posbase; ffp->ff_cache_cluster= ffp->ff_cluster_map[posindx]; } while (ffp->ff_cache_pos + ffp->ff_cluster_size <= pos) { ffp->ff_cache_pos += ffp->ff_cluster_size; ffp->ff_cache_cluster= next_cluster(ffp, ffp->ff_cache_cluster); assert(ffp->ff_cache_cluster != 0); } assert(pos-ffp->ff_cache_pos < ffp->ff_cluster_size); return cluster2block(ffp, ffp->ff_cache_cluster)+ pos-ffp->ff_cache_pos; } static int parse_env(drive, taskp, minorp, namep) int drive; int *taskp; int *minorp; u8_t **namep; { static char namebuf[256]; char *env_var, *env_val; char *cp, *check, *taskname; int ok, task; unsigned long minor; env_var= ff_name(); env_val= getenv(env_var); if (env_val == NULL) { printf("%s: no environment variable '%s'\n", ff_name(), env_var); return ESRCH; } cp= env_val; ok= (cp= strchr(cp, ':')) != NULL; if (ok) { *cp= 0; for (task= -NR_TASKS; task < 0; task++) { if (strcmp(env_val, tasktab[task+NR_TASKS].name) == 0) break; } *cp++= ':'; if (task == 0) { printf("%s: driver named in '%s' is not available\n", ff_name(), env_val); return EINVAL; } } if (ok) { minor= strtoul(cp, &check, 0); if (minor >= 256) { printf( "%s: minor device number in '%s' is out of range\n", ff_name(), env_val); return EINVAL; } if (check == cp || *check != ':') ok= 0; cp= check+1; } if (!ok) { printf("%s: unable to parse '%s'\n", ff_name(), env_val); return EINVAL; } if (strlen(cp) > sizeof(namebuf)-1) { printf("%s: file name too long in '%s'\n", ff_name(), env_val); return EINVAL; } strcpy(namebuf, cp); *taskp= task; *minorp= minor; *namep= (u8_t *) namebuf; printf("%s: using %s\n", ff_name(), env_val); return OK; } #endif /* ENABLE_FATFILE */ /* * dp8390.c * * This file contains a ethernet device driver for NS dp8390 based ethernet * cards. * * The valid messages and their parameters are: * * m_type DL_PORT DL_PROC DL_COUNT DL_MODE DL_ADDR * |------------+----------+---------+----------+---------+---------| * | HARDINT | | | | | | * |------------|----------|---------|----------|---------|---------| * | DL_WRITE | port nr | proc nr | count | mode | address | * |------------|----------|---------|----------|---------|---------| * | DL_WRITEV | port nr | proc nr | count | mode | address | * |------------|----------|---------|----------|---------|---------| * | DL_READ | port nr | proc nr | count | | address | * |------------|----------|---------|----------|---------|---------| * | DL_READV | port nr | proc nr | count | | address | * |------------|----------|---------|----------|---------|---------| * | DL_INIT | port nr | proc nr | mode | | address | * |------------|----------|---------|----------|---------|---------| * | DL_GETSTAT | port nr | proc nr | | | address | * |------------|----------|---------|----------|---------|---------| * | DL_STOP | port_nr | | | | | * |------------|----------|---------|----------|---------|---------| * * The messages sent are: * * m-type DL_POR T DL_PROC DL_COUNT DL_STAT DL_CLCK * |------------|----------|---------|----------|---------|---------| * |DL_TASK_REPL| port nr | proc nr | rd-count | err|stat| clock | * |------------|----------|---------|----------|---------|---------| * * m_type m3_i1 m3_i2 m3_ca1 * |------------+---------+-----------+---------------| * |DL_INIT_REPL| port nr | last port | ethernet addr | * |------------|---------|-----------|---------------| * * Created: before Dec 28, 1992 by Philip Homburg * * Modified Mar 10 1994 by Philip Homburg * Become a generic dp8390 driver. * * Modified Dec 20 1996 by G. Falzoni * Added support for 3c503 boards. */ #include "kernel.h" #include #include #include #include #include #include "assert.h" INIT_ASSERT #if __minix_vmd #include "i386/protect.h" #else #include "protect.h" #endif #include "dp8390.h" #include "proc.h" #if __minix_vmd #include "config.h" #endif #if ENABLE_DP8390 || __minix_vmd #define DE_PORT_NR 2 static dpeth_t de_table[DE_PORT_NR]; static int int_pending[NR_IRQ_VECTORS]; static int dpeth_tasknr= ANY; static u16_t eth_ign_proto; /* Configuration */ typedef struct dp_conf { port_t dpc_port; int dpc_irq; phys_bytes dpc_mem; char *dpc_envvar; } dp_conf_t; dp_conf_t dp_conf[]= /* Card addresses */ { /* I/O port, IRQ, Buffer address, Env. var. */ { 0x280, 3, 0xD0000, "DPETH0" }, { 0x300, 5, 0xC8000, "DPETH1" }, }; /* Test if dp_conf has exactly DE_PORT_NR entries. If not then you will see * the error: "array size is negative". */ extern int ___dummy[DE_PORT_NR == sizeof(dp_conf)/sizeof(dp_conf[0]) ? 1 : -1]; /* Card inits configured out? */ #if !ENABLE_WDETH #define wdeth_probe(dep) (0) #endif #if !ENABLE_NE2000 #define ne_probe(dep) (0) #endif #if !ENABLE_3C503 #define el2_probe(dep) (0) #endif _PROTOTYPE( static void do_vwrite, (message *mp, int from_int, int vectored) ); _PROTOTYPE( static void do_vread, (message *mp, int vectored) ); _PROTOTYPE( static void do_init, (message *mp) ); _PROTOTYPE( static void do_int, (dpeth_t *dep) ); _PROTOTYPE( static void do_getstat, (message *mp) ); _PROTOTYPE( static void do_stop, (message *mp) ); _PROTOTYPE( static void dp_init, (dpeth_t *dep) ); _PROTOTYPE( static void dp_confaddr, (dpeth_t *dep) ); _PROTOTYPE( static void dp_reinit, (dpeth_t *dep) ); _PROTOTYPE( static void dp_reset, (dpeth_t *dep) ); _PROTOTYPE( static void dp_check_ints, (dpeth_t *dep) ); _PROTOTYPE( static void dp_recv, (dpeth_t *dep) ); _PROTOTYPE( static void dp_send, (dpeth_t *dep) ); _PROTOTYPE( static void dp_getblock, (dpeth_t *dep, int page, size_t offset, size_t size, void *dst) ); _PROTOTYPE( static void dp_pio8_getblock, (dpeth_t *dep, int page, size_t offset, size_t size, void *dst) ); _PROTOTYPE( static void dp_pio16_getblock, (dpeth_t *dep, int page, size_t offset, size_t size, void *dst) ); _PROTOTYPE( static int dp_pkt2user, (dpeth_t *dep, int page, int length) ); _PROTOTYPE( static void dp_user2nic, (dpeth_t *dep, iovec_dat_t *iovp, vir_bytes offset, int nic_addr, vir_bytes count) ); _PROTOTYPE( static void dp_pio8_user2nic, (dpeth_t *dep, iovec_dat_t *iovp, vir_bytes offset, int nic_addr, vir_bytes count) ); _PROTOTYPE( static void dp_pio16_user2nic, (dpeth_t *dep, iovec_dat_t *iovp, vir_bytes offset, int nic_addr, vir_bytes count) ); _PROTOTYPE( static void dp_nic2user, (dpeth_t *dep, int nic_addr, iovec_dat_t *iovp, vir_bytes offset, vir_bytes count) ); _PROTOTYPE( static void dp_pio8_nic2user, (dpeth_t *dep, int nic_addr, iovec_dat_t *iovp, vir_bytes offset, vir_bytes count) ); _PROTOTYPE( static void dp_pio16_nic2user, (dpeth_t *dep, int nic_addr, iovec_dat_t *iovp, vir_bytes offset, vir_bytes count) ); _PROTOTYPE( static void dp_next_iovec, (iovec_dat_t *iovp) ); _PROTOTYPE( static int dp_handler, (int irq) ); _PROTOTYPE( static void conf_hw, (dpeth_t *dep) ); _PROTOTYPE( static void update_conf, (dpeth_t *dep, dp_conf_t *dcp) ); _PROTOTYPE( static int calc_iovec_size, (iovec_dat_t *iovp) ); _PROTOTYPE( static void reply, (dpeth_t *dep, int err, int may_block) ); _PROTOTYPE( static void mess_reply, (message *req, message *reply) ); _PROTOTYPE( static void get_userdata, (int user_proc, vir_bytes user_addr, vir_bytes count, void *loc_addr) ); _PROTOTYPE( static void put_userdata, (int user_proc, vir_bytes user_addr, vir_bytes count, void *loc_addr) ); /*===========================================================================* * dpeth_task * *===========================================================================*/ void dp8390_task() { message m; int i, irq, r; dpeth_t *dep; long v; dpeth_tasknr= proc_number(proc_ptr); v= 0; (void) env_parse("ETH_IGN_PROTO", "x", 0, &v, 0x0000L, 0xFFFFL); eth_ign_proto= htons((u16_t) v); while (TRUE) { if ((r= receive(ANY, &m)) != OK) panic("dp8390: receive failed", r); switch (m.m_type) { case DL_WRITE: do_vwrite(&m, FALSE, FALSE); break; case DL_WRITEV: do_vwrite(&m, FALSE, TRUE); break; case DL_READ: do_vread(&m, FALSE); break; case DL_READV: do_vread(&m, TRUE); break; case DL_INIT: do_init(&m); break; case DL_GETSTAT: do_getstat(&m); break; case DL_STOP: do_stop(&m); break; case HARD_INT: for (i= 0, dep= &de_table[0]; ide_mode != DEM_ENABLED) continue; assert(dep->de_flags & DEF_ENABLED); irq= dep->de_irq; assert(irq >= 0 && irq < NR_IRQ_VECTORS); if (int_pending[irq]) { int_pending[irq]= 0; dp_check_ints(dep); do_int(dep); enable_irq(irq); } } break; default: panic("dp8390: illegal message", m.m_type); } } } /*===========================================================================* * dp_dump * *===========================================================================*/ void dp_dump() { dpeth_t *dep; int i, isr; printf("\n"); for (i= 0, dep = &de_table[0]; ide_mode == DEM_DISABLED) printf("dp8390 port %d is disabled\n", i); else if (dep->de_mode == DEM_SINK) printf("dp8390 port %d is in sink mode\n", i); if (dep->de_mode != DEM_ENABLED) continue; printf("dp8390 statistics of port %d:\n", i); printf("recvErr :%8ld\t", dep->de_stat.ets_recvErr); printf("sendErr :%8ld\t", dep->de_stat.ets_sendErr); printf("OVW :%8ld\n", dep->de_stat.ets_OVW); printf("CRCerr :%8ld\t", dep->de_stat.ets_CRCerr); printf("frameAll :%8ld\t", dep->de_stat.ets_<+>+?+@+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+[+\+]+^+_+`+a+b+c+frameAll); printf("missedP :%8ld\n", dep->de_stat.ets_missedP); printf("packetR :%8ld\t", dep->de_stat.ets_packetR); printf("packetT :%8ld\t", dep->de_stat.ets_packetT); printf("transDef :%8ld\n", dep->de_stat.ets_transDef); printf("collision :%8ld\t", dep->de_stat.ets_collision); printf("transAb :%8ld\t", dep->de_stat.ets_transAb); printf("carrSense :%8ld\n", dep->de_stat.ets_carrSense); printf("fifoUnder :%8ld\t", dep->de_stat.ets_fifoUnder); printf("fifoOver :%8ld\t", dep->de_stat.ets_fifoOver); printf("CDheartbeat:%8ld\n", dep->de_stat.ets_CDheartbeat); printf("OWC :%8ld\t", dep->de_stat.ets_OWC); isr= inb_reg0(dep, DP_ISR); printf("dp_isr = 0x%x + 0x%x, de_flags = 0x%x\n", isr, inb_reg0(dep, DP_ISR), dep->de_flags); if (debug) { int_pending[dep->de_irq]= 1; interrupt(dpeth_tasknr); } } } /*===========================================================================* * dp8390_stop * *===========================================================================*/ void dp8390_stop() { message mess; int i; for (i= 0; iDL_PORT; count = mp->DL_COUNT; if (port < 0 || port >= DE_PORT_NR) panic("dp8390: illegal port", port); dep= &de_table[port]; dep->de_client= mp->DL_PROC; if (dep->de_mode == DEM_SINK) { assert(!from_int); dep->de_flags |= DEF_PACK_SEND; reply(dep, OK, FALSE); return; } assert(dep->de_mode == DEM_ENABLED); assert(dep->de_flags & DEF_ENABLED); if (dep->de_flags & DEF_SEND_AVAIL) panic("dp8390: send already in progress", NO_NUM); sendq_head= dep->de_sendq_head; if (dep->de_sendq[sendq_head].sq_filled) { if (from_int) panic("dp8390: should not be sending\n", NO_NUM); dep->de_sendmsg= *mp; dep->de_flags |= DEF_SEND_AVAIL; reply(dep, OK, FALSE); return; } assert(!(dep->de_flags & DEF_PACK_SEND)); if (vectored) { get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR, (count > IOVEC_NR ? IOVEC_NR : count) * sizeof(iovec_t), dep->de_write_iovec.iod_iovec); dep->de_write_iovec.iod_iovec_s = count; dep->de_write_iovec.iod_proc_nr = mp->DL_PROC; dep->de_write_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR; dep->de_tmp_iovec = dep->de_write_iovec; size = calc_iovec_size(&dep->de_tmp_iovec); } else { dep->de_write_iovec.iod_iovec[0].iov_addr = (vir_bytes) mp->DL_ADDR; dep->de_write_iovec.iod_iovec[0].iov_size = mp->DL_COUNT; dep->de_write_iovec.iod_iovec_s = 1; dep->de_write_iovec.iod_proc_nr = mp->DL_PROC; dep->de_write_iovec.iod_iovec_addr = 0; size= mp->DL_COUNT; } if (size < ETH_MIN_PACK_SIZE || size > ETH_MAX_PACK_SIZE) { panic("dp8390: invalid packet size", size); } (dep->de_user2nicf)(dep, &dep->de_write_iovec, 0, dep->de_sendq[sendq_head].sq_sendpage * DP_PAGESIZE, size); dep->de_sendq[sendq_head].sq_filled= TRUE; if (dep->de_sendq_tail == sendq_head) { outb_reg0(dep, DP_TPSR, dep->de_sendq[sendq_head].sq_sendpage); outb_reg0(dep, DP_TBCR1, size >> 8); outb_reg0(dep, DP_TBCR0, size & 0xff); outb_reg0(dep, DP_CR, CR_TXP); /* there it goes.. */ } else dep->de_sendq[sendq_head].sq_size= size; if (++sendq_head == dep->de_sendq_nr) sendq_head= 0; assert(sendq_head < SENDQ_NR); dep->de_sendq_head= sendq_head; dep->de_flags |= DEF_PACK_SEND; /* If the interrupt handler called, don't send a reply. The reply * will be sent after all interrupts are handled. */ if (from_int) return; reply(dep, OK, FALSE); assert(dep->de_mode == DEM_ENABLED); assert(dep->de_flags & DEF_ENABLED); } /*===========================================================================* * do_vread * *===========================================================================*/ static void do_vread(mp, vectored) message *mp; int vectored; { int port, count; int size; dpeth_t *dep; port = mp->DL_PORT; count = mp->DL_COUNT; if (port < 0 || port >= DE_PORT_NR) panic("dp8390: illegal port", port); dep= &de_table[port]; dep->de_client= mp->DL_PROC; if (dep->de_mode == DEM_SINK) { reply(dep, OK, FALSE); return; } assert(dep->de_mode == DEM_ENABLED); assert(dep->de_flags & DEF_ENABLED); if(dep->de_flags & DEF_READING) panic("dp8390: read already in progress", NO_NUM); if (vectored) { get_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR, (count > IOVEC_NR ? IOVEC_NR : count) * sizeof(iovec_t), dep->de_read_iovec.iod_iovec); dep->de_read_iovec.iod_iovec_s = count; dep->de_read_iovec.iod_proc_nr = mp->DL_PROC; dep->de_read_iovec.iod_iovec_addr = (vir_bytes) mp->DL_ADDR; dep->de_tmp_iovec = dep->de_read_iovec; size= calc_iovec_size(&dep->de_tmp_iovec); } else { dep->de_read_iovec.iod_iovec[0].iov_addr = (vir_bytes) mp->DL_ADDR; dep->de_read_iovec.iod_iovec[0].iov_size = mp->DL_COUNT; dep->de_read_iovec.iod_iovec_s = 1; dep->de_read_iovec.iod_proc_nr = mp->DL_PROC; dep->de_read_iovec.iod_iovec_addr = 0; size= count; } if (size < ETH_MAX_PACK_SIZE) panic("dp8390: wrong packet size", size); dep->de_flags |= DEF_READING; dp_recv(dep); if ((dep->de_flags & (DEF_READING|DEF_STOPPED)) == (DEF_READING|DEF_STOPPED)) { /* The chip is stopped, and all arrived packets are * delivered. */ dp_reset(dep); } reply(dep, OK, FALSE); } /*===========================================================================* * do_init * *===========================================================================*/ static void do_init(mp) message *mp; { int port; dpeth_t *dep; message reply_mess; port = mp->DL_PORT; if (port < 0 || port >= DE_PORT_NR) { reply_mess.m_type= DL_INIT_REPLY; reply_mess.m3_i1= ENXIO; mess_reply(mp, &reply_mess); return; } dep= &de_table[port]; strcpy(dep->de_name, "dp8390#0"); dep->de_name[7] += port; if (dep->de_mode == DEM_DISABLED) { /* This is the default, try to (re)locate the device. */ conf_hw(dep); if (dep->de_mode == DEM_DISABLED) { /* Probe failed, or the device is configured off. */ reply_mess.m_type= DL_INIT_REPLY; reply_mess.m3_i1= ENXIO; mess_reply(mp, &reply_mess); return; } if (dep->de_mode == DEM_ENABLED) dp_init(dep); } if (dep->de_mode == DEM_SINK) { strncpy((char *) dep->de_address.ea_addr, "ZDP", 6); dep->de_address.ea_addr[5] = port; dp_confaddr(dep); reply_mess.m_type = DL_INIT_REPLY; reply_mess.m3_i1 = mp->DL_PORT; reply_mess.m3_i2 = DE_PORT_NR; *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address; mess_reply(mp, &reply_mess); return; } assert(dep->de_mode == DEM_ENABLED); assert(dep->de_flags & DEF_ENABLED); dep->de_flags &= ~(DEF_PROMISC | DEF_MULTI | DEF_BROAD); if (mp->DL_MODE & DL_PROMISC_REQ) dep->de_flags |= DEF_PROMISC | DEF_MULTI | DEF_BROAD; if (mp->DL_MODE & DL_MULTI_REQ) dep->de_flags |= DEF_MULTI; if (mp->DL_MODE & DL_BROAD_REQ) dep->de_flags |= DEF_BROAD; dep->de_client = mp->m_source; dp_reinit(dep); reply_mess.m_type = DL_INIT_REPLY; reply_mess.m3_i1 = mp->DL_PORT; reply_mess.m3_i2 = DE_PORT_NR; *(ether_addr_t *) reply_mess.m3_ca1 = dep->de_address; mess_reply(mp, &reply_mess); } /*===========================================================================* * do_int * *===========================================================================*/ static void do_int(dep) dpeth_t *dep; { if (dep->de_flags & (DEF_PACK_SEND | DEF_PACK_RECV)) reply(dep, OK, TRUE); } /*===========================================================================* * do_getstat * *===========================================================================*/ static void do_getstat(mp) message *mp; { int port; dpeth_t *dep; port = mp->DL_PORT; if (port < 0 || port >= DE_PORT_NR) panic("dp8390: illegal port", port); dep= &de_table[port]; dep->de_client= mp->DL_PROC; if (dep->de_mode == DEM_SINK) { put_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR, (vir_bytes) sizeof(dep->de_stat), &dep->de_stat); reply(dep, OK, FALSE); return; } assert(dep->de_mode == DEM_ENABLED); assert(dep->de_flags & DEF_ENABLED); dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0); dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1); dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2); put_userdata(mp->DL_PROC, (vir_bytes) mp->DL_ADDR, (vir_bytes) sizeof(dep->de_stat), &dep->de_stat); reply(dep, OK, FALSE); } /*===========================================================================* * do_stop * *===========================================================================*/ static void do_stop(mp) message *mp; { int port; dpeth_t *dep; port = mp->DL_PORT; if (port < 0 || port >= DE_PORT_NR) panic("dp8390: illegal port", port); dep= &de_table[port]; if (dep->de_mode == DEM_SINK) return; assert(dep->de_mode == DEM_ENABLED); if (!(dep->de_flags & DEF_ENABLED)) return; outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); (dep->de_stopf)(dep); dep->de_flags= DEF_EMPTY; } /*===========================================================================* * dp_init * *===========================================================================*/ static void dp_init(dep) dpeth_t *dep; { int dp_rcr_reg; int i; /* General initialization */ dep->de_flags = DEF_EMPTY; (*dep->de_initf)(dep); dp_confaddr(dep); if (debug) { printf("%s: Ethernet address ", dep->de_name); for (i= 0; i < 6; i++) printf("%x%c", dep->de_address.ea_addr[i], i < 5 ? ':' : '\n'); } /* Initialization of the dp8390 */ outb_reg0(dep, DP_CR, CR_PS_P0 | CR_STP | CR_DM_ABORT); outb_reg0(dep, DP_IMR, 0); outb_reg0(dep, DP_PSTART, dep->de_startpage); outb_reg0(dep, DP_PSTOP, dep->de_stoppage); outb_reg0(dep, DP_BNRY, dep->de_startpage); outb_reg0(dep, DP_RCR, RCR_MON); outb_reg0(dep, DP_TCR, TCR_NORMAL); if (dep->de_16bit) outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | DCR_BMS); else outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | DCR_BMS); outb_reg0(dep, DP_RBCR0, 0); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_ISR, 0xFF); outb_reg0(dep, DP_CR, CR_PS_P1 | CR_DM_ABORT); outb_reg1(dep, DP_PAR0, dep->de_address.ea_addr[0]); outb_reg1(dep, DP_PAR1, dep->de_address.ea_addr[1]); outb_reg1(dep, DP_PAR2, dep->de_address.ea_addr[2]); outb_reg1(dep, DP_PAR3, dep->de_address.ea_addr[3]); outb_reg1(dep, DP_PAR4, dep->de_address.ea_addr[4]); outb_reg1(dep, DP_PAR5, dep->de_address.ea_addr[5]); outb_reg1(dep, DP_MAR0, 0xff); outb_reg1(dep, DP_MAR1, 0xff); outb_reg1(dep, DP_MAR2, 0xff); outb_reg1(dep, DP_MAR3, 0xff); outb_reg1(dep, DP_MAR4, 0xff); outb_reg1(dep, DP_MAR5, 0xff); outb_reg1(dep, DP_MAR6, 0xff); outb_reg1(dep, DP_MAR7, 0xff); outb_reg1(dep, DP_CURR, dep->de_startpage + 1); outb_reg1(dep, DP_CR, CR_PS_P0 | CR_DM_ABORT); dp_rcr_reg = 0; if (dep->de_flags & DEF_PROMISC) dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM; if (dep->de_flags & DEF_BROAD) dp_rcr_reg |= RCR_AB; if (dep->de_flags & DEF_MULTI) dp_rcr_reg |= RCR_AM; outb_reg0(dep, DP_RCR, dp_rcr_reg); inb_reg0(dep, DP_CNTR0); /* reset counters by reading */ inb_reg0(dep, DP_CNTR1); inb_reg0(dep, DP_CNTR2); outb_reg0(dep, DP_IMR, IMR_PRXE | IMR_PTXE | IMR_RXEE | IMR_TXEE | IMR_OVWE | IMR_CNTE); outb_reg0(dep, DP_CR, CR_STA | CR_DM_ABORT); /* Finish the initialization. */ dep->de_flags |= DEF_ENABLED; for (i= 0; ide_sendq_nr; i++) dep->de_sendq[i].sq_filled= 0; dep->de_sendq_head= 0; dep->de_sendq_tail= 0; if (!dep->de_prog_IO) { dep->de_user2nicf= dp_user2nic; dep->de_nic2userf= dp_nic2user; dep->de_getblockf= dp_getblock; } else if (dep->de_16bit) { dep->de_user2nicf= dp_pio16_user2nic; dep->de_nic2userf= dp_pio16_nic2user; dep->de_getblockf= dp_pio16_getblock; } else { dep->de_user2nicf= dp_pio8_user2nic; dep->de_nic2userf= dp_pio8_nic2user; dep->de_getblockf= dp_pio8_getblock; } /* set the interrupt handler */ put_irq_handler(dep->de_irq, dp_handler); enable_irq(dep->de_irq); } /*===========================================================================* * dp_confaddr * *===========================================================================*/ static void dp_confaddr(dep) dpeth_t *dep; { int i; char eakey[16]; static char eafmt[]= "x:x:x:x:x:x"; long v; /* User defined ethernet address? */ strcpy(eakey, dp_conf[dep-de_table].dpc_envvar); strcat(eakey, "_EA"); for (i= 0; i < 6; i++) { v= dep->de_address.ea_addr[i]; if (env_parse(eakey, eafmt, i, &v, 0x00L, 0xFFL) != EP_SET) break; dep->de_address.ea_addr[i]= v; } if (i != 0 && i != 6) { /* It's all or nothing; force a panic. */ (void) env_parse(eakey, "?", 0, &v, 0L, 0L); } } /*===========================================================================* * dp_reinit * *===========================================================================*/ static void dp_reinit(dep) dpeth_t *dep; { int dp_rcr_reg; outb_reg0(dep, DP_CR, CR_PS_P0); dp_rcr_reg = 0; if (dep->de_flags & DEF_PROMISC) dp_rcr_reg |= RCR_AB | RCR_PRO | RCR_AM; if (dep->de_flags & DEF_BROAD) dp_rcr_reg |= RCR_AB; if (dep->de_flags & DEF_MULTI) dp_rcr_reg |= RCR_AM; outb_reg0(dep, DP_RCR, dp_rcr_reg); } /*===========================================================================* * dp_reset * *===========================================================================*/ static void dp_reset(dep) dpeth_t *dep; { int i; /* Stop chip */ outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); outb_reg0(dep, DP_RBCR0, 0); outb_reg0(dep, DP_RBCR1, 0); for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++) ; /* Do nothing */ outb_reg0(dep, DP_TCR, TCR_1EXTERNAL|TCR_OFST); outb_reg0(dep, DP_CR, CR_STA|CR_DM_ABORT); outb_reg0(dep, DP_TCR, TCR_NORMAL|TCR_OFST); /* Acknowledge the ISR_RDC (remote dma) interrupt. */ for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RDC) == 0); i++) ; /* Do nothing */ outb_reg0(dep, DP_ISR, inb_reg0(dep, DP_ISR) & ~ISR_RDC); /* Reset the transmit ring. If we were transmitting a packet, we * pretend that the packet is processed. Higher layers will * retransmit if the packet wasn't actually sent. */ dep->de_sendq_head= dep->de_sendq_tail= 0; for (i= 0; ide_sendq_nr; i++) dep->de_sendq[i].sq_filled= 0; dp_send(dep); dep->de_flags &= ~DEF_STOPPED; } /*===========================================================================* * dp_check_ints * *===========================================================================*/ static void dp_check_ints(dep) dpeth_t *dep; { int isr, tsr; int size, sendq_tail; if (!(dep->de_flags & DEF_ENABLED)) panic("dp8390: got premature interrupt", NO_NUM); for(;;) { isr = inb_reg0(dep, DP_ISR); if (!isr) break; outb_reg0(dep, DP_ISR, isr); if (isr & (ISR_PTX|ISR_TXE)) { if (isr & ISR_TXE) { #if DEBUG { printf("%s: got send Error\n", dep->de_name); } #endif dep->de_stat.ets_sendErr++; } else { tsr = inb_reg0(dep, DP_TSR); if (tsr & TSR_PTX) dep->de_stat.ets_packetT++; if (!(tsr & TSR_DFR)) { /* In most (all?) implementations of * the dp8390, this bit is set * when the packet is not deferred */ dep->de_stat.ets_transDef++; } if (tsr & TSR_COL) dep->de_stat.ets_collision++; if (tsr & TSR_ABT) dep->de_stat.ets_transAb++; if (tsr & TSR_CRS) dep->de_stat.ets_carrSense++; if (tsr & TSR_FU && ++dep->de_stat.ets_fifoUnder <= 10) { printf("%s: fifo underrun\n", dep->de_name); } if (tsr & TSR_CDH && ++dep->de_stat.ets_CDheartbeat <= 10) { printf("%s: CD heart beat failure\n", dep->de_name); } if (tsr & TSR_OWC) dep->de_stat.ets_OWC++; } sendq_tail= dep->de_sendq_tail; if (!(dep->de_sendq[sendq_tail].sq_filled)) { /* Software bug? */ assert(!debug); /* Or hardware bug? */ printf( "%s: transmit interrupt, but not sending\n", dep->de_name); continue; } dep->de_sendq[sendq_tail].sq_filled= 0; if (++sendq_tail == dep->de_sendq_nr) sendq_tail= 0; dep->de_sendq_tail= sendq_tail; if (dep->de_sendq[sendq_tail].sq_filled) { size= dep->de_sendq[sendq_tail].sq_size; outb_reg0(dep, DP_TPSR, dep->de_sendq[sendq_tail].sq_sendpage); outb_reg0(dep, DP_TBCR1, size >> 8); outb_reg0(dep, DP_TBCR0, size & 0xff); outb_reg0(dep, DP_CR, CR_TXP); /* there is goes.. */ } if (dep->de_flags & DEF_SEND_AVAIL) dp_send(dep); } if (isr & ISR_PRX) { /* Only call dp_recv if there is a read request */ if (dep->de_flags & DEF_READING) dp_recv(dep); } if (isr & ISR_RXE) dep->de_stat.ets_recvErr++; if (isr & ISR_CNT) { dep->de_stat.ets_CRCerr += inb_reg0(dep, DP_CNTR0); dep->de_stat.ets_frameAll += inb_reg0(dep, DP_CNTR1); dep->de_stat.ets_missedP += inb_reg0(dep, DP_CNTR2); } if (isr & ISR_OVW) { dep->de_stat.ets_OVW++; #if DEBUG { printW(); printf("%s: got overwrite warning\n", dep->de_name); } #endif if (dep->de_flags & DEF_READING) { printf( "dp_check_ints: strange: overwrite warning and pending read request\n"); dp_recv(dep); } } if (isr & ISR_RDC) { /* Nothing to do */ } if (isr & ISR_RST) { /* this means we got an interrupt but the ethernet * chip is shutdown. We set the flag DEF_STOPPED, * and continue processing arrived packets. When the * receive buffer is empty, we reset the dp8390. */ #if DEBUG { printW(); printf("%s: NIC stopped\n", dep->de_name); } #endif dep->de_flags |= DEF_STOPPED; break; } } if ((dep->de_flags & (DEF_READING|DEF_STOPPED)) == (DEF_READING|DEF_STOPPED)) { /* The chip is stopped, and all arrived packets are * delivered. */ dp_reset(dep); } } /*===========================================================================* * dp_recv * *===========================================================================*/ static void dp_recv(dep) dpeth_t *dep; { dp_rcvhdr_t header; unsigned pageno, curr, next; vir_bytes length; int packet_processed, r; u16_t eth_type; packet_processed = FALSE; pageno = inb_reg0(dep, DP_BNRY) + 1; if (pageno == dep->de_stoppage) pageno = dep->de_startpage; do { outb_reg0(dep, DP_CR, CR_PS_P1); curr = inb_reg1(dep, DP_CURR); outb_reg0(dep, DP_CR, CR_PS_P0); if (curr == pageno) break; (dep->de_getblockf)(dep, pageno, (size_t)0, sizeof(header), &header); (dep->de_getblockf)(dep, pageno, sizeof(header) + 2*sizeof(ether_addr_t), sizeof(eth_type), ð_type); length = (header.dr_rbcl | (header.dr_rbch << 8)) - sizeof(dp_rcvhdr_t); next = header.dr_next; if (length < ETH_MIN_PACK_SIZE || length > ETH_MAX_PACK_SIZE) { printf("%s: packet with strange length arrived: %d\n", dep->de_name, (int) length); next= curr; } else if (next < dep->de_startpage || next >= dep->de_stoppage) { printf("%s: strange next page\n", dep->de_name); next= curr; } else if (eth_type == eth_ign_proto) { /* Hack: ignore packets of a given protocol, useful * if you share a net with 80 computers sending * Amoeba FLIP broadcasts. (Protocol 0x8146.) */ static int first= 1; if (first) { first= 0; printf("%s: dropping proto 0x%04x packets\n", dep->de_name, ntohs(eth_ign_proto)); } dep->de_stat.ets_packetR++; } else if (header.dr_status & RSR_FO) { /* This is very serious, so we issue a warning and * reset the buffers */ printf("%s: fifo overrun, resetting receive buffer\n", dep->de_name); dep->de_stat.ets_fifoOver++; next = curr; } else if ((header.dr_status & RSR_PRX) && (dep->de_flags & DEF_ENABLED)) { r = dp_pkt2user(dep, pageno, length); if (r != OK) return; packet_processed = TRUE; dep->de_stat.ets_packetR++; } if (next == dep->de_startpage) outb_reg0(dep, DP_BNRY, dep->de_stoppage - 1); else outb_reg0(dep, DP_BNRY, next - 1); pageno = next; } while (!packet_processed); } /*===========================================================================* * dp_send * *===========================================================================*/ static void dp_send(dep) dpeth_t *dep; { if (!(dep->de_flags & DEF_SEND_AVAIL)) return; dep->de_flags &= ~DEF_SEND_AVAIL; switch(dep->de_sendmsg.m_type) { case DL_WRITE: do_vwrite(&dep->de_sendmsg, TRUE, FALSE); break; case DL_WRITEV: do_vwrite(&dep->de_sendmsg, TRUE, TRUE); break; default: panic("dp8390: wrong type:", dep->de_sendmsg.m_type); break; } } /*===========================================================================* * dp_getblock * *===========================================================================*/ static void dp_getblock(dep, page, offset, size, dst) dpeth_t *dep; int page; size_t offset; size_t size; void *dst; { u16_t *ha; int i; ha = (u16_t *) dst; offset = page * DP_PAGESIZE + offset; assert(!(size & 1)); for (i= 0; ide_memseg, dep->de_memoff + (offset+i)); ha++; } } /*===========================================================================* * dp_pio8_getblock * *===========================================================================*/ static void dp_pio8_getblock(dep, page, offset, size, dst) dpeth_t *dep; int page; size_t offset; size_t size; void *dst; { u8_t *ha; int i; ha = (u8_t *) dst; offset = page * DP_PAGESIZE + offset; outb_reg0(dep, DP_RBCR0, size & 0xFF); outb_reg0(dep, DP_RBCR1, size >> 8); outb_reg0(dep, DP_RSAR0, offset & 0xFF); outb_reg0(dep, DP_RSAR1, offset >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); for (i= 0; ide_data_port); } /*===========================================================================* * dp_pio16_getblock * *===========================================================================*/ static void dp_pio16_getblock(dep, page, offset, size, dst) dpeth_t *dep; int page; size_t offset; size_t size; void *dst; { u16_t *ha; int i; ha = (u16_t *) dst; offset = page * DP_PAGESIZE + offset; outb_reg0(dep, DP_RBCR0, size & 0xFF); outb_reg0(dep, DP_RBCR1, size >> 8); outb_reg0(dep, DP_RSAR0, offset & 0xFF); outb_reg0(dep, DP_RSAR1, offset >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); assert (!(size & 1)); size /= 2; for (i= 0; ide_data_port); } /*===========================================================================* * dp_pkt2user * *===========================================================================*/ static int dp_pkt2user(dep, page, length) dpeth_t *dep; int page, length; { int last, count; if (!(dep->de_flags & DEF_READING)) return EGENERIC; last = page + (length - 1) / DP_PAGESIZE; if (last >= dep->de_stoppage) { count = (dep->de_stoppage - page) * DP_PAGESIZE - sizeof(dp_rcvhdr_t); /* Save read_iovec since we need it twice. */ dep->de_tmp_iovec = dep->de_read_iovec; (dep->de_nic2userf)(dep, page * DP_PAGESIZE + sizeof(dp_rcvhdr_t), &dep->de_tmp_iovec, 0, count); (dep->de_nic2userf)(dep, dep->de_startpage * DP_PAGESIZE, &dep->de_read_iovec, count, length - count); } else { (dep->de_nic2userf)(dep, page * DP_PAGESIZE + sizeof(dp_rcvhdr_t), &dep->de_read_iovec, 0, length); } dep->de_read_s = length; dep->de_flags |= DEF_PACK_RECV; dep->de_flags &= ~DEF_READING; return OK; } /*===========================================================================* * dp_user2nic * *===========================================================================*/ static void dp_user2nic(dep, iovp, offset, nic_addr, count) dpeth_t *dep; iovec_dat_t *iovp; vir_bytes offset; int nic_addr; vir_bytes count; { phys_bytes phys_hw, phys_user; int bytes, i; phys_hw = dep->de_linmem + nic_addr; i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); phys_copy(phys_user, phys_hw, (phys_bytes) bytes); count -= bytes; phys_hw += bytes; offset += bytes; } assert(count == 0); } /*===========================================================================* * dp_pio8_user2nic * *===========================================================================*/ static void dp_pio8_user2nic(dep, iovp, offset, nic_addr, count) dpeth_t *dep; iovec_dat_t *iovp; vir_bytes offset; int nic_addr; vir_bytes count; { phys_bytes phys_user; int bytes, i; outb_reg0(dep, DP_ISR, ISR_RDC); outb_reg0(dep, DP_RBCR0, count & 0xFF); outb_reg0(dep, DP_RBCR1, count >> 8); outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); outb_reg0(dep, DP_RSAR1, nic_addr >> 8); outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); port_write_byte(dep->de_data_port, phys_user, bytes); count -= bytes; offset += bytes; } assert(count == 0); for (i= 0; i<100; i++) { if (inb_reg0(dep, DP_ISR) & ISR_RDC) break; } if (i == 100) { panic("dp8390: remote dma failed to complete", NO_NUM); } } /*===========================================================================* * dp_pio16_user2nic * *===========================================================================*/ static void dp_pio16_user2nic(dep, iovp, offset, nic_addr, count) dpeth_t *dep; iovec_dat_t *iovp; vir_bytes offset; int nic_addr; vir_bytes count; { phys_bytes phys_user; vir_bytes ecount; int bytes, i; u8_t two_bytes[2]; phys_bytes phys_2bytes; int odd_byte; ecount= (count+1) & ~1; phys_2bytes = vir2phys(two_bytes); odd_byte= 0; outb_reg0(dep, DP_ISR, ISR_RDC); outb_reg0(dep, DP_RBCR0, ecount & 0xFF); outb_reg0(dep, DP_RBCR1, ecount >> 8); outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); outb_reg0(dep, DP_RSAR1, nic_addr >> 8); outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); if (odd_byte) { phys_copy(phys_user, phys_2bytes+1, (phys_bytes) 1); out_word(dep->de_data_port, *(u16_t *)two_bytes); count--; offset++; bytes--; phys_user++; odd_byte= 0; if (!bytes) continue; } ecount= bytes & ~1; if (ecount != 0) { port_write(dep->de_data_port, phys_user, ecount); count -= ecount; offset += ecount; bytes -= ecount; phys_user += ecount; } if (bytes) { assert(bytes == 1); phys_copy(phys_user, phys_2bytes, (phys_bytes) 1); count--; offset++; bytes--; phys_user++; odd_byte= 1; } } assert(count == 0); if (odd_byte) out_word(dep->de_data_port, *(u16_t *)two_bytes); for (i= 0; i<100; i++) { if (inb_reg0(dep, DP_ISR) & ISR_RDC) break; } if (i == 100) { panic("dp8390: remote dma failed to complete", NO_NUM); } } /*===========================================================================* * dp_nic2user * *===========================================================================*/ static void dp_nic2user(dep, nic_addr, iovp, offset, count) dpeth_t *dep; int nic_addr; iovec_dat_t *iovp; vir_bytes offset; vir_bytes count; { phys_bytes phys_hw, phys_user; int bytes, i; phys_hw = dep->de_linmem + nic_addr; i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); phys_copy(phys_hw, phys_user, (phys_bytes) bytes); count -= bytes; phys_hw += bytes; offset += bytes; } assert(count == 0); } /*===========================================================================* * dp_pio8_nic2user * *===========================================================================*/ static void dp_pio8_nic2user(dep, nic_addr, iovp, offset, count) dpeth_t *dep; int nic_addr; iovec_dat_t *iovp; vir_bytes offset; vir_bytes count; { phys_bytes phys_user; int bytes, i; outb_reg0(dep, DP_RBCR0, count & 0xFF); outb_reg0(dep, DP_RBCR1, count >> 8); outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); outb_reg0(dep, DP_RSAR1, nic_addr >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); port_read_byte(dep->de_data_port, phys_user, bytes); count -= bytes; offset += bytes; } assert(count == 0); } /*===========================================================================* * dp_pio16_nic2user * *===========================================================================*/ static void dp_pio16_nic2user(dep, nic_addr, iovp, offset, count) dpeth_t *dep; int nic_addr; iovec_dat_t *iovp; vir_bytes offset; vir_bytes count; { phys_bytes phys_user; vir_bytes ecount; int bytes, i; u8_t two_bytes[2]; phys_bytes phys_2bytes; int odd_byte; ecount= (count+1) & ~1; phys_2bytes = vir2phys(two_bytes); odd_byte= 0; outb_reg0(dep, DP_RBCR0, ecount & 0xFF); outb_reg0(dep, DP_RBCR1, ecount >> 8); outb_reg0(dep, DP_RSAR0, nic_addr & 0xFF); outb_reg0(dep, DP_RSAR1, nic_addr >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); i= 0; while (count > 0) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } assert(i < iovp->iod_iovec_s); if (offset >= iovp->iod_iovec[i].iov_size) { offset -= iovp->iod_iovec[i].iov_size; i++; continue; } bytes = iovp->iod_iovec[i].iov_size - offset; if (bytes > count) bytes = count; phys_user = numap(iovp->iod_proc_nr, iovp->iod_iovec[i].iov_addr + offset, bytes); if (!phys_user) panic("dp8390: umap failed\n", NO_NUM); if (odd_byte) { phys_copy(phys_2bytes+1, phys_user, (phys_bytes) 1); count--; offset++; bytes--; phys_user++; odd_byte= 0; if (!bytes) continue; } ecount= bytes & ~1; if (ecount != 0) { port_read(dep->de_data_port, phys_user, ecount); count -= ecount; offset += ecount; bytes -= ecount; phys_user += ecount; } if (bytes) { assert(bytes == 1); *(u16_t *)two_bytes= in_word(dep->de_data_port); phys_copy(phys_2bytes, phys_user, (phys_bytes) 1); count--; offset++; bytes--; phys_user++; odd_byte= 1; } } assert(count == 0); } /*===========================================================================* * dp_next_iovec * *===========================================================================*/ static void dp_next_iovec(iovp) iovec_dat_t *iovp; { assert(iovp->iod_iovec_s > IOVEC_NR); iovp->iod_iovec_s -= IOVEC_NR; iovp->iod_iovec_addr += IOVEC_NR * sizeof(iovec_t); get_userdata(iovp->iod_proc_nr, iovp->iod_iovec_addr, (iovp->iod_iovec_s > IOVEC_NR ? IOVEC_NR : iovp->iod_iovec_s) * sizeof(iovec_t), iovp->iod_iovec); } /*===========================================================================* * dp_handler * *===========================================================================*/ static int dp_handler(irq) int irq; { /* DP8390 interrupt, send message and keep interrupts disabled. */ assert(irq >= 0 && irq < NR_IRQ_VECTORS); int_pending[irq]= 1; interrupt(dpeth_tasknr); return 0; } /*===========================================================================* * conf_hw * *===========================================================================*/ static void conf_hw(dep) dpeth_t *dep; { static eth_stat_t empty_stat = {0, 0, 0, 0, 0, 0 /* ,... */ }; int ifnr; dp_conf_t *dcp; dep->de_mode= DEM_DISABLED; /* Superfluous */ ifnr= dep-de_table; dcp= &dp_conf[ifnr]; update_conf(dep, dcp); if (dep->de_mode != DEM_ENABLED) return; if (!wdeth_probe(dep) && !ne_probe(dep) && !el2_probe(dep)) { printf("%s: No ethernet card found at 0x%x\n", dep->de_name, dep->de_base_port); dep->de_mode= DEM_DISABLED; return; } /* Find a memory segment, programmed I/O should set the * memory segment (linmem) to zero. */ if (dep->de_linmem != 0) { phys2seg(&dep->de_memseg, &dep->de_memoff, dep->de_linmem); } /* XXX */ if (dep->de_linmem == 0) dep->de_linmem= 0xFFFF0000; dep->de_flags = DEF_EMPTY; dep->de_stat = empty_stat; } /*===========================================================================* * update_conf * *===========================================================================*/ static void update_conf(dep, dcp) dpeth_t *dep; dp_conf_t *dcp; { long v; static char dpc_fmt[] = "x:d:x:x"; /* Get the default settings and modify them from the environment. */ dep->de_mode= DEM_SINK; v= dcp->dpc_port; switch (env_parse(dcp->dpc_envvar, dpc_fmt, 0, &v, 0x0000L, 0xFFFFL)) { case EP_OFF: dep->de_mode= DEM_DISABLED; break; case EP_ON: case EP_SET: dep->de_mode= DEM_ENABLED; /* Might become disabled if * all probes fail */ break; } dep->de_base_port= v; v= dcp->dpc_irq | DEI_DEFAULT; (void) env_parse(dcp->dpc_envvar, dpc_fmt, 1, &v, 0L, (long) NR_IRQ_VECTORS - 1); dep->de_irq= v; v= dcp->dpc_mem; (void) env_parse(dcp->dpc_envvar, dpc_fmt, 2, &v, 0L, 0xFFFFFL); dep->de_linmem= v; v= 0; (void) env_parse(dcp->dpc_envvar, dpc_fmt, 3, &v, 0x2000L, 0x8000L); dep->de_ramsize= v; } /*===========================================================================* * calc_iovec_size * *===========================================================================*/ static int calc_iovec_size(iovp) iovec_dat_t *iovp; { /* Calculate the size of a request. Note that the iovec_dat * structure will be unusable after calc_iovec_size. */ int size; int i; size= 0; i= 0; while (i < iovp->iod_iovec_s) { if (i >= IOVEC_NR) { dp_next_iovec(iovp); i= 0; continue; } size += iovp->iod_iovec[i].iov_size; i++; } return size; } /*===========================================================================* * reply * *===========================================================================*/ static void reply(dep, err, may_block) dpeth_t *dep; int err; int may_block; { message reply; int status; int r; status = 0; if (dep->de_flags & DEF_PACK_SEND) status |= DL_PACK_SEND; if (dep->de_flags & DEF_PACK_RECV) status |= DL_PACK_RECV; reply.m_type = DL_TASK_REPLY; reply.DL_PORT = dep - de_table; reply.DL_PROC = dep->de_client; reply.DL_STAT = status | ((u32_t) err << 16); reply.DL_COUNT = dep->de_read_s; reply.DL_CLCK = get_uptime(); r= send(dep->de_client, &reply); if (r == ELOCKED && may_block) { #if DEBUG printW(); printf("send locked\n"); #endif return; } if (r < 0) panic("dp8390: send failed:", r); dep->de_read_s = 0; dep->de_flags &= ~(DEF_PACK_SEND | DEF_PACK_RECV); } /*===========================================================================* * mess_reply * *===========================================================================*/ static void mess_reply(req, reply_mess) message *req; message *reply_mess; { if (send(req->m_source, reply_mess) != OK) panic("dp8390: unable to mess_reply", NO_NUM); } /*===========================================================================* * get_userdata * *===========================================================================*/ static void get_userdata(user_proc, user_addr, count, loc_addr) int user_proc; vir_bytes user_addr; vir_bytes count; void *loc_addr; { phys_bytes src; src = numap(user_proc, user_addr, count); if (!src) panic("dp8390: umap failed", NO_NUM); phys_copy(src, vir2phys(loc_addr), (phys_bytes) count); } /*===========================================================================* * put_userdata * *===========================================================================*/ static void put_userdata(user_proc, user_addr, count, loc_addr) int user_proc; vir_bytes user_addr; vir_bytes count; void *loc_addr; { phys_bytes dst; dst = numap(user_proc, user_addr, count); if (!dst) panic("dp8390: umap failed", NO_NUM); phys_copy(vir2phys(loc_addr), dst, (phys_bytes) count); } #endif /* ENABLE_DP8390 */ /* * $PchId: dp8390.c,v 1.5 1996/01/19 22:56:35 philip Exp $ */ /* dp8390.h Created: before Dec 28, 1992 by Philip Homburg */ /* National Semiconductor DP8390 Network Interface Controller. */ /* Page 0, for reading ------------- */ #define DP_CR 0x0 /* Read side of Command Register */ #define DP_CLDA0 0x1 /* Current Local Dma Address 0 */ #define DP_CLDA1 0x2 /* Current Local Dma Address 1 */ #define DP_BNRY 0x3 /* Boundary Pointer */ #define DP_TSR 0x4 /* Transmit Status Register */ #define DP_NCR 0x5 /* Number of Collisions Register */ #define DP_FIFO 0x6 /* Fifo ?? */ #define DP_ISR 0x7 /* Interrupt Status Register */ #define DP_CRDA0 0x8 /* Current Remote Dma Address 0 */ #define DP_CRDA1 0x9 /* Current Remote Dma Address 1 */ #define DP_DUM1 0xA /* unused */ #define DP_DUM2 0xB /* unused */ #define DP_RSR 0xC /* Receive Status Register */ #define DP_CNTR0 0xD /* Tally Counter 0 */ #define DP_CNTR1 0xE /* Tally Counter 1 */ #define DP_CNTR2 0xF /* Tally Counter 2 */ /* Page 0, for writing ------------- */ #define DP_CR 0x0 /* Write side of Command Register */ #define DP_PSTART 0x1 /* Page Start Register */ #define DP_PSTOP 0x2 /* Page Stop Register */ #define DP_BNRY 0x3 /* Boundary Pointer */ #define DP_TPSR 0x4 /* Transmit Page Start Register */ #define DP_TBCR0 0x5 /* Transmit Byte Count Register 0 */ #define DP_TBCR1 0x6 /* Transmit Byte Count Register 1 */ #define DP_ISR 0x7 /* Interrupt Status Register */ #define DP_RSAR0 0x8 /* Remote Start Address Register 0 */ #define DP_RSAR1 0x9 /* Remote Start Address Register 1 */ #define DP_RBCR0 0xA /* Remote Byte Count Register 0 */ #define DP_RBCR1 0xB /* Remote Byte Count Register 1 */ #define DP_RCR 0xC /* Receive Configuration Register */ #define DP_TCR 0xD /* Transmit Configuration Register */ #define DP_DCR 0xE /* Data Configuration Register */ #define DP_IMR 0xF /* Interrupt Mask Register */ /* Page 1, read/write -------------- */ #define DP_CR 0x0 /* Command Register */ #define DP_PAR0 0x1 /* Physical Address Register 0 */ #define DP_PAR1 0x2 /* Physical Address Register 1 */ #define DP_PAR2 0x3 /* Physical Address Register 2 */ #define DP_PAR3 0x4 /* Physical Address Register 3 */ #define DP_PAR4 0x5 /* Physical Address Register 4 */ #define DP_PAR5 0x6 /* Physical Address Register 5 */ #define DP_CURR 0x7 /* Current Page Register */ #define DP_MAR0 0x8 /* Multicast Address Register 0 */ #define DP_MAR1 0x9 /* Multicast Address Register 1 */ #define DP_MAR2 0xA /* Multicast Address Register 2 */ #define DP_MAR3 0xB /* Multicast Address Register 3 */ #define DP_MAR4 0xC /* Multicast Address Register 4 */ #define DP_MAR5 0xD /* Multicast Address Register 5 */ #define DP_MAR6 0xE /* Multicast Address Register 6 */ #define DP_MAR7 0xF /* Multicast Address Register 7 */ /* Bits in dp_cr */ #define CR_STP 0x01 /* Stop: software reset */ #define CR_STA 0x02 /* Start: activate NIC */ #define CR_TXP 0x04 /* Transmit Packet */ #define CR_DMA 0x38 /* Mask for DMA control */ #define CR_DM_NOP 0x00 /* DMA: No Operation */ #define CR_DM_RR 0x08 /* DMA: Remote Read */ #define CR_DM_RW 0x10 /* DMA: Remote Write */ #define CR_DM_SP 0x18 /* DMA: Send Packet */ #define CR_DM_ABORT 0x20 /* DMA: Abort Remote DMA Operation */ #define CR_PS 0xC0 /* Mask for Page Select */ #define CR_PS_P0 0x00 /* Register Page 0 */ #define CR_PS_P1 0x40 /* Register Page 1 */ #define CR_PS_P2 0x80 /* Register Page 2 */ #define CR_PS_T1 0xC0 /* Test Mode Register Map */ /* Bits in dp_isr */ #define ISR_MASK 0x3F #define ISR_PRX 0x01 /* Packet Received with no errors */ #define ISR_PTX 0x02 /* Packet Transmitted with no errors */ #define ISR_RXE 0x04 /* Receive Error */ #define ISR_TXE 0x08 /* Transmit Error */ #define ISR_OVW 0x10 /* Overwrite Warning */ #define ISR_CNT 0x20 /* Counter Overflow */ #define ISR_RDC 0x40 /* Remote DMA Complete */ #define ISR_RST 0x80 /* Reset Status */ /* Bits in dp_imr */ #define IMR_PRXE 0x01 /* Packet Received iEnable */ #define IMR_PTXE 0x02 /* Packet Transmitted iEnable */ #define IMR_RXEE 0x04 /* Receive Error iEnable */ #define IMR_TXEE 0x08 /* Transmit Error iEnable */ #define IMR_OVWE 0x10 /* Overwrite Warning iEnable */ #define IMR_CNTE 0x20 /* Counter Overflow iEnable */ #define IMR_RDCE 0x40 /* DMA Complete iEnable */ /* Bits in dp_dcr */ #define DCR_WTS 0x01 /* Word Transfer Select */ #define DCR_BYTEWIDE 0x00 /* WTS: byte wide transfers */ #define DCR_WORDWIDE 0x01 /* WTS: word wide transfers */ #define DCR_BOS 0x02 /* Byte Order Select */ #define DCR_LTLENDIAN 0x00 /* BOS: Little Endian */ #define DCR_BIGENDIAN 0x02 /* BOS: Big Endian */ #define DCR_LAS 0x04 /* Long Address Select */ #define DCR_BMS 0x08 /* Burst Mode Select */ #define DCR_AR 0x10 /* Autoinitialize Remote */ #define DCR_FTS 0x60 /* Fifo Threshold Select */ #define DCR_2BYTES 0x00 /* 2 bytes */ #define DCR_4BYTES 0x40 /* 4 bytes */ #define DCR_8BYTES 0x20 /* 8 bytes */ #define DCR_12BYTES 0x60 /* 12 bytes */ /* Bits in dp_tcr */ #define TCR_CRC 0x01 /* Inhibit CRC */ #define TCR_ELC 0x06 /* Encoded Loopback Control */ #define TCR_NORMAL 0x00 /* ELC: Normal Operation */ #define TCR_INTERNAL 0x02 /* ELC: Internal Loopback */ #define TCR_0EXTERNAL 0x04 /* ELC: External Loopback LPBK=0 */ #define TCR_1EXTERNAL 0x06 /* ELC: External Loopback LPBK=1 */ #define TCR_ATD 0x08 /* Auto Transmit */ #define TCR_OFST 0x10 /* Collision Offset Enable (be nice) */ /* Bits in dp_tsr */ #define TSR_PTX 0x01 /* Packet Transmitted (without error)*/ #define TSR_DFR 0x02 /* Transmit Deferred */ #define TSR_COL 0x04 /* Transmit Collided */ #define TSR_ABT 0x08 /* Transmit Aborted */ #define TSR_CRS 0x10 /* Carrier Sense Lost */ #define TSR_FU 0x20 /* FIFO Underrun */ #define TSR_CDH 0x40 /* CD Heartbeat */ #define TSR_OWC 0x80 /* Out of Window Collision */ /* Bits in tp_rcr */ #define RCR_SEP 0x01 /* Save Errored Packets */ #define RCR_AR 0x02 /* Accept Runt Packets */ #define RCR_AB 0x04 /* Accept Broadcast */ #define RCR_AM 0x08 /* Accept Multicast */ #define RCR_PRO 0x10 /* Physical Promiscuous */ #define RCR_MON 0x20 /* Monitor Mode */ /* Bits in dp_rsr */ #define RSR_PRX 0x01 /* Packet Received Intact */ #define RSR_CRC 0x02 /* CRC Error */ #define RSR_FAE 0x04 /* Frame Alignment Error */ #define RSR_FO 0x08 /* FIFO Overrun */ #define RSR_MPA 0x10 /* Missed Packet */ #define RSR_PHY 0x20 /* Multicast Address Match !! */ #define RSR_DIS 0x40 /* Receiver Disabled */ typedef struct dp_rcvhdr { u8_t dr_status; /* Copy of rsr */ u8_t dr_next; /* Pointer to next packet */ u8_t dr_rbcl; /* Receive Byte Count Low */ u8_t dr_rbch; /* Receive Byte Count High */ } dp_rcvhdr_t; #define DP_PAGESIZE 256 /* Some macros tok+m+n+o+p+ simplify accessing the dp8390 */ #define inb_reg0(dep, reg) (in_byte(dep->de_dp8390_port+reg)) #define outb_reg0(dep, reg, data) (out_byte(dep->de_dp8390_port+reg, data)) #define inb_reg1(dep, reg) (in_byte (dep->de_dp8390_port+reg)) #define outb_reg1(dep, reg, data) (out_byte(dep->de_dp8390_port+reg, data)) /* Software interface to the dp8390 driver */ struct dpeth; struct iovec_dat; _PROTOTYPE( typedef void (*dp_initf_t), (struct dpeth *dep) ); _PROTOTYPE( typedef void (*dp_stopf_t), (struct dpeth *dep) ); _PROTOTYPE( typedef void (*dp_user2nicf_t), (struct dpeth *dep, struct iovec_dat *iovp, vir_bytes offset, int nic_addr, vir_bytes count) ); _PROTOTYPE( typedef void (*dp_nic2userf_t), (struct dpeth *dep, int nic_addr, struct iovec_dat *iovp, vir_bytes offset, vir_bytes count) ); #if 0 _PROTOTYPE( typedef void (*dp_getheaderf_t), (struct dpeth *dep, int page, struct dp_rcvhdr *h, u16_t *eth_type) ); #endif _PROTOTYPE( typedef void (*dp_getblock_t), (struct dpeth *dep, int page, size_t offset, size_t size, void *dst) ); /* iovectors are handled IOVEC_NR entries at a time. */ #define IOVEC_NR 16 typedef struct iovec_dat { iovec_t iod_iovec[IOVEC_NR]; int iod_iovec_s; int iod_proc_nr; vir_bytes iod_iovec_addr; } iovec_dat_t; #define SENDQ_NR 2 /* Maximum size of the send queue */ #define SENDQ_PAGES 6 /* 6 * DP_PAGESIZE >= 1514 bytes */ typedef struct dpeth { /* The de_base_port field is the starting point of the probe. * The conf routine also fills de_linmem and de_irq. If the probe * routine knows the irq and/or memory address because they are * hardwired in the board, the probe should modify these fields. * Futhermore, the probe routine should also fill in de_initf and * de_stopf fields with the appropriate function pointers and set * de_prog_IO iff programmed I/O is to be used. */ port_t de_base_port; phys_bytes de_linmem; int de_irq; dp_initf_t de_initf; dp_stopf_t de_stopf; int de_prog_IO; char de_name[sizeof("dp8390#n")]; /* The initf function fills the following fields. Only cards that do * programmed I/O fill in the de_pata_port field. * In addition, the init routine has to fill in the sendq data * structures. */ ether_addr_t de_address; port_t de_dp8390_port; port_t de_data_port; int de_16bit; int de_ramsize; int de_offset_page; int de_startpage; int de_stoppage; /* Do it yourself send queue */ struct sendq { int sq_filled; /* this buffer contains a packet */ int sq_size; /* with this size */ int sq_sendpage; /* starting page of the buffer */ } de_sendq[SENDQ_NR]; int de_sendq_nr; int de_sendq_head; /* Enqueue at the head */ int de_sendq_tail; /* Dequeue at the tail */ /* Shared memory segment and offset based on de_linmem. */ u16_t de_memseg; vir_bytes de_memoff; /* Fields for internal use by the dp8390 driver. */ int de_flags; int de_mode; eth_stat_t de_stat; iovec_dat_t de_read_iovec; iovec_dat_t de_write_iovec; iovec_dat_t de_tmp_iovec; vir_bytes de_read_s; int de_client; message de_sendmsg; dp_user2nicf_t de_user2nicf; dp_nic2userf_t de_nic2userf; dp_getblock_t de_getblockf; } dpeth_t; #define DEI_DEFAULT 0x8000 #define DEF_EMPTY 0x000 #define DEF_PACK_SEND 0x001 #define DEF_PACK_RECV 0x002 #define DEF_SEND_AVAIL 0x004 #define DEF_READING 0x010 #define DEF_PROMISC 0x040 #define DEF_MULTI 0x080 #define DEF_BROAD 0x100 #define DEF_ENABLED 0x200 #define DEF_STOPPED 0x400 #define DEM_DISABLED 0x0 #define DEM_SINK 0x1 #define DEM_ENABLED 0x2 #if !__minix_vmd #define debug 0 /* Standard Minix lacks debug variable */ #endif /* * $PchId: dp8390.h,v 1.5 1995/12/22 08:53:00 philip Exp $ */ /* This file contains device independent device driver interface. * Author: Kees J. Bot. * * The drivers support the following operations (using message format m2): * * m_type DEVICE PROC_NR COUNT POSITION ADRRESS * ---------------------------------------------------------------- * | DEV_OPEN | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_CLOSE | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_READ | device | proc nr | bytes | offset | buf ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_WRITE | device | proc nr | bytes | offset | buf ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_GATHER | device | proc nr | iov len | offset | iov ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_SCATTER| device | proc nr | iov len | offset | iov ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_IOCTL | device | proc nr |func code| | buf ptr | * ---------------------------------------------------------------- * * The file contains one entry point: * * driver_task: called by the device dependent task entry * * * Constructed 92/04/02 by Kees J. Bot from the old AT wini and floppy driver. */ #include "kernel.h" #include #include "driver.h" #if (CHIP == INTEL) #if ENABLE_AHA1540_SCSI && DMA_BUF_SIZE < 2048 /* A bit extra scratch for the Adaptec driver. */ #define BUF_EXTRA (2048 - DMA_BUF_SIZE) #else #define BUF_EXTRA 0 #endif /* Claim space for variables. */ PRIVATE u8_t buffer[(unsigned) 2 * DMA_BUF_SIZE + BUF_EXTRA]; u8_t *tmp_buf; /* the DMA buffer eventually */ phys_bytes tmp_phys; /* phys address of DMA buffer */ #else /* CHIP != INTEL */ /* Claim space for variables. */ u8_t tmp_buf[DMA_BUF_SIZE]; /* the DMA buffer */ phys_bytes tmp_phys; /* phys address of DMA buffer */ #endif /* CHIP != INTEL */ FORWARD _PROTOTYPE( void init_buffer, (void) ); FORWARD _PROTOTYPE( int do_rdwt, (struct driver *dr, message *mp) ); FORWARD _PROTOTYPE( int do_vrdwt, (struct driver *dr, message *mp) ); /*===========================================================================* * driver_task * *===========================================================================*/ PUBLIC void driver_task(dp) struct driver *dp; /* Device dependent entry points. */ { /* Main program of any device driver task. */ int r, caller, proc_nr; message mess; init_buffer(); /* Get a DMA buffer. */ /* Here is the main loop of the disk task. It waits for a message, carries * it out, and sends a reply. */ while (TRUE) { /* First wait for a request to read or write a disk block. */ receive(ANY, &mess); caller = mess.m_source; proc_nr = mess.PROC_NR; /* Check if legitimate caller: FS or a task. */ if (caller != FS_PROC_NR && caller >= 0) { printf("%s: got message from %d\n", (*dp->dr_name)(), caller); continue; } /* Now carry out the work. */ switch(mess.m_type) { case DEV_OPEN: r = (*dp->dr_open)(dp, &mess); break; case DEV_CLOSE: r = (*dp->dr_close)(dp, &mess); break; case DEV_IOCTL: r = (*dp->dr_ioctl)(dp, &mess); break; case DEV_READ: case DEV_WRITE: r = do_rdwt(dp, &mess); break; case DEV_GATHER: case DEV_SCATTER: r = do_vrdwt(dp, &mess); break; case HARD_INT: /* Leftover interrupt or expired timer. */ continue; default: r = EINVAL; break; } /* Clean up leftover state. */ (*dp->dr_cleanup)(); /* Finally, prepare and send the reply message. */ mess.m_type = TASK_REPLY; mess.REP_PROC_NR = proc_nr; mess.REP_STATUS = r; /* # of bytes transferred or error code */ send(caller, &mess); /* send reply to caller */ } } /*===========================================================================* * init_buffer * *===========================================================================*/ PRIVATE void init_buffer() { /* Select a buffer that can safely be used for dma transfers. It may also * be used to read partition tables and such. Its absolute address is * 'tmp_phys', the normal address is 'tmp_buf'. */ #if (CHIP == INTEL) unsigned left; tmp_buf = buffer; tmp_phys = vir2phys(buffer); if ((left = dma_bytes_left(tmp_phys)) < DMA_BUF_SIZE) { /* First half of buffer crosses a 64K boundary, can't DMA into that */ tmp_buf += left; tmp_phys += left; } #else /* CHIP != INTEL */ tmp_phys = vir2phys(tmp_buf); #endif /* CHIP != INTEL */ } /*===========================================================================* * do_rdwt * *===========================================================================*/ PRIVATE int do_rdwt(dp, mp) struct driver *dp; /* device dependent entry points */ message *mp; /* pointer to read or write message */ { /* Carry out a single read or write request. */ iovec_t iovec1; int r, opcode; phys_bytes phys_addr; /* Disk address? Address and length of the user buffer? */ if (mp->COUNT < 0) return(EINVAL); /* Check the user buffer. */ phys_addr = numap(mp->PROC_NR, (vir_bytes) mp->ADDRESS, mp->COUNT); if (phys_addr == 0) return(EFAULT); /* Prepare for I/O. */ if ((*dp->dr_prepare)(mp->DEVICE) == NIL_DEV) return(ENXIO); /* Create a one element scatter/gather vector for the buffer. */ opcode = mp->m_type == DEV_READ ? DEV_GATHER : DEV_SCATTER; iovec1.iov_addr = (vir_bytes) mp->ADDRESS; iovec1.iov_size = mp->COUNT; /* Transfer bytes from/to the device. */ r = (*dp->dr_transfer)(mp->PROC_NR, opcode, mp->POSITION, &iovec1, 1); /* Return the number of bytes transferred or an error code. */ return(r == OK ? (mp->COUNT - iovec1.iov_size) : r); } /*==========================================================================* * do_vrdwt * *==========================================================================*/ PRIVATE int do_vrdwt(dp, mp) struct driver *dp; /* device dependent entry points */ message *mp; /* pointer to read or write message */ { /* Carry out an device read or write to/from a vector of user addresses. * The "user addresses" are assumed to be safe, i.e. FS transferring to/from * its own buffers, so they are not checked. */ static iovec_t iovec[NR_IOREQS]; iovec_t *iov; phys_bytes iovec_phys, user_iovec_phys; size_t iovec_size; unsigned nr_req; int r; nr_req = mp->COUNT; /* Length of I/O vector */ if (mp->m_source < 0) { /* Called by a task, no need to copy vector. */ iov = (iovec_t *) mp->ADDRESS; } else { /* Copy the vector from the caller to kernel space. */ if (nr_req > NR_IOREQS) nr_req = NR_IOREQS; iovec_size = nr_req * sizeof(iovec[0]); user_iovec_phys = numap(mp->m_source, (vir_bytes) mp->ADDRESS, iovec_size); if (user_iovec_phys == 0) panic("bad I/O vector by", mp->m_source); iovec_phys = vir2phys(iovec); phys_copy(user_iovec_phys, iovec_phys, (phys_bytes) iovec_size); iov = iovec; } /* Prepare for I/O. */ if ((*dp->dr_prepare)(mp->DEVICE) == NIL_DEV) return(ENXIO); /* Transfer bytes from/to the device. */ r = (*dp->dr_transfer)(mp->PROC_NR, mp->m_type, mp->POSITION, iov, nr_req); /* Copy the I/O vector back to the caller. */ if (mp->m_source >= 0) { phys_copy(iovec_phys, user_iovec_phys, (phys_bytes) iovec_size); } return(r); } /*===========================================================================* * no_name * *===========================================================================*/ PUBLIC char *no_name() { /* If no specific name for the device. */ return(tasktab[proc_number(proc_ptr) + NR_TASKS].name); } /*============================================================================* * do_nop * *============================================================================*/ PUBLIC int do_nop(dp, mp) struct driver *dp; message *mp; { /* Nothing there, or nothing to do. */ switch (mp->m_type) { case DEV_OPEN: return(ENODEV); case DEV_CLOSE: return(OK); case DEV_IOCx+z+{+|+TL: return(ENOTTY); default: return(EIO); } } /*===========================================================================* * nop_prepare * *===========================================================================*/ PUBLIC struct device *nop_prepare(device) { /* Nothing to prepare for. */ return(NIL_DEV); } /*===========================================================================* * nop_cleanup * *===========================================================================*/ PUBLIC void nop_cleanup() { /* Nothing to clean up. */ } /*===========================================================================* * nop_task * *===========================================================================*/ PUBLIC void nop_task() { /* Unused controllers are "serviced" by this task. */ struct driver nop_tab = { no_name, do_nop, do_nop, do_nop, nop_prepare, NULL, nop_cleanup, NULL, }; driver_task(&nop_tab); } /*===========================================================================* * clock_mess * *===========================================================================*/ PUBLIC void clock_mess(ticks, func) int ticks; /* how many clock ticks to wait */ watchdog_t func; /* function to call upon time out */ { /* Send the clock task a message. */ message mess; mess.m_type = SET_ALARM; mess.CLOCK_PROC_NR = proc_number(proc_ptr); mess.DELTA_TICKS = (long) ticks; mess.FUNC_TO_CALL = (sighandler_t) func; sendrec(CLOCK, &mess); } /*============================================================================* * do_diocntl * *============================================================================*/ PUBLIC int do_diocntl(dp, mp) struct driver *dp; message *mp; /* pointer to ioctl request */ { /* Carry out a partition setting/getting request. */ struct device *dv; phys_bytes user_phys, entry_phys; struct partition entry; if (mp->REQUEST != DIOCSETP && mp->REQUEST != DIOCGETP) return(ENOTTY); /* Decode the message parameters. */ if ((dv = (*dp->dr_prepare)(mp->DEVICE)) == NIL_DEV) return(ENXIO); user_phys = numap(mp->PROC_NR, (vir_bytes) mp->ADDRESS, sizeof(entry)); if (user_phys == 0) return(EFAULT); entry_phys = vir2phys(&entry); if (mp->REQUEST == DIOCSETP) { /* Copy just this one partition table entry. */ phys_copy(user_phys, entry_phys, (phys_bytes) sizeof(entry)); dv->dv_base = entry.base; dv->dv_size = entry.size; } else { /* Return a partition table entry and the geometry of the drive. */ entry.base = dv->dv_base; entry.size = dv->dv_size; (*dp->dr_geometry)(&entry); phys_copy(entry_phys, user_phys, (phys_bytes) sizeof(entry)); } return(OK); } /* Types and constants shared between the generic and device dependent * device driver code. */ #include #include #include "proc.h" #include #include /* Info about and entry points into the device dependent code. */ struct driver { _PROTOTYPE( char *(*dr_name), (void) ); _PROTOTYPE( int (*dr_open), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( int (*dr_close), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( int (*dr_ioctl), (struct driver *dp, message *m_ptr) ); _PROTOTYPE( struct device *(*dr_prepare), (int device) ); _PROTOTYPE( int (*dr_transfer), (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); _PROTOTYPE( void (*dr_cleanup), (void) ); _PROTOTYPE( void (*dr_geometry), (struct partition *entry) ); }; #if (CHIP == INTEL) /* Number of bytes you can DMA before hitting a 64K boundary: */ #define dma_bytes_left(phys) \ ((unsigned) (sizeof(int) == 2 ? 0 : 0x10000) - (unsigned) ((phys) & 0xFFFF)) #endif /* CHIP == INTEL */ /* Base and size of a partition in bytes. */ struct device { u64_t dv_base; u64_t dv_size; }; #define NIL_DEV ((struct device *) 0) /* Functions defined by driver.c: */ _PROTOTYPE( void driver_task, (struct driver *dr) ); _PROTOTYPE( char *no_name, (void) ); _PROTOTYPE( int do_nop, (struct driver *dp, message *m_ptr) ); _PROTOTYPE( struct device *nop_prepare, (int device) ); _PROTOTYPE( void nop_cleanup, (void) ); _PROTOTYPE( void clock_mess, (int ticks, watchdog_t func) ); _PROTOTYPE( int do_diocntl, (struct driver *dr, message *m_ptr) ); /* Parameters for the disk drive. */ #define SECTOR_SIZE 512 /* physical sector size in bytes */ #define SECTOR_SHIFT 9 /* for division */ #define SECTOR_MASK 511 /* and remainder */ /* Size of the DMA buffer buffer in bytes. */ #define DMA_BUF_SIZE (DMA_SECTORS * SECTOR_SIZE) #if (CHIP == INTEL) extern u8_t *tmp_buf; /* the DMA buffer */ #else extern u8_t tmp_buf[]; /* the DMA buffer */ #endif extern phys_bytes tmp_phys; /* phys address of DMA buffer */ /* IBM device driver utility functions. Author: Kees J. Bot * 7 Dec 1995 * Entry point: * partition: partition a disk to the partition table(s) on it. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" /* Extended partition? */ #define ext_part(s) ((s) == 0x05 || (s) == 0x0F) FORWARD _PROTOTYPE( void extpartition, (struct driver *dp, int extdev, unsigned long extbase) ); FORWARD _PROTOTYPE( int get_part_table, (struct driver *dp, int device, unsigned long offset, struct part_entry *table) ); FORWARD _PROTOTYPE( void sort, (struct part_entry *table) ); /*============================================================================* * partition * *============================================================================*/ PUBLIC void partition(dp, device, style) struct driver *dp; /* device dependent entry points */ int device; /* device to partition */ int style; /* partitioning style: floppy, primary, sub. */ { /* This routine is called on first open to initialize the partition tables * of a device. It makes sure that each partition falls safely within the * device's limits. Depending on the partition style we are either making * floppy partitions, primary partitions or subpartitions. Only primary * partitions are sorted, because they are shared with other operating * systems that expect this. */ struct part_entry table[NR_PARTITIONS], *pe; int disk, par; struct device *dv; unsigned long base, limit, part_limit; /* Get the geometry of the device to partition */ if ((dv = (*dp->dr_prepare)(device)) == NIL_DEV || cmp64u(dv->dv_size, 0) == 0) return; base = div64u(dv->dv_base, SECTOR_SIZE); limit = base + div64u(dv->dv_size, SECTOR_SIZE); /* Read the partition table for the device. */ if (!get_part_table(dp, device, 0L, table)) return; /* Compute the device number of the first partition. */ switch (style) { case P_FLOPPY: device += MINOR_fd0p0; break; case P_PRIMARY: sort(table); /* sort a primary partition table */ device += 1; break; case P_SUB: disk = device / DEV_PER_DRIVE; par = device % DEV_PER_DRIVE - 1; device = MINOR_d0p0s0 + (disk * NR_PARTITIONS + par) * NR_PARTITIONS; } /* Find an array of devices. */ if ((dv = (*dp->dr_prepare)(device)) == NIL_DEV) return; /* Set the geometry of the partitions from the partition table. */ for (par = 0; par < NR_PARTITIONS; par++, dv++) { /* Shrink the partition to fit within the device. */ pe = &table[par]; part_limit = pe->lowsec + pe->size; if (part_limit < pe->lowsec) part_limit = limit; if (part_limit > limit) part_limit = limit; if (pe->lowsec < base) pe->lowsec = base; if (part_limit < pe->lowsec) part_limit = pe->lowsec; dv->dv_base = mul64u(pe->lowsec, SECTOR_SIZE); dv->dv_size = mul64u(part_limit - pe->lowsec, SECTOR_SIZE); if (style == P_PRIMARY) { /* Each Minix primary partition can be subpartitioned. */ if (pe->sysind == MINIX_PART) partition(dp, device + par, P_SUB); /* An extended partition has logical partitions. */ if (ext_part(pe->sysind)) extpartition(dp, device + par, pe->lowsec); } } } /*============================================================================* * extpartition * *============================================================================*/ PRIVATE void extpartition(dp, extdev, extbase) struct driver *dp; /* device dependent entry points */ int extdev; /* extended partition to scan */ unsigned long extbase; /* sector offset of the base extended partition */ { /* Extended partitions cannot be ignored alas, because people like to move * files to and from DOS partitions. Avoid reading this code, it's no fun. */ struct part_entry table[NR_PARTITIONS], *pe; int subdev, disk, par; struct device *dv; unsigned long offset, nextoffset; disk = extdev / DEV_PER_DRIVE; par = extdev % DEV_PER_DRIVE - 1; subdev = MINOR_d0p0s0 + (disk * NR_PARTITIONS + par) * NR_PARTITIONS; offset = 0; do { if (!get_part_table(dp, extdev, offset, table)) return; sort(table); /* The table should contain one logical partition and optionally * another extended partition. (It's a linked list.) */ nextoffset = 0; for (par = 0; par < NR_PARTITIONS; par++) { pe = &table[par]; if (ext_part(pe->sysind)) { nextoffset = pe->lowsec; } else if (pe->sysind != NO_PART) { if ((dv = (*dp->dr_prepare)(subdev)) == NIL_DEV) return; dv->dv_base = mul64u(extbase + offset + pe->lowsec, SECTOR_SIZE); dv->dv_size = mul64u(pe->size, SECTOR_SIZE); /* Out of devices? */ if (++subdev % NR_PARTITIONS == 0) return; } } } while ((offset = nextoffset) != 0); } /*============================================================================* * get_part_table * *============================================================================*/ PRIVATE int get_part_table(dp, device, offset, table) struct driver *dp; int device; unsigned long offset; /* sector offset to the table */ struct part_entry *table; /* four entries */ { /* Read the partition table for the device, return true iff there were no * errors. */ iovec_t iovec1; off_t position; int proc_nr; /* Read the partition table at 'offset'. */ proc_nr = proc_number(proc_ptr); position = offset << SECTOR_SHIFT; iovec1.iov_addr = (vir_bytes) tmp_buf; iovec1.iov_size = SECTOR_SIZE; if ((*dp->dr_prepare)(device) != NIL_DEV) { (void) (*dp->dr_transfer)(proc_nr, DEV_GATHER, position, &iovec1, 1); } if (iovec1.iov_size != 0) { printf("%s: can't read partition table\n", (*dp->dr_name)()); return 0; } if (tmp_buf[510] != 0x55 || tmp_buf[511] != 0xAA) { /* Invalid partition table. */ return 0; } memcpy(table, (tmp_buf + PART_TABLE_OFF), NR_PARTITIONS * sizeof(table[0])); return 1; } /*===========================================================================* * sort * *===========================================================================*/ PRIVATE void sort(table) struct part_entry *table; { /* Sort a partition table. */ struct part_entry *pe, tmp; int n = NR_PARTITIONS; do { for (pe = table; pe < table + NR_PARTITIONS-1; pe++) { if (pe[0].sysind == NO_PART || (pe[0].lowsec > pe[1].lowsec && pe[1].sysind != NO_PART)) { tmp = pe[0]; pe[0] = pe[1]; pe[1] = tmp; } } } while (--n > 0); } /* IBM device driver definitions Author: Kees J. Bot * 7 Dec 1995 */ #include _PROTOTYPE( void partition, (struct driver *dr, int device, int style) ); /* BIOS parameter table layout. */ #define bp_cylinders(t) (* (u16_t *) (&(t)[0])) #define bp_heads(t) (* (u8_t *) (&(t)[2])) #define bp_reduced_wr(t) (* (u16_t *) (&(t)[3])) #define bp_precomp(t) (* (u16_t *) (&(t)[5])) #define bp_max_ecc(t) (* (u8_t *) (&(t)[7])) #define bp_ctlbyte(t) (* (u8_t *) (&(t)[8])) #define bp_landingzone(t) (* (u16_t *) (&(t)[12])) #define bp_sectors(t) (* (u8_t *) (&(t)[14])) /* Miscellaneous. */ #define DEV_PER_DRIVE (1 + NR_PARTITIONS) #define MINOR_t0 64 #define MINOR_r0 120 #define MINOR_d0p0s0 128 #define MINOR_fd0p0 (28<<2) #define P_FLOPPY 0 #define P_PRIMARY 1 #define P_SUB 2 /* device dependent part of a hard disk driver for ibm ps/2 esdi adapter * * written by doug burks, based on other minix wini drivers. * some additions by art roberts * * references: * ibm personal system/2 hardware technical reference (1988) * ibm 60/120mb fixed disk drive technical reference (1988) * * caveats: * * this driver has been reported to work on ibm ps/2 models 50 and * 70 with ibm's 60/120mb hard disks. * * for a true esdi adapter, changes will have to be made, but this * certainly serves as a good start. * * no timeouts are implemented, so this driver could hang under * adverse conditions. * * the error processing has not been tested. my disk works too well. * * The file contains one entry point: * * esdi_winchester_task: main entry when system is brought up * * * Changes: * 3 May 1992 by Kees J. Bot: device dependent/independent split. * 27 May 2000 by Kees J. Bot: d-d/i rewrite. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #if ENABLE_ESDI_WINI /* If the DMA buffer is large enough then use it always. */ #define USE_BUF (DMA_BUF_SIZE > BLOCK_SIZE) /***** esdi i/o adapter ports */ #define CMD_REG 0x3510 /* command interface register */ #define STAT_REG 0x3510 /* status interface register */ #define BCTL_REG 0x3512 /* basic control register */ #define BST_REG 0x3512 /* basic status register */ #define ATT_REG 0x3513 /* attention register */ #define INT_REG 0x3513 /* interrupt status register */ /***** basic status register bits */ #define DMA_ENA 0x80 /* DMA enabled? */ #define INT_PND 0x40 /* interrupt pending? */ #define CMD_PRG 0x20 /* command in progress? */ #define BUSY 0x10 /* is adapter busy? */ #define STR_FUL 0x08 /* status interface register set? */ #define CMD_FUL 0x04 /* command interface register full? */ #define XFR_REQ 0x02 /* data transfer operation ready? */ #define INT_SET 0x01 /* adapter sending interrupt? */ /***** attention register commands */ #define ATT_CMD 0x01 /* command request */ #define ATT_EOI 0x02 /* end of interrupt processing */ #define ATT_ABT 0x03 /* abort the current command */ #define ATT_RST 0xE4 /* reset the esdi adapter */ /***** dma register addresses */ #define DMA_EXTCMD 0x18 /* extended function register */ #define DMA_EXEC 0x1A /* extended function execute */ /***** miscellaneous */ #define ERR (-1) /* general error code */ #define MAX_ERRORS 4 /* maximum number of read/write retries */ #define MAX_DRIVES 2 /* maximum number of physical drives */ #define NR_DEVICES (MAX_DRIVES*DEV_PER_DRIVE) /* Maximum number of logical devices */ #define SUB_PER_DRIVE (NR_PARTITIONS * NR_PARTITIONS) #define NR_SUBDEVS (MAX_DRIVES * SUB_PER_DRIVE) #define SYS_PORTA 0x92 /* system control port a */ #define LIGHT_ON 0xC0 /* fixed-disk activity light reg. mask */ /***** variables */ PRIVATE struct wini { /* disk/partition information */ unsigned open_ct; /* in-use count */ struct device part[DEV_PER_DRIVE]; /* disks and partitions */ struct device subpart[SUB_PER_DRIVE]; /* subpartitions */ } wini[MAX_DRIVES], *w_wn; PRIVATE int win_tasknr; /* my task number */ PRIVATE int nr_drives; /* actual number of physical disk drive */ PRIVATE int command[4]; /* controller command buffer */ PRIVATE unsigned int status_block[9]; /* status block output from a command */ PRIVATE int dma_channel; /* fixed disk dma channel number */ PRIVATE int w_drive; /* selected drive */ PRIVATE int w_istat; /* interrupt status of last command */ PRIVATE struct device *w_dv; /* device's base and size */ /***** functions */ FORWARD _PROTOTYPE( struct device *w_prepare, (int device) ); FORWARD _PROTOTYPE( char *w_name, (void) ); FORWARD _PROTOTYPE( int w_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int w_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void w_init, (void) ); FORWARD _PROTOTYPE( int w_command, (int device, int cmd, int num_words) ); FORWARD _PROTOTYPE( int w_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int w_1rdwt, (int opcode, unsigned long block, phys_bytes address, unsigned count) ); FORWARD _PROTOTYPE( int w_att_write, (int value) ); FORWARD _PROTOTYPE( void w_interrupt, (int dma) ); FORWARD _PROTOTYPE( int w_handler, (int irq) ); FORWARD _PROTOTYPE( void w_dma_setup, (int opcode, phys_bytes address, unsigned count) ); FORWARD _PROTOTYPE( void w_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver w_dtab = { w_name, /* current device's name */ w_do_open, /* open or mount request, initialize device */ w_do_close, /* release device */ do_diocntl, /* get or set a partition's geometry */ w_prepare, /* prepare for I/O on a given minor device */ w_transfer, /* do the I/O */ nop_cleanup, /* no cleanup needed */ w_geometry /* tell the geometry of the disk */ }; /*===========================================================================* * esdi_winchester_task * *===========================================================================*/ PUBLIC void esdi_winchester_task() { win_tasknr = proc_number(proc_ptr); driver_task(&w_dtab); } /*===========================================================================* * w_prepare * *===========================================================================*/ PRIVATE struct device *w_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DEVICES) { /* d0, d0p[0-3], d1, ... */ w_drive = device / DEV_PER_DRIVE; /* save drive number */ w_wn = &wini[w_drive]; w_dv = &w_wn->part[device % DEV_PER_DRIVE]; } else if ((unsigned) (device -= MINOR_d0p0s0) < NR_SUBDEVS) {/*d[0-7]p[0-3]s[0-3]*/ w_drive = device / SUB_PER_DRIVE; w_wn = &wini[w_drive]; w_dv = &w_wn->subpart[device % SUB_PER_DRIVE]; } else { return(NIL_DEV); } return(w_drive < nr_drives ? w_dv : NIL_DEV); } /*===========================================================================* * w_name * *===========================================================================*/ PRIVATE char *w_name() { /* Return a name for the current device. */ static char name[] = "esdi-d0"; name[6] = '0' + w_drive; return name; } /*============================================================================* * w_do_open * *============================================================================*/ PRIVATE int w_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device open: Initialize the controller and read the partition table. */ static int init_done = FALSE; if (!init_done) { w_init(); init_done = TRUE; } if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); if (w_wn->open_ct++ == 0) { /* partition the disk */ partition(&w_dtab, w_drive * DEV_PER_DRIVE, P_PRIMARY); } return(OK); } /*============================================================================* * w_do_close * *============================================================================*/ PRIVATE int w_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device close: Release a device. */ if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); w_wn->open_ct--; return(OK); } /*============================================================================* * w_init * *========================================================================+++++++++++++++====*/ PRIVATE void w_init() { /* initializes everything needed to run the hard disk * * the following items are initialized: * -- hard disk attributes stored in bios * -- dma transfer channel, read from system register * -- dma transfer and interrupts [disabled] * * the hard disk adapter is initialized when the ibm ps/2 is turned on, * using the programmable option select registers. thus the only * additional initialization is making sure the dma transfer and interrupts * are disabled. other initialization problems could be checked for, such * as an operation underway. the paranoid could add a check for adapter * activity and abort the operations. the truly paranoid can reset the * adapter. until such worries are proven, why bother? */ unsigned int drive; /* hard disk drive number */ unsigned long size; /* hard disk size */ /* get the number of drives from the bios */ phys_copy(0x475L, tmp_phys, 1L); nr_drives = tmp_buf[0]; if (nr_drives > MAX_DRIVES) nr_drives = MAX_DRIVES; put_irq_handler(AT_WINI_IRQ, w_handler); enable_irq(AT_WINI_IRQ); /* ready for winchester interrupts */ for (drive = 0; drive < nr_drives; ++drive) { (void) w_prepare(drive * DEV_PER_DRIVE); if (w_command(drive, 0x0609, 6) != OK) { printf("%s: unable to get parameters\n", w_name()); nr_drives = drive; break; } /* size of the drive */ size = ((unsigned long) status_block[2] << 0) | ((unsigned long) status_block[3] << 16); if (drive == 0) { if (w_command(7, 0x060A, 5) != OK) { printf("%s: unable to get dma channel\n", w_name()); nr_drives = 0; return; } dma_channel = (status_block[2] & 0x3C00) >> 10; } printf("%s: %lu sectors\n", w_name(), size); w_wn->part[0].dv_size = mul64u(size, SECTOR_SIZE); } } /*===========================================================================* * w_command * *===========================================================================*/ PRIVATE int w_command(device, cmd, num_words) int device; /* i device to operate on */ /* 1-2 physical disk drive number */ /* 7 hard disk controller */ int cmd; /* i command to execute */ int num_words; /* i expected size of status block */ { /* executes a command for a particular device * * the operation is conducted as follows: * -- create the command block * -- initialize for command reading by the controller * -- write the command block to the controller, making sure the * controller has digested the previous command word, before shoving * the next down its throat * -- wait for an interrupt * -- read expected number of words of command status information * -- return the command status block * * reading and writing registers is accompanied by enabling and disabling * interrupts to ensure that the status register contents still apply when * the desired register is read/written. */ register int ki; /* -- scratch -- */ int status; /* disk adapter status register value */ device <<= 5; /* adjust device for our use */ command[0] = cmd | device; /* build command block */ command[1] = 0; w_att_write(device | ATT_CMD); for (ki = 0; ki < 2; ++ki) { out_word(CMD_REG, command[ki]); unlock(); while (TRUE) { lock(); status = in_byte(BST_REG); if (!(status & CMD_FUL)) break; unlock(); } } unlock(); w_interrupt(0); if (w_istat != (device | 0x01)) { w_att_write(device | ATT_ABT); w_interrupt(0); return(ERR); } for (ki = 0; ki < num_words; ++ki) { while (TRUE) { lock(); status = in_byte(BST_REG); if (status & STR_FUL) break; unlock(); } status_block[ki] = in_word(STAT_REG); unlock(); } w_att_write(device | ATT_EOI); return(OK); } /*===========================================================================* * w_transfer * *===========================================================================*/ PRIVATE int w_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { iovec_t *iop, *iov_end = iov + nr_req; int r, errors; unsigned nbytes, count, chunk, dma_count; unsigned long block; unsigned long dv_size = cv64ul(w_dv->dv_size); phys_bytes dma_phys; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); /* Check disk address. */ if ((position & SECTOR_MASK) != 0) return(EINVAL); errors = 0; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) { if (USE_BUF && nbytes + iop->iov_size > DMA_BUF_SIZE) { /* Don't do half a segment if you can avoid it. */ if (nbytes == 0) nbytes = DMA_BUF_SIZE; break; } nbytes += iop->iov_size; if ((nbytes & SECTOR_MASK) != 0) return(EINVAL); } /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE); /* Degrade to per-sector mode if there were errors. */ if (errors > 0) nbytes = SECTOR_SIZE; if (!USE_BUF) { /* How many bytes can be found on consecutive chunks? */ dma_phys = user_base + iov[0].iov_addr; count = 0; for (iop = iov; count < nbytes; iop++) { if (iop->iov_addr != iov[0].iov_addr + count) break; count += iop->iov_size; } if (count < nbytes) nbytes = count; } else { dma_phys = tmp_phys; if (opcode == DEV_SCATTER) { /* Copy from user space to the DMA buffer. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(user_base + iop->iov_addr, dma_phys + count, (phys_bytes) chunk); count += chunk; } } } /* Turn on the disk activity light. */ out_byte(SYS_PORTA, in_byte(SYS_PORTA) | LIGHT_ON); /* Perform the transfer. */ r = w_1rdwt(opcode, block, dma_phys, nbytes); /* Turn off the disk activity light. */ out_byte(SYS_PORTA, in_byte(SYS_PORTA) & ~LIGHT_ON); if (r != OK) { /* An error occurred, try again sector by sector unless */ if (++errors == MAX_ERRORS) return(EIO); continue; } if (USE_BUF && opcode == DEV_GATHER) { /* Copy from the DMA buffer to user space. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(dma_phys + count, user_base + iop->iov_addr, (phys_bytes) chunk); count += chunk; } } /* Book the bytes successfully transferred. */ position += nbytes; for (;;) { if (nbytes < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += nbytes; iov->iov_size -= nbytes; break; } nbytes -= iov->iov_size; iov->iov_addr += iov->iov_size; iov->iov_size = 0; if (nbytes == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*===========================================================================* * w_1rdwt * *===========================================================================*/ PRIVATE int w_1rdwt(opcode, block, address, count) int opcode; /* DEV_GATHER or DEV_SCATTER */ unsigned long block; /* block on disk */ phys_bytes address; /* address in memory */ unsigned int count; /* bytes to transfer */ { /* reads/writes a single block of data from/to the hard disk * * the read/write operation performs the following steps: * -- create the command block * -- initialize the command reading by the controller * -- write the command block to the controller, making sure the * controller has digested the previous command word, before * shoving the next down its throat. * -- wait for an interrupt, which must return a 'data transfer ready' * status. abort the command if it doesn't. * -- set up and start up the direct memory transfer * -- wait for an interrupt, signalling the end of the transfer */ int device; /* device mask for the command register */ int ki; /* -- scratch -- */ int status; /* basic status register value */ device = w_drive << 5; command[0] = (opcode == DEV_SCATTER ? 0x4602 : 0x4601) | device; command[1] = count >> SECTOR_SHIFT; command[2] = (int) (block & 0xFFFF); command[3] = (int) (block >> 16); w_att_write(device | ATT_CMD); for (ki = 0; ki < 4; ++ki) { out_word(CMD_REG, command[ki]); unlock(); while (TRUE) { lock(); status = in_byte(BST_REG); if (!(status & CMD_FUL)) break; unlock(); } } unlock(); w_interrupt(0); if (w_istat != (device | 0x0B)) { w_att_write(device | ATT_ABT); w_interrupt(0); return(ERR); } w_dma_setup(opcode, address, count); w_interrupt(1); w_att_write(device | ATT_EOI); if ((w_istat & 0x0F) > 8) return(ERR); return(OK); } /*==========================================================================* * w_att_write * *==========================================================================*/ PRIVATE int w_att_write(value) register int value; { /* writes a command to the esdi attention register * * waits for the controller to finish its business before sending the * command to the controller. note that the interrupts must be off to read * the basic status register and, if the controller is ready, must not be * turned back on until the attention register command is sent. */ int status; /* basic status register value */ while (TRUE) { lock(); status = in_byte(BST_REG); if (!(status & (INT_PND | BUSY))) break; unlock(); } out_byte(ATT_REG, value); unlock(); return(OK); } /*===========================================================================* * w_interrupt * *===========================================================================*/ PRIVATE void w_interrupt(dma) int dma; /* i dma transfer is underway */ { /* waits for an interrupt from the hard disk controller * * enable interrupts on the hard disk and interrupt controllers (and dma if * necessary). wait for an interrupt. when received, return the interrupt * status register value. * * an interrupt can be detected either from the basic status register or * through a system interrupt handler. the handler is used for all * interrupts, due to the expected long times to process reads and writes * and to avoid busy waits. */ message dummy; /* -- scratch -- */ out_byte(BCTL_REG, dma ? 0x03 : 0x01); receive(HARDWARE, &dummy); out_byte(BCTL_REG, 0); if (dma) out_byte(DMA_EXTCMD, 0x90 + dma_channel); } /*==========================================================================* * w_handler * *==========================================================================*/ PRIVATE int w_handler(irq) int irq; { /* Disk interrupt, send message to winchester task and reenable interrupts. */ w_istat = in_byte(INT_REG); interrupt(win_tasknr); return 1; } /*==========================================================================* * w_dma_setup * *==========================================================================*/ PRIVATE void w_dma_setup(opcode, address, count) int opcode; phys_bytes address; unsigned int count; { /* programs the dma controller to move data to and from the hard disk. * * uses the extended mode operation of the ibm ps/2 interrupt controller * chip, rather than the intel 8237 (pc/at) compatible mode. */ lock(); out_byte(DMA_EXTCMD, 0x90 + dma_channel); /* Disable access to dma channel 5 */ out_byte(DMA_EXTCMD, 0x20 + dma_channel); /* Clear the address byte pointer */ out_byte(DMA_EXEC, (int) address >> 0); /* address bits 0..7 */ out_byte(DMA_EXEC, (int) address >> 8); /* address bits 8..15 */ out_byte(DMA_EXEC, (int) (address >> 16)); /* address bits 16..19 */ out_byte(DMA_EXTCMD, 0x40 + dma_channel); /* Clear the count byte pointer */ out_byte(DMA_EXEC, (count - 1) >> 0); /* count bits 0..7 */ out_byte(DMA_EXEC, (count - 1) >> 8); /* count bits 8..15 */ out_byte(DMA_EXTCMD, 0x70 + dma_channel); /* Set the transfer mode */ out_byte(DMA_EXEC, opcode == DEV_SCATTER ? 0x44 : 0x4C); out_byte(DMA_EXTCMD, 0xA0 + dma_channel); /* Enable access to dma channel 5 */ unlock(); } /*============================================================================* * w_geometry * *============================================================================*/ PRIVATE void w_geometry(entry) struct partition *entry; { entry->cylinders = div64u(w_wn->part[0].dv_size, SECTOR_SIZE) / (64 * 32); entry->heads = 64; entry->sectors = 32; } #endif /* ENABLE_ESDI_WINI */ /* * $PchId: esdi_wini.c,v 1.9 1999/01/13 21:35:40 philip Exp $ */ /* This file contains a simple exception handler. Exceptions in user * processes are converted to signals. Exceptions in the kernel, MM and * FS cause a panic. */ #include "kernel.h" #include #include "proc.h" /*==========================================================================* * exception * *==========================================================================*/ PUBLIC void exception(vec_nr) unsigned vec_nr; { /* An exception or unexpected interrupt has occurred. */ struct ex_s { char *msg; int signum; int minprocessor; }; static struct ex_s ex_data[] = { "Divide error", SIGFPE, 86, "Debug exception", SIGTRAP, 86, "Nonmaskable interrupt", SIGBUS, 86, "Breakpoint", SIGEMT, 86, "Overflow", SIGFPE, 86, "Bounds check", SIGFPE, 186, "Invalid opcode", SIGILL, 186, "Coprocessor not available", SIGFPE, 186, "Double fault", SIGBUS, 286, "Copressor segment overrun", SIGSEGV, 286, "Invalid TSS", SIGSEGV, 286, "Segment not present", SIGSEGV, 286, "Stack exception", SIGSEGV, 286, /* STACK_FAULT already used */ "General protection", SIGSEGV, 286, "Page fault", SIGSEGV, 386, /* not close */ NIL_PTR, SIGILL, 0, /* probably software trap */ "Coprocessor error", SIGFPE, 386, }; register struct ex_s *ep; struct proc *saved_proc; saved_proc= proc_ptr; /* Save proc_ptr, because it may be changed by debug * statements. */ ep = &ex_data[vec_nr]; if (vec_nr == 2) { /* spurious NMI on some machines */ printf("got spurious NMI\n"); return; } if (k_reenter == 0 && isuserp(saved_proc)) { unlock(); /* this is protected like sys_call() */ cause_sig(proc_number(saved_proc), ep->signum); return; } /* This is not supposed to happen. */ if (ep->msg == NIL_PTR || processor < ep->minprocessor) printf("\nIntel-reserved exception %d\n", vec_nr); else printf("\n%s\n", ep->msg); printf("process number %d, pc = 0x%04x:0x%08x\n", proc_number(saved_proc), (unsigned) saved_proc->p_reg.cs, (unsigned) saved_proc->p_reg.pc); panic("exception in system code", NO_NUM); } /* This file contains the device dependent part of the driver for the Floppy * Disk Controller (FDC) using the NEC PD765 chip. * * The file contains two entry points: * * floppy_task: main entry when system is brought up * floppy_stop: stop all activity * * Changes: * 27 Oct. 1986 by Jakob Schripsema: fdc_results fixed for 8 MHz * 28 Nov. 1986 by Peter Kay: better resetting for 386 * 06 Jan. 1988 by Al Crew: allow 1.44 MB diskettes * 1989 by Bruce Evans: I/O vector to keep up with 1-1 interleave * 13 May 1991 by Don Chapman: renovated the errors loop. * 1991 by Bruce Evans: len[] / motors / reset / step rate / ... * 14 Feb 1992 by Andy Tanenbaum: check drive density on opens only * 27 Mar 1992 by Kees J. Bot: last details on density checking * 04 Apr 1992 by Kees J. Bot: device dependent/independent split * 14 May 2000 by Kees J. Bot: d-d/i rewrite. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #include /* I/O Ports used by floppy disk task. */ #define DOR 0x3F2 /* motor drive control bits */ #define FDC_STATUS 0x3F4 /* floppy disk controller status register */ #define FDC_DATA 0x3F5 /* floppy disk controller data register */ #define FDC_RATE 0x3F7 /* transfer rate register */ #define DMA_ADDR 0x004 /* port for low 16 bits of DMA address */ #define DMA_TOP 0x081 /* port for top 4 bits of 20-bit DMA addr */ #define DMA_COUNT 0x005 /* port for DMA count (count = bytes - 1) */ #define DMA_FLIPFLOP 0x00C /* DMA byte pointer flip-flop */ #define DMA_MODE 0x00B /* DMA mode port */ #define DMA_INIT 0x00A /* DMA init port */ #define DMA_RESET_VAL 0x06 /* Status registers returned as result of operation. */ #define ST0 0x00 /* status register 0 */ #define ST1 0x01 /* status register 1 */ #define ST2 0x02 /* status register 2 */ #define ST3 0x00 /* status register 3 (return by DRIVE_SENSE) */ #define ST_CYL 0x03 /* slot where controller reports cylinder */ #define ST_HEAD 0x04 /* slot where controller reports head */ #define ST_SEC 0x05 /* slot where controller reports sector */ #define ST_PCN 0x01 /* slot where controller reports present cyl */ /* Fields within the I/O ports. */ /* Main status register. */ #define CTL_BUSY 0x10 /* bit is set when read or write in progress */ #define DIRECTION 0x40 /* bit is set when reading data reg is valid */ #define MASTER 0x80 /* bit is set when data reg can be accessed */ /* Digital output port (DOR). */ #define MOTOR_SHIFT 4 /* high 4 bits control the motors in DOR */ #define ENABLE_INT 0x0C /* used for setting DOR port */ /* ST0. */ #define ST0_BITS 0xF8 /* check top 5 bits of seek status */ #define TRANS_ST0 0x00 /* top 5 bits of ST0 for READ/WRITE */ #define SEEK_ST0 0x20 /* top 5 bits of ST0 for SEEK */ /* ST1. */ #define BAD_SECTOR 0x05 /* if these bits are set in ST1, recalibrate */ #define WRITE_PROTECT 0x02 /* bit is set if diskette is write protected */ /* ST2. */ #define BAD_CYL 0x1F /* if any of these bits are set, recalibrate */ /* ST3 (not used). */ #define ST3_FAULT 0x80 /* if this bit is set, drive is sick */ #define ST3_WR_PROTECT 0x40 /* set when diskette is write protected */ #define ST3_READY 0x20 /* set when drive is ready */ /* Floppy disk controller command bytes. */ #define FDC_SEEK 0x0F /* command the drive to seek */ #define FDC_READ 0xE6 /* command the drive to read */ #define FDC_WRITE 0xC5 /* command the drive to write */ #define FDC_SENSE 0x08 /* command the controller to tell its status */ #define FDC_RECALIBRATE 0x07 /* command the drive to go to cyl 0 */ #define FDC_SPECIFY 0x03 /* command the drive to accept params */ #define FDC_READ_ID 0x4A /* command the drive to read sector identity */ #define FDC_FORMAT 0x4D /* command the drive to format a track */ /* DMA channel commands. */ #define DMA_READ 0x46 /* DMA read opcode */ #define DMA_WRITE 0x4A /* DMA write opcode */ /* Parameters for the disk drive. */ #define HC_SIZE 2880 /* # sectors on largest legal disk (1.44MB) */ #define NR_HEADS 0x02 /* two heads (i.e., two tracks/cylinder) */ #define MAX_SECTORS 18 /* largest # sectors per track */ #define DTL 0xFF /* determines data length (sector size) */ #define SPEC2 0x02 /* second parameter to SPECIFY */ #define MOTOR_OFF 3*HZ /* how long to wait before stopping motor */ #define WAKEUP 2*HZ /* timeout on I/O, FDC won't quit. */ /* Error codes */ #define ERR_SEEK (-1) /* bad seek */ #define ERR_TRANSFER (-2) /* bad transfer */ #define ERR_STATUS (-3) /* something wrong when getting status */ #define ERR_READ_ID (-4) /* bad read id */ #define ERR_RECALIBRATE (-5) /* recalibrate didn't work properly */ #define ERR_DRIVE (-6) /* something wrong with a drive */ #define ERR_WR_PROTECT (-7) /* diskette is write protected */ #define ERR_TIMEOUT (-8) /* interrupt timeout */ /* No retries on some errors. */ #define err_no_retry(err) ((err) <= ERR_WR_PROTECT) /* Encoding of drive type in minor device number. */ #define DEV_TYPE_BITS 0x7C /* drive type + 1, if nonzero */ #define DEV_TYPE_SHIFT 2 /* right shift to normalize type bits */ #define FORMAT_DEV_BIT 0x80 /* bit in minor to turn write into format */ /* Miscellaneous. */ #define MAX_ERRORS 6 /* how often to try rd/wt before quitting */ #define MAX_RESULTS 7 /* max number of bytes controller returns */ #define NR_DRIVES 2 /* maximum number of drives */ #define DIVISOR 128 /* used for sector size encoding */ #define SECTOR_SIZE_CODE 2 /* code to say "512" to the controller */ #define TIMEOUT 500 /* milliseconds waiting for FDC */ #define NT 7 /* number of diskette/drive combinations */ #define UNCALIBRATED 0 /* drive needs to be calibrated at next use */ #define CALIBRATED 1 /* no calibration needed */ #define BASE_SECTOR 1 /* sectors are numbered starting at 1 */ #define NO_SECTOR (-1) /* current sector unknown */ #define NO_CYL (-1) /* current cylinder unknown, must seek */ #define NO_DENS 100 /* current media unknown */ #define BSY_IDLE 0 /* busy doing nothing */ #define BSY_IO 1 /* busy doing I/O */ #define BSY_WAKEN 2 /* got a wakeup call */ /* Seven combinations of diskette/drive are supported. * * # Diskette Drive Sectors Tracks Rotation Data-rate Comment * 0 360K 360K 9 40 300 RPM 250 kbps Standard PC DSDD * 1 1.2M 1.2M 15 80 360 RPM 500 kbps AT disk in AT drive * 2 360K 720K 9 40 300 RPM 250 kbps Quad density PC * 3 720K 720K 9 80 300 RPM 250 kbps Toshiba, et al. * 4 360K 1.2M 9 40 360 RPM 300 kbps PC disk in AT drive * 5 720K 1.2M 9 80 360 RPM 300 kbps Toshiba in AT drive * 6 1.44M 1.44M 18 80 300 RPM 500 kbps PS/2, et al. * * In addition, 720K diskettes can be read in 1.44MB drives, but that does * not need a different set of parameters. This combination uses * * 3 720K 1.44M 9 80 300 RPM 250 kbps PS/2, et al. */ PRIVATE struct density { u8_t secpt; /* sectors per track */ u8_t cyls; /* tracks per side */ u8_t steps; /* steps per cylinder (2 = double step) */ u8_t test; /* sector to try for density test */ u8_t rate; /* data rate (2=250, 1=300, 0=500 kbps) */ u8_t start; /* motor start (clock ticks) */ u8_t gap; /* gap size */ u8_t spec1; /* first specify byte (SRT/HUT) */ } fdensity[NT] = { { 9, 40, 1, 4*9, 2, 6*HZ/8, 0x2A, 0xDF }, /* 360K / 360K */ { 15, 80, 1, 14, 0, 4*HZ/8, 0x1B, 0xD1 }, /* 1.2M / 1.2M */ { 9, 40, 2, 2*9, 2, 4*HZ/8, 0x2A, 0xE1 }, /* 360K / 720K */ { 9, 80, 1, 4*9, 2, 6*HZ/8, 0x2A, 0xDF }, /* 720K / 720K */ { 9, 40, 2, 2*9, 1, 4*HZ/8, 0x23, 0xE1 }, /* 360K / 1.2M */ { 9, 80, 1, 4*9, 1, 4*HZ/8, 0x23, 0xE1 }, /* 720K / 1.2M */ { 18, 80,++++++++++++++++++++++++++++++++++ 1, 17, 0, 4*HZ/8, 0x1B, 0xD1 }, /* 1.44M / 1.44M */ }; /* The following table is used with the test_sector array to recognize a * drive/floppy combination. The sector to test has been determined by * looking at the differences in gap size, sectors/track, and double stepping. * This means that types 0 and 3 can't be told apart, only the motor start * time differs. If a read test succeeds then the drive is limited to the * set of densities it can support to avoid unnecessary tests in the future. */ #define b(d) (1 << (d)) /* bit for density d. */ PRIVATE struct test_order { u8_t t_density; /* floppy/drive type */ u8_t t_class; /* limit drive to this class of densities */ } test_order[NT-1] = { { 6, b(3) | b(6) }, /* 1.44M {720K, 1.44M} */ { 1, b(1) | b(4) | b(5) }, /* 1.2M {1.2M, 360K, 720K} */ { 3, b(2) | b(3) | b(6) }, /* 720K {360K, 720K, 1.44M} */ { 4, b(1) | b(4) | b(5) }, /* 360K {1.2M, 360K, 720K} */ { 5, b(1) | b(4) | b(5) }, /* 720K {1.2M, 360K, 720K} */ { 2, b(2) | b(3) }, /* 360K {360K, 720K} */ /* Note that type 0 is missing, type 3 can read/write it too, which is * why the type 3 parameters have been pessimized to be like type 0. */ }; /* Variables. */ PRIVATE struct floppy { /* main drive struct, one entry per drive */ unsigned fl_curcyl; /* current cylinder */ unsigned fl_hardcyl; /* hardware cylinder, as opposed to: */ unsigned fl_cylinder; /* cylinder number addressed */ unsigned fl_sector; /* sector addressed */ unsigned fl_head; /* head number addressed */ char fl_calibration; /* CALIBRATED or UNCALIBRATED */ u8_t fl_density; /* NO_DENS = ?, 0 = 360K; 1 = 360K/1.2M; etc.*/ u8_t fl_class; /* bitmap for possible densities */ struct device fl_geom; /* Geometry of the drive */ struct device fl_part[NR_PARTITIONS]; /* partition's base & size */ } floppy[NR_DRIVES]; PRIVATE int motor_status; /* bitmap of current motor status */ PRIVATE int motor_goal; /* bitmap of desired motor status */ PRIVATE int need_reset; /* set to 1 when controller must be reset */ PRIVATE unsigned f_drive; /* selected drive */ PRIVATE unsigned f_device; /* selected minor device */ PRIVATE struct floppy *f_fp; /* current drive */ PRIVATE struct density *f_dp; /* current density parameters */ PRIVATE struct density *prev_dp;/* previous density parameters */ PRIVATE unsigned f_sectors; /* equal to f_dp->secpt (needed a lot) */ PRIVATE int f_busy; /* BSY_IDLE, BSY_IO, BSY_WAKEN */ PRIVATE struct device *f_dv; /* device's base and size */ PRIVATE struct disk_parameter_s fmt_param; /* parameters for format */ PRIVATE u8_t f_results[MAX_RESULTS];/* the controller can give lots of output */ FORWARD _PROTOTYPE( struct device *f_prepare, (int device) ); FORWARD _PROTOTYPE( char *f_name, (void) ); FORWARD _PROTOTYPE( void f_cleanup, (void) ); FORWARD _PROTOTYPE( int f_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( void dma_setup, (int opcode) ); FORWARD _PROTOTYPE( void start_motor, (void) ); FORWARD _PROTOTYPE( void stop_motor, (void) ); FORWARD _PROTOTYPE( int seek, (void) ); FORWARD _PROTOTYPE( int fdc_transfer, (int opcode) ); FORWARD _PROTOTYPE( int fdc_results, (void) ); FORWARD _PROTOTYPE( int f_handler, (int irq) ); FORWARD _PROTOTYPE( int fdc_command, (u8_t *cmd, int len) ); FORWARD _PROTOTYPE( void fdc_out, (int val) ); FORWARD _PROTOTYPE( int recalibrate, (void) ); FORWARD _PROTOTYPE( void f_reset, (void) ); FORWARD _PROTOTYPE( void send_mess, (void) ); FORWARD _PROTOTYPE( int f_intr_wait, (void) ); FORWARD _PROTOTYPE( void f_timeout, (void) ); FORWARD _PROTOTYPE( int read_id, (void) ); FORWARD _PROTOTYPE( int f_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int test_read, (int density) ); FORWARD _PROTOTYPE( void f_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver f_dtab = { f_name, /* current device's name */ f_do_open, /* open or mount request, sense type of diskette */ do_nop, /* nothing on a close */ do_diocntl, /* get or set a partitions geometry */ f_prepare, /* prepare for I/O on a given minor device */ f_transfer, /* do the I/O */ f_cleanup, /* cleanup before sending reply to user process */ f_geometry /* tell the geometry of the diskette */ }; /*===========================================================================* * floppy_task * *===========================================================================*/ PUBLIC void floppy_task() { /* Initialize the floppy structure. */ struct floppy *fp; for (fp = &floppy[0]; fp < &floppy[NR_DRIVES]; fp++) { fp->fl_curcyl = NO_CYL; fp->fl_density = NO_DENS; fp->fl_class = ~0; } put_irq_handler(FLOPPY_IRQ, f_handler); enable_irq(FLOPPY_IRQ); /* ready for floppy interrupts */ driver_task(&f_dtab); } /*===========================================================================* * f_prepare * *===========================================================================*/ PRIVATE struct device *f_prepare(device) int device; { /* Prepare for I/O on a device. */ f_device = device; f_drive = device & ~(DEV_TYPE_BITS | FORMAT_DEV_BIT); if (f_drive < 0 || f_drive >= NR_DRIVES) return(NIL_DEV); f_fp = &floppy[f_drive]; f_dv = &f_fp->fl_geom; if (f_fp->fl_density < NT) { f_dp = &fdensity[f_fp->fl_density]; f_sectors = f_dp->secpt; f_fp->fl_geom.dv_size = mul64u((long) (NR_HEADS * f_sectors * f_dp->cyls), SECTOR_SIZE); } /* A partition? */ if ((device &= DEV_TYPE_BITS) >= MINOR_fd0p0) f_dv = &f_fp->fl_part[(device - MINOR_fd0p0) >> DEV_TYPE_SHIFT]; return f_dv; } /*===========================================================================* * f_name * *===========================================================================*/ PRIVATE char *f_name() { /* Return a name for the current device. */ static char name[] = "fd0"; name[2] = '0' + f_drive; return name; } /*===========================================================================* * f_cleanup * *===========================================================================*/ PRIVATE void f_cleanup() { /* Start watchdog timer to turn all motors off in a few seconds. * There is a race here. An old watchdog might bite before the * new delay is installed, and turn of the motors prematurely. * This cannot be solved simply by resetting motor_goal after * sending the message, because the new watchdog might bite * before motor_goal is reset. Then the motors would stay on * until after the next floppy access. This could be fixed with * extra code (call the clock task twice in some cases). Or * stop_motor() could be replaced by send_mess(), and send a * STOP_MOTOR message to be accepted by the clock task. This * would be slower but have the advantage that this comment could * be deleted! * * Since it is not likely and not serious for an old watchdog to * bite, accept that possibility for now. A full solution to the * motor madness requires a lots of extra work anyway, such as * a separate timer for each motor, and smaller delays for motors * that have just been turned off or start faster than the spec. * (is there a motor-ready bit?). */ motor_goal = 0; clock_mess(MOTOR_OFF, stop_motor); } /*===========================================================================* * f_transfer * *===========================================================================*/ PRIVATE int f_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct floppy *fp = f_fp; iovec_t *iop, *iov_end = iov + nr_req; int r, errors; unsigned block; /* Seen any 32M floppies lately? */ unsigned nbytes, count, chunk, sector; unsigned long dv_size = cv64ul(f_dv->dv_size); vir_bytes user_addr; vir_bytes uaddrs[MAX_SECTORS], *up; u8_t cmd[3]; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); /* Check disk address. */ if ((position & SECTOR_MASK) != 0) return(EINVAL); errors = 0; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) nbytes += iop->iov_size; /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; block = div64u(add64ul(f_dv->dv_base, position), SECTOR_SIZE); if ((nbytes & SECTOR_MASK) != 0) return(EINVAL); /* Using a formatting device? */ if (f_device & FORMAT_DEV_BIT) { if (opcode != DEV_SCATTER) return(EIO); if (iov->iov_size < SECTOR_SIZE + sizeof(fmt_param)) return(EINVAL); phys_copy(user_base + iov->iov_addr + SECTOR_SIZE, vir2phys(&fmt_param), (phys_bytes) sizeof(fmt_param)); /* Check that the number of sectors in the data is reasonable, * to avoid division by 0. Leave checking of other data to * the FDC. */ if (fmt_param.sectors_per_cylinder == 0) return(EIO); /* Only the first sector of the parameters now needed. */ iov->iov_size = nbytes = SECTOR_SIZE; } /* Only try one sector if there were errors. */ if (errors > 0) nbytes = SECTOR_SIZE; /* Compute cylinder and head of the track to access. */ fp->fl_cylinder = block / (NR_HEADS * f_sectors); fp->fl_hardcyl = fp->fl_cylinder * f_dp->steps; fp->fl_head = (block % (NR_HEADS * f_sectors)) / f_sectors; /* For each sector on this track compute the user address it is to * go or to come from. */ for (up = uaddrs; up < uaddrs + MAX_SECTORS; up++) *up = 0; count = 0; iop = iov; sector = block % f_sectors; for (;;) { user_addr = iop->iov_addr; chunk = iop->iov_size; if ((chunk & SECTOR_MASK) != 0) return(EINVAL); while (chunk > 0) { uaddrs[sector++] = user_addr; chunk -= SECTOR_SIZE; user_addr += SECTOR_SIZE; count += SECTOR_SIZE; if (sector == f_sectors || count == nbytes) goto track_set_up; } iop++; } track_set_up: /* First check to see if a reset is needed. */ if (need_reset) f_reset(); /* See if motor is running; if not, turn it on and wait. */ start_motor(); /* Set the stepping rate and data rate */ if (f_dp != prev_dp) { cmd[0] = FDC_SPECIFY; cmd[1] = f_dp->spec1; cmd[2] = SPEC2; (void) fdc_command(cmd, 3); out_byte(FDC_RATE, f_dp->rate); prev_dp = f_dp; } /* If we are going to a new cylinder, perform a seek. */ r = seek(); /* Avoid read_id() if we don't plan to read much. */ if (fp->fl_sector == NO_SECTOR && count < (6 * SECTOR_SIZE)) fp->fl_sector = 0; for (nbytes = 0; nbytes < count; nbytes += SECTOR_SIZE) { if (fp->fl_sector == NO_SECTOR) { /* Find out what the current sector is. This often * fails right after a seek, so try it twice. */ if (r == OK && read_id() != OK) r = read_id(); } /* Look for the next job in uaddrs[] */ if (r == OK) { for (;;) { if (fp->fl_sector >= f_sectors) fp->fl_sector = 0; up = &uaddrs[fp->fl_sector]; if (*up != 0) break; fp->fl_sector++; } } if (r == OK && opcode == DEV_SCATTER) { /* Copy the user bytes to the DMA buffer. */ phys_copy(user_base + *up, tmp_phys, (phys_bytes) SECTOR_SIZE); } /* Set up the DMA chip and perform the transfer. */ if (r == OK) { dma_setup(opcode); r = fdc_transfer(opcode); } if (r == OK && opcode == DEV_GATHER) { /* Copy the DMA buffer to user space. */ phys_copy(tmp_phys, user_base + *up, (phys_bytes) SECTOR_SIZE); } if (r != OK) { /* Don't retry if write protected or too many errors. */ if (err_no_retry(r) || ++errors == MAX_ERRORS) return(EIO); /* Recalibrate if halfway. */ if (errors == MAX_ERRORS / 2) fp->fl_calibration = UNCALIBRATED; nbytes = 0; break; /* retry */ } } /* Book the bytes successfully transferred. */ position += nbytes; for (;;) { if (nbytes < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += nbytes; iov->iov_size -= nbytes; break; } nbytes -= iov->iov_size; iov->iov_addr += iov->iov_size; iov->iov_size = 0; if (nbytes == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*===========================================================================* * dma_setup * *===========================================================================*/ PRIVATE void dma_setup(opcode) int opcode; /* DEV_GATHER or DEV_SCATTER */ { /* The IBM PC can perform DMA operations by using the DMA chip. To use it, * the DMA (Direct Memory Access) chip is loaded with the 20-bit memory address * to be read from or written to, the byte count minus 1, and a read or write * opcode. This routine sets up the DMA chip. Note that the chip is not * capable of doing a DMA across a 64K boundary (e.g., you can't read a * 512-byte block starting at physical address 65520). */ /* Set up the DMA registers. (The comment on the reset is a bit strong, * it probably only resets the floppy channel.) */ out_byte(DMA_INIT, DMA_RESET_VAL); /* reset the dma controller */ out_byte(DMA_FLIPFLOP, 0); /* write anything to reset it */ out_byte(DMA_MODE, opcode == DEV_SCATTER ? DMA_WRITE : DMA_READ); out_byte(DMA_ADDR, (unsigned) tmp_phys >> 0); out_byte(DMA_ADDR, (unsigned) tmp_phys >> 8); out_byte(DMA_TOP, (unsigned) (tmp_phys >> 16)); out_byte(DMA_COUNT, (SECTOR_SIZE - 1) >> 0); out_byte(DMA_COUNT, (SECTOR_SIZE - 1) >> 8); out_byte(DMA_INIT, 2); /* some sort of enable */ } /*===========================================================================* * start_motor * *===========================================================================*/ PRIVATE void start_motor() { /* Control of the floppy disk motors is a big pain. If a motor is off, you * have to turn it on first, which takes 1/2 second. You can't leave it on * all the time, since that would wear out the diskette. However, if you turn * the motor off after each operation, the system performance will be awful. * The compromise used here is to leave it on for a few seconds after each * operation. If a new operation is started in that interval, it need not be * turned on again. If no new operation is started, a timer goes off and the * motor is turned off. I/O port DOR has bits to control each of 4 drives. * The timer cannot go off while we are changing with the bits, since the * clock task cannot run while another (this) task is active, so there is no * need to lock(). */ int motor_bit, running; message mess; motor_bit = 1 << f_drive; /* bit mask for this drive */ running = motor_status & motor_bit; /* nonzero if this motor is running */ motor_goal = motor_status | motor_bit;/* want this drive running too */ out_byte(DOR, (motor_goal << MOTOR_SHIFT) | ENABLE_INT | f_drive); motor_status = motor_goal; /* If the motor was already running, we don't have to wait for it. */ if (running) return; /* motor was already running */ clock_mess(f_dp->start, send_mess); /* motor was not running */ receive(CLOCK, &mess); /* wait for clock interrupt */ } /*===========================================================================* * stop_motor * *===========================================================================*/ PRIVATE void stop_motor() { /* This routine is called by the clock interrupt after several seconds have * elapsed with no floppy disk activity. It checks to see if any drives are * supposed to be turned off, and if so, turns them off. */ if (motor_goal != motor_status) { out_byte(DOR, (motor_goal << MOTOR_SHIFT) | ENABLE_INT); motor_status = motor_goal; } } /*===========================================================================* * floppy_stop * *===========================================================================*/ PUBLIC void floppy_stop() { /* Stop all activity. */ motor_goal = 0; stop_motor(); } /*===========================================================================* * seek * *===========================================================================*/ PRIVATE int seek() { /* Issue a SEEK command on the indicated drive unless the arm is already * positioned on the correct cylinder. */ struct floppy *fp = f_fp; int r; message mess; u8_t cmd[3]; /* Are we already on the correct cylinder? */ if (fp->fl_calibration == UNCALIBRATED) if (recalibrate() != OK) return(ERR_SEEK); if (fp->fl_curcyl == fp->fl_hardcyl) return(OK); /* No. Wrong cylinder. Issue a SEEK and wait for interrupt. */ cmd[0] = FDC_SEEK; cmd[1] = (fp->fl_head << 2) | f_drive; cmd[2] = fp->fl_hardcyl; if (fdc_command(cmd, 3) != OK) return(ERR_SEEK); if (f_intr_wait() != OK) return(ERR_TIMEOUT); /* Interrupt has been received. Check drive status. */ fdc_out(FDC_SENSE); /* probe FDC to make it return status */ r = fdc_results(); /* get controller status bytes */ if (r != OK || (f_results[ST0] & ST0_BITS) != SEEK_ST0 || f_results[ST1] != fp->fl_hardcyl) { /* seek failed, may need a recalibrate */ return(ERR_SEEK); } /* Give head time to settle on a format, no retrying here! */ if (f_device & FORMAT_DEV_BIT) { clock_mess(2, send_mess); receive(CLOCK, &mess); } fp->fl_curcyl = fp->fl_hardcyl; fp->fl_sector = NO_SECTOR; return(OK); } /*===========================================================================* * fdc_transfer * *===========================================================================*/ PRIVATE int fdc_transfer(opcode) int opcode; /* DEV_GATHER or DEV_SCATTER */ { /* The drive is now on the proper cylinder. Read, write or format 1 block. */ struct floppy *fp = f_fp; int r, s; u8_t cmd[9]; /* Never attempt a transfer if the drive is uncalibrated or motor is off. */ if (fp->fl_calibration == UNCALIBRATED) return(ERR_TRANSFER); if ((motor_status & (1 << f_drive)) == 0) return(ERR_TRANSFER); /* The command is issued by outputting several bytes to the controller chip. */ if (f_device & FORMAT_DEV_BIT) { cmd[0] = FDC_FORMAT; cmd[1] = (fp->fl_head << 2) | f_drive; cmd[2] = fmt_param.sector_size_code; cmd[3] = fmt_param.sectors_per_cylinder; cmd[4] = fmt_param.gap_length_for_format; cmd[5] = fmt_param.fill_byte_for_format; if (fdc_command(cmd, 6) != OK) return(ERR_TRANSFER); } else { cmd[0] = opcode == DEV_SCATTER ? FDC_WRITE : FDC_READ; cmd[1] = (fp->fl_head << 2) | f_drive; cmd[2] = fp->fl_cylinder; cmd[3] = fp->fl_head; cmd[4] = BASE_SECTOR + fp->fl_sector; cmd[5] = SECTOR_SIZE_CODE; cmd[6] = f_sectors; cmd[7] = f_dp->gap; /* sector gap */ cmd[8] = DTL; /* data length */ if (fdc_command(cmd, 9) != OK) return(ERR_TRANSFER); } /* Block, waiting for disk interrupt. */ if (f_intr_wait() != OK) return(ERR_TIMEOUT); /* Get controller status and check for errors. */ r = fdc_results(); if (r != OK) return(r); if (f_results[ST1] & WRITE_PROTECT) { printf("%s: diskette is write protected.\n", f_name()); return(ERR_WR_PROTECT); } if ((f_results[ST0] & ST0_BITS) != TRANS_ST0) return(ERR_TRANSFER); if (f_results[ST1] | f_results[ST2]) return(ERR_TRANSFER); if (f_device & FORMAT_DEV_BIT) return(OK); /* Compare actual numbers of sectors transferred with expected number. */ s = (f_results[ST_CYL] - fp->fl_cylinder) * NR_HEADS * f_sectors; s += (f_results[ST_HEAD] - fp->fl_head) * f_sectors; s += (f_results[ST_SEC] - BASE_SECTOR - fp->fl_sector); if (s != 1) return(ERR_TRANSFER); /* This sector is next for I/O: */ fp->fl_sector = f_results[ST_SEC] - BASE_SECTOR; return(OK); } /*==========================================================================* * fdc_results * *==========================================================================*/ PRIVATE int fdc_results() { /* Extract results from the controller after an operation, then allow floppy * interrupts again. */ int result_nr, status; struct milli_state ms; /* Extract bytes from FDC until it says it has no more. The loop is * really an outer loop on result_nr and an inner loop on status. */ result_nr = 0; milli_start(&ms); do { /* Reading one byte is almost a mirror of fdc_out() - the DIRECTION * bit must be set instead of clear, but the CTL_BUSY bit destroys * the perfection of the mirror. */ status = in_byte(FDC_STATUS) & (MASTER | DIRECTION | CTL_BUSY); if (status == (MASTER | DIRECTION | CTL_BUSY)) { if (result_nr >= MAX_RESULTS) break; /* too many results */ f_results[result_nr++] = in_byte(FDC_DATA); continue; } if (status == MASTER) { /* all read */ enable_irq(FLOPPY_IRQ); return(OK); /* only good exit */ } } while (milli_elapsed(&ms) < TIMEOUT); need_reset = TRUE; /* controller chip must be reset */ enable_irq(FLOPPY_IRQ); return(ERR_STATUS); } /*==========================================================================* * f_handler * *==========================================================================*/ PRIVATE int f_handler(irq) int irq; { /* FDC interrupt, send message to floppy task. */ f_busy = BSY_IDLE; interrupt(FLOPPY); return 0; } /*===========================================================================* * fdc_command * *===========================================================================*/ PRIVATE int fdc_command(cmd, len) u8_t *cmd; /* command bytes */ int len; /* command length */ { /* Output a command to the controller. */ /* Schedule a wakeup call. */ clock_mess(WAKEUP, f_timeout); f_busy = BSY_IO; while (len > 0) { fdc_out(*cmd++); len--; } return(need_reset ? ERR_DRIVE : OK); } /*===========================================================================* * fdc_out * *===========================================================================*/ PRIVATE void fdc_out(val) int val; /* write this byte to floppy disk controller */ { /* Output a byte to the controller. This is not entirely trivial, since you * can only write to it when it is listening, and it decides when to listen. * If the controller refuses to listen, the FDC chip is given a hard reset. */ struct milli_state ms; if (need_reset) return; /* if controller is not listening, return */ /* It may take several tries to get the FDC to accept a command. */ milli_start(&ms); while ((in_byte(FDC_STATUS) & (MASTER | DIRECTION)) != (MASTER | 0)) { if (milli_elapsed(&ms) >= TIMEOUT) { /* Controller is not listening. Hit it over the head. */ need_reset = TRUE; return; } } out_byte(FDC_DATA, val); } /*===========================================================================* * recalibrate * *===========================================================================*/ PRIVATE int recalibrate() { /* The floppy disk controller has no way of determining its absolute arm * position (cylinder). Instead, it steps the arm a cylinder at a time and * keeps track of where it thinks it is (in software). However, after a * SEEK, the hardware reads information from the diskette telling where the * arm actually is. If the arm is in the wrong place, a recalibration is done, * which forces the arm to cylinder 0. This way the controller can get back * into sync with reality. */ struct floppy *fp = f_fp; int r; u8_t cmd[2]; /* Issue the RECALIBRATE command and wait for the interrupt. */ cmd[0] = FDC_RECALIBRATE; /* tell drive to recalibrate itself */ cmd[1] = f_drive; /* specify drive */ if (fdc_command(cmd, 2) != OK) return(ERR_SEEK); if (f_intr_wait() != OK) return(ERR_TIMEOUT); /* Determine if the recalibration succeeded. */ fdc_out(FDC_SENSE); /* issue SENSE command to request results */ r = fdc_results(); /* get results of the FDC_RECALIBRATE command*/ fp->fl_curcyl = NO_CYL; /* force a SEEK next time */ fp->fl_sector = NO_SECTOR; if (r != OK || /* controller would not respond */ (f_results[ST0] & ST0_BITS) != SEEK_ST0 || f_results[ST_PCN] != 0) { /* Recalibration failed. FDC must be reset. */ need_reset = TRUE; return(ERR_RECALIBRATE); } else { /* Recalibration succeeded. */ fp->fl_calibration = CALIBRATED; return(OK); } } /*===========================================================================* * f_reset * *===========================================================================*/ PRIVATE void f_reset() { /* Issue a reset to the controller. This is done after any catastrophe, * like the controller refusing to respond. */ int i; message mess; /* Disable interrupts and strobe reset bit low. */ need_reset = FALSE; /* It is not clear why the next lock is needed. Writing 0 to DOR causes * interrupt, while the PC documentation says turning bit 8 off disables * interrupts. Without the lock: * 1) the interrupt handler sets the floppy mask bit in the 8259. * 2) writing ENABLE_INT to DOR causes the FDC to assert the interrupt * line again, but the mask stops the cpu being interrupted. * 3) the sense interrupt clears the interrupt (not clear which one). * and for some reason the reset does not work. */ (void) fdc_command((u8_t *) 0, 0); /* need only the timer */ lock(); motor_status = 0; motor_goal = 0; out_byte(DOR, 0); /* strobe reset bit low */ out_byte(DOR, ENABLE_INT); /* strobe it high again */ unlock(); /* collect the RESET interrupt */ do receive(HARDWARE, &mess); while (f_busy == BSY_IO); /* The controller supports 4 drives and returns a result for each of them. * Collect all the results now. The old version only collected the first * result. This happens to work for 2 drives, but it doesn't work for 3 * or more drives, at least with only drives 0 and 2 actually connected * (the controller generates an extra interrupt for the middle drive when * drive 2 is accessed and the driver panics). * * It would be better to keep collecting results until there are no more. * For this, fdc_results needs to return the number of results (instead * of OK) when it succeeds. */ for (i = 0; i < 4; i++) { fdc_out(FDC_SENSE); /* probe FDC to make it return status */ (void) fdc_results(); /* flush controller */ } for (i = 0; i < NR_DRIVES; i++) /* clear each drive */ floppy[i].fl_calibration = UNCALIBRATED; /* The current timing parameters must be specified again. */ prev_dp = NULL; } /*===========================================================================* * send_mess * *===========================================================================*/ PRIVATE void send_mess() { /* This routine is called when the clock task has timed out on motor startup.*/ message mess; send(FLOPPY, &mess); } /*===========================================================================* * f_intr_wait * *===========================================================================*/ PRIVATE int f_intr_wait() { /* Wait for an interrupt, but not forever. The FDC may have all the time of * the world, but we humans do not. */ message mess; f_busy = BSY_IO; clock_mess(WAKEUP, f_timeout); do receive(HARDWARE, &mess); while (f_busy == BSY_IO); if (f_busy == BSY_WAKEN) { /* No interrupt from the FDC, this means that there is probably no * floppy in the drive. Get the FDC down to earth and return error. */ need_reset = TRUE; return(ERR_TIMEOUT); } return(OK); } /*===========================================================================* * f_timeout * *===========================================================================*/ PRIVATE void f_timeout() { /* When it takes too long for the FDC to get an interrupt (no floppy in the * drive), this routine is called. It sets a flag and fakes a hardware * interrupt. */ if (f_busy == BSY_IO) { f_busy = BSY_WAKEN; interrupt(FLOPPY); } } /*==========================================================================* * read_id * *==========================================================================*/ PRIVATE int read_id() { /* Determine current cylinder and sector. */ struct floppy *fp = f_fp; int result; u8_t cmd[2]; /* Never attempt a read id if the drive is uncalibrated or motor is off. */ if (fp->fl_calibration == UNCALIBRATED) return(ERR_READ_ID); if ((motor_status & (1 << f_drive)) == 0) return(ERR_READ_ID); /* The command is issued by outputting 2 bytes to the controller chip. */ cmd[0] = FDC_READ_ID; /* issue the read id command */ cmd[1] = (fp->fl_head << 2) | f_drive; if (fdc_command(cmd, 2) != OK) return(ERR_READ_ID); if (f_intr_wait() != OK) return(ERR_TIMEOUT); /* Get controller status and check for errors. */ result = fdc_results(); if (result != OK) return(result); if ((f_results[ST0] & ST0_BITS) != TRANS_ST0) return(ERR_READ_ID); if (f_results[ST1] | f_results[ST2]) return(ERR_READ_ID); /* The next sector is next for I/O: */ fp->fl_sector = f_results[ST_SEC] - BASE_SECTOR + 1; return(OK); } /*==========================================================================* * f_do_open * *==========================================================================*/ PRIVATE int f_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; /* pointer to open message */ { /* Handle an open on a floppy. Determine diskette type if need be. */ int dtype; struct test_order *top; /* Decode the message parameters. */ if (f_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); dtype = f_device & DEV_TYPE_BITS; /* get density from minor dev */ if (dtype >= MINOR_fd0p0) dtype = 0; if (dtype != 0) { /* All types except 0 indicate a specific drive/medium combination.*/ dtype = (dtype >> DEV_TYPE_SHIFT) - 1; if (dtype >= NT) return(ENXIO); f_fp->fl_density = dtype; (void) f_prepare(f_device); /* Recompute parameters. */ return(OK); } if (f_device & FORMAT_DEV_BIT) return(EIO); /* Can't format /dev/fdN */ /* The device opened is /dev/fdN. Experimentally determine drive/medium. * First check fl_density. If it is not NO_DENS, the drive has been used * before and the value of fl_density tells what was found last time. Try * that first. If the motor is still running then assume nothing changed. */ if (f_fp->fl_density != NO_DENS) { if (motor_status & (1 << f_drive)) return(OK); if (test_read(f_fp->fl_density) == OK) return(OK); } /* Either drive type is unknown or a different diskette is now present. * Use test_order to try them one by one. */ for (top = &test_order[0]; top < &test_order[NT-1]; top++) { dtype = top->t_density; /* Skip densities that have been proven to be impossible */ if (!(f_fp->fl_class & (1 << dtype))) continue; if (test_read(dtype) == OK) { /* The test succeeded, use this knowledge to limit the * drive class to match the density just read. */ f_fp->fl_class &= top->t_class; return(OK); } /* Test failed, wrong density or did it time out? */ if (f_busy == BSY_WAKEN) break; } f_fp->fl_density = NO_DENS; return(EIO); /* nothing worked */ } /*==========================================================================* * test_read * *==========================================================================*/ PRIVATE int test_read(density) int density; { /* Try to read the highest numbered sector on cylinder 2. Not all floppy * types have as many sectors per track, and trying cylinder 2 finds the * ones that need double stepping. */ int device; off_t position; iovec_t iovec1; f_fp->fl_density = density; device = ((density + 1) << DEV_TYPE_SHIFT) + f_drive; (void) f_prepare(device); position = (off_t) f_dp->test << SECTOR_SHIFT; iovec1.iov_addr = (vir_bytes) tmp_buf; iovec1.iov_size = SECTOR_SIZE; (void) f_transfer(FLOPPY, DEV_GATHER, position, &iovec1, 1); if (iovec1.iov_size != 0) return(EIO); partition(&f_dtab, f_drive, P_FLOPPY); return(OK); } /*============================================================================* * f_geometry * *============================================================================*/ PRIVATE void f_geometry(entry) struct partition *entry; { entry->cylinders = f_dp->cyls; entry->heads = NR_HEADS; entry->sectors = f_sectors; } /* Global variables used in the kernel. */ /* EXTERN is defined as extern except in table.c. */ #ifdef _TABLE #undef EXTERN #define EXTERN #endif /* Kernel memory. */ EXTERN phys_bytes code_base; /* base of kernel code */ EXTERN phys_bytes data_base; /* base of kernel data */ EXTERN phys_bytes aout; /* address of a.out headers */ /* Low level interrupt communications. */ EXTERN struct proc *held_head; /* head of queue of held-up interrupts */ EXTERN struct proc *held_tail; /* tail of queue of held-up interrupts */ EXTERN unsigned char k_reenter; /* kernel reentry count (entry count less 1)*/ /* Process table. Here to stop too many things having to include proc.h. */ EXTERN struct proc *proc_ptr; /* pointer to currently running process */ /* Signals. */ EXTERN int sig_procs; /* number of procs with p_pending != 0 */ /* Memory sizes. */ EXTERN struct memory mem[NR_MEMS]; /* base and size of chunks of memory */ EXTERN phys_clicks tot_mem_size; /* total system memory size */ /* Miscellaneous. */ extern struct tasktab tasktab[];/* initialized in table.c, so extern here */ extern char *t_stack[]; /* initialized in table.c, so extern here */ EXTERN unsigned lost_ticks; /* clock ticks counted outside the clock task */ EXTERN clock_t tty_timeout; /* time to wake up the TTY task */ EXTERN int current; /* currently visible console */ #if (CHIP == INTEL) /* Machine type. */ EXTERN int pc_at; /* PC-AT compatible hardware interface */ EXTERN int ps_mca; /* PS/2 with Micro Channel */ EXTERN unsigned int processor; /* 86, 186, 286, 386, ... */ #if _WORD_SIZE == 2 EXTERN int protected_mode; /* nonzero if running in Intel protected mode*/ #else #define protected_mode 1 /* 386 mode implies protected mode */ #endif /* Video card types. */ EXTERN int ega; /* nonzero if console is EGA */ EXTERN int vga; /* nonzero if console is VGA */ /* Miscellaneous. */ EXTERN irq_handler_t irq_table[NR_IRQ_VECTORS]; EXTERN int irq_use; /* bit map of all in-use irq's */ EXTERN reg_t mon_ss, mon_sp; /* monitor stack */ EXTERN int mon_return; /* true if return to the monitor possible */ EXTERN phys_bytes mon_params; /* boot parameter block passed in/out */ EXTERN size_t mon_parmsize; /* boot parameter block size */ /* Variables that are initialized elsewhere are just extern here. */ extern struct segdesc_s gdt[]; /* global descriptor table for protected mode*/ EXTERN _PROTOTYPE( void (*level0_func), (void) ); #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) /* Variables that are initialized elsewhere are just extern here. */ extern int keypad; /* Flag for keypad mode */ extern int app_mode; /* Flag for arrow key application mode */ extern int STdebKey; /* nonzero if ctl-alt-Fx detected */ extern struct tty *cur_cons; /* virtual cons currently displayed */ extern unsigned char font8[]; /* 8 pixel wide font table (initialized) */ extern unsigned char font12[]; /* 12 pixel wide font table (initialized) */ extern unsigned char font16[]; /* 16 pixel wide font table (initialized) */ extern unsigned short resolution; /* screen res; ST_RES_LOW..TT_RES_HIGH */ #endif /* This file contains routines for initializing the 8259 interrupt controller: * get_irq_handler: address of handler for a given interrupt * put_irq_handler: register an interrupt handler * intr_init: initialize the interrupt controller(s) */ #include "kernel.h" #define ICW1_AT 0x11 /* edge triggered, cascade, need ICW4 */ #define ICW1_PC 0x13 /* edge triggered, no cascade, need ICW4 */ #define ICW1_PS 0x19 /* level triggered, cascade, need ICW4 */ #define ICW4_AT 0x01 /* not SFNM, not buffered, normal EOI, 8086 */ #define ICW4_PC 0x09 /* not SFNM, buffered, normal EOI, 8086 */ FORWARD _PROTOTYPE( int spurious_irq, (int irq) ); #if _WORD_SIZE == 2 typedef _PROTOTYPE( void (*vecaddr_t), (void) ); FORWARD _PROTOTYPE( void set_vec, (int vec_nr, vecaddr_t addr) ); PRIVATE vecaddr_t int_vec[] = { int00, int01, int02, int03, int04, int05, int06, int07, }; PRIVATE vecaddr_t irq_vec[] = { hwint00, hwint01, hwint02, hwint03, hwint04, hwint05, hwint06, hwint07, hwint08, hwint09, hwint10, hwint11, hwint12, hwint13, hwint14, hwint15, }; #else #define set_vec(nr, addr) ((void)0) #endif /*==========================================================================* * intr_init * *==========================================================================*/ PUBLIC void intr_init(mine) int mine; { /* Initialize the 8259s, finishing with all interrupts disabled. This is * only done in protected mode, in real mode we don't touch the 8259s, but * use the BIOS locations instead. The flag "mine" is set if the 8259s are * to be programmed for Minix, or to be reset to what the BIOS expects. */ int i; lock(); if (protected_mode) { /* The AT and newer PS/2 have two interrupt controllers, one master, * one slaved at IRQ 2. (We don't have to deal with the PC that * has just one controller, because it must run in real mode.) */ out_byte(INT_CTL, ps_mca ? ICW1_PS : ICW1_AT); out_byte(INT_CTLMASK, mine ? IRQ0_VECTOR : BIOS_IRQ0_VEC); /* ICW2 for master */ out_byte(INT_CTLMASK, (1 << CASCADE_IRQ)); /* ICW3 tells slaves */ out_byte(INT_CTLMASK, ICW4_AT); out_byte(INT_CTLMASK, ~(1 << CASCADE_IRQ)); /* IRQ 0-7 mask */ out_byte(INT2_CTL, ps_mca ? ICW1_PS : ICW1_AT); out_byte(INT2_CTLMASK, mine ? IRQ8_VECTOR : BIOS_IRQ8_VEC); /* ICW2 for slave */ out_byte(INT2_CTLMASK, CASCADE_IRQ); /* ICW3 is slave nr */ out_byte(INT2_CTLMASK, ICW4_AT); out_byte(INT2_CTLMASK, ~0); /* IRQ 8-15 mask */ /* Copy the BIOS vectors from the BIOS to the Minix location, so we * can still make BIOS calls without reprogramming the i8259s. */ #if IRQ0_VECTOR != BIOS_IRQ0_VEC phys_copy(BIOS_VECTOR(0) * 4L, VECTOR(0) * 4L, 8 * 4L); #endif #if IRQ8_VECTOR != BIOS_IRQ8_VEC phys_copy(BIOS_VECTOR(8) * 4L, VECTOR(8) * 4L, 8 * 4L); #endif } else { /* Use the BIOS interrupt vectors in real mode. We only reprogram the * exceptions here, the interrupt vectors are reprogrammed on demand. * SYS_VECTOR is the Minix system call for message passing. */ for (i = 0; i < 8; i++) set_vec(i, int_vec[i]); set_vec(SYS_VECTOR, s_call); } /* Initialize the table of interrupt handlers. */ for (i = 0; i < NR_IRQ_VECTORS; i++) irq_table[i] = spurious_irq; } /*=========================================================================* * spurious_irq * *=========================================================================*/ PRIVATE int spurious_irq(irq) int irq; { /* Default interrupt handler. Should never be called... */ return 0; /* Leave interrupt masked */ } /*=========================================================================* * put_irq_handler * *=========================================================================*/ PUBLIC void put_irq_handler(irq, handler) int irq; irq_handler_t handler; { /* Register an interrupt handler. */ if (irq < 0 || irq >= NR_IRQ_VECTORS) panic("invalid call to put_irq_handler", irq); if (irq_table[irq] == handler) return; /* extra initialization */ if (irq_table[irq] != spurious_irq) panic("attempt to register second irq handler for irq", irq); disable_irq(irq); if (!protected_mode) set_vec(BIOS_VECTOR(irq), irq_vec[irq]); irq_table[irq]= handler; irq_use |= 1 << irq; } #if _WORD_SIZE == 2 /*===========================================================================* * set_vec * *===========================================================================*/ PRIVATE void set_vec(vec_nr, addr) int vec_nr; /* which vector */ vecaddr_t addr; /* where to start */ { /* Set up a real mode interrupt vector. */ u16_t vec[2]; /* Build the vector in the array 'vec'. */ vec[0] = (u16_t) addr; vec[1] = (u16_t) physb_to_hclick(code_base); /* Copy the vector into place. */ phys_copy(vir2phys(vec), vec_nr * 4L, 4L); } #endif /* _WORD_SIZE == 2 */ /* This is the master header for the kernel. It includes some other files * and defines the principal constants. */ #define _POSIX_SOURCE 1 /* tell headers to include POSIX stuff */ #define _MINIX 1 /* tell headers to include MINIX stuff */ #define _SYSTEM 1 /* tell headers that this is the kernel */ /* The following are so basic, all the *.c files get them automatically. */ #include /* MUST be first */ #include /* MUST be second */ #include #include #include #include #include #include #include #include "const.h" #include "type.h" #include "proto.h" #include "glo.h" /* Keyboard driver for PC's and AT's. * * Changed by Marcus Hampel (04/02/1994) * - Loadable keymaps */ #include "kernel.h" #include #include #include #include #include #include #include "tty.h" #include "keymaps/us-std.src" /* Standard and AT keyboard. (PS/2 MCA implies AT throughout.) */ #define KEYBD 0x60 /* I/O port for keyboard data */ /* AT keyboard. */ #define KB_COMMAND 0x64 /* I/O port for commands on AT */ #define KB_STATUS 0x64 /* I/O port for status on AT */ #define KB_ACK 0xFA /* keyboard ack response */ #define KB_OUT_FULL 0x01 /* status bit set when keypress char pending */ #define KB_IN_FULL 0x02 /* status bit set when not ready to receive */ #define LED_CODE 0xED /* command to keyboard to set LEDs */ #define MAX_KB_ACK_RETRIES 0x1000 /* max #times to wait for kb ack */ #define MAX_KB_BUSY_RETRIES 0x1000 /* max #times to loop while kb busy */ #define KBIT 0x80 /* bit used to ack characters to keyboard */ /* Miscellaneous. */ #define ESC_SCAN 0x01 /* Reboot key when panicking */ #define SLASH_SCAN 0x35 /* to recognize numeric slash */ #define RSHIFT_SCAN 0x36 /* to distinguish left and right shift */ #define HOME_SCAN 0x47 /* first key on the numeric keypad */ #define INS_SCAN 0x52 /* INS for use in CTRL-ALT-INS reboot */ #define DEL_SCAN 0x53 /* DEL for use in CTRL-ALT-DEL reboot */ #define CONSOLE 0 /* line number for console */ #define MEMCHECK_ADR 0x472 /* address to stop memory check after reboot */ #define MEMCHECK_MAG 0x1234 /* magic number to stop memory check */ #define KB_IN_BYTES 32 /* size of keyboard input buffer */ PRIVATE char ibuf[KB_IN_BYTES]; /* input buffer */ PRIVATE char *ihead = ibuf; /* next free spot in input buffer */ PRIVATE char *itail = ibuf; /* scan code to return to TTY */ PRIVATE int icount; /* # codes in buffer */ PRIVATE int esc; /* escape scan code detected? */ PRIVATE int alt_l; /* left alt key state */ PRIVATE int alt_r; /* right alt key state */ PRIVATE int alt; /* either alt key */ PRIVATE int ctrl_l; /* left control key state */ PRIVATE int ctrl_r; /* right control key state */ PRIVATE int ctrl; /* either control key */ PRIVATE int shift_l; /* left shift key state */ PRIVATE int shift_r; /* right shift key state */ PRIVATE int shift; /* either shift key */ PRIVATE int num_down; /* num lock key depressed */ PRIVATE int caps_down; /* caps lock key depressed */ PRIVATE int scroll_down; /* scroll lock key depressed */ PRIVATE int locks[NR_CONS]; /* per console lock keys state */ /* Lock key active bits. Chosen to be equal to the keyboard LED bits. */ #define SCROLL_LOCK 0x01 #define NUM_LOCK 0x02 #define CAPS_LOCK 0x04 PRIVATE char numpad_map[] = {'H', 'Y', 'A', 'B', 'D', 'C', 'V', 'U', 'G', 'S', 'T', '@'}; FORWARD _PROTOTYPE( int kb_ack, (void) ); FORWARD _PROTOTYPE( int kb_wait, (void) ); FORWARD _PROTOTYPE( int func_key, (int scode) ); FORWARD _PROTOTYPE( int scan_keyboard, (void) ); FORWARD _PROTOTYPE( unsigned make_break, (int scode) ); FORWARD _PROTOTYPE( void set_leds, (void) ); FORWARD _PROTOTYPE( int kbd_hw_int, (int irq) ); FORWARD _PROTOTYPE( void kb_read, (struct tty *tp) ); FORWARD _PROTOTYPE( unsigned map_key, (int scode) ); /*===========================================================================* * map_key0 * *===========================================================================*/ /* Map a scan code to an ASCII code ignoring modifiers. */ #define map_key0(scode) \ ((unsigned) keymap[(scode) * MAP_COLS]) /*===========================================================================* * map_key * *===========================================================================*/ PRIVATE unsigned map_key(scode) int scode; { /* Map a scan code to an ASCII code. */ int caps, column, lk; u16_t *keyrow; if (scode == SLASH_SCAN && esc) return '/'; /* don't map numeric slash */ keyrow = &keymap[scode * MAP_COLS]; caps = shift; lk = locks[current]; if ((lk & NUM_LOCK) && HOME_SCAN <= scode && scode <= DEL_SCAN) caps = !caps; if ((lk & CAPS_LOCK) && (keyrow[0] & HASCAPS)) caps = !caps; if (alt) { column = 2; if (ctrl || alt_r) column = 3; /* Ctrl + Alt == AltGr */ if (caps) column = 4; } else { column = 0; if (caps) column = 1; if (ctrl) column = 5; } return keyrow[column] & ~HASCAPS; } /*===========================================================================* * kbd_hw_int * *===========================================================================*/ PRIVATE int kbd_hw_int(irq) int irq; { /* A keyboard interrupt has occurred. Process it. */ int scode; /* Fetch the character from the keyboard hardware and acknowledge it. */ scode = scan_keyboard(); /* Store the scancode in memory so the task can get at it later. */ if (icount < KB_IN_BYTES) { *ihead++ = scode; if (ihead == ibuf + KB_IN_BYTES) ihead = ibuf; icount++; tty_table[current].tty_events = 1; force_timeout(); } return 1; /* Reenable keyboard interrupt */ } /*==========================================================================* * kb_read * *==========================================================================*/ PRIVATE void kb_read(tp) tty_t *tp; { /* Process characters from the circular keyboard buffer. */ char buf[3]; int scode; unsigned ch; tp = &tty_table[current]; /* always use the current console */ while (icount > 0) { scode = *itail++; /* take one key scan code */ if (itail == ibuf + KB_IN_BYTES) itail = ibuf; lock(); icount--; unlock(); /* Function keys are being used for debug dumps. */ if (func_key(scode)) continue; /* Perform make/break processing. */ ch = make_break(scode); if (ch <= 0xFF) { /* A normal character. */ buf[0] = ch; (void) in_process(tp, buf, 1); } else if (HOME <= ch && ch <= INSRT) { /* An ASCII escape sequence generated by the numeric pad. */ buf[0] = ESC; buf[1] = '['; buf[2] = numpad_map[ch - HOME]; (void) in_process(tp, buf, 3); } else if (ch == ALEFT) { /* Choose lower numbered console as current console. */ select_console(current - 1); set_leds(); } else if (ch == ARIGHT) { /* Choose higher numbered console as current console. */ select_console(current + 1); set_leds(); } else if (AF1 <= ch && ch <= AF12) { /* Alt-F1 is console, Alt-F2 is ttyc1, etc. */ select_console(ch - AF1); set_leds(); } } } /*===========================================================================* * make_break * *===========================================================================*/ PRIVATE unsigned make_break(scode) int scode; /* scan code of key just struck or released */ { /* This routine can handle keyboards that interrupt only on key depression, * as well as keyboards that interrupt on key depression and key release. * For efficiency, the interrupt routine filters out most key releases. */ int ch, make, escape; static int CAD_count = 0; /* Check for CTRL-ALT-DEL, and if found, halt the computer. This would * be better done in keyboard() in case TTY is hung, except control and * alt are set in the high level code. */ if (ctrl && alt && (scode == DEL_SCAN || scode == INS_SCAN)) { if (++CAD_count == 3) wreboot(RBT_HALT); cause_sig(INIT_PROC_NR, SIGABRT); return -1; } /* High-order bit set on key release. */ make = (scode & 0200) == 0; /* true if pressed */ ch = map_key(scode &= 0177); /* map to ASCII */ escape = esc; /* Key is escaped? (true if added since the XT) */ esc = 0; switch (ch) { case CTRL: /* Left or right control key */ *(escape ? &ctrl_r : &ctrl_l) = make; ctrl = ctrl_l | ctrl_r; break; case SHIFT: /* Left or right shift key */ *(scode == RSHIFT_SCAN ? &shift_r : &shift_l) = make; shift = shift_l | shift_r; break; case ALT: /* Left or right alt key */ *(escape ? &alt_r : &alt_l) = make; alt = alt_l | alt_r; break; case CALOCK: /* Caps lock - toggle on 0 -> 1 transition */ if (caps_down < make) { locks[current] ^= CAPS_LOCK; set_leds(); } caps_down = m++++++++ake; break; case NLOCK: /* Num lock */ if (num_down < make) { locks[current] ^= NUM_LOCK; set_leds(); } num_down = make; break; case SLOCK: /* Scroll lock */ if (scroll_down < make) { locks[current] ^= SCROLL_LOCK; set_leds(); } scroll_down = make; break; case EXTKEY: /* Escape keycode */ esc = 1; /* Next key is escaped */ return(-1); default: /* A normal key */ if (make) return(ch); } /* Key release, or a shift type key. */ return(-1); } /*===========================================================================* * set_leds * *===========================================================================*/ PRIVATE void set_leds() { /* Set the LEDs on the caps, num, and scroll lock keys */ if (!pc_at) return; /* PC/XT doesn't have LEDs */ kb_wait(); /* wait for buffer empty */ out_byte(KEYBD, LED_CODE); /* prepare keyboard to accept LED values */ kb_ack(); /* wait for ack response */ kb_wait(); /* wait for buffer empty */ out_byte(KEYBD, locks[current]); /* give keyboard LED values */ kb_ack(); /* wait for ack response */ } /*==========================================================================* * kb_wait * *==========================================================================*/ PRIVATE int kb_wait() { /* Wait until the controller is ready; return zero if this times out. */ int retries, status; retries = MAX_KB_BUSY_RETRIES + 1; /* wait until not busy */ while (--retries != 0 && (status = in_byte(KB_STATUS)) & (KB_IN_FULL|KB_OUT_FULL)) { if (status & KB_OUT_FULL) (void) in_byte(KEYBD); /* discard */ } return(retries); /* nonzero if ready */ } /*==========================================================================* * kb_ack * *==========================================================================*/ PRIVATE int kb_ack() { /* Wait until kbd acknowledges last command; return zero if this times out. */ int retries; retries = MAX_KB_ACK_RETRIES + 1; while (--retries != 0 && in_byte(KEYBD) != KB_ACK) ; /* wait for ack */ return(retries); /* nonzero if ack received */ } /*===========================================================================* * kb_init * *===========================================================================*/ PUBLIC void kb_init(tp) tty_t *tp; { /* Initialize the keyboard driver. */ tp->tty_devread = kb_read; /* Input function */ set_leds(); /* Turn off numlock led */ scan_keyboard(); /* Discard leftover keystroke */ /* Set interrupt handler and enable keyboard IRQ. */ put_irq_handler(KEYBOARD_IRQ, kbd_hw_int); enable_irq(KEYBOARD_IRQ); } /*===========================================================================* * kbd_loadmap * *===========================================================================*/ PUBLIC int kbd_loadmap(user_phys) phys_bytes user_phys; { /* Load a new keymap. */ phys_copy(user_phys, vir2phys(keymap), (phys_bytes) sizeof(keymap)); return(OK); } /*===========================================================================* * func_key * *===========================================================================*/ PRIVATE int func_key(scode) int scode; /* scan code for a function key */ { /* This procedure traps function keys for debugging and control purposes. */ unsigned code; if (scode & 0200) return(FALSE); /* key release */ code = map_key0(scode); /* first ignore modifiers */ if (code < F1 || code > F12) return(FALSE); /* not our job */ switch (map_key(scode)) { /* include modifiers */ case F1: p_dmp(); break; /* print process table */ case F2: map_dmp(); break; /* print memory map */ case F3: toggle_scroll(); break; /* hardware vs. software scrolling */ #if ENABLE_DP8390 case F5: dp_dump(); break; /* network statistics */ #endif case CF7: sigchar(&tty_table[CONSOLE], SIGQUIT); break; case CF8: sigchar(&tty_table[CONSOLE], SIGINT); break; case CF9: sigchar(&tty_table[CONSOLE], SIGKILL); break; default: return(FALSE); } return(TRUE); } /*==========================================================================* * scan_keyboard * *==========================================================================*/ PRIVATE int scan_keyboard() { /* Fetch the character from the keyboard hardware and acknowledge it. */ int code; int val; code = in_byte(KEYBD); /* get the scan code for the key struck */ val = in_byte(PORT_B); /* strobe the keyboard to ack the char */ out_byte(PORT_B, val | KBIT); /* strobe the bit high */ out_byte(PORT_B, val); /* now strobe it low */ return code; } /*==========================================================================* * wreboot * *==========================================================================*/ PUBLIC void wreboot(how) int how; /* 0 = halt, 1 = reboot, 2 = panic!, ... */ { /* Wait for keystrokes for printing debugging info and reboot. */ int quiet, code; static u16_t magic = MEMCHECK_MAG; struct tasktab *ttp; /* Mask all interrupts. */ out_byte(INT_CTLMASK, ~0); /* Tell several tasks to stop. */ cons_stop(); #if ENABLE_DP8390 dp8390_stop(); #endif floppy_stop(); clock_stop(); #if ENABLE_DOSFILE dosfile_stop(); #endif if (how == RBT_HALT) { printf("System Halted\n"); if (!mon_return) how = RBT_PANIC; } if (how == RBT_PANIC) { /* A panic! */ printf("Hit ESC to reboot, F-keys for debug dumps\n"); (void) scan_keyboard(); /* ack any old input */ quiet = scan_keyboard();/* quiescent value (0 on PC, last code on AT)*/ for (;;) { milli_delay(100); /* pause for a decisecond */ code = scan_keyboard(); if (code != quiet) { /* A key has been pressed. */ if (code == ESC_SCAN) break; /* reboot if ESC typed */ (void) func_key(code); /* process function key */ quiet = scan_keyboard(); } } how = RBT_REBOOT; } if (how == RBT_REBOOT) printf("Rebooting\n"); if (mon_return && how != RBT_RESET) { /* Reinitialize the interrupt controllers to the BIOS defaults. */ intr_init(0); out_byte(INT_CTLMASK, 0); out_byte(INT2_CTLMASK, 0); /* Return to the boot monitor. */ if (how == RBT_HALT) { phys_copy(vir2phys(""), mon_params, 2); } else if (how == RBT_REBOOT) { phys_copy(vir2phys("delay;boot"), mon_params, 11); } level0(monitor); } /* Stop BIOS memory test. */ phys_copy(vir2phys(&magic), (phys_bytes) MEMCHECK_ADR, (phys_bytes) sizeof(magic)); /* Reset the system by jumping to the reset address (real mode), or by * forcing a processor shutdown (protected mode). */ level0(reset); } ... Makefile french.srcgenmap.cgerman.srcitalian.srcjapanese.srclatin-am.srcolivetti.srcscandinavn.srcspanish.srcuk.srcus-std.srcus-swap.srcpolish.src# Generate binary keymaps. LK = /usr/lib/keymaps .SUFFIXES: .src .map .src.map: $(CC) -DKEYSRC=\"$<\" genmap.c ./a.out > $@ @rm -f a.out all: \ french.map \ german.map \ italian.map \ japanese.map \ latin-am.map \ olivetti.map \ polish.map \ scandinavn.map \ spanish.map \ uk.map \ us-std.map \ us-swap.map \ install: \ $(LK) \ $(LK)/french.map \ $(LK)/german.map \ $(LK)/italian.map \ $(LK)/japanese.map \ $(LK)/latin-am.map \ $(LK)/olivetti.map \ $(LK)/polish.map \ $(LK)/scandinavn.map \ $(LK)/spanish.map \ $(LK)/uk.map \ $(LK)/us-std.map \ $(LK)/us-swap.map \ clean: rm -f a.out *.map $(LK): install -d $@ $(LK)/french.map: french.map install -c $? $@ $(LK)/german.map: german.map install -c $? $@ $(LK)/italian.map: italian.map install -c $? $@ $(LK)/japanese.map: japanese.map install -c $? $@ $(LK)/latin-am.map: latin-am.map install -c $? $@ $(LK)/olivetti.map: olivetti.map install -c $? $@ $(LK)/polish.map: polish.map install -c $? $@ $(LK)/scandinavn.map: scandinavn.map install -c $? $@ $(LK)/spanish.map: spanish.map install -c $? $@ $(LK)/uk.map: uk.map install -c $? $@ $(LK)/us-std.map: us-std.map install -c $? $@ $(LK)/us-swap.map: us-swap.map install -c $? $@ /* Keymap for the French keyboard. */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['), /* 02 - '1' */ '&', '1', A('1'), '&', '1', C('A'), /* 03 - '2' */ 0202, '2', A('2'), '~', '2', C('B'), /* 04 - '3' */ '"', '3', A('3'), '#', '3', C('C'), /* 05 - '4' */ '\'', '4', A('4'), '{', '4', C('D'), /* 06 - '5' */ '(', '5', A('5'), '[', '5', C('E'), /* 07 - '6' */ '-', '6', A('6'), '|', '6', C('F'), /* 08 - '7' */ 0212, '7', A('7'), '`', '7', C('G'), /* 09 - '8' */ '_', '8', A('8'), '\\', '8', C('H'), /* 10 - '9' */ 0207, '9', A('9'), '^', '9', C('I'), /* 11 - '0' */ 0205, '0', A('0'), '@', '0', C('J'), /* 12 - '-' */ ')', 0370, A(')'), ']', '-', C('K'), /* 13 - '=' */ '=', '+', A('='), '}', '=', C('L'), /* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'), /* 16 - 'q' */ L('a'), 'A', A('a'), 'a', 'Q', C('A'), /* 17 - 'w' */ L('z'), 'Z', A('z'), 'z', 'W', C('Z'), /* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'), /* 26 - '[' */ '^', '"', A('^'), '^', '[', C('^'), /* 27 - ']' */ '$', 0234, A('$'), '$', ']', C('$'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('q'), 'Q', A('q'), 'q', 'A', C('Q'), /* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'), /* 39 - ';' */ L('m'), 'M', A('m'), 'm', 'M', C('M'), /* 40 - '\'' */ 0227, '%', A('%'), 0227, '\\', C('G'), /* 41 - '`' */ 0375, 0375, 0375, 0375, '`', C('['), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '`' */ '*', 0346, A('*'), '*', '`', C('*'), /* 44 - 'z' */ L('w'), 'W', A('w'), 'w', 'Z', C('W'), /* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'), /* 50 - 'm' */ ',', '?', A(','), ',', 'm', C('@'), /* 51 - ',' */ ';', '.', A(';'), ';', ',', C('@'), /* 52 - '.' */ ':', '/', A(':'), ':', '.', C('@'), /* 53 - '/' */ '!', '$'/*025*/,A('!'), '!', '/', C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, '5', CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS, /* 79 - End */ END, '1', AEND, AEND, '1', CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT, /* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* genmap - output binary keymap Author: Marcus Hampel */ #include #include #include #include #include #include #include #include KEYSRC u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1]; void tell(const char *s) { write(2, s, strlen(s)); } int main(void) { u8_t *cm, *fb; u16_t *km; int n; /* Compress the keymap. */ memcpy(comprmap, KEY_MAGIC, 4); cm = comprmap + 4; n = 8; for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) { if (n == 8) { /* Allocate a new flag byte. */ fb = cm; *cm++ = 0; n= 0; } *cm++ = (*km & 0x00FF); /* Low byte. */ if (*km & 0xFF00) { *cm++ = (*km >> 8); /* High byte only when set. */ *fb |= (1 << n); /* Set a flag if so. */ } n++; } /* Don't store trailing zeros. */ while (cm > comprmap && cm[-1] == 0) cm--; /* Emit the compressed keymap. */ if (write(1, comprmap, cm - comprmap) < 0) { int err = errno; tell("genmap: "); tell(strerror(err)); tell("\n"); exit(1); } exit(0); } /* Keymap for German MF-2 keyboard. */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code unsh Shift Alt AltGr Alt+Sh Strg */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['), /* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'), /* 03 - '2' */ '2', '"', A('2'), 0375, '@', C('@'), /* 04 - '3' */ '3', 025, A('3'), 0374, '#', C('C'), /* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'), /* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'), /* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'), /* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'), /* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'), /* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'), /* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'), /* 12 - '-' */ 0341, '?', 0341, '\\', '_', C('_'), /* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'), /* 21 - 'y' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'), /* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'), /* 26 - '[' */ L(0201),0232, 0201, '[', '{', C('['), /* 27 - ']' */ '+', '*', A('+'), '~', ']', C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 29 - Strg;-) */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'), /* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'), /* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'), /* 41 - '`' */ '^', 0370, A('^'), '`', '~', C('^'), /* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ '#', '\'', A('#'), '\\', '|', C('\\'), /* 44 - 'z' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'), /* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'), /* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'), /* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'), /* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'), /* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, '5', CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS, /* 79 - End */ END, '1', AEND, AEND, '1', CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT, /* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for Italian keyboard. */ /* Modified by Ernesto Del Prete in October 1997 */ /* ernesto@cclix1.polito.it or s84508@cclix1.polito.it */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['), /* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'), /* 03 - '2' */ '2', '"', A('2'), '2', '@', C('@'), /* 04 - '3' */ '3', 0234, A('3'), '3', 0234, C('C'), /* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'), /* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'), /* 07 - '6' */ '6', '&', A('6'), '6', '&', C('F'), /* 08 - '7' */ '7', '/', A('7'), '7', '/', C('G'), /* 09 - '8' */ '8', '(', A('8'), '8', '(', C('H'), /* 10 - '9' */ '9', ')', A('9'), '8', ')', C('I'), /* 11 - '0' */ '0', '=', A('0'), '0', '=', C('@'), /* 12 - '-' */ '\'', '?', A('\''),'`', '?', C('@'), /* 13 - '=' */ 0215, '^', A('|'), 0215, '^', C('^'), /* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'), /* 26 - '[' */ 0212, 0202, 0212, '[', '{', C('['), /* 27 - ']' */ '+', '*', A('+'), ']', '}', C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'), /* 39 - ';' */ 0225, 0207, 0225, '@', '@', C('@'), /* 40 - '\'' */ 0205, 0370, 0205, '#', 0276, C('@'), /* 41 - '`' */ '\\', '|', A('\\'),0176, '|', C('\\'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ 0227, 025, 0227, 0227, 025, C('@'), /* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'), /* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'), /* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'), /* 53 - '/' */ '-', '_', A('-'), '-', '_', C('_'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, '5', CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS, /* 79 - End */ END, '1', AEND, AEND, '1', CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT, /* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* * Keymap for Japanese 106 keyboard. * Dec. 31 1995 * Toshiya Ogawa * */ /* * Japanese 106 keyboard has following additional 5 scan codes * compared to US standard 101 keyboard. * * scan-code keytop effect in this keymap * ------------------------------------------------------- * 112(0x70) KANA (ignored) * 115(0x73) BackSlash mapped to '\\' and '_' * 121(0x79) HENKAN (ignored) * 123(0x7B) MU-HENKAN (ignored) * 125(0x7D) YEN mapped to '\\' and '|' */ #if (NR_SCAN_CODES != 0x80) #error NR_SCAN_CODES mis-match #endif u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'), /* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'), /* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'), /* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'), /* 11 - '0' */ '0', '~', A('0'), A('0'), A('~'), C('@'), /* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'), /* 13 - '^' */ '^', '~', A('^'), A('^'), A('~'), C('^'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '@' */ '@', '`', A('@'), A('@'), A('`'), C('@'), /* 27 - '[' */ '[', '{', A('['), A('['), A('{'), C('['), /* 28 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'), /* 40 - ':' */ ':', '*', A(':'), A(':'), A('*'), C('@'), /* 41 - KANJI */ 0, 0, 0, 0, 0, 0, /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ 0, 0, 0, 0, 0, 0, /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - KANA */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - '\\' */ '\\', '_', A('\\'),A('\\'),A('_'), C('_'), /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - HENKAN */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - MU-HENKAN*/ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - YEN */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'), /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /*** Keymap for Latin American keyboard. v1.02 Victor A. Rodriguez - El bit Fantasma - Bit-Man@Tasa.Com.AR The Latin American keyboard makes differences between the left and right ALT keys (the right one is so called ALT GR), and uses accent. Release History =============== v1.00 Initial version v1.01 Extended ASCII characters replaced by hex. equivalents v1.02 NR_SCAN_CODES has grown to 0x80, required by Toshiya Ogawa (ogw@shizuokanet.or.jp) and added by Kees J.Bot (kjb@cs.vu.nl) in MINIX 1.7.2 ***/ #if (NR_SCAN_CODES != 0x80) #error NR_SCAN_CODES mis-match #endif u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('@'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '&', A('6'), A('6'), A('$'), C('^'), /* 08 - '7' */ '7', '/', A('7'), A('7'), A('/'), C('G'), /* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'), /* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'), /* 11 - '0' */ '0', '=', A('0'), A('0'), A('='), C('@'), /* 12 - '-' */ '\'', '?', A('\''), 0x5c, A('?'), C('?'), /* 13 - '' */ 0xa8, 0xad, A(0xa8),A(0xa8),A(0xad), C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), 0x40, A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '' */ 0xef, 0xf9, A(0xef),A(0xef),A(0xf9),C(0xef), /* 27 - '+' */ '+', '*', A('+'), 0x7e, A('*'), C('+'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - '' */ L(0xa4),0xa5, A(0xa4),A(0xa4),A(0xa5),C('@'), /* 40 - '{' */ '{', '[', A('{'), 0x5e, A('['), C('@'), /* 41 - '|' */ '|', 0xf8, A('|'), 0xaa, A('\''),C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '}' */ 0x7d, 0x5d, A('<'), 0x60, A('>'), C('<'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', ';', A(','), A(','), A(';'), C('@'), /* 52 - '.' */ '.', ':', A('.'), A('.'), A(':'), C('@'), /* 53 - '/' */ '-', '_', A('-'), A('-'), A('_'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ '-', '-', '-', '-', '-', '-', /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ '+', '+', '+', '+', '+', '+', /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), A('>'), A('>'), C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, ,,, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for the Olivetti M24. */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '"', A('2'), A('2'), A('"'), C('B'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '&', A('6'), A('6'), A('&'), C('F'), /* 08 - '7' */ '7', '\'', A('7'), A('7'), A('\''),C('G'), /* 09 - '8' */ '8', '(', A('8'), A('8'), A('('), C('H'), /* 10 - '9' */ '9', ')', A('9'), A('9'), A(')'), C('I'), /* 11 - '0' */ '0', '_', A('0'), A('0'), A('_'), C('@'), /* 12 - '-' */ '-', '=', A('-'), A('-'), A('='), C('@'), /* 13 - '=' */ '^', '~', A('^'), A('^'), A('~'), C('^'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '[' */ '@', '`', A('@'), A('@'), A('`'), C('@'), /* 27 - ']' */ '[', '{', A('['), A('['), A('{'), C('['), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - ';' */ ';', '+', A(';'), A(';'), A('+'), C('@'), /* 40 - '\'' */ ':', '*', A(':'), A(':'), A('*'), C('@'), /* 41 - '`' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ C('S'), C('S'), C('S'), C('S'), C('S'), C('S'), /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 85 - ??? */ LEFT, 014, A(014), A(014), A(014), 014, /* 86 - ??? */ 0212, 0212, 0212, 0212, 0212, 0212, /* 87 - F11 */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ DOWN, DOWN, DOWN, DOWN, DOWN, DOWN, /* 90 - ??? */ RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, RIGHT, /* 91 - ??? */ UP, UP, UP, UP, UP, UP, /* 92 - ??? */ LEFT, LEFT, LEFT, LEFT, LEFT, LEFT, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for Scandinavian keyboard. * by Oliver Reitalu, nolx@nolx.tartu.ee * preliminary version, 8 Sept 1996 */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code unsh Shift Alt AltGr Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['), /* 02 - '1' */ '1', '!', A('1'), '1', '!', C('A'), /* 03 - '2' */ '2', '"', A('2'), '@', '@', C('@'), /* 04 - '3' */ '3', '#', A('3'), 156, '#', C('C'), /* 05 - '4' */ '4', ' ', A('4'), '$', '$', C('D'), /* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'), /* 07 - '6' */ '6', '&', A('6'), '6', '^', C('^'), /* 08 - '7' */ '7', '/', A('7'), '{', '&', C('G'), /* 09 - '8' */ '8', '(', A('8'), '[', '*', C('H'), /* 10 - '9' */ '9', ')', A('9'), ']', '(', C('I'), /* 11 - '0' */ '0', '=', A('0'), '}', ')', C('@'), /* 12 - '_' */ '+', '?', 0341, '\\', '_', C('_'), /* 13 - '=' */ '\'', '`', A('\''),'=', '+', C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), '@', 'Q', C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'), /* 26 - '[' */ L(134), 143, 0201, '[', '{', C('['), /* 27 - ']' */ '\"', '^', A('+'), '~', ']', C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'), /* 39 - ';' */ L(0224),0231, 0224, ';', ':', C('@'), /* 40 - '\'' */ L(0204),0216, 0204, '\'', '"', C('@'), /* 41 - '`' */ L(21), 171, A('^'), '`', '~', C('^'), /* 42 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ 39, '*', A('#'), '\\', '|', C('\\'), /* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), 0346, 'M', C('M'), /* 51 - ',' */ ',', ';', A(','), ',', '<', C('@'), /* 52 - '.' */ '.', ':', A('.'), '.', '>', C('@'), /* 53 - '/' */ '-', '_', A('-'), '/', '?', C('_'), /* 54 - SHIFT */ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), '*', '*', C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, '5', CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS, /* 79 - End */ END, '1', AEND, AEND, '1', CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT, /* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), '|', '>', C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for Spanish MF-2 keyboard. */ /* Modified by Javier Garcia Martin jawa@inf.deusto.es */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt AltGr Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),C('['), C('['), C('['), /* 02 - '1' */ '1', '!', A('1'), '|', '!', C('A'), /* 03 - '2' */ '2', '"', A('2'), '@', '"', C('@'), /* 04 - '3' */ '3', 0372, A('3'), '#', 0372, C('C'), /* 05 - '4' */ '4', '$', A('4'), '4', '$', C('D'), /* 06 - '5' */ '5', '%', A('5'), '5', '%', C('E'), /* 07 - '6' */ '6', '&', A('6'), 0252, '&', C('F'), /* 08 - '7' */ '7', '/', A('7'), '{', '/', C('G'), /* 09 - '8' */ '8', '(', A('8'), '(', '(', C('H'), /* 10 - '9' */ '9', ')', A('9'), ')', ')', C('I'), /* 11 - '0' */ '0', '=', A('0'), '=', '=', C('@'), /* 12 - '-' */ '\'', '?', A('\''),'?', '?', C('_'), /* 13 - '=' */ 0255, 0250, A(0255),0250, 0250, C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),C('H'), C('H'), 0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),C('I'), C('I'), C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), 'q', 'Q', C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), 'w', 'W', C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), 'e', 'E', C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), 'r', 'R', C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), 't', 'T', C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), 'y', 'Y', C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), 'u', 'U', C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), 'i', 'I', C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), 'o', 'O', C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), 'p', 'P', C('P'), /* 26 - '[' */ '`', '^', A('`'),'[', '^', C('['), /* 27 - ']' */ '+', '*', A('+'), ']', '*', C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), 'a', 'A', C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), 's', 'S', C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), 'd', 'D', C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), 'f', 'F', C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), 'g', 'G', C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), 'h', 'H', C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), 'j', 'J', C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), 'k', 'K', C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), 'l', 'L', C('L'), /* 39 - ';' */ L(0244),0245, A(0244),0244, 0245, C('@'), /* 40 - '\'' */ '\'', '"', A('\''),'{', '"', C('@'), /* 41 - '`' */ 0247, 0246, A(0247),'\\', 0246, C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ L(0207),0200, A(0207),'}', 0200, C('@'), /* 44 - 'z' */ L('z'), 'Z', A('z'), 'z', 'Z', C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), 'x', 'X', C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), 'c', 'C', C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), 'v', 'V', C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), 'b', 'B', C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), 'n', 'N', C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), 'm', 'M', C('M'), /* 51 - ',' */ ',', ';', A(','), ',', ';', C('@'), /* 52 - '.' */ '.', ':', A('.'), '.', ':', C('@'), /* 53 - '/' */ '-', '_', A('-'), '-', '_', C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), '*', '*', C('M'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), ' ', ' ', C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, '7', CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, '8', CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, '9', CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, '-', CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, '4', CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, '5', CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, '6', CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, '+', CPLUS, /* 79 - End */ END, '1', AEND, AEND, '1', CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, '2', CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, '3', CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, '0', CINSRT, /* 83 - Delete */ 0177, '.', A(0177),0177, '.', 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),C('M'), C('M'), C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), '<', '>', C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for standard UK keyboard. Author: Darren Mason */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '"', A('2'), A('2'), A('@'), C('@'), /* 04 - '3' */ '3', 156, A('3'), A('3'), A(156), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'), /* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'), /* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'), /* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'), /* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'), /* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'), /* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['), /* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'), /* 40 - '\'' */ '\'', '@', A('\''),A('\''),A('"'), C('@'), /* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '#' */ '#', '~', A('#'), A('#'), A('~'), C('#'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '\\', '|', A('\\'),A('|'), A('|'), C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for US MF-2 keyboard. */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'), /* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'), /* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'), /* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'), /* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'), /* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'), /* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['), /* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'), /* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'), /* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* Keymap for US MF-2 keyboard with the Caps Lock and Control key swapped. */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'), /* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'), /* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'), /* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'), /* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'), /* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'), /* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A('e'), A('e'), A('E'), C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A('o'), A('o'), A('O'), C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['), /* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 30 - 'a' */ L('a'), 'A', A('a'), A('a'), A('A'), C('A'), /* 31 - 's' */ L('s'), 'S', A('s'), A('s'), A('S'), C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A('l'), A('l'), A('L'), C('L'), /* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'), /* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'), /* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'), /* 44 - 'z' */ L('z'), 'Z', A('z'), A('z'), A('Z'), C('Z'), /* 45 - 'x' */ L('x'), 'X', A('x'), A('x'), A('X'), C('X'), /* 46 - 'c' */ L('c'), 'C', A('c'), A('c'), A('C'), C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A('n'), A('n'), A('N'), C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; /* * Keymap for US MF-2 keyboard. + Polish national letters. * Modified by Antek Sawicki * Charset: ISO-8859-2 - [Polska Norma PN-93 T-42118] */ u16_t keymap[NR_SCAN_CODES * MAP_COLS] = { /* scan-code !Shift Shift Alt1 Alt2 Alt+Sh Ctrl */ /* ==================================================================== */ /* 00 - none */ 0, 0, 0, 0, 0, 0, /* 01 - ESC */ C('['), C('['), CA('['),CA('['),CA('['),C('['), /* 02 - '1' */ '1', '!', A('1'), A('1'), A('!'), C('A'), /* 03 - '2' */ '2', '@', A('2'), A('2'), A('@'), C('@'), /* 04 - '3' */ '3', '#', A('3'), A('3'), A('#'), C('C'), /* 05 - '4' */ '4', '$', A('4'), A('4'), A('$'), C('D'), /* 06 - '5' */ '5', '%', A('5'), A('5'), A('%'), C('E'), /* 07 - '6' */ '6', '^', A('6'), A('6'), A('^'), C('^'), /* 08 - '7' */ '7', '&', A('7'), A('7'), A('&'), C('G'), /* 09 - '8' */ '8', '*', A('8'), A('8'), A('*'), C('H'), /* 10 - '9' */ '9', '(', A('9'), A('9'), A('('), C('I'), /* 11 - '0' */ '0', ')', A('0'), A('0'), A(')'), C('@'), /* 12 - '-' */ '-', '_', A('-'), A('-'), A('_'), C('_'), /* 13 - '=' */ '=', '+', A('='), A('='), A('+'), C('@'), /* 14 - BS */ C('H'), C('H'), CA('H'),CA('H'),CA('H'),0177, /* 15 - TAB */ C('I'), C('I'), CA('I'),CA('I'),CA('I'),C('I'), /* 16 - 'q' */ L('q'), 'Q', A('q'), A('q'), A('Q'), C('Q'), /* 17 - 'w' */ L('w'), 'W', A('w'), A('w'), A('W'), C('W'), /* 18 - 'e' */ L('e'), 'E', A(0xea),A(0xea),A(0xca),C('E'), /* 19 - 'r' */ L('r'), 'R', A('r'), A('r'), A('R'), C('R'), /* 20 - 't' */ L('t'), 'T', A('t'), A('t'), A('T'), C('T'), /* 21 - 'y' */ L('y'), 'Y', A('y'), A('y'), A('Y'), C('Y'), /* 22 - 'u' */ L('u'), 'U', A('u'), A('u'), A('U'), C('U'), /* 23 - 'i' */ L('i'), 'I', A('i'), A('i'), A('I'), C('I'), /* 24 - 'o' */ L('o'), 'O', A(0xf3),A(0xf3),A(0xd3),C('O'), /* 25 - 'p' */ L('p'), 'P', A('p'), A('p'), A('P'), C('P'), /* 26 - '[' */ '[', '{', A('['), A('['), A('{'), C('['), /* 27 - ']' */ ']', '}', A(']'), A(']'), A('}'), C(']'), /* 28 - CR/LF */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 29 - Ctrl */ CTRL, CTRL, CTRL, CTRL, CTRL, CTRL, /* 30 - 'a' */ L('a'), 'A', A(0xb1),A(0xb1),A(0xa1),C('A'), /* 31 - 's' */ L('s'), 'S', A(0xb6),A(0xb6),A(0xa6),C('S'), /* 32 - 'd' */ L('d'), 'D', A('d'), A('d'), A('D'), C('D'), /* 33 - 'f' */ L('f'), 'F', A('f'), A('f'), A('F'), C('F'), /* 34 - 'g' */ L('g'), 'G', A('g'), A('g'), A('G'), C('G'), /* 35 - 'h' */ L('h'), 'H', A('h'), A('h'), A('H'), C('H'), /* 36 - 'j' */ L('j'), 'J', A('j'), A('j'), A('J'), C('J'), /* 37 - 'k' */ L('k'), 'K', A('k'), A('k'), A('K'), C('K'), /* 38 - 'l' */ L('l'), 'L', A(0xb3),A(0xb3),A(0xa3),C('L'), /* 39 - ';' */ ';', ':', A(';'), A(';'), A(':'), C('@'), /* 40 - '\'' */ '\'', '"', A('\''),A('\''),A('"'), C('@'), /* 41 - '`' */ '`', '~', A('`'), A('`'), A('~'), C('@'), /* 42 - l. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 43 - '\\' */ '\\', '|', A('\\'),A('\\'),A('|'), C('\\'), /* 44 - 'z' */ L('z'), 'Z', A(0xbf),A(0xbf),A(0xaf),C('Z'), /* 45 - 'x' */ L('x'), 'X', A(0xbc),A(0xbc),A(0xac),C('X'), /* 46 - 'c' */ L('c'), 'C', A(0xe6),A(0xe6),A(0xc6),C('C'), /* 47 - 'v' */ L('v'), 'V', A('v'), A('v'), A('V'), C('V'), /* 48 - 'b' */ L('b'), 'B', A('b'), A('b'), A('B'), C('B'), /* 49 - 'n' */ L('n'), 'N', A(0xf1),A(0xf1),A(0xd1),C('N'), /* 50 - 'm' */ L('m'), 'M', A('m'), A('m'), A('M'), C('M'), /* 51 - ',' */ ',', '<', A(','), A(','), A('<'), C('@'), /* 52 - '.' */ '.', '>', A('.'), A('.'), A('>'), C('@'), /* 53 - '/' */ '/', '?', A('/'), A('/'), A('?'), C('@'), /* 54 - r. SHIFT*/ SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, SHIFT, /* 55 - '*' */ '*', '*', A('*'), A('*'), A('*'), C('@'), /* 56 - ALT */ ALT, ALT, ALT, ALT, ALT, ALT, /* 57 - ' ' */ ' ', ' ', A(' '), A(' '), A(' '), C('@'), /* 58 - CapsLck */ CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, CALOCK, /* 59 - F1 */ F1, SF1, AF1, AF1, ASF1, CF1, /* 60 - F2 */ F2, SF2, AF2, AF2, ASF2, CF2, /* 61 - F3 */ F3, SF3, AF3, AF3, ASF3, CF3, /* 62 - F4 */ F4, SF4, AF4, AF4, ASF4, CF4, /* 63 - F5 */ F5, SF5, AF5, AF5, ASF5, CF5, /* 64 - F6 */ F6, SF6, AF6, AF6, ASF6, CF6, /* 65 - F7 */ F7, SF7, AF7, AF7, ASF7, CF7, /* 66 - F8 */ F8, SF8, AF8, AF8, ASF8, CF8, /* 67 - F9 */ F9, SF9, AF9, AF9, ASF9, CF9, /* 68 - F10 */ F10, SF10, AF10, AF10, ASF10, CF10, /* 69 - NumLock */ NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, NLOCK, /* 70 - ScrLock */ SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, SLOCK, /* 71 - Home */ HOME, '7', AHOME, AHOME, A('7'), CHOME, /* 72 - CurUp */ UP, '8', AUP, AUP, A('8'), CUP, /* 73 - PgUp */ PGUP, '9', APGUP, APGUP, A('9'), CPGUP, /* 74 - '-' */ NMIN, '-', ANMIN, ANMIN, A('-'), CNMIN, /* 75 - Left */ LEFT, '4', ALEFT, ALEFT, A('4'), CLEFT, /* 76 - MID */ MID, '5', AMID, AMID, A('5'), CMID, /* 77 - Right */ RIGHT, '6', ARIGHT, ARIGHT, A('6'), CRIGHT, /* 78 - '+' */ PLUS, '+', APLUS, APLUS, A('+'), CPLUS, /* 79 - End */ END, '1', AEND, AEND, A('1'), CEND, /* 80 - Down */ DOWN, '2', ADOWN, ADOWN, A('2'), CDOWN, /* 81 - PgDown */ PGDN, '3', APGDN, APGDN, A('3'), CPGDN, /* 82 - Insert */ INSRT, '0', AINSRT, AINSRT, A('0'), CINSRT, /* 83 - Delete */ 0177, '.', A(0177),A(0177),A('.'), 0177, /* 84 - Enter */ C('M'), C('M'), CA('M'),CA('M'),CA('M'),C('J'), /* 85 - ??? */ 0, 0, 0, 0, 0, 0, /* 86 - ??? */ '<', '>', A('<'), A('|'), A('>'), C('@'), /* 87 - F11 */ F11, SF11, AF11, AF11, ASF11, CF11, /* 88 - F12 */ F12, SF12, AF12, AF12, ASF12, CF12, /* 89 - ??? */ 0, 0, 0, 0, 0, 0, /* 90 - ??? */ 0, 0, 0, 0, 0, 0, /* 91 - ??? */ 0, 0, 0, 0, 0, 0, /* 92 - ??? */ 0, 0, 0, 0, 0, 0, /* 93 - ??? */ 0, 0, 0, 0, 0, 0, /* 94 - ??? */ 0, 0, 0, 0, 0, 0, /* 95 - ??? */ 0, 0, 0, 0, 0, 0, /* 96 - EXT_KEY */ EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, EXTKEY, /* 97 - ??? */ 0, 0, 0, 0, 0, 0, /* 98 - ??? */ 0, 0, 0, 0, 0, 0, /* 99 - ??? */ 0, 0, 0, 0, 0, 0, /*100 - ??? */ 0, 0, 0, 0, 0, 0, /*101 - ??? */ 0, 0, 0, 0, 0, 0, /*102 - ??? */ 0, 0, 0, 0, 0, 0, /*103 - ??? */ 0, 0, 0, 0, 0, 0, /*104 - ??? */ 0, 0, 0, 0, 0, 0, /*105 - ??? */ 0, 0, 0, 0, 0, 0, /*106 - ??? */ 0, 0, 0, 0, 0, 0, /*107 - ??? */ 0, 0, 0, 0, 0, 0, /*108 - ??? */ 0, 0, 0, 0, 0, 0, /*109 - ??? */ 0, 0, 0, 0, 0, 0, /*110 - ??? */ 0, 0, 0, 0, 0, 0, /*111 - ??? */ 0, 0, 0, 0, 0, 0, /*112 - ??? */ 0, 0, 0, 0, 0, 0, /*113 - ??? */ 0, 0, 0, 0, 0, 0, /*114 - ??? */ 0, 0, 0, 0, 0, 0, /*115 - ??? */ 0, 0, 0, 0, 0, 0, /*116 - ??? */ 0, 0, 0, 0, 0, 0, /*117 - ??? */ 0, 0, 0, 0, 0, 0, /*118 - ??? */ 0, 0, 0, 0, 0, 0, /*119 - ??? */ 0, 0, 0, 0, 0, 0, /*120 - ??? */ 0, 0, 0, 0, 0, 0, /*121 - ??? */ 0, 0, 0, 0, 0, 0, /*122 - ??? */ 0, 0, 0, 0, 0, 0, /*123 - ??? */ 0, 0, 0, 0, 0, 0, /*124 - ??? */ 0, 0, 0, 0, 0, 0, /*125 - ??? */ 0, 0, 0, 0, 0, 0, /*126 - ??? */ 0, 0, 0, 0, 0, 0, /*127 - ??? */ 0, 0, 0, 0, 0, 0 }; # ! Chooses between the 8086 and 386 versions of the low level kernel code. #include #if _WORD_SIZE == 2 #include "klib88.s" #else #include "klib386.s" #endif # ! sections .sect .text; .sect .rom; .sect .data; .sect .bss #include #include #include "const.h" #include "sconst.h" #include "protect.h" ! This file contains a number of assembly code utility routines needed by the ! kernel. They are: .define _monitor ! exit Minix and return to the monitor .define _int86 ! let the monitor make an 8086 interrupt call .define _cp_mess ! copies messages from source to destination .define _exit ! dummy for library routines .define __exit ! dummy for library routines .define ___exit ! dummy for library routines .define ___main ! dummy for GCC .define _in_byte ! read a byte from a port and return it .define _in_word ! read a word from a port and return it .define _out_byte ! write a byte to a port .define _out_word ! write a word to a port .define _port_read ! transfer data from (disk controller) port to memory .define _port_read_byte ! likewise byte by byte .define _port_write ! transfer data from memory to (disk controller) port .define _port_write_byte ! likewise byte by byte .define _lock ! disable interrupts .define _unlock ! enable interrupts .define _enable_irq ! enable an irq at the 8259 controller .define _disable_irq ! disable an irq .define _phys_copy ! copy data from anywhere to anywhere in memory .define _mem_rdw ! copy one word from [segment:offset] .define _reset ! reset the system .define _mem_vid_copy ! copy data to video ram .define _vid_vid_copy ! move data in video ram .define _level0 ! call a function at level 0 ! The routines only guarantee to preserve the registers the C compiler ! expects to be preserved (ebx, esi, edi, ebp, esp, segment registers, and ! direction bit in the flags). .sect .text !*===========================================================================* !* monitor * !*===========================================================================* ! PUBLIC void monitor(); ! Return to the monitor. _monitor: mov esp, (_mon_sp) ! restore monitor stack pointer o16 mov dx, SS_SELECTOR ! monitor data segment mov ds, dx mov es, dx mov fs, dx mov gs, dx mov ss, dx pop edi pop esi pop ebp o16 retf ! return to the monitor !*===========================================================================* !* int86 * !*===========================================================================* ! PUBLIC void int86(); _int86: cmpb (_mon_return), 0 ! is the monitor there? jnz 0f movb ah, 0x01 ! an int 13 error seems appropriate movb (_reg86+ 0), ah ! reg86.w.f = 1 (set carry flag) movb (_reg86+13), ah ! reg86.b.ah = 0x01 = "invalid command" ret 0: push ebp ! save C registers push esi push edi push ebx pushf ! save flags cli ! no interruptions inb INT2_CTLMASK movb ah, al inb INT_CTLMASK push eax ! save interrupt masks mov eax, (_irq_use) ! map of in-use IRQ`s and eax, ~[1<= 8 at the slave 8259 enable_0: inb INT_CTLMASK andb al, ah outb INT_CTLMASK ! clear bit at master 8259 popf ret .align 4 enable_8: inb INT2_CTLMASK andb al, ah outb INT2_CTLMASK ! clear bit at slave 8259 popf ret !*==========================================================================* !* disable_irq * !*==========================================================================*/ ! PUBLIC int disable_irq(unsigned irq) ! Disable an interrupt request line by setting an 8259 bit. ! Equivalent code for irq < 8: ! out_byte(INT_CTLMASK, in_byte(INT_CTLMASK) | (1 << irq)); ! Returns true iff the interrupt was not already disabled. .align 16 _disable_irq: mov ecx, 4(esp) ! irq pushf cli movb ah, 1 rolb ah, cl ! ah = (1 << (irq % 8)) cmpb cl, 8 jae disable_8 ! disable irq >= 8 at the slave 8259 disable_0: inb INT_CTLMASK testb al, ah jnz dis_already ! already disabled? orb al, ah outb INT_CTLMASK ! set bit at master 8259 popf mov eax, 1 ! disabled by this function ret disable_8: inb INT2_CTLMASK testb al, ah jnz dis_already ! already disabled? orb al, ah outb INT2_CTLMASK ! set bit at slave 8259 popf mov eax, 1 ! disabled by this function ret dis_already: popf xor eax, eax ! already disabled ret !*===========================================================================* !* phys_copy * !*===========================================================================* ! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination, ! phys_bytes bytecount); ! Copy a block of physical memory. PC_ARGS = 4 + 4 + 4 + 4 ! 4 + 4 + 4 ! es edi esi eip src dst len .align 16 _phys_copy: cld push esi push edi push es mov eax, FLAT_DS_SELECTOR mov es, ax mov esi, PC_ARGS(esp) mov edi, PC_ARGS+4(esp) mov eax, PC_ARGS+4+4(esp) cmp eax, 10 ! avoid align overhead for small counts jb pc_small mov ecx, esi ! align source, hope target is too neg ecx and ecx, 3 ! count for alignment sub eax, ecx rep eseg movsb mov ecx, eax shr ecx, 2 ! count of dwords rep eseg movs and eax, 3 pc_small: xchg ecx, eax ! remainder rep eseg movsb pop es pop edi pop esi ret !*===========================================================================* !* mem_rdw * !*===========================================================================* ! PUBLIC u16_t mem_rdw(U16_t segment, u16_t *offset); ! Load and return word at far pointer segment:offset. .align 16 _mem_rdw: mov cx, ds mov ds, 4(esp) ! segment mov eax, 4+4(esp) ! offset movzx eax, (eax) ! word to return mov ds, cx ret !*===========================================================================* !* reset * !*===========================================================================* ! PUBLIC void reset(); ! Reset the system by loading IDT with offset 0 and interrupting. _reset: lidt (idt_zero) int 3 ! anything goes, the 386 will not like it .sect .data idt_zero: .data4 0, 0 .sect .text !*===========================================================================* !* mem_vid_copy * !*===========================================================================* ! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count); ! ! Copy count characters from kernel memory to video memory. Src is an ordinary ! pointer to a word, but dst and count are character (word) based video offset ! and count. If src is null then screen memory is blanked by filling it with ! blank_color. _mem_vid_copy: push ebp mov ebp, esp push esi push edi push es mov esi, 8(ebp) ! source mov edi, 12(ebp) ! destination mov edx, 16(ebp) ! count mov es, (_vid_seg) ! segment containing video memory cld ! make sure direction is up mvc_loop: and edi, (_vid_mask) ! wrap address mov ecx, edx ! one chunk to copy mov eax, (_vid_size) sub eax, edi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - edi) 0: sub edx, ecx ! count -= ecx shl edi, 1 ! byte address add edi, (_vid_off) ! in video memory test esi, esi ! source == 0 means blank the screen jz mvc_blank mvc_copy: rep ! copy words to video memory o16 movs jmp mvc_test mvc_blank: mov eax, (_blank_color) ! ax = blanking character rep o16 stos ! copy blanks to video memory !jmp mvc_test mvc_test: sub edi, (_vid_off) shr edi, 1 ! back to a word address test edx, edx jnz mvc_loop mvc_done: pop es pop edi pop esi pop ebp ret !*===========================================================================* !* vid_vid_copy * !*===========================================================================* ! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count); ! ! Copy count characters from video memory to video memory. Handle overlap. ! Used for scrolling, line or character insertion and deletion. Src, dst ! and count are character (word) based video offsets and count. _vid_vid_copy: push ebp mov ebp, esp push esi push edi push es mov esi, 8(ebp) ! source mov edi, 12(ebp) ! destination mov edx, 16(ebp) ! count mov es, (_vid_seg) ! segment containing video memory cmp esi, edi ! copy up or down? jb vvc_down vvc_up: cld ! direction is up vvc_uploop: and esi, (_vid_mask) ! wrap addresses and edi, (_vid_mask) mov ecx, edx ! one chunk to copy mov eax, (_vid_size) sub eax, esi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - esi) 0: mov eax, (_vid_size) sub eax, edi cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, vid_size - edi) 0: sub edx, ecx ! count -= ecx call vvc_copy ! copy video words test edx, edx jnz vvc_uploop ! again? jmp vvc_done vvc_down: std ! direction is down lea esi, -1(esi)(edx*1) ! start copying at the top lea edi, -1(edi)(edx*1) vvc_downloop: and esi, (_vid_mask) ! wrap addresses and edi, (_vid_mask) mov ecx, edx ! one chunk to copy lea eax, 1(esi) cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, esi + 1) 0: lea eax, 1(edi) cmp ecx, eax jbe 0f mov ecx, eax ! ecx = min(ecx, edi + 1) 0: sub edx, ecx ! count -= ecx call vvc_copy test edx, edx jnz vvc_downloop ! again? cld ! C compiler expects up !jmp vvc_done vvc_done: pop es pop edi pop esi pop ebp ret ! Copy video words. (Inner code of both the up and downcopying loop.) vvc_copy: shl esi, 1 shl edi, 1 ! byte addresses add esi, (_vid_off) add edi, (_vid_off) ! in video memory rep eseg o16 movs ! copy video words sub esi, (_vid_off) sub edi, (_vid_off) shr esi, 1 shr edi, 1 ! back to word addresses ret !*===========================================================================* !* level0 * !*===========================================================================* ! PUBLIC void level0(void (*func)(void)) ! Call a function at permission level 0. This allows kernel tasks to do ! things that are only possible at the most privileged CPU level. ! _level0: mov eax, 4(esp) mov (_level0_func), eax int LEVEL0_VECTOR ret # #include #include #include "const.h" #include "sconst.h" #include "protect.h" ! This file contains a number of assembly code utility routines needed by the ! kernel. They are: .define _monitor ! exit Minix and return to the monitor .define _int86 ! make an 8086 interrupt call .define real2prot ! switch from real to protected mode .define prot2real ! switch from protected to real mode .define _cp_mess ! copies messages from source to destination .define _exit ! dummy for library routines .define __exit ! dummy for library routines .define ___exit ! dummy for library routines .define .fat, .trp ! dummies for library routines .define _in_byte ! read a byte from a port and return it .define _in_word ! read a word from a port and return it .define _out_byte ! write a byte to a port .define _out_word ! write a word to a port .define _port_read ! transfer data from (disk controller) port to memory .define _port_read_byte ! likewise byte by byte .define _port_write ! transfer data from memory to (disk controller) port .define _port_write_byte ! likewise byte by byte .define _lock ! disable interrupts .define _unlock ! enable interrupts .define _enable_irq ! enable an irq at the 8259 controller .define _disable_irq ! disable an irq .define _phys_copy ! copy data from anywhere to anywhere in memory .define _mem_rdw ! copy one word from [segment:offset] .define _reset ! reset the system .define _mem_vid_copy ! copy data to video ram .define _vid_vid_copy ! move data in video ram .define _level0 ! call a function at level 0 .define klib_init_prot ! initialize klib functions for protected mode ! The routines only guarantee to preserve the registers the C compiler ! expects to be preserved (si, di, bp, sp, segment registers, and direction ! bit in the flags), though some of the older ones preserve bx, cx and dx. #define DS_286_OFFSET DS_286_INDEX*DESC_SIZE #define ES_286_OFFSET ES_286_INDEX*DESC_SIZE # define EM_XFER_FUNC 0x87 #define JMP_OPCODE 0xE9 /* opcode used for patching */ #define OFF_MASK 0x000F /* offset mask for phys_b -> hclick:offset */ #define HCHIGH_MASK 0x0F /* h/w click mask for low byte of hi word */ #define HCLOW_MASK 0xF0 /* h/w click mask for low byte of low word */ ! Exported variables .extern kernel_cs .text !*===========================================================================* !* monitor * !*===========================================================================* ! PUBLIC void monitor(); ! Return to the monitor. _monitor: call prot2real ! switch to real mode mov sp, _mon_sp ! restore monitor stack pointer mov bx, _mon_ss ! monitor data segment mov ds, bx mov es, bx mov ss, bx pop di pop si pop bp retf ! return to the monitor !*===========================================================================* !* int86 * !*===========================================================================* ! PUBLIC void int86(); _int86: ! make an 8086 interrupt call. push bp push si push di ! save C variable registers pushf ! save flags call int86 ! make the actual call popf ! restore flags pop di ! restore C registers pop si pop bp ret ! Do an 8086 interrupt from protected mode p_int86: push bp push si push di ! save C variable registers pushf ! save flags cli ! no interruptions inb INT2_CTLMASK movb ah, al inb INT_CTLMASK push ax ! save interrupt masks mov ax, _irq_use ! map of in-use IRQs and ax, #~[1< CLICK_SHIFT #error /* Small click sizes are not supported (right shift will lose bits). */ #endif #if HCLICK_SHIFT < CLICK_SHIFT movb cl,#CLICK_SHIFT-HCLICK_SHIFT shl ax,cl ! destination segment #endif mov es,ax mov di,14(bx) ! offset of destination message ! Be careful not to destroy ds before we are finished with the bx pointer. ! We are using bx and not the more natural bp to save pushing bp. mov ax,6(bx) ! process number of sender mov si,10(bx) ! offset of source message mov bx,8(bx) ! source click (finished with bx as a pointer) #if HCLICK_SHIFT < CLICK_SHIFT shl bx,cl ! source segment #endif mov ds,bx stos ! copy process number of sender to dest message add si,*2 ! do not copy first word mov cx,*Msize-1 ! remember, first word does not count rep ! iterate cx times to copy 11 words movs ! copy the message pop di ! restore di pop si ! restore si pop ds ! restore ds pop es ! restore es ret ! that is all folks! !*===========================================================================* !* exit * !*===========================================================================* ! PUBLIC void exit(); ! Some library routines use exit, so provide a dummy version. ! Actual calls to exit cannot occur in the kernel. ! Same for .fat & .trp. _exit: __exit: ___exit: .fat: .trp: sti jmp __exit !*===========================================================================* !* in_byte * !*===========================================================================* ! PUBLIC unsigned in_byte(port_t port); ! Read an (unsigned) byte from the i/o port port and return it. _in_byte: pop bx pop dx ! port dec sp dec sp inb ! input 1 byte subb ah,ah ! unsign extend jmp (bx) !*===========================================================================* !* in_word * !*===========================================================================* ! PUBLIC unsigned short in_word(port_t port); ! Read an (unsigned) word from the i/o port and return it. _in_word: pop bx pop dx ! port dec sp dec sp ! added to new klib.s 3/21/91 d.e.c. inw ! input 1 word no sign extend needed jmp (bx) !*===========================================================================* !* out_byte * !*===========================================================================* ! PUBLIC void out_byte(port_t port, int value); ! Write value (cast to a byte) to the I/O port port. _out_byte: pop bx pop dx ! port pop ax ! value sub sp,#2+2 outb ! output 1 byte jmp (bx) !*===========================================================================* !* out_word * !*===========================================================================* ! PUBLIC void out_word(port_t port, int value); ! Write value (cast to a word) to the I/O port port. _out_word: pop bx pop dx ! port pop ax ! value sub sp,#2+2 outw ! output 1 word jmp (bx) !*===========================================================================* !* port_read * !*===========================================================================* ! PUBLIC void port_read(port_t port, phys_bytes destination,unsigned bytcount); ! Transfer data from (hard disk controller) port to memory. _port_read: push bp mov bp,sp push di push es call portio_setup shr cx,#1 ! count in words mov di,bx ! di = destination offset mov es,ax ! es = destination segment rep ins pop es pop di pop bp ret portio_setup: mov ax,4+2(bp) ! source/destination address in dx:ax mov dx,4+2+2(bp) mov bx,ax and bx,#OFF_MASK ! bx = offset = address % 16 andb dl,#HCHIGH_MASK ! ax = segment = address / 16 % 0x10000 andb al,#HCLOW_MASK orb al,dl movb cl,#HCLICK_SHIFT ror ax,cl mov cx,4+2+4(bp) ! count in bytes mov dx,4(bp) ! port to read from cld ! direction is UP ret !*===========================================================================* !* port_read_byte * !*===========================================================================* ! PUBLIC void port_read_byte(port_t port, phys_bytes destination, ! unsigned bytcount); ! Transfer data port to memory. _port_read_byte: push bp mov bp,sp push di push es call portio_setup mov di,bx ! di = destination offset mov es,ax ! es = destination segment rep insb pop es pop di pop bp ret !*===========================================================================* !* port_write * !*===========================================================================* ! PUBLIC void port_write(port_t port, phys_bytes source, unsigned bytcount); ! Transfer data from memory to (hard disk controller) port. _port_write: push bp mov bp,sp push si push ds call portio_setup shr cx,#1 ! count in words mov si,bx ! si = source offset mov ds,ax ! ds = source segment rep outs pop ds pop si pop bp ret !*===========================================================================* !* port_write_byte * !*===========================================================================* ! PUBLIC void port_write_byte(port_t port, phys_bytes source, ! unsigned bytcount); ! Transfer data from memory to port. _port_write_byte: push bp mov bp,sp push si push ds call portio_setup mov si,bx ! si = source offset mov ds,ax ! ds = source segment rep outsb pop ds pop si pop bp ret !*===========================================================================* !* lock * !*===========================================================================* ! PUBLIC void lock(); ! Disable CPU interrupts. _lock: cli ! disable interrupts ret !*===========================================================================* !* unlock * !*===========================================================================* ! PUBLIC void unlock(); ! Enable CPU interrupts. _unlock: sti ret !*==========================================================================* !* enable_irq * !*==========================================================================*/ ! PUBLIC void enable_irq(unsigned irq) ! Enable an interrupt request line by clearing an 8259 bit. ! Equivalent code for irq < 8: ! out_byte(INT_CTLMASK, in_byte(INT_CTLMASK) & ~(1 << irq)); _enable_irq: mov bx, sp mov cx, 2(bx) ! irq pushf cli movb ah, #~1 rolb ah, cl ! ah = ~(1 << (irq % 8)) cmpb cl, #8 jae enable_8 ! enable irq >= 8 at the slave 8259 enable_0: inb INT_CTLMASK andb al, ah outb INT_CTLMASK ! clear bit at master 8259 popf ret enable_8: inb INT2_CTLMASK andb al, ah outb INT2_CTLMASK ! clear bit at slave 8259 popf ret !*==========================================================================* !* disable_irq * !*==========================================================================*/ ! PUBLIC int disable_irq(unsigned irq) ! Disable an interrupt request line by setting an 8259 bit. ! Equivalent code for irq < 8: ! out_byte(INT_CTLMASK, in_byte(INT_CTLMASK) | (1 << irq)); ! Returns true iff the interrupt was not already disabled. _disable_irq: mov bx, sp mov cx, 2(bx) ! irq pushf cli movb ah, #1 rolb ah, cl ! ah = (1 << (irq % 8)) cmpb cl, #8 jae disable_8 ! disable irq >= 8 at the slave 8259 disable_0: inb INT_CTLMASK testb al, ah jnz dis_already ! already disabled? orb al, ah outb INT_CTLMASK ! set bit at master 8259 popf mov ax, #1 ! disabled by this function ret disable_8: inb INT2_CTLMASK testb al, ah jnz dis_already ! already disabled? orb al, ah outb INT2_CTLMASK ! set bit at slave 8259 popf mov ax, #1 ! disabled by this function ret dis_already: popf xor ax, ax ! already disabled ret !*===========================================================================* !* phys_copy * !*===========================================================================* ! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination, ! phys_bytes bytecount); ! Copy a block of physical memory. SRCLO = 4 SRCHI = 6 DESTLO = 8 DESTHI = 10 COUNTLO = 12 COUNTHI = 14 _phys_copy: push bp ! save only registers required by C mov bp,sp ! set bp to point to source arg less 4 push si ! save si push di ! save di push ds ! save ds push es ! save es mov ax,SRCLO(bp) ! dx:ax = source address (dx is NOT segment) mov dx,SRCHI(bp) mov si,ax ! si = source offset = address % 16 and si,#OFF_MASK andb dl,#HCHIGH_MASK ! ds = source segment = address / 16 % 0x10000 andb al,#HCLOW_MASK orb al,dl ! now bottom 4 bits of dx are in ax movb cl,#HCLICK_SHIFT ! rotate them to the top 4 ror ax,cl mov ds,ax mov ax,DESTLO(bp) ! dx:ax = destination addr (dx is NOT segment) mov dx,DESTHI(bp) mov di,ax ! di = dest offset = address % 16 and di,#OFF_MASK andb dl,#HCHIGH_MASK ! es = dest segment = address / 16 % 0x10000 andb al,#HCLOW_MASK orb al,dl ror ax,cl mov es,ax mov ax,COUNTLO(bp) ! dx:ax = remaining count mov dx,COUNTHI(bp) ! copy upwards (cannot handle overlapped copy) pc_loop: mov cx,ax ! provisional count for this iteration test ax,ax ! if count >= 0x8000, only do 0x8000 per iter js pc_bigcount ! low byte already >= 0x8000 test dx,dx jz pc_upcount ! less than 0x8000 pc_bigcount: mov cx,#0x8000 ! use maximum count per iteration pc_upcount: sub ax,cx ! update count sbb dx,#0 ! cannot underflow, so carry clear now for rcr rcr cx,#1 ! count in words, carry remembers if byte jnb pc_even ! no odd byte movb ! copy odd byte pc_even: rep ! copy 1 word at a time movs ! word copy mov cx,ax ! test if remaining count is 0 or cx,dx jnz pc_more ! more to do pop es ! restore es pop ds ! restore ds pop di ! restore di pop si ! restore si pop bp ! restore bp ret ! return to caller pc_more: sub si,#0x8000 ! adjust pointers so the offset does not mov cx,ds ! overflow in the next 0x8000 bytes add cx,#0x800 ! pointers end up same physical location mov ds,cx ! the current offsets are known >= 0x8000 sub di,#0x8000 ! since we just copied that many mov cx,es add cx,#0x800 mov es,cx jmp pc_loop ! start next iteration !*===========================================================================* !* mem_rdw * !*===========================================================================* ! PUBLIC u16_t mem_rdw(u16_t segment, u16_t *offset); ! Load and return the word at the far pointer segment:offset. _mem_rdw: mov cx,ds ! save ds pop dx ! return adr pop ds ! segment pop bx ! offset sub sp,#2+2 ! adjust for parameters popped mov ax,(bx) ! load the word to return mov ds,cx ! restore ds jmp (dx) ! return !*===========================================================================* !* reset * !*===========================================================================* ! PUBLIC void reset(); ! Reset the system. ! In real mode we simply jump to the reset address at F000:FFF0. _reset: jmpf 0xFFF0,0xF000 !*===========================================================================* !* mem_vid_copy * !*===========================================================================* ! PUBLIC void mem_vid_copy(u16 *src, unsigned dst, unsigned count); ! ! Copy count characters from kernel memory to video memory. Src is an ordinary ! pointer to a word, but dst and count are character (word) based video offset ! and count. If src is null then screen memory is blanked by filling it with ! blank_color. _mem_vid_copy: push bp mov bp, sp push si push di push es mov si, 4(bp) ! source mov di, 6(bp) ! destination mov dx, 8(bp) ! count mov es, _vid_seg ! segment containing video memory cld ! make sure direction is up mvc_loop: and di, _vid_mask ! wrap address mov cx, dx ! one chunk to copy mov ax, _vid_size sub ax, di cmp cx, ax jbe 0f mov cx, ax ! cx = min(cx, vid_size - di) 0: sub dx, cx ! count -= cx shl di, #1 ! byte address add di, _vid_off ! in video memory test si, si ! source == 0 means blank the screen jz mvc_blank mvc_copy: rep ! copy words to video memory movs jmp mvc_test mvc_blank: mov ax, _blank_color ! ax = blanking character rep stos ! copy blanks to video memory !jmp mvc_test mvc_test: sub di, _vid_off shr di, #1 ! back to a word address test dx, dx jnz mvc_loop mvc_done: pop es pop di pop si pop bp ret !*===========================================================================* !* vid_vid_copy * !*===========================================================================* ! PUBLIC void vid_vid_copy(unsigned src, unsigned dst, unsigned count); ! ! Copy count characters from video memory to video memory. Handle overlap. ! Used for scrolling, line or character insertion and deletion. Src, dst ! and count are character (word) based video offsets and counts. _vid_vid_copy: push bp mov bp, sp push si push di push es mov si, 4(bp) ! source mov di, 6(bp) ! destination mov dx, 8(bp) ! count mov es, _vid_seg ! segment containing video memory cmp si, di ! copy up or down? jb vvc_down vvc_up: cld ! direction is up vvc_uploop: and si, _vid_mask ! wrap addresses and di, _vid_mask mov cx, dx ! one chunk to copy mov ax, _vid_size sub ax, si cmp cx, ax jbe 0f mov cx, ax ! cx = min(cx, vid_size - si) 0: mov ax, _vid_size sub ax, di cmp cx, ax jbe 0f mov cx, ax ! cx = min(cx, vid_size - di) 0: sub dx, cx ! count -= cx call vvc_copy test dx, dx jnz vvc_uploop ! again? jmp vvc_done vvc_down: std ! direction is down add si, dx ! start copying at the top dec si add di, dx dec di vvc_downloop: and si, _vid_mask ! wrap addresses and di, _vid_mask mov cx, dx ! one chunk to copy lea ax, 1(si) cmp cx, ax jbe 0f mov cx, ax ! cx = min(cx, si + 1) 0: lea ax, 1(di) cmp cx, ax jbe 0f mov cx, ax ! cx = min(cx, di + 1) 0: sub dx, cx ! count -= cx call vvc_copy test dx, dx jnz vvc_downloop ! again? cld ! C compiler expect up !jmp vvc_done vvc_done: pop es pop di pop si pop bp ret ! Copy video words. (Inner code of both the up and downcopying loop.) vvc_copy: shl si, #1 shl di, #1 ! byte addresses add si, _vid_off add di, _vid_off ! in video memory push ds ! must set ds here, 8086 can't do mov ds, _vid_seg ! 'rep eseg movs' with interrupts on rep movs ! copy video words pop ds sub si, _vid_off sub di, _vid_off shr si, #1 shr di, #1 ! back to word addresses ret !*===========================================================================* !* level0 * !*===========================================================================* ! PUBLIC void level0(void (*func)(void)) ! Not very interesting in real mode, see p_level0. ! _level0: mov bx, sp jmp @2(bx) !*===========================================================================* !* klib_init_prot * !*===========================================================================* ! PUBLIC void klib_init_prot(); ! Initialize klib for protected mode by patching some real mode functions ! at their starts to jump to their protected mode equivalents, according to ! the patch table. Saves a lot of tests on the "protected_mode" variable. ! Note that this function must be run in real mode, for it writes the code ! segment. (One otherwise has to set up a descriptor, etc, etc.) klib_init_prot: mov si,#patch_table kip_next: lods ! original function mov bx,ax cseg movb (bx),#JMP_OPCODE ! overwrite start of function by a long jump lods ! new function - target of jump sub ax,bx ! relative jump sub ax,#3 ! adjust by length of jump instruction cseg mov 1(bx),ax ! set address cmp si,#end_patch_table ! end of table? jb kip_next kip_done: ret !*===========================================================================* !* variants for protected mode * !*===========================================================================* ! Some routines are different in protected mode. ! The only essential difference is the handling of segment registers. ! One complication is that the method of building segment descriptors is not ! reentrant, so the protected mode versions must not be called by interrupt ! handlers. !*===========================================================================* !* p_cp_mess * !*===========================================================================* ! The real mode version attempts to be efficient by passing raw segments but ! that just gets in the way here. p_cp_mess: mov bx, sp ! bx -> arguments push si push di push ds push es mov ax, 4(bx) ! Compute source descriptor base mov dx, ax shl ax, #CLICK_SHIFT shr dx, #16-CLICK_SHIFT ! dx:ax = src_clicks * CLICK_SIZE add ax, 6(bx) adc dx, #0 ! dx:ax += src_offset mov _gdt+DS_286_OFFSET+DESC_BASE, ax movb _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE, dl movb _gdt+DS_286_OFFSET+DESC_BASE_HIGH, dh mov ax, 8(bx) ! Compute destination descriptor base mov dx, ax shl ax, #CLICK_SHIFT shr dx, #16-CLICK_SHIFT ! dx:ax = dst_clicks * CLICK_SIZE add ax, 10(bx) adc dx, #0 ! dx:ax += dst_offset mov _gdt+ES_286_OFFSET+DESC_BASE, ax movb _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE, dl movb _gdt+ES_286_OFFSET+DESC_BASE_HIGH, dh mov bx, 2(bx) ! proc no mov ax, #DS_286_SELECTOR mov ds, ax mov ax, #ES_286_SELECTOR mov es, ax eseg mov 0, bx ! proc no. of sender from arg, not msg mov si, #2 ! src offset is now 2 relative to start of seg mov di, si ! and destination offset mov cx, #Msize-1 ! word count cld ! direction is up rep movs ! copy message (except first word) pop es pop ds pop di pop si ret !*===========================================================================* !* p_portio_setup * !*===========================================================================* ! The port_read, port_write, etc. functions need a setup routine that uses ! a segment descriptor. p_portio_setup: mov ax,4+2(bp) ! source/destination address in dx:ax mov dx,4+2+2(bp) mov _gdt+DS_286_OFFSET+DESC_BASE,ax movb _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,dl movb _gdt+DS_286_OFFSET+DESC_BASE_HIGH,dh xor bx,bx ! bx = 0 = start of segment mov ax,#DS_286_SELECTOR ! ax = segment selector mov cx,4+2+4(bp) ! count in bytes mov dx,4(bp) ! port to read from cld ! direction is UP ret !*===========================================================================* !* p_phys_copy * !*===========================================================================* p_phys_copy: cld pop dx pop _gdt+DS_286_OFFSET+DESC_BASE pop ax ! pop source into base of source descriptor movb _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,al movb _gdt+DS_286_OFFSET+DESC_BASE_HIGH,ah pop _gdt+ES_286_OFFSET+DESC_BASE pop ax ! pop destination into base of dst descriptor movb _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE,al movb _gdt+ES_286_OFFSET+DESC_BASE_HIGH,ah pop cx ! byte count in bx:cx pop bx sub sp,#4+4+4 push di push si push es push ds sub si,si ! src offset is now 0 relative to start of seg mov di,si ! and destination offset jmp ppc_next ! It is too much trouble to align the segment bases, so word alignment is hard. ! Avoiding the book-keeping for alignment may be good anyway. ppc_large: push cx mov cx,#0x8000 ! copy a large chunk of this many words rep movs pop cx dec bx pop ds ! update the descriptors addb _gdt+DS_286_OFFSET+DESC_BASE_MIDDLE,#1 adcb _gdt+DS_286_OFFSET+DESC_BASE_HIGH,#0 addb _gdt+ES_286_OFFSET+DESC_BASE_MIDDLE,#1 adcb _gdt+ES_286_OFFSET+DESC_BASE_HIGH,#0 push ds ppc_next: mov ax,#DS_286_SELECTOR ! (re)load the selectors mov ds,ax mov ax,#ES_286_SELECTOR mov es,ax test bx,bx jnz ppc_large shr cx,#1 ! word count rep movs ! move any leftover words rcl cx,#1 ! restore old bit 0 rep movb ! move any leftover byte pop ds pop es pop si pop di jmp (dx) !*===========================================================================* !* p_reset * !*===========================================================================* ! Reset the system by loading IDT with offset 0 and interrupting. p_reset: lidt idt_zero int 3 ! anything goes, the 286 will not like it !*===========================================================================* !* p_level0 * !*===========================================================================* ! PUBLIC void level0(void (*func)(void)) ! Call a function at permission level 0. This allows kernel tasks to do ! things that are only possible at the most privileged CPU level. ! p_level0: mov bx, sp mov ax, 2(bx) mov _level0_func, ax int LEVEL0_VECTOR ret !*===========================================================================* !* data * !*===========================================================================* .data patch_table: ! pairs (old function, new function) .data2 _int86, p_int86 .data2 _cp_mess, p_cp_mess .data2 _phys_copy, p_phys_copy .data2 portio_setup, p_portio_setup .data2 _reset, p_reset .data2 _level0, p_level0 .data2 _restart, p_restart ! in mpx file .data2 save, p_save ! in mpx file end_patch_table: ! end of table idt_vectors: ! limit and base of real mode interrupt vectors .data2 0x3FF idt_zero: ! zero limit IDT to cause a processor shutdown .data2 0, 0, 0 .bss save_sp: ! place to put sp when switching to real mode .space 2 msw: ! saved real mode machine status word .space 2 /* This file contains the main program of MINIX. The routine main() * initializes the system and starts the ball rolling by setting up the proc * table, interrupt vectors, and scheduling each task to run to initialize * itself. * * The entries into this file are: * main: MINIX main program * panic: abort MINIX due to a fatal error */ #include "kernel.h" #include #include #include #include #include #include "proc.h" /*===========================================================================* * main * *===========================================================================*/ PUBLIC void main() { /* Start the ball rolling. */ register struct proc *rp; register int t; int hdrindex; phys_clicks text_base; vir_clicks text_clicks; vir_clicks data_clicks; phys_bytes phys_b; reg_t ktsb; /* kernel task stack base */ struct memory *memp; struct tasktab *ttp; struct exec e_hdr; /* Initialize the interrupt controller. */ intr_init(1); /* Interpret memory sizes. */ mem_init(); /* Clear the process table. * Set up mappings for proc_addr() and proc_number() macros. */ for (rp = BEG_PROC_ADDR, t = -NR_TASKS; rp < END_PROC_ADDR; ++rp, ++t) { rp->p_nr = t; /* proc number from ptr */ (pproc_addr + NR_TASKS)[t] = rp; /* proc ptr from number */ } /* Resolve driver selections in the task table. */ mapdrivers(); /* Set up proc table entries for tasks and servers. The stacks of the * kernel tasks are initialized to an array in data space. The stacks * of the servers have been added to the data segment by the monitor, so * the stack pointer is set to the end of the data segment. All the * processes are in low memory on the 8086. On the 386 only the kernel * is in low memory, the rest is loaded in extended memory. */ /* Task stacks. */ ktsb = (reg_t) t_stack; for (t = -NR_TASKS; t <= LOW_USER; ++t) { rp = proc_addr(t); /* t's process slot */ ttp = &tasktab[t + NR_TASKS]; /* t's task attributes */ strcpy(rp->p_name, ttp->name); if (t < 0) { if (ttp->stksize > 0) { rp->p_stguard = (reg_t *) ktsb; *rp->p_stguard = STACK_GUARD; } ktsb += ttp->stksize; rp->p_reg.sp = ktsb; text_base = code_base >> CLICK_SHIFT; /* tasks are all in the kernel */ hdrindex = 0; /* and use the first a.out header */ rp->p_priority = PPRI_TASK; } else { hdrindex = 1 + t; /* MM, FS, INIT follow the kernel */ rp->p_priority = t < LOW_USER ? PPRI_SERVER : PPRI_USER; } /* The bootstrap loader has created an array of the a.out headers at * absolute address 'aout'. */ phys_copy(aout + hdrindex * A_MINHDR, vir2phys(&e_hdr), (phys_bytes) A_MINHDR); text_base = e_hdr.a_syms >> CLICK_SHIFT; text_clicks = (e_hdr.a_text + CLICK_SIZE-1) >> CLICK_SHIFT; if (!(e_hdr.a_flags & A_SEP)) text_clicks = 0; /* Common I&D */ data_clicks = (e_hdr.a_total + CLICK_SIZE-1) >> CLICK_SHIFT; rp->p_map[T].mem_phys = text_base; rp->p_map[T].mem_len = text_clicks; rp->p_map[D].mem_phys = text_base + text_clicks; rp->p_map[D].mem_len = data_clicks; rp->p_map[S].mem_phys = text_base + text_clicks + data_clicks; rp->p_map[S].mem_vir = data_clicks; /* empty - stack is in data */ /* Remove server memory from the free memory list. The boot monitor * promises to put processes at the start of memory chunks. */ for (memp = mem; memp < &mem[NR_MEMS]; memp++) { if (memp->base == text_base) { memp->base += text_clicks + data_clicks; memp->size -= text_clicks + data_clicks; } } /* Set initial register values. */ rp->p_reg.pc = (reg_t) ttp->initial_pc; rp->p_reg.psw = istaskp(rp) ? INIT_TASK_PSW : INIT_PSW; if (t >= 0) { /* Initialize the server stack pointer. Take it down one word * to give crtso.s something to use as "argc". */ rp->p_reg.sp = (rp->p_map[S].mem_vir + rp->p_map[S].mem_len) << CLICK_SHIFT; rp->p_reg.sp -= sizeof(reg_t); } if (!isidlehardware(t)) lock_ready(rp); /* IDLE, HARDWARE neveready */ rp->p_flags = 0; alloc_segments(rp); } proc[NR_TASKS+INIT_PROC_NR].p_pid = 1;/* INIT of course has pid 1 */ bill_ptr = proc_addr(IDLE); /* it has to point somewhere */ proc_addr(IDLE)->p_priority = PPRI_IDLE; lock_pick_proc(); /* Now go to the assembly code to start running the current process. */ restart(); } /*===========================================================================* * panic * *===========================================================================*/ PUBLIC void panic(s,n) _CONST char *s; int n; { /* The system has run aground of a fatal error. Terminate execution. * If the panic originated in MM or FS, the string will be empty and the * file system already syncked. If the panic originates in the kernel, we are * kind of stuck. */ if (s != NULL) { printf("\nKernel panic: %s",s); if (n != NO_NUM) printf(" %d", n); printf("\n"); } wreboot(RBT_PANIC); } /* pty.c - pseudo terminal driver Author: Kees J. Bot * 30 Dec 1995 * PTYs can be seen as a bidirectional pipe with TTY * input and output processing. For example a simple rlogin session: * * keyboard -> rlogin -> in.rld -> /dev/ptypX -> /dev/ttypX -> shell * shell -> /dev/ttypX -> /dev/ptypX -> in.rld -> rlogin -> screen * * This file takes care of copying data between the tty/pty device pairs and * the open/read/write/close calls on the pty devices. The TTY task takes * care of the input and output processing (interrupt, backspace, raw I/O, * etc.) using the pty_read() and pty_write() functions as the "keyboard" and * "screen" functions of the ttypX devices. * Be careful when reading this code, the terms "reading" and "writing" are * used both for the tty and the pty end of the pseudo tty. Writes to one * end are to be read at the other end and vice-versa. */ #include "kernel.h" #include #include #include #include #include "tty.h" #include "proc.h" #if NR_PTYS > 0 /* PTY bookkeeping structure, one per pty/tty pair. */ typedef struct pty { tty_t *tty; /* associated TTY structure */ char state; /* flags: busy, closed, ... */ /* Read call on /dev/ptypX. */ char rdrepcode; /* reply code, TASK_REPLY or REVIVE */ char rdcaller; /* process making the call (usually FS) */ char rdproc; /* process that wants to read from the pty */ vir_bytes rdvir; /* virtual address in readers address space */ int rdleft; /* # bytes yet to be read */ int rdcum; /* # bytes written so far */ /* Write call to /dev/ptypX. */ char wrrepcode; /* reply code, TASK_REPLY or REVIVE */ char wrcaller; /* process making the call (usually FS) */ char wrproc; /* process that wants to write to the pty */ vir_bytes wrvir; /* virtual address in writers address space */ int wrleft; /* # bytes yet to be written */ int wrcum; /* # bytes written so far */ /* Output buffer. */ int ocount; /* # characters in the buffer */ char *ohead, *otail; /* head and tail of the circular buffer */ char obuf[128]; /* buffer for bytes going to the pty reader */ } pty_t; #define PTY_ACTIVE 0x01 /* pty is open/active */ #define TTY_CLOSED 0x02 /* tty side has closed down */ #define PTY_CLOSED 0x04 /* pty side has closed down */ PRIVATE pty_t pty_table[NR_PTYS]; /* PTY bookkeeping */ FORWARD _PROTOTYPE( void pty_write, (tty_t *tp) ); FORWARD _PROTOTYPE( void pty_echo, (tty_t *tp, int c) ); FORWARD _PROTOTYPE( void pty_start, (pty_t *pp) ); FORWARD _PROTOTYPE( void pty_finish, (pty_t *pp) ); FORWARD _PROTOTYPE( void pty_read, (tty_t *tp) ); FORWARD _PROTOTYPE( void pty_close, (tty_t *tp) ); FORWARD _PROTOTYPE( void pty_icancel, (tty_t *tp) ); FORWARD _PROTOTYPE( void pty_ocancel, (tty_t *tp) ); /*==========================================================================* * do_pty * *==========================================================================*/ PUBLIC void do_pty(tp, m_ptr) tty_t *tp; message *m_ptr; { /* Perform an open/close/read/write call on a /dev/ptypX device. */ pty_t *pp = tp->tty_priv; int r; switch (m_ptr->m_type) { case DEV_READ: /* Check, store information on the reader, do I/O. */ if (pp->state & TTY_CLOSED) { r = 0; break; } if (pp->rdleft != 0) { r = EIO; break; } if (m_ptr->COUNT <= 0) { r = EINVAL; break; } if (numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { r = EFAULT; break; } pp->rdrepcode = TASK_REPLY; pp->rdcaller = m_ptr->m_source; pp->rdproc = m_ptr->PROC_NR; pp->rdvir = (vir_bytes) m_ptr->ADDRESS; pp->rdleft = m_ptr->COUNT; pty_start(pp); handle_events(tp); if (pp->rdleft == 0) return; /* already done */ if (m_ptr->TTY_FLAGS & O_NONBLOCK) { r = EAGAIN; /* don't suspend */ pp->rdleft = pp->rdcum = 0; } else { r = SUSPEND; /* do suspend */ pp->rdrepcode = REVIVE; } break; case DEV_WRITE: /* Check, store information on the writer, do I/O. */ if (pp->state & TTY_CLOSED) { r = EIO; break; } if (pp->wrleft != 0) { r = EIO; break; } if (m_ptr->COUNT <= 0) { r = EINVAL; break; } if (numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { r = EFAULT; break; } pp->wrrepcode = TASK_REPLY; pp->wrcaller = m_ptr->m_source; pp->wrproc = m_ptr->PROC_NR; pp->wrvir = (vir_bytes) m_ptr->ADDRESS; pp->wrleft = m_ptr->COUNT; handle_events(tp); if (pp->wrleft == 0) return; /* already done */ if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* don't suspend */ r = pp->wrcum > 0 ? pp->wrcum : EAGAIN; pp->wrleft = pp->wrcum = 0; } else { pp->wrrepcode = REVIVE; /* do suspend */ r = SUSPEND; } break; case DEV_OPEN: r = pp->state != 0 ? EIO : OK; pp->state |= PTY_ACTIVE; break; case DEV_CLOSE: r = OK; if (pp->state & TTY_CLOSED) { pp->state = 0; } else { pp->state |= PTY_CLOSED; sigchar(tp, SIGHUP); } break; case CANCEL: if (m_ptr->PROC_NR == pp->rdproc) { /* Cancel a read from a PTY. */ pp->rdleft = pp->rdcum = 0; } if (m_ptr->PROC_NR == pp->wrproc) { /* Cancel a write to a PTY. */ pp->wrleft = pp->wrcum = 0; } r = EINTR; break; default: r = EINVAL; } tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*==========================================================================* * pty_write * *==========================================================================*/ PRIVATE void pty_write(tp) tty_t *tp; { /* (*dev_write)() routine for PTYs. Transfer bytes from the writer on * /dev/ttypX to the output buffer. */ pty_t *pp = tp->tty_priv; int count, ocount; phys_bytes user_phys; /* PTY closed down? */ if (pp->state & PTY_CLOSED) { if (tp->tty_outleft > 0) { tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, EIO); tp->tty_outleft = tp->tty_outcum = 0; } return; } /* While there is something to do. */ for (;;) { ocount = buflen(pp->obuf) - pp->ocount; count = bufend(pp->obuf) - pp->ohead; if (count > ocount) count = ocount; if (count > tp->tty_outleft) count = tp->tty_outleft; if (count == 0 || tp->tty_inhibited) break; /* Copy from user space to the PTY output buffer. */ user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir); phys_copy(user_phys, vir2phys(pp->ohead), (phys_bytes) count); /* Perform output processing on the output buffer. */ out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount); if (count == 0) break; /* Assume echoing messed up by output. */ tp->tty_reprint = TRUE; /* Bookkeeping. */ pp->ocount += ocount; if ((pp->ohead += ocount) >= bufend(pp->obuf)) pp->ohead -= buflen(pp->obuf); pty_start(pp); tp->tty_out_vir += count; tp->tty_outcum += count; if ((tp->tty_outleft -= count) == 0) { /* Output is finished, reply to the writer. */ tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, tp->tty_outcum); tp->tty_outcum = 0; } } pty_finish(pp); } /*==========================================================================* * pty_echo * *==========================================================================*/ PRIVATE void pty_echo(tp, c) tty_t *tp; int c; { /* Echo one character. (Like pty_write, but only one character, optionally.) */ pty_t *pp = tp->tty_priv; int count, ocount; ocount = buflen(pp->obuf) - pp->ocount; if (ocount == 0) return; /* output buffer full */ count = 1; *pp->ohead = c; /* add one character */ out_process(tp, pp->obuf, pp->ohead, bufend(pp->obuf), &count, &ocount); if (count == 0) return; pp->ocount += ocount; if ((pp->ohead += ocount) >= bufend(pp->obuf)) pp->ohead -= buflen(pp->obuf); pty_start(pp); } /*==========================================================================* * pty_start * *==========================================================================*/ PRIVATE void pty_start(pp) pty_t *pp; { /* Transfer bytes written to the output buffer to the PTY reader. */ int count; phys_bytes user_phys; /* While there are t,,,,,,hings to do. */ for (;;) { count = bufend(pp->obuf) - pp->otail; if (count > pp->ocount) count = pp->ocount; if (count > pp->rdleft) count = pp->rdleft; if (count == 0) break; /* Copy from the output buffer to the readers address space. */ user_phys = proc_vir2phys(proc_addr(pp->rdproc), pp->rdvir); phys_copy(vir2phys(pp->otail), user_phys, (phys_bytes) count); /* Bookkeeping. */ pp->ocount -= count; if ((pp->otail += count) == bufend(pp->obuf)) pp->otail = pp->obuf; pp->rdvir += count; pp->rdcum += count; pp->rdleft -= count; } } /*==========================================================================* * pty_finish * *==========================================================================*/ PRIVATE void pty_finish(pp) pty_t *pp; { /* Finish the read request of a PTY reader if there is at least one byte * transferred. */ if (pp->rdcum > 0) { tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, pp->rdcum); pp->rdleft = pp->rdcum = 0; } } /*==========================================================================* * pty_read * *==========================================================================*/ PRIVATE void pty_read(tp) tty_t *tp; { /* Offer bytes from the PTY writer for input on the TTY. (Do it one byte at * a time, 99% of the writes will be for one byte, so no sense in being smart.) */ pty_t *pp = tp->tty_priv; phys_bytes user_phys; char c; if (pp->state & PTY_CLOSED) { if (tp->tty_inleft > 0) { tty_reply(tp->tty_inrepcode, tp->tty_incaller, tp->tty_inproc, tp->tty_incum); tp->tty_inleft = tp->tty_incum = 0; } return; } while (pp->wrleft > 0) { /* Transfer one character to 'c'. */ user_phys = proc_vir2phys(proc_addr(pp->wrproc), pp->wrvir); phys_copy(user_phys, vir2phys(&c), 1L); /* Input processing. */ if (in_process(tp, &c, 1) == 0) break; /* PTY writer bookkeeping. */ pp->wrvir++; pp->wrcum++; if (--pp->wrleft == 0) { tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, pp->wrcum); pp->wrcum = 0; } } } /*==========================================================================* * pty_close * *==========================================================================*/ PRIVATE void pty_close(tp) tty_t *tp; { /* The tty side has closed, so shut down the pty side. */ pty_t *pp = tp->tty_priv; if (!(pp->state & PTY_ACTIVE)) return; if (pp->rdleft > 0) { tty_reply(pp->rdrepcode, pp->rdcaller, pp->rdproc, 0); pp->rdleft = pp->rdcum = 0; } if (pp->wrleft > 0) { tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, EIO); pp->wrleft = pp->wrcum = 0; } if (pp->state & PTY_CLOSED) pp->state = 0; else pp->state |= TTY_CLOSED; } /*==========================================================================* * pty_icancel * *==========================================================================*/ PRIVATE void pty_icancel(tp) tty_t *tp; { /* Discard waiting input. */ pty_t *pp = tp->tty_priv; if (pp->wrleft > 0) { tty_reply(pp->wrrepcode, pp->wrcaller, pp->wrproc, pp->wrcum + pp->wrleft); pp->wrleft = pp->wrcum = 0; } } /*==========================================================================* * pty_ocancel * *==========================================================================*/ PRIVATE void pty_ocancel(tp) tty_t *tp; { /* Drain the output buffer. */ pty_t *pp = tp->tty_priv; pp->ocount = 0; pp->otail = pp->ohead; } /*==========================================================================* * pty_init * *==========================================================================*/ PUBLIC void pty_init(tp) tty_t *tp; { pty_t *pp; int line; /* Associate PTY and TTY structures. */ line = tp - &tty_table[NR_CONS + NR_RS_LINES]; pp = tp->tty_priv = &pty_table[line]; pp->tty = tp; /* Set up output queue. */ pp->ohead = pp->otail = pp->obuf; /* Fill in TTY function hooks. */ tp->tty_devread = pty_read; tp->tty_devwrite = pty_write; tp->tty_echo = pty_echo; tp->tty_icancel = pty_icancel; tp->tty_ocancel = pty_ocancel; tp->tty_close = pty_close; } #endif /* NR_PTYS > 0 */ /* This file contains the device dependent part of the drivers for the * following special files: * /dev/null - null device (data sink) * /dev/mem - absolute memory * /dev/kmem - kernel virtual memory * /dev/ram - RAM disk * * The file contains one entry point: * * mem_task: main entry when system is brought up * * Changes: * 20 Apr 1992 by Kees J. Bot: device dependent/independent split */ #include "kernel.h" #include "driver.h" #include #if (CHIP == INTEL) && ENABLE_USERBIOS #include "protect.h" #include #endif #define NR_RAMS 4 /* number of RAM-type devices */ PRIVATE struct device m_geom[NR_RAMS]; /* Base and size of each RAM disk */ PRIVATE int m_device; /* current device */ FORWARD _PROTOTYPE( struct device *m_prepare, (int device) ); FORWARD _PROTOTYPE( int m_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int m_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void m_init, (void) ); FORWARD _PROTOTYPE( int m_ioctl, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void m_geometry, (struct partition *entry) ); /* Entry points to this driver. */ PRIVATE struct driver m_dtab = { no_name, /* current device's name */ m_do_open, /* open or mount */ do_nop, /* nothing on a close */ m_ioctl, /* specify ram disk geometry */ m_prepare, /* prepare for I/O on a given minor device */ m_transfer, /* do the I/O */ nop_cleanup, /* no need to clean up */ m_geometry, /* memory device "geometry" */ }; /*===========================================================================* * mem_task * *===========================================================================*/ PUBLIC void mem_task() { m_init(); driver_task(&m_dtab); } /*===========================================================================* * m_prepare * *===========================================================================*/ PRIVATE struct device *m_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < 0 || device >= NR_RAMS) return(NIL_DEV); m_device = device; return(&m_geom[device]); } /*===========================================================================* * m_transfer * *===========================================================================*/ PRIVATE int m_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { /* Read or write /dev/null, /dev/mem, /dev/kmem, or /dev/ram. */ int device; phys_bytes mem_phys, user_phys; unsigned count; struct device *dv; unsigned long dv_size; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); /* Get minor device number and check for /dev/null. */ device = m_device; dv = &m_geom[device]; dv_size = cv64ul(dv->dv_size); while (nr_req > 0) { user_phys = user_base + iov->iov_addr; count = iov->iov_size; switch (device) { case NULL_DEV: if (opcode == DEV_GATHER) return(OK); /* Always at EOF. */ break; default: /* /dev/mem, /dev/kmem, /dev/ram: Check for EOF */ if (position >= dv_size) return(OK); if (position + count > dv_size) count = dv_size - position; mem_phys = cv64ul(dv->dv_base) + position; /* Copy the data. */ if (opcode == DEV_GATHER) { phys_copy(mem_phys, user_phys, (phys_bytes) count); } else { phys_copy(user_phys, mem_phys, (phys_bytes) count); } } /* Book the number of bytes transferred. */ position += count; iov->iov_addr += count; if ((iov->iov_size -= count) == 0) { iov++; nr_req--; } } return(OK); } /*============================================================================* * m_do_open * *============================================================================*/ PRIVATE int m_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Check device number on open. Give I/O privileges to a process opening * /dev/mem or /dev/kmem. */ if (m_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); #if (CHIP == INTEL) if (m_device == MEM_DEV || m_device == KMEM_DEV) enable_iop(proc_addr(m_ptr->PROC_NR)); #endif return(OK); } /*===========================================================================* * m_init * *===========================================================================*/ PRIVATE void m_init() { /* Initialize this task. */ extern int end; m_geom[KMEM_DEV].dv_base = cvul64(vir2phys(0)); m_geom[KMEM_DEV].dv_size = cvul64(vir2phys(&end)); #if (CHIP == INTEL) if (!protected_mode) { m_geom[MEM_DEV].dv_size = cvul64(0x100000); /* 1M for 8086 systems */ } else { #if _WORD_SIZE == 2 m_geom[MEM_DEV].dv_size = cvul64(0x1000000); /* 16M for 286 systems */ #else m_geom[MEM_DEV].dv_size = cvul64(0xFFFFFFFF); /* 4G-1 for 386 systems */ #endif } #else /* !(CHIP == INTEL) */ #if (CHIP == M68000) m_geom[MEM_DEV].dv_size = cvul64(MEM_BYTES); #else /* !(CHIP == M68000) */ #error /* memory limit not set up */ #endif /* !(CHIP == M68000) */ #endif /* !(CHIP == INTEL) */ } /*===========================================================================* * m_ioctl * *===========================================================================*/ PRIVATE int m_ioctl(dp, m_ptr) struct driver *dp; message *m_ptr; /* pointer to read or write message */ { /* Set parameters for one of the RAM disks. */ static struct psinfo psinfo = { NR_TASKS, NR_PROCS, (vir_bytes) proc, 0, 0 }; struct device *dv; struct proc *pp; if ((dv = m_prepare(m_ptr->DEVICE)) == NIL_DEV) return(ENXIO); pp = proc_addr(m_ptr->PROC_NR); switch (m_ptr->REQUEST) { case MIOCRAMSIZE: { /* FS sets the RAM disk size. */ unsigned long bytesize; unsigned base, size; struct memory *memp; if (m_ptr->PROC_NR != FS_PROC_NR) return(EPERM); bytesize = m_ptr->POSITION * BLOCK_SIZE; size = (bytesize + CLICK_SIZE-1) >> CLICK_SHIFT; /* Find a memory chunk big enough for the RAM disk. */ memp= &mem[NR_MEMS]; while ((--memp)->size < size) { if (memp == mem) panic("Not enough memory for RAM disk",NO_NUM); } memp->size -= size; base = memp->base + memp->size; dv->dv_base = cvul64((u32_t) base << CLICK_SHIFT); dv->dv_size = cvul64(bytesize); break; } case MIOCSPSINFO: { /* MM or FS set the address of their process table. */ phys_bytes psinfo_phys; if (m_ptr->PROC_NR == MM_PROC_NR) { psinfo.mproc = (vir_bytes) m_ptr->ADDRESS; } else if (m_ptr->PROC_NR == FS_PROC_NR) { psinfo.fproc = (vir_bytes) m_ptr->ADDRESS; } else { return(EPERM); } break; } case MIOCGPSINFO: { /* The ps program wants the process table addresses. */ if (vir_copy(MEM, (vir_bytes) &psinfo, m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(psinfo)) != OK) return(EFAULT); break; } #if (CHIP == INTEL) && ENABLE_USERBIOS case MIOCINT86: { /* Execute a BIOS call for a user process. */ phys_bytes user_phys, buf_phys; struct mio_int86 mint86; if (m_device != MEM_DEV && m_device != KMEM_DEV) return(ENOTTY); user_phys = umap(pp, D, (vir_bytes) m_ptr->ADDRESS, sizeof(mint86)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&mint86), sizeof(mint86)); buf_phys = 0; if (mint86.seg == 0) { /* Client doesn't yet know where my buffer is... */ mint86.off = tmp_phys % HCLICK_SIZE; mint86.seg = tmp_phys / HCLICK_SIZE; mint86.buf = NULL; mint86.len = DMA_BUF_SIZE; } else { if (mint86.buf != NULL) { /* Copy user data buffer to my buffer. */ if (mint86.len > DMA_BUF_SIZE) return(EINVAL); buf_phys = umap(pp, D, (vir_bytes) mint86.buf, mint86.len); if (buf_phys == 0) return(EFAULT); phys_copy(buf_phys, tmp_phys, mint86.len); } /* Execute the interrupt. */ reg86 = mint86.reg86; level0(int86); mint86.reg86 = reg86; } /* Copy the results back. */ phys_copy(vir2phys(&mint86), user_phys, sizeof(mint86)); i,,,f (buf_phys != 0) phys_copy(tmp_phys, buf_phys, mint86.len); break; } case MIOCGLDT86: case MIOCSLDT86: { /* Get or set an LDT entry of this process. */ phys_bytes user_phys; struct mio_ldt86 mldt; if (m_device != MEM_DEV && m_device != KMEM_DEV) return(ENOTTY); user_phys = umap(pp, D, (vir_bytes) m_ptr->ADDRESS, sizeof(mldt)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&mldt), sizeof(mldt)); if (!protected_mode || mldt.idx >= LDT_SIZE) return(ESRCH); if (m_ptr->REQUEST == MIOCGLDT86) { * (struct segdesc_s *) mldt.entry = pp->p_ldt[mldt.idx]; phys_copy(vir2phys(&mldt), user_phys, sizeof(mldt)); } else { pp->p_ldt[mldt.idx] = * (struct segdesc_s *) mldt.entry; } break; } #endif /* CHIP == INTEL && ENABLE_USERBIOS */ default: return(do_diocntl(&m_dtab, m_ptr)); } return(OK); } /*============================================================================* * m_geometry * *============================================================================*/ PRIVATE void m_geometry(entry) struct partition *entry; { /* Memory devices don't have a geometry, but the outside world insists. */ entry->cylinders = div64u(m_geom[m_device].dv_size, SECTOR_SIZE) / (64 * 32); entry->heads = 64; entry->sectors = 32; } /* This file contains a collection of miscellaneous procedures: * mem_init: initialize memory tables. * env_parse parse environment variable. * bad_assertion for debugging * bad_compare for debugging */ #include "kernel.h" #include "assert.h" #include #include #if (CHIP == INTEL) /* In real mode only 1M can be addressed, and in 16-bit protected we can go * no further than we can count in clicks. (The 286 is further limited by * its 24 bit address bus, but we can assume in that case that no more than * 16M memory is reported by the BIOS.) */ #define MAX_REAL 0x00100000L #define MAX_16BIT (0xFFF0L << CLICK_SHIFT) /*=========================================================================* * mem_init * *=========================================================================*/ PUBLIC void mem_init() { /* Initialize the free memory list from the 'memory' boot variable. Translate * the byte offsets and sizes in this list to clicks, properly truncated. Also * make sure that we don't exceed the maximum address space of the 286 or the * 8086, i.e. when running in 16-bit protected mode or real mode. */ long base, size, limit; static char env[] = "memory"; static char fmt[] = "x:x,\4"; int i; struct memory *memp; #if _WORD_SIZE == 2 unsigned long max_address; #endif tot_mem_size = 0; for (i = 0; i < NR_MEMS; i++) { memp = &mem[i]; base = size = 0; env_parse(env, fmt, 2*i+0, &base, 0L, LONG_MAX); env_parse(env, fmt, 2*i+1, &size, 0L, LONG_MAX); limit = base + size; #if _WORD_SIZE == 2 max_address = protected_mode ? MAX_16BIT : MAX_REAL; if (limit > max_address) limit = max_address; #endif base = (base + CLICK_SIZE-1) & ~(long)(CLICK_SIZE-1); limit &= ~(long)(CLICK_SIZE-1); if (limit <= base) continue; memp->base = base >> CLICK_SHIFT; memp->size = (limit - base) >> CLICK_SHIFT; tot_mem_size += memp->size; } } #endif /* (CHIP == INTEL) */ /*=========================================================================* * env_parse * *=========================================================================*/ PUBLIC int env_parse(env, fmt, field, param, min, max) char *env; /* environment variable to inspect */ char *fmt; /* template to parse it with */ int field; /* field number of value to return */ long *param; /* address of parameter to get */ long min, max; /* minimum and maximum values for the parameter */ { /* Parse an environment variable setting, something like "DPETH0=300:3". * Panic if the parsing fails. Return EP_UNSET if the environment variable * is not set, EP_OFF if it is set to "off", EP_ON if set to "on" or a * field is left blank, or EP_SET if a field is given (return value through * *param). Commas and colons may be used in the environment and format * string, fields in the environment string may be empty, and punctuation * may be missing to skip fields. The format string contains characters * 'd', 'o', 'x' and 'c' to indicate that 10, 8, 16, or 0 is used as the * last argument to strtol. If the format string contains something like "\4" * then the string is repeated at 4 characters left. */ char *val, *end; long newpar; int i = 0, radix, r; if ((val = getenv(env)) == NIL_PTR) return(EP_UNSET); if (strcmp(val, "off") == 0) return(EP_OFF); if (strcmp(val, "on") == 0) return(EP_ON); r = EP_ON; for (;;) { while (*val == ' ') val++; if (*val == 0) return(r); /* the proper exit point */ if (*fmt == 0) break; /* too many values */ if (*val == ',' || *val == ':') { /* Time to go to the next field. */ if (*fmt == ',' || *fmt == ':') i++; if (*fmt++ == *val) val++; if (*fmt < 32) fmt -= *fmt; /* step back? */ } else { /* Environment contains a value, get it. */ switch (*fmt) { case 'd': radix = 10; break; case 'o': radix = 010; break; case 'x': radix = 0x10; break; case 'c': radix = 0; break; default: goto badenv; } newpar = strtol(val, &end, radix); if (end == val) break; /* not a number */ val = end; if (i == field) { /* The field requested. */ if (newpar < min || newpar > max) break; *param = newpar; r = EP_SET; } } } badenv: printf("Bad environment setting: '%s = %s'\n", env, getenv(env)); panic(NULL, NO_NUM); /*NOTREACHED*/ } #if !NDEBUG /*=========================================================================* * bad_assertion * *=========================================================================*/ PUBLIC void bad_assertion(file, line, what) char *file; int line; char *what; { printf("panic at %s(%d): assertion \"%s\" failed\n", file, line, what); panic(NULL, NO_NUM); } /*=========================================================================* * bad_compare * *=========================================================================*/ PUBLIC void bad_compare(file, line, lhs, what, rhs) char *file; int line; int lhs; char *what; int rhs; { printf("panic at %s(%d): compare (%d) %s (%d) failed\n", file, line, lhs, what, rhs); panic(NULL, NO_NUM); } #endif /* !NDEBUG */ # ! Chooses between the 8086 and 386 versions of the Minix startup code. #include #if _WORD_SIZE == 2 #include "mpx88.s" #else #include "mpx386.s" #endif # ! This file contains the assembler startup code for Minix and the 32-bit ! interrupt handlers. It cooperates with start.c to set up a good ! environment for main(). ! This file is part of the lowest layer of the MINIX kernel. The other part ! is "proc.c". The lowest layer does process switching and message handling. ! Every transition to the kernel goes through this file. Transitions are ! caused by sending/receiving messages and by most interrupts. (RS232 ! interrupts may be handled in the file "rs2.s" and then they rarely enter ! the kernel.) ! Transitions to the kernel may be nested. The initial entry may be with a ! system call, exception or hardware interrupt; reentries may only be made ! by hardware interrupts. The count of reentries is kept in "k_reenter". ! It is important for deciding whether to switch to the kernel stack and ! for protecting the message passing code in "proc.c". ! For the message passing trap, most of the machine state is saved in the ! proc table. (Some of the registers need not be saved.) Then the stack is ! switched to "k_stack", and interrupts are reenabled. Finally, the system ! call handler (in C) is called. When it returns, interrupts are disabled ! again and the code falls into the restart routine, to finish off held-up ! interrupts and run the process or task whose pointer is in "proc_ptr". ! Hardware interrupt handlers do the same, except (1) The entire state must ! be saved. (2) There are too many handlers to do this inline, so the save ! routine is called. A few cycles are saved by pushing the address of the ! appropiate restart routine for a return later. (3) A stack switch is ! avoided when the stack is already switched. (4) The (master) 8259 interrupt ! controller is reenabled centrally in save(). (5) Each interrupt handler ! masks its interrupt line using the 8259 before enabling (other unmasked) ! interrupts, and unmasks it after servicing the interrupt. This limits the ! nest level to the number of lines and protects the handler from itself. ! For communication with the boot monitor at startup time some constant ! data are compiled into the beginning of the text segment. This facilitates ! reading the data at the start of the boot process, since only the first ! sector of the file needs to be read. ! Some data storage is also allocated at the end of this file. This data ! will be at the start of the data segment of the kernel and will be read ! and modified by the boot monitor before the kernel starts. ! sections .sect .text begtext: .sect .rom begrom: .sect .data begdata: .sect .bss begbss: #include #include #include #include "const.h" #include "protect.h" #include "sconst.h" /* Selected 386 tss offsets. */ #define TSS3_S_SP0 4 ! Exported functions ! Note: in assembly language the .define statement applied to a function name ! is loosely equivalent to a prototype in C code -- it makes it possible to ! link to an entity declared in the assembly code but does not create ! the entity. .define _idle_task .define _restart .define save .define _divide_error .define _single_step_exception .define _nmi .define _breakpoint_exception .define _overflow .define _bounds_check .define _inval_opcode .define _copr_not_available .define _double_fault .define _copr_seg_overrun .define _inval_tss .define _segment_not_present .define _stack_exception .define _general_protection .define _page_fault .define _copr_error .define _hwint00 ! handlers for hardware interrupts .define _hwint01 .define _hwint02 .define _hwint03 .define _hwint04 .define _hwint05 .define _hwint06 .define _hwint07 .define _hwint08 .define _hwint09 .define _hwint10 .define _hwint11 .define _hwint12 .define _hwint13 .define _hwint14 .define _hwint15 .define _s_call .define _p_s_call .define _level0_call ! Exported variables. .define begbss .define begdata .sect .text !*===========================================================================* !* MINIX * !*===========================================================================* MINIX: ! this is the entry point for the MINIX kernel jmp over_flags ! skip over the next few bytes .data2 CLICK_SHIFT ! for the monitor: memory granularity flags: .data2 0x01FD ! boot monitor flags: ! call in 386 mode, make bss, make stack, ! load high, don`t patch, will return, ! uses generic INT, memory vector, ! new boot code return nop ! extra byte to sync up disassembler over_flags: ! Set up a C stack frame on the monitor stack. (The monitor sets cs and ds ! right. The ss descriptor still references the monitor data segment.) movzx esp, sp ! monitor stack is a 16 bit stack push ebp mov ebp, esp push esi push edi cmp 4(ebp), 0 ! monitor return vector is jz noret ! nonzero if return possible inc (_mon_return) noret: mov (_mon_sp), esp ! save stack pointer for later return ! Copy the monitor global descriptor table to the address space of kernel and ! switch over to it. Prot_init() can then update it with immediate effect. sgdt (_gdt+GDT_SELECTOR) ! get the monitor gdtr mov esi, (_gdt+GDT_SELECTOR+2) ! absolute address of GDT mov ebx, _gdt ! address of kernel GDT mov ecx, 8*8 ! copying eight descriptors copygdt: eseg movb al, (esi) movb (ebx), al inc esi inc ebx loop copygdt mov eax, (_gdt+DS_SELECTOR+2) ! base of kernel data and eax, 0x00FFFFFF ! only 24 bits add eax, _gdt ! eax = vir2phys(gdt) mov (_gdt+GDT_SELECTOR+2), eax ! set base of GDT lgdt (_gdt+GDT_SELECTOR) ! switch over to kernel GDT ! Locate boot parameters, set up kernel segment registers and stack. mov ebx, 8(ebp) ! boot parameters offset mov edx, 12(ebp) ! boot parameters length mov eax, 16(ebp) ! address of a.out headers mov (_aout), eax mov ax, ds ! kernel data mov es, ax mov fs, ax mov gs, ax mov ss, ax mov esp, k_stktop ! set sp to point to the top of kernel stack ! Call C startup code to set up a proper environment to run main(). push edx push ebx push SS_SELECTOR push DS_SELECTOR push CS_SELECTOR call _cstart ! cstart(cs, ds, mds, parmoff, parmlen) add esp, 5*4 ! Reload gdtr, idtr and the segment registers to global descriptor table set ! up by prot_init(). lgdt (_gdt+GDT_SELECTOR) lidt (_gdt+IDT_SELECTOR) jmpf CS_SELECTOR:csinit csinit: o16 mov ax, DS_SELECTOR mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax o16 mov ax, TSS_SELECTOR ! no other TSS is used ltr ax push 0 ! set flags to known good state popf ! esp, clear nested task and int enable jmp _main ! main() !*===========================================================================* !* interrupt handlers * !* interrupt handlers for 386 32-bit protected mode * !*===========================================================================* !*===========================================================================* !* hwint00 - 07 * !*===========================================================================* ! Note this is a macro, it looks like a subroutine. #define hwint_master(irq) \ call save /* save interrupted process state */;\ inb INT_CTLMASK ;\ orb al, [1< #include #include #include "const.h" #include "sconst.h" #include "protect.h" ! The external entry points into this file are: ! Note: in assembly language the .define statement applied to a function name ! is loosely equivalent to a prototype in C code -- it makes it possible to ! link to an entity declared in the assembly code but does not create ! the entity. .define _idle_task ! executed when there is no work .define _int00 ! handlers for traps and exceptions .define _int01 .define _int02 .define _int03 .define _int04 .define _int05 .define _int06 .define _int07 .define _hwint00 ! handlers for hardware interrupts .define _hwint01 .define _hwint02 .define _hwint03 .define _hwint04 .define _hwint05 .define _hwint06 .define _hwint07 .define _hwint08 .define _hwint09 .define _hwint10 .define _hwint11 .define _hwint12 .define _hwint13 .define _hwint14 .define _hwint15 .define _restart ! start running a task or process .define save ! save the machine state in the proc table .define _s_call ! process or task wants to send or receive a message ! Exported variables. .define kernel_ds .define begbss .define begdata .text !*===========================================================================* !* MINIX * !*===========================================================================* MINIX: ! this is the entry point for the MINIX kernel jmp over_kernel_ds ! skip over the next few bytes .data2 CLICK_SHIFT ! for the monitor: memory granularity kernel_ds: .data2 0x01B4 ! boot monitor flags: (later kernel DS) ! call in 8086 mode, make bss, make stack, ! load low, don`t patch, will return, ! (has own INT calls), memory vector, ! new boot code return over_kernel_ds: ! Set up a C stack frame on the monitor stack. (The monitor sets cs and ds ! right. The ss register still references the monitor data segment.) push bp mov bp, sp push si push di cmp 4(bp), #0 ! monitor code segment is jz noret ! nonzero if return possible inc _mon_return noret: mov _mon_ss, ss ! save stack location for later return mov _mon_sp, sp ! Locate boot parameters, set up kernel segment registers and stack. mov bx, 6(bp) ! boot parameters offset mov dx, 8(bp) ! boot parameters length mov ax, 10(bp) ! address of a.out headers mov _aout+0, ax mov ax, 12(bp) mov _aout+2, ax mov ax, ds ! kernel data mov es, ax mov ss, ax mov sp, #k_stktop ! set sp to point to the top of kernel stack ! Real mode needs to get kernel DS from the code segment. Protected mode ! needs CS in the jump back to real mode. cseg mov kernel_cs, cs cseg mov kernel_ds, ds ! Call C startup code to set up a proper environment to run main(). push dx push bx push _mon_ss push ds push cs call _cstart ! cstart(cs, ds, mds, parmoff, parmlen) add sp, #5*2 cmp _protected_mode, #0 jz nosw ! ok to switch to protected mode? call klib_init_prot ! initialize klib functions for protected mode call real2prot ! switch to protected mode push #0 ! set flags to known good state popf ! especially, clear nested task and int enable nosw: jmp _main ! main() !*===========================================================================* !* interrupt handlers * !*===========================================================================* !*===========================================================================* !* hwint00 - 07 * !*===========================================================================* ! Note this is a macro, it looks like a subroutine. #define hwint_master(irq) \ call save /* save interrupted process state */;\ inb INT_CTLMASK ;\ orb al, *[1< */ #include "kernel.h" #include #include #include "dp8390.h" #include "ne2000.h" #if (ENABLE_DP8390 && ENABLE_NE2000) || __minix_vmd #define N 100 _PROTOTYPE( typedef int (*testf_t), (dpeth_t *dep, int pos, u8_t *pat) ); u8_t pat0[]= { 0x00, 0x00, 0x00, 0x00 }; u8_t pat1[]= { 0xFF, 0xFF, 0xFF, 0xFF }; u8_t pat2[]= { 0xA5, 0x5A, 0x69, 0x96 }; u8_t pat3[]= { 0x96, 0x69, 0x5A, 0xA5 }; _PROTOTYPE( static int test_8, (dpeth_t *dep, int pos, u8_t *pat) ); _PROTOTYPE( static int test_16, (dpeth_t *dep, int pos, u8_t *pat) ); _PROTOTYPE( static void ne_init, (dpeth_t *dep) ); _PROTOTYPE( static void ne_stop, (dpeth_t *dep) ); /*===========================================================================* * ne_probe * *===========================================================================*/ int ne_probe(dep) dpeth_t *dep; { int byte; int i; int loc1, loc2; testf_t f; dep->de_dp8390_port= dep->de_base_port + NE_DP8390; /* We probe for an ne1000 or an ne2000 by testing whether the * on board is reachable through the dp8390. Note that the * ne1000 is an 8bit card and has a memory region distict from * the 16bit ne2000 */ for (dep->de_16bit= 0; dep->de_16bit < 2; dep->de_16bit++) { /* Reset the ethernet card */ byte= inb_ne(dep, NE_RESET); milli_delay(2); outb_ne(dep, NE_RESET, byte); milli_delay(2); /* Reset the dp8390 */ outb_reg0(dep, DP_CR, CR_STP | CR_DM_ABORT); for (i= 0; i < 0x1000 && ((inb_reg0(dep, DP_ISR) & ISR_RST) == 0); i++) ; /* Do nothing */ /* Check if the dp8390 is really there */ if ((inb_reg0(dep, DP_CR) & (CR_STP|CR_DM_ABORT)) != (CR_STP|CR_DM_ABORT)) { return 0; } /* Put it in loop-back mode */ outb_reg0(dep, DP_RCR, RCR_MON); outb_reg0(dep, DP_TCR, TCR_NORMAL); if (dep->de_16bit) { outb_reg0(dep, DP_DCR, DCR_WORDWIDE | DCR_8BYTES | DCR_BMS); } else { outb_reg0(dep, DP_DCR, DCR_BYTEWIDE | DCR_8BYTES | DCR_BMS); } if (dep->de_16bit) { loc1= NE2000_START; loc2= NE2000_START + NE2000_SIZE - 4; f= test_16; } else { loc1= NE1000_START; loc2= NE1000_START + NE1000_SIZE - 4; f= test_8; } if (f(dep, loc1, pat0) && f(dep, loc1, pat1) && f(dep, loc1, pat2) && f(dep, loc1, pat3) && f(dep, loc2, pat0) && f(dep, loc2, pat1) && f(dep, loc2, pat2) && f(dep, loc2, pat3)) { /* We don't need a memory segment */ dep->de_linmem= 0; dep->de_initf= ne_init; dep->de_stopf= ne_stop; dep->de_prog_IO= 1; return 1; } } return 0; } /*===========================================================================* * test_8 * *===========================================================================*/ static int test_8(dep, pos, pat) dpeth_t *dep; int pos; u8_t *pat; { u8_t buf[4]; int i; int r; outb_reg0(dep, DP_ISR, 0xFF); /* Setup a transfer to put the pattern. */ outb_reg0(dep, DP_RBCR0, 4); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_RSAR0, pos & 0xFF); outb_reg0(dep, DP_RSAR1, pos >> 8); outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); for (i= 0; i<4; i++) outb_ne(dep, NE_DATA, pat[i]); for (i= 0; ide_name); } return 0; } outb_reg0(dep, DP_RBCR0, 4); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_RSAR0, pos & 0xFF); outb_reg0(dep, DP_RSAR1, pos >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); for (i= 0; i<4; i++) buf[i]= inb_ne(dep, NE_DATA); r= (memcmp(buf, pat, 4) == 0); return r; } /*===========================================================================* * test_16 * *===========================================================================*/ static int test_16(dep, pos, pat) dpeth_t *dep; int pos; u8_t *pat; { u8_t buf[4]; int i; int r; outb_reg0(dep, DP_ISR, 0xFF); /* Setup a transfer to put the pattern. */ outb_reg0(dep, DP_RBCR0, 4); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_RSAR0, pos & 0xFF); outb_reg0(dep, DP_RSAR1, pos >> 8); outb_reg0(dep, DP_CR, CR_DM_RW | CR_PS_P0 | CR_STA); for (i= 0; i<4; i += 2) { outw_ne(dep, NE_DATA, *(u16_t *)(pat+i)); } for (i= 0; ide_name); } return 0; } outb_reg0(dep, DP_RBCR0, 4); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_RSAR0, pos & 0xFF); outb_reg0(dep, DP_RSAR1, pos >> 8); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); for (i= 0; i<4; i += 2) { *(u16_t *)(buf+i)= inw_ne(dep, NE_DATA); } r= (memcmp(buf, pat, 4) == 0); return r; } /*===========================================================================* * ne_init * *===========================================================================*/ static void ne_init(dep) dpeth_t *dep; { int i; int word, sendq_nr; /* Setup a transfer to get the ethernet address. */ if (dep->de_16bit) outb_reg0(dep, DP_RBCR0, 6*2); else outb_reg0(dep, DP_RBCR0, 6); outb_reg0(dep, DP_RBCR1, 0); outb_reg0(dep, DP_RSAR0, 0); outb_reg0(dep, DP_RSAR1, 0); outb_reg0(dep, DP_CR, CR_DM_RR | CR_PS_P0 | CR_STA); for (i= 0; i<6; i++) { if (dep->de_16bit) { word= inw_ne(dep, NE_DATA); dep->de_address.ea_addr[i]= word; } else { dep->de_address.ea_addr[i] = inb_ne(dep, NE_DATA); } } dep->de_data_port= dep->de_base_port + NE_DATA; if (dep->de_16bit) { dep->de_ramsize= NE2000_SIZE; dep->de_offset_page= NE2000_START / DP_PAGESIZE; } else { dep->de_ramsize= NE1000_SIZE; dep->de_offset_page= NE1000_START / DP_PAGESIZE; } /* Allocate one send buffer (1.5KB) per 8KB of on board memory. */ sendq_nr= dep->de_ramsize / 0x2000; if (sendq_nr < 1) sendq_nr= 1; else if (sendq_nr > SENDQ_NR) sendq_nr= SENDQ_NR; dep->de_sendq_nr= sendq_nr; for (i= 0; ide_sendq[i].sq_sendpage= dep->de_offset_page + i*SENDQ_PAGES; } dep->de_startpage= dep->de_offset_page + i*SENDQ_PAGES; dep->de_stoppage= dep->de_offset_page + dep->de_ramsize / DP_PAGESIZE; /* Can't override the default IRQ. */ dep->de_irq &= ~DEI_DEFAULT; if (!debug) { printf("%s: NE%d000 at %X:%d\n", dep->de_name, dep->de_16bit ? 2 : 1, dep->de_base_port, dep->de_irq); } else { printf("%s: Novell NE%d000 ethernet card at I/O address " "0x%X, memory size 0x%X, irq %d\n", dep->de_name, dep->de_16bit ? 2 : 1, dep->de_base_port, dep->de_ramsize, dep->de_irq); } } /*===========================================================================* * ne_stop * *===========================================================================*/ static void ne_stop(dep) dpeth_t *dep; { int byte; /* Reset the ethernet card */ byte= inb_ne(dep, NE_RESET); milli_delay(2); outb_ne(dep, NE_RESET, byte); } #endif /* ENABLE_DP8390 && ENABLE_NE2000 */ /* * $PchId: ne2000.c,v 1.4 1996/01/19 23:30:34 philip Exp $ */ ,/* ne2000.h Created: March 15, 1994 by Philip Homburg */ #ifndef NE2000_H #define NE2000_H #define NE_DP8390 0x00 #define NE_DATA 0x10 #define NE_RESET 0x1F #define NE1000_START 0x2000 #define NE1000_SIZE 0x2000 #define NE2000_START 0x4000 #define NE2000_SIZE 0x4000 #define inb_ne(dep, reg) (in_byte(dep->de_base_port+reg)) #define outb_ne(dep, reg, data) (out_byte(dep->de_base_port+reg, data)) #define inw_ne(dep, reg) (in_word(dep->de_base_port+reg)) #define outw_ne(dep, reg, data) (out_word(dep->de_base_port+reg, data)) #endif /* NE2000_H */ /* * $PchId: ne2000.h,v 1.2 1995/12/22 08:42:31 philip Exp $ */ /* This file contains the printer driver. It is a fairly simple driver, * supporting only one printer. Characters that are written to the driver * are written to the printer without any changes at all. * * The valid messages and their parameters are: * * HARD_INT: interrupt handler has finished current chunk of output * DEV_WRITE: a process wants to write on a terminal * CANCEL: terminate a previous incomplete system call immediately * * m_type TTY_LINE PROC_NR COUNT ADDRESS * ------------------------------------------------------- * | HARD_INT | | | | | * |-------------+---------+---------+---------+---------| * | DEV_WRITE |minor dev| proc nr | count | buf ptr | * |-------------+---------+---------+---------+---------| * | CANCEL |minor dev| proc nr | | | * ------------------------------------------------------- * * Note: since only 1 printer is supported, minor dev is not used at present. */ #include "kernel.h" #include #include #include "proc.h" #if ENABLE_PRINTER /* Control bits (in port_base + 2). "+" means positive logic and "-" means * negative logic. Most of the signals are negative logic on the pins but * many are converted to positive logic in the ports. Some manuals are * misleading because they only document the pin logic. * * +0x01 Pin 1 -Strobe * +0x02 Pin 14 -Auto Feed * -0x04 Pin 16 -Initialize Printer * +0x08 Pin 17 -Select Printer * +0x10 IRQ7 Enable * * Auto Feed and Select Printer are always enabled. Strobe is enabled briefly * when characters are output. Initialize Printer is enabled briefly when * the task is started. IRQ7 is enabled when the first character is output * and left enabled until output is completed (or later after certain * abnormal completions). */ #define ASSERT_STROBE 0x1D /* strobe a character to the interface */ #define NEGATE_STROBE 0x1C /* enable interrupt on interface */ #define SELECT 0x0C /* select printer bit */ #define INIT_PRINTER 0x08 /* init printer bits */ /* Status bits (in port_base + 2). * * -0x08 Pin 15 -Error * +0x10 Pin 13 +Select Status * +0x20 Pin 12 +Out of Paper * -0x40 Pin 10 -Acknowledge * -0x80 Pin 11 +Busy */ #define BUSY_STATUS 0x10 /* printer gives this status when busy */ #define NO_PAPER 0x20 /* status bit saying that paper is out */ #define NORMAL_STATUS 0x90 /* printer gives this status when idle */ #define ON_LINE 0x10 /* status bit saying that printer is online */ #define STATUS_MASK 0xB0 /* mask to filter out status bits */ /* Centronics interface timing that must be met by software (in microsec). * * Strobe length: 0.5u to 100u (not sure about the upper limit). * Data set up: 0.5u before strobe. * Data hold: 0.5u after strobe. * Init pulse length: over 200u (not sure). * * The strobe length is about 50u with the code here and function calls for * out_byte() - not much to spare. The 0.5u minimums may be violated if * out_byte() is generated in-line on a fast machine. Some printer boards * are slower than 0.5u anyway. */ PRIVATE int caller; /* process to tell when printing done (FS) */ PRIVATE int done_status; /* status of last output completion */ PRIVATE int oleft; /* bytes of output left in obuf */ PRIVATE char obuf[128]; /* output buffer */ PRIVATE int opending; /* nonzero while expected printing not done */ PRIVATE char *optr; /* ptr to next char in obuf to print */ PRIVATE int orig_count; /* original byte count */ PRIVATE int port_base; /* I/O port for printer */ PRIVATE int proc_nr; /* user requesting the printing */ PRIVATE int user_left; /* bytes of output left in user buf */ PRIVATE vir_bytes user_vir; /* address of remainder of user buf */ PRIVATE int writing; /* nonzero while write is in progress */ FORWARD _PROTOTYPE( void do_cancel, (message *m_ptr) ); FORWARD _PROTOTYPE( void do_done, (void) ); FORWARD _PROTOTYPE( void do_write, (message *m_ptr) ); FORWARD _PROTOTYPE( void pr_start, (void) ); FORWARD _PROTOTYPE( void print_init, (void) ); FORWARD _PROTOTYPE( void reply, (int code, int replyee, int process, int status) ); FORWARD _PROTOTYPE( int pr_handler, (int irq) ); /*===========================================================================* * printer_task * *===========================================================================*/ PUBLIC void printer_task() { /* Main routine of the printer task. */ message pr_mess; /* buffer for all incoming messages */ print_init(); /* initialize */ while (TRUE) { receive(ANY, &pr_mess); switch(pr_mess.m_type) { case DEV_OPEN: case DEV_CLOSE: reply(TASK_REPLY, pr_mess.m_source, pr_mess.PROC_NR, OK); break; case DEV_WRITE: do_write(&pr_mess); break; case CANCEL : do_cancel(&pr_mess); break; case HARD_INT : do_done(); break; default: reply(TASK_REPLY, pr_mess.m_source, pr_mess.PROC_NR, EINVAL); } } } /*===========================================================================* * do_write * *===========================================================================*/ PRIVATE void do_write(m_ptr) register message *m_ptr; /* pointer to the newly arrived message */ { /* The printer is used by sending DEV_WRITE messages to it. Process one. */ register int r; /* Reject command if last write is not finished, count not positive, or * user address bad. */ if (writing) { r = EIO; } else if (m_ptr->COUNT <= 0) { r = EINVAL; } else if (numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { r = EFAULT; } else { /* Save information needed later. */ caller = m_ptr->m_source; proc_nr = m_ptr->PROC_NR; user_left = m_ptr->COUNT; orig_count = m_ptr->COUNT; user_vir = (vir_bytes) m_ptr->ADDRESS; pr_start(); writing = TRUE; r = SUSPEND; } /* Reply to FS, no matter what happened. */ reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*===========================================================================* * do_done * *===========================================================================*/ PRIVATE void do_done() { /* Previous chunk of printing is finished. Continue if OK and more. * Otherwise, reply to caller (FS). */ register int status; if (!writing) return; /* interrupt while canceling */ if (done_status != OK) { /* Printer error. */ status = EIO; if ((done_status & ON_LINE) == 0) { printf("Printer is not on line\n"); } else if (done_status & NO_PAPER) { status = EAGAIN; /* out of paper */ } else { printf("Printer error, status is 0x%02X\n", done_status); } if (status == EAGAIN && user_left < orig_count) { /* Some characters have been printed, tell how many. */ status = orig_count - user_left; } oleft = 0; /* cancel output by interrupt handler */ } else if (user_left != 0) { pr_start(); return; } else { status = orig_count; } reply(REVIVE, caller, proc_nr, status); writing = FALSE; } /*===========================================================================* * do_cancel * *===========================================================================*/ PRIVATE void do_cancel(m_ptr) register message *m_ptr; /* pointer to the newly arrived message */ { /* Cancel a print request that has already started. Usually this means that * the process doing the printing has been killed by a signal. It is not * clear if there are race conditions. Try not to cancel the wrong process, * but rely on FS to handle the EINTR reply and de-suspension properly. */ if (writing && m_ptr->PROC_NR == proc_nr) { oleft = 0; /* cancel output by interrupt handler */ writing = FALSE; } reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, EINTR); } /*===========================================================================* * reply * *===========================================================================*/ PRIVATE void reply(code, replyee, process, status) int code; /* TASK_REPLY or REVIVE */ int replyee; /* destination fo,,,,,,r message (normally FS) */ int process; /* which user requested the printing */ int status; /* number of chars printed or error code */ { /* Send a reply telling FS that printing has started or stopped. */ message pr_mess; pr_mess.m_type = code; /* TASK_REPLY or REVIVE */ pr_mess.REP_STATUS = status; /* count or EIO */ pr_mess.REP_PROC_NR = process; /* which user does this pertain to */ send(replyee, &pr_mess); /* send the message */ } /*===========================================================================* * print_init * *===========================================================================*/ PRIVATE void print_init() { /* Set global variables. Get the port base for the first printer from the * BIOS and initialize the printer. */ phys_copy(0x408L, vir2phys(&port_base), 2L); out_byte(port_base + 2, INIT_PRINTER); milli_delay(2); /* easily satisfies Centronics minimum */ out_byte(port_base + 2, SELECT); put_irq_handler(PRINTER_IRQ, pr_handler); enable_irq(PRINTER_IRQ); /* ready for printer interrupts */ } /*==========================================================================* * pr_start * *==========================================================================*/ PRIVATE void pr_start() { /* Start next chunk of printer output. */ register int chunk; phys_bytes user_phys; if ( (chunk = user_left) > sizeof obuf) chunk = sizeof obuf; user_phys = proc_vir2phys(proc_addr(proc_nr), user_vir); phys_copy(user_phys, vir2phys(obuf), (phys_bytes) chunk); optr = obuf; opending = TRUE; oleft = chunk; /* now interrupt handler is enabled */ } /*===========================================================================* * pr_handler * *===========================================================================*/ PRIVATE int pr_handler(irq) int irq; { /* This is the interrupt handler. When a character has been printed, an * interrupt occurs, and the assembly code routine trapped to calls * pr_handler(). * * One problem is that the 8259A controller generates spurious interrupts to * IRQ7 when it gets confused by mistimed interrupts on any line. (IRQ7 for * the first controller happens to be the printer IRQ.) Such an interrupt is * ignored as a side-affect of the method of checking the busy status. This * is harmless for the printer task but probably fatal to the task that missed * the interrupt. It may be possible to recover by doing more work here. */ register int status; if (oleft == 0) { /* Nothing more to print. Turn off printer interrupts in case they * are level-sensitive as on the PS/2. This should be safe even * when the printer is busy with a previous character, because the * interrupt status does not affect the printer. */ out_byte(port_base + 2, SELECT); return 1; } do { /* Loop to handle fast (buffered) printers. It is important that * processor interrupts are not disabled here, just printer interrupts. */ status = in_byte(port_base + 1); if ((status & STATUS_MASK) == BUSY_STATUS) { /* Still busy with last output. This normally happens * immediately after doing output to an unbuffered or slow * printer. It may happen after a call from pr_start or * pr_restart, since they are not synchronized with printer * interrupts. It may happen after a spurious interrupt. */ return 1; } if ((status & STATUS_MASK) == NORMAL_STATUS) { /* Everything is all right. Output another character. */ out_byte(port_base, *optr++); /* output character */ lock(); /* ensure strobe is not too long */ out_byte(port_base + 2, ASSERT_STROBE); out_byte(port_base + 2, NEGATE_STROBE); unlock(); opending = FALSE; /* show interrupt is working */ user_vir++; user_left--; } else { /* Error. This would be better ignored (treat as busy). */ done_status = status; interrupt(PRINTER); return 1; } } while (--oleft != 0); /* Finished printing chunk OK. */ done_status = OK; interrupt(PRINTER); return 1; /* Reenable printer interrupt */ } /*==========================================================================* * pr_restart * *==========================================================================*/ PUBLIC void pr_restart() { /* Check if printer is hung up, and if so, restart it. * Disable_irq() returns true if the irq could be disabled, so that * pr_restart() is not reentered. */ if (oleft != 0) { if (opending && disable_irq(PRINTER_IRQ)) { (void) pr_handler(PRINTER_IRQ); /* ready for printer interrupts again */ enable_irq(PRINTER_IRQ); } opending = TRUE; /* expect some printing before next call */ } } #endif /* ENABLE_PRINTER */ /* This file contains essentially all of the process and message handling. * It has two main entry points from the outside: * * sys_call: called when a process or task does SEND, RECEIVE or SENDREC * interrupt: called by interrupt routines to send a message to task * * It also has several minor entry points: * * lock_ready: put a process on one of the ready queues so it can be run * lock_unready: remove a process from the ready queues * lock_sched: a process has run too long; schedule another one * lock_mini_send: send a message (used by interrupt signals, etc.) * lock_pick_proc: pick a process to run (used by system initialization) * unhold: repeat all held-up interrupts */ #include "kernel.h" #include #include #include "proc.h" PRIVATE unsigned char switching; /* nonzero to inhibit interrupt() */ FORWARD _PROTOTYPE( int mini_send, (struct proc *caller_ptr, int dest, message *m_ptr) ); FORWARD _PROTOTYPE( int mini_rec, (struct proc *caller_ptr, int src, message *m_ptr) ); FORWARD _PROTOTYPE( void ready, (struct proc *rp) ); FORWARD _PROTOTYPE( void sched, (void) ); FORWARD _PROTOTYPE( void unready, (struct proc *rp) ); FORWARD _PROTOTYPE( void pick_proc, (void) ); #if (CHIP == M68000) FORWARD _PROTOTYPE( void cp_mess, (int src, struct proc *src_p, message *src_m, struct proc *dst_p, message *dst_m) ); #endif #if (CHIP == INTEL) #define CopyMess(s,sp,sm,dp,dm) \ cp_mess(s, (sp)->p_map[D].mem_phys, (vir_bytes)sm, (dp)->p_map[D].mem_phys, (vir_bytes)dm) #endif #if (CHIP == M68000) #define CopyMess(s,sp,sm,dp,dm) \ cp_mess(s,sp,sm,dp,dm) #endif /*===========================================================================* * interrupt * *===========================================================================*/ PUBLIC void interrupt(task) int task; /* number of task to be started */ { /* An interrupt has occurred. Schedule the task that handles it. */ register struct proc *rp; /* pointer to task's proc entry */ rp = proc_addr(task); /* If this call would compete with other process-switching functions, put * it on the 'held' queue to be flushed at the next non-competing restart(). * The competing conditions are: * (1) k_reenter == (typeof k_reenter) -1: * Call from the task level, typically from an output interrupt * routine. An interrupt handler might reenter interrupt(). Rare, * so not worth special treatment. * (2) k_reenter > 0: * Call from a nested interrupt handler. A previous interrupt handler * might be inside interrupt() or sys_call(). * (3) switching != 0: * Some process-switching function other than interrupt() is being * called from the task level, typically sched() from CLOCK. An * interrupt handler might call interrupt and pass the k_reenter test. */ if (k_reenter != 0 || switching) { lock(); if (!rp->p_int_held) { rp->p_int_held = TRUE; if (held_head != NIL_PROC) held_tail->p_nextheld = rp; else held_head = rp; held_tail = rp; rp->p_nextheld = NIL_PROC; } unlock(); return; } /* If task is not waiting for an interrupt, record the blockage. */ if ( (rp->p_flags & (RECEIVING | SENDING)) != RECEIVING || !isrxhardware(rp->p_getfrom)) { rp->p_int_blocked = TRUE; return; } /* Destination is waiting for an interrupt. * Send it a message with source HARDWARE and type HARD_INT. * No more information can be reliably provided since interrupt messages * are not queued. */ rp->p_messbuf->m_source = HARDWARE; rp->p_messbuf->m_type = HARD_INT; rp->p_flags &= ~RECEIVING; rp->p_int_blocked = FALSE; /* Make rp ready and run it unless a task is already running. This is * ready(rp) in-line for speed. */ if (rdy_head[TASK_Q] != NIL_PROC) rdy_tail[TASK_Q]->p_nextready = rp; else proc_ptr = rdy_head[TASK_Q] = rp; rdy_tail[TASK_Q] = rp; rp->p_nextready = NIL_PROC; } /*===========================================================================* * sys_call * *===========================================================================*/ PUBLIC int sys_call(function, src_dest, m_ptr) int function; /* SEND, RECEIVE, or BOTH */ int src_dest; /* source to receive from or dest to send to */ message *m_ptr; /* pointer to message */ { /* The only system calls that exist in MINIX are sending and receiving * messages. These are done by trapping to the kernel with an INT instruction. * The trap is caught and sys_call() is called to send or receive a message * (or both). The caller is always given by proc_ptr. */ register struct proc *rp; int n; /* Check for bad system call parameters. */ if (!isoksrc_dest(src_dest)) return(E_BAD_SRC); rp = proc_ptr; if (isuserp(rp) && function != BOTH) return(E_NO_PERM); /* The parameters are ok. Do the call. */ if (function & SEND) { /* Function = SEND or BOTH. */ n = mini_send(rp, src_dest, m_ptr); if (function == SEND || n != OK) return(n); /* done, or SEND failed */ } /* Function = RECEIVE or BOTH. * We have checked user calls are BOTH, and trust 'function' otherwise. */ return(mini_rec(rp, src_dest, m_ptr)); } /*===========================================================================* * mini_send * *===========================================================================*/ PRIVATE int mini_send(caller_ptr, dest, m_ptr) register struct proc *caller_ptr; /* who is trying to send a message? */ int dest; /* to whom is message being sent? */ message *m_ptr; /* pointer to message buffer */ { /* Send a message from 'caller_ptr' to 'dest'. If 'dest' is blocked waiting * for this message, copy the message to it and unblock 'dest'. If 'dest' is * not waiting at all, or is waiting for another source, queue 'caller_ptr'. */ register struct proc *dest_ptr, *next_ptr; vir_bytes vb; /* message buffer pointer as vir_bytes */ vir_clicks vlo, vhi; /* virtual clicks containing message to send */ /* User processes are only allowed to send to FS and MM. Check for this. */ if (isuserp(caller_ptr) && !issysentn(dest)) return(E_BAD_DEST); dest_ptr = proc_addr(dest); /* pointer to destination's proc entry */ if (isemptyp(dest_ptr)) return(E_BAD_DEST); /* dead dest */ #if ALLOW_GAP_MESSAGES /* This check allows a message to be anywhere in data or stack or gap. * It will have to be made more elaborate later for machines which * don't have the gap mapped. */ vb = (vir_bytes) m_ptr; vlo = vb >> CLICK_SHIFT; /* vir click for bottom of message */ vhi = (vb + MESS_SIZE - 1) >> CLICK_SHIFT; /* vir click for top of msg */ if (vlo < caller_ptr->p_map[D].mem_vir || vlo > vhi || vhi >= caller_ptr->p_map[S].mem_vir + caller_ptr->p_map[S].mem_len) return(EFAULT); #else /* Check for messages wrapping around top of memory or outside data seg. */ vb = (vir_bytes) m_ptr; vlo = vb >> CLICK_SHIFT; /* vir click for bottom of message */ vhi = (vb + MESS_SIZE - 1) >> CLICK_SHIFT; /* vir click for top of msg */ if (vhi < vlo || vhi - caller_ptr->p_map[D].mem_vir >= caller_ptr->p_map[D].mem_len) return(EFAULT); #endif /* Check for deadlock by 'caller_ptr' and 'dest' sending to each other. */ if (dest_ptr->p_flags & SENDING) { next_ptr = proc_addr(dest_ptr->p_sendto); while (TRUE) { if (next_ptr == caller_ptr) return(ELOCKED); if (next_ptr->p_flags & SENDING) next_ptr = proc_addr(next_ptr->p_sendto); else break; } } /* Check to see if 'dest' is blocked waiting for this message. */ if ( (dest_ptr->p_flags & (RECEIVING | SENDING)) == RECEIVING && (dest_ptr->p_getfrom == ANY || dest_ptr->p_getfrom == proc_number(caller_ptr))) { /* Destination is indeed waiting for this message. */ CopyMess(proc_number(caller_ptr), caller_ptr, m_ptr, dest_ptr, dest_ptr->p_messbuf); dest_ptr->p_flags &= ~RECEIVING; /* deblock destination */ if (dest_ptr->p_flags == 0) ready(dest_ptr); } else { /* Destination is not waiting. Block and queue caller. */ caller_ptr->p_messbuf = m_ptr; if (calle,,,,,,,,,,,,r_ptr->p_flags == 0) unready(caller_ptr); caller_ptr->p_flags |= SENDING; caller_ptr->p_sendto= dest; /* Process is now blocked. Put in on the destination's queue. */ if ( (next_ptr = dest_ptr->p_callerq) == NIL_PROC) dest_ptr->p_callerq = caller_ptr; else { while (next_ptr->p_sendlink != NIL_PROC) next_ptr = next_ptr->p_sendlink; next_ptr->p_sendlink = caller_ptr; } caller_ptr->p_sendlink = NIL_PROC; } return(OK); } /*===========================================================================* * mini_rec * *===========================================================================*/ PRIVATE int mini_rec(caller_ptr, src, m_ptr) register struct proc *caller_ptr; /* process trying to get message */ int src; /* which message source is wanted (or ANY) */ message *m_ptr; /* pointer to message buffer */ { /* A process or task wants to get a message. If one is already queued, * acquire it and deblock the sender. If no message from the desired source * is available, block the caller. No need to check parameters for validity. * Users calls are always sendrec(), and mini_send() has checked already. * Calls from the tasks, MM, and FS are trusted. */ register struct proc *sender_ptr; register struct proc *previous_ptr; /* Check to see if a message from desired source is already available. */ if (!(caller_ptr->p_flags & SENDING)) { /* Check caller queue. */ for (sender_ptr = caller_ptr->p_callerq; sender_ptr != NIL_PROC; previous_ptr = sender_ptr, sender_ptr = sender_ptr->p_sendlink) { if (src == ANY || src == proc_number(sender_ptr)) { /* An acceptable message has been found. */ CopyMess(proc_number(sender_ptr), sender_ptr, sender_ptr->p_messbuf, caller_ptr, m_ptr); if (sender_ptr == caller_ptr->p_callerq) caller_ptr->p_callerq = sender_ptr->p_sendlink; else previous_ptr->p_sendlink = sender_ptr->p_sendlink; if ((sender_ptr->p_flags &= ~SENDING) == 0) ready(sender_ptr); /* deblock sender */ return(OK); } } /* Check for blocked interrupt. */ if (caller_ptr->p_int_blocked && isrxhardware(src)) { m_ptr->m_source = HARDWARE; m_ptr->m_type = HARD_INT; caller_ptr->p_int_blocked = FALSE; return(OK); } } /* No suitable message is available. Block the process trying to receive. */ caller_ptr->p_getfrom = src; caller_ptr->p_messbuf = m_ptr; if (caller_ptr->p_flags == 0) unready(caller_ptr); caller_ptr->p_flags |= RECEIVING; /* If MM has just blocked and there are kernel signals pending, now is the * time to tell MM about them, since it will be able to accept the message. */ if (sig_procs > 0 && proc_number(caller_ptr) == MM_PROC_NR && src == ANY) inform(); return(OK); } /*===========================================================================* * pick_proc * *===========================================================================*/ PRIVATE void pick_proc() { /* Decide who to run now. A new process is selected by setting 'proc_ptr'. * When a fresh user (or idle) process is selected, record it in 'bill_ptr', * so the clock task can tell who to bill for system time. */ register struct proc *rp; /* process to run */ if ( (rp = rdy_head[TASK_Q]) != NIL_PROC) { proc_ptr = rp; return; } if ( (rp = rdy_head[SERVER_Q]) != NIL_PROC) { proc_ptr = rp; return; } if ( (rp = rdy_head[USER_Q]) != NIL_PROC) { proc_ptr = rp; bill_ptr = rp; return; } /* No one is ready. Run the idle task. The idle task might be made an * always-ready user task to avoid this special case. */ bill_ptr = proc_ptr = proc_addr(IDLE); } /*===========================================================================* * ready * *===========================================================================*/ PRIVATE void ready(rp) register struct proc *rp; /* this process is now runnable */ { /* Add 'rp' to the end of one of the queues of runnable processes. Three * queues are maintained: * TASK_Q - (highest priority) for runnable tasks * SERVER_Q - (middle priority) for MM and FS only * USER_Q - (lowest priority) for user processes */ if (istaskp(rp)) { if (rdy_head[TASK_Q] != NIL_PROC) /* Add to tail of nonempty queue. */ rdy_tail[TASK_Q]->p_nextready = rp; else { proc_ptr = /* run fresh task next */ rdy_head[TASK_Q] = rp; /* add to empty queue */ } rdy_tail[TASK_Q] = rp; rp->p_nextready = NIL_PROC; /* new entry has no successor */ return; } if (isservp(rp)) { /* others are similar */ if (rdy_head[SERVER_Q] != NIL_PROC) rdy_tail[SERVER_Q]->p_nextready = rp; else rdy_head[SERVER_Q] = rp; rdy_tail[SERVER_Q] = rp; rp->p_nextready = NIL_PROC; return; } /* Add user process to the front of the queue. (Is a bit fairer to I/O * bound processes.) */ if (rdy_head[USER_Q] == NIL_PROC) rdy_tail[USER_Q] = rp; rp->p_nextready = rdy_head[USER_Q]; rdy_head[USER_Q] = rp; } /*===========================================================================* * unready * *===========================================================================*/ PRIVATE void unready(rp) register struct proc *rp; /* this process is no longer runnable */ { /* A process has blocked. */ register struct proc *xp; register struct proc **qtail; /* TASK_Q, SERVER_Q, or USER_Q rdy_tail */ if (istaskp(rp)) { /* task stack still ok? */ if (*rp->p_stguard != STACK_GUARD) panic("stack overrun by task", proc_number(rp)); if ( (xp = rdy_head[TASK_Q]) == NIL_PROC) return; if (xp == rp) { /* Remove head of queue */ rdy_head[TASK_Q] = xp->p_nextready; if (rp == proc_ptr) pick_proc(); return; } qtail = &rdy_tail[TASK_Q]; } else if (isservp(rp)) { if ( (xp = rdy_head[SERVER_Q]) == NIL_PROC) return; if (xp == rp) { rdy_head[SERVER_Q] = xp->p_nextready; #if (CHIP == M68000) if (rp == proc_ptr) #endif pick_proc(); return; } qtail = &rdy_tail[SERVER_Q]; } else { if ( (xp = rdy_head[USER_Q]) == NIL_PROC) return; if (xp == rp) { rdy_head[USER_Q] = xp->p_nextready; #if (CHIP == M68000) if (rp == proc_ptr) #endif pick_proc(); return; } qtail = &rdy_tail[USER_Q]; } /* Search body of queue. A process can be made unready even if it is * not running by being sent a signal that kills it. */ while (xp->p_nextready != rp) if ( (xp = xp->p_nextready) == NIL_PROC) return; xp->p_nextready = xp->p_nextready->p_nextready; if (*qtail == rp) *qtail = xp; } /*===========================================================================* * sched * *===========================================================================*/ PRIVATE void sched() { /* The current process has run too long. If another low priority (user) * process is runnable, put the current process on the end of the user queue, * possibly promoting another user to head of the queue. */ if (rdy_head[USER_Q] == NIL_PROC) return; /* One or more user processes queued. */ rdy_tail[USER_Q]->p_nextready = rdy_head[USER_Q]; rdy_tail[USER_Q] = rdy_head[USER_Q]; rdy_head[USER_Q] = rdy_head[USER_Q]->p_nextready; rdy_tail[USER_Q]->p_nextready = NIL_PROC; pick_proc(); } /*==========================================================================* * lock_mini_send * *==========================================================================*/ PUBLIC int lock_mini_send(caller_ptr, dest, m_ptr) struct proc *caller_ptr; /* who is trying to send a message? */ int dest; /* to whom is message being sent? */ message *m_ptr; /* pointer to message buffer */ { /* Safe gateway to mini_send() for tasks. */ int result; switching = TRUE; result = mini_send(caller_ptr, dest, m_ptr); switching = FALSE; return(result); } /*==========================================================================* * lock_pick_proc * *==========================================================================*/ PUBLIC void lock_pick_proc() { /* Safe gateway to pick_proc() for tasks. */ switching = TRUE; pick_proc(); switching = FALSE; } /*==========================================================================* * lock_ready * *==========================================================================*/ PUBLIC void lock_ready(rp) struct proc *rp; /* this process is now runnable */ { /* Safe gateway to ready() for tasks. */ switching = TRUE; ready(rp); switching = FALSE; } /*==========================================================================* * lock_unready * *==========================================================================*/ PUBLIC void lock_unready(rp) struct proc *rp; /* this process is no longer runnable */ { /* Safe gateway to unready() for tasks. */ switching = TRUE; unready(rp); switching = FALSE; } /*==========================================================================* * lock_sched * *==========================================================================*/ PUBLIC void lock_sched() { /* Safe gateway to sched() for tasks. */ switching = TRUE; sched(); switching = FALSE; } /*==========================================================================* * unhold * *==========================================================================*/ PUBLIC void unhold() { /* Flush any held-up interrupts. k_reenter must be 0. held_head must not * be NIL_PROC. Interrupts must be disabled. They will be enabled but will * be disabled when this returns. */ register struct proc *rp; /* current head of held queue */ if (switching) return; rp = held_head; do { if ( (held_head = rp->p_nextheld) == NIL_PROC) held_tail = NIL_PROC; rp->p_int_held = FALSE; unlock(); /* reduce latency; held queue may change! */ interrupt(proc_number(rp)); lock(); /* protect the held queue again */ } while ( (rp = held_head) != NIL_PROC); } #if (CHIP == M68000) /*==========================================================================* * cp_mess * *==========================================================================*/ PRIVATE void cp_mess(src, src_p, src_m, dst_p, dst_m) int src; /* sender process */ register struct proc *src_p; /* source proc entry */ message *src_m; /* source message */ register struct proc *dst_p; /* destination proc entry */ message *dst_m; /* destination buffer */ { /* convert virtual address to physical address */ /* The caller has already checked if all addresses are within bounds */ src_m = (message *)((char *)src_m + (((phys_bytes)src_p->p_map[D].mem_phys - src_p->p_map[D].mem_vir) << CLICK_SHIFT)); dst_m = (message *)((char *)dst_m + (((phys_bytes)dst_p->p_map[D].mem_phys - dst_p->p_map[D].mem_vir) << CLICK_SHIFT)); #ifdef NEEDFSTRUCOPY phys_copy(src_m,dst_m,(phys_bytes) sizeof(message)); #else *dst_m = *src_m; #endif dst_m->m_source = src; } #endif #ifndef PROC_H #define PROC_H /* Here is the declaration of the process table. It contains the process' * registers, memory map, accounting, and message send/receive information. * Many assembly code routines reference fields in it. The offsets to these * fields are defined in the assembler include file sconst.h. When changing * 'proc', be sure to change sconst.h to match. */ struct proc { struct stackframe_s p_reg; /* process' registers saved in stack frame */ #if (CHIP == INTEL) reg_t p_ldt_sel; /* selector in gdt giving ldt base and limit*/ struct segdesc_s p_ldt[4]; /* local descriptors for code and data */ /* 4 is LDT_SIZE - avoid include protect.h */ #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) reg_t p_splow; /* lowest observed stack value */ int p_trap; /* trap type (only low byte) */ char *p_crp; /* mmu table pointer (really struct _rpr *) */ int p_nflips; /* statistics */ #if defined(FPP) struct fsave p_fsave; /* FPP state frame and registers */ int align2; /* make the struct size a multiple of 4 */ #endif #endif /* (CHIP == M68000) */ reg_t *p_stguard; /* stack guard word */ int p_nr; /* number of this process (for fast access) */ char p_int_blocked; /* nonzero if int msg blocked by busy task */ char p_int_held; /* nonzero if int msg held by busy syscall */ struct proc *p_nextheld; /* next in chain of held-up int processes */ int p_flags; /* SENDING, RECEIVING, etc. */ struct mem_map p_map[NR_SEGS];/* memory map */ pid_t p_pid; /* process id passed in from MM */ int p_priority; /* task, server, or user process */ clock_t user_time; /* user time in ticks */ clock_t sys_time; /* sys time in ticks */ clock_t child_utime; /* cumulative user time of children */ clock_t child_stime; /* cumulative sys time of children */ clock_t p_alarm; /* time of next alarm in ticks, or 0 */ struct proc *p_callerq; /* head of list of procs wishing to send */ struct proc *p_sendlink; /* link to next proc wishing to send */ message *p_messbuf; /* pointer to message buffer */ int p_getfrom; /* from whom does process want to receive? */ int p_sendto; struct proc *p_nextready; /* pointer to next ready process */ sigset_t p_pending; /* bit map for pending signals */ unsigned p_pendcount; /* count of pending and unfinished signals */ char p_name[16]; /* name of the process */ }; /* Guard word for task stacks. */ #define STACK_GUARD ((reg_t) (sizeof(reg_t) == 2 ? 0xBEEF : 0xDEADBEEF)) /* Bits for p_flags in proc[]. A process is runnable iff p_flags == 0. */ #define NO_MAP 0x01 /* keeps unmapped forked child from running */ #define SENDING 0x02 /* set when process blocked trying to send */ #define RECEIVING 0x04 /* set when process blocked trying to recv */ #define PENDING 0x08 /* set when inform() of signal pending */ #define SIG_PENDING 0x10 /* keeps to-be-signalled proc from running */ #define P_STOP 0x20 /* set when process is being traced */ /* Values for p_priority */ #define PPRI_NONE 0 /* Slot is not in use */ #define PPRI_TASK 1 /* Part of the kernel */ #define PPRI_SERVER 2 /* System process outside the kernel */ #define PPRI_USER 3 /* User process */ #define PPRI_IDLE 4 /* Idle process */ /* Magic process table addresses. */ #define BEG_PROC_ADDR (&proc[0]) #define END_PROC_ADDR (&proc[NR_TASKS + NR_PROCS]) #define END_TASK_ADDR (&proc[NR_TASKS]) #define BEG_SERV_ADDR (&proc[NR_TASKS]) #define BEG_USER_ADDR (&proc[NR_TASKS + LOW_USER]) #define NIL_PROC ((struct proc *) 0) #define isidlehardware(n) ((n) == IDLE || (n) == HARDWARE) #define isokprocn(n) ((unsigned) ((n) + NR_TASKS) < NR_PROCS + NR_TASKS) #define isoksrc_dest(n) (isokprocn(n) || (n) == ANY) #define isrxhardware(n) ((n) == ANY || (n) == HARDWARE) #define issysentn(n) ((n) == FS_PROC_NR || (n) == MM_PROC_NR) #define isemptyp(p) ((p)->p_priority == PPRI_NONE) #define istaskp(p) ((p)->p_priority == PPRI_TASK) #define isservp(p) ((p)->p_priority == PPRI_SERVER) #define isuserp(p) ((p)->p_priority == PPRI_USER) #define proc_addr(n) (pproc_addr + NR_TASKS)[(n)] #define cproc_addr(n) (&(proc + NR_TASKS)[(n)]) #define proc_number(p) ((p)->p_nr) #define proc_vir2phys(p, vir) \ (((phys_bytes)(p)->p_map[D].mem_phys << CLICK_SHIFT) \ + (vir_bytes) (vir)) EXTERN struct proc proc[NR_TASKS + NR_PROCS]; /* process table */ EXTERN struct proc *pproc_addr[NR_TASKS + NR_PROCS]; /* ptrs to process table slots; fast because now a process entry can be found by indexing the pproc_addr array, while accessing an element i requires a multiplication with sizeof(struct proc) to determine the address */ EXTERN struct proc *bill_ptr; /* ptr to process to bill for clock ticks */ EXTERN struct proc *rdy_head[NQ]; /* pointers to ready list headers */ EXTERN struct proc *rdy_tail[NQ]; /* pointers to ready list tails */ #endif /* PROC_H */ /* This file contains code for initialization of protected mode, to initialize * code and data segment descriptors, and to initialize global descriptors * for local descriptors in the process table. */ #include "kernel.h" #include "proc.h" #include "protect.h" #if _WORD_SIZE == 4 #define INT_GATE_TYPE (INT_286_GATE | DESC_386_BIT) #define TSS_TYPE (AVL_286_TSS | DESC_386_BIT) #else #define INT_GATE_TYPE INT_286_GATE #define TSS_TYPE AVL_286_TSS #endif struct desctableptr_s { char limit[sizeof(u16_t)]; char base[sizeof(u32_t)]; /* really u24_t + pad for 286 */ }; struct gatedesc_s { u16_t offset_low; u16_t selector; u8_t pad; /* |000|XXXXX| ig & trpg, |XXXXXXXX| task g */ u8_t p_dpl_type; /* |P|DL|0|TYPE| */ u16_t offset_high; }; struct tss_s { reg_t backlink; reg_t sp0; /* stack pointer to use during interrupt */ reg_t ss0; /* " segment " " " " */ reg_t sp1; reg_t ss1; reg_t sp2; reg_t ss2; #if _WORD_SIZE == 4 reg_t cr3; #endif reg_t ip; reg_t flags; reg_t ax; reg_t cx; reg_t dx; reg_t bx; reg_t sp; reg_t bp; reg_t si; reg_t di; reg_t es; reg_t cs; reg_t ss; reg_t ds; #if _WORD_SIZE == 4 reg_t fs; reg_t gs; #endif reg_t ldt; #if _WORD_SIZE == 4 u16_t trap; u16_t iobase; /* u8_t iomap[0]; */ #endif }; PUBLIC struct segdesc_s gdt[GDT_SIZE]; PRIVATE struct gatedesc_s idt[IDT_SIZE]; /* zero-init so none present */ PUBLIC struct tss_s tss; /* zero init */ FORWARD _PROTOTYPE( void int_gate, (unsigned vec_nr, vir_bytes offset, unsigned dpl_type) ); FORWARD _PROTOTYPE( void sdesc, (struct segdesc_s *segdp, phys_bytes base, vir_bytes size) ); /*=========================================================================* * prot_init * *=========================================================================*/ PUBLIC void prot_init() { /* Set up tables for protected mode. * All GDT slots are allocated at compile time. */ extern int etext, end; #define code_bytes ((vir_bytes) &etext) /* Size of code segment. */ #define data_bytes ((vir_bytes) &end) /* Size of data segment. */ struct gate_table_s *gtp; struct desctableptr_s *dtp; unsigned ldt_index; register struct proc *rp; static struct gate_table_s { _PROTOTYPE( void (*gate), (void) ); unsigned char vec_nr; unsigned char privilege; } gate_table[] = { divide_error, DIVIDE_VECTOR, INTR_PRIVILEGE, single_step_exception, DEBUG_VECTOR, INTR_PRIVILEGE, nmi, NMI_VECTOR, INTR_PRIVILEGE, breakpoint_exception, BREAKPOINT_VECTOR, USER_PRIVILEGE, overflow, OVERFLOW_VECTOR, USER_PRIVILEGE, bounds_check, BOUNDS_VECTOR, INTR_PRIVILEGE, inval_opcode, INVAL_OP_VECTOR, INTR_PRIVILEGE, copr_not_available, COPROC_NOT_VECTOR, INTR_PRIVILEGE, double_fault, DOUBLE_FAULT_VECTOR, INTR_PRIVILEGE, copr_seg_overrun, COPROC_SEG_VECTOR, INTR_PRIVILEGE, inval_tss, INVAL_TSS_VECTOR, INTR_PRIVILEGE, segment_not_present, SEG_NOT_VECTOR, INTR_PRIVILEGE, stack_exception, STACK_FAULT_VECTOR, INTR_PRIVILEGE, general_protection, PROTECTION_VECTOR, INTR_PRIVILEGE, #if _WORD_SIZE == 4 page_fault, PAGE_FAULT_VECTOR, INTR_PRIVILEGE, copr_error, COPROC_ERR_VECTOR, INTR_PRIVILEGE, #endif { hwint00, VECTOR( 0), INTR_PRIVILEGE }, { hwint01, VECTOR( 1), INTR_PRIVILEGE }, { hwint02, VECTOR( 2), INTR_PRIVILEGE }, { hwint03, VECTOR( 3), INTR_PRIVILEGE }, { hwint04, VECTOR( 4), INTR_PRIVILEGE }, { hwint05, VECTOR( 5), INTR_PRIVILEGE }, { hwint06, VECTOR( 6), INTR_PRIVILEGE }, { hwint07, VECTOR( 7), INTR_PRIVILEGE }, { hwint08, VECTOR( 8), INTR_PRIVILEGE }, { hwint09, VECTOR( 9), INTR_PRIVILEGE }, { hwint10, VECTOR(10), INTR_PRIVILEGE }, { hwint11, VECTOR(11), INTR_PRIVILEGE }, { hwint12, VECTOR(12), INTR_PRIVILEGE }, { hwint13, VECTOR(13), INTR_PRIVILEGE }, { hwint14, VECTOR(14), INTR_PRIVILEGE }, { hwint15, VECTOR(15), INTR_PRIVILEGE }, #if _WORD_SIZE == 2 { p_s_call, SYS_VECTOR, USER_PRIVILEGE }, /* 286 system call */ #else { s_call, SYS386_VECTOR, USER_PRIVILEGE }, /* 386 system call */ #endif { level0_call, LEVEL0_VECTOR, TASK_PRIVILEGE }, }; /* Build gdt and idt pointers in GDT where the BIOS expects them. */ dtp= (struct desctableptr_s *) &gdt[GDT_INDEX]; * (u16_t *) dtp->limit = (sizeof gdt) - 1; * (u32_t *) dtp->base = vir2phys(gdt); dtp= (struct desctableptr_s *) &gdt[IDT_INDEX]; * (u16_t *) dtp->limit = (sizeof idt) - 1; * (u32_t *) dtp->base = vir2phys(idt); /* Build segment descriptors for tasks and interrupt handlers. */ init_codeseg(&gdt[CS_INDEX], code_base, code_bytes, INTR_PRIVILEGE); init_dataseg(&gdt[DS_INDEX], data_base, data_bytes, INTR_PRIVILEGE); init_dataseg(&gdt[ES_INDEX], 0L, 0, TASK_PRIVILEGE); /* Build scratch descriptors for functions in klib88. */ init_dataseg(&gdt[DS_286_INDEX], 0L, 0, TASK_PRIVILEGE); init_dataseg(&gdt[ES_286_INDEX], 0L, 0, TASK_PRIVILEGE); /* Build local descriptors in GDT for LDT's in process table. * The LDT's are allocated at compile time in the process table, and * initialized whenever a process' map is initialized or changed. */ for (rp = BEG_PROC_ADDR, ldt_index = FIRST_LDT_INDEX; rp < END_PROC_ADDR; ++rp, ldt_index++) { init_dataseg(&gdt[ldt_index], vir2phys(rp->p_ldt), sizeof(rp->p_ldt), INTR_PRIVILEGE); gdt[ldt_index].access = PRESENT | LDT; rp->p_ldt_sel = ldt_index * DESC_SIZE; } /* Build main TSS. * This is used only to record the stack pointer to be used after an * interrupt. * The pointer is set up so that an interrupt automatically saves the * current process's registers ip:cs:f:sp:ss in the correct slots in the * process table. */ tss.ss0 = DS_SELECTOR; init_dataseg(&gdt[TSS_INDEX], vir2phys(&tss), sizeof(tss), INTR_PRIVILEGE); gdt[TSS_INDEX].access = PRESENT | (INTR_PRIVILEGE << DPL_SHIFT) | TSS_TYPE; /* Build descriptors for interrupt gates in IDT. */ for (gtp = &gate_table[0]; gtp < &gate_table[sizeof gate_table / sizeof gate_table[0]]; ++gtp) { int_gate(gtp->vec_nr, (vir_bytes) gtp->gate, PRESENT | INT_GATE_TYPE | (gtp->privilege << DPL_SHIFT)); } #if _WORD_SIZE == 4 /* Complete building of main TSS. */ tss.iobase = sizeof tss; /* empty i/o permissions map */ #endif } /*=========================================================================* * init_codeseg * *=========================================================================*/ PUBLIC void init_codeseg(segdp, base, size, privilege) register struct segdesc_s *segdp; phys_bytes base; vir_bytes size; int privilege; { /* Build descriptor for a code segment. */ sdesc(segdp, base, size); segdp->access = (privilege << DPL_SHIFT) | (PRESENT | SEGMENT | EXECUTABLE | READABLE); /* CONFORMING = 0, ACCESSED = 0 */ } /*=========================================================================* * init_dataseg * *=========================================================================*/ PUBLIC void init_dataseg(segdp, base, size, privilege) register struct segdesc_s *segdp; phys_bytes base; vir_bytes size; int privilege; { /* Build descriptor for a data segment. */ sdesc(segdp, base, size); segdp->access = (privilege << DPL_SHIFT) | (PRESENT | SEGMENT | WRITEABLE); /* EXECUTABLE = 0, EXPAND_DOWN = 0, ACCESSED = 0 */ } /*=========================================================================* * sdesc * *=========================================================================*/ PRIVATE void sdesc(segdp, base, size) register struct segdesc_s *segdp; phys_bytes base; vir_bytes size; { /* Fill in the size fields (base, limit and granularity) of a descriptor. */ segdp->base_low = base; segdp->base_middle = base >> BASE_MIDDLE_SHIFT; segdp->base_high = base >> BASE_HIGH_SHIFT; #if _WORD_SIZE == 4 --size; /* convert to a limit, 0 size means 4G */ if (size > BYTE_GRAN_MAX) { segdp->limit_low = size >> PAGE_GRAN_SHIFT; segdp->granularity = GRANULAR | (size >> (PAGE_GRAN_SHIFT + GRANULARITY_SHIFT)); } else { segdp->limit_low = size; segdp->granularity = size >> GRANULARITY_SHIFT; } segdp->granularity |= DEFAULT; /* means BI,,--G for data seg */ #else segdp->limit_low = size - 1; #endif } /*=========================================================================* * seg2phys * *=========================================================================*/ PUBLIC phys_bytes seg2phys(seg) U16_t seg; { /* Return the base address of a segment, with seg being either a 8086 segment * register, or a 286/386 segment selector. */ phys_bytes base; struct segdesc_s *segdp; if (!protected_mode) { base = hclick_to_physb(seg); } else { segdp = &gdt[seg >> 3]; base = ((u32_t) segdp->base_low << 0) | ((u32_t) segdp->base_middle << 16) | ((u32_t) segdp->base_high << 24); } return base; } /*=========================================================================* * phys2seg * *=========================================================================*/ PUBLIC void phys2seg(seg, off, phys) u16_t *seg; vir_bytes *off; phys_bytes phys; { /* Return a segment selector and offset that can be used to reach a physical * address, for use by a driver doing memory I/O in the A0000 - DFFFF range. */ #if _WORD_SIZE == 2 if (!protected_mode) { *seg = phys / HCLICK_SIZE; *off = phys % HCLICK_SIZE; } else { unsigned bank = phys >> 16; unsigned index = bank - 0xA + A_INDEX; init_dataseg(&gdt[index], (phys_bytes) bank << 16, 0, TASK_PRIVILEGE); *seg = (index * 0x08) | TASK_PRIVILEGE; *off = phys & 0xFFFF; } #else *seg = FLAT_DS_SELECTOR; *off = phys; #endif } /*=========================================================================* * int_gate * *=========================================================================*/ PRIVATE void int_gate(vec_nr, offset, dpl_type) unsigned vec_nr; vir_bytes offset; unsigned dpl_type; { /* Build descriptor for an interrupt gate. */ register struct gatedesc_s *idp; idp = &idt[vec_nr]; idp->offset_low = offset; idp->selector = CS_SELECTOR; idp->p_dpl_type = dpl_type; #if _WORD_SIZE == 4 idp->offset_high = offset >> OFFSET_HIGH_SHIFT; #endif } /*=========================================================================* * enable_iop * *=========================================================================*/ PUBLIC void enable_iop(pp) struct proc *pp; { /* Allow a user process to use I/O instructions. Change the I/O Permission * Level bits in the psw. These specify least-privileged Current Permission * Level allowed to execute I/O instructions. Users and servers have CPL 3. * You can't have less privilege than that. Kernel has CPL 0, tasks CPL 1. */ pp->p_reg.psw |= 0x3000; } /* Constants for protected mode. */ /* Table sizes. */ #define GDT_SIZE (FIRST_LDT_INDEX + NR_TASKS + NR_PROCS) /* spec. and LDT's */ #define IDT_SIZE (IRQ8_VECTOR + 8) /* only up to the highest vector */ #define LDT_SIZE 4 /* contains CS, DS and two extras */ /* Fixed global descriptors. 1 to 7 are prescribed by the BIOS. */ #define GDT_INDEX 1 /* GDT descriptor */ #define IDT_INDEX 2 /* IDT descriptor */ #define DS_INDEX 3 /* kernel DS */ #define ES_INDEX 4 /* kernel ES (386: flag 4 Gb at startup) */ #define SS_INDEX 5 /* kernel SS (386: monitor SS at startup) */ #define CS_INDEX 6 /* kernel CS */ #define MON_CS_INDEX 7 /* temp for BIOS (386: monitor CS at startup) */ #define TSS_INDEX 8 /* kernel TSS */ #define DS_286_INDEX 9 /* scratch 16-bit source segment */ #define ES_286_INDEX 10 /* scratch 16-bit destination segment */ #define A_INDEX 11 /* 64K memory segment at A0000 */ #define B_INDEX 12 /* 64K memory segment at B0000 */ #define C_INDEX 13 /* 64K memory segment at C0000 */ #define D_INDEX 14 /* 64K memory segment at D0000 */ #define FIRST_LDT_INDEX 15 /* rest of descriptors are LDT's */ #define GDT_SELECTOR 0x08 /* (GDT_INDEX * DESC_SIZE) bad for asld */ #define IDT_SELECTOR 0x10 /* (IDT_INDEX * DESC_SIZE) */ #define DS_SELECTOR 0x18 /* (DS_INDEX * DESC_SIZE) */ #define ES_SELECTOR 0x20 /* (ES_INDEX * DESC_SIZE) */ #define FLAT_DS_SELECTOR 0x21 /* less privileged ES */ #define SS_SELECTOR 0x28 /* (SS_INDEX * DESC_SIZE) */ #define CS_SELECTOR 0x30 /* (CS_INDEX * DESC_SIZE) */ #define MON_CS_SELECTOR 0x38 /* (MON_CS_INDEX * DESC_SIZE) */ #define TSS_SELECTOR 0x40 /* (TSS_INDEX * DESC_SIZE) */ #define DS_286_SELECTOR 0x49 /* (DS_286_INDEX*DESC_SIZE + TASK_PRIVILEGE) */ #define ES_286_SELECTOR 0x51 /* (ES_286_INDEX*DESC_SIZE + TASK_PRIVILEGE) */ /* Fixed local descriptors. */ #define CS_LDT_INDEX 0 /* process CS */ #define DS_LDT_INDEX 1 /* process DS=ES=FS=GS=SS */ #define EXTRA_LDT_INDEX 2 /* first of the extra LDT entries */ /* Privileges. */ #define INTR_PRIVILEGE 0 /* kernel and interrupt handlers */ #define TASK_PRIVILEGE 1 #define USER_PRIVILEGE 3 /* 286 hardware constants. */ /* Exception vector numbers. */ #define BOUNDS_VECTOR 5 /* bounds check failed */ #define INVAL_OP_VECTOR 6 /* invalid opcode */ #define COPROC_NOT_VECTOR 7 /* coprocessor not available */ #define DOUBLE_FAULT_VECTOR 8 #define COPROC_SEG_VECTOR 9 /* coprocessor segment overrun */ #define INVAL_TSS_VECTOR 10 /* invalid TSS */ #define SEG_NOT_VECTOR 11 /* segment not present */ #define STACK_FAULT_VECTOR 12 /* stack exception */ #define PROTECTION_VECTOR 13 /* general protection */ /* Selector bits. */ #define TI 0x04 /* table indicator */ #define RPL 0x03 /* requester privilege level */ /* Descriptor structure offsets. */ #define DESC_BASE 2 /* to base_low */ #define DESC_BASE_MIDDLE 4 /* to base_middle */ #define DESC_ACCESS 5 /* to access byte */ #define DESC_SIZE 8 /* sizeof (struct segdesc_s) */ /* Base and limit sizes and shifts. */ #define BASE_MIDDLE_SHIFT 16 /* shift for base --> base_middle */ /* Access-byte and type-byte bits. */ #define PRESENT 0x80 /* set for descriptor present */ #define DPL 0x60 /* descriptor privilege level mask */ #define DPL_SHIFT 5 #define SEGMENT 0x10 /* set for segment-type descriptors */ /* Access-byte bits. */ #define EXECUTABLE 0x08 /* set for executable segment */ #define CONFORMING 0x04 /* set for conforming segment if executable */ #define EXPAND_DOWN 0x04 /* set for expand-down segment if !executable*/ #define READABLE 0x02 /* set for readable segment if executable */ #define WRITEABLE 0x02 /* set for writeable segment if !executable */ #define TSS_BUSY 0x02 /* set if TSS descriptor is busy */ #define ACCESSED 0x01 /* set if segment accessed */ /* Special descriptor types. */ #define AVL_286_TSS 1 /* available 286 TSS */ #define LDT 2 /* local descriptor table */ #define BUSY_286_TSS 3 /* set transparently to the software */ #define CALL_286_GATE 4 /* not used */ #define TASK_GATE 5 /* only used by debugger */ #define INT_286_GATE 6 /* interrupt gate, used for all vectors */ #define TRAP_286_GATE 7 /* not used */ /* Extra 386 hardware constants. */ /* Exception vector numbers. */ #define PAGE_FAULT_VECTOR 14 #define COPROC_ERR_VECTOR 16 /* coprocessor error */ /* Descriptor structure offsets. */ #define DESC_GRANULARITY 6 /* to granularity byte */ #define DESC_BASE_HIGH 7 /* to base_high */ /* Base and limit sizes and shifts. */ #define BASE_HIGH_SHIFT 24 /* shift for base --> base_high */ #define BYTE_GRAN_MAX 0xFFFFFL /* maximum size for byte granular segment */ #define GRANULARITY_SHIFT 16 /* shift for limit --> granularity */ #define OFFSET_HIGH_SHIFT 16 /* shift for (gate) offset --> offset_high */ #define PAGE_GRAN_SHIFT 12 /* extra shift for page granular limits */ /* Type-byte bits. */ #define DESC_386_BIT 0x08 /* 386 types are obtained by ORing with this */ /* LDT's and TASK_GATE's don't need it */ /* Granularity byte. */ #define GRANULAR 0x80 /* set for 4K granularilty */ #define DEFAULT 0x40 /* set for 32-bit defaults (executable seg) */ #define BIG 0x40 /* set for "BIG" (expand-down seg) */ #define AVL 0x10 /* 0 for available */ #define LIMIT_HIGH 0x0F /* mask for high bits of limit */ /* Function prototypes. */ #ifndef PROTO_H #define PROTO_H /* Struct declarations. */ struct dpeth; struct proc; struct tty; /* at_wini.c, bios_wini.c, esdi_wini.c, ps_wini.c, xt_wini.c, wini.c */ _PROTOTYPE( void at_winchester_task, (void) ); _PROTOTYPE( void bios_winchester_task, (void) ); _PROTOTYPE( void esdi_winchester_task, (void) ); _PROTOTYPE( void ps_winchester_task, (void) ); _PROTOTYPE( void xt_winchester_task, (void) ); /* aha1540.c */ _PROTOTYPE( void aha1540_scsi_task, (void) ); /* fatfile.c, dosfile.c */ _PROTOTYPE( void fatfile_task, (void) ); _PROTOTYPE( void dosfile_task, (void) ); _PROTOTYPE( void dosfile_stop, (void) ); /* clock.c */ _PROTOTYPE( void clock_task, (void) ); _PROTOTYPE( void clock_stop, (void) ); _PROTOTYPE( clock_t get_uptime, (void) ); _PROTOTYPE( void syn_alrm_task, (void) ); /* dmp.c */ _PROTOTYPE( void map_dmp, (void) ); _PROTOTYPE( void p_dmp, (void) ); _PROTOTYPE( void reg_dmp, (struct proc *rp) ); /* dp8390.c */ _PROTOTYPE( void dp8390_task, (void) ); _PROTOTYPE( void dp_dump, (void) ); _PROTOTYPE( void dp8390_stop, (void) ); /* driver.c */ _PROTOTYPE( void nop_task, (void) ); /* floppy.c, stfloppy.c */ _PROTOTYPE( void floppy_task, (void) ); _PROTOTYPE( void floppy_stop, (void) ); /* main.c, stmain.c */ _PROTOTYPE( void main, (void) ); _PROTOTYPE( void panic, (const char *s, int n) ); /* mcd.c */ _PROTOTYPE( void mcd_task, (void) ); /* memory.c */ _PROTOTYPE( void mem_task, (void) ); /* misc.c */ _PROTOTYPE( int env_parse, (char *env, char *fmt, int field, long *param, long min, long max) ); /* printer.c, stprint.c */ _PROTOTYPE( void printer_task, (void) ); /* proc.c */ _PROTOTYPE( void interrupt, (int task) ); _PROTOTYPE( int lock_mini_send, (struct proc *caller_ptr, int dest, message *m_ptr) ); _PROTOTYPE( void lock_pick_proc, (void) ); _PROTOTYPE( void lock_ready, (struct proc *rp) ); _PROTOTYPE( void lock_sched, (void) ); _PROTOTYPE( void lock_unready, (struct proc *rp) ); _PROTOTYPE( int sys_call, (int function, int src_dest, message *m_ptr) ); _PROTOTYPE( void unhold, (void) ); /* rs232.c */ _PROTOTYPE( void rs_init, (struct tty *tp) ); /* sb16_dsp.c */ _PROTOTYPE( void sb16_task, (void) ); /* sb16_mixer.c */ _PROTOTYPE( void sb16mixer_task, (void) ); /* system.c */ _PROTOTYPE( void cause_sig, (int proc_nr, int sig_nr) ); _PROTOTYPE( void inform, (void) ); _PROTOTYPE( phys_bytes numap, (int proc_nr, vir_bytes vir_addr, vir_bytes bytes) ); _PROTOTYPE( void sys_task, (void) ); _PROTOTYPE( phys_bytes umap, (struct proc *rp, int seg, vir_bytes vir_addr, vir_bytes bytes) ); _PROTOTYPE( int vir_copy, (int src_proc, vir_bytes src_vir, int dst_proc, vir_bytes dst_vir, vir_bytes bytes) ); /* table.c */ _PROTOTYPE( void mapdrivers, (void) ); /* tty.c */ _PROTOTYPE( void handle_events, (struct tty *tp) ); _PROTOTYPE( void sigchar, (struct tty *tp, int sig) ); _PROTOTYPE( void tty_task, (void) ); _PROTOTYPE( int in_process, (struct tty *tp, char *buf, int count) ); _PROTOTYPE( void out_process, (struct tty *tp, char *bstart, char *bpos, char *bend, int *icount, int *ocount) ); _PROTOTYPE( void tty_wakeup, (clock_t now) ); _PROTOTYPE( void tty_reply, (int code, int replyee, int proc_nr, int status) ); _PROTOTYPE( void tty_devnop, (struct tty *tp) ); /* library */ _PROTOTYPE( void *memcpy, (void *_s1, const void *_s2, size_t _n) ); #if (CHIP == INTEL) /* 3c503.c */ _PROTOTYPE( int el2_probe, (struct dpeth *dep) ); /* clock.c */ _PROTOTYPE( void milli_start, (struct milli_state *msp) ); _PROTOTYPE( unsigned milli_elapsed, (struct milli_state *msp) ); _PROTOTYPE( void milli_delay, (unsigned millisec) ); /* console.c */ _PROTOTYPE( void cons_stop, (void) ); _PROTOTYPE( void putk, (int c) ); _PROTOTYPE( void scr_init, (struct tty *tp) ); _PROTOTYPE( void toggle_scroll, (void) ); _PROTOTYPE( int con_loadfont, (phys_bytes user_phys) ); _PROTOTYPE( void select_console, (int cons_line) ); /* cstart.c */ _PROTOTYPE( void cstart, (U16_t cs, U16_t ds, U16_t mds, U16_t parmoff, U16_t parmsize) ); /* exception.c */ _PROTOTYPE( void exception, (unsigned vec_nr) ); /* i8259.c */ _PROTOTYPE( irq_handler_t get_irq_handler, (int irq) ); _PROTOTYPE( void put_irq_handler, (int irq, irq_handler_t handler) ); _PROTOTYPE( void intr_init, (int mine) ); /* keyboard.c */ _PROTOTYPE( void kb_init, (struct tty *tp) ); _PROTOTYPE( int kbd_loadmap, (phys_bytes user_phys) ); _PROTOTYPE( void wreboot, (int how) ); /* klib*.s */ _PROTOTYPE( void int86, (void) ); _PROTOTYPE( void cp_mess, (int src,phys_clicks src_clicks,vir_bytes src_offset, phys_clicks dst_clicks, vir_bytes dst_offset) ); _PROTOTYPE( int in_byte, (port_t port) ); _PROTOTYPE( int in_word, (port_t port) ); _PROTOTYPE( void lock, (void) ); _PROTOTYPE( void unlock, (void) ); _PROTOTYPE( void enable_irq, (unsigned irq) ); _PROTOTYPE( int disable_irq, (unsigned irq) ); _PROTOTYPE( u16_t mem_rdw, (U16_t segm, vir_bytes offset) ); _PROTOTYPE( void out_byte, (port_t port, int value) ); _PROTOTYPE( void out_word, (port_t port, int value) ); _PROTOTYPE( void phys_copy, (phys_bytes source, phys_bytes dest, phys_bytes count) ); _PROTOTYPE( void port_read, (unsigned port, phys_bytes destination, unsigned bytcount) ); _PROTOTYPE( void port_read_byte, (unsigned port, phys_bytes destination, unsigned bytcount) ); _PROTOTYPE( void port_write, (unsigned port, phys_bytes source, unsigned bytcount) ); _PROTOTYPE( void port_write_byte, (unsigned port, phys_bytes source, unsigned bytcount) ); _PROTOTYPE( void reset, (void) ); _PROTOTYPE( void vid_vid_copy, (unsigned src, unsigned dst, unsigned count)); _PROTOTYPE( void mem_vid_copy, (u16_t *src, unsigned dst, unsigned count)); _PROTOTYPE( void level0, (void (*func)(void)) ); _PROTOTYPE( void monitor, (void) ); /* misc.c */ _PROTOTYPE( void mem_init, (void) ); /* mpx*.s */ _PROTOTYPE( void idle_task, (void) ); _PROTOTYPE( void restart, (void) ); /* The following are never called from C (pure asm procs). */ /* Exception handlers (real or protected mode), in numerical order. */ void _PROTOTYPE( int00, (void) ), _PROTOTYPE( divide_error, (void) ); void _PROTOTYPE( int01, (void) ), _PROTOTYPE( single_step_exception, (void) ); void _PROTOTYPE( int02, (void) ), _PROTOTYPE( nmi, (void) ); void _PROTOTYPE( int03, (void) ), _PROTOTYPE( breakpoint_exception, (void) ); void _PROTOTYPE( int04, (void) ), _PROTOTYPE( overflow, (void) ); void _PROTOTYPE( int05, (void) ), _PROTOTYPE( bounds_check, (void) ); void _PROTOTYPE( int06, (void) ), _PROTOTYPE( inval_opcode, (void) ); void _PROTOTYPE( int07, (void) ), _PROTOTYPE( copr_not_available, (void) ); void _PROTOTYPE( double_fault, (void) ); void _PROTOTYPE( copr_seg_overrun, (void) ); void _PROTOTYPE( inval_tss, (void) ); void _PROTOTYPE( segment_not_present, (void) ); void _PROTOTYPE( stack_exception, (void) ); void _PROTOTYPE( general_protection, (void) ); void _PROTOTYPE( page_fault, (void) ); void _PROTOTYPE( copr_error, (void) ); /* Hardware interrupt handlers. */ _PROTOTYPE( void hwint00, (void) ); _PROTOTYPE( void hwint01, (void) ); _PROTOTYPE( void hwint02, (void) ); _PROTOTYPE( void hwint03, (void) ); _PROTOTYPE( void hwint04, (void) ); _PROTOTYPE( void hwint05, (void) ); _PROTOTYPE( void hwint06, (void) ); _PROTOTYPE( void hwint07, (void) ); _PROTOTYPE( void hwint08, (void) ); _PROTOTYPE( void hwint09, (void) ); _PROTOTYPE( void hwint10, (void) ); _PROTOTYPE( void hwint11, (void) ); _PROTOTYPE( void hwint12, (void) ); _PROTOTYPE( void hwint13, (void) ); _PROTOTYPE( void hwint14, (void) ); _PROTOTYPE( void hwint15, (void) ); /* Software interrupt handlers, in numerical order. */ _PROTOTYPE( void trp, (void) ); _PROTOTYPE( void s_call, (void) ), _PROTOTYPE( p_s_call, (void) ); _PROTOTYPE( void level0_call, (void) ); /* ne2000.c */ _PROTOTYPE( int ne_probe, (struct dpeth *dep) ); /* -------printer.c */ _PROTOTYPE( void pr_restart, (void) ); /* protect.c */ _PROTOTYPE( void prot_init, (void) ); _PROTOTYPE( void init_codeseg, (struct segdesc_s *segdp, phys_bytes base, vir_bytes size, int privilege) ); _PROTOTYPE( void init_dataseg, (struct segdesc_s *segdp, phys_bytes base, vir_bytes size, int privilege) ); _PROTOTYPE( phys_bytes seg2phys, (U16_t seg) ); _PROTOTYPE( void phys2seg, (u16_t *seg, vir_bytes *off, phys_bytes phys)); _PROTOTYPE( void enable_iop, (struct proc *pp) ); /* pty.c */ _PROTOTYPE( void do_pty, (struct tty *tp, message *m_ptr) ); _PROTOTYPE( void pty_init, (struct tty *tp) ); /* system.c */ _PROTOTYPE( void alloc_segments, (struct proc *rp) ); /* wdeth.c */ _PROTOTYPE( int wdeth_probe, (struct dpeth *dep) ); #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) /* cstart.c */ _PROTOTYPE( void cstart, (char *parmoff, size_t parmsize) ); /* stfloppy.c */ _PROTOTYPE( void fd_timer, (void) ); /* stmain.c */ _PROTOTYPE( void none, (void) ); _PROTOTYPE( void rupt, (void) ); _PROTOTYPE( void trap, (void) ); _PROTOTYPE( void checksp, (void) ); _PROTOTYPE( void aciaint, (void) ); _PROTOTYPE( void fake_int, (const char *s, int t) ); _PROTOTYPE( void timint, (int t) ); _PROTOTYPE( void mdiint, (void) ); _PROTOTYPE( void iob, (int t) ); _PROTOTYPE( void idle_task, (void) ); /* rs232.c */ _PROTOTYPE( void siaint, (int type) ); /* stcon.c */ _PROTOTYPE( void func_key, (void) ); _PROTOTYPE( void dump, (void) ); _PROTOTYPE( void putk, (int c) ); /* stdma.c */ _PROTOTYPE( void dmagrab, (int p, dmaint_t func) ); _PROTOTYPE( void dmafree, (int p) ); _PROTOTYPE( void dmaint, (void) ); _PROTOTYPE( void dmaaddr, (phys_bytes ad) ); _PROTOTYPE( int dmardat, (int mode, int delay) ); _PROTOTYPE( void dmawdat, (int mode, int data, int delay) ); _PROTOTYPE( void dmawcmd, (int data, unsigned mode) ); _PROTOTYPE( void dmacomm, (int mode, int data, int delay) ); _PROTOTYPE( int dmastat, (int mode, int delay) ); /* stdskclk.c */ _PROTOTYPE( int do_xbms, (phys_bytes address, int count, int rw, int minor) ); /* stkbd.c */ _PROTOTYPE( void kbdint, (void) ); _PROTOTYPE( void kb_timer, (void) ); _PROTOTYPE( int kb_read, (int minor, char **bufindirect) ); _PROTOTYPE( void kb_init, (int minor) ); /* stvdu.c */ _PROTOTYPE( void flush, (struct tty *tp) ); _PROTOTYPE( void console, (struct tty *tp) ); _PROTOTYPE( void out_char, (struct tty *tp, int c) ); _PROTOTYPE( void scr_init, (int minor) ); _PROTOTYPE( void vduswitch, (struct tty *tp) ); _PROTOTYPE( void vdusetup, (unsigned int vres, char *vram, unsigned short *vrgb) ); _PROTOTYPE( void vbl, (void) ); _PROTOTYPE( int vdu_loadfont, (message *m_ptr) ); /* stwini.c */ _PROTOTYPE( int wini_open, (message *mp) ); _PROTOTYPE( int wini_rdwt, (message *mp) ); _PROTOTYPE( int wini_hvrdwt, (message *mp) ); _PROTOTYPE( int wini_transfer, (int rw, int pnr, int minor, long pos, int count, vir_bytes vadr) ); _PROTOTYPE( int wini_ioctl, (message *mp) ); _PROTOTYPE( int wini_close, (message *mp) ); /* stacsi.c */ _PROTOTYPE( int acsi_cmd, (int drive, unsigned char *cmd, int cmdlen, phys_bytes address, phys_bytes data_len, int rw) ); /* stscsi.c */ _PROTOTYPE( void scsi_task, (void) ); _PROTOTYPE( void scsidmaint, (void) ); _PROTOTYPE( void scsiint, (void) ); _PROTOTYPE( int scsi_cmd, (int drive, unsigned char *cmd, int cmdlen, phys_bytes address, phys_bytes data_len, int rw) ); /* klib68k.s */ _PROTOTYPE( void flipclicks, (phys_clicks c1, phys_clicks c2, phys_clicks n) ); _PROTOTYPE( void copyclicks, (phys_clicks src, phys_clicks dest, phys_clicks nclicks) ); _PROTOTYPE( void zeroclicks, (phys_clicks dest, phys_clicks nclicks) ); _PROTOTYPE( void phys_copy, (phys_bytes src, phys_bytes dest, phys_bytes n) ); /* stdskclks.s */ _PROTOTYPE( int rd1byte, (void) ); _PROTOTYPE( int wr1byte, (int) ); _PROTOTYPE( long getsupra, (void) ); _PROTOTYPE( long geticd, (void) ); /* mpx.s */ _PROTOTYPE( int lock, (void) ); _PROTOTYPE( void unlock, (void) ); _PROTOTYPE( void restore, (int oldsr) ); _PROTOTYPE( void reboot, (void) ); _PROTOTYPE( int test_and_set, (char *flag) ); _PROTOTYPE( unsigned long get_mem_size, (char *start_addr) ); /* stprint.c */ #ifdef DEBOUT _PROTOTYPE( void prtc, (int c) ); #endif #ifdef FPP /* fpp.c */ _PROTOTYPE( void fppinit, (void) ); _PROTOTYPE( void fpp_new_state, (struct proc *rp) ); _PROTOTYPE( void fpp_save, (struct proc *rp, struct cpu_state *p) ); _PROTOTYPE( struct cpu_state *fpp_restore, (struct proc *rp) ); /* fpps.s */ _PROTOTYPE( void _fppsave, (struct state_frame *p) ); _PROTOTYPE( void _fppsavereg, (struct fpp_model *p) ); _PROTOTYPE( void _fpprestore, (struct state_frame *p) ); _PROTOTYPE( void _fpprestreg, (struct fpp_model *p) ); #endif /* pmmu.c */ _PROTOTYPE(void pmmuinit , (void) ); _PROTOTYPE(void pmmu_init_proc , (struct proc *rp ) ); _PROTOTYPE(void pmmu_restore , (struct proc *rp ) ); _PROTOTYPE(void pmmu_delete , (struct proc *rp ) ); _PROTOTYPE(void pmmu_flush , (struct proc *rp ) ); #endif /* (CHIP == M68000) */ #endif /* PROTO_H */ /* This file contains the terminal driver, both for the IBM console and regular * ASCII terminals. It handles only the device-independent part of a TTY, the * device dependent parts are in console.c, rs232.c, etc. This file contains * two main entry points, tty_task() and tty_wakeup(), and several minor entry * points for use by the device-dependent code. * * The device-independent part accepts "keyboard" input from the device- * dependent part, performs input processing (special key interpretation), * and sends the input to a process reading from the TTY. Output to a TTY * is sent to the device-dependent code for output processing and "screen" * display. Input processing is done by the device by calling 'in_process' * on the input characters, output processing may be done by the device itself * or by calling 'out_process'. The TTY takes care of input queuing, the * device does the output queuing. If a device receives an external signal, * like an interrupt, then it causes tty_wakeup() to be run by the CLOCK task * to, you guessed it, wake up the TTY to check if input or output can * continue. * * The valid messages and their parameters are: * * HARD_INT: output has been completed or input has arrived * DEV_READ: a process wants to read from a terminal * DEV_WRITE: a process wants to write on a terminal * DEV_IOCTL: a process wants to change a terminal's parameters * DEV_OPEN: a tty line has been opened * DEV_CLOSE: a tty line has been closed * CANCEL: terminate a previous incomplete system call immediately * * m_type TTY_LINE PROC_NR COUNT TTY_SPEK TTY_FLAGS ADDRESS * --------------------------------------------------------------------------- * | HARD_INT | | | | | | | * |-------------+---------+---------+---------+---------+---------+---------| * | DEV_READ |minor dev| proc nr | count | O_NONBLOCK| buf ptr | * |-------------+---------+---------+---------+---------+---------+---------| * | DEV_WRITE |minor dev| proc nr | count | | | buf ptr | * |-------------+---------+---------+---------+---------+---------+---------| * | DEV_IOCTL |minor dev| proc nr |func code|erase etc| flags | | * |-------------+---------+---------+---------+---------+---------+---------| * | DEV_OPEN |minor dev| proc nr | O_NOCTTY| | | | * |-------------+---------+---------+---------+---------+---------+---------| * | DEV_CLOSE |minor dev| proc nr | | | | | * |-------------+---------+---------+---------+---------+---------+---------| * | CANCEL |minor dev| proc nr | | | | | * --------------------------------------------------------------------------- */ #include "kernel.h" #include #if ENABLE_SRCCOMPAT || ENABLE_BINCOMPAT #include #endif #include #include #include #include #if (CHIP == INTEL) #include #endif #include "tty.h" #include "proc.h" /* Address of a tty structure. */ #define tty_addr(line) (&tty_table[line]) /* First minor numbers for the various classes of TTY devices. */ #define CONS_MINOR 0 #define LOG_MINOR 15 #define RS232_MINOR 16 #define TTYPX_MINOR 128 #define PTYPX_MINOR 192 /* Macros for magic tty types. */ #define isconsole(tp) ((tp) < tty_addr(NR_CONS)) /* Macros for magic tty structure pointers. */ #define FIRST_TTY tty_addr(0) #define END_TTY tty_addr(sizeof(tty_table) / sizeof(tty_table[0])) /* A device exists if at least its 'devread' function is defined. */ #define tty_active(tp) ((tp)->tty_devread != NULL) /* RS232 lines or pseudo terminals can be completely configured out. */ #if NR_RS_LINES == 0 #define rs_init(tp) ((void) 0) #endif #if NR_PTYS == 0 #define pty_init(tp) ((void) 0) #define do_pty(tp, mp) ((void) 0) #endif FORWARD _PROTOTYPE( void do_cancel, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void do_ioctl, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void do_open, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void do_close, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void do_read, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void do_write, (tty_t *tp, message *m_ptr) ); FORWARD _PROTOTYPE( void in_transfer, (tty_t *tp) ); FORWARD _PROTOTYPE( int echo, (tty_t *tp, int ch) ); FORWARD _PROTOTYPE( void rawecho, (tty_t *tp, int ch) ); FORWARD _PROTOTYPE( int back_over, (tty_t *tp) ); FORWARD _PROTOTYPE( void reprint, (tty_t *tp) ); FORWARD _PROTOTYPE( void dev_ioctl, (tty_t *tp) ); FORWARD _PROTOTYPE( void setattr, (tty_t *tp) ); FORWARD _PROTOTYPE( void tty_icancel, (tty_t *tp) ); FORWARD _PROTOTYPE( void tty_init, (tty_t *tp) ); FORWARD _PROTOTYPE( void settimer, (tty_t *tp, int on) ); #if ENABLE_SRCCOMPAT || ENABLE_BINCOMPAT FORWARD _PROTOTYPE( int compat_getp, (tty_t *tp, struct sgttyb *sg) ); FORWARD _PROTOTYPE( int compat_getc, (tty_t *tp, struct tchars *sg) ); FORWARD _PROTOTYPE( int compat_setp, (tty_t *tp, struct sgttyb *sg) ); FORWARD _PROTOTYPE( int compat_setc, (tty_t *tp, struct tchars *sg) ); FORWARD _PROTOTYPE( int tspd2sgspd, (speed_t tspd) ); FORWARD _PROTOTYPE( speed_t sgspd2tspd, (int sgspd) ); #if ENABLE_BINCOMPAT FORWARD _PROTOTYPE( void do_ioctl_compat, (tty_t *tp, message *m_ptr) ); #endif #endif /* Default attributes. */ PRIVATE struct termios termios_defaults = { TINPUT_DEF, TOUTPUT_DEF, TCTRL_DEF, TLOCAL_DEF, TSPEED_DEF, TSPEED_DEF, { TEOF_DEF, TEOL_DEF, TERASE_DEF, TINTR_DEF, TKILL_DEF, TMIN_DEF, TQUIT_DEF, TTIME_DEF, TSUSP_DEF, TSTART_DEF, TSTOP_DEF, TREPRINT_DEF, TLNEXT_DEF, TDISCARD_DEF, }, }; PRIVATE struct winsize winsize_defaults; /* = all zeroes */ /*===========================================================================* * tty_task * *===========================================================================*/ PUBLIC void tty_task() { /* Main routine of the terminal task. */ message tty_mess; /* buffer for all incoming messages */ register tty_t *tp; unsigned line; /* Initialize the terminal lines. */ for (tp = FIRST_TTY; tp < END_TTY; tp++) tty_init(tp); /* Display the Minix startup banner. */ printf("Minix %s.%s Copyright 2001 Prentice-Hall, Inc.\n\n", OS_RELEASE, OS_VERSION); #if (CHIP == INTEL) /* Real mode, or 16/32-bit protected mode? */ #if _WORD_SIZE == 4 printf("Executing in 32-bit protected mode\n\n"); #else printf("Executing in %s mode\n\n", protected_mode ? "16-bit protected" : "real"); #endif #endif while (TRUE) { /* Handle any events on any of the ttys. */ for (tp = FIRST_TTY; tp < END_TTY; tp++) { if (tp->tty_events) handle_events(tp); } receive(ANY, &tty_mess); /* A hardware interrupt is an invitation to check for events. */ if (tty_mess.m_type == HARD_INT) continue; /* Check the minor device number. */ line = tty_mess.TTY_LINE; if ((line - CONS_MINOR) < NR_CONS) { tp = tty_addr(line - CONS_MINOR); } else if (line == LOG_MINOR) { tp = tty_addr(0); } else if ((line - RS232_MINOR) < NR_RS_LINES) { tp = tty_addr(line - RS232_MINOR + NR_CONS); } else if ((line - TTYPX_MINOR) < NR_PTYS) { tp = tty_addr(line - TTYPX_MINOR + NR_CONS + NR_RS_LINES); } else if ((line - PTYPX_MINOR) < NR_PTYS) { tp = tty_addr(line - PTYPX_MINOR + NR_CONS + NR_RS_LINES); if (tty_mess.m_type != DEV_IOCTL) { do_pty(tp, &tty_mess); continue; } } else { tp = NULL; } /* If the device doesn't exist or is not configured return ENXIO. */ if (tp == NULL || !tty_active(tp)) { tty_reply(TASK_REPLY, tty_mess.m_source, tty_mess.PROC_NR, ENXIO); continue; } /* Execute the requested function. */ switch (tty_mess.m_type) { case DEV_READ: do_read(tp, &tty_mess); break; case DEV_WRITE: do_write(tp, &tty_mess); break; case DEV_IOCTL: do_ioctl(tp, &tty_mess); break; case DEV_OPEN: do_open(tp, &tty_mess); break; case DEV_CLOSE: do_close(tp, &tty_mess); break; case CANCEL: do_cancel(tp, &tty_mess); break; - -!-"-#-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-8-9-:-;-<-=->-?-@-A-B-C-D-E-F-G-H-I- default: tty_reply(TASK_REPLY, tty_mess.m_source, tty_mess.PROC_NR, EINVAL); } } } /*===========================================================================* * do_read * *===========================================================================*/ PRIVATE void do_read(tp, m_ptr) register tty_t *tp; /* pointer to tty struct */ message *m_ptr; /* pointer to message sent to the task */ { /* A process wants to read from a terminal. */ int r; /* Check if there is already a process hanging in a read, check if the * parameters are correct, do I/O. */ if (tp->tty_inleft > 0) { r = EIO; } else if (m_ptr->COUNT <= 0) { r = EINVAL; } else if (numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { r = EFAULT; } else { /* Copy information from the message to the tty struct. */ tp->tty_inrepcode = TASK_REPLY; tp->tty_incaller = m_ptr->m_source; tp->tty_inproc = m_ptr->PROC_NR; tp->tty_in_vir = (vir_bytes) m_ptr->ADDRESS; tp->tty_inleft = m_ptr->COUNT; if (!(tp->tty_termios.c_lflag & ICANON) && tp->tty_termios.c_cc[VTIME] > 0) { if (tp->tty_termios.c_cc[VMIN] == 0) { /* MIN & TIME specify a read timer that finishes the * read in TIME/10 seconds if no bytes are available. */ lock(); settimer(tp, TRUE); tp->tty_min = 1; unlock(); } else { /* MIN & TIME specify an inter-byte timer that may * have to be cancelled if there are no bytes yet. */ if (tp->tty_eotct == 0) { lock(); settimer(tp, FALSE); unlock(); tp->tty_min = tp->tty_termios.c_cc[VMIN]; } } } /* Anything waiting in the input buffer? Clear it out... */ in_transfer(tp); /* ...then go back for more */ handle_events(tp); if (tp->tty_inleft == 0) return; /* already done */ /* There were no bytes in the input queue available, so either suspend * the caller or break off the read if nonblocking. */ if (m_ptr->TTY_FLAGS & O_NONBLOCK) { r = EAGAIN; /* cancel the read */ tp->tty_inleft = tp->tty_incum = 0; } else { r = SUSPEND; /* suspend the caller */ tp->tty_inrepcode = REVIVE; } } tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*===========================================================================* * do_write * *===========================================================================*/ PRIVATE void do_write(tp, m_ptr) register tty_t *tp; register message *m_ptr; /* pointer to message sent to the task */ { /* A process wants to write on a terminal. */ int r; /* Check if there is already a process hanging in a write, check if the * parameters are correct, do I/O. */ if (tp->tty_outleft > 0) { r = EIO; } else if (m_ptr->COUNT <= 0) { r = EINVAL; } else if (numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, m_ptr->COUNT) == 0) { r = EFAULT; } else { /* Copy message parameters to the tty structure. */ tp->tty_outrepcode = TASK_REPLY; tp->tty_outcaller = m_ptr->m_source; tp->tty_outproc = m_ptr->PROC_NR; tp->tty_out_vir = (vir_bytes) m_ptr->ADDRESS; tp->tty_outleft = m_ptr->COUNT; /* Try to write. */ handle_events(tp); if (tp->tty_outleft == 0) return; /* already done */ /* None or not all the bytes could be written, so either suspend the * caller or break off the write if nonblocking. */ if (m_ptr->TTY_FLAGS & O_NONBLOCK) { /* cancel the write */ r = tp->tty_outcum > 0 ? tp->tty_outcum : EAGAIN; tp->tty_outleft = tp->tty_outcum = 0; } else { r = SUSPEND; /* suspend the caller */ tp->tty_outrepcode = REVIVE; } } tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*===========================================================================* * do_ioctl * *===========================================================================*/ PRIVATE void do_ioctl(tp, m_ptr) register tty_t *tp; message *m_ptr; /* pointer to message sent to task */ { /* Perform an IOCTL on this terminal. Posix termios calls are handled * by the IOCTL system call */ int r; union { int i; #if ENABLE_SRCCOMPAT struct sgttyb sg; struct tchars tc; #endif } param; phys_bytes user_phys; size_t size; /* Size of the ioctl parameter. */ switch (m_ptr->TTY_REQUEST) { case TCGETS: /* Posix tcgetattr function */ case TCSETS: /* Posix tcsetattr function, TCSANOW option */ case TCSETSW: /* Posix tcsetattr function, TCSADRAIN option */ case TCSETSF: /* Posix tcsetattr function, TCSAFLUSH option */ size = sizeof(struct termios); break; case TCSBRK: /* Posix tcsendbreak function */ case TCFLOW: /* Posix tcflow function */ case TCFLSH: /* Posix tcflush function */ case TIOCGPGRP: /* Posix tcgetpgrp function */ case TIOCSPGRP: /* Posix tcsetpgrp function */ size = sizeof(int); break; case TIOCGWINSZ: /* get window size (not Posix) */ case TIOCSWINSZ: /* set window size (not Posix) */ size = sizeof(struct winsize); break; #if ENABLE_SRCCOMPAT case TIOCGETP: /* BSD-style get terminal properties */ case TIOCSETP: /* BSD-style set terminal properties */ size = sizeof(struct sgttyb); break; case TIOCGETC: /* BSD-style get terminal special characters */ case TIOCSETC: /* BSD-style get terminal special characters */ size = sizeof(struct tchars); break; #endif #if (MACHINE == IBM_PC) case KIOCSMAP: /* load keymap (Minix extension) */ size = sizeof(keymap_t); break; case TIOCSFON: /* load font (Minix extension) */ size = sizeof(u8_t [8192]); break; #endif case TCDRAIN: /* Posix tcdrain function -- no parameter */ default: size = 0; } if (size != 0) { user_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, size); if (user_phys == 0) { tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, EFAULT); return; } } r = OK; switch (m_ptr->TTY_REQUEST) { case TCGETS: /* Get the termios attributes. */ phys_copy(vir2phys(&tp->tty_termios), user_phys, (phys_bytes) size); break; case TCSETSW: case TCSETSF: case TCDRAIN: if (tp->tty_outleft > 0) { /* Wait for all ongoing output processing to finish. */ tp->tty_iocaller = m_ptr->m_source; tp->tty_ioproc = m_ptr->PROC_NR; tp->tty_ioreq = m_ptr->REQUEST; tp->tty_iovir = (vir_bytes) m_ptr->ADDRESS; r = SUSPEND; break; } if (m_ptr->TTY_REQUEST == TCDRAIN) break; if (m_ptr->TTY_REQUEST == TCSETSF) tty_icancel(tp); /*FALL THROUGH*/ case TCSETS: /* Set the termios attributes. */ phys_copy(user_phys, vir2phys(&tp->tty_termios), (phys_bytes) size); setattr(tp); break; case TCFLSH: phys_copy(user_phys, vir2phys(¶m.i), (phys_bytes) size); switch (param.i) { case TCIFLUSH: tty_icancel(tp); break; case TCOFLUSH: (*tp->tty_ocancel)(tp); break; case TCIOFLUSH: tty_icancel(tp); (*tp->tty_ocancel)(tp);break; default: r = EINVAL; } break; case TCFLOW: phys_copy(user_phys, vir2phys(¶m.i), (phys_bytes) size); switch (param.i) { case TCOOFF: case TCOON: tp->tty_inhibited = (param.i == TCOOFF); tp->tty_events = 1; break; case TCIOFF: (*tp->tty_echo)(tp, tp->tty_termios.c_cc[VSTOP]); break; case TCION: (*tp->tty_echo)(tp, tp->tty_termios.c_cc[VSTART]); break; default: r = EINVAL; } break; case TCSBRK: if (tp->tty_break != NULL) (*tp->tty_break)(tp); break; case TIOCGWINSZ: phys_copy(vir2phys(&tp->tty_winsize), user_phys, (phys_bytes) size); break; case TIOCSWINSZ: phys_copy(user_phys, vir2phys(&tp->tty_winsize), (phys_bytes) size); /* SIGWINCH... */ break; #if ENABLE_SRCCOMPAT case TIOCGETP: compat_getp(tp, ¶m.sg); phys_copy(vir2phys(¶m.sg), user_phys, (phys_bytes) size); break; case TIOCSETP: phys_copy(user_phys, vir2phys(¶m.sg), (phys_bytes) size); compat_setp(tp, ¶m.sg); break; case TIOCGETC: compat_getc(tp, ¶m.tc); phys_copy(vir2phys(¶m.tc), user_phys, (phys_bytes) size); break; case TIOCSETC: phys_copy(user_phys, vir2phys(¶m.tc), (phys_bytes) size); compat_setc(tp, ¶m.tc); break; #endif #if (MACHINE == IBM_PC) case KIOCSMAP: /* Load a new keymap (only /dev/console). */ if (isconsole(tp)) r = kbd_loadmap(user_phys); break; case TIOCSFON: /* Load a font into an EGA or VGA card (hs@hck.hr) */ if (isconsole(tp)) r = con_loadfont(user_phys); break; #endif #if (MACHINE == ATARI) case VDU_LOADFONT: r = vdu_loadfont(m_ptr); break; #endif /* These Posix functions are allowed to fail if _POSIX_JOB_CONTROL is * not defined. */ case TIOCGPGRP: case TIOCSPGRP: default: #if ENABLE_BINCOMPAT do_ioctl_compat(tp, m_ptr); return; #else r = ENOTTY; #endif } /* Send the reply. */ tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*===========================================================================* * do_open * *===========================================================================*/ PRIVATE void do_open(tp, m_ptr) register tty_t *tp; message *m_ptr; /* pointer to message sent to task */ { /* A tty line has been opened. Make it the callers controlling tty if * O_NOCTTY is *not* set and it is not the log device. 1 is returned if * the tty is made the controlling tty, otherwise OK or an error code. */ int r = OK; if (m_ptr->TTY_LINE == LOG_MINOR) { /* The log device is a write-only diagnostics device. */ if (m_ptr->COUNT & R_BIT) r = EACCES; } else { if (!(m_ptr->COUNT & O_NOCTTY)) { tp->tty_pgrp = m_ptr->PROC_NR; r = 1; } tp->tty_openct++; } tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, r); } /*===========================================================================* * do_close * *===========================================================================*/ PRIVATE void do_close(tp, m_ptr) register tty_t *tp; message *m_ptr; /* pointer to message sent to task */ { /* A tty line has been closed. Clean up the line if it is the last close. */ if (m_ptr->TTY_LINE != LOG_MINOR && --tp->tty_openct == 0) { tp->tty_pgrp = 0; tty_icancel(tp); (*tp->tty_ocancel)(tp); (*tp->tty_close)(tp); tp->tty_termios = termios_defaults; tp->tty_winsize = winsize_defaults; setattr(tp); } tty_reply(TASK_REPLY, m_ptr->m_source, m_ptr->PROC_NR, OK); } /*===========================================================================* * do_cancel * *===========================================================================*/ PRIVATE void do_cancel(tp, m_ptr) register tty_t *tp; message *m_ptr; /* pointer to message sent to task */ { /* A signal has been sent to a process that is hanging trying to read or write. * The pending read or write must be finished off immediately. */ int proc_nr; int mode; /* Check the parameters carefully, to avoid cancelling twice. */ proc_nr = m_ptr->PROC_NR; mode = m_ptr->COUNT; if ((mode & R_BIT) && tp->tty_inleft != 0 && proc_nr == tp->tty_inproc) { /* Process was reading when killed. Clean up input. */ tty_icancel(tp); tp->tty_inleft = tp->tty_incum = 0; } if ((mode & W_BIT) && tp->tty_outleft != 0 && proc_nr == tp->tty_outproc) { /* Process was writing when killed. Clean up output. */ (*tp->tty_ocancel)(tp); tp->tty_outleft = tp->tty_outcum = 0; } if (tp->tty_ioreq != 0 && proc_nr == tp->tty_ioproc) { /* Process was waiting for output to drain. */ tp->tty_ioreq = 0; } tp->tty_events = 1; tty_reply(TASK_REPLY, m_ptr->m_source, proc_nr, EINTR); } /*===========================================================================* * handle_events * *===========================================================================*/ PUBLIC void handle_events(tp) tty_t *tp; /* TTY to check for events. */ { /* Handle any events pending on a TTY. These events are usually device * interrupts. * * Two kinds of events are prominent: * - a character has been received from the console or an RS232 line. * - an RS232 line has completed a write request (on behalf of a user). * The interrupt handler may delay the interrupt message at its discretion * to avoid swamping the TTY task. Messages may be overwritten when the * lines are fast or when there are races between different lines, input * and output, because MINIX only provides single buffering for interrupt * messages (in proc.c). This is handled by explicitly checking each line * for fresh input and completed output on each interrupt. */ char *buf; unsigned count; do { tp->tty_events = 0; /* Read input and perform input processing. */ (*tp->tty_devread)(tp); /* Perform output processing and write output. */ (*tp->tty_devwrite)(tp); /* Ioctl waiting for some event? */ if (tp->tty_ioreq != 0) dev_ioctl(tp); } while (tp->tty_events); /* Transfer characters from the input queue to a waiting process. */ in_transfer(tp); /* Reply if enough bytes are available. */ if (tp->tty_incum >= tp->tty_min && tp->tty_inleft > 0) { tty_reply(tp->tty_inrepcode, tp->tty_incaller, tp->tty_inproc, tp->tty_incum); tp->tty_inleft = tp->tty_incum = 0; } } /*===========================================================================* * in_transfer * *===========================================================================*/ PRIVATE void in_transfer(tp) register tty_t *tp; /* pointer to terminal to read from */ { /* Transfer bytes from the input queue to a process reading from a terminal. */ int ch; int count; phys_bytes buf_phys, user_base; char buf[64], *bp; /* Force read to succeed if the line is hung up, looks like EOF to reader. */ if (tp->tty_termios.c_ospeed == B0) tp->tty_min = 0; /* Anything to do? */ if (tp->tty_inleft == 0 || tp->tty_eotct < tp->tty_min) return; buf_phys = vir2phys(buf); user_base = proc_vir2phys(proc_addr(tp->tty_inproc), 0); bp = buf; while (tp->tty_inleft > 0 && tp->tty_eotct > 0) { ch = *tp->tty_intail; if (!(ch & IN_EOF)) { /* One character to be delivered to the user. */ *bp = ch & IN_CHAR; tp->tty_inleft--; if (++bp == bufend(buf)) { /* Temp buffer full, copy to user space. */ phys_copy(buf_phys, user_base + tp->tty_in_vir, (phys_bytes) buflen(buf)); tp->tty_in_vir += buflen(buf); tp->tty_incum += buflen(buf); bp = buf; } } /* Remove the character from the input queue. */ if (++tp->tty_intail == bufend(tp->tty_inbuf)) tp->tty_intail = tp->tty_inbuf; tp->tty_incount--; if (ch & IN_EOT) { tp->tty_eotct--; /* Don't read past a line break in canonical mode. */ if (tp->tty_termios.c_lflag & ICANON) tp->tty_inleft = 0; } } if (bp > buf) { /* Leftover characters in the buffer. */ count = bp - buf; phys_copy(buf_phys, user_base + tp->tty_in_vir, (phys_bytes) count); tp->tty_in_vir += count; tp->tty_incum += count; } /* Usually reply to the reader, possibly even if incum == 0 (EOF). */ if (tp->tty_inleft == 0) { tty_reply(tp->tty_inrepcode, tp->tty_incaller, tp->tty_inproc, tp->tty_incum); tp->tty_inleft = tp->tty_incum = 0; } } /*===========================================================================* * in_process * *===========================================================================*/ PUBLIC int in_process(tp, buf, count) register tty_t *tp; /* terminal on which character has arrived */ char *buf; /* buffer with input characters */ int count; /* number of input characters */ { /* Characters have just been typed in. Process, save, and echo them. Return * the number of characters processed. */ int ch, sig, ct; int timeset = FALSE; static unsigned char csize_mask[] = { 0x1F, 0x3F, 0x7F, 0xFF }; for (ct = 0; ct < count; ct++) { /* Take one character. */ ch = *buf++ & BYTE; /* Strip to seven bits? */ if (tp->tty_termios.c_iflag & ISTRIP) ch &= 0x7F; /* Input extensions? */ if (tp->tty_termios.c_lflag & IEXTEN) { /* Previous character was a character escape? */ if (tp->tty_escaped) { tp->tty_escaped = NOT_ESCAPED; ch |= IN_ESC; /* protect character */ } /* LNEXT (^V) to escape the next character? */ if (ch == tp->tty_termios.c_cc[VLNEXT]) { tp->tty_escaped = ESCAPED; rawecho(tp, '^'); rawecho(tp, '\b'); continue; /* do not store the escape */ } /* REPRINT (^R) to reprint echoed characters? */ if (ch == tp->tty_termios.c_cc[VREPRINT]) { reprint(tp); continue; } } /* _POSIX_VDISABLE is a normal character value, so better escape it. */ if (ch == _POSIX_VDISABLE) ch |= IN_ESC; /* Map CR to LF, ignore CR, or map LF to CR. */ if (ch == '\r') { if (tp->tty_termios.c_iflag & IGNCR) continue; if (tp->tty_termios.c_iflag & ICRNL) ch = '\n'; } else if (ch == '\n') { if (tp->tty_termios.c_iflag & INLCR) ch = '\r'; } /* Canonical mode? */ if (tp->tty_termios.c_lflag & ICANON) { /* Erase processing (rub out of last character). */ if (ch == tp->tty_termios.c_cc[VERASE]) { (void) back_over(tp); if (!(tp->tty_termios.c_lflag & ECHOE)) { (void) echo(tp, ch); } continue; } /* Kill processing (remove current line). */ if (ch == tp->tty_termios.c_cc[VKILL]) { while (back_over(tp)) {} if (!(tp->tty_termios.c_lflag & ECHOE)) { (void) echo(tp, ch); if (tp->tty_termios.c_lflag & ECHOK) rawecho(tp, '\n'); } continue; } /* EOF (^D) means end-of-file, an invisible "line break". */ if (ch == tp->tty_termios.c_cc[VEOF]) ch |= IN_EOT | IN_EOF; /* The line may be returned to the user after an LF. */ if (ch == '\n') ch |= IN_EOT; /* Same thing with EOL, whatever it may be. */ if (ch == tp->tty_termios.c_cc[VEOL]) ch |= IN_EOT; } /* Start/stop input control? */ if (tp->tty_termios.c_iflag & IXON) { /* Output stops on STOP (^S). */ if (ch == tp->tty_termios.c_cc[VSTOP]) { tp->tty_inhibited = STOPPED; tp->tty_events = 1; continue; } /* Output restarts on START (^Q) or any character if IXANY. */ if (tp->tty_inhibited) { if (ch == tp->tty_termios.c_cc[VSTART] || (tp->tty_termios.c_iflag & IXANY)) { tp->tty_inhibited = RUNNING; tp->tty_events = 1; if (ch == tp->tty_termios.c_cc[VSTART]) continue; } } } if (tp->tty_termios.c_lflag & ISIG) { /* Check for INTR (^?) and QUIT (^\) characters. */ if (ch == tp->tty_termios.c_cc[VINTR] || ch == tp->tty_termios.c_cc[VQUIT]) { sig = SIGINT; if (ch == tp->tty_termios.c_cc[VQUIT]) sig = SIGQUIT; sigchar(tp, sig); (void) echo(tp, ch); continue; } } /* Is there space in the input buffer? */ if (tp->tty_incount == buflen(tp->tty_inbuf)) { /* No space; discard in canonical mode, keep in raw mode. */ if (tp->tty_termios.c_lflag & ICANON) continue; break; } if (!(tp->tty_termios.c_lflag & ICANON)) { /* In raw mode all characters are "line breaks". */ ch |= IN_EOT; /* Start an inter-byte timer? */ if (!timeset && tp->tty_termios.c_cc[VMIN] > 0 && tp->tty_termios.c_cc[VTIME] > 0) { lock(); settimer(tp, TRUE); unlock(); timeset = TRUE; } } /* Perform the intricate function of echoing. */ if (tp->tty_termios.c_lflag & (ECHO|ECHONL)) ch = echo(tp, ch); /* Save the character in the input queue. */ *tp->tty_inhead++ = ch; if (tp->tty_inhead == bufend(tp->tty_inbuf)) tp->tty_inhead = tp->tty_inbuf; tp->tty_incount++; if (ch & IN_EOT) tp->tty_eotct++; /* Try to finish input if the queue threatens to overflow. */ if (tp->tty_incount == buflen(tp->tty_inbuf)) in_transfer(tp); } return ct; } /*===========================================================================* * echo * *===========================================================================*/ PRIVATE int echo(tp, ch) register tty_t *tp; /* terminal on which to echo */ register int ch; /* pointer to character to echo */ { /* Echo the character if echoing is on. Some control characters are echoed * with their normal effect, other control characters are echoed as "^X", * normal characters are echoed normally. EOF (^D) is echoed, but immediately * backspaced over. Return the character with the echoed length added to its * attributes. */ int len, rp; ch &= ~IN_LEN; if (!(tp->tty_termios.c_lflag & ECHO)) { if (ch == ('\n' | IN_EOT) && (tp->tty_termios.c_lflag & (ICANON|ECHONL)) == (ICANON|ECHONL)) (*tp->tty_echo)(tp, '\n'); return(ch); } /* "Reprint" tells if the echo output has been messed up by other output. */ rp = tp->tty_incount == 0 ? FALSE : tp->tty_reprint; if ((ch & IN_CHAR) < ' ') { switch (ch & (IN_ESC|IN_EOF|IN_EOT|IN_CHAR)) { case '\t': len = 0; do { (*tp->tty_echo)(tp, ' '); len++; } while (len < TAB_SIZE && (tp->tty_position & TAB_MASK) != 0); break; case '\r' | IN_EOT: case '\n' | IN_EOT: (*tp->tty_echo)(tp, ch & IN_CHAR); len = 0; break; default: (*tp->tty_echo)(tp, '^'); (*tp->tty_echo)(tp, '@' + (ch & IN_CHAR)); len = 2; } } else if ((ch & IN_CHAR) == '\177') { /* A DEL prints as "^?". */ (*tp->tty_echo)(tp, '^'); (*tp->tty_echo)(tp, '?'); len = 2; } else { (*tp->tty_echo)(tp, ch & IN_CHAR); len = 1; } if (ch & IN_EOF) while (len > 0) { (*tp->tty_echo)(tp, '\b'); len--; } tp->tty_reprint = rp; return(ch | (len << IN_LSHIFT)); } /*==========================================================================* * rawecho * *==========================================================================*/ PRIVATE void rawecho(tp, ch) register tty_t *tp; int ch; { /* Echo without interpretation if ECHO is set. */ int rp = tp->tty_reprint; if (tp->tty_termios.c_lflag & ECHO) (*tp->tty_echo)(tp, ch); tp->tty_reprint = rp; } /*==========================================================================* * back_over * *==========================================================================*/ PRIVATE int back_over(tp) register tty_t *tp; { /* Backspace to previous character on screen and erase it. */ u16_t *head; int len; if (tp->tty_incount == 0) return(0); /* queue empty */ head = tp->tty_inhead; if (head == tp->tty_inbuf) head = bufend(tp->tty_inbuf); if (*--head & IN_EOT) return(0); /* can't erase "line breaks" */ if (tp->tty_reprint) reprint(tp); /* reprint if messed up */ tp->tty_inhead = head; tp->tty_incount--; if (tp->tty_termios.c_lflag & ECHOE) { len = (*head & IN_LEN) >> IN_LSHIFT; while (len > 0) { rawecho(tp, '\b'); rawecho(tp, ' '); rawecho(tp, '\b'); len--; } } return(1); /* one character erased */ } /*==========================================================================* * reprint * *==========================================================================*/ PRIVATE void reprint(tp) register tty_t *tp; /* pointer to tty struct */ { /* Restore what has been echoed to screen before if the user input has been * messed up by output, or if REPRINT (^R) is typed. */ int count; u16_t *head; tp->tty_reprint = FALSE; /* Find the last line break in the input. */ head = tp->tty_inhead; count = tp->tty_incount; while (count > 0) { if (head == tp->tty_inbuf) head = bufend(tp->tty_inbuf); if (head[-1] & IN_EOT) break; head--; count--; } if (count == tp->tty_incount) return; /* no reason to reprint */ /* Show REPRINT (^R) and move to a new line. */ (void) echo(tp, tp->tty_termios.c_cc[VREPRINT] | IN_ESC); rawecho(tp, '\r'); rawecho(tp, '\n'); /* Reprint from the last break onwards. */ do { if (head == bufend(tp->tty_inbuf)) head = tp->tty_inbuf; *head = echo(tp, *head); head++; count++; } while (count < tp->tty_incount); } /*==========================================================================* * out_process * *==========================================================================*/ PUBLIC void out_process(tp, bstart, bpos, bend, icount, ocount) tty_t *tp; char *bstart, *bpos, *bend; /* start/pos/end of circular buffer */ int *icount; /* # input chars / input chars used */ int *ocount; /* max output chars / output chars used */ { /* Perform output processing on a circular buffer. *icount is the number of * bytes to process, and the number of bytes actually processed on return. * *ocount is the space available on input and the space used on output. * (Naturally *icount < *ocount.) The column position is updated modulo * the TAB size, because we really only need it for tabs. */ int tablen; int ict = *icount; int oct = *ocount; int pos = tp->tty_position; while (ict > 0) { switch (*bpos) { case '\7': break; case '\b': pos--; break; case '\r': pos = 0; break; case '\n': if ((tp->tty_termios.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) { /* Map LF to CR+LF if there is space. Note that the * next character in the buffer is overwritten, so * we stop at this point. */ if (oct >= 2) { *bpos = '\r'; if (++bpos == bend) bpos = bstart; *bpos = '\n'; pos = 0; ict--; oct -= 2; } goto out_done; /* no space or buffer got changed */ } break; case '\t': /* Best guess for the tab length. */ tablen = TAB_SIZE - (pos & TAB_MASK); if ((tp->tty_termios.c_oflag & (OPOST|XTABS)) == (OPOST|XTABS)) { /* Tabs must be expanded. */ if (oct >= tablen) { pos += tablen; ict--; oct -= tablen; do { *bpos = ' '; if (++bpos == bend) bpos = bstart; } while (--tablen != 0); } goto out_done; } /* Tabs are output directly. */ pos += tablen; break; default: /* Assume any other character prints as one character. */ pos++; } if (++bpos == bend) bpos = bstart; ict--; oct--; } out_done: tp->tty_position = pos & TAB_MASK; *icount -= ict; /* [io]ct are the number of chars not used */ *ocount -= oct; /* *[io]count are the number of chars that are used */ } /*===========================================================================* * dev_ioctl * *===========================================================================*/ PRIVATE void dev_ioctl(tp) tty_t *tp; { /* The ioctl's TCSETSW, TCSETSF and TCDRAIN wait for output to finish to make * sure that an attribute change doesn't affect the processing of current * output. Once output finishes the ioctl is executed as in do_ioctl(). */ phys_bytes user_phys; if (tp->tty_outleft > 0) return; /* output not finished */ if (tp->tty_ioreq != TCDRAIN) { if (tp->tty_ioreq == TCSETSF) tty_icancel(tp); user_phys = proc_vir2phys(proc_addr(tp->tty_ioproc), tp->tty_iovir); phys_copy(user_phys, vir2phys(&tp->tty_termios), (phys_bytes) sizeof(tp->tty_termios)); setattr(tp); } tp->tty_ioreq = 0; tty_reply(REVIVE, tp->tty_iocaller, tp->tty_ioproc, OK); } /*===========================================================================* * setattr * *===========================================================================*/ PRIVATE void setattr(tp) tty_t *tp; { /* Apply the new line attributes (raw/canonical, line speed, etc.) */ u16_t *inp; int count; if (!(tp->tty_termios.c_lflag & ICANON)) { /* Raw mode; put a "line break" on all characters in the input queue. * It is undefined what happens to the input queue when ICANON is * switched off, a process should use TCSAFLUSH to flush the queue. * Keeping the queue to preserve typeahead is the Right Thing, however * when a process does use TCSANOW to switch to raw mode. */ count = tp->tty_eotct = tp->tty_incount; inp = tp->tty_intail; while (count > 0) { *inp |= IN_EOT; if (++inp == bufend(tp->tty_inbuf)) inp = tp->tty_inbuf; --count; } } /* Inspect MIN and TIME. */ lock(); settimer(tp, FALSE); unlock(); if (tp->tty_termios.c_lflag & ICANON) { /* No MIN & TIME in canonical mode. */ tp->tty_min = 1; } else { /* In raw mode MIN is the number of chars wanted, and TIME how long * to wait for them. With interesting exceptions if either is zero. */ tp->tty_min = tp->tty_termios.c_cc[VMIN]; if (tp->tty_min == 0 && tp->tty_termios.c_cc[VTIME] > 0) tp->tty_min = 1; } if (!(tp->tty_termios.c_iflag & IXON)) { /* No start/stop output control, so don't leave output inhibited. */ tp->tty_inhibited = RUNNING; tp->tty_events = 1; } /* Setting the output speed to zero hangs up the phone. */ if (tp->tty_termios.c_ospeed == B0) sigchar(tp, SIGHUP); /* Set new line speed, character size, etc at the device level. */ (*tp->tty_ioctl)(tp); } /*===========================================================================* * tty_reply * *===========================================================================*/ PUBLIC void tty_reply(code, replyee, proc_nr, status) int code; /* TASK_REPLY or REVIVE */ int replyee; /* destination address for the reply */ int proc_nr; /* to whom should the reply go? */ int status; /* reply code */ { /* Send a reply to a process that wanted to read or write data. */ message tty_mess; tty_mess.m_type = code; tty_mess.REP_PROC_NR = proc_nr; tty_mess.REP_STATUS = status; if ((status = send(replyee, &tty_mess)) != OK) panic("tty_reply failed, status\n", status); } /*===========================================================================* * sigchar * *===========================================================================*/ PUBLIC void sigchar(tp, sig) register tty_t *tp; int sig; /* SIGINT, SIGQUIT, SIGKILL or SIGHUP */ { /* Process a SIGINT, SIGQUIT or SIGKILL char from the keyboard or SIGHUP from * a tty close, "stty 0", or a real RS-232 hangup. MM will send the signal to * the process group (INT, QUIT), all processes (KILL), or the session leader * (HUP). */ if (tp->tty_pgrp != 0) cause_sig(tp->tty_pgrp, sig); if (!(tp->tty_termios.c_lflag & NOFLSH)) { tp->tty_incount = tp->tty_eotct = 0; /* kill earlier input */ tp->tty_intail = tp->tty_inhead; (*tp->tty_ocancel)(tp); /* kill all output */ tp->tty_inhibited = RUNNING; tp->tty_events = 1; } } /*==========================================================================* * tty_icancel * *==========================================================================*/ PRIVATE void tty_icancel(tp) register tty_t *tp; { /* Discard all pending input, tty buffer or device. */ tp->tty_incount = tp->tty_eotct = 0; tp->tty_intail = tp->tty_inhead; (*tp->tty_icancel)(tp); } /*==========================================================================* * tty_init * *==========================================================================*/ PRIVATE void tty_init(tp) tty_t *tp; /* TTY line to initialize. */ { /* Initialize tty structure and call device initialization routines. */ tp->tty_intail = tp->tty_inhead = tp->tty_inbuf; tp->tty_min = 1; tp->tty_termios = termios_defaults; tp->tty_icancel = tp->tty_ocancel = tp->tty_ioctl = tp->tty_close = tty_devnop; if (tp < tty_addr(NR_CONS)) { scr_init(tp); } else if (tp < tty_addr(NR_CONS+NR_RS_LINES)) { rs_init(tp); } else { pty_init(tp); } } /*==========================================================================* * tty_wakeup * *==========================================================================*/ PUBLIC void tty_wakeup(now) clock_t now; /* current time */ { /* Wake up TTY when something interesting is happening on one of the terminal * lines, like a character arriving on an RS232 line, a key being typed, or * a timer on a line expiring by TIME. */ tty_t *tp; /* Scan the timerlist for expired timers and compute the next timeout time. */ tty_timeout = TIME_NEVER; while ((tp = tty_timelist) != NULL) { if (tp->tty_time > now) { tty_timeout = tp->tty_time; /* this timer is next */ break; } tp->tty_min = 0; /* force read to succeed */ tp->tty_events = 1; tty_timelist = tp->tty_timenext; } /* Let TTY know there is something afoot. */ interrupt(TTY); } /*===========================================================================* * settimer * *===========================================================================*/ PRIVATE void settimer(tp, on) tty_t *tp; /* line to set or unset a timer on */ int on; /* set timer if true, otherwise unset */ { /* Set or unset a TIME inspired timer. This function is interrupt sensitive * due to tty_wakeup(), so it must be called from within lock()/unlock(). */ tty_t **ptp; /* Take tp out of the timerlist if present. */ for (ptp = &tty_timelist; *ptp != NULL; ptp = &(*ptp)->tty_timenext) { if (tp == *ptp) { *ptp = tp->tty_timenext; /* take tp out of the list */ break; } } if (!on) return; /* unsetting it is enough */ /* Timeout occurs TIME deciseconds from now. */ tp->tty_time = get_uptime() + tp->tty_termios.c_cc[VTIME] * (HZ/10); /* Find a new place in the list. */ for (ptp = &tty_timelist; *ptp != NULL; ptp = &(*ptp)->tty_timenext) { if (tp->tty_time <= (*ptp)->tty_time) break; } tp->tty_timenext = *ptp; *ptp = tp; if (tp->tty_time < tty_timeout) tty_timeout = tp->tty_time; } /*==========================================================================* * tty_devnop * *==========================================================================*/ PUBLIC void tty_devnop(tp) tty_t *tp; { /* Some functions need not be implemented at the device level. */ } #if ENABLE_SRCCOMPAT || ENABLE_BINCOMPAT /*===========================================================================* * compat_getp * *===========================================================================*/ PRIVATE int compat_getp(tp, sg) tty_t *tp; struct sgttyb *sg; { /* Translate an old TIOCGETP to the termios equivalent. */ int flgs; sg->sg_erase = tp->tty_termios.c_cc[VERASE]; sg->sg_kill = tp->tty_termios.c_cc[VKILL]; sg->sg_ospeed = tspd2sgspd(cfgetospeed(&tp->tty_termios)); sg->sg_ispeed = tspd2sgspd(cfgetispeed(&tp->tty_termios)); flgs = 0; /* XTABS - if OPOST and XTABS */ if ((tp->tty_termios.c_oflag & (OPOST|XTABS)) == (OPOST|XTABS)) flgs |= 0006000; /* BITS5..BITS8 - map directly to CS5..CS8 */ flgs |= (tp->tty_termios.c_cflag & CSIZE) << (8-2); /* EVENP - if PARENB and not PARODD */ if ((tp->tty_termios.c_cflag & (PARENB|PARODD)) == PARENB) flgs |= 0000200; /* ODDP - if PARENB and PARODD */ if ((tp->tty_termios.c_cflag & (PARENB|PARODD)) == (PARENB|PARODD)) flgs |= 0000100; /* RAW - if not ICANON and not ISIG */ if (!(tp->tty_termios.c_lflag & (ICANON|ISIG))) flgs |= 0000040; /* CRMOD - if ICRNL */ if (tp->tty_termios.c_iflag & ICRNL) flgs |= 0000020; /* ECHO - if ECHO */ if (tp->tty_termios.c_lflag & ECHO) flgs |= 0000010; /* CBREAK - if not ICANON and ISIG */ if ((tp->tty_termios.c_lflag & (ICANON|ISIG)) == ISIG) flgs |= 0000002; sg->sg_flags = flgs; return(OK); } /*===========================================================================* * compat_getc * *===========================================================================*/ PRIVATE int compat_getc(tp, tc) tty_t *tp; struct tchars *tc; { /* Translate an old TIOCGETC to the termios equivalent. */ tc->t_intrc = tp->tty_termios.c_cc[VINTR]; tc->t_quitc = tp->tty_termios.c_cc[VQUIT]; tc->t_startc = tp->tty_termios.c_cc[VSTART]; tc->t_stopc = tp->tty_termios.c_cc[VSTOP]; tc->t_brkc = tp->tty_termios.c_cc[VEOL]; tc->t_eofc = tp->tty_termios.c_cc[VEOF]; return(OK); } /*===========================================================================* * compat_setp * *===========================================================================*/ PRIVATE int compat_setp(tp, sg) tty_t *tp; struct sgttyb *sg; { /* Translate an old TIOCSETP to the termios equivalent. */ struct termios termios; int flags; termios = tp->tty_termios; termios.c_cc[VERASE] = sg->sg_erase; termios.c_cc[VKILL] = sg->sg_kill; cfsetispeed(&termios, sgspd2tspd(sg->sg_ispeed & BYTE)); cfsetospeed(&termios, sgspd2tspd(sg->sg_ospeed & BYTE)); flags = sg->sg_flags; /* Input flags */ /* BRKINT - not changed */ /* ICRNL - set if CRMOD is set and not RAW */ /* (CRMOD also controls output) */ termios.c_iflag &= ~ICRNL; if ((flags & 0000020) && !(flags & 0000040)) termios.c_iflag |= ICRNL; /* IGNBRK - not changed */ /* IGNCR - forced off (ignoring cr's is not supported) */ termios.c_iflag &= ~IGNCR; /* IGNPAR - not changed */ /* INLCR - forced off (mapping nl's to cr's is not supported) */ termios.c_iflag &= ~INLCR; /* INPCK - not changed */ /* ISTRIP - not changed */ /* IXOFF - not changed */ /* IXON - forced on if not RAW */ termios.c_iflag &= ~IXON; if (!(flags & 0000040)) termios.c_iflag |= IXON; /* PARMRK - not changed */ /* Output flags */ /* OPOST - forced on if not RAW */ termios.c_oflag &= ~OPOST; if (!(flags & 0000040)) termios.c_oflag |= OPOST; /* ONLCR - forced on if CRMOD */ termios.c_oflag &= ~ONLCR; if (flags & 0000020) termios.c_oflag |= ONLCR; /* XTABS - forced on if XTABS */ termios.c_oflag &= ~XTABS; if (flags & 0006000) termios.c_oflag |= XTABS; /* CLOCAL - not changed */ /* CREAD - forced on (receiver is always enabled) */ termios.c_cflag |= CREAD; /* CSIZE - CS5-CS8 correspond directly to BITS5-BITS8 */ termios.c_cflag = (termios.c_cflag & ~CSIZE) | ((flags & 0001400) >> (8-2)); /* CSTOPB - not changed */ /* HUPCL - not changed */ /* PARENB - set if EVENP or ODDP is set */ termios.c_cflag &= ~PARENB; if (flags & (0000200|0000100)) termios.c_cflag |= PARENB; /* PARODD - set if ODDP is set */ termios.c_cflag &= ~PARODD; if (flags & 0000100) termios.c_cflag |= PARODD; /* Local flags */ /* ECHO - set if ECHO is set */ termios.c_lflag &= ~ECHO; if (flags & 0000010) termios.c_lflag |= ECHO; /* ECHOE - not changed */ /* ECHOK - not changed */ /* ECHONL - not changed */ /* ICANON - set if neither CBREAK nor RAW */ termios.c_lflag &= ~ICANON; if (!(flags & (0000002|0000040))) termios.c_lflag |= ICANON; /* IEXTEN - set if not RAW */ /* ISIG - set if not RAW */ termios.c_lflag &= ~(IEXTEN|ISIG); if (!(flags & 0000040)) termios.c_lflag |= (IEXTEN|ISIG); /* NOFLSH - not changed */ /* TOSTOP - not changed */ tp->tty_termios = termios; setattr(tp); return(OK); } /*===========================================================================* * compat_setc * *===========================================================================*/ PRIVATE int compat_setc(tp, tc) tty_t *tp; struct tchars *tc; { /* Translate an old TIOCSETC to the termios equivalent. */ struct termios termios; termios = tp->tty_termios; termios.c_cc[VINTR] = tc->t_intrc; termios.c_cc[VQUIT] = tc->t_quitc; termios.c_cc[VSTART] = tc->t_startc; termios.c_cc[VSTOP] = tc->t_stopc; termios.c_cc[VEOL] = tc->t_brkc; termios.c_cc[VEOF] = tc->t_eofc; tp->tty_termios = termios; setattr(tp); return(OK); } /* Table of termios line speed to sgtty line speed translations. All termios * speeds are present even if sgtty didn't know about them. (Now it does.) */ PRIVATE struct s2s { speed_t tspd; u8_t sgspd; } ts2sgs[] = { { B0, 0 }, { B50, 50 }, { B75, 75 }, { B110, 1 }, { B134, 134 }, { B200, 2 }, { B300, 3 }, { B600, 6 }, { B1200, 12 }, { B1800, 18 }, { B2400, 24 }, { B4800, 48 }, { B9600, 96 }, { B19200, 192 }, { B38400, 195 }, { B57600, 194 }, { B115200, 193 }, }; /*===========================================================================* * tspd2sgspd * *===========================================================================*/ PRIVATE int tspd2sgspd(tspd) speed_t tspd; { /* Translate a termios speed to sgtty speed. */ struct s2s *s; for (s = ts2sgs; s < ts2sgs + sizeof(ts2sgs)/sizeof(ts2sgs[0]); s++) { if (s->tspd == tspd) return(s->sgspd); } return 96; } /*===========================================================================* * sgspd2tspd * *===========================================================================*/ PRIVATE speed_t sgspd2tspd(sgspd) int sgspd; { /* Translate a sgtty speed to termios speed. */ struct s2s *s; for (s = ts2sgs; s < ts2sgs + sizeof(ts2sgs)/sizeof(ts2sgs[0]); s++) { if (s->sgspd == sgspd) return(s->tspd); } return B9600; } #if ENABLE_BINCOMPAT /*===========================================================================* * do_ioctl_compat * *===========================================================================*/ PRIVATE void do_ioctl_compat(tp, m_ptr) tty_t *tp; message *m_ptr; { /* Handle the old sgtty ioctl's that packed the sgtty or tchars struct into * the Minix message. Efficient then, troublesome now. */ int minor, proc, func, result, r; long flags, erki, spek; u8_t erase, kill, intr, quit, xon, xoff, brk, eof, ispeed, ospeed; struct sgttyb sg; struct tchars tc; message reply_mess; minor = m_ptr->TTY_LINE; proc = m_ptr->PROC_NR; func = m_ptr->REQUEST; spek = m_ptr->m2_l1; flags = m_ptr->m2_l2; switch(func) { case (('t'<<8) | 8): /* TIOCGETP */ r = compat_getp(tp, &sg); erase = sg.sg_erase; kill = sg.sg_kill; ispeed = sg.sg_ispeed; ospeed = sg.sg_ospeed; flags = sg.sg_flags; erki = ((long)ospeed<<24) | ((long)ispeed<<16) | ((long)erase<<8) |kill; break; case (('t'<<8) | 18): /* TIOCGETC */ r = compat_getc(tp, &tc); intr = tc.t_intrc; quit = tc.t_quitc; xon = tc.t_startc; xoff = tc.t_stopc; brk = tc.t_brkc; eof = tc.t_eofc; erki = ((long)intr<<24) | ((long)quit<<16) | ((long)xon<<8) | xoff; flags = (eof << 8) | brk; break; case (('t'<<8) | 17): /* TIOCSETC */ tc.t_stopc = (spek >> 0) & 0xFF; tc.t_startc = (spek >> 8) & 0xFF; tc.t_quitc = (spek >> 16) & 0xFF; tc.t_intrc = (spek >> 24) & 0xFF; tc.t_brkc = (flags >> 0) & 0xFF; tc.t_eofc = (flags >> 8) & 0xFF; r = compat_setc(tp, &tc); break; case (('t'<<8) | 9): /* TIOCSETP */ sg.sg_erase = (spek >> 8) & 0xFF; sg.sg_kill = (spek >> 0) & 0xFF; sg.sg_ispeed = (spek >> 16) & 0xFF; sg.sg_ospeed = (spek >> 24) & 0xFF; sg.sg_flags = flags; r = compat_setp(tp, &sg); break; default: r = ENOTTY; } reply_mess.m_type = TASK_REPLY; reply_mess.REP_PROC_NR = m_ptr->PROC_NR; reply_mess.REP_STATUS = r; reply_mess.m2_l1 = erki; reply_mess.m2_l2 = flags; send(m_ptr->m_source, &reply_mess); } #endif /* ENABLE_BINCOMPAT */ #endif /* ENABLE_SRCCOMPAT || ENABLE_BINCOMPAT */ /*==========================================================================* * rs232.c - serial driver for 8250 and 16450 UARTs * * Added support for Atari ST M68901 and YM-2149 --kub * *==========================================================================*/ #include "kernel.h" #include #include #include "tty.h" #include "proc.h" #if NR_RS_LINES > 0 #if (MACHINE != IBM_PC) && (MACHINE != ATARI) #error /* rs232.c only supports PC and Atari ST */ #endif #if (MACHINE == ATARI) #include "staddr.h" #include "stsound.h" #include "stmfp.h" #if (NR_RS_LINES > 1) #error /* Only one physical RS232 line available */ #endif #endif #if (MACHINE == IBM_PC) /* PC/AT 8250/16450 chip combination */ /* 8250 constants. */ #define UART_FREQ 115200L /* timer frequency */ /* Interrupt enable bits. */ #define IE_RECEIVER_READY 1 #define IE_TRANSMITTER_READY 2 #define IE_LINE_STATUS_CHANGE 4 #define IE_MODEM_STATUS_CHANGE 8 /* Interrupt status bits. */ #define IS_MODEM_STATUS_CHANGE 0 #define IS_TRANSMITTER_READY 2 #define IS_RECEIVER_READY 4 #define IS_LINE_STATUS_CHANGE 6 /* Line control bits. */ #define LC_2STOP_BITS 0x04 #define LC_PARITY 0x08 #define LC_PAREVEN 0x10 #define LC_BREAK 0x40 #define LC_ADDRESS_DIVISOR 0x80 /* Line status bits. */ #define LS_OVERRUN_ERR 2 #define LS_PARITY_ERR 4 #define LS_FRAMING_ERR 8 #define LS_BREAK_INTERRUPT 0x10 #define LS_TRANSMITTER_READY 0x20 /* Modem control bits. */ #define MC_DTR 1 #define MC_RTS 2 #define MC_OUT2 8 /* required for PC & AT interrupts */ /* Modem status bits. */ #define MS_CTS 0x10 #define MS_RLSD 0x80 /* Received Line Signal Detect */ #define MS_DRLSD 0x08 /* RLSD Delta */ #else /* MACHINE == ATARI */ /* Atari ST 68901 USART */ /* Most of the USART constants are already defined in stmfp.h . The local * definitions made here are for keeping C code changes smaller. --kub */ #define UART_FREQ 19200L /* timer frequency */ /* Line status bits. */ #define LS_OVERRUN_ERR R_OE #define LS_PARITY_ERR R_PE #define LS_FRAMING_ERR R_FE #define LS_BREAK_INTERRUPT R_BREAK /* Modem status bits. */ #define MS_CTS IO_SCTS /* 0x04 */ #endif /* MACHINE == ATARI */ #define DATA_BITS_SHIFT 8 /* amount data bits shifted in mode */ #define DEF_BAUD 1200 /* default baud rate */ #define RS_IBUFSIZE 1024 /* RS232 input buffer size */ #define RS_OBUFSIZE 1024 /* RS232 output buffer size */ /* Input buffer watermarks. * The external device is asked to stop sending when the buffer * exactly reaches high water, or when TTY requests it. Sending restarts * when the input buffer empties below the low watermark. */ #define RS_ILOWWATER (1 * RS_IBUFSIZE / 4) #define RS_IHIGHWATER (3 * RS_IBUFSIZE / 4) /* Output buffer low watermark. * TTY is notified when the output buffer empties below the low watermark, so * it may continue filling the buffer if doing a large write. */ #define RS_OLOWWATER (1 * RS_OBUFSIZE / 4) #if (MACHINE == IBM_PC) /* Macros to handle flow control. * Interrupts must be off when they are used. * Time is critical - already the function call for out_byte() is annoying. * If out_byte() can be done in-line, tests to avoid it can be dropped. * istart() tells external device we are ready by raising RTS. * istop() tells external device we are not ready by dropping RTS. * DTR is kept high all the time (it probably should be raised by open and * dropped by close of the device). * OUT2 is also kept high all the time. */ #define istart(rs) \ (out_byte((rs)->modem_ctl_port, MC_OUT2 | MC_RTS | MC_DTR), \ (rs)->idevready = TRUE) #define istop(rs) \ (out_byte((rs)->modem_ctl_port, MC_OUT2 | MC_DTR), \ (rs)->idevready = FALSE) /* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if * CLOCAL is in effect for a line without a CTS wire. */ #define devready(rs) ((in_byte(rs->modem_status_port) | rs->cts) & MS_CTS) /* Macro to tell if transmitter is ready. */ #define txready(rs) (in_byte(rs->line_status_port) & LS_TRANSMITTER_READY) /* Macro to tell if carrier has dropped. * The RS232 Carrier Detect (CD) line is usually connected to the 8250 * Received Line Signal Detect pin, reflected by bit MS_RLSD in the Modem * Status Register. The MS_DRLSD bit tells if MS_RLSD has just changed state. * So if MS_DRLSD is set and MS_RLSD cleared, we know that carrier has just * dropped. */ #define devhup(rs) \ ((in_byte(rs->modem_status_port) & (MS_RLSD|MS_DRLSD)) == MS_DRLSD) #else /* MACHINE == ATARI */ /* Macros to handle flow control. * Time is critical - already the function call for lock()/restore() is * annoying. * istart() tells external device we are ready by raising RTS. * istop() tells external device we are not ready by dropping RTS. * DTR is kept high all the time (it probably should be raised by open and * dropped by close of the device). NOTE: The modem lines are active low. */ #define set_porta(msk,val) { register int s = lock(); \ SOUND->sd_selr = YM_IOA; \ SOUND->sd_wdat = \ SOUND->sd_rdat & (msk) | (val); \ restore(s); } #define istart(rs) { set_porta( ~(PA_SRTS|PA_SDTR),0 ); \ (rs)->idevready = TRUE; } #define istop(rs) { set_porta( ~PA_SDTR, PA_SRTS ); \ (rs)->idevready = FALSE; } /* Macro to tell if device is ready. The rs->cts field is set to MS_CTS if * CLOCAL is in effect for a line without a CTS wire. */ #define devready(rs) ((~MFP->mf_gpip | rs->cts) & MS_CTS) /* Transmitter ready test */ #define txready(rs) (MFP->mf_tsr & (T_EMPTY | T_UE)) #endif /* MACHINE == ATARI */ /* Types. */ typedef unsigned char bool_t; /* boolean */ /* RS232 device structure, one per device. */ typedef struct rs232 { tty_t *tty; /* associated TTY structure */ int icount; /* number of bytes in the input buffer */ char *ihead; /* next free spot in input buffer */ char *itail; /* first byte to give to TTY */ bool_t idevready; /* nonzero if we are ready to receive (RTS) */ char cts; /* normally 0, but MS_CTS if CLOCAL is set */ unsigned char ostate; /* combination of flags: */ #define ODONE 1 /* output completed (< output enable bits) */ #define ORAW 2 /* raw mode for xoff disable (< enab. bits) */ #define OWAKEUP 4 /* tty_wakeup() pending (asm code only) */ #define ODEVREADY MS_CTS /* external device hardware ready (CTS) */ #define OQUEUED 0x20 /* output buffer not empty */ #define OSWREADY 0x40 /* external device software ready (no xoff) */ #define ODEVHUP MS_RLSD /* external device has dropped carrier */ #define OSOFTBITS (ODONE | ORAW | OWAKEUP | OQUEUED | OSWREADY) /* user-defined bits */ #if (OSOFTBITS | ODEVREADY | ODEVHUP) == OSOFTBITS /* a weak sanity check */ #error /* bits are not unique */ #endif unsigned char oxoff; /* char to stop output */ bool_t inhibited; /* output inhibited? (follows tty_inhibited) */ bool_t drain; /* if set drain output and reconfigure line */ int ocount; /* number of bytes in the output buffer */ char *ohead; /* next free spot in output buffer */ char *otail; /* next char to output */ #if (MACHINE == IBM_PC) port_t xmit_port; /* i/o ports */ port_t recv_port; port_t div_low_port; port_t div_hi_port; port_t int_enab_port; port_t int_id_port; port_t line_ctl_port; port_t modem_ctl_port; port_t line_status_port; port_t modem_status_port; #endif unsigned char lstatus; /* last line status */ unsigned char pad; /* ensure alignment for 16-bit ints */ unsigned framing_errors; /* error counts (no reporting yet) */ unsigned overrun_errors; unsigned parity_errors; unsigned break_interrupts; char ibuf[RS_IBUFSIZE]; /* input buffer */ char obuf[RS_OBUFSIZE]; /* output buffer */ } rs232_t; PUBLIC rs232_t rs_lines[NR_RS_LINES]; /* Table and macro to translate an RS232 line number Q-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-b-c-d-e-f-g-h-to its rs_lines entry. */ PRIVATE rs232_t *p_rs_addr[NR_RS_LINES]; #define rs_addr(line) (p_rs_addr[line]) #if (MACHINE == IBM_PC) /* 8250 base addresses. */ PRIVATE port_t addr_8250[] = { 0x3F8, /* COM1: (line 0); COM3 might be at 0x3E8 */ 0x2F8, /* COM2: (line 1); COM4 might be at 0x2E8 */ }; #endif FORWARD _PROTOTYPE( int rs232_1handler, (int irq) ); FORWARD _PROTOTYPE( int rs232_2handler, (int irq) ); FORWARD _PROTOTYPE( void in_int, (rs232_t *rs) ); FORWARD _PROTOTYPE( void line_int, (rs232_t *rs) ); FORWARD _PROTOTYPE( void modem_int, (rs232_t *rs) ); FORWARD _PROTOTYPE( void rs_write, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_echo, (tty_t *tp, int c) ); FORWARD _PROTOTYPE( void rs_ioctl, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_config, (rs232_t *rs) ); FORWARD _PROTOTYPE( void rs_read, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_icancel, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_ocancel, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_ostart, (rs232_t *rs) ); FORWARD _PROTOTYPE( void rs_break, (tty_t *tp) ); FORWARD _PROTOTYPE( void rs_close, (tty_t *tp) ); FORWARD _PROTOTYPE( void out_int, (rs232_t *rs) ); /*==========================================================================* * rs_write * *==========================================================================*/ PRIVATE void rs_write(tp) register tty_t *tp; { /* (*devwrite)() routine for RS232. */ rs232_t *rs = tp->tty_priv; int count, ocount; phys_bytes user_phys; if (rs->inhibited != tp->tty_inhibited) { /* Inhibition state has changed. */ lock(); rs->ostate |= OSWREADY; if (tp->tty_inhibited) rs->ostate &= ~OSWREADY; unlock(); rs->inhibited = tp->tty_inhibited; } if (rs->drain) { /* Wait for the line to drain then reconfigure and continue output. */ if (rs->ocount > 0) return; rs->drain = FALSE; rs_config(rs); } /* While there is something to do. */ for (;;) { ocount = buflen(rs->obuf) - rs->ocount; count = bufend(rs->obuf) - rs->ohead; if (count > ocount) count = ocount; if (count > tp->tty_outleft) count = tp->tty_outleft; if (count == 0 || tp->tty_inhibited) break; /* Copy from user space to the RS232 output buffer. */ user_phys = proc_vir2phys(proc_addr(tp->tty_outproc), tp->tty_out_vir); phys_copy(user_phys, vir2phys(rs->ohead), (phys_bytes) count); /* Perform output processing on the output buffer. */ out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount); if (count == 0) break; /* Assume echoing messed up by output. */ tp->tty_reprint = TRUE; /* Bookkeeping. */ lock(); /* protect interrupt sensitive rs->ocount */ rs->ocount += ocount; rs_ostart(rs); unlock(); if ((rs->ohead += ocount) >= bufend(rs->obuf)) rs->ohead -= buflen(rs->obuf); tp->tty_out_vir += count; tp->tty_outcum += count; if ((tp->tty_outleft -= count) == 0) { /* Output is finished, reply to the writer. */ tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, tp->tty_outcum); tp->tty_outcum = 0; } } if (tp->tty_outleft > 0 && tp->tty_termios.c_ospeed == B0) { /* Oops, the line has hung up. */ tty_reply(tp->tty_outrepcode, tp->tty_outcaller, tp->tty_outproc, EIO); tp->tty_outleft = tp->tty_outcum = 0; } } /*==========================================================================* * rs_echo * *==========================================================================*/ PRIVATE void rs_echo(tp, c) tty_t *tp; /* which TTY */ int c; /* character to echo */ { /* Echo one character. (Like rs_write, but only one character, optionally.) */ rs232_t *rs = tp->tty_priv; int count, ocount; ocount = buflen(rs->obuf) - rs->ocount; if (ocount == 0) return; /* output buffer full */ count = 1; *rs->ohead = c; /* add one character */ out_process(tp, rs->obuf, rs->ohead, bufend(rs->obuf), &count, &ocount); if (count == 0) return; lock(); rs->ocount += ocount; rs_ostart(rs); unlock(); if ((rs->ohead += ocount) >= bufend(rs->obuf)) rs->ohead -= buflen(rs->obuf); } /*==========================================================================* * rs_ioctl * *==========================================================================*/ PRIVATE void rs_ioctl(tp) tty_t *tp; /* which TTY */ { /* Reconfigure the line as soon as the output has drained. */ rs232_t *rs = tp->tty_priv; rs->drain = TRUE; } /*==========================================================================* * rs_config * *==========================================================================*/ PRIVATE void rs_config(rs) rs232_t *rs; /* which line */ { /* Set various line control parameters for RS232 I/O. * If DataBits == 5 and StopBits == 2, 8250 will generate 1.5 stop bits. * The 8250 can't handle split speed, so we use the input speed. */ tty_t *tp = rs->tty; int divisor; int line_controls; static struct speed2divisor { speed_t speed; int divisor; } s2d[] = { #if (MACHINE == IBM_PC) { B50, UART_FREQ / 50 }, #endif { B75, UART_FREQ / 75 }, { B110, UART_FREQ / 110 }, { B134, UART_FREQ * 10 / 1345 }, { B150, UART_FREQ / 150 }, { B200, UART_FREQ / 200 }, { B300, UART_FREQ / 300 }, { B600, UART_FREQ / 600 }, { B1200, UART_FREQ / 1200 }, #if (MACHINE == IBM_PC) { B1800, UART_FREQ / 1800 }, #endif { B2400, UART_FREQ / 2400 }, { B4800, UART_FREQ / 4800 }, { B9600, UART_FREQ / 9600 }, { B19200, UART_FREQ / 19200 }, #if (MACHINE == IBM_PC) { B38400, UART_FREQ / 38400 }, { B57600, UART_FREQ / 57600 }, { B115200, UART_FREQ / 115200L }, #endif }; struct speed2divisor *s2dp; /* RS232 needs to know the xoff character, and if CTS works. */ rs->oxoff = tp->tty_termios.c_cc[VSTOP]; rs->cts = (tp->tty_termios.c_cflag & CLOCAL) ? MS_CTS : 0; /* Look up the 8250 rate divisor from the output speed. */ divisor = 0; for (s2dp = s2d; s2dp < s2d + sizeof(s2d)/sizeof(s2d[0]); s2dp++) { if (s2dp->speed == tp->tty_termios.c_ospeed) divisor = s2dp->divisor; } if (divisor == 0) return; /* B0? */ #if (MACHINE == IBM_PC) /* Compute line control flag bits. */ line_controls = 0; if (tp->tty_termios.c_cflag & PARENB) { line_controls |= LC_PARITY; if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= LC_PAREVEN; } if (divisor >= (UART_FREQ / 110)) line_controls |= LC_2STOP_BITS; line_controls |= (tp->tty_termios.c_cflag & CSIZE) >> 2; /* Lock out interrupts while setting the speed. The receiver register is * going to be hidden by the div_low register, but the input interrupt * handler relies on reading it to clear the interrupt and avoid looping * forever. */ lock(); /* Select the baud rate divisor registers and change the rate. */ out_byte(rs->line_ctl_port, LC_ADDRESS_DIVISOR); out_byte(rs->div_low_port, divisor); out_byte(rs->div_hi_port, divisor >> 8); /* Change the line controls and reselect the usual registers. */ out_byte(rs->line_ctl_port, line_controls); rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */ if ((tp->tty_termios.c_lflag & IXON) && rs->oxoff != _POSIX_VDISABLE) rs->ostate &= ~ORAW; unlock(); #else /* MACHINE == ATARI */ line_controls = U_Q16; if (tp->tty_termios.c_cflag & PARENB) { line_controls |= U_PAR; if (!(tp->tty_termios.c_cflag & PARODD)) line_controls |= U_EVEN; } line_controls |= (divisor >= (UART_FREQ / 110)) ? U_ST2 : U_ST1; switch (tp->tty_termios.c_cflag & CSIZE) { /* XXX - are U_Dn like CSn? */ case CS5: line_controls |= U_D5; break; case CS5: line_controls |= U_D6; break; case CS5: line_controls |= U_D7; break; case CS5: line_controls |= U_D8; break; } lock(); MFP->mf_ucr = line_controls; MFP->mf_tddr = divisor; unlock(); #endif /* MACHINE == ATARI */ } /*==========================================================================* * rs_init * *==========================================================================*/ PUBLIC void rs_init(tp) tty_t *tp; /* which TTY */ { /* Initialize RS232 for one line. */ register rs232_t *rs; int line; #if (MACHINE == IBM_PC) port_t this_8250; int irq; long v; #endif /* Associate RS232 and TTY structures. */ line = tp - &tty_table[NR_CONS]; rs = tp->tty_priv = &rs_lines[line]; rs->tty = tp; /* Set up input queue. */ rs->ihead = rs->itail = rs->ibuf; #if (MACHINE == IBM_PC) /* Precalculate port numbers for speed. Magic numbers in the code (once). */ this_8250 = addr_8250[line]; rs->xmit_port = this_8250 + 0; rs->recv_port = this_8250 + 0; rs->div_low_port = this_8250 + 0; rs->div_hi_port = this_8250 + 1; rs->int_enab_port = this_8250 + 1; rs->int_id_port = this_8250 + 2; rs->line_ctl_port = this_8250 + 3; rs->modem_ctl_port = this_8250 + 4; rs->line_status_port = this_8250 + 5; rs->modem_status_port = this_8250 + 6; #endif /* Set up the hardware to a base state, in particular * o turn off DTR (MC_DTR) to try to stop the external device. * o be careful about the divisor latch. Some BIOS's leave it enabled * here and that caused trouble (no interrupts) in version 1.5 by * hiding the interrupt enable port in the next step, and worse trouble * (continual interrupts) in an old version by hiding the receiver * port in the first interrupt. Call rs_ioctl() early to avoid this. * o disable interrupts at the chip level, to force an edge transition * on the 8259 line when interrupts are next enabled and active. * RS232 interrupts are guaranteed to be disabled now by the 8259 * mask, but there used to be trouble if the mask was set without * handling a previous interrupt. */ istop(rs); /* sets modem_ctl_port */ rs_config(rs); #if (MACHINE == IBM_PC) out_byte(rs->int_enab_port, 0); #endif /* Clear any harmful leftover interrupts. An output interrupt is harmless * and will occur when interrupts are enabled anyway. Set up the output * queue using the status from clearing the modem status interrupt. */ #if (MACHINE == IBM_PC) in_byte(rs->line_status_port); in_byte(rs->recv_port); #endif rs->ostate = devready(rs) | ORAW | OSWREADY; /* reads modem_ctl_port */ rs->ohead = rs->otail = rs->obuf; #if (MACHINE == IBM_PC) /* Enable interrupts for both interrupt controller and device. */ irq = (line & 1) ? SECONDARY_IRQ : RS232_IRQ; #if ENABLE_DP8390 /* The ethernet driver may steal the IRQ of an RS232 line. */ v = ETHER_IRQ; switch (env_parse("DPETH0", "x:d:x:x", 1, &v, 0L, (long) NR_IRQ_VECTORS-1)) { case EP_ON: case EP_SET: if (v == irq) return; /* IRQ in use, don't configure line */ } #endif put_irq_handler(irq, (line & 1) ? rs232_2handler : rs232_1handler); enable_irq(irq); out_byte(rs->int_enab_port, IE_LINE_STATUS_CHANGE | IE_MODEM_STATUS_CHANGE | IE_RECEIVER_READY | IE_TRANSMITTER_READY); #else /* MACHINE == ATARI */ /* Initialize the 68901 chip, then enable interrupts. */ MFP->mf_scr = 0x00; MFP->mf_tcdcr |= T_Q004; MFP->mf_rsr = R_ENA; MFP->mf_tsr = T_ENA; MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^ (MFP->mf_gpip & (IO_SCTS|IO_SDCD)); MFP->mf_ddr = (MFP->mf_ddr & ~ (IO_SCTS|IO_SDCD)); MFP->mf_iera |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR); MFP->mf_imra |= (IA_RRDY|IA_RERR|IA_TRDY|IA_TERR); MFP->mf_ierb |= (IB_SCTS|IB_SDCD); MFP->mf_imrb |= (IB_SCTS|IB_SDCD); #endif /* MACHINE == ATARI */ /* Fill in TTY function hooks. */ tp->tty_devread = rs_read; tp->tty_devwrite = rs_write; tp->tty_echo = rs_echo; tp->tty_icancel = rs_icancel; tp->tty_ocancel = rs_ocancel; tp->tty_ioctl = rs_ioctl; tp->tty_break = rs_break; tp->tty_close = rs_close; /* Tell external device we are ready. */ istart(rs); } /*==========================================================================* * rs_icancel * *==========================================================================*/ PRIVATE void rs_icancel(tp) tty_t *tp; /* which TTY */ { /* Cancel waiting input. */ rs232_t *rs = tp->tty_priv; lock(); rs->icount = 0; rs->itail = rs->ihead; istart(rs); unlock(); } /*==========================================================================* * rs_ocancel * *==========================================================================*/ PRIVATE void rs_ocancel(tp) tty_t *tp; /* which TTY */ { /* Cancel pending output. */ rs232_t *rs = tp->tty_priv; lock(); rs->ostate &= ~(ODONE | OQUEUED); rs->ocount = 0; rs->otail = rs->ohead; unlock(); } /*==========================================================================* * rs_read * *==========================================================================*/ PRIVATE void rs_read(tp) tty_t *tp; /* which tty */ { /* Process characters from the circular input buffer. */ rs232_t *rs = tp->tty_priv; int icount, count, ostate; if (!(tp->tty_termios.c_cflag & CLOCAL)) { /* Send a SIGHUP if hangup detected. */ lock(); ostate = rs->ostate; rs->ostate &= ~ODEVHUP; /* save ostate, clear DEVHUP */ unlock(); if (ostate & ODEVHUP) { sigchar(tp, SIGHUP); tp->tty_termios.c_ospeed = B0; /* Disable further I/O. */ return; } } while ((count = rs->icount) > 0) { icount = bufend(rs->ibuf) - rs->itail; if (count > icount) count = icount; /* Perform input processing on (part of) the input buffer. */ if ((count = in_process(tp, rs->itail, count)) == 0) break; lock(); /* protect interrupt sensitive variables */ rs->icount -= count; if (!rs->idevready && rs->icount < RS_ILOWWATER) istart(rs); unlock(); if ((rs->itail += count) == bufend(rs->ibuf)) rs->itail = rs->ibuf; } } /*==========================================================================* * rs_ostart * *==========================================================================*/ PRIVATE void rs_ostart(rs) rs232_t *rs; /* which rs line */ { /* Tell RS232 there is something waiting in the output buffer. */ rs->ostate |= OQUEUED; if (txready(rs)) out_int(rs); } /*==========================================================================* * rs_break * *==========================================================================*/ PRIVATE void rs_break(tp) tty_t *tp; /* which tty */ { /* Generate a break condition by setting the BREAK bit for 0.4 sec. */ rs232_t *rs = tp->tty_priv; int line_controls; line_controls = in_byte(rs->line_ctl_port); out_byte(rs->line_ctl_port, line_controls | LC_BREAK); milli_delay(400); /* ouch */ out_byte(rs->line_ctl_port, line_controls); } /*==========================================================================* * rs_close * *==========================================================================*/ PRIVATE void rs_close(tp) tty_t *tp; /* which tty */ { /* The line is closed; optionally hang up. */ rs232_t *rs = tp->tty_priv; if (tp->tty_termios.c_cflag & HUPCL) { out_byte(rs->modem_ctl_port, MC_OUT2 | MC_RTS); } } /* Low level (interrupt) routines. */ #if (MACHINE == IBM_PC) /*==========================================================================* * rs232_1handler * *==========================================================================*/ PRIVATE int rs232_1handler(irq) int irq; { /* Interrupt hander for IRQ4. * Only 1 line (usually COM1) should use it. */ register rs232_t *rs = &rs_lines[0]; while (TRUE) { /* Loop to pick up ALL pending interrupts for device. * This usually just wastes time unless the hardware has a buffer * (and then we have to worry about being stuck in the loop too long). * Unfortunately, some serial cards lock up without this. */ switch (in_byte(rs->int_id_port)) { case IS_RECEIVER_READY: in_int(rs); continue; case IS_TRANSMITTER_READY: out_int(rs); continue; case IS_MODEM_STATUS_CHANGE: modem_int(rs); continue; case IS_LINE_STATUS_CHANGE: line_int(rs); continue; } return(1); /* reenable serial interrupt */ } } /*==========================================================================* * rs232_2handler * *==========================================================================*/ PRIVATE int rs232_2handler(irq) int irq; { /* Interrupt hander for IRQ3. * Only 1 line (usually COM2) should use it. */ register rs232_t *rs = &rs_lines[1]; while (TRUE) { switch (in_byte(rs->int_id_port)) { case IS_RECEIVER_READY: in_int(rs); continue; case IS_TRANSMITTER_READY: out_int(rs); continue; case IS_MODEM_STATUS_CHANGE: modem_int(rs); continue; case IS_LINE_STATUS_CHANGE: line_int(rs); continue; } return(1); /* reenable serial interrupt */ } } #else /* MACHINE == ATARI */ /*==========================================================================* * siaint * *==========================================================================*/ PRIVATE void siaint(type) int type; /* interrupt type */ { /* siaint is the rs232 interrupt procedure for Atari ST's. For ST there are * as much as 5 interrupt lines used for rs232. The trap type byte left on the * stack by the assembler interrupt handler identifies the interrupt cause. */ register unsigned char code; register rs232_t *rs = &rs_lines[0]; int s = lock(); switch (type & 0x00FF) { case 0x00: /* receive buffer full */ in_int(rs); break; case 0x01: /* receive error */ line_int(rs); break; case 0x02: /* transmit buffer empty */ out_int(rs); break; case 0x03: /* transmit error */ code = MFP->mf_tsr; if (code & ~(T_ENA | T_UE | T_EMPTY)) { printf("sia: transmit error: status=%x\r\n", code); /* MFP->mf_udr = lastchar; */ /* retry */ } break; case 0x04: /* modem lines change */ modem_int(rs); break; } restore(s); } #endif /* MACHINE == ATARI */ /*==========================================================================* * in_int * *==========================================================================*/ PRIVATE void in_int(rs) register rs232_t *rs; /* line with input interrupt */ { /* Read the data which just arrived. * If it is the oxoff char, clear OSWREADY, else if OSWREADY was clear, set * it and restart output (any char does this, not just xon). * Put data in the buffer if room, otherwise discard it. * Set a flag for the clock interrupt handler to eventually notify TTY. */ int c; #if (MACHINE == IBM_PC) c = in_byte(rs->recv_port); #else /* MACHINE == ATARI */ c = MFP->mf_udr; #endif if (!(rs->ostate & ORAW)) { if (c == rs->oxoff) { rs->ostate &= ~OSWREADY; } else if (!(rs->ostate & OSWREADY)) { rs->ostate |= OSWREADY; if (txready(rs)) out_int(rs); } } if (rs->icount == buflen(rs->ibuf)) return; /* input buffer full, discard */ if (++rs->icount == RS_IHIGHWATER && rs->idevready) istop(rs); *rs->ihead = c; if (++rs->ihead == bufend(rs->ibuf)) rs->ihead = rs->ibuf; if (rs->icount == 1) { rs->tty->tty_events = 1; force_timeout(); } } /*==========================================================================* * line_int * *==========================================================================*/ PRIVATE void line_int(rs) register rs232_t *rs; /* line with line status interrupt */ { /* Check for and record errors. */ #if (MACHINE == IBM_PC) rs->lstatus = in_byte(rs->line_status_port); #else /* MACHINE == ATARI */ rs->lstatus = MFP->mf_rsr; MFP->mf_rsr &= R_ENA; rs->pad = MFP->mf_udr; /* discard char in case of LS_OVERRUN_ERR */ #endif /* MACHINE == ATARI */ if (rs->lstatus & LS_FRAMING_ERR) ++rs->framing_errors; if (rs->lstatus & LS_OVERRUN_ERR) ++rs->overrun_errors; if (rs->lstatus & LS_PARITY_ERR) ++rs->parity_errors; if (rs->lstatus & LS_BREAK_INTERRUPT) ++rs->break_interrupts; } /*==========================================================================* * modem_int * *==========================================================================*/ PRIVATE void modem_int(rs) register rs232_t *rs; /* line with modem interrupt */ { /* Get possibly new device-ready status, and clear ODEVREADY if necessary. * If the device just became ready, restart output. */ #if (MACHINE == ATARI) /* Set active edge interrupt so that next change causes a new interrupt */ MFP->mf_aer = (MFP->mf_aer | (IO_SCTS|IO_SDCD)) ^ (MFP->mf_gpip & (IO_SCTS|IO_SDCD)); #endif if (devhup(rs)) { rs->ostate |= ODEVHUP; rs->tty->tty_events = 1; force_timeout(); } if (!devready(rs)) rs->ostate &= ~ODEVREADY; else if (!(rs->ostate & ODEVREADY)) { rs->ostate |= ODEVREADY; if (txready(rs)) out_int(rs); } } /*==========================================================================* * out_int * *==========================================================================*/ PRIVATE void out_int(rs) register rs232_t *rs; /* line with output interrupt */ { /* If there is output to do and everything is ready, do it (local device is * known ready). * Notify TTY when the buffer goes empty. */ if (rs->ostate >= (ODEVREADY | OQUEUED | OSWREADY)) { /* Bit test allows ORAW and requires the others. */ #if (MACHINE == IBM_PC) out_byte(rs->xmit_port, *rs->otail); #else /* MACHINE == ATARI */ MFP->mf_udr = *rs->otail; #endif if (++rs->otail == bufend(rs->obuf)) rs->otail = rs->obuf; if (--rs->ocount == 0) { rs->ostate ^= (ODONE | OQUEUED); /* ODONE on, OQUEUED off */ rs->tty->tty_events = 1; force_timeout(); } else if (rs->ocount == RS_OLOWWATER) { /* running low? */ rs->tty->tty_events = 1; force_timeout(); } } } #endif /* NR_RS_LINES > 0 */ #ifndef SB16_H #define SB16_H #define SB_DEBUG 0 /* 1 = print debug info */ #define SB_DEBUG_2 0 /* 1 = print more debug info */ #define SB_TIMEOUT 32000 /* timeout count */ /* IRQ, base address and DMA channels */ #define SB_IRQ 5 #define SB_BASE_ADDR 0x220 /* 0x210, 0x220, 0x230, 0x240, * 0x250, 0x260, 0x280 */ #define SB_DMA_8 1 /* 0, 1, 3 */ #define SB_DMA_16 5 /* 5, 6, 7 */ #if _WORD_SIZE == 2 #define DMA_SIZE 8192 /* Dma buffer MUST BE MULTIPLE OF 2 */ #else #define DMA_SIZE 32768 /* Dma buffer MUST BE MULTIPLE OF 2 */ #endif /* Some defaults for the DSP */ #define DEFAULT_SPEED 22050 /* Sample rate */ #define DEFAULT_BITS 8 /* Nr. of bits */ #define DEFAULT_SIGN 0 /* 0 = unsigned, 1 = signed */ #define DEFAULT_STEREO 0 /* 0 = mono, 1 = stereo */ /* DMA port addresses */ #define DMA8_ADDR ((SB_DMA_8 & 3) << 1) + 0x00 #define DMA8_COUNT ((SB_DMA_8 & 3) << 1) + 0x01 #define DMA8_MASK 0x0A #define DMA8_MODE 0x0B #define DMA8_CLEAR 0x0C /* If after this preprocessing stuff DMA8_PAGE is not defined * the 8-bit DMA channel specified is not valid */ #if SB_DMA_8 == 0 # define DMA8_PAGE 0x87 #else # if SB_DMA_8 == 1 # define DMA8_PAGE 0x83 # else # if SB_DMA_8 == 3 # define DMA8_PAGE 0x82 # endif # endif #endif #define DMA16_ADDR ((SB_DMA_16 & 3) << 2) + 0xC0 #define DMA16_COUNT ((SB_DMA_16 & 3) << 2) + 0xC2 #define DMA16_MASK 0xD4 #define DMA16_MODE 0xD6 #define DMA16_CLEAR 0xD8 /* If after this preprocessing stuff DMA16_PAGE is not defined * the 16-bit DMA channel specified is not valid */ #if SB_DMA_16 == 5 # define DMA16_PAGE 0x8B #else # if SB_DMA_16 == 6 # define DMA16_PAGE 0x89 # else # if SB_DMA_16 == 7 # define DMA16_PAGE 0x8A # endif # endif #endif /* DMA modes */ #define DMA16_AUTO_PLAY 0x58 + (SB_DMA_16 & 3) #define DMA16_AUTO_REC 0x54 + (SB_DMA_16 & 3) #define DMA8_AUTO_PLAY 0x58 + SB_DMA_8 #define DMA8_AUTO_REC 0x54 + SB_DMA_8 /* IO ports for soundblaster */ #define DSP_RESET 0x6 + SB_BASE_ADDR #define DSP_READ 0xA + SB_BASE_ADDR #define DSP_WRITE 0xC + SB_BASE_ADDR #define DSP_COMMAND 0xC + SB_BASE_ADDR #define DSP_STATUS 0xC + SB_BASE_ADDR #define DSP_DATA_AVL 0xE + SB_BASE_ADDR #define DSP_DATA16_AVL 0xF + SB_BASE_ADDR #define MIXER_REG 0x4 + SB_BASE_ADDR #define MIXER_DATA 0x5 + SB_BASE_ADDR #define OPL3_LEFT 0x0 + SB_BASE_ADDR #define OPL3_RIGHT 0x2 + SB_BASE_ADDR #define OPL3_BOTH 0x8 + SB_BASE_ADDR /* DSP Commands */ #define DSP_INPUT_RATE 0x42 /* set input sample rate */ #define DSP_OUTPUT_RATE 0x41 /* set output sample rate */ #define DSP_CMD_SPKON 0xD1 /* set speaker on */ #define DSP_CMD_SPKOFF 0xD3 /* set speaker off */ #define DSP_CMD_DMA8HALT 0xD0 /* halt DMA 8-bit operation */ #define DSP_CMD_DMA8CONT 0xD4 /* continue DMA 8-bit operation */ #define DSP_CMD_DMA16HALT 0xD5 /* halt DMA 16-bit operation */ #define DSP_CMD_DMA16CONT 0xD6 /* continue DMA 16-bit operation */ #define DSP_GET_VERSION 0xE1 /* get version number of DSP */ #define DSP_CMD_8BITAUTO_IN 0xCE /* 8 bit auto-initialized input */ #define DSP_CMD_8BITAUTO_OUT 0xC6 /* 8 bit auto-initialized output */ #define DSP_CMD_16BITAUTO_IN 0xBE /* 16 bit auto-initialized input */ #define DSP_CMD_16BITAUTO_OUT 0xB6 /* 16 bit auto-initialized output */ #define DSP_CMD_IRQREQ8 0xF2 /* Interrupt request 8 bit */ #define DSP_CMD_IRQREQ16 0xF3 /* Interrupt request 16 bit */ /* DSP Modes */ #define DSP_MODE_MONO_US 0x00 /* Mono unsigned */ #define DSP_MODE_MONO_S 0x10 /* Mono signed */ #define DSP_MODE_STEREO_US 0x20 /* Stereo unsigned */ #define DSP_MODE_STEREO_S 0x30 /* Stereo signed */ /* MIXER commands */ #define MIXER_RESET 0x00 /* Reset */ #define MIXER_DAC_LEVEL 0x04 /* Used for detection only */ #define MIXER_MASTER_LEFT 0x30 /* Master volume left */ #define MIXER_MASTER_RIGHT 0x31 /* Master volume right */ #define MIXER_DAC_LEFT 0x32 /* Dac level left */ #define MIXER_DAC_RIGHT 0x33 /* Dac level right */ #define MIXER_FM_LEFT 0x34 /* Fm level left */ #define MIXER_FM_RIGHT 0x35 /* Fm level right */ #define MIXER_CD_LEFT 0x36 /* Cd audio level left */ #define MIXER_CD_RIGHT 0x37 /* Cd audio level right */ #define MIXER_LINE_LEFT 0x38 /* Line in level left */ #define MIXER_LINE_RIGHT 0x39 /* Line in level right */ #define MIXER_MIC_LEVEL 0x3A /* Microphone level */ #define MIXER_PC_LEVEL 0x3B /* Pc speaker level */ #define MIXER_OUTPUT_CTRL 0x3C /* Output control */ #define MIXER_IN_LEFT 0x3D /* Input control left */ #define MIXER_IN_RIGHT 0x3E /* Input control right */ #define MIXER_GAIN_IN_LEFT 0x3F /* Input gain control left */ #define MIXER_GAIN_IN_RIGHT 0x40 /* Input gain control right */ #define MIXER_GAIN_OUT_LEFT 0x41 /* Output gain control left */ #define MIXER_GAIN_OUT_RIGHT 0x42 /* Output gain control rigth */ #define MIXER_AGC 0x43 /* Automatic gain control */ #define MIXER_TREBLE_LEFT 0x44 /* Treble left */ #define MIXER_TREBLE_RIGHT 0x45 /* Treble right */ #define MIXER_BASS_LEFT 0x46 /* Bass left */ #define MIXER_BASS_RIGHT 0x47 /* Bass right */ #define MIXER_SET_IRQ 0x80 /* Set irq number */ #define MIXER_SET_DMA 0x81 /* Set DMA channels */ #define MIXER_IRQ_STATUS 0x82 /* Irq status */ /* Mixer constants */ #define MIC 0x01 /* Microphone */ #define CD_RIGHT 0x02 #define CD_LEFT 0x04 #define LINE_RIGHT 0x08 #define LINE_LEFT 0x10 #define FM_RIGHT 0x20 #define FM_LEFT 0x40 /* DSP constants */ #define DSP_MAX_SPEED 44100 /* Max sample speed in KHz */ #define DSP_MIN_SPEED 4000 /* Min sample speed in KHz */ #define DSP_MAX_FRAGMENT_SIZE DMA_SIZE /* Maximum fragment size */ #define DSP_MIN_FRAGMENT_SIZE 1024 /* Minimum fragment size */ /* Number of bytes you can DMA before hitting a 64K boundary: */ #define dma_bytes_left(phys) \ ((unsigned) (sizeof(int) == 2 ? 0 : 0x10000) - (unsigned) ((phys) & 0xFFFF)) /* Function prototypes used by mixer and dsp */ _PROTOTYPE(int mixer_set, (int reg, int data)); #endif /* SB16_H */ /* This file contains the driver for a DSP (Digital Sound Processor) on * a SoundBlaster 16 (ASP) soundcard. * * The driver supports the following operations (using message format m2): * * m_type DEVICE PROC_NR COUNT POSITION ADRRESS * ---------------------------------------------------------------- * | DEV_OPEN | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_CLOSE | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_READ | device | proc nr | bytes | | buf ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_WRITE | device | proc nr | bytes | | buf ptr | * |------------+---------+---------+---------+---------+---------| * | DEV_IOCTL | device | proc nr |func code| | buf ptr | * ---------------------------------------------------------------- * * The file contains one entry point: * * sb16_task: main entry when system is brought up * * May 20 1995 Author: Michel R. Prevenier */ #include "kernel.h" #include #include #include #include "sb16.h" #if ENABLE_SB16 /* prototypes */ FORWARD _PROTOTYPE( void init_buffer, (void)); FORWARD _PROTOTYPE( int dsp_init, (void)); FORWARD _PROTOTYPE( int dsp_handler, (int irq)); FORWARD _PROTOTYPE( int dsp_open, (message *m_ptr)); FORWARD _PROTOTYPE( int dsp_close, (message *m_ptr)); FORWARD _PROTOTYPE( int dsp_ioctl, (message *m_ptr)); FORWARD _PROTOTYPE( int dsp_write, (message *m_ptr)); FORWARD _PROTOTYPE( int dsp_read, (message *m_ptr)); FORWARD _PROTOTYPE( int dsp_reset, (void)); FORWARD _PROTOTYPE( int dsp_command, (int value)); FORWARD _PROTOTYPE( int dsp_set_speed, (unsigned int speed)); FORWARD _PROTOTYPE( int dsp_set_size, (unsigned int size)); FORWARD _PROTOTYPE( int dsp_set_stereo, (unsigned int stereo)); FORWARD _PROTOTYPE( int dsp_set_bits, (unsigned int bits)); FORWARD _PROTOTYPE( int dsp_set_sign, (unsigned int sign)); FORWARD _PROTOTYPE( void dsp_dma_setup, (phys_bytes address, int count)); FORWARD _PROTOTYPE( void dsp_setup, (void)); /* globals */ PRIVATE int DspVersion[2]; PRIVATE unsigned int DspStereo = DEFAULT_STEREO; PRIVATE unsigned int DspSpeed = DEFAULT_SPEED; PRIVATE unsigned int DspBits = DEFAULT_BITS; PRIVATE unsigned int DspSign = DEFAULT_SIGN; PRIVATE unsigned int DspFragmentSize = DSP_MAX_FRAGMENT_SIZE; PRIVATE int DspAvail = 0; PRIVATE int DspBusy = 0; PRIVATE int DmaBusy = 0; PRIVATE int DmaDone = 1; PRIVATE int DmaMode = 0; PRIVATE char DmaBuffer[(long)2 * DMA_SIZE]; PRIVATE char *DmaPtr; PRIVATE phys_bytes DmaPhys; /*=========================================================================* * sb16_task * *=========================================================================*/ PUBLIC void sb16_task() { message mess; int err, caller, proc_nr; /* initialize the DMA buffer */ init_buffer(); /* Here is the main loop of the sound task. It waits for a message, carries * it out, and sends a reply. */ while (TRUE) { receive(ANY, &mess); caller = mess.m_source; proc_nr = mess.PROC_NR; switch (caller) { case HARDWARE: /* Leftover interrupt. */ continue; case FS_PROC_NR: /* The only legitimate caller. */ break; default: printf("sb16: got message from %d\n", caller); continue; } /* Now carry out the work. */ switch(mess.m_type) { case DEV_OPEN: err = dsp_open(&mess);break; case DEV_CLOSE: err = dsp_close(&mess);break; case DEV_IOCTL: err = dsp_ioctl(&mess);break; case DEV_READ: err = dsp_read(&mess);break; case DEV_WRITE: err = dsp_write(&mess);break; default: err = EINVAL;break; } /* Finally, prepare and send the reply message. */ mess.m_type = TASK_REPLY; mess.REP_PROC_NR = proc_nr; mess.REP_STATUS = err; /* #bytes transfered or error code */ send(caller, &mess); /* send reply to caller */ } } /*===========================================================================* * init_buffer * *===========================================================================*/ PRIVATE void init_buffer() { /* Select a buffer that can safely be used for dma transfers. * Its absolute address is 'DmaPhys', the normal address is 'DmaPtr'. */ DmaPtr = DmaBuffer; DmaPhys = vir2phys(DmaBuffer); if (dma_bytes_left(DmaPhys) < DMA_SIZE) { /* First half of buffer crosses a 64K boundary, can't DMA into that */ DmaPtr += DMA_SIZE; DmaPhys += DMA_SIZE; } } /*=========================================================================* * dsp_open * *=========================================================================*/ PRIVATE int dsp_open(m_ptr) message *m_ptr; { #if SB_DEBUG printf("sb16_open\n"); #endif /* try to detect SoundBlaster card */ if (!DspAvail && dsp_init() != OK) return EIO; /* Only one open at a time with soundcards */ if (DspBusy) return EBUSY; /* Start with a clean DSP */ if (dsp_reset() != OK) return EIO; /* Setup default values */ DspStereo = DEFAULT_STEREO; DspSpeed = DEFAULT_SPEED; DspBits = DEFAULT_BITS; DspSign = DEFAULT_SIGN; DspFragmentSize = DMA_SIZE; DspBusy = 1; DmaBusy = 0; return OK; } /*=========================================================================* * dsp_close * *=========================================================================*/ PRIVATE int dsp_close(m_ptr) message *m_ptr; { #if SB_DEBUG printf("dsp_close\n"); #endif DspBusy = 0; /* soundcard available again */ DmaBusy = 0; return OK; } /*=========================================================================* * dsp_ioctl * *=========================================================================*/ PRIVATE int dsp_ioctl(m_ptr) message *m_ptr; { int status; phys_bytes user_phys; unsigned int val; /* Cannot change parameters during play or recording */ if (DmaBusy) return EBUSY; /* Get user data */ if (m_ptr->REQUEST != DSPIORESET) { user_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(unsigned int)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&val), (phys_bytes) sizeof(val)); } #if SB_DEBUG printf("dsp_ioctl: got ioctl %d, argument: %d\n", m_ptr->REQUEST, val); #endif switch(m_ptr->REQUEST) { case DSPIORATE: status = dsp_set_speed(val);break; case DSPIOSTEREO: status = dsp_set_stereo(val);break; case DSPIOBITS: status = dsp_set_bits(val);break; case DSPIOSIZE: status = dsp_set_size(val);break; case DSPIOSIGN: status = dsp_set_sign(val);break; case DSPIOMAX: { val = DMA_SIZE; phys_copy(vir2phys(&val), user_phys, (phys_bytes) sizeof(val)); status = OK; };break; case DSPIORESET: status = dsp_reset();break; default: status = ENOTTY;break; } return status; } /*=========================================================================* * dsp_init * *=========================================================================*/ PRIVATE int dsp_init() { int i; if (dsp_reset () != OK) { printf("sb16: No SoundBlaster card detected\n"); return -1; } DspVersion[0] = DspVersion[1] = 0; dsp_command(DSP_GET_VERSION); /* Get DSP version bytes */ for (i = 1000; i; i--) { if (in_byte (DSP_DATA_AVL) & 0x80) { if (DspVersion[0] == 0) DspVersion[0] = in_byte (DSP_READ); else { DspVersion[1] = in_byte (DSP_READ); break; } } } if (DspVersion[0] < 4) { printf("sb16: No SoundBlaster 16 compatible card detected\n"); return -1; } else printf ("sb16: SoundBlaster DSP version %d.%d detected\n", DspVersion[0], DspVersion[1]); /* set IRQ and DMA channels */ w-y-z-{-|-}-~------mixer_set(MIXER_SET_IRQ, (1 << (SB_IRQ / 2 - 1))); mixer_set(MIXER_SET_DMA, (1 << SB_DMA_8 | 1 << SB_DMA_16)); /* register interrupt vector and enable irq */ put_irq_handler(SB_IRQ, dsp_handler); enable_irq(SB_IRQ); DspAvail = 1; return OK; } /*=========================================================================* * dsp_handler * *=========================================================================*/ PRIVATE int dsp_handler(irq) int irq; { #if SB_DEBUG2 printf("SoundBlaster interrupt %d\n", irq); #endif if (DmaDone) /* Dma transfer is done */ { /* Send DSP command to stop dma */ dsp_command((DspBits == 8 ? DSP_CMD_DMA8HALT : DSP_CMD_DMA16HALT)); DmaBusy = 0; /* Dma available again */ } /* Send interrupt to audio task and enable again */ interrupt(SB16); /* Acknowledge the interrupt on the DSP */ (void) in_byte((DspBits == 8 ? DSP_DATA_AVL : DSP_DATA16_AVL)); return 1; } /*=========================================================================* * dsp_command * *=========================================================================*/ PRIVATE int dsp_command(value) int value; { int i; for (i = 0; i < SB_TIMEOUT; i++) { if ((in_byte (DSP_STATUS) & 0x80) == 0) { out_byte (DSP_COMMAND, value); return OK; } } printf ("sb16: SoundBlaster: DSP Command(%x) timeout\n", value); return -1; } /*=========================================================================* * dsp_reset * *=========================================================================*/ PRIVATE int dsp_reset(void) { int i; out_byte (DSP_RESET, 1); for(i =0; i<1000; i++); /* wait a while */ out_byte (DSP_RESET, 0); for (i = 0; i < 1000 && !(in_byte (DSP_DATA_AVL) & 0x80); i++); if (in_byte (DSP_READ) != 0xAA) return EIO; /* No SoundBlaster */ DmaBusy = 0; DmaDone = 1; return OK; } /*=========================================================================* * dsp_set_speed * *=========================================================================*/ static int dsp_set_speed(speed) unsigned int speed; { #if SB_DEBUG printf("sb16: setting speed to %u, stereo = %d\n", speed, DspStereo); #endif if (speed < DSP_MIN_SPEED || speed > DSP_MAX_SPEED) return EPERM; /* Soundblaster 16 can be programmed with real sample rates * instead of time constants * * Since you cannot sample and play at the same time * we set in- and output rate to the same value */ lock(); /* disable interrupts */ dsp_command(DSP_INPUT_RATE); /* set input rate */ dsp_command(speed >> 8); /* high byte of speed */ dsp_command(speed); /* low byte of speed */ dsp_command(DSP_OUTPUT_RATE); /* same for output rate */ dsp_command(speed >> 8); dsp_command(speed); unlock(); /* enable interrupts */ DspSpeed = speed; return OK; } /*=========================================================================* * dsp_set_stereo * *=========================================================================*/ static int dsp_set_stereo(stereo) unsigned int stereo; { if (stereo) DspStereo = 1; else DspStereo = 0; return OK; } /*=========================================================================* * dsp_set_bits * *=========================================================================*/ static int dsp_set_bits(bits) unsigned int bits; { /* Sanity checks */ if (bits != 8 && bits != 16) return EINVAL; DspBits = bits; return OK; } /*=========================================================================* * dsp_set_size * *=========================================================================*/ static int dsp_set_size(size) unsigned int size; { #if SB_DEBUG printf("sb16: set fragment size to %u\n", size); #endif /* Sanity checks */ if (size < DSP_MIN_FRAGMENT_SIZE || size > DSP_MAX_FRAGMENT_SIZE || size % 2 != 0) return EINVAL; DspFragmentSize = size; return OK; } /*=========================================================================* * dsp_set_sign * *=========================================================================*/ static int dsp_set_sign(sign) unsigned int sign; { #if SB_DEBUG printf("sb16: set sign to %u\n", sign); #endif DspSign = (sign > 0 ? 1 : 0); return OK; } /*===========================================================================* * dsp_dma_setup * *===========================================================================*/ PRIVATE void dsp_dma_setup(address, count) phys_bytes address; int count; { #if SB_DEBUG printf("Setting up %d bit DMA\n", DspBits); #endif if (DspBits == 8) /* 8 bit sound */ { count--; lock(); out_byte(DMA8_MASK, SB_DMA_8 | 0x04); /* Disable DMA channel */ out_byte(DMA8_CLEAR, 0x00); /* Clear flip flop */ /* set DMA mode */ out_byte(DMA8_MODE, (DmaMode == DEV_WRITE ? DMA8_AUTO_PLAY : DMA8_AUTO_REC)); out_byte(DMA8_ADDR, address >> 0); /* Low_byte of address */ out_byte(DMA8_ADDR, address >> 8); /* High byte of address */ out_byte(DMA8_PAGE, address >> 16); /* 64K page number */ out_byte(DMA8_COUNT, count >> 0); /* Low byte of count */ out_byte(DMA8_COUNT, count >> 8); /* High byte of count */ out_byte(DMA8_MASK, SB_DMA_8); /* Enable DMA channel */ unlock(); } else /* 16 bit sound */ { count-= 2; lock(); out_byte(DMA16_MASK, (SB_DMA_16 & 3) | 0x04); /* Disable DMA channel */ out_byte(DMA16_CLEAR, 0x00); /* Clear flip flop */ /* Set dma mode */ out_byte(DMA16_MODE, (DmaMode == DEV_WRITE ? DMA16_AUTO_PLAY : DMA16_AUTO_REC)); out_byte(DMA16_ADDR, (address >> 1) & 0xFF); /* Low_byte of address */ out_byte(DMA16_ADDR, (address >> 9) & 0xFF); /* High byte of address */ out_byte(DMA16_PAGE, (address >> 16) & 0xFE); /* 128K page number */ out_byte(DMA16_COUNT, count >> 1); /* Low byte of count */ out_byte(DMA16_COUNT, count >> 9); /* High byte of count */ out_byte(DMA16_MASK, SB_DMA_16 & 3); /* Enable DMA channel */ unlock(); } } /*===========================================================================* * dsp_setup * *===========================================================================*/ PRIVATE void dsp_setup() { /* Set current sample speed */ dsp_set_speed(DspSpeed); /* Put the speaker on */ if (DmaMode == DEV_WRITE) { dsp_command (DSP_CMD_SPKON); /* put speaker on */ /* Program DSP with dma mode */ dsp_command((DspBits == 8 ? DSP_CMD_8BITAUTO_OUT : DSP_CMD_16BITAUTO_OUT)); } else { dsp_command (DSP_CMD_SPKOFF); /* put speaker off */ /* Program DSP with dma mode */ dsp_command((DspBits == 8 ? DSP_CMD_8BITAUTO_IN : DSP_CMD_16BITAUTO_IN)); } /* Program DSP with transfer mode */ if (!DspSign) dsp_command((DspStereo == 1 ? DSP_MODE_STEREO_US : DSP_MODE_MONO_US)); else dsp_command((DspStereo == 1 ? DSP_MODE_STEREO_S : DSP_MODE_MONO_S)); /* Give length of fragment to DSP */ if (DspBits == 8) /* 8 bit transfer */ { /* #bytes - 1 */ dsp_command((DspFragmentSize - 1) >> 0); dsp_command((DspFragmentSize - 1) >> 8); } else /* 16 bit transfer */ { /* #words - 1 */ dsp_command((DspFragmentSize - 1) >> 1); dsp_command((DspFragmentSize - 1) >> 9); } } /*===========================================================================* * dsp_write * *===========================================================================*/ PRIVATE int dsp_write(m_ptr) message *m_ptr; { phys_bytes user_phys; message mess; if (m_ptr->COUNT != DspFragmentSize) return EINVAL; /* From this user address */ user_phys = numap(m_ptr->PROC_NR, (vir_bytes)m_ptr->ADDRESS, DspFragmentSize); if (user_phys == 0) return EINVAL; if (DmaBusy) /* Dma already started */ { if (DmaMode != m_ptr->m_type) return EBUSY; DmaDone = 0; /* No, we're not done yet */ /* Wait for next block to become free */ receive(HARDWARE, &mess); /* Copy first block to dma buffer */ phys_copy(user_phys, DmaPhys, (phys_bytes) DspFragmentSize); } else /* A new dma transfer has started */ { DmaMode = DEV_WRITE; /* Dma mode is writing */ /* Copy fragment to dma buffer */ phys_copy(user_phys, DmaPhys, (phys_bytes) DspFragmentSize); /* Set up the dma chip */ dsp_dma_setup(DmaPhys, DspFragmentSize); /* Set up the DSP */ dsp_setup(); DmaBusy = 1; /* Dma is busy */ } DmaDone = 1; /* dma done for now */ return(DspFragmentSize); } /*===========================================================================* * dsp_read * *===========================================================================*/ PRIVATE int dsp_read(m_ptr) message *m_ptr; { phys_bytes user_phys; message mess; if (m_ptr->COUNT != DspFragmentSize) return EINVAL; /* To this user address */ user_phys = numap(m_ptr->PROC_NR, (vir_bytes)m_ptr->ADDRESS, DspFragmentSize); if (user_phys == 0) return EINVAL; if (DmaBusy) /* Dma already started */ { if (DmaMode != m_ptr->m_type) return EBUSY; DmaDone = 0; /* No, we're not done yet */ /* Wait for a full dma buffer */ receive(HARDWARE, &mess); /* Copy the buffer */ phys_copy(DmaPhys, user_phys, (phys_bytes) DspFragmentSize); } else /* A new dma transfer has started */ { DmaMode = DEV_READ; /* Dma mode is reading */ /* Set up the dma chip */ dsp_dma_setup(DmaPhys, DspFragmentSize); /* Set up the DSP */ dsp_setup(); DmaBusy = 1; /* Dma has started */ DmaDone = 0; /* Dma not done */ /* Wait for dma to finish with first block */ receive(HARDWARE, &mess); /* Copy dma buffer to user */ phys_copy(DmaPhys, user_phys, (phys_bytes) DspFragmentSize); } DmaDone = 1; /* dma done for now */ return(DspFragmentSize); } #endif /* ENABLE_SB16 */ /* This file contains the driver for the mixer on * a SoundBlaster 16 (ASP) soundcard. * * The driver supports the following operations (using message format m2): * * m_type DEVICE PROC_NR COUNT POSITION ADRRESS * ---------------------------------------------------------------- * | DEV_OPEN | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_CLOSE | device | proc nr | | | | * |------------+---------+---------+---------+---------+---------| * | DEV_IOCTL | device | proc nr |func code| | buf_ptr | * ---------------------------------------------------------------- * * The file contains one entry point: * * sb16mixer_task: main entry when system is brought up * * May 20 1995 Author: Michel R. Prevenier */ #include "kernel.h" #include #include #include #include #if __minix_vmd #include "config.h" #endif #include "sb16.h" #if ENABLE_SB16 /* Function prototypes */ FORWARD _PROTOTYPE( int mixer_init, (void)); FORWARD _PROTOTYPE( int mixer_open, (message *m_ptr)); FORWARD _PROTOTYPE( int mixer_close, (message *m_ptr)); FORWARD _PROTOTYPE( int mixer_ioctl, (message *m_ptr)); FORWARD _PROTOTYPE( int mixer_get, (int reg)); FORWARD _PROTOTYPE( int get_set_volume, (message *m_ptr, int flag)); FORWARD _PROTOTYPE( int get_set_input, (message *m_ptr, int flag, int channel)); FORWARD _PROTOTYPE( int get_set_output, (message *m_ptr, int flag)); PRIVATE int mixer_avail = 0; /* Mixer exists? */ /*=========================================================================* * sb16mixer_task * *=========================================================================*/ PUBLIC void sb16mixer_task() { message mess; int err, caller, proc_nr; /* Here is the main loop of the mixer task. It waits for a message, carries * it out, and sends a reply. */ while (TRUE) { receive(ANY, &mess); caller = mess.m_source; proc_nr = mess.PROC_NR; switch (caller) { case HARDWARE: /* Leftover interrupt. */ continue; case FS_PROC_NR: /* The only legitimate caller. */ break; default: printf("sb16: got message from %d\n", caller); continue; } /* Now carry out the work. */ switch(mess.m_type) { case DEV_OPEN: err = mixer_open(&mess);break; case DEV_CLOSE: err = mixer_close(&mess);break; case DEV_IOCTL: err = mixer_ioctl(&mess);break; default: err = EINVAL;break; } /* Finally, prepare and send the reply message. */ mess.m_type = TASK_REPLY; mess.REP_PROC_NR = proc_nr; mess.REP_STATUS = err; /* error code */ send(caller, &mess); /* send reply to caller */ } } /*=========================================================================* * mixer_open * *=========================================================================*/ PRIVATE int mixer_open(m_ptr) message *m_ptr; { #if SB_DEBUG printf("mixer_open\n"); #endif /* try to detect the mixer type */ if (!mixer_avail && !mixer_init() != OK) return EIO; return OK; } /*=========================================================================* * mixer_close * *=========================================================================*/ PRIVATE int mixer_close(m_ptr) message *m_ptr; { #if SB_DEBUG printf("mixer_close\n"); #endif return OK; } /*=========================================================================* * mixer_ioctl * *=========================================================================*/ PRIVATE int mixer_ioctl(m_ptr) message *m_ptr; { int status; #if SB_DEBUG printf("mixer: got ioctl %d\n", m_ptr->REQUEST); #endif switch(m_ptr->REQUEST) { case MIXIOGETVOLUME: status = get_set_volume(m_ptr, 0);break; case MIXIOSETVOLUME: status = get_set_volume(m_ptr, 1);break; case MIXIOGETINPUTLEFT: status = get_set_input(m_ptr, 0, 0);break; case MIXIOGETINPUTRIGHT: status = get_set_input(m_ptr, 0, 1);break; case MIXIOGETOUTPUT: status = get_set_output(m_ptr, 0);break; case MIXIOSETINPUTLEFT: status = get_set_input(m_ptr, 1, 0);break; case MIXIOSETINPUTRIGHT: status = get_set_input(m_ptr, 1, 1);break; case MIXIOSETOUTPUT: status = get_set_output(m_ptr, 1);break; default: status = ENOTTY; } return status; } /*=========================================================================* * mixer_init * *=========================================================================*/ PRIVATE int mixer_init() { /* Try to detect the mixer by writing to MIXER_DAC_LEVEL if the * value written can be read back the mixer is there */ mixer_set(MIXER_DAC_LEVEL, 0x10); /* write something to it */ if (mixer_get(MIXER_DAC_LEVEL) != 0x10) { printf("sb16: Mixer not detected\n"); return EIO; } /* Enable Automatic Gain Control */ mixer_set(MIXER_AGC, 0x01); #if SB_DEBUG printf("Mixer detected\n"); #endif mixer_avail = 1; return OK; } /*=========================================================================* * mixer_set * *=========================================================================*/ PUBLIC int mixer_set(reg, data) int reg; int data; { int i; out_byte(MIXER_REG, reg); for(i=0;i<100;i++); out_byte(MIXER_DATA, data); return OK; } /*=========================================================================* * mixer_get * *=========================================================================*/ PRIVATE int mixer_get(reg) int reg; { int i; out_byte(MIXER_REG, reg); for(i=0;i<100;i++); return (in_byte(MIXER_DATA) & 0xff); } /*=========================================================================* * get_set_volume * *=========================================================================*/ PRIVATE int get_set_volume(m_ptr, flag) message *m_ptr; int flag; /* 0 = get, 1 = set */ { phys_bytes user_phys; struct volume_level level; int cmd_left, cmd_right, shift, max_level; user_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(struct volume_level)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&level), (phys_bytes) sizeof(level)); shift = 3; max_level = 0x1F; switch (level.device) { case Master: { cmd_left = MIXER_MASTER_LEFT; cmd_right = MIXER_MASTER_RIGHT; };break; case Dac: { cmd_left = MIXER_DAC_LEFT; cmd_right = MIXER_DAC_RIGHT; };break; case Fm: { cmd_left = MIXER_FM_LEFT; cmd_right = MIXER_FM_RIGHT; };break; case Cd: { cmd_left = MIXER_CD_LEFT; cmd_right = MIXER_CD_RIGHT; };break; case Line: { cmd_left = MIXER_LINE_LEFT; cmd_right = MIXER_LINE_RIGHT; };break; case Mic: { cmd_left = cmd_right = MIXER_MIC_LEVEL; };break; case Speaker: { cmd_left = cmd_right = MIXER_PC_LEVEL; shift = 6; max_level = 0x03; };break; case Treble: { cmd_left = MIXER_TREBLE_LEFT; cmd_right = MIXER_TREBLE_RIGHT; shift = 4; max_level = 0x0F; };break; case Bass: { cmd_left = MIXER_BASS_LEFT; cmd_right = MIXER_BASS_RIGHT; shift = 4; max_level = 0x0F; };break; default: return EINVAL; } if (flag) /* Set volume level */ { if (level.right < 0) level.right = 0; else if (level.right > max_level) level.right = max_level; if (level.left < 0) level.left = 0; else if (level.left > max_level) level.left = max_level; mixer_set(cmd_right, (level.right << shift)); mixer_set(cmd_left, (level.left << shift)); } else /* Get volume level */ { leve-----l.left = mixer_get(cmd_left); level.right = mixer_get(cmd_right); level.left >>= shift; level.right >>= shift; /* Copy back to user */ phys_copy(vir2phys(&level), user_phys, (phys_bytes) sizeof(level)); } return OK; } /*=========================================================================* * get_set_input * *=========================================================================*/ PRIVATE int get_set_input(m_ptr, flag, channel) message *m_ptr; int flag; /* 0 = get, 1 = set */ int channel; /* 0 = left, 1 = right */ { phys_bytes user_phys; struct inout_ctrl input; int input_cmd, input_mask, mask, del_mask, shift; user_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(struct inout_ctrl)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&input), (phys_bytes) sizeof(input)); input_cmd = (channel == 0 ? MIXER_IN_LEFT : MIXER_IN_RIGHT); mask = mixer_get(input_cmd); switch (input.device) { case Fm: { shift = 5; del_mask = 0x1F; };break; case Cd: { shift = 1; del_mask = 0x79; };break; case Line: { shift = 3; del_mask = 0x67; };break; case Mic: { shift = 0; del_mask = 0x7E; };break; default: return EINVAL; } if (flag) /* Set input */ { input_mask = ((input.left == ON ? 1 : 0) << 1) | (input.right == ON ? 1 : 0); if (shift > 0) input_mask <<= shift; else input_mask >>= 1; mask &= del_mask; mask |= input_mask; mixer_set(input_cmd, mask); } else /* Get input */ { if (shift > 0) { input.left = ((mask >> (shift+1)) & 1 == 1 ? ON : OFF); input.right = ((mask >> shift) & 1 == 1 ? ON : OFF); } else input.left = ((mask & 1) == 1 ? ON : OFF); /* Copy back to user */ phys_copy(vir2phys(&input), user_phys, (phys_bytes) sizeof(input)); } return OK; } /*=========================================================================* * get_set_output * *=========================================================================*/ PRIVATE int get_set_output(m_ptr, flag) message *m_ptr; int flag; /* 0 = get, 1 = set */ { phys_bytes user_phys; struct inout_ctrl output; int output_mask, mask, del_mask, shift; user_phys = numap(m_ptr->PROC_NR, (vir_bytes) m_ptr->ADDRESS, sizeof(struct inout_ctrl)); if (user_phys == 0) return(EFAULT); phys_copy(user_phys, vir2phys(&output), (phys_bytes) sizeof(output)); mask = mixer_get(MIXER_OUTPUT_CTRL); switch (output.device) { case Cd: { shift = 1; del_mask = 0x79; };break; case Line: { shift = 3; del_mask = 0x67; };break; case Mic: { shift = 0; del_mask = 0x7E; };break; default: return EINVAL; } if (flag) /* Set input */ { output_mask = ((output.left == ON ? 1 : 0) << 1) | (output.right == ON ? 1 : 0); if (shift > 0) output_mask <<= shift; else output_mask >>= 1; mask &= del_mask; mask |= output_mask; mixer_set(MIXER_OUTPUT_CTRL, mask); } else /* Get input */ { if (shift > 0) { output.left = ((mask >> (shift+1)) & 1 == 1 ? ON : OFF); output.right = ((mask >> shift) & 1 == 1 ? ON : OFF); } else output.left = ((mask & 1) == 1 ? ON : OFF); /* Copy back to user */ phys_copy(vir2phys(&output), user_phys, (phys_bytes) sizeof(output)); } return OK; } #endif /* ENABLE_SB16 */ ! Miscellaneous constants used in assembler code. W = _WORD_SIZE ! Machine word size. ! Offsets in struct proc. They MUST match proc.h. P_STACKBASE = 0 #if _WORD_SIZE == 2 ESREG = P_STACKBASE #else GSREG = P_STACKBASE FSREG = GSREG + 2 ! 386 introduces FS and GS segments ESREG = FSREG + 2 #endif DSREG = ESREG + 2 DIREG = DSREG + 2 SIREG = DIREG + W BPREG = SIREG + W STREG = BPREG + W ! hole for another SP BXREG = STREG + W DXREG = BXREG + W CXREG = DXREG + W AXREG = CXREG + W RETADR = AXREG + W ! return address for save() call PCREG = RETADR + W CSREG = PCREG + W PSWREG = CSREG + W SPREG = PSWREG + W SSREG = SPREG + W P_STACKTOP = SSREG + W P_LDT_SEL = P_STACKTOP P_LDT = P_LDT_SEL + W #if _WORD_SIZE == 2 Msize = 12 ! size of a message in 16-bit words #else Msize = 9 ! size of a message in 32-bit words #endif /* This file contains the C startup code for Minix on Intel processors. * It cooperates with mpx.s to set up a good environment for main(). * * This code runs in real mode for a 16 bit kernel and may have to switch * to protected mode for a 286. * * For a 32 bit kernel this already runs in protected mode, but the selectors * are still those given by the BIOS with interrupts disabled, so the * descriptors need to be reloaded and interrupt descriptors made. */ #include "kernel.h" #include #include "protect.h" /* Environment strings passed by loader. */ PRIVATE char k_environ[128*sizeof(char *)]; /*==========================================================================* * cstart * *==========================================================================*/ PUBLIC void cstart(cs, ds, mds, parmoff, parmsize) U16_t cs, ds; /* Kernel code and data segment */ U16_t mds; /* Monitor data segment */ U16_t parmoff, parmsize; /* boot parameters offset and length */ { /* Perform system initializations prior to calling main(). */ register char *envp; unsigned mon_start; /* Record where the kernel and the monitor are. */ code_base = seg2phys(cs); data_base = seg2phys(ds); /* Initialize protected mode descriptors. */ prot_init(); /* Copy the boot parameters to kernel memory. */ mon_params = seg2phys(mds) + parmoff; mon_parmsize = parmsize; if (parmsize > sizeof k_environ - 2) parmsize = sizeof k_environ - 2; phys_copy(mon_params, vir2phys(k_environ), (phys_bytes) parmsize); /* Type of VDU: */ envp = getenv("video"); if (strcmp(envp, "ega") == 0) ega = TRUE; if (strcmp(envp, "vga") == 0) vga = ega = TRUE; /* Processor? */ processor = atoi(getenv("processor")); /* 86, 186, 286, 386, ... */ /* XT, AT or MCA bus? */ envp = getenv("bus"); if (envp == NIL_PTR || strcmp(envp, "at") == 0) { pc_at = TRUE; } else if (strcmp(envp, "mca") == 0) { pc_at = ps_mca = TRUE; } /* Decide if mode is protected. */ #if _WORD_SIZE == 2 protected_mode = processor >= 286; if (!protected_mode) mon_return = 0; #endif /* Return to assembler code to switch to protected mode (if 286), reload * selectors and call main(). */ } /*==========================================================================* * getenv * *==========================================================================*/ PUBLIC char *getenv(name) _CONST char *name; { /* Get environment value - kernel version of getenv to avoid setting up the * usual environment array. */ register _CONST char *namep; register char *envp; for (envp = k_environ; *envp != 0;) { for (namep = name; *namep != 0 && *namep == *envp; namep++, envp++) ; if (*namep == '\0' && *envp == '=') return(envp + 1); while (*envp++ != 0) ; } return(NIL_PTR); } /* This task handles the interface between file system and kernel as well as * between memory manager and kernel. System services are obtained by sending * sys_task() a message specifying what is needed. To make life easier for * MM and FS, a library is provided with routines whose names are of the * form sys_xxx, e.g. sys_xit sends the SYS_XIT message to sys_task. The * message types and parameters are: * * SYS_FORK informs kernel that a process has forked * SYS_NEWMAP allows MM to set up a process memory map * SYS_GETMAP allows MM to get a process' memory map * SYS_EXEC sets program counter and stack pointer after EXEC * SYS_XIT informs kernel that a process has exited * SYS_GETSP caller wants to read out some process' stack pointer * SYS_TIMES caller wants to get accounting times for a process * SYS_ABORT MM or FS cannot go on; abort MINIX * SYS_FRESH start with a fresh process image during EXEC (68000 only) * SYS_SENDSIG send a signal to a process (POSIX style) * SYS_SIGRETURN complete POSIX-style signalling * SYS_KILL cause a signal to be sent via MM * SYS_ENDSIG finish up after SYS_KILL-type signal * SYS_COPY request a block of data to be copied between processes * SYS_VCOPY request a series of data blocks to be copied between procs * SYS_GBOOT copies the boot parameters to a process * SYS_MEM returns the next free chunk of physical memory * SYS_UMAP compute the physical address for a given virtual address * SYS_TRACE request a trace operation * SYS_SYSCTL handles miscelleneous kernel control functions * SYS_PUTS a server (MM, FS, ...) wants to issue a diagnostic * SYS_FINDPROC find a process' task number given it's names * * Message types and parameters: * * m_type PROC1 PROC2 PID MEM_PTR * ------------------------------------------------------ * | SYS_FORK | parent | child | pid | | * |------------+---------+---------+---------+---------| * | SYS_NEWMAP | proc nr | | | map ptr | * |------------+---------+---------+---------+---------| * | SYS_EXEC | proc nr | traced | new sp | | * |------------+---------+---------+---------+---------| * | SYS_XIT | parent | exitee | | | * |------------+---------+---------+---------+---------| * | SYS_GETSP | proc nr | | | | * |------------+---------+---------+---------+---------| * | SYS_TIMES | proc nr | | buf ptr | | * |------------+---------+---------+---------+---------| * | SYS_ABORT | | | | | * |------------+---------+---------+---------+---------| * | SYS_FRESH | proc nr | data_cl | | | * |------------+---------+---------+---------+---------| * | SYS_GBOOT | proc nr | | | bootptr | * |------------+---------+---------+---------+---------| * | SYS_GETMAP | proc nr | | | map ptr | * ------------------------------------------------------ * * m_type m1_i1 m1_i2 m1_i3 m1_p1 * ----------------+---------+---------+---------+-------------- * | SYS_VCOPY | src p | dst p | vec siz | vc addr | * |---------------+---------+---------+---------+-------------| * | SYS_SENDSIG | proc nr | | | smp | * |---------------+---------+---------+---------+-------------| * | SYS_SIGRETURN | proc nr | | | scp | * |---------------+---------+---------+---------+-------------| * | SYS_ENDSIG | proc nr | | | | * |---------------+---------+---------+---------+-------------| * | SYS_PUTS | count | | | buf | * ------------------------------------------------------------- * * m_type m2_i1 m2_i2 m2_l1 m2_l2 m2_p1 * --------------------------------------------------------------- * | SYS_TRACE | proc_nr | request | addr | data | | * |------------+---------+---------+---------+---------|--------- * | SYS_SYSCTL | proc_nr | request | | | argp | * --------------------------------------------------------------- * * m_type m6_i1 m6_i2 m6_i3 m6_f1 * ------------------------------------------------------ * | SYS_KILL | proc_nr | sig | | | * ------------------------------------------------------ * * m_type m3_i1 m3_i2 m3_p1 m3_ca1 * -------------------------------------------------- * | SYS_FINDPROC | flags | | | name | * -------------------------------------------------- * * m_type m5_c1 m5_i1 m5_l1 m5_c2 m5_i2 m5_l2 m5_l3 * -------------------------------------------------------------------------- * | SYS_COPY |src seg|src proc|src vir|dst seg|dst proc|dst vir| byte ct | * -------------------------------------------------------------------------- * | SYS_UMAP | seg |proc nr |vir adr| | | | byte ct | * -------------------------------------------------------------------------- * * m_type m1_i1 m1_i2 m1_i3 * |------------+----------+----------+---------- * | SYS_MEM | mem base | mem size | tot mem | * ---------------------------------------------- * * In addition to the main sys_task() entry point, there are 5 other minor * entry points: * cause_sig: take action to cause a signal to occur, sooner or later * inform: tell MM about pending signals * numap: umap D segment starting from process number instead of pointer * umap: compute the physical address for a given virtual address * alloc_segments: allocate segments for 8088 or higher processor */ #include "kernel.h" #include #include #include #include #include #include #include #include #include "proc.h" #if (CHIP == INTEL) #include "protect.h" #endif #include "assert.h" INIT_ASSERT /* PSW masks. */ #define IF_MASK 0x00000200 #define IOPL_MASK 0x003000 PRIVATE message m; FORWARD _PROTOTYPE( int do_abort, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_copy, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_exec, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_fork, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_getsp, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_kill, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_mem, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_newmap, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_sendsig, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_sigreturn, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_endsig, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_times, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_trace, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_umap, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_xit, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_vcopy, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_getmap, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_sysctl, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_puts, (message *m_ptr) ); FORWARD _PROTOTYPE( int do_findproc, (message *m_ptr) ); /*===========================================================================* * sys_task * *===========================================================================*/ PUBLIC void sys_task() { /* Main entry point of sys_task. Get the message and dispatch on type. */ register int r; while (TRUE) { receive(ANY, &m); switch (m.m_type) { /* which system call */ case SYS_FORK: r = do_fork(&m); break; case SYS_NEWMAP: r = do_newmap(&m); break; case SYS_GETMAP: r = do_getmap(&m); break; case SYS_EXEC: r = do_exec(&m); break; case SYS_XIT: r = do_xit(&m); break; case SYS_GETSP: r = do_getsp(&m); break; case SYS_TIMES: r = do_times(&m); break; case SYS_ABORT: r = do_abort(&m); break; case SYS_SENDSIG: r = do_sendsig(&m); break; case SYS_SIGRETURN: r = do_sigreturn(&m); break; case SYS_KILL: r = do_kill(&m); break; case SYS_ENDSIG: r =----------------------------------- do_endsig(&m); break; case SYS_COPY: r = do_copy(&m); break; case SYS_VCOPY: r = do_vcopy(&m); break; case SYS_MEM: r = do_mem(&m); break; case SYS_UMAP: r = do_umap(&m); break; case SYS_TRACE: r = do_trace(&m); break; case SYS_SYSCTL: r = do_sysctl(&m); break; case SYS_PUTS: r = do_puts(&m); break; case SYS_FINDPROC: r = do_findproc(&m); break; default: r = E_BAD_FCN; } m.m_type = r; /* 'r' reports status of call */ send(m.m_source, &m); /* send reply to caller */ } } /*===========================================================================* * do_fork * *===========================================================================*/ PRIVATE int do_fork(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_fork(). m_ptr->PROC1 has forked. The child is m_ptr->PROC2. */ #if (CHIP == INTEL) reg_t old_ldt_sel; #endif register struct proc *rpc; struct proc *rpp; rpp = proc_addr(m_ptr->PROC1); assert(isuserp(rpp)); rpc = proc_addr(m_ptr->PROC2); assert(isemptyp(rpc)); /* Copy parent 'proc' struct to child. */ #if (CHIP == INTEL) old_ldt_sel = rpc->p_ldt_sel; /* stop this being obliterated by copy */ #endif *rpc = *rpp; /* copy 'proc' struct */ #if (CHIP == INTEL) rpc->p_ldt_sel = old_ldt_sel; #endif rpc->p_nr = m_ptr->PROC2; /* this was obliterated by copy */ rpc->p_flags |= NO_MAP; /* inhibit the process from running */ rpc->p_flags &= ~(PENDING | SIG_PENDING | P_STOP); /* Only 1 in group should have PENDING, child does not inherit trace status*/ sigemptyset(&rpc->p_pending); rpc->p_pendcount = 0; rpc->p_pid = m_ptr->PID; /* install child's pid */ rpc->p_reg.retreg = 0; /* child sees pid = 0 to know it is child */ rpc->user_time = 0; /* set all the accounting times to 0 */ rpc->sys_time = 0; rpc->child_utime = 0; rpc->child_stime = 0; return(OK); } /*===========================================================================* * do_newmap * *===========================================================================*/ PRIVATE int do_newmap(m_ptr) message *m_ptr; /* pointer to request message */ { /* Handle sys_newmap(). Fetch the memory map from MM. */ register struct proc *rp; phys_bytes src_phys; int caller; /* whose space has the new map (usually MM) */ int k; /* process whose map is to be loaded */ int old_flags; /* value of flags before modification */ struct mem_map *map_ptr; /* virtual address of map inside caller (MM) */ /* Extract message parameters and copy new memory map from MM. */ caller = m_ptr->m_source; k = m_ptr->PROC1; map_ptr = (struct mem_map *) m_ptr->MEM_PTR; if (!isokprocn(k)) return(E_BAD_PROC); rp = proc_addr(k); /* ptr to entry of user getting new map */ /* Copy the map from MM. */ src_phys = umap(proc_addr(caller), D, (vir_bytes) map_ptr, sizeof(rp->p_map)); assert(src_phys != 0); phys_copy(src_phys, vir2phys(rp->p_map), (phys_bytes) sizeof(rp->p_map)); #if (CHIP != M68000) alloc_segments(rp); #else pmmu_init_proc(rp); #endif old_flags = rp->p_flags; /* save the previous value of the flags */ rp->p_flags &= ~NO_MAP; if (old_flags != 0 && rp->p_flags == 0) lock_ready(rp); return(OK); } /*===========================================================================* * do_getmap * *===========================================================================*/ PRIVATE int do_getmap(m_ptr) message *m_ptr; /* pointer to request message */ { /* Handle sys_getmap(). Report the memory map to MM. */ register struct proc *rp; phys_bytes dst_phys; int caller; /* where the map has to be stored */ int k; /* process whose map is to be loaded */ struct mem_map *map_ptr; /* virtual address of map inside caller (MM) */ /* Extract message parameters and copy new memory map to MM. */ caller = m_ptr->m_source; k = m_ptr->PROC1; map_ptr = (struct mem_map *) m_ptr->MEM_PTR; assert(isokprocn(k)); /* unlikely: MM sends a bad proc nr. */ rp = proc_addr(k); /* ptr to entry of the map */ /* Copy the map to MM. */ dst_phys = umap(proc_addr(caller), D, (vir_bytes) map_ptr, sizeof(rp->p_map)); assert(dst_phys != 0); phys_copy(vir2phys(rp->p_map), dst_phys, sizeof(rp->p_map)); return(OK); } /*===========================================================================* * do_exec * *===========================================================================*/ PRIVATE int do_exec(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_exec(). A process has done a successful EXEC. Patch it up. */ register struct proc *rp; reg_t sp; /* new sp */ phys_bytes phys_name; char *np; #define NLEN (sizeof(rp->p_name)-1) rp = proc_addr(m_ptr->PROC1); assert(isuserp(rp)); /* PROC2 field is used as flag to indicate process is being traced */ if (m_ptr->PROC2) cause_sig(m_ptr->PROC1, SIGTRAP); sp = (reg_t) m_ptr->STACK_PTR; rp->p_reg.sp = sp; /* set the stack pointer */ #if (CHIP == M68000) rp->p_splow = sp; /* set the stack pointer low water */ #ifdef FPP /* Initialize fpp for this process */ fpp_new_state(rp); #endif #endif #if (CHIP == INTEL) /* wipe extra LDT entries */ memset(&rp->p_ldt[EXTRA_LDT_INDEX], 0, (LDT_SIZE - EXTRA_LDT_INDEX) * sizeof(rp->p_ldt[0])); #endif rp->p_reg.pc = (reg_t) m_ptr->IP_PTR; /* set pc */ rp->p_flags &= ~RECEIVING; /* MM does not reply to EXEC call */ if (rp->p_flags == 0) lock_ready(rp); /* Save command name for debugging, ps(1) output, etc. */ phys_name = numap(m_ptr->m_source, (vir_bytes) m_ptr->NAME_PTR, (vir_bytes) NLEN); if (phys_name != 0) { phys_copy(phys_name, vir2phys(rp->p_name), (phys_bytes) NLEN); for (np = rp->p_name; (*np & BYTE) >= ' '; np++) {} *np = 0; } return(OK); } /*===========================================================================* * do_xit * *===========================================================================*/ PRIVATE int do_xit(m_ptr) message *m_ptr; /* pointer to request message */ { /* Handle sys_xit(). A process has exited. */ register struct proc *rp, *rc; struct proc *np, *xp; int parent; /* number of exiting proc's parent */ int proc_nr; /* number of process doing the exit */ phys_clicks base, size; parent = m_ptr->PROC1; /* slot number of parent process */ proc_nr = m_ptr->PROC2; /* slot number of exiting process */ rp = proc_addr(parent); assert(isuserp(rp)); rc = proc_addr(proc_nr); assert(isuserp(rc)); lock(); rp->child_utime += rc->user_time + rc->child_utime; /* accum child times */ rp->child_stime += rc->sys_time + rc->child_stime; unlock(); rc->p_alarm = 0; /* turn off alarm timer */ if (rc->p_flags == 0) lock_unready(rc); strcpy(rc->p_name, ""); /* process no longer has a name */ /* If the process being terminated happens to be queued trying to send a * message (i.e., the process was killed by a signal, rather than it doing an * EXIT), then it must be removed from the message queues. */ if (rc->p_flags & SENDING) { /* Check all proc slots to see if the exiting process is queued. */ for (rp = BEG_PROC_ADDR; rp < END_PROC_ADDR; rp++) { if (rp->p_callerq == NIL_PROC) continue; if (rp->p_callerq == rc) { /* Exiting process is on front of this queue. */ rp->p_callerq = rc->p_sendlink; break; } else { /* See if exiting process is in middle of queue. */ np = rp->p_callerq; while ( ( xp = np->p_sendlink) != NIL_PROC) if (xp == rc) { np->p_sendlink = xp->p_sendlink; break; } else { np = xp; } } } } #if (CHIP == M68000) pmmu_delete(rc); /* we're done remove tables */ #endif if (rc->p_flags & PENDING) --sig_procs; sigemptyset(&rc->p_pending); rc->p_pendcount = 0; rc->p_flags = 0; rc->p_priority = PPRI_NONE; return(OK); } /*===========================================================================* * do_getsp * *===========================================================================*/ PRIVATE int do_getsp(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_getsp(). MM wants to know what sp is. */ register struct proc *rp; rp = proc_addr(m_ptr->PROC1); assert(isuserp(rp)); m_ptr->STACK_PTR = (char *) rp->p_reg.sp; /* return sp here (bad type) */ return(OK); } /*===========================================================================* * do_times * *===========================================================================*/ PRIVATE int do_times(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_times(). Retrieve the accounting information. */ register struct proc *rp; rp = proc_addr(m_ptr->PROC1); /* Insert the times needed by the TIMES system call in the message. */ lock(); /* halt the volatile time counters in rp */ m_ptr->USER_TIME = rp->user_time; m_ptr->SYSTEM_TIME = rp->sys_time; unlock(); m_ptr->CHILD_UTIME = rp->child_utime; m_ptr->CHILD_STIME = rp->child_stime; m_ptr->BOOT_TICKS = get_uptime(); return(OK); } /*===========================================================================* * do_abort * *===========================================================================*/ PRIVATE int do_abort(m_ptr) message *m_ptr; /* pointer to request message */ { /* Handle sys_abort. MINIX is unable to continue. Terminate operation. */ phys_bytes src_phys; vir_bytes len; if (m_ptr->m1_i1 == RBT_MONITOR) { /* The monitor is to run user specified instructions. */ len = m_ptr->m1_i3 + 1; assert(len <= mon_parmsize); src_phys = numap(m_ptr->m1_i2, (vir_bytes) m_ptr->m1_p1, len); assert(src_phys != 0); phys_copy(src_phys, mon_params, (phys_bytes) len); } wreboot(m_ptr->m1_i1); return(OK); /* pro-forma (really EDISASTER) */ } /*===========================================================================* * do_sendsig * *===========================================================================*/ PRIVATE int do_sendsig(m_ptr) message *m_ptr; /* pointer to request message */ { /* Handle sys_sendsig, POSIX-style signal */ struct sigmsg smsg; register struct proc *rp; phys_bytes src_phys, dst_phys; struct sigcontext sc, *scp; struct sigframe fr, *frp; rp = proc_addr(m_ptr->PROC1); assert(isuserp(rp)); /* Get the sigmsg structure into our address space. */ src_phys = umap(proc_addr(MM_PROC_NR), D, (vir_bytes) m_ptr->SIG_CTXT_PTR, (vir_bytes) sizeof(struct sigmsg)); assert(src_phys != 0); phys_copy(src_phys, vir2phys(&smsg), (phys_bytes) sizeof(struct sigmsg)); /* Compute the usr stack pointer value where sigcontext will be stored. */ scp = (struct sigcontext *) smsg.sm_stkptr - 1; /* Copy the registers to the sigcontext structure. */ memcpy(&sc.sc_regs, &rp->p_reg, sizeof(struct sigregs)); /* Finish the sigcontext initialization. */ sc.sc_flags = SC_SIGCONTEXT; sc.sc_mask = smsg.sm_mask; /* Copy the sigcontext structure to the user's stack. */ dst_phys = umap(rp, D, (vir_bytes) scp, (vir_bytes) sizeof(struct sigcontext)); if (dst_phys == 0) return(EFAULT); phys_copy(vir2phys(&sc), dst_phys, (phys_bytes) sizeof(struct sigcontext)); /* Initialize the sigframe structure. */ frp = (struct sigframe *) scp - 1; fr.sf_scpcopy = scp; fr.sf_retadr2= (void (*)()) rp->p_reg.pc; fr.sf_fp = rp->p_reg.fp; rp->p_reg.fp = (reg_t) &frp->sf_fp; fr.sf_scp = scp; fr.sf_code = 0; /* XXX - should be used for type of FP exception */ fr.sf_signo = smsg.sm_signo; fr.sf_retadr = (void (*)()) smsg.sm_sigreturn; /* Copy the sigframe structure to the user's stack. */ dst_phys = umap(rp, D, (vir_bytes) frp, (vir_bytes) sizeof(struct sigframe)); if (dst_phys == 0) return(EFAULT); phys_copy(vir2phys(&fr), dst_phys, (phys_bytes) sizeof(struct sigframe)); /* Reset user registers to execute the signal handler. */ rp->p_reg.sp = (reg_t) frp; rp->p_reg.pc = (reg_t) smsg.sm_sighandler; return(OK); } /*===========================================================================* * do_sigreturn * *===========================================================================*/ PRIVATE int do_sigreturn(m_ptr) register message *m_ptr; { /* POSIX style signals require sys_sigreturn to put things in order before the * signalled process can resume execution */ struct sigcontext sc; register struct proc *rp; phys_bytes src_phys; rp = proc_addr(m_ptr->PROC1); assert(isuserp(rp)); /* Copy in the sigcontext structure. */ src_phys = umap(rp, D, (vir_bytes) m_ptr->SIG_CTXT_PTR, (vir_bytes) sizeof(struct sigcontext)); if (src_phys == 0) return(EFAULT); phys_copy(src_phys, vir2phys(&sc), (phys_bytes) sizeof(struct sigcontext)); /* Make sure that this is not just a jmp_buf. */ if ((sc.sc_flags & SC_SIGCONTEXT) == 0) return(EINVAL); /* Fix up only certain key registers if the compiler doesn't use * register variables within functions containing setjmp. */ if (sc.sc_flags & SC_NOREGLOCALS) { rp->p_reg.retreg = sc.sc_retreg; rp->p_reg.fp = sc.sc_fp; rp->p_reg.pc = sc.sc_pc; rp->p_reg.sp = sc.sc_sp; return (OK); } sc.sc_psw = rp->p_reg.psw; #if (CHIP == INTEL) /* Don't panic kernel if user gave bad selectors. */ sc.sc_cs = rp->p_reg.cs; sc.sc_ds = rp->p_reg.ds; sc.sc_es = rp->p_reg.es; #if _WORD_SIZE == 4 sc.sc_fs = rp->p_reg.fs; sc.sc_gs = rp->p_reg.gs; #endif #endif /* Restore the registers. */ memcpy(&rp->p_reg, (char *)&sc.sc_regs, sizeof(struct sigregs)); return(OK); } /*===========================================================================* * do_kill * *===========================================================================*/ PRIVATE int do_kill(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_kill(). Cause a signal to be sent to a process via MM. * Note that this has nothing to do with the kill (2) system call, this * is how the FS (and possibly other servers) get access to cause_sig to * send a KSIG message to MM */ assert(isuserp(proc_addr(m_ptr->PR))); cause_sig(m_ptr->PR, m_ptr->SIGNUM); return(OK); } /*===========================================================================* * do_endsig * *===========================================================================*/ PRIVATE int do_endsig(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Finish up after a KSIG-type signal, caused by a SYS_KILL message or a call * to cause_sig by a task */ register struct proc *rp; rp = proc_addr(m_ptr->PROC1); if (isemptyp(rp)) return(E_BAD_PROC); /* process already dead? */ assert(isuserp(rp)); /* MM has finished one KSIG. */ if (rp->p_pendcount != 0 && --rp->p_pendcount == 0 && (rp->p_flags &= ~SIG_PENDING) == 0) lock_ready(rp); return(OK); } /*===========================================================================* * do_copy * *===========================================================================*/ PRIVATE int do_copy(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_copy(). Copy data for MM or FS. */ int src_proc, dst_proc, src_space, dst_space; vir_bytes src_vir, dst_vir; phys_bytes src_phys, dst_phys, bytes; /* Dismember the command message. */ src_proc = m_ptr->SRC_PROC_NR; dst_proc = m_ptr->DST_PROC_NR; src_space = m_ptr->SRC_SPACE; dst_space = m_ptr->DST_SPACE; src_vir = (vir_bytes) m_ptr->SRC_BUFFER; dst_vir = (vir_bytes) m_ptr->DST_BUFFER; bytes = (phys_bytes) m_ptr->COPY_BYTES; /* Compute the source and destination addresses and do the copy. */ if (src_proc == ABS) { src_phys = (phys_bytes) m_ptr->SRC_BUFFER; } else { if (bytes != (vir_bytes) bytes) { /* This would happen for 64K segments and 16-bit vir_bytes. * It would happen a lot for do_fork except MM uses ABS * copies for that case. */ panic("overflow in count in do_copy", NO_NUM); } src_phys = umap(proc_addr(src_proc), src_space, src_vir, (vir_bytes) bytes); } if (dst_proc == ABS) { dst_phys = (phys_bytes) m_ptr->DST_BUFFER; } else { dst_phys = umap(proc_addr(dst_proc), dst_space, dst_vir, (vir_bytes) bytes); } if (src_phys == 0 || dst_phys == 0) return(EFAULT); phys_copy(src_phys, dst_phys, bytes); return(OK); } /*===========================================================================* * do_vcopy * *===========================================================================*/ PRIVATE int do_vcopy(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Handle sys_vcopy(). Copy multiple blocks of memory */ int src_proc, dst_proc, vect_s, i; vir_bytes src_vir, dst_vir, vect_addr; phys_bytes src_phys, dst_phys, bytes; cpvec_t cpvec_table[CPVEC_NR]; /* Dismember the command message. */ src_proc = m_ptr->m1_i1; dst_proc = m_ptr->m1_i2; vect_s = m_ptr->m1_i3; vect_addr = (vir_bytes)m_ptr->m1_p1; if (vect_s > CPVEC_NR) return EDOM; src_phys= numap (m_ptr->m_source, vect_addr, vect_s * sizeof(cpvec_t)); if (!src_phys) return EFAULT; phys_copy(src_phys, vir2phys(cpvec_table), (phys_bytes) (vect_s * sizeof(cpvec_t))); for (i = 0; i < vect_s; i++) { src_vir= cpvec_table[i].cpv_src; dst_vir= cpvec_table[i].cpv_dst; bytes= cpvec_table[i].cpv_size; src_phys = numap(src_proc,src_vir,(vir_bytes)bytes); dst_phys = numap(dst_proc,dst_vir,(vir_bytes)bytes); if (src_phys == 0 || dst_phys == 0) return(EFAULT); phys_copy(src_phys, dst_phys, bytes); } return(OK); } /*===========================================================================* * do_mem * *===========================================================================*/ PRIVATE int do_mem(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Return the base and size of the next chunk of memory. */ struct memory *memp; for (memp = mem; memp < &mem[NR_MEMS]; ++memp) { m_ptr->m1_i1 = memp->base; m_ptr->m1_i2 = memp->size; m_ptr->m1_i3 = tot_mem_size; memp->size = 0; if (m_ptr->m1_i2 != 0) break; /* found a chunk */ } return(OK); } /*==========================================================================* * do_umap * *==========================================================================*/ PRIVATE int do_umap(m_ptr) register message *m_ptr; /* pointer to request message */ { /* Same as umap(), for non-kernel processes. */ m_ptr->SRC_BUFFER = umap(proc_addr((int) m_ptr->SRC_PROC_NR), (int) m_ptr->SRC_SPACE, (vir_bytes) m_ptr->SRC_BUFFER, (vir_bytes) m_ptr->COPY_BYTES); return(OK); } /*==========================================================================* * do_trace * *==========================================================================*/ #define TR_PROCNR (m_ptr->m2_i1) #define TR_REQUEST (m_ptr->m2_i2) #define TR_ADDR ((vir_bytes) m_ptr->m2_l1) #define TR_DATA (m_ptr->m2_l2) #define TR_VLSIZE ((vir_bytes) sizeof(long)) PRIVATE int do_trace(m_ptr) register message *m_ptr; { /* Handle the debugging commands supported by the ptrace system call * The commands are: * T_STOP stop the process * T_OK enable tracing by parent for this process * T_GETINS return value from instruction space * T_GETDATA return value from data space * T_GETUSER return value from user process table * T_SETINS set value from instruction space * T_SETDATA set value from data space * T_SETUSER set value in user process table * T_RESUME resume execution * T_EXIT exit * T_STEP set trace bit * * The T_OK and T_EXIT commands are handled completely by the memory manager, * all others come here. */ register struct proc *rp; phys_bytes src, dst; int i; rp = proc_addr(TR_PROCNR); if (isemptyp(rp)) return(EIO); switch (TR_REQUEST) { case T_STOP: /* stop process */ if (rp->p_flags == 0) lock_unready(rp); rp->p_flags |= P_STOP; rp->p_reg.psw &= ~TRACEBIT; /* clear trace bit */ return(OK); case T_GETINS: /* return value from instruction space */ if (rp->p_map[T].mem_len != 0) { if ((src = umap(rp, T, TR_ADDR, TR_VLSIZE)) == 0) return(EIO); phys_copy(src, vir2phys(&TR_DATA), (phys_bytes) sizeof(long)); break; } /* Text space is actually data space - fall through. */ case T_GETDATA: /* return value from data space */ if ((src = umap(rp, D, TR_ADDR, TR_VLSIZE)) == 0) return(EIO); phys_copy(src, vir2phys(&TR_DATA), (phys_bytes) sizeof(long)); break; case T_GETUSER: /* return value from process table */ if ((TR_ADDR & (sizeof(long) - 1)) != 0 || TR_ADDR > sizeof(struct proc) - sizeof(long)) return(EIO); TR_DATA = *(long *) ((char *) rp + (int) TR_ADDR); break; case T_SETINS: /* set value in instruction space */ if (rp->p_map[T].mem_len != 0) { if ((dst = umap(rp, T, TR_ADDR, TR_VLSIZE)) == 0) return(EIO); phys_copy(vir2phys(&TR_DATA), dst, (phys_bytes) sizeof(long)); TR_DATA = 0; break; } /* Text space is actually data space - fall through. */ case T_SETDATA: /* set value in data space */ if ((dst = umap(rp, D, TR_ADDR, TR_VLSIZE)) == 0) return(EIO); phys_copy(vir2phys(&TR_DATA), dst, (phys_bytes) sizeof(long)); TR_DATA = 0; break; case T_SETUSER: /* set value in process table */ if ((TR_ADDR & (sizeof(reg_t) - 1)) != 0 || TR_ADDR > sizeof(struct stackframe_s) - sizeof(reg_t)) return(EIO); i = (int) TR_ADDR; #if (CHIP == INTEL) /* Altering segment registers might crash the kernel when it * tries to load them prior to restarting a process, so do * not allow it. */ if (i == (int) &((struct proc *) 0)->p_reg.cs || i == (int) &((struct proc *) 0)->p_reg.ds || i == (int) &((struct proc *) 0)->p_reg.es || #if _WORD_SIZE == 4 i == (int) &((struct proc *) 0)->p_reg.gs || i == (int) &((struct proc *) 0)->p_reg.fs || #endif i == (int) &((struct proc *) 0)->p_reg.ss) return(EIO); #endif if (i == (int) &((struct proc *) 0)->p_reg.psw) /* only selected bits are changeable */ SETPSW(rp, TR_DATA); else *(reg_t *) ((char *) &rp->p_reg + i) = (reg_t) TR_DATA; TR_DATA = 0; break; case T_RESUME: /* resume execution */ rp->p_flags &= ~P_STOP; if (rp->p_flags == 0) lock_ready(rp); TR_DATA = 0; break; case T_STEP: /* set trace bit */ rp->p_reg.psw |= TRACEBIT; rp->p_flags &= ~P_STOP; if (rp->p_flags == 0) lock_ready(rp); TR_DATA = 0; break; default: return(EIO); } return(OK); } /*===========================================================================* * do_sysctl * *===========================================================================*/ PRIVATE int do_sysctl(m_ptr) message *m_ptr; /* pointer to request message */ { int proc_nr, priv; struct proc *pp; int request; vir_bytes argp; proc_nr = m_ptr->m2_i1; pp = proc_addr(proc_nr); request = m_ptr->m2_i2; priv = m_ptr->m2_i3; argp = (vir_bytes) m_ptr->m2_p1; switch (request) { case SYSSIGNON: { struct systaskinfo info; /* Make this process a server. */ if (!priv || !isuserp(pp)) return(EPERM); info.proc_nr = proc_nr; if (vir_copy(SYSTASK, (vir_bytes) &info, proc_nr, argp, sizeof(info)) != OK) return(EFAULT); pp->p_priority = PPRI_SERVER; pp->p_pid = 0; return(OK); } case SYSGETENV: { /* Obtain a kernel environment string, or simply all of it. */ struct sysgetenv sysgetenv; phys_bytes src, dst; char key[32]; char *val; size_t len; if (vir_copy(proc_nr, argp, SYSTASK, (vir_bytes) &sysgetenv, sizeof(sysgetenv)) != OK) return(EFAULT); if (sysgetenv.keylen != 0) { /* Only one string by name. */ if (sysgetenv.keylen > sizeof(key)) return(EINVAL); if (vir_copy(proc_nr, (vir_bytes) sysgetenv.key, SYSTASK, (vir_bytes) key, sysgetenv.keylen) != OK) return(EFAULT); if ((val = getenv(key)) == NULL) return(ESRCH); src = vir2phys(val); len = strlen(val) + 1; } else { /* Whole environment please. */ src = mon_params; len = mon_parmsize; } dst = umap(pp, D, (vir_bytes) sysgetenv.val, sysgetenv.vallen); if (dst == 0) return(EFAULT); if (len > sysgetenv.vallen) return(E2BIG); phys_copy(src, dst, len); return(OK); } default: return(EINVAL); } } /*==========================================================================* * do_puts * *==========================================================================*/ PRIVATE int do_puts(m_ptr) message *m_ptr; /* pointer to request message */ { /* Print a string for a server. */ char c; vir_bytes src; int count; src = (vir_bytes) m_ptr->m1_p1; for (count = m_ptr->m1_i1; count > 0; count--) { if (vir_copy(m_ptr->m_source, src++, SYSTASK, (vir_bytes) &c, 1) != OK) return(EFAULT); putk(c); } putk(0); return(OK); } /*===========================================================================* * do_findproc * *===========================================================================*/ PRIVATE int do_findproc(m_ptr) message *m_ptr; /* pointer to request message */ { /* Determine the task number of a task given its name. This allows a late * started server such as inet to not know any task numbers, so it can be * used with a kernel whose precise configuration (what task is where?) is * unknown. */ struct proc *pp; for (pp= BEG_PROC_ADDR; ppp_name, m_ptr->m3_ca1, M3_STRING) == 0) { m_ptr->m3_i1 = proc_number(pp); return(OK); } } return(ESRCH); } /*===========================================================================* * cause_sig * *===========================================================================*/ PUBLIC void cause_sig(proc_nr, sig_nr) int proc_nr; /* process to be signalled */ int sig_nr; /* signal to be sent, 1 to _NSIG */ { /* A task wants to send a signal to a process. Examples of such tasks are: * TTY wanting to cause SIGINT upon getting a DEL * CLOCK wanting to cause SIGALRM when timer expires * FS also uses this to send a signal, via the SYS_KILL message. * Signals are handled by sending a message to MM. The tasks don't dare do * that directly, for fear of what would happen if MM were busy. Instead they * call cause_sig, which sets bits in p_pending, and then carefully checks to * see if MM is free. If so, a message is sent to it. If not, when it becomes * free, a message is sent. The process being signaled is blocked while MM * has not seen or finished with all signals for it. These signals are * counted in p_pendcount, and the SIG_PENDING flag is kept nonzero while * there are some. It is not sufficient to ready the process when MM is * informed, because MM can block waiting for FS to do a core dump. */ register struct proc *rp, *mmp; rp = proc_addr(proc_nr); if (sigismember(&rp->p_pending, sig_nr)) return; /* this signal already pending */ sigaddset(&rp->p_pending, sig_nr); ++rp->p_pendcount; /* count new signal pending */ if (rp->p_flags & PENDING) return; /* another signal already pending */ if (rp->p_flags == 0) lock_unready(rp); rp->p_flags |= PENDING | SIG_PENDING; ++sig_procs; /* count new process pending */ mmp = proc_addr(MM_PROC_NR); if ( ((mmp->p_flags & RECEIVING) == 0) || mmp->p_getfrom != ANY) return; inform(); } /*===========================================================================* * inform * *===========================================================================*/ PUBLIC void inform() { /* When a signal is detected by the kernel (e.g., DEL), or generated by a task * (e.g. clock task for SIGALRM), cause_sig() is called to set a bit in the * p_pending field of the process to signal. Then inform() is called to see * if MM is idle and can be told about it. Whenever MM blocks, a check is * made to see if 'sig_procs' is nonzero; if so, inform() is called. */ register struct proc *rp; /* MM is waiting for new input. Find a process with pending signals. */ for (rp = BEG_SERV_ADDR; rp < END_PROC_ADDR; rp++) if (rp->p_flags & PENDING) { m.m_type = KSIG; m.SIG_PROC = proc_number(rp); m.SIG_MAP = rp->p_pending; sig_procs--; if (lock_mini_send(proc_addr(HARDWARE), MM_PROC_NR, &m) != OK) panic("can't inform MM", NO_NUM); sigemptyset(&rp->p_pending); /* the ball is now in MM's court */ rp->p_flags &= ~PENDING;/* remains inhibited by SIG_PENDING */ lock_pick_proc(); /* avoid delay in scheduling MM */ return; } } /*===========================================================================* * umap * *===========================================================================*/ PUBLIC phys_bytes umap(rp, seg, vir_addr, bytes) register struct proc *rp; /* pointer to proc table entry for process */ int seg; /* T, D, or S segment */ vir_bytes vir_addr; /* virtual address in bytes within the seg */ vir_bytes bytes; /* # of bytes to be copied */ { /* Calculate the physical memory address for a given virtual address. */ vir_clicks vc; /* the virtual address in clicks */ phys_bytes pa; /* intermediate variables as phys_bytes */ #if (CHIP == INTEL) phys_bytes seg_base; #endif /* If 'seg' is D it could really be S and vice versa. T really means T. * If the virtual address falls in the gap, it causes a problem. On the * 8088 it is probably a legal stack reference, since "stackfaults" are * not detected by the hardware. On 8088s, the gap is called S and * accepted, but on other machines it is called D and rejected. * The Atari ST behaves like the 8088 in this respect. */ if (bytes <= 0) return( (phys_bytes) 0); vc = (vir_addr + bytes - 1) >> CLICK_SHIFT; /* last click of data */ #if (CHIP == INTEL) || (CHIP == M68000) if (seg != T) seg = (vc < rp->p_map[D].mem_vir + rp->p_map[D].mem_len ? D : S); #else if (seg != T) seg = (vc < rp->p_map[S].mem_vir ? D : S); #endif if((vir_addr>>CLICK_SHIFT) >= rp->p_map[seg].mem_vir+ rp->p_map[seg].mem_len) return( (phys_bytes) 0 ); #if (CHIP == INTEL) seg_base = (phys_bytes) rp->p_map[seg].mem_phys; seg_base = seg_base << CLICK_SHIFT; /* segment origin in bytes */ #endif pa = (phys_bytes) vir_addr; #if (CHIP != M68000) pa -= rp->p_map[seg].mem_vir << CLICK_SHIFT; return(seg_base + pa); #endif #if (CHIP == M68000) pa -= (phys_bytes)rp->p_map[seg].mem_vir << CLICK_SHIFT; pa += (phys_bytes)rp->p_map[seg].mem_phys << CLICK_SHIFT; return(pa); #endif } /*==========================================================================* * numap * *==========================================================================*/ PUBLIC phys_bytes numap(proc_nr, vir_addr, bytes) int proc_nr; /* process number to be mapped */ vir_bytes vir_addr; /* virtual address in bytes within D seg */ vir_bytes bytes; /* # of bytes required in segment */ { /* Do umap() starting from a process number instead of a pointer. This * function is used by device drivers, so they need not know about the * process table. To save time, there is no 'seg' parameter. The segment * is always D. */ return(umap(proc_addr(proc_nr), D, vir_addr, bytes)); } /*==========================================================================* * vir_copy * *==========================================================================*/ PUBLIC int vir_copy(src_proc, src_vir, dst_proc, dst_vir, bytes) int src_proc; /* source process */ vir_bytes src_vir; /* source virtual address within D seg */ int dst_proc; /* destination process */ vir_bytes dst_vir; /* destination virtual address within D seg */ vir_bytes bytes; /* # of bytes to copy */ { /* Copy bytes from one process to another. Meant for the easy cases, where * speed isn't required. (One can normally do without one of the umaps.) */ phys_bytes src_phys, dst_phys; src_phys = umap(proc_addr(src_proc), D, src_vir, bytes); dst_phys = umap(proc_addr(dst_proc), D, dst_vir, bytes); if (src_phys == 0 || dst_phys == 0) return(EFAULT); phys_copy(src_phys, dst_phys, (phys_bytes) bytes); return(OK); } #if (CHIP == INTEL) /*==========================================================================* * alloc_segments * *==========================================================================*/ PUBLIC void alloc_segments(rp) register struct proc *rp; { /* This is called only by do_newmap, but is broken out as a separate function * because so much is hardware-dependent. */ phys_bytes code_bytes; phys_bytes data_bytes; int privilege; if (protected_mode) { data_bytes = (phys_bytes) (rp->p_map[S].mem_vir + rp->p_map[S].mem_len) << CLICK_SHIFT; if (rp->p_map[T].mem_len == 0) code_bytes = data_bytes; /* common I&D, poor protect */ else code_bytes = (phys_bytes) rp->p_map[T].mem_len << CLICK_SHIFT; privilege = istaskp(rp) ? TASK_PRIVILEGE : USER_PRIVILEGE; init_codeseg(&rp->p_ldt[CS_LDT_INDEX], (phys_bytes) rp->p_map[T].mem_phys << CLICK_SHIFT, code_bytes, privilege); init_dataseg(&rp->p_ldt[DS_LDT_INDEX], (phys_bytes) rp->p_map[D].mem_phys << CLICK_SHIFT, data_bytes, privilege); rp->p_reg.cs = (CS_LDT_INDEX * DESC_SIZE) | TI | privilege; #if _WORD_SIZE == 4 rp->p_reg.gs = rp->p_reg.fs = #endif rp->p_reg.ss = rp->p_reg.es = rp->p_reg.ds = (DS_LDT_INDEX*DESC_SIZE) | TI | privilege; } else { rp->p_reg.cs = click_to_hclick(rp->p_map[T].mem_phys); rp->p_reg.ss = rp->p_reg.es = rp->p_reg.ds = click_to_hclick(rp->p_map[D].mem_phys); } } #endif /* (CHIP == INTEL) */ /* The object file of "table.c" contains all the data. In the *.h files, * declared variables appear with EXTERN in front of them, as in * * EXTERN int x; * * Normally EXTERN is defined as extern, so when they are included in another * file, no storage is allocated. If the EXTERN were not present, but just * say, * * int x; * * then including this file in several source files would cause 'x' to be * declared several times. While some linkers accept this, others do not, * so they are declared extern when included normally. However, it must * be declared for real somewhere. That is done here, by redefining * EXTERN as the null string, so the inclusion of all the *.h files in * table.c actually generates storage for them. All the initialized * variables are also declared here, since * * extern int x = 4; * * is not allowed. If such variables are shared, they must also be declared * in one of the *.h files without the initialization. */ #define _TABLE #include "kernel.h" #include #include #include #include "proc.h" #include "tty.h" #include /* The startup routine of each task is given below, from -NR_TASKS upwards. * The order of the names here MUST agree with the numerical values assigned to * the tasks in . */ #define SMALL_STACK (128 * sizeof(char *)) #define TTY_STACK (3 * SMALL_STACK) #define SYN_ALRM_STACK SMALL_STACK #define DP8390_STACK (SMALL_STACK * ENABLE_DP8390) #if (CHIP == INTEL) #define IDLE_STACK ((3+3+4) * sizeof(char *)) /* 3 intr, 3 temps, 4 db */ #else #define IDLE_STACK SMALL_STACK #endif #define PRINTER_STACK (SMALL_STACK * ENABLE_PRINTER) #define CTRLR_STACK (2 * SMALL_STACK) #define SB16_STACK (4 * SMALL_STACK * ENABLE_SB16) #define SB16MIXER_STACK (4 * SMALL_STACK * ENABLE_SB16) #define FLOP_STACK (3 * SMALL_STACK) #define MEM_STACK SMALL_STACK #define CLOCK_STACK SMALL_STACK #define SYS_STACK SMALL_STACK #define HARDWARE_STACK 0 /* dummy task, uses kernel stack */ #define TOT_STACK_SPACE (TTY_STACK + DP8390_STACK + \ SYN_ALRM_STACK + IDLE_STACK + HARDWARE_STACK + PRINTER_STACK + \ NR_CTRLRS * CTRLR_STACK + FLOP_STACK + MEM_STACK + CLOCK_STACK + \ SYS_STACK + SB16_STACK + SB16MIXER_STACK) /* * Some notes about the following table: * 1) The tty_task should always be first so that other tasks can use printf * if their initialisation has problems. * 2) If you add a new kernel task, add it before the printer task. * 3) The task name is used for the process name (p_name). */ PUBLIC struct tasktab tasktab[] = { { tty_task, TTY_STACK, "TTY" }, #if ENABLE_DP8390 { dp8390_task, DP8390_STACK, "DP8390" }, #endif #if ENABLE_SB16 { sb16_task, SB16_STACK, "SB16" }, { sb16mixer_task, SB16MIXER_STACK,"SB16MIX" }, #endif #if ENABLE_PRINTER { printer_task, PRINTER_STACK, "PRINTER" }, #endif #if NR_CTRLRS >= 4 { nop_task, CTRLR_STACK, "(C3)" }, #endif #if NR_CTRLRS >= 3 { nop_task, CTRLR_STACK, "(C2)" }, #endif #if NR_CTRLRS >= 2 { nop_task, CTRLR_STACK, "(C1)" }, #endif #if NR_CTRLRS >= 1 { nop_task, CTRLR_STACK, "(C0)" }, #endif { syn_alrm_task, SYN_ALRM_STACK, "SYN_AL" }, { idle_task, IDLE_STACK, "IDLE" }, { floppy_task, FLOP_STACK, "FLOPPY" }, { mem_task, MEM_STACK, "MEMORY" }, { clock_task, CLOCK_STACK, "CLOCK" }, { sys_task, SYS_STACK, "SYS" }, { 0, HARDWARE_STACK, "HARDWAR" }, { 0, 0, "MM" }, { 0, 0, "FS" }, { 0, 0, "INIT" }, }; /* Mapping from driver names to driver functions, e.g. "bios" -> bios_wini. */ PRIVATE struct drivertab { char drivername[8]; task_t *driver; } drivertab[] = { #if ENABLE_AT_WINI { "at", at_winchester_task }, #endif #if ENABLE_BIOS_WINI { "bios", bios_winchester_task }, #endif #if ENABLE_ESDI_WINI { "esdi", esdi_winchester_task }, #endif #if ENABLE_XT_WINI { "xt", xt_winchester_task }, #endif #if ENABLE_AHA1540_SCSI { "aha1540", aha1540_scsi_task }, #endif #if ENABLE_DOSFILE { "dosfile", dosfile_task }, #endif #if ENABLE_FATFILE { "fatfile", fatfile_task }, #endif }; /*===========================================================================* * mapdrivers * *===========================================================================*/ PUBLIC void mapdrivers() { /* Map drivers to controllers and update the task table to that selection. */ static char name[] = "c0"; int c; struct drivertab *dp; char *drivername; struct tasktab *tp; for (c= 0; c < NR_CTRLRS; c++) { name[1] = '0' + c; if ((drivername = getenv(name)) == NULL) continue; for (dp = drivertab; dp < drivertab + sizeof(drivertab)/sizeof(drivertab[0]); dp++) { if (strcmp(drivername, dp->drivername) == 0) { tp = &tasktab[CTRLR(c) + NR_TASKS]; tp->initial_pc = dp->driver; strcpy(tp->name, drivername); } } } } /* Stack space for all the task stacks. (Declared as (char *) to align it.) */ PUBLIC char *t_stack[TOT_STACK_SPACE / sizeof(char *)]; /* * The number of kernel tasks must be the same as NR_TASKS. * If NR_TASKS is not correct then you will get the compile error: * "array size is negative" */ #define NKT (sizeof tasktab / sizeof (struct tasktab) - (INIT_PROC_NR + 1)) extern int dummy_tasktab_check[NR_TASKS == NKT ? 1 : -1]; /* tty.h - Terminals */ #define TTY_IN_BYTES 256 /* tty input queue size */ #define TAB_SIZE 8 /* distance between tab stops */ #define TAB_MASK 7 /* mask to compute a tab stop position */ #define ESC '\33' /* escape */ #define O_NOCTTY 00400 /* from , or cc will choke */ #define O_NONBLOCK 04000 typedef _PROTOTYPE( void (*devfun_t), (struct tty *tp) ); typedef _PROTOTYPE( void (*devfunarg_t), (struct tty *tp, int c) ); typedef struct tty { int tty_events; /* set when TTY should inspect this line */ /* Input queue. Typed characters are stored here until read by a program. */ u16_t *tty_inhead; /* pointer to place where next char goes */ u16_t *tty_intail; /* pointer to next char to be given to prog */ int tty_incount; /* # chars in the input queue */ int tty_eotct; /* number of "line breaks" in input queue */ devfun_t tty_devread; /* routine to read from low level buffers */ devfun_t tty_icancel; /* cancel any device input */ int tty_min; /* minimum requested #chars in input queue */ clock_t tty_time; /* time when the input is available */ struct tty *tty_timenext; /* for a list of ttys with active timers */ /* Output section. */ devfun_t tty_devwrite; /* routine to start actual device output */ devfunarg_t tty_echo; /* routine to echo characters input */ devfun_t tty_ocancel; /* cancel any ongoing device output */ devfun_t tty_break; /* let the device send a break */ /* Terminal parameters and status. */ int tty_position; /* current position on the screen for echoing */ char tty_reprint; /* 1 when echoed input messed up, else 0 */ char tty_escaped; /* 1 when LNEXT (^V) just seen, else 0 */ char tty_inhibited; /* 1 when STOP (^S) just seen (stops output) */ char tty_pgrp; /* slot number of controlling process */ char tty_openct; /* count of number of opens of this tty */ /* Information about incomplete I/O requests is stored here. */ char tty_inrepcode; /* reply code, TASK_REPLY or REVIVE */ char tty_incaller; /* process that made the call (usually FS) */ char tty_inproc; /* process that wants to read from tty */ vir_bytes tty_in_vir; /* virtual address where data is to go */ int tty_inleft; /* how many chars are still needed */ int tty_incum; /* # chars input so far */ char tty_outrepcode; /* reply code, TASK_REPLY or REVIVE */ char tty_outcaller; /* process that made the call (usually FS) */ char tty_outproc; /* process that wants to write to tty */ vir_bytes tty_out_vir; /* virtual address where data comes from */ int tty_outleft; /* # chars yet to be output */ int tty_outcum; /* # chars output so far */ char tty_iocaller; /* process that made the call (usually FS) */ char tty_ioproc; /* process that wants to do an ioctl */ int tty_ioreq; /* ioctl request code */ vir_bytes tty_iovir; /* virtual address of ioctl buffer */ /* Miscellaneous. */ devfun_t tty_ioctl; /* set line speed, etc. at the device level */ devfun_t tty_close; /* tell the device that the tty is closed */ void *tty_priv; /* pointer to per device private data */ struct termios tty_termios; /* terminal attributes */ struct winsize tty_winsize; /* window size (#lines and #columns) */ u16_t tty_inbuf[TTY_IN_BYTES];/* tty input buffer */ } tty_t; EXTERN tty_t tty_table[NR_CONS+NR_RS_LINES+NR_PTYS]; /* Values for the fields. */ #define NOT_ESCAPED 0 /* previous character is not LNEXT (^V) */ #define ESCAPED 1 /* previous character was LNEXT (^V) */ #define RUNNING 0 /* no STOP (^S) has been typed to stop output */ #define STOPPED 1 /* STOP (^S) has been typed to stop output */ /* Fields and flags on characters in the input queue. */ #define IN_CHAR 0x00FF /* low 8 bits are the character itself */ #define IN_LEN 0x0F00 /* length of char if it has been echoed */ #define IN_LSHIFT 8 /* length = (c & IN_LEN) >> IN_LSHIFT */ #define IN_EOT 0x1000 /* char is a line break (^D, LF) */ #define IN_EOF 0x2000 /* char is EOF (^D), do not return to user */ #define IN_ESC 0x4000 /* escaped by LNEXT (^V), no interpretation */ /* Times and timeouts. */ #define TIME_NEVER ((clock_t) -1 < 0 ? (clock_t) LONG_MAX : (clock_t) -1) #define force_timeout() ((void) (tty_timeout = 0)) EXTERN tty_t *tty_timelist; /* list of ttys with active timers */ /* Number of elements and limit of a buffer. */ #define buflen(buf) (sizeof(buf) / sizeof((buf)[0])) #define bufend(buf) ((buf) + buflen(buf)) #ifndef TYPE_H #define TYPE_H typedef _PROTOTYPE( void task_t, (void) ); typedef _PROTOTYPE( int (*rdwt_t), (message *m_ptr) ); typedef _PROTOTYPE( void (*watchdog_t), (void) ); struct tasktab { task_t *initial_pc; int stksize; char name[8]; }; struct memory { phys_clicks base; phys_clicks size; }; /* Administration for clock polling. */ struct milli_state { unsigned long accum_count; /* accumulated clock ticks */ unsigned prev_count; /* previous clock value */ }; #if (CHIP == INTEL) typedef unsigned port_t; typedef unsigned reg_t; /* machine register */ /* The stack frame layout is determined by the software, but for efficiency * it is laid out so the assembly code to use it is as simple as possible. * 80286 protected mode and all real modes use the same frame, built with * 16-bit registers. Real mode lacks an automatic stack switch, so little * is lost by using the 286 frame for it. The 386 frame differs only in * having 32-bit registers and more segment registers. The same names are * used for the larger registers to avoid differences in the code. */ struct stackframe_s { /* proc_ptr points here */ #if _WORD_SIZE == 4 u16_t gs; /* last item pushed by save */ u16_t fs; /* ^ */ #endif u16_t es; /* | */ u16_t ds; /* | */ reg_t di; /* di through cx are not accessed in C */ reg_t si; /* order is to match pusha/popa */ reg_t fp; /* bp */ reg_t st; /* hole for another copy of sp */ reg_t bx; /* | */ reg_t dx; /* | */ reg_t cx; /* | */ reg_t retreg; /* ax and above are all pushed by save */ reg_t retadr; /* return address for assembly code save() */ reg_t pc; /* ^ last item pushed by interrupt */ reg_t cs; /* | */ reg_t psw; /* | */ reg_t sp; /* | */ reg_t ss; /* these are pushed by CPU during interrupt */ }; struct segdesc_s { /* segment descriptor for protected mode */ u16_t limit_low; u16_t base_low; u8_t base_middle; u8_t access; /* |P|DL|1|X|E|R|A| */ u8_t granularity; /* |G|X|0|A|LIMT| */ u8_t base_high; }; typedef _PROTOTYPE( int (*irq_handler_t), (int irq) ); #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) typedef _PROTOTYPE( void (*dmaint_t), (void) ); typedef u32_t reg_t; /* machine register */ /* The name and fields of this struct were chosen for PC compatibility. */ struct stackframe_s { reg_t retreg; /* d0 */ reg_t d1; reg_t d2; reg_t d3; reg_t d4; reg_t d5; reg_t d6; reg_t d7; reg_t a0; reg_t a1; reg_t a2; reg_t a3; reg_t a4; reg_t a5; reg_t fp; /* also known as a6 */ reg_t sp; /* also known as a7 */ reg_t pc; u16_t psw; u16_t dummy; /* make size multiple of reg_t for system.c */ }; struct fsave { struct cpu_state { u16_t i_format; u32_t i_addr; u16_t i_state[4]; } cpu_state; struct state_frame { u8_t frame_type; u8_t frame_size; u16_t reserved; u8_t frame[212]; } state_frame; struct fpp_model { u32_t fpcr; u32_t fpsr; u32_t fpiar; struct fpN { u32_t high; u32_t low; u32_t mid; } fpN[8]; } fpp_model; }; #endif /* (CHIP == M68000) */ #endif /* TYPE_H */ /* wdeth.c Created: March 14, 1994 by Philip Homburg */ #include "kernel.h" #include #include #include "assert.h" INIT_ASSERT #include "dp8390.h" #include "wdeth.h" #if (ENABLE_DP8390 && ENABLE_WDETH) || __minix_vmd #define WET_ETHERNET 0x01 /* Ethernet transceiver */ #define WET_STARLAN 0x02 /* Starlan transceiver */ #define WET_INTERF_CHIP 0x04 /* has a WD83C583 interface chip */ #define WET_BRD_16BIT 0x08 /* 16 bit board */ #define WET_SLT_16BIT 0x10 /* 16 bit slot */ #define WET_790 0x20 /* '790 chip */ static int we_int_table[8]= { 9, 3, 5, 7, 10, 11, 15, 4 }; static int we_790int_table[8]= { 0, 9, 3, 5, 7, 10, 11, 15 }; _PROTOTYPE( static void we_init, (dpeth_t *dep) ); _PROTOTYPE( static void we_stop, (dpeth_t *dep) ); _PROTOTYPE( static int we_aliasing, (dpeth_t *dep) ); _PROTOTYPE( static int we_interface_chip, (dpeth_t *dep) ); _PROTOTYPE( static int we_16bitboard, (dpeth_t *dep) ); _PROTOTYPE( static int we_16bitslot, (dpeth_t *dep) ); _PROTOTYPE( static int we_ultra, (dpeth_t *dep) ); /*===========================================================================* * wdeth_probe * *===========================================================================*/ int wdeth_probe(dep) dpeth_t *dep; { int sum; if (dep->de_linmem == 0) return 0; /* No shared memory, so no WD board */ sum = inb_we(dep, EPL_EA0) + inb_we(dep, EPL_EA1) + inb_we(dep, EPL_EA2) + inb_we(dep, EPL_EA3) + inb_we(dep, EPL_EA4) + inb_we(dep, EPL_EA5) + inb_we(dep, EPL_TLB) + inb_we(dep, EPL_CHKSUM); if ((sum & 0xFF) != 0xFF) return 0; /* No ethernet board at this address */ dep->de_initf= we_init; dep->de_stopf= we_stop; dep->de_prog_IO= 0; return 1; } /*===========================================================================* * we_init * *===========================================================================*/ static void we_init(dep) dpeth_t *dep; { int i, int_indx, int_nr; int tlb, rambit, revision; int icr, irr, hwr, b, gcr; int we_type; int sendq_nr; assert(dep->de_mode == DEM_ENABLED); assert(!(dep->de_flags & DEF_ENABLED)); dep->de_address.ea_addr[0] = inb_we(dep, EPL_EA0); dep->de_address.ea_addr[1] = inb_we(dep, EPL_EA1); dep->de_address.ea_addr[2] = inb_we(dep, EPL_EA2); dep->de_address.ea_addr[3] = inb_we(dep, EPL_EA3); dep->de_address.ea_addr[4] = inb_we(dep, EPL_EA4); dep->de_address.ea_addr[5] = inb_we(dep, EPL_EA5); dep->de_dp8390_port= dep->de_base_port + EPL_DP8390; dep->de_16bit= 0; we_type= 0; we_type |= WET_ETHERNET; /* assume ethernet */ if (we_ultra(dep)) we_type |= WET_790; if (!we_aliasing(dep)) { if (we_interface_chip(dep)) we_type |= WET_INTERF_CHIP; if (we_16bitboard(dep)) { we_type |= WET_BRD_16BIT; if (we_16bitslot(dep)) we_type |= WET_SLT_16BIT; } } if (we_type & WET_SLT_16BIT) dep->de_16bit= 1; /* look at the on board ram size. */ tlb= inb_we(dep, EPL_TLB); revision= tlb & E_TLB_REV; rambit= tlb & E_TLB_RAM; if (dep->de_ramsize != 0) { /* size set from boot environment. */ } else if (revision < 2) { dep->de_ramsize= 0x2000; /* 8K */ if (we_type & WET_BRD_16BIT) dep->de_ramsize= 0x4000; /* 16K */ else if ((we_type & WET_INTERF_CHIP) && inb_we(dep, EPL_ICR) & E_ICR_MEMBIT) { dep->de_ramsize= 0x8000; /* 32K */ } } else { if (we_type & WET_BRD_16BIT) { /* 32K or 16K */ dep->de_ramsize= rambit ? 0x8000 : 0x4000; } else { /* 32K or 8K */ dep->de_ramsize= rambit ? 0x8000 : 0x2000; } } if (we_type & WET_790) { outb_we(dep, EPL_MSR, E_MSR_RESET); if ((we_type & (WET_BRD_16BIT|WET_SLT_16BIT)) == (WET_BRD_16BIT|WET_SLT_16BIT)) { outb_we(dep, EPL_LAAR, E_LAAR_LAN16E | E_LAAR_MEM16E); } } else if (we_type & WET_BRD_16BIT) { if (we_type & WET_SLT_16BIT) { outb_we(dep, EPL_LAAR, E_LAAR_A19 | E_LAAR_SOFTINT | E_LAAR_LAN16E | E_LAAR_MEM16E); } else { outb_we(dep, EPL_LAAR, E_LAAR_A19 | E_LAAR_SOFTINT | E_LAAR_LAN16E); } } if (we_type & WET_790) { outb_we(dep, EPL_MSR, E_MSR_MENABLE); hwr= inb_we(dep, EPL_790_HWR); outb_we(dep, EPL_790_HWR, hwr | E_790_HWR_SWH); b= inb_we(dep, EPL_790_B); outb_we(dep, EPL_790_B, ((dep->de_linmem >> 13) & 0x0f) | ((dep->de_linmem >> 11) & 0x40) | (b & 0xb0)); outb_we(dep, EPL_790_HWR, hwr & ~E_790_HWR_SWH); } else { outb_we(dep, EPL_MSR, E_MSR_RESET); outb_we(dep, EPL_MSR, E_MSR_MENABLE | ((dep->de_linmem >> 13) & E_MSR_MEMADDR)); } if ((we_type & WET_INTERF_CHIP) && !(we_type & WET_790)) { icr= inb_we(dep, EPL_ICR); irr= inb_we(dep, EPL_IRR); int_indx= (icr & E_ICR_IR2) | ((irr & (E_IRR_IR0|E_IRR_IR1)) >> 5); int_nr= we_int_table[int_indx]; #if DEBUG { printf("%s: encoded irq= %d\n", dep->de_name, int_nr); } #endif if (dep->de_irq & DEI_DEFAULT) dep->de_irq= int_nr; outb_we(dep, EPL_IRR, irr | E_IRR_IEN); } if (we_type & WET_790) { hwr= inb_we(dep, EPL_790_HWR); outb_we(dep, EPL_790_HWR, hwr | E_790_HWR_SWH); gcr= inb_we(dep, EPL_790_GCR); outb_we(dep, EPL_790_HWR, hwr & ~E_790_HWR_SWH); int_indx= ((gcr & E_790_GCR_IR2) >> 4) | ((gcr & (E_790_GCR_IR1|E_790_GCR_IR0)) >> 2); int_nr= we_790int_table[int_indx]; #if DEBUG { printf("%s: encoded irq= %d\n", dep->de_name, int_nr); } #endif if (dep->de_irq & DEI_DEFAULT) dep->de_irq= int_nr; icr= inb_we(dep, EPL_790_ICR); outb_we(dep, EPL_790_ICR, icr | E_790_ICR_EIL); } /* Strip the "default flag." */ dep->de_irq &= ~DEI_DEFAULT; if (!debug) { printf("%s: WD80%d3 at %X:%d:%lX\n", dep->de_name, we_type & WET_BRD_16BIT ? 1 : 0, dep->de_base_port, dep->de_irq, dep->de_linmem); } else { printf("%s: Western Digital %s%s card %s%s at I/O " "address 0x%X, memory address 0x%lX, " "memory size 0x%X, irq %d\n", dep->de_name, we_type & WET_BRD_16BIT ? "16-bit " : "", we_type & WET_ETHERNET ? "Ethernet" : we_type & WET_STARLAN ? "Starlan" : "Network", we_type & WET_INTERF_CHIP ? "with an interface chip " : "", we_type & WET_SLT_16BIT ? "in a 16-bit slot " : "", dep->de_base_port, dep->de_linmem, dep->de_ramsize, dep->de_irq); } dep->de_offset_page= 0; /* Shared memory starts at 0 */ /* Allocate one send buffer (1.5KB) per 8KB of on board memory. */ sendq_nr= dep->de_ramsize / 0x2000; if (sendq_nr < 1) sendq_nr= 1; else if (sendq_nr > SENDQ_NR) sendq_nr= SENDQ_NR; dep->de_sendq_nr= sendq_nr; for (i= 0; ide_sendq[i].sq_sendpage= i*SENDQ_PAGES; dep->de_startpage= i*SENDQ_PAGES; dep->de_stoppage= dep->de_ramsize / DP_PAGESIZE; } /*===========================================================================* * we_stop * *===========================================================================*/ static void we_stop(dep) dpeth_t *dep; { if (dep->de_16bit) outb_we(dep, EPL_LAAR, E_LAAR_A19 | E_LAAR_LAN16E); outb_we(dep, EPL_MSR, E_MSR_RESET); outb_we(dep, EPL_MSR, 0); } /*===========================================================================* * we_aliasing * *===========================================================================*/ static int we_aliasing(dep) dpeth_t *dep; { /* Determine whether wd8003 hardware performs register aliasing. This implies * an old WD8003E board. */ if (inb_we(dep, EPL_REG1) != inb_we(dep, EPL_EA1)) return 0; if (inb_we(dep, EPL_REG2) != inb_we(dep, EPL_EA2)) return 0; if (inb_we(dep, EPL_REG3) != inb_we(dep, EPL_EA3)) return 0; if (inb_we(dep, EPL_REG4) != inb_we(dep, EPL_EA4)) return 0; if (inb_we(dep, EPL_REG7) != inb_we(dep, EPL_CHKSUM)) return 0; return 1; } /*===========================================================================* * we_interface_chip * *===========================================================================*/ static int we_interface_chip(dep) dpeth_t *dep; { /* Determine if the board has an interface chip. */ outb_we(dep, EPL_GP2, 0x35); if (inb_we(dep, EPL_GP2) != 0x35) return 0; outb_we(dep, EPL_GP2, 0x3A); if (inb_we(dep, EPL_GP2) != 0x3A) return 0; return 1; } /*============================---===============================================* * we_16bitboard * *===========================================================================*/ static int we_16bitboard(dep) dpeth_t *dep; { /* Determine whether the board is capable of doing 16 bit memory moves. * If the 16 bit enable bit is unchangable by software we'll assume an * 8 bit board. */ int icr; u8_t tlb; icr= inb_we(dep, EPL_ICR); outb_we(dep, EPL_ICR, icr ^ E_ICR_16BIT); if (inb_we(dep, EPL_ICR) == icr) { tlb= inb_we(dep, EPL_TLB); #if DEBUG printf("%s: tlb= 0x%x\n", dep->de_name, tlb); #endif return tlb == E_TLB_EB || tlb == E_TLB_E || tlb == E_TLB_SMCE || tlb == E_TLB_SMC8216C; } outb_we(dep, EPL_ICR, icr); return 1; } /*===========================================================================* * we_16bitslot * *===========================================================================*/ static int we_16bitslot(dep) dpeth_t *dep; { /* Determine if the 16 bit board in plugged into a 16 bit slot. */ return !!(inb_we(dep, EPL_ICR) & E_ICR_16BIT); } /*===========================================================================* * we_ultra * *===========================================================================*/ static int we_ultra(dep) dpeth_t *dep; { /* Determine if we has an '790 chip. */ u8_t tlb; tlb= inb_we(dep, EPL_TLB); return tlb == E_TLB_SMC8216C; } #endif /* ENABLE_DP8390 && ENABLE_WDETH */ /* * $PchId: wdeth.c,v 1.6 1996/01/19 22:51:37 philip Exp $ */ /* wdeth.h Created: before Dec 28, 1992 by Philip Homburg */ #ifndef WDETH_H #define WDETH_H /* Western Digital Ethercard Plus, or WD8003E card. */ #define EPL_REG0 0x0 /* Control(write) and status(read) */ #define EPL_REG1 0x1 #define EPL_REG2 0x2 #define EPL_REG3 0x3 #define EPL_REG4 0x4 #define EPL_REG5 0x5 #define EPL_REG6 0x6 #define EPL_REG7 0x7 #define EPL_EA0 0x8 /* Most significant eaddr byte */ #define EPL_EA1 0x9 #define EPL_EA2 0xA #define EPL_EA3 0xB #define EPL_EA4 0xC #define EPL_EA5 0xD /* Least significant eaddr byte */ #define EPL_TLB 0xE #define EPL_CHKSUM 0xF /* sum from epl_ea0 upto here is 0xFF */ #define EPL_DP8390 0x10 /* NatSemi chip */ #define EPL_MSR EPL_REG0 /* memory select register */ #define EPL_ICR EPL_REG1 /* interface configuration register */ #define EPL_IRR EPL_REG4 /* interrupt request register (IRR) */ #define EPL_790_HWR EPL_REG4 /* '790 hardware support register */ #define EPL_LAAR EPL_REG5 /* LA address register (write only) */ #define EPL_790_ICR EPL_REG6 /* '790 interrupt control register */ #define EPL_GP2 EPL_REG7 /* general purpose register 2 */ #define EPL_790_B EPL_EA3 /* '790 memory register */ #define EPL_790_GCR EPL_EA5 /* '790 General Control Register */ /* Bits in EPL_MSR */ #define E_MSR_MEMADDR 0x3F /* Bits SA18-SA13, SA19 implicit 1 */ #define E_MSR_MENABLE 0x40 /* Memory Enable */ #define E_MSR_RESET 0x80 /* Software Reset */ /* Bits in EPL_ICR */ #define E_ICR_16BIT 0x01 /* 16 bit bus */ #define E_ICR_IR2 0x04 /* bit 2 of encoded IRQ */ #define E_ICR_MEMBIT 0x08 /* 583 mem size mask */ /* Bits in EPL_IRR */ #define E_IRR_IR0 0x20 /* bit 0 of encoded IRQ */ #define E_IRR_IR1 0x40 /* bit 1 of encoded IRQ */ #define E_IRR_IEN 0x80 /* enable interrupts */ /* Bits in EPL_LAAR */ #define E_LAAR_A19 0x01 /* address lines for above 1M ram */ #define E_LAAR_A20 0x02 /* address lines for above 1M ram */ #define E_LAAR_A21 0x04 /* address lines for above 1M ram */ #define E_LAAR_A22 0x08 /* address lines for above 1M ram */ #define E_LAAR_A23 0x10 /* address lines for above 1M ram */ #define E_LAAR_SOFTINT 0x20 /* enable software interrupt */ #define E_LAAR_LAN16E 0x40 /* enables 16 bit RAM for LAN */ #define E_LAAR_MEM16E 0x80 /* enables 16 bit RAM for host */ /* Bits and values in EPL_TLB */ #define E_TLB_EB 0x05 /* WD8013EB */ #define E_TLB_E 0x27 /* WD8013 Elite */ #define E_TLB_SMCE 0x29 /* SMC Elite 16 */ #define E_TLB_SMC8216C 0x2B /* SMC 8216 C */ #define E_TLB_REV 0x1F /* revision mask */ #define E_TLB_SOFT 0x20 /* soft config */ #define E_TLB_RAM 0x40 /* extra ram bit */ /* Bits in EPL_790_HWR */ #define E_790_HWR_SWH 0x80 /* switch register set */ /* Bits in EPL_790_ICR */ #define E_790_ICR_EIL 0x01 /* enable interrupts */ /* Bits in EPL_790_GCR when E_790_HWR_SWH is set in EPL_790_HWR */ #define E_790_GCR_IR0 0x04 /* bit 0 of encoded IRQ */ #define E_790_GCR_IR1 0x08 /* bit 1 of encoded IRQ */ #define E_790_GCR_IR2 0x40 /* bit 2 of encoded IRQ */ #define inb_we(dep, reg) (in_byte(dep->de_base_port+reg)) #define outb_we(dep, reg, data) (out_byte(dep->de_base_port+reg, data)) #endif /* WDETH_H */ /* * $PchId: wdeth.h,v 1.4 1995/12/22 08:36:57 philip Exp $ */ /* This file contains the "DOS file as disk" driver. Author: Kees J. Bot * It uses MS-DOS calls to read or write a large DOS 4 May 1998 * file that is used as a Minix disk. Minix will have to * be started under DOS for this to work, of course. * * The file contains two entry points: * * dosfile_task: main entry when system is brought up * dosfile_stop: called on halt or reboot to close DOS files */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #include #include #if ENABLE_DOSFILE /* Limit byte count to something DOS will find reasonable. */ #define MAX_COUNT MIN(DMA_BUF_SIZE, 16384) /* Parameters for the disk drive. */ #define MAX_DRIVES 4 /* this driver supports this many "drives" */ #define NR_DEVICES (MAX_DRIVES * DEV_PER_DRIVE) /* Variables. */ PRIVATE struct drive { /* main drive struct, one entry per drive */ unsigned long curpos; /* current position within the "disk" */ unsigned clustersize; /* cluster size of the drive the file is on */ unsigned open_ct; /* in-use count */ int dfd; /* DOS file descriptor if open_ct > 0 */ char rw; /* opened read-write? */ struct device part[DEV_PER_DRIVE]; /* disks and partitions */ } drive[MAX_DRIVES], *d_dr; PRIVATE int d_drive; /* selected drive */ PRIVATE struct device *d_dv; /* device's base and size */ FORWARD _PROTOTYPE( struct device *d_prepare, (int device) ); FORWARD _PROTOTYPE( char *d_name, (void) ); FORWARD _PROTOTYPE( int d_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( int d_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int d_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void dosclose, (int handle) ); FORWARD _PROTOTYPE( char *doserror, (unsigned err) ); FORWARD _PROTOTYPE( void d_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver d_dtab = { d_name, /* current device's name */ d_do_open, /* open or mount request, initialize device */ d_do_close, /* release device */ do_diocntl, /* get or set a partition's geometry */ d_prepare, /* prepare for I/O on a given minor device */ d_transfer, /* do the I/O */ nop_cleanup, /* no cleanup needed */ d_geometry /* tell the geometry of the disk */ }; /*===========================================================================* * dosfile_task * *===========================================================================*/ PUBLIC void dosfile_task() { driver_task(&d_dtab); } /*===========================================================================* * d_prepare * *===========================================================================*/ PRIVATE struct device *d_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DEVICES) { /* d0, d0p[0-3], d1, ... */ d_drive = device / DEV_PER_DRIVE; /* save drive number */ d_dr = &drive[d_drive]; d_dv = &d_dr->part[device % DEV_PER_DRIVE]; } else { return(NIL_DEV); } return(d_drive < MAX_DRIVES ? d_dv : NIL_DEV); } /*===========================================================================* * d_name * *===========================================================================*/ PRIVATE char *d_name() { /* Return a name for the current device. */ static char name[] = "dosfile-d0"; name[9] = '0' + d_drive; return name; } /*===========================================================================* * d_transfer * *===========================================================================*/ PRIVATE int d_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { struct drive *dr = d_dr; iovec_t *iop, *iov_end = iov + nr_req; unsigned nbytes, count, chunk; unsigned long pos; unsigned long dv_size = cv64ul(d_dv->dv_size); phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) { if (nbytes + iop->iov_size > MAX_COUNT) { /* Don't do half a segment if you can avoid it. */ if (nbytes == 0) nbytes = MAX_COUNT; break; } nbytes += iop->iov_size; } /* Which block on disk and how close to EOF? */ pos = position; if (pos >= dv_size) return(OK); /* At EOF */ if (pos + nbytes > dv_size) nbytes = dv_size - pos; pos = cv64ul(d_dv->dv_base) + pos; if (opcode == DEV_SCATTER) { /* Copy from user space to the DMA buffer. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(user_base + iop->iov_addr, tmp_phys + count, (phys_bytes) chunk); count += chunk; } } /* Need to seek to a new position? */ if (pos != dr->curpos) { reg86.b.intno = 0x21; reg86.w.ax = 0x4200; /* LSEEK absolute */ reg86.w.bx = dr->dfd; reg86.w.dx = pos & 0xFFFF; reg86.w.cx = pos >> 16; level0(int86); if (reg86.w.f & 0x0001) { /* Seek failed */ printf("%s: seek to %lu failed: %s\n", d_name(), pos, doserror(reg86.w.ax)); dr->curpos = -1; return(EIO); } dr->curpos = pos; } /* Do the transfer using a DOS read or write call */ reg86.b.intno = 0x21; reg86.b.ah = opcode == DEV_SCATTER ? 0x40 : 0x3F; reg86.w.bx = dr->dfd; reg86.w.cx = nbytes; reg86.w.dx = tmp_phys % HCLICK_SIZE; reg86.w.ds = tmp_phys / HCLICK_SIZE; level0(int86); if ((reg86.w.f & 0x0001) || reg86.w.ax != nbytes) { /* Read or write error or unexpected EOF */ dr->curpos = -1; return(EIO); } dr->curpos += nbytes; if (opcode == DEV_GATHER) { /* Copy from the DMA buffer to user space. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(tmp_phys + count, user_base + iop->iov_addr, (phys_bytes) chunk); count += chunk; } } /* Book the bytes successfully transferred. */ position += nbytes; for (;;) { if (nbytes < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += nbytes; iov->iov_size -= nbytes; break; } nbytes -= iov->iov_size; iov->iov_addr += iov->iov_size; iov->iov_size = 0; if (nbytes == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*============================================================================* * d_do_open * *============================================================================*/ PRIVATE int d_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device open: Open the DOS file and read the partition table. */ char *file; struct drive *dr; if (d_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); dr = d_dr; if (dr->open_ct == 0) { if ((file = getenv(d_name())) == NULL) { printf("%s: boot environent variable '%s' not set\n", d_name(), d_name()); return(EIO); } /* Check if DOS 3.0 or better present. */ reg86.b.intno = 0x21; reg86.w.ax = 0x3000; /* GET DOS VERSION */ level0(int86); if (reg86.b.al < 3) { printf("%s: No DOS 3.0+ running\n", d_name()); return(EIO); } /* Open the DOS file. */ dr->rw = 1; reg86.b.intno = 0x21; reg86.w.ax = 0x3D22; /* OPEN read-write & deny write */ reg86.w.dx = vir2phys(file) % HCLICK_SIZE; reg86.w.ds = vir2phys(file) / HCLICK_SIZE; level0(int86); if ((reg86.w.f & 0x0001) && reg86.w.ax == 5) { /* Open failed (access denied), try read-only */ dr->rw = 0; reg86.b.intno = 0x21; reg86.w.ax = 0x3D40; /* OPEN read-only */ reg86.w.dx = vir2phys(file) % HCLICK_SIZE; reg86.w.ds = vir2phys(file) / HCLICK_SIZE; level0(int86); } if (reg86.w.f & 0x0001) { printf("%s: can't open '%s': %s\n", d_name(), file, doserror(reg86.w.ax)); return(EIO); } dr->dfd = reg86.w.ax; /* -----File handle */ reg86.b.intno = 0x21; reg86.w.ax = 0x4202; /* LSEEK to end */ reg86.w.bx = dr->dfd; reg86.w.dx = 0; reg86.w.cx = 0; level0(int86); if (reg86.w.f & 0x0001) { /* Seek failed */ printf("%s: can't determine size of '%s': %s\n", d_name(), file, doserror(reg86.w.ax)); dosclose(dr->dfd); return(EIO); } dr->curpos = ((u32_t) reg86.w.dx << 16) | reg86.w.ax; if (cv64ul(dr->part[0].dv_size) != dr->curpos) { printf("%s: using '%s', %lu bytes%s\n", d_name(), file, dr->curpos, dr->rw ? "" : " (read-only)"); dr->part[0].dv_size = cvul64(dr->curpos); } reg86.b.intno = 0x21; reg86.b.ah = 0x1C; /* GET ALLOCATION INFO */ reg86.b.dl = 0x00; /* default drive or ... */ if ((unsigned) ((file[0] & 0xDF) - 'A') < 26 && file[1] == ':') { reg86.b.dl = (file[0] & 0xDF) - '@'; /* ... this drive */ } level0(int86); if (reg86.b.al == 0 || reg86.b.al > 63 || (file[0] == '/' && file[1] == '/')) { /* Weird return value or a network path, 32 will do. */ reg86.b.al = 32; } dr->clustersize = reg86.b.al << SECTOR_SHIFT; /* Partition the "disk". */ partition(&d_dtab, d_drive * DEV_PER_DRIVE, P_PRIMARY); } /* Record one more user. */ dr->open_ct++; if (!dr->rw && (m_ptr->COUNT & W_BIT)) { /* Read-only "disk" can't be opened for writing. */ if (--dr->open_ct == 0) dosclose(dr->dfd); return(EACCES); } return(OK); } /*============================================================================* * d_do_close * *============================================================================*/ PRIVATE int d_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device close: Release a device. */ if (d_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); if (--d_dr->open_ct == 0) dosclose(d_dr->dfd); return(OK); } /*============================================================================* * dosfile_stop * *============================================================================*/ PUBLIC void dosfile_stop() { /* Prepare for halt or reboot, i.e. make sure all is closed. */ struct drive *dr; for (dr = drive; dr < drive + MAX_DRIVES; dr++) { if (dr->open_ct > 0) dosclose(dr->dfd); } } /*============================================================================* * dosclose * *============================================================================*/ PRIVATE void dosclose(handle) int handle; /* file handle */ { /* Close a DOS file. */ reg86.b.intno = 0x21; reg86.b.ah = 0x3E; /* CLOSE */ reg86.w.bx = handle; level0(int86); } /*============================================================================* * doserror * *============================================================================*/ PRIVATE char *doserror(err) unsigned err; { /* Translate some DOS error codes to text. */ static struct errlist { int err; char *what; } errlist[] = { { 0, "No error" }, { 1, "Function number invalid" }, { 2, "File not found" }, { 3, "Path not found" }, { 4, "Too many open files" }, { 5, "Access denied" }, { 6, "Invalid handle" }, { 12, "Access code invalid" }, }; struct errlist *ep; static char unknown[]= "Error 65535"; char *p; for (ep = errlist; ep < errlist + sizeof(errlist)/sizeof(errlist[0]); ep++) { if (ep->err == err) return ep->what; } p = unknown + sizeof(unknown) - 1; do *--p = '0' + (err % 10); while ((err /= 10) > 0); strcpy(unknown + 6, p); return unknown; } /*============================================================================* * d_geometry * *============================================================================*/ PRIVATE void d_geometry(entry) struct partition *entry; { /* The number of sectors per track is chosen to match the cluster size * to make it easy for people to place partitions on cluster boundaries. */ entry->cylinders = cv64ul(d_dr->part[0].dv_size) / d_dr->clustersize / 64; entry->heads = 64; entry->sectors = d_dr->clustersize >> SECTOR_SHIFT; } #endif /* ENABLE_DOSFILE */ /* This file contains the device dependent part of a driver for the WD * winchester controller from Western Digital (WX-2 and related controllers). * It was written by Adri Koppes. * * The file contains one entry point: * * xt_winchester_task: main entry when system is brought up * * * Changes: * 10 Apr 1987 by Gary Oliver: use with the Western Digital WX-2. * ? by Harry McGavran: robust operation on turbo clones. * ? by Mike Mitchell: WX-2 auto configure operation. * 2 May 1992 by Kees J. Bot: device dependent/independent split. * 27 May 2000 by Kees J. Bot: d-d/i rewrite. */ #include "kernel.h" #include "driver.h" #include "drvlib.h" #if ENABLE_XT_WINI /* If the DMA buffer is large enough then use it always. */ #define USE_BUF (DMA_BUF_SIZE > BLOCK_SIZE) /* I/O Ports used by winchester disk task. */ #define WIN_DATA 0x320 /* winchester disk controller data register */ #define WIN_STATUS 0x321 /* winchester disk controller status register */ #define WST_REQ 0x001 /* Request bit */ #define WST_INPUT 0x002 /* Set if controller is writing to cpu */ #define WST_BUS 0x004 /* Command/status bit */ #define WST_BUSY 0x008 /* Busy */ #define WST_DRQ 0x010 /* DMA request */ #define WST_IRQ 0x020 /* Interrupt request */ #define WIN_SELECT 0x322 /* winchester disk controller select port */ #define WIN_DMA 0x323 /* winchester disk controller dma register */ #define DMA_ADDR 0x006 /* port for low 16 bits of DMA address */ #define DMA_TOP 0x082 /* port for top 4 bits of 20-bit DMA addr */ #define DMA_COUNT 0x007 /* port for DMA count (count = bytes - 1) */ #define DMA_FLIPFLOP 0x00C /* DMA byte pointer flop-flop */ #define DMA_MODE 0x00B /* DMA mode port */ #define DMA_INIT 0x00A /* DMA init port */ /* Winchester disk controller command bytes. */ #define WIN_RECALIBRATE 0x01 /* command for the drive to recalibrate */ #define WIN_SENSE 0x03 /* command for the controller to get its status */ #define WIN_READ 0x08 /* command for the drive to read */ #define WIN_WRITE 0x0a /* command for the drive to write */ #define WIN_SPECIFY 0x0C /* command for the controller to accept params */ #define WIN_ECC_READ 0x0D /* command for the controller to read ecc length */ #define DMA_INT 3 /* Command with dma and interrupt */ #define INT 2 /* Command with interrupt, no dma */ #define NO_DMA_INT 0 /* Command without dma and interrupt */ /* DMA channel commands. */ #define DMA_READ 0x47 /* DMA read opcode */ #define DMA_WRITE 0x4B /* DMA write opcode */ /* Parameters for the disk drive. */ #ifndef NR_SECTORS /* For RLL drives NR_SECTORS has to be defined in the makefile or in config.h. * There is some hope of getting it from the parameter table for these drives, * and then this driver should use wn_sectors like at_wini.c. * Unfortunately it is not standard in XT parameter tables. */ #define NR_SECTORS 17 /* number of sectors per track */ #endif /* Error codes */ #define ERR (-1) /* general error */ #define ERR_BAD_SECTOR (-2) /* block marked bad detected */ /* Miscellaneous. */ #define MAX_DRIVES 2 /* this driver support two drives (d0 - d1) */ #define MAX_ERRORS 4 /* how often to try rd/wt before quitting */ #define MAX_RESULTS 4 /* max number of bytes controller returns */ #define NR_DEVICES (MAX_DRIVES * DEV_PER_DRIVE) #define SUB_PER_DRIVE (NR_PARTITIONS * NR_PARTITIONS) #define NR_SUBDEVS (MAX_DRIVES * SUB_PER_DRIVE) #define MAX_WIN_RETRY 32000 /* max # times to try to output to WIN */ #if AUTO_BIOS #define AUTO_PARAM 0x1AD /* drive parameter table starts here in sect 0 */ #define AUTO_ENABLE 0x10 /* auto bios enabled bit from status reg */ /* some start up parameters in order to extract the drive parameter table */ /* from the winchester. these should not need changed. */ #define AUTO_CYLS 306 /* default number of cylinders */ #define AUTO_HEADS 4 /* default number of heads */ #define AUTO_RWC 307 /* default reduced write cylinder */ #define AUTO_WPC 307 /* default write precomp cylinder */ #define AUTO_ECC 11 /* default ecc burst */ #define AUTO_CTRL 5 /* default winchester stepping speed byte */ #endif /* Variables. */ PRIVATE struct wini { /* main drive struct, one entry per drive */ unsigned wn_cylinders; /* number of cylinders */ unsigned wn_heads; /* number of heads */ unsigned wn_reduced_wr; /* first cylinder with reduced write current */ unsigned wn_precomp; /* first cylinder with write precompensation */ unsigned wn_max_ecc; /* maximum ECC burst length */ unsigned wn_ctlbyte; /* control byte for COMMANDS (10-Apr-87 GO) */ unsigned wn_open_ct; /* in-use count */ struct device wn_part[DEV_PER_DRIVE]; /* disks and partitions */ struct device wn_subpart[SUB_PER_DRIVE]; /* subpartitions */ } wini[MAX_DRIVES], *w_wn; PRIVATE int win_tasknr; /* my task number */ PRIVATE int w_need_reset = FALSE; /* set when controller must be reset */ PRIVATE int nr_drives; /* Number of drives */ PRIVATE int w_switches; /* Drive type switches */ PRIVATE int w_drive; /* selected drive */ PRIVATE struct device *w_dv; /* device's base and size */ PRIVATE char w_results[MAX_RESULTS];/* the controller can give lots of output */ FORWARD _PROTOTYPE( struct device *w_prepare, (int device) ); FORWARD _PROTOTYPE( char *w_name, (void) ); FORWARD _PROTOTYPE( int w_transfer, (int proc_nr, int opcode, off_t position, iovec_t *iov, unsigned nr_req) ); FORWARD _PROTOTYPE( void w_dma_setup, (int opcode, phys_bytes address, unsigned count) ); FORWARD _PROTOTYPE( int w_1rdwt, (int opcode, unsigned long block, phys_bytes address, unsigned count) ); FORWARD _PROTOTYPE( int win_results, (void) ); FORWARD _PROTOTYPE( void win_out, (int val) ); FORWARD _PROTOTYPE( int w_reset, (void) ); FORWARD _PROTOTYPE( int w_handler, (int irq) ); FORWARD _PROTOTYPE( int win_specify, (int drive) ); FORWARD _PROTOTYPE( int check_init, (void) ); FORWARD _PROTOTYPE( int read_ecc, (void) ); FORWARD _PROTOTYPE( int hd_wait, (int bits) ); FORWARD _PROTOTYPE( int com_out, (int mode, u8_t *command) ); FORWARD _PROTOTYPE( void init_params, (void) ); FORWARD _PROTOTYPE( int w_do_open, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( int w_do_close, (struct driver *dp, message *m_ptr) ); FORWARD _PROTOTYPE( void w_init, (void) ); FORWARD _PROTOTYPE( void copy_param, (char *src, struct wini *dest) ); FORWARD _PROTOTYPE( void w_geometry, (struct partition *entry)); /* Entry points to this driver. */ PRIVATE struct driver w_dtab = { w_name, /* current device's name */ w_do_open, /* open or mount request, initialize device */ w_do_close, /* release device */ do_diocntl, /* get or set a partition's geometry */ w_prepare, /* prepare for I/O on a given minor device */ w_transfer, /* do the I/O */ nop_cleanup, /* no cleanup needed */ w_geometry /* tell the geometry of the disk */ }; /*===========================================================================* * xt_winchester_task * *===========================================================================*/ PUBLIC void xt_winchester_task() { win_tasknr = proc_number(proc_ptr); init_params(); put_irq_handler(XT_WINI_IRQ, w_handler); enable_irq(XT_WINI_IRQ); /* ready for winchester interrupts */ driver_task(&w_dtab); } /*===========================================================================* * w_prepare * *===========================================================================*/ PRIVATE struct device *w_prepare(device) int device; { /* Prepare for I/O on a device. */ if (device < NR_DEVICES) { /* d0, d0p[0-3], d1, ... */ w_drive = device / DEV_PER_DRIVE; /* save drive number */ w_wn = &wini[w_drive]; w_dv = &w_wn->wn_part[device % DEV_PER_DRIVE]; } else if ((unsigned) (device -= MINOR_d0p0s0) < NR_SUBDEVS) {/*d[0-7]p[0-3]s[0-3]*/ w_drive = device / SUB_PER_DRIVE; w_wn = &wini[w_drive]; w_dv = &w_wn->wn_subpart[device % SUB_PER_DRIVE]; } else { return(NIL_DEV); } return(w_drive < nr_drives ? w_dv : NIL_DEV); } /*=====================================-------------........======================================* * w_name * *===========================================================================*/ PRIVATE char *w_name() { /* Return a name for the current device. */ static char name[] = "xt-d0"; name[4] = '0' + w_drive; return name; } /*===========================================================================* * w_transfer * *===========================================================================*/ PRIVATE int w_transfer(proc_nr, opcode, position, iov, nr_req) int proc_nr; /* process doing the request */ int opcode; /* DEV_GATHER or DEV_SCATTER */ off_t position; /* offset on device to read or write */ iovec_t *iov; /* pointer to read or write request vector */ unsigned nr_req; /* length of request vector */ { iovec_t *iop, *iov_end = iov + nr_req; int r, errors; unsigned nbytes, count, chunk, dma_count; unsigned long block; unsigned long dv_size = cv64ul(w_dv->dv_size); phys_bytes dma_phys, first_dma_phys; phys_bytes user_base = proc_vir2phys(proc_addr(proc_nr), 0); /* Check disk address. */ if ((position & SECTOR_MASK) != 0) return(EINVAL); errors = 0; while (nr_req > 0) { /* How many bytes to transfer? */ nbytes = 0; for (iop = iov; iop < iov_end; iop++) { if (USE_BUF && nbytes + iop->iov_size > DMA_BUF_SIZE) { /* Don't do half a segment if you can avoid it. */ if (nbytes == 0) nbytes = DMA_BUF_SIZE; break; } nbytes += iop->iov_size; if ((nbytes & SECTOR_MASK) != 0) return(EINVAL); } /* Which block on disk and how close to EOF? */ if (position >= dv_size) return(OK); /* At EOF */ if (position + nbytes > dv_size) nbytes = dv_size - position; block = div64u(add64ul(w_dv->dv_base, position), SECTOR_SIZE); /* Degrade to per-sector mode if there were errors. */ if (errors > 0) nbytes = SECTOR_SIZE; if (!USE_BUF) { /* How many bytes can be found on consecutive pages? */ first_dma_phys = user_base + iov[0].iov_addr; count = 0; for (iop = iov; count < nbytes; iop++) { /* Memory chunk to DMA. */ dma_phys = user_base + iop->iov_addr; if (dma_phys != first_dma_phys + count) break; dma_count = dma_bytes_left(dma_phys); if (dma_count < iop->iov_size) { /* Can't do this segment fully. */ if (count == 0) count = dma_count & ~SECTOR_MASK; break; } count += iop->iov_size; } if (count == 0) { /* The first segment crosses a 64K boundary. */ first_dma_phys = tmp_phys; count = SECTOR_SIZE; if (opcode == DEV_SCATTER) { phys_copy(user_base + iov[0].iov_addr, first_dma_phys, (phys_bytes) SECTOR_SIZE); } } if (count < nbytes) nbytes = count; } else { first_dma_phys = tmp_phys; if (opcode == DEV_SCATTER) { /* Copy from user space to the DMA buffer. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(user_base + iop->iov_addr, first_dma_phys + count, (phys_bytes) chunk); count += chunk; } } } /* First check to see if a reset is needed. */ if (w_need_reset) w_reset(); /* Now set up the DMA chip. */ w_dma_setup(opcode, first_dma_phys, count); /* Perform the transfer. */ r = w_1rdwt(opcode, block, first_dma_phys, nbytes); if (r != OK) { /* An error occurred, try again sector by sector unless */ if (r == ERR_BAD_SECTOR || ++errors == MAX_ERRORS) return(EIO); /* Reset if halfway. */ if (errors == MAX_ERRORS / 2) w_need_reset = TRUE; continue; } if (opcode == DEV_GATHER) { if (!USE_BUF) { /* Copy to the badly placed segment. */ if (first_dma_phys == tmp_phys) { phys_copy(first_dma_phys, user_base + iov[0].iov_addr, (phys_bytes) SECTOR_SIZE); } } else { /* Copy from the DMA buffer to user space. */ count = 0; for (iop = iov; count < nbytes; iop++) { chunk = iov->iov_size; if (count + chunk > nbytes) chunk = nbytes - count; phys_copy(first_dma_phys + count, user_base + iop->iov_addr, (phys_bytes) chunk); count += chunk; } } } /* Book the bytes successfully transferred. */ position += nbytes; for (;;) { if (nbytes < iov->iov_size) { /* Not done with this one yet. */ iov->iov_addr += nbytes; iov->iov_size -= nbytes; break; } nbytes -= iov->iov_size; iov->iov_addr += iov->iov_size; iov->iov_size = 0; if (nbytes == 0) { /* The rest is optional, so we return to give FS a * chance to think it over. */ return(OK); } iov++; nr_req--; } } return(OK); } /*==========================================================================* * w_dma_setup * *==========================================================================*/ PRIVATE void w_dma_setup(opcode, address, count) int opcode; /* DEV_GATHER or DEV_SCATTER */ phys_bytes address; /* address in memory */ unsigned count; /* bytes to transfer */ { /* The IBM PC can perform DMA operations by using the DMA chip. To use it, * the DMA (Direct Memory Access) chip is loaded with the 20-bit memory address * to by read from or written to, the byte count minus 1, and a read or write * opcode. This routine sets up the DMA chip. Note that the chip is not * capable of doing a DMA across a 64K boundary (e.g., you can't read a * 512-byte block starting at physical address 65520). */ /* Set up the DMA registers. */ out_byte(DMA_FLIPFLOP, 0); /* write anything to reset it */ out_byte(DMA_MODE, opcode == DEV_SCATTER ? DMA_WRITE : DMA_READ); out_byte(DMA_ADDR, (int) address >> 0); out_byte(DMA_ADDR, (int) address >> 8); out_byte(DMA_TOP, (int) (address >> 16)); out_byte(DMA_COUNT, (count - 1) >> 0); out_byte(DMA_COUNT, (count - 1) >> 8); } /*=========================================================================* * w_1rdwt * *=========================================================================*/ PRIVATE int w_1rdwt(opcode, block, address, count) int opcode; /* DEV_GATHER or DEV_SCATTER */ unsigned long block; /* block on disk */ phys_bytes address; /* address in memory */ unsigned int count; /* bytes to transfer */ { /* Read or write count bytes starting with the given block. */ unsigned cylinder, sector, head, secspcyl = w_wn->wn_heads * NR_SECTORS; u8_t command[6]; message mess; cylinder = block / secspcyl; head = (block % secspcyl) / NR_SECTORS; sector = block % NR_SECTORS; /* The command is issued by outputting 6 bytes to the controller chip. */ command[0] = opcode == DEV_SCATTER ? WIN_WRITE : WIN_READ; command[1] = head | (w_drive << 5); command[2] = ((cylinder & 0x0300) >> 2) | sector; command[3] = cylinder & 0xFF; command[4] = count >> SECTOR_SHIFT; command[5] = w_wn->wn_ctlbyte; if (com_out(DMA_INT, command) != OK) return(ERR); out_byte(DMA_INIT, 3); /* initialize DMA */ /* Block, waiting for disk interrupt. */ receive(HARDWARE, &mess); /* Get controller status and check for errors. */ if (win_results() == OK) return(OK); if ((w_results[0] & 63) == 24) read_ecc(); else w_need_reset = TRUE; return(ERR); } /*==========================================================================* * win_results * *==========================================================================*/ PRIVATE int win_results() { /* Extract results from the controller after an operation. */ int i, status; u8_t command[6]; status = in_byte(WIN_DATA); out_byte(WIN_DMA, 0); if (!(status & 2)) /* Test "error" bit */ return(OK); command[0] = WIN_SENSE; command[1] = w_drive << 5; if (com_out(NO_DMA_INT, command) != OK) return(ERR); /* Loop, extracting bytes from WIN */ for (i = 0; i < MAX_RESULTS; i++) { if (hd_wait(WST_REQ) != OK) return(ERR); status = in_byte(WIN_DATA); w_results[i] = status & BYTE; } if (hd_wait(WST_REQ) != OK) /* Missing from */ return (ERR); /* Original. 11-Apr-87 G.O. */ status = in_byte(WIN_DATA); /* Read "error" flag */ if (((status & 2) != 0) || (w_results[0] & 0x3F)) { return(ERR); } else return(OK); } /*===========================================================================* * win_out * *===========================================================================*/ PRIVATE void win_out(val) int val; /* write this byte to winchester disk controller */ { /* Output a byte to the controller. This is not entirely trivial, since you * can only write to it when it is listening, and it decides when to listen. * If the controller refuses to listen, the WIN chip is given a hard reset. */ int r; if (w_need_reset) return; /* if controller is not listening, return */ do { r = in_byte(WIN_STATUS); } while((r & (WST_REQ | WST_BUSY)) == WST_BUSY); out_byte(WIN_DATA, val); } /*===========================================================================* * w_reset * *===========================================================================*/ PRIVATE int w_reset() { /* Issue a reset to the controller. This is done after any catastrophe, * like the controller refusing to respond. */ int r, i, drive; u8_t command[6]; message mess; /* Strobe reset bit low. */ out_byte(WIN_STATUS, 0); milli_delay(5); /* Wait for a while */ out_byte(WIN_SELECT, 0); /* Issue select pulse */ for (i = 0; i < MAX_WIN_RETRY; i++) { r = in_byte(WIN_STATUS); if (r & (WST_DRQ | WST_IRQ)) return(ERR); if ((r & (WST_BUSY | WST_BUS | WST_REQ)) == (WST_BUSY | WST_BUS | WST_REQ)) break; } if (i == MAX_WIN_RETRY) { printf("%s: reset failed, status = %x\n", w_name(), r); return(ERR); } /* Reset succeeded. Tell WIN drive parameters. */ w_need_reset = FALSE; for (drive = 0; drive < nr_drives; drive++) { if (win_specify(drive) != OK) return (ERR); command[0] = WIN_RECALIBRATE; command[1] = drive << 5; command[5] = wini[drive].wn_ctlbyte; if (com_out(INT, command) != OK) return(ERR); receive(HARDWARE, &mess); if (win_results() != OK) { /* No actual drive present? */ nr_drives = drive; } } return(nr_drives > 0 ? OK : ERR); } /*==========================================================================* * w_handler * *==========================================================================*/ PRIVATE int w_handler(irq) int irq; { /* Disk interrupt, send message to winchester task and reenable interrupts. */ int r, i; out_byte(DMA_INIT, 0x07); /* Disable int from DMA */ for (i = 0; i < MAX_WIN_RETRY; ++i) { r = in_byte(WIN_STATUS); if (r & WST_IRQ) break; /* Exit if end of int */ } interrupt(win_tasknr); return 1; } /*============================================================================* * win_specify * *============================================================================*/ PRIVATE int win_specify(drive) int drive; { struct wini *wn = &wini[drive]; u8_t command[6]; command[0] = WIN_SPECIFY; /* Specify some parameters */ command[1] = drive << 5; /* Drive number */ if (com_out(NO_DMA_INT, command) != OK) /* Output command block */ return(ERR); /* No. of cylinders (high byte) */ win_out(wn->wn_cylinders >> 8); /* No. of cylinders (low byte) */ win_out(wn->wn_cylinders); /* No. of heads */ win_out(wn->wn_heads); /* Start reduced write (high byte) */ win_out(wn->wn_reduced_wr >> 8); /* Start reduced write (low byte) */ win_out(wn->wn_reduced_wr); /* Start write precompensation (high byte) */ win_out(wn->wn_precomp >> 8); /* Start write precompensation (low byte) */ win_out(wn->wn_precomp); /* Ecc burst length */ win_out(wn->wn_max_ecc); if (check_init() != OK) { /* See if controller accepted parameters */ w_need_reset = TRUE; return(ERR); } else return(OK); } /*============================================================================* * check_init * *============================================================================*/ PRIVATE int check_init() { /* Routine to check if controller accepted the parameters */ int r, s; if (hd_wait(WST_REQ | WST_INPUT) == OK) { r = in_byte(WIN_DATA); do { s = in_byte(WIN_STATUS); } while(s & WST_BUSY); /* Loop while still busy */ if (r & 2) /* Test error bit */ return(ERR); else return(OK); } else return (ERR); /* Missing from original: 11-Apr-87 G.O. */ } /*============================================================================* * read_ecc * *============================================================================*/ PRIVATE int read_ecc() { /* Read the ecc burst-length and let the controller correct the data */ int r; u8_t command[6]; command[0] = WIN_ECC_READ; if (com_out(NO_DMA_INT, command) == OK && hd_wait(WST_REQ) == OK) { r = in_byte(WIN_DATA); if (hd_wait(WST_REQ) == OK) { r = in_byte(WIN_DATA); if (r & 1) w_need_reset = TRUE; } } return(ERR); } /*============================================================================* * hd_wait * *============================================================================*/ PRIVATE int hd_wait(bits) int bits; { /* Wait until the controller is ready to receive a command or send status */ int r, i = 0; do { r = in_byte(WIN_STATUS) & bits; } while ((i++ < MAX_WIN_RETRY) && r != bits); /* Wait for ALL bits */ if (i >= MAX_WIN_RETRY) { w_need_reset = TRUE; return(ERR); } else return(OK); } /*============================================================================* * com_out * *============================================================================*/ PRIVATE int com_out(mode, commandp) int mode; u8_t *commandp; { /* Output the command block to the winchester controller and return status */ int i, r; out_byte(WIN_DMA, mode); out_byte(WIN_SELECT, mode); for (i = 0; i < MAX_WIN_RETRY; i++) { r = in_byte(WIN_STATUS); if (r & WST_BUSY) break; } if (i == MAX_WIN_RETRY) { w_need_reset = TRUE; return(ERR); } for (i = 0; i < 6; i++) { if (hd_wait(WST_REQ) != OK) break; /* No data request pending */ r = in_byte(WIN_STATUS); if ((r & (WST_BUSY | WST_BUS | WST_INPUT)) != (WST_BUSY | WST_BUS)) break; out_byte(WIN_DATA, commandp[i]); } if (i != 6) return(ERR); else return(OK); } /*==========================================================================* * init_params * *==========================================================================*/ PRIVATE void init_params() { /* This routine is called at startup to initialize the number of drives and * the controller. */ u16_t parv[2]; unsigned int drive; int dtype; phys_bytes address, buf_phys; char buf[16]; /* Get the number of drives from the bios */ buf_phys = vir2phys(buf); phys_copy(0x475L, buf_phys, 1L); nr_drives = buf[0] & 0xFF; if (nr_drives > MAX_DRIVES) nr_drives = MAX_DRIVES; /* Read the switches from the controller */ w_switches = in_byte(WIN_SELECT); #if AUTO_BIOS /* If no auto configuration or not enabled then go to the ROM. */ if (!(w_switches & AUTO_ENABLE)) { #endif for (drive = 0; drive < nr_drives; drive++) { /* Calculate the drive type */ dtype = (w_switches >> (2 * drive)) & 03; /* Copy the BIOS parameter vector */ phys_copy(WINI_0_PARM_VEC * 4L, vir2phys(parv), 4L); /* Calculate the parameters' address and copy them to buf */ address = hclick_to_physb(parv[1]) + parv[0] + 16 * dtype; phys_copy(address, buf_phys, 16L); /* Copy the parameters to the structure of the drive. */ copy_param(buf, &wini[drive]); } #if AUTO_BIOS } #endif } /*============================================================================* * w_do_open * *============================================================================*/ PRIVATE int w_do_open(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device open: Initialize the controller and read the partition table. */ static int init_done = FALSE; if (!init_done) { w_init(); init_done = TRUE; } if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); if (w_wn->wn_open_ct++ == 0) { /* Partition the disk. */ partition(&w_dtab, w_drive * DEV_PER_DRIVE, P_PRIMARY); } return(OK); } /*============================================================================* * w_do_close * *============================================================================*/ PRIVATE int w_do_close(dp, m_ptr) struct driver *dp; message *m_ptr; { /* Device close: Release a device. */ if (w_prepare(m_ptr->DEVICE) == NIL_DEV) return(ENXIO); w_wn->wn_open_ct--; return(OK); } /*==========================================================================* * w_init * *==========================================================================*/ PRIVATE void w_init() { /* Initialize the controller. */ int drive; struct wini *wn; #if AUTO_BIOS for (drive = 0; drive < nr_drives; drive++) { /* Get the drive parameters from sector zero of the drive if the * autoconfig mode of the controller has been selected. */ if (w_switches & AUTO_ENABLE) { /* Set up some phony parameters so that we can read the * first sector from the winchester. All drives will have * one cylinder and one head but set up initially to the * mini scribe drives from IBM. */ wn = &wini[drive]; wn->wn_cylinders = AUTO_CYLS; wn->wn_heads = AUTO_HEADS; wn->wn_reduced_wr = AUTO_RWC; wn->wn_precomp = AUTO_WPC; wn->wn_max_ecc = AUTO_ECC; wn->wn_ctlbyte = AUTO_CTRL; wn->wn_part[0].dv_size = cvu64(SECTOR_SIZE); } } /* Initialize controller to read parameters from the drives. */ if (nr_drives > 0 && w_reset() != OK) nr_drives = 0; for (drive = 0; drive < nr_drives; drive++) { if (w_switches & AUTO_ENABLE) { /* read the first sector from the drive */ w_dma_setup(DEV_GATHER, tmp_phys, SECTOR_SIZE); if (w_1rdwt(DEV_GATHER, 0, tmp_phys, SECTOR_SIZE) != OK) { printf("%s: can't read parameters\n", w_name()); nr_drives = drive; break; } /* save the parameter tables for later use */ copy_param(&tmp_buf[AUTO_PARAM], &wini[drive]); } } #endif if (nr_drives > 0 && w_reset() != OK) nr_drives = 0; /* Set the size of each disk. */ for (drive = 0; drive < nr_drives; drive++) { (void) w_prepare(drive * DEV_PER_DRIVE); wn = w_wn; wn->wn_part[0].dv_size = mul64u((unsigned long) wn->wn_cylinders * wn->wn_heads * NR_SECTORS, SECTOR_SIZE); printf("%s: %d cylinders, %d heads, %d sectors per track\n", w_name(), wn->wn_cylinders, wn->wn_heads, NR_SECTORS); } } /*==========================================================================* * copy_param * *==========================================================================*/ PRIVATE void copy_param(src, dest) char *src; struct wini *dest; { /* This routine copies the parameters from src to dest. */ dest->wn_cylinders = bp_cylinders(src); dest->wn_heads = bp_heads(src); dest->wn_reduced_wr = bp_reduced_wr(src); dest->wn_precomp = bp_precomp(src); dest->wn_max_ecc = bp_max_ecc(src); dest->wn_ctlbyte = bp_ctlbyte(src); } /*============================================================================* * w_geometry * *============================================================================*/ PRIVATE void w_geometry(entry) struct partition *entry; { entry->cylinders = w_wn->wn_cylinders; entry->heads = w_wn->wn_heads; entry->sectors = NR_SECTORS; } #endif /* ENABLE_XT_WINI */ ;...<Makefile=ansicurseseditlineendfloatfphookhi386i86ip libm2QlibplibymathotherposixDstdioysyscallsyslibrtsdummy# Makefile for the libraries # This makefile runs make in all the subdirectories of the src/lib tree. # See ansi/Makefile for a further explanation. MAKE = exec make -$(MAKEFLAGS) usage: @echo "Usage: make all" >&2 # Compile all library functions" >&2 @echo " make install # Backup /usr/lib/*.a first!" >&2 @echo " make clean # Delete .o and .a files" >&2 @false all: cd ansi && $(MAKE) cd curses && $(MAKE) cd dummy && $(MAKE) cd editline && $(MAKE) cd end && $(MAKE) cd float && $(MAKE) cd fphook && $(MAKE) cd ip && $(MAKE) cd libm2 && $(MAKE) cd libp && $(MAKE) cd liby && $(MAKE) cd math && $(MAKE) cd other && $(MAKE) cd posix && $(MAKE) cd rts && $(MAKE) cd stdio && $(MAKE) cd syscall && $(MAKE) cd syslib && $(MAKE) cd `arch` && $(MAKE) install: all $(MAKE) install_`arch` # Installation rules for PC Minix. LIB= /usr/lib install_i86: \ $(LIB)/ncrtso.o \ $(LIB)/nm2rtso.o \ $(LIB)/nprtso.o \ $(LIB)/libc.a \ $(LIB)/libd.a \ $(LIB)/libe.a \ $(LIB)/libfp.a \ $(LIB)/libm.a \ $(LIB)/libm2.a \ $(LIB)/libp.a \ $(LIB)/end.a \ $(LIB)/libsys.a \ $(LIB)/libcurses.a \ $(LIB)/libedit.a \ $(LIB)/liby.a \ $(LIB)/ncrtso.o: ncrtso.o install -c -o bin $? $@ $(LIB)/nm2rtso.o: nm2rtso.o install -c -o bin $? $@ $(LIB)/nprtso.o: nprtso.o install -c -o bin $? $@ $(LIB)/libc.a: libc.a install -c -o bin $? $@ $(LIB)/libd.a: libd.a install -c -o bin $? $@ $(LIB)/libe.a: libe.a install -c -o bin $? $@ $(LIB)/libfp.a: libfp.a install -c -o bin $? $@ $(LIB)/libm.a: libm.a install -c -o bin $? $@ $(LIB)/libm2.a: libm2.a install -c -o bin $? $@ $(LIB)/libp.a: libp.a install -c -o bin $? $@ $(LIB)/end.a: end.a install -c -o bin $? $@ $(LIB)/libsys.a: libsys.a install -c -o bin $? $@ $(LIB)/libcurses.a: libcurses.a install -c -o bin $? $@ $(LIB)/libedit.a: libedit.a install -c -o bin $? $@ $(LIB)/liby.a: liby.a install -c -o bin $? $@ # Installation rules for Minix-386. LIB386= /usr/lib/i386 LIB86= /usr/lib/i86 install_i386: \ $(LIB386)/crtso.o \ $(LIB386)/m2rtso.o \ $(LIB386)/prtso.o \ $(LIB386)/libc.a \ $(LIB386)/libd.a \ $(LIB386)/libe.a \ $(LIB386)/libfp.a \ $(LIB386)/libm.a \ $(LIB386)/libm2.a \ $(LIB386)/libp.a \ $(LIB386)/end.a \ $(LIB386)/libsys.a \ $(LIB386)/libcurses.a \ $(LIB386)/libedit.a \ $(LIB386)/liby.a \ # $(LIB86)/libc.a \ # $(LIB86)/end.a \ $(LIB386)/crtso.o: crtso.o install -c -o bin $? $@ $(LIB386)/m2rtso.o: m2rtso.o install -c -o bin $? $@ $(LIB386)/prtso.o: prtso.o install -c -o bin $? $@ $(LIB386)/libc.a: libc.a install -c -o bin $? $@ $(LIB386)/libd.a: libd.a install -c -o bin $? $@ $(LIB386)/libe.a: libe.a install -c -o bin $? $@ $(LIB386)/libfp.a: libfp.a install -c -o bin $? $@ $(LIB386)/libm.a: libm.a install -c -o bin $? $@ $(LIB386)/libm2.a: libm2.a install -c -o bin $? $@ $(LIB386)/libp.a: libp.a install -c -o bin $? $@ $(LIB386)/end.a: end.a install -c -o bin $? $@ $(LIB386)/libsys.a: libsys.a install -c -o bin $? $@ $(LIB386)/libcurses.a: libcurses.a install -c -o bin $? $@ $(LIB386)/libedit.a: libedit.a install -c -o bin $? $@ $(LIB386)/liby.a: liby.a install -c -o bin $? $@ #$(LIB86)/libc.a: libc86.a # install -c -o bin $? $@ # #$(LIB86)/end.a: end86.a # install -c -o bin $? $@ clean: find . -name '*.[oa]' -o -name '*.bak' | xargs rm =.;..>Makefile?abort.c@abs.cAasctime.cBassert.cCatexit.cDatof.cEatoi.cFatol.cGbsearch.cHcalloc.cIchartab.cJclock.cKctime.cLdifftime.cMdiv.cNerrlist.cOexit.cPext_comp.cQext_fmt.hRgetenv.cSgmtime.cTisalnum.cUisalpha.cVisascii.cWiscntrl.cXisdigit.cYisgraph.cZislower.c[isprint.c\ispunct.c]isspace.c^isupper.c_isxdigit.c`labs.caldiv.cbloc_time.hclocaleconv.cdlocaltime.cemalloc.cfmblen.cgmbstowcs.chmbtowc.cimemchr.cjmemcmp.ckmemcpy.clmemmove.cmmemset.cnmisc.comktime.cpqsort.cqraise.crrand.cssetlocale.ctsigmisc.cusignal.cvstrcat.cwstrchr.cxstrcmp.cystrcoll.czstrcpy.c{strcspn.c# Makefile for lib/ansi. # This Makefile compiles part of the C library, the functions required by the # ANSI C standard. This Makefile, and those in the other subdirectories use # a little known feature of make, the ability to refer to a file within a # library. The construct 'libc.a(abs.o)' names the file 'abs.o' contained # in 'libc.a'. So the rule # # libc.a(abs.o): abs.c # cc -c abs.c # aal cr libc.a abs.o # rm abs.o # # compiles abs.c and installs the result abs.o in libc.a if abs.c is newer # than the abs.o in the library. This Makefile does not work like this # precisely, it first compiles all changed source files and than installs # them all in one 'aal' command. # Many of the string functions in this directory are not used, because the # have fast assembly implementations. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(abort.o) \ $(LIBRARY)(abs.o) \ $(LIBRARY)(asctime.o) \ $(LIBRARY)(assert.o) \ $(LIBRARY)(atexit.o) \ $(LIBRARY)(atof.o) \ $(LIBRARY)(atoi.o) \ $(LIBRARY)(atol.o) \ $(LIBRARY)(bsearch.o) \ $(LIBRARY)(calloc.o) \ $(LIBRARY)(chartab.o) \ $(LIBRARY)(clock.o) \ $(LIBRARY)(ctime.o) \ $(LIBRARY)(difftime.o) \ $(LIBRARY)(div.o) \ $(LIBRARY)(errlist.o) \ $(LIBRARY)(exit.o) \ $(LIBRARY)(ext_comp.o) \ $(LIBRARY)(getenv.o) \ $(LIBRARY)(gmtime.o) \ $(LIBRARY)(isalnum.o) \ $(LIBRARY)(isalpha.o) \ $(LIBRARY)(isascii.o) \ $(LIBRARY)(iscntrl.o) \ $(LIBRARY)(isdigit.o) \ $(LIBRARY)(isgraph.o) \ $(LIBRARY)(islower.o) \ $(LIBRARY)(isprint.o) \ $(LIBRARY)(ispunct.o) \ $(LIBRARY)(isspace.o) \ $(LIBRARY)(isupper.o) \ $(LIBRARY)(isxdigit.o) \ $(LIBRARY)(labs.o) \ $(LIBRARY)(ldiv.o) \ $(LIBRARY)(localeconv.o) \ $(LIBRARY)(localtime.o) \ $(LIBRARY)(malloc.o) \ $(LIBRARY)(mblen.o) \ $(LIBRARY)(mbstowcs.o) \ $(LIBRARY)(mbtowc.o) \ $(LIBRARY)(misc.o) \ $(LIBRARY)(mktime.o) \ $(LIBRARY)(qsort.o) \ $(LIBRARY)(raise.o) \ $(LIBRARY)(rand.o) \ $(LIBRARY)(setlocale.o) \ $(LIBRARY)(sigmisc.o) \ $(LIBRARY)(signal.o) \ $(LIBRARY)(strcoll.o) \ $(LIBRARY)(strcspn.o) \ $(LIBRARY)(strerror.o) \ $(LIBRARY)(strftime.o) \ $(LIBRARY)(strpbrk.o) \ $(LIBRARY)(strspn.o) \ $(LIBRARY)(strstr.o) \ $(LIBRARY)(strtok.o) \ $(LIBRARY)(strtol.o) \ $(LIBRARY)(strxfrm.o) \ $(LIBRARY)(system.o) \ $(LIBRARY)(tolower.o) \ $(LIBRARY)(toupper.o) \ $(LIBRARY)(tzset.o) \ $(LIBRARY)(wcstombs.o) \ $(LIBRARY)(wctomb.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(abort.o): abort.c $(CC1) abort.c $(LIBRARY)(abs.o): abs.c $(CC1) abs.c $(LIBRARY)(asctime.o): asctime.c $(CC1) asctime.c $(LIBRARY)(assert.o): assert.c $(CC1) assert.c $(LIBRARY)(atexit.o): atexit.c $(CC1) atexit.c $(LIBRARY)(atof.o): atof.c $(CC1) atof.c $(LIBRARY)(atoi.o): atoi.c $(CC1) atoi.c $(LIBRARY)(atol.o): atol.c $(CC1) atol.c $(LIBRARY)(bsearch.o): bsearch.c $(CC1) bsearch.c $(LIBRARY)(calloc.o): calloc.c $(CC1) calloc.c $(LIBRARY)(chartab.o): chartab.c $(CC1) chartab.c $(LIBRARY)(clock.o): clock.c $(CC1) clock.c $(LIBRARY)(ctime.o): ctime.c $(CC1) ctime.c $(LIBRARY)(difftime.o): difftime.c $(CC1) difftime.c $(LIBRARY)(div.o): div.c $(CC1) div.c $(LIBRARY)(errlist.o): errlist.c $(CC1) errlist.c $(LIBRARY)(exit.o): exit.c $(CC1) exit.c $(LIBRARY)(ext_comp.o): ext_comp.c $(CC1) ext_comp.c $(LIBRARY)(getenv.o): getenv.c $(CC1) getenv.c $(LIBRARY)(gmtime.o): gmtime.c $(CC1) gmtime.c $(LIBRARY)(isalnum.o): isalnum.c $(CC1) isalnum.c $(LIBRARY)(isalpha.o): isalpha.c $(CC1) isalpha.c $(LIBRARY)(isascii.o): isascii.c $(CC1) isascii.c $(LIBRARY)(iscntrl.o): iscntrl.c $(CC1) iscntrl.c $(LIBRARY)(isdigit.o): isdigit.c $(CC1) isdigit.c $(LIBRARY)(isgraph.o): isgraph.c $(CC1) isgraph.c $(LIBRARY)(islower.o): islower.c $(CC1) islower.c $(LIBRARY)(isprint.o): isprint.c $(CC1) isprint.c $(LIBRARY)(ispunct.o): ispunct.c $(CC1) ispunct.c $(LIBRARY)(isspace.o): isspace.c $(CC1) isspace.c $(LIBRARY)(isupper.o): isupper.c $(CC1) isupper.c $(LIBRARY)(isxdigit.o): isxdigit.c $(CC1) isxdigit.c $(LIBRARY)(labs.o): labs.c $(CC1) labs.c $(LIBRARY)(ldiv.o): ldiv.c $(CC1) ldiv.c $(LIBRARY)(localeconv.o): localeconv.c $(CC1) localeconv.c $(LIBRARY)(localtime.o): localtime.c $(CC1) localtime.c $(LIBRARY)(malloc.o): malloc.c $(CC1) malloc.c $(LIBRARY)(mblen.o): mblen.c $(CC1) mblen.c $(LIBRARY)(mbstowcs.o): mbstowcs.c $(CC1) mbstowcs.c $(LIBRARY)(mbtowc.o): mbtowc.c $(CC1) mbtowc.c $(LIBRARY)(memchr.o): memchr.c $(CC1) memchr.c $(LIBRARY)(memcmp.o): memcmp.c $(CC1) memcmp.c $(LIBRARY)(memcpy.o): memcpy.c $(CC1) memcpy.c $(LIBRARY)(memmove.o): memmove.c $(CC1) memmove.c $(LIBRARY)(memset.o): memset.c $(CC1) memset.c $(LIBRARY)(misc.o): misc.c $(CC1) misc.c $(LIBRARY)(mktime.o): mktime.c $(CC1) mktime.c $(LIBRARY)(qsort.o): qsort.c $(CC1) qsort.c $(LIBRARY)(raise.o): raise.c $(CC1) raise.c $(LIBRARY)(rand.o): rand.c $(CC1) rand.c $(LIBRARY)(setlocale.o): setlocale.c $(CC1) setlocale.c $(LIBRARY)(sigmisc.o): sigmisc.c $(CC1) sigmisc.c $(LIBRARY)(signal.o): signal.c $(CC1) signal.c $(LIBRARY)(strcat.o): strcat.c $(CC1) strcat.c $(LIBRARY)(strchr.o): strchr.c $(CC1) strchr.c $(LIBRARY)(strcmp.o): strcmp.c $(CC1) strcmp.c $(LIBRARY)(strcoll.o): strcoll.c $(CC1) strcoll.c $(LIBRARY)(strcpy.o): strcpy.c $(CC1) strcpy.c $(LIBRARY)(strcspn.o): strcspn.c $(CC1) strcspn.c $(LIBRARY)(strerror.o): strerror.c $(CC1) strerror.c $(LIBRARY)(strftime.o): strftime.c $(CC1) strftime.c $(LIBRARY)(strlen.o): strlen.c $(CC1) strlen.c $(LIBRARY)(strncat.o): strncat.c $(CC1) strncat.c $(LIBRARY)(strncmp.o): strncmp.c $(CC1) strncmp.c $(LIBRARY)(strncpy.o): strncpy.c $(CC1) strncpy.c $(LIBRARY)(strpbrk.o): strpbrk.c $(CC1) strpbrk.c $(LIBRARY)(strrchr.o): strrchr.c $(CC1) strrchr.c $(LIBRARY)(strspn.o): strspn.c $(CC1) strspn.c $(LIBRARY)(strstr.o): strstr.c $(CC1) strstr.c $(LIBRARY)(strtok.o): strtok.c $(CC1) strtok.c $(LIBRARY)(strtol.o): strtol.c $(CC1) strtol.c $(LIBRARY)(strxfrm.o): strxfrm.c $(CC1) strxfrm.c $(LIBRARY)(system.o): system.c $(CC1) system.c $(LIBRARY)(tolower.o): tolower.c $(CC1) tolower.c $(LIBRARY)(toupper.o): toupper.c $(CC1) toupper.c $(LIBRARY)(tzset.o): tzset.c $(CC1) tzset.c $(LIBRARY)(wcstombs.o): wcstombs.c $(CC1) wcstombs.c $(LIBRARY)(wctomb.o): wctomb.c $(CC1) wctomb.c /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: abort.c,v 1.3 90/11/22 13:59:37 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include extern void (*_clean)(void); void abort(void) { if (_clean) _clean(); /* flush all output files */ raise(SIGABRT); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: abs.c,v 1.1 89/05/16 13:06:59 eck Exp $ */ #include int abs(register int i) { return i >= 0 ? i : -i; } /* * asctime - print a date */ /* $Header: asctime.c,v 1.3 91/04/22 13:20:15 ceriel Exp $ */ #include #include #include "loc_time.h" #define DATE_STR "??? ??? ?? ??:??:?? ????\n" static char * two_digits(register char *pb, int i, int nospace) { *pb = (i / 10) % 10 + '0'; if (!nospace && *pb == '0') *pb = ' '; pb++; *pb++ = (i % 10) + '0'; return ++pb; } static char * four_digits(register char *pb, int i) { i %= 10000; *pb++ = (i / 1000) + '0'; i %= 1000; *pb++ = (i / 100) + '0'; i %= 100; *pb++ = (i / 10) + '0'; *pb++ = (i % 10) + '0'; return ++pb; } char *asctime(const struct tm *timeptr) { static char buf[26]; register char *pb = buf; register const char *ps; register int n; strcpy(pb, DATE_STR); ps = _days[timeptr->tm_wday]; n = ABB_LEN; while(--n >= 0) *pb++ = *ps++; pb++; ps = _months[timeptr->tm_mon]; n = ABB_LEN; while(--n >= 0) *pb++ = *ps++; pb++; pb = two_digits( two_digits( two_digits(two_digits(pb, timeptr->tm_mday, 0) , timeptr->tm_hour, 1) , timeptr->tm_min, 1) , timeptr->tm_sec, 1); four_digits(pb, timeptr->tm_year + 1900); return buf; } /* * assert.c - diagnostics */ /* $Header: assert.c,v 1.3 90/04/03 15:01:58 eck Exp $ */ #include #include #include void __bad_assertion(const char *mess) { fputs(mess, stderr); abort(); } /* $Header: atexit.c,v 1.1 89/12/18 15:11:09 eck Exp $ */ #include #define NEXITS 32 extern void (*__functab[NEXITS])(void); extern int __funccnt; int atexit(void (*func)(void)) { if (__funccnt >= NEXITS) return 1; __functab[__funccnt++] = func; return 0; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: atof.c,v 1.2 89/12/18 15:11:50 eck Exp $ */ #include #include double atof(const char *nptr) { double d; int e = errno; d = strtod(nptr, (char **) NULL); errno = e; return d; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: atoi.c,v 1.4 90/05/22 12:22:25 ceriel Exp $ */ #include #include int atoi(register const char *nptr) { return strtol(nptr, (char **) NULL, 10); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: atol.c,v 1.3 90/05/22 10:48:12 ceriel Exp $ */ #include #include /* We do not use strtol here for backwards compatibility in behaviour on overflow. */ long atol(register const char *nptr) { long total = 0; int minus = 0; while (isspace(*nptr)) nptr++; if (*nptr == '+') nptr++; else if (*nptr == '-') { minus = 1; nptr++; } while (isdigit(*nptr)) { total *= 10; total += (*nptr++ - '0'); } return minus ? -total : total; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: bsearch.c,v 1.2 89/12/18 15:12:21 eck Exp $ */ #include void * bsearch(register const void *key, register const void *base, register size_t nmemb, register size_t size, int (*compar)(const void *, const void *)) { register const void *mid_point; register int cmp; while (nmemb > 0) { mid_point = (char *)base + size * (nmemb >> 1); if ((cmp = (*compar)(key, mid_point)) == 0) return (void *)mid_point; if (cmp >= 0) { base = (char *)mid_point + size; nmemb = (nmemb - 1) >> 1; } else nmemb >>= 1; } return (void *)NULL; } /* $Header$ */ #include #define ALIGN(x) (((x) + (sizeof(size_t) - 1)) & ~(sizeof(size_t) - 1)) void * calloc(size_t nelem, size_t elsize) { register char *p; register size_t *q; size_t size = ALIGN(nelem * elsize); p = malloc(size); if (p == NULL) return NULL; q = (size_t *) (p + size); while ((char *) q > p) *--q = 0; return p; } #include char __ctype[] = { 0, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C|_S, _C|_S, _C|_S, _C|_S, _C|_S, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _C, _S, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _P, _N, _N, _N, _N, _N, _N, _N, _N, _N, _N, _P, _P, _P, _P, _P, _P, _P, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U|_X, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _U, _P, _P, _P, _P, _P, _P, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L|_X, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _L, _P, _P, _P, _P, _C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; /* * clock - determine the processor time used */ /* $Header: clock.c,v 1.3 90/01/22 13:08:11 eck Exp $ */ #include #if defined(__BSD4_2) struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; #define RUSAGE_SELF 0 #define RUSAGE_CHILDREN -1 struct rusage { struct timeval ru_utime; /* user time used */ struct timeval ru_stime; /* system time used */ long ru_maxrss; long ru_ixrss; /* integral shared memory size */ long ru_idrss; /* integral unshared data size */ long ru_isrss; /* integral unshared stack size */ long ru_minflt; /* page reclaims */ long ru_majflt; /* page faults */ long ru_nswap; /* swaps */ long ru_inblock; /* block input operations */ long ru_oublock; /* block output operations */ long ru_msgsnd; /* messages sent */ long ru_msgrcv; /* messages received */ long ru_nsignals; /* signals received */ long ru_nvcsw; /* voluntary context switches */ long ru_nivcsw; /* involuntary context switches */ }; void _getrusage(int who, struct rusage *rusage); #elif defined(_POSIX_SOURCE) || defined(__USG) struct tms { time_t tms_utime; /* user time */ time_t tms_stime; /* system time */ time_t tms_cutime; /* user time, children */ time_t tms_cstime; /* system time, children */ }; clock_t _times(struct tms *buffer); #else /* Version 7 UNIX */ struct tbuffer { long proc_user_time; long proc_system_time; long child_user_time; long child_system_time; }; clock_t _times(struct tbuffer *buffer); #endif clock_t clock(void) { #if defined(__BSD4_2) struct rusage rusage; _getrusage(RUSAGE_SELF, &rusage); return (((unsigned long)rusage.ru_utime.tv_sec * CLOCKS_PER_SEC) + rusage.ru_utime.tv_usec); #elif defined(_POSIX_SOURCE) || defined(__USG) struct tms tms; _times(&tms); /* Assume that time_t can be converted to clock_t for Sys5 */ return tms.tms_utime; #else struct tbuffer tbuffer; _times(&tbuffer); return tbuffer.proc_user_time; #endif } /* * ctime - convers the calendar time to a string */ /* $Header: ctime.c,v 1.1 89/06/12 15:21:16 eck Exp $ */ #include char * ctime(const time_t *timer) { return asctime(localtime(timer)); } /* * difftime - compute the difference between two calendar times */ /* $Header: difftime.c,v 1.4 90/09/11 10:18:44 eck Exp $ */ #include double difftime(time_t time1, time_t time0) { /* be careful: time_t may be unsigned */ if ((time_t)-1 > 0 && time0 > time1) { return - (double) (time0 - time1); } else { return (double)(time1 - time0); } } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: div.c,v 1.3 90/03/05 13:47:53 eck Exp $ */ #include static int tmp = -1; div_t div(register int numer, register int denom) { div_t r; /* The assignment of tmp should not be optimized !! */ if (tmp == -1) { tmp = (tmp / 2 == 0); } if (numer == 0) { r.quot = numer / denom; /* might trap if denom == 0 */ r.rem = numer % denom; } else if ( !tmp && ((numer < 0) != (denom < 0))) { r.quot = (numer / denom) + 1; r.rem = numer - (numer / denom + 1) * denom; } else { r.quot = numer / denom; r.rem = numer % denom; } return r; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: errlist.c,v 1.1 89/05/10 16:22:20 eck Exp $ */ #include static const char unknown[] = "Unknown error"; const char *_sys_errlist[] = { "Error 0", /* EGENERIC */ "Not owner", /* EPERM */ "No such file or directory", /* ENOENT */ "No such process", /* ESRCH */ "Interrupted system call", /* EINTR */ "I/O error", /* EIO */ "No such device or address", /* ENXIO */ "Arg list too long", /* E2BIG */ "Exec format error", /* ENOEXEC */ "Bad file number", /* EBADF */ "No children", /* ECHILD */ "Resource temporarily unavailable",/* EAGAIN */ "Not enough core", /* ENOMEM */ "Permission denied", /* EACCES */ "Bad address", /* EFAULT */ "Block device required", /* ENOTBLK */ "Resource busy", /* EBUSY */ "File exists", /* EEXIST */ "Cross-device link", /* EXDEV */ "No such device", /* ENODEV */ "Not a directory", /* ENOTDIR */ "Is a directory", /* EISDIR */ "Invalid argument", /* EINVAL */ "File table overflow", /* ENFILE */ "Too many open files", /* EMFILE */ "Not a typewriter", /* ENOTTY */ "Text file busy", /* ETXTBSY */ "File too large", /* EFBIG */ "No space left on device", /* ENOSPC */ "Illegal seek", /* ESPIPE */ "Read-only file system", /* EROFS */ "Too many links", /* EMLINK */ "Broken pipe", /* EPIPE */ "Math argument", /* EDOM */ "Result too large", /* ERANGE */ "Resource deadlock avoided", /* EDEADLK */ "File name too long", /* ENAMETOOLONG */ "No locks available", /* ENOLCK */ "Function not implemented", /* ENOSYS */ "Directory not empty", /* ENOTEMPTY */ unknown, /* 40 */ unknown, /* 41 */ unknown, /* 42 */ unknown, /* 43 */ unknown, /* 44 */ unknown, /* 45 */ unknown, /* 46 */ unknown, /* 47 */ unknown, /* 48 */ unknown, /* 49 */ "Invalid packet size", /* EPACKSIZE */ "Not enough buffers left", /* EOUTOFBUFS */ "Illegal ioctl for device", /* EBADIOCTL */ "Bad mode for ioctl", /* EBADMODE */ "Would block", /* EWOULDBLOCK */ "Bad destination address", /* EBADDEST */ "Destination not reachable", /* EDSTNOTRCH */ "Already connected", /* EISCONN */ "Address in use", /* EADDRINUSE */ "Connection refused", /* ECONNREFUSED */ "Connection reset", /* ECONNRESET */ "Connection timed out", /* ETIMEDOUT */ "Urgent data present", /* EURG */ "No urgent data present", /* ENOURG */ "No connection", /* ENOTCONN */ "Already shutdown", /* ESHUTDOWN */ "No such connection", /* ENOCONN */ }; const int _sys_nerr = sizeof(_sys_errlist) / sizeof(_sys_errlist[0]); /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: exit.c,v 1.3 90/01/22 13:00:04 eck Exp $ */ #include #include #define NEXITS 32 void (*__functab[NEXITS])(void); int __funccnt = 0; extern void _exit(int); /* only flush output buffers when necessary */ int (*_clean)(void) = NULL; static void _calls(void) { register int i = __funccnt; /* "Called in reversed order of their registration" */ while (--i >= 0) (*__functab[i])(); } void exit(int status) { _calls(); if (_clean) _clean(); _exit(status) ; } /* (c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Id: ext_comp.c,v 1.10 1994/06/24 11:53:36 ceriel Exp $ */ /* extended precision arithmetic for the strtod() and cvt() routines */ /* This may require some more work when long doubles get bigger than 8 bytes. In this case, these routines may become obsolete. ??? */ #include "ext_fmt.h" #include #include #include static int b64_add(struct mantissa *e1, struct mantissa *e2); static b64_sft(struct mantissa *e1, int n); static mul_ext(struct EXTEND *e1, struct EXTEND *e2, struct EXTEND *e3) { /* Multiply the extended numbers e1 and e2, and put the result in e3. */ register int i,j; /* loop control */ unsigned short mp[4]; unsigned short mc[4]; unsigned short result[8]; /* result */ register unsigned short *pres; /* first save the sign (XOR) */ e3->sign = e1->sign ^ e2->sign; /* compute new exponent */ e3->exp = e1->exp + e2->exp + 1; /* check for overflow/underflow ??? */ /* 128 bit multiply of mantissas */ /* assign unknown long formats */ /* to known unsigned word formats */ mp[0] = e1->m1 >> 16; mp[1] = (unsigned short) e1->m1; mp[2] = e1->m2 >> 16; mp[3] = (unsigned short) e1->m2; mc[0] = e2->m1 >> 16; mc[1] = (unsigned short) e2->m1; mc[2] = e2->m2 >> 16; mc[3] = (unsigned short) e2->m2; for (i = 8; i--;) { result[i] = 0; } /* * fill registers with their components */ for(i=4, pres = &result[4];i--;pres--) if (mp[i]) { unsigned short k = 0; unsigned long mpi = mp[i]; for(j=4;j--;) { unsigned long tmp = (unsigned long)pres[j] + k; if (mc[j]) tmp += mpi * mc[j]; pres[j] = tmp; k = tmp >> 16; } pres[-1] = k; } if (! (result[0] & 0x8000)) { e3->exp--; for (i = 0; i <= 3; i++) { result[i] <<= 1; if (result[i+1]&0x8000) result[i] |= 1; } result[4] <<= 1; } /* * combine the registers to a total */ e3->m1 = ((unsigned long)(result[0]) << 16) + result[1]; e3->m2 = ((unsigned long)(result[2]) << 16) + result[3]; if (result[4] & 0x8000) { if (++e3->m2 == 0) { if (++e3->m1 == 0) { e3->m1 = 0x80000000; e3->exp++; } } } } static add_ext(struct EXTEND *e1, struct EXTEND *e2, struct EXTEND *e3) { /* Add two extended numbers e1 and e2, and put the result in e3 */ struct EXTEND ce2; int diff; if ((e2->m1 | e2->m2) == 0L) { *e3 = *e1; return; } if ((e1->m1 | e1->m2) == 0L) { *e3 = *e2; return; } ce2 = *e2; *e3 = *e1; e1 = &ce2; /* adjust mantissas to equal power */ diff = e3->exp - e1->exp; if (diff < 0) { diff = -diff; e3->exp += diff; b64_sft(&(e3->mantissa), diff); } else if (diff > 0) { e1->exp += diff; b64_sft(&(e1->mantissa), diff); } if (e1->sign != e3->sign) { /* e3 + e1 = e3 - (-e1) */ if (e1->m1 > e3->m1 || (e1->m1 == e3->m1 && e1->m2 > e3->m2)) { /* abs(e1) > abs(e3) */ if (e3->m2 > e1->m2) { e1->m1 -= 1; /* carry in */ } e1->m1 -= e3->m1; e1->m2 -= e3->m2; *e3 = *e1; } else { if (e1->m2 > e3->m2) e3->m1 -= 1; /* carry in */ e3->m1 -= e1->m1; e3->m2 -= e1->m2; } } else { if (b64_add(&e3->mantissa,&e1->mantissa)) {/* addition carry */ b64_sft(&e3->mantissa,1);/* shift mantissa one bit RIGHT */ e3->m1 |= 0x80000000L; /* set max bit */ e3->exp++; /* increase the exponent */ } } if ((e3->m2 | e3->m1) != 0L) { /* normalize */ if (e3->m1 == 0L) { e3->m1 = e3->m2; e3->m2 = 0L; e3->exp -= 32; } if (!(e3->m1 & 0x80000000)) { unsigned long l = 0x40000000; int cnt = -1; while (! (l & e3->m1)) { l >>= 1; cnt--; } e3->exp += cnt; b64_sft(&(e3->mantissa), cnt); } } } static int cmp_ext(struct EXTEND *e1, struct EXTEND *e2) { struct EXTEND tmp; e2->sign = ! e2->sign; add_ext(e1, e2, &tmp); e2->sign = ! e2->sign; if (tmp.m1 == 0 && tmp.m2 == 0) return 0; if (tmp.sign) return -1; return 1; } static b64_sft(struct mantissa *e1, int n) { if (n > 0) { if (n > 63) { e1->l_32 = 0; e1->h_32 = 0; return; } if (n >= 32) { e1->l_32 = e1->h_32; e1->h_32 = 0; n -= 32; } if (n > 0) { e1->l_32 >>= n; if (e1->h_32 != 0) { e1->l_32 |= (e1->h_32 << (32 - n)); e1->h_32 >>= n; } } return; } n = -n; if (n > 0) { if (n > 63) { e1->l_32 = 0; e1->h_32 = 0; return; } if (n >= 32) { e1->h_32 = e1->l_32; e1->l_32 = 0; n -= 32; } if (n > 0) { e1->h_32 <<= n; if (e1->l_32 != 0) { e1->h_32 |= (e1->l_32 >> (32 - n)); e1->l_32 <<= n; } } } } static int b64_add(struct mantissa *e1, struct mantissa *e2) /* * pointers to 64 bit 'registers' */ { register int overflow; int carry; /* add higher pair of 32 bits */ overflow = ((unsigned long) 0xFFFFFFFF - e1->h_32 < e2->h_32); e1->h_32 += e2->h_32; /* add lower pair of 32 bits */ carry = ((unsigned long) 0xFFFFFFFF - e1->l_32 < e2->l_32); e1->l_32 += e2->l_32; if ((carry) && (++e1->h_32 == 0)) return(1); /* had a 64 bit overflow */ else return(overflow); /* return status from higher add */ } /* The following tables can be computed with the following bc(1) program: obase=16 scale=0 define t(x){ auto a, b, c a=2;b=1;c=2^32;n=1 while(asign = 0; e->exp = 0; e->m1 = e->m2 = 0; c = *s; switch(c) { case '-': e->sign = 1; case '+': s++; } while (c = *s++, isdigit(c) || (c == '.' && ! dotseen++)) { if (c == '.') continue; digitseen = 1; if (e->m1 <= (unsigned long)(0xFFFFFFFF)/10) { struct mantissa a1; a1 = e->mantissa; b64_sft(&(e->mantissa), -3); b64_sft(&a1, -1); b64_add(&(e->mantissa), &a1); a1.h_32 = 0; a1.l_32 = c - '0'; b64_add(&(e->mantissa), &a1); } else exp++; if (dotseen) exp--; } if (! digitseen) return; if (ss) *ss = (char *)s - 1; if (c == 'E' || c == 'e') { int exp1 = 0; int sign = 1; int exp_overflow = 0; switch(*s) { case '-': sign = -1; case '+': s++; } if (c = *s, isdigit(c)) { do { int tmp; exp1 = 10 * exp1 + (c - '0'); if ((tmp = sign * exp1 + exp) > MAX_EXP || tmp < -MAX_EXP) { exp_overflow = 1; } } while (c = *++s, isdigit(c)); if (ss) *ss = (char *)s; } exp += sign * exp1; if (exp_overflow) { exp = sign * MAX_EXP; if (e->m1 != 0 || e->m2 != 0) errno = ERANGE; } } if (e->m1 == 0 && e->m2 == 0) return; e->exp = 63; while (! (e->m1 & 0x80000000)) { b64_sft(&(e->mantissa),-1); e->exp--; } add_exponent(e, exp); } #include static ten_mult(struct EXTEND *e) { struct EXTEND e1 = *e; e1.exp++; e->exp += 3; add_ext(e, &e1, e); } #define NDIGITS 128 #define NSIGNIFICANT 19 char * _ext_str_cvt(struct EXTEND *e, int ndigit, int *decpt, int *sign, int ecvtflag) { /* Like cvt(), but for extended precision */ static char buf[NDIGITS+1]; struct EXTEND m; register char *p = buf; register char *pe; int findex = 0; if (ndigit < 0) ndigit = 0; if (ndigit > NDIGITS) ndigit = NDIGITS; pe = &buf[ndigit]; buf[0] = '\0'; *sign = 0; if (e->sign) { *sign = 1; e->sign = 0; } *decpt = 0; if (e->m1 != 0) { register struct EXTEND *pp = &big_ten_powers[1]; while(cmp_ext(e,pp) >= 0) { pp++; findex = pp - big_ten_powers; if (findex >= BTP) break; } pp--; findex = pp - big_ten_powers; mul_ext(e,&r_big_ten_powers[findex],e); *decpt += findex * TP; pp = &ten_powers[1]; while(pp < &ten_powers[TP] && cmp_ext(e, pp) >= 0) pp++; pp--; findex = pp - ten_powers; *decpt += findex; if (cmp_ext(e, &ten_powers[0]) < 0) { pp = &r_big_ten_powers[1]; while(cmp_ext(e,pp) < 0) pp++; pp--; findex = pp - r_big_ten_powers; mul_ext(e, &big_ten_powers[findex], e); *decpt -= findex * TP; /* here, value >= 10 ** -28 */ ten_mult(e); (*decpt)--; pp = &r_ten_powers[0]; while(cmp_ext(e, pp) < 0) pp++; findex = pp - r_ten_powers; mul_ext(e, &ten_powers[findex], e); *decpt -= findex; findex = 0; } (*decpt)++; /* because now value in [1.0, 10.0) */ } if (! ecvtflag) { /* for fcvt() we need ndigit digits behind the dot */ pe += *decpt; if (pe > &buf[NDIGITS]) pe = &buf[NDIGITS]; } m.exp = -62; m.sign = 0; m.m1 = 0xA0000000; m.m2 = 0; while (p <= pe) { struct EXTEND oneminm; if (p - pe > NSIGNIFICANT) { findex = 0; e->m1 = 0; } if (findex) { struct EXTEND tc, oldtc; int count = 0; oldtc.exp = 0; oldtc.sign = 0; oldtc.m1 = 0; oldtc.m2 = 0; tc = ten_powers[findex]; while (cmp_ext(e, &tc) >= 0) { oldtc = tc; add_ext(&tc, &ten_powers[findex], &tc); count++; } *p++ = count + '0'; oldtc.sign = 1; add_ext(e, &oldtc, e); findex--; continue; } if (e->m1) { m.sign = 1; add_ext(&ten_powers[0], &m, &oneminm); m.sign = 0; if (e->exp >= 0) { struct EXTEND x; x.m2 = 0; x.exp = e->exp; x.sign = 1; x.m1 = e->m1>>(31-e->exp); *p++ = (x.m1) + '0'; x.m1 = x.m1 << (31-e->exp); add_ext(e, &x, e); } else *p++ = '0'; /* Check that remainder is still significant */ if (cmp_ext(&m, e) > 0 || cmp_ext(e, &oneminm) > 0) { if (e->m1 && e->exp >= -1) *(p-1) += 1; e->m1 = 0; continue; } ten_mult(&m); ten_mult(e); } else *p++ = '0'; } if (pe >= buf) { p = pe; *p += 5; /* round of at the end */ while (*p > '9') { *p = '0'; if (p > buf) ++*--p; else { *p = '1'; ++*decpt; if (! ecvtflag) { /* maybe add another digit at the end, because the point was shifted right */ if (pe > buf) *pe = '0'; pe++; } } } *pe = '\0'; } return buf; } _dbl_ext_cvt(double value, struct EXTEND *e) { /* Convert double to extended */ int exponent; value = frexp(value, &exponent); e->sign = value < 0.0; if (e->sign) value = -value; e->exp = exponent - 1; value *= 4294967296.0; e->m1 = value; value -= e->m1; value *= 4294967296.0; e->m2 = value; } static struct EXTEND max_d; double _ext_dbl_cvt(struct EXTEND *e) { /* Convert extended to double */ double f; int sign = e->sign; e->sign = 0; if (e->m1 == 0 && e->m2 == 0) { return 0.0; } if (max_d.exp == 0) { _dbl_ext_cvt(DBL_MAX, &max_d); } if (cmp_ext(&max_d, e) < 0) { f = HUGE_VAL; errno = ERANGE; } else f = ldexp((double)e->m1*4294967296.0 + (double)e->m2, e->exp-63); if (sign) f = -f; if (f == 0.0 && (e->m1 != 0 || e->m2 != 0)) { errno = ERANGE; } return f; } struct mantissa { unsigned long h_32; unsigned long l_32; }; struct EXTEND { short sign; short exp; struct mantissa mantissa; #define m1 mantissa.h_32 #define m2 mantissa.l_32 }; /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: getenv.c,v 1.4 91/04/24 12:18:03 ceriel Exp $ */ #include extern const char ***_penviron; char * getenv(const char *name) { register const char **v = *_penviron; register const char *p, *q; if (v == NULL || name == NULL) return (char *)NULL; while ((p = *v++) != NULL) { q = name; while (*q && (*q == *p++)) q++; if (*q || (*p != '=')) continue; return (char *)p + 1; } return (char *)NULL; } /* * gmtime - convert the calendar time into broken down time */ /* $Header: gmtime.c,v 1.4 91/04/22 13:20:27 ceriel Exp $ */ #include #include #include "loc_time.h" struct tm * gmtime(register const time_t *timer) { static struct tm br_time; register struct tm *timep = &br_time; time_t time = *timer; register unsigned long dayclock, dayno; int year = EPOCH_YR; dayclock = (unsigned long)time % SECS_DAY; dayno = (unsigned long)time / SECS_DAY; timep->tm_sec = dayclock % 60; timep->tm_min = (dayclock % 3600) / 60; timep->tm_hour = dayclock / 3600; timep->tm_wday = (dayno + 4) % 7; /* day 0 was a thursday */ while (dayno >= YEARSIZE(year)) { dayno -= YEARSIZE(year); year++; } timep->tm_year = year - YEAR0; timep->tm_yday = dayno; timep->tm_mon = 0; while (dayno >= _ytab[LEAPYEAR(year)][timep->tm_mon]) { dayno -= _ytab[LEAPYEAR(year)][timep->tm_mon]; timep->tm_mon++; } timep->tm_mday = dayno + 1; timep->tm_isdst = 0; return timep; } #include int (isalnum)(int c) { return isalnum(c); } #include int (isalpha)(int c) { return isalpha(c); } #include int (isascii)(int c) { return isascii(c); } #include int (iscntrl)(int c) { return iscntrl(c); } #include int (isdigit)(int c) { return isdigit(c); } #include int (isgraph)(int c) { return isgraph(c); } #include int (islower)(int c) { return islower(c); } #include int (isprint)(int c) { return isprint(c); } #include int (ispunct)(int c) { return ispunct(c); } #include int (isspace)(int c) { return isspace(c); } #include int (isupper)(int c) { return isupper(c); } #include int (isxdigit)(int c) { return isxdigit(c); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: labs.c,v 1.1 89/05/16 13:08:11 eck Exp $ */ #include long labs(register long l) { return l >= 0 ? l : -l; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: ldiv.c,v 1.3 90/03/05 13:48:03 eck Exp $ */ #include static long tmp = -1; ldiv_t ldiv(register long numer, register long denom) { ldiv_t r; /* The assignment of tmp should not be optimized !! */ if (tmp == -1) { tmp = (tmp / 2 == 0); } if (numer == 0) { r.quot = numer / denom; /* might trap if denom == 0 */ r.rem = numer % denom; } else if ( !tmp && ((numer < 0) != (denom < 0))) { r.quot = (numer / denom) + 1; r.rem = numer - (numer / denom + 1) * denom; } else { r.quot = numer / denom; r.rem = numer % denom; } return r; } /* * loc_time.h - some local definitions */ /* $Header: loc_time.h,v 1.1 91/04/22 13:19:51 ceriel Exp $ */ #define YEAR0 1900 /* the first year */ #define EPOCH_YR 1970 /* EPOCH = Jan 1 1970 00:00:00 */ #define SECS_DAY (24L * 60L * 60L) #define LEAPYEAR(year) (!((year) % 4) && (((year) % 100) || !((year) % 400))) #define YEARSIZE(year) (LEAPYEAR(year) ? 366 : 365) #define FIRSTSUNDAY(timp) (((timp)->tm_yday - (timp)->tm_wday + 420) % 7) #define FIRSTDAYOF(timp) (((timp)->tm_wday - (timp)->tm_yday + 420) % 7) #define TIME_MAX ULONG_MAX #define ABB_LEN 3 extern const int _ytab[2][12]; extern const char *_days[]; extern const char *_months[]; void _tzset(void); unsigned _dstget(struct tm *timep); extern long _timezone; extern long _dst_off; extern int _daylight; extern char *_tzname[2]; /* * localeconv - set components of a struct according to current locale */ /* $Header: localeconv.c,v 1.2 89/12/18 15:48:58 eck Exp $ */ #include #include extern struct lconv _lc; struct lconv * localeconv(void) { register struct lconv *lcp = &_lc; lcp->decimal_point = "."; lcp->thousands_sep = ""; lcp->grouping = ""; lcp->int_curr_symbol = ""; lcp->currency_symbol = ""; lcp->mon_decimal_point = ""; lcp->mon_thousands_sep = ""; lcp->mon_grouping = ""; lcp->positive_sign = ""; lcp->negative_sign = ""; lcp->int_frac_digits = CHAR_MAX; lcp->frac_digits = CHAR_MAX; lcp->p_cs_precedes = CHAR_MAX; lcp->p_sep_by_space = CHAR_MAX; lcp->n_cs_precedes = CHAR_MAX; lcp->n_sep_by_space = CHAR_MAX; lcp->p_sign_posn = CHAR_MAX; lcp->n_sign_posn = CHAR_MAX; return lcp; } /* * localtime - convert a calendar time into broken down time */ /* $Header: localtime.c,v 1.3 91/04/22 13:20:36 ceriel Exp $ */ #include #include "loc_time.h" /* We must be careful, since an int can't represent all the seconds in a day. * Hence the adjustment of minutes when adding timezone and dst information. * This assumes that both must be expressable in multiples of a minute. * Furthermore, it is assumed that both fit into an integer when expressed as * minutes (this is about 22 days, so this should not cause any problems). */ struct tm * localtime(const time_t *timer) { struct tm *timep; unsigned dst; _tzset(); timep = gmtime(timer); /* tm->tm_isdst == 0 */ timep->tm_min -= _timezone / 60; timep->tm_sec -= _timezone % 60; mktime(timep); dst = _dstget(timep); if (dst) { timep->tm_min += dst / 60; timep->tm_sec += dst % 60; mktime(timep); } return timep; } /* $Header$ */ /* replace undef by define */ #undef DEBUG /* check assertions */ #undef SLOWDEBUG /* some extra test loops (requires DEBUG) */ #ifndef DEBUG #define NDEBUG #endif #include #include #include #include #if _EM_WSIZE == _EM_PSIZE #define ptrint int #else #define ptrint long #endif #if _EM_PSIZE == 2 #define BRKSIZE 1024 #else #define BRKSIZE 4096 #endif #define PTRSIZE ((int) sizeof(void *)) #define Align(x,a) (((x) + (a - 1)) & ~(a - 1)) #define NextSlot(p) (* (void **) ((p) - PTRSIZE)) #define NextFree(p) (* (void **) (p)) /* * A short explanation of the data structure and algorithms. * An area returned by malloc() is called a slot. Each slot * contains the number of bytes requested, but preceeded by * an extra pointer to the next the slot in memory. * '_bottom' and '_top' point to the first/last slot. * More memory is asked for using brk() and appended to top. * The list of free slots is maintained to keep malloc() fast. * '_empty' points the the first free slot. Free slots are * linked together by a pointer at the start of the * user visable part, so just after the next-slot pointer. * Free slots are merged together by free(). */ extern void *_sbrk(int); extern int _brk(void *); static void *_bottom, *_top, *_empty; static int grow(size_t len) { register char *p; assert(NextSlot((char *)_top) == 0); if ((char *) _top + len < (char *) _top || (p = (char *)Align((ptrint)_top + len, BRKSIZE)) < (char *) _top ) { errno = ENOMEM; return(0); } if (_brk(p) != 0) return(0); NextSlot((char *)_top) = p; NextSlot(p) = 0; free(_top); _top = p; return 1; } void * malloc(size_t size) { register char *prev, *p, *next, *new; register unsigned len, ntries; if (size == 0) return NULL; for (ntries = 0; ntries < 2; ntries++) { if ((len = Align(size, PTRSIZE) + PTRSIZE) < 2 * PTRSIZE) { errno = ENOMEM; return NULL; } if (_bottom == 0) { if ((p = _sbrk(2 * PTRSIZE)) == (char *) -1) return NULL; p = (char *) Align((ptrint)p, PTRSIZE); p += PTRSIZE; _top = _bottom = p; NextSlot(p) = 0; } #ifdef SLOWDEBUG for (p = _bottom; (next = NextSlot(p)) != 0; p = next) assert(next > p); assert(p == _top); #endif for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) { next = NextSlot(p); new = p + len; /* easily overflows!! */ if (new > next || new <= p) continue; /* too small */ if (new + PTRSIZE < next) { /* too big, so split */ /* + PTRSIZE avoids tiny slots on free list */ NextSlot(new) = next; NextSlot(p) = new; NextFree(new) = NextFree(p); NextFree(p) = new; } if (prev) NextFree(prev) = NextFree(p); else _empty = NextFree(p); return p; } if (grow(len) == 0) break; } assert(ntries != 2); return NULL; } void * realloc(void *oldp, size_t size) { register char *prev, *p, *next, *new; char *old = oldp; register size_t len, n; if (old == 0) return malloc(size); if (size == 0) { free(old); return NULL; } len = Align(size, PTRSIZE) + PTRSIZE; next = NextSlot(old); n = (int)(next - old); /* old length */ /* * extend old if there is any free space just behind it */ for (prev = 0, p = _empty; p != 0; prev = p, p = NextFree(p)) { if (p > next) break; if (p == next) { /* 'next' is a free slot: merge */ NextSlot(old) = NextSlot(p); if (prev) NextFree(prev) = NextFree(p); else _empty = NextFree(p); next = NextSlot(old); break; } } new = old + len; /* * Can we use the old, possibly extended slot? */ if (new <= next && new >= old) { /* it does fit */ if (new + PTRSIZE < next) { /* too big, so split */ /* + PTRSIZE avoids tiny slots on free list */ NextSlot(new) = next; NextSlot(old) = new; free(new); } return old; } if ((new = malloc(size)) == NULL) /* it didn't fit */ return NULL; memcpy(new, old, n); /* n < size */ free(old); return new; } void free(void *ptr) { register char *prev, *next; char *p = ptr; if (p == 0) return; assert(NextSlot(p) > p); for (prev = 0, next = _empty; next != 0; prev = next, next = NextFree(next)) if (p < next) break; NextFree(p) = next; if (prev) NextFree(prev) = p; else _empty = p; if (next) { assert(NextSlot(p) <= next); if (NextSlot(p) == next) { /* merge p and next */ NextSlot(p) = NextSlot(next); NextFree(p) = NextFree(next); } } if (prev) { assert(NextSlot(prev) <= p); if (NextSlot(prev) == p) { /* merge prev and p */ NextSlot(prev) = NextSlot(p); NextFree(prev) = NextFree(p); } } } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mblen.c,v 1.2 89/12/18 15:12:50 eck Exp $ */ #include #include #define CHAR_SHIFT 8 int mblen(const char *s, size_t n) { if (s == (const char *)NULL) return 0; /* no state dependent codings */ if (n <= 0) return 0; return (*s != 0); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mbstowcs.c,v 1.2 89/12/18 15:12:59 eck Exp $ */ #include size_t mbstowcs(register wchar_t *pwcs, register const char *s, size_t n) { register int i = n; while (--i >= 0) { if (!(*pwcs++ = *s++)) return n - i - 1; } return n - i; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mbtowc.c,v 1.3 90/03/28 16:36:45 eck Exp $ */ #include #include int mbtowc(wchar_t *pwc, register const char *s, size_t n) { if (s == (const char *)NULL) return 0; if (n <= 0) return 0; if (pwc) *pwc = *s; return (*s != 0); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: memchr.c,v 1.3 90/08/28 13:52:11 eck Exp $ */ #include void * memchr(const void *s, register int c, register size_t n) { register const unsigned char *s1 = s; c = (unsigned char) c; if (n) { n++; while (--n > 0) { if (*s1++ != c) continue; return (void *) --s1; } } return NULL; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Id: memcmp.c,v 1.6 1994/06/24 11:56:26 ceriel Exp $ */ #include int memcmp(const void *s1, const void *s2, size_t n) { register const unsigned char *p1 = s1, *p2 = s2; if (n) { n++; while (--n > 0) { if (*p1++ == *p2++) continue; return *--p1 - *--p2; } } return 0; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: memcpy.c,v 1.4 90/08/28 13:52:31 eck Exp $ */ #include void * memcpy(void *s1, const void *s2, register size_t n) { register char *p1 = s1; register const char *p2 = s2; if (n) { n++; while (--n > 0) { *p1++ = *p2++; } } return s1; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: memmove.c,v 1.3 90/08/28 13:52:42 eck Exp $ */ #include void * memmove(void *s1, const void *s2, register size_t n) { register char *p1 = s1; register const char *p2 = s2; if (n>0) { if (p2 <= p1 && p2 + n > p1) { /* overlap, copy backwards */ p1 += n; p2 += n; n++; while (--n > 0) { *--p1 = *--p2; } } else { n++; while (--n > 0) { *p1++ = *p2++; } } } return s1; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: memset.c,v 1.3 90/08/28 13:52:54 eck Exp $ */ #include void * memset(void *s, register int c, register size_t n) { register char *s1 = s; if (n>0) { n++; while (--n > 0) { *s1++ = c; } } return s; } /* * misc - data and miscellaneous routines */ /* $Header: misc.c,v 1.11 91/04/22 13:20:45 ceriel Exp $ */ #include #include #include #include #if defined(__BSD4_2) struct timeval { long tv_sec; /* seconds */ long tv_usec; /* and microseconds */ }; struct timezone { int tz_minuteswest; /* minutes west of Greenwich */ int tz_dsttime; /* type of dst correction */ }; int _gettimeofday(struct timeval *tp, struct timezone *tzp); #elif !defined(_POSIX_SOURCE) && !defined(__USG) #if !defined(_MINIX) /* MINIX has no ftime() */ struct timeb { long time; unsigned short millitm; short timezone; short dstflag; }; void _ftime(struct timeb *bp); #endif #endif #include "loc_time.h" #define RULE_LEN 120 #define TZ_LEN 10 /* Make sure that the strings do not end up in ROM. * These strings probably contain the wrong value, and we cannot obtain the * right value from the system. TZ is the only help. */ static char ntstr[TZ_LEN + 1] = "GMT"; /* string for normal time */ static char dststr[TZ_LEN + 1] = "GDT"; /* string for daylight saving */ long _timezone = 0; long _dst_off = 60 * 60; int _daylight = 0; char *_tzname[2] = {ntstr, dststr}; #if defined(__USG) || defined(_POSIX_SOURCE) char *tzname[2] = {ntstr, dststr}; #if defined(__USG) long timezone = 0; int daylight = 0; #endif #endif static struct dsttype { char ds_type; /* Unknown, Julian, Zero-based or M */ int ds_date[3]; /* months, weeks, days */ long ds_sec; /* usually 02:00:00 */ } dststart = { 'U', { 0, 0, 0 }, 2 * 60 * 60 } , dstend = { 'U', { 0, 0, 0 }, 2 * 60 * 60 }; const char *_days[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; const char *_months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; const int _ytab[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; static const char * parseZoneName(register char *buf, register const char *p) { register int n = 0; if (*p == ':') return NULL; while (*p && !isdigit(*p) && *p != ',' && *p != '-' && *p != '+') { if (n < TZ_LEN) *buf++ = *p; p++; n++; } if (n < 3) return NULL; /* error */ *buf = '\0'; return p; } static const char * parseTime(register long *tm, const char *p, register struct dsttype *dst) { register int n = 0; register const char *q = p; char ds_type = (dst ? dst->ds_type : '\0'); if (dst) dst->ds_type = 'U'; *tm = 0; while(*p >= '0' && *p <= '9') { n = 10 * n + (*p++ - '0'); } if (q == p) return NULL; /* "The hour shall be required" */ if (n < 0 || n >= 24) return NULL; *tm = n * 60 * 60; if (*p == ':') { p++; n = 0; while(*p >= '0' && *p <= '9') { n = 10 * n + (*p++ - '0'); } if (q == p) return NULL; /* format error */ if (n < 0 || n >= 60) return NULL; *tm += n * 60; if (*p == ':') { p++; n = 0; while(*p >= '0' && *p <= '9') { n = 10 * n + (*p++ - '0'); } if (q == p) return NULL; /* format error */ if (n < 0 || n >= 60) return NULL; *tm += n; } } if (dst) { dst->ds_type = ds_type; dst->ds_sec = *tm; } return p; } static const char * parseDate(register char *buf, register const char *p, struct dsttype *dstinfo) { register const char *q; register int n = 0; int cnt = 0; const int bnds[3][2] = { { 1, 12 }, { 1, 5 }, { 0, 6} }; char ds_type; if (*p != 'M') { if (*p == 'J') { *buf++ = *p++; ds_type = 'J'; } else ds_type = 'Z'; q = p; while(*p >= '0' && *p <= '9') { n = 10 * n + (*p - '0'); *buf++ = *p++; } if (q == p) return NULL; /* format error */ if (n < (ds_type == 'J') || n > 365) return NULL; dstinfo->ds_type = ds_type; dstinfo->ds_date[0] = n; return p; } ds_type = 'M'; do { *buf++ = *p++; q = p; n = 0; while(*p >= '0' && *p <= '9') { n = 10 * n + (*p - '0'); *buf++ = *p++; } if (q == p) return NULL; /* format error */ if (n < bnds[cnt][0] || n > bnds[cnt][1]) return NULL; dstinfo->ds_date[cnt] = n; cnt++; } while (cnt < 3 && *p == '.'); if (cnt != 3) return NULL; *buf = '\0'; dstinfo->ds_type = ds_type; return p; } static const char * parseRule(register char *buf, register const char *p) { long time; register const char *q; if (!(p = parseDate(buf, p, &dststart))) return NULL; buf += strlen(buf); if (*p == '/') { q = ++p; if (!(p = parseTime(&time, p, &dststart))) return NULL; while( p != q) *buf++ = *q++; } if (*p != ',') return NULL; p++; if (!(p = parseDate(buf, p, &dstend))) return NULL; buf += strlen(buf); if (*p == '/') { q = ++p; if (!(p = parseTime(&time, p, &dstend))) return NULL; while(*buf++ = *q++); } if (*p) return NULL; return p; } /* The following routine parses timezone information in POSIX-format. For * the requirements, see IEEE Std 1003.1-1988 section 8.1.1. * The function returns as soon as it spots an error. */ static void parseTZ(const char *p) { long tz, dst = 60 * 60, sign = 1; static char lastTZ[2 * RULE_LEN]; static char buffer[RULE_LEN]; if (!p) return; if (*p == ':') { /* * According to POSIX, this is implementation defined. * Since it depends on the particular operating system, we * can do nothing. */ return; } if (!strcmp(lastTZ, p)) return; /* nothing changed */ *_tzname[0] = '\0'; *_tzname[1] = '\0'; dststart.ds_type = 'U'; dststart.ds_sec = 2 * 60 * 60; dstend.ds_type = 'U'; dstend.ds_sec = 2 * 60 * 60; if (strlen(p) > 2 * RULE_LEN) return; strcpy(lastTZ, p); if (!(p = parseZoneName(buffer, p))) return; if (*p == '-') { sign = -1; p++; } else if (*p == '+') p++; if (!(p = parseTime(&tz, p, NULL))) return; tz *= sign; _timezone = tz; strncpy(_tzname[0], buffer, TZ_LEN); if (!(_daylight = (*p != '\0'))) return; buffer[0] = '\0'; if (!(p = parseZoneName(buffer, p))) return; strncpy(_tzname[1], buffer, TZ_LEN); buffer[0] = '\0'; if (*p && (*p != ',')) if (!(p = parseTime(&dst, p, NULL))) return; _dst_off = dst; /* dst was initialized to 1 hour */ if (*p) { if (*p != ',') return; p++; if (strlen(p) > RULE_LEN) return; if (!(p = parseRule(buffer, p))) return; } } void _tzset(void) { #if defined(__BSD4_2) struct timeval tv; struct timezone tz; _gettimeofday(&tv, &tz); _daylight = tz.tz_dsttime; _timezone = tz.tz_minuteswest * 60L; #elif !defined(_POSIX_SOURCE) && !defined(__USG) #if !defined(_MINIX) /* MINIX has no ftime() */ struct timeb time; _ftime(&time); _timezone = time.timezone * 60L; _daylight = time.dstflag; #endif #endif /* !_POSIX_SOURCE && !__USG */ parseTZ(getenv("TZ")); /* should go inside #if */ #if defined(__USG) || defined(_POSIX_SOURCE) tzname[0] = _tzname[0]; tzname[1] = _tzname[1]; #if defined(__USG) timezone = _timezone; daylight = _daylight; #endif #endif /* __USG || _POSIX_SOURCE */ } static int last_sunday(register int day, register struct tm *timep) { int first = FIRSTSUNDAY(timep); if (day >= 58 && LEAPYEAR(YEAR0 + timep->tm_year)) day++; if (day < first) return first; return day - (day - first) % 7; } static int date_of(register struct dsttype *dst, struct tm *timep) { int leap = LEAPYEAR(YEAR0 + timep->tm_year); int firstday, tmpday; register int day, month; if (dst->ds_type != 'M') { return dst->ds_date[0] - (dst->ds_type == 'J' && leap && dst->ds_date[0] < 58); } day = 0; month = 1; while (month < dst->ds_date[0]) { day += _ytab[leap][month - 1]; month++; } firstday = (day + FIRSTDAYOF(timep)) % 7; tmpday = day; day += (dst->ds_date[2] - firstday + 7) % 7 + 7 * (dst->ds_date[1] - 1); if (day >= tmpday + _ytab[leap][month]) day -= 7; return day; } /* * The default dst transitions are those for Western Europe (except Great * Britain). */ unsigned _dstget(register struct tm *timep) { int begindst, enddst; register struct dsttype *dsts = &dststart, *dste = &dstend; int do_dst = 0; if (_daylight == -1) _tzset(); timep->tm_isdst = _daylight; if (!_daylight) return 0; if (dsts->ds_type != 'U') begindst = date_of(dsts, timepc.e.f.); else begindst = last_sunday(89, timep); /* last Sun before Apr */ if (dste->ds_type != 'U') enddst = date_of(dste, timep); else enddst = last_sunday(272, timep); /* last Sun in Sep */ /* assume begindst != enddst (otherwise it would be no use) */ if (begindst < enddst) { /* northern hemisphere */ if (timep->tm_yday > begindst && timep->tm_yday < enddst) do_dst = 1; } else { /* southern hemisphere */ if (timep->tm_yday > begindst || timep->tm_yday < enddst) do_dst = 1; } if (!do_dst && (timep->tm_yday == begindst || timep->tm_yday == enddst)) { long dsttranssec; /* transition when day is this old */ long cursec; if (timep->tm_yday == begindst) dsttranssec = dsts->ds_sec; else dsttranssec = dste->ds_sec; cursec = ((timep->tm_hour * 60) + timep->tm_min) * 60L + timep->tm_sec; if ((timep->tm_yday == begindst && cursec >= dsttranssec) || (timep->tm_yday == enddst && cursec < dsttranssec)) do_dst = 1; } if (do_dst) return _dst_off; timep->tm_isdst = 0; return 0; } /* * mktime - convert local time into calendar time */ /* $Header: mktime.c,v 1.5 91/04/22 13:20:54 ceriel Exp $ */ /* Michael A. Temari 03/01/96 */ /* - fixed bug is structure fixup code */ #include #include #include "loc_time.h" /* The code assumes that unsigned long can be converted to time_t. * A time_t should not be wider than unsigned long, since this would mean * that the check for overflow at the end could fail. */ time_t mktime(register struct tm *timep) { register long day, year; register int tm_year; int yday, month; register unsigned long seconds; int overflow; unsigned dst; timep->tm_min += timep->tm_sec / 60; timep->tm_sec %= 60; if (timep->tm_sec < 0) { timep->tm_sec += 60; timep->tm_min--; } timep->tm_hour += timep->tm_min / 60; timep->tm_min = timep->tm_min % 60; if (timep->tm_min < 0) { timep->tm_min += 60; timep->tm_hour--; } day = timep->tm_hour / 24; timep->tm_hour= timep->tm_hour % 24; if (timep->tm_hour < 0) { timep->tm_hour += 24; day--; } timep->tm_year += timep->tm_mon / 12; timep->tm_mon %= 12; if (timep->tm_mon < 0) { timep->tm_mon += 12; timep->tm_year--; } day += (timep->tm_mday - 1); while (day < 0) { if(--timep->tm_mon < 0) { timep->tm_year--; timep->tm_mon = 11; } day += _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]; } while (day >= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]) { day -= _ytab[LEAPYEAR(YEAR0 + timep->tm_year)][timep->tm_mon]; if (++(timep->tm_mon) == 12) { timep->tm_mon = 0; timep->tm_year++; } } timep->tm_mday = day + 1; _tzset(); /* set timezone and dst info */ year = EPOCH_YR; if (timep->tm_year < year - YEAR0) return (time_t)-1; seconds = 0; day = 0; /* means days since day 0 now */ overflow = 0; /* Assume that when day becomes negative, there will certainly * be overflow on seconds. * The check for overflow needs not to be done for leapyears * divisible by 400. * The code only works when year (1970) is not a leapyear. */ #if EPOCH_YR != 1970 #error EPOCH_YR != 1970 #endif tm_year = timep->tm_year + YEAR0; if (LONG_MAX / 365 < tm_year - year) overflow++; day = (tm_year - year) * 365; if (LONG_MAX - day < (tm_year - year) / 4 + 1) overflow++; day += (tm_year - year) / 4 + ((tm_year % 4) && tm_year % 4 < year % 4); day -= (tm_year - year) / 100 + ((tm_year % 100) && tm_year % 100 < year % 100); day += (tm_year - year) / 400 + ((tm_year % 400) && tm_year % 400 < year % 400); yday = month = 0; while (month < timep->tm_mon) { yday += _ytab[LEAPYEAR(tm_year)][month]; month++; } yday += (timep->tm_mday - 1); if (day + yday < 0) overflow++; day += yday; timep->tm_yday = yday; timep->tm_wday = (day + 4) % 7; /* day 0 was thursday (4) */ seconds = ((timep->tm_hour * 60L) + timep->tm_min) * 60L + timep->tm_sec; if ((TIME_MAX - seconds) / SECS_DAY < day) overflow++; seconds += day * SECS_DAY; /* Now adjust according to timezone and daylight saving time */ if (((_timezone > 0) && (TIME_MAX - _timezone < seconds)) || ((_timezone < 0) && (seconds < -_timezone))) overflow++; seconds += _timezone; if (timep->tm_isdst < 0) dst = _dstget(timep); else if (timep->tm_isdst) dst = _dst_off; else dst = 0; if (dst > seconds) overflow++; /* dst is always non-negative */ seconds -= dst; if (overflow) return (time_t)-1; if ((time_t)seconds != seconds) return (time_t)-1; return (time_t)seconds; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: qsort.c,v 1.3 90/08/28 14:03:24 eck Exp $ */ #include static void qsort1(char *, char *, size_t); static int (*qcompar)(const char *, const char *); static void qexchange(char *, char *, size_t); static void q3exchange(char *, char *, char *, size_t); void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)) { /* when nel is 0, the expression '(nel - 1) * width' is wrong */ if (!nel) return; qcompar = (int (*)(const char *, const char *)) compar; qsort1(base, (char *)base + (nel - 1) * width, width); } static void qsort1(char *a1, char *a2, register size_t width) { register char *left, *right; register char *lefteq, *righteq; int cmp; for (;;) { if (a2 <= a1) return; left = a1; right = a2; lefteq = righteq = a1 + width * (((a2-a1)+width)/(2*width)); /* Pick an element in the middle of the array. We will collect the equals around it. "lefteq" and "righteq" indicate the left and right bounds of the equals respectively. Smaller elements end up left of it, larger elements end up right of it. */ again: while (left < lefteq && (cmp = (*qcompar)(left, lefteq)) <= 0) { if (cmp < 0) { /* leave it where it is */ left += width; } else { /* equal, so exchange with the element to the left of the "equal"-interval. */ lefteq -= width; qexchange(left, lefteq, width); } } while (right > righteq) { if ((cmp = (*qcompar)(right, righteq)) < 0) { /* smaller, should go to left part */ if (left < lefteq) { /* yes, we had a larger one at the left, so we can just exchange */ qexchange(left, right, width); left += width; right -= width; goto again; } /* no more room at the left part, so we move the "equal-interval" one place to the right, and the smaller element to the left of it. This is best expressed as a three-way exchange. */ righteq += width; q3exchange(left, righteq, right, width); lefteq += width; left = lefteq; } else if (cmp == 0) { /* equal, so exchange with the element to the right of the "equal-interval" */ righteq += width; qexchange(right, righteq, width); } else /* just leave it */ right -= width; } if (left < lefteq) { /* larger element to the left, but no more room, so move the "equal-interval" one place to the left, and the larger element to the right of it. */ lefteq -= width; q3exchange(right, lefteq, left, width); righteq -= width; right = righteq; goto again; } /* now sort the "smaller" part */ qsort1(a1, lefteq - width, width); /* and now the larger, saving a subroutine call because of the for(;;) */ a1 = righteq + width; } /*NOTREACHED*/ } static void qexchange(register char *p, register char *q, register size_t n) { register int c; while (n-- > 0) { c = *p; *p++ = *q; *q++ = c; } } static void q3exchange(register char *p, register char *q, register char *r, register size_t n) { register int c; while (n-- > 0) { c = *p; *p++ = *r; *r++ = *q; *q++ = c; } } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: raise.c,v 1.3 90/11/22 13:55:50 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include int _kill(int pid, int sig); pid_t _getpid(void); int raise(int sig) { if (sig < 0 || sig > _NSIG) return -1; return _kill(_getpid(), sig); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: rand.c,v 1.3 90/06/30 20:02:45 ceriel Exp $ */ #include static unsigned long int next = 1; int rand(void) { next = next * 1103515245 + 12345; return (unsigned int)(next/(2 * (RAND_MAX +1L)) % (RAND_MAX+1L)); } void srand(unsigned int seed) { next = seed; } /* * setlocale - set the programs locale */ /* $Header: setlocale.c,v 1.2 89/12/18 15:49:11 eck Exp $ */ #include #include struct lconv _lc; char * setlocale(int category, const char *locale) { if (!locale) return "C"; if (*locale && strcmp(locale, "C")) return (char *)NULL; switch(category) { case LC_ALL: case LC_CTYPE: case LC_COLLATE: case LC_TIME: case LC_NUMERIC: case LC_MONETARY: return *locale ? (char *)locale : "C"; default: return (char *)NULL; } } /* * sigmisc.c - used to get a signal mask */ /* $Header: sigmisc.c,v 1.2 90/10/15 11:23:08 eck Exp $ */ #if defined(_POSIX_SOURCE) /* This can't be done in setjmp.e, since SIG_SETMASK is defined in * . This is a C-file, which can't be included. */ #include #include #include int _sigprocmask(int, sigset_t *, sigset_t *); static void __testsigset(void) { /* This switch compiles when a sigset_t has the right size. */ switch(0) { case 0: case sizeof(sigset_t) <= sizeof(long): break; } } void __newsigset(sigset_t *p) { /* The SIG_SETMASK is not significant */ _sigprocmask(SIG_SETMASK, NULL, p); } void __oldsigset(sigset_t *p) { _sigprocmask(SIG_SETMASK, p, NULL); } #endif /* _POSIX_SOURCE */ /* SYSVR4 and ANSI compatible signal(2). */ #include #define sigaction _sigaction #define sigemptyset _sigemptyset #include PUBLIC sighandler_t signal(sig, disp) int sig; /* signal number */ sighandler_t disp; /* signal handler, or SIG_DFL, or SIG_IGN */ { struct sigaction sa, osa; if (sig <= 0 || sig > _NSIG || sig == SIGKILL) { errno = EINVAL; return(SIG_ERR); } sigemptyset(&sa.sa_mask); #ifdef WANT_UNRELIABLE_SIGNALS /* Allow the signal being handled to interrupt the signal handler. */ sa.sa_flags = SA_NODEFER; /* When signal is caught, reset signal handler to SIG_DFL for all but * SIGILL and SIGTRAP. */ if (sig != SIGILL && sig != SIGTRAP) sa.sa_flags |= SA_RESETHAND; #else sa.sa_flags = 0; #endif sa.sa_handler = disp; if (sigaction(sig, &sa, &osa) < 0) return(SIG_ERR); return(osa.sa_handler); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strcat.c,v 1.2 90/05/31 18:33:06 ceriel Exp $ */ #include char * strcat(char *ret, register const char *s2) { register char *s1 = ret; while (*s1++ != '\0') /* EMPTY */ ; s1--; while (*s1++ = *s2++) /* EMPTY */ ; return ret; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strchr.c,v 1.3 90/08/28 13:53:00 eck Exp $ */ #include char * strchr(register const char *s, register int c) { c = (char) c; while (c != *s) { if (*s++ == '\0') return NULL; } return (char *)s; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Id: strcmp.c,v 1.4 1994/06/24 11:56:43 ceriel Exp $ */ #include int strcmp(register const char *s1, register const char *s2) { while (*s1 == *s2++) { if (*s1++ == '\0') { return 0; } } if (*s1 == '\0') return -1; if (*--s2 == '\0') return 1; return (unsigned char) *s1 - (unsigned char) *s2; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strcoll.c,v 1.2 90/08/28 13:53:23 eck Exp $ */ #include #include int strcoll(register const char *s1, register const char *s2) { while (*s1 == *s2++) { if (*s1++ == '\0') { return 0; } } return *s1 - *--s2; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strcpy.c,v 1.2 90/05/31 18:33:13 ceriel Exp $ */ #include char * strcpy(char *ret, register const char *s2) { register char *s1 = ret; while (*s1++ = *s2++) /* EMPTY */ ; return ret; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strcspn.c,v 1.2 89/12/18 16:01:42 eck Exp $ */ #include size_t strcspn(const char *string, const char *notin) { register const char *s1, *s2; for (s1 = string; *s1; s1++) { for(s2 = notin; *s2 != *s1 && *s2; s2++) /* EMPTY */ ; if (*s2) break; } return s1 - string; } |strerror.c}strftime.c~strlen.cstrncat.cstrncmp.cstrncpy.cstrpbrk.cstrrchr.cstrspn.cstrstr.cstrtok.cstrtol.cstrxfrm.csystem.ctolower.ctoupper.ctzset.cwcstombs.cwctomb.c/* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strerror.c,v 1.3 90/08/28 13:53:31 eck Exp $ */ #include /* * I don't know why, but X3J11 says that strerror() should be in declared * in . That is why the function is defined here. */ char * strerror(register int errnum) { extern const char *_sys_errlist[]; extern const int _sys_nerr; if (errnum < 0 || errnum >= _sys_nerr) return "unknown error"; return (char *)_sys_errlist[errnum]; } /* * strftime - convert a structure to a string, controlled by an argument */ /* $Header: strftime.c,v 1.3 91/04/22 13:21:03 ceriel Exp $ */ #include #include "loc_time.h" /* The width can be -1 in both s_prnt() as in u_prnt(). This * indicates that as many characters as needed should be printed. */ static char * s_prnt(char *s, size_t maxsize, const char *str, int width) { while (width > 0 || (width < 0 && *str)) { if (!maxsize) break; *s++ = *str++; maxsize--; width--; } return s; } static char * u_prnt(char *s, size_t maxsize, unsigned val, int width) { int c; c = val % 10; val = val / 10; if (--width > 0 || (width < 0 && val != 0)) s = u_prnt(s, (maxsize ? maxsize - 1 : 0), val, width); if (maxsize) *s++ = c + '0'; return s; } size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr) { size_t n; char *firsts, *olds; if (!format) return 0; _tzset(); /* for %Z conversion */ firsts = s; while (maxsize && *format) { while (maxsize && *format && *format != '%') { *s++ = *format++; maxsize--; } if (!maxsize || !*format) break; format++; olds = s; switch (*format++) { case 'a': s = s_prnt(s, maxsize, _days[timeptr->tm_wday], ABB_LEN); maxsize -= s - olds; break; case 'A': s = s_prnt(s, maxsize, _days[timeptr->tm_wday], -1); maxsize -= s - olds; break; case 'b': s = s_prnt(s, maxsize, _months[timeptr->tm_mon], ABB_LEN); maxsize -= s - olds; break; case 'B': s = s_prnt(s, maxsize, _months[timeptr->tm_mon], -1); maxsize -= s - olds; break; case 'c': n = strftime(s, maxsize, "%a %b %d %H:%M:%S %Y", timeptr); if (n) maxsize -= n; else maxsize = 0; s += n; break; case 'd': s = u_prnt(s, maxsize, timeptr->tm_mday, 2); maxsize -= s - olds; break; case 'H': s = u_prnt(s, maxsize, timeptr->tm_hour, 2); maxsize -= s - olds; break; case 'I': s = u_prnt(s, maxsize, (timeptr->tm_hour + 11) % 12 + 1, 2); maxsize -= s - olds; break; case 'j': s = u_prnt(s, maxsize, timeptr->tm_yday + 1, 3); maxsize -= s - olds; break; case 'm': s = u_prnt(s, maxsize, timeptr->tm_mon + 1, 2); maxsize -= s - olds; break; case 'M': s = u_prnt(s, maxsize, timeptr->tm_min, 2); maxsize -= s - olds; break; case 'p': s = s_prnt(s, maxsize, (timeptr->tm_hour < 12) ? "AM" : "PM", 2); maxsize -= s - olds; break; case 'S': s = u_prnt(s, maxsize, timeptr->tm_sec, 2); maxsize -= s - olds; break; case 'U': s = u_prnt(s, maxsize, /* ??? */ (timeptr->tm_yday + 7 - timeptr->tm_wday) / 7, 2); maxsize -= s - olds; break; case 'w': s = u_prnt(s, maxsize, timeptr->tm_wday, 1); maxsize -= s - olds; break; case 'W': s = u_prnt(s, maxsize, /* ??? */ (timeptr->tm_yday+7-(timeptr->tm_wday+6)%7)/7,2); maxsize -= s - olds; break; case 'x': n = strftime(s, maxsize, "%a %b %d %Y", timeptr); if (n) maxsize -= n; else maxsize = 0; s += n; break; case 'X': n = strftime(s, maxsize, "%H:%M:%S", timeptr); if (n) maxsize -= n; else maxsize = 0; s += n; break; case 'y': s = u_prnt(s, maxsize, timeptr->tm_year % 100, 2); maxsize -= s - olds; break; case 'Y': s = u_prnt(s, maxsize, timeptr->tm_year + YEAR0, -1); maxsize -= s - olds; break; case 'Z': s = s_prnt(s, maxsize, _tzname[(timeptr->tm_isdst > 0)], -1); maxsize -= s - olds; break; case '%': *s++ = '%'; maxsize--; break; default: /* A conversion error. Leave the loop. */ while (*format) format++; break; } } if (maxsize) { *s = '\0'; return s - firsts; } return 0; /* The buffer is full */ } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strlen.c,v 1.4 90/08/28 13:53:42 eck Exp $ */ #include size_t strlen(const char *org) { register const char *s = org; while (*s++) /* EMPTY */ ; return --s - org; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strncat.c,v 1.3 90/08/28 13:53:54 eck Exp $ */ #include char * strncat(char *ret, register const char *s2, size_t n) { register char *s1 = ret; if (n > 0) { while (*s1++) /* EMPTY */ ; s1--; while (*s1++ = *s2++) { if (--n > 0) continue; *s1 = '\0'; break; } return ret; } else return s1; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Id: strncmp.c,v 1.4 1994/06/24 11:57:04 ceriel Exp $ */ #include int strncmp(register const char *s1, register const char *s2, register size_t n) { if (n) { do { if (*s1 != *s2++) break; if (*s1++ == '\0') return 0; } while (--n > 0); if (n > 0) { if (*s1 == '\0') return -1; if (*--s2 == '\0') return 1; return (unsigned char) *s1 - (unsigned char) *s2; } } return 0; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strncpy.c,v 1.3 90/08/28 13:54:11 eck Exp $ */ #include char * strncpy(char *ret, register const char *s2, register size_t n) { register char *s1 = ret; if (n>0) { while((*s1++ = *s2++) && --n > 0) /* EMPTY */ ; if ((*--s2 == '\0') && --n > 0) { do { *s1++ = '\0'; } while(--n > 0); } } return ret; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strpbrk.c,v 1.2 89/12/18 16:02:21 eck Exp $ */ #include char * strpbrk(register const char *string, register const char *brk) { register const char *s1; while (*string) { for (s1 = brk; *s1 && *s1 != *string; s1++) /* EMPTY */ ; if (*s1) return (char *)string; string++; } return (char *)NULL; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strrchr.c,v 1.3 90/08/28 13:54:21 eck Exp $ */ #include char * strrchr(register const char *s, int c) { register const char *result = NULL; c = (char) c; do { if (c == *s) result = s; } while (*s++ != '\0'); return (char *)result; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strspn.c,v 1.1 89/05/11 10:09:09 eck Exp $ */ #include size_t strspn(const char *string, const char *in) { register const char *s1, *s2; for (s1 = string; *s1; s1++) { for (s2 = in; *s2 && *s2 != *s1; s2++) /* EMPTY */ ; if (*s2 == '\0') break; } return s1 - string; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strstr.c,v 1.3 90/08/28 13:54:28 eck Exp $ */ #include char * strstr(register const char *s, register const char *wanted) { register const size_t len = strlen(wanted); if (len == 0) return (char *)s; while (*s != *wanted || strncmp(s, wanted, len)) if (*s++ == '\0') return (char *)NULL; return (char *)s; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strtok.c,v 1.2 90/08/28 13:54:38 eck Exp $ */ #include char * strtok(register char *string, const char *separators) { register char *s1, *s2; static char *savestring; if (string == NULL) { string = savestring; if (string == NULL) return (char *)NULL; } s1 = string + strspn(string, separators); if (*s1 == '\0') { savestring = NULL; return (char *)NULL; } s2 = strpbrk(s1, separators); if (s2 != NULL) *s2++ = '\0'; savestring = s2; return s1; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strtol.c,v 1.4 90/05/11 15:22:19 eck Exp $ */ #include #include #include #include static unsigned long string2long(register const char *nptr, char **endptr, int base, int is_signed); long int strtol(register const char *nptr, char **endptr, int base) { return (signed long)string2long(nptr, endptr, base, 1); } unsigned long int strtoul(register const char *nptr, char **endptr, int base) { return (unsigned long)string2long(nptr, endptr, base, 0); } #define between(a, c, z) ((unsigned) ((c) - (a)) <= (unsigned) ((z) - (a))) static unsigned long string2long(register const char *nptr, char ** const endptr, int base, int is_signed) { register unsigned int v; register unsigned long val = 0; register int c; int ovfl = 0, sign = 1; const char *startnptr = nptr, *nrstart; if (endptr) *endptr = (char *)nptr; while (isspace(*nptr)) nptr++; c = *nptr; if (c == '-' || c == '+') { if (c == '-') sign = -1; nptr++; } nrstart = nptr; /* start of the number */ /* When base is 0, the syntax determines the actual base */ if (base == 0) if (*nptr == '0') if (*++nptr == 'x' || *nptr == 'X') { base = 16; nptr++; } else base = 8; else base = 10; else if (base==16 && *nptr=='0' && (*++nptr =='x' || *nptr =='X')) nptr++; for (;;) { c = *nptr; if (between('0', c, '9')) { v = c - '0'; } else if (between('a', c, 'z')) { v = c - 'a' + 0xa; } else if (between('A', c, 'Z')) { v = c - 'A' + 0xA; } else { break; } if (v >= base) break; if (val > (ULONG_MAX - v) / base) ovfl++; val = (val * base) + v; nptr++; } if (endptr) { if (nrstart == nptr) *endptr = (char *)startnptr; else *endptr = (char *)nptr; } if (!ovfl) { /* Overflow is only possible when converting a signed long. */ if (is_signed && ( (sign < 0 && val > -(unsigned long)LONG_MIN) || (sign > 0 && val > LONG_MAX))) ovfl++; } if (ovfl) { errno = ERANGE; if (is_signed) if (sign < 0) return LONG_MIN; else return LONG_MAX; else return ULONG_MAX; } return (long) sign * val; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strxfrm.c,v 1.4 90/08/28 13:54:46 eck Exp $ */ #include size_t strxfrm(register char *s1, register const char *save, register size_t n) { register const char *s2 = save; while (*s2) { if (n > 1) { n--; *s1++ = *s2++; } else s2++; } if (n > 0) *s1++ = '\0'; return s2 - save; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: system.c,v 1.4 90/11/22 13:59:54 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include extern pid_t _fork(void); extern pid_t _wait(int *); extern void _exit(int); extern void _execve(const char *path, const char ** argv, const char ** envp); extern int _close(int); #define FAIL 127 extern const char ***_penviron; static const char *exec_tab[] = { "sh", /* argv[0] */ "-c", /* argument to the shell */ NULL, /* to be filled with user command */ NULL /* terminating NULL */ }; int system(const char *str) { int pid, exitstatus, waitval; int i; if ((pid = _fork()) < 0) return str ? -1 : 0; if (pid == 0) { for (i = 3; i <= 20; i++) _close(i); if (!str) str = "cd ."; /* just testing for a shell */ exec_tab[2] = str; /* fill in command */ _execve("/bin/sh", exec_tab, *_penviron); /* get here if execve fails ... */ _exit(FAIL); /* see manual page */ } while ((waitval = _wait(&exitstatus)) != pid) { if (waitval == -1) break; } if (waitval == -1) { /* no child ??? or maybe interrupted ??? */ exitstatus = -1; } if (!str) { if (exitstatus == FAIL << 8) /* execve() failed */ exitstatus = 0; else exitstatus = 1; /* /bin/sh exists */ } return exitstatus; } #include int tolower(int c) { return isupper(c) ? c - 'A' + 'a' : c ; } #include int toupper(int c) { return islower(c) ? c - 'a' + 'A' : c ; } /* * tzset - set timezone information */ /* $Header: tzset.c,v 1.3 91/04/22 13:21:11 ceriel Exp $ */ /* This function is present for System V && POSIX */ #include #include "loc_time.h" void tzset(void) { _tzset(); /* does the job */ } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: wcstombs.c,v 1.3 90/03/28 16:37:07 eck Exp $ */ #include #include #include size_t wcstombs(register char *s, register const wchar_t *pwcs, size_t n) { register int i = n; while (--i >= 0) { if (!(*s++ = *pwcs++)) break; } return n - i - 1; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: wctomb.c,v 1.4 91/01/15 11:55:33 ceriel Exp $ */ #include #include int /* was: wctomb(char *s, wchar_t wchar) * This conflicts with prototype, so it was changed to: */ wctomb(char *s, wchar_t wchar) { if (!s) return 0; /* no state dependent codings */ *s = wchar; return 1; } .;..Makefilebeep.ccharpick.ccurs_set.ccursesio.ccurspriv.hendwin.cflash.cinitscr.clongname.cmove.cmvcursor.cnewwin.coptions.coverlay.cprntscan.crefresh.cscrreg.csetterm.ctabsize.ctermmisc.cunctrl.cupdate.cwaddch.cwaddstr.cwbox.cwclear.cwclrtobot.cwclrtoeol.cwdelch.cwdeleteln.cwerase.cwgetch.cwgetstr.cwindel.cwinmove.cwinsch.cwinscrol.cwinsertln.cwintouch.c# Makefile for lib/curses. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libcurses.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(beep.o) \ $(LIBRARY)(charpick.o) \ $(LIBRARY)(curs_set.o) \ $(LIBRARY)(cursesio.o) \ $(LIBRARY)(endwin.o) \ $(LIBRARY)(flash.o) \ $(LIBRARY)(initscr.o) \ $(LIBRARY)(longname.o) \ $(LIBRARY)(move.o) \ $(LIBRARY)(mvcursor.o) \ $(LIBRARY)(newwin.o) \ $(LIBRARY)(options.o) \ $(LIBRARY)(overlay.o) \ $(LIBRARY)(prntscan.o) \ $(LIBRARY)(refresh.o) \ $(LIBRARY)(scrreg.o) \ $(LIBRARY)(setterm.o) \ $(LIBRARY)(tabsize.o) \ $(LIBRARY)(termmisc.o) \ $(LIBRARY)(unctrl.o) \ $(LIBRARY)(update.o) \ $(LIBRARY)(waddch.o) \ $(LIBRARY)(waddstr.o) \ $(LIBRARY)(wbox.o) \ $(LIBRARY)(wclear.o) \ $(LIBRARY)(wclrtobot.o) \ $(LIBRARY)(wclrtoeol.o) \ $(LIBRARY)(wdelch.o) \ $(LIBRARY)(wdeleteln.o) \ $(LIBRARY)(werase.o) \ $(LIBRARY)(wgetch.o) \ $(LIBRARY)(wgetstr.o) \ $(LIBRARY)(windel.o) \ $(LIBRARY)(winmove.o) \ $(LIBRARY)(winsch.o) \ $(LIBRARY)(winscrol.o) \ $(LIBRARY)(winsertln.o) \ $(LIBRARY)(wintouch.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(beep.o): beep.c $(CC1) beep.c $(LIBRARY)(charpick.o): charpick.c $(CC1) charpick.c $(LIBRARY)(curs_set.o): curs_set.c $(CC1) curs_set.c $(LIBRARY)(cursesio.o): cursesio.c $(CC1) cursesio.c $(LIBRARY)(endwin.o): endwin.c $(CC1) endwin.c $(LIBRARY)(flash.o): flash.c $(CC1) flash.c $(LIBRARY)(initscr.o): initscr.c $(CC1) initscr.c $(LIBRARY)(longname.o): longname.c $(CC1) longname.c $(LIBRARY)(move.o): move.c $(CC1) move.c $(LIBRARY)(mvcursor.o): mvcursor.c $(CC1) mvcursor.c $(LIBRARY)(newwin.o): newwin.c $(CC1) newwin.c $(LIBRARY)(options.o): options.c $(CC1) options.c $(LIBRARY)(overlay.o): overlay.c $(CC1) overlay.c $(LIBRARY)(prntscan.o): prntscan.c $(CC1) prntscan.c $(LIBRARY)(refresh.o): refresh.c $(CC1) refresh.c $(LIBRARY)(scrreg.o): scrreg.c $(CC1) scrreg.c $(LIBRARY)(setterm.o): setterm.c $(CC1) setterm.c $(LIBRARY)(tabsize.o): tabsize.c $(CC1) tabsize.c $(LIBRARY)(termmisc.o): termmisc.c $(CC1) termmisc.c $(LIBRARY)(unctrl.o): unctrl.c $(CC1) unctrl.c $(LIBRARY)(update.o): update.c $(CC1) update.c $(LIBRARY)(waddch.o): waddch.c $(CC1) waddch.c $(LIBRARY)(waddstr.o): waddstr.c $(CC1) waddstr.c $(LIBRARY)(wbox.o): wbox.c $(CC1) wbox.c $(LIBRARY)(wclear.o): wclear.c $(CC1) wclear.c $(LIBRARY)(wclrtobot.o): wclrtobot.c $(CC1) wclrtobot.c $(LIBRARY)(wclrtoeol.o): wclrtoeol.c $(CC1) wclrtoeol.c $(LIBRARY)(wdelch.o): wdelch.c $(CC1) wdelch.c $(LIBRARY)(wdeleteln.o): wdeleteln.c $(CC1) wdeleteln.c $(LIBRARY)(werase.o): werase.c $(CC1) werase.c $(LIBRARY)(wgetch.o): wgetch.c $(CC1) wgetch.c $(LIBRARY)(wgetstr.o): wgetstr.c $(CC1) wgetstr.c $(LIBRARY)(windel.o): windel.c $(CC1) windel.c $(LIBRARY)(winmove.o): winmove.c $(CC1) winmove.c $(LIBRARY)(winsch.o): winsch.c $(CC1) winsch.c $(LIBRARY)(winscrol.o): winscrol.c $(CC1) winscrol.c $(LIBRARY)(winsertln.o): winsertln.c $(CC1) winsertln.c $(LIBRARY)(wintouch.o): wintouch.c $(CC1) wintouch.c #include #include "curspriv.h" #include extern char *bl, *vb; /* Beep() sounds the terminal bell. */ void beep() { if (bl) tputs(bl, 1, outc); else if (vb) tputs(vb, 1, outc); } #include #include "curspriv.h" /****************************************************************/ /* Winch(win) returns the character at the current position in */ /* Window 'win'. */ /****************************************************************/ int winch(win) WINDOW *win; { return((win->_line[win->_cury][win->_curx]) & 0xff); } /* winch */ /****************************************************************/ /* Mvinch() moves the stdscr cursor to a new position, then */ /* Returns the character at that position. */ /****************************************************************/ int mvinch(y, x) int y; int x; { if (wmove(stdscr, y, x) == ERR) return(ERR); return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff); } /****************************************************************/ /* Mvwinch() moves the cursor of window 'win' to a new posi- */ /* Tion, then returns the character at that position. */ /****************************************************************/ int mvwinch(win, y, x) WINDOW *win; int y; int x; { if (wmove(win, y, x) == ERR) return(ERR); return((win->_line[win->_cury][win->_curx]) & 0xff); } #include #include "curspriv.h" #include extern char *vi, *ve, *vs; /* Sets cursor visibility to unvisible=0; normal visible=1 or very good * visible=2. */ void curs_set(visibility) int visibility; { switch (visibility) { case 0: if (vi) tputs(vi, 1, outc); break; case 1: if (ve) tputs(ve, 1, outc); break; case 2: if (vs) tputs(vs, 1, outc); else if (ve) tputs(ve, 1, outc); } } #include #include #include #include #include #include "curspriv.h" struct termios _orig_tty, _tty; cursv _cursvar; WINDOW *stdscr, *curscr; int LINES, COLS; bool NONL; char termcap[1024]; /* termcap buffer */ char tc[200]; /* area to hold string capabilities */ char *ttytype; /* terminal type from env */ char *arp; /* pointer for use in tgetstr */ char *cp; /* character pointer */ char *cl; /* clear screen capability */ char *cm; /* cursor motion capability */ char *so; /* start standout capability */ char *se; /* end standout capability */ char *mr; /* start of reverse */ char *me; /* revert to normal */ char *mb; /* start of blink */ char *md; /* start of bold */ char *us; /* start of underscore */ char *ue; /* end of underscore */ char *vi; /* cursor invisible */ char *ve; /* cursor normal */ char *vs; /* cursor good visible */ char *as; /* alternative charset start */ char *ae; /* alternative charset end */ char *bl; /* ring the bell */ char *vb; /* visual bell */ /* fatal - report error and die. Never returns */ void fatal(s) char *s; { (void) fprintf(stderr, "curses: %s\n", s); exit(1); } /* Outc - call putchar, necessary because putchar is a macro. */ void outc(c) int c; { putchar(c); } /* Move cursor to r,c */ void poscur(r, c) int r, c; { tputs(tgoto(cm, c, r), 1, outc); } /* Clear the screen */ void clrscr() { tputs(cl, 1, outc); } /* This are terminal independent characters which can be used in curses */ unsigned int ACS_ULCORNER; unsigned int ACS_LLCORNER; unsigned int ACS_URCORNER; unsigned int ACS_LRCORNER; unsigned int ACS_RTEE; unsigned int ACS_LTEE; unsigned int ACS_BTEE; unsigned int ACS_TTEE; unsigned int ACS_HLINE; unsigned int ACS_VLINE; unsigned int ACS_PLUS; unsigned int ACS_S1; unsigned int ACS_S9; unsigned int ACS_DIAMOND; unsigned int ACS_CKBOARD; unsigned int ACS_DEGREE; unsigned int ACS_PLMINUS; unsigned int ACS_BULLET; unsigned int ACS_LARROW; unsigned int ACS_RARROW; unsigned int ACS_DARROW; unsigned int ACS_UARROW; unsigned int ACS_BOARD; unsigned int ACS_LANTERN; unsigned int ACS_BLOCK; /* These defines describe the full set of grafic block characters which * can be defined via termcap. */ #define RIGHTARROW 0 #define LEFTARROW 1 #define DOWNARROW 2 #define UPARROW 3 #define FULLSQUARE 4 #define GREYSQUARE 5 #define EMPTYSQUARE 6 #define LATERN 7 #define DIAMOND 8 #define DEGREE 9 #define PLUSMINUS 10 #define DOWNRIGHT 11 #define UPRIGHT 12 #define UPLEFT 13 #define DOWNLEFT 14 #define CROSS 15 #define UPLINE 16 #define UPMIDLINE 17 #define MIDLINE 18 #define DOMIDLINE 19 #define DOWNLINE 20 #define TEELEFT 21 #define TEERIGHT 22 #define TEEHEAD 23 #define TEENORMAL 24 #define VERTLINE 25 #define PARAGRAPH 26 unsigned int _cursgraftable[27] = { '>', '<', 'v', '^', '#', ':', ' ', '#', '+', '\'', '#', '+', '+', '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|' }; char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~"; int setterm(type) char *type; { unsigned char *ac; int i; #ifdef TIOCGWINSZ struct winsize wsize; #endif if (tgetent(termcap, type) != 1) return ERR; #ifdef TIOCGWINSZ if (ioctl(0, TIOCGWINSZ, &wsize) == 0) { LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li"); COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co"); } else { #endif LINES = tgetnum("li"); COLS = tgetnum("co"); #ifdef TIOCGWINSZ } #endif arp = tc; cl = tgetstr("cl", &arp); so = tgetstr("so", &arp); se = tgetstr("se", &arp); cm = tgetstr("cm", &arp); mr = tgetstr("mr", &arp); me = tgetstr("me", &arp); mb = tgetstr("mb", &arp); md = tgetstr("md", &arp); us = tgetstr("us", &arp); ue = tgetstr("ue", &arp); vi = tgetstr("vi", &arp); ve = tgetstr("ve", &arp); vs = tgetstr("vs", &arp); as = tgetstr("as", &arp); ae = tgetstr("ae", &arp); ac = (unsigned char *) tgetstr("ac", &arp); bl = tgetstr("bl", &arp); vb = tgetstr("vb", &arp); if (ac) { while (*ac) { i = 0; while (*ac != _cursident[i]) i++; _cursgraftable[i] = *++ac | A_ALTCHARSET; ac++; } } ACS_ULCORNER = _cursgraftable[UPLEFT]; ACS_LLCORNER = _cursgraftable[DOWNLEFT]; ACS_URCORNER = _cursgraftable[UPRIGHT]; ACS_LRCORNER = _cursgraftable[DOWNRIGHT]; ACS_RTEE = _cursgraftable[TEERIGHT]; ACS_LTEE = _cursgraftable[TEELEFT]; ACS_BTEE = _cursgraftable[TEEHEAD]; ACS_TTEE = _cursgraftable[TEENORMAL]; ACS_HLINE = _cursgraftable[MIDLINE]; ACS_VLINE = _cursgraftable[VERTLINE]; ACS_PLUS = _cursgraftable[CROSS]; ACS_S1 = _cursgraftable[UPLINE]; ACS_S9 = _cursgraftable[DOWNLINE]; ACS_DIAMOND = _cursgraftable[DIAMOND]; ACS_CKBOARD = _cursgraftable[GREYSQUARE]; ACS_DEGREE = _cursgraftable[DEGREE]; ACS_PLMINUS = _cursgraftable[PLUSMINUS]; ACS_BULLET = 'o'; /* where the hell is a bullet defined in * termcap ??? */ ACS_LARROW = _cursgraftable[LEFTARROW]; ACS_RARROW = _cursgraftable[RIGHTARROW]; ACS_DARROW = _cursgraftable[DOWNARROW]; ACS_UARROW = _cursgraftable[UPARROW]; ACS_BOARD = _cursgraftable[EMPTYSQUARE]; ACS_LANTERN = _cursgraftable[LATERN]; ACS_BLOCK = _cursgraftable[FULLSQUARE]; /* Wow, I got it! */ return OK; } void gettmode() { tcgetattr(0, &_orig_tty); tcgetattr(0, &_tty); _cursvar.echoit = (_tty.c_lflag & ECHO) != 0; _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0; _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG; NONL = (_tty.c_iflag & ICRNL) != 0; } /* Constants */ #define _SUBWIN 1 /* window is a subwindow */ #define _ENDLINE 2 /* last winline is last screen line */ #define _FULLWIN 4 /* window fills screen */ #define _SCROLLWIN 8 /* window lwr rgt is screen lwr rgt */ #define _NO_CHANGE -1 /* flags line edge unchanged */ #define _BREAKCHAR 0x03 /* ^C character */ #define _DCCHAR 0x08 /* Delete Char char (BS) */ #define _DLCHAR 0x1b /* Delete Line char (ESC) */ #define _GOCHAR 0x11 /* ^Q character */ #define _PRINTCHAR 0x10 /* ^P character */ #define _STOPCHAR 0x13 /* ^S character */ #define NUNGETCH 10 /* max # chars to ungetch() */ #define max(a,b) (((a) > (b)) ? (a) : (b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) /* Character mask definitions. */ #define CHR_MSK ((int) 0x00ff) /* ASCIIZ character mask */ #define ATR_MSK ((int) 0xff00) /* attribute mask */ #define ATR_NRM ((int) 0x0000) /* no special attributes */ /* Type declarations. */ typedef struct { WINDOW *tmpwin; /* window used for updates */ int cursrow; /* position of physical cursor */ int curscol; bool rawmode; bool cbrkmode; bool echoit; } cursv; /* External variables */ extern cursv _cursvar; /* curses variables */ #include #include "curspriv.h" #include int endwin() { extern char *me; curs_set(1); poscur(LINES - 1, 0); refresh(); tputs(me, 1, outc); delwin(stdscr); delwin(curscr); delwin(_cursvar.tmpwin); resetty(); return(OK); } #include #include "curspriv.h" #include extern char *bl, *vb; /* Flash() flashes the terminal screen. */ void flash() { if (vb) tputs(vb, 1, outc); else if (bl) tputs(bl, 1, outc); } /* initscr.c - initialize the curses library */ #include #include #include "curspriv.h" WINDOW *initscr() { char *term; if ((term = getenv("TERM")) == NULL) return NULL; setterm(term); gettmode(); if ((_cursvar.tmpwin = newwin(LINES, COLS, 0, 0)) == NULL) return NULL; if ((curscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL; if ((stdscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL; clearok(curscr, TRUE); return(stdscr); } #include #include "curspriv.h" /****************************************************************/ /* Longname() returns a pointer to a string describing the */ /* User terminal. */ /****************************************************************/ char *longname() { return("not implemented"); } #include #include "curspriv.h" /****************************************************************/ /* Wmove() moves the cursor in window 'win' to position (x,y). */ /****************************************************************/ int wmove(win, y, x) WINDOW *win; int y; int x; { if ((x<0) || (x>win->_maxx) || (y_regtop) || (y>win->_regbottom)) return(ERR); win->_curx = x; win->_cury = y; return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Mvcur(oldy,oldx,newy,newx) the display cursor to */ /****************************************************************/ int mvcur(oldy, oldx, newy, newx) int oldy; int oldx; int newy; int newx; { if ((newy >= LINES) || (newx >= COLS) || (newy < 0) || (newx < 0)) return(ERR); poscur(newy, newx); _cursvar.cursrow = newy; _cursvar.curscol = newx; return(OK); } #include #include #include "curspriv.h" /****************************************************************/ /* Makenew() allocates all data for a new window except the */ /* Actual lines themselves. */ /****************************************************************/ _PROTOTYPE(static WINDOW *makenew, (int nlines, int ncols, int begy,int begx)); static WINDOW *makenew(num_lines, num_columns, begy, begx) int num_lines, num_columns, begy, begx; { int i; WINDOW *win; /* Allocate the window structure itself */ if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) return((WINDOW *) ERR); /* Allocate the line pointer array */ if ((win->_line = (int **) calloc(num_lines, sizeof(int *))) == NULL) { free(win); return((WINDOW *) ERR); } /* Allocate the minchng and maxchng arrays */ if ((win->_minchng = (int *) calloc(num_lines, sizeof(int))) == NULL) { free(win); free(win->_line); return((WINDOW *) ERR); } if ((win->_maxchng = (int *) calloc(num_lines, sizeof(int))) == NULL) { free(win); free(win->_line); free(win->_minchng); return((WINDOW *) ERR); } /* Initialize window variables */ win->_curx = 0; win->_cury = 0; win->_maxy = num_lines - 1; win->_maxx = num_columns - 1; win->_begy = begy; win->_begx = begx; win->_flags = 0; win->_attrs = ATR_NRM; win->_tabsize = 8; win->_clear = FALSE; win->_leave = FALSE; win->_scroll = FALSE; win->_nodelay = FALSE; win->_keypad = FALSE; win->_regtop = 0; win->_regbottom = num_lines - 1; /* Init to say window unchanged */ for (i = 0; i < num_lines; i++) { win->_minchng[i] = 0; win->_maxchng[i] = num_columns - 1; } /* Set flags for window properties */ if ((begy + num_lines) == LINES) { win->_flags |= _ENDLINE; if ((begx == 0) && (num_columns == COLS) && (begy == 0)) win->_flags |= _FULLWIN; } /* if */ if (((begy + num_lines) == LINES) && ((begx + num_columns) == COLS)) win->_flags |= _SCROLLWIN; return(win); } /****************************************************************/ /* Newwin() creates a new window with size num_lines * num_co- */ /* Lumns, and origin begx,begy relative to the SCREEN. Special */ /* Case: if num_lines and/or num_columns is 0, the remainder of */ /* The screen is used. */ /****************************************************************/ WINDOW *newwin(num_lines, num_columns, begy, begx) int num_lines, num_columns, begy, begx; { WINDOW *win; int *ptr; int i, j; if (num_lines == 0) num_lines = LINES - begy; if (num_columns == 0) num_columns = COLS - begx; if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) return((WINDOW *) ERR); for (i = 0; i < num_lines; i++) { /* make and clear the lines */ if ((win->_line[i] = (int *)calloc(num_columns, sizeof(int))) == NULL){ for (j = 0; j < i; j++) /* if error, free all the data */ free(win->_line[j]); free(win->_minchng); free(win->_maxchng); free(win->_line); free(win); return((WINDOW *) ERR); } else { for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns;) *ptr++ = ' ' | ATR_NRM; } } return(win); } /****************************************************************/ /* Subwin() creates a sub-window in the 'orig' window, with */ /* Size num_lines * num_columns, and with origin begx, begy */ /* Relative to the SCREEN. Special case: if num_lines and/or */ /* Num_columns is 0, the remainder of the original window is */ /* Used. The subwindow uses the original window's line buffers */ /* To store it's own lines. */ /****************************************************************/ WINDOW *subwin(orig, num_lines, num_columns, begy, begx) WINDOW *orig; int num_lines, num_columns, begy, begx; { WINDOW *win; int i, j, k; /* Make sure window fits inside the original one */ if (begy < orig->_begy || begx < orig->_begx || (begy + num_lines) > (orig->_begy + orig->_maxy) || (begx + num_columns) > (orig->_begx + orig->_maxx) ) return((WINDOW *) ERR); if (num_lines == 0) num_lines = orig->_maxy - (begy - orig->_begy); if (num_columns == 0) num_columns = orig->_maxx - (begx - orig->_begx); if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR) return((WINDOW *) ERR); /* Set line pointers the same as in the original window */ j = begy - orig->_begy; k = begx - orig->_begx; for (i = 0; i < num_lines; i++) win->_line[i] = (orig->_line[j++]) + k; win->_flags |= _SUBWIN; return(win); } #include #include "curspriv.h" static bool hasold = FALSE; /* for remembering old cursor type */ static int oldmode; /****************************************************************/ /* Idlok() is used to set flag for using the terminal insert/ */ /* Delete line capabilities. This is not relevant for the PC */ /* Version of curses, and thus nothing is done. */ /****************************************************************/ void idlok(win, flag) WINDOW *win; bool flag; { } /****************************************************************/ /* Clearok() marks window 'win' to cause screen clearing and */ /* Redraw the next time a refresh is done. */ /****************************************************************/ void clearok(win, flag) WINDOW *win; bool flag; { if (win == curscr) _cursvar.tmpwin->_clear = flag; else win->_clear = flag; } /****************************************************************/ /* Leaveok() marks window 'win' to allow the update routines */ /* To leave the hardware cursor where it happens to be at the */ /* End of update. Usually used in combination with cursoff(). */ /****************************************************************/ void leaveok(win, flag) WINDOW *win; bool flag; { win->_leave = flag; } /****************************************************************/ /* Scrollok() marks window 'win' to allow the scrolling region */ /* Of it to actually scroll. */ /****************************************************************/ void scrollok(win, flag) WINDOW *win; bool flag; { win->_scroll = flag; } /****************************************************************/ /* Nodelay() marks the window to make character input non- */ /* Waiting, i.e. if there is no character to get, -1 will be */ /* Returned. */ /****************************************************************/ void nodelay(win, flag) WINDOW *win; bool flag; { win->_nodelay = flag; } /****************************************************************/ /* Keypad() marks window 'win' to use the special keypad mode. */ /****************************************************************/ void keypad(win, flag) WINDOW *win; bool flag; { win->_keypad = flag; } /****************************************************************/ /* Meta() allows use of any alternate character set allowed by */ /* The terminal. We always allow this on the PC, so this one */ /* Does nothing. */ /****************************************************************/ void meta(win, flag) WINDOW *win; bool flag; { } /****************************************************************/ /* Overlay() and overwrite() functions of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Overlay() overwrites 'win1' upon 'win2', with origins alig- */ /* Ned. Overlay is transparent; blanks from 'win1' are not */ /* Copied to 'win2'. */ /****************************************************************/ void overlay(win1, win2) WINDOW *win1, *win2; { int *minchng; int *maxchng; int *w1ptr; int *w2ptr; int attrs; int col; int line; int last_line; int last_col; last_col = min(win1->_maxx, win2->_maxx); last_line = min(win1->_maxy, win2->_maxy); attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; for (line = 0; line <= last_line; line++) { register short fc, lc = 0; w1ptr = win1->_line[line]; w2ptr = win2->_line[line]; fc = _NO_CHANGE; for (col = 0; col <= last_col; col++) { if ((*w1ptr & CHR_MSK) != ' ') { *w2ptr = (*w1ptr & CHR_MSK) | attrs; if (fc == _NO_CHANGE) fc = col; lc = col; } w1ptr++; w2ptr++; } if (*minchng == _NO_CHANGE) { *minchng = fc; *maxchng = lc; } else if (fc != _NO_CHANGE) { if (fc < *minchng) *minchng = fc; if (lc > *maxchng) *maxchng = lc; } minchng++; maxchng++; } /* for */ } /* overlay */ /****************************************************************/ /* Overwrite() overwrites 'win1' upon 'win2', with origins */ /* Aligned. Overwrite is non-transparent; blanks from 'win1' */ /* Are copied to 'win2'. */ /****************************************************************/ void overwrite(win1, win2) WINDOW *win1, *win2; { int *minchng; int *maxchng; int *w1ptr; int *w2ptr; int attrs; int col; int line; int last_line; int last_col; last_col = min(win1->_maxx, win2->_maxx); last_line = min(win1->_maxy, win2->_maxy); attrs = win2->_attrs & ATR_MSK; minchng = win2->_minchng; maxchng = win2->_maxchng; for (line = 0; line <= last_line; line++) { register short fc, lc = 0; w1ptr = win1->_line[line]; w2ptr = win2->_line[line]; fc = _NO_CHANGE; for (col = 0; col <= last_col; col++) { if ((*w1ptr & CHR_MSK) != (*w2ptr & CHR_MSK)) { *w2ptr = (*w1ptr & CHR_MSK) | attrs; if (fc == _NO_CHANGE) fc = col; lc = col; } w1ptr++; w2ptr++; } /* for */ if (*minchng == _NO_CHANGE) { *minchng = fc; *maxchng = lc; } else if (fc != _NO_CHANGE) { if (fc < *minchng) *minchng = fc; if (lc > *maxchng) *maxchng = lc; } minchng++; maxchng++; } } #include #include #include "curspriv.h" static char printscanbuf[513]; /* buffer used during I/O */ /****************************************************************/ /* Wprintw(win,fmt,args) does a printf() in window 'win'. */ /****************************************************************/ int wprintw(WINDOW *win, const char *fmt, ...) { va_list args; va_start(args, fmt); vsprintf(printscanbuf, fmt, args); if (waddstr(win, printscanbuf) == ERR) return(ERR); return(strlen(printscanbuf)); } /****************************************************************/ /* Printw(fmt,args) does a printf() in stdscr. */ /****************************************************************/ int printw(const char *fmt, ...) { va_list args; va_start(args, fmt); vsprintf(printscanbuf, fmt, args); if (waddstr(stdscr, printscanbuf) == ERR) return(ERR); return(strlen(printscanbuf)); } /* printw */ /****************************************************************/ /* Mvprintw(fmt,args) moves the stdscr cursor to a new posi- */ /* tion, then does a printf() in stdscr. */ /****************************************************************/ int mvprintw(int y, int x, const char *fmt, ...) { va_list args; va_start(args, fmt); if (wmove(stdscr, y, x) == ERR) return(ERR); vsprintf(printscanbuf, fmt, args); if (waddstr(stdscr, printscanbuf) == ERR) return(ERR); return(strlen(printscanbuf)); } /****************************************************************/ /* Mvwprintw(win,fmt,args) moves the window 'win's cursor to */ /* A new position, then does a printf() in window 'win'. */ /****************************************************************/ int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...) { va_list args; va_start(args, fmt); if (wmove(win, y, x) == ERR) return(ERR); vsprintf(printscanbuf, fmt, args); if (waddstr(win, printscanbuf) == ERR) return(ERR); return(strlen(printscanbuf)); } /* mvwprintw */ /****************************************************************/ /* Wscanw(win,fmt,args) gets a string via window 'win', then */ /* Scans the string using format 'fmt' to extract the values */ /* And put them in the variables pointed to the arguments. */ /****************************************************************/ int wscanw(WINDOW *win, const char *fmt, ...) { va_list args; va_start(args, fmt); wrefresh(win); /* set cursor */ if (wgetstr(win, printscanbuf) == ERR) /* get string */ return(ERR); return(vsscanf(printscanbuf, fmt, args)); } /* wscanw */ /****************************************************************/ /* Scanw(fmt,args) gets a string via stdscr, then scans the */ /* String using format 'fmt' to extract the values and put them */ /* In the variables pointed to the arguments. */ /****************************************************************/ int scanw(const char *fmt, ...) { va_list args; va_start(args, fmt); wrefresh(stdscr); /* set cursor */ if (wgetstr(stdscr, printscanbuf) == ERR) /* get string */ return(ERR); return(vsscanf(printscanbuf, fmt, args)); } /* scanw */ /****************************************************************/ /* Mvscanw(y,x,fmt,args) moves stdscr's cursor to a new posi- */ /* Tion, then gets a string via stdscr and scans the string */ /* Using format 'fmt' to extract the values and put them in the */ /* Variables pointed to the arguments. */ /****************************************************************/ int mvscanw(int y, int x, const char *fmt, ...) { va_list args; va_start(args, fmt); if (wmove(stdscr, y, x) == ERR) return(ERR); wrefresh(stdscr); /* set cursor */ if (wgetstr(stdscr, printscanbuf) == ERR) /* get string */ return(ERR); return(vsscanf(printscanbuf, fmt, args)); } /* mvscanw */ /****************************************************************/ /* Mvwscanw(win,y,x,fmt,args) moves window 'win's cursor to a */ /* New position, then gets a string via 'win' and scans the */ /* String using format 'fmt' to extract the values and put them */ /* In the variables pointed to the arguments. */ /****************************************************************/ int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...) { va_list args; va_start(args, fmt); if (wmove(win, y, x) == ERR) return(ERR); wrefresh(win); /* set cursor */ if (wgetstr(win, printscanbuf) == ERR) /* get string */ return(ERR); return(vsscanf(printscanbuf, fmt, args)); } /* mvwscanw */ /* refresh.c */ #include #include "curspriv.h" /* Wrefresh() updates window win's area of the physical screen. */ void wrefresh(win) WINDOW *win; { if (win == curscr) curscr->_clear = TRUE; else wnoutrefresh(win); doupdate(); } /****************************************************************/ /* Wnoutrefresh() updates the image of the desired screen, */ /* Without doing physical update (copies window win's image to */ /* The _cursvar.tmpwin window, which is hidden from the user). */ /****************************************************************/ void wnoutrefresh(win) register WINDOW *win; { register int *dst; /* start destination in temp window */ register int *end; /* end destination in temp window */ register int *src; /* source in user window */ register int first; /* first changed char on line */ register int last; /* last changed char on line */ WINDOW *nscr; int begy; /* window's place on screen */ int begx; int i; int j; nscr = _cursvar.tmpwin; begy = win->_begy; begx = win->_begx; for (i = 0, j = begy; i <= win->_maxy; i++, j++) { if (win->_minchng[i] != _NO_CHANGE) { first = win->_minchng[i]; last = win->_maxchng[i]; dst = &(nscr->_line[j][begx + first]); end = &(nscr->_line[j][begx + last]); src = &(win->_line[i][first]); while (dst <= end) /* copy user line to temp window */ *dst++ = *src++; first += begx; /* nscr's min/max change positions */ last += begx; if ((nscr->_minchng[j] == _NO_CHANGE) || (nscr->_minchng[j] > first)) nscr->_minchng[j] = first; if (last > nscr->_maxchng[j]) nscr->_maxchng[j] = last; win->_minchng[i] = _NO_CHANGE; /* updated now */ } /* if */ win->_maxchng[i] = _NO_CHANGE; /* updated now */ } /* for */ if (win->_clear) { win->_clear = FALSE; nscr->_clear = TRUE; } /* if */ if (!win->_leave) { nscr->_cury = win->_cury + begy; nscr->_curx = win->_curx + begx; } /* if */ } /* wnoutrefresh */ /****************************************************************/ /* Wsetscrreg() routine of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Wsetscrreg() set the scrolling region of window 'win' to in- */ /* Clude all lines between 'top' and 'bottom'. */ /****************************************************************/ int wsetscrreg(win, top, bottom) WINDOW *win; int top; int bottom; { if ((0 <= top) && (top <= win->_cury) && (win->_cury <= bottom) && (bottom <= win->_maxy) ) { win->_regtop = top; win->_regbottom = bottom; return(OK); } /* If */ else return(ERR); } /* wsetscrreg */ /****************************************************************/ /* Setscrreg() set the scrolling region of stdscr to include */ /* All lines between 'top' and 'bottom'. */ /****************************************************************/ int setscrreg(top, bottom) int top; int bottom; { return(wsetscrreg(stdscr, top, bottom)); } /* setscrreg */ #include #include "curspriv.h" _PROTOTYPE( static void ttysetflags, (void) ); static void ttysetflags() { _tty.c_iflag |= ICRNL | IXON; _tty.c_oflag |= OPOST | ONLCR; _tty.c_lflag |= ECHO | ICANON | IEXTEN | ISIG; if (_cursvar.rawmode) { _tty.c_iflag &= ~(ICRNL | IXON); _tty.c_oflag &= ~(OPOST); _tty.c_lflag &= ~(ICANON | IEXTEN | ISIG); } if (_cursvar.cbrkmode) { _tty.c_lflag &= ~(ICANON); } if (!_cursvar.echoit) { _tty.c_lflag &= ~(ECHO | ECHONL); } if (NONL) { _tty.c_iflag &= ~(ICRNL); _tty.c_oflag &= ~(ONLCR); } tcsetattr(0, TCSANOW, &_tty); } /* ttysetflags */ void raw() { _cursvar.rawmode = TRUE; ttysetflags(); } /* raw */ void noraw() { _cursvar.rawmode = FALSE; ttysetflags(); } /* noraw */ void echo() { _cursvar.echoit = TRUE; ttysetflags(); } void noecho() { _cursvar.echoit = FALSE; ttysetflags(); } void nl() { NONL = FALSE; ttysetflags(); } /* nl */ void nonl() { NONL = TRUE; ttysetflags(); } /* nonl */ void cbreak() { _cursvar.cbrkmode = TRUE; ttysetflags(); } /* cbreak */ void nocbreak() { _cursvar.cbrkmode = FALSE; ttysetflags(); } /* nocbreak */ /****************************************************************/ /* Tabsize() routines of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Wtabsize(win,ts) sets the tabsize of window 'win' to 'ts', */ /* And returns the original value. */ /****************************************************************/ int wtabsize(win, ts) WINDOW *win; int ts; { int origval; origval = win->_tabsize; win->_tabsize = ts; return(origval); } /* wtabsize */ /****************************************************************/ /* Tabsize(ts) sets the tabsize of stdscr to 'ts', and returns */ /* The original value. */ /****************************************************************/ int tabsize(ts) int ts; { int origval; origval = stdscr->_tabsize; stdscr->_tabsize = ts; return(origval); } /* tabsize */ #include #include "curspriv.h" /* Static variables or saving terminal modes */ int fixterm() { return(OK); } /* fixterm */ int resetterm() { return(OK); } int saveoldterm() { return(OK); } /* saveoldterm */ int saveterm() { return(OK); } /* saveterm */ int baudrate() { return(19200); } /* baudrate */ /****************************************************************/ /* Erasechar(), killchar() returns std MSDOS erase chars. */ /****************************************************************/ int erasechar() { return(_DCCHAR); /* character delete char */ } /* erasechar */ int killchar() { return(_DLCHAR); /* line delete char */ } /* killchar */ /****************************************************************/ /* Savetty() and resetty() saves and restores the terminal I/O */ /* Settings. */ /****************************************************************/ int savetty() { return(OK); } /* savetty */ /****************************************************************/ /* Setupterm() sets up the terminal. On a PC, it is always suc- */ /* Cessful, and returns 1. */ /****************************************************************/ int setupterm() { return(1); } /* setupterm */ /****************************************************************/ /* Unctrl() routines of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" static char strbuf[3] = {0, 0, 0}; /****************************************************************/ /* Unctrl() returns a char pointer to a string corresponding to */ /* Argument character 'c'. */ /****************************************************************/ char *unctrl(c) char c; { int ic = c; ic &= 0xff; if ((ic >= ' ') && (ic != 0x7f)) { /* normal characters */ strbuf[0] = ic; strbuf[1] = '\0'; return(strbuf); } /* if */ strbuf[0] = '^'; /* '^' prefix */ if (c == 0x7f) /* DEL */ strbuf[1] = '?'; else /* other control */ strbuf[1] = ic + '@'; return(strbuf); } /* unctrl */ #include #include "curspriv.h" #include static WINDOW *twin; /* used by many routines */ /****************************************************************/ /* Gotoxy() moves the physical cursor to the desired address on */ /* The screen. We don't optimize here - on a PC, it takes more */ /* Time to optimize than to do things directly. */ /****************************************************************/ _PROTOTYPE(static void gotoxy, (int row, int col )); _PROTOTYPE(static void newattr, (int ch )); _PROTOTYPE(static void Putchar, (int ch )); _PROTOTYPE(static void clrupdate, (WINDOW *scr )); _PROTOTYPE(static void transformline, (int lineno )); static void gotoxy(row, col) int row, col; { poscur(row, col); _cursvar.cursrow = row; _cursvar.curscol = col; } /* Update attributes */ static void newattr(ch) int ch; { extern char *me, *as, *ae, *mb, *md, *mr, *so, *us; static int lastattr = 0; if (lastattr != (ch &= ATR_MSK)) { lastattr = ch; tputs(me, 1, outc); if (ae) tputs(ae, 1, outc); if (ch & A_ALTCHARSET) if (as) tputs(as, 1, outc); if (ch & A_BLINK) tputs(mb, 1, outc); if (ch & A_BOLD) tputs(md, 1, outc); if (ch & A_REVERSE) tputs(mr, 1, outc); if (ch & A_STANDOUT) tputs(so, 1, outc); if (ch & A_UNDERLINE) tputs(us, 1, outc); } } /* Putchar() writes a character, with attributes, to the physical screen, but avoids writing to the lower right screen position. Should it care about am? */ /* Output char with attribute */ static void Putchar(ch) int ch; { if ((_cursvar.cursrow < LINES) || (_cursvar.curscol < COLS)) { newattr(ch); putchar(ch); } } /****************************************************************/ /* Clrupdate(scr) updates the screen by clearing it and then */ /* Redraw it in it's entirety. */ /****************************************************************/ static void clrupdate(scr) WINDOW *scr; { register int *src; register int *dst; register int i; register int j; WINDOW *w; w = curscr; if (scr != w) { /* copy scr to curscr */ for (i = 0; i < LINES; i++) { src = scr->_line[i]; dst = w->_line[i]; for (j = 0; j < COLS; j++) *dst++ = *src++; } /* for */ } /* if */ newattr(scr->_attrs); clrscr(); scr->_clear = FALSE; for (i = 0; i < LINES; i++) { /* update physical screen */ src = w->_line[i]; j = 0; while (j < COLS) { if (*src != (' ' | ATR_NRM)) { gotoxy(i, j); while (j < COLS && (*src != (' ' | ATR_NRM))) { Putchar(*src++); j++; } } else { src++; j++; } } /* for */ } /* for */ fflush(stdout); } /* clrupdate */ /****************************************************************/ /* Transformline() updates the given physical line to look */ /* Like the corresponding line in _cursvar.tmpwin. */ /****************************************************************/ static void transformline(lineno) register int lineno; { register int *dstp; register int *srcp; register int dstc; register int srcc; int x; int endx; x = twin->_minchng[lineno]; endx = twin->_maxchng[lineno]; dstp = curscr->_line[lineno] + x; srcp = twin->_line[lineno] + x; while (x <= endx) { if ((*dstp != *srcp) || (dstc != srcc)) { gotoxy(lineno, x); while (x <= endx && ((*dstp != *srcp) || (dstc != srcc))) { Putchar(*srcp); *dstp++ = *srcp++; x++; } } else { *dstp++ = *srcp++; x++; } } /* for */ twin->_minchng[lineno] = _NO_CHANGE; twin->_maxchng[lineno] = _NO_CHANGE; } /* transformline */ /****************************************************************/ /* Doupdate() updates the physical screen to look like _curs- */ /* Var.tmpwin if curscr is not 'Clear-marked'. Otherwise it */ /* Updates the screen to look like curscr. */ /****************************************************************/ void doupdate() { int i; twin = _cursvar.tmpwin; if (curscr->_clear) clrupdate(curscr); else { if (twin->_clear) clrupdate(twin); else { for (i = 0; i < LINES; i++) if (twin->_minchng[i] != _NO_CHANGE) transformline(i); } } curscr->_curx = twin->_curx; curscr->_cury = twin->_cury; gotoxy(curscr->_cury, curscr->_curx); fflush(stdout); } /* doupdate */ #include #include "curspriv.h" /****************************************************************/ /* Newline() does line advance and returns the new cursor line. */ /* If error, return -1. */ /****************************************************************/ _PROTOTYPE( static short newline, (WINDOW *win, int lin)); static short newline(win, lin) WINDOW *win; int lin; { if (++lin > win->_regbottom) { lin--; if (win->_scroll) scroll(win); else return(-1); } /* if */ return(lin); } /* newline */ /****************************************************************/ /* Waddch() inserts character 'c' at the current cursor posi- */ /* Tion in window 'win', and takes any actions as dictated by */ /* The character. */ /****************************************************************/ int waddch(win, c) WINDOW *win; int c; { int x = win->_curx; int y = win->_cury; int newx; int ch = c; int ts = win->_tabsize; ch &= (A_ALTCHARSET | 0xff); if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR); switch (ch) { case '\t': for (newx = ((x / ts) + 1) * ts; x < newx; x++) { if (waddch(win, ' ') == ERR) return(ERR); if (win->_curx == 0) /* if tab to next line */ return(OK); /* exit the loop */ } return(OK); case '\n': if (NONL) x = 0; if ((y = newline(win, y)) < 0) return (ERR); break; case '\r': x = 0; break; case '\b': if (--x < 0) /* no back over left margin */ x = 0; break; case 0x7f: { if (waddch(win, '^') == ERR) return(ERR); return(waddch(win, '?')); } default: if (ch < ' ') { /* handle control chars */ if (waddch(win, '^') == ERR) return(ERR); return(waddch(win, c + '@')); } ch |= (win->_attrs & ATR_MSK); if (win->_line[y][x] != ch) { /* only if data change */ if (win->_minchng[y] == _NO_CHANGE) win->_minchng[y] = win->_maxchng[y] = x; else if (x < win->_minchng[y]) win->_minchng[y] = x; else if (x > win->_maxchng[y]) win->_maxchng[y] = x; } /* if */ win->_line[y][x++] = ch; if (x > win->_maxx) { /* wrap around test */ x = 0; if ((y = newline(win, y)) < 0) return(ERR); } break; } /* switch */ win->_curx = x; win->_cury = y; return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Waddstr() inserts string 'str' at the current cursor posi- */ /* Tion in window 'win', and takes any actions as dictated by */ /* The characters. */ /****************************************************************/ int waddstr(win, str) WINDOW *win; char *str; { while (*str) { if (waddch(win, *str++) == ERR) return(ERR); } return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Wbox(win,ymin,xmin,ymax,xmax,v,h) draws a box in window */ /* 'win', enclosing the area xmin-xmax and ymin-xmax. If */ /* Xmax and/or ymax is 0, the window max value is used. 'v' and */ /* 'h' are the vertical and horizontal characters to use. If */ /* 'v' and 'h' are 0, wbox will use the alternate character set */ /* In a pretty way. */ /****************************************************************/ int wbox(win, ymin, xmin, ymax, xmax, v, h) WINDOW *win; int ymin, xmin, ymax, xmax; unsigned int v; unsigned int h; { unsigned int vc, hc, ulc, urc, llc, lrc; /* corner chars */ int i; if (ymax == 0) ymax = win->_maxy; if (xmax == 0) xmax = win->_maxx; if (ymin >= win->_maxy || ymax > win->_maxy || xmin >= win->_maxx || xmax > win->_maxx || ymin >= ymax || xmin >= xmax) return(ERR); vc = v; hc = h; ulc = urc = llc = lrc = vc; /* default same as vertical */ if (v == 0 && h == 0) { ulc = ACS_ULCORNER; urc = ACS_URCORNER; llc = ACS_LLCORNER; lrc = ACS_LRCORNER; hc = ACS_HLINE; vc = ACS_VLINE; } for (i = xmin + 1; i <= xmax - 1; i++) { win->_line[ymin][i] = hc | win->_attrs; win->_line[ymax][i] = hc | win->_attrs; } for (i = ymin + 1; i <= ymax - 1; i++) { win->_line[i][xmin] = vc | win->_attrs; win->_line[i][xmax] = vc | win->_attrs; } win->_line[ymin][xmin] = ulc | win->_attrs; win->_line[ymin][xmax] = urc | win->_attrs; win->_line[ymax][xmin] = llc | win->_attrs; win->_line[ymax][xmax] = lrc | win->_attrs; for (i = ymin; i <= ymax; i++) { if (win->_minchng[i] == _NO_CHANGE) { win->_minchng[i] = xmin; win->_maxchng[i] = xmax; } else { win->_minchng[i] = min(win->_minchng[i], xmin); win->_maxchng[i] = max(win->_maxchng[i], xmax); } } return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Wclear() fills all lines of window 'win' with blanks, and */ /* Marks the window to be cleared at next refresh operation. */ /****************************************************************/ void wclear(win) WINDOW *win; { werase(win); win->_clear = TRUE; } /* wclear */ #include #include "curspriv.h" /****************************************************************/ /* Wclrtobot() fills the right half of the cursor line of */ /* Window 'win', and all lines below it with blanks. */ /****************************************************************/ int wclrtobot(win) WINDOW *win; { int y, minx, startx, *ptr, *end, *maxx, blank; blank = ' ' | (win->_attrs & ATR_MSK); startx = win->_curx; for (y = win->_cury; y <= win->_regbottom; y++) { minx = _NO_CHANGE; end = &win->_line[y][win->_maxx]; for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) { if (*ptr != blank) { maxx = ptr; if (minx == _NO_CHANGE) minx = ptr - win->_line[y]; *ptr = blank; } /* if */ } /* for */ if (minx != _NO_CHANGE) { if ((win->_minchng[y] > minx) || (win->_minchng[y] == _NO_CHANGE)) win->_minchng[y] = minx; if (win->_maxchng[y] < maxx - win->_line[y]) win->_maxchng[y] = maxx - win->_line[y]; } /* if */ startx = 0; } return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Wclrtoeol() fills the half of the cursor line to the right */ /* Of the cursor in window 'win' with blanks. */ /****************************************************************/ int wclrtoeol(win) WINDOW *win; { int *maxx, *ptr, *end, y, x, minx, blank; y = win->_cury; x = win->_curx; blank = ' ' | (win->_attrs & ATR_MSK); end = &win->_line[y][win->_maxx]; minx = _NO_CHANGE; maxx = &win->_line[y][x]; for (ptr = maxx; ptr <= end; ptr++) { if (*ptr != blank) { maxx = ptr; if (minx == _NO_CHANGE) minx = ptr - win->_line[y]; *ptr = blank; } /* if */ } /* for */ if (minx != _NO_CHANGE) { if (win->_minchng[y] > minx || win->_minchng[y] == _NO_CHANGE) win->_minchng[y] = minx; if (win->_maxchng[y] < maxx - win->_line[y]) win->_maxchng[y] = maxx - win->_line[y]; } return(OK); } #include #include "curspriv.h" /* Wdelch() deletes the character at the window cursor, and the characters to the right of it are shifted left, inserting a space at the last position of the line. */ int wdelch(win) WINDOW *win; { int *temp1; int *temp2; int *end; int y = win->_cury; int x = win->_curx; int maxx = win->_maxx; end = &win->_line[y][maxx]; temp1 = &win->_line[y][x]; temp2 = temp1 + 1; while (temp1 < end) *temp1++ = *temp2++; *temp1 = ' ' | (win->_attrs & ATR_MSK); win->_maxchng[y] = maxx; if (win->_minchng[y] == _NO_CHANGE || win->_minchng[y] > x) win->_minchng[y] = x; return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Wdeleteln() deletes the line at the window cursor, and the */ /* Lines below it are shifted up, inserting a blank line at */ /* The bottom of the window. */ /****************************************************************/ int wdeleteln(win) WINDOW *win; { int *end, *temp, y, blank; blank = ' ' | (win->_attrs & ATR_MSK); temp = win->_line[win->_cury]; for (y = win->_cury; y < win->_regbottom; y++) { win->_line[y] = win->_line[y + 1]; win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; } win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; win->_line[win->_regbottom] = temp; for (end = &(temp[win->_maxx]); temp <= end;) *temp++ = blank; return(OK); } #include #include "curspriv.h" /****************************************************************/ /* Werase() fills all lines of window 'win' with blanks and po- */ /* Sitions the cursor at home in the scroll region. */ /****************************************************************/ void werase(win) WINDOW *win; { int *end, *start, y, blank; blank = ' ' | (win->_attrs & ATR_MSK); for (y = win->_regtop; y <= win->_regbottom; y++) { /* clear all lines */ start = win->_line[y]; end = &start[win->_maxx]; while (start <= end) /* clear all line */ *start++ = blank; win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; } win->_cury = win->_regtop; /* cursor home */ win->_curx = 0; } #include #include #include "curspriv.h" int wgetch(win) WINDOW *win; { bool weset = FALSE; char inp; if (!win->_scroll && (win->_flags & _FULLWIN) && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1) return ERR; if (_cursvar.echoit && !_cursvar.rawmode) { cbreak(); weset++; } inp = getchar(); if (_cursvar.echoit) { mvwaddch(curscr, win->_cury + win->_begy, win->_curx + win->_begx, inp); waddch(win, inp); } if (weset) nocbreak(); return inp; } #include #include "curspriv.h" /****************************************************************/ /* Wgetstr(win,str) reads in a string (terminated by \n or \r) */ /* To the buffer pointed to by 'str', and displays the input */ /* In window 'win'. The user's erase and kill characters are */ /* Active. */ /****************************************************************/ int wgetstr(win, str) WINDOW *win; char *str; { while ((*str = wgetch(win)) != ERR && *str != '\n') str++; if (*str == ERR) { *str = '\0'; return ERR; } *str = '\0'; return OK; } /****************************************************************/ /* Delwin() routine of the PCcurses package. */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include #include "curspriv.h" /****************************************************************/ /* Delwin() deallocates all data allocated by 'win'. If 'win' */ /* Is a subwindow, it uses the original window's lines for sto- */ /* Rage, and thus the line arrays are not deallocated. */ /****************************************************************/ void delwin(win) WINDOW *win; { int i; if (!(win->_flags & _SUBWIN)) { /* subwindow uses 'parent's' lines */ for (i = 0; i <= win->_maxy && win->_line[i]; i++) free(win->_line[i]); } free(win->_minchng); free(win->_maxchng); free(win->_line); free(win); } /* delwin */ /****************************************************************/ /* Mvwin() routine of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Mvwin() moves window 'win' to position (begx, begy) on the */ /* Screen. */ /****************************************************************/ int mvwin(win, begy, begx) WINDOW *win; int begy, begx; { if ((begy + win->_maxy) > (LINES - 1) || (begx + win->_maxx) > (COLS - 1)) return(ERR); win->_begy = begy; win->_begx = begx; touchwin(win); return(OK); } /* mvwin */ #include #include "curspriv.h" /* Winsch() inserts character 'c' at the cursor position in window 'win'. The cursor is advanced. */ int winsch(win, c) WINDOW *win; char c; { int *temp1; int *temp2; int *end; int x = win->_curx; int y = win->_cury; int maxx = win->_maxx; if ((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b')) return(waddch(win, c)); end = &win->_line[y][x]; temp1 = &win->_line[y][maxx]; temp2 = temp1 - 1; if (c < ' ') /* if CTRL-char make space for 2 */ temp2--; while (temp1 > end) *temp1-- = *temp2--; win->_maxchng[y] = maxx; if ((win->_minchng[y] == _NO_CHANGE) || (win->_minchng[y] > x)) win->_minchng[y] = x; return(waddch(win, c)); /* fixes CTRL-chars too */ } /* winsch */ /****************************************************************/ /* Scroll() routine of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Scroll() scrolls the scrolling region of 'win', but only if */ /* Scrolling is allowed and if the cursor is inside the scrol- */ /* Ling region. */ /****************************************************************/ void scroll(win) WINDOW *win; { int i; int *ptr; int *temp; static int blank; blank = ' ' | (win->_attrs & ATR_MSK); if ((!win->_scroll) /* check if window scrolls */ ||(win->_cury < win->_regtop) /* and cursor in region */ ||(win->_cury > win->_regbottom) ) return; temp = win->_line[win->_regtop]; for (i = win->_regtop; i < win->_regbottom; i++) { win->_line[i] = win->_line[i + 1]; /* re-arrange line pointers */ win->_minchng[i] = 0; win->_maxchng[i] = win->_maxx; } for (ptr = temp; ptr - temp <= win->_maxx; ptr++) *ptr = blank; /* make a blank line */ win->_line[win->_regbottom] = temp; if (win->_cury > win->_regtop)/* if not on top line */ win->_cury--; /* cursor scrolls too */ win->_minchng[win->_regbottom] = 0; win->_maxchng[win->_regbottom] = win->_maxx; } /* scroll */ #include #include "curspriv.h" /****************************************************************/ /* Winsertln() inserts a blank line instead of the cursor line */ /* In window 'win' and pushes other lines down. */ /****************************************************************/ int winsertln(win) WINDOW *win; { int *temp, *end, y, blank; blank = ' ' | (win->_attrs & ATR_MSK); temp = win->_line[win->_regbottom]; for (y = win->_regbottom; y > win->_cury; y--) { win->_line[y] = win->_line[y - 1]; win->_minchng[y] = 0; win->_maxchng[y] = win->_maxx; } win->_line[win->_cury] = temp; for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = blank; win->_minchng[win->_cury] = 0; win->_maxchng[win->_cury] = win->_maxx; return(OK); } /****************************************************************/ /* Touchwin() routine of the PCcurses package */ /* */ /****************************************************************/ /* This version of curses is based on ncurses, a curses version */ /* Originally written by Pavel Curtis at Cornell University. */ /* I have made substantial changes to make it run on IBM PC's, */ /* And therefore consider myself free to make it public domain. */ /* Bjorn Larsson (...mcvax!enea!infovax!bl) */ /****************************************************************/ /* 1.0: Release: 870515 */ /****************************************************************/ /* Modified to run under the MINIX operating system by Don Cope */ /* These changes are also released into the public domain. */ /* 900906 */ /****************************************************************/ #include #include "curspriv.h" /****************************************************************/ /* Touchwin() marks all lines of window 'win' as changed, from */ /* The first to the last character on the line. */ /****************************************************************/ void touchwin(win) WINDOW *win; { int y; int maxy; int maxx; maxy = win->_maxy; maxx = win->_maxx; for (y = 0; y <= maxy; y++) { win->_minchng[y] = 0; win->_maxchng[y] = maxx; } /* for */ } /* touchwin */ .;..MakefileREADMEcomplete.ceditline.ceditline.hsysunix.ctestit.cunix.h## $Revision: 1.4 $ ## ## Unix makefile for editline library. ## ## Set your options: ## -DANSI_ARROWS ANSI arrows keys work like emacs. ## -DHAVE_STDLIB Have . ## -DHAVE_TCGETATTR Have tcgetattr(), tcsetattr(). ## -DHAVE_TERMIO Have "struct termio" and ## (If neither of above two, we use and BSD ioctl's) ## -DHIDE Make static functions static (non debug). ## -DHIST_SIZE=n History size. ## -DNEED_STRDUP Don't have strdup(). ## -DUNIQUE_HISTORY Don't save command if same as last one. ## -DUSE_DIRENT Use , not ? ## -DUSE_TERMCAP Use the termcap library for terminal size ## see LDFLAGS, below, if you set this. ## -DNEED_PERROR Don't have perror() (used in testit) DEFS = -DANSI_ARROWS -DHAVE_STDLIB -DHAVE_TCGETATTR -DHIDE -DUSE_DIRENT \ -DHIST_SIZE=100 -DUSE_TERMCAP -DSYS_UNIX -DNEED_STRDUP CFLAGS = -O -D_MINIX -D_POSIX_SOURCE $(DEFS) -wo CC1 = $(CC) $(CFLAGS) -c ## If you have -DUSE_TERMCAP, set this as appropriate: #LDFLAGS = -ltermlib #LDFLAGS = -ltermcap ## End of configuration. SOURCES = editline.c complete.c sysunix.c LIBRARY = ../libedit.a OBJECTS = $(LIBRARY)(editline.o) $(LIBRARY)(complete.o) $(LIBRARY)(sysunix.o) SHARFILES = README Makefile editline.3 editline.h unix.h editline.c \ complete.c sysunix.c testit.c install: $(LIBRARY) testit: testit.c $(LIBRARY) $(CC) $(CFLAGS) -o testit testit.c $(LIBRARY) $(LDFLAGS) shar: $(SHARFILES) shar $(SHARFILES) >shar clean: rm -f *.[oa] testit foo core tags lint lint.all a.out shar lint: testit lint -a -b -u -x $(DEFS) $(SOURCES) testit.c >lint.all sed -e '/warning: function prototype not in scope/d' \ -e '/warning: old style argument declaration/'d \ -e '/mix of old and new style function declaration/'d \ lint $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(OBJECTS): editline.h $(LIBRARY)(editline.o): editline.c $(CC1) editline.c $(LIBRARY)(complete.o): complete.c $(CC1) complete.c $(LIBRARY)(sysunix.o): sysunix.c $(CC1) sysunix.c $Revision: 1.6 $ This is a line-editing library. It can be linked into almost any program to provide command-line editing and recall. It is call-compatible with the FSF readline library, but it is a fraction of the size (and offers fewer features). It does not use standard I/O. It is distributed under a "C News-like" copyright. Configuration is done in the Makefile. Type "make testit" to get a small slow shell for testing. An earlier version was distributed with Byron's rc. Principal changes over that version include: Faster. Is eight-bit clean (thanks to brendan@cs.widener.edu) Written in K&R C, but ANSI compliant (gcc all warnings) Propagates EOF properly; rc trip test now passes Doesn't need or use or provide memmove. More robust Calling sequence changed to be compatible with readline. Test program, new manpage, better configuration More system-independant; includes Unix and OS-9 support. This contains some changes since the posting to comp.sources.misc: Bugfix for completion on absolute pathnames. Better handling of M-n versus showing raw 8bit chars. Better signal handling. Now supports termios/termio/sgttyb ioctl's. Add M-m command to toggle how 8bit data is displayed. There is one known bug: History-searching redraws the line wrong if the text retrieved is shorter then the prompt. Enjoy, Rich $alz Copyright 1992,1993 Simmule Turner and Rich Salz. All rights reserved. This software is not subject to any license of the American Telephone and Telegraph Company or of the Regents of the University of California. Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it freely, subject to the following restrictions: 1. The authors are not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it. 2. The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation. 3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation. 4. This notice may not be removed or altered. -- $PchId: README,v 1.3 1996/02/22 21:18:51 philip Exp $ /* $Revision: 1.4 $ ** ** History and file completion functions for editline library. */ #include "editline.h" #if defined(NEED_STRDUP) /* ** Return an allocated copy of a string. */ char * strdup(p) char *p; { char *new; if ((new = NEW(char, strlen(p) + 1)) != NULL) (void)strcpy(new, p); return new; } #endif /* defined(NEED_STRDUP) */ /* ** strcmp-like sorting predicate for qsort. */ STATIC int compare(p1, p2) CONST void *p1; CONST void *p2; { CONST char **v1; CONST char **v2; v1 = (CONST char **)p1; v2 = (CONST char **)p2; return strcmp(*v1, *v2); } /* ** Fill in *avp with an array of names that match file, up to its length. ** Ignore . and .. . */ STATIC int FindMatches(dir, file, avp) char *dir; char *file; char ***avp; { char **av; char **new; char *p; DIR *dp; DIRENTRY *ep; SIZE_T ac; SIZE_T len; SIZE_T choices; SIZE_T total; #define MAX_TOTAL (256 << sizeof(char *)) if ((dp = opendir(dir)) == NULL) return 0; av = NULL; ac = 0; len = strlen(file); choices = 0; total = 0; while ((ep = readdir(dp)) != NULL) { p = ep->d_name; if (p[0] == '.' && (p[1] == '\0' || (p[1] == '.' && p[2] == '\0'))) continue; if (len && strncmp(p, file, len) != 0) continue; choices++; if ((total += strlen(p)) > MAX_TOTAL) { /* This is a bit too much. */ while (ac > 0) DISPOSE(av[--ac]); continue; } if ((ac % MEM_INC) == 0) { if ((new = NEW(char*, ac + MEM_INC)) == NULL) { total = 0; break; } if (ac) { COPYFROMTO(new, av, ac * sizeof (char **)); DISPOSE(av); } *avp = av = new; } if ((av[ac] = strdup(p)) == NULL) { if (ac == 0) DISPOSE(av); total = 0; break; } ac++; } /* Clean up and return. */ (void)closedir(dp); if (total > MAX_TOTAL) { char many[sizeof(total) * 3]; p = many + sizeof(many); *--p = '\0'; while (choices > 0) { *--p = '0' + choices % 10; choices /= 10; } while (p > many + sizeof(many) - 8) *--p = ' '; if ((p = strdup(p)) != NULL) av[ac++] = p; if ((p = strdup("choices")) != NULL) av[ac++] = p; } else { if (ac) qsort(av, ac, sizeof (char **), compare); } return ac; } /* ** Split a pathname into allocated directory and trailing filename parts. */ STATIC int SplitPath(path, dirpart, filepart) char *path; char **dirpart; char **filepart; { static char DOT[] = "."; char *dpart; char *fpart; if ((fpart = strrchr(path, '/')) == NULL) { if ((dpart = strdup(DOT)) == NULL) return -1; if ((fpart = strdup(path)) == NULL) { DISPOSE(dpart); return -1; } } else { if ((dpart = strdup(path)) == NULL) return -1; dpart[fpart - path + 1] = '\0'; if ((fpart = strdup(++fpart)) == NULL) { DISPOSE(dpart); return -1; } } *dirpart = dpart; *filepart = fpart; return 0; } /* ** Attempt to complete the pathname, returning an allocated copy. ** Fill in *unique if we completed it, or set it to 0 if ambiguous. */ char * rl_complete(pathname, unique) char *pathname; int *unique; { char **av; char *dir; char *file; char *new; char *p; SIZE_T ac; SIZE_T end; SIZE_T i; SIZE_T j; SIZE_T len; if (SplitPath(pathname, &dir, &file) < 0) return NULL; if ((ac = FindMatches(dir, file, &av)) == 0) { DISPOSE(dir); DISPOSE(file); return NULL; } p = NULL; len = strlen(file); if (ac == 1) { /* Exactly one match -- finish it off. */ *unique = 1; j = strlen(av[0]) - len + 2; if ((p = NEW(char, j + 1)) != NULL) { COPYFROMTO(p, av[0] + len, j); if ((new = NEW(char, strlen(dir) + strlen(av[0]) + 2)) != NULL) { (void)strcpy(new, dir); (void)strcat(new, "/"); (void)strcat(new, av[0]); rl_add_slash(new, p); DISPOSE(new); } } } else { *unique = 0; if (len) { /* Find largest matching substring. */ for (i = len, end = strlen(av[0]); i < end; i++) for (j = 1; j < ac; j++) if (av[0][i] != av[j][i]) goto breakout; breakout: if (i > len) { j = i - len + 1; if ((p = NEW(char, j)) != NULL) { COPYFROMTO(p, av[0] + len, j); p[j - 1] = '\0'; } } } } /* Clean up and return. */ DISPOSE(dir); DISPOSE(file); for (i = 0; i < ac; i++) DISPOSE(av[i]); DISPOSE(av); return p; } /* ** Return all possible completions. */ int rl_list_possib(pathname, avp) char *pathname; char ***avp; { char *dir; char *file; int ac; if (SplitPath(pathname, &dir, &file) < 0) return 0; ac = FindMatches(dir, file, avp); DISPOSE(dir); DISPOSE(file); return ac; } /* * $PchId: complete.c,v 1.3 1996/02/22 21:18:51 philip Exp $ */ /* $Revision: 1.7 $ ** ** Main editing routines for editline library. */ #include "editline.h" #include #include /* ** Manifest constants. */ #define SCREEN_WIDTH 80 #define SCREEN_ROWS 24 #define NO_ARG (-1) #define DEL 127 #define CTL(x) ((x) & 0x1F) #define ISCTL(x) ((x) && (x) < ' ') #define UNCTL(x) ((x) + 64) #define META(x) ((x) | 0x80) #define ISMETA(x) ((x) & 0x80) #define UNMETA(x) ((x) & 0x7F) #if !defined(HIST_SIZE) #define HIST_SIZE 20 #endif /* !defined(HIST_SIZE) */ /* ** Command status codes. */ typedef enum _STATUS { CSdone, CSeof, CSmove, CSdispatch, CSstay, CSsignal } STATUS; /* ** The type of case-changing to perform. */ typedef enum _CASE { TOupper, TOlower } CASE; /* ** Key to command mapping. */ typedef struct _KEYMAP { CHAR Key; STATUS (*Function)(); } KEYMAP; /* ** Command history structure. */ typedef struct _HISTORY { int Size; int Pos; CHAR *Lines[HIST_SIZE]; } HISTORY; /* ** Globals. */ int rl_eof; int rl_erase; int rl_intr; int rl_kill; int rl_quit; STATIC CHAR NIL[] = ""; STATIC CONST CHAR *Input = NIL; STATIC CHAR *Line; STATIC CONST char *Prompt; STATIC CHAR *Yanked; STATIC char *Screen; STATIC char NEWLINE[]= CRLF; STATIC HISTORY H; STATIC int Repeat; STATIC int End; STATIC int Mark; STATIC int OldPoint; STATIC int Point; STATIC int PushBack; STATIC int Pushed; STATIC int Signal; FORWARD KEYMAP Map[33]; FORWARD KEYMAP MetaMap[17]; STATIC SIZE_T Length; STATIC SIZE_T ScreenCount; STATIC SIZE_T ScreenSize; STATIC char *backspace; STATIC int TTYwidth; STATIC int TTYrows; /* Display print 8-bit chars as `M-x' or as the actual 8-bit char? */ int rl_meta_chars = 0; /* ** Declarations. */ STATIC CHAR *editinput(); extern int read(); extern int write(); #if defined(USE_TERMCAP) extern char *getenv(); extern char *tgetstr(); extern int tgetent(); #endif /* defined(USE_TERMCAP) */ /* ** TTY input/output functions. */ STATIC void TTYflush() { if (ScreenCount) { (void)write(1, Screen, ScreenCount); ScreenCount = 0; } } STATIC void TTYput(c) CHAR c; { Screen[ScreenCount] = c; if (++ScreenCount >= ScreenSize - 1) { ScreenSize += SCREEN_INC; RENEW(Screen, char, ScreenSize); } } STATIC void TTYputs(p) CHAR *p; { while (*p) TTYput(*p++); } STATIC void TTYshow(c) CHAR c; { if (c == DEL) { TTYput('^'); TTYput('?'); } else if (ISCTL(c)) { TTYput('^'); TTYput(UNCTL(c)); } else if (rl_meta_chars && ISMETA(c)) { TTYput('M'); TTYput('-'); TTYput(UNMETA(c)); } else TTYput(c); } STATIC void TTYstring(p) CHAR *p; { while (*p) TTYshow(*p++); } STATIC unsigned int TTYget() { CHAR c; TTYflush(); if (Pushed) { Pushed = 0; return PushBack; } if (*Input) return *Input++; return read(0, &c, (SIZE_T)1) == 1 ? c : EOF; } #define TTYback() (backspace ? TTYputs((CHAR *)backspace) : TTYput('\b')) STATIC void TTYbackn(n) int n; { while (--n >= 0) TTYback(); } STATIC void TTYinfo() { static int init; #if defined(USE_TERMCAP) char *term; char buff[2048]; char *bp; #endif /* defined(USE_TERMCAP) */ #if defined(TIOCGWINSZ) struct winsize W; #endif /* defined(TIOCGWINSZ) */ if (init) { #if defined(TIOCGWINSZ) /* Perhaps we got resized. */ if (ioctl(0, TIOCGWINSZ, &W) >= 0 && W.ws_col > 0 && W.ws_row > 0) { TTYwidth = (int)W.ws_col; TTYrows = (int)W.ws_row; } #endif /* defined(TIOCGWINSZ) */ return; } init++; TTYwidth = TTYrows = 0; #if defined(USE_TERMCAP) bp = &buff[0]; if ((term = getenv("TERM")) == NULL) term = "dumb"; if (tgetent(buff, term) < 0) { TTYwidth = SCREEN_WIDTH; TTYrows = SCREEN_ROWS; return; } if ((backspace = tgetstr("le", &bp)) != NULL) backspace = strdup(backspace); TTYwidth = tgetnum("co"); TTYrows = tgetnum("li"); #endif /* defined(USE_TERMCAP) */ #if defined(TIOCGWINSZ) if (ioctl(0, TIOCGWINSZ, &W) >= 0) { TTYwidth = (int)W.ws_col; TTYrows = (int)W.ws_row; } #endif /* defined(TIOCGWINSZ) */ if (TTYwidth <= 0 || TTYrows <= 0) { TTYwidth = SCREEN_WIDTH; TTYrows = SCREEN_ROWS; } } /* ** Print an array of words in columns. */ STATIC void columns(ac, av) int ac; CHAR **av; { CHAR *p; int i; int j; int k; int len; int skip; int longest; int cols; /* Find longest name, determine column count from that. */ for (longest = 0, i = 0; i < ac; i++) if ((j = strlen((char *)av[i])) > longest) longest = j; cols = TTYwidth / (longest + 3); TTYputs((CHAR *)NEWLINE); for (skip = ac / cols + 1, i = 0; i < skip; i++) { for (j = i; j < ac; j += skip) { for (p = av[j], len = strlen((char *)p), k = len; --k >= 0; p++) TTYput(*p); if (j + skip < ac) while (++len < longest + 3) TTYput(' '); } TTYputs((CHAR *)NEWLINE); } } STATIC void reposition() { int i; CHAR *p; TTYput('\r'); TTYputs((CONST CHAR *)Prompt); for (i = Point, p = Line; --i >= 0; p++) TTYshow(*p); } STATIC void left(Change) STATUS Change; { TTYback(); if (Point) { if (ISCTL(Line[Point - 1])) TTYback(); else if (rl_meta_chars && ISMETA(Line[Point - 1])) { TTYback(); TTYback(); } } if (Change == CSmove) Point--; } STATIC void right(Change) STATUS Change; { TTYshow(Line[Point]); if (Change == CSmove) Point++; } STATIC STATUS ring_bell() { TTYput('\07'); TTYflush(); return CSstay; } STATIC STATUS do_macro(c) unsigned int c; { CHAR name[4]; name[0] = '_'; name[1] = c; name[2] = '_'; name[3] = '\0'; if ((Input = (CHAR *)getenv((char *)name)) == NULL) { Input = NIL; return ring_bell(); } return CSstay; } STATIC STATUS do_forward(move) STATUS move; { int i; CHAR *p; i = 0; do { p = &Line[Point]; for ( ; Point < End && (*p == ' ' || !isalnum(*p)); Point++, p++) if (move == CSmove) right(CSstay); for (; Point < End && isalnum(*p); Point++, p++) if (move == CSmove) right(CSstay); if (Point == End) break; } while (++i < Repeat); return CSstay; } STATIC STATUS do_case(type) CASE type; { int i; int end; int count; CHAR *p; (void)do_forward(CSstay); if (OldPoint != Point) { if ((count = Point - OldPoint) < 0) count = -count; Point = OldPoint; if ((end = Point + count) > End) end = End; for (i = Point, p = &Line[i]; i < end; i++, p++) { if (type == TOupper) { if (islower(*p)) *p = toupper(*p); } else if (isupper(*p)) *p = tolower(*p); right(CSmove); } } return CSstay; } STATIC STATUS case_down_word() { return do_case(TOlower); } STATIC STATUS case_up_word() { return do_case(TOupper); } STATIC void ceol() { int extras; int i; CHAR *p; for (extras = 0, i = Point, p = &Line[i]; i <= End; i++, p++) { TTYput(' '); if (ISCTL(*p)) { TTYput(' '); extras++; } else if (rl_meta_chars && ISMETA(*p)) { TTYput(' '); TTYput(' '); extras += 2; } } for (i += extras; i > Point; i--) TTYback(); } STATIC void clear_line() { Point = -strlen(Prompt); TTYput('\r'); ceol(); Point = 0; End = 0; Line[0] = '\0'; } STATIC STATUS insert_string(p) CHAR *p; { SIZE_T len; int i; CHAR *new; CHAR *q; len = strlen((char *)p); if (End + len >= Length) { if ((new = NEW(CHAR, Length + len + MEM_INC)) == NULL) return CSstay; if (Length) { COPYFROMTO(new, Line, Length); DISPOSE(Line); } Line = new; Length += len + MEM_INC; } for (q = &Line[Point], i = End - Point; --i >= 0; ) q[len + i] = q[i]; COPYFROMTO(&Line[Point], p, len); End += len; Line[End] = '\0'; TTYstring(&Line[Point]); Point += len; return Point == End ? CSstay : CSmove; } STATIC STATUS redisplay() { TTYputs((CONST CHAR *)NEWLINE); TTYputs((CONST CHAR *)Prompt); TTYstring(Line); return CSmove; } STATIC STATUS toggle_meta_mode() { rl_meta.......///////// /_chars = ! rl_meta_chars; return redisplay(); } STATIC CHAR * next_hist() { return H.Pos >= H.Size - 1 ? NULL : H.Lines[++H.Pos]; } STATIC CHAR * prev_hist() { return H.Pos == 0 ? NULL : H.Lines[--H.Pos]; } STATIC STATUS do_insert_hist(p) CHAR *p; { if (p == NULL) return ring_bell(); Point = 0; reposition(); ceol(); End = 0; return insert_string(p); } STATIC STATUS do_hist(move) CHAR *(*move)(); { CHAR *p; int i; i = 0; do { if ((p = (*move)()) == NULL) return ring_bell(); } while (++i < Repeat); return do_insert_hist(p); } STATIC STATUS h_next() { return do_hist(next_hist); } STATIC STATUS h_prev() { return do_hist(prev_hist); } STATIC STATUS h_first() { return do_insert_hist(H.Lines[H.Pos = 0]); } STATIC STATUS h_last() { return do_insert_hist(H.Lines[H.Pos = H.Size - 1]); } /* ** Return zero if pat appears as a substring in text. */ STATIC int substrcmp(text, pat, len) char *text; char *pat; int len; { char c; if ((c = *pat) == '\0') return *text == '\0'; for ( ; *text; text++) if (*text == c && strncmp(text, pat, len) == 0) return 0; return 1; } STATIC CHAR * search_hist(search, move) CHAR *search; CHAR *(*move)(); { static CHAR *old_search; int len; int pos; int (*match)(); char *pat; /* Save or get remembered search pattern. */ if (search && *search) { if (old_search) DISPOSE(old_search); old_search = (CHAR *)strdup((char *)search); } else { if (old_search == NULL || *old_search == '\0') return NULL; search = old_search; } /* Set up pattern-finder. */ if (*search == '^') { match = strncmp; pat = (char *)(search + 1); } else { match = substrcmp; pat = (char *)search; } len = strlen(pat); for (pos = H.Pos; (*move)() != NULL; ) if ((*match)((char *)H.Lines[H.Pos], pat, len) == 0) return H.Lines[H.Pos]; H.Pos = pos; return NULL; } STATIC STATUS h_search() { static int Searching; CONST char *old_prompt; CHAR *(*move)(); CHAR *p; if (Searching) return ring_bell(); Searching = 1; clear_line(); old_prompt = Prompt; Prompt = "Search: "; TTYputs((CONST CHAR *)Prompt); move = Repeat == NO_ARG ? prev_hist : next_hist; p = editinput(); Prompt = old_prompt; Searching = 0; TTYputs((CONST CHAR *)Prompt); if (p == NULL && Signal > 0) { Signal = 0; clear_line(); return redisplay(); } p = search_hist(p, move); clear_line(); if (p == NULL) { (void)ring_bell(); return redisplay(); } return do_insert_hist(p); } STATIC STATUS fd_char() { int i; i = 0; do { if (Point >= End) break; right(CSmove); } while (++i < Repeat); return CSstay; } STATIC void save_yank(begin, i) int begin; int i; { if (Yanked) { DISPOSE(Yanked); Yanked = NULL; } if (i < 1) return; if ((Yanked = NEW(CHAR, (SIZE_T)i + 1)) != NULL) { COPYFROMTO(Yanked, &Line[begin], i); Yanked[i] = '\0'; } } STATIC STATUS delete_string(count) int count; { int i; CHAR *p; if (count <= 0 || End == Point) return ring_bell(); if (count == 1 && Point == End - 1) { /* Optimize common case of delete at end of line. */ End--; p = &Line[Point]; i = 1; TTYput(' '); if (ISCTL(*p)) { i = 2; TTYput(' '); } else if (rl_meta_chars && ISMETA(*p)) { i = 3; TTYput(' '); TTYput(' '); } TTYbackn(i); *p = '\0'; return CSmove; } if (Point + count > End && (count = End - Point) <= 0) return CSstay; if (count > 1) save_yank(Point, count); for (p = &Line[Point], i = End - (Point + count) + 1; --i >= 0; p++) p[0] = p[count]; ceol(); End -= count; TTYstring(&Line[Point]); return CSmove; } STATIC STATUS bk_char() { int i; i = 0; do { if (Point == 0) break; left(CSmove); } while (++i < Repeat); return CSstay; } STATIC STATUS bk_del_char() { int i; i = 0; do { if (Point == 0) break; left(CSmove); } while (++i < Repeat); return delete_string(i); } STATIC STATUS kill_line() { int i; if (Repeat != NO_ARG) { if (Repeat < Point) { i = Point; Point = Repeat; reposition(); (void)delete_string(i - Point); } else if (Repeat > Point) { right(CSmove); (void)delete_string(Repeat - Point - 1); } return CSmove; } save_yank(Point, End - Point); Line[Point] = '\0'; ceol(); End = Point; return CSstay; } STATIC STATUS insert_char(c) int c; { STATUS s; CHAR buff[2]; CHAR *p; CHAR *q; int i; if (Repeat == NO_ARG || Repeat < 2) { buff[0] = c; buff[1] = '\0'; return insert_string(buff); } if ((p = NEW(CHAR, Repeat + 1)) == NULL) return CSstay; for (i = Repeat, q = p; --i >= 0; ) *q++ = c; *q = '\0'; Repeat = 0; s = insert_string(p); DISPOSE(p); return s; } STATIC STATUS meta() { unsigned int c; KEYMAP *kp; if ((c = TTYget()) == EOF) return CSeof; #if defined(ANSI_ARROWS) /* Also include VT-100 arrows. */ if (c == '[' || c == 'O') switch (c = TTYget()) { default: return ring_bell(); case EOF: return CSeof; case 'A': return h_prev(); case 'B': return h_next(); case 'C': return fd_char(); case 'D': return bk_char(); } #endif /* defined(ANSI_ARROWS) */ if (isdigit(c)) { for (Repeat = c - '0'; (c = TTYget()) != EOF && isdigit(c); ) Repeat = Repeat * 10 + c - '0'; Pushed = 1; PushBack = c; return CSstay; } if (isupper(c)) return do_macro(c); for (kp = MetaMap; kp->Function; kp++) if (kp->Key == c) return (*kp->Function)(); return ring_bell(); } STATIC STATUS emacs(c) unsigned int c; { STATUS s; KEYMAP *kp; OldPoint = Point; if (rl_meta_chars && ISMETA(c)) { Pushed = 1; PushBack = UNMETA(c); return meta(); } for (kp = Map; kp->Function; kp++) if (kp->Key == c) break; s = kp->Function ? (*kp->Function)() : insert_char((int)c); if (!Pushed) /* No pushback means no repeat count; hacky, but true. */ Repeat = NO_ARG; return s; } STATIC STATUS TTYspecial(c) unsigned int c; { if (ISMETA(c)) return CSdispatch; if (c == rl_erase || c == DEL) return bk_del_char(); if (c == rl_kill) { if (Point != 0) { Point = 0; reposition(); } Repeat = NO_ARG; return kill_line(); } if (c == rl_eof && Point == 0 && End == 0) return CSeof; if (c == rl_intr) { Signal = SIGINT; return CSsignal; } if (c == rl_quit) { Signal = SIGQUIT; return CSeof; } return CSdispatch; } STATIC CHAR * editinput() { unsigned int c; Repeat = NO_ARG; OldPoint = Point = Mark = End = 0; Line[0] = '\0'; Signal = -1; while ((c = TTYget()) != EOF) switch (TTYspecial(c)) { case CSdone: return Line; case CSeof: return NULL; case CSsignal: return (CHAR *)""; case CSmove: reposition(); break; case CSdispatch: switch (emacs(c)) { case CSdone: return Line; case CSeof: return NULL; case CSsignal: return (CHAR *)""; case CSmove: reposition(); break; case CSdispatch: case CSstay: break; } break; case CSstay: break; } return NULL; } STATIC void hist_add(p) CHAR *p; { int i; if ((p = (CHAR *)strdup((char *)p)) == NULL) return; if (H.Size < HIST_SIZE) H.Lines[H.Size++] = p; else { DISPOSE(H.Lines[0]); for (i = 0; i < HIST_SIZE - 1; i++) H.Lines[i] = H.Lines[i + 1]; H.Lines[i] = p; } H.Pos = H.Size - 1; } /* ** For compatibility with FSF readline. */ /* ARGSUSED0 */ void rl_reset_terminal(p) char *p; { } void rl_initialize() { } char * readline(prompt) CONST char *prompt; { CHAR *line; int s; if (Line == NULL) { Length = MEM_INC; if ((Line = NEW(CHAR, Length)) == NULL) return NULL; } TTYinfo(); rl_ttyset(0); hist_add(NIL); ScreenSize = SCREEN_INC; Screen = NEW(char, ScreenSize); Prompt = prompt ? prompt : (char *)NIL; TTYputs((CONST CHAR *)Prompt); if ((line = editinput()) != NULL) { line = (CHAR *)strdup((char *)line); TTYputs((CHAR *)NEWLINE); TTYflush(); } rl_ttyset(1); DISPOSE(Screen); DISPOSE(H.Lines[--H.Size]); if (line != NULL && *line != '\0' #if defined(UNIQUE_HISTORY) && !(H.Pos && strcmp((char *) line, (char *) H.Lines[H.Pos - 1]) == 0) #endif /* defined(UNIQUE_HISTORY) */ && !(H.Size && strcmp((char *) line, (char *) H.Lines[H.Size - 1]) == 0) ) { hist_add(line); } if (Signal > 0) { s = Signal; Signal = 0; (void)kill(getpid(), s); } return (char *)line; } void add_history(p) char *p; { #ifdef obsolete /* Made part of readline(). -- kjb */ if (p == NULL || *p == '\0') return; #if defined(UNIQUE_HISTORY) if (H.Pos && strcmp(p, (char *) H.Lines[H.Pos - 1]) == 0) return; #endif /* defined(UNIQUE_HISTORY) */ if (H.Size && strcmp(p, (char *) H.Lines[H.Size - 1]) == 0) return; hist_add((CHAR *)p); #endif } STATIC STATUS beg_line() { if (Point) { Point = 0; return CSmove; } return CSstay; } STATIC STATUS del_char() { return delete_string(Repeat == NO_ARG ? 1 : Repeat); } STATIC STATUS end_line() { if (Point != End) { Point = End; return CSmove; } return CSstay; } STATIC char SEPS[] = "\"#$&'()*:;<=>?[\\]^`{|}~\n\t "; /* ** Move back to the beginning of the current word and return an ** allocated copy of it. */ STATIC CHAR * find_word() { CHAR *p, *q; CHAR *new; SIZE_T len; p = &Line[Point]; while (p > Line) { p--; if (p > Line && p[-1] == '\\') { p--; } else { if (strchr(SEPS, (char) *p) != NULL) { p++; break; } } } len = Point - (p - Line) + 1; if ((new = NEW(CHAR, len)) == NULL) return NULL; q = new; while (p < &Line[Point]) { if (*p == '\\') { if (++p == &Line[Point]) break; } *q++ = *p++; } *q = '\0'; return new; } STATIC STATUS c_possible() { CHAR **av; CHAR *word; int ac; word = find_word(); ac = rl_list_possib((char *)word, (char ***)&av); if (word) DISPOSE(word); if (ac) { columns(ac, av); while (--ac >= 0) DISPOSE(av[ac]); DISPOSE(av); return CSmove; } return ring_bell(); } STATIC STATUS c_complete() { CHAR *p, *q; CHAR *word, *new; SIZE_T len; int unique; STATUS s; word = find_word(); p = (CHAR *)rl_complete((char *)word, &unique); if (word) DISPOSE(word); if (p) { len = strlen((char *)p); word = p; new = q = NEW(CHAR, 2 * len + 1); while (*p) { if ((*p < ' ' || strchr(SEPS, (char) *p) != NULL) && (!unique || p[1] != 0)) { *q++ = '\\'; } *q++ = *p++; } *q = '\0'; DISPOSE(word); if (len > 0) { s = insert_string(new); #if ANNOYING_NOISE if (!unique) (void)ring_bell(); #endif } DISPOSE(new); if (len > 0) return s; } return c_possible(); } STATIC STATUS accept_line() { Line[End] = '\0'; return CSdone; } STATIC STATUS transpose() { CHAR c; if (Point) { if (Point == End) left(CSmove); c = Line[Point - 1]; left(CSstay); Line[Point - 1] = Line[Point]; TTYshow(Line[Point - 1]); Line[Point++] = c; TTYshow(c); } return CSstay; } STATIC STATUS quote() { unsigned int c; return (c = TTYget()) == EOF ? CSeof : insert_char((int)c); } STATIC STATUS wipe() { int i; if (Mark > End) return ring_bell(); if (Point > Mark) { i = Point; Point = Mark; Mark = i; reposition(); } return delete_string(Mark - Point); } STATIC STATUS mk_set() { Mark = Point; return CSstay; } STATIC STATUS exchange() { unsigned int c; if ((c = TTYget()) != CTL('X')) return c == EOF ? CSeof : ring_bell(); if ((c = Mark) <= End) { Mark = Point; Point = c; return CSmove; } return CSstay; } STATIC STATUS yank() { if (Yanked && *Yanked) return insert_string(Yanked); return CSstay; } STATIC STATUS copy_region() { if (Mark > End) return ring_bell(); if (Point > Mark) save_yank(Mark, Point - Mark); else save_yank(Point, Mark - Point); return CSstay; } STATIC STATUS move_to_char() { unsigned int c; int i; CHAR *p; if ((c = TTYget()) == EOF) return CSeof; for (i = Point + 1, p = &Line[i]; i < End; i++, p++) if (*p == c) { Point = i; return CSmove; } return CSstay; } STATIC STATUS fd_word() { return do_forward(CSmove); } STATIC STATUS fd_kill_word() { int i; (void)do_forward(CSstay); if (OldPoint != Point) { i = Point - OldPoint; Point = OldPoint; return delete_string(i); } return CSstay; } STATIC STATUS bk_word() { int i; CHAR *p; i = 0; do { for (p = &Line[Point]; p > Line && !isalnum(p[-1]); p--) left(CSmove); for (; p > Line && p[-1] != ' ' && isalnum(p[-1]); p--) left(CSmove); if (Point == 0) break; } while (++i < Repeat); return CSstay; } STATIC STATUS bk_kill_word() { (void)bk_word(); if (OldPoint != Point) return delete_string(OldPoint - Point); return CSstay; } STATIC int argify(line, avp) CHAR *line; CHAR ***avp; { CHAR *c; CHAR **p; CHAR **new; int ac; int i; i = MEM_INC; if ((*avp = p = NEW(CHAR*, i))== NULL) return 0; for (c = line; isspace(*c); c++) continue; if (*c == '\n' || *c == '\0') return 0; for (ac = 0, p[ac++] = c; *c && *c != '\n'; ) { if (isspace(*c)) { *c++ = '\0'; if (*c && *c != '\n') { if (ac + 1 == i) { new = NEW(CHAR*, i + MEM_INC); if (new == NULL) { p[ac] = NULL; return ac; } COPYFROMTO(new, p, i * sizeof (char **)); i += MEM_INC; DISPOSE(p); *avp = p = new; } p[ac++] = c; } } else c++; } *c = '\0'; p[ac] = NULL; return ac; } STATIC STATUS last_argument() { CHAR **av; CHAR *p; STATUS s; int ac; if (H.Size == 1 || (p = H.Lines[H.Size - 2]) == NULL) return ring_bell(); if ((p = (CHAR *)strdup((char *)p)) == NULL) return CSstay; ac = argify(p, &av); if (Repeat != NO_ARG) s = Repeat < ac ? insert_string(av[Repeat]) : ring_bell(); else s = ac ? insert_string(av[ac - 1]) : CSstay; if (ac) DISPOSE(av); DISPOSE(p); return s; } STATIC KEYMAP Map[33] = { { CTL('@'), mk_set }, { CTL('A'), beg_line }, { CTL('B'), bk_char }, { CTL('D'), del_char }, { CTL('E'), end_line }, { CTL('F'), fd_char }, { CTL('G'), ring_bell }, { CTL('H'), bk_del_char }, { CTL('I'), c_complete }, { CTL('J'), accept_line }, { CTL('K'), kill_line }, { CTL('L'), redisplay }, { CTL('M'), accept_line }, { CTL('N'), h_next }, { CTL('O'), ring_bell }, { CTL('P'), h_prev }, { CTL('Q'), ring_bell }, { CTL('R'), h_search }, { CTL('S'), ring_bell }, { CTL('T'), transpose }, { CTL('U'), ring_bell }, { CTL('V'), quote }, { CTL('W'), bk_kill_word }, { CTL('X'), exchange }, { CTL('Y'), yank }, { CTL('Z'), end_line }, { CTL('['), meta }, { CTL(']'), move_to_char }, { CTL('^'), ring_bell }, { CTL('_'), ring_bell }, { 0, NULL } }; STATIC KEYMAP MetaMap[17]= { { CTL('H'), wipe }, { DEL, wipe }, { ' ', mk_set }, { '.', last_argument }, { '<', h_first }, { '>', h_last }, { '?', c_possible }, { 'b', bk_word }, { 'd', fd_kill_word }, { 'f', fd_word }, { 'l', case_down_word }, { 'm', toggle_meta_mode }, { 'u', case_up_word }, { 'y', yank }, { 'w', copy_region }, { 0, NULL } }; /* * $PchId: editline.c,v 1.4 1996/02/22 21:16:56 philip Exp $ */ /* $Revision: 1.3 $ ** ** Internal header file for editline library. */ #include #if defined(HAVE_STDLIB) #include #include #endif /* defined(HAVE_STDLIB) */ #if defined(SYS_UNIX) #include "unix.h" #endif /* defined(SYS_UNIX) */ #if defined(SYS_OS9) #include "os9.h" #endif /* defined(SYS_OS9) */ #if !defined(SIZE_T) #define SIZE_T unsigned int #endif /* !defined(SIZE_T) */ typedef unsigned char CHAR; #if defined(HIDE) #define STATIC static #else #define STATIC /* NULL */ #endif /* !defined(HIDE) */ #if !defined(CONST) #if defined(__STDC__) #define CONST const #else #define CONST #endif /* defined(__STDC__) */ #endif /* !defined(CONST) */ #define MEM_INC 64 #define SCREEN_INC 256 #define DISPOSE(p) free((char *)(p)) #define NEW(T, c) \ ((T *)malloc((unsigned int)(sizeof (T) * (c)))) #define RENEW(p, T, c) \ (p = (T *)realloc((char *)(p), (unsigned int)(sizeof (T) * (c)))) #define COPYFROMTO(new, p, len) \ (void)memcpy((char *)(new), (char *)(p), (int)(len)) /* ** Variables and routines internal to this package. */ extern int rl_eof; extern int rl_erase; extern int rl_intr; extern int rl_kill; extern int rl_quit; extern char *rl_complete(); extern int rl_list_possib(); extern void rl_ttyset(); extern void rl_add_slash(); #if !defined(HAVE_STDLIB) extern char *getenv(); extern char *malloc(); extern char *realloc(); extern char *memcpy(); extern char *strcat(); extern char *strchr(); extern char *strrchr(); extern char *strcpy(); extern int strcmp(); extern int strlen(); extern int strncmp(); #endif /* !defined(HAVE_STDLIB) */ #if defined(NEED_STRDUP) extern char *strdup(); #endif /* $Revision: 1.2 $ ** ** Unix system-dependant routines for editline library. */ #include "editline.h" #if defined(HAVE_TCGETATTR) #include void rl_ttyset(Reset) int Reset; { static struct termios old; struct termios new; if (Reset == 0) { (void)tcgetattr(0, &old); rl_erase = old.c_cc[VERASE]; rl_kill = old.c_cc[VKILL]; rl_eof = old.c_cc[VEOF]; rl_intr = old.c_cc[VINTR]; rl_quit = old.c_cc[VQUIT]; new = old; new.c_lflag &= ~(ECHO | ICANON | ISIG | IEXTEN); new.c_cc[VMIN] = 1; new.c_cc[VTIME] = 0; (void)tcsetattr(0, TCSADRAIN, &new); } else (void)tcsetattr(0, TCSADRAIN, &old); } #else #if defined(HAVE_TERMIO) #include void rl_ttyset(Reset) int Reset; { static struct termio old; struct termio new; if (Reset == 0) { (void)ioctl(0, TCGETA, &old); rl_erase = old.c_cc[VERASE]; rl_kill = old.c_cc[VKILL]; rl_eof = old.c_cc[VEOF]; rl_intr = old.c_cc[VINTR]; rl_quit = old.c_cc[VQUIT]; new = old; new.c_cc[VINTR] = -1; new.c_cc[VQUIT] = -1; new.c_lflag &= ~(ECHO | ICANON); new.c_cc[VMIN] = 1; new.c_cc[VTIME] = 0; (void)ioctl(0, TCSETAW, &new); } else (void)ioctl(0, TCSETAW, &old); } #else #include void rl_ttyset(Reset) int Reset; { static struct sgttyb old_sgttyb; static struct tchars old_tchars; struct sgttyb new_sgttyb; struct tchars new_tchars; if (Reset == 0) { (void)ioctl(0, TIOCGETP, &old_sgttyb); rl_erase = old_sgttyb.sg_erase; rl_kill = old_sgttyb.sg_kill; (void)ioctl(0, TIOCGETC, &old_tchars); rl_eof = old_tchars.t_eofc; rl_intr = old_tchars.t_intrc; rl_quit = old_tchars.t_quitc; new_sgttyb = old_sgttyb; new_sgttyb.sg_flags &= ~ECHO; new_sgttyb.sg_flags |= RAW; (void)ioctl(0, TIOCSETP, &new_sgttyb); new_tchars = old_tchars; new_tchars.t_intrc = -1; new_tchars.t_quitc = -1; (void)ioctl(0, TIOCSETC, &new_tchars); } else { (void)ioctl(0, TIOCSETP, &old_sgttyb); (void)ioctl(0, TIOCSETC, &old_tchars); } } #endif /* defined(HAVE_TERMIO) */ #endif /* defined(HAVE_TCGETATTR) */ void rl_add_slash(path, p) char *path; char *p; { struct stat Sb; if (stat(path, &Sb) >= 0) (void)strcat(p, S_ISDIR(Sb.st_mode) ? "/" : " "); } /* * $PchId: sysunix.c,v 1.4 1996/02/22 21:16:56 philip Exp $ */ /* $Revision: 1.3 $ ** ** A "micro-shell" to test editline library. ** If given any arguments, commands aren't executed. */ #include #if defined(HAVE_STDLIB) #include #endif /* defined(HAVE_STDLIB) */ extern char *readline(); extern void add_history(); #if !defined(HAVE_STDLIB) extern int chdir(); extern int free(); extern int strncmp(); extern int system(); extern void exit(); extern char *getenv(); #endif /* !defined(HAVE_STDLIB) */ #if defined(NEED_PERROR) void perror(s) char *s; { extern int errno; (voidf)printf(stderr, "%s: error %d\n", s, errno); } #endif /* defined(NEED_PERROR) */ /* ARGSUSED1 */ int main(ac, av) int ac; char *av[]; { char *prompt; char *p; int doit; doit = ac == 1; if ((prompt = getenv("TESTPROMPT")) == NULL) prompt = "testit> "; while ((p = readline(prompt)) != NULL) { (void)printf("\t\t\t|%s|\n", p); if (doit) if (strncmp(p, "cd ", 3) == 0) { if (chdir(&p[3]) < 0) perror(&p[3]); } else if (system(p) != 0) perror(p); add_history(p); free(p); } exit(0); /* NOTREACHED */ } /* * $PchId: testit.c,v 1.3 1996/02/22 21:18:51 philip Exp $ */ /* $Revision: 1.1 $ ** ** Editline system header file for Unix. */ #define CRLF "\r\n" #define FORWARD STATIC #include #include #if defined(USE_DIRENT) #include typedef struct dirent DIRENTRY; #else #include typedef struct direct DIRENTRY; #endif /* defined(USE_DIRENT) */ #if !defined(S_ISDIR) #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif /* !defined(S_ISDIR) */ /* * $PchId: unix.h,v 1.3 1996/02/22 21:18:51 philip Exp $ */ .;..Makefileedata.sem_end.send.setext.s# Makefile for lib/end. CC1 = $(CC) -c LIBRARY = ../end.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(edata.o) \ $(LIBRARY)(em_end.o) \ $(LIBRARY)(end.o) \ $(LIBRARY)(etext.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(edata.o): edata.s $(CC1) edata.s $(LIBRARY)(em_end.o): em_end.s $(CC1) em_end.s $(LIBRARY)(end.o): end.s $(CC1) end.s $(LIBRARY)(etext.o): etext.s $(CC1) etext.s # .sect .text .sect .rom .sect .data .align _EM_WSIZE .define _edata _edata: # .sect .text .align _EM_WSIZE .define __etext, endtext __etext: endtext: .sect .rom .align _EM_WSIZE .define endrom endrom: .sect .data .align _EM_WSIZE .define __edata, enddata __edata: enddata: .sect .bss .align _EM_WSIZE .sect .end ! only for declaration of _end, __end or endbss. .define __end, endbss __end: endbss: .sect .text .sect .rom .sect .data .sect .bss .sect .end ! only for declaration of _end, __end or endbss. .define _end _end: # .sect .text .align _EM_WSIZE .define _etext _etext: .;..FP.compileFP.scriptFP_bias.hFP_shift.hFP_trap.hFP_types.hMakefileadd_ext.cadder.cadder.hadf4.cadf8.cbyte_order.hcff4.ccff8.ccfi.ccfu.ccif4.ccif8.ccmf4.ccmf8.ccompact.ccuf4.ccuf8.cdiv_ext.cdvf4.cdvf8.cextend.cfef4.cfef8.cfif4.cfif8.cfptrp.sget_put.hmlf4.cmlf8.cmul_ext.cngf4.cngf8.cnrm_ext.csbf4.csbf8.csft_ext.cshifter.csub_ext.czrf4.czrf8.czrf_ext.c#!/bin/sh # Author: Kees J. Bot # Compile one soft FP source file. # (These files shouldn't be optimized normally, but the 16-bit C compiler # only optimizes scratch register allocation a bit with -O. To the 32-bit # compiler -O is a no-op.) case $#:$1 in 1:*.c) ;; *) echo "$0: $1: not a C file" >&2; exit 1 esac base="`basename "$1" .c`" trap 'rm -f tmp.s "$base.s"; exit 1' 2 cc -O -I. -D_MINIX -D_POSIX_SOURCE -S "$1" && mv "$base.s" tmp.s && sed -f FP.script tmp.s > "$base.s" && cc -c "$base.s" && rm tmp.s "$base.s" s/_adf4/.adf4/ s/_adf8/.adf8/ s/_cff4/.cff4/ s/_cff8/.cff8/ s/_cfi/.cfi/ s/_cfu/.cfu/ s/_cif4/.cif4/ s/_cif8/.cif8/ s/_cmf4/.cmf4/ s/_cmf8/.cmf8/ s/_cuf4/.cuf4/ s/_cuf8/.cuf8/ s/_dvf4/.dvf4/ s/_dvf8/.dvf8/ s/_fef4/.fef4/ s/_fef8/.fef8/ s/_fif4/.fif4/ s/_fif8/.fif8/ s/_mlf4/.mlf4/ s/_mlf8/.mlf8/ s/_ngf4/.ngf4/ s/_ngf8/.ngf8/ s/_sbf4/.sbf4/ s/_sbf8/.sbf8/ s/_zrf4/.zrf4/ s/_zrf8/.zrf8/ s/_add_ext/.add_ext/ s/_div_ext/.div_ext/ s/_mul_ext/.mul_ext/ s/_nrm_ext/.nrm_ext/ s/_sft_ext/.sft_ext/ s/_sub_ext/.sub_ext/ s/_zrf_ext/.zrf_ext/ s/_compact/.compact/ s/_extend/.extend/ s/_b64_add/.b64_add/ s/_b64_sft/.b64_sft/ s/_b64_rsft/.b64_rsft/ s/_b64_lsft/.b64_lsft/ /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: FP_bias.h,v 1.4 89/07/25 14:16:55 ceriel Exp $ */ /* include file for floating point package */ /* FLOAT FORMAT EXPONENT BIAS */ #define SGL_BIAS 127 /* excess 128 notation used */ #define DBL_BIAS 1023 /* excess 1024 notation used */ #define EXT_BIAS 0 /* 2s-complement notation used */ /* this is possible because the */ /* sign is in a seperate word */ /* VARIOUS MAX AND MIN VALUES */ /* 1) FOR THE DIFFERENT FORMATS */ #define SGL_MAX 254 /* standard definition */ #define SGL_MIN 1 /* standard definition */ #define DBL_MAX 2046 /* standard definition */ #define DBL_MIN 1 /* standard definition */ #define EXT_MAX 16383 /* standard minimum */ #define EXT_MIN -16382 /* standard minimum */ /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: FP_shift.h,v 1.3 89/07/25 14:17:04 ceriel Exp $ */ /* include file for floating point package */ # define CARRYBIT 0x80000000L # define NORMBIT 0x80000000L # define EXP_STORE 16 /* parameters for Single Precision */ #define SGL_EXPSHIFT 7 #define SGL_M1LEFT 8 #define SGL_ZERO 0xffffff80L #define SGL_EXACT 0xff #define SGL_RUNPACK SGL_M1LEFT #define SGL_ROUNDUP 0x80 #define SGL_CARRYOUT 0x01000000L #define SGL_MASK 0x007fffffL /* parameters for Double Precision */ /* used in extend.c */ #define DBL_EXPSHIFT 4 #define DBL_M1LEFT 11 #define DBL_RPACK (32-DBL_M1LEFT) #define DBL_LPACK DBL_M1LEFT /* used in compact.c */ #define DBL_ZERO 0xfffffd00L #define DBL_EXACT 0x7ff #define DBL_RUNPACK DBL_M1LEFT #define DBL_LUNPACK (32-DBL_RUNPACK) #define DBL_ROUNDUP 0x400 #define DBL_CARRYOUT 0x00200000L #define DBL_MASK 0x000fffffL /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: FP_trap.h,v 1.2 88/04/07 11:33:06 ceriel Exp $ */ /* include file for floating point package */ /* EM TRAPS */ #define EIOVFL 3 /* Integer Overflow */ #define EFOVFL 4 /* Floating Overflow */ #define EFUNFL 5 /* Floating Underflow */ #define EIDIVZ 6 /* Integer Divide by 0 */ #define EFDIVZ 7 /* Floating Divide by 0.0 */ #define EIUND 8 /* Integer Undefined Number */ #define EFUND 9 /* Floating Undefined Number */ #define ECONV 10 /* Conversion Error */ # define trap(x) _fptrp(x) /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: FP_types.h,v 1.4 93/01/05 12:03:05 ceriel Exp $ */ /********************************************************/ /* Type definitions for C Floating Point Package include file for floating point package */ /********************************************************/ /* THESE STRUCTURES ARE USED TO ADDRESS THE INDIVIDUAL PARTS OF THE FLOATING POINT NUMBER REPRESENTATIONS. THREE STRUCTURES ARE DEFINED: SINGLE: single precision floating format DOUBLE: double precision floating format EXTEND: double precision extended format */ /********************************************************/ #ifndef __FPTYPES #define __FPTYPES typedef struct { unsigned long h_32; /* higher 32 bits of 64 */ unsigned long l_32; /* lower 32 bits of 64 */ } B64; typedef unsigned long SINGLE; typedef struct { unsigned long d[2]; } DOUBLE; typedef struct { /* expanded float format */ short sign; short exp; B64 mantissa; #define m1 mantissa.h_32 #define m2 mantissa.l_32 } EXTEND; struct fef4_returns { int e; SINGLE f; }; struct fef8_returns { int e; DOUBLE f; }; struct fif4_returns { SINGLE ipart; SINGLE fpart; }; struct fif8_returns { DOUBLE ipart; DOUBLE fpart; }; #if __STDC__ #define _PROTOTYPE(function, params) function params #else #define _PROTOTYPE(function, params) function() #endif _PROTOTYPE( void add_ext, (EXTEND *e1, EXTEND *e2)); _PROTOTYPE( void mul_ext, (EXTEND *e1, EXTEND *e2)); _PROTOTYPE( void div_ext, (EXTEND *e1, EXTEND *e2)); _PROTOTYPE( void sub_ext, (EXTEND *e1, EXTEND *e2)); _PROTOTYPE( void sft_ext, (EXTEND *e1, EXTEND *e2)); _PROTOTYPE( void nrm_ext, (EXTEND *e1)); _PROTOTYPE( void zrf_ext, (EXTEND *e1)); _PROTOTYPE( void extend, (unsigned long *from, EXTEND *to, int size)); _PROTOTYPE( void compact, (EXTEND *from, unsigned long *to, int size)); _PROTOTYPE( void _fptrp, (int)); _PROTOTYPE( void adf4, (SINGLE s2, SINGLE s1)); _PROTOTYPE( void adf8, (DOUBLE s2, DOUBLE s1)); _PROTOTYPE( void sbf4, (SINGLE s2, SINGLE s1)); _PROTOTYPE( void sbf8, (DOUBLE s2, DOUBLE s1)); _PROTOTYPE( void dvf4, (SINGLE s2, SINGLE s1)); _PROTOTYPE( void dvf8, (DOUBLE s2, DOUBLE s1)); _PROTOTYPE( void mlf4, (SINGLE s2, SINGLE s1)); _PROTOTYPE( void mlf8, (DOUBLE s2, DOUBLE s1)); _PROTOTYPE( void ngf4, (SINGLE f)); _PROTOTYPE( void ngf8, (DOUBLE f)); _PROTOTYPE( void zrf4, (SINGLE *l)); _PROTOTYPE( void zrf8, (DOUBLE *z)); _PROTOTYPE( void cff4, (DOUBLE src)); _PROTOTYPE( void cff8, (SINGLE src)); _PROTOTYPE( void cif4, (int ss, long src)); _PROTOTYPE( void cif8, (int ss, long src)); _PROTOTYPE( void cuf4, (int ss, long src)); _PROTOTYPE( void cuf8, (int ss, long src)); _PROTOTYPE( long cfu, (int ds, int ss, DOUBLE src)); _PROTOTYPE( long cfi, (int ds, int ss, DOUBLE src)); _PROTOTYPE( int cmf4, (SINGLE s2, SINGLE s1)); _PROTOTYPE( int cmf8, (DOUBLE d1, DOUBLE d2)); _PROTOTYPE( void fef4, (struct fef4_returns *r, SINGLE s1)); _PROTOTYPE( void fef8, (struct fef8_returns *r, DOUBLE s1)); _PROTOTYPE( void fif4, (struct fif4_returns *p, SINGLE x, SINGLE y)); _PROTOTYPE( void fif8, (struct fif8_returns *p, DOUBLE x, DOUBLE y)); _PROTOTYPE( void b64_sft, (B64 *, int)); _PROTOTYPE( void b64_lsft, (B64 *)); _PROTOTYPE( void b64_rsft, (B64 *)); _PROTOTYPE( int b64_add, (B64 *, B64 *)); #endif # Makefile for lib/float. CC1 = ./FP.compile LIBRARY = ../libfp.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(add_ext.o) \ $(LIBRARY)(adder.o) \ $(LIBRARY)(adf4.o) \ $(LIBRARY)(adf8.o) \ $(LIBRARY)(cff4.o) \ $(LIBRARY)(cff8.o) \ $(LIBRARY)(cfi.o) \ $(LIBRARY)(cfu.o) \ $(LIBRARY)(cif4.o) \ $(LIBRARY)(cif8.o) \ $(LIBRARY)(cmf4.o) \ $(LIBRARY)(cmf8.o) \ $(LIBRARY)(compact.o) \ $(LIBRARY)(cuf4.o) \ $(LIBRARY)(cuf8.o) \ $(LIBRARY)(div_ext.o) \ $(LIBRARY)(dvf4.o) \ $(LIBRARY)(dvf8.o) \ $(LIBRARY)(extend.o) \ $(LIBRARY)(fef4.o) \ $(LIBRARY)(fef8.o) \ $(LIBRARY)(fif4.o) \ $(LIBRARY)(fif8.o) \ $(LIBRARY)(fptrp.o) \ $(LIBRARY)(mlf4.o) \ $(LIBRARY)(mlf8.o) \ $(LIBRARY)(mul_ext.o) \ $(LIBRARY)(ngf4.o) \ $(LIBRARY)(ngf8.o) \ $(LIBRARY)(nrm_ext.o) \ $(LIBRARY)(sbf4.o) \ $(LIBRARY)(sbf8.o) \ $(LIBRARY)(sft_ext.o) \ $(LIBRARY)(shifter.o) \ $(LIBRARY)(sub_ext.o) \ $(LIBRARY)(zrf4.o) \ $(LIBRARY)(zrf8.o) \ $(LIBRARY)(zrf_ext.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(add_ext.o): add_ext.c $(CC1) add_ext.c $(LIBRARY)(adder.o): adder.c $(CC1) adder.c $(LIBRARY)(adf4.o): adf4.c $(CC1) adf4.c $(LIBRARY)(adf8.o): adf8.c $(CC1) adf8.c $(LIBRARY)(cff4.o): cff4.c $(CC1) cff4.c $(LIBRARY)(cff8.o): cff8.c $(CC1) cff8.c $(LIBRARY)(cfi.o): cfi.c $(CC1) cfi.c $(LIBRARY)(cfu.o): cfu.c $(CC1) cfu.c $(LIBRARY)(cif4.o): cif4.c $(CC1) cif4.c $(LIBRARY)(cif8.o): cif8.c $(CC1) cif8.c $(LIBRARY)(cmf4.o): cmf4.c $(CC1) cmf4.c $(LIBRARY)(cmf8.o): cmf8.c $(CC1) cmf8.c $(LIBRARY)(compact.o): compact.c $(CC1) compact.c $(LIBRARY)(cuf4.o): cuf4.c $(CC1) cuf4.c $(LIBRARY)(cuf8.o): cuf8.c $(CC1) cuf8.c $(LIBRARY)(div_ext.o): div_ext.c $(CC1) div_ext.c $(LIBRARY)(dvf4.o): dvf4.c $(CC1) dvf4.c $(LIBRARY)(dvf8.o): dvf8.c $(CC1) dvf8.c $(LIBRARY)(extend.o): extend.c $(CC1) extend.c $(LIBRARY)(fef4.o): fef4.c $(CC1) fef4.c $(LIBRARY)(fef8.o): fef8.c $(CC1) fef8.c $(LIBRARY)(fif4.o): fif4.c $(CC1) fif4.c $(LIBRARY)(fif8.o): fif8.c $(CC1) fif8.c $(LIBRARY)(fptrp.o): fptrp.s $(CC) -c fptrp.s $(LIBRARY)(mlf4.o): mlf4.c $(CC1) mlf4.c $(LIBRARY)(mlf8.o): mlf8.c $(CC1) mlf8.c $(LIBRARY)(mul_ext.o): mul_ext.c $(CC1) mul_ext.c $(LIBRARY)(ngf4.o): ngf4.c $(CC1) ngf4.c $(LIBRARY)(ngf8.o): ngf8.c $(CC1) ngf8.c $(LIBRARY)(nrm_ext.o): nrm_ext.c $(CC1) nrm_ext.c $(LIBRARY)(sbf4.o): sbf4.c $(CC1) sbf4.c $(LIBRARY)(sbf8.o): sbf8.c $(CC1) sbf8.c $(LIBRARY)(sft_ext.o): sft_ext.c $(CC1) sft_ext.c $(LIBRARY)(shifter.o): shifter.c $(CC1) shifter.c $(LIBRARY)(sub_ext.o): sub_ext.c $(CC1) sub_ext.c $(LIBRARY)(zrf4.o): zrf4.c $(CC1) zrf4.c $(LIBRARY)(zrf8.o): zrf8.c $(CC1) zrf8.c $(LIBRARY)(zrf_ext.o): zrf_ext.c $(CC1) zrf_ext.c /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: add_ext.c,v 1.7 93/01/05 12:03:11 ceriel Exp $ */ /* ADD TWO EXTENDED FORMAT NUMBERS */ #include "FP_types.h" void add_ext(e1,e2) register EXTEND *e1,*e2; { if ((e2->m1 | e2->m2) == 0L) { return; } if ((e1->m1 | e1->m2) == 0L) { *e1 = *e2; return; } sft_ext(e1, e2); /* adjust mantissas to equal powers */ if (e1->sign != e2->sign) { /* e1 + e2 = e1 - (-e2) */ if (e2->m1 > e1->m1 || (e2->m1 == e1->m1 && e2->m2 > e1->m2)) { /* abs(e2) > abs(e1) */ EXTEND x; x = *e1; *e1 = *e2; if (x.m2 > e1->m2) { e1->m1 -= 1; /* carry in */ } e1->m1 -= x.m1; e1->m2 -= x.m2; } else { if (e2->m2 > e1->m2) e1->m1 -= 1; /* carry in */ e1->m1 -= e2->m1; e1->m2 -= e2->m2; } } else { if (b64_add(&e1->mantissa,&e2->mantissa)) { /* addition carry */ b64_rsft(&e1->mantissa); /* shift mantissa one bit RIGHT */ e1->m1 |= 0x80000000L; /* set max bit */ e1->exp++; /* increase the exponent */ } } nrm_ext(e1); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: adder.c,v 1.6 93/01/05 12:03:17 ceriel Exp $ */ /* * these are the routines the routines to do 32 and 64-bit addition */ # ifdef EXT_DEBUG # include # endif # include "FP_types.h" # define UNKNOWN -1 # define TRUE 1 # define FALSE 0 # define MAXBIT 0x80000000L /* * add 64 bits */ int b64_add(e1,e2) /* * pointers to 64 bit 'registers' */ register B64 *e1,*e2; { register int overflow; int carry; /* add higher pair of 32 bits */ overflow = ((unsigned long) 0xFFFFFFFF - e1->h_32 < e2->h_32); e1->h_32 += e2->h_32; /* add lower pair of 32 bits */ carry = ((unsigned long) 0xFFFFFFFF - e1->l_32 < e2->l_32); e1->l_32 += e2->l_32; # ifdef EXT_DEBUG printf("\t\t\t\t\tb64_add: overflow (%d); internal carry(%d)\n", overflow,carry); fflush(stdout); # endif if ((carry) && (++e1->h_32 == 0)) return(TRUE); /* had a 64 bit overflow */ return(overflow); /* return status from higher add */ } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: adder.h,v 1.2 92/02/20 18:20:25 philip Exp $ */ /* * include file for 32 & 64 bit addition */ typedef struct B64 { unsigned long h_32; /* higher 32 bits of 64 */ unsigned long l_32; /* lower 32 bits of 64 */ } B64; /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: adf4.c,v 1.7 93/01/05 12:03:23 ceriel Exp $ */ /* ADD TWO FLOATS - SINGLE (ADF 4) */ #include "FP_types.h" void adf4(s2,s1) SINGLE s1,s2; { EXTEND e1,e2; int swap = 0; if (s1 == (SINGLE) 0) { s1 = s2; return; } if (s2 == (SINGLE) 0) { return; } extend(&s1,&e1,sizeof(SINGLE)); extend(&s2,&e2,sizeof(SINGLE)); add_ext(&e1,&e2); compact(&e1,&s1,sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: adf8.c,v 1.7 93/01/05 12:03:29 ceriel Exp $ */ /* ADD TWO FLOATS - DOUBLE (ADF 8) */ #include "FP_types.h" void adf8(s2,s1) DOUBLE s1,s2; { EXTEND e1,e2; if (s1.d[0] == 0 && s1.d[1] == 0) { s1 = s2; return; } if (s2.d[0] == 0 && s2.d[1] == 0) { return; } extend(&s1.d[0],&e1,sizeof(DOUBLE)); extend(&s2.d[0],&e2,sizeof(DOUBLE)); add_ext(&e1,&e2); compact(&e1,&s1.d[0],sizeof(DOUBLE)); } #define CHAR_UNSIGNED 0 #define MSB_AT_LOW_ADDRESS 0 #define MSW_AT_LOW_ADDRESS 0 #define FL_MSB_AT_LOW_ADDRESS 0 #define FL_MSW_AT_LOW_ADDRESS 0 #define FL_MSL_AT_LOW_ADDRESS 0 /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cff4.c,v 1.5 93/01/05 12:03:36 ceriel Exp $ */ /* CONVERT DOUBLE TO SINGLE (CFF 8 4) This routine works quite simply. A floating point of size 08 is converted to extended format. This extended variable is converted back to a floating point of size 04. */ #include "FP_types.h" void cff4(src) DOUBLE src; /* the source itself - THIS TIME it's DOUBLE */ { EXTEND buf; extend(&src.d[0],&buf,sizeof(DOUBLE)); /* no matter what */ compact(&buf,&(src.d[1]),sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cff8.c,v 1.5 93/01/05 12:03:41 ceriel Exp $ */ /* CONVERT SINGLE TO DOUBLE (CFF 4 8) This routine works quite simply. A floating point of size 04 is converted to extended format. This extended variable is converted back to a floating point of size 08. */ #include "FP_types.h" void cff8(src) SINGLE src; { EXTEND buf; extend(&src,&buf,sizeof(SINGLE)); /* no matter what */ compact(&buf, &src,sizeof(DOUBLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cfi.c,v 1.5 93/01/05 12:03:48 ceriel Exp $ */ /* CONVERT FLOAT TO SIGNED (CFI m n) N.B. The caller must know what it is getting. A LONG is always returned. If it is an integer the high byte is cleared first. */ #include "FP_trap.h" #include "FP_types.h" #include "FP_shift.h" long cfi(ds,ss,src) int ds; /* destination size (2 or 4) */ int ss; /* source size (4 or 8) */ DOUBLE src; /* assume worst case */ { EXTEND buf; long new; short max_exp; extend(&src.d[0],&buf,ss); /* get extended format */ if (buf.exp < 0) { /* no conversion needed */ src.d[ss == 8] = 0L; return(0L); } max_exp = (ds << 3) - 2; /* signed numbers */ /* have more limited max_exp */ if (buf.exp > max_exp) { if (buf.exp == max_exp+1 && buf.sign && buf.m1 == NORMBIT && buf.m2 == 0L) { } else { trap(EIOVFL); /* integer overflow */ buf.exp %= max_exp; /* truncate */ } } new = buf.m1 >> (31-buf.exp); if (buf.sign) new = -new; done: src.d[ss == 8] = new; return(new); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cfu.c,v 1.5 93/01/05 12:03:55 ceriel Exp $ */ /* CONVERT FLOAT TO UNSIGNED (CFU m n) N.B. The caller must know what it is getting. A LONG is always returned. If it is an integer the high byte is cleared first. */ #include "FP_trap.h" #include "FP_types.h" long cfu(ds,ss,src) int ds; /* destination size (2 or 4) */ int ss; /* source size (4 or 8) */ DOUBLE src; /* assume worst case */ { EXTEND buf; long new; short newint, max_exp; extend(&src.d[0],&buf,ss); /* get extended format */ if (buf.exp < 0) { /* no conversion needed */ src.d[ss == 8] = 0L; return(0L); } max_exp = (ds << 3) - 1; if (buf.exp > max_exp) { trap(EIOVFL); /* integer overflow */ buf.exp %= max_exp; } new = buf.m1 >> (31-buf.exp); done: src.d[ss == 8] = new; return(new); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cif4.c,v 1.5 93/01/05 12:04:01 ceriel Exp $ */ /* CONVERT INTEGER TO SINGLE (CIF n 4) THIS ROUTINE WORKS BY FILLING AN EXTENDED WITH THE INTEGER VALUE IN EXTENDED FORMAT AND USES COMPACT() TO PUT IT INTO THE PROPER FLOATING POINT PRECISION. */ #include "FP_types.h" void cif4(ss,src) int ss; /* source size */ long src; /* largest possible integer to convert */ { EXTEND buf; short *ipt; long i_src; SINGLE *result; zrf_ext(&buf); if (ss == sizeof(long)) { buf.exp = 31; i_src = src; result = (SINGLE *) &src; } else { ipt = (short *) &src; i_src = (long) *ipt; buf.exp = 15; result = (SINGLE *) &ss; } if (i_src == 0) { *result = (SINGLE) 0L; return; } /* ESTABLISHED THAT src != 0 */ /* adjust exponent field */ buf.sign = (i_src < 0) ? 0x8000 : 0; /* clear sign bit of integer */ /* move to mantissa field */ buf.m1 = (i_src < 0) ? -i_src : i_src; /* adjust mantissa field */ if (ss != sizeof(long)) buf.m1 <<= 16; nrm_ext(&buf); /* adjust mantissa field */ compact(&buf, result,sizeof(SINGLE)); /* put on stack */ } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cif8.c,v 1.5 93/01/05 12:04:07 ceriel Exp $ */ /* CONVERT INTEGER TO FLOAT (CIF n 8) THIS ROUTINE WORKS BY FILLING AN EXTENDED WITH THE INTEGER VALUE IN EXTENDED FORMAT AND USES COMPACT() TO PUT IT INTO THE PROPER FLOATING POINT PRECISION. */ #include "FP_types.h" void cif8(ss,src) int ss; /* source size */ long src; /* largest possible integer to convert */ { EXTEND buf; DOUBLE *result; /* for return value */ short *ipt; long i_src; result = (DOUBLE *) ((void *) &ss); /* always */ zrf_ext(&buf); if (ss == sizeof(long)) { buf.exp = 31; i_src = src; } else { ipt = (short *) &src; i_src = (long) *ipt; buf.exp = 15; } if (i_src == 0) { zrf8(result); return; } /* ESTABLISHED THAT src != 0 */ /* adjust exponent field */ buf.sign = (i_src < 0) ? 0x8000 : 0; /* clear sign bit of integer */ /* move to mantissa field */ buf.m1 = (i_src < 0) ? -i_src : i_src; /* adjust mantissa field */ if (ss != sizeof(long)) buf.m1 <<= 16; nrm_ext(&buf); compact(&buf,&result->d[0],8); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cmf4.c,v 1.6 93/01/05 12:04:14 ceriel Exp $ */ /* COMPARE SINGLES (CMF 4) */ #include "FP_types.h" #include "get_put.h" int cmf4(f1,f2) SINGLE f1,f2; { /* * return ((f1 < f2) ? 1 : (f1 - f2)) */ #define SIGN(x) (((x) < 0) ? -1 : 1) int sign1,sign2; long l1,l2; l1 = get4((char *) &f1); l2 = get4((char *) &f2); if (l1 == l2) return 0; sign1 = SIGN(l1); sign2 = SIGN(l2); if (sign1 != sign2) { if ((l1 & 0x7fffffff) == 0 && (l2 & 0x7fffffff) == 0) return 0; return ((sign1 > 0) ? -1 : 1); } return (sign1 * ((l1 < l2) ? 1 : -1)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cmf8.c,v 1.9 93/01/05 12:04:22 ceriel Exp $ */ /* COMPARE DOUBLES (CMF 8) */ #include "FP_types.h" #include "get_put.h" int cmf8(d1,d2) DOUBLE d1,d2; { #define SIGN(x) (((x) < 0) ? -1 : 1) /* * return ((d1 < d2) ? 1 : (d1 > d2) ? -1 : 0)) */ long l1,l2; int sign1,sign2; int rv; #if FL_MSL_AT_LOW_ADDRESS l1 = get4((char *)&d1); l2 = get4((char *)&d2); #else l1 = get4(((char *)&d1+4)); l2 = get4(((char *)&d2+4)); #endif sign1 = SIGN(l1); sign2 = SIGN(l2); if (sign1 != sign2) { l1 &= 0x7fffffff; l2 &= 0x7fffffff; if (l1 != 0 || l2 != 0) { return ((sign1 > 0) ? -1 : 1); } } if (l1 != l2) { /* we can decide here */ rv = l1 < l2 ? 1 : -1; } else { /* decide in 2nd half */ unsigned long u1, u2; #if FL_MSL_AT_LOW_ADDRESS u1 = get4(((char *)&d1 + 4)); u2 = get4(((char *)&d2 + 4)); #else u1 = get4((char *)&d1); u2 = get4((char *)&d2); #endif if (u1 == u2) return(0); if (u1 < u2) rv = 1; else rv = -1; } return sign1 * rv; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: compact.c,v 1.13 93/01/05 12:04:28 ceriel Exp $ */ /* COMPACT EXTEND FORMAT INTO FLOAT OF PROPER SIZE */ # include "FP_bias.h" # include "FP_shift.h" # include "FP_trap.h" # include "FP_types.h" # include "get_put.h" void compact(f,to,size) EXTEND *f; unsigned long *to; int size; { int error = 0; if (size == sizeof(DOUBLE)) { /* * COMPACT EXTENDED INTO DOUBLE */ DOUBLE *DBL = (DOUBLE *) (void *) to; if ((f->m1|(f->m2 & DBL_ZERO)) == 0L) { zrf8(DBL); return; } f->exp += DBL_BIAS; /* restore proper bias */ if (f->exp > DBL_MAX) { dbl_over: trap(EFOVFL); f->exp = DBL_MAX+1; f->m1 = 0; f->m2 = 0; if (error++) return; } else if (f->exp < DBL_MIN) { b64_rsft(&(f->mantissa)); if (f->exp < 0) { b64_sft(&(f->mantissa), -f->exp); f->exp = 0; } /* underflow ??? */ } /* local CAST conversion */ /* because of special format shift only 10 bits */ /* bit shift mantissa 10 bits */ /* first align within words, then do store operation */ DBL->d[0] = f->m1 >> DBL_RUNPACK; /* plus 22 == 32 */ DBL->d[1] = f->m2 >> DBL_RUNPACK; /* plus 22 == 32 */ DBL->d[1] |= (f->m1 << DBL_LUNPACK); /* plus 10 == 32 */ /* if not exact then round to nearest */ /* on a tie, round to even */ #ifdef EXCEPTION_INEXACT if ((f->m2 & DBL_EXACT) != 0) { INEXACT(); #endif if (((f->m2 & DBL_EXACT) > DBL_ROUNDUP) || ((f->m2 & DBL_EXACT) == DBL_ROUNDUP && (f->m2 & (DBL_ROUNDUP << 1)))) { DBL->d[1]++; /* rounding up */ if (DBL->d[1] == 0L) { /* carry out */ DBL->d[0]++; if (f->exp == 0 && (DBL->d[0] & ~DBL_MASK)) { f->exp++; } if (DBL->d[0] & DBL_CARRYOUT) { /* carry out */ if (DBL->d[0] & 01) DBL->d[1] = CARRYBIT; DBL->d[0] >>= 1; f->exp++; } } /* check for overflow */ if (f->exp > DBL_MAX) goto dbl_over; } #ifdef EXCEPTION_INEXACT } #endif /* * STORE EXPONENT AND SIGN: * * 1) clear leading bits (B4-B15) * 2) shift and store exponent */ DBL->d[0] &= DBL_MASK; DBL->d[0] |= ((long) (f->exp << DBL_EXPSHIFT) << EXP_STORE); if (f->sign) DBL->d[0] |= CARRYBIT; /* * STORE MANTISSA */ #if FL_MSL_AT_LOW_ADDRESS put4(DBL->d[0], (char *) &DBL->d[0]); put4(DBL->d[1], (char *) &DBL->d[1]); #else { unsigned long l; put4(DBL->d[1], (char *) &l); put4(DBL->d[0], (char *) &DBL->d[1]); DBL->d[0] = l; } #endif } else { /* * COMPACT EXTENDED INTO FLOAT */ SINGLE *SGL; /* local CAST conversion */ SGL = (SINGLE *) (void *) to; if ((f->m1 & SGL_ZERO) == 0L) { *SGL = 0L; return; } f->exp += SGL_BIAS; /* restore bias */ if (f->exp > SGL_MAX) { sgl_over: trap(EFOVFL); f->exp = SGL_MAX+1; f->m1 = 0L; f->m2 = 0L; if (error++) return; } else if (f->exp < SGL_MIN) { b64_rsft(&(f->mantissa)); if (f->exp < 0) { b64_sft(&(f->mantissa), -f->exp); f->exp = 0; } /* underflow ??? */ } /* shift mantissa and store */ *SGL = (f->m1 >> SGL_RUNPACK); /* check for rounding to nearest */ /* on a tie, round to even */ #ifdef EXCEPTION_INEXACT if (f->m2 != 0 || (f->m1 & SGL_EXACT) != 0L) { INEXACT(); #endif if (((f->m1 & SGL_EXACT) > SGL_ROUNDUP) || ((f->m1 & SGL_EXACT) == SGL_ROUNDUP && (f->m1 & (SGL_ROUNDUP << 1)))) { (*SGL)++; if (f->exp == 0 && (*SGL & ~SGL_MASK)) { f->exp++; } /* check normal */ if (*SGL & SGL_CARRYOUT) { *SGL >>= 1; f->exp++; } if (f->exp > SGL_MAX) goto sgl_over; } #ifdef EXCEPTION_INEXACT } #endif /* * STORE EXPONENT AND SIGN: * * 1) clear leading bit of fraction * 2) shift and store exponent */ *SGL &= SGL_MASK; /* B23-B31 are 0 */ *SGL |= ((long) (f->exp << SGL_EXPSHIFT) << EXP_STORE); if (f->sign) *SGL |= CARRYBIT; /* * STORE MANTISSA */ put4(*SGL, (char *) &SGL); } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cuf4.c,v 1.6 93/01/05 12:04:35 ceriel Exp $ */ /* CONVERT INTEGER TO SINGLE (CUF n 4) THIS ROUTINE WORKS BY FILLING AN EXTENDED WITH THE INTEGER VALUE IN EXTENDED FORMAT AND USES COMPACT() TO PUT IT INTO THE PROPER FLOATING POINT PRECISION. */ #include "FP_types.h" void cuf4(ss,src) int ss; /* source size */ long src; /* largest possible integer to convert */ { EXTEND buf; short *ipt; SINGLE *result; long i_src; zrf_ext(&buf); if (ss == sizeof(long)) { buf.exp = 31; i_src = src; result = (SINGLE *) &src; } else { ipt = (short *) &src; i_src = (long) *ipt; buf.exp = 15; result = (SINGLE *) ((void *) &ss); } if (i_src == 0) { *result = (SINGLE) 0L; return; } /* ESTABLISHED THAT src != 0 */ /* adjust exponent field */ if (ss != sizeof(long)) i_src <<= 16; /* move to mantissa field */ buf.m1 = i_src; /* adjust mantissa field */ nrm_ext(&buf); compact(&buf,result,4); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: cuf8.c,v 1.6 93/01/05 12:04:41 ceriel Exp $ */ /* CONVERT INTEGER TO FLOAT (CUF n 8) THIS ROUTINE WORKS BY FILLING AN EXTENDED WITH THE INTEGER VALUE IN EXTENDED FORMAT AND USES COMPACT() TO PUT IT INTO THE PROPER FLOATING POINT PRECISION. */ #include "FP_types.h" void cuf8(ss,src) int ss; /* source size */ long src; /* largest possible integer to convert */ { EXTEND buf; short *ipt; long i_src; zrf_ext(&buf); if (ss == sizeof(long)) { buf.exp = 31; i_src = src; } else { ipt = (short *) &src; i_src = (long) *ipt; buf.exp = 15; } if (i_src == 0) { zrf8((DOUBLE *)((void *)&ss)); return; } /* ESTABLISHED THAT src != 0 */ /* adjust exponent field */ if (ss != sizeof(long)) i_src <<= 16; /* move to mantissa field */ buf.m1 = i_src; /* adjust mantissa field */ nrm_ext(&buf); compact(&buf,(unsigned long *) (void *)&ss,8); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: div_ext.c,v 1.10 93/01/05 12:04:47 ceriel Exp $ */ /* DIVIDE EXTENDED FORMAT */ #include "FP_bias.h" #include "FP_trap.h" #include "FP_types.h" /* November 15, 1984 This is a routine to do the work. There are two versions: One is based on the partial products method and makes no use possible machine instructions to divide (hardware dividers). The other is used when USE_DIVIDE is defined. It is much faster on machines with fast 4 byte operations. */ /********************************************************/ void div_ext(e1,e2) EXTEND *e1,*e2; { short error = 0; B64 result; register unsigned long *lp; #ifndef USE_DIVIDE short count; #else unsigned short u[9], v[5]; register int j; register unsigned short *u_p = u; int maxv = 4; #endif if ((e2->m1 | e2->m2) == 0) { /* * Exception 8.2 - Divide by zero */ trap(EFDIVZ); e1->m1 = e1->m2 = 0L; e1->exp = EXT_MAX; return; } if ((e1->m1 | e1->m2) == 0) { /* 0 / anything == 0 */ e1->exp = 0; /* make sure */ return; } #ifndef USE_DIVIDE /* * numbers are right shifted one bit to make sure * that m1 is quaranteed to be larger if its * maximum bit is set */ b64_rsft(&e1->mantissa); /* 64 bit shift right */ b64_rsft(&e2->mantissa); /* 64 bit shift right */ e1->exp++; e2->exp++; #endif /* check for underflow, divide by zero, etc */ e1->sign ^= e2->sign; e1->exp -= e2->exp; #ifndef USE_DIVIDE /* do division of mantissas */ /* uses partial product method */ /* init control variables */ count = 64; result.h_32 = 0L; result.l_32 = 0L; /* partial product division loop */ while (count--) { /* first left shift result 1 bit */ /* this is ALWAYS done */ b64_lsft(&result); /* compare dividend and divisor */ /* if dividend >= divisor add a bit */ /* and subtract divisior from dividend */ if ( (e1->m1 < e2->m1) || ((e1->m1 == e2->m1) && (e1->m2 < e2->m2) )) ; /* null statement */ /* i.e., don't add or subtract */ else { result.l_32++; /* ADD */ if (e2->m2 > e1->m2) e1->m1 -= 1; /* carry in */ e1->m1 -= e2->m1; /* do SUBTRACTION */ e1->m2 -= e2->m2; /* SUBTRACTION */ } /* shift dividend left one bit OR */ /* IF it equals ZERO we can break out */ /* of the loop, but still must shift */ /* the quotient the remaining count bits */ /* NB save the results of this test in error */ /* if not zero, then the result is inexact. */ /* this would be reported in IEEE standard */ /* lp points to dividend */ lp = &e1->m1; error = ((*lp | *(lp+1)) != 0L) ? 1 : 0; if (error) { /* more work */ /* assume max bit == 0 (see above) */ b64_lsft(&e1->mantissa); continue; } else break; /* leave loop */ } /* end of divide by subtraction loop */ if (count > 0) { lp = &result.h_32; if (count > 31) { /* move to higher word */ *lp = *(lp+1); count -= 32; *(lp+1) = 0L; /* clear low word */ } if (*lp) *lp <<= count; /* shift rest of way */ lp++; /* == &result.l_32 */ if (*lp) { result.h_32 |= (*lp >> 32-count); *lp <<= count; } } #else /* USE_DIVIDE */ u[4] = (e1->m2 & 1) << 15; b64_rsft(&(e1->mantissa)); u[0] = e1->m1 >> 16; u[1] = e1->m1; u[2] = e1->m2 >> 16; u[3] = e1->m2; u[5] = 0; u[6] = 0; u[7] = 0; v[1] = e2->m1 >> 16; v[2] = e2->m1; v[3] = e2->m2 >> 16; v[4] = e2->m2; while (! v[maxv]) maxv--; result.h_32 = 0; result.l_32 = 0; lp = &result.h_32; /* * Use an algorithm of Knuth (The art of programming, Seminumerical * algorithms), to divide u by v. u and v are both seen as numbers * with base 65536. */ for (j = 0; j <= 3; j++, u_p++) { unsigned long q_est, temp; if (j == 2) lp++; if (u_p[0] == 0 && u_p[1] < v[1]) continue; temp = ((unsigned long)u_p[0] << 16) + u_p[1]; if (u_p[0] >= v[1]) { q_est = 0x0000FFFFL; } else { q_est = temp / v[1]; } temp -= q_est * v[1]; while (temp < 0x10000 && v[2]*q_est > ((temp<<16)+u_p[2])) { q_est--; temp += v[1]; } /* Now, according to Knuth, we have an estimate of the quotient, that is either correct or one too big, but almost always correct. */ if (q_est != 0) { int i; unsigned long k = 0; int borrow = 0; for (i = maxv; i > 0; i--) { unsigned long tmp = q_est * v[i] + k + borrow; unsigned short md = tmp; borrow = (md > u_p[i]); u_p[i] -= md; k = tmp >> 16; } k += borrow; borrow = u_p[0] < k; u_p[0] -= k; if (borrow) { /* So, this does not happen often; the estimate was one too big; correct this */ *lp |= (j & 1) ? (q_est - 1) : ((q_est-1)<<16); borrow = 0; for (i = maxv; i > 0; i--) { unsigned long tmp = v[i]+(unsigned long)u_p[i]+borrow; u_p[i] = tmp; borrow = tmp >> 16; } u_p[0] += borrow; } else *lp |= (j & 1) ? q_est : (q_est<<16); } } #ifdef EXCEPTION_INEXACT u_p = &u[0]; for (j = 7; j >= 0; j--) { if (*u_p++) { error = 1; break; } } #endif #endif #ifdef EXCEPTION_INEXACT if (error) { /* * report here exception 8.5 - Inexact * from Draft 8.0 of IEEE P754: * In the absence of an invalid operation exception, * if the rounded result of an operation is not exact or if * it overflows without a trap, then the inexact exception * shall be assigned. The rounded or overflowed result * shall be delivered to the destination. */ INEXACT(); #endif e1->mantissa = result; nrm_ext(e1); if (e1->exp < EXT_MIN) { /* * Exception 8.4 - Underflow */ trap(EFUNFL); /* underflow */ e1->exp = EXT_MIN; e1->m1 = e1->m2 = 0L; return; } if (e1->exp >= EXT_MAX) { /* * Exception 8.3 - Overflow */ trap(EFOVFL); /* overflow */ e1->exp = EXT_MAX; e1->m1 = e1->m2 = 0L; return; } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: dvf4.c,v 1.5 93/01/05 12:04:53 ceriel Exp $ */ /* DIVIDE TWO SINGLES - SINGLE Precision (dvf 4) */ #include "FP_types.h" void dvf4(s2,s1) SINGLE s1,s2; { EXTEND e1,e2; extend(&s1,&e1,sizeof(SINGLE)); extend(&s2,&e2,sizeof(SINGLE)); /* do a divide */ div_ext(&e1,&e2); compact(&e1,&s1,sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: dvf8.c,v 1.5 93/01/05 12:04:59 ceriel Exp $ */ /* DIVIDE TWO FLOATS - DOUBLE Precision (DVF 8) */ #include "FP_types.h" void dvf8(s2,s1) DOUBLE s1,s2; { EXTEND e1,e2; extend(&s1.d[0],&e1,sizeof(DOUBLE)); extend(&s2.d[0],&e2,sizeof(DOUBLE)); /* do a divide */ div_ext(&e1,&e2); compact(&e1,&s1.d[0],sizeof(DOUBLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: extend.c,v 1.11 93/01/05 12:05:05 ceriel Exp $ */ /* CONVERTS FLOATING POINT TO EXTENDED FORMAT Two sizes of FLOATING Point are known: SINGLE and DOUBLE */ /********************************************************/ /* It is not required to normalize in extended format, but it has been chosen to do so. Extended Format is as follows (at exit): ->sign S000 0000 | 0000 0000 ->exp 0EEE EEEE | EEEE EEEE ->m1 LFFF FFFF | FFFF FFFF FFFF FFFF | FFFF FFFF ->m2 FFFF FFFF | FFFF FFFF FFFF F000 | 0000 0000 */ /********************************************************/ #include "FP_bias.h" #include "FP_shift.h" #include "FP_types.h" #include "get_put.h" /********************************************************/ void extend(from,to,size) unsigned long *from; EXTEND *to; int size; { register char *cpt1; unsigned long tmp; int leadbit = 0; cpt1 = (char *) from; #if FL_MSL_AT_LOW_ADDRESS #if FL_MSW_AT_LOW_ADDRESS to->exp = uget2(cpt1); #else to->exp = uget2(cpt1+2); #endif #else #if FL_MSW_AT_LOW_ADDRESS to->exp = uget2(cpt1+(size == sizeof(DOUBLE) ? 4 : 0)); #else to->exp = uget2(cpt1+(size == sizeof(DOUBLE) ? 6 : 2)); #endif #endif to->sign = (to->exp & 0x8000); /* set sign bit */ to->exp ^= to->sign; if (size == sizeof(DOUBLE)) to->exp >>= DBL_EXPSHIFT; else to->exp >>= SGL_EXPSHIFT; if (to->exp > 0) leadbit++; /* will set Lead bit later */ else to->exp++; if (size == sizeof(DOUBLE)) { #if FL_MSL_AT_LOW_ADDRESS to->m1 = get4(cpt1); cpt1 += 4; tmp = get4(cpt1); #else tmp = get4(cpt1); cpt1 += 4; to->m1 = get4(cpt1); #endif if (to->exp == 1 && to->m1 == 0 && tmp == 0) { to->exp = 0; to->sign = 0; to->m1 = 0; to->m2 = 0; return; } to->m1 <<= DBL_M1LEFT; /* shift */ to->exp -= DBL_BIAS; /* remove bias */ to->m1 |= (tmp>>DBL_RPACK); /* plus 10 == 32 */ to->m2 = (tmp<m1 = get4(cpt1); to->m1 <<= SGL_M1LEFT; /* shift */ if (to->exp == 1 && to->m1 == 0) { to->exp = 0; to->sign = 0; to->m1 = 0; to->m2 = 0; return; } to->exp -= SGL_BIAS; /* remove bias */ to->m2 = 0L; } to->m1 |= NORMBIT; /* set bit L */ if (leadbit == 0) { /* set or clear Leading Bit */ to->m1 &= ~NORMBIT; /* clear bit L */ nrm_ext(to); /* and normalize */ } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: fef4.c,v 1.7 93/01/05 12:05:12 ceriel Exp $ */ /* SEPERATE INTO EXPONENT AND FRACTION (FEF 4) */ #include "FP_types.h" void fef4(r,s1) SINGLE s1; struct fef4_returns *r; { EXTEND buf; register struct fef4_returns *p = r; /* make copy; r might refer to itself (see table) */ extend(&s1,&buf,sizeof(SINGLE)); if (buf.exp == 0 && buf.m1 == 0 && buf.m2 == 0) { p->e = 0; } else { p->e = buf.exp+1; buf.exp = -1; } compact(&buf,&p->f,sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: fef8.c,v 1.7 93/01/05 12:05:18 ceriel Exp $ */ /* SEPERATE DOUBLE INTO EXPONENT AND FRACTION (FEF 8) */ #include "FP_types.h" void fef8(r, s1) DOUBLE s1; struct fef8_returns *r; { EXTEND buf; register struct fef8_returns *p = r; /* make copy, r might refer to itself (see table) */ extend(&s1.d[0],&buf,sizeof(DOUBLE)); if (buf.exp == 0 && buf.m1 == 0 && buf.m2 == 0) { p->e = 0; } else { p->e = buf.exp + 1; buf.exp = -1; } compact(&buf,&p->f.d[0],sizeof(DOUBLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: fif4.c,v 1.7 93/01/05 12:05:24 ceriel Exp $ */ /* MULTIPLY AND DISMEMBER PARTS (FIF 4) */ #include "FP_types.h" #include "FP_shift.h" void fif4(p,x,y) SINGLE x,y; struct fif4_returns *p; { EXTEND e1,e2; extend(&y,&e1,sizeof(SINGLE)); extend(&x,&e2,sizeof(SINGLE)); /* do a multiply */ mul_ext(&e1,&e2); e2 = e1; compact(&e2,&y,sizeof(SINGLE)); if (e1.exp < 0) { p->ipart = 0; p->fpart = y; return; } if (e1.exp > 30 - SGL_M1LEFT) { p->ipart = y; p->fpart = 0; return; } b64_sft(&e1.mantissa, 63 - e1.exp); b64_sft(&e1.mantissa, e1.exp - 63); /* "loose" low order bits */ compact(&e1,&(p->ipart),sizeof(SINGLE)); extend(&(p->ipart), &e2, sizeof(SINGLE)); extend(&y, &e1, sizeof(SINGLE)); sub_ext(&e1, &e2); compact(&e1, &(p->fpart), sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: fif8.c,v 1.7 93/01/05 12:05:30 ceriel Exp $ */ /* MULTIPLY AND DISMEMBER PARTS (FIF 8) */ #include "FP_types.h" #include "FP_shift.h" void fif8(p,x,y) DOUBLE x,y; struct fif8_returns *p; { EXTEND e1,e2; extend(&y.d[0],&e1,sizeof(DOUBLE)); extend(&x.d[0],&e2,sizeof(DOUBLE)); /* do a multiply */ mul_ext(&e1,&e2); e2 = e1; compact(&e2, &y.d[0], sizeof(DOUBLE)); if (e1.exp < 0) { p->ipart.d[0] = 0; p->ipart.d[1] = 0; p->fpart = y; return; } if (e1.exp > 62 - DBL_M1LEFT) { p->ipart = y; p->fpart.d[0] = 0; p->fpart.d[1] = 0; return; } b64_sft(&e1.mantissa, 63 - e1.exp); b64_sft(&e1.mantissa, e1.exp - 63); /* "loose" low order bits */ compact(&e1, &(p->ipart.d[0]), sizeof(DOUBLE)); extend(&(p->ipart.d[0]), &e2, sizeof(DOUBLE)); extend(&y.d[0], &e1, sizeof(DOUBLE)); sub_ext(&e1, &e2); compact(&e1, &(p->fpart.d[0]), sizeof(DOUBLE)); } # .sect .text; .sect .rom; .sect .data; .sect .bss .define __fptrp .sect .text __fptrp: #if __i386 push ebp mov ebp, esp mov eax, 8(bp) call .Xtrp leave ret #else /* i86 */ push bp mov bp, sp mov ax, 4(bp) call .Xtrp jmp .cret #endif /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: get_put.h,v 1.3 89/10/25 17:15:01 ceriel Exp $ */ #include #if CHAR_UNSIGNED #define Xchar(ch) (ch) #else #define Xchar(ch) ((ch) & 0377) #endif #define BYTES_REVERSED (MSB_AT_LOW_ADDRESS != FL_MSB_AT_LOW_ADDRESS) #define WORDS_REVERSED (MSW_AT_LOW_ADDRESS != FL_MSW_AT_LOW_ADDRESS) #define LONGS_REVERSED (FL_MSL_AT_LOW_ADDRESS) #if BYTES_REVERSED #define uget2(c) (Xchar((c)[1]) | ((unsigned) Xchar((c)[0]) << 8)) #define Xput2(i, c) (((c)[1] = (i)), ((c)[0] = (i) >> 8)) #define put2(i, c) { register int j = (i); Xput2(j, c); } #else #define uget2(c) (* ((unsigned short *) (c))) #define Xput2(i, c) (* ((short *) (c)) = (i)) #define put2(i, c) Xput2(i, c) #endif #define get2(c) ((short) uget2(c)) #if WORDS_REVERSED || BYTES_REVERSED #define get4(c) (uget2((c)+2) | ((long) uget2(c) << 16)) #define put4(l, c) { register long x=(l); \ Xput2((int)x,(c)+2); \ Xput2((int)(x>>16),(c)); \ } #else #define get4(c) (* ((long *) (c))) #define put4(l, c) (* ((long *) (c)) = (l)) #endif /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mlf4.c,v 1.4 93/01/05 12:05:37 ceriel Exp $ */ /* * Multiply Single Precesion Float (MLF 4) */ #include "FP_types.h" void mlf4(s2,s1) SINGLE s1,s2; { EXTEND e1,e2; extend(&s1,&e1,sizeof(SINGLE)); extend(&s2,&e2,sizeof(SINGLE)); /* do a multiply */ mul_ext(&e1,&e2); compact(&e1,&s1,sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mlf8.c,v 1.4 93/01/05 12:05:44 ceriel Exp $ */ /* * Multiply Double Precision Float (MLF 8) */ #include "FP_types.h" void mlf8(s2,s1) DOUBLE s1,s2; { EXTEND e1,e2; extend(&s1.d[0],&e1,sizeof(DOUBLE)); extend(&s2.d[0],&e2,sizeof(DOUBLE)); /* do a multiply */ mul_ext(&e1,&e2); compact(&e1,&s1.d[0],sizeof(DOUBLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: mul_ext.c,v 1.6 93/01/05 12:05:51 ceriel Exp $ */ /* ROUTINE TO MULTIPLY TWO EXTENDED FORMAT NUMBERS */ # include "FP_bias.h" # include "FP_trap.h" # include "FP_types.h" # include "FP_shift.h" void mul_ext(e1,e2) EXTEND *e1,*e2; { register int i,j; /* loop control */ unsigned short mp[4]; /* multiplier */ unsigned short mc[4]; /* multipcand */ unsigned short result[8]; /* result */ register unsigned short *pres; /* first save the sign (XOR) */ e1->sign ^= e2->sign; /* compute new exponent */ e1->exp += e2->exp + 1; /* 128 bit multiply of mantissas */ /* assign unknown long formats */ /* to known unsigned word formats */ mp[0] = e1->m1 >> 16; mp[1] = (unsigned short) e1->m1; mp[2] = e1->m2 >> 16; mp[3] = (unsigned short) e1->m2; mc[0] = e2->m1 >> 16; mc[1] = (unsigned short) e2->m1; mc[2] = e2->m2 >> 16; mc[3] = (unsigned short) e2->m2; for (i = 8; i--;) { result[i] = 0; } /* * fill registers with their components */ for(i=4, pres = &result[4];i--;pres--) if (mp[i]) { unsigned short k = 0; unsigned long mpi = mp[i]; for(j=4;j--;) { unsigned long tmp = (unsigned long)pres[j] + k; if (mc[j]) tmp += mpi * mc[j]; pres[j] = tmp; k = tmp >> 16; } pres[-1] = k; } if (! (result[0] & 0x8000)) { e1->exp--; for (i = 0; i <= 3; i++) { result[i] <<= 1; if (result[i+1]&0x8000) result[i] |= 1; } result[4] <<= 1; } /* * combine the registers to a total */ e1->m1 = ((unsigned long)(result[0]) << 16) + result[1]; e1->m2 = ((unsigned long)(result[2]) << 16) + result[3]; if (result[4] & 0x8000) { if (++e1->m2 == 0) if (++e1->m1 == 0) { e1->m1 = NORMBIT; e1->exp++; } } /* check for overflow */ if (e1->exp >= EXT_MAX) { trap(EFOVFL); /* if caught */ /* return signed infinity */ e1->exp = EXT_MAX; infinity: e1->m1 = e1->m2 =0L; return; } /* check for underflow */ if (e1->exp < EXT_MIN) { trap(EFUNFL); e1->exp = EXT_MIN; goto infinity; } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: ngf4.c,v 1.7 93/01/05 12:05:57 ceriel Exp $ */ /* NEGATE A FLOATING POINT (NGF 4) */ /********************************************************/ #include "FP_types.h" #include "get_put.h" #define OFF ((FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1)) void ngf4(f) SINGLE f; { unsigned char *p; if (f != (SINGLE) 0) { p = (unsigned char *) &f + OFF; *p ^= 0x80; } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: ngf8.c,v 1.8 93/01/05 12:06:05 ceriel Exp $ */ /* NEGATE A FLOATING POINT (NGF 8) */ /********************************************************/ #include "FP_types.h" #include "get_put.h" #define OFF ((FL_MSL_AT_LOW_ADDRESS ? 0 : 4) + (FL_MSW_AT_LOW_ADDRESS ? 0 : 2) + (FL_MSB_AT_LOW_ADDRESS ? 0 : 1)) void ngf8(f) DOUBLE f; { unsigned char *p; if (f.d[0] != 0 || f.d[1] != 0) { p = (unsigned char *) &f + OFF; *p ^= 0x80; } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: nrm_ext.c,v 1.5 93/01/05 12:06:11 ceriel Exp $ */ /********************************************************/ /* NORMALIZE an EXTENDED FORMAT NUMBER */ /********************************************************/ #include "FP_shift.h" #include "FP_types.h" void nrm_ext(e1) EXTEND *e1; { /* we assume that the mantissa != 0 */ /* if it is then just return */ /* to let it be a problem elsewhere */ /* THAT IS, The exponent is not set to */ /* zero. If we don't test here an */ /* infinite loop is generated when */ /* mantissa is zero */ if ((e1->m1 | e1->m2) == 0L) return; /* if top word is zero mov low word */ /* to top word, adjust exponent value */ if (e1->m1 == 0L) { e1->m1 = e1->m2; e1->m2 = 0L; e1->exp -= 32; } if ((e1->m1 & NORMBIT) == 0) { unsigned long l = ((unsigned long)NORMBIT >> 1); int cnt = -1; while (! (l & e1->m1)) { l >>= 1; cnt--; } e1->exp += cnt; b64_sft(&(e1->mantissa), cnt); } } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: sbf4.c,v 1.8 93/01/05 12:06:16 ceriel Exp $ */ /* SUBTRACT TWO FLOATS - SINGLE Precision (SBF 4) */ #include "FP_types.h" void sbf4(s2,s1) SINGLE s1,s2; { EXTEND e1,e2; if (s2 == (SINGLE) 0) { return; } extend(&s1,&e1,sizeof(SINGLE)); extend(&s2,&e2,sizeof(SINGLE)); sub_ext(&e1,&e2); compact(&e1,&s1,sizeof(SINGLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: sbf8.c,v 1.8 93/01/05 12:06:22 ceriel Exp $ */ /* SUBTRACT TWO FLOATS - DOUBLE Precision (SBF 8) */ #include "FP_types.h" void sbf8(s2,s1) DOUBLE s1,s2; { EXTEND e1, e2; if (s2.d[0] == 0 && s2.d[1] == 0) { return; } extend(&s1.d[0],&e1,sizeof(DOUBLE)); extend(&s2.d[0],&e2,sizeof(DOUBLE)); sub_ext(&e1,&e2); compact(&e1,&s1.d[0],sizeof(DOUBLE)); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: sft_ext.c,v 1.5 93/01/05 12:06:28 ceriel Exp $ */ /* SHIFT TWO EXTENDED NUMBERS INTO PROPER ALIGNMENT FOR ADDITION (exponents are equal) Numbers should not be zero on entry. */ #include "FP_types.h" void sft_ext(e1,e2) EXTEND *e1,*e2; { register EXTEND *s; register int diff; diff = e1->exp - e2->exp; if (!diff) return; /* exponents are equal */ if (diff < 0) { /* e2 is larger */ /* shift e1 */ diff = -diff; s = e1; } else /* e1 is larger */ /* shift e2 */ s = e2; s->exp += diff; b64_sft(&(s->mantissa), diff); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: shifter.c,v 1.6 93/01/05 12:06:34 ceriel Exp $ */ # include "FP_types.h" void b64_sft(e1,n) B64 *e1; int n; { if (n > 0) { if (n > 63) { e1->l_32 = 0; e1->h_32 = 0; return; } if (n >= 32) { e1->l_32 = e1->h_32; e1->h_32 = 0; n -= 32; } if (n > 0) { e1->l_32 >>= n; if (e1->h_32 != 0) { e1->l_32 |= (e1->h_32 << (32 - n)); e1->h_32 >>= n; } } return; } n = -n; if (n > 0) { if (n > 63) { e1->l_32 = 0; e1->h_32 = 0; return; } if (n >= 32) { e1->h_32 = e1->l_32; e1->l_32 = 0; n -= 32; } if (n > 0) { e1->h_32 <<= n; if (e1->l_32 != 0) { e1->h_32 |= (e1->l_32 >> (32 - n)); e1->l_32 <<= n; } } } } void b64_lsft(e1) B64 *e1; { /* shift left 1 bit */ e1->h_32 <<= 1; if (e1->l_32 & 0x80000000L) e1->h_32 |= 1; e1->l_32 <<= 1; } void b64_rsft(e1) B64 *e1; { /* shift right 1 bit */ e1->l_32 >>= 1; if (e1->h_32 & 1) e1->l_32 |= 0x80000000L; e1->h_32 >>= 1; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: sub_ext.c,v 1.6 93/01/05 12:06:40 ceriel Exp $ */ /* SUBTRACT 2 EXTENDED FORMAT NUMBERS */ #include "FP_types.h" void sub_ext(e1,e2) EXTEND *e1,*e2; { if ((e2->m1 | e2->m2) == 0L) { return; } if ((e1->m1 | e1->m2) == 0L) { *e1 = *e2; e1->sign = e2->sign ? 0 : 1; return; } sft_ext(e1, e2); if (e1->sign != e2->sign) { /* e1 - e2 = e1 + (-e2) */ if (b64_add(&e1->mantissa,&e2->mantissa)) { /* addition carry */ b64_rsft(&e1->mantissa); /* shift mantissa one bit RIGHT */ e1->m1 |= 0x80000000L; /* set max bit */ e1->exp++; /* increase the exponent */ } } else if (e2->m1 > e1->m1 || (e2->m1 == e1->m1 && e2->m2 > e1->m2)) { /* abs(e2) > abs(e1) */ if (e1->m2 > e2->m2) { e2->m1 -= 1; /* carry in */ } e2->m1 -= e1->m1; e2->m2 -= e1->m2; *e1 = *e2; e1->sign = e2->sign ? 0 : 1; } else { if (e2->m2 > e1->m2) e1->m1 -= 1; /* carry in */ e1->m1 -= e2->m1; e1->m2 -= e2->m2; } nrm_ext(e1); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: zrf4.c,v 1.5 93/01/05 12:06:46 ceriel Exp $ */ /* return a zero float (ZRF 4) */ #include "FP_types.h" void zrf4(l) SINGLE *l; { *l = 0L; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: zrf8.c,v 1.4 93/01/05 12:06:52 ceriel Exp $ */ /* return a zero double (ZRF 8) */ #include "FP_types.h" void zrf8(z) DOUBLE *z; { z->d[0] = 0L; z->d[1] = 0L; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: zrf_ext.c,v 1.5 93/01/05 12:06:58 ceriel Exp $ */ /* ZERO and return EXTEND FORMAT FLOAT */ #include "FP_types.h" void zrf_ext(e) EXTEND *e; { e->m1 = 0; e->m2 = 0; e->exp = 0; e->sign = 0; } .;..Makefilefltpr.cfphook.cstrtod.c# Makefile for lib/i86/fphook. # The ACK ANSI C compiler has an nice trick to reduce the size of programs # that do not use floating point. If a program uses floating point then the # compiler generates an external reference to the label '_fp_hook'. This makes # the loader bring in the floating point printing and conversion routines # '_f_print' and 'strtod' from the library libd.a. Otherwise two dummy # routines are found in libc.a. (The printf and scanf need floating point # for the %f formats, whether you use them or not.) CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBD = ../libd.a LIBC = ../libc.a all: $(LIBD) $(LIBC) $(LIBD): fphook.c $(CC1) fphook.c aal cr $@ fphook.o rm fphook.o $(LIBC): $(LIBC)(fltpr.o) $(LIBC)(strtod.o) aal cr $@ *.o rm *.o $(LIBC)(fltpr.o): $(CC1) fltpr.c $(LIBC)(strtod.o): $(CC1) strtod.c #include #include #include "../stdio/loc_incl.h" int _fp_hook = 1; char * _f_print(va_list *ap, int flags, char *s, char c, int precision) { fprintf(stderr,"cannot print floating point\n"); exit(EXIT_FAILURE); } /* * fltpr.c - print floating point numbers */ /* $Header: fltpr.c,v 1.4 90/02/27 16:47:40 eck Exp $ */ #ifndef NOFLOAT #include #include #include "../stdio/loc_incl.h" int _fp_hook = 1; static char * _pfloat(long double r, register char *s, int n, int flags) { register char *s1; int sign, dp; register int i; s1 = _fcvt(r, n, &dp, &sign); if (sign) *s++ = '-'; else if (flags & FL_SIGN) *s++ = '+'; else if (flags & FL_SPACE) *s++ = ' '; if (dp<=0) *s++ = '0'; for (i=dp; i>0; i--) if (*s1) *s++ = *s1++; else *s++ = '0'; if (((i=n) > 0) || (flags & FL_ALT)) *s++ = '.'; while (++dp <= 0) { if (--i<0) break; *s++ = '0'; } while (--i >= 0) if (*s1) *s++ = *s1++; else *s++ = '0'; return s; } static char * _pscien(long double r, register char *s, int n, int flags) { int sign, dp; register char *s1; s1 = _ecvt(r, n + 1, &dp, &sign); if (sign) *s++ = '-'; else if (flags & FL_SIGN) *s++ = '+'; else if (flags & FL_SPACE) *s++ = ' '; *s++ = *s1++; if ((n > 0) || (flags & FL_ALT)) *s++ = '.'; while (--n >= 0) if (*s1) *s++ = *s1++; else *s++ = '0'; *s++ = 'e'; if ( r != 0 ) --dp ; if ( dp<0 ) { *s++ = '-' ; dp= -dp ; } else { *s++ = '+' ; } if (dp >= 100) { *s++ = '0' + (dp / 100); dp %= 100; } *s++ = '0' + (dp/10); *s++ = '0' + (dp%10); return s; } #define NDIGINEXP(exp) (((exp) >= 100 || (exp) <= -100) ? 3 : 2) #define LOW_EXP -4 #define USE_EXP(exp, ndigits) (((exp) < LOW_EXP + 1) || (exp >= ndigits + 1)) static char * _gcvt(long double value, int ndigit, char *s, int flags) { int sign, dp; register char *s1, *s2; register int i; register int nndigit = ndigit; s1 = _ecvt(value, ndigit, &dp, &sign); s2 = s; if (sign) *s2++ = '-'; else if (flags & FL_SIGN) *s2++ = '+'; else if (flags & FL_SPACE) *s2++ = ' '; if (!(flags & FL_ALT)) for (i = nndigit - 1; i > 0 && s1[i] == '0'; i--) nndigit--; if (USE_EXP(dp,ndigit)) { /* Use E format */ dp--; *s2++ = *s1++; if ((nndigit > 1) || (flags & FL_ALT)) *s2++ = '.'; while (--nndigit > 0) *s2++ = *s1++; *s2++ = 'e'; if (dp < 0) { *s2++ = '-'; dp = -dp; } else *s2++ = '+'; s2 += NDIGINEXP(dp); *s2 = 0; for (i = NDIGINEXP(dp); i > 0; i--) { *--s2 = dp % 10 + '0'; dp /= 10; } return s; } /* Use f format */ if (dp <= 0) { if (*s1 != '0') { /* otherwise the whole number is 0 */ *s2++ = '0'; *s2++ = '.'; } while (dp < 0) { dp++; *s2++ = '0'; } } for (i = 1; i <= nndigit; i++) { *s2++ = *s1++; if (i == dp) *s2++ = '.'; } if (i <= dp) { while (i++ <= dp) *s2++ = '0'; *s2++ = '.'; } if ((s2[-1]=='.') && !(flags & FL_ALT)) s2--; *s2 = '\0'; return s; } char * _f_print(va_list *ap, int flags, char *s, char c, int precision) { register char *old_s = s; long double ld_val; if (flags & FL_LONGDOUBLE) ld_val = va_arg(*ap, long double); else ld_val = (long double) va_arg(*ap, double); switch(c) { case 'f': s = _pfloat(ld_val, s, precision, flags); break; case 'e': case 'E': s = _pscien(ld_val, s, precision , flags); break; case 'g': case 'G': s = _gcvt(ld_val, precision, s, flags); s += strlen(s); break; } if ( c == 'E' || c == 'G') { while (*old_s && *old_s != 'e') old_s++; if (*old_s == 'e') *old_s = 'E'; } return s; } #endif /* NOFLOAT */ /* $Header: strtod.c,v 1.3 90/09/07 11:00:24 eck Exp $ */ #include #include "../ansi/ext_fmt.h" void _str_ext_cvt(const char *s, char **ss, struct EXTEND *e); double _ext_dbl_cvt(struct EXTEND *e); double strtod(const char *p, char **pp) { struct EXTEND e; _str_ext_cvt(p, pp, &e); return _ext_dbl_cvt(&e); } #include #include double strtod(const char *p, char **pp) { fprintf(stderr,"cannot print floating point\n"); exit(EXIT_FAILURE); } .;..em_abs.hm2_traps.hpc_err.hpc_file.hpc_math.h/* $Header: em_abs.h,v 1.3 87/03/10 08:58:45 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define LINO_AD 0 #define FILN_AD 4 #define LINO (*(int *)(_hol0()+LINO_AD)) #define FILN (*(char **)(_hol0()+FILN_AD)) #define EARRAY 0 #define ERANGE 1 #define ESET 2 #define EIOVFL 3 #define EFOVFL 4 #define EFUNFL 5 #define EIDIVZ 6 #define EFDIVZ 7 #define EIUND 8 #define EFUND 9 #define ECONV 10 #define ESTACK 16 #define EHEAP 17 #define EILLINS 18 #define EODDZ 19 #define ECASE 20 #define EMEMFLT 21 #define EBADPTR 22 #define EBADPC 23 #define EBADLAE 24 #define EBADMON 25 #define EBADLIN 26 #define EBADGTO 27 /* $Header: m2_traps.h,v 2.6 90/10/25 11:18:11 ceriel Exp $ */ /* * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Modula-2 runtime errors */ #define M2_TOOLARGE 64 /* stack of process too large */ #define M2_TOOMANY 65 /* too many nested traps & handlers */ #define M2_NORESULT 66 /* no RETURN from procedure function */ #define M2_UOVFL 67 /* cardinal overflow */ #define M2_FORCH 68 /* FOR-loop control variable changed */ #define M2_UUVFL 69 /* cardinal underflow */ #define M2_INTERNAL 70 /* internal error, should not happen */ #define M2_UNIXSIG 71 /* unix signal */ /* $Header: pc_err.h,v 1.4 89/06/19 09:46:22 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define EARGC 64 #define EEXP 65 #define ELOG 66 #define ESQT 67 #define EASS 68 #define EPACK 69 #define EUNPACK 70 #define EMOD 71 #define EBADF 72 #define EFREE 73 #define EFUNASS 74 #define EWIDTH 75 #define EWRITEF 96 #define EREADF 97 #define EEOF 98 #define EFTRUNC 99 #define ERESET 100 #define EREWR 101 #define ECLOSE 102 #define EREAD 103 #define EWRITE 104 #define EDIGIT 105 #define EASCII 106 /* $Header: pc_file.h,v 1.4 89/06/19 09:46:29 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define WRBIT 0100000 #define TXTBIT 040000 #define EOFBIT 020000 #define ELNBIT 010000 #define WINDOW 04000 #define MAGIC 0252 #define PC_BUFLEN 1024 struct file { char *ptr; unsigned flags; char *fname; int ufd; int size; int count; int buflen; char bufadr[PC_BUFLEN]; }; /* * localmath.h - This header is used by the mathematical library. */ /* $Header: pc_math.h,v 1.1 90/11/06 13:04:01 ceriel Exp $ */ /* some constants (Hart & Cheney) */ #define M_PI 3.14159265358979323846264338327950288 #define M_2PI 6.28318530717958647692528676655900576 #define M_3PI_4 2.35619449019234492884698253745962716 #define M_PI_2 1.57079632679489661923132169163975144 #define M_3PI_8 1.17809724509617246442349126872981358 #define M_PI_4 0.78539816339744830961566084581987572 #define M_PI_8 0.39269908169872415480783042290993786 #define M_1_PI 0.31830988618379067153776752674502872 #define M_2_PI 0.63661977236758134307553505349005744 #define M_4_PI 1.27323954473516268615107010698011488 #define M_E 2.71828182845904523536028747135266250 #define M_LOG2E 1.44269504088896340735992468100189213 #define M_LOG10E 0.43429448190325182765112891891660508 #define M_LN2 0.69314718055994530941723212145817657 #define M_LN10 2.30258509299404568401799145468436421 #define M_SQRT2 1.41421356237309504880168872420969808 #define M_1_SQRT2 0.70710678118654752440084436210484904 #define M_EULER 0.57721566490153286060651209008240243 /* macros for constructing polynomials */ #define POLYNOM1(x, a) ((a)[1]*(x)+(a)[0]) #define POLYNOM2(x, a) (POLYNOM1((x),(a)+1)*(x)+(a)[0]) #define POLYNOM3(x, a) (POLYNOM2((x),(a)+1)*(x)+(a)[0]) #define POLYNOM4(x, a) (POLYNOM3((x),(a)+1)*(x)+(a)[0]) #define POLYNOM5(x, a) (POLYNOM4((x),(a)+1)*(x)+(a)[0]) #define POLYNOM6(x, a) (POLYNOM5((x),(a)+1)*(x)+(a)[0]) #define POLYNOM7(x, a) (POLYNOM6((x),(a)+1)*(x)+(a)[0]) #define POLYNOM8(x, a) (POLYNOM7((x),(a)+1)*(x)+(a)[0]) #define POLYNOM9(x, a) (POLYNOM8((x),(a)+1)*(x)+(a)[0]) #define POLYNOM10(x, a) (POLYNOM9((x),(a)+1)*(x)+(a)[0]) #define POLYNOM11(x, a) (POLYNOM10((x),(a)+1)*(x)+(a)[0]) #define POLYNOM12(x, a) (POLYNOM11((x),(a)+1)*(x)+(a)[0]) #define POLYNOM13(x, a) (POLYNOM12((x),(a)+1)*(x)+(a)[0]) #define M_LN_MAX_D (M_LN2 * DBL_MAX_EXP) #define M_LN_MIN_D (M_LN2 * (DBL_MIN_EXP - 1)) .;..MakefileemMheadQmiscXrts`string|int64# Makefile for lib/i386. MAKE = exec make -$(MAKEFLAGS) install: cd em && $(MAKE) cd head && $(MAKE) cd int64 && $(MAKE) cd misc && $(MAKE) cd rts && $(MAKE) cd string && $(MAKE) ...Makefilebyte_order.hem_adf4.s em_adf8.s em_adi.s em_and.s em_blm.s em_cff4.sem_cff8.sem_cfi.sem_cfu.sem_cif4.sem_cif8.sem_cii.sem_cmf4.sem_cmf8.sem_cms.sem_com.sem_csa4.sem_csb4.sem_cuf4.sem_cuf8.sem_cuu.sem_dup.sem_dvf4.sem_dvf8.s em_dvi.s!em_dvu.s"em_error.s#em_exg.s$em_fat.s%em_fef4.s&em_fef8.s'em_fif4.s(em_fif8.s)em_fp8087.s*em_gto.s+em_iaar.s,em_ilar.s-em_inn.s.em_ior.s/em_isar.s0em_lar4.s1em_loi.s2em_mlf4.s3em_mlf8.s4em_mli.s5em_mon.s6em_ngf4.s7em_ngf8.s8em_ngi.s9em_nop.s:em_print.s;em_rck.s<em_rmi.s=em_rmu.s>em_rol.s?em_ror.s@em_sar4.sAem_sbf4.sBem_sbf8.sCem_sbi.s# Makefile for lib/i386/em. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ack CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libe.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(em_adf4.o) \ $(LIBRARY)(em_adf8.o) \ $(LIBRARY)(em_adi.o) \ $(LIBRARY)(em_and.o) \ $(LIBRARY)(em_blm.o) \ $(LIBRARY)(em_cff4.o) \ $(LIBRARY)(em_cff8.o) \ $(LIBRARY)(em_cfi.o) \ $(LIBRARY)(em_cfu.o) \ $(LIBRARY)(em_cif4.o) \ $(LIBRARY)(em_cif8.o) \ $(LIBRARY)(em_cii.o) \ $(LIBRARY)(em_cmf4.o) \ $(LIBRARY)(em_cmf8.o) \ $(LIBRARY)(em_cms.o) \ $(LIBRARY)(em_com.o) \ $(LIBRARY)(em_csa4.o) \ $(LIBRARY)(em_csb4.o) \ $(LIBRARY)(em_cuf4.o) \ $(LIBRARY)(em_cuf8.o) \ $(LIBRARY)(em_cuu.o) \ $(LIBRARY)(em_dup.o) \ $(LIBRARY)(em_dvf4.o) \ $(LIBRARY)(em_dvf8.o) \ $(LIBRARY)(em_dvi.o) \ $(LIBRARY)(em_dvu.o) \ $(LIBRARY)(em_error.o) \ $(LIBRARY)(em_exg.o) \ $(LIBRARY)(em_fat.o) \ $(LIBRARY)(em_fef4.o) \ $(LIBRARY)(em_fef8.o) \ $(LIBRARY)(em_fif4.o) \ $(LIBRARY)(em_fif8.o) \ $(LIBRARY)(em_fp8087.o) \ $(LIBRARY)(em_gto.o) \ $(LIBRARY)(em_hol0.o) \ $(LIBRARY)(em_iaar.o) \ $(LIBRARY)(em_ilar.o) \ $(LIBRARY)(em_inn.o) \ $(LIBRARY)(em_ior.o) \ $(LIBRARY)(em_isar.o) \ $(LIBRARY)(em_lar4.o) \ $(LIBRARY)(em_loi.o) \ $(LIBRARY)(em_mlf4.o) \ $(LIBRARY)(em_mlf8.o) \ $(LIBRARY)(em_mli.o) \ $(LIBRARY)(em_mon.o) \ $(LIBRARY)(em_ngf4.o) \ $(LIBRARY)(em_ngf8.o) \ $(LIBRARY)(em_ngi.o) \ $(LIBRARY)(em_nop.o) \ $(LIBRARY)(em_print.o) \ $(LIBRARY)(em_rck.o) \ $(LIBRARY)(em_rmi.o) \ $(LIBRARY)(em_rmu.o) \ $(LIBRARY)(em_rol.o) \ $(LIBRARY)(em_ror.o) \ $(LIBRARY)(em_sar4.o) \ $(LIBRARY)(em_sbf4.o) \ $(LIBRARY)(em_sbf8.o) \ $(LIBRARY)(em_sbi.o) \ $(LIBRARY)(em_set.o) \ $(LIBRARY)(em_sli.o) \ $(LIBRARY)(em_sri.o) \ $(LIBRARY)(em_sti.o) \ $(LIBRARY)(em_stop.o) \ $(LIBRARY)(em_trp.o) \ $(LIBRARY)(em_unknown.o) \ $(LIBRARY)(em_xor.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(em_adf4.o): em_adf4.s $(CC1) em_adf4.s $(LIBRARY)(em_adf8.o): em_adf8.s $(CC1) em_adf8.s $(LIBRARY)(em_adi.o): em_adi.s $(CC1) em_adi.s $(LIBRARY)(em_and.o): em_and.s $(CC1) em_and.s $(LIBRARY)(em_blm.o): em_blm.s $(CC1) em_blm.s $(LIBRARY)(em_cff4.o): em_cff4.s $(CC1) em_cff4.s $(LIBRARY)(em_cff8.o): em_cff8.s $(CC1) em_cff8.s $(LIBRARY)(em_cfi.o): em_cfi.s $(CC1) em_cfi.s $(LIBRARY)(em_cfu.o): em_cfu.s $(CC1) em_cfu.s $(LIBRARY)(em_cif4.o): em_cif4.s $(CC1) em_cif4.s $(LIBRARY)(em_cif8.o): em_cif8.s $(CC1) em_cif8.s $(LIBRARY)(em_cii.o): em_cii.s $(CC1) em_cii.s $(LIBRARY)(em_cmf4.o): em_cmf4.s $(CC1) em_cmf4.s $(LIBRARY)(em_cmf8.o): em_cmf8.s $(CC1) em_cmf8.s $(LIBRARY)(em_cms.o): em_cms.s $(CC1) em_cms.s $(LIBRARY)(em_com.o): em_com.s $(CC1) em_com.s $(LIBRARY)(em_csa4.o): em_csa4.s $(CC1) em_csa4.s $(LIBRARY)(em_csb4.o): em_csb4.s $(CC1) em_csb4.s $(LIBRARY)(em_cuf4.o): em_cuf4.s $(CC1) em_cuf4.s $(LIBRARY)(em_cuf8.o): em_cuf8.s $(CC1) em_cuf8.s $(LIBRARY)(em_cuu.o): em_cuu.s $(CC1) em_cuu.s $(LIBRARY)(em_dup.o): em_dup.s $(CC1) em_dup.s $(LIBRARY)(em_dvf4.o): em_dvf4.s $(CC1) em_dvf4.s $(LIBRARY)(em_dvf8.o): em_dvf8.s $(CC1) em_dvf8.s $(LIBRARY)(em_dvi.o): em_dvi.s $(CC1) em_dvi.s $(LIBRARY)(em_dvu.o): em_dvu.s $(CC1) em_dvu.s $(LIBRARY)(em_error.o): em_error.s $(CC1) em_error.s $(LIBRARY)(em_exg.o): em_exg.s $(CC1) em_exg.s $(LIBRARY)(em_fat.o): em_fat.s $(CC1) em_fat.s $(LIBRARY)(em_fef4.o): em_fef4.s $(CC1) em_fef4.s $(LIBRARY)(em_fef8.o): em_fef8.s $(CC1) em_fef8.s $(LIBRARY)(em_fif4.o): em_fif4.s $(CC1) em_fif4.s $(LIBRARY)(em_fif8.o): em_fif8.s $(CC1) em_fif8.s $(LIBRARY)(em_fp8087.o): em_fp8087.s $(CC1) em_fp8087.s $(LIBRARY)(em_gto.o): em_gto.s $(CC1) em_gto.s $(LIBRARY)(em_hol0.o): em_hol0.s $(CC1) em_hol0.s $(LIBRARY)(em_iaar.o): em_iaar.s $(CC1) em_iaar.s $(LIBRARY)(em_ilar.o): em_ilar.s $(CC1) em_ilar.s $(LIBRARY)(em_inn.o): em_inn.s $(CC1) em_inn.s $(LIBRARY)(em_ior.o): em_ior.s $(CC1) em_ior.s $(LIBRARY)(em_isar.o): em_isar.s $(CC1) em_isar.s $(LIBRARY)(em_lar4.o): em_lar4.s $(CC1) em_lar4.s $(LIBRARY)(em_loi.o): em_loi.s $(CC1) em_loi.s $(LIBRARY)(em_mlf4.o): em_mlf4.s $(CC1) em_mlf4.s $(LIBRARY)(em_mlf8.o): em_mlf8.s $(CC1) em_mlf8.s $(LIBRARY)(em_mli.o): em_mli.s $(CC1) em_mli.s $(LIBRARY)(em_mon.o): em_mon.s $(CC1) em_mon.s $(LIBRARY)(em_ngf4.o): em_ngf4.s $(CC1) em_ngf4.s $(LIBRARY)(em_ngf8.o): em_ngf8.s $(CC1) em_ngf8.s $(LIBRARY)(em_ngi.o): em_ngi.s $(CC1) em_ngi.s $(LIBRARY)(em_nop.o): em_nop.s $(CC1) em_nop.s $(LIBRARY)(em_print.o): em_print.s $(CC1) em_print.s $(LIBRARY)(em_rck.o): em_rck.s $(CC1) em_rck.s $(LIBRARY)(em_rmi.o): em_rmi.s $(CC1) em_rmi.s $(LIBRARY)(em_rmu.o): em_rmu.s $(CC1) em_rmu.s $(LIBRARY)(em_rol.o): em_rol.s $(CC1) em_rol.s $(LIBRARY)(em_ror.o): em_ror.s $(CC1) em_ror.s $(LIBRARY)(em_sar4.o): em_sar4.s $(CC1) em_sar4.s $(LIBRARY)(em_sbf4.o): em_sbf4.s $(CC1) em_sbf4.s $(LIBRARY)(em_sbf8.o): em_sbf8.s $(CC1) em_sbf8.s $(LIBRARY)(em_sbi.o): em_sbi.s $(CC1) em_sbi.s $(LIBRARY)(em_set.o): em_set.s $(CC1) em_set.s $(LIBRARY)(em_sli.o): em_sli.s $(CC1) em_sli.s $(LIBRARY)(em_sri.o): em_sri.s $(CC1) em_sri.s $(LIBRARY)(em_sti.o): em_sti.s $(CC1) em_sti.s $(LIBRARY)(em_stop.o): em_stop.s $(CC1) em_stop.s $(LIBRARY)(em_trp.o): em_trp.s $(CC1) em_trp.s $(LIBRARY)(em_unknown.o): em_unknown.s $(CC1) em_unknown.s $(LIBRARY)(em_xor.o): em_xor.s $(CC1) em_xor.s #define CHAR_UNSIGNED 0 #define MSB_AT_LOW_ADDRESS 0 #define MSW_AT_LOW_ADDRESS 0 #define FL_MSB_AT_LOW_ADDRESS 0 #define FL_MSW_AT_LOW_ADDRESS 0 #define FL_MSL_AT_LOW_ADDRESS 0 .sect .text; .sect .rom; .sect .data; .sect .bss .define .adf4 .sect .text .adf4: mov bx,sp flds 4(bx) fadds 8(bx) fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .adf8 .sect .text .adf8: mov bx,sp fldd 4(bx) faddd 12(bx) fstpd 12(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .adi ! #bytes in ecx , top of stack in eax .sect .text .adi: pop ebx ! return address cmp ecx,4 jne 9f pop ecx add eax,ecx jmp ebx 9: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .define .and ! #bytes in ecx ! save edi; it might be a register variable .sect .text .and: pop ebx ! return address mov edx,edi mov edi,esp add edi,ecx sar ecx,2 1: pop eax and eax,(edi) stos loop 1b mov edi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .blm ! ecx: count in words .blm: mov ebx,esp mov eax,esi mov edx,edi mov edi,4(ebx) mov esi,8(ebx) rep movs mov esi,eax mov edi,edx ret 8 .sect .text; .sect .rom; .sect .data; .sect .bss .define .cff4 .sect .text .cff4: mov bx,sp fldd 4(bx) fstcw 4(bx) wait mov dx,4(bx) and 4(bx),0xf3ff ! set to rounding mode wait fldcw 4(bx) fstps 8(bx) mov 4(bx),dx wait fldcw 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cff8 .sect .text .cff8: mov bx,sp flds 4(bx) fstpd 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cfi .sect .text .cfi: mov bx,sp fstcw 4(bx) wait mov dx,4(bx) or 4(bx),0xc00 ! truncating mode wait fldcw 4(bx) cmp 8(bx),4 jne 2f ! loc 4 loc ? cfi flds 12(bx) fistpl 12(bx) 1: mov 4(bx),dx wait fldcw 4(bx) ret 2: ! loc 8 loc ? cfi fldd 12(bx) fistpl 16(bx) jmp 1b .sect .text; .sect .rom; .sect .data; .sect .bss .define .cfu .sect .text .cfu: mov bx,sp fstcw 4(bx) wait mov dx,4(bx) or 4(bx),0xc00 ! truncating mode wait fldcw 4(bx) cmp 8(bx),4 jne 2f ! loc 4 loc ? cfu flds 12(bx) fabs ! ??? fiaddl (bigmin) fistpl 12(bx) wait mov ax,12(bx) sub ax,(bigmin) mov 12(bx),ax 1: mov 4(bx),dx wait fldcw 4(bx) ret 2: ! loc 8 loc ? cfu fldd 12(bx) fabs ! ??? fiaddl (bigmin) fistpl 16(bx) mov ax,16(bx) sub ax,(bigmin) mov 16(bx),ax jmp 1b .sect .text; .sect .rom; .sect .data; .sect .bss .define .cif4 .sect .text .cif4: mov bx,sp fildl 8(bx) fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cif8 .sect .text .cif8: mov bx,sp fildl 8(bx) fstpd 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cii .sect .text .cii: pop ebx ! return address ! pop ecx, dest. size ! pop edx, src. size ! eax is source cmp edx,1 jne 2f movsxb eax,al mov edx,4 jmp 1f 2: cmp edx,2 jne 1f cwde ! convert from 2 to 4 bytes mov edx,4 1: cmp edx,ecx jne 9f cmp edx,4 jne 9f jmp ebx 9: .extern EILLINS .extern .fat mov eax,EILLINS push eax jmp .fat .sect .text; .sect .rom; .sect .data; .sect .bss .define .cmf4 .sect .text .cmf4: mov bx,sp xor cx,cx flds 8(bx) flds 4(bx) fcompp ! compare and pop operands fstsw ax wait sahf je 1f jb 2f dec cx jmp 1f 2: inc cx 1: mov ax,cx ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cmf8 .sect .text .cmf8: mov bx,sp xor cx,cx fldd 12(bx) fldd 4(bx) fcompp ! compare and pop operands fstsw ax wait sahf je 1f jb 2f dec cx jmp 1f 2: inc cx 1: mov ax,cx ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cms ! #bytes in ecx .sect .text .cms: pop ebx ! return address mov edx,esp push esi push edi mov esi,edx add edx,ecx mov edi,edx add edx,ecx sar ecx,2 repe cmps je 1f inc ecx 1: pop edi pop esi mov esp,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define .com ! #bytes in ecx .sect .text .com: mov ebx,esp add ebx,4 sar ecx,2 1: not (ebx) add ebx,4 loop 1b ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .csa4 .sect .text .csa4: ! ebx, descriptor address ! eax, index mov edx,(ebx) ! default sub eax,4(ebx) cmp eax,8(ebx) ja 1f sal eax,2 add ebx,eax mov ebx,12(ebx) test ebx,ebx jnz 2f 1: mov ebx,edx test ebx,ebx jnz 2f .extern ECASE .extern .fat mov eax,ECASE push eax jmp .fat 2: jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define .csb4 .sect .text .csb4: !ebx, descriptor address !eax, index mov edx,(ebx) mov ecx,4(ebx) 1: add ebx,8 dec ecx jl 4f cmp eax,(ebx) jne 1b mov ebx,4(ebx) 2: test ebx,ebx jnz 3f .extern ECASE .extern .fat mov eax,ECASE push eax jmp .fat 3: jmp ebx 4: mov ebx,edx jmp 2b .sect .text; .sect .rom; .sect .data; .sect .bss .define .cuf4 .sect .text .cuf4: mov bx,sp fildl 8(bx) cmp 8(bx),0 jge 1f fisubl (bigmin) fisubl (bigmin) 1: fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .cuf8 .sect .text .cuf8: mov bx,sp fildl 8(bx) cmp 8(bx),0 jge 1f fisubl (bigmin) fisubl (bigmin) 1: fstpd 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .ciu .define .cui .define .cuu .sect .text .ciu: .cui: .cuu: pop ebx ! return address ! pop ecx, dest. size ! pop edx, source size ! eax is source cmp edx,ecx jne 8f jmp ebx 8: .extern EILLINS .extern .fat mov eax,EILLINS push eax jmp .fat .sect .text; .sect .rom; .sect .data; .sect .bss .define .dup ! #bytes in ecx .sect .text .dup: pop ebx ! return address mov eax,esi mov edx,edi mov esi,esp sub esp,ecx mov edi,esp sar ecx,2 rep movs mov esi,eax mov edi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define .dvf4 .sect .text .dvf4: mov bx,sp flds 8(bx) fdivs 4(bx) fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .dvf8 .sect .text .dvf8: mov bx,sp fldd 12(bx) fdivd 4(bx) fstpd 12(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .dvi ! #bytes in eax .sect .text .dvi: pop ebx ! return address cmp eax,4 jne 1f pop eax cwd pop ecx idiv ecx push eax jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .define .dvu ! #bytes in eax .sect .text .dvu: pop ebx ! return address cmp eax,4 jne 1f pop eax xor edx,edx pop ecx div ecx push eax jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .define .error .define .Xtrp ! eax is trap number ! all registers must be saved ! because return is possible ! May only be called with error no's <16 .sect .text .error: mov ecx,eax mov ebx,1 sal ebx,cl .extern .ignmask .extern .trp test ebx,(.ignmask) jne 2f call .trp 2: ret .Xtrp: pusha cmp eax,16 jge 1f call .error popa ret 1: call .trp popa ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .exg ! #bytes in ecx .sect .text .exg: push edi mov edi,esp add edi,8 mov ebx,edi add ebx,ecx sar ecx,2 1: mov eax,(ebx) xchg eax,(edi) mov (ebx),eax add edi,4 add ebx,4 loop 1b 2: pop edi ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .fat .fat: .extern .trp .extern .stop call .trp call .stop ! no return .sect .text; .sect .rom; .sect .data; .sect .bss .define .fef4 .sect .text .fef4: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,8(bx) and ax,0x7f800000 je 1f ! zero exponent shr ax,23 sub ax,126 mov cx,ax ! exponent in cx mov ax,8(bx) and ax,0x807fffff or ax,0x3f000000 ! load -1 exponent mov bx,4(bx) mov 4(bx),ax mov (bx),cx ret 1: ! we get here on zero exp mov ax,8(bx) and ax,0x007fffff jne 1f ! zero result mov bx,4(bx) mov (bx),ax mov 4(bx),ax ret 1: ! otherwise unnormalized number mov cx,8(bx) and cx,0x807fffff mov dx,cx and cx,0x80000000 mov ax,-125 2: test dx,0x800000 jne 1f dec ax shl dx,1 or dx,cx jmp 2b 1: mov bx,4(bx) mov (bx),ax and dx,0x807fffff or dx,0x3f000000 ! load -1 exponent mov 4(bx),dx ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .fef8 .sect .text .fef8: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,12(bx) and ax,0x7ff00000 je 1f ! zero exponent shr ax,20 sub ax,1022 mov cx,ax ! exponent in cx mov ax,12(bx) and ax,0x800fffff or ax,0x3fe00000 ! load -1 exponent mov dx,8(bx) mov bx,4(bx) mov 4(bx),dx mov 8(bx),ax mov (bx),cx ret 1: ! we get here on zero exp mov ax,12(bx) and ax,0xfffff or ax,8(bx) jne 1f ! zero result mov bx,4(bx) mov (bx),ax mov 4(bx),ax mov 8(bx),ax ret 1: ! otherwise unnormalized number mov cx,12(bx) and cx,0x800fffff mov dx,cx and cx,0x80000000 mov ax,-1021 2: test dx,0x100000 jne 1f dec ax shl 8(bx),1 rcl dx,1 or dx,cx jmp 2b 1: and dx,0x800fffff or dx,0x3fe00000 ! load -1 exponent mov cx,8(bx) mov bx,4(bx) mov (bx),ax mov 8(bx),dx mov 4(bx),cx ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .fif4 .sect .text .fif4: mov bx,sp flds 8(bx) fmuls 12(bx) ! multiply fld st ! copy result ftst ! test sign; handle negative separately fstsw ax wait sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) fcom st(1) ! compare with original; if <=, then OK fstsw ax wait sahf jbe 2f fisubs (one) ! else subtract 1 jmp 2f 1: ! here, negative case frndint ! this one rounds (?) fcom st(1) ! compare with original; if >=, then OK fstsw ax wait sahf jae 2f fiadds (one) ! else add 1 2: fsub st(1),st ! subtract integer part mov bx,4(bx) fstps (bx) fstps 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .fif8 .sect .text .fif8: mov bx,sp fldd 8(bx) fmuld 16(bx) ! multiply fld st ! and copy result ftst ! test sign; handle negative separately fstsw ax wait sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) fcom st(1) ! compare with original; if <=, then OK fstsw ax wait sahf jbe 2f fisubs (one) ! else subtract 1 jmp 2f 1: ! here, negative case frndint ! this one rounds (?) fcom st(1) ! compare with original; if >=, then OK fstsw ax wait sahf jae 2f fiadds (one) ! else add 1 2: fsub st(1),st ! subtract integer part mov bx,4(bx) fstpd (bx) fstpd 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define one, bigmin .sect .rom one: .data2 1 two: .data2 2 bigmin: .data4 -2147483648 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .gto .gto: mov ebp,8(ebx) mov esp,4(ebx) jmp (ebx) .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .iaar .iaar: pop ecx pop edx cmp edx,4 .extern .unknown jne .unknown pop ebx ! descriptor address pop eax ! index sub eax,(ebx) mul 8(ebx) pop ebx ! array base add ebx,eax push ecx ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .ilar .ilar: pop ecx pop edx .extern .unknown cmp edx,4 jne .unknown pop ebx ! descriptor address pop eax ! index push ecx .extern .lar4 jmp .lar4 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .inn ! #bytes in ecx ! bit # in eax .inn: xor edx,edx mov ebx,8 div ebx mov ebx,esp add ebx,4 add ebx,eax cmp eax,ecx jae 1f movb al,(ebx) mov ebx,edx testb al,bits(ebx) jz 1f mov eax,1 jmp 2f 1: xor eax,eax 2: pop ebx add esp,ecx ! eax is result jmp ebx .sect .rom bits: .data1 1,2,4,8,16,32,64,128 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .ior ! #bytes in ecx .ior: pop ebx ! return address mov edx,edi mov edi,esp add edi,ecx sar ecx,2 1: pop eax or eax,(edi) stos loop 1b mov edi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .isar .isar: pop ecx pop eax cmp eax,4 .extern .unknown jne .unknown pop ebx ! descriptor address pop eax ! index push ecx .extern .sar4 jmp .sar4 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .lar4 .lar4: ! ebx, descriptor address ! eax, index sub eax,(ebx) mov ecx,8(ebx) imul ecx pop ebx pop edx ! base address add edx,eax sar ecx,1 jnb 1f xor eax,eax movb al,(edx) push eax jmp ebx 1: sar ecx,1 jnb 1f xor eax,eax o16 mov ax,(edx) push eax jmp ebx 1: xchg edx,esi ! saved esi mov eax,ecx sal eax,2 sub esp,eax mov eax,edi ! save edi mov edi,esp rep movs mov edi,eax mov esi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .loi .define .los ! #bytes in ecx ! address in ebx ! save esi/edi. they might be register variables .los: pop edx mov eax,ecx sar ecx,1 jnb 1f movsxb eax,(ebx) push eax jmp edx 1: sar ecx,1 jnb 1f movsx eax,(ebx) push eax jmp edx 1: push edx mov edx,esi mov esi,ebx pop ebx sub esp,eax jmp 1f .loi: ! only called with size >= 4 mov edx,esi mov esi,ebx pop ebx sub esp,ecx sar ecx,2 1: mov eax,edi mov edi,esp rep movs mov esi,edx mov edi,eax jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define .mlf4 .sect .text .mlf4: mov bx,sp flds 4(bx) fmuls 8(bx) fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .mlf8 .sect .text .mlf8: mov bx,sp fldd 4(bx) fmuld 12(bx) fstpd 12(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .mli ! #bytes in eax .mli: pop ebx ! return address cmp eax,4 jne 1f pop eax pop ecx mul ecx push eax jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .mon .mon: .extern .stop call .stop .sect .text; .sect .rom; .sect .data; .sect .bss .define .ngf4 .sect .text .ngf4: mov bx,sp flds 4(bx) fchs fstps 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .ngf8 .sect .text .ngf8: mov bx,sp fldd 4(bx) fchs fstpd 4(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .ngi ! #bytes in eax .ngi: pop ebx ! return address cmp eax,4 jne 1f pop ecx neg ecx push ecx jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .nop .extern printd, printc, hol0 .nop: mov eax,(hol0) call printd movb al,'\n' jmp printc .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define printc,printd,prints ! argument in eax ! uses ebx prints: xchg eax,ebx 1: movb al,(ebx) inc ebx testb al,al jz 2f call printc jmp 1b 2: ret ! argument in eax ! uses ecx and edx printd: xor edx,edx mov ecx,10 div ecx test eax,eax jz 1f push edx call printd pop edx 1: xchg eax,edx addb al,'0' ! argument in eax printc: push eax mov ebx,esp mov eax,1 push eax push ebx push eax call __write pop ebx pop ebx pop ebx pop ebx ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .rck ! descriptor address in ebx ! value in eax, must be left there .rck: cmp eax,(ebx) jl 2f cmp eax,4(ebx) jg 2f ret 2: push eax .extern ERANGE .extern .error mov eax,ERANGE call .error pop eax ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .rmi ! #bytes in eax .rmi: pop ebx ! return address cmp eax,4 jne 1f pop eax cwd pop ecx idiv ecx push edx jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .rmu ! #bytes in eax .rmu: pop ebx ! return address cmp eax,4 jne 1f pop eax xor edx,edx pop ecx idiv ecx push edx jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .rol ! #bytes in eax .rol: pop edx ! return address cmp eax,4 jne 1f pop eax pop ecx rol eax,cl push eax jmp edx 1: .extern EODDZ .extern .trp mov eax,EODDZ push edx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .ror ! #bytes in eax .ror: pop edx ! return address cmp eax,4 jne 1f pop eax pop ecx ror eax,cl push eax jmp edx 1: .extern EODDZ .extern .trp mov eax,EODDZ push edx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .sar4 .sar4: ! ebx, descriptor address ! eax, index sub eax,(ebx) mov ecx,8(ebx) imul ecx pop ebx pop edx ! base address add edx,eax sar ecx,1 jnb 1f pop eax movb (edx),al jmp ebx 1: sar ecx,1 jnb 1f pop eax o16 mov (edx),ax jmp ebx 1: xchg edi,edx ! edi = base address, edx is saved edi mov eax,esi mov esi,esp rep movs mov esp,esi mov esi,eax mov edi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define .sbf4 .sect .text .sbf4: mov bx,sp flds 8(bx) fsubs 4(bx) fstps 8(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .define .sbf8 .sect .text .sbf8: mov bx,sp fldd 12(bx) fsubd 4(bx) fstpd 12(bx) wait ret .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .sbi ! #bytes in ecx , top of stack in eax .sbi: pop ebx ! return subress cmp ecx,4 jne 1f pop ecx sub eax,ecx neg eax jmp ebx 1: .extern EODDZ .extern .trp mov eax,EODDZ push ebx jmp .trp Dem_set.sEem_sli.sFem_sri.sGem_sti.sHem_stop.sIem_trp.sJem_unknown.sKem_xor.sLem_hol0.s.sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .set ! #bytes in ecx ! bit # in eax .set: pop ebx ! return address xor edx,edx !ifdef create set sub esp,ecx push ebx push edi mov ebx,esp xor edi,edi sar ecx,2 1: mov 8(ebx)(edi),edx add edi,4 loop 1b !endif mov ebx,8 div ebx cmp eax,edi jae 2f mov edi,edx movb dl,bits(edi) mov edi,esp add edi,eax orb 8(edi),dl pop edi ret 2: .extern ESET .extern .trp pop edi mov eax,ESET jmp .trp .sect .rom bits: .data1 1,2,4,8,16,32,64,128 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .sli ! #bytes in eax .sli: pop edx ! return address cmp eax,4 jne 1f pop eax pop ecx sal eax,cl push eax jmp edx 1: .extern EODDZ .extern .trp mov eax,EODDZ push edx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .sri ! #bytes in eax .sri: pop edx ! return address cmp eax,4 jne 1f pop eax pop ecx sar eax,cl push eax jmp edx 1: .extern EODDZ .extern .trp mov eax,EODDZ push edx jmp .trp .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .sti .define .sts ! #bytes in ecx ! address in ebx ! save edi/esi. they might be register variables .sts: pop edx sar ecx,1 jnb 1f pop eax movb (ebx),al jmp edx 1: sar ecx,1 jnb 1f pop eax o16 mov (ebx),ax jmp edx 1: push edx mov edx,edi mov edi,ebx pop ebx jmp 1f .sti: ! only called with count >> 4 mov edx,edi mov edi,ebx pop ebx sar ecx,2 1: mov eax,esi mov esi,esp rep movs mov esp,esi mov edi,edx mov esi,eax jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .stop .stop: jmp ___exit .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .trp .extern .trppc, .stop ! eax is trap number .trp: xor ebx,ebx xchg ebx,(.trppc) test ebx,ebx jz 2f push eax call ebx pop eax ret 2: push eax call .stop .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .unknown .extern EILLINS, .fat .unknown: mov eax,EILLINS push eax jmp .fat .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define .xor ! #bytes in ecx .xor: pop ebx ! return address mov edx,edi mov edi,esp add edi,ecx sar ecx,2 1: pop eax xor eax,(edi) stos loop 1b mov edi,edx jmp ebx .sect .text; .sect .rom; .sect .data; .sect .bss .define hol0 .sect .data hol0: .data4 0, 0 .data4 0, 0 M...NMakefileOem_abs.hPem_head.s# Makefile for lib/i386/head. CC1 = $(CC) -Was-ack -c LIBRARY = ../../libe.a all: $(LIBRARY) $(LIBRARY): $(LIBRARY)(em_head.o) aal cr $@ *.o rm *.o $(LIBRARY)(em_head.o): em_head.s $(CC1) -I. em_head.s /* $Header: em_abs.h,v 1.3 87/03/10 08:58:45 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define LINO_AD 0 #define FILN_AD 4 #define LINO (*(int *)(_hol0()+LINO_AD)) #define FILN (*(char **)(_hol0()+FILN_AD)) #define EARRAY 0 #define ERANGE 1 #define ESET 2 #define EIOVFL 3 #define EFOVFL 4 #define EFUNFL 5 #define EIDIVZ 6 #define EFDIVZ 7 #define EIUND 8 #define EFUND 9 #define ECONV 10 #define ESTACK 16 #define EHEAP 17 #define EILLINS 18 #define EODDZ 19 #define ECASE 20 #define EMEMFLT 21 #define EBADPTR 22 #define EBADPC 23 #define EBADLAE 24 #define EBADMON 25 #define EBADLIN 26 #define EBADGTO 27 # .sect .text; .sect .rom; .sect .data; .sect .bss .define ERANGE,ESET,EHEAP,ECASE,EILLINS,EIDIVZ,EODDZ .define .trppc, .ignmask ERANGE = 1 ESET = 2 EIDIVZ = 6 EHEAP = 17 EILLINS = 18 EODDZ = 19 ECASE = 20 #include .sect .data .trppc: .data4 0 .ignmask: .data4 EIOVFL | EIUND | ECONV | EFOVFL | EFUNFL Q...RMakefileSalloca.sTget_bp.sUgetprocessor.sViolib.sWoneC_sum.s# Makefile for lib/i386/misc. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ack CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(alloca.o) \ $(LIBRARY)(get_bp.o) \ $(LIBRARY)(getprocessor.o) \ $(LIBRARY)(iolib.o) \ $(LIBRARY)(oneC_sum.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(alloca.o): alloca.s $(CC1) alloca.s $(LIBRARY)(get_bp.o): get_bp.s $(CC1) get_bp.s $(LIBRARY)(getprocessor.o): getprocessor.s $(CC1) getprocessor.s $(LIBRARY)(iolib.o): iolib.s $(CC1) iolib.s $(LIBRARY)(oneC_sum.o): oneC_sum.s $(CC1) oneC_sum.s # ! alloca() - allocate space on the stack Author: Kees J. Bot ! 2 Dec 1993 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .align 16 .define _alloca _alloca: #if __ACK__ pop ecx ! Return address pop eax ! Bytes to allocate add eax, 2*4+3 ! Add space for two saved register variables andb al, 0xFC ! Align mov ebx, esp ! Keep current esp sub esp, eax ! Lower stack mov eax, esp ! Return value push 4(ebx) ! Push what is probably the saved esi push (ebx) ! Saved edi ! Now ACK can still do: ! pop edi; pop esi; leave; ret push eax ! Dummy argument jmp ecx #else pop ecx ! Return address pop eax ! Bytes to allocate add eax, 3 andb al, 0xFC ! Align sub esp, eax ! Lower stack mov eax, esp ! Return value push eax ! Dummy argument jmp ecx #endif ! get_bp.s ! ! return EBP in EAX ! ! Created: Sep 7, 1992 by Philip Homburg .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define _get_bp _get_bp: mov eax, ebp ret ! $PchId: get_bp.ack.s,v 1.3 1996/02/23 08:30:52 philip Exp $ ! getprocessor() - determine processor type Author: Kees J. Bot ! 26 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text ! int getprocessor(void); ! Return 386, 486, 586, ... .define _getprocessor _getprocessor: push ebp mov ebp, esp and esp, 0xFFFFFFFC ! Align stack to avoid AC fault mov ecx, 0x00040000 ! Try to flip the AC bit introduced on the 486 call flip mov eax, 386 ! 386 if it didn't react to "flipping" jz gotprocessor mov ecx, 0x00200000 ! Try to flip the ID bit introduced on the 586 call flip mov eax, 486 ! 486 if it didn't react jz gotprocessor pushf pusha ! Save the world mov eax, 1 .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type andb ah, 0x0F ! Extract the family (5, 6, ...) movzxb eax, ah imul eax, 100 ! 500, 600, ... add eax, 86 ! 586, 686, ... mov 7*4(esp), eax ! Pass eax through popa popf gotprocessor: leave ret flip: pushf ! Push eflags pop eax ! eax = eflags mov edx, eax ! Save original eflags xor eax, ecx ! Flip the bit to test push eax ! Push modified eflags value popf ! Load modified eflags register pushf pop eax ! Get it again push edx popf ! Restore original eflags register xor eax, edx ! See if the bit changed test eax, ecx ret ! Some I/O related routines like: ! unsigned char inb(int port); ! unsigned short inw(int port); ! void outb(int port, int value); ! void outw(int port, int value); ! void rep_inb(int port, unsigned char *buf, size_t count); ! void rep_inw(int port, unsigned short *buf, size_t count); ! void rep_outb(int port, unsigned char *buf, size_t count); ! void rep_outw(int port, unsigned short *buf, size_t count); ! void intr_enable(void); ! void intr_disable(void); .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define _inb _inb: push ebp mov ebp, esp mov edx, 8(ebp) ! port xor eax, eax inb dx ! read 1 byte pop ebp ret .define _inw _inw: push ebp mov ebp, esp mov edx, 8(ebp) ! port xor eax, eax o16 in dx ! read 1 word pop ebp ret .define _outb _outb: push ebp mov ebp, esp mov edx, 8(ebp) ! port mov eax, 8+4(ebp) ! value outb dx ! output 1 byte pop ebp ret .define _outw _outw: push ebp mov ebp, esp mov edx, 8(ebp) ! port mov eax, 8+4(ebp) ! value o16 out dx ! output 1 word pop ebp ret .define _rep_inb _rep_inb: push ebp mov ebp, esp push edi mov edx, 8(ebp) ! port mov edi, 12(ebp) ! buf mov ecx, 16(ebp) ! byte count rep inb dx ! input many bytes pop edi pop ebp ret .define _rep_inw _rep_inw: push ebp mov ebp, esp push edi mov edx, 8(ebp) ! port mov edi, 12(ebp) ! buf mov ecx, 16(ebp) ! byte count shr ecx, 1 ! word count rep o16 in dx ! input many words pop edi pop ebp ret .define _rep_outb _rep_outb: push ebp mov ebp, esp push esi mov edx, 8(ebp) ! port mov esi, 12(ebp) ! buf mov ecx, 16(ebp) ! byte count rep outb dx ! output many bytes pop esi pop ebp ret .define _rep_outw _rep_outw: push ebp mov ebp, esp push esi mov edx, 8(ebp) ! port mov esi, 12(ebp) ! buf mov ecx, 16(ebp) ! byte count shr ecx, 1 ! word count rep o16 out dx ! output many words pop esi pop ebp ret .define _intr_disable _intr_disable: push ebp mov ebp, esp cli pop ebp ret .define _intr_enable _intr_enable: push ebp mov ebp, esp sti pop ebp ret ! oneC_sum() - One complement`s checksum Author: Kees J. Bot ! 9 May 1995 ! See RFC 1071, "Computing the Internet checksum" ! See also the C version of this code. .sect .text .define _oneC_sum .align 16 _oneC_sum: push ebp mov ebp, esp push esi push edi movzx eax, 8(ebp) ! Checksum of previous block mov esi, 12(ebp) ! Data to compute checksum over mov edi, 16(ebp) ! Number of bytes xor edx, edx xorb cl, cl align: test esi, 3 ! Is the data aligned? jz aligned test edi, edi jz 0f movb dl, (esi) ! Rotate the first unaligned bytes dec edi ! into the edx register 0: inc esi ror edx, 8 ror eax, 8 ! Rotate the checksum likewise addb cl, 8 ! Number of bits rotated jmp align aligned:add eax, edx ! Summate the unaligned bytes adc eax, 0 ! Add carry back in for one`s complement jmp add6test .align 16 add6: add eax, (esi) ! Six times unrolled loop, see below adc eax, 4(esi) adc eax, 8(esi) adc eax, 12(esi) adc eax, 16(esi) adc eax, 20(esi) adc eax, 0 add esi, 24 add6test: sub edi, 24 jae add6 add edi, 24 jmp add1test .align 16 add1: add eax, (esi) ! while ((edi -= 4) >= 0) adc eax, 0 ! eax += *esi++; add esi, 4 ! edi += 4; add1test: sub edi, 4 jae add1 add edi, 4 jz done ! Are there extra bytes? mov edx, (esi) ! Load extra bytes in a full dword and edx, mask-4(edi*4) ! Mask off excess add eax, edx ! Add in the last bits adc eax, 0 done: rol eax, cl ! Undo the rotation at the beginning mov edx, eax shr eax, 16 o16 add ax, dx ! Add the two words in eax to form o16 adc ax, 0 ! a 16 bit sum pop edi pop esi pop ebp ret .sect .rom .align 4 mask: .data4 0x000000FF, 0x0000FFFF, 0x00FFFFFF ! ! $PchId: oneC_sum.ack.s,v 1.2 1996/03/12 19:33:51 philip Exp $ X...YMakefileZ__sigreturn.s[_sendrec.s\brksize.s]crtso.s^m2rtso.s_prtso.s# Makefile for lib/i386/rts. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ack CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: \ ../../crtso.o \ ../../m2rtso.o \ ../../prtso.o \ $(LIBRARY) ../../crtso.o: crtso.s $(CC1) -c crtso.s mv crtso.o $@ ../../m2rtso.o: m2rtso.s $(CC1) -c m2rtso.s mv m2rtso.o $@ ../../prtso.o: prtso.s $(CC1) -c prtso.s mv prtso.o $@ OBJECTS = \ $(LIBRARY)(__sigreturn.o) \ $(LIBRARY)(_sendrec.o) \ $(LIBRARY)(brksize.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(__sigreturn.o): __sigreturn.s $(CC1) __sigreturn.s $(LIBRARY)(_sendrec.o): _sendrec.s $(CC1) _sendrec.s $(LIBRARY)(brksize.o): brksize.s $(CC1) brksize.s ! This routine is the low-level code for returning from signals. ! It calls __sigreturn, which is the normal "system call" routine. ! Both ___sigreturn and __sigreturn are needed. .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define ___sigreturn .extern __sigreturn ___sigreturn: add esp, 16 jmp __sigreturn .sect .text; .sect .rom; .sect .data; .sect .bss .define __send, __receive, __sendrec ! See ../h/com.h for C definitions SEND = 1 RECEIVE = 2 BOTH = 3 SYSVEC = 33 SRCDEST = 8 MESSAGE = 12 !*========================================================================* ! _send and _receive * !*========================================================================* ! _send(), _receive(), _sendrec() all save ebp, but destroy eax and ecx. .define __send, __receive, __sendrec .sect .text __send: push ebp mov ebp, esp push ebx mov eax, SRCDEST(ebp) ! eax = dest-src mov ebx, MESSAGE(ebp) ! ebx = message pointer mov ecx, SEND ! _send(dest, ptr) int SYSVEC ! trap to the kernel pop ebx pop ebp ret __receive: push ebp mov ebp, esp push ebx mov eax, SRCDEST(ebp) ! eax = dest-src mov ebx, MESSAGE(ebp) ! ebx = message pointer mov ecx, RECEIVE ! _receive(src, ptr) int SYSVEC ! trap to the kernel pop ebx pop ebp ret __sendrec: push ebp mov ebp, esp push ebx mov eax, SRCDEST(ebp) ! eax = dest-src mov ebx, MESSAGE(ebp) ! ebx = message pointer mov ecx, BOTH ! _sendrec(srcdest, ptr) int SYSVEC ! trap to the kernel pop ebx pop ebp ret .sect .text; .sect .rom; .sect .data; .sect .bss .define __brksize .sect .data .extern endbss, __brksize __brksize: .data4 endbss ! This is the C run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _main expects them. ! It also initializes _environ when this variable isn't defined by the ! programmer. The detection of whether _environ belong to us is rather ! simplistic. We simply check for some magic value, but there is no other ! way. .sect .text; .sect .rom; .sect .data; .sect .bss .define begtext, begdata, begbss .sect .text begtext: .sect .rom begrom: .sect .data begdata: .sect .bss begbss: .define crtso, ___main, __penviron, __penvp, __fpu_present .extern _main, _exit .sect .text crtso: xor ebp, ebp ! clear for backtrace of core files mov eax, (esp) ! argc lea edx, 4(esp) ! argv lea ecx, 8(esp)(eax*4) ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov ebx, _environ cmp ebx, __edata ! within initialized data? jae 0f testb bl, 3 ! aligned? jnz 0f cmp (ebx), 0x53535353 ! is it our _environ? jne 0f mov (__penviron), ebx ! _penviron = &environ; 0: mov ebx, (__penviron) mov (ebx), ecx ! *_penviron = envp; push ecx ! push envp push edx ! push argv push eax ! push argc ! Test the EM bit of the MSW to determine if an FPU is present and ! set __fpu_present if one is found. smsw ax testb al, 0x4 ! EM bit in MSW setz (__fpu_present) ! True if not set call _main ! main(argc, argv, envp) push eax ! push exit status call _exit hlt ! force a trap if exit fails ___main: ! for GCC ret .sect .rom .data4 0 ! Separate I&D: *NULL == 0 ! Also keeps the first string in the ! program from appearing at location 0! .sect .data __penviron: .data4 __penvp ! Pointer to environ, or hidden pointer .sect .bss .comm __penvp, 4 ! Hidden environment vector .comm __fpu_present, 4 ! FPU present flag .extern endtext ! Force loading of end labels. ! This is the Modula-2 run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _m_a_i_n expects them. .sect .text; .sect .rom; .sect .data; .sect .bss .define begtext, begdata, begbss .sect .text begtext: .sect .rom begrom: .sect .data begdata: .sect .bss begbss: .define m2rtso, hol0, __penviron, __penvp, __fpu_present .sect .text m2rtso: xor ebp, ebp ! clear for backtrace of core files mov eax, (esp) ! argc lea edx, 4(esp) ! argv lea ecx, 8(esp)(eax*4) ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov ebx, _environ cmp ebx, __edata ! within initialized data? jae 0f testb bl, 3 ! aligned? jnz 0f cmp (ebx), 0x53535353 ! is it our environ? jne 0f mov (__penviron), ebx ! _penviron = &environ; 0: mov ebx, (__penviron) mov (ebx), ecx ! *_penviron = envp; push ecx ! push envp push edx ! push argv push eax ! push argc ! Test the EM bit of the MSW to determine if an FPU is present and ! set __fpu_present if one is found. smsw ax testb al, 0x4 ! EM bit in MSW setz (__fpu_present) ! True if not set call __m_a_i_n ! run Modula-2 program push eax ! push exit status call __exit hlt ! force a trap if exit fails .sect .rom .data4 0 ! Separate I&D: *NULL == 0 ! Also keeps the first string in the ! program from appearing at location 0! .sect .data __penviron: .data4 __penvp ! Pointer to environ, or hidden pointer .sect .bss .comm __penvp, 4 ! Hidden environment vector .comm __fpu_present, 4 ! FPU present flag .extern endtext ! Force loading of end labels. ! This is the Pascal run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _m_a_i_n expects them. .sect .text; .sect .rom; .sect .data; .sect .bss .define begtext, begdata, begbss .sect .text begtext: .sect .rom begrom: .sect .data begdata: .sect .bss begbss: .define prtso, hol0, __penviron, __penvp, __fpu_present .sect .text prtso: xor ebp, ebp ! clear for backtrace of core files mov eax, (esp) ! argc lea edx, 4(esp) ! argv lea ecx, 8(esp)(eax*4) ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov ebx, _environ cmp ebx, __edata ! within initialized data? jae 0f testb bl, 3 ! aligned? jnz 0f cmp (ebx), 0x53535353 ! is it our environ? jne 0f mov (__penviron), ebx ! _penviron = &environ; 0: mov ebx, (__penviron) mov (ebx), ecx ! *_penviron = envp; push ecx ! push envp push edx ! push argv push eax ! push argc ! Test the EM bit of the MSW to determine if an FPU is present and ! set __fpu_present if one is found. smsw ax testb al, 0x4 ! EM bit in MSW setz (__fpu_present) ! True if not set mov (.ignmask), 56 call __m_a_i_n ! Run Pascal program push eax ! push exit status call __exit hlt ! force a trap if exit fails .sect .rom .data4 0 ! Separate I&D: *NULL == 0 ! Also keeps the first string in the ! program from appearing at location 0! .sect .data __penviron: .data4 __penvp ! Pointer to environ, or hidden pointer .sect .bss .comm __penvp, 4 ! Hidden environment vector .comm __fpu_present, 4 ! FPU present flag .extern endtext ! Force loading of end labels. `...aMakefilebREADMEc_memmove.sd_strncat.se_strncmp.sf_strncpy.sg_strnlen.shbcmp.sibcopy.sjbzero.skindex.slmemchr.smmemcmp.snmemcpy.somemmove.spmemset.sqrindex.srstrcat.ssstrchr.ststrcmp.sustrcpy.svstrlen.swstrncat.sxstrncmp.systrncpy.szstrnlen.s{strrchr.s# Makefile for lib/i386/string. CC1 = $(CC) -Was-ack -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(_memmove.o) \ $(LIBRARY)(_strncat.o) \ $(LIBRARY)(_strncmp.o) \ $(LIBRARY)(_strncpy.o) \ $(LIBRARY)(_strnlen.o) \ $(LIBRARY)(bcmp.o) \ $(LIBRARY)(bcopy.o) \ $(LIBRARY)(bzero.o) \ $(LIBRARY)(index.o) \ $(LIBRARY)(memchr.o) \ $(LIBRARY)(memcmp.o) \ $(LIBRARY)(memcpy.o) \ $(LIBRARY)(memmove.o) \ $(LIBRARY)(memset.o) \ $(LIBRARY)(rindex.o) \ $(LIBRARY)(strcat.o) \ $(LIBRARY)(strchr.o) \ $(LIBRARY)(strcmp.o) \ $(LIBRARY)(strcpy.o) \ $(LIBRARY)(strlen.o) \ $(LIBRARY)(strncat.o) \ $(LIBRARY)(strncmp.o) \ $(LIBRARY)(strncpy.o) \ $(LIBRARY)(strnlen.o) \ $(LIBRARY)(strrchr.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(_memmove.o): _memmove.s $(CC1) _memmove.s $(LIBRARY)(_strncat.o): _strncat.s $(CC1) _strncat.s $(LIBRARY)(_strncmp.o): _strncmp.s $(CC1) _strncmp.s $(LIBRARY)(_strncpy.o): _strncpy.s $(CC1) _strncpy.s $(LIBRARY)(_strnlen.o): _strnlen.s $(CC1) _strnlen.s $(LIBRARY)(bcmp.o): bcmp.s $(CC1) bcmp.s $(LIBRARY)(bcopy.o): bcopy.s $(CC1) bcopy.s $(LIBRARY)(bzero.o): bzero.s $(CC1) bzero.s $(LIBRARY)(index.o): index.s $(CC1) index.s $(LIBRARY)(memchr.o): memchr.s $(CC1) memchr.s $(LIBRARY)(memcmp.o): memcmp.s $(CC1) memcmp.s $(LIBRARY)(memcpy.o): memcpy.s $(CC1) memcpy.s $(LIBRARY)(memmove.o): memmove.s $(CC1) memmove.s $(LIBRARY)(memset.o): memset.s $(CC1) memset.s $(LIBRARY)(rindex.o): rindex.s $(CC1) rindex.s $(LIBRARY)(strcat.o): strcat.s $(CC1) strcat.s $(LIBRARY)(strchr.o): strchr.s $(CC1) strchr.s $(LIBRARY)(strcmp.o): strcmp.s $(CC1) strcmp.s $(LIBRARY)(strcpy.o): strcpy.s $(CC1) strcpy.s $(LIBRARY)(strlen.o): strlen.s $(CC1) strlen.s $(LIBRARY)(strncat.o): strncat.s $(CC1) strncat.s $(LIBRARY)(strncmp.o): strncmp.s $(CC1) strncmp.s $(LIBRARY)(strncpy.o): strncpy.s $(CC1) strncpy.s $(LIBRARY)(strnlen.o): strnlen.s $(CC1) strnlen.s $(LIBRARY)(strrchr.o): strrchr.s $(CC1) strrchr.s Notes on i80386 string assembly routines. Author: Kees J. Bot 2 Jan 1994 Remarks. All routines set up proper stack frames, so that stack traces can be derived from core dumps. String routines are often the ones that get the bad pointer. Flags are often not right in boundary cases (zero string length) on repeated string scanning or comparing instructions. This has been handled in sometimes nonobvious ways. Only the eax, edx, and ecx registers are not preserved, all other registers are. This is what GCC expects. (ACK sees ebx as scratch too.) The direction byte is assumed to be wrong, and left clear on exit. Assumptions. The average string is short, so short strings should not suffer from smart tricks to copy, compare, or search large strings fast. This means that the routines are fast on average, but not optimal for long strings. It doesn't pay to use word or longword operations on strings, the setup time hurts the average case. Memory blocks are probably large and on word or longword boundaries. No unaligned word moves are done. Again the setup time may hurt the average case. Furthermore, the author likes to enable the alignment check on a 486. String routines. They have been implemented using byte string instructions. The length of a string it usually determined first, followed by the actual operation. Strcmp. This is the only string routine that uses a loop, and not instructions with a repeat prefix. Problem is that we don't know how long the string is. Scanning for the end costs if the strings are unequal in the first few bytes. Strchr. The character we look for is often not there, or at some distance from the start. The string is scanned twice, for the terminating zero and the character searched, in chunks of increasing length. Memory routines. Memmove, memcpy, and memset use word or longword instructions if the address(es) are at word or longword boundaries. No tricks to get alignment after doing a few bytes. No unaligned operations. ! _memmove() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *_memmove(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! .sect .text .define __memmove, __memcpy .align 16 __memmove: push ebp mov ebp, esp push esi push edi mov edi, 8(ebp) ! String s1 mov esi, 12(ebp) ! String s2 mov ecx, 16(ebp) ! Length mov eax, edi sub eax, esi cmp eax, ecx jb downwards ! if (s2 - s1) < n then copy downwards __memcpy: cld ! Clear direction bit: upwards cmp ecx, 16 jb upbyte ! Don't bother being smart with short arrays mov eax, esi or eax, edi testb al, 1 jnz upbyte ! Bit 0 set, use byte copy testb al, 2 jnz upword ! Bit 1 set, use word copy uplword:shrd eax, ecx, 2 ! Save low 2 bits of ecx in eax shr ecx, 2 rep movs ! Copy longwords. shld ecx, eax, 2 ! Restore excess count upword: shr ecx, 1 rep o16 movs ! Copy words adc ecx, ecx ! One more byte? upbyte: rep movsb ! Copy bytes done: mov eax, 8(ebp) ! Absolutely noone cares about this value pop edi pop esi pop ebp ret ! Handle bad overlap by copying downwards, don't bother to do word copies. downwards: std ! Set direction bit: downwards lea esi, -1(esi)(ecx*1) lea edi, -1(edi)(ecx*1) rep movsb ! Copy bytes cld jmp done ! _strncat() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *_strncat(char *s1, const char *s2, size_t edx) ! Append string s2 to s1. ! .sect .text .define __strncat .align 16 __strncat: push ebp mov ebp, esp push esi push edi mov edi, 8(ebp) ! String s1 mov ecx, -1 xorb al, al ! Null byte cld repne scasb ! Look for the zero byte in s1 dec edi ! Back one up (and clear 'Z' flag) push edi ! Save end of s1 mov edi, 12(ebp) ! edi = string s2 mov ecx, edx ! Maximum count repne scasb ! Look for the end of s2 jne no0 inc ecx ! Exclude null byte no0: sub edx, ecx ! Number of bytes in s2 mov ecx, edx mov esi, 12(ebp) ! esi = string s2 pop edi ! edi = end of string s1 rep movsb ! Copy bytes stosb ! Add a terminating null mov eax, 8(ebp) ! Return s1 pop edi pop esi pop ebp ret ! strncmp() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strncmp(const char *s1, const char *s2, size_t ecx) ! Compare two strings. ! .sect .text .define __strncmp .align 16 __strncmp: push ebp mov ebp, esp push esi push edi test ecx, ecx ! Max length is zero? je done mov esi, 8(ebp) ! esi = string s1 mov edi, 12(ebp) ! edi = string s2 cld compare: cmpsb ! Compare two bytes jne done cmpb -1(esi), 0 ! End of string? je done dec ecx ! Length limit reached? jne compare done: seta al ! al = (s1 > s2) setb ah ! ah = (s1 < s2) subb al, ah movsxb eax, al ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 pop edi pop esi pop ebp ret ! _strncpy() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *_strncpy(char *s1, const char *s2, size_t ecx) ! Copy string s2 to s1. ! .sect .text .define __strncpy .align 16 __strncpy: mov edi, 12(ebp) ! edi = string s2 xorb al, al ! Look for a zero byte mov edx, ecx ! Save maximum count cld repne scasb ! Look for end of s2 sub edx, ecx ! Number of bytes in s2 including null xchg ecx, edx mov esi, 12(ebp) ! esi = string s2 mov edi, 8(ebp) ! edi = string s1 rep movsb ! Copy bytes ret ! _strnlen() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t _strnlen(const char *s, size_t ecx) ! Return the length of a string. ! .sect .text .define __strnlen .align 16 __strnlen: push ebp mov ebp, esp push edi mov edi, 8(ebp) ! edi = string xorb al, al ! Look for a zero byte mov edx, ecx ! Save maximum count cmpb cl, 1 ! 'Z' bit must be clear if ecx = 0 cld repne scasb ! Look for zero jne no0 inc ecx ! Don't count zero byte no0: mov eax, edx sub eax, ecx ! Compute bytes scanned pop edi pop ebp ret ! bcmp() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int bcmp(const void *s1, const void *s2, size_t n) ! Compare two chunks of memory. ! This is a BSD routine that escaped from the kernel. Don't use. ! (Alas it is not without some use, it reports the number of bytes ! after the bytes that are equal. So it can't be simply replaced.) ! .sect .text .define _bcmp .align 16 _bcmp: push ebp mov ebp, esp push 16(ebp) push 12(ebp) push 8(ebp) call _memcmp ! Let memcmp do the work test eax, eax jz equal sub edx, 8(ebp) ! Memcmp was nice enough to leave "esi" in edx dec edx ! Number of bytes that are equal mov eax, 16(ebp) sub eax, edx ! Number of bytes that are unequal equal: leave ret ! bcopy() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void bcopy(const void *s1, void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! This is a BSD routine that escaped from the kernel. Don't use. ! .sect .text .define _bcopy .align 16 _bcopy: mov eax, 4(esp) ! Exchange string arguments xchg eax, 8(esp) mov 4(esp), eax jmp __memmove ! Call the proper routine ! bzero() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void bzero(void *s, size_t n) ! Set a chunk of memory to zero. ! This is a BSD routine that escaped from the kernel. Don't use. ! .sect .text .define _bzero .align 16 _bzero: push ebp mov ebp, esp push 12(ebp) ! Size push 0 ! Zero push 8(ebp) ! String call _memset ! Call the proper routine leave ret ! index() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *index(const char *s, int c) ! Look for a character in a string. Has suffered from a hostile ! takeover by strchr(). ! .sect .text .define _index .align 16 _index: jmp _strchr ! memchr() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memchr(const void *s, int c, size_t n) ! Look for a character in a chunk of memory. ! .sect .text .define _memchr .align 16 _memchr: push ebp mov ebp, esp push edi mov edi, 8(ebp) ! edi = string movb al, 12(ebp) ! The character to look for mov ecx, 16(ebp) ! Length cmpb cl, 1 ! 'Z' bit must be clear if ecx = 0 cld repne scasb jne failure lea eax, -1(edi) ! Found pop edi pop ebp ret failure:xor eax, eax pop edi pop ebp ret ! memcmp() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int memcmp(const void *s1, const void *s2, size_t n) ! Compare two chunks of memory. ! .sect .text .define _memcmp .align 16 _memcmp: cld push ebp mov ebp, esp push esi push edi mov esi, 8(ebp) ! String s1 mov edi, 12(ebp) ! String s2 mov ecx, 16(ebp) ! Length cmp ecx, 16 jb cbyte ! Don't bother being smart with short arrays mov eax, esi or eax, edi testb al, 1 jnz cbyte ! Bit 0 set, use byte compare testb al, 2 jnz cword ! Bit 1 set, use word compare clword: shrd eax, ecx, 2 ! Save low two bits of ecx in eax shr ecx, 2 repe cmps ! Compare longwords sub esi, 4 sub edi, 4 inc ecx ! Recompare the last longword shld ecx, eax, 2 ! And any excess bytes jmp last cword: shrd eax, ecx, 1 ! Save low bit of ecx in eax shr ecx, 1 repe o16 cmps ! Compare words sub esi, 2 sub edi, 2 inc ecx ! Recompare the last word shld ecx, eax, 1 ! And one more byte? cbyte: test ecx, ecx ! Set 'Z' flag if ecx = 0 last: repe cmpsb ! Look for the first differing byte seta al ! al = (s1 > s2) setb ah ! ah = (s1 < s2) subb al, ah movsxb eax, al ! eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1 mov edx, esi ! For bcmp() to play with pop edi pop esi pop ebp ret ! memcpy() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memcpy(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. ! This routine need not handle overlap, so it does not handle overlap. ! One could simply call __memmove, the cost of the overlap check is ! negligible, but you are dealing with a programmer who believes that ! if anything can go wrong, it should go wrong. ! .sect .text .define _memcpy .align 16 _memcpy: push ebp mov ebp, esp push esi push edi mov edi, 8(ebp) ! String s1 mov esi, 12(ebp) ! String s2 mov ecx, 16(ebp) ! Length ! No overlap check here jmp __memcpy ! Call the part of __memmove that copies up ! memmove() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memmove(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! .sect .text .define _memmove .align 16 _memmove: jmp __memmove ! Call common code ! memset() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memset(void *s, int c, size_t n) ! Set a chunk of memory to the same byte value. ! .sect .text .define _memset .align 16 _memset: push ebp mov ebp, esp push edi mov edi, 8(ebp) ! The string movzxb eax, 12(ebp) ! The fill byte mov ecx, 16(ebp) ! Length cld cmp ecx, 16 jb sbyte ! Don't bother being smart with short arrays test edi, 1 jnz sbyte ! Bit 0 set, use byte store test edi, 2 jnz sword ! Bit 1 set, use word store slword: movb ah, al mov edx, eax sal edx, 16 or eax, edx ! One byte to four bytes shrd edx, ecx, 2 ! Save low two bits of ecx in edx shr ecx, 2 rep stos ! Store longwords. shld ecx, edx, 2 ! Restore low two bits sword: movb ah, al ! One byte to two bytes shr ecx, 1 rep o16 stos ! Store words adc ecx, ecx ! One more byte? sbyte: rep stosb ! Store bytes done: mov eax, 8(ebp) ! Return some value you have no need for pop edi pop ebp ret ! rindex() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *rindex(const char *s, int c) ! Look for the last occurrence a character in a string. Has suffered ! from a hostile takeover by strrchr(). ! .sect .text .define _rindex .align 16 _rindex: jmp _strrchr ! strcat() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strcat(char *s1, const char *s2) ! Append string s2 to s1. ! .sect .text .define _strcat .align 16 _strcat: mov edx, -1 ! Unlimited length jmp __strncat ! Common code ! strchr() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strchr(const char *s, int c) ! Look for a character in a string. ! .sect .text .define _strchr .align 16 _strchr: push ebp mov ebp, esp push edi cld mov edi, 8(ebp) ! edi = string mov edx, 16 ! Look at small chunks of the string next: shl edx, 1 ! Chunks become bigger each time mov ecx, edx xorb al, al ! Look for the zero at the end repne scasb pushf ! Remember the flags sub ecx, edx neg ecx ! Some or all of the chunk sub edi, ecx ! Step back movb al, 12(ebp) ! The character to look for repne scasb je found popf ! Did we find the end of string earlier? jne next ! No, try again xor eax, eax ! Return NULL pop edi pop ebp ret found: pop eax ! Get rid of those flags lea eax, -1(edi) ! Address of byte found pop edi pop ebp ret ! strcmp() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strcmp(const char *s1, const char *s2) ! Compare two strings. ! .sect .text .define _strcmp .align 16 _strcmp: mov ecx, -1 ! Unlimited length jmp __strncmp ! Common code ! strcpy() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strcpy(char *s1, const char *s2) ! Copy string s2 to s1. ! .sect .text .define _strcpy .align 16 _strcpy: push ebp mov ebp, esp push esi push edi mov ecx, -1 ! Unlimited length call __strncpy ! Common code mov eax, 8(ebp) ! Return s1 pop edi pop esi pop ebp ret ! strlen() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strlen(const char *s) ! Return the length of a string. ! .sect .text .define _strlen .align 16 _strlen: mov ecx, -1 ! Unlimited length jmp __strnlen ! Common code ! strncat() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strncat(char *s1, const char *s2, size_t n) ! Append string s2 to s1. ! .sect .text .define _strncat .align 16 _strncat: mov edx, 12(esp) ! Maximum length jmp __strncat ! Common code ! strncmp() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strncmp(const char *s1, const char *s2, size_t n) ! Compare two strings. ! .sect .text .define _strncmp .align 16 _strncmp: mov ecx, 12(esp) ! Maximum length jmp __strncmp ! Common code ! strncpy() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strncpy(char *s1, const char *s2, size_t n) ! Copy string s2 to s1. ! .sect .text .define _strncpy .align 16 _strncpy: push ebp mov ebp, esp push esi push edi mov ecx, 16(ebp) ! Maximum length call __strncpy ! Common code mov ecx, edx ! Number of bytes not copied rep stosb ! strncpy always copies n bytes by null padding mov eax, 8(ebp) ! Return s1 pop edi pop esi pop ebp ret ! strnlen() Author: Kees J. Bot ! 1 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strnlen(const char *s, size_t n) ! Return the length of a string. ! .sect .text .define _strnlen .align 16 _strnlen: mov ecx, 8(esp) ! Maximum length jmp __strnlen ! Common code ! strrchr() Author: Kees J. Bot ! 2 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strrchr(const char *s, int c) ! Look for the last occurrence a character in a string. ! .sect .text .define _strrchr .align 16 _strrchr: push ebp mov ebp, esp push edi mov edi, 8(ebp) ! edi = string mov ecx, -1 xorb al, al cld repne scasb ! Look for the end of the string not ecx ! -1 - ecx = Length of the string + null dec edi ! Put edi back on the zero byte movb al, 12(ebp) ! The character to look for std ! Downwards search repne scasb cld ! Direction bit back to default jne failure lea eax, 1(edi) ! Found it pop edi pop ebp ret failure:xor eax, eax ! Not there pop edi pop ebp ret |...}Makefile~add64.sadd64u.scmp64.scv64u.scvu64.sdiff64.sdiv64u.sex64.smake64.smul64u.ssub64.ssub64u.s# Makefile for lib/i386/int64. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ack CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(add64.o) \ $(LIBRARY)(add64u.o) \ $(LIBRARY)(cmp64.o) \ $(LIBRARY)(cv64u.o) \ $(LIBRARY)(cvu64.o) \ $(LIBRARY)(diff64.o) \ $(LIBRARY)(div64u.o) \ $(LIBRARY)(ex64.o) \ $(LIBRARY)(make64.o) \ $(LIBRARY)(mul64u.o) \ $(LIBRARY)(sub64.o) \ $(LIBRARY)(sub64u.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(add64.o): add64.s $(CC1) add64.s $(LIBRARY)(add64u.o): add64u.s $(CC1) add64u.s $(LIBRARY)(cmp64.o): cmp64.s $(CC1) cmp64.s $(LIBRARY)(cv64u.o): cv64u.s $(CC1) cv64u.s $(LIBRARY)(cvu64.o): cvu64.s $(CC1) cvu64.s $(LIBRARY)(diff64.o): diff64.s $(CC1) diff64.s $(LIBRARY)(div64u.o): div64u.s $(CC1) div64u.s $(LIBRARY)(ex64.o): ex64.s $(CC1) ex64.s $(LIBRARY)(make64.o): make64.s $(CC1) make64.s $(LIBRARY)(mul64u.o): mul64u.s $(CC1) mul64u.s $(LIBRARY)(sub64.o): sub64.s $(CC1) sub64.s $(LIBRARY)(sub64u.o): sub64u.s $(CC1) sub64u.s ! add64() - 64 bit addition Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _add64 _add64: ! u64_t add64(u64_t i, u64_t j); mov eax, 4(esp) mov edx, 8(esp) add edx, 16(esp) mov (eax), edx mov edx, 12(esp) adc edx, 20(esp) mov 4(eax), edx ret ! ! $PchId: add64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! add64u() - unsigned to 64 bit addition Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _add64u, _add64ul _add64u: ! u64_t add64u(u64_t i, unsigned j); _add64ul: ! u64_t add64ul(u64_t i, unsigned long j); mov eax, 4(esp) mov edx, 8(esp) add edx, 16(esp) mov (eax), edx mov edx, 12(esp) adc edx, 0 mov 4(eax), edx ret ! ! $PchId: add64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! cmp64*() - 64 bit compare Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _cmp64, _cmp64u, _cmp64ul _cmp64: ! int cmp64(u64_t i, u64_t j); mov ecx, esp cmp64: xor eax, eax mov edx, 4(ecx) sub edx, 12(ecx) mov edx, 8(ecx) sbb edx, 16(ecx) sbb eax, eax ! eax = - (i < j) mov edx, 12(ecx) sub edx, 4(ecx) mov edx, 16(ecx) sbb edx, 8(ecx) adc eax, 0 ! eax = (i > j) - (i < j) ret _cmp64u: ! int cmp64u(u64_t i, unsigned j); _cmp64ul: ! int cmp64ul(u64_t i, unsigned long j); mov ecx, esp push 16(ecx) mov 16(ecx), 0 call cmp64 pop 16(ecx) ret ! ! $PchId: cmp64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! cv64u() - 64 bit converted to unsigned Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _cv64u, _cv64ul _cv64u: ! unsigned cv64u(u64_t i); _cv64ul: ! unsigned long cv64ul(u64_t i); mov eax, 4(esp) cmp 8(esp), 0 ! return ULONG_MAX if really big jz 0f mov eax, -1 0: ret ! ! $PchId: cv64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! cvu64() - unsigned converted to 64 bit Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _cvu64, _cvul64 _cvu64: ! u64_t cvu64(unsigned i); _cvul64: ! u64_t cvul64(unsigned long i); mov eax, 4(esp) mov edx, 8(esp) mov (eax), edx mov 4(eax), 0 ret ! ! $PchId: cvu64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! diff64() - 64 bit subtraction giving unsigned Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _diff64 _diff64: ! unsigned diff64(u64_t i, u64_t j); mov eax, 4(esp) sub eax, 12(esp) ret ! ! $PchId: diff64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! div64u() - 64 bit divided by unsigned giving unsigned long ! Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _div64u, _rem64u _div64u: ! unsigned long div64u(u64_t i, unsigned j); xor edx, edx mov eax, 8(esp) ! i = (ih<<32) + il div 12(esp) ! ih = q * j + r mov eax, 4(esp) div 12(esp) ! i / j = (q<<32) + ((r<<32) + il) / j ret _rem64u: ! unsigned rem64u(u64_t i, unsigned j); pop ecx call _div64u mov eax, edx jmp ecx ! ! $PchId: div64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! ex64*() - extract low or high 32 bits of a 64 bit number ! Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _ex64lo, _ex64hi _ex64lo: ! unsigned long ex64lo(u64_t i); mov eax, 4(esp) ret _ex64hi: ! unsigned long ex64hi(u64_t i); mov eax, 8(esp) ret ! ! $PchId: ex64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! make64() - make a 64 bit number from two 32 bit halves ! Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _make64 _make64: ! u64_t make64(unsigned long lo, unsigned long hi); mov eax, 4(esp) mov edx, 8(esp) mov (eax), edx mov edx, 12(esp) mov 4(eax), edx ret ! ! $PchId: make64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! mul64u() - unsigned long by unsigned multiply giving 64 bit result ! Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _mul64u _mul64u: ! u64_t mul64u(unsigned long i, unsigned j); mov ecx, 4(esp) mov eax, 8(esp) mul 12(esp) mov (ecx), eax mov 4(ecx), edx mov eax, ecx ret ! ! $PchId: mul64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! sub64() - 64 bit subtraction Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _sub64 _sub64: ! u64_t sub64(u64_t i, u64_t j); mov eax, 4(esp) mov edx, 8(esp) sub edx, 16(esp) mov (eax), edx mov edx, 12(esp) sbb edx, 20(esp) mov 4(eax), edx ret ! ! $PchId: sub64.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ ! sub64() - unsigned from 64 bit subtraction Author: Kees J. Bot ! 7 Dec 1995 .sect .text .define _sub64u, _sub64ul _sub64u: ! u64_t sub64u(u64_t i, unsigned j); _sub64ul: ! u64_t sub64ul(u64_t i, unsigned long j); mov eax, 4(esp) mov edx, 8(esp) sub edx, 16(esp) mov (eax), edx mov edx, 12(esp) sbb edx, 0 mov 4(eax), edx ret ! ! $PchId: sub64u.ack.s,v 1.2 1996/04/11 18:59:57 philip Exp $ .;..Makefileemmiscrtsstringint64# Makefile for lib/i86. MAKE = exec make -$(MAKEFLAGS) install: cd em && $(MAKE) cd int64 && $(MAKE) cd misc && $(MAKE) cd rts && $(MAKE) cd string && $(MAKE) ...Makefileem_adi.sem_and.sem_blm.sem_cii.sem_cmi4.sem_cms.sem_cmu4.sem_com.sem_csa2.sem_csa4.sem_csb2.sem_csb4.sem_cuu.sem_dup.sem_dvi4.sem_dvu4.sem_stb.sem_error.sem_exg.sem_fat.sem_fp8087.sem_gto.sem_hol0.sem_iaar.sem_ilar.sem_inn.sem_ior.sem_isar.sem_lar2.sem_lfr6.sem_lfr8.sem_loi.sem_mli4.sem_mon.sem_nop.sem_rck.sem_ret6.sem_ret8.sem_retarea.sem_return.sem_rmi4.sem_rmu4.sem_sar2.sem_sbi.sem_set.sem_sti.sem_stop.sem_trp.sem_unknown.sem_vars.sem_xor.s# Makefile for lib/i86/em. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ncc CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libe.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(em_adi.o) \ $(LIBRARY)(em_and.o) \ $(LIBRARY)(em_blm.o) \ $(LIBRARY)(em_cii.o) \ $(LIBRARY)(em_cmi4.o) \ $(LIBRARY)(em_cms.o) \ $(LIBRARY)(em_cmu4.o) \ $(LIBRARY)(em_com.o) \ $(LIBRARY)(em_csa2.o) \ $(LIBRARY)(em_csa4.o) \ $(LIBRARY)(em_csb2.o) \ $(LIBRARY)(em_csb4.o) \ $(LIBRARY)(em_cuu.o) \ $(LIBRARY)(em_dup.o) \ $(LIBRARY)(em_dvi4.o) \ $(LIBRARY)(em_dvu4.o) \ $(LIBRARY)(em_error.o) \ $(LIBRARY)(em_exg.o) \ $(LIBRARY)(em_fat.o) \ $(LIBRARY)(em_fp8087.o) \ $(LIBRARY)(em_gto.o) \ $(LIBRARY)(em_hol0.o) \ $(LIBRARY)(em_iaar.o) \ $(LIBRARY)(em_ilar.o) \ $(LIBRARY)(em_inn.o) \ $(LIBRARY)(em_ior.o) \ $(LIBRARY)(em_isar.o) \ $(LIBRARY)(em_lar2.o) \ $(LIBRARY)(em_lfr6.o) \ $(LIBRARY)(em_lfr8.o) \ $(LIBRARY)(em_loi.o) \ $(LIBRARY)(em_mli4.o) \ $(LIBRARY)(em_mon.o) \ $(LIBRARY)(em_nop.o) \ $(LIBRARY)(em_rck.o) \ $(LIBRARY)(em_ret6.o) \ $(LIBRARY)(em_ret8.o) \ $(LIBRARY)(em_retarea.o) \ $(LIBRARY)(em_return.o) \ $(LIBRARY)(em_rmi4.o) \ $(LIBRARY)(em_rmu4.o) \ $(LIBRARY)(em_sar2.o) \ $(LIBRARY)(em_sbi.o) \ $(LIBRARY)(em_set.o) \ $(LIBRARY)(em_stb.o) \ $(LIBRARY)(em_sti.o) \ $(LIBRARY)(em_stop.o) \ $(LIBRARY)(em_trp.o) \ $(LIBRARY)(em_unknown.o) \ $(LIBRARY)(em_vars.o) \ $(LIBRARY)(em_xor.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(em_adi.o): em_adi.s $(CC1) em_adi.s $(LIBRARY)(em_and.o): em_and.s $(CC1) em_and.s $(LIBRARY)(em_blm.o): em_blm.s $(CC1) em_blm.s $(LIBRARY)(em_cii.o): em_cii.s $(CC1) em_cii.s $(LIBRARY)(em_cmi4.o): em_cmi4.s $(CC1) em_cmi4.s $(LIBRARY)(em_cms.o): em_cms.s $(CC1) em_cms.s $(LIBRARY)(em_cmu4.o): em_cmu4.s $(CC1) em_cmu4.s $(LIBRARY)(em_com.o): em_com.s $(CC1) em_com.s $(LIBRARY)(em_csa2.o): em_csa2.s $(CC1) em_csa2.s $(LIBRARY)(em_csa4.o): em_csa4.s $(CC1) em_csa4.s $(LIBRARY)(em_csb2.o): em_csb2.s $(CC1) em_csb2.s $(LIBRARY)(em_csb4.o): em_csb4.s $(CC1) em_csb4.s $(LIBRARY)(em_cuu.o): em_cuu.s $(CC1) em_cuu.s $(LIBRARY)(em_dup.o): em_dup.s $(CC1) em_dup.s $(LIBRARY)(em_dvi4.o): em_dvi4.s $(CC1) em_dvi4.s $(LIBRARY)(em_dvu4.o): em_dvu4.s $(CC1) em_dvu4.s $(LIBRARY)(em_error.o): em_error.s $(CC1) em_error.s $(LIBRARY)(em_exg.o): em_exg.s $(CC1) em_exg.s $(LIBRARY)(em_fat.o): em_fat.s $(CC1) em_fat.s $(LIBRARY)(em_fp8087.o): em_fp8087.s $(CC1) em_fp8087.s $(LIBRARY)(em_gto.o): em_gto.s $(CC1) em_gto.s $(LIBRARY)(em_hol0.o): em_hol0.s $(CC1) em_hol0.s $(LIBRARY)(em_iaar.o): em_iaar.s $(CC1) em_iaar.s $(LIBRARY)(em_ilar.o): em_ilar.s $(CC1) em_ilar.s $(LIBRARY)(em_inn.o): em_inn.s $(CC1) em_inn.s $(LIBRARY)(em_ior.o): em_ior.s $(CC1) em_ior.s $(LIBRARY)(em_isar.o): em_isar.s $(CC1) em_isar.s $(LIBRARY)(em_lar2.o): em_lar2.s $(CC1) em_lar2.s $(LIBRARY)(em_lfr6.o): em_lfr6.s $(CC1) em_lfr6.s $(LIBRARY)(em_lfr8.o): em_lfr8.s $(CC1) em_lfr8.s $(LIBRARY)(em_loi.o): em_loi.s $(CC1) em_loi.s $(LIBRARY)(em_mli4.o): em_mli4.s $(CC1) em_mli4.s $(LIBRARY)(em_mon.o): em_mon.s $(CC1) em_mon.s $(LIBRARY)(em_nop.o): em_nop.s $(CC1) em_nop.s $(LIBRARY)(em_rck.o): em_rck.s $(CC1) em_rck.s $(LIBRARY)(em_ret6.o): em_ret6.s $(CC1) em_ret6.s $(LIBRARY)(em_ret8.o): em_ret8.s $(CC1) em_ret8.s $(LIBRARY)(em_retarea.o): em_retarea.s $(CC1) em_retarea.s $(LIBRARY)(em_return.o): em_return.s $(CC1) em_return.s $(LIBRARY)(em_rmi4.o): em_rmi4.s $(CC1) em_rmi4.s $(LIBRARY)(em_rmu4.o): em_rmu4.s $(CC1) em_rmu4.s $(LIBRARY)(em_sar2.o): em_sar2.s $(CC1) em_sar2.s $(LIBRARY)(em_sbi.o): em_sbi.s $(CC1) em_sbi.s $(LIBRARY)(em_set.o): em_set.s $(CC1) em_set.s $(LIBRARY)(em_stb.o): em_stb.s $(CC1) em_stb.s $(LIBRARY)(em_sti.o): em_sti.s $(CC1) em_sti.s $(LIBRARY)(em_stop.o): em_stop.s $(CC1) em_stop.s $(LIBRARY)(em_trp.o): em_trp.s $(CC1) em_trp.s $(LIBRARY)(em_unknown.o): em_unknown.s $(CC1) em_unknown.s $(LIBRARY)(em_vars.o): em_vars.s $(CC1) em_vars.s $(LIBRARY)(em_xor.o): em_xor.s $(CC1) em_xor.s .define .adi .text .adi: pop bx cmp cx,#2 jne 1f pop cx add ax,cx jmp (bx) 1: cmp cx,#4 jne 9f pop dx pop cx add ax,cx pop cx adc dx,cx push dx jmp (bx) 9: .extern .trpilin push bx jmp .trpilin .define .and ! #bytes in cx ! save di; it might be a register variable .text .and: pop bx ! return address mov dx,di mov di,sp add di,cx sar cx,#1 1: pop ax and ax,(di) stos loop 1b mov di,dx jmp (bx) .define .blm .text ! cx: count in words .blm: mov bx,sp mov ax,si mov dx,di mov di,2(bx) mov si,4(bx) rep mov mov si,ax mov di,dx ret 4 .define .cii .text .cii: pop bx ! return address ! pop cx, dest. size ! pop dx, src. size ! ax is first word of source cmp dx,#1 jne 2f cbw mov dx,#2 2: cmp dx,cx je 8f cmp dx,#2 je 1f cmp dx,#4 jne 9f cmp cx,#2 jne 9f pop dx 8: jmp (bx) 1: cmp cx,#4 jne 9f cwd push dx jmp (bx) 9: push ax ! push low source EILLINS = 18 .extern .fat mov ax,#EILLINS push ax jmp .fat .define .cmi4 .text .cmi4: pop bx ! return address pop cx pop dx pop ax push si mov si,sp xchg bx,2(si) pop si cmp bx,dx jg 1f jl 2f cmp ax,cx ja 1f je 3f 2: mov ax,#-1 ret 3: xor ax,ax ret 1: mov ax,#1 ret .define .cms ! #bytes in cx .text .cms: pop bx ! return address mov dx,sp push si push di mov si,dx add dx,cx mov di,dx add dx,cx sar cx,#1 repe cmp je 1f inc cx 1: pop di pop si mov sp,dx jmp (bx) .define .cmu4 .text .cmu4: pop bx ! return address pop cx pop dx pop ax push si mov si,sp xchg bx,2(si) pop si cmp bx,dx ja 1f jb 2f cmp ax,cx ja 1f je 3f 2: mov ax,#-1 ret 3: xor ax,ax ret 1: mov ax,#1 ret .define .com ! #bytes in cx .text .com: mov bx,sp inc bx inc bx sar cx,#1 1: not (bx) inc bx inc bx loop 1b ret .define .csa2 .text .csa2: ! bx, descriptor address ! ax, index mov dx,(bx) ! default sub ax,2(bx) cmp ax,4(bx) ja 1f sal ax,#1 add bx,ax mov bx,6(bx) test bx,bx jnz 2f 1: mov bx,dx test bx,bx jnz 2f ECASE = 20 .extern .fat mov ax,#ECASE push ax jmp .fat 2: jmp (bx) .sect .text; .sect .rom; .sect .data; .sect .bss .define .csa4 .sect .text .csa4: ! bx, descriptor address ! ax, dx: index mov cx,(bx) ! default sub ax,2(bx) ! ignore high order word; if non-zero, the ! case descriptor would not fit anyway cmp ax,6(bx) ja 1f 2: sal ax,#1 add bx,ax mov bx,10(bx) test bx,bx jnz 2f 1: mov bx,cx test bx,bx jnz 2f ECASE = 20 .extern .fat mov ax,#ECASE push ax jmp .fat 2: jmp (bx) .define .csb2 .text .csb2: !bx, descriptor address !ax, index mov dx,(bx) mov cx,2(bx) 1: add bx,#4 dec cx jl 4f cmp ax,(bx) jne 1b mov bx,2(bx) 2: test bx,bx jnz 3f ECASE = 20 .extern .fat mov ax,#ECASE push ax jmp .fat 3: jmp (bx) 4: mov bx,dx jmp 2b .sect .text; .sect .rom; .sect .data; .sect .bss .define .csb4 .sect .text .csb4: !bx: descriptor address !ax, dx: index push (bx) ! default mov cx,2(bx) ! count (ignore high order word, the descriptor ! would not fit anyway) 1: add bx,#6 dec cx jl 4f cmp ax,(bx) jne 1b cmp dx,2(bx) jne 1b pop bx mov bx,4(bx) 2: test bx,bx jnz 3f ECASE = 20 .extern .fat mov ax,#ECASE push ax jmp .fat 3: jmp (bx) 4: pop bx jmp 2b .define .ciu .define .cui .define .cuu .text .ciu: .cui: .cuu: pop bx ! return address ! pop cx, dest. size ! pop dx, source size ! ax is low word of source cmp dx,cx je 8f cmp dx,#2 je 1f cmp dx,#4 jne 9f cmp cx,#2 jne 9f pop dx 8: jmp (bx) 1: cmp cx,#4 jne 9f xor dx,dx push dx jmp (bx) 9: push ax ! to help debugging ? EILLINS = 18 .extern .fat mov ax,#EILLINS push ax jmp .fat .define .dup ! #bytes in cx .text .dup: pop bx ! return address mov ax,si mov dx,di mov si,sp sub sp,cx mov di,sp sar cx,#1 rep mov mov si,ax mov di,dx jmp (bx) .define .dvi4 yl=6 yh=8 xl=10 xh=12 .text .dvi4: push si push di mov si,sp ! copy of sp mov bx,yl(si) mov ax,yh(si) cwd mov di,dx cmp dx,ax jne 7f and dx,dx jge 1f neg bx je 7f 1: xor dx,dx mov cx,xl(si) mov ax,xh(si) and ax,ax jge 2f neg ax neg cx sbb ax,dx not di 2: div bx xchg ax,cx div bx ! cx = high abs(result), ax=low abs(result) 9: and di,di jge 1f neg cx neg ax sbb cx,#0 1: ! cx is high order result ! ax is low order result mov dx,cx pop di pop si ret 8 ! result in ax/dx 7: push dx ! sign of y mov di,ax xor bx,bx and di,di jge 1f neg di neg yl(si) sbb di,bx 1: mov ax,xl(si) mov dx,xh(si) and dx,dx jge 1f neg dx neg ax sbb dx,bx not -2(si) 1: mov cx,#16 1: shl ax,#1 rcl dx,#1 rcl bx,#1 cmp di,bx ja 3f jb 2f cmp yl(si),dx jbe 2f 3: loop 1b jmp 1f 2: sub dx,yl(si) sbb bx,di inc ax loop 1b 1: pop di ! di=sign of result,ax= result jmp 9b .define .dvu4 yl=6 yh=8 xl=10 xh=12 .text .dvu4: push si push di mov si,sp ! copy of sp mov bx,yl(si) mov ax,yh(si) or ax,ax jne 7f xor dx,dx mov cx,xl(si) mov ax,xh(si) div bx xchg ax,cx div bx 9: ! cx is high order result ! ax is low order result mov dx,cx pop di pop si ret 8 ! result in ax/dx 7: mov di,ax xor bx,bx mov ax,xl(si) mov dx,xh(si) mov cx,#16 1: shl ax,#1 rcl dx,#1 rcl bx,#1 cmp di,bx ja 3f jb 2f cmp yl(si),dx jbe 2f 3: loop 1b jmp 9b 2: sub dx,yl(si) sbb bx,di inc ax loop 1b jmp 9b .define ___stb .text ! Routine for copying structs. ___stb: mov bx,sp push si push di mov cx,2(bx) mov si,4(bx) mov di,6(bx) rep movb pop di pop si ret .define .error .define .Xtrp ! ax is trap number ! all registers must be saved ! because return is possible ! May only be called with error no's <16 .text .error: push bp push si push di push dx push cx push bx push ax mov cx,ax mov bx,#1 sal bx,cl .extern .ignmask .extern .trp test bx,.ignmask jne 2f call .trp 2: pop ax pop bx pop cx pop dx pop di pop si pop bp ret .Xtrp: cmp ax,#16 jge 1f call .error ret 1: jmp .trp .define .exg ! #bytes in cx .text .exg: push di mov sp,di add di,#4 mov bx,di add bx,cx sar cx,#1 1: mov ax,(bx) xchg ax,(di) mov (bx),ax add di,#2 add bx,#2 loop 1b 2: pop di ret .define .fat .text .fat: .extern .trp .extern .stop call .trp call .stop ! no return .define .adf4, .adf8, .sbf4, .sbf8, .mlf4, .mlf8, .dvf4, .dvf8 .define .ngf4, .ngf8, .fif4, .fif8, .fef4, .fef8 .define .cif4, .cif8, .cuf4, .cuf8, .cfi, .cfu, .cff4, .cff8 .define .cmf4, .cmf8 .sect .text; .sect .rom; .sect .data; .sect .bss ! $Header: fp8087.s,v 1.2 89/11/28 12:51:35 ceriel Exp $ ! Implement interface to floating point package for Intel 8087 .sect .rom one: .data2 1 two: .data2 2 bigmin: .data2 0, -32768 .sect .text .adf4: mov bx,sp wait flds 2(bx) wait fadds 6(bx) wait fstps 6(bx) wait ret .adf8: mov bx,sp wait fldd 2(bx) wait faddd 10(bx) wait fstpd 10(bx) wait ret .sbf4: mov bx,sp wait flds 6(bx) wait fsubs 2(bx) wait fstps 6(bx) wait ret .sbf8: mov bx,sp wait fldd 10(bx) wait fsubd 2(bx) wait fstpd 10(bx) wait ret .mlf4: mov bx,sp wait flds 2(bx) wait fmuls 6(bx) wait fstps 6(bx) wait ret .mlf8: mov bx,sp wait fldd 2(bx) wait fmuld 10(bx) wait fstpd 10(bx) wait ret .dvf4: mov bx,sp wait flds 6(bx) wait fdivs 2(bx) wait fstps 6(bx) wait ret .dvf8: mov bx,sp wait fldd 10(bx) wait fdivd 2(bx) wait fstpd 10(bx) wait ret .ngf4: mov bx,sp wait flds 2(bx) wait fchs wait fstps 2(bx) wait ret .ngf8: mov bx,sp wait fldd 2(bx) wait fchs wait fstpd 2(bx) wait ret .fif4: mov bx,sp push bx ! make room for FP status word wait flds 4(bx) wait fmuls 8(bx) ! multiply wait fld st ! copy result wait ftst ! test sign; handle negative separately wait fstsw -2(bx) wait mov ax,-2(bx) sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if <=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jbe 2f fisubs one ! else subtract 1 wait jmp 2f 1: ! here, negative case frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if >=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jae 2f fiadds one ! else add 1 wait 2: fsub st(1),st ! subtract integer part wait mov bx,2(bx) fstps (bx) wait fstps 4(bx) wait pop bx ret .fif8: mov bx,sp push bx ! make room for FP status word wait fldd 4(bx) wait fmuld 12(bx) ! multiply wait fld st ! and copy result wait ftst ! test sign; handle negative separately wait fstsw -2(bx) wait mov ax,-2(bx) sahf ! result of test in condition codes jb 1f frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if <=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jbe 2f fisubs one ! else subtract 1 wait jmp 2f 1: ! here, negative case frndint ! this one rounds (?) wait fcom st(1) ! compare with original; if >=, then OK wait fstsw -2(bx) wait mov ax,-2(bx) sahf jae 2f fiadds one ! else add 1 wait 2: fsub st(1),st ! subtract integer part mov bx,2(bx) fstpd (bx) wait fstpd 8(bx) wait pop bx ret .fef4: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,6(bx) and ax,#077600 je 1f ! zero exponent mov cx,#7 shr ax,cl sub ax,#126 mov cx,ax ! exponent in cx mov ax,6(bx) and ax,#0100177 or ax,#0037400 ! load -1 exponent mov dx,4(bx) mov bx,2(bx) mov 4(bx),ax mov 2(bx),dx mov (bx),cx ret 1: ! we get here on zero exp mov ax,6(bx) and ax,#0177 or ax,4(bx) jne 1f ! zero result xor ax,ax mov bx,2(bx) mov (bx),ax mov 2(bx),ax mov 4(bx),ax ret 1: ! otherwise unnormalized number mov cx,6(bx) and cx,#0100177 mov dx,cx and cx,#0x8000 mov ax,#-125 2: test dx,#0x80 jne 1f dec ax shl 4(bx),#1 rcl dx,#1 or dx,cx jmp 2b 1: mov cx,4(bx) mov bx,2(bx) mov (bx),ax mov 2(bx),cx and dx,#0100177 or dx,#0037400 ! load -1 exponent mov 4(bx),dx ret .fef8: ! this could be simpler, if only the ! fxtract instruction was emulated properly mov bx,sp mov ax,10(bx) and ax,#077760 je 1f ! zero exponent mov cx,#4 shr ax,cl sub ax,#1022 mov cx,ax ! exponent in cx mov ax,10(bx) and ax,#0100017 or ax,#0037740 ! load -1 exponent push 8(bx) push 6(bx) push 4(bx) mov bx,2(bx) pop 2(bx) pop 4(bx) pop 6(bx) mov 8(bx),ax mov (bx),cx ret 1: ! we get here on zero exp mov ax,10(bx) and ax,#017 or ax,8(bx) or ax,6(bx) or ax,4(bx) jne 1f ! zero result xor ax,ax mov bx,2(bx) mov (bx),ax mov 2(bx),ax mov 4(bx),ax mov 6(bx),ax mov 8(bx),ax ret 1: ! otherwise unnormalized number mov cx,10(bx) and cx,#0100017 mov dx,cx and cx,#0x8000 mov ax,#-1021 2: test dx,#0x10 jne 1f dec ax shl 4(bx),#1 rcl 6(bx),#1 rcl 8(bx),#1 rcl dx,#1 or dx,cx jmp 2b 1: and dx,#0100017 or dx,#0037740 ! load -1 exponent mov cx,8(bx) push 6(bx) push 4(bx) mov bx,2(bx) mov (bx),ax mov 8(bx),dx mov 6(bx),cx pop 2(bx) pop 4(bx) ret .cif4: mov bx,sp cmp 2(bx),#2 jne 1f wait filds 4(bx) wait fstps 2(bx) wait ret 1: wait fildl 4(bx) wait fstps 4(bx) wait ret .cif8: mov bx,sp cmp 2(bx),#2 jne 1f wait filds 4(bx) wait fstpd 2(bx) wait ret 1: wait fildl 4(bx) wait fstpd 2(bx) wait ret .cuf4: mov bx,sp cmp 2(bx),#2 jne 1f mov ax,4(bx) mov 2(bx),ax mov 4(bx),#0 wait fildl 2(bx) wait fstps 2(bx) wait ret 1: wait fildl 4(bx) wait cmp 6(bx),#0 jge 1f 2: wait fisubl bigmin wait fisubl bigmin 1: wait fstps 4(bx) wait ret .cuf8: mov bx,sp cmp 2(bx),#2 jne 1f mov 6(bx),#0 1: wait fildl 4(bx) wait cmp 6(bx),#0 jge 1f 2: wait fisubl bigmin wait fisubl bigmin 1: wait fstpd 2(bx) wait ret .cfi: mov bx,sp push bx wait fstcw -2(bx) wait mov dx,-2(bx) or -2(bx),#0xc00 ! truncating mode wait fldcw -2(bx) pop ax cmp 4(bx),#4 jne 2f ! loc 4 loc ? cfi wait flds 6(bx) wait fistpl 6(bx) wait cmp 2(bx),#2 jne 1f mov ax,6(bx) 1: mov 4(bx),dx wait fldcw 4(bx) wait ret 2: ! loc 8 loc ? cfi wait fldd 6(bx) wait fistpl 10(bx) wait cmp 2(bx),#2 jne 1b mov ax,10(bx) jmp 1b .cfu: mov bx,sp push bx wait fstcw -2(bx) wait mov dx,-2(bx) and -2(bx),#0xf3ff or -2(bx),#0x400 ! to -infinity wait fldcw -2(bx) wait pop ax cmp 4(bx),#4 jne 2f ! loc 4 loc ? cfu flds 6(bx) wait fabs ! ??? wait fiaddl bigmin fistpl 6(bx) wait mov ax,8(bx) sub ax,bigmin+2 mov 8(bx),ax cmp 2(bx),#2 jne 1f mov ax,6(bx) 1: mov 4(bx),dx wait fldcw 4(bx) wait ret 2: wait ! loc 8 loc ? cfu fldd 6(bx) wait fabs ! ??? wait fiaddl bigmin fistpl 10(bx) wait mov ax,12(bx) sub ax,bigmin+2 mov 12(bx),ax cmp 2(bx),#2 jne 1b mov ax,10(bx) jmp 1b .cff4: mov bx,sp wait fldd 2(bx) wait fstcw 2(bx) wait mov dx,2(bx) and 2(bx),#0xf3ff ! set to rounding mode wait fldcw 2(bx) wait fstps 6(bx) mov 2(bx),dx wait fldcw 2(bx) wait ret .cff8: mov bx,sp wait flds 2(bx) wait fstpd 2(bx) wait ret .cmf4: mov bx,sp push bx ! room for 8087 status word xor cx,cx wait flds 6(bx) wait flds 2(bx) wait fcompp ! compare and pop operands wait fstsw -2(bx) wait mov ax,-2(bx) sahf je 1f jb 2f dec cx jmp 1f 2: inc cx 1: mov ax,cx pop bx ret .cmf8: mov bx,sp push bx ! room for 8087 status word xor cx,cx wait fldd 10(bx) wait fldd 2(bx) wait fcompp ! compare and pop operands wait fstsw -2(bx) wait mov ax,-2(bx) sahf je 1f jb 2f dec cx jmp 1f 2: inc cx 1: mov ax,cx pop bx ret 70.define .gto .text .gto: mov bp,4(bx) mov sp,2(bx) jmp @(bx) .define hol0 .data hol0: .data2 0, 0 .data2 0, 0 .define .iaar .text .iaar: pop cx pop dx cmp dx,#2 .extern .unknown jne .unknown pop bx ! descriptor address pop ax ! index sub ax,(bx) mul 4(bx) pop bx ! array base add bx,ax push cx ret .define .ilar .text .ilar: pop cx pop dx .extern .unknown cmp dx,#2 jne .unknown pop bx ! descriptor address pop ax ! index push cx .extern .lar2 jmp .lar2 .define .inn .text ! #bytes in cx ! bit # in ax .inn: xor dx,dx mov bx,#8 div bx mov bx,sp add bx,#2 add bx,ax cmp ax,cx jae 1f movb al,(bx) mov bx,dx testb al,bits(bx) jz 1f mov ax,#1 jmp 2f 1: xor ax,ax 2: pop bx add sp,cx ! ax is result jmp (bx) .data bits: .data1 1,2,4,8,16,32,64,128 .define .ior .text ! #bytes in cx .ior: pop bx ! return address mov dx,di mov di,sp add di,cx sar cx,#1 1: pop ax or ax,(di) stos loop 1b mov di,dx jmp (bx) .define .isar .text .isar: pop cx pop ax cmp ax,#2 .extern .unknown jne .unknown pop bx ! descriptor address pop ax ! index push cx .extern .sar2 jmp .sar2 .define .lar2 .text .lar2: ! bx, descriptor address ! ax, index pop cx pop dx ! base address push cx push si mov si,dx sub ax,(bx) mov cx,4(bx) imul cx add si,ax sar cx,#1 jnb 1f xorb ah,ah lodsb pop si pop bx push ax jmp (bx) 1: pop dx ! saved si mov ax,4(bx) pop bx ! return address sub sp,ax mov ax,di ! save di mov di,sp rep mov mov di,ax mov si,dx jmp (bx) .define .lfr6 .text .extern .retarea .lfr6: pop bx push .retarea+4 push .retarea+2 push .retarea jmp (bx) .define .lfr8 .text .extern .retarea .lfr8: pop bx push .retarea+6 push .retarea+4 push .retarea+2 push .retarea jmp (bx) .define .loi .define .los .text ! #bytes in cx ! address in bx ! save si/di. they might be register variables .los: mov dx,si mov si,bx pop bx mov ax,cx sar cx,#1 jnb 1f xorb ah,ah lodsb mov si,dx push ax jmp (bx) 1: sub sp,ax jmp 1f .loi: ! only called with size > 4 mov dx,si mov si,bx pop bx sub sp,cx sar cx,#1 1: mov ax,di mov di,sp rep mov mov si,dx mov di,ax jmp (bx) .define .mli4 .text yl=2 yh=4 ! x * y ! xl in ax ! xh in dx .mli4: mov bx,sp push dx mov cx,ax mul yh(bx) ! xl*yh pop dx push ax mov ax,dx mul yl(bx) ! xh * yl pop dx add dx,ax ! xh*yl+xl*yh mov ax,cx mov cx,dx mul yl(bx) ! xl*yl add dx,cx ret 4 .define .mon .text .mon: .extern .stop call .stop .define .nop .text .nop: ret .define .rck .text ! descriptor address in bx ! value in ax, must be left there .rck: cmp ax,(bx) jl 2f cmp ax,2(bx) jg 2f ret 2: push ax ERANGE = 1 .extern .error mov ax,#ERANGE call .error pop ax ret .define .ret6 .text .extern .retarea .ret6: pop bx pop .retarea pop .retarea+2 pop .retarea+4 jmp (bx) .define .ret8 .text .extern .retarea .ret8: pop bx pop .retarea pop .retarea+2 pop .retarea+4 pop .retarea+6 jmp (bx) .define .retarea .bss .retarea: .zerow 8/2 .define .sdret, .dsret, .sret, .dret, .cret .text .dsret: pop di .sret: pop si .cret: mov sp,bp pop bp ret .sdret: pop si .dret: pop di jmp .cret .define .rmi4 .text yl=6 yh=8 xl=10 xh=12 .rmi4: push si push di mov si,sp ! copy of sp mov bx,yl(si) mov ax,yh(si) cwd cmp dx,ax jne 7f and dx,dx jge 1f neg bx je 7f 1: xor dx,dx mov cx,xl(si) mov ax,xh(si) and ax,ax jge 2f neg ax neg cx sbb ax,dx 2: div bx xchg ax,cx div bx ! dx= result(low), 0=result(high) xor bx,bx 9: cmp xh(si),#0 jge 1f neg bx neg dx sbb bx,#0 1: ! bx is high order result ! dx is low order result mov ax,dx mov dx,bx ! result in ax/dx pop di pop si ret 8 7: mov di,ax xor bx,bx and di,di jge 1f neg di neg yl(si) sbb di,bx 1: mov ax,xl(si) mov dx,xh(si) and dx,dx jge 1f neg dx neg ax sbb dx,bx 1: mov cx,#16 1: shl ax,#1 rcl dx,#1 rcl bx,#1 cmp di,bx ja 3f jb 2f cmp yl(si),dx jbe 2f 3: loop 1b ! dx=result(low), bx=result(high) jmp 9b 2: sub dx,yl(si) sbb bx,di inc ax loop 1b 1: ! dx=result(low), bx=result(high) jmp 9b .define .rmu4 .text yl=6 yh=8 xl=10 xh=12 .rmu4: push si push di mov si,sp ! copy of sp mov bx,yl(si) mov ax,yh(si) or ax,ax jne 7f 1: xor dx,dx mov cx,xl(si) mov ax,xh(si) 2: div bx xchg ax,cx div bx xor bx,bx 9: ! bx is high order result ! dx is low order result mov ax,dx mov dx,bx pop di pop si ret 8 ! result in ax/dx 7: mov di,ax xor bx,bx mov ax,xl(si) mov dx,xh(si) mov cx,#16 1: shl ax,#1 rcl dx,#1 rcl bx,#1 cmp di,bx ja 3f jb 2f cmp yl(si),dx jbe 2f 3: loop 1b ! dx=result(low), bx=result(high) jmp 9b 2: sub dx,yl(si) sbb bx,di inc ax loop 1b 1: ! dx=result(low), bx=result(high) jmp 9b .define .sar2 .text .sar2: ! bx, descriptor address ! ax, index pop cx pop dx ! base address push cx xchg di,dx ! di = base address, dx is saved di sub ax,(bx) mov cx,4(bx) push dx imul cx pop dx add di,ax sar cx,#1 jnb 1f pop bx pop ax stosb mov di,dx jmp (bx) 1: pop bx mov ax,si mov si,sp rep mov mov sp,si mov si,ax mov di,dx jmp (bx) .define .sbi .text ! #bytes in cx , top of stack in ax .sbi: pop bx ! return subress cmp cx,#2 jne 1f pop cx sub ax,cx neg ax jmp (bx) 1: cmp cx,#4 jne 9f pop dx pop cx sub cx,ax mov ax,cx pop cx sbb cx,dx push cx jmp (bx) 9: .extern .trpilin push bx jmp .trpilin .define .set .text ! #bytes in cx ! bit # in ax .set: pop bx ! return address xor dx,dx !ifdef create set sub sp,cx push bx push di mov bx,sp xor di,di sar cx,#1 1: mov 4(bx)(di),dx inc di inc di loop 1b !endif mov bx,#8 div bx cmp ax,di jae 2f mov di,dx movb dl,bits(di) mov di,sp add di,ax orb 4(di),dl pop di ret 2: ESET = 2 .extern .error pop di mov ax,#ESET call .error ret .data bits: .data1 1,2,4,8,16,32,64,128 .define .sti .define .sts .text ! #bytes in cx ! address in bx ! save di/si. they might be register variables .sts: mov dx,di ! save di mov di,bx pop bx ! return address sar cx,#1 jnb 1f pop ax stosb mov di,dx jmp (bx) .sti: ! only called with count > 4 mov dx,di mov di,bx pop bx sar cx,#1 1: mov ax,si mov si,sp rep mov mov sp,si mov di,dx mov si,ax jmp (bx) .define .stop .text .stop: call __exit .define .trpdivz .define .trpilin .define .trpcase .define .trprang .define .trpset .define .trpnofp .define .trpheap .define .trp .bss .M: .zerow 24/2 .text .extern .trpdivz .extern .trpilin .extern .trpcase .extern .trprang .extern .trpset .extern .trpnofp .extern .trpheap .extern .trp .trpdivz: mov ax,#6 mov dx,#.Mdivz jmp .Trp .trpilin: mov ax,#18 mov dx,#.Milin jmp .Trp .trpcase: mov ax,#20 mov dx,#.Mcase jmp .Trp .trprang: mov ax,#1 mov dx,#.Mrang jmp .Trp .trpset: mov ax,#2 mov dx,#.Mset jmp .Trp .trpnofp: mov ax,#18 mov dx,#.Mnofp jmp .Trp .trpheap: mov ax,#17 mov dx,#.Mheap jmp .Trp .Trp: xor bx,bx .extern .trppc xchg bx,.trppc test bx,bx jz 2f push ax call (bx) pop ax ret 2: mov bx,#22 push bx push dx mov ax,#2 push ax call .Write call __exit .trp: mov dx,ax cmp dx,#21 jae 1f sal dx,#1 mov bx,#.Mtable add bx,dx mov bx,(bx) test bx,bx jz 1f mov dx,bx jmp 2f 1: mov bx,#.Mtrp+14 mov cx,#6 mov dx,ax 1: and dx,#7 add dx,'0' movb (bx),dl dec bx sar dx,#1 sar dx,#1 sar dx,#1 loop 1b mov dx,#.Mtrp 2: jmp .Trp .Write: push bp mov bp,sp mov .M+2,#4 mov bx,4(bp) mov .M+4,bx mov bx,8(bp) mov .M+6,bx mov bx,6(bp) mov .M+10,bx mov ax,#.M push ax mov ax,#1 push ax mov ax,#1 mov bx,#.M mov cx,#3 int 32 mov sp,bp pop bp ret .data .Mtable: .data2 0, .Mrang, .Mset, 0, 0, 0, .Mdivz, 0 .data2 0, 0, 0, 0, 0, 0, 0, 0 .data2 0, .Mheap, .Milin, .Milin, .Mcase .Mdivz: .asciz "Error: Division by 0 \n" .Milin: .asciz "Illegal EM instruct'n\n" .Mcase: .asciz "Err in EM case instr \n" .Mrang: .asciz "Variable out of range\n" .Mset: .asciz "Err in EM set instr \n" .Mnofp: .asciz "Floating pt not impl.\n" .Mheap: .asciz "Heap overflow \n" .Mtrp: .asciz "EM trap 0000000 octal\n" .define .unknown .text .extern .fat EILLINS = 18 .unknown: mov ax,#EILLINS push ax jmp .fat .define .reghp, .limhp, .ignmask, .trppc .extern .reghp, .limhp, .ignmask, .trppc .data .reghp: .data2 endbss .limhp: .data2 endbss .ignmask: .data2 1336 .trppc: .data2 0 .define .xor .text ! #bytes in cx .xor: pop bx ! return address mov dx,di mov di,sp add di,cx sar cx,#1 1: pop ax xor ax,(di) stos loop 1b mov di,dx jmp (bx) ...Makefilealloca.sget_bp.sgetprocessor.shton86.siolib.soneC_sum.s# Makefile for lib/i86/misc. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ncc CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(alloca.o) \ $(LIBRARY)(get_bp.o) \ $(LIBRARY)(getprocessor.o) \ $(LIBRARY)(hton86.o) \ $(LIBRARY)(iolib.o) \ $(LIBRARY)(oneC_sum.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(alloca.o): alloca.s $(CC1) alloca.s $(LIBRARY)(get_bp.o): get_bp.s $(CC1) get_bp.s $(LIBRARY)(getprocessor.o): getprocessor.s $(CC1) getprocessor.s $(LIBRARY)(hton86.o): hton86.s $(CC1) hton86.s $(LIBRARY)(iolib.o): iolib.s $(CC1) iolib.s $(LIBRARY)(oneC_sum.o): oneC_sum.s $(CC1) oneC_sum.s # ! alloca() - allocate space on the stack Author: Kees J. Bot ! 26 Jan 1994 #if __ACK__ /* BCC can't do alloca(), register saving is wrong. */ .text .define _alloca _alloca: pop cx ! Return address pop ax ! Bytes to allocate add ax, #2*2+1 ! Add space for two saved register variables andb al, #0xFE ! Align mov bx, sp ! Keep current sp sub sp, ax ! Lower stack mov ax, sp ! Return value push 2(bx) ! Push what is probably the saved si push (bx) ! Saved di ! Now ACK can still do: ! pop di; pop si; mov sp, bp; pop bp; ret push ax ! Dummy argument jmp (cx) #endif ! get_bp.s ! ! return BP in AX ! ! Created: Sep 7, 1992 by Philip Homburg .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define _get_bp _get_bp: mov ax, bp ret ! $PchId: get_bp.ack.s,v 1.3 1996/02/23 08:27:48 philip Exp $ ! getprocessor() - determine processor type Author: Kees J. Bot ! 26 Jan 1994 .text o32 = 0x66 ! 32 bit operand size prefix ! int getprocessor(void); ! Return 86, 186, 286, 386, 486, 586, ... .define _getprocessor _getprocessor: push bp mov bp, sp push sp ! see if pushed sp == sp pop ax cmp ax, sp jz new_processor mov cx, #0x0120 ! see if shifts are mod 32 shlb ch, cl ! zero tells if 86 mov ax, #86 jz got_processor mov ax, #186 jmp got_processor new_processor: ! see if high bits are set in saved IDT sub sp, #6 ! space for IDT ptr sidt -6(bp) ! save 3 word IDT ptr cmpb -1(bp), #0xFF ! top byte of IDT ptr is always FF on 286 mov ax, #286 je got_processor ! 386, 486, 586 and sp, #0xFFFC ! Align stack to avoid AC fault (needed?) mov cx, #0x0004 ! Try to flip the AC bit introduced on the 486 call flip mov ax, #386 ! 386 if it didn't react to "flipping" jz got_processor mov cx, #0x0020 ! Try to flip the ID bit introduced on the 586 call flip mov ax, #486 ! 486 if it didn't react jz got_processor .data1 o32 pushf .data1 o32 pusha ! Save the world .data1 o32 xor ax, ax inc ax ! eax = 1 .data1 0x0F, 0xA2 ! CPUID instruction tells the processor type andb ah, #0x0F ! Extract the family (5, 6, ...) movb al, ah movb ah, #100 mulb ah ! 500, 600, ... add ax, #86 ! 586, 686, ... mov bx, sp mov 7*4(bx), ax ! Pass ax through .data1 o32 popa .data1 o32 popf got_processor: mov sp, bp pop bp ret flip: push bx ! Save bx and realign stack to multiple of 4 .data1 o32 ! About to operate on a 32 bit object pushf ! Push eflags pop ax pop dx ! dx:ax = eflags mov bx, dx ! Save original eflags (high word only) xor dx, cx ! Flip the bit to test push dx push ax ! Push modified eflags value .data1 o32 popf ! Load modified eflags register .data1 o32 pushf pop ax pop dx ! Get it again push bx push ax .data1 o32 popf ! Restore original eflags register xor dx, bx ! See if the bit changed test dx, cx pop bx ! Restore bx ret ! htonX(), ntohX() - Host to network byte order conversion ! Author: Kees J. Bot ! 7 Jan 1997 ! ! This is a little endian 8086, so we swap bytes to/from the big endian network ! order. The normal macros are not used, they give lousy code. .text .define _htons, _ntohs _htons: _ntohs: mov bx, sp movb ah, 2(bx) ! Load bytes into ax in reverse order movb al, 3(bx) ret .define _htonl, _ntohl _htonl: _ntohl: mov bx, sp movb dh, 2(bx) ! Load bytes into dx:ax in reverse order movb dl, 3(bx) movb ah, 4(bx) movb al, 5(bx) ret ! Some I/O related routines like: ! unsigned char inb(int port); ! unsigned short inw(int port); ! void outb(int port, int value); ! void outw(int port, int value); ! void rep_inb(int port, unsigned char *buf, size_t count); ! void rep_inw(int port, unsigned short *buf, size_t count); ! void rep_outb(int port, unsigned char *buf, size_t count); ! void rep_outw(int port, unsigned short *buf, size_t count); ! void intr_enable(void); ! void intr_disable(void); .text .define _inb _inb: push bp mov bp, sp mov dx, 4(bp) ! port inb dx ! read 1 byte xorb ah, ah pop bp ret .define _inw _inw: push bp mov bp, sp mov dx, 4(bp) ! port in dx ! read 1 word pop bp ret .define _outb _outb: push bp mov bp, sp mov dx, 4(bp) ! port mov ax, 4+2(bp) ! value outb dx ! output 1 byte pop bp ret .define _outw _outw: push bp mov bp, sp mov dx, 4(bp) ! port mov ax, 4+2(bp) ! value out dx ! output 1 word pop bp ret .define _rep_inb _rep_inb: push bp mov bp, sp push di mov dx, 4(bp) ! port mov di, 6(bp) ! buf mov cx, 8(bp) ! byte count rep inb dx ! input many bytes pop di pop bp ret .define _rep_inw _rep_inw: push bp mov bp, sp push di mov dx, 4(bp) ! port mov di, 6(bp) ! buf mov cx, 8(bp) ! byte count shr cx, #1 ! word count rep in dx ! input many words pop di pop bp ret .define _rep_outb _rep_outb: push bp mov bp, sp push si mov dx, 4(bp) ! port mov si, 6(bp) ! buf mov cx, 8(bp) ! byte count rep outb dx ! output many bytes pop si pop bp ret .define _rep_outw _rep_outw: push bp mov bp, sp push si mov dx, 4(bp) ! port mov si, 6(bp) ! buf mov cx, 8(bp) ! byte count shr cx, #1 ! word count rep out dx ! output many words pop si pop bp ret .define _intr_disable _intr_disable: push bp mov bp, sp cli pop bp ret .define _intr_enable _intr_enable: push bp mov bp, sp sti pop bp ret ! oneC_sum() - One complement`s checksum Author: Kees J. Bot ! 23 May 1998 ! See RFC 1071, "Computing the Internet checksum" ! See also the C version of this code. .text .define _oneC_sum .align 4 _oneC_sum: push bp mov bp, sp push si push di mov ax, 4(bp) ! Checksum of previous block mov si, 6(bp) ! Data to compute checksum over mov di, 8(bp) ! Number of bytes xor dx, dx xorb cl, cl align: test si, #1 ! Is the data aligned? jz aligned test di, di jz 0f movb dh, (si) ! First unaligned byte in high half of dec di ! the dx register, i.e. rotate 8 bits 0: inc si movb cl, #8 ! Number of bits "rotated" ror ax, cl ! Rotate the checksum likewise aligned:add ax, dx ! Summate the unaligned byte adc ax, #0 ! Add carry back in for one`s complement jmp add6test .align 4 add6: add ax, (si) ! Six times unrolled loop, see below adc ax, 2(si) adc ax, 4(si) adc ax, 6(si) adc ax, 8(si) adc ax, 10(si) adc ax, #0 add si, #12 add6test: sub di, #12 jae add6 add di, #12 jmp add1test .align 4 add1: add ax, (si) ! while ((di -= 2) >= 0) adc ax, #0 ! ax += *si++; add si, #2 ! di += 2; add1test: sub di, #2 jae add1 add di, #2 jz done ! Is there an extra byte? movb dl, (si) ! Load extra byte in word xorb dh, dh add ax, dx ! Add in the last bits adc ax, #0 done: rol ax, cl ! Undo the rotation at the beginning pop di pop si pop bp ret ...Makefile__sigreturn.s_sendrec.sbrksize.sncrtso.snm2rtso.snprtso.s# Makefile for lib/i86/rts. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ncc CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: \ ../../ncrtso.o \ ../../nm2rtso.o \ ../../nprtso.o \ $(LIBRARY) ../../ncrtso.o: ncrtso.s $(CC1) -c ncrtso.s mv ncrtso.o $@ ../../nm2rtso.o: nm2rtso.s $(CC1) -c nm2rtso.s mv nm2rtso.o $@ ../../nprtso.o: nprtso.s $(CC1) -c nprtso.s mv nprtso.o $@ OBJECTS = \ $(LIBRARY)(__sigreturn.o) \ $(LIBRARY)(_sendrec.o) \ $(LIBRARY)(brksize.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(__sigreturn.o): __sigreturn.s $(CC1) __sigreturn.s $(LIBRARY)(_sendrec.o): _sendrec.s $(CC1) _sendrec.s $(LIBRARY)(brksize.o): brksize.s $(CC1) brksize.s ! This routine is the low-level code for returning from signals. ! It calls __sigreturn, which is the normal "system call" routine. ! Both ___sigreturn and __sigreturn are needed. .sect .text; .sect .rom; .sect .data; .sect .bss .sect .text .define ___sigreturn .extern __sigreturn ___sigreturn: add sp, #8 jmp __sigreturn .define __send, __receive, __sendrec ! See ../h/com.h for C definitions SEND = 1 RECEIVE = 2 BOTH = 3 SYSVEC = 32 !*========================================================================* ! _send and _receive * !*========================================================================* ! _send(), _receive(), _sendrec() all save bp, but destroy ax, bx, and cx. .extern __send, __receive, __sendrec __send: mov cx,*SEND ! _send(dest, ptr) jmp L0 __receive: mov cx,*RECEIVE ! _receive(src, ptr) jmp L0 __sendrec: mov cx,*BOTH ! _sendrec(srcdest, ptr) jmp L0 L0: push bp ! save bp mov bp,sp ! can't index off sp mov ax,4(bp) ! ax = dest-src mov bx,6(bp) ! bx = message pointer int SYSVEC ! trap to the kernel pop bp ! restore bp ret ! return .define __brksize .data .extern endbss, __brksize __brksize: .data2 endbss ! This is the C run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _main expects them. ! It also initializes _environ when this variable isn't defined by the ! programmer. The detection of whether _environ belong to us is rather ! simplistic. We simply check for some magic value, but there is no other ! way. .extern _main, _exit, crtso, __penviron, __penvp .extern begtext, begdata, begbss, endtext, enddata, endbss .text begtext: crtso: xor bp, bp ! clear for backtrace of core files mov bx, sp mov ax, (bx) ! argc lea dx, 2(bx) ! argv lea cx, 4(bx) add cx, ax add cx, ax ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov bx, #_environ cmp bx, #__edata ! within initialized data? jae 0f testb bl, #1 ! aligned? jnz 0f cmp (bx), #0x5353 ! is it our environ? jne 0f mov __penviron, bx ! _penviron = &environ; 0: mov bx, __penviron mov (bx), cx ! *_penviron = envp; push cx ! push envp push dx ! push argv push ax ! push argc call _main ! main(argc, argv, envp) push ax ! push exit status call _exit hlt ! force a trap if exit fails .data begdata: .data2 0 ! for sep I&D: *NULL == 0 __penviron: .data2 __penvp ! Pointer to environ, or hidden pointer .bss begbss: .comm __penvp, 2 ! Hidden environment vector ! This is the Modula-2 run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _m_a_i_n expects them. .extern __m_a_i_n, _exit, m2rtso, hol0, __penvp .extern begtext, begdata, begbss, endtext, enddata, endbss .text begtext: m2rtso: xor bp, bp ! clear for backtrace of core files mov bx, sp mov ax, (bx) ! argc lea dx, 2(bx) ! argv lea cx, 4(bx) add cx, ax add cx, ax ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov bx, #_environ cmp bx, #__edata ! within initialized data? jae 0f testb bl, #1 ! aligned? jnz 0f cmp (bx), #0x5353 ! is it our environ? jne 0f mov __penviron, bx ! _penviron = &environ; 0: mov bx, __penviron mov (bx), cx ! *_penviron = envp; push cx ! push envp push dx ! push argv push ax ! push argc call __m_a_i_n ! run Modula-2 program push ax ! push exit status call __exit hlt ! force a trap if exit fails .data begdata: .data2 0 ! for sep I&D: *NULL == 0 __penviron: .data2 __penvp ! Pointer to environ, or hidden pointer .bss begbss: .comm __penvp, 2 ! Hidden environment vector ! This is the Pascal run-time start-off routine. It's job is to take the ! arguments as put on the stack by EXEC, and to parse them and set them up the ! way _m_a_i_n expects them. .extern __m_a_i_n, _exit, prtso, hol0, __penvp .extern begtext, begdata, begbss, endtext, enddata, endbss .text begtext: prtso: xor bp, bp ! clear for backtrace of core files mov bx, sp mov ax, (bx) ! argc lea dx, 2(bx) ! argv lea cx, 4(bx) add cx, ax add cx, ax ! envp ! Test if environ is in the initialized data area and is set to our ! magic number. If so then it is not redefined by the user. mov bx, #_environ cmp bx, #__edata ! within initialized data? jae 0f testb bl, #1 ! aligned? jnz 0f cmp (bx), #0x5353 ! is it our environ? jne 0f mov __penviron, bx ! _penviron = &environ; 0: mov bx, __penviron mov (bx), cx ! *_penviron = envp; push cx ! push envp push dx ! push argv push ax ! push argc mov .ignmask, #56 call __m_a_i_n ! run Pascal program push ax ! push exit status call __exit hlt ! force a trap if exit fails .data begdata: .data2 0 ! for sep I&D: *NULL == 0 __penviron: .data2 __penvp ! Pointer to environ, or hidden pointer .bss begbss: .comm __penvp, 2 ! Hidden environment vector ...MakefileREADME_memmove.s_strncat.s_strncmp.s_strncpy.s_strnlen.sbcmp.sbcopy.sbzero.sindex.smemchr.smemcmp.smemcpy.smemmove.smemset.srindex.sstrcat.sstrchr.sstrcmp.sstrcpy.sstrlen.sstrncat.sstrncmp.sstrncpy.sstrnlen.sstrrchr.s# Makefile for lib/i86/string. CC1 = $(CC) -Was-ncc -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(_memmove.o) \ $(LIBRARY)(_strncat.o) \ $(LIBRARY)(_strncmp.o) \ $(LIBRARY)(_strncpy.o) \ $(LIBRARY)(_strnlen.o) \ $(LIBRARY)(bcmp.o) \ $(LIBRARY)(bcopy.o) \ $(LIBRARY)(bzero.o) \ $(LIBRARY)(index.o) \ $(LIBRARY)(memchr.o) \ $(LIBRARY)(memcmp.o) \ $(LIBRARY)(memcpy.o) \ $(LIBRARY)(memmove.o) \ $(LIBRARY)(memset.o) \ $(LIBRARY)(rindex.o) \ $(LIBRARY)(strcat.o) \ $(LIBRARY)(strchr.o) \ $(LIBRARY)(strcmp.o) \ $(LIBRARY)(strcpy.o) \ $(LIBRARY)(strlen.o) \ $(LIBRARY)(strncat.o) \ $(LIBRARY)(strncmp.o) \ $(LIBRARY)(strncpy.o) \ $(LIBRARY)(strnlen.o) \ $(LIBRARY)(strrchr.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(_memmove.o): _memmove.s $(CC1) _memmove.s $(LIBRARY)(_strncat.o): _strncat.s $(CC1) _strncat.s $(LIBRARY)(_strncmp.o): _strncmp.s $(CC1) _strncmp.s $(LIBRARY)(_strncpy.o): _strncpy.s $(CC1) _strncpy.s $(LIBRARY)(_strnlen.o): _strnlen.s $(CC1) _strnlen.s $(LIBRARY)(bcmp.o): bcmp.s $(CC1) bcmp.s $(LIBRARY)(bcopy.o): bcopy.s $(CC1) bcopy.s $(LIBRARY)(bzero.o): bzero.s $(CC1) bzero.s $(LIBRARY)(index.o): index.s $(CC1) index.s $(LIBRARY)(memchr.o): memchr.s $(CC1) memchr.s $(LIBRARY)(memcmp.o): memcmp.s $(CC1) memcmp.s $(LIBRARY)(memcpy.o): memcpy.s $(CC1) memcpy.s $(LIBRARY)(memmove.o): memmove.s $(CC1) memmove.s $(LIBRARY)(memset.o): memset.s $(CC1) memset.s $(LIBRARY)(rindex.o): rindex.s $(CC1) rindex.s $(LIBRARY)(strcat.o): strcat.s $(CC1) strcat.s $(LIBRARY)(strchr.o): strchr.s $(CC1) strchr.s $(LIBRARY)(strcmp.o): strcmp.s $(CC1) strcmp.s $(LIBRARY)(strcpy.o): strcpy.s $(CC1) strcpy.s $(LIBRARY)(strlen.o): strlen.s $(CC1) strlen.s $(LIBRARY)(strncat.o): strncat.s $(CC1) strncat.s $(LIBRARY)(strncmp.o): strncmp.s $(CC1) strncmp.s $(LIBRARY)(strncpy.o): strncpy.s $(CC1) strncpy.s $(LIBRARY)(strnlen.o): strnlen.s $(CC1) strnlen.s $(LIBRARY)(strrchr.o): strrchr.s $(CC1) strrchr.s Notes on i8086 string assembly routines. Author: Kees J. Bot 27 Jan 1994 These routines are simply translations of the 386 code, so all comments to that code apply here. ! _memmove() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *_memmove(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! .sect .text .define __memmove, __memcpy __memmove: push bp mov bp, sp push si push di mov di, 4(bp) ! String s1 mov si, 6(bp) ! String s2 mov cx, 8(bp) ! Length mov ax, di sub ax, si cmp ax, cx jb downwards ! if (s2 - s1) < n then copy downwards __memcpy: cld ! Clear direction bit: upwards cmp cx, #16 jb upbyte ! Don't bother being smart with short arrays mov ax, si or ax, di testb al, #1 jnz upbyte ! Bit 0 set, use byte copy upword: shr cx, #1 rep movs ! Copy words adc cx, cx ! One more byte? upbyte: rep movsb ! Copy bytes done: mov ax, 4(bp) ! Absolutely noone cares about this value pop di pop si pop bp ret ! Handle bad overlap by copying downwards, don't bother to do word copies. downwards: std ! Set direction bit: downwards add si, cx dec si add di, cx dec di rep movsb ! Copy bytes cld jmp done ! _strncat() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *_strncat(char *s1, const char *s2, size_t dx) ! Append string s2 to s1. ! .sect .text .define __strncat __strncat: push bp mov bp, sp push si push di mov di, 4(bp) ! String s1 mov cx, #-1 xorb al, al ! Null byte cld repne scasb ! Look for the zero byte in s1 dec di ! Back one up (and clear 'Z' flag) push di ! Save end of s1 mov di, 6(bp) ! di = string s2 mov cx, dx ! Maximum count repne scasb ! Look for the end of s2 jne no0 inc cx ! Exclude null byte no0: sub dx, cx ! Number of bytes in s2 mov cx, dx mov si, 6(bp) ! si = string s2 pop di ! di = end of string s1 rep movsb ! Copy bytes stosb ! Add a terminating null mov ax, 4(bp) ! Return s1 pop di pop si pop bp ret ! strncmp() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strncmp(const char *s1, const char *s2, size_t cx) ! Compare two strings. ! .sect .text .define __strncmp __strncmp: push bp mov bp, sp push si push di xor ax, ax ! Prepare return value test cx, cx ! Max length is zero? je equal mov si, 4(bp) ! si = string s1 mov di, 6(bp) ! di = string s2 cld compare: cmpsb ! Compare two bytes jne unequal cmpb -1(si), #0 ! End of string? je equal dec cx ! Length limit reached? jne compare jmp equal unequal: ja after sub ax, #2 ! if (s1 < s2) ax -= 2; after: inc ax ! ax++, now it's -1 or 1 equal: pop di pop si pop bp ret ! _strncpy() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *_strncpy(char *s1, const char *s2, size_t cx) ! Copy string s2 to s1. ! .sect .text .define __strncpy __strncpy: mov di, 6(bp) ! di = string s2 xorb al, al ! Look for a zero byte mov dx, cx ! Save maximum count cld repne scasb ! Look for end of s2 sub dx, cx ! Number of bytes in s2 including null xchg cx, dx mov si, 6(bp) ! si = string s2 mov di, 4(bp) ! di = string s1 rep movsb ! Copy bytes ret ! _strnlen() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t _strnlen(const char *s, size_t cx) ! Return the length of a string. ! .sect .text .define __strnlen __strnlen: push bp mov bp, sp push di mov di, 4(bp) ! di = string xorb al, al ! Look for a zero byte mov dx, cx ! Save maximum count cmpb cl, #1 ! 'Z' bit must be clear if cx = 0 cld repne scasb ! Look for zero jne no0 inc cx ! Don't count zero byte no0: mov ax, dx sub ax, cx ! Compute bytes scanned pop di pop bp ret ! bcmp() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int bcmp(const void *s1, const void *s2, size_t n) ! Compare two chunks of memory. ! This is a BSD routine that escaped from the kernel. Don't use. ! (Alas it is not without some use, it reports the number of bytes ! after the bytes that are equal. So it can't be simply replaced.) ! .sect .text .define _bcmp _bcmp: push bp mov bp, sp push 8(bp) push 6(bp) push 4(bp) call _memcmp ! Let memcmp do the work mov sp, bp test ax, ax jz equal sub dx, 4(bp) ! Memcmp was nice enough to leave "si" in dx dec dx ! Number of bytes that are equal mov ax, 8(bp) sub ax, dx ! Number of bytes that are unequal equal: pop bp ret ! bcopy() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void bcopy(const void *s1, void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! This is a BSD routine that escaped from the kernel. Don't use. ! .sect .text .define _bcopy .extern __memmove _bcopy: pop cx pop ax pop dx ! Pop return address and arguments push ax push dx ! Arguments reversed push cx jmp __memmove ! Call the proper routine ! bzero() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void bzero(void *s, size_t n) ! Set a chunk of memory to zero. ! This is a BSD routine that escaped from the kernel. Don't use. ! .sect .text .define _bzero _bzero: push bp mov bp, sp push 6(bp) ! Size xor ax, ax push ax ! Zero push 4(bp) ! String call _memset ! Call the proper routine mov sp, bp pop bp ret ! index() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *index(const char *s, int c) ! Look for a character in a string. Has suffered from a hostile ! takeover by strchr(). ! .sect .text .define _index _index: jmp _strchr ! memchr() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memchr(const void *s, int c, size_t n) ! Look for a character in a chunk of memory. ! .sect .text .define _memchr _memchr: push bp mov bp, sp push di mov di, 4(bp) ! di = string movb al, 6(bp) ! The character to look for mov cx, 8(bp) ! Length cmpb cl, #1 ! 'Z' bit must be clear if cx = 0 cld repne scasb jne failure lea ax, -1(di) ! Found pop di pop bp ret failure:xor ax, ax pop di pop bp ret ! memcmp() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int memcmp(const void *s1, const void *s2, size_t n) ! Compare two chunks of memory. ! .sect .text .define _memcmp _memcmp: cld push bp mov bp, sp push si push di xor ax, ax ! Prepare return value mov si, 4(bp) ! String s1 mov di, 6(bp) ! String s2 mov cx, 8(bp) ! Length cmp cx, #16 jb cbyte ! Don't bother being smart with short arrays mov dx, si or dx, di andb dl, #1 jnz cbyte ! Bit 0 set, use byte compare cword: sar cx, #1 adcb dl, dl ! Save carry repe cmps ! Compare words mov cx, #2 ! Recompare the last word sub si, cx sub di, cx addb cl, dl ! One more byte? cbyte: test cx, cx ! Set 'Z' flag if cx = 0 last: repe cmpsb ! Look for the first differing byte je equal ja after sub ax, #2 ! if (s1 < s2) ax -= 2; after: inc ax ! ax++, now it's -1 or 1 equal: mov dx, si ! For bcmp() to play with pop di pop si pop bp ret ! memcpy() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memcpy(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. ! This routine need not handle overlap, so it does not handle overlap. ! One could simply call __memmove, the cost of the overlap check is ! negligible, but you are dealing with a programmer who believes that ! if anything can go wrong, it should go wrong. ! .sect .text .define _memcpy _memcpy: push bp mov bp, sp push si push di mov di, 4(bp) ! String s1 mov si, 6(bp) ! String s2 mov cx, 8(bp) ! Length ! No overlap check here jmp __memcpy ! Call the part of __memmove that copies up ! memmove() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memmove(void *s1, const void *s2, size_t n) ! Copy a chunk of memory. Handle overlap. ! .sect .text .define _memmove _memmove: jmp __memmove ! Call common code ! memset() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! void *memset(void *s, int c, size_t n) ! Set a chunk of memory to the same byte value. ! .sect .text .define _memset _memset: push bp mov bp, sp push di mov di, 4(bp) ! The string movb al, 6(bp) ! The fill byte mov cx, 8(bp) ! Length cld cmp cx, #16 jb sbyte ! Don't bother being smart with short arrays test di, #1 jnz sbyte ! Bit 0 set, use byte store sword: movb ah, al ! One byte to two bytes sar cx, #1 rep stos ! Store words adc cx, cx ! One more byte? sbyte: rep stosb ! Store bytes done: mov ax, 4(bp) ! Return some value you have no need for pop di pop bp ret ! rindex() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *rindex(const char *s, int c) ! Look for the last occurrence a character in a string. Has suffered ! from a hostile takeover by strrchr(). ! .sect .text .define _rindex _rindex: jmp _strrchr ! strcat() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strcat(char *s1, const char *s2) ! Append string s2 to s1. ! .sect .text .define _strcat _strcat: mov dx, #-1 ! Unlimited length jmp __strncat ! Common code ! strchr() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strchr(const char *s, int c) ! Look for a character in a string. ! .sect .text .define _strchr _strchr: push bp mov bp, sp push di cld mov di, 4(bp) ! di = string mov dx, #16 ! Look at small chunks of the string next: shl dx, #1 ! Chunks become bigger each time mov cx, dx xorb al, al ! Look for the zero at the end repne scasb pushf ! Remember the flags sub cx, dx neg cx ! Some or all of the chunk sub di, cx ! Step back movb al, 6(bp) ! The character to look for repne scasb je found popf ! Did we find the end of string earlier? jne next ! No, try again xor ax, ax ! Return NULL pop di pop bp ret found: pop ax ! Get rid of those flags lea ax, -1(di) ! Address of byte found pop di pop bp ret ! strcmp() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strcmp(const char *s1, const char *s2) ! Compare two strings. ! .sect .text .define _strcmp _strcmp: mov cx, #-1 ! Unlimited length jmp __strncmp ! Common code ! strcpy() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strcpy(char *s1, const char *s2) ! Copy string s2 to s1. ! .sect .text .define _strcpy _strcpy: push bp mov bp, sp push si push di mov cx, #-1 ! Unlimited length call __strncpy ! Common code mov ax, 4(bp) ! Return s1 pop di pop si pop bp ret ! strlen() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strlen(const char *s) ! Return the length of a string. ! .sect .text .define _strlen _strlen: mov cx, #-1 ! Unlimited length jmp __strnlen ! Common code ! strncat() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strncat(char *s1, const char *s2, size_t n) ! Append string s2 to s1. ! .sect .text .define _strncat _strncat: mov bx, sp mov dx, 6(bx) ! Maximum length jmp __strncat ! Common code ! strncmp() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! int strncmp(const char *s1, const char *s2, size_t n) ! Compare two strings. ! .sect .text .define _strncmp _strncmp: mov bx, sp mov cx, 6(bx) ! Maximum length jmp __strncmp ! Common code ! strncpy() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strncpy(char *s1, const char *s2, size_t n) ! Copy string s2 to s1. ! .sect .text .define _strncpy _strncpy: push bp mov bp, sp push si push di mov cx, 8(bp) ! Maximum length call __strncpy ! Common code mov cx, dx ! Number of bytes not copied rep stosb ! strncpy always copies n bytes by null padding mov ax, 4(bp) ! Return s1 pop di pop si pop bp ret ! strnlen() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! size_t strnlen(const char *s, size_t n) ! Return the length of a string. ! .sect .text .define _strnlen _strnlen: mov bx, sp mov cx, 4(bx) ! Maximum length jmp __strnlen ! Common code ! strrchr() Author: Kees J. Bot ! 27 Jan 1994 .sect .text; .sect .rom; .sect .data; .sect .bss ! char *strrchr(const char *s, int c) ! Look for the last occurrence a character in a string. ! .sect .text .define _strrchr _strrchr: push bp mov bp, sp push di mov di, 4(bp) ! di = string mov cx, #-1 xorb al, al cld repne scasb ! Look for the end of the string not cx ! -1 - cx = Length of the string + null dec di ! Put di back on the zero byte movb al, 6(bp) ! The character to look for std ! Downwards search repne scasb cld ! Direction bit back to default jne failure lea ax, 1(di) ! Found it pop di pop bp ret failure:xor ax, ax ! Not there pop di pop bp ret ...add64.sadd64u.scmp64.scv64u.scvu64.sdiff64.sdiv64u.sex64.smake64.smul64u.ssub64.ssub64u.sMakefile! add64() - 64 bit addition Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _add64 _add64: ! u64_t add64(u64_t i, u64_t j); push bp mov bp, sp mov bx, 4(bp) mov ax, 6(bp) add ax, 14(bp) mov (bx), ax mov ax, 8(bp) adc ax, 16(bp) mov 2(bx), ax mov ax, 10(bp) adc ax, 18(bp) mov 4(bx), ax mov ax, 12(bp) adc ax, 20(bp) mov 6(bx), ax mov ax, bx pop bp ret ! add64u() - unsigned to 64 bit addition Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _add64u, _add64ul _add64u: ! u64_t add64u(u64_t i, unsigned j); push bp mov bp, sp xor cx, cx jmp 0f _add64ul: ! u64_t add64ul(u64_t i, unsigned long j); push bp mov bp, sp mov cx, 16(bp) 0: mov bx, 4(bp) mov ax, 6(bp) add ax, 14(bp) mov (bx), ax mov ax, 8(bp) adc ax, cx mov 2(bx), ax mov ax, 10(bp) adc ax, #0 mov 4(bx), ax mov ax, 12(bp) adc ax, #0 mov 6(bx), ax mov ax, bx pop bp ret ! cmp64*() - 64 bit compare Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _cmp64, _cmp64u, _cmp64ul _cmp64: ! int cmp64(u64_t i, u64_t j); mov bx, sp cmp64: xor ax, ax mov dx, 2(bx) sub dx, 10(bx) mov dx, 4(bx) sbb dx, 12(bx) mov dx, 6(bx) sbb dx, 14(bx) mov dx, 8(bx) sbb dx, 16(bx) sbb ax, ax ! ax = - (i < j) mov dx, 10(bx) sub dx, 2(bx) mov dx, 12(bx) sbb dx, 4(bx) mov dx, 14(bx) sbb dx, 6(bx) mov dx, 16(bx) sbb dx, 8(bx) adc ax, #0 ! ax = (i > j) - (i < j) ret _cmp64u: ! int cmp64u(u64_t i, unsigned j); mov bx, sp push 16(bx) mov 16(bx), #0 push 14(bx) mov 14(bx), #0 push 12(bx) mov 12(bx), #0 call cmp64 pop 12(bx) pop 14(bx) pop 16(bx) ret _cmp64ul: ! int cmp64ul(u64_t i, unsigned long j); mov bx, sp push 14(bx) mov 14(bx), #0 push 12(bx) mov 12(bx), #0 call cmp64 pop 12(bx) pop 14(bx) ret ! cv64u() - 64 bit converted to unsigned Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _cv64u, _cv64ul _cv64u: ! unsigned cv64u(u64_t i); mov bx, sp mov cx, 4(bx) jmp 0f _cv64ul: ! unsigned long cv64ul(u64_t i); mov bx, sp xor cx, cx 0: mov ax, 2(bx) mov dx, 4(bx) or cx, 6(bx) or cx, 8(bx) ! return UINT/ULONG_MAX if really big jz 0f mov ax, #-1 mov dx, ax 0: ret ! cvu64() - unsigned converted to 64 bit Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _cvu64, _cvul64 _cvu64: ! u64_t cvu64(unsigned i); mov bx, sp xor dx, dx jmp 0f _cvul64: ! u64_t cvul64(unsigned long i); mov bx, sp mov dx, 6(bx) 0: mov ax, 4(bx) mov bx, 2(bx) mov (bx), ax mov 2(bx), dx mov 4(bx), #0 mov 6(bx), #0 mov ax, bx ret ! diff64() - 64 bit subtraction giving unsigned Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _diff64 _diff64: ! unsigned diff64(u64_t i, u64_t j); mov bx, sp mov ax, 2(bx) sub ax, 10(bx) ret ! div64u() - 64 bit divided by unsigned giving unsigned long ! Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _div64u, _rem64u _div64u: ! unsigned long div64u(u64_t i, unsigned j); mov bx, sp div64u: xor dx, dx mov ax, 8(bx) div 10(bx) mov ax, 6(bx) div 10(bx) mov ax, 4(bx) div 10(bx) ! division bits 16-31 mov cx, ax mov ax, 2(bx) div 10(bx) ! division bits 0-15 xchg dx, cx ! division in dx:ax, remainder in cx ret _rem64u: ! unsigned rem64u(u64_t i, unsigned j); mov bx, sp call div64u mov ax, cx ret ! ex64*() - extract low or high 32 bits of a 64 bit number ! Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _ex64lo, _ex64hi _ex64lo: ! unsigned long ex64lo(u64_t i); mov bx, sp mov ax, 2(bx) mov dx, 4(bx) ret _ex64hi: ! unsigned long ex64hi(u64_t i); mov bx, sp mov ax, 6(bx) mov dx, 8(bx) ret ! make64() - make a 64 bit number from two 32 bit halves ! Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _make64 _make64: ! u64_t make64(unsigned long lo, unsigned long hi); mov bx, sp mov ax, 4(bx) mov dx, 6(bx) mov cx, 8(bx) push 10(bx) mov bx, 2(bx) mov (bx), ax mov 2(bx), dx mov 4(bx), cx pop 6(bx) mov ax, bx ret ! mul64u() - unsigned long by unsigned multiply giving 64 bit result ! Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _mul64u _mul64u: ! u64_t mul64u(unsigned long i, unsigned j); push bp mov bp, sp mov bx, 4(bp) mov ax, 6(bp) mul 10(bp) mov (bx), ax mov 2(bx), dx mov ax, 8(bp) mul 10(bp) add 2(bx), ax adc dx, #0 mov 4(bx), dx mov 6(bx), #0 mov ax, bx pop bp ret ! sub64() - 64 bit subtraction Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _sub64 _sub64: ! u64_t sub64(u64_t i, u64_t j); push bp mov bp, sp mov bx, 4(bp) mov ax, 6(bp) sub ax, 14(bp) mov (bx), ax mov ax, 8(bp) sbb ax, 16(bp) mov 2(bx), ax mov ax, 10(bp) sbb ax, 18(bp) mov 4(bx), ax mov ax, 12(bp) sbb ax, 20(bp) mov 6(bx), ax mov ax, bx pop bp ret ! sub64u() - unsigned from 64 bit subtraction Author: Kees J. Bot ! 24 Dec 1995 .sect .text .define _sub64u, _sub64ul _sub64u: ! u64_t sub64u(u64_t i, unsigned j); push bp mov bp, sp xor cx, cx jmp 0f _sub64ul: ! u64_t sub64ul(u64_t i, unsigned long j); push bp mov bp, sp mov cx, 16(bp) 0: mov bx, 4(bp) mov ax, 6(bp) sub ax, 14(bp) mov (bx), ax mov ax, 8(bp) sbb ax, cx mov 2(bx), ax mov ax, 10(bp) sbb ax, #0 mov 4(bx), ax mov ax, 12(bp) sbb ax, #0 mov 6(bx), ax mov ax, bx pop bp ret # Makefile for lib/i386/int64. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -Was-ncc CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(add64.o) \ $(LIBRARY)(add64u.o) \ $(LIBRARY)(cmp64.o) \ $(LIBRARY)(cv64u.o) \ $(LIBRARY)(cvu64.o) \ $(LIBRARY)(diff64.o) \ $(LIBRARY)(div64u.o) \ $(LIBRARY)(ex64.o) \ $(LIBRARY)(make64.o) \ $(LIBRARY)(mul64u.o) \ $(LIBRARY)(sub64.o) \ $(LIBRARY)(sub64u.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(add64.o): add64.s $(CC1) add64.s $(LIBRARY)(add64u.o): add64u.s $(CC1) add64u.s $(LIBRARY)(cmp64.o): cmp64.s $(CC1) cmp64.s $(LIBRARY)(cv64u.o): cv64u.s $(CC1) cv64u.s $(LIBRARY)(cvu64.o): cvu64.s $(CC1) cvu64.s $(LIBRARY)(diff64.o): diff64.s $(CC1) diff64.s $(LIBRARY)(div64u.o): div64u.s $(CC1) div64u.s $(LIBRARY)(ex64.o): ex64.s $(CC1) ex64.s $(LIBRARY)(make64.o): make64.s $(CC1) make64.s $(LIBRARY)(mul64u.o): mul64u.s $(CC1) mul64u.s $(LIBRARY)(sub64.o): sub64.s $(CC1) sub64.s $(LIBRARY)(sub64u.o): sub64u.s $(CC1) sub64u.s .;..Makefiledomainname.cether.hether_line.cethera2n.cethere2a.cetherh2n.cethern2h.cgetdomain.cgethnmadr.cgethostent.cgethostname.cgetnetbyaddr.c getnetbyname.c getnetent.c getproto.c getprotoent.c getservent.cgetsrvbyname.cgetsrvbyport.chton.cinet_addr.cinet_network.cinet_ntoa.cmemcspn.coneC_sum.crcmd.cres_comp.cres_init.cres_mkquery.cres_query.cres_send.cstrcasecmp.cservxcheck.cdhcp_gettag.cdhcp_settag.c# Makefile for lib/ip. # # Note: The oneC_sum.c file is not used if there is an assembly equivalent. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -I. -DNDEBUG CC1 = $(CC) $(CFLAGS) -c MAKE = exec make -$(MAKEFLAGS) LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(dhcp_gettag.o) \ $(LIBRARY)(dhcp_settag.o) \ $(LIBRARY)(ether_line.o) \ $(LIBRARY)(ethera2n.o) \ $(LIBRARY)(ethere2a.o) \ $(LIBRARY)(etherh2n.o) \ $(LIBRARY)(ethern2h.o) \ $(LIBRARY)(getdomain.o) \ $(LIBRARY)(gethnmadr.o) \ $(LIBRARY)(gethostent.o) \ $(LIBRARY)(gethostname.o) \ $(LIBRARY)(getnetent.o) \ $(LIBRARY)(getnetbyname.o) \ $(LIBRARY)(getnetbyaddr.o) \ $(LIBRARY)(getproto.o) \ $(LIBRARY)(getprotoent.o) \ $(LIBRARY)(getservent.o) \ $(LIBRARY)(getsrvbyname.o) \ $(LIBRARY)(getsrvbyport.o) \ $(LIBRARY)(hton.o) \ $(LIBRARY)(inet_addr.o) \ $(LIBRARY)(inet_network.o) \ $(LIBRARY)(inet_ntoa.o) \ $(LIBRARY)(memcspn.o) \ $(LIBRARY)(rcmd.o) \ $(LIBRARY)(res_comp.o) \ $(LIBRARY)(res_init.o) \ $(LIBRARY)(res_mkquery.o) \ $(LIBRARY)(res_query.o) \ $(LIBRARY)(res_send.o) \ $(LIBRARY)(servxcheck.o) \ $(LIBRARY)(strcasecmp.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(dhcp_gettag.o): dhcp_gettag.c $(CC1) dhcp_gettag.c $(LIBRARY)(dhcp_settag.o): dhcp_settag.c $(CC1) dhcp_settag.c $(LIBRARY)(ether_line.o): ether_line.c $(CC1) ether_line.c $(LIBRARY)(ethera2n.o): ethera2n.c $(CC1) ethera2n.c $(LIBRARY)(ethere2a.o): ethere2a.c $(CC1) ethere2a.c $(LIBRARY)(etherh2n.o): etherh2n.c $(CC1) etherh2n.c $(LIBRARY)(ethern2h.o): ethern2h.c $(CC1) ethern2h.c $(LIBRARY)(getdomain.o): getdomain.c $(CC1) getdomain.c $(LIBRARY)(gethnmadr.o): gethnmadr.c $(CC1) gethnmadr.c $(LIBRARY)(gethostent.o): gethostent.c $(CC1) gethostent.c $(LIBRARY)(gethostname.o): gethostname.c $(CC1) gethostname.c $(LIBRARY)(getnetent.o): getnetent.c $(CC1) getnetent.c $(LIBRARY)(getnetbyname.o): getnetbyname.c $(CC1) getnetbyname.c $(LIBRARY)(getnetbyaddr.o): getnetbyaddr.c $(CC1) getnetbyaddr.c $(LIBRARY)(getproto.o): getproto.c $(CC1) getproto.c $(LIBRARY)(getprotoent.o): getprotoent.c $(CC1) getprotoent.c $(LIBRARY)(getservent.o): getservent.c $(CC1) getservent.c $(LIBRARY)(getsrvbyname.o): getsrvbyname.c $(CC1) getsrvbyname.c $(LIBRARY)(getsrvbyport.o): getsrvbyport.c $(CC1) getsrvbyport.c $(LIBRARY)(hton.o): hton.c $(CC1) hton.c $(LIBRARY)(inet_addr.o): inet_addr.c $(CC1) inet_addr.c $(LIBRARY)(inet_network.o): inet_network.c $(CC1) inet_network.c $(LIBRARY)(inet_ntoa.o): inet_ntoa.c $(CC1) inet_ntoa.c $(LIBRARY)(memcspn.o): memcspn.c $(CC1) memcspn.c $(LIBRARY)(oneC_sum.o): oneC_sum.c $(CC1) oneC_sum.c $(LIBRARY)(rcmd.o): rcmd.c $(CC1) rcmd.c $(LIBRARY)(res_comp.o): res_comp.c $(CC1) res_comp.c $(LIBRARY)(res_init.o): res_init.c $(CC1) res_init.c $(LIBRARY)(res_mkquery.o): res_mkquery.c $(CC1) res_mkquery.c $(LIBRARY)(res_query.o): res_query.c $(CC1) res_query.c $(LIBRARY)(res_send.o): res_send.c $(CC1) res_send.c $(LIBRARY)(servxcheck.o): servxcheck.c $(CC1) servxcheck.c $(LIBRARY)(strcasecmp.o): strcasecmp.c $(CC1) strcasecmp.c /* domainname.c */ #include #include #include int getdomainname(domain, size) char *domain; size_t size; { FILE *domainfile; char *line; domainfile= fopen("/etc/domainname", "r"); if (!domainfile) { return -1; } line= fgets(domain, size, domainfile); fclose(domainfile); if (!line) return -1; line= strchr(domain, '\n'); if (line) *line= '\0'; return 0; } /* $Id: ether.h,v 2.2 89/10/23 15:42:19 dupuy Exp $ */ /* Interface definitions for ethernet access library */ typedef union etheraddr { unsigned char bytes[6]; /* byteorder safe initialization */ unsigned short shorts[3]; /* force 2-byte alignment */ } ether_addr; typedef struct etherpacket { ether_addr dest; ether_addr src; unsigned char type[2]; /* in network byte order! */ unsigned short pktlen; /* length of pktbuf ONLY */ char *pktbuf; } ether_packet; typedef struct ethervec { ether_addr dest; ether_addr src; unsigned char type[2]; /* in network byte order! */ unsigned short iovcnt; /* number of iovec to use */ struct iovec *iov; /* ptr to array of iovec */ } ether_vec; #ifndef __ETHER_BCAST_ADDR__ extern ether_addr ether_bcast_addr; #endif #ifdef __STDC__ int ether_open (char *name, unsigned type, ether_addr * address); ether_addr *ether_address (int fd, ether_addr * address); ether_addr *ether_intfaddr (char *intf, ether_addr * address); char **ether_interfaces (void); int ether_write (int fd, ether_packet * packet); int ether_writev (int fd, ether_vec * packet); int ether_read (int fd, ether_packet * packet); int ether_readv (int fd, ether_vec * packet); int ether_blocking (int fd, int state); int ether_send_self (int fd); int ether_mcast_self (int fd); int ether_bcast_self (int fd); char *ether_ntoa (ether_addr *); ether_addr *ether_aton (char *); #ifdef __GNUC__ /* * Avoid stupid warnings if structs aren't defined */ typedef struct in_addr *_ether_NoNsEnSe; typedef struct hostent *_ether_nOnSeNsE; #endif char *ether_e2a (ether_addr *, char *); ether_addr *ether_a2e (char *, ether_addr *); struct in_addr *ether_e2ip (ether_addr *, struct in_addr *); ether_addr *ether_ip2e (struct in_addr *, ether_addr *); char *ether_e2host (ether_addr *, char *); ether_addr *ether_host2e (char *, ether_addr *); ether_addr *ether_hostent2e (struct hostent *, ether_addr *); #else int ether_open (); ether_addr *ether_address (); ether_addr *ether_intfaddr (); char **ether_interfaces (); int ether_write (); int ether_writev (); int ether_read (); int ether_readv (); int ether_blocking (); int ether_send_self (); int ether_mcast_self (); int ether_bcast_self (); char *ether_ntoa (); ether_addr *ether_aton (); char *ether_e2a (); ether_addr *ether_a2e (); struct in_addr *ether_e2ip (); ether_addr *ether_ip2e (); char *ether_e2host (); ether_addr *ether_host2e (); ether_addr *ether_hostent2e (); #endif #undef ether_cmp /* lose def from netinet/if_ether.h */ #define ether_cmp(addr1,addr2) \ ((addr1)->shorts[0] != (addr2)->shorts[0] \ || (addr1)->shorts[1] != (addr2)->shorts[1] \ || (addr1)->shorts[2] != (addr2)->shorts[2]) #define ETHERSTRLEN 18 /* max length of "xx:xx:xx:xx:xx:xx" */ #ifdef NOFILE /* i.e. we have included sys/param.h */ #ifndef MAXHOSTNAMELEN /* but MAXHOSTNAMELEN still isnt set */ #define MAXHOSTNAMELEN 64 #endif #endif /* should be defined in terms of ether_packet struct; need offsetof() macro */ #define ETHER_DST 0 #define ETHER_SRC 6 #define ETHER_TYPE 12 #define ETHER_PKT 14 #define ETHER_MIN 46 #define ETHER_MAX 1500 #define ETHER_MINTYPE 0x5DD /* lowest protocol not valid IEEE802 */ #define ETHER_MAXTYPE 0xFFFF /* largest possible protocol */ #define ETHER_MCAST(addr) (((unsigned char *) (addr))[0] & 0x01) #ifdef NT_ALLTYPES #define ETHER_ALLTYPES NT_ALLTYPES #else #define ETHER_ALLTYPES ((unsigned) -1) #endif /* ** ETHER_LINE ** ** This routine parses the array pointed to by "line" (which should be ** from a file in the format of /etc/ethers) and returns in "eaddr" the ** ethernet address at the start of the line and the corresponding host ** name in "hostname". It assumes either tabs or spaces separate the ** two. The buffer pointed to by "hostname" must be big enough to hold ** the host name plus a NULL byte. ** The function returns 0 on success and 1 on failure. ** Arguments are assumed sensible. Null pointers will probably cause ** exceptions. ** Author: Gregory J. Sharp, July 1990 ** Adapted to MINIX: Philip Homburg, May 1992 */ #include #include #include #include #include int ether_line(line, eaddr, hostname) char * line; struct ether_addr * eaddr; char * hostname; { register int i; register unsigned long val; /* skip leading white space */ while (*line != '\n' && (*line == ' ' || *line == '\t')) line++; /* read the ethernet address */ for (i = 0; i < 5; i++) { val = (unsigned long) strtol(line, &line, 16); if (val > 255 || *line++ != ':') return 1; eaddr->ea_addr[i] = val & 0xff; } val = (unsigned long) strtol(line, &line, 16); if (val > 255 || (*line != ' ' && *line != '\t')) return 1; eaddr->ea_addr[i] = val & 0xff; /* skip leading white space */ while (*line != '\n' && (*line == ' ' || *line == '\t')) line++; /* read in the hostname */ while (!isspace(*line)) *hostname++ = *line++; *hostname = '\0'; return 0; } /* ethera2n.c Convert an ASCII string with an ethernet address into a struct ether_addr. Created: Nov 17, 1992 by Philip Homburg */ #include #include #include #include #include struct ether_addr *ether_aton(s) _CONST char *s; { static struct ether_addr ea; int i; long v; char *check; if (s == NULL) return NULL; for (i=0; i<6; i++) { v= strtol(s, &check, 16); if (v<0 || v>255) return NULL; if ((i<5 && check[0] != ':') || (i == 5 && check[0] != '\0')) return NULL; ea.ea_addr[i]= v; s= check+1; } return &ea; } /* * $PchId: ethera2n.c,v 1.3 1996/02/22 21:10:01 philip Exp $ */ /* $Id: ethere2a.c,v 2.1 89/10/23 15:42:28 dupuy Exp $ */ /* This file was part of the etherlib package. */ #include #ifdef _MINIX #include #include #include #include #define ETHERSTRLEN 18 /* max length of "xx:xx:xx:xx:xx:xx" */ #define ether_addr ether_addr_t #define bytes ea_addr char *ether_e2a _ARGS(( ether_addr_t *a, char *e )); #else #include "libether.h" #endif char * ether_e2a (addr, estring) ether_addr *addr; char *estring; { #ifdef lint char *sprintf (); #endif if (estring == NULL) estring = (char *) malloc (ETHERSTRLEN); if (estring != NULL) (void) sprintf (estring, "%x:%x:%x:%x:%x:%x", addr->bytes[0], addr->bytes[1], addr->bytes[2], addr->bytes[3], addr->bytes[4], addr->bytes[5]); return (estring); } #ifndef ETHERDB char * ether_ntoa (addr) ether_addr *addr; { static char estring[ETHERSTRLEN]; return (ether_e2a (addr, estring)); } #endif /* etherh2n.c Created: May 20, 1992 by Philip Homburg */ #include #include #include int ether_hostton(hostname, e) char *hostname; struct ether_addr *e; { FILE *etherf; char b[256], hn[256]; etherf= fopen(_PATH_ETHERS, "r"); if (etherf == NULL) return 1; while(fgets(b, sizeof(b), etherf) != NULL) { if (ether_line(b, e, hn) == 0 && strcmp(hn, hostname) == 0) { fclose(etherf); return 0; } } fclose(etherf); return 1; } /* ethern2h.c Created: Nov 12, 1992 by Philip Homburg */ #include #include #include #include #include int ether_ntohost(hostname, e) char *hostname; struct ether_addr *e; { FILE *etherf; char b[256]; struct ether_addr e_tmp; etherf= fopen(_PATH_ETHERS, "r"); if (etherf == NULL) return 1; while(fgets(b, sizeof(b), etherf) != NULL) { if (ether_line(b, &e_tmp, hostname) == 0 && memcmp(&e_tmp, e, sizeof(e_tmp)) == 0) { fclose(etherf); return 0; } } fclose(etherf); return 1; } /* getdomainname() Author: Kees J. Bot * 2 Dec 1994 */ #define nil 0 #include #include #include #include int getdomainname(char *domain, size_t size) { char nodename[256]; char *dot; if (gethostname(nodename, sizeof(nodename)) < 0) return -1; nodename[sizeof(nodename)-1]= 0; if ((dot= strchr(nodename, '.')) == nil) dot= "."; strncpy(domain, dot+1, size); if (size > 0) domain[size-1]= 0; return 0; } /* * Copyright (c) 1985, 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)gethostnamadr.c 6.41 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #ifdef _MINIX #include #include #include #include #include #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #include #include #include #endif /* AMOEABA */ #define MAXALIASES 35 #define MAXADDRS 35 static char *h_addr_ptrs[MAXADDRS + 1]; #ifdef _MINIX struct in_addr { ipaddr_t s_addr; }; typedef u32_t u_long; typedef u16_t u_short; typedef u8_t u_char; union querybuf; extern int dn_skipname _ARGS(( const u_char *comp_dn, const u_char *eom )); #define getshort _getshort static struct hostent *getanswer _ARGS(( union querybuf *answer, int anslen, int iquery )); #define bcmp memcmp #define bcopy(s, d, l) memcpy(d, s, l) #endif /* _MINIX */ static struct hostent host; static char *host_aliases[MAXALIASES]; static char hostbuf[BUFSIZ+1]; static struct in_addr host_addr; #ifndef _MINIX char *strpbrk(); #endif /* !_MINIX */ #if PACKETSZ > 1024 #define MAXPACKET PACKETSZ #else #define MAXPACKET 1024 #endif typedef union querybuf { dns_hdr_t hdr; u_char buf[MAXPACKET]; } querybuf_t; typedef union align { long al; char ac; } align_t; static struct hostent * getanswer(answer, anslen, iquery) querybuf_t *answer; int anslen; int iquery; { register dns_hdr_t *hp; register u_char *cp; register int n; u_char *eom; char *bp, **ap; int type, class, buflen, ancount, qdcount; int haveanswer, getclass = C_ANY; char **hap; eom = answer->buf + anslen; /* * find first satisfactory answer */ hp = &answer->hdr; ancount = ntohs(hp->dh_ancount); qdcount = ntohs(hp->dh_qdcount); bp = hostbuf; buflen = sizeof(hostbuf); cp = answer->buf + sizeof(dns_hdr_t); if (qdcount) { if (iquery) { if ((n = dn_expand((u_char *)answer->buf, eom, cp, (u_char *)bp, buflen)) < 0) { h_errno = NO_RECOVERY; return ((struct hostent *) NULL); } cp += n + QFIXEDSZ; host.h_name = bp; n = strlen(bp) + 1; bp += n; buflen -= n; } else cp += dn_skipname(cp, eom) + QFIXEDSZ; while (--qdcount > 0) cp += dn_skipname(cp, eom) + QFIXEDSZ; } else if (iquery) { if (hp->dh_flag1 & DHF_AA) h_errno = HOST_NOT_FOUND; else h_errno = TRY_AGAIN; return ((struct hostent *) NULL); } ap = host_aliases; *ap = NULL; host.h_aliases = host_aliases; hap = h_addr_ptrs; *hap = NULL; #if BSD >= 43 || defined(h_addr) /* new-style hostent structure */ host.h_addr_list = h_addr_ptrs; #endif haveanswer = 0; while (--ancount >= 0 && cp < eom) { if ((n = dn_expand((u_char *)answer->buf, eom, cp, (u_char *)bp, buflen)) < 0) break; cp += n; type = getshort(cp); cp += sizeof(u_short); class = getshort(cp); cp += sizeof(u_short) + sizeof(u_long); n = getshort(cp); cp += sizeof(u_short); if (type == T_CNAME) { cp += n; if (ap >= &host_aliases[MAXALIASES-1]) continue; *ap++ = bp; n = strlen(bp) + 1; bp += n; buflen -= n; continue; } if (iquery && type == T_PTR) { if ((n = dn_expand((u8_t *)answer->buf, eom, cp, (u8_t *)bp, buflen)) < 0) { cp += n; continue; } cp += n; host.h_name = bp; return(&host); } if (iquery || type != T_A) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("unexpected answer type %d, size %d\n", type, n); #endif cp += n; continue; } if (haveanswer) { if (n != host.h_length) { cp += n; continue; } if (class != getclass) { cp += n; continue; } } else { host.h_length = n; getclass = class; host.h_addrtype = (class == C_IN) ? AF_INET : AF_UNSPEC; if (!iquery) { host.h_name = bp; bp += strlen(bp) + 1; } } bp += (size_t)(sizeof(align_t) - ((u_long)bp % sizeof(align_t))); if (bp + n >= &hostbuf[sizeof(hostbuf)]) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("size (%d) too big\n", n); #endif break; } bcopy(cp, *hap++ = bp, n); bp +=n; cp += n; haveanswer++; } if (haveanswer) { *ap = NULL; #if BSD >= 43 || defined(h_addr) /* new-style hostent structure */ *hap = NULL; #else host.h_addr = h_addr_ptrs[0]; #endif return (&host); } else { h_errno = TRY_AGAIN; return ((struct hostent *) NULL); } } struct hostent * gethostbyname(name) _CONST char *name; { querybuf_t buf; register _CONST char *cp; int n; /* * disallow names consisting only of digits/dots, unless * they end in a dot. */ if (isdigit(name[0])) for (cp = name;; ++cp) { if (!*cp) { if (*--cp == '.') break; /* * All-numeric, no dot at the end. * Fake up a hostent as if we'd actually * done a lookup. What if someone types * 255.255.255.255? The test below will * succeed spuriously... ??? */ if ((host_addr.s_addr = inet_addr(name)) == -1) { h_errno = HOST_NOT_FOUND; return((struct hostent *) NULL); } host.h_name = (char *) name; host.h_aliases = host_aliases; host_aliases[0] = NULL; host.h_addrtype = AF_INET; host.h_length = sizeof(u_long); h_addr_ptrs[0] = (char *)&host_addr; h_addr_ptrs[1] = (char *)0; #if BSD >= 43 || defined(h_addr) /* new-style hostent structure */ host.h_addr_list = h_addr_ptrs; #else host.h_addr = h_addr_ptrs[0]; #endif return (&host); } if (!isdigit(*cp) && *cp != '.') break; } if ((n = res_search((char*)name, C_IN, T_A, buf.buf, sizeof(buf))) < 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_search failed\n"); #endif return ((struct hostent *) NULL); } return (getanswer(&buf, n, 0)); } struct hostent * gethostbyaddr(addr, len, type) const char *addr; int len, type; { int n; querybuf_t buf; register struct hostent *hp; char qbuf[MAXDNAME]; if (type != AF_INET) return ((struct hostent *) NULL); (void)sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", ((unsigned)addr[3] & 0xff), ((unsigned)addr[2] & 0xff), ((unsigned)addr[1] & 0xff), ((unsigned)addr[0] & 0xff)); n = res_query(qbuf, C_IN, T_PTR, (u8_t *)&buf, sizeof(buf)); if (n < 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_query failed\n"); #endif return ((struct hostent *) NULL); } hp = getanswer(&buf, n, 1); if (hp == NULL) return ((struct hostent *) NULL); hp->h_addrtype = type; hp->h_length = len; h_addr_ptrs[0] = (char *)&host_addr; h_addr_ptrs[1] = (char *)0; host_addr = *(struct in_addr *)addr; #if BSD < 43 && !defined(h_addr) /* new-style hostent structure */ hp->h_addr = h_addr_ptrs[0]; #endif return(hp); } 0/* gethostent() - Interface to /etc/hosts Author: Kees J. Bot * 31 May 1999 */ /* Prefix the functions defined here with underscores to distinguish them * from the newer replacements in the resolver library. */ #define sethostent _sethostent #define endhostent _endhostent #define gethostent _gethostent #define gethostbyname _gethostbyname #define gethostbyaddr _gethostbyaddr #define nil 0 #include #include #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define isspace(c) ((unsigned) (c) <= ' ') static char HOSTS[]= _PATH_HOSTS; static char *hosts= HOSTS; /* Current hosts file. */ static FILE *hfp; /* Open hosts file. */ void sethostent(int stayopen) /* Start search. (Same as ending it.) */ { endhostent(); } void endhostent(void) /* End search and reinitialize. */ { if (hfp != nil) { fclose(hfp); hfp= nil; } hosts= _PATH_HOSTS; } struct hostent *gethostent(void) /* Return the next entry from the hosts files. */ { static char line[256]; /* One line in a hosts file. */ static ipaddr_t addr; /* IP address found first on the line. */ static char *names[16]; /* Pointers to the words on the line. */ static char *addrs[2]= { /* List of IP addresses (just one.) */ (char *) &addr, nil, }; static struct hostent host = { nil, /* h_name, will set to names[1]. */ names + 2, /* h_aliases, the rest of the names. */ AF_INET, /* h_addrtype */ sizeof(ipaddr_t), /* Size of an address in the address list. */ addrs, /* List of IP addresses. */ }; static char nexthosts[128]; /* Next hosts file to include. */ char *lp, **np; int c; for (;;) { if (hfp == nil) { /* No hosts file open, try to open the next one. */ if (hosts == 0) return nil; if ((hfp= fopen(hosts, "r")) == nil) { hosts= nil; continue; } } /* Read a line. */ lp= line; while ((c= getc(hfp)) != EOF && c != '\n') { if (lp < arraylimit(line)) *lp++= c; } /* EOF? Then close and prepare for reading the next file. */ if (c == EOF) { fclose(hfp); hfp= nil; hosts= nil; continue; } if (lp == arraylimit(line)) continue; *lp= 0; /* Break the line up in words. */ np= names; lp= line; for (;;) { while (isspace(*lp) && *lp != 0) lp++; if (*lp == 0 || *lp == '#') break; if (np == arraylimit(names)) break; *np++= lp; while (!isspace(*lp) && *lp != 0) lp++; if (*lp == 0) break; *lp++= 0; } if (np == arraylimit(names)) continue; *np= nil; /* Special "include file" directive. */ if (np == names + 2 && strcmp(names[0], "include") == 0) { fclose(hfp); hfp= nil; hosts= nil; if (strlen(names[1]) < sizeof(nexthosts)) { strcpy(nexthosts, names[1]); hosts= nexthosts; } continue; } /* At least two words, the first of which is an IP address. */ if (np < names + 2) continue; if (!inet_aton((char *) names[0], &addr)) continue; host.h_name= (char *) names[1]; return &host; } } /* Rest kept in reserve, we probably never need 'em. */ #if XXX struct hostent *gethostbyname(const char *name) { struct hostent *he; char **pa; char alias[256]; char *domain; sethostent(0); while ((he= gethostent()) != nil) { if (strcasecmp(he->h_name, name) == 0) goto found; domain= strchr(he->h_name, '.'); for (pa= he->h_aliases; *pa != nil; pa++) { strcpy(alias, *pa); if (domain != nil && strchr(alias, '.') == nil) { strcat(alias, domain); } if (strcasecmp(alias, name) == 0) goto found; } } found: endhostent(); return he; } struct hostent *gethostbyaddr(const char *addr, int len, int type) { struct hostent *he; sethostent(0); while ((he= gethostent()) != nil) { if (he->h_name[0] == '%') continue; if (type == AF_INET && memcmp(he->h_addr, addr, len) == 0) break; } endhostent(); return he; } #endif /* gethostname(2) system call emulation */ #include #include #include #include #include #include #define HOSTNAME_FILE "/etc/hostname.file" int gethostname(char *buf, size_t len) { int fd; int r; char *nl; if ((fd= open(HOSTNAME_FILE, O_RDONLY)) < 0) return -1; r= read(fd, buf, len); close(fd); if (r == -1) return -1; buf[len-1]= '\0'; if ((nl= strchr(buf, '\n')) != NULL) *nl= '\0'; return 0; } /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include extern int _net_stayopen; struct netent * getnetbyaddr(net, type) register long net; register int type; { register struct netent *p; setnetent(_net_stayopen); while (p = getnetent()) if (p->n_addrtype == type && p->n_net == net) break; if (!_net_stayopen) endnetent(); return (p); } /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getnetbyname.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include #include extern int _net_stayopen; struct netent * getnetbyname(name) register const char *name; { register struct netent *p; register char **cp; setnetent(_net_stayopen); while (p = getnetent()) { if (strcmp(p->n_name, name) == 0) break; for (cp = p->n_aliases; *cp != 0; cp++) if (strcmp(*cp, name) == 0) goto found; } found: if (!_net_stayopen) endnetent(); return (p); } /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include #include #include #include #include #include #include #define MAXALIASES 35 static FILE *netf; static char line[BUFSIZ+1]; static struct netent net; static char *net_aliases[MAXALIASES]; int _net_stayopen; void setnetent(f) int f; { if (netf == NULL) netf = fopen(_PATH_NETWORKS, "r" ); else rewind(netf); _net_stayopen |= f; } void endnetent() { if (netf) { fclose(netf); netf = NULL; } _net_stayopen = 0; } struct netent * getnetent() { char *p; register char *cp, **q; if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL) return (NULL); again: p = fgets(line, BUFSIZ, netf); if (p == NULL) return (NULL); if (*p == '#') goto again; cp = strpbrk(p, "#\n"); if (cp == NULL) goto again; *cp = '\0'; net.n_name = p; cp = strpbrk(p, " \t"); if (cp == NULL) goto again; *cp++ = '\0'; while (*cp == ' ' || *cp == '\t') cp++; p = strpbrk(cp, " \t"); if (p != NULL) *p++ = '\0'; net.n_net = inet_network(cp); net.n_addrtype = AF_INET; q = net.n_aliases = net_aliases; if (p != NULL) cp = p; while (cp && *cp) { if (*cp == ' ' || *cp == '\t') { cp++; continue; } if (q < &net_aliases[MAXALIASES - 1]) *q++ = cp; cp = strpbrk(cp, " \t"); if (cp != NULL) *cp++ = '\0'; } *q = NULL; return (&net); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getproto.c 5.6 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #include #ifdef _MINIX #include #include #endif extern int _proto_stayopen; struct protoent * getprotobynumber(proto) register int proto; { register struct protoent *p; setprotoent(_proto_stayopen); while (p = getprotoent()) if (p->p_proto == proto) break; if (!_proto_stayopen) endprotoent(); return (p); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getprotoent.c 5.7 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #include #include #include #ifdef _MINIX #include static char *any _ARGS(( char *cp, char *match )); #endif #define MAXALIASES 35 static FILE *protof = NULL; static char line[BUFSIZ+1]; static struct protoent proto; static char *proto_aliases[MAXALIASES]; int _proto_stayopen; void setprotoent(f) int f; { if (protof == NULL) protof = fopen(_PATH_PROTOCOLS, "r" ); else rewind(protof); _proto_stayopen |= f; } void endprotoent() { if (protof) { fclose(protof); protof = NULL; } _proto_stayopen = 0; } struct protoent * getprotoent() { char *p; register char *cp, **q; if (protof == NULL && (protof = fopen(_PATH_PROTOCOLS, "r" )) == NULL) return (NULL); again: if ((p = fgets(line, BUFSIZ, protof)) == NULL) return (NULL); if (*p == '#') goto again; cp = any(p, "#\n"); if (cp == NULL) goto again; *cp = '\0'; proto.p_name = p; cp = any(p, " \t"); if (cp == NULL) goto again; *cp++ = '\0'; while (*cp == ' ' || *cp == '\t') cp++; p = any(cp, " \t"); if (p != NULL) *p++ = '\0'; proto.p_proto = atoi(cp); q = proto.p_aliases = proto_aliases; if (p != NULL) { cp = p; while (cp && *cp) { if (*cp == ' ' || *cp == '\t') { cp++; continue; } if (q < &proto_aliases[MAXALIASES - 1]) *q++ = cp; cp = any(cp, " \t"); if (cp != NULL) *cp++ = '\0'; } } *q = NULL; return (&proto); } static char * any(cp, match) register char *cp; char *match; { register char *mp, c; while (c = *cp) { for (mp = match; *mp; mp++) if (*mp == c) return (cp); cp++; } return ((char *)0); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getservent.c 5.8 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #include #include #include #include #include #include #define MAXALIASES 35 static FILE *servf = NULL; static char line[BUFSIZ+1]; static struct servent serv; static char *serv_aliases[MAXALIASES]; int _serv_stayopen; static char *any _ARGS(( char *cp, char *match )); void setservent(f) int f; { if (servf == NULL) servf = fopen(_PATH_SERVICES, "r" ); else rewind(servf); _serv_stayopen |= f; } void endservent() { if (servf) { fclose(servf); servf = NULL; } _serv_stayopen = 0; } struct servent * getservent() { char *p; register char *cp, **q; if (servf == NULL && (servf = fopen(_PATH_SERVICES, "r" )) == NULL) return (NULL); again: if ((p = fgets(line, BUFSIZ, servf)) == NULL) return (NULL); if (*p == '#') goto again; cp = any(p, "#\n"); if (cp == NULL) goto again; *cp = '\0'; serv.s_name = p; p = any(p, " \t"); if (p == NULL) goto again; *p++ = '\0'; while (*p == ' ' || *p == '\t') p++; cp = any(p, ",/"); if (cp == NULL) goto again; *cp++ = '\0'; serv.s_port = htons((u16_t)atoi(p)); serv.s_proto = cp; q = serv.s_aliases = serv_aliases; cp = any(cp, " \t"); if (cp != NULL) *cp++ = '\0'; while (cp && *cp) { if (*cp == ' ' || *cp == '\t') { cp++; continue; } if (q < &serv_aliases[MAXALIASES - 1]) *q++ = cp; cp = any(cp, " \t"); if (cp != NULL) *cp++ = '\0'; } *q = NULL; return (&serv); } static char * any(cp, match) register char *cp; char *match; { register char *mp, c; while (c = *cp) { for (mp = match; *mp; mp++) if (*mp == c) return (cp); cp++; } return ((char *)0); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getservbyname.c 5.6 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #include #include extern int _serv_stayopen; struct servent * getservbyname(name, proto) const char *name, *proto; { register struct servent *p; register char **cp; setservent(_serv_stayopen); while (p = getservent()) { if (strcmp(name, p->s_name) == 0) goto gotname; for (cp = p->s_aliases; *cp; cp++) if (strcmp(name, *cp) == 0) goto gotname; continue; gotname: if (proto == 0 || strcmp(p->s_proto, proto) == 0) break; } if (!_serv_stayopen) endservent(); return (p); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)getservbyport.c 5.6 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #include #include #ifdef _MINIX #include #endif extern int _serv_stayopen; struct servent * getservbyport(port, proto) int port; const char *proto; { register struct servent *p; setservent(_serv_stayopen); while (p = getservent()) { if (p->s_port != port) continue; if (proto == 0 || strcmp(p->s_proto, proto) == 0) break; } if (!_serv_stayopen) endservent(); return (p); } /* hton.c */ #include #include #include u16_t _tmp; u32_t _tmp_l; /* * Copyright (c) 1983, 1990 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)inet_addr.c 5.8 (Berkeley) 6/23/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include #include #endif #ifdef __STDC__ #define _CONST const #else #define _CONST #endif /* * Ascii internet address interpretation routine. * The value returned is in network order. */ ipaddr_t inet_addr(cp) register _CONST char *cp; { ipaddr_t val; if (inet_aton(cp, &val)) return (val); errno= EINVAL; return (ipaddr_t)-1; } /* * Check whether "cp" is a valid ascii representation * of an Internet address and convert to a binary address. * Returns 1 if the address is valid, 0 if not. * This replaces inet_addr, the return value from which * cannot distinguish between failure and a local broadcast address. */ int inet_aton(cp, addr) register _CONST char *cp; ipaddr_t *addr; { register u32_t val, base, n; register char c; u32_t parts[4], *pp = parts; for (;;) { /* * Collect number up to ``.''. * Values are specified as for C: * 0x=hex, 0=octal, other=decimal. */ val = 0; base = 10; if (*cp == '0') { if (*++cp == 'x' || *cp == 'X') base = 16, cp++; else base = 8; } while ((c = *cp) != '\0') { if (isascii(c) && isdigit(c)) { val = (val * base) + (c - '0'); cp++; continue; } if (base == 16 && isascii(c) && isxdigit(c)) { val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); cp++; continue; } break; } if (*cp == '.') { /* * Internet format: * a.b.c.d * a.b.c (with c treated as 16-bits) * a.b (with b treated as 24 bits) */ if (pp >= parts + 3 || val > 0xff) return (0); *pp++ = val, cp++; } else break; } /* * Check for trailing characters. */ if (*cp && (!isascii(*cp) || !isspace(*cp))) return (0); /* * Concoct the address according to * the number of parts specified. */ n = pp - parts + 1; switch (n) { case 1: /* a -- 32 bits */ break; case 2: /* a.b -- 8.24 bits */ if (val > 0xffffff) return (0); val |= parts[0] << 24; break; case 3: /* a.b.c -- 8.8.16 bits */ if (val > 0xffff) return (0); val |= (parts[0] << 24) | (parts[1] << 16); break; case 4: /* a.b.c.d -- 8.8.8.8 bits */ if (val > 0xff) return (0); val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); break; } if (addr) *addr = htonl(val); return (1); } /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)inet_network.c 8.1 (Berkeley) 6/4/93"; #endif /* LIBC_SCCS and not lint */ #include #include #include #include #define INADDR_NONE ((ipaddr_t) -1) /* * Internet network address interpretation routine. * The library routines call this routine to interpret * network numbers. */ ipaddr_t inet_network(cp) register const char *cp; { register ipaddr_t val, base, n; register char c; ipaddr_t parts[4], *pp = parts; register int i; again: val = 0; base = 10; if (*cp == '0') base = 8, cp++; if (*cp == 'x' || *cp == 'X') base = 16, cp++; while (c = *cp) { if (isdigit(c)) { val = (val * base) + (c - '0'); cp++; continue; } if (base == 16 && isxdigit(c)) { val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A')); cp++; continue; } break; } if (*cp == '.') { if (pp >= parts + 4) return (INADDR_NONE); *pp++ = val, cp++; goto again; } if (*cp && !isspace(*cp)) return (INADDR_NONE); *pp++ = val; n = pp - parts; if (n > 4) return (INADDR_NONE); for (val = 0, i = 0; i < n; i++) { val <<= 8; val |= parts[i] & 0xff; } return (val); } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)inet_ntoa.c 5.5 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ /* * Convert network-format internet address * to base 256 d.d.d.d representation. */ #include #include #include #include char * inet_ntoa(in) ipaddr_t in; { static char b[18]; register u8_t *p; p = (u8_t *)∈ sprintf(b, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); return (b); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: strcspn.c,v 1.1 91/12/19 13:20:40 philip Exp $ */ #include size_t memcspn(const char *string, size_t strlen, const char *notin, size_t notinlen) { register const char *s1, *s2; int i,j; for (s1 = string, i = 0; i #include u16_t oneC_sum(U16_t prev, void *data, size_t size) { u8_t *dptr; size_t n; u16_t word; u32_t sum; int swap= 0; sum= prev; dptr= data; n= size; swap= ((size_t) dptr & 1); if (swap) { sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8); if (n > 0) { ((u8_t *) &word)[0]= 0; ((u8_t *) &word)[1]= dptr[0]; sum+= (u32_t) word; dptr+= 1; n-= 1; } } while (n >= 8) { sum+= (u32_t) ((u16_t *) dptr)[0] + (u32_t) ((u16_t *) dptr)[1] + (u32_t) ((u16_t *) dptr)[2] + (u32_t) ((u16_t *) dptr)[3]; dptr+= 8; n-= 8; } while (n >= 2) { sum+= (u32_t) ((u16_t *) dptr)[0]; dptr+= 2; n-= 2; } if (n > 0) { ((u8_t *) &word)[0]= dptr[0]; ((u8_t *) &word)[1]= 0; sum+= (u32_t) word; } sum= (sum & 0xFFFF) + (sum >> 16); if (sum > 0xFFFF) sum++; if (swap) { sum= ((sum & 0xFF) << 8) | ((sum & 0xFF00) >> 8); } return sum; } /* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)rcmd.c 5.22 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAXHOSTNAMELEN 256 #define MAXPATHLEN PATH_MAX #else #include #include #include #include #include #include #include #include #include #include #include #endif #ifdef __STDC__ #define CONST const #else #define CONST #endif extern errno; #if _MINIX int _validuser _ARGS(( FILE *hostf, const char *rhost, const char *luser, const char *ruser, int baselen )); static int _checkhost _ARGS(( const char *rhost, const char *lhost, int len )); #else char *index(); #endif #if _MINIX int rcmd(ahost, rport, locuser, remuser, cmd, fd2p) char **ahost; int rport; CONST char *locuser, *remuser, *cmd; int *fd2p; { int fd, fd2, result; struct hostent *hp; int n; static tcpport_t lport; nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpconnopt; pid_t pid; char num[8]; char c; char *tcp_device; fd= -1; fd2= -1; if (lport == 0) { pid = getpid(); lport = 1; do { lport = (lport << 1) | (pid & 1); pid >>= 1; } while (lport < TCPPORT_RESERVED/2); } tcp_device= getenv("TCP_DEVICE"); if (tcp_device == NULL) tcp_device= TCP_DEVICE; hp= gethostbyname(*ahost); if (!hp) { fprintf(stderr, "%s: unknown host\n", *ahost); return -1; } *ahost= hp->h_name; n = TCPPORT_RESERVED/2; do { if (--lport < TCPPORT_RESERVED/2) lport = TCPPORT_RESERVED-1; fd= open (tcp_device, O_RDWR); if (fd<0) { fprintf(stderr, "unable to open %s: %s\n", tcp_device, strerror(errno)); goto bad; } tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP | NWTC_EXCL; tcpconf.nwtc_locport= htons(lport); tcpconf.nwtc_remport= rport; tcpconf.nwtc_remaddr= *(ipaddr_t *)hp->h_addr; result= ioctl(fd, NWIOSTCPCONF, &tcpconf); if (result<0) { if (errno == EADDRINUSE) { close(fd); continue; } fprintf(stderr, "unable to ioctl(NWIOSTCPCONF): %s\n", strerror(errno)); goto bad; } tcpconf.nwtc_flags= NWTC_SHARED; result= ioctl(fd, NWIOSTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "unable to ioctl(NWIOSTCPCONF): %s\n", strerror(errno)); goto bad; } tcpconnopt.nwtcl_flags= 0; do { result= ioctl (fd, NWIOTCPCONN, &tcpconnopt); if (result<0 && errno == EAGAIN) { sleep(2); } } while (result<0 && errno == EAGAIN); if (result<0 && errno != EADDRINUSE) { fprintf(stderr, "unable to ioctl(NWIOTCPCONN): %s\n", strerror(errno)); goto bad; } if (result>=0) break; } while (--n > 0); if (n == 0) { fprintf(stderr, "can't get port\n"); return -1; } if (!fd2p) { if (write(fd, "", 1) != 1) { fprintf(stderr, "unable to write: %s", strerror(errno)); goto bad; } } else { fd2= open (tcp_device, O_RDWR); if (fd2<0) { fprintf(stderr, "unable to open %s: %s\n", tcp_device, strerror(errno)); goto bad; } tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_UNSET_RA | NWTC_UNSET_RP | NWTC_SHARED; tcpconf.nwtc_locport= htons(lport); result= ioctl(fd2, NWIOSTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "unable to ioctl(NWIOSTCPCONF): %s\n", strerror(errno)); goto bad; } pid= fork(); if (pid<0) { fprintf(stderr, "unable to fork: %s\n", strerror(errno)); goto bad; } if (!pid) { alarm(0); signal(SIGALRM, SIG_DFL); alarm(30); /* give up after half a minute */ tcpconnopt.nwtcl_flags= 0; do { result= ioctl (fd2, NWIOTCPLISTEN, &tcpconnopt); if (result<0 && errno == EAGAIN) { sleep(2); } } while (result<0 && errno == EAGAIN); if (result<0 && errno != EADDRINUSE) { fprintf(stderr, "unable to ioctl(NWIOTCPLISTEN): %s\n", strerror(errno)); exit(1); } if (result>=0) exit(0); else exit(1); } /* * This sleep is a HACK. The command that we are starting * will try to connect to the fd2 port. It seems that for * this to succeed the child process must have already made * the call to ioctl above (the NWIOTCPLISTEN) call. * The sleep gives the child a chance to make the call * before the parent sends the port number to the * command being started. */ sleep(1); sprintf(num, "%d", lport); if (write(fd, num, strlen(num)+1) != strlen(num)+1) { fprintf(stderr, "unable to write: %s\n", strerror(errno)); goto bad; } } write (fd, locuser, strlen(locuser)+1); write (fd, remuser, strlen(remuser)+1); write (fd, cmd, strlen(cmd)+1); if (read(fd, &c, 1) != 1) { fprintf(stderr, "unable to read: %s\n", strerror(errno) ); goto bad; } if (c != 0) { while (read(fd, &c, 1) == 1) { write(2, &c, 1); if (c == '\n') break; } goto bad; } if (fd2p) { *fd2p= fd2; result= ioctl(fd2, NWIOGTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "unable to ioctl(NWIOGTCPCONF): %s\n", strerror(errno) ); goto bad; } if (ntohs(tcpconf.nwtc_remport) >= TCPPORT_RESERVED) { fprintf(stderr, "unable to setup 2nd channel\n"); goto bad; } } return fd; bad: if (fd>=0) close(fd); if (fd2>=0) close(fd2); return -1; } #else /* _MINIX */ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) char **ahost; u_short rport; char *locuser, *remuser, *cmd; int *fd2p; { int s, timo = 1, pid; long oldmask; struct sockaddr_in sin, sin2, from; char c; int lport = IPPORT_RESERVED - 1; struct hostent *hp; fd_set reads; pid = getpid(); hp = gethostbyname(*ahost); if (hp == 0) { herror(*ahost); return (-1); } *ahost = hp->h_name; oldmask = sigblock(sigmask(SIGURG)); for (;;) { s = rresvport(&lport); if (s < 0) { if (errno == EAGAIN) fprintf(stderr, "socket: All ports in use\n"); else perror("rcmd: socket"); sigsetmask(oldmask); return (-1); } fcntl(s, F_SETOWN, pid); sin.sin_family = hp->h_addrtype; bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr, hp->h_length); sin.sin_port = rport; if (connect(s, (caddr_t)&sin, sizeof (sin), 0) >= 0) break; (void) close(s); if (errno == EADDRINUSE) { lport--; continue; } if (errno == ECONNREFUSED && timo <= 16) { sleep(timo); timo *= 2; continue; } if (hp->h_addr_list[1] != NULL) { int oerrno = errno; fprintf(stderr, "connect to address %s: ", inet_ntoa(sin.sin_addr)); errno = oerrno; perror(0); hp->h_addr_list++; bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr, hp->h_length); fprintf(stderr, "Trying %s...\n", inet_ntoa(sin.sin_addr)); continue; } perror(hp->h_name); sigsetmask(oldmask); return000000 (-1); } lport--; if (fd2p == 0) { write(s, "", 1); lport = 0; } else { char num[8]; int s2 = rresvport(&lport), s3; int len = sizeof (from); if (s2 < 0) goto bad; listen(s2, 1); (void) sprintf(num, "%d", lport); if (write(s, num, strlen(num)+1) != strlen(num)+1) { perror("write: setting up stderr"); (void) close(s2); goto bad; } FD_ZERO(&reads); FD_SET(s, &reads); FD_SET(s2, &reads); errno = 0; if (select(32, &reads, 0, 0, 0) < 1 || !FD_ISSET(s2, &reads)) { if (errno != 0) perror("select: setting up stderr"); else fprintf(stderr, "select: protocol failure in circuit setup.\n"); (void) close(s2); goto bad; } s3 = accept(s2, &from, &len, 0); (void) close(s2); if (s3 < 0) { perror("accept"); lport = 0; goto bad; } *fd2p = s3; from.sin_port = ntohs((u_short)from.sin_port); if (from.sin_family != AF_INET || from.sin_port >= IPPORT_RESERVED || from.sin_port < IPPORT_RESERVED / 2) { fprintf(stderr, "socket: protocol failure in circuit setup.\n"); goto bad2; } } (void) write(s, locuser, strlen(locuser)+1); (void) write(s, remuser, strlen(remuser)+1); (void) write(s, cmd, strlen(cmd)+1); if (read(s, &c, 1) != 1) { perror(*ahost); goto bad2; } if (c != 0) { while (read(s, &c, 1) == 1) { (void) write(2, &c, 1); if (c == '\n') break; } goto bad2; } sigsetmask(oldmask); return (s); bad2: if (lport) (void) close(*fd2p); bad: (void) close(s); sigsetmask(oldmask); return (-1); } rresvport(alport) int *alport; { struct sockaddr_in sin; int s; sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) return (-1); for (;;) { sin.sin_port = htons((u_short)*alport); if (bind(s, (caddr_t)&sin, sizeof (sin)) >= 0) return (s); if (errno != EADDRINUSE) { (void) close(s); return (-1); } (*alport)--; if (*alport == IPPORT_RESERVED/2) { (void) close(s); errno = EAGAIN; /* close */ return (-1); } } } #endif /* _MINIX */ int _check_rhosts_file = 1; ruserok(rhost, superuser, ruser, luser) CONST char *rhost; int superuser; CONST char *ruser, *luser; { FILE *hostf; char fhost[MAXHOSTNAMELEN]; int first = 1; register CONST char *sp; register char *p; int baselen = -1; sp = rhost; p = fhost; while (*sp) { if (*sp == '.') { if (baselen == -1) baselen = sp - rhost; *p++ = *sp++; } else { *p++ = isupper(*sp) ? tolower(*sp++) : *sp++; } } *p = '\0'; hostf = superuser ? (FILE *)0 : fopen(_PATH_HEQUIV, "r"); again: if (hostf) { if (!_validuser(hostf, fhost, luser, ruser, baselen)) { (void) fclose(hostf); return(0); } (void) fclose(hostf); } if (first == 1 && (_check_rhosts_file || superuser)) { struct stat sbuf; struct passwd *pwd; char pbuf[MAXPATHLEN]; first = 0; if ((pwd = getpwnam(luser)) == NULL) return(-1); (void)strcpy(pbuf, pwd->pw_dir); (void)strcat(pbuf, "/.rhosts"); if ((hostf = fopen(pbuf, "r")) == NULL) return(-1); /* * if owned by someone other than user or root or if * writeable by anyone but the owner, quit */ if (fstat(fileno(hostf), &sbuf) || sbuf.st_uid && sbuf.st_uid != pwd->pw_uid || sbuf.st_mode&022) { fclose(hostf); return(-1); } goto again; } return (-1); } /* don't make static, used by lpd(8) */ int _validuser(hostf, rhost, luser, ruser, baselen) FILE *hostf; CONST char *rhost, *luser, *ruser; int baselen; { char *user; char ahost[MAXHOSTNAMELEN]; register char *p; while (fgets(ahost, sizeof (ahost), hostf)) { p = ahost; while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') { *p = isupper(*p) ? tolower(*p) : *p; p++; } if (*p == ' ' || *p == '\t') { *p++ = '\0'; while (*p == ' ' || *p == '\t') p++; user = p; while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') p++; } else user = p; *p = '\0'; if (_checkhost(rhost, ahost, baselen) && !strcmp(ruser, *user ? user : luser)) { return (0); } } return (-1); } static int _checkhost(rhost, lhost, len) CONST char *rhost, *lhost; int len; { static char ldomain[MAXHOSTNAMELEN + 1]; static char *domainp = NULL; static int nodomain = 0; register char *cp; if (len == -1) return(!strcmp(rhost, lhost)); if (strncmp(rhost, lhost, len)) return(0); if (!strcmp(rhost, lhost)) return(1); if (*(lhost + len) != '\0') return(0); if (nodomain) return(0); if (!domainp) { if (gethostname(ldomain, sizeof(ldomain)) == -1) { nodomain = 1; return(0); } ldomain[MAXHOSTNAMELEN] = 0; if ((domainp = index(ldomain, '.')) == (char *)NULL) { nodomain = 1; return(0); } for (cp = ++domainp; *cp; ++cp) if (isupper(*cp)) *cp = tolower(*cp); } return(!strcmp(domainp, rhost + len +1)); } /* * Copyright (c) 1985 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)res_comp.c 6.18 (Berkeley) 6/27/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include typedef u8_t u_char; typedef u16_t u_short; typedef u32_t u_long; static int dn_find _ARGS(( const u_char *exp_dn, const u_char *msg, u_char **dnptrs, u_char **lastdnptr )); int dn_skipname _ARGS(( const u_char *comp_dn, const u_char *eom )); #define getshort _getshort #define getlong _getlong #define putshort __putshort #define putlong __putlong #else #include #include #include static dn_find(); #endif #ifdef __STDC__ #define CONST const #else #define CONST #endif /* * Expand compressed domain name 'comp_dn' to full domain name. * 'msg' is a pointer to the begining of the message, * 'eomorig' points to the first location after the message, * 'exp_dn' is a pointer to a buffer of size 'length' for the result. * Return size of compressed name or -1 if there was an error. */ dn_expand(msg, eomorig, comp_dn, exp_dn, length) CONST u_char *msg, *eomorig, *comp_dn; u_char *exp_dn; int length; { register CONST u_char *cp; register u_char *dn; register int n, c; CONST u_char *eom; int len = -1, checked = 0; dn = exp_dn; cp = comp_dn; eom = exp_dn + length; /* * fetch next label in domain name */ while (n = *cp++) { /* * Check for indirection */ switch (n & INDIR_MASK) { case 0: if (dn != exp_dn) { if (dn >= eom) return (-1); *dn++ = '.'; } if (dn+n >= eom) return (-1); checked += n + 1; while (--n >= 0) { if ((c = *cp++) == '.') { if (dn + n + 2 >= eom) return (-1); *dn++ = '\\'; } *dn++ = c; if (cp >= eomorig) /* out of range */ return(-1); } break; case INDIR_MASK: if (len < 0) len = cp - comp_dn + 1; cp = msg + (((n & 0x3f) << 8) | (*cp & 0xff)); if (cp < msg || cp >= eomorig) /* out of range */ return(-1); checked += 2; /* * Check for loops in the compressed name; * if we've looked at the whole message, * there must be a loop. */ if (checked >= eomorig - msg) return (-1); break; default: return (-1); /* flag error */ } } *dn = '\0'; if (len < 0) len = cp - comp_dn; return (len); } /* * Compress domain name 'exp_dn' into 'comp_dn'. * Return the size of the compressed name or -1. * 'length' is the size of the array pointed to by 'comp_dn'. * 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0] * is a pointer to the beginning of the message. The list ends with NULL. * 'lastdnptr' is a pointer to the end of the arrary pointed to * by 'dnptrs'. Side effect is to update the list of pointers for * labels inserted into the message as we compress the name. * If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr' * is NULL, we don't update the list. */ int dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr) CONST u_char *exp_dn; u_char *comp_dn; int length; u_char **dnptrs, **lastdnptr; { register u_char *cp; register CONST u_char *dn; register int c, l; u_char **cpp, **lpp, *sp, *eob; u_char *msg; dn = exp_dn; cp = comp_dn; eob = cp + length; if (dnptrs != NULL) { if ((msg = *dnptrs++) != NULL) { for (cpp = dnptrs; *cpp != NULL; cpp++) ; lpp = cpp; /* end of list to search */ } } else msg = NULL; for (c = *dn++; c != '\0'; ) { /* look to see if we can use pointers */ if (msg != NULL) { if ((l = dn_find(dn-1, msg, dnptrs, lpp)) >= 0) { if (cp+1 >= eob) return (-1); *cp++ = (l >> 8) | INDIR_MASK; *cp++ = l % 256; return (cp - comp_dn); } /* not found, save it */ if (lastdnptr != NULL && cpp < lastdnptr-1) { *cpp++ = cp; *cpp = NULL; } } sp = cp++; /* save ptr to length byte */ do { if (c == '.') { c = *dn++; break; } if (c == '\\') { if ((c = *dn++) == '\0') break; } if (cp >= eob) { if (msg != NULL) *lpp = NULL; return (-1); } *cp++ = c; } while ((c = *dn++) != '\0'); /* catch trailing '.'s but not '..' */ if ((l = cp - sp - 1) == 0 && c == '\0') { cp--; break; } if (l <= 0 || l > MAXLABEL) { if (msg != NULL) *lpp = NULL; return (-1); } *sp = l; } if (cp >= eob) { if (msg != NULL) *lpp = NULL; return (-1); } *cp++ = '\0'; return (cp - comp_dn); } /* * Skip over a compressed domain name. Return the size or -1. */ dn_skipname(comp_dn, eom) CONST u_char *comp_dn, *eom; { register CONST u_char *cp; register int n; cp = comp_dn; while (cp < eom && (n = *cp++)) { /* * check for indirection */ switch (n & INDIR_MASK) { case 0: /* normal case, n == len */ cp += n; continue; default: /* illegal type */ return (-1); case INDIR_MASK: /* indirection */ cp++; } break; } return (cp - comp_dn); } /* * Search for expanded name from a list of previously compressed names. * Return the offset from msg if found or -1. * dnptrs is the pointer to the first name on the list, * not the pointer to the start of the message. */ static int dn_find(exp_dn, msg, dnptrs, lastdnptr) CONST u_char *exp_dn, *msg; u_char **dnptrs, **lastdnptr; { CONST register u_char *dn, *cp; register u_char **cpp; register int n; CONST u_char *sp; for (cpp = dnptrs; cpp < lastdnptr; cpp++) { dn = exp_dn; sp = cp = *cpp; while (n = *cp++) { /* * check for indirection */ switch (n & INDIR_MASK) { case 0: /* normal case, n == len */ while (--n >= 0) { if (*dn == '.') goto next; if (*dn == '\\') dn++; if (*dn++ != *cp++) goto next; } if ((n = *dn++) == '\0' && *cp == '\0') return (sp - msg); if (n == '.') continue; goto next; default: /* illegal type */ return (-1); case INDIR_MASK: /* indirection */ cp = msg + (((n & 0x3f) << 8) | *cp); } } if (*dn == '\0') return (sp - msg); next: ; } return (-1); } /* * Routines to insert/extract short/long's. Must account for byte * order and non-alignment problems. This code at least has the * advantage of being portable. * * used by sendmail. */ u16_t getshort(msgp) CONST u8_t *msgp; { return ((msgp[0] << 8) | (msgp[1] << 0)); } u32_t getlong(msgp) CONST u8_t *msgp; { return ( ((u32_t) msgp[0] << 24) | ((u32_t) msgp[1] << 16) | ((u32_t) msgp[2] << 8) | ((u32_t) msgp[3] << 0)); } void putshort(s, msgp) register U16_t s; register u8_t *msgp; { msgp[1] = s; msgp[0] = s >> 8; } void putlong(l, msgp) register u32_t l; register u8_t *msgp; { msgp[3] = l; msgp[2] = (l >>= 8); msgp[1] = (l >>= 8); msgp[0] = l >> 8; } 0/*- * Copyright (c) 1985, 1989 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)res_init.c 6.14 (Berkeley) 6/27/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include #include #include #include #include #include #include #include #define index(s,c) strchr(s,c) #else #include #include #include #include #include #include #endif /* * Resolver state */ struct state _res; /* * Set up default settings. If the configuration file exist, the values * there will have precedence. Otherwise, the server address is set to * 127.0.0.1 (localhost) and the default domain name comes from gethostname(). * * The configuration file should only be used if you want to redefine your * domain or run without a server on your machine. * * Return 0 if completes successfully, -1 on error */ int res_init() { register FILE *fp; register char *cp, **pp; register int n; char buf[BUFSIZ]; int haveenv = 0; int havesearch = 0; struct servent* servent; u16_t nameserver_port; /* Resolver state default settings */ _res.retrans = RES_TIMEOUT; /* retransmition time interval */ _res.retry = 4; /* number of times to retransmit */ _res.options = RES_DEFAULT; /* options flags */ _res.nscount = 0; /* number of name servers */ _res.defdname[0] = 0; /* domain */ servent= getservbyname("domain", NULL); if (!servent) { h_errno= NO_RECOVERY; return -1; } nameserver_port= servent->s_port; /* Allow user to override the local domain definition */ if ((cp = getenv("LOCALDOMAIN")) != NULL) { (void)strncpy(_res.defdname, cp, sizeof(_res.defdname)); haveenv++; } if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) { /* read the config file */ while (fgets(buf, sizeof(buf), fp) != NULL) { /* read default domain name */ if (!strncmp(buf, "domain", sizeof("domain") - 1)) { if (haveenv) /* skip if have from environ */ continue; cp = buf + sizeof("domain") - 1; while (*cp == ' ' || *cp == '\t') cp++; if ((*cp == '\0') || (*cp == '\n')) continue; (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); if ((cp = index(_res.defdname, '\n')) != NULL) *cp = '\0'; havesearch = 0; continue; } /* set search list */ if (!strncmp(buf, "search", sizeof("search") - 1)) { if (haveenv) /* skip if have from environ */ continue; cp = buf + sizeof("search") - 1; while (*cp == ' ' || *cp == '\t') cp++; if ((*cp == '\0') || (*cp == '\n')) continue; (void)strncpy(_res.defdname, cp, sizeof(_res.defdname) - 1); if ((cp = index(_res.defdname, '\n')) != NULL) *cp = '\0'; /* * Set search list to be blank-separated strings * on rest of line. */ cp = _res.defdname; pp = _res.dnsrch; *pp++ = cp; for (n = 0; *cp && pp < _res.dnsrch + MAXDNSRCH; cp++) { if (*cp == ' ' || *cp == '\t') { *cp = 0; n = 1; } else if (n) { *pp++ = cp; n = 0; } } /* null terminate last domain if there are excess */ while (*cp != '\0' && *cp != ' ' && *cp != '\t') cp++; *cp = '\0'; *pp++ = 0; havesearch = 1; continue; } /* read nameservers to query */ if (!strncmp(buf, "nameserver", sizeof("nameserver") - 1) && _res.nscount < MAXNS) { cp = buf + sizeof("nameserver") - 1; while (*cp == ' ' || *cp == '\t') cp++; if ((*cp == '\0') || (*cp == '\n')) continue; if (!inet_aton(cp, &_res.nsaddr_list[_res.nscount])) continue; _res.nsport_list[_res.nscount]= nameserver_port; _res.nscount++; continue; } } (void) fclose(fp); } if (_res.nscount == 0) { /* "localhost" is the default nameserver. */ _res.nsaddr_list[0]= HTONL(0x7F000001); _res.nsport_list[0]= nameserver_port; _res.nscount= 1; } if (_res.defdname[0] == 0) { if (gethostname(buf, sizeof(_res.defdname)) == 0 && (cp = index(buf, '.'))) (void)strcpy(_res.defdname, cp + 1); } /* find components of local domain that might be searched */ if (havesearch == 0) { pp = _res.dnsrch; *pp++ = _res.defdname; for (cp = _res.defdname, n = 0; *cp; cp++) if (*cp == '.') n++; cp = _res.defdname; for (; n >= LOCALDOMAINPARTS && pp < _res.dnsrch + MAXDFLSRCH; n--) { cp = index(cp, '.'); *pp++ = ++cp; } *pp++ = 0; } _res.options |= RES_INIT; return (0); } /* * Copyright (c) 1985 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)res_mkquery.c 6.12 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include #include #include #include typedef u16_t u_short; typedef unsigned u_int; typedef u32_t u_long; #define bzero(b,l) memset(b,0,l) #define bcopy(s,d,l) memcpy(d,s,l) #define putshort __putshort #define putlong __putlong #else #include #include #include #include #include #endif #ifdef __STDC__ #define _CONST const #else #define _CONST #endif /* * Form all types of queries. * Returns the size of the result or -1. */ res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen) int op; /* opcode of query */ _CONST char *dname; /* domain name */ int class, type; /* class and type of query */ _CONST char *data; /* resource record data */ int datalen; /* length of data */ _CONST struct rrec *newrr; /* new rr for modify or append */ char *buf; /* buffer to put query */ int buflen; /* size of buffer */ { register dns_hdr_t *hp; register char *cp; register int n; char *dnptrs[10], **dpp, **lastdnptr; #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type); #endif /* DEBUG */ /* * Initialize header fields. */ if ((buf == NULL) || (buflen < sizeof(dns_hdr_t))) return(-1); bzero(buf, sizeof(dns_hdr_t)); hp = (dns_hdr_t *) buf; hp->dh_id = htons(++_res.id); hp->dh_flag1= 0; hp->dh_flag2= 0; hp->dh_flag1 |= (op << 3) & DHF_OPCODE; hp->dh_flag2 |= ((_res.options & RES_PRIMARY) != 0 ? 1 : 0) << 6; hp->dh_flag1 |= (_res.options & RES_RECURSE) != 0 ? 1 : 0; hp->dh_flag2 |= NOERROR & DHF_RCODE; cp = buf + sizeof(dns_hdr_t); buflen -= sizeof(dns_hdr_t); dpp = dnptrs; *dpp++ = buf; *dpp++ = NULL; lastdnptr = dnptrs + sizeof(dnptrs)/sizeof(dnptrs[0]); /* * perform opcode specific processing */ switch (op) { case QUERY: if ((buflen -= QFIXEDSZ) < 0) return(-1); if ((n = dn_comp((u8_t *)dname, (u8_t *)cp, buflen, (u8_t **)dnptrs, (u8_t **)lastdnptr)) < 0) return (-1); cp += n; buflen -= n; putshort(type, (u8_t *)cp); cp += sizeof(u_short); putshort(class, (u8_t *)cp); cp += sizeof(u_short); hp->dh_qdcount = htons(1); if (op == QUERY || data == NULL) break; /* * Make an additional record for completion domain. */ buflen -= RRFIXEDSZ; if ((n = dn_comp((u8_t *)data, (u8_t *)cp, buflen, (u8_t **)dnptrs, (u8_t **)lastdnptr)) < 0) return (-1); cp += n; buflen -= n; putshort(T_NULL, (u8_t *)cp); cp += sizeof(u_short); putshort(class, (u8_t *)cp); cp += sizeof(u_short); putlong(0, (u8_t *)cp); cp += sizeof(u_long); putshort(0, (u8_t *)cp); cp += sizeof(u_short); hp->dh_arcount = htons(1); break; case IQUERY: /* * Initialize answer section */ if (buflen < 1 + RRFIXEDSZ + datalen) return (-1); *cp++ = '\0'; /* no domain name */ putshort(type, (u8_t *)cp); cp += sizeof(u_short); putshort(class, (u8_t *)cp); cp += sizeof(u_short); putlong(0, (u8_t *)cp); cp += sizeof(u_long); putshort(datalen, (u8_t *)cp); cp += sizeof(u_short); if (datalen) { bcopy(data, cp, datalen); cp += datalen; } hp->dh_ancount = htons(1); break; #ifdef ALLOW_UPDATES /* * For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA * (Record to be modified is followed by its replacement in msg.) */ case UPDATEM: case UPDATEMA: case UPDATED: /* * The res code for UPDATED and UPDATEDA is the same; user * calls them differently: specifies data for UPDATED; server * ignores data if specified for UPDATEDA. */ case UPDATEDA: buflen -= RRFIXEDSZ + datalen; if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) return (-1); cp += n; putshort(type, cp); cp += sizeof(u_short); putshort(class, cp); cp += sizeof(u_short); putlong(0, cp); cp += sizeof(u_long); putshort(datalen, cp); cp += sizeof(u_short); if (datalen) { bcopy(data, cp, datalen); cp += datalen; } if ( (op == UPDATED) || (op == UPDATEDA) ) { hp->ancount = htons(0); break; } /* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */ case UPDATEA: /* Add new resource record */ buflen -= RRFIXEDSZ + datalen; if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0) return (-1); cp += n; putshort(newrr->r_type, cp); cp += sizeof(u_short); putshort(newrr->r_class, cp); cp += sizeof(u_short); putlong(0, cp); cp += sizeof(u_long); putshort(newrr->r_size, cp); cp += sizeof(u_short); if (newrr->r_size) { bcopy(newrr->r_data, cp, newrr->r_size); cp += newrr->r_size; } hp->ancount = htons(0); break; #endif /* ALLOW_UPDATES */ } return (cp - buf); } /* * Copyright (c) 1988 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that: (1) source distributions retain this entire copyright * notice and comment, and (2) distributions including binaries display * the following acknowledgement: ``This product includes software * developed by the University of California, Berkeley and its contributors'' * in the documentation or other materials provided with the distribution * and in all advertising materials mentioning features or use of this * software. Neither the name of the University nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)res_query.c 5.7 (Berkeley) 6/1/90"; #endif /* LIBC_SCCS and not lint */ #if _MINIX #include #include #include #include #include #include #include #include #include #include #include typedef u8_t u_char; #define bcopy(s,d,l) memcpy(d,s,l) #define hostalias __hostalias #else #include #include #include #include #include #include #include #include #include #include #include extern int errno; #endif #if __STDC__ #define CONST const #else #define CONST #endif #if PACKETSZ > 1024 #define MAXPACKET PACKETSZ #else #define MAXPACKET 1024 #endif int h_errno; /* * Formulate a normal query, send, and await answer. * Returned answer is placed in supplied buffer "answer". * Perform preliminary check of answer, returning success only * if no error is indicated and the answer count is nonzero. * Return the size of the response on success, -1 on error. * Error number is left in h_errno. * Caller must parse answer and determine whether it answers the question. */ int res_query(name, class, type, answer, anslen) char *name; /* domain name */ int class, type; /* class and type of query */ u_char *answer; /* buffer to put answer */ int anslen; /* size of answer buffer */ { char buf[MAXPACKET]; dns_hdr_t *hp; int n; if ((_res.options & RES_INIT) == 0 && res_init() == -1) return (-1); #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_query(%s, %d, %d)\n", name, class, type); #endif n = res_mkquery(QUERY, name, class, type, (char *)NULL, 0, NULL, buf, sizeof(buf)); if (n <= 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_query: mkquery failed\n"); #endif h_errno = NO_RECOVERY; return (n); } n = res_send(buf, n, (char *)answer, anslen); if (n < 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_query: send error(%d)\n", errno); #endif h_errno = TRY_AGAIN; return(n); } hp = (dns_hdr_t *) answer; if ((hp->dh_flag2 & DHF_RCODE) != NOERROR || ntohs(hp->dh_ancount) == 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) printf("rcode = %d, ancount=%d\n", hp->dh_flag2 & DHF_RCODE, ntohs(hp->dh_ancount)); #endif switch (hp->dh_flag2 & DHF_RCODE) { case NXDOMAIN: h_errno = HOST_NOT_FOUND; break; case SERVFAIL: h_errno = TRY_AGAIN; break; case NOERROR: h_errno = NO_DATA; break; case FORMERR: case NOTIMP: case REFUSED: default: h_errno = NO_RECOVERY; break; } return (-1); } return(n); } /* * Formulate a normal query, send, and retrieve answer in supplied buffer. * Return the size of the response on success, -1 on error. * If enabled, implement search rules until answer or unrecoverable failure * is detected. Error number is left in h_errno. * Only useful for queries in the same name hierarchy as the local host * (not, for example, for host address-to-name lookups in domain in-addr.arpa). */ res_search(name, class, type, answer, anslen) char *name; /* domain name */ int class, type; /* class and type of query */ u_char *answer; /* buffer to put answer */ int anslen; /* size of answer */ { register char *cp, **domain; int n, ret, got_nodata = 0; if ((_res.options & RES_INIT) == 0 && res_init() == -1) return (-1); errno = 0; h_errno = HOST_NOT_FOUND; /* default, if we never query */ for (cp = name, n = 0; *cp; cp++) if (*cp == '.') n++; if (n == 0 && (cp = hostalias(name))) return (res_query(cp, class, type, answer, anslen)); /* * We do at least one level of search if * - there is no dot and RES_DEFNAME is set, or * - there is at least one dot, there is no trailing dot, * and RES_DNSRCH is set. */ if ((n == 0 && _res.options & RES_DEFNAMES) || (n != 0 && *--cp != '.' && _res.options & RES_DNSRCH)) for (domain = _res.dnsrch; *domain; domain++) { ret = res_querydomain(name, *domain, class, type, answer, anslen); if (ret > 0) return (ret); /* * If no server present, give up. * If name isn't found in this domain, * keep trying higher domains in the search list * (if that's enabled). * On a NO_DATA error, keep trying, otherwise * a wildcard entry of another type could keep us * from finding this entry higher in the domain. * If we get some other error (negative answer or * server failure), then stop searching up, * but try the input name below in case it's fully-qualified. */ if (errno == ECONNREFUSED) { h_errno = TRY_AGAIN; return (-1); } if (h_errno == NO_DATA) got_nodata++; if ((h_errno != HOST_NOT_FOUND && h_errno != NO_DATA) || (_res.options & RES_DNSRCH) == 0) break; } /* * If the search/default failed, try the name as fully-qualified, * but only if it contained at least one dot (even trailing). * This is purely a heuristic; we assume that any reasonable query * about a top-level domain (for servers, SOA, etc) will not use * res_search. */ if (n && (ret = res_querydomain(name, (char *)NULL, class, type, answer, anslen)) > 0) return (ret); if (got_nodata) h_errno = NO_DATA; return (-1); } /* * Perform a call on res_query on the concatenation of name and domain, * removing a trailing dot from name if domain is NULL. */ int res_querydomain(name, domain, class, type, answer, anslen) char *name, *domain; int class, type; /* class and type of query */ u_char *answer; /* buffer to put answer */ int anslen; /* size of answer */ { char nbuf[2*MAXDNAME+2]; char *longname = nbuf; int n; #ifdef DEBUG if (_res.options & RES_DEBUG) printf("res_querydomain(%s, %s, %d, %d)\n", name, domain, class, type); #endif if (domain == NULL) { /* * Check for trailing '.'; * copy without '.' if present. */ n = strlen(name) - 1; if (name[n] == '.' && n < sizeof(nbuf) - 1) { bcopy(name, nbuf, n); nbuf[n] = '\0'; } else longname = name; } else (void)sprintf(nbuf, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain); return (res_query(longname, class, type, answer, anslen)); } char * hostalias(name) register CONST char *name; { register char *C1, *C2; FILE *fp; char *file; char buf[BUFSIZ]; static char abuf[MAXDNAME]; file = getenv("HOSTALIASES"); if (file == NULL || (fp = fopen(file, "r")) == NULL) return (NULL); buf[sizeof(buf) - 1] = '\0'; while (fgets(buf, sizeof(buf), fp)) { for (C1 = buf; *C1 && !isspace(*C1); ++C1); if (!*C1) break; *C1 = '\0'; if (!strcasecmp(buf, name)) { while (isspace(*++C1)); if (!*C1) break; for (C2 = C1 + 1; *C2 && !isspace(*C2); ++C2); abuf[sizeof(abuf) - 1] = *C2 = '\0'; (void)strncpy(abuf, C1, sizeof(abuf) - 1); fclose(fp); return (abuf); } } fclose(fp); return (NULL); } 1/* * Copyright (c) 1985, 1989 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)res_send.c 6.27 (Berkeley) 2/24/91"; #endif /* LIBC_SCCS and not lint */ /* * Send query to name server and wait for reply. */ #if !_MINIX #include #include #include #include #include #include #include #include #include #include #include #else /* _MINIX */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef u16_t u_short; static int tcp_connect _ARGS(( ipaddr_t host, Tcpport_t port, int *terrno )); static int tcpip_writeall _ARGS(( int fd, const char *buf, size_t siz )); static int udp_connect _ARGS(( void )); static int udp_sendto _ARGS(( int fd, const char *buf, unsigned buflen, ipaddr_t addr, Udpport_t port )); static int udp_receive _ARGS(( int fd, char *buf, unsigned buflen, time_t timeout )); static void alarm_handler _ARGS(( int sig )); #endif /* !_MINIX */ static int s = -1; /* socket used for communications */ #if !_MINIX static struct sockaddr no_addr; #ifndef FD_SET #define NFDBITS 32 #define FD_SETSIZE 32 #define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS))) #define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) #define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS))) #define FD_ZERO(p) bzero((char *)(p), sizeof(*(p))) #endif /* FD_SET */ #endif /* _MINIX */ res_send(buf, buflen, answer, anslen) const char *buf; int buflen; char *answer; int anslen; { register int n; int try, v_circuit, resplen, ns; int gotsomewhere = 0, connected = 0; int connreset = 0; #if !_MINIX u_short id, len; #else /* _MINIX */ u16_t id, len; #endif /* !_MINIX */ char *cp; #if !_MINIX fd_set dsmask; struct timeval timeout; HEADER *hp = (HEADER *) buf; HEADER *anhp = (HEADER *) answer; struct iovec iov[2]; #else /* _MINIX */ time_t timeout; dns_hdr_t *hp = (dns_hdr_t *) buf; dns_hdr_t *anhp = (dns_hdr_t *) answer; #endif /* !_MINIX */ int terrno = ETIMEDOUT; char junk[512]; #ifdef DEBUG if (_res.options & RES_DEBUG) { printf("res_send()\n"); __p_query(buf); } #endif /* DEBUG */ if (!(_res.options & RES_INIT)) if (res_init() == -1) { return(-1); } v_circuit = (_res.options & RES_USEVC) || buflen > PACKETSZ; #if !_MINIX id = hp->id; #else /* _MINIX */ id = hp->dh_id; #endif /* !_MINIX */ /* * Send request, RETRY times, or until successful */ for (try = 0; try < _res.retry; try++) { for (ns = 0; ns < _res.nscount; ns++) { #ifdef DEBUG #if !_MINIX if (_res.options & RES_DEBUG) printf("Querying server (# %d) address = %s\n", ns+1, inet_ntoa(_res.nsaddr_list[ns].sin_addr)); #else /* _MINIX */ if (_res.options & RES_DEBUG) printf("Querying server (# %d) address = %s\n", ns+1, inet_ntoa(_res.nsaddr_list[ns])); #endif /* !_MINIX */ #endif /* DEBUG */ usevc: if (v_circuit) { #if !_MINIX int truncated = 0; /* * Use virtual circuit; * at most one attempt per server. */ try = _res.retry; if (s < 0) { s = socket(AF_INET, SOCK_STREAM, 0); if (s < 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("socket (vc) failed"); #endif /* DEBUG */ continue; } if (connect(s, (struct sockaddr *)&(_res.nsaddr_list[ns]), sizeof(struct sockaddr)) < 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("connect failed"); #endif /* DEBUG */ (void) close(s); s = -1; continue; } } /* * Send length & message */ len = htons((u_short)buflen); iov[0].iov_base = (caddr_t)&len; iov[0].iov_len = sizeof(len); iov[1].iov_base = (char *)buf; iov[1].iov_len = buflen; if (writev(s, iov, 2) != sizeof(len) + buflen) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("write failed"); #endif /* DEBUG */ (void) close(s); s = -1; continue; } /* * Receive length & response */ cp = answer; len = sizeof(short); while (len != 0 && (n = read(s, (char *)cp, (int)len)) > 0) { cp += n; len -= n; } if (n <= 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("read failed"); #endif /* DEBUG */ (void) close(s); s = -1; /* * A long running process might get its TCP * connection reset if the remote server was * restarted. Requery the server instead of * trying a new one. When there is only one * server, this means that a query might work * instead of failing. We only allow one reset * per query to prevent looping. */ if (terrno == ECONNRESET && !connreset) { connreset = 1; ns--; } continue; } cp = answer; if ((resplen = ntohs(*(u_short *)cp)) > anslen) { #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "response truncated\n"); #endif /* DEBUG */ len = anslen; truncated = 1; } else len = resplen; while (len != 0 && (n = read(s, (char *)cp, (int)len)) > 0) { cp += n; len -= n; } if (n <= 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("read failed"); #endif /* DEBUG */ (void) close(s); s = -1; continue; } if (truncated) { /* * Flush rest of answer * so connection stays in synch. */ anhp->tc = 1; len = resplen - anslen; while (len != 0) { n = (len > sizeof(junk) ? sizeof(junk) : len); if ((n = read(s, junk, n)) > 0) len -= n; else break; } } #else /* _MINIX */ int truncated = 0; int nbytes; /* * Use virtual circuit; * at most one attempt per server. */ try = _res.retry; if (s < 01111111111111) { s= tcp_connect(_res.nsaddr_list[ns], _res.nsport_list[ns], &terrno); if (s == -1) continue; } /* * Send length & message */ len = htons((u_short)buflen); nbytes= tcpip_writeall(s, (char *)&len, sizeof(len)); if (nbytes != sizeof(len)) { terrno= errno; #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "write failed: %s\n", strerror(terrno)); #endif /* DEBUG */ close(s); s= -1; continue; } nbytes= tcpip_writeall(s, buf, buflen); if (nbytes != buflen) { terrno= errno; #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "write failed: %s\n", strerror(terrno)); #endif /* DEBUG */ close(s); s= -1; continue; } /* * Receive length & response */ cp = answer; len = sizeof(short); while (len != 0) { n = read(s, (char *)cp, (int)len); if (n <= 0) break; cp += n; assert(len >= n); len -= n; } if (len) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "read failed: %s\n", strerror(terrno)); #endif /* DEBUG */ close(s); s= -1; /* * A long running process might get its TCP * connection reset if the remote server was * restarted. Requery the server instead of * trying a new one. When there is only one * server, this means that a query might work * instead of failing. We only allow one reset * per query to prevent looping. */ if (terrno == ECONNRESET && !connreset) { connreset = 1; ns--; } continue; } cp = answer; if ((resplen = ntohs(*(u_short *)cp)) > anslen) { #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "response truncated\n"); #endif /* DEBUG */ len = anslen; truncated = 1; } else len = resplen; while (len != 0) { n= read(s, (char *)cp, (int)len); if (n <= 0) break; cp += n; assert(len >= n); len -= n; } if (len) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) fprintf(stderr, "read failed: %s\n", strerror(terrno)); #endif /* DEBUG */ close(s); s= -1; continue; } if (truncated) { /* * Flush rest of answer * so connection stays in synch. */ anhp->dh_flag1 |= DHF_TC; len = resplen - anslen; while (len != 0) { n = (len > sizeof(junk) ? sizeof(junk) : len); n = read(s, junk, n); if (n <= 0) { assert(len >= n); len -= n; } else break; } } #endif /* _MINIX */ } else { #if !_MINIX /* * Use datagrams. */ if (s < 0) { s = socket(AF_INET, SOCK_DGRAM, 0); if (s < 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("socket (dg) failed"); #endif /* DEBUG */ continue; } } #if BSD >= 43 /* * I'm tired of answering this question, so: * On a 4.3BSD+ machine (client and server, * actually), sending to a nameserver datagram * port with no nameserver will cause an * ICMP port unreachable message to be returned. * If our datagram socket is "connected" to the * server, we get an ECONNREFUSED error on the next * socket operation, and select returns if the * error message is received. We can thus detect * the absence of a nameserver without timing out. * If we have sent queries to at least two servers, * however, we don't want to remain connected, * as we wish to receive answers from the first * server to respond. */ if (_res.nscount == 1 || (try == 0 && ns == 0)) { /* * Don't use connect if we might * still receive a response * from another server. */ if (connected == 0) { if (connect(s, (struct sockaddr *)&_res.nsaddr_list[ns], sizeof(struct sockaddr)) < 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("connect"); #endif /* DEBUG */ continue; } connected = 1; } if (send(s, buf, buflen, 0) != buflen) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("send"); #endif /* DEBUG */ continue; } } else { /* * Disconnect if we want to listen * for responses from more than one server. */ if (connected) { (void) connect(s, &no_addr, sizeof(no_addr)); connected = 0; } #endif /* BSD */ if (sendto(s, buf, buflen, 0, (struct sockaddr *)&_res.nsaddr_list[ns], sizeof(struct sockaddr)) != buflen) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("sendto"); #endif /* DEBUG */ continue; } #if BSD >= 43 } #endif /* BSD */ /* * Wait for reply */ timeout.tv_sec = (_res.retrans << try); if (try > 0) timeout.tv_sec /= _res.nscount; if (timeout.tv_sec <= 0) timeout.tv_sec = 1; timeout.tv_usec = 0; wait: FD_ZERO(&dsmask); FD_SET(s, &dsmask); n = select(s+1, &dsmask, (fd_set *)NULL, (fd_set *)NULL, &timeout); if (n < 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("select"); #endif /* DEBUG */ continue; } if (n == 0) { /* * timeout */ #ifdef DEBUG if (_res.options & RES_DEBUG) printf("timeout\n"); #endif /* DEBUG */ #if BSD >= 43 gotsomewhere = 1; #endif continue; } if ((resplen = recv(s, answer, anslen, 0)) <= 0) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("recvfrom"); #endif /* DEBUG */ continue; } gotsomewhere = 1; if (id != anhp->id) { /* * response from old query, ignore it */ #ifdef DEBUG if (_res.options & RES_DEBUG) { printf("old answer:\n"); __p_query(answer); } #endif /* DEBUG */ goto wait; } if (!(_res.options & RES_IGNTC) && anhp->tc) { /* * get rest of answer; * use TCP with same server. */ #ifdef DEBUG if (_res.options & RES_DEBUG) printf("truncated answer\n"); #endif /* DEBUG */ (void) close(s); s = -1; v_circuit = 1; goto usevc; } #else /* _MINIX */ /* * Use datagrams. */ if (s < 0) { s = udp_connect(); if (s < 0) { terrno = errno; #ifdef DEBUG if (_res.options & RES_DEBUG) perror("udp_connect failed"); #endif /* DEBUG */ continue; } } if (udp_sendto(s, buf, buflen, _res.nsaddr_list[ns], _res.nsport_list[ns]) != buflen) { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("sendto"); #endif /* DEBUG */ continue; } /* * Wait for reply */ timeout= (_res.retrans << try); if (try > 0) timeout /= _res.nscount; if (timeout <= 0) timeout= 1; wait: if ((resplen= udp_receive(s, answer, anslen, timeout)) == -1) { if (errno == EINTR) { /* * timeout */ #ifdef DEBUG if (_res.options & RES_DEBUG) printf("timeout\n"); #endif /* DEBUG */ gotsomewhere = 1; } else { #ifdef DEBUG if (_res.options & RES_DEBUG) perror("udp_receive"); #endif /* DEBUG */ } continue; } gotsomewhere = 1; if (id != anhp->dh_id) { /* * response from old query, ignore it */ #ifdef DEBUG if (_res.options & RES_DEBUG) { printf("old answer:\n"); __p_query(answer); } #endif /* DEBUG */ goto wait; } if (!(_res.options & RES_IGNTC) && (anhp->dh_flag1 & DHF_TC)) { /* * get rest of answer; * use TCP with same server. */ #ifdef DEBUG if (_res.options & RES_DEBUG) printf("truncated answer\n"); #endif /* DEBUG */ (void) close(s); s = -1; v_circuit = 1; goto usevc; } #endif /* !_MINIX */ } #ifdef DEBUG if (_res.options & RES_DEBUG) { printf("got answer:\n"); __p_query(answer); } #endif /* DEBUG */ /* * If using virtual circuits, we assume that the first server * is preferred * over the rest (i.e. it is on the local * machine) and only keep that one open. * If we have temporarily opened a virtual circuit, * or if we haven't been asked to keep a socket open, * close the socket. */ if ((v_circuit && ((_res.options & RES_USEVC) == 0 || ns != 0)) || (_res.options & RES_STAYOPEN) == 0) { (void) close(s); s = -1; } return (resplen); } } if (s >= 0) { (void) close(s); s = -1; } if (v_circuit == 0) if (gotsomewhere == 0) errno = ECONNREFUSED; /* no nameservers found */ else errno = ETIMEDOUT; /* no answer obtained */ else errno = terrno; return (-1); } /* * This routine is for closing the socket if a virtual circuit is used and * the program wants to close it. This provides support for endhostent() * which expects to close the socket. * * This routine is not expected to be user visible. */ void _res_close() { if (s != -1) { (void) close(s); s = -1; } } #if _MINIX static int tcp_connect(host, port, terrno) ipaddr_t host; tcpport_t port; int *terrno; { char *dev_name; int fd; int error; nwio_tcpconf_t tcpconf; nwio_tcpcl_t clopt; dev_name= getenv("TCP_DEVICE"); if (!dev_name) dev_name= TCP_DEVICE; fd= open(dev_name, O_RDWR); if (fd == -1) { *terrno= errno; return -1; } tcpconf.nwtc_flags= NWTC_EXCL | NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr= host; tcpconf.nwtc_remport= port; error= ioctl(fd, NWIOSTCPCONF, &tcpconf); if (error == -1) { *terrno= errno; close(fd); return -1; } clopt.nwtcl_flags= 0; error= ioctl(fd, NWIOTCPCONN, &clopt); if (error == -1) { *terrno= errno; close(fd); return -1; } *terrno= 0; return fd; } static int tcpip_writeall(fd, buf, siz) int fd; const char *buf; size_t siz; { size_t siz_org; int nbytes; siz_org= siz; while (siz) { nbytes= write(fd, buf, siz); if (nbytes <= 0) return siz_org-siz; assert(siz >= nbytes); buf += nbytes; siz -= nbytes; } return siz_org; } static int udp_connect() { nwio_udpopt_t udpopt; char *dev_name; int fd, r, terrno; dev_name= getenv("UDP_DEVICE"); if (!dev_name) dev_name= UDP_DEVICE; fd= open(dev_name, O_RDWR); if (fd == -1) return -1; udpopt.nwuo_flags= NWUO_COPY | NWUO_LP_SEL | NWUO_EN_LOC | NWUO_EN_BROAD | NWUO_RP_ANY | NWUO_RA_ANY | NWUO_RWDATALL | NWUO_DI_IPOPT; r= ioctl(fd, NWIOSUDPOPT, &udpopt); if (r == -1) { terrno= errno; close(fd); errno= terrno; return -1; } return fd; } static int udp_sendto(fd, buf, buflen, addr, port) int fd; const char *buf; unsigned buflen; ipaddr_t addr; udpport_t port; { char *newbuf; udp_io_hdr_t *udp_io_hdr; int r, terrno; newbuf= malloc(sizeof(*udp_io_hdr) + buflen); if (newbuf == NULL) { errno= ENOMEM; return -1; } udp_io_hdr= (udp_io_hdr_t *)newbuf; udp_io_hdr->uih_dst_addr= addr; udp_io_hdr->uih_dst_port= port; udp_io_hdr->uih_ip_opt_len= 0; udp_io_hdr->uih_data_len= buflen; memcpy(newbuf + sizeof(*udp_io_hdr), buf, buflen); r= write(fd, newbuf, sizeof(*udp_io_hdr) + buflen); terrno= errno; free(newbuf); if (r >= sizeof(*udp_io_hdr)) r -= sizeof(*udp_io_hdr); errno= terrno; return r; } static void alarm_handler(sig) int sig; { signal(SIGALRM, alarm_handler); alarm(1); } static int udp_receive(fd, buf, buflen, timeout) int fd; char *buf; unsigned buflen; time_t timeout; { char *newbuf; udp_io_hdr_t *udp_io_hdr; int r, terrno; void (*u_handler) _ARGS(( int sig )); time_t u_timeout; newbuf= malloc(sizeof(*udp_io_hdr) + buflen); if (newbuf == NULL) { errno= ENOMEM; return -1; } u_handler= signal(SIGALRM, alarm_handler); u_timeout= alarm(timeout); r= read(fd, newbuf, sizeof(*udp_io_hdr) + buflen); terrno= errno; if (r < 0 || r <= sizeof(*udp_io_hdr)) { if (r > 0) r= 0; free(newbuf); alarm(0); signal(SIGALRM, u_handler); alarm(u_timeout); errno= terrno; return r; } memcpy(buf, newbuf + sizeof(*udp_io_hdr), r - sizeof(*udp_io_hdr)); free(newbuf); alarm(0); signal(SIGALRM, u_handler); alarm(u_timeout); return r-sizeof(*udp_io_hdr); } #endif /* strcasecmp.c Created Oct 14, 1991 by Philip Homburg */ #include #include #ifdef __STDC__ #define _CONST const #else #define _CONST #endif int strcasecmp(s1, s2) _CONST char *s1, *s2; { int c1, c2; while (c1= toupper(*s1++), c2= toupper(*s2++), c1 == c2 && (c1 & c2)) ; if (c1 & c2) return c1 < c2 ? -1 : 1; return c1 ? 1 : (c2 ? -1 : 0); } int strncasecmp(s1, s2, len) _CONST char *s1, *s2; size_t len; { int c1, c2; do { if (len == 0) return 0; len--; } while (c1= toupper(*s1++), c2= toupper(*s2++), c1 == c2 && (c1 & c2)) ; if (c1 & c2) return c1 < c2 ? -1 : 1; return c1 ? 1 : (c2 ? -1 : 0); } /* servxcheck() - Service access check. Author: Kees J. Bot * 8 Jan 1997 */ #define nil 0 #define ioctl _ioctl #define open _open #define write _write #define close _close #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Default service access file. */ static const char *path_servacces = _PATH_SERVACCES; #define WLEN 256 static int getword(FILE *fp, char *word) /* Read a word from the file open by 'fp', skip whitespace and comments. * Colon and semicolon are returned as a one character "word". Returns * word[0] or EOF. */ { int c; char *pw; int wc; wc= 0; for (;;) { if ((c= getc(fp)) == EOF) return EOF; if (c == '#') { wc= 1; continue; } if (c == '\n') { wc= 0; continue; } if (wc) continue; if (c <= ' ') continue; break; } pw= word; if (c == ':' || c == ';') { *pw++ = c; } else { do { if (pw < word + WLEN-1) *pw++ = c; c= getc(fp); } while (c != EOF && c > ' ' && c != ':' && c != ';'); if (c != EOF) ungetc(c, fp); } *pw= 0; return word[0]; } static int netspec(char *word, ipaddr_t *addr, ipaddr_t *mask) /* Try to interpret 'word' as an network spec, e.g. 172.16.102.64/27. */ { char *slash; int r; static char S32[]= "/32"; if (*word == 0) return 0; if ((slash= strchr(word, '/')) == NULL) slash= S32; *slash= 0; *addr= inet_addr(word); *slash++= '/'; if (*addr == -1) return 0; r= 0; while ((*slash - '0') < 10u) { r= 10*r + (*slash++ - '0'); if (r > 32) return 0; } if (*slash != 0 || r == 0) return 0; *mask= htonl(r == 0 ? 0L : (0xFFFFFFFFUL >> (32 - r)) << (32 - r)); return 1; } static int match(const char *word, const char *pattern) /* Match word onto a pattern. Pattern may contain the * wildcard. */ { unsigned cw, cp; #define lc(c, d) ((((c)= (d)) - 'A') <= ('Z' - 'A') ? (c)+= ('a' - 'A') : 0) for (;;) { lc(cw, *word); lc(cp, *pattern); if (cp == '*') { do pattern++; while (*pattern == '*'); lc(cp, *pattern); if (cp == 0) return 1; while (cw != 0) { if (cw == cp && match(word+1, pattern+1)) return 1; word++; lc(cw, *word); } return 0; } else if (cw == 0 || cp == 0) { return cw == cp; } else if (cw == cp) { word++; pattern++; } else { return 0; } } #undef lc } static int get_name(ipaddr_t addr, char *name) /* Do a reverse lookup on the remote IP address followed by a forward lookup * to check if the host has that address. Return true if this is so, return * either the true name or the ascii IP address in name[]. */ { struct hostent *he; int ok, i; ok= 0; he= gethostbyaddr((char *) &addr, sizeof(addr), AF_INET); if (he != NULL) { strcpy(name, he->h_name); he= gethostbyname(name); if (he != NULL && he->h_addrtype == AF_INET) { for (i= 0; he->h_addr_list[i] != NULL; i++) { if (memcmp(he->h_addr_list[i], &addr, sizeof(addr)) == 0) { ok= 1; break; } } } } strcpy(name, ok ? he->h_name : inet_ntoa(addr)); return ok; } /* "state" and "log" flags, made to be bitwise comparable. */ #define DEFFAIL 0x01 #define FAIL (0x02 | DEFFAIL) #define PASS 0x04 int servxcheck(int fd, const char *service, void (*logf)(int pass, const char *name)) { nwio_tcpconf_t tcpconf; FILE *fp; char word[WLEN]; char name[WLEN]; int c; int got_name, slist, seen, explicit, state, log; ipaddr_t addr, mask; /* Get addresses and port numbers. */ if (ioctl(fd, NWIOGTCPCONF, &tcpconf) < 0) return 1; /* ? */ /* Accept local connections without comment. */ if ((tcpconf.nwtc_remaddr & HTONL(0xFF000000)) == HTONL(0x7F000000) || tcpconf.nwtc_remaddr == tcpconf.nwtc_locaddr ) { return 1; } if ((fp= fopen(path_servacces, "r")) == nil) { /* Succeed on error, fail if simply nonexistent. */ return (errno != ENOENT); } slist= 1; /* Services list (before the colon.) */ seen= 0; /* Given service not yet seen. */ explicit= 0; /* Service mentioned explicitly. */ got_name= -1; /* No reverse lookup done yet. */ log= FAIL; /* By default log failures only. */ state= DEFFAIL; /* Access denied until we know better. */ while ((c= getword(fp, word)) != EOF) { if (c == ':') { slist= 0; /* Switch to access list. */ } else if (c == ';') { slist= 1; /* Back to list of services. */ seen= 0; } else if (slist) { /* Traverse services list. */ if (match(service, word)) { /* Service has been spotted! */ if (match(word, service)) { /* Service mentioned without wildcards. */ seen= explicit= 1; } else { /* Matched by a wildcard. */ if (!explicit) seen= 1; } } } else { /* Traverse access list. */ if (c == 'l' && strcmp(word, "log") == 0) { if (seen) { /* Log failures and successes. */ log= FAIL|PASS; } continue; } if (c != '-' && c != '+') { if (logf == nil) { fprintf(stderr, "%s: strange check word '%s'\n", path_servacces, word); } continue; } if (seen) { if (state == DEFFAIL) { /* First check determines the default. */ state= c == '+' ? FAIL : PASS; } if ((state == PASS) == (c == '+')) { /* This check won't change state. */ } else if (word[1] == 0) { /* Lone + or - allows all or none. */ state= c == '-' ? FAIL : PASS; } else if (netspec(word+1, &addr, &mask)) { /* Remote host is on the specified network? */ if (((tcpconf.nwtc_remaddr ^ addr) & mask) == 0) { state= c == '-' ? FAIL : PASS; } } else { /* Name check. */ if (got_name == -1) { got_name= get_name(tcpconf.nwtc_remaddr, name); } /* Remote host name matches the word? */ if (!got_name) { state= FAIL; } else if (match(name, word+1)) { state= c == '-' ? FAIL : PASS; } } } } } fclose(fp); if ((log & state) != 0) { /* Log the result of the check. */ if (got_name == -1) (void) get_name(tcpconf.nwtc_remaddr, name); if (logf != nil) { (*logf)(state == PASS, name); } else { int lfd; char line[128+WLEN]; time_t t; struct tm *tm; char month[][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", }; if ((lfd= open("/usr/adm/log", O_WRONLY|O_APPEND)) != -1) { time(&t); tm= localtime(&t); sprintf(line, "%s %02d %02d:%02d:%02d service '%s' %s to %s\n", month[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, service, state == PASS ? "granted" : "denied", name); (void) write(lfd, line, strlen(line)); close(lfd); } } } return state == PASS; } char *servxfile(const char *file) /* Specify a file to use for the access checks other than the default. Return * the old path. */ { const char *oldpath= path_servacces; path_servacces= file; return (char *) oldpath; /* (avoid const poisoning) */ } '1/* dhcp_gettag() Author: Kees J. Bot * 1 Dec 2000 */ #define nil ((void*)0) #include #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) int dhcp_gettag(dhcp_t *dp, int searchtag, u8_t **pdata, size_t *plen) { /* Find a tag in the options field, or possibly in the file or sname * fields. Return true iff found, and return the data and/or length if * their pointers are non-null. */ u8_t *p; u8_t *optfield[3]; size_t optlen[3]; int i, tag, len; /* The DHCP magic number must be correct, or no tags. */ if (dp->magic != DHCP_MAGIC) return 0; optfield[0]= dp->options; optlen[0]= arraysize(dp->options); optfield[1]= dp->file; optlen[1]= 0; /* Unknown if used for options yet. */ optfield[2]= dp->sname; optlen[2]= 0; for (i= 0; i < 3; i++) { p= optfield[i]; while (p < optfield[i] + optlen[i]) { tag= *p++; if (tag == 255) break; len= tag == 0 ? 0 : *p++; if (tag == searchtag) { if (pdata != nil) *pdata= p; if (plen != nil) *plen= len; return 1; } if (tag == DHCP_TAG_OVERLOAD) { /* There are also options in the file or sname field. */ if (*p & 1) optlen[1]= arraysize(dp->file); if (*p & 2) optlen[1]= arraysize(dp->sname); } p += len; } } return 0; } /* dhcp_init(), dhcp_settag() Author: Kees J. Bot * 1 Dec 2000 */ #define nil ((void*)0) #include #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) void dhcp_init(dhcp_t *dp) { /* Initialize a DHCP packet. */ memset(dp, 0, offsetof(dhcp_t, magic)); dp->magic= DHCP_MAGIC; memset(dp->options, 255, sizeof(dp->options)); } int dhcp_settag(dhcp_t *dp, int tag, void *data, size_t len) { /* Add a tag to a DHCP packet. No padding. Only do the options field. * (This is Minix, we don't need megabytes of silly bits of data.) * The length may be zero to delete a tag. */ u8_t *p; int n; if (tag <= 0 || tag >= 255) return 0; for (p= dp->options; p < arraylimit(dp->options) && *p != 255; p += n) { n= 1 + 1 + p[1]; if (*p == tag) { /* The tag is already there, remove it so it gets replaced. */ memmove(p, p + n, arraylimit(dp->options) - (p + n)); memset(arraylimit(dp->options) - n, 255, n); n= 0; } } /* Add tag. */ if (len == 0) { /* We're merely deleting a tag. */ } else if (p + 1 + 1 + len <= arraylimit(dp->options)) { *p++ = tag; *p++ = len; memcpy(p, data, len); } else { /* Oops, it didn't fit? Is this really Minix??? */ return 0; } return 1; } .;..!Arguments.c"ArraySort.mod#CSP.mod$Conversion.mod%EM.e&InOut.mod'LtoUset.e(Makefile)MathLib0.mod*Mathlib.mod+PascalIO.mod,Processes.mod-RealConver.mod.RealInOut.mod/SYSTEM.c0Semaphores.mod1Storage.mod2StrAss.c3Streams.mod4Strings.mod5Termcap.mod6Terminal.mod7Traps.mod8XXTermcap.c9absd.c:absf.e;absi.c<absl.c=blockmove.c>cap.c?catch.c@confarray.cAdvi.cBhalt.cChead_m2.eDinit.cEload.cFpar_misc.eGrandom.modHrcka.cIrcki.cJrckil.cKrcku.cLrckul.cMsigtrp.cNstackprio.cOstore.cPucheck.c/* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: Access to program arguments and environment Author: Ceriel J.H. Jacobs Version: $Header: Arguments.c,v 1.5 88/09/06 15:34:47 ceriel Exp $ */ extern char **argv, ***_penviron; extern int argc; unsigned int _Arguments__Argc; static char * findname(s1, s2) register char *s1, *s2; { while (*s1 == *s2++) s1++; if (*s1 == '\0' && *(s2-1) == '=') return s2; return 0; } static unsigned int scopy(src, dst, max) register char *src, *dst; unsigned int max; { register unsigned int i = 0; while (*src && i <= max) { i++; *dst++ = *src++; } if (i <= max) { *dst = '\0'; return i+1; } while (*src++) i++; return i + 1; } _Arguments_() { _Arguments__Argc = argc; } unsigned _Arguments__Argv(n, argument, l, u, s) unsigned int u; char *argument; { if (n >= argc) return 0; return scopy(argv[n], argument, u); } unsigned _Arguments__GetEnv(name, nn, nu, ns, value, l, u, s) char *name, *value; unsigned int nu, u; { register char **p = *_penviron; register char *v = 0; while (*p && !(v = findname(name, *p++))) { /* nothing */ } if (!v) return 0; return scopy(v, value, u); } (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE ArraySort; (* Module: Array sorting module. Author: Ceriel J.H. Jacobs Version: $Header: ArraySort.mod,v 1.3 91/03/05 13:44:06 ceriel Exp $ *) FROM SYSTEM IMPORT ADDRESS, BYTE; (* no generics in Modula-2, sorry *) TYPE BytePtr = POINTER TO BYTE; VAR compareproc: CompareProc; PROCEDURE Sort(base: ADDRESS; (* address of array *) nel: CARDINAL; (* number of elements in array *) size: CARDINAL; (* size of each element *) compar: CompareProc); (* the comparison procedure *) BEGIN compareproc := compar; qsort(base, base+(nel-1)*size, size); END Sort; PROCEDURE qsort(a1, a2: ADDRESS; size: CARDINAL); (* Implemented with quick-sort, with some extra's *) VAR left, right, lefteq, righteq: ADDRESS; cmp: CompareResult; mainloop: BOOLEAN; BEGIN WHILE a2 > a1 DO left := a1; right := a2; lefteq := a1 + size * (((a2 - a1) + size) DIV (2 * size)); righteq := lefteq; (* Pick an element in the middle of the array. We will collect the equals around it. "lefteq" and "righteq" indicate the left and right bounds of the equals respectively. Smaller elements end up left of it, larger elements end up right of it. *) LOOP LOOP IF left >= lefteq THEN EXIT END; cmp := compareproc(left, lefteq); IF cmp = greater THEN EXIT END; IF cmp = less THEN left := left + size; ELSE (* equal, so exchange with the element to the left of the "equal"-interval. *) lefteq := lefteq - size; exchange(left, lefteq, size); END; END; mainloop := FALSE; LOOP IF right <= righteq THEN EXIT END; cmp := compareproc(right, righteq); IF cmp = less THEN IF left < lefteq THEN (* larger one at the left, so exchange *) exchange(left,right,size); left := left + size; right := right - size; mainloop := TRUE; EXIT; END; (* no more room at the left part, so we move the "equal-interval" one place to the right, and the smaller element to the left of it. This is best expressed as a three-way exchange. *) righteq := righteq + size; threewayexchange(left, righteq, right, size); lefteq := lefteq + size; left := lefteq; ELSIF cmp = equal THEN (* equal, zo exchange with the element to the right of the "equal" interval *) righteq := righteq + size; exchange(right, righteq, size); ELSE (* leave it where it is *) right := right - size; END; END; IF (NOT mainloop) THEN IF left >= lefteq THEN (* sort "smaller" part *) qsort(a1, lefteq - size, size); (* and now the "larger" part, saving a procedure call, because of this big WHILE loop *) a1 := righteq + size; EXIT; (* from the LOOP *) END; (* larger element to the left, but no more room, so move the "equal-interval" one place to the left, and the larger element to the right of it. *) lefteq := lefteq - size; threewayexchange(right, lefteq, left, size); righteq := righteq - size; right := righteq; END; END; END; END qsort; PROCEDURE exchange(a,b: BytePtr; size : CARDINAL); VAR c: BYTE; BEGIN WHILE size > 0 DO DEC(size); c := a^; a^ := b^; a := ADDRESS(a) + 1; b^ := c; b := ADDRESS(b) + 1; END; END exchange; PROCEDURE threewayexchange(p,q,r: BytePtr; size: CARDINAL); VAR c: BYTE; BEGIN WHILE size > 0 DO DEC(size); c := p^; p^ := r^; p := ADDRESS(p) + 1; r^ := q^; r := ADDRESS(r) + 1; q^ := c; q := ADDRESS(q) + 1; END; END threewayexchange; END ArraySort. (*$R-*) IMPLEMENTATION MODULE CSP; (* Module: Communicating Sequential Processes From: "A Modula-2 Implementation of CSP", M. Collado, R. Morales, J.J. Moreno, SIGPlan Notices, Volume 22, Number 6, June 1987. Some modifications by Ceriel J.H. Jacobs Version: $Header: CSP.mod,v 1.9 91/09/24 17:48:31 ceriel Exp $ See this article for an explanation of the use of this module. *) FROM random IMPORT Uniform; FROM SYSTEM IMPORT BYTE, ADDRESS, NEWPROCESS, TRANSFER; FROM Storage IMPORT Allocate, Deallocate; FROM Traps IMPORT Message; CONST WorkSpaceSize = 2000; TYPE ByteAddress = POINTER TO BYTE; Channel = POINTER TO ChannelDescriptor; ProcessType = POINTER TO ProcessDescriptor; ProcessDescriptor = RECORD next: ProcessType; father: ProcessType; cor: ADDRESS; wsp: ADDRESS; guardindex: INTEGER; guardno: CARDINAL; guardcount: CARDINAL; opened: Channel; sons: CARDINAL; msgadr: ADDRESS; msglen: CARDINAL; END; Queue = RECORD head, tail: ProcessType; END; ChannelDescriptor = RECORD senders: Queue; owner: ProcessType; guardindex: INTEGER; next: Channel; END; VAR cp: ProcessType; free, ready: Queue; (* ------------ Private modules and procedures ------------- *) MODULE ProcessQueue; IMPORT ProcessType, Queue; EXPORT Push, Pop, InitQueue, IsEmpty; PROCEDURE InitQueue(VAR q: Queue); BEGIN WITH q DO head := NIL; tail := NIL END END InitQueue; PROCEDURE Push(p: ProcessType; VAR q: Queue); BEGIN p^.next := NIL; WITH q DO IF head = NIL THEN tail := p ELSE head^.next := p END; head := p END END Push; PROCEDURE Pop(VAR q: Queue; VAR p: ProcessType); BEGIN WITH q DO p := tail; IF p # NIL THEN tail := tail^.next; IF head = p THEN head := NIL END END END END Pop; PROCEDURE IsEmpty(q: Queue): BOOLEAN; BEGIN RETURN q.head = NIL END IsEmpty; END ProcessQueue; PROCEDURE DoTransfer; VAR aux: ProcessType; BEGIN aux := cp; Pop(ready, cp); IF cp = NIL THEN HALT ELSE TRANSFER(aux^.cor, cp^.cor) END END DoTransfer; PROCEDURE OpenChannel(ch: Channel; n: INTEGER); BEGIN WITH ch^ DO IF guardindex = 0 THEN guardindex := n; next := cp^.opened; cp^.opened := ch END END END OpenChannel; PROCEDURE CloseChannels(p: ProcessType); BEGIN WITH p^ DO WHILE opened # NIL DO opened^.guardindex := 0; opened := opened^.next END END END CloseChannels; PROCEDURE ThereAreOpenChannels(): BOOLEAN; BEGIN RETURN cp^.opened # NIL; END ThereAreOpenChannels; PROCEDURE Sending(ch: Channel): BOOLEAN; BEGIN RETURN NOT IsEmpty(ch^.senders) END Sending; (* -------------- Public Procedures ----------------- *) PROCEDURE COBEGIN; (* Beginning of a COBEGIN .. COEND structure *) BEGIN END COBEGIN; PROCEDURE COEND; (* End of a COBEGIN .. COEND structure *) (* VAR aux: ProcessType; *) BEGIN IF cp^.sons > 0 THEN DoTransfer END END COEND; PROCEDURE StartProcess(P: PROC); (* Start an anonimous process that executes the procedure P *) VAR newprocess: ProcessType; BEGIN Pop(free, newprocess); IF newprocess = NIL THEN Allocate(newprocess,SIZE(ProcessDescriptor)); Allocate(newprocess^.wsp, WorkSpaceSize) END; WITH newprocess^ DO father := cp; sons := 0; msglen := 0; NEWPROCESS(P, wsp, WorkSpaceSize, cor) END; cp^.sons := cp^.sons + 1; Push(newprocess, ready) END StartProcess; PROCEDURE StopProcess; (* Terminate a Process (itself) *) VAR aux: ProcessType; BEGIN aux := cp^.father; aux^.sons := aux^.sons - 1; IF aux^.sons = 0 THEN Push(aux, ready) END; aux := cp; Push(aux, free); Pop(ready, cp); IF cp = NIL THEN HALT ELSE TRANSFER(aux^.cor, cp^.cor) END END StopProcess; PROCEDURE InitChannel(VAR ch: Channel); (* Initialize the channel ch *) BEGIN Allocate(ch, SIZE(ChannelDescriptor)); WITH ch^ DO InitQueue(senders); owner := NIL; next := NIL; guardindex := 0 END END InitChannel; PROCEDURE GetChannel(ch: Channel); (* Assign the channel ch to the process that gets it *) BEGIN WITH ch^ DO IF owner # NIL THEN Message("Channel already has an owner"); HALT END; owner := cp END END GetChannel; PROCEDURE Send(data: ARRAY OF BYTE; VAR ch: Channel); (* Send a message with the data to the cvhannel ch *) VAR m: ByteAddress; (* aux: ProcessType; *) i: CARDINAL; BEGIN WITH ch^ DO Push(cp, senders); Allocate(cp^.msgadr, SIZE(data)); m := cp^.msgadr; cp^.msglen := HIGH(data); FOR i := 0 TO HIGH(data) DO m^ := data[i]; m := ADDRESS(m) + 1 END; IF guardindex # 0 THEN owner^.guardindex := guardindex; CloseChannels(owner); Push(owner, ready) END END; DoTransfer END Send; PROCEDURE Receive(VAR ch: Channel; VAR dest: ARRAY OF BYTE); (* Receive a message from the channel ch into the dest variable *) VAR aux: ProcessType; m: ByteAddress; i: CARDINAL; BEGIN WITH ch^ DO IF cp # owner THEN Message("Only owner of channel can receive from it"); HALT END; IF Sending(ch) THEN Pop(senders, aux); m := aux^.msgadr; FOR i := 0 TO aux^.msglen DO dest[i] := m^; m := ADDRESS(m) + 1 END; Push(aux, ready); Push(cp, ready); CloseChannels(cp) ELSE OpenChannel(ch, -1); DoTransfer; Pop(senders, aux); m := aux^.msgadr; FOR i := 0 TO aux^.msglen DO dest[i] := m^; m := ADDRESS(m) + 1 END; Push(cp, ready); Push(aux, ready) END; Deallocate(aux^.msgadr, aux^.msglen+1); DoTransfer END END Receive; PROCEDURE SELECT(n: CARDINAL); (* Beginning of a SELECT structure with n guards *) BEGIN cp^.guardindex := Uniform(1,n); cp^.guardno := n; cp^.guardcount := n END SELECT; PROCEDURE NEXTGUARD(): CARDINAL; (* Returns an index to the next guard to be evaluated in a SELECT *) BEGIN RETURN cp^.guardindex END NEXTGUARD; PROCEDURE GUARD(cond: BOOLEAN; ch: Channel; VAR dest: ARRAY OF BYTE): BOOLEAN; (* Evaluates a guard, including reception management *) (* VAR aux: ProcessType; *) BEGIN IF NOT cond THEN RETURN FALSE ELSIF ch = NIL THEN CloseChannels(cp); cp^.guardindex := 0; RETURN TRUE ELSIF Sending(ch) THEN Receive(ch, dest); cp^.guardindex := 0; RETURN TRUE ELSE OpenChannel(ch, cp^.guardindex); RETURN FALSE END END GUARD; PROCEDURE ENDSELECT(): BOOLEAN; (* End of a SELECT structure *) BEGIN WITH cp^ DO IF guardindex <= 0 THEN RETURN TRUE END; guardcount := guardcount - 1; IF guardcount # 0 THEN guardindex := (guardindex MOD INTEGER(guardno)) + 1 ELSIF ThereAreOpenChannels() THEN DoTransfer ELSE guardindex := 0 END END; RETURN FALSE END ENDSELECT; BEGIN InitQueue(free); InitQueue(ready); Allocate(cp,SIZE(ProcessDescriptor)); WITH cp^ DO sons := 0; father := NIL END END CSP. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Conversions; (* Module: numeric-to-string conversions Author: Ceriel J.H. Jacobs Version: $Header: Conversion.mod,v 1.7 88/02/19 15:40:44 ceriel Exp $ *) PROCEDURE ConvertNum(num, len, base: CARDINAL; neg: BOOLEAN; VAR str: ARRAY OF CHAR); VAR i: CARDINAL; r: CARDINAL; tmp: ARRAY [0..20] OF CHAR; BEGIN i := 0; REPEAT r := num MOD base; num := num DIV base; IF r <= 9 THEN tmp[i] := CHR(r + ORD('0')); ELSE tmp[i] := CHR(r - 10 + ORD('A')); END; INC(i); UNTIL num = 0; IF neg THEN tmp[i] := '-'; INC(i) END; IF len > HIGH(str) + 1 THEN len := HIGH(str) + 1; END; IF i > HIGH(str) + 1 THEN i := HIGH(str) + 1; END; r := 0; WHILE len > i DO str[r] := ' '; INC(r); DEC(len); END; WHILE i > 0 DO str[r] := tmp[i-1]; DEC(i); INC(r); END; WHILE r <= HIGH(str) DO str[r] := 0C; INC(r); END; END ConvertNum; PROCEDURE ConvertOctal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 8, FALSE, str); END ConvertOctal; PROCEDURE ConvertHex(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 16, FALSE, str); END ConvertHex; PROCEDURE ConvertCardinal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 10, FALSE, str); END ConvertCardinal; PROCEDURE ConvertInteger(num: INTEGER; len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN IF (num < 0) AND (num >= -MAX(INTEGER)) THEN ConvertNum(-num, len, 10, TRUE, str); ELSE ConvertNum(CARDINAL(num), len, 10, num < 0, str); END; END ConvertInteger; END Conversions. # ; ; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. ; See the copyright notice in the ACK home directory, in the file "Copyright". ; ; ; Module: Interface to some EM instructions and data ; Author: Ceriel J.H. Jacobs ; Version: $Header: EM.e,v 1.5 88/03/23 17:53:27 ceriel Exp $ ; mes 2,_EM_WSIZE,_EM_PSIZE #define ARG1 0 #define ARG2 _EM_DSIZE #define IRES 2*_EM_DSIZE ; FIF is called with three parameters: ; - address of integer part result (IRES) ; - float two (ARG2) ; - float one (ARG1) ; and returns an _EM_DSIZE-byte floating point number ; Definition: ; PROCEDURE FIF(ARG1, ARG2: LONGREAL; VAR IRES: LONGREAL) : LONGREAL; exp $FIF pro $FIF,0 lal 0 loi 2*_EM_DSIZE fif _EM_DSIZE lal IRES loi _EM_PSIZE sti _EM_DSIZE ret _EM_DSIZE end ? #define FARG 0 #define ERES _EM_DSIZE ; FEF is called with two parameters: ; - address of base 2 exponent result (ERES) ; - floating point number to be split (FARG) ; and returns an _EM_DSIZE-byte floating point number (the mantissa) ; Definition: ; PROCEDURE FEF(FARG: LONGREAL; VAR ERES: integer): LONGREAL; exp $FEF pro $FEF,0 lal FARG loi _EM_DSIZE fef _EM_DSIZE lal ERES loi _EM_PSIZE sti _EM_WSIZE ret _EM_DSIZE end ? #define TRAP 0 ; TRP is called with one parameter: ; - trap number (TRAP) ; Definition: ; PROCEDURE TRP(trapno: INTEGER); exp $TRP pro $TRP, 0 lol TRAP trp ret 0 end ? #define PROC 0 ; SIG is called with one parameter: ; - procedure instance identifier (PROC) ; and returns the old traphandler. exa handler exp $SIG pro $SIG, 0 lae handler loi _EM_PSIZE lal PROC loi _EM_PSIZE lae handler sti _EM_PSIZE ret _EM_PSIZE end ? exp $LINO pro $LINO,0 loe 0 ret _EM_WSIZE end ? exp $FILN pro $FILN,0 lae 4 loi _EM_PSIZE ret _EM_PSIZE end ? (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE InOut ; (* Module: Wirth's Input/Output module Author: Ceriel J.H. Jacobs Version: $Header: InOut.mod,v 1.18 91/03/05 13:44:25 ceriel Exp $ *) IMPORT Streams; FROM Conversions IMPORT ConvertCardinal, ConvertInteger, ConvertOctal, ConvertHex; FROM Traps IMPORT Message; CONST TAB = 11C; TYPE numbuf = ARRAY[0..255] OF CHAR; VAR unread: BOOLEAN; unreadch: CHAR; CurrIn, CurrOut: Streams.Stream; result: Streams.StreamResult; PROCEDURE Read(VAR c : CHAR); BEGIN IF unread THEN unread := FALSE; c := unreadch; Done := TRUE; ELSE Streams.Read(CurrIn, c, result); Done := result = Streams.succeeded; END; END Read; PROCEDURE UnRead(ch: CHAR); BEGIN unread := TRUE; unreadch := ch; END UnRead; PROCEDURE Write(c: CHAR); BEGIN Streams.Write(CurrOut, c, result); END Write; PROCEDURE OpenInput(defext: ARRAY OF CHAR); VAR namebuf : ARRAY [1..128] OF CHAR; BEGIN IF CurrIn # Streams.InputStream THEN Streams.CloseStream(CurrIn, result); END; MakeFileName("Name of input file: ", defext, namebuf); IF NOT Done THEN RETURN; END; openinput(namebuf); END OpenInput; PROCEDURE OpenInputFile(filename: ARRAY OF CHAR); BEGIN IF CurrIn # Streams.InputStream THEN Streams.CloseStream(CurrIn, result); END; openinput(filename); END OpenInputFile; PROCEDURE openinput(namebuf: ARRAY OF CHAR); BEGIN IF (namebuf[0] = '-') AND (namebuf[1] = 0C) THEN CurrIn := Streams.InputStream; Done := TRUE; ELSE Streams.OpenStream(CurrIn, namebuf, Streams.text, Streams.reading, result); Done := result = Streams.succeeded; END; END openinput; PROCEDURE CloseInput; BEGIN IF CurrIn # Streams.InputStream THEN Streams.CloseStream(CurrIn, result); END; CurrIn := Streams.InputStream; END CloseInput; PROCEDURE OpenOutput(defext: ARRAY OF CHAR); VAR namebuf : ARRAY [1..128] OF CHAR; BEGIN IF CurrOut # Streams.OutputStream THEN Streams.CloseStream(CurrOut, result); END; MakeFileName("Name of output file: ", defext, namebuf); IF NOT Done THEN RETURN; END; openoutput(namebuf); END OpenOutput; PROCEDURE OpenOutputFile(filename: ARRAY OF CHAR); BEGIN IF CurrOut # Streams.OutputStream THEN Streams.CloseStream(CurrOut, result); END; openoutput(filename); END OpenOutputFile; PROCEDURE openoutput(namebuf: ARRAY OF CHAR); BEGIN IF (namebuf[1] = '-') AND (namebuf[2] = 0C) THEN CurrOut := Streams.OutputStream; Done := TRUE; ELSE Streams.OpenStream(CurrOut, namebuf, Streams.text, Streams.writing, result); Done := result = Streams.succeeded; END; END openoutput; PROCEDURE CloseOutput; BEGIN IF CurrOut # Streams.OutputStream THEN Streams.CloseStream(CurrOut, result); END; CurrOut := Streams.OutputStream; END CloseOutput; PROCEDURE MakeFileName(prompt, defext : ARRAY OF CHAR; VAR buf : ARRAY OF CHAR); VAR i : INTEGER; j : CARDINAL; BEGIN Done := TRUE; IF Streams.isatty(Streams.InputStream, result) THEN XWriteString(prompt); END; XReadString(buf); i := 0; WHILE buf[i] # 0C DO i := i + 1 END; IF i # 0 THEN i := i - 1; IF buf[i] = '.' THEN FOR j := 0 TO HIGH(defext) DO i := i + 1; buf[i] := defext[j]; END; buf[i+1] := 0C; END; RETURN; END; Done := FALSE; END MakeFileName; PROCEDURE ReadInt(VAR integ : INTEGER); CONST SAFELIMITDIV10 = MAX(INTEGER) DIV 10; SAFELIMITREM10 = MAX(INTEGER) MOD 10; TYPE itype = [0..31]; ibuf = ARRAY itype OF CHAR; VAR int : INTEGER; neg : BOOLEAN; safedigit: [0 .. 9]; chvalue: CARDINAL; buf : ibuf; index : itype; BEGIN ReadString(buf); IF NOT Done THEN RETURN END; index := 0; IF buf[index] = '-' THEN neg := TRUE; INC(index); ELSIF buf[index] = '+' THEN neg := FALSE; INC(index); ELSE neg := FALSE END; safedigit := SAFELIMITREM10; IF neg THEN safedigit := safedigit + 1 END; int := 0; WHILE (buf[index] >= '0') & (buf[index] <= '9') DO chvalue := ORD(buf[index]) - ORD('0'); IF (int > SAFELIMITDIV10) OR ( (int = SAFELIMITDIV10) AND (chvalue > safedigit)) THEN Message("integer too large"); HALT; ELSE int := 10*int + VAL(INTEGER, chvalue); INC(index) END; END; IF neg THEN integ := -int ELSE integ := int END; IF buf[index] > " " THEN Message("illegal integer"); HALT; END; Done := TRUE; END ReadInt; PROCEDURE ReadCard(VAR card : CARDINAL); CONST SAFELIMITDIV10 = MAX(CARDINAL) DIV 10; SAFELIMITREM10 = MAX(CARDINAL) MOD 10; TYPE itype = [0..31]; ibuf = ARRAY itype OF CHAR; VAR int : CARDINAL; index : itype; buf : ibuf; safedigit: [0 .. 9]; chvalue: CARDINAL; BEGIN ReadString(buf); IF NOT Done THEN RETURN; END; index := 0; safedigit := SAFELIMITREM10; int := 0; WHILE (buf[index] >= '0') & (buf[index] <= '9') DO chvalue := ORD(buf[index]) - ORD('0'); IF (int > SAFELIMITDIV10) OR ( (int = SAFELIMITDIV10) AND (chvalue > safedigit)) THEN Message("cardinal too large"); HALT; ELSE int := 10*int + chvalue; INC(index); END; END; IF buf[index] > " " THEN Message("illegal cardinal"); HALT; END; card := int; Done := TRUE; END ReadCard; PROCEDURE ReadString(VAR s : ARRAY OF CHAR); TYPE charset = SET OF CHAR; VAR i : CARDINAL; ch : CHAR; BEGIN i := 0; REPEAT Read(ch); UNTIL NOT (ch IN charset{' ', TAB, 12C, 15C}); IF NOT Done THEN RETURN; END; UnRead(ch); REPEAT Read(ch); termCH := ch; IF i <= HIGH(s) THEN s[i] := ch; IF (NOT Done) OR (ch <= " ") THEN s[i] := 0C; END; END; INC(i); UNTIL (NOT Done) OR (ch <= " "); IF Done THEN UnRead(ch); END; END ReadString; PROCEDURE XReadString(VAR s : ARRAY OF CHAR); VAR j : CARDINAL; ch : CHAR; BEGIN j := 0; LOOP Streams.Read(Streams.InputStream, ch, result); IF result # Streams.succeeded THEN EXIT; END; IF ch <= " " THEN s[j] := 0C; EXIT; END; IF j < HIGH(s) THEN s[j] := ch; INC(j); END; END; END XReadString; PROCEDURE XWriteString(s: ARRAY OF CHAR); VAR i: CARDINAL; BEGIN i := 0; LOOP IF (i <= HIGH(s)) AND (s[i] # 0C) THEN Streams.Write(Streams.OutputStream, s[i], result); INC(i); ELSE EXIT; END; END; END XWriteString; PROCEDURE WriteCard(card, width : CARDINAL); VAR buf : numbuf; BEGIN ConvertCardinal(card, width, buf); WriteString(buf); END WriteCard; PROCEDURE WriteInt(int : INTEGER; width : CARDINAL); VAR buf : numbuf; BEGIN ConvertInteger(int, width, buf); WriteString(buf); END WriteInt; PROCEDURE WriteHex(card, width : CARDINAL); VAR buf : numbuf; BEGIN ConvertHex(card, width, buf); WriteString(buf); END WriteHex; PROCEDURE WriteLn; BEGIN Write(EOL) END WriteLn; PROCEDURE WriteOct(card, width : CARDINAL); VAR buf : numbuf; BEGIN ConvertOctal(card, width, buf); WriteString(buf); END WriteOct; PROCEDURE WriteString(str : ARRAY OF CHAR); VAR nbytes : CARDINAL; BEGIN nbytes := 0; WHILE (nbytes <= HIGH(str)) AND (str[nbytes] # 0C) DO Write(str[nbytes]); INC(nbytes) END; END WriteString; BEGIN (* InOut initialization *) CurrIn := Streams.InputStream; CurrOut := Streams.OutputStream; unread := FALSE; END InOut. G1# ; ; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. ; See the copyright notice in the ACK home directory, in the file "Copyright". ; ; ; Module: Compute non-constant set displays ; Author: Ceriel J.H. Jacobs ; Version: $Header: LtoUset.e,v 1.4 88/03/23 17:53:37 ceriel Exp $ ; mes 2,_EM_WSIZE,_EM_PSIZE ; LtoUset is called for set displays containing { expr1 .. expr2 }. ; It has six parameters, of which the caller must pop five: ; - The set in which bits must be set. ; - the lower bound of the set type. ; - The set size in bytes. ; - The upper bound of set elements, specified by the set-type. ; - "expr2", the upper bound ; - "expr1", the lower bound #define SETBASE 5*_EM_WSIZE #define SETLOW 4*_EM_WSIZE #define SETSIZE 3*_EM_WSIZE #define USETSIZ 2*_EM_WSIZE #define LWB _EM_WSIZE #define UPB 0 exp $LtoUset pro $LtoUset,0 lal SETBASE ; address of initial set lol SETSIZE los _EM_WSIZE ; load initial set lol LWB ; low bound lol SETLOW sbu _EM_WSIZE stl LWB lol UPB ; high bound lol SETLOW sbu _EM_WSIZE stl UPB 1 lol LWB lol UPB cmu _EM_WSIZE zgt *2 ; while low <= high lol LWB lol SETSIZE set ? ; create [low] lol SETSIZE ior ? ; merge with initial set lol LWB loc 1 adu _EM_WSIZE stl LWB bra *1 ; loop back 2 lal SETBASE lol SETSIZE sts _EM_WSIZE ; store result over initial set ret 0 end 0 # Makefile for lib/ack/libm2. M2 = m2 CFLAGS = -O -I../h -wo CC1 = $(CC) $(CFLAGS) -c M2FLAGS = -O -ws -n M21 = $(M2) $(M2FLAGS) -c LIBRARY = ../libm2.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(Arguments.o) \ $(LIBRARY)(ArraySort.o) \ $(LIBRARY)(CSP.o) \ $(LIBRARY)(Conversion.o) \ $(LIBRARY)(EM.o) \ $(LIBRARY)(InOut.o) \ $(LIBRARY)(LtoUset.o) \ $(LIBRARY)(MathLib0.o) \ $(LIBRARY)(Mathlib.o) \ $(LIBRARY)(PascalIO.o) \ $(LIBRARY)(Processes.o) \ $(LIBRARY)(RealConver.o) \ $(LIBRARY)(RealInOut.o) \ $(LIBRARY)(SYSTEM.o) \ $(LIBRARY)(Semaphores.o) \ $(LIBRARY)(Storage.o) \ $(LIBRARY)(StrAss.o) \ $(LIBRARY)(Streams.o) \ $(LIBRARY)(Strings.o) \ $(LIBRARY)(Termcap.o) \ $(LIBRARY)(Terminal.o) \ $(LIBRARY)(Traps.o) \ $(LIBRARY)(XXTermcap.o) \ $(LIBRARY)(absd.o) \ $(LIBRARY)(absf.o) \ $(LIBRARY)(absi.o) \ $(LIBRARY)(absl.o) \ $(LIBRARY)(blockmove.o) \ $(LIBRARY)(cap.o) \ $(LIBRARY)(catch.o) \ $(LIBRARY)(confarray.o) \ $(LIBRARY)(dvi.o) \ $(LIBRARY)(halt.o) \ $(LIBRARY)(head_m2.o) \ $(LIBRARY)(init.o) \ $(LIBRARY)(load.o) \ $(LIBRARY)(par_misc.o) \ $(LIBRARY)(random.o) \ $(LIBRARY)(rcka.o) \ $(LIBRARY)(rcki.o) \ $(LIBRARY)(rckil.o) \ $(LIBRARY)(rcku.o) \ $(LIBRARY)(rckul.o) \ $(LIBRARY)(sigtrp.o) \ $(LIBRARY)(stackprio.o) \ $(LIBRARY)(store.o) \ $(LIBRARY)(ucheck.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(Arguments.o): Arguments.c $(CC1) Arguments.c $(LIBRARY)(ArraySort.o): ArraySort.mod $(M21) ArraySort.mod $(LIBRARY)(CSP.o): CSP.mod $(M21) CSP.mod $(LIBRARY)(Conversion.o): Conversion.mod $(M21) Conversion.mod $(LIBRARY)(EM.o): EM.e $(CC1) EM.e $(LIBRARY)(InOut.o): InOut.mod $(M21) InOut.mod $(LIBRARY)(LtoUset.o): LtoUset.e $(CC1) LtoUset.e $(LIBRARY)(MathLib0.o): MathLib0.mod $(M21) MathLib0.mod $(LIBRARY)(Mathlib.o): Mathlib.mod $(M21) Mathlib.mod $(LIBRARY)(PascalIO.o): PascalIO.mod $(M21) PascalIO.mod $(LIBRARY)(Processes.o): Processes.mod $(M21) Processes.mod $(LIBRARY)(RealConver.o): RealConver.mod $(M21) RealConver.mod $(LIBRARY)(RealInOut.o): RealInOut.mod $(M21) RealInOut.mod $(LIBRARY)(SYSTEM.o): SYSTEM.c $(CC1) SYSTEM.c $(LIBRARY)(Semaphores.o): Semaphores.mod $(M21) Semaphores.mod $(LIBRARY)(Storage.o): Storage.mod $(M21) Storage.mod $(LIBRARY)(StrAss.o): StrAss.c $(CC1) StrAss.c $(LIBRARY)(Streams.o): Streams.mod $(M21) Streams.mod $(LIBRARY)(Strings.o): Strings.mod $(M21) Strings.mod $(LIBRARY)(Termcap.o): Termcap.mod $(M21) Termcap.mod $(LIBRARY)(Terminal.o): Terminal.mod $(M21) -D__USG Terminal.mod $(LIBRARY)(Traps.o): Traps.mod $(M21) Traps.mod $(LIBRARY)(XXTermcap.o): XXTermcap.c $(CC1) XXTermcap.c $(LIBRARY)(absd.o): absd.c $(CC1) absd.c $(LIBRARY)(absf.o): absf.e $(CC1) absf.e $(LIBRARY)(absi.o): absi.c $(CC1) absi.c $(LIBRARY)(absl.o): absl.c $(CC1) absl.c $(LIBRARY)(blockmove.o): blockmove.c $(CC1) blockmove.c $(LIBRARY)(cap.o): cap.c $(CC1) cap.c $(LIBRARY)(catch.o): catch.c $(CC1) catch.c $(LIBRARY)(confarray.o): confarray.c $(CC1) confarray.c $(LIBRARY)(dvi.o): dvi.c $(CC1) dvi.c $(LIBRARY)(halt.o): halt.c $(CC1) halt.c $(LIBRARY)(head_m2.o): head_m2.e $(CC1) head_m2.e $(LIBRARY)(init.o): init.c $(CC1) init.c $(LIBRARY)(load.o): load.c $(CC1) load.c $(LIBRARY)(par_misc.o): par_misc.e $(CC1) par_misc.e $(LIBRARY)(random.o): random.mod $(M21) random.mod $(LIBRARY)(rcka.o): rcka.c $(CC1) rcka.c $(LIBRARY)(rcki.o): rcki.c $(CC1) rcki.c $(LIBRARY)(rckil.o): rckil.c $(CC1) rckil.c $(LIBRARY)(rcku.o): rcku.c $(CC1) rcku.c $(LIBRARY)(rckul.o): rckul.c $(CC1) rckul.c $(LIBRARY)(sigtrp.o): sigtrp.c $(CC1) sigtrp.c $(LIBRARY)(stackprio.o): stackprio.c $(CC1) stackprio.c $(LIBRARY)(store.o): store.c $(CC1) store.c $(LIBRARY)(ucheck.o): ucheck.c $(CC1) ucheck.c (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE MathLib0; (* Module: Some mathematical functions Author: Ceriel J.H. Jacobs Version: $Header: MathLib0.mod,v 1.9 91/03/05 13:44:35 ceriel Exp $ *) IMPORT Mathlib; PROCEDURE cos(arg: REAL): REAL; BEGIN RETURN Mathlib.cos(arg); END cos; PROCEDURE sin(arg: REAL): REAL; BEGIN RETURN Mathlib.sin(arg); END sin; PROCEDURE arctan(arg: REAL): REAL; BEGIN RETURN Mathlib.arctan(arg); END arctan; PROCEDURE sqrt(arg: REAL): REAL; BEGIN RETURN Mathlib.sqrt(arg); END sqrt; PROCEDURE ln(arg: REAL): REAL; BEGIN RETURN Mathlib.ln(arg); END ln; PROCEDURE exp(arg: REAL): REAL; BEGIN RETURN Mathlib.exp(arg); END exp; PROCEDURE entier(x: REAL): INTEGER; VAR i: INTEGER; BEGIN IF x < 0.0 THEN i := TRUNC(-x); IF FLOAT(i) = -x THEN RETURN -i; ELSE RETURN -i -1; END; END; RETURN TRUNC(x); END entier; PROCEDURE real(x: INTEGER): REAL; BEGIN IF x < 0 THEN RETURN - FLOAT(-x); END; RETURN FLOAT(x); END real; BEGIN END MathLib0. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Mathlib; (* Module: Mathematical functions Author: Ceriel J.H. Jacobs Version: $Header: Mathlib.mod,v 1.9 91/03/05 13:44:47 ceriel Exp $ *) FROM EM IMPORT FIF, FEF; FROM Traps IMPORT Message; CONST OneRadianInDegrees = 57.295779513082320876798155D; OneDegreeInRadians = 0.017453292519943295769237D; OneOverSqrt2 = 0.70710678118654752440084436210484904D; (* basic functions *) PROCEDURE pow(x: REAL; i: INTEGER): REAL; BEGIN RETURN SHORT(longpow(LONG(x), i)); END pow; PROCEDURE longpow(x: LONGREAL; i: INTEGER): LONGREAL; VAR val: LONGREAL; ri: LONGREAL; BEGIN ri := FLOATD(i); IF x < 0.0D THEN val := longexp(longln(-x) * ri); IF ODD(i) THEN RETURN -val; ELSE RETURN val; END; ELSIF x = 0.0D THEN RETURN 0.0D; ELSE RETURN longexp(longln(x) * ri); END; END longpow; PROCEDURE sqrt(x: REAL): REAL; BEGIN RETURN SHORT(longsqrt(LONG(x))); END sqrt; PROCEDURE longsqrt(x: LONGREAL): LONGREAL; VAR temp: LONGREAL; exp, i: INTEGER; BEGIN IF x <= 0.0D THEN IF x < 0.0D THEN Message("sqrt: negative argument"); HALT END; RETURN 0.0D; END; temp := FEF(x,exp); (* * NOTE * this wont work on 1's comp *) IF ODD(exp) THEN temp := 2.0D * temp; DEC(exp); END; temp := 0.5D*(1.0D + temp); WHILE exp > 28 DO temp := temp * 16384.0D; exp := exp - 28; END; WHILE exp < -28 DO temp := temp / 16384.0D; exp := exp + 28; END; WHILE exp >= 2 DO temp := temp * 2.0D; exp := exp - 2; END; WHILE exp <= -2 DO temp := temp / 2.0D; exp := exp + 2; END; FOR i := 0 TO 5 DO temp := 0.5D*(temp + x/temp); END; RETURN temp; END longsqrt; PROCEDURE ldexp(x:LONGREAL; n: INTEGER): LONGREAL; BEGIN WHILE n >= 16 DO x := x * 65536.0D; n := n - 16; END; WHILE n > 0 DO x := x * 2.0D; DEC(n); END; WHILE n <= -16 DO x := x / 65536.0D; n := n + 16; END; WHILE n < 0 DO x := x / 2.0D; INC(n); END; RETURN x; END ldexp; PROCEDURE exp(x: REAL): REAL; BEGIN RETURN SHORT(longexp(LONG(x))); END exp; PROCEDURE longexp(x: LONGREAL): LONGREAL; (* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 *) CONST p0 = 0.25000000000000000000D+00; p1 = 0.75753180159422776666D-02; p2 = 0.31555192765684646356D-04; q0 = 0.50000000000000000000D+00; q1 = 0.56817302698551221787D-01; q2 = 0.63121894374398503557D-03; q3 = 0.75104028399870046114D-06; VAR neg: BOOLEAN; n: INTEGER; xn, g, x1, x2: LONGREAL; BEGIN neg := x < 0.0D; IF neg THEN x := -x; END; n := TRUNC(x/longln2 + 0.5D); xn := FLOATD(n); x1 := FLOATD(TRUNCD(x)); x2 := x - x1; g := ((x1 - xn * 0.693359375D)+x2) - xn * (-2.1219444005469058277D-4); IF neg THEN g := -g; n := -n; END; xn := g*g; x := g*((p2*xn+p1)*xn+p0); INC(n); RETURN ldexp(0.5D + x/((((q3*xn+q2)*xn+q1)*xn+q0) - x), n); END longexp; PROCEDURE ln(x: REAL): REAL; (* natural log *) BEGIN RETURN SHORT(longln(LONG(x))); END ln; PROCEDURE longln(x: LONGREAL): LONGREAL; (* natural log *) (* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 *) CONST p0 = -0.64124943423745581147D+02; p1 = 0.16383943563021534222D+02; p2 = -0.78956112887491257267D+00; q0 = -0.76949932108494879777D+03; q1 = 0.31203222091924532844D+03; q2 = -0.35667977739034646171D+02; q3 = 1.0D; VAR exp: INTEGER; z, znum, zden, w: LONGREAL; BEGIN IF x <= 0.0D THEN Message("ln: argument <= 0"); HALT END; x := FEF(x, exp); IF x > OneOverSqrt2 THEN znum := (x - 0.5D) - 0.5D; zden := x * 0.5D + 0.5D; ELSE znum := x - 0.5D; zden := znum * 0.5D + 0.5D; DEC(exp); END; z := znum / zden; w := z * z; x := z + z * w * (((p2*w+p1)*w+p0)/(((q3*w+q2)*w+q1)*w+q0)); z := FLOATD(exp); x := x + z * (-2.121944400546905827679D-4); RETURN x + z * 0.693359375D; END longln; PROCEDURE log(x: REAL): REAL; (* log with base 10 *) BEGIN RETURN SHORT(longlog(LONG(x))); END log; PROCEDURE longlog(x: LONGREAL): LONGREAL; (* log with base 10 *) BEGIN RETURN longln(x)/longln10; END longlog; (* trigonometric functions; arguments in radians *) PROCEDURE sin(x: REAL): REAL; BEGIN RETURN SHORT(longsin(LONG(x))); END sin; PROCEDURE sinus(x: LONGREAL; cosflag: BOOLEAN) : LONGREAL; (* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 *) CONST r0 = -0.16666666666666665052D+00; r1 = 0.83333333333331650314D-02; r2 = -0.19841269841201840457D-03; r3 = 0.27557319210152756119D-05; r4 = -0.25052106798274584544D-07; r5 = 0.16058936490371589114D-09; r6 = -0.76429178068910467734D-12; r7 = 0.27204790957888846175D-14; A1 = 3.1416015625D; A2 = -8.908910206761537356617D-6; VAR x1, x2, y : LONGREAL; neg : BOOLEAN; BEGIN IF x < 0.0D THEN neg := TRUE; x := -x ELSE neg := FALSE END; IF cosflag THEN neg := FALSE; y := longhalfpi + x ELSE y := x END; y := y / longpi + 0.5D; IF FIF(y, 1.0D, y) < 0.0D THEN ; END; IF FIF(y, 0.5D, x1) # 0.0D THEN neg := NOT neg END; IF cosflag THEN y := y - 0.5D END; x2 := FIF(x, 1.0, x1); x := x1 - y * A1; x := x + x2; x := x - y * A2; IF x < 0.0D THEN neg := NOT neg; x := -x END; y := x * x; x := x + x * y * (((((((r7*y+r6)*y+r5)*y+r4)*y+r3)*y+r2)*y+r1)*y+r0); IF neg THEN RETURN -x END; RETURN x; END sinus; PROCEDURE longsin(x: LONGREAL): LONGREAL; BEGIN RETURN sinus(x, FALSE); END longsin; PROCEDURE cos(x: REAL): REAL; BEGIN RETURN SHORT(longcos(LONG(x))); END cos; PROCEDURE longcos(x: LONGREAL): LONGREAL; BEGIN IF x < 0.0D THEN x := -x; END; RETURN sinus(x, TRUE); END longcos; PROCEDURE tan(x: REAL): REAL; BEGIN RETURN SHORT(longtan(LONG(x))); END tan; PROCEDURE longtan(x: LONGREAL): LONGREAL; (* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 *) CONST p1 = -0.13338350006421960681D+00; p2 = 0.34248878235890589960D-02; p3 = -0.17861707342254426711D-04; q0 = 1.0D; q1 = -0.46671683339755294240D+00; q2 = 0.25663832289440112864D-01; q3 = -0.31181531907010027307D-03; q4 = 0.49819433993786512270D-06; A1 = 1.57080078125D; A2 = -4.454455103380768678308D-06; VAR y, x1, x2: LONGREAL; negative: BOOLEAN; invert: BOOLEAN; BEGIN negative := x < 0.0D; y := x / longhalfpi + 0.5D; (* Use extended precision to calculate reduced argument. Here we used 12 bits of the mantissa for a1. Also split x in integer part x1 and fraction part x2. *) IF FIF(y, 1.0D, y) < 0.0D THEN ; END; invert := FIF(y, 0.5D, x1) # 0.0D; x2 := FIF(x, 1.0D, x1); x := x1 - y * A1; x := x + x2; x := x - y * A2; y := x * x; x := x + x * y * ((p3*y+p2)*y+p1); y := (((q4*y+q3)*y+q2)*y+q1)*y+q0; IF negative THEN x := -x END; IF invert THEN RETURN -y/x END; RETURN x/y; END longtan; PROCEDURE arcsin(x: REAL): REAL; BEGIN RETURN SHORT(longarcsin(LONG(x))); END arcsin; PROCEDURE arcsincos(x: LONGREAL; cosfl: BOOLEAN): LONGREAL; CONST p0 = -0.27368494524164255994D+02; p1 = 0.57208227877891731407D+02; p2 = -0.39688862997540877339D+02; p3 = 0.10152522233806463645D+02; p4 = -0.69674573447350646411D+00; q0 = -0.16421096714498560795D+03; q1 = 0.41714430248260412556D+03; q2 = -0.38186303361750149284D+03; q3 = 0.15095270841030604719D+03; q4 = -0.23823859153670238830D+02; q5 = 1.0D; VAR negative : BOOLEAN; big: BOOLEAN; g: LONGREAL; BEGIN negative := x < 0.0D; IF negative THEN x := -x; END; IF x > 0.5D THEN big := TRUE; IF x > 1.0D THEN Message("arcsin or arccos: argument > 1"); HALT END; g := 0.5D - 0.5D * x; x := -longsqrt(g); x := x + x; ELSE big := FALSE; g := x * x; END; x := x + x * g * ((((p4*g+p3)*g+p2)*g+p1)*g+p0)/(((((q5*g+q4)*g+q3X1Z1[1\1]1^1)*g+q2)*g+q1)*g+q0); IF cosfl AND NOT negative THEN x := -x END; IF cosfl = NOT big THEN x := (x + longquartpi) + longquartpi; ELSIF cosfl AND negative AND big THEN x := (x + longhalfpi) + longhalfpi; END; IF negative AND NOT cosfl THEN x := -x END; RETURN x; END arcsincos; PROCEDURE longarcsin(x: LONGREAL): LONGREAL; BEGIN RETURN arcsincos(x, FALSE); END longarcsin; PROCEDURE arccos(x: REAL): REAL; BEGIN RETURN SHORT(longarccos(LONG(x))); END arccos; PROCEDURE longarccos(x: LONGREAL): LONGREAL; BEGIN RETURN arcsincos(x, TRUE); END longarccos; PROCEDURE arctan(x: REAL): REAL; BEGIN RETURN SHORT(longarctan(LONG(x))); END arctan; VAR A: ARRAY[0..3] OF LONGREAL; arctaninit: BOOLEAN; PROCEDURE longarctan(x: LONGREAL): LONGREAL; (* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 *) CONST p0 = -0.13688768894191926929D+02; p1 = -0.20505855195861651981D+02; p2 = -0.84946240351320683534D+01; p3 = -0.83758299368150059274D+00; q0 = 0.41066306682575781263D+02; q1 = 0.86157349597130242515D+02; q2 = 0.59578436142597344465D+02; q3 = 0.15024001160028576121D+02; q4 = 1.0D; VAR g: LONGREAL; neg: BOOLEAN; n: INTEGER; BEGIN IF NOT arctaninit THEN arctaninit := TRUE; A[0] := 0.0D; A[1] := 0.52359877559829887307710723554658381D; (* p1/6 *) A[2] := longhalfpi; A[3] := 1.04719755119659774615421446109316763D; (* pi/3 *) END; neg := FALSE; IF x < 0.0D THEN neg := TRUE; x := -x; END; IF x > 1.0D THEN x := 1.0D/x; n := 2 ELSE n := 0 END; IF x > 0.26794919243112270647D (* 2-sqrt(3) *) THEN INC(n); x := (((0.73205080756887729353D*x-0.5D)-0.5D)+x)/ (1.73205080756887729353D + x); END; g := x*x; x := x + x * g * (((p3*g+p2)*g+p1)*g+p0) / ((((q4*g+q3)*g+q2)*g+q1)*g+q0); IF n > 1 THEN x := -x END; x := x + A[n]; IF neg THEN RETURN -x; END; RETURN x; END longarctan; (* hyperbolic functions *) (* The C math library has better implementations for some of these, but they depend on some properties of the floating point implementation, and, for now, we don't want that in the Modula-2 system. *) PROCEDURE sinh(x: REAL): REAL; BEGIN RETURN SHORT(longsinh(LONG(x))); END sinh; PROCEDURE longsinh(x: LONGREAL): LONGREAL; VAR expx: LONGREAL; BEGIN expx := longexp(x); RETURN (expx - 1.0D/expx)/2.0D; END longsinh; PROCEDURE cosh(x: REAL): REAL; BEGIN RETURN SHORT(longcosh(LONG(x))); END cosh; PROCEDURE longcosh(x: LONGREAL): LONGREAL; VAR expx: LONGREAL; BEGIN expx := longexp(x); RETURN (expx + 1.0D/expx)/2.0D; END longcosh; PROCEDURE tanh(x: REAL): REAL; BEGIN RETURN SHORT(longtanh(LONG(x))); END tanh; PROCEDURE longtanh(x: LONGREAL): LONGREAL; VAR expx: LONGREAL; BEGIN expx := longexp(x); RETURN (expx - 1.0D/expx) / (expx + 1.0D/expx); END longtanh; PROCEDURE arcsinh(x: REAL): REAL; BEGIN RETURN SHORT(longarcsinh(LONG(x))); END arcsinh; PROCEDURE longarcsinh(x: LONGREAL): LONGREAL; VAR neg: BOOLEAN; BEGIN neg := FALSE; IF x < 0.0D THEN neg := TRUE; x := -x; END; x := longln(x + longsqrt(x*x+1.0D)); IF neg THEN RETURN -x; END; RETURN x; END longarcsinh; PROCEDURE arccosh(x: REAL): REAL; BEGIN RETURN SHORT(longarccosh(LONG(x))); END arccosh; PROCEDURE longarccosh(x: LONGREAL): LONGREAL; BEGIN IF x < 1.0D THEN Message("arccosh: argument < 1"); HALT END; RETURN longln(x + longsqrt(x*x - 1.0D)); END longarccosh; PROCEDURE arctanh(x: REAL): REAL; BEGIN RETURN SHORT(longarctanh(LONG(x))); END arctanh; PROCEDURE longarctanh(x: LONGREAL): LONGREAL; BEGIN IF (x <= -1.0D) OR (x >= 1.0D) THEN Message("arctanh: ABS(argument) >= 1"); HALT END; RETURN longln((1.0D + x)/(1.0D - x)) / 2.0D; END longarctanh; (* conversions *) PROCEDURE RadianToDegree(x: REAL): REAL; BEGIN RETURN SHORT(longRadianToDegree(LONG(x))); END RadianToDegree; PROCEDURE longRadianToDegree(x: LONGREAL): LONGREAL; BEGIN RETURN x * OneRadianInDegrees; END longRadianToDegree; PROCEDURE DegreeToRadian(x: REAL): REAL; BEGIN RETURN SHORT(longDegreeToRadian(LONG(x))); END DegreeToRadian; PROCEDURE longDegreeToRadian(x: LONGREAL): LONGREAL; BEGIN RETURN x * OneDegreeInRadians; END longDegreeToRadian; BEGIN arctaninit := FALSE; END Mathlib. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE PascalIO; (* Module: Pascal-like Input/Output Author: Ceriel J.H. Jacobs Version: $Header: PascalIO.mod,v 1.17 91/03/05 13:44:59 ceriel Exp $ *) FROM Conversions IMPORT ConvertInteger, ConvertCardinal; FROM RealConversions IMPORT LongRealToString, StringToLongReal; FROM Traps IMPORT Message; FROM Streams IMPORT Stream, StreamKind, StreamMode, StreamResult, InputStream, OutputStream, OpenStream, CloseStream, EndOfStream, Read, Write, StreamBuffering; FROM Storage IMPORT Allocate; FROM SYSTEM IMPORT ADR; TYPE charset = SET OF CHAR; btype = (Preading, Pwriting, free); CONST spaces = charset{11C, 12C, 13C, 14C, 15C, ' '}; TYPE IOstream = RECORD type: btype; done, eof : BOOLEAN; ch: CHAR; next: Text; stream: Stream; END; Text = POINTER TO IOstream; numbuf = ARRAY[0..255] OF CHAR; VAR ibuf, obuf: IOstream; head: Text; result: StreamResult; PROCEDURE Reset(VAR InputText: Text; Filename: ARRAY OF CHAR); BEGIN doclose(InputText); getstruct(InputText); WITH InputText^ DO OpenStream(stream, Filename, text, reading, result); IF result # succeeded THEN Message("could not open input file"); HALT; END; type := Preading; done := FALSE; eof := FALSE; END; END Reset; PROCEDURE Rewrite(VAR OutputText: Text; Filename: ARRAY OF CHAR); BEGIN doclose(OutputText); getstruct(OutputText); WITH OutputText^ DO OpenStream(stream, Filename, text, writing, result); IF result # succeeded THEN Message("could not open output file"); HALT; END; type := Pwriting; END; END Rewrite; PROCEDURE CloseOutput(); VAR p: Text; BEGIN p := head; WHILE p # NIL DO doclose(p); p := p^.next; END; END CloseOutput; PROCEDURE doclose(Xtext: Text); BEGIN IF Xtext # Notext THEN WITH Xtext^ DO IF type # free THEN CloseStream(stream, result); type := free; END; END; END; END doclose; PROCEDURE getstruct(VAR Xtext: Text); BEGIN Xtext := head; WHILE (Xtext # NIL) AND (Xtext^.type # free) DO Xtext := Xtext^.next; END; IF Xtext = NIL THEN Allocate(Xtext,SIZE(IOstream)); Xtext^.next := head; head := Xtext; END; END getstruct; PROCEDURE Error(tp: btype); BEGIN IF tp = Preading THEN Message("input text expected"); ELSE Message("output text expected"); END; HALT; END Error; PROCEDURE ReadChar(InputText: Text; VAR ch : CHAR); BEGIN ch := NextChar(InputText); IF InputText^.eof THEN Message("unexpected EOF"); HALT; END; InputText^.done := FALSE; END ReadChar; PROCEDURE NextChar(InputText: Text): CHAR; BEGIN WITH InputText^ DO IF type # Preading THEN Error(Preading); END; IF NOT done THEN IF EndOfStream(stream, result) THEN eof := TRUE; ch := 0C; ELSE Read(stream, ch, result); done := TRUE; END; END; RETURN ch; END; END NextChar; PROCEDURE Get(InputText: Text); VAR dummy: CHAR; BEGIN ReadChar(InputText, dummy); END Get; PROCEDURE Eoln(InputText: Text): BOOLEAN; BEGIN RETURN NextChar(InputText) = 12C; END Eoln; PROCEDURE Eof(InputText: Text): BOOLEAN; BEGIN RETURN (NextChar(InputText) = 0C) AND InputText^.eof; END Eof; PROCEDURE ReadLn(InputText: Text); VAR ch: CHAR; BEGIN REPEAT ReadChar(InputText, ch) UNTIL ch = 12C; END ReadLn; PROCEDURE WriteChar(OutputText: Text; char: CHAR); BEGIN WITH OutputText^ DO IF type # Pwriting THEN Error(Pwriting); END; Write(stream, char, result); END; END WriteChar; PROCEDURE WriteLn(OutputText: Text); BEGIN WriteChar(OutputText, 12C); END WriteLn; PROCEDURE Page(OutputText: Text); BEGIN WriteChar(OutputText, 14C); END Page; PROCEDURE ReadInteger(InputText: Text; VAR int : INTEGER); CONST SAFELIMITDIV10 = MAX(INTEGER) DIV 10; SAFELIMITREM10 = MAX(INTEGER) MOD 10; VAR neg : BOOLEAN; safedigit: CARDINAL; ch: CHAR; chvalue: CARDINAL; BEGIN WHILE NextChar(InputText) IN spaces DO Get(InputText); END; ch := NextChar(InputText); IF ch = '-' THEN Get(InputText); ch := NextChar(InputText); neg := TRUE; ELSIF ch = '+' THEN Get(InputText); ch := NextChar(InputText); neg := FALSE; ELSE neg := FALSE END; safedigit := SAFELIMITREM10; IF neg THEN safedigit := safedigit + 1 END; int := 0; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') & (ch <= '9') DO chvalue := ORD(ch) - ORD('0'); IF (int < -SAFELIMITDIV10) OR ( (int = -SAFELIMITDIV10) AND (chvalue > safedigit)) THEN Message("integer too large"); HALT; ELSE int := 10*int - VAL(INTEGER, chvalue); Get(InputText); ch := NextChar(InputText); END; END; IF NOT neg THEN int := -int END; ELSE Message("integer expected"); HALT; END; END ReadInteger; PROCEDURE ReadCardinal(InputText: Text; VAR card : CARDINAL); CONST SAFELIMITDIV10 = MAX(CARDINAL) DIV 10; SAFELIMITREM10 = MAX(CARDINAL) MOD 10; VAR ch : CHAR; safedigit: CARDINAL; chvalue: CARDINAL; BEGIN WHILE NextChar(InputText) IN spaces DO Get(InputText); END; ch := NextChar(InputText); safedigit := SAFELIMITREM10; card := 0; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') & (ch <= '9') DO chvalue := ORD(ch) - ORD('0'); IF (card > SAFELIMITDIV10) OR ( (card = SAFELIMITDIV10) AND (chvalue > safedigit)) THEN Message("cardinal too large"); HALT; ELSE card := 10*card + chvalue; Get(InputText); ch := NextChar(InputText); END; END; ELSE Message("cardinal expected"); HALT; END; END ReadCardinal; PROCEDURE ReadReal(InputText: Text; VAR real: REAL); VAR x1: LONGREAL; BEGIN ReadLongReal(InputText, x1); real := x1 END ReadReal; PROCEDURE ReadLongReal(InputText: Text; VAR real: LONGREAL); VAR buf: numbuf; ch: CHAR; ok: BOOLEAN; index: INTEGER; PROCEDURE inch(): CHAR; BEGIN buf[index] := ch; INC(index); Get(InputText); RETURN NextChar(InputText); END inch; BEGIN index := 0; ok := TRUE; WHILE NextChar(InputText) IN spaces DO Get(InputText); END; ch := NextChar(InputText); IF (ch ='+') OR (ch = '-') THEN ch := inch(); END; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO ch := inch(); END; IF (ch = '.') THEN ch := inch(); IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO ch := inch(); END; ELSE ok := FALSE; END; END; IF ok AND (ch = 'E') THEN ch := inch(); IF (ch ='+') OR (ch = '-') THEN ch := inch(); END; IF (ch >= '0') AND (ch <= '9') THEN WHILE (ch >= '0') AND (ch <= '9') DO ch := inch(); END; ELSE ok := FALSE; END; END; ELSE ok := FALSE; END; IF ok THEN buf[index] := 0C; StringToLongReal(buf, real, ok); END; IF NOT ok THEN Message("Illegal real"); HALT; END; END ReadLongReal; PROCEDURE WriteCardinal(OutputText: Text; card: CARDINAL; width: CARDINAL); VAR buf : numbuf; BEGIN ConvertCardinal(card, 1, buf); WriteString(OutputText, buf, width); END WriteCardinal; PROCEDURE WriteInteger(OutputText: Text; int: INTEGER; width: CARDINAL); VAR buf : numbuf; BEGIN ConvertInteger(int, 1, buf); WriteString(OutputText, buf, width); END WriteInteger; PROCEDURE WriteBoolean(OutputText: Text; bool: BOOLEAN; width: CARDINAL); BEGIN IF bool THEN WriteString(OutputText, " TRUE", width); ELSE WriteString(OutputText, "FALSE", width); END; END WriteBoolean; PROCEDURE WriteReal(OutputText: Text; real: REAL; width, nfrac: CARDINAL); BEGIN WriteLongReal(OutputText, LONG(real), width, nfrac) END WriteReal; PROCEDURE WriteLongReal(OutputText: Text; real: LONGREAL; width, nfrac: CARDINAL); VAR buf: numbuf; ok: BOOLEAN; digits: INTEGER; BEGIN IF width > SIZE(buf) THEN width := SIZE(buf); END; IF nfrac > 0 THEN LongRealToString(real, widf1h1i1th, nfrac, buf, ok); ELSE IF width < 9 THEN width := 9; END; IF real < 0.0D THEN digits := 7 - INTEGER(width); ELSE digits := 6 - INTEGER(width); END; LongRealToString(real, width, digits, buf, ok); END; WriteString(OutputText, buf, 0); END WriteLongReal; PROCEDURE WriteString(OutputText: Text; str: ARRAY OF CHAR; width: CARDINAL); VAR index: CARDINAL; BEGIN index := 0; WHILE (index <= HIGH(str)) AND (str[index] # Eos) DO INC(index); END; WHILE index < width DO WriteChar(OutputText, " "); INC(index); END; index := 0; WHILE (index <= HIGH(str)) AND (str[index] # Eos) DO WriteChar(OutputText, str[index]); INC(index); END; END WriteString; BEGIN (* PascalIO initialization *) WITH ibuf DO stream := InputStream; eof := FALSE; type := Preading; done := FALSE; END; WITH obuf DO stream := OutputStream; eof := FALSE; type := Pwriting; END; Notext := NIL; Input := ADR(ibuf); Output := ADR(obuf); Input^.next := Output; Output^.next := NIL; head := Input; END PascalIO. (*$R-*) IMPLEMENTATION MODULE Processes [1]; (* Module: Processes From: "Programming in Modula-2", 3rd, corrected edition, by N. Wirth Version: $Header: Processes.mod,v 1.6 91/03/05 13:45:09 ceriel Exp $ *) FROM SYSTEM IMPORT ADDRESS, TSIZE, NEWPROCESS, TRANSFER; FROM Storage IMPORT Allocate; FROM Traps IMPORT Message; TYPE SIGNAL = POINTER TO ProcessDescriptor; ProcessDescriptor = RECORD next: SIGNAL; (* ring *) queue: SIGNAL; (* queue of waiting processes *) cor: ADDRESS; ready: BOOLEAN; END; VAR cp: SIGNAL; (* current process *) PROCEDURE StartProcess(P: PROC; n: CARDINAL); VAR s0: SIGNAL; wsp: ADDRESS; BEGIN s0 := cp; Allocate(wsp, n); Allocate(cp, TSIZE(ProcessDescriptor)); WITH cp^ DO next := s0^.next; s0^.next := cp; ready := TRUE; queue := NIL END; NEWPROCESS(P, wsp, n, cp^.cor); TRANSFER(s0^.cor, cp^.cor); END StartProcess; PROCEDURE SEND(VAR s: SIGNAL); VAR s0: SIGNAL; BEGIN IF s # NIL THEN s0 := cp; cp := s; WITH cp^ DO s := queue; ready := TRUE; queue := NIL END; TRANSFER(s0^.cor, cp^.cor); END END SEND; PROCEDURE WAIT(VAR s: SIGNAL); VAR s0, s1: SIGNAL; BEGIN (* insert cp in queue s *) IF s = NIL THEN s := cp ELSE s0 := s; s1 := s0^.queue; WHILE s1 # NIL DO s0 := s1; s1 := s0^.queue END; s0^.queue := cp END; s0 := cp; REPEAT cp := cp^.next UNTIL cp^.ready; IF cp = s0 THEN (* deadlock *) Message("deadlock"); HALT END; s0^.ready := FALSE; TRANSFER(s0^.cor, cp^.cor) END WAIT; PROCEDURE Awaited(s: SIGNAL): BOOLEAN; BEGIN RETURN s # NIL END Awaited; PROCEDURE Init(VAR s: SIGNAL); BEGIN s := NIL END Init; BEGIN Allocate(cp, TSIZE(ProcessDescriptor)); WITH cp^ DO next := cp; ready := TRUE; queue := NIL END END Processes. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE RealConversions; (* Module: string-to-real and real-to-string conversions Author: Ceriel J.H. Jacobs Version: $Header: RealConver.mod,v 1.15 93/02/24 15:12:49 ceriel Exp $ *) PROCEDURE RealToString(arg: REAL; width, digits: INTEGER; VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN); BEGIN LongRealToString(LONG(arg), width, digits, str, ok); END RealToString; TYPE Powers = RECORD pval: LONGREAL; rpval: LONGREAL; exp: INTEGER END; VAR Powers10: ARRAY[1..6] OF Powers; PROCEDURE LongRealToString(arg: LONGREAL; width, digits: INTEGER; VAR str: ARRAY OF CHAR; VAR ok: BOOLEAN); VAR pointpos: INTEGER; i: CARDINAL; ecvtflag: BOOLEAN; r: LONGREAL; ind1, ind2 : CARDINAL; sign: BOOLEAN; ndigits: CARDINAL; BEGIN r := arg; IF digits < 0 THEN ecvtflag := TRUE; ndigits := -digits; ELSE ecvtflag := FALSE; ndigits := digits; END; IF (HIGH(str) < ndigits + 3) THEN str[0] := 0C; ok := FALSE; RETURN END; pointpos := 0; sign := r < 0.0D; IF sign THEN r := -r END; ok := TRUE; IF NOT (r / 10.0D < r) THEN (* assume Nan or Infinity *) r := 0.0D; ok := FALSE; END; IF r # 0.0D THEN IF r >= 10.0D THEN FOR i := 1 TO 6 DO WITH Powers10[i] DO WHILE r >= pval DO r := r * rpval; INC(pointpos, exp) END; END; END; END; IF r < 1.0D THEN FOR i := 1 TO 6 DO WITH Powers10[i] DO WHILE r*pval < 10.0D DO r := r * pval; DEC(pointpos, exp) END; END; END; END; (* Now, we have r in [1.0, 10.0) *) INC(pointpos); END; ind1 := 0; ind2 := ndigits+1; IF NOT ecvtflag THEN IF INTEGER(ind2) + pointpos <= 0 THEN ind2 := 1; ELSE ind2 := INTEGER(ind2) + pointpos END; END; IF ind2 > HIGH(str) THEN ok := FALSE; str[0] := 0C; RETURN; END; WHILE ind1 < ind2 DO str[ind1] := CHR(TRUNC(r)+ORD('0')); r := 10.0D * (r - FLOATD(TRUNC(r))); INC(ind1); END; IF ind2 > 0 THEN DEC(ind2); ind1 := ind2; str[ind2] := CHR(ORD(str[ind2])+5); WHILE str[ind2] > '9' DO str[ind2] := '0'; IF ind2 > 0 THEN DEC(ind2); str[ind2] := CHR(ORD(str[ind2])+1); ELSE str[ind2] := '1'; INC(pointpos); IF NOT ecvtflag THEN IF ind1 > 0 THEN str[ind1] := '0'; END; INC(ind1); END; END; END; IF (NOT ecvtflag) AND (ind1 = 0) THEN str[0] := CHR(ORD(str[0])-5); INC(ind1); END; END; IF ecvtflag THEN FOR i := ind1 TO 2 BY -1 DO str[i] := str[i-1]; END; str[1] := '.'; INC(ind1); IF sign THEN FOR i := ind1 TO 1 BY -1 DO str[i] := str[i-1]; END; INC(ind1); str[0] := '-'; END; IF (ind1 + 4) > HIGH(str) THEN str[0] := 0C; ok := FALSE; RETURN; END; str[ind1] := 'E'; INC(ind1); IF arg # 0.0D THEN DEC(pointpos); END; IF pointpos < 0 THEN pointpos := -pointpos; str[ind1] := '-'; ELSE str[ind1] := '+'; END; INC(ind1); str[ind1] := CHR(ORD('0') + CARDINAL(pointpos DIV 100)); pointpos := pointpos MOD 100; INC(ind1); str[ind1] := CHR(ORD('0') + CARDINAL(pointpos DIV 10)); INC(ind1); str[ind1] := CHR(ORD('0') + CARDINAL(pointpos MOD 10)); ELSE IF pointpos <= 0 THEN FOR i := ind1 TO 1 BY -1 DO str[i+CARDINAL(-pointpos)] := str[i-1]; END; FOR i := 0 TO CARDINAL(-pointpos) DO str[i] := '0'; END; ind1 := ind1 + CARDINAL(1 - pointpos); pointpos := 1; END; FOR i := ind1 TO CARDINAL(pointpos+1) BY -1 DO str[i] := str[i-1]; END; IF ndigits = 0 THEN str[pointpos] := 0C; ind1 := pointpos - 1; ELSE str[pointpos] := '.'; IF INTEGER(ind1) > pointpos+INTEGER(ndigits) THEN ind1 := pointpos+INTEGER(ndigits); END; str[pointpos+INTEGER(ndigits)+1] := 0C; END; IF sign THEN FOR i := ind1 TO 0 BY -1 DO str[i+1] := str[i]; END; str[0] := '-'; INC(ind1); END; END; IF (ind1+1) <= HIGH(str) THEN str[ind1+1] := 0C; END; IF ind1 >= CARDINAL(width) THEN ok := FALSE; RETURN; END; IF width > 0 THEN DEC(width); END; IF (width > 0) AND (ind1 < CARDINAL(width)) THEN FOR i := ind1 TO 0 BY -1 DO str[i + CARDINAL(width) - ind1] := str[i]; END; FOR i := 0 TO CARDINAL(width)-(ind1+1) DO str[i] := ' '; END; ind1 := CARDINAL(width); IF (ind1+1) <= HIGH(str) THEN FOR ind1 := ind1+1 TO HIGH(str) DO str[ind1] := 0C; END; END; END; END LongRealToString; PROCEDURE StringToReal(str: ARRAY OF CHAR; VAR r: REAL; VAR ok: BOOLEAN); VAR x: LONGREAL; BEGIN StringToLongReal(str, x, ok); IF ok THEN r := x; END; END StringToReal; PROCEDURE StringToLongReal(str: ARRAY OF CHAR; VAR r: LONGREAL; VAR ok: BOOLEAN); CONST BIG = 1.0D17; TYPE SETOFCHAR = SET OF CHAR; VAR pow10 : INTEGER; i : INTEGER; e : LONGREAL; ch : CHAR; signed: BOOLEAN; signedexp: BOOLEAN; iB: CARDINAL; BEGIN r := 0.0D; pow10 := 0; iB := 0; ok := TRUE; signed := FALSE; WHILE (str[iB] = ' ') OR (str[iB] = CHR(9)) DO INC(iB); IF iB > HIGH(str) THEN ok := FALSE; RETURN; END; END; IF str[iB] = '-' THEN signed := TRUE; INC(iB) ELSIF str[iB] = '+' THEN INC(iB) END; ch := str[iB]; INC(iB); IF NOT (ch IN SETOFCHAR{'0'..'9'}) THEN ok := FALSE; RETURN END; REPEAT IF r>BIG THEN INC(pow10) ELSE r:= 10.0D*r+FLOATD(ORD(ch)-ORD('0')) END; IF iB <= HIGH(str) THEN ch := str[iB]; INC(iB); END; UNTIL (iB > HIGH(str)) OR NOT (ch IN SETOFCHAR{'0'..'9'}); IF (ch = '.') AND (iB <= HIGH(str)) THEN ch := str[iB]; INC(iB); IF NOT (ch IN SETOFCHAR{'0'..'9'}) THEN ok := FALSE; RETURN END; REPEAT IF r < BIG THEN r := 10.0D * r + FLOATD(ORD(ch)-ORD('0')); DEC(pow10); END; IF iB <= HIGH(str) THEN ch := str[iB]; INC(iB); END; UNTIL (iB > HIGH(str)) OR NOT (ch IN SETOFCHAR{'0'..'9'}); END; IF (ch = 'E') THEN IF iB > HIGH(str) THEN ok := FALSE; RETURN; ELSE ch := str[iB]; INC(iB); END; i := 0; signedexp := FALSE; IF (ch = '-') OR (ch = '+') THEN signedexp := ch = '-'; IF iB > HIGH(str) THEN ok := FALSE; RETURN; ELSE ch := str[iB]; INC(iB); END; END; IF NOT (ch IN SETOFCHAR{'0'..'9'}) THEN ok := FALSE; RETURN END; REPEAT i := i*10 + INTEGER(ORD(ch) - ORD('0')); IF iB <= HIGH(str) THEN ch := str[iB]; INC(iB); END; UNTIL (iB > HIGH(str)) OR NOT (ch IN SETOFCHAR{'0'..'9'}); IF signedexp THEN i := -i END; pow10 := pow10 + i; END; IF pow10 < 0 THEN i := -pow10; ELSE i := pow10; END; e := 1.0D; DEC(i); WHILE i >= 10 DO e := e * 10000000000.0D; DEC(i,10); END; WHILE i >= 0 DO e := e * 10.0D; DEC(i) END; IF pow10<0 THEN r := r / e; ELSE r := r * e; END; IF signed THEN r := -r; END; IF (iB <= HIGH(str)) AND (ORD(ch) > ORD(' ')) THEN ok := FALSE; END END StringToLongReal; BEGIN WITH Powers10[1] DO pval := 1.0D32; rpval := 1.0D-32; exp := 32 END; WITH Powers10[2] DO pval := 1.0D16; rpval := 1.0D-16; exp := 16 END; WITH Powers10[3] DO pval := 1.0D8; rpval := 1.0D-8; exp := 8 END; WITH Powers10[4] DO pval := 1.0D4; rpval := 1.0D-4; exp := 4 END; WITH Powers10[5] DO pval := 1.0D2; rpval := 1.0D-2; exp := 2 END; WITH Powers10[6] DO pval := 1.0D1; rpval := 1.0D-1; exp := 1 END; END RealConversions. s1(* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE RealInOut; (* Module: InOut for REAL numbers Author: Ceriel J.H. Jacobs Version: $Header: RealInOut.mod,v 1.10 91/03/05 13:45:17 ceriel Exp $ *) FROM InOut IMPORT ReadString, WriteString, WriteOct; FROM Traps IMPORT Message; FROM SYSTEM IMPORT WORD; FROM RealConversions IMPORT LongRealToString, StringToLongReal; CONST MAXNDIG = 32; MAXWIDTH = MAXNDIG+7; TYPE RBUF = ARRAY [0..MAXWIDTH+1] OF CHAR; PROCEDURE WriteReal(arg: REAL; ndigits: CARDINAL); BEGIN WriteLongReal(LONG(arg), ndigits) END WriteReal; PROCEDURE WriteLongReal(arg: LONGREAL; ndigits: CARDINAL); VAR buf : RBUF; ok : BOOLEAN; BEGIN IF ndigits > MAXWIDTH THEN ndigits := MAXWIDTH; END; IF ndigits < 10 THEN ndigits := 10; END; LongRealToString(arg, ndigits, -INTEGER(ndigits - 7), buf, ok); WriteString(buf); END WriteLongReal; PROCEDURE WriteFixPt(arg: REAL; n, k: CARDINAL); BEGIN WriteLongFixPt(LONG(arg), n, k) END WriteFixPt; PROCEDURE WriteLongFixPt(arg: LONGREAL; n, k: CARDINAL); VAR buf: RBUF; ok : BOOLEAN; BEGIN IF n > MAXWIDTH THEN n := MAXWIDTH END; LongRealToString(arg, n, k, buf, ok); WriteString(buf); END WriteLongFixPt; PROCEDURE ReadReal(VAR x: REAL); VAR x1: LONGREAL; BEGIN ReadLongReal(x1); x := x1 END ReadReal; PROCEDURE ReadLongReal(VAR x: LONGREAL); VAR Buf: ARRAY[0..512] OF CHAR; ok: BOOLEAN; BEGIN ReadString(Buf); StringToLongReal(Buf, x, ok); IF NOT ok THEN Message("real expected"); HALT; END; Done := TRUE; END ReadLongReal; PROCEDURE wroct(x: ARRAY OF WORD); VAR i: CARDINAL; BEGIN FOR i := 0 TO HIGH(x) DO WriteOct(CARDINAL(x[i]), 0); WriteString(" "); END; END wroct; PROCEDURE WriteRealOct(x: REAL); BEGIN wroct(x); END WriteRealOct; PROCEDURE WriteLongRealOct(x: LONGREAL); BEGIN wroct(x); END WriteLongRealOct; BEGIN Done := FALSE; END RealInOut. /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: SYSTEM Author: Ceriel J.H. Jacobs Version: $Header: SYSTEM.c,v 1.3 91/03/15 09:23:45 ceriel Exp $ */ /* An implementation of the Modula-2 NEWPROCESS and TRANSFER facilities using the topsize, topsave, and topload facilities. For each coroutine, a proc structure is built. For the main routine, a static space is declared to save its stack. For the other coroutines, the user specifies this space. */ #include #define MAXMAIN 2048 struct proc { unsigned size; /* size of saved stackframe(s) */ int (*proc)(); /* address of coroutine procedure */ char *brk; /* stack break of this coroutine */ }; extern unsigned topsize(); static struct proc mainproc[MAXMAIN/sizeof(struct proc) + 1]; static struct proc *curproc = 0;/* current coroutine */ extern char *MainLB; /* stack break of main routine */ _SYSTEM__NEWPROCESS(p, a, n, p1) int (*p)(); /* coroutine procedure */ struct proc *a; /* pointer to area for saved stack-frame */ unsigned n; /* size of this area */ struct proc **p1; /* where to leave coroutine descriptor, in this implementation the address of the area for saved stack-frame(s) */ { /* This procedure creates a new coroutine, but does not transfer control to it. The routine "topsize" will compute the stack break, which will be the local base of this routine. Notice that we can do this because we do not need the stack above this point for this coroutine. In Modula-2, coroutines must be level 0 procedures without parameters. */ char *brk = 0; unsigned sz = topsize(&brk); if (sz + sizeof(struct proc) > n) { /* not enough space */ TRP(M2_TOOLARGE); } a->size = n; a->proc = p; a->brk = brk; *p1 = a; if (topsave(brk, a+1)) /* stack frame saved; now just return */ ; else { /* We get here through the first transfer to the coroutine created above. This also means that curproc is now set to this coroutine. We cannot trust the parameters anymore. Just call the coroutine procedure. */ (*(curproc->proc))(); _cleanup(); _exit(0); } } _SYSTEM__TRANSFER(a, b) struct proc **a, **b; { /* transfer from one coroutine to another, saving the current descriptor in the space indicated by "a", and transfering to the coroutine in descriptor "b". */ unsigned size; if (! curproc) { /* the current coroutine is the main process; initialize a coroutine descriptor for it ... */ mainproc[0].brk = MainLB; mainproc[0].size = sizeof(mainproc); curproc = &mainproc[0]; } *a = curproc; /* save current descriptor in "a" */ if (*b == curproc) { /* transfer to itself is a no-op */ return; } size = topsize(&(curproc->brk)); if (size + sizeof(struct proc) > curproc->size) { TRP(M2_TOOLARGE); } if (topsave(curproc->brk, curproc+1)) { /* stack top saved. Now restore context of target coroutine */ curproc = *b; topload(curproc+1); /* we never get here ... */ } /* but we do get here, when a transfer is done to the coroutine in "a". */ } (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Semaphores [1]; (* Module: Processes with semaphores Author: Ceriel J.H. Jacobs Version: $Header: Semaphores.mod,v 1.6 91/03/05 13:45:27 ceriel Exp $ Quasi-concurrency implementation *) FROM SYSTEM IMPORT ADDRESS, NEWPROCESS, TRANSFER; FROM Storage IMPORT Allocate; FROM random IMPORT Uniform; FROM Traps IMPORT Message; TYPE Sema = POINTER TO Semaphore; Processes = POINTER TO Process; Semaphore = RECORD level: CARDINAL; END; Process = RECORD next: Processes; proc: ADDRESS; waiting: Sema; END; VAR cp: Processes; (* current process *) PROCEDURE StartProcess(P: PROC; n: CARDINAL); VAR s0: Processes; wsp: ADDRESS; BEGIN s0 := cp; Allocate(wsp, n); Allocate(cp, SIZE(Process)); WITH cp^ DO next := s0^.next; s0^.next := cp; waiting := NIL; END; NEWPROCESS(P, wsp, n, cp^.proc); TRANSFER(s0^.proc, cp^.proc); END StartProcess; PROCEDURE Up(VAR s: Sema); BEGIN s^.level := s^.level + 1; ReSchedule; END Up; PROCEDURE Down(VAR s: Sema); BEGIN IF s^.level = 0 THEN cp^.waiting := s; ELSE s^.level := s^.level - 1; END; ReSchedule; END Down; PROCEDURE NewSema(n: CARDINAL): Sema; VAR s: Sema; BEGIN Allocate(s, SIZE(Semaphore)); s^.level := n; RETURN s; END NewSema; PROCEDURE Level(s: Sema): CARDINAL; BEGIN RETURN s^.level; END Level; PROCEDURE ReSchedule; VAR s0: Processes; i, j: CARDINAL; BEGIN s0 := cp; i := Uniform(1, 5); j := i; LOOP cp := cp^.next; IF Runnable(cp) THEN DEC(i); IF i = 0 THEN EXIT END; END; IF (cp = s0) AND (j = i) THEN (* deadlock *) Message("deadlock"); HALT END; END; IF cp # s0 THEN TRANSFER(s0^.proc, cp^.proc); END; END ReSchedule; PROCEDURE Runnable(p: Processes): BOOLEAN; BEGIN IF p^.waiting = NIL THEN RETURN TRUE; END; IF p^.waiting^.level > 0 THEN p^.waiting^.level := p^.waiting^.level - 1; p^.waiting := NIL; RETURN TRUE; END; RETURN FALSE; END Runnable; BEGIN Allocate(cp, SIZE(Process)); WITH cp^ DO next := cp; waiting := NIL; END END Semaphores. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Storage; (* Module: Dynamic Storage Allocation Author: Ceriel J.H. Jacobs Adapted from a version in C by Hans Tebra Version: $Header: Storage.mod,v 1.16 91/03/05 13:45:37 ceriel Exp $ *) (* This storage manager maintains an array of lists of objects with the same size. Commonly used sizes have their own bucket. The larger ones are put in a single list. *) FROM Unix IMPORT sbrk, ILLBREAK; FROM SYSTEM IMPORT ADDRESS, ADR; FROM Traps IMPORT Message; CONST NLISTS = 20; MAGICW = 0A5A5H; MAGICC = 175C; TYPE ALIGNTYPE = RECORD CASE : INTEGER OF 1: l: LONGINT | 2: p: ADDRESS | 3: d: LONGREAL END END; (* A type with high alignment requirements *) BucketPtr = POINTER TO Bucket; Bucket = RECORD CASE : BOOLEAN OF FALSE: BNEXT: BucketPtr; (* next free Bucket *) BSIZE: CARDINAL; | (* size of user part in UNITs *) TRUE: BXX: ALIGNTYPE END; BSTORE: ALIGNTYPE; END; CONST UNIT = SIZE(ALIGNTYPE); VAR FreeLists: ARRAY[0..NLISTS] OF BucketPtr; (* small blocks *) Llist: BucketPtr; (* others *) Compacted: BOOLEAN; (* avoid recursive reorganization *) FirstBlock: BucketPtr; USED: ADDRESS; PROCEDURE MyAllocate(size: CARDINAL) : ADDRESS; VAR nu : CARDINAL; b : CARDINAL; p, q: BucketPtr; pc: POINTER TO CHAR; brk : ADDRESS; BEGIN IF size > CARDINAL(MAX(INTEGER)-2*UNIT + 1) THEN RETURN NIL; END; nu := (size + (UNIT-1)) DIV UNIT; IF nu = 0 THEN nu := 1; END; IF nu <= NLISTS THEN b := nu; IF FreeLists[b] # NIL THEN (* Exact fit *) p := FreeLists[b]; FreeLists[b] := p^.BNEXT; p^.BNEXT := USED; IF p^.BSIZE * UNIT # size THEN pc := ADR(p^.BSTORE) + size; pc^ := MAGICC; END; p^.BSIZE := size; RETURN ADR(p^.BSTORE); END; (* Search for a block with >= 2 units more than requested. We pay for an additional header when the block is split. *) FOR b := b+2 TO NLISTS DO IF FreeLists[b] # NIL THEN q := FreeLists[b]; FreeLists[b] := q^.BNEXT; p := ADDRESS(q) + (nu+1)*UNIT; (* p indicates the block that must be given back *) p^.BSIZE := q^.BSIZE - nu - 1; p^.BNEXT := FreeLists[p^.BSIZE]; FreeLists[p^.BSIZE] := p; q^.BSIZE := nu; q^.BNEXT := USED; IF q^.BSIZE * UNIT # size THEN pc := ADR(q^.BSTORE) + size; pc^ := MAGICC; END; q^.BSIZE := size; RETURN ADR(q^.BSTORE); END; END; END; p := Llist; IF p # NIL THEN q := NIL; WHILE (p # NIL) AND (p^.BSIZE < nu) DO q := p; p := p^.BNEXT; END; IF p # NIL THEN (* p^.BSIZE >= nu *) IF p^.BSIZE <= nu + NLISTS + 1 THEN (* Remove p from this list *) IF q # NIL THEN q^.BNEXT := p^.BNEXT ELSE Llist := p^.BNEXT; END; p^.BNEXT := USED; IF p^.BSIZE > nu + 1 THEN (* split block, tail goes to FreeLists area *) q := ADDRESS(p) + (nu+1)*UNIT; q^.BSIZE := p^.BSIZE -nu -1; q^.BNEXT := FreeLists[q^.BSIZE]; FreeLists[q^.BSIZE] := q; p^.BSIZE := nu; END; IF p^.BSIZE * UNIT # size THEN pc := ADR(p^.BSTORE) + size; pc^ := MAGICC; END; p^.BSIZE := size; RETURN ADR(p^.BSTORE); END; (* Give part of tail of original block. Block stays in this list. *) q := ADDRESS(p) + (p^.BSIZE-nu)*UNIT; q^.BSIZE := nu; p^.BSIZE := p^.BSIZE - nu - 1; q^.BNEXT := USED; IF q^.BSIZE * UNIT # size THEN pc := ADR(q^.BSTORE) + size; pc^ := MAGICC; END; q^.BSIZE := size; RETURN ADR(q^.BSTORE); END; END; IF Compacted THEN (* reorganization did not yield sufficient memory *) RETURN NIL; END; brk := sbrk(UNIT * (nu + 1)); IF brk = ILLBREAK THEN ReOrganize(); Compacted := TRUE; brk := MyAllocate(size); Compacted := FALSE; RETURN brk; END; p := brk; p^.BSIZE := nu; p^.BNEXT := USED; IF p^.BSIZE * UNIT # size THEN pc := ADR(p^.BSTORE) + size; pc^ := MAGICC; END; p^.BSIZE := size; RETURN ADR(p^.BSTORE); END MyAllocate; PROCEDURE ALLOCATE(VAR a: ADDRESS; size: CARDINAL); BEGIN Allocate(a, size); END ALLOCATE; PROCEDURE Allocate(VAR a: ADDRESS; size: CARDINAL); BEGIN a := MyAllocate(size); IF a = NIL THEN Message("out of core"); HALT; END; END Allocate; PROCEDURE Available(size: CARDINAL): BOOLEAN; VAR a: ADDRESS; BEGIN a:= MyAllocate(size); IF a # NIL THEN Deallocate(a, size); RETURN TRUE; END; RETURN FALSE; END Available; PROCEDURE DEALLOCATE(VAR a: ADDRESS; size: CARDINAL); BEGIN Deallocate(a, size); END DEALLOCATE; PROCEDURE Deallocate(VAR a: ADDRESS; size: CARDINAL); VAR p: BucketPtr; pc: POINTER TO CHAR; BEGIN IF (a = NIL) THEN Message("(Warning) Deallocate: NIL pointer deallocated"); RETURN; END; p := a - UNIT; IF (p^.BNEXT # BucketPtr(USED)) THEN Message("(Warning) Deallocate: area already deallocated or heap corrupted"); a := NIL; RETURN; END; WITH p^ DO IF BSIZE # size THEN Message("(Warning) Deallocate: wrong size or heap corrupted"); END; BSIZE := (size + (UNIT - 1)) DIV UNIT; IF (BSIZE*UNIT # size) THEN pc := a + size; IF pc^ # MAGICC THEN Message("(Warning) Deallocate: heap corrupted"); END; END; IF BSIZE <= NLISTS THEN BNEXT := FreeLists[BSIZE]; FreeLists[BSIZE] := p; ELSE BNEXT := Llist; Llist := p; END; END; a := NIL END Deallocate; PROCEDURE ReOrganize(); VAR lastblock: BucketPtr; b, be: BucketPtr; i: CARDINAL; BEGIN lastblock := NIL; FOR i := 1 TO NLISTS DO b := FreeLists[i]; WHILE b # NIL DO IF ADDRESS(b) > ADDRESS(lastblock) THEN lastblock := b; END; be := b^.BNEXT; b^.BNEXT := NIL; (* temporary free mark *) b := be; END; END; b := Llist; WHILE b # NIL DO IF ADDRESS(b) > ADDRESS(lastblock) THEN lastblock := b; END; be := b^.BNEXT; b^.BNEXT := NIL; b := be; END; (* Now, all free blocks have b^.BNEXT = NIL *) b := FirstBlock; WHILE ADDRESS(b) < ADDRESS(lastblock) DO LOOP be := ADDRESS(b)+(b^.BSIZE+1)*UNIT; IF b^.BNEXT # NIL THEN (* this block is not free *) EXIT; END; IF ADDRESS(be) > ADDRESS(lastblock) THEN (* no next block *) EXIT; END; IF be^.BNEXT # NIL THEN (* next block is not free *) EXIT; END; (* this block and the next one are free, so merge them, but only if it is not too big *) IF MAX(CARDINAL) - b^.BSIZE > be^.BSIZE THEN b^.BSIZE := b^.BSIZE + be^.BSIZE + 1; ELSE EXIT; END; END; b := be; END; (* clear all free lists *) FOR i := 1 TO NLISTS DO FreeLists[i] := NIL; END; Llist := NIL; (* collect free blocks in them again *) b := FirstBlock; WHILE ADDRESS(b) <= ADDRESS(lastblock) DO WITH b^ DO IF BNEXT = NIL THEN IF BSIZE <= NLISTS THEN BNEXT := FreeLists[BSIZE]; FreeLists[BSIZE] := b; ELSE BNEXT := Llist; Llist := b; END; b := ADDRESS(b) + (BSIZE+1) * UNIT; ELSE b := ADDRESS(b) + ((BSIZE + (UNIT - 1)) DIV UNIT + 1) * UNIT; END; END; END; END ReOrganize; PROCEDURE InitStorage(); VAR i: CARDINAL; brk: ADDRESS; BEGIN FOR i := 1 TO NLISTS DO FreeLists[i] := NIL; END; Llist := NIL; brk := sbrk(0); brk := sbrk(UNIT - brk MOD UNIT); FirstBlock := sbrk(0); Compacted := FALSE; USED := MAGICW; END InitStorage; BEGIN InitStorage(); END Storage. 1/* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: assign string to character array, with possible 0-byte extension Author: Ceriel J.H. Jacobs Version: $Header: StrAss.c,v 1.3 88/03/23 17:53:47 ceriel Exp $ */ StringAssign(dstsiz, srcsiz, dstaddr, srcaddr) register char *dstaddr, *srcaddr; { while (srcsiz > 0) { *dstaddr++ = *srcaddr++; srcsiz--; dstsiz--; } if (dstsiz > 0) { *dstaddr = 0; } } # (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Streams; (* Module: Stream Input/Output Author: Ceriel J.H. Jacobs Version: $Header: Streams.mod,v 1.11 91/03/05 13:45:52 ceriel Exp $ Implementation for Unix *) FROM SYSTEM IMPORT BYTE, ADR; FROM Epilogue IMPORT CallAtEnd; FROM Storage IMPORT Allocate, Available; FROM StripUnix IMPORT open, close, lseek, read, write, creat; IMPORT StripUnix; CONST BUFSIZ = 1024; (* tunable *) TYPE IOB = RECORD kind: StreamKind; mode: StreamMode; eof: BOOLEAN; buffering: StreamBuffering; next : Stream; fildes: INTEGER; cnt, maxcnt: INTEGER; bufferedcnt: INTEGER; buf: ARRAY[1..BUFSIZ] OF BYTE; END; Stream = POINTER TO IOB; VAR ibuf, obuf, ebuf: IOB; head: Stream; PROCEDURE getstruct(VAR stream: Stream); BEGIN stream := head; WHILE (stream # NIL) AND (stream^.kind # none) DO stream := stream^.next; END; IF stream = NIL THEN IF NOT Available(SIZE(IOB)) THEN RETURN; END; Allocate(stream,SIZE(IOB)); stream^.next := head; head := stream; END; END getstruct; PROCEDURE freestruct(stream: Stream); BEGIN stream^.kind := none; END freestruct; PROCEDURE OpenStream(VAR stream: Stream; filename: ARRAY OF CHAR; kind: StreamKind; mode: StreamMode; VAR result: StreamResult); VAR fd: INTEGER; i: CARDINAL; BEGIN IF kind = none THEN result := illegaloperation; RETURN; END; getstruct(stream); IF stream = NIL THEN result := nomemory; RETURN; END; WITH stream^ DO FOR i := 0 TO HIGH(filename) DO buf[i+1] := BYTE(filename[i]); END; buf[HIGH(filename)+2] := BYTE(0C); END; IF (mode = reading) THEN fd := open(ADR(stream^.buf), 0); ELSE fd := -1; IF (mode = appending) THEN fd := open(ADR(stream^.buf), 1); IF fd >= 0 THEN IF (lseek(fd, 0D , 2) < 0D) THEN ; END; END; END; IF fd < 0 THEN fd := creat(ADR(stream^.buf), 666B); END; END; IF fd < 0 THEN result := openfailed; freestruct(stream); stream := NIL; RETURN; END; result := succeeded; stream^.fildes := fd; stream^.kind := kind; stream^.mode := mode; stream^.buffering := blockbuffered; stream^.bufferedcnt := BUFSIZ; stream^.maxcnt := 0; stream^.eof := FALSE; IF mode = reading THEN stream^.cnt := 1; ELSE stream^.cnt := 0; END; END OpenStream; PROCEDURE SetStreamBuffering( stream: Stream; b: StreamBuffering; VAR result: StreamResult); BEGIN result := succeeded; IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN; END; IF (stream^.mode = reading) OR ((b = linebuffered) AND (stream^.kind = binary)) THEN result := illegaloperation; RETURN; END; FlushStream(stream, result); IF b = unbuffered THEN stream^.bufferedcnt := 1; END; stream^.buffering := b; END SetStreamBuffering; PROCEDURE FlushStream(stream: Stream; VAR result: StreamResult); VAR cnt1: INTEGER; BEGIN result := succeeded; IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN; END; WITH stream^ DO IF mode = reading THEN result := illegaloperation; RETURN; END; IF (cnt > 0) THEN cnt1 := cnt; cnt := 0; IF write(fildes, ADR(buf), cnt1) < 0 THEN END; END; END; END FlushStream; PROCEDURE CloseStream(VAR stream: Stream; VAR result: StreamResult); BEGIN IF (stream # NIL) AND (stream^.kind # none) THEN result := succeeded; IF stream^.mode # reading THEN FlushStream(stream, result); END; IF close(stream^.fildes) < 0 THEN ; END; freestruct(stream); ELSE result := nostream; END; stream := NIL; END CloseStream; PROCEDURE EndOfStream(stream: Stream; VAR result: StreamResult): BOOLEAN; BEGIN result := succeeded; IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN FALSE; END; IF stream^.mode # reading THEN result := illegaloperation; RETURN FALSE; END; IF stream^.eof THEN RETURN TRUE; END; RETURN (CHAR(NextByte(stream)) = 0C) AND stream^.eof; END EndOfStream; PROCEDURE FlushLineBuffers(); VAR s: Stream; result: StreamResult; BEGIN s := head; WHILE s # NIL DO IF (s^.kind # none) AND (s^.buffering = linebuffered) THEN FlushStream(s, result); END; s := s^.next; END; END FlushLineBuffers; PROCEDURE NextByte(stream: Stream): BYTE; VAR c: BYTE; BEGIN WITH stream^ DO IF cnt <= maxcnt THEN c := buf[cnt]; ELSE IF eof THEN RETURN BYTE(0C); END; IF stream = InputStream THEN FlushLineBuffers(); END; maxcnt := read(fildes, ADR(buf), bufferedcnt); cnt := 1; IF maxcnt <= 0 THEN eof := TRUE; c := BYTE(0C); ELSE c := buf[1]; END; END; END; RETURN c; END NextByte; PROCEDURE Read(stream: Stream; VAR ch: CHAR; VAR result: StreamResult); VAR EoF: BOOLEAN; BEGIN ch := 0C; EoF := EndOfStream(stream, result); IF result # succeeded THEN RETURN; END; IF EoF THEN result := endoffile; RETURN; END; WITH stream^ DO ch := CHAR(buf[cnt]); INC(cnt); END; END Read; PROCEDURE ReadByte(stream: Stream; VAR byte: BYTE; VAR result: StreamResult); VAR EoF: BOOLEAN; BEGIN byte := BYTE(0C); EoF := EndOfStream(stream, result); IF result # succeeded THEN RETURN; END; IF EoF THEN result := endoffile; RETURN; END; WITH stream^ DO byte := buf[cnt]; INC(cnt); END; END ReadByte; PROCEDURE ReadBytes(stream: Stream; VAR bytes: ARRAY OF BYTE; VAR result: StreamResult); VAR i: CARDINAL; BEGIN FOR i := 0 TO HIGH(bytes) DO ReadByte(stream, bytes[i], result); END; END ReadBytes; PROCEDURE Write(stream: Stream; ch: CHAR; VAR result: StreamResult); BEGIN IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN; END; IF (stream^.kind # text) OR (stream^.mode = reading) THEN result := illegaloperation; RETURN; END; WITH stream^ DO INC(cnt); buf[cnt] := BYTE(ch); IF (cnt >= bufferedcnt) OR ((ch = 12C) AND (buffering = linebuffered)) THEN FlushStream(stream, result); END; END; END Write; PROCEDURE WriteByte(stream: Stream; byte: BYTE; VAR result: StreamResult); BEGIN IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN; END; IF (stream^.kind # binary) OR (stream^.mode = reading) THEN result := illegaloperation; RETURN; END; WITH stream^ DO INC(cnt); buf[cnt] := byte; IF cnt >= bufferedcnt THEN FlushStream(stream, result); END; END; END WriteByte; PROCEDURE WriteBytes(stream: Stream; bytes: ARRAY OF BYTE; VAR result: StreamResult); VAR i: CARDINAL; BEGIN FOR i := 0 TO HIGH(bytes) DO WriteByte(stream, bytes[i], result); END; END WriteBytes; PROCEDURE EndIt; VAR h, h1 : Stream; result: StreamResult; BEGIN h := head; WHILE h # NIL DO h1 := h; CloseStream(h1, result); h := h^.next; END; END EndIt; PROCEDURE GetPosition(s: Stream; VAR position: LONGINT; VAR result: StreamResult); BEGIN IF (s = NIL) OR (s^.kind = none) THEN result := illegaloperation; RETURN; END; IF (s^.mode # reading) THEN FlushStream(s, result); END; position := lseek(s^.fildes, 0D, 1); IF position < 0D THEN result := illegaloperation; RETURN; END; IF s^.mode = reading THEN position := position + LONG(s^.maxcnt - s^.cnt + 1); END; END GetPosition; PROCEDURE SetPosition(s: Stream; position: LONGINT; VAR result: StreamResult); VAR currpos: LONGINT; BEGIN currpos := 0D; IF (s = NIL) OR (s^.kind = none) THEN result := nostream; RETURN; END; IF (s^.mode # reading) THEN FlushStream(s, result); ELSE s^.maxcnt := 0; s^.eof := FALSE; END; IF s^.mode = appending THEN currpos := lseek(s^.fildes, 0D, 1); IF currpos < 0D THEN result := illegaloperation; RETURN; END; END; IF position < currpos THEN result := illegaloperation; RETURN; END; currpos := lseek(s^111.fildes, position, 0); IF currpos < 0D THEN result := illegaloperation; RETURN; END; result := succeeded; END SetPosition; PROCEDURE isatty(stream: Stream; VAR result: StreamResult): BOOLEAN; BEGIN IF (stream = NIL) OR (stream^.kind = none) THEN result := nostream; RETURN FALSE; END; RETURN StripUnix.isatty(stream^.fildes); END isatty; PROCEDURE InitStreams; VAR result: StreamResult; BEGIN InputStream := ADR(ibuf); OutputStream := ADR(obuf); ErrorStream := ADR(ebuf); WITH ibuf DO kind := text; mode := reading; eof := FALSE; next := ADR(obuf); fildes := 0; maxcnt := 0; cnt := 1; bufferedcnt := BUFSIZ; END; WITH obuf DO kind := text; mode := writing; eof := TRUE; next := ADR(ebuf); fildes := 1; maxcnt := 0; cnt := 0; bufferedcnt := BUFSIZ; IF isatty(OutputStream, result) THEN buffering := linebuffered; ELSE buffering := blockbuffered; END; END; WITH ebuf DO kind := text; mode := writing; eof := TRUE; next := NIL; fildes := 2; maxcnt := 0; cnt := 0; bufferedcnt := BUFSIZ; IF isatty(ErrorStream, result) THEN buffering := linebuffered; ELSE buffering := blockbuffered; END; END; head := InputStream; IF CallAtEnd(EndIt) THEN ; END; END InitStreams; BEGIN InitStreams END Streams. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Strings; (* Module: String manipulations Author: Ceriel J.H. Jacobs Version: $Header: Strings.mod,v 1.5 91/03/05 13:46:11 ceriel Exp $ *) PROCEDURE Assign(source: ARRAY OF CHAR; VAR dest: ARRAY OF CHAR); (* Assign string source to dest *) VAR i: CARDINAL; max: CARDINAL; BEGIN max := HIGH(source); IF HIGH(dest) < max THEN max := HIGH(dest); END; i := 0; WHILE (i <= max) AND (source[i] # 0C) DO dest[i] := source[i]; INC(i); END; IF i < HIGH(dest) THEN dest[i] := 0C; END; END Assign; PROCEDURE Insert(substr: ARRAY OF CHAR; VAR str: ARRAY OF CHAR; inx: CARDINAL); (* Insert the string substr into str, starting at str[inx]. If inx is equal to or greater than Length(str) then substr is appended to the end of str. *) VAR sublen, length, i: CARDINAL; BEGIN sublen := Length(substr); IF sublen = 0 THEN RETURN; END; length := Length(str); IF inx > length THEN inx := length; END; i := length; IF i + sublen - 1 > HIGH(str) THEN i := HIGH(str); END; WHILE i > inx DO str[i+sublen-1] := str[i-1]; DEC(i); END; FOR i := 0 TO sublen - 1 DO IF i + inx <= HIGH(str) THEN str[i + inx] := substr[i]; ELSE RETURN; END; END; IF length + sublen <= HIGH(str) THEN str[length + sublen] := 0C; END; END Insert; PROCEDURE Delete(VAR str: ARRAY OF CHAR; inx, len: CARDINAL); (* Delete len characters from str, starting at str[inx]. If inx >= Length(str) then nothing happens. If there are not len characters to delete, characters to the end of the string are deleted. *) VAR length: CARDINAL; BEGIN IF len = 0 THEN RETURN; END; length := Length(str); IF inx >= length THEN RETURN; END; WHILE inx + len < length DO str[inx] := str[inx + len]; INC(inx); END; str[inx] := 0C; END Delete; PROCEDURE Pos(substr, str: ARRAY OF CHAR): CARDINAL; (* Return the index into str of the first occurrence of substr. Pos returns a value greater than HIGH(str) of no occurrence is found. *) VAR i, j, max, subl: CARDINAL; BEGIN max := Length(str); subl := Length(substr); IF subl > max THEN RETURN HIGH(str) + 1; END; IF subl = 0 THEN RETURN 0; END; max := max - subl; FOR i := 0 TO max DO j := 0; WHILE (j <= subl-1) AND (str[i+j] = substr[j]) DO INC(j); END; IF j = subl THEN RETURN i; END; END; RETURN HIGH(str) + 1; END Pos; PROCEDURE Copy(str: ARRAY OF CHAR; inx, len: CARDINAL; VAR result: ARRAY OF CHAR); (* Copy at most len characters from str into result, starting at str[inx]. *) VAR i: CARDINAL; BEGIN IF Length(str) <= inx THEN RETURN END; i := 0; LOOP IF i > HIGH(result) THEN RETURN; END; IF len = 0 THEN EXIT; END; IF inx > HIGH(str) THEN EXIT; END; result[i] := str[inx]; INC(i); INC(inx); DEC(len); END; IF i <= HIGH(result) THEN result[i] := 0C; END; END Copy; PROCEDURE Concat(s1, s2: ARRAY OF CHAR; VAR result: ARRAY OF CHAR); (* Concatenate two strings. *) VAR i, j: CARDINAL; BEGIN i := 0; WHILE (i <= HIGH(s1)) AND (s1[i] # 0C) DO IF i > HIGH(result) THEN RETURN END; result[i] := s1[i]; INC(i); END; j := 0; WHILE (j <= HIGH(s2)) AND (s2[j] # 0C) DO IF i > HIGH(result) THEN RETURN END; result[i] := s2[j]; INC(i); INC(j); END; IF i <= HIGH(result) THEN result[i] := 0C; END; END Concat; PROCEDURE Length(str: ARRAY OF CHAR): CARDINAL; (* Return number of characters in str. *) VAR i: CARDINAL; BEGIN i := 0; WHILE (i <= HIGH(str)) DO IF str[i] = 0C THEN RETURN i; END; INC(i); END; RETURN i; END Length; PROCEDURE CompareStr(s1, s2: ARRAY OF CHAR): INTEGER; (* Compare two strings, return -1 if s1 < s2, 0 if s1 = s2, and 1 if s1 > s2. *) VAR i: CARDINAL; max: CARDINAL; BEGIN max := HIGH(s1); IF HIGH(s2) < max THEN max := HIGH(s2); END; i := 0; WHILE (i <= max) DO IF s1[i] < s2[i] THEN RETURN -1; END; IF s1[i] > s2[i] THEN RETURN 1; END; IF s1[i] = 0C THEN RETURN 0; END; INC(i); END; IF (i <= HIGH(s1)) AND (s1[i] # 0C) THEN RETURN 1; END; IF (i <= HIGH(s2)) AND (s2[i] # 0C) THEN RETURN -1; END; RETURN 0; END CompareStr; END Strings. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (* Module: Interface to termcap database From: Unix manual chapter 3 Version: $Header: Termcap.mod,v 1.4 91/03/05 13:46:24 ceriel Exp $ *) (*$R-*) IMPLEMENTATION MODULE Termcap; IMPORT XXTermcap; FROM SYSTEM IMPORT ADR, ADDRESS; FROM Unix IMPORT isatty; FROM Arguments IMPORT GetEnv; TYPE STR = ARRAY[1..32] OF CHAR; STRCAP = POINTER TO STR; VAR Buf, Buf1 : ARRAY [1..1024] OF CHAR; BufCnt : INTEGER; PROCEDURE Tgetent(name: ARRAY OF CHAR) : INTEGER; VAR i: INTEGER; x: STRCAP; BEGIN i := XXTermcap.tgetent(ADR(Buf), ADR(name)); BufCnt := 1; IF isatty(1) THEN ELSE (* This used to be something returned by gtty(). To increase * portability we forget about old terminals needing delays. * (kjb) *) XXTermcap.ospeed := 0; END; IF i > 0 THEN IF Tgetstr("pc", x) THEN XXTermcap.PC := x^[1]; ELSE XXTermcap.PC := 0C; END; IF Tgetstr("up", x) THEN ; END; XXTermcap.UP := x; IF Tgetstr("bc", x) THEN ; END; XXTermcap.BC := x; END; RETURN i; END Tgetent; PROCEDURE Tgetnum(id: ARRAY OF CHAR): INTEGER; BEGIN RETURN XXTermcap.tgetnum(ADR(id)); END Tgetnum; PROCEDURE Tgetflag(id: ARRAY OF CHAR): BOOLEAN; BEGIN RETURN XXTermcap.tgetflag(ADR(id)) = 1; END Tgetflag; PROCEDURE Tgoto(cm: STRCAP; col, line: INTEGER): STRCAP; BEGIN RETURN XXTermcap.tgoto(cm, col, line); END Tgoto; PROCEDURE Tgetstr(id: ARRAY OF CHAR; VAR res: STRCAP) : BOOLEAN; VAR a, a2: ADDRESS; b: CARDINAL; BEGIN a := ADR(Buf1[BufCnt]); a2 := XXTermcap.tgetstr(ADR(id), ADR(a)); res := a2; IF a2 = NIL THEN RETURN FALSE; END; b := a - a2; INC(BufCnt, b); RETURN TRUE; END Tgetstr; PROCEDURE Tputs(cp: STRCAP; affcnt: INTEGER; p: PUTPROC); BEGIN XXTermcap.tputs(cp, affcnt, XXTermcap.PUTPROC(p)); END Tputs; PROCEDURE InitTermcap; VAR Bf: STR; BEGIN IF GetEnv("TERM", Bf) = 0 THEN Bf := "dumb"; END; IF Tgetent(Bf) <= 0 THEN END; END InitTermcap; BEGIN InitTermcap; END Termcap. # (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Terminal; (* Module: Input/Output to/from terminals Author: Ceriel J.H. Jacobs Version: $Header: Terminal.mod,v 1.4 91/03/05 13:46:43 ceriel Exp $ Implementation for Unix. *) FROM SYSTEM IMPORT ADR; #ifdef __USG FROM Unix IMPORT read, write, open, fcntl; #else FROM Unix IMPORT read, write, open, ioctl; #endif VAR fildes: INTEGER; unreadch: CHAR; unread: BOOLEAN; tty: ARRAY[0..8] OF CHAR; PROCEDURE Read(VAR ch: CHAR); BEGIN IF unread THEN ch := unreadch; unread := FALSE ELSE IF read(fildes, ADR(ch), 1) < 0 THEN ; END; END; unreadch := ch; END Read; PROCEDURE BusyRead(VAR ch: CHAR); VAR l: INTEGER; BEGIN IF unread THEN ch := unreadch; unread := FALSE ELSE #ifdef __USG l := fcntl(fildes, (*FGETFL*) 3, 0); IF fcntl(fildes, (* FSETFL *) 4, l + (*ONDELAY*) 2) < 0 THEN ; END; IF read(fildes, ADR(ch), 1) = 0 THEN ch := 0C; ELSE unreadch := ch; END; IF fcntl(fildes, (*FSETFL*)4, l) < 0 THEN ; END; #else #ifdef __BSD4_2 IF ioctl(fildes, INTEGER(ORD('f')*256+127+4*65536+40000000H), ADR(l)) < 0 THEN #else IF ioctl(fildes, INTEGER(ORD('f')*256+127), ADR(l)) < 0 THEN #endif ; END; IF l = 0 THEN ch := 0C; ELSE IF read(fildes, ADR(ch), 1) < 0 THEN ; END; unreadch := ch; END; #endif END; END BusyRead; PROCEDURE ReadAgain; BEGIN unread := TRUE; END ReadAgain; PROCEDURE Write(ch: CHAR); BEGIN IF write(fildes, ADR(ch), 1) < 0 THEN ; END; END Write; PROCEDURE WriteLn; BEGIN Write(12C); END WriteLn; PROCEDURE WriteString(s: ARRAY OF CHAR); VAR i: CARDINAL; BEGIN i := 0; WHILE (i <= HIGH(s)) & (s[i] # 0C) DO Write(s[i]); INC(i) END END WriteString; BEGIN tty := "/dev/tty"; fildes := open(ADR(tty), 2); unread := FALSE; END Terminal. (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Traps; (* Module: Facility for handling traps Author: Ceriel J.H. Jacobs Version: $Header: Traps.mod,v 1.7 91/03/05 13:46:52 ceriel Exp $ *) FROM EM IMPORT SIG, LINO, FILN, TRP; FROM Unix IMPORT write; FROM SYSTEM IMPORT ADDRESS, ADR; FROM Arguments IMPORT Argv; PROCEDURE InstallTrapHandler(t: TrapHandler): TrapHandler; (* Install a new trap handler, and return the previous one. Parameter of trap handler is the trap number. *) BEGIN RETURN SIG(t); END InstallTrapHandler; PROCEDURE Message(str: ARRAY OF CHAR); (* Write message "str" on standard error, preceeded by filename and linenumber if possible *) VAR p: POINTER TO CHAR; l: CARDINAL; lino: INTEGER; buf, buf2: ARRAY [0..255] OF CHAR; i, j: CARDINAL; BEGIN p := FILN(); IF p # NIL THEN i := 1; buf[0] := '"'; WHILE p^ # 0C DO buf[i] := p^; INC(i); p := ADDRESS(p) + 1; END; buf[i] := '"'; INC(i); IF write(2, ADR(buf), i) < 0 THEN END; ELSE l := Argv(0, buf); IF write(2, ADR(buf), l-1) < 0 THEN END; END; lino := LINO(); i := 0; IF lino # 0 THEN i := 7; buf[0] := ','; buf[1] := ' '; buf[2] := 'l'; buf[3] := 'i'; buf[4] := 'n'; buf[5] := 'e'; buf[6] := ' '; IF lino < 0 THEN buf[7] := '-'; i := 8; lino := - lino; END; j := 0; REPEAT buf2[j] := CHR(CARDINAL(lino) MOD 10 + ORD('0')); lino := lino DIV 10; INC(j); UNTIL lino = 0; WHILE j > 0 DO DEC(j); buf[i] := buf2[j]; INC(i); END; END; buf[i] := ':'; buf[i+1] := ' '; IF write(2, ADR(buf), i+2) < 0 THEN END; i := 0; WHILE (i <= HIGH(str)) AND (str[i] # 0C) DO INC(i); END; IF write(2, ADR(str), i) < 0 THEN END; buf[0] := 12C; IF write(2, ADR(buf), 1) < 0 THEN END; END Message; PROCEDURE Trap(n: INTEGER); (* cause trap number "n" to occur *) BEGIN TRP(n); END Trap; END Traps. /* * termcap.c 1.1 20/7/87 agc Joypace Ltd * * Copyright Joypace Ltd, London, UK, 1987. All rights reserved. * This file may be freely distributed provided that this notice * remains attached. * * A public domain implementation of the termcap(3) routines. * * Made fully functional by Ceriel J.H. Jacobs. * * BUGS: * - does not check termcap entry sizes * - not fully tested */ #define CAPABLEN 2 #define ISSPACE(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n') #define ISDIGIT(x) ((x) >= '0' && (x) <= '9') short ospeed = 0; /* output speed */ char PC = 0; /* padding character */ char *BC = 0; /* back cursor movement */ char *UP = 0; /* up cursor movement */ static char *capab = 0; /* the capability itself */ static int check_for_tc(); static int match_name(); #define NULL 0 /* Some things from C-library, needed here because the C-library is not loaded with Modula-2 programs */ static char * strcat(s1, s2) register char *s1, *s2; { /* Append s2 to the end of s1. */ char *original = s1; /* Find the end of s1. */ while (*s1 != 0) s1++; /* Now copy s2 to the end of s1. */ while (*s1++ = *s2++) /* nothing */ ; return(original); } static char * strcpy(s1, s2) register char *s1, *s2; { /* Copy s2 to s1. */ char *original = s1; while (*s1++ = *s2++) /* nothing */; return(original); } static int strlen(s) char *s; { /* Return length of s. */ char *original = s; while (*s != 0) s++; return(s - original); } static int strcmp(s1, s2) register char *s1, *s2; { /* Compare 2 strings. */ for(;;) { if (*s1 != *s2) { if (!*s1) return -1; if (!*s2) return 1; return(*s1 - *s2); } if (*s1++ == 0) return(0); s2++; } } static int strncmp(s1, s2, n) register char *s1, *s2; int n; { /* Compare two strings, but at most n characters. */ while (n-- > 0) { if (*s1 != *s2) { if (!*s1) return -1; if (!*s2) return 1; return(*s1 - *s2); } if (*s1++ == 0) break; s2++; } return 0; } static char * getenv(name) register char *name; { extern char ***_penviron; register char **v = *_penviron, *p, *q; if (v == 0 || name == 0) return 0; while ((p = *v++) != 0) { q = name; while (*q && *q++ == *p++) /* nothing */ ; if (*q || *p != '=') continue; return(p+1); } return(0); } static char * fgets(buf, count, fd) char *buf; { static char bf[1024]; static int cnt = 0; static char *pbf = &bf[0]; register char *c = buf; while (--count) { if (pbf >= &bf[cnt]) { if ((cnt = read(fd, bf, 1024)) <= 0) { if (c == buf) return (char *) NULL; *c = 0; return buf; } pbf = &bf[0]; } *c = *pbf++; if (*c++ == '\n') { *c = 0; return buf; } } *c = 0; return buf; } /* * tgetent - get the termcap entry for terminal name, and put it * in bp (which must be an array of 1024 chars). Returns 1 if * termcap entry found, 0 if not found, and -1 if file not found. */ int tgetent(bp, name) char *bp; char *name; { int fp; char *file; char *cp; short len = strlen(name); char buf[1024]; capab = bp; if ((file = getenv("TERMCAP")) != (char *) NULL) { if (*file != '/' && (cp = getenv("TERM")) != NULL && strcmp(name, cp) == 0) { (void) strcpy(bp, file); return(1); } else file = "/etc/termcap"; } else file = "/etc/termcap"; if ((fp = open(file, 0)) < 0) { capab = 0; return(-1); } while (fgets(buf, 1024, fp) != NULL) { if (buf[0] == '#') continue; while (*(cp = &buf[strlen(buf) - 2]) == '\\') if (fgets(cp, 1024, fp) == NULL) return (0); if (match_name(buf, name)) { strcpy(bp, buf); close(fp); if(check_for_tc() == 0) { capab = 0; return 0; } return 1; } } capab = 0; close(fp); return(0); } /* * Compare the terminal name with each termcap entry name; Return 1 if a * match is found. */ static int match_name(buf, name) char *buf; char *name; { register char *tp = buf; register char *np; for (;;) { for (np = name; *np && *tp == *np; np++, tp++) { } if (*np == 0 && (*tp == '|' || *tp == ':' || *tp == 0)) return(1); while (*tp != 0 && *tp != '|' && *tp != ':') tp++; if (*tp++ != '|') return (0); } } /* * Handle tc= definitions recursively. */ static int check_for_tc() { static int count = 0; char *savcapab = capab; char buf[1024]; char terminalname[128]; register char *p = capab + strlen(capab) - 2, *q; while (*p != ':') if (--p < capab) return(0); /* no : in termcap entry */ if (p[1] != 't' || p[2] != 'c') return(1); if (count > 16) { return(0); /* recursion in tc= definitions */ } count++; strcpy(terminalname, &p[4]); q = terminalname; while (*q && *q != ':') q++; *q = 0; if (tgetent(buf, terminalname) != 1) { --count; return(0); } --count; for (q = buf; *q && *q != ':'; q++) { } strcpy(p, q); capab = savcapab; return(1); } /* * tgetnum - get the numeric terminal capability corresponding * to id. Returns the value, -1 if invalid. */ int tgetnum(id) char *id; { char *cp; int ret; if ((cp = capab) == NULL || id == NULL || *cp == 0) return(-1); while (*++cp && *cp != ':') ; while (*cp) { cp++; while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) { while (*cp && *cp != ':' && *cp != '#') cp++; if (*cp != '#') return(-1); for (ret = 0, cp++ ; *cp && ISDIGIT(*cp) ; cp++) ret = ret * 10 + *cp - '0'; return(ret); } while (*cp && *cp != ':') cp++; } return(-1); } /* * tgetflag - get the boolean flag corresponding to id. Returns -1 * if invalid, 0 if the flag is not in termcap entry, or 1 if it is * present. */ int tgetflag(id) char *id; { char *cp; if ((cp = capab) == NULL || id == NULL || *cp == 0) return(-1); while (*++cp && *cp != ':') ; while (*cp) { cp++; while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) return(1); while (*cp && *cp != ':') cp++; } return(0); } /* * tgetstr - get the string capability corresponding to id and place * it in area (advancing area at same time). Expand escape sequences * etc. Returns the string, or NULL if it can't do it. */ char * tgetstr(id, area) char *id; char **area; { char *cp; char *ret; int i; if ((cp = capab) == NULL || id == NULL || *cp == 0) return(NULL); while (*++cp != ':') ; while (*cp) { cp++; while (ISSPACE(*cp)) cp++; if (strncmp(cp, id, CAPABLEN) == 0) { while (*cp && *cp != ':' && *cp != '=') cp++; if (*cp != '=') return(NULL); for (ret = *area, cp++; *cp && *cp != ':' ; (*area)++, cp++) switch(*cp) { case '^' : **area = *++cp - 'A' + 1; break; case '\\' : switch(*++cp) { case 'E' : **area = '\033'; break; case 'n' : **area = '\n'; break; case 'r' : **area = '\r'; break; case 't' : **area = '\t'; break; case 'b' : **area = '\b'; break; case 'f' : **area = '\f'; break; case '0' : case '1' : case '2' : case '3' : for (i=0 ; *cp && ISDIGIT(*cp) ; cp++) i = i * 8 + *cp - '0'; **area = i; cp--; break; case '^' : case '\\' : **area = *cp; break; } break; default : **area = *cp; } *(*area)++ = '\0'; return(ret); } while (*cp && *cp != ':') cp++; } return(NULL); } /* * tgoto - given the cursor motion string cm, make up the string * for the cursor to go to (destcol, destline), and return the string. * Returns "OOPS" if something's gone wrong, or the string otherwise. */ char * tgoto(cm, destcol, destline) char *cm; int destcol; int destline; { register char *rp; static char ret[32]; char added[16]; int *dp = &destline; int numval; int swapped = 0; added[0] = 0; for (rp = ret ; *cm ; cm++) { if (*cm == '%') { switch(*++cm) { case '>' : if (dp == NULL) return("OOPS"); cm++; if (*dp > *cm++) { *dp += *cm; } break; case '+' : case '.' : if (dp == NULL) return("OOPS"); if (*cm == '+') *dp = *dp + *++cm; for (;;) { switch(*dp) { case 0: case 04: case '\t': case '\n': /* fi1111lter these out */ if (dp == &destcol || swapped || UP) { strcat(added, dp == &destcol || swapped ? (BC ? BC : "\b") : UP); (*dp)++; continue; } } break; } *rp++ = *dp; dp = (dp == &destline) ? &destcol : NULL; break; case 'r' : { int tmp = destline; destline = destcol; destcol = tmp; swapped = 1 - swapped; break; } case 'n' : destcol ^= 0140; destline ^= 0140; break; case '%' : *rp++ = '%'; break; case 'i' : destcol++; destline++; break; case 'B' : if (dp == NULL) return("OOPS"); *dp = 16 * (*dp / 10) + *dp % 10; break; case 'D' : if (dp == NULL) return("OOPS"); *dp = *dp - 2 * (*dp % 16); break; case 'd' : case '2' : case '3' : if (dp == NULL) return("OOPS"); numval = *dp; dp = (dp == &destline) ? &destcol : NULL; if (numval >= 100) { *rp++ = '0' + numval / 100; } else if (*cm == '3') { *rp++ = ' '; } if (numval >= 10) { *rp++ = '0' + ((numval%100)/10); } else if (*cm == '3' || *cm == '2') { *rp++ = ' '; } *rp++ = '0' + (numval%10); break; default : return("OOPS"); } } else *rp++ = *cm; } *rp = '\0'; strcpy(rp, added); return(ret); } static int tens_of_ms_p_char[] = { /* index as returned by gtty */ /* assume 10 bits per char */ 0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5, 2 }; /* * tputs - put the string cp out onto the terminal, using the function * outc. Also handle padding. */ int tputs(cp, affcnt, outc) register char *cp; int affcnt; int (*outc)(); { int delay = 0; if (cp == NULL) return(1); while (ISDIGIT(*cp)) { delay = delay * 10 + (*cp++ - '0'); } delay *= 10; if (*cp == '.') { cp++; if (ISDIGIT(*cp)) { delay += *cp++ - '0'; } while (ISDIGIT(*cp)) cp++; } if (*cp == '*') { delay *= affcnt; cp++; } while (*cp) (*outc)(*cp++); if (delay != 0 && ospeed > 0 && ospeed < (sizeof tens_of_ms_p_char / sizeof tens_of_ms_p_char[0])) { delay = (delay + tens_of_ms_p_char[ospeed] - 1) / tens_of_ms_p_char[ospeed]; while (delay--) (*outc)(PC); } return(1); } /* * That's all, folks... */ /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: double abs function Author: Ceriel J.H. Jacobs Version: $Header: absd.c,v 1.3 88/03/23 17:53:57 ceriel Exp $ */ #ifndef NOFLOAT double absd(i) double i; { return i >= 0 ? i : -i; } #endif # ; ; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. ; See the copyright notice in the ACK home directory, in the file "Copyright". ; ; ; Module: REAL abs function ; Author: Ceriel J.H. Jacobs ; Version: $Header: absf.e,v 1.3 88/03/23 17:54:06 ceriel Exp $ ; mes 2,_EM_WSIZE,_EM_PSIZE exp $absf pro $absf,0 mes 5 mes 9,8 lal 0 loi _EM_FSIZE zrf _EM_FSIZE cmf _EM_FSIZE zlt *3 lal 0 loi _EM_FSIZE bra *4 3 lal 0 loi _EM_FSIZE ngf _EM_FSIZE 4 ret _EM_FSIZE end 0 /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: integer abs function Author: Ceriel J.H. Jacobs Version: $Header: absi.c,v 1.3 88/03/23 17:54:17 ceriel Exp $ */ absi(i) { return i >= 0 ? i : -i; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: longint abs function Author: Ceriel J.H. Jacobs Version: $Header: absl.c,v 1.3 88/03/23 17:54:27 ceriel Exp $ */ long absl(i) long i; { return i >= 0 ? i : -i; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: block moves Author: Ceriel J.H. Jacobs Version: $Header: blockmove.c,v 1.3 91/09/04 15:59:56 ceriel Exp $ */ #if _EM_WSIZE==_EM_PSIZE typedef unsigned pcnt; #else typedef unsigned long pcnt; #endif blockmove(siz, dst, src) pcnt siz; register char *dst, *src; { while (siz--) *dst++ = *src++; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: cap; implementation of CAP Author: Ceriel J.H. Jacobs Version: $Header: cap.c,v 1.2 88/06/03 09:36:08 ceriel Exp $ */ cap(u) unsigned u; { register unsigned *p = &u; if (*p >= 'a' && *p <= 'z') *p += 'A'-'a'; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: default modula-2 trap handler Author: Ceriel J.H. Jacobs Version: $Header: catch.c,v 1.23 91/09/04 15:49:23 ceriel Exp $ */ #include #include #include static struct errm { int errno; char *errmes; } errors[] = { { EARRAY, "array bound error"}, { ERANGE, "range bound error"}, { ESET, "set bound error"}, { EIOVFL, "integer overflow"}, { EFOVFL, "real overflow"}, { EFUNFL, "real underflow"}, { EIDIVZ, "divide by 0"}, { EFDIVZ, "divide by 0.0"}, { EIUND, "undefined integer"}, { EFUND, "undefined real"}, { ECONV, "conversion error"}, { ESTACK, "stack overflow"}, { EHEAP, "heap overflow"}, { EILLINS, "illegal instruction"}, { EODDZ, "illegal size argument"}, { ECASE, "case error"}, { EMEMFLT, "addressing non existent memory"}, { EBADPTR, "bad pointer used"}, { EBADPC, "program counter out of range"}, { EBADLAE, "bad argument of lae"}, { EBADMON, "bad monitor call"}, { EBADLIN, "argument if LIN too high"}, { EBADGTO, "GTO descriptor error"}, { M2_TOOLARGE, "stack size of process too large"}, { M2_TOOMANY, "too many nested traps + handlers"}, { M2_NORESULT, "no RETURN from function procedure"}, { M2_UOVFL, "cardinal overflow"}, { M2_FORCH, "(warning) FOR-loop control variable was changed in the body"}, { M2_UUVFL, "cardinal underflow"}, { M2_INTERNAL, "internal error; ask an expert for help"}, { M2_UNIXSIG, "got a unix signal"}, { -1, 0} }; catch(trapno) int trapno; { register struct errm *ep = &errors[0]; char *errmessage; char buf[20]; register char *p, *s; while (ep->errno != trapno && ep->errmes != 0) ep++; if (p = ep->errmes) { while (*p) p++; _Traps__Message(ep->errmes, 0, (int) (p - ep->errmes), 1); } else { int i = trapno; static char q[] = "error number xxxxxxxxxxxxx"; p = &q[13]; s = buf; if (i < 0) { i = -i; *p++ = '-'; } do *s++ = i % 10 + '0'; while (i /= 10); while (s > buf) *p++ = *--s; *p = 0; _Traps__Message(q, 0, (int) (p - q), 1); } #if !defined(__em24) && !defined(__em44) && !defined(__em22) if (trapno == M2_UNIXSIG) { extern int __signo; signal(__signo, SIG_DFL); _cleanup(); kill(getpid(), __signo); _exit(trapno); } #endif if (trapno != M2_FORCH) { _cleanup(); _exit(trapno); } SIG(catch); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: runtime support for conformant arrays Author: Ceriel J.H. Jacobs Version: $Header: confarray.c,v 1.10 90/11/02 14:28:36 ceriel Exp $ */ #include #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #define EM_PSIZE _EM_PSIZE #endif #if EM_WSIZE==EM_PSIZE typedef unsigned pcnt; #else typedef unsigned long pcnt; #endif struct descr { char *addr; int low; unsigned int highminlow; unsigned int size; }; static struct descr *descrs[10]; static struct descr **ppdescr = descrs; pcnt new_stackptr(pdscr, a) struct descr *pdscr; { register struct descr *pdescr = pdscr; pcnt size = (((pdescr->highminlow + 1) * pdescr->size + (EM_WSIZE - 1)) & ~(EM_WSIZE - 1)); if (ppdescr >= &descrs[10]) { /* to many nested traps + handlers ! */ TRP(M2_TOOMANY); } *ppdescr++ = pdescr; if ((char *) &a - (char *) &pdscr > 0) { /* stack grows downwards */ return - size; } return size; } copy_array(pp, a) char *pp; { register char *p = pp; register char *q; register pcnt sz; char dummy; ppdescr--; sz = ((*ppdescr)->highminlow + 1) * (*ppdescr)->size; if ((char *) &a - (char *) &pp > 0) { (*ppdescr)->addr = q = (char *) &a; } else (*ppdescr)->addr = q = (char *) &a - ((sz + (EM_WSIZE - 1)) & ~ (EM_WSIZE - 1)); while (sz--) *q++ = *p++; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: implementation of DIV and MOD Author: Ceriel J.H. Jacobs Version: $Header: dvi.c,v 1.1 90/07/16 09:05:16 ceriel Exp $ Reason: We cannot use DVI and RMI, because DVI rounds towards 0 and Modula-2 requires truncation */ #include int dvi(j,i) int j,i; { if (j == 0) TRP(EIDIVZ); if ((i < 0) != (j < 0)) { if (i < 0) i = -i; else j = -j; return -((i+j-1)/j); } else return i/j; } long dvil(j,i) long j,i; { if (j == 0) TRP(EIDIVZ); if ((i < 0) != (j < 0)) { if (i < 0) i = -i; else j = -j; return -((i+j-1)/j); } else return i/j; } int rmi(j,i) int j,i; { if (j == 0) TRP(EIDIVZ); if (i == 0) return 0; if ((i < 0) != (j < 0)) { if (i < 0) i = -i; else j = -j; return j*((i+j-1)/j)-i; } else return i%j; } long rmil(j,i) long j,i; { if (j == 0) TRP(EIDIVZ); if (i == 0) return 0L; if ((i < 0) != (j < 0)) { if (i < 0) i = -i; else j = -j; return j*((i+j-1)/j)-i; } else return i%j; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: program termination routines Author: Ceriel J.H. Jacobs Version: $Header: halt.c,v 1.11 91/03/15 09:24:03 ceriel Exp $ */ #define MAXPROCS 32 static int callindex = 0; static int (*proclist[MAXPROCS])(); _cleanup() { while (--callindex >= 0) (*proclist[callindex])(); callindex = 0; } CallAtEnd(p) int (*p)(); { if (callindex >= MAXPROCS) { return 0; } proclist[callindex++] = p; return 1; } halt() { _cleanup(); _exit(0); } # ; ; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. ; See the copyright notice in the ACK home directory, in the file "Copyright". ; ; ; Module: Modula-2 runtime startoff ; Author: Ceriel J.H. Jacobs ; Version: $Header: head_m2.e,v 1.13 91/03/06 14:23:09 ceriel Exp $ ; mes 2,_EM_WSIZE,_EM_PSIZE exa handler exa argv exa argc exa MainLB exa bkillbss exp $catch exp $init inp $trap_handler bkillbss bss _EM_PSIZE,0,0 exp $_m_a_i_n pro $_m_a_i_n, 0 lor 0 lae MainLB sti _EM_PSIZE lal _EM_WSIZE loi _EM_PSIZE lae argv ; save argument pointer sti _EM_PSIZE lol 0 ste argc ; save argument count lpi $trap_handler sig asp _EM_PSIZE cal $init cal $__M2M_ cal $halt loc 0 ; should not get here ret _EM_WSIZE end pro $trap_handler,0 lpi $trap_handler sig lol 0 ; trap number lae handler loi _EM_PSIZE lpi $catch lae handler sti _EM_PSIZE cai asp _EM_PSIZE+_EM_WSIZE rtt end 0 /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: initialization and some global vars Author: Ceriel J.H. Jacobs Version: $Header: init.c,v 1.8 91/09/04 15:49:28 ceriel Exp $ */ #include #include #include /* map unix signals onto EM traps */ init() { sigtrp(M2_UNIXSIG, SIGHUP); sigtrp(M2_UNIXSIG, SIGINT); sigtrp(M2_UNIXSIG, SIGQUIT); sigtrp(EILLINS, SIGILL); sigtrp(M2_UNIXSIG, SIGTRAP); sigtrp(M2_UNIXSIG, SIGIOT); sigtrp(M2_UNIXSIG, SIGEMT); sigtrp(M2_UNIXSIG, SIGFPE); sigtrp(M2_UNIXSIG, SIGBUS); sigtrp(M2_UNIXSIG, SIGSEGV); #ifdef SIGSYS sigtrp(EBADMON, SIGSYS); #endif sigtrp(M2_UNIXSIG, SIGPIPE); sigtrp(M2_UNIXSIG, SIGALRM); sigtrp(M2_UNIXSIG, SIGTERM); } killbss() { /* Fill bss with junk? Make lots of VM pages dirty? No way! */ } extern int catch(); int (*handler)() = catch; char **argv; int argc; char *MainLB; /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: get value on stack, byte by byte Author: Ceriel J.H. Jacobs Version: $Header: load.c,v 1.5 90/11/02 14:28:52 ceriel Exp $ */ #include #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #define EM_PSIZE _EM_PSIZE #endif #if EM_WSIZE==EM_PSIZE typedef unsigned pcnt; #else typedef long pcnt; #endif load(siz, addr, p) register char *addr; register pcnt siz; { /* Make sure, that a value with a size that could have been handled by the LOI instruction ends up at the same place, where it would, were the LOI instruction used. */ register char *q = (char *) &p; char t[4]; if (siz < EM_WSIZE && EM_WSIZE % siz == 0) { /* as long as EM_WSIZE <= 4 ... */ if (siz != 2) TRP(M2_INTERNAL); /* internal error */ q = &t[0]; } while (siz--) *q++ = *addr++; if (q - t == 2) { *((unsigned *)(&p)) = *((unsigned short *) (&t[0])); } } # ; ; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. ; See the copyright notice in the ACK home directory, in the file "Copyright". ; ; ; Module: coroutine primitives ; Author: Kees Bot, Edwin Scheffer, Ceriel Jacobs ; Version: $Header: par_misc.e,v 1.6 91/09/25 15:39:43 ceriel Exp $ ; mes 2,_EM_WSIZE,_EM_PSIZE ; topsize takes care of two things: ; - given a stack-break, ; it computes the size of the chunk of memory needed to save the stack; ; - also, if this stack-break = 0, it creates one, assuming that caller is ; the stack-break. ; ; This implementation assumes a continuous stack growing downwards exp $topsize #ifdef __sparc inp $topsize2 pro $topsize, 0 mes 11 zer _EM_PSIZE lal 0 loi _EM_PSIZE cal $topsize2 asp 2*_EM_PSIZE lfr _EM_WSIZE ret _EM_WSIZE end 0 pro $topsize2, (3*_EM_WSIZE+3*_EM_PSIZE) #else pro $topsize, (3*_EM_WSIZE+3*_EM_PSIZE) #endif ; local space for line-number, ignoremask, filename, stack-break, size, ; and stack-pointer (see the topsave routine) mes 11 lal 0 loi _EM_PSIZE loi _EM_PSIZE ; stack-break or 0 zer _EM_PSIZE cmp zne *1 lxl 0 dch ; local base of caller #ifdef __sparc dch ; because of the extra layer #endif lal 0 loi _EM_PSIZE sti _EM_PSIZE 1 lal 0 loi _EM_PSIZE loi _EM_PSIZE lpb ; convert this local base to an argument base. ; An implementation of a sort of "topsize" EM ; instruction should take a local base, and save ; the whole frame. lor 1 ; stack-break SP sbs _EM_WSIZE ; stack-break-SP ret _EM_WSIZE ; return size of block to be saved end 3*_EM_WSIZE+3*_EM_PSIZE exp $topsave #ifdef __sparc inp $topsave2 pro $topsave,0 mes 11 lal 0 loi 2*_EM_PSIZE cal $topsave2 asp 2*_EM_PSIZE lfr _EM_WSIZE ret _EM_WSIZE end 0 pro $topsave2,0 #else pro $topsave, 0 #endif mes 11 loe 0 lae 4 ; load line number and file name loi _EM_PSIZE lim ; ignore mask lor 0 ; LB lal 0 loi _EM_PSIZE ; stack-break lpb lor 1 sbs _EM_WSIZE loc _EM_WSIZE adu _EM_WSIZE ; gives size dup _EM_WSIZE stl 0 ; save size lor 1 ; SP (the SP BEFORE pushing) lor 1 ; SP (address of stack top to save) lal _EM_PSIZE ; area loi _EM_PSIZE lol 0 ; size bls _EM_WSIZE ; move whole block asp 3*_EM_PSIZE+3*_EM_WSIZE ; remove the lot from the stack loc 1 ret _EM_WSIZE ; return 1 end 0 sv bss _EM_PSIZE,0,0 exp $topload #ifdef __sparc inp $topload1 pro $topload,0 lal 0 loi _EM_PSIZE cal $topload1 asp _EM_PSIZE lfr _EM_WSIZE ret _EM_WSIZE end 0 pro $topload1, 0 #else pro $topload, 0 #endif mes 11 lal 0 loi _EM_PSIZE lae sv sti _EM_PSIZE ; saved parameter lxl 0 2 dup _EM_PSIZE adp -3*_EM_PSIZE lal 0 loi _EM_PSIZE ; compare target SP with current LB to see if we must loi _EM_PSIZE cmp ; find another LB first zgt *1 dch ; just follow dynamic chain to make sure we find ; a legal one bra *2 1 str 0 lae sv loi _EM_PSIZE loi _EM_PSIZE ; load indirect to str 1 ; restore SP asp 0-_EM_PSIZE ; to stop int from complaining about non-existent memory lae sv loi _EM_PSIZE ; source address lor 1 adp _EM_PSIZE ; destination address lae sv loi _EM_PSIZE adp _EM_PSIZE loi _EM_WSIZE ; size of block bls _EM_WSIZE asp _EM_PSIZE+_EM_WSIZE ; drop size + SP str 0 ; restore local base sim ; ignore mask lae 4 sti _EM_PSIZE ste 0 ; line and file loc 0 ret _EM_WSIZE end 0 (* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE random; (* Module: random numbers Author: Ceriel J.H. Jacobs Version: $Header: random.mod,v 1.7 91/03/05 13:47:08 ceriel Exp $ *) FROM Unix IMPORT getpid, time; TYPE index = [1..55]; VAR X: ARRAY index OF CARDINAL; j, k: index; tm: LONGINT; PROCEDURE Random(): CARDINAL; BEGIN IF k-1 <= 0 THEN k := 55; ELSE DEC(k) END; IF j-1 <= 0 THEN j := 55; ELSE DEC(j) END; X[k] := X[k] + X[j]; RETURN X[k] END Random; PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL; BEGIN IF upb <= lwb THEN RETURN lwb; END; RETURN lwb + (Random() MOD (upb - lwb + 1)); END Uniform; PROCEDURE StartSeed(seed: CARDINAL); VAR v: CARDINAL; BEGIN FOR k := 1 TO 55 DO seed := 1297 * seed + 123; X[k] := seed; END; FOR k := 1 TO 15 DO j := tm MOD 55D + 1D; v := X[j]; tm := tm DIV 7D; j := tm MOD 55D + 1D; X[j] := v; tm := tm * 3D; END; k := 1; j := 25; END StartSeed; BEGIN tm := time(NIL); X[1] := tm; StartSeed(CARDINAL(getpid()) * X[1]); END random. /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: range checks for INTEGER, now for array indexing * Author: Ceriel J.H. Jacobs * Version: $Header: rcka.c,v 1.1 91/03/05 11:55:26 ceriel Exp $ */ #include extern TRP(); struct array_descr { int lbound; int n_elts_min_one; unsigned size; }; rcka(descr, indx) struct array_descr *descr; { if (indx < 0 || indx > descr->n_elts_min_one) TRP(EARRAY); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: range checks for INTEGER * Author: Ceriel J.H. Jacobs * Version: $Header: rcki.c,v 1.1 91/03/05 11:55:37 ceriel Exp $ */ #include extern TRP(); struct range_descr { int low, high; }; rcki(descr, val) struct range_descr *descr; { if (val < descr->low || val > descr->high) TRP(ERANGE); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: range checks for LONGINT * Author: Ceriel J.H. Jacobs * Version: $Header: rckil.c,v 1.2 91/03/06 10:19:48 ceriel Exp $ */ #include extern TRP(); struct range_descr { long low, high; }; rckil(descr, val) struct range_descr *descr; long val; { if (val < descr->low || val > descr->high) TRP(ERANGE); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: range checks for CARDINAL * Author: Ceriel J.H. Jacobs * Version: $Header: rcku.c,v 1.2 91/03/06 10:19:56 ceriel Exp $ */ #include extern TRP(); struct range_descr { unsigned low, high; }; rcku(descr, val) struct range_descr *descr; unsigned val; { if (val < descr->low || val > descr->high) TRP(ERANGE); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: range checks for LONGCARD * Author: Ceriel J.H. Jacobs * Version: $Header: rckul.c,v 1.2 91/03/06 10:20:09 ceriel Exp $ */ #include extern TRP(); struct range_descr { unsigned long low, high; }; rckul(descr, val) struct range_descr *descr; unsigned long val; { if (val < descr->low || val > descr->high) TRP(ERANGE); } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: Mapping of Unix signals to EM traps (only when not using the MON instruction) Author: Ceriel J.H. Jacobs Version: $Header: sigtrp.c,v 1.7 93/11/17 16:27:44 ceriel Exp $ */ #if !defined(__em22) && !defined(__em24) && !defined(__em44) #define EM_trap(n) TRP(n) /* define to whatever is needed to cause the trap */ #include #include int __signo; static int __traps[] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, }; static void __ctchsig(signo) { signal(signo,__ctchsig); #ifdef __BSD4_2 sigsetmask(sigblock(0) & ~(1<<(signo - 1))); #endif __signo = signo; EM_trap(__traps[signo]); } int sigtrp(trapno, signo) { /* Let Unix signal signo cause EM trap trapno to occur. If trapno = -2, restore default, If trapno = -3, ignore. Return old trapnumber. Careful, this could be -2 or -3; But return value of -1 indicates failure, with error number in errno. */ extern int errno; void (*ctch)() = __ctchsig; void (*oldctch)(); int oldtrap; if (signo <= 0 || signo >= sizeof(__traps)/sizeof(__traps[0])) { errno = EINVAL; return -1; } if (trapno == -3) ctch = SIG_IGN; else if (trapno == -2) ctch = SIG_DFL; else if (trapno >= 0 && trapno <= 252) ; else { errno = EINVAL; return -1; } oldtrap = __traps[signo]; if ((oldctch = signal(signo, ctch)) == (void (*)())-1) /* errno set by signal */ return -1; else if (oldctch == SIG_IGN) { signal(signo, SIG_IGN); } else __traps[signo] = trapno; return oldtrap; } #endif /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: Dummy priority routines Author: Ceriel J.H. Jacobs Version: $Header: stackprio.c,v 1.4 88/12/02 15:39:59 ceriel Exp $ */ static unsigned prio = 0; stackprio(n) unsigned n; { unsigned old = prio; if (n > prio) prio = n; return old; } unstackprio(n) unsigned n; { prio = n; } /* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Module: store values from stack, byte by byte Author: Ceriel J.H. Jacobs Version: $Header: store.c,v 1.5 90/11/02 14:29:02 ceriel Exp $ */ #include #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #define EM_PSIZE _EM_PSIZE #endif #if EM_WSIZE==EM_PSIZE typedef unsigned pcnt; #else typedef long pcnt; #endif store(siz, addr, p) register char *addr; register pcnt siz; { /* Make sure, that a value with a size that could have been handled by the LOI instruction is handled as if it was loaded with the LOI instruction. */ register char *q = (char *) &p; char t[4]; if (siz < EM_WSIZE && EM_WSIZE % siz == 0) { /* as long as EM_WSIZE <= 4 ... */ if (siz != 2) TRP(M2_INTERNAL); /* internal error */ *((unsigned short *) (&t[0])) = *((unsigned *) q); q = &t[0]; } while (siz--) *addr++ = *q++; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * * Module: CARDINAL operations with overflow checking * Author: Ceriel J.H. Jacobs * Version: $Header: ucheck.c,v 1.3 92/05/11 09:50:21 ceriel Exp $ */ #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #endif #ifndef EM_LSIZE #define EM_LSIZE _EM_LSIZE #endif #include #define MAXCARD ((unsigned)-1) #if EM_WSIZE < EM_LSIZE #define MAXLONGCARD ((unsigned long) -1L) #endif adduchk(a,b) unsigned a,b; { if (MAXCARD - a < b) TRP(M2_UOVFL); } #if EM_WSIZE < EM_LSIZE addulchk(a,b) unsigned long a,b; { if (MAXLONGCARD - a < b) TRP(M2_UOVFL); } #endif muluchk(a,b) unsigned a,b; { if (a != 0 && MAXCARD/a < b) TRP(M2_UOVFL); } #if EM_WSIZE < EM_LSIZE mululchk(a,b) unsigned long a,b; { if (a != 0 && MAXLONGCARD/a < b) TRP(M2_UOVFL); } #endif subuchk(a,b) unsigned a,b; { if (b < a) TRP(M2_UUVFL); } #if EM_WSIZE < EM_LSIZE subulchk(a,b) unsigned long a,b; { if (b < a) TRP(M2_UUVFL); } #endif Q.;..RMakefileSabi.cTabl.cUabr.cVarg.cWass.cXasz.cYatn.cZbcp.c[bts.e\buff.c]catch.c^clock.c_cls.c`cvt.cadiag.cbdis.ccefl.cdeln.ceencaps.efexp.cgfef.ehfif.eiget.cjgto.ekhead_pc.elhlt.cmhol0.enincpt.coini.cplog.cqmdi.crmdl.csnew.ctnfa.cunobuff.cvnotext.cwopn.cxoutcpt.cypac.czpclose.c{pcreat.c|pentry.c}perrno.c~pexit.cpopen.cput.crcka.crdc.crdi.crdl.crdr.crf.crln.crnd.csav.esig.esin.csqt.cstring.ctrap.etrp.e# Makefile for lib/libp. CFLAGS = -O -I../h -wo CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libp.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(abi.o) \ $(LIBRARY)(abl.o) \ $(LIBRARY)(abr.o) \ $(LIBRARY)(arg.o) \ $(LIBRARY)(ass.o) \ $(LIBRARY)(asz.o) \ $(LIBRARY)(atn.o) \ $(LIBRARY)(bcp.o) \ $(LIBRARY)(bts.o) \ $(LIBRARY)(buff.o) \ $(LIBRARY)(catch.o) \ $(LIBRARY)(clock.o) \ $(LIBRARY)(cls.o) \ $(LIBRARY)(cvt.o) \ $(LIBRARY)(diag.o) \ $(LIBRARY)(dis.o) \ $(LIBRARY)(efl.o) \ $(LIBRARY)(eln.o) \ $(LIBRARY)(encaps.o) \ $(LIBRARY)(exp.o) \ $(LIBRARY)(fef.o) \ $(LIBRARY)(fif.o) \ $(LIBRARY)(get.o) \ $(LIBRARY)(gto.o) \ $(LIBRARY)(head_pc.o) \ $(LIBRARY)(hlt.o) \ $(LIBRARY)(hol0.o) \ $(LIBRARY)(incpt.o) \ $(LIBRARY)(ini.o) \ $(LIBRARY)(log.o) \ $(LIBRARY)(mdi.o) \ $(LIBRARY)(mdl.o) \ $(LIBRARY)(new.o) \ $(LIBRARY)(nfa.o) \ $(LIBRARY)(nobuff.o) \ $(LIBRARY)(notext.o) \ $(LIBRARY)(opn.o) \ $(LIBRARY)(outcpt.o) \ $(LIBRARY)(pac.o) \ $(LIBRARY)(pclose.o) \ $(LIBRARY)(pcreat.o) \ $(LIBRARY)(pentry.o) \ $(LIBRARY)(perrno.o) \ $(LIBRARY)(pexit.o) \ $(LIBRARY)(popen.o) \ $(LIBRARY)(put.o) \ $(LIBRARY)(rcka.o) \ $(LIBRARY)(rdc.o) \ $(LIBRARY)(rdi.o) \ $(LIBRARY)(rdl.o) \ $(LIBRARY)(rdr.o) \ $(LIBRARY)(rf.o) \ $(LIBRARY)(rln.o) \ $(LIBRARY)(rnd.o) \ $(LIBRARY)(sav.o) \ $(LIBRARY)(sig.o) \ $(LIBRARY)(sin.o) \ $(LIBRARY)(sqt.o) \ $(LIBRARY)(string.o) \ $(LIBRARY)(trap.o) \ $(LIBRARY)(trp.o) \ $(LIBRARY)(unp.o) \ $(LIBRARY)(uread.o) \ $(LIBRARY)(uwrite.o) \ $(LIBRARY)(wdw.o) \ $(LIBRARY)(wf.o) \ $(LIBRARY)(wrc.o) \ $(LIBRARY)(wrf.o) \ $(LIBRARY)(wri.o) \ $(LIBRARY)(wrl.o) \ $(LIBRARY)(wrr.o) \ $(LIBRARY)(wrs.o) \ $(LIBRARY)(wrz.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(abi.o): abi.c $(CC1) abi.c $(LIBRARY)(abl.o): abl.c $(CC1) abl.c $(LIBRARY)(abr.o): abr.c $(CC1) abr.c $(LIBRARY)(arg.o): arg.c $(CC1) arg.c $(LIBRARY)(ass.o): ass.c $(CC1) ass.c $(LIBRARY)(asz.o): asz.c $(CC1) asz.c $(LIBRARY)(atn.o): atn.c $(CC1) atn.c $(LIBRARY)(bcp.o): bcp.c $(CC1) bcp.c $(LIBRARY)(bts.o): bts.e $(CC1) bts.e $(LIBRARY)(buff.o): buff.c $(CC1) buff.c $(LIBRARY)(catch.o): catch.c $(CC1) catch.c $(LIBRARY)(clock.o): clock.c $(CC1) clock.c $(LIBRARY)(cls.o): cls.c $(CC1) cls.c $(LIBRARY)(cvt.o): cvt.c $(CC1) cvt.c $(LIBRARY)(diag.o): diag.c $(CC1) diag.c $(LIBRARY)(dis.o): dis.c $(CC1) dis.c $(LIBRARY)(efl.o): efl.c $(CC1) efl.c $(LIBRARY)(eln.o): eln.c $(CC1) eln.c $(LIBRARY)(encaps.o): encaps.e $(CC1) encaps.e $(LIBRARY)(exp.o): exp.c $(CC1) exp.c $(LIBRARY)(fef.o): fef.e $(CC1) fef.e $(LIBRARY)(fif.o): fif.e $(CC1) fif.e $(LIBRARY)(get.o): get.c $(CC1) get.c $(LIBRARY)(gto.o): gto.e $(CC1) gto.e $(LIBRARY)(head_pc.o): head_pc.e $(CC1) head_pc.e $(LIBRARY)(hlt.o): hlt.c $(CC1) hlt.c $(LIBRARY)(hol0.o): hol0.e $(CC1) hol0.e $(LIBRARY)(incpt.o): incpt.c $(CC1) incpt.c $(LIBRARY)(ini.o): ini.c $(CC1) ini.c $(LIBRARY)(log.o): log.c $(CC1) log.c $(LIBRARY)(mdi.o): mdi.c $(CC1) mdi.c $(LIBRARY)(mdl.o): mdl.c $(CC1) mdl.c $(LIBRARY)(new.o): new.c $(CC1) new.c $(LIBRARY)(nfa.o): nfa.c $(CC1) nfa.c $(LIBRARY)(nobuff.o): nobuff.c $(CC1) nobuff.c $(LIBRARY)(notext.o): notext.c $(CC1) notext.c $(LIBRARY)(opn.o): opn.c $(CC1) opn.c $(LIBRARY)(outcpt.o): outcpt.c $(CC1) outcpt.c $(LIBRARY)(pac.o): pac.c $(CC1) pac.c $(LIBRARY)(pclose.o): pclose.c $(CC1) pclose.c $(LIBRARY)(pcreat.o): pcreat.c $(CC1) pcreat.c $(LIBRARY)(pentry.o): pentry.c $(CC1) pentry.c $(LIBRARY)(perrno.o): perrno.c $(CC1) perrno.c $(LIBRARY)(pexit.o): pexit.c $(CC1) pexit.c $(LIBRARY)(popen.o): popen.c $(CC1) popen.c $(LIBRARY)(put.o): put.c $(CC1) put.c $(LIBRARY)(rcka.o): rcka.c $(CC1) rcka.c $(LIBRARY)(rdc.o): rdc.c $(CC1) rdc.c $(LIBRARY)(rdi.o): rdi.c $(CC1) rdi.c $(LIBRARY)(rdl.o): rdl.c $(CC1) rdl.c $(LIBRARY)(rdr.o): rdr.c $(CC1) rdr.c $(LIBRARY)(rf.o): rf.c $(CC1) rf.c $(LIBRARY)(rln.o): rln.c $(CC1) rln.c $(LIBRARY)(rnd.o): rnd.c $(CC1) rnd.c $(LIBRARY)(sav.o): sav.e $(CC1) sav.e $(LIBRARY)(sig.o): sig.e $(CC1) sig.e $(LIBRARY)(sin.o): sin.c $(CC1) sin.c $(LIBRARY)(sqt.o): sqt.c $(CC1) sqt.c $(LIBRARY)(string.o): string.c $(CC1) string.c $(LIBRARY)(trap.o): trap.e $(CC1) trap.e $(LIBRARY)(trp.o): trp.e $(CC1) trp.e $(LIBRARY)(unp.o): unp.c $(CC1) unp.c $(LIBRARY)(uread.o): uread.c $(CC1) uread.c $(LIBRARY)(uwrite.o): uwrite.c $(CC1) uwrite.c $(LIBRARY)(wdw.o): wdw.c $(CC1) wdw.c $(LIBRARY)(wf.o): wf.c $(CC1) wf.c $(LIBRARY)(wrc.o): wrc.c $(CC1) wrc.c $(LIBRARY)(wrf.o): wrf.c $(CC1) wrf.c $(LIBRARY)(wri.o): wri.c $(CC1) wri.c $(LIBRARY)(wrl.o): wrl.c $(CC1) wrl.c $(LIBRARY)(wrr.o): wrr.c $(CC1) wrr.c $(LIBRARY)(wrs.o): wrs.c $(CC1) wrs.c $(LIBRARY)(wrz.o): wrz.c $(CC1) wrz.c /* $Header: abi.c,v 2.1 84/07/20 11:02:41 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ int _abi(i) int i; { return(i>=0 ? i : -i); } /* $Header: abl.c,v 2.1 84/07/20 11:02:43 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ long _abl(i) long i; { return(i>=0 ? i : -i); } /* $Header: abr.c,v 2.1 84/07/20 11:02:46 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ double _abr(r) double r; { return(r>=0 ? r : -r); } /* $Header: arg.c,v 2.2 90/11/06 12:57:47 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ /* function argc:integer; extern; */ /* function argv(i:integer):string; extern; */ /* procedure argshift; extern; */ /* function environ(i:integer):string; extern; */ extern int _pargc; extern char **_pargv; extern char ***_penviron; int argc() { return(_pargc); } char *argv(i) { if (i >= _pargc) return(0); return(_pargv[i]); } argshift() { if (_pargc > 1) { --_pargc; _pargv++; } } char *environ(i) { char **p; char *q; if (p = *_penviron) while (q = *p++) if (i-- < 0) return(q); return(0); } /* $Header: ass.c,v 2.1 84/07/20 11:02:58 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern char *_hol0(); extern _trp(); _ass(line,bool) int line,bool; { if (bool==0) { LINO = line; _trp(EASS); } } /* $Header: asz.c,v 2.1 84/07/20 11:03:00 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ struct descr { int low; int diff; int size; }; int _asz(dp) struct descr *dp; { return(dp->size * (dp->diff + 1)); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: atn.c,v 2.6 90/11/06 12:58:05 ceriel Exp $ */ #define __NO_DEFS #include #if __STDC__ #include #endif double _atn(x) double x; { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { -0.13688768894191926929e+2, -0.20505855195861651981e+2, -0.84946240351320683534e+1, -0.83758299368150059274e+0 }; static double q[] = { 0.41066306682575781263e+2, 0.86157349597130242515e+2, 0.59578436142597344465e+2, 0.15024001160028576121e+2, 1.0 }; static double a[] = { 0.0, 0.52359877559829887307710723554658381, /* pi/6 */ M_PI_2, 1.04719755119659774615421446109316763 /* pi/3 */ }; int neg = x < 0; int n; double g; if (neg) { x = -x; } if (x > 1.0) { x = 1.0/x; n = 2; } else n = 0; if (x > 0.26794919243112270647) { /* 2-sqtr(3) */ n = n + 1; x = (((0.73205080756887729353*x-0.5)-0.5)+x)/ (1.73205080756887729353+x); } /* ??? avoid underflow ??? */ g = x * x; x += x * g * POLYNOM3(g, p) / POLYNOM4(g, q); if (n > 1) x = -x; x += a[n]; return neg ? -x : x; } /* $Header: bcp.c,v 2.2 87/05/19 08:51:48 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ int _bcp(sz,y,x) int sz; unsigned char *y,*x; { while (--sz >= 0) { if (*x < *y) return(-1); if (*x++ > *y++) return(1); } return(0); } # ; $Header: bts.e,v 2.1 84/07/20 11:03:07 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; ; Author: J.W. Stevenson */ mes 2,_EM_WSIZE,_EM_PSIZE #define SIZE 0 #define HIGH _EM_WSIZE #define LOWB 2*_EM_WSIZE #define BASE 3*_EM_WSIZE ; _bts is called with four parameters: ; - the initial set (BASE) ; - low bound of range of bits (LOWB) ; - high bound of range of bits (HIGH) ; - set size in bytes (SIZE) exp $_bts pro $_bts,0 lal BASE ; address of initial set lol SIZE los _EM_WSIZE ; load initial set 1 lol LOWB ; low bound lol HIGH ; high bound bgt *2 ; while low <= high lol LOWB lol SIZE set ? ; create [low] lol SIZE ior ? ; merge with initial set inl LOWB ; increment low bound bra *1 ; loop back 2 lal BASE lol SIZE sts _EM_WSIZE ; store result over initial set ret 0 end ? /* $Header: buff.c,v 2.2 89/05/03 09:50:17 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _flush(); /* procedure buff(var f:file of ?); */ buff(f) struct file *f; { int sz; if ((f->flags & (0377|WRBIT)) != (MAGIC|WRBIT)) return; _flush(f); sz = f->size; f->count = f->buflen = (sz>PC_BUFLEN ? sz : PC_BUFLEN-PC_BUFLEN%sz); } /* $Header: catch.c,v 2.8 91/04/23 09:35:06 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include #include /* to make it easier to patch ... */ extern struct file *_curfil; static struct errm { int errno; char *errmes; } errors[] = { { EARRAY, "array bound error"}, { ERANGE, "range bound error"}, { ESET, "set bound error"}, { EIOVFL, "integer overflow"}, { EFOVFL, "real overflow"}, { EFUNFL, "real underflow"}, { EIDIVZ, "divide by 0"}, { EFDIVZ, "divide by 0.0"}, { EIUND, "undefined integer"}, { EFUND, "undefined real"}, { ECONV, "conversion error"}, { ESTACK, "stack overflow"}, { EHEAP, "heap overflow"}, { EILLINS, "illegal instruction"}, { EODDZ, "illegal size argument"}, { ECASE, "case error"}, { EMEMFLT, "addressing non existent memory"}, { EBADPTR, "bad pointer used"}, { EBADPC, "program counter out of range"}, { EBADLAE, "bad argument of lae"}, { EBADMON, "bad monitor call"}, { EBADLIN, "argument if LIN too high"}, { EBADGTO, "GTO descriptor error"}, { EARGC, "more args expected" }, { EEXP, "error in exp" }, { ELOG, "error in ln" }, { ESQT, "error in sqrt" }, { EASS, "assertion failed" }, { EPACK, "array bound error in pack" }, { EUNPACK, "array bound error in unpack" }, { EMOD, "only positive j in 'i mod j'" }, { EBADF, "file not yet open" }, { EFREE, "dispose error" }, { EFUNASS, "function not assigned" }, { EWIDTH, "illegal field width" }, { EWRITEF, "not writable" }, { EREADF, "not readable" }, { EEOF, "end of file" }, { EFTRUNC, "truncated" }, { ERESET, "reset error" }, { EREWR, "rewrite error" }, { ECLOSE, "close error" }, { EREAD, "read error" }, { EWRITE, "write error" }, { EDIGIT, "digit expected" }, { EASCII, "non-ASCII char read" }, { -1, 0} }; extern int _pargc; extern char **_pargv; extern char ***_penviron; extern char *_hol0(); extern _trp(); extern _exit(); extern int _write(); _catch(erno) unsigned erno; { register struct errm *ep = &errors[0]; char *p,*q,*s,**qq; char buf[20]; unsigned i; int j = erno; char *pp[11]; char xbuf[100]; qq = pp; if (p = FILN) *qq++ = p; else *qq++ = _pargv[0]; while (ep->errno != erno && ep->errmes != 0) ep++; p = buf; s = xbuf; if (i = LINO) { *qq++ = ", "; do *p++ = i % 10 + '0'; while (i /= 10); while (p > buf) *s++ = *--p; } *s++ = ':'; *s++ = ' '; *s++ = '\0'; *qq++ = xbuf; if ((erno & ~037) == 0140 && (_curfil->flags&0377)==MAGIC) { /* file error */ *qq++ = "file "; *qq++ = _curfil->fname; *qq++ = ": "; } if (ep->errmes) *qq++ = ep->errmes; else { *qq++ = "error number "; *qq++ = s; p = buf; if (j < 0) { j = -j; *s++ = '-'; } do *p++ = j % 10 + '0'; while (j /= 10); while (p > buf) *s++ = *--p; *s = 0; } *qq++ = "\n"; *qq = 0; qq = pp; while (q = *qq++) { p = q; while (*p) p++; if (_write(2,q,(int)(p-q)) < 0) ; } _exit(erno); error: _trp(erno); } /* $Header: clock.c,v 2.4 91/02/22 16:56:00 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ /* function clock:integer; extern; */ extern int _times(); struct tbuf { long utime; long stime; long cutime; long cstime; }; #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #endif int clock() { struct tbuf t; _times(&t); return( (int)(t.utime + t.stime) & #if EM_WSIZE <= 2 077777 #else 0x7fffffffL #endif ); } /* $Header: cls.c,v 2.2 91/02/22 16:56:10 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern struct file *_curfil; extern _trp(); extern _flush(); extern _outcpt(); extern int _close(); _xcls(f) struct file *f; { if ((f->flags & WRBIT) == 0) return; if ((f->flags & (TXTBIT|ELNBIT)) == TXTBIT) { #ifdef CPM *f->ptr = '\r'; _outcpt(f); #endif *f->ptr = '\n'; _outcpt(f); } _flush(f); } _cls(f) struct file *f; { #ifdef MAYBE char *p; #endif _curfil = f; if ((f->flags&0377) != MAGIC) return; #ifdef MAYBE p = f->bufadr; if (f->ptr < p) return; if (f->buflen <= 0) return; p += f->buflen; if (f->ptr >= p) return; #endif _xcls(f); if (_close(f->ufd) != 0) _trp(ECLOSE); f->flags = 0; } /* $Header: cvt.c,v 2.5 91/03/20 11:30:10 ceriel Exp $ */ #ifndef NOFLOAT #if __STDC__ #include #else #include #define DBL_MAX M_MAX_D #endif static char *cvt(); #define NDIGITS 128 char * _ecvt(value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { return cvt(value, ndigit, decpt, sign, 1); } char * _fcvt(value, ndigit, decpt, sign) double value; int ndigit, *decpt, *sign; { return cvt(value, ndigit, decpt, sign, 0); } static struct powers_of_10 { double pval; double rpval; int exp; } p10[] = { 1.0e32, 1.0e-32, 32, 1.0e16, 1.0e-16, 16, 1.0e8, 1.0e-8, 8, 1.0e4, 1.0e-4, 4, 1.0e2, 1.0e-2, 2, 1.0e1, 1.0e-1, 1, 1.0e0, 1.0e0, 0 }; static char * cvt(value, ndigit, decpt, sign, ecvtflag) double value; int ndigit, *decpt, *sign; { static char buf[NDIGITS+1]; register char *p = buf; register char *pe; if (ndigit < 0) ndigit = 0; if (ndigit > NDIGITS) ndigit = NDIGITS; pe = &buf[ndigit]; buf[0] = '\0'; *sign = 0; if (value < 0) { *sign = 1; value = -value; } *decpt = 0; if (value >= DBL_MAX) { value = DBL_MAX; } if (value != 0.0) { register struct powers_of_10 *pp = &p10[0]; if (value >= 10.0) do { while (value >= pp->pval) { value *= pp->rpval; *decpt += pp->exp; } } while ((++pp)->exp > 0); pp = &p10[0]; if (value < 1.0) do { while (value * pp->pval < 10.0) { value *= pp->pval; *decpt -= pp->exp; } } while ((++pp)->exp > 0); (*decpt)++; /* because now value in [1.0, 10.0) */ } if (! ecvtflag) { /* for fcvt() we need ndigit digits behind the dot */ pe += *decpt; if (pe > &buf[NDIGITS]) pe = &buf[NDIGITS]; } while (p <= pe) { *p++ = (int)value + '0'; value = 10.0 * (value - (int)value); } if (pe >= buf) { p = pe; *p += 5; /* round of at the end */ while (*p > '9') { *p = '0'; if (p > buf) ++*--p; else { *p = '1'; ++*decpt; if (! ecvtflag) { /* maybe add another digit at the end, because the point was shifted right */ if (pe > buf) *pe = '0'; pe++; } } } *pe = '\0'; } return buf; } #endif /* $Header: diag.c,v 2.1 84/07/20 11:00:54 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include /* procedure diag(var f:text); */ diag(f) struct file *f; { f->ptr = f->bufadr; f->flags = WRBIT|EOFBIT|ELNBIT|TXTBIT|MAGIC; f->fname = "DIAG"; f->ufd = 2; f->size = 1; f->count = 1; f->buflen = 1; } /* $Header: dis.c,v 2.1 84/07/20 11:03:16 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #define assert() /* nothing */ /* * use circular list of free blocks from low to high addresses * _highp points to free block with highest address */ struct adm { struct adm *next; int size; }; extern struct adm *_lastp; extern struct adm *_highp; extern _trp(); static int merge(p1,p2) struct adm *p1,*p2; { struct adm *p; p = (struct adm *)((char *)p1 + p1->size); if (p > p2) _trp(EFREE); if (p != p2) return(0); p1->size += p2->size; p1->next = p2->next; return(1); } _dis(n,pp) int n; struct adm **pp; { struct adm *p1,*p2; /* * NOTE: dispose only objects whose size is a multiple of sizeof(*pp). * this is always true for objects allocated by _new() */ n = ((n+sizeof(*p1)-1) / sizeof(*p1)) * sizeof(*p1); if (n == 0) return; if ((p1= *pp) == (struct adm *) 0) _trp(EFREE); p1->size = n; if ((p2 = _highp) == 0) /*p1 is the only free block*/ p1->next = p1; else { if (p2 > p1) { /*search for the preceding free block*/ if (_lastp < p1) /*reduce search*/ p2 = _lastp; while (p2->next < p1) p2 = p2->next; } /* if p2 preceeds p1 in the circular list, * try to merge them */ p1->next = p2->next; p2->next = p1; if (p2 <= p1 && merge(p2,p1)) p1 = p2; p2 = p1->next; /* p1 preceeds p2 in the circular list */ if (p2 > p1) merge(p1,p2); } if (p1 >= p1->next) _highp = p1; _lastp = p1; *pp = (struct adm *) 0; } /* $Header: efl.c,v 2.1 84/07/20 11:01:45 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern struct file *_curfil; extern _trp(); extern _incpt(); int _efl(f) struct file *f; { _curfil = f; if ((f->flags & 0377) != MAGIC) _trp(EBADF); if ((f->flags & (WINDOW|WRBIT|EOFBIT)) == 0) _incpt(f); return((f->flags & EOFBIT) != 0); } /* $Header: eln.c,v 2.1 84/07/20 11:01:48 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _trp(); extern _rf(); int _eln(f) struct file *f; { _rf(f); if (f->flags & EOFBIT) _trp(EEOF); return((f->flags & ELNBIT) != 0); } # ; $Header: encaps.e,v 2.1 84/07/20 11:00:42 sater Stab $ ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; mes 2,_EM_WSIZE,_EM_PSIZE ; procedure encaps(procedure p; procedure(q(n:integer)); ; {call q if a trap occurs during the execution of p} ; {if q returns, continue execution of p} inp $handler #define PIISZ 2*_EM_PSIZE #define PARG 0 #define QARG PIISZ #define E_ELB 0-_EM_PSIZE #define E_EHA -2*_EM_PSIZE ; encaps is called with two parameters: ; - procedure instance identifier of q (QARG) ; - procedure instance identifier of p (PARG) ; and two local variables: ; - the lb of the previous encaps (E_ELB) ; - the procedure identifier of the previous handler (E_EHA) ; ; One static variable: ; - the lb of the currently active encaps (enc_lb) enc_lb bss _EM_PSIZE,0,0 exp $encaps pro $encaps,PIISZ ; save lb of previous encaps lae enc_lb loi _EM_PSIZE lal E_ELB sti _EM_PSIZE ; set new lb lxl 0 lae enc_lb sti _EM_PSIZE ; save old handler id while setting up the new handler lpi $handler sig lal E_EHA sti _EM_PSIZE ; handler is ready, p can be called ; p doesn't expect parameters except possibly the static link ; always passing the link won't hurt lal PARG loi PIISZ cai asp _EM_PSIZE ; reinstate old handler lal E_ELB loi _EM_PSIZE lae enc_lb sti _EM_PSIZE lal E_EHA loi _EM_PSIZE sig asp _EM_PSIZE ret 0 end ? #define TRAP 0 #define H_ELB 0-_EM_PSIZE ; handler is called with one parameter: ; - trap number (TRAP) ; one local variable ; - the current LB of the enclosing encaps (H_ELB) pro $handler,_EM_PSIZE ; save LB of nearest encaps lae enc_lb loi _EM_PSIZE lal H_ELB sti _EM_PSIZE ; fetch setting for previous encaps via LB of nearest lal H_ELB loi _EM_PSIZE adp E_ELB loi _EM_PSIZE ; LB of previous encaps lae enc_lb sti _EM_PSIZE lal H_ELB loi _EM_PSIZE adp E_EHA loi _EM_PSIZE ; previous handler sig asp _EM_PSIZE ; previous handler is re-instated, time to call Q lol TRAP ; the one and only real parameter lal H_ELB loi _EM_PSIZE lpb ; argument base of enclosing encaps adp QARG loi PIISZ exg _EM_PSIZE dup _EM_PSIZE ; The static link is now on top zer _EM_PSIZE cmp zeq *1 ; non-zero LB exg _EM_PSIZE cai asp _EM_WSIZE+_EM_PSIZE bra *2 1 ; zero LB asp _EM_PSIZE cai asp _EM_WSIZE 2 ; now reinstate handler for continued execution of p lal H_ELB loi _EM_PSIZE lae enc_lb sti _EM_PSIZE lpi $handler sig asp _EM_PSIZE rtt end ? /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: exp.c,v 2.10 91/09/17 16:38:16 ceriel Exp $ */ #define __NO_DEFS #include #include extern _trp(); #if __STDC__ #include #include #define M_MIN_D DBL_MIN #define M_MAX_D DBL_MAX #define M_DMINEXP DBL_MIN_EXP #endif #undef HUGE #define HUGE 1e1000 static double Ldexp(fl,exp) double fl; int exp; { extern double _fef(); int sign = 1; int currexp; if (fl<0) { fl = -fl; sign = -1; } fl = _fef(fl,&currexp); exp += currexp; if (exp > 0) { while (exp>30) { fl *= (double) (1L << 30); exp -= 30; } fl *= (double) (1L << exp); } else { while (exp<-30) { fl /= (double) (1L << 30); exp += 30; } fl /= (double) (1L << -exp); } return sign * fl; } double _exp(x) double x; { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { 0.25000000000000000000e+0, 0.75753180159422776666e-2, 0.31555192765684646356e-4 }; static double q[] = { 0.50000000000000000000e+0, 0.56817302698551221787e-1, 0.63121894374398503557e-3, 0.75104028399870046114e-6 }; double xn, g; int n; int negative = x < 0; if (x <= M_LN_MIN_D) { g = M_MIN_D/4.0; if (g != 0.0) { /* unnormalized numbers apparently exist */ if (x < (M_LN2 * (M_DMINEXP - 53))) return 0.0; } else { if (x < M_LN_MIN_D) return 0.0; return M_MIN_D; } } if (x >= M_LN_MAX_D) { if (x > M_LN_MAX_D) { _trp(EEXP); return HUGE; } return M_MAX_D; } if (negative) x = -x; n = x * M_LOG2E + 0.5; /* 1/ln(2) = log2(e), 0.5 added for rounding */ xn = n; { double x1 = (long) x; double x2 = x - x1; g = ((x1-xn*0.693359375)+x2) - xn*(-2.1219444005469058277e-4); } if (negative) { g = -g; n = -n; } xn = g * g; x = g * POLYNOM2(xn, p); n += 1; return (Ldexp(0.5 + x/(POLYNOM3(xn, q) - x), n)); } # ; $Header: fef.e,v 2.2 84/07/20 11:20:00 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE #define FARG 0 #define ERES _EM_DSIZE ; _fef is called with two parameters: ; - address of exponent result (ERES) ; - floating point number to be split (FARG) ; and returns an _EM_DSIZE-byte floating point number exp $_fef pro $_fef,0 lal FARG loi _EM_DSIZE fef _EM_DSIZE lal ERES loi _EM_PSIZE sti _EM_WSIZE ret _EM_DSIZE end ? # ; $Header: fif.e,v 2.2 84/07/20 11:20:02 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE #define ARG1 0 #define ARG2 _EM_DSIZE #define IRES 2*_EM_DSIZE ; _fif is called with three parameters: ; - address of integer part result (IRES) ; - float two (ARG2) ; - float one (ARG1) ; and returns an _EM_DSIZE-byte floating point number exp $_fif pro $_fif,0 lal 0 loi 2*_EM_DSIZE fif _EM_DSIZE lal IRES loi _EM_PSIZE sti _EM_DSIZE ret _EM_DSIZE end ? /* $Header: get.c,v 2.2 84/07/20 11:19:45 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include extern _rf(); extern _trp(); _get(f) struct file *f; { _rf(f); if (f->flags&EOFBIT) _trp(EEOF); f->flags &= ~WINDOW; } # ; $Header: gto.e,v 2.1 84/07/20 11:03:10 sater Stab $ ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; /* Author: J.W. Stevenson */ mes 2,_EM_WSIZE,_EM_PSIZE #define TARLB 0 #define DESCR _EM_PSIZE #define NEWPC 0 #define SAVSP _EM_PSIZE #define D_PC 0 #define D_SP _EM_PSIZE #define D_LB _EM_PSIZE+_EM_PSIZE #define LOCLB 0-_EM_PSIZE ; _gto is called with two arguments: ; - pointer to the label descriptor (DESCR) ; - local base (LB) of target procedure (TARLB) ; the label descriptor contains two items: ; - label address i.e. new PC (NEWPC) ; - offset in target procedure frame (SAVSP) ; using this offset and the LB of the target procedure, the address of ; of local variable of the target procedure is constructed. ; the target procedure must have stored the correct target SP there. descr bss 3*_EM_PSIZE,0,0 exp $_gto pro $_gto,_EM_PSIZE lal DESCR loi _EM_PSIZE adp NEWPC loi _EM_PSIZE lae descr+D_PC sti _EM_PSIZE lal TARLB loi _EM_PSIZE zer _EM_PSIZE cmp zeq *1 lal TARLB loi _EM_PSIZE bra *2 1 lae _m_lb loi _EM_PSIZE 2 lal LOCLB sti _EM_PSIZE lal LOCLB loi _EM_PSIZE lal DESCR loi _EM_PSIZE adp SAVSP loi _EM_WSIZE ; or _EM_PSIZE ? ads _EM_WSIZE ; or _EM_PSIZE ? loi _EM_PSIZE lae descr+D_SP sti _EM_PSIZE lal LOCLB loi _EM_PSIZE lae descr+D_LB sti _EM_PSIZE gto descr end ? # ; $Header: head_pc.e,v 2.1 84/07/20 11:25:18 sater Stab $ mes 2,_EM_WSIZE,_EM_PSIZE /* $Header: hlt.c,v 2.3 91/02/22 16:56:19 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern struct file **_extfl; extern int _extflc; extern _cls(); extern _exit(); _hlt(ecode) int ecode; { int i; for (i = 0; i < _extflc; i++) if (_extfl[i] != (struct file *) 0) _cls(_extfl[i]); _exit(ecode); } # ; $Header: hol0.e,v 2.2 84/07/20 11:20:12 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE ; _hol0 return the address of the ABS block (hol0) exp $_hol0 pro $_hol0,0 lae 0 ret _EM_PSIZE end ? /* $Header: incpt.c,v 2.2 91/02/22 16:56:28 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include #define EINTR 4 extern int errno; extern _trp(); extern int _read(); _incpt(f) struct file *f; { if (f->flags & EOFBIT) _trp(EEOF); f->flags |= WINDOW; f->flags &= ~ELNBIT; #ifdef CPM do { #endif f->ptr += f->size; if (f->count == 0) { f->ptr = f->bufadr; for(;;) { f->count=_read(f->ufd,f->bufadr,f->buflen); if ( f->count<0 ) { if (errno != EINTR) _trp(EREAD) ; continue ; } break ; } if (f->count == 0) { f->flags |= EOFBIT; *f->ptr = '\0'; return; } } if ((f->count -= f->size) < 0) _trp(EFTRUNC); #ifdef CPM } while ((f->flags&TXTBIT) && *f->ptr == '\r'); #endif if (f->flags & TXTBIT) { if (*f->ptr & 0200) _trp(EASCII); if (*f->ptr == '\n') { f->flags |= ELNBIT; *f->ptr = ' '; } #ifdef CPM if (*f->ptr == 26) { f->flags |= EOFBIT; *f->ptr = 0; } #endif } } /* $Header: ini.c,v 2.5 91/03/06 14:20:09 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern (*_sig())(); extern _catch(); #ifndef CPM extern int _isatty(); #endif struct file **_extfl; int _extflc; /* number of external files */ char *_m_lb; /* LB of _m_a_i_n */ struct file *_curfil; /* points to file struct in case of errors */ int _pargc; char **_pargv; char ***_penviron; int _fp_hook = 1; /* This is for Minix, but does not harm others */ _ini(args,c,p,mainlb) char *args,*mainlb; int c; struct file **p; { struct file *f; char buf[128]; _pargc= *(int *)args; args += sizeof (int); _pargv= *(char ***)args; _sig(_catch); _extfl = p; _extflc = c; if( !c ) return; _m_lb = mainlb; if ( (f = _extfl[0]) != (struct file *) 0) { f->ptr = f->bufadr; f->flags = MAGIC|TXTBIT; f->fname = "INPUT"; f->ufd = 0; f->size = 1; f->count = 0; f->buflen = PC_BUFLEN; } if ( (f = _extfl[1]) != (struct file *) 0) { f->ptr = f->bufadr; f->flags = MAGIC|TXTBIT|WRBIT|EOFBIT|ELNBIT; f->fname = "OUTPUT"; f->ufd = 1; f->size = 1; #ifdef CPM f->count = 1; #else f->count = (_isatty(1) ? 1 : PC_BUFLEN); #endif f->buflen = f->count; } } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: log.c,v 2.7 91/03/20 11:30:24 ceriel Exp $ */ #define __NO_DEFS #include #include #if __STDC__ #include #include #endif #undef HUGE #define HUGE 1e1000 double _log(x) double x; { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double a[] = { -0.64124943423745581147e2, 0.16383943563021534222e2, -0.78956112887491257267e0 }; static double b[] = { -0.76949932108494879777e3, 0.31203222091924532844e3, -0.35667977739034646171e2, 1.0 }; extern double _fef(); double znum, zden, z, w; int exponent; if (x <= 0) { _trp(ELOG); return -HUGE; } x = _fef(x, &exponent); if (x > M_1_SQRT2) { znum = (x - 0.5) - 0.5; zden = x * 0.5 + 0.5; } else { znum = x - 0.5; zden = znum * 0.5 + 0.5; exponent--; } z = znum/zden; w = z * z; x = z + z * w * (POLYNOM2(w,a)/POLYNOM3(w,b)); z = exponent; x += z * (-2.121944400546905827679e-4); return x + z * 0.693359375; } /* $Header: mdi.c,v 2.3 91/09/25 09:14:08 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _trp(); int _mdi(j,i) int j,i; { if (j <= 0) _trp(EMOD); i = i % j; if (i < 0) i += j; return(i); } long _mdil(j,i) long j,i; { if (j <= 0) _trp(EMOD); i = i % j; if (i < 0) i += j; return(i); } int _dvi(j, i) unsigned int j,i; { int neg = 0; if ((int)j < 0) { j = -(int)j; neg = 1; } if ((int)i < 0) { i = -(int)i; neg = !neg; } i = i / j; if (neg) return -(int)i; return i; } long _dvil(j, i) unsigned long j,i; { int neg = 0; if ((long)j < 0) { j = -(long)j; neg = 1; } if ((long)i < 0) { i = -(long)i; neg = !neg; } i = i / j; if (neg) return -(long)i; return i; } /* $Header: mdl.c,v 2.1 84/07/20 11:02:51 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _trp(); long _mdl(j,i) long j,i; { if (j <= 0) _trp(EMOD); i = i % j; if (i < 0) i += j; return(i); } /* $Header: new.c,v 2.3 90/11/06 12:59:17 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ extern _sav(); extern _rst(); #define assert(x) /* nothing */ #define UNDEF 0x8000 struct adm { struct adm *next; int size; }; struct adm *_lastp = 0; struct adm *_highp = 0; _new(n,pp) int n; struct adm **pp; { struct adm *p,*q; int *ptmp; n = ((n+sizeof(*p)-1) / sizeof(*p)) * sizeof(*p); if ((p = _lastp) != 0) do { q = p->next; if (q->size >= n) { assert(q->size%sizeof(adm) == 0); if ((q->size -= n) == 0) { if (p == q) p = 0; else p->next = q->next; if (q == _highp) _highp = p; } _lastp = p; p = (struct adm *)((char *)q + q->size); q = (struct adm *)((char *)p + n); goto initialize; } p = q; } while (p != _lastp); /*no free block big enough*/ _sav(&p); q = (struct adm *)((char *)p + n); _rst(&q); initialize: *pp = p; ptmp = (int *)p; while (ptmp < (int *)q) *ptmp++ = UNDEF; } /* $Header: nfa.c,v 2.2 90/11/06 12:59:32 ceriel Exp $ */ /* * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Author: Hans van Eck */ #include extern _trp(); _nfa(bool) { if (! bool) _trp(EFUNASS); } /* $Header: nobuff.c,v 2.1 84/07/20 11:00:49 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _flush(); /* procedure nobuff(var f:file of ?); */ nobuff(f) struct file *f; { if ((f->flags & (0377|WRBIT)) != (MAGIC|WRBIT)) return; _flush(f); f->count = f->buflen = f->size; } /* $Header: notext.c,v 2.2 84/07/20 11:19:16 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include notext(f) struct file *f; { f->flags &= ~TXTBIT; } /* $Header: opn.c,v 2.5 91/03/20 13:47:18 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern struct file **_extfl; extern int _extflc; extern struct file *_curfil; extern int _pargc; extern char **_pargv; extern char ***_penviron; extern _cls(); extern _xcls(); extern _trp(); extern int _getpid(); extern int _creat(); extern int _open(); extern int _close(); extern int _unlink(); extern long _lseek(); static int tmpfil() { static char namebuf[] = "/usr/tmp/plf.xxxxx"; int i; char *p,*q; i = _getpid(); p = namebuf; q = p + 13; do *q++ = (i & 07) + '0'; while (i >>= 3); *q = '\0'; if ((i = _creat(p,0644)) < 0) if ((i = _creat(p += 4,0644)) < 0) if ((i = _creat(p += 5,0644)) < 0) goto error; if (_close(i) != 0) goto error; if ((i = _open(p,2)) < 0) goto error; if (_unlink(p) != 0) error: _trp(EREWR); return(i); } static int initfl(descr,sz,f) int descr; int sz; struct file *f; { int i; _curfil = f; if (sz == 0) { sz++; descr |= TXTBIT; } for (i=0; i<_extflc; i++) if (f == _extfl[i]) break; if (i >= _extflc) { /* local file */ f->fname = "LOCAL"; if ((descr & WRBIT) == 0 && (f->flags & 0377) == MAGIC) { _xcls(f); if (_lseek(f->ufd,(long)0,0) == -1) _trp(ERESET); } else { _cls(f); f->ufd = tmpfil(); } } else { /* external file */ if (--i <= 0) return(0); if (i >= _pargc) _trp(EARGC); f->fname = _pargv[i]; _cls(f); if ((descr & WRBIT) == 0) { if ((f->ufd = _open(f->fname,0)) < 0) _trp(ERESET); } else { if ((f->ufd = _creat(f->fname,0644)) < 0) _trp(EREWR); } } f->buflen = (sz>PC_BUFLEN ? sz : PC_BUFLEN-PC_BUFLEN%sz); f->size = sz; f->ptr = f->bufadr; f->flags = descr; return(1); } _opn(sz,f) int sz; struct file *f; { if (initfl(MAGIC,sz,f)) f->count = 0; } _cre(sz,f) int sz; struct file *f; { if (initfl(WRBIT|EOFBIT|ELNBIT|MAGIC,sz,f)) f->count = f->buflen; } /* $Header: outcpt.c,v 2.2 91/02/22 16:56:57 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include #define EINTR 4 extern int errno; extern _trp(); extern int _write(); _flush(f) struct file *f; { int i,n; f->ptr = f->bufadr; n = f->buflen - f->count; if (n <= 0) return; f->count = f->buflen; if ((i = _write(f->ufd,f->bufadr,n)) < 0 && errno == EINTR) return; if (i != n) _trp(EWRITE); } _outcpt(f) struct file *f; { f->flags &= ~ELNBIT; f->ptr += f->size; if ((f->count -= f->size) <= 0) _flush(f); } /* $Header: pac.c,v 2.5 91/02/19 12:12:52 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _trp(); #define assert(x) /* nothing */ #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #endif struct descr { int low; int diff; int size; }; _pac(ad,zd,zp,i,ap) int i; struct descr *ad,*zd; char *zp,*ap; { if (zd->diff > ad->diff || (i -= ad->low) < 0 || (i+zd->diff) > ad->diff) _trp(EPACK); ap += (i * ad->size); i = (zd->diff + 1) * zd->size; if (zd->size == 1) { int *aptmp = (int *)ap; assert(ad->size == EM_WSIZE); while (--i >= 0) *zp++ = *aptmp++; #if EM_WSIZE > 2 } else if (zd->size == 2) { int *aptmp = (int *)ap; short *zptmp = (short *) zp; assert(ad->size == EM_WSIZE); while (--i >= 0) *zptmp++ = *aptmp++; #endif } else { assert(ad->size == zd->size); while (--i >= 0) *zp++ = *ap++; } } /* $Header: pclose.c,v 2.2 84/07/20 11:19:18 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern _cls(); /* procedure pclose(var f:file of ??); */ pclose(f) struct file *f; { _cls(f); } /* $Header: pcreat.c,v 2.3 91/02/22 16:57:06 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _cls(); extern _trp(); extern int _creat(); /* procedure pcreat(var f:text; s:string); */ pcreat(f,s) struct file *f; char *s; { _cls(f); /* initializes _curfil */ f->ptr = f->bufadr; f->flags = WRBIT|EOFBIT|ELNBIT|TXTBIT|MAGIC; f->fname = s; f->size = 1; f->count = PC_BUFLEN; f->buflen = PC_BUFLEN; if ((f->ufd = _creat(s,0644)) < 0) _trp(EREWR); } /* $Header: pentry.c,v 2.2 89/05/03 09:51:41 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern struct file **_extfl; extern _wrs(); extern _wrz(); extern _wln(); procentry(name) char *name; { struct file *f; f = _extfl[1]; _wrs(5,"call ",f); _wrz(name,f); _wln(f); } /* $Header: perrno.c,v 2.2 84/07/20 11:19:21 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* function perrno:integer; extern; */ extern int errno; int perrno() { return(errno); } /* $Header: pexit.c,v 2.3 89/05/03 09:51:55 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern struct file **_extfl; extern _wrs(); extern _wrz(); extern _wln(); procexit(name) char *name; { struct file *f; f = _extfl[1]; _wrs(5,"exit ",f); _wrz(name,f); _wln(f); } /* $Header: popen.c,v 2.3 91/02/22 16:57:15 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _cls(); extern _trp(); extern int _open(); /* procedure popen(var f:text; s:string); */ popen(f,s) struct file *f; char *s; { _cls(f); /* initializes _curfil */ f->ptr = f->bufadr; f->flags = TXTBIT|MAGIC; f->fname = s; f->size = 1; f->count = 0; f->buflen = PC_BUFLEN; if ((f->ufd = _open(s,0)) < 0) _trp(ERESET); } /* $Header: put.c,v 2.2 84/07/20 11:19:47 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern _wf(); extern _outcpt(); _put(f) struct file *f; { _wf(f); _outcpt(f); } /* $Header: rcka.c,v 2.3 91/02/22 16:57:24 ceriel Exp $ */ /* * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Author: Hans van Eck */ #include extern _trp(); struct array_descr { int lbound; unsigned n_elts_min_one; unsigned size; /* doesn't really matter */ }; _rcka(descr, index) struct array_descr *descr; { if( index < descr->lbound || index > (int) descr->n_elts_min_one + descr->lbound ) _trp(EARRAY); } /* $Header: rdc.c,v 2.2 84/07/20 11:19:31 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern _rf(); extern _incpt(); int _rdc(f) struct file *f; { int c; _rf(f); c = *f->ptr; _incpt(f); return(c); } /* $Header: rdi.c,v 2.2 90/11/06 13:00:27 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _trp(); extern _rf(); extern _incpt(); _skipsp(f) struct file *f; { while ((*f->ptr == ' ') || (*f->ptr == '\t')) _incpt(f); } int _getsig(f) struct file *f; { int sign; if ((sign = (*f->ptr == '-')) || *f->ptr == '+') _incpt(f); return(sign); } int _fstdig(f) struct file *f; { int ch; ch = *f->ptr - '0'; if ((unsigned) ch > 9) { _trp(EDIGIT); ch = 0; } return(ch); } int _nxtdig(f) struct file *f; { int ch; _incpt(f); ch = *f->ptr - '0'; if ((unsigned) ch > 9) return(-1); return(ch); } int _getint(f) struct file *f; { int is_signed,i,ch; is_signed = _getsig(f); ch = _fstdig(f); i = 0; do i = i*10 - ch; while ((ch = _nxtdig(f)) >= 0); return(is_signed ? i : -i); } int _rdi(f) struct file *f; { _rf(f); _skipsp(f); return(_getint(f)); } /* $Header: rdl.c,v 2.2 90/11/06 13:00:54 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _rf(); extern _skipsp(); extern int _getsig(); extern int _fstdig(); extern int _nxtdig(); long _rdl(f) struct file *f; { int is_signed,ch; long l; _rf(f); _skipsp(f); is_signed = _getsig(f); ch = _fstdig(f); l = 0; do l = l*10 - ch; while ((ch = _nxtdig(f)) >= 0); return(is_signed ? l : -l); } /* $Header: rdr.c,v 2.2 90/11/06 13:01:18 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #define BIG 1e17 extern _rf(); extern _incpt(); extern _skipsp(); extern int _getsig(); extern int _getint(); extern int _fstdig(); extern int _nxtdig(); static double r; static int pow10; static dig(ch) int ch; { if (r>BIG) pow10++; else r = r*10.0 + ch; } double _rdr(f) struct file *f; { int i; double e; int is_signed,ch; r = 0; pow10 = 0; _rf(f); _skipsp(f); is_signed = _getsig(f); ch = _fstdig(f); do dig(ch); while ((ch = _nxtdig(f)) >= 0); if (*f->ptr == '.') { _incpt(f); ch = _fstdig(f); do { dig(ch); pow10--; } while ((ch = _nxtdig(f)) >= 0); } if ((*f->ptr == 'e') || (*f->ptr == 'E')) { _incpt(f); pow10 += _getint(f); } if ((i = pow10) < 0) i = -i; e = 1.0; while (--i >= 0) e *= 10.0; if (pow10<0) r /= e; else r *= e; return(is_signed? -r : r); } /* $Header: rf.c,v 2.2 84/07/20 11:19:51 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include extern struct file *_curfil; extern _trp(); extern _incpt(); _rf(f) struct file *f; { _curfil = f; if ((f->flags&0377) != MAGIC) _trp(EBADF); if (f->flags & WRBIT) _trp(EREADF); if ((f->flags & WINDOW) == 0) _incpt(f); } /* $Header: rln.c,v 2.2 84/07/20 11:19:33 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern _rf(); extern _incpt(); _rln(f) struct file *f; { _rf(f); while ((f->flags & ELNBIT) == 0) _incpt(f); f->flags &= ~WINDOW; } /* $Header: rnd.c,v 2.2 84/07/20 11:19:58 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ double _rnd(r) double r; { return(r + (r<0 ? -0.5 : 0.5)); } # ; $Header: sav.e,v 2.1 84/07/20 11:03:20 sater Stab $ ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; /* Author: J.W. Stevenson */ mes 2,_EM_WSIZE,_EM_PSIZE #define PTRAD 0 #define HP 2 ; _sav called with one parameter: ; - address of pointer variable (PTRAD) exp $_sav pro $_sav,0 lor HP lal PTRAD loi _EM_PSIZE sti _EM_PSIZE ret 0 end ? ; _rst is called with one parameter: ; - address of pointer variable (PTRAD) exp $_rst pro $_rst,0 lal PTRAD loi _EM_PSIZE loi _EM_PSIZE str HP ret 0 end ? #define PROC 0 ; $Header: sig.e,v 2.3 88/03/15 17:37:19 ceriel Exp $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE ; _sig is called with one parameter: ; - procedure instance identifier (PROC) ; and returns nothing. ; only the procedure identifier inside the PROC is used. exp $_sig pro $_sig,0 lal PROC loi _EM_PSIZE sig asp _EM_PSIZE ret 0 ; ignore the result of sig end ? /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: sin.c,v 2.6 90/11/06 13:01:50 ceriel Exp $ */ #define __NO_DEFS #include #if __STDC__ #include #endif static double sinus(x, cos_flag) double x; { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double r[] = { -0.16666666666666665052e+0, 0.83333333333331650314e-2, -0.19841269841201840457e-3, 0.27557319210152756119e-5, -0.25052106798274584544e-7, 0.16058936490371589114e-9, -0.76429178068910467734e-12, 0.27204790957888846175e-14 }; double xsqr; double y; int neg = 0; if (x < 0) { x = -x; neg = 1; } if (cos_flag) { neg = 0; y = M_PI_2 + x; } else y = x; /* ??? avoid loss of significance, if y is too large, error ??? */ y = y * M_1_PI + 0.5; /* Use extended precision to calculate reduced argument. Here we used 12 bits of the mantissa for a1. Also split x in integer part x1 and fraction part x2. */ #define A1 3.1416015625 #define A2 -8.908910206761537356617e-6 { double x1, x2; extern double _fif(); _fif(y, 1.0, &y); if (_fif(y, 0.5, &x1)) neg = !neg; if (cos_flag) y -= 0.5; x2 = _fif(x, 1.0, &x1); x = x1 - y * A1; x += x2; x -= y * A2; #undef A1 #undef A2 } if (x < 0) { neg = !neg; x = -x; } /* ??? avoid underflow ??? */ y = x * x; x += x * y * POLYNOM7(y, r); return neg ? -x : x; } double _sin(x) double x; { return sinus(x, 0); } double _cos(x) double x; { if (x < 0) x = -x; return sinus(x, 1); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: sqt.c,v 2.5 90/11/06 13:02:15 ceriel Exp $ */ #define __NO_DEFS #include #include extern _trp(); #define NITER 5 static double Ldexp(fl,exp) double fl; int exp; { extern double _fef(); int sign = 1; int currexp; if (fl<0) { fl = -fl; sign = -1; } fl = _fef(fl,&currexp); exp += currexp; if (exp > 0) { while (exp>30) { fl *= (double) (1L << 30); exp -= 30; } fl *= (double) (1L << exp); } else { while (exp<-30) { fl /= (double) (1L << 30); exp += 30; } fl /= (double) (1L << -exp); } return sign * fl; } double _sqt(x) double x; { extern double _fef(); int exponent; double val; if (x <= 0) { if (x < 0) _trp(ESQT); return 0; } val = _fef(x, &exponent); if (exponent & 1) { exponent--; val *= 2; } val = Ldexp(val + 1.0, exponent/2 - 1); /* was: val = (val + 1.0)/2.0; val = Ldexp(val, exponent/2); */ for (exponent = NITER - 1; exponent >= 0; exponent--) { val = (val + x / val) / 2.0; } return val; } /* $Header: string.c,v 2.2 84/07/20 11:19:10 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* function strbuf(var b:charbuf):string; */ char *strbuf(s) char *s; { return(s); } /* function strtobuf(s:string; var b:charbuf; blen:integer):integer; */ int strtobuf(s,b,l) char *s,*b; { int i; i = 0; while (--l>=0) { if ((*b++ = *s++) == 0) break; i++; } return(i); } /* function strlen(s:string):integer; */ int strlen(s) char *s; { int i; i = 0; while (*s++) i++; return(i); } /* function strfetch(s:string; i:integer):char; */ int strfetch(s,i) char *s; { return(s[i-1]); } /* procedure strstore(s:string; i:integer; c:char); */ strstore(s,i,c) char *s; { s[i-1] = c; } # ; $Header: trap.e,v 2.2 84/07/20 13:54:36 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE #define TRAP 0 ; trap is called with one parameter: ; - trap number (TRAP) exp $trap pro $trap,0 lol TRAP trp ret 0 end ? # ; $Header: trp.e,v 2.2 84/07/20 11:20:05 sater Stab $ ; ; (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. ; ; This product is part of the Amsterdam Compiler Kit. ; ; Permission to use, sell, duplicate or disclose this software must be ; obtained in writing. Requests for such permissions may be sent to ; ; Dr. Andrew S. Tanenbaum ; Wiskundig Seminarium ; Vrije Universiteit ; Postbox 7161 ; 1007 MC Amsterdam ; The Netherlands ; ; mes 2,_EM_WSIZE,_EM_PSIZE #define TRAP 0 ; _trp() and trap() perform the same function, ; but have to be separate. trap exists to facilitate the user. ; _trp is there for the system, trap cannot be used for that purpose ; because a user might define its own Pascal routine called trap. ; _trp is called with one parameter: ; - trap number (TRAP) exp $_trp pro $_trp,0 lol TRAP trp ret 0 end ? unp.curead.cuwrite.cwdw.cwf.cwrc.cwrf.cwri.cwrl.cwrr.cwrs.cwrz.c/* $Header: unp.c,v 2.5 91/02/19 12:13:08 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include extern _trp(); #define assert(x) /* nothing */ #ifndef EM_WSIZE #define EM_WSIZE _EM_WSIZE #endif struct descr { int low; int diff; int size; }; _unp(ad,zd,i,ap,zp,noext) int i; struct descr *ad,*zd; char *ap,*zp; int noext; { if (zd->diff > ad->diff || (i -= ad->low) < 0 || (i+zd->diff) > ad->diff) _trp(EUNPACK); ap += (i * ad->size); i = (zd->diff + 1) * zd->size; if (zd->size == 1) { int *aptmp = (int *) ap; assert(ad->size == EM_WSIZE); while (--i >= 0) if (noext) *aptmp++ = *zp++ & 0377; else *aptmp++ = *zp++; #if EM_WSIZE > 2 } else if (zd->size == 2) { int *aptmp = (int *) ap; short *zptmp = (short *) zp; assert(ad->size == EM_WSIZE); while (--i >= 0) if (noext) *aptmp++ = *zptmp++ & 0177777; else *aptmp++ = *zptmp++; #endif } else { assert(ad->size == zd->size); while (--i >= 0) *ap++ = *zp++; } } /* $Header: uread.c,v 2.3 91/02/22 16:57:33 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* function uread(fd:integer; var b:buf; n:integer):integer; */ extern int _read(); int uread(fd,b,n) char *b; int fd,n; { return(_read(fd,b,n)); } /* $Header: uwrite.c,v 2.3 91/02/22 16:57:42 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* function uwrite(fd:integer; var b:buf; n:integer):integer; */ extern int _write(); int uwrite(fd,b,n) char *b; int fd,n; { return(_write(fd,b,n)); } /* $Header: wdw.c,v 2.2 84/07/20 11:19:43 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern struct file *_curfil; extern _incpt(); char *_wdw(f) struct file *f; { _curfil = f; if ((f->flags & (WINDOW|WRBIT|0377)) == MAGIC) _incpt(f); return(f->ptr); } /* $Header: wf.c,v 2.2 84/07/20 11:19:53 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include extern struct file *_curfil; extern _trp(); _wf(f) struct file *f; { _curfil = f; if ((f->flags&0377) != MAGIC) _trp(EBADF); if ((f->flags & WRBIT) == 0) _trp(EWRITEF); } /* $Header: wrc.c,v 2.2 84/07/20 11:19:35 sater Stab $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include extern _wf(); extern _outcpt(); _wrc(c,f) int c; struct file *f; { *f->ptr = c; _wf(f); _outcpt(f); } _wln(f) struct file *f; { #ifdef CPM _wrc('\r',f); #endif _wrc('\n',f); f->flags |= ELNBIT; } _pag(f) struct file *f; { _wrc('\014',f); f->flags |= ELNBIT; } /* $Header: wrf.c,v 2.5 91/04/23 09:35:16 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _wstrin(); extern char *_fcvt(); #define assert(x) /* nothing */ #if __STDC__ #include #define HUGE_DIG DBL_MAX_10_EXP /* log10(maxreal) */ #else #define HUGE_DIG 400 /* log10(maxreal) */ #endif #define PREC_DIG 80 /* the maximum digits returned by _fcvt() */ #define FILL_CHAR '0' /* char printed if all of _fcvt() used */ #define BUFSIZE HUGE_DIG + PREC_DIG + 3 _wrf(n,w,r,f) int n,w; double r; struct file *f; { char *p,*b; int s,d; char buf[BUFSIZE]; if ( n < 0 || w < 0) _trp(EWIDTH); p = buf; if (n > PREC_DIG) n = PREC_DIG; b = _fcvt(r,n,&d,&s); assert(abs(d) <= HUGE_DIG); if (s) *p++ = '-'; if (d<=0) *p++ = '0'; else do *p++ = (*b ? *b++ : FILL_CHAR); while (--d > 0); if (n > 0) *p++ = '.'; while (++d <= 0) { if (--n < 0) break; *p++ = '0'; } while (--n >= 0) { *p++ = (*b ? *b++ : FILL_CHAR); assert(p <= buf+BUFSIZE); } _wstrin(w,(int)(p-buf),buf,f); } /* $Header: wri.c,v 2.6 91/04/23 09:35:25 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include extern _wstrin(); #ifndef EM_WSIZE #ifdef _EM_WSIZE #define EM_WSIZE _EM_WSIZE #endif #endif #if EM_WSIZE==4 #define SZ 11 #define MININT -2147483648 #define STRMININT "-2147483648" #endif #if EM_WSIZE==2 #define SZ 6 #define MININT -32768 #define STRMININT "-32768" #endif #if EM_WSIZE==1 #define SZ 4 #define MININT -128 #define STRMININT "-128" #endif #ifndef STRMININT Something wrong here! #endif _wsi(w,i,f) int w,i; struct file *f; { char *p; int j; char buf[SZ]; if (w < 0) _trp(EWIDTH); p = &buf[SZ]; if ((j=i) < 0) { if (i == MININT) { _wstrin(w,SZ,STRMININT,f); return; } j = -j; } do *--p = '0' + j%10; while (j /= 10); if (i<0) *--p = '-'; _wstrin(w,(int)(&buf[SZ]-p),p,f); } _wri(i,f) int i; struct file *f; { _wsi(SZ,i,f); } /* $Header: wrl.c,v 2.3 91/04/23 09:35:33 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _wstrin(); #define MAXNEGLONG -2147483648 _wsl(w,l,f) int w; long l; struct file *f; { char *p,c; long j; char buf[11]; if (w < 0) _trp(EWIDTH); p = &buf[11]; if ((j=l) < 0) { if (l == MAXNEGLONG) { _wstrin(w,11,"-2147483648",f); return; } j = -j; } do { c = j%10; *--p = c + '0'; } while (j /= 10); if (l<0) *--p = '-'; _wstrin(w,(int)(&buf[11]-p),p,f); } _wrl(l,f) long l; struct file *f; { _wsl(11,l,f); } /* $Header: wrr.c,v 2.3 91/04/23 09:35:42 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _wstrin(); extern char *_ecvt(); #define PREC_DIG 80 /* maximum digits produced by _ecvt() */ _wsr(w,r,f) int w; double r; struct file *f; { char *p,*b; int s,d,i; char buf[PREC_DIG+7]; if (w < 0) _trp(EWIDTH); p = buf; if ((i = w-6) < 2) i = 2; b = _ecvt(r,i,&d,&s); *p++ = s? '-' : ' '; if (*b == '0') d++; *p++ = *b++; *p++ = '.'; while (--i > 0) *p++ = *b++; *p++ = 'e'; d--; if (d < 0) { d = -d; *p++ = '-'; } else *p++ = '+'; if (d >= 1000) { *p++ = '*'; *p++ = '*'; *p++ = '*'; } else { *p++ = '0' + d/100; *p++ = '0' + (d/10) % 10; *p++ = '0' + d%10; } _wstrin(w,(int)(p-buf),buf,f); } _wrr(r,f) double r; struct file *f; { _wsr(13,r,f); } /* $Header: wrs.c,v 2.2 89/05/03 09:53:11 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ /* Author: J.W. Stevenson */ #include #include extern _wf(); extern _outcpt(); _wstrin(width,len,buf,f) int width,len; char *buf; struct file *f; { _wf(f); for (width -= len; width>0; width--) { *f->ptr = ' '; _outcpt(f); } while (--len >= 0) { *f->ptr = *buf++; _outcpt(f); } } _wsc(w,c,f) int w; char c; struct file *f; { if (w < 0) _trp(EWIDTH); _wss(w,1,&c,f); } _wss(w,len,s,f) int w,len; char *s; struct file *f; { if (w < 0 || len < 0) _trp(EWIDTH); if (w < len) len = w; _wstrin(w,len,s,f); } _wrs(len,s,f) int len; char *s; struct file *f; { if (len < 0) _trp(EWIDTH); _wss(len,len,s,f); } _wsb(w,b,f) int w,b; struct file *f; { if (b) _wss(w,4,"true",f); else _wss(w,5,"false",f); } _wrb(b,f) int b; struct file *f; { _wsb(5,b,f); } /* $Header: wrz.c,v 2.4 91/04/23 09:35:51 ceriel Exp $ */ /* * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands. * * This product is part of the Amsterdam Compiler Kit. * * Permission to use, sell, duplicate or disclose this software must be * obtained in writing. Requests for such permissions may be sent to * * Dr. Andrew S. Tanenbaum * Wiskundig Seminarium * Vrije Universiteit * Postbox 7161 * 1007 MC Amsterdam * The Netherlands * */ #include #include extern _wss(); extern _wrs(); _wsz(w,s,f) int w; char *s; struct file *f; { char *p; if (w < 0) _trp(EWIDTH); for (p=s; *p; p++); _wss(w,(int)(p-s),s,f); } _wrz(s,f) char *s; struct file *f; { char *p; for (p=s; *p; p++); _wrs((int)(p-s),s,f); } .;..Makefilemain.cyyerror.c# Makefile for lib/liby. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -wo CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../liby.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(main.o) \ $(LIBRARY)(yyerror.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(main.o): main.c $(CC1) main.c $(LIBRARY)(yyerror.o): yyerror.c $(CC1) yyerror.c /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)main.c 5.3 (Berkeley) 1/13/91"; #endif /* not lint */ main() { exit(yyparse()); } /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #if defined(LIBC_SCCS) && !defined(lint) static char sccsid[] = "@(#)yyerror.c 5.2 (Berkeley) 5/15/90"; #endif /* not lint */ #include yyerror(msg) char *msg; { (void)fprintf(stderr, "%s\n", msg); return(0); } .;..Makefileasin.catan.catan2.cceil.cexp.cfabs.cfloor.cfmod.cfrexp.shugeval.cisnan.cldexp.clocalmath.hlog.clog10.cmodf.spow.csin.csinh.csqrt.ctan.ctanh.c# Makefile for lib/math. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(asin.o) \ $(LIBRARY)(atan.o) \ $(LIBRARY)(atan2.o) \ $(LIBRARY)(ceil.o) \ $(LIBRARY)(exp.o) \ $(LIBRARY)(fabs.o) \ $(LIBRARY)(floor.o) \ $(LIBRARY)(fmod.o) \ $(LIBRARY)(frexp.o) \ $(LIBRARY)(hugeval.o) \ $(LIBRARY)(isnan.o) \ $(LIBRARY)(ldexp.o) \ $(LIBRARY)(log.o) \ $(LIBRARY)(log10.o) \ $(LIBRARY)(modf.o) \ $(LIBRARY)(pow.o) \ $(LIBRARY)(sin.o) \ $(LIBRARY)(sinh.o) \ $(LIBRARY)(sqrt.o) \ $(LIBRARY)(tan.o) \ $(LIBRARY)(tanh.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(asin.o): asin.c $(CC1) asin.c $(LIBRARY)(atan.o): atan.c $(CC1) atan.c $(LIBRARY)(atan2.o): atan2.c $(CC1) atan2.c $(LIBRARY)(ceil.o): ceil.c $(CC1) ceil.c $(LIBRARY)(exp.o): exp.c $(CC1) exp.c $(LIBRARY)(fabs.o): fabs.c $(CC1) fabs.c $(LIBRARY)(floor.o): floor.c $(CC1) floor.c $(LIBRARY)(fmod.o): fmod.c $(CC1) fmod.c $(LIBRARY)(frexp.o): frexp.s $(CC1) frexp.s $(LIBRARY)(hugeval.o): hugeval.c $(CC1) hugeval.c $(LIBRARY)(isnan.o): isnan.c $(CC1) isnan.c $(LIBRARY)(ldexp.o): ldexp.c $(CC1) ldexp.c $(LIBRARY)(log.o): log.c $(CC1) log.c $(LIBRARY)(log10.o): log10.c $(CC1) log10.c $(LIBRARY)(modf.o): modf.s $(CC1) modf.s $(LIBRARY)(pow.o): pow.c $(CC1) pow.c $(LIBRARY)(sin.o): sin.c $(CC1) sin.c $(LIBRARY)(sinh.o): sinh.c $(CC1) sinh.c $(LIBRARY)(sqrt.o): sqrt.c $(CC1) sqrt.c $(LIBRARY)(tan.o): tan.c $(CC1) tan.c $(LIBRARY)(tanh.o): tanh.c $(CC1) tanh.c /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: asin.c,v 1.3 91/03/19 16:38:12 ceriel Exp $ */ #include #include #include "localmath.h" static double asin_acos(double x, int cosfl) { int negative = x < 0; int i; double g; static double p[] = { -0.27368494524164255994e+2, 0.57208227877891731407e+2, -0.39688862997540877339e+2, 0.10152522233806463645e+2, -0.69674573447350646411e+0 }; static double q[] = { -0.16421096714498560795e+3, 0.41714430248260412556e+3, -0.38186303361750149284e+3, 0.15095270841030604719e+3, -0.23823859153670238830e+2, 1.0 }; if (__IsNan(x)) { errno = EDOM; return x; } if (negative) { x = -x; } if (x > 0.5) { i = 1; if (x > 1) { errno = EDOM; return 0; } g = 0.5 - 0.5 * x; x = - sqrt(g); x += x; } else { /* ??? avoid underflow ??? */ i = 0; g = x * x; } x += x * g * POLYNOM4(g, p) / POLYNOM5(g, q); if (cosfl) { if (! negative) x = -x; } if ((cosfl == 0) == (i == 1)) { x = (x + M_PI_4) + M_PI_4; } else if (cosfl && negative && i == 1) { x = (x + M_PI_2) + M_PI_2; } if (! cosfl && negative) x = -x; return x; } double asin(double x) { return asin_acos(x, 0); } double acos(double x) { return asin_acos(x, 1); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: atan.c,v 1.3 91/03/19 16:38:21 ceriel Exp $ */ #include #include #include #include "localmath.h" double atan(double x) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { -0.13688768894191926929e+2, -0.20505855195861651981e+2, -0.84946240351320683534e+1, -0.83758299368150059274e+0 }; static double q[] = { 0.41066306682575781263e+2, 0.86157349597130242515e+2, 0.59578436142597344465e+2, 0.15024001160028576121e+2, 1.0 }; static double a[] = { 0.0, 0.52359877559829887307710723554658381, /* pi/6 */ M_PI_2, 1.04719755119659774615421446109316763 /* pi/3 */ }; int neg = x < 0; int n; double g; if (__IsNan(x)) { errno = EDOM; return x; } if (neg) { x = -x; } if (x > 1.0) { x = 1.0/x; n = 2; } else n = 0; if (x > 0.26794919243112270647) { /* 2-sqtr(3) */ n = n + 1; x = (((0.73205080756887729353*x-0.5)-0.5)+x)/ (1.73205080756887729353+x); } /* ??? avoid underflow ??? */ g = x * x; x += x * g * POLYNOM3(g, p) / POLYNOM4(g, q); if (n > 1) x = -x; x += a[n]; return neg ? -x : x; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: atan2.c,v 1.2 89/12/18 15:42:35 eck Exp $ */ #include #include #include "localmath.h" double atan2(double y, double x) { double absx, absy, val; if (x == 0 && y == 0) { errno = EDOM; return 0; } absy = y < 0 ? -y : y; absx = x < 0 ? -x : x; if (absy - absx == absy) { /* x negligible compared to y */ return y < 0 ? -M_PI_2 : M_PI_2; } if (absx - absy == absx) { /* y negligible compared to x */ val = 0.0; } else val = atan(y/x); if (x > 0) { /* first or fourth quadrant; already correct */ return val; } if (y < 0) { /* third quadrant */ return val - M_PI; } return val + M_PI; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: ceil.c,v 1.1 89/05/10 16:00:46 eck Exp $ */ #include double ceil(double x) { double val; return modf(x, &val) > 0 ? val + 1.0 : val ; /* this also works if modf always returns a positive fractional part */ } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: exp.c,v 1.5 91/03/19 16:38:29 ceriel Exp $ */ #include #include #include #include "localmath.h" double exp(double x) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { 0.25000000000000000000e+0, 0.75753180159422776666e-2, 0.31555192765684646356e-4 }; static double q[] = { 0.50000000000000000000e+0, 0.56817302698551221787e-1, 0.63121894374398503557e-3, 0.75104028399870046114e-6 }; double xn, g; int n; int negative = x < 0; if (__IsNan(x)) { errno = EDOM; return x; } if (x < M_LN_MIN_D) { errno = ERANGE; return 0.0; } if (x > M_LN_MAX_D) { errno = ERANGE; return HUGE_VAL; } if (negative) x = -x; /* ??? avoid underflow ??? */ n = x * M_LOG2E + 0.5; /* 1/ln(2) = log2(e), 0.5 added for rounding */ xn = n; { double x1 = (long) x; double x2 = x - x1; g = ((x1-xn*0.693359375)+x2) - xn*(-2.1219444005469058277e-4); } if (negative) { g = -g; n = -n; } xn = g * g; x = g * POLYNOM2(xn, p); n += 1; return (ldexp(0.5 + x/(POLYNOM3(xn, q) - x), n)); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: fabs.c,v 1.1 89/05/10 16:01:17 eck Exp $ */ double fabs(double x) { return x < 0 ? -x : x; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: floor.c,v 1.1 89/05/10 16:01:29 eck Exp $ */ #include double floor(double x) { double val; return modf(x, &val) < 0 ? val - 1.0 : val ; /* this also works if modf always returns a positive fractional part */ } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Hans van Eck */ /* $Header: fmod.c,v 1.1 89/12/18 15:41:53 eck Exp $ */ #include #include double fmod(double x, double y) { long i; double val; double frac; if (y == 0) { errno = EDOM; return 0; } frac = modf( x / y, &val); return frac * y; /* val = x / y; if (val > LONG_MIN && val < LONG_MAX) { i = val; return x - i * y; } */ } # .sect .text; .sect .rom; .sect .data; .sect .bss .extern _frexp .sect .text _frexp: #if __i386 push ebp mov ebp, esp push 12(ebp) push 8(ebp) mov eax, esp add eax, -4 push eax call .fef8 mov eax, 16(ebp) pop (eax) pop eax pop edx leave ret #else /* i86 */ push bp mov bp, sp lea bx, 4(bp) mov cx, #8 call .loi mov ax, sp add ax, #-2 push ax call .fef8 mov bx, 12(bp) pop (bx) call .ret8 jmp .cret #endif /* * (c) copyright 1990 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Hans van Eck */ /* $Header: hugeval.c,v 1.1 90/10/24 14:29:42 eck Exp $ */ #include double __huge_val(void) { return 1.0e+1000; /* This will generate a warning */ } int __IsNan(double d) { #if defined(vax) || defined(pdp) #else float f = d; if ((*((long *) &f) & 0x7f800000) == 0x7f800000 && (*((long *) &f) & 0x007fffff) != 0) return 1; #endif return 0; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: ldexp.c,v 1.5 91/03/19 16:38:37 ceriel Exp $ */ #include #include #include double ldexp(double fl, int exp) { int sign = 1; int currexp; if (__IsNan(fl)) { errno = EDOM; return fl; } if (fl == 0.0) return 0.0; if (fl<0) { fl = -fl; sign = -1; } if (fl > DBL_MAX) { /* for infinity */ errno = ERANGE; return sign * fl; } fl = frexp(fl,&currexp); exp += currexp; if (exp > 0) { if (exp > DBL_MAX_EXP) { errno = ERANGE; return sign * HUGE_VAL; } while (exp>30) { fl *= (double) (1L << 30); exp -= 30; } fl *= (double) (1L << exp); } else { /* number need not be normalized */ if (exp < DBL_MIN_EXP - DBL_MANT_DIG) { return 0.0; } while (exp<-30) { fl /= (double) (1L << 30); exp += 30; } fl /= (double) (1L << -exp); } return sign * fl; } /* * localmath.h - This header is used by the mathematical library. */ /* $Header: localmath.h,v 1.2 89/12/18 15:43:05 eck Exp $ */ /* some constants (Hart & Cheney) */ #define M_PI 3.14159265358979323846264338327950288 #define M_2PI 6.28318530717958647692528676655900576 #define M_3PI_4 2.35619449019234492884698253745962716 #define M_PI_2 1.57079632679489661923132169163975144 #define M_3PI_8 1.17809724509617246442349126872981358 #define M_PI_4 0.78539816339744830961566084581987572 #define M_PI_8 0.39269908169872415480783042290993786 #define M_1_PI 0.31830988618379067153776752674502872 #define M_2_PI 0.63661977236758134307553505349005744 #define M_4_PI 1.27323954473516268615107010698011488 #define M_E 2.71828182845904523536028747135266250 #define M_LOG2E 1.44269504088896340735992468100189213 #define M_LOG10E 0.43429448190325182765112891891660508 #define M_LN2 0.69314718055994530941723212145817657 #define M_LN10 2.30258509299404568401799145468436421 #define M_SQRT2 1.41421356237309504880168872420969808 #define M_1_SQRT2 0.70710678118654752440084436210484904 #define M_EULER 0.57721566490153286060651209008240243 /* macros for constructing polynomials */ #define POLYNOM1(x, a) ((a)[1]*(x)+(a)[0]) #define POLYNOM2(x, a) (POLYNOM1((x),(a)+1)*(x)+(a)[0]) #define POLYNOM3(x, a) (POLYNOM2((x),(a)+1)*(x)+(a)[0]) #define POLYNOM4(x, a) (POLYNOM3((x),(a)+1)*(x)+(a)[0]) #define POLYNOM5(x, a) (POLYNOM4((x),(a)+1)*(x)+(a)[0]) #define POLYNOM6(x, a) (POLYNOM5((x),(a)+1)*(x)+(a)[0]) #define POLYNOM7(x, a) (POLYNOM6((x),(a)+1)*(x)+(a)[0]) #define POLYNOM8(x, a) (POLYNOM7((x),(a)+1)*(x)+(a)[0]) #define POLYNOM9(x, a) (POLYNOM8((x),(a)+1)*(x)+(a)[0]) #define POLYNOM10(x, a) (POLYNOM9((x),(a)+1)*(x)+(a)[0]) #define POLYNOM11(x, a) (POLYNOM10((x),(a)+1)*(x)+(a)[0]) #define POLYNOM12(x, a) (POLYNOM11((x),(a)+1)*(x)+(a)[0]) #define POLYNOM13(x, a) (POLYNOM12((x),(a)+1)*(x)+(a)[0]) #define M_LN_MAX_D (M_LN2 * DBL_MAX_EXP) #define M_LN_MIN_D (M_LN2 * (DBL_MIN_EXP - 1)) /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: log.c,v 1.3 91/03/19 16:38:45 ceriel Exp $ */ #include #include #include #include "localmath.h" double log(double x) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double a[] = { -0.64124943423745581147e2, 0.16383943563021534222e2, -0.78956112887491257267e0 }; static double b[] = { -0.76949932108494879777e3, 0.31203222091924532844e3, -0.35667977739034646171e2, 1.0 }; double znum, zden, z, w; int exponent; if (__IsNan(x)) { errno = EDOM; return x; } if (x < 0) { errno = EDOM; return -HUGE_VAL; } else if (x == 0) { errno = ERANGE; return -HUGE_VAL; } if (x <= DBL_MAX) { } else return x; /* for infinity and Nan */ x = frexp(x, &exponent); if (x > M_1_SQRT2) { znum = (x - 0.5) - 0.5; zden = x * 0.5 + 0.5; } else { znum = x - 0.5; zden = znum * 0.5 + 0.5; exponent--; } z = znum/zden; w = z * z; x = z + z * w * (POLYNOM2(w,a)/POLYNOM3(w,b)); z = exponent; x += z * (-2.121944400546905827679e-4); return x + z * 0.693359375; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: log10.c,v 1.3 91/03/19 16:38:55 ceriel Exp $ */ #include #include #include "localmath.h" double log10(double x) { if (__IsNan(x)) { errno = EDOM; return x; } if (x < 0) { errno = EDOM; return -HUGE_VAL; } else if (x == 0) { errno = ERANGE; return -HUGE_VAL; } return log(x) / M_LN10; } # .sect .text; .sect .rom; .sect .data; .sect .bss .extern _modf .sect .text _modf: #if __i386 push ebp mov ebp, esp push 12(ebp) push 8(ebp) push 1 push 4 call .cif8 mov eax, esp push eax call .fif8 pop ecx mov edx, 16(ebp) pop ecx pop ebx mov 0(edx), ecx mov 4(edx), ebx pop eax pop edx leave ret #else /* i86 */ push bp mov bp, sp lea bx, 4(bp) mov cx, #8 call .loi mov dx, #1 push dx push dx push dx mov ax, #2 push ax call .cif8 mov ax, sp push ax call .fif8 pop bx mov bx, 12(bp) mov cx, #8 call .sti call .ret8 jmp .cret #endif /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: pow.c,v 1.3 90/08/28 13:59:36 eck Exp $ */ #include #include #include #include "localmath.h" double pow(double x, double y) { /* Simple version for now. The Cody and Waite book has a very complicated, much more precise version, but this version has machine-dependent arrays A1 and A2, and I don't know yet how to solve this ??? */ double dummy; int result_neg = 0; if ((x == 0 && y == 0) || (x < 0 && modf(y, &dummy) != 0)) { errno = EDOM; return 0; } if (x == 0) return x; if (x < 0) { if (modf(y/2.0, &dummy) != 0) { /* y was odd */ result_neg = 1; } x = -x; } x = log(x); if (x < 0) { x = -x; y = -y; } /* Beware of overflow in the multiplication */ if (x > 1.0 && y > DBL_MAX/x) { errno = ERANGE; return result_neg ? -HUGE_VAL : HUGE_VAL; } x = exp(x * y); return result_neg ? -x : x; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: sin.c,v 1.3 91/03/19 16:39:04 ceriel Exp $ */ #include #include #include #include "localmath.h" static double sinus(double x, int cos_flag) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double r[] = { -0.16666666666666665052e+0, 0.83333333333331650314e-2, -0.19841269841201840457e-3, 0.27557319210152756119e-5, -0.25052106798274584544e-7, 0.16058936490371589114e-9, -0.76429178068910467734e-12, 0.27204790957888846175e-14 }; double y; int neg = 1; if (__IsNan(x)) { errno = EDOM; return x; } if (x < 0) { x = -x; neg = -1; } if (cos_flag) { neg = 1; y = M_PI_2 + x; } else y = x; /* ??? avoid loss of significance, if y is too large, error ??? */ y = y * M_1_PI + 0.5; if (y >= DBL_MAX/M_PI) return 0.0; /* Use extended precision to calculate reduced argument. Here we used 12 bits of the mantissa for a1. Also split x in integer part x1 and fraction part x2. */ #define A1 3.1416015625 #define A2 -8.908910206761537356617e-6 { double x1, x2; modf(y, &y); if (modf(0.5*y, &x1)) neg = -neg; if (cos_flag) y -= 0.5; x2 = modf(x, &x1); x = x1 - y * A1; x += x2; x -= y * A2; #undef A1 #undef A2 } if (x < 0) { neg = -neg; x = -x; } /* ??? avoid underflow ??? */ y = x * x; x += x * y * POLYNOM7(y, r); return neg==-1 ? -x : x; } double sin(double x) { return sinus(x, 0); } double cos(double x) { if (x < 0) x = -x; return sinus(x, 1); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: sinh.c,v 1.3 91/03/19 16:39:12 ceriel Exp $ */ #include #include #include #include "localmath.h" static double sinh_cosh(double x, int cosh_flag) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { -0.35181283430177117881e+6, -0.11563521196851768270e+5, -0.16375798202630751372e+3, -0.78966127417357099479e+0 }; static double q[] = { -0.21108770058106271242e+7, 0.36162723109421836460e+5, -0.27773523119650701167e+3, 1.0 }; int negative = x < 0; double y = negative ? -x : x; if (__IsNan(x)) { errno = EDOM; return x; } if (! cosh_flag && y <= 1.0) { /* ??? check for underflow ??? */ y = y * y; return x + x * y * POLYNOM3(y, p)/POLYNOM3(y,q); } if (y >= M_LN_MAX_D) { /* exp(y) would cause overflow */ #define LNV 0.69316101074218750000e+0 #define VD2M1 0.52820835025874852469e-4 double w = y - LNV; if (w < M_LN_MAX_D+M_LN2-LNV) { x = exp(w); x += VD2M1 * x; } else { errno = ERANGE; x = HUGE_VAL; } } else { double z = exp(y); x = 0.5 * (z + (cosh_flag ? 1.0 : -1.0)/z); } return negative ? -x : x; } double sinh(double x) { return sinh_cosh(x, 0); } double cosh(double x) { if (x < 0) x = -x; return sinh_cosh(x, 1); } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: sqrt.c,v 1.3 91/03/19 16:39:21 ceriel Exp $ */ #include #include #include #define NITER 5 double sqrt(double x) { int exponent; double val; if (__IsNan(x)) { errno = EDOM; return x; } if (x <= 0) { if (x < 0) errno = EDOM; return 0; } if (x > DBL_MAX) return x; /* for infinity */ val = frexp(x, &exponent); if (exponent & 1) { exponent--; val *= 2; } val = ldexp(val + 1.0, exponent/2 - 1); /* was: val = (val + 1.0)/2.0; val = ldexp(val, exponent/2); */ for (exponent = NITER - 1; exponent >= 0; exponent--) { val = (val + x / val) / 2.0; } return val; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: tan.c,v 1.3 91/03/19 16:39:30 ceriel Exp $ */ #include #include #include #include "localmath.h" double tan(double x) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ int negative = x < 0; int invert = 0; double y; static double p[] = { 1.0, -0.13338350006421960681e+0, 0.34248878235890589960e-2, -0.17861707342254426711e-4 }; static double q[] = { 1.0, -0.46671683339755294240e+0, 0.25663832289440112864e-1, -0.31181531907010027307e-3, 0.49819433993786512270e-6 }; if (__IsNan(x)) { errno = EDOM; return x; } if (negative) x = -x; /* ??? avoid loss of significance, error if x is too large ??? */ y = x * M_2_PI + 0.5; if (y >= DBL_MAX/M_PI_2) return 0.0; /* Use extended precision to calculate reduced argument. Here we used 12 bits of the mantissa for a1. Also split x in integer part x1 and fraction part x2. */ #define A1 1.57080078125 #define A2 -4.454455103380768678308e-6 { double x1, x2; modf(y, &y); if (modf(0.5*y, &x1)) invert = 1; x2 = modf(x, &x1); x = x1 - y * A1; x += x2; x -= y * A2; #undef A1 #undef A2 } /* ??? avoid underflow ??? */ y = x * x; x += x * y * POLYNOM2(y, p+1); y = POLYNOM4(y, q); if (negative) x = -x; return invert ? -y/x : x/y; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ /* $Header: tanh.c,v 1.3 91/03/19 16:39:40 ceriel Exp $ */ #include #include #include #include "localmath.h" double tanh(double x) { /* Algorithm and coefficients from: "Software manual for the elementary functions" by W.J. Cody and W. Waite, Prentice-Hall, 1980 */ static double p[] = { -0.16134119023996228053e+4, -0.99225929672236083313e+2, -0.96437492777225469787e+0 }; static double q[] = { 0.48402357071988688686e+4, 0.22337720718962312926e+4, 0.11274474380534949335e+3, 1.0 }; int negative = x < 0; if (__IsNan(x)) { errno = EDOM; return x; } if (negative) x = -x; if (x >= 0.5*M_LN_MAX_D) { x = 1.0; } #define LN3D2 0.54930614433405484570e+0 /* ln(3)/2 */ else if (x > LN3D2) { x = 0.5 - 1.0/(exp(x+x)+1.0); x += x; } else { /* ??? avoid underflow ??? */ double g = x*x; x += x * g * POLYNOM2(g, p)/POLYNOM3(g, q); } return negative ? -x : x; } .;..Makefile_brk.c_svrctl.c_reboot.c_seekdir.casynchio.cbcmp.cbcopy.cbzero.ccrypt.cctermid.ccuserid.cenviron.cerrno.cfdopen.cffs.cfslib.cfsversion.cgetgrent.cgetlogin.cgetopt.cgetpass.cgetpwent.cgetttyent.cgetw.chypot.cindex.citoa.cloadname.clock.clrand.clsearch.cmemccpy.cmtab.cnlist.cpeekpoke.cpopen.cconfigfile.cputenv.cputw.cregexp.cregsub.crindex.cstderr.cswab.csyscall.csysconf.ctelldir.ctermcap.cttyname.cttyslot.c# Makefile for lib/other. # The bxxx(), and *index() functions are not used, because they have assembly # equivalents. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -I../.. CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(_brk.o) \ $(LIBRARY)(_reboot.o) \ $(LIBRARY)(_seekdir.o) \ $(LIBRARY)(_svrctl.o) \ $(LIBRARY)(asynchio.o) \ $(LIBRARY)(configfile.o) \ $(LIBRARY)(crypt.o) \ $(LIBRARY)(ctermid.o) \ $(LIBRARY)(cuserid.o) \ $(LIBRARY)(environ.o) \ $(LIBRARY)(errno.o) \ $(LIBRARY)(fdopen.o) \ $(LIBRARY)(ffs.o) \ $(LIBRARY)(fslib.o) \ $(LIBRARY)(fsversion.o) \ $(LIBRARY)(getgrent.o) \ $(LIBRARY)(getlogin.o) \ $(LIBRARY)(getopt.o) \ $(LIBRARY)(getpass.o) \ $(LIBRARY)(getpwent.o) \ $(LIBRARY)(getttyent.o) \ $(LIBRARY)(getw.o) \ $(LIBRARY)(hypot.o) \ $(LIBRARY)(itoa.o) \ $(LIBRARY)(loadname.o) \ $(LIBRARY)(lock.o) \ $(LIBRARY)(lrand.o) \ $(LIBRARY)(lsearch.o) \ $(LIBRARY)(memccpy.o) \ $(LIBRARY)(mtab.o) \ $(LIBRARY)(nlist.o) \ $(LIBRARY)(peekpoke.o) \ $(LIBRARY)(popen.o) \ $(LIBRARY)(putenv.o) \ $(LIBRARY)(putw.o) \ $(LIBRARY)(regexp.o) \ $(LIBRARY)(regsub.o) \ $(LIBRARY)(stderr.o) \ $(LIBRARY)(swab.o) \ $(LIBRARY)(syscall.o) \ $(LIBRARY)(sysconf.o) \ $(LIBRARY)(telldir.o) \ $(LIBRARY)(termcap.o) \ $(LIBRARY)(ttyname.o) \ $(LIBRARY)(ttyslot.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(_brk.o): _brk.c $(CC1) _brk.c $(LIBRARY)(_reboot.o): _reboot.c $(CC1) _reboot.c $(LIBRARY)(_seekdir.o): _seekdir.c $(CC1) _seekdir.c $(LIBRARY)(_svrctl.o): _svrctl.c $(CC1) _svrctl.c $(LIBRARY)(asynchio.o): asynchio.c $(CC1) asynchio.c $(LIBRARY)(bcmp.o): bcmp.c $(CC1) bcmp.c $(LIBRARY)(bcopy.o): bcopy.c $(CC1) bcopy.c $(LIBRARY)(bzero.o): bzero.c $(CC1) bzero.c $(LIBRARY)(configfile.o): configfile.c $(CC1) configfile.c $(LIBRARY)(crypt.o): crypt.c $(CC1) crypt.c $(LIBRARY)(ctermid.o): ctermid.c $(CC1) ctermid.c $(LIBRARY)(cuserid.o): cuserid.c $(CC1) cuserid.c $(LIBRARY)(environ.o): environ.c $(CC1) environ.c $(LIBRARY)(errno.o): errno.c $(CC1) errno.c $(LIBRARY)(fdopen.o): fdopen.c $(CC1) fdopen.c $(LIBRARY)(ffs.o): ffs.c $(CC1) ffs.c $(LIBRARY)(fslib.o): fslib.c $(CC1) fslib.c $(LIBRARY)(fsversion.o): fsversion.c $(CC1) fsversion.c $(LIBRARY)(getgrent.o): getgrent.c $(CC1) getgrent.c $(LIBRARY)(getlogin.o): getlogin.c $(CC1) getlogin.c $(LIBRARY)(getopt.o): getopt.c $(CC1) getopt.c $(LIBRARY)(getpass.o): getpass.c $(CC1) getpass.c $(LIBRARY)(getpwent.o): getpwent.c $(CC1) getpwent.c $(LIBRARY)(getttyent.o): getttyent.c $(CC1) getttyent.c $(LIBRARY)(getw.o): getw.c $(CC1) getw.c $(LIBRARY)(hypot.o): hypot.c $(CC1) hypot.c $(LIBRARY)(index.o): index.c $(CC1) index.c $(LIBRARY)(itoa.o): itoa.c $(CC1) itoa.c $(LIBRARY)(loadname.o): loadname.c $(CC1) loadname.c $(LIBRARY)(lock.o): lock.c $(CC1) lock.c $(LIBRARY)(lrand.o): lrand.c $(CC1) lrand.c $(LIBRARY)(lsearch.o): lsearch.c $(CC1) lsearch.c $(LIBRARY)(memccpy.o): memccpy.c $(CC1) memccpy.c $(LIBRARY)(mtab.o): mtab.c $(CC1) mtab.c $(LIBRARY)(nlist.o): nlist.c $(CC1) nlist.c $(LIBRARY)(peekpoke.o): peekpoke.c $(CC1) peekpoke.c $(LIBRARY)(popen.o): popen.c $(CC1) popen.c $(LIBRARY)(putenv.o): putenv.c $(CC1) putenv.c $(LIBRARY)(putw.o): putw.c $(CC1) putw.c $(LIBRARY)(regexp.o): regexp.c $(CC1) regexp.c $(LIBRARY)(regsub.o): regsub.c $(CC1) regsub.c $(LIBRARY)(rindex.o): rindex.c $(CC1) rindex.c $(LIBRARY)(stderr.o): stderr.c $(CC1) stderr.c $(LIBRARY)(swab.o): swab.c $(CC1) swab.c $(LIBRARY)(syscall.o): syscall.c $(CC1) syscall.c $(LIBRARY)(sysconf.o): sysconf.c $(CC1) sysconf.c $(LIBRARY)(syslib.o): syslib.c $(CC1) syslib.c $(LIBRARY)(telldir.o): telldir.c $(CC1) telldir.c $(LIBRARY)(termcap.o): termcap.c $(CC1) termcap.c $(LIBRARY)(ttyname.o): ttyname.c $(CC1) ttyname.c $(LIBRARY)(ttyslot.o): ttyslot.c $(CC1) ttyslot.c #include #define brk _brk #define sbrk _sbrk #include extern char *_brksize; /* Both OSF/1 and SYSVR4 man pages specify that brk(2) returns int. * However, BSD4.3 specifies that brk() returns char*. POSIX omits * brk() on the grounds that it imposes a memory model on an architecture. * For this reason, brk() and sbrk() are not in the lib/posix directory. * On the other hand, they are so crucial to correct operation of so many * parts of the system, that we have chosen to hide the name brk using _brk, * as with system calls. In this way, if a user inadvertently defines a * procedure brk, MINIX may continue to work because the true call is _brk. */ PUBLIC int brk(addr) char *addr; { message m; if (addr != _brksize) { m.m1_p1 = addr; if (_syscall(MM, BRK, &m) < 0) return(-1); _brksize = m.m2_p1; } return(0); } PUBLIC char *sbrk(incr) int incr; { char *newsize, *oldsize; oldsize = _brksize; newsize = _brksize + incr; if ((incr > 0 && newsize < oldsize) || (incr < 0 && newsize > oldsize)) return( (char *) -1); if (brk(newsize) == 0) return(oldsize); else return( (char *) -1); } /* svrctl() - special server control functions. Author: Kees J. Bot * 24 Apr 1994 */ #include #define svrctl _svrctl #include int svrctl(int request, void *argp) { message m; m.m2_i1 = request; m.m2_p1 = argp; switch ((request >> 8) & 0xFF) { case 'M': case 'S': /* MM handles calls for itself and the kernel. */ return _syscall(MM, SVRCTL, &m); case 'F': case 'I': /* FS handles calls for itself and inet. */ return _syscall(FS, SVRCTL, &m); default: errno = EINVAL; return -1; } } /* reboot.c - Systemcall interface to mm/signal.c::do_reboot() author: Edvard Tuinder v892231@si.hhs.NL */ #include #define reboot _reboot #include #include int reboot(int how, ...) { message m; va_list ap; va_start(ap, how); if ((m.m1_i1 = how) == RBT_MONITOR) { m.m1_p1 = va_arg(ap, char *); m.m1_i2 = va_arg(ap, size_t); } va_end(ap); return _syscall(MM, REBOOT, &m); } /* seekdir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #define lseek _lseek #define readdir _readdir #define seekdir _seekdir #include #include #include #include int seekdir(DIR *dp, off_t pos) /* Seek to position pos in a directory. */ { int off; if (dp == nil) { errno= EBADF; return -1; } dp->_count= 0; dp->_ptr= dp->_buf; off= pos & (sizeof(dp->_buf) - 1); dp->_pos= pos - off; if (lseek(dp->_fd, dp->_pos, SEEK_SET) == -1) return -1; while (dp->_pos < pos && readdir(dp) != nil) {} return 0; } /* asyn_init(), asyn_read(), asyn_write(), asyn_ioctl(), * asyn_wait(), asyn_synch(), asyn_close() * Author: Kees J. Bot * 26 Jan 1995 * Thise are just stub routines that are call compatible with * the asynchio(3) library of Minix-vmd. See asynchio.h. */ #define nil 0 #define alarm _alarm #define ioctl _ioctl #define read _read #define sigaction _sigaction #define sigfillset _sigfillset #define time _time #define write _write #include #include #include #include #include #include #include #include #define IDLE 0 #define INPROGRESS 1 #define RESULT 2 #define OP_NOOP 0 #define OP_READ 1 #define OP_WRITE 2 #define OP_IOCTL 3 static asynchio_t *asyn_current; void asyn_init(asynchio_t *asyn) { asyn->state= IDLE; asyn->op= OP_NOOP; } static ssize_t operation(int op, asynchio_t *asyn, int fd, int req, void *data, ssize_t count) { switch (asyn->state) { case INPROGRESS: if (asyn_current != asyn && asyn->op != op) abort(); /*FALL THROUGH*/ case IDLE: asyn_current= asyn; asyn->op= op; asyn->fd= fd; asyn->req= req; asyn->data= data; asyn->count= count; asyn->state= INPROGRESS; errno= EINPROGRESS; return -1; case RESULT: if (asyn_current != asyn && asyn->op != op) abort(); errno= asyn->errno; return asyn->count; } } ssize_t asyn_read(asynchio_t *asyn, int fd, void *buf, size_t len) { return operation(OP_READ, asyn, fd, 0, buf, len); } ssize_t asyn_write(asynchio_t *asyn, int fd, const void *buf, size_t len) { return operation(OP_WRITE, asyn, fd, 0, (void *) buf, len); } int asyn_ioctl(asynchio_t *asyn, int fd, unsigned long request, void *data) { return operation(OP_IOCTL, asyn, fd, request, data, 0); } static void time_out(int sig) { alarm(1); } int asyn_wait(asynchio_t *asyn, int flags, struct timeval *to) { time_t now; unsigned old_timer, new_timer; struct sigaction old_sa, new_sa; if (asyn_current != asyn) abort(); if (flags & ASYN_NONBLOCK) abort(); if (asyn->state == RESULT) { asyn->state= IDLE; asyn->op= OP_NOOP; return 0; } if (to != nil) { now= time(nil); if (to->tv_sec <= now) { errno= EINTR; return -1; } old_timer= alarm(0); new_sa.sa_handler= time_out; sigfillset(&new_sa.sa_mask); new_sa.sa_flags= 0; sigaction(SIGALRM, &new_sa, &old_sa); new_timer= to->tv_sec - now; if (new_timer < old_timer) { new_timer= old_timer; } alarm(new_timer); } switch (asyn->op) { case OP_NOOP: asyn->count= pause(); asyn->errno= errno; case OP_READ: asyn->count= read(asyn->fd, asyn->data, asyn->count); asyn->errno= errno; break; case OP_WRITE: asyn->count= write(asyn->fd, asyn->data, asyn->count); asyn->errno= errno; break; case OP_IOCTL: asyn->count= ioctl(asyn->fd, asyn->req, asyn->data); asyn->errno= errno; break; } if (to != nil) { alarm(0); sigaction(SIGALRM, &old_sa, (struct sigaction *)0); alarm(old_timer); } if (asyn->count == -1 && asyn->errno == EINTR) { errno= EINTR; return -1; } else { asyn->state= RESULT; return 0; } } int asyn_synch(asynchio_t *asyn, int fd) { } int asyn_close(asynchio_t *asyn, int fd) { asyn_init(asyn); } #include /* bcmp - Berklix equivalent of memcmp */ #include int bcmp(s1, s2, length) /* == 0 or != 0 for equality and inequality */ _CONST void *s1; _CONST void *s2; size_t length; { return(memcmp(s1, s2, length)); } #include /* bcopy - Berklix equivalent of memcpy */ #include void bcopy(src, dst, length) _CONST void *src; void *dst; size_t length; { (void) memcpy(dst, src, length); } #include /* bzero - Berklix subset of memset */ #include void bzero(dst, length) void *dst; size_t length; { (void) memset(dst, 0, length); } /* crypt() - one-way password encryption function Author: Kees J. Bot * 7 Feb 1994 * This routine does not encrypt anything, it uses the pwdauth * program to do the hard work. */ #define nil 0 #define pipe _pipe #define fork _fork #define close _close #define dup2 _dup2 #define execl _execl #define read _read #define _exit __exit #define write _write #define waitpid _waitpid #include #include #include #include #include /* Set-uid root program to read /etc/shadow or encrypt passwords. */ static char PWDAUTH[] = "/usr/lib/pwdauth"; #define LEN 1024 char *crypt(const char *key, const char *salt) { pid_t pid; int status; int pfd[2]; static char pwdata[LEN]; char *p= pwdata; const char *k= key; const char *s= salt; int n; /* Fill pwdata[] with the key and salt. */ while ((*p++ = *k++) != 0) if (p == pwdata+LEN-1) goto fail; while ((*p++ = *s++) != 0) if (p == pwdata+LEN-0) goto fail; if (pipe(pfd) < 0) goto fail; /* Prefill the pipe. */ (void) write(pfd[1], pwdata, p - pwdata); switch ((pid= fork())) { case -1: close(pfd[0]); close(pfd[1]); goto fail; case 0: /* Connect both input and output to the pipe. */ if (pfd[0] != 0) { dup2(pfd[0], 0); close(pfd[0]); } if (pfd[1] != 1) { dup2(pfd[1], 1); close(pfd[1]); } execl(PWDAUTH, PWDAUTH, (char *) nil); /* No pwdauth? Fail! */ (void) read(0, pwdata, LEN); _exit(1); } close(pfd[1]); if (waitpid(pid, &status, 0) < 0 || status != 0) { close(pfd[0]); goto fail; } /* Read and return the result. Check if it contains exactly one * string. */ n= read(pfd[0], pwdata, LEN); close(pfd[0]); if (n < 0) goto fail; p = pwdata + n; n = 0; while (p > pwdata) if (*--p == 0) n++; if (n != 1) goto fail; return pwdata; fail: pwdata[0] = salt[0] ^ 1; /* make result != salt */ pwdata[1] = 0; return pwdata; } /* * $PchHeader: /mount/hd2/minix/lib/misc/RCS/crypt.c,v 1.3 1994/12/22 13:51:49 philip Exp $ */ /* ctermid(3) * * Author: Terrence Holm Aug. 1988 * * * Ctermid(3) returns a pointer to a string naming the controlling * terminal. If is NULL then local PRIVATE storage * is used, otherwise must point to storage of at * least L_ctermid characters. * * Returns a pointer to "/dev/tty". */ #include #include #include _PROTOTYPE( char *ctermid, (char *name_space)); #ifndef L_ctermid #define L_ctermid 9 #endif char *ctermid(name_space) char *name_space; { PRIVATE char termid[L_ctermid]; if (name_space == (char *)NULL) name_space = termid; strcpy(name_space, "/dev/tty"); return(name_space); } /* cuserid(3) * * Author: Terrence W. Holm Sept. 1987 */ #include #include #include #include #include #ifndef L_cuserid #define L_cuserid 9 #endif char *cuserid(user_name) char *user_name; { PRIVATE char userid[L_cuserid]; struct passwd *pw_entry; if (user_name == (char *)NULL) user_name = userid; pw_entry = getpwuid(geteuid()); if (pw_entry == (struct passwd *)NULL) { *user_name = '\0'; return((char *)NULL); } strcpy(user_name, pw_entry->pw_name); return(user_name); } /* * environ.c - define the variable environ */ /* $Header: environ.c,v 1.1 90/09/27 13:39:50 eck Exp $ */ /* * This file defines the variable environ and initializes it with a magic * value. The C run-time start-off routine tests whether the variable * environ is initialized with this value. If it is not, it is assumed * that it is defined by the user. Only two bytes are tested, since we * don't know the endian-ness and alignment restrictions of the machine. * This means that the low-order two-bytes should be equal to the * high-order two-bytes on machines with four-byte pointers. In fact, all * the bytes in the pointer are the same, just in case. */ #if _EM_PSIZE==2 char **environ = (char **) 0x5353; #else char **environ = (char **) 0x53535353; #endif #include /* errno.c - declare variable errno Author: F. Meulenbroeks */ int errno = 0; /* * fdopen - convert a (UNIX) file descriptor into a FILE pointer */ /* $Header: fdopen.c,v 1.4 91/02/22 16:32:05 ceriel Exp $ */ #include #include "../stdio/loc_incl.h" #include FILE * fdopen(fd, mode) int fd; _CONST char *mode; { register int i; FILE *stream; int flags = 0; if (fd < 0) return (FILE *)NULL; for (i = 0; __iotab[i] != 0 ; i++) if (i >= FOPEN_MAX-1) return (FILE *)NULL; switch(*mode++) { case 'r': flags |= _IOREAD | _IOREADING; break; case 'a': flags |= _IOAPPEND; case 'w': flags |= _IOWRITE | _IOWRITING; break; default: return (FILE *)NULL; } while(*mode) { switch(*mode++) { case 'b': continue; case '+': flags |= _IOREAD | _IOWRITE; continue; /* The sequence may be followed by aditional characters */ default: break; } break; } if ((stream = (FILE *) malloc(sizeof(FILE))) == NULL) { return (FILE *)NULL; } if ((flags & _IOREAD) && (flags & _IOWRITE)) flags &= ~(_IOREADING | _IOWRITING); stream->_count = 0; stream->_fd = fd; stream->_flags = flags; stream->_buf = NULL; __iotab[i] = stream; return stream; } #include /* ffs(3) * * Author: Terrence W. Holm Sep. 1988 */ _PROTOTYPE( int ffs, (int word)); int ffs(word) int word; { int i; if (word == 0) return(0); for (i = 1;; ++i, word >>= 1) if (word & 1) return(i); } /* fslib.c - routines needed by fs and fs utilities */ #include /* for unused stuff in :-( */ #include #include #include #include /* for unshort :-( */ #include "fs/const.h" /* depends of -I flag in Makefile */ #include "fs/type.h" /* ditto */ #include "fs/inode.h" /* ditto */ #include /* The next routine is copied from fsck.c and mkfs.c... (Re)define some * things for consistency. Some things should be done better. The shifts * should be replaced by multiplications and divisions by MAP_BITS_PER_BLOCK * since log2 of this is too painful to get right. */ #define BITMAPSHIFT 13 /* = log2(MAP_BITS_PER_BLOCK) */ /* Convert from bit count to a block count. The usual expression * * (nr_bits + (1 << BITMAPSHIFT) - 1) >> BITMAPSHIFT * * doesn't work because of overflow. * * Other overflow bugs, such as the expression for N_ILIST overflowing when * s_inodes is just over V*_INODES_PER_BLOCK less than the maximum+1, are not * fixed yet, because that number of inodes is silly. */ /* The above comment doesn't all apply now bit_t is long. Overflow is now * unlikely, but negative bit counts are now possible (though unlikely) * and give silly results. */ PUBLIC int bitmapsize(nr_bits) bit_t nr_bits; { int nr_blocks; nr_blocks = (int) (nr_bits >> BITMAPSHIFT); if (((bit_t) nr_blocks << BITMAPSHIFT) < nr_bits) ++nr_blocks; return(nr_blocks); } /*===========================================================================* * conv2 * *===========================================================================*/ PUBLIC unsigned conv2(norm, w) int norm; /* TRUE if no swap, FALSE for byte swap */ int w; /* promotion of 16-bit word to be swapped */ { /* Possibly swap a 16-bit word between 8086 and 68000 byte order. */ if (norm) return( (unsigned) w & 0xFFFF); return( ((w&BYTE) << 8) | ( (w>>8) & BYTE)); } /*===========================================================================* * conv4 * *===========================================================================*/ PUBLIC long conv4(norm, x) int norm; /* TRUE if no swap, FALSE for byte swap */ long x; /* 32-bit long to be byte swapped */ { /* Possibly swap a 32-bit long between 8086 and 68000 byte order. */ unsigned lo, hi; long l; if (norm) return(x); /* byte order was already ok */ lo = conv2(FALSE, (int) x & 0xFFFF); /* low-order half, byte swapped */ hi = conv2(FALSE, (int) (x>>16) & 0xFFFF); /* high-order half, swapped */ l = ( (long) lo <<16) | hi; return(l); } /*===========================================================================* * conv_inode * *===========================================================================*/ PUBLIC void conv_inode(rip, dip, dip2, rw_flag, magic) register struct inode *rip; /* pointer to the in-core inode struct */ register d1_inode *dip; /* pointer to the V1 on-disk inode struct */ register d2_inode *dip2; /* pointer to the V2 on-disk inode struct */ int rw_flag; /* READING or WRITING */ int magic; /* magic number of file system */ { /* Copy the inode from the disk block to the in-core table or vice versa. * If the fourth parameter below is FALSE, the bytes are swapped. */ switch (magic) { case SUPER_MAGIC: old_icopy(rip, dip, rw_flag, TRUE); break; case SUPER_REV: old_icopy(rip, dip, rw_flag, FALSE); break; case SUPER_V2: new_icopy(rip, dip2, rw_flag, TRUE); break; case SUPER_V2_REV: new_icopy(rip, dip2, rw_flag, FALSE); break; } } /*===========================================================================* * old_icopy * *===========================================================================*/ PUBLIC void old_icopy(rip, dip, direction, norm) register struct inode *rip; /* pointer to the in-core inode struct */ register d1_inode *dip; /* pointer to the d1_inode inode struct */ int direction; /* READING (from disk) or WRITING (to disk) */ int norm; /* TRUE = do not swap bytes; FALSE = swap */ { /* 4 different on-disk inode layouts are supported, one for each combination * of V1.x/V2.x * bytes-swapped/not-swapped. When an inode is read or written * this routine handles the conversions so that the information in the inode * table is independent of the disk structure from which the inode came. * The old_icopy routine copies to and from V1 disks. */ int i; if (direction == READING) { /* Copy V1.x inode to the in-core table, swapping bytes if need be. */ rip->i_mode = conv2(norm, dip->d1_mode); rip->i_uid = conv2(norm,dip->d1_uid ); rip->i_size = conv4(norm,dip->d1_size); rip->i_mtime = conv4(norm,dip->d1_mtime); rip->i_atime = 0; rip->i_ctime = 0; rip->i_nlinks = (nlink_t) dip->d1_nlinks; /* 1 char */ rip->i_gid = (gid_t) dip->d1_gid; /* 1 char */ rip->i_ndzones = V1_NR_DZONES; rip->i_nindirs = V1_INDIRECTS; for (i = 0; i < V1_NR_TZONES; i++) rip->i_zone[i] = conv2(norm, (int) dip->d1_zone[i]); } else { /* Copying V1.x inode to disk from the in-core table. */ dip->d1_mode = conv2(norm,rip->i_mode); dip->d1_uid = conv2(norm,rip->i_uid ); dip->d1_size = conv4(norm,rip->i_size); dip->d1_mtime = conv4(norm,rip->i_mtime); dip->d1_nlinks = (nlink_t) rip->i_nlinks; /* 1 char */ dip->d1_gid = (gid_t) rip->i_gid; /* 1 char */ for (i = 0; i < V1_NR_TZONES; i++) dip->d1_zone[i] = conv2(norm, (int) rip->i_zone[i]); } } /*===========================================================================* * new_icopy * *===========================================================================*/ PUBLIC void new_icopy(rip, dip, direction, norm) register struct inode *rip; /* pointer to the in-core inode struct */ register d2_inode *dip; /* pointer to the d2_inode struct */ int direction; /* READING (from disk) or WRITING (to disk) */ int norm; /* TRUE = do not swap bytes; FALSE = swap */ { /* Same as old_icopy, but to/from V2 disk layout. */ int i; if (direction == READING) { /* Copy V2.x inode to the in-core table, swapping bytes if need be. */ rip->i_mode = conv2(norm,dip->d2_mode); rip->i_uid = conv2(norm,dip->d2_uid ); rip->i_nlinks = conv2(norm,(int) dip->d2_nlinks); rip->i_gid = conv2(norm,(int) dip->d2_gid ); rip->i_size = conv4(norm,dip->d2_size); rip->i_atime = conv4(norm,dip->d2_atime); rip->i_ctime = conv4(norm,dip->d2_ctime); rip->i_mtime = conv4(norm,dip->d2_mtime); rip->i_ndzones = V2_NR_DZONES; rip->i_nindirs = V2_INDIRECTS; for (i = 0; i < V2_NR_TZONES; i++) rip->i_zone[i] = conv4(norm, (long) dip->d2_zone[i]); } else { /* Copying V2.x inode to disk from the in-core table. */ dip->d2_mode = conv2(norm,rip->i_mode); dip->d2_uid = conv2(norm,rip->i_uid ); dip->d2_nlinks = conv2(norm,rip->i_nlinks); dip->d2_gid = conv2(norm,rip->i_gid ); dip->d2_size = conv4(norm,rip->i_size); dip->d2_atime = conv4(norm,rip->i_atime); dip->d2_ctime = conv4(norm,rip->i_ctime); dip->d2_mtime = conv4(norm,rip->i_mtime); for (i = 0; i < V2_NR_TZONES; i++) dip->d2_zone[i] = conv4(norm, (long) rip->i_zone[i]); } } 2/* This procedure examines a file system and figures out whether it is * version 1 or version 2. It returns the result as an int. If the * file system is neither, it returns -1. A typical call is: * * n = fsversion("/dev/hd1", "df"); * * The first argument is the special file for the file system. * The second is the program name, which is used in error messages. */ #include #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/super.h" static struct super_block super, *sp; int fsversion(dev, prog) char *dev, *prog; { int fd; if ((fd = open(dev, O_RDONLY)) < 0) { std_err(prog); std_err(" cannot open "); perror(dev); return(-1); } lseek(fd, (off_t) BLOCK_SIZE, SEEK_SET); /* skip boot block */ if (read(fd, (char *) &super, (unsigned) SUPER_SIZE) != SUPER_SIZE) { std_err(prog); std_err(" cannot read super block on "); perror(dev); close(fd); return(-1); } close(fd); sp = &super; if (sp->s_magic == SUPER_MAGIC) return(1); if (sp->s_magic == SUPER_V2) return(2); return(-1); } /* getgrent(), getgrgid(), getgrnam() - group file routines * * Author: Kees J. Bot * 31 Jan 1994 */ #define nil 0 #define open _open #define fcntl _fcntl #define read _read #define close _close #include #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) static char GROUP[]= "/etc/group"; /* The group file. */ static const char *grfile; /* Current group file. */ static char buf[1024]; /* Read buffer. */ static char grline[512]; /* One line from the group file. */ static struct group entry; /* Entry to fill and return. */ static char *members[64]; /* Group members with the entry. */ static int grfd= -1; /* Filedescriptor to the file. */ static char *bufptr; /* Place in buf. */ static ssize_t buflen= 0; /* Remaining characters in buf. */ static char *lineptr; /* Place in the line. */ void endgrent(void) /* Close the group file. */ { if (grfd >= 0) { (void) close(grfd); grfd= -1; buflen= 0; } } int setgrent(void) /* Open the group file. */ { if (grfd >= 0) endgrent(); if (grfile == nil) grfile= GROUP; if ((grfd= open(grfile, O_RDONLY)) < 0) return -1; (void) fcntl(grfd, F_SETFD, fcntl(grfd, F_GETFD) | FD_CLOEXEC); return 0; } void setgrfile(const char *file) /* Prepare for reading an alternate group file. */ { endgrent(); grfile= file; } static int getline(void) /* Get one line from the group file, return 0 if bad or EOF. */ { lineptr= grline; do { if (buflen == 0) { if ((buflen= read(grfd, buf, sizeof(buf))) <= 0) return 0; bufptr= buf; } if (lineptr == arraylimit(grline)) return 0; buflen--; } while ((*lineptr++ = *bufptr++) != '\n'); lineptr= grline; return 1; } static char *scan_punct(int punct) /* Scan for a field separator in a line, return the start of the field. */ { char *field= lineptr; char *last; for (;;) { last= lineptr; if (*lineptr == 0) return nil; if (*lineptr == '\n') break; if (*lineptr++ == punct) break; if (lineptr[-1] == ':') return nil; /* :::,,,:,,,? */ } *last= 0; return field; } struct group *getgrent(void) /* Read one entry from the group file. */ { char *p; char **mem; /* Open the file if not yet open. */ if (grfd < 0 && setgrent() < 0) return nil; /* Until a good line is read. */ for (;;) { if (!getline()) return nil; /* EOF or corrupt. */ if ((entry.gr_name= scan_punct(':')) == nil) continue; if ((entry.gr_passwd= scan_punct(':')) == nil) continue; if ((p= scan_punct(':')) == nil) continue; entry.gr_gid= strtol(p, nil, 0); entry.gr_mem= mem= members; if (*lineptr != '\n') { do { if ((*mem= scan_punct(',')) == nil) goto again; if (mem < arraylimit(members) - 1) mem++; } while (*lineptr != 0); } *mem= nil; return &entry; again:; } } struct group *getgrgid(Gid_t gid) /* Return the group file entry belonging to the user-id. */ { struct group *gr; endgrent(); while ((gr= getgrent()) != nil && gr->gr_gid != gid) {} endgrent(); return gr; } struct group *getgrnam(const char *name) /* Return the group file entry belonging to the user name. */ { struct group *gr; endgrent(); while ((gr= getgrent()) != nil && strcmp(gr->gr_name, name) != 0) {} endgrent(); return gr; } /* getlogin(3) * * Author: Terrence W. Holm Aug. 1988 */ #include #include #include #include #include #ifndef L_cuserid #define L_cuserid 9 #endif char *getlogin() { PRIVATE char userid[L_cuserid]; struct passwd *pw_entry; pw_entry = getpwuid(getuid()); if (pw_entry == (struct passwd *)NULL) return((char *)NULL); strcpy(userid, pw_entry->pw_name); return(userid); } /* * getopt - parse command-line options */ /* $Header: getopt.c,v 1.1 89/12/18 14:39:31 eck Exp $ */ #include #include #include #define ERR(s, c) if(opterr){\ fputs(argv[0], stderr);\ fputs(s, stderr);\ fputc(c, stderr);\ fputc('\n', stderr);} int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt(argc, argv, opts) int argc; char **argv; char *opts; { static int sp = 1; register c; register char *cp; if (sp == 1) if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return EOF; else if (!strcmp(argv[optind], "--")) { optind++; return EOF; } optopt = c = argv[optind][sp]; if (c == ':' || (cp=strchr(opts, c)) == NULL) { ERR (": illegal option -- ", c); if (argv[optind][++sp] == '\0') { optind++; sp = 1; } return '?'; } if (*++cp == ':') { if (argv[optind][sp+1] != '\0') optarg = &argv[optind++][sp+1]; else if (++optind >= argc) { ERR (": option requires an argument -- ", c); sp = 1; return '?'; } else optarg = argv[optind++]; sp = 1; } else { if (argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return c; } /* getpass() - read a password Author: Kees J. Bot * Feb 16 1993 */ #define open _open #define sigaction _sigaction #define sigemptyset _sigemptyset #define tcgetattr _tcgetattr #define tcsetattr _tcsetattr #define write _write #define read _read #define close _close #include #include #include #include #include #include static int intr; static void catch(int sig) { intr= 1; } char *getpass(const char *prompt) { struct sigaction osa, sa; struct termios cooked, raw; static char password[32+1]; int fd, n= 0; /* Try to open the controlling terminal. */ if ((fd= open("/dev/tty", O_RDONLY)) < 0) return NULL; /* Trap interrupts unless ignored. */ intr= 0; sigaction(SIGINT, NULL, &osa); if (osa.sa_handler != SIG_IGN) { sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sa.sa_handler= catch; sigaction(SIGINT, &sa, &osa); } /* Set the terminal to non-echo mode. */ tcgetattr(fd, &cooked); raw= cooked; raw.c_iflag|= ICRNL; raw.c_lflag&= ~ECHO; raw.c_lflag|= ECHONL; raw.c_oflag|= OPOST | ONLCR; tcsetattr(fd, TCSANOW, &raw); /* Print the prompt. (After setting non-echo!) */ write(2, prompt, strlen(prompt)); /* Read the password, 32 characters max. */ while (read(fd, password+n, 1) > 0) { if (password[n] == '\n') break; if (n < 32) n++; } password[n]= 0; /* Terminal back to cooked mode. */ tcsetattr(fd, TCSANOW, &cooked); close(fd); /* Interrupt? */ sigaction(SIGINT, &osa, NULL); if (intr) raise(SIGINT); return password; } /* getpwent(), getpwuid(), getpwnam() - password file routines * * Author: Kees J. Bot * 31 Jan 1994 */ #define nil 0 #define open _open #define fcntl _fcntl #define read _read #define close _close #include #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) static char PASSWD[]= "/etc/passwd"; /* The password file. */ static const char *pwfile; /* Current password file. */ static char buf[1024]; /* Read buffer. */ static char pwline[256]; /* One line from the password file. */ static struct passwd entry; /* Entry to fill and return. */ static int pwfd= -1; /* Filedescriptor to the file. */ static char *bufptr; /* Place in buf. */ static ssize_t buflen= 0; /* Remaining characters in buf. */ static char *lineptr; /* Place in the line. */ void endpwent(void) /* Close the password file. */ { if (pwfd >= 0) { (void) close(pwfd); pwfd= -1; buflen= 0; } } int setpwent(void) /* Open the password file. */ { if (pwfd >= 0) endpwent(); if (pwfile == nil) pwfile= PASSWD; if ((pwfd= open(pwfile, O_RDONLY)) < 0) return -1; (void) fcntl(pwfd, F_SETFD, fcntl(pwfd, F_GETFD) | FD_CLOEXEC); return 0; } void setpwfile(const char *file) /* Prepare for reading an alternate password file. */ { endpwent(); pwfile= file; } static int getline(void) /* Get one line from the password file, return 0 if bad or EOF. */ { lineptr= pwline; do { if (buflen == 0) { if ((buflen= read(pwfd, buf, sizeof(buf))) <= 0) return 0; bufptr= buf; } if (lineptr == arraylimit(pwline)) return 0; buflen--; } while ((*lineptr++ = *bufptr++) != '\n'); lineptr= pwline; return 1; } static char *scan_colon(void) /* Scan for a field separator in a line, return the start of the field. */ { char *field= lineptr; char *last; for (;;) { last= lineptr; if (*lineptr == 0) return nil; if (*lineptr == '\n') break; if (*lineptr++ == ':') break; } *last= 0; return field; } struct passwd *getpwent(void) /* Read one entry from the password file. */ { char *p; /* Open the file if not yet open. */ if (pwfd < 0 && setpwent() < 0) return nil; /* Until a good line is read. */ for (;;) { if (!getline()) return nil; /* EOF or corrupt. */ if ((entry.pw_name= scan_colon()) == nil) continue; if ((entry.pw_passwd= scan_colon()) == nil) continue; if ((p= scan_colon()) == nil) continue; entry.pw_uid= strtol(p, nil, 0); if ((p= scan_colon()) == nil) continue; entry.pw_gid= strtol(p, nil, 0); if ((entry.pw_gecos= scan_colon()) == nil) continue; if ((entry.pw_dir= scan_colon()) == nil) continue; if ((entry.pw_shell= scan_colon()) == nil) continue; if (*lineptr == 0) return &entry; } } struct passwd *getpwuid(Uid_t uid) /* Return the password file entry belonging to the user-id. */ { struct passwd *pw; endpwent(); while ((pw= getpwent()) != nil && pw->pw_uid != uid) {} endpwent(); return pw; } struct passwd *getpwnam(const char *name) /* Return the password file entry belonging to the user name. */ { struct passwd *pw; endpwent(); while ((pw= getpwent()) != nil && strcmp(pw->pw_name, name) != 0) {} endpwent(); return pw; } /* getttyent(3) - get a ttytab entry Author: Kees J. Bot * 28 Oct 1995 */ #define nil 0 #define open _open #define close _close #define fcntl _fcntl #define read _read #include #include #include #include #include #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) static char TTYTAB[]= "/etc/ttytab"; /* The table of terminal devices. */ static char buf[512]; /* Read buffer. */ static char ttline[256]; /* One line from the ttytab file. */ static char *ttargv[32]; /* Compound arguments. */ static struct ttyent entry; /* Entry to fill and return. */ static int ttfd= -1; /* Filedescriptor to the file. */ static char *bufptr; /* Place in buf. */ static ssize_t buflen= 0; /* Remaining characters in buf. */ static char *lineptr; /* Place in the line. */ static char **argvptr; /* Place in word lists. */ void endttyent(void) /* Close the ttytab file. */ { if (ttfd >= 0) { (void) close(ttfd); ttfd= -1; buflen= 0; } } int setttyent(void) /* Open the ttytab file. */ { if (ttfd >= 0) endttyent(); if ((ttfd= open(TTYTAB, O_RDONLY)) < 0) return -1; (void) fcntl(ttfd, F_SETFD, fcntl(ttfd, F_GETFD) | FD_CLOEXEC); return 0; } static int getline(void) /* Get one line from the ttytab file, return 0 if bad or EOF. */ { lineptr= ttline; argvptr= ttargv; do { if (buflen == 0) { if ((buflen= read(ttfd, buf, sizeof(buf))) <= 0) return 0; bufptr= buf; } if (lineptr == arraylimit(ttline)) return 0; buflen--; } while ((*lineptr++ = *bufptr++) != '\n'); lineptr= ttline; return 1; } static int white(int c) /* Whitespace? */ { return c == ' ' || c == '\t'; } static char *scan_white(int quoted) /* Scan for a field separator in a line, return the start of the field. * "quoted" is set if we have to watch out for double quotes. */ { char *field, *last; while (white(*lineptr)) lineptr++; if (!quoted && *lineptr == '#') return nil; field= lineptr; for (;;) { last= lineptr; if (*lineptr == 0) return nil; if (*lineptr == '\n') break; if (quoted && *lineptr == '"') return field; if (white(*lineptr++)) break; } *last= 0; return *field == 0 ? nil : field; } static char **scan_quoted(void) /* Read a field that may be a quoted list of words. */ { char *p, **field= argvptr; while (white(*lineptr)) lineptr++; if (*lineptr == '"') { /* Quoted list of words. */ lineptr++; while ((p= scan_white(1)) != nil && *p != '"') { if (argvptr == arraylimit(ttargv)) return nil; *argvptr++= p; } if (*lineptr == '"') *lineptr++= 0; } else { /* Just one word. */ if ((p= scan_white(0)) == nil) return nil; if (argvptr == arraylimit(ttargv)) return nil; *argvptr++= p; } if (argvptr == arraylimit(ttargv)) return nil; *argvptr++= nil; return field; } struct ttyent *getttyent(void) /* Read one entry from the ttytab file. */ { /* Open the file if not yet open. */ if (ttfd < 0 && setttyent() < 0) return nil; /* Look for a line with something on it. */ for (;;) { if (!getline()) return nil; /* EOF or corrupt. */ if ((entry.ty_name= scan_white(0)) == nil) continue; entry.ty_type= scan_white(0); entry.ty_getty= scan_quoted(); entry.ty_init= scan_quoted(); return &entry; } } struct ttyent *getttynam(const char *name) /* Return the ttytab file entry for a given tty. */ { struct ttyent *tty; endttyent(); while ((tty= getttyent()) != nil && strcmp(tty->ty_name, name) != 0) {} endttyent(); return tty; } /* * getw - read a word from a stream */ /* $Header: getw.c,v 1.1 89/12/18 14:39:51 eck Exp $ */ #include _PROTOTYPE(int getw, (FILE *stream )); int getw(stream) register FILE *stream; { register int cnt = sizeof(int); int w; register char *p = (char *) &w; while (cnt--) { *p++ = getc(stream); } if (feof(stream) || ferror(stream)) return EOF; return w; } /* * (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". * * Author: Ceriel J.H. Jacobs */ #include struct complex { double r,i; }; _PROTOTYPE(double hypot, (double x, double y )); _PROTOTYPE(double cabs, (struct complex p_compl )); /* $Header: hypot.c,v 1.1 91/02/26 18:08:08 ceriel Exp $ */ double hypot(x, y) double x, y; { /* Computes sqrt(x*x+y*y), avoiding overflow */ if (x < 0) x = -x; if (y < 0) y = -y; if (x > y) { double t = y; y = x; x = t; } /* sqrt(x*x+y*y) = sqrt(y*y*(x*x/(y*y)+1.0)) = y*sqrt(x*x/(y*y)+1.0) */ if (y == 0.0) return 0.0; x /= y; return y*sqrt(x*x+1.0); } double cabs(p_compl) struct complex p_compl; { return hypot(p_compl.r, p_compl.i); } #include /* index - find first occurrence of a character in a string */ #include char *index(s, charwanted) /* found char, or NULL if none */ _CONST char *s; char charwanted; { return(strchr(s, charwanted)); } #include /* Integer to ASCII for signed decimal integers. */ PRIVATE int next; PRIVATE char qbuf[8]; _PROTOTYPE( char *itoa, (int n)); char *itoa(n) int n; { register int r, k; int flag = 0; next = 0; if (n < 0) { qbuf[next++] = '-'; n = -n; } if (n == 0) { qbuf[next++] = '0'; } else { k = 10000; while (k > 0) { r = n / k; if (flag || r > 0) { qbuf[next++] = '0' + r; flag = 1; } n -= r * k; k = k / 10; } } qbuf[next] = 0; return(qbuf); } #include #include PUBLIC void _loadname(name, msgptr) _CONST char *name; message *msgptr; { /* This function is used to load a string into a type m3 message. If the * string fits in the message, it is copied there. If not, a pointer to * it is passed. */ register size_t k; k = strlen(name) + 1; msgptr->m3_i1 = k; msgptr->m3_p1 = (char *) name; if (k <= sizeof msgptr->m3_ca1) strcpy(msgptr->m3_ca1, name); } #include #include #include #include #include #include #include #if _ANSI #include #endif typedef enum { False, True } BOOLEAN; #define LOCKDIR "/tmp/" /* or /usr/tmp/ as the case may be */ #define MAXTRIES 3 #define NAPTIME (unsigned int)5 PRIVATE _PROTOTYPE( char *lockpath, (char *name)); _PROTOTYPE( void syserr, (char *errstring)); _PROTOTYPE( BOOLEAN lock, (char *name)); _PROTOTYPE( void unlock, (char *name)); void syserr(errstring) char *errstring; { fprintf(stderr,"couldn't %s\n", errstring); exit(1); } BOOLEAN lock(name) /* acquire lock */ char *name; { char *path; int fd, tries; path = lockpath(name); tries = 0; while ((fd = creat(path, 0)) == -1 && errno == EACCES) { if (++tries >= MAXTRIES) return(False); sleep(NAPTIME); } if (fd == -1 || close(fd) == -1) syserr("lock"); return(True); } void unlock(name) /* free lock */ char *name; { if (unlink(lockpath(name)) == -1) syserr("unlock"); } PRIVATE char *lockpath(name) /* generate lock file path */ char *name; { PRIVATE char path[20]; strcpy(path, LOCKDIR); return(strcat(path, name)); } /* lrand(3) * * Author: Terrence W. Holm Nov. 1988 * * * A prime modulus multiplicative linear congruential * generator (PMMLCG), or "Lehmer generator". * Implementation directly derived from the article: * * S. K. Park and K. W. Miller * Random Number Generators: Good Ones are Hard to Find * CACM vol 31, #10. Oct. 1988. pp 1192-1201. * * * Using the following multiplier and modulus, we obtain a * generator which: * * 1) Has a full period: 1 to 2^31 - 2. * 2) Is testably "random" (see the article). * 3) Has a known implementation by E. L. Schrage. */ #include _PROTOTYPE( long seed, (long lseed)); _PROTOTYPE( long lrand, (void)); #define A 16807L /* A "good" multiplier */ #define M 2147483647L /* Modulus: 2^31 - 1 */ #define Q 127773L /* M / A */ #define R 2836L /* M % A */ PRIVATE long _lseed = 1L; long seed(lseed) long lseed; { long previous_seed = _lseed; _lseed = lseed; return(previous_seed); } long lrand() { _lseed = A * (_lseed % Q) - R * (_lseed / Q); if (_lseed < 0) _lseed += M; return(_lseed); } #include #include /* lsearch(3) and lfind(3) * * Author: Terrence W. Holm Sep. 1988 */ #include _PROTOTYPE( char *lsearch, (char *key, char *base, unsigned *count, unsigned width, int (*keycmp)(const void *, const void *))); _PROTOTYPE( char *lfind, (char *key, char *base, unsigned *count, unsigned width, int (*keycmp)(const void *, const void *))); char *lsearch(key, base, count, width, keycmp) char *key; char *base; unsigned *count; unsigned width; _PROTOTYPE( int (*keycmp), (const void *, const void *)); { char *entry; char *last = base + *count * width; for (entry = base; entry < last; entry += width) if (keycmp(key, entry) == 0) return(entry); bcopy(key, last, width); *count += 1; return(last); } char *lfind(key, base, count, width, keycmp) char *key; char *base; unsigned *count; unsigned width; _PROTOTYPE( int (*keycmp), (const void *, const void *)); { char *entry; char *last = base + *count * width; for (entry = base; entry < last; entry += width) if (keycmp(key, entry) == 0) return(entry); return((char *)NULL); } #include /* memccpy - copy bytes up to a certain char * * CHARBITS should be defined only if the compiler lacks "unsigned char". * It should be a mask, e.g. 0377 for an 8-bit machine. */ #include #include _PROTOTYPE( void *memccpy, (void *dst, const void *src, int ucharstop, size_t size)); #ifndef CHARBITS # define UNSCHAR(c) ((unsigned char)(c)) #else # define UNSCHAR(c) ((c)&CHARBITS) #endif void *memccpy(dst, src, ucharstop, size) void * dst; _CONST void * src; int ucharstop; _SIZET size; { register char *d; register _CONST char *s; register _SIZET n; register int uc; if (size <= 0) return( (void *) NULL); s = (char *) src; d = (char *) dst; uc = UNSCHAR(ucharstop); for (n = size; n > 0; n--) if (UNSCHAR(*d++ = *s++) == (char) uc) return( (void *) d); return( (void *) NULL); } /* This package consists of 4 routines for handling the /etc/mtab file. * The /etc/mtab file contains information about the root and mounted file * systems as a series of lines, each one with exactly four fields separated * by one space as follows: * * special mounted_on version rw_flag * * where * special is the name of the block special file * mounted_on is the directory on which it is mounted * version is either 1 or 2 for MINIX V1 and V2 file systems * rw_flag is rw or ro for read/write or read only * * An example /etc/mtab: * * /dev/ram / 2 rw * /dev/hd1 /usr 2 rw * /dev/fd0 /user 1 ro * * * The four routines for handling /etc/mtab are as follows. They use two * (hidden) internal buffers, mtab_in for input and mtab_out for output. * * load_mtab(&prog_name) - read /etc/mtab into mtab_in * get_mtab_entry(&s1, &s2, &s3, &s4) - arrays that are filled in * put_mtab_entry(&s1, &s2, &s3, &s4) - append a line to mtab_out * rewrite_mtab(&prog_name) - write mtab_out to /etc/mtab * * If load_mtab and rewrite_mtab work, they return 0. If they fail, they * print their own error messages on stderr and return -1. When get_mtab_entry * runs out of entries to return, it sets the first pointer to NULL and returns * -1 instead of 0. Also, rewrite_mtab returns -1 if it fails. */ #include #include #include #include #include #include #include #include #define BUF_SIZE 512 /* size of the /etc/mtab buffer */ char *etc_mtab = "/etc/mtab"; /* name of the /etc/mtab file */ static char mtab_in[BUF_SIZE+1]; /* holds /etc/mtab when it is read in */ static char mtab_out[BUF_SIZE+1]; /* buf to build /etc/mtab for output later */ static char *iptr = mtab_in; /* pointer to next line to feed out. */ static char *optr = mtab_out; /* pointer to place where next line goes */ _PROTOTYPE(int load_mtab, (char *prog_name )); _PROTOTYPE(int rewrite_mtab, (char *prog_name )); _PROTOTYPE(int get_mtab_entry, (char *special, char *mounted_on, char *version, char *rw_flag)); _PROTOTYPE(int put_mtab_entry, (char *special, char *mounted_on, char *version, char *rw_flag)); _PROTOTYPE(void err, (char *prog_name, char *str )); int load_mtab(prog_name) char *prog_name; { /* Read in /etc/mtab and store it in /etc/mtab. */ int fd, n; char *ptr; /* Open the file. */ fd = open(etc_mtab, O_RDONLY); if (fd < 0) { err(prog_name, ": cannot open "); return(-1); } /* File opened. Read it in. */ n = read(fd, mtab_in, BUF_SIZE); if (n <= 0) { /* Read failed. */ err(prog_name, ": cannot read "); return(-1); } if (n == BUF_SIZE) { /* Some nut has mounted 50 file systems or something like that. */ std_err(prog_name); std_err(": file too large: "); std_err(etc_mtab); return(-1); } close(fd); /* Replace all the whitespace by '\0'. */ ptr = mtab_in; while (*ptr != '\0') { if (isspace(*ptr)) *ptr = '\0'; ptr++; } return(0); } int rewrite_mtab(prog_name) char *prog_name; { /* Write mtab_out to /etc/mtab. */ int fd, n; /* Do a creat to truncate the file. */ fd = creat(etc_mtab, 0777); if (fd < 0) { err(prog_name, ": cannot overwrite "); return(-1); } /* File created. Write it. */ n = write(fd, mtab_out, (unsigned int)(optr - mtab_out)); if (n <= 0) { /* Write failed. */ err(prog_name, " could not write "); return(-1); } close(fd); return(0); } int get_mtab_entry(special, mounted_on, version, rw_flag) char *special; char *mounted_on; char *version; char *rw_flag; { /* Return the next entry from mtab_in. */ if (iptr >= &mtab_in[BUF_SIZE]) { special[0] = '\0'; return(-1); } strcpy(special, iptr); while (isprint(*iptr)) iptr++; while (*iptr == '\0'&& iptr < &mtab_in[BUF_SIZE]) iptr++; strcpy(mounted_on, iptr); while (isprint(*iptr)) iptr++; while (*iptr == '\0'&& iptr < &mtab_in[BUF_SIZE]) iptr++; strcpy(version, iptr); while (isprint(*iptr)) iptr++; while (*iptr == '\0'&& iptr < &mtab_in[BUF_SIZE]) iptr++; strcpy(rw_flag, iptr); while (isprint(*iptr)) iptr++; while (*iptr == '\0'&& iptr < &mtab_in[BUF_SIZE]) iptr++; return(0); } int put_mtab_entry(special, mounted_on, version, rw_flag) char *special; char *mounted_on; char *version; char *rw_flag; { /* Append an entry to the mtab_out buffer. */ int n1, n2, n3, n4; n1 = strlen(special); n2 = strlen(mounted_on); n3 = strlen(version); n4 = strlen(rw_flag); if (optr + n1 + n2 + n3 + n4 + 5 >= &mtab_out[BUF_SIZE]) return(-1); strcpy(optr, special); optr += n1; *optr++ = ' '; strcpy(optr, mounted_on); optr += n2; *optr++ = ' '; strcpy(optr, version); optr += n3; *optr++ = ' '; strcpy(optr, rw_flag); optr += n4; *optr++ = '\n'; return(0); } void err(prog_name, str) char *prog_name, *str; { std_err(prog_name); std_err(str); std_err(etc_mtab); perror(" "); } /* * "nlist.c", Peter Valkenburg, january 1989. */ #include #include #include #include #include #include #include #define fail(fp) (fclose(fp), -1) /* ret. exp. when nlist fails */ _PROTOTYPE( int nlist, (char *file, struct nlist nl[])); /* * Nlist fills fields n_sclass and n_value of array nl with values found in * non-stripped executable file. Entries that are not found have their * n_value/n_sclass fields set to 0. Nl ends with a 0 or nul string n_name. * The return value is -1 on failure, else the number of entries not found. */ int nlist(file, nl) char *file; struct nlist nl[]; { int nents, nsrch, nfound, i; struct nlist nlent; FILE *fp; struct exec hd; /* open executable with namelist */ if ((fp = fopen(file, "r")) == NULL) return -1; /* get header and seek to start of namelist */ if (fread((char *) &hd, sizeof(struct exec), 1, fp) != 1 || BADMAG(hd) || fseek(fp, A_SYMPOS(hd), SEEK_SET) != 0) return fail(fp); /* determine number of entries searched for & reset fields */ nsrch = 0; while (nl[nsrch].n_name != NULL && *(nl[nsrch].n_name) != '\0') { nl[nsrch].n_sclass = 0; nl[nsrch].n_value = 0; nl[nsrch].n_type = 0; /* for compatability */ nsrch++; } /* loop through namelist & fill in user array */ nfound = 0; for (nents = (hd.a_syms & 0xFFFF) / sizeof(struct nlist); nents > 0; nents--) { if (nsrch == nfound) break; /* no need to look further */ if (fread((char *) &nlent, sizeof(struct nlist), 1, fp) != 1) return fail(fp); for (i = 0; i < nsrch; i++) if (nl[i].n_sclass == 0 && strncmp(nl[i].n_name, nlent.n_name, sizeof(nlent.n_name)) == 0) { nl[i] = nlent; nfound++; break; } } (void) fclose(fp); return nsrch - nfound; } /* Peek and poke using /dev/mem. * * Callers now ought to check the return values. * * Calling peek() requires read permission on /dev/mem, and consumes * a file descriptor. Calling poke() requires write permission, and * consumes another file descriptor. */ #include #include #include _PROTOTYPE( int peek, (unsigned segment, unsigned offset)); _PROTOTYPE( int poke, (unsigned segment, unsigned offset, unsigned value)); #define SEGSIZE 0x10 int peek(segment, offset) unsigned segment; unsigned offset; { unsigned char chvalue; static int infd = -1; if (infd < 0) infd = open("/dev/mem", O_RDONLY); if (infd < 0 || lseek(infd, (unsigned long) segment * SEGSIZE + offset, SEEK_SET) < 0 || read(infd, (char *) &chvalue, (unsigned) 1) != 1) return(-1); return(chvalue); } int poke(segment, offset, value) unsigned segment; unsigned offset; unsigned value; { unsigned char chvalue; static int outfd = -1; chvalue = value; if (outfd < 0) outfd = open("/dev/mem", O_WRONLY); if (outfd < 0 || lseek(outfd, (unsigned long) segment * SEGSIZE + offset, SEEK_SET) < 0 || write(outfd, (char *) &chvalue, (unsigned) 1) != 1) return(-1); return(chvalue); } /* * popen - open a pipe */ /* $Header: popen.c,v 1.3 90/08/28 14:53:34 eck Exp $ */ #include #include #include #include #include #if defined(__BSD4_2) union wait { int w_status; }; typedef union wait wait_arg; #else typedef int wait_arg; #endif /* __BSD4_2 */ #include "../stdio/loc_incl.h" #ifdef _ANSI int _close(int d); int _dup2(int oldd, int newd); /* not present in System 5 */ int _execl(const char *name, const char *_arg, ... ); pid_t _fork(void); int _pipe(int fildes[2]); pid_t _wait(wait_arg *status); void _exit(int status); #endif static int pids[OPEN_MAX]; FILE * popen(command, type) _CONST char *command; _CONST char *type; { int piped[2]; int Xtype = *type == 'r' ? 0 : *type == 'w' ? 1 : 2; int pid; if (Xtype == 2 || _pipe(piped) < 0 || (pid = _fork()) < 0) return 0; if (pid == 0) { /* child */ register int *p; for (p = pids; p < &pids[OPEN_MAX]; p++) { if (*p) _close((int)(p - pids)); } _close(piped[Xtype]); _dup2(piped[!Xtype], !Xtype); _close(piped[!Xtype]); _execl("/bin/sh", "sh", "-c", command, (char *) 0); _exit(127); /* like system() ??? */ } pids[piped[Xtype]] = pid; _close(piped[!Xtype]); return fdopen(piped[Xtype], type); } #if defined(__BSD4_2) #define ret_val status.w_status #else #define ret_val status #endif int pclose(stream) FILE *stream; { int fd = fileno(stream); wait_arg status; int wret; #ifdef _ANSI void (*intsave)(int) = signal(SIGINT, SIG_IGN); void (*quitsave)(int) = signal(SIGQUIT, SIG_IGN); #else void (*intsave)() = signal(SIGINT, SIG_IGN); void (*quitsave)() = signal(SIGQUIT, SIG_IGN); #endif fclose(stream); while ((wret = _wait(&status)) != -1) { if (wret == pids[fd]) break; } if (wret == -1) ret_val = -1; signal(SIGINT, intsave); signal(SIGQUIT, quitsave); pids[fd] = 0; return ret_val; } #if defined(__USG) int _dup(int fildes); static int _dup2(oldd, newd) int oldd, newd; { int i = 0, fd, tmp; int fdbuf[_NFILES]; /* ignore the error on the close() */ tmp = errno; (void) _close(newd); errno = tmp; while ((fd = _dup(oldd)) != newd) { if (fd == -1) break; fdbuf[i++] = fd; } tmp = errno; while (--i >= 0) { _close(fdbuf[i]); } errno = tmp; return -(fd == -1); } #endif /* __USG */ /* config_read(), _delete(), _length() - Generic config file routines. * Author: Kees J. Bot * 5 Jun 1999 */ #define nil ((void*)0) #if __minix_vmd #include #else #define fstat _fstat #define stat _stat #endif #include #include #include #include #include #include #include #include #if __minix_vmd #include #else #include #endif #define _c /* not const */ #include typedef struct configfile { /* List of (included) configuration files. */ struct configfile *next; /* A list indeed. */ time_t ctime; /* Last changed time, -1 if no file. */ char name[1]; /* File name. */ } configfile_t; /* Size of a configfile_t given a file name of length 'len'. */ #define configfilesize(len) (offsetof(configfile_t, name) + 1 + (len)) typedef struct firstconfig { /* First file and first word share a slot. */ configfile_t *filelist; char new; /* Set when created. */ config_t config1; } firstconfig_t; /* Size of a config_t given a word of lenght 'len'. Same for firstconfig_t. */ #define config0size() (offsetof(config_t, word)) #define configsize(len) (config0size() + 1 + (len)) #define firstconfigsize(len) \ (offsetof(firstconfig_t, config1) + configsize(len)) /* Translate address of first config word to enclosing firstconfig_t and vv. */ #define cfg2fcfg(p) \ ((firstconfig_t *) ((char *) (p) - offsetof(firstconfig_t, config1))) #define fcfg2cfg(p) (&(p)->config1) /* Variables used while building data. */ static configfile_t *c_files; /* List of (included) config files. */ static int c_flags; /* Flags argument of config_read(). */ static FILE *c_fp; /* Current open file. */ static char *c_file; /* Current open file name. */ static unsigned c_line; /* Current line number. */ static int c; /* Next character. */ static void *allocate(void *mem, size_t size) /* Like realloc(), but checked. */ { if ((mem= realloc(mem, size)) == nil) { fprintf(stderr, "\"%s\", line %u: Out of memory\n", c_file, c_line); exit(1); } return mem; } #define deallocate(mem) free(mem) static void delete_filelist(configfile_t *cfgf) /* Delete configuration file list. */ { void *junk; while (cfgf != nil) { junk= cfgf; cfgf= cfgf->next; deallocate(junk); } } static void delete_config(config_t *cfg) /* Delete configuration file data. */ { config_t *next, *list, *junk; next= cfg; list= nil; for (;;) { if (next != nil) { /* Push the 'next' chain in reverse on the 'list' chain, putting * a leaf cell (next == nil) on top of 'list'. */ junk= next; next= next->next; junk->next= list; list= junk; } else if (list != nil) { /* Delete the leaf cell. If it has a sublist then that becomes * the 'next' chain. */ junk= list; next= list->list; list= list->next; deallocate(junk); } else { /* Both chains are gone. */ break; } } } void config_delete(config_t *cfg1) /* Delete configuration file data, being careful with the odd first one. */ { firstconfig_t *fcfg= cfg2fcfg(cfg1); delete_filelist(fcfg->filelist); delete_config(fcfg->config1.next); delete_config(fcfg->config1.list); deallocate(fcfg); } static void nextc(void) /* Read the next character of the current file into 'c'. */ { if (c == '\n') c_line++; c= getc(c_fp); if (c == EOF && ferror(c_fp)) { fprintf(stderr, "\"%s\", line %u: %s\n", c_file, c_line, strerror(errno)); exit(1); } } static void skipwhite(void) /* Skip whitespace and comments. */ { while (isspace(c)) { nextc(); if (c == '#') { do nextc(); while (c != EOF && c != '\n'); } } } static void parse_err(void) /* Tell user that you can't parse past the current character. */ { char sc[2]; sc[0]= c; sc[1]= 0; fprintf(stderr, "\"%s\", line %u: parse error at '%s'\n", c_file, c_line, c == EOF ? "EOF" : sc); exit(1); } static config_t *read_word(void) /* Read a word or string. */ { config_t *w; size_t i, len; int q; static char SPECIAL[] = "!#$%&*+-./:<=>?[\\]^_|~"; i= 0; len= 32; w= allocate(nil, configsize(32)); w->next= nil; w->list= nil; w->file= c_file; w->line= c_line; w->flags= 0; /* Is it a quoted string? */ if (c == '\'' || c == '"') { q= c; /* yes */ nextc(); } else { q= -1; /* no */ } for (;;) { if (i == len) { len+= 32; w= allocate(w, configsize(len)); } if (q == -1) { /* A word consists of letters, numbers and a few special chars. */ if (!isalnum(c) && c < 0x80 && strchr(SPECIAL, c) == nil) break; } else { /* Strings are made up of anything except newlines. */ if (c == EOF || c == '\n') { fprintf(stderr, "\"%s\", line %u: string at line %u not closed\n", c_file, c_line, w->line); exit(1); break; } if (c == q) { /* Closing quote? */ nextc(); break; } } if (c != '\\') { /* Simply add non-escapes. */ w->word[i++]= c; nextc(); } else { /* Interpret an escape. */ nextc(); if (isspace(c)) { skipwhite(); continue; } if (c_flags & CFG_ESCAPED) { w->word[i++]= '\\'; /* Keep the \ for the caller. */ if (i == len) { len+= 32; w= allocate(w, configsize(len)); } w->flags |= CFG_ESCAPED; } if (isdigit(c)) { /* Octal escape */ int n= 3; int d= 0; do { d= d * 010 + (c - '0'); nextc(); } while (--n > 0 && isdigit(c)); w->word[i++]= d; } else if (c == 'x' || c == 'X') { /* Hex escape */ int n= 2; int d= 0; nextc(); if (!isxdigit(c)) { fprintf(stderr, "\"%s\", line %u: bad hex escape\n", c_file, c_line); exit(1); } do { d= d * 0x10 + (islower(c) ? (c - 'a' + 0xa) : isupper(c) ? (c - 'A' + 0xA) : (c - '0')); nextc(); } while (--n > 0 && isxdigit(c)); w->word[i++]= d; } else { switch (c) { case 'a': c= '\a'; break; case 'b': c= '\b'; break; case 'e': c= '\033'; break; case 'f': c= '\f'; break; case 'n': c= '\n'; break; case 'r': c= '\r'; break; case 's': c= ' '; break; case 't': c= '\t'; break; case 'v': c= '\v'; break; default: /* Anything else is kept as-is. */; } w->word[i++]= c; nextc(); } } } w->word[i]= 0; if (q != -1) { w->flags |= CFG_STRING; } else { int f; char *end; static char base[]= { 0, 010, 10, 0x10 }; if (i == 0) parse_err(); /* Can the word be used as a number? */ for (f= 0; f < 4; f++) { (void) strtol(w->word, &end, base[f]); if (*end == 0) w->flags |= 1 << (f + 0); (void) strtoul(w->word, &end, base[f]); if (*end == 0) w->flags |= 1 << (f + 4); } } return allocate(w, configsize(i)); } static config_t *read_file(const char *file); static config_t *read_list(void); static config_t *read_line(void) /* Read and return one line of the config file. */ { config_t *cline, **pcline, *clist; cline= nil; pcline= &cline; for (;;) { skipwhite(); if (c == EOF || c == '}') { if(0) if (cline != nil) parse_err(); break; } else if (c == ';') { nextc(); if (cline != nil) break; } else if (cline != nil && c == '{') { /* A sublist. */ nextc(); clist= allocate(nil, config0size()); clist->next= nil; clist->file= c_file; clist->line= c_line; clist->list= read_list(); clist->flags= CFG_SUBLIST; *pcline= clist; pcline= &clist->next; if (c != '}') parse_err(); nextc(); } else { *pcline= read_word(); pcline= &(*pcline)->next; } } return cline; } static config_t *read_list(void) /* Read and return a list of config file commands. */ { config_t *clist, **pclist, *cline; clist= nil; pclist= &clist; while ((cline= read_line()) != nil) { if (strcmp(cline->word, "include") == 0) { config_t *file= cline->next; if (file == nil || file->next != nil || !config_isatom(file)) { fprintf(stderr, "\"%s\", line %u: 'include' command requires an arg222222ument\n", c_file, cline->line); exit(1); } if (file->flags & CFG_ESCAPED) { char *p, *q; p= q= file->word; for (;;) { if ((*q = *p) == '\\') *q = *++p; if (*q == 0) break; p++; q++; } } file= read_file(file->word); delete_config(cline); *pclist= file; while (*pclist != nil) pclist= &(*pclist)->next; } else { config_t *cfg= allocate(nil, config0size()); cfg->next= nil; cfg->list= cline; cfg->file= cline->file; cfg->line= cline->line; cfg->flags= CFG_SUBLIST; *pclist= cfg; pclist= &cfg->next; } } return clist; } static config_t *read_file(const char *file) /* Read and return a configuration file. */ { configfile_t *cfgf; config_t *cfg; struct stat st; FILE *old_fp; /* old_* variables store current file context. */ char *old_file; unsigned old_line; int old_c; size_t n; char *slash; old_fp= c_fp; old_file= c_file; old_line= c_line; old_c= c; n= 0; if (file[0] != '/' && old_file != nil && (slash= strrchr(old_file, '/')) != nil) { n= slash - old_file + 1; } cfgf= allocate(nil, configfilesize(n + strlen(file))); memcpy(cfgf->name, old_file, n); strcpy(cfgf->name + n, file); cfgf->next= c_files; c_files= cfgf; c_file= cfgf->name; c_line= 0; if ((c_fp= fopen(file, "r")) == nil || fstat(fileno(c_fp), &st) < 0) { if (errno != ENOENT) { fprintf(stderr, "\"%s\", line 1: %s\n", file, strerror(errno)); exit(1); } cfgf->ctime= -1; c= EOF; } else { cfgf->ctime= st.st_ctime; c= '\n'; } cfg= read_list(); if (c != EOF) parse_err(); if (c_fp != nil) fclose(c_fp); c_fp= old_fp; c_file= old_file; c_line= old_line; c= old_c; return cfg; } config_t *config_read(const char *file, int flags, config_t *cfg) /* Read and parse a configuration file. */ { if (cfg != nil) { /* First check if any of the involved files has changed. */ firstconfig_t *fcfg; configfile_t *cfgf; struct stat st; fcfg= cfg2fcfg(cfg); for (cfgf= fcfg->filelist; cfgf != nil; cfgf= cfgf->next) { if (stat(cfgf->name, &st) < 0) { if (errno != ENOENT) break; st.st_ctime= -1; } if (st.st_ctime != cfgf->ctime) break; } if (cfgf == nil) return cfg; /* Everything as it was. */ config_delete(cfg); /* Otherwise delete and reread. */ } errno= 0; c_files= nil; c_flags= flags; cfg= read_file(file); if (cfg != nil) { /* Change first word to have a hidden pointer to a file list. */ size_t len= strlen(cfg->word); firstconfig_t *fcfg; fcfg= allocate(cfg, firstconfigsize(len)); memmove(&fcfg->config1, fcfg, configsize(len)); fcfg->filelist= c_files; fcfg->new= 1; return fcfg2cfg(fcfg); } /* Couldn't read (errno != 0) of nothing read (errno == 0). */ delete_filelist(c_files); delete_config(cfg); return nil; } int config_renewed(config_t *cfg) { int new; if (cfg == nil) { new= 1; } else { new= cfg2fcfg(cfg)->new; cfg2fcfg(cfg)->new= 0; } return new; } size_t config_length(config_t *cfg) /* Count the number of items on a list. */ { size_t n= 0; while (cfg != nil) { n++; cfg= cfg->next; } return n; } #if TEST #include static void print_list(int indent, config_t *cfg); static void print_words(int indent, config_t *cfg) { while (cfg != nil) { if (config_isatom(cfg)) { if (config_isstring(cfg)) fputc('"', stdout); printf("%s", cfg->word); if (config_isstring(cfg)) fputc('"', stdout); } else { printf("{\n"); print_list(indent+4, cfg->list); printf("%*s}", indent, ""); } cfg= cfg->next; if (cfg != nil) fputc(' ', stdout); } printf(";\n"); } static void print_list(int indent, config_t *cfg) { while (cfg != nil) { if (!config_issub(cfg)) { fprintf(stderr, "Cell at \"%s\", line %u is not a sublist\n"); break; } printf("%*s", indent, ""); print_words(indent, cfg->list); cfg= cfg->next; } } static void print_config(config_t *cfg) { if (!config_renewed(cfg)) { printf("# Config didn't change\n"); } else { print_list(0, cfg); } } int main(int argc, char **argv) { config_t *cfg; int c; if (argc != 2) { fprintf(stderr, "One config file name please\n"); exit(1); } cfg= nil; do { cfg= config_read(argv[1], CFG_ESCAPED, cfg); print_config(cfg); if (!isatty(0)) break; while ((c= getchar()) != EOF && c != '\n') {} } while (c != EOF); return 0; } #endif /* TEST */ /* * (c) copyright 1989 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: putenv.c,v 1.3 90/05/14 12:30:18 ceriel Exp $ */ #include #include #define ENTRY_INC 10 #define rounded(x) (((x / ENTRY_INC) + 1) * ENTRY_INC) extern _CONST char ***_penviron; int putenv(name) _CONST char *name; { register _CONST char **v = *_penviron; register char *r; static int size = 0; /* When size != 0, it contains the number of entries in the * table (including the final NULL pointer). This means that the * last non-null entry is environ[size - 2]. */ if (!name) return 0; if (*_penviron == NULL) return 1; if (r = strchr(name, '=')) { register _CONST char *p, *q; *r = '\0'; if (v != NULL) { while ((p = *v) != NULL) { q = name; while (*q && (*q++ == *p++)) /* EMPTY */ ; if (*q || (*p != '=')) { v++; } else { /* The name was already in the * environment. */ *r = '='; *v = name; return 0; } } } *r = '='; v = *_penviron; } if (!size) { register _CONST char **p; register int i = 0; if (v) do { i++; } while (*v++); if (!(v = malloc(rounded(i) * sizeof(char **)))) return 1; size = i; p = *_penviron; *_penviron = v; while (*v++ = *p++); /* copy the environment */ v = *_penviron; } else if (!(size % ENTRY_INC)) { if (!(v = realloc(*_penviron, rounded(size) * sizeof(char **)))) return 1; *_penviron = v; } v[size - 1] = name; v[size] = NULL; size++; return 0; } /* * putw - write an word on a stream */ /* $Header: putw.c,v 1.1 89/12/18 14:40:15 eck Exp $ */ #include _PROTOTYPE(int putw, (int w, FILE *stream )); int putw(w, stream) int w; register FILE *stream; { register int cnt = sizeof(int); register char *p = (char *) &w; while (cnt--) { putc(*p++, stream); } if (ferror(stream)) return EOF; return w; } /* regcomp and regexec -- regsub and regerror are elsewhere * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in * regular-expression syntax might require a total rethink. * * The third parameter to regexec was added by Martin C. Atkins. * Andy Tanenbaum also made some changes. */ #include #include #include #include #include #include /* The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 /* The "internal use only" fields in regexp.h are present to pass info from * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * * regstart char that must begin a match; '\0' if none obvious * reganch is the match anchored (at beginning-of-line only)? * regmust string (pointer into program) that match must include, or NULL * regmlen length of regmust string * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection * of lines that cannot possibly match. The regmust tests are costly enough * that regcomp() supplies a regmust only if the r.e. contains something * potentially expensive (at present, the only such thing detected is * or + * at the start of the r.e., which can involve a lot of backup). Regmlen is * supplied because the test in regexec() needs it and regcomp() is computing * it anyway. */ /* Structure for regexp "program". This is essentially a linear encoding * of a nondeterministic finite-state machine (aka syntax charts or * "railroad normal form" in parsing technology). Each node is an opcode * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH implement concatenation; a "next" pointer with * a BRANCH on both ends of it is connecting two alternatives. (Here we * have one of the subtle syntax dependencies: an individual BRANCH (as * opposed to a collection of them) is never concatenated with anything * because of operator precedence.) The operand of some types of node is * a literal string; for others, it is a node leading into a sub-FSM. In * particular, the operand of a BRANCH node is the first node of the branch. * (NB this is *not* a tree structure: the tail of the branch connects * to the thing following the set of BRANCHes.) The opcodes are: */ /* Definition number opnd? meaning */ #define END 0 /* no End of program. */ #define BOL 1 /* no Match "" at beginning of line. */ #define EOL 2 /* no Match "" at end of line. */ #define ANY 3 /* no Match any one character. */ #define ANYOF 4 /* str Match any character in this string. */ #define ANYBUT 5 /* str Match any character not in this * string. */ #define BRANCH 6 /* node Match this alternative, or the * next... */ #define BACK 7 /* no Match "", "next" ptr points backward. */ #define EXACTLY 8 /* str Match this string. */ #define NOTHING 9 /* no Match empty string. */ #define STAR 10 /* node Match this (simple) thing 0 or more * times. */ #define PLUS 11 /* node Match this (simple) thing 1 or more * times. */ #define OPEN 20 /* no Mark this point in input as start of * #n. */ /* OPEN+1 is number 1, etc. */ #define CLOSE 30 /* no Analogous to OPEN. */ /* Opcode notes: * * BRANCH The set of branches constituting a single choice are hooked * together with their "next" pointers, since precedence prevents * anything being concatenated to any individual branch. The * "next" pointer of the last BRANCH in a choice points to the * thing following the whole choice. This is also where the * final "next" pointer of each individual branch points; each * branch starts with the operand node of a BRANCH node. * * BACK Normal "next" pointers all implicitly point forward; BACK * exists to make loop structures possible. * * STAR,PLUS '?', and complex '*' and '+', are implemented as circular * BRANCH structures using BACK. Simple cases (one character * per match) are implemented with STAR and PLUS for speed * and to minimize recursive plunges. * * OPEN,CLOSE ...are numbered at compile time. */ /* A node is one char of opcode followed by two chars of "next" pointer. * "Next" pointers are stored as two 8-bit pieces, high order first. The * value is a positive offset from the opcode of the node containing it. * An operand, if any, simply follows the node. (Note that much of the * code generation knows about this implicit relationship.) * * Using two bytes for the "next" pointer is vast overkill for most things, * but allows patterns to get big without disasters. */ #define OP(p) (*(p)) #define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) #define OPERAND(p) ((p) + 3) /* Utility definitions. */ #ifndef CHARBITS #define UCHARAT(p) ((int)*(unsigned char *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif #define CFAIL(m) { regerror(m); return((char *)NULL); } #define RFAIL(m) { regerror(m); return((regexp *)NULL); } #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') #define META "^$.[()|?+*\\" /* Flags to be passed up and down. */ #define HASWIDTH 01 /* Known never to match null string. */ #define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ #define SPSTART 04 /* Starts with * or +. */ #define WORST 0 /* Worst case. */ /* Global work variables for regcomp(). */ PRIVATE char *regparse; /* Input-scan pointer. */ PRIVATE int regnpar; /* () count. */ PRIVATE char regdummy; PRIVATE char *regcode; /* Code-emit pointer; ®dummy = don't. */ PRIVATE long regsize; /* Code size. */ /* Forward declarations for regcomp()'s friends. */ #ifndef STATIC #define STATIC PRIVATE #endif STATIC _PROTOTYPE( char *reg, (int paren, int *flagp) ); STATIC _PROTOTYPE( char *regbranch, (int *flagp) ); STATIC _PROTOTYPE( char *regpiece, (int *flagp) ); STATIC _PROTOTYPE( char *regatom, (int *flagp) ); STATIC _PROTOTYPE( char *regnode, (int op) ); STATIC _PROTOTYPE( char *regnext, (char *p) ); STATIC _PROTOTYPE( void regc, (int b) ); STATIC _PROTOTYPE( void reginsert, (int op, char *opnd) ); STATIC _PROTOTYPE( void regtail, (char *p, char *val) ); STATIC _PROTOTYPE( void regoptail, (char *p, char *val) ); /* - regcomp - compile a regular expression into internal code * * We can't allocate space until we know how big the compiled form will be, * but we can't compile it (and thus know how big it is) until we've got a * place to put the code. So we cheat: we compile it twice, once with code * generation turned off and size counting turned on, and once "for real". * This also means that we don't allocate space until we are sure that the * thing really will compile successfully, and we never have to move the * code and thus invalidate pointers into it. (Note that it has to be in * one piece because free() must be able to free it all.) * * Beware that the optimization-preparation code in here knows about some * of the structure of the compiled regexp. */ regexp *regcomp(exp) char *exp; { register regexp *r; register char *scan; register char *longest; register int len; int flags; if (exp == (char *)NULL) RFAIL("NULL argument"); /* First pass: determine size, legality. */ regparse = exp; regnpar = 1; 222222222222222222222 regsize = 0L; regcode = ®dummy; regc(MAGIC); if (reg(0, &flags) == (char *)NULL) return((regexp *)NULL); /* Small enough for pointer-storage convention? */ if (regsize >= 32767L) /* Probably could be 65535L. */ RFAIL("regexp too big"); /* Allocate space. */ r = (regexp *) malloc(sizeof(regexp) + (unsigned) regsize); if (r == (regexp *)NULL) RFAIL("out of space"); /* Second pass: emit code. */ regparse = exp; regnpar = 1; regcode = r->program; regc(MAGIC); if (reg(0, &flags) == (char *)NULL) return((regexp *)NULL); /* Dig out information for optimizations. */ r->regstart = '\0'; /* Worst-case defaults. */ r->reganch = 0; r->regmust = (char *)NULL; r->regmlen = 0; scan = r->program + 1; /* First BRANCH. */ if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ scan = OPERAND(scan); /* Starting-point info. */ if (OP(scan) == EXACTLY) r->regstart = *OPERAND(scan); else if (OP(scan) == BOL) r->reganch++; /* If there's something expensive in the r.e., find the * longest literal string that must appear and make it the * regmust. Resolve ties in favor of later strings, since * the regstart check works with the beginning of the r.e. * and avoiding duplication strengthens checking. Not a * strong reason, but sufficient in the absence of others. */ if (flags & SPSTART) { longest = (char *)NULL; len = 0; for (; scan != (char *)NULL; scan = regnext(scan)) if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) { longest = OPERAND(scan); len = strlen(OPERAND(scan)); } r->regmust = longest; r->regmlen = len; } } return(r); } /* - reg - regular expression, i.e. main body or parenthesized thing * * Caller must absorb opening parenthesis. * * Combining parenthesis handling with the base level of regular expression * is a trifle forced, but the need to tie the tails of the branches to what * follows makes it hard to avoid. */ PRIVATE char *reg(paren, flagp) int paren; /* Parenthesized? */ int *flagp; { register char *ret; register char *br; register char *ender; register int parno; int flags; *flagp = HASWIDTH; /* Tentatively. */ /* Make an OPEN node, if parenthesized. */ if (paren) { if (regnpar >= NSUBEXP) CFAIL("too many ()"); parno = regnpar; regnpar++; ret = regnode(OPEN + parno); } else { parno = 0; /* not actually used, keep compiler quiet */ ret = (char *)NULL; } /* Pick up the branches, linking them together. */ br = regbranch(&flags); if (br == (char *)NULL) return((char *)NULL); if (ret != (char *)NULL) regtail(ret, br); /* OPEN -> first. */ else ret = br; if (!(flags & HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags & SPSTART; while (*regparse == '|') { regparse++; br = regbranch(&flags); if (br == (char *)NULL) return((char *)NULL); regtail(ret, br); /* BRANCH -> BRANCH. */ if (!(flags & HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags & SPSTART; } /* Make a closing node, and hook it on the end. */ ender = regnode((paren) ? CLOSE + parno : END); regtail(ret, ender); /* Hook the tails of the branches to the closing node. */ for (br = ret; br != (char *)NULL; br = regnext(br)) regoptail(br, ender); /* Check for proper termination. */ if (paren && *regparse++ != ')') { CFAIL("unmatched ()"); } else if (!paren && *regparse != '\0') { if (*regparse == ')') { CFAIL("unmatched ()"); } else CFAIL("junk on end"); /* "Can't happen". */ /* NOTREACHED */ } return(ret); } /* - regbranch - one alternative of an | operator * * Implements the concatenation operator. */ PRIVATE char *regbranch(flagp) int *flagp; { register char *ret; register char *chain; register char *latest; int flags; *flagp = WORST; /* Tentatively. */ ret = regnode(BRANCH); chain = (char *)NULL; while (*regparse != '\0' && *regparse != '|' && *regparse != ')') { latest = regpiece(&flags); if (latest == (char *)NULL) return((char *)NULL); *flagp |= flags & HASWIDTH; if (chain == (char *)NULL) /* First piece. */ *flagp |= flags & SPSTART; else regtail(chain, latest); chain = latest; } if (chain == (char *)NULL) /* Loop ran zero times. */ regnode(NOTHING); return(ret); } /* - regpiece - something followed by possible [*+?] * * Note that the branching code sequences used for ? and the general cases * of * and + are somewhat optimized: they use the same NOTHING node as * both the endmarker for their branch list and the body of the last branch. * It might seem that this node could be dispensed with entirely, but the * endmarker role is not redundant. */ PRIVATE char *regpiece(flagp) int *flagp; { register char *ret; register char op; register char *next; int flags; ret = regatom(&flags); if (ret == (char *)NULL) return((char *)NULL); op = *regparse; if (!ISMULT(op)) { *flagp = flags; return(ret); } if (!(flags & HASWIDTH) && op != '?') CFAIL("*+ operand could be empty"); *flagp = (op != '+') ? (WORST | SPSTART) : (WORST | HASWIDTH); if (op == '*' && (flags & SIMPLE)) reginsert(STAR, ret); else if (op == '*') { /* Emit x* as (x&|), where & means "self". */ reginsert(BRANCH, ret); /* Either x */ regoptail(ret, regnode(BACK)); /* and loop */ regoptail(ret, ret); /* back */ regtail(ret, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '+' && (flags & SIMPLE)) reginsert(PLUS, ret); else if (op == '+') { /* Emit x+ as x(&|), where & means "self". */ next = regnode(BRANCH); /* Either */ regtail(ret, next); regtail(regnode(BACK), ret); /* loop back */ regtail(next, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '?') { /* Emit x? as (x|) */ reginsert(BRANCH, ret); /* Either x */ regtail(ret, regnode(BRANCH)); /* or */ next = regnode(NOTHING);/* null. */ regtail(ret, next); regoptail(ret, next); } regparse++; if (ISMULT(*regparse)) CFAIL("nested *?+"); return(ret); } /* - regatom - the lowest level * * Optimization: gobbles an entire sequence of ordinary characters so that * it can turn them into a single node, which is smaller to store and * faster to run. Backslashed characters are exceptions, each becoming a * separate node; the code is simpler that way and it's not worth fixing. */ PRIVATE char *regatom(flagp) int *flagp; { register char *ret; int flags; *flagp = WORST; /* Tentatively. */ switch (*regparse++) { case '^': ret = regnode(BOL); break; case '$': ret = regnode(EOL); break; case '.': ret = regnode(ANY); *flagp |= HASWIDTH | SIMPLE; break; case '[':{ register int class; register int classend; if (*regparse == '^') { /* Complement of range. */ ret = regnode(ANYBUT); regparse++; } else ret = regnode(ANYOF); if (*regparse == ']' || *regparse == '-') regc(*regparse++); while (*regparse != '\0' && *regparse != ']') { if (*regparse == '-') { regparse++; if (*regparse == ']' || *regparse == '\0') regc('-'); else { class = UCHARAT(regparse - 2) + 1; classend = UCHARAT(regparse); if (class > classend + 1) CFAIL("invalid [] range"); for (; class <= classend; class++) regc(class); regparse++; } } else regc(*regparse++); } regc('\0'); if (*regparse != ']') CFAIL("unmatched []"); regparse++; *flagp |= HASWIDTH | SIMPLE; } break; case '(': ret = reg(1, &flags); if (ret == (char *)NULL) return((char *)NULL); *flagp |= flags & (HASWIDTH | SPSTART); break; case '\0': case '|': case ')': CFAIL("internal urp"); /* Supposed to be caught earlier. */ break; case '?': case '+': case '*': CFAIL("?+* follows nothing"); break; case '\\': if (*regparse == '\0') CFAIL("trailing \\"); ret = regnode(EXACTLY); regc(*regparse++); regc('\0'); *flagp |= HASWIDTH | SIMPLE; break; default:{ register int len; register char ender; regparse--; len = strcspn(regparse, META); if (len <= 0) CFAIL("internal disaster"); ender = *(regparse + len); if (len > 1 && ISMULT(ender)) len--; /* Back off clear of ?+* operand. */ *flagp |= HASWIDTH; if (len == 1) *flagp |= SIMPLE; ret = regnode(EXACTLY); while (len > 0) { regc(*regparse++); len--; } regc('\0'); } break; } return(ret); } /* - regnode - emit a node */ PRIVATE char *regnode(op) char op; { register char *ret; register char *ptr; ret = regcode; if (ret == ®dummy) { regsize += 3; return(ret); } ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0'; regcode = ptr; return(ret); } /* - regc - emit (if appropriate) a byte of code */ PRIVATE void regc(b) char b; { if (regcode != ®dummy) *regcode++ = b; else regsize++; } /* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */ PRIVATE void reginsert(op, opnd) char op; char *opnd; { register char *src; register char *dst; register char *place; if (regcode == ®dummy) { regsize += 3; return; } src = regcode; regcode += 3; dst = regcode; while (src > opnd) *--dst = *--src; place = opnd; /* Op node, where operand used to be. */ *place++ = op; *place++ = '\0'; *place++ = '\0'; } /* - regtail - set the next-pointer at the end of a node chain */ PRIVATE void regtail(p, val) char *p; char *val; { register char *scan; register char *temp; register int offset; if (p == ®dummy) return; /* Find last node. */ scan = p; for (;;) { temp = regnext(scan); if (temp == (char *)NULL) break; scan = temp; } if (OP(scan) == BACK) offset = scan - val; else offset = val - scan; *(scan + 1) = (offset >> 8) & 0377; *(scan + 2) = offset & 0377; } /* - regoptail - regtail on operand of first argument; nop if operandless */ PRIVATE void regoptail(p, val) char *p; char *val; { /* "Operandless" and "op != BRANCH" are synonymous in practice. */ if (p == (char *)NULL || p == ®dummy || OP(p) != BRANCH) return; regtail(OPERAND(p), val); } /* regexec and friends */ /* Global work variables for regexec(). */ PRIVATE char *reginput; /* String-input pointer. */ PRIVATE char *regbol; /* Beginning of input, for ^ check. */ PRIVATE char **regstartp; /* Pointer to startp array. */ PRIVATE char **regendp; /* Ditto for endp. */ /* Forwards. */ STATIC _PROTOTYPE( int regtry, (regexp *prog, char *string) ); STATIC _PROTOTYPE( int regmatch, (char *prog) ); STATIC _PROTOTYPE( int regrepeat, (char *p) ); #ifdef DEBUG int regnarrate = 0; void regdump(); STATIC _PROTOTYPE( char *regprop, (char *op) ); #endif /* - regexec - match a regexp against a string */ int regexec(prog, string, bolflag) register regexp *prog; register char *string; int bolflag; { register char *s; /* Be paranoid... */ if (prog == (regexp *)NULL || string == (char *)NULL) { regerror("NULL parameter"); return(0); } /* Check validity of program. */ if (UCHARAT(prog->program) != MAGIC) { regerror("corrupted program"); return(0); } /* If there is a "must appear" string, look for it. */ if (prog->regmust != (char *)NULL) { s = string; while ((s = strchr(s, prog->regmust[0])) != (char *)NULL) { if (strncmp(s, prog->regmust, prog->regmlen) == 0) break; /* Found it. */ s++; } if (s == (char *)NULL) /* Not present. */ return(0); } /* Mark beginning of line for ^ . */ if (bolflag) regbol = string; else regbol = (char *)NULL; /* Simplest case: anchored match need be tried only once. */ if (prog->reganch) return(regtry(prog, string)); /* Messy cases: unanchored match. */ s = string; if (prog->regstart != '\0') /* We know what char it must start with. */ while ((s = strchr(s, prog->regstart)) != (char *)NULL) { if (regtry(prog, s)) return(1); s++; } else /* We don't -- general case. */ do { if (regtry(prog, s)) return(1); } while (*s++ != '\0'); /* Failure. */ return(0); } /* - regtry - try match at specific point */ PRIVATE int regtry(prog, string) /* 0 failure, 1 success */ regexp *prog; char *string; { register int i; register char **sp; register char **ep; reginput = string; regstartp = prog->startp; regendp = prog->endp; sp = prog->startp; ep = prog->endp; for (i = NSUBEXP; i > 0; i--) { *sp++ = (char *)NULL; *ep++ = (char *)NULL; } if (regmatch(prog->program + 1)) { prog->startp[0] = string; prog->endp[0] = reginput; return(1); } else return(0); } /* - regmatch - main matching routine * * Conceptually the strategy is simple: check to see whether the current * node matches, call self recursively to see whether the rest matches, * and then act accordingly. In practice we make some effort to avoid * recursion, in particular by going through "ordinary" nodes (that don't * need to know whether the rest of the match failed) by a loop instead of * by recursion. */ PRIVATE int regmatch(prog) /* 0 failure, 1 success */ char *prog; { register char *scan; /* Current node. */ char *next; /* Next node. */ scan = prog; #ifdef DEBUG if (scan != (char *)NULL && regnarrate) fprintf(stderr, "%s(\n", regprop(scan)); #endif while (scan != (char *)NULL) { #ifdef DEBUG if (regnarrate) fprintf(stderr, "%s...\n", regprop(scan)); #endif next = regnext(scan); switch (OP(scan)) { case BOL: if (reginput != regbol) return(0); break; case EOL: if (*reginput != '\0') return(0); break; case ANY: if (*reginput == '\0') return(0); reginput++; break; case EXACTLY:{ register int len; register char *opnd; opnd = OPERAND(scan); /* Inline the first character, for speed. */ if (*opnd != *reginput) return(0); len = strlen(opnd); if (len > 1 && strncmp(opnd, reginput, len) != 0) return(0); reginput += len; } break; case ANYOF: if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) == (char *)NULL) return(0); reginput++; break; case ANYBUT: if (*reginput == '\0' || strchr(OPERAND(scan), *reginput) != (char *)NULL) return(0); reginput++; break; case NOTHING: break; case BACK: break; case OPEN + 1: case OPEN + 2: case OPEN + 3: case OPEN + 4: case OPEN + 5: case OPEN + 6: case OPEN + 7: case OPEN + 8: case OPEN + 9:{ register int no; register char *save; no = OP(scan) - OPEN; save = reginput; if (regmatch(next)) { /* Don't set startp if some later * invocation of the same parentheses * already has. */ if (regstartp[no] == (char *)NULL) regstartp[no] = save; return(1); } else return(0); } break; case CLOSE + 1: case CLOSE + 2: case CLOSE + 3: case CLOSE + 4: case CLOSE + 5: case CLOSE + 6: case CLOSE + 7: case CLOSE + 8: case CLOSE + 9:{ register int no; register char *save; no = OP(scan) - CLOSE; save = reginput; if (regmatch(next)) { /* Don't set endp if some later * invocation of the same parentheses * already has. */ if (regendp[no] == (char *)NULL) regendp[no] = save; return(1); } else return(0); } break; case BRANCH:{ register char *save; if (OP(next) != BRANCH) /* No choice. */ next = OPERAND(scan); /* Avoid recursion. */ else { do { save = reginput; if (regmatch(OPERAND(scan))) return(1); reginput = save; scan = regnext(scan); } while (scan != (char *)NULL && OP(scan) == BRANCH); return(0); /* NOTREACHED */ } } break; case STAR: case PLUS:{ register char nextch; register int no; register char *save; register int min; /* Lookahead to avoid useless match attempts * when we know what character comes next. */ nextch = '\0'; if (OP(next) == EXACTLY) nextch = *OPERAND(next); min = (OP(scan) == STAR) ? 0 : 1; save = reginput; no = regrepeat(OPERAND(scan)); while (no >= min) { /* If it could work, try it. */ if (nextch == '\0' || *reginput == nextch) if (regmatch(next)) return(1); /* Couldn't or didn't -- back up. */ no--; reginput = save + no; } return(0); } break; case END: return(1); /* Success! */ break; default: regerror("memory corruption"); return(0); break; } scan = next; } /* We get here only if there's trouble -- normally "case END" is the * terminating point. */ regerror("corrupted pointers"); return(0); } /* - regrepeat - repeatedly match something simple, report how many */ PRIVATE int regrepeat(p) char *p; { register int count = 0; register char *scan; register char *opnd; scan = reginput; opnd = OPERAND(p); switch (OP(p)) { case ANY: count = strlen(scan); scan += count; break; case EXACTLY: while (*opnd == *scan) { count++; scan++; } break; case ANYOF: while (*scan != '\0' && strchr(opnd, *scan) != (char *)NULL) { count++; scan++; } break; case ANYBUT: while (*scan != '\0' && strchr(opnd, *scan) == (char *)NULL) { count++; scan++; } break; default: /* Oh dear. Called inappropriately. */ regerror("internal foulup"); count = 0; /* Best compromise. */ break; } reginput = scan; return(count); } /* - regnext - dig the "next" pointer out of a node */ PRIVATE char *regnext(p) register char *p; { register int offset; if (p == ®dummy) return((char *)NULL); offset = NEXT(p); if (offset == 0) return((char *)NULL); if (OP(p) == BACK) return(p - offset); else return(p + offset); } #ifdef DEBUG STATIC char *regprop(); /* - regdump - dump a regexp onto stdout in vaguely comprehensible form */ void regdump(r) regexp *r; { register char *s; register char op = EXACTLY; /* Arbitrary non-END op. */ register char *next; s = r->program + 1; while (op != END) { /* While that wasn't END last time... */ op = OP(s); printf("%2d%s", (int) (s - r->program), regprop(s)); /* Where, what. */ next = regnext(s); if (next == (char *)NULL) /* Next ptr. */ printf("(0)"); else printf("(%d)", (int) (s - r->program) + (int) (next - s)); s += 3; if (op == ANYOF || op == ANYBUT || op == EXACTLY) { /* Literal string, where present. */ while (*s != '\0') { putchar(*s); s++; } s++; } putchar('\n'); } /* Header fields of interest. */ if (r->regstart != '\0') printf("start `%c' ", r->regstart); if (r->reganch) printf("anchored "); if (r->regmust != (char *)NULL) printf("must have \"%s\"", r->regmust); printf("\n"); } /* - regprop - printable representation of opcode */ PRIVATE char *regprop(op) char *op; { register char *p; PRIVATE char buf[50]; (void) strcpy(buf, ":"); switch (OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case ANYBUT: p = "ANYBUT"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case OPEN + 1: case OPEN + 2: case OPEN + 3: case OPEN + 4: case OPEN + 5: case OPEN + 6: case OPEN + 7: case OPEN + 8: case OPEN + 9: sprintf(buf + strlen(buf), "OPEN%d", OP(op) - OPEN); p = (char *)NULL; break; case CLOSE + 1: case CLOSE + 2: case CLOSE + 3: case CLOSE + 4: case CLOSE + 5: case CLOSE + 6: case CLOSE + 7: case CLOSE + 8: case CLOSE + 9: sprintf(buf + strlen(buf), "CLOSE%d", OP(op) - CLOSE); p = (char *)NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; default: regerror("corrupted opcode"); p = (char *) NULL; break; } if (p != (char *)NULL) (void) strcat(buf, p); return(buf); } #endif /* regsub * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. */ #include #include #include #include /* The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 #define CHARBITS 0377 #ifndef CHARBITS #define UCHARAT(p) ((int)*(unsigned char *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif /* - regsub - perform substitutions after a regexp match */ void regsub(prog, source, dest) regexp *prog; char *source; char *dest; { register char *src; register char *dst; register char c; register int no; register int len; if (prog == (regexp *)NULL || source == (char *)NULL || dest == (char *)NULL) { regerror("NULL parm to regsub"); return; } if (UCHARAT(prog->program) != MAGIC) { regerror("damaged regexp fed to regsub"); return; } src = source; dst = dest; while ((c = *src++) != '\0') { if (c == '&') no = 0; else if (c == '\\' && '0' <= *src && *src <= '9') no = *src++ - '0'; else no = -1; if (no < 0) { /* Ordinary character. */ if (c == '\\' && (*src == '\\' || *src == '&')) c = *src++; *dst++ = c; } else if (prog->startp[no] != (char *)NULL && prog->endp[no] != (char *)NULL) { len = (int) (prog->endp[no] - prog->startp[no]); strncpy(dst, prog->startp[no], len); dst += len; if (len != 0 && *(dst - 1) == '\0') { /* strncpy hit NUL. */ regerror("damaged match string"); return; } } } *dst++ = '\0'; } #include /* rindex - find last occurrence of a character in a string */ #include char *rindex(s, charwanted) /* found char, or NULL if none */ _CONST char *s; char charwanted; { return(strrchr(s, charwanted)); } #include #include #include _PROTOTYPE( void std_err, (char *s)); void std_err(s) char *s; { register char *p = s; while (*p != 0) p++; write(2, s, (int) (p - s)); } #include /* swab(3) * * Author: Terrence W. Holm Sep. 1988 */ _PROTOTYPE( void swab, (char *from, char *to, int count)); void swab(from, to, count) char *from; char *to; int count; { register char temp; count >>= 1; while (--count >= 0) { temp = *from++; *to++ = *from++; *to++ = temp; } } #include PUBLIC int _syscall(who, syscallnr, msgptr) int who; int syscallnr; register message *msgptr; { int status; msgptr->m_type = syscallnr; status = _sendrec(who, msgptr); if (status != 0) { /* 'sendrec' itself failed. */ /* XXX - strerror doesn't know all the codes */ msgptr->m_type = status; } if (msgptr->m_type < 0) { errno = -msgptr->m_type; return(-1); } return(msgptr->m_type); } /* sysconf.c POSIX 4.8.1 * long int sysconf(int name); * * POSIX allows some of the values in to be increased at * run time. The sysconf() function allows such values to be checked * at run time. MINIX does not use this facility - the run time * limits are those given in . */ #include #include #include PUBLIC long int sysconf(name) int name; /* property being inspected */ { switch(name) { case _SC_ARG_MAX: return (long) ARG_MAX; case _SC_CHILD_MAX: return (long) CHILD_MAX; case _SC_CLK_TCK: return (long) CLOCKS_PER_SEC; case _SC_NGROUPS_MAX: return (long) NGROUPS_MAX; case _SC_OPEN_MAX: return (long) OPEN_MAX; case _SC_JOB_CONTROL: return -1L; /* no job control */ case _SC_SAVED_IDS: return -1L; /* no saved uid/gid */ case _SC_VERSION: return (long) _POSIX_VERSION; case _SC_STREAM_MAX: return (long) STREAM_MAX; case _SC_TZNAME_MAX: return (long) TZNAME_MAX; default: errno = EINVAL; return -1L; } } /* telldir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #include #include #include off_t telldir(DIR *dp) /* Return the current read position in a directory. */ { if (dp == nil) { errno= EBADF; return -1; } return dp->_pos; } /* * termcap.c V1.1 20/7/87 agc Joypace Ltd * * Copyright Joypace Ltd, London, UK, 1987. All rights reserved. * This file may be freely distributed provided that this notice * remains attached. * * A public domain implementation of the termcap(3) routines. * * * * Klamer Schutte V1.2 Nov. 1988 * * - Can match multiple terminal names [tgetent] * - Removal of **area assignments [tgetstr] * * Terrence W. Holm V1.3 May, Sep, Oct. 1988 * * - Correct when TERM != name and TERMCAP is defined [tgetent] * - Correct the comparison for the terminal name [tgetent] * - Correct the value of ^x escapes [tgetstr] * - Added %r to reverse row/column [tgoto] * - Fixed end of definition test [tgetnum/flag/str] * * Terrence W. Holm V1.4 Jan. 1989 * * - Incorporated Klamer's V1.2 fixes into V1.3 * - Added %d, (old %d is now %2) [tgoto] * - Allow '#' comments in definition file [tgetent] */ #include #include #include #include #include #include char *capab = (char *)NULL; /* the capability itself */ #if 0 /* The following are not yet used. */ extern short ospeed; /* output speed */ extern char PC; /* padding character */ extern char *BC; /* back cursor movement */ extern char *UP; /* up cursor movement */ #endif /* * tgetent - get the termcap entry for terminal name, and put it * in bp (which must be an array of 1024 chars). Returns 1 if * termcap entry found, 0 if not found, and -1 if file not found. */ int tgetent(bp, name) char *bp; char *name; { FILE *fp; char *file; char *term; short len = strlen(name); capab = bp; /* If TERMCAP begins with a '/' then use TERMCAP as the path */ /* Name of the termcap definitions file. If TERMCAP is a */ /* Definition and TERM equals "name" then use TERMCAP as the */ /* Definition. Otherwise use "/etc/termcap" as the path name. */ if ((file = getenv("TERMCAP")) == (char *)NULL) file = "/etc/termcap"; else if (*file != '/') if ((term = getenv("TERM")) != (char *)NULL && strcmp(term, name) == 0) { *bp = '\0'; strncat(bp, file, 1023); return(1); } else file = "/etc/termcap"; if ((fp = fopen(file, "r")) == (FILE *) NULL) { capab = (char *)NULL; /* no valid termcap */ return(-1); } for (;;) { /* Read in each definition */ int def_len = 0; char *cp = bp; do { if (fgets(&bp[def_len], (unsigned int)(1024 - def_len), fp) == (char *)NULL) { fclose(fp); capab = (char *)NULL; /* no valid termcap */ return(0); } def_len = strlen(bp) - 2; } while (bp[def_len] == '\\'); while (isspace(*cp)) cp++; /* Comment lines start with a '#' */ if (*cp == '#') continue; /* See if any of the terminal names in this definition */ /* Match "name". */ do { if (strncmp(name, cp, len) == 0 && (cp[len] == '|' || cp[len] == ':')) { fclose(fp); return(1); } while ((*cp) && (*cp != '|') && (*cp != ':')) cp++; } while (*cp++ == '|'); } } /* * tgetnum - get the numeric terminal capability corresponding * to id. Returns the value, -1 if invalid. */ int tgetnum(id) char *id; { register char *cp = capab; if (cp == (char *)NULL || id == (char *)NULL) return(-1); for (;;) { while (*cp++ != ':') if (cp[-1] == '\0') return(-1); while (isspace(*cp)) cp++; if (strncmp(cp, id, 2) == 0 && cp[2] == '#') return(atoi(cp + 3)); } } /* * tgetflag - get the boolean flag corresponding to id. Returns -1 * if invalid, 0 if the flag is not in termcap entry, or 1 if it is * present. */ int tgetflag(id) char *id; { register char *cp = capab; if (cp == (char *)NULL || id == (char *)NULL) return(-1); for (;;) { while (*cp++ != ':') if (cp[-1] == '\0') return(0); while (isspace(*cp)) cp++; if (strncmp(cp, id, 2) == 0) return(1); } } /* * tgetstr - get the string capability corresponding to id and place * it in area (advancing area at same time). Expand escape sequences * etc. Returns the string, or NULL if it can't do it. */ char *tgetstr(id, area) char *id; char **area; { register char *cp = capab; register char *wsp = *area; /* workspace pointer */ if (cp == (char *)NULL || id == (char *)NULL) return((char *)NULL); for (;;) { while (*cp++ != ':') if (cp[-1] == '\0') return((char *)NULL); while (isspace(*cp)) cp++; if (strncmp(cp, id, 2) == 0 && cp[2] == '=') { for (cp += 3; *cp && *cp != ':'; wsp++, cp++) switch (*cp) { case '^': *wsp = *++cp - '@'; break; case '\\': switch (*++cp) { case 'E': *wsp = '\033'; break; case 'n': *wsp = '\n'; break; case 'r': *wsp = '\r'; break; case 't': *wsp = '\t'; break; case 'b': *wsp = '\b'; break; case 'f': *wsp = '\f'; break; case '0': case '1': case '2': case '3': { int i; int t = 0; for (i = 0; i < 3 && isdigit(*cp); ++i, ++cp) t = t * 8 + *cp - '0'; *wsp = t; cp--; break; } default: *wsp = *cp; } break; default: *wsp = *cp; } *wsp++ = '\0'; { char *ret = *area; *area = wsp; return(ret); } } } /* end for(;;) */ } /* * tgoto - given the cursor motion string cm, make up the string * for the cursor to go to (destcol, destline), and return the string. * Returns "OOPS" if something's gone wrong, or the string otherwise. */ char *tgoto(cm, destcol, destline) char *cm; int destcol; int destline; { PRIVATE char ret[24]; char *rp = ret; int incr = 0; int argno = 0; int numval; for (; *cm; cm++) { if (*cm == '%') { switch (*++cm) { case 'i': incr = 1; break; case 'r': argno = 1; break; case '+': numval = (argno == 0 ? destline : destcol); *rp++ = numval + incr + *++cm; argno = 1 - argno; break; case '2': numval = (argno == 0 ? destline : destcol); numval = (numval + incr) % 100; *rp++ = '0' + (numval / 10); *rp++ = '0' + (numval % 10); argno = 1 - argno; break; case 'd': numval = (argno == 0 ? destline : destcol); numval = (numval + incr) % 1000; if (numval > 99) *rp++ = '0' + (numval / 100); if (numval > 9) *rp++ = '0' + (numval / 10) % 10; *rp++ = '0' + (numval % 10); argno = 1 - argno; break; case '%': *rp++ = '%'; break; default: return("OOPS"); } } else *rp++ = *cm; } *rp = '\0'; return(ret); } /* * tputs - put the string cp out onto the terminal, using the function * outc. This should do padding for the terminal, but I can't find a * terminal that needs padding at the moment... */ int tputs(cp, affcnt, outc) register char *cp; int affcnt; _PROTOTYPE( void (*outc), (int ch)); { if (cp == (char *)NULL) return(1); /* Do any padding interpretation - left null for MINIX just now */ while (*cp) (*outc) (*cp++); return(1); } /* ttyname.c POSIX 4.7.2 * char *ttyname(int fildes); * * Determines name of a terminal device. */ #include #include #include #include #include #include #include PRIVATE char base[] = "/dev"; PRIVATE char path[sizeof(base) + 1 + NAME_MAX]; /* extra 1 for '/' */ PUBLIC char *ttyname(fildes) int fildes; { DIR *devices; struct dirent *entry; struct stat tty_stat; struct stat dev_stat; /* Simple first test: file descriptor must be a character device */ if (fstat(fildes, &tty_stat) < 0 || !S_ISCHR(tty_stat.st_mode)) return (char *) NULL; /* Open device directory for reading */ if ((devices = opendir(base)) == (DIR *) NULL) return (char *) NULL; /* Scan the entries for one that matches perfectly */ while ((entry = readdir(devices)) != (struct dirent *) NULL) { if (tty_stat.st_ino != entry->d_ino) continue; strcpy(path, base); strcat(path, "/"); strcat(path, entry->d_name); if (stat(path, &dev_stat) < 0 || !S_ISCHR(dev_stat.st_mode)) continue; if (tty_stat.st_ino == dev_stat.st_ino && tty_stat.st_dev == dev_stat.st_dev && tty_stat.st_rdev == dev_stat.st_rdev) { closedir(devices); return path; } } closedir(devices); return (char *) NULL; } /* ttyslot.c Return the index in the utmp file for the current user's terminal. The current user's terminal is the first file descriptor in the range 0..2 for which ttyname() returns a name. The index is the line number in the /etc/ttytab file. 0 will be returned in case of an error. Created: Oct 11, 1992 by Philip Homburg */ #define _MINIX_SOURCE #include #include #include #include int ttyslot() { int slot; slot= fttyslot(0); if (slot == 0) slot= fttyslot(1); if (slot == 0) slot= fttyslot(2); return slot; } int fttyslot(fd) int fd; { char *tname; int lineno; struct ttyent *ttyp; tname= ttyname(fd); if (tname == NULL) return 0; /* Assume that tty devices are in /dev */ if (strncmp(tname, "/dev/", 5) != 0) return 0; /* Malformed tty name. */ tname += 5; /* Scan /etc/ttytab. */ lineno= 1; while ((ttyp= getttyent()) != NULL) { if (strcmp(tname, ttyp->ty_name) == 0) { endttyent(); return lineno; } lineno++; } /* No match */ endttyent(); return 0; } /* * $PchHeader: /mount/hd2/minix/lib/misc/RCS/ttyslot.c,v 1.3 1994/12/22 13:49:12 philip Exp $ */ .;..Makefile__exit.c_access.c_alarm.c_cfgetispeed.c_cfgetospeed.c_cfsetispeed.c_cfsetospeed.c_chdir.c_chmod.c_chown.c_chroot.c_close.c_closedir.c_creat.c_dup.c_dup2.c_execl.c_execle.c_fcntl.c_fork.c_fpathconf.c_fstat.c_getcwd.c_getegid.c_geteuid.c_getgid.c_getgroups.c _getpgrp.c _getpid.c _getppid.c _getuid.c _ioctl.c_isatty.c_kill.c_link.c_lseek.c_mkdir.c_mkfifo.c_mknod.c_mktemp.c_mount.c_open.c_opendir.c_pathconf.c_pause.c_pipe.c_ptrace.c_read.c_readdir.c_rename.c _rewinddir.c!_rmdir.c"_setgid.c#_setsid.c$_setuid.c%_sigaction.c&_sigpending.c'_sigprocmask.c(_sigreturn.c)_sigset.c*_sigsetjmp.c# Makefile for lib/posix. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(__exit.o) \ $(LIBRARY)(_access.o) \ $(LIBRARY)(_alarm.o) \ $(LIBRARY)(_cfgetispeed.o) \ $(LIBRARY)(_cfgetospeed.o) \ $(LIBRARY)(_cfsetispeed.o) \ $(LIBRARY)(_cfsetospeed.o) \ $(LIBRARY)(_chdir.o) \ $(LIBRARY)(_chmod.o) \ $(LIBRARY)(_chown.o) \ $(LIBRARY)(_chroot.o) \ $(LIBRARY)(_close.o) \ $(LIBRARY)(_closedir.o) \ $(LIBRARY)(_creat.o) \ $(LIBRARY)(_dup.o) \ $(LIBRARY)(_dup2.o) \ $(LIBRARY)(_execl.o) \ $(LIBRARY)(_execle.o) \ $(LIBRARY)(_execlp.o) \ $(LIBRARY)(_execv.o) \ $(LIBRARY)(_execve.o) \ $(LIBRARY)(_execvp.o) \ $(LIBRARY)(_fcntl.o) \ $(LIBRARY)(_fork.o) \ $(LIBRARY)(_fpathconf.o) \ $(LIBRARY)(_fstat.o) \ $(LIBRARY)(_getcwd.o) \ $(LIBRARY)(_getegid.o) \ $(LIBRARY)(_geteuid.o) \ $(LIBRARY)(_getgid.o) \ $(LIBRARY)(_getgroups.o) \ $(LIBRARY)(_getpgrp.o) \ $(LIBRARY)(_getpid.o) \ $(LIBRARY)(_getppid.o) \ $(LIBRARY)(_getuid.o) \ $(LIBRARY)(_ioctl.o) \ $(LIBRARY)(_isatty.o) \ $(LIBRARY)(_kill.o) \ $(LIBRARY)(_link.o) \ $(LIBRARY)(_lseek.o) \ $(LIBRARY)(_mkdir.o) \ $(LIBRARY)(_mkfifo.o) \ $(LIBRARY)(_mknod.o) \ $(LIBRARY)(_mktemp.o) \ $(LIBRARY)(_mount.o) \ $(LIBRARY)(_open.o) \ $(LIBRARY)(_opendir.o) \ $(LIBRARY)(_pathconf.o) \ $(LIBRARY)(_pause.o) \ $(LIBRARY)(_pipe.o) \ $(LIBRARY)(_ptrace.o) \ $(LIBRARY)(_read.o) \ $(LIBRARY)(_readdir.o) \ $(LIBRARY)(_rename.o) \ $(LIBRARY)(_rewinddir.o) \ $(LIBRARY)(_rmdir.o) \ $(LIBRARY)(_setgid.o) \ $(LIBRARY)(_setsid.o) \ $(LIBRARY)(_setuid.o) \ $(LIBRARY)(_sigaction.o) \ $(LIBRARY)(_sigpending.o) \ $(LIBRARY)(_sigprocmask.o) \ $(LIBRARY)(_sigreturn.o) \ $(LIBRARY)(_sigset.o) \ $(LIBRARY)(_sigsetjmp.o) \ $(LIBRARY)(_sigsuspend.o) \ $(LIBRARY)(_sleep.o) \ $(LIBRARY)(_stat.o) \ $(LIBRARY)(_stime.o) \ $(LIBRARY)(_sync.o) \ $(LIBRARY)(_tcdrain.o) \ $(LIBRARY)(_tcflow.o) \ $(LIBRARY)(_tcflush.o) \ $(LIBRARY)(_tcgetattr.o) \ $(LIBRARY)(_tcsendbreak.o) \ $(LIBRARY)(_tcsetattr.o) \ $(LIBRARY)(_time.o) \ $(LIBRARY)(_times.o) \ $(LIBRARY)(_umask.o) \ $(LIBRARY)(_umount.o) \ $(LIBRARY)(_uname.o) \ $(LIBRARY)(_unlink.o) \ $(LIBRARY)(_utime.o) \ $(LIBRARY)(_wait.o) \ $(LIBRARY)(_waitpid.o) \ $(LIBRARY)(_write.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(__exit.o): __exit.c $(CC1) __exit.c $(LIBRARY)(_access.o): _access.c $(CC1) _access.c $(LIBRARY)(_alarm.o): _alarm.c $(CC1) _alarm.c $(LIBRARY)(_cfgetispeed.o): _cfgetispeed.c $(CC1) _cfgetispeed.c $(LIBRARY)(_cfgetospeed.o): _cfgetospeed.c $(CC1) _cfgetospeed.c $(LIBRARY)(_cfsetispeed.o): _cfsetispeed.c $(CC1) _cfsetispeed.c $(LIBRARY)(_cfsetospeed.o): _cfsetospeed.c $(CC1) _cfsetospeed.c $(LIBRARY)(_chdir.o): _chdir.c $(CC1) _chdir.c $(LIBRARY)(_chmod.o): _chmod.c $(CC1) _chmod.c $(LIBRARY)(_chown.o): _chown.c $(CC1) _chown.c $(LIBRARY)(_chroot.o): _chroot.c $(CC1) _chroot.c $(LIBRARY)(_close.o): _close.c $(CC1) _close.c $(LIBRARY)(_closedir.o): _closedir.c $(CC1) _closedir.c $(LIBRARY)(_creat.o): _creat.c $(CC1) _creat.c $(LIBRARY)(_dup.o): _dup.c $(CC1) _dup.c $(LIBRARY)(_dup2.o): _dup2.c $(CC1) _dup2.c $(LIBRARY)(_execl.o): _execl.c $(CC1) _execl.c $(LIBRARY)(_execle.o): _execle.c $(CC1) _execle.c $(LIBRARY)(_execlp.o): _execlp.c $(CC1) _execlp.c $(LIBRARY)(_execv.o): _execv.c $(CC1) _execv.c $(LIBRARY)(_execve.o): _execve.c $(CC1) _execve.c $(LIBRARY)(_execvp.o): _execvp.c $(CC1) _execvp.c $(LIBRARY)(_fcntl.o): _fcntl.c $(CC1) _fcntl.c $(LIBRARY)(_fork.o): _fork.c $(CC1) _fork.c $(LIBRARY)(_fpathconf.o): _fpathconf.c $(CC1) _fpathconf.c $(LIBRARY)(_fstat.o): _fstat.c $(CC1) _fstat.c $(LIBRARY)(_getcwd.o): _getcwd.c $(CC1) _getcwd.c $(LIBRARY)(_getegid.o): _getegid.c $(CC1) _getegid.c $(LIBRARY)(_geteuid.o): _geteuid.c $(CC1) _geteuid.c $(LIBRARY)(_getgid.o): _getgid.c $(CC1) _getgid.c $(LIBRARY)(_getgroups.o): _getgroups.c $(CC1) _getgroups.c $(LIBRARY)(_getpgrp.o): _getpgrp.c $(CC1) _getpgrp.c $(LIBRARY)(_getpid.o): _getpid.c $(CC1) _getpid.c $(LIBRARY)(_getppid.o): _getppid.c $(CC1) _getppid.c $(LIBRARY)(_getuid.o): _getuid.c $(CC1) _getuid.c $(LIBRARY)(_ioctl.o): _ioctl.c $(CC1) _ioctl.c $(LIBRARY)(_isatty.o): _isatty.c $(CC1) _isatty.c $(LIBRARY)(_kill.o): _kill.c $(CC1) _kill.c $(LIBRARY)(_link.o): _link.c $(CC1) _link.c $(LIBRARY)(_lseek.o): _lseek.c $(CC1) _lseek.c $(LIBRARY)(_mkdir.o): _mkdir.c $(CC1) _mkdir.c $(LIBRARY)(_mkfifo.o): _mkfifo.c $(CC1) _mkfifo.c $(LIBRARY)(_mknod.o): _mknod.c $(CC1) _mknod.c $(LIBRARY)(_mktemp.o): _mktemp.c $(CC1) _mktemp.c $(LIBRARY)(_mount.o): _mount.c $(CC1) _mount.c $(LIBRARY)(_open.o): _open.c $(CC1) _open.c $(LIBRARY)(_opendir.o): _opendir.c $(CC1) _opendir.c $(LIBRARY)(_pathconf.o): _pathconf.c $(CC1) _pathconf.c $(LIBRARY)(_pause.o): _pause.c $(CC1) _pause.c $(LIBRARY)(_pipe.o): _pipe.c $(CC1) _pipe.c $(LIBRARY)(_ptrace.o): _ptrace.c $(CC1) _ptrace.c $(LIBRARY)(_read.o): _read.c $(CC1) _read.c $(LIBRARY)(_readdir.o): _readdir.c $(CC1) _readdir.c $(LIBRARY)(_rename.o): _rename.c $(CC1) _rename.c $(LIBRARY)(_rewinddir.o): _rewinddir.c $(CC1) _rewinddir.c $(LIBRARY)(_rmdir.o): _rmdir.c $(CC1) _rmdir.c $(LIBRARY)(_setgid.o): _setgid.c $(CC1) _setgid.c $(LIBRARY)(_setsid.o): _setsid.c $(CC1) _setsid.c $(LIBRARY)(_setuid.o): _setuid.c $(CC1) _setuid.c $(LIBRARY)(_sigaction.o): _sigaction.c $(CC1) _sigaction.c $(LIBRARY)(_sigpending.o): _sigpending.c $(CC1) _sigpending.c $(LIBRARY)(_sigprocmask.o): _sigprocmask.c $(CC1) _sigprocmask.c $(LIBRARY)(_sigreturn.o): _sigreturn.c $(CC1) _sigreturn.c $(LIBRARY)(_sigset.o): _sigset.c $(CC1) _sigset.c $(LIBRARY)(_sigsetjmp.o): _sigsetjmp.c $(CC1) _sigsetjmp.c $(LIBRARY)(_sigsuspend.o): _sigsuspend.c $(CC1) _sigsuspend.c $(LIBRARY)(_sleep.o): _sleep.c $(CC1) _sleep.c $(LIBRARY)(_stat.o): _stat.c $(CC1) _stat.c $(LIBRARY)(_stime.o): _stime.c $(CC1) _stime.c $(LIBRARY)(_sync.o): _sync.c $(CC1) _sync.c $(LIBRARY)(_tcdrain.o): _tcdrain.c $(CC1) _tcdrain.c $(LIBRARY)(_tcflow.o): _tcflow.c $(CC1) _tcflow.c $(LIBRARY)(_tcflush.o): _tcflush.c $(CC1) _tcflush.c $(LIBRARY)(_tcgetattr.o): _tcgetattr.c $(CC1) _tcgetattr.c $(LIBRARY)(_tcsendbreak.o): _tcsendbreak.c $(CC1) _tcsendbreak.c $(LIBRARY)(_tcsetattr.o): _tcsetattr.c $(CC1) _tcsetattr.c $(LIBRARY)(_time.o): _time.c $(CC1) _time.c $(LIBRARY)(_times.o): _times.c $(CC1) _times.c $(LIBRARY)(_umask.o): _umask.c $(CC1) _umask.c $(LIBRARY)(_umount.o): _umount.c $(CC1) _umount.c $(LIBRARY)(_uname.o): _uname.c /usr/include/minix/config.h $(CC1) _uname.c $(LIBRARY)(_unlink.o): _unlink.c $(CC1) _unlink.c $(LIBRARY)(_utime.o): _utime.c $(CC1) _utime.c $(LIBRARY)(_wait.o): _wait.c $(CC1) _wait.c $(LIBRARY)(_waitpid.o): _waitpid.c $(CC1) _waitpid.c $(LIBRARY)(_write.o): _write.c $(CC1) _write.c #define _exit __exit #include #include PUBLIC void _exit(status) int status; { message m; m.m1_i1 = status; _syscall(MM, EXIT, &m); } #include #define access _access #include PUBLIC int access(name, mode) _CONST char *name; int mode; { message m; m.m3_i2 = mode; _loadname(name, &m); return(_syscall(FS, ACCESS, &m)); } #include #define alarm _alarm #include PUBLIC unsigned int alarm(sec) unsigned int sec; { message m; m.m1_i1 = (int) sec; return( (unsigned) _syscall(MM, ALARM, &m)); } /* posix/_cfgetispeed Created: June 11, 1993 by Philip Homburg */ #include speed_t _cfgetispeed(const struct termios *termios_p) { return termios_p->c_ispeed; } /* posix/_cfgetospeed Created: June 11, 1993 by Philip Homburg */ #include speed_t _cfgetospeed(const struct termios *termios_p) { return termios_p->c_ospeed; } /* posix/_cfsetispeed Created: June 11, 1993 by Philip Homburg */ #include int _cfsetispeed(struct termios *termios_p, speed_t speed) { termios_p->c_ispeed= speed; return 0; } /* posix/_cfsetospeed Created: June 11, 1993 by Philip Homburg */ #include int _cfsetospeed(struct termios *termios_p, speed_t speed) { termios_p->c_ospeed= speed; return 0; } #include #define chdir _chdir #include PUBLIC int chdir(name) _CONST char *name; { message m; _loadname(name, &m); return(_syscall(FS, CHDIR, &m)); } #include #define chmod _chmod #include PUBLIC int chmod(name, mode) _CONST char *name; Mode_t mode; { message m; m.m3_i2 = mode; _loadname(name, &m); return(_syscall(FS, CHMOD, &m)); } #include #define chown _chown #include #include PUBLIC int chown(name, owner, grp) _CONST char *name; Uid_t owner; Gid_t grp; { message m; m.m1_i1 = strlen(name) + 1; m.m1_i2 = owner; m.m1_i3 = grp; m.m1_p1 = (char *) name; return(_syscall(FS, CHOWN, &m)); } #include #define chroot _chroot #include PUBLIC int chroot(name) _CONST char *name; { message m; _loadname(name, &m); return(_syscall(FS, CHROOT, &m)); } #include #define close _close #include PUBLIC int close(fd) int fd; { message m; m.m1_i1 = fd; return(_syscall(FS, CLOSE, &m)); } /* closedir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #define close _close #define closedir _closedir #include #include #include #include #include int closedir(DIR *dp) /* Finish reading a directory. */ { int d; if (dp == nil) { errno= EBADF; return -1; } d= dp->_fd; free((void *) dp); return close(d); } #include #define creat _creat #include PUBLIC int creat(name, mode) _CONST char *name; Mode_t mode; { message m; m.m3_i2 = mode; _loadname(name, &m); return(_syscall(FS, CREAT, &m)); } #include #define dup _dup #define fcntl _fcntl #include #include PUBLIC int dup(fd) int fd; { return(fcntl(fd, F_DUPFD, 0)); } #include #define close _close #define dup2 _dup2 #define fcntl _fcntl #include #include PUBLIC int dup2(fd, fd2) int fd, fd2; { /* The behavior of dup2 is defined by POSIX in 6.2.1.2 as almost, but not * quite the same as fcntl. */ if (fd2 < 0 || fd2 > OPEN_MAX) { errno = EBADF; return(-1); } /* Check to see if fildes is valid. */ if (fcntl(fd, F_GETFL) < 0) { /* 'fd' is not valid. */ return(-1); } else { /* 'fd' is valid. */ if (fd == fd2) return(fd2); close(fd2); return(fcntl(fd, F_DUPFD, fd2)); } } /* execl() - execute Author: Kees J. Bot * 21 Jan 1994 */ #define execl _execl #define execve _execve #include extern char * const **_penviron; /* The default environment. */ int execl(const char *path, const char *arg1, ...) /* execl("/bin/sh", "sh", "-c", "example", (char *) 0); */ { /* Assumption: The C-implementation for this machine pushes * function arguments downwards on the stack making a perfect * argument array. Luckily this is almost always so. */ return execve(path, (char * const *) &arg1, *_penviron); } /* execle() - execute with a custom environment Author: Kees J. Bot * 21 Jan 1994 */ #define nil 0 #define execle _execle #define execve _execve #include #include int execle(const char *path, const char *arg1, ...) /* execle("/bin/sh", "sh", "-c", "example", (char *) 0, my_env_array); */ { char * const * envp; va_list ap; va_start(ap, arg1); /* Find the end of the argument array. */ if (arg1 != nil) while (va_arg(ap, const char *) != nil) {} envp = va_arg(ap, char * const *); va_end(ap); return execve(path, (char * const *) &arg1, envp); } #include #define fcntl _fcntl #include #include #if _ANSI PUBLIC int fcntl(int fd, int cmd, ...) #else PUBLIC int fcntl(fd, cmd) int fd; int cmd; #endif { va_list argp; message m; va_start(argp, cmd); /* Set up for the sensible case where there is no variable parameter. This * covers F_GETFD, F_GETFL and invalid commands. */ m.m1_i3 = 0; m.m1_p1 = NIL_PTR; /* Adjust for the stupid cases. */ switch(cmd) { case F_DUPFD: case F_SETFD: case F_SETFL: m.m1_i3 = va_arg(argp, int); break; case F_GETLK: case F_SETLK: case F_SETLKW: m.m1_p1 = (char *) va_arg(argp, struct flock *); break; } /* Clean up and make the system call. */ va_end(argp); m.m1_i1 = fd; m.m1_i2 = cmd; return(_syscall(FS, FCNTL, &m)); } #include #define fork _fork #include PUBLIC pid_t fork() { message m; return(_syscall(MM, FORK, &m)); } /* POSIX fpathconf (Sec. 5.7.1) Author: Andy Tanenbaum */ #include #define fstat _fstat #define fpathconf _fpathconf #include #include #include #include #include PUBLIC long fpathconf(fd, name) int fd; /* file descriptor being interrogated */ int name; /* property being inspected */ { /* POSIX allows some of the values in to be increased at * run time. The pathconf and fpathconf functions allow these values * to be checked at run time. MINIX does not use this facility. * The run-time limits are those given in . */ struct stat stbuf; switch(name) { case _PC_LINK_MAX: /* Fstat the file. If that fails, return -1. */ if (fstat(fd, &stbuf) != 0) return(-1); if (S_ISDIR(stbuf.st_mode)) return(1L); /* no links to directories */ else return( (long) LINK_MAX); case _PC_MAX_CANON: return( (long) MAX_CANON); case _PC_MAX_INPUT: return( (long) MAX_INPUT); case _PC_NAME_MAX: return( (long) NAME_MAX); case _PC_PATH_MAX: return( (long) PATH_MAX); case _PC_PIPE_BUF: return( (long) PIPE_BUF); case _PC_CHOWN_RESTRICTED: return( (long) _POSIX_CHOWN_RESTRICTED); case _PC_NO_TRUNC: return( (long) _POSIX_NO_TRUNC); case _PC_VDISABLE: return( (long) _POSIX_VDISABLE); default: errno = EINVAL; return(-1); } } #include #define fstat _fstat #include PUBLIC int fstat(fd, buffer) int fd; struct stat *buffer; { message m; m.m1_i1 = fd; m.m1_p1 = (char *) buffer; return(_syscall(FS, FSTAT, &m)); } /* getcwd() - get the name of the current working directory. * Author: Kees J. Bot * 30 Apr 1989 */ #define nil 0 #define chdir _chdir #define closedir _closedir #define getcwd _getcwd #define opendir _opendir #define readdir _readdir #define rewinddir _rewinddir #define stat _stat #include #include #include #include #include #include #include static int addpath(const char *path, char **ap, const char *entry) /* Add the name of a directory entry at the front of the path being built. * Note that the result always starts with a slash. */ { const char *e= entry; char *p= *ap; while (*e != 0) e++; while (e > entry && p > path) *--p = *--e; if (p == path) return -1; *--p = '/'; *ap= p; return 0; } static int recover(char *p) /* Undo all those chdir("..")'s that have been recorded by addpath. This * has to be done entry by entry, because the whole pathname may be too long. */ { int e= errno, slash; char *p0; while (*p != 0) { p0= ++p; do p++; while (*p != 0 && *p != '/'); slash= *p; *p= 0; if (chdir(p0) < 0) return -1; *p= slash; } errno= e; return 0; } char *getcwd(char *path, size_t size) { struct stat above, current, tmp; struct dirent *entry; DIR *d; char *p, *up, *dotdot; int cycle; if (path == nil || size <= 1) { errno= EINVAL; return nil; } p= path + size; *--p = 0; if (stat(".", ¤t) < 0) return nil; while (1) { dotdot= ".."; if (stat(dotdot, &above) < 0) { recover(p); return nil; } if (above.st_dev == current.st_dev && above.st_ino == current.st_ino) break; /* Root dir found */ if ((d= opendir(dotdot)) == nil) { recover(p); return nil; } /* Cycle is 0 for a simple inode nr search, or 1 for a search * for inode *and* device nr. */ cycle= above.st_dev == current.st_dev ? 0 : 1; do { char name[3 + NAME_MAX + 1]; tmp.st_ino= 0; if ((entry= readdir(d)) == nil) { switch (++cycle) { case 1: rewinddir(d); continue; case 2: closedir(d); errno= ENOENT; recover(p); return nil; } } if (strcmp(entry->d_name, ".") == 0) continue; if (strcmp(entry->d_name, "..") == 0) continue; switch (cycle) { case 0: /* Simple test on inode nr. */ if (entry->d_ino != current.st_ino) continue; /*FALL THROUGH*/ case 1: /* Current is mounted. */ strcpy(name, "../"); strcpy(name+3, entry->d_name); if (stat(name, &tmp) < 0) continue; break; } } while (tmp.st_ino != current.st_ino || tmp.st_dev != current.st_dev); up= p; if (addpath(path, &up, entry->d_name) < 0) { closedir(d); errno = ERANGE; recover(p); return nil; } closedir(d); if (chdir(dotdot) < 0) { recover(p); return nil; } p= up; current= above; } if (recover(p) < 0) return nil; /* Undo all those chdir("..")'s. */ if (*p == 0) *--p = '/'; /* Cwd is "/" if nothing added */ if (p > path) strcpy(path, p); /* Move string to start of path. */ return path; } #include #define getegid _getegid #include PUBLIC gid_t getegid() { message m; /* POSIX says that this function is always successful and that no * return value is reserved to indicate an error. Minix syscalls * are not always successful and Minix returns the unreserved value * (gid_t) -1 when there is an error. */ if (_syscall(MM, GETGID, &m) < 0) return ( (gid_t) -1); return( (gid_t) m.m2_i1); } #include #define geteuid _geteuid #include PUBLIC uid_t geteuid() { message m; /* POSIX says that this function is always successful and that no * return value is reserved to indicate an error. Minix syscalls * are not always successful and Minix returns the unreserved value * (uid_t) -1 when there is an error. */ if (_syscall(MM, GETUID, &m) < 0) return ( (uid_t) -1); return( (uid_t) m.m2_i1); } #include #define getgid _getgid #include PUBLIC gid_t getgid() { message m; return( (gid_t) _syscall(MM, GETGID, &m)); } /* getgroups.c POSIX 4.2.3 * int getgroups(gidsetsize, grouplist); * * This call relates to suplementary group ids, which are not * supported in MINIX. */ #include #define getgroups _getgroups #include #include PUBLIC int getgroups(gidsetsize, grouplist) int gidsetsize; gid_t grouplist[]; { return(0); } #include #define getpgrp _getpgrp #include PUBLIC pid_t getpgrp() { message m; return(_syscall(MM, GETPGRP, &m)); } #include #define getpid _getpid #include PUBLIC pid_t getpid() { message m; return(_syscall(MM, GETPID, &m)); } #include #define getppid _getppid #include PUBLIC pid_t getppid() { message m; /* POSIX says that this function is always successful and that no * return value is reserved to indicate an error. Minix syscalls * are not always successful and Minix returns the reserved value * (pid_t) -1 when there is an error. */ if (_syscall(MM, GETPID, &m) < 0) return ( (pid_t) -1); return( (pid_t) m.m2_i1); } #include #define getuid _getuid #include PUBLIC uid_t getuid() { message m; return( (uid_t) _syscall(MM, GETUID, &m)); } #include #define ioctl _ioctl #include #include PUBLIC int ioctl(fd, request, data) int fd; int request; void *data; { message m; m.TTY_LINE = fd; m.TTY_REQUEST = request; m.ADDRESS = (char *) data; return(_syscall(FS, IOCTL, &m)); } #include #define isatty _isatty #define tcgetattr _tcgetattr #include #include PUBLIC int isatty(fd) int fd; { struct termios dummy; return(tcgetattr(fd, &dummy) == 0); } #include #define kill _kill #include PUBLIC int kill(proc, sig) int proc; /* which process is to be sent the signal */ int sig; /* signal number */ { message m; m.m1_i1 = proc; m.m1_i2 = sig; return(_syscall(MM, KILL, &m)); } #include #define link _link #include #include PUBLIC int link(name, name2) _CONST char *name, *name2; { message m; m.m1_i1 = strlen(name) + 1; m.m1_i2 = strlen(name2) + 1; m.m1_p1 = (char *) name; m.m1_p2 = (char *) name2; return(_syscall(FS, LINK, &m)); } #include #define lseek _lseek #include PUBLIC off_t lseek(fd, offset, whence) int fd; off_t offset; int whence; { message m; m.m2_i1 = fd; m.m2_l1 = offset; m.m2_i2 = whence; if (_syscall(FS, LSEEK, &m) < 0) return( (off_t) -1); return( (off_t) m.m2_l1); } #include #define mkdir _mkdir #include #include PUBLIC int mkdir(name, mode) _CONST char *name; Mode_t mode; { message m; m.m1_i1 = strlen(name) + 1; m.m1_i2 = mode; m.m1_p1 = (char *) name; return(_syscall(FS, MKDIR, &m)); } #include #define mkfifo _mkfifo #define mknod _mknod #include #include PUBLIC int mkfifo(name, mode) _CONST char *name; Mode_t mode; { return mknod(name, mode | S_IFIFO, (Dev_t) 0); } #include #define mknod _mknod #include #include #include PUBLIC int mknod(name, mode, dev) _CONST char *name; Mode_t mode; Dev_t dev; { message m; m.m1_i1 = strlen(name) + 1; m.m1_i2 = mode; m.m1_i3 = dev; m.m1_p1 = (char *) name; m.m1_p2 = (char *) ((int) 0); /* obsolete size field */ return(_syscall(FS, MKNOD, &m)); } /* mktemp - make a name for a temporary file */ #include #define access _access #define getpid _getpid #define mktemp _mktemp #include PUBLIC char *mktemp(template) char *template; { register int k; register char *p; register pid_t pid; pid = getpid(); /* get process id as semi-unique number */ p = template; while (*p != 0) p++; /* find end of string */ /* Replace XXXXXX at end of template with a letter, then as many of the * trailing digits of the pid as fit. */ while (*--p == 'X') { *p = '0' + (pid % 10); pid /= 10; } if (*++p != 0) { for (k = 'a'; k <= 'z'; k++) { *p = k; if (access(template, F_OK) < 0) return(template); } } return("/"); } #include #define mount _mount #include #include PUBLIC int mount(special, name, rwflag) char *name, *special; int rwflag; { message m; m.m1_i1 = strlen(special) + 1; m.m1_i2 = strlen(name) + 1; m.m1_i3 = rwflag; m.m1_p1 = special; m.m1_p2 = name; return(_syscall(FS, MOUNT, &m)); } #include #define open _open #include #include #include #if _ANSI PUBLIC int open(const char *name, int flags, ...) #else PUBLIC int open(name, flags) _CONST char *name; int flags; #endif { va_list argp; message m; va_start(argp, flags); if (flags & O_CREAT) { m.m1_i1 = strlen(name) + 1; m.m1_i2 = flags; m.m1_i3 = va_arg(argp, Mode_t); m.m1_p1 = (char *) name; } else { _loadname(name, &m); m.m3_i2 = flags; } va_end(argp); return (_syscall(FS, OPEN, &m)); } /* opendir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #define close _close #define fcntl _fcntl #define fstat _fstat #define open _open #define opendir _opendir #define stat _stat #include #include #include #include #include #include #include DIR *opendir(const char *name) /* Open a directory for reading. */ { int d, f; DIR *dp; struct stat st; /* Only read directories. */ if (stat(name, &st) < 0) return nil; if (!S_ISDIR(st.st_mode)) { errno= ENOTDIR; return nil; } if ((d= open(name, O_RDONLY | O_NONBLOCK)) < 0) return nil; /* Check the type again, mark close-on-exec, get a buffer. */ if (fstat(d, &st) < 0 || (errno= ENOTDIR, !S_ISDIR(st.st_mode)) || (f= fcntl(d, F_GETFD)) < 0 || fcntl(d, F_SETFD, f | FD_CLOEXEC) < 0 || (dp= (DIR *) malloc(sizeof(*dp))) == nil ) { int err= errno; (void) close(d); errno= err; return nil; } dp->_fd= d; dp->_v7= -1; dp->_count= 0; dp->_pos= 0; return dp; } /* POSIX pathconf (Sec. 5.7.1) Author: Andy Tanenbaum */ #include #define close _close #define open _open #define pathconf _pathconf #include #include #include PUBLIC long pathconf(path, name) _CONST char *path; /* name of file being interrogated */ int name; /* property being inspected */ { /* POSIX allows some of the values in to be increased at * run time. The pathconf and fpathconf functions allow these values * to be checked at run time. MINIX does not use this facility. * The run-time limits are those given in . */ int fd; long val; if ( (fd = open(path, O_RDONLY)) < 0) return(-1L); val = fpathconf(fd, name); close(fd); return(val); } #include #define pause _pause #include PUBLIC int pause() { message m; return(_syscall(MM, PAUSE, &m)); } #include #define pipe _pipe #include PUBLIC int pipe(fild) int fild[2]; { message m; if (_syscall(FS, PIPE, &m) < 0) return(-1); fild[0] = m.m1_i1; fild[1] = m.m1_i2; return(0); } #include #define ptrace _ptrace #include PUBLIC long ptrace(req, pid, addr, data) int req; pid_t pid; long addr; long data; { message m; m.m2_i1 = pid; m.m2_i2 = req; m.m2_l1 = addr; m.m2_l2 = data; if (_syscall(MM, PTRACE, &m) < 0) return(-1); /* There was no error, but -1 is a legal return value. Clear errno if * necessary to distinguish this case. _syscall has set errno to nonzero * for the error case. */ if (m.m2_l2 == -1) errno = 0; return(m.m2_l2); } #include #define read _read #include PUBLIC ssize_t read(fd, buffer, nbytes) int fd; void *buffer; size_t nbytes; { message m; m.m1_i1 = fd; m.m1_i2 = nbytes; m.m1_p1 = (char *) buffer; return(_syscall(FS, READ, &m)); } /* readdir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #define read _read #define readdir _readdir #include #include #include #include #include #include #include #include #include #define v7ent(p) ((struct _v7_direct *) (p)) struct dirent *readdir(DIR *dp) /* Return the next entry in a directory. Handle V7 and FLEX format dirs. */ { struct dirent *e; if (dp == nil) { errno= EBADF; return nil; } do { if (dp->_count <= 0) { /* Read the next directory block. */ dp->_count= read(dp->_fd, dp->_buf, sizeof(dp->_buf)); if (dp->_count <= 0) return nil; dp->_count/= sizeof(dp->_buf[0]); dp->_ptr= dp->_buf; /* Extent is zero of the first flex entry. */ if (dp->_v7 == (char)-1) dp->_v7= dp->_buf[0].d_extent; } if (!dp->_v7) { /* FLEX. */ e= (struct dirent *) dp->_ptr; } else { /* V7: transform to FLEX. */ e= (struct dirent *) dp->_v7f; e->d_ino= v7ent(dp->_ptr)->d_ino; e->d_extent= 1; memcpy(e->d_name, v7ent(dp->_ptr)->d_name, 14); e->d_name[14]= 0; } dp->_ptr+= 1 + e->d_extent; dp->_count-= 1 + e->d_extent; dp->_pos+= (1 + e->d_extent) * sizeof(*dp->_ptr); } while (e->d_ino == 0); return e; } #include #define rename _rename #include #include PUBLIC int rename(name, name2) _CONST char *name, *name2; { message m; m.m1_i1 = strlen(name) + 1; m.m1_i2 = strlen(name2) + 1; m.m1_p1 = (char *) name; m.m1_p2 = (char *) name2; return(_syscall(FS, RENAME, &m)); } /* rewinddir() Author: Kees J. Bot * 24 Apr 1989 */ #define nil 0 #include #define rewinddir _rewinddir #define seekdir _seekdir #include #include void rewinddir(DIR *dp) { (void) seekdir(dp, 0); } #include #define rmdir _rmdir #include PUBLIC int rmdir(name) _CONST char *name; { message m; _loadname(name, &m); return(_syscall(FS, RMDIR, &m)); } #include #define setgid _setgid #include PUBLIC int setgid(grp) gid_t grp; { message m; m.m1_i1 = (int) grp; return(_syscall(MM, SETGID, &m)); } #include #define setsid _setsid #include PUBLIC pid_t setsid() { message m; return(_syscall(MM, SETSID, &m)); } #include #define setuid _setuid #include PUBLIC int setuid(usr) Uid_t usr; { message m; m.m1_i1 = usr; return(_syscall(MM, SETUID, &m)); } #include #define sigaction _sigaction #include #include _PROTOTYPE(int __sigreturn, (void)); PUBLIC int sigaction(sig, act, oact) int sig; _CONST struct sigaction *act; struct sigaction *oact; { message m; m.m1_i2 = sig; /* XXX - yet more type puns because message struct is short of types. */ m.m1_p1 = (char *) act; m.m1_p2 = (char *) oact; m.m1_p3 = (char *) __sigreturn; return(_syscall(MM, SIGACTION, &m)); } #include #define sigpending _sigpending #include PUBLIC int sigpending(set) sigset_t *set; { message m; if (_syscall(MM, SIGPENDING, &m) < 0) return(-1); *set = (sigset_t) m.m2_l1; return(m.m_type); } #include #define sigprocmask _sigprocmask #include PUBLIC int sigprocmask(how, set, oset) int how; _CONST sigset_t *set; sigset_t *oset; { message m; if (set == (sigset_t *) NULL) { m.m2_i1 = SIG_INQUIRE; m.m2_l1 = 0; } else { m.m2_i1 = how; m.m2_l1 = (long) *set; } if (_syscall(MM, SIGPROCMASK, &m) < 0) return(-1); if (oset != (sigset_t *) NULL) *oset = (sigset_t) (m.m2_l1); return(m.m_type); } #include #define sigfillset _sigfillset #define sigjmp _sigjmp #define sigprocmask _sigprocmask #define sigreturn _sigreturn #include #include #include _PROTOTYPE( int sigjmp, (jmp_buf jb, int retval)); #if (_SETJMP_SAVES_REGS == 0) /* 'sigreturn' using a short format jmp_buf (no registers saved). */ PUBLIC int sigjmp(jb, retval) jmp_buf jb; int retval; { struct sigcontext sc; sc.sc_flags = jb[0].__flags; sc.sc_mask = jb[0].__mask; #if (CHIP == INTEL) sc.sc_pc = (int) jb[0].__pc; sc.sc_sp = (int) jb[0].__sp; sc.sc_fp = (int) jb[0].__lb; #endif #if (CHIP == M68000) sc.sc_pc = (long) jb[0].__pc; sc.sc_sp = (long) jb[0].__sp; sc.sc_fp = (long) jb[0].__lb; #endif sc.sc_retreg = retval; return sigreturn(&sc); } #endif PUBLIC int sigreturn(scp) register struct sigcontext *scp; { sigset_t set; /* The message can't be on the stack, because the stack will vanish out * from under us. The send part of sendrec will succeed, but when * a message is sent to restart the current process, who knows what will * be in the place formerly occupied by the message? */ static message m; /* Protect against race conditions by blocking all interrupts. */ sigfillset(&set); /* splhi */ sigprocmask(SIG_SETMASK, &set, (sigset_t *) NULL); m.m2_l1 = scp->sc_mask; m.m2_i2 = scp->sc_flags; m.m2_p1 = (char *) scp; return(_syscall(MM, SIGRETURN, &m)); /* normally this doesn't return */ } #include /* XXX - these have to be hidden because signal() uses them and signal() is * ANSI and not POSIX. It would be surely be better to use macros for the * library and system uses, and perhaps macros as well as functions for the * POSIX user interface. The macros would not need underlines. It may be * inconvenient to match the exact semantics of the current functions * because the interface is bloated by reporting errors. For library and * system uses, the signal number is mostly already known to be valid * before the sigset-changing routines are called. */ #define sigaddset _sigaddset #define sigdelset _sigdelset #define sigemptyset _sigemptyset #define sigfillset _sigfillset #define sigismember _sigismember #include /* Low bit of signal masks. */ #define SIGBIT_0 ((sigset_t) 1) /* Mask of valid signals (0 - _NSIG). */ #define SIGMASK (((SIGBIT_0 << _NSIG) << 1) - 1) #define sigisvalid(signo) ((unsigned) (signo) <= _NSIG) PUBLIC int sigaddset(set, signo) sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } *set |= SIGBIT_0 << signo; return 0; } PUBLIC int sigdelset(set, signo) sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } *set &= ~(SIGBIT_0 << signo); return 0; } PUBLIC int sigemptyset(set) sigset_t *set; { *set = 0; return 0; } PUBLIC int sigfillset(set) sigset_t *set; { *set = SIGMASK; return 0; } PUBLIC int sigismember(set, signo) _CONST sigset_t *set; int signo; { if (!sigisvalid(signo)) { errno = EINVAL; return -1; } if (*set & (SIGBIT_0 << signo)) return 1; return 0; } #include #include #include PUBLIC void siglongjmp(env, val) sigjmp_buf env; int val; { if (env[0].__flags & SC_SIGCONTEXT) longjmp(env, val); else _longjmp(env, val); } +_sigsuspend.c,_sleep.c-_stat.c._stime.c/_sync.c0_tcdrain.c1_tcflow.c2_tcflush.c3_tcgetattr.c4_tcsendbreak.c5_tcsetattr.c6_time.c7_times.c8_umask.c9_umount.c:_uname.c;_unlink.c<_utime.c=_wait.c>_waitpid.c?_write.c@_execlp.cA_execv.cB_execvp.cC_execve.c#include #define sigsuspend _sigsuspend #include PUBLIC int sigsuspend(set) _CONST sigset_t *set; { message m; m.m2_l1 = (long) *set; return(_syscall(MM, SIGSUSPEND, &m)); } /* sleep() - Sleep for a number of seconds. Author: Kees J. Bot * 24 Apr 2000 * (Inspired by the Minix-vmd version of same, except that * this implementation doesn't bother to check if all the signal * functions succeed. Under Minix that is no problem.) */ #include #define sleep _sleep #include #include #include static void handler(int sig) { /* Dummy signal handler. */ } unsigned sleep(unsigned sleep_seconds) { sigset_t ss_full, ss_orig, ss_alarm; struct sigaction action_alarm, action_orig; unsigned alarm_seconds, nap_seconds; /* Mask all signals. */ sigfillset(&ss_full); sigprocmask(SIG_BLOCK, &ss_full, &ss_orig); /* Cancel currently running alarm. */ alarm_seconds= alarm(0); /* How long can we nap without interruptions? */ nap_seconds= sleep_seconds; if (alarm_seconds != 0 && alarm_seconds < sleep_seconds) { nap_seconds= alarm_seconds; } /* Now sleep. */ action_alarm.sa_handler= handler; sigemptyset(&action_alarm.sa_mask); action_alarm.sa_flags= 0; sigaction(SIGALRM, &action_alarm, &action_orig); alarm(nap_seconds); /* Wait for a wakeup call, either our alarm, or some other signal. */ ss_alarm= ss_orig; sigdelset(&ss_alarm, SIGALRM); sigsuspend(&ss_alarm); /* Cancel alarm, set mask and stuff back to normal. */ nap_seconds -= alarm(0); sigaction(SIGALRM, &action_orig, NULL); sigprocmask(SIG_SETMASK, &ss_orig, NULL); /* Restore alarm counter to the time remaining. */ if (alarm_seconds != 0 && alarm_seconds >= nap_seconds) { alarm_seconds -= nap_seconds; if (alarm_seconds == 0) { raise(SIGALRM); /* Alarm expires now! */ } else { alarm(alarm_seconds); /* Count time remaining. */ } } /* Return time not slept. */ return sleep_seconds - nap_seconds; } #include #define stat _stat #include #include PUBLIC int stat(name, buffer) _CONST char *name; struct stat *buffer; { message m; m.m1_i1 = strlen(name) + 1; m.m1_p1 = (char *) name; m.m1_p2 = (char *) buffer; return(_syscall(FS, STAT, &m)); } #include #define stime _stime #include #include PUBLIC int stime(top) long *top; { message m; m.m2_l1 = *top; return(_syscall(FS, STIME, &m)); } #include #define sync _sync #include PUBLIC int sync() { message m; return(_syscall(FS, SYNC, &m)); } /* posix/_tcdrain.c Created: July 26, 1994 by Philip Homburg */ #define tcdrain _tcdrain #define ioctl _ioctl #include #include int tcdrain(fd) int fd; { return(ioctl(fd, TCDRAIN, (void *)0)); } /* posix/_tcflow.c Created: June 8, 1993 by Philip Homburg */ #define tcflow _tcflow #define ioctl _ioctl #include #include int tcflow(fd, action) int fd; int action; { return(ioctl(fd, TCFLOW, &action)); } /* tcflush() - flush buffered characters Author: Kees J. Bot * 13 Jan 1994 */ #define tcflush _tcflush #define ioctl _ioctl #include #include int tcflush(int fd, int queue_selector) { return(ioctl(fd, TCFLSH, &queue_selector)); } #define tcgetattr _tcgetattr #define ioctl _ioctl #include #include #include int tcgetattr(fd, termios_p) int fd; struct termios *termios_p; { return(ioctl(fd, TCGETS, termios_p)); } /* tcsendbreak() - send a break Author: Kees J. Bot * 13 Jan 1994 */ #define tcsendbreak _tcsendbreak #define ioctl _ioctl #include #include int tcsendbreak(int fd, int duration) { return(ioctl(fd, TCSBRK, &duration)); } /* posix/_tcsetattr.c Created: June 11, 1993 by Philip Homburg */ #define tcsetattr _tcsetattr #define ioctl _ioctl #include #include #include #include int tcsetattr(fd, opt_actions, termios_p) int fd; int opt_actions; _CONST struct termios *termios_p; { int request; switch(opt_actions) { case TCSANOW: request = TCSETS; break; case TCSADRAIN: request = TCSETSW; break; case TCSAFLUSH: request = TCSETSF; break; default: errno = EINVAL; return(-1); }; return(ioctl(fd, request, (void *) termios_p)); } #include #define time _time #include PUBLIC time_t time(tp) time_t *tp; { message m; if (_syscall(FS, TIME, &m) < 0) return( (time_t) -1); if (tp != (time_t *) 0) *tp = m.m2_l1; return(m.m2_l1); } #include #define times _times #include #include PUBLIC clock_t times(buf) struct tms *buf; { message m; m.m4_l5 = 0; /* return this if system is pre-1.6 */ if (_syscall(FS, TIMES, &m) < 0) return( (clock_t) -1); buf->tms_utime = m.m4_l1; buf->tms_stime = m.m4_l2; buf->tms_cutime = m.m4_l3; buf->tms_cstime = m.m4_l4; return(m.m4_l5); } #include #define umask _umask #include PUBLIC mode_t umask(complmode) Mode_t complmode; { message m; m.m1_i1 = complmode; return( (mode_t) _syscall(FS, UMASK, &m)); } #include #define umount _umount #include PUBLIC int umount(name) _CONST char *name; { message m; _loadname(name, &m); return(_syscall(FS, UMOUNT, &m)); } /* uname() - get system info Author: Kees J. Bot * 7 Nov 1994 * Returns information about the Minix system. Alas most * of it is gathered at compile time, so machine is wrong, and * release and version become wrong if not recompiled. * More chip types and Minix versions need to be added. */ #define uname _uname #define open _open #define read _read #define close _close #include #include #include #include #include #include #include #include int uname(name) struct utsname *name; { int hf, n, err; char *nl; /* Read the node name from /etc/hostname.file. */ if ((hf = open("/etc/hostname.file", O_RDONLY)) < 0) { if (errno != ENOENT) return(-1); strcpy(name->nodename, "noname"); } else { n = read(hf, name->nodename, sizeof(name->nodename) - 1); err = errno; close(hf); errno = err; if (n < 0) return(-1); name->nodename[n] = 0; if ((nl = strchr(name->nodename, '\n')) != NULL) { memset(nl, 0, (name->nodename + sizeof(name->nodename)) - nl); } } strcpy(name->sysname, "Minix"); strcpy(name->release, OS_RELEASE); strcpy(name->version, OS_VERSION); #if (CHIP == INTEL) name->machine[0] = 'i'; strcpy(name->machine + 1, itoa(getprocessor())); #if _WORD_SIZE == 4 strcpy(name->arch, "i386"); #else strcpy(name->arch, "i86"); #endif #endif return(0); } #include #define unlink _unlink #include PUBLIC int unlink(name) _CONST char *name; { message m; _loadname(name, &m); return(_syscall(FS, UNLINK, &m)); } /* utime(2) for POSIX Authors: Terrence W. Holm & Edwin L. Froese */ #include #define utime _utime #include #include PUBLIC int utime(name, timp) _CONST char *name; _CONST struct utimbuf *timp; { message m; if (timp == NULL) { m.m2_i1 = 0; /* name size 0 means NULL `timp' */ m.m2_i2 = strlen(name) + 1; /* actual size here */ } else { m.m2_l1 = timp->actime; m.m2_l2 = timp->modtime; m.m2_i1 = strlen(name) + 1; } m.m2_p1 = (char *) name; return(_syscall(FS, UTIME, &m)); } #include #define wait _wait #include PUBLIC pid_t wait(status) int *status; { message m; if (_syscall(MM, WAIT, &m) < 0) return(-1); if (status != 0) *status = m.m2_i1; return(m.m_type); } #include #define waitpid _waitpid #include PUBLIC pid_t waitpid(pid, status, options) pid_t pid; int *status; int options; { message m; m.m1_i1 = pid; m.m1_i2 = options; if (_syscall(MM, WAITPID, &m) < 0) return(-1); if (status != 0) *status = m.m2_i1; return m.m_type; } #include #define write _write #include PUBLIC ssize_t write(fd, buffer, nbytes) int fd; _CONST void *buffer; size_t nbytes; { message m; m.m1_i1 = fd; m.m1_i2 = nbytes; m.m1_p1 = (char *) buffer; return(_syscall(FS, WRITE, &m)); } /* execlp() - execute with PATH search Author: Kees J. Bot * 22 Jan 1994 */ #define execlp _execlp #define execvp _execvp #include int execlp(const char *file, const char *arg1, ...) /* execlp("sh", "sh", "-c", "example", (char *) 0); */ { return execvp(file, (char * const *) &arg1); } /* execv() - execute with prepared arguments Author: Kees J. Bot * 21 Jan 1994 */ #define execv _execv #define execve _execve #include extern char * const **_penviron; /* The default environment. */ int execv(const char *path, char * const *argv) { return execve(path, argv, *_penviron); } /* execvp() - execute with PATH search and prepared arguments * Author: Kees J. Bot * 21 Jan 1994 */ #define _MINIX_SOURCE #define nil 0 #define execve _execve #define execvp _execvp #define sbrk _sbrk #define stat _stat #include #include #include #include #include extern char * const **_penviron; /* The default environment. */ int execvp(const char *file, char * const *argv) /* Execute the file with a path search on $PATH, just like the shell. The * search continues on the errors ENOENT (not there), and EACCES (file not * executable or leading directories protected.) * Unlike other execvp implementations there is no default path, and no shell * is started for scripts. One is supposed to define $PATH, and use #!/bin/sh. */ { struct stat sb; const char *path; /* $PATH */ char *full; /* Full name to try. */ char *f; size_t full_size; int err= ENOENT; /* Error return on failure. */ if (strchr(file, '/') != nil || (path= getenv("PATH")) == nil) path= ""; /* Compute the maximum length the full name may have, and align. */ full_size= strlen(path) + 1 + strlen(file) + 1 + sizeof(char *) - 1; full_size&= ~(sizeof(char *) - 1); /* Claim space. */ if ((full= (char *) sbrk(full_size)) == (char *) -1) { errno= E2BIG; return -1; } /* For each directory in the path... */ do { f= full; while (*path != 0 && *path != ':') *f++= *path++; if (f > full) *f++= '/'; strcpy(f, file); /* Stat first, small speed-up, better for ptrace. */ if (stat(full, &sb) == -1) continue; (void) execve(full, argv, *_penviron); /* Prefer more interesting errno values then "not there". */ if (errno != ENOENT) err= errno; /* Continue only on some errors. */ if (err != ENOENT && err != EACCES) break; } while (*path++ != 0); (void) sbrk(-full_size); errno= err; return -1; } /* execve() - basic program execution call Author: Kees J. Bot * 21 Jan 1994 */ #define _MINIX_SOURCE #define nil 0 #define execve _execve #define sbrk _sbrk #include #include #include #include int execve(const char *path, char * const *argv, char * const *envp) { char * const *ap; char * const *ep; char *frame; char **vp; char *sp; size_t argc; size_t frame_size; size_t string_off; size_t n; int ov; message m; /* Assumptions: size_t and char *, it's all the same thing. */ /* Create a stack image that only needs to be patched up slightly * by the kernel to be used for the process to be executed. */ ov= 0; /* No overflow yet. */ frame_size= 0; /* Size of the new initial stack. */ string_off= 0; /* Offset to start of the strings. */ argc= 0; /* Argument count. */ for (ap= argv; *ap != nil; ap++) { n = sizeof(*ap) + strlen(*ap) + 1; frame_size+= n; if (frame_size < n) ov= 1; string_off+= sizeof(*ap); argc++; } for (ep= envp; *ep != nil; ep++) { n = sizeof(*ep) + strlen(*ep) + 1; frame_size+= n; if (frame_size < n) ov= 1; string_off+= sizeof(*ap); } /* Add an argument count and two terminating nulls. */ frame_size+= sizeof(argc) + sizeof(*ap) + sizeof(*ep); string_off+= sizeof(argc) + sizeof(*ap) + sizeof(*ep); /* Align. */ frame_size= (frame_size + sizeof(char *) - 1) & ~(sizeof(char *) - 1); /* The party is off if there is an overflow. */ if (ov || frame_size < 3 * sizeof(char *)) { errno= E2BIG; return -1; } /* Allocate space for the stack frame. */ if ((frame = (char *) sbrk(frame_size)) == (char *) -1) { errno = E2BIG; return -1; } /* Set arg count, init pointers to vector and string tables. */ * (size_t *) frame = argc; vp = (char **) (frame + sizeof(argc)); sp = frame + string_off; /* Load the argument vector and strings. */ for (ap= argv; *ap != nil; ap++) { *vp++= (char *) (sp - frame); n= strlen(*ap) + 1; memcpy(sp, *ap, n); sp+= n; } *vp++= nil; /* Load the environment vector and strings. */ for (ep= envp; *ep != nil; ep++) { *vp++= (char *) (sp - frame); n= strlen(*ep) + 1; memcpy(sp, *ep, n); sp+= n; } *vp++= nil; /* Padding. */ while (sp < frame + frame_size) *sp++= 0; /* We can finally make the system call. */ m.m1_i1 = strlen(path) + 1; m.m1_i2 = frame_size; m.m1_p1 = (char *) path; m.m1_p2 = frame; /* Clear unused fields */ m.m1_i3 = 0; m.m1_p3 = NULL; (void) _syscall(MM, EXEC, &m); /* Failure, return the memory used for the frame and exit. */ (void) sbrk(-frame_size); return -1; } D.;..EMakefileFclearerr.cGdata.cHdoprnt.cIdoscan.cJecvt.cKfclose.cLfeof.cMferror.cNfflush.cOfgetc.cPfgetpos.cQfgets.cRfileno.cSfillbuf.cTflushbuf.cUfopen.cVfprintf.cWfputc.cXfputs.cYfread.cZfreopen.c[fscanf.c\fseek.c]fsetpos.c^ftell.c_fwrite.c`getc.cagetchar.cbgets.ccicompute.cdloc_incl.heperror.cfprintf.cgputc.chputchar.ciputs.cjremove.ckrewind.clscanf.cmsetbuf.cnsetvbuf.cosprintf.cpsscanf.cqtmpfile.crtmpnam.csungetc.ctvfprintf.cuvprintf.cvvscanf.cwvsprintf.cxvsscanf.c# Makefile for lib/stdio. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(clearerr.o) \ $(LIBRARY)(data.o) \ $(LIBRARY)(doprnt.o) \ $(LIBRARY)(doscan.o) \ $(LIBRARY)(ecvt.o) \ $(LIBRARY)(fclose.o) \ $(LIBRARY)(feof.o) \ $(LIBRARY)(ferror.o) \ $(LIBRARY)(fflush.o) \ $(LIBRARY)(fgetc.o) \ $(LIBRARY)(fgetpos.o) \ $(LIBRARY)(fgets.o) \ $(LIBRARY)(fileno.o) \ $(LIBRARY)(fillbuf.o) \ $(LIBRARY)(flushbuf.o) \ $(LIBRARY)(fopen.o) \ $(LIBRARY)(fprintf.o) \ $(LIBRARY)(fputc.o) \ $(LIBRARY)(fputs.o) \ $(LIBRARY)(fread.o) \ $(LIBRARY)(freopen.o) \ $(LIBRARY)(fscanf.o) \ $(LIBRARY)(fseek.o) \ $(LIBRARY)(fsetpos.o) \ $(LIBRARY)(ftell.o) \ $(LIBRARY)(fwrite.o) \ $(LIBRARY)(getc.o) \ $(LIBRARY)(getchar.o) \ $(LIBRARY)(gets.o) \ $(LIBRARY)(icompute.o) \ $(LIBRARY)(perror.o) \ $(LIBRARY)(printf.o) \ $(LIBRARY)(putc.o) \ $(LIBRARY)(putchar.o) \ $(LIBRARY)(puts.o) \ $(LIBRARY)(remove.o) \ $(LIBRARY)(rewind.o) \ $(LIBRARY)(scanf.o) \ $(LIBRARY)(setbuf.o) \ $(LIBRARY)(setvbuf.o) \ $(LIBRARY)(sprintf.o) \ $(LIBRARY)(sscanf.o) \ $(LIBRARY)(tmpfile.o) \ $(LIBRARY)(tmpnam.o) \ $(LIBRARY)(ungetc.o) \ $(LIBRARY)(vfprintf.o) \ $(LIBRARY)(vprintf.o) \ $(LIBRARY)(vscanf.o) \ $(LIBRARY)(vsprintf.o) \ $(LIBRARY)(vsscanf.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(clearerr.o): clearerr.c $(CC1) clearerr.c $(LIBRARY)(data.o): data.c $(CC1) data.c $(LIBRARY)(doprnt.o): doprnt.c $(CC1) doprnt.c $(LIBRARY)(doscan.o): doscan.c $(CC1) doscan.c $(LIBRARY)(ecvt.o): ecvt.c $(CC1) ecvt.c $(LIBRARY)(fclose.o): fclose.c $(CC1) fclose.c $(LIBRARY)(feof.o): feof.c $(CC1) feof.c $(LIBRARY)(ferror.o): ferror.c $(CC1) ferror.c $(LIBRARY)(fflush.o): fflush.c $(CC1) fflush.c $(LIBRARY)(fgetc.o): fgetc.c $(CC1) fgetc.c $(LIBRARY)(fgetpos.o): fgetpos.c $(CC1) fgetpos.c $(LIBRARY)(fgets.o): fgets.c $(CC1) fgets.c $(LIBRARY)(fileno.o): fileno.c $(CC1) fileno.c $(LIBRARY)(fillbuf.o): fillbuf.c $(CC1) fillbuf.c $(LIBRARY)(flushbuf.o): flushbuf.c $(CC1) flushbuf.c $(LIBRARY)(fopen.o): fopen.c $(CC1) fopen.c $(LIBRARY)(fprintf.o): fprintf.c $(CC1) fprintf.c $(LIBRARY)(fputc.o): fputc.c $(CC1) fputc.c $(LIBRARY)(fputs.o): fputs.c $(CC1) fputs.c $(LIBRARY)(fread.o): fread.c $(CC1) fread.c $(LIBRARY)(freopen.o): freopen.c $(CC1) freopen.c $(LIBRARY)(fscanf.o): fscanf.c $(CC1) fscanf.c $(LIBRARY)(fseek.o): fseek.c $(CC1) fseek.c $(LIBRARY)(fsetpos.o): fsetpos.c $(CC1) fsetpos.c $(LIBRARY)(ftell.o): ftell.c $(CC1) ftell.c $(LIBRARY)(fwrite.o): fwrite.c $(CC1) fwrite.c $(LIBRARY)(getc.o): getc.c $(CC1) getc.c $(LIBRARY)(getchar.o): getchar.c $(CC1) getchar.c $(LIBRARY)(gets.o): gets.c $(CC1) gets.c $(LIBRARY)(icompute.o): icompute.c $(CC1) icompute.c $(LIBRARY)(perror.o): perror.c $(CC1) perror.c $(LIBRARY)(printf.o): printf.c $(CC1) printf.c $(LIBRARY)(putc.o): putc.c $(CC1) putc.c $(LIBRARY)(putchar.o): putchar.c $(CC1) putchar.c $(LIBRARY)(puts.o): puts.c $(CC1) puts.c $(LIBRARY)(remove.o): remove.c $(CC1) remove.c $(LIBRARY)(rewind.o): rewind.c $(CC1) rewind.c $(LIBRARY)(scanf.o): scanf.c $(CC1) scanf.c $(LIBRARY)(setbuf.o): setbuf.c $(CC1) setbuf.c $(LIBRARY)(setvbuf.o): setvbuf.c $(CC1) setvbuf.c $(LIBRARY)(sprintf.o): sprintf.c $(CC1) sprintf.c $(LIBRARY)(sscanf.o): sscanf.c $(CC1) sscanf.c $(LIBRARY)(tmpfile.o): tmpfile.c $(CC1) tmpfile.c $(LIBRARY)(tmpnam.o): tmpnam.c $(CC1) tmpnam.c $(LIBRARY)(ungetc.o): ungetc.c $(CC1) ungetc.c $(LIBRARY)(vfprintf.o): vfprintf.c $(CC1) vfprintf.c $(LIBRARY)(vprintf.o): vprintf.c $(CC1) vprintf.c $(LIBRARY)(vscanf.o): vscanf.c $(CC1) vscanf.c $(LIBRARY)(vsprintf.o): vsprintf.c $(CC1) vsprintf.c $(LIBRARY)(vsscanf.o): vsscanf.c $(CC1) vsscanf.c /* * clearerr.c - clear error and end-of-file indicators of a stream */ /* $Header: clearerr.c,v 1.2 91/01/03 14:23:54 ceriel Exp $ */ #include void (clearerr)(FILE *stream) { clearerr(stream); } /* * data.c - this is the initialization for the standard streams */ /* $Header: data.c,v 1.3 90/04/09 15:35:09 eck Exp $ */ #include struct __iobuf __stdin = { 0, 0, _IOREAD, 0, (unsigned char *)NULL, (unsigned char *)NULL, }; struct __iobuf __stdout = { 0, 1, _IOWRITE, 0, (unsigned char *)NULL, (unsigned char *)NULL, }; struct __iobuf __stderr = { 0, 2, _IOWRITE | _IOLBF, 0, (unsigned char *)NULL, (unsigned char *)NULL, }; FILE *__iotab[FOPEN_MAX] = { &__stdin, &__stdout, &__stderr, 0 }; /* * doprnt.c - print formatted output */ /* $Header: doprnt.c,v 1.8 91/06/10 17:06:53 ceriel Exp $ */ #include #include #include #include #include "loc_incl.h" /* gnum() is used to get the width and precision fields of a format. */ static const char * gnum(register const char *f, int *ip, va_list *app) { register int i, c; if (*f == '*') { *ip = va_arg((*app), int); f++; } else { i = 0; while ((c = *f - '0') >= 0 && c <= 9) { i = i*10 + c; f++; } *ip = i; } return f; } #if _EM_WSIZE == _EM_PSIZE #define set_pointer(flags) /* nothing */ #elif _EM_LSIZE == _EM_PSIZE #define set_pointer(flags) (flags |= FL_LONG) #else #error garbage pointer size #define set_pointer(flags) /* compilation might continue */ #endif /* print an ordinal number */ static char * o_print(va_list *ap, int flags, char *s, char c, int precision, int is_signed) { long signed_val; unsigned long unsigned_val; char *old_s = s; int base; switch (flags & (FL_SHORT | FL_LONG)) { case FL_SHORT: if (is_signed) { signed_val = (short) va_arg(*ap, int); } else { unsigned_val = (unsigned short) va_arg(*ap, unsigned); } break; case FL_LONG: if (is_signed) { signed_val = va_arg(*ap, long); } else { unsigned_val = va_arg(*ap, unsigned long); } break; default: if (is_signed) { signed_val = va_arg(*ap, int); } else { unsigned_val = va_arg(*ap, unsigned int); } break; } if (is_signed) { if (signed_val < 0) { *s++ = '-'; signed_val = -signed_val; } else if (flags & FL_SIGN) *s++ = '+'; else if (flags & FL_SPACE) *s++ = ' '; unsigned_val = signed_val; } if ((flags & FL_ALT) && (c == 'o')) *s++ = '0'; if (!unsigned_val) { if (!precision) return s; } else if (((flags & FL_ALT) && (c == 'x' || c == 'X')) || c == 'p') { *s++ = '0'; *s++ = (c == 'X' ? 'X' : 'x'); } switch (c) { case 'b': base = 2; break; case 'o': base = 8; break; case 'd': case 'i': case 'u': base = 10; break; case 'x': case 'X': case 'p': base = 16; break; } s = _i_compute(unsigned_val, base, s, precision); if (c == 'X') while (old_s != s) { *old_s = toupper(*old_s); old_s++; } return s; } int _doprnt(register const char *fmt, va_list ap, FILE *stream) { register char *s; register int j; int i, c, width, precision, zfill, flags, between_fill; int nrchars=0; const char *oldfmt; char *s1, buf[1025]; while (c = *fmt++) { if (c != '%') { #ifdef CPM if (c == '\n') { if (putc('\r', stream) == EOF) return nrchars ? -nrchars : -1; nrchars++; } #endif if (putc(c, stream) == EOF) return nrchars ? -nrchars : -1; nrchars++; continue; } flags = 0; do { switch(*fmt) { case '-': flags |= FL_LJUST; break; case '+': flags |= FL_SIGN; break; case ' ': flags |= FL_SPACE; break; case '#': flags |= FL_ALT; break; case '0': flags |= FL_ZEROFILL; break; default: flags |= FL_NOMORE; continue; } fmt++; } while(!(flags & FL_NOMORE)); oldfmt = fmt; fmt = gnum(fmt, &width, &ap); if (fmt != oldfmt) flags |= FL_WIDTHSPEC; if (*fmt == '.') { fmt++; oldfmt = fmt; fmt = gnum(fmt, &precision, &ap); if (precision >= 0) flags |= FL_PRECSPEC; } if ((flags & FL_WIDTHSPEC) && width < 0) { width = -width; flags |= FL_LJUST; } if (!(flags & FL_WIDTHSPEC)) width = 0; if (flags & FL_SIGN) flags &= ~FL_SPACE; if (flags & FL_LJUST) flags &= ~FL_ZEROFILL; s = s1 = buf; switch (*fmt) { case 'h': flags |= FL_SHORT; fmt++; break; case 'l': flags |= FL_LONG; fmt++; break; case 'L': flags |= FL_LONGDOUBLE; fmt++; break; } switch (c = *fmt++) { default: #ifdef CPM if (c == '\n') { if (putc('\r', stream) == EOF) return nrchars ? -nrchars : -1; nrchars++; } #endif if (putc(c, stream) == EOF) return nrchars ? -nrchars : -1; nrchars++; continue; case 'n': if (flags & FL_SHORT) *va_arg(ap, short *) = (short) nrchars; else if (flags & FL_LONG) *va_arg(ap, long *) = (long) nrchars; else *va_arg(ap, int *) = (int) nrchars; continue; case 's': s1 = va_arg(ap, char *); if (s1 == NULL) s1 = "(null)"; s = s1; while (precision || !(flags & FL_PRECSPEC)) { if (*s == '\0') break; s++; precision--; } break; case 'p': set_pointer(flags); /* fallthrough */ case 'b': case 'o': case 'u': case 'x': case 'X': if (!(flags & FL_PRECSPEC)) precision = 1; else if (c != 'p') flags &= ~FL_ZEROFILL; s = o_print(&ap, flags, s, c, precision, 0); break; case 'd': case 'i': flags |= FL_SIGNEDCONV; if (!(flags & FL_PRECSPEC)) precision = 1; else flags &= ~FL_ZEROFILL; s = o_print(&ap, flags, s, c, precision, 1); break; case 'c': *s++ = va_arg(ap, int); break; #ifndef NOFLOAT case 'G': case 'g': if ((flags & FL_PRECSPEC) && (precision == 0)) precision = 1; case 'f': case 'E': case 'e': if (!(flags & FL_PRECSPEC)) precision = 6; if (precision >= sizeof(buf)) precision = sizeof(buf) - 1; flags |= FL_SIGNEDCONV; s = _f_print(&ap, flags, s, c, precision); break; #endif /* NOFLOAT */ case 'r': ap = va_arg(ap, va_list); fmt = va_arg(ap, char *); continue; } zfill = ' '; if (flags & FL_ZEROFILL) zfill = '0'; j = s - s1; /* between_fill is true under the following conditions: * 1- the fill character is '0' * and * 2a- the number is of the form 0x... or 0X... * or * 2b- the number contains a sign or space */ between_fill = 0; if ((flags & FL_ZEROFILL) && (((c == 'x' || c == 'X') && (flags & FL_ALT)) || (c == 'p') || ((flags & FL_SIGNEDCONV) && ( *s1 == '+' || *s1 == '-' || *s1 == ' ')))) between_fill++; if ((i = width - j) > 0) if (!(flags & FL_LJUST)) { /* right justify */ nrchars += i; if (between_fill) { if (flags & FL_SIGNEDCONV) { j--; nrchars++; if (putc(*s1++, stream) == EOF) return nrchars ? -nrchars : -1; } else { j -= 2; nrchars += 2; if ((putc(*s1++, stream) == EOF) || (putc(*s1++, stream) == EOF)) return nrchars ? -nrchars : -1; } } do { if (putc(zfill, stream) == EOF) return nrchars ? -nrchars : -1; } while (--i); } nrchars += j; while (--j >= 0) { if (putc(*s1++, stream) == EOF) return nrchars ? -nrchars : -1; } if (i > 0) nrchars += i; while (--i >= 0) if (putc(zfill, stream) == EOF) return nrchars ? -nrchars : -1; } return nrchars; } /* * doscan.c - scan formatted input */ /* $Header: doscan.c,v 1.9 91/03/26 18:41:47 ceriel Exp $ */ #include #include #include #include #include "loc_incl.h" #if _EM_WSIZE == _EM_PSIZE #define set_pointer(flags) /* nothing */ #elif _EM_LSIZE == _EM_PSIZE #define set_pointer(flags) (flags |= FL_LONG) #else #error garbage pointer size #define set_pointer(flags) /* compilation might continue */ #endif #define NUMLEN 512 #define NR_CHARS 256 static char Xtable[NR_CHARS]; static char inp_buf[NUMLEN]; /* Collect a number of characters which constitite an ordinal number. * When the type is 'i', the base can be 8, 10, or 16, depending on the * first 1 or 2 characters. This means that the base must be adjusted * according to the format of the number. At the end of the function, base * is then set to 0, so strtol() will get the right argument. */ static char * o_collect(register int c, register FILE *stream, char type, unsigned int width, int *basep) { register char *bufp = inp_buf; register int base; switch (type) { case 'i': /* i means octal, decimal or hexadecimal */ case 'p': case 'x': case 'X': base = 16; break; case 'd': case 'u': base = 10; break; case 'o': base = 8; break; case 'b': base = 2; break; } if (c == '-' || c == '+') { *bufp++ = c; if (--width) c = getc(stream); } if (width && c == '0' && base == 16) { *bufp++ = c; if (--width) c = getc(stream); if (c != 'x' && c != 'X') { if (type == 'i') base = 8; } else if (width) { *bufp++ = c; if (--width) c = getc(stream); } } else if (type == 'i') base = 10; while (width) { if (((base == 10) && isdigit(c)) || ((base == 16) && isxdigit(c)) || ((base == 8) && isdigit(c) && (c < '8')) || ((base == 2) && isdigit(c) && (c < '2'))) { *bufp++ = c; if (--width) c = getc(stream); } else break; } if (width && c != EOF) ungetc(c, stream); if (type == 'i') base = 0; *basep = base; *bufp = '\0'; return bufp - 1; } #ifndef NOFLOAT /* The function f_collect() reads a string that has the format of a * floating-point number. The function returns as soon as a format-error * is encountered, leaving the offending character in the input. This means * that 1.el leaves the 'l' in the input queue. Since all detection of * format errors is done here, _doscan() doesn't call strtod() when it's * not necessary, although the use of the width field can cause incomplete * numbers to be passed to strtod(). (e.g. 1.3e+) */ static char * f_collect(register int c, register FILE *stream, register unsigned int width) { register char *bufp = inp_buf; int digit_seen = 0; if (c == '-' || c == '+') { *bufp++ = c; if (--width) c = getc(stream); } while (width && isdigit(c)) { digit_seen++; *bufp++ = c; if (--width) c = getc(stream); } if (width && c == '.') { *bufp++ = c; if(--width) c = getc(stream); while (width && isdigit(c)) { digit_seen++; *bufp++ = c; if (--width) c = getc(stream); } } if (!digit_seen) { if (width && c != EOF) ungetc(c, stream); return inp_buf - 1; } else digit_seen = 0; if (width && (c == 'e' || c == 'E')) { *bufp++ = c; if (--width) c = getc(stream); if (width && (c == '+' || c == '-')) { *bufp++ = c; if (--width) c = getc(stream); } while (width && isdigit(c)) { digit_seen++; *bufp++ = c; if (--width) c = getc(stream); } if (!digit_seen) { if (width && c != EOF) ungetc(c,stream); return inp_buf - 1; } } if (width && c != EOF) ungetc(c, stream); *bufp = '\0'; return bufp - 1; } #endif /* NOFLOAT */ /* * the routine that does the scanning */ int _doscan(register FILE *stream, const char *format, va_list ap) { int done = 0; /* number of items done */ int nrchars = 0; /* number of characters read */ int conv = 0; /* # of conversions */ int base; /* conversion base */ unsigned long val; /* an integer value */ register char *str; /* temporary pointer */ char *tmp_string; /* ditto */ unsigned width = 0; /* width of field */ int flags; /* some flags */ int reverse; /* reverse the checking in [...] */ int kind; register int ic = EOF; /* the input character */ #ifndef NOFLOAT long double ld_val; #endif if (!*format) return 0; while (1) { if (isspace(*format)) { while (isspace(*format)) format++; /* skip whitespace */ ic = getc(stream); nrchars++; while (isspace (ic)) { ic = getc(stream); nrchars++; } if (ic != EOF) ungetc(ic,stream); nrchars--; } if (!*format) break; /* end of format */ if (*format != '%') { ic = getc(stream); nrchars++; if (ic != *format++) break; /* error */ continue; } format++; if (*format == '%') { ic = getc(stream); nrchars++; if (ic == '%') { format++; continue; } else break; } flags = 0; if (*format == '*') { format++; flags |= FL_NOASSIGN; } if (isdigit (*format)) { flags |= FL_WIDTHSPEC; for (width = 0; isdigit (*format);) width = width * 10 + *format++ - '0'; } switch (*format) { case 'h': flags |= FL_SHORT; format++; break; case 'l': flags |= FL_LONG; format++; break; case 'L': flags |= FL_LONGDOUBLE; format++; break; } kind = *format; if ((kind != 'c') && (kind != '[') && (kind != 'n')) { do { ic = getc(stream); nrchars++; } while (isspace(ic)); if (ic == EOF) break; /* outer while */ } else if (kind != 'n') { /* %c or %[ */ ic = getc(stream); if (ic == EOF) break; /* outer while */ nrchars++; } switch (kind) { default: /* not recognized, like %q */ return conv || (ic != EOF) ? done : EOF; break; case 'n': if (!(flags & FL_NOASSIGN)) { /* silly, though */ if (flags & FL_SHORT) *va_arg(ap, short *) = (short) nrchars; else if (flags & FL_LONG) *va_arg(ap, long *) = (long) nrchars; else *va_arg(ap, int *) = (int) nrchars; } break; case 'p': /* pointer */ set_pointer(flags); /* fallthrough */ case 'b': /* binary */ case 'd': /* decimal */ case 'i': /* general integer */ case 'o': /* octal */ case 'u': /* unsigned */ case 'x': /* hexadecimal */ case 'X': /* ditto */ if (!(flags & FL_WIDTHSPEC) || width > NUMLEN) width = NUMLEN; if (!width) return done; str = o_collect(ic, stream, kind, width, &base); if (str < inp_buf || (str == inp_buf && (*str == '-' || *str == '+'))) return done; /* * Although the length of the number is str-inp_buf+1 * we don't add the 1 since we counted it already */ nrchars += str - inp_buf; if (!(flags & FL_NOASSIGN)) { if (kind == 'd' || kind == 'i') val = strtol(inp_buf, &tmp_string, base); else val = strtoul(inp_buf, &tmp_string, base); if (flags & FL_LONG) *va_arg(ap, unsigned long *) = (unsigned long) val; else if (flags & FL_SHORT) *va_arg(ap, unsigned short *) = (unsigned short) val; else *va_arg(ap, unsigned *) = (unsigned) val; } break; case 'c': if (!(flags & FL_WIDTHSPEC)) width = 1; if (!(flags & FL_NOASSIGN)) str = va_arg(ap, char *); if (!width) return done; while (width && ic != EOF) { if (!(flags & FL_NOASSIGN)) *str++ = (char) ic; if (--width) { ic = getc(stream); nrchars++; } } if (width) { if (ic != EOF) ungetc(ic,stream); nrchars--; } break; case 's': if (!(flags & FL_WIDTHSPEC)) width = 0xffff; if (!(flags & FL_NOASSIGN)) str = va_arg(ap, char *); if (!width) return done; while (width && ic != EOF && !isspace(ic)) { if (!(flags & FL_NOASSIGN)) *str++ = (char) ic; if (--width) { ic = getc(stream); nrchars++; } } /* terminate the string */ if (!(flags & FL_NOASSIGN)) *str = '\0'; if (width) { if (ic != EOF) ungetc(ic,stream); nrchars--; } break; case '[': if (!(flags & FL_WIDTHSPEC)) width = 0xffff; if (!width) return done; if ( *++format == '^' ) { reverse = 1; format++; } else reverse = 0; for (str }333= Xtable; str < &Xtable[NR_CHARS] ; str++) *str = 0; if (*format == ']') Xtable[*format++] = 1; while (*format && *format != ']') { Xtable[*format++] = 1; if (*format == '-') { format++; if (*format && *format != ']' && *(format) >= *(format -2)) { int c; for( c = *(format -2) + 1 ; c <= *format ; c++) Xtable[c] = 1; format++; } else Xtable['-'] = 1; } } if (!*format) return done; if (!(Xtable[ic] ^ reverse)) { /* MAT 8/9/96 no match must return character */ ungetc(ic, stream); return done; } if (!(flags & FL_NOASSIGN)) str = va_arg(ap, char *); do { if (!(flags & FL_NOASSIGN)) *str++ = (char) ic; if (--width) { ic = getc(stream); nrchars++; } } while (width && ic != EOF && (Xtable[ic] ^ reverse)); if (width) { if (ic != EOF) ungetc(ic, stream); nrchars--; } if (!(flags & FL_NOASSIGN)) { /* terminate string */ *str = '\0'; } break; #ifndef NOFLOAT case 'e': case 'E': case 'f': case 'g': case 'G': if (!(flags & FL_WIDTHSPEC) || width > NUMLEN) width = NUMLEN; if (!width) return done; str = f_collect(ic, stream, width); if (str < inp_buf || (str == inp_buf && (*str == '-' || *str == '+'))) return done; /* * Although the length of the number is str-inp_buf+1 * we don't add the 1 since we counted it already */ nrchars += str - inp_buf; if (!(flags & FL_NOASSIGN)) { ld_val = strtod(inp_buf, &tmp_string); if (flags & FL_LONGDOUBLE) *va_arg(ap, long double *) = (long double) ld_val; else if (flags & FL_LONG) *va_arg(ap, double *) = (double) ld_val; else *va_arg(ap, float *) = (float) ld_val; } break; #endif } /* end switch */ conv++; if (!(flags & FL_NOASSIGN) && kind != 'n') done++; format++; } return conv || (ic != EOF) ? done : EOF; } /* $Header: ecvt.c,v 1.4 90/02/27 16:47:28 eck Exp $ */ #ifndef NOFLOAT #include "../ansi/ext_fmt.h" void _dbl_ext_cvt(double value, struct EXTEND *e); char *_ext_str_cvt(struct EXTEND *e, int ndigit, int *decpt, int * sign, int ecvtflag); static char * cvt(long double value, int ndigit, int *decpt, int *sign, int ecvtflag) { struct EXTEND e; _dbl_ext_cvt(value, &e); return _ext_str_cvt(&e, ndigit, decpt, sign, ecvtflag); } char * _ecvt(long double value, int ndigit, int *decpt, int *sign) { return cvt(value, ndigit, decpt, sign, 1); } char * _fcvt(long double value, int ndigit, int *decpt, int *sign) { return cvt(value, ndigit, decpt, sign, 0); } #endif /* NOFLOAT */ /* * fclose.c - flush a stream and close the file */ /* $Header: fclose.c,v 1.4 90/01/22 11:10:54 eck Exp $ */ #include #include #include "loc_incl.h" int _close(int d); int fclose(FILE *fp) { register int i, retval = 0; for (i=0; i= FOPEN_MAX) return EOF; if (fflush(fp)) retval = EOF; if (_close(fileno(fp))) retval = EOF; if ( io_testflag(fp,_IOMYBUF) && fp->_buf ) free((void *)fp->_buf); if (fp != stdin && fp != stdout && fp != stderr) free((void *)fp); return retval; } /* * feof.c - test if eof on a stream occurred */ /* $Header: feof.c,v 1.2 89/12/18 15:00:39 eck Exp $ */ #include int (feof)(FILE *stream) { return feof(stream); } /* * ferror .c - test if an error on a stream occurred */ /* $Header: ferror.c,v 1.2 89/12/18 15:00:47 eck Exp $ */ #include int (ferror)(FILE *stream) { return ferror(stream); } /* * fflush.c - flush stream(s) */ /* $Header: fflush.c,v 1.6 90/04/04 15:52:01 eck Exp $ */ #include #include #include "loc_incl.h" ssize_t _write(int d, const char *buf, size_t nbytes); off_t _lseek(int fildes, off_t offset, int whence); int fflush(FILE *stream) { int count, c1, i, retval = 0; if (!stream) { for(i= 0; i < FOPEN_MAX; i++) if (__iotab[i] && fflush(__iotab[i])) retval = EOF; return retval; } if (!stream->_buf || (!io_testflag(stream, _IOREADING) && !io_testflag(stream, _IOWRITING))) return 0; if (io_testflag(stream, _IOREADING)) { /* (void) fseek(stream, 0L, SEEK_CUR); */ int adjust = 0; if (stream->_buf && !io_testflag(stream,_IONBF)) adjust = -stream->_count; stream->_count = 0; if (_lseek(fileno(stream), (off_t) adjust, SEEK_CUR) == -1) { stream->_flags |= _IOERR; return EOF; } if (io_testflag(stream, _IOWRITE)) stream->_flags &= ~(_IOREADING | _IOWRITING); stream->_ptr = stream->_buf; return 0; } else if (io_testflag(stream, _IONBF)) return 0; if (io_testflag(stream, _IOREAD)) /* "a" or "+" mode */ stream->_flags &= ~_IOWRITING; count = stream->_ptr - stream->_buf; stream->_ptr = stream->_buf; if ( count <= 0 ) return 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } c1 = _write(stream->_fd, (char *)stream->_buf, count); stream->_count = 0; if ( count == c1 ) return 0; stream->_flags |= _IOERR; return EOF; } void __cleanup(void) { register int i; for(i= 0; i < FOPEN_MAX; i++) if (__iotab[i] && io_testflag(__iotab[i], _IOWRITING)) (void) fflush(__iotab[i]); } /* * fgetc - get an unsigned character and return it as an int */ /* $Header: fgetc.c,v 1.1 89/05/30 13:27:35 eck Exp $ */ #include int fgetc(FILE *stream) { return getc(stream); } /* * fgetpos.c - get the position in the file */ /* $Header: fgetpos.c,v 1.2 89/12/18 15:01:03 eck Exp $ */ #include int fgetpos(FILE *stream, fpos_t *pos) { *pos = ftell(stream); if (*pos == -1) return -1; return 0; } /* * fgets.c - get a string from a file */ /* $Header: fgets.c,v 1.3 89/12/18 15:01:11 eck Exp $ */ #include char * fgets(char *s, register int n, register FILE *stream) { register int ch; register char *ptr; ptr = s; while (--n > 0 && (ch = getc(stream)) != EOF) { *ptr++ = ch; if ( ch == '\n') break; } if (ch == EOF) { if (feof(stream)) { if (ptr == s) return NULL; } else return NULL; } *ptr = '\0'; return s; } /* * fileno .c - map a stream to a file descriptor */ /* $Header: fileno.c,v 1.1 89/12/18 14:59:31 eck Exp $ */ #include int (fileno)(FILE *stream) { return stream->_fd; } /* * fillbuf.c - fill a buffer */ /* $Header: fillbuf.c,v 1.5 90/06/21 11:13:23 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include "loc_incl.h" ssize_t _read(ssize_t d, char *buf, size_t nbytes); int __fillbuf(register FILE *stream) { static unsigned char ch[FOPEN_MAX]; register int i; stream->_count = 0; if (fileno(stream) < 0) return EOF; if (io_testflag(stream, (_IOEOF | _IOERR ))) return EOF; if (!io_testflag(stream, _IOREAD)) { stream->_flags |= _IOERR; return EOF; } if (io_testflag(stream, _IOWRITING)) { stream->_flags |= _IOERR; return EOF; } if (!io_testflag(stream, _IOREADING)) stream->_flags |= _IOREADING; if (!io_testflag(stream, _IONBF) && !stream->_buf) { stream->_buf = (unsigned char *) malloc(BUFSIZ); if (!stream->_buf) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOMYBUF; stream->_bufsiz = BUFSIZ; } } /* flush line-buffered output when filling an input buffer */ for (i = 0; i < FOPEN_MAX; i++) { if (__iotab[i] && io_testflag(__iotab[i], _IOLBF)) if (io_testflag(__iotab[i], _IOWRITING)) (void) fflush(__iotab[i]); } if (!stream->_buf) { stream->_buf = &ch[fileno(stream)]; stream->_bufsiz = 1; } stream->_ptr = stream->_buf; stream->_count = _read(stream->_fd, (char *)stream->_buf, stream->_bufsiz); if (stream->_count <= 0){ if (stream->_count == 0) { stream->_flags |= _IOEOF; } else stream->_flags |= _IOERR; return EOF; } stream->_count--; return *stream->_ptr++; } /* * flushbuf.c - flush a buffer */ /* $Id: flushbuf.c,v 1.9 1996/04/24 13:06:00 ceriel Exp $ */ #include #include #include "loc_incl.h" #include off_t _lseek(int fildes, off_t offset, int whence); ssize_t _write(int d, const char *buf, int nbytes); int _isatty(int d); extern void (*_clean)(void); static int do_write(int d, char *buf, int nbytes) { int c; /* POSIX actually allows write() to return a positive value less than nbytes, so loop ... */ while ((c = _write(d, buf, nbytes)) > 0 && c < nbytes) { nbytes -= c; buf += c; } return c > 0; } int __flushbuf(int c, FILE * stream) { _clean = __cleanup; if (fileno(stream) < 0) return (unsigned char) c; if (!io_testflag(stream, _IOWRITE)) return EOF; if (io_testflag(stream, _IOREADING) && !feof(stream)) return EOF; stream->_flags &= ~_IOREADING; stream->_flags |= _IOWRITING; if (!io_testflag(stream, _IONBF)) { if (!stream->_buf) { if (stream == stdout && _isatty(fileno(stdout))) { if (!(stream->_buf = (unsigned char *) malloc(BUFSIZ))) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOLBF|_IOMYBUF; stream->_bufsiz = BUFSIZ; stream->_count = -1; } } else { if (!(stream->_buf = (unsigned char *) malloc(BUFSIZ))) { stream->_flags |= _IONBF; } else { stream->_flags |= _IOMYBUF; stream->_bufsiz = BUFSIZ; if (!io_testflag(stream, _IOLBF)) stream->_count = BUFSIZ - 1; else stream->_count = -1; } } stream->_ptr = stream->_buf; } } if (io_testflag(stream, _IONBF)) { char c1 = c; stream->_count = 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (_write(fileno(stream), &c1, 1) != 1) { stream->_flags |= _IOERR; return EOF; } return (unsigned char) c; } else if (io_testflag(stream, _IOLBF)) { *stream->_ptr++ = c; /* stream->_count has been updated in putc macro. */ if (c == '\n' || stream->_count == -stream->_bufsiz) { int count = -stream->_count; stream->_ptr = stream->_buf; stream->_count = 0; if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (! do_write(fileno(stream), (char *)stream->_buf, count)) { stream->_flags |= _IOERR; return EOF; } } } else { int count = stream->_ptr - stream->_buf; stream->_count = stream->_bufsiz - 1; stream->_ptr = stream->_buf + 1; if (count > 0) { if (io_testflag(stream, _IOAPPEND)) { if (_lseek(fileno(stream), 0L, SEEK_END) == -1) { stream->_flags |= _IOERR; return EOF; } } if (! do_write(fileno(stream), (char *)stream->_buf, count)) { *(stream->_buf) = c; stream->_flags |= _IOERR; return EOF; } } *(stream->_buf) = c; } return (unsigned char) c; } /* * fopen.c - open a stream */ /* $Header: fopen.c,v 1.8 91/02/22 16:29:46 ceriel Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include "loc_incl.h" #define PMODE 0666 /* The next 3 defines are true in all UNIX systems known to me. */ #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 /* Since the O_CREAT flag is not available on all systems, we can't get it * from the standard library. Furthermore, even if we know that * contains such a flag, it's not sure whether it can be used, since we * might be cross-compiling for another system, which may use an entirely * different value for O_CREAT (or not support such a mode). The safest * thing is to just use the Version 7 semantics for open, and use creat() * whenever necessary. * * Another problem is O_APPEND, for which the same holds. When "a" * open-mode is used, an lseek() to the end is done before every write() * system-call. * * The O_CREAT, O_TRUNC and O_APPEND given here, are only for convenience. * They are not passed to open(), so the values don't have to match a value * from the real world. It is enough when they are unique. */ #define O_CREAT 0x010 #define O_TRUNC 0x020 #define O_APPEND 0x040 int _open(const char *path, int flags); int _creat(const char *path, Mode_t mode); int _close(int d); FILE * fopen(const char *name, const char *mode) { register int i; int rwmode = 0, rwflags = 0; FILE *stream; int fd, flags = 0; for (i = 0; __iotab[i] != 0 ; i++) if ( i >= FOPEN_MAX-1 ) return (FILE *)NULL; switch(*mode++) { case 'r': flags |= _IOREAD | _IOREADING; rwmode = O_RDONLY; break; case 'w': flags |= _IOWRITE | _IOWRITING; rwmode = O_WRONLY; rwflags = O_CREAT | O_TRUNC; break; case 'a': flags |= _IOWRITE | _IOWRITING | _IOAPPEND; rwmode = O_WRONLY; rwflags |= O_APPEND | O_CREAT; break; default: return (FILE *)NULL; } while (*mode) { switch(*mode++) { case 'b': continue; case '+': rwmode = O_RDWR; flags |= _IOREAD | _IOWRITE; continue; /* The sequence may be followed by additional characters */ default: break; } break; } /* Perform a creat() when the file should be truncated or when * the file is opened for writing and the open() failed. */ if ((rwflags & O_TRUNC) || (((fd = _open(name, rwmode)) < 0) && (rwflags & O_CREAT))) { if (((fd = _creat(name, PMODE)) > 0) && flags | _IOREAD) { (void) _close(fd); fd = _open(name, rwmode); } } if (fd < 0) return (FILE *)NULL; if (( stream = (FILE *) malloc(sizeof(FILE))) == NULL ) { _close(fd); return (FILE *)NULL; } if ((flags & (_IOREAD | _IOWRITE)) == (_IOREAD | _IOWRITE)) flags &= ~(_IOREADING | _IOWRITING); stream->_count = 0; stream->_fd = fd; stream->_flags = flags; stream->_buf = NULL; __iotab[i] = stream; return stream; } /* * fprintf - write output on a stream */ /* $Header: fprintf.c,v 1.3 89/12/18 15:01:54 eck Exp $ */ #include #include #include "loc_incl.h" int fprintf(FILE *stream, const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = _doprnt (format, ap, stream); va_end(ap); return retval; } /* * fputc.c - print an unsigned character */ /* $Header: fputc.c,v 1.1 89/05/30 13:28:45 eck Exp $ */ #include int fputc(int c, FILE *stream) { return putc(c, stream); } /* * fputs - print a string */ /* $Header: fputs.c,v 1.2 89/12/18 15:02:01 eck Exp $ */ #include int fputs(register const char *s, register FILE *stream) { register int i = 0; while (*s) if (putc(*s++, stream) == EOF) return EOF; else i++; return i; } /* * fread.c - read a number of members into an array */ /* $Header: fread.c,v 1.2 89/12/18 15:02:09 eck Exp $ */ #include size_t fread(void *ptr, size_t size, size_t nmemb, register FILE *stream) { register char *cp = ptr; register int c; size_t ndone = 0; register size_t s; if (size) while ( ndone < nmemb ) { s = size; do { if ((c = getc(stream)) != EOF) *cp++ = c; else return ndone; } while (--s); ndone++; } return ndone; } /* * freopen.c - open a file and associate a stream with it */ /* $Header: freopen.c,v 1.8 90/08/28 13:44:48 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include "loc_incl.h" #define PMODE 0666 /* Do not "optimize" this file to use the open with O_CREAT if the file * does not exist. The reason is given in fopen.c. */ #define O_RDONLY 0 #define O_WRONLY 1 #define O_RDWR 2 #define O_CREAT 0x010 #define O_TRUNC 0x020 #define O_APPEND 0x040 int _open(const char *path, int flags); int _creat(const char *path, Mode_t mode); int _close(int d); FILE * freopen(const char *name, const char *mode, FILE *stream) { register int i; int rwmode = 0, rwflags = 0; int fd, flags = stream->_flags & (_IONBF | _IOFBF | _IOLBF | _IOMYBUF); (void) fflush(stream); /* ignore errors */ (void) _close(fileno(stream)); switch(*mode++) { case 'r': flags |= _IOREAD; rwmode = O_RDONLY; break; case 'w': flags |= _IOWRITE; rwmode = O_WRONLY; rwflags = O_CREAT | O_TRUNC; break; case 'a': flags |= _IOWRITE | _IOAPPEND; rwmode = O_WRONLY; rwflags |= O_APPEND | O_CREAT; break; default: return (FILE *)NULL; } while (*mode) { switch(*mode++) { case 'b': continue; case '+': rwmode = O_RDWR; flags |= _IOREAD | _IOWRITE; continue; /* The sequence may be followed by aditional characters */ default: break; } break; } if ((rwflags & O_TRUNC) || (((fd = _open(name, rwmode)) < 0) && (rwflags & O_CREAT))) { if (((fd = _creat(name, PMODE)) < 0) && flags | _IOREAD) { (void) _close(fd); fd = _open(name, rwmode); } } if (fd < 0) { for( i = 0; i < FOPEN_MAX; i++) { if (stream == __iotab[i]) { __iotab[i] = 0; break; } } if (stream != stdin && stream != stdout && stream != stderr) free((void *)stream); return (FILE *)NULL; } stream->_count = 0; stream->_fd = fd; stream->_flags = flags; return stream; } /* * fscanf.c - read formatted input from stream */ /* $Header: fscanf.c,v 1.1 89/05/30 13:29:17 eck Exp $ */ #include #include #include "loc_incl.h" int fscanf(FILE *stream, const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = _doscan(stream, format, ap); va_end(ap); return retval; } /* * fseek.c - perform an fseek */ /* $Header: fseek.c,v 1.4 90/01/22 11:12:00 eck Exp $ */ #include #if (SEEK_CUR != 1) || (SEEK_END != 2) || (SEEK_SET != 0) #error SEEK_* values are wrong #endif #include "loc_incl.h" #include off_t _lseek(int fildes, off_t offset, int whence); int fseek(FILE *stream, long int offset, int whence) { int adjust = 0; long pos; stream->_flags &= ~(_IOEOF | _IOERR); /* Clear both the end of file and error flags */ if (io_testflag(stream, _IOREADING)) { if (whence == SEEK_CUR && stream->_buf && !io_testflag(stream,_IONBF)) adjust = stream->_count; stream->_count = 0; } else if (io_testflag(stream,_IOWRITING)) { fflush(stream); } else /* neither reading nor writing. The buffer must be empty */ /* EMPTY */ ; pos = _lseek(fileno(stream), offset - adjust, whence); if (io_testflag(stream, _IOREAD) && io_testflag(stream, _IOWRITE)) stream->_flags &= ~(_IOREADING | _IOWRITING); stream->_ptr = stream->_buf; return ((pos == -1) ? -1 : 0); } /* * fsetpos.c - set the position in the file */ /* $Header: fsetpos.c,v 1.1 89/05/30 13:29:34 eck Exp $ */ #include int fsetpos(FILE *stream, fpos_t *pos) { return fseek(stream, *pos, SEEK_SET); } /* * ftell.c - obtain the value of the file-position indicator of a stream */ /* $Header: ftell.c,v 1.4 90/01/22 11:12:12 eck Exp $ */ #include #if (SEEK_CUR != 1) || (SEEK_SET != 0) || (SEEK_END != 2) #error SEEK_* values are wrong #endif #include "loc_incl.h" #include off_t _lseek(int fildes, off_t offset, int whence); long ftell(FILE *stream) { long result; int adjust = 0; if (io_testflag(stream,_IOREADING)) adjust = -stream->_count; else if (io_testflag(stream,_IOWRITING) && stream->_buf && !io_testflag(stream,_IONBF)) adjust = stream->_ptr - stream->_buf; else adjust = 0; result = _lseek(fileno(stream), (off_t)0, SEEK_CUR); if ( result == -1 ) return result; result += (long) adjust; return result; } /* * fwrite.c - write a number of array elements on a file */ /* $Header: fwrite.c,v 1.3 89/12/18 15:02:39 eck Exp $ */ #include size_t fwrite(const void *ptr, size_t size, size_t nmemb, register FILE *stream) { register const unsigned char *cp = ptr; register size_t s; size_t ndone = 0; if (size) while ( ndone < nmemb ) { s = size; do { if (putc((int)*cp, stream) == EOF) return ndone; cp++; } while (--s); ndone++; } return ndone; } /* * getc.c - read an unsigned character */ /* $Header: getc.c,v 1.2 89/12/18 15:02:45 eck Exp $ */ #include int (getc)(FILE *stream) { return getc(stream); } /* * getchar.c - read a character from the standard input stream */ /* $Header: getchar.c,v 1.2 89/12/18 15:02:53 eck Exp $ */ #include int (getchar)(void) { return getchar(); } /* * gets.c - read a line from a stream */ /* $Header: gets.c,v 1.2 89/12/18 15:03:00 eck Exp $ */ #include char * gets(char *s) { register FILE *stream = stdin; register int ch; register char *ptr; ptr = s; while ((ch = getc(stream)) != EOF && ch != '\n') *ptr++ = ch; if (ch == EOF) { if (feof(stream)) { if (ptr == s) return NULL; } else return NULL; } *ptr = '\0'; return s; } /* * icompute.c - compute an integer */ /* $Header: icompute.c,v 1.1 89/12/18 14:59:38 eck Exp $ */ #include "loc_incl.h" /* This routine is used in doprnt.c as well as in tmpfile.c and tmpnam.c. */ char * _i_compute(unsigned long val, int base, char *s, int nrdigits) { int c; c= val % base ; val /= base ; if (val || nrdigits > 1) s = _i_compute(val, base, s, nrdigits - 1); *s++ = (c>9 ? c-10+'a' : c+'0'); return s; } /* * loc_incl.h - local include file for stdio library */ /* $Header: loc_incl.h,v 1.5 91/06/10 17:07:18 ceriel Exp $ */ #include #define io_testflag(p,x) ((p)->_flags & (x)) #include #ifdef _ANSI int _doprnt(const char *format, va_list ap, FILE *stream); int _doscan(FILE * stream, const char *format, va_list ap); char *_i_compute(unsigned long val, int base, char *s, int nrdigits); char *_f_print(va_list *ap, int flags, char *s, char c, int precision); void __cleanup(void); FILE *popen(const char *command, const char *type); FILE *fdopen(int fd, const char *mode); #ifndef NOFLOAT char *_ecvt(long double value, int ndigit, int *decpt, int *sign); char *_fcvt(long double value, int ndigit, int *decpt, int *sign); #endif /* NOFLOAT */ #endif #define FL_LJUST 0x0001 /* left-justify field */ #define FL_SIGN 0x0002 /* sign in signed conversions */ #define FL_SPACE 0x0004 /* space in signed conversions */ #define FL_ALT 0x0008 /* alternate form */ #define FL_ZEROFILL 0x0010 /* fill with zero's */ #define FL_SHORT 0x0020 /* optional h */ #define FL_LONG 0x0040 /* optional l */ #define FL_LONGDOUBLE 0x0080 /* optional L */ #define FL_WIDTHSPEC 0x0100 /* field width is specified */ #define FL_PRECSPEC 0x0200 /* precision is specified */ #define FL_SIGNEDCONV 0x0400 /* may contain a sign */ #define FL_NOASSIGN 0x0800 /* do not assign (in scanf) */ #define FL_NOMORE 0x1000 /* all flags collected */ /* * perror.c - print an error message on the standard error output */ /* $Header: perror.c,v 1.1 89/05/30 13:31:30 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include #include #include "loc_incl.h" ssize_t _write(int d, const char *buf, size_t nbytes); void perror(const char *s) { char *p; int fd; p = strerror(errno); fd = fileno(stderr); fflush(stdout); fflush(stderr); if (s && *s) { _write(fd, s, strlen(s)); _write(fd, ": ", 2); } _write(fd, p, strlen(p)); _write(fd, "\n", 1); } /* * printf - write on the standard output stream */ /* $Header: printf.c,v 1.3 89/12/18 15:03:08 eck Exp $ */ #include #include #include "loc_incl.h" int printf(const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = _doprnt(format, ap, stdout); va_end(ap); return retval; } /* * putc.c - print (or buffer) one character */ /* $Header: putc.c,v 1.2 89/12/18 15:03:15 eck Exp $ */ #include int (putc)(int c, FILE *stream) { return putc(c, stream); } /* * putchar.c - print (or buffer) a character on the standard output stream */ /* $Header: putchar.c,v 1.2 89/12/18 15:03:23 eck Exp $ */ #include int (putchar)(int c) { return putchar(c); } /* * puts.c - print a string onto the standard output stream */ /* $Header: puts.c,v 1.2 89/12/18 15:03:30 eck Exp $ */ #include int puts(register const char *s) { register FILE *file = stdout; register int i = 0; while (*s) { if (putc(*s++, file) == EOF) return EOF; else i++; } if (putc('\n', file) == EOF) return EOF; return i + 1; } /* * remove.c - remove a file */ /* $Header: remove.c,v 1.2 90/01/22 11:12:44 eck Exp $ */ #include int _unlink(const char *path); int remove(const char *filename) { return _unlink(filename); } /* * rewind.c - set the file position indicator of a stream to the start */ /* $Header: rewind.c,v 1.1 89/05/30 13:32:52 eck Exp $ */ #include #include "loc_incl.h" void rewind(FILE *stream) { (void) fseek(stream, 0L, SEEK_SET); clearerr(stream); } /* * scanf.c - read formatted input from the standard input stream */ /* $Header: scanf.c,v 1.1 89/05/30 13:33:03 eck Exp $ */ #include #include #include "loc_incl.h" int scanf(const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = _doscan(stdin, format, ap); va_end(ap); return retval; } /* * setbuf.c - control buffering of a stream */ /* $Header: setbuf.c,v 1.2 89/06/26 10:36:22 eck Exp $ */ #include #include "loc_incl.h" void setbuf(register FILE *stream, char *buf) { (void) setvbuf(stream, buf, (buf ? _IOFBF : _IONBF), (size_t) BUFSIZ); } /* * setbuf.c - control buffering of a stream */ /* $Id: setvbuf.c,v 1.8 1995/12/18 11:02:18 ceriel Exp $ */ #include #include #include "loc_incl.h" extern void (*_clean)(void); int setvbuf(register FILE *stream, char *buf, int mode, size_t size) { int retval = 0; _clean = __cleanup; if (mode != _IOFBF && mode != _IOLBF && mode != _IONBF) return EOF; if (stream->_buf && io_testflag(stream,_IOMYBUF) ) free((void *)stream->_buf); stream->_flags &= ~(_IOMYBUF | _IONBF | _IOLBF); if (buf && size <= 0) retval = EOF; if (!buf && (mode != _IONBF)) { if (size <= 0 || (buf = (char *) malloc(size)) == NULL) { retval = EOF; } else { stream->_flags |= _IOMYBUF; } } stream->_buf = (unsigned char *) buf; stream->_count = 0; stream->_flags |= mode; stream->_ptr = stream->_buf; if (!buf) { stream->_bufsiz = 1; } else { stream->_bufsiz = size; } return retval; } /* * sprintf - print formatted output on an array */ /* $Header: sprintf.c,v 1.2 89/12/18 15:03:52 eck Exp $ */ #include #include #include #include "loc_incl.h" int sprintf(char *s, const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = vsnprintf(s, INT_MAX, format, ap); va_end(ap); return retval; } int snprintf(char *s, size_t n, const char *format, ...) { va_list ap; int retval; va_start(ap, format); retval = vsnprintf(s, n, format, ap); va_end(ap); return retval; } /* * sscanf - read formatted output from a string */ /* $Header: sscanf.c,v 1.3 90/09/26 13:17:39 eck Exp $ */ #include #include #include #include "loc_incl.h" int sscanf(const char *s, const char *format, ...) { va_list ap; int retval; FILE tmp_stream; va_start(ap, format); tmp_stream._fd = -1; tmp_stream._flags = _IOREAD + _IONBF + _IOREADING; tmp_stream._buf = (unsigned char *) s; tmp_stream._ptr = (unsigned char *) s; tmp_stream._count = strlen(s); retval = _doscan(&tmp_stream, format, ap); va_end(ap); return retval; } /* * tmpfile.c - create and open a temporary file */ /* $Header: tmpfile.c,v 1.3 90/01/22 11:13:15 eck Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include "loc_incl.h" pid_t _getpid(void); FILE * tmpfile(void) { static char name_buffer[L_tmpnam] = "/tmp/tmp." ; static char *name = NULL; FILE *file; if (!name) { name = name_buffer + strlen(name_buffer); name = _i_compute(_getpid(), 10, name, 5); *name = '\0'; } file = fopen(name_buffer,"wb+"); if (!file) return (FILE *)NULL; (void) remove(name_buffer); return file; } /* * tmpnam.c - create a unique filename */ /* $Header: tmpnam.c,v 1.4 91/02/26 09:28:39 ceriel Exp $ */ #if defined(_POSIX_SOURCE) #include #endif #include #include #include "loc_incl.h" pid_t _getpid(void); char * tmpnam(char *s) { static char name_buffer[L_tmpnam] = "/tmp/tmp."; static unsigned long count = 0; static char *name = NULL; if (!name) { name = name_buffer + strlen(name_buffer); name = _i_compute((unsigned long)_getpid(), 10, name, 5); *name++ = '.'; *name = '\0'; } if (++count > TMP_MAX) count = 1; /* wrap-around */ *_i_compute(count, 10, name, 3) = '\0'; if (s) return strcpy(s, name_buffer); else return name_buffer; } /* * ungetc.c - push a character back onto an input stream */ /* $Header: ungetc.c,v 1.3 90/03/28 16:33:05 eck Exp $ */ #include #include "loc_incl.h" int ungetc(int ch, FILE *stream) { unsigned char *p; if (ch == EOF || !io_testflag(stream,_IOREADING)) return EOF; if (stream->_ptr == stream->_buf) { if (stream->_count != 0) return EOF; stream->_ptr++; } stream->_count++; p = --(stream->_ptr); /* ??? Bloody vax assembler !!! */ /* ungetc() in sscanf() shouldn't write in rom */ if (*p != (unsigned char) ch) *p = (unsigned char) ch; return ch; } /* * vfprintf - formatted output without ellipsis */ /* $Header: vfprintf.c,v 1.2 89/12/18 15:04:07 eck Exp $ */ #include #include #include "loc_incl.h" int vfprintf(FILE *stream, const char *format, va_list arg) { return _doprnt (format, arg, stream); } /* * vprintf - formatted output without ellipsis to the standard output stream */ /* $Header: vprintf.c,v 1.3 89/12/18 15:04:14 eck Exp $ */ #include #include #include "loc_incl.h" int vprintf(const char *format, va_list arg) { return _doprnt(format, arg, stdout); } /* * vscanf.c - read formatted input from the standard input stream */ #include #include #include "loc_incl.h" int vscanf(const char *format, va_list ap) { return _doscan(stdin, format, ap); } /* * vsprintf - print formatted output without ellipsis on an array */ /* $Header: vsprintf.c,v 1.2 90/11/13 10:56:53 eck Exp $ */ #include #include #include #include "loc_incl.h" int vsnprintf(char *s, size_t n, const char *format, va_list arg) { int retval; FILE tmp_stream; tmp_stream._fd = -1; tmp_stream._flags = _IOWRITE + _IONBF + _IOWRITING; tmp_stream._buf = (unsigned char *) s; tmp_stream._ptr = (unsigned char *) s; tmp_stream._count = n-1; retval = _doprnt(format, arg, &tmp_stream); tmp_stream._count = 1; putc('\0',&tmp_stream); return retval; } int vsprintf(char *s, const char *format, va_list arg) { return vsnprintf(s, INT_MAX, format, arg); } /* * vsscanf - read formatted output from a string */ #include #include #include #include "loc_incl.h" int vsscanf(const char *s, const char *format, va_list ap) { FILE tmp_stream; tmp_stream._fd = -1; tmp_stream._flags = _IOREAD + _IONBF + _IOREADING; tmp_stream._buf = (unsigned char *) s; tmp_stream._ptr = (unsigned char *) s; tmp_stream._count = strlen(s); return _doscan(&tmp_stream, format, ap); } y.;..zMakefile{_exit.s|access.s}alarm.s~brk.scfgetispeed.scfgetospeed.scfsetispeed.scfsetospeed.schdir.schmod.schown.schroot.sclose.sclosedir.screat.sdup.sdup2.sexecl.sexecle.sexecv.sexecve.sfcntl.sfork.sfpathconf.sfstat.sgetcwd.sgetegid.sgeteuid.sgetgid.sgetgroups.sgetpgrp.sgetpid.sgetppid.sgetuid.sioctl.sisatty.skill.slink.slseek.smkdir.smkfifo.smknod.smktemp.smount.sopen.sopendir.spathconf.spause.spipe.sptrace.sread.sreaddir.sreboot.srename.srewinddir.srmdir.ssbrk.sseekdir.ssetgid.ssetsid.ssetuid.s# Makefile for lib/syscall. CC1 = $(CC) -c LIBRARY = ../libc.a all: $(LIBRARY) OBJECTS = \ $(LIBRARY)(_exit.o) \ $(LIBRARY)(access.o) \ $(LIBRARY)(alarm.o) \ $(LIBRARY)(brk.o) \ $(LIBRARY)(cfgetispeed.o) \ $(LIBRARY)(cfgetospeed.o) \ $(LIBRARY)(cfsetispeed.o) \ $(LIBRARY)(cfsetospeed.o) \ $(LIBRARY)(chdir.o) \ $(LIBRARY)(chmod.o) \ $(LIBRARY)(chown.o) \ $(LIBRARY)(chroot.o) \ $(LIBRARY)(close.o) \ $(LIBRARY)(closedir.o) \ $(LIBRARY)(creat.o) \ $(LIBRARY)(dup.o) \ $(LIBRARY)(dup2.o) \ $(LIBRARY)(execl.o) \ $(LIBRARY)(execle.o) \ $(LIBRARY)(execlp.o) \ $(LIBRARY)(execv.o) \ $(LIBRARY)(execve.o) \ $(LIBRARY)(execvp.o) \ $(LIBRARY)(fcntl.o) \ $(LIBRARY)(fork.o) \ $(LIBRARY)(fpathconf.o) \ $(LIBRARY)(fstat.o) \ $(LIBRARY)(getcwd.o) \ $(LIBRARY)(getegid.o) \ $(LIBRARY)(geteuid.o) \ $(LIBRARY)(getgid.o) \ $(LIBRARY)(getgroups.o) \ $(LIBRARY)(getpgrp.o) \ $(LIBRARY)(getpid.o) \ $(LIBRARY)(getppid.o) \ $(LIBRARY)(getuid.o) \ $(LIBRARY)(ioctl.o) \ $(LIBRARY)(isatty.o) \ $(LIBRARY)(kill.o) \ $(LIBRARY)(link.o) \ $(LIBRARY)(lseek.o) \ $(LIBRARY)(mkdir.o) \ $(LIBRARY)(mkfifo.o) \ $(LIBRARY)(mknod.o) \ $(LIBRARY)(mktemp.o) \ $(LIBRARY)(mount.o) \ $(LIBRARY)(open.o) \ $(LIBRARY)(opendir.o) \ $(LIBRARY)(pathconf.o) \ $(LIBRARY)(pause.o) \ $(LIBRARY)(pipe.o) \ $(LIBRARY)(ptrace.o) \ $(LIBRARY)(read.o) \ $(LIBRARY)(readdir.o) \ $(LIBRARY)(reboot.o) \ $(LIBRARY)(rename.o) \ $(LIBRARY)(rewinddir.o) \ $(LIBRARY)(rmdir.o) \ $(LIBRARY)(sbrk.o) \ $(LIBRARY)(seekdir.o) \ $(LIBRARY)(setgid.o) \ $(LIBRARY)(setsid.o) \ $(LIBRARY)(setuid.o) \ $(LIBRARY)(sigaction.o) \ $(LIBRARY)(sigaddset.o) \ $(LIBRARY)(sigdelset.o) \ $(LIBRARY)(sigemptyset.o) \ $(LIBRARY)(sigfillset.o) \ $(LIBRARY)(sigismember.o) \ $(LIBRARY)(sigpending.o) \ $(LIBRARY)(sigprocmask.o) \ $(LIBRARY)(sigreturn.o) \ $(LIBRARY)(sigsuspend.o) \ $(LIBRARY)(sleep.o) \ $(LIBRARY)(stat.o) \ $(LIBRARY)(stime.o) \ $(LIBRARY)(sync.o) \ $(LIBRARY)(svrctl.o) \ $(LIBRARY)(tcdrain.o) \ $(LIBRARY)(tcflow.o) \ $(LIBRARY)(tcflush.o) \ $(LIBRARY)(tcgetattr.o) \ $(LIBRARY)(tcsendbreak.o) \ $(LIBRARY)(tcsetattr.o) \ $(LIBRARY)(time.o) \ $(LIBRARY)(times.o) \ $(LIBRARY)(umask.o) \ $(LIBRARY)(umount.o) \ $(LIBRARY)(uname.o) \ $(LIBRARY)(unlink.o) \ $(LIBRARY)(utime.o) \ $(LIBRARY)(wait.o) \ $(LIBRARY)(waitpid.o) \ $(LIBRARY)(write.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(_exit.o): _exit.s $(CC1) _exit.s $(LIBRARY)(access.o): access.s $(CC1) access.s $(LIBRARY)(alarm.o): alarm.s $(CC1) alarm.s $(LIBRARY)(brk.o): brk.s $(CC1) brk.s $(LIBRARY)(cfgetispeed.o): cfgetispeed.s $(CC1) cfgetispeed.s $(LIBRARY)(cfgetospeed.o): cfgetospeed.s $(CC1) cfgetospeed.s $(LIBRARY)(cfsetispeed.o): cfsetispeed.s $(CC1) cfsetispeed.s $(LIBRARY)(cfsetospeed.o): cfsetospeed.s $(CC1) cfsetospeed.s $(LIBRARY)(chdir.o): chdir.s $(CC1) chdir.s $(LIBRARY)(chmod.o): chmod.s $(CC1) chmod.s $(LIBRARY)(chown.o): chown.s $(CC1) chown.s $(LIBRARY)(chroot.o): chroot.s $(CC1) chroot.s $(LIBRARY)(close.o): close.s $(CC1) close.s $(LIBRARY)(closedir.o): closedir.s $(CC1) closedir.s $(LIBRARY)(creat.o): creat.s $(CC1) creat.s $(LIBRARY)(dup.o): dup.s $(CC1) dup.s $(LIBRARY)(dup2.o): dup2.s $(CC1) dup2.s $(LIBRARY)(execl.o): execl.s $(CC1) execl.s $(LIBRARY)(execle.o): execle.s $(CC1) execle.s $(LIBRARY)(execlp.o): execlp.s $(CC1) execlp.s $(LIBRARY)(execv.o): execv.s $(CC1) execv.s $(LIBRARY)(execve.o): execve.s $(CC1) execve.s $(LIBRARY)(execvp.o): execvp.s $(CC1) execvp.s $(LIBRARY)(fcntl.o): fcntl.s $(CC1) fcntl.s $(LIBRARY)(fork.o): fork.s $(CC1) fork.s $(LIBRARY)(fpathconf.o): fpathconf.s $(CC1) fpathconf.s $(LIBRARY)(fstat.o): fstat.s $(CC1) fstat.s $(LIBRARY)(getcwd.o): getcwd.s $(CC1) getcwd.s $(LIBRARY)(getegid.o): getegid.s $(CC1) getegid.s $(LIBRARY)(geteuid.o): geteuid.s $(CC1) geteuid.s $(LIBRARY)(getgid.o): getgid.s $(CC1) getgid.s $(LIBRARY)(getgroups.o): getgroups.s $(CC1) getgroups.s $(LIBRARY)(getpgrp.o): getpgrp.s $(CC1) getpgrp.s $(LIBRARY)(getpid.o): getpid.s $(CC1) getpid.s $(LIBRARY)(getppid.o): getppid.s $(CC1) getppid.s $(LIBRARY)(getuid.o): getuid.s $(CC1) getuid.s $(LIBRARY)(ioctl.o): ioctl.s $(CC1) ioctl.s $(LIBRARY)(isatty.o): isatty.s $(CC1) isatty.s $(LIBRARY)(kill.o): kill.s $(CC1) kill.s $(LIBRARY)(link.o): link.s $(CC1) link.s $(LIBRARY)(lseek.o): lseek.s $(CC1) lseek.s $(LIBRARY)(mkdir.o): mkdir.s $(CC1) mkdir.s $(LIBRARY)(mkfifo.o): mkfifo.s $(CC1) mkfifo.s $(LIBRARY)(mknod.o): mknod.s $(CC1) mknod.s $(LIBRARY)(mktemp.o): mktemp.s $(CC1) mktemp.s $(LIBRARY)(mount.o): mount.s $(CC1) mount.s $(LIBRARY)(open.o): open.s $(CC1) open.s $(LIBRARY)(opendir.o): opendir.s $(CC1) opendir.s $(LIBRARY)(pathconf.o): pathconf.s $(CC1) pathconf.s $(LIBRARY)(pause.o): pause.s $(CC1) pause.s $(LIBRARY)(pipe.o): pipe.s $(CC1) pipe.s $(LIBRARY)(ptrace.o): ptrace.s $(CC1) ptrace.s $(LIBRARY)(read.o): read.s $(CC1) read.s $(LIBRARY)(readdir.o): readdir.s $(CC1) readdir.s $(LIBRARY)(reboot.o): reboot.s $(CC1) reboot.s $(LIBRARY)(rename.o): rename.s $(CC1) rename.s $(LIBRARY)(rewinddir.o): rewinddir.s $(CC1) rewinddir.s $(LIBRARY)(rmdir.o): rmdir.s $(CC1) rmdir.s $(LIBRARY)(sbrk.o): sbrk.s $(CC1) sbrk.s $(LIBRARY)(seekdir.o): seekdir.s $(CC1) seekdir.s $(LIBRARY)(setgid.o): setgid.s $(CC1) setgid.s $(LIBRARY)(setsid.o): setsid.s $(CC1) setsid.s $(LIBRARY)(setuid.o): setuid.s $(CC1) setuid.s $(LIBRARY)(sigaction.o): sigaction.s $(CC1) sigaction.s $(LIBRARY)(sigaddset.o): sigaddset.s $(CC1) sigaddset.s $(LIBRARY)(sigdelset.o): sigdelset.s $(CC1) sigdelset.s $(LIBRARY)(sigemptyset.o): sigemptyset.s $(CC1) sigemptyset.s $(LIBRARY)(sigfillset.o): sigfillset.s $(CC1) sigfillset.s $(LIBRARY)(sigismember.o): sigismember.s $(CC1) sigismember.s $(LIBRARY)(sigpending.o): sigpending.s $(CC1) sigpending.s $(LIBRARY)(sigprocmask.o): sigprocmask.s $(CC1) sigprocmask.s $(LIBRARY)(sigreturn.o): sigreturn.s $(CC1) sigreturn.s $(LIBRARY)(sigsuspend.o): sigsuspend.s $(CC1) sigsuspend.s $(LIBRARY)(sleep.o): sleep.s $(CC1) sleep.s $(LIBRARY)(stat.o): stat.s $(CC1) stat.s $(LIBRARY)(stime.o): stime.s $(CC1) stime.s $(LIBRARY)(sync.o): sync.s $(CC1) sync.s $(LIBRARY)(svrctl.o): svrctl.s $(CC1) svrctl.s $(LIBRARY)(tcdrain.o): tcdrain.s $(CC1) tcdrain.s $(LIBRARY)(tcflow.o): tcflow.s $(CC1) tcflow.s $(LIBRARY)(tcflush.o): tcflush.s $(CC1) tcflush.s $(LIBRARY)(tcgetattr.o): tcgetattr.s $(CC1) tcgetattr.s $(LIBRARY)(tcsendbreak.o): tcsendbreak.s $(CC1) tcsendbreak.s $(LIBRARY)(tcsetattr.o): tcsetattr.s $(CC1) tcsetattr.s $(LIBRARY)(time.o): time.s $(CC1) time.s $(LIBRARY)(times.o): times.s $(CC1) times.s $(LIBRARY)(umask.o): umask.s $(CC1) umask.s $(LIBRARY)(umount.o): umount.s $(CC1) umount.s $(LIBRARY)(uname.o): uname.s $(CC1) uname.s $(LIBRARY)(unlink.o): unlink.s $(CC1) unlink.s $(LIBRARY)(utime.o): utime.s $(CC1) utime.s $(LIBRARY)(wait.o): wait.s $(CC1) wait.s $(LIBRARY)(waitpid.o): waitpid.s $(CC1) waitpid.s $(LIBRARY)(write.o): write.s $(CC1) write.s .sect .text .extern ___exit .define __exit .align 2 __exit: jmp ___exit .sect .text .extern __access .define _access .align 2 _access: jmp __access .sect .text .extern __alarm .define _alarm .align 2 _alarm: jmp __alarm .sect .text .extern __brk .define _brk .align 2 _brk: jmp __brk .sect .text .extern __cfgetispeed .define _cfgetispeed .align 2 _cfgetispeed: jmp __cfgetispeed .sect .text .extern __cfgetospeed .define _cfgetospeed .align 2 _cfgetospeed: jmp __cfgetospeed .sect .text .extern __cfsetispeed .define _cfsetispeed .align 2 _cfsetispeed: jmp __cfsetispeed .sect .text .extern __cfsetospeed .define _cfsetospeed .align 2 _cfsetospeed: jmp __cfsetospeed .sect .text .extern __chdir .define _chdir .align 2 _chdir: jmp __chdir .sect .text .extern __chmod .define _chmod .align 2 _chmod: jmp __chmod .sect .text .extern __chown .define _chown .align 2 _chown: jmp __chown .sect .text .extern __chroot .define _chroot .align 2 _chroot: jmp __chroot .sect .text .extern __close .define _close .align 2 _close: jmp __close .sect .text .extern __closedir .define _closedir .align 2 _closedir: jmp __closedir .sect .text .extern __creat .define _creat .align 2 _creat: jmp __creat .sect .text .extern __dup .define _dup .align 2 _dup: jmp __dup .sect .text .extern __dup2 .define _dup2 .align 2 _dup2: jmp __dup2 .sect .text .extern __execl .define _execl .align 2 _execl: jmp __execl .sect .text .extern __execle .define _execle .align 2 _execle: jmp __execle .sect .text .extern __execv .define _execv .align 2 _execv: jmp __execv .sect .text .extern __execve .define _execve .align 2 _execve: jmp __execve .sect .text .extern __fcntl .define _fcntl .align 2 _fcntl: jmp __fcntl .sect .text .extern __fork .define _fork .align 2 _fork: jmp __fork .sect .text .extern __fpathconf .define _fpathconf .align 2 _fpathconf: jmp __fpathconf .sect .text .extern __fstat .define _fstat .align 2 _fstat: jmp __fstat .sect .text .extern __getcwd .define _getcwd .align 2 _getcwd: jmp __getcwd .sect .text .extern __getegid .define _getegid .align 2 _getegid: jmp __getegid .sect .text .extern __geteuid .define _geteuid .align 2 _geteuid: jmp __geteuid .sect .text .extern __getgid .define _getgid .align 2 _getgid: jmp __getgid .sect .text .extern __getgroups .define _getgroups .align 2 _getgroups: jmp __getgroups .sect .text .extern __getpgrp .define _getpgrp .align 2 _getpgrp: jmp __getpgrp .sect .text .extern __getpid .define _getpid .align 2 _getpid: jmp __getpid .sect .text .extern __getppid .define _getppid .align 2 _getppid: jmp __getppid .sect .text .extern __getuid .define _getuid .align 2 _getuid: jmp __getuid .sect .text .extern __ioctl .define _ioctl .align 2 _ioctl: jmp __ioctl .sect .text .extern __isatty .define _isatty .align 2 _isatty: jmp __isatty .sect .text .extern __kill .define _kill .align 2 _kill: jmp __kill .sect .text .extern __link .define _link .align 2 _link: jmp __link .sect .text .extern __lseek .define _lseek .align 2 _lseek: jmp __lseek .sect .text .extern __mkdir .define _mkdir .align 2 _mkdir: jmp __mkdir .sect .text .extern __mkfifo .define _mkfifo .align 2 _mkfifo: jmp __mkfifo .sect .text .extern __mknod .define _mknod .align 2 _mknod: jmp __mknod .sect .text .extern __mktemp .define _mktemp .align 2 _mktemp: jmp __mktemp .sect .text .extern __mount .define _mount .align 2 _mount: jmp __mount .sect .text .extern __open .define _open .align 2 _open: jmp __open .sect .text .extern __opendir .define _opendir .align 2 _opendir: jmp __opendir .sect .text .extern __pathconf .define _pathconf .align 2 _pathconf: jmp __pathconf .sect .text .extern __pause .define _pause .align 2 _pause: jmp __pause .sect .text .extern __pipe .define _pipe .align 2 _pipe: jmp __pipe .sect .text .extern __ptrace .define _ptrace .align 2 _ptrace: jmp __ptrace .sect .text .extern __read .define _read .align 2 _read: jmp __read .sect .text .extern __readdir .define _readdir .align 2 _readdir: jmp __readdir .sect .text .extern __reboot .define _reboot .align 2 _reboot: jmp __reboot .sect .text .extern __rename .define _rename .align 2 _rename: jmp __rename .sect .text .extern __rewinddir .define _rewinddir .align 2 _rewinddir: jmp __rewinddir .sect .text .extern __rmdir .define _rmdir .align 2 _rmdir: jmp __rmdir .sect .text .extern __sbrk .define _sbrk .align 2 _sbrk: jmp __sbrk .sect .text .extern __seekdir .define _seekdir .align 2 _seekdir: jmp __seekdir .sect .text .extern __setgid .define _setgid .align 2 _setgid: jmp __setgid .sect .text .extern __setsid .define _setsid .align 2 _setsid: jmp __setsid .sect .text .extern __setuid .define _setuid .align 2 _setuid: jmp __setuid sigaction.ssigaddset.ssigdelset.ssigemptyset.ssigfillset.ssigismember.ssigpending.ssigprocmask.ssigreturn.ssigsuspend.ssleep.sstat.sstime.ssync.stcdrain.stcflow.stcflush.stcgetattr.stcsendbreak.stcsetattr.stime.stimes.sumask.sumount.suname.sunlink.sutime.swait.swaitpid.swrite.ssvrctl.sexeclp.sexecvp.s.sect .text .extern __sigaction .define _sigaction .align 2 _sigaction: jmp __sigaction .sect .text .extern __sigaddset .define _sigaddset .align 2 _sigaddset: jmp __sigaddset .sect .text .extern __sigdelset .define _sigdelset .align 2 _sigdelset: jmp __sigdelset .sect .text .extern __sigemptyset .define _sigemptyset .align 2 _sigemptyset: jmp __sigemptyset .sect .text .extern __sigfillset .define _sigfillset .align 2 _sigfillset: jmp __sigfillset .sect .text .extern __sigismember .define _sigismember .align 2 _sigismember: jmp __sigismember .sect .text .extern __sigpending .define _sigpending .align 2 _sigpending: jmp __sigpending .sect .text .extern __sigprocmask .define _sigprocmask .align 2 _sigprocmask: jmp __sigprocmask .sect .text .extern __sigreturn .define _sigreturn .align 2 _sigreturn: jmp __sigreturn .sect .text .extern __sigsuspend .define _sigsuspend .align 2 _sigsuspend: jmp __sigsuspend .sect .text .extern __sleep .define _sleep .align 2 _sleep: jmp __sleep .sect .text .extern __stat .define _stat .align 2 _stat: jmp __stat .sect .text .extern __stime .define _stime .align 2 _stime: jmp __stime .sect .text .extern __sync .define _sync .align 2 _sync: jmp __sync .sect .text .extern __tcdrain .define _tcdrain .align 2 _tcdrain: jmp __tcdrain .sect .text .extern __tcflow .define _tcflow .align 2 _tcflow: jmp __tcflow .sect .text .extern __tcflush .define _tcflush .align 2 _tcflush: jmp __tcflush .sect .text .extern __tcgetattr .define _tcgetattr .align 2 _tcgetattr: jmp __tcgetattr .sect .text .extern __tcsendbreak .define _tcsendbreak .align 2 _tcsendbreak: jmp __tcsendbreak .sect .text .extern __tcsetattr .define _tcsetattr .align 2 _tcsetattr: jmp __tcsetattr .sect .text .extern __time .define _time .align 2 _time: jmp __time .sect .text .extern __times .define _times .align 2 _times: jmp __times .sect .text .extern __umask .define _umask .align 2 _umask: jmp __umask .sect .text .extern __umount .define _umount .align 2 _umount: jmp __umount .sect .text .extern __uname .define _uname .align 2 _uname: jmp __uname .sect .text .extern __unlink .define _unlink .align 2 _unlink: jmp __unlink .sect .text .extern __utime .define _utime .align 2 _utime: jmp __utime .sect .text .extern __wait .define _wait .align 2 _wait: jmp __wait .sect .text .extern __waitpid .define _waitpid .align 2 _waitpid: jmp __waitpid .sect .text .extern __write .define _write .align 2 _write: jmp __write .sect .text .extern __svrctl .define _svrctl .align 2 _svrctl: jmp __svrctl .sect .text .extern __execlp .define _execlp .align 2 _execlp: jmp __execlp .sect .text .extern __execvp .define _execvp .align 2 _execvp: jmp __execvp .;..Makefilesys_abort.csys_copy.csys_endsig.csys_exec.csys_fork.csys_getmap.csys_getsp.csys_kill.csys_newmap.csys_oldsig.csys_sendsig.csys_sigret.csys_times.csys_trace.csys_xit.csyslib.htaskcall.ckmalloc.ckprintf.csys_sysctl.cputk.csys_findproc.c# Makefile for lib/syslib. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBSYS = ../libsys.a all: $(LIBSYS) OBJECTS = \ $(LIBSYS)(kmalloc.o) \ $(LIBSYS)(kprintf.o) \ $(LIBSYS)(putk.o) \ $(LIBSYS)(sys_abort.o) \ $(LIBSYS)(sys_copy.o) \ $(LIBSYS)(sys_endsig.o) \ $(LIBSYS)(sys_exec.o) \ $(LIBSYS)(sys_findproc.o) \ $(LIBSYS)(sys_fork.o) \ $(LIBSYS)(sys_getmap.o) \ $(LIBSYS)(sys_getsp.o) \ $(LIBSYS)(sys_kill.o) \ $(LIBSYS)(sys_newmap.o) \ $(LIBSYS)(sys_oldsig.o) \ $(LIBSYS)(sys_sendsig.o) \ $(LIBSYS)(sys_sigret.o) \ $(LIBSYS)(sys_sysctl.o) \ $(LIBSYS)(sys_times.o) \ $(LIBSYS)(sys_trace.o) \ $(LIBSYS)(sys_xit.o) \ $(LIBSYS)(taskcall.o) \ $(LIBSYS): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBSYS)(kmalloc.o): kmalloc.c $(CC1) kmalloc.c $(LIBSYS)(kprintf.o): kprintf.c $(CC1) kprintf.c $(LIBSYS)(putk.o): putk.c $(CC1) putk.c $(LIBSYS)(sys_abort.o): sys_abort.c $(CC1) sys_abort.c $(LIBSYS)(sys_copy.o): sys_copy.c $(CC1) sys_copy.c $(LIBSYS)(sys_endsig.o): sys_endsig.c $(CC1) sys_endsig.c $(LIBSYS)(sys_exec.o): sys_exec.c $(CC1) sys_exec.c $(LIBSYS)(sys_findproc.o): sys_findproc.c $(CC1) sys_findproc.c $(LIBSYS)(sys_fork.o): sys_fork.c $(CC1) sys_fork.c $(LIBSYS)(sys_getmap.o): sys_getmap.c $(CC1) sys_getmap.c $(LIBSYS)(sys_getsp.o): sys_getsp.c $(CC1) sys_getsp.c $(LIBSYS)(sys_kill.o): sys_kill.c $(CC1) sys_kill.c $(LIBSYS)(sys_newmap.o): sys_newmap.c $(CC1) sys_newmap.c $(LIBSYS)(sys_oldsig.o): sys_oldsig.c $(CC1) sys_oldsig.c $(LIBSYS)(sys_sendsig.o): sys_sendsig.c $(CC1) sys_sendsig.c $(LIBSYS)(sys_sigret.o): sys_sigret.c $(CC1) sys_sigret.c $(LIBSYS)(sys_sysctl.o): sys_sysctl.c $(CC1) sys_sysctl.c $(LIBSYS)(sys_times.o): sys_times.c $(CC1) sys_times.c $(LIBSYS)(sys_trace.o): sys_trace.c $(CC1) sys_trace.c $(LIBSYS)(sys_xit.o): sys_xit.c $(CC1) sys_xit.c $(LIBSYS)(taskcall.o): taskcall.c $(CC1) taskcall.c #include "syslib.h" #include #include PUBLIC int sys_abort(int how, ...) { /* Something awful has happened. Abandon ship. */ message m; va_list ap; va_start(ap, how); if ((m.m1_i1 = how) == RBT_MONITOR) { m.m1_i2 = va_arg(ap, int); m.m1_p1 = va_arg(ap, char *); m.m1_i3 = va_arg(ap, size_t); } va_end(ap); return(_taskcall(SYSTASK, SYS_ABORT, &m)); } #include "syslib.h" PUBLIC int sys_copy(src_proc, src_seg, src_vir, dst_proc, dst_seg, dst_vir, bytes) int src_proc; /* source process */ int src_seg; /* source segment: T, D, or S */ phys_bytes src_vir; /* source virtual address (phys addr for ABS)*/ int dst_proc; /* dest process */ int dst_seg; /* dest segment: T, D, or S */ phys_bytes dst_vir; /* dest virtual address (phys addr for ABS) */ phys_bytes bytes; /* how many bytes */ { /* Transfer a block of data. The source and destination can each either be a * process (including MM) or absolute memory, indicate by setting 'src_proc' * or 'dst_proc' to ABS. */ message copy_mess; if (bytes == 0L) return(OK); copy_mess.SRC_SPACE = src_seg; copy_mess.SRC_PROC_NR = src_proc; copy_mess.SRC_BUFFER = (long) src_vir; copy_mess.DST_SPACE = dst_seg; copy_mess.DST_PROC_NR = dst_proc; copy_mess.DST_BUFFER = (long) dst_vir; copy_mess.COPY_BYTES = (long) bytes; return(_taskcall(SYSTASK, SYS_COPY, ©_mess)); } #include "syslib.h" PUBLIC int sys_endsig(proc) int proc; { message m; m.m1_i1 = proc; return(_taskcall(SYSTASK, SYS_ENDSIG, &m)); } #include "syslib.h" PUBLIC int sys_exec(proc, ptr, traced, prog_name, initpc) int proc; /* process that did exec */ char *ptr; /* new stack pointer */ int traced; /* is tracing enabled? */ char *prog_name; /* name of the new program */ vir_bytes initpc; { /* A process has exec'd. Tell the kernel. */ message m; m.m1_i1 = proc; m.m1_i2 = traced; m.m1_p1 = ptr; m.m1_p2 = prog_name; m.m1_p3 = (char *)initpc; return(_taskcall(SYSTASK, SYS_EXEC, &m)); } #include "syslib.h" PUBLIC int sys_fork(parent, child, pid) int parent; /* process doing the fork */ int child; /* which proc has been created by the fork */ int pid; /* process id assigned by MM */ { /* A process has forked. Tell the kernel. */ message m; m.m1_i1 = parent; m.m1_i2 = child; m.m1_i3 = pid; return(_taskcall(SYSTASK, SYS_FORK, &m)); } #include "syslib.h" PUBLIC int sys_getmap(proc, ptr) int proc; /* process whose map is to be fetched */ struct mem_map *ptr; /* pointer to new map */ { /* Want to know map of a process, ask the kernel. */ message m; m.m1_i1 = proc; m.m1_p1 = (char *) ptr; return(_taskcall(SYSTASK, SYS_GETMAP, &m)); } #include "syslib.h" PUBLIC int sys_getsp(proc, newsp) int proc; /* process whose sp is wanted */ vir_bytes *newsp; /* place to put sp read from kernel */ { /* Ask the kernel what the sp is. */ message m; int r; m.m1_i1 = proc; r = _taskcall(SYSTASK, SYS_GETSP, &m); *newsp = (vir_bytes) m.STACK_PTR; return(r); } #include "syslib.h" PUBLIC int sys_kill(proc, signr) int proc; /* which proc has exited */ int signr; /* signal number: 1 - 16 */ { /* A proc has to be signaled via MM. Tell the kernel. */ message m; m.m6_i1 = proc; m.m6_i2 = signr; return(_taskcall(SYSTASK, SYS_KILL, &m)); } #include "syslib.h" PUBLIC int sys_newmap(proc, ptr) int proc; /* process whose map is to be changed */ struct mem_map *ptr; /* pointer to new map */ { /* A process has been assigned a new memory map. Tell the kernel. */ message m; m.m1_i1 = proc; m.m1_p1 = (char *) ptr; return(_taskcall(SYSTASK, SYS_NEWMAP, &m)); } #include "syslib.h" PUBLIC int sys_oldsig(proc, sig, sighandler) int proc; /* process to be signaled */ int sig; /* signal number: 1 to _NSIG */ sighandler_t sighandler; /* pointer to signal handler in user space */ { /* A proc has to be signaled. Tell the kernel. This function is obsolete. */ message m; m.m6_i1 = proc; m.m6_i2 = sig; m.m6_f1 = sighandler; return(_taskcall(SYSTASK, SYS_OLDSIG, &m)); } #include "syslib.h" PUBLIC int sys_sendsig(proc, smp) int proc; struct sigmsg *smp; { message m; m.m1_i1 = proc; m.m1_p1 = (char *) smp; return(_taskcall(SYSTASK, SYS_SENDSIG, &m)); } #include "syslib.h" PUBLIC int sys_sigreturn(proc, scp, flags) int proc; vir_bytes scp; int flags; { message m; m.m1_i1 = proc; m.m1_i2 = flags; m.m1_p1 = (char *) scp; return(_taskcall(SYSTASK, SYS_SIGRETURN, &m)); } #include "syslib.h" PUBLIC int sys_times(proc, ptr) int proc; /* proc whose times are needed */ clock_t ptr[5]; /* pointer to time buffer */ { /* Fetch the accounting info for a proc. */ message m; int r; m.m1_i1 = proc; m.m1_p1 = (char *)ptr; r = _taskcall(SYSTASK, SYS_TIMES, &m); ptr[0] = m.USER_TIME; ptr[1] = m.SYSTEM_TIME; ptr[2] = m.CHILD_UTIME; ptr[3] = m.CHILD_STIME; ptr[4] = m.BOOT_TICKS; return(r); } #include "syslib.h" PUBLIC int sys_trace(req, procnr, addr, data_p) int req, procnr; long addr, *data_p; { message m; int r; m.m2_i1 = procnr; m.m2_i2 = req; m.m2_l1 = addr; if (data_p) m.m2_l2 = *data_p; r = _taskcall(SYSTASK, SYS_TRACE, &m); if (data_p) *data_p = m.m2_l2; return(r); } #include "syslib.h" PUBLIC int sys_xit(parent, proc) int parent; /* parent of exiting process */ int proc; /* which process has exited */ { /* A process has exited. Tell the kernel. */ message m; m.m1_i1 = parent; m.m1_i2 = proc; return(_taskcall(SYSTASK, SYS_XIT, &m)); } /* syslib.h - System library common definitions. */ #define _SYSTEM #include #include #include /* _taskcall() is the same as _syscall() except it returns negative error * codes directly and not in errno. This is a better interface for MM and * FS. */ #include #include PUBLIC int _taskcall(who, syscallnr, msgptr) int who; int syscallnr; register message *msgptr; { int status; msgptr->m_type = syscallnr; status = _sendrec(who, msgptr); if (status != 0) return(status); return(msgptr->m_type); } /* malloc(), realloc(), free() - simple memory allocation routines * * This is a very small and simple minded malloc Author: Kees J. Bot * implementation. Ideal for things like a 29 Jan 1994 * bootstrap program, or for debugging. Six times * slower than any good malloc. */ #define nil 0 #define sbrk _sbrk #include #include #include #include #include #if !DEBUG #define NDEBUG 1 #define debug(expr) ((void) 0) #else #define debug(expr) expr #endif #include typedef struct cell { size_t size; /* Size of a malloc()'ed object. */ #if DEBUG unsigned magic; /* To recognize a cell. */ #endif struct cell *next; /* Next cell on the free list. */ #if DEBUG unsigned sacred; /* Don't touch while unallocated. */ #endif } cell_t; #if UINT_MAX <= 0xFFFF #define MAGIC 0x537B #else #define MAGIC 0x537BC0D8 #endif /* Size of the header of an object. */ #define HDR_SIZE offsetof(cell_t, next) /* An offset from a cell pointer to a next cell. */ #define offset(cp, size) ((cell_t *) ((char *) (cp) + (size))) /* Address of the object in a cell and back. */ #define cell2obj(cp) ((void *) ((char *) (cp) + HDR_SIZE)) #define obj2cell(op) ((cell_t *) ((char *) (op) - HDR_SIZE)) /* The free list. */ static cell_t *freelist; void *malloc(size_t size) /* Allocate an object of at least the given size. */ { cell_t **pcp, *cp; size += HDR_SIZE; if (size < sizeof(cell_t)) size= sizeof(cell_t); /* Align to a word. Use a real malloc if you need better alignment. */ size= (size + sizeof(int) - 1) & ~(sizeof(int) - 1); /* Space for a magic number at the end of the chunk. */ debug(size += sizeof(unsigned)); for (;;) { /* Do a first fit search. */ pcp= &freelist; while ((cp= *pcp) != nil) { cell_t *next= cp->next; assert(cp->magic == MAGIC); assert(cp->sacred == MAGIC); if (offset(cp, cp->size) == next) { /* Join adjacent free cells. */ assert(next->magic == MAGIC); assert(next->sacred == MAGIC); cp->size+= next->size; cp->next= next->next; continue; /* Try again. */ } if (size <= cp->size) break; /* Big enough. */ /* Next cell. */ pcp= &cp->next; } if (cp != nil) break; /* Found a big enough chunk. */ /* Allocate a new chunk at the break. */ if ((cp= (cell_t *) sbrk(size)) == (cell_t *) -1) { return nil; } cp->size= size; cp->next= nil; debug(cp->magic= MAGIC); debug(cp->sacred= MAGIC); *pcp= cp; } /* We've got a cell that is big enough. Can we break it up? */ if (cp->size >= size + sizeof(cell_t)) { cell_t *next= offset(cp, size); next->size= cp->size - size; next->next= cp->next; debug(next->magic= MAGIC); debug(next->sacred= MAGIC); cp->size= size; cp->next= next; } /* Unchain the cell we've found and return an address in it. */ *pcp= cp->next; debug(memset(cell2obj(cp), 0xAA, cp->size - HDR_SIZE)); debug(((unsigned *) offset(cp, cp->size))[-1]= MAGIC); return cell2obj(cp); } void free(void *op) /* Deallocate an object. */ { cell_t **prev, *next, *cp; if (op == nil) return; /* Aaargh. */ cp= obj2cell(op); assert(cp->magic == MAGIC); assert(((unsigned *) offset(cp, cp->size))[-1] == MAGIC); debug(cp->sacred= MAGIC); /* Find the spot where the object belongs. */ prev= &freelist; while ((next= *prev) != nil && next < cp) { assert(next->magic == MAGIC); assert(next->sacred == MAGIC); prev= &next->next; } /* Put the new free cell in the list. */ *prev= cp; cp->next= next; #if DEBUG /* Check the rest of the list. */ while (next != nil) { assert(next->magic == MAGIC); assert(next->sacred == MAGIC); next= next->next; } #endif } void *realloc(void *op, size_t size) /* Change the size of an object. Don't bother being smart, just copy it. */ { size_t oldsize; void *new; oldsize= op == nil ? 0 : obj2cell(op)->size - HDR_SIZE; new= malloc(size); memcpy(new, op, oldsize > size ? size : oldsize); free(op); return new; } /* * $PchId: malloc.c,v 1.4 1996/02/22 09:15:56 philip Exp $ */ /* printf() - kernel printf() Author: Kees J. Bot * 15 Jan 1994 */ #define nil 0 #include #include #include #define isdigit(c) ((unsigned) ((c) - '0') < (unsigned) 10) #if !__STDC__ /* Classic C stuff, ignore. */ void putk(); int printf(fmt) char *fmt; #else /* Printf() uses putk() to print characters. */ void putk(int c); int printf(const char *fmt, ...) #endif { int c; enum { LEFT, RIGHT } adjust; enum { LONG, INT } intsize; int fill; int width, max, len, base; static char X2C_tab[]= "0123456789ABCDEF"; static char x2c_tab[]= "0123456789abcdef"; char *x2c; char *p; long i; unsigned long u; char temp[8 * sizeof(long) / 3 + 2]; va_list argp; va_start(argp, fmt); while ((c= *fmt++) != 0) { if (c != '%') { /* Ordinary character. */ putk(c); continue; } /* Format specifier of the form: * %[adjust][fill][width][.max]keys */ c= *fmt++; adjust= RIGHT; if (c == '-') { adjust= LEFT; c= *fmt++; } fill= ' '; if (c == '0') { fill= '0'; c= *fmt++; } width= 0; if (c == '*') { /* Width is specified as an argument, e.g. %*d. */ width= va_arg(argp, int); c= *fmt++; } else if (isdigit(c)) { /* A number tells the width, e.g. %10d. */ do { width= width * 10 + (c - '0'); } while (isdigit(c= *fmt++)); } max= INT_MAX; if (c == '.') { /* Max field length coming up. */ if ((c= *fmt++) == '*') { max= va_arg(argp, int); c= *fmt++; } else if (isdigit(c)) { max= 0; do { max= max * 10 + (c - '0'); } while (isdigit(c= *fmt++)); } } /* Set a few flags to the default. */ x2c= x2c_tab; i= 0; base= 10; intsize= INT; if (c == 'l' || c == 'L') { /* "Long" key, e.g. %ld. */ intsize= LONG; c= *fmt++; } if (c == 0) break; switch (c) { /* Decimal. */ case 'd': i= intsize == LONG ? va_arg(argp, long) : va_arg(argp, int); u= i < 0 ? -i : i; goto int2ascii; /* Octal. */ case 'o': base= 010; goto getint; /* Pointer, interpret as %X or %lX. */ case 'p': if (sizeof(char *) > sizeof(int)) intsize= LONG; /* Hexadecimal. %X prints upper case A-F, not %lx. */ case 'X': x2c= X2C_tab; case 'x': base= 0x10; goto getint; /* Unsigned decimal. */ case 'u': getint: u= intsize == LONG ? va_arg(argp, unsigned long) : va_arg(argp, unsigned int); int2ascii: p= temp + sizeof(temp)-1; *p= 0; do { *--p= x2c[(ptrdiff_t) (u % base)]; } while ((u /= base) > 0); goto string_length; /* A character. */ case 'c': p= temp; *p= va_arg(argp, int); len= 1; goto string_print; /* Simply a percent. */ case '%': p= temp; *p= '%'; len= 1; goto string_print; /* A string. The other cases will join in here. */ case 's': p= va_arg(argp, char *); string_length: for (len= 0; p[len] != 0 && len < max; len++) {} string_print: width -= len; if (i < 0) width--; if (fill == '0' && i < 0) putk('-'); if (adjust == RIGHT) { while (width > 0) { putk(fill); width--; } } if (fill == ' ' && i < 0) putk('-'); while (len > 0) { putk((unsigned char) *p++); len--; } while (width > 0) { putk(fill); width--; } break; /* Unrecognized format key, echo it back. */ default: putk('%'); putk(c); } } /* Mark the end with a null (should be something else, like -1). */ putk(0); va_end(argp); return 0; } /* * $PchId: kprintf.c,v 1.5 1996/04/11 06:59:05 philip Exp $ */ #include "syslib.h" int sys_sysctl(int proc, int request, int priv, vir_bytes argp) { message m; m.m2_i1 = proc; m.m2_i2 = request; m.m2_i3 = priv; m.m2_p1 = (char *) argp; return _taskcall(SYSTASK, SYS_SYSCTL, &m); } /* A server must occasionally print some message. It uses a simple version of * printf() found in the system library that calls putk() to output characters. * Printing is done by doing SYS_PUTS, and not by going through FS. * * This routine can only be used by servers such as MM or FS. The kernel * must define its own putk(). */ #include "syslib.h" #include #include /*===========================================================================* * putk * *===========================================================================*/ void putk(c) int c; { /* Accumulate another character. If 0 or buffer full, print it. */ static size_t buf_count; /* # characters in the buffer */ static char print_buf[80]; /* output is buffered here */ message m; if ((c == 0 && buf_count > 0) || buf_count == sizeof(print_buf)) { /* Send the buffer to the system task, or, if this process is not a * server yet, to standard error. */ m.m1_i1 = buf_count; m.m1_p1 = print_buf; m.m_type = SYS_PUTS; if (_sendrec(SYSTASK, &m) != 0) { m.m1_i1 = 2; m.m1_i2 = buf_count; m.m1_p1 = print_buf; m.m_type = WRITE; (void) _sendrec(FS, &m); } buf_count = 0; } if (c != 0) print_buf[buf_count++] = c; } #include "syslib.h" #include int sys_findproc(name, tasknr, flags) char *name; int *tasknr; int flags; { /* Map a task name to a task number. */ message m; int r; strncpy(m.m3_ca1, name, M3_STRING); m.m3_i1= flags; /* Clear unused fields */ m.m3_i2 = 0; m.m3_p1= NULL; r= _taskcall(SYSTASK, SYS_FINDPROC, &m); *tasknr= m.m3_i1; return r; } /* * $PchId: sys_findproc.c,v 1.2 1996/04/11 05:46:27 philip Exp $ */ .;..Makefilesetjmp.e# Makefile for lib/rts. CFLAGS = -O -D_MINIX -D_POSIX_SOURCE CC1 = $(CC) $(CFLAGS) -c LIBRARY = ../libc.a all: \ $(LIBRARY) OBJECTS = \ $(LIBRARY)(setjmp.o) \ $(LIBRARY): $(OBJECTS) aal cr $@ *.o rm *.o $(LIBRARY)(setjmp.o): setjmp.e $(CC1) setjmp.e # mes 2,_EM_WSIZE,_EM_PSIZE ; ; layout of a setjmp buffer: ; ; ----------------- ; | flag | (!0 when blocked signals saved (POSIX)) ; ----------------- ; | signal mask/set | (for Berkeley 4.[2-] / POSIX) ; ----------------- ; | | ; | GTO descriptor | ; | (SP, LB, PC) | ; | | ; ----------------- ; ; setjmp saves the signalmask, PC, SP, and LB of caller, and creates a ; GTO descriptor from this. ; The big problem here is how to get the return address, i.e. the PC of ; the caller; This problem is solved by the front-end, which must pass ; it as an extra parameter to setjmp. ; a GTO descriptor must be in the global data area gtobuf bss 3*_EM_PSIZE,0,0 inp $fill_ret_area exp $__setjmp pro $__setjmp,0 #if defined(_POSIX_SOURCE) ; save mask of currently blocked signals. ; longjmp must restore this mask lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE lal 0 loi _EM_PSIZE stf 3*_EM_PSIZE+_EM_LSIZE lol _EM_PSIZE ; the flag integer at offset _EM_PSIZE zeq *1 lal 0 loi _EM_PSIZE adp 3*_EM_PSIZE cal $__newsigset asp _EM_PSIZE 1 #elif defined(__BSD4_2) loc 0 cal $sigblock asp _EM_WSIZE lfr _EM_WSIZE lal 0 loi _EM_PSIZE stf 3*_EM_PSIZE #endif ; create GTO descriptor for longjmp lxl 0 dch ; Local Base of caller lxa 0 ; Stackpointer of caller lal _EM_PSIZE+_EM_WSIZE loi _EM_PSIZE ; Return address of caller lal 0 loi _EM_PSIZE ; address of jmpbuf sti 3*_EM_PSIZE ; LB, SP, and PC stored in jmpbuf loc 0 ret _EM_WSIZE ; setjmp must return 0 end 0 pro $fill_ret_area,0 ; put argument in function result area lol 0 ret _EM_WSIZE end 0 exp $longjmp pro $longjmp,? #if defined(_POSIX_SOURCE) ; restore blocked mask lal 0 loi _EM_PSIZE lof 3*_EM_PSIZE+_EM_LSIZE zeq *2 lal 0 loi _EM_PSIZE adp 3*_EM_PSIZE cal $__oldsigset asp _EM_PSIZE 2 #elif defined(__BSD4_2) ; restore signal mask lal 0 loi _EM_PSIZE lof 3*_EM_PSIZE cal $_sigsetmask asp _EM_WSIZE lfr _EM_WSIZE asp _EM_WSIZE #endif lal 0 loi _EM_PSIZE ; address of jmpbuf lae gtobuf blm 3*_EM_PSIZE ; fill GTO descriptor from jmpbuf lol _EM_PSIZE ; second parameter of longjmp: the return value dup _EM_WSIZE zne *3 ; of course, longjmp may not return 0! inc 3 ; put return value in function result area cal $fill_ret_area asp _EM_WSIZE gto gtobuf ; there we go ... ; ASP and GTO do not damage function result area end 0 .;..Makefile# Makefile for lib/dummy. # Make a dummy libm library so that -lm works. all: ../libm.a ../libm.a: echo "int __dummy__;" >dummy.c $(CC) -c dummy.c aal cr $@ dummy.o rm dummy.? ...Makefilealloc.cbreak.cconst.hexec.cforkexit.cgetset.cglo.hmain.cmm.hmproc.hparam.hproto.hputk.csignal.ctable.ctrace.ctype.h utility.c misc.c# Makefile for mm # Directories u = /usr i = $u/include s = $i/sys h = $i/minix # Programs, flags, etc. CC = exec cc CFLAGS = -I$i LDFLAGS = -i OBJ = main.o forkexit.o break.o exec.o \ signal.o alloc.o utility.o table.o putk.o trace.o getset.o misc.o mm: $(OBJ) $(CC) -o $@ $(LDFLAGS) $(OBJ) -lsys install -S 256w $@ all install: # Nothing. clean: rm -f *.o *.bak mm # Dependencies a = mm.h $h/config.h $s/types.h $h/const.h $h/type.h \ $i/ansi.h $i/fcntl.h $i/unistd.h $h/syslib.h \ $i/limits.h $i/errno.h const.h type.h proto.h glo.h alloc.o: $a alloc.o: $i/signal.h alloc.o: $h/com.h alloc.o: $h/callnr.h alloc.o: mproc.h break.o: $a break.o: $i/signal.h break.o: mproc.h break.o: param.h exec.o: $a exec.o: $s/stat.h exec.o: $h/callnr.h exec.o: $i/a.out.h exec.o: $i/signal.h exec.o: $i/string.h exec.o: mproc.h exec.o: param.h forkexit.o: $a forkexit.o: $s/wait.h forkexit.o: $h/callnr.h forkexit.o: $i/signal.h forkexit.o: mproc.h forkexit.o: param.h getset.o: $a getset.o: $h/callnr.h getset.o: $i/signal.h getset.o: mproc.h getset.o: param.h main.o: $a main.o: $h/callnr.h main.o: $h/com.h main.o: $i/signal.h main.o: $i/fcntl.h main.o: $s/ioctl.h main.o: mproc.h main.o: param.h misc.o: $a misc.o: $h/callnr.h misc.o: $i/signal.h misc.o: $s/svrctl.h misc.o: mproc.h misc.o: param.h putk.o: $a putk.o: $h/com.h signal.o: $a signal.o: $s/stat.h signal.o: $h/callnr.h signal.o: $h/com.h signal.o: $i/signal.h signal.o: $s/sigcontext.h signal.o: $i/string.h signal.o: mproc.h signal.o: param.h table.o: $a table.o: $h/callnr.h table.o: $i/signal.h table.o: mproc.h table.o: param.h trace.o: $a trace.o: $s/ptrace.h trace.o: $i/signal.h trace.o: mproc.h trace.o: param.h utility.o: $a utility.o: $s/stat.h utility.o: $h/callnr.h utility.o: $h/com.h utility.o: $i/fcntl.h utility.o: $i/signal.h utility.o: mproc.h /* This file is concerned with allocating and freeing arbitrary-size blocks of * physical memory on behalf of the FORK and EXEC system calls. The key data * structure used is the hole table, which maintains a list of holes in memory. * It is kept sorted in order of increasing memory address. The addresses * it contains refer to physical memory, starting at absolute address 0 * (i.e., they are not relative to the start of MM). During system * initialization, that part of memory containing the interrupt vectors, * kernel, and MM are "allocated" to mark them as not available and to * remove them from the hole list. * * The entry points into this file are: * alloc_mem: allocate a given sized chunk of memory * free_mem: release a previously allocated chunk of memory * mem_init: initialize the tables when MM start up * max_hole: returns the largest hole currently available */ #include "mm.h" #include #include #include #include "mproc.h" #define NR_HOLES (2*NR_PROCS) /* max # entries in hole table */ #define NIL_HOLE (struct hole *) 0 PRIVATE struct hole { struct hole *h_next; /* pointer to next entry on the list */ phys_clicks h_base; /* where does the hole begin? */ phys_clicks h_len; /* how big is the hole? */ } hole[NR_HOLES]; PRIVATE struct hole *hole_head; /* pointer to first hole */ PRIVATE struct hole *free_slots;/* ptr to list of unused table slots */ PRIVATE int swap_fd = -1; /* file descriptor of open swap file/device */ PRIVATE u32_t swap_offset; /* offset to start of swap area on swap file */ PRIVATE phys_clicks swap_base; /* memory offset chosen as swap base */ PRIVATE phys_clicks swap_maxsize;/* maximum amount of swap "memory" possible */ PRIVATE struct mproc *in_queue; /* queue of processes wanting to swap in */ PRIVATE struct mproc *outswap = &mproc[LOW_USER]; /* outswap candidate? */ FORWARD _PROTOTYPE( void del_slot, (struct hole *prev_ptr, struct hole *hp) ); FORWARD _PROTOTYPE( void merge, (struct hole *hp) ); FORWARD _PROTOTYPE( int swap_out, (void) ); /*===========================================================================* * alloc_mem * *===========================================================================*/ PUBLIC phys_clicks alloc_mem(clicks) phys_clicks clicks; /* amount of memory requested */ { /* Allocate a block of memory from the free list using first fit. The block * consists of a sequence of contiguous bytes, whose length in clicks is * given by 'clicks'. A pointer to the block is returned. The block is * always on a click boundary. This procedure is called when memory is * needed for FORK or EXEC. Swap other processes out if needed. */ register struct hole *hp, *prev_ptr; phys_clicks old_base; do { hp = hole_head; while (hp != NIL_HOLE && hp->h_base < swap_base) { if (hp->h_len >= clicks) { /* We found a hole that is big enough. Use it. */ old_base = hp->h_base; /* remember where it started */ hp->h_base += clicks; /* bite a piece off */ hp->h_len -= clicks; /* ditto */ /* Delete the hole if used up completely. */ if (hp->h_len == 0) del_slot(prev_ptr, hp); /* Return the start address of the acquired block. */ return(old_base); } prev_ptr = hp; hp = hp->h_next; } } while (swap_out()); /* try to swap some other process out */ return(NO_MEM); } /*===========================================================================* * free_mem * *===========================================================================*/ PUBLIC void free_mem(base, clicks) phys_clicks base; /* base address of block to free */ phys_clicks clicks; /* number of clicks to free */ { /* Return a block of free memory to the hole list. The parameters tell where * the block starts in physical memory and how big it is. The block is added * to the hole list. If it is contiguous with an existing hole on either end, * it is merged with the hole or holes. */ register struct hole *hp, *new_ptr, *prev_ptr; if (clicks == 0) return; if ( (new_ptr = free_slots) == NIL_HOLE) panic("Hole table full", NO_NUM); new_ptr->h_base = base; new_ptr->h_len = clicks; free_slots = new_ptr->h_next; hp = hole_head; /* If this block's address is numerically less than the lowest hole currently * available, or if no holes are currently available, put this hole on the * front of the hole list. */ if (hp == NIL_HOLE || base <= hp->h_base) { /* Block to be freed goes on front of the hole list. */ new_ptr->h_next = hp; hole_head = new_ptr; merge(new_ptr); return; } /* Block to be returned does not go on front of hole list. */ while (hp != NIL_HOLE && base > hp->h_base) { prev_ptr = hp; hp = hp->h_next; } /* We found where it goes. Insert block after 'prev_ptr'. */ new_ptr->h_next = prev_ptr->h_next; prev_ptr->h_next = new_ptr; merge(prev_ptr); /* sequence is 'prev_ptr', 'new_ptr', 'hp' */ } /*===========================================================================* * del_slot * *===========================================================================*/ PRIVATE void del_slot(prev_ptr, hp) register struct hole *prev_ptr; /* pointer to hole entry just ahead of 'hp' */ register struct hole *hp; /* pointer to hole entry to be removed */ { /* Remove an entry from the hole list. This procedure is called when a * request to allocate memory removes a hole in its entirety, thus reducing * the numbers of holes in memory, and requiring the elimination of one * entry in the hole list. */ if (hp == hole_head) hole_head = hp->h_next; else prev_ptr->h_next = hp->h_next; hp->h_next = free_slots; free_slots = hp; } /*===========================================================================* * merge * *===========================================================================*/ PRIVATE void merge(hp) register struct hole *hp; /* ptr to hole to merge with its successors */ { /* Check for contiguous holes and merge any found. Contiguous holes can occur * when a block of memory is freed, and it happens to abut another hole on * either or both ends. The pointer 'hp' points to the first of a series of * three holes that can potentially all be merged together. */ register struct hole *next_ptr; /* If 'hp' points to the last hole, no merging is possible. If it does not, * try to absorb its successor into it and free the successor's table entry. */ if ( (next_ptr = hp->h_next) == NIL_HOLE) return; if (hp->h_base + hp->h_len == next_ptr->h_base) { hp->h_len += next_ptr->h_len; /* first one gets second one's mem */ del_slot(hp, next_ptr); } else { hp = next_ptr; } /* If 'hp' now points to the last hole, return; otherwise, try to absorb its * successor into it. */ if ( (next_ptr = hp->h_next) == NIL_HOLE) return; if (hp->h_base + hp->h_len == next_ptr->h_base) { hp->h_len += next_ptr->h_len; del_slot(hp, next_ptr); } } /*===========================================================================* * mem_init * *===========================================================================*/ PUBLIC void mem_init(total, free) phys_clicks *total, *free; /* memory size summaries */ { /* Initialize hole lists. There are two lists: 'hole_head' points to a linked * list of all the holes (unused memory) in the system; 'free_slots' points to * a linked list of table entries that are not in use. Initially, the former * list has one entry for each chunk of physical memory, and the second * list links together the remaining table slots. As memory becomes more * fragmented in the course of time (i.e., the initial big holes break up into * smaller holes), new table slots are needed to represent them. These slots * are taken from the list headed by 'free_slots'. */ register struct hole *hp; phys_clicks base; /* base address of chunk */ phys_clicks size; /* size of chunk */ message mess; /* Put all holes on the free list. */ for (hp = &hole[0]; hp < &hole[NR_HOLES]; hp++) hp->h_next = hp + 1; hole[NR_HOLES-1].h_next = NIL_HOLQ4S4T4U4V4W4X4Y4E; hole_head = NIL_HOLE; free_slots = &hole[0]; /* Ask the kernel for chunks of physical memory and allocate a hole for * each of them. The SYS_MEM call responds with the base and size of the * next chunk and the total amount of memory. */ *free = 0; for (;;) { mess.m_type = SYS_MEM; if (sendrec(SYSTASK, &mess) != OK) panic("bad SYS_MEM?", NO_NUM); base = mess.m1_i1; size = mess.m1_i2; if (size == 0) break; /* no more? */ free_mem(base, size); *total = mess.m1_i3; *free += size; if (swap_base < base + size) swap_base = base+size; } /* The swap area is represented as a hole above and separate of regular * memory. A hole at the size of the swap file is allocated on "swapon". */ swap_base++; /* make separate */ swap_maxsize = 0 - swap_base; /* maximum we can possibly use */ } /*===========================================================================* * swap_on * *===========================================================================*/ PUBLIC int swap_on(file, offset, size) char *file; /* file to swap on */ u32_t offset, size; /* area on swap file to use */ { /* Turn swapping on. */ if (swap_fd != -1) return(EBUSY); /* already have swap? */ tell_fs(CHDIR, who, FALSE, 0); /* be like the caller for open() */ if ((swap_fd = open(file, O_RDWR)) < 0) return(-errno); swap_offset = offset; size >>= CLICK_SHIFT; if (size > swap_maxsize) size = swap_maxsize; if (size > 0) free_mem(swap_base, (phys_clicks) size); } /*===========================================================================* * swap_off * *===========================================================================*/ PUBLIC int swap_off() { /* Turn swapping off. */ struct mproc *rmp; struct hole *hp, *prev_ptr; if (swap_fd == -1) return(OK); /* can't turn off what isn't on */ /* Put all swapped out processes on the inswap queue and swap in. */ for (rmp = &mproc[LOW_USER]; rmp < &mproc[NR_PROCS]; rmp++) { if (rmp->mp_flags & ONSWAP) swap_inqueue(rmp); } swap_in(); /* All in memory? */ for (rmp = &mproc[LOW_USER]; rmp < &mproc[NR_PROCS]; rmp++) { if (rmp->mp_flags & ONSWAP) return(ENOMEM); } /* Yes. Remove the swap hole and close the swap file descriptor. */ for (hp = hole_head; hp != NIL_HOLE; prev_ptr = hp, hp = hp->h_next) { if (hp->h_base >= swap_base) { del_slot(prev_ptr, hp); hp = hole_head; } } close(swap_fd); swap_fd = -1; return(OK); } /*===========================================================================* * swap_inqueue * *===========================================================================*/ PUBLIC void swap_inqueue(rmp) register struct mproc *rmp; /* process to add to the queue */ { /* Put a swapped out process on the queue of processes to be swapped in. This * happens when such a process gets a signal, or if a reply message must be * sent, like when a process doing a wait() has a child that exits. */ struct mproc **pmp; if (rmp->mp_flags & SWAPIN) return; /* already queued */ for (pmp = &in_queue; *pmp != NULL; pmp = &(*pmp)->mp_swapq) {} *pmp = rmp; rmp->mp_swapq = NULL; rmp->mp_flags |= SWAPIN; } /*===========================================================================* * swap_in * *===========================================================================*/ PUBLIC void swap_in() { /* Try to swap in a process on the inswap queue. We want to send it a message, * interrupt it, or something. */ struct mproc **pmp, *rmp; phys_clicks old_base, new_base, size; off_t off; int proc_nr; pmp = &in_queue; while ((rmp = *pmp) != NULL) { proc_nr = (rmp - mproc); size = rmp->mp_seg[S].mem_vir + rmp->mp_seg[S].mem_len - rmp->mp_seg[D].mem_vir; if (!(rmp->mp_flags & SWAPIN)) { /* Guess it got killed. (Queue is cleaned here.) */ *pmp = rmp->mp_swapq; continue; } else if ((new_base = alloc_mem(size)) == NO_MEM) { /* No memory for this one, try the next. */ pmp = &rmp->mp_swapq; } else { /* We've found memory. Update map and swap in. */ old_base = rmp->mp_seg[D].mem_phys; rmp->mp_seg[D].mem_phys = new_base; rmp->mp_seg[S].mem_phys = rmp->mp_seg[D].mem_phys + (rmp->mp_seg[S].mem_vir - rmp->mp_seg[D].mem_vir); sys_newmap(proc_nr, rmp->mp_seg); off = swap_offset + ((off_t) (old_base-swap_base)<mp_flags &= ~(ONSWAP|SWAPIN); *pmp = rmp->mp_swapq; check_pending(rmp); /* a signal may have waked this one */ } } } /*===========================================================================* * swap_out * *===========================================================================*/ PRIVATE int swap_out() { /* Try to find a process that can be swapped out. Candidates are those blocked * on a system call that MM handles, like wait(), pause() or sigsuspend(). */ struct mproc *rmp; struct hole *hp, *prev_ptr; phys_clicks old_base, new_base, size; off_t off; int proc_nr; rmp = outswap; do { if (++rmp == &mproc[NR_PROCS]) rmp = &mproc[LOW_USER]; /* A candidate? */ if (!(rmp->mp_flags & (PAUSED | WAITING | SIGSUSPENDED))) continue; /* Already on swap or otherwise to be avoided? */ if (rmp->mp_flags & (TRACED | REPLY | ONSWAP)) continue; /* Got one, find a swap hole and swap it out. */ proc_nr = (rmp - mproc); size = rmp->mp_seg[S].mem_vir + rmp->mp_seg[S].mem_len - rmp->mp_seg[D].mem_vir; prev_ptr = NIL_HOLE; for (hp = hole_head; hp != NIL_HOLE; prev_ptr = hp, hp = hp->h_next) { if (hp->h_base >= swap_base && hp->h_len >= size) break; } if (hp == NIL_HOLE) continue; /* oops, not enough swapspace */ new_base = hp->h_base; hp->h_base += size; hp->h_len -= size; if (hp->h_len == 0) del_slot(prev_ptr, hp); off = swap_offset + ((off_t) (new_base - swap_base) << CLICK_SHIFT); lseek(swap_fd, off, SEEK_SET); rw_seg(1, swap_fd, proc_nr, D, (phys_bytes)size << CLICK_SHIFT); old_base = rmp->mp_seg[D].mem_phys; rmp->mp_seg[D].mem_phys = new_base; rmp->mp_seg[S].mem_phys = rmp->mp_seg[D].mem_phys + (rmp->mp_seg[S].mem_vir - rmp->mp_seg[D].mem_vir); sys_newmap(proc_nr, rmp->mp_seg); free_mem(old_base, size); rmp->mp_flags |= ONSWAP; outswap = rmp; /* next time start here */ return(TRUE); } while (rmp != outswap); return(FALSE); /* no candidate found */ } /* The MINIX model of memory allocation reserves a fixed amount of memory for * the combined text, data, and stack segments. The amount used for a child * process created by FORK is the same as the parent had. If the child does * an EXEC later, the new size is taken from the header of the file EXEC'ed. * * The layout in memory consists of the text segment, followed by the data * segment, followed by a gap (unused memory), followed by the stack segment. * The data segment grows upward and the stack grows downward, so each can * take memory from the gap. If they meet, the process must be killed. The * procedures in this file deal with the growth of the data and stack segments. * * The entry points into this file are: * do_brk: BRK/SBRK system calls to grow or shrink the data segment * adjust: see if a proposed segment adjustment is allowed * size_ok: see if the segment sizes are feasible */ #include "mm.h" #include #include "mproc.h" #include "param.h" #define DATA_CHANGED 1 /* flag value when data segment size changed */ #define STACK_CHANGED 2 /* flag value when stack size changed */ /*===========================================================================* * do_brk * *===========================================================================*/ PUBLIC int do_brk() { /* Perform the brk(addr) system call. * * The call is complicated by the fact that on some machines (e.g., 8088), * the stack pointer can grow beyond the base of the stack segment without * anybody noticing it. * The parameter, 'addr' is the new virtual address in D space. */ register struct mproc *rmp; int r; vir_bytes v, new_sp; vir_clicks new_clicks; rmp = mp; v = (vir_bytes) addr; new_clicks = (vir_clicks) ( ((long) v + CLICK_SIZE - 1) >> CLICK_SHIFT); if (new_clicks < rmp->mp_seg[D].mem_vir) { rmp->reply_ptr = (char *) -1; return(ENOMEM); } new_clicks -= rmp->mp_seg[D].mem_vir; sys_getsp(who, &new_sp); /* ask kernel for current sp value */ r = adjust(rmp, new_clicks, new_sp); rmp->reply_ptr = (r == OK ? addr : (char *) -1); return(r); /* return new address or -1 */ } /*===========================================================================* * adjust * *===========================================================================*/ PUBLIC int adjust(rmp, data_clicks, sp) register struct mproc *rmp; /* whose memory is being adjusted? */ vir_clicks data_clicks; /* how big is data segment to become? */ vir_bytes sp; /* new value of sp */ { /* See if data and stack segments can coexist, adjusting them if need be. * Memory is never allocated or freed. Instead it is added or removed from the * gap between data segment and stack segment. If the gap size becomes * negative, the adjustment of data or stack fails and ENOMEM is returned. */ register struct mem_map *mem_sp, *mem_dp; vir_clicks sp_click, gap_base, lower, old_clicks; int changed, r, ft; long base_of_stack, delta; /* longs avoid certain problems */ mem_dp = &rmp->mp_seg[D]; /* pointer to data segment map */ mem_sp = &rmp->mp_seg[S]; /* pointer to stack segment map */ changed = 0; /* set when either segment changed */ if (mem_sp->mem_len == 0) return(OK); /* don't bother init */ /* See if stack size has gone negative (i.e., sp too close to 0xFFFF...) */ base_of_stack = (long) mem_sp->mem_vir + (long) mem_sp->mem_len; sp_click = sp >> CLICK_SHIFT; /* click containing sp */ if (sp_click >= base_of_stack) return(ENOMEM); /* sp too high */ /* Compute size of gap between stack and data segments. */ delta = (long) mem_sp->mem_vir - (long) sp_click; lower = (delta > 0 ? sp_click : mem_sp->mem_vir); /* Add a safety margin for future stack growth. Impossible to do right. */ #define SAFETY_BYTES (384 * sizeof(char *)) #define SAFETY_CLICKS ((SAFETY_BYTES + CLICK_SIZE - 1) / CLICK_SIZE) gap_base = mem_dp->mem_vir + data_clicks + SAFETY_CLICKS; if (lower < gap_base) return(ENOMEM); /* data and stack collided */ /* Update data length (but not data orgin) on behalf of brk() system call. */ old_clicks = mem_dp->mem_len; if (data_clicks != mem_dp->mem_len) { mem_dp->mem_len = data_clicks; changed |= DATA_CHANGED; } /* Update stack length and origin due to change in stack pointer. */ if (delta > 0) { mem_sp->mem_vir -= delta; mem_sp->mem_phys -= delta; mem_sp->mem_len += delta; changed |= STACK_CHANGED; } /* Do the new data and stack segment sizes fit in the address space? */ ft = (rmp->mp_flags & SEPARATE); r = size_ok(ft, rmp->mp_seg[T].mem_len, rmp->mp_seg[D].mem_len, rmp->mp_seg[S].mem_len, rmp->mp_seg[D].mem_vir, rmp->mp_seg[S].mem_vir); if (r == OK) { if (changed) sys_newmap((int)(rmp - mproc), rmp->mp_seg); return(OK); } /* New sizes don't fit or require too many page/segment registers. Restore.*/ if (changed & DATA_CHANGED) mem_dp->mem_len = old_clicks; if (changed & STACK_CHANGED) { mem_sp->mem_vir += delta; mem_sp->mem_phys += delta; mem_sp->mem_len -= delta; } return(ENOMEM); } /*===========================================================================* * size_ok * *===========================================================================*/ PUBLIC int size_ok(file_type, tc, dc, sc, dvir, s_vir) int file_type; /* SEPARATE or 0 */ vir_clicks tc; /* text size in clicks */ vir_clicks dc; /* data size in clicks */ vir_clicks sc; /* stack size in clicks */ vir_clicks dvir; /* virtual address for start of data seg */ vir_clicks s_vir; /* virtual address for start of stack seg */ { /* Check to see if the sizes are feasible and enough segmentation registers * exist. On a machine with eight 8K pages, text, data, stack sizes of * (32K, 16K, 16K) will fit, but (33K, 17K, 13K) will not, even though the * former is bigger (64K) than the latter (63K). Even on the 8088 this test * is needed, since the data and stack may not exceed 4096 clicks. */ #if (CHIP == INTEL && _WORD_SIZE == 2) int pt, pd, ps; /* segment sizes in pages */ pt = ( (tc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; pd = ( (dc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; ps = ( (sc << CLICK_SHIFT) + PAGE_SIZE - 1)/PAGE_SIZE; if (file_type == SEPARATE) { if (pt > MAX_PAGES || pd + ps > MAX_PAGES) return(ENOMEM); } else { if (pt + pd + ps > MAX_PAGES) return(ENOMEM); } #endif if (dvir + dc > s_vir) return(ENOMEM); return(OK); } /* Constants used by the Memory Manager. */ #define NO_MEM ((phys_clicks) 0) /* returned by alloc_mem() with mem is up */ #if (CHIP == INTEL && _WORD_SIZE == 2) /* These definitions are used in size_ok and are not needed for 386. * The 386 segment granularity is 1 for segments smaller than 1M and 4096 * above that. */ #define PAGE_SIZE 16 /* how many bytes in a page (s.b.HCLICK_SIZE)*/ #define MAX_PAGES 4096 /* how many pages in the virtual addr space */ #endif #define INIT_PID 1 /* init's process id number */ /* This file handles the EXEC system call. It performs the work as follows: * - see if the permissions allow the file to be executed * - read the header and extract the sizes * - fetch the initial args and environment from the user space * - allocate the memory for the new process * - copy the initial stack from MM to the process * - read in the text and data segments and copy to the process * - take care of setuid and setgid bits * - fix up 'mproc' table * - tell kernel about EXEC * - save offset to initial argc (for ps) * * The entry points into this file are: * do_exec: perform the EXEC system call * rw_seg: read or write a segment from or to a file * find_share: find a process whose text segment can be shared */ #include "mm.h" #include #include #include #include #include #include "mproc.h" #include "param.h" FORWARD _PROTOTYPE( int new_mem, (struct mproc *sh_mp, vir_bytes text_bytes, vir_bytes data_bytes, vir_bytes bss_bytes, vir_bytes stk_bytes, phys_bytes tot_bytes) ); FORWARD _PROTOTYPE( void patch_ptr, (char stack[ARG_MAX], vir_bytes base) ); FORWARD _PROTOTYPE( int insert_arg, (char stack[ARG_MAX], vir_bytes *stk_bytes, char *arg, int replace) ); FORWARD _PROTOTYPE( char *patch_stack, (int fd, char stack[ARG_MAX], vir_bytes *stk_bytes, char *script) ); FORWARD _PROTOTYPE( int read_header, (int fd, int *ft, vir_bytes *text_bytes, vir_bytes *data_bytes, vir_bytes *bss_bytes, phys_bytes *tot_bytes, long *sym_bytes, vir_clicks sc, vir_bytes *pc) ); #define ESCRIPT (-2000) /* Returned by read_header for a #! script. */ #define PTRSIZE sizeof(char *) /* Size of pointers in argv[] and envp[]. */ /*===========================================================================* * do_exec * *===========================================================================*/ PUBLIC int do_exec() { /* Perform the execve(name, argv, envp) call. The user library builds a * complete stack image, including pointers, args, environ, etc. The stack * is copied to a buffer inside MM, and then to the new core image. */ register struct mproc *rmp; struct mproc *sh_mp; int m, r, fd, ft, sn; static char mbuf[ARG_MAX]; /* buffer for stack and zeroes */ static char name_buf[PATH_MAX]; /* the name of the file to exec */ char *new_sp, *name, *basename; vir_bytes src, dst, text_bytes, data_bytes, bss_bytes, stk_bytes, vsp; phys_bytes tot_bytes; /* total space for program, including gap */ long sym_bytes; vir_clicks sc; struct stat s_buf[2], *s_p; vir_bytes pc; /* Do some validity checks. */ rmp = mp; stk_bytes = (vir_bytes) stack_bytes; if (stk_bytes > ARG_MAX) return(ENOMEM); /* stack too big */ if (exec_len <= 0 || exec_len > PATH_MAX) return(EINVAL); /* Get the exec file name and see if the file is executable. */ src = (vir_bytes) exec_name; dst = (vir_bytes) name_buf; r = sys_copy(who, D, (phys_bytes) src, MM_PROC_NR, D, (phys_bytes) dst, (phys_bytes) exec_len); if (r != OK) return(r); /* file name not in user data segment */ /* Fetch the stack from the user before destroying the old core image. */ src = (vir_bytes) stack_ptr; dst = (vir_bytes) mbuf; r = sys_copy(who, D, (phys_bytes) src, MM_PROC_NR, D, (phys_bytes) dst, (phys_bytes)stk_bytes); if (r != OK) return(EACCES); /* can't fetch stack (e.g. bad virtual addr) */ r = 0; /* r = 0 (first attempt), or 1 (interpreted script) */ name = name_buf; /* name of file to exec. */ do { s_p = &s_buf[r]; tell_fs(CHDIR, who, FALSE, 0); /* switch to the user's FS environ */ fd = allowed(name, s_p, X_BIT); /* is file executable? */ if (fd < 0) return(fd); /* file was not executable */ /* Read the file header and extract the segment sizes. */ sc = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; m = read_header(fd, &ft, &text_bytes, &data_bytes, &bss_bytes, &tot_bytes, &sym_bytes, sc, &pc); if (m != ESCRIPT || ++r > 1) break; } while ((name = patch_stack(fd, mbuf, &stk_bytes, name_buf)) != NULL); if (m < 0) { close(fd); /* something wrong with header */ return(stk_bytes > ARG_MAX ? ENOMEM : ENOEXEC); } /* Can the process' text be shared with that of one already running? */ sh_mp = find_share(rmp, s_p->st_ino, s_p->st_dev, s_p->st_ctime); /* Allocate new memory and release old memory. Fix map and tell kernel. */ r = new_mem(sh_mp, text_bytes, data_bytes, bss_bytes, stk_bytes, tot_bytes); if (r != OK) { close(fd); /* insufficient core or program too big */ return(r); } /* Save file identification to allow it to be shared. */ rmp->mp_ino = s_p->st_ino; rmp->mp_dev = s_p->st_dev; rmp->mp_ctime = s_p->st_ctime; /* Patch up stack and copy it from MM to new core image. */ vsp = (vir_bytes) rmp->mp_seg[S].mem_vir << CLICK_SHIFT; vsp += (vir_bytes) rmp->mp_seg[S].mem_len << CLICK_SHIFT; vsp -= stk_bytes; patch_ptr(mbuf, vsp); src = (vir_bytes) mbuf; r = sys_copy(MM_PROC_NR, D, (phys_bytes) src, who, D, (phys_bytes) vsp, (phys_bytes)stk_bytes); if (r != OK) panic("do_exec stack copy err on", who); /* Read in text and data segments. */ if (sh_mp != NULL) { lseek(fd, (off_t) text_bytes, SEEK_CUR); /* shared: skip text */ } else { rw_seg(0, fd, who, T, text_bytes); } rw_seg(0, fd, who, D, data_bytes); close(fd); /* don't need exec file any more */ /* Take care of setuid/setgid bits. */ if ((rmp->mp_flags & TRACED) == 0) { /* suppress if tracing */ if (s_buf[0].st_mode & I_SET_UID_BIT) { rmp->mp_effuid = s_buf[0].st_uid; tell_fs(SETUID,who, (int)rmp->mp_realuid, (int)rmp->mp_effuid); } if (s_buf[0].st_mode & I_SET_GID_BIT) { rmp->mp_effgid = s_buf[0].st_gid; tell_fs(SETGID,who, (int)rmp->mp_realgid, (int)rmp->mp_effgid); } } /* Save offset to initial argc (for ps) */ rmp->mp_procargs = vsp; /* Fix 'mproc' fields, tell kernel that exec is done, reset caught sigs. */ for (sn = 1; sn <= _NSIG; sn++) { if (sigismember(&rmp->mp_catch, sn)) { sigdelset(&rmp->mp_catch, sn); rmp->mp_sigact[sn].sa_handler = SIG_DFL; sigemptyset(&rmp->mp_sigact[sn].sa_mask); } } rmp->mp_flags &= ~SEPARATE; /* turn off SEPARATE bit */ rmp->mp_flags |= ft; /* turn it on for separate I & D files */ new_sp = (char *) vsp; tell_fs(EXEC, who, 0, 0); /* allow FS to handle FD_CLOEXEC files */ /* System will save command line for debugging, ps(1) output, etc. */ basename = strrchr(name, '/'); if (basename == NULL) basename = name; else basename++; sys_exec(who, new_sp, rmp->mp_flags & TRACED, basename, pc); return(E_NO_MESSAGE); /* no reply, new program just runs */ } /*===========================================================================* * read_header * *===========================================================================*/ PRIVATE int read_header(fd, ft, text_bytes, data_bytes, bss_bytes, tot_bytes, sym_bytes, sc, pc) int fd; /* file descriptor for reading exec file */ int *ft; /* place to return ft number */ vir_bytes *text_bytes; /* place to return text size */ vir_bytes *data_bytes; /* place to return initialized data size */ vir_bytes *bss_bytes; /* place to return bss size */ phys_bytes *tot_bytes; /* place to return total size */ long *sym_bytes; /* place to return symbol table size */ vir_clicks sc; /* stack size in clicks */ vir_bytes *pc; /* program entry point (initial PC) */ { /* Read the header and extract the text, data, bss and total sizes from it. */ int m, ct; vir_clicks tc, dc, s_vir, dvir; phys_clicks totc; struct exec hdr; /* a.out header is read in here */ /* Read the header and check the magic number. The standard MINIX header * is defined in . It consists of 8 chars followed by 6 longs. * Then come 4 more longs that are not used here. * Byte 0: magic number 0x01 * Byte 1: magic number 0x03 * Byte 2: normal = 0x10 (not checked, 0 is OK), separate I/D = 0x20 * Byte 3: CPU type, Intel 16 bit = 0x04, Intel 32 bit = 0x10, * Motorola = 0x0B, Sun SPARC = 0x17 i4k4l4m4n4o4p4q4r4s4t4u4v4w4x4 * Byte 4: Header length = 0x20 * Bytes 5-7 are not used. * * Now come the 6 longs * Bytes 8-11: size of text segments in bytes * Bytes 12-15: size of initialized data segment in bytes * Bytes 16-19: size of bss in bytes * Bytes 20-23: program entry point * Bytes 24-27: total memory allocated to program (text, data + stack) * Bytes 28-31: size of symbol table in bytes * The longs are represented in a machine dependent order, * little-endian on the 8088, big-endian on the 68000. * The header is followed directly by the text and data segments, and the * symbol table (if any). The sizes are given in the header. Only the * text and data segments are copied into memory by exec. The header is * used here only. The symbol table is for the benefit of a debugger and * is ignored here. */ if ((m= read(fd, &hdr, A_MINHDR)) < 2) return(ENOEXEC); /* Interpreted script? */ if (((char *) &hdr)[0] == '#' && ((char *) &hdr)[1] == '!') return(ESCRIPT); if (m != A_MINHDR) return(ENOEXEC); /* Check magic number, cpu type, and flags. */ if (BADMAG(hdr)) return(ENOEXEC); #if (CHIP == INTEL && _WORD_SIZE == 2) if (hdr.a_cpu != A_I8086) return(ENOEXEC); #endif #if (CHIP == INTEL && _WORD_SIZE == 4) if (hdr.a_cpu != A_I80386) return(ENOEXEC); #endif if ((hdr.a_flags & ~(A_NSYM | A_EXEC | A_SEP)) != 0) return(ENOEXEC); *ft = ( (hdr.a_flags & A_SEP) ? SEPARATE : 0); /* separate I & D or not */ /* Get text and data sizes. */ *text_bytes = (vir_bytes) hdr.a_text; /* text size in bytes */ *data_bytes = (vir_bytes) hdr.a_data; /* data size in bytes */ *bss_bytes = (vir_bytes) hdr.a_bss; /* bss size in bytes */ *tot_bytes = hdr.a_total; /* total bytes to allocate for prog */ *sym_bytes = hdr.a_syms; /* symbol table size in bytes */ if (*tot_bytes == 0) return(ENOEXEC); if (*ft != SEPARATE) { /* If I & D space is not separated, it is all considered data. Text=0*/ *data_bytes += *text_bytes; *text_bytes = 0; } *pc = hdr.a_entry; /* initial address to start execution */ /* Check to see if segment sizes are feasible. */ tc = ((unsigned long) *text_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; dc = (*data_bytes + *bss_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; totc = (*tot_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; if (dc >= totc) return(ENOEXEC); /* stack must be at least 1 click */ dvir = (*ft == SEPARATE ? 0 : tc); s_vir = dvir + (totc - sc); m = size_ok(*ft, tc, dc, sc, dvir, s_vir); ct = hdr.a_hdrlen & BYTE; /* header length */ if (ct > A_MINHDR) lseek(fd, (off_t) ct, SEEK_SET); /* skip unused hdr */ return(m); } /*===========================================================================* * new_mem * *===========================================================================*/ PRIVATE int new_mem(sh_mp, text_bytes, data_bytes,bss_bytes,stk_bytes,tot_bytes) struct mproc *sh_mp; /* text can be shared with this process */ vir_bytes text_bytes; /* text segment size in bytes */ vir_bytes data_bytes; /* size of initialized data in bytes */ vir_bytes bss_bytes; /* size of bss in bytes */ vir_bytes stk_bytes; /* size of initial stack segment in bytes */ phys_bytes tot_bytes; /* total memory to allocate, including gap */ { /* Allocate new memory and release the old memory. Change the map and report * the new map to the kernel. Zero the new core image's bss, gap and stack. */ register struct mproc *rmp; vir_clicks text_clicks, data_clicks, gap_clicks, stack_clicks, tot_clicks; phys_clicks new_base; static char zero[1024]; /* used to zero bss */ phys_bytes bytes, base, count, bss_offset; /* No need to allocate text if it can be shared. */ if (sh_mp != NULL) text_bytes = 0; /* Allow the old data to be swapped out to make room. (Which is really a * waste of time, because we are going to throw it away anyway.) */ rmp->mp_flags |= WAITING; /* Acquire the new memory. Each of the 4 parts: text, (data+bss), gap, * and stack occupies an integral number of clicks, starting at click * boundary. The data and bss parts are run together with no space. */ text_clicks = ((unsigned long) text_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; data_clicks = (data_bytes + bss_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; stack_clicks = (stk_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; tot_clicks = (tot_bytes + CLICK_SIZE - 1) >> CLICK_SHIFT; gap_clicks = tot_clicks - data_clicks - stack_clicks; if ( (int) gap_clicks < 0) return(ENOMEM); /* Try to allocate memory for the new process. */ new_base = alloc_mem(text_clicks + tot_clicks); if (new_base == NO_MEM) return(EAGAIN); /* We've got memory for the new core image. Release the old one. */ rmp = mp; if (find_share(rmp, rmp->mp_ino, rmp->mp_dev, rmp->mp_ctime) == NULL) { /* No other process shares the text segment, so free it. */ free_mem(rmp->mp_seg[T].mem_phys, rmp->mp_seg[T].mem_len); } /* Free the data and stack segments. */ free_mem(rmp->mp_seg[D].mem_phys, rmp->mp_seg[S].mem_vir + rmp->mp_seg[S].mem_len - rmp->mp_seg[D].mem_vir); /* We have now passed the point of no return. The old core image has been * forever lost, memory for a new core image has been allocated. Set up * and report new map. */ if (sh_mp != NULL) { /* Share the text segment. */ rmp->mp_seg[T] = sh_mp->mp_seg[T]; } else { rmp->mp_seg[T].mem_phys = new_base; rmp->mp_seg[T].mem_vir = 0; rmp->mp_seg[T].mem_len = text_clicks; } rmp->mp_seg[D].mem_phys = new_base + text_clicks; rmp->mp_seg[D].mem_vir = 0; rmp->mp_seg[D].mem_len = data_clicks; rmp->mp_seg[S].mem_phys = rmp->mp_seg[D].mem_phys + data_clicks + gap_clicks; rmp->mp_seg[S].mem_vir = rmp->mp_seg[D].mem_vir + data_clicks + gap_clicks; rmp->mp_seg[S].mem_len = stack_clicks; #if (CHIP == M68000) rmp->mp_seg[T].mem_vir = 0; rmp->mp_seg[D].mem_vir = rmp->mp_seg[T].mem_len; rmp->mp_seg[S].mem_vir = rmp->mp_seg[D].mem_vir + rmp->mp_seg[D].mem_len + gap_clicks; #endif sys_newmap(who, rmp->mp_seg); /* report new map to the kernel */ /* The old memory may have been swapped out, but the new memory is real. */ rmp->mp_flags &= ~(WAITING|ONSWAP|SWAPIN); /* Zero the bss, gap, and stack segment. */ bytes = (phys_bytes)(data_clicks + gap_clicks + stack_clicks) << CLICK_SHIFT; base = (phys_bytes) rmp->mp_seg[D].mem_phys << CLICK_SHIFT; bss_offset = (data_bytes >> CLICK_SHIFT) << CLICK_SHIFT; base += bss_offset; bytes -= bss_offset; while (bytes > 0) { count = MIN(bytes, (phys_bytes) sizeof(zero)); if (sys_copy(MM_PROC_NR, D, (phys_bytes) zero, ABS, 0, base, count) != OK) { panic("new_mem can't zero", NO_NUM); } base += count; bytes -= count; } return(OK); } /*===========================================================================* * patch_ptr * *===========================================================================*/ PRIVATE void patch_ptr(stack, base) char stack[ARG_MAX]; /* pointer to stack image within MM */ vir_bytes base; /* virtual address of stack base inside user */ { /* When doing an exec(name, argv, envp) call, the user builds up a stack * image with arg and env pointers relative to the start of the stack. Now * these pointers must be relocated, since the stack is not positioned at * address 0 in the user's address space. */ char **ap, flag; vir_bytes v; flag = 0; /* counts number of 0-pointers seen */ ap = (char **) stack; /* points initially to 'nargs' */ ap++; /* now points to argv[0] */ while (flag < 2) { if (ap >= (char **) &stack[ARG_MAX]) return; /* too bad */ if (*ap != NULL) { v = (vir_bytes) *ap; /* v is relative pointer */ v += base; /* relocate it */ *ap = (char *) v; /* put it back */ } else { flag++; } ap++; } } /*===========================================================================* * insert_arg * *===========================================================================*/ PRIVATE int insert_arg(stack, stk_bytes, arg, replace) char stack[ARG_MAX]; /* pointer to stack image within MM */ vir_bytes *stk_bytes; /* size of initial stack */ char *arg; /* argument to prepend/replace as new argv[0] */ int replace; { /* Patch the stack so that arg will become argv[0]. Be careful, the stack may * be filled with garbage, although it normally looks like this: * nargs argv[0] ... argv[nargs-1] NULL envp[0] ... NULL * followed by the strings "pointed" to by the argv[i] and the envp[i]. The * pointers are really offsets from the start of stack. * Return true iff the operation succeeded. */ int offset, a0, a1, old_bytes = *stk_bytes; /* Prepending arg adds at least one string and a zero byte. */ offset = strlen(arg) + 1; a0 = (int) ((char **) stack)[1]; /* argv[0] */ if (a0 < 4 * PTRSIZE || a0 >= old_bytes) return(FALSE); a1 = a0; /* a1 will point to the strings to be moved */ if (replace) { /* Move a1 to the end of argv[0][] (argv[1] if nargs > 1). */ do { if (a1 == old_bytes) return(FALSE); --offset; } while (stack[a1++] != 0); } else { offset += PTRSIZE; /* new argv[0] needs new pointer in argv[] */ a0 += PTRSIZE; /* location of new argv[0][]. */ } /* stack will grow by offset bytes (or shrink by -offset bytes) */ if ((*stk_bytes += offset) > ARG_MAX) return(FALSE); /* Reposition the strings by offset bytes */ memmove(stack + a1 + offset, stack + a1, old_bytes - a1); strcpy(stack + a0, arg); /* Put arg in the new space. */ if (!replace) { /* Make space for a new argv[0]. */ memmove(stack + 2 * PTRSIZE, stack + 1 * PTRSIZE, a0 - 2 * PTRSIZE); ((char **) stack)[0]++; /* nargs++; */ } /* Now patch up argv[] and envp[] by offset. */ patch_ptr(stack, (vir_bytes) offset); ((char **) stack)[1] = (char *) a0; /* set argv[0] correctly */ return(TRUE); } /*===========================================================================* * patch_stack * *===========================================================================*/ PRIVATE char *patch_stack(fd, stack, stk_bytes, script) int fd; /* file descriptor to open script file */ char stack[ARG_MAX]; /* pointer to stack image within MM */ vir_bytes *stk_bytes; /* size of initial stack */ char *script; /* name of script to interpret */ { /* Patch the argument vector to include the path name of the script to be * interpreted, and all strings on the #! line. Returns the path name of * the interpreter. */ char *sp, *interp = NULL; int n; enum { INSERT=FALSE, REPLACE=TRUE }; /* Make script[] the new argv[0]. */ if (!insert_arg(stack, stk_bytes, script, REPLACE)) return(NULL); if (lseek(fd, 2L, 0) == -1 /* just behind the #! */ || (n= read(fd, script, PATH_MAX)) < 0 /* read line one */ || (sp= memchr(script, '\n', n)) == NULL) /* must be a proper line */ return(NULL); /* Move sp backwards through script[], prepending each string to stack. */ for (;;) { /* skip spaces behind argument. */ while (sp > script && (*--sp == ' ' || *sp == '\t')) {} if (sp == script) break; sp[1] = 0; /* Move to the start of the argument. */ while (sp > script && sp[-1] != ' ' && sp[-1] != '\t') --sp; interp = sp; if (!insert_arg(stack, stk_bytes, sp, INSERT)) return(NULL); } /* Round *stk_bytes up to the size of a pointer for alignment contraints. */ *stk_bytes= ((*stk_bytes + PTRSIZE - 1) / PTRSIZE) * PTRSIZE; close(fd); return(interp); } /*===========================================================================* * rw_seg * *===========================================================================*/ PUBLIC void rw_seg(rw, fd, proc, seg, seg_bytes0) int rw; /* 0 = read, 1 = write */ int fd; /* file descriptor to read from / write to */ int proc; /* process number */ int seg; /* T, D, or S */ phys_bytes seg_bytes0; /* how much is to be transferred? */ { /* Transfer text or data from/to a file and copy to/from a process segment. * This procedure is a little bit tricky. The logical way to transfer a * segment would be block by block and copying each block to/from the user * space one at a time. This is too slow, so we do something dirty here, * namely send the user space and virtual address to the file system in the * upper 10 bits of the file descriptor, and pass it the user virtual address * instead of a MM address. The file system extracts these parameters when * gets a read or write call from the memory manager, which is the only process * that is permitted to use this trick. The file system then copies the whole * segment directly to/from user space, bypassing MM completely. * * The byte count on read is usually smaller than the segment count, because * a segment is padded out to a click multiple, and the data segment is only * partially initialized. */ int new_fd, bytes, r; char *ubuf_ptr; struct mem_map *sp = &mproc[proc].mp_seg[seg]; phys_bytes seg_bytes = seg_bytes0; new_fd = (proc << 7) | (seg << 5) | fd; ubuf_ptr = (char *) ((vir_bytes) sp->mem_vir << CLICK_SHIFT); while (seg_bytes != 0) { bytes = MIN((INT_MAX / BLOCK_SIZE) * BLOCK_SIZE, seg_bytes); if (rw == 0) { r = read(new_fd, ubuf_ptr, bytes); } else { r = write(new_fd, ubuf_ptr, bytes); } if (r != bytes) break; ubuf_ptr += bytes; seg_bytes -= bytes; } } /*===========================================================================* * find_share * *===========================================================================*/ PUBLIC struct mproc *find_share(mp_ign, ino, dev, ctime) struct mproc *mp_ign; /* process that should not be looked at */ ino_t ino; /* parameters that uniquely identify a file */ dev_t dev; time_t ctime; { /* Look for a process that is the file in execution. Don't * accidentally "find" mp_ign, because it is the process on whose behalf this * call is made. */ struct mproc *sh_mp; for (sh_mp = &mproc[INIT_PROC_NR]; sh_mp < &mproc[NR_PROCS]; sh_mp++) { if (!(sh_mp->mp_flags & SEPARATE)) continue; if (sh_mp == mp_ign) continue; if (sh_mp->mp_ino != ino) continue; if (sh_mp->mp_dev != dev) continue; if (sh_mp->mp_ctime != ctime) continue; return sh_mp; } return(NULL); } /* This file deals with creating processes (via FORK) and deleting them (via * EXIT/WAIT). When a process forks, a new slot in the 'mproc' table is * allocated for it, and a copy of the parent's core image is made for the * child. Then the kernel and file system are informed. A process is removed * from the 'mproc' table when two events have occurred: (1) it has exited or * been killed by a signal, and (2) the parent has done a WAIT. If the process * exits first, it continues to occupy a slot until the parent does a WAIT. * * The entry points into this file are: * do_fork: perform the FORK system call * do_mm_exit: perform the EXIT system call (by calling mm_exit()) * mm_exit: actually do the exiting * do_wait: perform the WAITPID or WAIT system call */ #include "mm.h" #include #include #include #include "mproc.h" #include "param.h" #define LAST_FEW 2 /* last few slots reserved for superuser */ PRIVATE pid_t next_pid = INIT_PID+1; /* next pid to be assigned */ FORWARD _PROTOTYPE (void cleanup, (register struct mproc *child) ); /*===========================================================================* * do_fork * *===========================================================================*/ PUBLIC int do_fork() { /* The process pointed to by 'mp' has forked. Create a child process. */ register struct mproc *rmp; /* pointer to parent */ register struct mproc *rmc; /* pointer to child */ int i, child_nr, t; phys_clicks prog_clicks, child_base; phys_bytes prog_bytes, parent_abs, child_abs; /* Intel only */ /* If tables might fill up during FORK, don't even start since recovery half * way through is such a nuisance. */ rmp = mp; if (procs_in_use == NR_PROCS) return(EAGAIN); if (procs_in_use >= NR_PROCS-LAST_FEW && rmp->mp_effuid != 0)return(EAGAIN); /* Determine how much memory to allocate. Only the data and stack need to * be copied, because the text segment is either shared or of zero length. */ prog_clicks = (phys_clicks) rmp->mp_seg[S].mem_len; prog_clicks += (rmp->mp_seg[S].mem_vir - rmp->mp_seg[D].mem_vir); prog_bytes = (phys_bytes) prog_clicks << CLICK_SHIFT; if ( (child_base = alloc_mem(prog_clicks)) == NO_MEM) return(ENOMEM); /* Create a copy of the parent's core image for the child. */ child_abs = (phys_bytes) child_base << CLICK_SHIFT; parent_abs = (phys_bytes) rmp->mp_seg[D].mem_phys << CLICK_SHIFT; i = sys_copy(ABS, 0, parent_abs, ABS, 0, child_abs, prog_bytes); if (i < 0) panic("do_fork can't copy", i); /* Find a slot in 'mproc' for the child process. A slot must exist. */ for (rmc = &mproc[0]; rmc < &mproc[NR_PROCS]; rmc++) if ( (rmc->mp_flags & IN_USE) == 0) break; /* Set up the child and its memory map; copy its 'mproc' slot from parent. */ child_nr = (int)(rmc - mproc); /* slot number of the child */ procs_in_use++; *rmc = *rmp; /* copy parent's process slot to child's */ rmc->mp_parent = who; /* record child's parent */ rmc->mp_flags &= (IN_USE|SEPARATE); /* inherit only these flags */ /* A separate I&D child keeps the parents text segment. The data and stack * segments must refer to the new copy. */ if (!(rmc->mp_flags & SEPARATE)) rmc->mp_seg[T].mem_phys = child_base; rmc->mp_seg[D].mem_phys = child_base; rmc->mp_seg[S].mem_phys = rmc->mp_seg[D].mem_phys + (rmp->mp_seg[S].mem_vir - rmp->mp_seg[D].mem_vir); rmc->mp_exitstatus = 0; rmc->mp_sigstatus = 0; /* Find a free pid for the child and put it in the table. */ do { t = 0; /* 't' = 0 means pid still free */ next_pid = (next_pid < 30000 ? next_pid + 1 : INIT_PID + 1); for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) if (rmp->mp_pid == next_pid || rmp->mp_procgrp == next_pid) { t = 1; break; } rmc->mp_pid = next_pid; /* assign pid to child */ } while (t); /* Tell kernel and file system about the (now successful) FORK. */ sys_fork(who, child_nr, rmc->mp_pid); tell_fs(FORK, who, child_nr, rmc->mp_pid); /* Report child's memory map to kernel. */ sys_newmap(child_nr, rmc->mp_seg); /* Reply to child to wake it up. */ setreply(child_nr, 0); return(next_pid); /* child's pid */ } /*===========================================================================* * do_mm_exit * *===========================================================================*/ PUBLIC int do_mm_exit() { /* Perform the exit(status) system call. The real work is done by mm_exit(), * which is also called when a process is killed by a signal. */ mm_exit(mp, status); return(E_NO_MESSAGE); /* can't communicate from beyond the grave */ } /*===========================================================================* * mm_exit * *===========================================================================*/ PUBLIC void mm_exit(rmp, exit_status) register struct mproc *rmp; /* pointer to the process to be terminated */ int exit_status; /* the process' exit status (for parent) */ { /* A process is done. Release most of the process' possessions. If its * parent is waiting, release the rest, else keep the process slot and * become a zombie. */ register int proc_nr; int parent_waiting, right_child; pid_t pidarg, procgrp; struct mproc *p_mp; proc_nr = (int) (rmp - mproc); /* get process slot number */ /* Remember a session leader's process group. */ procgrp = (rmp->mp_pid == mp->mp_procgrp) ? mp->mp_procgrp : 0; /* If the exited process has a timer pending, kill it. */ if (rmp->mp_flags & ALARM_ON) set_alarm(proc_nr, (unsigned) 0); /* Tell the kernel and FS that the process is no longer runnable. */ tell_fs(EXIT, proc_nr, 0, 0); /* file system can free the proc slot */ sys_xit(rmp->mp_parent, proc_nr); /* Release the memory occupied by the child. */ if (find_share(rmp, rmp->mp_ino, rmp->mp_dev, rmp->mp_ctime) == NULL) { /* No other process shares the text segment, so free it. */ free_mem(rmp->mp_seg[T].mem_phys, rmp->mp_seg[T].mem_len); } /* Free the data and stack segments. */ free_mem(rmp->mp_seg[D].mem_phys, rmp->mp_seg[S].mem_vir + rmp->mp_seg[S].mem_len - rmp->mp_seg[D].mem_vir); /* The process slot can only be freed if the parent has done a WAIT. */ rmp->mp_exitstatus = (char) exit_status; p_mp = &mproc[rmp->mp_parent]; /* process' parent */ pidarg = p_mp->mp_wpid; /* who's being waited for? */ parent_waiting = p_mp->mp_flags & WAITING; right_child = /* child meets one of the 3 tests? */ (pidarg == -1 || pidarg == rmp->mp_pid || -pidarg == rmp->mp_procgrp); if (parent_waiting && right_child) { cleanup(rmp); /* tell parent and release child slot */ } else { rmp->mp_flags = IN_USE|ZOMBIE; /* parent not waiting, zombify child */ sig_proc(p_mp, SIGCHLD); /* send parent a "child died" signal */ } /* If the process has children, disinherit them. INIT is the new parent. */ for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) { if (rmp->mp_flags & IN_USE && rmp->mp_parent == proc_nr) { /* 'rmp' now points to a child to be disinherited. */ rmp->mp_parent = INIT_PROC_NR; parent_waiting = mproc[INIT_PROC_NR].mp_flags & WAITING; if (parent_waiting && (rmp->mp_flags & ZOMBIE)) cleanup(rmp); } } /* Send a hangup to the process' process group if it was a session leader. */ if (procgrp != 0) check_sig(-procgrp, SIGHUP); } /*===========================================================================* * do_waitpid * *===========================================================================*/ PUBLIC int do_waitpid() { /* A process wants to wait for a child to terminate. If one is already waiting, * go clean it up and let this WAIT call terminate. Otherwise, really wait. * Both WAIT and WAITPID are handled by this code. */ register struct mproc *rp; int pidarg, options, children; /* A process calling WAIT never gets a reply in the usual way at the end * of the main loop (unless WNOHANG is set or no qualifying child exists). * If a child has already exited, the routine cleanup() sends the reply * to awaken 4444the caller. */ /* Set internal variables, depending on whether this is WAIT or WAITPID. */ pidarg = (mm_call == WAIT ? -1 : pid); /* first param of waitpid */ options = (mm_call == WAIT ? 0 : sig_nr); /* third param of waitpid */ if (pidarg == 0) pidarg = -mp->mp_procgrp; /* pidarg < 0 ==> proc grp */ /* Is there a child waiting to be collected? At this point, pidarg != 0: * pidarg > 0 means pidarg is pid of a specific process to wait for * pidarg == -1 means wait for any child * pidarg < -1 means wait for any child whose process group = -pidarg */ children = 0; for (rp = &mproc[0]; rp < &mproc[NR_PROCS]; rp++) { if ( (rp->mp_flags & IN_USE) && rp->mp_parent == who) { /* The value of pidarg determines which children qualify. */ if (pidarg > 0 && pidarg != rp->mp_pid) continue; if (pidarg < -1 && -pidarg != rp->mp_procgrp) continue; children++; /* this child is acceptable */ if (rp->mp_flags & ZOMBIE) { /* This child meets the pid test and has exited. */ cleanup(rp); /* this child has already exited */ return(E_NO_MESSAGE); } if ((rp->mp_flags & STOPPED) && rp->mp_sigstatus) { /* This child meets the pid test and is being traced.*/ mp->reply_res2 = 0177 | (rp->mp_sigstatus << 8); rp->mp_sigstatus = 0; return(rp->mp_pid); } } } /* No qualifying child has exited. Wait for one, unless none exists. */ if (children > 0) { /* At least 1 child meets the pid test exists, but has not exited. */ if (options & WNOHANG) return(0); /* parent does not want to wait */ mp->mp_flags |= WAITING; /* parent wants to wait */ mp->mp_wpid = (pid_t) pidarg; /* save pid for later */ return(E_NO_MESSAGE); /* do not reply, let it wait */ } else { /* No child even meets the pid test. Return error immediately. */ return(ECHILD); /* no - parent has no children */ } } /*===========================================================================* * cleanup * *===========================================================================*/ PRIVATE void cleanup(child) register struct mproc *child; /* tells which process is exiting */ { /* Finish off the exit of a process. The process has exited or been killed * by a signal, and its parent is waiting. */ struct mproc *parent = &mproc[child->mp_parent]; int exitstatus; /* Wake up the parent. */ exitstatus = (child->mp_exitstatus << 8) | (child->mp_sigstatus & 0377); parent->reply_res2 = exitstatus; setreply(child->mp_parent, child->mp_pid); parent->mp_flags &= ~WAITING; /* parent no longer waiting */ /* Release the process table entry. */ child->mp_flags = 0; procs_in_use--; } /* This file handles the 4 system calls that get and set uids and gids. * It also handles getpid(), setsid(), and getpgrp(). The code for each * one is so tiny that it hardly seemed worthwhile to make each a separate * function. */ #include "mm.h" #include #include #include "mproc.h" #include "param.h" /*===========================================================================* * do_getset * *===========================================================================*/ PUBLIC int do_getset() { /* Handle GETUID, GETGID, GETPID, GETPGRP, SETUID, SETGID, SETSID. The four * GETs and SETSID return their primary results in 'r'. GETUID, GETGID, and * GETPID also return secondary results (the effective IDs, or the parent * process ID) in 'reply_res2', which is returned to the user. */ register struct mproc *rmp = mp; register int r; switch(mm_call) { case GETUID: r = rmp->mp_realuid; rmp->reply_res2 = rmp->mp_effuid; break; case GETGID: r = rmp->mp_realgid; rmp->reply_res2 = rmp->mp_effgid; break; case GETPID: r = mproc[who].mp_pid; rmp->reply_res2 = mproc[rmp->mp_parent].mp_pid; break; case SETUID: if (rmp->mp_realuid != usr_id && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realuid = usr_id; rmp->mp_effuid = usr_id; tell_fs(SETUID, who, usr_id, usr_id); r = OK; break; case SETGID: if (rmp->mp_realgid != grpid && rmp->mp_effuid != SUPER_USER) return(EPERM); rmp->mp_realgid = grpid; rmp->mp_effgid = grpid; tell_fs(SETGID, who, grpid, grpid); r = OK; break; case SETSID: if (rmp->mp_procgrp == rmp->mp_pid) return(EPERM); rmp->mp_procgrp = rmp->mp_pid; tell_fs(SETSID, who, 0, 0); /*FALL THROUGH*/ case GETPGRP: r = rmp->mp_procgrp; break; default: r = EINVAL; break; } return(r); } /* EXTERN should be extern except in table.c */ #ifdef _TABLE #undef EXTERN #define EXTERN #endif /* Global variables. */ EXTERN struct mproc *mp; /* ptr to 'mproc' slot of current process */ EXTERN int procs_in_use; /* how many processes are marked as IN_USE */ /* The parameters of the call are kept here. */ EXTERN message mm_in; /* the incoming message itself is kept here. */ EXTERN int who; /* caller's proc number */ EXTERN int mm_call; /* system call number */ extern _PROTOTYPE (int (*call_vec[]), (void) ); /* system call handlers */ extern char core_name[]; /* file name where core images are produced */ EXTERN sigset_t core_sset; /* which signals cause core images */ EXTERN sigset_t ign_sset; /* which signals are by default ignored */ /* This file contains the main program of the memory manager and some related * procedures. When MINIX starts up, the kernel runs for a little while, * initializing itself and its tasks, and then it runs MM and FS. Both MM * and FS initialize themselves as far as they can. FS then makes a call to * MM, because MM has to wait for FS to acquire a RAM disk. MM asks the * kernel for all free memory and starts serving requests. * * The entry points into this file are: * main: starts MM running * setreply: set the reply to be sent to process making an MM system call */ #include "mm.h" #include #include #include #include #include #include "mproc.h" #include "param.h" FORWARD _PROTOTYPE( void get_work, (void) ); FORWARD _PROTOTYPE( void mm_init, (void) ); #define click_to_round_k(n) \ ((unsigned) ((((unsigned long) (n) << CLICK_SHIFT) + 512) / 1024)) /*===========================================================================* * main * *===========================================================================*/ PUBLIC void main() { /* Main routine of the memory manager. */ int result, proc_nr; struct mproc *rmp; mm_init(); /* initialize memory manager tables */ /* This is MM's main loop- get work and do it, forever and forever. */ while (TRUE) { get_work(); /* wait for an MM system call */ /* If the call number is valid, perform the call. */ if ((unsigned) mm_call >= NCALLS) { result = ENOSYS; } else { result = (*call_vec[mm_call])(); } /* Send the results back to the user to indicate completion. */ if (result != E_NO_MESSAGE) setreply(who, result); swap_in(); /* maybe a process can be swapped in? */ /* Send out all pending reply messages, including the answer to * the call just made above. The processes must not be swapped out. */ for (proc_nr = 0, rmp = mproc; proc_nr < NR_PROCS; proc_nr++, rmp++) { if ((rmp->mp_flags & (REPLY | ONSWAP)) == REPLY) { if (send(proc_nr, &rmp->mp_reply) != OK) panic("MM can't reply to", proc_nr); rmp->mp_flags &= ~REPLY; } } } } /*===========================================================================* * get_work * *===========================================================================*/ PRIVATE void get_work() { /* Wait for the next message and extract useful information from it. */ if (receive(ANY, &mm_in) != OK) panic("MM receive error", NO_NUM); who = mm_in.m_source; /* who sent the message */ mm_call = mm_in.m_type; /* system call number */ /* Process slot of caller. Misuse MM's own process slot for tasks (KSIG?). */ mp = &mproc[who < 0 ? MM_PROC_NR : who]; } /*===========================================================================* * setreply * *===========================================================================*/ PUBLIC void setreply(proc_nr, result) int proc_nr; /* process to reply to */ int result; /* result of the call (usually OK or error #)*/ { /* Fill in a reply message to be sent later to a user process. System calls * may occasionally fill in other fields, this is only for the main return * value, and for setting the "must send reply" flag. */ register struct mproc *rmp = &mproc[proc_nr]; rmp->reply_res = result; rmp->mp_flags |= REPLY; /* reply pending */ if (rmp->mp_flags & ONSWAP) swap_inqueue(rmp); /* must swap this process back in */ } /*===========================================================================* * mm_init * *===========================================================================*/ PRIVATE void mm_init() { /* Initialize the memory manager. */ static char core_sigs[] = { SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGEMT, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2 }; static char ign_sigs[] = { SIGCHLD }; register int proc_nr; register struct mproc *rmp; register char *sig_ptr; phys_clicks ram_clicks, total_clicks, minix_clicks, free_clicks; message mess; struct mem_map kernel_map[NR_SEGS]; int mem; /* Build the set of signals which cause core dumps, and the set of signals * that are by default ignored. */ sigemptyset(&core_sset); for (sig_ptr = core_sigs; sig_ptr < core_sigs+sizeof(core_sigs); sig_ptr++) sigaddset(&core_sset, *sig_ptr); sigemptyset(&ign_sset); for (sig_ptr = ign_sigs; sig_ptr < ign_sigs+sizeof(ign_sigs); sig_ptr++) sigaddset(&ign_sset, *sig_ptr); /* Get the memory map of the kernel to see how much memory it uses. */ sys_getmap(SYSTASK, kernel_map); minix_clicks = (kernel_map[S].mem_phys + kernel_map[S].mem_len) - kernel_map[T].mem_phys; /* Initialize MM's tables. */ for (proc_nr = 0; proc_nr <= INIT_PROC_NR; proc_nr++) { rmp = &mproc[proc_nr]; rmp->mp_flags |= IN_USE; sys_getmap(proc_nr, rmp->mp_seg); if (rmp->mp_seg[T].mem_len != 0) rmp->mp_flags |= SEPARATE; minix_clicks += (rmp->mp_seg[S].mem_phys + rmp->mp_seg[S].mem_len) - rmp->mp_seg[T].mem_phys; } mproc[INIT_PROC_NR].mp_pid = INIT_PID; sigemptyset(&mproc[INIT_PROC_NR].mp_ignore); sigemptyset(&mproc[INIT_PROC_NR].mp_catch); procs_in_use = LOW_USER + 1; /* Wait for FS to send a message telling the RAM disk size then go "on-line". */ if (receive(FS_PROC_NR, &mess) != OK) panic("MM can't obtain RAM disk size from FS", NO_NUM); ram_clicks = mess.m1_i1; /* Initialize tables to all physical mem. */ mem_init(&total_clicks, &free_clicks); /* Print memory information. */ printf("\nMemory size = %uK ", click_to_round_k(total_clicks)); printf("MINIX = %uK ", click_to_round_k(minix_clicks)); printf("RAM disk = %uK ", click_to_round_k(ram_clicks)); printf("Available = %uK\n\n", click_to_round_k(free_clicks)); /* Tell FS to continue. */ if (send(FS_PROC_NR, &mess) != OK) panic("MM can't sync up with FS", NO_NUM); /* Tell the memory task where my process table is for the sake of ps(1). */ if ((mem = open("/dev/ram", O_RDWR)) != -1) { ioctl(mem, MIOCSPSINFO, (void *) mproc); close(mem); } } /* This is the master header for mm. It includes some other files * and defines the principal constants. */ #define _POSIX_SOURCE 1 /* tell headers to include POSIX stuff */ #define _MINIX 1 /* tell headers to include MINIX stuff */ #define _SYSTEM 1 /* tell headers that this is the kernel */ /* The following are so basic, all the *.c files get them automatically. */ #include /* MUST be first */ #include /* MUST be second */ #include #include #include #include #include #include #include #include #include "const.h" #include "type.h" #include "proto.h" #include "glo.h" /* This table has one slot per process. It contains all the memory management * information for each process. Among other things, it defines the text, data * and stack segments, uids and gids, and various flags. The kernel and file * systems have tables that are also indexed by process, with the contents * of corresponding slots referring to the same process in all three. */ EXTERN struct mproc { struct mem_map mp_seg[NR_SEGS];/* points to text, data, stack */ char mp_exitstatus; /* storage for status when process exits */ char mp_sigstatus; /* storage for signal # for killed procs */ pid_t mp_pid; /* process id */ pid_t mp_procgrp; /* pid of process group (used for signals) */ pid_t mp_wpid; /* pid this process is waiting for */ int mp_parent; /* index of parent process */ /* Real and effective uids and gids. */ uid_t mp_realuid; /* process' real uid */ uid_t mp_effuid; /* process' effective uid */ gid_t mp_realgid; /* process' real gid */ gid_t mp_effgid; /* process' effective gid */ /* File identification for sharing. */ ino_t mp_ino; /* inode number of file */ dev_t mp_dev; /* device number of file system */ time_t mp_ctime; /* inode changed time */ /* Signal handling information. */ sigset_t mp_ignore; /* 1 means ignore the signal, 0 means don't */ sigset_t mp_catch; /* 1 means catch the signal, 0 means don't */ sigset_t mp_sigmask; /* signals to be blocked */ sigset_t mp_sigmask2; /* saved copy of mp_sigmask */ sigset_t mp_sigpending; /* signals being blocked */ struct sigaction mp_sigact[_NSIG + 1]; /* as in sigaction(2) */ vir_bytes mp_sigreturn; /* address of C library __sigreturn function */ /* Backwards compatibility for signals. */ sighandler_t mp_func; /* all sigs vectored to a single user fcn */ unsigned mp_flags; /* flag bits */ vir_bytes mp_procargs; /* ptr to proc's initial stack arguments */ struct mproc *mp_swapq; /* queue of procs waiting to be swapped in */ message mp_reply; /* reply message to be sent to one */ } mproc[NR_PROCS]; /* Flag values */ #define IN_USE 0x001 /* set when 'mproc' slot in use */ #define WAITING 0x002 /* set by WAIT system call */ #define ZOMBIE 0x004 /* set by EXIT, cleared by WAIT */ #define PAUSED 0x008 /* set by PAUSE system call */ #define ALARM_ON 0x010 /* set when SIGALRM timer started */ #define SEPARATE 0x020 /* set if file is separate I & D space */ #define TRACED 0x040 /* set if process is to be traced */ #define STOPPED 0x080 /* set if process stopped for tracing */ #define SIGSUSPENDED 0x100 /* set by SIGSUSPEND system call */ #define REPLY 0x200 /* set if a reply message is pending */ #define ONSWAP 0x400 /* set if data segment is swapped out */ #define SWAPIN 0x800 /* set if on the "swap this in" queue */ #define NIL_MPROC ((struct mproc *) 0) /* The following names are synonyms for the variables in the input message. */ #define addr mm_in.m1_p1 #define exec_name mm_in.m1_p1 #define exec_len mm_in.m1_i1 #define func mm_in.m6_f1 #define grpid (gid_t) mm_in.m1_i1 #define namelen mm_in.m1_i1 #define pid mm_in.m1_i1 #define seconds mm_in.m1_i1 #define sig mm_in.m6_i1 #define stack_bytes mm_in.m1_i2 #define stack_ptr mm_in.m1_p2 #define status mm_in.m1_i1 #define usr_id (uid_t) mm_in.m1_i1 #define request mm_in.m2_i2 #define taddr mm_in.m2_l1 #define data mm_in.m2_l2 #define sig_nr mm_in.m1_i2 #define sig_nsa mm_in.m1_p1 #define sig_osa mm_in.m1_p2 #define sig_ret mm_in.m1_p3 #define sig_set mm_in.m2_l1 #define sig_how mm_in.m2_i1 #define sig_flags mm_in.m2_i2 #define sig_context mm_in.m2_p1 #ifdef _SIGMESSAGE #define sig_msg mm_in.m1_i1 #endif #define reboot_flag mm_in.m1_i1 #define reboot_code mm_in.m1_p1 #define reboot_size mm_in.m1_i2 #define svrctl_req mm_in.m2_i1 #define svrctl_argp mm_in.m2_p1 /* The following names are synonyms for the variables in a reply message. */ #define reply_res mp_reply.m_type #define reply_res2 mp_reply.m2_i1 #define reply_ptr mp_reply.m2_p1 #define reply_mask mp_reply.m2_l1 /* Function prototypes. */ struct mproc; struct stat; /* alloc.c */ _PROTOTYPE( phys_clicks alloc_mem, (phys_clicks clicks) ); _PROTOTYPE( void free_mem, (phys_clicks base, phys_clicks clicks) ); _PROTOTYPE( void mem_init, (phys_clicks *total, phys_clicks *free) ); _PROTOTYPE( int swap_on, (char *file, u32_t offset, u32_t size) ); _PROTOTYPE( int swap_off, (void) ); _PROTOTYPE( void swap_in, (void) ); _PROTOTYPE( void swap_inqueue, (struct mproc *rmp) ); /* break.c */ _PROTOTYPE( int adjust, (struct mproc *rmp, vir_clicks data_clicks, vir_bytes sp) ); _PROTOTYPE( int do_brk, (void) ); _PROTOTYPE( int size_ok, (int file_type, vir_clicks tc, vir_clicks dc, vir_clicks sc, vir_clicks dvir, vir_clicks s_vir) ); /* exec.c */ _PROTOTYPE( int do_exec, (void) ); _PROTOTYPE( void rw_seg, (int rw, int fd, int proc, int seg, phys_bytes seg_bytes) ); _PROTOTYPE( struct mproc *find_share, (struct mproc *mp_ign, Ino_t ino, Dev_t dev, time_t ctime) ); /* forkexit.c */ _PROTOTYPE( int do_fork, (void) ); _PROTOTYPE( int do_mm_exit, (void) ); _PROTOTYPE( int do_waitpid, (void) ); _PROTOTYPE( void mm_exit, (struct mproc *rmp, int exit_status) ); /* getset.c */ _PROTOTYPE( int do_getset, (void) ); /* main.c */ _PROTOTYPE( void main, (void) ); /* misc.c */ _PROTOTYPE( int do_reboot, (void) ); _PROTOTYPE( int do_svrctl, (void) ); #if (MACHINE == MACINTOSH) _PROTOTYPE( phys_clicks start_click, (void) ); #endif _PROTOTYPE( void setreply, (int proc_nr, int result) ); /* signal.c */ _PROTOTYPE( int do_alarm, (void) ); _PROTOTYPE( int do_kill, (void) ); _PROTOTYPE( int do_ksig, (void) ); _PROTOTYPE( int do_pause, (void) ); _PROTOTYPE( int set_alarm, (int proc_nr, int sec) ); _PROTOTYPE( int check_sig, (pid_t proc_id, int signo) ); _PROTOTYPE( void sig_proc, (struct mproc *rmp, int sig_nr) ); _PROTOTYPE( int do_sigaction, (void) ); _PROTOTYPE( int do_sigpending, (void) ); _PROTOTYPE( int do_sigprocmask, (void) ); _PROTOTYPE( int do_sigreturn, (void) ); _PROTOTYPE( int do_sigsuspend, (void) ); _PROTOTYPE( void check_pending, (struct mproc *rmp) ); /* trace.c */ _PROTOTYPE( int do_trace, (void) ); _PROTOTYPE( void stop_proc, (struct mproc *rmp, int sig_nr) ); /* utility.c */ _PROTOTYPE( int allowed, (char *name_buf, struct stat *s_buf, int mask) ); _PROTOTYPE( int no_sys, (void) ); _PROTOTYPE( void panic, (char *format, int num) ); _PROTOTYPE( void tell_fs, (int what, int p1, int p2, int p3) ); /* MM must occasionally print some message. It uses a special version of * the standard library routine printf() that calls putk() to print characters. * Printing is done by calling the TTY task directly, not going through FS. */ #include "mm.h" #include #define BUF_SIZE 80 /* print buffer size */ PRIVATE int buf_count; /* # characters in the buffer */ PRIVATE char print_buf[BUF_SIZE]; /* output is buffered here */ PRIVATE message putch_msg; /* used for message to TTY task */ _PROTOTYPE( FORWARD void flush, (void) ); /*===========================================================================* * putk * *===========================================================================*/ PUBLIC void putk(c) int c; { /* Accumulate another character. If 0 or buffer full, print it. */ if (c == 0 || buf_count == BUF_SIZE) flush(); if (c == '\n') putk('\r'); if (c != 0) print_buf[buf_count++] = c; } /*===========================================================================* * flush * *===========================================================================*/ PRIVATE void flush() { /* Flush the print buffer by calling TTY task. */ if (buf_count == 0) return; putch_msg.m_type = DEV_WRITE; putch_msg.PROC_NR = 0; putch_msg.TTY_LINE = 0; putch_msg.ADDRESS = print_buf; putch_msg.COUNT = buf_count; sendrec(TTY, &putch_msg); buf_count = 0; } /* This file handles signals, which are asynchronous events and are generally * a messy and unpleasant business. Signals can be generated by the KILL * system call, or from the keyboard (SIGINT) or from the clock (SIGALRM). * In all cases control eventually passes to check_sig() to see which processes * can be signaled. The actual signaling is done by sig_proc(). * * The entry points into this file are: * do_sigaction: perform the SIGACTION system call * do_sigpending: perform the SIGPENDING system call * do_sigprocmask: perform the SIGPROCMASK system call * do_sigreturn: perform the SIGRETURN system call * do_sigsuspend: perform the SIGSUSPEND system call * do_kill: perform the KILL system call * do_ksig: accept a signal originating in the kernel (e.g., SIGINT) * do_alarm: perform the ALARM system call by calling set_alarm() * set_alarm: tell the clock task to start or stop a timer * do_pause: perform the PAUSE system call * sig_proc: interrupt or terminate a signaled process * check_sig: check which processes to signal with sig_proc() * check_pending: check if a pending signal can now be delivered */ #include "mm.h" #include #include #include #include #include #include #include "mproc.h" #include "param.h" #define CORE_MODE 0777 /* mode to use on core image files */ #define DUMPED 0200 /* bit set in status when core dumped */ FORWARD _PROTOTYPE( void dump_core, (struct mproc *rmp) ); FORWARD _PROTOTYPE( void unpause, (int pro) ); /*===========================================================================* * do_sigaction * *===========================================================================*/ PUBLIC int do_sigaction() { int r; struct sigaction svec; struct sigaction *svp; if (sig_nr == SIGKILL) return(OK); if (sig_nr < 1 || sig_nr > _NSIG) return (EINVAL); svp = &mp->mp_sigact[sig_nr]; if ((struct sigaction *) sig_osa != (struct sigaction *) NULL) { r = sys_copy(MM_PROC_NR,D, (phys_bytes) svp, who, D, (phys_bytes) sig_osa, (phys_bytes) sizeof(svec)); if (r != OK) return(r); } if ((struct sigaction *) sig_nsa == (struct sigaction *) NULL) return(OK); /* Read in the sigaction structure. */ r = sys_copy(who, D, (phys_bytes) sig_nsa, MM_PROC_NR, D, (phys_bytes) &svec, (phys_bytes) sizeof(svec)); if (r != OK) return(r); if (svec.sa_handler == SIG_IGN) { sigaddset(&mp->mp_ignore, sig_nr); sigdelset(&mp->mp_sigpending, sig_nr); sigdelset(&mp->mp_catch, sig_nr); } else { sigdelset(&mp->mp_ignore, sig_nr); if (svec.sa_handler == SIG_DFL) sigdelset(&mp->mp_catch, sig_nr); else sigaddset(&mp->mp_catch, sig_nr); } mp->mp_sigact[sig_nr].sa_handler = svec.sa_handler; sigdelset(&svec.sa_mask, SIGKILL); mp->mp_sigact[sig_nr].sa_mask = svec.sa_mask; mp->mp_sigact[sig_nr].sa_flags = svec.sa_flags; mp->mp_sigreturn = (vir_bytes) sig_ret; return(OK); } /*===========================================================================* * do_sigpending * *===========================================================================*/ PUBLIC int do_sigpending() { mp->reply_mask = (long) mp->mp_sigpending; return OK; } /*===========================================================================* * do_sigprocmask * *===========================================================================*/ PUBLIC int do_sigprocmask() { /* Note that the library interface passes the actual mask in sigmask_set, * not a pointer to the mask, in order to save a sys_copy. Similarly, * the old mask is placed in the return message which the library * interface copies (if requested) to the user specified address. * * The library interface must set SIG_INQUIRE if the 'act' argument * is NULL. */ int i; mp->reply_mask = (long) mp->mp_sigmask; switch (sig_how) { case SIG_BLOCK: sigdelset((sigset_t *)&sig_set, SIGKILL); for (i = 1; i <= _NSIG; i++) { if (sigismember((sigset_t *)&sig_set, i)) sigaddset(&mp->mp_sigmask, i); } break; case SIG_UNBLOCK: for (i = 1; i <= _NSIG; i++) { if (sigismember((sigset_t *)&sig_set, i)) sigdelset(&mp->mp_sigmask, i); } check_pending(mp); break; case SIG_SETMASK: sigdelset((sigset_t *)&sig_set, SIGKILL); mp->mp_sigmask = (sigset_t)sig_set; check_pending(mp); break; case SIG_INQUIRE: break; default: return(EINVAL); break; } return OK; } /*===========================================================================* * do_sigsuspend * *===========================================================================*/ PUBLIC int do_sigsuspend() { mp->mp_sigmask2 = mp->mp_sigmask; /* save the old mask */ mp->mp_sigmask = (sigset_t) sig_set; sigdelset(&mp->mp_sigmask, SIGKILL); mp->mp_flags |= SIGSUSPENDED; check_pending(mp); return(E_NO_MESSAGE); } /*===========================================================================* * do_sigreturn * *===========================================================================*/ PUBLIC int do_sigreturn() { /* A user signal handler is done. Restore context and check for * pending unblocked signals. */ int r; mp->mp_sigmask = (sigset_t) sig_set; sigdelset(&mp->mp_sigmask, SIGKILL); r = sys_sigreturn(who, (vir_bytes)sig_context, sig_flags); check_pending(mp); return(r); } /*===========================================================================* * do_kill * *===========================================================================*/ PUBLIC int do_kill() { /* Perform the kill(pid, signo) system call. */ return check_sig(pid, sig_nr); } /*===========================================================================* * do_ksig * *===========================================================================*/ PUBLIC int do_ksig() { /* Certain signals, such as segmentation violations and DEL, originate in the * kernel. When the kernel detects such signals, it sets bits in a bit map. * As soon as MM is awaiting new work, the kernel sends MM a message containing * the process slot and bit map. That message comes here. The File System * also uses this mechanism to signal writing on broken pipes (SIGPIPE). */ register struct mproc *rmp; int i, proc_nr; pid_t proc_id, id; sigset_t sig_map; /* Only kernel may make this call. */ if (who != HARDWARE) return(EPERM); proc_nr = mm_in.SIG_PROC; rmp = &mproc[proc_nr]; if ((rmp->mp_flags & (IN_USE | ZOMBIE)) != IN_USE) return(E_NO_MESSAGE); proc_id = rmp->mp_pid; sig_map = (sigset_t) mm_in.SIG_MAP; mp = &mproc[0]; /* pretend kernel signals are from MM */ mp->mp_procgrp = rmp->mp_procgrp; /* get process group right */ /* Check each bit in turn to see if a signal is to be sent. Unlike * kill(), the kernel may collect several unrelated signals for a * process and pass them to MM in one blow. Thus loop on the bit * map. For SIGINT and SIGQUIT, use proc_id 0 to indicate a broadcast * to the recipient's process group. For SIGKILL, use proc_id -1 to * indicate a systemwide broadcast. */ for (i = 1; i <= _NSIG; i++) { if (!sigismember(&sig_map, i)) continue; switch (i) { case SIGINT: case SIGQUIT: id = 0; break; /* broadcast to process group */ case SIGKILL: id = -1; break; /* broadcast to all except INIT */ case SIGALRM: /* Disregard SIGALRM when the target process has not * requested an alarm. This only applies for a KERNEL * generated signal. */ if ((rmp->mp_flags & ALARM_ON) == 0) continue; rmp->mp_flags &= ~ALARM_ON; /* fall through */ default: id = proc_id; break; } check_sig(id, i); sys_endsig(proc_nr); /* tell kernel it's done */ } return(E_NO_MESSAGE); } /*===========================================================================* * do_alarm * *==4444444444444=========================================================================*/ PUBLIC int do_alarm() { /* Perform the alarm(seconds) system call. */ return(set_alarm(who, seconds)); } /*===========================================================================* * set_alarm * *===========================================================================*/ PUBLIC int set_alarm(proc_nr, sec) int proc_nr; /* process that wants the alarm */ int sec; /* how many seconds delay before the signal */ { /* This routine is used by do_alarm() to set the alarm timer. It is also used * to turn the timer off when a process exits with the timer still on. */ message m_sig; int remaining; if (sec != 0) mproc[proc_nr].mp_flags |= ALARM_ON; else mproc[proc_nr].mp_flags &= ~ALARM_ON; /* Tell the clock task to provide a signal message when the time comes. * * Large delays cause a lot of problems. First, the alarm system call * takes an unsigned seconds count and the library has cast it to an int. * That probably works, but on return the library will convert "negative" * unsigneds to errors. Presumably no one checks for these errors, so * force this call through. Second, If unsigned and long have the same * size, converting from seconds to ticks can easily overflow. Finally, * the kernel has similar overflow bugs adding ticks. * * Fixing this requires a lot of ugly casts to fit the wrong interface * types and to avoid overflow traps. DELTA_TICKS has the right type * (clock_t) although it is declared as long. How can variables like * this be declared properly without combinatorial explosion of message * types? */ m_sig.m_type = SET_ALARM; m_sig.CLOCK_PROC_NR = proc_nr; m_sig.DELTA_TICKS = (clock_t) (HZ * (unsigned long) (unsigned) sec); if ( (unsigned long) m_sig.DELTA_TICKS / HZ != (unsigned) sec) m_sig.DELTA_TICKS = LONG_MAX; /* eternity (really CLOCK_T_MAX) */ if (sendrec(CLOCK, &m_sig) != OK) panic("alarm er", NO_NUM); remaining = (int) m_sig.SECONDS_LEFT; if (remaining != m_sig.SECONDS_LEFT || remaining < 0) remaining = INT_MAX; /* true value is not representable */ return(remaining); } /*===========================================================================* * do_pause * *===========================================================================*/ PUBLIC int do_pause() { /* Perform the pause() system call. */ mp->mp_flags |= PAUSED; return(E_NO_MESSAGE); } /*===========================================================================* * sig_proc * *===========================================================================*/ PUBLIC void sig_proc(rmp, signo) register struct mproc *rmp; /* pointer to the process to be signaled */ int signo; /* signal to send to process (1 to _NSIG) */ { /* Send a signal to a process. Check to see if the signal is to be caught, * ignored, or blocked. If the signal is to be caught, coordinate with * KERNEL to push a sigcontext structure and a sigframe structure onto * the catcher's stack. Also, KERNEL will reset the program counter and * stack pointer, so that when the process next runs, it will be executing * the signal handler. When the signal handler returns, sigreturn(2) * will be called. Then KERNEL will restore the signal context from the * sigcontext structure. * * If there is insufficient stack space, kill the process. */ vir_bytes new_sp; int slot; int sigflags; struct sigmsg sm; slot = (int) (rmp - mproc); if ((rmp->mp_flags & (IN_USE | ZOMBIE)) != IN_USE) { printf("MM: signal %d sent to %s process %d\n", (rmp->mp_flags & ZOMBIE) ? "zombie" : "dead", signo, slot); panic("", NO_NUM); } if ((rmp->mp_flags & TRACED) && signo != SIGKILL) { /* A traced process has special handling. */ unpause(slot); stop_proc(rmp, signo); /* a signal causes it to stop */ return; } /* Some signals are ignored by default. */ if (sigismember(&rmp->mp_ignore, signo)) return; if (sigismember(&rmp->mp_sigmask, signo)) { /* Signal should be blocked. */ sigaddset(&rmp->mp_sigpending, signo); return; } sigflags = rmp->mp_sigact[signo].sa_flags; if (sigismember(&rmp->mp_catch, signo)) { if (rmp->mp_flags & ONSWAP) { /* Process is swapped out, leave signal pending. */ sigaddset(&rmp->mp_sigpending, signo); swap_inqueue(rmp); return; } if (rmp->mp_flags & SIGSUSPENDED) sm.sm_mask = rmp->mp_sigmask2; else sm.sm_mask = rmp->mp_sigmask; sm.sm_signo = signo; sm.sm_sighandler = (vir_bytes) rmp->mp_sigact[signo].sa_handler; sm.sm_sigreturn = rmp->mp_sigreturn; sys_getsp(slot, &new_sp); sm.sm_stkptr = new_sp; /* Make room for the sigcontext and sigframe struct. */ new_sp -= sizeof(struct sigcontext) + 3 * sizeof(char *) + 2 * sizeof(int); if (adjust(rmp, rmp->mp_seg[D].mem_len, new_sp) != OK) goto doterminate; rmp->mp_sigmask |= rmp->mp_sigact[signo].sa_mask; if (sigflags & SA_NODEFER) sigdelset(&rmp->mp_sigmask, signo); else sigaddset(&rmp->mp_sigmask, signo); if (sigflags & SA_RESETHAND) { sigdelset(&rmp->mp_catch, signo); rmp->mp_sigact[signo].sa_handler = SIG_DFL; } sys_sendsig(slot, &sm); sigdelset(&rmp->mp_sigpending, signo); /* If process is hanging on PAUSE, WAIT, SIGSUSPEND, tty, pipe, etc., * release it. */ unpause(slot); return; } doterminate: /* Signal should not or cannot be caught. Take default action. */ if (sigismember(&ign_sset, signo)) return; rmp->mp_sigstatus = (char) signo; if (sigismember(&core_sset, signo)) { if (rmp->mp_flags & ONSWAP) { /* Process is swapped out, leave signal pending. */ sigaddset(&rmp->mp_sigpending, signo); swap_inqueue(rmp); return; } /* Switch to the user's FS environment and dump core. */ tell_fs(CHDIR, slot, FALSE, 0); dump_core(rmp); } mm_exit(rmp, 0); /* terminate process */ } /*===========================================================================* * check_sig * *===========================================================================*/ PUBLIC int check_sig(proc_id, signo) pid_t proc_id; /* pid of proc to sig, or 0 or -1, or -pgrp */ int signo; /* signal to send to process (0 to _NSIG) */ { /* Check to see if it is possible to send a signal. The signal may have to be * sent to a group of processes. This routine is invoked by the KILL system * call, and also when the kernel catches a DEL or other signal. */ register struct mproc *rmp; int count; /* count # of signals sent */ int error_code; if (signo < 0 || signo > _NSIG) return(EINVAL); /* Return EINVAL for attempts to send SIGKILL to INIT alone. */ if (proc_id == INIT_PID && signo == SIGKILL) return(EINVAL); /* Search the proc table for processes to signal. (See forkexit.c about * pid magic.) */ count = 0; error_code = ESRCH; for (rmp = &mproc[INIT_PROC_NR]; rmp < &mproc[NR_PROCS]; rmp++) { if (!(rmp->mp_flags & IN_USE)) continue; if ((rmp->mp_flags & ZOMBIE) && signo != 0) continue; /* Check for selection. */ if (proc_id > 0 && proc_id != rmp->mp_pid) continue; if (proc_id == 0 && mp->mp_procgrp != rmp->mp_procgrp) continue; if (proc_id == -1 && rmp->mp_pid <= INIT_PID) continue; if (proc_id < -1 && rmp->mp_procgrp != -proc_id) continue; /* Check for permission. */ if (mp->mp_effuid != SUPER_USER && mp->mp_realuid != rmp->mp_realuid && mp->mp_effuid != rmp->mp_realuid && mp->mp_realuid != rmp->mp_effuid && mp->mp_effuid != rmp->mp_effuid) { error_code = EPERM; continue; } count++; if (signo == 0) continue; /* 'sig_proc' will handle the disposition of the signal. The * signal may be caught, blocked, ignored, or cause process * termination, possibly with core dump. */ sig_proc(rmp, signo); if (proc_id > 0) break; /* only one process being signaled */ } /* If the calling process has killed itself, don't reply. */ if ((mp->mp_flags & (IN_USE | ZOMBIE)) != IN_USE) return(E_NO_MESSAGE); return(count > 0 ? OK : error_code); } /*===========================================================================* * check_pending * *===========================================================================*/ PUBLIC void check_pending(rmp) register struct mproc *rmp; { /* Check to see if any pending signals have been unblocked. The * first such signal found is delivered. * * If multiple pending unmasked signals are found, they will be * delivered sequentially. * * There are several places in this file where the signal mask is * changed. At each such place, check_pending() should be called to * check for newly unblocked signals. */ int i; for (i = 1; i <= _NSIG; i++) { if (sigismember(&rmp->mp_sigpending, i) && !sigismember(&rmp->mp_sigmask, i)) { sigdelset(&rmp->mp_sigpending, i); sig_proc(rmp, i); break; } } } /*===========================================================================* * unpause * *===========================================================================*/ PRIVATE void unpause(pro) int pro; /* which process number */ { /* A signal is to be sent to a process. If that process is hanging on a * system call, the system call must be terminated with EINTR. Possible * calls are PAUSE, WAIT, READ and WRITE, the latter two for pipes and ttys. * First check if the process is hanging on an MM call. If not, tell FS, * so it can check for READs and WRITEs from pipes, ttys and the like. */ register struct mproc *rmp; rmp = &mproc[pro]; /* Check to see if process is hanging on a PAUSE, WAIT or SIGSUSPEND call. */ if (rmp->mp_flags & (PAUSED | WAITING | SIGSUSPENDED)) { rmp->mp_flags &= ~(PAUSED | WAITING | SIGSUSPENDED); setreply(pro, EINTR); return; } /* Process is not hanging on an MM call. Ask FS to take a look. */ tell_fs(UNPAUSE, pro, 0, 0); } /*===========================================================================* * dump_core * *===========================================================================*/ PRIVATE void dump_core(rmp) register struct mproc *rmp; /* whose core is to be dumped */ { /* Make a core dump on the file "core", if possible. */ int fd, fake_fd, nr_written, seg, slot; char *buf; vir_bytes current_sp; phys_bytes left; /* careful; 64K might overflow vir_bytes */ unsigned nr_to_write; /* unsigned for arg to write() but < INT_MAX */ long trace_data, trace_off; slot = (int) (rmp - mproc); /* Can core file be written? We are operating in the user's FS environment, * so no special permission checks are needed. */ if (rmp->mp_realuid != rmp->mp_effuid) return; if ( (fd = open(core_name, O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, CORE_MODE)) < 0) return; rmp->mp_sigstatus |= DUMPED; /* Make sure the stack segment is up to date. * We don't want adjust() to fail unless current_sp is preposterous, * but it might fail due to safety checking. Also, we don't really want * the adjust() for sending a signal to fail due to safety checking. * Maybe make SAFETY_BYTES a parameter. */ sys_getsp(slot, ¤t_sp); adjust(rmp, rmp->mp_seg[D].mem_len, current_sp); /* Write the memory map of all segments to begin the core file. */ if (write(fd, (char *) rmp->mp_seg, (unsigned) sizeof rmp->mp_seg) != (unsigned) sizeof rmp->mp_seg) { close(fd); return; } /* Write out the whole kernel process table entry to get the regs. */ trace_off = 0; while (sys_trace(3, slot, trace_off, &trace_data) == OK) { if (write(fd, (char *) &trace_data, (unsigned) sizeof (long)) != (unsigned) sizeof (long)) { close(fd); return; } trace_off += sizeof (long); } /* Loop through segments and write the segments themselves out. */ for (seg = 0; seg < NR_SEGS; seg++) { rw_seg(1, fd, slot, seg, (phys_bytes) rmp->mp_seg[seg].mem_len << CLICK_SHIFT); } close(fd); } /* This file contains the table used to map system call numbers onto the * routines that perform them. */ #define _TABLE #include "mm.h" #include #include #include "mproc.h" #include "param.h" /* Miscellaneous */ char core_name[] = "core"; /* file name where core images are produced */ _PROTOTYPE (int (*call_vec[NCALLS]), (void) ) = { no_sys, /* 0 = unused */ do_mm_exit, /* 1 = exit */ do_fork, /* 2 = fork */ no_sys, /* 3 = read */ no_sys, /* 4 = write */ no_sys, /* 5 = open */ no_sys, /* 6 = close */ do_waitpid, /* 7 = wait */ no_sys, /* 8 = creat */ no_sys, /* 9 = link */ no_sys, /* 10 = unlink */ do_waitpid, /* 11 = waitpid */ no_sys, /* 12 = chdir */ no_sys, /* 13 = time */ no_sys, /* 14 = mknod */ no_sys, /* 15 = chmod */ no_sys, /* 16 = chown */ do_brk, /* 17 = break */ no_sys, /* 18 = stat */ no_sys, /* 19 = lseek */ do_getset, /* 20 = getpid */ no_sys, /* 21 = mount */ no_sys, /* 22 = umount */ do_getset, /* 23 = setuid */ do_getset, /* 24 = getuid */ no_sys, /* 25 = stime */ do_trace, /* 26 = ptrace */ do_alarm, /* 27 = alarm */ no_sys, /* 28 = fstat */ do_pause, /* 29 = pause */ no_sys, /* 30 = utime */ no_sys, /* 31 = (stty) */ no_sys, /* 32 = (gtty) */ no_sys, /* 33 = access */ no_sys, /* 34 = (nice) */ no_sys, /* 35 = (ftime) */ no_sys, /* 36 = sync */ do_kill, /* 37 = kill */ no_sys, /* 38 = rename */ no_sys, /* 39 = mkdir */ no_sys, /* 40 = rmdir */ no_sys, /* 41 = dup */ no_sys, /* 42 = pipe */ no_sys, /* 43 = times */ no_sys, /* 44 = (prof) */ no_sys, /* 45 = unused */ do_getset, /* 46 = setgid */ do_getset, /* 47 = getgid */ no_sys, /* 48 = (signal)*/ no_sys, /* 49 = unused */ no_sys, /* 50 = unused */ no_sys, /* 51 = (acct) */ no_sys, /* 52 = (phys) */ no_sys, /* 53 = (lock) */ no_sys, /* 54 = ioctl */ no_sys, /* 55 = fcntl */ no_sys, /* 56 = (mpx) */ no_sys, /* 57 = unused */ no_sys, /* 58 = unused */ do_exec, /* 59 = execve */ no_sys, /* 60 = umask */ no_sys, /* 61 = chroot */ do_getset, /* 62 = setsid */ do_getset, /* 63 = getpgrp */ do_ksig, /* 64 = KSIG: signals originating in the kernel */ no_sys, /* 65 = UNPAUSE */ no_sys, /* 66 = unused */ no_sys, /* 67 = REVIVE */ no_sys, /* 68 = TASK_REPLY */ no_sys, /* 69 = unused */ no_sys, /* 70 = unused */ do_sigaction, /* 71 = sigaction */ do_sigsuspend, /* 72 = sigsuspend */ do_sigpending, /* 73 = sigpending */ do_sigprocmask, /* 74 = sigprocmask */ do_sigreturn, /* 75 = sigreturn */ do_reboot, /* 76 = reboot */ do_svrctl, /* 77 = svrctl */ }; /* This should not fail with "array size is negative": */ extern int dummy[sizeof(call_vec) == NCALLS * sizeof(call_vec[0]) ? 1 : -1]; /* This file handles the memory manager's part of debugging, using the * ptrace system call. Most of the commands are passed on to the system * task for completion. * * The debugging commands available are: * T_STOP stop the process * T_OK enable tracing by parent for this process * T_GETINS return value from instruction space * T_GETDATA return value from data space * T_GETUSER return value from user process table * T_SETINS set value in instruction space * T_SETDATA set value in data space * T_SETUSER set value in user process table * T_RESUME resume execution * T_EXIT exit * T_STEP set trace bit * * The T_OK and T_EXIT commands are handled here, and the T_RESUME and * T_STEP commands are partially handled here and completed by the system * task. The rest are handled entirely by the system task. */ #include "mm.h" #include #include #include "mproc.h" #include "param.h" #define NIL_MPROC ((struct mproc *) 0) FORWARD _PROTOTYPE( struct mproc *findproc, (pid_t lpid) ); /*===========================================================================* * do_trace * *===========================================================================*/ PUBLIC int do_trace() { register struct mproc *child; /* the T_OK call is made by the child fork of the debugger before it execs * the process to be traced */ if (request == T_OK) {/* enable tracing by parent for this process */ mp->mp_flags |= TRACED; mp->mp_reply.m2_l2 = 0; return(OK); } if ((child = findproc(pid)) == NIL_MPROC || !(child->mp_flags & STOPPED)) { return(ESRCH); } /* all the other calls are made by the parent fork of the debugger to * control execution of the child */ switch (request) { case T_EXIT: /* exit */ mm_exit(child, (int)data); mp->mp_reply.m2_l2 = 0; return(OK); case T_RESUME: case T_STEP: /* resume execution */ if (data < 0 || data > _NSIG) return(EIO); if (data > 0) { /* issue signal */ child->mp_flags &= ~TRACED; /* so signal is not diverted */ sig_proc(child, (int) data); child->mp_flags |= TRACED; } child->mp_flags &= ~STOPPED; break; } if (sys_trace(request, (int) (child - mproc), taddr, &data) != OK) return(-errno); mp->mp_reply.m2_l2 = data; return(OK); } /*===========================================================================* * findproc * *===========================================================================*/ PRIVATE struct mproc *findproc(lpid) pid_t lpid; { register struct mproc *rmp; for (rmp = &mproc[INIT_PROC_NR + 1]; rmp < &mproc[NR_PROCS]; rmp++) if (rmp->mp_flags & IN_USE && rmp->mp_pid == lpid) return(rmp); return(NIL_MPROC); } /*===========================================================================* * stop_proc * *===========================================================================*/ PUBLIC void stop_proc(rmp, signo) register struct mproc *rmp; int signo; { /* A traced process got a signal so stop it. */ register struct mproc *rpmp = mproc + rmp->mp_parent; if (sys_trace(-1, (int) (rmp - mproc), 0L, (long *) 0) != OK) return; rmp->mp_flags |= STOPPED; if (rpmp->mp_flags & WAITING) { rpmp->mp_flags &= ~WAITING; /* parent is no longer waiting */ rpmp->reply_res2 = 0177 | (signo << 8); setreply(rmp->mp_parent, rmp->mp_pid); } else { rmp->mp_sigstatus = signo; } return; } /* If there were any type definitions local to the Memory Manager, they would * be here. This file is included only for symmetry with the kernel and File * System, which do have some local type definitions. */ /* This file contains some utility routines for MM. * * The entry points are: * allowed: see if an access is permitted * no_sys: this routine is called for invalid system call numbers * panic: MM has run aground of a fatal error and cannot continue * tell_fs: interface to FS */ #include "mm.h" #include #include #include #include #include /* needed only because mproc.h needs it */ #include "mproc.h" /*===========================================================================* * allowed * *===========================================================================*/ PUBLIC int allowed(name_buf, s_buf, mask) char *name_buf; /* pointer to file name to be EXECed */ struct stat *s_buf; /* buffer for doing and returning stat struct*/ int mask; /* R_BIT, W_BIT, or X_BIT */ { /* Check to see if file can be accessed. Return EACCES or ENOENT if the access * is prohibited. If it is legal open the file and return a file descriptor. */ int fd; int save_errno; /* Use the fact that mask for access() is the same as the permissions mask. * E.g., X_BIT in is the same as X_OK in and * S_IXOTH in . tell_fs(DO_CHDIR, ...) has set MM's real ids * to the user's effective ids, so access() works right for setuid programs. */ if (access(name_buf, mask) < 0) return(-errno); /* The file is accessible but might not be readable. Make it readable. */ tell_fs(SETUID, MM_PROC_NR, (int) SUPER_USER, (int) SUPER_USER); /* Open the file and fstat it. Restore the ids early to handle errors. */ fd = open(name_buf, O_RDONLY | O_NONBLOCK); save_errno = errno; /* open might fail, e.g. from ENFILE */ tell_fs(SETUID, MM_PROC_NR, (int) mp->mp_effuid, (int) mp->mp_effuid); if (fd < 0) return(-save_errno); if (fstat(fd, s_buf) < 0) panic("allowed: fstat failed", NO_NUM); /* Only regular files can be executed. */ if (mask == X_BIT && (s_buf->st_mode & I_TYPE) != I_REGULAR) { close(fd); return(EACCES); } return(fd); } /*===========================================================================* * no_sys * *===========================================================================*/ PUBLIC int no_sys() { /* A system call number not implemented by MM has been requested. */ return(EINVAL); } /*===========================================================================* * panic * *===========================================================================*/ PUBLIC void panic(format, num) char *format; /* format string */ int num; /* number to go with format string */ { /* Something awful has happened. Panics are caused when an internal * inconsistency is detected, e.g., a programming error or illegal value of a * defined constant. */ printf("Memory manager panic: %s ", format); if (num != NO_NUM) printf("%d",num); printf("\n"); tell_fs(SYNC, 0, 0, 0); /* flush the cache to the disk */ sys_abort(RBT_PANIC); } /*===========================================================================* * tell_fs * *===========================================================================*/ PUBLIC void tell_fs(what, p1, p2, p3) int what, p1, p2, p3; { /* This routine is only used by MM to inform FS of certain events: * tell_fs(CHDIR, slot, dir, 0) * tell_fs(EXEC, proc, 0, 0) * tell_fs(EXIT, proc, 0, 0) * tell_fs(FORK, parent, child, pid) * tell_fs(SETGID, proc, realgid, effgid) * tell_fs(SETSID, proc, 0, 0) * tell_fs(SETUID, proc, realuid, effuid) * tell_fs(SYNC, 0, 0, 0) * tell_fs(UNPAUSE, proc, signr, 0) */ message m; m.m1_i1 = p1; m.m1_i2 = p2; m.m1_i3 = p3; _taskcall(FS_PROC_NR, what, &m); } /* Miscellaneous system calls. Author: Kees J. Bot * 31 Mar 2000 * * The entry points into this file are: * do_reboot: kill all processes, then reboot system * do_svrctl: memory manager control */ #include "mm.h" #include #include #include #include "mproc.h" #include "param.h" /*=====================================================================* * do_reboot * *=====================================================================*/ PUBLIC int do_reboot() { register struct mproc *rmp = mp; char monitor_code[32*sizeof(char *)]; if (rmp->mp_effuid != SUPER_USER) return(EPERM); switch (reboot_flag) { case RBT_HALT: case RBT_REBOOT: case RBT_PANIC: case RBT_RESET: break; case RBT_MONITOR: if (reboot_size >= sizeof(monitor_code)) return(EINVAL); if (sys_copy(who, D, (phys_bytes) reboot_code, MM_PROC_NR, D, (phys_bytes) monitor_code, (phys_bytes) (reboot_size+1)) != OK) return(EFAULT); if (monitor_code[reboot_size] != 0) return(EINVAL); break; default: return(EINVAL); } /* Kill all processes except init. */ check_sig(-1, SIGKILL); tell_fs(EXIT, INIT_PROC_NR, 0, 0); /* cleanup init */ tell_fs(EXIT, MM_PROC_NR, 0, 0); /* cleanup for myself */ tell_fs(SYNC,0,0,0); sys_abort(reboot_flag, MM_PROC_NR, monitor_code, reboot_size); /* NOTREACHED */ } /*=====================================================================* * do_svrctl * *=====================================================================*/ PUBLIC int do_svrctl() { int req; vir_bytes ptr; req = svrctl_req; ptr = (vir_bytes) svrctl_argp; /* Is the request for the kernel? */ if (((req >> 8) & 0xFF) == 'S') { return(sys_sysctl(who, req, mp->mp_effuid == SUPER_USER, ptr)); } switch(req) { case MMSIGNON: { /* A user process becomes a task. Simulate an exit by * releasing a waiting parent and disinheriting children. */ struct mproc *rmp; pid_t pidarg; if (mp->mp_effuid != SUPER_USER) return(EPERM); rmp = &mproc[mp->mp_parent]; tell_fs(EXIT, who, 0, 0); pidarg = rmp->mp_wpid; if ((rmp->mp_flags & WAITING) && (pidarg == -1 || pidarg == mp->mp_pid || -pidarg == mp->mp_procgrp)) { /* Wake up the parent. */ rmp->reply_res2 = 0; setreply(mp->mp_parent, mp->mp_pid); rmp->mp_flags &= ~WAITING; } /* Disinherit children. */ for (rmp = &mproc[0]; rmp < &mproc[NR_PROCS]; rmp++) { if (rmp->mp_flags & IN_USE && rmp->mp_parent == who) { rmp->mp_parent = INIT_PROC_NR; } } /* Become like MM and FS. */ mp->mp_pid = mp->mp_procgrp = 0; mp->mp_parent = 0; return(OK); } case MMSWAPON: { struct mmswapon swapon; if (mp->mp_effuid != SUPER_USER) return(EPERM); if (sys_copy(who, D, (phys_bytes) ptr, MM_PROC_NR, D, (phys_bytes) &swapon, (phys_bytes) sizeof(swapon)) != OK) return(EFAULT); return(swap_on(swapon.file, swapon.offset, swapon.size)); } case MMSWAPOFF: { if (mp->mp_effuid != SUPER_USER) return(EPERM); return(swap_off()); } default: return(EINVAL); } } ... Makefile common.crunsh1sh2t10a.ct11a.ct11b.ctest1.ctest10.ctest11.ctest12.ctest13.ctest14.ctest15.ctest16.ctest17.ctest18.ctest19.ctest2.c test20.c!test21.c"test22.c#test23.c$test24.c%test25.c&test26.c'test27.c(test28.c)test29.c*test3.c+test30.c,test31.c-test32.c.test33.c/test34.c0test35.c1test36.c2test37.c3test38.c4test39.c5test4.c6test40.c7test5.c8test6.c9test7.c:test8.c;test9.c# Makefile for the tests. CC = exec cc CFLAGS= -O -D_MINIX -D_POSIX_SOURCE OBJ= test1 test2 test3 test4 test5 test6 test7 test8 test9 \ test10 test12 test13 test14 test15 test16 test17 test18 test19 \ test21 test22 test23 test25 test26 test27 test28 test29 \ test30 test31 test32 test34 test35 test36 test37 test38 test39 \ test40 t10a t11a t11b BIGOBJ= test20 test24 ROOTOBJ= test11 test33 all: $(OBJ) $(BIGOBJ) $(ROOTOBJ) $(OBJ): $(CC) $(CFLAGS) -o $@ $@.c install -S 10kw $@ $(BIGOBJ): $(CC) $(CFLAGS) -o $@ $@.c install -S 32kw $@ $(ROOTOBJ): $(CC) $(CFLAGS) $@.c install -c -S 10kw -o root -m 4755 a.out $@ rm a.out clean: @rm -f *.o *.s *.bak test? test?? t10a t11a t11b DIR* test1: test1.c test2: test2.c test3: test3.c test4: test4.c test5: test5.c test6: test6.c test7: test7.c test8: test8.c test9: test9.c test10: test10.c t10a: t10a.c test11: test11.c t11a: t11a.c t11b: t11b.c test12: test12.c test13: test13.c test14: test14.c test15: test15.c test16: test16.c test17: test17.c test18: test18.c test19: test19.c test20: test20.c test21: test21.c test22: test22.c test23: test23.c test24: test24.c test25: test25.c test26: test26.c test27: test27.c test28: test28.c test29: test29.c test30: test30.c test31: test31.c test32: test32.c test33: test33.c test34: test34.c test35: test35.c test36: test36.c test37: test37.c test38: test38.c test39: test39.c test40: test40.c /* Utility routines for Minix tests. * This is designed to be #includ'ed near the top of test programs. It is * self-contained except for MAX_ERRORS. */ #include #include #include #include #include int common_test_nr = -1, errct = 0, subtest; _PROTOTYPE(void cleanup, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void rm_rf_dir, (int test_nr)); _PROTOTYPE(void rm_rf_ppdir, (int test_nr)); _PROTOTYPE(void start, (int test_nr)); void start(test_nr) int test_nr; { char buf[64]; common_test_nr = test_nr; printf("Test %2d ", test_nr); fflush(stdout); /* since stdout is probably line buffered */ sync(); rm_rf_dir(test_nr); sprintf(buf, "mkdir DIR_%02d", test_nr); if (system(buf) != 0) { e(666); quit(); } sprintf(buf, "DIR_%02d", test_nr); if (chdir(buf) != 0) { e(6666); quit(); } } void rm_rf_dir(test_nr) int test_nr; { char buf[128]; /* "rm -rf dir" will not work unless all the subdirectories have suitable * permissions. Minix chmod is not recursive so it is not easy to change * all the permissions. I had to fix opendir() to stop the bash shell * from hanging when it opendir()s fifos. */ sprintf(buf, "chmod 777 DIR_%02d DIR_%02d/* DIR_%02d/*/* >/dev/null 2>&1", test_nr, test_nr, test_nr); (void) system(buf); /* usually fails */ sprintf(buf, "rm -rf DIR_%02d >/dev/null 2>&1", test_nr); if (system(buf) != 0) printf("Warning: system(\"%s\") failed\n", buf); } void rm_rf_ppdir(test_nr) int test_nr; { /* Attempt to remove everything in the test directory (== the current dir). */ char buf[128]; sprintf(buf, "chmod 777 ../DIR_%02d/* ../DIR_%02d/*/* >/dev/null 2>&1", test_nr, test_nr); (void) system(buf); sprintf(buf, "rm -rf ../DIR_%02d >/dev/null 2>&1", test_nr); if (system(buf) != 0) printf("Warning: system(\"%s\") failed\n", buf); } void e(n) int n; { if (errct == 0) printf("\n"); /* finish header */ printf("Subtest %d, error %d, errno %d: %s\n", subtest, n, errno, strerror(errno)); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); cleanup(); exit(1); } errno = 0; /* don't leave it around to confuse next e() */ } void cleanup() { if (chdir("..") == 0 && common_test_nr != -1) rm_rf_dir(common_test_nr); } void quit() { cleanup(); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } #!/bin/sh # Initialization PATH=:/bin:/usr/bin export PATH rm -rf DIR* # remove any old junk lying around passed=`expr 0` # count number of tests run correctly failed=`expr 0` # count number of tests that failed total=`expr 0` # total number of tests tried badones= # list of tests that failed # Run all the tests, keeping track of who failed. clr for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \ 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 do total=`expr $total + 1` if test$i then passed=`expr $passed + 1` else failed=`expr $failed + 1` badones=`echo $badones " " $i` fi done # Print results of the tests. echo " " if test $total = $passed then echo All $passed tests completed without error. else echo Testing completed. Score: $passed passed, $failed failed echo The following tests failed: $badones fi echo " " sh1 sh2 #!/bin/sh # Shell script used to test MINIX. PATH=:/bin:/usr/bin export PATH echo -n "Shell test 1 " rm -rf DIR_SH1 mkdir DIR_SH1 cd DIR_SH1 f=../test1.c if test -r $f; then : ; else echo sh1 cannot read $f; exit 1; fi #Initial setup echo "abcdefghijklmnopqrstuvwxyz" >alpha echo "ABCDEFGHIJKLMNOPQRSTUVWXYZ" >ALPHA echo "0123456789" >num echo "!@#$%^&*()_+=-{}[]:;<>?/.," >special cp /etc/rc rc cp /etc/passwd passwd cat alpha ALPHA num rc passwd special >tmp cat tmp tmp tmp >f1 #Test cp mkdir foo cp /etc/rc /etc/passwd foo if cmp -s foo/rc /etc/rc ; then : ; else echo Error on cp test 1; fi if cmp -s foo/passwd /etc/passwd ; then : ; else echo Error on cp test 2; fi rm -rf foo #Test cat cat num num num num num >y wc -c y >x1 echo " 55 y" >x2 if cmp -s x1 x2; then : ; else echo Error on cat test 1; fi cat z if cmp -s y z; then : ; else echo Error on cat test 2; fi #Test ar cat passwd >p cp passwd q if cmp -s p q; then : ; else echo Error on ar test 1; fi date >r ar r x.a p q r 2>/dev/null ar r x.a /usr/bin/cp ar r x.a /usr/bin/cat rm p q mv r R ar x x.a if cmp -s p /etc/passwd; then : ; else Error on ar test 2; fi if cmp -s q /etc/passwd; then : ; else Error on ar test 3; fi if cmp -s r R; then : ; else Error on ar test 4; fi if cmp -s cp /usr/bin/cp; then : ; else Error on ar test 5; fi if cmp -s cat /usr/bin/cat; then : ; else Error on ar test 6; fi rm cp cat p q r ar d x.a r >/dev/null ar x x.a if test -r r; then echo Error on ar test 7; fi rm -rf p q r R #Test basename if test `basename /usr/ast/foo.c .c` != 'foo' then echo Error on basename test 1 fi if test `basename a/b/c/d` != 'd'; then Error on basename test 2; fi #Test cdiff, sed, and patch cp $f x.c # x.c is a copy $f echo "/a/s//#####/g" >s # create sed script sed -f s y.c # y.c is new version of x.c cdiff x.c y.c >y # y is cdiff listing patch x.c y 2>/dev/null # z should be y.c if cmp -s x.c y.c; then : ; else echo Error in cdiff test; fi rm x.c* y.c s y #Test comm, grep -v ls /etc >x # x = list of /etc grep -v "passwd" x >y # y = x except for /etc/passwd comm -3 x y >z # should only be 1 line, /etc/passwd echo "passwd" >w if cmp -s w z; then : else echo Error on comm test 1; fi comm -13 x y >z # should be empty if test -s z; then echo Error on comm test 2; fi rm -rf w x y z #Test compress compress -fc $f >x.c.Z # compress the test file compress -cd x.c.Z >y # uncompress it if cmp -s $f y; then : else echo Error in compress test 1; fi rm -rf x.c.Z y #Test ed cp $f x # copy $f to x cat >y </dev/null cat >y </dev/null if cmp -s x $f; then : ; else echo Error in ed test 1; fi rm x y #Test expr if test `expr 1 + 1` != 2; then echo Error on expr test 1; fi if test `expr 10000 - 1` != 9999; then echo Error on expr test 2; fi if test `expr 100 '*' 50` != 5000; then echo Error on expr test 3; fi if test `expr 120 / 5` != 24; then echo Error on expr test 4; fi if test `expr 143 % 7` != 3; then echo Error on expr test 5; fi a=100 a=`expr $a + 1` if test $a != '101'; then echo Error on expr test 6; fi #Test fgrep fgrep "abc" alpha >z if cmp -s alpha z ; then : else echo Error on fgrep test 1; fi fgrep "abc" num >z if test -s z; then echo Error on fgrep test 2; fi cat alpha num >z fgrep "012" z >w if cmp -s w num; then : ; else echo Error fgrep test 3; fi #Test find date >Rabbit echo "Rabbit" >y find . -name Rabbit -print >z if cmp -s y z; then : else echo Error on find test 1; fi find . -name Bunny -print >z if test -s z; then echo Error on find test 2; fi rm Rabbit y z #Test grep grep "a" alpha >x if cmp -s x alpha; then : ; else echo Error on grep test 1; fi grep "a" ALPHA >x if test -s x; then echo Error on grep test 2; fi grep -v "0" alpha >x if cmp -s x alpha; then : ; else echo Error on grep test 3; fi grep -s "a" alpha >x if test -s x; then echo Error on grep test 4; fi if grep -s "a" alpha >x; then : else echo Error on grep test 5; fi if grep -s "a" ALPHA >x; then echo Error on grep test 6; fi #Test head head -1 f1 >x if cmp -s x alpha; then : else echo Error on head test 1; fi head -2 f1 >x cat alpha ALPHA >y if cmp -s x y; then : else echo Error on head test 2; fi #Test ls mkdir FOO cp passwd FOO/z cp alpha FOO/x cp ALPHA FOO/y cd FOO ls >w cat >w1 <x1 rm w x y z sh /dev/null if cmp -s w $f; then : ; else echo Error on shar test 1; fi if cmp -s x alpha; then : ; else echo Error on shar test 2; fi if cmp -s y ALPHA; then : ; else echo Error on shar test 3; fi if cmp -s z num; then : ; else echo Error on shar test 4; fi #Test sort sort <$f >x wc <$f >x1 wc x2 if cmp -s x1 x2; then : ; else echo Error on sort test 1; fi cat >x <y <z <x1 if cmp -s y x1; then : ; else echo Error on sort test 2; fi sort -r x2 if cmp -s x2 z; then : ; else echo Error on sort test 3; fi sort +1 -n y echo "bibelot 3" >z if cmp -s y z; then : ; else echo Error on sort test 4; fi #Test tail tail -1 f1 >x if cmp -s x special; then : ; else echo Error on tail test 1; fi #Test tsort cat >x <answer <y if cmp -s y answer; then : ; else echo Error on tsort test 1; fi #Test uue/uud cp $f x uue x if test -s x.uue; then : ; else echo Error on uue/uud test 1; fi rm x uud x.uue if cmp -s x $f; then : ; else echo Error on uue/uud test 2; fi compress -fc x >x.Z 2>/dev/null uue x.Z rm x x.Z uud x.uue compress -cd x.Z >x if cmp -s x $f; then : ; else echo Error on uue/uud test 3; fi cd .. rm -rf DIR_SH1 echo ok #!/bin/sh # Shell script #2 used to test MINIX. PATH=:/bin:/usr/bin export PATH # CC="exec cc -wo -F" # nonstandard flags for ACK :-( CC=cc ARCH=`arch` echo -n "Shell test 2 " rm -rf DIR_SH2 mkdir DIR_SH2 # all files are created here cd DIR_SH2 cat >file <makefile </dev/null 2>&1 END cat >x.c < char s[] = {"MS-DOS: Just say no"}; /* used by strings later */ main() { int i; for (i = 15; i < 18; i++) printf("%d\\n",i*i); } END cat >answer <x if test -f x; then : ; else echo No compiler output; fi if cmp -s x answer; then : ; else echo Error in cc test 1; fi #Test chmod echo Hi there folks >x if test -r x; then : ; else echo Error on chmod test 1; fi chmod 377 x if test -r x; then test -w / || echo Error on chmod test 2; fi chmod 700 x if test -r x; then : ; else echo Error on chmod test 3; fi #Test cut cat >x <answer <y # extract columns 3-7 if cmp -s y answer; then : ; else echo Error in cut test 1; fi #Test dd dd if=$f of=x bs=12 count=1 2>/dev/null # x = bytes 0-11 dd if=$f of=y bs=6 count=4 skip=2 2>/dev/null # y = bytes 11-35 cat x y >z # z = bytes 0-35 dd if=$f of=answer bs=9 count=4 2>/dev/null # answer = bytes 0-35 if cmp -s z answer; then : ; else echo Error in dd test 1; fi #Test df # hard to make a sensible Test here rm ? df >x if test -r x; then : ; else echo Error in df Test 1; fi #Test du # see df rm ? du >x if test -r x; then : ; else echo Error in du Test 1; fi #Test od head -1 $f |od >x # see if od converts ascii to octal ok if [ $ARCH = i86 -o $ARCH = i386 ] then cat >answer <answer <x # see if od converts ascii to decimal ok if [ $ARCH = i86 -o $ARCH = i386 ] then cat >answer <answer <x <y <answer <z if cmp -s z answer; then : ; else echo Error in paste test 1; fi #Test prep echo >x <answer <x if grep HOME x >/dev/null; then : ; else echo Error in env test 1; fi if grep PATH x >/dev/null; then : ; else echo Error in env test 2; fi if grep SHELL x >/dev/null; then : ; else echo Error in env test 3; fi if grep USER x >/dev/null; then : ; else echo Error in env test 4; fi #Test pwd pwd >Pwd_file cd `pwd` pwd >x if test -s Pwd_file; then : ; else echo Error in pwd test 1; fi if cmp -s Pwd_file x; then : ; else echo Error in pwd test 2; fi #Test strings strings a.out | grep "MS-DOS" >x cat >answer <x cat >answer </dev/null if cmp -s x $f; then : ; else echo Error in tee test 1; fi #Test true if true ; then : ; else echo Error in true test 1; fi #Test uniq cat >x <answer <y if cmp -s y answer; then : ; else echo Error in uniq test 1; fi #Test pipelines cat >x <answer <y if cmp -s y answer; then : ; else echo Error in pipeline test 1; fi cat $f $f $f | sort | uniq >x sort <$f >y if cmp -s x y; then : ; else echo Error in pipeline test 2; fi cd .. rm -rf DIR_SH2 echo ok #include _PROTOTYPE(int main, (void)); int main() { exit(0); } /* t11a */ #include #include #include #include #include #include #define MAX_ERROR 4 int errct, subtest=1; _PROTOTYPE(int main, (int argc, char *argv [], char *envp [])); _PROTOTYPE(int diff, (char *s1, char *s2)); _PROTOTYPE(void e, (int n)); int main(argc, argv, envp) int argc; char *argv[], *envp[]; { /* See if arguments passed ok. */ char aa[4]; if (diff(argv[0], "t11a")) e(21); if (diff(argv[1], "arg0")) e(22); if (diff(argv[2], "arg1")) e(23); if (diff(argv[3], "arg2")) e(24); if (diff(envp[0], "spring")) e(25); if (diff(envp[1], "summer")) e(26); if (argc != 4) e(27); /* Now see if the files are ok. */ if (read(3, aa, 4) != 2) e(28); if (aa[0] != 7 || aa[1] != 9) e(29); if (getuid() == 10) e(30); if (geteuid() != 10) e(31); if (getgid() == 20) e(32); if (getegid() != 20) e(33); if (open("t1", 0) < 0) e(34); if (open("t2", 0) < 0) e(35); exit(100); } int diff(s1, s2) char *s1, *s2; { while (1) { if (*s1 == 0 && *s2 == 0) return(0); if (*s1 != *s2) return (1); s1++; s2++; } } void e(n) int n; { printf("Subtest %d, error %d errno=%d ", subtest, n, errno); perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } /* t11b */ #include #include #include #include #include #define MAX_ERROR 4 int errct, subtest=1; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(int diff, (char *s1, char *s2)); _PROTOTYPE(void e, (int n)); int main(argc, argv) int argc; char *argv[]; { /* See if arguments passed ok. */ if (diff(argv[0], "t11b")) e(31); if (diff(argv[1], "abc")) e(32); if (diff(argv[2], "defghi")) e(33); if (diff(argv[3], "j")) e(34); if (argv[4] != 0) e(35); if (argc != 4) e(36); exit(75); } int diff(s1, s2) char *s1, *s2; { while (1) { if (*s1 == 0 && *s2 == 0) return(0); if (*s1 != *s2) return (1); s1++; s2++; } } void e(n) int n; { printf("Subtest %d, error %d errno=%d ", subtest, n, errno); perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } /* test 1 */ #include #include #include #include #include #include #include #define SIGNUM 10 #define MAX_ERROR 4 #define ITERATIONS 10 _VOLATILE int glov, gct; int errct; int subtest; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test1a, (void)); _PROTOTYPE(void parent, (void)); _PROTOTYPE(void child, (int i)); _PROTOTYPE(void test1b, (void)); _PROTOTYPE(void parent1, (int childpid)); _PROTOTYPE(void func, (int s)); _PROTOTYPE(void child1, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 1 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_01; mkdir DIR_01"); chdir("DIR_01"); for (i = 0; i < ITERATIONS; i++) { if (m & 00001) test1a(); if (m & 00002) test1b(); } quit(); return(-1); /* impossible */ } void test1a() { int i, n, pid; subtest = 1; n = 4; for (i = 0; i < n; i++) { if ((pid = fork())) { if (pid < 0) { printf("\nTest 1 fork failed\n"); exit(1); } parent(); } else child(i); } } void parent() { int n; n = getpid(); wait(&n); } void child(i) int i; { int n; n = getpid(); exit(100+i); } void test1b() { int i, k; subtest = 2; for (i = 0; i < 4; i++) { glov = 0; signal(SIGNUM, func); if ((k = fork())) { if (k < 0) { printf("Test 1 fork failed\n"); exit(1); } parent1(k); } else child1(); } } void parent1(childpid) int childpid; { int n; for (n = 0; n < 5000; n++); while (kill(childpid, SIGNUM) < 0) /* null statement */ ; wait(&n); } void func(s) int s; /* for ANSI */ { glov++; gct++; } void child1() { while (glov == 0); exit(gct); } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 10 */ #include #include #include #include #include #include #include char *name[] = {"t10a", "t10b", "t10c", "t10d", "t10e", "t10f", "t10g", "t10h", "t10i", "t10j"}; int errct; long prog[300]; int psize; _PROTOTYPE(int main, (void)); _PROTOTYPE(void spawn, (int n)); _PROTOTYPE(void mkfiles, (void)); _PROTOTYPE(void cr_file, (char *name, int size)); _PROTOTYPE(void rmfiles, (void)); _PROTOTYPE(void quit, (void)); int main() { int i, n, pid, r; printf("Test 10 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_10; mkdir DIR_10; cp t10a DIR_10"); chdir("DIR_10"); pid = getpid(); /* Create files t10b ... t10h */ mkfiles(); if (getpid() == pid) if (fork() == 0) { execl("t10a", (char *) 0); exit(0); } if (getpid() == pid) if (fork() == 0) { execl("t10b", (char *) 0); exit(0); } if (getpid() == pid) if (fork() == 0) { execl("t10c", (char *) 0); exit(0); } if (getpid() == pid) if (fork() == 0) { execl("t10d", (char *) 0); exit(0); } srand(100); for (i = 0; i < 60; i++) { r = rand() & 07; spawn(r); } for (i = 0; i < 4; i++) wait(&n); rmfiles(); quit(); return(-1); /* impossible */ } void spawn(n) int n; { int pid, k; if (pid = fork()) { wait(&n); /* wait for some child (any one) */ } else { k = execl(name[n], (char *) 0); errct++; printf("Child execl didn't take. file=%s errno=%d\n", name[n], errno); rmfiles(); exit(1); printf("Worse yet, EXIT didn't exit\n"); } } void mkfiles() { int fd; fd = open("t10a", 0); if (fd < 0) { printf("Can't open t10a\n"); exit(1); } psize = read(fd, (char *) prog, 300 * 4); cr_file("t10b", 1600); cr_file("t10c", 1400); cr_file("t10d", 2300); cr_file("t10e", 3100); cr_file("t10f", 2400); cr_file("t10g", 1700); cr_file("t10h", 1500); cr_file("t10i", 4000); cr_file("t10j", 2250); close(fd); } void cr_file(name, size) char *name; int size; { int fd; #if (CHIP == SPARC) size += 4000; #endif prog[6] = (long) size; fd = creat(name, 0755); write(fd, (char *) prog, psize); close(fd); } void rmfiles() { unlink("t10b"); unlink("t10c"); unlink("t10d"); unlink("t10e"); unlink("t10f"); unlink("t10g"); unlink("t10h"); unlink("t10i"); unlink("t10j"); } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 11 */ #include #include #include #include #include #include #include #include #include #define ITERATIONS 10 #define MAX_ERROR 1 int errct, subtest; char *envp[3] = {"spring", "summer", 0}; char *passwd_file = "/etc/passwd"; _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(void test11a, (void)); _PROTOTYPE(void test11b, (void)); _PROTOTYPE(void test11c, (void)); _PROTOTYPE(void test11d, (void)); _PROTOTYPE(void e, (int n)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; if (argc == 2) m = atoi(argv[1]); printf("Test 11 "); fflush(stdout); /* have to flush for child's benefit */ if (geteuid() != 0) { printf("must be setuid root; test aborted\n"); exit(1); } if (getuid() == 0) { printf("must be setuid root logged in as someone else; test aborted\n"); exit(1); } /* system("rm -rf DIR_11; mkdir DIR_11"); chdir("DIR_11"); */ for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test11a(); if (m & 0002) test11b(); if (m & 0004) test11c(); if (m & 0010) test11d(); } if (errct == 0) printf("ok\n"); else printf(" %d errors\n", errct); /* chdir(".."); system("rm -rf DIR_11"); */ return(0); } void test11a() { /* Test exec */ int n, fd; char aa[4]; subtest = 1; if (fork()) { wait(&n); if (n != 25600) e(1); unlink("t1"); unlink("t2"); } else { if (chown("t11a", 10, 20) < 0) e(2); chmod("t11a", 0666); /* The following call should fail because the mode has no X * bits on. If a bug lets it unexpectedly succeed, the child * will print an error message since the arguments are wrong. */ execl("t11a", (char *) 0, envp); /* should fail -- no X bits */ /* Control should come here after the failed execl(). */ chmod("t11a", 06555); if ((fd = creat("t1", 0600)) != 3) e(3); if (close(fd) < 0) e(4); if (open("t1", O_RDWR) != 3) e(5); if (chown("t1", 10, 99) < 0) e(6); if ((fd = creat("t2", 0060)) != 4) e(7); if (close(fd) < 0) e(8); if (open("t2", O_RDWR) != 4) e(9); if (chown("t2", 99, 20) < 0) e(10); if (setgid(6) < 0) e(11); if (setuid(5) < 0) e(12); if (getuid() != 5) e(13); if (geteuid() != 5) e(14); if (getgid() != 6) e(15); if (getegid() != 6) e(16); aa[0] = 3; aa[1] = 5; aa[2] = 7; aa[3] = 9; if (write(3, aa, 4) != 4) e(17); lseek(3, 2L, 0); execle("t11a", "t11a", "arg0", "arg1", "arg2", (char *) 0, envp); e(18); printf("Can't exec t11a\n"); exit(3); } } void test11b() { int n; char *argv[5]; subtest = 2; if (fork()) { wait(&n); if (n != (75 << 8)) e(20); } else { /* Child tests execv. */ argv[0] = "t11b"; argv[1] = "abc"; argv[2] = "defghi"; argv[3] = "j"; argv[4] = 0; execv("t11b", argv); e(19); } } void test11c() { /* Test getlogin() and cuserid(). This test MUST run setuid root. */ int n, etc_uid; uid_t ruid, euid; char *lnamep, *cnamep, *p; char array[L_cuserid], save[L_cuserid], save2[L_cuserid]; FILE *stream; subtest = 3; errno = -2000; /* None of these calls set errno. */ array[0] = '@'; array[1] = '0'; save[0] = '#'; save[1] = '0'; ruid = getuid(); euid = geteuid(); lnamep = getlogin(); strcpy(save, lnamep); cnamep = cuserid(array); strcpy(save2, cnamep); /* Because we are setuid root, cuser == array == 'root'; login != 'root' */ if (euid != 0) e(1); if (ruid == 0) e(2); if (strcmp(cnamep, "root") != 0) e(3); if (strcmp(array, "root") != 0) e(4); if ( (n = strlen(save)) == 0) e(5); if (strcmp(save, cnamep) == 0) e(6); /* they must be different */ cnamep = cuserid(NULL); if (strcmp(cnamep, save2) != 0) e(7); /* Check login against passwd file. First lookup login in /etc/passwd. */ if (n == 0) return; /* if login not found, don't look it up */ if ( (stream = fopen(passwd_file, "r")) == NULL) e(8); while (fgets(array, L_cuserid, stream) != NULL) { if (strncmp(array, save, n) == 0) { p = &array[0]; /* hunt for uid */ while (*p != ':') p++; p++; while (*p != ':') p++; p++; /* p now points to uid */ etc_uid = atoi(p); if (etc_uid != ruid) e(9); break; /* 1 entry per login please */ } } fclose(stream); } void test11d() { int fd; struct stat statbuf; subtest = 4; fd = creat("T11.1", 0750); if (fd < 0) e(1); if (chown("T11.1", 8, 1) != 0) e(2); if (chmod("T11.1", 0666) != 0) e(3); if (stat("T11.1", &statbuf) != 0) e(4); if ((statbuf.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) != 0666) e(5); if (close(fd) != 0) e(6); if (unlink("T11.1") != 0) e(7); } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } /* test 12 */ /* Copyright (C) 1987 by Martin Leisner. All rights reserved. */ /* Used by permission. */ #include #include #include #include #include #define NUM_TIMES 1000 int errct = 0; _PROTOTYPE(int main, (void)); _PROTOTYPE(void quit, (void)); int main() { register int i; int k; printf("Test 12 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_12; mkdir DIR_12"); chdir("DIR_12"); for (i = 0; i < NUM_TIMES; i++) switch (fork()) { case 0: exit(1); break; case -1: printf("fork broke\n"); exit(1); default: wait(&k); break; } quit(); return(-1); /* impossible */ } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 13 */ /* File: pipes.c - created by Marty Leisner */ /* Leisner.Henr 1-Dec-87 8:55:04 */ /* Copyright (C) 1987 by Martin Leisner. All rights reserved. */ /* Used by permission. */ #include #include #include #include #include #define BLOCK_SIZE 1000 #define NUM_BLOCKS 1000 int errct = 0; char buffer[BLOCK_SIZE]; _PROTOTYPE(int main, (void)); _PROTOTYPE(void quit, (void)); int main() { int stat_loc, pipefd[2]; register int i; pipe(pipefd); printf("Test 13 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_13; mkdir DIR_13"); chdir("DIR_13"); pipe(pipefd); switch (fork()) { case 0: /* Child code */ for (i = 0; i < NUM_BLOCKS; i++) if (read(pipefd[0], buffer, BLOCK_SIZE) != BLOCK_SIZE) break; exit(0); case -1: perror("fork broke"); exit(1); default: /* Parent code */ for (i = 0; i < NUM_BLOCKS; i++) write(pipefd[1], buffer, BLOCK_SIZE); wait(&stat_loc); break; } quit(); return(-1); /* impossible */ } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Test 14. unlinking an open file. */ #include #include #include #include #include #include #define TRIALS 100 #define MAX_ERROR 4 char name[20] = {"TMP14."}; int errct; int subtest = 1; _PROTOTYPE(int main, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main() { int fd0, i, pid; printf("Test 14 "); fflush(stdout); system("rm -rf DIR_14; mkdir DIR_14"); chdir("DIR_14"); pid = getpid(); name[6] = (pid & 037) + 33; name[7] = ((pid * pid) & 037) + 33; name[8] = 0; for (i = 0; i < TRIALS; i++) { if ( (fd0 = creat(name, 0777)) < 0) e(1); if (write(fd0, name, 20) != 20) e(2); if (unlink(name) != 0) e(3); if (close(fd0) != 0) e(4); } fd0 = creat(name, 0777); write(fd0, name, 20); unlink(name); quit(); return(-1); /* impossible */ } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Test program for string(3) routines. * * Slightly modified from Henry Spencer's original routine. * - incorporates semantic changes per the ANSI standard (original tests * can be recovered by defining the symbol NOT_ANSI while compiling, * except for the change of memcpy() to memmove()). * - makes additional tests of functions on unaligned buffers and strings. */ #include #include #include #include #include _PROTOTYPE( int chdir, (char *_path)); /* from */ #define STREQ(a, b) (strcmp((a), (b)) == 0) char *it = ""; /* Routine name for message routines. */ int errct; /* count errors */ int waserror = 0; /* For exit status. */ char uctest[] = "\004\203"; /* For testing signedness of chars. */ int charsigned; /* Result. */ _PROTOTYPE(void check, (int thing, int number)); _PROTOTYPE(void equal, (char *a, char *b, int number)); _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void first, (void)); _PROTOTYPE(void second, (void)); _PROTOTYPE(void quit, (void)); /* - check - complain if condition is not true */ void check(thing, number) int thing; int number; /* Test number for error message. */ { if (!thing) { printf("%s flunked test %d\n", it, number); waserror = 1; errct++; } } /* - equal - complain if first two args don't strcmp as equal */ void equal(a, b, number) char *a; char *b; int number; /* Test number for error message. */ { check(a != NULL && b != NULL && STREQ(a, b), number); } char one[50]; char two[50]; #ifdef UNIXERR #define ERR 1 #endif #ifdef BERKERR #define ERR 1 #endif #ifdef ERR int f; extern char *sys_errlist[]; extern int sys_nerr; #endif /* ARGSUSED */ int main(argc, argv) int argc; char *argv[]; { printf("Test 15 "); fflush(stdout); system("rm -rf DIR_15; mkdir DIR_15"); chdir("DIR_15"); /* First, establish whether chars are signed. */ if (uctest[0] < uctest[1]) charsigned = 0; else charsigned = 1; /* Then, do the rest of the work. Split into two functions because * some compilers get unhappy about a single immense function. */ first(); second(); errct = waserror; quit(); return(-1); /* impossible */ } void first() { /* Test strcmp first because we use it to test other things. */ it = "strcmp"; check(strcmp("", "") == 0, 1);/* Trivial case. */ check(strcmp("a", "a") == 0, 2); /* Identity. */ check(strcmp("abc", "abc") == 0, 3); /* Multicharacter. */ check(strcmp("abc", "abcd") < 0, 4); /* Length mismatches. */ check(strcmp("abcd", "abc") > 0, 5); check(strcmp("abcd", "abce") < 0, 6); /* Honest miscompares. */ check(strcmp("abce", "abcd") > 0, 7); check(strcmp("a\203", "a") > 0, 8); /* Tricky if char signed. */ #ifdef NOT_ANSI if (charsigned) check(strcmp("a\203", "a\003") < 0, 9); else check(strcmp("a\203", "a\003") > 0, 9); #else check(strcmp("a\203", "a\003") > 0, 9); #endif check(strcmp("abcd" + 1, "abcd" + 1) == 0, 10); /* Unaligned tests. */ check(strcmp("abcd" + 1, "abce" + 1) < 0, 11); check(strcmp("abcd" + 1, "bcd") == 0, 12); check(strcmp("abce" + 1, "bcd") > 0, 13); check(strcmp("abcd" + 2, "bcd" + 1) == 0, 14); check(strcmp("abcd" + 2, "bce" + 1) < 0, 15); /* Test strcpy next because we need it to set up other tests. */ it = "strcpy"; check(strcpy(one, "abcd") == one, 1); /* Returned value. */ equal(one, "abcd", 2); /* Basic test. */ (void) strcpy(one, "x"); equal(one, "x", 3); /* Writeover. */ equal(one + 2, "cd", 4); /* Wrote too much? */ (void) strcpy(two, "hi there"); (void) strcpy(one, two); equal(one, "hi there", 5); /* Basic test encore. */ equal(two, "hi there", 6); /* Stomped on source? */ (void) strcpy(one, ""); equal(one, "", 7); /* Boundary condition. */ (void) strcpy(one, "abcdef" + 1); /* Unaligned tests. */ equal(one, "bcdef", 8); (void) strcpy(one + 1, "*xy" + 1); equal(one, "bxy", 9); equal(one + 4, "f", 10); /* Strcat */ it = "strcat"; (void) strcpy(one, "ijk"); check(strcat(one, "lmn") == one, 1); /* Returned value. */ equal(one, "ijklmn", 2); /* Basic test. */ (void) strcpy(one, "x"); (void) strcat(one, "yz"); equal(one, "xyz", 3); /* Writeover. */ equal(one + 4, "mn", 4); /* Wrote too much? */ (void) strcpy(one, "gh"); (void) strcpy(two, "ef"); (void) strcat(one, two); equal(one, "ghef", 5); /* Basic test encore. */ equal(two, "ef", 6); /* Stomped on source? */ (void) strcpy(one, ""); (void) strcat(one, ""); equal(one, "", 7); /* Boundary conditions. */ (void) strcpy(one, "ab"); (void) strcat(one, ""); equal(one, "ab", 8); (void) strcpy(one, ""); (void) strcat(one, "cd"); equal(one, "cd", 9); /* Strncat - first test it as strcat, with big counts, then test the * count mechanism. */ it = "strncat"; (void) strcpy(one, "ijk"); check(strncat(one, "lmn", 99) == one, 1); /* Returned value. */ equal(one, "ijklmn", 2); /* Basic test. */ (void) strcpy(one, "x"); (void) strncat(one, "yz", 99); equal(one, "xyz", 3); /* Writeover. */ equal(one + 4, "mn", 4); /* Wrote too much? */ (void) strcpy(one, "gh"); (void) strcpy(two, "ef"); (void) strncat(one, two, 99); equal(one, "ghef", 5); /* Basic test encore. */ equal(two, "ef", 6); /* Stomped on source? */ (void) strcpy(one, ""); (void) strncat(one, "", 99); equal(one, "", 7); /* Boundary conditions. */ (void) strcpy(one, "ab"); (void) strncat(one, "", 99); equal(one, "ab", 8); (void) strcpy(one, ""); (void) strncat(one, "cd", 99); equal(one, "cd", 9); (void) strcpy(one, "ab"); (void) strncat(one, "cdef", 2); equal(one, "abcd", 10); /* Count-limited. */ (void) strncat(one, "gh", 0); equal(one, "abcd", 11); /* Zero count. */ (void) strncat(one, "gh", 2); equal(one, "abcdgh", 12); /* Count and length equal. */ (void) strcpy(one, "abcdefghij"); /* Unaligned tests. */ (void) strcpy(one, "abcd"); (void) strcpy(one, "abc"); (void) strncat(one, "de" + 1, 1); equal(one, "abce", 13); equal(one + 4, "", 14); equal(one + 5, "fghij", 15); /* Strncmp - first test as strcmp with big counts, then test count code. */ it = "strncmp"; check(strncmp("", "", 99) == 0, 1); /* Trivial case. */ check(strncmp("a", "a", 99) == 0, 2); /* Identity. */ check(strncmp("abc", "abc", 99) == 0, 3); /* Multicharacter. */ check(strncmp("abc", "abcd", 99) < 0, 4); /* Length unequal. */ check(strncmp("abcd", "abc", 99) > 0, 5); check(strncmp("abcd", "abce", 99) < 0, 6); /* Honestly unequal. */ check(strncmp("abce", "abcd", 99) > 0, 7); check(strncmp("a\203", "a", 2) > 0, 8); /* Tricky if '\203' < 0 */ #ifdef NOT_ANSI if (charsigned) check(strncmp("a\203", "a\003", 2) < 0, 9); else check(strncmp("a\203", "a\003", 2) > 0, 9); #else check(strncmp("a\203", "a\003", 2) > 0, 9); #endif check(strncmp("abce", "abcd", 3) == 0, 10); /* Count limited. */ check(strncmp("abce", "abc", 3) == 0, 11); /* Count == length. */ check(strncmp("abcd", "abce", 4) < 0, 12); /* Nudging limit. */ check(strncmp("abc", "def", 0) == 0, 13); /* Zero count. */ /* Strncpy - testing is a bit different because of odd semantics */ it = "strncpy"; check(strncpy(one, "abc", 4) == one, 1); /* Returned value. */ equal(one, "abc", 2); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 2); equal(one, "xycdefgh", 3); /* Copy cut by count. */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 3);/* Copy cut just before NUL. */ equal(one, "xyzdefgh", 4); (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 4);/* Copy just includes NUL. */ equal(one, "xyz", 5); equal(one + 4, "efgh", 6); /* Wrote too much? */ (void) strcpy(one, "abcdefgh"); (void) strncpy(one, "xyz", 5);/* Copy includes padding. */ equal(one, "xyz", 7); equal(one + 4, "", 8); equal(one + 5, "fgh", 9); (void) strcpy(one, "abc"); (void) strncpy(one, "xyz", 0);/* Zero-length copy. */ equal(one, "abc", 10); (void) strncpy(one, "", 2); /* Zero-length source. */ equal(one, "", 11); equal(one + 1, "", 12); equal(one + 2, "c", 13)44444444444444444; (void) strcpy(one, "hi there"); (void) strncpy(two, one, 9); equal(two, "hi there", 14); /* Just paranoia. */ equal(one, "hi there", 15); /* Stomped on source? */ /* Strlen */ it = "strlen"; check(strlen("") == 0, 1); /* Empty. */ check(strlen("a") == 1, 2); /* Single char. */ check(strlen("abcd") == 4, 3);/* Multiple chars. */ check(strlen("abcd" + 1) == 3, 4); /* Unaligned test. */ /* Strchr */ it = "strchr"; check(strchr("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(strchr(one, 'c') == one + 2, 2); /* Basic test. */ check(strchr(one, 'd') == one + 3, 3); /* End of string. */ check(strchr(one, 'a') == one, 4); /* Beginning. */ check(strchr(one, '\0') == one + 4, 5); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(strchr(one, 'b') == one + 1, 6); /* Finding first. */ (void) strcpy(one, ""); check(strchr(one, 'b') == NULL, 7); /* Empty string. */ check(strchr(one, '\0') == one, 8); /* NUL in empty string. */ /* Index - just like strchr */ it = "index"; check(index("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(index(one, 'c') == one + 2, 2); /* Basic test. */ check(index(one, 'd') == one + 3, 3); /* End of string. */ check(index(one, 'a') == one, 4); /* Beginning. */ check(index(one, '\0') == one + 4, 5); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(index(one, 'b') == one + 1, 6); /* Finding first. */ (void) strcpy(one, ""); check(index(one, 'b') == NULL, 7); /* Empty string. */ check(index(one, '\0') == one, 8); /* NUL in empty string. */ /* Strrchr */ it = "strrchr"; check(strrchr("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(strrchr(one, 'c') == one + 2, 2); /* Basic test. */ check(strrchr(one, 'd') == one + 3, 3); /* End of string. */ check(strrchr(one, 'a') == one, 4); /* Beginning. */ check(strrchr(one, '\0') == one + 4, 5); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(strrchr(one, 'b') == one + 3, 6); /* Finding last. */ (void) strcpy(one, ""); check(strrchr(one, 'b') == NULL, 7); /* Empty string. */ check(strrchr(one, '\0') == one, 8); /* NUL in empty string. */ /* Rindex - just like strrchr */ it = "rindex"; check(rindex("abcd", 'z') == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(rindex(one, 'c') == one + 2, 2); /* Basic test. */ check(rindex(one, 'd') == one + 3, 3); /* End of string. */ check(rindex(one, 'a') == one, 4); /* Beginning. */ check(rindex(one, '\0') == one + 4, 5); /* Finding NUL. */ (void) strcpy(one, "ababa"); check(rindex(one, 'b') == one + 3, 6); /* Finding last. */ (void) strcpy(one, ""); check(rindex(one, 'b') == NULL, 7); /* Empty string. */ check(rindex(one, '\0') == one, 8); /* NUL in empty string. */ } void second() { /* Strpbrk - somewhat like strchr */ it = "strpbrk"; check(strpbrk("abcd", "z") == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check(strpbrk(one, "c") == one + 2, 2); /* Basic test. */ check(strpbrk(one, "d") == one + 3, 3); /* End of string. */ check(strpbrk(one, "a") == one, 4); /* Beginning. */ check(strpbrk(one, "") == NULL, 5); /* Empty search list. */ check(strpbrk(one, "cb") == one + 1, 6); /* Multiple search. */ (void) strcpy(one, "abcabdea"); check(strpbrk(one, "b") == one + 1, 7); /* Finding first. */ check(strpbrk(one, "cb") == one + 1, 8); /* With multiple search. */ check(strpbrk(one, "db") == one + 1, 9); /* Another variant. */ (void) strcpy(one, ""); check(strpbrk(one, "bc") == NULL, 10); /* Empty string. */ check(strpbrk(one, "") == NULL, 11); /* Both strings empty. */ /* Strstr - somewhat like strchr */ it = "strstr"; check(strstr("abcd", "z") == NULL, 1); /* Not found. */ check(strstr("abcd", "abx") == NULL, 2); /* Dead end. */ (void) strcpy(one, "abcd"); check(strstr(one, "c") == one + 2, 3); /* Basic test. */ check(strstr(one, "bc") == one + 1, 4); /* Multichar. */ check(strstr(one, "d") == one + 3, 5); /* End of string. */ check(strstr(one, "cd") == one + 2, 6); /* Tail of string. */ check(strstr(one, "abc") == one, 7); /* Beginning. */ check(strstr(one, "abcd") == one, 8); /* Exact match. */ check(strstr(one, "abcde") == NULL, 9); /* Too long. */ check(strstr(one, "de") == NULL, 10); /* Past end. */ #ifdef NOT_ANSI check(strstr(one, "") == one + 4, 11); /* Finding empty. */ #else check(strstr(one, "") == one, 11); /* Finding empty. */ #endif (void) strcpy(one, "ababa"); check(strstr(one, "ba") == one + 1, 12); /* Finding first. */ (void) strcpy(one, ""); check(strstr(one, "b") == NULL, 13); /* Empty string. */ check(strstr(one, "") == one, 14); /* Empty in empty string. */ (void) strcpy(one, "bcbca"); check(strstr(one, "bca") == one + 2, 15); /* False start. */ (void) strcpy(one, "bbbcabbca"); check(strstr(one, "bbca") == one + 1, 16); /* With overlap. */ /* Strspn */ it = "strspn"; check(strspn("abcba", "abc") == 5, 1); /* Whole string. */ check(strspn("abcba", "ab") == 2, 2); /* Partial. */ check(strspn("abc", "qx") == 0, 3); /* None. */ check(strspn("", "ab") == 0, 4); /* Null string. */ check(strspn("abc", "") == 0, 5); /* Null search list. */ /* Strcspn */ it = "strcspn"; check(strcspn("abcba", "qx") == 5, 1); /* Whole string. */ check(strcspn("abcba", "cx") == 2, 2); /* Partial. */ check(strcspn("abc", "abc") == 0, 3); /* None. */ check(strcspn("", "ab") == 0, 4); /* Null string. */ check(strcspn("abc", "") == 3, 5); /* Null search list. */ /* Strtok - the hard one */ it = "strtok"; (void) strcpy(one, "first, second, third"); equal(strtok(one, ", "), "first", 1); /* Basic test. */ equal(one, "first", 2); equal(strtok((char *) NULL, ", "), "second", 3); equal(strtok((char *) NULL, ", "), "third", 4); check(strtok((char *) NULL, ", ") == NULL, 5); (void) strcpy(one, ", first, "); equal(strtok(one, ", "), "first", 6); /* Extra delims, 1 tok. */ check(strtok((char *) NULL, ", ") == NULL, 7); (void) strcpy(one, "1a, 1b; 2a, 2b"); equal(strtok(one, ", "), "1a", 8); /* Changing delim lists. */ equal(strtok((char *) NULL, "; "), "1b", 9); equal(strtok((char *) NULL, ", "), "2a", 10); (void) strcpy(two, "x-y"); equal(strtok(two, "-"), "x", 11); /* New string before done. */ equal(strtok((char *) NULL, "-"), "y", 12); check(strtok((char *) NULL, "-") == NULL, 13); (void) strcpy(one, "a,b, c,, ,d"); equal(strtok(one, ", "), "a", 14); /* Different separators. */ equal(strtok((char *) NULL, ", "), "b", 15); equal(strtok((char *) NULL, " ,"), "c", 16); /* Permute list too. */ equal(strtok((char *) NULL, " ,"), "d", 17); check(strtok((char *) NULL, ", ") == NULL, 18); check(strtok((char *) NULL, ", ") == NULL, 19); /* Persistence. */ (void) strcpy(one, ", "); check(strtok(one, ", ") == NULL, 20); /* No tokens. */ (void) strcpy(one, ""); check(strtok(one, ", ") == NULL, 21); /* Empty string. */ (void) strcpy(one, "abc"); equal(strtok(one, ", "), "abc", 22); /* No delimiters. */ check(strtok((char *) NULL, ", ") == NULL, 23); (void) strcpy(one, "abc"); equal(strtok(one, ""), "abc", 24); /* Empty delimiter list. */ check(strtok((char *) NULL, "") == NULL, 25); (void) strcpy(one, "abcdefgh"); (void) strcpy(one, "a,b,c"); equal(strtok(one, ","), "a", 26); /* Basics again... */ equal(strtok((char *) NULL, ","), "b", 27); equal(strtok((char *) NULL, ","), "c", 28); check(strtok((char *) NULL, ",") == NULL, 29); equal(one + 6, "gh", 30); /* Stomped past end? */ equal(one, "a", 31); /* Stomped old tokens? */ equal(one + 2, "b", 32); equal(one + 4, "c", 33); /* Memcmp */ it = "memcmp"; check(memcmp("a", "a", 1) == 0, 1); /* Identity. */ check(memcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */ check(memcmp("abcd", "abce", 4) < 0, 3); /* Honestly unequal. */ check(memcmp("abce", "abcd", 4) > 0, 4); check(memcmp("alph", "beta", 4) < 0, 5); #ifdef NOT_ANSI if (charsigned) check(memcmp("a\203", "a\003", 2) < 0, 6); else check(memcmp("a\203", "a\003", 2) > 0, 6); #else check(memcmp("a\203", "a\003", 2) > 0, 6); #endif check(memcmp("abce", "abcd", 3) == 0, 7); /* Count limited. */ check(memcmp("abc", "def", 0) == 0, 8); /* Zero count. */ check(memcmp("a" + 1, "a" + 1, 1) == 0, 9); /* Unaligned tests. */ check(memcmp("abc" + 1, "bc", 2) == 0, 10); check(memcmp("bc", "abc" + 1, 2) == 0, 11); check(memcmp("abcd" + 1, "abce" + 1, 3) < 0, 12); check(memcmp("abce" + 1, "abcd" + 1, 3) > 0, 13); /* check(memcmp("a\203" + 1, "a\003" + 1, 1) > 0, 14); */ check(memcmp("abcde" + 1, "abcdf" + 1, 3) == 0, 15); /* Memchr */ it = "memchr"; check(memchr("abcd", 'z', 4) == NULL, 1); /* Not found. */ (void) strcpy(one, "abcd"); check( (char *)memchr(one, 'c', 4) == one + 2, 2); /* Basic test. */ check( (char *)memchr(one, 'd', 4) == one + 3, 3); /* End of string. */ check( (char *)memchr(one, 'a', 4) == one, 4); /* Beginning. */ check( (char *)memchr(one, '\0', 5) == one + 4, 5); /* Finding NUL. */ (void) strcpy(one, "ababa"); check( (char *)memchr(one, 'b', 5) == one + 1, 6); /* Finding first. */ check( (char *)memchr(one, 'b', 0) == NULL, 7); /* Zero count. */ check( (char *)memchr(one, 'a', 1) == one, 8); /* Singleton case. */ (void) strcpy(one, "a\203b"); check( (char *)memchr(one, 0203, 3) == one + 1, 9); /* Unsignedness. */ /* Memcpy * Note that X3J11 says memcpy may fail on overlap. */ it = "memcpy"; check( (char *)memcpy(one, "abc", 4) == one, 1); /* Returned value. */ equal(one, "abc", 2); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); (void) memcpy(one + 1, "xyz", 2); equal(one, "axydefgh", 3); /* Basic test. */ (void) strcpy(one, "abc"); (void) memcpy(one, "xyz", 0); equal(one, "abc", 4); /* Zero-length copy. */ (void) strcpy(one, "hi there"); (void) strcpy(two, "foo"); (void) memcpy(two, one, 9); equal(two, "hi there", 5); /* Just paranoia. */ equal(one, "hi there", 6); /* Stomped on source? */ (void) strcpy(one, "abcde"); /* Unaligned tests. */ (void) memcpy(one + 1, "\0\0\0\0\0", 1); equal(one, "a", 7); equal(one + 2, "cde", 8); (void) memcpy(one + 1, "xyz" + 1, 2); equal(one, "ayzde", 9); (void) memcpy(one + 1, "xyz" + 1, 3); equal(one, "ayz", 10); /* Memmove * Note that X3J11 says memmove must work regardless of overlap. */ it = "memmove"; check( (char *)memmove(one, "abc", 4) == one, 1); /* Returned value. */ equal(one, "abc", 2); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); (void) memmove(one + 1, "xyz", 2); equal(one, "axydefgh", 3); /* Basic test. */ (void) strcpy(one, "abc"); (void) memmove(one, "xyz", 0); equal(one, "abc", 4); /* Zero-length copy. */ (void) strcpy(one, "hi there"); (void) strcpy(two, "foo"); (void) memmove(two, one, 9); equal(two, "hi there", 5); /* Just paranoia. */ equal(one, "hi there", 6); /* Stomped on source? */ (void) strcpy(one, "abcdefgh"); (void) memmove(one + 1, one, 9); equal(one, "aabcdefgh", 7); /* Overlap, right-to-left. */ (void) strcpy(one, "abcdefgh"); (void) memmove(one + 1, one + 2, 7); equal(one, "acdefgh", 8); /* Overlap, left-to-right. */ (void) strcpy(one, "abcdefgh"); (void) memmove(one, one, 9); equal(one, "abcdefgh", 9); /* 100% overlap. */ (void) strcpy(one, "abcde"); /* Unaligned tests. */ (void) memmove(one + 1, "\0\0\0\0\0", 1); equal(one, "a", 10); equal(one + 2, "cde", 11); (void) memmove(one + 1, "xyz" + 1, 2); equal(one, "ayzde", 12); (void) memmove(one + 1, "xyz" + 1, 3); equal(one, "ayz", 13); (void) strcpy(one, "abcdefgh"); (void) memmove(one + 2, one + 1, 8); equal(one, "abbcdefgh", 14); /* Memccpy - first test like memcpy, then the search part * The SVID, the only place where memccpy is mentioned, says overlap * might fail, so we don't try it. Besides, it's hard to see the * rationale for a non-left-to-right memccpy. */ it = "memccpy"; check(memccpy(one, "abc", 'q', 4) == NULL, 1); /* Returned value. */ equal(one, "abc", 2); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); (void) memccpy(one + 1, "xyz", 'q', 2); equal(one, "axydefgh", 3); /* Basic test. */ (void) strcpy(one, "abc"); (void) memccpy(one, "xyz", 'q', 0); equal(one, "abc", 4); /* Zero-length copy. */ (void) strcpy(one, "hi there"); (void) strcpy(two, "foo"); (void) memccpy(two, one, 'q', 9); equal(two, "hi there", 5); /* Just paranoia. */ equal(one, "hi there", 6); /* Stomped on source? */ (void) strcpy(one, "abcdefgh"); (void) strcpy(two, "horsefeathers"); check( (char *)memccpy(two, one, 'f', 9) == two + 6, 7);/* Returned value. */ equal(one, "abcdefgh", 8); /* Source intact? */ equal(two, "abcdefeathers", 9); /* Copy correct? */ (void) strcpy(one, "abcd"); (void) strcpy(two, "bumblebee"); check((char *)memccpy(two, one, 'a', 4) == two + 1, 10); /* First char. */ equal(two, "aumblebee", 11); check((char *)memccpy(two, one, 'd', 4) == two + 4, 12); /* Last char. */ equal(two, "abcdlebee", 13); (void) strcpy(one, "xyz"); check((char *)memccpy(two, one, 'x', 1) == two + 1, 14); /* Singleton. */ equal(two, "xbcdlebee", 15); /* Memset */ it = "memset"; (void) strcpy(one, "abcdefgh"); check( (char *) memset(one + 1, 'x', 3) == one + 1, 1); /* Return value. */ equal(one, "axxxefgh", 2); /* Basic test. */ (void) memset(one + 2, 'y', 0); equal(one, "axxxefgh", 3); /* Zero-length set. */ (void) memset(one + 5, 0, 1); equal(one, "axxxe", 4); /* Zero fill. */ equal(one + 6, "gh", 5); /* And the leftover. */ (void) memset(one + 2, 010045, 1); equal(one, "ax\045xe", 6); /* Unsigned char convert. */ /* Bcopy - much like memcpy * Berklix manual is silent about overlap, so don't test it. */ it = "bcopy"; (void) bcopy("abc", one, 4); equal(one, "abc", 1); /* Simple copy. */ (void) strcpy(one, "abcdefgh"); (void) bcopy("xyz", one + 1, 2); equal(one, "axydefgh", 2); /* Basic test. */ (void) strcpy(one, "abc"); (void) bcopy("xyz", one, 0); equal(one, "abc", 3); /* Zero-length copy. */ (void) strcpy(one, "hi there"); (void) strcpy(two, "foo"); (void) bcopy(one, two, 9); equal(two, "hi there", 4); /* Just paranoia. */ equal(one, "hi there", 5); /* Stomped on source? */ /* Bzero */ it = "bzero"; (void) strcpy(one, "abcdef"); bzero(one + 2, 2); equal(one, "ab", 1); /* Basic test. */ equal(one + 3, "", 2); equal(one + 4, "ef", 3); (void) strcpy(one, "abcdef"); bzero(one + 2, 0); equal(one, "abcdef", 4); /* Zero-length copy. */ /* Bcmp - somewhat like memcmp */ it = "bcmp"; check(bcmp("a", "a", 1) == 0, 1); /* Identity. */ check(bcmp("abc", "abc", 3) == 0, 2); /* Multicharacter. */ check(bcmp("abcd", "abce", 4) != 0, 3); /* Honestly unequal. */ check(bcmp("abce", "abcd", 4) != 0, 4); check(bcmp("alph", "beta", 4) != 0, 5); check(bcmp("abce", "abcd", 3) == 0, 6); /* Count limited. */ check(bcmp("abc", "def", 0) == 0, 8); /* Zero count. */ #ifdef ERR /* Strerror - VERY system-dependent */ it = "strerror"; f = open("/", O_WRONLY); /* Should always fail. */ check(f < 0 && errno > 0 && errno < sys_nerr, 1); equal(strerror(errno), sys_errlist[errno], 2); #ifdef UNIXERR equal(strerror(errno), "Is a directory", 3); #endif #ifdef BERKERR equal(strerror(errno), "Permission denied", 3); #endif #endif } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 16 */ #include #include #include #include #include #include #include #include #define MAX_ERROR 4 int errct, subtest, passes; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test16a, (void)); _PROTOTYPE(void get_times, (char *name, time_t *a, time_t *c, time_t *m)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m; m = (argc == 2 ? atoi(argv[1]) : 0xFFFF); system("rm -rf DIR_16; mkdir DIR_16"); chdir("DIR_16"); printf("Test 16 "); fflush(stdout); for (i = 0; i < 4; i++) { if (m & 0001) test16a(); passes++; } quit(); return(-1); /* impossible */ } void test16a() { /* Test atime, ctime, and mtime. */ int fd, fd1, fd2, fd3, fd4; time_t a, c, m, pa, pc, pm, xa, xc, xm, ya, yc, ym, za, zc, zm, ta, tc, tm; time_t wa, wc, wm; char buf[1024]; struct stat s; subtest = 1; if (passes > 0) return; /* takes too long to repeat this test */ if ( (fd = creat("T16.a", 0666)) < 0) e(1); if (write(fd, buf, 1024) != 1024) e(2); if (close(fd) < 0) e(3); sleep(1); /* wait 1 sec before continuing */ if ( (fd = open("T16.a", O_RDONLY)) < 0) e(4); if (read(fd, buf, 3) != 3) e(5); if (close(fd) != 0) e(6); if (stat("T16.a", &s) != 0) e(7); a = s.st_atime; c = s.st_ctime; m = s.st_mtime; if (a == 0) { /* Almost certainly means we are running a V1 file system. */ printf(" (atime = 0. Probably V1 file system. V2 tests skipped.) "); return; } /* Many system calls affect atime, ctime, and mtime. Test them. They * fall into several groups. The members of each group can be tested * together. Start with creat(), mkdir(), and mkfifo, all of which * set all 3 times on the created object, and ctime and mtime of the dir. */ if ( (fd = creat("T16.b", 0666)) < 0) e(8); if (close(fd) != 0) e(9); get_times("T16.b", &a, &c, &m); get_times(".", &pa, &pc, &pm); if (a != c) e(10); if (a != m) e(11); if (a != pc) e(12); if (a != pm) e(13); if (unlink("T16.b") < 0) e(14); /* Test the times for mkfifo. */ if ( (fd = mkfifo("T16.c", 0666)) != 0) e(15); if (access("T16.c", R_OK | W_OK) != 0) e(16); get_times("T16.c", &a, &c, &m); get_times(".", &pa, &pc, &pm); if (a != c) e(17); if (a != m) e(18); if (a != pc) e(19); if (a != pm) e(20); if (unlink("T16.c") < 0) e(21); /* Test the times for mkdir. */ if (mkdir("T16.d", 0666) < 0) e(22); get_times("T16.d", &a, &c, &m); get_times(".", &pa, &pc, &pm); if (a != c) e(23); if (a != m) e(24); if (a != pc) e(25); if (a != pm) e(26); sleep(1); if (rmdir("T16.d") < 0) e(27); get_times(".", &xa, &xc, &xm); if (c == xc) e(28); if (m == xm) e(29); if (xc != xm) e(30); /* Test open(file, O_TRUNC). */ if ( (fd = open("T16.e", O_WRONLY|O_CREAT, 0666)) < 0) e(31); if (write(fd, buf, 1024) != 1024) e(32); if (close(fd) != 0) e(33); get_times("T16.e", &a, &c, &m); get_times(".", &pa, &pc, &pm); sleep(1); if ( (fd = open("T16.e", O_WRONLY|O_TRUNC)) < 0) e(34); get_times("T16.e", &xa, &xc, &xm); get_times(".", &ya, &yc, &ym); if (c != m) e(35); if (pc != pm) e(36); if (c == xc) e(37); if (m == xm) e(38); if (yc != pc) e(39); if (ym != pm) e(40); if (close(fd) != 0) e(41); /* Test the times for link/unlink. */ get_times("T16.e", &a, &c, &m); get_times(".", &ya, &yc, &ym); sleep(1); if (link("T16.e", "T16.f") != 0) e(42); /* second link */ get_times("T16.e", &xa, &xc, &xm); get_times(".", &pa, &pc, &pm); if (a != xa) e(43); if (m != xm) e(44); #ifndef V1_FILESYSTEM if (c == xc) e(45); #endif if (ya != pa) e(46); if (yc == pc) e(47); if (ym == pm) e(48); if (yc != ym) e(49); if (pc != pm) e(50); sleep(1); if (unlink("T16.f") != 0) e(46); get_times("T16.e", &a, &c, &m); get_times(".", &ya, &yc, &ym); if (a != xa) e(51); if (m != xm) e(52); #ifndef V1_FILESYSTEM if (c == xc) e(53); #endif if (pa != ya) e(54); if (pc == yc) e(55); if (pm == ym) e(56); if (yc != ym) e(57); if (unlink("T16.e") != 0) e(58); /* Test rename, read, write, chmod, utime. */ get_times(".", &pa, &pc, &pm); if ( (fd = open("T16.g", O_RDWR|O_CREAT)) < 0) e(59); if ( (fd1 = open("T16.h", O_WRONLY|O_CREAT, 0666)) < 0) e(60); if ( (fd2 = open("T16.i", O_WRONLY|O_CREAT, 0666)) < 0) e(61); if ( (fd3 = open("T16.j", O_WRONLY|O_CREAT, 0666)) < 0) e(62); if ( (fd4 = open("T16.k", O_RDWR|O_CREAT, 0666)) < 0) e(63); if (write(fd, buf, 1024) != 1024) e(64); get_times("T16.g", &a, &c, &m); get_times("T16.h", &pa, &pc, &pm); get_times("T16.i", &xa, &xc, &xm); get_times("T16.j", &ya, &yc, &ym); get_times("T16.k", &za, &zc, &zm); get_times(".", &wa, &wc, &wm); sleep(1); lseek(fd, 0L, SEEK_SET); if (read(fd, buf, 35) != 35) e(65); get_times("T16.g", &ta, &tc, &tm); if (a == ta || c != tc || m != tm) e(66); if (write(fd1, buf, 35) != 35) e(67); get_times("T16.h", &ta, &tc, &tm); if (pa != ta || pc == tc || pm == tm) e(69); if (rename("T16.i", "T16.i1") != 0) e(70); get_times("T16.i1", &ta, &tc, &tm); if (xa != ta || xc != tc || xm != tm) e(71); get_times(".", &a, &c, &m); if (a != wa || c == wc || m == wm || wc != wm) e(72); if (chmod("T16.j", 0777) != 0) e(73); get_times("T16.j", &ta, &tc, &tm); if (ya != ta || yc == tc || ym != tm) e(74); if (utime("T16.k", (void *) 0) != 0) e(75); get_times("T16.k", &ta, &tc, &tm); if (za == ta || zc == tc) e(76); if (close(fd) != 0) e(77); if (close(fd1) != 0) e(78); if (close(fd2) != 0) e(79); if (close(fd3) != 0) e(80); if (close(fd4) != 0) e(81); if (unlink("T16.g") != 0) e(82); if (unlink("T16.h") != 0) e(83); if (unlink("T16.i1") != 0) e(84); if (unlink("T16.j") != 0) e(85); if (unlink("T16.k") != 0) e(86); } void get_times(name, a, c, m) char *name; time_t *a, *c, *m; { struct stat s; if (stat(name, &s) != 0) e(500); *a = s.st_atime; *c = s.st_ctime; *m = s.st_mtime; } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Comment on usage and program: ark!/mnt/rene/prac/os/unix/comment.changes */ /* "const.h", created by Rene Montsma and Menno Wilcke */ #include /* type defs */ #include /* struct stat */ #include #include /* the error-numbers */ #include #include #include #include #include #include #define NOCRASH 1 /* test11(), 2nd pipe */ #define PDPNOHANG 1 /* test03(), write_standards() */ #define MAXERR 2 #define USER_ID 12 #define GROUP_ID 1 #define FF 3 /* first free filedes. */ #define USER 1 /* uid */ #define GROUP 0 /* gid */ #define ARSIZE 256 /* array size */ #define PIPESIZE 3584 /* max number of bytes to be written on pipe */ #define MAXOPEN 17 /* maximum number of extra open files */ #define MAXLINK 0177 /* maximum number of links per file */ #define LINKCOUNT 5 #define MASK 0777 /* selects lower nine bits */ #define END_FILE 0 /* returned by read-call at eof */ #define OK 0 #define FAIL -1 #define R 0 /* read (open-call) */ #define W 1 /* write (open-call) */ #define RW 2 /* read & write (open-call) */ #define RWX 7 /* read & write & execute (mode) */ #define NIL "" #define UMASK "umask" #define CREAT "creat" #define WRITE "write" #define READ "read" #define OPEN "open" #define CLOSE "close" #define LSEEK "lseek" #define ACCESS "access" #define CHDIR "chdir" #define CHMOD "chmod" #define LINK "link" #define UNLINK "unlink" #define PIPE "pipe" #define STAT "stat" #define FSTAT "fstat" #define DUP "dup" #define UTIME "utime" int errct; char *file[]; char *fnames[]; char *dir[]; /* "decl.c", created by Rene Montsma and Menno Wilcke */ /* Used in open_alot, close_alot */ char *file[20] = {"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19"}, *fnames[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}, *dir[8] = {"d---", "d--x", "d-w-", "d-wx", "dr--", "dr-x", "drw-", "drwx"}; /* Needed for easy creating and deleting of directories */ /* "test.c", created by Rene Montsma and Menno Wilcke */ _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test, (int mask)); _PROTOTYPE(void test01, (void)); _PROTOTYPE(void test02, (void)); _PROTOTYPE(void test08, (void)); _PROTOTYPE(void test09, (void)); _PROTOTYPE(void test10, (void)); _PROTOTYPE(int link_alot, (char *bigboss)); _PROTOTYPE(int unlink_alot, (int number)); _PROTOTYPE(void get_new, (char name [])); _PROTOTYPE(void test11, (void)); _PROTOTYPE(void comp_stats, (struct stat *stbf1, struct stat *stbf2)); _PROTOTYPE(void comp_inodes, (int m, int m1)); _PROTOTYPE(void e, (char *string)); _PROTOTYPE(void nlcr, (void)); _PROTOTYPE(void str, (char *s)); _PROTOTYPE(void err, (int number, char *scall, char *name)); _PROTOTYPE(void make_and_fill_dirs, (void)); _PROTOTYPE(void put_file_in_dir, (char *dirname, int mode)); _PROTOTYPE(void init_array, (char *a)); _PROTOTYPE(void clear_array, (char *b)); _PROTOTYPE(int comp_array, (char *a, char *b, int range)); _PROTOTYPE(void try_close, (int filedes, char *name)); _PROTOTYPE(void try_unlink, (char *fname)); _PROTOTYPE(void Remove, (int fdes, char *fname)); _PROTOTYPE(int get_mode, (char *name)); _PROTOTYPE(void check, (char *scall, int number)); _PROTOTYPE(void put, (int nr)); _PROTOTYPE(int open_alot, (void)); _PROTOTYPE(int close_alot, (int number)); _PROTOTYPE(void clean_up_the_mess, (void)); _PROTOTYPE(void chmod_8_dirs, (int sw)); _PROTOTYPE(void quit, (void)); /***************************************************************************** * TEST * ****************************************************************************/ int main(argc, argv) int argc; char *argv[]; { int n, mask; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 17 cannot run as root; test aborted\n"); exit(1); } system("rm -rf DIR_18; mkdir DIR_18"); chdir("DIR_18"); mask = (argc == 2 ? atoi(argv[1]) : 0xFFFF); if (fork()) { printf("Test 17 "); fflush(stdout); wait(&n); clean_up_the_mess(); quit(); } else { test(mask); exit(0); } return(-1); /* impossible */ } void test(mask) int mask; { umask(0); /* not honest, but i always forget */ if (mask & 00001) test01(); if (mask & 00002) make_and_fill_dirs(); if (mask & 00004) test02(); if (mask & 00010) test08(); if (mask & 00020) test09(); if (mask & 00040) test10(); if (mask & 00100) test11(); umask(022); } /* test */ /* "t1.c" created by Rene Montsma and Menno Wilcke */ /***************************************************************************** * test UMASK * ****************************************************************************/ void test01() { int oldvalue, newvalue, tempvalue; int nr; if ((oldvalue = umask(0777)) != 0) err(0, UMASK, NIL); /* Special test: only the lower 9 bits (protection bits) may part- * * icipate. ~0777 means: 111 000 000 000. Giving this to umask must* * not change any value. */ if ((newvalue = umask(~0777)) != 0777) err(1, UMASK, "illegal"); if (oldvalue == newvalue) err(11, UMASK, "not change mask"); if ((tempvalue = umask(0)) != 0) err(2, UMASK, "values"); /* Now test all possible modes of umask on a file */ for (newvalue = MASK; newvalue >= 0; newvalue -= 0111) { tempvalue = umask(newvalue); if (tempvalue != oldvalue) { err(1, UMASK, "illegal"); break; /* no use trying more */ } else if ((nr = creat("file01", 0777)) < 0) err(5, CREAT, "'file01'"); else { try_close(nr, "'file01'"); if (get_mode("file01") != (MASK & ~newvalue)) err(7, UMASK, "mode computed"); try_unlink("file01"); } oldvalue = newvalue; } /* The loop has terminated with umask(0) */ if ((tempvalue = umask(0)) != 0) err(7, UMASK, "umask may influence rest of tests!"); } /* test01 */ /***************************************************************************** * test CREAT * ****************************************************************************/ void test02() { int n, n1, mode; char a[ARSIZE], b[ARSIZE]; struct stat stbf1; mode = 0; /* Create twenty files, check filedes */ for (n = 0; n < MAXOPEN; n++) { if (creat(file[n], mode) != FF + n) err(13, CREAT, file[n]); else { if (get_mode(file[n]) != mode) err(7, CREAT, "mode set while creating many files"); /* Change mode of file to standard mode, we want to * * use a lot (20) of files to be opened later, see * * open_alot(), close_alot(). */ if (chmod(file[n], 0700) != OK) err(5, CHMOD, file[n]); } mode = (mode + 0100) % 01000; } /* Already twenty files opened; opening another has to fail */ if (creat("file02", 0777) != FAIL) err(9, CREAT, "created"); else check(CREAT, EMFILE); /* Close all files: seems blunt, but it isn't because we've * * checked all fd's already */ if ((n = close_alot(MAXOPEN)) < MAXOPEN) err(5, CLOSE, "MAXOPEN files"); /* Creat 1 file twice; check */ if ((n = creat("file02", 0777)) < 0) err(5, CREAT, "'file02'"); else { init_array(a); if (write(n, a, ARSIZE) != ARSIZE) err(1, WRITE, "bad"); if ((n1 = creat("file02", 0755)) < 0) /* receate 'file02' */ err(5, CREAT, "'file02' (2nd time)"); else { /* Fd should be at the top after recreation */ if (lseek(n1, 0L, SEEK_END) != 0) err(11, CREAT, "not truncate file by recreation"); else { /* Try to write on recreated file */ clear_array(b); if (lseek(n1, 0L, SEEK_SET) != 0) err(5, LSEEK, "to top of 2nd fd 'file02'"); if (write(n1, a, ARSIZE) != ARSIZE) err(1, WRITE, "(2) bad"); /* In order to read we've to close and open again */ try_close(n1, "'file02' (2nd creation)"); if ((n1 = open("file02", RW)) < 0) 5555555555555555555 5!5"5#5$5 err(5, OPEN, "'file02' (2nd recreation)"); /* Continue */ if (lseek(n1, 0L, SEEK_SET) != 0) err(5, LSEEK, "to top 'file02'(2nd fd) (2)"); if (read(n1, b, ARSIZE) != ARSIZE) err(1, READ, "wrong"); if (comp_array(a, b, ARSIZE) != OK) err(11, CREAT, "not really truncate file by recreation"); } if (get_mode("file02") != 0777) err(11, CREAT, "not maintain mode by recreation"); try_close(n1, "recreated 'file02'"); } Remove(n, "file02"); } /* Give 'creat' wrong input: dir not searchable */ if (creat("drw-/file02", 0777) != FAIL) err(4, CREAT, "'drw-'"); else check(CREAT, EACCES); /* Dir not writable */ if (creat("dr-x/file02", 0777) != FAIL) err(12, CREAT, "'dr-x/file02'"); else check(CREAT, EACCES); /* File not writable */ if (creat("drwx/r-x", 0777) != FAIL) err(11, CREAT, "recreate non-writable file"); else check(CREAT, EACCES); /* Try to creat a dir */ if ((n = creat("dir", 040777)) != FAIL) { if (fstat(n, &stbf1) != OK) err(5, FSTAT, "'dir'"); else if (stbf1.st_mode != (mode_t) 0100777) /* cast because mode is negative :-( */ err(11, CREAT, "'creat' a new directory"); Remove(n, "dir"); } /* We don't consider it to be a bug when creat * does not accept * tricky modes */ /* File is an existing dir */ if (creat("drwx", 0777) != FAIL) err(11, CREAT, "create an existing dir!"); else check(CREAT, EISDIR); } /* test02 */ void test08() { /* Test chdir to searchable dir */ if (chdir("drwx") != OK) err(5, CHDIR, "to accessible dir"); else if (chdir("..") != OK) err(11, CHDIR, "not return to '..'"); /* Check the chdir(".") and chdir("..") mechanism */ if (chdir("drwx") != OK) err(5, CHDIR, "to 'drwx'"); else { if (chdir(".") != OK) err(5, CHDIR, "to working dir (.)"); /* If we still are in 'drwx' , we should be able to access * * file 'rwx'. */ if (access("rwx", 0) != OK) err(5, CHDIR, "rightly to '.'"); /* Try to return to previous dir ('/' !!) */ if (chdir("././../././d--x/../d--x/././..") != OK) err(5, CHDIR, "to motherdir (..)"); /* Check whether we are back in '/' */ if (chdir("d--x") != OK) err(5, CHDIR, "rightly to a '..'"); } /* Return to '..' */ if (chdir("..") != OK) err(5, CHDIR, "to '..'"); if (chdir("././././drwx") != OK) err(11, CHDIR, "not follow a path"); else if (chdir("././././..") != OK) err(11, CHDIR, "not return to path"); /* Try giving chdir wrong parameters */ if (chdir("drwx/rwx") != FAIL) err(11, CHDIR, "chdir to a file"); else check(CHDIR, ENOTDIR); if (chdir("drw-") != FAIL) err(4, CHDIR, "'/drw-'"); else check(CHDIR, EACCES); /* To be sure: return to root */ /* If (chdir("/") != OK) err(5, CHDIR, "to '/' (2nd time)"); */ } /* test08 */ /* New page */ /***************************************************************************** * test CHMOD * ****************************************************************************/ void test09() { int n; /* Prepare file09 */ if ((n = creat("drwx/file09", 0644)) != FF) err(5, CREAT, "'drwx/file09'"); try_close(n, "'file09'"); /* Try to chmod a file, check and restore old values, check */ if (chmod("drwx/file09", 0700) != OK) err(5, CHMOD, "'drwx/file09'"); /* set rwx */ else { /* Check protection */ if (get_mode("drwx/file09") != 0700) err(7, CHMOD, "mode"); /* Test if chmod accepts just filenames too */ if (chdir("drwx") != OK) err(5, CHDIR, "to '/drwx'"); else if (chmod("file09", 0177) != OK) /* restore oldies */ err(5, CHMOD, "'h1'"); else /* Check if value has been restored */ if (get_mode("../drwx/file09") != 0177) err(7, CHMOD, "restored mode"); } /* Try setuid and setgid */ if ((chmod("file09", 04777) != OK) || (get_mode("file09") != 04777)) err(11, CHMOD, "not set uid-bit"); if ((chmod("file09", 02777) != OK) || (get_mode("file09") != 02777)) err(11, CHMOD, "not set gid-bit"); /* Remove testfile */ try_unlink("file09"); if (chdir("..") != OK) err(5, CHDIR, "to '..'"); /* Try to chmod directory */ if (chmod("d---", 0777) != OK) err(5, CHMOD, "dir 'd---'"); else { if (get_mode("d---") != 0777) err(7, CHMOD, "protection value"); if (chmod("d---", 0000) != OK) err(5, CHMOD, "dir 'a' 2nd time"); /* Check if old value has been restored */ if (get_mode("d---") != 0000) err(7, CHMOD, "restored protection value"); } /* Try to make chmod failures */ /* We still are in dir root */ /* Wrong filename */ if (chmod("non-file", 0777) != FAIL) err(3, CHMOD, NIL); else check(CHMOD, ENOENT); } /* test 09 */ /* New page */ /* "t4.c", created by Rene Montsma and Menno Wilcke */ /***************************************************************************** * test LINK/UNLINK * ****************************************************************************/ void test10() { int n, n1; char a[ARSIZE], b[ARSIZE], *f, *lf; f = "file10"; lf = "linkfile10"; if ((n = creat(f, 0702)) != FF) /* no other open files */ err(13, CREAT, f); else { /* Now link correctly */ if (link(f, lf) != OK) err(5, LINK, lf); else if ((n1 = open(lf, RW)) < 0) err(5, OPEN, "'linkfile10'"); else { init_array(a); clear_array(b); /* Write on 'file10' means being able to * read * through linked filedescriptor */ if (write(n, a, ARSIZE) != ARSIZE) err(1, WRITE, "bad"); if (read(n1, b, ARSIZE) != ARSIZE) err(1, READ, "bad"); if (comp_array(a, b, ARSIZE) != OK) err(8, "r/w", NIL); /* Clean up: unlink and close (twice): */ Remove(n, f); try_close(n1, "'linkfile10'"); /* Check if "linkfile" exists and the info * on it * is correct ('file' has been deleted) */ if ((n1 = open(lf, R)) < 0) err(5, OPEN, "'linkfile10'"); else { /* See if 'linkfile' still contains 0..511 ? */ clear_array(b); if (read(n1, b, ARSIZE) != ARSIZE) err(1, READ, "bad"); if (comp_array(a, b, ARSIZE) != OK) err(8, "r/w", NIL); try_close(n1, "'linkfile10' 2nd time"); try_unlink(lf); } } } /* Try if unlink fails with incorrect parameters */ /* File does not exist: */ if (unlink("non-file") != FAIL) err(2, UNLINK, "name"); else check(UNLINK, ENOENT); /* Dir can't be written */ if (unlink("dr-x/rwx") != FAIL) err(11, UNLINK, "could unlink in non-writable dir."); else check(UNLINK, EACCES); /* Try to unlink a dir being user */ if (unlink("drwx") != FAIL) err(11, UNLINK, "unlink dir's as user"); else check(UNLINK, EPERM); /* Try giving link wrong input */ /* First try if link fails with incorrect parameters * name1 does not * exist. */ if (link("non-file", "linkfile") != FAIL) err(2, LINK, "1st name"); else check(LINK, ENOENT); /* Name2 exists already */ if (link("drwx/rwx", "drwx/rw-") != FAIL) err(2, LINK, "2nd name"); else check(LINK, EEXIST); /* Directory of name2 not writable: */ if (link("drwx/rwx", "dr-x/linkfile") != FAIL) err(11, LINK, "link non-writable file"); else check(LINK, EACCES); /* Try to link a dir, being a user */ if (link("drwx", "linkfile") != FAIL) err(11, LINK, "link a dir without superuser!"); else check(LINK, EPERM); /* File has too many links */ if ((n = link_alot("drwx/rwx")) != LINKCOUNT - 1) /* file already has one * link */ err(5, LINK, "many files"); if (unlink_alot(n) != n) err(5, UNLINK, "all linked files"); } /* test10 */ int link_alot(bigboss) char *bigboss; { int i; static char employee[6] = "aaaaa"; /* Every file has already got 1 link, so link 0176 times */ for (i = 1; i < LINKCOUNT; i++) { if (link(bigboss, employee) != OK) break; else get_new(employee); } return(i - 1); /* number of linked files */ } /* link_alot */ int unlink_alot(number) int number; /* number of files to be unlinked */ { int j; static char employee[6] = "aaaaa"; for (j = 0; j < number; j++) { if (unlink(employee) != OK) break; else get_new(employee); } return(j); /* return number of unlinked files */ } /* unlink_alot */ void get_new(name) char name[]; /* Every call changes string 'name' to a string alphabetically * * higher. Start with "aaaaa", next value: "aaaab" . * * N.B. after "aaaaz" comes "aaabz" and not "aaaba" (not needed). * * The last possibility will be "zzzzz". * * Total # possibilities: 26+25*4 = 126 = MAXLINK -1 (exactly needed) */ { int i; for (i = 4; i >= 0; i--) if (name[i] != 'z') { name[i]++; break; } } /* get_new */ /* New page */ /***************************************************************************** * test PIPE * ****************************************************************************/ void test11() { int n, fd[2]; char a[ARSIZE], b[ARSIZE]; if (pipe(fd) != OK) err(13, PIPE, NIL); else { /* Try reading and writing on a pipe */ init_array(a); clear_array(b); if (write(fd[1], a, ARSIZE) != ARSIZE) err(5, WRITE, "on pipe"); else if (read(fd[0], b, (ARSIZE / 2)) != (ARSIZE / 2)) err(5, READ, "on pipe (2nd time)"); else if (comp_array(a, b, (ARSIZE / 2)) != OK) err(7, PIPE, "values read/written"); else if (read(fd[0], b, (ARSIZE / 2)) != (ARSIZE / 2)) err(5, READ, "on pipe 2"); else if (comp_array(&a[ARSIZE / 2], b, (ARSIZE / 2)) != OK) err(7, PIPE, "pipe created"); /* Try to let the pipe make a mistake */ if (write(fd[0], a, ARSIZE) != FAIL) err(11, WRITE, "write on fd[0]"); if (read(fd[1], b, ARSIZE) != FAIL) err(11, READ, "read on fd[1]"); try_close(fd[1], "'fd[1]'"); /* Now we shouldn't be able to read, because fd[1] has been closed */ if (read(fd[0], b, ARSIZE) != END_FILE) err(2, PIPE, "'fd[1]'"); try_close(fd[0], "'fd[0]'"); } if (pipe(fd) < 0) err(5, PIPE, "2nd time"); else { /* Test lseek on a pipe: should fail */ if (write(fd[1], a, ARSIZE) != ARSIZE) err(5, WRITE, "on pipe (2nd time)"); if (lseek(fd[1], 10L, SEEK_SET) != FAIL) err(11, LSEEK, "lseek on a pipe"); else check(PIPE, ESPIPE); /* Eat half of the pipe: no writing should be possible */ try_close(fd[0], "'fd[0]' (2nd time)"); /* This makes UNIX crash: omit it if pdp or VAX */ #ifndef NOCRASH if (write(fd[1], a, ARSIZE) != FAIL) err(11, WRITE, "write on wrong pipe"); else check(PIPE, EPIPE); #endif try_close(fd[1], "'fd[1]' (2nd time)"); } /* BUG : * * Here we planned to test if we could write 4K bytes on a pipe. * * However, this was not possible to implement, because the whole * * Monix system crashed when we tried to write more then 3584 bytes * * (3.5K) on a pipe. That's why we try to write only 3.5K in the * * folowing test. */ if (pipe(fd) < 0) err(5, PIPE, "3rd time"); else { for (n = 0; n < (PIPESIZE / ARSIZE); n++) if (write(fd[1], a, ARSIZE) != ARSIZE) err(5, WRITE, "on pipe (3rd time) 4K"); try_close(fd[1], "'fd[1]' (3rd time)"); for (n = 0; n < (PIPESIZE / ARSIZE); n++) if (read(fd[0], b, ARSIZE) != ARSIZE) err(5, READ, "from pipe (3rd time) 4K"); try_close(fd[0], "'fd[0]' (3rd time)"); } /* Test opening a lot of files */ if ((n = open_alot()) != MAXOPEN) err(5, OPEN, "MAXOPEN files"); if (pipe(fd) != FAIL) err(9, PIPE, "open"); else check(PIPE, EMFILE); if (close_alot(n) != n) err(5, CLOSE, "all opened files"); } /* test11 */ /* New page */ void comp_stats(stbf1, stbf2) struct stat *stbf1, *stbf2; { if (stbf1->st_dev != stbf2->st_dev) err(7, "st/fst", "'dev'"); if (stbf1->st_ino != stbf2->st_ino) err(7, "st/fst", "'ino'"); if (stbf1->st_mode != stbf2->st_mode) err(7, "st/fst", "'mode'"); if (stbf1->st_nlink != stbf2->st_nlink) err(7, "st/fst", "'nlink'"); if (stbf1->st_uid != stbf2->st_uid) err(7, "st/fst", "'uid'"); if (stbf1->st_gid != stbf2->st_gid) err(7, "st/fst", "'gid'"); if (stbf1->st_rdev != stbf2->st_rdev) err(7, "st/fst", "'rdev'"); if (stbf1->st_size != stbf2->st_size) err(7, "st/fst", "'size'"); if (stbf1->st_atime != stbf2->st_atime) err(7, "st/fst", "'atime'"); if (stbf1->st_mtime != stbf2->st_mtime) err(7, "st/fst", "'mtime'"); } /* comp_stats */ /* New page */ /* "t5.c", created by Rene Montsma and Menno Wilcke */ void comp_inodes(m, m1) int m, m1; /* twee filedes's */ { struct stat stbf1, stbf2; if (fstat(m, &stbf1) == OK) if (fstat(m1, &stbf2) == OK) { if (stbf1.st_ino != stbf2.st_ino) err(7, DUP, "inode number"); } else err(100, "comp_inodes", "cannot 'fstat' (m1)"); else err(100, "comp_inodes", "cannot 'fstat' (m)"); } /* comp_inodes */ /* "support.c", created by Rene Montsma and Menno Wilcke */ /* Err, make_and_fill_dirs, init_array, clear_array, comp_array, try_close, try_unlink, Remove, get_mode, check, open_alot, close_alot, clean_up_the_mess. */ /*********************************************************************** * EXTENDED FIONS * **********************************************************************/ /* First extended functions (i.e. not oldfashioned monixcalls. e(), nlcr(), octal.*/ void e(string) char *string; { printf("Error: %s ", string); } void nlcr() { printf("\n"); } void str(s) char *s; { printf(s); } /***************************************************************************** * * * ERR(or) messages * * * *****************************************************************************/ void err(number, scall, name) /* Give nice error messages */ char *scall, *name; int number; { errct++; if (errct > MAXERR) { printf("Too many errors; test aborted\n"); quit(); } e(""); str("\t"); switch (number) { case 0: str(scall); str(": illegal initial value."); break; case 1: str(scall); str(": "); str(name); str(" value returned."); break; case 2: str(scall); str(": accepting illegal "); str(name); str("."); break; case 3: str(scall); str(": accepting non-existing file."); break; case 4: str(scall); str(": could search non-searchable dir ("); str(name); str(")."); break; case 5: str(scall); str(": cannot "); str(scall); str(" "); str(name); str("."); break; case 7: str(scall); str(": incorrect "); str(name); str("."); break; case 8: str(scall); str(": wrong values."); break; case 9: str(scall); str(": accepting too many "); str(name); str(" files."); break; case 10: str(scall); str(": even a superuser can't do anything!"); break; case 11: str(scall); str(": could "); str(name); str("."); break; case 12: str(scall); str(": could write in non-writable dir ("); str(name); str(")."); break; case 13: str(scall); str(": wrong filedes returned ("); str(name); str(")."); break; case 100: str(scall); /* very common */ str(": "); str(name); str("."); break; default: str("errornumber does not exist!\n"); } nlcr(); } /* err */ /***************************************************************************** * * * MAKE_AND_FILL_DIRS * * * *****************************************************************************/ void make_and_fill_dirs() /* Create 8 dir.'s: "d---", "d--x", "d-w-", "d-wx", "dr--", "dr-x", * * "drw-", "drwx". * Then create 8 files * in "drwx", and some needed files in other dirs. */ { int mode, i; for (i = 0; i < 8; i++) { mkdir(dir[i], 0700); chown(dir[i], USER_ID, GROUP_ID); } setuid(USER_ID); setgid(GROUP_ID); for (mode = 0; mode < 8; mode++) put_file_in_dir("drwx", mode); put_file_in_dir("d-wx", RWX); put_file_in_dir("dr-x", RWX); put_file_in_dir("drw-", RWX); chmod_8_dirs(8); /* 8 means; 8 different modes */ } /* make_and_fill_dirs */ void put_file_in_dir(dirname, mode) char *dirname; int mode; /* Fill directory 'dirname' with file with mode 'mode'. */ { int nr; if (chdir(dirname) != OK) err(5, CHDIR, "to dirname (put_f_in_dir)"); else { /* Creat the file */ if ((nr = creat(fnames[mode], mode * 0100)) < 0) err(13, CREAT, fnames[mode]); else try_close(nr, fnames[mode]); if (chdir("..") != OK) err(5, CHDIR, "to previous dir (put_f_in_dir)"); } } /* put_file_in_dir */ /***************************************************************************** * * * MISCELLANEOUS * * * *(all about arrays, 'try_close', 'try_unlink', 'Remove', 'get_mode')* * * *****************************************************************************/ void init_array(a) char *a; { int i; i = 0; while (i++ < ARSIZE) *a++ = 'a' + (i % 26); } /* init_array */ void clear_array(b) char *b; { int i; i = 0; while (i++ < ARSIZE) *b++ = '0'; } /* clear_array */ int comp_array(a, b, range) char *a, *b; int range; { if ((range < 0) || (range > ARSIZE)) { err(100, "comp_array", "illegal range"); return(FAIL); } else { while (range-- && (*a++ == *b++)); if (*--a == *--b) return(OK); else return(FAIL); } } /* comp_array */ void try_close(filedes, name) int filedes; char *name; { if (close(filedes) != OK) err(5, CLOSE, name); } /* try_close */ void try_unlink(fname) char *fname; { if (unlink(fname) != 0) err(5, UNLINK, fname); } /* try_unlink */ void Remove(fdes, fname) int fdes; char *fname; { try_close(fdes, fname); try_unlink(fname); } /* Remove */ int get_mode(name) char *name; { struct stat stbf1; if (stat(name, &stbf1) != OK) { err(5, STAT, name); return(stbf1.st_mode); /* return a mode which will cause * * error in the calling function * * (file/dir bit) */ } else return(stbf1.st_mode & 07777); /* take last 4 bits */ } /* get_mode */ /***************************************************************************** * * * CHECK * * * *****************************************************************************/ void check(scall, number) int number; char *scall; { if (errno != number) { e(NIL); str("\t"); str(scall); str(": bad errno-value: "); put(errno); str(" should have been: "); put(number); nlcr(); } } /* check */ void put(nr) int nr; { switch (nr) { case 0: str("unused"); break; case 1: str("EPERM"); break; case 2: str("ENOENT"); break; case 3: str("ESRCH"); break; case 4: str("EINTR"); break; case 5: str("EIO"); break; case 6: str("ENXIO"); break; case 7: str("E2BIG"); break; case 8: str("ENOEXEC"); break; case 9: str("EBADF"); break; case 10: str("ECHILD"); break; case 11: str("EAGAIN"); break; case 12: str("ENOMEM"); break; case 13: str("EACCES"); break; case 14: str("EFAULT"); break; case 15: str("ENOTBLK"); break; case 16: str("EBUSY"); break; case 17: str("EEXIST"); break; case 18: str("EXDEV"); break; case 19: str("ENODEV"); break; case 20: str("ENOTDIR"); break; case 21: str("EISDIR"); break; case 22: str("EINVAL"); break; case 23: str("ENFILE"); break; case 24: str("EMFILE"); break; case 25: str("ENOTTY"); break; case 26: str("ETXTBSY"); break; case 27: str("EFBIG"); break; case 28: str("ENOSPC"); break; case 29: str("ESPIPE"); break; case 30: str("EROFS"); break; case 31: str("EMLINK"); break; case 32: str("EPIPE"); break; case 33: str("EDOM"); break; case 34: str("ERANGE"); break; } } /***************************************************************************** * * * ALOT-functions * * * *****************************************************************************/ int open_alot() { int i; for (i = 0; i < MAXOPEN; i++) if (open(file[i], R) == FAIL) break; if (i == 0) err(5, "open_alot", "at all"); return(i); } /* open_alot */ int close_alot(number) int number; { int i, count = 0; if (number > MAXOPEN) err(5, "close_alot", "accept this argument"); else for (i = FF; i < number + FF; i++) if (close(i) != OK) count++; return(number - count); /* return number of closed files */ } /* close_alot */ /***************************************************************************** * * * CLEAN UP THE MESS * * * *****************************************************************************/ void clean_up_the_mess() { int i; char dirname[6]; /* First remove 'a lot' files */ for (i = 0; i < MAXOPEN; i++) try_unlink(file[i]); /* Unlink the files in dir 'drwx' */ if (chdir("drwx") != OK) err(5, CHDIR, "to 'drwx'"); else { for (i = 0; i < 8; i++) try_unlink(fnames[i]); if (chdir("..") != OK) err(5, CHDIR, "to '..'"); } /* Before unlinking files in some dirs, make them writable */ chmod_8_dirs(RWX); /* Unlink files in other dirs */ try_unlink("d-wx/rwx"); try_unlink("dr-x/rwx"); try_unlink("drw-/rwx"); /* Unlink dirs */ for (i = 0; i < 8; i++) { strcpy(dirname, "d"); strcat(dirname, fnames[i]); /* 'dirname' contains the directoryname */ rmdir(dirname); } /* FINISH */ } /* clean_up_the_mess */ void chmod_8_dirs(sw) int sw; /* if switch == 8, give all different * mode,else the same mode */ { int mode; int i; if (sw == 8) mode = 0; else mode = sw; for (i = 0; i < 8; i++) { chmod(dir[i], 040000 + mode * 0100); if (sw == 8) mode++; } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 18 */ /* Comment on usage and program: ark!/mnt/rene/prac/os/unix/comment.changes */ /* "const.h", created by Rene Montsma and Menno Wilcke */ #include /* needed in struct stat */ #include /* struct stat */ #include #include /* the error-numbers */ #include #include #include #include #include #define NOCRASH 1 /* test11(), 2nd pipe */ #define PDPNOHANG 1 /* test03(), write_standards() */ #define MAXERR 5 #define USER_ID 12 #define GROUP_ID 1 #define FF 3 /* first free filedes. */ #define USER 1 /* uid */ #define GROUP 0 /* gid */ #define ARSIZE 256 /* array size */ #define PIPESIZE 3584 /* maxnumber of bytes to be written on pipe */ #define MAXOPEN 17 /* maximum number of extra open files */ #define MAXLINK 0177 /* maximum number of links per file */ #define MASK 0777 /* selects lower nine bits */ #define READ_EOF 0 /* returned by read-call at eof */ #define OK 0 #define FAIL -1 #define R 0 /* read (open-call) */ #define W 1 /* write (open-call) */ #define RW 2 /* read & write (open-call) */ #define RWX 7 /* read & write & execute (mode) */ #define NIL "" #define UMASK "umask" #define CREAT "creat" #define WRITE "write" #define READ "read" #define OPEN "open" #define CLOSE "close" #define LSEEK "lseek" #define ACCESS "access" #define CHDIR "chdir" #define CHMOD "chmod" #define LINK "link" #define UNLINK "unlink" #define PIPE "pipe" #define STAT "stat" #define FSTAT "fstat" #define DUP "dup" #define UTIME "utime" int errct; char *file[]; char *fnames[]; char *dir[]; /* "decl.c", created by Rene Montsma and Menno Wilcke */ /* Used in open_alot, close_alot */ char *file[20] = {"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19"}, *fnames[8] = {"---", "--x", "-w-", "-wx", "r--", "r-x", "rw-", "rwx"}, *dir[8] = {"d---", "d--x", "d-w-", "d-wx", "dr--", "dr-x", "drw-", "drwx"}; /* Needed for easy creating and deleting of directories */ /* "test.c", created by Rene Montsma and Menno Wilcke */ _PROTOTYPE(int main, (void)); _PROTOTYPE(void test, (void)); _PROTOTYPE(void test01, (void)); _PROTOTYPE(void test02, (void)); _PROTOTYPE(void test03, (void)); _PROTOTYPE(void write_standards, (int filedes, char a [])); _PROTOTYPE(void test04, (void)); _PROTOTYPE(void read_standards, (int filedes, char a [])); _PROTOTYPE(void read_more, (int filedes, char a [])); _PROTOTYPE(void test05, (void)); _PROTOTYPE(void try_open, (char *fname, int mode, int test)); _PROTOTYPE(void test06, (void)); _PROTOTYPE(void test07, (void)); _PROTOTYPE(void access_standards, (void)); _PROTOTYPE(void try_access, (char *fname, int mode, int test)); _PROTOTYPE(void e, (char *string)); _PROTOTYPE(void nlcr, (void)); _PROTOTYPE(void str, (char *s)); _PROTOTYPE(void err, (int number, char *scall, char *name)); _PROTOTYPE(void make_and_fill_dirs, (void)); _PROTOTYPE(void put_file_in_dir, (char *dirname, int mode)); _PROTOTYPE(void init_array, (char *a)); _PROTOTYPE(void clear_array, (char *b)); _PROTOTYPE(int comp_array, (char *a, char *b, int range)); _PROTOTYPE(void try_close, (int filedes, char *name)); _PROTOTYPE(void try_unlink, (char *fname)); _PROTOTYPE(void Remove, (int fdes, char *fname)); _PROTOTYPE(int get_mode, (char *name)); _PROTOTYPE(void check, (char *scall, int number)); _PROTOTYPE(void put, (int nr)); _PROTOTYPE(int open_alot, (void)); _PROTOTYPE(int close_alot, (int number)); _PROTOTYPE(void clean_up_the_mess, (void)); _PROTOTYPE(void chmod_8_dirs, (int sw)); _PROTOTYPE(void quit, (void)); /***************************************************************************** * TEST * ****************************************************************************/ int main() { int n; if (geteuid() == 0 || getuid() == 0) { printf("Test 18 cannot run as root; test aborted\n"); exit(1); } system("rm -rf DIR_18; mkdir DIR_18"); chdir("DIR_18"); if (fork()) { printf("Test 18 "); fflush(stdout); /* have to flush for child's benefit */ wait(&n); clean_up_the_mess(); quit(); } else { test(); exit(0); } return(0); } void test() { umask(0); /* not honest, but i always forget */ test01(); make_and_fill_dirs(); test02(); test03(); test04(); test05(); test06(); test07(); umask(022); } /* test */ /* "t1.c" created by Rene Montsma and Menno Wilcke */ /***************************************************************************** * test UMASK * ****************************************************************************/ void test01() { int oldvalue, newvalue, tempvalue; int nr; if ((oldvalue = umask(0777)) != 0) err(0, UMASK, NIL); /* Special test: only the lower 9 bits (protection bits) may part- * * icipate. ~0777 means: 111 000 000 000. Giving this to umask must* * not change any value. */ if ((newvalue = umask(~0777)) != 0777) err(1, UMASK, "illegal"); if (oldvalue == newvalue) err(11, UMASK, "not change mask"); if ((tempvalue = umask(0)) != 0) err(2, UMASK, "values"); /* Now test all possible modes of umask on a file */ for (newvalue = MASK; newvalue >= 0; newvalue -= 0111) { tempvalue = umask(newvalue); if (tempvalue != oldvalue) { err(1, UMASK, "illegal"); break; /* no use trying more */ } else if ((nr = creat("file01", 0777)) < 0) err(5, CREAT, "'file01'"); else { try_close(nr, "'file01'"); if (get_mode("file01") != (MASK & ~newvalue)) err(7, UMASK, "mode computed"); try_unlink("file01"); } oldvalue = newvalue; } /* The loop has terminated with umask(0) */ if ((tempvalue = umask(0)) != 0) err(7, UMASK, "umask may influence rest of tests!"); } /* test01 */ /***************************************************************************** * test CREAT * ****************************************************************************/ void test02() { int n, n1, mode; char a[ARSIZE], b[ARSIZE]; struct stat stbf1; mode = 0; /* Create twenty files, check filedes */ for (n = 0; n < MAXOPEN; n++) { if (creat(file[n], mode) != FF + n) err(13, CREAT, file[n]); else { if (get_mode(file[n]) != mode) err(7, CREAT, "mode set while creating many files"); /* Change mode of file to standard mode, we want to * * use a lot (20) of files to be opened later, see * * open_alot(), close_alot(). */ if (chmod(file[n], 0700) != OK) err(5, CHMOD, file[n]); } mode = (mode + 0100) % 01000; } /* Already twenty files opened; opening another has to fail */ if (creat("file02", 0777) != FAIL) err(9, CREAT, "created"); else check(CREAT, EMFILE); /* Close all files: seems blunt, but it isn't because we've * * checked all fd's already */ if ((n = close_alot(MAXOPEN)) < MAXOPEN) err(5, CLOSE, "MAXOPEN files"); /* Creat 1 file twice; check */ if ((n = creat("file02", 0777)) < 0) err(5, CREAT, "'file02'"); else { init_array(a); if (write(n, a, ARSIZE) != ARSIZE) err(1, WRITE, "bad"); if ((n1 = creat("file02", 0755)) < 0) /* receate 'file02' */ err(5, CREAT, "'file02' (2nd time)"); else { /* Fd should be at the top after recreation */ if (lseek(n1, 0L, SEEK_END) != 0) err(11, CREAT, "not truncate file by recreation"); else { /* Try to write on recreated file */ clear_array(b); if (lseek(n1, 0L, SEEK_SET) != 0) err(5, LSEEK, "to top of 2nd fd 'file02'"); if (write(n1, a, ARSIZE) != ARSIZE) err(1, WRITE, "(2) bad"); /* In order to read we've to close and open again */ try_close(n1, "'file02' (2nd creation)"); if ((n1 = open("file02", RW)) < 0) err(5, OPEN, "'file02' (2nd recreation)"); /* Continue */ if (lseek(n1, 0L, SEEK_SET) != 0) err,5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5(5, LSEEK, "to top 'file02'(2nd fd) (2)"); if (read(n1, b, ARSIZE) != ARSIZE) err(1, READ, "wrong"); if (comp_array(a, b, ARSIZE) != OK) err(11, CREAT, "not really truncate file by recreation"); } if (get_mode("file02") != 0777) err(11, CREAT, "not maintain mode by recreation"); try_close(n1, "recreated 'file02'"); } Remove(n, "file02"); } /* Give 'creat' wrong input: dir not searchable */ if (creat("drw-/file02", 0777) != FAIL) err(4, CREAT, "'drw-'"); else check(CREAT, EACCES); /* Dir not writable */ if (creat("dr-x/file02", 0777) != FAIL) err(12, CREAT, "'dr-x/file02'"); else check(CREAT, EACCES); /* File not writable */ if (creat("drwx/r-x", 0777) != FAIL) err(11, CREAT, "recreate non-writable file"); else check(CREAT, EACCES); /* Try to creat a dir */ if ((n = creat("dir", 040777)) != FAIL) { if (fstat(n, &stbf1) != OK) err(5, FSTAT, "'dir'"); else if (stbf1.st_mode != (mode_t) 0100777) /* Cast because mode is negative :-(. * HACK DEBUG FIXME: this appears to duplicate * code in test17.c. */ err(11, CREAT, "'creat' a new directory"); Remove(n, "dir"); } /* We don't consider it to be a bug when creat * does not accept * tricky modes */ /* File is an existing dir */ if (creat("drwx", 0777) != FAIL) err(11, CREAT, "create an existing dir!"); else check(CREAT, EISDIR); } /* test02 */ /***************************************************************************** * test WRITE * ****************************************************************************/ void test03() { int n, n1; int fd[2]; char a[ARSIZE]; init_array(a); /* Test write after a CREAT */ if ((n = creat("file03", 0700)) != FF) /* 'file03' only open file */ err(13, CREAT, "'file03'"); else { write_standards(n, a); /* test simple writes, wrong input too */ try_close(n, "'file03'"); } /* Test write after an OPEN */ if ((n = open("file03", W)) < 0) err(5, OPEN, "'file03'"); else write_standards(n, a); /* test simple writes, wrong input too */ /* Test write after a DUP */ if ((n1 = dup(n)) < 0) err(5, DUP, "'file03'"); else { write_standards(n1, a); try_close(n1, "duplicated fd 'file03'"); } /* Remove testfile */ Remove(n, "file03"); /* Test write after a PIPE */ if (pipe(fd) < 0) err(5, PIPE, NIL); else { write_standards(fd[1], a); try_close(fd[0], "'fd[0]'"); try_close(fd[1], "'fd[1]'"); } /* Last test: does write check protections ? */ if ((n = open("drwx/r--", R)) < 0) err(5, OPEN, "'drwx/r--'"); else { if (write(n, a, ARSIZE) != FAIL) err(11, WRITE, "write on non-writ. file"); else check(WRITE, EBADF); try_close(n, "'drwx/r--'"); } } /* test03 */ void write_standards(filedes, a) int filedes; char a[]; { /* Write must return written account of numbers */ if (write(filedes, a, ARSIZE) != ARSIZE) err(1, WRITE, "bad"); /* Try giving 'write' wrong input */ /* Wrong filedes */ if (write(-1, a, ARSIZE) != FAIL) err(2, WRITE, "filedes"); else check(WRITE, EBADF); /* Wrong length (illegal) */ #ifndef PDPNOHANG if (write(filedes, a, -ARSIZE) != FAIL) err(2, WRITE, "length"); else check(WRITE, EINVAL); /* EFAULT on vu45 */ #endif } /* write_standards */ /* "t2.c", created by Rene Montsma and Menno Wilcke */ /***************************************************************************** * test READ * ****************************************************************************/ void test04() { int n, n1, fd[2]; char a[ARSIZE]; /* Test read after creat */ if ((n = creat("file04", 0700)) != FF) /* no other open files may be * left */ err(13, CREAT, "'file04'"); else { /* Closing and opening needed before writing */ try_close(n, "'file04'"); if ((n = open("file04", RW)) < 0) err(5, OPEN, "'file04'"); init_array(a); if (write(n, a, ARSIZE) != ARSIZE) err(1, WRITE, "bad"); else { if (lseek(n, 0L, SEEK_SET) != 0) err(5, LSEEK, "'file04'"); read_standards(n, a); read_more(n, a); } try_close(n, "'file04'"); } /* Test read after OPEN */ if ((n = open("file04", R)) < 0) err(5, OPEN, "'file04'"); else { read_standards(n, a); read_more(n, a); try_close(n, "'file04'"); } /* Test read after DUP */ if ((n = open("file04", R)) < 0) err(5, OPEN, "'file04'"); if ((n1 = dup(n)) < 0) err(5, DUP, "'file04'"); else { read_standards(n1, a); read_more(n1, a); try_close(n1, "duplicated fd 'file04'"); } /* Remove testfile */ Remove(n, "file04"); /* Test read after pipe */ if (pipe(fd) < 0) err(5, PIPE, NIL); else { if (write(fd[1], a, ARSIZE) != ARSIZE) { err(5, WRITE, "'fd[1]'"); try_close(fd[1], "'fd[1]'"); } else { try_close(fd[1], "'fd[1]'"); read_standards(fd[0], a); } try_close(fd[0], "'fd[0]'"); } /* Last test: try to read a read-protected file */ if ((n = open("drwx/-wx", W)) < 0) err(5, OPEN, "'drwx/-wx'"); else { if (read(n, a, ARSIZE) != FAIL) err(11, READ, "read a non-read. file"); else check(READ, EBADF); try_close(n, "'/drwx/-wx'"); } } /* test04 */ void read_standards(filedes, a) int filedes; char a[]; { char b[ARSIZE]; clear_array(b); if (read(filedes, b, ARSIZE) != ARSIZE) err(1, READ, "bad"); else if (comp_array(a, b, ARSIZE) != OK) err(7, "read/write", "values"); else if (read(filedes, b, ARSIZE) != READ_EOF) err(11, READ, "read beyond endoffile"); /* Try giving read wrong input: wrong filedes */ if (read(FAIL, b, ARSIZE) != FAIL) err(2, READ, "filedes"); else check(READ, EBADF); /* Wrong length */ if (read(filedes, b, -ARSIZE) != FAIL) err(2, READ, "length"); else check(READ, EINVAL); } /* read_standards */ void read_more(filedes, a) int filedes; char a[]; /* Separated from read_standards() because the PIPE test * would fail. */ { int i; char b[ARSIZE]; if (lseek(filedes, (long) (ARSIZE / 2), SEEK_SET) != ARSIZE / 2) err(5, LSEEK, "to location ARSIZE/2"); clear_array(b); if (read(filedes, b, ARSIZE) != ARSIZE / 2) err(1, READ, "bad"); for (i = 0; i < ARSIZE / 2; i++) if (b[i] != a[(ARSIZE / 2) + i]) err(7, READ, "from location ARSIZE/2"); } /***************************************************************************** * test OPEN/CLOSE * ****************************************************************************/ void test05() { int n, n1, mode, fd[2]; char b[ARSIZE]; /* Test open after CREAT */ if ((n = creat("file05", 0700)) != FF) /* no other open files left */ err(13, CREAT, "'file05'"); else { if ((n1 = open("file05", RW)) != FF + 1) err(13, OPEN, "'file05' after creation"); try_close(n1, "'file05' (open after creation)"); try_close(n, "'file05'"); if ((n = open("file05", R)) != FF) err(13, OPEN, "after closing"); else try_close(n, "'file05' (open after closing)"); /* Remove testfile */ try_unlink("file05"); } /* Test all possible modes, try_open not only opens file (sometimes) * * but closes files too (when opened) */ if ((n = creat("file05", 0700)) < 0) /* no other files left */ err(5, CREAT, "'file05' (2nd time)"); else { try_close(n, "file05"); for (mode = 0; mode <= 0700; mode += 0100) { if (chmod("file05", mode) != OK) err(5, CHMOD, "'file05'"); if (mode <= 0100) { try_open("file05", R, FAIL); try_open("file05", W, FAIL); try_open("file05", RW, FAIL); } else if (mode >= 0200 && mode <= 0300) { try_open("file05", R, FAIL); try_open("file05", W, FF); try_open("file05", RW, FAIL); } else if (mode >= 0400 && mode <= 0500) { try_open("file05", R, FF); try_open("file05", W, FAIL); try_open("file05", RW, FAIL); } else { try_open("file05", R, FF); try_open("file05", W, FF); try_open("file05", RW, FF); } } } /* Test opening existing file */ if ((n = open("drwx/rwx", R)) < 0) err(13, OPEN, "existing file"); else { /* test close after DUP */ if ((n1 = dup(n)) < 0) err(13, DUP, "'drwx/rwx'"); else { try_close(n1, "duplicated fd 'drwx/rwx'"); if (read(n1, b, ARSIZE) != FAIL) err(11, READ, "on closed dupped fd 'drwx/rwx'"); else check(READ, EBADF); if (read(n, b, ARSIZE) == FAIL) /* should read an eof */ err(13, READ, "on fd '/drwx/rwx'"); } try_close(n, "'drwx/rwx'"); } /* Test close after PIPE */ if (pipe(fd) < 0) err(13, PIPE, NIL); else { try_close(fd[1], "duplicated fd 'fd[1]'"); /* Fd[1] really should be closed now; check */ clear_array(b); if (read(fd[0], b, ARSIZE) != READ_EOF) err(11, READ, "read on empty pipe (and fd[1] was closed)"); try_close(fd[0], "duplicated fd 'fd[0]'"); } /* Try to open a non-existing file */ if (open("non-file", R) != FAIL) err(11, OPEN, "open non-executable file"); else check(OPEN, ENOENT); /* Dir does not exist */ if (open("dzzz/file05", R) != FAIL) err(11, OPEN, "open in an non-searchable dir"); else check(OPEN, ENOENT); /* Dir is not searchable */ if (n = open("drw-/rwx", R) != FAIL) err(11, OPEN, "open in an non-searchabledir"); else check(OPEN, EACCES); /* Unlink testfile */ try_unlink("file05"); /* File is not readable */ if (open("drwx/-wx", R) != FAIL) err(11, OPEN, "open unreadable file for reading"); else check(OPEN, EACCES); /* File is not writable */ if (open("drwx/r-x", W) != FAIL) err(11, OPEN, "open unwritable file for writing"); else check(OPEN, EACCES); /* Try opening more than MAXOPEN ('extra' (19-8-85)) files */ if ((n = open_alot()) != MAXOPEN) err(13, OPEN, "MAXOPEN files"); else /* Maximum # of files opened now, another open should fail * because * all filedescriptors have already been used. */ if (open("drwx/rwx", RW) != FAIL) err(9, OPEN, "open"); else check(OPEN, EMFILE); if (close_alot(n) != n) err(5, CLOSE, "all opened files"); /* Can close make mistakes ? */ if (close(-1) != FAIL) err(2, CLOSE, "filedes"); else check(CLOSE, EBADF); } /* test05 */ void try_open(fname, mode, test) int mode, test; char *fname; { int n; if ((n = open(fname, mode)) != test) err(11, OPEN, "break through filepermission with an incorrect mode"); if (n != FAIL) try_close(n, fname); /* cleanup */ } /* try_open */ /***************************************************************************** * test LSEEK * ****************************************************************************/ void test06() { char a[ARSIZE], b[ARSIZE]; int fd; if ((fd = open("drwx/rwx", RW)) != FF) /* there should be no */ err(13, OPEN, "'drwx/rwx'"); /* other open files */ else { init_array(a); if (write(fd, a, 10) != 10) err(1, WRITE, "bad"); else { /* Lseek back to begin file */ if (lseek(fd, 0L, SEEK_SET) != 0) err(5, LSEEK, "to begin file"); else if (read(fd, b, 10) != 10) err(1, READ, "bad"); else if (comp_array(a, b, 10) != OK) err(7, LSEEK, "values r/w after lseek to begin"); /* Lseek to endoffile */ if (lseek(fd, 0L, SEEK_END) != 10) err(5, LSEEK, "to end of file"); else if (read(fd, b, 1) != READ_EOF) err(7, LSEEK, "read at end of file"); /* Lseek beyond file */ if (lseek(fd, 10L, SEEK_CUR) != 20) err(5, LSEEK, "beyond end of file"); else if (write(fd, a, 10) != 10) err(1, WRITE, "bad"); else { /* Lseek to begin second write */ if (lseek(fd, 20L, SEEK_SET) != 20) err(5, LSEEK, "'/drwx/rwx'"); if (read(fd, b, 10) != 10) err(1, READ, "bad"); else if (comp_array(a, b, 10) != OK) err(7, LSEEK, "values read after lseek MAXOPEN"); } } /* Lseek to position before begin of file */ if (lseek(fd, -1L, 0) != FAIL) err(11, LSEEK, "lseek before beginning of file"); try_close(fd, "'drwx/rwx'"); } /* Lseek on invalid filediscriptor */ if (lseek(-1, 0L, SEEK_SET) != FAIL) err(2, LSEEK, "filedes"); else check(LSEEK, EBADF); } /* "t3.c", created by Rene Montsma and Menno Wilcke */ /***************************************************************************** * test ACCESS * ****************************************************************************/ void test07() { /* Check with proper parameters */ if (access("drwx/rwx", RWX) != OK) err(5, ACCESS, "accessible file"); if (access("./././drwx/././rwx", 0) != OK) err(5, ACCESS, "'/./.(etc)/drwx///rwx'"); /* Check 8 files with 8 different modes on 8 accesses */ if (chdir("drwx") != OK) err(5, CHDIR, "'drwx'"); access_standards(); if (chdir("..") != OK) err(5, CHDIR, "'..'"); /* Check several wrong combinations */ /* File does not exist */ if (access("non-file", 0) != FAIL) err(11, ACCESS, "access non-existing file"); else check(ACCESS, ENOENT); /* Non-searchable dir */ if (access("drw-/rwx", 0) != FAIL) err(4, ACCESS, "'drw-'"); else check(ACCESS, EACCES); /* Searchable dir, but wrong file-mode */ if (access("drwx/--x", RWX) != FAIL) err(11, ACCESS, "a non accessible file"); else check(ACCESS, EACCES); } /* test07 */ void access_standards() { int i, mode = 0; for (i = 0; i < 8; i++) if (i == 0) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i < 2) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i == 0 || i == 2) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i < 4) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i == 0 || i == 4) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i == 0 || i == 1 || i == 4 || i == 5) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) if (i % 2 == 0) try_access(fnames[mode], i, OK); else try_access(fnames[mode], i, FAIL); mode++; for (i = 0; i < 8; i++) try_access(fnames[mode], i, OK); } /* access_standards */ void try_access(fname, mode, test) int mode, test; char *fname; { if (access(fname, mode) != test) err(100, ACCESS, "incorrect access on a file (try_access)"); } /* try_access */ /* "support.c", created by Rene Montsma and Menno Wilcke */ /* Err, make_and_fill_dirs, init_array, clear_array, comp_array, try_close, try_unlink, Remove, get_mode, check, open_alot, close_alot, clean_up_the_mess. */ /*********************************************************************** * EXTENDED FIONS * **********************************************************************/ /* First extended functions (i.e. not oldfashioned monixcalls. e(), nlcr(), octal.*/ void e(string) char *string; { printf("Test program error: %s\n", string); errct++; } void nlcr() { printf("\n"); } void str(s) char *s; { printf(s); } /***************************************************************************** * * * ERR(or) messages * * * *****************************************************************************/ void err(number, scall, name) /* Give nice error messages */ char *scall, *name; int number; { errct++; if (errct > MAXERR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); quit(); } e(""); str("\t"); switch (number) { case 0: str(scall); str(": illegal initial value."); break; case 1: str(scall); str(": "); str(name); str(" value returned."); break; case 2: str(scall); str(": accepting illegal "); str(name); str("."); break; case 3: str(scall); str(": accepting non-existing file."); break; case 4: str(scall); str(": could search non-searchable dir ("); str(name); str(")."); break; case 5: str(scall); str(": cannot "); str(scall); str(" "); str(name); str("."); break; case 7: str(scall); str(": incorrect "); str(name); str("."); break; case 8: str(scall); str(": wrong values."); break; case 9: str(scall); str(": accepting too many "); str(name); str(" files."); break; case 10: str(scall); str(": even a superuser can't do anything!"); break; case 11: str(scall); str(": could "); str(name); str("."); break; case 12: str(scall); str(": could write in non-writable dir ("); str(name); str(")."); break; case 13: str(scall); str(": wrong filedes returned ("); str(name); str(")."); break; case 100: str(scall); /* very common */ str(": "); str(name); str("."); break; default: str("errornumber does not exist!\n"); } nlcr(); } /* err */ /***************************************************************************** * * * MAKE_AND_FILL_DIRS * * * *****************************************************************************/ void make_and_fill_dirs() /* Create 8 dir.'s: "d---", "d--x", "d-w-", "d-wx", "dr--", "dr-x", * * "drw-", "drwx". * Then create 8 files * in "drwx", and some needed files in other dirs. */ { int mode, i; for (i = 0; i < 8; i++) { mkdir(dir[i], 0700); chown(dir[i], USER_ID, GROUP_ID); } setuid(USER_ID); setgid(GROUP_ID); for (mode = 0; mode < 8; mode++) put_file_in_dir("drwx", mode); put_file_in_dir("d-wx", RWX); put_file_in_dir("dr-x", RWX); put_file_in_dir("drw-", RWX); chmod_8_dirs(8); /* 8 means; 8 different modes */ } /* make_and_fill_dirs */ void put_file_in_dir(dirname, mode) char *dirname; int mode; /* Fill directory 'dirname' with file with mode 'mode'. */ { int nr; if (chdir(dirname) != OK) err(5, CHDIR, "to dirname (put_f_in_dir)"); else { /* Creat the file */ if ((nr = creat(fnames[mode], mode * 0100)) < 0) err(13, CREAT, fnames[mode]); else try_close(nr, fnames[mode]); if (chdir("..") != OK) err(5, CHDIR, "to previous dir (put_f_in_dir)"); } } /* put_file_in_dir */ /***************************************************************************** * * * MISCELLANEOUS * * * *(all about arrays, 'try_close', 'try_unlink', 'Remove', 'get_mode') * * * *****************************************************************************/ void init_array(a) char *a; { int i; i = 0; while (i++ < ARSIZE) *a++ = 'a' + (i % 26); } /* init_array */ void clear_array(b) char *b; { int i; i = 0; while (i++ < ARSIZE) *b++ = '0'; } /* clear_array */ int comp_array(a, b, range) char *a, *b; int range; { if ((range < 0) || (range > ARSIZE)) { err(100, "comp_array", "illegal range"); return(FAIL); } else { while (range-- && (*a++ == *b++)); if (*--a == *--b) return(OK); else return(FAIL); } } /* comp_array */ void try_close(filedes, name) int filedes; char *name; { if (close(filedes) != OK) err(5, CLOSE, name); } /* try_close */ void try_unlink(fname) char *fname; { if (unlink(fname) != 0) err(5, UNLINK, fname); } /* try_unlink */ void Remove(fdes, fname) int fdes; char *fname; { try_close(fdes, fname); try_unlink(fname); } /* Remove */ int get_mode(name) char *name; { struct stat stbf1; if (stat(name, &stbf1) != OK) { err(5, STAT, name); return(stbf1.st_mode); /* return a mode which will cause * * error in the calling function * * (file/dir bit) */ } else return(stbf1.st_mode & 07777); /* take last 4 bits */ } /* get_mode */ /***************************************************************************** * * * CHECK * * * *****************************************************************************/ void check(scall, number) int number; char *scall; { if (errno != number) { e(NIL); str("\t"); str(scall); str(": bad errno-value: "); put(errno); str(" should have been: "); put(number); nlcr(); } } /* check */ void put(nr) int nr; { switch (nr) { case 0: str("unused"); break; case 1: str("EPERM"); break; case 2: str("ENOENT"); break; case 3: str("ESRCH"); break; case 4: str("EINTR"); break; case 5: str("EIO"); break; case 6: str("ENXIO"); break; case 7: str("E2BIG"); break; case 8: str("ENOEXEC"); break; case 9: str("EBADF"); break; case 10: str("ECHILD"); break; case 11: str("EAGAIN"); break; case 12: str("ENOMEM"); break; case 13: str("EACCES"); break; case 14: str("EFAULT"); break; case 15: str("ENOTBLK"); break; case 16: str("EBUSY"); break; case 17: str("EEXIST"); break; case 18: str("EXDEV"); break; case 19: str("ENODEV"); break; case 20: str("ENOTDIR"); break; case 21: str("EISDIR"); break; case 22: str("EINVAL"); break; case 23: str("ENFILE"); break; case 24: str("EMFILE"); break; case 25: str("ENOTTY"); break; case 26: str("ETXTBSY"); break; case 27: str("EFBIG"); break; case 28: str("ENOSPC"); break; case 29: str("ESPIPE"); break; case 30: str("EROFS"); break; case 31: str("EMLINK"); break; case 32: str("EPIPE"); break; case 33: str("EDOM"); break; case 34: str("ERANGE"); break; } } /***************************************************************************** * * * ALOT-functions * * * *****************************************************************************/ int open_alot() { int i; for (i = 0; i < MAXOPEN; i++) if (open(file[i], R) == FAIL) break; if (i == 0) err(5, "open_alot", "at all"); return(i); } /* open_alot */ int close_alot(number) int number; { int i, count = 0; if (number > MAXOPEN) err(5, "close_alot", "accept this argument"); else for (i = FF; i < number + FF; i++) if (close(i) != OK) count++; return(number - count); /* return number of closed files */ } /* close_alot */ /***************************************************************************** * * * CLEAN UP THE MESS * * * *****************************************************************************/ void clean_up_the_mess() { int i; char dirname[6]; /* First remove 'alot' files */ for (i = 0; i < MAXOPEN; i++) try_unlink(file[i]); /* Unlink the files in dir 'drwx' */ if (chdir("drwx") != OK) err(5, CHDIR, "to 'drwx'"); else { for (i = 0; i < 8; i++) try_unlink(fnames[i]); if (chdir("..") != OK) err(5, CHDIR, "to '..'"); } /* Before unlinking files in some dirs, make them writable */ chmod_8_dirs(RWX); /* Unlink files in other dirs */ try_unlink("d-wx/rwx"); try_unlink("dr-x/rwx"); try_unlink("drw-/rwx"); /* Unlink dirs */ for (i = 0; i < 8; i++) { strcpy(dirname, "d"); strcat(dirname, fnames[i]); /* 'dirname' contains the directoryname */ rmdir(dirname); } /* FINISH */ } /* clean_up_the_mess */ void chmod_8_dirs(sw) int sw; /* if switch == 8, give all different * mode,else the same mode */ { int mode; int i; if (sw == 8) mode = 0; else mode = sw; for (i = 0; i < 8; i++) { chmod(dir[i], 040000 + mode * 0100); if (sw == 8) mode++; } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define NB 30L #define NBOUNDS 6 int errct, subtest, passes, pipesigs; long t1; char aa[100]; char b[4] = {0, 1, 2, 3}, c[4] = {10, 20, 30, 40}, d[4] = {6, 7, 8, 9}; long bounds[NBOUNDS] = {7, 9, 50, 519, 520, 40000L}; char buff[30000]; _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(void test19a, (void)); _PROTOTYPE(void test19b, (void)); _PROTOTYPE(void test19c, (void)); _PROTOTYPE(void test19d, (void)); _PROTOTYPE(void test19e, (void)); _PROTOTYPE(void test19f, (void)); _PROTOTYPE(void test19g, (void)); _PROTOTYPE(void clraa, (void)); _PROTOTYPE(void pipecatcher, (int s)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m; m = (argc == 2 ? atoi(argv[1]) : 0xFFFF); if (geteuid() == 0 || getuid() == 0) { printf("Test 19 cannot run as root; test aborted\n"); exit(1); } system("rm -rf DIR_19; mkdir DIR_19"); chdir("DIR_19"); printf("Test 19 "); fflush(stdout); for (i = 0; i < 4; i++) { if (m & 0001) test19a(); if (m & 0002) test19b(); if (m & 0004) test19c(); if (m & 0010) test19d(); if (m & 0020) test19e(); if (m & 0040) test19f(); if (m & 0100) test19g(); passes++; } quit(); return(-1); /* impossible */ } void test19a() { /* Test open with O_CREAT and O_EXCL. */ int fd; subtest = 1; if ( (fd = creat("T19.a1", 0777)) != 3) e(1); /* create test file */ if (close(fd) != 0) e(2); if ( (fd = open("T19.a1", O_RDONLY)) != 3) e(3); if (close(fd) != 0) e(4); if ( (fd = open("T19.a1", O_WRONLY)) != 3) e(5); if (close(fd) != 0) e(6); if ( (fd = open("T19.a1", O_RDWR)) != 3) e(7); if (close(fd) != 0) e(8); /* See if O_CREAT actually creates a file. */ if ( (fd = open("T19.a2", O_RDONLY)) != -1) e(9); /* must fail */ if ( (fd = open("T19.a2", O_RDONLY | O_CREAT, 0444)) != 3) e(10); if (close(fd) != 0) e(11); if ( (fd = open("T19.a2", O_RDONLY)) != 3) e(12); if (close(fd) != 0) e(13); if ( (fd = open("T19.a2", O_WRONLY)) != -1) e(14); if ( (fd = open("T19.a2", O_RDWR)) != -1) e(15); /* See what O_CREAT does on an existing file. */ if ( (fd = open("T19.a2", O_RDONLY | O_CREAT, 0777)) != 3) e(16); if (close(fd) != 0) e(17); if ( (fd = open("T19.a2", O_RDONLY)) != 3) e(18); if (close(fd) != 0) e(19); if ( (fd = open("T19.a2", O_WRONLY)) != -1) e(20); if ( (fd = open("T19.a2", O_RDWR)) != -1) e(21); /* See if O_EXCL works. */ if ( (fd = open("T19.a2", O_RDONLY | O_EXCL)) != 3) e(22); if (close(fd) != 0) e(23); if ( (fd = open("T19.a2", O_WRONLY | O_EXCL)) != -1) e(24); if ( (fd = open("T19.a3", O_RDONLY | O_EXCL)) != -1) e(25); if ( (fd = open("T19.a3", O_RDONLY | O_CREAT | O_EXCL, 0444)) != 3) e(26); if (close(fd) != 0) e(27); errno = 0; if ( (fd = open("T19.a3", O_RDONLY | O_CREAT | O_EXCL, 0444)) != -1) e(28); if (errno != EEXIST) e(29); if (unlink("T19.a1") != 0) e(30); if (unlink("T19.a2") != 0) e(31); if (unlink("T19.a3") != 0) e(32); } void test19b() { /* Test open with O_APPEND and O_TRUNC. */ int fd; subtest = 2; if ( (fd = creat("T19.b1", 0777)) != 3) e(1); /* create test file */ if (write(fd, b, 4) != 4) e(2); if (close(fd) != 0) e(3); clraa(); if ( (fd = open("T19.b1", O_RDWR | O_APPEND)) != 3) e(4); if (read(fd, aa, 100) != 4) e(5); if (aa[0] != 0 || aa[1] != 1 || aa[2] != 2 || aa[3] != 3) e(6); if (close(fd) != 0) e(7); if ( (fd = open("T19.b1", O_RDWR | O_APPEND)) != 3) e(8); if (write(fd, b, 4) != 4) e(9); if (lseek(fd, 0L, SEEK_SET) != 0L) e(10); clraa(); if (read(fd, aa, 100) != 8) e(11); if (aa[4] != 0 || aa[5] != 1 || aa[6] != 2 || aa[7] != 3) e(12); if (close(fd) != 0) e(13); if ( (fd = open("T19.b1", O_RDWR | O_TRUNC)) != 3) e(14); if (read(fd, aa, 100) != 0) e(15); if (close(fd) != 0) e(16); unlink("T19.b1"); } void test19c() { /* Test program for open(), close(), creat(), read(), write(), lseek(). */ int i, n, n1, n2; subtest = 3; if ((n = creat("foop", 0777)) != 3) e(1); if ((n1 = creat("foop", 0777)) != 4) e(2); if ((n2 = creat("/", 0777)) != -1) e(3); if (close(n) != 0) e(4); if ((n = open("foop", O_RDONLY)) != 3) e(5); if ((n2 = open("nofile", O_RDONLY)) != -1) e(6); if (close(n1) != 0) e(7); /* N is the only one open now. */ for (i = 0; i < 2; i++) { n1 = creat("File2", 0777); if (n1 != 4) { printf("creat yielded fd=%d, expected 4\n", n1); e(8); } if ((n2 = open("File2", O_RDONLY)) != 5) e(9); if (close(n1) != 0) e(10); if (close(n2) != 0) e(11); } unlink("File2"); if (close(n) != 0) e(12); /* All files closed now. */ for (i = 0; i < 2; i++) { if ((n = creat("foop", 0777)) != 3) e(13); if (close(n) != 0) e(14); if ((n = open("foop", O_RDWR)) != 3) e(15); /* Read/write tests */ if (write(n, b, 4) != 4) e(16); if (read(n, aa, 4) != 0) e(17); if (lseek(n, 0L, SEEK_SET) != 0L) e(18); if (read(n, aa, 4) != 4) e(19); if (aa[0] != 0 || aa[1] != 1 || aa[2] != 2 || aa[3] != 3) e(20); if (lseek(n, 0L, SEEK_SET) != 0L) e(21); if (lseek(n, 2L, SEEK_CUR) != 2L) e(22); if (read(n, aa, 4) != 2) e(23); if (aa[0] != 2 || aa[1] != 3 || aa[2] != 2 || aa[3] != 3) e(24); if (lseek(n, 2L, SEEK_SET) != 2L) e(25); clraa(); if (write(n, c, 4) != 4) e(26); if (lseek(n, 0L, SEEK_SET) != 0L) e(27); if (read(n, aa, 10) != 6) e(28); if (aa[0] != 0 || aa[1] != 1 || aa[2] != 10 || aa[3] != 20) e(29); if (lseek(n, 16L, SEEK_SET) != 16L) e(30); if (lseek(n, 2040L, SEEK_END) != 2046L) e(31); if (read(n, aa, 10) != 0) e(32); if (lseek(n, 0L, SEEK_CUR) != 2046L) e(33); clraa(); if (write(n, c, 4) != 4) e(34); if (lseek(n, 0L, SEEK_CUR) != 2050L) e(35); if (lseek(n, 2040L, SEEK_SET) != 2040L) e(36); clraa(); if (read(n, aa, 20) != 10) e(37); if (aa[0] != 0 || aa[5] != 0 || aa[6] != 10 || aa[9] != 40) e(38); if (lseek(n, 10239L, SEEK_SET) != 10239L) e(39); if (write(n, d, 2) != 2) e(40); if (lseek(n, -2L, SEEK_END) != 10239L) e(41); if (read(n, aa, 2) != 2) e(42); if (aa[0] != 6 || aa[1] != 7) e(43); if (lseek(n, NB * 1024L - 2L, SEEK_SET) != NB * 1024L - 2L) e(44); if (write(n, b, 4) != 4) e(45); if (lseek(n, 0L, SEEK_SET) != 0L) e(46); if (lseek(n, -6L, SEEK_END) != 1024L * NB - 4) e(47); clraa(); if (read(n, aa, 100) != 6) e(48); if (aa[0] != 0 || aa[1] != 0 || aa[3] != 1 || aa[4] != 2|| aa[5] != 3) e(49); if (lseek(n, 20000L, SEEK_SET) != 20000L) e(50); if (write(n, c, 4) != 4) e(51); if (lseek(n, -4L, SEEK_CUR) != 20000L) e(52); if (read(n, aa, 4) != 4) e(53); if (aa[0] != 10 || aa[1] != 20 || aa[2] != 30 || aa[3] != 40) e(54); if (close(n) != 0) e(55); if ((n1 = creat("foop", 0777)) != 3) e(56); if (close(n1) != 0) e(57); unlink("foop"); } } void test19d() { /* Test read. */ int i, fd, pd[2]; char bb[100]; subtest = 4; for (i = 0; i < 100; i++) bb[i] = i; if ( (fd = creat("T19.d1", 0777)) != 3) e(1); /* create test file */ if (write(fd, bb, 100) != 100) e(2); if (close(fd) != 0) e(3); clraa(); if ( (fd = open("T19.d1", O_RDONLY)) != 3) e(4); errno = 1000; if (read(fd, aa, 0) != 0) e(5); if (errno != 1000) e(6); if (read(fd, aa, 100) != 100) e(7); if (lseek(fd, 37L, SEEK_SET) != 37L) e(8); if (read(fd, aa, 10) != 10) e(9); if (lseek(fd, 0L, SEEK_CUR) != 47L) e(10); if (read(fd, aa, 100) != 53) e(11); if (aa[0] != 47) e(12); if (read(fd, aa, 1) != 0) e(13); if (close(fd) != 0) e(14); /* Read from pipe with no writer open. */ if (pipe(pd) != 0) e(15); if (close(pd[1]) != 0) e(16); errno = 2000; if (read(pd[0], aa, 1) != 0) e(17); /* must return EOF */ if (errno != 2000) e(18); /* Read from a pipe with O_NONBLOCK set. */ if (fcntl(pd[0], F_SETFL, O_NONBLOCK) != 0) e(19); /* set O_NONBLOCK */ /* if (read(pd[0], aa, 1) != -1) e(20); if (errno != EAGAIN) e(21); */ if (close(pd[0]) != 0) e(19); if (unlink("T19.d1") != 0) e(20); } void test19e() { /* Test link, unlink, stat, fstat, dup, umask. */ int i, j, n, n1, flag; char a[255], b[255]; stN5P5Q5R5S5T5U5V5ruct stat s, s1; subtest = 5; for (i = 0; i < 2; i++) { umask(0); if ((n = creat("T3", 0702)) < 0) e(1); if (link("T3", "newT3") < 0) e(2); if ((n1 = open("newT3", O_RDWR)) < 0) e(3); for (j = 0; j < 255; j++) a[j] = j; if (write(n, a, 255) != 255) e(4); if (read(n1, b, 255) != 255) e(5); flag = 0; for (j = 0; j < 255; j++) if (a[j] != b[j]) flag++; if (flag) e(6); if (unlink("T3") < 0) e(7); if (close(n) < 0) e(8); if (close(n1) < 0) e(9); if ((n1 = open("newT3", O_RDONLY)) < 0) e(10); if (read(n1, b, 255) != 255) e(11); flag = 0; for (j = 0; j < 255; j++) if (a[j] != b[j]) flag++; if (flag) e(12); /* Now check out stat, fstat. */ if (stat("newT3", &s) < 0) e(13); if (s.st_mode != (mode_t) 0100702) e(14); /* The cast was because regular modes are * negative :-(. Anyway, the magic number * should be (S_IFREG | S_IRWXU | S_IWOTH) * for POSIX. */ if (s.st_nlink != 1) e(15); if (s.st_size != 255L) e(16); if (fstat(n1, &s1) < 0) e(17); if (s.st_dev != s1.st_dev) e(18); if (s.st_ino != s1.st_ino) e(19); if (s.st_mode != s1.st_mode) e(20); if (s.st_nlink != s1.st_nlink) e(21); if (s.st_uid != s1.st_uid) e(22); if (s.st_gid != s1.st_gid) e(23); if (s.st_rdev != s1.st_rdev) e(24); if (s.st_size != s1.st_size) e(25); if (s.st_atime != s1.st_atime) e(26); if (close(n1) < 0) e(27); if (unlink("newT3") < 0) e(28); umask(040); if ((n = creat("T3a", 0777)) < 0) e(29); if (stat("T3a", &s) < 0) e(30); if (s.st_mode != (mode_t) 0100737) e(31); /* negative :-( */ if (unlink("T3a") < 0) e(32); if (close(n1) < 0) e(33); /* Dup */ if ((n = creat("T3b", 0777)) < 0) e(34); if (close(n) < 0) e(35); if ((n = open("T3b", O_RDWR)) < 0) e(36); if ((n1 = dup(n)) != n + 1) e(37); if (write(n, a, 255) != 255) e(38); read(n1, b, 20); if (lseek(n, 0L, SEEK_SET) != 0L) e(39); if ((j = read(n1, b, 1024)) != 255) e(40); if (unlink("T3b") < 0) e(41); if (close(n) < 0) e(42); if (close(n1) < 0) e(43); } } void test19f() { /* Test large files to see if indirect block stuff works. */ int fd, i; long pos; subtest = 6; if (passes > 0) return; /* takes too long to repeat this test */ for (i = 0; i < NBOUNDS; i ++) { pos = 1024L * bounds[i]; fd = creat("T19f", 0777); if (fd < 0) e(10*i+1); if (lseek(fd, pos, 0) < 0) e(10*i+2); if (write(fd, buff, 30720) != 30720) e(10*i+3); if (close(fd) < 0) e(10*i+3); if (unlink("T19f") < 0) e(10*i+4); } } void test19g() { /* Test POSIX calls for pipe, read, write, lseek and close. */ int pipefd[2], n, i, fd; char buf[512], buf2[512]; subtest = 7; for (i = 0; i < 512; i++) buf[i] = i % 128; if (pipe(pipefd) < 0) e(1); if (write(pipefd[1], buf, 512) != 512) e(2); if (read(pipefd[0], buf2, 512) != 512) e(3); if (close(pipefd[1]) != 0) e(4); if (close(pipefd[1]) >= 0) e(5); if (read(pipefd[0], buf2, 1) != 0) e(6); if (close(pipefd[0]) != 0) e(7); /* Test O_NONBLOCK on pipes. */ if (pipe(pipefd) < 0) e(8); if (fcntl(pipefd[0], F_SETFL, O_NONBLOCK) != 0) e(9); if (read(pipefd[0], buf2, 1) != -1) e(10); if (errno != EAGAIN) e(11); if (close(pipefd[0]) != 0) e(12); if (close(pipefd[1]) != 0) e(13); /* Test read and lseek. */ if ( (fd = creat("T19.g1", 0777)) != 3) e(14); /* create test file */ if (write(fd, buf, 512) != 512) e(15); errno = 3000; if (read(fd, buf2, 512) != -1) e(16); if (errno != EBADF) e(17); if (close(fd) != 0) e(18); if ( (fd = open("T19.g1", O_RDWR)) != 3) e(19); if (read(fd, buf2, 512) != 512) e(20); if (read(fd, buf2, 512) != 0) e(21); if (lseek(fd, 100L, SEEK_SET) != 100L) e(22); if (read(fd, buf2, 512) != 412) e(23); if (lseek(fd, 1000L, SEEK_SET) != 1000L) e(24); /* Test write. */ if (lseek(fd, -1000L, SEEK_CUR) != 0) e(25); if (write(fd, buf, 512) != 512) e(26); if (lseek(fd, 2L, SEEK_SET) != 2) e(27); if (write(fd, buf, 3) != 3) e(28); if (lseek(fd, -2L, SEEK_CUR) != 3) e(29); if (write(fd, &buf[30], 1) != 1) e(30); if (lseek(fd, 2L, SEEK_CUR) != 6) e(31); if (write(fd, &buf[60], 1) != 1) e(32); if (lseek(fd, -512L, SEEK_END) != 0) e(33); if (read(fd, buf2, 8) != 8) e(34); errno = 4000; if (buf2[0] != 0 || buf2[1] != 1 || buf2[2] != 0 || buf2[3] != 30) e(35); if (buf2[4] != 2 || buf2[5] != 5 || buf2[6] != 60 || buf2[7] != 7) e(36); /* Turn the O_APPEND flag on. */ if (fcntl(fd, F_SETFL, O_APPEND) != 0) e(37); if (lseek(fd, 0L, SEEK_SET) != 0) e(38); if (write(fd, &buf[100], 1) != 1) e(39); if (lseek(fd, 0L, SEEK_SET) != 0) e(40); if (read(fd, buf2, 10) != 10) e(41); if (buf2[0] != 0) e(42); if (lseek(fd, -1L, SEEK_END) != 512) e(43); if (read(fd, buf2, 10) != 1) e(44); if (buf2[0] != 100) e(45); if (close(fd) != 0) e(46); /* Now try write with O_NONBLOCK. */ if (pipe(pipefd) != 0) e(47); if (fcntl(pipefd[1], F_SETFL, O_NONBLOCK) != 0) e(48); if (write(pipefd[1], buf, 512) != 512) e(49); if (write(pipefd[1], buf, 512) != 512) e(50); errno = 0; for (i = 1; i < 20; i++) { n = write(pipefd[1], buf, 512); if (n == 512) continue; if (n != -1 || errno != EAGAIN) {e(51); break;} } if (read(pipefd[0], buf, 512) != 512) e(52); if (close(pipefd[0]) != 0) e(53); /* Write to a pipe with no reader. This should generate a signal. */ signal(SIGPIPE, pipecatcher); errno = 0; if (write(pipefd[1], buf, 1) != -1) e(54); if (errno != EPIPE) e(55); if (pipesigs != passes + 1) e(56); /* we should have had the sig now */ if (close(pipefd[1]) != 0) e(57); errno = 0; if (write(100, buf, 512) != -1) e(58); if (errno != EBADF) e(59); if (unlink("T19.g1") != 0) e(60); } void clraa() { int i; for (i = 0; i < 100; i++) aa[i] = 0; } void pipecatcher(s) int s; /* it is supposed to have an arg */ { pipesigs++; } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); fflush(stdout); /* aargh! Most results go to stdout and are * messed up by perror going to stderr. * Should replace perror by printf and strerror * in all the tests. */ errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 2 */ #include #include #include #include #include #include #include #include #include #define ITERATIONS 5 #define MAX_ERROR 4 int is, array[4], parsigs, parcum, sigct, cumsig, errct, subtest; int iteration, kk = 0, errct = 0; char buf[2048]; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test2a, (void)); _PROTOTYPE(void test2b, (void)); _PROTOTYPE(void test2c, (void)); _PROTOTYPE(void test2d, (void)); _PROTOTYPE(void test2e, (void)); _PROTOTYPE(void test2f, (void)); _PROTOTYPE(void test2g, (void)); _PROTOTYPE(void test2h, (void)); _PROTOTYPE(void sigpip, (int s)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void e, (int n)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 2 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_02; mkdir DIR_02"); chdir("DIR_02"); for (i = 0; i < ITERATIONS; i++) { iteration = i; if (m & 0001) test2a(); if (m & 0002) test2b(); if (m & 0004) test2c(); if (m & 0010) test2d(); if (m & 0020) test2e(); if (m & 0040) test2f(); if (m & 0100) test2g(); if (m & 0200) test2h(); } subtest = 100; if (cumsig != ITERATIONS) e(101); quit(); return(-1); /* impossible */ } void test2a() { /* Test pipes */ int fd[2]; int n, i, j, q = 0; subtest = 1; if (pipe(fd) < 0) { printf("pipe error. errno= %d\n", errno); errct++; quit(); } i = fork(); if (i < 0) { printf("fork failed\n"); errct++; quit(); } if (i != 0) { /* Parent code */ close(fd[0]); for (i = 0; i < 2048; i++) buf[i] = i & 0377; for (q = 0; q < 8; q++) { if (write(fd[1], buf, 2048) < 0) { printf("write pipe err. errno=%d\n", errno); errct++; quit(); } } close(fd[1]); wait(&q); if (q != 256 * 58) { printf("wrong exit code %d\n", q); errct++; quit(); } } else { /* Child code */ close(fd[1]); for (q = 0; q < 32; q++) { n = read(fd[0], buf, 512); if (n != 512) { printf("read yielded %d bytes, not 512\n", n); errct++; quit(); } for (j = 0; j < n; j++) if ((buf[j] & 0377) != (kk & 0377)) { printf("wrong data: %d %d %d \n ", j, buf[j] & 0377, kk & 0377); } else { kk++; } } exit(58); } } void test2b() { int fd[2], n; char buf[4]; subtest = 2; sigct = 0; signal(SIGPIPE, sigpip); pipe(fd); if (fork()) { /* Parent */ close(fd[0]); while (sigct == 0) { write(fd[1], buf, 1); } wait(&n); } else { /* Child */ close(fd[0]); close(fd[1]); exit(0); } } void test2c() { int n; subtest = 3; signal(SIGINT, SIG_DFL); is = 0; if ((array[is++] = fork()) > 0) { if ((array[is++] = fork()) > 0) { if ((array[is++] = fork()) > 0) { if ((array[is++] = fork()) > 0) { signal(SIGINT, SIG_IGN); kill(array[0], SIGINT); kill(array[1], SIGINT); kill(array[2], SIGINT); kill(array[3], SIGINT); wait(&n); wait(&n); wait(&n); wait(&n); } else { pause(); } } else { pause(); } } else { pause(); } } else { pause(); } } void test2d() { int pid, stat_loc, s; /* Test waitpid. */ subtest = 4; /* Test waitpid(pid, arg2, 0) */ pid = fork(); if (pid < 0) e(1); if (pid > 0) { /* Parent. */ s = waitpid(pid, &stat_loc, 0); if (s != pid) e(2); if (WIFEXITED(stat_loc) == 0) e(3); if (WIFSIGNALED(stat_loc) != 0) e(4); if (WEXITSTATUS(stat_loc) != 22) e(5); } else { /* Child */ exit(22); } /* Test waitpid(-1, arg2, 0) */ pid = fork(); if (pid < 0) e(6); if (pid > 0) { /* Parent. */ s = waitpid(-1, &stat_loc, 0); if (s != pid) e(7); if (WIFEXITED(stat_loc) == 0) e(8); if (WIFSIGNALED(stat_loc) != 0) e(9); if (WEXITSTATUS(stat_loc) != 33) e(10); } else { /* Child */ exit(33); } /* Test waitpid(0, arg2, 0) */ pid = fork(); if (pid < 0) e(11); if (pid > 0) { /* Parent. */ s = waitpid(0, &stat_loc, 0); if (s != pid) e(12); if (WIFEXITED(stat_loc) == 0) e(13); if (WIFSIGNALED(stat_loc) != 0) e(14); if (WEXITSTATUS(stat_loc) != 44) e(15); } else { /* Child */ exit(44); } /* Test waitpid(0, arg2, WNOHANG) */ signal(SIGTERM, SIG_DFL); pid = fork(); if (pid < 0) e(16); if (pid > 0) { /* Parent. */ s = waitpid(0, &stat_loc, WNOHANG); if (s != 0) e(17); if (kill(pid, SIGTERM) != 0) e(18); if (waitpid(pid, &stat_loc, 0) != pid) e(19); if (WIFEXITED(stat_loc) != 0) e(20); if (WIFSIGNALED(stat_loc) == 0) e(21); if (WTERMSIG(stat_loc) != SIGTERM) e(22); } else { /* Child */ pause(); } /* Test some error conditions. */ errno = 9999; if (waitpid(0, &stat_loc, 0) != -1) e(23); if (errno != ECHILD) e(24); errno = 9999; if (waitpid(0, &stat_loc, WNOHANG) != -1) e(25); if (errno != ECHILD) e(26); } void test2e() { int pid1, pid2, stat_loc, s; /* Test waitpid with two children. */ subtest = 5; if (iteration > 1) return; /* slow test, don't do it too much */ if ( (pid1 = fork())) { /* Parent. */ if ( (pid2 = fork()) ) { /* Parent. Collect second child first. */ s = waitpid(pid2, &stat_loc, 0); if (s != pid2) e(1); if (WIFEXITED(stat_loc) == 0) e(2); if (WIFSIGNALED(stat_loc) != 0) e(3); if (WEXITSTATUS(stat_loc) != 222) e(4); /* Now collect first child. */ s = waitpid(pid1, &stat_loc, 0); if (s != pid1) e(5); if (WIFEXITED(stat_loc) == 0) e(6); if (WIFSIGNALED(stat_loc) != 0) e(7); if (WEXITSTATUS(stat_loc) != 111) e(8); } else { /* Child 2. */ sleep(2); /* child 2 delays before exiting. */ exit(222); } } else { /* Child 1. */ exit(111); /* child 1 exits immediately */ } } void test2f() { /* test getpid, getppid, getuid, etc. */ pid_t pid, pid1, ppid, cpid, stat_loc, err; subtest = 6; errno = -2000; err = 0; pid = getpid(); if ( (pid1 = fork())) { /* Parent. Do nothing. */ if (wait(&stat_loc) != pid1) e(1); if (WEXITSTATUS(stat_loc) != (pid1 & 0377)) e(2); } else { /* Child. Get ppid. */ cpid = getpid(); ppid = getppid(); if (ppid != pid) err = 3; if (cpid == ppid) err = 4; exit(cpid & 0377); } if (err != 0) e(err); } void test2g() { /* test time(), times() */ time_t t1, t2; clock_t t3, t4; struct tms tmsbuf; subtest = 7; errno = -7000; /* First time(). */ t1 = -1; t2 = -2; t1 = time(&t2); if (t1 < 650000000L) e(1); /* 650000000 is Sept. 1990 */ if (t1 != t2) e(2); t1 = -1; t1 = time( (time_t *) NULL); if (t1 < 650000000L) e(3); t3 = times(&tmsbuf); sleep(1); t2 = time( (time_t *) NULL); if (t2 < 0L) e(4); if (t2 - t1 < 1) e(5); /* Now times(). */ t4 = times(&tmsbuf); if ( t4 == (clock_t) -1) e(6); if (t4 - t3 < CLOCKS_PER_SEC) e(7); if (tmsbuf.tms_utime < 0) e(8); if (tmsbuf.tms_stime < 0) e(9); if (tmsbuf.tms_cutime < 0) e(10); if (tmsbuf.tms_cstime < 0) e(11); } void test2h() { /* Test getgroups(). */ gid_t g[10]; subtest = 8; errno = -8000; if (getgroups(10, g) != 0) e(1); if (getgroups(1, g) != 0) e(2); if (getgroups(0, g) != 0) e(3); } void sigpip(s) int s; /* for ANSI */ { sigct++; cumsig++; } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(4); } } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } ^5/* POSIX test program (20). Author: Andy Tanenbaum */ /* The following POSIX calls are tested: * * opendir() * readdir() * rewinddir() * closedir() * chdir() * getcwd() */ #include #include #include #include #include #include #include #include #include #include #include #include #define DIR_NULL (DIR*) NULL #define ITERATIONS 5 #define MAX_FD 100 /* must be large enough to cause error */ #define BUF_SIZE PATH_MAX+20 #define ERR_CODE -1 /* error return */ #define RD_BUF 200 #define MAX_ERROR 4 char str[] = {"The time has come the walrus said to talk of many things.\n"}; char str2[] = {"Of ships and shoes and sealing wax, of cabbages and kings.\n"}; char str3[] = {"Of why the sea is boiling hot and whether pigs have wings\n"}; int subtest, errct; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test20a, (void)); _PROTOTYPE(void checkdir, (DIR *dirp, int t)); _PROTOTYPE(void test20b, (void)); _PROTOTYPE(void test20c, (void)); _PROTOTYPE(void test20d, (void)); _PROTOTYPE(void test20e, (void)); _PROTOTYPE(void test20f, (void)); _PROTOTYPE(void test20g, (void)); _PROTOTYPE(void test20h, (void)); _PROTOTYPE(void test20i, (void)); _PROTOTYPE(void test20j, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 20 cannot run as root; test aborted\n"); exit(1); } if (argc == 2) m = atoi(argv[1]); printf("Test 20 "); fflush(stdout); system("rm -rf DIR_20; mkdir DIR_20"); chdir("DIR_20"); for (i = 0; i < ITERATIONS; i++) { if (m & 00001) test20a(); /* test for correct operation */ if (m & 00002) test20b(); /* test general error handling */ if (m & 00004) test20c(); /* test for EMFILE error */ if (m & 00010) test20d(); /* test chdir() and getcwd() */ if (m & 00020) test20e(); /* test open() */ if (m & 00040) test20f(); /* test umask(), stat(), fstat() */ if (m & 00100) test20g(); /* test link() and unlink() */ if (m & 00200) test20h(); /* test access() */ if (m & 00400) test20i(); /* test chmod() and chown() */ if (m & 01000) test20j(); /* test utime() */ } quit(); return(-1); /* impossible */ } void test20a() { /* Subtest 1. Correct operation */ int f1, f2, f3, f4, f5; DIR *dirp; /* Remove any residue of previous tests. */ subtest = 1; system("rm -rf foo"); /* Create a directory foo with 5 files in it. */ mkdir("foo", 0777); if ((f1 = creat("foo/f1", 0666)) < 0) e(1); if ((f2 = creat("foo/f2", 0666)) < 0) e(2); if ((f3 = creat("foo/f3", 0666)) < 0) e(3); if ((f4 = creat("foo/f4", 0666)) < 0) e(4); if ((f5 = creat("foo/f5", 0666)) < 0) e(5); /* Now remove 2 files to create holes in the directory. */ if (unlink("foo/f2") < 0) e(6); if (unlink("foo/f4") < 0) e(7); /* Close the files. */ close(f1); close(f2); close(f3); close(f4); close(f5); /* Open the directory. */ dirp = opendir("./foo"); if (dirp == DIR_NULL) e(6); /* Read the 5 files from it. */ checkdir(dirp, 2); /* Rewind dir and test again. */ rewinddir(dirp); checkdir(dirp, 3); /* We're done. Close the directory stream. */ if (closedir(dirp) < 0) e(7); /* Remove dir for next time. */ system("rm -rf foo"); } void checkdir(dirp, t) DIR *dirp; /* poinrter to directory stream */ int t; /* subtest number to use */ { int i, f1, f2, f3, f4, f5, dot, dotdot, subt; struct dirent *d; char *s; /* Save subtest number */ subt = subtest; subtest = t; /* Clear the counters. */ f1 = 0; f2 = 0; f3 = 0; f4 = 0; f5 = 0; dot = 0; dotdot = 0; /* Read the directory. It should contain 5 entries, ".", ".." and 3 * files. */ for (i = 0; i < 5; i++) { d = readdir(dirp); if (d == (struct dirent *) NULL) { e(1); subtest = subt; /* restore subtest number */ return; } s = d->d_name; if (strcmp(s, ".") == 0) dot++; if (strcmp(s, "..") == 0) dotdot++; if (strcmp(s, "f1") == 0) f1++; if (strcmp(s, "f2") == 0) f2++; if (strcmp(s, "f3") == 0) f3++; if (strcmp(s, "f4") == 0) f4++; if (strcmp(s, "f5") == 0) f5++; } /* Check results. */ d = readdir(dirp); if (d != (struct dirent *) NULL) e(2); if (f1 != 1 || f3 != 1 || f5 != 1) e(3); if (f2 != 0 || f4 != 0) e(4); if (dot != 1 || dotdot != 1) e(5); subtest = subt; return; } void test20b() { /* Subtest 4. Test error handling. */ int fd; DIR *dirp; subtest = 4; if (opendir("foo/xyz/---") != DIR_NULL) e(1); if (errno != ENOENT) e(2); if (mkdir("foo", 0777) < 0) e(3); if (chmod("foo", 0) < 0) e(4); if (opendir("foo/xyz/--") != DIR_NULL) e(5); if (errno != EACCES) e(6); if (chmod("foo", 0777) != 0) e(7); if (rmdir("foo") != 0) e(8); if ((fd = creat("abc", 0666)) < 0) e(9); if (close(fd) < 0) e(10); if (opendir("abc/xyz") != DIR_NULL) e(11); if (errno != ENOTDIR) e(12); if ((dirp = opendir(".")) == DIR_NULL) e(13); if (closedir(dirp) != 0) e(14); if (unlink("abc") != 0) e(15); } void test20c() { /* Subtest 5. See what happens if we open too many directory streams. */ int i, j; DIR *dirp[MAX_FD]; subtest = 5; for (i = 0; i < MAX_FD; i++) { dirp[i] = opendir("."); if (dirp[i] == (DIR *) NULL) { /* We have hit the limit. */ if (errno != EMFILE && errno != ENOMEM) e(1); for (j = 0; j < i; j++) { if (closedir(dirp[j]) != 0) e(2); /* close */ } return; } } /* Control should never come here. This is an error. */ e(3); for (i = 0; i < MAX_FD; i++) closedir(dirp[i]); /* don't check */ } void test20d() { /* Test chdir and getcwd(). */ int fd; char *s; char base[BUF_SIZE], buf2[BUF_SIZE], tmp[BUF_SIZE]; subtest = 6; if (getcwd(base, BUF_SIZE) == (char *) NULL) e(1); /* get test dir's path */ if (system("rm -rf Dir") != 0) e(2); /* remove residue of previous test */ if (mkdir("Dir", 0777) < 0) e(3); /* create directory called "Dir" */ /* Change to Dir and verify that it worked. */ if (chdir("Dir") < 0) e(4); /* go to Dir */ s = getcwd(buf2, BUF_SIZE); /* get full path of Dir */ if (s == (char *) NULL) e(5); /* check for error return */ if (s != buf2) e(6); /* if successful, first arg is returned */ strcpy(tmp, base); /* concatenate base name and "/Dir" */ strcat(tmp, "/"); strcat(tmp, "Dir"); if (strcmp(tmp, s) != 0) e(7); /* Change to ".." and verify that it worked. */ if (chdir("..") < 0) e(8); if (getcwd(buf2, BUF_SIZE) != buf2) e(9); if (strcmp(buf2, base) != 0) e(10); /* Now make calls that do nothing, but do it in a strange way. */ if (chdir("Dir/..") < 0) e(11); if (getcwd(buf2, BUF_SIZE) != buf2) e(12); if (strcmp(buf2, base) != 0) e(13); if (chdir("Dir/../Dir/..") < 0) e(14); if (getcwd(buf2, BUF_SIZE) != buf2) e(15); if (strcmp(buf2, base) != 0) e(16); if (chdir("Dir/../Dir/../Dir/../Dir/../Dir/../Dir/../Dir/..") < 0) e(17); if (getcwd(buf2, BUF_SIZE) != buf2) e(18); if (strcmp(buf2, base) != 0) e(19); /* Make Dir unreadable and unsearchable. Check error message. */ if (chmod("Dir", 0) < 0) e(20); if (chdir("Dir") >= 0) e(21); if (errno != EACCES) e(22); /* Check error message for bad path. */ if (chmod("Dir", 0777) < 0) e(23); if (chdir("Dir/x/y") != ERR_CODE) e(24); if (errno != ENOENT) e(25); if ( (fd=creat("Dir/x", 0777)) < 0) e(26); if (close(fd) != 0) e(27); if (chdir("Dir/x/y") != ERR_CODE) e(28); if (errno != ENOTDIR) e(29); /* Check empty string. */ if (chdir("") != ERR_CODE) e(30); if (errno != ENOENT) e(31); /* Remove the directory. */ if (unlink("Dir/x") != 0) e(32); if (system("rmdir Dir") != 0) e(33); } void test20e() { /* Test open. */ int fd, bytes, bytes2; char buf[RD_BUF]; subtest = 7; unlink("T20"); /* get rid of it in case it exists */ /* Create a test file. */ bytes = strlen(str); bytes2 = strlen(str2); if ((fd = creat("T20", 0777)) < 0) e(1); if (write(fd, str, bytes) != bytes) e(2); /* T20 now has 'byg5i5j5k5l5m5n5o5p5q5r5s5tes' bytes */ if (close(fd) != 0) e(3); /* Test opening a file with O_RDONLY. */ if ((fd = open("T20", O_RDONLY)) < 0) e(4); buf[0] = '\0'; if (read(fd, buf, RD_BUF) != bytes) e(5); if (strncmp(buf, str, bytes) != 0) e(6); if (close(fd) < 0) e(7); /* Test the same thing, only with O_RDWR now. */ if ((fd = open("T20", O_RDWR)) < 0) e(8); buf[0] = '\0'; if (read(fd, buf, RD_BUF) != bytes) e(9); if (strncmp(buf, str, bytes) != 0) e(10); if (close(fd) < 0) e(11); /* Try opening and reading with O_WRONLY. It should fail. */ if ((fd = open("T20", O_WRONLY)) < 0) e(12); buf[0] = '\0'; if (read(fd, buf, RD_BUF) >= 0) e(13); if (close(fd) != 0) e(14); /* Test O_APPEND. */ if ((fd = open("T20", O_RDWR | O_APPEND)) < 0) e(15); if (lseek(fd, 0L, SEEK_SET) < 0) e(16); /* go to start of file */ if ( write(fd, str2, bytes2) != bytes2) e(17); /* write at start of file */ if (lseek(fd, 0L, SEEK_SET) < 0) e(18); /* go back to start again */ if (read(fd, buf, RD_BUF) != bytes + bytes2) e(19); /* read whole file */ if (strncmp(buf, str, bytes) != 0) e(20); if (close(fd) != 0) e(21); /* Get rid of the file. */ if (unlink("T20") < 0) e(22); } void test20f() { /* Test stat, fstat, umask. */ int i, fd; mode_t m1; struct stat stbuf1, stbuf2; time_t t, t1; subtest = 8; m1 = umask(~0777); if (system("rm -rf foo xxx") != 0) e(1); if ((fd = creat("foo", 0777)) < 0) e(2); if (stat("foo", &stbuf1) < 0) e(3); if (fstat(fd, &stbuf2) < 0) e(4); if (stbuf1.st_mode != stbuf2.st_mode) e(5); if (stbuf1.st_ino != stbuf2.st_ino) e(6); if (stbuf1.st_dev != stbuf2.st_dev) e(7); if (stbuf1.st_nlink != stbuf2.st_nlink) e(8); if (stbuf1.st_uid != stbuf2.st_uid) e(9); if (stbuf1.st_gid != stbuf2.st_gid) e(10); if (stbuf1.st_size != stbuf2.st_size) e(11); if (stbuf1.st_atime != stbuf2.st_atime) e(12); if (stbuf1.st_mtime != stbuf2.st_mtime) e(13); if (stbuf1.st_ctime != stbuf2.st_ctime) e(14); if (!S_ISREG(stbuf1.st_mode)) e(15); if (S_ISDIR(stbuf1.st_mode)) e(16); if (S_ISCHR(stbuf1.st_mode)) e(17); if (S_ISBLK(stbuf1.st_mode)) e(18); if (S_ISFIFO(stbuf1.st_mode)) e(19); if ((stbuf1.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) != 0777) e(20); if (stbuf1.st_nlink != 1) e(21); if (stbuf1.st_uid != getuid()) e(22); if (stbuf1.st_gid != getgid()) e(23); if (stbuf1.st_size != 0L) e(24); /* First unlink, then close -- harder test */ if (unlink("foo") < 0) e(25); if (close(fd) < 0) e(26); /* Now try umask a bit more. */ fd = 0; if ((i = umask(~0704)) != 0) e(27); if ((fd = creat("foo", 0777)) < 0) e(28); if (stat("foo", &stbuf1) < 0) e(29); if (fstat(fd, &stbuf2) < 0) e(30); if (stbuf1.st_mode != stbuf2.st_mode) e(31); if ((stbuf1.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) != 0704) e(32); /* First unlink, then close -- harder test */ if (unlink("foo") < 0) e(33); if (close(fd) < 0) e(34); if (umask(m1) != 073) e(35); /* Test some errors. */ if (system("mkdir Dir; date >Dir/x; chmod 666 Dir") != 0) e(36); if (stat("Dir/x", &stbuf1) >= 0) e(37); if (errno != EACCES) e(38); if (stat("......", &stbuf1) >= 0) e(39); if (errno != ENOENT) e(40); if (stat("", &stbuf1) >= 0) e(41); if (errno != ENOENT) e(42); if (stat("xxx/yyy/zzz", &stbuf1) >= 0) e(43); if (errno != ENOENT) e(44); if (fstat(10000, &stbuf1) >= 0) e(45); if (errno != EBADF) e(46); if (chmod("Dir", 0777) != 0) e(47); if (system("rm -rf foo Dir") != 0) e(48); /* See if time looks reasonable. */ errno = 0; t = time(&t1); /* current time */ if (t < 650000000L) e(49); /* 650000000 is Sept. 1990 */ unlink("T20f"); fd = creat("T20f", 0777); if (fd < 0) e(50); if (close(fd) < 0) e(51); if (stat("T20f", &stbuf1) < 0) e(52); if (stbuf1.st_mtime < t) e(53); if (unlink("T20f") < 0) e(54); } void test20g() { /* Test link and unlink. */ int i, fd; struct stat stbuf; char name[4]; subtest = 9; if (system("rm -rf L? L?? Dir; mkdir Dir") != 0) e(1); if ( (fd = creat("L1", 0666)) < 0) e(2); if (fstat(fd, &stbuf) != 0) e(3); if (stbuf.st_nlink != 1) e(4); if (link("L1", "L2") != 0) e(5); if (fstat(fd, &stbuf) != 0) e(6); if (stbuf.st_nlink != 2) e(7); if (unlink("L2") != 0) e(8); if (link("L1", "L2") != 0) e(9); if (unlink("L1") != 0) e(10); if (close(fd) != 0) e(11); /* L2 exists at this point. */ if ( (fd = creat("L1", 0666)) < 0) e(12); if (stat("L1", &stbuf) != 0) e(13); if (stbuf.st_nlink != 1) e(14); if (link("L1", "Dir/L2") != 0) e(15); if (stat("L1", &stbuf) != 0) e(16); if (stbuf.st_nlink != 2) e(17); if (stat("Dir/L2", &stbuf) != 0) e(18); if (stbuf.st_nlink != 2) e(19); /* L1, L2, and Dir/L2 exist at this point. */ if (unlink("Dir/L2") != 0) e(20); if (link("L1", "Dir/L2") != 0) e(21); if (unlink("L1") != 0) e(22); if (close(fd) != 0) e(23); if (chdir("Dir") != 0) e(24); if (unlink("L2") != 0) e(25); if (chdir("..") != 0) e(26); /* L2 exists at this point. Test linking to unsearchable dir. */ if (link("L2", "Dir/L2") != 0) e(27); if (chmod("Dir", 0666) != 0) e(27); if (link("L2", "Dir/L2") != -1) e(28); if (errno != EACCES) e(29); errno = 0; if (link("Dir/L2", "L3") != -1) e(30); if (errno != EACCES) e(31); if (chmod("Dir", 0777) != 0) e(32); if (unlink("Dir/L2") != 0) e(33); if (unlink("L3") == 0) e(34); /* L2 exists at this point. Test linking to unwriteable dir. */ if (chmod("Dir", 0555) != 0) e(35); if (link("L2", "Dir/L2") != -1) e(36); if (errno != EACCES) e(37); if (chmod("Dir", 0777) != 0) e(38); /* L2 exists at this point. Test linking mode 0 file. */ if (chmod("L2", 0) != 0) e(39); if (link("L2", "L3") != 0) e(40); if (stat("L3", &stbuf) != 0) e(41); if (stbuf.st_nlink != 2) e(42); if (unlink("L2") != 0) e(43); /* L3 exists at this point. Test linking to an existing file. */ if ( (fd = creat("L1", 0666)) < 0) e(44); if (link("L1", "L3") != -1) e(45); if (errno != EEXIST) e(46); errno = 0; if (link("L1", "L1") != -1) e(47); if (errno != EEXIST) e(48); if (unlink("L3") != 0) e(49); /* L1 exists at this point. Test creating too many links. */ name[0] = 'L'; name[1] = 'x'; name[2] = 1; name[3] = 0; for (i = 2; i <= LINK_MAX; i++) { if (link("L1", name) != 0) e(50); name[2]++; } if (stat("L1", &stbuf) != 0) e(51); if (stbuf.st_nlink != LINK_MAX) e(52); if (link("L1", "L2") != -1) e(53); if (errno != EMLINK) e(54); name[2] = 1; for (i = 2; i <= LINK_MAX; i++) { if (unlink(name) != 0) e(55); name[2]++; } if (stat("L1", &stbuf) != 0) e(56); if (stbuf.st_nlink != 1) e(57); /* L1 exists. Test ENOENT. */ errno = 0; if (link("xx/L1", "L2") != -1) e(58); if (errno != ENOENT) e(59); errno = 0; if (link("L1", "xx/L2") != -1) e(60); if (errno != ENOENT) e(61); errno = 0; if (link("L4", "L5") != -1) e(62); if (errno != ENOENT) e(63); errno = 0; if (link("", "L5") != -1) e(64); if (errno != ENOENT) e(65); errno = 0; if (link("L1", "") != -1) e(66); if (errno != ENOENT) e(67); /* L1 exists. Test ENOTDIR. */ errno = 0; if (link("/dev/tty/x", "L2") != -1) e(68); if (errno != ENOTDIR) e(69); /* L1 exists. Test EPERM. */ if (link(".", "L2") != -1) e(70); if (errno != EPERM) e(71); /* L1 exists. Test unlink. */ if (link("L1", "Dir/L1") != 0) e(72); if (chmod("Dir", 0666) != 0) e(73); if (unlink("Dir/L1") != -1) e(74); if (errno != EACCES) e(75); errno = 0; if (chmod("Dir", 0555) != 0) e(76); if (unlink("Dir/L1") != -1) e(77); if (errno != EACCES) e(78); if (unlink("L7") != -1) e(79); if (errno != ENOENT) e(80); errno = 0; if (unlink("") != -1) e(81); if (errno != ENOENT) e(82); if (unlink("Dir/L1/L2") != -1) e(83); if (errno != ENOTDIR) e(84); if (chmod("Dir", 0777) != 0) e(85); if (unlink("Dir/L1") != 0) e(86); if (unlink("Dir") != -1) e(87); if (errno != EPERM) e(88); if (unlink("L1") != 0) e(89); if (system("rm -rf Dir") != 0) e(90); if (close(fd) != 0) e(91); } void test20h() { /* Test access. */ int fd; subtest = 10; system("rm -rf A1"); if ( (fd = creat("A1", 0777)) < 0) e(1); if (close(fd) != 0) e(2); if (access("A1", R_OK) != 0) e(3); if (access("A1", W_OK) != 0) e(4); if (access("A1", X_OK) != 0) e(5); if (access("A1", (R_OK|W_OK|X_OK)) != 0) e(6); if (chmod("A1", 0400) != 0) e(7); if (access("A1", R_OK) != 0) e(8); if (access("A1", W_OK) != -1) e(9); if (access("A1", X_OK) != -1) e(10); if (access("A1", (R_OK|W_OK|X_OK)) != -1) e(11); if (chmod("A1", 0077) != 0) e(12); if (access("A1", R_OK) != -1) e(13); if (access("A1", W_OK) != -1) e(14); if (access("A1", X_OK) != -1) e(15); if (access("A1", (R_OK|W_OK|X_OK)) != -1) e(16); if (errno != EACCES) e(17); if (access("", R_OK) != -1) e(18); if (errno != ENOENT) e(19); if (access("./A1/x", R_OK) != -1) e(20); if (errno != ENOTDIR) e(21); if (unlink("A1") != 0) e(22); } void test20i() { /* Test chmod. */ int fd, i; struct stat stbuf; subtest = 11; system("rm -rf A1"); if ( (fd = creat("A1", 0777)) < 0) e(1); for (i = 0; i < 511; i++) { if (chmod("A1", i) != 0) e(100+i); if (fstat(fd, &stbuf) != 0) e(200+i); if ( (stbuf.st_mode&(S_IRWXU|S_IRWXG|S_IRWXO)) != i) e(300+i); } if (close(fd) != 0) e(2); if (chmod("A1/x", 0777) != -1) e(3); if (errno != ENOTDIR) e(4); if (chmod("Axxx", 0777) != -1) e(5); if (errno != ENOENT) e(6); errno = 0; if (chmod ("", 0777) != -1) e(7); if (errno != ENOENT) e(8); /* Now perform limited chown tests. These should work even as non su */ i = getuid(); /* DEBUG -- Not yet implemented if (chown("A1", i, 0) != 0) e(9); if (chown("A1", i, 1) != 0) e(10); if (chown("A1", i, 2) != 0) e(11); if (chown("A1", i, 3) != 0) e(12); if (chown("A1", i, 4) != 0) e(13); if (chown("A1", i, 0) != 0) e(14); */ if (unlink("A1") != 0) e(9); } void test20j() { /* Test utime. */ int fd; time_t tloc; struct utimbuf times; struct stat stbuf; subtest = 12; if (system("rm -rf A2") != 0) e(1); if ( (fd = creat("A2", 0666)) < 0) e(2); times.modtime = 100; if (utime("A2", ×) != 0) e(3); if (stat("A2", &stbuf) != 0) e(4); if (stbuf.st_mtime != 100) e(5); tloc = time((time_t *)NULL); /* get current time */ times.modtime = tloc; if (utime("A2", ×) != 0) e(6); if (stat("A2", &stbuf) != 0) e(7); if (stbuf.st_mtime != tloc) e(8); if (close(fd) != 0) e(9); if (unlink("A2") != 0) e(10); } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); fflush(stdout); /* stdout and stderr are mixed horribly */ errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* POSIX test program (21). Author: Andy Tanenbaum */ /* The following POSIX calls are tested: * * rename(), mkdir(), rmdir() */ #include #include #include #include #include #include #include #include #include #define ITERATIONS 1 #define MAX_ERROR 4 int subtest, errct; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test21a, (void)); _PROTOTYPE(void test21b, (void)); _PROTOTYPE(void test21c, (void)); _PROTOTYPE(void test21d, (void)); _PROTOTYPE(void test21e, (void)); _PROTOTYPE(void test21f, (void)); _PROTOTYPE(void test21g, (void)); _PROTOTYPE(void test21h, (void)); _PROTOTYPE(void test21i, (void)); _PROTOTYPE(void test21k, (void)); _PROTOTYPE(void test21l, (void)); _PROTOTYPE(void test21m, (void)); _PROTOTYPE(void test21n, (void)); _PROTOTYPE(void test21o, (void)); _PROTOTYPE(int get_link, (char *name)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 21 cannot run as root; test aborted\n"); exit(1); } if (argc == 2) m = atoi(argv[1]); printf("Test 21 "); fflush(stdout); system("rm -rf DIR_21; mkdir DIR_21"); chdir("DIR_21"); for (i = 0; i < ITERATIONS; i++) { if (m & 00001) test21a(); if (m & 00002) test21b(); if (m & 00004) test21c(); if (m & 00010) test21d(); if (m & 00020) test21e(); if (m & 00040) test21f(); if (m & 01000) test21g(); if (m & 00200) test21h(); if (m & 00400) test21i(); if (m & 01000) test21k(); if (m & 02000) test21l(); if (m & 04000) test21m(); if (m & 010000) test21n(); if (m & 020000) test21o(); } quit(); return(-1); /* impossible */ } void test21a() { /* Test rename(). */ int fd, fd2; char buf[PATH_MAX+1], buf1[PATH_MAX+1], buf2[PATH_MAX+1]; struct stat stat1, stat2; subtest = 1; unlink("A1"); /* get rid of it if it exists */ unlink("A2"); /* get rid of it if it exists */ unlink("A3"); /* get rid of it if it exists */ unlink("A4"); /* get rid of it if it exists */ unlink("A5"); /* get rid of it if it exists */ unlink("A6"); /* get rid of it if it exists */ unlink("A7"); /* get rid of it if it exists */ /* Basic test. Rename A1 to A2 and then A2 to A3. */ if ( (fd=creat("A1", 0666)) < 0) e(1); if (write(fd, buf, 20) != 20) e(2); if (close(fd) < 0) e(3); if (rename("A1", "A2") < 0) e(4); if ( (fd=open("A2", O_RDONLY)) < 0) e(5); if (rename("A2", "A3") < 0) e(6); if ( (fd2=open("A3", O_RDONLY)) < 0) e(7); if (close(fd) != 0) e(8); if (close(fd2) != 0) e(9); if (unlink("A3") != 0) e(10); /* Now get the absolute path name of the current directory using getcwd() * and use it to test RENAME using different combinations of relative and * absolute path names. */ if (getcwd(buf, PATH_MAX) == (char *) NULL) e(11); if ( (fd = creat("A4", 0666)) < 0) e(12); if (write(fd, buf, 30) != 30) e(13); if (close(fd) != 0) e(14); strcpy(buf1, buf); strcat(buf1, "/A4"); if (rename(buf1, "A5") != 0) e(15); /* rename(absolute, relative) */ if (access("A5", 6) != 0) e(16); /* use access to see if file exists */ strcpy(buf2, buf); strcat(buf2, "/A6"); if (rename("A5", buf2) != 0) e(17); /* rename(relative, absolute) */ if (access("A6", 6) != 0) e(18); if (access(buf2, 6) != 0) e(19); strcpy(buf1, buf); strcat(buf1, "/A6"); strcpy(buf2, buf); strcat(buf2, "/A7"); if (rename(buf1, buf2) != 0) e(20); /* rename(absolute, absolute) */ if (access("A7", 6) != 0) e(21); if (access(buf2, 6) != 0) e(22); /* Try renaming using names like "./A8" */ if (rename("A7", "./A8") != 0) e(23); if (access("A8", 6) != 0) e(24); if (rename("./A8", "A9") != 0) e(25); if (access("A9", 6) != 0) e(26); if (rename("./A9", "./A10") != 0) e(27); if (access("A10", 6) != 0) e(28); if (access("./A10", 6) != 0) e(29); if (unlink("A10") != 0) e(30); /* Now see if directories can be renamed. */ if (system("rm -rf ?uzzy scsi") != 0) e(31); if (system("mkdir fuzzy") != 0) e(32); if (rename("fuzzy", "wuzzy") != 0) e(33); if ( (fd=creat("wuzzy/was_a_bear", 0666)) < 0) e(34); if (access("wuzzy/was_a_bear", 6) != 0) e(35); if (unlink("wuzzy/was_a_bear") != 0) e(36); if (close(fd) != 0) e(37); if (rename("wuzzy", "buzzy") != 0) e(38); if (system("rmdir buzzy") != 0) e(39); /* Now start testing the case that 'new' exists. */ if ( (fd = creat("horse", 0666)) < 0) e(40); if ( (fd2 = creat("sheep", 0666)) < 0) e(41); if (write(fd, buf, PATH_MAX) != PATH_MAX) e(42); if (write(fd2, buf, 23) != 23) e(43); if (stat("horse", &stat1) != 0) e(44); if (rename("horse", "sheep") != 0) e(45); if (stat("sheep", &stat2) != 0) e(46); if (stat1.st_dev != stat2.st_dev) e(47); if (stat1.st_ino != stat2.st_ino) e(48); if (stat2.st_size != PATH_MAX) e(49); if (access("horse", 6) == 0) e(50); if (close(fd) != 0) e(51); if (close(fd2) != 0) e(52); if (rename("sheep", "sheep") != 0) e(53); if (unlink("sheep") != 0) e(54); /* Now try renaming something to a directory that already exists. */ if (system("mkdir fuzzy wuzzy") != 0) e(55); if ( (fd = creat("fuzzy/was_a_bear", 0666)) < 0) e(56); if (close(fd) != 0) e(57); if (rename("fuzzy", "wuzzy") != 0) e(58); /* 'new' is empty dir */ if (system("mkdir scsi") != 0) e(59); if (rename("scsi", "wuzzy") == 0) e(60); /* 'new' is full dir */ if (errno != EEXIST && errno != ENOTEMPTY) e(61); /* Test 14 character names--always tricky. */ if (rename("wuzzy/was_a_bear", "wuzzy/was_not_a_bear") != 0) e(62); if (access("wuzzy/was_not_a_bear", 6) != 0) e(63); if (rename("wuzzy/was_not_a_bear", "wuzzy/was_not_a_duck") != 0) e(64); if (access("wuzzy/was_not_a_duck", 6) != 0) e(65); if (rename("wuzzy/was_not_a_duck", "wuzzy/was_a_bird") != 0) e(65); if (access("wuzzy/was_a_bird", 6) != 0) e(66); /* Test moves between directories. */ if (rename("wuzzy/was_a_bird", "beast") != 0) e(67); if (access("beast", 6) != 0) e(68); if (rename("beast", "wuzzy/was_a_cat") != 0) e(69); if (access("wuzzy/was_a_cat", 6) != 0) e(70); /* Test error conditions. 'scsi' and 'wuzzy/was_a_cat' exist now. */ if (rename("wuzzy/was_a_cat", "wuzzy/was_a_dog") != 0) e(71); if (access("wuzzy/was_a_dog", 6) != 0) e(72); if (chmod("wuzzy", 0) != 0) e(73); errno = 0; if (rename("wuzzy/was_a_dog", "wuzzy/was_a_pig") != -1) e(74); if (errno != EACCES) e(75); errno = 0; if (rename("wuzzy/was_a_dog", "doggie") != -1) e(76); if (errno != EACCES) e(77); errno = 0; if ( (fd = creat("beast", 0666)) < 0) e(78); if (close(fd) != 0) e(79); if (rename("beast", "wuzzy/was_a_twit") != -1) e(80); if (errno != EACCES) e(81); errno = 0; if (rename("beast", "wuzzy") != -1) e(82); if (errno != EISDIR) e(83); errno = 0; if (rename("beest", "baste") != -1) e(84); if (errno != ENOENT) e(85); errno = 0; if (rename("wuzzy", "beast") != -1) e(86); if (errno != ENOTDIR) e(87); /* Test prefix rule. */ errno = 0; if (chmod("wuzzy", 0777) != 0) e(88); if (unlink("wuzzy/was_a_dog") != 0) e(89); strcpy(buf1, buf); strcat(buf1, "/wuzzy"); if (rename(buf, buf1) != -1) e(90); if (errno != EINVAL) e(91); if (system("rm -rf wuzzy beast scsi") != 0) e(92); } void test21b() { /* Test mkdir() and rmdir(). */ int i; char name[3]; struct stat statbuf; subtest = 2; /* Simple stuff. */ if (mkdir("D1", 0700) != 0) e(1); if (stat("D1", &statbuf) != 0) e(2); if (!S_ISDIR(statbuf.st_mode)) e(3); if ( (statbuf.st_mode & 0777) != 0700) e(4); if (rmdir("D1") != 0) e(5); /* Make and remove 40 directories. By doing so, the directory has to * grow to 2 blocks. That presents plenty of opportunity for bugs. */ name[0] = 'D'; name[2] = '\0'; for (i = 0; i < 40; i++) { name[1] = 'A' + i; if (mkdir(name, 0700 + i%7) != 0) e(10+i); /* for simplicity */ } for (i = 0; i < 40; i++) { name[1] = 'A' + i; if (rmdir(name) != 0) e(50+i); } } void test21c() { /* Test mkdir() and rmdir(). */ subt{5}5~55555555555est = 3; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D1/D2", 0777) != 0) e(2); if (mkdir("D1/D2/D3", 0777) != 0) e(3); if (mkdir("D1/D2/D3/D4", 0777) != 0) e(4); if (mkdir("D1/D2/D3/D4/D5", 0777) != 0) e(5); if (mkdir("D1/D2/D3/D4/D5/D6", 0777) != 0) e(6); if (mkdir("D1/D2/D3/D4/D5/D6/D7", 0777) != 0) e(7); if (mkdir("D1/D2/D3/D4/D5/D6/D7/D8", 0777) != 0) e(8); if (mkdir("D1/D2/D3/D4/D5/D6/D7/D8/D9", 0777) != 0) e(9); if (access("D1/D2/D3/D4/D5/D6/D7/D8/D9", 7) != 0) e(10); if (rmdir("D1/D2/D3/D4/D5/D6/D7/D8/D9") != 0) e(11); if (rmdir("D1/D2/D3/D4/D5/D6/D7/D8") != 0) e(12); if (rmdir("D1/D2/D3/D4/D5/D6/D7") != 0) e(13); if (rmdir("D1/D2/D3/D4/D5/D6") != 0) e(11); if (rmdir("D1/D2/D3/D4/D5") != 0) e(13); if (rmdir("D1/D2/D3/D4") != 0) e(14); if (rmdir("D1/D2/D3") != 0) e(15); if (rmdir("D1/D2") != 0) e(16); if (rmdir("D1") != 0) e(17); } void test21d() { /* Test making directories with files and directories in them. */ int fd1, fd2, fd3, fd4, fd5, fd6, fd7, fd8, fd9; subtest = 4; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D1/D2", 0777) != 0) e(2); if (mkdir("./D1/D3", 0777) != 0) e(3); if (mkdir("././D1/D4", 0777) != 0) e(4); if ( (fd1 = creat("D1/D2/x", 0700)) < 0) e(5); if ( (fd2 = creat("D1/D2/y", 0700)) < 0) e(6); if ( (fd3 = creat("D1/D2/z", 0700)) < 0) e(7); if ( (fd4 = creat("D1/D3/x", 0700)) < 0) e(8); if ( (fd5 = creat("D1/D3/y", 0700)) < 0) e(9); if ( (fd6 = creat("D1/D3/z", 0700)) < 0) e(10); if ( (fd7 = creat("D1/D4/x", 0700)) < 0) e(11); if ( (fd8 = creat("D1/D4/y", 0700)) < 0) e(12); if ( (fd9 = creat("D1/D4/z", 0700)) < 0) e(13); if (unlink("D1/D2/z") != 0) e(14); if (unlink("D1/D2/y") != 0) e(15); if (unlink("D1/D2/x") != 0) e(16); if (unlink("D1/D3/x") != 0) e(17); if (unlink("D1/D3/z") != 0) e(18); if (unlink("D1/D3/y") != 0) e(19); if (unlink("D1/D4/y") != 0) e(20); if (unlink("D1/D4/z") != 0) e(21); if (unlink("D1/D4/x") != 0) e(22); if (rmdir("D1/D2") != 0) e(23); if (rmdir("D1/D3") != 0) e(24); if (rmdir("D1/D4") != 0) e(25); if (rmdir("D1") != 0) e(26); if (close(fd1) != 0) e(27); if (close(fd2) != 0) e(28); if (close(fd3) != 0) e(29); if (close(fd4) != 0) e(30); if (close(fd5) != 0) e(31); if (close(fd6) != 0) e(32); if (close(fd7) != 0) e(33); if (close(fd8) != 0) e(34); if (close(fd9) != 0) e(35); } void test21e() { /* Test error conditions. */ subtest = 5; if (mkdir("D1", 0677) != 0) e(1); errno = 0; if (mkdir("D1/D2", 0777) != -1) e(2); if (errno != EACCES) e(3); if (chmod ("D1", 0577) != 0) e(4); errno = 0; if (mkdir("D1/D2", 0777) != -1) e(5); if (errno != EACCES) e(6); if (chmod ("D1", 0777) != 0) e(7); errno = 0; if (mkdir("D1", 0777) != -1) e(8); if (errno != EEXIST) e(9); #if NAME_MAX == 14 if (mkdir("D1/ABCDEFGHIJKLMNOPQRSTUVWXYZ", 0777) != 0) e(10); if (access("D1/ABCDEFGHIJKLMN", 7 ) != 0) e(11); if (rmdir("D1/ABCDEFGHIJKLMNOPQ") != 0) e(12); if (access("D1/ABCDEFGHIJKLMN", 7 ) != -1) e(13); #endif errno = 0; if (mkdir("D1/D2/x", 0777) != -1) e(14); if (errno != ENOENT) e(15); /* A particularly nasty test is when the parent has mode 0. Although * this is unlikely to work, it had better not muck up the file system */ if (mkdir("D1/D2", 0777) != 0) e(16); if (chmod("D1", 0) != 0) e(17); errno = 0; if (rmdir("D1/D2") != -1) e(18); if (errno != EACCES) e(19); if (chmod("D1", 0777) != 0) e(20); if (rmdir("D1/D2") != 0) e(21); if (rmdir("D1") != 0) e(22); } void test21f() { /* The rename() function affects the link count of all the files and * directories it goes near. Test to make sure it gets everything ok. * There are four cases: * * 1. rename("d1/file1", "d1/file2"); - rename file without moving it * 2. rename("d1/file1", "d2/file2"); - move a file to another dir * 3. rename("d1/dir1", "d2/dir2"); - rename a dir without moving it * 4. rename("d1/dir1", "d2/dir2"); - move a dir to another dir * * Furthermore, a distinction has to be made when the target file exists * and when it does not exist, giving 8 cases in all. */ int fd, D1_before, D1_after, x_link, y_link; /* Test case 1: renaming a file within the same directory. */ subtest = 6; if (mkdir("D1", 0777) != 0) e(1); if ( (fd = creat("D1/x", 0777)) < 0) e(2); if (close(fd) != 0) e(3); D1_before = get_link("D1"); x_link = get_link("D1/x"); if (rename("D1/x", "D1/y") != 0) e(4); y_link = get_link("D1/y"); D1_after = get_link("D1"); if (D1_before != 2) e(5); if (D1_after != 2) e(6); if (x_link != 1) e(7); if (y_link != 1) e(8); if (access("D1/y", 7) != 0) e(9); if (unlink("D1/y") != 0) e(10); if (rmdir("D1") != 0) e(11); } void test21g() { int fd, D1_before, D1_after, D2_before, D2_after, x_link, y_link; /* Test case 2: move a file to a new directory. */ subtest = 7; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D2", 0777) != 0) e(2); if ( (fd = creat("D1/x", 0777)) < 0) e(3); if (close(fd) != 0) e(4); D1_before = get_link("D1"); D2_before = get_link("D2"); x_link = get_link("D1/x"); if (rename("D1/x", "D2/y") != 0) e(5); y_link = get_link("D2/y"); D1_after = get_link("D1"); D2_after = get_link("D2"); if (D1_before != 2) e(6); if (D2_before != 2) e(7); if (D1_after != 2) e(8); if (D2_after != 2) e(9); if (x_link != 1) e(10); if (y_link != 1) e(11); if (access("D2/y", 7) != 0) e(12); if (unlink("D2/y") != 0) e(13); if (rmdir("D1") != 0) e(14); if (rmdir("D2") != 0) e(15); } void test21h() { int D1_before, D1_after, x_link, y_link; /* Test case 3: renaming a directory within the same directory. */ subtest = 8; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D1/X", 0777) != 0) e(2); D1_before = get_link("D1"); x_link = get_link("D1/X"); if (rename("D1/X", "D1/Y") != 0) e(3); y_link = get_link("D1/Y"); D1_after = get_link("D1"); if (D1_before != 3) e(4); if (D1_after != 3) e(5); if (x_link != 2) e(6); if (y_link != 2) e(7); if (access("D1/Y", 7) != 0) e(8); if (rmdir("D1/Y") != 0) e(9); if (get_link("D1") != 2) e(10); if (rmdir("D1") != 0) e(11); } void test21i() { int D1_before, D1_after, D2_before, D2_after, x_link, y_link; /* Test case 4: move a directory to a new directory. */ subtest = 9; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D2", 0777) != 0) e(2); if (mkdir("D1/X", 0777) != 0) e(3); D1_before = get_link("D1"); D2_before = get_link("D2"); x_link = get_link("D1/X"); if (rename("D1/X", "D2/Y") != 0) e(4); y_link = get_link("D2/Y"); D1_after = get_link("D1"); D2_after = get_link("D2"); if (D1_before != 3) e(5); if (D2_before != 2) e(6); if (D1_after != 2) e(7); if (D2_after != 3) e(8); if (x_link != 2) e(9); if (y_link != 2) e(10); if (access("D2/Y", 7) != 0) e(11); if (rename("D2/Y", "D1/Z") != 0) e(12); if (get_link("D1") != 3) e(13); if (get_link("D2") != 2) e(14); if (rmdir("D1/Z") != 0) e(15); if (get_link("D1") != 2) e(16); if (rmdir("D1") != 0) e(17); if (rmdir("D2") != 0) e(18); } void test21k() { /* Now test the same 4 cases, except when the target exists. */ int fd, D1_before, D1_after, x_link, y_link; /* Test case 5: renaming a file within the same directory. */ subtest = 10; if (mkdir("D1", 0777) != 0) e(1); if ( (fd = creat("D1/x", 0777)) < 0) e(2); if (close(fd) != 0) e(3); if ( (fd = creat("D1/y", 0777)) < 0) e(3); if (close(fd) != 0) e(4); D1_before = get_link("D1"); x_link = get_link("D1/x"); if (rename("D1/x", "D1/y") != 0) e(5); y_link = get_link("D1/y"); D1_after = get_link("D1"); if (D1_before != 2) e(6); if (D1_after != 2) e(7); if (x_link != 1) e(8); if (y_link != 1) e(9); if (access("D1/y", 7) != 0) e(10); if (unlink("D1/y") != 0) e(11); if (rmdir("D1") != 0) e(12); } void test21l() { int fd, D1_before, D1_after, D2_before, D2_after, x_link, y_link; /* Test case 6: move a file to a new directory. */ subtest = 11; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D2", 0777) != 0) e(2); if ( (fd = creat("D1/x", 0777)) < 0) e(3); if (close(fd) != 0) e(4); if ( (fd = creat("D2/y", 0777)) < 0) e(5); if (close(fd) != 0) e(6); D1_before = get_link("D1"); D2_before = get_link("D2"); x_link = get_link("D1/x"); if (rename("D1/x", "D2/y") != 0) e(7); y_link = get_link("D2/y"); D1_after = get_link("D1"); D2_after = get_link("D2"); if (D1_before != 2) e(8); if (D2_before != 2) e(9); if (D1_after != 2) e(10); if (D2_after != 2) e(11); if (x_link != 1) e(12); if (y_link != 1) e(13); if (access("D2/y", 7) != 0) e(14); if (unlink("D2/y") != 0) e(15); if (rmdir("D1") != 0) e(16); if (rmdir("D2") != 0) e(17); } void test21m() { int D1_before, D1_after, x_link, y_link; /* Test case 7: renaming a directory within the same directory. */ subtest = 12; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D1/X", 0777) != 0) e(2); if (mkdir("D1/Y", 0777) != 0) e(3); D1_before = get_link("D1"); x_link = get_link("D1/X"); if (rename("D1/X", "D1/Y") != 0) e(4); y_link = get_link("D1/Y"); D1_after = get_link("D1"); if (D1_before != 4) e(5); if (D1_after != 3) e(6); if (x_link != 2) e(7); if (y_link != 2) e(8); if (access("D1/Y", 7) != 0) e(9); if (rmdir("D1/Y") != 0) e(10); if (get_link("D1") != 2) e(11); if (rmdir("D1") != 0) e(12); } void test21n() { int D1_before, D1_after, D2_before, D2_after, x_link, y_link; /* Test case 8: move a directory to a new directory. */ subtest = 13; if (mkdir("D1", 0777) != 0) e(1); if (mkdir("D2", 0777) != 0) e(2); if (mkdir("D1/X", 0777) != 0) e(3); if (mkdir("D2/Y", 0777) != 0) e(4); D1_before = get_link("D1"); D2_before = get_link("D2"); x_link = get_link("D1/X"); if (rename("D1/X", "D2/Y") != 0) e(5); y_link = get_link("D2/Y"); D1_after = get_link("D1"); D2_after = get_link("D2"); if (D1_before != 3) e(6); if (D2_before != 3) e(7); if (D1_after != 2) e(8); if (D2_after != 3) e(9); if (x_link != 2) e(10); if (y_link != 2) e(11); if (access("D2/Y", 7) != 0) e(12); if (rename("D2/Y", "D1/Z") != 0) e(13); if (get_link("D1") != 3) e(14); if (get_link("D2") != 2) e(15); if (rmdir("D1/Z") != 0) e(16); if (get_link("D1") != 2) e(17); if (rmdir("D1") != 0) e(18); if (rmdir("D2") != 0) e(19); } void test21o() { /* Test trying to remove . and .. */ subtest = 14; if (mkdir("D1", 0777) != 0) e(1); if (chdir("D1") != 0) e(2); if (rmdir(".") == 0) e(3); if (rmdir("..") == 0) e(4); if (mkdir("D2", 0777) != 0) e(5); if (mkdir("D3", 0777) != 0) e(6); if (mkdir("D4", 0777) != 0) e(7); if (rmdir("D2/../D3/../D4") != 0) e(8); /* legal way to remove D4 */ if (rmdir("D2/../D3/../D2/..") == 0) e(9); /* removing self is illegal */ if (rmdir("D2/../D3/../D2/../..") == 0) e(10);/* removing parent is illegal*/ if (rmdir("../D1/../D1/D3") != 0) e(11); /* legal way to remove D3 */ if (rmdir("./D2/../D2") != 0) e(12); /* legal way to remove D2 */ if (chdir("..") != 0) e(13); if (rmdir("D1") != 0) e(14); } int get_link(name) char *name; { struct stat statbuf; if (stat(name, &statbuf) != 0) { printf("Unable to stat %s\n", name); errct++; return(-1); } return(statbuf.st_nlink); } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test22: umask() (p) Jan-Mark Wams. email: jms@cs.vu.nl */ #include #include #include #include #include #include #include #include #define MAX_ERROR 4 /* Stop after ``MAX_ERROR'' errors. */ #define ITERATIONS 2 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; /* Total error counter. */ int subtest = 1; _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test22a, (void)); _PROTOTYPE(int mode, (char *filename)); _PROTOTYPE(int umode, (char *filename)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 22 "); fflush(stdout); system("chmod 777 DIR_22/* DIR_22/*/* > /dev/null 2>&1"); System("rm -rf DIR_22; mkdir DIR_22"); Chdir("DIR_22"); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test22a(); } quit(); } void test22a() { int fd1, fd2; int i, oldmask; int stat_loc; /* For the wait sys call. */ subtest = 1; system("chmod 777 ../DIR_22/* ../DIR_22/*/* > /dev/null 2>&1"); System("rm -rf ../DIR_22/*"); oldmask = 0123; /* Set oldmask and umask. */ umask(oldmask); /* Set oldmask and umask. */ /* Check all the possible values of umask. */ for (i = 0000; i <= 0777; i++) { if (oldmask != umask(i)) e(1); /* set umask() */ fd1 = open("open", O_CREAT, 0777); if (fd1 != 3) e(2); /* test open(), */ fd2 = creat("creat", 0777); if (fd2 != 4) e(3); /* creat(), */ if (mkdir("dir", 0777) != 0) e(4); /* mkdir(), */ if (mkfifo("fifo", 0777) != 0) e(5); /* and mkfifo(). */ if (umode("open") != i) e(6); /* see if they have */ if (umode("creat") != i) e(7); /* the proper mode */ if (umode("dir") != i) e(8); if (umode("fifo") != i) e(9); /* Clean up */ if (close(fd1) != 0) e(10); if (close(fd2) != 0) e(11); /* close fd's and */ unlink("open"); /* clean the dir */ unlink("creat"); rmdir("dir"); unlink("fifo"); oldmask = i; /* save current mask */ } /* Check-reset mask */ if (umask(0124) != 0777) e(12); /* Check if a umask of 0000 leaves the modes alone. */ if (umask(0000) != 0124) e(13); for (i = 0000; i <= 0777; i++) { fd1 = open("open", O_CREAT, i); if (fd1 != 3) e(14); /* test open(), */ fd2 = creat("creat", i); if (fd2 != 4) e(15); /* creat(), */ if (mkdir("dir", i) != 0) e(16); /* mkdir(), */ if (mkfifo("fifo", i) != 0) e(17); /* and mkfifo(). */ if (mode("open") != i) e(18); /* see if they have */ if (mode("creat") != i) e(19); /* the proper mode */ if (mode("dir") != i) e(20); if (mode("fifo") != i) e(21); /* Clean up */ if (close(fd1) != 0) e(22); if (close(fd2) != 0) e(23); if (unlink("open") != 0) e(24); unlink("creat"); rmdir("dir"); unlink("fifo"); } /* Check if umask survives a fork() */ if (umask(0124) != 0000) e(25); switch (fork()) { case -1: fprintf(stderr, "Can't fork\n"); break; case 0: mkdir("bar", 0777); /* child makes a dir */ exit(0); default: if (wait(&stat_loc) == -1) e(26); } if (umode("bar") != 0124) e(27); rmdir("bar"); /* Check if umask in child changes umask in parent. */ switch (fork()) { case -1: fprintf(stderr, "Can't fork\n"); break; case 0: switch (fork()) { case -1: fprintf(stderr, "Can't fork\n"); break; case 0: if (umask(0432) != 0124) e(28); exit(0); default: if (wait(&stat_loc) == -1) e(29); } if (umask(0423) != 0124) e(30); exit(0); default: if (wait(&stat_loc) == -1) e(31); } if (umask(0342) != 0124) e(32); /* See if extra bits are ignored */ if (umask(0xFFFF) != 0342) e(33); if (umask(0xFE00) != 0777) e(34); if (umask(01777) != 0000) e(35); if (umask(0022) != 0777) e(36); } int mode(arg) char *arg; { /* return the file mode. */ struct stat st; Stat(arg, &st); return st.st_mode & 0777; } int umode(arg) char *arg; { /* return the umask used for this file */ return 0777 ^ mode(arg); } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); system("chmod 777 ../DIR_22/* ../DIR_22/*/* > /dev/null 2>&1"); System("rm -rf DIR_22"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test23: chdir(), getcwd() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 3 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) int errct; int subtest; int superuser; /* True if we are root. */ char cwd[PATH_MAX]; /* Space for path names. */ char cwd2[PATH_MAX]; char buf[PATH_MAX]; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test23a, (void)); _PROTOTYPE(void test23b, (void)); _PROTOTYPE(void test23c, (void)); _PROTOTYPE(void makelongnames, (void)); /* Fill MaxName etc. */ _PROTOTYPE(char *last_index, (char *string, int ch)); _PROTOTYPE(char *my_getcwd, (char *buf, int size)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 23 "); fflush(stdout); System("rm -rf DIR_23; mkdir DIR_23"); Chdir("DIR_23"); makelongnames(); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test23a(); /* Test normal operation */ if (m & 0002) test23b(); /* Test critical operation */ if (m & 0004) test23c(); /* Test error operation */ } quit(); } void test23a() { /* Test normal operation. */ register int i; subtest = 1; System("rm -rf ../DIR_23/*"); /* Let's do some fiddeling with path names. */ if (getcwd(cwd, PATH_MAX) != cwd) e(1); if (chdir(cwd) != 0) e(2); if (getcwd(buf, PATH_MAX) != buf) e(3); if (strcmp(buf, cwd) != 0) e(4); if (chdir(".") != 0) e(5); if (getcwd(buf, PATH_MAX) != buf) e(6); if (strcmp(buf, cwd) != 0) e(7); if (chdir("./././.") != 0) e(8); if (getcwd(buf, PATH_MAX) != buf) e(9); if (strcmp(buf, cwd) != 0) e(10); /* Creat a working dir named "foo", remove any previous residues. */ System("rm -rf foo"); if (mkdir("foo", 0777) != 0) e(11); /* Do some more fiddeling with path names. */ if (chdir("foo/.././foo/..") != 0) e(12); /* change to cwd */ if (getcwd(buf, PATH_MAX) != buf) e(13); if (strcmp(buf, cwd) != 0) e(13); if (chdir("foo") != 0) e(14); /* change to foo */ if (chdir("..") != 0) e(15); /* and back again */ if (getcwd(buf, PATH_MAX) != buf) e(16); if (strcmp(buf, cwd) != 0) e(17); /* Make 30 sub dirs, eg. ./bar/bar/bar/bar/bar...... */ System("rm -rf bar"); /* get ridd of bar */ for (i = 0; i < 30; i++) { if (mkdir("bar", 0777) != 0) e(18); if (chdir("bar") != 0) e(19); /* change to bar */ } for (i = 0; i < 30; i++) { if (chdir("..") != 0) e(20); /* and back again */ if (rmdir("bar") != 0) e(21); } /* Make sure we are back where we started. */ if (getcwd(buf, PATH_MAX) != buf) e(22); if (strcmp(buf, cwd) != 0) e(23); System("rm -rf bar"); /* just incase */ /* Do some normal checks on `Chdir()' and `getcwd()' */ if (chdir("/") != 0) e(24); if (getcwd(buf, PATH_MAX) != buf) e(25); if (strcmp(buf, "/") != 0) e(26); if (chdir("..") != 0) e(27); /* go to parent of / */ if (getcwd(buf, PATH_MAX) != buf) e(28); if (strcmp(buf, "/") != 0) e(29); if (chdir(cwd) != 0) e(30); if (getcwd(buf, PATH_MAX) != buf) e(31); if (strcmp(buf, cwd) != 0) e(32); if (chdir("/etc") != 0) e(33); /* /etc might be on RAM */ if (getcwd(buf, PATH_MAX) != buf) e(34); /* might make a difference */ if (strcmp(buf, "/etc") != 0) e(35); if (chdir(cwd) != 0) e(36); if (getcwd(buf, PATH_MAX) != buf) e(37); if (strcmp(buf, cwd) != 0) e(38); if (chdir(".//.//") != 0) e(39); /* .//.// == current dir */ if (getcwd(buf, PATH_MAX) != buf) e(40); if (strcmp(buf, cwd) != 0) e(41); /* we might be at '/' */ #ifdef _MINIX /* XXX - my_getcwd() is old rubbish. It reads the directory directly instead * of through the directory library. It uses a fixed size buffer instead of * a size related to PATH_MAX, NAME_MAX or the size required. */ if (my_getcwd(buf, PATH_MAX) != buf) e(42); /* get cwd my way */ if (strcmp(cwd, buf) != 0) e(43); #endif System("rm -rf foo"); } void test23b() { /* Test critical values. */ subtest = 2; System("rm -rf ../DIR_23/*"); /* Fiddle with the size (2nt) parameter of `getcwd ()'. */ if (getcwd(cwd, PATH_MAX) != cwd) e(1); /* get cwd */ if (getcwd(buf, strlen(cwd)) != (char *) 0) e(2); /* size 1 to small */ if (errno != ERANGE) e(3); if (getcwd(buf, PATH_MAX) != buf) e(4); if (strcmp(buf, cwd) != 0) e(5); Chdir(cwd); /* getcwd might cd / */ if (getcwd(buf, strlen(cwd) + 1) != buf) e(6); /* size just ok */ if (getcwd(buf, PATH_MAX) != buf) e(7); if (strcmp(buf, cwd) != 0) e(8); /* Let's see how "MaxName" and "ToLongName" are handled. */ if (mkdir(MaxName, 0777) != 0) e(9); if (chdir(MaxName) != 0) e(10); if (chdir("..") != 0) e(11); if (rmdir(MaxName) != 0) e(12); if (getcwd(buf, PATH_MAX) != buf) e(13); if (strcmp(buf, cwd) != 0) e(14); if (chdir(MaxPath) != 0) e(15); if (getcwd(buf, PATH_MAX) != buf) e(16); if (strcmp(buf, cwd) != 0) e(17); if (chdir(ToLongName) != -1) e(18); #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if (errno != ENAMETOOLONG) e(20); # else if (errno != ENOENT) e(20); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif if (getcwd(buf, PATH_MAX) != buf) e(21); if (strcmp(buf, cwd) != 0) e(22); if (chdir(ToLongPath) != -1) e(23); if (errno != ENAMETOOLONG) e(24); if (getcwd(buf, PATH_MAX) != buf) e(25); if (strcmp(buf, cwd) != 0) e(26); } void test23c() { /* Check reaction to errors */ subtest = 3; System("rm -rf ../DIR_23/*"); if (getcwd(cwd, PATH_MAX) != cwd) e(1); /* get cwd */ /* Creat a working dir named "foo", remove any previous residues. */ System("rm -rf foo; mkdir foo"); /* Check some obviouse errors. */ if (chdir("") != -1) e(2); if (errno != ENOENT) e(3); if (getcwd(buf, PATH_MAX) != buf) e(4); if (strcmp(buf, cwd) != 0) e(5); if (getcwd(buf, 0) != (char *) 0) e(6); if (errno != EINVAL) e(7); if (getcwd(buf, PATH_MAX) != buf) e(8); if (strcmp(buf, cwd) != 0) e(9); if (getcwd(buf, 0) != (char *) 0) e(10); if (errno != EINVAL) e(11); if (getcwd(buf, PATH_MAX) != buf) e(12); if (strcmp(buf, cwd) != 0) e(13); if (chdir(cwd) != 0) e(14); /* getcwd might be buggy. */ /* Change the mode of foo, and check the effect. */ if (chdir("foo") != 0) e(15); /* change to foo */ if (mkdir("bar", 0777) != 0) e(16); /* make a new dir bar */ if (getcwd(cwd2, PATH_MAX) != cwd2) e(17); /* get the new cwd */ if (getcwd(buf, 3) != (char *) 0) e(18); /* size is too small */ if (errno != ERANGE) e(19); if (getcwd(buf, PATH_MAX) != buf) e(20); if (strcmp(buf, cwd2) != 0) e(21); Chdir(cwd2); /* getcwd() might cd / */ System("chmod 377 ."); /* make foo unreadable */ if (getcwd(buf, PATH_MAX) != buf) e(22); /* dir not readable */ if (getcwd(buf, PATH_MAX) != buf) e(23); if (strcmp(buf, cwd2) != 0) e(24); if (chdir("bar") != 0) e(25); /* at .../foo/bar */ if (!superuser) { if (getcwd(buf, PATH_MAX) != (char *) 0) e(26); if (errno != EACCES) e(27); } if (superuser) { if (getcwd(buf, PATH_MAX) != buf) e(28); } if (chdir(cwd2) != 0) e(29); if (getcwd(buf, PATH_MAX) != buf) e(30); if (strcmp(buf, cwd2) != 0) e(31); System("chmod 677 ."); /* make foo inaccessable */ if (!superuser) { if (getcwd(buf, PATH_MAX) != (char *) 0) e(32); /* try to get cwd */ if (errno != EACCES) e(33); /* but no access */ if (chdir("..") != -1) e(34); /* try to get back */ if (errno != EACCES) e(35); /* again no access */ if (chdir(cwd) != 0) e(36); /* get back to cwd */ /* `Chdir()' might do path optimizing, it shouldn't. */ if (chdir("foo/..") 555555!= -1) e(37); /* no op */ if (chdir("foo") != -1) e(38); /* try to cd to foo */ if (errno != EACCES) e(39); /* no have access */ if (getcwd(buf, PATH_MAX) != buf) e(40); if (strcmp(buf, cwd) != 0) e(41); } if (superuser) { if (getcwd(buf, PATH_MAX) != buf) e(42); if (strcmp(buf, cwd2) != 0) e(43); if (chdir("..") != 0) e(44); /* get back to cwd */ if (chdir("foo") != 0) e(45); /* get back to foo */ if (chdir(cwd) != 0) e(46); /* get back to cwd */ } if (getcwd(buf, PATH_MAX) != buf) e(47); /* check we are */ if (strcmp(buf, cwd) != 0) e(48); /* back at cwd. */ Chdir(cwd); /* just in case... */ if (chdir("/etc/passwd") != -1) e(49); /* try to change to a file */ if (errno != ENOTDIR) e(50); if (getcwd(buf, PATH_MAX) != buf) e(51); if (strcmp(buf, cwd) != 0) e(52); if (chdir("/notexist") != -1) e(53); if (errno != ENOENT) e(54); if (getcwd(buf, PATH_MAX) != buf) e(55); if (strcmp(buf, cwd) != 0) e(56); System("chmod 777 foo"); if (chdir("foo") != 0) e(57); /* XXX - this comment was botched by 'pretty'. */ /* * Since `foo' is the cwd, it should not be removeable but * if it * were, this code would be found here; * * * System ("cd .. ; rm -rf foo"); remove foo * if (chdir (".") * != -1) e(); try go to. * if (errno != ENOENT) e(); * hould not be an entry * if (chdir ("..") != -1) e(); try * to get back * if (errno != ENOENT) e(); should not be * an entry * if (getcwd (buf, PATH_MAX) != (char *)0) e(); don't * know where we are * * * What should errno be now ? The cwd might be gone if te superuser * * removed the cwd. (Might even have linked it first.) But this * * testing should be done by the test program for `rmdir()'. */ if (chdir(cwd) != 0) e(58); } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } /* The following code, is take from pwd written by Adri Koppes */ /* My_getcwd() helper. */ char *last_index(string, ch) char *string; char ch; { register char *retval = '\0'; while (*string != '\0') { if (*string == ch) retval = string; string++; } return(retval); } char *my_getcwd(buf, size) char *buf; int size; { /* should be like getcwd() */ int sd; register int fd; register char *n; char name[128]; struct stat s, st, sk; struct direct d; if (size <= 0) return(char *) 0; *buf = '\0'; *name = '\0'; stat(".", &s); do { if ((fd = open("..", O_RDONLY)) < 0) return(char *) 0; st.st_dev = s.st_dev; st.st_ino = s.st_ino; stat("..", &s); Chdir(".."); sd = sizeof(struct direct); if (s.st_dev == st.st_dev) { do { if (read(fd, (char *) &d, sd) < sd) return(char *) 0; } while (d.d_ino != st.st_ino); } else { do { if (read(fd, (char *) &d, sd) < sd) return(char *) 0; stat(d.d_name, &sk); } while ((sk.st_dev != st.st_dev) || (sk.st_ino != st.st_ino)); } close(fd); if (strcmp(".", d.d_name) != 0) { strcat(name, "/"); strcat(name, d.d_name); } } while ((s.st_ino != st.st_ino) || (s.st_dev != st.st_dev)); if (*name == '\0') strncat(buf, "/", size); else while ((n = last_index(name, '/')) != NULL) { n[NAME_MAX] = '\0'; strncat(buf, n, size - strlen(buf)); *n = '\0'; } strncat(buf, name, size - strlen(buf)); buf[size - 1] = '\0'; Chdir(buf); /* get back there */ return buf; } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_23"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Test24: opendir, readdir, rewinddir, closedir Author: Jan-Mark Wams */ #include #include #include #include #include #include #include #include #include #include #include #include _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void chk_dir, (DIR * dirpntr)); _PROTOTYPE(void test24a, (void)); _PROTOTYPE(void test24b, (void)); _PROTOTYPE(void test24c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); #define OVERFLOW_DIR_NR (OPEN_MAX + 1) #define MAX_ERROR 4 #define ITERATIONS 5 #define DIRENT0 ((struct dirent *) NULL) #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 24 "); fflush(stdout); System("rm -rf DIR_24; mkdir DIR_24"); Chdir("DIR_24"); makelongnames(); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test24a(); if (m & 0002) test24b(); if (m & 0004) test24c(); } quit(); } void test24a() { /* Test normal operations. */ int fd3, fd4, fd5; DIR *dirp; int j, ret, fd, flags; struct stat st1, st2; int stat_loc; time_t time1; subtest = 1; System("rm -rf ../DIR_24/*"); if ((fd = dup(0)) != 3) e(1); /* dup stdin */ close(fd); /* free the fd again */ dirp = opendir("/"); /* open "/" */ if (dirp == ((DIR *) NULL)) e(2); /* has to succseed */ if ((fd = dup(0)) <= 2) e(3); /* dup stdin */ if (fd > 3) { /* if opendir() uses fd 3 */ flags = fcntl(3, F_GETFD); /* get fd fags of 3 */ if (!(flags & FD_CLOEXEC)) e(4); /* it should be closed on */ } /* exec..() calls */ close(fd); /* free the fd again */ ret = closedir(dirp); /* close, we don't need it */ if (ret == -1) e(5); /* closedir () unsucces full */ if (ret != 0) e(6); /* should be 0 or -1 */ if ((fd = dup(0)) != 3) e(7); /* see if next fd is same */ close(fd); /* free the fd again */ System("rm -rf foo; mkdir foo"); Chdir("foo"); System("touch f1 f2 f3 f4 f5"); /* make f1 .. f5 */ System("rm f[24]"); /* creat `holes' in entrys */ Chdir(".."); if ((dirp = opendir("foo")) == ((DIR *) NULL)) e(8); /* open foo */ chk_dir(dirp); /* test if foo's ok */ for (j = 0; j < 10; j++) { errno = j * 47 % 7; /* there should */ if (readdir(dirp) != DIRENT0) e(9); /* be nomore dir */ if (errno != j * 47 % 7) e(10); /* entrys */ } rewinddir(dirp); /* rewind foo */ chk_dir(dirp); /* test foosok */ for (j = 0; j < 10; j++) { errno = j * 23 % 7; /* there should */ if (readdir(dirp) != DIRENT0) e(11); /* be nomore dir */ if (errno != j * 23 % 7) e(12); /* entrys */ } if ((fd4 = creat("foo/f4", 0666)) <= 2) e(13); /* Open a file. */ System("rm foo/f4"); /* Kill entry. */ rewinddir(dirp); /* Rewind foo. */ if ((fd3 = open("foo/f3", O_WRONLY)) <= 2) e(14); /* Open more files. */ if ((fd5 = open("foo/f5", O_WRONLY)) <= 2) e(15); if (write(fd3, "Hello", 6) != 6) e(16); if (write(fd4, "Hello", 6) != 6) e(17); /* write some data */ if (close(fd5) != 0) e(18); chk_dir(dirp); for (j = 0; j < 10; j++) { errno = j * 101 % 7; /* there should */ if (readdir(dirp) != DIRENT0) e(19); /* be nomore dir */ if (errno != j * 101 % 7) e(20); /* entrys */ } if (close(fd4) != 0) e(21); /* shouldn't matter */ if (close(fd3) != 0) e(22); /* when we do this */ if (closedir(dirp) != 0) e(23); /* close foo again */ Chdir("foo"); if ((dirp = opendir(".//")) == ((DIR *) NULL)) e(24); /* open foo again */ Chdir(".."); chk_dir(dirp); /* foosok? */ for (j = 0; j < 10; j++) { errno = (j * 101) % 7; /* there should */ if (readdir(dirp) != DIRENT0) e(25); /* be nomore dir */ if (errno != (j * 101) % 7) e(26); /* entrys */ } if (closedir(dirp) != 0) e(27); /* It should be closable */ stat("foo", &st1); /* get stat */ time(&time1); while (time1 >= time((time_t *)0)) ; if ((dirp = opendir("foo")) == ((DIR *) NULL)) e(28); /* open, */ if (readdir(dirp) == DIRENT0) e(29); /* read and */ stat("foo", &st2); /* get new stat */ if (st1.st_atime > st2.st_atime) e(30); /* st_atime check */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: rewinddir(dirp); /* rewind childs dirp */ if (readdir(dirp) == DIRENT0) e(31); /* read should be ok */ if (closedir(dirp) != 0) e(32); /* close child'd foo */ exit(0); /* 0 stops here */ default: if (wait(&stat_loc) == -1) e(33); /* PARENT wait()'s */ break; } if (closedir(dirp) != 0) e(34); /* close parent's foo */ } void test24b() { /* See what happens with too many dir's open. Check if file size seems ok, * and independency. */ int i, j; /* i = highest open dir count */ DIR *dirp[OVERFLOW_DIR_NR], *dp; struct dirent *dep, *dep1, *dep2; char name[NAME_MAX + 2]; /* buffer for file name, and count */ int dot = 0, dotdot = 0; subtest = 2; System("rm -rf ../DIR_24/*"); for (i = 0; i < OVERFLOW_DIR_NR; i++) { dirp[i] = opendir("/"); if (dirp[i] == ((DIR *) NULL)) { if (errno != EMFILE) e(1); break; } } if (i <= 4) e(2); /* sounds resanable */ if (i >= OVERFLOW_DIR_NR) e(3); /* might be to small */ for (j = 0; j < i; j++) { if (closedir(dirp[(j + 5) % i]) != 0) e(4); /* neat! */ } /* Now check if number of bytes in d_name can go up till NAME_MAX */ System("rm -rf foo; mkdir foo"); Chdir("foo"); name[0] = 0; for (i = 0; i <= NAME_MAX; i++) { if (strcat(name, "X") != name) e(5); close(creat(name, 0666)); /* fails once on */ } /* XX..XX, 1 too long */ Chdir(".."); /* Now change i-th X to Y in name buffer record file of length i. */ if ((dp = opendir("foo")) == ((DIR *) NULL)) e(6); while ((dep = readdir(dp)) != DIRENT0) { if (strcmp("..", dep->d_name) == 0) dotdot++; else if (strcmp(".", dep->d_name) == 0) dot++; else name[strlen(dep->d_name)] += 1; /* 'X' + 1 == 'Y' */ } if (closedir(dp) != 0) e(7); for (i = 1; i <= NAME_MAX; i++) { /* Check if every length */ if (name[i] != 'Y') e(8); /* has been seen once. */ } /* Check upper and lower bound. */ if (name[0] != 'X') e(9); if (name[NAME_MAX + 1] != '\0') e(10); /* Now check if two simultaniouse open dirs do the same */ if ((dirp[1] = opendir("foo")) == ((DIR *) NULL)) e(11); if ((dirp[2] = opendir("foo")) == ((DIR *) NULL)) e(12); if ((dep1 = readdir(dirp[1])) == DIRENT0) e(13); if ((dep2 = readdir(dirp[2])) == DIRENT0) e(14); if (dep1->d_name == dep2->d_name) e(15); /* 1 & 2 Should be */ strcpy(name, dep2->d_name); /* differand buffers */ if (strcmp(dep1->d_name, name) != 0) e(16); /* But hold the same */ if ((dep1 = readdir(dirp[1])) == DIRENT0) e(17); if ((dep1 = readdir(dirp[1])) == DIRENT0) e(18); /* lose some entries */ if ((dep1 = readdir(dirp[1])) == DIRENT0) e(19); /* Using dirp 1 has */ if (dep1->d_name == dep2->d_name) e(20); /* no effect on 2 */ if (strcmp(dep2->d_name, name) != 0) e(21); rewinddir(dirp[1]); /* Rewinding dirp 1 */ if ((dep2 = readdir(dirp[2])) == DIRENT0) e(22); /* can't effect 2 */ if (strcmp(dep2->d_name, name) == 0) e(23); /* Must be next */ if (closedir(dirp[1]) != 0) e(24); /* Closing dirp 1 */ if ((dep2 = readdir(dirp[2])) == DIRENT0) e(25); /* can't effect 2 */ if (strcmp(dep2->d_name, name) == 0) e(26); /* Must be next */ if (closedir(dirp[2]) != 0) e(27); } void test24c() { /* Test whether wrong things go wrong right. */ DIR *dirp; subtest = 3; System("rm -rf ../DIR_24/*"); if (opendir("foo/bar/nono") != ((DIR *) NULL)) e(1); /* nonexistent */ if (errno != ENOENT) e(2); System("mkdir foo; chmod 677 foo")55555; /* foo inaccesable */ if (opendir("foo/bar/nono") != ((DIR *) NULL)) e(3); if (superuser) { if (errno != ENOENT) e(4); /* su has access */ System("chmod 377 foo"); if ((dirp = opendir("foo")) == ((DIR *) NULL)) e(5); if (closedir(dirp) != 0) e(6); } if (!superuser) { if (errno != EACCES) e(7); /* we don't ;-) */ System("chmod 377 foo"); if (opendir("foo") != ((DIR *) NULL)) e(8); } System("chmod 777 foo"); if (mkdir(MaxName, 0777) != 0) e(9); /* make longdir */ if ((dirp = opendir(MaxName)) == ((DIR *) NULL)) e(10); /* open it */ if (closedir(dirp) != 0) e(11); /* close it */ if (rmdir(MaxName) != 0) e(12); /* then remove it */ if ((dirp = opendir(MaxPath)) == ((DIR *) NULL)) e(13); /* open '.' */ if (closedir(dirp) != 0) e(14); /* close it */ #if 0 /* XXX - anything could happen with the bad pointer */ if (closedir(dirp) != -1) e(15); /* close it again */ if (closedir(dirp) != -1) e(16); /* and again */ #endif /* 0 */ if (opendir(ToLongName) != ((DIR *) NULL)) e(17); /* is too long */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if (errno != ENAMETOOLONG) e(18); # else if (errno != ENOENT) e(19); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif if (opendir(ToLongPath) != ((DIR *) NULL)) e(20); /* path is too long */ if (errno != ENAMETOOLONG) e(21); System("touch foo/abc"); /* make a file */ if (opendir("foo/abc") != ((DIR *) NULL)) e(22); /* not a dir */ if (errno != ENOTDIR) e(23); } void chk_dir(dirp) /* dir should contain */ DIR *dirp; /* (`f1', `f3', `f5', `.', `..') */ { /* no more, no less */ int f1 = 0, f2 = 0, f3 = 0, f4 = 0, f5 = 0, /* counters for all */ other = 0, dot = 0, dotdot = 0; /* possible entrys */ int i; struct dirent *dep; char *fname; int oldsubtest = subtest; subtest = 4; for (i = 0; i < 5; i++) { /* 3 files and `.' and `..' == 5 entrys */ dep = readdir(dirp); if (dep == DIRENT0) { /* not einough */ if (dep == DIRENT0) e(1); break; } fname = dep->d_name; if (strcmp(fname, ".") == 0) dot++; else if (strcmp(fname, "..") == 0) dotdot++; else if (strcmp(fname, "f1") == 0) f1++; else if (strcmp(fname, "f2") == 0) f2++; else if (strcmp(fname, "f3") == 0) f3++; else if (strcmp(fname, "f4") == 0) f4++; else if (strcmp(fname, "f5") == 0) f5++; else other++; } /* do next dir entry */ if (dot != 1) e(2); /* Check the entrys */ if (dotdot != 1) e(3); if (f1 != 1) e(4); if (f3 != 1) e(5); if (f5 != 1) e(6); if (f2 != 0) e(7); if (f4 != 0) e(8); if (other != 0) e(9); subtest = oldsubtest; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_24"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test4: open (), close () (p) Jan-Mark Wams. email: jms@cs.vu.nl */ /* Not tested: O_NONBLOCK on special files, supporting it. ** On a read-only file system, some error reports are to be expected. */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 2 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Creat(f) if (close(creat(f,0777))!=0) printf("Can't creat %s\n",f) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test25a, (void)); _PROTOTYPE(void test25b, (void)); _PROTOTYPE(void test25c, (void)); _PROTOTYPE(void test25d, (void)); _PROTOTYPE(void test25e, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 25 cannot run as root; test aborted\n"); exit(1); } if (argc == 2) m = atoi(argv[1]); printf("Test 25 "); fflush(stdout); System("rm -rf DIR_25; mkdir DIR_25"); Chdir("DIR_25"); makelongnames(); superuser = (geteuid() == 0); /* Close all files, the parent might have opened. */ for (i = 3; i < 100; i++) close(i); for (i = 0; i < ITERATIONS; i++) { if (m & 001) test25a(); if (m & 002) test25b(); if (m & 004) test25c(); if (m & 010) test25d(); if (m & 020) test25e(); } quit(); } void test25a() { /* Test fcntl flags. */ subtest = 1; #define EXCLUDE(a,b) (((a)^(b)) == ((a)|(b))) #define ADDIT (O_APPEND | O_CREAT | O_EXCL | O_NONBLOCK | O_TRUNC) /* If this compiles all flags are defined but they have to be or-able. */ if (!(EXCLUDE(O_NONBLOCK, O_TRUNC))) e(1); if (!(EXCLUDE(O_EXCL, O_NONBLOCK | O_TRUNC))) e(2); if (!(EXCLUDE(O_CREAT, O_EXCL | O_NONBLOCK | O_TRUNC))) e(3); if (!(EXCLUDE(O_APPEND, O_CREAT | O_EXCL | O_NONBLOCK | O_TRUNC))) e(4); if (!(EXCLUDE(O_RDONLY, ADDIT))) e(5); if (!(EXCLUDE(O_WRONLY, ADDIT))) e(6); if (!(EXCLUDE(O_RDWR, ADDIT))) e(7); } void test25b() { /* Test normal operation. */ #define BUF_SIZE 1024 int fd1, fd2, fd3, fd4, fd5; char buf[BUF_SIZE]; struct stat st1, st2, st3; time_t time1, time2; int stat_loc; subtest = 2; System("rm -rf ../DIR_25/*"); System("echo Hello > he"); /* make test files */ System("echo Hello > ha"); /* size 6 bytes */ System("echo Hello > hi"); System("echo Hello > ho"); /* Check path resolution. Check if lowest fds are returned */ if ((fd1 = open("he", O_RDONLY)) != 3) e(1); if (read(fd1, buf, BUF_SIZE) != 6) e(2); if ((fd2 = open("./ha", O_RDONLY)) != 4) e(3); if ((fd3 = open("../DIR_25/he", O_RDWR)) != 5) e(4); if ((fd4 = open("ho", O_WRONLY)) != 6) e(5); if (close(fd4) != 0) e(6); if (close(fd1) != 0) e(7); if ((fd1 = open("./././ho", O_RDWR)) != 3) e(8); if ((fd4 = open("../DIR_25/he", O_RDONLY)) != 6) e(9); if (close(fd2) != 0) e(10); if (close(fd3) != 0) e(11); if ((fd2 = open("ha", O_RDONLY)) != 4) e(12); if ((fd3 = open("/etc/passwd", O_RDONLY)) != 5) e(13); if (close(fd4) != 0) e(14); /* close all */ if (close(fd1) != 0) e(15); if (close(fd3) != 0) e(16); /* Check if processes share fd2, and if they have independent new fds */ System("rm -rf /tmp/sema.25"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: if ((fd1 = open("he", O_WRONLY)) != 3) e(17); if ((fd3 = open("../././DIR_25/ha", O_WRONLY)) != 5) e(18); if ((fd4 = open("../DIR_25/hi", O_WRONLY)) != 6) e(19); if ((fd5 = open("ho", O_WRONLY)) != 7) e(20); system("while test ! -f /tmp/sema.25; do sleep 1; done"); /* parent */ if (read(fd2, buf, BUF_SIZE) != 3) e(21); /* gets Hel */ if (strncmp(buf, "lo\n", 3) != 0) e(22); /* we get lo */ if (close(fd1) != 0) e(23); if (close(fd2) != 0) e(24); if (close(fd3) != 0) e(25); if (close(fd4) != 0) e(26); if (close(fd5) != 0) e(27); exit(0); default: if ((fd1 = open("ha", O_RDONLY)) != 3) e(28); if ((fd3 = open("./he", O_RDONLY)) != 5) e(29); if ((fd4 = open("../DIR_25/hi", O_RDWR)) != 6) e(30); if ((fd5 = open("ho", O_WRONLY)) != 7) e(31); if (close(fd1) != 0) e(32); if (read(fd2, buf, 3) != 3) e(33); /* get Hel */ Creat("/tmp/sema.25"); if (strncmp(buf, "Hel", 3) != 0) e(34); if (close(fd2) != 0) e(35); if (close(fd3) != 0) e(36); if (close(fd4) != 0) e(37); if (close(fd5) != 0) e(38); if (wait(&stat_loc) == -1) e(39); if (stat_loc != 0) e(40); } System("rm -f /tmp/sema.25"); /* Check if the file status information is updated correctly */ Stat("hi", &st1); /* get info */ Stat("ha", &st2); /* of files */ time(&time1); while (time1 >= time((time_t *)0)) ; /* wait a sec */ if ((fd1 = open("hi", O_RDONLY)) != 3) e(41); /* open files */ if ((fd2 = open("ha", O_WRONLY)) != 4) e(42); if (read(fd1, buf, 1) != 1) e(43); /* read one */ if (close(fd1) != 0) e(44); /* close one */ Stat("hi", &st3); /* get info */ if (st1.st_uid != st3.st_uid) e(45); if (st1.st_gid != st3.st_gid) e(46); /* should be same */ if (st1.st_mode != st3.st_mode) e(47); if (st1.st_size != st3.st_size) e(48); if (st1.st_nlink != st3.st_nlink) e(49); if (st1.st_mtime != st3.st_mtime) e(50); if (st1.st_ctime != st3.st_ctime) e(51); #ifndef V1_FILESYSTEM if (st1.st_atime >= st3.st_atime) e(52); /* except for atime. */ #endif if (write(fd2, "Howdy\n", 6) != 6) e(53); /* Update c & mtime. */ if ((fd1 = open("ha", O_RDWR)) != 3) e(54); if (read(fd1, buf, 6) != 6) e(55); /* Update atime. */ if (strncmp(buf, "Howdy\n", 6) != 0) e(56); if (close(fd1) != 0) e(57); Stat("ha", &st3); if (st2.st_uid != st3.st_uid) e(58); if (st2.st_gid != st3.st_gid) e(59); /* should be same */ if (st2.st_mode != st3.st_mode) e(60); if (st2.st_nlink != st3.st_nlink) e(61); if (st2.st_ctime >= st3.st_ctime) e(62); #ifndef V1_FILESYSTEM if (st2.st_atime >= st3.st_atime) e(63); #endif if (st2.st_mtime >= st3.st_mtime) e(64); if (st2.st_size != st3.st_size) e(65); if (close(fd2) != 0) e(66); /* Let's see if RDONLY files are read only. */ if ((fd1 = open("hi", O_RDONLY)) != 3) e(67); if (write(fd1, " again", 7) != -1) e(68); /* we can't write */ if (errno != EBADF) e(69); /* a read only fd */ if (read(fd1, buf, 7) != 6) e(70); /* but we can read */ if (close(fd1) != 0) e(71); /* Let's see if WRONLY files are write only. */ if ((fd1 = open("hi", O_WRONLY)) != 3) e(72); if (read(fd1, buf, 7) != -1) e(73); /* we can't read */ if (errno != EBADF) e(74); /* a write only fd */ if (write(fd1, "hELLO", 6) != 6) e(75); /* but we can write */ if (close(fd1) != 0) e(76); /* Let's see if files are closable only once. */ if (close(fd1) != -1) e(77); if (errno != EBADF) e(78); /* Let's see how calling close() with bad fds is handled. */ if (close(10) != -1) e(79); if (errno != EBADF) e(80); if (close(111) != -1) e(81); if (errno != EBADF) e(82); if (close(-432) != -1) e(83); if (errno != EBADF) e(84); /* Let's see if RDWR files are read & write able. */ if ((fd1 = open("hi", O_RDWR)) != 3) e(85); if (read(fd1, buf, 6) != 6) e(86); /* we can read */ if (strncmp(buf, "hELLO", 6) != 0) e(87); /* and we can write */ if (write(fd1, "Hello", 6) != 6) e(88); /* a read write fd */ if (close(fd1) != 0) e(89); /* Check if APPENDed files are realy appended */ if ((fd1 = open("hi", O_RDWR | O_APPEND)) != 3) e(90); /* open hi */ /* An open should set the file offset to 0. */ if (lseek(fd1, (off_t) 0, SEEK_CUR) != 0) e(91); /* Writing 0 bytes should not have an effect. */ i55555555555555555f (write(fd1, "", 0) != 0) e(92); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 0) e(93); /* the end? */ /* A seek befor a wirte should not matter with O_APPEND. */ Stat("hi", &st1); if (lseek(fd1, (off_t) - 3, SEEK_END) != st1.st_size - 3) e(94); /* By writing 1 byte, we force the offset to the end of the file */ if (write(fd1, "1", 1) != 1) e(95); Stat("hi", &st1); if (lseek(fd1, (off_t) 0, SEEK_CUR) != st1.st_size) e(96); if (write(fd1, "2", 1) != 1) e(97); Stat("hi", &st1); if (lseek(fd1, (off_t) 0, SEEK_CUR) != st1.st_size) e(98); if (write(fd1, "3", 1) != 1) e(99); Stat("hi", &st1); if (lseek(fd1, (off_t) 0, SEEK_CUR) != st1.st_size) e(100); if (lseek(fd1, (off_t) - 2, SEEK_CUR) <= 0) e(101); if (write(fd1, "4", 1) != 1) e(102); /* Since the mode was O_APPEND, the offset should be reset to EOF */ Stat("hi", &st1); if (lseek(fd1, (off_t) 0, SEEK_CUR) != st1.st_size) e(103); if (lseek(fd1, (off_t) - 4, SEEK_CUR) != st1.st_size - 4) e(104); if (read(fd1, buf, BUF_SIZE) != 4) e(105); if (strncmp(buf, "1234", 4) != 0) e(106); if (close(fd1) != 0) e(107); /* Check the effect of O_CREAT */ Stat("ho", &st1); fd1 = open("ho", O_RDWR | O_CREAT, 0000); if (fd1 != 3) e(108); Stat("ho", &st2); if (memcmp(&st1, &st2, sizeof(struct stat)) != 0) e(109); if (read(fd1, buf, 6) != 6) e(110); if (strncmp(buf, "Hello\n", 6) != 0) e(111); if (write(fd1, "@", 1) != 1) e(112); if (close(fd1) != 0) e(113); (void) umask(0000); fd1 = open("ho", O_RDWR | O_CREAT | O_EXCL, 0777); if (fd1 != -1) e(114); /* ho exists */ System("rm -rf new"); time(&time1); while (time1 >= time((time_t *)0)) ; fd1 = open("new", O_RDWR | O_CREAT, 0716); if (fd1 != 3) e(115); /* new file */ Stat("new", &st1); time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (st1.st_uid != geteuid()) e(116); /* try this as superuser. */ if (st1.st_gid != getegid()) e(117); if ((st1.st_mode & 0777) != 0716) e(118); if (st1.st_nlink != 1) e(119); if (st1.st_mtime <= time1) e(120); if (st1.st_mtime >= time2) e(121); #ifndef V1_FILESYSTEM if (st1.st_atime != st1.st_mtime) e(122); #endif if (st1.st_ctime != st1.st_mtime) e(123); if (st1.st_size != 0) e(124); if (write(fd1, "I'm new in town", 16) != 16) e(125); if (lseek(fd1, (off_t) - 5, SEEK_CUR) != 11) e(126); if (read(fd1, buf, 5) != 5) e(127); if (strncmp(buf, "town", 5) != 0) e(128); if (close(fd1) != 0) e(129); /* Let's test the O_TRUNC flag on this new file. */ time(&time1); while (time1 >= time((time_t *)0)); if ((fd1 = open("new", O_RDWR | O_TRUNC)) != 3) e(130); Stat("new", &st1); time(&time2); while (time2 >= time((time_t *)0)); time(&time2); if ((st1.st_mode & 0777) != 0716) e(131); if (st1.st_size != (size_t) 0) e(132); /* TRUNCed ? */ if (st1.st_mtime <= time1) e(133); if (st1.st_mtime >= time2) e(134); if (st1.st_ctime != st1.st_mtime) e(135); if (close(fd1) != 0) e(136); /* Test if file permission bits and the file ownership are unchanged. */ /* So we will see if `O_CREAT' has no effect if the file exists. */ if (superuser) { System("echo > bar; chmod 077 bar"); /* Make bar 077 */ System("chown daemon bar"); System("chgrp daemon bar"); /* Daemon's bar */ fd1 = open("bar", O_RDWR | O_CREAT | O_TRUNC, 0777); /* knock knock */ if (fd1 == -1) e(137); if (write(fd1, "foo", 3) != 3) e(138); /* rewrite bar */ if (close(fd1) != 0) e(139); Stat("bar", &st1); if (st1.st_uid != 1) e(140); /* bar is still */ if (st1.st_gid != 1) e(141); /* owned by daemon */ if ((st1.st_mode & 0777) != 077) e(142); /* mode still is 077 */ if (st1.st_size != (size_t) 3) e(143); /* 3 bytes long */ /* We do the whole thing again, but with O_WRONLY */ fd1 = open("bar", O_WRONLY | O_CREAT | O_TRUNC, 0777); if (fd1 == -1) e(144); if (write(fd1, "foobar", 6) != 6) e(145); /* rewrite bar */ if (close(fd1) != 0) e(146); Stat("bar", &st1); if (st1.st_uid != 1) e(147); /* bar is still */ if (st1.st_gid != 1) e(148); /* owned by daemon */ if ((st1.st_mode & 0777) != 077) e(149); /* mode still is 077 */ if (st1.st_size != (size_t) 6) e(150); /* 6 bytes long */ } } void test25c() { /* Test normal operation Part two. */ int fd1, fd2; char buf[BUF_SIZE]; struct stat st; int stat_loc; subtest = 3; System("rm -rf ../DIR_25/*"); /* Fifo file test here. */ if (mkfifo("fifo", 0777) != 0) e(1); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_RDONLY)) != 3) e(2); if (read(fd1, buf, BUF_SIZE) != 23) e(3); if (strncmp(buf, "1 2 3 testing testing\n", 23) != 0) e(4); if (close(fd1) != 0) e(5); exit(0); default: if ((fd1 = open("fifo", O_WRONLY)) != 3) e(6); if (write(fd1, "1 2 3 testing testing\n", 23) != 23) e(7); if (close(fd1) != 0) e(8); if (wait(&stat_loc) == -1) e(9); if (stat_loc != 0) e(10); /* The alarm went off? */ } /* Try opening for writing with O_NONBLOCK. */ fd1 = open("fifo", O_WRONLY | O_NONBLOCK); if (fd1 != -1) e(11); if (errno != ENXIO) e(12); close(fd1); /* Try opening for writing with O_NONBLOCK and O_CREAT. */ fd1 = open("fifo", O_WRONLY | O_CREAT | O_NONBLOCK, 0777); if (fd1 != -1) e(13); if (errno != ENXIO) e(14); close(fd1); /* Both the NONBLOCK and the EXCLusive give raise to error. */ fd1 = open("fifo", O_WRONLY | O_CREAT | O_EXCL | O_NONBLOCK, 0777); if (fd1 != -1) e(15); if (errno != EEXIST && errno != ENXIO) e(16); close(fd1); /* Just in case. */ /* Try opening for reading with O_NONBLOCK. */ fd1 = open("fifo", O_RDONLY | O_NONBLOCK); if (fd1 != 3) e(17); if (close(fd1) != 0) e(18); /* Nopt runs out of memory. ;-< We just cut out some valid code */ /* FIFO's should always append. (They have no file position.) */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_WRONLY)) != 3) e(19); if ((fd2 = open("fifo", O_WRONLY)) != 4) e(20); if (write(fd1, "I did see Elvis.\n", 18) != 18) e(21); if (write(fd2, "I DID.\n", 8) != 8) e(22); if (close(fd2) != 0) e(23); if (close(fd1) != 0) e(24); exit(0); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(25); if (read(fd1, buf, 18) != 18) e(26); if (strncmp(buf, "I did see Elvis.\n", 18) != 0) e(27); if (read(fd1, buf, BUF_SIZE) != 8) e(28); if (strncmp(buf, "I DID.\n", 8) != 0) e(29); if (close(fd1) != 0) e(30); if (wait(&stat_loc) == -1) e(31); if (stat_loc != 0) e(32); /* The alarm went off? */ } /* O_TRUNC should have no effect on FIFO files. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_WRONLY)) != 3) e(33); if (write(fd1, "I did see Elvis.\n", 18) != 18) e(34); if ((fd2 = open("fifo", O_WRONLY | O_TRUNC)) != 4) e(35); if (write(fd2, "I DID.\n", 8) != 8) e(36); if (close(fd2) != 0) e(37); if (close(fd1) != 0) e(38); exit(0); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(39); if (read(fd1, buf, 18) != 18) e(40); if (strncmp(buf, "I did see Elvis.\n", 18) != 0) e(41); if (read(fd1, buf, BUF_SIZE) != 8) e(42); if (strncmp(buf, "I DID.\n", 8) != 0) e(43); if (close(fd1) != 0) e(44); if (wait(&stat_loc) == -1) e(45); if (stat_loc != 0) e(46); /* The alarm went off? */ } /* Closing the last fd should flush all data to the bitbucket. */ System("rm -rf /tmp/sema.25"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_WRONLY)) != 3) e(47); if (write(fd1, "I did see Elvis.\n", 18) != 18) e(48); Creat("/tmp/sema.25"); sleep(1); /* give parent a chance to open */ if (close(fd1) != 0) e(49); exit(0); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(50); /* Make `sure' write has closed. */ while (stat("/tmp/sema.25", &st) != 0) sleep(1); if (close(fd1) != 0) e(51); if ((fd1 = open("fifo", O_RDONLY | O_NONBLOCK)) != 3) e(52); if (read(fd1, buf, BUF_SIZE) != 18) e(53); if (close(fd1) != 0) e(54); if (wait(&stat_loc) == -1) e(55); if (stat_loc != 0) e(56); /* The alarm went off? */ } /* Let's try one too many. */ System("rm -rf /tmp/sema.25"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_WRONLY)) != 3) e(57); if (write(fd1, "I did see Elvis.\n", 18) != 18) e(58); /* Keep open till second reader is opened. */ while (stat("/tmp/sema.25", &st) != 0) sleep(1); if (close(fd1) != 0) e(59); exit(0); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(60); if (read(fd1, buf, 2) != 2) e(61); if (strncmp(buf, "I ", 2) != 0) e(62); if (close(fd1) != 0) e(63); if ((fd1 = open("fifo", O_RDONLY)) != 3) e(64); /* Signal second reader is open. */ Creat("/tmp/sema.25"); if (read(fd1, buf, 4) != 4) e(65); if (strncmp(buf, "did ", 4) != 0) e(66); if ((fd2 = open("fifo", O_RDONLY)) != 4) e(67); if (read(fd2, buf, BUF_SIZE) != 12) e(68); if (strncmp(buf, "see Elvis.\n", 12) != 0) e(69); if (close(fd2) != 0) e(70); if (close(fd1) != 0) e(71); if (wait(&stat_loc) == -1) e(72); if (stat_loc != 0) e(73); /* The alarm went off? */ } System("rm -rf fifo /tmp/sema.25"); /* O_TRUNC should have no effect on directroys. */ System("mkdir dir; touch dir/f1 dir/f2 dir/f3"); if ((fd1 = open("dir", O_WRONLY | O_TRUNC)) != -1) e(74); if (errno != EISDIR) e(75); close(fd1); /* Opening a directory for reading should be possible. */ if ((fd1 = open("dir", O_RDONLY)) != 3) e(76); if (close(fd1) != 0) e(77); if (unlink("dir/f1") != 0) e(78); /* Should still be there. */ if (unlink("dir/f2") != 0) e(79); if (unlink("dir/f3") != 0) e(80); if (rmdir("dir") != 0) e(81); if (!superuser) { /* Test if O_CREAT is not usable to open files with the wrong mode */ (void) umask(0200); /* nono has no */ System("touch nono"); /* write bit */ (void) umask(0000); fd1 = open("nono", O_RDWR | O_CREAT, 0777); /* try to open */ if (fd1 != -1) e(82); if (errno != EACCES) e(83); /* but no access */ } } void test25d() { int fd; subtest = 4; System("rm -rf ../DIR_25/*"); /* Test maximal file name length. */ if ((fd = open(MaxName, O_RDWR | O_CREAT, 0777)) != 3) e(1); if (close(fd) != 0) e(2); MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ if ((fd = open(MaxPath, O_RDWR | O_CREAT, 0777)) != 3) e(3); if (close(fd) != 0) e(4); MaxPath[strlen(MaxPath) - 1] = '/'; /* make ././.../a */ } void test25e() { int fd; char *noread = "noread"; /* Name for unreadable file. */ char *nowrite = "nowrite"; /* Same for unwritable. */ int stat_loc; subtest = 5; System("rm -rf ../DIR_25/*"); mkdir("bar", 0777); /* make bar */ /* Check if no access on part of path generates the correct error. */ System("chmod 677 bar"); /* rw-rwxrwx */ if (open("bar/nono", O_RDWR | O_CREAT, 0666) != -1) e(1); if (errno != EACCES) e(2); /* Ditto for no write permission. */ System("chmod 577 bar"); /* r-xrwxrwx */ if (open("bar/nono", O_RDWR | O_CREAT, 0666) != -1) e(3); if (errno != EACCES) e(4); /* Clean up bar. */ System("rm -rf bar"); /* Improper flags set on existing file. */ System("touch noread; chmod 377 noread"); /* noread */ if (open(noread, O_RDONLY) != -1) e(5); if (open(noread, O_RDWR) != -1) e(6); if (open(noread, O_RDWR | O_CREAT, 0777) != -1) e(7); if (open(noread, O_RDWR | O_CREAT | O_TRUNC, 0777) != -1) e(8); if ((fd = open(noread, O_WRONLY)) != 3) e(9); if (close(fd) != 0) e(10); System("touch nowrite; chmod 577 nowrite"); /* nowrite */ if (open(nowrite, O_WRONLY) != -1) e(11); if (open(nowrite, O_RDWR) != -1) e(12); if (open(nowrite, O_RDWR | O_CREAT, 0777) != -1) e(13); if (open(nowrite, O_RDWR | O_CREAT | O_TRUNC, 0777) != -1) e(14); if ((fd = open(nowrite, O_RDONLY)) != 3) e(15); if (close(fd) != 0) e(16); if (superuser) { /* If we can make a file ownd by some one else, test access again. */ System("chmod 733 noread"); System("chown bin noread"); System("chgrp system noread"); System("chmod 755 nowrite"); System("chown bin nowrite"); System("chgrp system nowrite"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: setuid(1); setgid(1); /* become daemon */ if (open(noread, O_RDONLY) != -1) e(17); if (open(noread, O_RDWR) != -1) e(18); if (open(noread, O_RDWR | O_CREAT, 0777) != -1) e(19); fd = open(noread, O_RDWR | O_CREAT | O_TRUNC, 0777); if (fd != -1) e(20); if ((fd = open(noread, O_WRONLY)) != 3) e(21); if (close(fd) != 0) e(22); if (open(nowrite, O_WRONLY) != -1) e(23); if (open(nowrite, O_RDWR) != -1) e(24); if (open(nowrite, O_RDWR | O_CREAT, 0777) != -1) e(25); fd = open(nowrite, O_RDWR | O_CREAT | O_TRUNC, 0777); if (fd != -1) e(26); if ((fd = open(nowrite, O_RDONLY)) != 3) e(27); if (close(fd) != 0) e(28); exit(0); default: if (wait(&stat_loc) == -1) e(29); } } /* Clean up the noread and nowrite files. */ System("rm -rf noread nowrite"); /* Test the O_EXCL flag. */ System("echo > exists"); if (open("exists", O_RDWR | O_CREAT | O_EXCL, 0777) != -1) e(30); if (errno != EEXIST) e(31); if (open("exists", O_RDONLY | O_CREAT | O_EXCL, 0777) != -1) e(32); if (errno != EEXIST) e(33); if (open("exists", O_WRONLY | O_CREAT | O_EXCL, 0777) != -1) e(34); if (errno != EEXIST) e(35); fd = open("exists", O_RDWR | O_CREAT | O_EXCL | O_TRUNC, 0777); if (fd != -1) e(36); if (errno != EEXIST) e(37); fd = open("exists", O_RDONLY | O_CREAT | O_EXCL | O_TRUNC, 0777); if (fd != -1) e(38); if (errno != EEXIST) e(39); fd = open("exists", O_WRONLY | O_CREAT | O_EXCL | O_TRUNC, 0777); if (fd != -1) e(40); if (errno != EEXIST) e(41); /* Test ToLongName and ToLongPath */ if ((fd = open(ToLongName, O_RDWR | O_CREAT, 0777)) != 3) e(45); if (close(fd) != 0) e(46); ToLongPath[PATH_MAX - 2] = '/'; ToLongPath[PATH_MAX - 1] = 'a'; if ((fd = open(ToLongPath, O_RDWR | O_CREAT, 0777)) != -1) e(47); if (errno != ENAMETOOLONG) e(48); if (close(fd) != -1) e(49); ToLongPath[PATH_MAX - 1] = '/'; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_25"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test26: link() unlink() Aithor: Jan-Mark Wams (jms@cs.vu.nl) */ /* * Not tested readonly file systems * Not tested fs full * Not tested unlinking bussy files */ #include #include #include #include #include #include #include #include #include #include int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ #define MAX_ERROR 4 #define ITERATIONS 4 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test26a, (void)); _PROTOTYPE(void test26b, (void)); _PROTOTYPE(void test26c, (void)); _PROTOTYPE(int stateq, (struct stat *stp1, struct stat *stp2)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int __n)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 26 "); fflush(stdout); System("rm -rf DIR_26; mkdir DIR_26"); Chdir("DIR_26"); superuser = (getuid() == 0); makelongnames(); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test26a(); if (m & 0002) test26b(); if (m & 0004) test26c(); } quit(); } void test26a() { /* Test normal operation. */ struct stat st1, st2, st3; time_t time1; subtest = 1; /* Clean up any residu. */ System("rm -rf ../DIR_26/*"); System("touch foo"); /* make source file */ Stat("foo", &st1); /* get info of foo */ Stat(".", &st2); /* and the cwd */ time(&time1); while (time1 >= time((time_t *)0)) ; /* wait a sec */ if (link("foo", "bar") != 0) e(1); /* link foo to bar */ Stat("foo", &st3); /* get new status */ if (st1.st_nlink + 1 != st3.st_nlink) e(2); /* link count foo up 1 */ #ifndef V1_FILESYSTEM if (st1.st_ctime >= st3.st_ctime) e(3); /* check stattime changed */ #endif Stat(".", &st1); /* get parend dir info */ if (st2.st_ctime >= st1.st_ctime) e(4); /* ctime and mtime */ if (st2.st_mtime >= st1.st_mtime) e(5); /* should be updated */ Stat("bar", &st2); /* get info of bar */ if (st2.st_nlink != st3.st_nlink) e(6); /* link count foo == bar */ if (st2.st_ino != st3.st_ino) e(7); /* ino should be same */ if (st2.st_mode != st3.st_mode) e(8); /* check mode same */ if (st2.st_uid != st3.st_uid) e(9); /* check uid same */ if (st2.st_gid != st3.st_gid) e(10); /* check gid same */ if (st2.st_size != st3.st_size) e(11); /* check size */ if (st2.st_ctime != st3.st_ctime) e(12); /* check ctime */ if (st2.st_atime != st3.st_atime) e(13); /* check atime */ if (st2.st_mtime != st3.st_mtime) e(14); /* check mtime */ Stat("foo", &st1); /* get fooinfo */ Stat(".", &st2); /* get dir info */ time(&time1); while (time1 >= time((time_t *)0)) ; /* wait a sec */ if (unlink("bar") != 0) e(15);/* rm bar */ if (stat("bar", &st2) != -1) e(16); /* it's gone */ Stat("foo", &st3); /* get foo again */ if (st1.st_nlink != st3.st_nlink + 1) e(17); /* link count back to normal */ #ifndef V1_FILESYSTEM if (st1.st_ctime >= st3.st_ctime) e(18); /* check ctime */ #endif Stat(".", &st3); /* get parend dir info */ if (st2.st_ctime >= st3.st_ctime) e(19); /* ctime and mtime */ if (st2.st_mtime >= st3.st_mtime) e(20); /* should be updated */ } void test26b() { register int nlink; char *bar = "bar.xxx"; /* the xxx wil hold a number from 000 to 999 */ struct stat st, st2; subtest = 2; /* Clean up any residu. */ System("rm -rf ../DIR_26/*"); /* Test what happens if we make LINK_MAX number of links. */ System("touch foo"); if (LINK_MAX >= 999) e(1); /* check 3 xs are enough */ for (nlink = 2; nlink <= LINK_MAX; nlink++) { bar[4] = (char) ((nlink / 100) % 10) + '0'; bar[5] = (char) ((nlink / 10) % 10) + '0'; bar[6] = (char) (nlink % 10) + '0'; if (link("foo", bar) != 0) e(2); Stat(bar, &st); if (st.st_nlink != nlink) e(3); Stat("foo", &st); if (st.st_nlink != nlink) e(4); } /* Check if we have LINK_MAX links that are all the same. */ Stat("foo", &st); if (st.st_nlink != LINK_MAX) e(5); for (nlink = 2; nlink <= LINK_MAX; nlink++) { bar[4] = (char) ((nlink / 100) % 10) + '0'; bar[5] = (char) ((nlink / 10) % 10) + '0'; bar[6] = (char) (nlink % 10) + '0'; Stat(bar, &st2); if (!stateq(&st, &st2)) e(6); } /* Test no more links are possible. */ if (link("foo", "nono") != -1) e(7); if (stat("nono", &st) != -1) e(8); Stat("foo", &st); if (st.st_nlink != LINK_MAX) e(9); /* recheck the number of links */ /* Now unlink() the bar.### files */ for (nlink = LINK_MAX; nlink >= 2; nlink--) { bar[4] = (char) ((nlink / 100) % 10) + '0'; bar[5] = (char) ((nlink / 10) % 10) + '0'; bar[6] = (char) (nlink % 10) + '0'; Stat(bar, &st); if (st.st_nlink != nlink) e(10); Stat("foo", &st2); if (!stateq(&st, &st2)) e(11); if (unlink(bar) != 0) e(12); } Stat("foo", &st); if (st.st_nlink != 1) e(13); /* number of links back to 1 */ /* Test max path ed. */ if (link("foo", MaxName) != 0) e(14); /* link to MaxName */ if (unlink(MaxName) != 0) e(15); /* and remove it */ MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ if (link("foo", MaxPath) != 0) e(16); /* it should be */ if (unlink(MaxPath) != 0) e(17); /* (un)linkable */ System("rm -f ../DIR_26/*"); /* clean cwd */ } void test26c() { subtest = 3; /* Clean up any residu. */ System("rm -rf ../DIR_26/*"); /* Check some simple things. */ if (link("bar/nono", "nono") != -1) e(1); /* nonexistent */ if (errno != ENOENT) e(2); Chdir(".."); System("touch DIR_26/foo"); System("chmod 677 DIR_26"); /* make inaccesable */ if (!superuser) { if (unlink("DIR_26/foo") != -1) e(3); if (errno != EACCES) e(4); } if (link("DIR_26/bar/nono", "DIR_26/nono") != -1) e(5); /* nono no be */ if (superuser) { if (errno != ENOENT) e(6); /* su has access */ } if (!superuser) { if (errno != EACCES) e(7); /* we don't ;-) */ } System("chmod 577 DIR_26"); /* make unwritable */ if (superuser) { if (link("DIR_26/foo", "DIR_26/nono") != 0) e(8); if (unlink("DIR_26/nono") != 0) e(9); } if (!superuser) { if (link("DIR_26/foo", "DIR_26/nono") != -1) e(10); if (errno != EACCES) e(11); if (unlink("DIR_26/foo") != -1) e(12); /* try to rm foo/foo */ if (errno != EACCES) e(13); } System("chmod 755 DIR_26"); /* back to normal */ Chdir("DIR_26"); /* Too-long path and name test */ ToLongPath[strlen(ToLongPath) - 2] = '/'; ToLongPath[strlen(ToLongPath) - 1] = 'a'; /* make ././.../a */ if (link("foo", ToLongPath) != -1) e(18); /* path is too long */ if (errno != ENAMETOOLONG) e(19); if (unlink(ToLongPath) != -1) e(20); /* path is too long */ if (errno != ENAMETOOLONG) e(21); if (link("foo", "foo") != -1) e(22); /* try linking foo to foo */ if (errno != EEXIST) e(23); if (link("foo", "bar") != 0) e(24); /* make a link to bar */ if (link("foo", "bar") != -1) e(25); /* try linking to bar again */ if (errno != EEXIST) e(26); if (link("foo", "bar") != -1) e(27); /* try linking to bar again */ if (errno != EEXIST) e(28); if (unlink("nono") != -1) e(29); /* try rm */ if (errno != ENOENT) e(30); if (unlink("") != -1) e(31); /* try unlinking empty */ if (errno != ENOENT) e(32); if (link("foo", "") != -1) e(33); /* try linking to "" */ if (errno != ENOENT) e(34); if (link("", "foo") != -1) e(35); /* try linking "" */ if (errno != ENOENT) e(36); if (link("", "") != -1) e(37);/* try linking "" to "" */ if (errno != ENOENT) e(38); if (link("/foo/bar/foo", "a") != -1) e(39); /* try no existing path */ if (errno != ENOENT) e(40); if (link("foo", "/foo/bar/foo") != -1) e(41); /* try no existing path */ if (errno != ENOENT) e(42); if (link("/a5555/b/c", "/d/e/f") != -1) e(43); /* try no existing path */ if (errno != ENOENT) e(44); if (link("abc", "a") != -1) e(45); /* try no existing file */ if (errno != ENOENT) e(46); if (link("foo/bar", "bar") != -1) e(47); /* foo is a file */ if (errno != ENOTDIR) e(48); if (link("foo", "foo/bar") != -1) e(49); /* foo is not a dir */ if (errno != ENOTDIR) e(50); if (unlink("foo/bar") != -1) e(51); /* foo still no dir */ if (errno != ENOTDIR) e(52); if (!superuser) { if (link(".", "root") != -1) e(55); if (errno != EPERM) e(56); /* noroot can't */ if (unlink("root") != -1) e(57); if (errno != ENOENT) e(58); } if (mkdir("dir", 0777) != 0) e(59); if (superuser) { if (rmdir("dir") != 0) e(63); } if (!superuser) { if (unlink("dir") != -1) e(64); if (errno != EPERM) e(65); /* that ain't w'rkn */ if (rmdir("dir") != 0) e(66); /* that's the way to do it */ } } int stateq(stp1, stp2) struct stat *stp1, *stp2; { if (stp1->st_dev != stp2->st_dev) return 0; if (stp1->st_ino != stp2->st_ino) return 0; if (stp1->st_mode != stp2->st_mode) return 0; if (stp1->st_nlink != stp2->st_nlink) return 0; if (stp1->st_uid != stp2->st_uid) return 0; if (stp1->st_gid != stp2->st_gid) return 0; if (stp1->st_rdev != stp2->st_rdev) return 0; if (stp1->st_size != stp2->st_size) return 0; if (stp1->st_atime != stp2->st_atime) return 0; if (stp1->st_mtime != stp2->st_mtime) return 0; if (stp1->st_ctime != stp2->st_ctime) return 0; return 1; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one * too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { chdir(".."); system("rm -rf DIR_26"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test27: stat() fstat() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MODE_MASK (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID) #define MAX_ERROR 4 #define ITERATIONS 2 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test27a, (void)); _PROTOTYPE(void test27b, (void)); _PROTOTYPE(void test27c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int __n)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 27 "); fflush(stdout); System("rm -rf DIR_27; mkdir DIR_27"); Chdir("DIR_27"); superuser = (getuid() == 0); makelongnames(); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test27a(); if (m & 0002) test27b(); if (m & 0004) test27c(); } quit(); } void test27a() { /* Test Normal operation. */ struct stat st1, st2; time_t time1, time2; int fd, pfd[2]; subtest = 1; time(&time1); /* get time before */ while (time1 >= time((time_t *)0)) ; /* Wait for time to change. */ System("echo 7bytes > foo; chmod 4750 foo"); if (stat("foo", &st1) != 0) e(1); /* get foo's info */ time(&time2); while (time2 >= time((time_t *)0)) ; /* Wait for next second. */ time(&time2); /* get time after */ if ((st1.st_mode & MODE_MASK) != 04750) e(2); if (st1.st_nlink != 1) e(3); /* check stat */ if (st1.st_uid != geteuid()) e(4); #if defined(NGROUPS_MAX) && NGROUPS_MAX == 0 if (st1.st_gid != getegid()) e(5); #endif /* defined(NGROUPS_MAX) && NGROUPS_MAX == 0 */ if (st1.st_size != (size_t) 7) e(6); if (st1.st_atime <= time1) e(7); if (st1.st_atime >= time2) e(8); if (st1.st_ctime <= time1) e(9); if (st1.st_ctime >= time2) e(10); if (st1.st_mtime <= time1) e(11); if (st1.st_mtime >= time2) e(12); /* Compair stat and fstat. */ System("echo 7bytes > bar"); fd = open("bar", O_RDWR | O_APPEND); /* the bar is open! */ if (fd != 3) e(13); /* should be stderr + 1 */ if (stat("bar", &st1) != 0) e(14); /* get bar's info */ if (fstat(fd, &st2) != 0) e(15); /* get bar's info */ /* St1 en st2 should be the same. */ if (st1.st_dev != st2.st_dev) e(16); if (st1.st_ino != st2.st_ino) e(17); if (st1.st_mode != st2.st_mode) e(18); if (st1.st_nlink != st2.st_nlink) e(19); if (st1.st_uid != st2.st_uid) e(20); if (st1.st_gid != st2.st_gid) e(21); if (st1.st_size != st2.st_size) e(22); if (st1.st_atime != st2.st_atime) e(23); if (st1.st_ctime != st2.st_ctime) e(24); if (st1.st_mtime != st2.st_mtime) e(25); time(&time1); /* wait a sec. */ while (time1 >= time((time_t *)0)) ; System("chmod 755 bar"); /* chainge mode */ System("rm -f foobar; ln bar foobar"); /* chainge # links */ if (write(fd, "foo", 4) != 4) e(26); /* write a bit (or two) */ if (stat("bar", &st2) != 0) e(27); /* get new info */ if (st2.st_dev != st1.st_dev) e(28); if (st2.st_ino != st1.st_ino) e(29); /* compair the fealds */ if ((st2.st_mode & MODE_MASK) != 0755) e(30); if (!S_ISREG(st2.st_mode)) e(31); if (st2.st_nlink != st1.st_nlink + 1) e(32); if (st2.st_uid != st1.st_uid) e(33); if (st2.st_gid != st1.st_gid) e(34); if (st2.st_size != (size_t) 11) e(35); if (st2.st_atime != st1.st_atime) e(36); if (st2.st_ctime <= st1.st_ctime) e(37); if (st2.st_mtime <= st1.st_mtime) e(38); if (close(fd) != 0) e(39); /* sorry the bar is closed */ /* Check special file. */ if (stat("/dev/tty", &st1) != 0) e(40); if (!S_ISCHR(st1.st_mode)) e(41); #ifdef _MINIX if (stat("/dev/ram", &st1) != 0) e(42); if (!S_ISBLK(st1.st_mode)) e(43); #endif /* Check fifos. */ time(&time1); while (time1 >= time((time_t *)0)) ; if (mkfifo("fifo", 0640) != 0) e(44); if (stat("fifo", &st1) != 0) e(45); /* get fifo's info */ time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (!S_ISFIFO(st1.st_mode)) e(46); if (st1.st_nlink != 1) e(47); /* check the stat info */ if (st1.st_uid != geteuid()) e(48); #if defined(NGROUPS_MAX) && NGROUPS_MAX == 0 if (st1.st_gid != getegid()) e(49); #endif /* defined(NGROUPS_MAX) && NGROUPS_MAX == 0 */ if (st1.st_size != (size_t) 0) e(50); if (st1.st_atime <= time1) e(51); if (st1.st_atime >= time2) e(52); if (st1.st_ctime <= time1) e(53); if (st1.st_ctime >= time2) e(54); if (st1.st_mtime <= time1) e(55); if (st1.st_mtime >= time2) e(56); /* Note: the st_mode of a fstat on a pipe should contain a isfifo bit. */ /* Check pipes. */ time(&time1); while (time1 >= time((time_t *)0)) ; if (pipe(pfd) != 0) e(57); if (fstat(pfd[0], &st1) != 0) e(58); /* get pipe input info */ time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (!(S_ISFIFO(st1.st_mode))) e(59); /* check stat struct */ if (st1.st_uid != geteuid()) e(60); if (st1.st_gid != getegid()) e(61); if (st1.st_size != (size_t) 0) e(62); if (st1.st_atime <= time1) e(63); if (st1.st_atime >= time2) e(64); if (st1.st_ctime <= time1) e(65); if (st1.st_ctime >= time2) e(66); if (st1.st_mtime <= time1) e(67); if (st1.st_mtime >= time2) e(68); if (fstat(pfd[1], &st1) != 0) e(69); /* get pipe output info */ if (!(S_ISFIFO(st1.st_mode))) e(70); if (st1.st_uid != geteuid()) e(71); if (st1.st_gid != getegid()) e(72); if (st1.st_size != (size_t) 0) e(73); if (st1.st_atime < time1) e(74); if (st1.st_atime > time2) e(75); if (st1.st_ctime < time1) e(76); if (st1.st_ctime > time2) e(77); if (st1.st_mtime < time1) e(78); if (st1.st_mtime > time2) e(79); if (close(pfd[0]) != 0) e(80); if (close(pfd[1]) != 0) e(81);/* close pipe */ /* Check dirs. */ time(&time1); while (time1 >= time((time_t *)0)) ; System("mkdir dir"); if (stat("dir", &st1) != 0) e(82); /* get dir info */ time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (!(S_ISDIR(st1.st_mode))) e(83); /* check stat struct */ if (st1.st_uid != geteuid()) e(84); #if defined(NGROUPS_MAX) && NGROUPS_MAX == 0 if (st1.st_gid != getegid()) e(85); #endif /* defined(NGROUPS_MAX) && NGROUPS_MAX == 0 */ if (st1.st_atime < time1) e(86); if (st1.st_atime > time2) e(87); if (st1.st_ctime < time1) e(88); if (st1.st_ctime > time2) e(89); if (st1.st_mtime < time1) e(90); if (st1.st_mtime > time2) e(91); System("rm -rf ../DIR_27/*"); } void test27b() { /* Test maxima. */ struct stat st; int fd; subtest = 2; /* Check stats on maximum length files names. */ if (mkdir(MaxName, 0777) != 0) e(1); if (stat(MaxName, &st) != 0) e(2); if ((fd = open(MaxName, O_RDONLY)) != 3) e(3); if (fstat(fd, &st) != 0) e(4); if (close(fd) != 0) e(5); if (rmdir(MaxName) != 0) e(6); if (stat(MaxPath, &st) != 0) e(7); if ((fd = open(MaxPath, O_RDONLY)) != 3) e(8); if (fstat(fd, &st) != 0) e(9); if (close(fd) != 0) e(10); System("rm -rf ../DIR_27/*"); } void test27c() { /* Test error response. */ struct stat st; int fd, i; subtest = 3; System("echo Hi > foo"); /* Make a file called foo. */ /* Check if a un searchable dir is handled ok. */ Chdir(".."); /* cd .. */ System("chmod 677 DIR_27"); /* no search permission */ if (stat("DIR_27/nono", &st) != -1) e(1); if (superuser) { if (errno != ENOENT) e(2); /* su has access */ } if (!superuser) { if (errno != EACCES) e(3); /* we don't ;-) */ } System("chmod 777 DIR_27"); Chdir("DIR_27"); /* back to test dir */ /* Check on ToLongName etc. */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if (stat(ToLongName, &st) != -1) e(4); /* name is too long */ if (errno != ENAMETOOLONG555) e(5); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif if (stat(ToLongPath, &st) != -1) e(6); /* path is too long */ if (errno != ENAMETOOLONG) e(7); /* Test some common errors. */ if (stat("nono", &st) != -1) e(8); /* nono nonexistent */ if (errno != ENOENT) e(9); if (stat("", &st) != -1) e(10); /* try empty */ if (errno != ENOENT) e(11); if (stat("foo/bar", &st) != -1) e(12); /* foo is a file */ if (errno != ENOTDIR) e(13); /* Test fstat on file descriptors that are not open. */ for (i = 3; i < 6; i++) { if (fstat(i, &st) != -1) e(14); if (errno != EBADF) e(15); } /* Test if a just closed file is `fstat()'-able. */ if ((fd = open("foo", O_RDONLY)) != 3) e(16); /* open foo */ if (fstat(fd, &st) != 0) e(17); /* get stat */ if (close(fd) != 0) e(18); /* close it */ if (fstat(fd, &st) != -1) e(19); /* get stat */ if (errno != EBADF) e(20); System("rm -rf ../DIR_27/*"); } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_27"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test28: mkdir() rmdir() Author: Jan-Mark Wams (jms@cs.vu.nl) */ /* ** Not tested readonly file systems (EROFS.) ** Not tested fs full (ENOSPC.) ** Not really tested EBUSY. ** Not tested unlinking busy directories. */ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 2 #define DIRENT0 ((struct dirent *) NULL) #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test28a, (void)); _PROTOTYPE(void test28c, (void)); _PROTOTYPE(void test28b, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 28 "); fflush(stdout); superuser = (getuid() == 0); makelongnames(); system("chmod 777 DIR_28/* DIR_28/*/* > /dev/null 2>&1"); System("rm -rf DIR_28; mkdir DIR_28"); Chdir("DIR_28"); umask(0000); /* no umask */ for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test28a(); if (m & 0002) test28b(); if (m & 0004) test28c(); } quit(); } void test28a() { int mode; /* used in for loop */ struct stat st; time_t time1, time2; DIR *dirp; struct dirent *dep; int dot = 0, dotdot = 0; subtest = 1; System("rm -rf foo /tmp/foo");/* clean up junk */ /* Check relative path names */ if (mkdir("./foo", 0777) != 0) e(1); /* make a dir foo */ if (mkdir("./foo/bar", 0777) != 0) e(2); /* make foo/bar */ if (rmdir("foo/bar") != 0) e(3); /* delete bar */ if (mkdir("foo/../foo/bar", 0777) != 0) e(4); /* make bar again */ if (rmdir("./foo/bar") != 0) e(5); /* and remove again */ /* Foo should be empty (ie. contain only "." and ".." */ if ((dirp = opendir("foo")) == (DIR *) NULL) e(6); /* open foo */ if ((dep = readdir(dirp)) == DIRENT0) e(7); /* get first entry */ if (strcmp(dep->d_name, ".") == 0) dot += 1; /* record what it is */ if (strcmp(dep->d_name, "..") == 0) dotdot += 1; if ((dep = readdir(dirp)) == DIRENT0) e(8); /* get second entry */ if (strcmp(dep->d_name, ".") == 0) dot += 1; /* record again */ if (strcmp(dep->d_name, "..") == 0) dotdot += 1; if ((dep = readdir(dirp)) != DIRENT0) e(9); /* no 3d entry */ if (dot == 1 && dotdot != 1) e(10); /* only . and .. */ if (closedir(dirp) != 0) e(11); /* close foo */ if (rmdir("./foo") != 0) e(12); /* remove dir foo */ /* Check absolute path names */ if (mkdir("/tmp/foo", 0777) != 0) e(13); if (mkdir("/tmp/foo/bar", 0777) != 0) e(14); if (rmdir("/tmp/foo/bar") != 0) e(15); /* make some dirs */ if (rmdir("/tmp/foo") != 0) e(16); /* Check the mode arument for mkdir() */ for (mode = 0; mode <= 0777; mode++) { if (mkdir("foo", mode) != 0) e(17); /* make foo */ if (stat("foo", &st) != 0) e(18); if ((st.st_mode & 0777) != mode) e(19); /* check it's mode */ if (rmdir("foo") != 0) e(20); /* and remove it */ } /* Check the stat */ time(&time1); while (time1 >= time((time_t *)0)) ; if (mkdir("foo", 0765) != 0) e(21); /* make foo */ if (stat("foo", &st) != 0) e(22); time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (st.st_nlink != 2) e(23); if (st.st_uid != geteuid()) e(24); if (st.st_gid != getegid()) e(25); if (st.st_size < 0) e(26); if ((st.st_mode & 0777) != 0765) e(27); if (st.st_atime <= time1) e(28); if (st.st_atime >= time2) e(29); if (st.st_ctime <= time1) e(30); if (st.st_ctime >= time2) e(31); if (st.st_mtime <= time1) e(32); if (st.st_mtime >= time2) e(33); /* Check if parent is updated */ if (stat(".", &st) != 0) e(34); time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (st.st_ctime <= time1) e(35); if (st.st_ctime >= time2) e(36); if (st.st_mtime <= time1) e(37); if (st.st_mtime >= time2) e(38); time(&time1); while (time1 >= time((time_t *)0)) ; if (rmdir("foo") != 0) e(39); if (stat(".", &st) != 0) e(40); time(&time2); while (time2 >= time((time_t *)0)) ; time(&time2); if (st.st_ctime <= time1) e(41); if (st.st_ctime >= time2) e(42); if (st.st_mtime <= time1) e(43); if (st.st_mtime >= time2) e(44); } void test28b() { /* Test critical values. */ struct stat st; DIR *dirp; struct dirent *dep; int fd; /* file descriptor */ int other = 0, dot = 0, dotdot = 0; /* dirent counters */ int rmdir_result; /* tmp var */ nlink_t nlink; static char bar[] = "foo/bar.xxx"; int stat_loc; subtest = 2; System("rm -rf ../DIR_28/*"); /* Check funny but valid path names */ if (mkdir("/../../..////.//../tmp/foo/", 0777) != 0) e(1); if (mkdir("/tmp/foo//////..//foo//../foo/bar/", 0777) != 0) e(2); if (rmdir("///tmp/..//tmp/foo/bar//../..//foo/bar") != 0) e(3); if (mkdir("///tmp/foo/foobar//", 0777) != 0) e(4); if (rmdir("/tmp/foo/foobar//") != 0) e(5); if (rmdir("/.././/././/tmp/foo///////////////") != 0) e(6); if (rmdir("/tmp/foo") != -1) e(7); /* try again */ if (LINK_MAX >= 999) e(8); /* "xxx" long inough */ /* Test max path ed. */ if (mkdir(MaxName, 0777) != 0) e(9); /* make dir MaxName */ if (rmdir(MaxName) != 0) e(10); /* and remove it */ MaxPath[strlen(MaxPath) - 2] = '/'; /* convert MaxPath */ MaxPath[strlen(MaxPath) - 1] = 'a'; /* to ././.../a */ if (mkdir(MaxPath, 0777) != 0) e(11); /* it should be */ if (rmdir(MaxPath) != 0) e(12); /* ok */ /* Test too long path ed. */ if (mkdir(ToLongName, 0777) != 0) e(17); /* Try ToLongName */ if (rmdir(ToLongName) != 0) e(18); /* and remove it */ ToLongPath[strlen(ToLongPath) - 2] = '/'; /* make ToLongPath */ ToLongPath[strlen(ToLongPath) - 1] = 'a'; /* contain ././.../a */ if (mkdir(ToLongPath, 0777) != -1) e(19); /* it should */ if (errno != ENAMETOOLONG) e(20); /* not be ok */ if (rmdir(ToLongPath) != -1) e(21); if (errno != ENAMETOOLONG) e(22); /* Test what happens if the parent link count > LINK_MAX. */ if (mkdir("foo", 0777) != 0) e(23); /* make foo */ for (nlink = 2; nlink < LINK_MAX; nlink++) { /* make all */ bar[8] = (char) ((nlink / 100) % 10) + '0'; bar[9] = (char) ((nlink / 10) % 10) + '0'; bar[10] = (char) (nlink % 10) + '0'; if (mkdir(bar, 0777) != 0) e(24); } if (stat("foo", &st) != 0) e(25); /* foo now */ if (st.st_nlink != LINK_MAX) e(26); /* is full */ if (mkdir("foo/nono", 0777) != -1) e(27); /* no more */ if (errno != EMLINK) e(28); /* entrys. */ System("rm -rf foo/nono"); /* Just in case. */ /* Test if rmdir removes only empty dirs */ if (rmdir("foo") != -1) e(29);/* not empty */ if (errno != EEXIST && errno != ENOTEMPTY) e(30); /* Test if rmdir removes a dir with an empty file (it shouldn't.) */ System("rm -rf foo"); /* cleanup */ if (mkdir("foo", 0777) != 0) e(31); System("> foo/empty"); /* > empty */ if (rmdir("foo") != -1) e(32);/* not empty */ if (errno != EEXIST && errno != ENOTEMPTY) e(33); if (unlink("foo/empty") != 0) e(34); /* rm empty */ /* See what happens if foo is linked. */ if (superuser) { if (link("foo", "footoo") != 0) e(35); /* foo still */ if (rmdir("footoo") != 0) e(36); /* exist */ if (chdir("footoo") != -1) e(37); /* footoo */ if (errno != ENOENT) e(38); /* is gone */ } #ifdef _MINIX /* Some implementations might allow users to link directories. */ if (!superuser) { if (link("foo", "footoo") != -1) e(39); if (errno != EPERM) e(40); if (unlink("foo") != -1) e(41); if (errno != EPERM) e(42); } #endif /* See if ".." and "." are removed from the dir, and if it is * unwriteable * Note, we can not remove any files in the PARENT * process, because this * will make readdir unpredicatb5555555le. (see * 1003.1 page 84 line 30.) However * removal of the directory is * not specified in the standard. */ System("rm -rf /tmp/sema[12].07"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd = open("foo", O_RDONLY)) <= 2) e(43); /* open */ if ((dirp = opendir("foo")) == (DIR *) NULL) e(44); /* opendir */ /* UpA downB */ system(">/tmp/sema1.07; while test -f /tmp/sema1.07; do sleep 1;done"); while ((dep = readdir(dirp)) != DIRENT0) { if (strcmp(dep->d_name, "..") == 0) dotdot += 1; else if (strcmp(dep->d_name, ".") == 0) dot += 1; else other += 1; } if (dotdot != 0) e(45); /* no entrys */ if (dot != 0) e(46); /* shoul be */ if (other != 0) e(47); /* left or */ /* No new files (entrys) are allowed on foo */ if (creat("foo/nono", 0777) != -1) e(48); /* makeable */ if (closedir(dirp) != 0) e(49); /* close foo */ system("while test ! -f /tmp/sema2.07; do sleep 1; done"); /* downA */ System("rm -f /tmp/sema2.07"); /* clean up */ /* Foo still exist, so we should be able to get a fstat */ if (fstat(fd, &st) != 0) e(50); if (st.st_nlink != (nlink_t) 0) e(51); /* 0 left */ if (close(fd) != 0) e(52); /* last one */ exit(0); default: system("while test ! -f /tmp/sema1.07; do sleep 1; done"); /* downA */ if (rmdir("foo") != 0) e(53); /* cleanerup */ System("rm -f /tmp/sema1.07"); /* upB */ if (chdir("foo") != -1) e(54); /* it should */ if (errno != ENOENT) e(55); /* be gone */ System("> /tmp/sema2.07"); /* upA */ if (wait(&stat_loc) == -1) e(56); if (stat_loc != 0) e(57); } /* See if foo isn't accessible any more */ if (chdir("foo") != -1) e(58); if (errno != ENOENT) e(59); /* Let's see if we can get a EBUSSY..... */ if (mkdir("foo", 0777) != 0) e(60); /* mkdir foo */ System("rm -f /tmp/sema.07"); /* unness */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (chdir("foo") != 0) e(61); /* child goes */ System("> /tmp/sema.07"); /* upA */ system("while test -f /tmp/sema.07; do sleep 1; done"); /* downB */ sleep(1); exit(0); default: system("while test ! -f /tmp/sema.07; do sleep 1; done"); /* downA */ rmdir_result = rmdir("foo"); /* try remove */ if (rmdir_result == -1) { /* if it failed */ if (errno != EBUSY) e(62); /* foo is busy */ } else { if (rmdir_result != 0) e(63); if (rmdir("foo") != -1) e(64); /* not removable */ if (errno != ENOENT) e(65); /* again. */ if (chdir("foo") != -1) e(66); /* we can't go */ if (errno != ENOENT) e(67); /* there any more */ if (mkdir("foo", 0777) != 0) e(68); /* we can remake foo */ } System("rm -f /tmp/sema.07"); /* upB */ if (wait(&stat_loc) == -1) e(69); if (stat_loc != 0) e(70); } if (rmdir("foo") != 0) e(71); /* clean up */ } void test28c() { /* Test error handeling. */ subtest = 3; System("rm -rf ../DIR_28/*"); System("rm -rf foo /tmp/foo");/* clean up junk */ /* Test common errors */ if (mkdir("foo", 0777) != 0) e(1); /* mkdir shouldn't fail */ if (mkdir("foo", 0777) != -1) e(2); /* should fail the 2d time */ if (errno != EEXIST) e(3); /* because it exists already */ if (rmdir("foo") != 0) e(4); /* rmdir shouldn't fail */ if (rmdir("foo") != -1) e(5); /* but it should now because */ if (errno != ENOENT) e(6); /* it's gone the 1st time */ /* Test on access etc. */ if (mkdir("foo", 0777) != 0) e(7); if (mkdir("foo/bar", 0777) != 0) e(8); if (!superuser) { System("chmod 677 foo");/* make foo inaccesable */ if (mkdir("foo/foo", 0777) != -1) e(9); if (errno != EACCES) e(10); if (rmdir("foo/bar") != -1) e(11); if (errno != EACCES) e(12); System("chmod 577 foo");/* make foo unwritable */ if (mkdir("foo/foo", 0777) != -1) e(13); if (errno != EACCES) e(14); if (rmdir("foo/bar") != -1) e(15); if (errno != EACCES) e(16); System("chmod 777 foo");/* make foo full accessable */ } if (rmdir("foo/bar") != 0) e(17); /* bar should be removable */ if (mkdir("foo/no/foo", 0777) != -1) e(18); /* Note: "no" doesn't exist */ if (errno != ENOENT) e(19); if (mkdir("", 0777) != -1) e(20); /* empty string isn't ok */ if (errno != ENOENT) e(21); if (rmdir("") != -1) e(22); /* empty string isn't ok */ if (errno != ENOENT) e(23); System("> foo/no"); /* make a file "no" */ if (mkdir("foo/no/foo", 0777) != -1) e(24); if (errno != ENOTDIR) e(25); /* note: "no" is not a a dir */ if (rmdir("foo/no/foo") != -1) e(26); if (errno != ENOTDIR) e(27); System("rm -rf foo"); /* clean up */ } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_28"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Many of the tests require 1.6.n, n > 16, so we may as well assume that * POSIX signals are implemented. */ #define SIGACTION /* test29: read(), write() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 3 #define BUF_SIZE 1024 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; int subtest = 1; int superuser; int signumber = 0; _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test29a, (void)); _PROTOTYPE(void test29b, (void)); _PROTOTYPE(void test29c, (void)); _PROTOTYPE(void setsignumber, (int _signumber)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 29 "); fflush(stdout); System("rm -rf DIR_29; mkdir DIR_29"); Chdir("DIR_29"); superuser = (geteuid() == 0); umask(0000); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test29a(); if (m & 0002) test29b(); if (m & 0004) test29c(); } quit(); } void test29a() { /* Try normal operation. */ int fd1; struct stat st1, st2; time_t time1; char buf[BUF_SIZE]; int stat_loc; int i, j; int tube[2]; subtest = 1; System("rm -rf ../DIR_29/*"); /* Let's open bar. */ if ((fd1 = open("bar", O_RDWR | O_CREAT, 0777)) != 3) e(1); Stat("bar", &st1); /* Writing nothing should not affect the file at all. */ if (write(fd1, "", 0) != 0) e(2); Stat("bar", &st2); if (st1.st_uid != st2.st_uid) e(3); if (st1.st_gid != st2.st_gid) e(4); /* should be same */ if (st1.st_mode != st2.st_mode) e(5); if (st1.st_size != st2.st_size) e(6); if (st1.st_nlink != st2.st_nlink) e(7); if (st1.st_mtime != st2.st_mtime) e(8); if (st1.st_ctime != st2.st_ctime) e(9); if (st1.st_atime != st2.st_atime) e(10); /* A write should update some status fields. */ time(&time1); while (time1 >= time((time_t *)0)) ; if (write(fd1, "foo", 4) != 4) e(11); Stat("bar", &st2); if (st1.st_mode != st2.st_mode) e(12); if (st1.st_size >= st2.st_size) e(13); if ((off_t) 4 != st2.st_size) e(14); if (st1.st_nlink != st2.st_nlink) e(15); if (st1.st_mtime >= st2.st_mtime) e(16); if (st1.st_ctime >= st2.st_ctime) e(17); if (st1.st_atime != st2.st_atime) e(18); /* Lseeks should not change the file status. */ if (lseek(fd1, (off_t) - 2, SEEK_END) != 2) e(19); Stat("bar", &st1); if (st1.st_mode != st2.st_mode) e(20); if (st1.st_size != st2.st_size) e(21); if (st1.st_nlink != st2.st_nlink) e(22); if (st1.st_mtime != st2.st_mtime) e(23); if (st1.st_ctime != st2.st_ctime) e(24); if (st1.st_atime != st2.st_atime) e(25); /* Writing should start at the current (2) position. */ if (write(fd1, "foo", 4) != 4) e(26); Stat("bar", &st2); if (st1.st_mode != st2.st_mode) e(27); if (st1.st_size >= st2.st_size) e(28); if ((off_t) 6 != st2.st_size) e(29); if (st1.st_nlink != st2.st_nlink) e(30); if (st1.st_mtime > st2.st_mtime) e(31); if (st1.st_ctime > st2.st_ctime) e(32); if (st1.st_atime != st2.st_atime) e(33); /* A read of zero bytes should not affect anything. */ if (read(fd1, buf, 0) != 0) e(34); Stat("bar", &st1); if (st1.st_uid != st2.st_uid) e(35); if (st1.st_gid != st2.st_gid) e(36); /* should be same */ if (st1.st_mode != st2.st_mode) e(37); if (st1.st_size != st2.st_size) e(38); if (st1.st_nlink != st2.st_nlink) e(39); if (st1.st_mtime != st2.st_mtime) e(40); if (st1.st_ctime != st2.st_ctime) e(41); if (st1.st_atime != st2.st_atime) e(42); /* The file now should contain ``fofoo\0'' Let's check that. */ if (lseek(fd1, (off_t) 0, SEEK_SET) != 0) e(43); if (read(fd1, buf, BUF_SIZE) != 6) e(44); if (strcmp(buf, "fofoo") != 0) e(45); /* Only the Access Time should be updated. */ Stat("bar", &st2); if (st1.st_mtime != st2.st_mtime) e(46); if (st1.st_ctime != st2.st_ctime) e(47); if (st1.st_atime >= st2.st_atime) e(48); /* A read of zero bytes should do nothing even at the end of the file. */ time(&time1); while (time1 >= time((time_t *)0)) ; if (read(fd1, buf, 0) != 0) e(49); Stat("bar", &st1); if (st1.st_size != st2.st_size) e(50); if (st1.st_mtime != st2.st_mtime) e(51); if (st1.st_ctime != st2.st_ctime) e(52); if (st1.st_atime != st2.st_atime) e(53); /* Reading should be done from the current offset. */ if (read(fd1, buf, BUF_SIZE) != 0) e(54); if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(55); if (read(fd1, buf, BUF_SIZE) != 4) e(56); if (strcmp(buf, "foo") != 0) e(57); /* Reading should effect the current file position. */ if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(58); if (read(fd1, buf, 1) != 1) e(59); if (*buf != 'f') e(60); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 3) e(61); if (read(fd1, buf, 1) != 1) e(62); if (*buf != 'o') e(63); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 4) e(64); if (read(fd1, buf, 1) != 1) e(65); if (*buf != 'o') e(66); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 5) e(67); if (read(fd1, buf, 1) != 1) e(68); if (*buf != '\0') e(69); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(70); /* Read's at EOF should return 0. */ if (read(fd1, buf, BUF_SIZE) != 0) e(71); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(72); if (read(fd1, buf, BUF_SIZE) != 0) e(73); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(74); if (read(fd1, buf, BUF_SIZE) != 0) e(75); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(76); if (read(fd1, buf, BUF_SIZE) != 0) e(77); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(78); if (read(fd1, buf, BUF_SIZE) != 0) e(79); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 6) e(80); /* Writing should not always change the file size. */ if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(81); if (write(fd1, "ba", 2) != 2) e(82); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 4) e(83); Stat("bar", &st1); if (st1.st_size != 6) e(84); /* Kill the \0 at the end. */ if (lseek(fd1, (off_t) 5, SEEK_SET) != 5) e(85); if (write(fd1, "x", 1) != 1) e(86); /* And close the bar. */ if (close(fd1) != 0) e(87); /* Try some stuff with O_APPEND. Bar contains ``fobaox'' */ if ((fd1 = open("bar", O_RDWR | O_APPEND)) != 3) e(88); /* No matter what the file position is. Writes should append. */ if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(89); if (write(fd1, "y", 1) != 1) e(90); Stat("bar", &st1); if (st1.st_size != (off_t) 7) e(91); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 7) e(92); if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(93); if (write(fd1, "z", 2) != 2) e(94); /* The file should contain ``fobaoxyz\0'' == 9 chars long. */ Stat("bar", &st1); if (st1.st_size != (off_t) 9) e(95); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 9) e(96); /* Reading on a O_APPEND flag should be from the current offset. */ if (lseek(fd1, (off_t) 0, SEEK_SET) != 0) e(97); if (read(fd1, buf, BUF_SIZE) != 9) e(98); if (strcmp(buf, "fobaoxyz") != 0) e(99); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 9) e(100); if (close(fd1) != 0) e(101); /* Let's test fifo writes. First blocking. */ if (mkfifo("fifo", 0777) != 0) e(102); /* Read from fifo but no writer. */ System("rm -rf /tmp/sema.29a"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd1 = open("fifo", O_RDONLY)) != 3) e(103); system("> /tmp/sema.29a"); system("while test -f /tmp/sema.29a; do sleep 1; done"); errno =0; if (read(fd1, buf, BUF_SIZE) != 0) e(104); if (read(fd1, buf, BUF_SIZE) != 0) e(105); if (read(fd1, buf, BUF_SIZE) != 0) e(106); if (close(fd1) != 0) e(107); exit(0); default: if ((fd1 = open("fifo", O_WRONLY)) != 3) e(108); while (stat("/tmp/sema.29a", &st1) != 0) sleep(1); if (close(fd1) != 0) e(109); unlink("/tmp/sema.29a"); if (wait(&stat_loc) == -1) e(110);55555555555555 if (stat_loc != 0) e(111); /* Alarm? */ } /* Read from fifo should wait for writer. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd1 = open("fifo", O_RDONLY)) != 3) e(112); if (read(fd1, buf, BUF_SIZE) != 10) e(113); if (strcmp(buf, "Hi reader") != 0) e(114); if (close(fd1) != 0) e(115); exit(0); default: if ((fd1 = open("fifo", O_WRONLY)) != 3) e(116); sleep(1); if (write(fd1, "Hi reader", 10) != 10) e(117); if (close(fd1) != 0) e(118); if (wait(&stat_loc) == -1) e(119); if (stat_loc != 0) e(120); /* Alarm? */ } /* Read from fifo should wait for all writers to close. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd1 = open("fifo", O_WRONLY)) != 3) e(121); if (close(fd1) != 0) e(122); exit(0); default: if ((fd1 = open("fifo", O_WRONLY)) != 3) e(123); sleep(1); if (close(fd1) != 0) e(124); if (wait(&stat_loc) == -1) e(125); if (stat_loc != 0) e(126); /* Alarm? */ } exit(stat_loc); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(127); if (read(fd1, buf, BUF_SIZE) != 0) e(128); if (close(fd1) != 0) e(129); if (wait(&stat_loc) == -1) e(130); if (stat_loc != 0) e(131); /* Alarm? */ } /* PIPE_BUF has to have a nice value. */ if (PIPE_BUF < 5) e(132); if (BUF_SIZE < 1000) e(133); /* Writes of blocks smaller than PIPE_BUF should be atomic. */ System("rm -rf /tmp/sema.29b;> /tmp/sema.29b"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd1 = open("fifo", O_WRONLY)) != 3) e(134); for (i = 0; i < 100; i++) write(fd1, "1234 ", 5); system("while test -f /tmp/sema.29b; do sleep 1; done"); if (close(fd1) != 0) e(135); exit(0); default: if ((fd1 = open("fifo", O_WRONLY)) != 3) e(136); for (i = 0; i < 100; i++) write(fd1, "1234 ", 5); while (stat("/tmp/sema.29b", &st1) == 0) sleep(1); if (close(fd1) != 0) e(137); if (wait(&stat_loc) == -1) e(138); if (stat_loc != 0) e(139); /* Alarm? */ } exit(stat_loc); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(140); i = 0; memset(buf, '\0', BUF_SIZE); /* Read buffer full or till EOF. */ do { j = read(fd1, buf + i, BUF_SIZE - i); if (j > 0) { if (j % 5 != 0) e(141); i += j; } } while (j > 0 && i < 1000); /* Signal the children to close write ends. This should not be */ /* Necessary. But due to a bug in 1.16.6 this is necessary. */ unlink("/tmp/sema.29b"); if (j < 0) e(142); if (i != 1000) e(143); if (wait(&stat_loc) == -1) e(144); if (stat_loc != 0) e(145); /* Alarm? */ /* Check 200 times 1234. */ for (i = 0; i < 200; i++) if (strncmp(buf + (i * 5), "1234 ", 5) != 0) break; if (i != 200) e(146); if (buf[1000] != '\0') e(147); if (buf[1005] != '\0') e(148); if (buf[1010] != '\0') e(149); if (read(fd1, buf, BUF_SIZE) != 0) e(150); if (close(fd1) != 0) e(151); } /* Read from pipe should wait for writer. */ if (pipe(tube) != 0) e(152); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (close(tube[1]) != 0) e(153); if (read(tube[0], buf, BUF_SIZE) != 10) e(154); if (strcmp(buf, "Hi reader") != 0) e(155); if (close(tube[0]) != 0) e(156); exit(0); default: if (close(tube[0]) != 0) e(157); sleep(1); if (write(tube[1], "Hi reader", 10) != 10) e(158); if (close(tube[1]) != 0) e(159); if (wait(&stat_loc) == -1) e(160); if (stat_loc != 0) e(161); /* Alarm? */ } /* Read from pipe should wait for all writers to close. */ if (pipe(tube) != 0) e(162); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (close(tube[0]) != 0) e(163); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (close(tube[1]) != 0) e(164); exit(0); default: sleep(1); if (close(tube[1]) != 0) e(165); if (wait(&stat_loc) == -1) e(166); if (stat_loc != 0) e(167); /* Alarm? */ } exit(stat_loc); default: if (close(tube[1]) != 0) e(168); if (read(tube[0], buf, BUF_SIZE) != 0) e(169); if (close(tube[0]) != 0) e(170); if (wait(&stat_loc) == -1) e(171); if (stat_loc != 0) e(172); /* Alarm? */ } /* Writes of blocks smaller than PIPE_BUF should be atomic. */ System("rm -rf /tmp/sema.29c;> /tmp/sema.29c"); if (pipe(tube) != 0) e(173); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (close(tube[0]) != 0) e(174); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); for (i = 0; i < 100; i++) write(tube[1], "1234 ", 5); system("while test -f /tmp/sema.29c; do sleep 1; done"); if (close(tube[1]) != 0) e(175); exit(0); default: for (i = 0; i < 100; i++) write(tube[1], "1234 ", 5); while (stat("/tmp/sema.29c", &st1) == 0) sleep(1); if (close(tube[1]) != 0) e(176); if (wait(&stat_loc) == -1) e(177); if (stat_loc != 0) e(178); /* Alarm? */ } exit(stat_loc); default: i = 0; if (close(tube[1]) != 0) e(179); memset(buf, '\0', BUF_SIZE); do { j = read(tube[0], buf + i, BUF_SIZE - i); if (j > 0) { if (j % 5 != 0) e(180); i += j; } else break; /* EOF seen. */ } while (i < 1000); unlink("/tmp/sema.29c"); if (j < 0) e(181); if (i != 1000) e(182); if (close(tube[0]) != 0) e(183); if (wait(&stat_loc) == -1) e(184); if (stat_loc != 0) e(185); /* Alarm? */ /* Check 200 times 1234. */ for (i = 0; i < 200; i++) if (strncmp(buf + (i * 5), "1234 ", 5) != 0) break; if (i != 200) e(186); } } void test29b() { int i, fd, stat_loc; char buf[BUF_SIZE]; char buf2[BUF_SIZE]; struct stat st; subtest = 2; System("rm -rf ../DIR_29/*"); /* Lets try sequential writes. */ system("rm -rf /tmp/sema.29d"); System("> testing"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd = open("testing", O_WRONLY | O_APPEND)) != 3) e(1); if (write(fd, "one ", 4) != 4) e(2); if (close(fd) != 0) e(3); system("> /tmp/sema.29d"); system("while test -f /tmp/sema.29d; do sleep 1; done"); if ((fd = open("testing", O_WRONLY | O_APPEND)) != 3) e(4); if (write(fd, "three ", 6) != 6) e(5); if (close(fd) != 0) e(6); system("> /tmp/sema.29d"); exit(0); default: while (stat("/tmp/sema.29d", &st) != 0) sleep(1); if ((fd = open("testing", O_WRONLY | O_APPEND)) != 3) e(7); if (write(fd, "two ", 4) != 4) e(8); if (close(fd) != 0) e(9); unlink("/tmp/sema.29d"); while (stat("/tmp/sema.29d", &st) != 0) sleep(1); if ((fd = open("testing", O_WRONLY | O_APPEND)) != 3) e(10); if (write(fd, "four", 5) != 5) e(11); if (close(fd) != 0) e(12); if (wait(&stat_loc) == -1) e(13); if (stat_loc != 0) e(14); /* The alarm went off? */ unlink("/tmp/sema.29d"); } if ((fd = open("testing", O_RDONLY)) != 3) e(15); if (read(fd, buf, BUF_SIZE) != 19) e(16); if (strcmp(buf, "one two three four") != 0) e(17); if (close(fd) != 0) e(18); /* Non written bytes in regular files should be zero. */ memset(buf2, '\0', BUF_SIZE); if ((fd = open("bigfile", O_RDWR | O_CREAT, 0644)) != 3) e(19); if (lseek(fd, (off_t) 102400, SEEK_SET) != (off_t) 102400L) e(20); if (read(fd, buf, BUF_SIZE) != 0) e(21); if (write(fd, ".", 1) != 1) e(22); Stat("bigfile", &st); if (st.st_size != (off_t) 102401) e(23); if (lseek(fd, (off_t) 0, SEEK_SET) != 0) e(24); for (i = 0; i < 102400 / BUF_SIZE; i++) { if (read(fd, buf, BUF_SIZE) != BUF_SIZE) e(25); if (memcmp(buf, buf2, BUF_SIZE) != 0) e(26); } if (close(fd) != 0) e(27); } void test29c() { /* Test correct error behavior. */ char buf[BUF_SIZE]; int fd, tube[2], stat_loc; struct stat st; pid_t pid; #ifdef SIGACTION struct sigaction act, oact; #else #if _ANSI void (*oldfunc) (int); #else void (*oldfunc) (); #endif #endif subtest = 3; System("rm -rf ../DIR_29/*"); /* To test if writing processes on closed pipes are signumbered. */ #ifdef SIGACTION act.sa_handler = setsignumber; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(SIGPIPE, &act, &oact) != 0) e(1); #else oldfunc = signal(SIGPIPE, setsignumber); #endif /* Non valid file descriptors should be an error. */ for (fd = -111; fd < 0; fd++) { errno = 0; if (read(fd, buf, BUF_SIZE) != -1) e(2); if (errno != EBADF) e(3); } for (fd = 3; fd < 111; fd++) { errno = 0; if (read(fd, buf, BUF_SIZE) != -1) e(4); if (errno != EBADF) e(5); } for (fd = -111; fd < 0; fd++) { errno = 0; if (write(fd, buf, BUF_SIZE) != -1) e(6); if (errno != EBADF) e(7); } for (fd = 3; fd < 111; fd++) { errno = 0; if (write(fd, buf, BUF_SIZE) != -1) e(8); if (errno != EBADF) e(9); } /* Writing a pipe with no readers should trigger SIGPIPE. */ if (pipe(tube) != 0) e(10); close(tube[0]); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); signumber = 0; if (write(tube[1], buf, BUF_SIZE) != -1) e(11); if (errno != EPIPE) e(12); if (signumber != SIGPIPE) e(13); if (close(tube[1]) != 0) e(14); exit(0); default: close(tube[1]); if (wait(&stat_loc) == -1) e(15); if (stat_loc != 0) e(16); /* Alarm? */ } /* Writing a fifo with no readers should trigger SIGPIPE. */ System("> /tmp/sema.29e"); if (mkfifo("fifo", 0666) != 0) e(17); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd = open("fifo", O_WRONLY)) != 3) e(18); system("while test -f /tmp/sema.29e; do sleep 1; done"); signumber = 0; if (write(fd, buf, BUF_SIZE) != -1) e(19); if (errno != EPIPE) e(20); if (signumber != SIGPIPE) e(21); if (close(fd) != 0) e(22); exit(0); default: if ((fd = open("fifo", O_RDONLY)) != 3) e(23); if (close(fd) != 0) e(24); unlink("/tmp/sema.29e"); if (wait(&stat_loc) == -1) e(25); if (stat_loc != 0) e(26); /* Alarm? */ } #ifdef SIGACTION /* Restore normal (re)action to SIGPIPE. */ if (sigaction(SIGPIPE, &oact, NULL) != 0) e(27); #else signal(SIGPIPE, oldfunc); #endif /* Read from fifo should return -1 and set errno to EAGAIN. */ System("rm -rf /tmp/sema.29[fgh]"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); system("while test ! -f /tmp/sema.29f; do sleep 1; done"); System("rm -rf /tmp/sema.29f"); if ((fd = open("fifo", O_WRONLY | O_NONBLOCK)) != 3) e(28); close(creat("/tmp/sema.29g", 0666)); system("while test ! -f /tmp/sema.29h; do sleep 1; done"); if (close(fd) != 0) e(29); System("rm -rf /tmp/sema.29h"); exit(0); default: if ((fd = open("fifo", O_RDONLY | O_NONBLOCK)) != 3) e(30); close(creat("/tmp/sema.29f", 0666)); system("while test ! -f /tmp/sema.29g; do sleep 1; done"); System("rm -rf /tmp/sema.29g"); if (read(fd, buf, BUF_SIZE) != -1) e(31); if (errno != EAGAIN) e(32); if (read(fd, buf, BUF_SIZE) != -1) e(33); if (errno != EAGAIN) e(34); if (read(fd, buf, BUF_SIZE) != -1) e(35); if (errno != EAGAIN) e(36); close(creat("/tmp/sema.29h", 0666)); while (stat("/tmp/sema.29h", &st) == 0) sleep(1); if (read(fd, buf, BUF_SIZE) != 0) e(37); if (close(fd) != 0) e(38); if (wait(&stat_loc) == -1) e(39); if (stat_loc != 0) e(40); /* Alarm? */ } System("rm -rf fifo"); /* If a read is interrupted by a SIGNAL. */ if (pipe(tube) != 0) e(41); switch (pid = fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); #ifdef SIGACTION act.sa_handler = setsignumber; sigemptyset(&act.sa_mask); act.sa_flags = 0; if (sigaction(SIGUSR1, &act, &oact) != 0) e(42); #else oldfunc = signal(SIGUSR1, setsignumber); #endif if (read(tube[0], buf, BUF_SIZE) != -1) e(43); if (errno != EINTR) e(44); if (signumber != SIGUSR1) e(45); #ifdef SIGACTION /* Restore normal (re)action to SIGPIPE. */ if (sigaction(SIGUSR1, &oact, NULL) != 0) e(46); #else signal(SIGUSR1, oldfunc); #endif close(tube[0]); close(tube[1]); exit(0); default: /* The sleep 1 should give the child time to start the read. */ sleep(1); close(tube[0]); kill(pid, SIGUSR1); wait(&stat_loc); if (stat_loc != 0) e(47); /* Alarm? */ close(tube[1]); } } void setsignumber(signum) int signum; { signumber = signum; } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_29"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 3 - library routines rather than system calls */ #include #include #include #include #include #include #include #include #include #include #define ITERATIONS 10 #define MAX_ERROR 4 #define SIZE 64 int errct, subtest; char el_weirdo[] = "\n\t\\\e@@!!##\e\e\n\n"; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test3a, (void)); _PROTOTYPE(void test3b, (void)); _PROTOTYPE(void test3c, (void)); _PROTOTYPE(void test3d, (void)); _PROTOTYPE(void test3e, (void)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void e, (int n)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 3 cannot run as root; test aborted\n"); exit(1); } if (argc == 2) m = atoi(argv[1]); printf("Test 3 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_03; mkdir DIR_03"); chdir("DIR_03"); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test3a(); if (m & 0002) test3b(); if (m & 0004) test3c(); if (m & 0010) test3d(); if (m & 0020) test3e(); } quit(); return(-1); /* impossible */ } void test3a() { /* Signal set manipulation. */ sigset_t s, s1; subtest = 1; errno = -1000; /* None of these calls set errno. */ if (sigemptyset(&s) != 0) e(1); if (sigemptyset(&s1) != 0) e(2); if (sigaddset(&s, SIGABRT) != 0) e(3); if (sigaddset(&s, SIGALRM) != 0) e(4); if (sigaddset(&s, SIGFPE ) != 0) e(5); if (sigaddset(&s, SIGHUP ) != 0) e(6); if (sigaddset(&s, SIGILL ) != 0) e(7); if (sigaddset(&s, SIGINT ) != 0) e(8); if (sigaddset(&s, SIGKILL) != 0) e(9); if (sigaddset(&s, SIGPIPE) != 0) e(10); if (sigaddset(&s, SIGQUIT) != 0) e(11); if (sigaddset(&s, SIGSEGV) != 0) e(12); if (sigaddset(&s, SIGTERM) != 0) e(13); if (sigaddset(&s, SIGUSR1) != 0) e(14); if (sigaddset(&s, SIGUSR2) != 0) e(15); if (sigismember(&s, SIGABRT) != 1) e(16); if (sigismember(&s, SIGALRM) != 1) e(17); if (sigismember(&s, SIGFPE ) != 1) e(18); if (sigismember(&s, SIGHUP ) != 1) e(19); if (sigismember(&s, SIGILL ) != 1) e(20); if (sigismember(&s, SIGINT ) != 1) e(21); if (sigismember(&s, SIGKILL) != 1) e(22); if (sigismember(&s, SIGPIPE) != 1) e(23); if (sigismember(&s, SIGQUIT) != 1) e(24); if (sigismember(&s, SIGSEGV) != 1) e(25); if (sigismember(&s, SIGTERM) != 1) e(26); if (sigismember(&s, SIGUSR1) != 1) e(27); if (sigismember(&s, SIGUSR2) != 1) e(28); if (sigdelset(&s, SIGABRT) != 0) e(29); if (sigdelset(&s, SIGALRM) != 0) e(30); if (sigdelset(&s, SIGFPE ) != 0) e(31); if (sigdelset(&s, SIGHUP ) != 0) e(32); if (sigdelset(&s, SIGILL ) != 0) e(33); if (sigdelset(&s, SIGINT ) != 0) e(34); if (sigdelset(&s, SIGKILL) != 0) e(35); if (sigdelset(&s, SIGPIPE) != 0) e(36); if (sigdelset(&s, SIGQUIT) != 0) e(37); if (sigdelset(&s, SIGSEGV) != 0) e(38); if (sigdelset(&s, SIGTERM) != 0) e(39); if (sigdelset(&s, SIGUSR1) != 0) e(40); if (sigdelset(&s, SIGUSR2) != 0) e(41); if (s != s1) e(42); if (sigaddset(&s, SIGILL) != 0) e(43); if (s == s1) e(44); if (sigfillset(&s) != 0) e(45); if (sigismember(&s, SIGABRT) != 1) e(46); if (sigismember(&s, SIGALRM) != 1) e(47); if (sigismember(&s, SIGFPE ) != 1) e(48); if (sigismember(&s, SIGHUP ) != 1) e(49); if (sigismember(&s, SIGILL ) != 1) e(50); if (sigismember(&s, SIGINT ) != 1) e(51); if (sigismember(&s, SIGKILL) != 1) e(52); if (sigismember(&s, SIGPIPE) != 1) e(53); if (sigismember(&s, SIGQUIT) != 1) e(54); if (sigismember(&s, SIGSEGV) != 1) e(55); if (sigismember(&s, SIGTERM) != 1) e(56); if (sigismember(&s, SIGUSR1) != 1) e(57); if (sigismember(&s, SIGUSR2) != 1) e(58); /* Test error returns. */ if (sigaddset(&s, -1) != -1) e(59); if (sigaddset(&s, -1) != -1) e(60); if (sigismember(&s, -1) != -1) e(61); if (sigaddset(&s, 10000) != -1) e(62); if (sigaddset(&s, 10000) != -1) e(63); if (sigismember(&s, 10000) != -1) e(64); } void test3b() { /* Test uname. */ struct utsname u; /* contains all kinds of system ids */ subtest = 2; #if 0 errno = -2000; /* None of these calls set errno. */ if (uname(&u) != 0) e(1); if (strcmp(u.sysname, "MINIX") != 0 && strcmp(u.sysname, "Minix") != 0) e(2); /* only one defined */ #endif } void test3c() { /* Test getenv. Asume HOME, PATH, and LOGNAME exist (not strictly required).*/ char *p, name[SIZE]; subtest = 3; errno = -3000; /* None of these calls set errno. */ if ( (p = getenv("HOME")) == NULL) e(1); if (*p != '/') e(2); /* path must be absolute */ if ( (p = getenv("PATH")) == NULL) e(3); if ( (p = getenv("LOGNAME")) == NULL) e(5); strcpy(name, p); /* save it, since getlogin might wipe it out */ p = getlogin(); if (strcmp(p, name) != 0) e(6); /* The following test could fail in a legal POSIX system. However, if it * does, you deserve it to fail. */ if (getenv(el_weirdo) != NULL) e(7); } void test3d() { /* Test ctermid, ttyname, and isatty. */ int fd; char *p, name[L_ctermid]; subtest = 4; errno = -4000; /* None of these calls set errno. */ /* Test ctermid first. */ if ( (p = ctermid(name)) == NULL) e(1); if (strcmp(p, name) != 0) e(2); if (strncmp(p, "/dev/tty", 8) != 0) e(3); /* MINIX convention */ if ( (p = ttyname(0)) == NULL) e(4); if (strncmp(p, "/dev/tty", 8) != 0 && strcmp(p, "/dev/console") != 0) e(5); if ( (p = ttyname(3)) != NULL) e(6); if (ttyname(5000) != NULL) e(7); if ( (fd = creat("T3a", 0777)) < 0) e(8); if (ttyname(fd) != NULL) e(9); if (isatty(0) != 1) e(10); if (isatty(3) != 0) e(11); if (isatty(fd) != 0) e(12); if (close(fd) != 0) e(13); if (ttyname(fd) != NULL) e(14); } void test3e() { /* Test ctermid, ttyname, and isatty. */ subtest = 5; errno = -5000; /* None of these calls set errno. */ if (sysconf(_SC_ARG_MAX) < _POSIX_ARG_MAX) e(1); if (sysconf(_SC_CHILD_MAX) < _POSIX_CHILD_MAX) e(2); if (sysconf(_SC_NGROUPS_MAX) < 0) e(3); if (sysconf(_SC_OPEN_MAX) < _POSIX_OPEN_MAX) e(4); /* The rest are MINIX specific */ if (sysconf(_SC_JOB_CONTROL) >= 0) e(5); /* no job control! */ } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(4); } } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Test aborted. Too many errors: "); chdir(".."); system("rm -rf DIR*"); exit(1); } } /* test30: creat() (p) Jan-Mark Wams. email: jms@cs.vu.nl */ /* ** Creat() should be equivalent to: ** open(path, O_WRONLY | O_CREAT | O_TRUNC, mode); ** Since we can not look in the source, we can not assume creat() is ** a mere sysnonym (= a systemcall synonym). */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test30a, (void)); _PROTOTYPE(void test30b, (void)); _PROTOTYPE(void test30c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 30 "); fflush(stdout); System("rm -rf DIR_30; mkdir DIR_30"); Chdir("DIR_30"); makelongnames(); superuser = (geteuid() == 0); umask(0000); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test30a(); if (m & 0002) test30b(); if (m & 0004) test30c(); } quit(); } void test30a() { /* Test normal operation. */ #define BUF_SIZE 1024 int fd1, fd2; char buf[BUF_SIZE]; struct stat st, dirst; time_t time1, time2; int stat_loc, cnt; subtest = 1; System("rm -rf ../DIR_30/*"); /* Check if processes have independent new fds */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if ((fd1 = creat("myfile", 0644)) != 3) e(1); if (close(fd1) != 0) e(2); exit(0); default: if ((fd1 = creat("myfile", 0644)) != 3) e(3); if (close(fd1) != 0) e(4); if (wait(&stat_loc) == -1) e(5); if (stat_loc != 0) e(6); } /* Save the dir status. */ Stat(".", &dirst); time(&time1); while (time1 == time((time_t *)0)) ; /* Check if the file status information is updated correctly */ cnt = 0; System("rm -rf myfile"); do { time(&time1); if ((fd1 = creat("myfile", 0644)) != 3) e(7); Stat("myfile", &st); time(&time2); } while (time1 != time2 && cnt++ < 100); if (cnt >= 100) e(8); if (st.st_uid != geteuid()) e(9); /* Uid should be set. */ #if defined(NGROUPS_MAX) && NGROUPS_MAX == 0 if (st.st_gid != getegid()) e(10); #endif /* defined(NGROUPS_MAX) && NGROUPS_MAX == 0 */ if (!S_ISREG(st.st_mode)) e(11); if (st.st_mode & 0777 != 0644) e(12); if (st.st_nlink != 1) e(13); if (st.st_ctime != time1) e(14); /* All time fields should be updated */ if (st.st_atime != time1) e(15); if (st.st_mtime != time1) e(16); if (st.st_size != 0) e(17); /* File should be trunked. */ /* Check if c and mtime for "." is updated. */ Stat(".", &st); if (st.st_ctime <= dirst.st_ctime) e(18); if (st.st_mtime <= dirst.st_mtime) e(19); /* Let's see if cread fds are write only. */ if (read(fd1, buf, 7) != -1) e(20); /* we can't read */ if (errno != EBADF) e(21); /* a write only fd */ if (write(fd1, "HELLO", 6) != 6) e(22); /* but we can write */ /* No O_APPEND flag should have been used. */ if (lseek(fd1, (off_t) 1, SEEK_SET) != 1) e(23); if (write(fd1, "ello", 5) != 5) e(24); Stat("myfile", &st); if (st.st_size != 6) e(25); if (st.st_size == 11) e(26); /* O_APPEND should make it 11. */ if (close(fd1) != 0) e(27); /* A creat should set the file offset to 0. */ if ((fd1 = creat("myfile", 0644)) != 3) e(28); if (lseek(fd1, (off_t) 0, SEEK_CUR) != 0) e(29); if (close(fd1) != 0) e(30); /* Test if file permission bits and the file ownership are unchanged. */ /* So we will see if creat() is just an open() if the file exists. */ if (superuser) { System("echo > bar; chmod 073 bar"); /* Make bar 073 */ if (chown("bar", 1, 1) != 0) e(1137); fd1 = creat("bar", 0777); /* knock knock */ if (fd1 == -1) e(31); Stat("bar", &st); if (st.st_size != (size_t) 0) e(32); /* empty file. */ if (write(fd1, "foo", 3) != 3) e(33); /* rewrite bar */ if (close(fd1) != 0) e(34); Stat("bar", &st); if (st.st_uid != 1) e(35); if (st.st_gid != 1) e(36); if ((st.st_mode & 0777) != 073) e(37); /* mode still is 077 */ if (st.st_size != (size_t) 3) e(38); } /* Fifo's should be openable with creat(). */ if (mkfifo("fifo", 0644) != 0) e(39); /* Creat() should have no effect on FIFO files. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Give child 20 seconds to live. */ if ((fd1 = open("fifo", O_WRONLY)) != 3) e(40); if (write(fd1, "I did see Elvis.\n", 18) != 18) e(41); if ((fd2 = creat("fifo", 0644)) != 4) e(42); if (write(fd2, "I DID.\n", 8) != 8) e(43); if (close(fd2) != 0) e(44); if (close(fd1) != 0) e(45); exit(0); default: if ((fd1 = open("fifo", O_RDONLY)) != 3) e(46); if (read(fd1, buf, 18) != 18) e(47); if (strcmp(buf, "I did see Elvis.\n") != 0) e(48); if (strcmp(buf, "I DID.\n") == 0) e(49); if (read(fd1, buf, BUF_SIZE) != 8) e(50); if (strcmp(buf, "I DID.\n") != 0) e(51); if (close(fd1) != 0) e(52); if (wait(&stat_loc) == -1) e(53); if (stat_loc != 0) e(54); /* The alarm went off? */ } /* Creat() should have no effect on directroys. */ System("mkdir dir; touch dir/f1 dir/f2 dir/f3"); if ((fd1 = creat("dir", 0644)) != -1) e(55); if (errno != EISDIR) e(56); close(fd1); /* The path should contain only dirs in the prefix. */ if ((fd1 = creat("dir/f1/nono", 0644)) != -1) e(57); if (errno != ENOTDIR) e(58); close(fd1); /* The path should contain only dirs in the prefix. */ if ((fd1 = creat("", 0644)) != -1) e(59); if (errno != ENOENT) e(60); close(fd1); if ((fd1 = creat("dir/noso/nono", 0644)) != -1) e(61); if (errno != ENOENT) e(62); close(fd1); } void test30b() { int fd; subtest = 2; System("rm -rf ../DIR_30/*"); /* Test maximal file name length. */ if ((fd = creat(MaxName, 0777)) != 3) e(1); if (close(fd) != 0) e(2); MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ if ((fd = creat(MaxPath, 0777)) != 3) e(3); if (close(fd) != 0) e(4); MaxPath[strlen(MaxPath) - 1] = '/'; /* make ././.../a */ } void test30c() { int fd; subtest = 3; System("rm -rf ../DIR_30/*"); if (!superuser) { /* Test if creat is not usable to open files with the wrong mode */ System("> nono; chmod 177 nono"); fd = creat("nono", 0777); if (fd != -1) e(1); if (errno != EACCES) e(2); } if (mkdir("bar", 0777) != 0) e(3); /* make bar */ /* Check if no access on part of path generates the correct error. */ System("chmod 577 bar"); /* r-xrwxrwx */ if (!superuser) { /* Normal users can't creat without write permision. */ if (creat("bar/nono", 0666) != -1) e(4); if (errno != EACCES) e(5); if (creat("bar/../nono", 0666) != -1) e(6); if (errno != EACCES) e(7); } if (superuser) { /* Super user can still creat stuff. */ if ((fd = creat("bar/nono", 0666)) != 3) e(8); if (close(fd) != 0) e(9); if (unlink("bar/nono") != 0) e(10); } /* Clean up bar. */ System("rm -rf bar"); /* Test ToLongName and ToLongPath */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if ((fd = creat(ToLongName, 0777)) != -1) e(11); if (errno != ENAMETOOLONG) e(12); close(fd); /* Just in case. */ # else if ((fd = creat(ToLongName, 0777)) != 3) e(13); if (close(fd) != 0) e(14); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif ToLongPath[PATH_MAX - 2] = '/'; ToLongPath[PATH_MAX - 1] = 'a'; if ((fd = creat(ToLongPath, 0777)) != -1) e(15); if (errno != ENAMETOOLONG) e(16); if (close(fd) != -1) e(17); ToLongPath[PAT 666H_MAX - 1] = '/'; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_30"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test31: mkfifo() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test31a, (void)); _PROTOTYPE(void test31b, (void)); _PROTOTYPE(void test31c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 31 "); fflush(stdout); System("rm -rf DIR_31; mkdir DIR_31"); Chdir("DIR_31"); makelongnames(); superuser = (geteuid() == 0); umask(0000); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test31a(); if (m & 0002) test31b(); if (m & 0004) test31c(); } quit(); } void test31a() { /* Test normal operation. */ #define BUF_SIZE 1024 int fd; char buf[BUF_SIZE]; struct stat st, dirst; time_t time1, time2; int stat_loc, cnt; subtest = 1; System("rm -rf ../DIR_31/*"); /* Check if the file status information is updated correctly */ System("rm -rf fifo"); cnt = 0; Stat(".", &dirst); time(&time1); while (time1 == time((time_t *)0)) ; do { time(&time1); if (mkfifo("fifo", 0644) != 0) e(1); Stat("fifo", &st); time(&time2); } while (time1 != time2 && cnt++ < 100); if (cnt >= 100) e(2); if (st.st_uid != geteuid()) e(3); /* Uid should be set. */ #if defined(NGROUPS_MAX) && NGROUPS_MAX == 0 if (st.st_gid != getegid()) e(4); #endif /* defined(NGROUPS_MAX) && NGROUPS_MAX == 0 */ if (!S_ISFIFO(st.st_mode)) e(5); if (st.st_mode & 0777 != 0644) e(6); if (st.st_nlink != 1) e(7); if (st.st_ctime != time1) e(8); if (st.st_atime != time1) e(9); if (st.st_mtime != time1) e(10); if (st.st_size != 0) e(11); /* File should be empty. */ /* Check if status for "." is updated. */ Stat(".", &st); if (st.st_ctime <= dirst.st_ctime) e(12); if (st.st_mtime <= dirst.st_mtime) e(13); /* Basic checking if a fifo file created with mkfifo() is a pipe. */ alarm(10); /* in case fifo hangs */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: if ((fd = open("fifo", O_RDONLY)) != 3) e(14); if (read(fd, buf, BUF_SIZE) != 7) e(15); if (strcmp(buf, "banana") != 0) e(16); if (close(fd) != 0) e(17); if ((fd = open("fifo", O_WRONLY)) != 3) e(18); if (write(fd, "thanks", 7) != 7) e(19); if (close(fd) != 0) e(20); exit(0); default: if ((fd = open("fifo", O_WRONLY)) != 3) e(21); if (write(fd, "banana", 7) != 7) e(22); if (close(fd) != 0) e(23); if ((fd = open("fifo", O_RDONLY)) != 3) e(24); if (read(fd, buf, BUF_SIZE) != 7) e(25); if (strcmp(buf, "thanks") != 0) e(26); if (close(fd) != 0) e(27); wait(&stat_loc); if (stat_loc != 0) e(28); /* Alarm? */ } alarm(0); } void test31b() { subtest = 2; System("rm -rf ../DIR_31/*"); /* Test maximal file name length. */ if (mkfifo(MaxName, 0777) != 0) e(1); if (unlink(MaxName) != 0) e(2); MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ if (mkfifo(MaxPath, 0777) != 0) e(3); if (unlink(MaxPath) != 0) e(4); MaxPath[strlen(MaxPath) - 1] = '/'; /* make ././.../a */ } void test31c() { subtest = 3; System("rm -rf ../DIR_31/*"); /* Check if mkfifo() removes, files, fifos, dirs. */ if (mkfifo("fifo", 0777) != 0) e(1); System("mkdir dir; > file"); if (mkfifo("fifo", 0777) != -1) e(2); if (errno != EEXIST) e(3); if (mkfifo("dir", 0777) != -1) e(4); if (errno != EEXIST) e(5); if (mkfifo("file", 0777) != -1) e(6); if (errno != EEXIST) e(7); /* Test empty path. */ if (mkfifo("", 0777) != -1) e(8); if (errno != ENOENT) e(9); if (mkfifo("/tmp/noway/out", 0777) != -1) e(10); if (errno != ENOENT) e(11); /* Test if path prefix is a directory. */ if (mkfifo("/etc/passwd/nono", 0777) != -1) e(12); if (errno != ENOTDIR) e(13); mkdir("bar", 0777); /* make bar */ /* Check if no access on part of path generates the correct error. */ System("chmod 577 bar"); /* r-xrwxrwx */ if (!superuser) { if (mkfifo("bar/nono", 0666) != -1) e(14); if (errno != EACCES) e(15); } if (superuser) { if (mkfifo("bar/nono", 0666) != 0) e(14); if (unlink("bar/nono") != 0) e(666); } System("chmod 677 bar"); /* rw-rwxrwx */ if (!superuser) { if (mkfifo("bar/../nono", 0666) != -1) e(16); if (errno != EACCES) e(17); } if (unlink("nono") != -1) e(18); /* Clean up bar. */ System("rm -rf bar"); /* Test ToLongName and ToLongPath */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if (mkfifo(ToLongName, 0777) != -1) e(19); if (errno != ENAMETOOLONG) e(20); # else if (mkfifo(ToLongName, 0777) != 0) e(21); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif ToLongPath[PATH_MAX - 2] = '/'; ToLongPath[PATH_MAX - 1] = 'a'; if (mkfifo(ToLongPath, 0777) != -1) e(22); if (errno != ENAMETOOLONG) e(23); ToLongPath[PATH_MAX - 1] = '/'; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_31"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test32: rename() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 2 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Creat(f) if (close(creat(f,0777))!=0) printf("Can't creat %s\n",f) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test32a, (void)); _PROTOTYPE(void test32b, (void)); _PROTOTYPE(void test32c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 32 "); fflush(stdout); System("rm -rf DIR_32; mkdir DIR_32"); Chdir("DIR_32"); makelongnames(); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test32a(); if (m & 0002) test32b(); if (m & 0004) test32c(); } quit(); } #define BUF_SIZE 1024 void test32a() { /* Test normal operation. */ struct stat st1, st2; int fd1, fd2; time_t time1, time2, time3; char buf[BUF_SIZE]; subtest = 1; System("rm -rf ../DIR_32/*"); /* Test normal file renamal. */ System("echo haha > old"); Stat("old", &st1); if (rename("old", "new") != 0) e(1); Stat("new", &st2); /* The status of new should be the same as old. */ if (st1.st_dev != st2.st_dev) e(2); if (st1.st_ino != st2.st_ino) e(3); if (st1.st_mode != st2.st_mode) e(4); if (st1.st_nlink != st2.st_nlink) e(5); if (st1.st_uid != st2.st_uid) e(6); if (st1.st_gid != st2.st_gid) e(7); if (st1.st_rdev != st2.st_rdev) e(8); if (st1.st_size != st2.st_size) e(9); if (st1.st_atime != st2.st_atime) e(10); if (st1.st_mtime != st2.st_mtime) e(11); if (st1.st_ctime != st2.st_ctime) e(12); /* If new exists, it should be removed. */ System("ln new new2"); System("echo foobar > old"); Stat("old", &st1); if (rename("old", "new") != 0) e(13); Stat("new", &st2); /* The status of new should be the same as old. */ if (st1.st_dev != st2.st_dev) e(14); if (st1.st_ino != st2.st_ino) e(15); if (st1.st_mode != st2.st_mode) e(16); if (st1.st_nlink != st2.st_nlink) e(17); if (st1.st_uid != st2.st_uid) e(18); if (st1.st_gid != st2.st_gid) e(19); if (st1.st_rdev != st2.st_rdev) e(20); if (st1.st_size != st2.st_size) e(21); if (st1.st_atime != st2.st_atime) e(22); if (st1.st_mtime != st2.st_mtime) e(23); if (st1.st_ctime != st2.st_ctime) e(24); /* The link count on new2 should be one since the old new is removed. */ Stat("new2", &st1); if (st1.st_nlink != 1) e(25); /* Check if status for "." is updated. */ System("> OLD"); Stat(".", &st1); time(&time1); while (time1 == time((time_t *)0)) ; time(&time2); rename("OLD", "NEW"); Stat(".", &st2); time(&time3); while (time3 == time((time_t *)0)) ; time(&time3); if (st1.st_ctime >= st2.st_ctime) e(26); if (st1.st_mtime >= st2.st_mtime) e(27); if (st1.st_ctime > time1) e(28); if (st1.st_mtime > time1) e(29); if (st1.st_ctime >= time2) e(30); if (st1.st_mtime >= time2) e(31); if (st2.st_ctime < time2) e(32); if (st2.st_mtime < time2) e(33); if (st2.st_ctime >= time3) e(34); if (st2.st_mtime >= time3) e(35); /* If the new file is removed while it's open it should still be * readable. */ System("rm -rf new NEW old OLD"); if ((fd1 = creat("new", 0644)) != 3) e(36); if (write(fd1, "Hi there! I am Sammy the string", 33) != 33) e(37); if (close(fd1) != 0) e(38); if ((fd1 = creat("old", 0644)) != 3) e(39); if (write(fd1, "I need a new name", 18) != 18) e(40); if (close(fd1) != 0) e(41); if ((fd1 = open("new", O_RDONLY)) != 3) e(42); if ((fd2 = open("new", O_RDONLY)) != 4) e(43); if (rename("old", "new") != 0) e(44); if (stat("old", &st1) == 0) e(45); if (close(fd1) != 0) e(46); if ((fd1 = open("new", O_RDONLY)) != 3) e(47); if (read(fd2, buf, BUF_SIZE) != 33) e(48); if (strcmp(buf, "Hi there! I am Sammy the string") != 0) e(49); if (read(fd1, buf, BUF_SIZE) != 18) e(50); if (strcmp(buf, "I need a new name") != 0) e(51); if (close(fd1) != 0) e(52); if (close(fd2) != 0) e(53); } void test32b() { char MaxPath2[PATH_MAX]; /* Same for path */ char MaxName2[NAME_MAX + 1]; /* Name of maximum length */ int fd, i; int stat_loc; struct stat st; subtest = 2; System("rm -rf ../DIR_32/*"); /* Test maximal file name length. */ if ((fd = creat(MaxName, 0777)) != 3) e(1); if (close(fd) != 0) e(2); strcpy(MaxName2, MaxName); MaxName2[strlen(MaxName2) - 1] ^= 1; if (rename(MaxName, MaxName2) != 0) e(3); if (rename(MaxName2, MaxName) != 0) e(4); MaxName2[strlen(MaxName2) - 1] ^= 2; if (rename(MaxName, MaxName2) != 0) e(5); MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ if ((fd = creat(MaxPath, 0777)) != 3) e(6); if (close(fd) != 0) e(7); strcpy(MaxPath2, MaxPath); MaxPath2[strlen(MaxPath2) - 1] ^= 1; if (rename(MaxPath, MaxPath2) != 0) e(8); if (rename(MaxPath2, MaxPath) != 0) e(9); MaxPath2[strlen(MaxPath2) - 1] ^= 2; if (rename(MaxPath, MaxPath2) != 0) e(10); MaxPath[strlen(MaxPath) - 1] = '/'; /* make ././.../a */ /* Test if linked files are renamable. */ System("> foo; ln foo bar"); if (rename("foo", "bar") != 0) e(11); if (rename("bar", "foo") != 0) e(12); System("ln foo foobar"); if (rename("foo", "foobar") != 0) e(13); if (rename("bar", "foobar") != 0) e(14); /* Since the same files have the same links.... */ if (rename("bar", "bar") != 0) e(15); if (rename("foo", "foo") != 0) e(16); if (rename("foobar", "foobar") != 0) e(17); /* In ``rename(old, new)'' with new existing, there is always an new * entry. */ for (i = 0; i < 5; i++) { System("echo old > old"); System("echo news > new"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); sleep(1); rename("old", "new"); exit(0); default: while (stat("old", &st) != 0) if (stat("new", &st) != 0) e(18); wait(&stat_loc); if (stat_loc != 0) e(19); /* Alarm? */ } } } void test32c() { /* Test behavior under error contitions. */ struct stat st1; int stat_loc; subtest = 3; System("rm -rf ../DIR_32/*"); /* Test if we have access. */ system("chmod 777 noacc nowrite > /dev/null 2>/dev/null"); system("rm -rf noacc nowrite"); System("mkdir noacc nowrite"); System("> noacc/file"); System("> nowrite/file"); System("> file"); System("chmod 677 noacc"); System("chmod 577 nowrite"); if (!superuser) { if (rename("noacc/file", "nono") != -1) e(1); if (errno != EACCES) e(2); if (rename("nowrite/file", "nono") != -1) e(3); if (errno != EACCES) e(4); if (rename("file", "noacc/file") != -1) e(5); if (errno != EACCES) e(6); if (rename("file", "nowrite/file") != -1) e(7); if (errno != EACCES) e(8); } if (superuser) { /* Super user heeft access. */ if (rename("noacc/file", "noacc/yes") != 0) e(9); if (rename("nowrite/file", "nowrite/yes") != 0) e(10); if (rename("file", "yes") != 0) e(11); if (rename("noacc/yes", "noacc/file") != 0) e(12); if (rename("nowrite/yes", "nowrite/file") != 0) e(13); if (rename("yes", "file") != 0) e(14); } System("chmod 777 noacc nowrite"); /* If rmdir() doesn't remove a directory, rename() shouldn't eighter. */ System("mkdir newdir olddir"); System("rm -rf /tmp/sema.11[ab]"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); switch (fork()) { case -1: printf("Can't fork6 6!6\n"); break; case 0: /* Child A. */ alarm(20); if (chdir("newdir") != 0) e(15); Creat("/tmp/sema.11a"); while (stat("/tmp/sema.11a", &st1) == -1) sleep(1); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(16); /* Alarm? */ } /* Child B. */ if (chdir("olddir") != 0) e(17); Creat("/tmp/sema.11b"); while (stat("/tmp/sema.11b", &st1) == -1) sleep(1); exit(0); default: /* Wait for child A. It will keep ``newdir'' bussy. */ while (stat("/tmp/sema.11a", &st1) == -1) sleep(1); if (rmdir("newdir") == -1) { if (rename("olddir", "newdir") != -1) e(18); if (errno != EBUSY) e(19); } (void) unlink("/tmp/sema.11a"); /* Wait for child B. It will keep ``olddir'' bussy. */ while (stat("/tmp/sema.11b", &st1) == -1) sleep(1); if (rmdir("olddir") == -1) { if (rename("olddir", "newdir") != -1) e(20); if (errno != EBUSY) e(21); } (void) unlink("/tmp/sema.11b"); wait(&stat_loc); if (stat_loc != 0) e(22); /* Alarm? */ } } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_32"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test33: access() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 1 #define ITERATIONS 2 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Chmod(a,b) if (chmod(a,b) != 0) printf("Can't chmod %s\n", a) #define Mkfifo(f) if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f) int errct = 0; int subtest = 1; int superuser; /* nonzero if uid == euid (euid == 0 always) */ char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test33a, (void)); _PROTOTYPE(void test33b, (void)); _PROTOTYPE(void test33c, (void)); _PROTOTYPE(void test33d, (void)); _PROTOTYPE(void test_access, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 33 "); fflush(stdout); if (geteuid() != 0) { printf("must be setuid root; test aborted\n"); exit(1); } if (getuid() == 0) { printf("must be setuid root logged in as someone else; test aborted\n"); exit(1); } umask(0000); System("rm -rf DIR_33; mkdir DIR_33"); Chdir("DIR_33"); makelongnames(); superuser = (getuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test33a(); if (m & 0002) test33b(); if (m & 0004) test33c(); if (m & 0010) test33d(); } quit(); } void test33a() { /* Test normal operation. */ int stat_loc; /* For the wait(&stat_loc) call. */ subtest = 1; System("rm -rf ../DIR_33/*"); /* To test normal access first make some files for real uid. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); setuid(getuid()); /* (Re)set the effective ids to the * real ids. */ setgid(getgid()); System("> rwx; chmod 700 rwx"); System("> rw_; chmod 600 rw_"); System("> r_x; chmod 500 r_x"); System("> r__; chmod 400 r__"); System("> _wx; chmod 300 _wx"); System("> _w_; chmod 200 _w_"); System("> __x; chmod 100 __x"); System("> ___; chmod 000 ___"); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(1);/* Alarm? */ } test_access(); /* Let's test access() on directorys. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); setuid(getuid()); /* (Re)set the effective ids to the * real ids. */ setgid(getgid()); System("rm -rf [_r][_w][_x]"); System("mkdir rwx; chmod 700 rwx"); System("mkdir rw_; chmod 600 rw_"); System("mkdir r_x; chmod 500 r_x"); System("mkdir r__; chmod 400 r__"); System("mkdir _wx; chmod 300 _wx"); System("mkdir _w_; chmod 200 _w_"); System("mkdir __x; chmod 100 __x"); System("mkdir ___; chmod 000 ___"); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(2);/* Alarm? */ } test_access(); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); setuid(getuid()); /* (Re)set the effective ids to the * real ids. */ setgid(getgid()); System("rmdir [_r][_w][_x]"); Mkfifo("rwx"); System("chmod 700 rwx"); Mkfifo("rw_"); System("chmod 600 rw_"); Mkfifo("r_x"); System("chmod 500 r_x"); Mkfifo("r__"); System("chmod 400 r__"); Mkfifo("_wx"); System("chmod 300 _wx"); Mkfifo("_w_"); System("chmod 200 _w_"); Mkfifo("__x"); System("chmod 100 __x"); Mkfifo("___"); System("chmod 000 ___"); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(3);/* Alarm? */ } test_access(); /* Remove all the fifos. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); setuid(getuid()); setgid(getgid()); System("rm -rf [_r][_w][_x]"); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(4);/* Alarm? */ } } void test33b() { int stat_loc; /* For the wait(&stat_loc) call. */ subtest = 2; System("rm -rf ../DIR_33/*"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* (Re)set the effective ids to the real ids. */ setuid(getuid()); setgid(getgid()); System("> ______rwx; chmod 007 ______rwx"); System("> ________x; chmod 001 ________x"); System("> _________; chmod 000 _________"); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(1);/* Alarm? */ } /* If we are superuser, we have access to all. */ /* Well, almost, execution access might need at least one X bit. */ if (superuser) { if (access("_________", R_OK) != 0) e(2); if (access("_________", W_OK) != 0) e(3); if (access("________x", R_OK) != 0) e(4); if (access("________x", W_OK) != 0) e(5); if (access("________x", X_OK) != 0) e(6); if (access("______rwx", R_OK) != 0) e(7); if (access("______rwx", W_OK) != 0) e(8); if (access("______rwx", X_OK) != 0) e(9); } if (!superuser) { if (access("_________", R_OK) != -1) e(10); if (errno != EACCES) e(11); if (access("_________", W_OK) != -1) e(12); if (errno != EACCES) e(13); if (access("_________", X_OK) != -1) e(14); if (errno != EACCES) e(15); if (access("________x", R_OK) != -1) e(16); if (errno != EACCES) e(17); if (access("________x", W_OK) != -1) e(18); if (errno != EACCES) e(19); if (access("________x", X_OK) != -1) e(20); if (errno != EACCES) e(21); if (access("______rwx", R_OK) != -1) e(22); if (errno != EACCES) e(23); if (access("______rwx", W_OK) != -1) e(24); if (errno != EACCES) e(25); if (access("______rwx", X_OK) != -1) e(26); if (errno != EACCES) e(27); } /* If the real uid != effective uid. */ if (!superuser) { System("rm -rf [_r][_w][_x]"); System("> rwx"); Chmod("rwx", 0700); System("> rw_"); Chmod("rw_", 0600); System("> r_x"); Chmod("r_x", 0500); System("> r__"); Chmod("r__", 0400); System("> _wx"); Chmod("_wx", 0300); System("> _w_"); Chmod("_w_", 0200); System("> __x"); Chmod("__x", 0100); System("> ___"); Chmod("___", 0000); if (access("rwx", F_OK) != 0) e(28); if (access("rwx", R_OK) != -1) e(29); if (errno != EACCES) e(30); if (access("rwx", W_OK) != -1) e(31); if (errno != EACCES) e(32); if (access("rwx", X_OK) != -1) e(33); if (errno != EACCES) e(34); if (access("rw_", F_OK) != 0) e(35); if (access("rw_", R_OK) != -1) e(36); if (errno != EACCES) e(37); if (access("rw_", W_OK) != -1) e(38); if (errno != EACCES) e(39); if (access("rw_", X_OK) != -1) e(40); if (errno != EACCES) e(41); if (access("r_x", F_OK) != 0) e(42); if (access("r_x", R_OK) != -1) e(43); if (errno != EACCES) e(44); if (access("r_x", W_OK) != -1) e(45); if (errno != EACCES) e(46); if (access("r_x", X_OK) != -1) e(47); if (errno != EACCES) e(48); if (access("r__", F_OK) != 0) e(49); if (access("r__", R_OK) != -1) e(50); if (errno != EACCES) e(51); if (access("r__", W_OK) != -1) e(52); if (errno != EACCES) e(53); if (access("r__", X_OK) != -1) e(54); if (errno != EACCES) e(55); if (access("_wx", F_OK) != 0) e(56); if (access("_wx", R_OK) != -1) e(57); if (errno != EACCES) e(58); if (access("_wx", W_OK) != -1) e(59); if (errno != EACCES) e(60); if (access("_wx", X_OK) != -1) e(61); if (errno != EACCES) e(62); if (access("_w_", F_OK) != 0) e(63); if (access("_w_", R_OK) != -1) e(64); if (errno != EACCES) e(65); if (access("_w_", W_OK) != -1) e(66); if (errno != EACCES) e(67); if (access("_w_", X_OK) != -1) e(68); if (errno != EACCES) e(69); if (access("__x", F_OK) != 0) e(70); if (access("__x", R_OK) != -1) e(71); if (errno != EACCES) e(72); if (access("__x", W_OK) != -1) e(73); if (errno != EACCES) e(74); if (access("__x", X_OK) != -1) e(75); if (errno != EACCES) e(76); if (a)6+6,6-6.6/6061626364656ccess("___", F_OK) != 0) e(77); if (access("___", R_OK) != -1) e(78); if (errno != EACCES) e(79); if (access("___", W_OK) != -1) e(80); if (errno != EACCES) e(81); if (access("___", X_OK) != -1) e(82); if (errno != EACCES) e(83); System("rm -rf [_r][_w][_x]"); } } void test33c() { /* Test errors returned. */ int i; subtest = 3; System("rm -rf ../DIR_33/*"); /* Test what access() does with non existing files. */ System("rm -rf nonexist"); if (access("noexist", F_OK) != -1) e(1); if (errno != ENOENT) e(2); if (access("noexist", R_OK) != -1) e(3); if (errno != ENOENT) e(4); if (access("noexist", W_OK) != -1) e(5); if (errno != ENOENT) e(6); if (access("noexist", X_OK) != -1) e(7); if (errno != ENOENT) e(8); if (access("noexist", R_OK | W_OK) != -1) e(9); if (errno != ENOENT) e(10); if (access("noexist", R_OK | X_OK) != -1) e(11); if (errno != ENOENT) e(12); if (access("noexist", W_OK | X_OK) != -1) e(13); if (errno != ENOENT) e(14); if (access("noexist", R_OK | W_OK | X_OK) != -1) e(15); if (errno != ENOENT) e(16); /* Test access on a nonsearchable path. */ if (mkdir("nosearch", 0777) != 0) e(1000); if ( (i = creat("nosearch/file", 0666)) < 0) e(1001); if (close(i) < 0) e(1002); if ( (i = creat("file", 0666) < 0)) e(1003); if (close(i) < 0) e(1004); if (chmod("nosearch/file", 05777) < 0) e(1005); if (chmod("file", 05777) < 0) e(1006); if (chmod("nosearch", 0677) != 0) e(1007); if (access("nosearch/file", F_OK) != 0) e(17); /* Test ToLongName and ToLongPath */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 if (access(ToLongName, F_OK) != -1) e(23); if (errno != ENAMETOOLONG) e(24); # else if (close(creat(ToLongName, 0777)) != 0) e(25); if (access(ToLongName, F_OK) != 0) e(26); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif ToLongPath[PATH_MAX - 2] = '/'; ToLongPath[PATH_MAX - 1] = 'a'; if (access(ToLongPath, F_OK) != -1) e(27); if (errno != ENAMETOOLONG) e(28); ToLongPath[PATH_MAX - 1] = '/'; /* Test empty strings. */ if (access("", F_OK) != -1) e(29); if (errno != ENOENT) e(30); System("rm -rf idonotexist"); if (access("idonotexist", F_OK) != -1) e(31); if (errno != ENOENT) e(32); /* Test non directorys in prefix of path. */ if (access("/etc/passwd/dir/foo", F_OK) != -1) e(33); if (errno != ENOTDIR) e(34); System("rm -rf nodir; > nodir"); if (access("nodir/foo", F_OK) != -1) e(35); if (errno != ENOTDIR) e(36); /* Test if invalid amode arguments are signaled. */ System("> allmod"); Chmod("allmod", 05777); for (i = -1025; i < 1025; i++) { if ((mode_t) i != F_OK && ((mode_t) i & ~(R_OK | W_OK | X_OK)) != 0) { if (access("allmod", (mode_t) i) != -1) e(37); if (errno != EINVAL) e(38); } else if (access("allmod", (mode_t) i) != 0) e(39); } } void test33d() { /* Test access() flags. */ #define EXCLUDE(a,b) (((a)^(b)) == ((a)|(b))) subtest = 4; System("rm -rf ../DIR_33/*"); /* The test are rather strong, stronger that POSIX specifies. */ /* The should be OR able, this test tests if all the 1 bits */ /* Are in diferent places. This should be what one wants. */ if (!EXCLUDE(R_OK, W_OK | X_OK)) e(1); if (!EXCLUDE(W_OK, R_OK | X_OK)) e(2); if (!EXCLUDE(X_OK, R_OK | W_OK)) e(3); if (F_OK == R_OK) e(4); if (F_OK == W_OK) e(5); if (F_OK == X_OK) e(6); if (F_OK == (R_OK | W_OK)) e(7); if (F_OK == (W_OK | X_OK)) e(8); if (F_OK == (R_OK | X_OK)) e(9); if (F_OK == (R_OK | W_OK | X_OK)) e(10); } void test_access() { /* Test all [_r][_w][_x] files. */ if (!superuser) { /* Test normal access. */ if (access("rwx", F_OK) != 0) e(11); if (access("rwx", R_OK) != 0) e(12); if (access("rwx", W_OK) != 0) e(13); if (access("rwx", X_OK) != 0) e(14); if (access("rwx", R_OK | W_OK) != 0) e(15); if (access("rwx", R_OK | X_OK) != 0) e(16); if (access("rwx", W_OK | X_OK) != 0) e(17); if (access("rwx", R_OK | W_OK | X_OK) != 0) e(18); if (access("rw_", F_OK) != 0) e(19); if (access("rw_", R_OK) != 0) e(20); if (access("rw_", W_OK) != 0) e(21); if (access("rw_", X_OK) != -1) e(22); if (errno != EACCES) e(23); if (access("rw_", R_OK | W_OK) != 0) e(24); if (access("rw_", R_OK | X_OK) != -1) e(25); if (errno != EACCES) e(26); if (access("rw_", W_OK | X_OK) != -1) e(27); if (errno != EACCES) e(28); if (access("rw_", R_OK | W_OK | X_OK) != -1) e(29); if (errno != EACCES) e(30); if (access("r_x", F_OK) != 0) e(31); if (access("r_x", R_OK) != 0) e(32); if (access("r_x", W_OK) != -1) e(33); if (errno != EACCES) e(34); if (access("r_x", X_OK) != 0) e(35); if (access("r_x", R_OK | W_OK) != -1) e(36); if (errno != EACCES) e(37); if (access("r_x", R_OK | X_OK) != 0) e(38); if (access("r_x", W_OK | X_OK) != -1) e(39); if (errno != EACCES) e(40); if (access("r_x", R_OK | W_OK | X_OK) != -1) e(41); if (errno != EACCES) e(42); if (access("r__", F_OK) != 0) e(43); if (access("r__", R_OK) != 0) e(44); if (access("r__", W_OK) != -1) e(45); if (errno != EACCES) e(46); if (access("r__", X_OK) != -1) e(47); if (errno != EACCES) e(48); if (access("r__", R_OK | W_OK) != -1) e(49); if (errno != EACCES) e(50); if (access("r__", R_OK | X_OK) != -1) e(51); if (errno != EACCES) e(52); if (access("r__", W_OK | X_OK) != -1) e(53); if (errno != EACCES) e(54); if (access("r__", R_OK | W_OK | X_OK) != -1) e(55); if (errno != EACCES) e(56); if (access("_wx", F_OK) != 0) e(57); if (access("_wx", R_OK) != -1) e(58); if (errno != EACCES) e(59); if (access("_wx", W_OK) != 0) e(60); if (access("_wx", X_OK) != 0) e(61); if (access("_wx", R_OK | W_OK) != -1) e(62); if (errno != EACCES) e(63); if (access("_wx", R_OK | X_OK) != -1) e(64); if (errno != EACCES) e(65); if (access("_wx", W_OK | X_OK) != 0) e(66); if (access("_wx", R_OK | W_OK | X_OK) != -1) e(67); if (errno != EACCES) e(68); if (access("_w_", F_OK) != 0) e(69); if (access("_w_", R_OK) != -1) e(70); if (errno != EACCES) e(71); if (access("_w_", W_OK) != 0) e(72); if (access("_w_", X_OK) != -1) e(73); if (errno != EACCES) e(74); if (access("_w_", R_OK | W_OK) != -1) e(75); if (errno != EACCES) e(76); if (access("_w_", R_OK | X_OK) != -1) e(77); if (errno != EACCES) e(78); if (access("_w_", W_OK | X_OK) != -1) e(79); if (errno != EACCES) e(80); if (access("_w_", R_OK | W_OK | X_OK) != -1) e(81); if (errno != EACCES) e(82); if (access("__x", F_OK) != 0) e(83); if (access("__x", R_OK) != -1) e(84); if (errno != EACCES) e(85); if (access("__x", W_OK) != -1) e(86); if (errno != EACCES) e(87); if (access("__x", X_OK) != 0) e(88); if (access("__x", R_OK | W_OK) != -1) e(89); if (errno != EACCES) e(90); if (access("__x", R_OK | X_OK) != -1) e(91); if (errno != EACCES) e(92); if (access("__x", W_OK | X_OK) != -1) e(93); if (errno != EACCES) e(94); if (access("__x", R_OK | W_OK | X_OK) != -1) e(95); if (errno != EACCES) e(96); if (access("___", F_OK) != 0) e(97); if (access("___", R_OK) != -1) e(98); if (errno != EACCES) e(99); if (access("___", W_OK) != -1) e(100); if (errno != EACCES) e(101); if (access("___", X_OK) != -1) e(102); if (errno != EACCES) e(103); if (access("___", R_OK | W_OK) != -1) e(104); if (errno != EACCES) e(105); if (access("___", R_OK | X_OK) != -1) e(106); if (errno != EACCES) e(107); if (access("___", W_OK | X_OK) != -1) e(108); if (errno != EACCES) e(109); if (access("___", R_OK | W_OK | X_OK) != -1) e(110); if (errno != EACCES) e(111); } if (superuser) { /* Test root access don't test X_OK on [_r][_w]_ files. */ if (access("rwx", F_OK) != 0) e(112); if (access("rwx", R_OK) != 0) e(113); if (access("rwx", W_OK) != 0) e(114); if (access("rwx", X_OK) != 0) e(115); if (access("rwx", R_OK | W_OK) != 0) e(116); if (access("rwx", R_OK | X_OK) != 0) e(117); if (access("rwx", W_OK | X_OK) != 0) e(118); if (access("rwx", R_OK | W_OK | X_OK) != 0) e(119); if (access("rw_", F_OK) != 0) e(120); if (access("rw_", R_OK) != 0) e(121); if (access("rw_", W_OK) != 0) e(122); if (access("rw_", R_OK | W_OK) != 0) e(123); if (access("r_x", F_OK) != 0) e(124); if (access("r_x", R_OK) != 0) e(125); if (access("r_x", W_OK) != 0) e(126); if (access("r_x", X_OK) != 0) e(127); if (access("r_x", R_OK | W_OK) != 0) e(128); if (access("r_x", R_OK | X_OK) != 0) e(129); if (access("r_x", W_OK | X_OK) != 0) e(130); if (access("r_x", R_OK | W_OK | X_OK) != 0) e(131); if (access("r__", F_OK) != 0) e(132); if (access("r__", R_OK) != 0) e(133); if (access("r__", W_OK) != 0) e(134); if (access("r__", R_OK | W_OK) != 0) e(135); if (access("_wx", F_OK) != 0) e(136); if (access("_wx", R_OK) != 0) e(137); if (access("_wx", W_OK) != 0) e(138); if (access("_wx", X_OK) != 0) e(139); if (access("_wx", R_OK | W_OK) != 0) e(140); if (access("_wx", R_OK | X_OK) != 0) e(141); if (access("_wx", W_OK | X_OK) != 0) e(142); if (access("_wx", R_OK | W_OK | X_OK) != 0) e(143); if (access("_w_", F_OK) != 0) e(144); if (access("_w_", R_OK) != 0) e(145); if (access("_w_", W_OK) != 0) e(146); if (access("_w_", R_OK | W_OK) != 0) e(147); if (access("__x", F_OK) != 0) e(148); if (access("__x", R_OK) != 0) e(149); if (access("__x", W_OK) != 0) e(150); if (access("__x", X_OK) != 0) e(151); if (access("__x", R_OK | W_OK) != 0) e(152); if (access("__x", R_OK | X_OK) != 0) e(153); if (access("__x", W_OK | X_OK) != 0) e(154); if (access("__x", R_OK | W_OK | X_OK) != 0) e(155); if (access("___", F_OK) != 0) e(156); if (access("___", R_OK) != 0) e(157); if (access("___", W_OK) != 0) e(158); if (access("___", R_OK | W_OK) != 0) e(159); } } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_33"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test34: chmod() chown() Author: Jan-Mark Wams (jms@cs.vu.nl) */ /* There is a problem getting valid uids and gids, so we use the passwd ** file (ie. /etc/passwd). I don't like this, but I see no other way. ** The read-only-device-error (EROFS) is not checked! ** Supplementary group IDs are ignored. */ #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 4 #define N 100 #define ALL_RWXB (S_IRWXU | S_IRWXG | S_IRWXO) #define ALL_SETB (S_ISUID | S_ISGID) #define ALL_BITS (ALL_RWXB | ALL_SETB) #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Mkfifo(f) if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f) #define Mkdir(f) if (mkdir(f,0777)!=0) printf("Can't make dir %s\n", f) #define Creat(f) if (close(creat(f,0777))!=0) printf("Can't creat %s\n",f) /* This program uses /etc/passwd and assumes things about it's contents. */ #define PASSWD_FILE "/etc/passwd" int errct = 0; int subtest = 1; int superuser; int I_can_chown; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char NameTooLong[NAME_MAX + 2]; /* Name of maximum +1 length */ char PathTooLong[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test34a, (void)); _PROTOTYPE(void test34b, (void)); _PROTOTYPE(void test34c, (void)); _PROTOTYPE(mode_t mode, (char *file_name)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void getids, (uid_t * uid, gid_t * gid)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 34 "); fflush(stdout); (void) system("chmod 777 DIR_34/* > /dev/null 2> /dev/null"); System("rm -rf DIR_34; mkdir DIR_34"); if (chdir("DIR_34") != 0) { fprintf(stderr, "Can't go to DIR_34\n"); system("rm -rf DIR_34"); exit(1); } makelongnames(); superuser = (geteuid() == (uid_t) 0); #ifdef _POSIX_CHOWN_RESTRICTED I_can_chown = superuser; #else I_can_chown = 1; #endif umask(0000); for (i = 1; i < ITERATIONS; i++) { if (m & 0001) test34a(); if (m & 0002) test34b(); if (m & 0004) test34c(); } quit(); } void test34a() { /* Test normal operation. */ time_t time1, time2; mode_t mod; struct stat st1, st2; int cnt; uid_t uid, uid2; gid_t gid, gid2; int stat_loc; subtest = 1; /* Make scratch file. */ Creat("foo"); for (mod = 0; mod <= ALL_BITS; mod++) { if ((mod & ALL_BITS) != mod) /* If not a valid mod next. */ continue; Stat("foo", &st1); if (time(&time1) == (time_t) - 1) e(1); if (chmod("foo", mod) != 0) e(2); Stat("foo", &st2); if (time(&time2) == (time_t) - 1) e(3); if (superuser) if ((st2.st_mode & ALL_BITS) != mod) e(4); if (!superuser) if ((st2.st_mode & ALL_RWXB) != (mod & ALL_RWXB)) e(5); /* Test the C time feald. */ if (st1.st_ctime > st2.st_ctime) e(6); if (st1.st_ctime > time1) e(7); if (st1.st_ctime > time2) e(8); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(9); #endif if (st2.st_ctime > time2) e(10); if (st1.st_atime != st2.st_atime) e(11); if (st1.st_mtime != st2.st_mtime) e(12); } /* End for loop. */ /* Check if chown(file, geteuid(), getegid()) works. */ for (cnt = 0; cnt < 20; cnt++) { /* Set all rights on foo, including the set .id bits. */ if (chmod("foo", ALL_BITS) != 0) e(13); Stat("foo", &st1); if (time(&time1) == (time_t) -1) e(14); if (chown("foo", geteuid(), getegid()) != 0) e(15); Stat("foo", &st2); if (time(&time2) == (time_t) -1) e(16); /* Check ``chown()'' killed the set .id bits. */ if (!superuser) { if ((st1.st_mode & ALL_RWXB) != ALL_RWXB) e(17); if ((st2.st_mode & ALL_BITS) != ALL_RWXB) e(18); } if (superuser) { if ((st1.st_mode & ALL_BITS) != ALL_BITS) e(19); if ((st1.st_mode & ALL_RWXB) != ALL_RWXB) e(20); } /* Check the timing. */ if (st1.st_ctime > st2.st_ctime) e(21); if (st1.st_ctime > time1) e(22); if (st1.st_ctime > time2) e(23); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(24); #endif if (st2.st_ctime > time2) e(25); if (st1.st_atime != st2.st_atime) e(26); if (st1.st_mtime != st2.st_mtime) e(27); } /* End for loop. */ /* Make scratch file. */ if (chmod("foo", ALL_RWXB) != 0) e(28); if (I_can_chown) { /* Do a 20 tests on a gid and uid. */ for (cnt = 0; cnt < 20; cnt++) { /* Get a uid and a gid, test chown. */ getids(&uid, &gid); Stat("foo", &st1); if (time(&time1) == (time_t) -1) e(29); if (chown("foo", (uid_t) 0, (gid_t) 0) != 0) e(30); Stat("foo", &st2); if (time(&time2) == (time_t) -1) e(31); /* Test the C time field. */ if (st1.st_ctime > st2.st_ctime) e(32); if (st1.st_ctime > time1) e(33); if (st1.st_ctime > time2) e(34); if (st2.st_ctime < time1) e(35); if (st2.st_ctime > time2) e(36); if (st1.st_atime != st2.st_atime) e(37); if (st1.st_mtime != st2.st_mtime) e(38); /* Do aditional tests. */ if (chown("foo", (uid_t) 0, gid) != 0) e(39); if (chown("foo", uid, (gid_t) 0) != 0) e(40); if (chown("foo", uid, gid) != 0) e(41); } } if (superuser) { /* Check if a non-superuser can change a files gid to gid2 * * if gid2 is the current process gid. */ for (cnt = 0; cnt < 5; cnt++) { switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); getids(&uid, &gid); if (uid == 0) { getids(&uid, &gid); if (uid == 0) e(42); } getids(&uid2, &gid2); if (gid == gid2) e(43); /* Creat boo and bar for user uid of group gid. */ Creat("boo"); if (chown("boo", uid, gid) != 0) e(44); if (chmod("boo", ALL_BITS) != 0) e(45); Creat("bar"); if (chown("bar", uid, gid) != 0) e(46); if (chmod("bar", ALL_BITS) != 0) e(47); /* We now become user uid of group gid2. */ setgid(gid2); setuid(uid); Stat("bar", &st1); if (time(&time1) == (time_t) -1) e(48); if (chown("bar", uid, gid2) != 0) e(49); Stat("bar", &st2); if (time(&time2) == (time_t) -1) e(50); /* Check if the SET_BITS are cleared. */ if ((st1.st_mode & ALL_BITS) != ALL_BITS) e(51); if ((st2.st_mode & ALL_BITS) != ALL_RWXB) e(52); /* Check the st_times. */ if (st1.st_ctime > st2.st_ctime) e(53); if (st1.st_ctime > time1) e(54); if (st1.st_ctime > time2) e(55); if (st2.st_ctime < time1) e(56); if (st2.st_ctime > time2) e(57); if (st1.st_atime != st2.st_atime) e(58); if (st1.st_mtime != st2.st_mtime) e(59); Stat("boo", &st1); if (chmod("boo", ALL_BITS) != 0) e(60); Stat("boo", &st2); /* Check if the set gid bit is cleared. */ if ((st1.st_mode & ALL_RWXB) != ALL_RWXB) e(61); if ((st2.st_mode & S_ISGID) != 0) e(62); if (chown("boo", uid, gid2) != 0) e(63); Stat("boo", &st1); /* Check if the set uid bit is cleared. */ if ((st1.st_mode & S_ISUID) != 0) e(64); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(65); /* Alarm? */ } } /* end for loop. */ } /* end if (superuser). */ if (chmod("foo", ALL_BITS) != 0) e(66); Stat("foo", &st1); if (chown("foo", geteuid(), getegid()) != 0) e(67); Stat("foo", &st2); if ((st1.st_mode & ALL_BITS) != ALL_BITS) e(68); /* See intro! */ if (superuser) if ((st2.st_mode & ALL_RWXB) != ALL_RWXB) e(69); if (!superuser) if ((st2.st_mode & ALL_BITS) != ALL_RWXB) e(70); (void) system("chmod 777 ../DIR_34/* > /dev/null 2> /dev/null"); System("rm -rf ../DIR_34/*"); } void test34b() { time_t time1, time2; mode_t mod; struct stat st1, st2; subtest = 2; /* Test chmod() and chown() on non regular files and on MaxName and * MaxPath. * Funny, but dirs should also have S_IS.ID bits. */ Mkfifo("fifo"); Mkdir("dir"); Creat(MaxName); MaxPath[strlen(MaxPath) - 2] = '/'=6?6@6A6B6C6D6E6F6G6H6; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ Creat(MaxPath); for (mod = 1; mod <= ALL_BITS; mod <<= 1) { if ((mod & ALL_BITS) != mod) continue; /* bad mod */ Stat("dir", &st1); if (time(&time1) == (time_t) -1) e(1); if (chmod("dir", mod) != 0) e(2); Stat("dir", &st2); if (time(&time2) == (time_t) -1) e(3); if (superuser) if ((st2.st_mode & ALL_BITS) != mod) e(4); if (!superuser) if ((st2.st_mode & ALL_RWXB) != (mod & ALL_RWXB)) e(5); /* Test the C time field. */ if (st1.st_ctime > st2.st_ctime) e(6); if (st1.st_ctime > time1) e(7); if (st1.st_ctime > time2) e(8); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(9); #endif if (st2.st_ctime > time2) e(10); if (st1.st_atime != st2.st_atime) e(11); if (st1.st_mtime != st2.st_mtime) e(12); Stat("fifo", &st1); if (time(&time1) == (time_t) -1) e(13); if (chmod("fifo", mod) != 0) e(14); Stat("fifo", &st2); if (time(&time2) == (time_t) -1) e(15); if (superuser) if ((st2.st_mode & ALL_BITS) != mod) e(16); if (!superuser) if ((st2.st_mode & ALL_RWXB) != (mod & ALL_RWXB)) e(17); /* Test the C time field. */ if (st1.st_ctime > st2.st_ctime) e(18); if (st1.st_ctime > time1) e(19); if (st1.st_ctime > time2) e(20); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(21); #endif if (st2.st_ctime > time2) e(22); if (st1.st_atime != st2.st_atime) e(23); if (st1.st_mtime != st2.st_mtime) e(24); Stat(MaxName, &st1); if (time(&time1) == (time_t) -1) e(25); if (chmod(MaxName, mod) != 0) e(26); Stat(MaxName, &st2); if (time(&time2) == (time_t) -1) e(27); if (superuser) if ((st2.st_mode & ALL_BITS) != mod) e(28); if (!superuser) if ((st2.st_mode & ALL_RWXB) != (mod & ALL_RWXB)) e(29); /* Test the C time field. */ if (st1.st_ctime > st2.st_ctime) e(30); if (st1.st_ctime > time1) e(31); if (st1.st_ctime > time2) e(32); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(33); #endif if (st2.st_ctime > time2) e(34); if (st1.st_atime != st2.st_atime) e(35); if (st1.st_mtime != st2.st_mtime) e(36); Stat(MaxPath, &st1); if (time(&time1) == (time_t) -1) e(37); if (chmod(MaxPath, mod) != 0) e(38); Stat(MaxPath, &st2); if (time(&time2) == (time_t) -1) e(39); if (superuser) if ((st2.st_mode & ALL_BITS) != mod) e(40); if (!superuser) if ((st2.st_mode & ALL_RWXB) != (mod & ALL_RWXB)) e(41); /* Test the C time field. */ if (st1.st_ctime > st2.st_ctime) e(42); if (st1.st_ctime > time1) e(43); if (st1.st_ctime > time2) e(44); #ifndef V1_FILESYSTEM if (st2.st_ctime < time1) e(45); #endif if (st2.st_ctime > time2) e(46); if (st1.st_atime != st2.st_atime) e(47); if (st1.st_mtime != st2.st_mtime) e(48); } if (chmod("dir", 0777) != 0) e(49); if (chmod("fifo", 0777) != 0) e(50); if (chmod(MaxName, 0777) != 0) e(51); if (chmod(MaxPath, 0777) != 0) e(52); (void) system("chmod 777 ../DIR_34/* > /dev/null 2> /dev/null"); System("rm -rf ../DIR_34/*"); } void test34c() { struct stat st; uid_t uid, uid2; gid_t gid, gid2; int stat_loc; subtest = 3; Mkdir("dir"); Creat("dir/try_me"); /* Disalow search permission and see if chmod() and chown() return * EACCES. */ if (chmod("dir", ALL_BITS & ~S_IXUSR) != 0) e(1); if (!superuser) { if (chmod("dir/try_me", 0) != -1) e(2); if (errno != EACCES) e(3); if (I_can_chown) { if (chown("dir/try_me", geteuid(), getegid()) != -1) e(4); if (errno != EACCES) e(5); } } /* Check ENOTDIR. */ Mkfifo("fifo"); if (chmod("fifo/try_me", 0) != -1) e(6); if (errno != ENOTDIR) e(7); if (chown("fifo/try_me", geteuid(), getegid()) != -1) e(8); if (errno != ENOTDIR) e(9); Creat("file"); if (chmod("file/try_me", 0) != -1) e(10); if (errno != ENOTDIR) e(11); if (chown("file/try_me", geteuid(), getegid()) != -1) e(12); if (errno != ENOTDIR) e(13); /* Check empty path. */ if (chmod("", 0) != -1) e(14); if (errno != ENOENT) e(15); if (chown("", geteuid(), getegid()) != -1) e(16); if (errno != ENOENT) e(17); /* Check non existing file name. */ if (chmod("non_exist", 0) != -1) e(18); if (errno != ENOENT) e(19); if (chown("non_exist", geteuid(), getegid()) != -1) e(20); if (errno != ENOENT) e(21); /* Check what we get if we do not have permisson. */ if (!superuser) { Stat("/", &st); if (st.st_uid == geteuid()) e(22); /* First I had 0, I changed it to st.st_mode 8-). */ if (chmod("/", st.st_mode) != -1) e(23); if (errno != EPERM) e(24); } if (!I_can_chown) { Stat("/", &st); if (st.st_uid == geteuid()) e(25); if (chown("/", geteuid(), getegid()) != -1) e(26); if (errno != EPERM) e(27); } /* If we are superuser, we can test all id combinations. */ if (superuser) { switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); getids(&uid, &gid); if (uid == 0) { getids(&uid, &gid); if (uid == 0) e(28); } getids(&uid2, &gid2); if (gid == gid2) e(29); if (uid == uid2) e(30); /* Creat boo, owned by root. */ Creat("boo"); if (chmod("boo", ALL_BITS) != 0) e(31); /* Creat boo for user uid2 of group gid2. */ Creat("bar"); if (chown("bar", uid2, gid2) != 0) e(32); if (chmod("bar", ALL_BITS) != 0) e(33); /* Creat my_gid for user uid2 of group gid. */ Creat("my_gid"); if (chown("my_gid", uid2, gid) != 0) e(34); if (chmod("my_gid", ALL_BITS) != 0) e(35); /* Creat my_uid for user uid of uid gid. */ Creat("my_uid"); if (chown("my_uid", uid, gid) != 0) e(36); if (chmod("my_uid", ALL_BITS) != 0) e(37); /* We now become user uid of uid gid. */ setgid(gid); setuid(uid); if (chown("boo", uid, gid) != -1) e(38); if (errno != EPERM) e(39); if (chown("bar", uid, gid) != -1) e(40); if (errno != EPERM) e(41); if (chown("my_gid", uid, gid) != -1) e(42); if (errno != EPERM) e(43); if (chown("my_uid", uid, gid2) != -1) e(44); /* The EPERM is not strict POSIX. */ if (errno != EPERM) e(45); if (chmod("boo", 0) != -1) e(46); if (errno != EPERM) e(47); if (chmod("bar", 0) != -1) e(48); if (errno != EPERM) e(49); if (chmod("my_gid", 0) != -1) e(50); if (errno != EPERM) e(51); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(52); /* Alarm? */ } } /* Check too long path ed. */ Creat(NameTooLong); if (chmod(NameTooLong, 0777) != 0) e(57); if (chown(NameTooLong, geteuid(), getegid()) != 0) e(58); /* Make PathTooLong contain ././.../a */ PathTooLong[strlen(PathTooLong) - 2] = '/'; PathTooLong[strlen(PathTooLong) - 1] = 'a'; Creat("a"); if (chmod(PathTooLong, 0777) != -1) e(59); if (errno != ENAMETOOLONG) e(60); if (chown(PathTooLong, geteuid(), getegid()) != -1) e(61); if (errno != ENAMETOOLONG) e(62); (void) system("chmod 777 ../DIR_34/* > /dev/null 2> /dev/null"); System("rm -rf ../DIR_34/*"); } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(NameTooLong, MaxName); /* copy them Max to TooLong */ strcpy(PathTooLong, MaxPath); NameTooLong[NAME_MAX] = 'a'; NameTooLong[NAME_MAX + 1] = '\0'; /* extend NameTooLong by one too many*/ PathTooLong[PATH_MAX - 1] = '/'; PathTooLong[PATH_MAX] = '\0'; /* inc PathTooLong by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); system("rm -rf DIR_34"); exit(1); } errno = 0; } void quit() { Chdir(".."); (void) system("chmod 777 DIR_34/* > /dev/null 2> /dev/null"); System("rm -rf DIR_34"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Getids returns a valid uid and gid. Is used PASSWD FILE. * It assumes the following format for a passwd file line: * :::: * If no uids and gids can be found, it will only return 0 ids. */ void getids(r_uid, r_gid) uid_t * r_uid; gid_t * r_gid; { char line[N]; char *p; uid_t uid; gid_t gid; FILE *fp; int i; static uid_t a_uid[N]; /* Array for uids. */ static gid_t a_gid[N]; /* Array for gids. */ static int nuid = 0, ngid = 0;/* The number of user & group ids. */ static int cuid = 0, cgid = 0;/* The current id index. */ /* If we don't have any uids go read some from the passwd file. */ if (nuid == 0) { a_uid[nuid++] = 0; /* Root uid and gid. */ a_gid[ngid++] = 0; if ((fp = fopen(PASSWD_FILE, "r")) == NULL) { printf("Can't open "); perror(PASSWD_FILE); } while (fp != NULL && fgets(line, sizeof(line), fp) != NULL) { p = strchr(line, ':'); if (p != NULL) p = strchr(p + 1, ':'); if (p != NULL) { p++; uid = 0; while (isdigit(*p)) { uid *= 10; uid += (uid_t) (*p - '0'); p++; } if (*p != ':') continue; p++; gid = 0; while (isdigit(*p)) { gid *= 10; gid += (gid_t) (*p - '0'); p++; } if (*p != ':') continue; if (nuid < N) { for (i = 0; i < nuid; i++) if (a_uid[i] == uid) break; if (i == nuid) a_uid[nuid++] = uid; } if (ngid < N) { for (i = 0; i < ngid; i++) if (a_gid[i] == gid) break; if (i == ngid) a_gid[ngid++] = gid; } if (nuid >= N && ngid >= N) break; } } if (fp != NULL) fclose(fp); } /* We now have uids and gids in a_uid and a_gid. */ if (cuid >= nuid) cuid = 0; if (cgid >= ngid) cgid = 0; *r_uid = a_uid[cuid++]; *r_gid = a_gid[cgid++]; } /* test35: utime() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 1 #define ITERATIONS 10 #define N 100 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Mkfifo(f) if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f) #define Mkdir(f) if (mkdir(f,0777)!=0) printf("Can't make dir %s\n", f) #define Creat(f) if (close(creat(f,0777))!=0) printf("Can't creat %s\n",f) #define Time(t) if (time(t) == (time_t)-1) printf("Time error\n") #define Chown(f,u,g) if (chown(f,u,g) != 0) printf("Can't chown %s\n", f) #define Chmod(f,m) if (chmod(f,m) != 0) printf("Can't chmod %s\n", f) #define PASSWD_FILE "/etc/passwd" int errct = 0; int subtest = 1; int I_can_chown; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char NameTooLong[NAME_MAX + 2]; /* Name of maximum +1 length */ char PathTooLong[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test35a, (void)); _PROTOTYPE(void test35b, (void)); _PROTOTYPE(void test35c, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void getids, (uid_t * uid, gid_t * gid)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 35 "); fflush(stdout); System("rm -rf DIR_35; mkdir DIR_35"); Chdir("DIR_35"); makelongnames(); superuser = (geteuid() == 0); #ifdef _POSIX_CHOWN_RESTRICTED # if _POSIX_CHOWN_RESTRICTED - 0 != -1 I_can_chown = superuser; # else I_can_chown = 1; # endif #else # include "error, this case requires dynamic checks and is not handled" #endif for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test35a(); if (m & 0002) test35b(); if (m & 0004) test35c(); } quit(); } void test35a() { /* Test normal operation. */ struct stat st; struct utimbuf ub; time_t time1, time2; int cnt; subtest = 1; /* Creat scratch file. */ Creat("foo"); /* Set file times back two seconds. */ Stat("foo", &st); ub.actime = st.st_atime - 2; ub.modtime = st.st_mtime - 2; Time(&time1); utime("foo", &ub); Time(&time2); Stat("foo", &st); if (ub.actime != st.st_atime) e(1); if (ub.modtime != st.st_mtime) e(2); /* The status changed time sould be changed. */ #ifndef V1_FILESYSTEM if (st.st_ctime < time1) e(3); #endif if (st.st_ctime > time2) e(4); /* Add twenty seconds. */ Stat("foo", &st); ub.actime = st.st_atime + 20; ub.modtime = st.st_mtime + 20; Time(&time1); utime("foo", &ub); Time(&time2); Stat("foo", &st); if (ub.actime != st.st_atime) e(5); if (ub.modtime != st.st_mtime) e(6); if (st.st_ctime < time1) e(7); #ifndef V1_FILESYSTEM if (st.st_ctime > time2) e(8); #endif /* Try 100 times to do utime in less than one second. */ cnt = 0; do { Time(&time1); utime("foo", (struct utimbuf *) NULL); Time(&time2); } while (time1 != time2 && cnt++ < 100); if (time1 == time2) { Stat("foo", &st); Time(&time2); if (st.st_atime != time1) e(9); if (st.st_mtime != time1) e(10); } else { Stat("foo", &st); if (st.st_atime > time2) e(11); if (st.st_mtime > time2) e(12); Time(&time2); if (st.st_atime < time1) e(13); if (st.st_mtime < time1) e(14); } if (st.st_ctime < time1) e(15); if (st.st_ctime > time2) e(16); System("rm -rf ../DIR_35/*"); } void test35b() { subtest = 2; /* MaxPath and MaxName checkup. */ Creat(MaxName); MaxPath[strlen(MaxPath) - 2] = '/'; MaxPath[strlen(MaxPath) - 1] = 'a'; /* make ././.../a */ Creat(MaxPath); if (utime(MaxName, NULL) != 0) e(1); if (utime(MaxPath, NULL) != 0) e(2); /* The owner doesn't need write permisson to set times. */ Creat("foo"); if (chmod("foo", 0) != 0) e(3); if (utime("foo", NULL) != 0) e(4); if (chmod("foo", 0777) != 0) e(5); if (utime("foo", NULL) != 0) e(6); System("rm -rf ../DIR_35/*"); } void test35c() { gid_t gid, gid2; uid_t uid, uid2; struct utimbuf ub; int stat_loc; subtest = 3; /* Access problems. */ Mkdir("bar"); Creat("bar/tryme"); if (superuser) { Chmod("bar", 0000); /* No search permisson at all. */ if (utime("bar/tryme", NULL) != 0) e(1); } if (!superuser) { Chmod("bar", 0677); /* No search permisson. */ if (utime("bar/tryme", NULL) != -1) e(2); if (errno != EACCES) e(3); } Chmod("bar", 0777); if (I_can_chown) { switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Get two differend non root uids. */ if (superuser) { getids(&uid, &gid); if (uid == 0) getids(&uid, &gid); if (uid == 0) e(4); } if (!superuser) { uid = geteuid(); gid = getegid(); } getids(&uid2, &gid); if (uid == uid2) getids(&uid2, &gid2); if (uid == uid2) e(5); /* Creat a number of files for root, user and user2. */ Creat("rootfile"); /* Owned by root. */ Chmod("rootfile", 0600); Chown("rootfile", 0, 0); Creat("user2file"); /* Owned by user 2, writeable. */ Chmod("user2file", 0020); Chown("user2file", uid2, gid); Creat("user2private"); /* Owned by user 2, privately. */ Chmod("user2private", 0600); Chown("user2private", uid2, gid); if (superuser) { setgid(gid); setuid(uid); } /* We now are user ``uid'' from group ``gid''. */ ub.actime = (time_t) 12345L; ub.modtime = (time_t) 12345L; if (utime("rootfile", NULL) != -1) e(6); if (errno != EACCES) e(7); if (utime("rootfile", &ub) != -1) e(8); if (errno != EPERM) e(9); if (utime("user2file", NULL) != 0) e(10); if (utime("user2file", &ub) != -1) e(11); if (errno != EPERM) e(12); if (utime("user2private", NULL) != -1) e(13); if (errno != EACCES) e(14); if (utime("user2private", &ub) != -1) e(15); if (errno != EPERM) e(16); exit(errct ? 1 : 0); default: wait(&stat_loc); if (stat_loc != 0) e(17); /* Alarm? */ } } /* Test names that are too long. */ #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 != -1 /* Not exist might also be a propper response? */ if (utime(NameTooLong, NULL) != -1) e(18); if (errno != ENAMETOOLONG) e(19); # else Creat(NameTooLong); if (utime(NameTooLong, NULL) != 0) e(20); # endif #else # include "error, this case requires dynamic checks and is not handled" #endif /* Make PathTooLong contain ././.../a */ PathTooLong[strlen(PathTooLong) - 2] = '/'; PathTooLong[strlen(PathTooLong) - 1] = 'a'; Creat("a"); if (utime(PathTooLong, NULL) != -1) e(21); if (errno != ENAMETOOLONG) e(22); /* Non existing file name. */ if (utime("nonexist", NULL) != -1) e(23); if (errno != ENOENT) e(24); /* Empty file name. */ if (utime("", NULL) != -1) e(25); if (errno != ENOENT) e(26); System("rm -rf ../DIR_35/*"); } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(NameTooLong, MaxName); /* copy them Max to TooLong */ strcpy(PathTooLong, MaxPath); NameTooLong[NAME_MAX] = 'a'; NameTooLong[NAME_MAX + 1] = '\0'; /* extend NameTooLong by one too many*/ PathTooLong[PATH_MAX - 1] = '/'; PathTooLong[PATH_MAX] = '\0'; /* inc PathTooLong by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR* > /dev/null 2>/dev/null"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_35");P6R6S6 if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* Getids returns a valid uid and gid. Is used PASSWD FILE. ** It assumes the following format for a passwd file line: ** :::: ** If no uids and gids can be found, it will only return 0 ids. */ void getids(r_uid, r_gid) uid_t *r_uid; gid_t *r_gid; { char line[N]; char *p; uid_t uid; gid_t gid; FILE *fp; int i; static uid_t a_uid[N]; /* Array for uids. */ static gid_t a_gid[N]; /* Array for gids. */ static int nuid = 0, ngid = 0;/* The number of user & group ids. */ static int cuid = 0, cgid = 0;/* The current id index. */ /* If we don't have any uids go read some from the passwd file. */ if (nuid == 0) { a_uid[nuid++] = 0; /* Root uid and gid. */ a_gid[ngid++] = 0; if ((fp = fopen(PASSWD_FILE, "r")) == NULL) { printf("Can't open "); perror(PASSWD_FILE); } while (fp != NULL && fgets(line, sizeof(line), fp) != NULL) { p = strchr(line, ':'); if (p != NULL) p = strchr(p + 1, ':'); if (p != NULL) { p++; uid = 0; while (isdigit(*p)) { uid *= 10; uid += (uid_t) (*p - '0'); p++; } if (*p != ':') continue; p++; gid = 0; while (isdigit(*p)) { gid *= 10; gid += (gid_t) (*p - '0'); p++; } if (*p != ':') continue; if (nuid < N) { for (i = 0; i < nuid; i++) if (a_uid[i] == uid) break; if (i == nuid) a_uid[nuid++] = uid; } if (ngid < N) { for (i = 0; i < ngid; i++) if (a_gid[i] == gid) break; if (i == ngid) a_gid[ngid++] = gid; } if (nuid >= N && ngid >= N) break; } } if (fp != NULL) fclose(fp); } /* We now have uids and gids in a_uid and a_gid. */ if (cuid >= nuid) cuid = 0; if (cgid >= ngid) cgid = 0; *r_uid = a_uid[cuid++]; *r_gid = a_gid[cgid++]; } /* test36: pathconf() fpathconf() Author: Jan-mark Wams */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test36a, (void)); _PROTOTYPE(void test36b, (void)); _PROTOTYPE(void test36c, (void)); _PROTOTYPE(void test36d, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(int not_provided_option, (int _option)); _PROTOTYPE(int provided_option, (int _option, int _minimum_value)); _PROTOTYPE(int variating_option, (int _option, int _minimum_value)); char *testdirs[] = { "/", "/etc", "/tmp", "/usr", "/usr/bin", ".", NULL }; char *testfiles[] = { "/", "/etc", "/etc/passwd", "/tmp", "/dev/tty", "/usr", "/usr/bin", ".", NULL }; void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 36 "); fflush(stdout); System("rm -rf DIR_36; mkdir DIR_36"); Chdir("DIR_36"); makelongnames(); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test36a(); if (m & 0002) test36b(); if (m & 0004) test36c(); if (m & 0010) test36d(); } quit(); } void test36a() { /* Test normal operation. */ subtest = 1; System("rm -rf ../DIR_36/*"); #ifdef _POSIX_CHOWN_RESTRICTED # if _POSIX_CHOWN_RESTRICTED - 0 == -1 if (not_provided_option(_PC_CHOWN_RESTRICTED) != 0) e(1); # else if (provided_option(_PC_CHOWN_RESTRICTED, 0) != 0) e(2); # endif #else if (variating_option(_PC_CHOWN_RESTRICTED, 0) != 0) e(3); #endif #ifdef _POSIX_NO_TRUNC # if _POSIX_NO_TRUNC - 0 == -1 if (not_provided_option(_PC_NO_TRUNC) != 0) e(4); # else if (provided_option(_PC_NO_TRUNC, 0) != 0) e(5); # endif #else if (variating_option(_PC_NO_TRUNC, 0) != 0) e(6); #endif #ifdef _POSIX_VDISABLE # if _POSIX_VDISABLE - 0 == -1 if (not_provided_option(_PC_VDISABLE) != 0) e(7); # else if (provided_option(_PC_VDISABLE, 0) != 0) e(8); # endif #else if (variating_option(_PC_VDISABLE, 0) != 0) e(9); #endif } void test36b() { subtest = 2; System("rm -rf ../DIR_36/*"); } void test36c() { subtest = 3; System("rm -rf ../DIR_36/*"); } void test36d() { subtest = 4; System("rm -rf ../DIR_36/*"); } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_36"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } int not_provided_option(option) int option; { char **p; for (p = testfiles; *p != (char *) NULL; p++) { if (pathconf(*p, option) != -1) return printf("*p == %s\n", *p), 1; } return 0; } int provided_option(option, minimum) int option, minimum; { char **p; /* These three options are only defined on directorys. */ if (option == _PC_NO_TRUNC || option == _PC_NAME_MAX || option == _PC_PATH_MAX) p = testdirs; else p = testfiles; for (; *p != NULL; p++) { if (pathconf(*p, option) < minimum) return printf("*p == %s\n", *p), 1; } return 0; } int variating_option(option, minimum) int option, minimum; { char **p; /* These three options are only defined on directorys. */ if (option == _PC_NO_TRUNC || option == _PC_NAME_MAX || option == _PC_PATH_MAX) p = testdirs; else p = testfiles; for (; *p != NULL; p++) { if (pathconf(*p, option) < minimum) return printf("*p == %s\n", *p), 1; } return 0; } /* test37: pipe() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 60 #define Fstat(a,b) if (fstat(a,b) != 0) printf("Can't fstat %d\n", a) #define Time(t) if (time(t) == (time_t)-1) printf("Time error\n") int errct = 0; int subtest = 1; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test37a, (void)); _PROTOTYPE(void test37b, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 37 "); fflush(stdout); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test37a(); if (m & 0002) test37b(); } quit(); } void test37a() { /* Test fcntl flags. */ int tube[2], t1[2], t2[2], t3[2]; time_t time1, time2; char buf[128]; struct stat st1, st2; int stat_loc, flags; subtest = 1; /* Check if lowest fds are returned. */ if (pipe(tube) != 0) e(1); if (tube[0] != 3 && tube[1] != 3) e(2); if (tube[1] != 4 && tube[0] != 4) e(3); if (tube[1] == tube[0]) e(4); if (pipe(t1) != 0) e(5); if (t1[0] != 5 && t1[1] != 5) e(6); if (t1[1] != 6 && t1[0] != 6) e(7); if (t1[1] == t1[0]) e(8); if (close(t1[0]) != 0) e(9); if (close(tube[0]) != 0) e(10); if (pipe(t2) != 0) e(11); if (t2[0] != tube[0] && t2[1] != tube[0]) e(12); if (t2[1] != t1[0] && t2[0] != t1[0]) e(13); if (t2[1] == t2[0]) e(14); if (pipe(t3) != 0) e(15); if (t3[0] != 7 && t3[1] != 7) e(16); if (t3[1] != 8 && t3[0] != 8) e(17); if (t3[1] == t3[0]) e(18); if (close(tube[1]) != 0) e(19); if (close(t1[1]) != 0) e(20); if (close(t2[0]) != 0) e(21); if (close(t2[1]) != 0) e(22); if (close(t3[0]) != 0) e(23); if (close(t3[1]) != 0) e(24); /* All time fields should be marked for update. */ Time(&time1); if (pipe(tube) != 0) e(25); Fstat(tube[0], &st1); Fstat(tube[1], &st2); Time(&time2); if (st1.st_atime < time1) e(26); if (st1.st_ctime < time1) e(27); if (st1.st_mtime < time1) e(28); if (st1.st_atime > time2) e(29); if (st1.st_ctime > time2) e(30); if (st1.st_mtime > time2) e(31); if (st2.st_atime < time1) e(32); if (st2.st_ctime < time1) e(33); if (st2.st_mtime < time1) e(34); if (st2.st_atime > time2) e(35); if (st2.st_ctime > time2) e(36); if (st2.st_mtime > time2) e(37); /* Check the file characteristics. */ if ((flags = fcntl(tube[0], F_GETFD)) != 0) e(38); if ((flags & FD_CLOEXEC) != 0) e(39); if ((flags = fcntl(tube[0], F_GETFL)) != 0) e(40); if ((flags & O_RDONLY) != O_RDONLY) e(41); if ((flags & O_NONBLOCK) != 0) e(42); if ((flags & O_RDWR) != 0) e(43); if ((flags & O_WRONLY) != 0) e(44); if ((flags = fcntl(tube[1], F_GETFD)) != 0) e(45); if ((flags & FD_CLOEXEC) != 0) e(46); if ((flags = fcntl(tube[1], F_GETFL)) == -1) e(47); if ((flags & O_WRONLY) != O_WRONLY) e(48); if ((flags & O_NONBLOCK) != 0) e(49); if ((flags & O_RDWR) != 0) e(50); if ((flags & O_RDONLY) != 0) e(51); /* Check if we can read and write. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (close(tube[0]) != 0) e(52); if (write(tube[1], "Hello", 6) != 6) e(53); if (close(tube[1]) != 0) e(54); exit(0); default: if (read(tube[0], buf, sizeof(buf)) != 6) e(55); if (strncmp(buf, "Hello", 6) != 0) e(56); wait(&stat_loc); if (stat_loc != 0) e(57); /* Alarm? */ } if (close(tube[0]) != 0) e(58); if (close(tube[1]) != 0) e(59); } void test37b() { int tube[2], child2parent[2], parent2child[2]; int i, nchild = 0, nopen = 3, stat_loc; int fd; int forkfailed = 0; char c; subtest = 2; /* Take all the pipes we can get. */ while (nopen < OPEN_MAX - 2) { if (pipe(tube) != 0) { /* We have not reached OPEN_MAX yet, so we have ENFILE. */ if (errno != ENFILE) e(1); sleep(2); /* Wait for others to (maybe) closefiles. */ break; } nopen += 2; } if (nopen < OPEN_MAX - 2) { if (pipe(tube) != -1) e(2); switch (errno) { case EMFILE: /* Errno value is ok. */ break; case ENFILE: /* No process can open files any more. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (open("/", O_RDONLY) != -1) e(3); if (errno != ENFILE) e(4); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(5); /* Alarm? */ } break; default: /* Wrong value for errno. */ e(6); } } /* Close all but stdin,out,err. */ for (i = 3; i < OPEN_MAX; i++) (void) close(i); /* ENFILE test. Have children each grab OPEN_MAX fds. */ if (pipe(child2parent) != 0) e(7); if (pipe(parent2child) != 0) e(8); while (!forkfailed && (fd = open("/", O_RDONLY)) != -1) { close(fd); switch (fork()) { case -1: forkfailed = 1; break; case 0: alarm(60); /* Grab all the fds. */ while (pipe(tube) != -1); while (open("/", O_RDONLY) != -1); /* Signal parent OPEN_MAX fds gone. */ if (write(child2parent[1], "*", 1) != 1) e(9); /* Wait for parent befor freeing all the fds. */ if (read(parent2child[0], &c, 1) != 1) e(10); exit(0); default: /* Wait for child to grab OPEN_MAX fds. */ if (read(child2parent[0], &c, 1) != 1) e(11); nchild++; break; } } if (!forkfailed) { if (pipe(tube) != -1) e(12); if (errno != ENFILE) e(13); } /* Signal children to die and wait for it. */ while (nchild-- > 0) { if (write(parent2child[1], "*", 1) != 1) e(14); wait(&stat_loc); if (stat_loc != 0) e(15); /* Alarm? */ } /* Close all but stdin,out,err. */ for (i = 3; i < OPEN_MAX; i++) (void) close(i); } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test38: dup() dup2() Author: Jan-Mark Wams (jms@cs.vu.nl) */ /* The definition of ``dup2()'' is realy a big mess! For: ** ** (1) if fildes2 is less than zero or greater than {OPEN_MAX} ** errno has to set to [EBADF]. But if fildes2 equals {OPEN_MAX} ** errno has to be set to [EINVAL]. And ``fcntl(F_DUPFD...)'' always ** returns [EINVAL] if fildes2 is out of range! ** ** (2) if the number of file descriptors would exceed {OPEN_MAX}, or no ** file descriptors above fildes2 are available, errno has to be set ** to [EMFILE]. But this can never occur! */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define IS_CLOEXEC(fd) ((fcntl(fd, F_GETFD) & FD_CLOEXEC) == FD_CLOEXEC) #define SET_CLOEXEC(fd) fcntl(fd, F_SETFD, FD_CLOEXEC) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test38a, (void)); _PROTOTYPE(void test38b, (void)); _PROTOTYPE(void test38c, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 38 "); fflush(stdout); System("rm -rf DIR_38; mkdir DIR_38"); Chdir("DIR_38"); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test38a(); if (m & 0002) test38b(); if (m & 0004) test38c(); } quit(); } void test38a() { int fd1, fd2, fd3, fd4, fd5; struct flock flock; subtest = 1; /* Basic checking. */ if ((fd1 = dup(0)) != 3) e(1); if ((fd2 = dup(0)) != 4) e(2); if ((fd3 = dup(0)) != 5) e(3); if ((fd4 = dup(0)) != 6) e(4); if ((fd5 = dup(0)) != 7) e(5); if (close(fd2) != 0) e(6); if (close(fd4) != 0) e(7); if ((fd2 = dup(0)) != 4) e(8); if ((fd4 = dup(0)) != 6) e(9); if (close(fd1) != 0) e(10); if (close(fd3) != 0) e(11); if (close(fd5) != 0) e(12); if ((fd1 = dup(0)) != 3) e(13); if ((fd3 = dup(0)) != 5) e(14); if ((fd5 = dup(0)) != 7) e(15); if (close(fd1) != 0) e(16); if (close(fd2) != 0) e(17); if (close(fd3) != 0) e(18); if (close(fd4) != 0) e(19); if (close(fd5) != 0) e(20); /* FD_CLOEXEC should be cleared. */ if ((fd1 = dup(0)) != 3) e(21); if (SET_CLOEXEC(fd1) == -1) e(22); if (!IS_CLOEXEC(fd1)) e(23); if ((fd2 = dup(fd1)) != 4) e(24); if ((fd3 = dup(fd2)) != 5) e(25); if (IS_CLOEXEC(fd2)) e(26); if (IS_CLOEXEC(fd3)) e(27); if (SET_CLOEXEC(fd2) == -1) e(28); if (!IS_CLOEXEC(fd2)) e(29); if (IS_CLOEXEC(fd3)) e(30); if (close(fd1) != 0) e(31); if (close(fd2) != 0) e(32); if (close(fd3) != 0) e(33); /* Locks should be shared, so we can lock again. */ System("echo 'Hallo' > file"); if ((fd1 = open("file", O_RDWR)) != 3) e(34); flock.l_whence = SEEK_SET; flock.l_start = 0; flock.l_len = 10; flock.l_type = F_WRLCK; if (fcntl(fd1, F_SETLK, &flock) == -1) e(35); if (fcntl(fd1, F_SETLK, &flock) == -1) e(36); if ((fd2 = dup(fd1)) != 4) e(37); if (fcntl(fd1, F_SETLK, &flock) == -1) e(38); if (fcntl(fd1, F_GETLK, &flock) == -1) e(39); #if 0 /* XXX - see test7.c */ if (flock.l_type != F_WRLCK) e(40); if (flock.l_pid != getpid()) e(41); #endif /* 0 */ flock.l_type = F_WRLCK; if (fcntl(fd2, F_GETLK, &flock) == -1) e(42); #if 0 /* XXX - see test7.c */ if (flock.l_type != F_WRLCK) e(43); if (flock.l_pid != getpid()) e(44); #endif /* 0 */ if (close(fd1) != 0) e(45); if (close(fd2) != 0) e(46); System("rm -rf ../DIR_38/*"); } void test38b() { int fd; char buf[32]; subtest = 2; /* Test file called ``file''. */ System("echo 'Hallo!' > file"); /* Check dup2() call with the same fds. Should have no effect. */ if ((fd = open("file", O_RDONLY)) != 3) e(1); if (read(fd, buf, 2) != 2) e(2); if (strncmp(buf, "Ha", 2) != 0) e(3); if (dup2(fd, fd) != fd) e(4); if (read(fd, buf, 2) != 2) e(5); if (strncmp(buf, "ll", 2) != 0) e(6); if (dup2(fd, fd) != fd) e(7); if (read(fd, buf, 2) != 2) e(8); if (strncmp(buf, "o!", 2) != 0) e(9); if (close(fd) != 0) e(10); /* If dup2() call fails, the fildes2 argument has to stay open. */ if ((fd = open("file", O_RDONLY)) != 3) e(11); if (read(fd, buf, 2) != 2) e(12); if (strncmp(buf, "Ha", 2) != 0) e(13); if (dup2(OPEN_MAX + 3, fd) != -1) e(14); if (errno != EBADF) e(15); if (read(fd, buf, 2) != 2) e(16); if (strncmp(buf, "ll", 2) != 0) e(17); if (dup2(-4, fd) != -1) e(18); if (errno != EBADF) e(19); if (read(fd, buf, 2) != 2) e(20); if (strncmp(buf, "o!", 2) != 0) e(21); if (close(fd) != 0) e(22); System("rm -rf ../DIR_38/*"); } void test38c() { int i; subtest = 3; /* Check bad arguments to dup() and dup2(). */ for (i = -OPEN_MAX; i < OPEN_MAX * 2; i++) { /* ``i'' is a valid and open fd. */ if (i >= 0 && i < 3) continue; /* If ``i'' is a valid fd it is not open. */ if (dup(i) != -1) e(1); if (errno != EBADF) e(2); /* ``i'' Is OPEN_MAX. */ if (i == OPEN_MAX) { if (dup2(0, i) != -1) e(3); if (errno != EINVAL) e(4); } /* ``i'' Is out of range. */ if (i < 0 || i > OPEN_MAX) { if (dup2(0, i) != -1) e(5); if (errno != EBADF) e(6); } } System("rm -rf ../DIR_38/*"); } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_38"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test39: fcntl() Author: Jan-Mark Wams (jms@cs.vu.nl) */ /* Some things have to be checked for ``exec()'' call's. Therefor ** there is a check routine called ``do_check()'' that will be ** called if the first argument (``argv[0]'') equals ``DO CHECK.'' ** Note that there is no way the shell (``/bin/sh'') will set ** ``argv[0]'' to this funny value. (Unless we rename ``test39'' ** to ``DO CHECK'' ;-) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) int errct = 0; int subtest = 1; int superuser; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test39a, (void)); _PROTOTYPE(void test39b, (void)); _PROTOTYPE(void test39c, (void)); _PROTOTYPE(void test39d, (void)); _PROTOTYPE(int do_check, (void)); _PROTOTYPE(void makelongnames, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); char executable[1024]; void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); /* If we have to check things, call do_check(). */ if (strcmp(argv[0], "DO CHECK") == 0) exit(do_check()); /* Get the path of the executable. */ strcpy(executable, "../"); strcat(executable, argv[0]); printf("Test 39 "); fflush(stdout); System("rm -rf DIR_39; mkdir DIR_39"); Chdir("DIR_39"); makelongnames(); superuser = (geteuid() == 0); for (i = 0; i < ITERATIONS; i++) { test39a(); test39b(); test39c(); test39d(); } quit(); } void test39a() { /* Test normal operation. */ subtest = 1; System("rm -rf ../DIR_39/*"); } void test39b() { subtest = 2; System("rm -rf ../DIR_39/*"); } void test39c() { subtest = 3; System("rm -rf ../DIR_39/*"); } /* Open fds 3, 4, 5 and 6. Set FD_CLOEXEC on 5 and 6. Exclusively lock the ** first 10 bytes of fd no. 3. Shared lock fd no. 7. Lock fd no. 8 after ** the fork. Do a ``exec()'' call with a funny argv[0] and check the return ** value. */ void test39d() { /* Test locks with ``fork()'' and ``exec().'' */ int fd3, fd4, fd5, fd6, fd7, fd8; int stat_loc; int do_check_retval; char *argv[2]; struct flock fl; subtest = 4; argv[0] = "DO CHECK"; argv[1] = (char *) NULL; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 10; /* Make a dummy files and open them. */ System("echo 'Great Balls Of Fire!' > file3"); System("echo 'Great Balls Of Fire!' > file4"); System("echo 'Great Balls Of Fire!' > file7"); System("echo 'Great Balls Of Fire!' > file8"); System("echo 'Great Balls Of Fire!' > file"); if ((fd3 = open("file3", O_RDWR)) != 3) e(1); if ((fd4 = open("file4", O_RDWR)) != 4) e(2); if ((fd5 = open("file", O_RDWR)) != 5) e(3); if ((fd6 = open("file", O_RDWR)) != 6) e(4); if ((fd7 = open("file7", O_RDWR)) != 7) e(5); if ((fd8 = open("file8", O_RDWR)) != 8) e(6); /* Set FD_CLOEXEC flags on fd5 and fd6. */ if (fcntl(fd5, F_SETFD, FD_CLOEXEC) == -1) e(7); if (fcntl(fd6, F_SETFD, FD_CLOEXEC) == -1) e(8); /* Lock the first ten bytes from fd3 (for writing). */ fl.l_type = F_WRLCK; if (fcntl(fd3, F_SETLK, &fl) == -1) e(9); /* Lock (for reading) fd7. */ fl.l_type = F_RDLCK; if (fcntl(fd7, F_SETLK, &fl) == -1) e(10); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Lock fd8. */ fl.l_type = F_WRLCK; if (fcntl(fd8, F_SETLK, &fl) == -1) e(11); /* Check the lock on fd3 and fd7. */ fl.l_type = F_WRLCK; if (fcntl(fd3, F_GETLK, &fl) == -1) e(12); if (fl.l_type != F_WRLCK) e(13); if (fl.l_pid != getppid()) e(14); fl.l_type = F_WRLCK; if (fcntl(fd7, F_GETLK, &fl) == -1) e(15); if (fl.l_type != F_RDLCK) e(16); if (fl.l_pid != getppid()) e(17); /* Check FD_CLOEXEC flags. */ if ((fcntl(fd3, F_GETFD) & FD_CLOEXEC) != 0) e(18); if ((fcntl(fd4, F_GETFD) & FD_CLOEXEC) != 0) e(19); if ((fcntl(fd5, F_GETFD) & FD_CLOEXEC) != FD_CLOEXEC) e(20); if ((fcntl(fd6, F_GETFD) & FD_CLOEXEC) != FD_CLOEXEC) e(21); if ((fcntl(fd7, F_GETFD) & FD_CLOEXEC) != 0) e(22); if ((fcntl(fd8, F_GETFD) & FD_CLOEXEC) != 0) e(23); execlp(executable + 3, "DO CHECK", (char *) NULL); execlp(executable, "DO CHECK", (char *) NULL); printf("Can't exec %s or %s\n", executable + 3, executable); exit(0); default: wait(&stat_loc); if (WIFSIGNALED(stat_loc)) e(24); /* Alarm? */ if (WIFEXITED(stat_loc) == 0) { errct=10000; quit(); } } /* Check the return value of do_check(). */ do_check_retval = WEXITSTATUS(stat_loc); if ((do_check_retval & 0x11) == 0x11) e(25); if ((do_check_retval & 0x12) == 0x12) e(26); if ((do_check_retval & 0x14) == 0x14) e(27); if ((do_check_retval & 0x18) == 0x18) e(28); if ((do_check_retval & 0x21) == 0x21) e(29); if ((do_check_retval & 0x22) == 0x22) e(30); if ((do_check_retval & 0x24) == 0x24) e(31); if ((do_check_retval & 0x28) == 0x28) e(32); if ((do_check_retval & 0x41) == 0x41) e(33); if ((do_check_retval & 0x42) == 0x42) e(34); if ((do_check_retval & 0x44) == 0x44) e(35); if ((do_check_retval & 0x48) == 0x48) e(36); if ((do_check_retval & 0x81) == 0x81) e(37); if ((do_check_retval & 0x82) == 0x82) e(38); if ((do_check_retval & 0x84) == 0x84) e(39); if ((do_check_retval & 0x88) == 0x88) e(40); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); /* Lock fd8. */ fl.l_type = F_WRLCK; if (fcntl(fd8, F_SETLK, &fl) == -1) e(41); execvp(executable + 3, argv); execvp(executable, argv); printf("Can't exec %s or %s\n", executable + 3, executable); exit(0); default: wait(&stat_loc); if (WIFSIGNALED(stat_loc)) e(48); /* Alarm? */ } /* Check the return value of do_check(). */ do_check_retval = WEXITSTATUS(stat_loc); if ((do_check_retval & 0x11) == 0x11) e(49); if ((do_check_retval & 0x12) == 0x12) e(50); if ((do_check_retval & 0x14) == 0x14) e(51); if ((do_check_retval & 0x18) == 0x18) e(52); if ((do_check_retval & 0x21) == 0x21) e(53); if ((do_check_retval & 0x22) == 0x22) e(54); if ((do_check_retval & 0x24) == 0x24) e(55); if ((do_check_retval & 0x28) == 0x28) e(56); if ((do_check_retval & 0x41) == 0x41) e(57); if ((do_check_retval & 0x42) == 0x42) e(58); if ((do_check_retval & 0x44) == 0x44) e(59); if ((do_check_retval & 0x48) == 0x48) e(60); if ((do_check_retval & 0x81) == 0x81) e(61); if ((do_check_retval & 0x82) == 0x82) e(62); if ((do_check_retval & 0x84) == 0x84) e(63); if ((do_check_retval & 0x88) == 0x88) e(64); fl.l_type = F_UNLCK; if (fcntl(fd3, F_SETLK, &fl) == -1) e(65); if (fcntl(fd7, F_SETLK, &fl) == -1) e(66); if (close(fd3) != 0) e(67); if (close(fd4) != 0) e(68); if (close(fd5) != 0) e(69); if (close(fd6) != 0) e(70); if (close(fd7) != 0) e(71); if (close(fd8) != 0) e(72); System("rm -f ../DIR_39/*\n"); } /* This routine checks that fds 0 through 4, 7 and 8 are open and the rest ** is closed. It also checks if we can lock the first 10 bytes on fd no. 3 ** and 4. It should not be possible to lock fd no. 3, but it should be ** possible to lock fd no. 4. See ``test39d()'' for usage of this routine. */ int do_check() { int i; int retval = 0; struct flock fl; fl.l_whence = SEEK_SET; fl.l_start = 0; fl.l_len = 10; /* All std.. are open. */ if (fcntl(0, F_GETFD) == -1) retval |= 0x11; if (fcntl(1, F_GETFD) == -1) retval |= 0x11; if (fcntl(2, F_GETFD) == -1) retval |= 0x11; /* Fd no. 3, 4, 7 and 8 are open. */ if (fcntl(3, F_GETFD) == -1) retval |= 0x12; if (fcntl(4, F_GETFD) == -1) retval |= 0x12; if (fcntl(7, F_GETFD) == -1) retval |= 0x12;n6p6q6r6s6 /* Fd no. 5, 6 and 9 trough OPEN_MAX are closed. */ if (fcntl(5, F_GETFD) != -1) retval |= 0x14; if (fcntl(6, F_GETFD) != -1) retval |= 0x14; for (i = 9; i < OPEN_MAX; i++) if (fcntl(i, F_GETFD) != -1) retval |= 0x18; #if 0 /* Fd no. 3 is WRLCKed. */ fl.l_type = F_WRLCK; if (fcntl(3, F_SETLK, &fl) != -1) retval |= 0x21; if (errno != EACCES && errno != EAGAIN) retval |= 0x22; fl.l_type = F_RDLCK; if (fcntl(3, F_SETLK, &fl) != -1) retval |= 0x24; if (errno != EACCES && errno != EAGAIN) retval |= 0x22; fl.l_type = F_RDLCK; if (fcntl(3, F_GETLK, &fl) == -1) retval |= 0x28; if (fl.l_type != F_WRLCK) retval |= 0x28; if (fl.l_pid != getpid()) retval |= 0x28; fl.l_type = F_WRLCK; if (fcntl(3, F_GETLK, &fl) == -1) retval |= 0x28; if (fl.l_type != F_WRLCK) retval |= 0x28; if (fl.l_pid != getpid()) retval |= 0x28; #endif /* Fd no. 4 is not locked. */ fl.l_type = F_WRLCK; if (fcntl(4, F_SETLK, &fl) == -1) retval |= 0x41; if (fcntl(4, F_GETLK, &fl) == -1) retval |= 0x42; #if 0 /* XXX - see test7.c */ if (fl.l_type != F_WRLCK) retval |= 0x42; if (fl.l_pid != getpid()) retval |= 0x42; #endif /* 0 */ /* Fd no. 8 is locked after the fork, it is ours. */ fl.l_type = F_WRLCK; if (fcntl(8, F_SETLK, &fl) == -1) retval |= 0x44; if (fcntl(8, F_GETLK, &fl) == -1) retval |= 0x48; #if 0 /* XXX - see test7.c */ if (fl.l_type != F_WRLCK) retval |= 0x48; if (fl.l_pid != getpid()) retval |= 0x48; #endif /* 0 */ #if 0 /* Fd no. 7 is RDLCKed. */ fl.l_type = F_WRLCK; if (fcntl(7, F_SETLK, &fl) != -1) retval |= 0x81; if (errno != EACCES && errno != EAGAIN) retval |= 0x82; fl.l_type = F_RDLCK; if (fcntl(7, F_SETLK, &fl) == -1) retval |= 0x84; fl.l_type = F_RDLCK; if (fcntl(7, F_GETLK, &fl) == -1) retval |= 0x88; if (fl.l_type != F_UNLCK) retval |= 0x88; fl.l_type = F_WRLCK; if (fcntl(7, F_GETLK, &fl) == -1) retval |= 0x88; if (fl.l_type != F_RDLCK) retval |= 0x88; if (fl.l_pid != getppid()) retval |= 0x88; #endif return retval; } void makelongnames() { register int i; memset(MaxName, 'a', NAME_MAX); MaxName[NAME_MAX] = '\0'; for (i = 0; i < PATH_MAX - 1; i++) { /* idem path */ MaxPath[i++] = '.'; MaxPath[i] = '/'; } MaxPath[PATH_MAX - 1] = '\0'; strcpy(ToLongName, MaxName); /* copy them Max to ToLong */ strcpy(ToLongPath, MaxPath); ToLongName[NAME_MAX] = 'a'; ToLongName[NAME_MAX + 1] = '\0'; /* extend ToLongName by one too many */ ToLongPath[PATH_MAX - 1] = '/'; ToLongPath[PATH_MAX] = '\0'; /* inc ToLongPath by one */ } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_39"); if (errct == 0) { printf("ok\n"); exit(0); } else if (errct < 10000) { printf("%d errors\n", errct); exit(1); } else { printf("errors\n"); exit(2); } } /* test 4 */ #include #include #include #include #include #include #include pid_t pid0, pid1, pid2, pid3; int s, i, fd, nextb, errct = 0; char *tempfile = "test4.temp"; char buf[1024]; _PROTOTYPE(int main, (void)); _PROTOTYPE(void subr, (void)); _PROTOTYPE(void nofork, (void)); _PROTOTYPE(void quit, (void)); int main() { int k; printf("Test 4 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_04; mkdir DIR_04"); chdir("DIR_04"); creat(tempfile, 0777); for (k = 0; k < 20; k++) { subr(); } unlink(tempfile); quit(); return(-1); /* impossible */ } void subr() { if ( (pid0 = fork()) != 0) { /* Parent 0 */ if (pid0 < 0) nofork(); if ( (pid1 = fork()) != 0) { /* Parent 1 */ if (pid1 < 0) nofork(); if ( (pid2 = fork()) != 0) { /* Parent 2 */ if (pid2 < 0) nofork(); if ( (pid3 = fork()) != 0) { /* Parent 3 */ if (pid3 < 0) nofork(); for (i = 0; i < 10000; i++); kill(pid2, 9); kill(pid1, 9); kill(pid0, 9); wait(&s); wait(&s); wait(&s); wait(&s); } else { fd = open(tempfile, O_RDONLY); lseek(fd, 20480L * nextb, 0); for (i = 0; i < 10; i++) read(fd, buf, 1024); nextb++; close(fd); exit(0); } } else { while (1) getpid(); } } else { while (1) getpid(); } } else { while (1) getpid(); } } void nofork() { printf("Fork failed. Not enough memory.\n"); exit(1); } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test40: lseek() Author: Jan-Mark Wams (jms@cs.vu.nl) */ #include #include #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 #define ITERATIONS 10 #define System(cmd) if (system(cmd) != 0) printf("``%s'' failed\n", cmd) #define Chdir(dir) if (chdir(dir) != 0) printf("Can't goto %s\n", dir) #define Stat(a,b) if (stat(a,b) != 0) printf("Can't stat %s\n", a) #define Mkfifo(f) if (mkfifo(f,0777)!=0) printf("Can't make fifo %s\n", f) int errct = 0; int subtest = 1; char MaxName[NAME_MAX + 1]; /* Name of maximum length */ char MaxPath[PATH_MAX]; /* Same for path */ char ToLongName[NAME_MAX + 2]; /* Name of maximum +1 length */ char ToLongPath[PATH_MAX + 1]; /* Same for path, both too long */ _PROTOTYPE(void main, (int argc, char *argv[])); _PROTOTYPE(void test40a, (void)); _PROTOTYPE(void test40b, (void)); _PROTOTYPE(void test40c, (void)); _PROTOTYPE(void e, (int number)); _PROTOTYPE(void quit, (void)); void main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 40 "); fflush(stdout); System("rm -rf DIR_40; mkdir DIR_40"); Chdir("DIR_40"); for (i = 0; i < 10; i++) { if (m & 0001) test40a(); if (m & 0002) test40b(); if (m & 0004) test40c(); } quit(); } void test40a() { /* Test normal operation. */ int fd; char buf[20]; int i, j; struct stat st; subtest = 1; System("rm -rf ../DIR_40/*"); System("echo -n hihaho > hihaho"); if ((fd = open("hihaho", O_RDONLY)) != 3) e(1); if (lseek(fd, (off_t) 3, SEEK_SET) != (off_t) 3) e(2); if (read(fd, buf, 1) != 1) e(3); if (buf[0] != 'a') e(4); if (lseek(fd, (off_t) - 1, SEEK_END) != 5) e(5); if (read(fd, buf, 1) != 1) e(6); if (buf[0] != 'o') e(7); /* Seek past end of file. */ if (lseek(fd, (off_t) 1000, SEEK_END) != 1006) e(8); if (read(fd, buf, 1) != 0) e(9); /* Lseek() should not extend the file. */ if (fstat(fd, &st) != 0) e(10); if (st.st_size != (off_t) 6) e(11); if (close(fd) != 0) e(12); /* Probeer lseek met write. */ if ((fd = open("hihaho", O_WRONLY)) != 3) e(13); if (lseek(fd, (off_t) 3, SEEK_SET) != (off_t) 3) e(14); if (write(fd, "e", 1) != 1) e(15); if (lseek(fd, (off_t) 1000, SEEK_END) != 1006) e(16); /* Lseek() should not extend the file. */ if (fstat(fd, &st) != 0) e(17); if (st.st_size != (off_t) 6) e(18); if (write(fd, "e", 1) != 1) e(19); /* Lseek() and a subsequent write should! */ if (fstat(fd, &st) != 0) e(20); if (st.st_size != (off_t) 1007) e(21); if (close(fd) != 0) e(22); /* Check the file, it should start with hiheho. */ if ((fd = open("hihaho", O_RDONLY)) != 3) e(23); if (read(fd, buf, 6) != 6) e(24); if (strncmp(buf, "hiheho", 6) != 0) e(25); /* The should be zero bytes and a trailing ``e''. */ if (sizeof(buf) < 10) e(26); for (i = 1; i <= 20; i++) { if (read(fd, buf, 10) != 10) e(27); for (j = 0; j < 10; j++) if (buf[j] != '\0') break; if (j != 10) e(28); if (lseek(fd, (off_t) 15, SEEK_CUR) != (off_t) i * 25 + 6) e(29); } if (lseek(fd, (off_t) 1006, SEEK_SET) != (off_t) 1006) e(30); if (read(fd, buf, sizeof(buf)) != 1) e(31); if (buf[0] != 'e') e(32); if (lseek(fd, (off_t) - 1, SEEK_END) != (off_t) 1006) e(33); if (read(fd, buf, sizeof(buf)) != 1) e(34); if (buf[0] != 'e') e(35); /* Closing time. */ if (close(fd) != 0) e(36); } void test40b() { int fd1, fd2, fd3; int stat_loc; subtest = 2; System("rm -rf ../DIR_40/*"); /* See if childs lseek() is effecting the parent. * See also if * lseeking() on same file messes things up. */ /* Creat a file of 11 bytes. */ if ((fd1 = open("santa", O_WRONLY | O_CREAT, 0777)) != 3) e(1); if (write(fd1, "ho ho ho ho", 11) != 11) e(2); if (close(fd1) != 0) e(3); /* Open it multiple times. */ if ((fd1 = open("santa", O_RDONLY)) != 3) e(4); if ((fd2 = open("santa", O_WRONLY)) != 4) e(5); if ((fd3 = open("santa", O_RDWR)) != 5) e(6); /* Set all offsets different. */ if (lseek(fd1, (off_t) 2, SEEK_SET) != 2) e(7); if (lseek(fd2, (off_t) 4, SEEK_SET) != 4) e(8); if (lseek(fd3, (off_t) 7, SEEK_SET) != 7) e(9); /* Have a child process do additional offset changes. */ switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(20); if (lseek(fd1, (off_t) 1, SEEK_CUR) != 3) e(10); if (lseek(fd2, (off_t) 5, SEEK_SET) != 5) e(11); if (lseek(fd3, (off_t) - 4, SEEK_END) != 7) e(12); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(13); /* Alarm? */ } /* Check if the new offsets are correct. */ if (lseek(fd1, (off_t) 0, SEEK_CUR) != 3) e(14); if (lseek(fd2, (off_t) 0, SEEK_CUR) != 5) e(15); if (lseek(fd3, (off_t) 0, SEEK_CUR) != 7) e(16); /* Close the file. */ if (close(fd1) != 0) e(17); if (close(fd2) != 0) e(18); if (close(fd3) != 0) e(19); } void test40c() { /* Test error returns. */ int fd; int tube[2]; int i, stat_loc; subtest = 3; System("rm -rf ../DIR_40/*"); /* Fifo's can't be lseeked(). */ Mkfifo("fifo"); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(3); /* Try for max 3 secs. */ if ((fd = open("fifo", O_RDONLY)) != 3) e(1); if (lseek(fd, (off_t) 0, SEEK_SET) != (off_t) - 1) e(2); if (errno != ESPIPE) e(3); if (close(fd) != 0) e(4); exit(0); default: if ((fd = open("fifo", O_WRONLY)) != 3) e(5); wait(&stat_loc); if (stat_loc != 0) e(6);/* Alarm? */ if (close(fd) != 0) e(7); } /* Pipes can't be lseeked() eigther. */ if (pipe(tube) != 0) e(8); switch (fork()) { case -1: printf("Can't fork\n"); break; case 0: alarm(3); /* Max 3 sconds wait. */ if (lseek(tube[0], (off_t) 0, SEEK_SET) != (off_t) - 1) e(9); if (errno != ESPIPE) e(10); if (lseek(tube[1], (off_t) 0, SEEK_SET) != (off_t) - 1) e(11); if (errno != ESPIPE) e(12); exit(0); default: wait(&stat_loc); if (stat_loc != 0) e(14); /* Alarm? */ } /* Close the pipe. */ if (close(tube[0]) != 0) e(15); if (close(tube[1]) != 0) e(16); /* Whence arument invalid. */ System("echo -n contact > file"); if ((fd = open("file", O_RDWR)) != 3) e(17); for (i = -1000; i < 1000; i++) { if (i == SEEK_SET || i == SEEK_END || i == SEEK_CUR) continue; if (lseek(fd, (off_t) 0, i) != (off_t) -1) e(18); if (errno != EINVAL) e(19); } if (close(fd) != 0) e(20); /* EBADF for bad fides. */ for (i = -1000; i < 1000; i++) { if (i >= 0 && i < OPEN_MAX) continue; if (lseek(i, (off_t) 0, SEEK_SET) != (off_t) - 1) e(21); if (lseek(i, (off_t) 0, SEEK_END) != (off_t) - 1) e(22); if (lseek(i, (off_t) 0, SEEK_CUR) != (off_t) - 1) e(23); } } void e(n) int n; { int err_num = errno; /* Save in case printf clobbers it. */ printf("Subtest %d, error %d errno=%d: ", subtest, n, errno); errno = err_num; perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } errno = 0; } void quit() { Chdir(".."); System("rm -rf DIR_40"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } }6/* test 5 */ #include #include #include #include #include #include #include #include #define ITERATIONS 2 #define MAX_ERROR 4 int errct; int subtest; int zero[1024]; int sigmap[5] = {9, 10, 11}; _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(void test5a, (void)); _PROTOTYPE(void parent, (int childpid)); _PROTOTYPE(void child, (int parpid)); _PROTOTYPE(void func1, (int s)); _PROTOTYPE(void func8, (int s)); _PROTOTYPE(void func10, (int s)); _PROTOTYPE(void func11, (int s)); _PROTOTYPE(void test5b, (void)); _PROTOTYPE(void test5c, (void)); _PROTOTYPE(void test5d, (void)); _PROTOTYPE(void test5e, (void)); _PROTOTYPE(void test5f, (void)); _PROTOTYPE(void test5g, (void)); _PROTOTYPE(void funcalrm, (int s)); _PROTOTYPE(void test5h, (void)); _PROTOTYPE(void test5i, (void)); _PROTOTYPE(void ex, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); #ifdef _ANSI void (*Signal(int _sig, void (*_func)(int)))(int); #define SIG_ZERO ((void (*)(int))0) /* default signal handling */ #else sighandler_t Signal(); /* void (*Signal()) (); */ #define SIG_ZERO ((void (*)())0) /* default signal handling */ #endif _VOLATILE int childsigs, parsigs, alarms; int main(argc, argv) int argc; char *argv[]; { int i, m = 0x7777; printf("Test 5 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_05; mkdir DIR_05"); chdir("DIR_05"); for (i = 0; i < ITERATIONS; i++) { if (m & 0001) test5a(); if (m & 0002) test5b(); if (m & 0004) test5c(); if (m & 0010) test5d(); if (m & 0020) test5e(); if (m & 0040) test5f(); if (m & 0100) test5g(); if (m & 0200) test5h(); if (m & 0400) test5i(); } quit(); return(-1); /* impossible */ } void test5a() { int parpid, childpid, flag, *zp; subtest = 0; flag = 0; for (zp = &zero[0]; zp < &zero[1024]; zp++) if (*zp != 0) flag = 1; if (flag) e(0); /* check if bss is cleared to 0 */ if (Signal(1, func1) == SIG_ERR) e(1); if (Signal(10, func10) < SIG_ZERO) e(2); parpid = getpid(); if (childpid = fork()) { if (childpid < 0) ex(); parent(childpid); } else { child(parpid); } if (Signal(1, SIG_DFL) < SIG_ZERO) e(4); if (Signal(10, SIG_DFL) < SIG_ZERO) e(5); } void parent(childpid) int childpid; { int i, pid; for (i = 0; i < 3; i++) { if (kill(childpid, 1) < 0) e(6); while (parsigs == 0); parsigs--; } if ( (pid = wait(&i)) < 0) e(7); if (i != 256 * 6) e(8); } void child(parpid) int parpid; { int i; for (i = 0; i < 3; i++) { while (childsigs == 0); childsigs--; if (kill(parpid, 10) < 0) e(9); } exit(6); } void func1(s) int s; /* for ANSI */ { if (Signal(1, func1) < SIG_ZERO) e(10); childsigs++; } void func8(s) int s; { } void func10(s) int s; /* for ANSI */ { if (Signal(10, func10) < SIG_ZERO) e(11); parsigs++; } void func11(s) int s; /* for ANSI */ { e(38); } void test5b() { int cpid, n, pid; subtest = 1; if ((pid = fork())) { if (pid < 0) ex(); if ((pid = fork())) { if (pid < 0) ex(); if (cpid = fork()) { if (cpid < 0) ex(); if (kill(cpid, 9) < 0) e(12); if (wait(&n) < 0) e(13); if (wait(&n) < 0) e(14); if (wait(&n) < 0) e(15); } else { pause(); while (1); } } else { exit(0); } } else { exit(0); } } void test5c() { int n, i, pid, wpid; /* Test exit status codes for processes killed by signals. */ subtest = 3; for (i = 0; i < 2; i++) { if (pid = fork()) { if (pid < 0) ex(); sleep(2); /* wait for child to pause */ if (kill(pid, sigmap[i]) < 0) { e(20); exit(1); } if ((wpid = wait(&n)) < 0) e(21); if ((n & 077) != sigmap[i]) e(22); if (pid != wpid) e(23); } else { pause(); exit(0); } } } void test5d() { /* Test alarm */ int i; subtest = 4; alarms = 0; for (i = 0; i < 8; i++) { Signal(SIGALRM, funcalrm); alarm(1); pause(); if (alarms != i + 1) e(24); } } void test5e() { /* When a signal knocks a processes out of WAIT or PAUSE, it is supposed to * get EINTR as error status. Check that. */ int n, j; subtest = 5; if (Signal(8, func8) < SIG_ZERO) e(25); if (n = fork()) { /* Parent must delay to give child a chance to pause. */ if (n < 0) ex(); sleep(1); if (kill(n, 8) < 0) e(26); if (wait(&n) < 0) e(27); if (Signal(8, SIG_DFL) < SIG_ZERO) e(28); } else { j = pause(); if (errno != EINTR && -errno != EINTR) e(29); exit(0); } } void test5f() { int i, j, k, n; subtest = 6; if (getuid() != 0) return; n = fork(); if (n < 0) ex(); if (n) { wait(&i); i = (i >> 8) & 0377; if (i != (n & 0377)) e(30); } else { i = getgid(); j = getegid(); k = (i + j + 7) & 0377; if (setgid(k) < 0) e(31); if (getgid() != k) e(32); if (getegid() != k) e(33); i = getuid(); j = geteuid(); k = (i + j + 1) & 0377; if (setuid(k) < 0) e(34); if (getuid() != k) e(35); if (geteuid() != k) e(36); i = getpid() & 0377; if (wait(&j) != -1) e(37); exit(i); } } void test5g() { int n; subtest = 7; Signal(11, func11); Signal(11, SIG_IGN); n = getpid(); if (kill(n, 11) != 0) e(1); Signal(11, SIG_DFL); } void funcalrm(s) int s; /* for ANSI */ { alarms++; } void test5h() { /* When a signal knocks a processes out of PIPE, it is supposed to * get EINTR as error status. Check that. */ int n, j, fd[2]; subtest = 8; unlink("XXX.test5"); if (Signal(8, func8) < SIG_ZERO) e(1); pipe(fd); if (n = fork()) { /* Parent must delay to give child a chance to pause. */ if (n < 0) ex(); while (access("XXX.test5", 0) != 0) /* just wait */ ; sleep(1); unlink("XXX.test5"); if (kill(n, 8) < 0) e(2); if (wait(&n) < 0) e(3); if (Signal(8, SIG_DFL) < SIG_ZERO) e(4); if (close(fd[0]) != 0) e(5); if (close(fd[1]) != 0) e(6); } else { if (creat("XXX.test5", 0777) < 0) e(7); j = read(fd[0], (char *) &n, 1); if (errno != EINTR) e(8); exit(0); } } void test5i() { int fd[2], pid, buf[10], n; subtest = 9; pipe(fd); unlink("XXXxxxXXX"); if ( (pid = fork())) { /* Parent */ /* Wait until child has started and has created the XXXxxxXXX file. */ while (access("XXXxxxXXX", 0) != 0) /* loop */ ; sleep(1); if (kill(pid, SIGKILL) != 0) e(1); if (wait(&n) < 0) e(2); if (close(fd[0]) != 0) e(3); if (close(fd[1]) != 0) e(4); } else { if (creat("XXXxxxXXX", 0777) < 0) e(5); read(fd[0], (char *) buf, 1); e(5); /* should be killed by signal and not get here */ } unlink("XXXxxxXXX"); } void ex() { printf("Test 5. fork failed. Errno=%d\n", errno); exit(1); } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } #ifdef _ANSI void (*Signal(int a, void (*b)(int)))(int) #else sighandler_t Signal(a, b) int a; void (*b)(); #endif { if (signal(a, (void (*) ()) b) == (void (*)()) -1) return(SIG_ERR); else return(SIG_ZERO); } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } 6/* test 6 */ #include #include #include #include #include #include #include #include #include #define MAX_ERROR 4 int errct; int subtest = 1; int zilch[5000]; char curdir[PATH_MAX]; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test6a, (void)); _PROTOTYPE(void test6b, (void)); _PROTOTYPE(void test6c, (void)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (geteuid() == 0 || getuid() == 0) { printf("Test 6 cannot run as root; test aborted\n"); exit(1); } if (argc == 2) m = atoi(argv[1]); printf("Test 6 "); fflush(stdout); getcwd(curdir, PATH_MAX); system("rm -rf DIR_06; mkdir DIR_06"); chdir("DIR_06"); for (i = 0; i < 70; i++) { if (m & 00001) test6a(); if (m & 00002) test6b(); if (m & 00004) test6c(); } quit(); return(-1); /* impossible */ } void test6a() { /* Test sbrk() and brk(). */ char *addr, *addr2, *addr3; int i, del, click, click2; subtest = 1; addr = sbrk(0); addr = sbrk(0); /* force break to a click boundary */ for (i = 0; i < 10; i++) sbrk(7 * i); for (i = 0; i < 10; i++) sbrk(-7 * i); if (sbrk(0) != addr) e(1); sbrk(30); if (brk(addr) != 0) e(2); if (sbrk(0) != addr) e(3); del = 0; do { del++; brk(addr + del); addr2 = sbrk(0); } while (addr2 == addr); click = addr2 - addr; sbrk(-1); if (sbrk(0) != addr) e(4); brk(addr); if (sbrk(0) != addr) e(5); del = 0; do { del++; brk(addr - del); addr3 = sbrk(0); } while (addr3 == addr); click2 = addr - addr3; sbrk(1); if (sbrk(0) != addr) e(6); brk(addr); if (sbrk(0) != addr) e(8); if (click != click2) e(9); brk(addr + 2 * click); if (sbrk(0) != addr + 2 * click) e(10); sbrk(3 * click); if (sbrk(0) != addr + 5 * click) e(11); sbrk(-5 * click); if (sbrk(0) != addr) e(12); } void test6b() { int i, err; subtest = 2; signal(SIGQUIT, SIG_IGN); err = 0; for (i = 0; i < 5000; i++) if (zilch[i] != 0) err++; if (err > 0) e(1); kill(getpid(), SIGQUIT); } void test6c() { /* Test mknod, chdir, chmod, chown, access. */ int i, j; struct stat s; subtest = 3; if (getuid() != 0) return; for (j = 0; j < 2; j++) { umask(0); if (chdir("/") < 0) e(1); if (mknod("dir", 040700, 0) < 0) e(2); if (link("/", "/dir/..") < 0) e(3); if (mknod("T3a", 0777, 0) < 0) e(4); if (mknod("/dir/T3b", 0777, 0) < 0) e(5); if (mknod("dir/T3c", 0777, 0) < 0) e(6); if ((i = open("/dir/T3b", 0)) < 0) e(7); if (close(i) < 0) e(8); if ((i = open("dir/T3c", O_RDONLY)) < 0) e(9); if (close(i) < 0) e(10); if (chdir("dir") < 0) e(11); if ((i = open("T3b", 0)) < 0) e(12); if (close(i) < 0) e(13); if ((i = open("../T3a", O_RDONLY)) < 0) e(14); if (close(i) < 0) e(15); if ((i = open("../dir/../dir/../dir/../dir/../dir/T3c", O_RDONLY)) < 0) e(16); if (close(i) < 0) e(17); if (chmod("../dir/../dir/../dir/../dir/../T3a", 0123) < 0) e(18); if (stat("../dir/../dir/../dir/../T3a", &s) < 0) e(19); if ((s.st_mode & 077777) != 0123) e(20); if (chmod("../dir/../dir/../T3a", 0456) < 0) e(21); if (stat("../T3a", &s) < 0) e(22); if ((s.st_mode & 077777) != 0456) e(23); if (chown("../dir/../dir/../T3a", 20, 30) < 0) e(24); if (stat("../T3a", &s) < 0) e(25); if (s.st_uid != 20) e(26); if (s.st_gid != 30) e(27); if ((i = open("/T3c", O_RDONLY)) >= 0) e(28); if ((i = open("/T3a", O_RDONLY)) < 0) e(29); if (close(i) < 0) e(30); if (access("/T3a", 4) < 0) e(31); if (access("/dir/T3b", 4) < 0) e(32); if (access("/dir/T3d", 4) >= 0) e(33); if (unlink("T3b") < 0) e(34); if (unlink("T3c") < 0) e(35); if (unlink("..") < 0) e(36); if (chdir("/") < 0) e(37); if (unlink("dir") < 0) e(38); if (unlink("/T3a") < 0) e(39); } } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void quit() { chdir(".."); system("rm -rf DIR*"); chdir(curdir); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* POSIX test program (7). Author: Andy Tanenbaum */ /* The following POSIX calls are tested: * * pipe(), mkfifo(), fcntl() */ #include #include #include #include #include #include #include #include #include #include #include #define ITERATIONS 4 #define MAX_ERROR 4 #define ITEMS 32 #define READ 10 #define WRITE 20 #define UNLOCK 30 #define U 70 #define L 80 char buf[ITEMS] = {0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,9}; int subtest, errct, xfd; int whence = SEEK_SET, func_code = F_SETLK; extern char **environ; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test7a, (void)); _PROTOTYPE(void test7b, (void)); _PROTOTYPE(void test7c, (void)); _PROTOTYPE(void test7d, (void)); _PROTOTYPE(void test7e, (void)); _PROTOTYPE(void test7f, (void)); _PROTOTYPE(void test7g, (void)); _PROTOTYPE(void test7h, (void)); _PROTOTYPE(void test7i, (void)); _PROTOTYPE(void test7j, (void)); _PROTOTYPE(void cloexec_test, (void)); _PROTOTYPE(int set, (int how, int first, int last)); _PROTOTYPE(int locked, (int b)); _PROTOTYPE(void e, (int n)); _PROTOTYPE(void sigfunc, (int s)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); if (m == 0) cloexec_test(); /* important; do not remove this! */ printf("Test 7 "); fflush(stdout); system("rm -rf DIR_07; mkdir DIR_07"); chdir("DIR_07"); for (i = 0; i < ITERATIONS; i++) { if (m & 00001) test7a(); if (m & 00002) test7b(); if (m & 00004) test7c(); if (m & 00010) test7d(); if (m & 00020) test7e(); if (m & 00040) test7f(); if (m & 00100) test7g(); if (m & 00200) test7h(); if (m & 00400) test7i(); if (m & 01000) test7j(); } quit(); return(-1); /* impossible */ } void test7a() { /* Test pipe(). */ int i, fd[2], ect; char buf2[ITEMS+1]; /* Create a pipe, write on it, and read it back. */ subtest = 1; if (pipe(fd) != 0) e(1); if (write(fd[1], buf, ITEMS) != ITEMS) e(2); buf2[0] = 0; if (read(fd[0], buf2, ITEMS+1) != ITEMS) e(3); ect = 0; for (i = 0; i < ITEMS; i++) if (buf[i] != buf2[i]) ect++; if (ect != 0) e(4); if (close(fd[0]) != 0) e(5); if (close(fd[1]) != 0) e(6); /* Error test. Keep opening pipes until it fails. Check error code. */ errno = 0; while (1) { if (pipe(fd) < 0) break; } if (errno != EMFILE) e(7); /* Close all the pipes. */ for (i = 3; i < OPEN_MAX; i++) close(i); } void test7b() { /* Test mkfifo(). */ int fdr, fdw, status; char buf2[ITEMS+1]; /* Create a fifo, write on it, and read it back. */ subtest = 2; if (mkfifo("T7.b", 0777) != 0) e(1); if (fork()) { /* Parent writes on the fifo. */ if ( (fdw = open("T7.b", O_WRONLY)) < 0) e(2); if (write(fdw, buf, ITEMS) != ITEMS) e(3); wait(&status); if (close(fdw) != 0) e(4); } else { /* Child reads from the fifo. */ if ( (fdr = open("T7.b", O_RDONLY)) < 0) e(5); if (read(fdr, buf2, ITEMS+1) != ITEMS) e(6); if (strcmp(buf, buf2) != 0) e(7); if (close(fdr) != 0) e(8); exit(0); } /* Check some error conditions. */ if (mkfifo("T7.b", 0777) != -1) e(9); errno = 0; if (mkfifo("a/b/c", 0777) != -1) e(10); if (errno != ENOENT) e(11); errno = 0; if (mkfifo("", 0777) != -1) e(12); if (errno != ENOENT) e(13); errno = 0; if (mkfifo("T7.b/x", 0777) != -1) e(14); if (errno != ENOTDIR) e(15); if (unlink("T7.b") != 0) e(16); /* Now check fifos and the O_NONBLOCK flag. */ if (mkfifo("T7.b", 0600) != 0) e(17); errno = 0; if (open("T7.b", O_WRONLY | O_NONBLOCK) != -1) e(18); if (errno != ENXIO) e(19); if ( (fdr = open("T7.b", O_RDONLY | O_NONBLOCK)) < 0) e(20); if (fork()) { /* Parent reads from fdr. */ wait(&status); /* but first make sure writer has already run*/ if ( ( (status>>8) & 0377) != 77) e(21); if (read(fdr, buf2, ITEMS+1) != ITEMS) e(22); if (strcmp(buf, buf2) != 0) e(23); if (close(fdr) != 0) e(24); } else { /* Child opens the fifo for writing and writes to it. */ if ( (fdw = open("T7.b", O_WRONLY | O_NONBLOCK)) < 0) e(25); if (write(fdw, buf, ITEMS) != ITEMS) e(26); if (close(fdw) != 0) e(27); exit(77); } if (unlink("T7.b") != 0) e(28); } void test7c() { /* Test fcntl(). */ int fd, m, s, newfd, newfd2; struct stat stat1, stat2, stat3; subtest = 3; errno = -100; if ( (fd = creat("T7.c", 0777)) < 0) e(1); /* Turn the per-file-descriptor flags on and off. */ if (fcntl(fd, F_GETFD) != 0) e(2); /* FD_CLOEXEC is initially off */ if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) e(3);/* turn it on */ if (fcntl(fd, F_GETFD) != FD_CLOEXEC) e(4); /* should be on now */ if (fcntl(fd, F_SETFD, 0) != 0) e(5); /* turn it off */ if (fcntl(fd, F_GETFD) != 0) e(6); /* should be off now */ /* Turn the open-file-description flags on and off. Start with O_APPEND. */ m = O_WRONLY; if (fcntl(fd, F_GETFL) != m) e(7); /* O_APPEND, O_NONBLOCK are off */ if (fcntl(fd, F_SETFL, O_APPEND) != 0) e(8); /* turn on O_APPEND */ if (fcntl(fd, F_GETFL) != (O_APPEND | m)) e(9);/* should be on now */ if (fcntl(fd, F_SETFL, 0) != 0) e(10); /* turn it off */ if (fcntl(fd, F_GETFL) != m) e(11); /* should be off now */ /* Turn the open-file-description flags on and off. Now try O_NONBLOCK. */ if (fcntl(fd, F_SETFL, O_NONBLOCK) != 0) e(12); /* turn on O_NONBLOCK */ if (fcntl(fd, F_GETFL) != (O_NONBLOCK | m)) e(13); /* should be on now */ if (fcntl(fd, F_SETFL, 0) != 0) e(14); /* turn it off */ if (fcntl(fd, F_GETFL) != m) e(15); /* should be off now */ /* Now both at once. */ if (fcntl(fd, F_SETFL, O_APPEND|O_NONBLOCK) != 0) e(16); if (fcntl(fd, F_GETFL) != (O_NONBLOCK | O_APPEND | m)) e(17); if (fcntl(fd, F_SETFL, 0) != 0) e(18); if (fcntl(fd, F_GETFL) != m) e(19); /* Now test F_DUPFD. */ if ( (newfd = fcntl(fd, F_DUPFD, 0)) != 4) e(20); /* 0-4 open */ if ( (newfd2 = fcntl(fd, F_DUPFD, 0)) != 5) e(21); /* 0-5 open */ if (close(newfd) != 0) e(22); /* 0-3, 5 open */ if ( (newfd = fcntl(fd, F_DUPFD, 0)) != 4) e(23); /* 0-5 open */ if (close(newfd) != 0) e(24); /* 0-3, 5 open */ if ( (newfd = fcntl(fd, F_DUPFD, 5)) != 6) e(25); /* 0-3, 5, 6 open */ if (close(newfd2) != 0) e(26); /* 0-3, 6 open */ /* O_APPEND should be inherited, but FD_CLOEXEC should be cleared. Check. */ if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) e(26);/* turn FD_CLOEXEC on */ if (fcntl(fd, F_SETFL, O_APPEND) != 0) e(27); /* turn O_APPEND on */ if ( (newfd2 = fcntl(fd, F_DUPFD, 10)) != 10) e(28); /* 0-3, 6, 10 open */ if (fcntl(newfd2, F_GETFD) != 0) e(29); /* FD_CLOEXEC must be 0 */ if (fcntl(newfd2, F_GETFL) != (O_APPEND | m)) e(30); /* O_APPEND set */ if (fcntl(fd, F_SETFD, 0) != 0) e(31);/* turn FD_CLOEXEC off */ /* Check if newfd and newfd2 are the same inode. */ if (fstat(fd, &stat1) != 0) e(32); if (fstat(fd, &stat2) != 0) e(33); if (fstat(fd, &stat3) != 0) e(34); if (stat1.st_dev != stat2.st_dev) e(35); if (stat1.st_dev != stat3.st_dev) e(36); if (stat1.st_ino != stat2.st_ino) e(37); if (stat1.st_ino != stat3.st_ino) e(38); /* Now check on the FD_CLOEXEC flag. Set it for fd (3) and newfd2 (10) */ if (fd != 3 || newfd2 != 10 || newfd != 6) e(39); if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) e(40); /* close 3 on exec */ if (fcntl(newfd2, F_SETFD, FD_CLOEXEC) != 0) e(41); /* close 10 on exec */ if (fcntl(newfd, F_SETFD, 0) != 0) e(42); /* don't close 6 */ if (fork()) { wait(&s); /* parent just waits */ if (WEXITSTATUS(s) != 0) e(43); } else { execle("../test7", "test7", "0", (char *) 0, environ); exit(1); /* the impossible never happens, right? */ } /* Finally, close all the files. */ if (fcntl(fd, F_SETFD, 0) != 0) e(44); /* FD_CLOEXEC off */ if (fcntl(newfd2, F_SETFD, 0) != 0) e(45); /* FD_CLOEXEC off */ if (close(fd) != 0) e(46); if (close(newfd) != 0) e(47); if (close(newfd2) != 0) e(48); } void test7d() { /* Test file locking. */ subtest = 4; if ( (xfd = creat("T7.d", 0777)) != 3) e(1); close(xf666666666666d); if ( (xfd = open("T7.d", O_RDWR)) < 0) e(2); if (write(xfd, buf, ITEMS) != ITEMS) e(3); if (set(WRITE, 0, 3) != 0) e(4); if (set(WRITE, 5, 9) != 0) e(5); if (set(UNLOCK, 0, 3) != 0) e(6); if (set(UNLOCK, 4, 9) != 0) e(7); if (set(READ, 1, 4) != 0) e(8); if (set(READ, 4, 7) != 0) e(9); if (set(UNLOCK, 4, 7) != 0) e(10); if (set(UNLOCK, 1, 4) != 0) e(11); if (set(WRITE, 0, 3) != 0) e(12); if (set(WRITE, 5, 7) != 0) e(13); if (set(WRITE, 9 ,10) != 0) e(14); if (set(UNLOCK, 0, 4) != 0) e(15); if (set(UNLOCK, 0, 7) != 0) e(16); if (set(UNLOCK, 0, 2000) != 0) e(17); if (set(WRITE, 0, 3) != 0) e(18); if (set(WRITE, 5, 7) != 0) e(19); if (set(WRITE, 9 ,10) != 0) e(20); if (set(UNLOCK, 0, 100) != 0) e(21); if (set(WRITE, 0, 9) != 0) e(22); if (set(UNLOCK, 8, 9) != 0) e(23); if (set(UNLOCK, 0, 2) != 0) e(24); if (set(UNLOCK, 5, 5) != 0) e(25); if (set(UNLOCK, 4, 6) != 0) e(26); if (set(UNLOCK, 3, 3) != 0) e(27); if (set(UNLOCK, 7, 7) != 0) e(28); if (set(WRITE, 0, 10) != 0) e(29); if (set(UNLOCK, 0, 1000) != 0) e(30); /* Up until now, all locks have been disjoint. Now try conflicts. */ if (set(WRITE, 0, 4) != 0) e(31); if (set(WRITE, 4, 7) != 0) e(32); /* owner may lock same byte twice */ if (set(WRITE, 5, 10) != 0) e(33); if (set(UNLOCK, 0, 11) != 0) e(34); /* File is now unlocked. Length 0 means whole file. */ if (set(WRITE, 2, 1) != 0) e(35); /* this locks whole file */ if (set(WRITE, 9,10) != 0) e(36); /* a process can relock its file */ if (set(WRITE, 3, 3) != 0) e(37); if (set(UNLOCK, 0, -1) != 0) e(38); /* file is now unlocked. */ /* Test F_GETLK. */ if (set(WRITE, 2, 3) != 0) e(39); if (locked(1) != U) e(40); if (locked(2) != L) e(41); if (locked(3) != L) e(42); if (locked(4) != U) e(43); if (set(UNLOCK, 2, 3) != 0) e(44); if (locked(2) != U) e(45); if (locked(3) != U) e(46); close(xfd); } void test7e() { /* Test to see if SETLKW blocks as it should. */ int pid, s; subtest = 5; if ( (xfd = creat("T7.e", 0777)) != 3) e(1); if (close(xfd) != 0) e(2); if ( (xfd = open("T7.e", O_RDWR)) < 0) e(3); if (write(xfd, buf, ITEMS) != ITEMS) e(4); if (set(WRITE, 0, 3) != 0) e(5); if ( (pid = fork()) ) { /* Parent waits until child has started before signaling it. */ while (access("T7.e1", 0) != 0) ; unlink("T7.e1"); sleep(1); if (kill(pid, SIGKILL) < 0) e(6); if (wait(&s) != pid) e(7); } else { /* Child tries to lock and should block. */ if (creat("T7.e1", 0777) < 0) e(8); func_code = F_SETLKW; if (set(WRITE, 0, 3) != 0) e(9); /* should block */ errno = -1000; e(10); /* process should be killed by signal */ exit(0); /* should never happen */ } close(xfd); } void test7f() { /* Test to see if SETLKW gives EINTR when interrupted. */ int pid, s; subtest = 6; if ( (xfd = creat("T7.f", 0777)) != 3) e(1); if (close(xfd) != 0) e(2); if ( (xfd = open("T7.f", O_RDWR)) < 0) e(3); if (write(xfd, buf, ITEMS) != ITEMS) e(4); if (set(WRITE, 0, 3) != 0) e(5); if ( (pid = fork()) ) { /* Parent waits until child has started before signaling it. */ while (access("T7.f1", 0) != 0) ; unlink("T7.f1"); sleep(1); if (kill(pid, SIGTERM) < 0) e(6); if (wait(&s) != pid) e(7); if ( (s>>8) != 19) e(8); } else { /* Child tries to lock and should block. * `signal(SIGTERM, sigfunc);' to set the signal handler is inadequate * because on systems like BSD the sigaction flags for signal include * `SA_RESTART' so syscalls are restarted after they have been * interrupted by a signal. */ struct sigaction sa, osa; sa.sa_handler = sigfunc; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; if (sigaction(SIGTERM, &sa, &osa) < 0) e(999); if (creat("T7.f1", 0777) < 0) e(9); func_code = F_SETLKW; if (set(WRITE, 0, 3) != -1) e(10); /* should block */ if (errno != EINTR) e(11); /* signal should release it */ exit(19); } close(xfd); } void test7g() { /* Test to see if SETLKW unlocks when the needed lock becomes available. */ int pid, s; subtest = 7; if ( (xfd = creat("T7.g", 0777)) != 3) e(1); if (close(xfd) != 0) e(2); if ( (xfd = open("T7.g", O_RDWR)) < 0) e(3); if (write(xfd, buf, ITEMS) != ITEMS) e(4); if (set(WRITE, 0, 3) != 0) e(5); /* bytes 0 to 3 are now locked */ if ( (pid = fork()) ) { /* Parent waits for child to start. */ while (access("T7.g1", 0) != 0) ; unlink("T7.g1"); sleep(1); if (set(UNLOCK, 0, 3) != 0) e(5); if (wait(&s) != pid) e(6); if ( (s >> 8) != 29) e(7); } else { /* Child tells parent it is alive, then tries to lock and is blocked.*/ func_code = F_SETLKW; if (creat("T7.g1", 0777) < 0) e(8); if (set(WRITE, 3, 3) != 0) e(9); /* process must block now */ if (set(UNLOCK, 3, 3) != 0) e(10); exit(29); } close(xfd); } void test7h() { /* Test to see what happens if two processed block on the same lock. */ int pid, pid2, s, w; subtest = 8; if ( (xfd = creat("T7.h", 0777)) != 3) e(1); if (close(xfd) != 0) e(2); if ( (xfd = open("T7.h", O_RDWR)) < 0) e(3); if (write(xfd, buf, ITEMS) != ITEMS) e(4); if (set(WRITE, 0, 3) != 0) e(5); /* bytes 0 to 3 are now locked */ if ( (pid = fork()) ) { if ( (pid2 = fork()) ) { /* Parent waits for child to start. */ while (access("T7.h1", 0) != 0) ; while (access("T7.h2", 0) != 0) ; unlink("T7.h1"); unlink("T7.h2"); sleep(1); if (set(UNLOCK, 0, 3) != 0) e(6); w = wait(&s); if (w != pid && w != pid2) e(7); s = s >> 8; if (s != 39 && s != 49) e(8); w = wait(&s); if (w != pid && w != pid2) e(9); s = s >> 8; if (s != 39 && s != 49) e(10); } else { func_code = F_SETLKW; if (creat("T7.h1", 0777) < 0) e(11); if (set(WRITE, 0, 0) != 0) e(12); /* block now */ if (set(UNLOCK, 0, 0) != 0) e(13); exit(39); } } else { /* Child tells parent it is alive, then tries to lock and is blocked.*/ func_code = F_SETLKW; if (creat("T7.h2", 0777) < 0) e(14); if (set(WRITE, 0, 1) != 0) e(15); /* process must block now */ if (set(UNLOCK, 0, 1) != 0) e(16); exit(49); } close(xfd); } void test7i() { /* Check error conditions for fcntl(). */ int tfd, i; subtest = 9; errno = 0; if ( (xfd = creat("T7.i", 0777)) != 3) e(1); if (close(xfd) != 0) e(2); if ( (xfd = open("T7.i", O_RDWR)) < 0) e(3); if (write(xfd, buf, ITEMS) != ITEMS) e(4); if (set(WRITE, 0, 3) != 0) e(5); /* bytes 0 to 3 are now locked */ if (set(WRITE, 0, 0) != 0) e(6); if (errno != 0) e(7); errno = 0; if (set(WRITE, 3, 3) != 0) e(8); if (errno != 0) e(9); tfd = xfd; /* hold good value */ xfd = -99; errno = 0; if (set(WRITE, 0, 0) != -1) e(10); if (errno != EBADF) e(11); errno = 0; if ( (xfd = open("T7.i", O_WRONLY)) < 0) e(12); if (set(READ, 0, 0) != -1) e(13); if (errno != EBADF) e(14); if (close(xfd) != 0) e(15); errno = 0; if ( (xfd = open("T7.i", O_RDONLY)) < 0) e(16); if (set(WRITE, 0, 0) != -1) e(17); if (errno != EBADF) e(18); if (close(xfd) != 0) e(19); xfd = tfd; /* restore legal xfd value */ /* Check for EINVAL. */ errno = 0; if (fcntl(xfd, F_DUPFD, OPEN_MAX) != -1) e(20); if (errno != EINVAL) e(21); errno = 0; if (fcntl(xfd, F_DUPFD, -1) != -1) e(22); if (errno != EINVAL) e(23); xfd = 0; /* stdin does not support locking */ errno = 0; if (set(READ, 0, 0) != -1) e(24); if (errno != EINVAL) e(25); xfd = tfd; /* Check ENOLCK. */ for (i = 0; i < ITEMS; i++) { if (set(WRITE, i, i) == 0) continue; if (errno != ENOLCK) { e(26); break; } } /* Check EMFILE. */ for (i = xfd + 1; i < OPEN_MAX; i++) open("T7.i", 0); /* use up all fds */ errno = 0; if (fcntl(xfd, F_DUPFD, 0) != -1) e(27); /* No fds left */ if (errno != EMFILE) e(28); for (i = xfd; i < OPEN_MAX; i++) if (close(i) != 0) e(29); } void test7j() { /* Test file locking with two processes. */ int s; subtest = 10; if ( (xfd = creat("T7.j", 0777)) != 3) e(1); close(xfd); if ( (xfd = open("T7.j", O_RDWR)) < 0) e(2); if (write(xfd, buf, ITEMS) != ITEMS) e(3); if (set(WRITE, 0, 4) != 0) e(4); /* lock belongs to parent */ if (set(READ, 10, 16) != 0) e(5); /* lock belongs to parent */ /* Up until now, all locks have been disjoint. Now try conflicts. */ if (fork()) { /* Parent just waits for child to finish. */ wait(&s); } else { /* Child does the testing. */ errno = -100; if (set(WRITE, 5, 7) < 0) e(6); /* should work */ if (set(WRITE, 4, 7) >= 0) e(7); /* child may not lock byte 4 */ if (errno != EACCES && errno != EAGAIN) e(8); if (set(WRITE, 5, 9) != 0) e(9); if (set(UNLOCK, 5, 9) != 0) e(10); if (set(READ, 9, 17) < 0) e(11); /* shared READ lock is ok */ exit(0); } close(xfd); } void cloexec_test() { /* To text whether the FD_CLOEXEC flag actually causes files to be * closed upon exec, we have to exec something. The test is carried * out by forking, and then having the child exec test7 itself, but * with argument 0. This is detected, and control comes here. * File descriptors 3 and 10 should be closed here, and 10 open. */ if (close(3) == 0) e(1001); /* close should fail; it was closed on exec */ if (close(6) != 0) e(1002); /* close should succeed */ if (close(10) == 0) e(1003); /* close should fail */ fflush(stdout); exit(0); } int set(how, first, last) int how, first, last; { int r; struct flock flock; if (how == READ) flock.l_type = F_RDLCK; if (how == WRITE) flock.l_type = F_WRLCK; if (how == UNLOCK) flock.l_type = F_UNLCK; flock.l_whence = whence; flock.l_start = (long) first; flock.l_len = (long) last - (long) first + 1; r = fcntl(xfd, func_code, &flock); if (r != -1) return(0); else return(-1); } int locked(b) int b; /* Test to see if byte b is locked. Return L or U */ { struct flock flock; pid_t pid; int status; flock.l_type = F_WRLCK; flock.l_whence = whence; flock.l_start = (long) b; flock.l_len = 1; /* Process' own locks are invisible to F_GETLK, so fork a child to test. */ pid = fork(); if (pid == 0) { if (fcntl(xfd, F_GETLK, &flock) != 0) e(2000); exit(flock.l_type == F_UNLCK ? U : L); } if (pid == -1) e(2001); if (fcntl(xfd, F_GETLK, &flock) != 0) e(2002); if (flock.l_type != F_UNLCK) e(2003); if (wait(&status) != pid) e(2004); if (!WIFEXITED(status)) e(2005); return(WEXITSTATUS(status)); } void e(n) int n; { int err_num = errno; /* save errno in case printf clobbers it */ printf("Subtest %d, error %d errno=%d ", subtest, n, errno); fflush(stdout); errno = err_num; /* restore errno, just in case */ perror(""); if (errct++ > MAX_ERROR) { printf("Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } void sigfunc(s) int s; /* for ANSI */ { } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(1); } } /* test 8 - signals */ #include #include #ifdef _MINIX #include #endif #include #include #include #include #include #include #include #define ITERATIONS 2 #define SIGS 14 #define MAX_ERROR 4 int iteration, cumsig, subtest, errct = 0, sig1, sig2; int sigarray[SIGS] = {SIGHUP, SIGILL, SIGTRAP, SIGABRT, SIGIOT, SIGUNUSED, SIGFPE, SIGUSR1, SIGSEGV, SIGUSR2, SIGPIPE, SIGALRM, SIGTERM}; /* Prototypes produced automatically by mkptypes. */ _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test8a, (void)); _PROTOTYPE(void func1, (int sig)); _PROTOTYPE(void func2, (int sig)); _PROTOTYPE(void test8b, (void)); _PROTOTYPE(void catch1, (int signo)); _PROTOTYPE(void catch2, (int signo)); _PROTOTYPE(void test8c, (void)); _PROTOTYPE(void catch3, (int signo)); _PROTOTYPE(void test8d, (void)); _PROTOTYPE(void catch4, (int signo)); _PROTOTYPE(void test8e, (void)); _PROTOTYPE(void catch5, (int signo)); _PROTOTYPE(void test8f, (void)); _PROTOTYPE(void sigint_handler, (int signo)); _PROTOTYPE(void sigpipe_handler, (int signo)); _PROTOTYPE(void test8g, (void)); _PROTOTYPE(void sighup8, (int signo)); _PROTOTYPE(void sigpip8, (int signo)); _PROTOTYPE(void sigter8, (int signo)); _PROTOTYPE(void test8h, (void)); _PROTOTYPE(void sighup9, (int signo)); _PROTOTYPE(void sigter9, (int signo)); _PROTOTYPE(void test8i, (void)); _PROTOTYPE(void sighup10, (int signo)); _PROTOTYPE(void sigalrm_handler10, (int signo)); _PROTOTYPE(void test8j, (void)); _PROTOTYPE(void test8k, (void)); _PROTOTYPE(void test8l, (void)); _PROTOTYPE(void func_m1, (void)); _PROTOTYPE(void func_m2, (void)); _PROTOTYPE(void test8m, (void)); _PROTOTYPE(void longjerr, (void)); _PROTOTYPE(void catch14, (int signo, int code, struct sigcontext * scp)); _PROTOTYPE(void test8n, (void)); _PROTOTYPE(void catch15, (int signo)); _PROTOTYPE(void test8o, (void)); _PROTOTYPE(void clearsigstate, (void)); _PROTOTYPE(void quit, (void)); _PROTOTYPE(void wait_for, (int pid)); _PROTOTYPE(void e, (int n)); int main(argc, argv) int argc; char *argv[]; { int i, m = 0xFFFF; sync(); if (argc == 2) m = atoi(argv[1]); printf("Test 8 "); fflush(stdout); /* have to flush for child's benefit */ system("rm -rf DIR_08; mkdir DIR_08"); chdir("DIR_08"); for (i = 0; i < ITERATIONS; i++) { iteration = i; if (m & 0000001) test8a(); if (m & 0000002) test8b(); if (m & 0000004) test8c(); if (m & 0000010) test8d(); if (m & 0000020) test8e(); if (m & 0000040) test8f(); if (m & 0000100) test8g(); if (m & 0000200) test8h(); if (m & 0000400) test8i(); if (m & 0001000) test8j(); if (m & 0002000) test8k(); if (m & 0004000) test8l(); if (m & 0010000) test8m(); if (m & 0020000) test8n(); if (m & 0040000) test8o(); } quit(); return(-1); /* impossible */ } void test8a() { /* Test signal set management. */ sigset_t s; subtest = 1; clearsigstate(); /* Create an empty set and see if any bits are on. */ if (sigemptyset(&s) != 0) e(1); if (sigismember(&s, SIGHUP) != 0) e(2); if (sigismember(&s, SIGINT) != 0) e(3); if (sigismember(&s, SIGQUIT) != 0) e(4); if (sigismember(&s, SIGILL) != 0) e(5); if (sigismember(&s, SIGTRAP) != 0) e(6); if (sigismember(&s, SIGABRT) != 0) e(7); if (sigismember(&s, SIGIOT) != 0) e(8); if (sigismember(&s, SIGUNUSED) != 0) e(9); if (sigismember(&s, SIGFPE) != 0) e(10); if (sigismember(&s, SIGKILL) != 0) e(11); if (sigismember(&s, SIGUSR1) != 0) e(12); if (sigismember(&s, SIGSEGV) != 0) e(13); if (sigismember(&s, SIGUSR2) != 0) e(14); if (sigismember(&s, SIGPIPE) != 0) e(15); if (sigismember(&s, SIGALRM) != 0) e(16); if (sigismember(&s, SIGTERM) != 0) e(17); /* Create a full set and see if any bits are off. */ if (sigfillset(&s) != 0) e(19); if (sigemptyset(&s) != 0) e(20); if (sigfillset(&s) != 0) e(21); if (sigismember(&s, SIGHUP) != 1) e(22); if (sigismember(&s, SIGINT) != 1) e(23); if (sigismember(&s, SIGQUIT) != 1) e(24); if (sigismember(&s, SIGILL) != 1) e(25); if (sigismember(&s, SIGTRAP) != 1) e(26); if (sigismember(&s, SIGABRT) != 1) e(27); if (sigismember(&s, SIGIOT) != 1) e(28); if (sigismember(&s, SIGUNUSED) != 1) e(29); if (sigismember(&s, SIGFPE) != 1) e(30); if (sigismember(&s, SIGKILL) != 1) e(31); if (sigismember(&s, SIGUSR1) != 1) e(32); if (sigismember(&s, SIGSEGV) != 1) e(33); if (sigismember(&s, SIGUSR2) != 1) e(34); if (sigismember(&s, SIGPIPE) != 1) e(35); if (sigismember(&s, SIGALRM) != 1) e(36); if (sigismember(&s, SIGTERM) != 1) e(37); /* Create an empty set, then turn on bits individually. */ if (sigemptyset(&s) != 0) e(39); if (sigaddset(&s, SIGHUP) != 0) e(40); if (sigaddset(&s, SIGINT) != 0) e(41); if (sigaddset(&s, SIGQUIT) != 0) e(42); if (sigaddset(&s, SIGILL) != 0) e(43); if (sigaddset(&s, SIGTRAP) != 0) e(44); /* See if the bits just turned on are indeed on. */ if (sigismember(&s, SIGHUP) != 1) e(45); if (sigismember(&s, SIGINT) != 1) e(46); if (sigismember(&s, SIGQUIT) != 1) e(47); if (sigismember(&s, SIGILL) != 1) e(48); if (sigismember(&s, SIGTRAP) != 1) e(49); /* The others should be turned off. */ if (sigismember(&s, SIGABRT) != 0) e(50); if (sigismember(&s, SIGIOT) != 0) e(51); if (sigismember(&s, SIGUNUSED) != 0) e(52); if (sigismember(&s, SIGFPE) != 0) e(53); if (sigismember(&s, SIGKILL) != 0) e(54); if (sigismember(&s, SIGUSR1) != 0) e(55); if (sigismember(&s, SIGSEGV) != 0) e(56); if (sigismember(&s, SIGUSR2) != 0) e(57); if (sigismember(&s, SIGPIPE) != 0) e(58); if (sigismember(&s, SIGALRM) != 0) e(59); if (sigismember(&s, SIGTERM) != 0) e(60); /* Now turn them off and see if all are off. */ if (sigdelset(&s, SIGHUP) != 0) e(62); if (sigdelset(&s, SIGINT) != 0) e(63); if (sigdelset(&s, SIGQUIT) != 0) e(64); if (sigdelset(&s, SIGILL) != 0) e(65); if (sigdelset(&s, SIGTRAP) != 0) e(66); if (sigismember(&s, SIGHUP) != 0) e(67); if (sigismember(&s, SIGINT) != 0) e(68); if (sigismember(&s, SIGQUIT) != 0) e(69); if (sigismember(&s, SIGILL) != 0) e(70); if (sigismember(&s, SIGTRAP) != 0) e(71); if (sigismember(&s, SIGABRT) != 0) e(72); if (sigismember(&s, SIGIOT) != 0) e(73); if (sigismember(&s, SIGUNUSED) != 0) e(74); if (sigismember(&s, SIGFPE) != 0) e(75); if (sigismember(&s, SIGKILL) != 0) e(76); if (sigismember(&s, SIGUSR1) != 0) e(77); if (sigismember(&s, SIGSEGV) != 0) e(78); if (sigismember(&s, SIGUSR2) != 0) e(79); if (sigismember(&s, SIGPIPE) != 0) e(80); if (sigismember(&s, SIGALRM) != 0) e(81); if (sigismember(&s, SIGTERM) != 0) e(82); } void func1(sig) int sig; { sig1++; } void func2(sig) int sig; { sig2++; } void test8b() { /* Test sigprocmask and sigpending. */ int i; pid_t p; sigset_t s, s1, s_empty, s_full, s_ill, s_ill_pip, s_nokill; struct sigaction sa, osa; subtest = 2; clearsigstate(); /* Construct s_ill = {SIGILL} and s_ill_pip {SIGILL | SIGPIP}, etc. */ if (sigemptyset(&s_empty) != 0) e(1); if (sigemptyset(&s_ill) != 0) e(2); if (sigemptyset(&s_ill_pip) != 0) e(3); if (sigaddset(&s_ill, SIGILL) != 0) e(4); if (sigaddset(&s_ill_pip, SIGILL) != 0) e(5); if (sigaddset(&s_ill_pip, SIGPIPE) != 0) e(6); if (sigfillset(&s_full) != 0) e(7); s_nokill = s_full; if (sigdelset(&s_nokill, SIGKILL) != 0) e(8); #ifndef _MINIX /* XXX - should unsupported signals be <= _NSIG? */ if (SIGSTOP > _NSIG) e(666); #endif /* _MINIX */ if (SIGSTOP <= _NSIG && sigdelset(&s_nokill, SIGSTOP) != 0) e(888); /* Now get most of the signals into default state. Don't change SIGINT * or SIGQUIT, so this program can be killed. SIGKILL is also special. */ sa.sa_handler = SIG_DFL; sa.sa_mask = s_empty; sa.sa_flags = 0; for (i = 0; i < SIGS; i++) sigaction(i, &sa, &osa); /* The second argument may be zero. See if it wipes out the system. */ for (i = 0; i < SIGS; i++) sigaction(i, (struct sigaction *) NULL, &osa); /* Install a signal handler. */ sa.sa_handler = func1; sa.sa_mask = s_ill; sa.sa_flags = SA_NODEFER | SA_NOCLDSTOP; osa.sa_handler 6666666666666666666= SIG_IGN; osa.sa_mask = s_empty; osa.sa_flags = 0; if (sigaction(SIGHUP, &sa, &osa) != 0) e(9); if (osa.sa_handler != SIG_DFL) e(10); if (osa.sa_mask != 0) e(11); if (osa.sa_flags != s_empty) e(12); /* Replace action and see if old value is read back correctly. */ sa.sa_handler = func2; sa.sa_mask = s_ill_pip; sa.sa_flags = SA_RESETHAND | SA_NODEFER; osa.sa_handler = SIG_IGN; osa.sa_mask = s_empty; osa.sa_flags = 0; if (sigaction(SIGHUP, &sa, &osa) != 0) e(13); if (osa.sa_handler != func1) e(14); if (osa.sa_mask != s_ill) e(15); if (osa.sa_flags != SA_NODEFER && osa.sa_flags != (SA_NODEFER | SA_NOCLDSTOP)) e(16); /* Replace action once more and check what is read back. */ sa.sa_handler = SIG_DFL; sa.sa_mask = s_empty; osa.sa_handler = SIG_IGN; osa.sa_mask = s_empty; osa.sa_flags = 0; if (sigaction(SIGHUP, &sa, &osa) != 0) e(17); if (osa.sa_handler != func2) e(18); if (osa.sa_mask != s_ill_pip) e(19); if (osa.sa_flags != (SA_RESETHAND | SA_NODEFER)) e(20); /* Test sigprocmask(SIG_SETMASK, ...). */ if (sigprocmask(SIG_SETMASK, &s_full, &s1) != 0) e(18); /* block all */ if (sigemptyset(&s1) != 0) e(19); if (sigprocmask(SIG_SETMASK, &s_empty, &s1) != 0) e(20); /* block none */ if (s1 != s_nokill) e(21); if (sigprocmask(SIG_SETMASK, &s_ill, &s1) != 0) e(22); /* block SIGILL */ if (s1 != s_empty) e(23); if (sigprocmask(SIG_SETMASK, &s_ill_pip, &s1) != 0) e(24); /* SIGILL+PIP */ if (s1 != s_ill) e(25); if (sigprocmask(SIG_SETMASK, &s_full, &s1) != 0) e(26); /* block all */ if (s1 != s_ill_pip) e(27); /* Test sigprocmask(SIG_UNBLOCK, ...) */ if (sigprocmask(SIG_UNBLOCK, &s_ill, &s1) != 0) e(28); if (s1 != s_nokill) e(29); if (sigprocmask(SIG_UNBLOCK, &s_ill_pip, &s1) != 0) e(30); s = s_nokill; if (sigdelset(&s, SIGILL) != 0) e(31); if (s != s1) e(32); if (sigprocmask(SIG_UNBLOCK, &s_empty, &s1) != 0) e(33); s = s_nokill; if (sigdelset(&s, SIGILL) != 0) e(34); if (sigdelset(&s, SIGPIPE) != 0) e(35); if (s != s1) e(36); s1 = s_nokill; if (sigprocmask(SIG_SETMASK, &s_empty, &s1) != 0) e(37); if (s != s1) e(38); /* Test sigprocmask(SIG_BLOCK, ...) */ if (sigprocmask(SIG_BLOCK, &s_ill, &s1) != 0) e(39); if (s1 != s_empty) e(40); if (sigprocmask(SIG_BLOCK, &s_ill_pip, &s1) != 0) e(41); if (s1 != s_ill) e(42); if (sigprocmask(SIG_SETMASK, &s_full, &s1) != 0) e(43); if (s1 != s_ill_pip) e(44); /* Check error condition. */ errno = 0; if (sigprocmask(20000, &s_full, &s1) != -1) e(45); if (errno != EINVAL) e(46); if (sigprocmask(SIG_SETMASK, &s_full, &s1) != 0) e(47); if (s1 != s_nokill) e(48); /* If second arg is 0, nothing is set. */ if (sigprocmask(SIG_SETMASK, (sigset_t *) NULL, &s1) != 0) e(49); if (s1 != s_nokill) e(50); if (sigprocmask(SIG_SETMASK, &s_ill_pip, &s1) != 0) e(51); if (s1 != s_nokill) e(52); if (sigprocmask(SIG_SETMASK, (sigset_t *) NULL, &s1) != 0) e(53); if (s1 != s_ill_pip) e(54); if (sigprocmask(SIG_BLOCK, (sigset_t *) NULL, &s1) != 0) e(55); if (s1 != s_ill_pip) e(56); if (sigprocmask(SIG_UNBLOCK, (sigset_t *) NULL, &s1) != 0) e(57); if (s1 != s_ill_pip) e(58); /* Trying to block SIGKILL is not allowed, but is not an error, either. */ s = s_empty; if (sigaddset(&s, SIGKILL) != 0) e(59); if (sigprocmask(SIG_BLOCK, &s, &s1) != 0) e(60); if (s1 != s_ill_pip) e(61); if (sigprocmask(SIG_SETMASK, &s_full, &s1) != 0) e(62); if (s1 != s_ill_pip) e(63); /* Test sigpending. At this moment, all signals are blocked. */ sa.sa_handler = func2; sa.sa_mask = s_empty; if (sigaction(SIGHUP, &sa, &osa) != 0) e(64); p = getpid(); kill(p, SIGHUP); /* send SIGHUP to self */ if (sigpending(&s) != 0) e(65); if (sigemptyset(&s1) != 0) e(66); if (sigaddset(&s1, SIGHUP) != 0) e(67); if (s != s1) e(68); sa.sa_handler = SIG_IGN; if (sigaction(SIGHUP, &sa, &osa) != 0) e(69); if (sigpending(&s) != 0) e(70); if (s != s_empty) e(71); } /*---------------------------------------------------------------------------*/ int x; sigset_t glo_vol_set; void catch1(signo) int signo; { x = 42; } void catch2(signo) int signo; { if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, (sigset_t *) &glo_vol_set) != 0) e(1); } /* Verify that signal(2), which is now built on top of sigaction(2), still * works. */ void test8c() { pid_t pid; sigset_t sigset_var; subtest = 3; clearsigstate(); x = 0; /* Verify an installed signal handler persists across a fork(2). */ if (signal(SIGTERM, catch1) == SIG_ERR) e(1); switch (pid = fork()) { case 0: /* child */ errct = 0; while (x == 0); if (x != 42) e(2); exit(errct == 0 ? 0 : 1); case -1: e(3); break; default: /* parent */ sleep(1); if (kill(pid, SIGTERM) != 0) e(4); wait_for(pid); break; } /* Verify that the return value is the previous handler. */ signal(SIGINT, SIG_IGN); if (signal(SIGINT, catch2) != SIG_IGN) e(5); if (signal(SIGINT, catch1) != catch2) e(6); if (signal(SIGINT, SIG_DFL) != catch1) e(7); if (signal(SIGINT, catch1) != SIG_DFL) e(8); if (signal(SIGINT, SIG_DFL) != catch1) e(9); if (signal(SIGINT, SIG_DFL) != SIG_DFL) e(10); if (signal(SIGINT, catch1) != SIG_DFL) e(11); /* Verify that SIG_ERR is correctly generated. */ if (signal(_NSIG + 1, catch1) != SIG_ERR) e(12); if (signal(0, catch1) != SIG_ERR) e(13); if (signal(-1, SIG_DFL) != SIG_ERR) e(14); /* Verify that caught signals are automatically reset to the default, * and that further instances of the same signal are not blocked here * or in the signal handler. */ if (signal(SIGTERM, catch1) == SIG_ERR) e(15); switch ((pid = fork())) { case 0: /* child */ errct = 0; while (x == 0); if (x != 42) e(16); if (sigismember((sigset_t *) &glo_vol_set, SIGTERM)) e(17); if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &sigset_var) != 0) e(18); if (sigismember(&sigset_var, SIGTERM)) e(19); #if 0 /* Use this if you have compiled signal() to have the broken SYSV behaviour. */ if (signal(SIGTERM, catch1) != SIG_DFL) e(20); #else if (signal(SIGTERM, catch1) != catch1) e(20); #endif exit(errct == 0 ? 0 : 1); default: /* parent */ sleep(1); if (kill(pid, SIGTERM) != 0) e(21); wait_for(pid); break; case -1: e(22); break; } } /*---------------------------------------------------------------------------*/ /* Test that the signal handler can be invoked recursively with the * state being properly saved and restored. */ static int y; static int z; void catch3(signo) int signo; { if (z == 1) { /* catching a nested signal */ y = 2; return; } z = 1; if (kill(getpid(), SIGHUP) != 0) e(1); while (y != 2); y = 1; } void test8d() { struct sigaction act; subtest = 4; clearsigstate(); y = 0; z = 0; act.sa_handler = catch3; act.sa_mask = 0; act.sa_flags = SA_NODEFER; /* Otherwise, nested occurence of * SIGINT is blocked. */ if (sigaction(SIGHUP, &act, (struct sigaction *) NULL) != 0) e(2); if (kill(getpid(), SIGHUP) != 0) e(3); if (y != 1) e(4); } /*---------------------------------------------------------------------------*/ /* Test that the signal mask in effect for the duration of a signal handler * is as specified in POSIX Section 3, lines 718 -724. Test that the * previous signal mask is restored when the signal handler returns. */ void catch4(signo) int signo; { sigset_t oset; sigset_t set; if (sigemptyset(&set) == -1) e(5001); if (sigaddset(&set, SIGTERM) == -1) e(5002); if (sigaddset(&set, SIGHUP) == -1) e(5003); if (sigaddset(&set, SIGINT) == -1) e(5004); if (sigaddset(&set, SIGPIPE) == -1) e(5005); if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset) != 0) e(5006); if (oset != set) e(5007); } void test8e() { struct sigaction act, oact; sigset_t set, oset; subtest = 5; clearsigstate(); act.sa_handler = catch4; sigemptyset(&act.sa_mask); sigaddset(&act.sa_mask, SIGTERM); sigaddset(&act.sa_mask, SIGHUP); act.sa_flags = 0; if (sigaction(SIGINT, &act, &oact) == -1) e(2); if (sigemptyset(&set) == -1) e(3); if (sigaddset(&set, SIGPIPE) == -1) e(4); if (sigprocmask(SIG_SETMASK, &set, &oset) == -1) e(5); if (kill(getpid(), SIGINT) == -1) e(6); if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &oset) == -1) e(7); if (sigemptyset(&set) == -1) e(8); if (sigaddset(&set, SIGPIPE) == -1) e(9); if (set != oset) e(10); } /*---------------------------------------------------------------------------*/ /* Test the basic functionality of sigsuspend(2). */ void catch5(signo) int signo; { x = 1; } void test8f() { sigset_t set; int r; struct sigaction act; pid_t pid; subtest = 6; clearsigstate(); switch (pid = fork()) { case 0: /* child */ errct = 0; sleep(1); if (kill(getppid(), SIGINT) == -1) e(1); exit(errct == 0 ? 0 : 1); case -1: e(2); break; default: /* parent */ if (sigemptyset(&act.sa_mask) == -1) e(3); act.sa_flags = 0; act.sa_handler = catch5; if (sigaction(SIGINT, &act, (struct sigaction *) NULL) == -1) e(4); if (sigemptyset(&set) == -1) e(5); r = sigsuspend(&set); if (r != -1 || errno != EINTR || x != 1) e(6); wait_for(pid); break; } } /*----------------------------------------------------------------------*/ /* Test that sigsuspend() does block the signals specified in its * argument, and after sigsuspend returns, the previous signal * mask is restored. * * The child sends two signals to the parent SIGINT and then SIGPIPE, * separated by a long delay. The parent executes sigsuspend() with * SIGINT blocked. It is expected that the parent's SIGPIPE handler * will be invoked, then sigsuspend will return restoring the * original signal mask, and then the SIGPIPE handler will be * invoked. */ void sigint_handler(signo) int signo; { x = 1; z++; } void sigpipe_handler(signo) int signo; { x = 2; z++; } void test8g() { sigset_t set; int r; struct sigaction act; pid_t pid; subtest = 7; clearsigstate(); x = 0; z = 0; switch (pid = fork()) { case 0: /* child */ errct = 0; sleep(1); if (kill(getppid(), SIGINT) == -1) e(1); sleep(1); if (kill(getppid(), SIGPIPE) == -1) e(2); exit(errct == 0 ? 0 : 1); case -1: e(3); break; default: /* parent */ if (sigemptyset(&act.sa_mask) == -1) e(3); act.sa_flags = 0; act.sa_handler = sigint_handler; if (sigaction(SIGINT, &act, (struct sigaction *) NULL) == -1) e(4); act.sa_handler = sigpipe_handler; if (sigaction(SIGPIPE, &act, (struct sigaction *) NULL) == -1) e(5); if (sigemptyset(&set) == -1) e(6); if (sigaddset(&set, SIGINT) == -1) e(7); r = sigsuspend(&set); if (r != -1) e(8); if (errno != EINTR) e(9); if (z != 2) e(10); if (x != 1) e(11); wait_for(pid); break; } } /*--------------------------------------------------------------------------*/ /* Test that sigsuspend() does block the signals specified in its * argument, and after sigsuspend returns, the previous signal * mask is restored. * * The child sends three signals to the parent: SIGHUP, then SIGPIPE, * and then SIGTERM, separated by a long delay. The parent executes * sigsuspend() with SIGHUP and SIGPIPE blocked. It is expected that * the parent's SIGTERM handler will be invoked first, then sigsuspend() * will return restoring the original signal mask, and then the other * two handlers will be invoked. */ void sighup8(signo) int signo; { x = 1; z++; } void sigpip8(signo) int signo; { x = 1; z++; } void sigter8(signo) int signo; { x = 2; z++; } void test8h() { sigset_t set; int r; struct sigaction act; pid_t pid; subtest = 8; clearsigstate(); x = 0; z = 0; switch (pid = fork()) { case 0: /* child */ errct = 0; sleep(1); if (kill(getppid(), SIGHUP) == -1) e(1); sleep(1); if (kill(getppid(), SIGPIPE) == -1) e(2); sleep(1); if (kill(getppid(), SIGTERM) == -1) e(3); exit(errct == 0 ? 0 : 1); case -1: e(5); break; default: /* parent */ if (sigemptyset(&act.sa_mask) == -1) e(6); act.sa_flags = 0; act.sa_handler = sighup8; if (sigaction(SIGHUP, &act, (struct sigaction *) NULL) == -1) e(7); act.sa_handler = sigpip8; if (sigaction(SIGPIPE, &act, (struct sigaction *) NULL) == -1) e(8); act.sa_handler = sigter8; if (sigaction(SIGTERM, &act, (struct sigaction *) NULL) == -1) e(9); if (sigemptyset(&set) == -1) e(10); if (sigaddset(&set, SIGHUP) == -1) e(11); if (sigaddset(&set, SIGPIPE) == -1) e(12); r = sigsuspend(&set); if (r != -1) e(13); if (errno != EINTR) e(14); if (z != 3) e(15); if (x != 1) e(16); wait_for(pid); break; } } /*--------------------------------------------------------------------------*/ /* Block SIGHUP and SIGTERM with sigprocmask(), send ourself SIGHUP * and SIGTERM, unblock these signals with sigprocmask, and verify * that these signals are delivered. */ void sighup9(signo) int signo; { y++; } void sigter9(signo) int signo; { z++; } void test8i() { sigset_t set; struct sigaction act; subtest = 9; clearsigstate(); y = 0; z = 0; if (sigemptyset(&act.sa_mask) == -1) e(1); act.sa_flags = 0; act.sa_handler = sighup9; if (sigaction(SIGHUP, &act, (struct sigaction *) NULL) == -1) e(2); act.sa_handler = sigter9; if (sigaction(SIGTERM, &act, (struct sigaction *) NULL) == -1) e(3); if (sigemptyset(&set) == -1) e(4); if (sigaddset(&set, SIGTERM) == -1) e(5); if (sigaddset(&set, SIGHUP) == -1) e(6); if (sigprocmask(SIG_SETMASK, &set, (sigset_t *)NULL) == -1) e(7); if (kill(getpid(), SIGHUP) == -1) e(8); if (kill(getpid(), SIGTERM) == -1) e(9); if (y != 0) e(10); if (z != 0) e(11); if (sigemptyset(&set) == -1) e(12); if (sigprocmask(SIG_SETMASK, &set, (sigset_t *)NULL) == -1) e(12); if (y != 1) e(13); if (z != 1) e(14); } /*---------------------------------------------------------------------------*/ /* Block SIGINT and then send this signal to ourself. * * Install signal handlers for SIGALRM and SIGINT. * * Set an alarm for 6 seconds, then sleep for 7. * * The SIGALRM should interrupt the sleep, but the SIGINT * should remain pending. */ void sighup10(signo) int signo; { y++; } void sigalrm_handler10(signo) int signo; { z++; } void test8j() { sigset_t set, set2; struct sigaction act; subtest = 10; clearsigstate(); y = 0; z = 0; if (sigemptyset(&act.sa_mask) == -1) e(1); act.sa_flags = 0; act.sa_handler = sighup10; if (sigaction(SIGHUP, &act, (struct sigaction *) NULL) == -1) e(2); act.sa_handler = sigalrm_handler10; if (sigaction(SIGALRM, &act, (struct sigaction *) NULL) == -1) e(3); if (sigemptyset(&set) == -1) e(4); if (sigaddset(&set, SIGHUP) == -1) e(5); if (sigprocmask(SIG_SETMASK, &set, (sigset_t *)NULL) == -1) e(6); if (kill(getpid(), SIGHUP) == -1) e(7); if (sigpending(&set) == -1) e(8); if (sigemptyset(&set2) == -1) e(9); if (sigaddset(&set2, SIGHUP) == -1) e(10); if (set2 != set) e(11); alarm(6); sleep(7); if (sigpending(&set) == -1) e(12); if (set != set2) e(13); if (y != 0) e(14); if (z != 1) e(15); } /*--------------------------------------------------------------------------*/ void test8k() { subtest = 11; } void test8l() { subtest = 12; } /*---------------------------------------------------------------------------*/ /* Basic test for setjmp/longjmp. This includes testing that the * signal mask is properly restored. */ void test8m() { jmp_buf jb; sigset_t ss; subtest = 13; clearsigstate(); ss = 0x32; if (sigprocmask(SIG_SETMASK, &ss, (sigset_t *)NULL) == -1) e(1); if (setjmp(jb)) { if (sigprocmask(SIG_BLOCK, (sigset_t *)NULL, &ss) == -1) e(2); if (ss != 0x32) e(388); return; } ss = 0x3abc; if (sigprocmask(SIG_SETMASK, &ss, (sigset_t *)NULL) == -1) e(4); longjmp(jb, 1); } void longjerr() { e(5); } /*--------------------------------------------------------------------------*/ /* Test for setjmp/longjmp. * * Catch a signal. While in signal handler do setjmp/longjmp. */ void catch14(signo, code, scp) int signo; int code; struct sigcontext *scp; { jmp_buf jb; if (setjmp(jb)) { x++; sigreturn(scp); e(1); } y++; longjmp(jb, 1); e(2); } void test8n() { struct sigaction act; typedef _PROTOTYPE( void (*sighandler_t), (int sig) ); subtest = 14; clearsigstate(); x = 0; y = 0; act.sa_flags = 0; act.sa_mask = 0; act.sa_handler = (sighandler_t) catch14; /* fudge */ if (sigaction(SIGSEGV, &act, (struct sigaction *) NULL) == -1) e(3); if (kill(getpid(), SIGSEGV) == -1) e(4); if (x != 1) e(5); if (y != 1) e(6); } /*---------------------------------------------------------------------------*/ /* Test for setjmp/longjmp. * * Catch a signal. Longjmp out of signal handler. */ jmp_buf glo_jb; void catch15(signo) int signo; { z++; longjmp(glo_jb, 7); e(1); } void test8o() { struct sigaction act; int k; subtest = 15; clearsigstate(); z = 0; act.sa_flags = 0; act.sa_mask = 0; act.sa_handler = catch15; if (sigaction(SIGALRM, &act, (struct sigaction *) NULL) == -1) e(2); if ((k = setjmp(glo_jb))) { if (z != 1) e(399); if (k != 7) e(4); return; } if (kill(getpid(), SIGALRM) == -1) e(5); } void clearsigstate() { int i; sigset_t sigset_var; /* Clear the signal state. */ for (i = 1; i <= _NSIG; i++) signal(i, SIG_IGN); for (i = 1; i <= _NSIG; i++) signal(i, SIG_DFL); sigfillset(&sigset_var); sigprocmask(SIG_UNBLOCK, &sigset_var, (sigset_t *)NULL); } void quit() { chdir(".."); system("rm -rf DIR*"); if (errct == 0) { printf("ok\n"); exit(0); } else { printf("%d errors\n", errct); exit(4); } } void wait_for(pid) pid_t pid; { /* Expect exactly one child, and that it exits with 0. */ int r; int status; errno = 0; while (1) { errno = 0; r = wait(&status); if (r == pid) { errno = 0; if (status != 0) e(90); return; } if (r < 0) { e(91); return; } e(92); } } void e(n) int n; { char msgbuf[80]; sprintf(msgbuf, "Subtest %d, error %d errno=%d ", subtest, n, errno); perror(msgbuf); if (errct++ > MAX_ERROR) { fprintf(stderr, "Too many errors; test aborted\n"); chdir(".."); system("rm -rf DIR*"); exit(1); } } /* Test 9 setjmp with register variables. Author: Ceriel Jacobs */ #include #include #include #define MAX_ERROR 4 #include "common.c" char *tmpa; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void test9a, (void)); _PROTOTYPE(void test9b, (void)); _PROTOTYPE(void test9c, (void)); _PROTOTYPE(void test9d, (void)); _PROTOTYPE(void test9e, (void)); _PROTOTYPE(void test9f, (void)); _PROTOTYPE(char *addr, (void)); _PROTOTYPE(void garbage, (void)); _PROTOTYPE(void level1, (void)); _PROTOTYPE(void level2, (void)); _PROTOTYPE(void dolev, (void)); _PROTOTYPE(void catch, (int s)); _PROTOTYPE(void hard, (void)); int main(argc, argv) int argc; char *argv[]; { jmp_buf envm; int i, j, m = 0xFFFF; start(9); if (argc == 2) m = atoi(argv[1]); for (j = 0; j < 100; j++) { if (m & 00001) test9a(); if (m & 00002) test9b(); if (m & 00004) test9c(); if (m & 00010) test9d(); if (m & 00020) test9e(); if (m & 00040) test9f(); } if (errct) quit(); i = 1; if (setjmp(envm) == 0) { i = 2; longjmp(envm, 1); } else { if (i == 2) { /* Correct */ } else if (i == 1) { printf("WARNING: The setjmp/longjmp of this machine restore register variables\n\ to the value they had at the time of the Setjmp\n"); } else { printf("Aha, I just found one last error\n"); return 1; } } quit(); return(-1); /* impossible */ } void test9a() { register p; subtest = 1; p = 200; garbage(); if (p != 200) e(1); } void test9b() { register p, q; subtest = 2; p = 200; q = 300; garbage(); if (p != 200) e(1); if (q != 300) e(2); } void test9c() { register p, q, r; subtest = 3; p = 200; q = 300; r = 400; garbage(); if (p != 200) e(1); if (q != 300) e(2); if (r != 400) e(3); } char buf[512]; void test9d() { register char *p; subtest = 4; p = &buf[100]; garbage(); if (p != &buf[100]) e(1); } void test9e() { register char *p, *q; subtest = 5; p = &buf[100]; q = &buf[200]; garbage(); if (p != &buf[100]) e(1); if (q != &buf[200]) e(2); } void test9f() { register char *p, *q, *r; subtest = 6; p = &buf[100]; q = &buf[200]; r = &buf[300]; garbage(); if (p != &buf[100]) e(1); if (q != &buf[200]) e(2); if (r != &buf[300]) e(3); } jmp_buf env; /* return address of local variable. This way we can check that the stack is not polluted. */ char * addr() { char a; return &a; } void garbage() { register i, j, k; register char *p, *q, *r; char *a; p = &buf[300]; q = &buf[400]; r = &buf[500]; i = 10; j = 20; k = 30; switch (setjmp(env)) { case 0: a = addr(); #ifdef __GNUC__ /* * to defeat the smartness of the GNU C optimizer we pretend we * use 'a'. Otherwise the optimizer will not detect the looping * effectuated by setjmp/longjmp, so that it thinks it can get * rid of the assignment to 'a'. */ srand((unsigned)&a); #endif longjmp(env, 1); break; case 1: if (i != 10) e(11); if (j != 20) e(12); if (k != 30) e(13); if (p != &buf[300]) e(14); if (q != &buf[400]) e(15); if (r != &buf[500]) e(16); tmpa = addr(); if (a != tmpa) e(17); level1(); break; case 2: if (i != 10) e(21); if (j != 20) e(22); if (k != 30) e(23); if (p != &buf[300]) e(24); if (q != &buf[400]) e(25); if (r != &buf[500]) e(26); tmpa = addr(); if (a != tmpa) e(27); level2(); break; case 3: if (i != 10) e(31); if (j != 20) e(32); if (k != 30) e(33); if (p != &buf[300]) e(34); if (q != &buf[400]) e(35); if (r != &buf[500]) e(36); tmpa = addr(); if (a != tmpa) e(37); hard(); case 4: if (i != 10) e(41); if (j != 20) e(42); if (k != 30) e(43); if (p != &buf[300]) e(44); if (q != &buf[400]) e(45); if (r != &buf[500]) e(46); tmpa = addr(); if (a != tmpa) e(47); return; break; default: e(100); } e(200); } void level1() { register char *p; register i; i = 1000; p = &buf[10]; i = 200; p = &buf[20]; longjmp(env, 2); } void level2() { register char *p; register i; i = 0200; p = &buf[2]; *p = i; dolev(); } void dolev() { register char *p; register i; i = 010; p = &buf[3]; *p = i; longjmp(env, 3); } void catch(s) int s; { longjmp(env, 4); } void hard() { register char *p; signal(SIGHUP, catch); for (p = buf; p <= &buf[511]; p++) *p = 025; kill(getpid(), SIGHUP); } <...=...>Makefile?init.c@mkbootAps.cBtell_config# Makefile for the kernel image. # u=/usr CC= exec cc CFLAGS= -O -D_MINIX -D_POSIX_SOURCE MDEC= /usr/mdec MAKE= exec make -$(MAKEFLAGS) PROGRAMS= ../kernel/kernel ../mm/mm ../fs/fs init programs: cd ../kernel && $(MAKE) cd ../mm && $(MAKE) cd ../fs && $(MAKE) $(MAKE) image image: $(PROGRAMS) installboot -image $@ $(PROGRAMS) init: init.c $(CC) $(CFLAGS) init.c -o $@ install -S 192w $@ ps: ps.c /usr/include/minix/config.h /usr/include/minix/const.h \ ../kernel/const.h ../kernel/type.h \ ../kernel/proc.h ../mm/mproc.h \ ../fs/fproc.h ../fs/const.h $(CC) -i $(CFLAGS) -o $@ ps.c install -S 16kw $@ /usr/bin/ps: ps install -cs -o bin -g kmem -m 2755 $? $@ bootable: exec su root mkboot bootable hdboot: programs exec sh mkboot $@ fdboot: programs exec su root mkboot $@ all install clean:: cd ../kernel && $(MAKE) $@ cd ../mm && $(MAKE) $@ cd ../fs && $(MAKE) $@ all:: ps install:: /usr/bin/ps clean:: rm -f *.bak init ps image /* This process is the father (mother) of all Minix user processes. When * Minix comes up, this is process number 2, and has a pid of 1. It * executes the /etc/rc shell file, and then reads the /etc/ttytab file to * determine which terminals need a login process. * * If the files /usr/adm/wtmp and /etc/utmp exist and are writable, init * (with help from login) will maintain login accounting. Sending a * signal 1 (SIGHUP) to init will cause it to rescan /etc/ttytab and start * up new shell processes if necessary. It will not, however, kill off * login processes for lines that have been turned off; do this manually. * Signal 15 (SIGTERM) makes init stop spawning new processes, this is * used by shutdown and friends when they are about to close the system * down. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Command to execute as a response to the three finger salute. */ char *REBOOT_CMD[] = { "shutdown", "now", "CTRL-ALT-DEL", NULL }; /* Associated fake ttytab entry. */ struct ttyent TT_REBOOT = { "console", "-", REBOOT_CMD, NULL }; char PATH_UTMP[] = "/etc/utmp"; /* current logins */ char PATH_WTMP[] = "/usr/adm/wtmp"; /* login/logout history */ #define PIDSLOTS 32 /* first this many ttys can be on */ struct slotent { int errct; /* error count */ pid_t pid; /* pid of login process for this tty line */ }; #define ERRCT_DISABLE 10 /* disable after this many errors */ #define NO_PID 0 /* pid value indicating no process */ struct slotent slots[PIDSLOTS]; /* init table of ttys and pids */ int gothup = 0; /* flag, showing signal 1 was received */ int gotabrt = 0; /* flag, showing signal 6 was received */ int spawn = 1; /* flag, spawn processes only when set */ void tell(int fd, char *s); void report(int fd, char *label); void wtmp(int type, int linenr, char *line, pid_t pid); void startup(int linenr, struct ttyent *ttyp); int execute(char **cmd); void onhup(int sig); void onterm(int sig); void onabrt(int sig); int main(void) { pid_t pid; /* pid of child process */ int fd; /* generally useful */ int linenr; /* loop variable */ int check; /* check if a new process must be spawned */ struct slotent *slotp; /* slots[] pointer */ struct ttyent *ttyp; /* ttytab entry */ struct sigaction sa; struct stat stb; if (fstat(0, &stb) < 0) { /* Open standard input, output & error. */ (void) open("/dev/null", O_RDONLY); (void) open("/dev/log", O_WRONLY); dup(1); } sigemptyset(&sa.sa_mask); sa.sa_flags = 0; /* Hangup: Reexamine /etc/ttytab for newly enabled terminal lines. */ sa.sa_handler = onhup; sigaction(SIGHUP, &sa, NULL); /* Terminate: Stop spawning login processes, shutdown is near. */ sa.sa_handler = onterm; sigaction(SIGTERM, &sa, NULL); /* Abort: Sent by the kernel on CTRL-ALT-DEL; shut the system down. */ sa.sa_handler = onabrt; sigaction(SIGABRT, &sa, NULL); /* Execute the /etc/rc file. */ if ((pid = fork()) != 0) { /* Parent just waits. */ while (wait(NULL) != pid) { if (gotabrt) reboot(RBT_HALT); } } else { struct sysgetenv sysgetenv; char bootopts[16]; static char *rc_command[] = { "sh", "/etc/rc", NULL, NULL, NULL }; char **rcp = rc_command + 2; /* Get the boot options from the boot environment. */ sysgetenv.key = "bootopts"; sysgetenv.keylen = 8+1; sysgetenv.val = bootopts; sysgetenv.vallen = sizeof(bootopts); if (svrctl(SYSGETENV, &sysgetenv) == 0) *rcp++ = bootopts; *rcp = "start"; execute(rc_command); report(2, "sh /etc/rc"); _exit(1); /* impossible, we hope */ } /* Clear /etc/utmp if it exists. */ if ((fd = open(PATH_UTMP, O_WRONLY | O_TRUNC)) >= 0) close(fd); /* Log system reboot. */ wtmp(BOOT_TIME, 0, NULL, 0); /* Main loop. If login processes have already been started up, wait for one * to terminate, or for a HUP signal to arrive. Start up new login processes * for all ttys which don't have them. Note that wait() also returns when * somebody's orphan dies, in which case ignore it. If the TERM signal is * sent then stop spawning processes, shutdown time is near. */ check = 1; while (1) { while ((pid = waitpid(-1, NULL, check ? WNOHANG : 0)) > 0) { /* Search to see which line terminated. */ for (linenr = 0; linenr < PIDSLOTS; linenr++) { slotp = &slots[linenr]; if (slotp->pid == pid) { /* Record process exiting. */ wtmp(DEAD_PROCESS, linenr, NULL, pid); slotp->pid = NO_PID; check = 1; } } } /* If a signal 1 (SIGHUP) is received, simply reset error counts. */ if (gothup) { gothup = 0; for (linenr = 0; linenr < PIDSLOTS; linenr++) { slots[linenr].errct = 0; } check = 1; } /* Shut down on signal 6 (SIGABRT). */ if (gotabrt) { gotabrt = 0; startup(0, &TT_REBOOT); } if (spawn && check) { /* See which lines need a login process started up. */ for (linenr = 0; linenr < PIDSLOTS; linenr++) { slotp = &slots[linenr]; if ((ttyp = getttyent()) == NULL) break; if (ttyp->ty_getty != NULL && ttyp->ty_getty[0] != NULL && slotp->pid == NO_PID && slotp->errct < ERRCT_DISABLE) { startup(linenr, ttyp); } } endttyent(); } check = 0; } } void onhup(int sig) { gothup = 1; spawn = 1; } void onterm(int sig) { spawn = 0; } void onabrt(int sig) { static int count; if (++count == 2) reboot(RBT_HALT); gotabrt = 1; } void startup(int linenr, struct ttyent *ttyp) { /* Fork off a process for the indicated line. */ struct slotent *slotp; /* pointer to ttyslot */ pid_t pid; /* new pid */ int err[2]; /* error reporting pipe */ char line[32]; /* tty device name */ int status; slotp = &slots[linenr]; /* Error channel for between fork and exec. */ if (pipe(err) < 0) err[0] = err[1] = -1; if ((pid = fork()) == -1 ) { report(2, "fork()"); sleep(10); return; } if (pid == 0) { /* Child */ close(err[0]); fcntl(err[1], F_SETFD, fcntl(err[1], F_GETFD) | FD_CLOEXEC); /* A new session. */ setsid(); /* Construct device name. */ strcpy(line, "/dev/"); strncat(line, ttyp->ty_name, sizeof(line) - 6); /* Open the line for standard input and output. */ close(0); close(1); if (open(line, O_RDWR) < 0 || dup(0) < 0) { write(err[1], &errno, sizeof(errno)); _exit(1); } if (ttyp->ty_init != NULL && ttyp->ty_init[0] != NULL) { /* Execute a command to initialize the terminal line. */ if ((pid = fork()) == -1) { report(2, "fork()"); errno= 0; write(err[1], &errno, sizeof(errno)); _exit(1); } if (pid == 0) { alarm(10); execute(ttyp->ty_init); report(2, ttyp->ty_init[0]); _exit(1); } while (waitpid(pid, &status, 0) != pid) {} if (status != 0) { tell(2, "init: "); tell(2, ttyp->ty_name); tell(2, ": "); tell(2, ttyp->ty_init[0]); tell(2, ": bad exit status\n"); errno = 0; write(err[1], &errno, sizeof(errno)); _exit(1); } } /* Redirect standard error too. */ dup2(0, 2); /* Execute the getty process. */ execute(ttyp->ty_getty); /* Oops, disaster strikes. */ fcntl(2, F_SETFL, fcntl(2, F_GETFL) | O_NONBLOCK); if (linenr != 0) report(2, ttyp->ty_getty[0]); write(err[1], &errno, sizeof(errno)); _exit(1); } /* Parent */ if (ttyp != &TT_REBOOT) slotp->pid = pid; close(err[1]); if (read(err[0], &errno, sizeof(errno)) != 0) { /* If an errno value goes down the error pipe: Problems. */ switch (errno) { case ENOENT: case ENODEV: case ENXIO: /* Device nonexistent, no driver, or no minor device. */ slotp->errct = ERRCT_DISABLE; close(err[0]); return; case 0: /* Error already reported. */ break; default: /* Any other error on the line. */ report(2, ttyp->ty_name); } close(err[0]); if (++slotp->errct >= ERRCT_DISABLE) { tell(2, "init: "); tell(2, ttyp->ty_name); tell(2, ": excessive errors, shutting down\n"); } else { sleep(5); } return; } close(err[0]); if (ttyp != &TT_REBOOT) wtmp(LOGIN_PROCESS, li6666nenr, ttyp->ty_name, pid); slotp->errct = 0; } int execute(char **cmd) { /* Execute a command with a path search along /sbin:/bin:/usr/sbin:/usr/bin. */ static char *nullenv[] = { NULL }; char command[128]; char *path[] = { "/sbin", "/bin", "/usr/sbin", "/usr/bin" }; int i; if (cmd[0][0] == '/') { /* A full path. */ return execve(cmd[0], cmd, nullenv); } /* Path search. */ for (i = 0; i < 4; i++) { if (strlen(path[i]) + 1 + strlen(cmd[0]) + 1 > sizeof(command)) { errno= ENAMETOOLONG; return -1; } strcpy(command, path[i]); strcat(command, "/"); strcat(command, cmd[0]); execve(command, cmd, nullenv); if (errno != ENOENT) break; } return -1; } void wtmp(type, linenr, line, pid) int type; /* type of entry */ int linenr; /* line number in ttytab */ char *line; /* tty name (only good on login) */ pid_t pid; /* pid of process */ { /* Log an event into the UTMP and WTMP files. */ struct utmp utmp; /* UTMP/WTMP User Accounting */ int fd; /* Clear the utmp record. */ memset((void *) &utmp, 0, sizeof(utmp)); /* Fill in utmp. */ switch (type) { case BOOT_TIME: /* Make a special reboot record. */ strcpy(utmp.ut_name, "reboot"); strcpy(utmp.ut_line, "~"); break; case LOGIN_PROCESS: /* A new login, fill in line name. */ strncpy(utmp.ut_line, line, sizeof(utmp.ut_line)); break; case DEAD_PROCESS: /* A logout. Use the current utmp entry, but make sure it is a * user process exiting, and not getty or login giving up. */ if ((fd = open(PATH_UTMP, O_RDONLY)) < 0) { if (errno != ENOENT) report(2, PATH_UTMP); return; } if (lseek(fd, (off_t) (linenr+1) * sizeof(utmp), SEEK_SET) == -1 || read(fd, &utmp, sizeof(utmp)) == -1 ) { report(2, PATH_UTMP); close(fd); return; } close(fd); if (utmp.ut_type != USER_PROCESS) return; strncpy(utmp.ut_name, "", sizeof(utmp.ut_name)); break; } /* Finish new utmp entry. */ utmp.ut_pid = pid; utmp.ut_type = type; utmp.ut_time = time((time_t *) 0); switch (type) { case LOGIN_PROCESS: case DEAD_PROCESS: /* Write new entry to utmp. */ if ((fd = open(PATH_UTMP, O_WRONLY)) < 0 || lseek(fd, (off_t) (linenr+1) * sizeof(utmp), SEEK_SET) == -1 || write(fd, &utmp, sizeof(utmp)) == -1 ) { if (errno != ENOENT) report(2, PATH_UTMP); } if (fd != -1) close(fd); break; } switch (type) { case BOOT_TIME: case DEAD_PROCESS: /* Add new wtmp entry. */ if ((fd = open(PATH_WTMP, O_WRONLY | O_APPEND)) < 0 || write(fd, &utmp, sizeof(utmp)) == -1 ) { if (errno != ENOENT) report(2, PATH_WTMP); } if (fd != -1) close(fd); break; } } void tell(fd, s) int fd; char *s; { write(fd, s, strlen(s)); } void report(fd, label) int fd; char *label; { int err = errno; tell(fd, "init: "); tell(fd, label); tell(fd, ": "); tell(fd, strerror(err)); tell(fd, "\n"); errno= err; } #!/bin/sh # # mkboot 2.0 - make boot floppy, make root device bootable, etc. # Author: Kees J. Bot trap 'e=$?; rm -f /tmp/mkb.$$; exit $e' 0 2 mdec=/usr/mdec # bootstraps # Check arguments. case "$#:$1" in 1:bootable | 1:hdboot | [12]:fdboot) action=$1 dev=$2 ;; *) echo "Usage: $0 [bootable | hdboot | fdboot [device]]" >&2 exit 1 esac # Get the device table. . /etc/fstab # The real root device may be the RAM disk. realroot=`printroot -r` case $action in bootable | hdboot) # We need the root device. if [ $realroot = $root ] then rootdir= else umount $root 2>/dev/null mount $root /root || exit rootdir=/root fi esac case $action in bootable) # Install the boot monitor on the root device and make it bootable. install -cs -m 644 $mdec/boot $rootdir/boot || exit sync installboot -device $root $mdec/bootblock /boot || exit test $realroot != $root && umount $root ;; hdboot) # Install a new image on the root device. if [ ! -d $rootdir/minix ] then # /minix is not yet a directory! Fix it. su root -c \ "exec mv $rootdir/minix /M" install -d $rootdir/minix su root -c \ "exec mv $rootdir/M $rootdir/minix/`uname -r`.`uname -v`" fi ./tell_config OS_RELEASE . OS_VERSION >/tmp/mkb.$$ version=`sed 's/[" ]//g;/^$/d' /dev/null` oldrev=$revision target="${version}r${revision}" if [ -z "$revision" ] then revision=0 elif [ -f $rootdir/minix/$target ] then if [ $rootdir/minix/$target -newer image ] then echo "$root:/minix/$target is up to date" test $realroot != $root && umount $root exit 0 fi revision=`expr $revision + 1` fi target="${version}r${revision}" set -- `ls -t $rootdir/minix` case $# in 0|1) # Not much there, do not remove a thing. ;; *) # Remove the newest image in /minix. This seems strange, but # the old image is normally the "stable" image. echo "rm $root:/minix/$1" rm -f "$rootdir/minix/$1" esac # Install the new image. echo "cp image $root:/minix/$target" cp -p image $rootdir/minix/$target || exit # Save the revision number. test "$revision" != "$oldrev" && echo $revision >revision test $realroot != $root && umount $root echo "Done." ;; fdboot) # fdboot: Make a boot floppy. if [ -z "$dev" ] then echo -n \ "Finish the name of the floppy device to write (by default 'fd0'): /dev/"; read dev case "$dev" in '') dev=/dev/fd0 ;; /dev/*) ;; *) dev=/dev/$dev esac fi # Make a file system. umount $dev 2>/dev/null mkfs -i 512 $dev || exit # Install /dev, /boot and /minix. mount $dev /mnt || exit cpdir /dev /mnt/dev || exit cp -p $mdec/boot /mnt/boot || exit cp -p image /mnt/minix || exit umount $dev || exit # Make bootable and copy the boot parameters. installboot -d $dev $mdec/bootblock boot || exit dd if=$root of=$dev skip=1 seek=1 count=1 conv=silent || exit edparams $dev 'main(){delay 2000;boot}; save' || exit echo "Test kernel installed on $dev with boot parameters from $root" esac exit 0 /* ps - print status Author: Peter Valkenburg */ /* Ps.c, Peter Valkenburg (valke@psy.vu.nl), january 1990. * * This is a V7 ps(1) look-alike for MINIX >= 1.5.0. * It does not support the 'k' option (i.e. cannot read memory from core file). * If you want to compile this for non-IBM PC architectures, the header files * require that you have your CHIP, MACHINE etc. defined. * Full syntax: * ps [-][alx] * Option `a' gives all processes, `l' for detailed info, `x' includes even * processes without a terminal. * * VERY IMPORTANT NOTE: * To compile ps, the kernel/, fs/ and mm/ source directories must be in * ../ relative to the directory where ps is compiled (normally the * tools source directory). * * If you want your ps to be useable by anyone, you can arrange the * following access permissions (note the protected memory files and set * *group* id on ps): * -rwxr-sr-x 1 bin kmem 11916 Jul 4 15:31 /bin/ps * crw-r----- 1 bin kmem 1, 1 Jan 1 1970 /dev/mem * crw-r----- 1 bin kmem 1, 2 Jan 1 1970 /dev/kmem */ /* Some technical comments on this implementation: * * Most fields are similar to V7 ps(1), except for CPU, NICE, PRI which are * absent, RECV which replaces WCHAN, and PGRP that is an extra. * The info is obtained from the following fields of proc, mproc and fproc: * F - kernel status field, p_flags * S - kernel status field, p_flags; mm status field, mp_flags (R if p_flags * is 0; Z if mp_flags == ZOMBIE; T if mp_flags == STOPPED; else W). * UID - mm eff uid field, mp_effuid * PID - mm pid field, mp_pid * PPID - mm parent process index field, mp_parent (used as index in proc). * PGRP - mm process group field, mp_procgrp * SZ - kernel text size + physical stack address - physical data address * + stack size * p_map[T].mem_len + p_map[S].mem_phys - p_map[D].mem_phys * + p_map[S].mem_len * RECV - kernel process index field for message receiving, p_getfrom * If sleeping, mm's mp_flags, or fs's fp_task are used for more info. * TTY - fs controlling tty device field, fp_tty. * TIME - kernel user + system times fields, user_time + sys_time * CMD - system process index (converted to mnemonic name by using the p_name * field), or user process argument list (obtained by reading the stack * frame; the resulting address is used to get the argument vector from * user space and converted into a concatenated argument list). */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../kernel/const.h" #include "../kernel/type.h" #include "../kernel/proc.h" #undef printf /* kernel's const.h defined this */ #include "../mm/mproc.h" #include "../fs/fproc.h" #include "../fs/const.h" #undef printf /* fs's const.h defined this */ /*----- ps's local stuff below this line ------*/ #define mindev(dev) (((dev)>>MINOR) & 0377) /* yield minor device */ #define majdev(dev) (((dev)>>MAJOR) & 0377) /* yield major device */ #define TTY_MAJ 4 /* major device of console */ /* Structure for tty name info. */ typedef struct { char tty_name[NAME_MAX + 1]; /* file name in /dev */ dev_t tty_dev; /* major/minor pair */ } ttyinfo_t; ttyinfo_t *ttyinfo; /* ttyinfo holds actual tty info */ size_t n_ttyinfo; /* Number of tty info slots */ /* Macro to convert memory offsets to rounded kilo-units */ #define off_to_k(off) ((unsigned) (((off) + 512) / 1024)) /* Number of tasks and processes. */ int nr_tasks, nr_procs; /* Process tables of the kernel, MM, and FS. */ struct proc *ps_proc; struct mproc *ps_mproc; struct fproc *ps_fproc; /* Where is INIT? */ int init_proc_nr; #define low_user init_proc_nr #define KMEM_PATH "/dev/kmem" /* opened for kernel proc table */ #define MEM_PATH "/dev/mem" /* opened for mm/fs + user processes */ int kmemfd, memfd; /* file descriptors of [k]mem */ /* Short and long listing formats: * * PID TTY TIME CMD * ppppp tttmmm:ss cccccccccc... * * F S UID PID PPID PGRP SZ RECV TTY TIME CMD * fff s uuu ppppp ppppp ppppp ssss rrrrrrrrrr tttmmm:ss cccccccc... */ #define S_HEADER " PID TTY TIME CMD\n" #define S_FORMAT "%5s %3s %s %s\n" #define L_HEADER " F S UID PID PPID PGRP SZ RECV TTY TIME CMD\n" #define L_FORMAT "%3o %c %3d %5s %5d %5d %4d %10s %3s %s %s\n" struct pstat { /* structure filled by pstat() */ dev_t ps_dev; /* major/minor of controlling tty */ uid_t ps_ruid; /* real uid */ uid_t ps_euid; /* effective uid */ pid_t ps_pid; /* process id */ pid_t ps_ppid; /* parent process id */ int ps_pgrp; /* process group id */ int ps_flags; /* kernel flags */ int ps_mflags; /* mm flags */ int ps_ftask; /* (possibly pseudo) fs suspend task */ char ps_state; /* process state */ vir_bytes ps_tsize; /* text size (in bytes) */ vir_bytes ps_dsize; /* data size (in bytes) */ vir_bytes ps_ssize; /* stack size (in bytes) */ phys_bytes ps_vtext; /* virtual text offset */ phys_bytes ps_vdata; /* virtual data offset */ phys_bytes ps_vstack; /* virtual stack offset */ phys_bytes ps_text; /* physical text offset */ phys_bytes ps_data; /* physical data offset */ phys_bytes ps_stack; /* physical stack offset */ int ps_recv; /* process number to receive from */ time_t ps_utime; /* accumulated user time */ time_t ps_stime; /* accumulated system time */ char *ps_args; /* concatenated argument string */ vir_bytes ps_procargs; /* initial stack frame from MM */ }; /* Ps_state field values in pstat struct above */ #define Z_STATE 'Z' /* Zombie */ #define W_STATE 'W' /* Waiting */ #define S_STATE 'S' /* Sleeping */ #define R_STATE 'R' /* Runnable */ #define T_STATE 'T' /* stopped (Trace) */ _PROTOTYPE(char *tname, (Dev_t dev_nr )); _PROTOTYPE(char *taskname, (int p_nr )); _PROTOTYPE(char *prrecv, (struct pstat *bufp )); _PROTOTYPE(void disaster, (int sig )); _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(char *get_args, (struct pstat *bufp )); _PROTOTYPE(int pstat, (int p_nr, struct pstat *bufp )); _PROTOTYPE(int addrread, (int fd, phys_clicks base, vir_bytes addr, char *buf, int nbytes )); _PROTOTYPE(void usage, (char *pname )); _PROTOTYPE(void err, (char *s )); _PROTOTYPE(int gettynames, (void)); /* * Tname returns mnemonic string for dev_nr. This is "?" for maj/min pairs that * are not found. It uses the ttyinfo array (prepared by gettynames). * Tname assumes that the first three letters of the tty's name can be omitted * and returns the rest (except for the console, which yields "co"). */ char *tname(dev_nr) Dev_t dev_nr; { int i; if (majdev(dev_nr) == TTY_MAJ && mindev(dev_nr) == 0) return "co"; for (i = 0; i < n_ttyinfo && ttyinfo[i].tty_name[0] != '\0'; i++) if (ttyinfo[i].tty_dev == dev_nr) return ttyinfo[i].tty_name + 3; return "?"; } /* Return canonical task name of task p_nr; overwritten on each call (yucch) */ char *taskname(p_nr) int p_nr; { return ps_proc[p_nr + nr_tasks].p_name; } /* Prrecv prints the RECV field for process with pstat buffer pointer bufp. * This is either "ANY", "taskname", or "(blockreason) taskname". */ char *prrecv(bufp) struct pstat *bufp; { char *blkstr, *task; /* reason for blocking and task */ static char recvstr[20]; if (bufp->ps_recv == ANY) return "ANY"; task = taskname(bufp->ps_recv); if (bufp->ps_state != S_STATE) return task; blkstr = "?"; if (bufp->ps_recv == MM_PROC_NR) { if (bufp->ps_mflags & PAUSED) blkstr = "pause"; else if (bufp->ps_mflags & WAITING) blkstr = "wait"; else if (bufp->ps_mflags & SIGSUSPENDED) blkstr = "ssusp"; } else if (bufp->ps_recv == FS_PROC_NR) { if (-bufp->ps_ftask == XPIPE) blkstr = "pipe"; else if (-bufp->ps_ftask == XPOPEN) blkstr = "popen"; else if (-bufp->ps_ftask == XLOCK) blkstr = "flock"; else blkstr = taskname(-bufp->ps_ftask); } (void) spri66666666666ntf(recvstr, "(%s) %s", blkstr, task); return recvstr; } /* If disaster is called some of the system parameters imported into ps are * probably wrong. This tends to result in memory faults. */ void disaster(sig) int sig; { fprintf(stderr, "Ooops, got signal %d\n", sig); fprintf(stderr, "Was ps recompiled since the last kernel change?\n"); exit(3); } /* Main interprets arguments, gets system addresses, opens [k]mem, reads in * process tables from kernel/mm/fs and calls pstat() for relevant entries. */ int main(argc, argv) int argc; char *argv[]; { int i; struct pstat buf; int db_fd; int uid = getuid(); /* real uid of caller */ char *opt; int opt_all = FALSE; /* -a */ int opt_long = FALSE; /* -l */ int opt_notty = FALSE; /* -x */ char *ke_path; /* paths of kernel, */ char *mm_path; /* mm, */ char *fs_path; /* and fs used in ps -U */ struct psinfo psinfo; char pid[2 + sizeof(pid_t) * 3]; unsigned long ustime; char cpu[sizeof(clock_t) * 3 + 1 + 2]; (void) signal(SIGSEGV, disaster); /* catch a common crash */ /* Parse arguments; a '-' need not be present (V7/BSD compatability) */ for (i = 1; i < argc; i++) { opt = argv[i]; if (opt[0] == '-') opt++; while (*opt != 0) switch (*opt++) { case 'a': opt_all = TRUE; break; case 'e': opt_all = opt_notty = TRUE; break; case 'f': case 'l': opt_long = TRUE; break; case 'x': opt_notty = TRUE; break; default: usage(argv[0]); } } /* Open memory devices and get PS info from the kernel */ if ((kmemfd = open(KMEM_PATH, O_RDONLY)) == -1) err(KMEM_PATH); if ((memfd = open(MEM_PATH, O_RDONLY)) == -1) err(MEM_PATH); if (gettynames() == -1) err("Can't get tty names"); if (ioctl(memfd, MIOCGPSINFO, (void *) &psinfo) == -1) err("can't get PS info from kernel"); nr_tasks = psinfo.nr_tasks; nr_procs = psinfo.nr_procs; /* Allocate memory for process tables */ ps_proc = (struct proc *) malloc((nr_tasks + nr_procs) * sizeof(ps_proc[0])); ps_mproc = (struct mproc *) malloc(nr_procs * sizeof(ps_mproc[0])); ps_fproc = (struct fproc *) malloc(nr_procs * sizeof(ps_fproc[0])); if (ps_proc == NULL || ps_mproc == NULL || ps_fproc == NULL) err("Out of memory"); /* Get kernel process table */ if (addrread(kmemfd, (phys_clicks) 0, psinfo.proc, (char *) ps_proc, (nr_tasks + nr_procs) * sizeof(ps_proc[0])) != (nr_tasks + nr_procs) * sizeof(ps_proc[0])) err("Can't get kernel proc table from /dev/kmem"); /* Get mm/fs process tables */ if (addrread(memfd, ps_proc[nr_tasks + MM_PROC_NR].p_map[D].mem_phys, psinfo.mproc, (char *) ps_mproc, nr_procs * sizeof(ps_mproc[0])) != nr_procs * sizeof(ps_mproc[0])) err("Can't get mm proc table from /dev/mem"); if (addrread(memfd, ps_proc[nr_tasks + FS_PROC_NR].p_map[D].mem_phys, psinfo.fproc, (char *) ps_fproc, nr_procs * sizeof(ps_fproc[0])) != nr_procs * sizeof(ps_fproc[0])) err("Can't get fs proc table from /dev/mem"); /* We need to know where INIT hangs out. */ for (i = FS_PROC_NR; i < nr_procs; i++) { if (strcmp(ps_proc[nr_tasks + i].p_name, "INIT") == 0) break; } init_proc_nr = i; /* Now loop through process table and handle each entry */ printf("%s", opt_long ? L_HEADER : S_HEADER); for (i = -nr_tasks; i < nr_procs; i++) { if (pstat(i, &buf) != -1 && (opt_all || buf.ps_euid == uid || buf.ps_ruid == uid) && (opt_notty || majdev(buf.ps_dev) == TTY_MAJ)) { if (buf.ps_pid == 0) { sprintf(pid, "(%d)", i); } else { sprintf(pid, "%d", buf.ps_pid); } ustime = (buf.ps_utime + buf.ps_stime) / HZ; if (ustime < 60 * 60) { sprintf(cpu, "%2lu:%02lu", ustime / 60, ustime % 60); } else if (ustime < 100L * 60 * 60) { ustime /= 60; sprintf(cpu, "%2luh%02lu", ustime / 60, ustime % 60); } else { sprintf(cpu, "%4luh", ustime / 3600); } if (opt_long) printf(L_FORMAT, buf.ps_flags, buf.ps_state, buf.ps_euid, pid, buf.ps_ppid, buf.ps_pgrp, off_to_k((buf.ps_tsize + buf.ps_stack - buf.ps_data + buf.ps_ssize)), (buf.ps_flags & RECEIVING ? prrecv(&buf) : ""), tname((Dev_t) buf.ps_dev), cpu, i <= init_proc_nr || buf.ps_args == NULL ? taskname(i) : buf.ps_args); else printf(S_FORMAT, pid, tname((Dev_t) buf.ps_dev), cpu, i <= init_proc_nr || buf.ps_args == NULL ? taskname(i) : buf.ps_args); } } return(0); } char *get_args(bufp) struct pstat *bufp; { int nargv; int cnt; /* # of bytes read from stack frame */ int neos; /* # of '\0's seen in argv string space */ phys_bytes iframe; long l; char *cp, *args; static union stack { vir_bytes stk_i; char *stk_cp; char stk_c; } stk[ARG_MAX / sizeof(char *)]; union stack *sp; /* Phys address of the original stack frame. */ iframe = bufp->ps_procargs - bufp->ps_vstack + bufp->ps_stack; /* Calculate the number of bytes to read from user stack */ l = (phys_bytes) bufp->ps_ssize - (iframe - bufp->ps_stack); if (l > ARG_MAX) l = ARG_MAX; cnt = l; /* Get cnt bytes from user initial stack to local stack buffer */ if (lseek(memfd, (off_t) iframe, 0) < 0) return NULL; if ( read(memfd, (char *)stk, cnt) != cnt ) return NULL; sp = stk; nargv = (int) sp[0].stk_i; /* number of argv arguments */ /* See if argv[0] is with the bytes we read in */ l = (long) sp[1].stk_cp - (long) bufp->ps_procargs; if ( ( l < 0 ) || ( l > cnt ) ) return NULL; /* l is the offset of the argv[0] argument */ /* change for concatenation the '\0' to space, for nargv elements */ args = &((char *) stk)[(int)l]; neos = 0; for (cp = args; cp < &((char *) stk)[cnt]; cp++) if (*cp == '\0') if (++neos >= nargv) break; else *cp = ' '; if (cp == args) return NULL; *cp = '\0'; return args; } /* Pstat collects info on process number p_nr and returns it in buf. * It is assumed that tasks do not have entries in fproc/mproc. */ int pstat(p_nr, bufp) int p_nr; struct pstat *bufp; { int p_ki = p_nr + nr_tasks; /* kernel proc index */ if (p_nr < -nr_tasks || p_nr >= nr_procs) return -1; if ((ps_proc[p_ki].p_priority == PPRI_NONE) && !(ps_mproc[p_nr].mp_flags & IN_USE)) return -1; bufp->ps_flags = ps_proc[p_ki].p_flags; if (p_nr >= low_user) { bufp->ps_dev = ps_fproc[p_nr].fp_tty; bufp->ps_ftask = ps_fproc[p_nr].fp_task; } else { bufp->ps_dev = 0; bufp->ps_ftask = 0; } if (p_nr >= low_user) { bufp->ps_ruid = ps_mproc[p_nr].mp_realuid; bufp->ps_euid = ps_mproc[p_nr].mp_effuid; bufp->ps_pid = ps_mproc[p_nr].mp_pid; bufp->ps_ppid = ps_mproc[ps_mproc[p_nr].mp_parent].mp_pid; bufp->ps_pgrp = ps_mproc[p_nr].mp_procgrp; bufp->ps_mflags = ps_mproc[p_nr].mp_flags; } else { bufp->ps_pid = 0; bufp->ps_ppid = 0; bufp->ps_ruid = bufp->ps_euid = 0; bufp->ps_pgrp = 0; bufp->ps_mflags = 0; } /* State is interpretation of combined kernel/mm flags for non-tasks */ if (p_nr >= low_user) { /* non-tasks */ if (ps_mproc[p_nr].mp_flags & ZOMBIE) bufp->ps_state = Z_STATE; /* zombie */ else if (ps_mproc[p_nr].mp_flags & STOPPED) bufp->ps_state = T_STATE; /* stopped (traced) */ else if (ps_proc[p_ki].p_flags == 0) bufp->ps_state = R_STATE; /* in run-queue */ else if (ps_mproc[p_nr].mp_flags & (WAITING | PAUSED | SIGSUSPENDED) || ps_fproc[p_nr].fp_suspended == SUSPENDED) bufp->ps_state = S_STATE; /* sleeping */ else bufp->ps_state = W_STATE; /* a short wait */ } else { /* tasks are simple */ if (ps_proc[p_ki].p_flags == 0) bufp->ps_state = R_STATE; /* in run-queue */ else bufp->ps_state = W_STATE; /* other i.e. waiting */ } bufp->ps_tsize = (size_t) ps_proc[p_ki].p_map[T].mem_len << CLICK_SHIFT; bufp->ps_dsize = (size_t) ps_proc[p_ki].p_map[D].mem_len << CLICK_SHIFT; bufp->ps_ssize = (size_t) ps_proc[p_ki].p_map[S].mem_len << CLICK_SHIFT; bufp->ps_vtext = (off_t) ps_proc[p_ki].p_map[T].mem_vir << CLICK_SHIFT; bufp->ps_vdata = (off_t) ps_proc[p_ki].p_map[D].mem_vir << CLICK_SHIFT; bufp->ps_vstack = (off_t) ps_proc[p_ki].p_map[S].mem_vir << CLICK_SHIFT; bufp->ps_text = (off_t) ps_proc[p_ki].p_map[T].mem_phys << CLICK_SHIFT; bufp->ps_data = (off_t) ps_proc[p_ki].p_map[D].mem_phys << CLICK_SHIFT; bufp->ps_stack = (off_t) ps_proc[p_ki].p_map[S].mem_phys << CLICK_SHIFT; bufp->ps_recv = ps_proc[p_ki].p_getfrom; bufp->ps_utime = ps_proc[p_ki].user_time; bufp->ps_stime = ps_proc[p_ki].sys_time; bufp->ps_procargs = ps_mproc[p_nr].mp_procargs; if (bufp->ps_state == Z_STATE) bufp->ps_args = ""; else if (p_nr > init_proc_nr) bufp->ps_args = get_args(bufp); return 0; } /* Addrread reads nbytes from offset addr to click base of fd into buf. */ int addrread(fd, base, addr, buf, nbytes) int fd; phys_clicks base; vir_bytes addr; char *buf; int nbytes; { if (lseek(fd, ((off_t) base << CLICK_SHIFT) + addr, 0) < 0) return -1; return read(fd, buf, nbytes); } void usage(pname) char *pname; { fprintf(stderr, "Usage: %s [-][alx]\n", pname); exit(1); } void err(s) char *s; { extern int errno; if (errno == 0) fprintf(stderr, "ps: %s\n", s); else fprintf(stderr, "ps: %s: %s\n", s, strerror(errno)); exit(2); } /* Fill ttyinfo by fstatting character specials in /dev. */ int gettynames() { static char dev_path[] = "/dev/"; struct stat statbuf; static char path[sizeof(dev_path) + NAME_MAX]; int index; struct ttyent *ttyp; index = 0; while ((ttyp = getttyent()) != NULL) { strcpy(path, dev_path); strcat(path, ttyp->ty_name); if (stat(path, &statbuf) == -1 || !S_ISCHR(statbuf.st_mode)) continue; if (index >= n_ttyinfo) { n_ttyinfo= (index+16) * 2; ttyinfo = realloc(ttyinfo, n_ttyinfo * sizeof(ttyinfo[0])); if (ttyinfo == NULL) err("Out of memory"); } ttyinfo[index].tty_dev = statbuf.st_rdev; strcpy(ttyinfo[index].tty_name, ttyp->ty_name); index++; } endttyent(); while (index < n_ttyinfo) ttyinfo[index++].tty_dev= 0; return 0; } #!/bin/sh # # tellconfig - Tell the value of a parameter # Author: Kees J. Bot echo " #include $* " >/tmp/tell.$$ exec &2 @echo " make install # Install the result (run as bin!)" >&2 @echo " make clean # Delete .o files and other junk" >&2 @false all install clean: cd `arch` && $(MAKE) $@ cd aal && $(MAKE) $@ cd advent && $(MAKE) $@ cd ash && $(MAKE) $@ cd autil && $(MAKE) $@ cd awk && $(MAKE) $@ cd bc && $(MAKE) $@ cd byacc && $(MAKE) $@ cd cawf && $(MAKE) $@ cd cron && $(MAKE) $@ cd de && $(MAKE) $@ cd dhcpd && $(MAKE) $@ cd dis88 && $(MAKE) $@ cd elle && $(MAKE) $@ cd elvis && $(MAKE) $@ cd flex-2.3.7 && $(MAKE) $@ cd ftp && $(MAKE) $@ cd ftpd && $(MAKE) $@ cd ibm && $(MAKE) $@ cd kermit && $(MAKE) $@ cd m4 && $(MAKE) $@ cd make && $(MAKE) $@ cd mined && $(MAKE) $@ cd patch && $(MAKE) $@ cd reboot && $(MAKE) $@ cd rlogind && $(MAKE) $@ cd scripts && $(MAKE) $@ cd sh && $(MAKE) $@ cd simple && $(MAKE) $@ cd talk && $(MAKE) $@ cd talkd && $(MAKE) $@ cd telnet && $(MAKE) $@ cd telnetd && $(MAKE) $@ cd urlget && $(MAKE) $@ cd yap && $(MAKE) $@ cd zmodem && $(MAKE) $@ D...EMakefileFarch.hGarchiver.cHbyte_order.hIformat.cJlocal.hKlong2str.cLobject.hMout.hNparam.hOprint.cPranlib.hQrd.cRrd_arhdr.cSrd_bytes.cTrd_unsig2.cUsprint.cVsystem.cWsystem.hXvarargs.hYwr_arhdr.cZwr_bytes.c[wr_int2.c\wr_long.c]wr_ranlib.c^write.c# Makefile for aal CC=exec cc CFLAGS=-I. -wo -DAAL -DSTB -DNDEBUG -DDISTRIBUTION -D_POSIX_SOURCE -D_MINIX LDFLAGS=-i all: aal OFILES= archiver.o \ print.o \ rd.o \ rd_arhdr.o \ rd_unsig2.o \ sprint.o \ wr_arhdr.o \ wr_bytes.o \ wr_int2.o \ wr_long.o \ wr_ranlib.o \ format.o \ rd_bytes.o \ system.o \ write.o \ long2str.o aal: $(OFILES) $(CC) $(LDFLAGS) -o aal $(OFILES) install -S 64k $@ install: /usr/bin/aal /usr/bin/ar /usr/bin/aal: aal install -cs -o bin aal $@ /usr/bin/ar: /usr/bin/aal install -l $? $@ archiver.o: print.o: rd.o: rd_arhdr.o: rd_unsig2.o: sprint.o: wr_arhdr.o: wr_bytes.o: wr_int2.o: wr_long.o: wr_ranlib.o: format.o: rd_bytes.o: system.o: write.o: long2str.o: clean: rm -f *.o core *.bak aal /* $Header: arch.h,v 1.6 91/06/06 11:47:23 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #ifndef __ARCH_H_INCLUDED #define __ARCH_H_INCLUDED #define ARMAG 0177545 #define AALMAG 0177454 struct ar_hdr { char ar_name[14]; long ar_date; char ar_uid; char ar_gid; short ar_mode; long ar_size; }; #define AR_TOTAL 26 #define AR_SIZE 22 #endif /* __ARCH_H_INCLUDED */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* ar - archiver Author: Michiel Huisjes */ /* Made into arch/aal by Ceriel Jacobs */ static char RcsId[] = "$Header: archiver.c,v 1.23 91/06/20 14:22:37 ceriel Exp $"; /* * Usage: [arch|aal] [adprtvx] archive [file] ... * v: verbose * x: extract * a: append * r: replace (append when not in archive) * d: delete * t: print contents of archive * p: print named files * l: temporaries in current directory instead of /usr/tmp * c: don't give "create" message * u: replace only if dated later than member in archive #ifdef DISTRIBUTION * D: make distribution: use distr_time, uid=2, gid=2, mode=0644 #endif */ #include #include #ifndef S_IREAD #define S_IREAD S_IRUSR #endif #ifndef S_IWRITE #define S_IWRITE S_IWUSR #endif #ifndef S_IEXEC #define S_IEXEC S_IXUSR #endif #include #include #ifdef AAL #include #include #define MAGIC_NUMBER AALMAG long offset; struct ranlib *tab; unsigned int tnum = 0; char *tstrtab; unsigned int tssiz = 0; char *malloc(), *realloc(), *strcpy(), *strncpy(); long time(); unsigned int tabsz, strtabsz; #else #define MAGIC_NUMBER ARMAG #endif long lseek(); #define odd(nr) (nr & 01) #define even(nr) (odd(nr) ? nr + 1 : nr) typedef char BOOL; #define FALSE 0 #define TRUE 1 #define READ 0 #define APPEND 2 #define CREATE 1 #define MEMBER struct ar_hdr #define NIL_PTR ((char *) 0) #define NIL_MEM ((MEMBER *) 0) #define NIL_LONG ((long *) 0) #define IO_SIZE (10 * 1024) #define equal(str1, str2) (!strncmp((str1), (str2), 14)) #ifndef S_ISDIR #define S_ISDIR(m) (m & S_IFDIR) /* is a directory */ #endif BOOL verbose; BOOL app_fl; BOOL ex_fl; BOOL show_fl; BOOL pr_fl; BOOL rep_fl; BOOL del_fl; BOOL nocr_fl; BOOL local_fl; BOOL update_fl; #ifdef DISTRIBUTION BOOL distr_fl; long distr_time; #endif int ar_fd; char io_buffer[IO_SIZE]; char *progname; char temp_buf[32]; char *temp_arch = &temp_buf[0]; extern char *mktemp(); extern char *ctime(); usage() { error(TRUE, "usage: %s %s archive [file] ...\n", progname, #ifdef AAL "[acdrtxvlu]" #else "[acdprtxvlu]" #endif ); } /*VARARGS2*/ error(quit, str1, str2, str3, str4) BOOL quit; char *str1, *str2, *str3, *str4; { char errbuf[256]; sprint(errbuf, str1, str2, str3, str4); write(2, errbuf, strlen(errbuf)); if (quit) { unlink(temp_arch); _exit(1); } } char *basename(path) char *path; { register char *ptr = path; register char *last = NIL_PTR; while (*ptr != '\0') { if (*ptr == '/') last = ptr; ptr++; } if (last == NIL_PTR) return path; if (*(last + 1) == '\0') { *last = '\0'; return basename(path); } return last + 1; } extern unsigned int rd_unsigned2(); open_archive(name, mode) register char *name; register int mode; { unsigned short magic = 0; int fd; if (mode == CREATE) { if ((fd = creat(name, 0666)) < 0) error(TRUE, "cannot creat %s\n", name); magic = MAGIC_NUMBER; wr_int2(fd, magic); return fd; } if ((fd = open(name, mode)) < 0) { if (mode == APPEND) { close(open_archive(name, CREATE)); if (!nocr_fl) error(FALSE, "%s: creating %s\n", progname, name); return open_archive(name, APPEND); } error(TRUE, "cannot open %s\n", name); } lseek(fd, 0L, 0); magic = rd_unsigned2(fd); if (magic != AALMAG && magic != ARMAG) error(TRUE, "%s is not in ar format\n", name); return fd; } #if __STDC__ void catch(int sig) #else catch() #endif { unlink(temp_arch); _exit (2); } main(argc, argv) int argc; char *argv[]; { register char *ptr; int needs_arg = 0; progname = argv[0]; if (argc < 3) usage(); for (ptr = argv[1]; *ptr; ptr++) { switch (*ptr) { case 't' : show_fl = TRUE; break; case 'v' : verbose = TRUE; break; case 'x' : ex_fl = TRUE; break; case 'a' : needs_arg = 1; app_fl = TRUE; break; case 'c' : nocr_fl = TRUE; break; #ifndef AAL case 'p' : needs_arg = 1; pr_fl = TRUE; break; #endif case 'd' : needs_arg = 1; del_fl = TRUE; break; case 'r' : needs_arg = 1; rep_fl = TRUE; break; case 'l' : local_fl = TRUE; break; case 'u' : update_fl = TRUE; break; #ifdef DISTRIBUTION case 'D' : distr_fl = TRUE; break; #endif default : usage(); } } if (needs_arg && argc <= 3) usage(); #ifdef DISTRIBUTION if (distr_fl) { struct stat statbuf; stat(progname, &statbuf); distr_time = statbuf.st_mtime; } #endif if (local_fl) strcpy(temp_arch, "ar.XXXXXX"); else strcpy(temp_arch, "/usr/tmp/ar.XXXXXX"); if (app_fl + ex_fl + del_fl + rep_fl + show_fl + pr_fl != 1) usage(); if (update_fl && !rep_fl) usage(); if (rep_fl || del_fl #ifdef AAL || app_fl #endif ) { mktemp(temp_arch); } #ifdef AAL tab = (struct ranlib *) malloc(512 * sizeof(struct ranlib)); tstrtab = malloc(4096); if (!tab || !tstrtab) error(TRUE,"Out of core\n"); tabsz = 512; strtabsz = 4096; #endif signal(SIGINT, catch); get(argc, argv); return 0; } MEMBER * get_member() { static MEMBER member; again: if (rd_arhdr(ar_fd, &member) == 0) return NIL_MEM; if (member.ar_size < 0) { error(TRUE, "archive has member with negative size\n"); } #ifdef AAL if (equal(SYMDEF, member.ar_name)) { lseek(ar_fd, member.ar_size, 1); goto again; } #endif return &member; } char *get_mode(); get(argc, argv) int argc; register char *argv[]; { register MEMBER *member; int i = 0; int temp_fd, read_chars; ar_fd = open_archive(argv[2], (show_fl || pr_fl || ex_fl) ? READ : APPEND); if (rep_fl || del_fl #ifdef AAL || app_fl #endif ) temp_fd = open_archive(temp_arch, CREATE); while ((member = get_member()) != NIL_MEM) { if (argc > 3) { for (i = 3; i < argc; i++) { if (equal(basename(argv[i]), member->ar_name)) break; } if (i == argc || app_fl) { if (rep_fl || del_fl #ifdef AAL || app_fl #endif ) { #ifdef AAL if (i != argc) { print("%s: already in archive\n", argv[i]); argv[i] = ""; } #endif wr_arhdr(temp_fd, member); copy_member(member, ar_fd, temp_fd, 0); } else { #ifndef AAL if (app_fl && i != argc) { print("%s: already in archive\n", argv[i]); argv[i] = ""; } #endif lseek(ar_fd, even(member->ar_size),1); } continue; } } if (ex_fl || pr_fl) extract(member); else { if (rep_fl) { int isold = 0; if(update_fl) { struct stat status; if (stat(argv[i], &status) >= 0) { if(status.st_mtime <= member->ar_date) isold = 1; } } if(!isold) add(argv[i], temp_fd, "r - %s\n"); else { wr_arhdr(temp_fd, member); copy_member(member, ar_fd, temp_fd, 0); if(verbose) show("r - %s (old)\n", member->ar_name); } } else if (show_fl) { char buf[sizeof(member->ar_name) + 2]; register char *p = buf, *q = member->ar_name; while (q <= &member->ar_name[sizeof(member->ar_name)-1] && *q) { *p++ = *q++; } *p++ = '\n'; *p = '\0'; if (verbose) { char *mode = get_mode(member->ar_mode); char *date = ctime(&(member->ar_date)); *(date + 16) = '\0'; *(date + 24) = '\0'; print("%s%3u/%u%7ld %s %s %s", mode, (unsigned) (member->ar_uid & 0377), (unsigned) (member->ar_gid & 0377), member->ar_size, date+4, date+20, buf); } else print(buf); } else if (del_fl) show("d - %s\n", member->ar_name); lseek(ar_fd, even(member->ar_size), 1); } argv[i] = ""; } if (argc > 3) { for (i = 3; i < argc; i++) if (argv[i][0] != '\0') { #ifndef AAL if (app_fl) add(argv[i], ar_fd, "a - %s\n"); else #endif if (rep_fl #ifdef AAL || app_fl #endif ) add(argv[i], temp_fd, "a - %s\n"); else { print("%s: not found\n", argv[i]); } } } if (rep_fl || del_fl #ifdef AAL || app_fl #endif ) { signal(SIGINT, SIG_IGN); close(ar_fd); close(temp_fd); ar_fd = open_archive(argv[2], CREATE); temp_fd = open_archive(temp_arch, APPEND); #ifdef AAL write_symdef(); #endif wh666666666ile ((read_chars = read(temp_fd, io_buffer, IO_SIZE)) > 0) mwrite(ar_fd, io_buffer, read_chars); close(temp_fd); unlink(temp_arch); } close(ar_fd); } add(name, fd, mess) char *name; int fd; char *mess; { static MEMBER member; register int read_chars; struct stat status; int src_fd; if (stat(name, &status) < 0) { error(FALSE, "cannot find %s\n", name); return; } else if (S_ISDIR(status.st_mode)) { error(FALSE, "%s is a directory (ignored)\n", name); return; } else if ((src_fd = open(name, 0)) < 0) { error(FALSE, "cannot open %s\n", name); return; } strncpy (member.ar_name, basename (name), sizeof(member.ar_name)); member.ar_uid = status.st_uid; member.ar_gid = status.st_gid; member.ar_mode = status.st_mode; member.ar_date = status.st_mtime; member.ar_size = status.st_size; #ifdef DISTRIBUTION if (distr_fl) { member.ar_uid = 2; member.ar_gid = 2; member.ar_mode = 0644; member.ar_date = distr_time; } #endif wr_arhdr(fd, &member); #ifdef AAL do_object(src_fd, member.ar_size); lseek(src_fd, 0L, 0); offset += AR_TOTAL + even(member.ar_size); #endif while (status.st_size > 0) { int x = IO_SIZE; read_chars = x; if (status.st_size < x) { x = status.st_size; read_chars = x; status.st_size = 0; x = even(x); } else status.st_size -= x; if (read(src_fd, io_buffer, read_chars) != read_chars) { error(FALSE,"%s seems to shrink\n", name); break; } mwrite(fd, io_buffer, x); } if (verbose) show(mess, member.ar_name); close(src_fd); } extract(member) register MEMBER *member; { int fd = 1; char buf[sizeof(member->ar_name) + 1]; strncpy(buf, member->ar_name, sizeof(member->ar_name)); buf[sizeof(member->ar_name)] = 0; if (pr_fl == FALSE && (fd = creat(buf, 0666)) < 0) { error(FALSE, "cannot create %s\n", buf); fd = -1; } if (verbose) { if (pr_fl == FALSE) show("x - %s\n", buf); else show("\n<%s>\n\n", buf); } copy_member(member, ar_fd, fd, 1); if (fd >= 0 && fd != 1) close(fd); if (pr_fl == FALSE) chmod(buf, member->ar_mode); } copy_member(member, from, to, extracting) register MEMBER *member; int from, to; { register int rest; long mem_size = member->ar_size; BOOL is_odd = odd(mem_size) ? TRUE : FALSE; #ifdef AAL if (! extracting) { long pos = lseek(from, 0L, 1); do_object(from, mem_size); offset += AR_TOTAL + even(mem_size); lseek(from, pos, 0); } #endif do { rest = mem_size > (long) IO_SIZE ? IO_SIZE : (int) mem_size; if (read(from, io_buffer, rest) != rest) { char buf[sizeof(member->ar_name) + 1]; strncpy(buf, member->ar_name, sizeof(member->ar_name)); buf[sizeof(member->ar_name)] = 0; error(TRUE, "read error on %s\n", buf); } if (to >= 0) mwrite(to, io_buffer, rest); mem_size -= (long) rest; } while (mem_size > 0L); if (is_odd) { lseek(from, 1L, 1); if (to >= 0 && ! extracting) lseek(to, 1L, 1); } } char * get_mode(mode) register int mode; { static char mode_buf[11]; register int tmp = mode; int i; mode_buf[9] = ' '; for (i = 0; i < 3; i++) { mode_buf[i * 3] = (tmp & S_IREAD) ? 'r' : '-'; mode_buf[i * 3 + 1] = (tmp & S_IWRITE) ? 'w' : '-'; mode_buf[i * 3 + 2] = (tmp & S_IEXEC) ? 'x' : '-'; tmp <<= 3; } if (mode & S_ISUID) mode_buf[2] = 's'; if (mode & S_ISGID) mode_buf[5] = 's'; return mode_buf; } wr_fatal() { error(TRUE, "write error\n"); } rd_fatal() { error(TRUE, "read error\n"); } mwrite(fd, address, bytes) int fd; register char *address; register int bytes; { if (write(fd, address, bytes) != bytes) error(TRUE, "write error\n"); } show(s, name) char *s, *name; { MEMBER x; char buf[sizeof(x.ar_name)+1]; register char *p = buf, *q = name; while (q <= &name[sizeof(x.ar_name)-1] && *q) *p++ = *q++; *p++ = '\0'; print(s, buf); } #ifdef AAL /* * Write out the ranlib table: first 4 bytes telling how many ranlib structs * there are, followed by the ranlib structs, * then 4 bytes giving the size of the string table, followed by the string * table itself. */ write_symdef() { register struct ranlib *ran; register int i; register long delta; MEMBER arbuf; if (odd(tssiz)) tstrtab[tssiz++] = '\0'; for (i = 0; i < sizeof(arbuf.ar_name); i++) arbuf.ar_name[i] = '\0'; strcpy(arbuf.ar_name, SYMDEF); arbuf.ar_size = 4 + 2 * 4 * (long)tnum + 4 + (long)tssiz; time(&arbuf.ar_date); arbuf.ar_uid = getuid(); arbuf.ar_gid = getgid(); arbuf.ar_mode = 0444; #ifdef DISTRIBUTION if (distr_fl) { arbuf.ar_uid = 2; arbuf.ar_gid = 2; arbuf.ar_date = distr_time; } #endif wr_arhdr(ar_fd,&arbuf); wr_long(ar_fd, (long) tnum); /* * Account for the space occupied by the magic number * and the ranlib table. */ delta = 2 + AR_TOTAL + arbuf.ar_size; for (ran = tab; ran < &tab[tnum]; ran++) { ran->ran_pos += delta; } wr_ranlib(ar_fd, tab, (long) tnum); wr_long(ar_fd, (long) tssiz); wr_bytes(ar_fd, tstrtab, (long) tssiz); } /* * Return whether the bytes in `buf' form a good object header. * The header is put in `headp'. */ int is_outhead(headp) register struct outhead *headp; { return !BADMAGIC(*headp) && headp->oh_nname != 0; } do_object(f, size) long size; { struct outhead headbuf; if (size < SZ_HEAD) { /* It can't be an object file. */ return; } /* * Read a header to see if it is an object file. */ if (! rd_fdopen(f)) { rd_fatal(); } rd_ohead(&headbuf); if (!is_outhead(&headbuf)) { return; } do_names(&headbuf); } /* * First skip the names and read in the string table, then seek back to the * name table and read and write the names one by one. Update the ranlib table * accordingly. */ do_names(headp) struct outhead *headp; { register char *strings; register int nnames = headp->oh_nname; #define NNAMES 100 struct outname namebuf[NNAMES]; long xxx = OFF_CHAR(*headp); if ( headp->oh_nchar != (unsigned int)headp->oh_nchar || (strings = malloc((unsigned int)headp->oh_nchar)) == (char *)0 ) { error(TRUE, "string table too big\n"); } rd_string(strings, headp->oh_nchar); while (nnames) { int i = nnames >= NNAMES ? NNAMES : nnames; register struct outname *p = namebuf; nnames -= i; rd_name(namebuf, i); while (i--) { long off = p->on_foff - xxx; if (p->on_foff == (long)0) { p++; continue; /* An unrecognizable name. */ } p->on_mptr = strings + off; /* * Only enter names that are exported and are really * defined. Also enter common names. Note, that * this might cause problems when the name is really * defined in a later file, with a value != 0. * However, this problem also exists on the Unix * ranlib archives. */ if ( (p->on_type & S_EXT) && (p->on_type & S_TYP) != S_UND ) enter_name(p); p++; } } free(strings); } enter_name(namep) struct outname *namep; { register char *cp; if (tnum >= tabsz) { tab = (struct ranlib *) realloc((char *) tab, (tabsz += 512) * sizeof(struct ranlib)); if (! tab) error(TRUE, "Out of core\n"); } tab[tnum].ran_off = tssiz; tab[tnum].ran_pos = offset; for (cp = namep->on_mptr;; cp++) { if (tssiz >= strtabsz) { tstrtab = realloc(tstrtab, (strtabsz += 4096)); if (! tstrtab) error(TRUE, "string table overflow\n"); } tstrtab[tssiz++] = *cp; if (!*cp) break; } tnum++; } #endif AAL #if defined(mc68020) || defined(mc68000) || defined(sparc) #define BYTES_REVERSED 1 #define WORDS_REVERSED 1 #define CHAR_UNSIGNED 0 #else #define BYTES_REVERSED 0 #define WORDS_REVERSED 0 #define CHAR_UNSIGNED 0 #endif /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: format.c,v 1.6 91/03/11 14:32:41 ceriel Exp $ */ #if __STDC__ #include #else #include #endif extern char *long2str(); static int integral(c) { switch (c) { case 'b': return -2; case 'd': return 10; case 'o': return -8; case 'u': return -10; case 'x': return -16; } return 0; } /*VARARGS2*/ /*FORMAT1 $ %s = char * %l = long %c = int %[uxbo] = unsigned int %d = int $ */ int _format(buf, fmt, argp) char *buf, *fmt; register va_list argp; { register char *pf = fmt; register char *pb = buf; while (*pf) { if (*pf == '%') { register width, base, pad, npad; char *arg; char cbuf[2]; char *badformat = ""; /* get padder */ if (*++pf == '0') { pad = '0'; ++pf; } else pad = ' '; /* get width */ width = 0; while (*pf >= '0' && *pf <= '9') width = 10 * width + *pf++ - '0'; if (*pf == 's') { arg = va_arg(argp, char *); } else if (*pf == 'c') { cbuf[0] = va_arg(argp, int); cbuf[1] = '\0'; arg = &cbuf[0]; } else if (*pf == 'l') { /* alignment ??? */ if (base = integral(*++pf)) { arg = long2str(va_arg(argp,long), base); } else { pf--; arg = badformat; } } else if (base = integral(*pf)) { arg = long2str((long)va_arg(argp,int), base); } else if (*pf == '%') arg = "%"; else arg = badformat; npad = width - strlen(arg); while (npad-- > 0) *pb++ = pad; while (*pb++ = *arg++); pb--; pf++; } else *pb++ = *pf++; } return pb - buf; } /* $Header: local.h,v 2.7 88/07/08 10:33:53 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* collection of options, selected by including or excluding 'defines' */ /* Version number of the EM object code */ # define VERSION 3 /* 16 bits number */ /* The default machine used by ack, acc, apc */ # define ACKM "minix" /* size of local machine, either 0 (for 16 bit address space), or 1 */ # undef BIGMACHINE 1 /* operating system, SYS_5, V7, BSD4_1 or BSD4_2; Do NOT delete the comment in the next line! */ # define V7 1 /* SYSTEM */ /* $Header: long2str.c,v 1.4 90/02/27 14:30:10 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Integer to String translator -> base is a value from [-16,-2] V [2,16] -> base < 0: see 'val' as unsigned value -> no checks for buffer overflow and illegal parameters (1985, EHB) */ #define MAXWIDTH 32 char * long2str(val, base) register long val; register base; { static char numbuf[MAXWIDTH]; static char vec[] = "0123456789ABCDEF"; register char *p = &numbuf[MAXWIDTH]; int sign = (base > 0); *--p = '\0'; /* null-terminate string */ if (val) { if (base > 0) { if (val < 0L) { long v1 = -val; if (v1 == val) goto overflow; val = v1; } else sign = 0; } else if (base < 0) { /* unsigned */ base = -base; if (val < 0L) { /* taken from Amoeba src */ register mod, i; overflow: mod = 0; for (i = 0; i < 8 * sizeof val; i++) { mod <<= 1; if (val < 0) mod++; val <<= 1; if (mod >= base) { mod -= base; val++; } } *--p = vec[mod]; } } do { *--p = vec[(int) (val % base)]; val /= base; } while (val != 0L); if (sign) *--p = '-'; /* don't forget it !! */ } else *--p = '0'; /* just a simple 0 */ return p; } /* $Header: object.h,v 1.7 91/01/18 09:54:23 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "byte_order.h" #include #include #if CHAR_UNSIGNED #define Xchar(ch) (ch) #else #define Xchar(ch) ((ch) & 0377) #endif #if ! defined(BYTES_REVERSED) #define BYTES_REVERSED 1 #endif #if ! defined(WORDS_REVERSED) #define WORDS_REVERSED 1 #endif #if BYTES_REVERSED #define uget2(c) (Xchar((c)[0]) | ((unsigned) Xchar((c)[1]) << 8)) #define Xput2(i, c) (((c)[0] = (i)), ((c)[1] = (i) >> 8)) #define put2(i, c) { register int j = (i); Xput2(j, c); } #else #define uget2(c) (* ((unsigned short *) (c))) #define Xput2(i, c) (* ((short *) (c)) = (i)) #define put2(i, c) Xput2(i, c) #endif #define get2(c) ((short) uget2(c)) #if WORDS_REVERSED || BYTES_REVERSED #define get4(c) (uget2(c) | ((long) uget2((c)+2) << 16)) #define put4(l, c) { register long x=(l); \ Xput2((int)x,c); \ Xput2((int)(x>>16),(c)+2); \ } #else #define get4(c) (* ((long *) (c))) #define put4(l, c) (* ((long *) (c)) = (l)) #endif #define SECTCNT 3 /* number of sections with own output buffer */ #if BIGMACHINE #define WBUFSIZ (8*BUFSIZ) #else #define WBUFSIZ BUFSIZ #endif struct fil { int cnt; char *pnow; char *pbegin; long currpos; int fd; char pbuf[WBUFSIZ]; }; extern struct fil __parts[]; #define PARTEMIT 0 #define PARTRELO (PARTEMIT+SECTCNT) #define PARTNAME (PARTRELO+1) #define PARTCHAR (PARTNAME+1) #ifdef SYMDBUG #define PARTDBUG (PARTCHAR+1) #else #define PARTDBUG (PARTCHAR+0) #endif #define NPARTS (PARTDBUG + 1) #define getsect(s) (PARTEMIT+((s)>=(SECTCNT-1)?(SECTCNT-1):(s))) /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: out.h,v 2.5 90/10/25 11:18:20 ceriel Exp $ */ #ifndef __OUT_H_INCLUDED #define __OUT_H_INCLUDED /* * output format for ACK assemblers */ #ifndef ushort #define ushort unsigned short #endif /* ushort */ struct outhead { ushort oh_magic; /* magic number */ ushort oh_stamp; /* version stamp */ ushort oh_flags; /* several format flags */ ushort oh_nsect; /* number of outsect structures */ ushort oh_nrelo; /* number of outrelo structures */ ushort oh_nname; /* number of outname structures */ long oh_nemit; /* sum of all os_flen */ long oh_nchar; /* size of string area */ }; #define O_MAGIC 0x0201 /* magic number of output file */ #define O_STAMP 0 /* version stamp */ #define MAXSECT 64 /* Maximum number of sections */ #define HF_LINK 0x0004 /* unresolved references left */ #define HF_8086 0x0008 /* os_base specially encoded */ struct outsect { long os_base; /* startaddress in machine */ long os_size; /* section size in machine */ long os_foff; /* startaddress in file */ long os_flen; /* section size in file */ long os_lign; /* section alignment */ }; struct outrelo { char or_type; /* type of reference */ char or_sect; /* referencing section */ ushort or_nami; /* referenced symbol index */ long or_addr; /* referencing address */ }; struct outname { union { char *on_ptr; /* symbol name (in core) */ long on_off; /* symbol name (in file) */ } on_u; #define on_mptr on_u.on_ptr #define on_foff on_u.on_off ushort on_type; /* symbol type */ ushort on_desc; /* debug info */ long on_valu; /* symbol value */ }; /* * relocation type bits */ #define RELSZ 0x07 /* relocation length */ #define RELO1 1 /* 1 byte */ #define RELO2 2 /* 2 bytes */ #define RELO4 4 /* 4 bytes */ #define RELPC 0x08 /* pc relative */ #define RELBR 0x10 /* High order byte lowest address. */ #define RELWR 0x20 /* High order word lowest address. */ /* * section type bits and fields */ #define S_TYP 0x007F /* undefined, absolute or relative */ #define S_EXT 0x0080 /* external flag */ #define S_ETC 0x7F00 /* for symbolic debug, bypassing 'as' */ /* * S_TYP field values */ #define S_UND 0x0000 /* undefined item */ #define S_ABS 0x0001 /* absolute item */ #define S_MIN 0x0002 /* first user section */ #define S_MAX (S_TYP-1) /* last user section */ #define S_CRS S_TYP /* on_valu is symbol index which contains value */ /* * S_ETC field values */ #define S_SCT 0x0100 /* section names */ #define S_LIN 0x0200 /* hll source line item */ #define S_FIL 0x0300 /* hll source file item */ #define S_MOD 0x0400 /* ass source file item */ #define S_COM 0x1000 /* Common name. */ #define S_STB 0xe000 /* entries with any of these bits set are reserved for debuggers */ /* * structure format strings */ #define SF_HEAD "22222244" #define SF_SECT "44444" #define SF_RELO "1124" #define SF_NAME "4224" /* * structure sizes (bytes in file; add digits in SF_*) */ #define SZ_HEAD 20 #define SZ_SECT 20 #define SZ_RELO 8 #define SZ_NAME 12 /* * file access macros */ #define BADMAGIC(x) ((x).oh_magic!=O_MAGIC) #define OFF_SECT(x) SZ_HEAD #define OFF_EMIT(x) (OFF_SECT(x) + ((long)(x).oh_nsect * SZ_SECT)) #define OFF_RELO(x) (OFF_EMIT(x) + (x).oh_nemit) #define OFF_NAME(x) (OFF_RELO(x) + ((long)(x).oh_nrelo * SZ_RELO)) #define OFF_CHAR(x) (OFF_NAME(x) + ((long)(x).oh_nname * SZ_NAME)) #endif /* __OUT_H_INCLUDED */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: param.h,v 1.2 87/03/09 14:51:35 ceriel Exp $ */ #define SSIZE 1024 /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: print.c,v 1.6 91/03/11 14:33:01 ceriel Exp $ */ #if __STDC__ #include #else #include #endif #include #include "param.h" /*VARARGS*/ /*FORMAT0v $ %s = char * %l = long %c = int %[uxbo] = unsigned int %d = int $ */ int #if __STDC__ print(char *fmt, ...) #else print(fmt, va_alist) char *fmt; va_dcl #endif { va_list args; char buf[SSIZE]; #if __STDC__ va_start(args, fmt); #else va_start(args); #endif sys_write(STDOUT, buf, _format(buf, fmt, args)); va_end(args); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: ranlib.h,v 2.3 90/10/25 11:18:34 ceriel Exp $ */ #ifndef __RANLIB_H_INCLUDED #define __RANLIB_H_INCLUDED #ifndef SYMDEF # define SYMDEF "__.SYMDEF" #endif /* SYMDEF */ /* * Structure of the SYMDEF table of contents for an archive. * SYMDEF begins with a long giving the number of ranlib * structures that immediately follow, and then continues with a string * table consisting of a long giving the number of bytes of * strings that follow and then the strings themselves. */ struct ranlib { union { char *ran__ptr; /* symbol name (in core) */ long ran__off; /* symbol name (in file) */ } ran_u; #define ran_ptr ran_u.ran__ptr #define ran_off ran_u.ran__off long ran_pos; /* library member is at this position */ }; #define SZ_RAN 8 #define SF_RAN "44" #endif /* __RANLIB_H_INCLUDED */ /* $Header: rd.c,v 1.7 91/01/18 09:54:34 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #include "object.h" extern long lseek(); /* * Parts of the output file. */ #undef PARTEMIT #undef PARTRELO #undef PARTNAME #undef PARTCHAR #undef PARTDBUG #undef NPARTS #define PARTEMIT 0 #define PARTRELO 1 #define PARTNAME 2 #define PARTCHAR 3 #ifdef SYMDBUG #define PARTDBUG 4 #else #define PARTDBUG 3 #endif #define NPARTS (PARTDBUG + 1) static long offset[MAXSECT]; static int outfile; static long outseek[NPARTS]; static long currpos; static long rd_base; #define OUTSECT(i) \ (outseek[PARTEMIT] = offset[i]) #define BEGINSEEK(p, o) \ (outseek[(p)] = (o)) static int sectionnr; static OUTREAD(p, b, n) char *b; long n; { register long l = outseek[p]; if (currpos != l) { lseek(outfile, l, 0); } rd_bytes(outfile, b, n); l += n; currpos = l; outseek[p] = l; } /* * Open the output file according to the chosen strategy. */ int rd_open(f) char *f; { if ((outfile = open(f, 0)) < 0) return 0; return rd_fdopen(outfile); } static int offcnt; rd_fdopen(fd) { register int i; for (i = 0; i < NPARTS; i++) outseek[i] = 0; offcnt = 0; rd_base = lseek(fd, 0L, 1); if (rd_base < 0) { return 0; } currpos = rd_base; outseek[PARTEMIT] = currpos; outfile = fd; sectionnr = 0; return 1; } rd_close() { close(outfile); outfile = -1; } rd_fd() { return outfile; } rd_ohead(head) register struct outhead *head; { register long off; OUTREAD(PARTEMIT, (char *) head, (long) SZ_HEAD); #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outhead) != SZ_HEAD) #endif { register char *c = (char *) head + (SZ_HEAD-4); head->oh_nchar = get4(c); c -= 4; head->oh_nemit = get4(c); c -= 2; head->oh_nname = uget2(c); c -= 2; head->oh_nrelo = uget2(c); c -= 2; head->oh_nsect = uget2(c); c -= 2; head->oh_flags = uget2(c); c -= 2; head->oh_stamp = uget2(c); c -= 2; head->oh_magic = uget2(c); } off = OFF_RELO(*head) + rd_base; BEGINSEEK(PARTRELO, off); off += (long) head->oh_nrelo * SZ_RELO; BEGINSEEK(PARTNAME, off); off += (long) head->oh_nname * SZ_NAME; BEGINSEEK(PARTCHAR, off); #ifdef SYMDBUG off += head->oh_nchar; BEGINSEEK(PARTDBUG, off); #endif } rd_rew_relos(head) register struct outhead *head; { register long off = OFF_RELO(*head) + rd_base; BEGINSEEK(PARTRELO, off); } rd_sect(sect, cnt) register struct outsect *sect; register unsigned int cnt; { register char *c = (char *) sect + cnt * SZ_SECT; OUTREAD(PARTEMIT, (char *) sect, (long)cnt * SZ_SECT); sect += cnt; offcnt += cnt; while (cnt--) { sect--; #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outsect) != SZ_SECT) #endif { c -= 4; sect->os_lign = get4(c); c -= 4; sect->os_flen = get4(c); c -= 4; sect->os_foff = get4(c); } offset[--offcnt] = sect->os_foff + rd_base; #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outsect) != SZ_SECT) #endif { c -= 4; sect->os_size = get4(c); c -= 4; sect->os_base = get4(c); } } } rd_outsect(s) { OUTSECT(s); sectionnr = s; } /* * We don't have to worry about byte order here. */ rd_emit(emit, cnt) char *emit; long cnt; { OUTREAD(PARTEMIT, emit, cnt); offset[sectionnr] += cnt; } rd_relo(relo, cnt) register struct outrelo *relo; register unsigned int cnt; { OUTREAD(PARTRELO, (char *) relo, (long) cnt * SZ_RELO); #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outrelo) != SZ_RELO) #endif { register char *c = (char *) relo + (long) cnt * SZ_RELO; relo += cnt; while (cnt--) { relo--; c -= 4; relo->or_addr = get4(c); c -= 2; relo->or_nami = uget2(c); relo->or_sect = *--c; relo->or_type = *--c; } } } rd_name(name, cnt) register struct outname *name; register unsigned int cnt; { OUTREAD(PARTNAME, (char *) name, (long) cnt * SZ_NAME); #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outname) != SZ_NAME) #endif { register char *c = (char *) name + (long) cnt * SZ_NAME; name += cnt; while (cnt--) { name--; c -= 4; name->on_valu = get4(c); c -= 2; name->on_desc = uget2(c); c -= 2; name->on_type = uget2(c); c -= 4; name->on_foff = get4(c); } } } rd_string(addr, len) char *addr; long len; { OUTREAD(PARTCHAR, addr, len); } #ifdef SYMDBUG rd_dbug(buf, size) char *buf; long size; { OUTREAD(PARTDBUG, buf, size); } #endif /* $Header: rd_arhdr.c,v 1.8 91/01/18 09:54:49 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #include "object.h" int rd_arhdr(fd, arhdr) register struct ar_hdr *arhdr; { char buf[AR_TOTAL]; register char *c = buf; register char *p = arhdr->ar_name; register int i; i = read(fd, c, AR_TOTAL); if (i == 0) return 0; if (i != AR_TOTAL) { rd_fatal(); } i = 14; while (i--) { *p++ = *c++; } arhdr->ar_date = ((long) get2(c)) << 16; c += 2; arhdr->ar_date |= ((long) get2(c)) & 0xffff; c += 2; arhdr->ar_uid = *c++; arhdr->ar_gid = *c++; arhdr->ar_mode = get2(c); c += 2; arhdr->ar_size = (long) get2(c) << 16; c += 2; arhdr->ar_size |= (long) get2(c) & 0xffff; return 1; } /* $Header: rd_bytes.c,v 1.5 87/03/10 09:15:39 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define MININT (1 << (sizeof(int) * 8 - 1)) #define MAXCHUNK (~MININT) /* Highest count we read(2). */ /* Unfortunately, MAXCHUNK is too large with some compilers. Put it in an int! */ static int maxchunk = MAXCHUNK; /* * We don't have to worry about byte order here. * Just read "cnt" bytes from file-descriptor "fd". */ int rd_bytes(fd, string, cnt) register char *string; register long cnt; { while (cnt) { register int n = cnt >= maxchunk ? maxchunk : cnt; if (read(fd, string, n) != n) rd_fatal(); string += n; cnt -= n; } } /* $Header: rd_unsig2.c,v 1.3 87/03/10 09:16:26 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "object.h" unsigned int rd_unsigned2(fd) { char buf[2]; rd_bytes(fd, buf, 2L); return uget2(buf); } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: sprint.c,v 1.6 91/03/11 14:33:13 ceriel Exp $ */ #if __STDC__ #include #else #include #endif #include #include "param.h" /*VARARGS*/ /*FORMAT1v $ %s = char * %l = long %c = int %[uxbo] = unsigned int %d = int $ */ char * #if __STDC__ sprint(char *buf, char *fmt, ...) #else sprint(buf, fmt, va_alist) char *buf, *fmt; va_dcl #endif { va_list args; #if __STDC__ va_start(args, fmt); #else va_start(args); #endif buf[_format(buf, fmt, args)] = '\0'; va_end(args); return buf; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* RCS: $Header: system.c,v 1.2 87/03/09 15:05:46 ceriel Exp $ */ #include File _sys_ftab[SYS_NOPEN] = { { 0, OP_READ}, { 1, OP_APPEND}, { 2, OP_APPEND} }; File * _get_entry() { register File *fp; for (fp = &_sys_ftab[0]; fp < &_sys_ftab[SYS_NOPEN]; fp++) if (fp->o_flags == 0) return fp; return (File *)0; } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* RCS: $Header: system.h,v 1.3 88/09/27 09:48:10 ceriel Exp $ */ #ifndef __SYSTEM_INCLUDED__ #define __SYSTEM_INCLUDED__ struct _sys_fildes { int o_fd; /* UNIX filedescriptor */ int o_flags; /* flags for open; 0 if not used */ }; typedef struct _sys_fildes File; extern File _sys_ftab[]; /* flags for sys_open() */ #define OP_READ 01 #define OP_WRITE 02 #define OP_APPEND 04 /* flags for sys_access() */ #define AC_EXIST 00 #define AC_READ 04 #define AC_WRITE 02 #define AC_EXEC 01 /* flags for sys_stop() */ #define S_END 0 #define S_EXIT 1 #define S_ABORT 2 /* standard file decsriptors */ #define STDIN &_sys_ftab[0] #define STDOUT &_sys_ftab[1] #define STDERR &_sys_ftab[2] /* maximum number of open files */ #define SYS_NOPEN 20 /* return value for sys_break */ #define ILL_BREAK ((char *)0) /* system's idea of block */ #define BUFSIZ 1024 #endif __SYSTEM_INCLUDED__ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: varargs.h,v 1.1 91/02/20 14:53:23 ceriel Exp $ */ #ifndef _VARARGS_H #define _VARARGS_H typedef char *va_list; # define __va_sz(mode) (((sizeof(mode) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) # define va_dcl int va_alist; # define va_start(list) (list = (char *) &va_alist) # define va_end(list) # define va_arg(list,mode) (*((mode *)((list += __va_sz(mode)) - __va_sz(mode)))) #endif /* _VARARGS_H */ /* $Header: wr_arhdr.c,v 1.6 91/01/18 09:54:56 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #include "object.h" wr_arhdr(fd, arhdr) register struct ar_hdr *arhdr; { char buf[AR_TOTAL]; register char *c = buf; register char *p = arhdr->ar_name; register int i = 14; while (i--) { *c++ = *p++; } put2((int)(arhdr->ar_date>>16),c); c += 2; put2((int)(arhdr->ar_date),c); c += 2; *c++ = arhdr->ar_uid; *c++ = arhdr->ar_gid; put2(arhdr->ar_mode,c); c += 2; put2((int)(arhdr->ar_size>>16),c); c += 2; put2((int)(arhdr->ar_size),c); wr_bytes(fd, buf, (long) AR_TOTAL); } /* $Header: wr_bytes.c,v 1.5 87/03/10 09:17:12 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #define MININT (1 << (sizeof(int) * 8 - 1)) #define MAXCHUNK (~MININT) /* Highest count we write(2). */ /* Notice that MAXCHUNK itself might be too large with some compilers. You have to put it in an int! */ static int maxchunk = MAXCHUNK; /* * Just write "cnt" bytes to file-descriptor "fd". */ wr_bytes(fd, string, cnt) register char *string; register long cnt; { while (cnt) { register int n = cnt >= maxchunk ? maxchunk : cnt; if (write(fd, string, n) != n) wr_fatal(); string += n; cnt -= n; } } /* $Header: wr_int2.c,v 1.3 87/03/10 09:17:23 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "object.h" wr_int2(fd, i) { char buf[2]; put2(i, buf); wr_bytes(fd, buf, 2L); } /* $Header: wr_long.c,v 1.3 87/03/10 09:17:35 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include "object.h" wr_long(fd, l) long l; { char buf[4]; put4(l, buf); wr_bytes(fd, buf, 4L); } /* $Header: wr_ranlib.c,v 1.4 87/03/10 09:18:01 ceriel Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #include "object.h" wr_ranlib(fd, ran, cnt) register struct ranlib *ran; register long cnt; { #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof (struct ranlib) != SZ_RAN) #endif { char buf[100 * SZ_RAN]; while (cnt) { register int i = (cnt > 100) ? 100 : cnt; register char *c = buf; long j = i * SZ_RAN; cnt -= i; while (i--) { put4(ran->ran_off,c); c += 4; put4(ran->ran_pos,c); c += 4; ran++; } wr_bytes(fd, buf, j); } } #if ! (BYTES_REVERSED || WORDS_REVERSED) else wr_bytes(fd, (char *) ran, cnt * SZ_RAN); #endif } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: write.c,v 1.3 89/06/30 14:46:27 ceriel Exp $ */ #include int sys_write(fp, bufptr, nbytes) File *fp; char *bufptr; int nbytes; { if (! fp) return 0; return write(fp->o_fd, bufptr, nbytes) == nbytes; } _...`Makefileaadvcave.hbadvdec.hcadvent.cdadvent.headvent1.txtfadvent2.txtgadvent3.txthadvent4.txtidatabase.cjenglish.ckinitial.clitverb.cmscore.cnsetup.cotravel.cpturn.cqutility.crverb.csvocab.c# Makefile for advent # Where to put the adventure text files, and the binary executable. # Need the trailing "/"s. TEXTDIR = /usr/lib/advent/ BINDIR = /usr/bin # Flags you may want to add to CFLAGS: # -DHAS_STDC=0 or 1 We have Standard C. Default=1 iff __STDC__ is nonzero. CC = cc CFLAGS = -D_POSIX_SOURCE LDFLAGS = -i OBJS = advent.o database.o english.o initial.o itverb.o score.o\ travel.o turn.o utility.o verb.o vocab.o DAT = advent1.dat advent2.dat advent3.dat advent4.dat INSTDAT = $(TEXTDIR)advent1.dat $(TEXTDIR)advent2.dat \ $(TEXTDIR)advent3.dat $(TEXTDIR)advent4.dat all: $(DAT) advent install: $(TEXTDIR) $(INSTDAT) $(BINDIR)/advent $(TEXTDIR): install -d -o bin $(TEXTDIR) $(TEXTDIR)advent1.dat: advent1.dat install -c -o bin $? $@ $(TEXTDIR)advent2.dat: advent2.dat install -c -o bin $? $@ $(TEXTDIR)advent3.dat: advent3.dat install -c -o bin $? $@ $(TEXTDIR)advent4.dat: advent4.dat install -c -o bin $? $@ $(BINDIR)/advent: advent install -cs -o bin $? $@ advent: $(OBJS) $(CC) $(LDFLAGS) -o advent $(OBJS) setup: setup.c advent.h $(CC) $(CFLAGS) $(LDFLAGS) -o setup setup.c advtext.h advent1.dat advent2.dat advent3.dat advent4.dat: \ setup advent1.txt advent2.txt advent3.txt advent4.txt ./setup advent.o: advent.h advdec.h advent.c $(CC) -c $(CFLAGS) -DTEXTDIR='"$(TEXTDIR)"' advent.c database.o: advent.h advdec.h advtext.h travel.o: advent.h advdec.h advcave.h initial.o english.o itverb.o score.o turn.o utility.o\ verb.o vocab.o: advent.h advdec.h clean: @rm -f *.o *.BAK *.dat advtext.h core advent setup /* header ADVCAVE.H */ /** WARNING: the travel array for the cave is stored as an * array of 1.. LONG INTEGERS. This requires 32 bit LONG INTEGERS. * These values are used in database.c "gettrav". * tcond*1000000 + tdest*1000 + tverb = value stored */ static long room1[] = { 2002, 2044, 2029, 2056, 3003, 3012, 3019, 3043, 4005, 4013, 4014, 4046, 4030, 5006, 5045, 5043, 8063, 147081, 157052, 157084, 0}; static long room2[] = { 1002, 1012, 1007, 1043, 1045, 1030, 30146006, 5006, 5045, 5046, 146044, 0}; static long room3[] = { 1011, 1032, 1044, 11062, 33065, 467785085, 202085, 79005, 79014, 238057, 238003, 238019, 0}; static long room4[] = { 1004, 1012, 1045, 5006, 5043, 5044, 5029, 7005, 7046, 7030, 8063, 0}; static long room5[] = { 4009, 4043, 4030, 50005006, 50005007, 50005045, 6006, 5044, 5046, 0}; static long room6[] = { 1002, 1045, 4009, 4043, 4044, 4030, 5006, 5046, 0}; static long room7[] = { 1012, 4004, 4045, 5006, 5043, 5044, 8005, 8015, 8016, 8046, 595060, 595014, 595030, 0}; static long room8[] = { 5006, 5043, 5044, 5046, 1012, 7004, 7013, 7045, 303009003, 303009019, 303009030, 593003, 0}; static long room9[] = { 303008011, 303008029, 593011, 10017, 10018, 10019, 10044, 14031, 11051, 0}; static long room10[] = { 9011, 9020, 9021, 9043, 11019, 11022, 11044, 11051, 14031, 0}; static long room11[] = { 303008063, 9064, 10017, 10018, 10023, 10024, 10043, 12025, 12019, 12029, 12044, 3062, 14031, 0}; static long room12[] = { 303008063, 9064, 11030, 11043, 11051, 13019, 13029, 13044, 14031, 0}; static long room13[] = { 303008063, 9064, 11051, 12025, 12043, 14023, 14031, 14044, 0}; static long room14[] = { 303008063, 9064, 11051, 13023, 13043, 150020030, 150020031, 150020034, 15030, 16033, 16044, 0}; static long room15[] = { 18036, 18046, 17007, 17038, 17044, 19010, 19030, 19045, 150022029, 150022031, 150022034, 150022035, 150022023, 150022043, 150022056, 150022010, 14029, 33055, 0}; static long room16[] = { 14001, 0}; static long room17[] = { 15038, 15043, 312596039, 412021007, 412597041, 412597042, 412597044, 412597069, 412597089, 27041, 0}; static long room18[] = { 15038, 15011, 15045, 0}; static long room19[] = { 150237029, 150237031, 150237034, 150237035, 150237043, 150237056, 150237010, 15025, 15010, 15029, 15043, 75556047, 311143047, 311028045, 311028036, 311029046, 311029037, 311030044, 311030007, 32045, 15074049, 211032049, 74066, 0}; static long room20[] = { 1, 0}; static long room21[] = { 1, 0}; static long room22[] = { 15001, 0}; static long room23[] = { 67043, 67042, 68044, 68061, 25030, 25031, 648052, 0}; static long room24[] = { 67029, 67011, 92027, 0}; static long room25[] = { 23029, 23011, 724031056, 26056, 0}; static long room26[] = { 88001, 0}; static long room27[] = { 312596039, 412021007, 412597041, 412597042, 412597043, 412597069, 412597089, 17041, 40045, 41044, 0}; static long room28[] = { 19038, 19011, 19046, 33045, 33055, 36030, 36052, 0}; static long room29[] = { 19038, 19011, 19045, 0}; static long room30[] = { 19038, 19011, 19043, 62044, 62029, 0}; static long room31[] = { 524089001, 90001, 0}; static long room32[] = { 19001, 0}; static long room33[] = { 3065, 28046, 34043, 34053, 34054, 35044, 159302071, 100071, 0}; static long room34[] = { 33030, 33055, 15029, 0}; static long room35[] = { 33043, 33055, 20039, 0}; static long room36[] = { 37043, 37017, 28029, 28052, 39044, 65070, 0}; static long room37[] = { 36044, 36017, 38030, 38031, 38056, 0}; static long room38[] = { 37056, 37029, 37011, 595060, 595014, 595030, 595004, 595005, 0}; static long room39[] = { 36043, 36023, 64030, 64052, 64058, 65070, 0}; static long room40[] = { 41001, 0}; static long room41[] = { 42046, 42029, 42023, 42056, 27043, 59045, 60044, 60017, 0}; static long room42[] = { 41029, 42045, 43043, 45046, 80044, 0}; static long room43[] = { 42044, 44046, 45043, 0}; static long room44[] = { 43043, 48030, 50046, 82045, 0}; static long room45[] = { 42044, 43045, 46043, 47046, 87029, 87030, 0}; static long room46[] = { 45044, 45011, 0}; static long room47[] = { 45043, 45011, 0}; static long room48[] = { 44029, 44011, 0}; static long room49[] = { 50043, 51044, 0}; static long room50[] = { 44043, 49044, 51030, 52046, 0}; static long room51[] = { 49044, 50029, 52043, 53046, 0}; static long room52[] = { 50044, 51043, 52046, 53029, 55045, 86030, 0}; static long room53[] = { 51044, 52045, 54046, 0}; static long room54[] = { 53044, 53011, 0}; static long room55[] = { 52044, 55045, 56030, 57043, 0}; static long room56[] = { 55029, 55011, 0}; static long room57[] = { 13030, 13056, 55044, 58046, 83045, 84043, 0}; static long room58[] = { 57043, 57011, 0}; static long room59[] = { 27001, 0}; static long room60[] = { 41043, 41029, 41017, 61044, 62045, 62030, 62052, 50191046, 50191033, 392173046, 392173033, 172046, 172033, 648056, 0}; static long room61[] = { 60043, 62045, 100107046, 0}; static long room62[] = { 60044, 63045, 30043, 61046, 0}; static long room63[] = { 62046, 62011, 0}; static long room64[] = { 39029, 39056, 39059, 65044, 65070, 103045, 103074, 106043, 0}; static long room65[] = { 64043, 66044, 40556046, 68061, 40556029, 50070029, 39029, 40556045, 50072045, 71045, 50556030, 106030, 71025, 0}; static long room66[] = { 65047, 67044, 80556046, 77025, 96043, 50556050, 97072, 0}; static long room67[] = { 66043, 23044, 23042, 24030, 24031, 0}; static long room68[] = { 23046, 69029, 69056, 65045, 0}; static long room69[] = { 68030, 68061, 331120046, 119046, 109045, 113075, 0}; static long room70[] = { 71045, 65030, 65023, 111046, 0}; static long room71[] = { 65048, 70046, 110045, 0}; static long room72[] = { 65070, 118047, 73045, 97049, 97072, 0}; static long room73[] = { 72046, 72017, 72011, 0}; static long room74[] = { 19043, 331120044, 121044, 75030, 0}; static long room75[] = { 76046, 77045, 0}; static long room76[] = { 75045, 0}; static long room77[] = { 75043, 78044, 66045, 66017, 0}; static long room78[] = { 77046, 0}; static long room79[] = { 3001, 0}; static long room80[] = { 42045, 80044, 80046, 81043, 0}; static long room81[] = { 80044, 80011, 0}; static long room82[] = { 44046, 44011, 0}; static long room83[] = { 57046, 84043, 85044, 0}; static long room84[] = { 57045, 83044, 114050, 0}; static long room85[] = { 83043, 83011, 0}; static long room86[] = { 52029, 52011, 0}; static long room87[] = { 45029, 45030, 0}; static long room88[] = { 25030, 25056, 25043, 20039, 92044, 92027, 0}; static long room89[] = { 25001, 0}; static long room90[] = { 23001, 0}; static long room91[] = { 95045, 95073, 95023, 72030, 72056, 0}; static long room92[] = { 88046, 93043, 94045, 0}; static long room93[] = { 92046, 92027, 92011, 0}; static long room94[] = { 92046)7+7,7-7.7/707172737475767778797:7, 92027, 92023, 341095045, 341095003, 341095073, 611045, 0}; static long room95[] = { 94046, 94011, 92027, 91044, 145030, 145039, 145080, 145052, 0}; static long room96[] = { 66044, 66011, 0}; static long room97[] = { 66048, 72043, 72017, 98029, 98045, 98073, 0}; static long room98[] = { 235047, 97046, 97072, 99044, 3142029, 3142049, 3142056, 3142079, 75702029, 75702049, 75702056, 75702079, 703029, 703049, 703056, 703079, 141078, 0}; static long room99[] = { 98050, 98073, 301043, 301023, 100043, 0}; static long room100[] = { 301044, 301023, 301011, 99044, 159302071, 159302055, 33071, 33055, 101047, 101022, 0}; static long room101[] = { 100046, 100071, 100011, 0}; static long room102[] = { 103030, 103074, 103011, 0}; static long room103[] = { 388196029, 388196038, 102029, 102038, 104030, 114618046, 115619046, 64046, 0}; static long room104[] = { 103029, 103074, 105030, 0}; static long room105[] = { 104029, 104011, 103074, 0}; static long room106[] = { 64029, 65044, 108043, 0}; static long room107[] = { 131046, 132049, 133047, 134048, 135029, 136050, 137043, 138044, 139045, 61030, 0}; static long room108[] = { 90556043, 90556045, 90556046, 90556047, 90556048, 90556049, 90556050, 90556029, 90556030, 106043, 626044, 0}; static long room109[] = { 69046, 113045, 113075, 0}; static long room110[] = { 71044, 20039, 0}; static long room111[] = { 70045, 40050030, 40050039, 40050056, 50053030, 45030, 0}; static long room112[] = { 131049, 132045, 133043, 134050, 135048, 136047, 137044, 138030, 139029, 140046, 0}; static long room113[] = { 109046, 109011, 0}; static long room114[] = { 84048, 0}; static long room115[] = { 116049, 116042, 116069, 212019, 212003, 212045, 0}; static long room116[] = { 115047, 115042, 115069, 212019, 212003, 593030, 0}; static long room117[] = { 118049, 233660041, 233660042, 233660069, 233660047, 233660089, 332661041, 303041, 332021039, 596039, 0}; static long room118[] = { 72030, 117029, 0}; static long room119[] = { 69045, 69011, 653043, 65307, 0}; static long room120[] = { 69045, 74043, 0}; static long room121[] = { 74043, 74011, 653045, 653007, 0}; static long room122[] = { 123047, 233660041, 233660042, 233660069, 233660049, 233660089, 303041, 596039, 124077, 126028, 129040, 0}; static long room123[] = { 122044, 124043, 124077, 126028, 129040, 0}; static long room124[] = { 123044, 125047, 125036, 128048, 128037, 128030, 126028, 129040, 0}; static long room125[] = { 124046, 124077, 126045, 126028, 127043, 127017, 0}; static long room126[] = { 125046, 125023, 125011, 124077, 610030, 610039, 0}; static long room127[] = { 125044, 125011, 125017, 124077, 126028, 0}; static long room128[] = { 124045, 124029, 124077, 129046, 129030, 129040, 126028, 0}; static long room129[] = { 128044, 128029, 124077, 130043, 130019, 130040, 130003, 126028, 0}; static long room130[] = { 129044, 129011, 124077, 126028, 0}; static long room131[] = { 107044, 132048, 133050, 134049, 135047, 136029, 137030, 138045, 139046, 112043, 0}; static long room132[] = { 107050, 131029, 133045, 134046, 135044, 136049, 137047, 138043, 139030, 112048, 0}; static long room133[] = { 107029, 131030, 132044, 134047, 135049, 136043, 137045, 138050, 139048, 112046, 0}; static long room134[] = { 107047, 131045, 132050, 133048, 135043, 136030, 137046, 138029, 139044, 112049, 0}; static long room135[] = { 107045, 131048, 132030, 133046, 134043, 136044, 137049, 138047, 139050, 112029, 0}; static long room136[] = { 107043, 131044, 132029, 133049, 134030, 135046, 137050, 138048, 139047, 112045, 0}; static long room137[] = { 107048, 131047, 132046, 133030, 134029, 135050, 136045, 138049, 139043, 112044, 0}; static long room138[] = { 107030, 131043, 132047, 133029, 134044, 135045, 136046, 137048, 139049, 112050, 0}; static long room139[] = { 107049, 131050, 132043, 133044, 134045, 135030, 136048, 137029, 138046, 112047, 0}; static long room140[] = { 112045, 112011, 0}; static long room141[] = { 142029, 142043, 142056, 142078, 142079, 0}; static long room142[] = { 98043, 98030, 98007, 98079, 141008, 141044, 141078, 0}; static long room143[] = { 19044, 19011, 144043, 0}; static long room144[] = { 143044, 143008, 19011, 0}; static long room145[] = { 141001, 0}; static long room146[] = { 2043, 2029, 2002, 2056, 50006046, 50006006, 146046, 146006, 147044, 148045, 0}; static long room147[] = { 146043, 146046, 148045, 153044, 157052, 3012, 157084, 0}; static long room148[] = { 50147046, 146046, 149043, 149044, 149045, 3012, 166091, 0}; static long room149[] = { 149046, 151043, 150044, 152045, 0}; static long room150[] = { 151045, 151046, 149043, 149044, 0}; static long room151[] = { 148043, 152044, 150045, 149046, 0}; static long room152[] = { 151043, 150046, 0}; static long room153[] = { 154045, 239046, 147043, 3012, 0}; static long room154[] = { 50155045, 157045, 157030, 155029, 153046, 3012, 0}; static long room155[] = { 154030, 154008, 154046, 156039, 3012, 0}; static long room156[] = { 1, 0}; static long room157[] = { 227019, 227043, 154011, 154046, 154029, 3012, 0}; static long room158[] = { 229044, 229034, 229030, 157011, 161082, 725056, 725029, 726083, 747003, 747019, 747043, 747064, 0}; static long room159[] = { 732011, 732044, 732034, 0}; static long room160[] = { 343167043, 343167019, 343167003, 738043, 162082, 723044, 723056, 723030, 165039, 0}; static long room161[] = { 304001, 0}; static long room162[] = { 304001, 0}; static long room163[] = { 304001, 0}; static long room164[] = { 304001, 0}; static long room165[] = { 1, 0}; static long room166[] = { 747003, 747011, 747019, 747044, 148232043, 148232069, 148232041, 148232042, 148169047, 148233046, 148234045, 717043, 717069, 717041, 717042, 717047, 448164082, 720082, 0}; static long room167[] = { 163082, 343160044, 343160011, 343160003, 343160019, 738044, 722043, 722069, 722041, 722042, 0}; static long room168[] = { 448170048, 448170029, 448170023, 719048, 719029, 719023, 148169045, 148192046, 148166044, 148166069, 148166041, 148166042, 717044, 717045, 717046, 0}; static long room169[] = { 148168046, 148166049, 717049, 717046, 448179023, 448179043, 448179029, 719023, 719029, 0}; static long room170[] = { 171043, 171029, 168044, 168030, 0}; static long room171[] = { 170050, 170030, 180043, 180029, 0}; static long room172[] = { 60045, 174046, 0}; static long room173[] = { 60045, 0}; static long room174[] = { 392178047, 172047, 172033, 175050, 0}; static long room175[] = { 177045, 174043, 176031, 176030, 176056, 0}; static long room176[] = { 175029, 175056, 175011, 175008, 0}; static long room177[] = { 60030, 60056, 60039, 175046, 175008, 0}; static long room178[] = { 174001, 0}; static long room179[] = { 169030, 169044, 198029, 198043, 198014, 0}; static long room180[] = { 171044, 182029, 182056, 213043, 0}; static long room181[] = { 227001, 0}; static long room182[] = { 180044, 183043, 0}; static long room183[] = { 182044, 50184043, 186043, 185046, 187045, 0}; static long room184[] = { 183049, 188048, 0}; static long room185[] = { 183045, 0}; static long room186[] = { 183050, 188047, 0}; static long room187[] = { 183044, 188043, 0}; static long room188[] = { 187045, 184044, 65190049, 65190030, 186049, 305019, 305003, 0}; static long room189[] = { 188011, 188008, 0}; static long room190[] = { 422306069, 422306045, 422306042, 422306089, 661069, 188029, 188008, 0}; static long room191[] = { 60045, 0}; static long room192[] = { 148166045, 148168047, 717045, 717047, 448197043, 720043, 0}; static long room193[] = { 197044, 0}; static long room194[] = { 224044, 0}; static long room195[] = { 196052, 196053, 196046, 196069, 196036, 224044, 0}; static long room196[] = { 103030, 103074, 114618052, 114618053, 114618045, 114618069, 195052, 0}; static long room197[] = { 193043, 192044, 0}; static long room198[] = { 179049, 179014, 179005, 179023, 203030, 203043, 402200046, 402200029, 772046, 772029, 0}; static long room199[] = { 198001, 0}; static long room200[] = { 198044, 201043, 201029, 0}; static long room201[] = { 402200044, 402200030, 772044, 772030, 202043, 230045, 0}; static long room202[] = { 201044, 467785085, 205085, 206043, 0}; static long room203[] = { 447199030, 447199043, 447199088, 204030, 204043, 204088, 198029, 198044, 0}; static long room204[] = { 203029, 203044, 203008, 203011, 0}; static long room205[] = { 219045, 467785085, 202085, 226039, 0}; static long room206[] = { 207045, 207017, 202044, 648029, 648052, 0}; static long room207[] = { 208045, 206046, 0}; static long room208[] = { 236043, 207046, 207017, 209044, 793069, 793042, 793045, 0}; static long room209[] = { 208043, 210029, 210056, 0}; static long room210[] = { 211030, 211043, 209044, 0}; static long room211[] = { 210029, 210008, 210044, 72030, 72043, 0}; static long room212[] = { 115011, 115008, 115046, 0}; static long room213[] = { 206030, 206052, 180044, 180008, 0}; static long room214[] = { 148166046, 148169048, 717046, 717048, 448215047, 720047, 0}; static long room215[] = { 214049, 216029, 0}; static long room216[] = { 215030, 217043, 217029, 0}; static long room217[] = { 216044, 216030, 216011, 218043, 218031, 0}; static long room218[] = { 217008, 217044, 230029, 230056, 0}; static long room219[] = { 205046, 205089, 222045, 222090, 220043, 221044, 3092, 0}; static long room220[] = { 219044, 225043, 0}; static long room221[] = { 219043, 0}; static long room222[] = { 219046, 223029, 3092, 0}; static long room223[] = { 222030, 224029, 0}; static long room224[] = { 223030, 223052, 338195043, 194043, 0}; static long room225[] = { 220044, 0}; static long room226[] = { 1, 0}; static long room227[] = { 157044, 157011, 157029, 398228043, 398228019, 398228030, 181043, 181019, 181030, 0}; static long room228[] = { 792045, 792046, 792004, 792005, 792033, 227029, 227044, 227011, 229039, 786043, 786019, 786042, 786069, 786041, 0}; static long room229[] = { 792045, 792046, 792004, 792005, 792033, 228039, 786044, 786011, 786042, 786069, 796041, 158043, 158019, 158034, 0}; static long room230[] = { 65218030, 65218039, 231030, 231039, 201046, 201017, 0}; static long room231[] = { 1, 0}; static long room232[] = { 168001, 0}; static long room233[] = { 192001, 0}; static long room234[] = { 214001, 0}; static long room235[] = { 422306069, 422306046, 422306042, 422306089, 661069, 98044, 0}; static long room236[] = { 208044, 0}; static long room237[] = { 19001, 0}; static long room238[] = { 3011, 3064, 0}; static long room239[] = { 153045, 153047, 240093, 0}; static long room240[] = { 239047, 239042, 239069, 239093, 241030, 0}; static long room241[] = { 240029, 242044, 0}; static long room242[] = { 241043, 243049, 244044, 246050, 0}; static long room243[] = { 242047, 244045, 247050, 0}; static long room244[] = { 242043, 243046, 245044, 246045, 0}; static long room245[] = { 243046, 244043, 246045, 247044, 0}; static long room246[] = { 242048, 245046, 247049, 0}; static long room247[] = { 243048, 245043, 246047, 307044, 0}; static long room248[] = { 247043, 0}; static long *cave[MAXLOC] = { room1, room2, room3, room4, room5, room6, room7, room8, room9, room10, room11, room12, room13, room14, room15, room16, room17, room18, room19, room20, room21, room22, room23, room24, room25, room26, room27, room28, room29, room30, room31, room32, room33, room34, room35, room36, room37, room38, room39, room40, room41, room42, room43, room44, room45, room46, room47, room48, room49, room50, room51, room52, room53, room54, room55, room56, room57, room58, room59, room60, room61, room62, room63, room64, room65, room66, room67, room68, room69, room70, room71, room72, room73, room74, room75, room76, room77, room78, room79, room80, room81, room82, room83, room84, room85, room86, room87, room88, room89, room90, room91, room92, room93, room94, room95, room96, room97, room98, room99, room100, room101, room102, room103, room104, room105, room106, room107, room108, room109, room110, room111, room112, room113, room114, room115, room116, room117, room118, room119, room120, room121, room122, room123, room124, room125, room126, room127, room128, room129, room130, room131, room132, room133, room134, room135, room136, room137, room138, room139, room140, room141, room142, room143, room144, room145, room146, room147, room148, room149, room150, room151, room152, room153, room154, room155, room156, room157, room158, room159, room160, room161, room162, room163, room164, room165, room166, room167, room168, room169, room170, room171, room172, room173, room174, room175, room176, room177, room178, room179, room180, room181, room182, room183, room184, room185, room186, room187, room188, room189, room190, room191, room192, room193, room194, room195, room196, room197, room198, room199, room200, room201, room202, room203, room204, room205, room206, room207, room208, room209, room210, room211, room212, room213, room214, room215, room216, room217, room218, room219, room220, room221, room222, room223, room224, room225, room226, room227, room228, room229, room230, room231, room232, room233, room234, room235, room236, room237, room238, room239, room240, room241, room242, room243, room244, room245, room246, room247, room248}; /* header ADVDEC.H * * WARNING: GLOBAL (EXTERNAL) declarations for adventure */ #ifndef EXTERN /* #define as '' to define the variables */ #define EXTERN extern #endif EXTERN boolean gaveup; /* TRUE if he quits early */ EXTERN FILE *fd1, *fd2, *fd3, *fd4; /* English variables */ EXTERN char *vtxt[MAXWORDS], *iotxt[MAXITEMS], *otxt[MAXITEMS]; EXTERN int verbs[MAXWORDS], objs[MAXITEMS], iobjs[MAXITEMS]; EXTERN int vrbx, objx, iobx; EXTERN int verb, object, motion, iobj, prep; EXTERN boolean newtravel, is_wiz; /* Play variables */ extern int plac[MAXOBJ]; /* initial location */ extern int fixd[MAXOBJ]; struct playinfo { int turns; int loc, oldloc, oldloc2, newloc; /* location variables */ long loc_attrib[MAXLOC+1]; /* location status */ int place[MAXOBJ]; /* object location */ int fixed[MAXOBJ]; /* second object loc */ int weight[MAXOBJ]; int atloc[MAXLOC+1]; int link[MAXOBJ * 2]; int holder[MAXOBJ]; int hlink[MAXOBJ]; int visited[MAXLOC+1]; /* >0 if has been here */ int prop[MAXOBJ]; /* status of object */ long obj_state[MAXOBJ]; long points[MAXOBJ]; int hinted[HNTMAX+1]; int hints[HNTMAX+1][5]; int hintlc[HNTMAX+1]; int tally, tally2; /* item counts */ int limit; /* time limit */ int lmwarn; /* lamp warning flag */ int wzdark, closing, closed; /* game state flags */ int holding; /* count of held items */ int detail; /* LOOK count */ int knfloc; /* knife location */ int clock, clock2, panic; /* timing variables */ int dloc[DWARFMAX+1]; /* dwarf locations */ int dflag; /* dwarf flag */ int dseen[DWARFMAX+1]; /* dwarf seen flag */ int odloc[DWARFMAX+1]; /* dwarf old locations */ int daltloc; /* alternate appearance */ int dkill; /* dwarves killed */ int chloc, chloc2; /* chest locations */ int bonus; /* to pass to end */ int numdie; /* number of deaths */ int foobar; /* fee fie foe foo... */ int combo; /* combination for safe */ boolean terse; int abbnum; int health; int chase; boolean flg239; int lastglob; /* to get space req. */ }; extern struct playinfo g; /** Adventure translated from Fortran to "C" and ported to Minix by: Robert R. Hall San Diego, Calif 92115 hall@crash.cts.com */ /** program ADVENT.C * * "advent.c" allocates GLOBAL storage space by * * #defining EXTERN before #including "advdec.h". */ #include #include #include #include #include #include #include "advent.h" /* #define preprocessor equates */ #include "advdec.h" #ifndef TEXTDIR #define TEXTDIR "" #endif char textdir[] = TEXTDIR; /* directory where text files live. */ _PROTOTYPE(int main, (int, char **)); _PROTOTYPE(static void opentxt, (void)); _PROTOTYPE(static void file_error, (char *)); int main(argc, argv) int argc; char **argv; { opentxt(); initialize(); rspeak(325); if (argc == 2) restore(argv[1]); else { g.hinted[3] = yes(65, 1, 0); g.limit = (g.hinted[3] ? 800 : 550); } gaveup = FALSE; srand((unsigned) time(NULL)); /* seed random */ while (!gaveup) turn(); fclose(fd1); fclose(fd2); fclose(fd3); fclose(fd4); return (EXIT_SUCCESS); /* exit = ok */ } /* main */ /* Open advent?.txt files */ static void opentxt() { static char filename[sizeof(textdir) + 16]; static FILE **fp[] = {0, &fd1, &fd2, &fd3, &fd4}; int i; for (i = 1; i <= 4; i++) { sprintf(filename, "%sadvent%d.dat", textdir, i); *fp[i] = fopen(filename, "r"); if (!*fp[i]) file_error(filename); } } /* save adventure game */ void saveadv(username) char *username; { int cnt; FILE *savefd; savefd = fopen(username, "wb"); if (savefd == NULL) { perror(username); return; } cnt = fwrite((void *) &g, 1, sizeof(struct playinfo), savefd); if (cnt != sizeof(struct playinfo)) { fprintf(stderr, "wrote %d of %u bytes\n", cnt, (unsigned) sizeof(struct playinfo)); if (ferror(savefd)) { fprintf(stderr, "errno is: 0x%.4x\n", errno); perror(username); } } if (fclose(savefd) == -1) { perror(username); } printf("Saved in %s.\n", username); return; } /* restore saved game handler */ void restore(username) char *username; { int cnt; FILE *restfd; restfd = fopen(username, "rb"); if (restfd == NULL) file_error(username); cnt = fread((void *) &g, 1, sizeof(struct playinfo), restfd); if (cnt != sizeof(struct playinfo)) { fprintf(stderr, "read %d bytes, expected %u\n", cnt, (unsigned) sizeof(struct playinfo)); if (ferror(restfd)) { fprintf(stderr, "errno is: 0x%.4x\n", errno); perror(username); } } if (fclose(restfd) == -1) { perror(username); } printf("Restored from %s.\n", username); return; } static void file_error(filename) char *filename; { perror(filename); exit(EXIT_FAILURE); } /* header ADVENT.H * * WARNING: HEADER file for all adventure modules */ #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #define EXIT_SUCCESS (!(EXIT_FAILURE)) #endif #define INPUTBUFLEN 80 /* Max input line length */ typedef int boolean; #define FALSE (0) #define TRUE (!FALSE) #define MAXOBJ 123 /* max # of objects in cave */ #define MAXLOC 248 /* max # of cave locations */ #define WORDSIZE 20 /* max # of chars in commands */ #define MAXMSG 408 /* max # of long location descr */ #define HNTMAX 18 /* max # of hints */ #define HNTMIN 7 /* hints starting count */ #define MAXWORDS 25 #define MAXITEMS 45 #define CLASS(word) ((word)<0 ? -((-(word)) / 1000) : (word) / 1000) #define VAL(word) ((word)<0 ? -((-(word)) % 1000) : (word) % 1000) #define MAXTRAV (23+1) /* max # of travel directions from loc */ /* +1 for terminator travel[x].tdest=-1 */ #define DWARFMAX 6 /* max # of nasty dwarves */ #define MAXDIE 3 /* max # of deaths before close */ #define MAXTRS 79 /* max # of */ #define Y2 33 /* Object definitions */ #define ANVIL 91 #define AXE 28 #define BATTERIES 39 #define BEAR 35 #define BEES 87 #define BILLBD 116 #define BIRD 101 #define BOAT 48 #define BOOK 110 #define BOOK2 BOOK + 1 #define BOOTH 93 #define BOTTLE 20 #define BRUSH 114 #define CAGE 4 #define CAKES 107 #define CARVNG 115 #define CASK 71 #define CHAIN 64 #define CHASM 21 #define CHASM2 CHASM + 1 #define CHEST 55 #define CLAM 14 #define CLOAK 47 #define COINS 54 #define CROWN 66 #define DOG 98 #define DOOR 41 /* giant door */ #define DRAGON 31 #define DWARF 17 #define EGGS 56 #define EMERALD 59 #define FISSURE 12 #define FLOWER 46 #define FLY 69 #define FOOD 19 #define GNOME 105 #define GRAIL 70 #define GRATE 3 #define HIVE 97 #define HONEY 96 #define HORN 52 #define JEWELS 53 #define KEYS 102 #define KNIFE 18 #define LAMP 2 #define LYRE 68 #define MAGAZINE 16 #define MESSAGE 36 #define MIRROR 23 #define MUSHRM 106 #define NUGGET 50 #define OIL 83 #define OIL2 OIL + 1 #define OYSTER 15 #define PLAGUE 125 #define PEARL 61 #define PHONE 94 #define PILLOW 10 #define PLANT 24 #define PLANT2 PLANT + 1 #define POLE 9 #define POSTER 113 #define PYRAMID 60 #define RADIUM 119 #define RING 72 #define ROCKS 92 #define ROD 5 #define ROD2 ROD + 1 #define RUG 62 #define SAFE 112 #define SAPPHIRE 69 #define SHIELD 118 #define SHOES 67 #define SKEY 90 #define SLUGS 95 #define SNAKE 11 #define SPHERE 120 #define SPICES 63 #define SPIDER 121 #define STEPS 7 #define STICKS 49 #define SWORD 65 #define TABLET 13 #define TDOOR 42 /* tiny door */ #define TDOOR2 TDOOR + 1 /* wrought-iron door */ #define PDOOR TDOOR2 + 1 /* door to phone booth */ #define TRIDENT 57 #define TROLL 33 #define TROLL2 TROLL + 1 #define VASE 58 #define VEND 38 #define WALL 88 #define WALL2 WALL + 1 #define WATER 81 /* in bottle */ #define WATER2 WATER + 1 /* in cask */ #define WINE 85 /* in bottle */ #define WINE2 WINE + 1 /* in cask */ #define WUMPUS 99 /* Verb definitions */ #define BACK 8 #define CAVE 67 #define DEPRESSION 63 #define ENTRANCE 64 #define EXIT 11 #define NULLX 21 /* Action verb definitions */ #define TAKE 1 #define DROP 2 #define SAY 3 #define OPEN 4 #define NOTHING 5 #define CLOSE 6 #define ON 7 #define OFF 8 #define WAVE 9 #define CALM 10 #define WALK 11 #define KILL 12 #define POUR 13 #define EAT 14 #define DRINK 15 #define RUB 16 #define THROW 17 #define QUIT 18 #define FIND 19 #define INVENTORY 20 #define FEED 21 #define FILL 22 #define BLAST 23 #define SCORE 24 #define FOO 25 #define BRIEF 26 #define READ 27 #define BREAK 28 #define WAKE 29 #define SUSPEND 30 #define RESTORE 31 #define YANK 32 #define WEAR 33 #define HIT 34 #define ANSWER 35 #define BLOW 36 #define LEAVE 37 #define YELL 38 #define DIAL 39 #define PLAY 40 #define PICK 41 #define PUT 42 #define TURN 43 #define GET 44 #define INSRT 45 #define REMOVE 46 #define BURN 47 #define GRIPE 48 #define LOCK 49 #define UNLOCK 50 #define HEALTH 51 #define LOOK 52 #define COMBO 53 #define SWEEP 54 #define TERSE 55 #define WIZ 56 #define MAP 57 #define GATE 58 #define PIRLOC 59 #define GO 11 #define SHUT 6 #define LOG 33 #define MOTION 0 /* CLASSD */ #define NOUN 1 /* CLASSN */ #define ACTION 2 /* CLASSA */ #define MISC 3 /* CLASSM */ #define PREPOSITION 4 /* CLASSP */ #define ADJACTIVE 5 /* CLASSJ */ #define CONJUNCTION 6 /* CLASSC */ /* and a few preposition. prefix PREP to distinguish them from verbs or nouns */ #define PREPAT 9 #define PREPDN 8 #define PREPIN 1 #define PREPFR 5 #define PREPOF 6 #define PREPOFF 6 #define PREPON 2 /* BIT mapping of "cond" array which indicates location status */ #define LIGHT 1 #define WATOIL 2 #define LIQUID 4 #define NOPIRAT 16 /* Object condition bit functions */ #define OPENBT 2 #define LOCKBT 4 #define BURNBT 6 #define DEADBT 10 #define WEARBT 12 /* Structure definitions */ struct wac { char *aword; int acode; }; struct trav { int tdest; int tverb; int tcond; }; /* Function prototypes. "#if (__STDC__)" should have been be enough, but some compilers are stupid, so allow Makefile to say -DHAS_STDC=whatever. */ #if defined(HAS_STDC) ? (HAS_STDC) : (__STDC__) #undef HAS_STDC #define HAS_STDC 1 #define _PROTOTYPE(function, params) function params #define _CONST const #else #define _PROTOTYPE(function, params) function () #define _CONST #endif /* Advent.c */ _PROTOTYPE(void saveadv, (char *username)); _PROTOTYPE(void restore, (char *username)); /* Initialize.c */ _PROTOTYPE(void initialize, (void)); /* Database.c */ _PROTOTYPE(int yes, (int msg1, int msg2, int msg3)); _PROTOTYPE(void rspeak, (int msg)); _PROTOTYPE(void pspeak, (int item, int state)); _PROTOTYPE(void desclg, (int loc)); _PROTOTYPE(void descsh, (int loc)); /* English.c */ _PROTOTYPE(int english, (void)); _PROTOTYPE(int analyze, (char *word, int *type, int *value)); /* Itverb.c */ _PROTOTYPE(void itverb, (void)); _PROTOTYPE(void ivblast, (void)); _PROTOTYPE(void ivlook, (void)); /* Turn.c */ _PROTOTYPE(void turn, (void)); _PROTOTYPE(void describe, (void)); _PROTOTYPE(void descitem, (void)); _PROTOTYPE(void dwarfend, (void)); _PROTOTYPE(void normend, (void)); _PROTOTYPE(void score, (int)); _PROTOTYPE(void death, (void)); _PROTOTYPE(char *probj, (void)); _PROTOTYPE(void trobj, (void)); _PROTOTYPE(void dwarves, (void)); _PROTOTYPE(void dopirate, (void)); _PROTOTYPE(int stimer, (void)); /* Verb.c */ _PROTOTYPE(void trverb, (void)); _PROTOTYPE(void vtake, (void)); _PROTOTYPE(void vdrop, (void)); _PROTOTYPE(void vopen, (void)); _PROTOTYPE(void vsay, (void)); _PROTOTYPE(void von, (void)); _PROTOTYPE(void voff, (void)); _PROTOTYPE(void vwave, (void)); _PROTOTYPE(void vkill, (void)); _PROTOTYPE(void vpour, (void)); _PROTOTYPE(void veat, (void)); _PROTOTYPE(void vdrink, (void)); _PROTOTYPE(void vthrow, (void)); _PROTOTYPE(void vfind, (void)); _PROTOTYPE(void vfill, (void)); _PROTOTYPE(void vfeed, (void)); _PROTOTYPE(void vread, (void)); _PROTOTYPE(void vbreak, (void)); _PROTOTYPE(void vwake, (void)); _PROTOTYPE(void actspk, (int verb)); _PROTOTYPE(void vyank, (void)); _PROTOTYPE(void vwear, (void)); _PROTOTYPE(void vlock, (void)); _PROTOTYPE(void vunlock, (void)); _PROTOTYPE(void vclose, (void)); /* Utility.c */ _PROTOTYPE(boolean ajar, (int)); _PROTOTYPE(boolean at, (int item)); _PROTOTYPE(boolean athand, (int)); _PROTOTYPE(void bitoff, (int, int)); _PROTOTYPE(void biton, (int, int)); _PROTOTYPE(boolean bitset, (long, int)); _PROTOTYPE(boolean blind, (void)); _PROTOTYPE(int burden, (int)); _PROTOTYPE(void carry, (int obj, int where)); _PROTOTYPE(int confuz, (void)); _PROTOTYPE(boolean dark, (void)); _PROTOTYPE(boolean dcheck, (void)); _PROTOTYPE(boolean dead, (int)); _PROTOTYPE(void drop, (int obj, int where)); _PROTOTYPE(void destroy, (int obj)); _PROTOTYPE(boolean edible, (int)); _PROTOTYPE(boolean enclosed, (int)); _PROTOTYPE(void extract, (int)); _PROTOTYPE(boolean forced, (int atloc)); _PROTOTYPE(boolean here, (int item)); _PROTOTYPE(boolean hinged, (int)); _PROTOTYPE(boolean holding, (int)); _PROTOTYPE(void insert, (int, int)); _PROTOTYPE(boolean inside, (int)); _PROTOTYPE(void juggle, (int loc)); _PROTOTYPE(int liq, (int))H7J7K7; _PROTOTYPE(int liqloc, (int loc)); _PROTOTYPE(int liq2, (int pbottle)); _PROTOTYPE(boolean living, (int)); _PROTOTYPE(boolean locked, (int)); _PROTOTYPE(boolean locks, (int)); _PROTOTYPE(void lookin, (int)); _PROTOTYPE(void move, (int obj, int where)); _PROTOTYPE(int noway, (void)); _PROTOTYPE(boolean opaque, (int)); _PROTOTYPE(boolean outside, (int)); _PROTOTYPE(boolean pct, (int x)); _PROTOTYPE(boolean plural, (int)); _PROTOTYPE(boolean portal, (int)); _PROTOTYPE(boolean printed, (int)); _PROTOTYPE(int put, (int obj, int where, int pval)); _PROTOTYPE(int ranz, (int)); _PROTOTYPE(boolean small, (int)); _PROTOTYPE(boolean toting, (int item)); _PROTOTYPE(boolean treasr, (int)); _PROTOTYPE(boolean vessel, (int)); _PROTOTYPE(boolean wearng, (int)); _PROTOTYPE(boolean worn, (int)); _PROTOTYPE(void bug, (unsigned int n)); _PROTOTYPE(char *ask, (char *prompt, char *buf, int buflen)); _PROTOTYPE(void panic, (char *msg, boolean save)); /* travel.c */ _PROTOTYPE(void domove, (void)); _PROTOTYPE(void gettrav, (int loc, struct trav *travel)); /* vocab.c */ _PROTOTYPE(int vocab, (char *word, int val)); #1 You are standing at the end of a road before a small brick building. Around you is a forest. A small stream flows out of the building and down a gully. #2 You have walked up a hill, still in the forest. The road slopes back down the other side of the hill. There is a building in the distance. #3 You are inside a building, a well house for a large spring. Off to one side is a small pantry. #4 You are in a valley in the forest beside a stream tumbling along a rocky bed. #5 You are in open forest, with a deep valley to one side. Not far is a large billboard. #6 You are in open forest near both a valley and a road. #7 At your feet all the water of the stream splashes into a 2-inch slit in the rock. Downstream the stream bed is bare rock. #8 You are in a 20-foot depression floored with bare dirt. Set into the dirt is a strong steel grate mounted in concrete. A dry stream bed leads into the depression. #9 You are in a small chamber beneath a 3x3 steel grate to the surface. A low crawl over cobbles leads inward to the west. #10 You are crawling over cobbles in a low passage. There is a dim light at the east end of the passage. #11 You are in a debris room filled with stuff washed in from the surface. A low wide passage with cobbles becomes plugged with mud and debris here, but an awkward canyon leads upward and west. A note on the wall says "Magic Word XYZZY". #12 You are in an awkward sloping east/west canyon. #13 You are in a splendid chamber thirty feet high. The walls are frozen rivers of orange stone. An awkward canyon and a good passage exit from east and west sides of the chamber. #14 At your feet is a small pit breathing traces of white mist. An east passage ends here except for a small crack leading on. #15 You are at one end of a vast hall stretching forward out of sight to the west. There are openings to either side. Nearby, a wide stone staircase leads downward. The hall is filled with wisps of white mist swaying to and fro almost as if alive. A cold wind blows up the staircase. There is a passage at the top of a dome behind you. #16 The crack is far too small for you to follow. #17 You are on the east bank of a fissure slicing clear across the hall. The mist is quite thick here, and the fissure is too wide to jump. #18 This is a low room with a crude note on the wall. The note says, "You won't get it up the steps". #19 You are in the Hall of the Mountain King, with passages off in all directions. #20 You are at the bottom of the pit with a broken neck. #21 You didn't make it. #22 The dome is unclimbable. #23 You are at the west end of the Twopit Room. There is a large hole in the wall above the pit at this end of the room. #24 You are at the bottom of the eastern pit in the Twopit Room. There is a small pool of oil in one corner of the pit. #25 You are at the bottom of the western pit in the Twopit Room. There is a large hole in the wall about 25 feet above you. #26 You clamber up the plant and scurry through the hole at the top. #27 You are on the west side of the fissure in the Hall of Mists. #28 You are in a low N/S passage at a hole in the floor. The hole goes down to an E/W passage. #29 You are in the South Side Chamber. #30 You are in the West Side Chamber of the Hall of the Mountain King. A passage continues west and up here. #31 <$$< #32 You can't get by the snake. #33 You are in a large room, with a passage to the south, a passage to the west, and a wall of broken rock to the east. There is a large "Y2" on a rock in the room's center. #34 You are in a jumble of rock, with cracks everywhere. #35 You're at a low window overlooking a huge pit, which extends up out of sight. A floor is indistinctly visible over 50 feet below. Traces of white mist cover the floor of the pit, becoming thicker to the right. Marks in the dust around the window would seem to indicate that someone has been here recently. Directly across the pit from you and 25 feet away there is a similar window looking into a lighted room. A shadowy figure can be seen there peering back at you. #36 You are in a dirty broken passage. To the east is a crawl. To the west is a large passage. Above you is a hole to another passage. #37 You are on the brink of a small clean climbable pit. A crawl leads west. #38 You are in the bottom of a small pit with a little stream, which enters and exits through tiny slits. #39 You are in a large room full of dusty rocks. There is a big hole in the floor. There are cracks everywhere, and a passage leading east. #40 You have crawled through a very low wide passage parallel to and north of the Hall of Mists. #41 You are at the west end of Hall of Mists. A low wide crawl continues west and another goes north. To the south is a little passage 6 feet off the floor. #42 You are in a maze of twisty little passages, all alike. #43 You are in a maze of twisty little passages, all alike. #44 You are in a maze of twisty little passages, all alike. #45 You are in a maze of twisty little passages, all alike. #46 Dead end. #47 Dead end. #48 Dead end. #49 You are in a maze of twisty little passages, all alike. #50 You are in a maze of twisty little passages, all alike. #51 You are in a maze of twisty little passages, all alike. #52 You are in a maze of twisty little passages, all alike. #53 You are in a maze of twisty little passages, all alike. #54 Dead end. #55 You are in a maze of twisty little passages, all alike. #56 Dead end. #57 You are on the brink of a thirty foot pit with a massive orange column down one wall. You could climb down here but you could not get back up. The maze continues at this level. #58 Dead end. #59 You have crawled through a very low wide passage parallel to and north of the Hall of Mists. #60 You are at the east end of a very long hall apparently without side chambers. In the south wall are several wide cracks and a high hole, but the hole is far above your head. To the east a wide crawl slants up. To the north a round two foot hole slants down. #61 You are at the west end of a very long featureless hall. The hall joins up with a narrow north/south passage. #62 You are at a crossover of a high N/S passage and a low E/W one. #63 Dead end. #64 You are at a complex junction. A low hands and knees passage from the north joins a higher crawl from the east to make a walking passage going west. There is also a large room above. The air is damp here. #65 You are in Bedquilt, a long east/west passage with holes everywhere. To explore at random select north, south, up, or down. #66 You are in a room whose walls resemble swiss cheese. Obvious passages go west, east, NE, and NW. Part of the room is occupied by a large bedrock block. #67 You are at the east end of the Twopit Room. The floor here is littered with thin rock slabs, which make it easy to descend the pits. There is a path here bypassing the pits to connect passages from east and west. There are holes all over, but the only big one is on the wall directly over the west pit where you can't get to it. #68 You are in a large low circular chamber whose floor is an immense slab fallen from the ceiling (Slab Room). East and west there once were large passages, but they are now filled with boulders. Low small passages go north and south, and the south one quickly bends west around the boulders. #69 You are in a secret N/S canyon above a large room. #70 You are in a secret N/S canyon above a sizable passage. #71 You are in a secret canyon at a junction of three canyons, bearing north, south, and SE. The north one is as tall as the other two combined. #72 You are in a large low room. Crawls lead north, NE, and SW. #73 Dead end crawl. #74 You are in a secret canyon which here runs E/W. It crosses over a very tight canyon 15 feet below. If you go down you may not be able to get back up. #75 You are at a wide place in a very tight N/S canyon. #76 The canyon here becomes too tight to go further south. #77 You are in a tall E/W canyon. A low tight crawl goes 3 feet north and seems to open up. #78 The canyon runs into a mass of boulders -- dead end. #79 The stream flows out through a pair of 1 foot diameter sewer pipes. It woS7U7V7W7X7Y7Z7[7\7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7m7uld be advisable to use the exit. #80 You are in a maze of twisty little passages, all alike. #81 Dead end. #82 Dead end. #83 You are in a maze of twisty little passages, all alike. #84 You are in a maze of twisty little passages, all alike. #85 Dead end. #86 Dead end. #87 You are in a maze of twisty little passages, all alike. #88 You are in a long, narrow corridor stretching out of sight to the west. At the eastern end is a hole through which you can see a profusion of leaves. #89 There is nothing here to climb. Use "up" or "out" to leave the pit. #90 You have climbed up the plant and out of the pit. #91 You are at the top of a steep incline above a large room. You could climb down here, but you would not be able to climb up. There is a passage leading back to the north. #92 You are in the Giant Room. The ceiling here is too high up for your lamp to show it. Cavernous passages lead east, north, and south. On the west wall is scrawled the inscription, "FEE FIE FOE FOO" [sic]. #93 The passage here is blocked by a recent cave-in. #94 You are at one end of an immense north/south passage. #95 You are in a magnificent cavern with a rushing stream, which cascades over a sparkling waterfall into a roaring whirlpool which disappears through a hole in the floor. Passages exit to the south and west. #96 You are in the Soft Room. The walls are covered with heavy curtains, the floor with a thick pile carpet. Moss covers the ceiling. #97 This is the Oriental Room. Ancient oriental cave drawings cover the walls. A gently sloping passage leads upward to the north, another passage leads SE, and a hands and knees crawl leads east. #98 You are following a wide path around the outer edge of a large cavern. Far below, through a heavy white mist, strange splashing noises can be heard. The mist rises up through a fissure in the ceiling. The path hugs the cavern's rim to the NE and south, while another branch forks west. A round chute with extremely smooth walls angles sharply up to the southwest. #99 You are in an alcove. A small NW path seems to widen after a short distance. An extremely tight tunnel leads east. It looks like a very tight squeeze. An eerie light can be seen at the other end. #100 You're in a small chamber lit by an eerie green light. An extremely narrow tunnel exits to the west, and a dark corridor leads NE. #101 You're in the Dark-Room. A corridor leading south is the only exit. #102 You are in an arched hall. A coral passage once continued up and east from here, but is now blocked by debris. The air smells of sea water. #103 You're in a large room carved out of sedimentary rock. The floor and walls are littered with bits of shells imbedded in the stone. A shallow passage proceeds downward, and a somewhat steeper one leads up. A low hands and knees passage enters from the south. #104 You are in a long sloping corridor with ragged sharp walls. #105 You are in a cul-de-sac about eight feet across. #106 You are in an anteroom leading to a large passage to the east. Small passages go west and up. The remnants of recent digging are evident. A sign in midair here says "Cave under construction beyond this point. Proceed at own risk. [Witt Construction Company]". #107 You are in a maze of twisty little passages, all different. #108 You are at Witt's End. Passages lead off in *ALL* directions. #109 You are in a north/south canyon about 25 feet across. The floor is covered by white mist seeping in from the north. The walls extend upward for well over 100 feet. Suspended from some unseen point far above you, an enormous two-sided mirror is hanging parallel to and midway between the canyon walls. (The mirror is obviously provided for the use of the dwarves, who as you know, are extremely vain.) A small window can be seen in either wall, some fifty feet up. #110 You're at a low window overlooking a huge pit, which extends up out of sight. A floor is indistinctly visible over 50 feet below. Traces of white mist cover the floor of the pit, becoming thicker to the left. Marks in the dust around the window would seem to indicate that someone has been here recently. Directly across the pit from you and 25 feet away there is a similar window looking into a lighted room. A shadowy figure can be seen there peering back at you. #111 A large stalactite extends from the roof and almost reaches the floor below. You could climb down it, and jump from it to the floor, but having done so you would be unable to reach it to climb back up. #112 You are in a little maze of twisting passages, all different. #113 You are at the edge of a large underground reservoir. An opaque cloud of white mist fills the room and rises rapidly upward. The lake is fed by a stream, which tumbles out of a hole in the wall about 10 feet overhead and splashes noisily into the water somewhere within the mist. The indistinct shape of the opposite shore can be dimly seen through the mist. The only passage goes back toward the south. #114 Dead end. #115 You are at the northeast end of an immense room, even larger than the Giant Room. It appears to be a repository for the "ADVENTURE" program. Massive torches far overhead bathe the room with smoky yellow light. Scattered about you can be seen a pile of bottles (all of them empty), a nursery of young beanstalks murmuring quietly, a bed of oysters, a bundle of black rods with rusty stars on their ends, and a collection of brass lanterns. Off to one side a great many dwarves are sleeping on the floor, snoring loudly. A sign nearby reads: "Do not disturb the dwarves!" An immense mirror is hanging against one wall, and stretches to the other end of the room, where various other sundry objects can be glimpsed dimly in the distance. An unoccupied telephone booth stands against the north wall. #116 You are at the southwest end of the repository. To one side is a pit full of fierce green snakes. On the other side is a row of small wicker cages, each of which contains a little sulking bird. In one corner is a bundle of black rods with rusty marks on their ends. A large number of velvet pillows are scattered about on the floor. Beside one of the pillows is a large, dusty, leather-bound volume with the title "History of Adventure" embossed in pure gold. A vast mirror stretches off to the northeast, almost reaching the phone booth. At your feet is a large steel grate, next to which is a sign which reads, "Treasure Vault. Keys in Main Office." #117 You are on one side of a large, deep chasm. A heavy white mist rising up from below obscures all view of the far side. A SW path leads away from the chasm into a winding corridor. #118 You are in a long winding corridor sloping out of sight in both directions. #119 You are in a secret canyon which exits to the north and east. #120 You are in a secret canyon which exits to the north and east. #121 You are in a secret canyon which exits to the north and east. #122 You are on the northeast side of a deep chasm. A NE path leads away from the chasm on this side. #123 You're in a long east/west corridor. A faint rumbling noise can be heard in the distance. #124 The path forks here. The left fork leads northeast. A dull rumbling seems to get louder in that direction. The right fork leads southeast down a gentle slope. The main corridor enters from the west. #125 The walls are quite warm here. From the north can be heard a steady roar, so loud that the entire cave seems to be trembling. Another passage leads south, and a low crawl goes east. #126 You are on the edge of a breathtaking view. Far below you is an active volcano, from which great gouts of molten lava come surging out, cascading back down into the depths. The glowing rock fills the farthest reaches of the cavern with a blood-red glare, giving every- thing an eerie, macabre appearance. The air is filled with flickering sparks of ash and a heavy smell of brimstone. The walls are hot to the touch, and the thundering of the volcano drowns out all other sounds. Embedded in the jagged roof far overhead are myriad twisted formations composed of pure white alabaster, which scatter the murky light into sinister apparitions upon the walls. To one side is a deep gorge, filled with a bizarre chaos of tortured rock which seems to have been crafted by the devil himself. An immense river of fire crashes out from the depths of the volcano, burns its way through the gorge, and plummets into a bottomless pit far off to your left. To the right, an immense geyser of blistering steam erupts continuously from a barren island in the center of a sulfurous lake, which bubbles ominously. The far right wall is aflame with an incandescence of its own, which lends an additional infernal splendor to the already hellish scene. A dark, foreboding passage exits to the south. #127 You are in a small chamber filled with large boulders. The walls are very warm, causing the air in the room to be almost stifling from the heat. The only exit is a crawl heading west, through which is coming a low rumbling. #128 You are walking along a gently sloping north/south passage lined with oddly shaped limestone formations. #129 You are standing at the entrance to a large, barren room. A sign posted above the entrance reads: "Caution! Bear in room!" #130 You are inside a barren room. The center of the room is completely empty except for some dust. Marks in the dust lead away toward the far end of the room. The only exit is the way you came in. #131 You are in a maze of twisting little passages, all different. #132 You are in a little maze of twisty passages, all different. #133 You are in a twisting maze of little passages, all different. #134 You are in a twisting little maze of passages, all different. #135 You are in a twisty little maze of passages, all different. #136 You are in a twisty maze of little passages, all different. #137 You are in a little twisty maze of passages, all different. #138 You are in a maze of little twisting passages, all different. #139 You are in a maze of little twisty passages, all different. #140 Dead end. #141 You are on a narrow promontory at the foot of a waterfall, which spurts from an overhead hole in the rock wall and splashes into a large reservoir, sending up clouds of mist and spray. Through the thick white mist looms a polished marble slab, to which is affixed an enormous rusty iron anvil. In golden letters are written the words: "Whoso Pulleth Out This Sword of This Stone and Anvil, is Right wise King-Born of All This Mountain." There is a narrow chimney on the east side of the promontory. #142 You are on a narrow shelf above and east of the top of a very steep chimney. A long smooth granite slide curves down out of sight to the east. If you go down the slide, you may not be able to climb back up. #143 You are in the private chamber of the Mountain King. Hewn into the solid rock of the east wall of the chamber is an intricately-wrought throne of elvish design. There is an exit to the west. #144 You are on the east side of the throne room. On the arm of the throne has been hung a sign which reads "Gone for the day: visiting sick snake. --M.K." #145 You are dragged down, down, into the depths of the whirlpool. Just as you can no longer hold your breath, you are shot out over a waterfall into the shallow end of a large reservoir. Gasping and sputtering, you crawl weakly towards the shore.... #146 You are in dense forest, with a hill to one side. The trees appear to thin out towards the north and east. #147 You are at the high point of a wide grassy knoll, partially surrounded by dense forest. The land rises to the south and east, and drops off sharply to the north and west. The air smells of sea water. #148 You are at the edge of a trackless salt marsh. Tall reeds obscure the view. #149 You're in salt marsh. #150 You're in salty marsh. #151 You are in salt marsh. #152 Dead end. #153 You're on a sandy beach at the edge of the open sea. The beach ends a short distance south and the land rises to a point. To the north, the beach ends cliffs and broken rocks. #154 You are at a jumble of large broken rocks. A gentle path leads up to the top of the nearby cliffs. A narrow treacherous path disappears among the rocks at the foot of the cliff. #155 You are on a high cliff overlooking the sea. Far below the rolling breakers smash into a jumble of large broken rocks. The thunder of the surf is deafening. #156 You're at the bottom of the cliff, smashed to smithereens by the pounding surf. #157 You are at Thunder Hole, a funnel shaped cavern opening onto the sea. The noise of the surf pounding against the outer rocks of the cave is amplified by the peculiar shape of the cave, causing a thunder-like booming sound to reverberate throughout the cave. Outside, a narrow path leads south towards some large rocks. #158 You are at the top of some arched steps. On one side is a blank wall with a tiny door at the base and a shelf overhead. On the other side a westward passage leads to the sea. #159 You are in a low cramped chamber at the back of a small cave. There is a shelf in the rock wall at about the height of your shoulder. #160 You are on a wide ledge, bounded on one side by a rock wall, and on the other by a sheer cliff. The only way past is through a large wrought-iron door. #161 You feel dizzy...Everything around you is spinning, expanding, growing larger.... Dear me! Is the cave bigger or are you smaller? #162 You are again overcome by a sickening vertigo, but this time everything around you is shrinking...Shrinking... #163 You are again overcome by a sickening vertigo, but this time everything is shrinking... I mean, you are growing. This is terribly confusing! #164 You feel dizzy...Everything around you is spinning, expanding, growing larger.... #165 You're at the bottom of the cliff with a broken neck. #166 You are at the western tip of the Blue Grotto. A large lake almost covers the cavern floor, except for where you are standing. Small holes high in the rock wall to the east admit a dim light. The reflection of the light from the water suffuses the cavern with a hazy bluish glow. #167 You are on the shore of an underground sea. A high wooden structure of vast proportions extends out into the water to the east. The way west is through a wrought-iron door. #168 You are on the eastern shore of the Blue Grotto. An ascending tunnel disappears into the darkness to the SE. #169 You are at a high rock on the NE side of a watery chamber at the mouth of a small brook. An unknown gas bubbles up through the water from the chamber floor. A bluish light can be seen to the southwest. #170 You are in a windy tunnel between two large rooms. #171 You are in the Bat Cave. The walls and ceiling are covered with sleeping bats. The floor is buried by a mass of dry, foul-smelling guano. The stench is overpowering. Exits to the NW and east. #172 You are in a very tight N/S crack. The passage seems to widen to the south. #173 You are in a very tight N/S crack. The passage south is blocked by a recent cave-in. #174 You're in the Cloakroom. This is where the dreaded Wumpus repairs to sleep off heavy meals. (Adventurers are his favorite dinner!) Two very narrow passages exit NW and NE. #175 You're in a room containing several small climbable pits. Passages exit to the east and north. #176 You are at the bottom of a small featureless pit. #177 You are at a high hole in a rock wall. #178 The NE passage is blocked by a recent cave-in. #179 You are in a sloping muddy defile, next to a tumbling brook. #180 You are in a level E/W passage partially blocked by an overhanging tongue of rock. A steep scramble would take you up over the tongue, whence continues an upward crawl. #181 The dog won't let you pass. #182 You're in the Upper Passage, a long level E/W tunnel. #183 You are in a star-shaped chamber. Passages exit north, east, south, and west. #184 You are at an elbow in a winding E/W passage. #185 Dead end. #186 You're at the intersection of two long tunnels. One goes NW, the other NE. #187 You're in a long narrow east-west passage which curves out of sight at both ends. #188 You're in the Rotunda. Corridors radiate in all directions. There is a telephone booth standing against the north wall. #189 You are standing in a telephone booth at the side of a large chamber. Hung on the wall is a banged-up pay telephone of ancient design. #190 You're at the Devil's Chair, a large crystallization shaped like a seat, at the edge of a black abyss. You can't see the bottom. An upward path leads away from the abyss. #191 You're in a dead-end crack. #192 You're on a small gravel beach at the south wall of the Blue Grotto. A gravelly path leads east. #193 You are in the Flower Room. The walls are covered with colorful, intricate, flowerlike patterns of crystallized gypsum. A hole leads to the west. #194 You are at the end of a short E/W corridor. #195 You are looking west from the end of a short E/W corridor. At your feet is a pile of loose rubble. On your left is a hole into another chamber. #196 You are in an arched hall. The remnants of a now-plugged coral passage lie to the east. The north wall has partially crumbled, exposing a large connecting hole to another room. #197 You're in the Vestibule, a short east-west passage between two rooms. #198 You are in the Fairy Grotto. All around you innumerable stalactites, arranged in immense colonnades, form elegant arches. On every side you hear the dripping of water, like the footsteps of a thousand fairies. A small stream runs from the SW corner. A bright glow emanates from the south side of the grotto, and a steep passage descends to the east. #199 You have approached the lower end of a steep passage, but it is just too cold here to hang around, and you aren't properly equipped to continue. With teeth chattering, you climb back up.... #200 You are in the Crystal Palace. An overhead vein of phosphorescent quartz casts a luminous glow which is reflected by countless chips of mica embedded in both walls, which consist of some sort of highly reflective glass, apparently of volcanic origin. A winding path of yellow sandstone leads west and rises steeply to the east. #201 You are following a yellow sandstone path. There is a glow to the west. #202 You are in a very tall chamber whose walls are comprised of many different rock strata. Layers of red and yellow sandstone intertwine with bright bands of calcareous limestone in a rainbow- like profusion of color. The rainbow effect is so real, you are almost tempted to look for a pot of gold! Poised far over your head, a gigantic slab, wedged tightly between the north and south walls, forms a natural bridge across the roof of the chamber. A trail leads east and west. #203 You're in a steeply sloping passage. It is very cold here. #204 You are in the Hall of Ice, in the deepest part of the caverns. During winter, frigid outside air settles here, making this room extremely cold all year round. The walls and ceilings are covered with a thick coating of ice. An upward passage exits to the west. #205 You are standing on a natural bridge far above the floor of a circular chamber whose walls are a rainbow of multicolored rock. The bridge was formed eons ago by a huge slab which fell from the ceiling and is now jammed between the north and south walls of the chamber. #206 You are in a low, wide room below another chamber. A small green pond fills the center of the room. The lake is apparently spring fed. A small stream exits through a narrow passage to the north. A larger passage continues west. #207 You are in a tight north/south crawl through a stratum of red colored rock. The air is damp with mist. #208 You are in a tall canyon on the south side of a swift, wide river. Written in the mud in crude letters are the words: "You Have Found Lost River." A wide path leads east and west along the bank. A tight crawl way would take you south out of the canyon. #209 You are standing on a large flat rock table at the western end of Lost River Canyon. Beneath your feet, the river disappears amidst foam and spray into a large sinkhole. A gentle path leads east along the river's south shore. Another leads sharply upward along the river's north side. #210 You are at a niche in the canyon wall, far above a raging river. The air is filled with mist and spray, making it difficult to see ahead. A downward sloping ledge narrows to the east. The path to the west is easier. #211 The ledge is growing very narrow and treacherous, and falls off almost vertically. You could go down, but you won't be able to climb back. #212 You are standing in a telephone booth at the side of the Repository. #213 You're at the east end of a level passage at a hole in the floor. #214 You're at the north edge of a dark cove. #215 You are in a dry granite basin, worn smooth eons ago by water swirling down from a now-dry spillway. #216 You're in a dry spillway east of and above a smooth rock basin. #217 You are in the Winery, a cool dark room which extends some distance off to the east. #218 You are to the east of the Winery, where the room ends in a thicket of high, sharp, pointed, climbable limestone pinnacles. There is a narrow ledge just above the top of the spires. If you go up, it might be difficult to get back down. #219 You are in a high-vaulted cavern whose roof rises over fifty meters to culminate in a series of pointed arches directly over your head. There are also two low arches to either side, forming side portals. The whole effect is that of a gothic cathedral. You can proceed north, south, east, or west. #220 You're at the east portal of the Gothic Cathedral. The path leads east and west. #221 You're at the west portal of the Gothic Cathedral. #222 You are at the foot of the Altar, an immense, broad stalagmite. An opening leads south. #223 You're on top of an enormous, broad stalagmite. There is a hole in the ceiling overhead. #224 You are in a room the size and shape of a small crypt. A narrow cut exits east. There is a hole in the floor. #225 You are in the Gothic Chapel, a small chamber adjoining the Gothic Cathedral. A path leads west. #226 You are on the floor of the Rainbow Room. In fact, you are spread *ALL OVER* the floor of the Rainbow Room. #227 You are in a dimly lit passage behind Thunder Hole. Etched into the rock wall are the ominous words: * "You are approaching the River Styx. * * Laciate Ogni Speranza Voi Ch'Entrate." * #228 You are at the River Styx, a narrow little stream cutting directly across the passageway. The edge of the stream is littered with sticks and other debris washed in by a recent rainfall. On the far side of the river, the passage continues east. #229 You're on the east side of the river's sticks. #230 You are on a ledge at the northern end of a long N/S crawl. The ledge is above a large number of sharp vertical limestone spires. An attempt to climb down could be dangerous, if you get my *point*! #231 You are very neatly skewered on the point of a sharp rock. #232 You have poled your boat across the calm water. #233 You have poled your boat across the dark water. #234 You have poled your boat across the Blue Grotto. #235 You're at Dante's Rest, on the north side of a yawning dark chasm. A passage continues west along the chasm's edge. #236 You are at the east end of a river bank path in Lost River Canyon. #237 The staircase is now unclimbable. #238 You're in the caretaker's pantry. #239 You are on a small rise overlooking a beautiful bay. In the center of the bay is the castle of the elves. #240 You are on the highest pinnacle of the castle in the bay. Steps lead down into the garden. #241 You are in the outer courtyard of the garden of the elves. Steps lead up to the tower, and to the west, separating you from the inner courtyard, is a maze of hedges, living things, but almost crystalline in their multicolored splendor. #242 From the inside the maze looks like a kaleidoscope, with swatches of color dancing as you move. In this part the colors are produced by shining red berries on the branches. #243 You are surrounded by a tall hedge with sharp iridescent leaves and metallic orange flowers. #244 You are in the center of the living maze. The plants here are dormant this season, but still carry brilliant yellow leaves. #245 Unlike the other areas of the hedge system, this area seems to have no metallic gleam; nevertheless it is still breathtaking. The trees and bushes are all variegated shades of green, the evergreens being a rich dark shade while the seasonal bushes are a lighter yellowish green, making a startling contrast. #246 You are near the edge of the maze. You sample the blueberries on the bushes. They are delicious. #247 You are at the western end of the living maze. Beside the shrubs forming the walls are tastefully planted beds of violets and brilliant purple pansies. To the west is the inner garden. #248 You are in the inner garden of the elves. In the center is a living tree, with shimmering silvery bark, glistening metallic green leaves, and flowers ripe with nectar. As the nectar falls to the ground it forms droplets of silver. Around the tree is a hedge of briars which cannot be crossed. Unfortunately for adventurers such as you, most of the nectar falls inside the hedge. The exit is to the east. #1 You're at end of road again. #2 You're at hill in road. #3 You're inside building. #4 You're in valley. #5 You're in forest. #6 You're in forest. #7 You're at slit in streambed. #8 You're outside grate. #9 You're below the grate. #10 You're in cobble crawl. #11 You're in Debris Room. #12 You are in an awkward sloping east/west canyon. #13 You're in Bird Chamber. #14 You're at top of small pit. #15 You're in Hall of Mists. #16 The crack is far too small for you to follow. #17 You're on east bank of fissure. #18 You're in Nugget of Gold Room. #19 You're in Hall of Mt King. #20 You are at the bottom of the pit with a broken neck. #21 You didn't make it. #22 The dome is unclimbable. #23 You're at west end of Twopit Room. #24 You're in east pit. #25 You're in west pit. #26 You clamber up the plant and scurry through the hole at the top. #27 You are on the west side of the fissure in the Hall of Mists. #28 You are in a low N/S passage at a hole in the floor. The hole goes down to an E/W passage. #29 You are in the South Side Chamber. #30 You are in the West Side Chamber of the Hall of the Mountain King. #31 <$$< #32 You can't get by the snake. #33 You're at "Y2". #34 You are in a jumble of rock, with cracks everywhere. #35 You're at window on pit. #36 You're in dirty passage. #37 You are on the brink of a small clean climbable pit. #38 You are in the bottom of a small pit with a little stream. #39 You're in dusty rock room. #40 You have crawled through a very low wide passage parallel. #41 You're at west end of Hall of Mists. #42 You are in a maze of twisty little passages, all alike. #43 You are in a maze of twisty little passages, all alike. #44 You are in a maze of twisty little passages, all alike. #45 You are in a maze of twisty little passages, all alike. #46 Dead end. #47 Dead end. #48 Dead end. #49 You are in a maze of twisty little passages, all alike. #50 You are in a maze of twisty little passages, all alike. #51 You are in a maze of twisty little passages, all alike. #52 You are in a maze of twisty little passages, all alike. #53 You are in a maze of twisty little passages, all alike. #54 Dead end. #55 You are in a maze of twisty little passages, all alike. #56 Dead end. #57 You're at brink of pit. #58 Dead end. #59 You have crawled through a very low wide passage. #60 You're at east end of Long Hall. #61 You're at west end of Long Hall. #62 You are at a crossover of a high N/S passage and a low E/W one. #63 Dead end. #64 You're at Complex Junction. #65 You are in Bedquilt. #66 You're in Swiss Cheese Room. #67 You're at east end of Twopit Room. #68 You're in Slab Room. #69 You are in a secret N/S canyon above a large room. #70 You are in a secret N/S canyon above a sizable passage. #71 You're at junction of three secret canyons. #72 You are in a large low room. Crawls lead north, NE, and SW. #73 Dead end crawl. #74 You're in secret E/W canyon above tight canyon. #75 You are at a wide place in a very tight N/S canyon. #76 The canyon here becomes too tight to go further south. #77 You are in a tall E/W canyon. #78 The canyon runs into a mass of boulders -- dead end. #79 The stream flows out through a pair of 1 foot diameter sewer pipes. #80 You are in a maze of twisty little passages, all alike. #81 Dead end. #82 Dead end. #83 You are in a maze of twisty little passages, all alike. #84 You are in a maze of twisty little passages, all alike. #85 Dead end. #86 Dead end. #87 You are in a maze of twisty little passages, all alike. #88 You're in narrow corridor. #89 There is nothing here to climb. Use "up" or "out" to leave the pit. #90 You have climbed up the plant and out of the pit. #91 You're at steep incline above large room. #92 You're in Giant Room. #93 The passage here is blocked by a recent cave-in. #94 You are at one end of an immense north/south passage. #95 You're in cavern with waterfall. #96 You're in Soft Room. #97 You're in Oriental Room. #98 You're in Misty Cavern. #99 You're in Alcove. #100 You're in Plover Room. #101 You're in Dark-Room. #102 You're in Arched Hall. #103 You're in Shell Room. #104 You are in a long sloping corridor with ragged sharp walls. #105 You are in a cul-de-sac about eight feet across. #106 You're in Anteroom. #107 You are in a maze of twisty little passages, all different. #108 You're at Witt's End. #109 You're in Mirror Canyon. #110 You're at window on pit. #111 You're at top of stalactite. #112 You are in a little maze of twisting passages, all different. #113 You're at Reservoir. #114 Dead end. #115 You're at NE end. #116 You're at SW end. #117 You're on SW side of chasm. #118 You're in sloping corridor. #119 You are in a secret canyon which exits to the north and east. #120 You are in a secret canyon which exits to the north and east. #121 You are in a secret canyon which exits to the north and east. #122 You're on NE side of chasm. #123 You're in corridor. #124 You're at fork in path. #125 You're at junction with warm walls. #126 You're at breath-taking view. #127 You're in Chamber of Boulders. #128 You're in Limestone Passage. #129 You're in front of Barren Room. #130 You're in Barren Room. #131 You are in a maze of twisting little passages, all different. #132 You are in a little maze of twisty passages, all different. #133 You are in a twisting maze of little passages, all different. #134 You are in a twisting little maze of passages, all different. #135 You are in a twisty little maze of passages, all different. #136 You are in a twisty maze of little passages, all different. #137 You are in a little twisty maze of passages, all different. #138 You are in a maze of little twisting passages, all different. #139 You are in a maze of little twisty passages, all different. #140 Dead end. #141 You're at Sword Point. #142 You're at top of slide. #143 You're at entrance to Throne Room. #144 You're on east side of Throne Room. #145 <$$< #146 You're in forest. #147 You're on grassy knoll. #148 You are at the edge of a trackless salt marsh. Tall reeds obscure the view. #149 You're in salt marsh. #150 You're in salty marsh. #151 You are in salt marsh. #152 Dead end. #153 You're on sandy beach. #154 You're at broken rocks. #155 You're at Ocean Vista. #156 You're at the bottom of the cliff. #157 You're at Thunder Hole. #158 You're at top of steps in back of Thunder Hole. #159 You're in cramped chamber. #160 You're at ledge by wrought-iron door. #161 You feel dizzy...Everything around you is spinning, expanding, growing larger.... Dear me! Is the cave bigger or are you smaller? #162 You are again overcome by a sickening vertigo, but this time everything around you is shrinking...Shrinking... #163 You are again overcome by a sickening vertigo, but this time everything is shrinking... I mean, you are growing. This is terribly confusing! #164 You feel dizzy...Everything around you is spinning, expanding, growing larger.... #165 You're at the bottom of the cliff with a broken neck. #166 You're at west wall of Blue Grotto. #167 You're at underground sea. #168 You're on east side of the Blue Grotto. #169 You're in Bubble Chamber. #170 You are in a windy tunnel between two large rooms. #171 You're in Bat Cave. #172 You are in a very tight N/S crack. #173 You are in a very tight N/S crack. #174 You're in the Cloakroom. #175 You're in a room containing several small climbable pits. #176 You are at the bottom of a small featureless pit. #177 You are at a high hole in a rock wall. #178 The NE passage is blocked by a recent cave-in. #179 You are in a sloping muddy defile, next to a tumbling brook. #180 You're at Tongue of Rock. #181 The dog won't let you pass. #182 You're in the Upper Passage, a long level E/W tunnel. #183 You're in Star Chamber. #184 You are at an elbow in a winding E/W passage. #185 Dead end. #186 You're at the intersection of two long tunnels. #187 You're in a long narrow east-west passage. #188 You're in Rotunda. #189 You're in phone booth. #190 You're at Devil's Chair. #191 You're in a dead-end crack. #192 You're on gravel beach. #193 You're in Flower Room. #194 You are at east end of short E/W corridor. #195 You are at east end of short E/W corridor. #196 You're in Arched Hall. #u7w7x7y7197 You're in the Vestibule, a short east-west passage between two rooms. #198 You're in the Fairy Grotto. #199 You have approached the lower end of a steep passage. #200 You're in the Crystal Palace. #201 You are following a yellow sandstone path. #202 You're in the Rainbow Room. #203 You're in a steeply sloping passage. It is very cold here. #204 You're in the Hall of Ice. #205 You are over the Rainbow (Room). #206 You're in Green Lake Room. #207 You're in red rock crawl. #208 You're on south side of Lost River Canyon. #209 You're at end of Lost River Canyon. #210 You're at niche in ledge above Lost River. #211 A very narrow and treacherous ledge. #212 You're in phone booth. #213 You're at the east end of a level passage at a hole in the floor. #214 You're in dark cove. #215 You're in dry basin. #216 You're in old spillway. #217 You're in the Winery. #218 You're at limestone pinnacles. #219 You're in Gothic Cathedral. #220 You're at the east portal of the Gothic Cathedral. #221 You're at the west portal of the Gothic Cathedral. #222 You are at the foot of the Altar, an immense, broad stalagmite. #223 You're on top of stalagmite. #224 You're in the Crypt. #225 You're in Gothic Chapel. #226 You are on the floor of the Rainbow Room. #227 You are at approach to River Styx. #228 You're at the River Styx. #229 You're on the east side of the river's sticks. #230 You're on ledge above limestone pinnacles. #231 You are very neatly skewered on the point of a sharp rock. #232 You have poled your boat across the calm water. #233 You have poled your boat across the dark water. #234 You have poled your boat across the Blue Grotto. #235 You're at Dante's Rest. #236 You're at east end of Lost River Canyon. #237 The staircase is now unclimbable. #238 You're in the caretaker's pantry. #239 You're on a small rise over the bay. #240 You are on the highest pinnacle of the castle in the bay. Steps lead down into the garden. #241 You are in the outer courtyard of the elves. #242 You are in the living maze. There are red berries here. #243 You are surrounded by a tall hedge with sharp iridescent leaves and metallic orange flowers. #244 You are in the center of the living maze. The plants here are dormant this season, but still carry brilliant yellow leaves. #245 Unlike the other areas of the hedge system, this area seems to have no metallic gleam; nevertheless it is still breathtaking. The trees and bushes are all variegated shades of green, the evergreens being a rich dark shade while the seasonal bushes are a lighter yellowish green, making a startling contrast. #246 You are near the edge of the maze. You sample the blueberries on the bushes. They are delicious. #247 You are at the western end of the living maze. Beside the shrubs forming the walls are tastefully planted beds of violets and brilliant purple pansies. To the west is the inner garden. #248 You're in the inner courtyard of the elves. #1 #2 /Brass lantern /There is a shiny brass lamp nearby. /There is a lamp shining nearby. / #3 /*Grate /The grate is locked. /The grate is open. / #4 /Wicker cage /There is a small wicker cage discarded nearby. / #5 /Black rod /A three foot black rod with a rusty star on an end lies nearby. / #6 /Black rod /A three foot black rod with a rusty mark on an end lies nearby. / #7 /*Steps /Rough stone steps lead down the pit. /Rough stone steps lead up the dome. / #8 #9 /Wooden pole /A wooden pole is lying nearby. /A wooden pole has been stuck in the mud here. / #10 /Velvet pillow /A small velvet pillow lies on the floor. / #11 /*Snake /A huge green fierce snake bars the way! /<$$< (Chased away) / #12 /*Fissure /<$$< /A crystal bridge now spans the fissure. /The crystal bridge has vanished! / #13 /*Stone tablet /A massive stone tablet imbedded in the wall reads: "Congratulations on bringing light into the Dark-Room!" / #14 /Giant clam >grunt!< /There is an enormous clam here with its shell tightly closed. / #15 /Giant oyster >groan!< /There is an enormous oyster here with its shell tightly closed. /Interesting. There seems to be something written on the underside of the oyster. / #16 /"Spelunker Today" /There are a few recent issues of "Spelunker Today" magazine here. / #17 #18 #19 /Tasty food /There is food here. / #20 /Small bottle /There is a small bottle here. /There is an empty bottle here. /There is a small bottle here. /There is a broken bottle here. /There is a small bottle here. / #21 /*Chasm - troll bridge /A rickety wooden bridge extends across the chasm, vanishing into the mist. A sign posted on the bridge reads, "Stop! Pay troll!" /The wreckage of a bridge (and a dead bear) can be seen at the bottom of the chasm. / #22 /*Chasm2 & decrepit natural bridge /A decrepit natural bridge spans the chasm. A message scrawled into the rock wall reads: "Bridge out of repair. Maximum load: 35 Foonts." /The remnants of a natural bridge partially overhang the chasm. / #23 /*Mirror /<$$< / #24 /*plant /There is a tiny little plant in the pit, murmuring "Water, water, ..." /The plant spurts into furious growth for a few seconds. /There is a 12-foot-tall beanstalk stretching up out of the pit, bellowing "Water!! Water!!" /The plant grows explosively, almost filling the bottom of the pit. /There is a gigantic beanstalk stretching all the way up to the hole. /You've over-watered the plant! It's shriveling up! It's, it's... / #25 /*Phony plant (seen in twopit room only when tall enough) /<$$< /The top of a 12-foot-tall beanstalk is poking out of the west pit. /There is a huge beanstalk growing out of the west pit up to the hole. / #26 /*Stalactite /<$$< / #27 /*shadowy figure /The shadowy figure seems to be trying to attract your attention. / #28 /Dwarf's axe /There is a little axe here. /There is a little axe lying beside the bear. /There is a little axe lying beside the Wumpus. /There is a little axe lying beside the dog. / #29 /*Cave drawings /<$$< / #30 /*pirate /<$$< / #31 /*dragon /A huge green fierce dragon bars the way! /Congratulations! You have just vanquished a dragon with your bare hands! (Unbelievable, isn't it?) /The body of a huge green dead dragon is lying off to one side. / #32 #33 /*Troll /A burly troll stands by the bridge and insists you throw him a treasure before you may cross. /The troll steps out from beneath the bridge and blocks your way. /<$$< (Chased away) / #34 /*phony troll /The troll is nowhere to be seen. / #35 /<$$< (Bear uses rtext 141) /There is a ferocious cave bear eying you from the far end of the room! /There is a gentle cave bear sitting placidly in one corner. /There is a contented-looking bear wandering about nearby. /<$$< (Dead) / #36 /*Message in second maze /There is a message scrawled in the dust in a flowery script, reading: "This is not the maze where the pirate leaves his treasure chest." / #37 /*Volcano and/or geyser /<$$< / #38 /*Vending machine /There is a massive vending machine here. The instructions on it read: "Insert coins to receive fresh batteries." /There is a massive vending machine here. / #39 /Batteries /There are fresh batteries here. /Some worn-out batteries have been discarded nearby. /Some worn-out batteries have been discarded nearby. / #40 /*Carpet and/or moss /<$$< / #41 /*Rusty door /The way north is barred by a massive, rusty, iron door. /The way north leads through a massive, rusty, iron door. / #42 /*Tiny door /The only way past the wall is through a tiny locked door. /The only way past the wall is through a tiny open door. / #43 /*Tiny door-2 /The door is locked. /The door is open. / #44 /*Phone booth door /<$$< / #45 #46 /Beautiful flowers /There are some beautiful flowers here! /On the other side of the room a swarm of bees eagerly buzzes over a bunch of fresh flowers. / #47 /Silken cloak /There is a silken cloak here! /<$$< (wearing cloak) /A lovely silken cloak lies partially buried under a pile of loose rocks. / #48 /Wooden boat /There is a small wooden boat here. /You are in a wooden boat. / #49 /*Sticks at Styx /<$$< / #50 /Large gold nugget /There is a large sparkling nugget of gold here! / #51 /Several diamonds /There are diamonds here! / #52 /Silver horn /There is a silver horn here! / #53 /Precious jewelry /There is precious jewelry here! /<$$< (wearing jewelry) / #54 /Rare coins /There are many coins here! / #55 /Treasure chest /The pirate's treasure chest is here! / #56 /Golden eggs /There is a large nest here, full of golden eggs! /The nest of golden eggs has vanished! /Done! / #57 /Jeweled trident /There is a jewel-encrusted trident here! / #58 /Ming vase /There is a delicate, precious, ming vase here! /The vase is now resting, delicately, on a velvet pillow. /The floor is littered with worthless shards of pottery. /The ming vase drops with a delicate crash. / #59 /Egg-sized emerald /There is an emerald here the size of a plover's egg! / #60 /Platinum pyramid /There is a platinum pyramid here, 8 inches on a side! / #61 /Glistening pearl /Off to one side lies a glistening pearl! / #62 /Persian rug /There is a persian rug spread out on the floor! /The dragon is sprawled out on a persian rug!! / #63 /Rare spices /There are rare spices here! / #64 /Golden chain /There is a golden chain lying in a heap on the floor! /The bear is locked to the wall with a golden chain! /There is a golden chain locked to the wall! / #65 /Gleaming sword /There is a gleaming sword here! /A gleaming sword is stuck into the anvil! /You grasp the sword's handle and give a mighty heave, but with a loud clang the sword blade shatters into several fragments. /Rusty shards of a elven sword lie scattered about. /A very clean sword is stuck into the anvil! /An oily sword is stuck into the anvil. / #66 /Elfin crown /An ancient crown of elfin kings lies here! /<$$< (wearing crown) / #67 /Ruby slippers /There is a pair of ruby slippers here. /<$$< (wearing slippers) /There is a pair of ruby slippers here. / #68 /Delicate lyre /There is a delicate lyre here! / #69 /Star sapphire /There is a star sapphire here! / #70 /Holy Grail /There is an ornate silver chalice here! / #71 /Oaken cask /There is an oaken cask here. /There is an empty oaken cask here. /There is an oaken cask here. /<$$< (Unused) /There is an oaken cask here. / #72 /Golden ring /There is a small gold ring here. /<$$< (wearing ring) /On the Wumpus' finger is a small gold ring. / #73 /Four-leafed clover /There is a four-leafed clover here! /<$$< (wearing clover) / #74 /Gold tree /There is a gold statue of a tree here. / #75 /Silver droplet /There is a single droplet of silver on the ground here. / #76 #77 #78 #79 #80 #81 /Clear water / #82 /Cool water / #83 /Thick, black oil / #84 /Thick, black oil / #85 /Vintage wine / #86 /Vintage wine / #87 /*Bumblebees /<$$< /Some bumblebees are swarming around a bunch of fresh flowers. / #88 /*Hollow wall /Your footsteps echo hollowly throughout the chamber. /<$$< / #89 /*Wall with safe /A steel safe is embedded in the wall. / #90 /Tiny brass key /There is a tiny brass key here. /There is a tiny brass key on the shelf. / #91 /*Anvil /<$$< / #92 /*rocks on cloak /<$$< (ON CLO7777AK) /<$$< (AFTER ROCK SLIDE) / #93 /*telephone booth /The telephone booth is empty. The phone is ringing. /The phone booth is occupied by a gnome. He is talking excitedly to someone at the other end. /The telephone booth is empty. /<$$< / #94 /*Telephone /The phone is ringing. /The telephone is out of order. /The telephone is out of order. It is badly dented. /<$$< / #95 /Lead slugs /There are some lead slugs here! / #96 /Sweet honeycomb /There is a sweet honeycomb here! / #97 /*Beehive /There is an active beehive nearby. The bees hum protectively around the hive. /There is an empty beehive nearby. / #98 /*Black dog /A hideous black dog bares his teeth and growls at your approach. /Nearby, a large black dog is in a deep slumber. / #99 /*Dreaded Wumpus /In the corner, a Wumpus is sleeping peacefully. /A sleepy Wumpus is ambling towards you. He wants to invite you to dinner. He wants you to *be* the dinner! /The Wumpus is still on your trail! And he's getting closer!! /The Wumpus is only a few steps behind you! All this exercise is making him veerrrrry hungry! /The Wumpus almost has you in his grasp! You can feel his hot breath on your neck! /"Chomp, chomp." Crunch! Chew! Slurp! Smack! Yum!!! /Nearby is the smashed body of a defunct Wumpus. / #100 #101 /Little bird in cage /A cheerful little bird is sitting here singing. /There is a little bird in the cage. / #102 /Set of keys /There are some keys on the ground here. / #103 /*Fountain /There is a fountain of sparkling vintage wine here! / #104 /*Bats & guano in bat-cave /<$$< / #105 /*gnome in phone booth /<$$< / #106 /Colored mushrooms /There are some oddly-colored mushrooms here. / #107 /Tiny cakes /There are some tiny cakes on the shelf. / #108 /Leather Sack /There is a leather sack here. / #109 #110 /Rare book /There is a dusty, leather-bound volume here. / #111 /Rare book /There is a dusty, leather-bound volume here. / #112 /Steel wall-safe /The safe door is locked. /The safe door is open. / #113 /Faded poster /Taped to the wall is a faded poster. /There is a faded poster here. / #114 /Whiskbroom /There is a small whiskbroom here. / #115 /*Carving on dusty rocks /<$$< /<$$< / #116 /*Billboard / / #117 #118 /Small metal canister /There is a heavy, grey, metal canister here. / #119 /Glowing stone /Nearby, a strange, greenish stone is glowing brightly. / #120 /Quartz sphere /There is a polished sphere of pure quartz here! / #1 Somewhere nearby is Colossal Cave, where others have found fortunes in treasure and gold, though it is rumored that some who enter are never seen again. Magic is said to work in the cave. I will be your eyes and hands. Direct me with natural English commands. I should warn you that I look at all the letters of each word. Also you should enter "Northeast" as "NE" to distinguish it from "North". (Should you get stuck, type "HELP" or "?" for some general hints.) Good Luck! - - - - #2 A little dwarf with a big knife blocks your way. #3 A little dwarf just walked around a corner, saw you, threw a little axe at you which missed, cursed, and ran away. #4 There is a threatening little dwarf in the room with you! #5 One sharp nasty knife is thrown at you! #6 None of them hit you! #7 One of them gets you! #8 A hollow voice says "Plugh". #9 There is no way to go that direction. #10 I am unsure how you are facing. Use compass points or nearby objects. #11 I don't know in from out here. Use compass points or name something in the general direction you want to go. #12 I don't know how to apply that word here. #13 I don't understand that! #14 I'm game. Would you care to explain how? #15 Sorry, but I am not allowed to give more detail. I will repeat the long description of your location. #16 It is now pitch dark. If you proceed you will likely fall into a pit. #17 If you prefer, simply type "W" rather than "West". #18 Are you trying to catch the bird? #19 The bird is frightened right now and you cannot catch it no matter what you try. Perhaps you might try later. #20 Are you trying to somehow deal with the snake? #21 You can't kill the snake, or drive it away, or avoid it, or anything like that. There is a way to get by, but you don't have the necessary resources right now. #22 Do you really want to quit now? #23 You fell into a pit and broke every bone in your body! #24 You are already carrying it! #25 You can't be serious! #26 The bird was unafraid when you entered, but as you approach it becomes disturbed and you cannot catch it. #27 You can catch the bird, but you cannot carry it. #28 There is nothing here with a lock! #29 You aren't carrying it! #30 The little bird attacks the green snake, and in an astounding flurry drives the snake away. #31 You have no keys! #32 It has no lock. #33 I don't know how to lock or unlock such a thing. #34 It was already locked. #35 The grate is now locked. #36 The grate is now unlocked. #37 It was already unlocked. #38 You have no source of light. #39 Your lamp is now on. #40 Your lamp is now off. #41 There is no way to get past the bear to unlock the chain, which is probably just as well. #42 Nothing happens. #43 Where? #44 There is nothing here to attack. #45 The little bird is now dead. Its body disappears. #46 Attacking the snake both doesn't work and is very dangerous. #47 You killed a little dwarf. #48 You attack a little dwarf, but he dodges out of the way. #49 With what? Your bare hands? #50 Good try, but that is an old worn-out magic word. #51 To move, try words like FOREST, BUILDING, DOWNSTREAM, IN, EAST, NORTH, UP, OR DOWN. Saying a place name may take you there, as may some magic words. You can say TAKE LAMP or DROP LAMP or PUT LAMP IN SACK. Some objects have side effects; for instance, the rod scares the bird. You can take or drop multiple objects by saying TAKE BOOK AND LAMP, etc. To list what you are currently holding, say INVENTORY, or just I. To reprint the detailed description of where you are, say LOOK or L. You can also LOOK IN or LOOK AT appropriate objects. Other useful commands are HEALTH, QUIT, SCORE, BRIEF, TERSE, UNBRIEF, UNTERSE, SAVE, and RESTORE. The latter two save or restore your current position. To get full credit for a treasure, you must have left it **safely** in the building. Some non-treasure items are best left near where you find them. There are clues for various problems lying about the cave: look and listen. If you seem to have found all the treasures, keep looking around a while, something else may happen to you (for a bonus!) (The word "give" doesn't exist, but you can say FEED BONE TO DOG or THROW BONE AT DOG. Also, you can use conveyances or animals(!) by TAKEing and DROPing them.) #52 It misses! #53 It gets you! #54 Ok #55 You can't unlock the keys. #56 You have crawled around in some little holes and wound up back in the main passage. #57 I don't know where the cave is, but hereabouts no stream can run on the surface for long. I would try the stream. #58 I need more detailed instructions to do that. #59 I can only tell you what you see as you move about and manipulate things. I cannot tell you where remote things are. #60 I can't make any sense out of that. #61 What? #62 Are you trying to get into the cave? #63 The grate is very solid and has a hardened steel lock. You cannot enter without a key, and there are no keys nearby. I would recommend looking elsewhere for the keys. #64 The trees of the forest are large hardwood oak and maple, with an occasional grove of pine or spruce. There is quite a bit of under- growth, largely birch and ash saplings plus nondescript bushes of various sorts. This time of year visibility is quite restricted by all the leaves, but travel is quite easy if you detour around the spruce and berry bushes. #65 Welcome to ADVENTURE! Original development by Willie Crowther. Conversion to BDS C by J. R. Jaeger Unix standardization by Jerry D. Pohl. Upgraded to version 6.6 by Robert R. Hall. Would you like instructions? #66 Digging without a shovel is quite impractical. Even with a shovel progress is unlikely. #67 Blasting requires dynamite. #68 I'm as confused as you are. #69 Mist is a white vapor, usually water, seen from time to time in caverns. It can be found anywhere but is frequently a sign of a deep pit leading down to water. #70 Your feet are now wet. #71 I think I just lost my appetite. #72 Thank you, it was delicious! #73 You have taken a drink from the stream. The water tastes strongly of minerals, but is not unpleasant. It is extremely cold. #74 The bottle is now empty. #75 Rubbing the electric lamp is not particularly rewarding. Anyway, nothing exciting happens. #76 Peculiar. Nothing unexpected happens. #77 Your bottle is empty and the ground is wet. #78 You can't pour that. #79 Watch it! #80 Which way? #81 Oh dear, you seem to have gotten yourself killed. I might be able to help you out, but I've never really done this before. Do you want me to try to reincarnate you? #82 All right. But don't blame me if something goes wr...... * --- POOF!! --- * You are engulfed in a cloud of orange smoke. Coughing and gasping, you emerge from the smoke and find.... #83 You clumsy oaf, you've done it again! I don't know how long I can keep this up. Do you want me to try reincarnating you again? #84 Okay, now where did I put my orange smoke?.... >POOF!< Everything disappears in a dense cloud of orange smoke. #85 Now you've really done it! I'm out of orange smoke! You don't expect me to do a decent reincarnation without any orange smoke, do you? #86 Okay, if you're so smart, do it yourself! I'm leaving! #87 #88 #89 #90 >>> Messages 81 thru 90 are reserved for "Obituaries". <<< #91 Sorry, but I no longer seem to remember how it was you got here. #92 It's too heavy. You'll have to drop something first. #93 You can't go through a locked steel grate! #94 I believe what you want is right here with you. #95 You don't fit through a two-inch slit! #96 I respectfully suggest you go across the bridge instead of jumping. #97 There is no way across the fissure. #98 You're not carrying anything. #99 You are currently holding the following: #100 It's not hungry (it's merely pining' for the fjords). Besides, you have no bird seed. #101 The snake has now devoured your bird. #102 There's nothing here it wants to eat (except perhaps you). #103 You fool, dwarves eat only coal! Now you've made him *REALLY* mad!! #104 Your cask is empty and the ground is soaked. #105 You aren't carrying them! #106 I don't need to, thank you. #107 The ground is wet and the air is smelly. #108 Y7777777777777777777777777our lamp is now on, but the glare from the walls is absolutely blinding. If you proceed you are likely to fall into a pit. #109 You haven't any matches. #110 Don't be ridiculous! #111 The door is extremely rusty and refuses to open. #112 The plant indignantly shakes dry its leaves and asks, "Water?" #113 The hinges are quite thoroughly rusted now and won't budge. #114 The oil has freed up the hinges so that the door will now move, although it requires some effort. #115 The plant has exceptionally deep roots and cannot be pulled free. #116 The dwarves' knives vanish as they strike the walls of the cave. #117 Something you're carrying won't fit through the tunnel with you. You'd best take inventory and drop something. #118 You can't fit this five-foot clam through that little passage! #119 You can't fit this five-foot oyster through that little passage! #120 I advise you to put down the clam before opening it. >Strain!< #121 I advise you to put down the oyster before opening it. >Wrench!< #122 You don't have anything strong enough to open the clam. #123 You don't have anything strong enough to open the oyster. #124 A glistening pearl falls out of the clam and rolls away. Goodness, this must really be an oyster. (I never was very good at identifying bivalves.) Whatever it is, it has now snapped shut again. #125 The oyster creaks open, revealing nothing but oyster inside. It promptly snaps shut again. #126 You have crawled around in some little holes and found your way blocked by a recent cave-in. You are now back in the main passage. #127 There are faint rustling noises from the darkness behind you. #128 Out from the shadows behind you pounces a bearded pirate! "Har, har," he chortles, "I'll just take all this booty and hide it away with me chest deep in the maze!" He snatches your treasure and vanishes into the gloom. #129 A sepulchral voice reverberating through the cave, says, "Cave closing soon. All adventurers exit immediately through Main Office." #130 A mysterious recorded voice groans into life and announces: "This exit is closed. Please leave via Main Office." #131 It looks as though you're dead. Well, seeing as how it's so close to closing time anyway, I think we'll just call it a day. #132 The sepulchral voice intones, "The cave is now closed." As the echoes fade, there is a blinding flash of light (and a small puff of orange smoke). . . . As your eyes refocus, you look around and find... #133 There is a loud explosion, and a twenty-foot hole appears in the far wall, burying the dwarves in the rubble. You march through the hole and find yourself in the Main Office, where a cheering band of friendly elves carry the conquering adventurer off into the sunset. #134 There is a loud explosion, and a twenty-foot hole appears in the far wall, burying the snakes in the rubble. A river of molten lava pours in through the hole, destroying everything in its path, including you! #135 There is a loud explosion, and you are suddenly splashed across the walls of the room. #136 The resulting ruckus has awakened the dwarves. There are now several threatening little dwarves in the room with you! Most of them throw knives at you! All of them get you! #137 Oh, leave the poor unhappy bird alone. #138 I dare say whatever you want is around here somewhere. #139 I'm not sure what you mean by "Stop". Use "Quit" if you want to give up. #140 You can't get there from here. #141 You are being followed by a very large, tame bear. #142 - *** THE HISTORY OF ADVENTURE (ABRIDGED) *** - - ** By Ima Wimp ** - ADVENTURE was originally developed by William Crowther, and later substantially rewritten and expanded by Don Woods at Stanford Univ. According to legend, Crowther's original version was modelled on an a real cavern, called Colossal Cave, which is a part of Kentucky's Mammoth Caverns. That version of the game included the main maze and a portion of the third-level (Complex Junction - Bedquilt - Swiss Cheese rooms, etc.), but not much more. Don Woods and some others at Stanford later rewrote portions of the original program, and greatly expanded the cave. That version of the game is recognizable by the maximum score of 350 points. Some major additions were done by David Long while at the University of Chicago, Graduate School of Business. Long's additions include the seaside entrance and all of the cave on the "far side" of Lost River (Rainbow Room - Crystal Palace - Blue Grotto, etc.). The castle problem was added in late 1984 by an anonymous writer. Thanks are owed to Roger Matus and David Feldman, both of U. of C., for several suggestions, including the Rainbow Room, the telephone booth and the fearsome Wumpus. Most thanks (and apologies) go to Thomas Malory, Charles Dodgson, the Grimm Brothers, Dante, Homer, Frank Baum and especially Anon., the real authors of ADVENTURE. #143 Do you indeed wish to quit now? #144 There is nothing here with which to fill the vase. #145 The sudden change in temperature has delicately shattered the vase. #146 It is beyond your power to do that. #147 I don't know how. #148 It is too far up for you to reach. #149 You killed a little dwarf. The body vanishes in a cloud of greasy black smoke. #150 The shell is very strong and is impervious to attack. #151 What's the matter, can't you read? Now you'd best start over. #152 The axe bounces harmlessly off the dragon's thick scales. #153 The dragon looks rather nasty. You'd best not try to get by. #154 The little bird attacks the green dragon, and in an astounding flurry gets burnt to a cinder. The ashes blow away. #155 On what? #156 Okay, from now on I'll only describe a place in full the first time you come to it. To get the full description, say "LOOK". #157 Trolls are close relatives with the rocks and have skin as tough as that of a rhinoceros. The troll fends off your blows effortlessly. #158 The troll deftly catches the axe, examines it carefully, and tosses it back, declaring, "Good workmanship, but it's not valuable enough." #159 The troll catches your treasure and scurries away out of sight. #160 The troll refuses to let you cross. #161 There is no longer any way across the chasm. #162 Just as you reach the other side, the bridge buckles beneath the weight of the bear, which was still following you around. You scrabble desperately for support, but as the bridge collapses you stumble back and fall into the chasm. #163 The bear lumbers toward the troll, who lets out a startled shriek and scurries away. The bear soon gives up the pursuit and wanders back. #164 The axe misses and lands near the bear where you can't get at it. #165 With what? Your bare hands? Against *HIS* bear hands?? #166 The bear is confused; he only wants to be your friend. #167 For crying out loud, the poor thing is already dead! #168 The bear eagerly licks up the honeycomb, after which he seems to calm down considerably and even becomes rather friendly. #169 The bear is still chained to the wall. #170 The chain is still locked. #171 The chain is now unlocked. #172 The chain is now locked. #173 There is nothing here to which the chain can be locked. #174 There is nothing here to eat. #175 Do you want the hint? #176 Do you need help getting out of the maze? #177 You can make the passages look less alike by dropping things. #178 Are you trying to explore beyond the Plover Room? #179 There is a way to explore that region without having to worry about falling into a pit. None of the objects available is immediately useful in discovering the secret. #180 Do you need help getting out of here? #181 Don't go west. #182 Gluttony is not one of the troll's vices. Avarice, however, is. #183 Your lamp is getting dim. You'd best start wrapping this up, unless you can find some fresh batteries. I seem to recall there's a vending machine in the maze. Bring some coins with you. #184 Your lamp has run out of power. #185 There's not much point in wandering around out here, and you can't explore the cave without a lamp. So let's just call it a day. #186 There are faint rustling noises from the darkness behind you. As you turn toward them, the beam of your lamp falls across a bearded pirate. He is carrying a large chest. "Shiver me timbers!", he cries, "I've been spotted! I'd best hie meself off to the maze to hide me chest!" With that, he vanishes into the gloom. #187 Your lamp is getting dim. You'd best replace those batteries. #188 Your lamp is now shining with renewed strength. #189 Your lamp is getting dim, and you haven't any more coins. You'd best start wrapping this up. #190 I'm afraid the magazine is written in dwarvish. #191 "This is not the maze where the pirate leaves his treasure chest." #192 Hmmm, this looks like a clue, which means it'll cost you 10 points to read it. Should I go ahead and read it anyway? #193 It says, "Not all black rods are magic wands. Some are useful for other cave construction purposes. There might be some around here." #194 It says the same thing it did before. #195 I'm afraid I don't understand. #196 "Congratulations on bringing light into the dark-room!" #197 You strike the mirror a resounding blow, whereupon it shatters into a myriad tiny fragments. #198 You have taken the vase and hurled it delicately to the ground. #199 You prod the nearest dwarf, who wakes up grumpily, takes one look at you, curses, and grabs for his axe. #200 Is this acceptable? #201 There's no point in suspending a demonstration game. #202 You managed to climb about halfway up before losing your hold and sliding back. #203 You were only a few yards from the top when you slipped and tumbled all the way back down. #204 Ok, ok. No need to be grabby. #205 Pulling an angry bear around is a good way to get your arm ripped off. #206 The sword is now very clean. #207 The sword is now covered with oil. #208 The handle is now too slippery to grasp. #209 You have no scabbard! #210 You are already wearing it! #211 Do you want to extract the sword from the anvil? #212 If you could convince me of your royal blood, you might get somewhere. #213 Are you trying to go up the slide? #214 Maybe you'd better look for another way into the cave. #215 You grasp the sword's handle and pull, but the sword won't budge. Do you want to try yanking it out? #216 A tiny elf runs straight at you, shouts "Phuce!", and disappears into the forest. #217 You can't swim. You'd best go by boat. #218 The boat's oars were stolen by the dwarves to play bing-bong. (That's dwarvish ping-pong -- with rocks!). You have no way to propel the boat. #219 You are still in the boat. It is too heavy to carry. #220 You had better leave the boat first. #221 You are now sitting in a small boat. #222 You couldn't possibly cross this sea without a large ship. #223 The cliff is unscalable. #224 Your keys are all too large for the lock. #225 The wall is too smooth to climb. #226 The shelf is beyond your reach. #227 You are already wearing them! #228 You thought maybe these were peyote?? You feel a little dizzy, but nothing happens. #229 You are growing taller, expanding like a telescope! Just before your head strikes the top of the chamber, the mysterious process stops as suddenly as it began. #230 You are closing up like an accordion....shrinking..shrinking. You are now your normal size. #231 You have smashed your bottle all over the ground. #232 You are now too big to leave the way you came in. #233 This is obviously an elfin entrance. Unless you can squeeze yourself through a six-inch door, you'll have to find another way into the cave. #234 The wrought-iron door is now locked. #235 The tiny door is now locked. #236 The wrought-iron door is now unlocked. #237 The tiny door is now unlocked. #238 You are blocked by the wrought-iron door. #239 <$$< #240 The Wumpus looks at the food with distaste. He looks at *YOU* with relish! #241 You have jerked the cloak free of the rocks. However, in doing so you have caused a small rock slide, blocking the entrance and making an unholy din. #242 The cloak is stuck tight under the rocks. You'll probably have to yank it out. #243 The Wumpus grabs the axe, stops and picks his teeth with it for a few moments while looking thoughtfully at you. When he finishes picking his teeth, he eats the axe, belches, farts... and starts after you again! #244 As the bridge disappears, the Wumpus scrambles frantically to reach your side of the fissure. He misses by inches, and with a horrible shriek plunges to his death in the depths of the fissure! #245 You can't even hit a sleeping Wumpus! The axe is now lying too near the Wumpus for you to retrieve it. #246 The Wumpus is between you and the axe. You can't reach it. #247 You can't fit through a six-inch door! #248 The dog easily dodges the axe, which lands beyond him where you can't get at it. #249 The dog woofs (natch) down the food and looks around hungrily for more. However, he does not appear to be any better disposed towards your presence. #250 You've got to be kidding! #251 It's attached to the wall! #252 You can't put a thing into itself! #253 The gnome firmly blocks the door of the booth. You can't enter. #254 The constant ringing has awakened the dwarves! There are now several threatening little dwarves in the room with you! Most of them throw knives at you! All of them get you! #255 The telephone is out of order. #256 The telephone is out of order and your hand is sore. #257 A couple of lead slugs drop from the coin box. (Gnomes are notoriously cheap....) But you've broken the phone beyond all hope. #258 He wants treasure, not gab. #259 He didn't say anything! #260 It isn't a parrot. He didn't say anything. #261 No one replies. The line goes dead with a faint "Click". #262 I think you are a little confused! #263 As you move towards the phone booth, a gnome suddenly streaks around the corner, jumps into the booth and rudely slams the door in your face. You can't get in. #264 He isn't hungry. #265 As the blast of the horn reverberates through the chamber, the seemingly solid rock wall crumbles away, revealing another room just beyond. The wall was most likely worn thin by an ancient watercourse which dried up just before completely wearing away the rock. #266 The chamber reverberates to the blast of the horn. (Satchmo you ain't!) #267 The bees swarm over the fresh flowers, leaving the hive unguarded and revealing a sweet honeycomb. #268 You are now out of breath. #269 It isn't ringing! #270 A hairy paw reaches out of the darkness and.... #271 You don't have the correct change. #272 You go a short way down the bright passage, but the light grows to blinding intensity. You can't continue. #273 You know, if you type "BRIEF", I won't have to keep repeating these long descriptions of each room. #274 Are you trying to reach the natural bridge? #275 You can't get to it by climbing the walls or jumping or anything like that. You could always put in a telephone call to the local spelunking club for advice, if you could find a phone. #276 You turkey!!! Now you've done it! It took some effort, but you woke up the Wumpus. He slowly opens one red eye, and then another, and then one more (!!), and looks at you sleepily. He had been dreaming of a late snack. If you don't act quickly, you'll be a *late* adventurer! #277 The blast of your horn echoes throughout hill and dale. #278 All you have are watercress sandwiches. The bear is less than interested. #279 You have smashed your sword to smithereens against a rock. #280 Setting yourself adrift in the boat with no way to propel it would not be very smart. Best to keep the pole. #281 You're already in it! #282 You've hit the jackpot!! Hundreds of coins and slugs cascade from the telephone's coin return slot and spill all over the floor of the booth. #283 Whoops! The floor has opened out from under you! It seems you have fallen into a bottomless pit. As a matter of fact, you're still falling! Well, I have better things to do than wait around for you to strike bottom, so let's just assume you're dead. Sorry about that, Chief. #284 The telephone in the booth has begun to ring. #285 I don't understand what you are trying to do! #286 How do you propose to cross the river? #287 The air is filled with beautiful music. #288 The air fills with beautiful music. The dog gradually becomes less fierce, and after a short while he lies down by the side of the cavern and falls into a deep sleep. #289 Are you trying to get past the dog? #290 The only person I can remember who managed to get past the dog was that singer, ummm, what's his name... Eurydice's friend.... #291 That wouldn't be wise. It is best to let sleeping dogs lie. #292 The stream flows out of one very small crack and into another. You can't go that way. #293 The river is too wide and deep to cross. #294 The glare is absolutely blinding. If you proceed you are likely to fall into a pit. #295 The hum of the bees rises to an angry buzz as you move towards the hive. #296 The sticks and branches are all in a tangle and are stuck in the mud. You'd need a shovel to dig them out. #297 You're already carrying them! #298 The chalice is slightly cracked. It won't hold any liquids. #299 The cask is now empty. #300 The wine goes right to your head. You reel around in a drunken stupor and finally pass out. You awaken with a splitting headache, and try to focus your eyes.... #301 Yeeeecchhh!! #302 Your bottle is already full. #303 The cask is already full. #304 There is nothing here with which to fill the bottle. #305 There is nothing here which you would want to put into the cask. #306 Your bottle is now full of water. #307 The cask is now full of water. #308 Your bottle is now full of oil. #309 The cask is now full of oil. #310 The bottle is now full of wine. #311 The cask is now full of wine. #312 You have nothing in which to carry it. #313 You can't fill that. #314 Do you want it in the bottle or the cask? #315 Your containers are both full. #316 It's empty. #317 Hmmm, I see you have already gone through an extra set of batteries. I'll get rid of the trash for you. #318 The bridge shakes as you cross. Large hunks of clay and rock near the edge break off and hurtle far down into the chasm. Several of the cracks on the bridge surface widen perceptibly. #319 The load is too much for the bridge! With a roar, the entire structure gives way, plunging you headlong into the raging river at the bottom of the chasm and scattering all your holdings. As the icy waters close over your head, you flail and thrash with all your might, and with your last ounce of strength pull yourself onto the south bank of the river. #320 You can't get at him. He is inside the phone booth. #321 Your lamp is already on. #322 Your lamp is already off. #323 Your lamp is again growing dim. You'd better get some more batteries. #324 You know, you are wasting your batteries by wandering around out here with your light on. #325 #326 Dead wumpi, as a rule, are light eaters. Nothing happens. #327 How do expect to feed a sleeping Wumpus? #328 You aren't holding it! #329 It won't fit! #330 The coin drops into the slot with a dull "clunk". There is no dial tone. #331 It's already there. #332 Please read the supplied documentation files to find out where to send complaints, suggestions, and bug reports. #333 The chest is now unlocked. #334 The chest is now locked. #335 You can't get at it. #336 It's already open. #337 It's locked. #338 It's already closed. #339 You can't fill that. It would leak all over the place. #340 It's not inside anything. #341 It isn't there! #342 How? #343 Taken. #344 Dropped. #345 I don't think I can. #346 Interesting. How? #347 Huh? #348 You are in perfect health. #349 You are fit as a fiddle. #350 Only wizards can do that! #351 Are you kidding? Do you want to suffocate the poor thing? #352 Thrown. #353 Left. #354 You can't get close enough for a clean thrust. #355 As you move in for the kill, the dwarf neatly slips a knife between your ribs. #356 As you approach, the dwarf slashes out with his knife! #357 It's too dark to see anything! #358 It's not open. #359 There's nothing inside. #360 It contains: #361 The billboard reads: "Visit Beautiful Colossal Cave. Open Year Around. Fun for the entire family, or at least for those who survive." Below the headline is an impossibly complicated map showing how to find Colossal Cave. Not that it matters, because all the directions are written in Elvish. #362 Hidden behind the poster is a steel safe, embedded in the wall. #363 Brushing the dust from one of the larger rocks reveals some carved characters. #364 Enough dusting, already! You're making me sneeze. #365 The safe door smoothly swings open. #366 Maybe if you rubbed your fingertips with sandpaper.... #367 The safe's door clicks shut. #368 This is a combination safe. The keys won't help. #369 I certainly can't read in this light. #370 The poster has a picture of a thin man with a long white beard. He is wearing a high pointed cap embroidered with strange symbols, and he is pointing a finger at you. Below the picture are the words: "I want you!--To report all good ideas for extensions to this game to me without delay. Remember: ask not what ADVENTURE can do to you; ask what you can do for ADVENTURE." - * * * - "A public service of the John Dillinger Died for You Society." #371 "Click." #372 In the rock is carved the message "7-22-34". #373 You can't get at them. #374 Ok, I'll give you the full description whenever you enter a room for the first time. #375 You don't have the right key. #376 That's not strong enough to open the clam. #377 That's not strong enough to open the oyster. #378 Game suspension is no longer permitted! #379 ** Unused ** #380 >>> Messages 381 thru 389 are reserved for "Diagnoses". <<< #381 You are a bit off top form, but nothing to worry about. #382 You are weaker than usual. Better avoid fights. #383 You really ought to take a break. You're in tough shape. #384 You are on the edge of collapse. Lots of sun and fresh air will speed your recovery. #385 Your strength is nearly gone. Only a miracle can save you now. #386 ** Unused ** #387 ** Unused ** #388 ** Unused ** #389 ** Unused ** #390 >>> Messages 391 thru 399 are reserved for Radium Poisoning. <<< #391 Is it hot in here? You are flushed and sweating. #392 You are feeling definitely peculiar, weak.... #393 You're dizzy, nauseous. You can barely stand. #394 You are really ill. If you don't find an antidote soon, it's curtains. #395 You are a walking wound. You are very weak. You'd better find out what's wrong before it's too late. #396 Sheeesh! What a mess! Your hair has fallen out and your skin is covered with blisters. And not an aspirin in sight! #397 Well, you tried, but your strength is gone. The agony is finally over. #398 ** Unused ** #399 ** Unused ** #400 You feel rather disembodied, as if you were suddenly somewhere else entirely. #401 You sense that you are in a dark place. The only thing in sight appears to be a companion to the crystal ball which holds your gaze. It seems to be searching the gloom for something to show you, but all it can see is itself: a brilliant blue six-pointed star suspended in space. #402 Your gaze withdraws from the crystal ball, and you are now back in your normal senses. #403 A large, stately elf walks up the rise, says the word "Saint-Michel", and is instantly transported to the castle. #404 Are you trying to get to the castle? #405 It's easy to get there if you know how. The elves cross over from here so perhaps you might watch an elf to see how. Of course they are a bit shy, so keep a good way off while you watch. #406 You get a tingling feeling as you walk through the gate, and ... #407 Fiddling with the bird in its cage is not useful. If you had it in your hand it would make a mess. #408 Would you like a map? /* program DATABASE.C */ #include #include #include "advent.h" #include "advdec.h" #include "advtext.h" static char oline[256]; _PROTOTYPE(void rdupto, (FILE *, int, int, char *)); _PROTOTYPE(void rdskip, (FILE *, int, int)); /* Function to scan a file up to a specified point and either print or return a string. */ void rdupto(fdi, uptoc, print, string) FILE *fdi; int uptoc, print; char *string; { int c, i; static _CONST unsigned char key[4] = {'c' | 0x80, 'L' | 0x80, 'y' | 0x80, 'D' | 0x80}; i = 1; while ((c = getc(fdi)) != uptoc && c != EOF) { if (c == '\n') i = 1; if (c >= 0x80) c ^= key[i++ & 3]; if (c == '\r') continue; if (print) putchar(c); else *string++ = (char) c; } if (!print) *string = '\0'; return; } /* Function to read a file skipping a given character a specified number of times, with or without repositioning the file. */ void rdskip(fdi, skipc, n) FILE *fdi; int skipc, n; { int c; while (n--) while ((c = getc(fdi)) != skipc) if (c == EOF) bug(32); return; } /* Routine to request a yes or no answer to a question. */ boolean yes(msg1, msg2, msg3) int msg1, msg2, msg3; { char answer[INPUTBUFLEN]; if (msg1) rspeak(msg1); do { switch (*ask("\n> ", answer, sizeof(answer))) { case 'n': case 'N': if (msg3) rspeak(msg3); return (FALSE); case 'y': case 'Y': if (msg2) rspeak(msg2); return (TRUE); default: fputs("Please answer Y (yes) or N (no).", stdout); } } while (TRUE); } /* Print a location description from "advent4.txt" */ void rspeak(msg) int msg; { if (msg == 54) printf("ok.\n"); else { fseek(fd4, idx4[msg - 1], 0); rdupto(fd4, '#', 1, 0); } return; } /* Print an item message for a given state from "advent3.txt" */ void pspeak(item, state) int item, state; { fseek(fd3, idx3[item - 1], 0); rdskip(fd3, '/', state + 2); rdupto(fd3, '/', FALSE, oline); if (strncmp(oline, "<$$<", 4) != 0) printf("%s", oline); return; } /* Print a long location description from "advent1.txt" */ void desclg(loc) int loc; { fseek(fd1, idx1[loc - 1], 0); rdupto(fd1, '#', 1, 0); return; } /* Print a short location description from "advent2.txt" */ void descsh(loc) int loc; { fseek(fd2, idx2[loc - 1], 0); rdupto(fd2, '#', 1, 0); return; } /* program ENGLISH.C */ #include #include #include #include #include "advent.h" #include "advdec.h" #define ALL 109 #define ENTER 3 #define CRAWL 17 #define JUMP 39 #define CLIMB 56 #define XYZZY 62 #define PLUGH 65 #define PLOVER 71 #define PHUCE 82 _PROTOTYPE(static void getwords, (void)); _PROTOTYPE(static void clrlin, (void)); _PROTOTYPE(static void doobj, (int *)); _PROTOTYPE(static boolean doiobj, (void)); _PROTOTYPE(static boolean do_scoop_up, (void)); _PROTOTYPE(static boolean check_next, (void)); static char buffer[INPUTBUFLEN] = {'\0', '\0', '\0', '\0'}; static char *txt[MAXWORDS] = {buffer, buffer, buffer, buffer}; static char *cindex = buffer; static boolean pflag; static int vrbkey, words[MAXWORDS] = {0, 0, 0, 0}, word, wdx = 0; static int takdir[20] = {2, 6, 9, 10, 11, 13, 14, 17, 23, 25, 33, 34, 36, 37, 39, 78, 79, 80, 89, -1}; static int vkey[60] = { 0, 199, 9, 0, 130, 0, 197, 0, 0, 243, 0, 0, 89, 140, 0, 5, 0, 227, 0, 0, 0, 31, 42, 0, 0, 0, 0, 172, 1, 0, 0, 0, 254, 0, 69, 0, 0, 92, 0, 0, 138, 137, 149, 239, 45, 74, 183, 0, 0, 112, 241, 0, 114, 0, 30, 0, 0, 0, 0, 0 }; static int ptab[260] = { 0, 3028, 3065, 3009, -3005, 5071, 5070, 5058, -5020, 19055, 19108, 19038, 19020, 19071, 19070, 19058, 19004, 19048, 19091, 19094, 19112, 19002, 19118, 2062, 2066, 2047, 2067, 2053, 2065, -2010, -3114, 4034, 4011, 4101, 4035, 4099, 4098, 4017, 4104, 4014, 4015, -4087, 3083, 3085, -3081, 5055, 5108, 5020, 5071, 5070, 5058, 5004, 5048, 5091, 5112, 5099, 5118, 19055, 19108, 19020, 19071, 19070, 19058, 19004, 19048, 19091, 19112, 19099,-19118, 3028, 3065, 3009, 3005, -3018, 19055, 19108, 19038, 19020, 19071, 19070, 19058, 19004, 19004, 19048, 19091, 19094, 19112, 19002,-19118, 3028, 3065, -3018, 19055, 19108, 19038, 19020, 19071, 19070, 19058, 19004, 19048, 19091, 19094, 19112, 19118, 2062, 2066, 2047, 2067, 2053, 2065, -2010, 3102, -3090, 19055, 19108, 19020, 19071, 19070, 19058, 19004, 19048, 19091, 19014, 19015, 19112, 19118, 19120, 19120, -9999, 3090, 3102, 3028, 3057, 3065, 3009, -3005,-29999, 2052, -2068, 2024, 2065, 2091, 2042, 2073, 5071, 5070, 5058, -5020, 30999, 2062, 2066, 2047, 2067, 2053, 2065, 2010, 2073, 19055, 19108, 19038, 19020, 19071, 19070, 19058, 19004, 19048, 19091, 19094, 19112, 19002,-19118, 2014, 2015, 2013, 2999, 5014, 5015, 5013, 5999, 5110, 5113, -5999, 5055, 5108, 5020, 5071, 5070, 5058, 5004, 5048, 5091, 5014, 5015, 5112, 5099, -5118, 3102, -3090, 6066, 6047, 6067, 6053, 6072, 6073, 5055, 5108, 5020, 5071, 5070, 5004, 5004, 5048, 5091, 5112, 5099, 5118, 19055, 19108, 19020, 19071, 19070, 19058, 19004, 19048, 19091,-19118, 4034, 4011, 4101, 4035, 4099, 4098, 4017, 4104, 4027, 4087, 9999,-30999, 2002, -6002, 3102, -3090, 9999, 4034, 4011, 4101, 4035, 4099, 4087, 4098, 4017, 4104, -4027, -5999, 0, 0, 0, 0, 0, }; static int adjkey[40] = { 0, 15, 38, 64, 4, 63, 1, 61, 62, 67, 9, 27, 53, 46, 47, 60, 31, 39, 40, 6, 43, 26, 32, 28, 34, 50, 49, 45, 44, 10, 20, 25, 21, 36, 37, 30, 33, 0, 0, 0 }; static int adjtab[70] = { 0, 5, 98, -83, 2, -90, 66, 41, -90, -39, 41, 14, 15, 50, -11, 50, 64, 56, 72, -74, -19, 119, 59, 73, -118, -119, -70, -41, 95, -118, -118, -58, -71, -120, 110, -108, -120, -73, -62, -60, 110, 54, -63, -67, -41, -27, -47, 52, -75, -69, 65, 112, -3, 41, 72, 90, 20, 101, 107, -118, -55, -10, -38, -4, 48, 9, -71, -39, 0, 0 }; /* Analyze a two word sentence */ int english() { char *ch_ptr, *word1, *word2; int type, val, type2, val2, adj, k, kk; static int iwest = 0; if (!(words[++wdx])) { getwords(); wdx = 0; } pflag = FALSE; word = words[wdx]; if (word < 0) { /* check first word */ printf("I didn't understand the word \"%s\"\n", txt[wdx]); words[wdx+1] = 0; return (FALSE); /* didn't know it */ } type2 = val2 = -1; type = CLASS(word); clrlin(); val = VAL(word); if (words[wdx + 1] && CLASS(words[wdx + 1]) != CONJUNCTION) { /* 'SAY' or 'CALL'. If no next word, pass on to higher powers. */ if (type == ACTION && (val == SAY || val == YELL)) { word = words[++wdx]; if (!(word == XYZZY || word == PLUGH || word == PLOVER || word == PHUCE)) { if (val == SAY) printf("Okay, \"%s\".\n", txt[wdx]); else { for (ch_ptr = txt[wdx]; *ch_ptr; ch_ptr++) if (islower(*ch_ptr)) *ch_ptr = toupper(*ch_ptr); printf("Okay, \"%s\"!!!!!\n", txt[wdx]); } return (FALSE); } } else { word1 = txt[wdx]; word2 = txt[wdx + 1]; /* Special stuff for 'ENTER'. Can't go into water. 'ENTER BOAT' means 'TAKE BOAT' */ if (word == ENTER) { if (CLASS(words[wdx + 1]) == NOUN && VAL(words[wdx + 1]) == BOAT) word = TAKE + 2000; else if ((strcmp(word2, "stream") == 0) || (strcmp(word2, "water") == 0) || (strcmp(word2, "reservoir") == 0) || (strcmp(word2, "ocean") == 0) || (strcmp(word2, "sea") == 0) || (strcmp(word2, "pool") == 0)) { rspeak(liqloc(g.loc) == WATER ? 70 : 43); wdx++; return (FALSE); } } else { type2 = CLASS(words[wdx + 1]); val2 = VAL(words[wdx + 1]); /* 'LEAVE' is motion verb, unsless leaving an object. E.G., 'LEAVE BOAT' or 'LEAVE BOTTLE'. BUt make sure to leave ('DROP') only totable objects. */ if (strcmp(word1, "leave") == 0 && type2 == NOUN) { if (!hinged(val2) || g.fixed[val2]) word = LEAVE + 2000; /* IF 'LIGHT LAMP', Light must be taken as an action verb, not a noun. */ } else if (strcmp(word1, "light") == 0 && VAL(words[wdx + 1]) == LAMP) { word = ON + 2000; /* 'WATER PLANT' becomes 'POUR WATER', If we are at plant. 'OIL DOOR' becomes 'POUR OIL', etc., etc. */ } else if ((strcmp(word1, "water") == 0 || strcmp(word1, "oil") == 0) && (strcmp(word2, "plant") == 0 || strcmp(word2, "door") == 0 || strcmp(word2, "sword") == 0 || strcmp(word2, "anvil") == 0) && at(val2)) { words[wdx + 1] = word; txt[wdx + 1] = txt[wdx]; word = POUR + 2000; } } } } /* This is the 'inner' loop. Dispatching of all word in a clause after the first comes through here. */ do { switch (CLASS(word)) { case MOTION: { boolean do_part2; int i; do_part2 = FALSE; type = CLASS(verbs[vrbx]); val = VAL(verbs[vrbx]); if (!vrbx) do_part2 = TRUE; else { if (type > ACTION) { rspeak(confuz()); return (FALSE); } } if (type == ACTION) { if (val == GO) do_part2 = TRUE; else { if (val == TAKE) { for (i = 0; i < 20; i++) if (takdir[i] == val) do_part2 = TRUE; } if (!do_part2) { word = vocab(txt[wdx], 1); if (word) words[wdx--] = word; } } } else if (type != CRAWL && type != JUMP && type != CLIMB) do_part2 = TRUE; if (do_part2) { verbs[1] = word; vrbx = 1; if (strcmp(txt[wdx], "west") == 0) { iwest++; if (iwest == 10) rspeak(17); } } break; } case NOUN: if (pflag) { if (!doiobj()) return (FALSE); } else { word = VAL(word); if (word == ALL) { if (!do_scoop_up()) return (FALSE); } else { doobj(&word); if (word > 0) { objs[++objx] = word; otxt[objx] = txt[wdx]; } else { clrlin(); pflag = FALSE; wdx++; while (words[wdx]) { if (CLASS(words[wdx]) == CONJUNCTION) break; wdx++; } if (words[wdx] == 0) return (F77777777777ALSE); } } } break; case ACTION: if (vrbx == 0) vrbx++; else { if (VAL(verbs[vrbx]) == TAKE) { val = VAL(word); if (val == DRINK || val == INVENTORY || val == SCORE || val == NOTHING || val == LOOK); else if (val == GO && ( strcmp(txt[wdx], "walk") == 0 || strcmp(txt[wdx], "run") == 0 || strcmp(txt[wdx], "hike") == 0)); else { rspeak(confuz()); return (FALSE); } } else if (objx || CLASS(words[wdx - 1]) == CONJUNCTION) { rspeak(confuz()); return (FALSE); } } verbs[vrbx] = word; vtxt[vrbx] = txt[wdx]; break; case MISC: if (vrbx) { rspeak(confuz()); return (FALSE); } verbs[1] = word; vrbx = 1; break; case PREPOSITION: if (CLASS(verbs[vrbx]) != ACTION || iobx) { rspeak(confuz()); return (FALSE); } vrbkey = vkey[VAL(verbs[vrbx])]; if (!vrbkey) { rspeak(confuz()); return (FALSE); } prep = VAL(word); pflag = TRUE; break; case ADJACTIVE: /* Adjective handler. Scarf the next word, make sure it is a valid object for this object. Then call getobj to see if it is really there, Then link into object code. */ adj = VAL(word); if (!check_next()) return (FALSE); else if (CLASS(word) == CONJUNCTION) { printf("%s what?\n", txt[wdx - 1]); return (FALSE); } else { if (CLASS(word) != NOUN) word = vocab(txt[wdx], NOUN); if (word == -1 || CLASS(word) != NOUN || VAL(word) == ALL) { rspeak(confuz()); return (FALSE); } words[wdx] = word; kk = VAL(word); for (k = adjkey[adj]; adjtab[k] >= 0; k++) { if (kk == abs(adjtab[k])) break; } if (adjtab[k] < 0) { rspeak(confuz()); return (FALSE); } } break; case CONJUNCTION: if (!check_next()) return (FALSE); switch (CLASS(word)) { case MOTION: case ACTION: case MISC: words[wdx--] = 0; break; case NOUN: case ADJACTIVE: break; case PREPOSITION: case CONJUNCTION: rspeak(confuz()); return (FALSE); default: bug(33); } break; default: bug(33); } word = words[++wdx]; if (word < 0) { if (pct(50)) printf("I don't understand the word %s?\n", txt[wdx]); else printf("Mumble ? %s\n", txt[wdx]); words[wdx+1] = 0; return (FALSE); } type = CLASS(word); if (type == NOUN) { /* It's not the first: Make sure he included a comma or 'and'. Differenctiate between direct & indirect objects. Check for special case of multiple ofjects: 'feed bear honey' or 'throw troll nugget'. */ if ((pflag ? iobx : objx) && CLASS(words[wdx - 1]) != CONJUNCTION) { val = VAL(verbs[vrbx]); if (!living(objs[objx]) || (val != THROW && val != FEED)) { rspeak(confuz()); return (FALSE); } iobx++; iobjs[iobx] = objs[objx]; objs[objx] = 0; objx++; } } } while (word); if (verbs[1] == 0) { if (objs[1] == 0) { rspeak(confuz()); clrlin(); } else if (objs[2]) printf("What do you want to do with them?\n"); else printf("What do you want to do with %s?\n", otxt[1]); return (FALSE); } else if (objx > 1 && iobx > 1) { rspeak(confuz()); return (FALSE); } return (TRUE); } /* retrieve input line (max INPUTBUFLEN chars), convert to lower case & rescan for first two words (max. WORDSIZE-1 chars). */ static void getwords() { static int wdx = 0; int i, term_loc; char terminator; if (*cindex == '\0') { while (!*ask("\n> ", buffer, sizeof(buffer))) ; for (cindex = buffer; *cindex; cindex++) if (isupper(*cindex)) *cindex = tolower(*cindex); cindex = buffer; } wdx = 0; buffer[sizeof(buffer)-1] = '\0'; for (i = 0; i < MAXWORDS; i++) { txt[i] = &buffer[sizeof(buffer)-1]; words[i] = 0; } do { while (*cindex == ' ') cindex++; txt[wdx] = cindex; term_loc = strcspn(cindex, " ,.;\n"); cindex += term_loc; terminator = *cindex; *cindex++ = '\0'; if ((strcmp(txt[wdx], "a") != 0) && (strcmp(txt[wdx], "the") != 0) && (strcmp(txt[wdx], "an") != 0)) { words[wdx] = vocab(txt[wdx], 0); wdx++; } if (terminator == ',') { txt[wdx] = "and"; words[wdx] = vocab(txt[wdx], 0); wdx++; } } while ((terminator != ';') && (terminator != '.') && (terminator != '\0') && (terminator != '\n')); if (terminator == '\0') cindex--; return; } /* CLRIN, clears out all surrent syntax args in preparation for * new input line */ static void clrlin() { int i; for (i = 0; i < MAXWORDS; i++) { verbs[i] = 0; vtxt[i] = &buffer[sizeof(buffer)-1]; } for (i = 0; i < MAXITEMS; i++) { objs[i] = 0; otxt[i] = &buffer[sizeof(buffer)-1]; iobjs[i] = 0; iotxt[i] = &buffer[sizeof(buffer)-1]; } vrbx = 0; objx = 0; iobx = 0; prep = 0; } /* Routine to process an object. */ static void doobj(object) int *object; { int msg; if (holding(*object)) return; if (blind()) { printf("I see no %s here.\n", txt[wdx]); *object = 0; return; } /* Is object here? if so, transitive */ if (g.fixed[*object] == g.loc || athand(*object)) return; else if (here(*object)) { msg = plural(*object) ? 373 : 335; *object = 0; rspeak(msg); } /* Did he give grate as destination? */ else if (*object == GRATE) { if (g.loc == 1 || g.loc == 4 || g.loc == 7) { verbs[1] = DEPRESSION; vrbx = 1; return; } else if (g.loc > 9 && g.loc < 15) { verbs[1] = ENTRANCE; vrbx = 1; return; } } /* Is it a dwarf he is after? */ else if (dcheck() && g.dflag >= 2) { *object = DWARF; } /* Is he trying to get/use a liquid? */ else if (liqloc(g.loc) == *object || (liq(BOTTLE) == *object && athand(BOTTLE)) || (liq(CASK) == *object && athand(CASK))); else if (*object == PLANT && at(PLANT2) && g.prop[PLANT2] == 0) { *object = PLANT2; } else if (*object == ROCKS && at(CARVNG)) { *object = CARVNG; } /* Is he trying to grab a knife? */ else if (*object == KNIFE && g.knfloc == g.loc) { rspeak(116); g.knfloc = -1; } /* Is he trying to get at dynamite? */ else if (*object == ROD && athand(ROD2)) { *object = ROD2; } else if (*object == DOOR && (at(SAFE) || at(TDOOR) || at(TDOOR2) || at(PDOOR))) { if (at(TDOOR2)) *object = TDOOR2; else if (at(PDOOR)) *object = PDOOR; else if (at(SAFE)) *object = SAFE; else *object = TDOOR; } else if (*object == BOOK && athand(BOOK2)) { *object = BOOK2; } else if (!(verbs[vrbx] == FIND || verbs[vrbx] == INVENTORY)) { *object = 0; printf("I see no %s here.\n", txt[wdx]); } return; } static boolean doiobj() { char dk[INPUTBUFLEN], dkk[INPUTBUFLEN]; int kk; boolean ok; /* checks object is valid for this preposition */ ok = TRUE; word = VAL(word); if (word != ALL) { doobj(&word); if (word > 0) { iobjs[++iobx] = word; iotxt[iobx] = txt[wdx]; } else ok = FALSE; } kk = abs(ptab[vrbkey]) / 1000; if (kk == prep) { /* preprosition is valid with this verb now check object of preprosition */ if (word == 0 || CLASS(word) == CONJUNCTION) { /* no object following prepresition: check special cases */ pflag = FALSE; strcpy(dk, txt[--wdx]); strcpy(dkk, vtxt[vrbx]); ok = FALSE; if ((strcmp(dk, "on") == 0 || strcmp(dk, "off") == 0) && (strcmp(dkk, "turn") == 0 || objs[objx] == LAMP)) ok = TRUE; if (strcmp(dkk, "take") == 0 || strcmp(dkk, "put") == 0) ok = TRUE; if (strcmp(dk, "up") == 0 && strcmp(dkk, "pick") == 0) ok = TRUE; if (strcmp(dk, "down") == 0 && (strcmp(dkk, "put") == 0 || verbs[vrbx] == THROW) ) ok = TRUE; } else { /* object follows preposition See if it's plausible. */ kk = abs(ptab[vrbkey]) % 1000; if (kk == word && kk == ALL) { if (!do_scoop_up()) return (FALSE); } else if (!(kk == word || kk == 999)) { vrbkey++; ok = ptab[vrbkey - 1] < 0 ? FALSE : TRUE; } } } return (ok); } static boolean do_scoop_up() { int i, val; val = VAL(verbs[vrbx]); if (val == DROP || val == PUT || val == LEAVE) { for (i = 1; i < MAXOBJ; i++) { if (!athand(i) || g.fixed[i]) continue; if (i > WATER && i <= WINE + 1) continue; if (toting(i)) { objs[++objx] = i; otxt[objx] = "BUG???"; if (objx >= 44) break; } } } if (val == TAKE || val == PICK || val == GET) { if (blind()) { rspeak(357); return (FALSE); } else { for (i = 1; i < MAXOBJ; i++) { if (!athand(i) || g.fixed[i]) continue; if (i > WATER && i <= WINE + 1) continue; if (!toting(i)) { objs[++objx] = i; otxt[objx] = "BUG???"; if (objx >= 44) break; } } } } return (TRUE); } static boolean check_next() { word = words[wdx + 1]; if (word > 0) return (TRUE); else if (word == 0) rspeak(confuz()); else { if (pct(50)) printf("I don't understand the word %s?\n", txt[wdx]); else printf("Mumble ? %s\n", txt[wdx]); words[wdx+1] = 0; } return (FALSE); } /* Initialization of adventure play variables */ #include #include #include "advent.h" /* #define preprocessor equates */ #define EXTERN /* define, not declare, in advdec.h */ #include "advdec.h" int plac[MAXOBJ] = { 0, 0, 3, 8, 10, 11, 0, 14, 0, 148, /* 0 - 9 */ 96, 19, 17, 101, 103, 0, 106, 0, 0, 238, /* 10 - 19 */ 238, 117, 190, 109, 25, 23, 111, 35, 0, 97, /* 20 - 29 */ 0, 119, 0, 117, 0, 130, 0, 126, 140, 0, /* 30 - 39 */ 96, 94, 158, 160, 188, 0, 155, 174, 166, 228, /* 40 - 49 */ 18, 204, 27, 29, 30, 0, 92, 168, 97, 100, /* 50 - 59 */ 101, 0, 119, 127, 130, 141, 144, 205, 28, 182, /* 60 - 69 */ 225, 230, 0, 147, 241, 248, 0, 0, 0, 0, /* 70 - 79 */ 0, 0, 0, 0, 0, 0, 0, 193, 102, 0, /* 80 - 89 */ 159, 141, 172, 188, 189, 0, 0, 193, 227, 174, /* 90 - 99 */ 0, 13, 238, 217, 171, 0, 146, 159, 3, 0, /* 100 - 109 */ 0, 0, 0, 3, 180, 39, 5, 0, 110, 169, /* 110 - 119 */ 200 }; int fixd[MAXOBJ] = { 0, 0, 0, 9, 0, 0, 0, 15, 0, 0, /* 0 - 9 */ 0, -1, 27, -1, 0, 0, 0, -1, 0, 0, /* 10 - 19 */ 0, 122, 235, -1, -1, 67, -1, 110, 0, -1, /* 20 - 29 */ -1, 121, 0, 122, 0, -1, -1, -1, -1, 0, /* 30 - 39 */ -1, -1, 166, 167, 189, 0, 0, -1, 0, 229, /* 40 - 49 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 50 - 59 */ 0, 0, 121, 0, -1, 0, 0, 0, 0, 0, /* 60 - 69 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 70 - 79 */ 0, 0, 0, 0, 0, 0, 0, -1, 194, -1, /* 80 - 89 */ 0, -1, 174, -1, -1, 0, 0, -1, -1, -1, /* 90 - 99 */ 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, /* 100 - 109 */ 0, 0, -1, 0, 0, -1, -1, 0, 0, 0, /* 110 - 119 */ 0 }; struct playinfo g = { 0, /* turns */ 1, /* loc */ 1, /* oldloc */ 1, /* oldloc2 */ 1, /* newloc */ { /* loc_attrib[MAXLOC] */ 0, 73, 65, 73, 73, /* 0 - 4 */ 65, 65, 73, 1601, 33, /* 5 - 9 */ 32, 32, 32, 1824, 32, /* 10 - 14 */ 0, 2, 0, 0, 2816, /* 15 - 19 */ 2, 2, 2, 0, 10, /* 20 - 24 */ 0, 2, 0, 0, 0, /* 25 - 29 */ 0, 2, 2, 8, 0, /* 30 - 34 */ 0, 0, 0, 8, 0, /* 35 - 39 */ 2, 0, 256, 256, 256, /* 40 - 44 */ 256, 272, 272, 272, 256, /* 45 - 49 */ 256, 0, 256, 256, 272, /* 50 - 54 */ 256, 272, 0, 16, 2, /* 55 - 59 */ 0, 0, 0, 0, 0, /* 60 - 64 */ 0, 0, 0, 0, 0, /* 65 - 69 */ 0, 0, 0, 0, 0, /* 70 - 74 */ 0, 0, 0, 0, 2, /* 75 - 79 */ 256, 256, 272, 0, 0, /* 80 - 84 */ 16, 272, 0, 0, 2, /* 85 - 89 */ 2, 0, 0, 0, 0, /* 90 - 94 */ 8, 0, 0, 1280, 513, /* 95 - 99 */ 513, 512, 0, 0, 0, /* 00 - 04 */ 0, 0, 0, 768, 0, /* 105 - 109 */ 0, 0, 0, 8, 0, /* 110 - 114 */ 1, 1, 0, 0, 0, /* 115 - 119 */ 0, 0, 16, 16, 16, /* 120 - 124 */ 16, 17, 16, 16, 16, /* 125 - 129 */ 16, 0, 0, 0, 0, /* 130 - 134 */ 0, 0, 0, 0, 0, /* 135 - 139 */ 0, 1040, 16, 0, 0, /* 140 - 144 */ 2, 65, 65, 65, 65, /* 145 - 149 */ 65, 65, 65, 65, 65, /* 150 - 154 */ 65, 3, 2625, 2113, 65, /* 155 - 159 */ 65, 3, 3, 3, 3, /* 160 - 164 */ 3, 41, 41, 9, 9, /* 165 - 169 */ 0, 0, 0, 0, 0, /* 170 - 174 */ 0, 0, 0, 2, 0, /* 175 - 179 */ 0, 2, 0, 0, 0, /* 180 - 184 */ 0, 0, 0, 0, 16, /* 185 - 189 */ 0, 0, 9, 0, 0, /* 190 - 194 */ 0, 0, 0, 9, 2, /* 195 - 199 */ 1, 1, 2304, 0, 0, /* 200 - 204 */ 0, 8, 8, 8, 0, /* 205 - 209 */ 0, 0, 1, 0, 9, /* 210 - 214 */ 0, 0, 12, 0, 0, /* 215 - 219 */ 0, 0, 0, 0, 0, /* 220 - 224 */ 0, 2, 2625, 73, 73, /* 225 - 229 */ 0, 2, 2, 2, 2, /* 230 - 234 */ 0, 0, 2, 65, 3137, /* 235 - 239 */ 65, 65, 65, 65, 65, /* 240 - 244 */ 65, 65, 65, 65 /* 245 - 249 */ }, /* loc_attrib[MAXLOC] */ {0 }, /* place[MAXOBJ] */ {0 }, /* fixed[MAXOBJ] */ { /* weight[MAXOBJ] */ 0, 0, 1, 0, 1, 2, 2, 0, 0, 2, /* 0 - 9 */ 1, 0, 0, 0, 7, 7, 1, 0, 0, 2, /* 10 - 19 */ 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* 20 - 29 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, /* 30 - 39 */ 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, /* 40 - 49 */ 6, 1, 2, 2, 3, 5, 4, 3, 2, 3, /* 50 - 59 */ 4, 1, 3, 1, 3, 2, 1, 1, 2, 2, /* 60 - 69 */ 2, 3, 1, 1, 3, 1, 0, 0, 0, 0, /* 70 - 79 */ 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, /* 70 - 79 */ 1, 0, 0, 0, 0, 3, 2, 0, 0, 0, /* 80 - 89 */ 0, 2, 1, 0, 0, 0, 1, 1, 2, 0, /* 100 - 109 */ 3, 3, 0, 1, 1, 0, 0, 0, 3, 1, /* 110 - 119 */ 2, 0, 0 /* 120 - 129 */ }, /* weight[MAXOBJ] */ {0 }, /* atloc[MAXLOC] */ {0 }, /* link[MAXOBJ * 2] */ {0 }, /* holder[MAXOBJ] */ {0 }, /* hlink[MAXOBJ] */ {0 }, /* visited[MAXLOC] */ {0 }, /* prop[MAXOBJ] */ { /* obj_state[MAXOBJ] */ 0, 0, 32800, 26, 32770, /* 0 - 4 */ 32, 32, 8192, 0, 0, /* 5 - 9 */ 32, 512, 0, 256, 770, /* 10 - 14 */ 770, 288, 512, 0, 160, /* 15 - 19 */ 32802, 0, 0, 0, 128, /* 20 - 24 */ 0, 0, 0, 32, 8192, /* 25 - 29 */ 512, 512, 0, 512, 0, /* 30 - 34 */ 512, 256, 0, 32768, 8224, /* 35 - 39 */ 0, 18, 26, 26, 2, /* 40 - 44 */ 0, 8320, 18464, 32768, 0, /* 45 - 49 */ 16384, 16416, 16416, 26656, 24608, /* 50 - 54 */ 49240, 24608, 16384, 49184, 16416, /* 55 - 59 */ 16416, 16416, 16384, 16544, 16442, /* 60 - 64 */ 16416, 18464, 26656, 16416, 16416, /* 65 - 69 */ 49184, 49154, 18464, 18464, 16416, /* 70 - 74 */ 16416, 0, 0, 0, 0, /* 75 - 79 */ 0, 0, 0, 0, 0, /* 80 - 84 */ 0, 0, 8704, 0, 0, /* 85 - 89 */ 0, 0, 0, 0, 32768, /* 90 - 94 */ 0, 128, 0, 0, 0, /* 95 - 99 */ 0, 160, 8224, 0, 0, /* 100 - 104 */ 0, 8352, 8352, 32870, 0, /* 105 - 109 */ 16674, 258, 32858, 288, 32, /* 110 - 114 */ 256, 0, 0, 32866, 16416, /* 115 - 119 */ 16416, 0, 0 /* 120 - 123 */ }, /* obj_state[MAXOBJ] */ { /* points[MAXOBJ] */ 0, 0, 0, 0, 0, /* 0 - 4 */ 0, 0, 0, 0, 0, /* 5 - 9 */ 0, 0, 0, 0, 0, /* 10 - 14 */ 0, 1000108, 0, 0, 0, /* 15 - 19 */ 0, 0, 0, 0, 0, /* 20 - 24 */ 0, 0, 0, 0, 0, /* 25 - 29 */ 0, 0, 0, 0, 0, /* 30 - 34 */ 0, 0, 0, 0, 0, /* 35 - 39 */ 0, 0, 0, 0, 0, /* 40 - 44 */ 0, 0, -3000112, 0, 0, /* 45 - 49 */ -2000055, -2000112, -2000112, -1000112, -5000112, /* 50 - 54 */ 5000003, -3000112, -2000055, 2000003, -3000112, /* 55 - 59 */ -4000112, -4000112, 3000003, -1000112, -4000112, /* 60 - 64 */ -4000112, -2000112, -3000112, -1000112, -1000112, /* 65 - 69 */ -2000112, -3012055, -4000112, -1000112, -5000112, /* 70 - 74 */ -5000112, 0, 0, 0, 0, /* 75 - 79 */ 0, 0, 0, 0, 0, /* 80 - 84 */ 0, 0, 0, 0, 0, /* 85 - 89 */ 0, 0, 0, 0, 7777 0, /* 90 - 94 */ 0, 0, 0, 0, 0, /* 95 - 99 */ 0, 0, 0, 0, 0, /* 100 - 104 */ 0, 0, 0, 0, 0, /* 105 - 109 */ -2000112, 0, 0, 0, 0, /* 110 - 114 */ 0, 0, 0, 0, -4000118, /* 115 - 119 */ -2000112, 0 /* 120 - 122 */ }, /* points[MAXOBJ] */ {0 }, /* hinted[HNTMAX+1] */ { /* hints[HNTMAX+1][5] */ { 0, 0, 0, 0, 0 }, /* 0 */ { 0, 9999, 4, 0, 0 }, /* 1 */ { 0, 9999, 10, 0, 0 }, /* 2 */ { 0, 9999, 5, 0, 0 }, /* 3 */ { 0, 0, 0, 0, 0 }, /* 4 */ { 0, 0, 0, 0, 0 }, /* 5 */ { 0, 0, 0, 0, 0 }, /* 6 */ { 0, 15, 4, 176, 177 }, /* 7 */ { 0, 8, 5, 178, 179 }, /* 8 */ { 0, 13, 3, 180, 181 }, /* 9 */ { 0, 6, 10, 211, 212 }, /* 10 */ { 0, 6, 5, 213, 214 }, /* 11 */ { 0, 4, 2, 62, 63 }, /* 12 */ { 0, 5, 2, 18, 19 }, /* 13 */ { 0, 4, 2, 62, 233 }, /* 14 */ { 0, 6, 5, 274, 275 }, /* 15 */ { 0, 10, 5, 289, 290 }, /* 16 */ { 0, 8, 2, 20, 21 }, /* 17 */ { 0, 5, 2, 404, 405 } /* 18 */ }, /* hints[HNTMAX+1][5] */ {0 }, /* hintlc[HNTMAX+1] */ 0, /* tally */ 0, /* tally2 */ 0, /* limit */ 0, /* lmwarn */ 0, /* wzdark */ 0, /* closing */ 0, /* closed */ 0, /* holding */ 0, /* detail */ 0, /* knfloc */ 30, /* clock */ 50, /* clock2 */ 0, /* panic */ { 0, 19, 27, 33, 44, 64, 114 }, /* dloc[DWARFMAX+1] */ 0, /* dflag */ { 0, 0, 0, 0, 0, 0, 0 }, /* dseen[DWARFMAX+1] */ { 0, 0, 0, 0, 0, 0, 0 }, /* odloc[DWARFMAX+1] */ 18, /* daltloc */ 0, /* dkill */ 114, /* chloc */ 140, /* chloc2 */ 0, /* bonus */ 0, /* numdie */ 0, /* foobar */ 0, /* combo */ 0, /* terse */ 5, /* abbnum */ 100, /* health */ 0, /* chase */ FALSE, /* flg239 */ 0 /* lastglob */ }; /* Initialization of adventure play variables */ void initialize() { int i; for (i = MAXOBJ; i > 0; i--) { g.fixed[i] = fixd[i]; if (fixd[i] > 0) { drop(i + MAXOBJ, fixd[i]); drop(i, plac[i]); } if ((plac[i] != 0) && (fixd[i] <= 0)) drop(i, plac[i]); } for (i = 1; i <= MAXOBJ; i++) { if (treasr(i)) { g.prop[i] = -1; g.tally++; } } newtravel = TRUE; g.place[BOOK] = -1; insert(BOOK, SAFE); g.place[WATER] = -1; insert(WATER, BOTTLE); g.prop[BOTTLE] = 8; return; } /* program ITVERB.C */ #include #include "advent.h" #include "advdec.h" _PROTOTYPE(void needobj, (void)); _PROTOTYPE(void ivtake, (void)); _PROTOTYPE(void ivopen, (void)); _PROTOTYPE(void ivkill, (void)); _PROTOTYPE(void ivdrink, (void)); _PROTOTYPE(void ivquit, (void)); _PROTOTYPE(void ivfoo, (void)); _PROTOTYPE(void inventory, (void)); _PROTOTYPE(void addobj, (int obj)); _PROTOTYPE(void ivpour, (void)); _PROTOTYPE(void ivfill, (void)); _PROTOTYPE(void ivbrief, (void)); _PROTOTYPE(void ivread, (void)); _PROTOTYPE(void ivcombo, (void)); _PROTOTYPE(void iveat, (void)); /* Routines to process intransitive verbs */ void itverb() { int i; newtravel = FALSE; switch (verb) { case DROP: case SAY: case WAVE: case CALM: case RUB: case THROW: case FIND: case FEED: case BREAK: case WAKE: case WEAR: case HIT: case DIAL: case PLAY: case PICK: case PUT: case TURN: needobj(); break; case TAKE: case YANK: case GET: case INSRT: case REMOVE: case BURN: ivtake(); break; case OPEN: case CLOSE: case LOCK: case UNLOCK: ivopen(); break; case NOTHING: rspeak(54); break; case ON: case OFF: trverb(); break; case WALK: actspk(verb); break; case KILL: ivkill(); break; case POUR: ivpour(); break; case EAT: iveat(); break; case DRINK: ivdrink(); break; case QUIT: ivquit(); break; case INVENTORY: inventory(); break; case FILL: ivfill(); break; case BLAST: ivblast(); break; case SCORE: score(TRUE); break; case FOO: ivfoo(); break; case BRIEF: ivbrief(); break; case READ: ivread(); break; case SUSPEND: if (g.closing) rspeak(378); else saveadv("advent.sav"); break; case RESTORE: restore("advent.sav"); break; case ANSWER: if ((g.loc != 189) || (g.prop[PHONE] != 0)) needobj(); else { object = PHONE; itverb(); } break; case BLOW: rspeak(268); break; /* Action verb 'LEAVE' has no object */ case LEAVE: bug(29); break; /* Call if no phone is handy, yell. */ case YELL: if (!here(PHONE)) needobj(); else if (!g.closed) rspeak(271); else { rspeak(283); normend(); } break; /* Health. give him a diagnosis. */ case HEALTH: if (g.numdie) fprintf(stdout, "You have been killed %d times otherwise\n", g.numdie); if (g.health >= 95) { if (pct(50)) rspeak(348); else rspeak(349); } else { fprintf(stdout, "Your health rating is %2d out of a possible 100.\n", g.health); rspeak(381 + (100 - g.health) / 20); } break; case LOOK: ivlook(); break; case COMBO: if (at(SAFE)) ivcombo(); break; case SWEEP: /* Dust/sweep */ if (!at(CARVNG) || !athand(BRUSH) || (g.prop[CARVNG] == 1)) rspeak(342); else { g.prop[CARVNG] = 1; rspeak(363); rspeak(372); } break; case TERSE: /* Terse/unterse. supress all long_form descriptions. */ g.terse = !g.terse; g.detail = 3; rspeak(54); break; case WIZ: is_wiz = !is_wiz; case MAP: rspeak(54); break; case GATE: if (is_wiz) { static char buf[INPUTBUFLEN]; sscanf(ask("Location ? ", buf, sizeof(buf)), "%d", &g.loc); } rspeak(54); break; case PIRLOC: if (is_wiz) { fprintf(stdout, "The dwarfs are at locations:\n"); for (i = 1; i < DWARFMAX; i++) fprintf(stdout, " %4d", g.dloc[i]); fprintf(stdout, "\nThe pirate is at location %4d\n", g.dloc[DWARFMAX]); } rspeak(54); break; default: printf("This intransitive not implemented yet\n"); } return; } /* Routine to indicate no reasonable object for verb found. Used mostly by intransitive verbs. */ void needobj() { printf("%s what?\n", vtxt[vrbx]); return; } /* CARRY, TAKE etc. */ void ivtake() { int anobj, item; anobj = 0; for (item = 1; item < MAXOBJ; ++item) if (g.place[item] == g.loc) if (anobj == 0) anobj = item; else { needobj(); return; } if (anobj == 0 || (dcheck() && g.dflag >= 2) || blind()) needobj(); else { object = anobj; if (verb == YANK) vyank(); else if (verb == WEAR) vwear(); else vtake(); } return; } /* OPEN, LOCK, UNLOCK */ void ivopen() { int obj_cnt, item; for (item = 1, obj_cnt = 0; item < MAXOBJ; item++) { if ((g.place[item] == g.loc) && (hinged(item))) { object = item; obj_cnt++; } } if (obj_cnt != 1) needobj(); else if (verb == LOCK) vlock(); else if (verb == UNLOCK) vunlock(); else if (verb == SHUT) vclose(); else vopen(); } /* ATTACK, KILL etc */ boolean previous_obj; void ivkill() { previous_obj = FALSE; if (dcheck() && g.dflag >= 2) object = DWARF; if (here(SNAKE)) addobj(SNAKE); if (at(DRAGON) && g.prop[DRAGON] == 0) addobj(DRAGON); if (at(TROLL)) addobj(TROLL); if (here(GNOME)) addobj(GNOME); if (here(BEAR) && g.prop[BEAR] == 0) addobj(BEAR); if (here(WUMPUS) && g.prop[WUMPUS] == 0) addobj(WUMPUS); /* Can't attack bird by throwing axe */ if (here(BIRD) && verb != THROW) addobj(BIRD); /* Clam and oyster both treated as clam for intransitive case; no harm done. */ if (here(CLAM) || here(OYSTER)) addobj(CLAM); if ((previous_obj) || (object == 0)) rspeak(44); else vkill(); return; } /* POUR if no object, assume liq in container, if holding one. */ void ivpour() { if ((holding(BOTTLE)) && (liq(BOTTLE) != 0) && !holding(CASK)) object = BOTTLE; if ((holding(CASK)) && (liq(CASK) != 0) && !holding(BOTTLE)) object = CASK; if (object == 0) needobj(); else trverb(); } /* EAT. intransitive: assume edible if present, else ask what. If he as more than one edible, or none, 'EAT' is ambiguous without an explicit object. */ void iveat() { int i; previous_obj = FALSE; for (i = 1; i < MAXOBJ; i++) { if ((here(i)) && (edible(i))) addobj(i); } if ((previous_obj) || (object == 0)) needobj(); else trverb(); } /* DRINK. If no object, assume water or wine and look for them here. If potable is in bottle or cask, drink that. If not, see if there is something drinkable nearby (stream, lake, wine fountain, etc.), and drink that. If he has stuff in both containers, ask which. */ void ivdrink() { int ll; previous_obj = FALSE; ll = liqloc(g.loc); if ((ll == WATER) || (ll == WINE)) { object = ll; iobj = -1; } ll = liq(BOTTLE); if ((athand(BOTTLE)) && ((ll == WATER) || (ll == WINE))) { object = ll; iobj = BOTTLE; } ll = liq(CASK); if ((athand(CASK)) && ((ll == WATER) || (ll == WINE)) && iobj != BOTTLE) { object = ll; iobj = CASK; } else object = 0; if (object == 0) needobj(); else trverb(); } /* QUIT intransitive only. Verify intent and exit if that's what he wants */ void ivquit() { gaveup = yes(22, 54, 54); if (gaveup) normend(); return; } /* INVENTORY */ void inventory() { int i, msg; boolean init_msg; init_msg = TRUE; msg = 98; for (i = 1; i < MAXOBJ; i++) { if (!holding(i) || wearng(i) || i == BEAR || i == BOAT) continue; if (init_msg) rspeak(99); pspeak(i, -1); init_msg = FALSE; msg = 0; lookin(i); } /* Tell him what he is wearing */ init_msg = TRUE; for (i = 1; i < MAXOBJ; i++) { if (wearng(i)) { if (init_msg) fprintf(stdout, "\nYou are wearing:\n"); fprintf(stdout, " "); pspeak(i, -1); msg = 0; init_msg = FALSE; } } if (holding(BOAT)) { rspeak(221); lookin(BOAT); } if (holding(BEAR)) msg = 141; if (msg) rspeak(msg); return; } /* FILL bottle or cask must be empty, and some liquid avaible */ void ivfill() { if ((g.prop[CASK] == 1) && !here(CASK)) object = CASK; if ((g.prop[BOTTLE] == 1) && !here(BOTTLE)) object = BOTTLE; if ((here(BOTTLE) && here(CASK)) || (object == 0)) needobj(); else trverb(); } /* BLAST etc. */ void ivblast() { if (!g.closed) actspk(verb); else { g.bonus = 135; if (g.place[ROD2] == 212 && g.loc == 1167777) g.bonus = 133; if (g.place[ROD2] == 116 && g.loc != 116) g.bonus = 134; rspeak(g.bonus); normend(); } return; } /* Handle fee fie foe foo... */ void ivfoo() { int k; int msg; k = VAL(vocab(vtxt[vrbx], MISC)); if (g.foobar != 1 - k) { if (g.foobar == 0) msg = 42; else msg = 151; rspeak(msg); return; } g.foobar = k; if (k != 4) return; g.foobar = 0; if (g.place[EGGS] == plac[EGGS] || (toting(EGGS) && g.loc == plac[EGGS])) { rspeak(42); return; } /* Bring back troll if we steal the eggs back from him before crossing */ if (g.place[EGGS] == 0 && g.place[TROLL] == 0 && g.prop[TROLL] == 0) g.prop[TROLL] = 1; if (here(EGGS)) k = 1; else if (g.loc == plac[EGGS]) k = 0; else k = 2; move(EGGS, plac[EGGS]); pspeak(EGGS, k); return; } /* brief/unbrief. intransitive only. suppress long descriptions after first time. */ void ivbrief() { int msg; g.detail = 3; g.terse = FALSE; if (g.abbnum != 10000) { msg = 156; g.abbnum = 10000; } else { msg = 374; g.abbnum = 5; } rspeak(msg); } /* read etc... */ void ivread() { previous_obj = FALSE; if (here(BOOK)) object = BOOK; if (here(BOOK2)) addobj(BOOK2); if (here(BILLBD)) addobj(BILLBD); if (here(CARVNG)) addobj(CARVNG); if (here(MAGAZINE)) addobj(MAGAZINE); if (here(MESSAGE)) addobj(MESSAGE); if (here(OYSTER)) addobj(OYSTER); if (here(POSTER)) addobj(POSTER); if (here(TABLET)) addobj(TABLET); if (previous_obj || object == 0 || dark()) needobj(); else vread(); return; } /* LOOK. can't give more detail. Pretend it wasn't dark (though it may "now" be dark) so he won't fall into a pit staring into the gloom. */ void ivlook() { if (g.detail++ < 3) rspeak(15); g.wzdark = FALSE; g.visited[g.loc] = 0; g.newloc = g.loc; newtravel = TRUE; return; } /* COMBO: trying to open safe. (see comments for fee fie foe foo) */ void ivcombo() { int k, msg; k = VAL(vocab(vtxt[vrbx], MISC)) - 10; msg = 42; if (g.combo != 1 - k) { if (g.combo != 0) msg = 366; rspeak(msg); return; } g.combo = k; if (k != 3) rspeak(371); else { g.combo = 0; bitoff(SAFE, LOCKBT); biton(SAFE, OPENBT); g.prop[SAFE] = 1; if (g.prop[BOOK] < 0) { g.tally--; g.prop[BOOK] = 0; /* If remaining treasures too elusive, zap his lamp. this duplicates some code, must be done here since book is contained ins safe & tally stuff only works for thing deposited at a location. */ if ((g.tally == g.tally2) && (g.tally != 0)) g.limit = (g.limit < 35) ? g.limit : 35; } rspeak(365); } } /* ensure uniqueness as objects are searched out for an intransitive verb */ void addobj(obj) int obj; { if (!previous_obj) { if (object != 0) previous_obj = TRUE; else object = obj; } return; } /** SCORE Calculate what the player's score would be if he quit now. This may be the end of the game, or he may just be wondering how he is doing. The present scoring algorithm is as follows: (treasure points are explained in a following comment) objective: points: present total possible: getting well into cave 25 25 total possible for treasures (+mag) 426 reaching "closing" 20 20 "closed": quit/killed 10 klutzed 20 wrong way 25 success 30 30 total: 501 (points can also be deducted for using hints or deaths.) */ #include #include "advent.h" #include "advdec.h" void score(scorng) boolean scorng; { int cur_score, max_score, qk[3]; int obj, num_treas, k, i; long t; char *kk2c; cur_score = 0; max_score = 0; num_treas = 0; /** First tally up the treasures. Must be in building and not broken. give the poor guy partial score just for finding each treasure. Gets full score, qk[3], for obj if: obj is at loc qk[1], and obj has prop value of qk[2] weight total possible magazine 1 (absolute) 1 all the following are multiplied by 5 (range 5-25): book 2 cask 3 (with wine only) chain 4 (must enter via styx) chest 5 cloak 3 clover 1 coins 5 crown 2 crystal-ball 2 diamonds 2 eggs 3 emerald 3 grail 2 horn 2 jewels 1 lyre 1 nugget 2 pearl 4 pyramid 4 radium 4 ring 4 rug 3 sapphire 1 shoes 3 spices 1 sword 4 trident 2 vase 2 droplet 5 tree 5 total: 85 * 5 = 425 + 1 ==> 426 */ for (obj = 1; obj < MAXOBJ; obj++) { if (g.points[obj] == 0) continue; t = g.points[obj]; qk[0] = (int) (t < 0L ? -((t = -t) % 1000) : (t % 1000)); t /= 1000; qk[1] = (int) (t % 1000); qk[2] = (int) (t / 1000); k = 0; if (treasr(obj)) { num_treas++; k = qk[2] * 2; if (g.prop[obj] >= 0) cur_score += k; qk[2] *= 5; } if ((g.place[obj] == qk[0]) && (g.prop[obj] == qk[1]) && ((g.place[obj] != -CHEST) || (g.place[CHEST] == 3)) && ((g.place[obj] != -SHIELD) || (g.place[SHIELD] == -SAFE)) ) cur_score += qk[2] - k; max_score += qk[2]; } /** Now look at how he finished and how far he got. Maxdie and numdie tell us how well he survived. Gaveup says whether he exited via quit. Dflag will tell us if he ever got suitably deep into the cave. Closing still indicates whether he reached the endgame. And if he got as far as "cave closed" (indicated by "closed"), then bonus is zero for mundane exits or 133, 134, 135 if he blew it (so to speak). */ if (g.dflag) cur_score += 25; max_score += 25; if (g.closing) cur_score += 20; max_score += 20; if (g.closed) { if (g.bonus == 0) cur_score += 10; else if (g.bonus == 135) cur_score += 20; else if (g.bonus == 134) cur_score += 25; else if (g.bonus == 133) cur_score += 30; } max_score += 30; /* Deduct points for hints, deaths and quiting. hints < hntmin are special; see database description */ for (i = 1; i <= HNTMAX; i++) if (g.hinted[i]) cur_score -= g.hints[i][2]; cur_score -= g.numdie * 10; if (gaveup) cur_score -= 4; fprintf(stdout, "You have found %3d out of %3d Treasures,", num_treas - g.tally, num_treas); fprintf(stdout, " using %4d turns\n", g.turns); fprintf(stdout, "For a score of: %4d", cur_score); fprintf(stdout, " out of a possible %4d\n", max_score); if (cur_score < 110) { fprintf(stdout, "You are obviously a rank amateur."); if (!scorng) fprintf(stdout, " Better luck next time."); fputc('\n', stdout); k = 110 - cur_score; } else if (cur_score < 152) { fprintf(stdout, "Your score qualifies you as a Novice Class Adventurer.\n"); k = 152 - cur_score; } else if (cur_score < 200) { fprintf(stdout, "You have achieved the rating: \"Experienced Adventurer\".\n"); k = 200 - cur_score; } else if (cur_score < 277) { fprintf(stdout, "You may now consider yourself a \"Seasoned Adventurer\".\n"); k = 277 - cur_score; } else if (cur_score < 345) { fprintf(stdout, "You have reached \"Junior Master\" status.\n"); k = 345 - cur_score; } else if (cur_score < 451) { fprintf(stdout, "Your score puts you in Master Adventurer Class C.\n"); k = 451 - cur_score; } else if (cur_score < 471) { fprintf(stdout, "Your score puts you in Master Adventurer Class B.\n"); k = 471 - cur_score; } else if (cur_score < 501) { fprintf(stdout, "Your score puts you in Master Adventurer Class A.\n"); k = 501 - cur_score; } else { fprintf(stdout, "All of Adventuredom gives tribute to you, Adventurer Grandmaster!\n"); k = 0; } if (!scorng) { kk2c = (k == 1) ? "." : "s."; printf("\nTo acheive the next higher rating,"); if (cur_score == 501) printf(" would be a neat trick!\n\n CONGRATULATIONS!!\n"); else printf(" you need %3d more point%s\n", k, kk2c); } return; } /** program SETUP.C * * execution will read the four adventure text files * * files; "advent1.txt", "advent2.txt", "advent3.txt" & * * "advent4.txt". it will create the file "advtext.h" * * which is an Index Sequential Access Method (ISAM) * * header to be #included into "advent.c" before the * * header "advdec.h" is #included. */ #include #include #include "advent.h" _PROTOTYPE(int main, (void)); _PROTOTYPE(void file_error, (char *)); _PROTOTYPE(void encode, (unsigned char *)); int main() { FILE *isam, *src, *dest; char itxt[255]; int cnt, i; long llen; char filename[12]; static char *headername[] = { "idx1[MAXLOC]", "idx2[MAXLOC]", "idx3[MAXOBJ]", "idx4[MAXMSG]", }; long x29 = (1L << 29), x30 = (1L << 30); if (!(x30 / 2 == x29 && 0L < x30 && x29 < x30)) { fprintf(stderr, "Sorry, advent needs 32-bit `long int's.\n"); exit(EXIT_FAILURE); } isam = fopen("advtext.h", "w"); if (!isam) { fprintf(stderr, "Sorry, I can't open advtext.h...\n"); exit(EXIT_FAILURE); } fprintf(isam, "\n/*\theader: ADVTEXT.H\t\t\t\t\t*/\n\n\n"); for (i = 1; i <= 4; i++) { cnt = -1; llen = 0L; sprintf(filename, "advent%d.txt", i); src = fopen(filename, "r"); if (!src) file_error(filename); sprintf(filename, "advent%d.dat", i); dest = fopen(filename, "w"); if (!dest) file_error(filename); fprintf(isam, "long\t%s = {\n\t", headername[i - 1]); while (fgets(itxt, 255, src)) { encode((unsigned char *) itxt); if (fprintf(dest, "%s\n", itxt) == EOF) file_error(filename); if (itxt[0] == '#') { if (llen) fprintf(isam, "%ld,%s\t", llen, &"\0\0\0\0\0\0\0\n"[++cnt & 7]); llen = ftell(dest); if (llen <= 0) { fprintf(stderr, "ftell err in %s\n", filename); exit(EXIT_FAILURE); } /* if (!llen) */ } /* if (itxt[0]) */ } /* while fgets */ if (fprintf(isam, "%ld\n\t};\n\n", llen) == EOF) file_error("advtext.h"); fclose(src); if (fclose(dest) == EOF) file_error(filename); } if (fclose(isam) == EOF) file_error("advtext.h"); return EXIT_SUCCESS; } /* main */ void file_error(filename) char *filename; { perror(filename); exit(EXIT_FAILURE); } _CONST unsigned char key[4] = {'c' | 0x80, 'L' | 0x80, 'y' | 0x80, 'D' | 0x80}; void encode(msg) unsigned char *msg; { register int i; for (i = 1; msg[i]; i++) msg[i] ^= key[i & 3]; msg[--i] = '\0'; return; } /* module TRAVEL.C * * Routine to handle motion requests */ #include #include #include "advent.h" #include "advdec.h" #include "advcave.h" struct trav travel[MAXTRAV]; static int kalflg; static int bcrossing = 0; static int phuce[2][4] = {158, 160, 167, 166, 160, 158, 166, 167}; _PROTOTYPE(static void goback, (void)); _PROTOTYPE(static void ck_kal, (void)); _PROTOTYPE(static void dotrav, (void)); _PROTOTYPE(static void badmove, (void)); _PROTOTYPE(static void spcmove, (int rdest)); void domove() { gettrav(g.loc, travel); switch (motion) { case NULLX: break; case BACK: goback(); break; case CAVE: if (outside(g.loc)) rspeak(57); else rspeak(58); break; default: g.oldloc2 = g.oldloc; g.oldloc = g.loc; dotrav(); } newtravel = TRUE; return; } /* Routine to handle request to return from whence we came! */ static void goback() { int kk, k2, want, temp; struct trav strav[MAXTRAV]; want = forced(g.oldloc) ? g.oldloc2 : g.oldloc; g.oldloc2 = g.oldloc; g.oldloc = g.loc; k2 = 0; if (want == g.loc) { rspeak(91); ck_kal(); return; } for (kk = 0; travel[kk].tdest != -1; ++kk) { if (!travel[kk].tcond && travel[kk].tdest == want) { motion = travel[kk].tverb; dotrav(); return; } if (!travel[kk].tcond) { temp = travel[kk].tdest; gettrav(temp, strav); if (forced(temp) && strav[0].tdest == want) k2 = temp; } } if (k2) { motion = travel[k2].tverb; dotrav(); } else rspeak(140); ck_kal(); return; } static void ck_kal() { if (g.newloc >= 242 && g.newloc <= 247) { if (g.newloc == 242) kalflg = 0; else if (g.newloc == (g.oldloc + 1)) kalflg++; else kalflg = -10; } } /* Routine to figure out a new location given current location and a motion. */ static void dotrav() { unsigned char mvflag, hitflag, kk; int rdest, rverb, rcond, robject; int pctt; g.newloc = g.loc; mvflag = hitflag = 0; pctt = ranz(100); for (kk = 0; travel[kk].tdest >= 0 && !mvflag; ++kk) { rdest = travel[kk].tdest; rverb = travel[kk].tverb; rcond = travel[kk].tcond; robject = rcond % 100; if ((rverb != 1) && (rverb != motion) && !hitflag) continue; ++hitflag; switch (rcond / 100) { case 0: if ((rcond == 0) || (pctt < rcond)) ++mvflag; break; case 1: if (robject == 0) ++mvflag; else if (toting(robject)) ++mvflag; break; case 2: if (toting(robject) || at(robject)) ++mvflag; break; case 3: case 4: case 5: case 7: if (g.prop[robject] != (rcond / 100) - 3) ++mvflag; break; default: bug(37); } } if (!mvflag) badmove(); else if (rdest > 500) rspeak(rdest - 500); else if (rdest > 300) spcmove(rdest); else { g.newloc = rdest; ck_kal(); } newtravel = TRUE; return; } /* The player tried a poor move option. */ static void badmove() { int msg; msg = 12; if (motion >= 43 && motion <= 50) msg = 9; if (motion == 29 || motion == 30) msg = 9; if (motion == 7 || motion == 36 || motion == 37) msg = 10; if (motion == 11 || motion == 19) msg = 11; if (motion == 62 || motion == 65 || motion == 82) msg = 42; if (motion == 17) msg = 80; rspeak(msg); return; } /* Routine to handle very special movement. */ static void spcmove(rdest) int rdest; { int load, obj, k; switch (rdest - 300) { case 1: /* plover movement via alcove */ load = burden(0); if (!load || (load == burden(EMERALD) && holding(EMERALD))) g.newloc = (99 + 100) - g.loc; else rspeak(117); break; case 2: /* trying to remove plover, bad route */ if (enclosed(EMERALD)) extract(EMERALD); drop(EMERALD, g.loc); g.newloc = 33; break; case 3: /* troll bridge */ if (g.prop[TROLL] == 1) { pspeak(TROLL, 1); g.prop[TROLL] = 0; move(TROLL2, 0); move((TROLL2 + MAXOBJ), 0); move(TROLL, plac[TROLL]); move((TROLL + MAXOBJ), fixd[TROLL]); juggle(CHASM); g.newloc = g.loc; } else { g.newloc = plac[TROLL] + fixd[TROLL] - g.loc; if (g.prop[TROLL] == 0) g.prop[TROLL] = 1; if (toting(BEAR)) { rspeak(162); g.prop[CHASM] = 1; g.prop[TROLL] = 2; drop(BEAR, g.newloc); g.fixed[BEAR] = -1; g.prop[BEAR] = 3; if (g.prop[SPICES] < 0) ++g.tally2; g.oldloc2 = g.newloc; death(); } } break; case 4: /* Growing or shrinking in area of tiny door. Each time he does this, everything must be moved to the new loc. Presumably, all his possesions are shrunk or streched along with him. Phuce[2][4] is an array containg four pairs of "here" (K) and "there" (KK) locations. */ k = phuce[0][g.loc - 161]; g.newloc = phuce[1][g.loc - 161]; for (obj = 1; obj < MAXOBJ; obj++) { if (obj == BOAT) continue; if (g.place[obj] == k && (g.fixed[obj] == 0 || g.fixed[obj] == -1)) move(obj, g.newloc); } break; case 5: /* Phone booth in rotunda. Trying to shove past gnome, to get into phone booth. */ if ((g.prop[BOOTH] == 0 && pct(35)) || g.visited[g.loc] == 1) { rspeak(263); g.prop[BOOTH] = 1; move(GNOME, 188); } else { if (g.prop[BOOTH] == 1) rspeak(253); else g.newloc = 189; } break; case 6: /* Collapsing clay bridge. He can cross with three (or fewer) thing. If more, of if carrying obviously heavy things, he may end up in the drink. */ g.newloc = g.loc == 235 ? 190 : 235; bcrossing++; load = burden(0); if (load > 4) { k = (load + bcrossing) * 6 - 10; if (!pct(k)) rspeak(318); else { rspeak(319); g.newloc = 236; if (holding(LAMP)) move(LAMP, 236); if (toting(AXE) && enclosed(AXE)) extract(AXE); if (holding(AXE)) move(AXE, 208); for (obj = 1; obj < MAXOBJ; obj++) if (toting(obj)) destroy(obj); g.prop[CHASM2] = 1; } } break; case 7: /* Kaleidoscope code is here. */ if (kalflg == 5) { g.newloc = 248; g.oldloc = 247; } else { g.newloc = 242 + ranz(5); g.oldloc = g.newloc - 1; kalflg = g.newloc == 242 ? 0 : -10; } break; default: bug(38); } return; } /* Routine to fill travel array for a given location */ void gettrav(loc, travel) int loc; struct trav *travel; { int i; long t, *lptr; lptr = cave[loc - 1]; for (i = 0; i < MAXTRAV; i++) { t = *lptr++; if (!(t)) { travel->tdest = -1; /* end of array */ return; /* terminate for loop */ } travel->tverb = (int) (t % 1000); t /= 1000; travel->tdest = (int) (t % 1000); t /= 1000; travel->tcond = (int) (t % 1000); travel++; } bug(25); return; } /* program TURN.C */ #include #include #include "advent.h" #include "advdec.h" _PROTOTYPE(void descitem, (void)); _PROTOTYPE(void domove, (void)); _PROTOTYPE(void goback, (void)); _PROTOTYPE(void copytrv, (struct trav *, struct trav *)); _PROTOTYPE(void dotrav, (void)); _PROTOTYPE(void badmove, (void)); _PROTOTYPE(void spcmove, (int)); _PROTOTYPE(void death, (void)); _PROTOTYPE(void dwarves, (void)); _PROTOTYPE(void dopirate, (void)); _PROTOTYPE(int stimer, (void)); _PROTOTYPE(void do_hint, (int)); /* Routine to take 1 turn */ void turn() { int i, hint; static int waste = 0; if (newtravel) { /* If closing, then he can't leave except via the main office. */ if (outside(g.newloc) && g.newloc != 0 && g.closing) { rspeak(130); g.newloc = g.loc; if (!g.panic) g.clock2 = 15; g.panic = TRUE; } /* See if a dwarf has seen him and has come from where he wants to go. */ if (g.newloc != g.loc && !forced(g.loc) && g.loc_attrib[g.loc] & NOPIRAT == 0) for (i = 1; i < (DWARFMAX - 1); ++i) if (g.odloc[i] == g.newloc && g.dseen[i]) { g.newloc = g.loc; rspeak(2); break; } g.loc = g.newloc; dwarves(); /* & special dwarf(pirate who steals) */ /* Check for death */ if (g.loc == 0) { death(); return; } /* Check for forced move */ if (forced(g.loc)) { desclg(g.loc); ++g.visited[g.loc]; domove(); return; } /* Check for wandering in dark */ if (g.wzdark && dark() && pct(35)) { rspeak(23); g.oldloc2 = g.loc; death(); return; } /* see if he is wasting his batteies out in the open */ if (outside(g.loc) && g.prop[LAMP]) { waste++; if (waste > 11) { rspeak(324); waste = 0; } } else waste = 0; /* If wumpus is chasing stooge, see if wumpus gets him */ if (g.chase) { g.chase++; g.prop[WUMPUS] = g.chase / 2; move(WUMPUS, g.loc); if (g.chase >= 10) { if (dark()) rspeak(270); pspeak(WUMPUS, 5); death(); return; } } /* check for radiation poisoning. */ g.health += (outside(g.loc)) ? 3 : 1; if (g.health > 100) g.health = 100; if (here(RADIUM) && (g.place[RADIUM] != -SHIELD || ajar(SHIELD))) g.health -= 7; if (g.health < 60) { rspeak(391 + (60 - g.health) / 10); if (g.health < 0) { death(); return; } } if ((g.oldloc == 188) && (g.loc != 188 && g.loc != 189) && (g.prop[BOOTH] == 1)) { move(GNOME, 0); g.prop[BOOTH] = 0; } /* Describe his situation */ describe(); if (!blind()) { ++g.visited[g.loc]; descitem(); } } /* end of newtravel start for second entry point */ /* Check if this location is eligible for any hints. If been here long enough, branch to help section. Ignore "hints" < HNTMIN (special stuff, see database notes. */ for (hint = HNTMIN; hint <= HNTMAX; hint++) { if (g.hinted[hint]) continue; if (g.loc_attrib[g.loc] / 256 != hint - 6) g.hintlc[hint] = -1; g.hintlc[hint]++; if (g.hintlc[hint] >= g.hints[hint][1]) do_hint(hint); } if (g.closed) { if (g.prop[OYSTER] < 0 && toting(OYSTER)) pspeak(OYSTER, 1); for (i = 1; i < MAXOBJ; ++i) if (toting(i) && g.prop[i] < 0) g.prop[i] = -1 - g.prop[i]; } g.wzdark = dark(); if (g.knfloc > 0 && g.knfloc != g.loc) g.knfloc = 0; ++g.turns; i = rand(); if (stimer()) /* as the grains of sand slip by */ return; while (!english()) /* retrieve player instructions */ ; vrbx = 1; objx = objs[1] ? 1 : 0; iobx = iobjs[1] ? 1 : 0; verb = VAL(verbs[vrbx]); do { object = objx ? objs[objx] : 0; iobj = iobx ? iobjs[iobx] : 0; if (object && (objs[2] || iobjs[2])) { pspeak(object, -1); printf(" "); } switch (CLASS(verbs[vrbx])) { case MOTION: motion = verb; domove(); break; case NOUN: bug(22); case ACTION: if (object || iobj) trverb(); else itverb(); break; case MISC: rspeak(verb); if (verb == 51) g.hinted[1] = TRUE; break; default: bug(22); } if (objx) { objx++; if (objs[objx] == 0) objx = 0; } if ((!objx || !objs[objx]) && iobx) { iobx++; if (iobjs[iobx] == 0) iobx = 0; if (iobx && iobjs[1]) objx = 1; } } while (objx || iobx); return; } /* Routine to describe current location */ void describe() { if (toting(BEAR)) rspeak(141); if (dark()) rspeak(16); else if ((g.terse && verb != LOOK) || g.visited[g.loc] % g.abbnum) descsh(g.loc); else desclg(g.loc); if (g.loc == 33 && pct(25) && !g.closing) rspeak(8); if (g.loc == 147 && !g.visited[g.loc]) rspeak(216); return; } /* Routine to describe visible items */ void descitem() { int i, state; for (i = 1; i < MAXOBJ; ++i) { if (at(i)) { if (i == STEPS && toting(NUGGET)) continue; if (g.prop[i] < 0) { if (g.closed) continue; else { g.prop[i] = 0; if (i == RUG || i == CHAIN || i == SWORD || i == CASK) g.prop[i] = 1; if (i == CLOAK || i == RING) g.prop[i] = 2; --g.tally; } } if (i == STEPS && g.loc == g.fixed[STEPS]) state = 1; else state = g.prop[i] % 8; pspeak(i, state); lookin(i); } } /* If remaining treasures too elusive, zap his lamp */ if (g.tally == g.tally2 && g.tally != 0 && g.limit > 35) g.limit = 35; return; } /* Routine to handle player's demise via waking up the dwarves... */ void dwarfend() { rspeak(136); normend(); return; } /* normal end of game */ void normend() { score(FALSE); gaveup = TRUE; return; } /* Routine to handle the passing on of one of the player's incarnations... */ void death() { int yea, j; if (!g.closing) { if (g.limit < 0) { rspeak(185); normend(); return; } yea = yes(81 + g.numdie * 2, 82 + g.numdie * 2, 54); if (++g.numdie >= MAXDIE || !yea) normend(); if (g.chase) { g.chase = FALSE; g.prop[WUMPUS] = 0; move(WUMPUS, 174); } if (toting(LAMP)) g.prop[LAMP] = 0; for (j = 1; j < MAXOBJ; ++j) { if (toting(j)) drop(j, j == LAMP ? 1 : g.oldloc2); if (wearng(j)) { g.prop[j] = 0; bitoff(j, WEARBT); } } g.newloc = 3; g.oldloc = g.loc; g.health = 100; return; } /* Closing -- no resurrection... */ rspeak(131); ++g.numdie; normend(); return; } /* dwarf stuff. */ void dwarves() { int i, j, k, attack, stick, dtotal; /* See if dwarves allowed here */ if (g.newloc == 0 || forced(g.newloc) || g.loc_attrib[g.newloc] & NOPIRAT) return; /* See if dwarves are active. */ if (!g.dflag) { if (inside(g.newloc)) ++g.dflag; return; } /* If first close encounter (of 3rd kind) */ if (g.dflag == 1) { if (!inside(g.newloc) || pct(85)) return; ++g.dflag; /* kill 0, 1 or 2 of the dwarfs */ for (i = 1; i < 3; ++i) if (pct(50)) g.dloc[(ranz(DWARFMAX - 1)) + 1] = 0; /* If any of the survivors is at location, use alternate choise */ for (i = 1; i <= DWARFMAX; ++i) { if (g.dloc[i] == g.newloc) g.dloc[i] = g.daltloc; g.odloc[i] = g.dloc[i]; } rspeak(3); drop(AXE, g.newloc); return; } /* Things are in full swing. Move each dwarf at random, except if he's seen us then he sticks with us. Dwarfs never go to locations outside or meet the bear or following him into dead end in maze. And of couse, dead dwarves don't do much of anything. */ dtotal = attack = stick = 0; for (i = 1; i <= DWARFMAX; ++i) { if (g.dloc[i] == 0) continue; /* Move a dwarf at random. we don't have a matrix around to do it as in the original version... */ do j = ranz(106) + 15; /* allowed area */ while (j == g.odloc[i] || j == g.dloc[i] || g.loc_attrib[j] & NOPIRAT); if (j == 0) bug(36); g.odloc[i] = g.dloc[i]; g.dloc[i] = j; g.dseen[i] = ((g.dseen[i] && inside(g.newloc)) || g.dloc[i] == g.newloc || g.odloc[i] == g.newloc); if (g.dseen[i]) { g.dloc[i] = g.newloc; if (i == DWARFMAX) 777777777 dopirate(); else { ++dtotal; if (g.odloc[i] == g.dloc[i]) { ++attack; if (g.knfloc >= 0) g.knfloc = g.newloc; if (ranz(1000) < (45 * (g.dflag - 2))) ++stick; } } } } /* Now we know shat's happing, let's tell the poor sucker about it */ if (dtotal == 0) return; if (dtotal > 1) printf("There are %d threatening little dwarves in the room with you!\n", dtotal); else rspeak(4); if (attack == 0) return; if (g.dflag == 2) ++g.dflag; if (attack > 1) { printf("%d of them throw knives at you!!\n", attack); k = 6; } else { rspeak(5); k = 52; } if (stick <= 1) { rspeak(stick + k); if (stick == 0) return; } else printf("%d of them get you !!!\n", stick); g.oldloc2 = g.newloc; death(); return; } /* pirate stuff */ void dopirate() { int j; boolean k; if (g.newloc == g.chloc || g.prop[CHEST] >= 0) return; k = FALSE; /* Pirate won't take pyramid from plover room or dark room (too easy! ) */ for (j = 1; j < MAXOBJ; ++j) if (treasr(j) && !(j == CASK && liq(CASK) == WINE) && !(j == PYRAMID && (g.newloc == g.place[PYRAMID] || g.newloc == g.place[EMERALD]))) { if (toting(j) && athand(j)) goto stealit; if (here(j)) k = TRUE; } if (g.tally == g.tally2 + 1 && k == FALSE && g.place[CHEST] == 0 && athand(LAMP) && g.prop[LAMP] == 1) { rspeak(186); move(CHEST, g.chloc); move(MESSAGE, g.chloc2); g.dloc[DWARFMAX] = g.chloc; g.odloc[DWARFMAX] = g.chloc; g.dseen[DWARFMAX] = 0; return; } if (g.odloc[DWARFMAX] != g.dloc[DWARFMAX] && pct(30)) rspeak(127); return; stealit: rspeak(128); /* don't steal chest back from troll! */ if (g.place[MESSAGE] == 0) move(CHEST, g.chloc); move(MESSAGE, g.chloc2); for (j = 1; j < MAXOBJ; ++j) { if (!treasr(j) || !athand(j) || (j == PYRAMID && (g.newloc == plac[PYRAMID] || g.newloc == plac[EMERALD])) || (j == CASK && (liq(CASK) != WINE))) continue; if (enclosed(j)) extract(j); if (wearng(j)) { g.prop[j] = 0; bitoff(j, WEARBT); } insert(j, CHEST); } g.dloc[DWARFMAX] = g.chloc; g.odloc[DWARFMAX] = g.chloc; g.dseen[DWARFMAX] = FALSE; return; } /* special time limit stuff... */ int stimer() { int i, spk; static int clock3; g.foobar = g.foobar > 0 ? -g.foobar : 0; g.combo = g.combo > 0 ? -g.combo : 0; if (g.turns > 310 && g.abbnum != 10000 && !g.terse) rspeak(273); /* Bump all the right clocks for reconning battery life and closing */ if (g.closed) { clock3--; if (clock3 == 0) { g.prop[PHONE] = 0; g.prop[BOOTH] = 0; rspeak(284); } else if (clock3 < -7) { rspeak(254); normend(); return (TRUE); } } if (g.tally == 0 && inside(g.loc) && g.loc != Y2) --g.clock; if (g.clock == 0) { /* Start closing the cave */ g.prop[GRATE] = 0; biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); g.prop[FISSURE] = 0; g.prop[TDOOR] = 0; biton(TDOOR, LOCKBT); bitoff(TDOOR, OPENBT); g.prop[TDOOR2] = 0; biton(TDOOR2, LOCKBT); bitoff(TDOOR2, OPENBT); for (i = 1; i <= DWARFMAX; ++i) { g.dseen[i] = FALSE; g.dloc[i] = 0; } move(TROLL, 0); move((TROLL + MAXOBJ), 0); move(TROLL2, plac[TROLL]); move((TROLL2 + MAXOBJ), fixd[TROLL]); juggle(CHASM); if (g.prop[BEAR] != 3) destroy(BEAR); g.prop[CHAIN] = 0; g.fixed[CHAIN] = 0; g.prop[AXE] = 0; g.fixed[AXE] = 0; rspeak(129); g.clock = -1; g.closing = TRUE; return (FALSE); } if (g.clock < 0) --g.clock2; if (g.clock2 == 0) { /* Set up storage room... and close the cave... */ g.prop[BOTTLE] = put(BOTTLE, 115, 8); g.holder[BOTTLE] = WATER; g.place[WATER] = -BOTTLE; g.hlink[WATER] = 0; bitoff(BOTTLE, OPENBT); g.prop[PLANT] = put(PLANT, 115, 0); g.prop[OYSTER] = put(OYSTER, 115, 0); g.prop[LAMP] = put(LAMP, 115, 0); g.prop[ROD] = put(ROD, 115, 0); g.prop[DWARF] = put(DWARF, 115, 0); g.loc = 115; g.oldloc = 115; g.newloc = 115; /* Leave the grate with normal (non-negative property). */ put(GRATE, 116, 0); biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); g.prop[SNAKE] = put(SNAKE, 116, 1); g.prop[BIRD] = put(BIRD, 116, 1); g.prop[CAGE] = put(CAGE, 116, 0); g.prop[ROD2] = put(ROD2, 116, 0); g.prop[PILLOW] = put(PILLOW, 116, 0); g.prop[BOOTH] = put(BOOTH, 116, -3); g.fixed[BOOTH] = 115; g.prop[PHONE] = put(PHONE, 212, -4); g.prop[MIRROR] = put(MIRROR, 115, 0); g.fixed[MIRROR] = 116; g.prop[BOOK2] = put(BOOK2, 115, 0); for (i = 1; i < MAXOBJ; ++i) { if (toting(i) && enclosed(i)) extract(i); if (toting(i)) destroy(i); } rspeak(132); g.closed = TRUE; clock3 = 20 + ranz(20); newtravel = TRUE; return (TRUE); } if (g.prop[LAMP] == 1) --g.limit; if (g.limit == 0) { --g.limit; g.prop[LAMP] = 0; if (here(LAMP)) rspeak(184); return (FALSE); } if (g.limit < 0 && outside(g.loc)) { rspeak(185); normend(); return (TRUE); } if (g.limit <= 40) { if (g.lmwarn || !here(LAMP)) return (FALSE); g.lmwarn = TRUE; spk = 187; if (g.prop[BATTERIES] == 1) spk = 323; if (g.place[BATTERIES] == 0) spk = 183; if (g.prop[VEND] == 1) spk = 189; rspeak(spk); return (FALSE); } return (FALSE); } /* HINTS come here if he's been long enough at required location(s) for some unused hint, hint number is in variable "hint". Branch to quick test for additional conditions, then do neet stuff. If conditions are met and we want to offer hint. Clear hintlc if no action is taken. */ #define MASE 1 #define DARK 2 #define WITT 3 #define H_SWORD 4 #define SLIDE 5 #define H_GRATE 6 #define H_BIRD 7 #define H_ELFIN 8 #define RNBOW 9 #define STYX 10 #define H_SNAKE 11 #define CASTLE 12 void do_hint(hint) int hint; { g.hintlc[hint] = 0; switch (hint + 1 - HNTMIN) { case MASE: if (!at(g.loc) && !at(g.oldloc) && !at(g.loc) && burden(0) > 1) break; else return; case DARK: if (g.prop[EMERALD] != -1 && g.prop[PYRAMID] == -1) break; else return; case WITT: break; case H_SWORD: if ((g.prop[SWORD] == 1 || g.prop[SWORD] == 5) && !toting(CROWN)) break; else return; case SLIDE: break; case H_GRATE: if (g.prop[GRATE] == 0 && !athand(KEYS)) break; else return; case H_BIRD: if (here(BIRD) && athand(ROD) && object == BIRD) break; else return; case H_ELFIN: if (!g.visited[159]) break; else return; case RNBOW: if (!toting(SHOES) || g.visited[205]) break; else return; case STYX: if (!athand(LYRE) && g.prop[DOG] != 1) break; else return; case H_SNAKE: if (here(SNAKE) && !here(BIRD)) break; else return; case CASTLE: break; default: printf(" TRYING TO PRINT HINT # %d\n", hint); bug(27); } if (!yes(g.hints[hint][3], 0, 54)) return; printf("\nI am prepared to give you a hint,"); printf(" but it will cost you %2d points\n", g.hints[hint][2]); g.hinted[hint] = yes(175, g.hints[hint][4], 54); if (g.hinted[hint] && g.limit > 30) g.limit += 30 * g.hints[hint][2]; return; } /* Utility Routines the next logical funtions describe attributes of objects. (ajar, hinged, opaque, printd, treasr, vessel, wearng) */ #include #include #include #include #include "advent.h" #include "advdec.h" /* ajar .TRUE. if item is container and is open or unhinged */ boolean ajar(item) int item; { return ((bitset(g.obj_state[item], OPENBT)) || (vessel(item) && !hinged(item))); } /* at .TRUE. To tell if player is on either side of a two sided object. */ boolean at(item) int item; { if (item < 1 || item > MAXOBJ) return (FALSE); else return (g.place[item] == g.loc || g.fixed[item] == g.loc); } /* athand .TRUE. if item readily reachable it can be lying here, in hand or in open container. */ boolean athand(item) int item; { int contnr; boolean aaa; contnr = -g.place[item]; aaa = enclosed(item) && ajar(contnr); return ((g.place[item] == g.loc) || holding(item) || (aaa && ((g.place[contnr] == g.loc) || (toting(item) && holding(contnr))))); } /* bitoff turns off (sets to 0) a bit in obj_state word */ void bitoff(obj, bit) int obj, bit; { long val; val = 1L << bit; g.obj_state[obj] &= ~val; } /* biton turns on (sets to 1) a bit in obj_state word */ void biton(obj, bit) int obj, bit; { long val; val = 1L << bit; g.obj_state[obj] |= val; } /* bitset .TRUE. if object_state has bit N set */ boolean bitset(state, bit) long state; int bit; { return (((state >> bit) & 1) == 1); } /* blind .TRUE. if you can't see at this loc, (darkness of glare) */ boolean blind() { return (dark() || (g.loc == 200 && athand(LAMP) && (g.prop[LAMP] == 1))); } /* burden .. returns weight of items being carried if obj=0, burden calculates the total weight of the adventurer's burden including everything in all containers (except the boat) that he is carring. if object is a container, calculate the weight of everything inside the container (including the container itself). Since donkey FORTRAN isn't recursive, we will only calculate weight of contained containers one level down. The only serious contained container would be the sack The only thing we'll miss will be filled VS empty bottle or cage. If object isn't a container, return its weight. */ int burden(obj) int obj; { int i, sum, temp; sum = 0; if (obj == 0) { for (i = 1; i < MAXOBJ; i++) { if (toting(i) && (g.place[i] != -BOAT)) sum += g.weight[i]; } } else { if (obj != BOAT) { sum = g.weight[obj]; temp = g.holder[obj]; while (temp != 0) { sum += g.weight[temp]; temp = g.hlink[temp]; } } } return (sum); } /* Routine to carry an object start toting an object, removing it from the list of things at its former location. If object > MAXOBJ ( moving "FIXED" or second loc), then don't change place. */ void carry(obj, where) int obj, where; { int temp; if (obj < MAXOBJ) { if (g.place[obj] == -1) return; g.place[obj] = -1; } if (g.atloc[where] == obj) g.atloc[where] = g.link[obj]; else { temp = g.atloc[where]; while (g.link[temp] != obj) { temp = g.link[temp]; if (temp == 0) bug(35); } g.link[temp] = g.link[obj]; } return; } /* confuz generates some variant of "Don't understand that" message. */ int confuz() { int msg; msg = 60; if (pct(50)) msg = 61; if (pct(33)) msg = 13; if (pct(25)) msg = 347; if (pct(20)) msg = 195; return (msg); } /* dark .TRUE. if there is no light here */ boolean dark() { return (!(g.loc_attrib[g.loc] & LIGHT) && (!g.prop[LAMP] || !athand(LAMP))); } /* Routine to check for presence of dwarves.. */ int dcheck() { int i; for (i = 1; i < (DWARFMAX); ++i) if (g.dloc[i] == g.loc) return (i); return (0); } /* dead .TRUE. if object is now dead */ boolean dead(obj) int obj; { return (bitset(g.obj_state[obj], 10)); } /* drop Place an object at a given loc, prefixing it onto the atloc list. */ void drop(obj, where) int obj, where; { if (obj > MAXOBJ) g.fixed[obj - MAXOBJ] = where; else g.place[obj] = where; if (where > 0) { g.link[obj] = g.atloc[where]; g.atloc[where] = obj; } return; } /* destroy Permanently eliminate "object" by moving it to a non-existent location. */ void destroy(obj) int obj; { move(obj, 0); return; } /* edible .TRUE. if obj can be eaten. */ boolean edible(obj) int obj; { return (bitset(g.obj_state[obj], 7)); } /* enclosed .TRUE. If object is inside a container. */ boolean enclosed(item) int item; { if (item < 1 || item > MAXOBJ) return (FALSE); else return (g.place[item] < -1); } /* extract remove "object" from a container. origionally name "remove" but rename to avoid conflict with stdio.h */ void extract(obj) int obj; { int contnr, temp; contnr = -g.place[obj]; g.place[obj] = -1; if (g.holder[contnr] == obj) g.holder[contnr] = g.hlink[obj]; else { temp = g.holder[contnr]; while (g.hlink[temp] != obj) { temp = g.hlink[temp]; if (temp == 0) bug(35); } g.hlink[temp] = g.hlink[obj]; } return; } /* forced To tell if a location will causes a forced move. A forced location is one from which he is immediately bounced to another. Normal use is for death (forced to location zero) and for description of journey from on place to another. */ int forced(at_loc) int at_loc; { return ((g.loc_attrib[at_loc] & 10) == 2); } /* here .TRUE. If an item is at location or is being carried. */ boolean here(item) int item; { return (g.place[item] == g.loc || toting(item)); } /* hinged .TRUE. If object can be opened or shut. */ boolean hinged(object) int object; { return (bitset(g.obj_state[object], 1)); } /* holding .TRUE. If the object is being carried in hand. */ boolean holding(item) int item; { if (item < 1 || item > MAXOBJ) return (FALSE); else return (g.place[item] == -1); } /* insert */ void insert(obj, contnr) int obj, contnr; { int temp; if (contnr == obj) bug(32); carry(obj, g.loc); temp = g.holder[contnr]; g.holder[contnr] = obj; g.hlink[obj] = temp; g.place[obj] = -contnr; } /* inside = .TRUE. If location is well within cave */ boolean inside(loc) int loc; { return (!outside(loc) && !portal(loc)); } /* Juggle an object by picking it up and putting it down again, The purpose being to get the object to the front of the chain at its loc. */ void juggle(obj) int obj; { int i, j; i = g.place[obj]; j = g.fixed[obj]; move(obj, i); move(obj + MAXOBJ, j); return; } /* Determine liquid in the vessel */ int liq(item) int item; { int liquid; if ((item == BOTTLE) || (item == CASK)) liquid = liq2(((int) g.prop[item] >> 1) & 7); else liquid = 0; return (liquid); } /* Determine type of liquid in vessel */ int liq2(liquid) int liquid; { switch (liquid) { case 4: return (WATER); case 5: return (OIL); case 6: return (WINE); default: return (0); /* empty */ } } /* Determine liquid at a location */ int liqloc(loc) int loc; { return (liq2((int) ((g.loc_attrib[loc] >> 1) & 7))); } /* living .TRUE. If object is living, bear for example */ boolean living(obj) int obj; { return (bitset(g.obj_state[obj], 9)); } /* locked .TRUE. if lockable object is locked */ boolean locked(item) int item; { return (bitset(g.obj_state[item], 4)); } /* locks .TRUE. if you can lock this object */ boolean locks(item) int item; { return (bitset(g.obj_state[item], 3)); } /* LOOKIN list contents if obj is a container and is open or transparent. */ void lookin(contnr) int contnr; { int temp; boolean first_time; if (vessel(contnr) && (ajar(contnr) || !opaque(contnr))) { temp = g.holder[contnr]; first_time = TRUE; while (temp != 0) { if (first_time) rspeak(360); printf(" "); pspeak(temp, -1); temp = g.hlink[temp]; first_time = FALSE; } } return; } /* Routine to move an object */ v7788888oid move(obj, where) int obj, where; { int from; if (obj > MAXOBJ) from = g.fixed[obj - MAXOBJ]; else { if (enclosed(obj)) extract(obj); from = g.place[obj]; } if ((from > 0) && (from < MAXOBJ * 2)) carry(obj, from); drop(obj, where); return; } /* noway, generate's some variant of "can't do that" message. */ int noway() { int msg; msg = 14; if (pct(50)) msg = 110; if (pct(33)) msg = 147; if (pct(25)) msg = 250; if (pct(20)) msg = 262; if (pct(17)) msg = 25; if (pct(14)) msg = 345; if (pct(12)) msg = 346; return (msg); } /* opaque .TRUE. If obj is non-transparent container */ boolean opaque(obj) int obj; { return (bitset(g.obj_state[obj], 6)); } /* outsid .TRUE. If location is outside the cave */ boolean outside(loc) int loc; { return (bitset(g.loc_attrib[loc], 6)); } /* Routine true x% of the time. (x an integer from 0 to 100) */ int pct(x) int x; { return (ranz(100) < x); } /* plural .TRUE. if object is multiple objects */ boolean plural(obj) int obj; { return (bitset(g.obj_state[obj], 13)); } /* portal .TRUE. If location is a cave entrance */ boolean portal(loc) int loc; { return (bitset(g.loc_attrib[loc], 5)); } /* printed .TRUE. If object can be read. */ boolean printed(obj) int obj; { return (bitset(g.obj_state[obj], 8)); } /* put is the same as move, except it returns a value used to set the negated prop values for the repository objects. */ int put(obj, where, pval) int obj, where, pval; { move(obj, where); return ((-1) - pval); } /* RANZ */ int ranz(range) int range; { return (rand() % range); } /* small .TRUE. If object fits in sack or small container */ boolean small(obj) int obj; { return (bitset(g.obj_state[obj], 5)); } /* toting .TRUE. If an item is being caried. */ int toting(item) int item; { boolean aaa, bbb, ccc; int contnr, outer, outer2; contnr = -g.place[item]; outer = -g.place[contnr]; outer2 = -g.place[outer]; aaa = holding(contnr); bbb = enclosed(contnr) && holding(outer); ccc = enclosed(outer) && holding(outer2); return (holding(item) || (enclosed(item) && (aaa || bbb || ccc))); } /* treasr .TRUE. If object is valuable for points */ boolean treasr(obj) int obj; { return (bitset(g.obj_state[obj], 14)); } /* vessel .TRUE. if object can hold a liquid */ boolean vessel(obj) int obj; { return (bitset(g.obj_state[obj], 15)); } /* wearng .TRUE. If wearing obj */ boolean wearng(item) int item; { return (bitset(g.obj_state[item], WEARBT)); } /* worn .TRUE. if object is being worn */ boolean worn(obj) int obj; { return (bitset(g.obj_state[obj], 11)); } static char *e_msg[] = { "message line > 70 characters", /* 00 */ "null line in message", /* 01 */ "too many words of messages", /* 02 */ "too many travel options", /* 03 */ "too many vocabulary words", /* 04 */ "required vocabulary word not found", /* 05 */ "too many rtext or mtext messages", /* 06 */ "too many hints", /* 07 */ "location has loc_attrib bit being set twice", /* 08 */ "invalid section number in database", /* 09 */ "out of order locs or rspeak entries.", /* 10 */ "illegal motion word in travel table", /* 11 */ "** unused **.",/* 12 */ "unknown or illegal word in adjective table.", /* 13 */ "illegal word in prep/obj table", /* 14 */ "too many entries in prep/obj table", /* 15 */ "object has condition bit set twice", /* 16 */ "object number too large", /* 17 */ "too many entries in adjective/noun table.", /* 18 */ "** unused **.",/* 19 */ "special travel (500>l>300) exceeds goto list", /* 20 */ "ran off end of vocabulary table", /* 21 */ "verb class (n/1000) not between 1 and 3", /* 22 */ "intransitive action verb exceeds goto list", /* 23 */ "transitive action verb exceeds goto list", /* 24 */ "conditional travel entry with no alternative", /* 25 */ "location has no travel entries", /* 26 */ "hint number exceeds goto list", /* 27 */ "invalid month returned by date function", /* 28 */ "action verb 'leave' has no object.", /* 29 */ "preposition found in unexpected table", /* 30 */ "received an unexpected word terminator from a1toa5", /* 31 */ "trying to put a container into itself (tricky!)", /* 32 */ "unknown word class in getwds", /* 33 */ "** unused **.",/* 34 */ "trying to carry a non-existent object"}; /* 35 */ /* Fatal error routine */ void bug(n) unsigned int n; { if (n < 36 && *e_msg[n] != '*') fprintf(stderr, "Fatal error, probable cause: %s\n", e_msg[n]); else fprintf(stderr, "Fatal error number %d - Unused error number!\n", n); panic((char *) 0, TRUE); } /* Prompt for input, strip leading and trailing spaces, return &buf[first non-whitespace]. Does not return if end of input. */ char * ask(prompt, buf, buflen) char *prompt, *buf; int buflen; { fputs(prompt, stdout); fflush(stdout); if (!fgets(buf, buflen, stdin)) panic("end of input", FALSE); if (*buf) { int c; char *end = buf + strlen(buf); if (end[-1] != '\n') /* Skip to end of line */ while ((c = getchar()) != '\n' && c != EOF); while (*buf && isspace(*buf)) buf++; while (buf <= --end && isspace(*end)) *end = '\0'; } return buf; } /* save and abort */ void panic(msg, save) char *msg; boolean save; { fprintf(stderr, "\nPANIC: %s%s\n", msg ? msg : "", save ? ". Save..." : msg ? "" : "aborting."); if (save) saveadv("advpanic.sav"); exit(EXIT_FAILURE); } /* program VERB.C */ #include "stdio.h" #include "advent.h" #include "advdec.h" /* Initialize default verb messages */ static _CONST int actmsg[56] = { 0, 24, 29, 0, 33, 0, 33, 38, 38, 42, 14, 43, 110, 29, 110, 73, 75, 29, 13, 59, 59, 174, 313, 67, 13, 147, 155, 369, 146, 110, 13, 13, 24, 25, 110, 262, 14, 29, 271, 14, 14, 24, 29, 38, 24, 331, 24, 109, 332, 0, 0, 348, 358, 0, 364, 0}; _PROTOTYPE(static int ck_obj, (void)); _PROTOTYPE(void von, (void)); _PROTOTYPE(void voff, (void)); _PROTOTYPE(void vwave, (void)); _PROTOTYPE(void veat, (void)); _PROTOTYPE(void vthrow, (void)); _PROTOTYPE(void vfind, (void)); _PROTOTYPE(void vfill, (void)); _PROTOTYPE(void vfeed, (void)); _PROTOTYPE(void vbreak, (void)); _PROTOTYPE(void vwake, (void)); _PROTOTYPE(void vdrop, (void)); _PROTOTYPE(void vpour, (void)); _PROTOTYPE(void vput, (void)); _PROTOTYPE(void vread, (void)); _PROTOTYPE(void vinsert, (void)); _PROTOTYPE(void vextract, (void)); _PROTOTYPE(static boolean do_battle, (int *)); _PROTOTYPE(void vhit, (void)); _PROTOTYPE(void vanswer, (void)); _PROTOTYPE(void vblow, (void)); _PROTOTYPE(void vdial, (void)); _PROTOTYPE(void vplay, (void)); _PROTOTYPE(void vpick, (void)); _PROTOTYPE(void vput, (void)); _PROTOTYPE(void vturn, (void)); _PROTOTYPE(void vget, (void)); _PROTOTYPE(void vlook, (void)); /* Routine to process a transitive verb */ void trverb() { newtravel = FALSE; switch (verb) { case NOTHING: case CALM: case WALK: case QUIT: case SCORE: case FOO: case SUSPEND: break; case TAKE: vtake(); break; case DROP: vdrop(); break; case SAY: bug(34); break; case OPEN: vopen(); break; case CLOSE: vclose(); break; case LOCK: vlock(); break; case UNLOCK: vunlock(); break; case ON: von(); break; case OFF: voff(); break; case WAVE: vwave(); break; case KILL: vkill(); break; case POUR: vpour(); break; case EAT: veat(); break; case DRINK: vdrink(); break; case RUB: if (object != LAMP) rspeak(76); else actspk(RUB); break; case THROW: if (prep == PREPDN) vput(); else vthrow(); break; case FEED: vfeed(); break; case FIND: case INVENTORY: vfind(); break; case FILL: vfill(); break; case BLAST: ivblast(); break; case READ: vread(); break; case BREAK: vbreak(); break; case WAKE: vwake(); break; case REMOVE: vextract(); break; case YANK: vyank(); break; case WEAR: vwear(); break; case HIT: vhit(); break; case ANSWER: vanswer(); break; case BLOW: vblow(); break; case DIAL: vdial(); break; case PLAY: vplay(); break; case PICK: vpick(); break; case PUT: vput(); break; case TURN: vturn(); break; case GET: vget(); break; case INSRT: vinsert(); break; case LOOK: vlook(); break; default: printf("This verb is not implemented yet.\n"); } return; } /* Routine to speak default verb message */ void actspk(verb) int verb; { int i; if (verb < 1 || verb > 55) bug(39); i = actmsg[verb]; if (i) rspeak(i); return; } /* CARRY TAKE etc. */ void vtake() { int msg; msg = 0; if (object == BIRD && !g.closed && athand(BIRD) && g.place[BIRD] != g.loc) { rspeak(407); return; } if (prep == PREPOF) { if (object && iobj) { rspeak(confuz()); return; } else if (!object) { object = iobj; iobj = 0; vdrop(); return; } } msg = 24; if (object == BOAT) msg = 281; if (plural(object)) msg = 297; if (holding(object)) { rspeak(msg); return; } /* Special case objects and fixed objects */ msg = ck_obj(); if (g.fixed[object]) { rspeak(msg); return; } if (prep == PREPIN) { vinsert(); return; } /* Special case for liquids */ if (object == WATER || object == OIL || object == WINE) { if (here(BOTTLE) && here(CASK)) { rspeak(315); return; } iobj = object; if (here(BOTTLE)) { object = BOTTLE; if (holding(BOTTLE)) vfill(); else rspeak(312); return; } else if (here(CASK)) { object = CASK; if (holding(CASK)) vfill(); else rspeak(312); return; } else { rspeak(312); return; } } if (object != BEAR && ((burden(0) + burden(object)) > 15)) { if (wearng(object)) { g.prop[object] = 0; bitoff(object, WEARBT); } rspeak(92); return; } if (prep == PREPFR || enclosed(object)) { vextract(); return; } msg = 343; /* Poster: hides wall safe */ if (object == POSTER && g.place[SAFE] == 0) { g.prop[POSTER] = 1; msg = 362; /* Move safe and wall containing safe into view */ drop(SAFE, g.loc); drop(WALL2, g.loc); } /* Boat: need the pole to push it */ if (object == BOAT) { if (!toting(POLE) && g.place[POLE] != -BOAT) { rspeak(218); return; } else { g.prop[BOAT] = 1; msg = 221; } } /* Special case for bird. */ if (object == BIRD && g.prop[BIRD] <= 0) { if (athand(ROD)) { rspeak(26); return; } if (!holding(CAGE)) { rspeak(27); return; } if (!ajar(CAGE)) { rspeak(358); return; } insert(BIRD, CAGE); bitoff(CAGE, OPENBT); pspeak(object, -1); rspeak(54); return; } /* SWORD If in anvil, need crown & must yank */ if (object == SWORD && g.prop[SWORD] != 0) { if (iobj && iobj != ANVIL) { rspeak(noway()); return; } if (verb != YANK) if (!yes(215, 0, 54)) return; if (!wearng(CROWN)) { g.fixed[SWORD] = -1; g.prop[SWORD] = 3; pspeak(SWORD, 2); return; } } carry(object, g.loc); if (object == POLE || object == SKEY || object == SWORD || ((object == CLOAK || object == RING) && !wearng(object)) ) g.prop[object] = 0; if (verb == YANK || object == SWORD) msg = 204; rspeak(msg); return; } static int ck_obj() { int msg; msg = noway(); if (object == PLANT && g.prop[PLANT] <= 0) msg = 115; if (object == BEAR && g.prop[BEAR] == 1) msg = 169; if (object == CHAIN && g.prop[BEAR] != 0) msg = 170; if (object == SWORD && g.prop[SWORD] == 5) msg = 208; if (object == CLOAK && g.prop[CLOAK] == 2) msg = 242; if (object == AXE && g.prop[AXE] == 2) msg = 246; if (object == PHONE) msg = 251; if (object == BEES || object == HIVE) msg = 295; if (object == STICKS) msg = 296; return (msg); } /* DROP etc. */ void vdrop() { int msg; /* Check for dynamite */ if (holding(ROD2) && object == ROD && !holding(ROD)) object = ROD2; if (plural(object)) msg = 105; else msg = 29; if (object == liq(BOTTLE)) object = BOTTLE; else if (object == liq(CASK)) object = CASK; if (!toting(object)) { rspeak(msg); return; } if (prep == PREPIN) { vinsert(); return; } /* Snake and bird */ if (object == BIRD && here(SNAKE)) { rspeak(30); if (g.closed) { dwarfend(); return; } extract(BIRD); destroy(SNAKE); /* Set snake prop for use by travel options */ g.prop[SNAKE] = 1; drop(BIRD, g.loc); return; } msg = 344; if (verb == LEAVE) msg = 353; if (verb == THROW) msg = 352; if (verb == TAKE) msg = 54; if (object == POLE && holding(BOAT)) { rspeak(280); return; } /* Coins and vending machine */ if (object == COINS && here(VEND)) { destroy(COINS); drop(BATTERIES, g.loc); pspeak(BATTERIES, 0); return; } /* Bird and dragon (ouch!!) */ if (object == BIRD && at(DRAGON) && g.prop[DRAGON] == 0) { rspeak(154); extract(BIRD); destroy(BIRD); if (g.place[SNAKE] == plac[SNAKE]) g.tally2++; return; } /* Bear and troll */ if (object == BEAR && at(TROLL)) { msg = 163; destroy(TROLL); destroy(TROLL + MAXOBJ); move(TROLL2, plac[TROLL]); move((TROLL2 + MAXOBJ), fixd[TROLL]); juggle(CHASM); g.prop[TROLL] = 2; } /* Vase */ else if (object == VASE) { if (g.loc == plac[PILLOW]) msg = 54; else { g.prop[VASE] = at(PILLOW) ? 0 : 2; pspeak(VASE, g.prop[VASE] + 1); if (g.prop[VASE] != 0) g.fixed[VASE] = -1; 8888888888888888888 8!8"8#8$8%8&8'8(8)8*8+8,8 } } else { if (worn(object) || object == POLE || object == BOAT) g.prop[object] = 0; if (worn(object)) bitoff(object, WEARBT); if (object == POLE) g.prop[BOAT] = 0; } if (enclosed(object)) extract(object); drop(object, g.loc); rspeak(msg); return; } /* OPEN. special stuff for opening clam/oyster. The following can be opened without a key: clam/oyster, door, pdoor, bottle, cask, cage */ void vopen() { int msg, oyclam; if (!hinged(object)) msg = noway(); else if (object == PDOOR && g.prop[PDOOR] == 1) msg = 253; else if (ajar(object)) msg = 336; else if (locks(object) || iobj == KEYS || iobj == SKEY) { vunlock(); return; } else if (locked(object)) if (object == DOOR) msg = 111; else msg = 337; else if (object == CLAM || object == OYSTER) { oyclam = (object == OYSTER ? 1 : 0); msg = oyclam + holding(object) ? 120 : 124; if (!athand(TRIDENT)) msg = 122 + oyclam; if (iobj != 0 && iobj != TRIDENT) msg = 376 + oyclam; if (msg == 124) { destroy(CLAM); drop(OYSTER, g.loc); drop(PEARL, 105); } } else { msg = 54; biton(object, OPENBT); } rspeak(msg); return; } /* close, shut the following can be closed without keys: door, pdoor, bottle, cask, cage */ void vclose() { if (!hinged(object)) rspeak(noway()); else if (!ajar(object)) rspeak(338); else if (locks(object)) vlock(); else { rspeak(54); bitoff(object, OPENBT); } } /* Lamp ON. */ void von() { if (!athand(LAMP)) actspk(verb); else if (g.limit < 0) rspeak(184); else if (g.prop[LAMP] == 1) rspeak(321); else { g.prop[LAMP] = 1; if (g.loc == 200) rspeak(108); else rspeak(39); if (g.wzdark) { g.wzdark = 0; describe(); descitem(); } } return; } /* Lamp OFF. */ void voff() { if (!athand(LAMP)) actspk(verb); else if (g.prop[LAMP] == 0) rspeak(322); else { g.prop[LAMP] = 0; rspeak(40); if (dark()) rspeak(16); } return; } /* WAVE. no effect unless waving rod at fissure. */ void vwave() { if (!holding(object) && (object != ROD || !holding(ROD2))) rspeak(29); else if (object != ROD || !at(FISSURE) || !holding(object) || g.closing) actspk(verb); else if (iobj != 0 && iobj != FISSURE) actspk(verb); else { g.prop[FISSURE] = 1 - g.prop[FISSURE]; pspeak(FISSURE, 2 - g.prop[FISSURE]); if (g.chase == 0 || g.prop[FISSURE] != 0) return; if ((g.loc == 17 && g.oldloc != 27) || (g.loc == 27 && g.oldloc != 17)) return; /* Demise of the Wumpus. Champ must have just crossed bridge */ rspeak(244); g.chase = 0; drop(RING, 209); g.prop[WUMPUS] = 6; move(WUMPUS, 209); biton(WUMPUS, DEADBT); if (g.place[AXE] != plac[WUMPUS]) return; g.fixed[AXE] = 0; g.prop[AXE] = 0; } return; } /* ATTACK, KILL etc. */ void vkill() { int msg, i, k; boolean survival; survival = TRUE; switch (object) { case BIRD: if (g.closed) msg = 137; else { destroy(BIRD); g.prop[BIRD] = 0; if (g.place[SNAKE] == plac[SNAKE]) g.tally2++; msg = 45; } break; case DWARF: if (g.closed) { dwarfend(); return; } survival = do_battle(&msg); break; case 0: msg = 44; break; case CLAM: case OYSTER: msg = 150; break; case DOG: if (g.prop[DOG] == 1) msg = 291; else if (iobj == AXE) { object = AXE; iobj = DOG; vthrow(); return; } else msg = 110; break; case SNAKE: msg = 46; break; case TROLL: if (iobj == AXE) msg = 158; else msg = 110; break; case BEAR: msg = 165 + (g.prop[BEAR] + 1) / 2; break; case WUMPUS: if (g.prop[WUMPUS] == 6) msg = 167; else if (iobj == AXE) { object = AXE; iobj = WUMPUS; vthrow(); return; } else msg = 110; break; case GNOME: msg = 320; break; case DRAGON: if (g.prop[DRAGON] != 0) { msg = 167; break; } if (!yes(49, 0, 0)) break; pspeak(DRAGON, 1); biton(DRAGON, DEADBT); g.prop[DRAGON] = 2; g.prop[RUG] = 0; k = (plac[DRAGON] + fixd[DRAGON]) / 2; move((DRAGON + MAXOBJ), -1); move((RUG + MAXOBJ), 0); move(DRAGON, k); move(RUG, k); for (i = 1; i < MAXOBJ; i++) if (g.place[i] == plac[DRAGON] || g.place[i] == fixd[DRAGON] || holding(i)) move(i, k); g.loc = k; g.newloc = k; return; default: actspk(verb); return; } rspeak(msg); if (!survival) { g.oldloc2 = g.loc; death(); } return; } static boolean do_battle(msg_ptr) int *msg_ptr; { boolean survival; int temp; survival = TRUE; if (iobj == 0) *msg_ptr = 49; else if (iobj != AXE && iobj != SWORD) { *msg_ptr = 355; survival = FALSE; } else if (pct(25)) { temp = iobj; iobj = object; object = temp; vthrow(); return (TRUE); } else if (pct(25)) { *msg_ptr = 355; survival = FALSE; } else if (pct(36)) *msg_ptr = 354; else { rspeak(356); if (pct(61)) *msg_ptr = 52; else { *msg_ptr = 53; survival = FALSE; } } return (survival); } /* POUR */ void vpour() { int msg; if (object == BOTTLE || object == CASK) { iobj = object; object = liq(iobj); if (object == 0) { rspeak(316); return; } } else { if (object < WATER || object > (WINE + 1)) { rspeak(78); return; } } if (!holding(BOTTLE) && !holding(CASK)) { rspeak(29); return; } if (holding(BOTTLE) && liq(BOTTLE) == object) iobj = BOTTLE; if (holding(CASK) && liq(CASK) == object) iobj = CASK; if (iobj == 0) { rspeak(29); return; } if (!ajar(iobj)) { rspeak(335); return; } if (iobj == CASK) object++; g.prop[iobj] = 1; extract(object); g.place[object] = 0; msg = 77; if (iobj == CASK) { object--; msg = 104; } if (at(PLANT) || at(DOOR) || (at(SWORD) && g.prop[SWORD] != 0)) { if (at(DOOR)) { g.prop[DOOR] = 0; if (object == OIL) { g.prop[DOOR] = 1; bitoff(DOOR, LOCKBT); biton(DOOR, OPENBT); } msg = 113 + g.prop[DOOR]; } else if (at(SWORD)) { /* If sword is alread oily, don't let him clean it. No soap. */ if (g.prop[SWORD] != 5) { g.prop[SWORD] = 4; if (object == OIL) { g.prop[SWORD] = 5; g.fixed[SWORD] = -1; } msg = 206 + g.prop[SWORD] - 4; } } else { msg = 112; if (object == WATER) { if (g.prop[PLANT] < 0) g.prop[PLANT] = -g.prop[PLANT] - 1; pspeak(PLANT, g.prop[PLANT] + 1); g.prop[PLANT] = (g.prop[PLANT] + 2) % 6; g.prop[PLANT2] = g.prop[PLANT] / 2; newtravel = TRUE; return; } } } rspeak(msg); return; } /* EAT If he ate the right thing and is in the right place, move him to the other place with all his junk. Otherwise, narky message. */ void veat() { int msg, i, k, ll, kk; switch (object) { case HONEY: g.tally2++; case FOOD: destroy(object); msg = 72; break; case BIRD: case SNAKE: case CLAM: case OYSTER: case FLOWER: msg = 301; break; case DWARF: case DRAGON: case TROLL: case DOG: case WUMPUS: case BEAR: case GNOME: msg = 250; break; case MUSHRM: case CAKES: k = object - MUSHRM; ll = 229 + k; k = 159 - k; kk = SKEY; if (object == MUSHRM) { kk = TDOOR; if (g.loc != 158) g.tally2++; } destroy(object); msg = 228; if (!(here(kk) || g.fixed[kk] == g.loc)) break; msg = ll; /* If he hasn't taken tiny key off shelf, don't let him get it for free! */ for (i = 1; i < MAXOBJ; i++) { if (i == SKEY && g.prop[SKEY] == 1) continue; if (g.place[i] == plac[kk] && g.fixed[i] == 0) move(i, k); } if (g.loc == plac[SKEY] && g.place[SKEY] == plac[SKEY]) g.tally2++; g.loc = k; g.newloc = k; newtravel = TRUE; break; default: actspk(verb); return; } rspeak(msg); return; } /* DRINK */ void vdrink() { int msg, k, j; if (object == 0 && (iobj == BOTTLE || iobj == CASK)) object = liq(iobj); msg = 110; if (object == OIL) msg = 301; if (object != WATER && object != WINE) { rspeak(msg); return; } if (iobj == 0) { if (object == liqloc(g.loc)) iobj = -1; if (athand(CASK) && object == liq(CASK)) iobj = CASK; if (athand(BOTTLE) && object == liq(BOTTLE)) iobj = BOTTLE; } msg = 73; if (iobj != -1) { if (iobj == CASK) object++; extract(object); g.place[object] = 0; g.prop[iobj] = 1; msg = (iobj == CASK) ? 299 : 74; } if (object == WATER || object == (WATER + 1)) { rspeak(msg); return; } /* UH-OH. He's a wino. Let him reap the rewards of incontinence. He'll wander around for awhile, then wake up somewhere or other, having dropped most of his stuff. */ rspeak(300); if (g.prop[LAMP] == 1) g.limit -= ranz(g.limit) / 2; if (g.limit < 10) g.limit = 25; k = 0; if (pct(15)) k = 49; if (k == 0 && pct(15)) k = 53; if (k == 0 && pct(25)) k = 132; if (k == 0) k = 175; if (outside(g.loc)) k = 5; if (k == g.loc) { rspeak(msg); return; } if (holding(AXE)) move(AXE, k); if (holding(LAMP)) move(LAMP, k); for (j = 1; j < MAXOBJ; j++) { if (wearng(j)) bitoff(j, WEARBT); if (holding(j)) drop(j, g.loc); } g.loc = k; g.newloc = k; } /* THROW etc. */ void vthrow() { int msg, i, k, dwarfn; if (holding(ROD2) && object == ROD && !holding(ROD)) object = ROD2; if (!holding(object)) { actspk(verb); return; } if (object == BOAT || object == BEAR) { rspeak(noway()); return; } dwarfn = dcheck(); if (iobj == 0) { /* No indirect object was specified. If a dwarf is present, assume it is the object. If not, look for other living thing. If no living things present, treat 'THROW' as 'DROP'. */ if (dwarfn) iobj = DWARF; else { /* No dwarves present; figure out pausible object. */ k = 0; for (i = 1; i < MAXOBJ; i++) { if (at(i) && living(i)) { iobj = i; k++; } } if (k == 0) { vdrop(); return; } /* It is a beastie of some sort. Is there more than one? Don't kill the bird by default. */ if (k > 1) { rspeak(43); return; } else { if (iobj == BIRD) { vdrop(); return; } if (treasr(object) && at(TROLL)) iobj = TROLL; } } } if (object == SWORD || object == BOTTLE) { vbreak(); return; } if (object == FLOWER && iobj == HIVE) iobj = BEES; if (edible(object) && living(iobj)) { vfeed(); return; } /* If not axe, same as drop... */ if (object != AXE && iobj != TROLL) { vdrop(); return; } /* AXE is THROWN */ msg = 48; switch (iobj) { case DRAGON: if (g.prop[DRAGON] == 0) msg = 152; break; case DWARF: /* At a dwarf... */ if (pct(75)) { g.dseen[dwarfn] = g.dloc[dwarfn] = 0; msg = 47; ++g.dkill; if (g.dkill == 1) msg = 149; } break; case BEAR: /* This'll teach him to throw axe at the bear */ if (g.prop[BEAR] == 0) { msg = 164; drop(AXE, g.loc); g.fixed[AXE] = -1; g.prop[AXE] = 1; juggle(BEAR); } rspeak(msg); return; case WUMPUS: /* Or the WUMPUS! */ if (g.prop[WUMPUS] == 6) { vdrop(); return; } else { msg = 245; g.prop[AXE] = 2; if (g.prop[WUMPUS] == 0) { drop(AXE, g.loc); g.fixed[AXE] = -1; juggle(iobj); } else { msg = 243; destroy(AXE); } } rspeak(msg); return; case DOG: /* Or the nice doggie! */ if (g.prop[DOG] != 1) { msg = 248; g.prop[AXE] = 3; drop(AXE, g.loc); g.fixed[AXE] = -1; juggle(iobj); } rspeak(msg); return; case TROLL: /* Snarf a treasure for the troll */ if (object == AXE) { msg = 158; } else if (!treasr(object) || (object == CASK && (liq(CASK) != WINE))) { vdrop(); return; } else { msg = 159; drop(object, 0); if (object == CASK) g.place[WINE + 1] = 0; move(TROLL, 0); move((TROLL + MAXOBJ), 0); drop(TROLL2, plac[TROLL]); drop((TROLL2 + MAXOBJ), fixd[TROLL]); juggle(CHASM); rspeak(msg); return; } break; default: /* Otherwise it is an attack */ verb = KILL; object = iobj; iobj = objs[objx]; vkill(); return; } rspeak(msg); drop(AXE, g.loc); g.newloc = g.loc; describe(); } /* FIND might be carrying it, or it might be here. else give caveat. */ void vfind() { int msg; if (at(object) || (liq(BOTTLE) == object && at(BOTTLE)) || object == liqloc(g.loc)) msg = 94; else if (dcheck() && g.dflag >= 2 && object == DWARF) msg = 94; else if (g.closed) msg = 138; else if (at(object)) msg = 24; else { actspk(verb); return; } rspeak(msg); return; } /* FEED */ void vfeed() { int msg; if (iobj == 0 || !living(iobj)) { int i, k, kk; if (object == BIRD) { rspeak(100); return; } if (!living(object)) { rspeak(noway()); return; } /* See if there is anything edible around here. */ kk = 0; k = 0; for (i = 1; i < MAXOBJ; i++) if (here(i) && edible(i)) { k++; kk = i; } iobj = object; object = kk; if (k != 1 && !dead(iobj)) { printf("What do you want to feed the %s\n", otxt[objx]); objs[1] = 0; objx = 0; return; } } /* Feed object ot indirect object */ msg = 102; switch (iobj) { case DRAGON: if (g.prop[DRAGON] != 0) msg = noway(); break; case TROLL: msg = 182; break; case SNAKE: if (object == BIRD && !g.closed) { msg = 101; destroy(BIRD); g.prop[BIRD] = 0; g.tally2++; } break; case DWARF: msg = 103; g.dflag++; break; case BEAR: if (g.prop[BEAR] == 3) msg = noway(); if (g.prop[BEAR] == 1 || g.prop[BEAR] == 2) msg = 264; if (object == FOOD) msg = 278; if (object == HONEY) { g.prop[BEAR] = 1; g.fixed[AXE] = 0; destroy(HONEY); msg = 168; } break; case DOG: msg = 291; if (object == FOOD && g.prop[DOG] != 1) { msg = 249; destroy(FOOD); } break; case WUMPUS: if (g.prop[WUMPUS] == 6) msg = 326; if (g.prop[WUMPUS] == 0) msg = 327; if (object == FOOD) msg = 240; break; case BEES: if (object == FLOWER) { if (enclosed(FLOWER)) extract(FLOWER); drop(FLOWER, g.loc); g.fixed[FLOWER] = -1; g.prop[FLOWER] = 1; drop(HONEY, g.loc); juggle(HONEY); msg = 267; g.prop[HIVE] = 1; } } rspeak(msg); return; } /* FILL. object with iobj */ void vfill() { int msg, k; if (!vessel(object)) msg = 313; else { if (iobj == 0) iobj = liqloc(g.loc); if (object == BOTTLE || object == CASK) { k = (object == CASK) ? 1 : 0; msg = 0; if (iobj == 0) msg = 304 + k; if (liq(object) != 0) msg = 302 + k; if (msg != 0) { rspeak(msg); return; } msg = 306 + k; if (iobj == OIL) msg = 308 + k; if (iobj == WINE) msg = 310 + k; g.prop[object] = (int) g.loc_attrib[g.loc] & 14; g.place[iobj + k] = -1; insert(iobj + k, object); } else if (object == VASE) { if (iobj == 0 || !holding(VASE)) { rspeak(144); return; } msg = 145; g.prop[VASE] = 2; g.fixed[VASE] = -1; if (enclosed(object)) extract(object); drop(object, g.loc); } else if (object == GRAIL) msg = 298; else msg = 339; } rspeak(msg); } /* READ. Magazine in dwarvish, message we've seen, and ... oyster? */ void vread() { int msg; if (blind()) { actspk(verb); return; } if (object && iobj) { rspeak(confuz()); return; } msg = confuz(); if (!object) object = iobj; switch (object) { case BOOK: case BOOK2: msg = 142; break; case BILLBD: msg = 361; break; case CARVNG: msg = 372; break; case MAGAZINE: msg = 190; break; case MESSAGE: msg = 191; break; case POSTER: msg = 370; break; case TABLET: msg = 196; break; case OYSTER: if (g.hinted[2] && holding(OYSTER)) msg = 194; if (!g.hinted[2] && holding(OYSTER) && g.closed) { g.hinted[2] = yes(192, 193, 54); return; } break; } rspeak(msg); return; } /* BREAK. works for mirror in repository and, of course the vase and bottle. Also the sword is more brittle than it appears. */ void vbreak() { int msg, k; boolean it_broke; it_broke = FALSE; msg = 146; switch (object) { case MIRROR: msg = 148; if (g.closed) { rspeak(197); dwarfend(); return; } break; case VASE: if (g.prop[VASE] == 0) { it_broke = TRUE; msg = 198; g.prop[VASE] = 2; } break; case BOTTLE: if (g.prop[BOTTLE] != 3) { it_broke = TRUE; k = liq(BOTTLE); msg = 231; g.prop[BOTTLE] = 3; if (k) { extract(k); g.place[k] = 0; } } break; case SWORD: msg = 29; if (holding(SWORD)) { msg = 279; g.prop[SWORD] = 4; it_broke = TRUE; } break; } if (it_broke) { if (enclosed(object)) extract(object); if (holding(object)) drop(object, g.loc); g.fixed[object] = -1; } rspeak(msg); return; } /* WAKE. only use is to disturb the dwarves or the Wumpus. Other wumpus-wakers link here. */ void vwake() { int msg; msg = actmsg[verb]; if (at(WUMPUS)) { g.chase = TRUE; g.prop[WUMPUS] = 1; msg = 276; } if (at(DOG) && g.prop[DOG] == 1) msg = 291; if (object == DWARF && g.closed) { rspeak(199); dwarfend(); return; } rspeak(msg); return; } /* YANK. A variant of 'CARRY'. In general, not a good idea. At most, it gets the cloak or a couple of snide comments. */ void vyank() { if (toting(object)) vdrop(); else if (object == BEAR && g.prop[CHAIN]) rspeak(205); else if (object == CLOAK && g.prop[CLOAK] == 2) { /* Cloak. big trouble ahead. */ g.prop[ROCKS] = 1; g.prop[CLOAK] = 0; g.fixed[CLOAK] = 0; carry(CLOAK, g.loc); rspeak(241); if (at(WUMPUS) && g.prop[WUMPUS] == 0) { g.chase = 1; g.prop[WUMPUS] = 1; rspeak(276); } } else vtake(); return; } /* WEAR. Only good for jewels, ruby slippers, cloak & crown. But he might try the sword. Anything else is ridiculous. Another variant of 'CARRY'. */ void vwear() { int msg; if (object == SWORD && g.prop[SWORD] != 3) msg = 209; else if (worn(object)) { if (object == CLOAK && g.prop[CLOAK] == 2) msg = 242; else if (wearng(object)) msg = (object == SHOES) ? 227 : 210; else { g.prop[object] = 1; biton(object, WEARBT); if (enclosed(object)) extract(object); if (holding(object)) msg = 54; else { vtake(); return; } } } else { printf("Just exactly how does one wear a %s\n", otxt[objx]); return; } rspeak(msg); return; } /* HIT. If not punching out telephone, assume attack. */ void vhit() { if (at(WUMPUS) && g.prop[WUMPUS] == 0) { vwake(); return; } if (object != PHONE) { vkill(); return; } else { if (g.closed) { rspeak(282); dwarfend(); return; } if (g.prop[PHONE] == 2) rspeak(256); else { drop(SLUGS, g.loc); g.prop[PHONE] = 2; g.prop[BOOTH] = 2; rspeak(257); } } return; } /* ANSWER (telephone). Smartass for anything else. */ void vanswer() { int msg; switch (object) { case DWARF: case WUMPUS: case SNAKE: case BEAR: case DRAGON: msg = 259; break; case TROLL: msg = 258; break; case BIRD: msg = 260; break; case PHONE: if (g.prop[PHONE] != 0) msg = 269; else if (g.closed) { rspeak(283); normend(); return; } else { msg = 261; g.prop[PHONE] = 1; g.prop[BOOTH] = 2; } break; default: msg = actmsg[verb]; break; } rspeak(msg); return; } /* BLOW. Joshua fit de battle of Jericho, and de walls ... */ void vblow() { int msg, i, k; msg = actmsg[verb]; if (object != 0 && iobj != 0) { rspeak(msg); return; } if (object == 0) object = iobj; iobj = 0; if (object == 0) msg = 268; if (object == HORN) { msg = outside(g.loc) ? 277 : 266; if (at(WUMPUS)) { rspeak(msg); if (g.prop[WUMPUS] == 0) vwake(); return; } else if (g.prop[WALL] != 1 && (g.loc == 102 || g.loc == 194)) { k = g.loc == 194 ? 195 : 196; msg = 265; g.prop[WALL] = 1; for (i = 1; i < MAXOBJ; i++) if (g.place[i] == g.loc || g.fixed[i] == g.loc) move(i, k); g.newloc = k; } } rspeak(msg); return; } /* DIAL. No effect unless at phone. */ void vdial() { if (object != PHONE) actspk(verb); else if (g.closed) { rspeak(283); normend(); } else rspeak(271); return; } /* PLAY. Only for horn or lyre. */ void vplay() { int msg; msg = actmsg[verb]; if (object != 0 && iobj != 0) { rspeak(confuz()); return; } if (object == 0) object = iobj; if (object == HORN) { vblow(); return; } if (object == LYRE) { msg = 287; if (here(DOG) && !dead(DOG)) { g.prop[DOG] = 1; biton(DOG, DEADBT); g.fixed[AXE] = 0; g.prop[AXE] = 0; msg = 288; } } rspeak(msg); return; } /* PICK/ PICK UP. Can pick flower & mushrooms, But must 'PICK UP' everything else. */ void vpick() { if (object == 0) object = iobj; iobj = 0; if (object == FLOWER || object == MUSHRM || prep != 0) vtake(); else rspeak(confuz()); return; } /* PUT DOWN: equivalent to drop PUT IN: if liquid, means fill PUT ON: wear of drop */ void vput() { if (prep == 0) { printf("Where do you want to put the %s\n", otxt[objx]); return; } if (prep == PREPIN) vinsert(); else { /* PUT ON: wear or put object on iobj */ if (prep == PREPON) { if (object == 0) { object = iobj; otxt[objx] = iotxt[iobx]; iobj = 0; } if (worn(object) || object == 0) vwear(); else vdrop(); } else { /* PUT DOWN: "drop" */ if (object == 0 && iobj == 0) { if (object == 0) object = iobj; iobj = 0; vdrop(); } else rspeak(noway()); } } return; } /* turn on/off */ void vturn() { if (!prep) rspeak(confuz()); else { if (!object && iobj == LAMP) object = LAMP; if (object != LAMP) rspeak(noway()); else if (prep == PREPON) von(); else voff(); } return; } /* GET (no prep): "take" GET IN: "enter" GET OUT: "leave" */ void vget() { if (prep == 0 || prep == PREPFR) vtake(); else if (object == 0) { object = iobj; iobj = 0; prep = 0; vtake(); } return; } /* INSERT/PUT IN */ void vinsert() { int msg; if (iobj == 0) { printf("Where do you want to %s it?\n", vtxt[vrbx]); return; } msg = noway(); if (object == SWORD && iobj == ANVIL && g.prop[SWORD] == 0) msg = 350; if (!vessel(iobj)) { rspeak(msg); return; } msg = ck_obj(); if (g.fixed[object]) { rspeak(msg); return; } if (object == iobj) { rspeak(252); return; } if (iobj == BOTTLE || iobj == CASK || iobj == VASE || iobj == GRAIL || (object >= WATER && object <= WINE + 1)) { object = iobj; iobj = objs[objx]; vfill(); return; } if (!ajar(iobj)) { rspeak(358); return; } if (iobj == CHEST) { if (object == BOAT) msg = noway(); else { if (wearng(object)) bitoff(object, WEARBT); if (worn(object)) g.prop[object] = 0; if (enclosed(object)) extract(object); insert(object, iobj); msg = 54; } rspeak(msg); return; } /* Bird goes into cage and only cage */ if (object == BIRD && iobj != CAGE) { rspeak(351); return; } if (object != BIRD && iobj == CAGE) { rspeak(329); return; } if (object == BIRD) { prep = 0; vtake(); return; } /* Bar vase & pillow from safe, to force putting down on florr */ if ((object == VASE || object == PILLOW) && iobj == SAFE) { rspeak(329); return; } if (object != RADIUM && iobj == SHIELD) { rspeak(329); return; } if (iobj == PHONE) { if (object == COINS || object == SLUGS) { destroy(object); msg = 330; } else msg = 329; rspeak(msg); return; } if (iobj == VEND) { if (object == COINS || object == SLUGS) { destroy(object); move(BATTERIES, g.loc); if (g.prop[BATTERIES] == 1) { rspeak(317); g.prop[VEND] = 1; } g.prop[BATTERIES] = 0; pspeak(BATTERIES, 0); } else rspeak(noway()); return; } /* Put batteries in lamp. There is a glitch here, in that if he tries to get a third set of batteries before the second set has been inserted, the second set disappears! ***fix this some time *** */ if (iobj == LAMP) { if (object != BATTERIES || g.prop[BATTERIES] != 0) msg = noway(); else { g.prop[BATTERIES] = 1; if (enclosed(BATTERIES)) extract(BATTERIES); if (holding(BATTERIES)) drop(BATTERIES, g.loc); g.limit = 400; g.prop[LAMP] = 1; g.lmwarn = FALSE; msg = 188; } rspeak(msg); return; } if (!small(object)) msg = 329; else { if (wearng(object)) bitoff(object, WEARBT); if (worn(object)) g.prop[object] = 0; if (enclosed(object)) extract(object); insert(object, iobj); msg = 54; } rspeak(msg); return; } /* Remove or take from */ void vextract() { int msg; if (object == RING && g.prop[RING] == 2) { prep = 0; iobj = 0; vtake(); return; } msg = 343; if (iobj == 0) { if (!enclosed(object)) msg = 340; iobj = -g.place[object]; } if (g.place[object] != -iobj) msg = 341; if (!ajar(iobj)) msg = 335; if (object == WATER || object == OIL || object == WINE) msg = 342; if (!toting(object) && ((burden(0) + burden(object)) > 15)) msg = 92; if (msg == 343) { if (object == BIRD) { vdrop(); return; } extract(object); } rspeak(msg); return; } /* lock. chain, grate, chest, elfin door Here are the current lock/unlock messages & numbers: 31 you have no keys. 32 it has no lock. 34 it's already locked. 35 the grate is now locked. 36 the grate is now unlocked. 37 it was allready unlocked. 55 you can't unlock the keys. 171 The chain is now unlocked. 172 The chain is now locked. 173 There is nothing here to which the chain can be locked. 224 Your keys are all too large. 234 The wrought-iron door is now locked. 235 The tiny door is now locked. 236 The wrought-iron door is now unlocked. 237 The tiny door is now unlocked. 375 You don't have the right key. 333 the chest is now locked. 334 the chest is now unlocked. 367 The safe's door swings shut. */ void vlock() { int msg, k; if (!hinged(object)) { printf("I don't know how to lock or unlock the %s\n", otxt[objx]); return; } else if (!locks(object)) msg = 32; else if (locked(object)) msg = 34; else if (!athand(KEYS) && !athand(SKEY) && object != SAFE) msg = 31; else { msg = 375; switch (object) { case CHAIN: if (!athand(KEYS)) break; msg = 173; if (g.loc != plac[CHAIN]) break; msg = 172; g.prop[CHAIN] = 2; if (enclosed(CHAIN)) extract(CHAIN); if (holding(CHAIN)) drop(CHAIN, g.loc); g.fixed[CHAIN] = -1; biton(CHAIN, LOCKBT); bitoff(CHAIN, OPENBT); break; case CHEST: if (!athand(KEYS)) break; msg = 334; biton(CHEST, LOCKBT); bitoff(CHEST, OPENBT); break; case TDOOR: case TDOOR2: msg = 224; if (!toting(SKEY)) break; g.prop[TDOOR] = 0; g.prop[TDOOR2] = 0; msg = 234 + (TDOOR2 - object); k = TDOOR + TDOOR2 - object; biton(k, LOCKBT); bitoff(k, OPENBT); biton(object, LOCKBT); bitoff(object, OPENBT); break; case GRATE: if (!athand(KEYS)) break; g.prop[GRATE] = 0; msg = 35; biton(GRATE, LOCKBT); bitoff(GRATE, OPENBT); break; case SAFE: g.prop[SAFE] = 0; msg = 367; biton(SAFE, LOCKBT); bitoff(SAFE, OPENBT); break; } } rspeak(msg); } /* UNLOCK. chain, grate, chest, elfin door. */ void vunlock() { int msg, k; if (object == KEYS || object == SKEY) msg = 55; else if (!hinged(object)) { printf("I don't know how to lock or unlock the %s\n", otxt[objx]); return; } else if (!locked(object)) msg = 37; else if (!locks(object)) msg = 32; else if (object == SAFE) { if (iobj == KEYS || iobj == SKEY) msg = 368; else msg = 342; } else if (!athand(KEYS) && !athand(SKEY)) msg = 31; else { msg = 375; switch (object) { case CHAIN: if (!athand(KEYS)) break; if (g.prop[BEAR] == 0) msg = 41; else { msg = 171; g.prop[CHAIN] = 0; g.fixed[CHAIN] = 0; if (g.prop[BEAR] != 3) g.prop[BEAR] = 2; g.fixed[BEAR] = 2 - g.prop[BEAR]; bitoff(CHAIN, LOCKBT); biton(CHAIN, OPENBT); } break; case CHEST: if (athand(KEYS)) { msg = 333; bitoff(CHEST, LOCKBT); biton(CHEST, OPENBT); } break; case TDOOR: case TDOOR2: /* Elvin door stuff to lock/unlock tiny door w/special key. the damn thing is really at four places, and we want the right messages if he only has 'BIG'keys (or no keys). Also, he can unlock it either while he is big or small. */ msg = 224; if (!athand(SKEY)) break; if (g.closing) { msg = 130; if (!g.panic) g.clock2 = 15; g.panic = TRUE; } else { g.prop[TDOOR] = 1; g.prop[TDOOR2] = 1; msg = 234 + 2 + (TDOOR2 - object); k = TDOOR + (TDOOR2 - object); bitoff(k, LOCKBT); biton(k, OPENBT); bitoff(object, LOCKBT); biton(object, OPENBT); } break; case GRATE: if (!athand(KEYS)) break; if (g.closing) { msg = 130; if (!g.panic) g.clock2 = 15; g.panic = TRUE; } else { g.prop[GRATE] = 1; msg = 36; bitoff(GRATE, LOCKBT); biton(GRATE, OPENBT); } break; default: msg = 33; } } rspeak(msg); } /* LOOK. */ void vlook() { int sloc; if (object != 0) { rspeak(confuz()); return; } /* Look into something (a container). */ if (vessel(iobj)) { if (!ajar(iobj) && opaque(iobj)) rspeak(actmsg[verb]); else if (g.holder[iobj] == 0) rspeak(359); else { putchar(' '); lookin(iobj); } /* Look at something. If written, read it. */ } else if (printed(iobj)) { object = iobj; iobj = 0; vread(); } else if (iobj == SPHERE) { if (!inside(g.loc) || athand(SAPPHIRE)) rspeak(42); else { rspeak(400); printf(" "); sloc = g.place[SAPPHIRE]; if ((g.loc_attrib[sloc] % 2 == 0 || enclosed(SAPPHIRE)) && sloc != 200 && !g.place[LAMP] == sloc && g.prop[LAMP] != 0) rspeak(401); else desclg(sloc); if (sloc == 239 && !g.flg239) { rspeak(403); g.flg239 = TRUE; } printf(" "); rspeak(402); } } else printf("I see nothing special about the %s?\n", iotxt[iobx]); return; } /* look-up vocabulary word in lex-ordered table. words may have two entries with different codes. if minimum acceptable type = 0, then return minimum of different codes. last word CANNOT have two entries(due to binary sort). word is the word to look up. type is the minimum acceptable value, if != 0 return %1000 */ #include #include #include "advent.h" #include "advdec.h" static _CONST struct wac wc[] = { "\"spelunker\"", 1016, "22", 2053, "22", 3012, "34", 2053, "34", 3013, "4-leafed", 5034, "7", 2053, "7", 3011, "?", 3051, "above", 29, "abra", 3050, "abracd", 3050, "across", 42, "alacaz", 3050, "all", 1109, "altar", 90, "and", 6001, "answer", 2035, "anvil", 1091, "ascend", 29, "at", 4009, "attack", 2012, "awaken", 2029, "awkward", 26, "axe", 1028, "back", 8, "ball", 1120, "barren", 40, "bat", 1104, "bats", 1104, "batshit", 1104, "batteries", 1039, "beans", 1024, "bear", 1035, "bed", 16, "bedquilt", 70, "bee", 1087, "beehive", 1097, "bees", 1087, "billboard", 1116, "bird", 1101, "bitch", 2048, "black", 5006, "blast", 2023, "blow", 2036, "blowup", 2023, "boat", 1048, "book", 1110, "booth", 1093, "bottle", 1020, "box", 1055, "brass", 5004, "break", 2028, "bridge", 89, "brief", 2026, "broken", 54, "broom", 1114, "brush", 1114, "brush", 2054, "building", 12, "bumble", 1087, "burn", 2047, "cage", 1004, "cake", 1107, /* value must be mushrooms + 1 */ "cakes", 1107, "call", 2038, "calm", 2010, "canister", 1118, "canyon", 25, "cape", 1047, "capture", 2001, "carpet", 1040, "carry", 2001, "carving", 1115, "cask", 1071, "catch", 2001, "cave", 67, "cavern", 73, "chain", 1064, "chalice", 1070, "chant", 2003, "chasm", 1021, /* troll bridge */ "chest", 1055, "chimney", 78, "clam", 1014, "click", 85, "climb", 56, "cloak", 1047, "close", 2006, "clover", 1073, "cobble", 18, "coins", 1054, "comb", 1096, "complain", 2048, "continue", 7, "continue", 2011, "crack", 33, "crap", 3106, "crap!", 3106, "crawl", 17, "cross", 69, "crown", 1066, "crystal", 5033, "cup", 1070, "cupcakes", 1107, "d", 30, "dark", 22, "debris", 51, "defile", 23, "depression", 63, "descend", 30, "describe", 2052, "detonate", 2023, "devour", 2014, "diagnose", 2051, "dial", 2039, "diamond", 1051, "diamonds", 1051, "dig", 3066, "discard", 2002, "disturb", 2029, "doff", 2002, "dog", 1098, "dome", 35, "don", 2033, "door", 1041, /* giant door */ "down", 30, "down", 4008, "downstream", 5, "downward", 30, "dragon", 1031, "drawing", 1029, "drink", 2015, "drop", 2002, "droplet", 1075, "dump", 2002, "dust", 2054, "dwarf", 1017, "dwarves", 1017, "e", 43, "east", 43, "eat", 2014, "egg", 1056, "eggs", 1056, "elfin", 5019, "emerald", 1059, "empty", 2013, "enter", 3, "entrance", 64, "everything", 1109, "examine", 2052, "excavate", 3066, "exit", 11, "explore", 2011, "extinguish", 2008, "fee", 2025, "fee", 3001, "feed", 2021, "fie", 2025, "fie", 3002, "fight", 2012, "figure", 1027, "fill", 2022, "find", 2019, "fissure", 1012, "fling", 2017, "floor", 58, "flower", 1046, "flowers", 1046, "foe", 2025, "foe", 3003, "follow", 2011, "foo", 2025, "foo", 3004, "food", 1019, "forcd", 1, "forest", 6, "fork", 77, "forward", 7, "fountain", 1103, "four-leafed", 5034, "free", 2002, "fresh", 5010, "from", 4005, "fuck", 3079, "fuck!", 3079, "fum", 2025, "fum", 3005, "gate", 2058, "get", 2044, "geyser", 1037, /* same as volcano */ "giant", 27, "giant", 5029, "glowing", 5031, "gnome", 1105, "go", 2011, "gold", 1050, "golden", 5001, "goto", 2011, "grab", 2032, "grail", 1070, "grate", 1003, "green", 5032, "grey", 5032, "gripe", 2048, "grotto", 91, "guano", 1104, "gully", 13, "h20", 1081, "hall", 38, "headlamp", 1002, "health", 2051, "heave", 2017, "heels", 1067, "help", 3051, "hike", 2011, "hill", 2, "hit", 2034, "hive", 1097, "hocus", 3050, "hole", 52, "holy", 5021, "honey", 1096, "honeycomb", 1096, "horn", 1052, "hound", 1098, "house", 12, "hurl", 2017, "i", 2020, "ice", 88, "ignite", 2023, "in", 19, "in", 4001, "insert", 2045, "inside", 19, "inside", 4001, "into", 4001, "inventory", 2020, "inward", 19, "iron", 5011, "issue", 1016, "jar", 1020, "jerk", 2032, "jewelry", 1053, "jewels", 1053, "jump", 39, "keep", 2001, "keg", 1071, "key", 1090, "keys", 1102, "kick", 2034, "kill", 2012, "knapsack", 1108, "knife", 1018, "knives", 1018, "knoll", 81, "l", 2052, "lamp", 1002, "lantern", 1002, "lead", 5023, "leaden", 5023, "leap", 39, "leather", 5024, "leave", 11, "leave", 2037, "ledge", 83, "left", 36, "light", 1002, "little", 5012, "lock", 2049, "look", 2052, "lost", 3068, "low", 24, "lyre", 1068, "machine", 1038, "magazine", 1016, "main", 76, "map", 2057, "message", 1036, "metal", 5035, "ming", 5016, "mirror", 1023, "mist", 3069, "moss", 1040, "mumble", 2003, "mushroom", 1106, "mushrooms", 1106, "n", 45, "ne", 47, "nest", 1056, "north", 45, "northeast", 47, "northwest", 50, "nothing", 2005, "nowhere", 21, "nugget", 1050, "null", 21, "nw", 50, "oak", 5022, "oaken", 5022, "off", 4006, "office", 76, "oil", 1083, /* in bottle */ "on", 4002, "onto", 4002, "onward", 7, "open", 2004, "opensesame", 3050, "oriental", 72, "out", 11, "outdoo4868788898:8;8<8rs", 32, "outside", 11, "over", 41, "oyster", 1015, "pantry", 57, "passage", 23, "pause", 2030, "pearl", 1061, "persian", 5002, "peruse", 2027, "peyote", 1106, "phone", 1094, "phonebooth", 1094, "phuce", 82, "pick", 2041, "pillow", 1010, "pirate", 1030, "pirloc", 2059, "piss", 3107, "piss!", 3107, "pit", 31, "placate", 2010, "plant", 1024, "platinum", 5017, "play", 2040, "plover", 71, "plugh", 65, "pocus", 3050, "pole", 1009, "pool", 80, "poster", 1113, "pottery", 1058, "pound", 2034, "pour", 2013, "pray", 92, "prayer", 92, "proceed", 2011, "pull", 2032, "punch", 2034, "put", 2042, "pyramid", 1060, "q", 2018, "quartz", 5036, "quit", 2018, "radium", 1119, "rare", 5018, "ration", 1019, "read", 2027, "refill", 2022, "release", 2002, "remove", 2046, "reply", 2035, "report", 2048, "reservoir", 75, "restore", 2031, "retreat", 8, "return", 8, "right", 37, "ring", 1072, "road", 2, "rock", 1119, "rock", 15, "rocks", 1092, "rocks", 1115, "rod", 1005, "room", 59, "rowboat", 1048, "rub", 2016, "ruby", 5020, "rug", 1062, "run", 2011, "rusty", 5028, "s", 46, "sack", 1108, "safe", 1112, "saint-michel", 93, "sandwich", 1019, "sapphire", 1069, "save", 2030, "say", 2003, "score", 2024, "se", 48, "secret", 66, "sesame", 3050, "shadowy", 5027, "shake", 2009, "shards", 1058, "shatter", 2028, "shazam", 3050, "shelf", 83, "shell", 74, "shield", 1118, "ship", 1048, "shit", 3106, "shit!", 3106, "shoes", 1067, "shut", 2006, "silk", 5013, "silken", 5013, "silver", 5014, "sing", 2003, "slab", 61, "slabroom", 61, "slay", 2012, "slide", 79, "slippers", 1067, "slit", 60, "slugs", 1095, "small", 5012, "smash", 2028, "snake", 1011, "south", 46, "southeast", 48, "southwest", 49, "spelunker", 1016, "sphere", 1120, "spices", 1063, "stair", 10, "stairs", 10, "stalagmite", 1026, "star", 5026, "statue", 1074, "steal", 2001, "steel", 5025, "steps", 1007, "steps", 34, "stick", 1049, "sticks", 1049, "stone", 1119, "stop", 3139, "stream", 14, "strike", 2034, "strum", 2040, "suggest", 2048, "surface", 20, "suspend", 2030, "sw", 49, "sweep", 2054, "swim", 3147, "swing", 2009, "sword", 1065, "tablet", 1013, "take", 2001, "tame", 2010, "tasty", 5030, "telephone", 1094, "terse", 2055, "then", 6002, "throw", 2017, "thunder", 84, "tiny", 5012, "to", 4004, "tome", 1110, "toss", 2017, "tote", 2001, "travel", 2011, "treasure", 5015, "tree", 1074, "tree", 3064, "trees", 3064, "trident", 1057, "troll", 1033, "tube", 1118, "tunnel", 23, "turn", 2043, "u", 29, "unbrief", 2026, "unlock", 2050, "unterse", 2055, "up", 29, "up", 4007, "upon", 4002, "upstream", 4, "upward", 29, "used", 5009, "utter", 2003, "valley", 9, "vase", 1058, "velvet", 5007, "vending", 5008, "view", 28, "volcano", 1037, "volume", 1110, "w", 44, "wake", 2029, "waken", 2029, "walk", 2011, "wall", 53, "wall", 1088, /* in blue grotto */ "wand", 1005, "water", 1081, /* in bottle */ "wave", 2009, "wear", 2033, "west", 44, "whack", 2034, "where", 2019, "whirl", 80, "whirlpool", 80, "whisk", 1114, "whiskbroom", 1114, "wicker", 5005, "wine", 1085, /* in bottle */ "with", 4003, "wiz", 2056, "wolf", 1098, "wooden", 5003, "worn", 5009, "worn-out", 5009, "wornout", 5009, "wumpus", 1099, "xyzzy", 62, "y2", 55, "yank", 2032 }; #define MAXWC (sizeof(wc) / sizeof(struct wac)) _PROTOTYPE(int binary, (char *)); int vocab(word, type) char *word; int type; { int v1, v2, temp; if ((v1 = binary(word)) >= 0) { if (v1 > 0 && strcmp(word, wc[v1 - 1].aword) == 0) v2 = v1 - 1; else if (v1 < (MAXWC - 1) && strcmp(word, wc[v1 + 1].aword) == 0) v2 = v1 + 1; else v2 = v1; if (wc[v1].acode > wc[v2].acode) { temp = v1; v1 = v2; v2 = temp; } if (type <= CLASS(wc[v1].acode)) return (wc[v1].acode); else if (type <= CLASS(wc[v2].acode)) return (wc[v2].acode); else return (-1); } else return (-1); } int binary(w) char *w; { int lo, mid, hi, check; lo = 0; hi = MAXWC - 1; do { mid = (lo + hi) / 2; check = strcmp(w, wc[mid].aword); if (check == 0) return (mid); else if (check < 0) hi = mid - 1; else lo = mid + 1; } while (lo <= hi); return (-1); } t...uMakefilevTOURwbltinbuiltins.tablecd.cdirent.cerror.cerror.heval.ceval.hexec.cexec.hexpand.cexpand.hfuncsinit.hinput.cinput.hjobs.cjobs.hmachdep.hmail.cmail.hmain.cmain.hmemalloc.cmemalloc.hmiscbltin.cmkbuiltinsmkinit.cmknodes.cmksignames.cmksyntax.cmktokensmystring.cmystring.hnodes.c.patnodetypesoptions.coptions.houtput.coutput.hparser.cparser.hredir.credir.hshell.hshow.csystesttrap.ctrap.hvar.cvar.h# Makefile for ash. SRCS= builtins.c cd.c dirent.c error.c eval.c exec.c expand.c input.c \ jobs.c mail.c main.c memalloc.c miscbltin.c mystring.c nodes.c \ options.c parser.c redir.c show.c signames.c syntax.c trap.c \ output.c var.c OBJS= builtins.o cd.o dirent.o error.o eval.o exec.o expand.o input.o \ jobs.o mail.o main.o memalloc.o miscbltin.o mystring.o nodes.o \ options.o parser.o redir.o show.o signames.o syntax.o trap.o \ output.o var.o init.o \ bltin/echo.o bltin/expr.o bltin/operators.o bltin/regexp.o # # Set READLINE in shell.h and add -ledit to LIBS if you want to use the # editline package by Simmule Turner and Rich Salz. (The big, bloated # and GPL contaminated FSF readline should work too.) # CPPFLAGS= -DSHELL -I. -D_MINIX -D_POSIX_SOURCE CFLAGS= -wo -i $(CPPFLAGS) LIBS= -ledit CLEANFILES= $(OBJS) \ builtins.c builtins.h init.c mkinit mknodes mksignames mksyntax \ nodes.c nodes.h signames.c signames.h syntax.c syntax.h token.def \ bltin/operators.h bltin/operators.c all: sh sh: $(OBJS) $(CC) $(CFLAGS) -o sh $(OBJS) $(LIBS) install -S 12kw sh install: /usr/bin/ash /usr/bin/sh /bin/sh /usr/bin/ash: sh install -cs -o bin $? $@ /usr/bin/sh: /usr/bin/ash install -l $? $@ /bin/sh: /usr/bin/ash install -lcs $? $@ clean: rm -f $(CLEANFILES) sh core parser.o: token.def token.def: mktokens sh mktokens builtins.c builtins.h: builtins.table shell.h sh mkbuiltins shell.h builtins.table init.o: mkinit $(SRCS) ./mkinit '$(CC) -c $(CFLAGS) init.c' $(SRCS) mkinit: mkinit.c $(CC) $(CFLAGS) mkinit.c -o $@ nodes.c nodes.h: mknodes nodetypes nodes.c.pat ./mknodes nodetypes nodes.c.pat mknodes: mknodes.c $(CC) $(CFLAGS) mknodes.c -o $@ signames.c signames.h: mksignames ./mksignames mksignames: mksignames.c $(CC) $(CFLAGS) mksignames.c -o $@ syntax.c syntax.h: mksyntax ./mksyntax mksyntax: mksyntax.c parser.h $(CC) $(CFLAGS) mksyntax.c -o $@ bltin/operators.h: bltin/mkexpr bltin/binary_op bltin/unary_op cd bltin && sh mkexpr bltin/echo.o: bltin/echo.c cd bltin && $(CC) -I.. $(CFLAGS) -c echo.c bltin/expr.o: bltin/expr.c cd bltin && $(CC) -I.. $(CFLAGS) -c expr.c bltin/operators.o: bltin/operators.c cd bltin && $(CC) -I.. $(CFLAGS) -c operators.c bltin/regexp.o: bltin/regexp.c cd bltin && $(CC) -I.. $(CFLAGS) -c regexp.c # Dependencies you say? This will have to do. $(OBJS): error.h eval.h exec.h expand.h init.h input.h \ jobs.h machdep.h mail.h main.h memalloc.h mystring.h options.h \ output.h parser.h redir.h shell.h trap.h var.h \ builtins.h nodes.h signames.h syntax.h bltin/expr.o bltin/operators.o: bltin/operators.h # @(#)TOUR 5.1 (Berkeley) 3/7/91 A Tour through Ash Copyright 1989 by Kenneth Almquist. DIRECTORIES: The subdirectory bltin contains commands which can be compiled stand-alone. The rest of the source is in the main ash directory. SOURCE CODE GENERATORS: Files whose names begin with "mk" are programs that generate source code. A complete list of these programs is: program intput files generates ------- ------------ --------- mkbuiltins builtins builtins.h builtins.c mkinit *.c init.c mknodes nodetypes nodes.h nodes.c mksignames - signames.h signames.c mksyntax - syntax.h syntax.c mktokens - token.def bltin/mkexpr unary_op binary_op operators.h operators.c There are undoubtedly too many of these. Mkinit searches all the C source files for entries looking like: INIT { x = 1; /* executed during initialization */ } RESET { x = 2; /* executed when the shell does a longjmp back to the main command loop */ } SHELLPROC { x = 3; /* executed when the shell runs a shell procedure */ } It pulls this code out into routines which are when particular events occur. The intent is to improve modularity by isolating the information about which modules need to be explicitly initialized/reset within the modules themselves. Mkinit recognizes several constructs for placing declarations in the init.c file. INCLUDE "file.h" includes a file. The storage class MKINIT makes a declaration available in the init.c file, for example: MKINIT int funcnest; /* depth of function calls */ MKINIT alone on a line introduces a structure or union declara- tion: MKINIT struct redirtab { short renamed[10]; }; Preprocessor #define statements are copied to init.c without any special action to request this. INDENTATION: The ash source is indented in multiples of six spaces. The only study that I have heard of on the subject con- cluded that the optimal amount to indent is in the range of four to six spaces. I use six spaces since it is not too big a jump from the widely used eight spaces. If you really hate six space indentation, use the adjind (source included) program to change it to something else. EXCEPTIONS: Code for dealing with exceptions appears in exceptions.c. The C language doesn't include exception handling, so I implement it using setjmp and longjmp. The global variable exception contains the type of exception. EXERROR is raised by calling error. EXINT is an interrupt. EXSHELLPROC is an excep- tion which is raised when a shell procedure is invoked. The pur- pose of EXSHELLPROC is to perform the cleanup actions associated with other exceptions. After these cleanup actions, the shell can interpret a shell procedure itself without exec'ing a new copy of the shell. INTERRUPTS: In an interactive shell, an interrupt will cause an EXINT exception to return to the main command loop. (Exception: EXINT is not raised if the user traps interrupts using the trap command.) The INTOFF and INTON macros (defined in exception.h) provide uninterruptable critical sections. Between the execution of INTOFF and the execution of INTON, interrupt signals will be held for later delivery. INTOFF and INTON can be nested. MEMALLOC.C: Memalloc.c defines versions of malloc and realloc which call error when there is no memory left. It also defines a stack oriented memory allocation scheme. Allocating off a stack is probably more efficient than allocation using malloc, but the big advantage is that when an exception occurs all we have to do to free up the memory in use at the time of the exception is to restore the stack pointer. The stack is implemented using a linked list of blocks. STPUTC: If the stack were contiguous, it would be easy to store strings on the stack without knowing in advance how long the string was going to be: p = stackptr; *p++ = c; /* repeated as many times as needed */ stackptr = p; The folloing three macros (defined in memalloc.h) perform these operations, but grow the stack if you run off the end: STARTSTACKSTR(p); STPUTC(c, p); /* repeated as many times as needed */ grabstackstr(p); We now start a top-down look at the code: MAIN.C: The main routine performs some initialization, executes the user's profile if necessary, and calls cmdloop. Cmdloop is repeatedly parses and executes commands. OPTIONS.C: This file contains the option processing code. It is called from main to parse the shell arguments when the shell is invoked, and it also contains the set builtin. The -i and -j op- tions (the latter turns on job control) require changes in signal handling. The routines setjobctl (in jobs.c) and setinteractive (in trap.c) are called to handle changes to these options. PARSING: The parser code is all in parser.c. A recursive des- cent parser is used. Syntax tables (generated by mksyntax) are used to classify characters during lexical analysis. There are three tables: one for normal use, one for use when inside single quotes, and one for use when inside double quotes. The tables are machine dependent because they are indexed by character vari- ables and the range of a char varies from machine to machine. PARSE OUTPUT: The output of the parser consists of a tree of nodes. The various types of nodes are defined in the file node- types. Nodes of type NARG are used to represent both words and the con- tents of here documents. An early version of ash kept the con- tents of here documents in temporary files, but keeping here do- cuments in memory typically results in significantly better per- formance. It would have been nice to make it an option to use temporary files for here documents, for the benefit of small machines, but the code to keep track of when to delete the tem- porary files was complex and I never fixed all the bugs in it. (AT&T has been maintaining the Bourne shell for more than ten years, and to the best of my knowledge they still haven't gotten it to handle temporary files correctly in obscure cases.) The text field of a NARG structure points to the text of the word. The text consists of ordinary characters and a number of special codes defined in parser.h. The special codes are: CTLVAR Variable substitution CTLENDVAR End of variable substitution CTLBACKQ Command substitution CTLBACKQ|CTLQUOTE Command substitution inside double quotes CTLESC Escape next character A variable substitution contains the following elements: CTLVAR type name '=' [ alternative-text CTLENDVAR ] The type field is a single character specifying the type of sub- stitution. The possible types are: VSNORMAL $var VSMINUS ${var-text} VSMINUS|VSNUL ${var:-text} VSPLUS ${var+text} VSPLUS|VSNUL ${var:+text} VSQUESTION ${var?text} VSQUESTION|VSNUL ${var:?text} VSASSIGN ${var=text} VSASSIGN|VSNUL ${var=text} In addition, the type field will have the VSQUOTE flag set if the variable is enclosed in double quotes. The name of the variable comes next, terminated by an equals sign. If the type is not VSNORMAL, then the text field in the substitution follows, ter- minated by a CTLENDVAR byte. Commands in back quotes are parsed and stored in a linked list. The locations of these commands in the string are indicated by CTLBACKQ and CTLBACKQ+CTLQUOTE characters, depending upon whether the back quotes were enclosed in double quotes. The character CTLESC escapes the next character, so that in case any of the CTL characters mentioned above appear in the input, they can be passed through transpH8J8K8L8M8N8O8P8Q8R8arently. CTLESC is also used to escape '*', '?', '[', and '!' characters which were quoted by the user and thus should not be used for file name generation. CTLESC characters have proved to be particularly tricky to get right. In the case of here documents which are not subject to variable and command substitution, the parser doesn't insert any CTLESC characters to begin with (so the contents of the text field can be written without any processing). Other here docu- ments, and words which are not subject to splitting and file name generation, have the CTLESC characters removed during the vari- able and command substitution phase. Words which are subject splitting and file name generation have the CTLESC characters re- moved as part of the file name phase. EXECUTION: Command execution is handled by the following files: eval.c The top level routines. redir.c Code to handle redirection of input and output. jobs.c Code to handle forking, waiting, and job control. exec.c Code to to path searches and the actual exec sys call. expand.c Code to evaluate arguments. var.c Maintains the variable symbol table. Called from expand.c. EVAL.C: Evaltree recursively executes a parse tree. The exit status is returned in the global variable exitstatus. The alter- native entry evalbackcmd is called to evaluate commands in back quotes. It saves the result in memory if the command is a buil- tin; otherwise it forks off a child to execute the command and connects the standard output of the child to a pipe. JOBS.C: To create a process, you call makejob to return a job structure, and then call forkshell (passing the job structure as an argument) to create the process. Waitforjob waits for a job to complete. These routines take care of process groups if job control is defined. REDIR.C: Ash allows file descriptors to be redirected and then restored without forking off a child process. This is accom- plished by duplicating the original file descriptors. The redir- tab structure records where the file descriptors have be dupli- cated to. EXEC.C: The routine find_command locates a command, and enters the command in the hash table if it is not already there. The third argument specifies whether it is to print an error message if the command is not found. (When a pipeline is set up, find_command is called for all the commands in the pipeline be- fore any forking is done, so to get the commands into the hash table of the parent process. But to make command hashing as transparent as possible, we silently ignore errors at that point and only print error messages if the command cannot be found later.) The routine shellexec is the interface to the exec system call. EXPAND.C: Arguments are processed in three passes. The first (performed by the routine argstr) performs variable and command substitution. The second (ifsbreakup) performs word splitting and the third (expandmeta) performs file name generation. If the "/u" directory is simulated, then when "/u/username" is replaced by the user's home directory, the flag "didudir" is set. This tells the cd command that it should print out the directory name, just as it would if the "/u" directory were implemented using symbolic links. VAR.C: Variables are stored in a hash table. Probably we should switch to extensible hashing. The variable name is stored in the same string as the value (using the format "name=value") so that no string copying is needed to create the environment of a com- mand. Variables which the shell references internally are preal- located so that the shell can reference the values of these vari- ables without doing a lookup. When a program is run, the code in eval.c sticks any environment variables which precede the command (as in "PATH=xxx command") in the variable table as the simplest way to strip duplicates, and then calls "environment" to get the value of the environment. There are two consequences of this. First, if an assignment to PATH precedes the command, the value of PATH before the assign- ment must be remembered and passed to shellexec. Second, if the program turns out to be a shell procedure, the strings from the environment variables which preceded the command must be pulled out of the table and replaced with strings obtained from malloc, since the former will automatically be freed when the stack (see the entry on memalloc.c) is emptied. BUILTIN COMMANDS: The procedures for handling these are scat- tered throughout the code, depending on which location appears most appropriate. They can be recognized because their names al- ways end in "cmd". The mapping from names to procedures is specified in the file builtins, which is processed by the mkbuil- tins command. A builtin command is invoked with argc and argv set up like a normal program. A builtin command is allowed to overwrite its arguments. Builtin routines can call nextopt to do option pars- ing. This is kind of like getopt, but you don't pass argc and argv to it. Builtin routines can also call error. This routine normally terminates the shell (or returns to the main command loop if the shell is interactive), but when called from a builtin command it causes the builtin command to terminate with an exit status of 2. The directory bltins contains commands which can be compiled in- dependently but can also be built into the shell for efficiency reasons. The makefile in this directory compiles these programs in the normal fashion (so that they can be run regardless of whether the invoker is ash), but also creates a library named bltinlib.a which can be linked with ash. The header file bltin.h takes care of most of the differences between the ash and the stand-alone environment. The user should call the main routine "main", and #define main to be the name of the routine to use when the program is linked into ash. This #define should appear before bltin.h is included; bltin.h will #undef main if the pro- gram is to be compiled stand-alone. CD.C: This file defines the cd and pwd builtins. The pwd com- mand runs /bin/pwd the first time it is invoked (unless the user has already done a cd to an absolute pathname), but then remembers the current directory and updates it when the cd com- mand is run, so subsequent pwd commands run very fast. The main complication in the cd command is in the docd command, which resolves symbolic links into actual names and informs the user where the user ended up if he crossed a symbolic link. SIGNALS: Trap.c implements the trap command. The routine set- signal figures out what action should be taken when a signal is received and invokes the signal system call to set the signal ac- tion appropriately. When a signal that a user has set a trap for is caught, the routine "onsig" sets a flag. The routine dotrap is called at appropriate points to actually handle the signal. When an interrupt is caught and no trap has been set for that signal, the routine "onint" in error.c is called. OUTPUT: Ash uses it's own output routines. There are three out- put structures allocated. "Output" represents the standard out- put, "errout" the standard error, and "memout" contains output which is to be stored in memory. This last is used when a buil- tin command appears in backquotes, to allow its output to be col- lected without doing any I/O through the UNIX operating system. The variables out1 and out2 normally point to output and errout, respectively, but they are set to point to memout when appropri- ate inside backquotes. INPUT: The basic input routine is pgetc, which reads from the current input file. There is a stack of input files; the current input file is the top file on this stack. The code allows the input to come from a string rather than a file. (This is for the -c option and the "." and eval builtin commands.) The global variable plinno is saved and restored when files are pushed and popped from the stack. The parser routines store the number of the current line in this variable. DEBUGGING: If DEBUG is defined in shell.h, then the shell will write debugging information to the file $HOME/trace. Most of this is done using the TRACE macro, which takes a set of printf arguments inside two sets of parenthesis. Example: "TRACE(("n=%d0, n))". The double parenthesis are necessary be- cause the preprocessor can't handle functions with a variable number of arguments. Defining DEBUG also causes the shell to generate a core dump if it is sent a quit signal. The tracing code is in show.c. w.t..xLICENSEybinary_opzbltin.h{catf.c|echo.c}error.c~expr.cline.cmakefile.notmkexprnlecho.cregexp.cstalloc.cumask.cunary_op ASH GENERAL PUBLIC LICENSE 1. You may copy and distribute ash code or code derived from it in source or object form, provided that you conspicuously and appropriately publish on each copy a valid copyright notice "Copyright 1989 by Kenneth Almquist." (or with whatever year is appropriate); keep intact the notices on all files that refer to this License Agreement and to the absence of any warranty; and give any other recipients of the ash program a copy of this License Agreement along with the program. 2. You may not copy, sublicense, distribute or transfer ash except as expressly provided under this License Agreement. Any attempt otherwise to copy, sublicense, distribute or transfer ash is void and your rights to use ash under this License agreement shall be automatically terminated. However, parties who have received computer software programs from you with this License Agreement will not have their licenses terminated so long as such parties remain in full compliance. NO WARRANTY Because ash is licensed free of charge, I provide absolutely no warranty, to the extent permitted by applicable state law. Except when otherwise stated in writing, Kenneth Almquist and/or other parties provide ash "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program is with you. Should the ash program prove defective, you assume the cost of all necessary servicing, repair or correction. In no event unless required by applicable law will Kenneth Almquist and/or any other party who may modify and redistribute ash as permitted above, be liable to you for damages, including any lost profits, lost monies, or other special, incidental or consequential damages arising out of the use or inability to use (including but not limited to loss of data or data being rendered inaccurate or losses sustained by third parties or a failure of the program to operate with programs provided by other parties) the program, even if you have been advised of the possibility of such damages, or for any claim by any other party. # List of binary operators used by test/expr. # # Copyright 1989 by Kenneth Almquist. All rights reserved. # This file is part of ash, which is distributed under the terms specified # by the Ash General Public License. See the file named LICENSE. OR1 -o 1 OR2 | 1 AND1 -a 2 AND2 & 2 STREQ = 4 OP_STRING STRNE != 4 OP_STRING NEWER -newer 4 OP_STRING EQ -eq 4 OP_INT NE -ne 4 OP_INT GT -gt 4 OP_INT LT -lt 4 OP_INT LE -le 4 OP_INT GE -ge 4 OP_INT PLUS + 5 OP_INT MINUS - 5 OP_INT TIMES * 6 OP_INT DIVIDE / 6 OP_INT REM % 6 OP_INT MATCHPAT : 7 OP_STRING /* * This file is included by programs which are optionally built into the * shell. If SHELL is defined, we try to map the standard UNIX library * routines to ash routines using defines. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #include "../shell.h" #include "../mystring.h" #ifdef SHELL #include "../output.h" #define stdout out1 #define stderr out2 #define printf out1fmt #define putc(c, file) outc(c, file) #define putchar(c) out1c(c) #define fprintf outfmt #define fputs outstr #define fflush flushout #define INITARGS(argv) #else #undef NULL #include #undef main #define INITARGS(argv) if ((commandname = argv[0]) == NULL) {fputs("Argc is zero\n", stderr); exit(2);} else #endif #ifdef __STDC__ pointer stalloc(int); void error(char *, ...); #else pointer stalloc(); void error(); #endif extern char *commandname; /* * Copy the files given as arguments to the standard output. The file * name "-" refers to the standard input. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #define main catfcmd #include "bltin.h" #include "../error.h" #include #include #ifdef SBUFSIZE #define BUFSIZE() SBUFSIZE #else #ifdef MAXBSIZE #define BUFSIZE() MAXBSIZE #else #define BUFSIZE() BSIZE #endif #endif main(argc, argv) char **argv; { char *filename; char *buf = stalloc(BUFSIZE()); int fd; int i; #ifdef SHELL volatile int input; struct jmploc jmploc; struct jmploc *volatile savehandler; #endif INITARGS(argv); #ifdef SHELL input = -1; if (setjmp(jmploc.loc)) { close(input); handler = savehandler; longjmp(handler, 1); } savehandler = handler; handler = &jmploc; #endif while ((filename = *++argv) != NULL) { if (filename[0] == '-' && filename[1] == '\0') { fd = 0; } else { #ifdef SHELL INTOFF; if ((fd = open(filename, O_RDONLY)) < 0) error("Can't open %s", filename); input = fd; INTON; #else if ((fd = open(filename, O_RDONLY)) < 0) { fprintf(stderr, "catf: Can't open %s\n", filename); exit(2); } #endif } while ((i = read(fd, buf, BUFSIZE())) > 0) { #ifdef SHELL if (out1 == &memout) { register char *p; for (p = buf ; --i >= 0 ; p++) { outc(*p, &memout); } } else { write(1, buf, i); } #else write(1, buf, i); #endif } if (fd != 0) close(fd); } #ifdef SHELL handler = savehandler; #endif } /* * Echo command. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #define main echocmd #include "bltin.h" #undef eflag main(argc, argv) char **argv; { register char **ap; register char *p; register char c; int count; int nflag = 0; #ifndef eflag int eflag = 0; #endif ap = argv; if (argc) ap++; if ((p = *ap) != NULL) { if (equal(p, "--")) { ap++; } if (equal(p, "-n")) { nflag++; ap++; } else if (equal(p, "-e")) { #ifndef eflag eflag++; #endif ap++; } } while ((p = *ap++) != NULL) { while ((c = *p++) != '\0') { if (c == '\\' && eflag) { switch (*p++) { case 'b': c = '\b'; break; case 'c': return 0; /* exit */ case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; case '\\': break; /* c = '\\' */ case '0': c = 0; count = 3; while (--count >= 0 && (unsigned)(*p - '0') < 8) c = (c << 3) + (*p++ - '0'); break; default: p--; break; } } putchar(c); } if (*ap) putchar(' '); } if (! nflag) putchar('\n'); return 0; } /* * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #include char *commandname; void #ifdef __STDC__ error(char *msg, ...) { #else error(msg) char *msg; { #endif fprintf(stderr, "%s: %s\n", commandname, msg); exit(2); } /* * The expr and test commands. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #define main exprcmd #include "bltin.h" #include "operators.h" #include #include #ifndef S_ISLNK #define lstat stat #define S_ISLNK(mode) (0) #endif #define STACKSIZE 12 #define NESTINCR 16 /* data types */ #define STRING 0 #define INTEGER 1 #define BOOLEAN 2 /* * This structure hold a value. The type keyword specifies the type of * the value, and the union u holds the value. The value of a boolean * is stored in u.num (1 = TRUE, 0 = FALSE). */ struct value { int type; union { char *string; long num; } u; }; struct operator { short op; /* which operator */ short pri; /* priority of operator */ }; struct filestat { int op; /* OP_FILE or OP_LFILE */ char *name; /* name of file */ int rcode; /* return code from stat */ struct stat stat; /* status info on file */ }; extern char *match_begin[10]; /* matched string */ extern short match_length[10]; /* defined in regexp.c */ extern short number_parens; /* number of \( \) pairs */ #ifdef __STDC__ int expr_is_false(struct value *); void expr_operator(int, struct value *, struct filestat *); int lookup_op(char *, char *const*); char *re_compile(char *); /* defined in regexp.c */ int re_match(char *, char *); /* defined in regexp.c */ long atol(const char *); #else int expr_is_false(); void expr_operator(); int lookup_op(); char *re_compile(); /* defined in regexp.c */ int re_match(); /* defined in regexp.c */ long atol(); #endif main(argc, argv) char **argv; { char **ap; char *opname; char c; char *p; int print; int nest; /* parenthises nesting */ int op; int pri; int skipping; int binary; struct operator opstack[STACKSIZE]; struct operator *opsp; struct value valstack[STACKSIZE + 1]; struct value *valsp; struct filestat fs; INITARGS(argv); c = **argv; print = 1; if (c == 't') print = 0; else if (c == '[') { if (! equal(argv[argc - 1], "]")) error("missing ]"); argv[argc - 1] = NULL; print = 0; } ap = argv + 1; fs.name = NULL; /* * We use operator precedence parsing, evaluating the expression * as we parse it. Parentheses are handled by bumping up the * priority of operators using the variable "nest." We use the * variable "skipping" to turn off evaluation temporarily for the * short circuit boolean operators. (It is important do the short * circuit evaluation because under NFS a stat operation can take * infinitely long.) */ nest = 0; skipping = 0; opsp = opstack + STACKSIZE; valsp = valstack; if (*ap == NULL) { valstack[0].type = BOOLEAN; valstack[0].u.num = 0; goto done; } for (;;) { opname = *ap++; if (opname == NULL) syntax: error("syntax error"); if (opname[0] == '(' && opname[1] == '\0') { nest += NESTINCR; continue; } else if (*ap && (op = lookup_op(opname, unary_op)) >= 0) { if (opsp == &opstack[0]) overflow: error("Expression too complex"); --opsp; opsp->op = op; opsp->pri = op_priority[op] + nest; continue; } else { valsp->type = STRING; valsp->u.string = opname; valsp++; } for (;;) { opname = *ap++; if (opname == NULL) { if (nest != 0) goto syntax; pri = 0; break; } if (opname[0] != ')' || opname[1] != '\0') { if ((op = lookup_op(opname, binary_op)) < 0) goto syntax; op += FIRST_BINARY_OP; pri = op_priority[op] + nest; break; } if ((nest -= NESTINCR) < 0) goto syntax; } while (opsp < &opstack[STACKSIZE] && opsp->pri >= pri) { binary = opsp->op; for (;;) { valsp--; c = op_argflag[opsp->op]; if (c == OP_INT) { if (valsp->type == STRING) valsp->u.num = atol(valsp->u.string); valsp->type = INTEGER; } else if (c >= OP_STRING) { /* OP_STRING or OP_FILE */ if (valsp->type == INTEGER) { p = stalloc(32); #ifdef SHELL fmtstr(p, 32, "%d", valsp->u.num); #else sprintf(p, "%d", valsp->u.num); #endif valsp->u.string = p; } else if (valsp->type == BOOLEAN) { if (valsp->u.num) valsp->u.string = "true"; else valsp->u.string = ""; } valsp->type = STRING; if (c >= OP_FILE && (fs.op != c || fs.name == NULL || ! equal(fs.name, valsp->u.string))) { fs.op = c; fs.name = valsp->u.string; if (c == OP_FILE) { fs.rcode = stat(valsp->u.string, &fs.stat); } else { fs.rcode = lstat(valsp->u.string, &fs.stat); } } } if (binary < FIRST_BINARY_OP) break; binary = 0; } if (! skipping) expr_operator(opsp->op, valsp, &fs); else if (opsp->op == AND1 || opsp->op == OR1) skipping--; valsp++; /* push value */ opsp++; /* pop operator */ } if (opname == NULL) break; if (opsp == &opstack[0]) goto overflow; if (op == AND1 || op == AND2) { op = AND1; if (skipping || expr_is_false(valsp - 1)) skipping++; } if (op == OR1 || op == OR2) { op = OR1; if (skipping || ! expr_is_false(valsp - 1)) skipping++; } opsp--; opsp->op = op; opsp->pri = pri; } done: if (print) { if (valstack[0].type == STRING) printf("%s\n", valstack[0].u.string); else if (valstack[0].type == INTEGER) printf("%ld\n", valstack[0].u.num); else if (valstack[0].u.num != 0) printf("true\n"); } return expr_is_false(&valstack[0]); } int expr_is_false(val) struct value *val; { if (val->type == STRING) { if (val->u.string[0] == '\0') return 1; } else { /* INTEGER or BOOLEAN */ if (val->u.num == 0) return 1; } return 0; } /* * Execute an operator. Op is the operator. Sp is the stack pointer; * sp[0] refers to the first operand, sp[1] refers to the second operand * (if any), and the result is placed in sp[0]. The operands are converted * to the type expected by the operator before expr_operator is called. * Fs is a pointer to a structure which holds the value of the last call * to stat, to avoid repeated stat calls on the same file. */ void expr_operator(op, sp, fs) int op; struct value *sp; struct filestat *fs; { int i; struct stat st1, st2; switch (op) { case NOT: sp->u.num = expr_is_false(sp); sp->type = BOOLEAN; break; case ISREAD: i = 04; goto permission; case ISWRITE: i = 02; goto permission; case ISEXEC: i = 01; permission: if (fs->stat.st_uid == geteuid()) i <<= 6; else if (fs->stat.st_gid == getegid()) i <<= 3; goto filebit; /* true if (stat.st_mode & i) != 0 */ case ISFILE: i = S_IFREG; goto filetype; case ISDIR: i = S_IFDIR; goto filetype; case ISCHAR: i = S_IFCHR; goto filetype; case ISBLOCK: i = S_IFBLK; goto filetype; case ISFIFO: #ifdef S_IFIFO i = S_IFIFO; goto filetype; #else goto false; #endif filetype: if ((fs->stat.st_mode & S_IFMT) == i && fs->rcode >= 0) { true: sp->u.num = 1; } else { false: sp->u.num = 0; } sp->type = BOOLEAN; break; case ISSETUID: i = S_ISUID; goto filebit; case ISSETGID: i = S_ISGID; goto filebit; case ISSTICKY: i = S_ISVTX; filebit: if (fs->stat.st_mode & i && fs->rcode >= 0) goto true; goto false; case ISSIZE: sp->u.num = fs->rcode >= 0? fs->stat.st_size : 0L; sp->type = INTEGER; break; case ISLINKe8g8h8i81: case ISLINK2: if (S_ISLNK(fs->stat.st_mode) && fs->rcode >= 0) goto true; fs->op = OP_FILE; /* not a symlink, so expect a -d or so next */ goto false; case NEWER: if (stat(sp->u.string, &st1) != 0) { sp->u.num = 0; } else if (stat((sp + 1)->u.string, &st2) != 0) { sp->u.num = 1; } else { sp->u.num = st1.st_mtime >= st2.st_mtime; } sp->type = INTEGER; break; case ISTTY: sp->u.num = isatty(sp->u.num); sp->type = BOOLEAN; break; case NULSTR: if (sp->u.string[0] == '\0') goto true; goto false; case STRLEN: sp->u.num = strlen(sp->u.string); sp->type = INTEGER; break; case OR1: case AND1: /* * These operators are mostly handled by the parser. If we * get here it means that both operands were evaluated, so * the value is the value of the second operand. */ *sp = *(sp + 1); break; case STREQ: case STRNE: i = 0; if (equal(sp->u.string, (sp + 1)->u.string)) i++; if (op == STRNE) i = 1 - i; sp->u.num = i; sp->type = BOOLEAN; break; case EQ: if (sp->u.num == (sp + 1)->u.num) goto true; goto false; case NE: if (sp->u.num != (sp + 1)->u.num) goto true; goto false; case GT: if (sp->u.num > (sp + 1)->u.num) goto true; goto false; case LT: if (sp->u.num < (sp + 1)->u.num) goto true; goto false; case LE: if (sp->u.num <= (sp + 1)->u.num) goto true; goto false; case GE: if (sp->u.num >= (sp + 1)->u.num) goto true; goto false; case PLUS: sp->u.num += (sp + 1)->u.num; break; case MINUS: sp->u.num -= (sp + 1)->u.num; break; case TIMES: sp->u.num *= (sp + 1)->u.num; break; case DIVIDE: if ((sp + 1)->u.num == 0) error("Division by zero"); sp->u.num /= (sp + 1)->u.num; break; case REM: if ((sp + 1)->u.num == 0) error("Division by zero"); sp->u.num %= (sp + 1)->u.num; break; case MATCHPAT: { char *pat; pat = re_compile((sp + 1)->u.string); if (re_match(pat, sp->u.string)) { if (number_parens > 0) { sp->u.string = match_begin[1]; sp->u.string[match_length[1]] = '\0'; } else { sp->u.num = match_length[0]; sp->type = INTEGER; } } else { if (number_parens > 0) { sp->u.string[0] = '\0'; } else { sp->u.num = 0; sp->type = INTEGER; } } } break; } } int lookup_op(name, table) char *name; char *const*table; { register char *const*tp; register char const *p; char c = name[1]; for (tp = table ; (p = *tp) != NULL ; tp++) { if (p[1] == c && equal(p, name)) return tp - table; } return -1; } /* * The line command. Reads one line from the standard input and writes it * to the standard output. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #define main linecmd #include "bltin.h" main(argc, argv) char **argv; { char c; for (;;) { if (read(0, &c, 1) != 1) { putchar('\n'); return 1; } putchar(c); if (c == '\n') return 0; } } # Copyright (C) 1989 by Kenneth Almquist. All rights reserved. # This file is part of ash, which is distributed under the terms specified # by the Ash General Public License. See the file named LICENSE. LIBFILES=catfcmd.o echocmd.o exprcmd.o linecmd.o nlechocmd.o\ operators.o regexp.o DEBUG=-g CFLAGS=$(DEBUG) #CC=gcc all:$P bltinlib.a catf echo expr line nlecho true umask bltinlib.a:$P $(LIBFILES) ar rc $@ $(LIBFILES) catf: catf.c bltin.h ../shell.h ../error.h error.o stalloc.o $(CC) $(CFLAGS) -o $@ catf.c error.o stalloc.o catfcmd.o: catf.c bltin.h ../shell.h ../error.h $(CC) -DSHELL $(CFLAGS) -c catf.c mv catf.o $@ expr: expr.c bltin.h ../shell.h operators.h operators.o regexp.o error.o stalloc.o $(CC) $(CFLAGS) -o $@ expr.c operators.o regexp.o error.o stalloc.o -rm -f test '[' ln expr test ln expr '[' exprcmd.o: expr.c bltin.h ../shell.h operators.h $(CC) -DSHELL $(CFLAGS) -c expr.c mv expr.o $@ operators.c operators.h: unary_op binary_op mkexpr ./mkexpr operators.o: ../shell.h operators.h regexp.o: bltin.h ../shell.h echo: echo.c bltin.h ../shell.h $(CC) $(CFLAGS) -o $@ echo.c echocmd.o: echo.c bltin.h ../shell.h $(CC) -DSHELL $(CFLAGS) -c echo.c mv echo.o $@ line: line.c bltin.h ../shell.h $(CC) $(CFLAGS) -o $@ line.c linecmd.o: line.c bltin.h ../shell.h $(CC) -DSHELL $(CFLAGS) -c line.c mv line.o $@ nlecho: nlecho.c bltin.h ../shell.h $(CC) $(CFLAGS) -o $@ nlecho.c nlechocmd.o: nlecho.c bltin.h ../shell.h $(CC) -DSHELL $(CFLAGS) -c nlecho.c mv nlecho.o $@ umask: umask.c bltin.h $(CC) $(CFLAGS) -o $@ umask.c true: > : chmod 755 : rm -f true ln : true stalloc.o: ../shell.h # Copyright 1989 by Kenneth Almquist. All rights reserved. # # This file is part of ash. Ash is distributed under the terms specified # by the Ash General Public License. See the file named LICENSE. # All calls to awk removed, because Minix bawk is deficient. (kjb) exec > operators.h i=0 sed -e '/^[^#]/!d' unary_op binary_op | while read line do set -$- $line echo "#define $1 $i" i=`expr $i + 1` done echo echo "#define FIRST_BINARY_OP" `sed -e '/^[^#]/!d' unary_op | wc -l` echo ' #define OP_INT 1 /* arguments to operator are integer */ #define OP_STRING 2 /* arguments to operator are string */ #define OP_FILE 3 /* argument is a file name */ #define OP_LFILE 4 /* argument is a file name of a symlink? */ extern char *const unary_op[]; extern char *const binary_op[]; extern const char op_priority[]; extern const char op_argflag[];' exec > operators.c echo '/* * Operators used in the expr/test command. */ #include "../shell.h" #include "operators.h" char *const unary_op[] = {' sed -e '/^[^#]/!d s/[ ][ ]*/ /g s/^[^ ][^ ]* \([^ ][^ ]*\).*/ "\1",/ ' unary_op echo ' NULL }; char *const binary_op[] = {' sed -e '/^[^#]/!d s/[ ][ ]*/ /g s/^[^ ][^ ]* \([^ ][^ ]*\).*/ "\1",/ ' binary_op echo ' NULL }; const char op_priority[] = {' sed -e '/^[^#]/!d s/[ ][ ]*/ /g s/^[^ ][^ ]* [^ ][^ ]* \([^ ][^ ]*\).*/ \1,/ ' unary_op binary_op echo '}; const char op_argflag[] = {' sed -e '/^[^#]/!d s/[ ][ ]*/ /g s/^[^ ][^ ]* [^ ][^ ]* [^ ][^ ]*$/& 0/ s/^[^ ][^ ]* [^ ][^ ]* [^ ][^ ]* \([^ ][^ ]*\)/ \1,/ ' unary_op binary_op echo '};' /* * Echo the command argument to the standard output, one line at a time. * This command is useful for debugging th shell and whenever you what * to output strings literally. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #define main nlechocmd #include "bltin.h" main(argc, argv) char **argv; { register char **ap; for (ap = argv + 1 ; *ap ; ap++) { fputs(*ap, stdout); putchar('\n'); } return 0; } /* * Regular expression matching for expr(1). Bugs: The upper bound of * a range specified by the \{ feature cannot be zero. * * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #include "bltin.h" #define RE_END 0 /* end of regular expression */ #define RE_LITERAL 1 /* normal character follows */ #define RE_DOT 2 /* "." */ #define RE_CCL 3 /* "[...]" */ #define RE_NCCL 4 /* "[^...]" */ #define RE_LP 5 /* "\(" */ #define RE_RP 6 /* "\)" */ #define RE_MATCHED 7 /* "\digit" */ #define RE_EOS 8 /* "$" matches end of string */ #define RE_STAR 9 /* "*" */ #define RE_RANGE 10 /* "\{num,num\}" */ char *match_begin[10]; short match_length[10]; short number_parens; static int match(); char * re_compile(pattern) char *pattern; { register char *p; register char c; char *comp; register char *q; char *begin; char *endp; register int len; int first; int type; char *stackp; char stack[10]; int paren_num; int i; char *malloc(); p = pattern; if (*p == '^') p++; comp = q = malloc(2 * strlen(p) + 1); begin = q; stackp = stack; paren_num = 0; for (;;) { switch (c = *p++) { case '\0': *q = '\0'; goto out; case '.': *q++ = RE_DOT; len = 1; break; case '[': begin = q; *q = RE_CCL; if (*p == '^') { *q = RE_NCCL; p++; } q++; first = 1; while (*p != ']' || first == 1) { if (p[1] == '-' && p[2] != ']') { *q++ = '-'; *q++ = p[0]; *q++ = p[2]; p += 3; } else if (*p == '-') { *q++ = '-'; *q++ = '-'; *q++ = '-'; p++; } else { *q++ = *p++; } first = 0; } p++; *q++ = '\0'; len = q - begin; break; case '$': if (*p != '\0') goto dft; *q++ = RE_EOS; break; case '*': if (len == 0) goto dft; type = RE_STAR; range: i = (type == RE_RANGE)? 3 : 1; endp = q + i; begin = q - len; do { --q; *(q + i) = *q; } while (--len > 0); q = begin; *q++ = type; if (type == RE_RANGE) { i = 0; while ((unsigned)(*p - '0') <= 9) i = 10 * i + (*p++ - '0'); *q++ = i; if (*p != ',') { *q++ = i; } else { p++; i = 0; while ((unsigned)(*p - '0') <= 9) i = 10 * i + (*p++ - '0'); *q++ = i; } if (*p != '\\' || *++p != '}') error("RE error"); p++; } q = endp; break; case '\\': if ((c = *p++) == '(') { if (++paren_num > 9) error("RE error"); *q++ = RE_LP; *q++ = paren_num; *stackp++ = paren_num; len = 0; } else if (c == ')') { if (stackp == stack) error("RE error"); *q++ = RE_RP; *q++ = *--stackp; len = 0; } else if (c == '{') { type = RE_RANGE; goto range; } else if ((unsigned)(c - '1') < 9) { /* should check validity here */ *q++ = RE_MATCHED; *q++ = c - '0'; len = 2; } else { goto dft; } break; default: dft: *q++ = RE_LITERAL; *q++ = c; len = 2; break; } } out: if (stackp != stack) error("RE error"); number_parens = paren_num; return comp; } re_match(pattern, string) char *pattern; char *string; { char **pp; match_begin[0] = string; for (pp = &match_begin[1] ; pp <= &match_begin[9] ; pp++) *pp = 0; return match(pattern, string); } static match(pattern, string) char *pattern; char *string; { register char *p, *q; int counting; int low, high, count; char *curpat; char *start_count; int negate; int found; char *r; int len; char c; p = pattern; q = string; counting = 0; for (;;) { if (counting) { if (++count > high) goto bad; p = curpat; } switch (*p++) { case RE_END: match_length[0] = q - match_begin[0]; return 1; case RE_LITERAL: if (*q++ != *p++) goto bad; break; case RE_DOT: if (*q++ == '\0') goto bad; break; case RE_CCL: negate = 0; goto ccl; case RE_NCCL: negate = 1; ccl: found = 0; c = *q++; while (*p) { if (*p == '-') { if (c >= *++p && c <= *++p) found = 1; } else { if (c == *p) found = 1; } p++; } p++; if (found == negate) goto bad; break; case RE_LP: match_begin[*p++] = q; break; case RE_RP: match_length[*p] = q - match_begin[*p]; p++; break; case RE_MATCHED: r = match_begin[*p]; len = match_length[*p++]; while (--len >= 0) { if (*q++ != *r++) goto bad; } break; case RE_EOS: if (*q != '\0') goto bad; break; case RE_STAR: low = 0; high = 32767; goto range; case RE_RANGE: low = *p++; high = *p++; if (high == 0) high = 32767; range: curpat = p; start_count = q; count = 0; counting++; break; } } bad: if (! counting) return 0; len = 1; if (*curpat == RE_MATCHED) len = match_length[curpat[1]]; while (--count >= low) { if (match(p, start_count + count * len)) return 1; } return 0; } /* * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #include "../shell.h" void error(); pointer malloc(); pointer stalloc(nbytes) { register pointer p; if ((p = malloc(nbytes)) == NULL) error("Out of space"); return p; } /* * Copyright (C) 1989 by Kenneth Almquist. All rights reserved. * This file is part of ash, which is distributed under the terms specified * by the Ash General Public License. See the file named LICENSE. */ #include main(argc, argv) char **argv; { int mask; if (argc > 1) { fprintf(stderr, "umask: only builtin version of umask can set value\n"); exit(2); } printf("%.4o\n", umask(0)); return 0; } # List of unary operators used by test/expr. # # Copyright (C) 1989 by Kenneth Almquist. All rights reserved. # This file is part of ash, which is distributed under the terms specified # by the Ash General Public License. See the file named LICENSE. NOT ! 3 ISREAD -r 12 OP_FILE ISWRITE -w 12 OP_FILE ISEXEC -x 12 OP_FILE ISFILE -f 12 OP_FILE ISDIR -d 12 OP_FILE ISCHAR -c 12 OP_FILE ISBLOCK -b 12 OP_FILE ISFIFO -p 12 OP_FILE ISSETUID -u 12 OP_FILE ISSETGID -g 12 OP_FILE ISSTICKY -k 12 OP_FILE ISSIZE -s 12 OP_FILE ISLINK1 -h 12 OP_LFILE ISLINK2 -L 12 OP_LFILE ISTTY -t 12 OP_INT NULSTR -z 12 OP_STRING STRLEN -n 12 OP_STRING #!/bin/sh - # # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)builtins 5.1 (Berkeley) 3/7/91 # # This file lists all the builtin commands. The first column is the name # of a C routine. The -j flag, if present, specifies that this command # is to be excluded from systems without job control. The rest of the line # specifies the command name or names used to run the command. The entry # for nullcmd, which is run when the user does not specify a command, must # come first. # # Copyright (C) 1989 by Kenneth Almquist. All rights reserved. # This file is part of ash, which is distributed under the terms specified # by the Ash General Public License. See the file named LICENSE. bltincmd command #alloccmd alloc bgcmd -j bg breakcmd break continue #catfcmd catf cdcmd cd chdir dotcmd . echocmd echo evalcmd eval execcmd exec exitcmd exit exportcmd export readonly exprcmd expr test [ fgcmd -j fg getoptscmd getopts hashcmd hash jobidcmd jobid jobscmd jobs #lccmd lc #linecmd line localcmd local #nlechocmd nlecho pwdcmd pwd readcmd read returncmd return setcmd set setvarcmd setvar shiftcmd shift trapcmd trap truecmd : true false umaskcmd umask unsetcmd unset waitcmd wait /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)cd.c 5.2 (Berkeley) 3/13/91"; #endif /* not lint */ /* * The cd and pwd commands. */ #include "shell.h" #include "var.h" #include "nodes.h" /* for jobs.h */ #include "jobs.h" #include "options.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #include #include #include #ifdef __STDC__ STATIC int docd(char *, int, int); STATIC void updatepwd(char *); STATIC void getpwd(void); STATIC char *getcomponent(void); #else STATIC int docd(); STATIC void updatepwd(); STATIC void getpwd(); STATIC char *getcomponent(); #endif char *curdir; /* current working directory */ STATIC char *cdcomppath; #if UDIR || TILDE extern int didudir; /* set if /u/logname or ~logname expanded */ #endif int cdcmd(argc, argv) char **argv; { char *dest; char *path; char *p; struct stat statb; char *padvance(); int tohome= 0; nextopt(nullstr); if ((dest = *argptr) == NULL) { if ((dest = bltinlookup("HOME", 1)) == NULL) error("HOME not set"); tohome = 1; } if (*dest == '/' || (path = bltinlookup("CDPATH", 1)) == NULL) path = nullstr; while ((p = padvance(&path, dest)) != NULL) { if (stat(p, &statb) >= 0 && (statb.st_mode & S_IFMT) == S_IFDIR && docd(p, strcmp(p, dest), tohome) >= 0) return 0; } error("can't cd to %s", dest); } /* * Actually do the chdir. If the name refers to symbolic links, we * compute the actual directory name before doing the cd. In an * interactive shell, print the directory name if "print" is nonzero * or if the name refers to a symbolic link. We also print the name * if "/u/logname" was expanded in it, since this is similar to a * symbolic link. (The check for this breaks if the user gives the * cd command some additional, unused arguments.) */ #if SYMLINKS == 0 STATIC int docd(dest, print, tohome) char *dest; { #if UDIR || TILDE if (didudir) print = 1; #endif INTOFF; if (chdir(dest) < 0) { INTON; return -1; } updatepwd(dest); INTON; if (print && iflag) out1fmt("%s\n", stackblock()); return 0; } #else STATIC int docd(dest, print, tohome) char *dest; { register char *p; register char *q; char *symlink; char *component; struct stat statb; int first; int i; TRACE(("docd(\"%s\", %d, %d) called\n", dest, print, tohome)); #if UDIR || TILDE if (didudir) print = 1; #endif top: cdcomppath = dest; STARTSTACKSTR(p); if (*dest == '/') { STPUTC('/', p); cdcomppath++; } first = 1; while ((q = getcomponent()) != NULL) { if (q[0] == '\0' || q[0] == '.' && q[1] == '\0') continue; if (! first) STPUTC('/', p); first = 0; component = q; while (*q) STPUTC(*q++, p); if (equal(component, "..")) continue; STACKSTRNUL(p); if (lstat(stackblock(), &statb) < 0) error("lstat %s failed", stackblock()); if ((statb.st_mode & S_IFMT) != S_IFLNK) continue; /* Hit a symbolic link. We have to start all over again. */ print = 1; STPUTC('\0', p); symlink = grabstackstr(p); i = (int)statb.st_size + 2; /* 2 for '/' and '\0' */ if (cdcomppath != NULL) i += strlen(cdcomppath); p = stalloc(i); if (readlink(symlink, p, (int)statb.st_size) < 0) { error("readlink %s failed", stackblock()); } if (cdcomppath != NULL) { p[(int)statb.st_size] = '/'; scopy(cdcomppath, p + (int)statb.st_size + 1); } else { p[(int)statb.st_size] = '\0'; } if (p[0] != '/') { /* relative path name */ char *r; q = r = symlink; while (*q) { if (*q++ == '/') r = q; } *r = '\0'; dest = stalloc(strlen(symlink) + strlen(p) + 1); scopy(symlink, dest); strcat(dest, p); } else { dest = p; } goto top; } STPUTC('\0', p); p = grabstackstr(p); INTOFF; /* The empty string is not a legal argument to chdir on a POSIX 1003.1 * system. */ if (p[0] != '\0' && chdir(p) < 0) { INTON; return -1; } updatepwd(p); INTON; if (print && !tohome && iflag) out1fmt("%s\n", p); return 0; } #endif /* SYMLINKS */ /* * Get the next component of the path name pointed to by cdcomppath. * This routine overwrites the string pointed to by cdcomppath. */ STATIC char * getcomponent() { register char *p; char *start; if ((p = cdcomppath) == NULL) return NULL; start = cdcomppath; while (*p != '/' && *p != '\0') p++; if (*p == '\0') { cdcomppath = NULL; } else { *p++ = '\0'; cdcomppath = p; } return start; } /* * Update curdir (the name of the current directory) in response to a * cd command. We also call hashcd to let the routines in exec.c know * that the current directory has changed. */ void hashcd(); STATIC void updatepwd(dir) char *dir; { char *new; char *p; hashcd(); /* update command hash table */ cdcomppath = stalloc(strlen(dir) + 1); scopy(dir, cdcomppath); STARTSTACKSTR(new); if (*dir != '/') { if (curdir == NULL) return; p = curdir; while (*p) STPUTC(*p++, new); if (p[-1] == '/') STUNPUTC(new); } while ((p = getcomponent()) != NULL) { if (equal(p, "..")) { while (new > stackblock() && (STUNPUTC(new), *new) != '/'); } else if (*p != '\0' && ! equal(p, ".")) { STPUTC('/', new); while (*p) STPUTC(*p++, new); } } if (new == stackblock()) STPUTC('/', new); STACKSTRNUL(new); if (curdir) ckfree(curdir); curdir = savestr(stackblock()); } int pwdcmd(argc, argv) char **argv; { getpwd(); out1str(curdir); out1c('\n'); return 0; } /* * Run /bin/pwd to find out what the current directory is. We suppress * interrupts throughout most of this, but the user can still break out * of it by killing the pwd program. If we already know the current * directory, this routine returns immediately. */ #define MAXPWD 256 STATIC void getpwd() { char buf[MAXPWD]; char *p; int i; int status; struct job *jp; int pip[2]; if (curdir) return; INTOFF; if (pipe(pip) < 0) error("Pipe call failed"); jp = makejob((union node *)NULL, 1); if (forkshell(jp, (union node *)NULL, FORK_NOJOB) == 0) { close(pip[0]); if (pip[1] != 1) { close(1); copyfd(pip[1], 1); close(pip[1]); } execl("/bin/pwd", "pwd", (char *)0); error("Cannot exec /bin/pwd"); } close(pip[1]); pip[1] = -1; p = buf; while ((i = read(pip[0],88 p, buf + MAXPWD - p)) > 0 || i == -1 && errno == EINTR) { if (i > 0) p += i; } close(pip[0]); pip[0] = -1; status = waitforjob(jp); if (status != 0) error((char *)0); if (i < 0 || p == buf || p[-1] != '\n') error("pwd command failed"); p[-1] = '\0'; curdir = savestr(buf); INTON; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)dirent.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ #include "shell.h" /* definitions for pointer, NULL, DIRENT, and BSD */ #if ! DIRENT #include #include #include #include #include #ifndef S_ISDIR /* macro to test for directory file */ #define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) #endif #ifdef BSD #ifdef __STDC__ int stat(char *, struct stat *); #else int stat(); #endif /* * The BSD opendir routine doesn't check that what is being opened is a * directory, so we have to include the check in a wrapper routine. */ #undef opendir DIR * myopendir(dirname) char *dirname; /* name of directory */ { struct stat statb; if (stat(dirname, &statb) != 0 || ! S_ISDIR(statb.st_mode)) { errno = ENOTDIR; return NULL; /* not a directory */ } return opendir(dirname); } #else /* not BSD */ /* * Dirent routines for old style file systems. */ #ifdef __STDC__ pointer malloc(unsigned); void free(pointer); int open(char *, int, ...); int close(int); int fstat(int, struct stat *); #else pointer malloc(); void free(); int open(); int close(); int fstat(); #endif DIR * opendir(dirname) char *dirname; /* name of directory */ { register DIR *dirp; /* -> malloc'ed storage */ register int fd; /* file descriptor for read */ struct stat statb; /* result of fstat() */ #ifdef O_NDELAY fd = open(dirname, O_RDONLY|O_NDELAY); #else fd = open(dirname, O_RDONLY); #endif if (fd < 0) return NULL; /* errno set by open() */ if (fstat(fd, &statb) != 0 || !S_ISDIR(statb.st_mode)) { (void)close(fd); errno = ENOTDIR; return NULL; /* not a directory */ } if ((dirp = (DIR *)malloc(sizeof(DIR))) == NULL) { (void)close(fd); errno = ENOMEM; return NULL; /* not enough memory */ } dirp->dd_fd = fd; dirp->dd_nleft = 0; /* refill needed */ return dirp; } int closedir(dirp) register DIR *dirp; /* stream from opendir() */ { register int fd; if (dirp == NULL) { errno = EFAULT; return -1; /* invalid pointer */ } fd = dirp->dd_fd; free((pointer)dirp); return close(fd); } struct dirent * readdir(dirp) register DIR *dirp; /* stream from opendir() */ { register struct direct *dp; register char *p, *q; register int i; do { if ((dirp->dd_nleft -= sizeof (struct direct)) < 0) { if ((i = read(dirp->dd_fd, (char *)dirp->dd_buf, DIRBUFENT*sizeof(struct direct))) <= 0) { if (i == 0) errno = 0; /* unnecessary */ return NULL; /* EOF or error */ } dirp->dd_loc = dirp->dd_buf; dirp->dd_nleft = i - sizeof (struct direct); } dp = dirp->dd_loc++; } while (dp->d_ino == 0); dirp->dd_entry.d_ino = dp->d_ino; /* now copy the name, nul terminating it */ p = dp->d_name; q = dirp->dd_entry.d_name; i = DIRSIZ; while (--i >= 0 && *p != '\0') *q++ = *p++; *q = '\0'; return &dirp->dd_entry; } #endif /* BSD */ #endif /* DIRENT */ /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)error.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * Errors and exceptions. */ #include "shell.h" #include "main.h" #include "options.h" #include "output.h" #include "error.h" #include #include #ifdef __STDC__ #include "stdarg.h" #else #include #endif #include /* * Code to handle exceptions in C. */ struct jmploc *handler; int exception; volatile int suppressint; volatile int intpending; char *commandname; /* * Called to raise an exception. Since C doesn't include exceptions, we * just do a longjmp to the exception handler. The type of exception is * stored in the global variable "exception". */ void exraise(e) { if (handler == NULL) abort(); exception = e; longjmp(handler->loc, 1); } /* * Called from trap.c when a SIGINT is received. (If the user specifies * that SIGINT is to be trapped or ignored using the trap builtin, then * this routine is not called.) Suppressint is nonzero when interrupts * are held using the INTOFF macro. The call to _exit is necessary because * there is a short period after a fork before the signal handlers are * set to the appropriate value for the child. (The test for iflag is * just defensive programming.) */ void onint() { if (suppressint) { intpending++; return; } intpending = 0; #ifdef BSD sigsetmask(0); #endif if (rootshell && iflag) exraise(EXINT); else _exit(128 + SIGINT); } void error2(a, b) char *a, *b; { error("%s: %s", a, b); } /* * Error is called to raise the error exception. If the first argument * is not NULL then error prints an error message using printf style * formatting. It then raises the error exception. */ #ifdef __STDC__ void error(char *msg, ...) { #else void error(va_alist) va_dcl { char *msg; #endif va_list ap; CLEAR_PENDING_INT; INTOFF; #ifdef __STDC__ va_start(ap, msg); #else va_start(ap); msg = va_arg(ap, char *); #endif #if DEBUG if (msg) TRACE(("error(\"%s\") pid=%d\n", msg, getpid())); else TRACE(("error(NULL) pid=%d\n", getpid())); #endif if (msg) { if (commandname) outfmt(&errout, "%s: ", commandname); doformat(&errout, msg, ap); out2c('\n'); } va_end(ap); flushall(); exraise(EXERROR); } #ifdef notdef /* These strange error messages only confuse. -- kjb */ /* * Table of error messages. */ struct errname { short errcode; /* error number */ short action; /* operation which encountered the error */ char *msg; /* text describing the error */ }; #define ALL (E_OPEN|E_CREAT|E_EXEC) STATIC const struct errname errormsg[] = { EINTR, ALL, "interrupted", EACCES, ALL, "permission denied", EIO, ALL, "I/O error", ENOENT, E_OPEN, "no such file", ENOENT, E_CREAT, "directory nonexistent", ENOENT, E_EXEC, "not found", ENOTDIR, E_OPEN, "no such file", ENOTDIR, E_CREAT, "directory nonexistent", ENOTDIR, E_EXEC, "not found", ENOEXEC, ALL, "not an executable", EISDIR, ALL, "is a directory", /* EMFILE, ALL, "too many open files", */ ENFILE, ALL, "file table overflow", ENOSPC, ALL, "file system full", #ifdef EDQUOT EDQUOT, ALL, "disk quota exceeded", #endif #ifdef ENOSR ENOSR, ALL, "no streams resources", #endif ENXIO, ALL, "no such device or address", EROFS, ALL, "read-only file system", ETXTBSY, ALL, "text busy", #ifdef SYSV EAGAIN, E_EXEC, "not enough memory", #endif ENOMEM, ALL, "not enough memory", #ifdef ENOLINK ENOLINK, ALL, "remote access failed", #endif #ifdef EMULTIHOP EMULTIHOP, ALL, "remote access failed", #endif #ifdef ECOMM ECOMM, ALL, "remote access failed", #endif #ifdef ESTALE ESTALE, ALL, "remote access failed", #endif #ifdef ETIMEDOUT ETIMEDOUT, ALL, "remote access failed", #endif #ifdef ELOOP ELOOP, ALL, "symbolic link loop", #endif E2BIG, E_EXEC, "argument list too long", #ifdef ELIBACC ELIBACC, E_EXEC, "shared library missing", #endif 0, 0, NULL }; /* * Return a string describing an error. The returned string may be a * pointer to a static buffer that will be overwritten on the next call. * Action describes the operation that got the error. */ char * errmsg(e, action) { const struct errname *ep; static char buf[12]; for (ep = errormsg ; ep->errcode ; ep++) { if (ep->errcode == e && (ep->action & action) != 0) return ep->msg; } fmtstr(buf, sizeof buf, "error %d", e); return buf; } #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)error.h 5.1 (Berkeley) 3/7/91 */ /* * Types of operations (passed to the errmsg routine). */ #define E_OPEN 01 /* opening a file */ #define E_CREAT 02 /* creating a file */ #define E_EXEC 04 /* executing a program */ /* * We enclose jmp_buf in a structure so that we can declare pointers to * jump locations. The global variable handler contains the location to * jump to when an exception occurs, and the global variable exception * contains a code identifying the exeception. To implement nested * exception handlers, the user should save the value of handler on entry * to an inner scope, set handler to point to a jmploc structure for the * inner scope, and restore handler on exit from the scope. */ #include struct jmploc { jmp_buf loc; }; extern struct jmploc *handler; extern int exception; /* exceptions */ #define EXINT 0 /* SIGINT received */ #define EXERROR 1 /* a generic error */ #define EXSHELLPROC 2 /* execute a shell procedure */ /* * These macros allow the user to suspend the handling of interrupt signals * over a period of time. This is similar to SIGHOLD to or sigblock, but * much more efficient and portable. (But hacking the kernel is so much * more fun than worrying about efficiency and portability. :-)) */ extern volatile int suppressint; extern volatile int intpending; extern char *commandname; /* name of command--printed on error */ #define INTOFF suppressint++ #define INTON if (--suppressint == 0 && intpending) onint(); else #define FORCEINTON {suppressint = 0; if (intpending) onint();} #define CLEAR_PENDING_INT intpending = 0 #define int_pending() intpending #ifdef __STDC__ void exraise(int); void onint(void); void error2(char *, char *); void error(char *, ...); char *errmsg(int, int); #else void exraise(); void onint(); void error2(); void error(); char *errmsg(); #endif /* Errmsg uses confusingly different messages. Prefer strerror(). -- kjb */ #define errmsg(errno, action) strerror(errno) /* * BSD setjmp saves the signal mask, which violates ANSI C and takes time, * so we use _setjmp instead. */ #ifdef BSD #define setjmp(jmploc) _setjmp(jmploc) #define longjmp(jmploc, val) _longjmp(jmploc, val) #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)eval.c 5.3 (Berkeley) 4/12/91"; #endif /* not lint */ /* * Evaluate a command. */ #include "shell.h" #include "nodes.h" #include "syntax.h" #include "expand.h" #include "parser.h" #include "jobs.h" #include "eval.h" #include "builtins.h" #include "options.h" #include "exec.h" #include "redir.h" #include "input.h" #include "output.h" #include "trap.h" #include "var.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #include #include /* flags in argument to evaltree */ #define EV_EXIT 01 /* exit after evaluating tree */ #define EV_TESTED 02 /* exit status is checked; ignore -e flag */ #define EV_BACKCMD 04 /* command executing within back quotes */ /* reasons for skipping commands (see comment on breakcmd routine) */ #define SKIPBREAK 1 #define SKIPCONT 2 #define SKIPFUNC 3 MKINIT int evalskip; /* set if we are skipping commands */ STATIC int skipcount; /* number of levels to skip */ MKINIT int loopnest; /* current loop nesting level */ int funcnest; /* depth of function calls */ char *commandname; struct strlist *cmdenviron; int exitstatus; /* exit status of last command */ #ifdef __STDC__ STATIC void evalloop(union node *); STATIC void evalfor(union node *); STATIC void evalcase(union node *, int); STATIC void evalsubshell(union node *, int); STATIC void expredir(union node *); STATIC void evalpipe(union node *); STATIC void evalcommand(union node *, int, struct backcmd *); STATIC void prehash(union node *); #else STATIC void evalloop(); STATIC void evalfor(); STATIC void evalcase(); STATIC void evalsubshell(); STATIC void expredir(); STATIC void evalpipe(); STATIC void evalcommand(); STATIC void prehash(); #endif /* * Called to reset things after an exception. */ #ifdef mkinit INCLUDE "eval.h" RESET { evalskip = 0; loopnest = 0; funcnest = 0; } SHELLPROC { exitstatus = 0; } #endif /* * The eval commmand. */ evalcmd(argc, argv) char **argv; { char *p; char *concat; char **ap; if (argc > 1) { p = argv[1]; if (argc > 2) { STARTSTACKSTR(concat); ap = argv + 2; for (;;) { while (*p) STPUTC(*p++, concat); if ((p = *ap++) == NULL) break; STPUTC(' ', concat); } STPUTC('\0', concat); p = grabstackstr(concat); } evalstring(p); } return exitstatus; } /* * Execute a command or commands contained in a string. */ void evalstring(s) char *s; { union node *n; struct stackmark smark; setstackmark(&smark); setinputstring(s, 1); while ((n = parsecmd(0)) != NEOF) { evaltree(n, 0); popstackmark(&smark); } popfile(); popstackmark(&smark); } /* * Evaluate a parse tree. The value is left in the global variable * exitstatus. */ void evaltree(n, flags) union node *n; { if (n == NULL) { TRACE(("evaltree(NULL) called\n")); return; } TRACE(("evaltree(0x%x: %d) called\n", (int)n, n->type)); switch (n->type) { case NSEMI: evaltree(n->nbinary.ch1, 0); if (evalskip) goto out; evaltree(n->nbinary.ch2, flags); break; case NAND: evaltree(n->nbinary.ch1, EV_TESTED); if (evalskip || exitstatus != 0) goto out; evaltree(n->nbinary.ch2, flags); break; case NOR: evaltree(n->nbinary.ch1, EV_TESTED); if (evalskip || exitstatus == 0) goto out; evaltree(n->nbinary.ch2, flags); break; case NREDIR: expredir(n->nredir.redirect); redirect(n->nredir.redirect, REDIR_PUSH); evaltree(n->nredir.n, flags); popredir(); break; case NSUBSHELL: evalsubshell(n, flags); break; case NBACKGND: evalsubshell(n, flags); break; case NIF: { int status = 0; evaltree(n->nif.test, EV_TESTED); if (evalskip) goto out; if (exitstatus == 0) { evaltree(n->nif.ifpart, flags); status = exitstatus; } else if (n->nif.elsepart) { evaltree(n->nif.elsepart, flags); status = exitstatus; } exitstatus = status; break; } case NWHILE: case NUNTIL: evalloop(n); break; case NFOR: evalfor(n); break; case NCASE: evalcase(n, flags); break; case NDEFUN: defun(n->narg.text, n->narg.next); exitstatus = 0; break; case NPIPE: evalpipe(n); break; case NCMD: evalcommand(n, flags, (struct backcmd *)NULL); break; default: out1fmt("Node type = %d\n", n->type); flushout(&output); break; } out: if (pendingsigs) dotrap(); if ((flags & EV_EXIT) || (eflag == 1 && exitstatus && !(flags & EV_TESTED))) exitshell(exitstatus); } STATIC void evalloop(n) union node *n; { int status; loopnest++; status = 0; for (;;) { evaltree(n->nbinary.ch1, EV_TESTED); if (evalskip) { skipping: if (evalskip == SKIPCONT && --skipcount <= 0) { evalskip = 0; continue; } if (evalskip == SKIPBREAK && --skipcount <= 0) evalskip = 0; break; } if (n->type == NWHILE) { if (exitstatus != 0) break; } else { if (exitstatus == 0) break; } evaltree(n->nbinary.ch2, 0); status = exitstatus; if (evalskip) goto skipping; } loopnest--; exitstatus = status; } STATIC void evalfor(n) union node *n; { struct arglist arglist; union node *argp; struct strlist *sp; struct stackmark smark; setstackmark(&smark); arglist.lastp = &arglist.list; for (argp = n->nfor.args ; argp ; argp = argp->narg.next) { expandarg(argp, &arglist, 1); if (evalskip) goto out; } *arglist.lastp = NULL; exitstatus = 0; loopnest++; for (sp = arglist.list ; sp ; sp = sp->next) { setvar(n->nfor.var, sp->text, 0); evaltree(n->nfor.body, 0); if (evalskip) { if (evalskip == SKIPCONT && --skipcount <= 0) { evalskip = 0; continue; } if (evalskip == SKIPBREAK && --skipcount <= 0) evalskip = 0; break; } } loopnest--; out: popstackmark(&smark); } STATIC void evalcase(n, flags) union node *n; { union node *cp; union node *patp; struct arglist arglist; struct stackmark smark; setstackmark(&s8888888888888mark); arglist.lastp = &arglist.list; expandarg(n->ncase.expr, &arglist, 0); for (cp = n->ncase.cases ; cp && evalskip == 0 ; cp = cp->nclist.next) { for (patp = cp->nclist.pattern ; patp ; patp = patp->narg.next) { if (casematch(patp, arglist.list->text)) { if (evalskip == 0) { evaltree(cp->nclist.body, flags); } goto out; } } } out: popstackmark(&smark); } /* * Kick off a subshell to evaluate a tree. */ STATIC void evalsubshell(n, flags) union node *n; { struct job *jp; int backgnd = (n->type == NBACKGND); expredir(n->nredir.redirect); jp = makejob(n, 1); if (forkshell(jp, n, backgnd) == 0) { if (backgnd) flags &=~ EV_TESTED; redirect(n->nredir.redirect, 0); evaltree(n->nredir.n, flags | EV_EXIT); /* never returns */ } if (! backgnd) { INTOFF; exitstatus = waitforjob(jp); INTON; } } /* * Compute the names of the files in a redirection list. */ STATIC void expredir(n) union node *n; { register union node *redir; for (redir = n ; redir ; redir = redir->nfile.next) { if (redir->type == NFROM || redir->type == NTO || redir->type == NAPPEND) { struct arglist fn; fn.lastp = &fn.list; expandarg(redir->nfile.fname, &fn, 0); redir->nfile.expfname = fn.list->text; } } } /* * Evaluate a pipeline. All the processes in the pipeline are children * of the process creating the pipeline. (This differs from some versions * of the shell, which make the last process in a pipeline the parent * of all the rest.) */ STATIC void evalpipe(n) union node *n; { struct job *jp; struct nodelist *lp; int pipelen; int prevfd; int pip[2]; TRACE(("evalpipe(0x%x) called\n", (int)n)); pipelen = 0; for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) pipelen++; INTOFF; jp = makejob(n, pipelen); prevfd = -1; for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { prehash(lp->n); pip[1] = -1; if (lp->next) { if (pipe(pip) < 0) { close(prevfd); error("Pipe call failed"); } } if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) { INTON; if (prevfd > 0) { close(0); copyfd(prevfd, 0); close(prevfd); } if (pip[1] >= 0) { close(pip[0]); if (pip[1] != 1) { close(1); copyfd(pip[1], 1); close(pip[1]); } } evaltree(lp->n, EV_EXIT); } if (prevfd >= 0) close(prevfd); prevfd = pip[0]; close(pip[1]); } INTON; if (n->npipe.backgnd == 0) { INTOFF; exitstatus = waitforjob(jp); TRACE(("evalpipe: job done exit status %d\n", exitstatus)); INTON; } } /* * Execute a command inside back quotes. If it's a builtin command, we * want to save its output in a block obtained from malloc. Otherwise * we fork off a subprocess and get the output of the command via a pipe. * Should be called with interrupts off. */ void evalbackcmd(n, result) union node *n; struct backcmd *result; { int pip[2]; struct job *jp; struct stackmark smark; /* unnecessary */ setstackmark(&smark); result->fd = -1; result->buf = NULL; result->nleft = 0; result->jp = NULL; if (n == NULL) { /* `` */ } else if (n->type == NCMD) { evalcommand(n, EV_BACKCMD, result); } else { if (pipe(pip) < 0) error("Pipe call failed"); jp = makejob(n, 1); if (forkshell(jp, n, FORK_NOJOB) == 0) { FORCEINTON; close(pip[0]); if (pip[1] != 1) { close(1); copyfd(pip[1], 1); close(pip[1]); } evaltree(n, EV_EXIT); } close(pip[1]); result->fd = pip[0]; result->jp = jp; } popstackmark(&smark); TRACE(("evalbackcmd done: fd=%d buf=0x%x nleft=%d jp=0x%x\n", result->fd, result->buf, result->nleft, result->jp)); } /* * Execute a simple command. */ STATIC void evalcommand(cmd, flags, backcmd) union node *cmd; struct backcmd *backcmd; { struct stackmark smark; union node *argp; struct arglist arglist; struct arglist varlist; char **argv; int argc; char **envp; int varflag; struct strlist *sp; register char *p; int mode; int pip[2]; struct cmdentry cmdentry; struct job *jp; struct jmploc jmploc; struct jmploc *volatile savehandler; char *volatile savecmdname; volatile struct shparam saveparam; struct localvar *volatile savelocalvars; volatile int e; char *lastarg; /* First expand the arguments. */ TRACE(("evalcommand(0x%x, %d) called\n", (int)cmd, flags)); setstackmark(&smark); arglist.lastp = &arglist.list; varlist.lastp = &varlist.list; varflag = 1; for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) { p = argp->narg.text; if (varflag && is_name(*p)) { do { p++; } while (is_in_name(*p)); if (*p == '=') { expandarg(argp, &varlist, 0); continue; } } expandarg(argp, &arglist, 1); varflag = 0; } *arglist.lastp = NULL; *varlist.lastp = NULL; expredir(cmd->ncmd.redirect); argc = 0; for (sp = arglist.list ; sp ; sp = sp->next) argc++; argv = stalloc(sizeof (char *) * (argc + 1)); for (sp = arglist.list ; sp ; sp = sp->next) *argv++ = sp->text; *argv = NULL; lastarg = NULL; if (iflag && funcnest == 0 && argc > 0) lastarg = argv[-1]; argv -= argc; /* Print the command if xflag is set. */ if (xflag == 1) { outc('+', &errout); for (sp = varlist.list ; sp ; sp = sp->next) { outc(' ', &errout); out2str(sp->text); } for (sp = arglist.list ; sp ; sp = sp->next) { outc(' ', &errout); out2str(sp->text); } outc('\n', &errout); flushout(&errout); } /* Now locate the command. */ if (argc == 0) { cmdentry.cmdtype = CMDBUILTIN; cmdentry.u.index = BLTINCMD; } else { find_command(argv[0], &cmdentry, 1); if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ exitstatus = 2; flushout(&errout); popstackmark(&smark); return; } /* implement the bltin builtin here */ if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) { for (;;) { argv++; if (--argc == 0) break; if ((cmdentry.u.index = find_builtin(*argv)) < 0) { outfmt(&errout, "%s: not found\n", *argv); exitstatus = 2; flushout(&errout); popstackmark(&smark); return; } if (cmdentry.u.index != BLTINCMD) break; } } } /* Fork off a child process if necessary. */ if (cmd->ncmd.backgnd || cmdentry.cmdtype == CMDNORMAL && (flags & EV_EXIT) == 0 || (flags & EV_BACKCMD) != 0 && (cmdentry.cmdtype != CMDBUILTIN || cmdentry.u.index == DOTCMD || cmdentry.u.index == EVALCMD)) { jp = makejob(cmd, 1); mode = cmd->ncmd.backgnd; if (flags & EV_BACKCMD) { mode = FORK_NOJOB; if (pipe(pip) < 0) error("Pipe call failed"); } if (forkshell(jp, cmd, mode) != 0) goto parent; /* at end of routine */ if (flags & EV_BACKCMD) { FORCEINTON; close(pip[0]); if (pip[1] != 1) { close(1); copyfd(pip[1], 1); close(pip[1]); } } flags |= EV_EXIT; } /* This is the child process if a fork occurred. */ /* Execute the command. */ if (cmdentry.cmdtype == CMDFUNCTION) { trputs("Shell function: "); trargs(argv); redirect(cmd->ncmd.redirect, REDIR_PUSH); saveparam = shellparam; shellparam.malloc = 0; shellparam.nparam = argc - 1; shellparam.p = argv + 1; shellparam.optnext = NULL; INTOFF; savelocalvars = localvars; localvars = NULL; INTON; if (setjmp(jmploc.loc)) { if (exception == EXSHELLPROC) freeparam((struct shparam *)&saveparam); else { freeparam(&shellparam); shellparam = saveparam; } poplocalvars(); localvars = savelocalvars; handler = savehandler; longjmp(handler->loc, 1); } savehandler = handler; handler = &jmploc; for (sp = varlist.list ; sp ; sp = sp->next) mklocal(sp->text); funcnest++; evaltree(cmdentry.u.func, 0); funcnest--; INTOFF; poplocalvars(); localvars = savelocalvars; freeparam(&shellparam); shellparam = saveparam; handler = savehandler; popredir(); INTON; if (evalskip == SKIPFUNC) { evalskip = 0; skipcount = 0; } if (flags & EV_EXIT) exitshell(exitstatus); } else if (cmdentry.cmdtype == CMDBUILTIN) { trputs("builtin command: "); trargs(argv); mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH; if (flags == EV_BACKCMD) { memout.nleft = 0; memout.nextc = memout.buf; memout.bufsize = 64; mode |= REDIR_BACKQ; } redirect(cmd->ncmd.redirect, mode); savecmdname = commandname; cmdenviron = varlist.list; e = -1; if (setjmp(jmploc.loc)) { e = exception; exitstatus = (e == EXINT)? SIGINT+128 : 2; goto cmddone; } savehandler = handler; handler = &jmploc; commandname = argv[0]; argptr = argv + 1; optptr = NULL; /* initialize nextopt */ exitstatus = (*builtinfunc[cmdentry.u.index])(argc, argv); flushall(); cmddone: out1 = &output; out2 = &errout; freestdout(); if (e != EXSHELLPROC) { commandname = savecmdname; if (flags & EV_EXIT) { exitshell(exitstatus); } } handler = savehandler; if (e != -1) { if (e != EXERROR || cmdentry.u.index == BLTINCMD || cmdentry.u.index == DOTCMD || cmdentry.u.index == EVALCMD || cmdentry.u.index == EXECCMD) exraise(e); FORCEINTON; } if (cmdentry.u.index != EXECCMD) popredir(); if (flags == EV_BACKCMD) { backcmd->buf = memout.buf; backcmd->nleft = memout.nextc - memout.buf; memout.buf = NULL; } } else { trputs("normal command: "); trargs(argv); clearredir(); redirect(cmd->ncmd.redirect, 0); if (varlist.list) { p = stalloc(strlen(pathval()) + 1); scopy(pathval(), p); } else { p = pathval(); } for (sp = varlist.list ; sp ; sp = sp->next) setvareq(sp->text, VEXPORT|VSTACK); envp = environment(); shellexec(argv, envp, p, cmdentry.u.index); /*NOTREACHED*/ } goto out; parent: /* parent process gets here (if we forked) */ if (mode == 0) { /* argument to fork */ INTOFF; exitstatus = waitforjob(jp); INTON; } else if (mode == 2) { backcmd->fd = pip[0]; close(pip[1]); backcmd->jp = jp; } out: if (lastarg) setvar("_", lastarg, 0); popstackmark(&smark); } /* * Search for a command. This is called before we fork so that the * location of the command will be available in the parent as well as * the child. The check for "goodname" is an overly conservative * check that the name will not be subject to expansion. */ STATIC void prehash(n) union node *n; { struct cmdentry entry; if (n->type == NCMD && goodname(n->ncmd.args->narg.text)) find_command(n->ncmd.args->narg.text, &entry, 0); } /* * Builtin commands. Builtin commands whose functions are closely * tied to evaluation are implemented here. */ /* * No command given, or a bltin command with no arguments. Set the * specified variables. */ bltincmd(argc, argv) char **argv; { listsetvar(cmdenviron); return exitstatus; } /* * Handle break and continue commands. Break, continue, and return are * all handled by setting the evalskip flag. The evaluation routines * above all check this flag, and if it is set they start skipping * commands rather than executing them. The variable skipcount is * the number of loops to break/continue, or the number of function * levels to return. (The latter is always 1.) It should probably * be an error to break out of more loops than exist, but it isn't * in the standard shell so we don't make it one here. */ breakcmd(argc, argv) char **argv; { int n; n = 1; if (argc > 1) n = number(argv[1]); if (n > loopnest) n = loopnest; if (n > 0) { evalskip = (**argv == 'c')? SKIPCONT : SKIPBREAK; skipcount = n; } return 0; } /* * The return command. */ returncmd(argc, argv) char **argv; { int ret; ret = exitstatus; if (argc > 1) ret = number(argv[1]); if (funcnest) { evalskip = SKIPFUNC; skipcount = 1; } return ret; } truecmd(argc, argv) char **argv; { return strcmp(argv[0], "false") == 0 ? 1 : 0; } execcmd(argc, argv) char **argv; { if (argc > 1) { iflag = 0; /* exit on error */ setinteractive(0); #if JOBS jflag = 0; setjobctl(0); #endif shellexec(argv + 1, environment(), pathval(), 0); } return 0; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)eval.h 5.2 (Berkeley) 4/12/91 */ extern char *commandname; /* currently executing command */ extern int exitstatus; /* exit status of last command */ extern struct strlist *cmdenviron; /* environment for builtin command */ struct backcmd { /* result of evalbackcmd */ int fd; /* file descriptor to read from */ char *buf; /* buffer */ int nleft; /* number of chars in buffer */ struct job *jp; /* job structure for command */ }; #ifdef __STDC__ void evalstring(char *); union node; /* BLETCH for ansi C */ void evaltree(union node *, int); void evalbackcmd(union node *, struct backcmd *); #else void evalstring(); void evaltree(); void evalbackcmd(); #endif /* in_function returns nonzero if we are currently evaluating a function */ #define in_function() funcnest extern int funcnest; /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)exec.c 5.2 (Berkeley) 3/13/91"; #endif /* not lint */ /* * When commands are first encountered, they are entered in a hash table. * This ensures that a full path search will not have to be done for them * on each invocation. * * We should investigate converting to a linear search, even though that * would make the command name "hash" a misnomer. */ #include "shell.h" #include "main.h" #include "nodes.h" #include "parser.h" #include "redir.h" #include "eval.h" #include "exec.h" #include "builtins.h" #include "var.h" #include "options.h" #include "input.h" #include "output.h" #include "syntax.h" #include "memalloc.h" #include "error.h" #include "init.h" #include "mystring.h" #include #include #include #include #include #define CMDTABLESIZE 31 /* should be prime */ #define ARB 1 /* actual size determined at run time */ struct tblentry { struct tblentry *next; /* next entry in hash chain */ union param param; /* definition of builtin function */ short cmdtype; /* index identifying command */ char rehash; /* if set, cd done since entry created */ char cmdname[ARB]; /* name of command */ }; STATIC struct tblentry *cmdtable[CMDTABLESIZE]; STATIC int builtinloc = -1; /* index in path of %builtin, or -1 */ #ifdef __STDC__ STATIC void tryexec(char *, char **, char **); STATIC void execinterp(char **, char **); STATIC void printentry(struct tblentry *); STATIC void clearcmdentry(int); STATIC struct tblentry *cmdlookup(char *, int); STATIC void delete_cmd_entry(void); #else STATIC void tryexec(); STATIC void execinterp(); STATIC void printentry(); STATIC void clearcmdentry(); STATIC struct tblentry *cmdlookup(); STATIC void delete_cmd_entry(); #endif /* * Exec a program. Never returns. If you change this routine, you may * have to change the find_command routine as well. */ void shellexec(argv, envp, path, index) char **argv, **envp; char *path; { char *cmdname; int e; if (strchr(argv[0], '/') != NULL) { tryexec(argv[0], argv, envp); e = errno; } else { e = ENOENT; while ((cmdname = padvance(&path, argv[0])) != NULL) { if (--index < 0 && pathopt == NULL) { tryexec(cmdname, argv, envp); if (errno != ENOENT && errno != ENOTDIR) e = errno; } stunalloc(cmdname); } } error2(argv[0], errmsg(e, E_EXEC)); } STATIC void tryexec(cmd, argv, envp) char *cmd; char **argv; char **envp; { int e; char *p; #ifdef SYSV do { execve(cmd, argv, envp); } while (errno == EINTR); #else execve(cmd, argv, envp); #endif #if HASHBANG e = errno; if (e == ENOEXEC) { initshellproc(); setinputfile(cmd, 0); commandname = arg0 = savestr(argv[0]); #ifndef BSD pgetc(); pungetc(); /* fill up input buffer */ p = parsenextc; if (parsenleft > 2 && p[0] == '#' && p[1] == '!') { argv[0] = cmd; execinterp(argv, envp); } #endif setparam(argv + 1); exraise(EXSHELLPROC); /*NOTREACHED*/ } errno = e; #endif } #if !defined(BSD) && HASHBANG /* * Execute an interpreter introduced by "#!", for systems where this * feature has not been built into the kernel. If the interpreter is * the shell, return (effectively ignoring the "#!"). If the execution * of the interpreter fails, exit. * * This code peeks inside the input buffer in order to avoid actually * reading any input. It would benefit from a rewrite. */ #define NEWARGS 5 STATIC void execinterp(argv, envp) char **argv, **envp; { int n; char *inp; char *outp; char c; char *p; char **ap; char *newargs[NEWARGS]; int i; char **ap2; char **new; n = parsenleft - 2; inp = parsenextc + 2; ap = newargs; for (;;) { while (--n >= 0 && (*inp == ' ' || *inp == '\t')) inp++; if (n < 0) goto bad; if ((c = *inp++) == '\n') break; if (ap == &newargs[NEWARGS]) bad: error("Bad #! line"); STARTSTACKSTR(outp); do { STPUTC(c, outp); } while (--n >= 0 && (c = *inp++) != ' ' && c != '\t' && c != '\n'); STPUTC('\0', outp); n++, inp--; *ap++ = grabstackstr(outp); } #if !__minix if (ap == newargs + 1) { /* if no args, maybe no exec is needed */ p = newargs[0]; for (;;) { if (equal(p, "sh") || equal(p, "ash")) { return; } while (*p != '/') { if (*p == '\0') goto break2; p++; } p++; } break2:; } #endif i = (char *)ap - (char *)newargs; /* size in bytes */ if (i == 0) error("Bad #! line"); for (ap2 = argv ; *ap2++ != NULL ; ); new = ckmalloc(i + ((char *)ap2 - (char *)argv)); ap = newargs, ap2 = new; while ((i -= sizeof (char **)) >= 0) *ap2++ = *ap++; ap = argv; while (*ap2++ = *ap++); shellexec(new, envp, pathval(), 0); } #endif /* * Do a path search. The variable path (passed by reference) should be * set to the start of the path before the first call; padvance will update * this value as it proceeds. Successive calls to padvance will return * the possible path expansions in sequence. If an option (indicated by * a percent sign) appears in the path entry then the global variable * pathopt will be set to point to it; otherwise pathopt will be set to * NULL. */ char *pathopt; char * padvance(path, name) char **path; char *name; { register char *p, *q; char *start; int len; if (*path == NULL) return NULL; start = *path; for (p = start ; *p && *p != ':' && *p != '%' ; p++); len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */ while (stackblocksize() < len) growstackblock(); q = stackblock(); if (p != start) { bcopy(start, q, p - start); q += p - start; *q++ = '/'; } strcpy(q, name); pathopt = NULL; if (*p == '%') { pathopt = ++p; while (*p && *p != ':') p++; } if (*p == ':') *path = p + 1; else *path = NULL; return stalloc(len); } /*** Command hashing code ***/ hashcmd(argc, argv) char **argv; { struct tblentry **pp; struct tblentry *cmdp; int c; int verbose; struct cmdentry entry; char *name; if (argc <= 1) { for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { printentry(cmdp); } } return 0; } verbose = 0; while ((c = nextopt("rv")) != '\0') { if (c == 'r') { clearcmdentry(0); } else if (c == 'v') {88888888888 verbose++; } } while ((name = *argptr) != NULL) { if ((cmdp = cmdlookup(name, 0)) != NULL && (cmdp->cmdtype == CMDNORMAL || cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0)) delete_cmd_entry(); find_command(name, &entry, 1); if (verbose) { if (entry.cmdtype != CMDUNKNOWN) { /* if no error msg */ cmdp = cmdlookup(name, 0); printentry(cmdp); } flushall(); } argptr++; } return 0; } STATIC void printentry(cmdp) struct tblentry *cmdp; { int index; char *path; char *name; if (cmdp->cmdtype == CMDNORMAL) { index = cmdp->param.index; path = pathval(); do { name = padvance(&path, cmdp->cmdname); stunalloc(name); } while (--index >= 0); out1str(name); } else if (cmdp->cmdtype == CMDBUILTIN) { out1fmt("builtin %s", cmdp->cmdname); } else if (cmdp->cmdtype == CMDFUNCTION) { out1fmt("function %s", cmdp->cmdname); #if DEBUG } else { error("internal error: cmdtype %d", cmdp->cmdtype); #endif } if (cmdp->rehash) out1c('*'); out1c('\n'); } /* * Resolve a command name. If you change this routine, you may have to * change the shellexec routine as well. */ void find_command(name, entry, printerr) char *name; struct cmdentry *entry; { struct tblentry *cmdp; int index; int prev; char *path; char *fullname; struct stat statb; int e; int i; /* If name contains a slash, don't use the hash table */ if (strchr(name, '/') != NULL) { entry->cmdtype = CMDNORMAL; entry->u.index = 0; return; } /* If name is in the table, and not invalidated by cd, we're done */ if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) goto success; /* If %builtin not in path, check for builtin next */ if (builtinloc < 0 && (i = find_builtin(name)) >= 0) { INTOFF; cmdp = cmdlookup(name, 1); cmdp->cmdtype = CMDBUILTIN; cmdp->param.index = i; INTON; goto success; } /* We have to search path. */ prev = -1; /* where to start */ if (cmdp) { /* doing a rehash */ if (cmdp->cmdtype == CMDBUILTIN) prev = builtinloc; else prev = cmdp->param.index; } path = pathval(); e = ENOENT; index = -1; loop: while ((fullname = padvance(&path, name)) != NULL) { stunalloc(fullname); index++; if (pathopt) { if (prefix("builtin", pathopt)) { if ((i = find_builtin(name)) < 0) goto loop; INTOFF; cmdp = cmdlookup(name, 1); cmdp->cmdtype = CMDBUILTIN; cmdp->param.index = i; INTON; goto success; } else if (prefix("func", pathopt)) { /* handled below */ } else { goto loop; /* ignore unimplemented options */ } } /* if rehash, don't redo absolute path names */ if (fullname[0] == '/' && index <= prev) { if (index < prev) goto loop; TRACE(("searchexec \"%s\": no change\n", name)); goto success; } while (stat(fullname, &statb) < 0) { #ifdef SYSV if (errno == EINTR) continue; #endif if (errno != ENOENT && errno != ENOTDIR) e = errno; goto loop; } e = EACCES; /* if we fail, this will be the error */ if ((statb.st_mode & S_IFMT) != S_IFREG) goto loop; if (pathopt) { /* this is a %func directory */ stalloc(strlen(fullname) + 1); readcmdfile(fullname); if ((cmdp = cmdlookup(name, 0)) == NULL || cmdp->cmdtype != CMDFUNCTION) error("%s not defined in %s", name, fullname); stunalloc(fullname); goto success; } if (statb.st_uid == geteuid()) { if ((statb.st_mode & 0100) == 0) goto loop; } else if (statb.st_gid == getegid()) { if ((statb.st_mode & 010) == 0) goto loop; } else { #if __minix_vmd || defined(BSD) gid_t group_list[NGROUPS_MAX]; int ngroups, i; ngroups = getgroups(NGROUPS_MAX, group_list); for (i = 0; i < ngroups; i++) { if (statb.st_gid == group_list[i]) break; } if (i < ngroups) { if ((statb.st_mode & 010) == 0) goto loop; } else #endif if ((statb.st_mode & 01) == 0) goto loop; } TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname)); INTOFF; cmdp = cmdlookup(name, 1); cmdp->cmdtype = CMDNORMAL; cmdp->param.index = index; INTON; goto success; } /* We failed. If there was an entry for this command, delete it */ if (cmdp) delete_cmd_entry(); if (printerr) outfmt(out2, "%s: %s\n", name, errmsg(e, E_EXEC)); entry->cmdtype = CMDUNKNOWN; return; success: cmdp->rehash = 0; entry->cmdtype = cmdp->cmdtype; entry->u = cmdp->param; } /* * Search the table of builtin commands. */ int find_builtin(name) char *name; { const register struct builtincmd *bp; for (bp = builtincmd ; bp->name ; bp++) { if (*bp->name == *name && equal(bp->name, name)) return bp->code; } return -1; } /* * Called when a cd is done. Marks all commands so the next time they * are executed they will be rehashed. */ void hashcd() { struct tblentry **pp; struct tblentry *cmdp; for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { if (cmdp->cmdtype == CMDNORMAL || cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0) cmdp->rehash = 1; } } } /* * Called before PATH is changed. The argument is the new value of PATH; * pathval() still returns the old value at this point. Called with * interrupts off. */ void changepath(newval) char *newval; { char *old, *new; int index; int firstchange; int bltin; old = pathval(); new = newval; firstchange = 9999; /* assume no change */ index = 0; bltin = -1; for (;;) { if (*old != *new) { firstchange = index; if (*old == '\0' && *new == ':' || *old == ':' && *new == '\0') firstchange++; old = new; /* ignore subsequent differences */ } if (*new == '\0') break; if (*new == '%' && bltin < 0 && prefix("builtin", new + 1)) bltin = index; if (*new == ':') { index++; } new++, old++; } if (builtinloc < 0 && bltin >= 0) builtinloc = bltin; /* zap builtins */ if (builtinloc >= 0 && bltin < 0) firstchange = 0; clearcmdentry(firstchange); builtinloc = bltin; } /* * Clear out command entries. The argument specifies the first entry in * PATH which has changed. */ STATIC void clearcmdentry(firstchange) { struct tblentry **tblp; struct tblentry **pp; struct tblentry *cmdp; INTOFF; for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { pp = tblp; while ((cmdp = *pp) != NULL) { if (cmdp->cmdtype == CMDNORMAL && cmdp->param.index >= firstchange || cmdp->cmdtype == CMDBUILTIN && builtinloc >= firstchange) { *pp = cmdp->next; ckfree(cmdp); } else { pp = &cmdp->next; } } } INTON; } /* * Delete all functions. */ #ifdef mkinit MKINIT void deletefuncs(); SHELLPROC { deletefuncs(); } #endif void deletefuncs() { struct tblentry **tblp; struct tblentry **pp; struct tblentry *cmdp; INTOFF; for (tblp = cmdtable ; tblp < &cmdtable[CMDTABLESIZE] ; tblp++) { pp = tblp; while ((cmdp = *pp) != NULL) { if (cmdp->cmdtype == CMDFUNCTION) { *pp = cmdp->next; freefunc(cmdp->param.func); ckfree(cmdp); } else { pp = &cmdp->next; } } } INTON; } /* * Locate a command in the command hash table. If "add" is nonzero, * add the command to the table if it is not already present. The * variable "lastcmdentry" is set to point to the address of the link * pointing to the entry, so that delete_cmd_entry can delete the * entry. */ struct tblentry **lastcmdentry; STATIC struct tblentry * cmdlookup(name, add) char *name; { int hashval; register char *p; struct tblentry *cmdp; struct tblentry **pp; p = name; hashval = *p << 4; while (*p) hashval += *p++; hashval &= 0x7FFF; pp = &cmdtable[hashval % CMDTABLESIZE]; for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { if (equal(cmdp->cmdname, name)) break; pp = &cmdp->next; } if (add && cmdp == NULL) { INTOFF; cmdp = *pp = ckmalloc(sizeof (struct tblentry) - ARB + strlen(name) + 1); cmdp->next = NULL; cmdp->cmdtype = CMDUNKNOWN; cmdp->rehash = 0; strcpy(cmdp->cmdname, name); INTON; } lastcmdentry = pp; return cmdp; } /* * Delete the command entry returned on the last lookup. */ STATIC void delete_cmd_entry() { struct tblentry *cmdp; INTOFF; cmdp = *lastcmdentry; *lastcmdentry = cmdp->next; ckfree(cmdp); INTON; } #ifdef notdef void getcmdentry(name, entry) char *name; struct cmdentry *entry; { struct tblentry *cmdp = cmdlookup(name, 0); if (cmdp) { entry->u = cmdp->param; entry->cmdtype = cmdp->cmdtype; } else { entry->cmdtype = CMDUNKNOWN; entry->u.index = 0; } } #endif /* * Add a new command entry, replacing any existing command entry for * the same name. */ void addcmdentry(name, entry) char *name; struct cmdentry *entry; { struct tblentry *cmdp; INTOFF; cmdp = cmdlookup(name, 1); if (cmdp->cmdtype == CMDFUNCTION) { freefunc(cmdp->param.func); } cmdp->cmdtype = entry->cmdtype; cmdp->param = entry->u; INTON; } /* * Define a shell function. */ void defun(name, func) char *name; union node *func; { struct cmdentry entry; INTOFF; entry.cmdtype = CMDFUNCTION; entry.u.func = copyfunc(func); addcmdentry(name, &entry); INTON; } /* * Delete a function if it exists. */ void unsetfunc(name) char *name; { struct tblentry *cmdp; if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->cmdtype == CMDFUNCTION) { freefunc(cmdp->param.func); delete_cmd_entry(); } } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)exec.h 5.1 (Berkeley) 3/7/91 */ /* values of cmdtype */ #define CMDUNKNOWN -1 /* no entry in table for command */ #define CMDNORMAL 0 /* command is an executable program */ #define CMDBUILTIN 1 /* command is a shell builtin */ #define CMDFUNCTION 2 /* command is a shell function */ struct cmdentry { int cmdtype; union param { int index; union node *func; } u; }; extern char *pathopt; /* set by padvance */ #ifdef __STDC__ void shellexec(char **, char **, char *, int); char *padvance(char **, char *); void find_command(char *, struct cmdentry *, int); int find_builtin(char *); void hashcd(void); void changepath(char *); void defun(char *, union node *); void unsetfunc(char *); #else void shellexec(); char *padvance(); void find_command(); int find_builtin(); void hashcd(); void changepath(); void defun(); void unsetfunc(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)expand.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * Routines to expand arguments to commands. We have to deal with * backquotes, shell variables, and file metacharacters. */ #include "shell.h" #include "main.h" #include "nodes.h" #include "eval.h" #include "expand.h" #include "syntax.h" #include "parser.h" #include "jobs.h" #include "options.h" #include "var.h" #include "input.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #include #include #include #include #if USEGETPW #include #endif /* * Structure specifying which parts of the string should be searched * for IFS characters. */ struct ifsregion { struct ifsregion *next; /* next region in list */ int begoff; /* offset of start of region */ int endoff; /* offset of end of region */ int nulonly; /* search for nul bytes only */ }; char *expdest; /* output of current string */ struct nodelist *argbackq; /* list of back quote expressions */ struct ifsregion ifsfirst; /* first struct in list of ifs regions */ struct ifsregion *ifslastp; /* last struct in list */ struct arglist exparg; /* holds expanded arg list */ #if UDIR || TILDE /* * Set if the last argument processed had /u/logname or ~logname expanded. * This variable is read by the cd command. */ int didudir; #endif #ifdef __STDC__ STATIC void argstr(char *, int); STATIC void expbackq(union node *, int, int); STATIC char *evalvar(char *, int); STATIC int varisset(int); STATIC void varvalue(int, int, int); STATIC void recordregion(int, int, int); STATIC void ifsbreakup(char *, struct arglist *); STATIC void expandmeta(struct strlist *); STATIC void expmeta(char *, char *); STATIC void addfname(char *); STATIC struct strlist *expsort(struct strlist *); STATIC struct strlist *msort(struct strlist *, int); STATIC int pmatch(char *, char *); #else STATIC void argstr(); STATIC void expbackq(); STATIC char *evalvar(); STATIC int varisset(); STATIC void varvalue(); STATIC void recordregion(); STATIC void ifsbreakup(); STATIC void expandmeta(); STATIC void expmeta(); STATIC void addfname(); STATIC struct strlist *expsort(); STATIC struct strlist *msort(); STATIC int pmatch(); #endif #if UDIR || TILDE #ifdef __STDC__ STATIC char *expudir(char *); #else STATIC char *expudir(); #endif #endif /* UDIR || TILDE */ /* * Expand shell variables and backquotes inside a here document. */ void expandhere(arg, fd) union node *arg; /* the document */ int fd; /* where to write the expanded version */ { herefd = fd; expandarg(arg, (struct arglist *)NULL, 0); xwrite(fd, stackblock(), expdest - stackblock()); } /* * Perform variable substitution and command substitution on an argument, * placing the resulting list of arguments in arglist. If full is true, * perform splitting and file name expansion. When arglist is NULL, perform * here document expansion. */ void expandarg(arg, arglist, full) union node *arg; struct arglist *arglist; { struct strlist *sp; char *p; #if UDIR || TILDE didudir = 0; #endif argbackq = arg->narg.backquote; STARTSTACKSTR(expdest); ifsfirst.next = NULL; ifslastp = NULL; argstr(arg->narg.text, full); if (arglist == NULL) return; /* here document expanded */ STPUTC('\0', expdest); p = grabstackstr(expdest); exparg.lastp = &exparg.list; if (full) { ifsbreakup(p, &exparg); *exparg.lastp = NULL; exparg.lastp = &exparg.list; expandmeta(exparg.list); } else { sp = (struct strlist *)stalloc(sizeof (struct strlist)); sp->text = p; *exparg.lastp = sp; exparg.lastp = &sp->next; } while (ifsfirst.next != NULL) { struct ifsregion *ifsp; INTOFF; ifsp = ifsfirst.next->next; ckfree(ifsfirst.next); ifsfirst.next = ifsp; INTON; } *exparg.lastp = NULL; if (exparg.list) { *arglist->lastp = exparg.list; arglist->lastp = exparg.lastp; } } /* * Perform variable and command substitution. If full is set, output CTLESC * characters to allow for further processing. If full is not set, treat * $@ like $* since no splitting will be performed. */ STATIC void argstr(p, full) register char *p; { char c; for (;;) { switch (c = *p++) { case '\0': case CTLENDVAR: goto breakloop; case CTLESC: if (full) STPUTC(c, expdest); c = *p++; STPUTC(c, expdest); break; case CTLVAR: p = evalvar(p, full); break; case CTLBACKQ: case CTLBACKQ|CTLQUOTE: expbackq(argbackq->n, c & CTLQUOTE, full); argbackq = argbackq->next; break; default: STPUTC(c, expdest); } } breakloop:; } /* * Expand stuff in backwards quotes. */ STATIC void expbackq(cmd, quoted, full) union node *cmd; { struct backcmd in; int i; char buf[128]; char *p; char *dest = expdest; struct ifsregion saveifs, *savelastp; struct nodelist *saveargbackq; char lastc; int startloc = dest - stackblock(); char const *syntax = quoted? DQSYNTAX : BASESYNTAX; int saveherefd; INTOFF; saveifs = ifsfirst; savelastp = ifslastp; saveargbackq = argbackq; saveherefd = herefd; herefd = -1; p = grabstackstr(dest); evalbackcmd(cmd, &in); ungrabstackstr(p, dest); ifsfirst = saveifs; ifslastp = savelastp; argbackq = saveargbackq; herefd = saveherefd; p = in.buf; lastc = '\0'; for (;;) { if (--in.nleft < 0) { if (in.fd < 0) break; while ((i = read(in.fd, buf, sizeof buf)) < 0 && errno == EINTR); TRACE(("expbackq: read returns %d\n", i)); if (i <= 0) break; p = buf; in.nleft = i - 1; } lastc = *p++; if (lastc != '\0') { if (full && syntax[lastc] == CCTL) STPUTC(CTLESC, dest); STPUTC(lastc, dest); } } if (lastc == '\n') { STUNPUTC(dest); } if (in.fd >= 0) close(in.fd); if (in.buf) ckfree(in.buf); if (in.jp) exitstatus = waitforjob(in.jp); if (quoted == 0) recordregion(startloc, dest - stackblock(), 0); TRACE(("evalbackq: size=%d: \"%.*s\"\n", (dest - stackblock()) - startloc, (dest - stackblock()) - startloc, stackblock() + startloc)); expdest = dest; INTON; } /* * Expand a variable, and return a pointer to the next character in the * input string. */ STATIC char * evalvar(p, full) char *p; { int subtype; int flags; char *var; ch88888888888888888ar *val; int c; int set; int special; int startloc; flags = *p++; subtype = flags & VSTYPE; var = p; special = 0; if (! is_name(*p)) special = 1; p = strchr(p, '=') + 1; again: /* jump here after setting a variable with ${var=text} */ if (special) { set = varisset(*var); val = NULL; } else { val = lookupvar(var); if (val == NULL || (flags & VSNUL) && val[0] == '\0') { val = NULL; set = 0; } else set = 1; } startloc = expdest - stackblock(); if (set && subtype != VSPLUS) { /* insert the value of the variable */ if (special) { varvalue(*var, flags & VSQUOTE, full); } else { char const *syntax = (flags & VSQUOTE)? DQSYNTAX : BASESYNTAX; while (*val) { if (full && syntax[*val] == CCTL) STPUTC(CTLESC, expdest); STPUTC(*val++, expdest); } } } if (subtype == VSPLUS) set = ! set; if (((flags & VSQUOTE) == 0 || (*var == '@' && shellparam.nparam != 1)) && (set || subtype == VSNORMAL)) recordregion(startloc, expdest - stackblock(), flags & VSQUOTE); if (! set && subtype != VSNORMAL) { if (subtype == VSPLUS || subtype == VSMINUS) { argstr(p, full); } else { char *startp; int saveherefd = herefd; herefd = -1; argstr(p, 0); STACKSTRNUL(expdest); herefd = saveherefd; startp = stackblock() + startloc; if (subtype == VSASSIGN) { setvar(var, startp, 0); STADJUST(startp - expdest, expdest); flags &=~ VSNUL; goto again; } /* subtype == VSQUESTION */ if (*p != CTLENDVAR) { outfmt(&errout, "%s\n", startp); error((char *)NULL); } error("%.*s: parameter %snot set", p - var - 1, var, (flags & VSNUL)? "null or " : nullstr); } } if (subtype != VSNORMAL) { /* skip to end of alternative */ int nesting = 1; for (;;) { if ((c = *p++) == CTLESC) p++; else if (c == CTLBACKQ || c == (CTLBACKQ|CTLQUOTE)) { if (set) { if (argbackq != NULL) argbackq = argbackq->next; } } else if (c == CTLVAR) { if ((*p++ & VSTYPE) != VSNORMAL) nesting++; } else if (c == CTLENDVAR) { if (--nesting == 0) break; } } } return p; } /* * Test whether a specialized variable is set. */ STATIC int varisset(name) char name; { char **ap; if (name == '!') { if (backgndpid == -1) return 0; } else if (name == '@' || name == '*') { if (*shellparam.p == NULL) return 0; } else if ((unsigned)(name -= '1') <= '9' - '1') { ap = shellparam.p; do { if (*ap++ == NULL) return 0; } while (--name >= 0); } return 1; } /* * Add the value of a specialized variable to the stack string. */ STATIC void varvalue(name, quoted, allow_split) char name; { int num; char temp[32]; char *p; int i; extern int exitstatus; char sep; char **ap; char const *syntax; switch (name) { case '$': num = rootpid; goto numvar; case '?': num = exitstatus; goto numvar; case '#': num = shellparam.nparam; goto numvar; case '!': num = backgndpid; numvar: p = temp + 31; temp[31] = '\0'; do { *--p = num % 10 + '0'; } while ((num /= 10) != 0); while (*p) STPUTC(*p++, expdest); break; case '-': for (i = 0 ; optchar[i] ; i++) { if (optval[i]) STPUTC(optchar[i], expdest); } break; case '@': if (allow_split) { sep = '\0'; goto allargs; } /* fall through */ case '*': sep = ' '; allargs: /* Only emit CTLESC if we will do further processing, i.e. if allow_split is set. */ syntax = quoted && allow_split ? DQSYNTAX : BASESYNTAX; for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { /* should insert CTLESC characters */ while (*p) { if (syntax[*p] == CCTL) STPUTC(CTLESC, expdest); STPUTC(*p++, expdest); } if (*ap) STPUTC(sep, expdest); } break; case '0': p = arg0; string: /* Only emit CTLESC if we will do further processing, i.e. if allow_split is set. */ syntax = quoted && allow_split ? DQSYNTAX : BASESYNTAX; while (*p) { if (syntax[*p] == CCTL) STPUTC(CTLESC, expdest); STPUTC(*p++, expdest); } break; default: if ((unsigned)(name -= '1') <= '9' - '1') { p = shellparam.p[name]; goto string; } break; } } /* * Record the the fact that we have to scan this region of the * string for IFS characters. */ STATIC void recordregion(start, end, nulonly) { register struct ifsregion *ifsp; if (ifslastp == NULL) { ifsp = &ifsfirst; } else { ifsp = (struct ifsregion *)ckmalloc(sizeof (struct ifsregion)); ifslastp->next = ifsp; } ifslastp = ifsp; ifslastp->next = NULL; ifslastp->begoff = start; ifslastp->endoff = end; ifslastp->nulonly = nulonly; } /* * Break the argument string into pieces based upon IFS and add the * strings to the argument list. The regions of the string to be * searched for IFS characters have been stored by recordregion. */ STATIC void ifsbreakup(string, arglist) char *string; struct arglist *arglist; { struct ifsregion *ifsp; struct strlist *sp; char *start; register char *p; char *q; char *ifs; start = string; if (ifslastp != NULL) { ifsp = &ifsfirst; do { p = string + ifsp->begoff; ifs = ifsp->nulonly? nullstr : ifsval(); while (p < string + ifsp->endoff) { q = p; if (*p == CTLESC) p++; if (strchr(ifs, *p++)) { if (q > start || *ifs != ' ') { *q = '\0'; sp = (struct strlist *)stalloc(sizeof *sp); sp->text = start; *arglist->lastp = sp; arglist->lastp = &sp->next; } if (*ifs == ' ') { for (;;) { if (p >= string + ifsp->endoff) break; q = p; if (*p == CTLESC) p++; if (strchr(ifs, *p++) == NULL) { p = q; break; } } } start = p; } } } while ((ifsp = ifsp->next) != NULL); if (*start || (*ifs != ' ' && start > string)) { sp = (struct strlist *)stalloc(sizeof *sp); sp->text = start; *arglist->lastp = sp; arglist->lastp = &sp->next; } } else { sp = (struct strlist *)stalloc(sizeof *sp); sp->text = start; *arglist->lastp = sp; arglist->lastp = &sp->next; } } /* * Expand shell metacharacters. At this point, the only control characters * should be escapes. The results are stored in the list exparg. */ char *expdir; STATIC void expandmeta(str) struct strlist *str; { char *p; struct strlist **savelastp; struct strlist *sp; char c; while (str) { if (fflag) goto nometa; p = str->text; #if UDIR if (p[0] == '/' && p[1] == 'u' && p[2] == '/') str->text = p = expudir(p); #endif #if TILDE if (p[0] == '~') str->text = p = expudir(p); #endif for (;;) { /* fast check for meta chars */ if ((c = *p++) == '\0') goto nometa; if (c == '*' || c == '?' || c == '[' || c == '!') break; } savelastp = exparg.lastp; INTOFF; if (expdir == NULL) expdir = ckmalloc(1024); /* I hope this is big enough */ expmeta(expdir, str->text); ckfree(expdir); expdir = NULL; INTON; if (exparg.lastp == savelastp) { if (! zflag) { nometa: *exparg.lastp = str; rmescapes(str->text); exparg.lastp = &str->next; } } else { *exparg.lastp = NULL; *savelastp = sp = expsort(*savelastp); while (sp->next != NULL) sp = sp->next; exparg.lastp = &sp->next; } str = str->next; } } #if UDIR || TILDE /* * UDIR: Expand /u/username into the home directory for the specified user. * TILDE: Expand ~username into the home directory for the specified user. * We hope not to use the getpw stuff here, because then we would have to load * in stdio and who knows what else. With networked password files there is * no choice alas. */ #define MAXLOGNAME 32 #define MAXPWLINE 128 char *pfgets(); STATIC char * expudir(path) char *path; { register char *p, *q, *r; char name[MAXLOGNAME]; char line[MAXPWLINE]; int i; #if USEGETPW struct passwd *pw; #endif r = path; /* result on failure */ p = r + (*r == '~' ? 1 : 3); /* the 1 skips "~", 3 skips "/u/" */ q = name; while (*p && *p != '/') { if (q >= name + MAXLOGNAME - 1) return r; /* fail, name too long */ *q++ = *p++; } *q = '\0'; #if TILDE if (*name == 0 && *r == '~') { /* null name, use $HOME */ if ((q = lookupvar("HOME")) == NULL) return r; /* fail, home not set */ i = strlen(q); r = stalloc(i + strlen(p) + 1); scopy(q, r); scopy(p, r + i); TRACE(("expudir converts %s to %s\n", path, r)); didudir = 1; path = r; return r; } #endif #if !USEGETPW /* can do without the bloat */ setinputfile("/etc/passwd", 1); q = line + strlen(name); while (pfgets(line, MAXPWLINE) != NULL) { if (line[0] == name[0] && prefix(name, line) && *q == ':') { /* skip to start of home directory */ i = 4; do { while (*++q && *q != ':'); } while (--i > 0); if (*q == '\0') break; /* fail, corrupted /etc/passwd */ q++; for (r = q ; *r && *r != '\n' && *r != ':' ; r++); *r = '\0'; /* nul terminate home directory */ i = r - q; /* i = strlen(q) */ r = stalloc(i + strlen(p) + 1); scopy(q, r); scopy(p, r + i); TRACE(("expudir converts %s to %s\n", path, r)); didudir = 1; path = r; /* succeed */ break; } } popfile(); #else if ((pw = getpwnam(name)) != NULL) { /* user exists */ q = pw->pw_dir; i = strlen(q); r = stalloc(i + strlen(p) + 1); scopy(q, r); scopy(p, r + i); TRACE(("expudir converts %s to %s\n", path, r)); didudir = 1; path = r; } endpwent(); #endif /* USEGETPW */ return r; } #endif /* * Do metacharacter (i.e. *, ?, [...]) expansion. */ STATIC void expmeta(enddir, name) char *enddir; char *name; { register char *p; char *q; char *start; char *endname; int metaflag; struct stat statb; DIR *dirp; struct dirent *dp; int atend; int matchdot; metaflag = 0; start = name; for (p = name ; ; p++) { if (*p == '*' || *p == '?') metaflag = 1; else if (*p == '[') { q = p + 1; if (*q == '!') q++; for (;;) { if (*q == CTLESC) q++; if (*q == '/' || *q == '\0') break; if (*++q == ']') { metaflag = 1; break; } } } else if (*p == '!' && p[1] == '!' && (p == name || p[-1] == '/')) { metaflag = 1; } else if (*p == '\0') break; else if (*p == CTLESC) p++; if (*p == '/') { if (metaflag) break; start = p + 1; } } if (metaflag == 0) { /* we've reached the end of the file name */ if (enddir != expdir) metaflag++; for (p = name ; ; p++) { if (*p == CTLESC) p++; *enddir++ = *p; if (*p == '\0') break; } if (metaflag == 0 || stat(expdir, &statb) >= 0) addfname(expdir); return; } endname = p; if (start != name) { p = name; while (p < start) { if (*p == CTLESC) p++; *enddir++ = *p++; } } if (enddir == expdir) { p = "."; } else if (enddir == expdir + 1 && *expdir == '/') { p = "/"; } else { p = expdir; enddir[-1] = '\0'; } if ((dirp = opendir(p)) == NULL) return; if (enddir != expdir) enddir[-1] = '/'; if (*endname == 0) { atend = 1; } else { atend = 0; *endname++ = '\0'; } matchdot = 0; if (start[0] == '.' || start[0] == CTLESC && start[1] == '.') matchdot++; while (! int_pending() && (dp = readdir(dirp)) != NULL) { if (dp->d_name[0] == '.' && ! matchdot) continue; if (patmatch(start, dp->d_name)) { if (atend) { scopy(dp->d_name, enddir); addfname(expdir); } else { char *q; for (p = enddir, q = dp->d_name ; *p++ = *q++ ;); p[-1] = '/'; expmeta(p, endname); } } } closedir(dirp); if (! atend) endname[-1] = '/'; } /* * Add a file name to the list. */ STATIC void addfname(name) char *name; { char *p; struct strlist *sp; p = stalloc(strlen(name) + 1); scopy(name, p); sp = (struct strlist *)stalloc(sizeof *sp); sp->text = p; *exparg.lastp = sp; exparg.lastp = &sp->next; } /* * Sort the results of file name expansion. It calculates the number of * strings to sort and then calls msort (short for merge sort) to do the * work. */ STATIC struct strlist * expsort(str) struct strlist *str; { int len; struct strlist *sp; len = 0; for (sp = str ; sp ; sp = sp->next) len++; return msort(str, len); } STATIC struct strlist * msort(list, len) struct strlist *list; { struct strlist *p, *q; struct strlist **lpp; int half; int n; if (len <= 1) return list; half = len >> 1; p = list; for (n = half ; --n >= 0 ; ) { q = p; p = p->next; } q->next = NULL; /* terminate first half of list */ q = msort(list, half); /* sort first half of list */ p = msort(p, len - half); /* sort second half */ lpp = &list; for (;;) { if (strcmp(p->text, q->text) < 0) { *lpp = p; lpp = &p->next; if ((p = *lpp) == NULL) { *lpp = q; break; } } else { *lpp = q; lpp = &q->next; if ((q = *lpp) == NULL) { *lpp = p; break; } } } return list; } /* * Returns true if the pattern matches the string. */ int patmatch(pattern, string) char *pattern; char *string; { if (pattern[0] == '!' && pattern[1] == '!') return 1 - pmatch(pattern + 2, string); else return pmatch(pattern, string); } STATIC int pmatch(pattern, string) char *pattern; char *string; { register char *p, *q; register char c; p = pattern; q = string; for (;;) { switch (c = *p++) { case '\0': goto breakloop; case CTLESC: if (*q++ != *p++) return 0; break; case '?': if (*q++ == '\0') return 0; break; case '*': c = *p; if (c != CTLESC && c != '?' && c != '*' && c != '[') { while (*q != c) { if (*q == '\0') return 0; q++; } } do { if (pmatch(p, q)) return 1; } while (*q++ != '\0'); return 0; case '[': { char *endp; int invert, found; char chr; endp = p; if (*endp == '!') endp++; for (;;) { if (*endp == '\0') goto dft; /* no matching ] */ if (*endp == CTLESC) endp++; if (*++endp == ']') break; } invert = 0; if (*p == '!') { invert++; p++; } found = 0; chr = *q++; c = *p++; do { if (c == CTLESC) c = *p++; if (*p == '-' && p[1] != ']') { p++; if (*p == CTLESC) p++; if (chr >= c && chr <= *p) found = 1; p++; } else { if (chr == c) found = 1; } } while ((c = *p++) != ']'); if (found == invert) return 0; break; } dft: default: if (*q++ != c) return 0; break; } } breakloop: if (*q != '\0') return 0; return 1; } /* * Remove any CTLESC characters from a string. */ void rmescapes(str) char *str; { register char *p, *q; p = str; while (*p != CTLESC) { if (*p++ == '\0') return; } q = p; while (*p) { if (*p == CTLESC) p++; *q++ = *p++; } *q = '\0'; } /* * See if a pattern matches in a case statement. */ int casematch(pattern, val) union node *pattern; char *val; { struct stackmark smark; int result; char *p; setstackmark(&smark); argbackq = pattern->narg.backquote; STARTSTACKSTR(expdest); ifslastp = NULL; /* Preserve any CTLESC characters inserted previously, so that we won't expand reg exps which are inside strings. */ argstr(pattern->narg.text, 1); STPUTC('\0', expdest); p = grabstackstr(expdest); result = patmatch(p, val); popstackmark(&smark); return result; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)expand.h 5.1 (Berkeley) 3/7/91 */ struct strlist { struct strlist *next; char *text; }; struct arglist { struct strlist *list; struct strlist **lastp; }; #ifdef __STDC__ union node; void expandarg(union node *, struct arglist *, int); void expandhere(union node *, int); int patmatch(char *, char *); void rmescapes(char *); int casematch(union node *, char *); #else void expandarg(); void expandhere(); int patmatch(); void rmescapes(); int casematch(); #endif .t..cmvdirskillloginnewgrppopdpushdsuspend# Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)cmv 5.1 (Berkeley) 3/7/91 # Conditional move--don't replace an existing file. cmv() { if test $# != 2 then echo "cmv: arg count" return 2 fi if test -f "$2" -o -w "$2" then echo "$2 exists" return 2 fi /bin/mv "$1" "$2" } # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)dirs 5.1 (Berkeley) 3/7/91 # pushd, popd, and dirs --- written by Chris Bertin # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris # as modified by Patrick Elam of GTRI and Kenneth Almquist at UW pushd () { SAVE=`pwd` if [ "$1" = "" ] then if [ "$DSTACK" = "" ] then echo "pushd: directory stack empty." return 1 fi set $DSTACK cd $1 || return shift 1 DSTACK="$*" else cd $1 > /dev/null || return fi DSTACK="$SAVE $DSTACK" dirs } popd () { if [ "$DSTACK" = "" ] then echo "popd: directory stack empty." return 1 fi set $DSTACK cd $1 shift DSTACK=$* dirs } dirs () { echo "`pwd` $DSTACK" return 0 } # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)kill 5.1 (Berkeley) 3/7/91 # Convert job names to process ids and then run /bin/kill. kill() { local args x args= for x in "$@" do case $x in %*) x=`jobid "$x"` ;; esac args="$args $x" done /bin/kill $args } # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)login 5.1 (Berkeley) 3/7/91 # replaces the login builtin in the BSD shell login () exec login "$@" # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)newgrp 5.1 (Berkeley) 3/7/91 newgrp() exec newgrp "$@" # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)popd 5.1 (Berkeley) 3/7/91 # pushd, popd, and dirs --- written by Chris Bertin # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris # as modified by Patrick Elam of GTRI and Kenneth Almquist at UW pushd () { SAVE=`pwd` if [ "$1" = "" ] then if [ "$DSTACK" = "" ] then echo "pushd: directory stack empty." return 1 fi set $DSTACK cd $1 || return shift 1 DSTACK="$*" else cd $1 > /dev/null || return fi DSTACK="$SAVE $DSTACK" dirs } popd () { if [ "$DSTACK" = "" ] then echo "popd: directory stack empty." return 1 fi set $DSTACK cd $1 shift DSTACK=$* dirs } dirs () { echo "`pwd` $DSTACK" return 0 } # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)pushd 5.1 (Berkeley) 3/7/91 # pushd, popd, and dirs --- written by Chris Bertin # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris # as modified by Patrick Elam of GTRI and Kenneth Almquist at UW pushd () { SAVE=`pwd` if [ "$1" = "" ] then if [ "$DSTACK" = "" ] then echo "pushd: directory stack empty." return 1 fi set $DSTACK cd $1 || return shift 1 DSTACK="$*" else cd $1 > /dev/null || return fi DSTACK="$SAVE $DSTACK" dirs } popd () { if [ "$DSTACK" = "" ] then echo "popd: directory stack empty." return 1 fi set $DSTACK cd $1 shift DSTACK=$* dirs } dirs () { echo "`pwd` $DSTACK" return 0 } # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)suspend 5.1 (Berkeley) 3/7/91 suspend() { local - set +j kill -TSTP 0 } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)init.h 5.1 (Berkeley) 3/7/91 */ #ifdef __STDC__ void init(void); void reset(void); void initshellproc(void); #else void init(); void reset(); void initshellproc(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)input.c 5.4 (Berkeley) 7/1/91"; #endif /* not lint */ /* * This file implements the input routines used by the parser. */ #include #include /* defines BUFSIZ */ #include "shell.h" #include #include #include "syntax.h" #include "input.h" #include "output.h" #include "memalloc.h" #include "error.h" #define EOF_NLEFT -99 /* value of parsenleft when EOF pushed back */ /* * The parsefile structure pointed to by the global variable parsefile * contains information about the current file being read. */ MKINIT struct parsefile { int linno; /* current line */ int fd; /* file descriptor (or -1 if string) */ int nleft; /* number of chars left in buffer */ char *nextc; /* next char in buffer */ struct parsefile *prev; /* preceding file on stack */ char *buf; /* input buffer */ }; int plinno = 1; /* input line number */ MKINIT int parsenleft; /* copy of parsefile->nleft */ char *parsenextc; /* copy of parsefile->nextc */ MKINIT struct parsefile basepf; /* top level input file */ char basebuf[BUFSIZ]; /* buffer for top level input file */ struct parsefile *parsefile = &basepf; /* current input file */ char *pushedstring; /* copy of parsenextc when text pushed back */ int pushednleft; /* copy of parsenleft when text pushed back */ #if READLINE char *readline __P((const char *prompt)); char *r_use_prompt = NULL; /* the prompt to use with readline */ #endif #ifdef __STDC__ STATIC void pushfile(void); #else STATIC void pushfile(); #endif #ifdef mkinit INCLUDE "input.h" INCLUDE "error.h" INIT { extern char basebuf[]; basepf.nextc = basepf.buf = basebuf; } RESET { if (exception != EXSHELLPROC) parsenleft = 0; /* clear input buffer */ popallfiles(); } SHELLPROC { popallfiles(); } #endif /* * Read a line from the script. */ char * pfgets(line, len) char *line; { register char *p = line; int nleft = len; int c; while (--nleft > 0) { c = pgetc_macro(); if (c == PEOF) { if (p == line) return NULL; break; } *p++ = c; if (c == '\n') break; } *p = '\0'; return line; } /* * Read a character from the script, returning PEOF on end of file. * Nul characters in the input are silently discarded. */ int pgetc() { return pgetc_macro(); } /* * Refill the input buffer and return the next input character: * * 1) If a string was pushed back on the input, switch back to the regular * buffer. * 2) If an EOF was pushed back (parsenleft == EOF_NLEFT) or we are reading * from a string so we can't refill the buffer, return EOF. * 3) Call read to read in the characters. * 4) Delete all nul characters from the buffer. */ int preadbuffer() { register char *p, *q; register int i; if (pushedstring) { parsenextc = pushedstring; pushedstring = NULL; parsenleft = pushednleft; if (--parsenleft >= 0) return *parsenextc++; } if (parsenleft == EOF_NLEFT || parsefile->buf == NULL) return PEOF; flushout(&output); flushout(&errout); #if READLINE /* Use the readline() call if a prompt is to be printed (interactive). */ if (r_use_prompt != NULL) { char *prompt; char *line; p = parsenextc = parsefile->buf; prompt = r_use_prompt; r_use_prompt = NULL; if ((line = readline(prompt)) == NULL) { parsenleft = EOF_NLEFT; return PEOF; } strcpy(p, line); free(line); i = strlen(p); p[i++] = '\n'; } else { #endif retry: p = parsenextc = parsefile->buf; i = read(parsefile->fd, p, BUFSIZ); if (i <= 0) { if (i < 0) { if (errno == EINTR) goto retry; #ifdef EWOULDBLOCK if (parsefile->fd == 0 && errno == EWOULDBLOCK) { int flags = fcntl(0, F_GETFL, 0); if (flags >= 0 && flags & O_NONBLOCK) { flags &=~ O_NONBLOCK; if (fcntl(0, F_SETFL, flags) >= 0) { out2str("sh: turning off NDELAY mode\n"); goto retry; } } } #endif } parsenleft = EOF_NLEFT; return PEOF; } #if READLINE } #endif parsenleft = i - 1; /* delete nul characters */ for (;;) { if (*p++ == '\0') break; if (--i <= 0) return *parsenextc++; /* no nul characters */ } q = p - 1; while (--i > 0) { if (*p != '\0') *q++ = *p; p++; } if (q == parsefile->buf) goto retry; /* buffer contained nothing but nuls */ parsenleft = q - parsefile->buf - 1; return *parsenextc++; } /* * Undo the last call to pgetc. Only one character may be pushed back. * PEOF may be pushed back. */ void pungetc() { parsenleft++; parsenextc--; } /* * Push a string back onto the input. This code doesn't work if the user * tries to push back more than one string at once. */ void ppushback(string, length) char *string; { pushedstring = parsenextc; pushednleft = parsenleft; parsenextc = string; parsenleft = length; } /* * Set the input to take input from a file. If push is set, push the * old input onto the stack first. */ void setinputfile(fname, push) char *fname; { int fd; int fd2; INTOFF; if ((fd = open(fname, O_RDONLY)) < 0) error("Can't open %s", fname); if (fd < 10) { fd2 = copyfd(fd, 10); close(fd); if (fd2 < 0) error("Out of file descriptors"); fd = fd2; } setinputfd(fd, push); INTON; } /* * Like setinputfile, but takes an open file descriptor. Call this with * interrupts off. */ void setinputfd(fd, push) { (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); if (push) { pushfile(); parsefile->buf = ckmalloc(BUFSIZ); } if (parsefile->fd > 0) close(parsefile->fd); parsefile->fd = fd; if (parsefile->buf == NULL) parsefile->buf = ckmalloc(BUFSIZ); parsenleft = 0; plinno = 1; } /* * Like setinputfile, but takes input from a string. */ void setinputstring(string, push) char *string; { INTOFF; if (push) pushfile(); parsenextc = string; parsenleft = strlen(string); parsefile999->buf = NULL; plinno = 1; INTON; } /* * To handle the "." command, a stack of input files is used. Pushfile * adds a new entry to the stack and popfile restores the previous level. */ STATIC void pushfile() { struct parsefile *pf; parsefile->nleft = parsenleft; parsefile->nextc = parsenextc; parsefile->linno = plinno; pf = (struct parsefile *)ckmalloc(sizeof (struct parsefile)); pf->prev = parsefile; pf->fd = -1; parsefile = pf; } void popfile() { struct parsefile *pf = parsefile; INTOFF; if (pf->fd >= 0) close(pf->fd); if (pf->buf) ckfree(pf->buf); parsefile = pf->prev; ckfree(pf); parsenleft = parsefile->nleft; parsenextc = parsefile->nextc; plinno = parsefile->linno; INTON; } /* * Return to top level. */ void popallfiles() { while (parsefile != &basepf) popfile(); } /* * Close the file(s) that the shell is reading commands from. Called * after a fork is done. */ void closescript() { popallfiles(); if (parsefile->fd > 0) { close(parsefile->fd); parsefile->fd = 0; } } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)input.h 5.1 (Berkeley) 3/7/91 */ /* PEOF (the end of file marker) is defined in syntax.h */ /* * The input line number. Input.c just defines this variable, and saves * and restores it when files are pushed and popped. The user of this * package must set its value. */ extern int plinno; extern int parsenleft; /* number of characters left in input buffer */ extern char *parsenextc; /* next character in input buffer */ #ifdef __STDC__ char *pfgets(char *, int); int pgetc(void); int preadbuffer(void); void pungetc(void); void ppushback(char *, int); void setinputfile(char *, int); void setinputfd(int, int); void setinputstring(char *, int); void popfile(void); void popallfiles(void); void closescript(void); #else char *pfgets(); int pgetc(); int preadbuffer(); void pungetc(); void ppushback(); void setinputfile(); void setinputfd(); void setinputstring(); void popfile(); void popallfiles(); void closescript(); #endif #define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer()) #if READLINE /* The variable "r_use_prompt" indicates the prompt to use with readline, * *and* that readline may only be used if non-NULL. */ extern char *r_use_prompt; #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)jobs.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ #include "shell.h" #if JOBS #include "sgtty.h" #undef CEOF /* syntax.h redefines this */ #endif #include "main.h" #include "parser.h" #include "nodes.h" #include "jobs.h" #include "options.h" #include "trap.h" #include "signames.h" #include "syntax.h" #include "input.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #include "redir.h" #include #include #include #include #ifdef BSD #include #include #include #include #endif #if POSIX #include #endif struct job *jobtab; /* array of jobs */ int njobs; /* size of array */ MKINIT short backgndpid = -1; /* pid of last background process */ #if JOBS int initialpgrp; /* pgrp of shell on invocation */ short curjob; /* current job */ #endif #ifdef __STDC__ STATIC void restartjob(struct job *); STATIC struct job *getjob(char *); STATIC void freejob(struct job *); STATIC int procrunning(int); STATIC int dowait(int, struct job *); STATIC int waitproc(int, int *); STATIC char *commandtext(union node *); #else STATIC void restartjob(); STATIC struct job *getjob(); STATIC void freejob(); STATIC int procrunning(); STATIC int dowait(); STATIC int waitproc(); STATIC char *commandtext(); #endif #if JOBS /* * Turn job control on and off. * * Note: This code assumes that the third arg to ioctl is a character * pointer, which is true on Berkeley systems but not System V. Since * System V doesn't have job control yet, this isn't a problem now. */ MKINIT int jobctl; void setjobctl(on) { int ldisc; if (on == jobctl || rootshell == 0) return; if (on) { do { /* while we are in the background */ if (ioctl(2, TIOCGPGRP, (char *)&initialpgrp) < 0) { out2str("ash: can't access tty; job control turned off\n"); jflag = 0; return; } if (initialpgrp == -1) initialpgrp = getpgrp(0); else if (initialpgrp != getpgrp(0)) { killpg(initialpgrp, SIGTTIN); continue; } } while (0); if (ioctl(2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) { out2str("ash: need new tty driver to run job control; job control turned off\n"); jflag = 0; return; } setsignal(SIGTSTP); setsignal(SIGTTOU); setpgrp(0, rootpid); ioctl(2, TIOCSPGRP, (char *)&rootpid); } else { /* turning job control off */ setpgrp(0, initialpgrp); ioctl(2, TIOCSPGRP, (char *)&initialpgrp); setsignal(SIGTSTP); setsignal(SIGTTOU); } jobctl = on; } #endif #ifdef mkinit SHELLPROC { backgndpid = -1; #if JOBS jobctl = 0; #endif } #endif #if JOBS fgcmd(argc, argv) char **argv; { struct job *jp; int pgrp; int status; jp = getjob(argv[1]); if (jp->jobctl == 0) error("job not created under job control"); pgrp = jp->ps[0].pid; ioctl(2, TIOCSPGRP, (char *)&pgrp); restartjob(jp); INTOFF; status = waitforjob(jp); INTON; return status; } bgcmd(argc, argv) char **argv; { struct job *jp; do { jp = getjob(*++argv); if (jp->jobctl == 0) error("job not created under job control"); restartjob(jp); } while (--argc > 1); return 0; } STATIC void restartjob(jp) struct job *jp; { struct procstat *ps; int i; if (jp->state == JOBDONE) return; INTOFF; killpg(jp->ps[0].pid, SIGCONT); for (ps = jp->ps, i = jp->nprocs ; --i >= 0 ; ps++) { if ((ps->status & 0377) == 0177) { ps->status = -1; jp->state = 0; } } INTON; } #endif int jobscmd(argc, argv) char **argv; { showjobs(0); return 0; } /* * Print a list of jobs. If "change" is nonzero, only print jobs whose * statuses have changed since the last call to showjobs. * * If the shell is interrupted in the process of creating a job, the * result may be a job structure containing zero processes. Such structures * will be freed here. */ void showjobs(change) { int jobno; int procno; int i; struct job *jp; struct procstat *ps; int col; char s[64]; TRACE(("showjobs(%d) called\n", change)); while (dowait(0, (struct job *)NULL) > 0); for (jobno = 1, jp = jobtab ; jobno <= njobs ; jobno++, jp++) { if (! jp->used) continue; if (jp->nprocs == 0) { freejob(jp); continue; } if (change && ! jp->changed) continue; procno = jp->nprocs; for (ps = jp->ps ; ; ps++) { /* for each process */ if (ps == jp->ps) fmtstr(s, 64, "[%d] %d ", jobno, ps->pid); else fmtstr(s, 64, " %d ", ps->pid); out1str(s); col = strlen(s); s[0] = '\0'; if (ps->status == -1) { /* don't print anything */ } else if ((ps->status & 0xFF) == 0) { fmtstr(s, 64, "Exit %d", ps->status >> 8); } else { i = ps->status; #if JOBS if ((i & 0xFF) == 0177) i >>= 8; #endif if ((i & 0x7F) <= MAXSIG && sigmesg[i & 0x7F]) scopy(sigmesg[i & 0x7F], s); else fmtstr(s, 64, "Signal %d", i & 0x7F); if (i & 0x80) strcat(s, " (core dumped)"); } out1str(s); col += strlen(s); do { out1c(' '); col++; } while (col < 30); out1str(ps->cmd); out1c('\n'); if (--procno <= 0) break; } jp->changed = 0; if (jp->state == JOBDONE) { freejob(jp); } } } /* * Mark a job structure as unused. */ STATIC void freejob(jp) struct job *jp; { struct procstat *ps; int i; INTOFF; for (i = jp->nprocs, ps = jp->ps ; --i >= 0 ; ps++) { if (ps->cmd != nullstr) ckfree(ps->cmd); } if (jp->ps != &jp->ps0) ckfree(jp->ps); jp->used = 0; #if JOBS if (curjob == jp - jobtab + 1) curjob = 0; #endif INTON; } int waitcmd(argc, argv) char **argv; { struct job *job; int status; struct job *jp; if (argc > 1) { job = getjob(argv[1]); } else { job = NULL; } for (;;) { /* loop until process terminated or stopped */ if (job != NULL) { if (job->state) { status = job->ps[job->nprocs - 1].status; if ((status & 0xFF) == 0) status = status >> 8 & 0xFF; #if JOBS else if ((status & 0xFF) == 0177) status = (status >> 8 & 0x7F) + 128; #endif else status = (status & 0x7F) + 128; if (! iflag) freejob(job); return status; } } else { for (jp = jobtab ; ; jp++) { if (jp >= jobtab + njobs) { /* no running procs */ 9999999999999999 return 0; } if (jp->used && jp->state == 0) break; } } dowait(1, (struct job *)NULL); } } jobidcmd(argc, argv) char **argv; { struct job *jp; int i; jp = getjob(argv[1]); for (i = 0 ; i < jp->nprocs ; ) { out1fmt("%d", jp->ps[i].pid); out1c(++i < jp->nprocs? ' ' : '\n'); } return 0; } /* * Convert a job name to a job structure. */ STATIC struct job * getjob(name) char *name; { int jobno; register struct job *jp; int pid; int i; if (name == NULL) { #if JOBS currentjob: if ((jobno = curjob) == 0 || jobtab[jobno - 1].used == 0) error("No current job"); return &jobtab[jobno - 1]; #else error("No current job"); #endif } else if (name[0] == '%') { if (is_digit(name[1])) { jobno = number(name + 1); if (jobno > 0 && jobno <= njobs && jobtab[jobno - 1].used != 0) return &jobtab[jobno - 1]; #if JOBS } else if (name[1] == '%' && name[2] == '\0') { goto currentjob; #endif } else { register struct job *found = NULL; for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { if (jp->used && jp->nprocs > 0 && prefix(name + 1, jp->ps[0].cmd)) { if (found) error("%s: ambiguous", name); found = jp; } } if (found) return found; } } else if (is_number(name)) { pid = number(name); for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) { if (jp->used && jp->nprocs > 0 && jp->ps[jp->nprocs - 1].pid == pid) return jp; } } error("No such job: %s", name); } /* * Return a new job structure, */ struct job * makejob(node, nprocs) union node *node; { int i; struct job *jp; for (i = njobs, jp = jobtab ; ; jp++) { if (--i < 0) { INTOFF; if (njobs == 0) { jobtab = ckmalloc(4 * sizeof jobtab[0]); } else { jp = ckmalloc((njobs + 4) * sizeof jobtab[0]); bcopy(jobtab, jp, njobs * sizeof jp[0]); for (i= 0; i= 0 ; jobtab[njobs++].used = 0); INTON; break; } if (jp->used == 0) break; } INTOFF; jp->state = 0; jp->used = 1; jp->changed = 0; jp->nprocs = 0; #if JOBS jp->jobctl = jobctl; #endif if (nprocs > 1) { jp->ps = ckmalloc(nprocs * sizeof (struct procstat)); } else { jp->ps = &jp->ps0; } INTON; TRACE(("makejob(0x%x, %d) returns %%%d\n", (int)node, nprocs, jp - jobtab + 1)); return jp; } /* * Fork of a subshell. If we are doing job control, give the subshell its * own process group. Jp is a job structure that the job is to be added to. * N is the command that will be evaluated by the child. Both jp and n may * be NULL. The mode parameter can be one of the following: * FORK_FG - Fork off a foreground process. * FORK_BG - Fork off a background process. * FORK_NOJOB - Like FORK_FG, but don't give the process its own * process group even if job control is on. * * When job control is turned off, background processes have their standard * input redirected to /dev/null (except for the second and later processes * in a pipeline). */ int forkshell(jp, n, mode) union node *n; struct job *jp; { int pid; int pgrp; TRACE(("forkshell(%%%d, 0x%x, %d) called\n", jp - jobtab, (int)n, mode)); INTOFF; pid = fork(); if (pid == -1) { TRACE(("Fork failed, errno=%d\n", errno)); INTON; error("Cannot fork"); } if (pid == 0) { struct job *p; int wasroot; int i; TRACE(("Child shell %d\n", getpid())); wasroot = rootshell; rootshell = 0; for (i = njobs, p = jobtab ; --i >= 0 ; p++) if (p->used) freejob(p); closescript(); INTON; clear_traps(); #if JOBS jobctl = 0; /* do job control only in root shell */ if (wasroot && mode != FORK_NOJOB && jflag) { if (jp == NULL || jp->nprocs == 0) pgrp = getpid(); else pgrp = jp->ps[0].pid; setpgrp(0, pgrp); if (mode == FORK_FG) { /*** this causes superfluous TIOCSPGRPS ***/ if (ioctl(2, TIOCSPGRP, (char *)&pgrp) < 0) error("TIOCSPGRP failed, errno=%d\n", errno); } setsignal(SIGTSTP); setsignal(SIGTTOU); } else if (mode == FORK_BG) { ignoresig(SIGINT); ignoresig(SIGQUIT); if ((jp == NULL || jp->nprocs == 0) && ! fd0_redirected_p ()) { close(0); if (open("/dev/null", O_RDONLY) != 0) error("Can't open /dev/null"); } } #else if (mode == FORK_BG) { ignoresig(SIGINT); ignoresig(SIGQUIT); if ((jp == NULL || jp->nprocs == 0) && ! fd0_redirected_p ()) { close(0); if (open("/dev/null", O_RDONLY) != 0) error("Can't open /dev/null"); } } #endif if (wasroot && iflag) { setsignal(SIGINT); setsignal(SIGQUIT); setsignal(SIGTERM); } return pid; } if (rootshell && mode != FORK_NOJOB && jflag) { if (jp == NULL || jp->nprocs == 0) pgrp = pid; else pgrp = jp->ps[0].pid; #if JOBS setpgrp(pid, pgrp); #endif } if (mode == FORK_BG) backgndpid = pid; /* set $! */ if (jp) { struct procstat *ps = &jp->ps[jp->nprocs++]; ps->pid = pid; ps->status = -1; ps->cmd = nullstr; if (iflag && rootshell && n) ps->cmd = commandtext(n); } INTON; TRACE(("In parent shell: child = %d\n", pid)); return pid; } /* * Wait for job to finish. * * Under job control we have the problem that while a child process is * running interrupts generated by the user are sent to the child but not * to the shell. This means that an infinite loop started by an inter- * active user may be hard to kill. With job control turned off, an * interactive user may place an interactive program inside a loop. If * the interactive program catches interrupts, the user doesn't want * these interrupts to also abort the loop. The approach we take here * is to have the shell ignore interrupt signals while waiting for a * forground process to terminate, and then send itself an interrupt * signal if the child process was terminated by an interrupt signal. * Unfortunately, some programs want to do a bit of cleanup and then * exit on interrupt; unless these processes terminate themselves by * sending a signal to themselves (instead of calling exit) they will * confuse this approach. */ int waitforjob(jp) register struct job *jp; { #if JOBS int mypgrp = getpgrp(0); #endif int status; int st; INTOFF; TRACE(("waitforjob(%%%d) called\n", jp - jobtab + 1)); while (jp->state == 0 && dowait(1, jp) != -1) ; #if JOBS if (jp->jobctl) { if (ioctl(2, TIOCSPGRP, (char *)&mypgrp) < 0) error("TIOCSPGRP failed, errno=%d\n", errno); } if (jp->state == JOBSTOPPED) curjob = jp - jobtab + 1; #endif status = jp->ps[jp->nprocs - 1].status; /* convert to 8 bits */ if ((status & 0xFF) == 0) st = status >> 8 & 0xFF; #if JOBS else if ((status & 0xFF) == 0177) st = (status >> 8 & 0x7F) + 128; #endif else st = (status & 0x7F) + 128; if (! JOBS || jp->state == JOBDONE) freejob(jp); CLEAR_PENDING_INT; if ((status & 0x7F) == SIGINT) kill(getpid(), SIGINT); INTON; return st; } /* * Wait for a process to terminate. */ STATIC int dowait(block, job) struct job *job; { int pid; int status; struct procstat *sp; struct job *jp; struct job *thisjob; int done; int stopped; int core; TRACE(("dowait(%d) called\n", block)); do { pid = waitproc(block, &status); TRACE(("wait returns %d, status=%d, errno=%d\n", pid, status, errno)); } while (pid == -1 && errno == EINTR); if (pid <= 0) return pid; INTOFF; thisjob = NULL; for (jp = jobtab ; jp < jobtab + njobs ; jp++) { if (jp->used) { done = 1; stopped = 1; for (sp = jp->ps ; sp < jp->ps + jp->nprocs ; sp++) { if (sp->pid == -1) continue; if (sp->pid == pid) { TRACE(("Changin status of proc %d from 0x%x to 0x%x\n", pid, sp->status, status)); sp->status = status; thisjob = jp; } if (sp->status == -1) stopped = 0; else if ((sp->status & 0377) == 0177) done = 0; } if (stopped) { /* stopped or done */ int state = done? JOBDONE : JOBSTOPPED; if (jp->state != state) { TRACE(("Job %d: changing state from %d to %d\n", jp - jobtab + 1, jp->state, state)); jp->state = state; #if JOBS if (done && curjob == jp - jobtab + 1) curjob = 0; /* no current job */ #endif } } } } INTON; if (! rootshell || ! iflag || (job && thisjob == job)) { #if JOBS if ((status & 0xFF) == 0177) status >>= 8; #endif core = status & 0x80; status &= 0x7F; if (status != 0 && status != SIGINT && status != SIGPIPE) { if (thisjob != job) outfmt(out2, "%d: ", pid); #if JOBS if (status == SIGTSTP && rootshell && iflag) outfmt(out2, "%%%d ", job - jobtab + 1); #endif if (status <= MAXSIG && sigmesg[status]) out2str(sigmesg[status]); else outfmt(out2, "Signal %d", status); if (core) out2str(" - core dumped"); out2c('\n'); flushout(&errout); } else { TRACE(("Not printing status: status=%d\n", status)); } } else { TRACE(("Not printing status, rootshell=%d, job=0x%x\n", rootshell, job)); if (thisjob) thisjob->changed = 1; } return pid; } /* * Do a wait system call. If job control is compiled in, we accept * stopped processes. If block is zero, we return a value of zero * rather than blocking. * * System V doesn't have a non-blocking wait system call. It does * have a SIGCLD signal that is sent to a process when one of it's * children dies. The obvious way to use SIGCLD would be to install * a handler for SIGCLD which simply bumped a counter when a SIGCLD * was received, and have waitproc bump another counter when it got * the status of a process. Waitproc would then know that a wait * system call would not block if the two counters were different. * This approach doesn't work because if a process has children that * have not been waited for, System V will send it a SIGCLD when it * installs a signal handler for SIGCLD. What this means is that when * a child exits, the shell will be sent SIGCLD signals continuously * until is runs out of stack space, unless it does a wait call before * restoring the signal handler. The code below takes advantage of * this (mis)feature by installing a signal handler for SIGCLD and * then checking to see whether it was called. If there are any * children to be waited for, it will be. * * If neither SYSV nor BSD is defined, we don't implement nonblocking * waits at all. In this case, the user will not be informed when * a background process until the next time she runs a real program * (as opposed to running a builtin command or just typing return), * and the jobs command may give out of date information. */ #ifdef SYSV STATIC int gotsigchild; STATIC int onsigchild() { gotsigchild = 1; } #endif STATIC int waitproc(block, status) int *status; { #ifdef BSD int flags; #if JOBS flags = WUNTRACED; #else flags = 0; #endif if (block == 0) flags |= WNOHANG; return wait3((union wait *)status, flags, (struct rusage *)NULL); #else #ifdef SYSV int (*save)(); if (block == 0) { gotsigchild = 0; save = signal(SIGCLD, onsigchild); signal(SIGCLD, save); if (gotsigchild == 0) return 0; } return wait(status); #else #if POSIX return waitpid(-1, status, block == 0 ? WNOHANG : 0); #else if (block == 0) return 0; return wait(status); #endif #endif #endif } /* * Return a string identifying a command (to be printed by the * jobs command. */ STATIC char *cmdnextc; STATIC int cmdnleft; STATIC void cmdtxt(), cmdputs(); STATIC char * commandtext(n) union node *n; { char *name; cmdnextc = name = ckmalloc(50); cmdnleft = 50 - 4; cmdtxt(n); *cmdnextc = '\0'; return name; } STATIC void cmdtxt(n) union node *n; { union node *np; struct nodelist *lp; char *p; int i; char s[2]; if (n == NULL) return; switch (n->type) { case NSEMI: cmdtxt(n->nbinary.ch1); cmdputs("; "); cmdtxt(n->nbinary.ch2); break; case NAND: cmdtxt(n->nbinary.ch1); cmdputs(" && "); cmdtxt(n->nbinary.ch2); break; case NOR: cmdtxt(n->nbinary.ch1); cmdputs(" || "); cmdtxt(n->nbinary.ch2); break; case NPIPE: for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { cmdtxt(lp->n); if (lp->next) cmdputs(" | "); } break; case NSUBSHELL: cmdputs("("); cmdtxt(n->nredir.n); cmdputs(")"); break; case NREDIR: case NBACKGND: cmdtxt(n->nredir.n); break; case NIF: cmdputs("if "); cmdtxt(n->nif.test); cmdputs("; then "); cmdtxt(n->nif.ifpart); cmdputs("..."); break; case NWHILE: cmdputs("while "); goto until; case NUNTIL: cmdputs("until "); until: cmdtxt(n->nbinary.ch1); cmdputs("; do "); cmdtxt(n->nbinary.ch2); cmdputs("; done"); break; case NFOR: cmdputs("for "); cmdputs(n->nfor.var); cmdputs(" in ..."); break; case NCASE: cmdputs("case "); cmdputs(n->ncase.expr->narg.text); cmdputs(" in ..."); break; case NDEFUN: cmdputs(n->narg.text); cmdputs("() ..."); break; case NCMD: for (np = n->ncmd.args ; np ; np = np->narg.next) { cmdtxt(np); if (np->narg.next) cmdputs(" "); } for (np = n->ncmd.redirect ; np ; np = np->nfile.next) { cmdputs(" "); cmdtxt(np); } break; case NARG: cmdputs(n->narg.text); break; case NTO: p = ">"; i = 1; goto redir; case NAPPEND: p = ">>"; i = 1; goto redir; case NTOFD: p = ">&"; i = 1; goto redir; case NFROM: p = "<"; i = 0; goto redir; case NFROMFD: p = "<&"; i = 0; goto redir; redir: if (n->nfile.fd != i) { s[0] = n->nfile.fd + '0'; s[1] = '\0'; cmdputs(s); } cmdputs(p); if (n->type == NTOFD || n->type == NFROMFD) { s[0] = n->ndup.dupfd + '0'; s[1] = '\0'; cmdputs(s); } else { cmdtxt(n->nfile.fname); } break; case NHERE: case NXHERE: cmdputs("<<..."); break; default: cmdputs("???"); break; } } STATIC void cmdputs(s) char *s; { register char *p, *q; register char c; int subtype = 0; if (cmdnleft <= 0) return; p = s; q = cmdnextc; while ((c = *p++) != '\0') { if (c == CTLESC) *q++ = *p++; else if (c == CTLVAR) { *q++ = '$'; if (--cmdnleft > 0) *q++ = '{'; subtype = *p++; } else if (c == '=' && subtype != 0) { *q++ = "}-+?="[(subtype & VSTYPE) - VSNORMAL]; subtype = 0; } else if (c == CTLENDVAR) { *q++ = '}'; } else if (c == CTLBACKQ | c == CTLBACKQ+CTLQUOTE) cmdnleft++; /* ignore it */ else *q++ = c; if (--cmdnleft <= 0) { *q++ = '.'; *q++ = '.'; *q++ = '.'; break; } } cmdnextc = q; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)jobs.h 5.1 (Berkeley) 3/7/91 */ /* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */ #define FORK_FG 0 #define FORK_BG 1 #define FORK_NOJOB 2 /* * A job structure contains information about a job. A job is either a * single process or a set of processes contained in a pipeline. In the * latter case, pidlist will be non-NULL, and will point to a -1 terminated * array of pids. */ struct procstat { short pid; /* process id */ short status; /* status flags (defined above) */ char *cmd; /* text of command being run */ }; /* states */ #define JOBSTOPPED 1 /* all procs are stopped */ #define JOBDONE 2 /* all procs are completed */ struct job { struct procstat ps0; /* status of process */ struct procstat *ps; /* status or processes when more than one */ short nprocs; /* number of processes */ short pgrp; /* process group of this job */ char state; /* true if job is finished */ char used; /* true if this entry is in used */ char changed; /* true if status has changed */ #if JOBS char jobctl; /* job running under job control */ #endif }; extern short backgndpid; /* pid of last background process */ #ifdef __STDC__ void setjobctl(int); void showjobs(int); struct job *makejob(union node *, int); int forkshell(struct job *, union node *, int); int waitforjob(struct job *); #else void setjobctl(); void showjobs(); struct job *makejob(); int forkshell(); int waitforjob(); #endif #if ! JOBS #define setjobctl(on) /* do nothing */ #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)machdep.h 5.1 (Berkeley) 3/7/91 */ /* * Most machines require the value returned from malloc to be aligned * in some way. The following macro will get this right on many machines. */ #ifndef ALIGN union align { int i; char *cp; }; #define ALIGN(nbytes) ((nbytes) + sizeof(union align) - 1 &~ (sizeof(union align) - 1)) #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)mail.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * Routines to check for mail. (Perhaps make part of main.c?) */ #include "shell.h" #include "exec.h" /* defines padvance() */ #include "var.h" #include "output.h" #include "memalloc.h" #include "error.h" #include #include #define MAXMBOXES 10 STATIC int nmboxes; /* number of mailboxes */ STATIC time_t mailtime[MAXMBOXES]; /* times of mailboxes */ /* * Print appropriate message(s) if mail has arrived. If the argument is * nozero, then the value of MAIL has changed, so we just update the * values. */ void chkmail(silent) { register int i; char *mpath; char *p; register char *q; struct stackmark smark; struct stat statb; if (silent) nmboxes = 10; if (nmboxes == 0) return; setstackmark(&smark); mpath = mpathset()? mpathval() : mailval(); for (i = 0 ; i < nmboxes ; i++) { p = padvance(&mpath, nullstr); if (p == NULL) break; if (*p == '\0') continue; for (q = p ; *q ; q++); if (q[-1] != '/') abort(); q[-1] = '\0'; /* delete trailing '/' */ if (stat(p, &statb) < 0) statb.st_mtime = 0; if (!silent && statb.st_size > 0 && statb.st_mtime > mailtime[i] && statb.st_mtime > statb.st_atime ) { out2str(pathopt? pathopt : "You have mail"); out2c('\n'); } mailtime[i] = statb.st_mtime; } nmboxes = i; popstackmark(&smark); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)mail.h 5.1 (Berkeley) 3/7/91 */ #ifdef __STDC__ void chkmail(int); #else void chkmail(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)main.c 5.2 (Berkeley) 3/13/91"; #endif /* not lint */ #include #include #include #include "shell.h" #include "main.h" #include "mail.h" #include "options.h" #include "output.h" #include "parser.h" #include "nodes.h" #include "eval.h" #include "jobs.h" #include "input.h" #include "trap.h" #if ATTY #include "var.h" #endif #include "memalloc.h" #include "error.h" #include "init.h" #include "mystring.h" #define PROFILE 0 int rootpid; int rootshell; STATIC union node *curcmd; STATIC union node *prevcmd; extern int errno; #if PROFILE short profile_buf[16384]; extern int etext(); #endif #ifdef __STDC__ STATIC void read_profile(char *); char *getenv(char *); #else STATIC void read_profile(); char *getenv(); #endif /* * Main routine. We initialize things, parse the arguments, execute * profiles if we're a login shell, and then call cmdloop to execute * commands. The setjmp call sets up the location to jump to when an * exception occurs. When an exception occurs the variable "state" * is used to figure out how far we had gotten. */ main(argc, argv) char **argv; { struct jmploc jmploc; struct stackmark smark; volatile int state; char *shinit, *home; char *profile = NULL, *ashrc = NULL; #if PROFILE monitor(4, etext, profile_buf, sizeof profile_buf, 50); #endif state = 0; if (setjmp(jmploc.loc)) { /* * When a shell procedure is executed, we raise the * exception EXSHELLPROC to clean up before executing * the shell procedure. */ if (exception == EXSHELLPROC) { rootpid = getpid(); rootshell = 1; minusc = NULL; state = 3; } else if (state == 0 || iflag == 0 || ! rootshell) exitshell(2); reset(); #if ATTY if (exception == EXINT && (! attyset() || equal(termval(), "emacs"))) { #else if (exception == EXINT) { #endif out2c('\n'); flushout(&errout); } popstackmark(&smark); FORCEINTON; /* enable interrupts */ if (state == 1) goto state1; else if (state == 2) goto state2; else if (state == 3) goto state3; else goto state4; } handler = &jmploc; #if DEBUG opentrace(); trputs("Shell args: "); trargs(argv); #endif rootpid = getpid(); rootshell = 1; init(); setstackmark(&smark); procargs(argc, argv); if (eflag) eflag = 2; /* Truly enable [ex]flag after init. */ if (xflag) xflag = 2; if (argv[0] && argv[0][0] == '-') { state = 1; read_profile("/etc/profile"); state1: state = 2; if ((home = getenv("HOME")) != NULL && (profile = (char *) malloc(strlen(home) + 10)) != NULL) { strcpy(profile, home); strcat(profile, "/.profile"); read_profile(profile); } else { read_profile(".profile"); } } else if ((sflag || minusc) && (shinit = getenv("SHINIT")) != NULL) { state = 2; evalstring(shinit); } state2: if (profile != NULL) free(profile); state = 3; if (!argv[0] || argv[0][0] != '-') { if ((home = getenv("HOME")) != NULL && (ashrc = (char *) malloc(strlen(home) + 8)) != NULL) { strcpy(ashrc, home); strcat(ashrc, "/.ashrc"); read_profile(ashrc); } } state3: if (ashrc != NULL) free(ashrc); if (eflag) eflag = 1; /* Init done, enable [ex]flag */ if (xflag) xflag = 1; exitstatus = 0; /* Init shouldn't influence initial $? */ state = 4; if (minusc) { evalstring(minusc); } if (sflag || minusc == NULL) { state4: cmdloop(1); } #if PROFILE monitor(0); #endif exitshell(exitstatus); } /* * Read and execute commands. "Top" is nonzero for the top level command * loop; it turns on prompting if the shell is interactive. */ void cmdloop(top) { union node *n; struct stackmark smark; int inter; int numeof; TRACE(("cmdloop(%d) called\n", top)); setstackmark(&smark); numeof = 0; for (;;) { if (pendingsigs) dotrap(); inter = 0; if (iflag && top) { inter++; showjobs(1); chkmail(0); flushout(&output); } n = parsecmd(inter); #if DEBUG /* showtree(n); */ #endif if (n == NEOF) { if (Iflag == 0 || numeof >= 50) break; out2str("\nUse \"exit\" to leave shell.\n"); numeof++; } else if (n != NULL && nflag == 0) { if (inter) { INTOFF; if (prevcmd) freefunc(prevcmd); prevcmd = curcmd; curcmd = copyfunc(n); INTON; } evaltree(n, 0); #ifdef notdef if (exitstatus) /*DEBUG*/ outfmt(&errout, "Exit status 0x%X\n", exitstatus); #endif } popstackmark(&smark); } popstackmark(&smark); /* unnecessary */ } /* * Read /etc/profile or .profile. Return on error. */ STATIC void read_profile(name) char *name; { int fd; INTOFF; if ((fd = open(name, O_RDONLY)) >= 0) setinputfd(fd, 1); INTON; if (fd < 0) return; cmdloop(0); popfile(); } /* * Read a file containing shell functions. */ void readcmdfile(name) char *name; { int fd; INTOFF; if ((fd = open(name, O_RDONLY)) >= 0) setinputfd(fd, 1); else error("Can't open %s", name); INTON; cmdloop(0); popfile(); } /* * Take commands from a file. To be compatable we should do a path * search for the file, but a path search doesn't make any sense. */ dotcmd(argc, argv) char **argv; { exitstatus = 0; if (argc >= 2) { /* That's what SVR2 does */ setinputfile(argv[1], 1); commandname = argv[1]; cmdloop(0); popfile(); } return exitstatus; } exitcmd(argc, argv) char **argv; { if (argc > 1) exitstatus = number(argv[1]); exitshell(exitstatus); } lccmd(argc, argv) char **argv; { if (argc > 1) { defun(argv[1], prevcmd); return 0; } else { INTOFF; freefunc(curcmd); curcmd = prevcmd; prevcmd = NULL; INTON; evaltree(curcmd, 0); return exitstatus; } } #ifdef notdef /* * Should never be called. */ void exit(exitstatus) { _exit(exitstatus); } #endif 49/*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)main.h 5.1 (Berkeley) 3/7/91 */ extern int rootpid; /* pid of main shell */ extern int rootshell; /* true if we aren't a child of the main shell */ #ifdef __STDC__ void readcmdfile(char *); void cmdloop(int); #else void readcmdfile(); void cmdloop(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)memalloc.c 5.2 (Berkeley) 3/13/91"; #endif /* not lint */ #include "shell.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "machdep.h" #include "mystring.h" /* * Like malloc, but returns an error when out of space. */ pointer ckmalloc(nbytes) { register pointer p; pointer malloc(); if ((p = malloc(nbytes)) == NULL) error("Out of space"); return p; } /* * Same for realloc. */ pointer ckrealloc(p, nbytes) register pointer p; { pointer realloc(); if ((p = realloc(p, nbytes)) == NULL) error("Out of space"); return p; } /* * Make a copy of a string in safe storage. */ char * savestr(s) char *s; { register char *p; p = ckmalloc(strlen(s) + 1); scopy(s, p); return p; } /* * Parse trees for commands are allocated in lifo order, so we use a stack * to make this more efficient, and also to avoid all sorts of exception * handling code to handle interrupts in the middle of a parse. * * The size 504 was chosen because the Ultrix malloc handles that size * well. */ #define MINSIZE 504 /* minimum size of a block */ struct stack_block { struct stack_block *prev; char space[MINSIZE]; }; struct stack_block stackbase; struct stack_block *stackp = &stackbase; char *stacknxt = stackbase.space; int stacknleft = MINSIZE; int sstrnleft; int herefd = -1; pointer stalloc(nbytes) { register char *p; nbytes = ALIGN(nbytes); if (nbytes > stacknleft) { int blocksize; struct stack_block *sp; blocksize = nbytes; if (blocksize < MINSIZE) blocksize = MINSIZE; INTOFF; sp = ckmalloc(sizeof(struct stack_block) - MINSIZE + blocksize); sp->prev = stackp; stacknxt = sp->space; stacknleft = blocksize; stackp = sp; INTON; } p = stacknxt; stacknxt += nbytes; stacknleft -= nbytes; return p; } void stunalloc(p) pointer p; { if (p == NULL) { /*DEBUG */ write(2, "stunalloc\n", 10); abort(); } stacknleft += stacknxt - (char *)p; stacknxt = p; } void setstackmark(mark) struct stackmark *mark; { mark->stackp = stackp; mark->stacknxt = stacknxt; mark->stacknleft = stacknleft; } void popstackmark(mark) struct stackmark *mark; { struct stack_block *sp; INTOFF; while (stackp != mark->stackp) { sp = stackp; stackp = sp->prev; ckfree(sp); } stacknxt = mark->stacknxt; stacknleft = mark->stacknleft; INTON; } /* * When the parser reads in a string, it wants to stick the string on the * stack and only adjust the stack pointer when it knows how big the * string is. Stackblock (defined in stack.h) returns a pointer to a block * of space on top of the stack and stackblocklen returns the length of * this block. Growstackblock will grow this space by at least one byte, * possibly moving it (like realloc). Grabstackblock actually allocates the * part of the block that has been used. */ void growstackblock() { char *p; int newlen = stacknleft * 2 + 100; char *oldspace = stacknxt; int oldlen = stacknleft; struct stack_block *sp; if (stacknxt == stackp->space && stackp != &stackbase) { INTOFF; sp = stackp; stackp = sp->prev; sp = ckrealloc((pointer)sp, sizeof(struct stack_block) - MINSIZE + newlen); sp->prev = stackp; stackp = sp; stacknxt = sp->space; stacknleft = newlen; INTON; } else { p = stalloc(newlen); bcopy(oldspace, p, oldlen); stacknxt = p; /* free the space */ stacknleft += newlen; /* we just allocated */ } } void grabstackblock(len) { len = ALIGN(len); stacknxt += len; stacknleft -= len; } /* * The following routines are somewhat easier to use that the above. * The user declares a variable of type STACKSTR, which may be declared * to be a register. The macro STARTSTACKSTR initializes things. Then * the user uses the macro STPUTC to add characters to the string. In * effect, STPUTC(c, p) is the same as *p++ = c except that the stack is * grown as necessary. When the user is done, she can just leave the * string there and refer to it using stackblock(). Or she can allocate * the space for it using grabstackstr(). If it is necessary to allow * someone else to use the stack temporarily and then continue to grow * the string, the user should use grabstack to allocate the space, and * then call ungrabstr(p) to return to the previous mode of operation. * * USTPUTC is like STPUTC except that it doesn't check for overflow. * CHECKSTACKSPACE can be called before USTPUTC to ensure that there * is space for at least one character. */ char * growstackstr() { int len = stackblocksize(); if (herefd >= 0 && len >= 1024) { xwrite(herefd, stackblock(), len); sstrnleft = len - 1; return stackblock(); } growstackblock(); sstrnleft = stackblocksize() - len - 1; return stackblock() + len; } /* * Called from CHECKSTRSPACE. */ char * makestrspace() { int len = stackblocksize() - sstrnleft; growstackblock(); sstrnleft = stackblocksize() - len; return stackblock() + len; } void ungrabstackstr(s, p) char *s; char *p; { stacknleft += stacknxt - s; stacknxt = s; sstrnleft = stacknleft - (p - s); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)memalloc.h 5.1 (Berkeley) 3/7/91 */ struct stackmark { struct stack_block *stackp; char *stacknxt; int stacknleft; }; extern char *stacknxt; extern int stacknleft; extern int sstrnleft; extern int herefd; #ifdef __STDC__ pointer ckmalloc(int); pointer ckrealloc(pointer, int); void free(pointer); /* defined in C library */ char *savestr(char *); pointer stalloc(int); void stunalloc(pointer); void setstackmark(struct stackmark *); void popstackmark(struct stackmark *); void growstackblock(void); void grabstackblock(int); char *growstackstr(void); char *makestrspace(void); void ungrabstackstr(char *, char *); #else pointer ckmalloc(); pointer ckrealloc(); void free(); /* defined in C library */ char *savestr(); pointer stalloc(); void stunalloc(); void setstackmark(); void popstackmark(); void growstackblock(); void grabstackblock(); char *growstackstr(); char *makestrspace(); void ungrabstackstr(); #endif #define stackblock() stacknxt #define stackblocksize() stacknleft #define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize() #define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c))) #define CHECKSTRSPACE(n, p) if (sstrnleft < n) p = makestrspace(); else #define USTPUTC(c, p) (--sstrnleft, *p++ = (c)) #define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0')) #define STUNPUTC(p) (++sstrnleft, --p) #define STTOPC(p) p[-1] #define STADJUST(amount, p) (p += (amount), sstrnleft -= (amount)) #define grabstackstr(p) stalloc(stackblocksize() - sstrnleft) #define ckfree(p) free((pointer)(p)) /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)miscbltin.c 5.2 (Berkeley) 3/13/91"; #endif /* not lint */ /* * Miscelaneous builtins. */ #include "shell.h" #include "options.h" #include "var.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #undef eflag extern char **argptr; /* argument list for builtin command */ /* * The read builtin. The -e option causes backslashes to escape the * following character. * * This uses unbuffered input, which may be avoidable in some cases. */ readcmd(argc, argv) char **argv; { char **ap; int backslash; char c; int eflag; char *prompt; char *ifs; char *p; int startword; int status; int i; eflag = 0; prompt = NULL; while ((i = nextopt("ep:")) != '\0') { if (i == 'p') prompt = optarg; else eflag = 1; } if (prompt && isatty(0)) { out2str(prompt); flushall(); } if (*(ap = argptr) == NULL) error("arg count"); if ((ifs = bltinlookup("IFS", 1)) == NULL) ifs = nullstr; status = 0; startword = 1; backslash = 0; STARTSTACKSTR(p); for (;;) { if (read(0, &c, 1) != 1) { status = 1; break; } if (c == '\0') continue; if (backslash) { backslash = 0; if (c != '\n') STPUTC(c, p); continue; } if (eflag && c == '\\') { backslash++; continue; } if (c == '\n') break; if (startword && *ifs == ' ' && strchr(ifs, c)) { continue; } startword = 0; if (backslash && c == '\\') { if (read(0, &c, 1) != 1) { status = 1; break; } STPUTC(c, p); } else if (ap[1] != NULL && strchr(ifs, c) != NULL) { STACKSTRNUL(p); setvar(*ap, stackblock(), 0); ap++; startword = 1; STARTSTACKSTR(p); } else { STPUTC(c, p); } } STACKSTRNUL(p); setvar(*ap, stackblock(), 0); while (*++ap != NULL) setvar(*ap, nullstr, 0); return status; } umaskcmd(argc, argv) char **argv; { int mask; char *p; int i; if ((p = argv[1]) == NULL) { INTOFF; mask = umask(0); umask(mask); INTON; out1fmt("%.4o\n", mask); /* %#o might be better */ } else { mask = 0; do { if ((unsigned)(i = *p - '0') >= 8) error("Illegal number: %s", argv[1]); mask = (mask << 3) + i; } while (*++p != '\0'); umask(mask); } return 0; } #!/bin/sh - # # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)mkbuiltins 5.2 (Berkeley) 3/8/91 # All calls to awk removed, because Minix bawk is deficient. (kjb) if [ $# != 2 ] then echo "USAGE: $0 shell.h builtins" exit 1 fi SHL=$1 BLTINS=$2 temp=/tmp/ka$$ exec > builtins.c cat <<\! /* * This file was generated by the mkbuiltins program. */ #include "shell.h" #include "builtins.h" ! if grep '^#define JOBS[ ]*1' $SHL > /dev/null then # Job control. sed -e '/^#/d s/ / /g s/ #.*// /^ *$/d s/-j//' $BLTINS > $temp else # No job control. sed -e '/^#/d s/ / /g s/ #.*// /^ *$/d /-j/d' $BLTINS > $temp fi sed -e 's/ .*// s/\(.*\)/int \1();/' $temp echo ' int (*const builtinfunc[])() = {' sed -e 's/ .*// s/\(.*\)/ \1,/' $temp echo '}; const struct builtincmd builtincmd[] = {' i=0 while read line do set -$- $line shift for fun do echo " \"$fun\", $i," done i=`expr $i + 1` done < $temp echo ' NULL, 0 };' exec > builtins.h cat <<\! /* * This file was generated by the mkbuiltins program. */ #include ! i=0 tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ < $temp | while read line do set -$- $line echo "#define $1 $i" i=`expr $i + 1` done echo ' struct builtincmd { char *name; int code; }; extern int (*const builtinfunc[])(); extern const struct builtincmd builtincmd[];' rm -f $temp /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)mkinit.c 5.3 (Berkeley) 3/13/91"; #endif /* not lint */ /* * This program scans all the source files for code to handle various * special events and combines this code into one file. This (allegedly) * improves the structure of the program since there is no need for * anyone outside of a module to know that that module performs special * operations on particular events. The command is executed iff init.c * is actually changed. * * Usage: mkinit command sourcefile... */ #include #include #include #include /* * OUTFILE is the name of the output file. Output is initially written * to the file OUTTEMP, which is then moved to OUTFILE if OUTTEMP and * OUTFILE are different. */ #define OUTFILE "init.c" #define OUTTEMP "init.c.new" #define OUTOBJ "init.o" /* * A text structure is basicly just a string that grows as more characters * are added onto the end of it. It is implemented as a linked list of * blocks of characters. The routines addstr and addchar append a string * or a single character, respectively, to a text structure. Writetext * writes the contents of a text structure to a file. */ #define BLOCKSIZE 512 struct text { char *nextc; int nleft; struct block *start; struct block *last; }; struct block { struct block *next; char text[BLOCKSIZE]; }; /* * There is one event structure for each event that mkinit handles. */ struct event { char *name; /* name of event (e.g. INIT) */ char *routine; /* name of routine called on event */ char *comment; /* comment describing routine */ struct text code; /* code for handling event */ }; char writer[] = "\ /*\n\ * This file was generated by the mkinit program.\n\ */\n\ \n"; char init[] = "\ /*\n\ * Initialization code.\n\ */\n"; char reset[] = "\ /*\n\ * This routine is called when an error or an interrupt occurs in an\n\ * interactive shell and control is returned to the main command loop.\n\ */\n"; char shellproc[] = "\ /*\n\ * This routine is called to initialize the shell to run a shell procedure.\n\ */\n"; struct event event[] = { {"INIT", "init", init}, {"RESET", "reset", reset}, {"SHELLPROC", "initshellproc", shellproc}, {NULL, NULL} }; char *curfile; /* current file */ int linno; /* current line */ char *header_files[200]; /* list of header files */ struct text defines; /* #define statements */ struct text decls; /* declarations */ int amiddecls; /* for formatting */ void readfile(), doevent(), doinclude(), dodecl(), output(); void addstr(), addchar(), writetext(); #define equal(s1, s2) (strcmp(s1, s2) == 0) FILE *ckfopen(); char *savestr(); void *ckmalloc __P((int)); void error(); main(argc, argv) char **argv; { char **ap; int fd; char c; if (argc < 2) error("Usage: mkinit command file..."); header_files[0] = "\"shell.h\""; header_files[1] = "\"mystring.h\""; for (ap = argv + 2 ; *ap ; ap++) readfile(*ap); output(); if (file_changed()) { unlink(OUTFILE); link(OUTTEMP, OUTFILE); unlink(OUTTEMP); } else { unlink(OUTTEMP); if (touch(OUTOBJ)) exit(0); /* no compilation necessary */ } printf("%s\n", argv[1]); execl("/bin/sh", "sh", "-c", argv[1], (char *)0); error("Can't exec shell"); } /* * Parse an input file. */ void readfile(fname) char *fname; { FILE *fp; char line[1024]; struct event *ep; fp = ckfopen(fname, "r"); curfile = fname; linno = 0; amiddecls = 0; while (fgets(line, sizeof line, fp) != NULL) { linno++; for (ep = event ; ep->name ; ep++) { if (line[0] == ep->name[0] && match(ep->name, line)) { doevent(ep, fp, fname); break; } } if (line[0] == 'I' && match("INCLUDE", line)) doinclude(line); if (line[0] == 'M' && match("MKINIT", line)) dodecl(line, fp); if (line[0] == '#' && gooddefine(line)) addstr(line, &defines); } fclose(fp); } int match(name, line) char *name; char *line; { register char *p, *q; p = name, q = line; while (*p) { if (*p++ != *q++) return 0; } if (*q != '{' && *q != ' ' && *q != '\t' && *q != '\n') return 0; return 1; } int gooddefine(line) char *line; { register char *p; if (! match("#define", line)) return 0; /* not a define */ p = line + 7; while (*p == ' ' || *p == '\t') p++; while (*p != ' ' && *p != '\t') { if (*p == '(') return 0; /* macro definition */ p++; } while (*p != '\n' && *p != '\0') p++; if (p[-1] == '\\') return 0; /* multi-line definition */ return 1; } void doevent(ep, fp, fname) register struct event *ep; FILE *fp; char *fname; { char line[1024]; int indent; char *p; sprintf(line, "\n /* from %s: */\n", fname); addstr(line, &ep->code); addstr(" {\n", &ep->code); for (;;) { linno++; if (fgets(line, sizeof line, fp) == NULL) error("Unexpected EOF"); if (equal(line, "}\n")) break; indent = 6; for (p = line ; *p == '\t' ; p++) indent += 8; for ( ; *p == ' ' ; p++) indent++; if (*p == '\n' || *p == '#') indent = 0; while (indent >= 8) { addchar('\t', &ep->code); indent -= 8; } while (indent > 0) { addchar(' ', &ep->code); indent--; } addstr(p, &ep->code); } addstr(" }\n", &ep->code); } void doinclude(line) char *line; { register char *p; char *name; register char **pp; for (p = line ; *p != '"' && *p != '<' && *p != '\0' ; p++); if (*p == '\0') error("Expecting '\"' or '<'"); name = p; while (*p != ' ' && *p != '\t' && *p != '\n') p++; if (p[-1] != '"' && p[-1] != '>') error("Missing terminator"); *p = '\0'; /* name now contains the name of the include file */ for (pp = header_files ; *pp && ! equal(*pp, name) ; pp++); if (*pp == NULL) *pp = savestr(name); } void dodecl(line1, fp) char *line1; FILE *fp; { char line[1024]; register char *p, *q; if (strcmp(line1, "MKINIT\n") == 0) { /* start of struct/union decl */ addchar('\n', &decls); do { linno++; if (fgets(line, sizeof line, fp) == NULL) error("Unterminated structure declaration"); addstr(line, &decls); } T9V9W9X9Y9while (line[0] != '}'); amiddecls = 0; } else { if (! amiddecls) addchar('\n', &decls); q = NULL; for (p = line1 + 6 ; *p != '=' && *p != '/' ; p++); if (*p == '=') { /* eliminate initialization */ for (q = p ; *q && *q != ';' ; q++); if (*q == '\0') q = NULL; else { while (p[-1] == ' ') p--; *p = '\0'; } } addstr("extern", &decls); addstr(line1 + 6, &decls); if (q != NULL) addstr(q, &decls); amiddecls = 1; } } /* * Write the output to the file OUTTEMP. */ void output() { FILE *fp; char **pp; struct event *ep; fp = ckfopen(OUTTEMP, "w"); fputs(writer, fp); for (pp = header_files ; *pp ; pp++) fprintf(fp, "#include %s\n", *pp); fputs("\n\n\n", fp); writetext(&defines, fp); fputs("\n\n", fp); writetext(&decls, fp); for (ep = event ; ep->name ; ep++) { fputs("\n\n\n", fp); fputs(ep->comment, fp); fprintf(fp, "\nvoid\n%s() {\n", ep->routine); writetext(&ep->code, fp); fprintf(fp, "}\n"); } fclose(fp); } /* * Return true if the new output file is different from the old one. */ int file_changed() { register FILE *f1, *f2; register int c; if ((f1 = fopen(OUTFILE, "r")) == NULL || (f2 = fopen(OUTTEMP, "r")) == NULL) return 1; while ((c = getc(f1)) == getc(f2)) { if (c == EOF) return 0; } return 1; } /* * Touch a file. Returns 0 on failure, 1 on success. */ int touch(file) char *file; { int fd; char c; if ((fd = open(file, O_RDWR)) < 0) return 0; if (read(fd, &c, 1) != 1) { close(fd); return 0; } lseek(fd, 0L, 0); write(fd, &c, 1); close(fd); return 1; } /* * A text structure is simply a block of text that is kept in memory. * Addstr appends a string to the text struct, and addchar appends a single * character. */ void addstr(s, text) register char *s; register struct text *text; { while (*s) { if (--text->nleft < 0) addchar(*s++, text); else *text->nextc++ = *s++; } } void addchar(c, text) register struct text *text; { struct block *bp; if (--text->nleft < 0) { bp = ckmalloc(sizeof *bp); if (text->start == NULL) text->start = bp; else text->last->next = bp; text->last = bp; text->nextc = bp->text; text->nleft = BLOCKSIZE - 1; } *text->nextc++ = c; } /* * Write the contents of a text structure to a file. */ void writetext(text, fp) struct text *text; FILE *fp; { struct block *bp; if (text->start != NULL) { for (bp = text->start ; bp != text->last ; bp = bp->next) fwrite(bp->text, sizeof (char), BLOCKSIZE, fp); fwrite(bp->text, sizeof (char), BLOCKSIZE - text->nleft, fp); } } FILE * ckfopen(file, mode) char *file; char *mode; { FILE *fp; if ((fp = fopen(file, mode)) == NULL) { fprintf(stderr, "Can't open %s\n", file); exit(2); } return fp; } void * ckmalloc(nbytes) { register char *p; char *malloc(); if ((p = malloc(nbytes)) == NULL) error("Out of space"); return p; } char * savestr(s) char *s; { register char *p; p = ckmalloc(strlen(s) + 1); strcpy(p, s); return p; } void error(msg) char *msg; { if (curfile != NULL) fprintf(stderr, "%s:%d: ", curfile, linno); fprintf(stderr, "%s\n", msg); exit(2); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)mknodes.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * This program reads the nodetypes file and nodes.c.pat file. It generates * the files nodes.h and nodes.c. */ #include #define MAXTYPES 50 /* max number of node types */ #define MAXFIELDS 20 /* max fields in a structure */ #define BUFLEN 100 /* size of character buffers */ /* field types */ #define T_NODE 1 /* union node *field */ #define T_NODELIST 2 /* struct nodelist *field */ #define T_STRING 3 #define T_INT 4 /* int field */ #define T_OTHER 5 /* other */ #define T_TEMP 6 /* don't copy this field */ struct field { /* a structure field */ char *name; /* name of field */ int type; /* type of field */ char *decl; /* declaration of field */ }; struct str { /* struct representing a node structure */ char *tag; /* structure tag */ int nfields; /* number of fields in the structure */ struct field field[MAXFIELDS]; /* the fields of the structure */ int done; /* set if fully parsed */ }; int ntypes; /* number of node types */ char *nodename[MAXTYPES]; /* names of the nodes */ struct str *nodestr[MAXTYPES]; /* type of structure used by the node */ int nstr; /* number of structures */ struct str str[MAXTYPES]; /* the structures */ struct str *curstr; /* current structure */ FILE *infp = stdin; char line[1024]; int linno; char *linep; char *savestr(); #define equal(s1, s2) (strcmp(s1, s2) == 0) main(argc, argv) char **argv; { if (argc != 3) error("usage: mknodes file\n"); if ((infp = fopen(argv[1], "r")) == NULL) error("Can't open %s", argv[1]); while (readline()) { if (line[0] == ' ' || line[0] == '\t') parsefield(); else if (line[0] != '\0') parsenode(); } output(argv[2]); return 0; } parsenode() { char name[BUFLEN]; char tag[BUFLEN]; struct str *sp; if (curstr && curstr->nfields > 0) curstr->done = 1; nextfield(name); if (! nextfield(tag)) error("Tag expected"); if (*linep != '\0') error("Garbage at end of line"); nodename[ntypes] = savestr(name); for (sp = str ; sp < str + nstr ; sp++) { if (equal(sp->tag, tag)) break; } if (sp >= str + nstr) { sp->tag = savestr(tag); sp->nfields = 0; curstr = sp; nstr++; } nodestr[ntypes] = sp; ntypes++; } parsefield() { char name[BUFLEN]; char type[BUFLEN]; char decl[2 * BUFLEN]; struct field *fp; if (curstr == NULL || curstr->done) error("No current structure to add field to"); if (! nextfield(name)) error("No field name"); if (! nextfield(type)) error("No field type"); fp = &curstr->field[curstr->nfields]; fp->name = savestr(name); if (equal(type, "nodeptr")) { fp->type = T_NODE; sprintf(decl, "union node *%s", name); } else if (equal(type, "nodelist")) { fp->type = T_NODELIST; sprintf(decl, "struct nodelist *%s", name); } else if (equal(type, "string")) { fp->type = T_STRING; sprintf(decl, "char *%s", name); } else if (equal(type, "int")) { fp->type = T_INT; sprintf(decl, "int %s", name); } else if (equal(type, "other")) { fp->type = T_OTHER; } else if (equal(type, "temp")) { fp->type = T_TEMP; } else { error("Unknown type %s", type); } if (fp->type == T_OTHER || fp->type == T_TEMP) { skipbl(); fp->decl = savestr(linep); } else { if (*linep) error("Garbage at end of line"); fp->decl = savestr(decl); } curstr->nfields++; } char writer[] = "\ /*\n\ * This file was generated by the mknodes program.\n\ */\n\ \n"; output(file) char *file; { FILE *hfile; FILE *cfile; FILE *patfile; int i; struct str *sp; struct field *fp; char *p; if ((patfile = fopen(file, "r")) == NULL) error("Can't open %s", file); if ((hfile = fopen("nodes.h", "w")) == NULL) error("Can't create nodes.h"); if ((cfile = fopen("nodes.c", "w")) == NULL) error("Can't create nodes.c"); fputs(writer, hfile); for (i = 0 ; i < ntypes ; i++) fprintf(hfile, "#define %s %d\n", nodename[i], i); fputs("\n\n\n", hfile); for (sp = str ; sp < &str[nstr] ; sp++) { fprintf(hfile, "struct %s {\n", sp->tag); for (i = sp->nfields, fp = sp->field ; --i >= 0 ; fp++) { fprintf(hfile, " %s;\n", fp->decl); } fputs("};\n\n\n", hfile); } fputs("union node {\n", hfile); fprintf(hfile, " int type;\n"); for (sp = str ; sp < &str[nstr] ; sp++) { fprintf(hfile, " struct %s %s;\n", sp->tag, sp->tag); } fputs("};\n\n\n", hfile); fputs("struct nodelist {\n", hfile); fputs("\tstruct nodelist *next;\n", hfile); fputs("\tunion node *n;\n", hfile); fputs("};\n\n\n", hfile); fputs("#ifdef __STDC__\n", hfile); fputs("union node *copyfunc(union node *);\n", hfile); fputs("void freefunc(union node *);\n", hfile); fputs("#else\n", hfile); fputs("union node *copyfunc();\n", hfile); fputs("void freefunc();\n", hfile); fputs("#endif\n", hfile); fputs(writer, cfile); while (fgets(line, sizeof line, patfile) != NULL) { for (p = line ; *p == ' ' || *p == '\t' ; p++); if (equal(p, "%SIZES\n")) outsizes(cfile); else if (equal(p, "%CALCSIZE\n")) outfunc(cfile, 1); else if (equal(p, "%COPY\n")) outfunc(cfile, 0); else fputs(line, cfile); } } outsizes(cfile) FILE *cfile; { int i; fprintf(cfile, "static const short nodesize[%d] = {\n", ntypes); for (i = 0 ; i < ntypes ; i++) { fprintf(cfile, " ALIGN(sizeof (struct %s)),\n", nodestr[i]->tag); } fprintf(cfile, "};\n"); } outfunc(cfile, calcsize) FILE *cfile; { struct str *sp; struct field *fp; int i; fputs(" if (n == NULL)\n", cfile); if (calcsize) fputs(" return;\n", cfile); else fputs(" return NULL;\n", cfile); if (calcsize) fputs(" funcblocksize += nodesize[n->type];\n", cfile); else { fputs(" new = funcblock;\n", cfile); fputs(" *(char **)&funcblock += nodesize[n->type];\n", cfile); } fputs(" switch (n->type) {\n", cfile); for (sp = str ; sp < &str[nstr] ; sp++) { for (i = 0 ; i < ntypes ; i++) { if (nodestr[i] == sp) fprintf(cfile, " case %s:\n", nodename[i]); } for (i = sp->nfields ; --i >= 1 ; ) { fp = &sp->field[i]; swita9c9d9e9ch (fp->type) { case T_NODE: if (calcsize) { indent(12, cfile); fprintf(cfile, "calcsize(n->%s.%s);\n", sp->tag, fp->name); } else { indent(12, cfile); fprintf(cfile, "new->%s.%s = copynode(n->%s.%s);\n", sp->tag, fp->name, sp->tag, fp->name); } break; case T_NODELIST: if (calcsize) { indent(12, cfile); fprintf(cfile, "sizenodelist(n->%s.%s);\n", sp->tag, fp->name); } else { indent(12, cfile); fprintf(cfile, "new->%s.%s = copynodelist(n->%s.%s);\n", sp->tag, fp->name, sp->tag, fp->name); } break; case T_STRING: if (calcsize) { indent(12, cfile); fprintf(cfile, "funcstringsize += strlen(n->%s.%s) + 1;\n", sp->tag, fp->name); } else { indent(12, cfile); fprintf(cfile, "new->%s.%s = nodesavestr(n->%s.%s);\n", sp->tag, fp->name, sp->tag, fp->name); } break; case T_INT: case T_OTHER: if (! calcsize) { indent(12, cfile); fprintf(cfile, "new->%s.%s = n->%s.%s;\n", sp->tag, fp->name, sp->tag, fp->name); } break; } } indent(12, cfile); fputs("break;\n", cfile); } fputs(" };\n", cfile); if (! calcsize) fputs(" new->type = n->type;\n", cfile); } indent(amount, fp) FILE *fp; { while (amount >= 8) { putc('\t', fp); amount -= 8; } while (--amount >= 0) { putc(' ', fp); } } int nextfield(buf) char *buf; { register char *p, *q; p = linep; while (*p == ' ' || *p == '\t') p++; q = buf; while (*p != ' ' && *p != '\t' && *p != '\0') *q++ = *p++; *q = '\0'; linep = p; return (q > buf); } skipbl() { while (*linep == ' ' || *linep == '\t') linep++; } int readline() { register char *p; if (fgets(line, 1024, infp) == NULL) return 0; for (p = line ; *p != '#' && *p != '\n' && *p != '\0' ; p++); while (p > line && (p[-1] == ' ' || p[-1] == '\t')) p--; *p = '\0'; linep = line; linno++; if (p - line > BUFLEN) error("Line too long"); return 1; } error(msg, a1, a2, a3, a4, a5, a6) char *msg; { fprintf(stderr, "line %d: ", linno); fprintf(stderr, msg, a1, a2, a3, a4, a5, a6); putc('\n', stderr); exit(2); } char * savestr(s) char *s; { register char *p; char *malloc(); if ((p = malloc(strlen(s) + 1)) == NULL) error("Out of space"); strcpy(p, s); return p; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)mksignames.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * This program generates the signames.h and signames.c files. */ #include #include #include struct sig { int signo; /* signal number */ char *name; /* signal name (without leading "SIG") */ char *mesg; /* description */ }; struct sig sigtab[] = { SIGHUP, "HUP", "Hangup", SIGINT, "INT", "Interrupt", /* normally don't print message */ SIGQUIT, "QUIT", "Quit", SIGILL, "ILL", "Illegal instruction", SIGTRAP, "TRAP", "Trace/BPT trap", #ifdef SIGABRT SIGABRT, "ABRT", "abort", #endif #if defined(SIGIOT) && (! defined(SIGABRT) || SIGABRT != SIGIOT) SIGIOT, "IOT", "abort", #endif #ifdef SIGEMT SIGEMT, "EMT", "EMT trap", #endif SIGFPE, "FPE", "Floating exception", SIGKILL, "KILL", "Killed", SIGBUS, "BUS", "Bus error", SIGSEGV, "SEGV", "Memory fault", #ifdef SIGSYS SIGSYS, "SYS", "Bad system call", #endif SIGPIPE, "PIPE", "Broken pipe", /* normally don't print message */ SIGALRM, "ALRM", "Alarm call", SIGTERM, "TERM", "Terminated", #ifdef SIGUSR1 SIGUSR1, "USR1", "User signal 1", #endif #ifdef SIGUSR2 SIGUSR2, "USR2", "User signal 2", #endif #ifdef SIGCLD SIGCLD, "CLD", NULL, #endif #if defined(SIGCHLD) && ! defined(SIGCLD) SIGCHLD, "CLD", NULL, #endif #ifdef SIGPWR SIGPWR, "PWR", "Power fail", #endif #ifdef SIGPOLL SIGPOLL, "POLL", "Poll", #endif /* Now for the BSD signals */ #ifdef SIGURG SIGURG, "URG", NULL, #endif #ifdef SIGSTOP SIGSTOP, "STOP", "Stopped", #endif #ifdef SIGTSTP SIGTSTP, "TSTP", "Stopped", #endif #ifdef SIGCONT SIGCONT, "CONT", NULL, #endif #ifdef SIGTTIN SIGTTIN, "TTIN", "Stopped (input)", #endif #ifdef SIGTTOU SIGTTOU, "TTOU", "Stopped (output)", #endif #ifdef SIGIO SIGIO, "IO", NULL, #endif #ifdef SIGXCPU SIGXCPU, "XCPU", "Time limit exceeded", #endif #ifdef SIGXFSZ SIGXFSZ, "XFSZ", NULL, #endif #ifdef SIGVTALARM SIGVTALARM, "VTALARM", "Virtual alarm", #endif #ifdef SIGPROF SIGPROF, "PROF", "Profiling alarm", #endif #ifdef SIGWINCH SIGWINCH, "WINCH", NULL, #endif 0, NULL, NULL }; #define MAXSIG 64 char *sigmesg[MAXSIG + 1]; char writer[] = "\ /*\n\ * This file was generated by the mksignames program.\n\ */\n\ \n"; main(argc, argv) char **argv; { FILE *cfile, *hfile; struct sig *sigp; int maxsig; int i; if ((cfile = fopen("signames.c", "w")) == NULL) { fputs("Can't create signames.c\n", stderr); exit(2); } if ((hfile = fopen("signames.h", "w")) == NULL) { fputs("Can't create signames.h\n", stderr); exit(2); } maxsig = 0; for (sigp = sigtab ; sigp->signo != 0 ; sigp++) { if (sigp->signo < 0 || sigp->signo > MAXSIG) continue; sigmesg[sigp->signo] = sigp->mesg; if (maxsig < sigp->signo) maxsig = sigp->signo; } fputs(writer, hfile); fprintf(hfile, "#define MAXSIG %d\n\n", maxsig); fprintf(hfile, "extern char *const sigmesg[MAXSIG+1];\n"); fputs(writer, cfile); fprintf(cfile, "#include \"shell.h\"\n\n"); fprintf(cfile, "char *const sigmesg[%d] = {\n", maxsig + 1); for (i = 0 ; i <= maxsig ; i++) { if (sigmesg[i] == NULL) { fprintf(cfile, " 0,\n"); } else { fprintf(cfile, " \"%s\",\n", sigmesg[i]); } } fprintf(cfile, "};\n"); exit(0); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)mksyntax.c 5.2 (Berkeley) 3/8/91"; #endif /* not lint */ /* * This program creates syntax.h and syntax.c. */ #include #include "parser.h" struct synclass { char *name; char *comment; }; /* Syntax classes */ struct synclass synclass[] = { "CWORD", "character is nothing special", "CNL", "newline character", "CBACK", "a backslash character", "CSQUOTE", "single quote", "CDQUOTE", "double quote", "CENDQUOTE", "a terminating quote", "CBQUOTE", "backwards single quote", "CVAR", "a dollar sign", "CENDVAR", "a '}' character", "CEOF", "end of file", "CCTL", "like CWORD, except it must be escaped", "CSPCL", "these terminate a word", NULL, NULL }; /* * Syntax classes for is_ functions. Warning: if you add new classes * you may have to change the definition of the is_in_name macro. */ struct synclass is_entry[] = { "ISDIGIT", "a digit", "ISUPPER", "an upper case letter", "ISLOWER", "a lower case letter", "ISUNDER", "an underscore", "ISSPECL", "the name of a special parameter", NULL, NULL, }; char writer[] = "\ /*\n\ * This file was generated by the mksyntax program.\n\ */\n\ \n"; FILE *cfile; FILE *hfile; char *syntax[513]; int base; int size; /* number of values which a char variable can have */ int nbits; /* number of bits in a character */ int digit_contig; /* true if digits are contiguous */ main() { char c; char d; int sign; int i; char buf[80]; int pos; static char digit[] = "0123456789"; /* Create output files */ if ((cfile = fopen("syntax.c", "w")) == NULL) { perror("syntax.c"); exit(2); } if ((hfile = fopen("syntax.h", "w")) == NULL) { perror("syntax.h"); exit(2); } fputs(writer, hfile); fputs(writer, cfile); /* Determine the characteristics of chars. */ c = -1; if (c < 0) sign = 1; else sign = 0; for (nbits = 1 ; ; nbits++) { d = (1 << nbits) - 1; if (d == c) break; } printf("%s %d bit chars\n", sign? "signed" : "unsigned", nbits); if (nbits > 9) { fputs("Characters can't have more than 9 bits\n", stderr); exit(2); } size = (1 << nbits) + 1; base = 1; if (sign) base += 1 << (nbits - 1); digit_contig = 1; for (i = 0 ; i < 10 ; i++) { if (digit[i] != '0' + i) digit_contig = 0; } fputs("#include \n", hfile); /* Generate the #define statements in the header file */ fputs("/* Syntax classes */\n", hfile); for (i = 0 ; synclass[i].name ; i++) { sprintf(buf, "#define %s %d", synclass[i].name, i); fputs(buf, hfile); for (pos = strlen(buf) ; pos < 32 ; pos = pos + 8 &~ 07) putc('\t', hfile); fprintf(hfile, "/* %s */\n", synclass[i].comment); } putc('\n', hfile); fputs("/* Syntax classes for is_ functions */\n", hfile); for (i = 0 ; is_entry[i].name ; i++) { sprintf(buf, "#define %s %#o", is_entry[i].name, 1 << i); fputs(buf, hfile); for (pos = strlen(buf) ; pos < 32 ; pos = pos + 8 &~ 07) putc('\t', hfile); fprintf(hfile, "/* %s */\n", is_entry[i].comment); } putc('\n', hfile); fprintf(hfile, "#define SYNBASE %d\n", base); fprintf(hfile, "#define PEOF %d\n\n", -base); putc('\n', hfile); fputs("#define BASESYNTAX (basesyntax + SYNBASE)\n", hfile); fputs("#define DQSYNTAX (dqsyntax + SYNBASE)\n", hfile); fputs("#define SQSYNTAX (sqsyntax + SYNBASE)\n", hfile); putc('\n', hfile); output_type_macros(); /* is_digit, etc. */ putc('\n', hfile); /* Generate the syntax tables. */ fputs("#include \"shell.h\"\n", cfile); fputs("#include \"syntax.h\"\n\n", cfile); init(); fputs("/* syntax table used when not in quotes */\n", cfile); add("\n", "CNL"); add("\\", "CBACK"); add("'", "CSQUOTE"); add("\"", "CDQUOTE"); add("`", "CBQUOTE"); add("$", "CVAR"); add("}", "CENDVAR"); add("<>();&| \t", "CSPCL"); print("basesyntax"); init(); fputs("\n/* syntax table used when in double quotes */\n", cfile); add("\n", "CNL"); add("\\", "CBACK"); add("\"", "CENDQUOTE"); add("`", "CBQUOTE"); add("$", "CVAR"); add("}", "CENDVAR"); add("!*?[=", "CCTL"); print("dqsyntax"); init(); fputs("\n/* syntax table used when in single quotes */\n", cfile); add("\n", "CNL"); add("'", "CENDQUOTE"); add("!*?[=", "CCTL"); print("sqsyntax"); filltable("0"); fputs("\n/* character classification table */\n", cfile); add("0123456789", "ISDIGIT"); add("abcdefghijklmnopqrstucvwxyz", "ISLOWER"); add("ABCDEFGHIJKLMNOPQRSTUCVWXYZ", "ISUPPER"); add("_", "ISUNDER"); add("#?$!-*@", "ISSPECL"); print("is_type"); if (! digit_contig) digit_convert(); exit(0); } /* * Clear the syntax table. */ filltable(dftval) char *dftval; { int i; for (i = 0 ; i < size ; i++) syntax[i] = dftval; } /* * Initialize the syntax table with default values. */ init() { filltable("CWORD"); syntax[0] = "CEOF"; syntax[base + CTLESC] = "CCTL"; syntax[base + CTLVAR] = "CCTL"; syntax[base + CTLENDVAR] = "CCTL"; syntax[base + CTLBACKQ] = "CCTL"; syntax[base + CTLBACKQ + CTLQUOTE] = "CCTL"; } /* * Add entries to the syntax table. */ add(p, type) char *p, *type; { while (*p) syntax[*p++ + base] = type; } /* * Output the syntax table. */ print(name) char *name; { int i; int col; fprintf(hfile, "extern const char %s[];\n", name); fprintf(cfile, "const char %s[%d] = {\n", name, size); col = 0; for (i = 0 ; i < size ; i++) { if (i == 0) { fputs(" ", cfile); } else if ((i & 03) == 0) { fputs(",\n ", cfile); col = 0; } else { putc(',', cfile); while (++col < 9 * (i & 03)) putc(' ', cfile); } fputs(syntax[i], cfile); col += strlen(syntax[i]); } fputs("\n};\n", cfile); } /* * Output character classification macros (e.g. is_digit). If digits are * contiguous, we can test for them quickly. */ char *macro[] = { "#define is_digit(c)\t((is_type+SYNBASE)[c] & ISDIGIT)", "#define is_alpha(c)\t((is_type+SYNBASE)[c] & (ISUPPER|ISLOWER))", "#define is_name(c)\t((is_type+SYNBASE)[c] & (ISUPPER|ISLOWER|ISUNDER))", "#define is_in_name(c)\t((is_type+SYNBASE)[c] & (ISUPPER|ISLOWER|ISUNDER|ISDIGIT))", "#define is_special(c)\t((is_type+SYNBASE)[c] & (ISSPECL|ISDIGIT))", NUs9u9LL }; output_type_macros() { char **pp; if (digit_contig) macro[0] = "#define is_digit(c)\t((unsigned)((c) - '0') <= 9)"; for (pp = macro ; *pp ; pp++) fprintf(hfile, "%s\n", *pp); if (digit_contig) fputs("#define digit_val(c)\t((c) - '0')\n", hfile); else fputs("#define digit_val(c)\t(digit_value[c])\n", hfile); } /* * Output digit conversion table (if digits are not contiguous). */ digit_convert() { int maxdigit; static char digit[] = "0123456789"; char *p; int i; maxdigit = 0; for (p = digit ; *p ; p++) if (*p > maxdigit) maxdigit = *p; fputs("extern const char digit_value[];\n", hfile); fputs("\n\nconst char digit_value[] = {\n", cfile); for (i = 0 ; i <= maxdigit ; i++) { for (p = digit ; *p && *p != i ; p++); if (*p == '\0') p = digit; fprintf(cfile, " %d,\n", p - digit); } fputs("};\n", cfile); } #!/bin/sh - # # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)mktokens 5.1 (Berkeley) 3/7/91 # All calls to awk removed, because Minix bawk is deficient. (kjb) # The following is a list of tokens. The second column is nonzero if the # token marks the end of a list. The third column is the name to print in # error messages. cat > /tmp/ka$$ <<\! TEOF 1 end of file TNL 0 newline TSEMI 0 ";" TBACKGND 0 "&" TAND 0 "&&" TOR 0 "||" TPIPE 0 "|" TLP 0 "(" TRP 1 ")" TENDCASE 1 ";;" TENDBQUOTE 1 "`" TREDIR 0 redirection TWORD 0 word TIF 0 "if" TTHEN 1 "then" TELSE 1 "else" TELIF 1 "elif" TFI 1 "fi" TWHILE 0 "while" TUNTIL 0 "until" TFOR 0 "for" TDO 1 "do" TDONE 1 "done" TBEGIN 0 "{" TEND 1 "}" TCASE 0 "case" TESAC 1 "esac" ! nl=`wc -l /tmp/ka$$` exec > token.def i=0 while read line do set -$- $line echo "#define $1 $i" i=`expr $i + 1` done 0) { if ((*to++ = *from++) == '\0') return; } *to = '\0'; } /* * strchr - find first occurrence of a character in a string. */ #ifndef SYS5 char * mystrchr(s, charwanted) char const *s; register char charwanted; { register char const *scan; /* * The odd placement of the two tests is so NUL is findable. */ for (scan = s ; *scan != charwanted ; ) /* ++ moved down for opt. */ if (*scan++ == '\0') return NULL; return (char *)scan; } #endif /* * bcopy - copy bytes * * This routine was derived from code by Henry Spencer. */ void mybcopy(src, dst, length) pointer dst; const pointer src; register int length; { register char *d = dst; register char *s = src; while (--length >= 0) *d++ = *s++; } /* * prefix -- see if pfx is a prefix of string. */ int prefix(pfx, string) register char const *pfx; register char const *string; { while (*pfx) { if (*pfx++ != *string++) return 0; } return 1; } /* * Convert a string of digits to an integer, printing an error message on * failure. */ int number(s) const char *s; { if (! is_number(s)) error2("Illegal number", (char *)s); return atoi(s); } /* * Check for a valid number. This should be elsewhere. */ int is_number(p) register const char *p; { do { if (! is_digit(*p)) return 0; } while (*++p != '\0'); return 1; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)mystring.h 5.1 (Berkeley) 3/7/91 */ #ifndef SYSV #define strchr mystrchr #endif #ifdef __STDC__ void scopyn(const char *, char *, int); char *strchr(const char *, int); void mybcopy(const pointer, pointer, int); int prefix(const char *, const char *); int number(const char *); int is_number(const char *); int strcmp(const char *, const char *); /* from C library */ char *strcpy(char *, const char *); /* from C library */ int strlen(const char *); /* from C library */ char *strcat(char *, const char *); /* from C library */ char *strerror(int); /* from C library */ #else void scopyn(); char *strchr(); void mybcopy(); int prefix(); int number(); int is_number(); int strcmp(); char *strcpy(); int strlen(); char *strcat(); char *strerror(); #endif #define equal(s1, s2) (strcmp(s1, s2) == 0) #define scopy(s1, s2) ((void)strcpy(s2, s1)) #define bcopy(src, dst, n) mybcopy((pointer)(src), (pointer)(dst), n) /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)nodes.c.pat 5.2 (Berkeley) 3/8/91 */ /* * Routine for dealing with parsed shell commands. */ #include "shell.h" #include "nodes.h" #include "memalloc.h" #include "machdep.h" #include "mystring.h" int funcblocksize; /* size of structures in function */ int funcstringsize; /* size of strings in node */ #ifdef __STDC__ pointer funcblock; /* block to allocate function from */ #else char *funcblock; /* block to allocate function from */ #endif char *funcstring; /* block to allocate strings from */ %SIZES #ifdef __STDC__ STATIC void calcsize(union node *); STATIC void sizenodelist(struct nodelist *); STATIC union node *copynode(union node *); STATIC struct nodelist *copynodelist(struct nodelist *); STATIC char *nodesavestr(char *); #else STATIC void calcsize(); STATIC void sizenodelist(); STATIC union node *copynode(); STATIC struct nodelist *copynodelist(); STATIC char *nodesavestr(); #endif /* * Make a copy of a parse tree. */ union node * copyfunc(n) union node *n; { if (n == NULL) return NULL; funcblocksize = 0; funcstringsize = 0; calcsize(n); funcblock = ckmalloc(funcblocksize + funcstringsize); funcstring = (char *)funcblock + funcblocksize; return copynode(n); } STATIC void calcsize(n) union node *n; { %CALCSIZE } STATIC void sizenodelist(lp) struct nodelist *lp; { while (lp) { funcblocksize += ALIGN(sizeof (struct nodelist)); calcsize(lp->n); lp = lp->next; } } STATIC union node * copynode(n) union node *n; { union node *new; %COPY return new; } STATIC struct nodelist * copynodelist(lp) struct nodelist *lp; { struct nodelist *start; struct nodelist **lpp; lpp = &start; while (lp) { *lpp = funcblock; *(char **)&funcblock += ALIGN(sizeof (struct nodelist)); (*lpp)->n = copynode(lp->n); lp = lp->next; lpp = &(*lpp)->next; } *lpp = NULL; return start; } STATIC char * nodesavestr(s) char *s; { register char *p = s; register char *q = funcstring; char *rtn = funcstring; while (*q++ = *p++); funcstring = q; return rtn; } /* * Free a parse tree. */ void freefunc(n) union node *n; { if (n) ckfree(n); } #!/bin/sh - # # Copyright (c) 1991 The Regents of the University of California. # All rights reserved. # # This code is derived from software contributed to Berkeley by # Kenneth Almquist. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. All advertising materials mentioning features or use of this software # must display the following acknowledgement: # This product includes software developed by the University of # California, Berkeley and its contributors. # 4. Neither the name of the University nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # @(#)nodetypes 5.1 (Berkeley) 3/7/91 # This file describes the nodes used in parse trees. Unindented lines # contain a node type followed by a structure tag. Subsequent indented # lines specify the fields of the structure. Several node types can share # the same structure, in which case the fields of the structure should be # specified only once. # # A field of a structure is described by the name of the field followed # by a type. The currently implemented types are: # nodeptr - a pointer to a node # nodelist - a pointer to a list of nodes # string - a pointer to a nul terminated string # int - an integer # other - any type that can be copied by assignment # temp - a field that doesn't have to be copied when the node is copied # The last two types should be followed by the text of a C declaration for # the field. NSEMI nbinary # two commands separated by a semicolon type int ch1 nodeptr # the first child ch2 nodeptr # the second child NCMD ncmd # a simple command type int backgnd int # set to run command in background args nodeptr # the arguments redirect nodeptr # list of file redirections NPIPE npipe # a pipeline type int backgnd int # set to run pipeline in background cmdlist nodelist # the commands in the pipeline NREDIR nredir # redirection (of a compex command) type int n nodeptr # the command redirect nodeptr # list of file redirections NBACKGND nredir # run command in background NSUBSHELL nredir # run command in a subshell NAND nbinary # the && operator NOR nbinary # the || operator NIF nif # the if statement. Elif clauses are handled type int # using multiple if nodes. test nodeptr # if test ifpart nodeptr # then ifpart elsepart nodeptr # else elsepart NWHILE nbinary # the while statement. First child is the test NUNTIL nbinary # the until statement NFOR nfor # the for statement type int args nodeptr # for var in args body nodeptr # do body; done var string # the for variable NCASE ncase # a case statement type int expr nodeptr # the word to switch on cases nodeptr # the list of cases (NCLIST nodes) NCLIST nclist # a case type int next nodeptr # the next case in list pattern nodeptr # list of patterns for this case body nodeptr # code to execute for this case NDEFUN narg # define a function. The "next" field contains # the body of the function. NARG narg # represents a word type int next nodeptr # next word in list text string # the text of the word backquote nodelist # list of commands in back quotes NTO nfile # fd> fname NFROM nfile # fd< fname NAPPEND nfile # fd>> fname type int next nodeptr # next redirection in list fd int # file descriptor being redirected fname nodeptr # file name, in a NARG node expfname temp char *expfname # actual file name NTOFD ndup # fd<&dupfd NFROMFD ndup # fd>&dupfd type int next nodeptr # next redirection in list fd int # file descriptor being redirected dupfd int # file descriptor to duplicate NHERE nhere # fd<<\! NXHERE nhere # fd< 0) argptr++; for (p = optval ; p < optval + sizeof optval - 1 ; p++) *p = 2; options(1); if (*argptr == NULL && minusc == NULL) sflag = 1; editable = (isatty(0) && isatty(1)); if (iflag == 2 && sflag == 1 && editable) iflag = 1; if (jflag == 2) jflag = iflag; for (p = optval ; p < optval + sizeof optval - 1 ; p++) if (*p == 2) *p = 0; arg0 = argv[0]; if (sflag == 0) { arg0 = *argptr++; if (minusc == NULL) { commandname = arg0; setinputfile(commandname, 0); } } shellparam.p = argptr; /* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */ while (*argptr) { shellparam.nparam++; argptr++; } setinteractive(iflag); setjobctl(jflag); } /* * Process shell options. The global variable argptr contains a pointer * to the argument list; we advance it past the options. */ STATIC void options(cmdline) { register char *p; int val; int c; if (cmdline) minusc = NULL; while ((p = *argptr) != NULL) { argptr++; if ((c = *p++) == '-') { val = 1; if (p[0] == '\0' || p[0] == '-' && p[1] == '\0') { if (!cmdline) { /* "-" means turn off -x and -v */ if (p[0] == '\0') xflag = vflag = 0; /* "--" means reset params */ else if (*argptr == NULL) setparam(argptr); } break; /* "-" or "--" terminates options */ } } else if (c == '+') { val = 0; } else { argptr--; break; } while ((c = *p++) != '\0') { if (c == 'c' && cmdline) { char *q; #ifdef NOHACK /* removing this code allows sh -ce 'foo' for compat */ if (*p == '\0') #endif q = *argptr++; if (q == NULL || minusc != NULL) error("Bad -c option"); minusc = q; #ifdef NOHACK break; #endif } else { setoption(c, val); } } if (! cmdline) break; } } STATIC void setoption(flag, val) char flag; int val; { register char *p; if ((p = strchr(optchar, flag)) == NULL) error("Illegal option -%c", flag); optval[p - optchar] = val; } #ifdef mkinit INCLUDE "options.h" SHELLPROC { char *p; for (p = optval ; p < optval + sizeof optval ; p++) *p = 0; } #endif /* * Set the shell parameters. */ void setparam(argv) char **argv; { char **newparam; char **ap; int nparam; for (nparam = 0 ; argv[nparam] ; nparam++); ap = newparam = ckmalloc((nparam + 1) * sizeof *ap); while (*argv) { *ap++ = savestr(*argv++); } *ap = NULL; freeparam(&shellparam); shellparam.malloc = 1; shellparam.nparam = nparam; shellparam.p = newparam; shellparam.optnext = NULL; } /* * Free the list of positional parameters. */ void freeparam(param) struct shparam *param; { char **ap; if (param->malloc) { for (ap = param->p ; *ap ; ap++) ckfree(*ap); ckfree(param->p); } } /* * The shift builtin command. */ shiftcmd(argc, argv) char **argv; { int n; char **ap1, **ap2; n = 1; if (argc > 1) n = number(argv[1]); if (n > shellparam.nparam) n = shellparam.nparam; INTOFF; shellparam.nparam -= n; for (ap1 = shellparam.p ; --n >= 0 ; ap1++) { if (shellparam.malloc) ckfree(*ap1); } ap2 = shellparam.p; while ((*ap2++ = *ap1++) != NULL); shellparam.optnext = NULL; INTON; return 0; } /* * The set command builtin. */ setcmd(argc, argv) char **argv; { if (argc == 1) return showvarscmd(argc, argv); INTOFF; options(0); setinteractive(iflag); setjobctl(jflag); if (*argptr != NULL) { setparam(argptr); } INTON; return 0; } /* * The getopts builtin. Shellparam.optnext points to the next argument * to be processed. Shellparam.optptr points to the next character to * be processed in the current argument. If shellparam.optnext is NULL, * then it's the first time getopts has been called. */ getoptscmd(argc, argv) char **argv; { register char *p, *q; char c; char s[10]; if (argc != 3) error("Usage: getopts optstring var"); if (shellparam.optnext == NULL) { shellparam.optnext = shellparam.p; shellparam.optptr = NULL; } if ((p = shellparam.optptr) == NULL || *p == '\0') { p = *shellparam.optnext; if (p == NULL || *p != '-' || *++p == '\0') { atend: fmtstr(s, 10, "%d", shellparam.optnext - shellparam.p + 1); setvar("OPTIND", s, 0); shellparam.optnext = NULL; return 1; } shellparam.optnext++; if (p[0] == '-' && p[1] == '\0') /* check for "--" */ goto atend; } c = *p++; for (q = argv[1] ; *q != c ; ) { if (*q == '\0') { out1fmt("Illegal option -%c\n", c); c = '?'; goto out; } if (*++q == ':') q++; } if (*++q == ':') { if (*p == '\0') { if ((p = *shellparam.optnext) == NULL) { out1fmt("No arg for -%c option\n", c); c = '?'; goto out; } shellparam.optnext++; } setvar("OPTARG", p, 0); p = ""; } out: shellparam.optptr = p; s[0] = c; s[1] = '\0'; setvar(argv[2], s, 0); fmtstr(s, 10, "%d", shellparam.optnext - shellparam.p + 1); setvar("OPTIND", s, 0); return 0; } /* * Standard option processing (a la getopt) for builtin routines99. The * only argument that is passed to nextopt is the option string; the * other arguments are unnecessary. It return the character, or '\0' on * end of input. */ int nextopt(optstring) char *optstring; { register char *p, *q; char c; if ((p = optptr) == NULL || *p == '\0') { p = *argptr; if (p == NULL || *p != '-' || *++p == '\0') return '\0'; argptr++; if (p[0] == '-' && p[1] == '\0') /* check for "--" */ return '\0'; } c = *p++; for (q = optstring ; *q != c ; ) { if (*q == '\0') error("Illegal option -%c", c); if (*++q == ':') q++; } if (*++q == ':') { if (*p == '\0' && (p = *argptr++) == NULL) error("No arg for -%c option", c); optarg = p; p = NULL; } optptr = p; return c; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)options.h 5.1 (Berkeley) 3/7/91 */ struct shparam { int nparam; /* number of positional parameters (without $0) */ char malloc; /* true if parameter list dynamicly allocated */ char **p; /* parameter list */ char **optnext; /* next parameter to be processed by getopts */ char *optptr; /* used by getopts */ }; #define eflag optval[0] #define fflag optval[1] #define Iflag optval[2] #define iflag optval[3] #define jflag optval[4] #define nflag optval[5] #define sflag optval[6] #define xflag optval[7] #define zflag optval[8] #define vflag optval[9] #define NOPTS 10 #ifdef DEFINE_OPTIONS const char optchar[NOPTS+1] = "efIijnsxzv"; /* shell flags */ char optval[NOPTS+1]; /* values of option flags */ #else extern const char optchar[NOPTS+1]; extern char optval[NOPTS+1]; #endif extern char *minusc; /* argument to -c option */ extern char *arg0; /* $0 */ extern struct shparam shellparam; /* $@ */ extern char **argptr; /* argument list for builtin commands */ extern char *optarg; /* set by nextopt */ extern char *optptr; /* used by nextopt */ extern int editable; /* isatty(0) && isatty(1) */ #ifdef __STDC__ void procargs(int, char **); void setparam(char **); void freeparam(struct shparam *); int nextopt(char *); #else void procargs(); void setparam(); void freeparam(); int nextopt(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)output.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * Shell output routines. We use our own output routines because: * When a builtin command is interrupted we have to discard * any pending output. * When a builtin command appears in back quotes, we want to * save the output of the command in a region obtained * via malloc, rather than doing a fork and reading the * output of the command via a pipe. * Our output routines may be smaller than the stdio routines. */ #include /* defines BUFSIZ */ #include "shell.h" #include "syntax.h" #include "output.h" #include "memalloc.h" #include "error.h" #ifdef __STDC__ #include "stdarg.h" #else #include #endif #include #define OUTBUFSIZ BUFSIZ #define BLOCK_OUT -2 /* output to a fixed block of memory */ #define MEM_OUT -3 /* output to dynamically allocated memory */ #define OUTPUT_ERR 01 /* error occurred on output */ struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0}; struct output errout = {NULL, 0, NULL, 100, 2, 0}; struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0}; struct output *out1 = &output; struct output *out2 = &errout; #ifdef mkinit INCLUDE "output.h" INCLUDE "memalloc.h" RESET { out1 = &output; out2 = &errout; if (memout.buf != NULL) { ckfree(memout.buf); memout.buf = NULL; } } #endif #ifdef notdef /* no longer used */ /* * Set up an output file to write to memory rather than a file. */ void open_mem(block, length, file) char *block; int length; struct output *file; { file->nextc = block; file->nleft = --length; file->fd = BLOCK_OUT; file->flags = 0; } #endif void out1str(p) char *p; { outstr(p, out1); } void out2str(p) char *p; { outstr(p, out2); } void outstr(p, file) register char *p; register struct output *file; { while (*p) outc(*p++, file); } char out_junk[16]; void emptyoutbuf(dest) struct output *dest; { int offset; if (dest->fd == BLOCK_OUT) { dest->nextc = out_junk; dest->nleft = sizeof out_junk; dest->flags |= OUTPUT_ERR; } else if (dest->buf == NULL) { INTOFF; dest->buf = ckmalloc(dest->bufsize); dest->nextc = dest->buf; dest->nleft = dest->bufsize; INTON; } else if (dest->fd == MEM_OUT) { offset = dest->bufsize; INTOFF; dest->bufsize <<= 1; dest->buf = ckrealloc(dest->buf, dest->bufsize); dest->nleft = dest->bufsize - offset; dest->nextc = dest->buf + offset; INTON; } else { flushout(dest); } dest->nleft--; } void flushall() { flushout(&output); flushout(&errout); } void flushout(dest) struct output *dest; { if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0) return; if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0) dest->flags |= OUTPUT_ERR; dest->nextc = dest->buf; dest->nleft = dest->bufsize; } void freestdout() { INTOFF; if (output.buf) { ckfree(output.buf); output.buf = NULL; output.nleft = 0; } INTON; } #ifdef __STDC__ void outfmt(struct output *file, char *fmt, ...) { va_list ap; va_start(ap, fmt); doformat(file, fmt, ap); va_end(ap); } void out1fmt(char *fmt, ...) { va_list ap; va_start(ap, fmt); doformat(out1, fmt, ap); va_end(ap); } void fmtstr(char *outbuf, int length, char *fmt, ...) { va_list ap; struct output strout; va_start(ap, fmt); strout.nextc = outbuf; strout.nleft = length; strout.fd = BLOCK_OUT; strout.flags = 0; doformat(&strout, fmt, ap); outc('\0', &strout); if (strout.flags & OUTPUT_ERR) outbuf[length - 1] = '\0'; va_end(ap); } #else /* not __STDC__ */ void outfmt(va_alist) va_dcl { va_list ap; struct output *file; char *fmt; va_start(ap); file = va_arg(ap, struct output *); fmt = va_arg(ap, char *); doformat(file, fmt, ap); va_end(ap); } void out1fmt(va_alist) va_dcl { va_list ap; char *fmt; va_start(ap); fmt = va_arg(ap, char *); doformat(out1, fmt, ap); va_end(ap); } void fmtstr(va_alist) va_dcl { va_list ap; struct output strout; char *outbuf; int length; char *fmt; va_start(ap); outbuf = va_arg(ap, char *); length = va_arg(ap, int); fmt = va_arg(ap, char *); strout.nextc = outbuf; strout.nleft = length; strout.fd = BLOCK_OUT; strout.flags = 0; doformat(&strout, fmt, ap); outc('\0', &strout); if (strout.flags & OUTPUT_ERR) outbuf[length - 1] = '\0'; } #endif /* __STDC__ */ /* * Formatted output. This routine handles a subset of the printf formats: * - Formats supported: d, u, o, X, s, and c. * - The x format is also accepted but is treated like X. * - The l modifier is accepted. * - The - and # flags are accepted; # only works with the o format. * - Width and precision may be specified with any format except c. * - An * may be given for the width or precision. * - The obsolete practice of preceding the width with a zero to get * zero padding is not supported; use the precision field. * - A % may be printed by writing %% in the format string. */ #define TEMPSIZE 24 #ifdef __STDC__ static const char digit[16] = "0123456789ABCDEF"; #else static const char digit[17] = "0123456789ABCDEF"; #endif void doformat(dest, f, ap) register struct output *dest; register char *f; /* format string */ va_list ap; { register char c; char temp[TEMPSIZE]; int flushleft; int sharp; int width; int prec; int islong; char *p; int sign; long l; unsigned long num; unsigned base; int len; int size; int pad; while ((c = *f++) != '\0') { if (c != '%') { outc(c, dest); continue; } flushleft = 0; sharp = 0; width = 0; prec = -1; islong = 0; for (;;) { if (*f == '-') flushleft++; else if (*f == '#') sharp++; else break; f++; } if (*f == '*') { width = va_arg(ap, int); f++; } else { while (is_digit(*f)) { width = 10 * width + digit_val(*f++); } } if (*f == '.') { if (*++f == '*') { prec = va_arg(ap, int); f++; } else { prec = 0; while (is_digit(*f)) { prec = 10 * prec + digit_val(*f++); } } } if (*f == 'l') { islong++; f++; } switch (*f) { case 'd': if (islong) l = va_arg(ap, long); else l = va_arg(ap, int); sign = 0; num = l; if (l < 0) { num = -l; sign = 1; } base = 10; 9999 goto number; case 'u': base = 10; goto uns_number; case 'o': base = 8; goto uns_number; case 'x': /* we don't implement 'x'; treat like 'X' */ case 'X': base = 16; uns_number: /* an unsigned number */ sign = 0; if (islong) num = va_arg(ap, unsigned long); else num = va_arg(ap, unsigned int); number: /* process a number */ p = temp + TEMPSIZE - 1; *p = '\0'; while (num) { *--p = digit[num % base]; num /= base; } len = (temp + TEMPSIZE - 1) - p; if (prec < 0) prec = 1; if (sharp && *f == 'o' && prec <= len) prec = len + 1; pad = 0; if (width) { size = len; if (size < prec) size = prec; size += sign; pad = width - size; if (flushleft == 0) { while (--pad >= 0) outc(' ', dest); } } if (sign) outc('-', dest); prec -= len; while (--prec >= 0) outc('0', dest); while (*p) outc(*p++, dest); while (--pad >= 0) outc(' ', dest); break; case 's': p = va_arg(ap, char *); pad = 0; if (width) { len = strlen(p); if (prec >= 0 && len > prec) len = prec; pad = width - len; if (flushleft == 0) { while (--pad >= 0) outc(' ', dest); } } prec++; while (--prec != 0 && *p) outc(*p++, dest); while (--pad >= 0) outc(' ', dest); break; case 'c': c = va_arg(ap, int); outc(c, dest); break; default: outc(*f, dest); break; } f++; } } /* * Version of write which resumes after a signal is caught. */ int xwrite(fd, buf, nbytes) int fd; char *buf; int nbytes; { int ntry; int i; int n; n = nbytes; ntry = 0; for (;;) { i = write(fd, buf, n); if (i > 0) { if ((n -= i) <= 0) return nbytes; buf += i; ntry = 0; } else if (i == 0) { if (++ntry > 10) return nbytes - n; } else if (errno != EINTR) { return -1; } } } /* * Version of ioctl that retries after a signal is caught. */ int xioctl(fd, request, arg) { int i; while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR); return i; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)output.h 5.1 (Berkeley) 3/7/91 */ #ifndef OUTPUT_INCL struct output { char *nextc; int nleft; char *buf; int bufsize; short fd; short flags; }; extern struct output output; extern struct output errout; extern struct output memout; extern struct output *out1; extern struct output *out2; #ifdef __STDC__ void outstr(char *, struct output *); void out1str(char *); void out2str(char *); void outfmt(struct output *, char *, ...); void out1fmt(char *, ...); void fmtstr(char *, int, char *, ...); /* void doformat(struct output *, char *, va_list); */ void doformat(); void emptyoutbuf(struct output *); void flushall(void); void flushout(struct output *); void freestdout(void); int xwrite(int, char *, int); int xioctl(int, int, int); #else void outstr(); void out1str(); void out2str(); void outfmt(); void out1fmt(); void fmtstr(); /* void doformat(); */ void doformat(); void emptyoutbuf(); void flushall(); void flushout(); void freestdout(); int xwrite(); int xioctl(); #endif #define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c))) #define out1c(c) outc(c, out1); #define out2c(c) outc(c, out2); #define OUTPUT_INCL #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)parser.c 5.3 (Berkeley) 4/12/91"; #endif /* not lint */ #include "shell.h" #include "parser.h" #include "nodes.h" #include "expand.h" /* defines rmescapes() */ #include "redir.h" /* defines copyfd() */ #include "syntax.h" #include "options.h" #include "input.h" #include "output.h" #include "var.h" #include "error.h" #include "memalloc.h" #include "mystring.h" /* * Shell command parser. */ #define EOFMARKLEN 79 /* values returned by readtoken */ #include "token.def" struct heredoc { struct heredoc *next; /* next here document in list */ union node *here; /* redirection node */ char *eofmark; /* string indicating end of input */ int striptabs; /* if set, strip leading tabs */ }; struct heredoc *heredoclist; /* list of here documents to read */ int parsebackquote; /* nonzero if we are inside backquotes */ int doprompt; /* if set, prompt the user */ int needprompt; /* true if interactive and at start of line */ int lasttoken; /* last token read */ MKINIT int tokpushback; /* last token pushed back */ char *wordtext; /* text of last word returned by readtoken */ int checkkwd; /* 1 == check for kwds, 2 == also eat newlines */ struct nodelist *backquotelist; union node *redirnode; struct heredoc *heredoc; int quoteflag; /* set if (part of) last token was quoted */ int startlinno; /* line # where last token started */ #define GDB_HACK 1 /* avoid local declarations which gdb can't handle */ #ifdef GDB_HACK static const char argvars[5] = {CTLVAR, VSNORMAL|VSQUOTE, '@', '=', '\0'}; static const char types[] = "}-+?="; #endif STATIC union node *list __P((int)); STATIC union node *andor __P((void)); STATIC union node *pipeline __P((void)); STATIC union node *command __P((void)); STATIC union node *simplecmd __P((union node **, union node *)); STATIC void parsefname __P((void)); STATIC void parseheredoc __P((void)); STATIC int readtoken __P((void)); STATIC int readtoken1 __P((int, char const *, char *, int)); STATIC void attyline __P((void)); STATIC int noexpand __P((char *)); STATIC void synexpect __P((int)); STATIC void synerror __P((char *)); #if ATTY || READLINE STATIC void putprompt __P((char *)); #else /* not ATTY */ #define putprompt(s) out2str(s) #endif /* * Read and parse a command. Returns NEOF on end of file. (NULL is a * valid parse tree indicating a blank line.) */ union node * parsecmd(interact) { int t; extern int exitstatus; doprompt = interact; if (doprompt) putprompt(exitstatus == 0 ? ps1val() : pseval()); needprompt = 0; if ((t = readtoken()) == TEOF) return NEOF; if (t == TNL) return NULL; tokpushback++; return list(1); } STATIC union node * list(nlflag) { union node *n1, *n2, *n3, **pn; int first; checkkwd = 2; if (nlflag == 0 && tokendlist[peektoken()]) return NULL; n1 = andor(); for (first = 1; ; first = 0) { switch (readtoken()) { case TBACKGND: pn = &n1; if (!first && n1->type == NSEMI) pn = &n1->nbinary.ch2; if ((*pn)->type == NCMD || (*pn)->type == NPIPE) { (*pn)->ncmd.backgnd = 1; } else if ((*pn)->type == NREDIR) { (*pn)->type = NBACKGND; } else { n3 = (union node *)stalloc(sizeof (struct nredir)); n3->type = NBACKGND; n3->nredir.n = *pn; n3->nredir.redirect = NULL; *pn = n3; } goto tsemi; case TNL: tokpushback++; /* fall through */ tsemi: case TSEMI: if (readtoken() == TNL) { parseheredoc(); if (nlflag) return n1; } else { tokpushback++; } checkkwd = 2; if (tokendlist[peektoken()]) return n1; n2 = andor(); n3 = (union node *)stalloc(sizeof (struct nbinary)); n3->type = NSEMI; n3->nbinary.ch1 = n1; n3->nbinary.ch2 = n2; n1 = n3; break; case TEOF: if (heredoclist) parseheredoc(); else pungetc(); /* push back EOF on input */ return n1; default: if (nlflag) synexpect(-1); tokpushback++; return n1; } } } STATIC union node * andor() { union node *n1, *n2, *n3; int t; n1 = pipeline(); for (;;) { if ((t = readtoken()) == TAND) { t = NAND; } else if (t == TOR) { t = NOR; } else { tokpushback++; return n1; } n2 = pipeline(); n3 = (union node *)stalloc(sizeof (struct nbinary)); n3->type = t; n3->nbinary.ch1 = n1; n3->nbinary.ch2 = n2; n1 = n3; } } STATIC union node * pipeline() { union node *n1, *pipenode; struct nodelist *lp, *prev; n1 = command(); if (readtoken() == TPIPE) { pipenode = (union node *)stalloc(sizeof (struct npipe)); pipenode->type = NPIPE; pipenode->npipe.backgnd = 0; lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); pipenode->npipe.cmdlist = lp; lp->n = n1; do { prev = lp; lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); lp->n = command(); prev->next = lp; } while (readtoken() == TPIPE); lp->next = NULL; n1 = pipenode; } tokpushback++; return n1; } STATIC union node * command() { union node *n1, *n2; union node *ap, **app; union node *cp, **cpp; union node *redir, **rpp; int t; checkkwd = 2; redir = 0; rpp = &redir; /* Check for redirection which may precede command */ while (readtoken() == TREDIR) { *rpp = n2 = redirnode; rpp = &n2->nfile.next; parsefname(); } tokpushback++; switch (readtoken()) { case TIF: n1 = (union node *)stalloc(sizeof (struct nif)); n1->type = NIF; n1->nif.test = list(0); if (readtoken() != TTHEN) synexpect(TTHEN); n1->nif.ifpart = list(0); n2 = n1; while (readtoken() == TELIF) { n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif)); n2 = n2->nif.elsepart; n2->type = NIF; n2->nif.test = list(0); if (readtoken() != TTHEN) synexpect(TTHEN); n2->nif.ifpart = list(0); } if (lasttoken == TELSE) n2->nif.elsepart = list(0); else { n2->nif.elsepart = NULL; tokpushback++; } if (readtoken() != TFI) synexpect(TFI); checkkwd = 1; break; case TWHILE: case TUNTIL: { int got; n1 = (union node *)stalloc(sizeof (struct nbinary)); n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL; n1->nbinary.ch1 = list(0); if ((got=readtoken()) != TDO) { TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : "")); synexpect(TDO); }99999999999999999999999 n1->nbinary.ch2 = list(0); if (readtoken() != TDONE) synexpect(TDONE); checkkwd = 1; break; } case TFOR: if (readtoken() != TWORD || quoteflag || ! goodname(wordtext)) synerror("Bad for loop variable"); n1 = (union node *)stalloc(sizeof (struct nfor)); n1->type = NFOR; n1->nfor.var = wordtext; if (readtoken() == TWORD && ! quoteflag && equal(wordtext, "in")) { app = ≈ while (readtoken() == TWORD) { n2 = (union node *)stalloc(sizeof (struct narg)); n2->type = NARG; n2->narg.text = wordtext; n2->narg.backquote = backquotelist; *app = n2; app = &n2->narg.next; } *app = NULL; n1->nfor.args = ap; /* A newline or semicolon is required here to end the list. */ if (lasttoken != TNL && lasttoken != TSEMI) synexpect(-1); } else { #ifndef GDB_HACK static const char argvars[5] = {CTLVAR, VSNORMAL|VSQUOTE, '@', '=', '\0'}; #endif n2 = (union node *)stalloc(sizeof (struct narg)); n2->type = NARG; n2->narg.text = (char *)argvars; n2->narg.backquote = NULL; n2->narg.next = NULL; n1->nfor.args = n2; /* A newline or semicolon is optional here. Anything else gets pushed back so we can read it again. */ if (lasttoken != TNL && lasttoken != TSEMI) tokpushback++; } checkkwd = 2; if ((t = readtoken()) == TDO) t = TDONE; else if (t == TBEGIN) t = TEND; else synexpect(-1); n1->nfor.body = list(0); if (readtoken() != t) synexpect(t); checkkwd = 1; break; case TCASE: n1 = (union node *)stalloc(sizeof (struct ncase)); n1->type = NCASE; if (readtoken() != TWORD) synexpect(TWORD); n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg)); n2->type = NARG; n2->narg.text = wordtext; n2->narg.backquote = backquotelist; n2->narg.next = NULL; while (readtoken() == TNL); if (lasttoken != TWORD || ! equal(wordtext, "in")) synerror("expecting \"in\""); cpp = &n1->ncase.cases; while (checkkwd = 2, readtoken() == TWORD) { *cpp = cp = (union node *)stalloc(sizeof (struct nclist)); cp->type = NCLIST; app = &cp->nclist.pattern; for (;;) { *app = ap = (union node *)stalloc(sizeof (struct narg)); ap->type = NARG; ap->narg.text = wordtext; ap->narg.backquote = backquotelist; if (readtoken() != TPIPE) break; app = &ap->narg.next; if (readtoken() != TWORD) synexpect(TWORD); } ap->narg.next = NULL; if (lasttoken != TRP) synexpect(TRP); cp->nclist.body = list(0); if ((t = readtoken()) == TESAC) tokpushback++; else if (t != TENDCASE) synexpect(TENDCASE); cpp = &cp->nclist.next; } *cpp = NULL; if (lasttoken != TESAC) synexpect(TESAC); checkkwd = 1; break; case TLP: n1 = (union node *)stalloc(sizeof (struct nredir)); n1->type = NSUBSHELL; n1->nredir.n = list(0); n1->nredir.redirect = NULL; if (readtoken() != TRP) synexpect(TRP); checkkwd = 1; break; case TBEGIN: n1 = list(0); if (readtoken() != TEND) synexpect(TEND); checkkwd = 1; break; /* Handle an empty command like other simple commands. */ case TNL: case TSEMI: case TEND: case TRP: case TEOF: case TWORD: tokpushback++; return simplecmd(rpp, redir); default: synexpect(-1); } /* Now check for redirection which may follow command */ while (readtoken() == TREDIR) { *rpp = n2 = redirnode; rpp = &n2->nfile.next; parsefname(); } tokpushback++; *rpp = NULL; if (redir) { if (n1->type != NSUBSHELL) { n2 = (union node *)stalloc(sizeof (struct nredir)); n2->type = NREDIR; n2->nredir.n = n1; n1 = n2; } n1->nredir.redirect = redir; } return n1; } STATIC union node * simplecmd(rpp, redir) union node **rpp, *redir; { union node *args, **app; union node **orig_rpp = rpp; union node *n; /* If we don't have any redirections already, then we must reset rpp to be the address of the local redir variable. */ if (redir == 0) rpp = &redir; args = NULL; app = &args; /* We save the incoming value, because we need this for shell functions. There can not be a redirect or an argument between the function name and the open parenthesis. */ orig_rpp = rpp; for (;;) { if (readtoken() == TWORD) { n = (union node *)stalloc(sizeof (struct narg)); n->type = NARG; n->narg.text = wordtext; n->narg.backquote = backquotelist; *app = n; app = &n->narg.next; } else if (lasttoken == TREDIR) { *rpp = n = redirnode; rpp = &n->nfile.next; parsefname(); /* read name of redirection file */ } else if (lasttoken == TLP && app == &args->narg.next && rpp == orig_rpp) { /* We have a function */ if (readtoken() != TRP) synexpect(TRP); #ifdef notdef if (! goodname(n->narg.text)) synerror("Bad function name"); #endif n->type = NDEFUN; n->narg.next = command(); return n; } else { tokpushback++; break; } } *app = NULL; *rpp = NULL; n = (union node *)stalloc(sizeof (struct ncmd)); n->type = NCMD; n->ncmd.backgnd = 0; n->ncmd.args = args; n->ncmd.redirect = redir; return n; } STATIC void parsefname() { union node *n = redirnode; if (readtoken() != TWORD) synexpect(-1); if (n->type == NHERE) { struct heredoc *here = heredoc; struct heredoc *p; int i; if (quoteflag == 0) n->type = NXHERE; TRACE(("Here document %d\n", n->type)); if (here->striptabs) { while (*wordtext == '\t') wordtext++; } if (! noexpand(wordtext) || (i = strlen(wordtext)) == 0 || i > EOFMARKLEN) synerror("Illegal eof marker for << redirection"); rmescapes(wordtext); here->eofmark = wordtext; here->next = NULL; if (heredoclist == NULL) heredoclist = here; else { for (p = heredoclist ; p->next ; p = p->next); p->next = here; } } else if (n->type == NTOFD || n->type == NFROMFD) { if (is_digit(wordtext[0])) n->ndup.dupfd = digit_val(wordtext[0]); else if (wordtext[0] == '-') n->ndup.dupfd = -1; else goto bad; if (wordtext[1] != '\0') { bad: synerror("Bad fd number"); } } else { n->nfile.fname = (union node *)stalloc(sizeof (struct narg)); n = n->nfile.fname; n->type = NARG; n->narg.next = NULL; n->narg.text = wordtext; n->narg.backquote = backquotelist; } } /* * Input any here documents. */ STATIC void parseheredoc() { struct heredoc *here; union node *n; while (heredoclist) { here = heredoclist; heredoclist = here->next; if (needprompt) { putprompt(ps2val()); needprompt = 0; } readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX, here->eofmark, here->striptabs); n = (union node *)stalloc(sizeof (struct narg)); n->narg.type = NARG; n->narg.next = NULL; n->narg.text = wordtext; n->narg.backquote = backquotelist; here->here->nhere.doc = n; } } STATIC int peektoken() { int t; t = readtoken(); tokpushback++; return (t); } STATIC int xxreadtoken(); STATIC int readtoken() { int t; #if DEBUG int alreadyseen = tokpushback; #endif t = xxreadtoken(); if (checkkwd) { /* * eat newlines */ if (checkkwd == 2) { checkkwd = 0; while (t == TNL) { parseheredoc(); t = xxreadtoken(); } } else checkkwd = 0; /* * check for keywords */ if (t == TWORD && !quoteflag) { register char *const *pp; for (pp = parsekwd; *pp; pp++) { if (**pp == *wordtext && equal(*pp, wordtext)) { lasttoken = t = pp - parsekwd + KWDOFFSET; TRACE(("keyword %s recognized\n", tokname[t])); break; } } } } #if DEBUG if (!alreadyseen) TRACE(("token %s %s\n", tokname[t], t == TWORD ? wordtext : "")); else TRACE(("reread token %s %s\n", tokname[t], t == TWORD ? wordtext : "")); #endif return (t); } /* * Read the next input token. * If the token is a word, we set backquotelist to the list of cmds in * backquotes. We set quoteflag to true if any part of the word was * quoted. * If the token is TREDIR, then we set redirnode to a structure containing * the redirection. * In all cases, the variable startlinno is set to the number of the line * on which the token starts. * * [Change comment: here documents and internal procedures] * [Readtoken shouldn't have any arguments. Perhaps we should make the * word parsing code into a separate routine. In this case, readtoken * doesn't need to have any internal procedures, but parseword does. * We could also make parseoperator in essence the main routine, and * have parseword (readtoken1?) handle both words and redirection.] */ #define RETURN(token) return lasttoken = token STATIC int xxreadtoken() { register c; if (tokpushback) { tokpushback = 0; return lasttoken; } if (needprompt) { putprompt(ps2val()); needprompt = 0; } startlinno = plinno; for (;;) { /* until token or start of word found */ c = pgetc_macro(); if (c == ' ' || c == '\t') continue; /* quick check for white space first */ switch (c) { case ' ': case '\t': continue; case '#': while ((c = pgetc()) != '\n' && c != PEOF); pungetc(); continue; case '\\': if (pgetc() == '\n') { startlinno = ++plinno; if (doprompt) putprompt(ps2val()); continue; } pungetc(); goto breakloop; case '\n': plinno++; needprompt = doprompt; RETURN(TNL); case PEOF: RETURN(TEOF); case '&': if (pgetc() == '&') RETURN(TAND); pungetc(); RETURN(TBACKGND); case '|': if (pgetc() == '|') RETURN(TOR); pungetc(); RETURN(TPIPE); case ';': if (pgetc() == ';') RETURN(TENDCASE); pungetc(); RETURN(TSEMI); case '(': RETURN(TLP); case ')': RETURN(TRP); default: goto breakloop; } } breakloop: return readtoken1(c, BASESYNTAX, (char *)NULL, 0); #undef RETURN } /* * If eofmark is NULL, read a word or a redirection symbol. If eofmark * is not NULL, read a here document. In the latter case, eofmark is the * word which marks the end of the document and striptabs is true if * leading tabs should be stripped from the document. The argument firstc * is the first character of the input token or document. * * Because C does not have internal subroutines, I have simulated them * using goto's to implement the subroutine linkage. The following macros * will run code that appears at the end of readtoken1. */ #define CHECKEND() {goto checkend; checkend_return:;} #define PARSEREDIR() {goto parseredir; parseredir_return:;} #define PARSESUB() {goto parsesub; parsesub_return:;} #define PARSEBACKQOLD() {oldstyle = 1; goto parsebackq; parsebackq_oldreturn:;} #define PARSEBACKQNEW() {oldstyle = 0; goto parsebackq; parsebackq_newreturn:;} STATIC int readtoken1(firstc, syntax, eofmark, striptabs) int firstc; char const *syntax; char *eofmark; int striptabs; { register c = firstc; register char *out; int len; char line[EOFMARKLEN + 1]; struct nodelist *bqlist; int quotef; int dblquote; int varnest; int oldstyle; startlinno = plinno; dblquote = 0; if (syntax == DQSYNTAX) dblquote = 1; quotef = 0; bqlist = NULL; varnest = 0; STARTSTACKSTR(out); loop: { /* for each line, until end of word */ #if ATTY if (c == '\034' && doprompt && attyset() && ! equal(termval(), "emacs")) { attyline(); if (syntax == BASESYNTAX) return readtoken(); c = pgetc(); goto loop; } #endif CHECKEND(); /* set c to PEOF if at end of here document */ for (;;) { /* until end of line or end of word */ CHECKSTRSPACE(3, out); /* permit 3 calls to USTPUTC */ switch(syntax[c]) { case CNL: /* '\n' */ if (syntax == BASESYNTAX) goto endword; /* exit outer loop */ USTPUTC(c, out); plinno++; if (doprompt) { putprompt(ps2val()); } c = pgetc(); goto loop; /* continue outer loop */ case CWORD: USTPUTC(c, out); break; case CCTL: if (eofmark == NULL || dblquote) USTPUTC(CTLESC, out); USTPUTC(c, out); break; case CBACK: /* backslash */ c = pgetc(); if (c == PEOF) { USTPUTC('\\', out); pungetc(); } else if (c == '\n') { if (doprompt) putprompt(ps2val()); } else { if (dblquote && c != '\\' && c != '`' && c != '$' && (c != '"' || eofmark != NULL)) USTPUTC('\\', out); if (SQSYNTAX[c] == CCTL) USTPUTC(CTLESC, out); USTPUTC(c, out); quotef++; } break; case CSQUOTE: syntax = SQSYNTAX; break; case CDQUOTE: syntax = DQSYNTAX; dblquote = 1; break; case CENDQUOTE: if (eofmark) { USTPUTC(c, out); } else { syntax = BASESYNTAX; quotef++; dblquote = 0; } break; case CVAR: /* '$' */ PARSESUB(); /* parse substitution */ break; case CENDVAR: /* '}' */ if (varnest > 0) { varnest--; USTPUTC(CTLENDVAR, out); } else { USTPUTC(c, out); } break; case CBQUOTE: /* '`' */ PARSEBACKQOLD(); break; case CEOF: goto endword; /* exit outer loop */ default: if (varnest == 0) goto endword; /* exit outer loop */ USTPUTC(c, out); } c = pgetc_macro(); } } endword: if (syntax != BASESYNTAX && ! parsebackquote && eofmark == NULL) synerror("Unterminated quoted string"); if (varnest != 0) { startlinno = plinno; synerror("Missing '}'"); } USTPUTC('\0', out); len = out - stackblock(); out = stackblock(); if (eofmark == NULL) { if ((c == '>' || c == '<') && quotef == 0 && len <= 2 && (*out == '\0' || is_digit(*out))) { PARSEREDIR(); return lasttoken = TREDIR; } else { pungetc(); } } quoteflag = quotef; backquotelist = bqlist; grabstackblock(len); wordtext = out; return lasttoken = TWORD; /* end of readtoken routine */ /* * Check to see whether we are at the end of the here document. When this * is called, c is set to the first character of the next input line. If * we are at the end of the here document, this routine sets the c to PEOF. */ checkend: { if (eofmark) { if (striptabs) { while (c == '\t') c = pgetc(); } if (c == *eofmark) { if (pfgets(line, sizeof line) != NULL) { register char *p, *q; p = line; for (q = eofmark + 1 ; *q && *p == *q ; p++, q++); if (*p == '\n' && *q == '\0') { c = PEOF; plinno++; needprompt = doprompt; } else { ppushback(line, strlen(line)); } } } } goto checkend_return; } /* * Parse a redirection operator. The variable "out" points to a string * specifying the fd to be redirected. The variable "c" contains the * first character of the redirection operator. */ parseredir: { char fd = *out; union node *np; np = (union node *)stalloc(sizeof (struct nfile)); if (c == '>') { np->nfile.fd = 1; c = pgetc(); if (c == '>') np->type = NAPPEND; else if (c == '&') np->type = NTOFD; else { np->type = NTO; pungetc(); } } else { /* c == '<' */ np->nfile.fd = 0; c = pgetc(); if (c == '<') { if (sizeof (struct nfile) != sizeof (struct nhere)) { np = (union node *)stalloc(sizeof (struct nhere)); np->nfile.fd = 0; } np->type = NHERE; heredoc = (struct heredoc *)stalloc(sizeof (struct heredoc)); heredoc->here = np; if ((c = pgetc()) == '-') { heredoc->striptabs = 1; } else { heredoc->striptabs = 0; pungetc(); } } else if (c == '&') np->type = NFROMFD; else { np->type = NFROM; pungetc(); } } if (fd != '\0') np->nfile.fd = digit_val(fd); redirnode = np; goto parseredir_return; } /* * Parse a substitution. At this point, we have read the dollar sign * and nothing else. */ parsesub: { int subtype; int typeloc; int flags; char *p; #ifndef GDB_HACK static const char types[] = "}-+?="; #endif c = pgetc(); if (c != '(' && c != '{' && !is_name(c) && !is_special(c)) { USTPUTC('$', out); pungetc(); } else if (c == '(') { /* $(command) */ PARSEBACKQNEW(); } else { USTPUTC(CTLVAR, out); typeloc = out - stackblock(); USTPUTC(VSNORMAL, out); subtype = VSNORMAL; if (c == '{') { c = pgetc(); subtype = 0; } if (is_name(c)) { do { STPUTC(c, out); c = pgetc(); } while (is_in_name(c)); } else { if (! is_special(c)) badsub: synerror("Bad substitution"); USTPUTC(c, out); c = pgetc(); } STPUTC('=', out); flags = 0; if (subtype == 0) { if (c == ':') { flags = VSNUL; c = pgetc(); } p = strchr(types, c); if (p == NULL) goto badsub; subtype = p - types + VSNORMAL; } else { pungetc(); } if (dblquote) flags |= VSQUOTE; *(stackblock() + typeloc) = subtype | flags; if (subtype != VSNORMAL) varnest++; } goto parsesub_return; } /* * Called to parse command substitutions. Newstyle is set if the command * is enclosed inside $(...); nlpp is a pointer to the head of the linked * list of commands (passed by reference), and savelen is the number of * characters on the top of the stack which must be preserved. */ parsebackq: { struct nodelist **nlpp; int savepbq; union node *n; char *volatile str; struct jmploc jmploc; struct jmploc *volatile savehandler; int savelen; int savedoprompt; savepbq = parsebackquote; if (setjmp(jmploc.loc)) { if (str) ckfree(str); parsebackquote = 0; handler = savehandler; longjmp(handler->loc, 1); } INTOFF; str = NULL; savelen = out - stackblock(); if (savelen > 0) { str = ckmalloc(savelen); bcopy(stackblock(), str, savelen); } savehandler = handler; handler = &jmploc; INTON; if (oldstyle) { /* We must read until the closing backquote, giving special treatment to some slashes, and then push the string and reread it as input, interpreting it normally. */ register char *out; register c; int savelen; char *str; STARTSTACKSTR(out); while ((c = pgetc ()) != '`') { if (c == '\\') { c = pgetc (); if (c != '\\' && c != '`' && c != '$' && (!dblquote || c != '"')) STPUTC('\\', out); } if (c == '\n') { plinno++; if (doprompt) putprompt(ps2val()); } STPUTC(c, out); } STPUTC('\0', out); savelen = out - stackblock(); if (savelen > 0) { str = ckmalloc(savelen); bcopy(stackblock(), str, savelen); } setinputstring(str, 1); savedoprompt = doprompt; doprompt = 0; /* no prompts while rereading string */ } nlpp = &bqlist; while (*nlpp) nlpp = &(*nlpp)->next; *nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist)); (*nlpp)->next = NULL; parsebackquote = oldstyle; n = list(0); if (!oldstyle && (readtoken() != TRP)) synexpect(TRP); (*nlpp)->n = n; /* Start reading from old file again. */ if (oldstyle) { popfile(); doprompt = savedoprompt; } while (stackblocksize() <= savelen) growstackblock(); STARTSTACKSTR(out); if (str) { bcopy(str, out, savelen); STADJUST(savelen, out); INTOFF; ckfree(str); str = NULL; INTON; } parsebackquote = savepbq; handler = savehandler; USTPUTC(CTLBACKQ + dblquote, out); if (oldstyle) goto parsebackq_oldreturn; else goto parsebackq_newreturn; } } /* end of readtoken */ #ifdef mkinit RESET { tokpushback = 0; } #endif #if READLINE /* * Remember a prompt for use with readline if input and output is a terminal. */ STATIC void putprompt(s) char *s; { if (editable) { r_use_prompt = s; } else { out2str(s); } } #endif #if ATTY /* * Called to process a command generated by atty. We execute the line, * and catch any errors that occur so they don't propagate outside of * this routine. */ STATIC void attyline() { char line[256]; struct stackmark smark; struct jmploc jmploc; struct jmploc *volatile savehandler; if (pfgets(line, sizeof line) == NULL) return; /* "can't happen" */ if (setjmp(jmploc.loc)) { if (exception == EXERROR) out2str("\033]D\n"); handler = savehandler; longjmp(handler->loc, 1); } savehandler = handler; handler = &jmploc; setstackmark(&smark); evalstring(line); popstackmark(&smark); handler = savehandler; doprompt = 1; } /* * Output a prompt for atty. We output the prompt as part of the * appropriate escape sequence. */ STATIC void putprompt(s) char *s; { register char *p; if (attyset() && ! equal(termval(), "emacs")) { if (strchr(s, '\7')) out2c('\7'); out2str("\033]P1;"); for (p = s ; *p ; p++) { if ((unsigned)(*p - ' ') <= '~' - ' ') out2c(*p); } out2c('\n'); } else { out2str(s); } } #endif /* * Returns true if the text contains nothing to expand (no dollar signs * or backquotes). */ STATIC int noexpand(text) char *text; { register char *p; register char c; p = text; while ((c = *p++) != '\0') { if (c == CTLESC) p++; else if (BASESYNTAX[c] == CCTL) return 0; } return 1; } /* * Return true if the argument is a legal variable name (a letter or * underscore followed by zero or more letters, underscores, and digits). */ int goodname(name) char *name; { register char *p; p = name; if (! is_name(*p)) return 0; while (*++p) { if (! is_in_name(*p)) return 0; } return 1; } /* * Called when an unexpected token is read during the parse. The argument * is the token that is expected, or -1 if more than one type of token can * occur at this point. */ STATIC void synexpect(token) { char msg[64]; if (token >= 0) { fmtstr(msg, 64, "%s unexpected (expecting %s)", tokname[lasttoken], tokname[token]); } else { fmtstr(msg, 64, "%s unexpected", tokname[lasttoken]); } synerror(msg); } STATIC void synerror(msg) char *msg; { if (commandname) outfmt(&errout, "%s: %d: ", commandname, startlinno); outfmt(&errout, "Syntax error: %s\n", msg); error((char *)NULL); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)parser.h 5.1 (Berkeley) 3/7/91 */ /* control characters in argument strings */ #define CTLESC '\201' #define CTLVAR '\202' #define CTLENDVAR '\203' #define CTLBACKQ '\204' #define CTLQUOTE 01 /* ored with CTLBACKQ code if in quotes */ /* variable substitution byte (follows CTLVAR) */ #define VSTYPE 07 /* type of variable substitution */ #define VSNUL 040 /* colon--treat the empty string as unset */ #define VSQUOTE 0100 /* inside double quotes--suppress splitting */ /* values of VSTYPE field */ #define VSNORMAL 1 /* normal variable: $var or ${var} */ #define VSMINUS 2 /* ${var-text} */ #define VSPLUS 3 /* ${var+text} */ #define VSQUESTION 4 /* ${var?message} */ #define VSASSIGN 5 /* ${var=text} */ /* * NEOF is returned by parsecmd when it encounters an end of file. It * must be distinct from NULL, so we use the address of a variable that * happens to be handy. */ extern int tokpushback; #define NEOF ((union node *)&tokpushback) #ifdef __STDC__ union node *parsecmd(int); int goodname(char *); #else union node *parsecmd(); int goodname(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)redir.c 5.1 (Berkeley) 3/7/91"; #endif /* not lint */ /* * Code for dealing with input/output redirection. */ #include "shell.h" #include "nodes.h" #include "jobs.h" #include "expand.h" #include "redir.h" #include "eval.h" #include "output.h" #include "memalloc.h" #include "error.h" #include #include #include #include #include #define EMPTY -2 /* marks an unused slot in redirtab */ #define PIPESIZE 4096 /* amount of buffering in a pipe */ MKINIT struct redirtab { struct redirtab *next; short renamed[10]; }; MKINIT struct redirtab *redirlist; /* We keep track of whether or not fd0 has been redirected. This is for background commands, where we want to redirect fd0 to /dev/null only if it hasn't already been redirected. */ int fd0_redirected = 0; #ifdef __STDC__ STATIC void openredirect(union node *, char *); STATIC int openhere(union node *); #else STATIC void openredirect(); STATIC int openhere(); #endif /* * Process a list of redirection commands. If the REDIR_PUSH flag is set, * old file descriptors are stashed away so that the redirection can be * undone by calling popredir. If the REDIR_BACKQ flag is set, then the * standard output, and the standard error if it becomes a duplicate of * stdout, is saved in memory. */ void redirect(redir, flags) union node *redir; int flags; { union node *n; struct redirtab *sv; int i; int fd; char memory[10]; /* file descriptors to write to memory */ for (i = 10 ; --i >= 0 ; ) memory[i] = 0; memory[1] = flags & REDIR_BACKQ; if (flags & REDIR_PUSH) { sv = ckmalloc(sizeof (struct redirtab)); for (i = 0 ; i < 10 ; i++) sv->renamed[i] = EMPTY; sv->next = redirlist; redirlist = sv; } for (n = redir ; n ; n = n->nfile.next) { fd = n->nfile.fd; if ((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) { INTOFF; if ((i = copyfd(fd, 10)) != EMPTY) { sv->renamed[fd] = i; close(fd); } INTON; if (i == EMPTY) error("Out of file descriptors"); } else { close(fd); } if (fd == 0) fd0_redirected++; openredirect(n, memory); } if (memory[1]) out1 = &memout; if (memory[2]) out2 = &memout; } STATIC void openredirect(redir, memory) union node *redir; char memory[10]; { int fd = redir->nfile.fd; char *fname; int f; /* Assume redirection succeeds. */ exitstatus = 0; /* * We suppress interrupts so that we won't leave open file * descriptors around. This may not be such a good idea because * an open of a device or a fifo can block indefinitely. */ INTOFF; memory[fd] = 0; switch (redir->nfile.type) { case NFROM: fname = redir->nfile.expfname; if ((f = open(fname, O_RDONLY)) < 0) error("cannot open %s: %s", fname, errmsg(errno, E_OPEN)); movefd: if (f != fd) { copyfd(f, fd); close(f); } break; case NTO: fname = redir->nfile.expfname; #ifdef O_CREAT if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); #else if ((f = creat(fname, 0666)) < 0) error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); #endif goto movefd; case NAPPEND: fname = redir->nfile.expfname; #ifdef O_APPEND if ((f = open(fname, O_WRONLY|O_CREAT|O_APPEND, 0666)) < 0) error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); #else if ((f = open(fname, O_WRONLY)) < 0 && (f = creat(fname, 0666)) < 0) error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); lseek(f, 0L, 2); #endif goto movefd; case NTOFD: case NFROMFD: if (redir->ndup.dupfd >= 0) { /* if not ">&-" */ if (memory[redir->ndup.dupfd]) memory[fd] = 1; else copyfd(redir->ndup.dupfd, fd); } break; case NHERE: case NXHERE: f = openhere(redir); goto movefd; default: abort(); } INTON; } /* * Handle here documents. Normally we fork off a process to write the * data to a pipe. If the document is short, we can stuff the data in * the pipe without forking. */ STATIC int openhere(redir) union node *redir; { int pip[2]; int len; if (pipe(pip) < 0) error("Pipe call failed"); if (redir->type == NHERE) { len = strlen(redir->nhere.doc->narg.text); if (len <= PIPESIZE) { xwrite(pip[1], redir->nhere.doc->narg.text, len); goto out; } } if (forkshell((struct job *)NULL, (union node *)NULL, FORK_NOJOB) == 0) { close(pip[0]); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGHUP, SIG_IGN); #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif signal(SIGPIPE, SIG_DFL); if (redir->type == NHERE) xwrite(pip[1], redir->nhere.doc->narg.text, len); else expandhere(redir->nhere.doc, pip[1]); _exit(0); } out: close(pip[1]); return pip[0]; } /* * Undo the effects of the last redirection. */ void popredir() { register struct redirtab *rp = redirlist; int i; for (i = 0 ; i < 10 ; i++) { if (rp->renamed[i] != EMPTY) { if (i == 0) fd0_redirected--; close(i); if (rp->renamed[i] >= 0) { copyfd(rp->renamed[i], i); close(rp->renamed[i]); } } } INTOFF; redirlist = rp->next; ckfree(rp); INTON; } /* * Undo all redirections. Called on error or interrupt. */ #ifdef mkinit INCLUDE "redir.h" RESET { while (redirlist) popredir(); } SHELLPROC { clearredir(); } #endif /* * Discard all saved file descriptors. */ void clearredir() { register struct redirtab *rp; int i; for (rp = redirlist ; rp ; rp = rp->next) { for (i = 0 ; i < 10 ; i++) { if (rp->renamed[i] >= 0) { close(rp->renamed[i]); } rp->renamed[i] = EMPTY; } } } /* * Copy a file descriptor, like the F_DUPFD option of fcntl. Returns -1 * if the source file descriptor is closed, EMPTY if there are no unused * file descriptors left. */ int copyfd(from, to) { #ifdef F_DUPFD int newfd; newfd = fcntl(from, F_DUPFD, to); if (newfd < 0 && errno == EMFILE) return EMPTY; return newfd; #else char toclose[32]; int i; int newfd; int e; for (i = 0 ; i < to ; i++) toclose[i] = 0; INTOFF; while ((newfd = dup(from)) >= 0 && newfd < to) toclose[newfd] = 1; e = errno; for (i = 0 ; i < to ; i++) { if (toclose[i]) close(i); } INTON; if (newfd < 0 && e == EMF99ILE) return EMPTY; return newfd; #endif } /* Return true if fd 0 has already been redirected at least once. */ int fd0_redirected_p () { return fd0_redirected != 0; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)redir.h 5.1 (Berkeley) 3/7/91 */ /* flags passed to redirect */ #define REDIR_PUSH 01 /* save previous values of file descriptors */ #define REDIR_BACKQ 02 /* save the command output in memory */ #ifdef __STDC__ union node; void redirect(union node *, int); void popredir(void); void clearredir(void); int copyfd(int, int); int fd0_redirected_p(void); #else void redirect(); void popredir(); void clearredir(); int copyfd(); int fd0_redirected_p(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)shell.h 5.4 (Berkeley) 4/12/91 */ /* * The follow should be set to reflect the type of system you have: * JOBS -> 1 if you have Berkeley job control, 0 otherwise. * SYMLINKS -> 1 if your system includes symbolic links, 0 otherwise. * DIRENT -> 1 if your system has the SVR3 directory(3X) routines. * UDIR -> 1 if you want the shell to simulate the /u directory. * TILDE -> 1 if you want the shell to expand ~logname. * USEGETPW -> 1 if getpwnam() must be used to look up a name. * ATTY -> 1 to include code for atty(1). * SHORTNAMES -> 1 if your linker cannot handle long names. * READLINE -> 1 if line editing by readline() should be enabled. * define BSD if you are running 4.2 BSD or later. * define SYSV if you are running under System V. * define DEBUG=1 to compile in debugging (set global "debug" to turn on) * define DEBUG=2 to compile in and turn on debugging. * * When debugging is on, debugging info will be written to $HOME/trace and * a quit signal will generate a core dump. */ #define JOBS 0 #define SYMLINKS defined(S_ISLNK) #define DIRENT 1 #define UDIR 0 #define TILDE 1 #define USEGETPW 0 #define ATTY 0 #define READLINE 1 #define HASHBANG 0 /* #define BSD */ #define POSIX 1 #define DEBUG 0 #ifdef __STDC__ typedef void *pointer; #ifndef NULL #define NULL (void *)0 #endif #else /* not __STDC__ */ typedef char *pointer; #ifndef NULL #define NULL 0 #endif #endif /* not __STDC__ */ #define STATIC /* empty */ #define MKINIT /* empty */ #include extern char nullstr[1]; /* null string */ #if DEBUG #define TRACE(param) trace param #else #define TRACE(param) #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)show.c 5.2 (Berkeley) 4/12/91"; #endif /* not lint */ #include #include #include "shell.h" #include "parser.h" #include "nodes.h" #include "mystring.h" #if DEBUG static shtree(), shcmd(), sharg(), indent(); showtree(n) union node *n; { trputs("showtree called\n"); shtree(n, 1, NULL, stdout); } static shtree(n, ind, pfx, fp) union node *n; char *pfx; FILE *fp; { struct nodelist *lp; char *s; indent(ind, pfx, fp); switch(n->type) { case NSEMI: s = "; "; goto binop; case NAND: s = " && "; goto binop; case NOR: s = " || "; binop: shtree(n->nbinary.ch1, ind, NULL, fp); /* if (ind < 0) */ fputs(s, fp); shtree(n->nbinary.ch2, ind, NULL, fp); break; case NCMD: shcmd(n, fp); if (ind >= 0) putc('\n', fp); break; case NPIPE: for (lp = n->npipe.cmdlist ; lp ; lp = lp->next) { shcmd(lp->n, fp); if (lp->next) fputs(" | ", fp); } if (n->npipe.backgnd) fputs(" &", fp); if (ind >= 0) putc('\n', fp); break; default: fprintf(fp, "", n->type); if (ind >= 0) putc('\n', fp); break; } } static shcmd(cmd, fp) union node *cmd; FILE *fp; { union node *np; int first; char *s; int dftfd; first = 1; for (np = cmd->ncmd.args ; np ; np = np->narg.next) { if (! first) putchar(' '); sharg(np, fp); first = 0; } for (np = cmd->ncmd.redirect ; np ; np = np->nfile.next) { if (! first) putchar(' '); switch (np->nfile.type) { case NTO: s = ">"; dftfd = 1; break; case NAPPEND: s = ">>"; dftfd = 1; break; case NTOFD: s = ">&"; dftfd = 1; break; case NFROM: s = "<"; dftfd = 0; break; case NFROMFD: s = "<&"; dftfd = 0; break; } if (np->nfile.fd != dftfd) fprintf(fp, "%d", np->nfile.fd); fputs(s, fp); if (np->nfile.type == NTOFD || np->nfile.type == NFROMFD) { fprintf(fp, "%d", np->ndup.dupfd); } else { sharg(np->nfile.fname, fp); } first = 0; } } static sharg(arg, fp) union node *arg; FILE *fp; { char *p; struct nodelist *bqlist; int subtype; if (arg->type != NARG) { printf("\n", arg->type); fflush(stdout); abort(); } bqlist = arg->narg.backquote; for (p = arg->narg.text ; *p ; p++) { switch (*p) { case CTLESC: putc(*++p, fp); break; case CTLVAR: putc('$', fp); putc('{', fp); subtype = *++p; while (*p != '=') putc(*p++, fp); if (subtype & VSNUL) putc(':', fp); switch (subtype & VSTYPE) { case VSNORMAL: putc('}', fp); break; case VSMINUS: putc('-', fp); break; case VSPLUS: putc('+', fp); break; case VSQUESTION: putc('?', fp); break; case VSASSIGN: putc('=', fp); break; default: printf("", subtype); } break; case CTLENDVAR: putc('}', fp); break; case CTLBACKQ: case CTLBACKQ|CTLQUOTE: putc('$', fp); putc('(', fp); shtree(bqlist->n, -1, NULL, fp); putc(')', fp); break; default: putc(*p, fp); break; } } } static indent(amount, pfx, fp) char *pfx; FILE *fp; { int i; for (i = 0 ; i < amount ; i++) { if (pfx && i == amount - 1) fputs(pfx, fp); putc('\t', fp); } } #endif /* * Debugging stuff. */ FILE *tracefile; #if DEBUG == 2 int debug = 1; #else int debug = 0; #endif trputc(c) { #if DEBUG if (tracefile == NULL) return; putc(c, tracefile); if (c == '\n') fflush(tracefile); #endif } trace(fmt, a1, a2, a3, a4, a5, a6, a7, a8) char *fmt; { #if DEBUG int e = errno; if (tracefile == NULL) return; fprintf(tracefile, fmt, a1, a2, a3, a4, a5, a6, a7, a8); if (strchr(fmt, '\n')) fflush(tracefile); errno = e; #endif } trputs(s) char *s; { #if DEBUG if (tracefile == NULL) return; fputs(s, tracefile); if (strchr(s, '\n')) fflush(tracefile); #endif } trstring(s) char *s; { register char *p; char c; #if DEBUG if (tracefile == NULL) return; putc('"', tracefile); for (p = s ; *p ; p++) { switch (*p) { case '\n': c = 'n'; goto backslash; case '\t': c = 't'; goto backslash; case '\r': c = 'r'; goto backslash; case '"': c = '"'; goto backslash; case '\\': c = '\\'; goto backslash; case CTLESC: c = 'e'; goto backslash; case CTLVAR: c = 'v'; goto backslash; case CTLVAR+CTLQUOTE: c = 'V'; goto backslash; case CTLBACKQ: c = 'q'; goto backslash; case CTLBACKQ+CTLQUOTE: c = 'Q'; goto backslash; backslash: putc('\\', tracefile); putc(c, tracefile); break; default: if (*p >= ' ' && *p <= '~') putc(*p, tracefile); else { putc('\\', tracefile); putc(*p >> 6 & 03, tracefile); putc(*p >> 3 & 07, tracefile); putc(*p & 07, tracefile); } break; } } putc('"', tracefile); #endif } trargs(ap) char **ap; { #if DEBUG if (tracefile == NULL) return; while (*ap) { trstring(*ap++); if (*ap) putc(' ', tracefile); else putc('\n', tracefile); } fflush(tracefile); #endif } opentrace() { char s[100]; char *p; char *getenv(); int flags; #if DEBUG if (!debug) return; if ((p = getenv("HOME")) == NULL) { if (getuid() == 0) p = "/"; else p = "/tmp"; } scopy(p, s); strcat(s, "/trace"); if ((tracefile = fopen(s, "a")) == NULL) { fprintf(stderr, "Can't open %s\n", s); return; } #ifdef O_APPEND if ((flags = fcntl(fileno(tracefile), F_GETFL, 0)) >= 0) fcntl(fileno(tracefile), F_SETFL, flags | O_APPEND); #endif fputs("\nTracing started.\n", tracefile); fflush(tracefile); #endif } 9.t..cdefs.h/* Replacement for something BSD has in sys/cdefs.h. */ #ifndef _ASH_SYS_CDEFS #define _ASH_SYS_CDEFS #if __STDC__ #define __P(params) params #else #define __P(params) () #endif /* Probably in sys/types.h. */ typedef void (*sig_t) __P(( int )); #endif /* _ASH_SYS_CDEFS */ .t..malloc.c /**********************************************************/ /* /* This was file READ_ME /* /**********************************************************/ /* PROGRAM malloc(), free(), realloc() AUTHOR Dick Grune, Free University, Amsterdam Modified by Ceriel Jacobs, Free University, Amsterdam, to make it faster VERSION $Header: READ_ME,v 1.1 91/12/19 14:45:04 philip Exp $ DESCRIPTION This is an independent rewrite of the malloc/free package; it is fast and efficient. Free blocks are kept in doubly linked lists, list N holding blocks with sizes between 2**N and 2**(N+1)-1. Consequently neither malloc nor free have to do any searching: the cost of a call of malloc() (or free()) is constant, however many blocks you have got. If you switch on the NON_STANDARD macro (see param.h) every block costs 2 pointers overhead (otherwise it's 4). */ /* There is an organisational problem here: during devellopment I want the package divided into modules, which implies external names for the communication. The only external names I want in the finished product are malloc, realloc and free. This requires some hanky-panky. */ /**********************************************************/ /* /* This was file size_type.h /* /**********************************************************/ #if _EM_WSIZE == _EM_PSIZE typedef unsigned int size_type; #elif _EM_LSIZE == _EM_PSIZE typedef unsigned long size_type; #else #error funny pointer size #endif #include #include /**********************************************************/ /* /* This was file param.h /* /**********************************************************/ /* $Header: param.h,v 1.1 91/12/19 14:45:25 philip Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ # undef NON_STANDARD /* If defined, the contents of a block will NOT be left undisturbed after it is freed, as opposed to what it says in the manual (malloc(2)). Setting this option reduces the memory overhead considerably. I personally consider the specified behaviour an artefact of the original implementation. */ # define ASSERT /* If defined, some inexpensive tests will be made to ensure the correctness of some sensitive data. It often turns an uncontrolled crash into a controlled one. */ # define CHECK /* If defined, extensive and expensive tests will be done, inculding a checksum on the mallinks (chunk information blocks). The resulting information will be printed on a file called mal.out . Additionally a function maldump(n) int n; will be defined, which will dump pertinent info in pseudo-readable form; it aborts afterwards if n != 0. */ # undef EXTERN /* If defined, all static names will become extern, which is a help in using adb(1) or prof(1) */ # define STORE /* If defined, separate free lists will be kept of chunks with small sizes, to speed things up a little. */ # undef SYSTEM /* If defined, the system module is used. Otherwise, "sbrk" is called directly. */ #define ALIGNMENT 8 /* alignment common to all types */ #define LOG_MIN_SIZE 3 #define LOG_MAX_SIZE 24 /**********************************************************/ /* /* This was file impl.h /* /**********************************************************/ /* $Header: impl.h,v 1.1 91/12/19 14:45:16 philip Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* This file essentially describes how the mallink info block is implemented. */ #define MIN_SIZE (1< #include /* Malloc space is traversed by N doubly-linked lists of chunks, each containing a couple of house-keeping data addressed as a 'mallink' and a piece of useful space, called the block. The N lists are accessed through their starting pointers in free_list[]. Free_list[n] points to a list of chunks between 2**(n+LOG_MIN_SIZE) and 2**(n+LOG_MIN_SIZE+1)-1, which means that the smallest chunk is 2**LOG_MIN_SIZE (== MIN_SIZE). */ #ifdef SYSTEM #include #define SBRK sys_break #else #define SBRK _sbrk #define ILL_BREAK (void *)(-1) /* funny failure value */ #endif extern void *SBRK(int incr); #ifdef STORE #define MAX_STORE 32 private do_free(mallink *ml), sell_out(void); privatedata mallink *store[MAX_STORE]; #endif /* STORE */ void *privious_free= (void *)-1; void * malloc(register size_t n) {check_mallinks("malloc entry");{ register mallink *ml; register int min_class; void *tmp; { static int reent= 0; if (!reent) { reent++; printf("malloc\n"); reent--; } } privious_free= (void *)-1; if (n == 0) { return NULL; } if (n < MIN_SIZE) n = align(MIN_SIZE); else n = align(n); #ifdef STORE if (n <= MAX_STORE*MIN_SIZE) { /* look in the store first */ register mallink **stp = &store[(n >> LOG_MIN_SIZE) - 1]; if (ml = *stp) { *stp = log_next_of(ml); set_store(ml, 0); check_mallinks("malloc fast exit"); assert(! in_store(ml)); tmp= block_of_mallink(ml); { static int reent= 0; if (!reent) { reent++; printf("= 0x%x\n", tmp);reent--; } } return tmp; } } #endif /* STORE */ check_work_empty("malloc, entry"); /* Acquire a chunk of at least size n if at all possible; Try everything. */ { /* Inline substitution of "smallest". */ register size_t n1 = n; assert(n1 < (1L << LOG_MAX_SIZE)); min_class = 0; do { n1 >>= 1; min_class++; } while (n1 >= MIN_SIZE); } if (min_class >= MAX_FLIST) return NULL; /* we don't deal in blocks that big */ ml = first_present(min_class); if (ml == MAL_NULL) { /* Try and extend */ register void *p; #define GRABSIZE 4096 /* Power of 2 */ register size_t req = ((MIN_SIZE<= 0) p = SBRK((int)req); } if (p == ILL_BREAK) { /* Now this is bad. The system will not give us more memory. We can only liquidate our store and hope it helps. */ #ifdef STORE sell_out(); ml = first_present(min_class); if (ml == MAL_NULL) { #endif /* STORE */ /* In this emergency we try to locate a suitable chunk in the free_list just below the safe one; some of these chunks may fit the job. */ ml = search_free_list(min_class - 1, n); if (!ml) /* really out of space */ return NULL; started_working_on(ml); unlink_free_chunk(ml); check_mallinks("suitable_chunk, forced"); #ifdef STORE } else started_working_on(ml); #endif /* STORE */ } else { assert((size_type)p == align((size_type)p)); ml = create_chunk(p, req); } check_mallinks("suitable_chunk, extended"); } else started_working_on(ml); /* we have a chunk */ set_free(ml, 0); calc_checksum(ml); check_mallinks("suitable_chunk, removed"); n += mallink_size(); if (n + MIN_SIZE <= size_of(ml)) { truncate(ml, n); } stopped_working_on(ml); check_mallinks("malloc exit"); check_work_empty("malloc exit"); #ifdef STORE assert(! in_store(ml)); #endif tmp= block_of_mallink(ml); { static int reent= 0; if (!reent) { reent++; printf("= 0x%x\n", tmp);reent--; } } return tmp; }} void free(void *addr) {check_mallinks("free entry");{ register mallink *ml; printf("free 0x%x\n", addr); if (privious_free == addr) { fflush(stdout); fflush(stderr); abort(); } privious_free= addr; if (addr == NULL) { check_mallinks("free(0) very fast exit"); return; } ml = mallink_of_block(addr); #ifdef STORE if (free_of(ml) || in_store(ml)) return; /* user frees free block */ if (size_of(ml) <= MAX_STORE*MIN_SIZE) { /* return to store */ mallink **stp = &store[(size_of(ml) >> LOG_MIN_SIZE) - 1]; set_log_next(ml, *stp); *stp = ml; set_store(ml, 1); calc_checksum(ml); check_mallinks("free fast exit"); } else { do_free(ml); check_mallinks("free exit"); } }} private do_free(register mallink *ml) {{ #endif #ifndef STORE if (free_of(ml)) return; #endif /* STORE */ started_working_on(ml); set_free(ml, 1); calc_checksum(ml); if (! last_mallink(ml)) { register mallink *next = phys_next_of(ml); if (free_of(next)) coalesce_forw(ml, next); } if (! first_mallink(ml)) { register mallink *prev = phys_prev_of(ml); if (free_of(prev)) { coalesce_backw(ml, prev); ml = prev; } } link_free_chunk(ml); stopped_working_on(ml); check_work_empty("free"); /* Compile-time checks on param.h */ switch (0) { case MIN_SIZE < OFF_SET * sizeof(mallink): break; case 1: break; /* If this statement does not compile due to duplicate case entry, the minimum size block cannot hold the links for the free blocks. Either raise LOG_MIN_SIZE or switch off NON_STANDARD. */ } switch(0) { case sizeof(void *) != sizeof(size_type): break; case 1: break; /* If this statement does not compile due to duplicate case entry, size_type is not defined correctly. Redefine and compile again. */ } }} void * realloc(void *addr, register size_t n) {check_mallinks("realloc entry");{ register mallink *ml, *ph_next; register size_type size; printf("realloc 0x%x, %d\n", addr, n); if (addr == NULL) { /* Behave like most Unix realloc's when handed a null-pointer */ return malloc(n); } if (n == 0) { free(addr); return NULL; } ml = mallink_of_block(addr); if (n < MIN_SIZE) n = align(MIN_SIZE); else n = align(n); #ifdef STORE if (in_store(ml)) { register mallink *stp = store[(size_of(ml) >> LOG_MIN_SIZE) - 1]; mallink *stp1 = NULL; while (ml != stp) { stp1 = stp; stp = log_next_of(stp); } stp = log_next_of(stp); if (! stp1) store[(size_of(ml) >> LOG_MIN_SIZE) - 1] = stp; else set_log_next(stp1, stp); set_store(ml, 0); calc_checksum(ml); } #endif if (free_of(ml)) { unlink_free_chunk(ml); set_free(ml, 0); /* user reallocs free block */ } started_working_on(ml); size = size_of(ml); if ( /* we can simplify the problem by adding the next chunk: */ n > size && !last_mallink(ml) && (ph_next = phys_next_of(ml), free_of(ph_next)) && n <= size + mallink_size() + size_of(ph_next) ) { /* add in the physically next chunk */ unlink_free_chunk(ph_next); combine_chunks(ml, ph_next); size = size_of(ml); check_mallinks("realloc, combining"); } if (n > size) { /* this didn't help */ void *new; register char *l1, *l2 = addr; stopped_working_on(ml); if (!(new = l1 = malloc(n))) return NULL; /* no way */ while (size--) *l1++ = *l2++; free(addr); check_work_empty("mv_realloc"); #ifdef STORE assert(! in_store(mallink_of_block(new))); #endif return new; } /* it helped, but maybe too well */ n += mallink_size(); if (n + MIN_SIZE <= size_of(ml)) { truncate(ml, n); } stopped_working_on(ml); check_mallinks("realloc exit"); check_work_empty("realloc"); #ifdef STORE assert(! in_store(ml)); #endif return addr; }} void * calloc(size_t nmemb, size_t size) {check_mallinks("calloc entry");{ long *l1, *l2; size_t n; printf("calloc\n"); if (size == 0) return NULL; if (nmemb == 0) return NULL; /* Check for overflow on the multiplication. The peephole-optimizer * will eliminate all but one of the possibilities. */ if (sizeof(size_t) == sizeof(int)) { if (UINT_MAX / size < nmemb) return NULL; } else if (sizeof(size_t) == sizeof(long)) { if (ULONG_MAX / size < nmemb) return NULL; } else return NULL; /* can't happen, can it ? */ n = size * nmemb; if (n < MIN_SIZE) n = align(MIN_SIZE); else n = align(n); if (n >= (1L << LOG_MAX_SIZE)) return NULL; l1 = (long *) malloc(n); l2 = l1 + (n / sizeof(long)); /* n is at least long aligned */ while ( l2 != l1 ) *--l2 = 0; check_mallinks("calloc exit"); check_work_empty("calloc exit"); return (void *)l1; }} /* Auxiliary routines */ #ifdef STORE private sell_out(void) { /* Frees all block in store. */ register mallink **stp; for (stp = &store[0]; stp < &store[MAX_STORE]; stp++) { register mallink *ml = *stp; while (ml) { *stp = log_next_of(ml); set_store(ml, 0); do_free(ml); ml = *stp; } } } #endif /* STORE */ #ifdef ASSERT private m_assert(const char *fn, int ln) { char ch; while (*fn) write(2, fn++, 1); write(2, ": malloc assert failed in line ", 31); ch = (ln / 100) + '0'; write(2, &ch, 1); ln %= 100; ch = (ln / 10) + '0'; write(2, &ch, 1); ln %= 10; ch = (ln / 1) + '0'; write(2, &ch, 1); write(2, "\n", 1); maldump(1); } #endif /* ASSERT */ /**********************************************************/ /* /* This was file log.c /* /**********************************************************/ /* $Header: log.c,v 1.1 91/12/19 14:45:18 philip Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* Logical manipulations. The chunks are properly chained in the physical chain. */ privatedata mallink *free_list[MAX_FLIST]; private link_free_chunk(register mallink *ml) { /* The free chunk ml is inserted in its proper logical chain. */ register mallink **mlp = &free_list[-1]; register size_type n = size_of(ml); register mallink *ml1; assert(n < (1L << LOG_MAX_SIZE)); do { n >>= 1; mlp++; } while (n >= MIN_SIZE); ml1 = *mlp; set_log_prev(ml, MAL_NULL); set_log_next(ml, ml1); calc_checksum(ml); if (ml1) { /* link backwards */ set_log_prev(ml1, ml); calc_checksum(ml1); } *mlp = ml; } private unlink_free_chunk(register mallink *ml) { /* Unlinks a free chunk from (the middle of) the logical chain. */ register mallink *next = log_next_of(ml); register mallink *prev = log_prev_of(ml); if (!prev) { /* it is the first in the chain */ register mallink **mlp = &free_list[-1]; register size_type n = size_of(ml); assert(n < (1L << LOG_MAX_SIZE)); do { n >>= 1; mlp++; } while (n >= MIN_SIZE); *mlp = next; } else { set_log_next(prev, next); calc_checksum(prev); } if (next) { set_log_prev(next, prev); calc_checksum(next); } } private mallink * search_free_list(int class, size_t n) { /* Searches the free_list[class] for a chunk of at least size n; since it is searching a slightly undersized list, such a block may not be there. */ register mallink *ml; for (ml = free_list[class]; ml; ml = log_next_of(ml)) if (size_of(ml) >= n) return ml; return MAL_NULL; /* nothing found */ } private mallink * first_present(int class) { /* Find the index i in free_list[] such that: i >= class && free_list[i] != MAL_NULL. Return MAL_NULL if no such i exists; Otherwise, return the first block of this list, after unlinking it. */ register mallink **mlp, *ml; for (mlp = &free_list[class]; mlp < &free_list[MAX_FLIST]; mlp++) { if ((ml = *mlp) != MAL_NULL) { *mlp = log_next_of(ml); /* may be MAL_NULL */ if (*mlp) { /* unhook backward link */ set_log_prev(*mlp, MAL_NULL); calc_checksum(*mlp); } return ml; } } return MAL_NULL; } #ifdef CHECK private mallink * free_list_entry(int i) { /* To allow maldump.c access to log.c's private data. */ return free_list[i]; } #endif /* CHECK */ /**********************************************************/ /* /* This was file phys.c /* /**********************************************************/ /* $Header: phys.c,v 1.1 91/12/19 14:45:28 philip Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include /* Physical manipulations. The blocks concerned are not in any logical chain. */ private mallink * create_chunk(void *p, size_t n) { /* The newly acquired piece of memory at p, of length n, is turned into a free chunk, properly chained in the physical chain. The address of the chunk is returned. */ register mallink *ml; /* All of malloc memory is followed by a virtual chunk, the mallink of which starts mallink_size() bytes past the last byte in memory. Its use is prevented by testing for ml == ml_last first. */ register mallink *last = ml_last; assert(!last || p == (char *)phys_next_of(last) - mallink_size()); ml = (mallink *)((char *)p + mallink_size()); /* bump ml */ new_mallink(ml); started_working_on(ml); set_free(ml, 1); set_phys_prev(ml, last); ml_last = ml; set_phys_next(ml, (mallink *)((char *)ml + n)); calc_checksum(ml); assert(size_of(ml) + mallink_size() == n); if (last && free_of(last)) { coalesce_backw(ml, last); ml = last; } check_mallinks("create_chunk, phys. linked"); return ml; } private truncate(register mallink *ml, size_t size) { /* The chunk ml is truncated. The chunk at ml is split in two. The remaining part is then freed. */ register mallink *new = (mallink *)((char *)ml + size); register mallink *ph_next = phys_next_of(ml); new_mallink(new); set_free(new, 1); set_phys_prev(new, ml); set_phys_next(new, ph_next); calc_checksum(new); if (! last_mallink(ml)) { set_phys_prev(ph_next, new); calc_checksum(ph_next); if (free_of(ph_next)) coalesce_forw(new, ph_next); } else ml_last = new; set_phys_next(ml, new); calc_checksum(ml); started_working_on(new); link_free_chunk(new); stopped_working_on(new); check_mallinks("truncate"); } private combine_chunks(register mallink *ml1, register mallink *ml2) { /* The chunks ml1 and ml2 are combined. */ register mallink *ml3 = phys_next_of(ml2); set_phys_next(ml1, ml3); calc_checksum(ml1); if (!last_mallink(ml2)) { set_phys_prev(ml3, ml1); calc_checksum(ml3); } if (ml_last == ml2) ml_last = ml1; } /**********************************************************/ /* /* This was file check.c /* /**********************************************************/ /* $Header: check.c,v 1.1 91/12/19 14:45:09 philip Exp $ */ /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ #include #ifdef CHECK /* otherwise this whole file is skipped */ /* ??? check these later */ private acquire_malout(void), check_ml_last(const char *s); private dump_all_mallinks(void), dump_free_list(int i); private dump_mallink(const char *s, mallink *ml), print_loop(mallink *ml); private working_on(mallink *ml); private size_type checksum(mallink *ml); static FILE *malout; private mallink *free_list_entry(int i); #define for_free_list(i,p) \ for (p = free_list_entry(i); p; p = log_next_of(p)) #define for_all_mallinks(ml) /* backwards! */ \ for (ml = ml_last; ml; \ ml = first_mallink(ml) ? MAL_NULL : phys_prev_of(ml)) /* Maldump */ static int pr_cnt = 0; maldump(int n) { /* Dump pertinent info in pseudo-readable format; abort afterwards if n != 0. */ static int dumping = 0; int i; if (dumping) return; dumping++; acquire_malout(); fprintf(malout, ">>>>>>>>>>>>>>>> DUMP OF ALL MALLINKS <<<<<<<<<<<<<<<<"); fprintf(malout, " ml_last = %p\n", ml_last); if (++pr_cnt == 100) pr_cnt = 0; dump_all_mallinks(); fprintf(malout, ">>>>>>>>>>>>>>>> DUMP OF FREE_LISTS <<<<<<<<<<<<<<<<\n"); if (++pr_cnt == 100) pr_cnt = 0; for (i = 0; i < MAX_FLIST; i++) dump_free_list(i); fprintf(malout, ">>>>>>>>>>>>>>>> END OF DUMP <<<<<<<<<<<<<<<<\n"); fclose(malout); dumping--; if (n) abort(); } private acquire_malout(void) { static char buf[BUFSIZ]; if (!malout) { malout = freopen("mal.out", "w", stderr); setbuf(malout, buf); } } private dump_all_mallinks(void) { mallink *ml; for_all_mallinks (ml) { if (print_loop(ml)) return; dump_mallink((char *)0, ml); } } private dump_free_list(int i) { mallink *ml = free_list_entry(i); if (!ml) return; fprintf(malout, "%2d: ", i); for_free_list(i, ml) { if (print_loop(ml)) return; fprintf(malout, "%p ", ml); } fprintf(malout, "<\n"); } private int print_loop(mallink *ml) { if (print_of(ml) == pr_cnt) { fprintf(malout, "... PRINT LOOP\n"); return 1; } set_print(ml, pr_cnt); return 0; } private dump_mallink(const char *s, mallink *ml) { acquire_malout(); if (s) fprintf(malout, "%s: ", s); fprintf(malout, "@: %p;", ml); if (ml && checksum_of(ml) != checksum(ml)) fprintf(malout, ">>>> CORRUPTED <<<<"); if (!ml) { fprintf(malout, "\n"); return; } if (free_of(ml)) { fprintf(malout, " l_p: %p;", _log_prev_of(ml)); fprintf(malout, " l_n: %p;", _log_next_of(ml)); } fprintf(malout, " p_s: %p;", prev_size_of(ml)); fprintf(malout, " t_s: %p;", _this_size_of(ml)); fprintf(malout, " sz: %lu;", (unsigned long) size_of(ml)); fprintf(malout, " fr: %d;", free_of(ml)); fprintf(malout, "\n"); } /* Check_mallinks() checks the total data structure as accessible through free_list[] and ml_last. All check_sums should be OK, except those held in the small array off_colour. This is a trick to allow to continue checking even when a few mallinks are temporarily out of order. Check_mallinks() tests for a lot of internal consistency. */ /* Some arbitrary constants */ #define IN_ML_LAST 93 #define IN_FREE_LIST 57 /* and in ml_last */ #define CLEAR 21 #define VRIJ 1 #define BEZET 2 private check_mallinks(const char *s) { mallink *ml; size_type size; int i; char stat; check_ml_last(s); stat = BEZET; for_all_mallinks(ml) { if (checksum_of(ml) != checksum(ml)) Error("mallink info at %p corrupted", s, ml); if (working_on(ml)) { stat = BEZET; continue; } if ( !last_mallink(ml) && phys_prev_of(phys_next_of(ml)) != ml ) Error("upward chain bad at %p", s, ml); if ( !first_mallink(ml) && phys_next_of(phys_prev_of(ml)) != ml ) Error("downward chain bad at %p", s, ml); if (free_of(ml)) { if (stat == VRIJ) Error("free mallink at %p follows free mallink", s, ml); stat = VRIJ; } else stat = BEZET; set_mark(ml, IN_ML_LAST); } for (i = 0, size = MIN_SIZE; i < MAX_FLIST; i++, size *= 2) { for_free_list(i, ml) { if (working_on(ml)) continue; if (!free_of(ml)) Error("occupied mallink %p occurs in free_list", s, ml); switch (mark_of(ml)) { case IN_ML_LAST: set_mark(ml, IN_FREE_LIST); break; case IN_FREE_LIST: Error("mallink %p occurs in 2 free_lists", s, ml); default: Error("unknown mallink %p in free_list", s, ml); } if (size_of(ml) < size) Error("size of mallink %p too small", s, ml); if (size_of(ml) >= 2*size) Error("size of mallink %p too large", s, ml); } } for_all_mallinks (ml) { if (working_on(ml)) continue; if (free_of(ml) && mark_of(ml) != IN_FREE_LIST) Error("free mallink %p is in no free_list", s, ml); set_mark(ml, CLEAR); } } private check_ml_last(const char *s) { if (ml_last && _this_size_of(ml_last) == 0) Error("size of ml_last == 0, at %p", s, ml_last); } private size_type checksum(mallink *ml) { size_type sum = 0; if (free_of(ml)) { sum += (size_type)_log_prev_of(ml); sum += (size_type)_log_next_of(ml); } sum += (size_type)prev_size_of(ml); sum += (size_type)_this_size_of(ml); return sum; } private calc_checksum(mallink *ml) { set_checksum(ml, checksum(ml)); } #define N_COLOUR 10 static mallink *off_colour[N_COLOUR]; private started_working_on(mallink *ml) { int i; for (i = 0; i < N_COLOUR; i++) if (off_colour[i] == MAL_NULL) { off_colour[i] = ml; return; } Error("out of off_colour array at %p", "started_working_on", ml); } private stopped_working_on(mallink *ml) { int i; for (i = 0; i < N_COLOUR; i++) if (off_colour[i] == ml) { off_colour[i] = MAL_NULL; return; } Error("stopped working on mallink %p", "stopped_working_on", ml); } private int working_on(mallink *ml) { int i; for (i = 0; i < N_COLOUR; i++) if (off_colour[i] == ml) return 1; return 0; } private check_work_empty(const char *s) { int i; int cnt = 0; for (i = 0; i < N_COLOUR; i++) if (off_colour[i] != MAL_NULL) cnt++; if (cnt != 0) Error("off_colour not empty", s, MAL_NULL); } private int Error(const char *fmt, const char *s, mallink *ml) { static int already_called = 0; if (already_called++) return 0; setbuf(stdout, (char *) 0); printf("%s: ", s); printf(fmt, (long)ml); printf("\n"); acquire_malout(); fprintf(malout, "%s: ", s); fprintf(malout, fmt, (long)ml); fprintf(malout, "\n"); fflush(stdout); maldump(1); return 0; /* to satisfy lint */ } #endif /* CHECK */ /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)trap.c 5.2 (Berkeley) 4/12/91"; #endif /* not lint */ #include "shell.h" #include "main.h" #include "nodes.h" /* for other headers */ #include "eval.h" #include "jobs.h" #include "options.h" #include "syntax.h" #include "signames.h" #include "output.h" #include "memalloc.h" #include "error.h" #include "trap.h" #include "mystring.h" #include #include /* * Sigmode records the current value of the signal handlers for the various * modes. A value of zero means that the current handler is not known. * S_HARD_IGN indicates that the signal was ignored on entry to the shell, */ #define S_DFL 1 /* default signal handling (SIG_DFL) */ #define S_CATCH 2 /* signal is caught */ #define S_IGN 3 /* signal is ignored (SIG_IGN) */ #define S_HARD_IGN 4 /* signal is ignored permenantly */ extern char nullstr[1]; /* null string */ char *trap[MAXSIG+1]; /* trap handler commands */ MKINIT char sigmode[MAXSIG]; /* current value of signal */ char gotsig[MAXSIG]; /* indicates specified signal received */ int pendingsigs; /* indicates some signal received */ /* * The trap builtin. */ trapcmd(argc, argv) char **argv; { char *action; char **ap; int signo; if (argc <= 1) { for (signo = 0 ; signo <= MAXSIG ; signo++) { if (trap[signo] != NULL) out1fmt("%d: %s\n", signo, trap[signo]); } return 0; } ap = argv + 1; if (is_number(*ap)) action = NULL; else action = *ap++; while (*ap) { if ((signo = number(*ap)) < 0 || signo > MAXSIG) error("%s: bad trap", *ap); INTOFF; if (action) action = savestr(action); if (trap[signo]) ckfree(trap[signo]); trap[signo] = action; if (signo != 0) setsignal(signo); INTON; ap++; } return 0; } /* * Clear traps on a fork. */ void clear_traps() { char **tp; for (tp = trap ; tp <= &trap[MAXSIG] ; tp++) { if (*tp && **tp) { /* trap not NULL or SIG_IGN */ INTOFF; ckfree(*tp); *tp = NULL; if (tp != &trap[0]) setsignal(tp - trap); INTON; } } } /* * Set the signal handler for the specified signal. The routine figures * out what it should be set to. */ int setsignal(signo) { int action; sig_t sigact; char *t; extern void onsig(); if ((t = trap[signo]) == NULL) action = S_DFL; else if (*t != '\0') action = S_CATCH; else action = S_IGN; if (rootshell && action == S_DFL) { switch (signo) { case SIGINT: if (iflag) action = S_CATCH; break; case SIGQUIT: #if DEBUG { extern int debug; if (debug) break; } #endif /* FALLTHROUGH */ case SIGTERM: if (iflag) action = S_IGN; break; #if JOBS case SIGTSTP: case SIGTTOU: if (jflag) action = S_IGN; break; #endif } } t = &sigmode[signo - 1]; if (*t == 0) { /* current setting unknown */ /* * There is a race condition here if action is not S_IGN. * A signal can be ignored that shouldn't be. */ if ((int)(sigact = signal(signo, SIG_IGN)) == -1) error("Signal system call failed"); if (sigact == SIG_IGN) { *t = S_HARD_IGN; } else { *t = S_IGN; } } if (*t == S_HARD_IGN || *t == action) return 0; switch (action) { case S_DFL: sigact = SIG_DFL; break; case S_CATCH: sigact = onsig; break; case S_IGN: sigact = SIG_IGN; break; } *t = action; return (int)signal(signo, sigact); } /* * Ignore a signal. */ void ignoresig(signo) { if (sigmode[signo - 1] != S_IGN && sigmode[signo - 1] != S_HARD_IGN) { signal(signo, SIG_IGN); } sigmode[signo - 1] = S_HARD_IGN; } #ifdef mkinit INCLUDE "signames.h" INCLUDE "trap.h" SHELLPROC { char *sm; clear_traps(); for (sm = sigmode ; sm < sigmode + MAXSIG ; sm++) { if (*sm == S_IGN) *sm = S_HARD_IGN; } } #endif /* * Signal handler. */ void onsig(signo) { signal(signo, onsig); if (signo == SIGINT && trap[SIGINT] == NULL) { onint(); return; } gotsig[signo - 1] = 1; pendingsigs++; } /* * Called to execute a trap. Perhaps we should avoid entering new trap * handlers while we are executing a trap handler. */ void dotrap() { int i; int savestatus; for (;;) { for (i = 1 ; ; i++) { if (gotsig[i - 1]) break; if (i >= MAXSIG) goto done; } gotsig[i - 1] = 0; savestatus=exitstatus; evalstring(trap[i]); exitstatus=savestatus; } done: pendingsigs = 0; } /* * Controls whether the shell is interactive or not. */ int is_interactive; void setinteractive(on) { if (on == is_interactive) return; setsignal(SIGINT); setsignal(SIGQUIT); setsignal(SIGTERM); is_interactive = on; } /* * Called to exit the shell. */ void exitshell(status) { struct jmploc loc1, loc2; char *p; TRACE(("exitshell(%d) pid=%d\n", status, getpid())); if (setjmp(loc1.loc)) goto l1; if (setjmp(loc2.loc)) goto l2; handler = &loc1; if ((p = trap[0]) != NULL && *p != '\0') { trap[0] = NULL; evalstring(p); } l1: handler = &loc2; /* probably unnecessary */ flushall(); #if JOBS setjobctl(0); #endif l2: _exit(status); } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)trap.h 5.1 (Berkeley) 3/7/91 */ extern int pendingsigs; #ifdef __STDC__ void clear_traps(void); int setsignal(int); void ignoresig(int); void dotrap(void); void setinteractive(int); void exitshell(int); #else void clear_traps(); int setsignal(); void ignoresig(); void dotrap(); void setinteractive(); void exitshell(); #endif /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static char sccsid[] = "@(#)var.c 5.3 (Berkeley) 4/12/91"; #endif /* not lint */ /* * Shell variables. */ #include "shell.h" #include "output.h" #include "expand.h" #include "nodes.h" /* for other headers */ #include "eval.h" /* defines cmdenviron */ #include "exec.h" #include "syntax.h" #include "options.h" #include "mail.h" #include "var.h" #include "memalloc.h" #include "error.h" #include "mystring.h" #define VTABSIZE 39 struct varinit { struct var *var; int flags; char *text; }; #if ATTY struct var vatty; #endif struct var vifs; struct var vmail; struct var vmpath; struct var vpath; struct var vps1; struct var vps2; struct var vpse; struct var vvers; #if ATTY struct var vterm; #endif const struct varinit varinit[] = { #if ATTY {&vatty, VSTRFIXED|VTEXTFIXED|VUNSET, "ATTY="}, #endif {&vifs, VSTRFIXED|VTEXTFIXED, "IFS= \t\n"}, {&vmail, VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL="}, {&vmpath, VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH="}, {&vpath, VSTRFIXED|VTEXTFIXED, "PATH=:/bin:/usr/bin"}, /* * vps1 depends on uid */ {&vps2, VSTRFIXED|VTEXTFIXED, "PS2=> "}, {&vpse, VSTRFIXED|VTEXTFIXED, "PSE=* "}, #if ATTY {&vterm, VSTRFIXED|VTEXTFIXED|VUNSET, "TERM="}, #endif {NULL, 0, NULL} }; struct var *vartab[VTABSIZE]; STATIC void unsetvar __P((char *)); STATIC struct var **hashvar __P((char *)); STATIC int varequal __P((char *, char *)); /* * Initialize the varable symbol tables and import the environment */ #ifdef mkinit INCLUDE "var.h" INIT { char **envp; extern char **environ; initvar(); for (envp = environ ; *envp ; envp++) { if (strchr(*envp, '=')) { setvareq(*envp, VEXPORT|VTEXTFIXED); } } } #endif /* * This routine initializes the builtin variables. It is called when the * shell is initialized and again when a shell procedure is spawned. */ void initvar() { const struct varinit *ip; struct var *vp; struct var **vpp; for (ip = varinit ; (vp = ip->var) != NULL ; ip++) { if ((vp->flags & VEXPORT) == 0) { vpp = hashvar(ip->text); vp->next = *vpp; *vpp = vp; vp->text = ip->text; vp->flags = ip->flags; } } /* * PS1 depends on uid */ if ((vps1.flags & VEXPORT) == 0) { vpp = hashvar("PS1="); vps1.next = *vpp; *vpp = &vps1; vps1.text = getuid() ? "PS1=$ " : "PS1=# "; vps1.flags = VSTRFIXED|VTEXTFIXED; } } /* * Set the value of a variable. The flags argument is ored with the * flags of the variable. If val is NULL, the variable is unset. */ void setvar(name, val, flags) char *name, *val; { char *p, *q; int len; int namelen; char *nameeq; int isbad; isbad = 0; p = name; if (! is_name(*p++)) isbad = 1; for (;;) { if (! is_in_name(*p)) { if (*p == '\0' || *p == '=') break; isbad = 1; } p++; } namelen = p - name; if (isbad) error("%.*s: is read only", namelen, name); len = namelen + 2; /* 2 is space for '=' and '\0' */ if (val == NULL) { flags |= VUNSET; } else { len += strlen(val); } p = nameeq = ckmalloc(len); q = name; while (--namelen >= 0) *p++ = *q++; *p++ = '='; *p = '\0'; if (val) scopy(val, p); setvareq(nameeq, flags); } /* * Same as setvar except that the variable and value are passed in * the first argument as name=value. Since the first argument will * be actually stored in the table, it should not be a string that * will go away. */ void setvareq(s, flags) char *s; { struct var *vp, **vpp; vpp = hashvar(s); for (vp = *vpp ; vp ; vp = vp->next) { if (varequal(s, vp->text)) { if (vp->flags & VREADONLY) { int len = strchr(s, '=') - s; error("%.*s: is read only", len, s); } INTOFF; if (vp == &vpath) changepath(s + 5); /* 5 = strlen("PATH=") */ if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) ckfree(vp->text); vp->flags &=~ (VTEXTFIXED|VSTACK|VUNSET); vp->flags |= flags; vp->text = s; if (vp == &vmpath || (vp == &vmail && ! mpathset())) chkmail(1); INTON; return; } } /* not found */ vp = ckmalloc(sizeof (*vp)); vp->flags = flags; vp->text = s; vp->next = *vpp; *vpp = vp; } /* * Process a linked list of variable assignments. */ void listsetvar(list) struct strlist *list; { struct strlist *lp; INTOFF; for (lp = list ; lp ; lp = lp->next) { setvareq(savestr(lp->text), 0); } INTON; } /* * Find the value of a variable. Returns NULL if not set. */ char * lookupvar(name) char *name; { struct var *v; for (v = *hashvar(name) ; v ; v = v->next) { if (varequal(v->text, name)) { if (v->flags & VUNSET) return NULL; return strchr(v->text, '=') + 1; } } return NULL; } /* * Search the environment of a builtin command. If the second argument * is nonzero, return the value of a variable even if it hasn't been * exported. */ char * bltinlookup(name, doall) char *name; { struct strlist *sp; struct var *v; for (sp = cmdenviron ; sp ; sp = sp->next) { if (varequal(sp->text, name)) return strchr(sp->text, '=') + 1; } for (v = *hashvar(name) ; v ; v = v->next) { if (varequal(v->text, name)) { if (v->flags & VUNSET || ! doall && (v->flags & VEXPORT) == 0) return NULL; return strchr(v->text, '=') + 1; } } return NULL; } /* * Generate a list of exported variables. This routine is used to construct * the third argument to execve when executing a program. */ char ** environment() { int nenv; struct var **vpp; struct var *vp; char **env, **ep; nenv = 0; for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { for (vp = *vpp ; vp ; vp = vp->next) if (vp->flags & VEXPORT) nenv++; } ep = env = stalloc((nenv + 1) * sizeof *env); for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { for (vp = *vpp ; vp ; vp = vp->next) if (vp->flags & VEXPORT) *ep++ = vp->text; } *ep = NULL; return env; } /* * Called when a shell procedure is invoked to clear out nonexported * variables. It is also necessary to reallocate variables of with * VSTACK set since these are currently allocated on the stack. */ #ifdef mkinit MKINIT void shprocvar(); SHELLPROC { shprocvar(); } #endif void shprocvar() { struct var **vpp; struct var *vp, **prev; for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { for (prev = vpp ; (vp = *prev) != NULL ; ) { if ::: :!:":((vp->flags & VEXPORT) == 0) { *prev = vp->next; if ((vp->flags & VTEXTFIXED) == 0) ckfree(vp->text); if ((vp->flags & VSTRFIXED) == 0) ckfree(vp); } else { if (vp->flags & VSTACK) { vp->text = savestr(vp->text); vp->flags &=~ VSTACK; } prev = &vp->next; } } } initvar(); } /* * Command to list all variables which are set. Currently this command * is invoked from the set command when the set command is called without * any variables. */ int showvarscmd(argc, argv) char **argv; { struct var **vpp; struct var *vp; for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { for (vp = *vpp ; vp ; vp = vp->next) { if ((vp->flags & VUNSET) == 0) out1fmt("%s\n", vp->text); } } return 0; } /* * The export and readonly commands. */ int exportcmd(argc, argv) char **argv; { struct var **vpp; struct var *vp; char *name; char *p; int flag = argv[0][0] == 'r'? VREADONLY : VEXPORT; listsetvar(cmdenviron); if (argc > 1) { while ((name = *argptr++) != NULL) { if ((p = strchr(name, '=')) != NULL) { p++; } else { vpp = hashvar(name); for (vp = *vpp ; vp ; vp = vp->next) { if (varequal(vp->text, name)) { vp->flags |= flag; goto found; } } } setvar(name, p, flag); found:; } } else { for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) { for (vp = *vpp ; vp ; vp = vp->next) { if (vp->flags & flag) { for (p = vp->text ; *p != '=' ; p++) out1c(*p); out1c('\n'); } } } } return 0; } /* * The "local" command. */ localcmd(argc, argv) char **argv; { char *name; if (! in_function()) error("Not in a function"); while ((name = *argptr++) != NULL) { mklocal(name); } return 0; } /* * Make a variable a local variable. When a variable is made local, it's * value and flags are saved in a localvar structure. The saved values * will be restored when the shell function returns. We handle the name * "-" as a special case. */ void mklocal(name) char *name; { struct localvar *lvp; struct var **vpp; struct var *vp; INTOFF; lvp = ckmalloc(sizeof (struct localvar)); if (name[0] == '-' && name[1] == '\0') { lvp->text = ckmalloc(sizeof optval); bcopy(optval, lvp->text, sizeof optval); vp = NULL; } else { vpp = hashvar(name); for (vp = *vpp ; vp && ! varequal(vp->text, name) ; vp = vp->next); if (vp == NULL) { if (strchr(name, '=')) setvareq(savestr(name), VSTRFIXED); else setvar(name, NULL, VSTRFIXED); vp = *vpp; /* the new variable */ lvp->text = NULL; lvp->flags = VUNSET; } else { lvp->text = vp->text; lvp->flags = vp->flags; vp->flags |= VSTRFIXED|VTEXTFIXED; if (strchr(name, '=')) setvareq(savestr(name), 0); } } lvp->vp = vp; lvp->next = localvars; localvars = lvp; INTON; } /* * Called after a function returns. */ void poplocalvars() { struct localvar *lvp; struct var *vp; while ((lvp = localvars) != NULL) { localvars = lvp->next; vp = lvp->vp; if (vp == NULL) { /* $- saved */ bcopy(lvp->text, optval, sizeof optval); ckfree(lvp->text); } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) { unsetvar(vp->text); } else { if ((vp->flags & VTEXTFIXED) == 0) ckfree(vp->text); vp->flags = lvp->flags; vp->text = lvp->text; } ckfree(lvp); } } setvarcmd(argc, argv) char **argv; { if (argc <= 2) return unsetcmd(argc, argv); else if (argc == 3) setvar(argv[1], argv[2], 0); else error("List assignment not implemented"); return 0; } /* * The unset builtin command. We unset the function before we unset the * variable to allow a function to be unset when there is a readonly variable * with the same name. */ unsetcmd(argc, argv) char **argv; { char **ap; for (ap = argv + 1 ; *ap ; ap++) { unsetfunc(*ap); unsetvar(*ap); } return 0; } /* * Unset the specified variable. */ STATIC void unsetvar(s) char *s; { struct var **vpp; struct var *vp; vpp = hashvar(s); for (vp = *vpp ; vp ; vpp = &vp->next, vp = *vpp) { if (varequal(vp->text, s)) { INTOFF; if (*(strchr(vp->text, '=') + 1) != '\0' || vp->flags & VREADONLY) { setvar(s, nullstr, 0); } vp->flags &=~ VEXPORT; vp->flags |= VUNSET; if ((vp->flags & VSTRFIXED) == 0) { if ((vp->flags & VTEXTFIXED) == 0) ckfree(vp->text); *vpp = vp->next; ckfree(vp); } INTON; return; } } } /* * Find the appropriate entry in the hash table from the name. */ STATIC struct var ** hashvar(p) register char *p; { unsigned int hashval; hashval = *p << 4; while (*p && *p != '=') hashval += *p++; return &vartab[hashval % VTABSIZE]; } /* * Returns true if the two strings specify the same varable. The first * variable name is terminated by '='; the second may be terminated by * either '=' or '\0'. */ STATIC int varequal(p, q) register char *p, *q; { while (*p == *q++) { if (*p++ == '=') return 1; } if (*p == '=' && *(q - 1) == '\0') return 1; return 0; } /*- * Copyright (c) 1991 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Kenneth Almquist. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)var.h 5.1 (Berkeley) 3/7/91 */ /* * Shell variables. */ /* flags */ #define VEXPORT 01 /* variable is exported */ #define VREADONLY 02 /* variable cannot be modified */ #define VSTRFIXED 04 /* variable struct is staticly allocated */ #define VTEXTFIXED 010 /* text is staticly allocated */ #define VSTACK 020 /* text is allocated on the stack */ #define VUNSET 040 /* the variable is not set */ struct var { struct var *next; /* next entry in hash list */ int flags; /* flags are defined above */ char *text; /* name=value */ }; struct localvar { struct localvar *next; /* next local variable in list */ struct var *vp; /* the variable that was made local */ int flags; /* saved flags */ char *text; /* saved text */ }; struct localvar *localvars; #if ATTY extern struct var vatty; #endif extern struct var vifs; extern struct var vmail; extern struct var vmpath; extern struct var vpath; extern struct var vps1; extern struct var vps2; extern struct var vpse; #if ATTY extern struct var vterm; #endif /* * The following macros access the values of the above variables. * They have to skip over the name. They return the null string * for unset variables. */ #define ifsval() (vifs.text + 4) #define mailval() (vmail.text + 5) #define mpathval() (vmpath.text + 9) #define pathval() (vpath.text + 5) #define ps1val() (vps1.text + 4) #define ps2val() (vps2.text + 4) #define pseval() (vpse.text + 4) #if ATTY #define termval() (vterm.text + 5) #endif #if ATTY #define attyset() ((vatty.flags & VUNSET) == 0) #endif #define mpathset() ((vmpath.flags & VUNSET) == 0) #ifdef __STDC__ void initvar(); void setvar(char *, char *, int); void setvareq(char *, int); struct strlist; void listsetvar(struct strlist *); char *lookupvar(char *); char *bltinlookup(char *, int); char **environment(); int showvarscmd(int, char **); void mklocal(char *); void poplocalvars(void); #else void initvar(); void setvar(); void setvareq(); void listsetvar(); char *lookupvar(); char *bltinlookup(); char **environment(); int showvarscmd(); void mklocal(); void poplocalvars(); #endif ...Makefileanm.casize.cout.h# Makefile for commands/autil CFLAGS = -D_MINIX -D_POSIX_SOURCE -wo CCLD = $(CC) -i $(CFLAGS) all: anm asize anm: anm.c $(CCLD) -o $@ $? install -S 32kw $@ asize: asize.c $(CCLD) -o $@ $? install -S 4kw $@ install: /usr/bin/anm /usr/bin/asize /usr/bin/anm: anm install -cs -o bin $? $@ /usr/bin/asize: asize install -cs -o bin $? $@ clean: rm -f anm asize core /* @(#)anm.c 1.6 */ /* ** print symbol tables for ** ACK object files ** ** anm [-gopruns] [name ...] */ #define ushort unsigned short #include "out.h" #include #include #include int numsort_flg; int sectsort_flg; int undef_flg; int revsort_flg = 1; int globl_flg; int nosort_flg; int arch_flg; int prep_flg; struct outhead hbuf; struct outsect sbuf; FILE *fi; long off; long s_base[S_MAX]; /* for specially encoded bases */ main(argc, argv) char **argv; { int narg; int compare(); if (--argc>0 && argv[1][0]=='-' && argv[1][1]!=0) { argv++; while (*++*argv) switch (**argv) { case 'n': /* sort numerically */ numsort_flg++; continue; case 's': /* sort in section order */ sectsort_flg++; continue; case 'g': /* globl symbols only */ globl_flg++; continue; case 'u': /* undefined symbols only */ undef_flg++; continue; case 'r': /* sort in reverse order */ revsort_flg = -1; continue; case 'p': /* don't sort -- symbol table order */ nosort_flg++; continue; case 'o': /* prepend a name to each line */ prep_flg++; continue; default: /* oops */ fprintf(stderr, "anm: invalid argument -%c\n", *argv[0]); exit(1); } argc--; } if (argc == 0) { argc = 1; argv[1] = "a.out"; } narg = argc; while(argc--) { struct outname *nbufp = (struct outname *)NULL; struct outname nbuf; char *cbufp; long fi_to_co; long n; unsigned readcount; int i,j; fi = fopen(*++argv,"r"); if (fi == (FILE *)NULL) { fprintf(stderr, "anm: cannot open %s\n", *argv); continue; } getofmt((char *)&hbuf, SF_HEAD, fi); if (BADMAGIC(hbuf)) { fprintf(stderr, "anm: %s-- bad format\n", *argv); fclose(fi); continue; } if (narg > 1) printf("\n%s:\n", *argv); n = hbuf.oh_nname; if (n == 0) { fprintf(stderr, "anm: %s-- no name list\n", *argv); fclose(fi); continue; } if (hbuf.oh_nchar == 0) { fprintf(stderr, "anm: %s-- no names\n", *argv); fclose(fi); continue; } if ((readcount = hbuf.oh_nchar) != hbuf.oh_nchar) { fprintf(stderr, "anm: string area too big in %s\n", *argv); exit(2); } /* store special section bases */ if (hbuf.oh_flags & HF_8086) { for (i=0; i>12) & 03777760; } } if ((cbufp = (char *)malloc(readcount)) == (char *)NULL) { fprintf(stderr, "anm: out of memory on %s\n", *argv); exit(2); } fseek(fi, OFF_CHAR(hbuf), 0); if (fread(cbufp, 1, readcount, fi) == 0) { fprintf(stderr, "anm: read error on %s\n", *argv); exit(2); } fi_to_co = (long)cbufp - OFF_CHAR(hbuf); fseek(fi, OFF_NAME(hbuf), 0); i = 0; while (--n >= 0) { getofmt((char *)&nbuf, SF_NAME, fi); if (nbuf.on_foff == 0) continue; /* skip entries without names */ if (globl_flg && (nbuf.on_type&S_EXT)==0) continue; if (undef_flg && ((nbuf.on_type&S_TYP)!=S_UND || (nbuf.on_type&S_ETC)!=0)) continue; nbuf.on_mptr = (char *)(nbuf.on_foff + fi_to_co); /* adjust value for specially encoded bases */ if (hbuf.oh_flags & HF_8086) { if (((nbuf.on_type&S_ETC) == 0) || ((nbuf.on_type&S_ETC) == S_SCT)) { j = nbuf.on_type&S_TYP; if ((j>=S_MIN) && (j<=S_MAX)) nbuf.on_valu += s_base[j]; } } if (nbufp == (struct outname *)NULL) nbufp = (struct outname *)malloc(sizeof(struct outname)); else nbufp = (struct outname *)realloc(nbufp, (i+1)*sizeof(struct outname)); if (nbufp == (struct outname *)NULL) { fprintf(stderr, "anm: out of memory on %s\n", *argv); exit(2); } nbufp[i++] = nbuf; } if (nbufp && nosort_flg==0) qsort(nbufp, i, sizeof(struct outname), compare); for (n=0; non_type&S_TYP) > (p2->on_type&S_TYP)) return(revsort_flg); if ((p1->on_type&S_TYP) < (p2->on_type&S_TYP)) return(-revsort_flg); } if (numsort_flg) { if (p1->on_valu > p2->on_valu) return(revsort_flg); if (p1->on_valu < p2->on_valu) return(-revsort_flg); } i = strcmp(p1->on_mptr, p2->on_mptr); if (i > 0) return(revsort_flg); if (i < 0) return(-revsort_flg); return(0); } getofmt(p, s, f) register char *p; register char *s; register FILE *f; { register i; register long l; for (;;) { switch (*s++) { /* case '0': p++; continue; */ case '1': *p++ = getc(f); continue; case '2': i = getc(f); i |= (getc(f) << 8); *((short *)p) = i; p += sizeof(short); continue; case '4': l = (long)getc(f); l |= ((long)getc(f) << 8); l |= ((long)getc(f) << 16); l |= ((long)getc(f) << 24); *((long *)p) = l; p += sizeof(long); continue; default: case '\0': break; } break; } } /* @(#)asize.c 1.4 */ #define ushort unsigned short #include #include "out.h" /* asize -- determine object size */ main(argc, argv) char **argv; { struct outhead buf; struct outsect sbuf; ushort nrsect; long sum; int gorp; FILE *f; if (--argc == 0) { argc = 1; argv[1] = "a.out"; } gorp = argc; while(argc--) { if ((f = fopen(*++argv, "r"))==NULL) { fprintf(stderr, "asize: cannot open %s\n", *argv); continue; } getofmt ((char *)&buf, SF_HEAD , f); if(BADMAGIC(buf)) { fprintf(stderr, "asize: %s-- bad format\n", *argv); fclose(f); continue; } nrsect = buf.oh_nsect; if (nrsect == 0) { fprintf(stderr, "asize: %s-- no sections\n", *argv); fclose(f); continue; } if (gorp > 1) printf("%s: ", *argv); sum = 0; while (nrsect-- > 0) { getofmt ((char *)&sbuf, SF_SECT , f); printf("%ld", sbuf.os_size); sum += sbuf.os_size; if (nrsect > 0) putchar('+'); } printf(" = %ld = 0x%lx\n", sum, sum); fclose(f); } } getofmt(p, s, f) register char *p; register char *s; register FILE *f; { register i; register long l; for (;;) { switch (*s++) { /* case '0': p++; continue; */ case '1': *p++ = getc(f); continue; case '2': i = getc(f); i |= (getc(f) << 8); *((short *)p) = i; p += sizeof(short); continue; case '4': l = (long)getc(f); l |= ((long)getc(f) << 8); l |= ((long)getc(f) << 16); l |= ((long)getc(f) << 24); *((long *)p) = l; p += sizeof(long); continue; default: case '\0': break; } break; } } /* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". */ /* $Header: out.h,v 1.1 91/05/16 14:09:17 ceriel Exp $ */ #ifndef __OUT_H_INCLUDED #define __OUT_H_INCLUDED /* * output format for ACK assemblers */ #ifndef ushort #define ushort unsigned short #endif /* ushort */ struct outhead { ushort oh_magic; /* magic number */ ushort oh_stamp; /* version stamp */ ushort oh_flags; /* several format flags */ ushort oh_nsect; /* number of outsect structures */ ushort oh_nrelo; /* number of outrelo structures */ ushort oh_nname; /* number of outname structures */ long oh_nemit; /* sum of all os_flen */ long oh_nchar; /* size of string area */ }; #define O_MAGIC 0x0201 /* magic number of output file */ #define O_STAMP 0 /* version stamp */ #define MAXSECT 64 /* Maximum number of sections */ #define HF_LINK 0x0004 /* unresolved references left */ #define HF_8086 0x0008 /* os_base specially encoded */ struct outsect { long os_base; /* startaddress in machine */ long os_size; /* section size in machine */ long os_foff; /* startaddress in file */ long os_flen; /* section size in file */ long os_lign; /* section alignment */ }; struct outrelo { char or_type; /* type of reference */ char or_sect; /* referencing section */ ushort or_nami; /* referenced symbol index */ long or_addr; /* referencing address */ }; struct outname { union { char *on_ptr; /* symbol name (in core) */ long on_off; /* symbol name (in file) */ } on_u; #define on_mptr on_u.on_ptr #define on_foff on_u.on_off ushort on_type; /* symbol type */ ushort on_desc; /* debug info */ long on_valu; /* symbol value */ }; /* * relocation type bits */ #define RELSZ 0x07 /* relocation length */ #define RELO1 1 /* 1 byte */ #define RELO2 2 /* 2 bytes */ #define RELO4 4 /* 4 bytes */ #define RELPC 0x08 /* pc relative */ #define RELBR 0x10 /* High order byte lowest address. */ #define RELWR 0x20 /* High order word lowest address. */ /* * section type bits and fields */ #define S_TYP 0x007F /* undefined, absolute or relative */ #define S_EXT 0x0080 /* external flag */ #define S_ETC 0x7F00 /* for symbolic debug, bypassing 'as' */ /* * S_TYP field values */ #define S_UND 0x0000 /* undefined item */ #define S_ABS 0x0001 /* absolute item */ #define S_MIN 0x0002 /* first user section */ #define S_MAX (S_TYP-1) /* last user section */ #define S_CRS S_TYP /* on_valu is symbol index which contains value */ /* * S_ETC field values */ #define S_SCT 0x0100 /* section names */ #define S_LIN 0x0200 /* hll source line item */ #define S_FIL 0x0300 /* hll source file item */ #define S_MOD 0x0400 /* ass source file item */ #define S_COM 0x1000 /* Common name. */ #define S_STB 0xe000 /* entries with any of these bits set are reserved for debuggers */ /* * structure format strings */ #define SF_HEAD "22222244" #define SF_SECT "44444" #define SF_RELO "1124" #define SF_NAME "4224" /* * structure sizes (bytes in file; add digits in SF_*) */ #define SZ_HEAD 20 #define SZ_SECT 20 #define SZ_RELO 8 #define SZ_NAME 12 /* * file access macros */ #define BADMAGIC(x) ((x).oh_magic!=O_MAGIC) #define OFF_SECT(x) SZ_HEAD #define OFF_EMIT(x) (OFF_SECT(x) + ((long)(x).oh_nsect * SZ_SECT)) #define OFF_RELO(x) (OFF_EMIT(x) + (x).oh_nemit) #define OFF_NAME(x) (OFF_RELO(x) + ((long)(x).oh_nrelo * SZ_RELO)) #define OFF_CHAR(x) (OFF_NAME(x) + ((long)(x).oh_nname * SZ_NAME)) #endif /* __OUT_H_INCLUDED */ ...MakefileNOTEREADMEawk.he.ck.cl.cm.cn.cr.cregexp.cregexp.hv.cy.c# Makefile for awk. CFLAGS = -D_MINIX -D_POSIX_SOURCE -wo -w LDFLAGS = -i -f OBJS = m.o e.o n.o l.o r.o v.o y.o regexp.o k.o all: awk awk: $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) #-lm install -S 32kw $@ install: /usr/bin/awk /usr/bin/awk: awk install -cs -o bin $? $@ clean: rm -f awk *.o a.out *.bak core e.o: awk.h regexp.h l.o: awk.h m.o: awk.h n.o: awk.h r.o: awk.h regexp.h regexp.o: regexp.h v.o: awk.h regexp.h y.o: awk.h a small AWK clone ̃vÓAMinix 1.2 pɏ̂łB_Zg ܂AMinix 1.5 ȑO ACK-C ł̓RpCł܂B̂ makefile ł́APeter S. Housel̕_pbP[Wg悤ɂȂĂ܂B CFLAGS -f A̎włB̕_pbP[ẂAɂ悭ł ܂Aatan(x, y) ̈̏tɂȂĂ܂̂ŁACĂĂ Bɂ悤ȋL܂AYĂ܂܂BA 肪悤łAA΁AŎgĂ̂\ 悤ɂ܂B ̃vÓAShift-JIS ̊R[h悤ɂȂĂ܂B EUC ɑΉꍇ́AK\̈AR[hɊ֌W镔̏K vłA債Ԃł͂܂BǂȂύXꂽꍇ́Apb`pӂ ĂƊłB ́Â awk ̎dlɂȂĂ܂AuAWK Programming Languagev ołAPOSIX 1003.2 draft ł nawk dl̗pꂽ̂@ɁAnawk ̎dlɏ܂BIWi awk ƈāAparser lexical analizer hand maid łA64K+64K ̃Ɏ܂Ă܂B {́AMinix 炵AޓIȃvOɂׂłA ̂łAƂƁAg߂ɁAƂ炸ɃXN[Ȃ 珑Ă܂߁AꂢȃR[fBOɂȂĂ܂BA64K+64K ̃Ŏg awk ɂ܂̂ŁAƂ肠s̏ԂŌJĂ Ƃɂ܂B vÔ̂́AK\̕]Ɉˑ̂āAuAWK Programming LanguagevɌfڂĂeXgvOɒʂ邱ƂmFĂ ܂B 32-bit Minix ̏ꍇ́AAT&T IWi awk Ƃ gawk, mawk Ƃ vOg܂A_T|[gAc386 ł̃vOR pC邱Ƃł܂B _ (kh@hiraide.mogami-wire.co.jp) 1995-01-29 A small AWK clone for the 16-bit Minix We have written this program for the Minix 1.2 to fit into 64K+64K memory. When compiling this program, you need the Peter S. Housel's Floating Math Package with corrected the atan() function. Original atan() function has incorrect argument sequence. This program supports Japanese Shift-JIS KANJI code and passes all the test program of the "AWK programming language" written by original AWK authors except some programs relied upon the way of regular expression evaluation. Kouichi Hirabayashi (kh@mogami-wire.co.jp) /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ /* lexical/parser tokens and executable statements */ #define FIRSTP 256 #define ARG 256 #define ARITH 257 #define ARRAY 258 #define ASSIGN 259 #define CALL 260 #define CAT 261 #define COND 262 #define DELETE 263 #define DO 264 #define ELEMENT 265 #define FIELD 266 #define FOR 267 #define FORIN 268 #define GETLINE 269 #define IF 270 #define IN 271 #define JUMP 272 #define MATHFUN 273 #define NULPROC 274 #define P1STAT 275 #define P2STAT 276 #define PRINT 277 #define PRINT0 278 #define STRFUN 279 #define SUBST 280 #define USRFUN 281 #define WHILE 282 #define LASTP 282 /* lexical token */ #define ADD 300 /* + */ #define ADDEQ 301 /* += */ #define AND 302 /* && */ #define BEGIN 303 /* BEGIN */ #define BINAND 304 /* & */ #define BINOR 305 /* | */ #define BREAK 306 /* break */ #define CLOSE 307 /* close */ #define CONTIN 308 /* continue */ #define DEC 309 /* -- */ #define DIV 310 /* / */ #define DIVEQ 311 /* /= */ #define ELSE 312 /* else */ #define END 313 /* END */ #define EOL 314 /* ; or '\n' */ #define EQ 315 /* == */ #define EXIT 316 /* exit */ #define FUNC 317 /* function */ #define GE 318 /* >= */ #define GT 319 /* > */ #define IDENT 320 /* identifier */ #define INC 321 /* ++ */ #define LE 322 /* <= */ #define LT 323 /* < */ #define MATCH 324 /* ~ */ #define MOD 325 /* % */ #define MODEQ 326 /* %= */ #define MULT 327 /* * */ #define MULTEQ 328 /* *= */ #define NE 329 /* != */ #define NEXT 330 /* next */ #define NOMATCH 331 /* !~ */ #define NOT 332 /* ! */ #define NUMBER 333 /* integer or floating number */ #define OR 334 /* || */ #define POWEQ 335 /* ^= */ #define POWER 336 /* ^ */ #define PRINTF 337 /* printf */ #define REGEXP 338 /* /REG/ */ #define RETURN 339 /* return */ #define SHIFTL 340 /* << */ #define SHIFTR 341 /* >> */ #define SPRINT 342 /* sprint */ #define SPRINTF 343 /* sprintf */ #define STRING 344 /* ".." */ #define SUB 345 /* - */ #define SUBEQ 346 /* -= */ #define SYSTEM 347 /* system */ #define UMINUS 348 /* - */ /* tokens in parser */ #define VALUE 400 /* value node */ #define INCDEC 401 /* ++, -- */ #define PRE 402 /* pre incre/decre */ #define POST 403 /* post incre/decre */ /* redirect in print(f) statement */ #define R_OUT 410 /* > */ #define R_APD 411 /* >> */ #define R_PIPE 412 /* | */ #define R_IN 413 /* < */ #define R_PIN 414 /* | getline */ #define R_POUT 415 /* print | */ /* function */ #define ATAN2 500 /* atan2 */ #define COS 501 /* cos */ #define EXP 502 /* exp */ #define INDEX 503 /* index */ #define INT 504 /* int */ #define LENGTH 505 /* length */ #define LOG 506 /* log */ #define RAND 507 /* rand */ #define RGSUB 508 /* gsub */ #define RMATCH 509 /* match */ #define RSUB 510 /* sub */ #define SIN 511 /* sin */ #define SPLIT 512 /* split */ #define SQRT 513 /* sqrt */ #define SRAND 514 /* srand */ #define SUBSTR 515 /* substr */ /* print(f) options */ #define FORMAT 1024 /* PRINTF, SPRINTF */ #define STROUT 2048 /* SPRINTF */ #define PRMASK 0x3ff /* ~(FORMAT|STROUT) */ /* node - used in parsed tree */ struct node { int n_type; /* node type */ struct node *n_next; /* pointer to next node */ struct node *n_arg[1]; /* argument (variable length) */ }; typedef struct node NODE; /* object cell */ struct cell { int c_type; /* cell type */ char *c_sval; /* string value */ double c_fval; /* floating value */ }; typedef struct cell CELL; /* cell type */ #define UDF 0 /* pass parameter */ #define VAR 1 /* variable */ #define NUM 2 /* number */ #define ARR 4 /* array */ #define STR 8 /* string */ #define REC 16 /* record */ #define FLD 32 /* filed */ #define PAT 64 /* pattern (compiled REGEXPR) */ #define BRK 128 /* break */ #define CNT 256 /* continue */ #define NXT 512 /* next */ #define EXT 1024 /* exit */ #define RTN 2048 /* return */ #define TMP 4096 /* temp cell */ #define POS 8192 /* argument position */ #define FUN 16384 /* function */ /* symbol cell - linked to symbol table */ struct symbol { char *s_name; CELL *s_val; struct symbol *s_next; }; typedef struct symbol SYMBOL; /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include #include "awk.h" #include "regexp.h" extern char **FS, **OFS, **ORS, **OFMT; extern double *RSTART, *RLENGTH; extern char record[]; extern CELL *field[]; extern int r_start, r_length; double getfval(), atof(); char *strsave(), *getsval(), *strcat(), *strstr(); CELL *mkcell(), *mktmp(); CELL *Field(), *Split(), *Forin(); CELL *Arith(), *Assign(), *Stat(), *Mathfun(), *Strfun(), *Cond(); CELL *Print(), *Cat(), *Array(), *Element(); CELL *If(), *While(), *For(), *Do(), *Jump(); CELL *P1stat(), *P2stat(), *Print0(); CELL *Arg(), *Call(), *Ret(); CELL *Subst(), *In(), *Getline(), *Delete(), *Close(); CELL *Nulproc(), *Usrfun(); CELL *_Arg(); FILE *getfp(); /* r.c */ CELL truecell = { NUM, NULL, 1.0 }; CELL falsecell = { NUM, NULL, 0.0 }; static CELL breakcell = { BRK, NULL, 0.0 }; static CELL contcell = { CNT, NULL, 0.0 }; static CELL nextcell = { NXT, NULL, 0.0 }; static CELL retcell = { RTN, NULL, 0.0 }; static CELL *retval; /* function return value */ int pateval; /* used in P1STAT & P2STAT */ static char *r_str; /* STR in 'str ~ STR */ static regexp *r_pat; /* compiled pattern for STR */ CELL *(*proctab[])() = { Arg, Arith, Array, Assign, Call, Cat, Cond, Delete, Do, Element, Field, For, Forin, Getline, If, In, Jump, Mathfun, Nulproc, P1stat, P2stat, Print, Print0, Strfun, Subst, Usrfun, While }; CELL * execute(p) NODE *p; { int type, i; CELL *r, *(*proc)(); type = p->n_type; if (type == VALUE) { if ((r = (CELL *) p->n_arg[0])->c_type & PAT && pateval) { i = match(r->c_sval, (char *)record) ? 1 : 0; r = mktmp(NUM, NULL, (double) i); } return r; } for ( ; p != NULL; p = p->n_next) { #if 0 if (p->n_type == VALUE) continue; /* neglect */ #endif /* switch ((int) p->n_type) { case ARRAY: r = Array(p); break; case ARITH: r = Arith(p); break; case ASSIGN: r = Assign(p); break; case PRINT: r = Print(p); break; case PRINT0: r = Print0(p); break; case CAT: r = Cat(p); break; case MATHFUN: r = Mathfun(p); break; case STRFUN: r = Strfun(p); break; case COND: r = Cond(p); break; case IF: r = If(p); break; case P1STAT: r = P1stat(p); break; case P2STAT: r = P2stat(p); break; case WHILE: r = While(p); break; case DO: r = Do(p); break; case FOR: r = For(p); break; case FORIN: r = Forin(p); break; case FIELD: r = Field(p); break; case JUMP: r = Jump(p); break; case ARG: r = Arg(p); break; case CALL: r = Call(p); break; case SUBST: r = Subst(p); break; case ELEMENT: r = Element(p); break; case IN: r = In(p); break; case GETLINE: r = Getline(p); break; case DELETE: r = Delete(p); break; case NULPROC: r = &truecell; break; default: printf("PROGRAM ERROR ? ILLEGAL NODE TYPE(%d)\n", type); exit(1); break; } */ i = (int) p->n_type; if (i < FIRSTP || i > LASTP) error("ILLEGAL PROC (%d)", i); proc = proctab[i - FIRSTP]; r = (*proc)(p); if (r->c_type & (BRK|CNT|NXT|RTN)) return r; if (p->n_next != NULL) c_free(r); #ifdef DOS kbhit(); /* needs in MS-DOS */ #endif } return r; } static CELL * Arith(p) NODE *p; { int op; CELL *r, *u, *v, *execute(); double x, y, fmod(), pow(); op = (int) p->n_arg[0]; if (op == UMINUS) { u = execute(p->n_arg[1]); x = - getfval(u); } else if (op == INCDEC) { u = execute(p->n_arg[1]); x = getfval(u); setfval(u, x + (int) p->n_arg[2]); if ((int) p->n_arg[3] == PRE) return u; /* return dummy */ } else { u = execute(p->n_arg[1]); v = execute(p->n_arg[2]); x = getfval(u); y = getfval(v); if (op == DIV || op == MOD) { if (y == 0.0) fprintf(stderr, "divid by 0\n"); } switch (op) { case SUB: x -= y;break; case ADD: x += y; break; case MULT: x *= y; break; case DIV: if (y == 0.0) error("division by zero in \"/\"", (char *)0); x /= y; break; case MOD: if (y == 0.0) error("division by zero in \"%%\"", (char *)0); x = fmod(x, y); break; case POWER: x = pow(x, y); break; default: printf("UNSUPPORTED ARITH OPERATOR !\n"); break; } c_free(v); } c_free(u); r = mktmp(NUM, NULL, x); return r; } static CELL * Assign(p) NODE *p; { CELL *u, *v, *execute(); int op; double x, y, fmod(), pow(); op = (int) p->n_arg[0]; u = execute(p->n_arg[1]); #if 0 if (u->c_type == UDF) /* fix up local var */ u->c_type |= VAR|STR; #endif if (!(u->c_type & (VAR|FLD|REC)) && (u->c_type != UDF)) fprintf(stderr, "ASSIGN TO NON VARIABLE (%d)\n", u->c_type); v = execute(p->n_arg[2]); if (u == v) goto rtn; /* same node */ if (op == ASSIGN) { if (v->c_type & NUM/* || isnum(v->c_sval)*/) setfval(u, getfval(v)); else setsval(u, getsval(v)); } else { x = getfval(u); y = getfval(v); switch (op) { case ADDEQ: x += y; break; case SUBEQ: x -= y; break; case MULTEQ: x *= y; break; case DIVEQ: if (y == 0.0) error("division by zero in \"/=\"", (char *)0); x /= y; break; case MODEQ: if (y == 0.0) error("division by zero in \"%=\"", (char *)0); x = fmod(x, y); break; case POWEQ: x = pow(x, y); break; default: synerr("illegal assign op (%d)", op); break; } setfval(u, x); } rtn: c_free(v); return u; } static CELL * Cat(p) NODE *p; { CELL *u; char *s, *t, str[BUFSIZ]; u = execute(p->n_arg[0]); s = getsval(u); for (t = str; *s; ) *t++ = *s++; c_free(u); u = execute(p->n_arg[1]); s = getsval(u); while (*s) *t++ = *s++; c_free(u); *t = '\0'; return mktmp(STR, str, 0.0); } static CELL * Print(p) NODE *p; { register int i, redir, typ; CELL *u; char *s, str[BUFSIZ]; char *file; FILE *fp; redir = (int) p->n_arg[0]; if (typ = redir & PRMASK) { /* redirect */ u = execute(p->n_arg[1]); file = getsval(u); if (typ == R_PIPE) typ = R_POUT; fp = getfp(file, typ); c_free(u); } else fp = stdout; if (redir & FORMAT) /* format */ format(str, p); else { *str = '\0'; for (i = 2; p->n_arg[i] != NULL; i++) { if (i > 2) strcat(str, *OFS); u = execute(p->n_arg[i]); s = getsval(u); strcat(str, s); c_free(u); } strcat(str, *ORS); } if (redir & STROUT) /* sprintf */ return mktmp(STR, str, 0.0); fputs(str, fp); fflush(fp); return &truecell; } static CELL * Mathfun(p) NODE *p; { CELL *u, *v; double x, y; double atan2(), cos(), exp(), log(), sin(), sqrt(), modf(); if ((int) p->n_arg[1] == 0) { u = NULL; x = 0.0; } else { u = execute(p->n_arg[2]); x = getfval(u); } switch ((int) p->n_arg[0]) { case ATAN2: if ((int) p->n_arg[1] == 2) { v = execute(p->n_arg[3]); y = getfval(v); x = atan2(x, y); c_free(v); } else x = 0.0; break; case COS: x = cos(x); break; case EXP: x = exp(x); break; case INT: y = modf(x, &x); break; case LOG: x = log(x); break; case SIN: x = sin(x); break; case SQRT: x = sqrt(x); break; case RAND: x = (double) rand() / 32768.0; break; case SRAND: if (x == 0.0) x = (double) time(0); x = (double) srand((int) x); break; default: fprintf(stderr, "unknown math function (%d)\n", p->n_arg[2]); break; } if (u != NULL) c_free(u); return mktmp(NUM, NULL, x); } static CELL * Strfun(p) NODE *p; { CELL *u, *v, *r; char *s, *t, str[BUFSIZ]; int i, m, n; double x; regexp *pat, *getpat(); n = (int) p->n_arg[1]; if (n > 0 && (int) p->n_arg[0] != SPLIT) { u = execute(p->n_arg[2]); s = getsval(u); } else { s = ""; u = NULL; } switch ((int) p->n_arg[0]) { case INDEX: if (n > 1) { v = execute(p->n_arg[3]); t = getsval(v); i = Index(s, t); c_free(v); } else i = 0; r = mktmp(NUM, NULL, (double) i); break; case LENGTH: i = (n > 0) ? jstrlen(s) : jstrlen(record); r = mktmp(NUM, NULL, (double) i); break; case SPLIT: r = Split(p); break; case SUBSTR: if F:H:I:J:K:L:M:N:O:P:(n > 1) { v = execute(p->n_arg[3]); m = (int) getfval(v) - 1; c_free(v); } else m = 0; if (n > 2) { v = execute(p->n_arg[4]); n = (int) getfval(v); c_free(v); } else n = jstrlen(s) - m; for (t = str; *s && m-- > 0; s++) if (isKanji(*s)) s++; while (*s && n-- > 0) { if (isKanji(*s)) *t++ = *s++; *t++ = *s++; } *t = '\0'; r = mktmp(STR, str, 0.0); break; case RMATCH: if (n > 1) { v = execute(p->n_arg[3]); pat = getpat(v); match(pat, s); c_free(v); if (r_start) { /* change only if match */ *RSTART = (double) r_start; *RLENGTH = (double) r_length; } r = mktmp(NUM, NULL, (double) r_start); } else error("missing regexpr in match(str, regexpr)"); break; case CLOSE: r = Close(s); break; case SYSTEM: r = mktmp(NUM, NULL, system(s) == -1 ? 0.0 : 1.0); break; default: fprintf(stderr, "unknown string function"); break; } c_free(u); return r; } static regexp * getpat(r) CELL *r; { regexp *pat, *mkpat(); if (r->c_type & PAT) pat = (regexp *) r->c_sval; else { if (r_str && strcmp(r_str, r->c_sval) == 0) pat = r_pat; else { sfree(r_str); sfree(r_pat); r_str = strsave(getsval(r)); pat = r_pat = mkpat(r_str); } } return pat; } static CELL * Subst(p) NODE *p; { CELL *u, *v, *w; char *s, *t, *r, str[BUFSIZ], *strcpy(); int i, n; n = (int) p->n_arg[1]; if (n > 1) { u = execute(p->n_arg[3]); /* substitute string */ s = getsval(u); v = execute(p->n_arg[2]); /* expr */ if (n > 2) { w = execute(p->n_arg[4]); t = getsval(w); r = str; } else { t = r = record; w = NULL; } i = (int) p->n_arg[0] == RGSUB ? 0 : 1; if (v->c_type & (PAT|STR)) i = Sub(r, v->c_sval, (v->c_type & STR), s, t, i); else error("[g]sub(PAT, .. ) must be /../ or string (%d)", w->c_type); if (n > 2) { if (w->c_type & REC) { strcpy(record, str); mkfld(record, *FS, field); } else setsval(w, str); } else mkfld(record, *FS, field); c_free(u); c_free(v); c_free(w); } else i = 0; return mktmp(NUM, NULL, (double) i); } static CELL * Cond(p) NODE *p; { CELL *u, *v; double x, y; int op, i, j; char *s; int save = pateval; op = (int) p->n_arg[0]; u = execute(p->n_arg[1]); x = getfval(u); /* printf("Cond(%d)(%s)\n", u->c_type, u->c_sval); */ if (op == AND || op == OR || op == NOT) { if (u->c_type & NUM) i = (x != 0.0); else { s = getsval(u); i = (s != (char *)NULL) && (*s != '\0'); } } if (op == AND && !i) { c_free(u); return &falsecell; } if (op == OR && i) { c_free(u); return &truecell; } if (op == NOT) i = i == 0 ? 1 : 0; else { if (op == MATCH || op == NOMATCH) pateval = 0; v = execute(p->n_arg[2]); y = getfval(v); if (op == AND || op == OR || op == BINAND || op == BINOR) { if (v->c_type & NUM) j = (y != 0.0); else { s = getsval(v); j = (s != (char *)NULL) && (*s != '\0'); } switch (op) { case AND: i = i && j; break; case OR: i = i || j; break; case BINAND: i = i & j; break; case BINOR: i = i | j; break; } } else if (op == MATCH || op == NOMATCH) { char *s; regexp *pat, *getpat(); s = getsval(u); pat = getpat(v); i = match(pat, s) == 0 ? 0 : 1; if (op == NOMATCH) i = i == 0 ? 1 : 0; } else { /* relative operator */ /* printf("Cond(%d)(%d)(%s)(%s)\n", u->c_type, v->c_type, u->c_sval, v->c_sval); */ if ((u->c_type & NUM) && (v->c_type & NUM)) i = x < y ? -1 : (x > y ? 1 : 0); else i = strcmp(getsval(u), getsval(v)); /* printf("Cond(%d)(%d)(%g)(%g)(%d)\n", u->c_type, v->c_type, x, y, i); */ switch (op) { case LT: i = i < 0 ? 1 : 0; break; case LE: i = i <= 0 ? 1 : 0; break; case EQ: i = i == 0 ? 1 : 0; break; case NE: i = i != 0 ? 1 : 0; break; case GT: i = i > 0 ? 1 : 0; break; case GE: i = i >= 0 ? 1 : 0; break; default: fprintf(stderr, "unknown relative operator (%d)\n", op); break; } } c_free(v); } c_free(u); pateval = save; return mktmp(NUM, NULL, (double) i); } static CELL * If(p) NODE *p; { CELL *u; int i; char *s; u = execute(p->n_arg[0]); if (u->c_type & NUM) i = (getfval(u) != 0.0); else { s = getsval(u); i = (s != (char *)NULL) && (*s != '\0'); } c_free(u); if (i) u = execute(p->n_arg[1]); else if (p->n_arg[2]) u = execute(p->n_arg[2]); else u = &truecell; return u; } static CELL * While(p) NODE *p; { CELL *u; double x; for (;;) { u = execute(p->n_arg[0]); x = getfval(u); if (x == 0.0) break; c_free(u); u = execute(p->n_arg[1]); switch (u->c_type) { case BRK: goto rtn; case NXT: case EXT: case RTN: return u; } c_free(u); } rtn: c_free(u); return &truecell; } static CELL * Do(p) NODE *p; { CELL *u; double x; for (;;) { u = execute(p->n_arg[0]); switch (u->c_type) { case BRK: goto rtn; case NXT: case EXT: case RTN: return u; } c_free(u); u = execute(p->n_arg[1]); if(getfval(u) == 0.0) break; c_free(u); } rtn: c_free(u); return &truecell; } static CELL * For(p) NODE *p; { CELL *u; double x; if (p->n_arg[0] != NULL) { u = execute(p->n_arg[0]); c_free(u); } for (;;) { if (p->n_arg[1] != NULL) { u = execute(p->n_arg[1]); x = getfval(u); c_free(u); if (x == 0.0) break; } u = execute(p->n_arg[3]); switch (u->c_type) { case BRK: c_free(u); goto rtn; case NXT: case EXT: case RTN: return u; } if (p->n_arg[2] != NULL) { u = execute(p->n_arg[2]); c_free(u); } } rtn: return &truecell; } static CELL * Jump(p) NODE *p; { CELL *u; int i; switch ((int) p->n_arg[0]) { case BREAK: u = &breakcell; break; case CONTIN: u = &contcell; break; case EXIT: if ((int) p->n_arg[1]) { u = execute(p->n_arg[1]); i = (int) getfval(u); } else i = 0; closeall(); exit(i); case RETURN: Return(p); u = &retcell; break; case NEXT: u = &nextcell; break; } return u; } static Return(p) NODE *p; { CELL *u; int i; char *s, str[BUFSIZ]; c_free(retval); if (p->n_arg[1] != NULL) { if (p->n_arg[2] == NULL) { /* if (0) { */ u = execute(p->n_arg[1]); if (u->c_type == UDF) retval = mktmp(STR, "", 0.0); else retval = mktmp(u->c_type, u->c_sval, u->c_fval); c_free(u); } else { for (i = 1; p->n_arg[i] != NULL; i++) { if (i == 1) *str = '\0'; else strcat(str, *OFS); u = execute(p->n_arg[i]); s = getsval(u); strcat(str, s); c_free(u); } /* printf("Ret(%s)(%d)\n", str, isnum(str)); */ if (isnum(str)) retval = mktmp(STR|NUM, str, atof(str)); else retval = mktmp(STR, str, 0.0); } } else retval = &truecell; } #define MAXFRAME 100 CELL **frame[MAXFRAME]; static int framep; static CELL * Arg(p) NODE *p; { CELL *u; int i; u = (CELL *)p->n_arg[0]; return _Arg((int)u->c_fval); } CELL * _Arg(i) { /* printf("Arg(%d)\n", i); */ return frame[framep - 1][i]; } static CELL * Call(p) NODE *p; { CELL *u, *v, *r, **arg; NODE *q; int i, j, k, n; char *emalloc(); if (framep >= MAXFRAME - 2) error("stack frame overflow", (char *)0); retval = &truecell; r = (CELL *) p->n_arg[0]; if (r->c_type != FUN) synerr("called function is not declared", (char *)0); n = (int) r->c_fval; /* # of params */ if (n > 0) { arg = (CELL **) emalloc(sizeof(u) * n); for (i = 2, j = 0, k = (int) p->n_arg[1]; j < k; i++) { u = execute(p->n_arg[i]); /* printf("pass, j(%d)typ(%d)\n", j, u->c_type); */ if (u->c_type & ARR) v = u; /* pass by reference */ else { /* pass by value */ v = mkcell(UDF, u->c_sval, u->c_fval); if (u->c_type != UDF) { #if 0 v->c_type = u->c_type; if (v->c_type & (NUM|STR)) v->c_type |= VAR; v->c_type &= ~TMP; /* dont't free */ #else v->c_type |= (u->c_type & (NUM|STR))|VAR; /*v->c_type &= ~TMP;*/ #endif /* Don't free original */ } /* printf("pass1, j(%d)typ(%d)\n", j, v->c_type); */ } arg[j++] = v; } for ( ; j < n; ) /* local var */ arg[j++] = mkcell(UDF, NULL, 0.0); } else arg = NULL; frame[framep] = arg; framep++; r = execute(r->c_sval); c_free(r); framep--; if (n > 0) { for (j = n - 1 ; j > k; j--) { /* local var */ u = arg[j]; if (u->c_type & ARR) a_free(u); else c_free(u); } for ( ; j >= 0; j--) { u = arg[j]; if (!(u->c_type & ARR)) { /* c_free(u);*/ sfree(u->c_sval); sfree(u); } else { v = execute(p->n_arg[j + 2]); if (v->c_type == UDF) { /* copy back */ /* printf("copy_back_UDF(%d)(%d)\n", j, u->c_type); */ v->c_type = u->c_type; sfree(v->c_sval); v->c_sval = u->c_sval; v->c_fval = u->c_fval; sfree(u); } } } } sfree(arg); /* return retval;*/ u = mktmp(retval->c_type, retval->c_sval, retval->c_fval); return u; } CELL *Nulproc() { return &truecell; } CELL * Usrfun(p) NODE *p; { CELL *u; u = execute(p); return u; } /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include isKanji(c) { c &= 0xff; return (c > 0x80 && c < 0xa0 || c > 0xdf && c < 0xfd); } jstrlen(s) char *s; { int i; for (i = 0; *s; i++, s++) if (isKanji(*s)) s++; return i; } char * jStrchr(s, c) char *s; { for ( ; *s; s++) if (isKanji(*s)) s++; else if (*s == c) return s; return NULL; } /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include #include "awk.h" extern char *srcprg; /* inline program */ extern FILE *pfp; /* program file */ int sym; /* lexical token */ int sym1; /* auxiliary lexical token */ int regexflg; /* set by parser (y.c) to indicate parsing REGEXPR */ int funflg; /* set by parser (y.c) to indicate parsing FUNCTION */ int printflg; /* set by parser (y.c) to indicate parsing PRINT */ int getlineflg; /* set by parser (y.c) to indicate parsing GETLINE */ char text[BUFSIZ]; /* lexical word */ char line[BUFSIZ]; /* program line for error message (ring buffer) */ char *linep = line; /* line pointer */ char funnam[128]; /* function name for error message */ int lineno = 1; lex() { int c, d; char *s; if (regexflg) return sym = scanreg(); next: while ((c = Getc()) == ' ' || c == '\t') ; while (c == '#') for (c = Getc(); c != '\n'; c = Getc()) ; switch (c) { case '\\': if ((c = Getc()) == '\n') { lineno++; goto next; } break; case '\n': lineno++; break; } switch (c) { case EOF: return sym = 0; case '+': return sym = follow2('=', '+', ADDEQ, INC, ADD); case '-': return sym = follow2('=', '-', SUBEQ, DEC, SUB); case '*': return sym = follow('=', MULTEQ, MULT); case '/': return sym = follow('=', DIVEQ, DIV); case '%': return sym = follow('=', MODEQ, MOD); case '^': return sym = follow('=', POWEQ, POWER); case '=': return sym = follow('=', EQ, ASSIGN); case '!': return sym = follow2('=', '~', NE, NOMATCH, NOT); case '&': return sym = follow('&', AND, BINAND); case '|': sym = follow('|', OR, BINOR); if (printflg && sym == BINOR) sym = R_POUT; return sym; case '<': sym = follow2('=', '<', LE, SHIFTL, LT); if (getlineflg && sym == LT) sym = R_IN; return sym; case '>': sym = follow2('=', '>', GE, SHIFTR, GT); if (printflg) { switch (sym) { case GT: sym = R_OUT; break; case SHIFTR: sym = R_APD; break; } } return sym; case '~': return sym = MATCH; break; case ';': case '\n': return sym = EOL; } if (isalpha(c) || c == '_') { for (s = text; isalnum(c) || c == '_'; ) { *s++ = c; c = Getc(); } Ungetc(c); *s = '\0'; if ((d = iskeywd(text)) == 0 && (d = isbuiltin(text, &sym1)) == 0) { if (c == '(') return sym = CALL; else if (funflg) { if ((sym1 = isarg(text)) != -1) return sym = ARG; } } return sym = d ? d : IDENT; } else if (c == '.' || (isdigit(c))) { Ungetc(c); return sym = scannum(text); /* NUMBER */ } else if (c == '"') return sym = scanstr(text); /* STRING */ return sym = c; } static follow(c1, r1, r2) { register int c; if ((c = Getc()) == c1) return r1; else { Ungetc(c); return r2; } } static follow2(c1, c2, r1, r2, r3) { register int c; if ((c = Getc()) == c1) return r1; else if (c == c2) return r2; else { Ungetc(c); return r3; } } static iskeywd(s) char *s; { static struct { char *kw; int token; } tab[] = { "BEGIN", BEGIN, "END", END, "break", BREAK, "continue", CONTIN, "delete", DELETE, "do", DO, "else", ELSE, "exit", EXIT, "for", FOR, "func", FUNC, "function", FUNC, "getline", GETLINE, "if", IF, "in", IN, "next", NEXT, "print", PRINT, "printf", PRINTF, "return", RETURN, "sprint", SPRINT, "sprintf", SPRINTF, "while", WHILE, "", 0, 0 }; register int i; for (i = 0; tab[i].token; i++) if (strcmp(tab[i].kw, s) == 0) break; return tab[i].token; } static isbuiltin(s, p) char *s; int *p; { static struct { char *kw; int type; int token; } tab[] = { "atan2", MATHFUN, ATAN2, "close", STRFUN, CLOSE, "cos", MATHFUN, COS, "exp", MATHFUN, EXP, "gsub", SUBST, RGSUB, "index", STRFUN, INDEX, "int", MATHFUN, INT, "length", STRFUN, LENGTH, "log", MATHFUN, LOG, "match", STRFUN, RMATCH, "sin", MATHFUN, SIN, "sqrt", MATHFUN, SQRT, "rand", MATHFUN, RAND, "srand", MATHFUN, SRAND, "split", STRFUN, SPLIT, "sub", SUBST, RSUB, "substr", STRFUN, SUBSTR, "system", STRFUN, SYSTEM, "", 0, 0 }; register int i; for (i = 0; tab[i].token; i++) if (strcmp(tab[i].kw, s) == 0) break; *p = tab[i].token; return tab[i].type; } static scannum(s) char *s; { register int c; char *strchr(); if ((c = Getc()) && strchr("+-", c) != NULL) { *s++ = c; c = Getc(); } while (isdigit(c)) { *s++ = c; c = Getc(); } if (c == '.') { *s++ = c; c = Getc(); while (isdigit(c)) { *s++ = c; c = Getc(); } } if (c && strchr("eE", c) != NULL) { *s++ = c; c = Getc(); if (c && strchr("+-", c) != NULL) { *s++ = c; c = Getc(); } while (isdigit(c)) { *s++ = c; c = Getc(); } } *s = '\0'; Ungetc(c); return NUMBER; } static scanstr(s) char *s; { register int c, i, j; for (c = Getc(); c != EOF & c != '"'; ) { if (c == '\\') { switch (c = Getc()) { case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; default: if (isdigit(c)) { for (i = j = 0; i < 3 && isdigit(c); c = Getc(), i++) j = j * 8 + c - '0'; Ungetc(c); c = j; } break; } } *s++ = c; if (isKanji(c)) *s++ = Getc(); c = Getc(); } *s = '\0'; return STRING; } static scanreg() { register int c; register char *s; for (s = text; (c = Getc()) != '/'; ) if (c == '\n') error("newline in regular expression"); else { if (isKanji(c) || c == '\\') { *s++ = c; c = Getc(); } *s++ = c; } *s = '\0'; return REGEXP; } static int c0; Ungetc(c) { c0 = c; if (linep > line) { if (--linep < line) linep == line + BUFSIZ - 1; } } Getc() { register int c; char *s, *t; if (c0) { c = c0; c0 = 0; } else if (srcprg) c = *srcprg ? *srcprg++ : EOF; else c = fgetc(pfp); #if 0 if (linep - line == BUFSIZ) { printf("!!!\n"); for (s = line; *s != '\n' && ((s - line) #include #include #include "awk.h" extern char **FS, **FILENAME; extern char record[]; extern FILE *ifp; NODE *parse(); CELL *execute(); FILE *efopen(), *fopen(); char *strsave(); int xargc; char **xargv; char *srcprg; FILE *pfp; char *cmd; #if 0 int iflg; /* interactive mode */ #endif main(argc, argv) char **argv; { char *s, *strpbrk(), *strchr(); void onint(); #ifdef DOS _sharg(&argc, &argv); #endif signal(SIGINT, onint); signal(SIGFPE, onint); cmd = argv[0]; init(); while (--argc > 0 && (*++argv)[0] == '-') for (s = argv[0]+1; *s; s++) if (strcmp(argv[0], "-") == 0) break; else switch (*s) { #if 0 case 'i': iflg++; pfp = stdin; interactive(); /* no return */ #endif case 'F': *FS = ++s; break; case 'f': if (*(s+1)) s++; else { argc--; s = *++argv; } pfp = efopen(s, "r"); s += strlen(s) - 1; break; } xargc = argc; xargv = argv; if (pfp == NULL && xargc > 0) { srcprg = *xargv++; xargc--; } /* if (pfp == NULL && xargc > 0) { if (strpbrk(xargv[0], " !$^()={}[];<>,/~") != NULL) { sprintf(record, "%s\n", xargv[0]); srcprg = strsave(record); } else { sprintf(record, "%s.awk", xargv[0]); if ((pfp = fopen(record, "r")) == NULL) error("can't open %s", record); } xargc--; xargv++; } */ while (*xargv != NULL && strchr(*xargv, '=') != NULL) { setvar(*xargv++); xargc--; } initarg(cmd, xargc, xargv); if (xargc == 0) { ifp = stdin; *FILENAME = "-"; } parse(); closeall(); exit(0); } FILE * efopen(file, mode) char *file, *mode; { FILE *fp, *fopen(); if ((fp = fopen(file, mode)) == NULL) error("cannot open %s", file); return fp; } error(s, t) char *s, *t; { extern double *NR; fprintf(stderr, "awk: "); fprintf(stderr, s, t); fprintf(stderr, "\n"); if (NR != NULL) { fprintf(stderr, "record number %g\n", *NR); } #ifdef DOS closeall(); #endif exit(1); } void onint(i) { closeall(); exit(0x80 | i); } /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include "awk.h" NODE * node0(type) { NODE *p; char *emalloc(); p = (NODE *) emalloc(sizeof(*p) - sizeof(p)); p->n_type = type; p->n_next = NULL; return p; } NODE * node1(type, arg0) NODE *arg0; { NODE *p; char *emalloc(); p = (NODE *) emalloc(sizeof(*p)); p->n_type = type; p->n_next = NULL; p->n_arg[0] = (NODE *) arg0; return p; } NODE * node2(type, arg0, arg1) NODE *arg0, *arg1; { NODE *p; char *emalloc(); p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 1); p->n_type = type; p->n_next = NULL; p->n_arg[0] = (NODE *) arg0; p->n_arg[1] = (NODE *) arg1; return p; } NODE * node3(type, arg0, arg1, arg2) NODE *arg0, *arg1, *arg2; { NODE *p; char *emalloc(); p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 2); p->n_type = type; p->n_next = NULL; p->n_arg[0] = (NODE *) arg0; p->n_arg[1] = (NODE *) arg1; p->n_arg[2] = (NODE *) arg2; return p; } NODE * node4(type, arg0, arg1, arg2, arg3) NODE *arg0, *arg1, *arg2, *arg3; { NODE *p; char *emalloc(); p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * 3); p->n_type = type; p->n_next = NULL; p->n_arg[0] = (NODE *) arg0; p->n_arg[1] = (NODE *) arg1; p->n_arg[2] = (NODE *) arg2; p->n_arg[3] = (NODE *) arg3; return p; } CELL * mkcell(type, sval, fval) char *sval; double fval; { CELL *p; char *emalloc(), *strsave(); p = (CELL *) emalloc(sizeof(*p)); p->c_type = type; if (sval == NULL) p->c_sval = NULL; else p->c_sval = strsave(sval); p->c_fval = fval; return p; } #ifdef TMPCELL #define MAXTMP 25 CELL tmpcell[MAXTMP]; #endif CELL * mktmp(type, sval, fval) char *sval; double fval; { register int i; char *strsave(); #ifdef TMPCELL for (i = 0; i < MAXTMP; i++) if (tmpcell[i].c_type == 0) { tmpcell[i].c_type = type | TMP; tmpcell[i].c_sval = strsave(sval); tmpcell[i].c_fval = fval; return &tmpcell[i]; } error("formula too complex", (char *) 0); #else return mkcell(type | TMP, sval, fval); #endif } c_free(p) CELL *p; { if ((p != NULL) && (p->c_type & TMP)) { #ifdef TMPCELL p->c_type = 0; sfree(p->c_sval); p->c_sval = (char *)NULL; p->c_fval = 0.0; #else if (p->c_sval != NULL) { Free(p->c_sval); p->c_sval = NULL; } p->c_type = 0; Free(p); p = NULL; #endif } } /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include #include #include #include #ifdef DOS #include #endif #include "awk.h" #include "regexp.h" #define MAXFLD 100 extern char **FS, **RS, **OFS, **ORS, **FILENAME; extern double *NF, *NR; extern double *FNR; extern double *ARGC; extern SYMBOL *argtab[]; extern CELL *getvar(); char *strsave(), *strcpy(), *getsval(), *jStrchr(), *strchr(); double getfval(), atof(); CELL *mkcell(), *mktmp(), *execute(), *patexec(); FILE *efopen(); extern CELL truecell, falsecell; extern int pateval; int infileno = 1; FILE *ifp; char record[BUFSIZ]; CELL *field[MAXFLD]; char *fs_str; regexp *fs_pat; CELL * Getline(p) NODE *p; { CELL *u; char *fnam, *s, str[BUFSIZ]; int i; FILE *fp, *getfp(); if ((int) p->n_arg[0]) /* read into var */ s = str; else s = NULL; if ((int) p->n_arg[1]) { /* file name */ u = execute(p->n_arg[1]); fnam = getsval(u); fp = getfp(fnam, (int) p->n_arg[2]); c_free(u); i = get1rec(s, fp); } else i = Getrec(s); if (s == str) { u = execute(p->n_arg[0]); setsval(u, str); } return mktmp(NUM, NULL, (double) i); } static get1rec(buf, fp) char *buf; FILE *fp; { register int c; register char rs, *s; int mflg; if (buf == NULL) buf = record; if ((rs = **RS) == '\0') { /* multi line record */ mflg = 1; rs = '\n'; } else mflg = 0; if (feof(fp) || (c = getc(fp)) == EOF) return 0; for (s = buf; ; ) { for ( ; c != rs && c != EOF; c = getc(fp)) { if (isKanji(c)) { *s++ = c; c = getc(fp); } *s++ = c; } if (mflg) { if ((c = getc(fp)) == '\n' || c == EOF) break; *s++ = '\n'; } else break; } *s = '\0'; #if 1 if (buf == record) { #else if (buf == record && c != EOF) { #endif mkfld(record, *FS, field); (*NR)++; (*FNR)++; } return s > buf || c != EOF ? 1 : 0; } Getrec(s) char *s; { CELL *u; char *file, str[8]; while (ifp == stdin || infileno < (int)*ARGC) { if (ifp == NULL) { *FNR = 0.0; if (infileno == (int)*ARGC) break; sprintf(str, "%d", infileno); u = getvar(str, argtab); file = getsval(u); if (strchr(file, '=') != NULL) { setvar(file); infileno++; continue; } else if (strcmp(file, "") == 0) { /* if (infileno == (int)*ARGC - 1) ifp = stdin; */ infileno++; continue; } else { if (strcmp(file, "-") == 0) ifp = stdin; else ifp = efopen(file, "r"); *FILENAME = file; } } if (get1rec(s, ifp)) return 1; else { if (ifp != stdin) fclose(ifp); ifp = NULL; infileno++; } } ifp = stdin; /* for further "getline" */ *FILENAME = "-"; return 0; /* EOF */ } mkfld(rec, sep, fld) char *rec, *sep; CELL *fld[]; { char *s, *t; char str[BUFSIZ]; int i, j, n; int skip = 0; if (strlen(sep) > 1) return r_mkfld(rec, sep, fld); if (*sep == ' ' || *sep == '\0') { sep = " \t\n"; skip++; } for (i = 1, n = (int) *NF; i <= n; i++) { sfree(fld[i]->c_sval); sfree(fld[i]); fld[i] = NULL; } for (i = 0, s = rec; ; ) { t = str; if (skip) { while (*s && strchr(" \t\n", *s)) s++; if (*s == '\0') break; } while (*s && !jStrchr(sep, *s)) { if (isKanji(*s)) *t++ = *s++; *t++ = *s++; } *t = '\0'; if (isnum(str)) fld[++i] = mkcell(FLD|STR|NUM, str, atof(str)); else fld[++i] = mkcell(FLD|STR, str, 0.0); if (*s) s++; else break; } *NF = (double) i; return i; } static r_mkfld(rec, sep, fld) char *rec, *sep; CELL *fld[]; { char *s, *t; char str[BUFSIZ]; int i, n; regexp *mkpat(); extern int r_start, r_length; if (strcmp(*FS, fs_str) != 0) { sfree(fs_str); sfree(fs_pat); fs_str = strsave(*FS); fs_pat = mkpat(fs_str); } for (i = 1, n = (int) *NF; i <= n; i++) { sfree(fld[i]->c_sval); sfree(fld[i]); fld[i] = NULL; } for (i = 0, s = rec, t = str; *s; ) { if (match(fs_pat, s)) { for (n = r_start; --n > 0; ) *t++ = *s++; } else { while (*s) *t++ = *s++; } *t = '\0'; t = str; fld[++i] = mkcell(FLD|STR, str, 0.0); if (*s) s += r_length; } *NF = (double) i; return i; } mkrec(u) CELL *u; { register char *s, *t; register int i, j; for (j = (int)*NF, i = 1; i <= j; i++) if (field[i] == u) break; if (i > j) { for ( ; i < MAXFLD; i++) if (field[i] == u) break; if (i == MAXFLD) error("too many field (%d)", i); *NF = (double)i; } for (t = record, i = 1, j = (int) *NF; i <= j; i++) { if (i > 1) *t++ = **OFS; for (s = getsval(field[i]); *s; ) *t++ = *s++; } *t++ = '\0'; } CELL * Field(p) NODE *p; { CELL *u; int i, j; u = execute(p->n_arg[0]); i = (int) getfval(u); c_free(u); j = (int)*NF; if (i > j) for (++j; j <= i; j++) { if (field[j] == NULL) field[j] = mkcell(FLD|STR, "", 0.0); } return field[i]; } CELL * P1stat(p) NODE *p; { CELL *u; double x; pateval++; u = execute(p->n_arg[0]); pateval = 0; x = getfval(u); c_free(u); if (x != 0.0) u = execute(p->n_arg[1]); else u = &truecell; return u; } CELL * P2stat(p) NODE *p; { static stat = 0; CELL *u, *v; double x; switch (stat) { case 0: pateval++; u = execute(p->n_arg[0]); pateval = 0; x = getfval(u); c_free(u); if (x == 0.0) { u = &truecell; break; } else stat++; /* fall through */ case 1: u = execute(p->n_arg[2]); c_free(u); pateval++; u = execute(p->n_arg[1]); pateval = 0; x = getfval(u); if (x != 0.0) stat = 0; break; default: u = &truecell; break; } return u; } CELL * Print0() { /* int i, j; char *s, str[BUFSIZ]; for (*str = '\0', i = 1, j = (int) *NF; i <= j; i++) { if (i > 1) strcat(str, *OFS); s = getsval(field[i]); strcat(str, s); } strcat(str, *ORS); fputs(str, stdout); */ fprintf(stdout, "%s%s", record, *ORS); return &truecell; } char * format(t, p) char *t; NODE *p; { CELL *u, *v; char *r, *s, *s0, fmt[BUFSIZ]; double x; int i; u = execute(p->n_arg[2]); s = s0 = getsval(u); /* printf("fmt(%s)\n", s); */ for (i = 3; *s; s++) { if (isKanji(*s)) { *t++ = *s++; *t++ = *s; continue; } if (*s != '%') { *t++ = *s; continue; } else if (*(s + 1) == '%') { *t++ = *s++; continue; } for (r = fmt, *r++ = *s++; *r++ = *s; s++) { if (strchr("%cdefgosux", *s)) break; } *r = '\0'; if (p->n_arg[i] == NULL) error("not enough args in printf(%s)", s0); v = execute(p->n_arg[i++]); if (*s == 's') r = getsval(v); else x = getfval(v); /* printf("val(%d)(%s)\n", v->c_type, v->c_sval); */ switch (*s) { case 'c': sprintf(t, fmt, (int) x); break; case 'd': if (*(s - 1) != 'l') { *--r = 'l'; *++r = 'd'; *++r = '\0'; } sprintf(t, fmt, (long) x); break; case 'e': case 'f': case 'g': sprintf(t, fmt, x); break; case 'o': case 'u': case 'x': if (*(s - 1) == 'l') sprintf(t, fmt, (long) x); else sprintf(t, fmt, (int) x); break; case 's': /*r = getsval(v);*/ sprintf(t, fmt, r); break; default: strcpy(t, fmt); break; } c_free(v); t += strlen(t); } c_free(u); *t = '\0'; } #define MAXFILE 10 struct { char *f_name; /* file name */ FILE *f_fp; int f_type; } filetab[MAXFILE]; FILE * getfp(file, type) char *file; { register int i; register char *name, *mode; char *awktmp(); FILE *fp, *efopen(), *epopen(); for (i = 0; i < MAXFILE; i++) if (filetab[i].f_name && strcmp(filetab[i].f_name, file) == 0) return filetab[i].f_fp; for (i = 0; i < MAXFILE; i++) if (!filetab[i].f_fp) break; if (i == MAXFILE) error("too many files to open"); name = file; switch (type) { case R_OUT: mode = "w"; break; case R_APD: mode = "a"; break; case R_POUT: #ifdef DOS name = awktmp(i); mode = "w"; /* MS-DOS */ #else fp = epopen(file, "w"); goto g1; #endif break; case R_IN: mode = "r"; break; case R_PIN: #ifdef DOS { int savefd, fd, rf:h:i:j:esult; name = awktmp(i); if ((fd = open(name, O_WRONLY|O_TEXT|O_CREAT|O_TRUNC,S_IREAD|S_IWRITE)) == -1) error("can't open %s", name); savefd = dup(1); dup2(fd, 1); close(fd); if ((result = system(file)) == -1) error("can't exec %s", file); dup2(savefd, 1); close(savefd); close(fd); mode = "r"; } #else fp = epopen(file,"r"); goto g1; #endif break; } fp = efopen(name, mode); g1: filetab[i].f_name = strsave(file); filetab[i].f_type = type; filetab[i].f_fp = fp; return fp; } closeall() { register int i; for (i = 0; i < MAXFILE; i++) close1(i); } CELL * Close(s) char *s; { register int i; for (i = 0; i < MAXFILE; i++) if (strcmp(s, filetab[i].f_name) == 0) { close1(i); break; } i = (i == MAXFILE) ? 0 : 1; return mktmp(NUM, NULL, (double) i); } static close1(i) { int fd, result, savefd; char *awktmp(); if (filetab[i].f_fp == NULL) return; switch (filetab[i].f_type) { case R_PIN: #ifdef DOS fclose(filetab[i].f_fp); unlink(awktmp(i)); #else pclose(filetab[i].f_fp); #endif break; case R_IN: case R_OUT: case R_APD: fclose(filetab[i].f_fp); break; case R_POUT: #ifdef DOS fclose(filetab[i].f_fp); if ((fd = open(awktmp(i), O_RDONLY)) == NULL) error("can't open %s", awktmp(i)); savefd = dup(0); dup2(fd, 0); close(fd); if ((result = system(filetab[i].f_name)) == -1) /* spawnl(P_WAIT, "/usr/bin/sh", "sh", "-c", filetab[i].f_name, (char *) 0)) == -1) fprintf(stderr, "can't spawn /bin/sh\n"); */ error("can't exec %s", filetab[i].f_name); dup2(savefd, 0); close(savefd); unlink(awktmp(i)); #else pclose(filetab[i].f_fp); #endif break; } sfree(filetab[i].f_name); filetab[i].f_type = 0; filetab[i].f_name = NULL; filetab[i].f_fp = NULL; } #ifndef DOS FILE * epopen(file, mod) char *file, *mod; { FILE *fp, *popen(); if ((fp = popen(file, mod)) == NULL) error("can't poen %s", file); return fp; } #endif static char * awktmp(i) { static char str[16]; sprintf(str, "awk000%02d.tmp", i); return str; } Index(s, t) char *s, *t; { register char *u, *v; register int i; for (i = 1; *s; s++, i++) { for (u = s, v = t; *v; u++, v++) { if (isKanji(*v)) { if (*u != *v) break; u++; v++; } if (*u != *v) break; } if (*v == '\0') return i; if (isKanji(*s)) s++; } return 0; } /* * regcomp and regexec -- regsub and regerror are elsewhere * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in * regular-expression syntax might require a total rethink. * * Modified by K.Hirabayashi to accept KANJI code, memory allocation * and to add following functions. * isthere(), mkpat(), match(), regsub(), sjtok(), ktosj(), * Strchr(), Strncmp(), Strlen() */ #include #include #include "regexp.h" #define regerror(a) error("regular expression error: %s", a) int r_start, r_length; /* * The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 /* * The "internal use only" fields in regexp.h are present to pass info from * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * * regstart char that must begin a match; '\0' if none obvious * reganch is the match anchored (at beginning-of-line only)? * regmust string (pointer into program) that match must include, or NULL * regmlen length of regmust string * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection * of lines that cannot possibly match. The regmust tests are costly enough * that regcomp() supplies a regmust only if the r.e. contains something * potentially expensive (at present, the only such thing detected is * or + * at the start of the r.e., which can involve a lot of backup). Regmlen is * supplied because the test in regexec() needs it and regcomp() is computing * it anyway. */ /* * Structure for regexp "program". This is essentially a linear encoding * of a nondeterministic finite-state machine (aka syntax charts or * "railroad normal form" in parsing technology). Each node is an opcode * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH implement concatenation; a "next" pointer with * a BRANCH on both ends of it is connecting two alternatives. (Here we * have one of the subtle syntax dependencies: an individual BRANCH (as * opposed to a collection of them) is never concatenated with anything * because of operator precedence.) The operand of some types of node is * a literal string; for others, it is a node leading into a sub-FSM. In * particular, the operand of a BRANCH node is the first node of the branch. * (NB this is *not* a tree structure: the tail of the branch connects * to the thing following the set of BRANCHes.) The opcodes are: */ /* definition number opnd? meaning */ #define END 0 /* no End of program. */ #define BOL 1 /* no Match "" at beginning of line. */ #define EOL 2 /* no Match "" at end of line. */ #define ANY 3 /* no Match any one character. */ #define ANYOF 4 /* str Match any character in this string. */ #define ANYBUT 5 /* str Match any character not in this string. */ #define BRANCH 6 /* node Match this alternative, or the next... */ #define BACK 7 /* no Match "", "next" ptr points backward. */ #define EXACTLY 8 /* str Match this string. */ #define NOTHING 9 /* no Match empty string. */ #define STAR 10 /* node Match this (simple) thing 0 or more times. */ #define PLUS 11 /* node Match this (simple) thing 1 or more times. */ #define OPEN 20 /* no Mark this point in input as start of #n. */ /* OPEN+1 is number 1, etc. */ #define CLOSE 30 /* no Analogous to OPEN. */ /* * Opcode notes: * * BRANCH The set of branches constituting a single choice are hooked * together with their "next" pointers, since precedence prevents * anything being concatenated to any individual branch. The * "next" pointer of the last BRANCH in a choice points to the * thing following the whole choice. This is also where the * final "next" pointer of each individual branch points; each * branch starts with the operand node of a BRANCH node. * * BACK Normal "next" pointers all implicitly point forward; BACK * exists to make loop structures possible. * * STAR,PLUS '?', and complex '*' and '+', are implemented as circular * BRANCH structures using BACK. Simple cases (one character * per match) are implemented with STAR and PLUS for speed * and to minimize recursive plunges. * * OPEN,CLOSE ...are numbered at compile time. */ /* * A node is one char of opcode followed by two chars of "next" pointer. * "Next" pointers are stored as two 8-bit pieces, high order first. The * value is a positive offset from the opcode of the node containing it. * An operand, if any, simply follows the node. (Note that much of the * code generation knows about this implicit relationship.) * * Using two bytes for the "next" pointer is vast overkill for most things, * but allows patterns to get big without disasters. */ #define OP(p) (*(p)) #define NEXT(p) (((*((p)+1)&0377)<<8) + *((p)+2)&0377) #define OPERAND(p) ((p) + 3) /* * Utility definitions. */ #ifndef CHARBITS #define UCHARAT(p) ((int)*(ushort *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif #define FAIL(m) { regerror(m); return(NULL); } #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') #define META "^$.[()|?+*\\" /* * Flags to be passed up and down. */ #define HASWIDTH 01 /* Known never to match null string. */ #define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ #define SPSTART 04 /* Starts with * or +. */ #define WORST 0 /* Worst case. */ /* * Global work variables for regcomp(). */ static ushort *regparse; /* Input-scan pointer. */ static int regnpar; /* () count. */ static ushort regdummy; static ushort *regcode; /* Code-emit pointer; ®dummy = don't. */ static long regsize; /* Code size. */ /* * Forward declarations for regcomp()'s friends. */ #ifndef STATIC #define STATIC static #endif STATIC ushort *reg(); STATIC ushort *regbranch(); STATIC ushort *regpiece(); STATIC ushort *regatom(); STATIC ushort *regnode(); STATIC ushort *regnext(); STATIC void regc(); STATIC void reginsert(); STATIC void regtail(); STATIC void regoptail(); STATIC int Strcspn(); /* - regcomp - compile a regular expression into internal code * * We can't allocate space until we know how big the compiled form will be, * but we can't compile it (and thus know how big it is) until we've got a * place to put the code. So we cheat: we compile it twice, once with code * generation turned off and size counting turned on, and once "for real". * This also means that we don't allocate space until we are sure that the * thing really will compile successfully, and we never have to move the * code and thus invalidate pointers into it. (Note that it has to be in * one piece because free() must be able to free it all.) * * Beware that the optimization-preparation code in here knows about some * of the structure of the compiled regexp. */ regexp * regcomp(exp) ushort *exp; { register regexp *r; register ushort *scan; register ushort *longest; register int len; int flags; extern char *emalloc(); if (exp == NULL) FAIL("NULL argument"); /* First pass: determine size, legality. */ regparse = exp; regnpar = 1; regsize = 0L; regcode = ®dummy; regc((ushort) MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Small enough for pointer-storage convention? */ if (regsize >= 32767L) /* Probably could be 65535L. */ FAIL("regexr:t:u:v:w:x:y:z:{:|:}:~:::::::::::::p too big"); /* Allocate space. */ r = (regexp *)emalloc(sizeof(regexp) + (unsigned)regsize * sizeof(ushort)); /* Second pass: emit code. */ regparse = exp; regnpar = 1; regcode = r->program; regc((ushort) MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Dig out information for optimizations. */ r->regstart = '\0'; /* Worst-case defaults. */ r->reganch = 0; r->regmust = NULL; r->regmlen = 0; scan = r->program+1; /* First BRANCH. */ if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ scan = OPERAND(scan); /* Starting-point info. */ if (OP(scan) == EXACTLY) r->regstart = *OPERAND(scan); else if (OP(scan) == BOL) r->reganch++; /* * If there's something expensive in the r.e., find the * longest literal string that must appear and make it the * regmust. Resolve ties in favor of later strings, since * the regstart check works with the beginning of the r.e. * and avoiding duplication strengthens checking. Not a * strong reason, but sufficient in the absence of others. */ if (flags&SPSTART) { longest = NULL; len = 0; for (; scan != NULL; scan = regnext(scan)) if (OP(scan) == EXACTLY && Strlen(OPERAND(scan)) >= len) { longest = OPERAND(scan); len = Strlen(OPERAND(scan)); } r->regmust = longest; r->regmlen = len; } } return(r); } /* - reg - regular expression, i.e. main body or parenthesized thing * * Caller must absorb opening parenthesis. * * Combining parenthesis handling with the base level of regular expression * is a trifle forced, but the need to tie the tails of the branches to what * follows makes it hard to avoid. */ static ushort * reg(paren, flagp) int paren; /* Parenthesized? */ int *flagp; { register ushort *ret; register ushort *br; register ushort *ender; register int parno; int flags; *flagp = HASWIDTH; /* Tentatively. */ /* Make an OPEN node, if parenthesized. */ if (paren) { if (regnpar >= NSUBEXP) FAIL("too many ()"); parno = regnpar; regnpar++; ret = regnode(OPEN+parno); } else ret = NULL; /* Pick up the branches, linking them together. */ br = regbranch(&flags); if (br == NULL) return(NULL); if (ret != NULL) regtail(ret, br); /* OPEN -> first. */ else ret = br; if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; while (*regparse == '|') { regparse++; br = regbranch(&flags); if (br == NULL) return(NULL); regtail(ret, br); /* BRANCH -> BRANCH. */ if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; } /* Make a closing node, and hook it on the end. */ ender = regnode((paren) ? CLOSE+parno : END); regtail(ret, ender); /* Hook the tails of the branches to the closing node. */ for (br = ret; br != NULL; br = regnext(br)) regoptail(br, ender); /* Check for proper termination. */ if (paren && *regparse++ != ')') { FAIL("unmatched ()"); } else if (!paren && *regparse != '\0') { if (*regparse == ')') { FAIL("unmatched ()"); } else FAIL("junk on end"); /* "Can't happen". */ /* NOTREACHED */ } return(ret); } /* - regbranch - one alternative of an | operator * * Implements the concatenation operator. */ static ushort * regbranch(flagp) int *flagp; { register ushort *ret; register ushort *chain; register ushort *latest; int flags; *flagp = WORST; /* Tentatively. */ ret = regnode(BRANCH); chain = NULL; while (*regparse != '\0' && *regparse != '|' && *regparse != ')') { latest = regpiece(&flags); if (latest == NULL) return(NULL); *flagp |= flags&HASWIDTH; if (chain == NULL) /* First piece. */ *flagp |= flags&SPSTART; else regtail(chain, latest); chain = latest; } if (chain == NULL) /* Loop ran zero times. */ (void) regnode(NOTHING); return(ret); } /* - regpiece - something followed by possible [*+?] * * Note that the branching code sequences used for ? and the general cases * of * and + are somewhat optimized: they use the same NOTHING node as * both the endmarker for their branch list and the body of the last branch. * It might seem that this node could be dispensed with entirely, but the * endmarker role is not redundant. */ static ushort * regpiece(flagp) int *flagp; { register ushort *ret; register ushort op; register ushort *next; int flags; ret = regatom(&flags); if (ret == NULL) return(NULL); op = *regparse; if (!ISMULT(op)) { *flagp = flags; return(ret); } if (!(flags&HASWIDTH) && op != '?') FAIL("*+ operand could be empty"); *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); if (op == '*' && (flags&SIMPLE)) reginsert(STAR, ret); else if (op == '*') { /* Emit x* as (x&|), where & means "self". */ reginsert(BRANCH, ret); /* Either x */ regoptail(ret, regnode(BACK)); /* and loop */ regoptail(ret, ret); /* back */ regtail(ret, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '+' && (flags&SIMPLE)) reginsert(PLUS, ret); else if (op == '+') { /* Emit x+ as x(&|), where & means "self". */ next = regnode(BRANCH); /* Either */ regtail(ret, next); regtail(regnode(BACK), ret); /* loop back */ regtail(next, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '?') { /* Emit x? as (x|) */ reginsert(BRANCH, ret); /* Either x */ regtail(ret, regnode(BRANCH)); /* or */ next = regnode(NOTHING); /* null. */ regtail(ret, next); regoptail(ret, next); } regparse++; if (ISMULT(*regparse)) FAIL("nested *?+"); return(ret); } /* - regatom - the lowest level * * Optimization: gobbles an entire sequence of ordinary characters so that * it can turn them into a single node, which is smaller to store and * faster to run. Backslashed characters are exceptions, each becoming a * separate node; the code is simpler that way and it's not worth fixing. */ static ushort * regatom(flagp) int *flagp; { register ushort *ret; int flags; ushort c, d; *flagp = WORST; /* Tentatively. */ switch ((int) *regparse++) { case '^': ret = regnode(BOL); break; case '$': ret = regnode(EOL); break; case '.': ret = regnode(ANY); *flagp |= HASWIDTH|SIMPLE; break; case '[': { register int class; register int classend; register int c; if (*regparse == '^') { /* Complement of range. */ ret = regnode(ANYBUT); regparse++; } else ret = regnode(ANYOF); if (*regparse == ']' || *regparse == '-') regc(*regparse++); while (*regparse != '\0' && *regparse != ']') { if (*regparse == '-') { regparse++; if (*regparse == ']' || *regparse == '\0') regc((ushort) '-'); else { class = UCHARAT(regparse-2)+1; classend = UCHARAT(regparse); if (class > classend+1) FAIL("invalid [] range"); regc((ushort) 0xffff); regc((ushort) class); regc((ushort) classend); regparse++; } } else { if ((c = *regparse++) == '\\') { if ((c = *regparse++) == 'n') c = '\n'; else if (c == 't') c = '\t'; } regc(c); } } regc((ushort) 0); if (*regparse != ']') FAIL("unmatched []"); regparse++; *flagp |= HASWIDTH|SIMPLE; } break; case '(': ret = reg(1, &flags); if (ret == NULL) return(NULL); *flagp |= flags&(HASWIDTH|SPSTART); break; case '\0': case '|': case ')': FAIL("internal urp"); /* Supposed to be caught earlier. */ break; case '?': case '+': case '*': FAIL("?+* follows nothing"); break; case '\\': if (*regparse == '\0') FAIL("trailing \\"); ret = regnode(EXACTLY); /* regc(*regparse++); */ c = *regparse++; if (c == 'n') c = '\n'; else if (c == 't') c = '\t'; else if (c == 'f') c = '\f'; else if (c == '\r') c = '\r'; else if (c == '\b') c = '\b'; else if (IsDigid(c)) { d = c - '0'; if (IsDigid(*regparse)) { d = d * 8 + *regparse++ - '0'; if (IsDigid(*regparse)) d = d * 8 + *regparse++ - '0'; } c = d; } regc(c); regc((ushort) 0); *flagp |= HASWIDTH|SIMPLE; break; default: { register int len; register char ender; regparse--; len = Strcspn(regparse, META); if (len <= 0) FAIL("internal disaster"); ender = *(regparse+len); if (len > 1 && ISMULT(ender)) len--; /* Back off clear of ?+* operand. */ *flagp |= HASWIDTH; if (len == 1) *flagp |= SIMPLE; ret = regnode(EXACTLY); while (len > 0) { regc(*regparse++); len--; } regc((ushort) 0); } break; } return(ret); } IsDigid(c) ushort c; { return '0' <= c && c <= '9'; } /* - regnode - emit a node */ static ushort * /* Location. */ regnode(op) ushort op; { register ushort *ret; register ushort *ptr; ret = regcode; if (ret == ®dummy) { regsize += 3; return(ret); } ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0'; regcode = ptr; return(ret); } /* - regc - emit (if appropriate) a byte of code */ static void regc(b) ushort b; { if (regcode != ®dummy) *regcode++ = b; else regsize++; } /* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */ static void reginsert(op, opnd) ushort op; ushort *opnd; { register ushort *src; register ushort *dst; register ushort *place; if (regcode == ®dummy) { regsize += 3; return; } src = regcode; regcode += 3; dst = regcode; while (src > opnd) *--dst = *--src; place = opnd; /* Op node, where operand used to be. */ *place++ = op; *place++ = '\0'; *place++ = '\0'; } /* - regtail - set the next-pointer at the end of a node chain */ static void regtail(p, val) ushort *p; ushort *val; { register ushort *scan; register ushort *temp; register int offset; if (p == ®dummy) return; /* Find last node. */ scan = p; for (;;) { temp = regnext(scan); if (temp == NULL) break; scan = temp; } if (OP(scan) == BACK) offset = scan - val; else offset = val - scan; *(scan+1) = (offset>>8)&0377; *(scan+2) = offset&0377; } /* - regoptail - regtail on operand of first argument; nop if operandless */ static void regoptail(p, val) ushort *p; ushort *val; { /* "Operandless" and "op != BRANCH" are synonymous in practice. */ if (p == NULL || p == ®dummy || OP(p) != BRANCH) return; regtail(OPERAND(p), val); } /* * regexec and friends */ /* * Global work variables for regexec(). */ static ushort *reginput; /* String-input pointer. */ static ushort *regbol; /* Beginning of input, for ^ check. */ static ushort **regstartp; /* Pointer to startp array. */ static ushort **regendp; /* Ditto for endp. */ /* * Forwards. */ STATIC int regtry(); STATIC int regmatch(); STATIC int regrepeat(); #ifdef DEBUG int regnarrate = 0; void regdump(); STATIC char *regprop(); #endif /* - regexec - match a regexp against a string */ int regexec(prog, string, bolflag) register regexp *prog; register ushort *string; int bolflag; { register ushort *s; extern ushort *Strchr(); /* Be paranoid... */ if (prog == NULL || string == NULL) { regerror("NULL parameter"); return(0); } /* Check validity of program. */ if (prog->program[0] != MAGIC) { regerror("corrupted program"); return(0); } /* If there is a "must appear" string, look for it. */ if (prog->regmust != NULL) { s = string; while ((s = Strchr(s, prog->regmust[0])) != NULL) { if (Strncmp(s, prog->regmust, prog->regmlen) == 0) break; /* Found it. */ s++; } if (s == NULL) /* Not present. */ return(0); } /* Mark beginning of line for ^ . */ if(bolflag) regbol = string; else regbol = NULL; /* Simplest case: anchored match need be tried only once. */ if (prog->reganch) return(regtry(prog, string)); /* Messy cases: unanchored match. */ s = string; if (prog->regstart != '\0') { /* We know what char it must start with. */ while ((s = Strchr(s, prog->regstart)) != NULL) { if (regtry(prog, s)) return(1); s++; } } else /* We don't -- general case. */ do { if (regtry(prog, s)) return(1); } while (*s++ != '\0'); /* Failure. */ return(0); } /* - regtry - try match at specific point */ static int /* 0 failure, 1 success */ regtry(prog, string) regexp *prog; ushort *string; { register int i; register ushort **sp; register ushort **ep; reginput = string; regstartp = prog->startp; regendp = prog->endp; sp = prog->startp; ep = prog->endp; for (i = NSUBEXP; i > 0; i--) { *sp++ = NULL; *ep++ = NULL; } if (regmatch(prog->program + 1)) { prog->startp[0] = string; prog->endp[0] = reginput; return(1); } else return(0); } /* - regmatch - main matching routine * * Conceptually the strategy is simple: check to see whether the current * node matches, call self recursively to see whether the rest matches, * and then act accordingly. In practice we make some effort to avoid * recursion, in particular by going through "ordinary" nodes (that don't * need to know whether the rest of the match failed) by a loop instead of * by recursion. */ static int /* 0 failure, 1 success */ regmatch(prog) ushort *prog; { register ushort *scan; /* Current node. */ ushort *next; /* Next node. */ extern ushort *Strchr(); scan = prog; #ifdef DEBUG if (scan != NULL && regnarrate) fprintf(stderr, "%s(\n", regprop(scan)); #endif while (scan != NULL) { #ifdef DEBUG if (regnarrate) fprintf(stderr, "%s...\n", regprop(scan)); #endif next = regnext(scan); switch ((int) OP(scan)) { case BOL: if (reginput != regbol) return(0); break; case EOL: if (*reginput != '\0') return(0); break; case ANY: if (*reginput == '\0') return(0); reginput++; break; case EXACTLY: { register int len; register ushort *opnd; opnd = OPERAND(scan); /* Inline the first character, for speed. */ if (*opnd != *reginput) return(0); len = Strlen(opnd); if (len > 1 && Strncmp(opnd, reginput, len) != 0) return(0); reginput += len; } break; case ANYOF: if (*reginput == '\0' || isthere(OPERAND(scan), *reginput) == 0) return(0); reginput++; break; case ANYBUT: if (*reginput == '\0' || isthere(OPERAND(scan), *reginput) != 0) return(0); reginput++; break; case NOTHING: break; case BACK: break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: { register int no; register ushort *save; no = OP(scan) - OPEN; save = reginput; if (regmatch(next)) { /* * Don't set startp if some later * invocation of the same parentheses * already has. */ if (regstartp[no] == NULL) regstartp[no] = save; return(1); } else return(0); } break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: { register int no; register ushort *save; no = OP(scan) - CLOSE; save = reginput; if (regmatch(next)) { /* * Don't set endp if some later * invocation of the same parentheses * already has. */ if (regendp[no] == NULL) regendp[no] = save; return(1); } else return(0); } break; case BRANCH: { register ushort *save; if (OP(next) != BRANCH) /* No choice. */ next = OPERAND(scan); /* Avoid recursion. */ else { do { save = reginput; if (regmatch(OPERAND(scan))) return(1); reginput = save; scan = regnext(scan); } while (scan != NULL && OP(scan) == BRANCH); return(0); /* NOTREACHED */ } } break; case STAR: case PLUS: { register ushort nextch; register int no; register ushort *save; register int min; /* * Lookahead to avoid useless match attempts * when we know what character comes next. */ nextch = '\0'; if (OP(next) == EXACTLY) nextch = *OPERAND(next); min = (OP(scan) == STAR) ? 0 : 1; save = reginput; no = regrepeat(OPERAND(scan)); while (no >= min) { /* If it could work, try it. */ if (nextch == '\0' || *reginput == nextch) if (regmatch(next)) return(1); /* Couldn't or didn't -- back up. */ no--; reginput = save + no; } return(0); } break; case END: return(1); /* Success! */ break; default: regerror("memory corruption"); return(0); break; } scan = next; } /* * We get here only if there's trouble -- normally "case END" is * the terminating point. */ regerror("corrupted pointers"); return(0); } /* - regrepeat - repeatedly match something simple, report how many */ static int regrepeat(p) ushort *p; { register int count = 0; register ushort *scan; register ushort *opnd; scan = reginput; opnd = OPERAND(p); switch (OP(p)) { case ANY: count = Strlen(scan); scan += count; break; case EXACTLY: while (*opnd == *scan) { count++; scan++; } break; case ANYOF: while (*scan != '\0' && isthere(opnd, *scan) != 0) { count++; scan++; } break; case ANYBUT: while (*scan != '\0' && isthere(opnd, *scan) == 0) { count++; scan++; } break; default: /* Oh dear. Called inappropriately. */ regerror("internal foulup"); count = 0; /* Best compromise. */ break; } reginput = scan; return(count); } /* - regnext - dig the "next" pointer out of a node */ static ushort * regnext(p) register ushort *p; { register int offset; if (p == ®dummy) return(NULL); offset = NEXT(p); if (offset == 0) return(NULL); if (OP(p) == BACK) return(p-offset); else return(p+offset); } #ifdef DEBUG STATIC char *regprop(); /* - regdump - dump a regexp onto stdout in vaguely comprehensible form */ void regdump(r) regexp *r; { register ushort *s; register ushort op = EXACTLY; /* Arbitrary non-END op. */ register ushort *next; s = r->program + 1; while (op != END) { /* While that wasn't END last time... */ op = OP(s); printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */ next = regnext(s); if (next == NULL) /* Next ptr. */ printf("(0)"); else printf("(%d)", (s-r->program)+(next-s)); s += 3; if (op == ANYOF || op == ANYBUT || op == EXACTLY) { /* Literal string, where present. */ while (*s != '\0') { if (*s == 0xffff) { /* range */ kputchar(*++s); putchar('-'); ++s; } kputchar(*s++); } s++; } putchar('\n'); } /* Header fields of interest. */ if (r->regstart != '\0') { fputs("start `", stdout); kputchar(r->regstart); fputs("' ", stdout); } if (r->reganch) printf("anchored "); if (r->regmust != NULL) { fputs("must have \"", stdout); kputs(r->regmust); putchar('"'); } printf("\n"); } kputchar(c) ushort c; { if (c & 0xff00) putchar(c >> 8); putchar(c & 0xff); } kputs(s) ushort *s; { while (*s) kputchar(*s++); } /* - regprop - printable representation of opcode */ static char * regprop(op) ushort *op; { register char *p; static char buf[50]; (void) strcpy(buf, ":"); switch ((int) OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case ANYBUT: p = "ANYBUT"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); p = NULL; break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); p = NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; default: regerror("corrupted opcode"); break; } if (p != NULL) (void) strcat(buf, p); return(buf); } #endif /* * The following is provided for those people who do not have strcspn() in * their C libraries. They should get off their butts and do something * about it; at least one public-domain implementation of those (highly * useful) string routines has been published on Usenet. */ /* * strcspn - find length of initial segment of s1 consisting entirely * of characters not from s2 */ static int Strcspn(s1, s2) ushort *s1; unsigned char *s2; { register ushort *scan1; register unsigned char *scan2; register int count; count = 0; for (scan1 = s1; *scan1 != '\0'; scan1++) { for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */ if (*scan1 == *scan2++) return(count); count++; } return(count); } isthere(s, c) ushort *s, c; { register unsigned int c1, c2; for ( ; *s; s++) { if (*s == 0xffff) { /* range */ c1 = *++s; c2 = *++s; if (c1 <= c && c <= c2) return 1; } else if (*s == c) return 1; } return 0; } ushort * Strchr(s, c) ushort *s, c; { for ( ; *s; s++) if (*s == c) return s; return NULL; } Strncmp(s, t, n) ushort *s, *t; { for ( ; --n > 0 && *s == *t; s++, t++) ; return *s - *t; } Strlen(s) ushort *s; { int i; for (i = 0; *s; i++, s++) ; return i; } ushort kbuf[BUFSIZ]; char * mkpat(s) char *s; { sjtok(kbuf, s); return (char *) regcomp(kbuf); } match(p, s) regexp *p; char *s; { register int i; sjtok(kbuf, s); if (i = regexec(p, kbuf, 1)) { r_start = p->startp[0] - kbuf + 1; r_length = p->endp[0] - p->startp[0]; } else r_start = r_length = 0; return i; } sjtok(s, t) ushort *s; unsigned char *t; { register c; for ( ; *t; t++) { if (isKanji(c = *t)) c = (c << 8) | (*++t & 0xff); *s++ = c; } *s = 0; } ktosj(s, t) unsigned char *s; ushort *t; { register c; while (*t) { if ((c = *t++) & 0xff00) *s++ = c >> 8; *s++ = c & 0xff; } *s = '\0'; } regsub(dst, exp, src, pat, pos) ushort *dst, *src, *pat; regexp *exp; { /* dst <-- s/src/pat/pos global substitution for pos == 0 */ register int c, i; register ushort *loc1, *loc2, *s, *t, *u; register int n = 0; if (exp->program[0] != MAGIC) { regerror("damaged regexp fed to regsub"); return 0; } while (*src) { next: if (regexec(exp, src, 1) == 0) break; loc1 = exp->startp[0]; loc2 = exp->endp[0]; if (pos-- > 1) { while (src < loc2) *dst++ = *src++; goto next; } while (src < loc1) *dst++ = *src++; for (s = pat; c = *s++; ) { if (c == '&') i = 0; else if (c == '\\' && '0' <= *s && *s <= '9') i = *s++ - '0'; else { if (c == '\\' && (*s == '\\' || *s == '&')) c = *s++; *dst++ = c; continue; } if ((t = exp->startp[i]) != NULL && (u = exp->endp[i]) != NULL) { while (t < u) *dst++ = *t++; } } src = loc2; n++; if (pos == 0) break; } while (*src) *dst++ = *src++; *dst++ = 0; return n; } static ushort kbuf1[BUFSIZ], kbuf2[BUFSIZ]; Sub(u, exp, str, s, t, pos) char *exp; char *s, *t, *u; { register int i; regexp *r; if (str) { sjtok(kbuf, exp); r = regcomp(kbuf); } else r = (regexp *) exp; sjtok(kbuf, s); sjtok(kbuf1, t); i = regsub(kbuf2, r, kbuf1, kbuf, pos); ktosj(u, kbuf2); if (str) sfree(r); return i; } /* * Definitions etc. for regexp(3) routines. * * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], * not the System V one. */ #define ushort unsigned short #define CHARBITS 0xffff #define NSUBEXP 10 typedef struct regexp { ushort *startp[NSUBEXP]; ushort *endp[NSUBEXP]; ushort regstart; /* Internal use only. */ ushort reganch; /* Internal use only. */ ushort *regmust; /* Internal use only. */ int regmlen; /* Internal use only. */ ushort program[1]; /* Unwarranted chumminess with compiler. */ } regexp; extern regexp *regcomp(); extern int regexec(); extern int regsub(); extern int regerror(); /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include #include "awk.h" #include "regexp.h" #define PI 3.14159265358979323846 #define HASHSIZE 50 #define MAXFIELD 100 double atof(); char *getsval(), *jStrchar(); extern CELL *execute(), *_Arg(); extern char record[]; extern CELL *field[]; extern CELL truecell, falsecell; extern prmflg; SYMBOL *hashtab[HASHSIZE]; SYMBOL *funtab[HASHSIZE]; SYMBOL *argtab[HASHSIZE]; char *strsave(), *emalloc(), *strchr(); CELL *lookup(), *install(), *_install(), *mkcell(), *mktmp(), *getvar(); char **FS, **RS, **OFS, **ORS, **OFMT, **FILENAME; char **SUBSEP; double *NR, *NF; double *FNR, *ARGC, *RSTART, *RLENGTH; init() { FS = &install("FS", VAR|STR, " ", 0.0, hashtab)->c_sval; RS = &install("RS", VAR|STR, "\n", 0.0, hashtab)->c_sval; OFS = &install("OFS", VAR|STR , " ", 0.0, hashtab)->c_sval; ORS = &install("ORS", VAR|STR, "\n", 0.0, hashtab)->c_sval; OFMT = &install("OFMT", VAR|STR, "%.6g", 0.0, hashtab)->c_sval; NR = &install("NR", VAR|NUM, (char *)NULL, 0.0, hashtab)->c_fval; NF = &install("NF", VAR|NUM, (char *)NULL, 0.0, hashtab)->c_fval; FILENAME = &install("FILENAME", VAR|STR, (char *)NULL, 0.0, hashtab)->c_sval; install("PI", VAR|NUM, (char *)NULL, PI, hashtab); field[0] = mkcell(REC|STR, (char *)NULL, 0.0); /* $0 */ field[0]->c_sval = record; SUBSEP = &install("SUBSEP", VAR|STR, "\034", 0.0, hashtab)->c_sval; FNR = &install("FNR", VAR|NUM, (char *)NULL, 0.0, hashtab)->c_fval; RSTART = &install("RSTART", VAR|NUM, (char *)NULL, 0.0, hashtab)->c_fval; RLENGTH = &install("RLENGTH", VAR|NUM, (char *)NULL, 0.0, hashtab)->c_fval; } setvar(s) char *s; { CELL *u; char *t; for (t = s; *t && *t != '='; t++) ; *t++ = '\0'; if ((u = lookup(s, hashtab)) == (CELL *)NULL) { if (isnum(t)) install(s, VAR|NUM|STR, t, atof(t), hashtab); else install(s, VAR|STR, t, 0.0, hashtab); } else { if (isnum(t)) setfval(u, atof(t)); else setsval(u, t); } } initarg(arg0, argc, argv) char *arg0, **argv; { CELL *u; register int i; register char str[4]; ARGC = &install("ARGC", VAR|NUM, (char *)NULL, (double)argc+1, hashtab)->c_fval; u = install("ARGV", ARR, (char *)NULL, 0.0, hashtab); u->c_sval = (char *) argtab; install("0", VAR|STR, arg0, 0.0, argtab); for (i = 0; i < argc; i++) { sprintf(str, "%d", i+1); if (isnum(argv[i])) install(str, VAR|STR|NUM, argv[i], atof(argv[i]), argtab); else install(str, VAR|STR, argv[i], 0.0, argtab); } } static hash(s) unsigned char *s; { register unsigned int h; for (h = 0; *s; ) h += *s++; return h % HASHSIZE; } CELL * lookup(s, h) char *s; SYMBOL *h[]; { register SYMBOL *p; for (p = h[hash(s)]; p; p = p->s_next) if (strcmp(s, p->s_name) == 0) return p->s_val; return (CELL *)NULL; } static CELL * install(name, type, sval, fval, h) char *name, *sval; double fval; SYMBOL *h[]; { CELL *u; if ((u = lookup(name, h)) == (CELL *)NULL) u = _install(name, type, sval, fval, h); else error("%s is doubly defined", name); return u; } static CELL * _install(name, type, sval, fval, h) char *name, *sval; double fval; SYMBOL *h[];{ register SYMBOL *p; CELL *u; int hval; p = (SYMBOL *) emalloc(sizeof(*p)); u = (CELL *) emalloc(sizeof(*u)); p->s_name = strsave(name); p->s_val = u; hval = hash(name); p->s_next = h[hval]; h[hval] = p; u->c_type = type; u->c_sval = strsave(sval); #if 0 if (!(type & NUM) && isnum(sval)) { u->c_fval = atof(sval); u->c_type |= NUM; } else #endif u->c_fval = fval; return u; } CELL * getvar(s, h, typ) char *s; SYMBOL *h[]; { CELL *u; SYMBOL *p; char *t; int i, hval; if ((u = lookup(s, h)) == (CELL *)NULL) { if (prmflg) { u = _install(s, UDF, "", 0.0, h); goto rtn; } else if (typ & ARR) { t = emalloc(sizeof(SYMBOL *) * HASHSIZE); for (i = 0; i < HASHSIZE; i++) ((SYMBOL **) t)[i] = (SYMBOL *)NULL; u = (CELL *) emalloc(sizeof(*u)); u->c_type = typ; u->c_sval = t; u->c_fval = 0.0; p = (SYMBOL *) emalloc(sizeof(*p)); p->s_name = strsave(s); p->s_val = u; hval = hash(s); p->s_next = h[hval]; h[hval] = p; } else u = _install(s, typ, "", 0.0, h); } else if (!prmflg && (u->c_type == UDF) && (typ != UDF)) { /* fix up local_var/forward_function */ if (typ == ARR) { /* printf("getvar_correct_to_array\n"); */ u->c_type = typ; sfree(u->c_sval); u->c_sval = emalloc(sizeof(SYMBOL *) * HASHSIZE); for (i = 0; i < HASHSIZE; i++) ((SYMBOL **) u->c_sval)[i] = (SYMBOL *)NULL; u->c_fval = 0.0; } else if (typ != UDF) { u->c_type = typ; } } rtn: return u; } fixarray(u) CELL *u; { int i; if (u->c_type == UDF) { /* fix up local var */ /* printf("fixarray\n"); */ u->c_type = ARR; sfree(u->c_sval); u->c_sval = emalloc(sizeof(SYMBOL *) * HASHSIZE); for (i = 0; i < HASHSIZE; i++) ((SYMBOL **) u->c_sval)[i] = (SYMBOL *)NULL; u->c_fval = 0.0; } } a_free(u) CELL *u; { /* free local array */ SYMBOL **h, *q, *r; CELL *v; int i; if (!(u->c_type & ARR)) error("try to free non array variable", (char *)0); h = (SYMBOL **) u->c_sval; for (i = 0; i < HASHSIZE; i++) for (q = h[i]; q; q = r) { r = q->s_next; sfree(q->s_name); v = q->s_val; /* CELL */ c_free(v); sfree(q); /* SYMBOL */ } sfree(u->c_sval); /* symbol table */ c_free(u); } CELL * Array(p) NODE *p; { CELL *u; char str[BUFSIZ]; int i, n; CELL *v; u = (CELL *) p->n_arg[0]; if (u->c_type == POS) { i = (int)u->c_fval; /* printf("**ARG_ARRAY(%d)*\n", i); */ u = _Arg(i); if (u->c_type == UDF) { /* fix up local array */ /* printf("local_var_to_array\n"); */ fixarray(u); } } else if (!(u->c_type & ARR)) error("non array refference"); arrayelm(p, str); u = getvar(str, u->c_sval, VAR|NUM|STR); /* "rtsort in AWK book */ return u; } static arrayelm(p, s) NODE *p; char *s; { CELL *u; int i, n; char *t; /* char *tt = s; */ n = (int) p->n_arg[1] + 2; for (i = 2; i < n; i++) { if (i > 2) *s++ = **SUBSEP; u = execute(p->n_arg[i]); for (t = getsval(u); *t; ) *s++ = *t++; c_free(u); } *s = '\0'; /* printf("array_elm(%s)\n", tt); */ } CELL * Element(p) NODE *p; { char str[BUFSIZ]; arrayelm(p, str); return mktmp(STR, str, 0.0); } CELL * Delete(p) NODE *p; { CELL *u; char str[BUFSIZ]; int i; SYMBOL *q, *r, **h; u = (CELL *) p->n_arg[0]; if (!(u->c_type & ARR)) error("can't delete non array variable"); arrayelm(p, str); h = (SYMBOL **) u->c_sval; for (r = (SYMBOL *)NULL, i = hash(str), q = h[i]; q; r = q, q = q->s_next) if (strcmp(str, q->s_name) == 0) break; if (q) { sfree(q->s_val->c_sval); sfree(q->s_name); if (r) r->s_next = q->s_next; if (q == h[i]) h[i] = (SYMBOL *)NULL; } return &truecell; } CELL * In(p) NODE *p; { SYMBOL **h, *q; CELL *u, *v; char *s; int i; u = (CELL *) p->n_arg[1]; /* array */ if (!(u->c_type & ARR)) error("%s is not an array", u->c_sval); h = (SYMBOL **) u->c_sval; if (u->c_sval != (char *)NULL) { v = execute(p->n_arg[0]); /* var */ s = getsval(v); for (i = 0; i < HASHSIZE; i++) for (q = h[i]; q; q = q->s_next) { if (strcmp(s, q->s_name) == 0) { c_free(v); return &truecell; } } c_free(v); } return &falsecell; } CELL * Split(p) NODE *p; { CELL *u, *v, *w; char *s, *t, *h, *name, *sep; int i, n, skip; char elm[8], str[BUFSIZ]; static char *s_str; static regexp *s_pat; regexp *mkpat(); extern int r_start, r_length; n = (int) p->n_arg[1]; if (n > 1) { u = execute(p->n_arg[2]); s = getsval(u); /* str */ v = execute(p->n_arg[3]); /* array */ if (!(v->c_type & ARR)) { /* printf("Split fix_to_array(%d)\n", v->c_type); */ if (v->c_type == UDF) /* fix up local array */ fixarray(v); else error("split to non array variable", (::::::char *)0); } h = v->c_sval; c_free(v); if (n > 2) { v = execute(p->n_arg[4]); sep = getsval(v); } else { v = (CELL *)NULL; sep = *FS; } if (strlen(sep) > 1) { /* reg_exp */ if (strcmp(sep, s_str) != 0) { sfree(s_str); sfree(s_pat); s_str = strsave(sep); s_pat = mkpat(s_str); } for (i = 0, t = str; *s; ) { if (match(s_pat, s)) { for (n = r_start; --n > 0; ) *t++ = *s++; } else { while(*s) *t++ = *s++; } *t = '\0'; t = str; sprintf(elm, "%d", ++i); w = getvar(elm, h, VAR); if (isnum(str)) setfval(w, atof(str)); else setsval(w, str); if (*s) s += r_length; } } else { skip = *sep == ' '; for (i = 0; t = str, *s; ) { if (skip) while (jStrchr(" \t\n", *s)) s++; if (!(*s)) break; while (*s && !jStrchr(sep, *s)) { if (isKanji(*s)) *t++ = *s++; *t++ = *s++; } *t = '\0'; sprintf(elm, "%d", ++i); w = getvar(elm, h, VAR); if (isnum(str)) setfval(w, atof(str)); else setsval(w, str); if (*s && !skip) s++; } } c_free(v); /* sep */ c_free(u); /* str may be CATed */ } else i = 0; return mktmp(NUM, (char *)NULL, (double) i); } CELL * Forin(p) NODE *p; { CELL *u, *v; SYMBOL **h, *q; char *name; int i; u = execute(p->n_arg[1]); if (!(u->c_type & ARR)) synerr( "non array variable is specified in 'for (. in var)'", (char *)0); h = (SYMBOL **) u->c_sval; c_free(u); u = execute(p->n_arg[0]); if (u->c_type == UDF) { /* printf("Forin_fix_to_VAR|NUM\n"); */ u->c_type = VAR|NUM; } if (!(u->c_type & VAR)) error("'for (VAR in .)' is not variable (%d)", name, u->c_type); for (i = 0; i < HASHSIZE; i++) { for (q = h[i]; q; q = q->s_next) { setsval(u, q->s_name); v = execute(p->n_arg[2]); c_free(v); } } c_free(u); return &truecell; } char * strsave(s) char *s; { register int n; char *emalloc(), *strcpy(); if (s == (char *)NULL) return (char *)NULL; n = strlen(s) + 1; return strcpy(emalloc(n), s); } sfree(p) char *p; { if (p != (char *)NULL) Free(p); } isnum(s) char *s; { char *strchr(); if (s == NULL || *s == '\0' || !strcmp(s, ".")) return 0; if (*s && strchr("+-", *s) != (char *)NULL) s++; if (*s == '\0') return 0; while (isdigit(*s)) s++; if (*s == '.') { s++; while (isdigit(*s)) s++; } if (*s && strchr("eE", *s) != (char *)NULL) { s++; if (*s == '\0') return 0; if (*s && strchr("+-", *s) != (char *)NULL) s++; while (isdigit(*s)) s++; } return *s == '\0'; } setfval(u, f) CELL *u; double f; { if (u->c_type == UDF) { /* fix up local var */ /* printf("setfval_fix_to_VAR\n"); */ u->c_type |= VAR; } if (u->c_type & (VAR|FLD|REC|TMP)) { u->c_type &= ~STR; u->c_type |= NUM; sfree(u->c_sval); u->c_sval = (char *)NULL; u->c_fval = f; if (u->c_type & FLD) mkrec(u); } else fprintf(stderr, "assign to nonvariable (%d)\n", u->c_type); } setsval(u, s) CELL *u; char *s; { double atof(); if (u->c_type == UDF) { /* fix up local var */ /* printf("setsval_fix_to_VAR\n"); */ u->c_type |= VAR; } if (u->c_type & (VAR|FLD|REC|TMP)) { u->c_type &= ~NUM; u->c_type |= STR; sfree(u->c_sval); u->c_sval = strsave(s); #if 0 /* "table2" in AWK book */ if (isnum(u->c_sval)) { u->c_fval = atof(u->c_sval); u->c_type |= NUM; } else #endif u->c_fval = 0.0; if (u->c_type & FLD) mkrec(u); } else fprintf(stderr, "assign to constant (%d)\n", u->c_type); } double getfval(u) CELL *u; { double x, atof(); if (u->c_type == UDF) { /* local var */ u->c_type |= VAR|STR|NUM; u->c_sval = strsave(""); x = u->c_fval = 0.0; } else if (u->c_type & NUM) x = u->c_fval; #if 1 else { x = atof(u->c_sval); #else else { if (isnum(u->c_sval)) x = atof(u->c_sval); else x = 0.0; #endif } return x; } char * getsval(u) CELL *u; { char *s, str[80]; if (u->c_type & STR) s = u->c_sval; else if (u->c_type & NUM) { /* if (u->c_fval >= -2147483648.0 && u->c_fval <= 2147483647.0)*/ if ((long)u->c_fval == u->c_fval) s = "%.16g"; else s = *OFMT; sprintf(str, s, u->c_fval); sfree(u->c_sval); s = u->c_sval = strsave(str); } #if 1 else if (u->c_type == UDF) { /* local var */ /* printf("getsval_fix_to_VAR|STR\n"); */ u->c_type |= VAR|STR|NUM; s = u->c_sval = strsave(""); u->c_fval = 0.0; } #endif else fprintf(stderr, "abnormal value (STR|NUM == 0)(%d)\n", u->c_type); return s; } char * emalloc(n) unsigned n; { char *p; #if 0 char far *_fmalloc(); #else char *malloc(); #endif #if 0 if ((p = _fmalloc(n)) == (char *)NULL) #else if ((p = malloc(n)) == (char *)NULL) #endif error("memory over"); return p; } Free(s) char *s; { #if DOS void _ffree(); _ffree(s); #else free(s); #endif } /* * a small awk clone * * (C) 1989 Saeko Hirabauashi & Kouichi Hirabayashi * * Absolutely no warranty. Use this software with your own risk. * * Permission to use, copy, modify and distribute this software for any * purpose and without fee is hereby granted, provided that the above * copyright and disclaimer notice. * * This program was written to fit into 64K+64K memory of the Minix 1.2. */ #include #include "awk.h" extern char *mkpat(); extern char *cmd; extern char text[]; extern char funnam[]; extern int sym; extern int sym1; extern int regexflg; extern int funflg; extern int printflg; extern int getlineflg; extern SYMBOL *hashtab[], *funtab[]; extern CELL *field[]; char *emalloc(), *strsave(); NODE *node0(), *node1(), *node2(), *node3(), *node4(); NODE *stat(), *pastat(); NODE *expr(), *expr1(), *expr2(), *expr3(), *expr4(); NODE *expr5(), *expr6(), *expr7(), *expr8(), *expr9(), *expr10(); NODE *doprint(), *dofuncn(), *doif(), *dowhile(), *dofor(), *body(); NODE *doassign(), *dodo(), *doarray(), *doreturn(), *doelement(); CELL *mkcell(), *getvar(); CELL *execute(), *lookup(); int forflg; /* parsing for(expr in array), inhibit 'expr in array' */ int prmflg; /* parsing pass parameters */ NODE *begin, *loop, *End; parse() { NODE *p, *q, *r, *stat(); CELL *u; lex(); skipeol(); while (sym) { switch (sym) { case BEGIN: lex(); begin = stat(); break; case END: lex(); if (End == NULL) End = stat(); else { for (p = End; p; p = q) { if ((q = p->n_next) == NULL) p->n_next = stat(); } } break; case FUNC: lex(); dousrfun(); break; default: q = loop = pastat(); skipeol(); while (sym && sym != BEGIN && sym != END && sym != FUNC) { r = pastat(); q->n_next = r; q = r; skipeol(); } break; } skipeol(); } if (begin) { u = execute(begin); c_free(u); } if (End || loop) while (Getrec(NULL)) { if (loop) { u = execute(loop); c_free(u); } } if (End) { u = execute(End); c_free(u); } } #define MAXARG 100 static char *argnam[MAXARG]; static int narg; static dousrfun() { CELL *u; strcpy(funnam, text); u = getvar(text, funtab, FUN); lex(); if (sym != '(') synerr("'(' expected"); for (lex(); sym != ')'; narg++) { if (sym != IDENT) synerr("argument expected"); argnam[narg] = strsave(text); lex(); if (sym == ',') lex(); } u->c_fval = (double) narg; lex(); skipeol(); funflg++; u->c_sval = (char *) stat(); funflg--; if (narg > 0) { do { sfree(argnam[--narg]); } while (narg > 0); } skipeol(); } isarg(s) char *s; { int i; if (narg > 0) { for (i = narg - 1; i >= 0; i--) if (strcmp(s, argnam[i]) == 0) break; } else i = -1; return i; } /* interactive() { NODE *p, *q; CELL *u; for (lex(); sym; lex()) { p = stat(); if (p->n_type != PRINT && !iscntl(p->n_type)) { q = (NODE *) emalloc(sizeof(NODE) + sizeof(NODE *) * 4); q->n_type = PRINT; q->n_arg[0] = q->n_arg[1] = q->n_arg[3] = NULL; q->n_arg[2] = p; q->n_next = NULL; p = q; } u = execute(p); printf("[%g(%s)]\n", u->c_fval, u->c_sval); c_free(u); } closeall(); exit(0); } */ static iscntl(t) { static int tab[] = { IF, DO, WHILE, FOR, JUMP, GETLINE, 0 }; int i; for (i = 0; tab[i]; i++) if (t == tab[i]) break; return tab[i]; } static NODE * pastat() { NODE *p, *q, *r; if (sym == '{') /* action only */ p = stat(); else { /* exp [, expr] [{ .. }] */ p = expr(); if (sym == ',') { lex(); q = expr(); } else q = NULL; if (sym && sym != EOL) r = stat(); else r = node0(PRINT0); if (q) p = node3(P2STAT, p, q, r); else p = node2(P1STAT, p, r); } return p; } static NODE * stat() { NODE *p, *q, *r; CELL *u, *v; int op; /*printf("@stat(%d)(%s)\n", sym, text);*/ while (sym == EOL) lex(); switch(sym) { case PRINT: p = doprint(0); break; case PRINTF: p = doprint(FORMAT); break; case IF: p = doif(); break; case WHILE: p = dowhile(); break; case DO: p = dodo(); break; case FOR: p = dofor(); break; case RETURN: p = doreturn(); break; case EXIT: p = node2(JUMP, (NODE *)sym, (NODE *)NULL); lex(); if (sym == IDENT || sym == NUMBER || sym == ARG) p->n_arg[1] = expr(); break; case BREAK: case CONTIN: case NEXT: p = node1(JUMP, (NODE *)sym); lex(); break; case DELETE: lex(); u = getvar(text, hashtab, ARR); if (Getc() != '[') synerr("'[' expected"); p = doarray(u); p->n_type = DELETE; lex(); /* ']' */ break; case '{': lex(); skipeol(); if (sym == '}') p = node0(NULPROC); else p = q = stat(); skipeol(); while (sym != '}') { r = stat(); q->n_next = r; q = r; skipeol(); } lex(); break; default: p = expr(); #if 0 if (sym == BINOR) { /* expr | GETLINE */ lex(); if (sym != GETLINE) synerr("'GETLINE' expected"); lex(); if (sym == IDENT || sym == STRING || sym == ARG) { q = expr(); } else q = NULL; p = node3(GETLINE, q, p, (NODE *)R_PIN); } #endif break; } if (p->n_type == VALUE) synerr("statement expected"); return p; } static skipeol() { while (sym == EOL) lex(); } static NODE * doprint(fmt) { NODE *p, *q, *r; CELL *u; int i, op; int n = 0; printflg++; lex(); if (sym == '(') lex(); if (sym != '}' && sym != ')' && sym != EOL && sym != R_OUT && sym != R_APD && sym != R_POUT) { p = q = expr(); n++; while (sym == ',') { lex(); skipeol(); r = expr(); n++; q->n_next = r; q = r; } } if (sym == ')') lex(); if (sym == R_OUT || sym == R_APD || sym == R_POUT) { op = sym; lex(); /* q = expr10();*/ q = expr(); /* 94-04-02 */ } else q = (NODE *) (op = 0); /* stdout */ printflg = 0; r = (NODE *) emalloc(sizeof(*r) + sizeof(r) * (n + 3)); r->n_type = PRINT; /* convert list to arg */ r->n_next = NULL; r->n_arg[0] = (NODE *) (op | fmt); r->n_arg[1] = q; if (n == 0) { p = node1(VALUE, (NODE *)field[0]); } for (i = 2; p != NULL; i++) { r->n_arg[i] = p; q = p->n_next; p->n_next = NULL; p = q; } r->n_arg[i] = NULL; return r; } static NODE * doif() { NODE *p, *q, *r; lex(); if (sym != '(') synerr("'(' expected"); lex(); p = expr(); if (sym != ')') synerr("')' expected"); lex(); skipeol(); q = stat(); skipeol(); if (sym == ELSE) { lex(); skipeol(); r = stat(); } else r = NULL; return node3(IF, p, q, r); } static NODE * dowhile() { NODE *p, *q; lex(); if (sym != '(') synerr("'(' expected"); lex(); p = stat(); if (sym != ')') synerr("')' expected"); q = body(); return node2(WHILE, p, q); } static NODE * dofor() { NODE *p, *q, *r, *s; CELL *u; int i; lex(); if (sym != '(') synerr("'(' expected"); lex(); if (sym != EOL) { forflg++; /* inhibit parsing 'expr IN array' */ p = expr(); forflg = 0; } else p = NULL; if (sym == IN) { lex(); if (sym == ARG) { /* printf("***FOR_IN_ARG(%d)***\n", sym); */ u = mkcell(POS, NULL, (double)sym1); q = node1(ARG, u); } else { u = getvar(text, hashtab, ARR); q = node1(VALUE, u); } lex(); if (sym != ')') synerr("')' expected"); lex(); skipeol(); s = stat(); r = node3(FORIN, p, q, s); } else { if (sym != EOL) synerr("'in' or ';' expected"); lex(); if (sym != EOL) q = expr(); else q = NULL; if (sym != EOL) synerr("';' expected"); lex(); if (sym != ')') r = expr(); else r = NULL; if (sym != ')') synerr("')' expected"); s = body(); r = node4(FOR, p, q, r, s); } return r; } static NODE * body() { NODE *r; while ((sym = Getc()) == '\n' || sym == ' ' || sym == '\t') ; if (sym == ';') { r = node0(NULPROC); lex(); } else { Ungetc(sym); lex(); r = stat(); } return r; } static NODE * dodo() { NODE *p, *q; lex(); skipeol(); p = stat(); skipeol(); if (sym != WHILE) synerr("'while' expected"); lex(); if (sym != '(') synerr("'(' expected"); lex(); q = stat(); if (sym != ')') synerr("')' expected"); lex(); return node2(DO, p, q); } static NODE * doreturn() { NODE *p, *q, *r; int i, n = 0; if (lex() != EOL) { p = q = expr(); n++; while (sym == ',') { lex(); skipeol(); r = expr();::::::::::: n++; q ->n_next = r; q = r; } } else p = (NODE *)NULL; r = (NODE *) emalloc(sizeof(*r) + sizeof (r) * (n + 1)); r->n_type = JUMP; r->n_next = NULL; r->n_arg[0] = (NODE *) RETURN; for (i = 1; p != NULL; i++) { r->n_arg[i] = p; q = p->n_next; p->n_next = NULL; p = q; } r->n_arg[i] = NULL; return r; } static NODE * expr() { NODE *p; p = expr1(); if (isassign(sym)) p = doassign(sym, p); return p; } static isassign(sym) { return (sym == ASSIGN || sym == ADDEQ || sym == SUBEQ || sym == MULTEQ || sym == DIVEQ || sym == MODEQ || sym == POWEQ); } static NODE * doassign(op, p) NODE *p; { /* evaluate right to left */ NODE *q; lex(); q = expr(); if (isassign(sym)) q = doassign(sym, q); return node3(ASSIGN, (NODE *)op, p, q); } static NODE * expr1() { NODE *p, *q; /* printf("expr1(%d)(%s)\n", sym, text); */ p = expr2(); if (sym == '?') { lex(); #if 0 q = stat(); if (sym != ':') synerr("':' expected"); lex(); return node3(IF, p, q, stat()); #else q = expr(); if (sym != ':') synerr("':' expected"); lex(); return node3(IF, p, q, expr()); #endif } return p; /* 930213 */ } static NODE * expr2() { NODE *p; /* printf("expr2(%d)(%s)\n", sym, text); */ p = expr3(); while (sym == OR) { lex(); skipeol(); p = node3(COND, (NODE *)OR, p, expr3()); } return p; } static NODE * expr3() { NODE *p; /* printf("expr3(%d)(%s)\n", sym, text); */ p = expr4(); while (sym == AND) { lex(); skipeol(); p = node3(COND, (NODE *)AND, p, expr4()); } return p; } static NODE * expr4() { NODE *p; CELL *q; int op; /* printf("expr4(%d)(%s)\n", sym, text); */ p = expr5(); if (!forflg && sym == IN) { lex(); q = getvar(text, hashtab, ARR); lex(); return node2(IN, p, q); } while (sym == EQ || sym == NE || sym == LT || sym == LE || sym == GT || sym == GE || sym == MATCH || sym == NOMATCH) { op = sym; lex(); p = node3(COND, (NODE *)op, p, expr5()); } return p; } static NODE * expr5() { NODE *p, *q; /* printf("expr5(%d)(%s)\n", sym, text); */ p = expr6(); while (iscat(sym)) { q = expr6(); p = node2(CAT, p, q); } return p; } static iscat(sym) { static int ctab[] = { ADD, SUB, MULT, DIV, MOD, INC, DEC, STRING, NUMBER, IDENT, '(', MATHFUN, STRFUN, SPRINTF, '$', SUBST, ARG, CALL, 0 }; register int i, j; for (i = 0; j = ctab[i]; i++) if (sym == j) break; return j; } static NODE * expr6() { register int sign = sym; NODE *p, *q; /* printf("expr6(%d)(%s)\n", sym, text); */ if (sym == SUB || sym == ADD) lex(); p = expr7(); if (sign == SUB) p = node2(ARITH, (NODE *)UMINUS, p); while (sym == ADD || sym == SUB) { sign = sym; lex(); q = expr7(); if (sign == ADD) { p = node3(ARITH, (NODE *)ADD, p, q); } else if (sign == SUB) { p = node3(ARITH, (NODE *)SUB, p, q); } else synerr("'+' or '-' expected"); } return p; } static NODE * expr7() { register int op; NODE *p, *q; /* printf("expr7(%d)(%s)\n", sym, text); */ p = expr8(); while (sym == MULT || sym == DIV || sym == MOD) { op = sym; lex(); q = expr8(); switch (op) { case MULT: p = node3(ARITH, (NODE *)MULT, p, q); break; case DIV: p = node3(ARITH, (NODE *)DIV, p, q); break; case MOD: p = node3(ARITH, (NODE *)MOD, p, q); break; default: synerr("'*', '/' or '%' expected"); break; } } return p; } static NODE * expr8() { NODE *p; int op; /* printf("expr8(%d)(%s)\n", sym, text); */ if (sym == NOT) { lex(); p = node2(COND, (NODE *)NOT, expr9()); } else { p = expr9(); if (sym == POWER) { lex(); p = node3(ARITH, (NODE *)POWER, p, expr9()); } } return p; } static NODE * expr9() { NODE *p, *q; int op, sym0; /* printf("expr9(%d)(%s)\n", sym, text); */ if (op = isincdec(sym)) { lex(); if (sym != IDENT && sym != ARG) synerr("illegal '++/--' operator"); p = expr10(); p = node4(ARITH, (NODE *)INCDEC, p, (NODE *)op, (NODE *)PRE); } else { sym0 = sym; p = expr10(); if (op = isincdec(sym)) { /*printf("POST(%d)(%d)(%s)\n", sym, sym0, text);*/ if (sym0 == IDENT || sym0 == ARG) { p = node4(ARITH, (NODE *)INCDEC, p, (NODE *)op, (NODE *)POST); lex(); } } if (sym == BINOR) { /* | getline */ lex(); if (sym != GETLINE) synerr("'GETLINE' expected"); lex(); if (sym == IDENT || sym == STRING || sym == ARG) { q = expr(); } else q = NULL; p = node3(GETLINE, q, p, (NODE *)R_PIN); } } return p; } static isincdec(sym) { return sym == INC ? 1 : (sym == DEC ? -1 : 0); } static NODE * expr10() { NODE *p, *q; CELL *u, *v; int op; int c; int gsave, psave; double atof(); /* printf("expr10(%d)(%s)\n", sym, text); */ switch (sym) { case STRING: u = mkcell(STR, text, 0.0); goto g1; case NUMBER: u = mkcell(NUM, NULL, atof(text)); g1: p = node1(VALUE, u); lex(); break; case IDENT: case ARG: if ((c = Getc()) == '[') { /* array */ /* 940403 */ if (sym == ARG) { u = (CELL *)emalloc(sizeof(CELL)); u = mkcell(POS, NULL, (double)sym1); p = doarray(u); } else { u = getvar(text, hashtab, ARR); p = doarray(u); } } else { Ungetc(c); if (sym == ARG) { u = mkcell(POS, NULL, (double)sym1); p = node1(ARG, u); } else { /* symple variable */ u = getvar(text, hashtab, VAR|STR|NUM); p = node1(VALUE, u); } } lex(); break; case '(': /* print >(x ? y : z) needs this */ gsave = getlineflg; psave = printflg; getlineflg = printflg = 0; lex(); p = expr(); if (sym == ',') /* (expr, expr, .. ) */ p = doelement(p); if (sym != ')') synerr("')' expected"); getlineflg = gsave; printflg = psave; lex(); break; case CALL: p = dofuncn(sym, getvar(text, funtab, UDF)); break; case MATHFUN: case STRFUN: case SUBST: p = dofuncn(sym, (CELL *)sym1); break; case SPRINTF: p = doprint(FORMAT|STROUT); break; case '$': lex(); switch (sym) { case NUMBER: u = mkcell(NUM, NULL, atof(text)); p = node1(VALUE, u); p = node1(FIELD, p); lex(); break; case IDENT: case ARG: case '(': p = node1(FIELD, expr10()); break; default: synerr("number or identifier expected after '$'", (char *)0); } break; case DIV: regexflg++; lex(); regexflg = 0; u = mkcell(PAT, NULL, 0.0); u->c_sval = (char *) mkpat(text); p = node1(VALUE, u); lex(); break; case GETLINE: getlineflg++; lex(); if (sym == IDENT || sym == STRING || sym == ARG) q = expr10(); /* read into var */ else q = NULL; getlineflg = 0; if (sym == R_IN) { op = R_IN; lex(); p = expr10(); } else op = (int) (p = NULL); p = node3(GETLINE, q, p, (NODE *)op); break; default: synerr( "identifier, number, string, argument, regexpr, call or '(' expected"); break; } return p; } static NODE * dofuncn(fun, op) CELL *op; { NODE *p; int i, j; int n = 0; NODE *a[100]; if (lex() == '(') { prmflg++; for (lex(); sym && (sym != ')'); n++) { if ((int)op == SPLIT && n == 1) { /* printf("sym(%d)sym1(%d)(%d)\n", sym, sym1, isarg(text)); */ if (sym != ARG) { /*isarg(text) == -1*/ /* make an array if not exist */ prmflg = 0; getvar(text, hashtab, ARR); prmflg++; } } a[n] = expr(); if (sym == ',') lex(); else if (sym != ')') synerr("',' or ')' expected"); } prmflg = 0; if (sym == ')') lex(); else synerr("')' expected"); } p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 2)); p->n_type = fun; p->n_next = NULL; p->n_arg[0] = (NODE *) op; p->n_arg[1] = (NODE *) n; for (i = 0, j = 2; i < n; ) p->n_arg[j++] = a[i++]; p->n_arg[j] = NULL; return p; } static NODE * doarray(u) CELL *u; { NODE *p; int i, j; int n; NODE *a[20]; for (lex(), n = 0; sym && sym != ']'; n++) { a[n] = expr(); if (sym == ',') lex(); } if (sym != ']') synerr("']' expected"); /* left ']' for expr10() */ p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 1)); p->n_type = ARRAY; p->n_next = NULL; p->n_arg[0] = (NODE *)u; p->n_arg[1] = (NODE *) n; for (i = 0, j = 2; i < n; ) p->n_arg[j++] = a[i++]; return p; } static NODE * doelement(q) NODE *q; { NODE *p; int i, j; int n; NODE *a[20]; a[0] = q; for (lex(), n = 1; sym && sym != ')'; n++) { a[n] = expr(); if (sym == ',') lex(); else if (sym != ')') synerr("',' or ')' expected"); } /* left ')' for expr10() */ p = (NODE *) emalloc(sizeof(*p) + sizeof(p) * (n + 1)); p->n_type = ELEMENT; p->n_next = NULL; p->n_arg[0] = NULL; p->n_arg[1] = (NODE *) n; for (i = 0, j = 2; i < n; ) p->n_arg[j++] = a[i++]; return p; } synerr(s, t) char *s, *t; { extern int lineno; extern char line[], *linep; int c, i; char *u, *v; fprintf(stderr, "%s: Syntax error at line %d", cmd, lineno); if (funflg) fprintf(stderr, " in function %s", funnam); fprintf(stderr, ":\n"); if ((v = linep - 1) < line) v = line + BUFSIZ - 1; for (i = 0, u = v - 1; ; --u) { if (u < line) { if (line[BUFSIZ - 1] == '\0') break; u = line + BUFSIZ - 1; } if (*u == '\n' && ++i == 2) break; } if (u != v) { while (u != v) { fputc(*u, stderr); if ((++u - line) == BUFSIZ) u = line; } if (*u != '\n') fputc(*u, stderr); fprintf(stderr, " <--\n\n"); /* fprintf(stderr, " <-- "); while ((c = Getc()) != EOF && c != '\n') fputc(c, stderr); fprintf(stderr, "\n"); if (c == EOF); fprintf(stderr, "\n"); */ } fprintf(stderr, s, t); fprintf(stderr, "\n"); #ifdef DOS closeall(); #endif exit(1); } ...COPYINGMakefilebc.cbc.ybcdefs.hconfig.hconst.hexecute.cfix_math.hglobal.cglobal.hlibmath.bload.cmain.cnumber.cnumber.hproto.hsbc.yscan.cscan.lstorage.cutil.cversion.hy.tab.h GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an ex:::::::::::ecutable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. # Makefile for bc # A makefile for bc. This is part of the bc/sbc distribution. # # # Make sure these have the correct directories for your machine. # # LIBDIR and BINDIR are where bc and libmath.b will be put. # PREFIX = /usr LIBDIR = $(PREFIX)/lib BINDIR = $(PREFIX)/bin # # Programs definitions for use by make. # SHELL = /bin/sh YACC = yacc #YACC = bison -y LEX = flex -I8 #LEX = lex CC = cc CFLAGS = -D_POSIX_SOURCE LDFLAGS = -i # # OFILES = scan.o util.o main.o number.o storage.o load.o execute.o # SUBDIRS = Examples Test # all: bc bc: $& config.h bc.o $(OFILES) global.o $(CC) -o bc $(LDFLAGS) bc.o $(OFILES) global.o sbc: sbc.o $(OFILES) global.o $(CC) -o sbc $(LDFLAGS) sbc.o $(OFILES) global.o math.h: libmath.b $(MAKE) -$(MAKEFLAGS) fbc ./fbc -c libmath.b math.h ./fix_math.h rm -f ./fbc fbc: $(OFILES) bc.o echo \"\" > math.h $(CC) -c $(CFLAGS) global.c $(CC) -o fbc $(LDFLAGS) bc.o $(OFILES) global.o install: $(BINDIR)/bc $(LIBDIR)/libmath.b $(BINDIR)/bc: bc install -cs -o bin $? $@ $(LIBDIR)/libmath.b: libmath.b install -c -o bin $? $@ clean: rm -f *.o *.bak core math.h bc sbc scan.c: scan.l $(LEX) scan.l mv lex.yy.c scan.c scan.o: scan.c $(CC) -c $(CFLAGS) -wa scan.c y.tab.h bc.c: bc.y @echo "expect 1 shift/reduce conflict" $(YACC) -d bc.y mv y.tab.c bc.c sbc.c: sbc.y $(YACC) -d sbc.y mv y.tab.c sbc.c global.o: bcdefs.h global.h math.h bc.o: bcdefs.h global.h execute.o: bcdefs.h global.h load.o: bcdefs.h global.h main.o: bcdefs.h global.h version.h number.o: bcdefs.h sbc.o: bcdefs.h global.h scan.o: y.tab.h bcdefs.h global.h storage.o: bcdefs.h global.h util.o: bcdefs.h global.h version.h bcdefs.h: number.h const.h config.h touch bcdefs.h #ifndef lint static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90"; #endif #define YYBYACC 1 #line 2 "bc.y" /* bc.y: The grammar for a POSIX compatable bc processor with some extensions to the language. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "global.h" #include "proto.h" #line 38 "bc.y" typedef union { char *s_value; char c_value; int i_value; arg_list *a_value; } YYSTYPE; #line 46 "y.tab.c" #define NEWLINE 257 #define AND 258 #define OR 259 #define NOT 260 #define STRING 261 #define NAME 262 #define NUMBER 263 #define MUL_OP 264 #define ASSIGN_OP 265 #define REL_OP 266 #define INCR_DECR 267 #define Define 268 #define Break 269 #define Quit 270 #define Length 271 #define Return 272 #define For 273 #define If 274 #define While 275 #define Sqrt 276 #define Else 277 #define Scale 278 #define Ibase 279 #define Obase 280 #define Auto 281 #define Read 282 #define Warranty 283 #define Halt 284 #define Last 285 #define Continue 286 #define Print 287 #define Limits 288 #define UNARY_MINUS 289 #define YYERRCODE 256 short yylhs[] = { -1, 0, 0, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 16, 17, 18, 19, 13, 20, 13, 22, 23, 13, 13, 25, 13, 24, 24, 26, 26, 21, 27, 21, 28, 14, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 4, 4, 2, 2, 29, 1, 30, 1, 31, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, }; short yylen[] = { 2, 0, 2, 2, 1, 2, 0, 1, 3, 2, 0, 1, 2, 3, 2, 3, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 0, 0, 0, 0, 13, 0, 7, 0, 0, 7, 3, 0, 3, 1, 3, 1, 1, 0, 0, 3, 0, 12, 0, 1, 0, 3, 3, 1, 3, 3, 5, 0, 1, 1, 3, 3, 5, 0, 1, 0, 1, 0, 4, 0, 4, 0, 4, 2, 3, 3, 3, 3, 3, 2, 1, 1, 3, 4, 2, 2, 4, 4, 4, 3, 1, 4, 1, 1, 1, 1, }; short yydefred[] = { 1, 0, 0, 0, 21, 0, 83, 0, 0, 22, 24, 0, 0, 28, 0, 35, 0, 0, 94, 95, 0, 18, 25, 97, 23, 39, 19, 0, 0, 0, 0, 0, 2, 0, 16, 4, 7, 5, 17, 0, 0, 0, 0, 96, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81, 0, 0, 0, 11, 71, 73, 0, 0, 0, 0, 0, 69, 87, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 91, 43, 0, 40, 0, 84, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 85, 0, 93, 0, 0, 0, 88, 27, 0, 0, 33, 0, 89, 90, 0, 13, 15, 0, 0, 0, 62, 0, 0, 0, 0, 0, 29, 0, 0, 42, 0, 56, 0, 0, 0, 0, 0, 64, 0, 0, 0, 46, 34, 37, 0, 48, 58, 30, 0, 0, 0, 0, 47, 53, 54, 0, 0, 0, 31, 49, 0, 32, }; short yydgoto[] = { 1, 30, 79, 31, 113, 108, 149, 109, 73, 74, 32, 33, 58, 34, 35, 59, 48, 138, 155, 164, 131, 146, 50, 132, 88, 54, 89, 152, 154, 101, 94, 95, }; short yysindex[] = { 0, -7, 58, 212, 0, -22, 0, -233, -241, 0, 0, -8, -5, 0, -4, 0, 2, 4, 0, 0, 9, 0, 0, 0, 0, 0, 0, 212, 212, 91, 725, -240, 0, -29, 0, 0, 0, 0, 0, 84, 245, 212, -57, 0, 0, 10, 212, 212, 14, 212, 16, 212, 212, 23, 156, 0, 549, 127, -52, 0, 0, 0, 212, 212, 212, 212, 212, 0, 0, 0, 91, -17, 725, 24, -3, 578, -205, 562, 725, 27, 212, 606, 212, 669, 716, 0, 0, 725, 0, 19, 0, 91, 127, 0, 212, 212, -36, -39, -91, -91, -36, 212, 0, 166, 0, 277, 0, -21, 36, 40, 0, 0, 725, 28, 0, 725, 0, 0, 156, 0, 0, 84, 540, -39, 0, -9, 725, -2, -37, -174, 0, 127, 48, 0, 346, 0, -167, 3, 212, -185, 127, 0, -188, 6, 37, 0, 0, 0, -205, 0, 0, 0, 127, -42, 91, 212, 0, 0, 0, -20, 54, 26, 0, 0, 127, 0, }; short yyrindex[] = { 0, -16, 0, 0, 0, 409, 0, 0, 0, 0, 0, 0, -58, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -50, 46, 470, 0, 0, 0, 0, 0, 0, 0, 661, 56, 0, 525, 0, 0, 0, 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -6, 705, 7, 0, 60, 0, 61, 0, 63, 0, 49, 0, 0, 0, 0, 0, 0, 17, 0, 78, 0, -47, -45, 0, 0, 0, 537, 440, 620, 637, 594, 0, 0, 0, 0, 0, 0, -33, 0, 66, 0, 0, -19, 0, 0, 68, 0, 0, 0, 0, 0, 667, 680, 508, 0, 705, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -31, 49, -44, 0, 0, -40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 69, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, }; short yygindex[] = { 0, 958, 0, 104, -118, 0, 0, -35, 0, 0, 0, 0, -34, 22, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, }; #define YYTABLESIZE 1113 short yytable[] = { 52, 26, 129, 66, 64, 52, 65, 92, 55, 10, 57, 55, 12, 57, 14, 45, 36, 158, 40, 52, 144, 45, 66, 40, 38, 67, 55, 68, 57, 42, 70, 40, 46, 28, 41, 47, 49, 160, 27, 92, 66, 105, 51, 6, 52, 43, 18, 19, 61, 53, 76, 61, 23, 9, 80, 66, 82, 107, 66, 63, 10, 44, 63, 118, 85, 104, 28, 26, 111, 41, 127, 27, 12, 93, 103, 10, 44, 128, 12, 38, 14, 45, 134, 52, 129, 102, 136, 130, 137, 140, 142, 135, 145, 148, 143, 162, 151, 59, 28, 150, 67, 60, 50, 27, 68, 20, 119, 51, 65, 36, 65, 44, 0, 153, 120, 0, 29, 133, 0, 0, 159, 0, 0, 0, 0, 0, 0, 64, 0, 65, 0, 28, 0, 0, 0, 0, 27, 41, 0, 0, 0, 0, 44, 0::::::::::::::::::::::::::::::::::::, 0, 0, 0, 0, 0, 29, 0, 163, 0, 139, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 28, 0, 0, 0, 20, 27, 62, 156, 0, 119, 0, 66, 0, 0, 29, 0, 0, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 26, 0, 27, 0, 41, 0, 91, 28, 10, 0, 0, 12, 27, 14, 45, 29, 157, 52, 52, 0, 26, 52, 52, 52, 52, 55, 62, 57, 52, 69, 52, 52, 52, 52, 52, 52, 52, 52, 161, 52, 52, 52, 6, 52, 52, 52, 52, 52, 52, 52, 2, 29, 9, 28, 3, 4, 5, 6, 27, 10, 124, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 12, 17, 18, 19, 44, 20, 21, 22, 23, 24, 25, 26, 57, 0, 0, 28, 3, 4, 5, 6, 27, 0, 0, 7, 44, 9, 10, 11, 12, 13, 14, 15, 16, 20, 17, 18, 19, 0, 20, 21, 22, 23, 24, 25, 26, 37, 0, 28, 3, 4, 5, 6, 27, 20, 0, 7, 0, 9, 10, 11, 12, 13, 14, 15, 16, 41, 17, 18, 19, 0, 20, 21, 22, 23, 24, 25, 26, 57, 62, 0, 63, 3, 4, 5, 6, 41, 0, 0, 7, 0, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 0, 20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, 0, 0, 28, 3, 4, 5, 6, 27, 0, 0, 7, 0, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 0, 20, 21, 22, 23, 24, 25, 26, 3, 86, 5, 6, 0, 0, 0, 7, 0, 0, 3, 11, 5, 6, 0, 0, 16, 7, 17, 18, 19, 11, 20, 141, 0, 23, 16, 0, 17, 18, 19, 0, 20, 0, 92, 23, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 92, 96, 96, 96, 3, 0, 5, 6, 0, 0, 0, 7, 0, 76, 0, 11, 76, 96, 0, 0, 16, 0, 17, 18, 19, 0, 20, 0, 0, 23, 0, 76, 0, 0, 92, 92, 0, 3, 0, 71, 6, 0, 0, 82, 7, 82, 82, 82, 11, 0, 0, 96, 96, 16, 0, 17, 18, 19, 0, 20, 0, 82, 23, 0, 0, 76, 92, 0, 0, 3, 0, 125, 6, 0, 0, 0, 7, 0, 0, 0, 11, 70, 0, 96, 70, 16, 0, 17, 18, 19, 0, 20, 0, 0, 23, 82, 82, 76, 92, 70, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 79, 0, 79, 79, 79, 64, 92, 65, 0, 0, 0, 0, 90, 0, 64, 0, 65, 82, 79, 0, 0, 0, 0, 70, 0, 110, 0, 64, 3, 65, 5, 6, 0, 0, 0, 7, 0, 0, 0, 11, 92, 92, 0, 64, 16, 65, 17, 18, 19, 0, 20, 0, 79, 23, 0, 70, 66, 80, 0, 80, 80, 80, 0, 0, 0, 66, 0, 0, 0, 114, 0, 64, 92, 65, 0, 80, 0, 0, 66, 0, 0, 0, 0, 77, 79, 77, 77, 77, 92, 92, 92, 0, 0, 106, 66, 92, 92, 92, 92, 0, 78, 77, 78, 78, 78, 96, 96, 96, 92, 80, 0, 0, 96, 96, 96, 96, 0, 0, 78, 76, 76, 76, 66, 0, 75, 96, 0, 75, 76, 0, 72, 0, 116, 72, 64, 77, 65, 0, 0, 76, 0, 80, 75, 74, 0, 0, 74, 0, 72, 82, 82, 82, 78, 0, 0, 0, 82, 0, 82, 0, 0, 74, 0, 0, 0, 0, 0, 77, 92, 82, 92, 92, 92, 0, 0, 0, 75, 0, 0, 117, 0, 64, 72, 65, 78, 66, 0, 70, 70, 70, 64, 0, 65, 0, 0, 74, 70, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 70, 75, 0, 0, 92, 0, 92, 72, 0, 79, 79, 79, 0, 60, 92, 0, 79, 92, 79, 62, 74, 63, 60, 61, 0, 66, 0, 0, 62, 79, 63, 0, 0, 0, 66, 60, 61, 0, 0, 0, 0, 62, 0, 63, 0, 0, 0, 0, 0, 0, 0, 60, 61, 0, 0, 0, 0, 62, 0, 63, 0, 0, 0, 0, 0, 0, 80, 80, 80, 0, 0, 0, 0, 80, 0, 80, 0, 0, 0, 60, 61, 0, 0, 0, 0, 62, 80, 63, 0, 0, 0, 0, 77, 77, 77, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, 0, 78, 78, 78, 77, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 75, 75, 75, 0, 0, 0, 72, 72, 72, 60, 61, 0, 0, 0, 0, 62, 0, 63, 0, 74, 75, 74, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 39, 0, 92, 92, 0, 0, 0, 0, 92, 92, 92, 92, 0, 60, 61, 0, 0, 0, 0, 62, 0, 63, 60, 61, 55, 56, 0, 0, 62, 0, 63, 0, 0, 0, 0, 0, 0, 72, 75, 0, 0, 0, 0, 77, 78, 0, 81, 0, 83, 84, 0, 87, 0, 0, 0, 0, 0, 0, 0, 96, 97, 98, 99, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, 0, 0, 0, 0, 0, 123, 0, 75, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, }; short yycheck[] = { 40, 59, 44, 94, 43, 45, 45, 59, 41, 59, 41, 44, 59, 44, 59, 59, 1, 59, 40, 59, 138, 262, 41, 40, 2, 265, 59, 267, 59, 262, 59, 40, 40, 40, 91, 40, 40, 155, 45, 59, 59, 44, 40, 59, 40, 278, 279, 280, 41, 40, 40, 44, 285, 59, 40, 94, 40, 262, 94, 41, 59, 44, 44, 44, 41, 41, 40, 125, 41, 91, 91, 45, 59, 125, 91, 125, 59, 41, 125, 57, 125, 125, 91, 123, 44, 70, 123, 59, 262, 41, 257, 93, 277, 281, 91, 41, 59, 41, 40, 93, 41, 41, 41, 45, 41, 59, 91, 41, 59, 41, 41, 7, -1, 148, 92, -1, 123, 118, -1, -1, 154, -1, -1, -1, -1, -1, -1, 43, -1, 45, -1, 40, -1, -1, -1, -1, 45, 59, -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, 123, -1, 125, -1, 131, -1, -1, -1, -1, -1, -1, -1, -1, 140, -1, -1, -1, -1, 40, -1, -1, -1, 125, 45, 264, 152, -1, 161, -1, 94, -1, -1, 123, -1, -1, -1, -1, 164, -1, -1, -1, -1, -1, -1, -1, -1, -1, 40, -1, -1, 257, -1, 45, -1, 125, -1, 257, 40, 257, -1, -1, 257, 45, 257, 257, 123, 257, 256, 257, -1, 277, 260, 261, 262, 263, 257, 264, 257, 267, 257, 269, 270, 271, 272, 273, 274, 275, 276, 257, 278, 279, 280, 257, 282, 283, 284, 285, 286, 287, 288, 256, 123, 257, 40, 260, 261, 262, 263, 45, 257, 93, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 257, 278, 279, 280, 257, 282, 283, 284, 285, 286, 287, 288, 256, -1, -1, 40, 260, 261, 262, 263, 45, -1, -1, 267, 277, 269, 270, 271, 272, 273, 274, 275, 276, 257, 278, 279, 280, -1, 282, 283, 284, 285, 286, 287, 288, 257, -1, 40, 260, 261, 262, 263, 45, 277, -1, 267, -1, 269, 270, 271, 272, 273, 274, 275, 276, 257, 278, 279, 280, -1, 282, 283, 284, 285, 286, 287, 288, 256, 264, -1, 266, 260, 261, 262, 263, 277, -1, -1, 267, -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, 278, 279, 280, -1, 282, 283, 284, 285, 286, 287, 288, -1, -1, -1, -1, -1, -1, 40, 260, 261, 262, 263, 45, -1, -1, 267, -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, 278, 279, 280, -1, 282, 283, 284, 285, 286, 287, 288, 260, 261, 262, 263, -1, -1, -1, 267, -1, -1, 260, 271, 262, 263, -1, -1, 276, 267, 278, 279, 280, 271, 282, 93, -1, 285, 276, -1, 278, 279, 280, -1, 282, -1, 41, 285, 43, 44, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 41, 59, 43, 44, 45, 260, -1, 262, 263, -1, -1, -1, 267, -1, 41, -1, 271, 44, 59, -1, -1, 276, -1, 278, 279, 280, -1, 282, -1, -1, 285, -1, 59, -1, -1, 93, 94, -1, 260, -1, 262, 263, -1, -1, 41, 267, 43, 44, 45, 271, -1, -1, 93, 94, 276, -1, 278, 279, 280, -1, 282, -1, 59, 285, -1, -1, 93, 125, -1, -1, 260, -1, 262, 263, -1, -1, -1, 267, -1, -1, -1, 271, 41, -1, 125, 44, 276, -1, 278, 279, 280, -1, 282, -1, -1, 285, 93, 94, 125, 41, 59, 43, 44, 45, -1, -1, -1, -1, -1, -1, -1, 41, -1, 43, 44, 45, 43, 59, 45, -1, -1, -1, -1, 41, -1, 43, -1, 45, 125, 59, -1, -1, -1, -1, 93, -1, 41, -1, 43, 260, 45, 262, 263, -1, -1, -1, 267, -1, -1, -1, 271, 93, 94, -1, 43, 276, 45, 278, 279, 280, -1, 282, -1, 93, 285, -1, 125, 94, 41, -1, 43, 44, 45, -1, -1, -1, 94, -1, -1, -1, 41, -1, 43, 125, 45, -1, 59, -1, -1, 94, -1, -1, -1, -1, 41, 125, 43, 44, 45, 257, 258, 259, -1, -1, 93, 94, 264, 265, 266, 267, -1, 41, 59, 43, 44, 45, 257, 258, 259, 277, 93, -1, -1, 264, 265, 266, 267, -1, -1, 59, 257, 258, 259, 94, -1, 41, 277, -1, 44, 266, -1, 41, -1, 41, 44, 43, 93, 45, -1, -1, 277, -1, 125, 59, 41, -1, -1, 44, -1, 59, 257, 258, 259, 93, -1, -1, -1, 264, -1, 266, -1, -1, 59, -1, -1, -1, -1, -1, 125, 41, 277, 43, 44, 45, -1, -1, -1, 93, -1, -1, 41, -1, 43, 93, 45, 125, 94, -1, 257, 258, 259, 43, -1, 45, -1, -1, 93, 266, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 277, 125, -1, -1, 264, -1, 266, 125, -1, 257, 258, 259, -1, 258, 94, -1, 264, 277, 266, 264, 125, 266, 258, 259, -1, 94, -1, -1, 264, 277, 266, -1, -1, -1, 94, 258, 259, -1, -1, -1, -1, 264, -1, 266, -1, -1, -1, -1, -1, -1, -1, 258, 259, -1, -1, -1, -1, 264, -1, 266, -1, -1, -1, -1, -1, -1, 257, 258, 259, -1, -1, -1, -1, 264, -1, 266, -1, -1, -1, 258, 259, -1, -1, -1, -1, 264, 277, 266, -1, -1, -1, -1, 257, 258, 259, -1, -1, -1, -1, -1, -1, 266, -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, 277, -1, -1, -1, -1, -1, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 277, -1, -1, -1, 257, 258, 259, -1, -1, -1, 257, 258, 259, 258, 259, -1, -1, -1, -1, 264, -1, 266, -1, 257, 277, 259, -1, -1, -1, -1, 277, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 277, -1, -1, -1, 3, -1, 258, 259, -1, -1, -1, -1, 264, 265, 266, 267, -1, 258, 259, -1, -1, -1, -1, 264, -1, 266, 258, 259, 27, 28, -1, -1, 264, -1, 266, -1, -1, -1, -1, -1, -1, 40, 41, -1, -1, -1, -1, 46, 47, -1, 49, -1, 51, 52, -1, 54, -1, -1, -1, -1, -1, -1, -1, 62, 63, 64, 65, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 80, -1, 82, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, 95, -1, -1, -1, -1, -1, 101, -1, 103, -1, 105, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 118, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 134, -1, -1, -1, 138, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 155, }; #define YYFINAL 1 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 289 #if YYDEBUG char *yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,"'('","')'",0,"'+'","','","'-'",0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'",0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,"NEWLINE","AND","OR","NOT","STRING","NAME","NUMBER","MUL_OP", "ASSIGN_OP","REL_OP","INCR_DECR","Define","Break","Quit","Length","Return", "For","If","While","Sqrt","Else","Scale","Ibase","Obase","Auto","Read", "Warranty","Halt","Last","Continue","Print","Limits","UNARY_MINUS", }; char *yyrule[] = { "$accept : program", "program :", "program : program input_item", "input_item : semicolon_list NEWLINE", "input_item : function", "input_item : error NEWLINE", "semicolon_list :", "semicolon_list : statement_or_error", "semicolon_list : semicolon_list ';' statement_or_error", "semicolon_list : semicolon_list ';'", "statement_list :", "statement_list : statement_or_error", "statement_list : statement_list NEWLINE", "statement_list : statement_list NEWLINE statement_or_error", "statement_list : statement_list ';'", "statement_list : statement_list ';' statement", "statement_or_error : statement", "statement_or_error : error statement", "statement : Warranty", "statement : Limits", "statement : expression", "statement : STRING", "statement : Break", "statement : Continue", "statement : Quit", "statement : Halt", "statement : Return", "statement : Return '(' return_expression ')'", "$$1 :", "$$2 :", "$$3 :", "$$4 :", "statement : For $$1 '(' opt_expression ';' $$2 opt_expression ';' $$3 opt_expression ')' $$4 statement", "$$5 :", "statement : If '(' expression ')' $$5 statement opt_else", "$$6 :", "$$7 :", "statement : While $$6 '(' expression $$7 ')' statement", "statement : '{' statement_list '}'", "$$8 :", "statement : Print $$8 print_list", "print_list : print_element", "print_list : print_element ',' print_list", "print_element : STRING", "print_element : expression", "opt_else :", "$$9 :", "opt_else : Else $$9 statement", "$$10 :", "function : Define NAME '(' opt_parameter_list ')' '{' NEWLINE opt_auto_define_list $$10 statement_list NEWLINE '}'", "opt_parameter_list :", "opt_parameter_list : define_list", "opt_auto_define_list :", "opt_auto_define_list : Auto define_list NEWLINE", "opt_auto_define_list : Auto define_list ';'", "define_list : NAME", "define_list : NAME '[' ']'", "define_list : define_list ',' NAME", "define_list : define_list ',' NAME '[' ']'", "opt_argument_list :", "opt_argument_list : argument_list", "argument_list : expression", "argument_list : NAME '[' ']'", "argument_list : argument_list ',' expression", "argument_list : argument_list ',' NAME '[' ']'", "opt_expression :", "opt_expression : expression", "return_expression :", "return_expression : expression", "$$11 :", "expression : named_expression ASSIGN_OP $$11 expression", "$$12 :", "expression : expression AND $$12 expression", "$$13 :", "expression : expression OR $$13 expression", "expression : NOT expression", "expression : expression REL_OP expression", "expression : expression '+' expression", "expression : expression '-' expression", "expression : expression MUL_OP expression", "expression : expression '^' expression", "expression : '-' expression", "expression : named_expression", "expression : NUMBER", "expression : '(' expression ')'", "expression : NAME '(' opt_argument_list ')'", "expression : INCR_DECR named_expression", "expression : named_expression INCR_DECR", "expression : Length '(' expression ')'", "expression : Sqrt '(' expression ')'", "expression : Scale '(' expression ')'", "expression : Read '(' ')'", "named_expression : NAME", "named_expression : NAME '[' expression ']'", "named_expression : Ibase", "named_expression : Obase", "named_expression : Scale", "named_expression : Last", }; #endif #define yyclearin (yychar=(-1)) #define yyerrok (yyerrflag=0) #ifdef YYSTACKSIZE #ifndef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #endif #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 500 #define YYMAXDEPTH 500 #endif #endif int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short yyss[YYSTACKSIZE]; YYSTYPE yyvs[YYSTACKSIZE]; #define yystacksize YYSTACKSIZE #define YYABORT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab int yyparse() { register int yym, yyn, yystate; #if YYDEBUG register char *yys; extern char *getenv(); if (yys = getenv("YYDEBUG")) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if (yyn = yydefred[yystate]) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]); #endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #ifdef lint goto yynewerror; #endif yynewerror: yyerror("syntax error"); #ifdef lint goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("yydebug: state %d, error recovery shifting\ to state %d\n", *yyssp, yytable[yyn]); #endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("yydebug: error recovery discarding state %d\n", *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, error recovery discards token %d (%s)\n", yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 1: #line 106 "bc.y" { yyval.i_value = 0; if (interactive) { printf ("%s\n", BC_VERSION); welcome (); } } break; case 3: #line 117 "bc.y" { run_code (); } break; case 4: #line 119 "bc.y" { run_code (); } break; case 5: #line 121 "bc.y" { yyerrok; init_gen (); } break; case 6: #line 127 "bc.y" { yyval.i_value = 0; } break; case 10: #line 133 "bc.y" { yyval.i_value = 0; } break; case 17: #line 142 "bc.y" { yyval.i_value = yyvsp[0].i_value; } break; case 18: #line 145 "bc.y" { warranty (""); } break; case 19: #line 147 "bc.y" { limits (); } break; case 20: #line 149 "bc.y" { if (yyvsp[0].i_value & 2) warn ("comparison in expression"); if (yyvsp[0].i_value & 1) generate ("W"); else generate ("p"); } break; case 21: #line 158 "bc.y" { yyval.i_value = 0; generate ("w"); generate (yyvsp[0].s_value); free (yyvsp[0].s_value); } break; case 22: #line 165 "bc.y" { if (break_label == 0) yyerror ("Break outside a for/while"); else { sprintf (genstr, "J%1d:", break_label); generate (genstr); } } break; case 23: #line 175 "bc.y" { warn ("Continue statement"); if (continue_label == 0) yyerror ("Continue outside a for"); else { sprintf (genstr, "J%1d:", continue_label); generate (genstr); } } break; case 24: #line 186 "bc.y" { exit (0); } break; case 25: #line 188 "bc.y" { generate ("h"); } break; case 26: #line 190 "bc.y" { generate ("0R"); } break; case 27: #line 192 "bc.y" { generate ("R"); } break; case 28: #line 194 "bc.y" { yyvsp[0].i_value = break_label; break_label = next_label++; } break; case 29: #line 199 "bc.y" { if (yyvsp[-1].i_value > 1) warn ("Comparison in first for expression"); yyvsp[-1].i_value = next_label++; if (yyvsp[-1].i_value < 0) sprintf (genstr, "N%1d:", yyvsp[-1].i_value); else sprintf (genstr, "pN%1d:", yyvsp[-1].i_value); generate (genstr); } break; case 30: #line 210 "bc.y" { if (yyvsp[-1].i_value < 0) generate ("1"); yyvsp[-1].i_value = next_label++; sprintf (genstr, "B%1d:J%1d:", yyvsp[-1].i_value, break_label); generate (genstr); yyval.i_value = continue_label; continue_label = next_label++; sprintf (genstr, "N%1d:", continue_label); generate (genstr); } break; case 31: #line 221 "bc.y" { if (yyvsp[-1].i_value > 1) warn ("Comparison in third for expression"); if (yyvsp[-1].i_value < 0) sprintf (genstr, "J%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value); else sprintf (genstr, "pJ%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value); generate (genstr); } break; case 32: #line 231 "bc.y" { sprintf (genstr, "J%1d:N%1d:", continue_label, break_label); generate (genstr); break_label = yyvsp[-12].i_value; continue_label = yyvsp[-4].i_value; } break; case 33: #line 239 "bc.y" { yyvsp[-1].i_value = if_label; if_label = next_label++; sprintf (genstr, "Z%1d:", if_label); generate (genstr); } break; case 34: #line 246 "bc.y" { sprintf (genstr, "N%1d:", if_label); generate (genstr); if_label = yyvsp[-4].i_value; } break; case 35: #line 252 "bc.y" { yyvsp[0].i_value = next_label++; sprintf (genstr, "N%1d:", yyvsp[0].i_value); generate (genstr); } break; case 36: #line 258 "bc.y" { yyvsp[0].i_value = break_label; break_label = next_label++; sprintf (genstr, "Z%1d:", break_label); generate (genstr); } break; case 37: #line 265 "bc.y" { sprintf (genstr, "J%1d:N%1d:", yyvsp[-6].i_value, break_label); generate (genstr); break_label = yyvsp[-3].i_value; } break; case 38: #line 271 "bc.y" { yyval.i_value = 0; } break; case 39: #line 273 "bc.y" { warn ("print statement"); } break; case 43: #line 280 "bc.y" { generate ("O"); generate (yyvsp[0].s_value); free (yyvsp[0].s_value); } break; case 44: #line 286 "bc.y" { generate ("P"); } break; case 46: #line 290 "bc.y" { warn ("else clause in if statement"); yyvsp[0].i_value = next_label++; sprintf (genstr, "J%d:N%1d:", yyvsp[0].i_value, if_label); generate (genstr); if_label = yyvsp[0].i_value; } break; case 48: #line 300 "bc.y" { /* Check auto list against parameter list? */ check_params (yyvsp[-4].a_value,yyvsp[0].a_value); sprintf (genstr, "F%d,%s.%s[", lookup(yyvsp[-6].s_value,FUNCT), arg_str (yyvsp[-4].a_value,TRUE), arg_str (yyvsp[0].a_value,TRUE)); generate (genstr); free_args (yyvsp[-4].a_value); free_args (yyvsp[0].a_value); yyvsp[-7].i_value = next_label; next_label = 0; } break; case 49: #line 312 "bc.y" { generate ("0R]"); next_label = yyvsp[-11].i_value; } break; case 50: #line 318 "bc.y" { yyval.a_value = NULL; } break; case 52: #line 322 "bc.y" { yyval.a_value = NULL; } break; case 53: #line 324 "bc.y" { yyval.a_value = yyvsp[-1].a_value; } break; case 54: #line 326 "bc.y" { yyval.a_value = yyvsp[-1].a_value; } break; case 55: #line 329 "bc.y" { yyval.a_value = nextarg (NULL, lookup (yyvsp[0].s_value,SIMPLE)); } break; case 56: #line 331 "bc.y" { yyval.a_value = nextarg (NULL, lookup (yyvsp[-2].s_value,ARRAY)); } break; case 57: #line 333 "bc.y" { yyval.a_value = nextarg (yyvsp[-2].a_value, lookup (yyvsp[0].s_value,SIMPLE)); } break; case 58: #line 335 "bc.y" { yyval.a_value = nextarg (yyvsp[-4].a_value, lookup (yyvsp[-2].s_value,ARRAY)); } break; case 59: #line 338 "bc.y" { yyval.a_value = NULL; } break; case 61: #line 342 "bc.y" { if (yyvsp[0].i_value > 1) warn ("comparison in argument"); yyval.a_value = nextarg (NULL,0); } break; case 62: #line 347 "bc.y" { sprintf (genstr, "K%d:", -lookup (yyvsp[-2].s_value,ARRAY)); generate (genstr); yyval.a_value = nextarg (NULL,1); } break; case 63: #line 353 "bc.y" { if (yyvsp[0].i_value > 1) warn ("comparison in argument"); yyval.a_value = nextarg (yyvsp[-2].a_value,0); } break; case 64: #line 358 "bc.y" { sprintf (genstr, "K%d:", -lookup (yyvsp[-2].s_value,ARRAY)); generate (genstr); yyval.a_value = nextarg (yyvsp[-4].a_value,1); } break; case 65: #line 365 "bc.y" { yyval.i_value = -1; warn ("Missing expression in for statement"); } break; case 67: #line 372 "bc.y" { yyval.i_value = 0; generate ("0"); } break; case 68: #line 377 "bc.y" { if (yyvsp[0].i_value > 1) warn ("comparison in return expresion"); } break; case 69: #line 383 "bc.y" { if (yyvsp[0].c_value != '=') { if (yyvsp[-1].i_value < 0) sprintf (genstr, "DL%d:", -yyvsp[-1].i_value); else sprintf (genstr, "l%d:", yyvsp[-1].i_value); generate (genstr); } } break; case 70: #line 394 "bc.y" { if (yyvsp[0].i_value > 1) warn("comparison in assignment"); if (yyvsp[-2].c_value != '=') { sprintf (genstr, "%c", yyvsp[-2].c_value); generate (genstr); } if (yyvsp[-3].i_value < 0) sprintf (genstr, "S%d:", -yyvsp[-3].i_value); else sprintf (genstr, "s%d:", yyvsp[-3].i_value); generate (genstr); yyval.i_value = 0; } break; case 71: #line 410 "bc.y" { warn("&& operator"); yyvsp[0].i_value = next_label++; sprintf (genstr, "DZ%d:p", yyvsp[0].i_value); generate (genstr); } break; case 72: #line 417 "bc.y" { sprintf (genstr, "DZ%d:p1N%d:", yyvsp[-2].i_value, yyvsp[-2].i_value); generate (genstr); yyval.i_value = yyvsp[-3].i_value | yyvsp[0].i_value; } break; case 73: #line 423 "bc.y" { warn("|| operator"); yyvsp[0].i_value = next_label++; sprintf (genstr, "B%d:", yyvsp[0].i_value); generate (genstr); } break; case 74: #line 430 "bc.y" { int tmplab; tmplab = next_label++; sprintf (genstr, "B%d:0J%d:N%d:1N%d:", yyvsp[-2].i_value, tmplab, yyvsp[-2].i_value, tmplab); generate (genstr); yyval.i_value = yyvsp[-3].i_value | yyvsp[0].i_value; } break; case 75: #line 439 "bc.y" { yyval.i_value = yyvsp[0].i_value; warn("! operator"); generate ("!"); } break; case 76: #line 445 "bc.y" { yyval.i_value = 3; switch (*(yyvsp[-1].s_value)) { case '=': generate ("="); break; case '!': generate ("#"); break; case '<': if (yyvsp[-1].s_value[1] == '=') generate ("{"); else generate ("<"); break; case '>': if (yyvsp[-1].s_value[1] == '=') generate ("}"); else generate (">"); break; } } break; case 77: #line 473 "bc.y" { generate ("+"); yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value; } break; case 78: #line 478 "bc.y" { generate ("-"); yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value; } break; case 79: #line 483 "bc.y" { genstr[0] = yyvsp[-1].c_value; genstr[1] = 0; generate (genstr); yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value; } break; case 80: #line 490 "bc.y" { generate ("^"); yyval.i_value = yyvsp[-2].i_value | yyvsp[0].i_value; } break; case 81: #line 495 "bc.y" { generate ("n"); yyval.i_value = yyvsp[0].i_value; } break; case 82: #line 500 "bc.y" { yyval.i_value = 1; if (yyvsp[0].i_value < 0) sprintf (genstr, "L%d:", -yyvsp[0].i_value); else sprintf (genstr, "l%d:", yyvsp[0].i_value); generate (genstr); } break; case 83: #line 509 "bc.y" { int len = strlen(yyvsp[0].s_value); yyval.i_value = 1; if (len == 1 && *yyvsp[0].s_value == '0') generate ("0"); else if (len == 1 && *yyvsp[0].s_value == '1') generate ("1"); else { generate ("K"); generate (yyvsp[0].s_value); generate (":"); } free (yyvsp[0].s_value); } break; case 84: #line 525 "bc.y" { yyval.i_value = yyvsp[-1].i_value | 1; } break; case 85: #line 527 "bc.y" { yyval.i_value = 1; if (yyvsp[-1].a_value != NULL) { sprintf (genstr, "C%d,%s:", lookup (yyvsp[-3].s_value,FUNCT), arg_str (yyvsp[-1].a_value,FALSE)); free_args (yyvsp[-1].a_value); } else { sprintf (genstr, "C%d:", lookup (yyvsp[-3].s_value,FUNCT)); } generate (genstr); } break; case 86: #line 543 "bc.y" { yyval.i_value = 1; if (yyvsp[0].i_value < 0) { if (yyvsp[-1].c_value == '+') sprintf (genstr, "DA%d:L%d:", -yyvsp[0].i_value, -yyvsp[0].i_value); else sprintf (genstr, "DM%d:L%d:", -yyvsp[0].i_value, -yyvsp[0].i_value); } else { if (yyvsp[-1].c_value == '+') sprintf (genstr, "i%d:l%d:", yyvsp[0].i_value, yyvsp[0].i_value); else sprintf (genstr, "d%d:l%d:", yyvsp[0].i_value, yyvsp[0].i_value); } generate (genstr); } break; case 87: #line 562 "bc.y" { yyval.i_value = 1; if (yyvsp[-1].i_value < 0) { sprintf (genstr, "DL%d:x", -yyvsp[-1].i_value); generate (genstr); if (yyvsp[0].c_value == '+') sprintf (genstr, "A%d:", -yyvsp[-1].i_value); else sprintf (genstr, "M%d:", -yyvsp[-1].i_value); } else { sprintf (genstr, "l%d:", yyvsp[-1].i_value); generate (genstr); if (yyvsp[0].c_value == '+') sprintf (genstr, "i%d:", yyvsp[-1].i_value); else sprintf (genstr, "d%d:", yyvsp[-1].i_value); } generate (genstr); } break; case 88: #line 585 "bc.y" { generate ("cL"); yyval.i_value = 1;} break; case 89: #line 587 "bc.y" { generate ("cR"); yyval.i_value = 1;} break; case 90: #line 589 "bc.y" { generate ("cS"); yyval.i_value = 1;} break; case 91: #line 591 "bc.y" { warn ("read function"); generate ("cI"); yyval.i_value = 1; } break; case 92: #line 597 "bc.y" { yyval.i_value = lookup(yyvsp[0].s_value,SIMPLE); } break; case 93: #line 599 "bc.y" { if (yyvsp[-1].i_value > 1) warn("comparison in subscript"); yyval.i_value = lookup(yyvsp[-3].s_value,ARRAY); } break; case 94: #line 604 "bc.y" { yyval.i_value = 0; } break; case 95: #line 606 "bc.y" { yyval.i_value = 1; } break; case 96: #line 608 "bc.y" { yyval.i_value = 2; } break; case 97: #line 610 "bc.y" { yyval.i_value = 3; } break; #line 1314 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("yydebug: after reduction, shifting from state 0 to\ state %d\n", YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("yydebug: after reduction, shifting from state %d \ to state %d\n", *yyssp, yystate); #endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); } %{ /* bc.y: The grammar for a POSIX compatable bc processor with some extensions to the language. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "global.h" #include "proto.h" %} %start program %union { char *s_value; char c_value; int i_value; arg_list *a_value; } /* Extensions over POSIX bc. a) NAME was LETTER. This grammer allows longer names. Single letter names will still work. b) Relational_expression allowed only one comparison. This grammar has added boolean expressions with && (and) || (or) and ! (not) and allowed all of them in full expressions. c) Added an else to the if. d) Call by variable array parameters e) read() procedure that reads a number under program control from stdin. f) halt statement that halts the the program under program control. It is an executed statement. g) continue statement for for loops. h) optional expressions in the for loop. i) print statement to print multiple numbers per line. j) warranty statement to print an extended warranty notice. j) limits statement to print the processor's limits. */ %token NEWLINE AND OR NOT %token STRING NAME NUMBER /* '-', '+' are tokens themselves */ %token MUL_OP /* '*', '/', '%' */ %token ASSIGN_OP /* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ %token REL_OP /* '==', '<=', '>=', '!=', '<', '>' */ %token INCR_DECR /* '++', '--' */ %token Define Break Quit Length /* 'define', 'break', 'quit', 'length' */ %token Return For If While Sqrt Else /* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ %token Scale Ibase Obase Auto Read /* 'scale', 'ibase', 'obase', 'auto', 'read' */ %token Warranty, Halt, Last, Continue, Print, Limits /* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ /* Types of all other things. */ %type expression return_expression named_expression opt_expression %type '+' '-' %type opt_parameter_list opt_auto_define_list define_list %type opt_argument_list argument_list %type program input_item semicolon_list statement_list %type statement function statement_or_error /* precedence */ %left OR %left AND %nonassoc NOT %left REL_OP %right ASSIGN_OP %left '+' '-' %left MUL_OP %right '^' %nonassoc UNARY_MINUS %nonassoc INCR_DECR %% program : /* empty */ { $$ = 0; if (interactive) { printf ("%s\n", BC_VERSION); welcome (); } } | program input_item ; input_item : semicolon_list NEWLINE { run_code (); } | function { run_code (); } | error NEWLINE { yyerrok; init_gen (); } ; semicolon_list : /* empty */ { $$ = 0; } | statement_or_error | semicolon_list ';' statement_or_error | semicolon_list ';' ; statement_list : /* empty */ { $$ = 0; } | statement_or_error | statement_list NEWLINE | statement_list NEWLINE statement_or_error | statement_list ';' | statement_list ';' statement ; statement_or_error : statement | error statement { $$ = $2; } ; statement : Warranty { warranty (""); } | Limits { limits (); } | expression { if ($1 & 2) warn ("comparison in expression"); if ($1 & 1) generate ("W"); else generate ("p"); } | STRING { $$ = 0; generate ("w"); generate ($1); free ($1); } | Break { if (break_label == 0) yyerror ("Break outside a for/while"); else { sprintf (genstr, "J%1d:", break_label); generate (genstr); } } | Continue { warn ("Continue statement"); if (continue_label == 0) yyerror ("Continue outside a for"); else { sprintf (genstr, "J%1d:", continue_label); generate (genstr); } } | Quit { exit (0); } | Halt { generate ("h"); } | Return { generate ("0R"); } | Return '(' return_expression ')' { generate ("R"); } | For { $1 = break_label; break_label = next_label++; } '(' opt_expression ';' { if ($4 > 1) warn ("Comparison in first for expression"); $4 = next_label++; if ($4 < 0) sprintf (genstr, "N%1d:", $4); else sprintf (genstr, "pN%1d:", $4); generate (genstr); } opt_expression ';' { if ($7 < 0) generate ("1"); $7 = next_label++; sprintf (genstr, "B%1d:J%1d:", $7, break_label); generate (genstr); $$ = continue_label; continue_label = next_label++; sprintf (genstr, "N%1d:", continue_label); generate (genstr); } opt_expression ')' { if ($10 > 1) warn ("Comparison in third for expression"); if ($10 < 0) sprintf (genstr, "J%1d:N%1d:", $4, $7); else sprintf (genstr, "pJ%1d:N%1d:", $4, $7); generate (genstr); } statement { sprintf (genstr, "J%1d:N%1d:", continue_label, break_label); generate (genstr); break_label = $1; continue_label = $9; } | If '(' expression ')' { $3 = if_label; if_label = next_label++; sprintf (genstr, "Z%1d:", if_label); generate (genstr); } statement opt_else { sprintf (genstr, "N%1d:", if_label); generate (genstr); if_label = $3; } | While { $1 = next_label++; sprintf (genstr, "N%1d:", $1); generate (genstr); } '(' expression { $4 = break_label; break_label = next_label++; sprintf (genstr, "Z%1d:", break_label); generate (genstr); } ')' statement { sprintf (genstr, "J%1d:N%1d:", $1, break_label); generate (genstr); break_label = $4; } | '{' statement_list '}' { $$ = 0; } | Print { warn ("print statement"); } print_list ; print_list : print_element | print_element ',' print_list ; print_element : STRING { generate ("O"); generate ($1); free ($1); } | expression { generate ("P"); } ; opt_else : /* nothing */ | Else { warn ("else clause in if statement"); $1 = next_label++; sprintf (genstr, "J%d:N%1d:", $1, if_label); generate (genstr); if_label = $1; } statement function : Define NAME '(' opt_parameter_list ')' '{' NEWLINE opt_auto_define_list { /* Check auto list against parameter list? */ check_params ($4,$8); sprintf (g::::::::enstr, "F%d,%s.%s[", lookup($2,FUNCT), arg_str ($4,TRUE), arg_str ($8,TRUE)); generate (genstr); free_args ($4); free_args ($8); $1 = next_label; next_label = 0; } statement_list NEWLINE '}' { generate ("0R]"); next_label = $1; } ; opt_parameter_list : /* empty */ { $$ = NULL; } | define_list ; opt_auto_define_list : /* empty */ { $$ = NULL; } | Auto define_list NEWLINE { $$ = $2; } | Auto define_list ';' { $$ = $2; } ; define_list : NAME { $$ = nextarg (NULL, lookup ($1,SIMPLE)); } | NAME '[' ']' { $$ = nextarg (NULL, lookup ($1,ARRAY)); } | define_list ',' NAME { $$ = nextarg ($1, lookup ($3,SIMPLE)); } | define_list ',' NAME '[' ']' { $$ = nextarg ($1, lookup ($3,ARRAY)); } ; opt_argument_list : /* empty */ { $$ = NULL; } | argument_list ; argument_list : expression { if ($1 > 1) warn ("comparison in argument"); $$ = nextarg (NULL,0); } | NAME '[' ']' { sprintf (genstr, "K%d:", -lookup ($1,ARRAY)); generate (genstr); $$ = nextarg (NULL,1); } | argument_list ',' expression { if ($3 > 1) warn ("comparison in argument"); $$ = nextarg ($1,0); } | argument_list ',' NAME '[' ']' { sprintf (genstr, "K%d:", -lookup ($3,ARRAY)); generate (genstr); $$ = nextarg ($1,1); } ; opt_expression : /* empty */ { $$ = -1; warn ("Missing expression in for statement"); } | expression ; return_expression : /* empty */ { $$ = 0; generate ("0"); } | expression { if ($1 > 1) warn ("comparison in return expresion"); } ; expression : named_expression ASSIGN_OP { if ($2 != '=') { if ($1 < 0) sprintf (genstr, "DL%d:", -$1); else sprintf (genstr, "l%d:", $1); generate (genstr); } } expression { if ($4 > 1) warn("comparison in assignment"); if ($2 != '=') { sprintf (genstr, "%c", $2); generate (genstr); } if ($1 < 0) sprintf (genstr, "S%d:", -$1); else sprintf (genstr, "s%d:", $1); generate (genstr); $$ = 0; } ; | expression AND { warn("&& operator"); $2 = next_label++; sprintf (genstr, "DZ%d:p", $2); generate (genstr); } expression { sprintf (genstr, "DZ%d:p1N%d:", $2, $2); generate (genstr); $$ = $1 | $4; } | expression OR { warn("|| operator"); $2 = next_label++; sprintf (genstr, "B%d:", $2); generate (genstr); } expression { int tmplab; tmplab = next_label++; sprintf (genstr, "B%d:0J%d:N%d:1N%d:", $2, tmplab, $2, tmplab); generate (genstr); $$ = $1 | $4; } | NOT expression { $$ = $2; warn("! operator"); generate ("!"); } | expression REL_OP expression { $$ = 3; switch (*($2)) { case '=': generate ("="); break; case '!': generate ("#"); break; case '<': if ($2[1] == '=') generate ("{"); else generate ("<"); break; case '>': if ($2[1] == '=') generate ("}"); else generate (">"); break; } } | expression '+' expression { generate ("+"); $$ = $1 | $3; } | expression '-' expression { generate ("-"); $$ = $1 | $3; } | expression MUL_OP expression { genstr[0] = $2; genstr[1] = 0; generate (genstr); $$ = $1 | $3; } | expression '^' expression { generate ("^"); $$ = $1 | $3; } | '-' expression %prec UNARY_MINUS { generate ("n"); $$ = $2; } | named_expression { $$ = 1; if ($1 < 0) sprintf (genstr, "L%d:", -$1); else sprintf (genstr, "l%d:", $1); generate (genstr); } | NUMBER { int len = strlen($1); $$ = 1; if (len == 1 && *$1 == '0') generate ("0"); else if (len == 1 && *$1 == '1') generate ("1"); else { generate ("K"); generate ($1); generate (":"); } free ($1); } | '(' expression ')' { $$ = $2 | 1; } | NAME '(' opt_argument_list ')' { $$ = 1; if ($3 != NULL) { sprintf (genstr, "C%d,%s:", lookup ($1,FUNCT), arg_str ($3,FALSE)); free_args ($3); } else { sprintf (genstr, "C%d:", lookup ($1,FUNCT)); } generate (genstr); } | INCR_DECR named_expression { $$ = 1; if ($2 < 0) { if ($1 == '+') sprintf (genstr, "DA%d:L%d:", -$2, -$2); else sprintf (genstr, "DM%d:L%d:", -$2, -$2); } else { if ($1 == '+') sprintf (genstr, "i%d:l%d:", $2, $2); else sprintf (genstr, "d%d:l%d:", $2, $2); } generate (genstr); } | named_expression INCR_DECR { $$ = 1; if ($1 < 0) { sprintf (genstr, "DL%d:x", -$1); generate (genstr); if ($2 == '+') sprintf (genstr, "A%d:", -$1); else sprintf (genstr, "M%d:", -$1); } else { sprintf (genstr, "l%d:", $1); generate (genstr); if ($2 == '+') sprintf (genstr, "i%d:", $1); else sprintf (genstr, "d%d:", $1); } generate (genstr); } | Length '(' expression ')' { generate ("cL"); $$ = 1;} | Sqrt '(' expression ')' { generate ("cR"); $$ = 1;} | Scale '(' expression ')' { generate ("cS"); $$ = 1;} | Read '(' ')' { warn ("read function"); generate ("cI"); $$ = 1; } ; named_expression : NAME { $$ = lookup($1,SIMPLE); } | NAME '[' expression ']' { if ($3 > 1) warn("comparison in subscript"); $$ = lookup($1,ARRAY); } | Ibase { $$ = 0; } | Obase { $$ = 1; } | Scale { $$ = 2; } | Last { $$ = 3; } ; %% /* bcdefs.h: The single file to include all constants and type definitions. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ /* Include the configuration file. */ #include "config.h" /* Standard includes for all files. */ #include #include #include #ifdef STRINGS_H #include #else #include #endif #ifndef NO_LIMITS #include #endif /* Include the other definitions. */ #include "const.h" #include "number.h" /* These definitions define all the structures used in code and data storage. This includes the representation of labels. The "guiding" principle is to make structures that take a minimum of space when unused but can be built to contain the full structures. */ /* Labels are first. Labels are generated sequentially in functions and full code. They just "point" to a single bye in the code. The "address" is the byte number. The byte number is used to get an actual character pointer. */ typedef struct bc_label_group { long l_adrs [ BC_LABEL_GROUP ]; struct bc_label_group *l_next; } bc_label_group; /* Each function has its own code segments and labels. There can be no jumps between functions so labels are unique to a function. */ typedef struct arg_list { int av_name; struct arg_list *next; } arg_list; typedef struct { char f_defined; /* Is this function defined yet. */ char *f_body[BC_MAX_SEGS]; int f_code_size; bc_label_group *f_label; arg_list *f_params; arg_list *f_autos; } bc_function; /* Code addresses. */ typedef struct { int pc_func; int pc_addr; } program_counter; /* Variables are "pushable" (auto) and thus we need a stack mechanism. This is built into the variable record. */ typedef struct bc_var { bc_num v_value; struct bc_var *v_next; } bc_var; /* bc arrays can also be "auto" variables and thus need the same kind of stacking mechanisms. */ typedef struct bc_array_node { union { bc_num n_num [NODE_SIZE]; struct bc_array_node *n_down [NODE_SIZE]; } n_items; } bc_array_node; typedef struct bc_array { bc_array_node *a_tree; short a_depth; } bc_array; typedef struct bc_var_array { bc_array *a_value; char a_param; struct bc_var_array *a_next; } bc_var_array; /* For the stacks, execution and function, we need records to allow for arbitrary size. */ typedef struct estack_rec { bc_num s_num; struct estack_rec *s_next; } estack_rec; typedef struct fstack_rec { int s_val; struct fstack_rec *s_next; } fstack_rec; /* The following are for the name tree. */ typedef struct id_rec { char *id; /* The program name. */ /* A name == 0 => nothing assigned yet. */ int a_name; /* The array variable name (number). */ int f_name; /* The function name (number). */ int v_name; /* The variable name (number). */ short balance; /* For the balanced tree. */ struct id_rec *left, *right; /* Tree pointers. */ } id_rec; /* config.h */ #define SMALL_BUF #define BC_MATH_FILE "/usr/lib/libmath.b" #define SHORTNAMES /* const.h: Constants for bc. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ /* Define INT_MAX and LONG_MAX if not defined. Assuming 32 bits... */ #ifdef NO_LIMITS #define INT_MAX 0x7FFFFFFF #define LONG_MAX 0x7FFFFFFF #endif /* Define constants in some reasonable size. The next 4 constants are POSIX constants. */ #define BC_BASE_MAX INT_MAX #define BC_SCALE_MAX INT_MAX #define BC_STRING_MAX INT_MAX /* Definitions for arrays. */ #define BC_DIM_MAX 65535 /* this should be NODE_SIZE^NODE_DEPTH-1 */ #define NODE_SIZE 16 /* Must be a power of 2. */ #define NODE_MASK 0xf /* Must be NODE_SIZE-1. */ #define NODE_SHIFT 4 /* Number of 1 bits in NODE_MASK. */ #define NODE_DEPTH 4 /* Other BC limits defined but not part of POSIX. */ #define BC_LABEL_GROUP 64 #define BC_LABEL_LOG 6 #define BC_MAX_SEGS 16 /* Code segments. */ #define BC_SEG_SIZE 1024 #define BC_SEG_LOG 10 /* Maximum number of variables, arrays and functions and the allocation increment for the dynamic arrays. */ #define MAX_STORE 32767 #define STORE_INCR 32 /* Other interesting constants. */ #define FALSE 0 #define TRUE 1 #define SIMPLE 0 #define ARRAY 1 #define FUNCT 2 #define EXTERN extern #ifdef __STDC__ #define CONST const #define VOID void #else #define CONST #define VOID #endif /* Include the version definition. */ #include "version.h" /* execute.c - run a bc program. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include #include "global.h" #include "proto.h" /* The SIGINT interrupt handling routine. */ int had_sigint; void stop_execution (sig) int sig; { had_sigint = TRUE; printf ("\n"); rt_error ("interrupted execution"); } /* Get the current byte and advance the PC counter. */ unsigned char byte (pc) program_counter *pc; { int seg, offset; seg = pc->pc_addr >> BC_SEG_LOG; offset = pc->pc_addr++ % BC_SEG_SIZE; return (functions[pc->pc_func].f_body[seg][offset]); } /* The routine that actually runs the machine. */ void execute () { int label_num, l_gp, l_off; bc_label_group *gp; char inst, ch; int new_func; int var_name; int const_base; bc_num temp_num; arg_list *auto_list; /* Initialize this run... */ pc.pc_func = 0; pc.pc_addr = 0; runtime_error = FALSE; init_num (&temp_num); /* Set up the interrupt mechanism for an interactive session. */ if (interactive) { signal (SIGINT, stop_execution); had_sigint = FALSE; } while (pc.pc_addr < functions[pc.pc_func].f_code_size && !runtime_error) { inst = byte(&pc); #if DEBUG > 3 { /* Print out address and the stack before each instruction.*/ int depth; estack_rec *temp = ex_stack; printf ("func=%d addr=%d inst=%c\n",pc.pc_func, pc.pc_addr, inst); if (temp == NULL) printf ("empty stack.\n", inst); else { depth = 1; while (temp != NULL) { printf (" %d = ", depth); out_num (temp->s_num, 10, out_char); depth++; temp = temp->s_next; } } } #endif switch ( inst ) { case 'A' : /* increment array variable (Add one). */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); incr_array (var_name); break; case 'B' : /* Branch to a label if TOS != 0. Remove value on TOS. */ case 'Z' : /* Branch to a label if TOS == 0. Remove value on TOS. */ c_code = !is_zero (ex_stack->s_num); pop (); case 'J' : /* Jump to a label. */ label_num = byte(&pc); /* Low order bits first. */ label_num += byte(&pc) << 8; if (inst == 'J' || (inst == 'B' && c_code) || (inst == 'Z' && !c_code)) { gp = functions[pc.pc_func].f_label; l_gp = label_num >> BC_LABEL_LOG; l_off = label_num % BC_LABEL_GROUP; while (l_gp-- > 0) gp = gp->l_next; pc.pc_addr = gp->l_adrs[l_off]; } break; case 'C' : /* Call a function. */ /* Get the function number. */ new_func = byte(&pc); if ((new_func & 0x80) != 0) new_func = ((new_func << 8) & 0x7f) + byte(&pc); /* Check to make sure it is defined. */ if (!functions[new_func].f_defined) { rt_error ("Function %s not defined.", f_names[new_func]); break; } /* Check and push parameters. */ process_params (&pc, new_func); /* Push auto variables. */ for (auto_list = functions[new_func].f_autos; auto_list != NULL; auto_list = auto_list->next) auto_var (auto_list->av_name); /* Push pc and ibase. */ fpush (pc.pc_func); fpush (pc.pc_addr); fpush (i_base); /* Reset pc to start of function. */ pc.pc_func = new_func; pc.pc_addr = 0; break; case 'D' : /* Duplicate top of stack */ push_copy (ex_stack->s_num); break; case 'K' : /* Push a constant */ /* Get the input base and convert it to a bc number. */ if (pc.pc_func == 0) const_base = i_base; else const_base = fn_stack->s_val; if (const_base == 10) push_b10_const (&pc); else push_constant (prog_char, const_base); break; case 'L' : /* load array variable */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); load_array (var_name); break; case 'M' : /* decrement array variable (Minus!) */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); decr_array (var_name); break; case 'O' : /* Write a string to the output with processing. */ while ((ch = byte(&pc)) != '"') if (ch != '\\') out_char (ch); else { ch = byte(&pc); if (ch == '"') break; switch (ch) { case 'n': out_char ('\n'); break; case 't': out_char ('\t'); break; case 'r': out_char ('\r'); break; case 'b': out_char (007); break; case 'f': out_char ('\f'); break; case '\\': out_char ('\\'); break; default: break; } } if (interactive) fflush (stdout); break; case 'R' : /* Return from function */ if (pc.pc_func != 0) { /* "Pop" autos and parameters. */ pop_vars(functions[pc.pc_func].f_autos); pop_vars(functions[pc.pc_func].f_params); /* reset the pc. */ fpop (); pc.pc_addr = fpop (); pc.pc_func = fpop (); } else rt_error ("Return from main program."); break; case 'S' : /* store array variable */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); store_array (var_name); break; case 'T' : /* Test tos for zero */ c_code = is_zero (ex_stack->s_num); assign (c_code); break; case 'W' : /* Write the value on the top of the stack. */ case 'P' : /* Write the value on the top of the stack. No newline. */ out_num (ex_stack->s_num, o_base, out_char); if (inst == 'W') out_char ('\n'); store_var (3); /* Special variable "last". */ if (interactive) fflush (stdout); break; case 'c' : /* Call special function. */ new_func = byte(&pc); switch (new_func) { case 'L': /* Length function. */ /* For the number 0.xxxx, 0 is not significant. */ if (ex_stack->s_num->n_len == 1 && ex_stack->s_num->n_scale != 0 && ex_stack->s_num->n_value[0] == 0 ) int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); else int2num (&ex_stack->s_num, ex_stack->s_num->n_len + ex_stack->s_num->n_scale); break; case 'S': /* Scale function. */ int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); break; case 'R': /* Square Root function. */ if (!bc_sqrt (&ex_stack->s_num, scale)) rt_error ("Square root of a negative number"); break; case 'I': /* Read function. */ push_constant (input_char, i_base); break; } break; case 'd' : /* Decrement number */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); decr_var (var_name); break; case 'h' : /* Halt the machine. */ exit (0); case 'i' : /* increment number */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); incr_var (var_name); break; case 'l' : /* load variable */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); load_var (var_name); break; case 'n' : /* Negate top of stack. */ bc_sub (_zero_, ex_stack->s_num, &ex_stack->s_num); break; case 'p' : /* Pop the execution stack. */ pop (); break; case 's';;;;;;;;;;; : /* store variable */ var_name = byte(&pc); if ((var_name & 0x80) != 0) var_name = ((var_name << 8) & 0x7f) + byte(&pc); store_var (var_name); break; case 'w' : /* Write a string to the output. */ while ((ch = byte(&pc)) != '"') out_char (ch); if (interactive) fflush (stdout); break; case 'x' : /* Exchange Top of Stack with the one under the tos. */ if (check_stack(2)) { bc_num temp = ex_stack->s_num; ex_stack->s_num = ex_stack->s_next->s_num; ex_stack->s_next->s_num = temp; } break; case '0' : /* Load Constant 0. */ push_copy (_zero_); break; case '1' : /* Load Constant 0. */ push_copy (_one_); break; case '!' : /* Negate the boolean value on top of the stack. */ c_code = is_zero (ex_stack->s_num); assign (c_code); break; case '&' : /* compare greater than */ if (check_stack(2)) { c_code = !is_zero (ex_stack->s_next->s_num) && !is_zero (ex_stack->s_num); pop (); assign (c_code); } break; case '|' : /* compare greater than */ if (check_stack(2)) { c_code = !is_zero (ex_stack->s_next->s_num) || !is_zero (ex_stack->s_num); pop (); assign (c_code); } break; case '+' : /* add */ if (check_stack(2)) { bc_add (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num); pop(); pop(); push_num (temp_num); init_num (&temp_num); } break; case '-' : /* subtract */ if (check_stack(2)) { bc_sub (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num); pop(); pop(); push_num (temp_num); init_num (&temp_num); } break; case '*' : /* multiply */ if (check_stack(2)) { bc_multiply (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, scale); pop(); pop(); push_num (temp_num); init_num (&temp_num); } break; case '/' : /* divide */ if (check_stack(2)) { if (bc_divide (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, scale) == 0) { pop(); pop(); push_num (temp_num); init_num (&temp_num); } else rt_error ("Divide by zero"); } break; case '%' : /* remainder */ if (check_stack(2)) { if (is_zero (ex_stack->s_num)) rt_error ("Modulo by zero"); else { bc_modulo (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, scale); pop(); pop(); push_num (temp_num); init_num (&temp_num); } } break; case '^' : /* raise */ if (check_stack(2)) { bc_raise (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, scale); if (is_zero (ex_stack->s_next->s_num) && is_neg (ex_stack->s_num)) rt_error ("divide by zero"); pop(); pop(); push_num (temp_num); init_num (&temp_num); } break; case '=' : /* compare equal */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) == 0; pop (); assign (c_code); } break; case '#' : /* compare not equal */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) != 0; pop (); assign (c_code); } break; case '<' : /* compare less than */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) == -1; pop (); assign (c_code); } break; case '{' : /* compare less than or equal */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) <= 0; pop (); assign (c_code); } break; case '>' : /* compare greater than */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) == 1; pop (); assign (c_code); } break; case '}' : /* compare greater than or equal */ if (check_stack(2)) { c_code = bc_compare (ex_stack->s_next->s_num, ex_stack->s_num) >= 0; pop (); assign (c_code); } break; default : /* error! */ rt_error ("bad instruction: inst=%c", inst); } } /* Clean up the function stack and pop all autos/parameters. */ while (pc.pc_func != 0) { pop_vars(functions[pc.pc_func].f_autos); pop_vars(functions[pc.pc_func].f_params); fpop (); pc.pc_addr = fpop (); pc.pc_func = fpop (); } /* Clean up the execution stack. */ while (ex_stack != NULL) pop(); /* Clean up the interrupt stuff. */ if (interactive) { signal (SIGINT, use_quit); if (had_sigint) printf ("Interruption completed.\n"); } } /* Prog_char gets another byte from the program. It is used for conversion of text constants in the code to numbers. */ char prog_char () { return byte(&pc); } /* Read a character from the standard input. This function is used by the "read" function. */ char input_char () { char in_ch; /* Get a character from the standard input for the read function. */ in_ch = getchar(); /* Check for a \ quoted newline. */ if (in_ch == '\\') { in_ch = getchar(); if (in_ch == '\n') in_ch = getchar(); } /* Classify and preprocess the input character. */ if (isdigit(in_ch)) return (in_ch - '0'); if (in_ch >= 'A' && in_ch <= 'F') return (in_ch + 10 - 'A'); if (in_ch >= 'a' && in_ch <= 'f') return (in_ch + 10 - 'a'); if (in_ch == '.' || in_ch == '+' || in_ch == '-') return (in_ch); if (in_ch <= ' ') return (' '); return (':'); } /* Push_constant converts a sequence of input characters as returned by IN_CHAR into a number. The number is pushed onto the execution stack. The number is converted as a number in base CONV_BASE. */ void push_constant (in_char, conv_base) char (*in_char)(VOID); int conv_base; { int digits; bc_num build, temp, result, mult, divisor; char in_ch, first_ch; char negative; /* Initialize all bc numbers */ init_num (&temp); init_num (&result); init_num (&mult); build = copy_num (_zero_); negative = FALSE; /* The conversion base. */ int2num (&mult, conv_base); /* Get things ready. */ in_ch = in_char(); while (in_ch == ' ') in_ch = in_char(); if (in_ch == '+') in_ch = in_char(); else if (in_ch == '-') { negative = TRUE; in_ch = in_char(); } /* Check for the special case of a single digit. */ if (in_ch < 16) { first_ch = in_ch; in_ch = in_char(); if (in_ch < 16 && first_ch >= conv_base) first_ch = conv_base - 1; int2num (&build, (int) first_ch); } /* Convert the integer part. */ while (in_ch < 16) { if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; bc_multiply (build, mult, &result, 0); int2num (&temp, (int) in_ch); bc_add (result, temp, &build); in_ch = in_char(); } if (in_ch == '.') { in_ch = in_char(); if (in_ch >= conv_base) in_ch = conv_base-1; free_num (&result); free_num (&temp); divisor = copy_num (_one_); result = copy_num (_zero_); digits = 0; while (in_ch < 16) { bc_multiply (result, mult, &result, 0); int2num (&temp, (int) in_ch); bc_add (result, temp, &result); bc_multiply (divisor, mult, &divisor, 0); digits++; in_ch = in_char(); if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; } bc_divide (result, divisor, &result, digits); bc_add (build, result, &build); } /* Final work. */ if (negative) bc_sub (_zero_, build, &build); push_num (build); free_num (&temp); free_num (&result); free_num (&mult); } /* When converting base 10 constants from the program, we use this more efficient way to convert them to numbers. PC tells where the constant starts and is expected to be advanced to after the constant. */ void push_b10_const (pc) program_counter *pc; { bc_num build; program_counter look_pc; int kdigits, kscale; char inchar; char *ptr; /* Count the digits and get things ready. */ look_pc = *pc; kdigits = 0; kscale = 0; inchar = byte (&look_pc); while (inchar != '.' && inchar != ':') { kdigits++; inchar = byte(&look_pc); } if (inchar == '.' ) { inchar = byte(&look_pc); while (inchar != ':') { kscale++; inchar = byte(&look_pc); } } /* Get the first character again and move the pc. */ inchar = byte(pc); /* Secial cases of 0, 1, and A-F single inputs. */ if (kdigits == 1 && kscale == 0) { if (inchar == 0) { push_copy (_zero_); inchar = byte(pc); return; } if (inchar == 1) { push_copy (_one_); inchar = byte(pc); return; } if (inchar > 9) { init_num (&build); int2num (&build, inchar); push_num (build); inchar = byte(pc); return; } } /* Build the new number. */ if (kdigits == 0) { build = new_num (1,kscale); ptr = build->n_value; *ptr++ = 0; } else { build = new_num (kdigits,kscale); ptr = build->n_value; } while (inchar != ':') { if (inchar != '.') if (inchar > 9) *ptr++ = 9; else *ptr++ = inchar; inchar = byte(pc); } push_num (build); } /* Put the correct value on the stack for C_CODE. Frees TOS num. */ void assign (c_code) char c_code; { free_num (&ex_stack->s_num); if (c_code) ex_stack->s_num = copy_num (_one_); else ex_stack->s_num = copy_num (_zero_); } #!/bin/sh ed - math.h < 1) { f += 1; x /= 2; } /* Initialize the variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } } /* Natural log. Uses the fact that ln(x^2) = 2*ln(x) The series used is: ln(x) = 2(a+a^3/3+a^5/5+...) where a=(x-1)/(x+1) */ define l(x) { auto e, f, i, m, n, v, z /* return something for the special case. */ if (x <= 0) return (1 - 10^scale) /* Precondition x to make .5 < x < 2.0. */ z = scale; scale += 4; f = 2; i=0 while (x >= 2) { /* for large numbers */ f *= 2; x = sqrt(x); } while (x <= .5) { /* for small numbers */ f *= 2; x = sqrt(x); } /* Set up the loop. */ v = n = (x-1)/(x+1) m = n*n /* Sum the series. */ for (i=3; 1; i+=2) { e = (n *= m) / i if (e == 0) { v = f*v scale = z return (v/1) } v += e } } /* Sin(x) uses the standard series: sin(x) = x - x^3/3! + x^5/5! - x^7/7! ... */ define s(x) { auto e, i, m, n, s, v, z /* precondition x. */ z = scale scale = 1.1*z + 1; v = a(1) if (x < 0) { m = 1; x = -x; } scale = 0 n = (x / v + 2 )/4 x = x - 4*n*v if (n%2) x = -x /* Do the loop. */ scale = z + 2; v = e = x s = -x*x for (i=3; 1; i+=2) { e *= s/(i*(i-1)) if (e == 0) { scale = z if (m) return (-v/1); return (v/1); } v += e } } /* Cosine : cos(x) = sin(x+pi/2) */ define c(x) { auto v; scale += 1; v = s(x+a(1)*2); scale -= 1; return (v/1); } /* Arctan: Using the formula: atan(x) = atan(c) + atan((x-c)/(1+xc)) for a small c (.2 here) For under .2, use the series: atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... */ define a(x) { auto a, e, f, i, m, n, s, v, z /* Special case and for fast answers */ if (x==1) { if (scale <= 25) return (.7853981633974483096156608/1) if (scale <= 40) return (.7853981633974483096156608458198757210492/1) if (scale <= 60) \ return (.785398163397448309615660845819875721049292349843776455243736/1) } if (x==.2) { if (scale <= 25) return (.1973955598498807583700497/1) if (scale <= 40) return (.1973955598498807583700497651947902934475/1) if (scale <= 60) \ return (.197395559849880758370049765194790293447585103787852101517688/1) } /* Negative x? */ if (x<0) { m = 1; x = -x; } /* Save the scale. */ z = scale; /* Note: a and f are known to be zero due to being auto vars. */ /* Calculate atan of a known number. */ if (x > .2) { scale = z+4; a = a(.2); } /* Precondition x. */ scale = z+2; while (x > .2) { f += 1; x = (x-.2) / (1+x*.2); } /* Initialize the series. */ v = n = x; s = -x*x; /* Calculate the series. */ for (i=3; 1; i+=2) { e = (n *= s) / i; if (e == 0) { scale = z; if (m) return ((f*a+v)/-1); return ((f*a+v)/1); } v += e } } /* Bessel function of integer order. Uses the following: j(-n,x) = (-1)^n*j(n,x) j(n,x) = x^n/(2^n*n!) * (1 - x^2/(2^2*1!*(n+1)) + x^4/(2^4*2!*(n+1)*(n+2)) - x^6/(2^6*3!*(n+1)*(n+2)*(n+3)) .... ) */ define j(n,x) { auto a, d, e, f, i, m, s, v, z /* Make n an integer and check for negative n. */ z = scale; scale = 0; n = n/1; if (n<0) { n = -n; if (n%2 == 1) m = 1; } /* Compute the factor of x^n/(2^n*n!) */ f = 1; for (i=2; i<=n; i++) f = f*i; scale = 1.5*z; f = x^n / 2^n / f; /* Initialize the loop .*/ v = e = 1; s = -x*x/4 scale = 1.5*z /* The Loop.... */ for (i=1; 1; i++) { e = e * s / i / (n+i); if (e == 0) { scale = z if (m) return (-f*v/1); return (f*v/1); } v += e; } } /* load.c: This code "loads" code into the code segments. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "global.h" #include "proto.h" /* Load variables. */ program_counter load_adr; char load_str; char load_const; /* Initialize the load sequence. */ void init_load () { clear_func(0); load_adr.pc_func = 0; load_adr.pc_addr = 0; load_str = FALSE; load_const = FALSE; } /* addbyte adds one BYTE to the current code segment. */ void addbyte (byte) char byte; { int seg, offset, func; /* If there was an error, don't continue. */ if (had_error) return; /* Calculate the segment and offset. */ seg = load_adr.pc_addr >> BC_SEG_LOG; offset = load_adr.pc_addr++ % BC_SEG_SIZE; func = load_adr.pc_func; if (seg >= BC_MAX_SEGS) { yyerror ("Function too big."); return; } if (functions[func].f_body[seg] == NULL) functions[func].f_body[seg] = (char *) bc_malloc (BC_SEG_SIZE); /* Store the byte. */ functions[func].f_body[seg][offset] = byte; functions[func].f_code_size++; } /* Define a label LAB to be the current program counter. */ void def_label (lab) long lab; { bc_label_group *temp; int group, offset, func; /* Get things ready. */ group = lab >> BC_LABEL_LOG; offset = lab % BC_LABEL_GROUP; func = load_adr.pc_func; /* Make sure there is at least one label group. */ if (functions[func].f_label == NULL) { functions[func].f_label = (bc_label_group *) bc_malloc (sizeof(bc_label_group)); functions[func].f_label->l_next = NULL; } /* Add the label group. */ temp = functions[func].f_label; while (group > 0) { if (temp->l_next == NULL) { temp->l_next = (bc_label_group *) bc_malloc (sizeof(bc_label_group)); temp->l_next->l_next = NULL; } temp = temp->l_next; group --; } /* Define it! */ temp->l_adrs [offset] = load_adr.pc_addr; } /* Several instructions have integers in the code. They are all known to be legal longs. So, no error code is added. STR is the pointer to the load string and must be moved to the last non-digit character. */ long long_val (str) char **str; { int val = 0; char neg = FALSE; if (**str == '-') { neg = TRUE; (*str)++; } while (isdigit(**str)) val = val*10 + *(*str)++ - '0'; if (neg) return -val; else return val; } /* load_code loads the CODE into the machine. */ void load_code (code) char *code; { char *str; long ap_name; /* auto or parameter name. */ long label_no; long vaf_name; /* variable, array or function number. */ long func; program_counter save_adr; /* Initialize. */ str = code; /* Scan the code. */ while (*str != 0) { /* If there was an error, don't continue. */ if (had_error) return; if (load_str) { if (*str == '"') load_str = FALSE; addbyte (*str++); } else if (load_const) { if (*str == '\n') str++; else { if (*str == ':') { load_const = FALSE; addbyte (*str++); } else if (*str == '.') addbyte (*str++); else if (*str >= 'A') addbyte (*str++ + 10 - 'A'); else addbyte (*str++ - '0'); } } else { switch (*str) { case '"': /* Starts a string. */ load_str = TRUE; break; case 'N': /* A label */ str++; label_no = long_val (&str); def_label (label_no); break; case 'B': /* Branch to label. */ case 'J': /* Jump to label. */ case 'Z': /* Branch Zero to label. */ addbyte(*str++); label_no = long_val (&str); if (label_no > 65535L) { /* Better message? */ fprintf (stderr,"Program too big.\n"); exit(1); } addbyte ( (char) label_no & 0xFF); addbyte ( (char) label_no >> 8); break; case 'F': /* A function, get the name and initialize it. */ str++; func = long_val (&str); clear_func (func); #if DEBUG > 2 printf ("Loading function number %d\n", func); #endif /* get the parameters */ while (*str++ != '.') { if (*str == '.') { str++; break; } ap_name = long_val (&str); #if DEBUG > 2 printf ("parameter number %d\n", ap_name); #endif functions[(int)func].f_params = nextarg (functions[(int)func].f_params, ap_name); } /* get the auto vars */ while (*str != '[') { if (*str == ',') str++; ap_name = long_val (&str); #if DEBUG > 2 printf ("auto number %d\n", ap_name); #endif functions[(int)func].f_autos = nextarg (functions[(int)func].f_autos, ap_name); } save_adr = load_adr; load_adr.pc_func = func; load_adr.pc_addr = 0; break; case ']': /* A function end */ functions[load_adr.pc_func].f_defined = TRUE; load_adr = save_adr; break; case 'C': /* Call a function. */ addbyte (*str++); func = long_val (&str); if (func < 128) addbyte ( (char) func); else { addbyte ((func >> 8) & 0xff | 0x80); addbyte (func & 0xff); } if (*str == ',') str++; while (*str != ':') addbyte (*str++); addbyte (':'); break; case 'c': /* Call a special function. */ addbyte (*str++); addbyte (*str); break; case 'K': /* A constant.... may have an "F" in it. */ addbyte (*str); load_const = TRUE; break; case 'd': /* Decrement. */ case 'i': /* Increment. */ case 'l': /* Load. */ case 's': /* Store. */ case 'A': /* Array Increment */ case 'M': /* Array Decrement */ case 'L': /* Array Load */ case 'S': /* Array Store */ addbyte (*str++); vaf_name = long_val (&str); if (vaf_name < 128) addbyte (vaf_name); else { addbyte ((vaf_name >> 8) & 0xff | 0x80); addbyte (vaf_name & 0xff); } break; case '@': /* A command! */ switch (*(++str)) { case 'i': init_load (); break; case 'r': execute (); break; } break; case '\n': /* Ignore the newlines */ break; default: /* Anything else */ addbyte (*str); } str++; } } } .;/* main.c: The main program for bc. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include #include "global.h" #include "proto.h" /* Variables for processing multiple files. */ char first_file; extern FILE *yyin; /* The main program for bc. */ int main (argc, argv) int argc; char *argv[]; { int ch; /* Initialize many variables. */ compile_only = FALSE; use_math = FALSE; warn_not_std = FALSE; std_only = FALSE; if (isatty(0) && isatty(1)) interactive = TRUE; else interactive = FALSE; /* Parse the command line */ ch = getopt (argc, argv, "lcisvw"); while (ch != EOF) { switch (ch) { case 'c': /* compile only */ compile_only = TRUE; break; case 'l': /* math lib */ use_math = TRUE; break; case 'i': /* force interactive */ interactive = TRUE; break; case 'w': /* Non standard features give warnings. */ warn_not_std = TRUE; break; case 's': /* Non standard features give errors. */ std_only = TRUE; break; case 'v': /* Print the version. */ printf ("%s\n", BC_VERSION); break; } ch = getopt (argc, argv, "lcisvw"); } /* Initialize the machine. */ init_storage(); init_load(); /* Set up interrupts to print a message. */ if (interactive) signal (SIGINT, use_quit); /* Initialize the front end. */ init_tree(); init_gen (); g_argv = argv; g_argc = argc; is_std_in = FALSE; first_file = TRUE; if (!open_new_file ()) exit (1); /* Do the parse. */ yyparse (); /* End the compile only output with a newline. */ if (compile_only) printf ("\n"); exit (0); } /* This is the function that opens all the files. It returns TRUE if the file was opened, otherwise it returns FALSE. */ int open_new_file () { FILE *new_file; /* Set the line number. */ line_no = 1; /* Check to see if we are done. */ if (is_std_in) return (FALSE); /* Open the other files. */ if (use_math && first_file) { #ifdef BC_MATH_FILE /* Make the first file be the math library. */ new_file = fopen (BC_MATH_FILE, "r"); use_math = FALSE; if (new_file != NULL) { new_yy_file (new_file); return TRUE; } else { fprintf (stderr, "Math Library unavailable.\n"); exit (1); } #else /* Load the code from a precompiled version of the math libarary. */ extern char libmath[]; char tmp; /* These MUST be in the order of first mention of each function. That is why "a" comes before "c" even though "a" is defined after after "c". "a" is used in "s"! */ tmp = lookup ("e", FUNCT); tmp = lookup ("l", FUNCT); tmp = lookup ("s", FUNCT); tmp = lookup ("a", FUNCT); tmp = lookup ("c", FUNCT); tmp = lookup ("j", FUNCT); load_code (libmath); #endif } /* One of the argv values. */ while (optind < g_argc) { new_file = fopen (g_argv[optind], "r"); if (new_file != NULL) { new_yy_file (new_file); optind++; return TRUE; } fprintf (stderr, "File %s is unavailable.\n", g_argv[optind++]); exit (1); } /* If we fall through to here, we should return stdin. */ new_yy_file (stdin); is_std_in = TRUE; return TRUE; } /* Set yyin to the new file. */ void new_yy_file (file) FILE *file; { if (!first_file) fclose (yyin); yyin = file; first_file = FALSE; } /* Message to use quit. */ void use_quit (sig) int sig; { printf ("\n(interrupt) use quit to exit.\n"); signal (SIGINT, use_quit); } /* number.c: Implements arbitrary precision numbers. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "proto.h" /* Storage used for special numbers. */ bc_num _zero_; bc_num _one_; bc_num _two_; /* "Frees" a bc_num NUM. Actually decreases reference count and only frees the storage if reference count is zero. */ void free_num (num) bc_num *num; { if (*num == NULL) return; (*num)->n_refs--; if ((*num)->n_refs == 0) free(*num); *num = NULL; } /* new_num allocates a number and sets fields to known values. */ bc_num new_num (length, scale) int length, scale; { bc_num temp; temp = (bc_num) malloc (sizeof(bc_struct)+length+scale); if (temp == NULL) out_of_memory (); temp->n_sign = PLUS; temp->n_len = length; temp->n_scale = scale; temp->n_refs = 1; temp->n_value[0] = 0; return temp; } /* Intitialize the number package! */ void init_numbers () { _zero_ = new_num (1,0); _one_ = new_num (1,0); _one_->n_value[0] = 1; _two_ = new_num (1,0); _two_->n_value[0] = 2; } /* Make a copy of a number! Just increments the reference count! */ bc_num copy_num (num) bc_num num; { num->n_refs++; return num; } /* Initialize a number NUM by making it a copy of zero. */ void init_num (num) bc_num *num; { *num = copy_num (_zero_); } /* Convert an integer VAL to a bc number NUM. */ void int2num (num, val) bc_num *num; int val; { char buffer[30]; char *bptr, *vptr; int ix = 1; char neg = 0; /* Sign. */ if (val < 0) { neg = 1; val = -val; } /* Get things going. */ bptr = buffer; *bptr++ = val % 10; val = val / 10; /* Extract remaining digits. */ while (val != 0) { *bptr++ = val % 10; val = val / 10; ix++; /* Count the digits. */ } /* Make the number. */ free_num (num); *num = new_num (ix, 0); if (neg) (*num)->n_sign = MINUS; /* Assign the digits. */ vptr = (*num)->n_value; while (ix-- > 0) *vptr++ = *--bptr; } /* Convert a number NUM to a long. The function returns only the integer part of the number. For numbers that are too large to represent as a long, this function returns a zero. This can be detected by checking the NUM for zero after having a zero returned. */ long num2long (num) bc_num num; { long val; char *nptr; int index; /* Extract the int value, ignore the fraction. */ val = 0; nptr = num->n_value; for (index=num->n_len; (index>0) && (val<=(LONG_MAX/10)); index--) val = val*10 + *nptr++; /* Check for overflow. If overflow, return zero. */ if (index>0) val = 0; if (val < 0) val = 0; /* Return the value. */ if (num->n_sign == PLUS) return (val); else return (-val); } /* The following are some math routines for numbers. */ _PROTOTYPE(static int _do_compare, (bc_num n1, bc_num n2, int use_sign, int ignore_last)); _PROTOTYPE(static void _rm_leading_zeros, (bc_num num)); _PROTOTYPE(static bc_num _do_add, (bc_num n1, bc_num n2)); _PROTOTYPE(static bc_num _do_sub, (bc_num n1, bc_num n2)); _PROTOTYPE(static void _one_mult, (unsigned char *num, int size, int digit, unsigned char *result)); /* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just compare the magnitudes. */ static int _do_compare (n1, n2, use_sign, ignore_last) bc_num n1, n2; int use_sign; int ignore_last; { char *n1ptr, *n2ptr; int count; /* First, compare signs. */ if (use_sign && n1->n_sign != n2->n_sign) { if (n1->n_sign == PLUS) return (1); /* Positive N1 > Negative N2 */ else return (-1); /* Negative N1 < Positive N1 */ } /* Now compare the magnitude. */ if (n1->n_len != n2->n_len) { if (n1->n_len > n2->n_len) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* If we get here, they have the same number of integer digits. check the integer part and the equal length part of the fraction. */ count = n1->n_len + MIN (n1->n_scale, n2->n_scale); n1ptr = n1->n_value; n2ptr = n2->n_value; while ((count > 0) && (*n1ptr == *n2ptr)) { n1ptr++; n2ptr++; count--; } if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) return (0); if (count != 0) { if (*n1ptr > *n2ptr) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } else { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* They are equal up to the last part of the equal part of the fraction. */ if (n1->n_scale != n2->n_scale) if (n1->n_scale > n2->n_scale) { for (count = n1->n_scale-n2->n_scale; count>0; count--) if (*n1ptr++ != 0) { /* Magnitude of n1 > n2. */ if (!use_sign || n1->n_sign == PLUS) return (1); else return (-1); } } else { for (count = n2->n_scale-n1->n_scale; count>0; count--) if (*n2ptr++ != 0) { /* Magnitude of n1 < n2. */ if (!use_sign || n1->n_sign == PLUS) return (-1); else return (1); } } /* They must be equal! */ return (0); } /* This is the "user callable" routine to compare numbers N1 and N2. */ int bc_compare (n1, n2) bc_num n1, n2; { return _do_compare (n1, n2, TRUE, FALSE); } /* In some places we need to check if the number NUM is zero. */ char is_zero (num) bc_num num; { int count; char *nptr; /* Quick check. */ if (num == _zero_) return TRUE; /* Initialize */ count = num->n_len + num->n_scale; nptr = num->n_value; /* The check */ while ((count > 0) && (*nptr++ == 0)) count--; if (count != 0) return FALSE; else return TRUE; } /* In some places we need to check if the number is negative. */ char is_neg (num) bc_num num; { return num->n_sign == MINUS; } /* For many things, we may have leading zeros in a number NUM. _rm_leading_zeros just moves the data to the correct place and adjusts the length. */ static void _rm_leading_zeros (num) bc_num num; { int bytes; char *dst, *src; /* Do a quick check to see if we need to do it. */ if (*num->n_value != 0) return; /* The first digit is 0, find the first non-zero digit in the 10's or greater place. */ bytes = num->n_len; src = num->n_value; while (bytes > 1 && *src == 0) src++, bytes--; num->n_len = bytes; bytes += num->n_scale; dst = num->n_value; while (bytes-- > 0) *dst++ = *src++; } /* Perform addition: N1 is added to N2 and the value is returned. The signs of N1 and N2 are ignored. */ static bc_num _do_add (n1, n2) bc_num n1, n2; { bc_num sum; int sum_scale, sum_<;>;?;@;A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;digits; char *n1ptr, *n2ptr, *sumptr; int carry, n1bytes, n2bytes; /* Prepare sum. */ sum_scale = MAX (n1->n_scale, n2->n_scale); sum_digits = MAX (n1->n_len, n2->n_len) + 1; sum = new_num (sum_digits,sum_scale); /* Start with the fraction part. Initialize the pointers. */ n1bytes = n1->n_scale; n2bytes = n2->n_scale; n1ptr = (char *) (n1->n_value + n1->n_len + n1bytes - 1); n2ptr = (char *) (n2->n_value + n2->n_len + n2bytes - 1); sumptr = (char *) (sum->n_value + sum_scale + sum_digits - 1); /* Add the fraction part. First copy the longer fraction.*/ if (n1bytes != n2bytes) { if (n1bytes > n2bytes) while (n1bytes>n2bytes) { *sumptr-- = *n1ptr--; n1bytes--;} else while (n2bytes>n1bytes) { *sumptr-- = *n2ptr--; n2bytes--;} } /* Now add the remaining fraction part and equal size integer parts. */ n1bytes += n1->n_len; n2bytes += n2->n_len; carry = 0; while ((n1bytes > 0) && (n2bytes > 0)) { *sumptr = *n1ptr-- + *n2ptr-- + carry; if (*sumptr > 9) { carry = 1; *sumptr -= 10; } else carry = 0; sumptr--; n1bytes--; n2bytes--; } /* Now add carry the longer integer part. */ if (n1bytes == 0) { n1bytes = n2bytes; n1ptr = n2ptr; } while (n1bytes-- > 0) { *sumptr = *n1ptr-- + carry; if (*sumptr > 9) { carry = 1; *sumptr -= 10; } else carry = 0; sumptr--; } /* Set final carry. */ if (carry == 1) *sumptr += 1; /* Adjust sum and return. */ _rm_leading_zeros (sum); return sum; } /* Perform subtraction: N2 is subtracted from N1 and the value is returned. The signs of N1 and N2 are ignored. Also, N1 is assumed to be larger than N2. */ static bc_num _do_sub (n1, n2) bc_num n1, n2; { bc_num diff; int diff_scale, diff_len; int min_scale, min_len; char *n1ptr, *n2ptr, *diffptr; int borrow, count, val; /* Allocate temporary storage. */ diff_len = MAX (n1->n_len, n2->n_len); diff_scale = MAX (n1->n_scale, n2->n_scale); min_len = MIN (n1->n_len, n2->n_len); min_scale = MIN (n1->n_scale, n2->n_scale); diff = new_num (diff_len, diff_scale); /* Initialize the subtract. */ n1ptr = (char *) (n1->n_value + n1->n_len + n1->n_scale -1); n2ptr = (char *) (n2->n_value + n2->n_len + n2->n_scale -1); diffptr = (char *) (diff->n_value + diff_len + diff_scale -1); /* Subtract the numbers. */ borrow = 0; /* Take care of the longer scaled number. */ if (n1->n_scale != min_scale) { /* n1 has the longer scale */ for (count = n1->n_scale - min_scale; count > 0; count--) *diffptr-- = *n1ptr--; } else { /* n2 has the longer scale */ for (count = n2->n_scale - min_scale; count > 0; count--) { val = - *n2ptr-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Now do the equal length scale and integer parts. */ for (count = 0; count < min_len + min_scale; count++) { val = *n1ptr-- - *n2ptr-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *diffptr-- = val; } /* If n1 has more digits then n2, we now do that subtract. */ if (diff_len != min_len) { for (count = diff_len - min_len; count > 0; count--) { val = *n1ptr-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *diffptr-- = val; } } /* Clean up and return. */ _rm_leading_zeros (diff); return diff; } /* Here is the full add routine that takes care of negative numbers. N1 is added to N2 and the result placed into RESULT. */ void bc_add ( n1, n2, result) bc_num n1, n2, *result; { bc_num sum; int cmp_res; if (n1->n_sign == n2->n_sign) { sum = _do_add (n1, n2); sum->n_sign = n1->n_sign; } else { /* subtraction must be done. */ cmp_res = _do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ sum = _do_sub (n2, n1); sum->n_sign = n2->n_sign; break; case 0: /* They are equal! return zero! */ sum = copy_num (_zero_); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ sum = _do_sub (n1, n2); sum->n_sign = n1->n_sign; } } /* Clean up and return. */ free_num (result); *result = sum; } /* Here is the full subtract routine that takes care of negative numbers. N2 is subtracted from N1 and the result placed in RESULT. */ void bc_sub ( n1, n2, result) bc_num n1, n2, *result; { bc_num diff; int cmp_res; if (n1->n_sign != n2->n_sign) { diff = _do_add (n1, n2); diff->n_sign = n1->n_sign; } else { /* subtraction must be done. */ cmp_res = _do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ switch (cmp_res) { case -1: /* n1 is less than n2, subtract n1 from n2. */ diff = _do_sub (n2, n1); diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); break; case 0: /* They are equal! return zero! */ diff = copy_num (_zero_); break; case 1: /* n2 is less than n1, subtract n2 from n1. */ diff = _do_sub (n1, n2); diff->n_sign = n1->n_sign; break; } } /* Clean up and return. */ free_num (result); *result = diff; } /* The multiply routine. N2 time N1 is put int PROD with the scale of the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)). */ void bc_multiply (n1, n2, prod, scale) bc_num n1, n2, *prod; int scale; { bc_num pval; /* For the working storage. */ char *n1ptr, *n2ptr, *pvptr; /* Work pointers. */ char *n1end, *n2end; /* To the end of n1 and n2. */ int indx; int len1, len2, total_digits; long sum; int full_scale, prod_scale; int toss; /* Initialize things. */ len1 = n1->n_len + n1->n_scale; len2 = n2->n_len + n2->n_scale; total_digits = len1 + len2; full_scale = n1->n_scale + n2->n_scale; prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale))); toss = full_scale - prod_scale; pval = new_num (total_digits-full_scale, prod_scale); pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); n1end = (char *) (n1->n_value + len1 - 1); n2end = (char *) (n2->n_value + len2 - 1); pvptr = (char *) (pval->n_value + total_digits - toss - 1); sum = 0; /* Here are the loops... */ for (indx = 0; indx < toss; indx++) { n1ptr = (char *) (n1end - MAX(0, indx-len2+1)); n2ptr = (char *) (n2end - MIN(indx, len2-1)); while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) sum += *n1ptr-- * *n2ptr++; sum = sum / 10; } for ( ; indx < total_digits-1; indx++) { n1ptr = (char *) (n1end - MAX(0, indx-len2+1)); n2ptr = (char *) (n2end - MIN(indx, len2-1)); while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) sum += *n1ptr-- * *n2ptr++; *pvptr-- = sum % 10; sum = sum / 10; } *pvptr-- = sum; /* Assign to prod and clean up the number. */ free_num (prod); *prod = pval; _rm_leading_zeros (*prod); if (is_zero (*prod)) (*prod)->n_sign = PLUS; } /* Some utility routines for the divide: First a one digit multiply. NUM (with SIZE digits) is multiplied by DIGIT and the result is placed into RESULT. It is written so that NUM and RESULT can be the same pointers. */ static void _one_mult (num, size, digit, result) unsigned char *num; int size, digit; unsigned char *result; { int carry, value; unsigned char *nptr, *rptr; if (digit == 0) memset (result, 0, size); else { if (digit == 1) memcpy (result, num, size); else { /* Initialize */ nptr = (unsigned char *) (num+size-1); rptr = (unsigned char *) (result+size-1); carry = 0; while (size-- > 0) { value = *nptr-- * digit + carry; *rptr-- = value % 10; carry = value / 10; } if (carry != 0) *rptr = carry; } } } /* The full division routine. This computes N1 / N2. It returns 0 if the division is ok and the result is in QUOT. The number of digits after the decimal point is SCALE. It returns -1 if division by zero is tried. The algorithm is found in Knuth Vol 2. p237. */ int bc_divide (n1, n2, quot, scale) bc_num n1, n2, *quot; int scale; { bc_num qval; unsigned char *num1, *num2; unsigned char *ptr1, *ptr2, *n2ptr, *qptr; int scale1, val; unsigned int len1, len2, scale2, qdigits, extra, count; unsigned int qdig, qguess, borrow, carry; unsigned char *mval; char zero; unsigned int norm; /* Test for divide by zero. */ if (is_zero (n2)) return -1; /* Test for divide by 1. If it is we must truncate. */ if (n2->n_scale == 0) { if (n2->n_len == 1 && *n2->n_value == 1) { qval = new_num (n1->n_len, scale); qval->n_sign = (n1->n_sign == n2->n_sign ? PLUS : MINUS); memset (&qval->n_value[n1->n_len],0,scale); memcpy (qval->n_value, n1->n_value, n1->n_len + MIN(n1->n_scale,scale)); free_num (quot); *quot = qval; } } /* Set up the divide. Move the decimal point on n1 by n2's scale. Remember, zeros on the end of num2 are wasted effort for dividing. */ scale2 = n2->n_scale; n2ptr = (unsigned char *) n2->n_value+n2->n_len+scale2-1; while ((scale2 > 0) && (*n2ptr-- == 0)) scale2--; len1 = n1->n_len + scale2; scale1 = n1->n_scale - scale2; if (scale1 < scale) extra = scale - scale1; else extra = 0; num1 = (unsigned char *) malloc (n1->n_len+n1->n_scale+extra+2); if (num1 == NULL) out_of_memory(); memset (num1, 0, n1->n_len+n1->n_scale+extra+2); memcpy (num1+1, n1->n_value, n1->n_len+n1->n_scale); len2 = n2->n_len + scale2; num2 = (unsigned char *) malloc (len2+1); if (num2 == NULL) out_of_memory(); memcpy (num2, n2->n_value, len2); *(num2+len2) = 0; n2ptr = num2; while (*n2ptr == 0) { n2ptr++; len2--; } /* Calculate the number of quotient digits. */ if (len2 > len1+scale) { qdigits = scale+1; zero = TRUE; } else { zero = FALSE; if (len2>len1) qdigits = scale+1; /* One for the zero integer part. */ else qdigits = len1-len2+scale+1; } /* Allocate and zero the storage for the quotient. */ qval = new_num (qdigits-scale,scale); memset (qval->n_value, 0, qdigits); /* Allocate storage for the temporary storage mval. */ mval = (unsigned char *) malloc (len2+1); if (mval == NULL) out_of_memory (); /* Now for the full divide algorithm. */ if (!zero) { /* Normalize */ norm = 10 / ((int)*n2ptr + 1); if (norm != 1) { _one_mult (num1, len1+scale1+extra+1, norm, num1); _one_mult (n2ptr, len2, norm, n2ptr); } /* Initialize divide loop. */ qdig = 0; if (len2 > len1) qptr = (unsigned char *) qval->n_value+len2-len1; else qptr = (unsigned char *) qval->n_value; /* Loop */ while (qdig <= len1+scale-len2) { /* Calculate the quotient digit guess. */ if (*n2ptr == num1[qdig]) qguess = 9; else qguess = (num1[qdig]*10 + num1[qdig+1]) / *n2ptr; /* Test qguess. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) { qguess--; /* And again. */ if (n2ptr[1]*qguess > (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 + num1[qdig+2]) qguess--; } /* Multiply and subtract. */ borrow = 0; if (qguess != 0) { *mval = 0; _one_mult (n2ptr, len2, qguess, mval+1); ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) mval+len2; for (count = 0; count < len2+1; count++) { val = (int) *ptr1 - (int) *ptr2-- - borrow; if (val < 0) { val += 10; borrow = 1; } else borrow = 0; *ptr1-- = val; } } /* Test for negative result. */ if (borrow == 1) { qguess--; ptr1 = (unsigned char *) num1+qdig+len2; ptr2 = (unsigned char *) n2ptr+len2-1; carry = 0; for (count = 0; count < len2; count++) { val = (int) *ptr1 + (int) *ptr2-- + carry; if (val > 9) { val -= 10; carry = 1; } else carry = 0; *ptr1-- = val; } if (carry == 1) *ptr1 = (*ptr1 + 1) % 10; } /* We now know the quotient digit. */ *qptr++ = qguess; qdig++; } } /* Clean up and return the number. */ qval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); if (is_zero (qval)) qval->n_sign = PLUS; _rm_leading_zeros (qval); free_num (quot); *quot = qval; /* Clean up temporary storage. */ free (mval); free (num1); free (num2); return 0; /* Everything is OK. */ } /* Modulo for numbers. This computes NUM1 % NUM2 and puts the result in RESULT. */ int bc_modulo (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { bc_num temp; int rscale; /* Check for correct numbers. */ if (is_zero (num2)) return -1; /* Calculate final scale. */ rscale = MAX (num1->n_scale, num2->n_scale+scale); init_num (&temp); /* Calculate it. */ bc_divide (num1, num2, &temp, scale); bc_multiply (temp, num2, &temp, rscale); bc_sub (num1, temp, result); free_num (&temp); return 0; /* Everything is OK. */ } /* Raise NUM1 to the NUM2 power. The result is placed in RESULT. Maximum exponent is LONG_MAX. If a NUM2 is not an integer, only the integer part is used. */ void bc_raise (num1, num2, result, scale) bc_num num1, num2, *result; int scale; { bc_num temp, power; long exponent; int rscale; char neg; /* Check the exponent for scale digits and convert to a long. */ if (num2->n_scale != 0) rt_warn ("non-zero scale in exponent"); exponent = num2long (num2); if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) rt_error ("exponent too large in raise"); /* Special case if exponent is a zero. */ if (exponent == 0) { free_num (result); *result = copy_num (_one_); return; } /* Other initializations. */ if (exponent < 0) { neg = TRUE; exponent = -exponent; rscale = scale; } else { neg = FALSE; rscale = MIN (num1->n_scale*exponent, MAX(scale, num1->n_scale)); } temp = copy_num (_one_); power = copy_num (num1); /* Do the calculation. */ while (exponent != 0) { if (exponent & 1 != 0) bc_multiply (temp, power, &temp, rscale); bc_multiply (power, power, &power, rscale); exponent = exponent >> 1; } /* Assign the value. */ if (neg) { bc_divide (_one_, temp, result, rscale); free_num (&temp); } else { free_num (result); *result = temp; } free_num (&power); } /* Take the square root NUM and return it in NUM with SCALE digits after the decimal place. */ int bc_sqrt (num, scale) bc_num *num; int scale; { int rscale, cmp_res, done; int cscale; bc_num guess, guess1, point5; /* Initial checks. */ cmp_res = bc_compare (*num, _zero_); if (cmp_res < 0) return 0; /* error */ else { if (cmp_res == 0) { free_num (num); *num = copy_num (_zero_); return 1; } } cmp_res = bc_compare (*num, _one_); if (cmp_res == 0) { free_num (num); *num = copy_num (_one_); return 1; } /* Initialize the variables. */ rscale = MAX (scale, (*num)->n_scale); cscale = rscale + 2; init_num (&guess); init_num (&guess1); point5 = new_num (1,1); point5->n_value[1] = 5; /* Calculate the initial guess. */ if (cmp_res < 0) /* The number is between 0 and 1. Guess should start at 1. */ guess = copy_num (_one_); else { /* The number is greater than 1. Guess should start at 10^(exp/2). */ int2num (&guess,10); int2num (&guess1,(*num)->n_len); bc_multiply (guess1, point5, &guess1, rscale); guess1->n_scale = 0; bc_raise (guess, guess1, &guess, rscale); free_num (&guess1); } /* Find the square root using Newton's algorithm. */ done = FALSE; while (!done) { free_num (&guess1); guess1 = copy_num (guess); bc_divide (*num,guess,&guess,cscale); bc_add (guess,guess1,&guess); bc_multiply (guess,point5,&guess,cscale); cmp_res = _do_compare (guess,guess1,FALSE,TRUE); if (cmp_res == 0) done = TRUE; } /* Assign the number and clean up. */ free_num (num); bc_divide (guess,_one_,num,rscale); free_num (&guess); free_num (&guess1); free_num (&point5); return 1; } /* The following routines provide output for bcd numbers package using the rules of POSIX bc for output. */ /* This structure is used for saving digits in the conversion process. */ typedef struct stk_rec { long digit; struct stk_rec *next; } stk_rec; /* The reference string for digits. */ char ref_str[] = "0123456789ABCDEF"; /* A special output routine for "multi-character digits." Exactly SIZE characters must be output for the value VAL. If SPACE is non-zero, we must output one space before the number. OUT_CHAR is the actual routine for writing the characters. */ void out_long (val, size, space, out_char) long val; int size, space; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif { char digits[40]; int len, ix; if (space) (*out_char) (' '); sprintf (digits, "%ld", val); len = strlen (digits); while (size > len) { (*out_char) ('0'); size--; } for (ix=0; ix < len; ix++) (*out_char) (digits[ix]); } /* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR as the routine to do the actual output of the characters. */ void out_num (num, o_base, out_char) bc_num num; int o_base; #ifdef __STDC__ void (*out_char)(int); #else void (*out_char)(); #endif { char *nptr; int index, fdigit, pre_space; stk_rec *digits, *temp; bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit; /* The negative sign if needed. */ if (num->n_sign == MINUS) (*out_char) ('-'); /* Output the number. */ if (is_zero (num)) (*out_char) ('0'); else if (o_base == 10) { /* The number is in base 10, do it the fast way. */ nptr = num->n_value; if (num->n_len > 1 || *nptr != 0) for (index=num->n_len; index>0; index--) (*out_char) (BCD_CHAR(*nptr++)); else nptr++; /* Now the fraction. */ if (num->n_scale > 0) { (*out_char) ('.'); for (index=0; indexn_scale; index++) (*out_char) (BCD_CHAR(*nptr++)); } } else { /* The number is some other base. */ digits = NULL; init_num (&int_part); bc_divide (num, _one_, &int_part, 0); init_num (&frac_part); init_num (&cur_dig); init_num (&base); bc_sub (num, int_part, &frac_part); int2num (&base, o_base); init_num (&max_o_digit); int2num (&max_o_digit, o_base-1); /* Get the digits of the integer part and push them on a stack. */ while (!is_zero (int_part)) { bc_modulo (int_part, base, &cur_dig, 0); temp = (stk_rec *) malloc (sizeof(stk_rec)); if (temp == NULL) out_of_memory(); temp->digit = num2long (cur_dig); temp->next = digits; digits = temp; bc_divide (int_part, base, &int_part, 0); } /* Print the digits on the stack. */ if (digits != NULL) { /* Output the digits. */ while (digits != NULL) { temp = digits; digits = digits->next; if (o_base <= 16) (*out_char) (ref_str[ (int) temp->digit]); else out_long (temp->digit, max_o_digit->n_len, 1, out_char); free (temp); } } /* Get and print the digits of the fraction part. */ if (num->n_scale > 0) { (*out_char) ('.'); pre_space = 0; t_num = copy_num (_one_); while (t_num->n_len <= num->n_scale) { bc_multiply (frac_part, base, &frac_part, num->n_scale); fdigit = num2long (frac_part); int2num (&int_part, fdigit); bc_sub (frac_part, int_part, &frac_part); if (o_base <= 16) (*out_char) (ref_str[fdigit]); else { out_long (fdigit, max_o_digit->n_len, pre_space, out_char); pre_space = 1; } bc_multiply (t_num, base, &t_num, 0); } } /* Clean up. */ free_num (&int_part); free_num (&frac_part); free_num (&base); free_num (&cur_dig); } } #if DEBUG > 0 /* Debugging procedures. Some are just so one can call them from the debugger. */ /* p_n prints the number NUM in base 10. */ void p_n (num) bc_num num; { out_num (num, 10, out_char); return 0; } /* p_b prints a character array as if it was a string of bcd digits. */ void p_v (name, num, len) char *name; unsigned char *num; int len; { int i; printf ("%s=", name); for (i=0; in_sign = MINUS; ptr++; } else { (*num)->n_sign = PLUS; if (*ptr == '+') ptr++; } while (*ptr == '0') ptr++; /* Skip leading zeros. */ nptr = (*num)->n_value; if (zero_int) { *nptr++ = 0; digits = 0; } for (;digits > 0; digits--) *nptr++ = CH_VAL(*ptr++); /* Build the fractional part. */ if (strscale > 0) { ptr++; /* skip the decimal point! */ for (;strscale > 0; strscale--) *nptr++ = CH_VAL(*ptr++); } } /* Convert a numbers to a string. Base 10 only.*/ char *num2str (num) bc_num num; { char *str, *sptr; char *nptr; int index, signch; /* Allocate the string memory. */ signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */ if (num->n_scale > 0) str = (char *) malloc (num->n_len + num->n_scale + 2 + signch); else str = (char *) malloc (num->n_len + 1 + signch); if (str == NULL) out_of_memory(); /* The negative sign if needed. */ sptr = str; if (signch) *sptr++ = '-'; /* Load the whole number. */ nptr = num->n_value; for (index=num->n_len; index>0; index--) *sptr++ = BCD_CHAR(*nptr++); /* Now the fraction. */ if (num->n_scale > 0) { *sptr++ = '.'; for (index=0; indexn_scale; index++) *sptr++ = BCD_CHAR(*nptr++); } /* Terminate the string and return it! */ *sptr = '\0'; return (str); } #endif /* number.h: Arbitrary precision numbers header file. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ typedef enum {PLUS, MINUS} sign; typedef struct { sign n_sign; int n_len; /* The number of digits before the decimal point. */ int n_scale; /* The number of digits after the decimal point. */ int n_refs; /* The number of pointers to this number. */ char n_value[1]; /* The storage. Not zero char terminated. It is allocated with all other fields. */ } bc_struct; typedef bc_struct *bc_num; /* Some useful macros and constants. */ #define CH_VAL(c) (c - '0') #define BCD_CHAR(d) (d + '0') #ifdef MIN #undef MIN #undef MAX #endif #define MAX(a,b) (a>b?a:b) #define MIN(a,b) (a>b?b:a) #define ODD(a) (a&1) #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif /* proto.h: Prototype function definitions for "external" functions. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ /* For the pc version using k&r ACK. (minix1.5 and earlier.) */ #ifdef SHORTNAMES #define init_numbers i_numbers #define push_constant push__constant #define load_const in_load_const #define yy_get_next_buffer yyget_next_buffer #define yy_init_buffer yyinit_buffer #define yy_last_accepting_state yylast_accepting_state #define arglist1 arg1list #endif /* Include the standard library header files. */ #ifndef NO_UNISTD #include #endif #ifndef NO_STDLIB #ifdef __STDC__ #include #endif #endif /* Define the _PROTOTYPE macro if it is needed. */ #ifndef _PROTOTYPE #ifdef __STDC__ #define _PROTOTYPE(func, args) func args #else #define _PROTOTYPE(func, args) func() #endif #endif /* From execute.c */ _PROTOTYPE(void stop_execution, (int)); _PROTOTYPE(unsigned char byte, (program_counter *pc)); _PROTOTYPE(void execute, (void)); _PROTOTYPE(char prog_char, (void)); _PROTOTYPE(char input_char, (void)); _PROTOTYPE(void push_constant, (char (*in_char)(void), int conv_base)); _PROTOTYPE(void push_b10_const, (program_counter *pc)); _PROTOTYPE(void assign, (int c_code)); /* From util.c */ _PROTOTYPE(char *strcopyof, (char *str)); _PROTOTYPE(arg_list *nextarg, (arg_list *args, int val)); _PROTOTYPE(char *arg_str, (arg_list *args, int)); _PROTOTYPE(void free_args, (arg_list *args)); _PROTOTYPE(void check_params, (arg_list *params, arg_list *autos)); _PROTOTYPE(void init_gen, (void)); _PROTOTYPE(void generate, (char *str)); _PROTOTYPE(void run_code, (void)); _PROTOTYPE(void out_char, (int ch)); _PROTOTYPE(id_rec *find_id, (id_rec *tree, char *id)); _PROTOTYPE(int insert_id_rec, (id_rec **root, id_rec *new_id)); _PROTOTYPE(void init_tree, (void)); _PROTOTYPE(int lookup, (char *name, int namekind)); _PROTOTYPE(char *bc_malloc, (int)); _PROTOTYPE(void out_of_memory, (void)); _PROTOTYPE(void welcome, (void)); _PROTOTYPE(void warranty, (char *)); _PROTOTYPE(void limits, (void)); _PROTOTYPE(void yyerror, (char *str ,...)); _PROTOTYPE(void warn, (char *mesg ,...)); _PROTOTYPE(void rt_error, (char *mesg ,...)); _PROTOTYPE(void rt_warn, (char *mesg ,...)); /* From load.c */ _PROTOTYPE(void init_load, (void)); _PROTOTYPE(void addbyte, (int byte)); _PROTOTYPE(void def_label, (long lab)); _PROTOTYPE(long long_val, (char **str)); _PROTOTYPE(void load_code, (char *code)); /* From main.c */ _PROTOTYPE(int main, (int argc , char *argv [])); _PROTOTYPE(int open_new_file, (void)); _PROTOTYPE(void new_yy_file, (FILE *file)); _PROTOTYPE(void use_quit, (int)); /* From number.c */ _PROTOTYPE(void free_num, (bc_num *num)); _PROTOTYPE(bc_num new_num, (int length, int scale)); _PROTOTYPE(void init_numbers, (void)); _PROTOTYPE(bc_num copy_num, (bc_num num)); _PROTOTYPE(void init_num, (bc_num *num)); _PROTOTYPE(void str2num, (bc_num *num, char *str, int scale)); _PROTOTYPE(char *num2str, (bc_num num)); _PROTOTYPE(void int2num, (bc_num *num, int val)); _PROTOTYPE(long num2long, (bc_num num)); _PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2)); _PROTOTYPE(char is_zero, (bc_num num)); _PROTOTYPE(char is_neg, (bc_num num)); _PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result)); _PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result)); _PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale)); _PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale)); _PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result, int scale)); _PROTOTYPE(int bc_sqrt, (bc_num *num, int scale)); _PROTOTYPE(void out_long, (long val, int size, int space, void (*out_char)(int))); _PROTOTYPE(void out_num, (bc_num num, int o_base, void (* out_char)(int))); /* From storage.c */ _PROTOTYPE(void init_storage, (void)); _PROTOTYPE(void more_functions, (void)); _PROTOTYPE(void more_variables, (void)); _PROTOTYPE(void more_arrays, (void)); _PROTOTYPE(void clear_func, (int func )); _PROTOTYPE(int fpop, (void)); _PROTOTYPE(void fpush, (int val )); _PROTOTYPE(void pop, (void)); _PROTOTYPE(void push_copy, (bc_num num )); _PROTOTYPE(void push_num, (bc_num num )); _PROTOTYPE(char check_stack, (int depth )); _PROTOTYPE(bc_var *get_var, (int var_name )); _PROTOTYPE(bc_num *get_array_num, (int var_index, long index )); _PROTOTYPE(void store_var, (int var_name )); _PROTOTYPE(void store_array, (int var_name )); _PROTOTYPE(void load_var, (int var_name )); _PROTOTYPE(void load_array, (int var_name )); _PROTOTYPE(void decr_var, (int var_name )); _PROTOTYPE(void decr_array, (int var_name )); _PROTOTYPE(void incr_var, (int var_name )); _PROTOTYPE(void incr_array, (int var_name )); _PROTOTYPE(void auto_var, (int name )); _PROTOTYPE(void free_a_tree, (bc_array_node *root, int depth )); _PROTOTYPE(void pop_vars, (arg_list *list )); _PROTOTYPE(void process_params, (program_counter *pc, int func )); /* For the scanner and parser.... */ _PROTOTYPE(int yyparse, (void)); _PROTOTYPE(int yylex, (void)); /* Other things... */ _PROTOTYPE(int getopt, (int, char * const [], const char * )); , %{ /* sbc.y: A POSIX bc processor written for minix with no extensions. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "global.h" /* To get the global variables. */ #include "proto.h" %} %start program %union { char *s_value; char c_value; int i_value; arg_list *a_value; } %token NEWLINE AND OR NOT %token STRING NAME NUMBER /* '-', '+' are tokens themselves */ %token MUL_OP /* '*', '/', '%' */ %token ASSIGN_OP /* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ %token REL_OP /* '==', '<=', '>=', '!=', '<', '>' */ %token INCR_DECR /* '++', '--' */ %token Define Break Quit Length /* 'define', 'break', 'quit', 'length' */ %token Return For If While Sqrt Else /* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ %token Scale Ibase Obase Auto Read /* 'scale', 'ibase', 'obase', 'auto', 'read' */ %token Warranty, Halt, Last, Continue, Print, Limits /* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ /* The types of all other non-terminals. */ %type expression named_expression return_expression %type opt_parameter_list parameter_list opt_auto_define_list %type define_list opt_argument_list argument_list %type program input_item semicolon_list statement_list %type statement_or_error statement function relational_expression /* precedence */ %nonassoc REL_OP %right ASSIGN_OP %left '+' '-' %left MUL_OP %right '^' %nonassoc UNARY_MINUS %nonassoc INCR_DECR %% program : /* empty */ { $$ = 0; std_only = TRUE; if (interactive) { printf ("s%s\n", BC_VERSION); welcome(); } } | program input_item ; input_item : semicolon_list NEWLINE { run_code(); } | function { run_code(); } | error NEWLINE { yyerrok; init_gen() ; } ; semicolon_list : /* empty */ { $$ = 0; } | statement_or_error | semicolon_list ';' statement_or_error | semicolon_list ';' ; statement_list : /* empty */ { $$ = 0; } | statement | statement_list NEWLINE | statement_list NEWLINE statement | statement_list ';' | statement_list ';' statement ; statement_or_error : statement | error statement { $$ = $2; } ; statement : Warranty { warranty("s"); } | expression { if ($1 & 1) generate ("W"); else generate ("p"); } | STRING { $$ = 0; generate ("w"); generate ($1); free ($1); } | Break { if (break_label == 0) yyerror ("Break outside a for/while"); else { sprintf (genstr, "J%1d:", break_label); generate (genstr); } } | Quit { exit(0); } | Return { generate ("0R"); } | Return '(' return_expression ')' { generate ("R"); } | For { $1 = break_label; break_label = next_label++; } '(' expression ';' { $4 = next_label++; sprintf (genstr, "pN%1d:", $4); generate (genstr); } relational_expression ';' { $7 = next_label++; sprintf (genstr, "B%1d:J%1d:", $7, break_label); generate (genstr); $$ = next_label++; sprintf (genstr, "N%1d:", $$); generate (genstr); } expression ')' { sprintf (genstr, "pJ%1d:N%1d:", $4, $7); generate (genstr); } statement { sprintf (genstr, "J%1d:N%1d:", $9, break_label); generate (genstr); break_label = $1; } | If '(' relational_expression ')' { $3 = next_label++; sprintf (genstr, "Z%1d:", $3); generate (genstr); } statement { sprintf (genstr, "N%1d:", $3); generate (genstr); } | While { $1 = next_label++; sprintf (genstr, "N%1d:", $1); generate (genstr); } '(' relational_expression { $4 = break_label; break_label = next_label++; sprintf (genstr, "Z%1d:", break_label); generate (genstr); } ')' statement { sprintf (genstr, "J%1d:N%1d:", $1, break_label); generate (genstr); break_label = $4; } | '{' statement_list '}' { $$ = 0; } ; function : Define NAME '(' opt_parameter_list ')' '{' NEWLINE opt_auto_define_list { check_params ($4,$8); sprintf (genstr, "F%d,%s.%s[", lookup($2,FUNCT), arg_str ($4,TRUE), arg_str ($8,TRUE)); generate (genstr); free_args ($4); free_args ($8); $1 = next_label; next_label = 0; } statement_list NEWLINE '}' { generate ("0R]"); next_label = $1; } ; opt_parameter_list : /* empty */ { $$ = NULL; } | parameter_list ; parameter_list : NAME { $$ = nextarg (NULL, lookup($1,SIMPLE)); } | define_list ',' NAME { $$ = nextarg ($1, lookup($3,SIMPLE)); } ; opt_auto_define_list : /* empty */ { $$ = NULL; } | Auto define_list NEWLINE { $$ = $2; } | Auto define_list ';' { $$ = $2; } ; define_list : NAME { $$ = nextarg (NULL, lookup($1,SIMPLE)); } | NAME '[' ']' { $$ = nextarg (NULL, lookup($1,ARRAY)); } | define_list ',' NAME { $$ = nextarg ($1, lookup($3,SIMPLE)); } | define_list ',' NAME '[' ']' { $$ = nextarg ($1, lookup($3,ARRAY)); } ; opt_argument_list : /* empty */ { $$ = NULL; } | argument_list ; argument_list : expression { $$ = nextarg (NULL,0); } | argument_list ',' expression { $$ = nextarg ($1,0); } ; relational_expression : expression { $$ = 0; } | expression REL_OP expression { $$ = 0; switch (*($2)) { case '=': generate ("="); break; case '!': generate ("#"); break; case '<': if ($2[1] == '=') generate ("{"); else generate ("<"); break; case '>': if ($2[1] == '=') generate ("}"); else generate (">"); break; } } ; return_expression : /* empty */ { $$ = 0; generate ("0"); } | expression ; expression : named_expression ASSIGN_OP { if ($2 != '=') { if ($1 < 0) sprintf (genstr, "DL%d:", -$1); else sprintf (genstr, "l%d:", $1); generate (genstr); } } expression { $$ = 0; if ($2 != '=') { sprintf (genstr, "%c", $2); generate (genstr); } if ($1 < 0) sprintf (genstr, "S%d:", -$1); else sprintf f;h;i;j;(genstr, "s%d:", $1); generate (genstr); } | expression '+' expression { generate ("+"); } | expression '-' expression { generate ("-"); } | expression MUL_OP expression { genstr[0] = $2; genstr[1] = 0; generate (genstr); } | expression '^' expression { generate ("^"); } | '-' expression %prec UNARY_MINUS { generate ("n"); $$ = 1;} | named_expression { $$ = 1; if ($1 < 0) sprintf (genstr, "L%d:", -$1); else sprintf (genstr, "l%d:", $1); generate (genstr); } | NUMBER { int len = strlen($1); $$ = 1; if (len == 1 && *$1 == '0') generate ("0"); else { if (len == 1 && *$1 == '1') generate ("1"); else { generate ("K"); generate ($1); generate (":"); } free ($1); } } | '(' expression ')' { $$ = 1; } | NAME '(' opt_argument_list ')' { $$ = 1; if ($3 != NULL) { sprintf (genstr, "C%d,%s:", lookup($1,FUNCT), arg_str ($3,FALSE)); free_args ($3); } else sprintf (genstr, "C%d:", lookup($1,FUNCT)); generate (genstr); } | INCR_DECR named_expression { $$ = 1; if ($2 < 0) { if ($1 == '+') sprintf (genstr, "DA%d:L%d:", -$2, -$2); else sprintf (genstr, "DM%d:L%d:", -$2, -$2); } else { if ($1 == '+') sprintf (genstr, "i%d:l%d:", $2, $2); else sprintf (genstr, "d%d:l%d:", $2, $2); } generate (genstr); } | named_expression INCR_DECR { $$ = 1; if ($1 < 0) { sprintf (genstr, "DL%d:x", -$1); generate (genstr); if ($2 == '+') sprintf (genstr, "A%d:", -$1); else sprintf (genstr, "M%d:", -$1); } else { sprintf (genstr, "l%d:", $1); generate (genstr); if ($2 == '+') sprintf (genstr, "i%d:", $1); else sprintf (genstr, "d%d:", $1); } generate (genstr); } | Length '(' expression ')' { generate ("cL"); $$ = 1;} | Sqrt '(' expression ')' { generate ("cR"); $$ = 1;} | Scale '(' expression ')' { generate ("cS"); $$ = 1;} ; named_expression : NAME { $$ = lookup($1,SIMPLE); } | NAME '[' expression ']' { $$ = lookup($1,ARRAY); } | Ibase { $$ = 0; } | Obase { $$ = 1; } | Scale { $$ = 2; } ; %% /* A lexical scanner generated by flex */ /* scanner skeleton version: * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ */ #define FLEX_SCANNER #include /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include #include /* use prototypes in function declarations */ #define YY_USE_PROTOS /* the "const" storage-class-modifier is valid */ #define YY_USE_CONST #else /* ! __cplusplus */ #ifdef __STDC__ #ifdef __GNUC__ #include void *malloc( size_t ); void free( void* ); #else #include #endif /* __GNUC__ */ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #define YY_USE_CONST #endif #ifndef YY_USE_CONST #define const #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () /* we can't get here if it's an ANSI C compiler, or a C++ compiler, * so it's got to be a K&R compiler, and therefore there's no standard * place from which to include these definitions */ /* char *malloc(); int free(); */ int read(); #endif /* amount of stuff to slurp up with each read */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* returned upon end-of-file */ #define YY_END_TOK 0 /* copy whatever the last rule matched to the standard output */ /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ /* this used to be an fputs(), but since the string might contain NUL's, * we now use fwrite() */ #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) /* gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); #define YY_NULL 0 /* no semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #define yyterminate() return ( YY_NULL ) /* report a fatal error */ /* The funky do-while is used to turn this macro definition into * a single C statement (which needs a semi-colon terminator). * This avoids problems with code like: * * if ( something_happens ) * YY_FATAL_ERROR( "oops, the something happened" ); * else * everything_okay(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the YY_FATAL_ERROR() call. */ #define YY_FATAL_ERROR(msg) \ do \ { \ (void) fputs( msg, stderr ); \ (void) putc( '\n', stderr ); \ exit( 1 ); \ } \ while ( 0 ) /* default yywrap function - always treat EOF as an EOF */ #define yywrap() 1 /* enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN */ #define BEGIN yy_start = 1 + 2 * /* action number for EOF rule of a given start state */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* special action meaning "start processing a new file" */ #define YY_NEW_FILE \ do \ { \ yy_init_buffer( yy_current_buffer, yyin ); \ yy_load_buffer_state(); \ } \ while ( 0 ) /* default declaration of generated scanner - a define so the user can * easily add parameters */ #define YY_DECL int yylex YY_PROTO(( void )) /* code executed at the end of each rule */ #define YY_BREAK break; #define YY_END_OF_BUFFER_CHAR 0 #ifndef YY_BUF_SIZE #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ #endif typedef struct yy_buffer_state *YY_BUFFER_STATE; #define YY_CHAR unsigned char # line 1 "scan.l" #define INITIAL 0 # line 2 "scan.l" /* scan.l: the (f)lex description file for the scanner. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "y.tab.h" #include "global.h" #include "proto.h" /* Using flex, we can ask for a smaller input buffer. With lex, this does nothing! */ #ifdef SMALL_BUF #undef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 512 #endif /* We want to define our own yywrap. */ #undef yywrap _PROTOTYPE(int yywrap, (void)); /* MINIX returns from read with < 0 if SIGINT is encountered. In flex, we can redefine YY_INPUT to the following. In lex, this does nothing! */ #include #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \ while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ if (errno != EINTR) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); # line 60 "scan.l" /* done after the current pattern has been matched and before the * corresponding action - sets up yytext */ #define YY_DO_BEFORE_ACTION \ yytext = yy_bp; \ yyleng = yy_cp - yy_bp; \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* return all but the first 'n' matched characters back to the input stream */ #define yyless(n) \ do \ { \ /* undo effects of setting up yytext */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext ) struct yy_buffer_state { FILE *yy_input_file; YY_CHAR *yy_ch_buf; /* input buffer */ YY_CHAR *yy_buf_pos; /* current position in input buffer */ /* size of input buffer in bytes, not including room for EOB characters*/ int yy_buf_size; /* number of characters read into yy_ch_buf, not including EOB characters */ int yy_n_chars; int yy_eof_status; /* whether we've seen an EOF on this buffer */ #define EOF_NOT_SEEN 0 /* "pending" happens when the EOF has been seen but there's still * some text process */ #define EOF_PENDING 1 #define EOF_DONE 2 }; static YY_BUFFER_STATE yy_current_buffer; /* we provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state" */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed */ static YY_CHAR yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif #ifndef YY_USER_INIT #define YY_USER_INIT #endif extern YY_CHAR *yytext; extern int yyleng; extern FILE *yyin, *yyout; YY_CHAR *yytext; int yyleng; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; #define YY_END_OF_BUFFER 40 typedef int yy_state_type; static const short int yy_accept[144] = { 0, 0, 0, 40, 38, 33, 31, 25, 38, 26, 38, 22, 26, 22, 22, 38, 26, 37, 29, 27, 29, 38, 22, 35, 35, 35, 35, 35, 35, 3r;t;u;v;w;x;y;z;{;|;};~;;;;;;;;;;;;;;;;;;5, 35, 35, 35, 35, 35, 35, 35, 35, 35, 38, 33, 29, 0, 36, 27, 23, 30, 37, 0, 34, 37, 37, 0, 28, 32, 35, 35, 35, 35, 35, 35, 35, 35, 35, 7, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 24, 37, 0, 0, 37, 0, 35, 35, 35, 35, 35, 6, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 13, 35, 35, 35, 14, 16, 35, 17, 35, 35, 35, 35, 3, 15, 35, 35, 9, 35, 35, 2, 35, 35, 11, 35, 35, 12, 20, 35, 10, 35, 8, 35, 1, 4, 21, 5, 35, 35, 35, 19, 18, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 5, 1, 1, 6, 7, 1, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 17, 18, 19, 20, 1, 1, 21, 21, 21, 21, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 22, 23, 24, 25, 26, 1, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 36, 48, 36, 49, 36, 50, 51, 52, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[53] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1 } ; static const short int yy_base[146] = { 0, 0, 0, 193, 194, 190, 194, 172, 185, 170, 181, 194, 168, 42, 41, 41, 46, 52, 167, 61, 166, 181, 164, 135, 137, 139, 148, 140, 136, 0, 149, 27, 50, 147, 130, 126, 141, 40, 36, 120, 168, 194, 164, 194, 194, 194, 194, 66, 165, 194, 72, 76, 164, 194, 194, 0, 120, 134, 124, 131, 117, 117, 122, 132, 0, 113, 117, 117, 128, 119, 118, 52, 125, 107, 106, 114, 194, 80, 145, 84, 88, 144, 105, 118, 98, 108, 111, 0, 95, 95, 93, 105, 102, 91, 95, 88, 103, 85, 93, 84, 85, 90, 0, 90, 91, 85, 0, 0, 93, 0, 77, 76, 90, 74, 0, 0, 75, 87, 0, 90, 85, 0, 75, 83, 0, 76, 63, 0, 0, 66, 0, 62, 0, 47, 0, 0, 0, 0, 45, 53, 29, 0, 0, 194, 111, 56 } ; static const short int yy_def[146] = { 0, 143, 1, 143, 143, 143, 143, 143, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 143, 143, 143, 144, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 143, 143, 143, 143, 143, 143, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 143, 143 } ; static const short int yy_nxt[247] = { 0, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 11, 14, 15, 16, 17, 11, 18, 19, 20, 17, 11, 21, 11, 22, 4, 23, 24, 25, 26, 27, 28, 29, 30, 31, 29, 29, 32, 29, 29, 33, 34, 35, 36, 37, 29, 29, 38, 29, 11, 39, 11, 46, 46, 63, 49, 47, 55, 64, 44, 44, 47, 74, 48, 44, 50, 53, 51, 72, 75, 53, 53, 51, 53, 52, 53, 65, 142, 96, 41, 66, 77, 73, 141, 67, 53, 77, 80, 78, 50, 140, 51, 80, 139, 81, 77, 51, 97, 52, 47, 77, 138, 78, 80, 47, 137, 48, 136, 80, 135, 81, 42, 42, 134, 133, 132, 131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 80, 77, 101, 100, 99, 98, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 51, 79, 43, 40, 76, 71, 70, 69, 68, 62, 61, 60, 59, 58, 57, 56, 44, 54, 41, 41, 44, 45, 44, 43, 41, 40, 143, 3, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143 } ; static const short int yy_chk[247] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 14, 31, 16, 15, 145, 31, 14, 13, 15, 38, 15, 16, 17, 19, 17, 37, 38, 19, 19, 17, 19, 17, 19, 32, 140, 71, 19, 32, 47, 37, 139, 32, 19, 47, 50, 47, 51, 138, 51, 50, 133, 50, 77, 51, 71, 51, 79, 77, 131, 77, 80, 79, 129, 79, 126, 80, 125, 80, 144, 144, 123, 122, 120, 119, 117, 116, 113, 112, 111, 110, 108, 105, 104, 103, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 86, 85, 84, 83, 82, 81, 78, 75, 74, 73, 72, 70, 69, 68, 67, 66, 65, 63, 62, 61, 60, 59, 58, 57, 56, 52, 48, 42, 40, 39, 36, 35, 34, 33, 30, 28, 27, 26, 25, 24, 23, 22, 21, 20, 18, 12, 10, 9, 8, 7, 5, 3, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143 } ; static yy_state_type yy_last_accepting_state; static YY_CHAR *yy_last_accepting_cpos; /* the intent behind this definition is that it'll catch * any uses of REJECT which flex missed */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 /* these variables are all declared out here so that section 3 code can * manipulate them */ /* points to current character in buffer */ static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); #define yy_new_buffer yy_create_buffer #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif YY_DECL { register yy_state_type yy_current_state; register YY_CHAR *yy_cp, *yy_bp; register int yy_act; if ( yy_init ) { YY_USER_INIT; if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( yy_current_buffer ) yy_init_buffer( yy_current_buffer, yyin ); else yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); yy_init = 0; } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* support of yytext */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; yy_current_state = yy_start; yy_match: do { register YY_CHAR yy_c = yy_ec[*yy_cp]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_base[yy_current_state] != 194 ); yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; YY_USER_ACTION; do_action: /* this label is used only to access EOF actions */ switch ( yy_act ) { case 0: /* must backtrack */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: # line 61 "scan.l" return(Define); YY_BREAK case 2: # line 62 "scan.l" return(Break); YY_BREAK case 3: # line 63 "scan.l" return(Quit); YY_BREAK case 4: # line 64 "scan.l" return(Length); YY_BREAK case 5: # line 65 "scan.l" return(Return); YY_BREAK case 6: # line 66 "scan.l" return(For); YY_BREAK case 7: # line 67 "scan.l" return(If); YY_BREAK case 8: # line 68 "scan.l" return(While); YY_BREAK case 9: # line 69 "scan.l" return(Sqrt); YY_BREAK case 10: # line 70 "scan.l" return(Scale); YY_BREAK case 11: # line 71 "scan.l" return(Ibase); YY_BREAK case 12: # line 72 "scan.l" return(Obase); YY_BREAK case 13: # line 73 "scan.l" return(Auto); YY_BREAK case 14: # line 74 "scan.l" return(Else); YY_BREAK case 15: # line 75 "scan.l" return(Read); YY_BREAK case 16: # line 76 "scan.l" return(Halt); YY_BREAK case 17: # line 77 "scan.l" return(Last); YY_BREAK case 18: # line 78 "scan.l" return(Warranty); YY_BREAK case 19: # line 79 "scan.l" return(Continue); YY_BREAK case 20: # line 80 "scan.l" return(Print); YY_BREAK case 21: # line 81 "scan.l" return(Limits); YY_BREAK case 22: # line 82 "scan.l" { yylval.c_value = yytext[0]; return((int)yytext[0]); } YY_BREAK case 23: # line 84 "scan.l" { return(AND); } YY_BREAK case 24: # line 85 "scan.l" { return(OR); } YY_BREAK case 25: # line 86 "scan.l" { return(NOT); } YY_BREAK case 26: # line 87 "scan.l" { yylval.c_value = yytext[0]; return(MUL_OP); } YY_BREAK case 27: # line 88 "scan.l" { yylval.c_value = yytext[0]; return(ASSIGN_OP); } YY_BREAK case 28: # line 89 "scan.l" { #ifdef OLD_EQ_OP char warn_save; warn_save = warn_not_std; warn_not_std = TRUE; warn ("Old fashioned ="); warn_not_std = warn_save; yylval.c_value = yytext[1]; #else yylval.c_value = '='; yyless (1); #endif return(ASSIGN_OP); } YY_BREAK case 29: # line 103 "scan.l" { yylval.s_value = strcopyof(yytext); return(REL_OP); } YY_BREAK case 30: # line 104 "scan.l" { yylval.c_value = yytext[0]; return(INCR_DECR); } YY_BREAK case 31: # line 105 "scan.l" { line_no++; return(NEWLINE); } YY_BREAK case 32: # line 106 "scan.l" { line_no++; /* ignore a "quoted" newline */ } YY_BREAK case 33: # line 107 "scan.l" { /* ignore spaces and tabs */ } YY_BREAK case 34: # line 108 "scan.l" { int c; for (;;) { while ( ((c=input()) != '*') && (c != EOF)) /* eat it */ if (c == '\n') line_no++; if (c == '*') { while ( (c=input()) == '*') /* eat it*/; if (c == '/') break; /* at end of comment */ if (c == '\n') line_no++; } if (c == EOF) { fprintf (stderr,"EOF encountered in a comment.\n"); break; } } } YY_BREAK case 35: # line 129 "scan.l" { yylval.s_value = strcopyof(yytext); return(NAME); } YY_BREAK case 36: # line 130 "scan.l" { unsigned char *look; int count = 0; yylval.s_value = strcopyof(yytext); for (look = yytext; *look != 0; look++) { if (*look == '\n') line_no++; if (*look == '"') count++; } if (count != 2) yyerror ("NUL character in string."); return(STRING); } YY_BREAK case 37: # line 142 "scan.l" { unsigned char *src, *dst; int len; /* remove a trailing decimal point. */ len = strlen(yytext); if (yytext[len-1] == '.') yytext[len-1] = 0; /* remove leading zeros. */ src = yytext; dst = yytext; while (*src == '0') src++; if (*src == 0) src--; /* Copy strings removing the newlines. */ while (*src != 0) { if (*src == '\\') { src++; src++; line_no++; } else *dst++ = *src++; } *dst = 0; yylval.s_value = strcopyof(yytext); return(NUMBER); } YY_BREAK case 38: # line 169 "scan.l" { if (yytext[0] < ' ') yyerror ("illegal character: ^%c",yytext[0] + '@'); else if (yytext[0] > '~') yyerror ("illegal character: \\%3d", (int) yytext[0]); else yyerror ("illegal character: %s",yytext); } YY_BREAK case 39: # line 178 "scan.l" ECHO; YY_BREAK case YY_STATE_EOF(INITIAL): yyterminate(); case YY_END_OF_BUFFER: { /* amount of text matched not including the EOB char */ int yy_amount_of_matched_text = yy_cp - yytext - 1; /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; /* note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the end- * of-buffer state). Contrast this with the test in yyinput(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ { yy_state_type yy_next_state; yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* okay, we're now positioned to make the * NUL transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we * don't want to build jamming into it because * then it will run more slowly) */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext + YY_MORE_ADJ; if ( yy_next_state ) { /* consume the NUL */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* note: because we've taken care in * yy_get_next_buffer() to have set up yytext, * we can now set up yy_c_buf_p so that if some * total hoser (like flex itself) wants * to call the scanner after we return the * YY_NULL, it'll still work - another YY_NULL * will get returned. */ yy_c_buf_p = yytext + YY_MORE_ADJ; yy_act = YY_STATE_EOF((yy_start - 1) / 2); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_find_action; } break; } default: #ifdef FLEX_DEBUG printf( "action # %d\n", yy_act ); #endif YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } } } /* yy_get_next_buffer - try to read in a new buffer * * synopsis * int yy_get_next_buffer(); * * returns a code representing an action * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); /* try to read more data */ /* first move last chars to start of buffer */ number_to_move = yy_c_buf_p - yytext; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; else if ( num_to_read <= 0 ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); /* read in more data */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); } if ( yy_n_chars == 0 ) { if ( number_to_move == 1 ) { ret_val = EOB_ACT_END_OF_FILE; yy_current_buffer->yy_eof_status = EOF_DONE; } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_eof_status = EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; /* yytext begins at the second character in yy_ch_buf; the first * character is the one which preceded it before reading in the latest * buffer; it needs to be kept around in case it's a newline, so * yy_get_previous_state() will have with '^' rules active */ yytext = &yy_current_buffer->yy_ch_buf[1]; return ( ret_val ); } /* yy_get_previous_state - get the state just before the EOB char was reached * * synopsis * yy_state_type yy_get_previous_state(); */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register YY_CHAR *yy_cp; yy_current_state = yy_start; for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[*yy_cp] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return ( yy_current_state ); } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) register yy_state_type yy_current_state; #endif { register int yy_is_jam; register YY_CHAR *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 144 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 143); return ( yy_is_jam ? 0 : yy_current_state ); } #ifdef YY_USE_PROTOS static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) #else static void yyunput( c, yy_bp ) YY_CHAR c; register YY_CHAR *yy_bp; #endif { register YY_CHAR *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ register YY_CHAR *dest = &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; register YY_CHAR *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += dest - source; yy_bp += dest - source; yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) yy_cp[-2] = '\n'; *--yy_cp = c; /* note: the formal parameter *must* be called "yy_bp" for this * macro to now work correctly */ YY_DO_BEFORE_ACTION; /* set up yytext again */ } #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; YY_CHAR *yy_cp = yy_c_buf_p; *yy_cp = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext + YY_MORE_ADJ; return ( EOF ); } YY_NEW_FILE; #ifdef __cplusplus return ( yyinput() ); #else return ( input() ); #endif } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *yy_c_buf_p; yy_hold_char = *++yy_c_buf_p; return ( c ); } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* flush out information for old buffer */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* we don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); yy_init_buffer( b, file ); return ( b ); } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; free( (char *) b->yy_ch_buf ); free( (char *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { b->yy_input_file = file; /* we put in the '\n' and start reading from [1] so that an * initial match-at-newline will be true. */ b->yy_ch_buf[0] = '\n'; b->yy_n_chars = 1; /* we always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[1]; b->yy_eof_status = EOF_NOT_SEEN; } # line 178 "scan.l" /* This is the way to get multiple files input into lex. */ int yywrap() { if (!open_new_file ()) return (1); /* EOF on standard in. */ return (0); /* We have more input. */ } %{ /* scan.l: the (f)lex description file for the scanner. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "y.tab.h" #include "global.h" #include "proto.h" /* Using flex, we can ask for a smaller input buffer. With lex, this does nothing! */ #ifdef SMALL_BUF #undef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 512 #endif /* We want to define our own yywrap. */ #undef yywrap _PROTOTYPE(int yywrap, (void)); /* MINIX returns from read with < 0 if SIGINT is encountered. In flex, we can redefine YY_INPUT to the following. In lex, this does nothing! */ #include #undef YY_INPUT #define YY_INPUT(buf,result,max_size) \ while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ if (errno != EINTR) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); %} DIGIT [0-9A-F] LETTER [a-z] %% define return(Define); break return(Break); quit return(Quit); length return(Length); return return(Return); for return(For); if return(If); while return(While); sqrt return(Sqrt); scale return(Scale); ibase return(Ibase); obase return(Obase); auto return(Auto); else return(Else); read return(Read); halt return(Halt); last return(Last); warranty return(Warranty); continue return(Continue); print return(Print); limits return(Limits); "+"|"-"|";"|"("|")"|"{"|"}"|"["|"]"|","|"^" { yylval.c_value = yytext[0]; return((int)yytext[0]); } && { return(AND); } \|\| { return(OR); } "!" { return(NOT); } "*"|"/"|"%" { yylval.c_value = yytext[0]; return(MUL_OP); } "="|\+=|-=|\*=|\/=|%=|\^= { yylval.c_value = yytext[0]; return(ASSIGN_OP); } =\+|=-|=\*|=\/|=%|=\^ { #ifdef OLD_EQ_OP char warn_save; warn_save = warn_not_std; warn_not_std = TRUE; warn ("Old fashioned ="); warn_not_std = warn_save; yylval.c_value = yytext[1]; #else yylval.c_value = '='; yyless (1); #endif return(ASSIGN_OP); } ==|\<=|\>=|\!=|"<"|">" { yylval.s_value = strcopyof(yytext); return(REL_OP); } \+\+|-- { yylval.c_value = yytext[0]; return(INCR_DECR); } "\n" { line_no++; return(NEWLINE); } \\\n { line_no++; /* ignore a "quoted" newline */ } [ \t]+ { /* ignore spaces and tabs */ } "/*" { int c; for (;;) { while ( ((c=input()) != '*') && (c != EOF)) /* eat it */ if (c == '\n') line_no++; if (c == '*') { while ( (c=input()) == '*') /* eat it*/; if (c == '/') break; /* at end of comment */ if (c == '\n') line_no++; } if (c == EOF) { fprintf (stderr,"EOF encountered in a comment.\n"); break; } } } [a-z][a-z0-9_]* { yylval.s_value = strcopyof(yytext); return(NAME); } \"[^\"]*\" { unsigned char *look; int count = 0; yylval.s_value = strcopyof(yytext); for (look = yytext; *look != 0; look++) { if (*look == '\n') line_no++; if (*look == '"') count++; } if (count != 2) yyerror ("NUL character in string."); return(STRING); } {DIGIT}({DIGIT}|\\\n)*("."({DIGIT}|\\\n)*)?|"."(\\\n)*{DIGIT}({DIGIT}|\\\n)* { unsigned char *src, *dst; int len; /* remove a trailing decimal point. */ len = strlen(yytext); if (yytext[len-1] == '.') yytext[len-1] = 0; /* remove leading zeros. */ src = yytext; dst = yytext; while (*src == '0') src++; if (*src == 0) src--; /* Copy strings removing the newlines. */ while (*src != 0) { if (*src == '\\') { src++; src++; line_no++; } else *dst++ = *src++; } *dst = 0; yylval.s_value = strcopyof(yytext); return(NUMBER); } . { if (yytext[0] < ' ') yyerror ("illegal character: ^%c",yytext[0] + '@'); else if (yytext[0] > '~') yyerror ("illegal character: \\%3d", (int) yytext[0]); else yyerror ("illegal character: %s",yytext); } %% /* This is the way to get multiple files input into lex. */ int yywrap() { if (!open_new_file ()) return (1); /* EOF on standard in. */ return (0); /* We have more input. */ } /* storage.c: Code and data storage manipulations. This includes labels. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #include "global.h" #include "proto.h" /* Initialize the storage at the beginning of the run. */ void init_storage () { /* Functions: we start with none and ask for more. */ f_count = 0; more_functions (); f_names[0] = "(main)"; /* Variables. */ v_count = 0; more_variables (); /* Arrays. */ a_count = 0; more_arrays (); /* Other things... */ ex_stack = NULL; fn_stack = NULL; i_base = 10; o_base = 10; scale = 0; c_code = FALSE; init_numbers(); } /* Three functions for increasing the number of functions, variables, or arrays that are needed. This adds another 32 of the requested object. */ void more_functions (VOID) { int old_count; int indx1, indx2; bc_function *old_f; bc_function *f; char **old_names; /* Save old information. */ old_count = f_count; old_f = functions; old_names = f_names; /* Add a fixed amount and allocate new space. */ f_count += STORE_INCR; functions = (bc_function *) bc_malloc (f_count*sizeof (bc_function)); f_names = (char **) bc_malloc (f_count*sizeof (char *)); /* Copy old ones. */ for (indx1 = 0; indx1 < old_count; indx1++) { functions[indx1] = old_f[indx1]; f_names[indx1] = old_names[indx1]; } /* Initialize the new ones. */ for (; indx1 < f_count; indx1++) { f = &functions[indx1]; f->f_defined = FALSE; for (indx2 = 0; indx2 < BC_MAX_SEGS; indx2++) f->f_body [indx2] = NULL; f->f_code_size = 0; f->f_label = NULL; f->f_autos = NULL; f->f_params = NULL; } /* Free the old elements. */ if (old_count != 0) { free (old_f); free (old_names); } } void more_variables () { int indx; int old_count; bc_var **old_var; char **old_names; /* Save the old values. */ old_count = v_count; old_var = variables; old_names = v_names; /* Increment by a fixed amount and allocate. */ v_count += STORE_INCR; variables = (bc_var **) bc_malloc (v_count*sizeof(bc_var *)); v_names = (char **) bc_malloc (v_count*sizeof(char *)); /* Copy the old variables. */ for (indx = 3; indx < old_count; indx++) variables[indx] = old_var[indx]; /* Initialize the new elements. */ for (; indx < v_count; indx++) variables[indx] = NULL; /* Free the old elements. */ if (old_count != 0) { free (old_var); free (old_names); } } void more_arrays () { int indx; int old_count; bc_var_array **old_ary; char **old_names; /* Save the old values. */ old_count = a_count; old_ary = arrays; old_names = a_names; /* Increment by a fixed amount and allocate. */ a_count += STORE_INCR; arrays = (bc_var_array **) bc_malloc (a_count*sizeof(bc_var_array *)); a_names = (char **) bc_malloc (a_count*sizeof(char *)); /* Copy the old arrays. */ for (indx = 1; indx < old_count; indx++) arrays[indx] = old_ary[indx]; /* Initialize the new elements. */ for (; indx < v_count; indx++) arrays[indx] = NULL; /* Free the old elements. */ if (old_count != 0) { free (old_ary); free (old_names); } } /* clear_func clears out function FUNC and makes it ready to redefine. */ void clear_func (func) char func; { bc_function *f; int indx; bc_label_group *lg; /* Set the pointer to the function. */ f = &functions[func]; f->f_defined = FALSE; /* Clear the code segments. */ for (indx = 0; indx < BC_MAX_SEGS; indx++) { if (f->f_body[indx] != NULL) { free (f->f_body[indx]); f->f_body[indx] = NULL; } } f->f_code_size = 0; if (f->f_autos != NULL) { free_args (f->f_autos); f->f_autos = NULL; } if (f->f_params != NULL) { free_args (f->f_params); f->f_params = NULL; } while (f->f_label != NULL) { lg = f->f_label->l_next; free (f->f_label); f->f_label = lg; } } /* Pop the function execution stack and return the top. */ int fpop() { fstack_rec *temp; int retval; if (fn_stack != NULL) { temp = fn_stack; fn_stack = temp->s_next; retval = temp->s_val; free (temp); } return (retval); } /* Push VAL on to the function stack. */ void fpush (val) int val; { fstack_rec *temp; temp = (fstack_rec *) bc_malloc (sizeof (fstack_rec)); temp->s_next = fn_stack; temp->s_val = val; fn_stack = temp; } /* Pop and discard the top element of the regular execution stack. */ void pop () { estack_rec *temp; if (ex_stack != NULL) { temp = ex_stack; ex_stack = temp->s_next; free_num (&temp->s_num); free (temp); } } /* Push a copy of NUM on to the regular execution stack. */ void push_copy (num) bc_num num; { estack_rec *temp; temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); temp->s_num = copy_num (num); temp->s_next = ex_stack; ex_stack = temp; } /* Push NUM on to the regular execution stack. Do NOT push a copy. */ void push_num (num) bc_num num; { estack_rec *temp; temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); temp->s_num = num; temp->s_next = ex_stack; ex_stack = temp; } /* Make sure the ex_stack has at least DEPTH elements on it. Return TRUE if it has at least DEPTH elements, otherwise return FALSE. */ char check_stack (depth) int depth; { estack_rec *temp; temp = ex_stack; while ((temp != NULL) && (depth > 0)) { temp = temp->s_next; depth--; } if (depth > 0) { rt_error ("Stack error."); return FALSE; } return TRUE; } /* The following routines manipulate simple variables and array variables. */ /* get_var returns a pointer to the variable VAR_NAME. If one does not exist, one is created. */ bc_var * get_var (var_name) int var_name; { bc_var *var_ptr; var_ptr = variables[var_name]; if (var_ptr == NULL) { var_ptr = variables[var_name] = (bc_var *) bc_malloc (sizeof (bc_var)); init_num (&var_ptr->v_value); } return var_ptr; } /* get_array_num returns the address of the bc_num in the array structure. If more structure is requried to get to the index, this routine does the work to create that structure. VAR_INDEX is a zero based index into the arrays storage array. INDEX is the index into the bc array. */ bc_num * get_array_num (var_index, index) int var_index; long index; { bc_var_array *ary_ptr; bc_array *a_var; bc_array_node *temp; int log, ix, ix1; int sub [NODE_DEPTH]; /* Get the array entry. */ ary_ptr = arrays[var_index]; if (ary_ptr == NULL) { ary_ptr = arrays[var_index] = (bc_var_array *) bc_malloc (sizeof (bc_var_array)); ary_ptr->a_value = NULL; ary_ptr->a_next = NULL; ary_ptr->a_param = FALSE; } a_var = ary_ptr->a_value; if (a_var == NULL) { a_var = ary_ptr->a_value = (bc_array *) bc_malloc (sizeof (bc_array)); a_va;;;;;;;;;;;;;r->a_tree = NULL; a_var->a_depth = 0; } /* Get the index variable. */ sub[0] = index & NODE_MASK; ix = index >> NODE_SHIFT; log = 1; while (ix > 0 || log < a_var->a_depth) { sub[log] = ix & NODE_MASK; ix >>= NODE_SHIFT; log++; } /* Build any tree that is necessary. */ while (log > a_var->a_depth) { temp = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); if (a_var->a_depth != 0) { temp->n_items.n_down[0] = a_var->a_tree; for (ix=1; ix < NODE_SIZE; ix++) temp->n_items.n_down[ix] = NULL; } else { for (ix=0; ix < NODE_SIZE; ix++) temp->n_items.n_num[ix] = copy_num(_zero_); } a_var->a_tree = temp; a_var->a_depth++; } /* Find the indexed variable. */ temp = a_var->a_tree; while ( log-- > 1) { ix1 = sub[log]; if (temp->n_items.n_down[ix1] == NULL) { temp->n_items.n_down[ix1] = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); temp = temp->n_items.n_down[ix1]; if (log > 1) for (ix=0; ix < NODE_SIZE; ix++) temp->n_items.n_down[ix] = NULL; else for (ix=0; ix < NODE_SIZE; ix++) temp->n_items.n_num[ix] = copy_num(_zero_); } else temp = temp->n_items.n_down[ix1]; } /* Return the address of the indexed variable. */ return &(temp->n_items.n_num[sub[0]]); } /* Store the top of the execution stack into VAR_NAME. This includes the special variables ibase, obase, and scale. */ void store_var (var_name) int var_name; { bc_var *var_ptr; long temp; char toobig; if (var_name > 2) { /* It is a simple variable. */ var_ptr = get_var (var_name); if (var_ptr != NULL) { free_num(&var_ptr->v_value); var_ptr->v_value = copy_num (ex_stack->s_num); } } else { /* It is a special variable... */ toobig = FALSE; if (is_neg (ex_stack->s_num)) { switch (var_name) { case 0: rt_warn ("negative ibase, set to 2"); temp = 2; break; case 1: rt_warn ("negative obase, set to 2"); temp = 2; break; case 2: rt_warn ("negative scale, set to 0"); temp = 0; break; } } else { temp = num2long (ex_stack->s_num); if (!is_zero (ex_stack->s_num) && temp == 0) toobig = TRUE; } switch (var_name) { case 0: if (temp < 2 && !toobig) { i_base = 2; rt_warn ("ibase too small, set to 2"); } else if (temp > 16 || toobig) { i_base = 16; rt_warn ("ibase too large, set to 16"); } else i_base = (int) temp; break; case 1: if (temp < 2 && !toobig) { o_base = 2; rt_warn ("obase too small, set to 2"); } else if (temp > BC_BASE_MAX || toobig) { o_base = BC_BASE_MAX; rt_warn ("obase too large, set to %d", BC_BASE_MAX); } else o_base = (int) temp; break; case 2: /* WARNING: The following if statement may generate a compiler warning if INT_MAX == LONG_MAX. This is NOT a problem. */ if (temp > BC_SCALE_MAX || toobig ) { scale = BC_SCALE_MAX; rt_warn ("scale too large, set to %d", BC_SCALE_MAX); } else scale = (int) temp; } } } /* Store the top of the execution stack into array VAR_NAME. VAR_NAME is the name of an array, and the next to the top of stack for the index into the array. */ void store_array (var_name) int var_name; { bc_num *num_ptr; long index; if (!check_stack(2)) return; index = num2long (ex_stack->s_next->s_num); if (index < 0 || index > BC_DIM_MAX || (index == 0 && !is_zero(ex_stack->s_next->s_num))) rt_error ("Array %s subscript out of bounds.", a_names[var_name]); else { num_ptr = get_array_num (var_name, index); if (num_ptr != NULL) { free_num (num_ptr); *num_ptr = copy_num (ex_stack->s_num); free_num (&ex_stack->s_next->s_num); ex_stack->s_next->s_num = ex_stack->s_num; init_num (&ex_stack->s_num); pop(); } } } /* Load a copy of VAR_NAME on to the execution stack. This includes the special variables ibase, obase and scale. */ void load_var (var_name) int var_name; { bc_var *var_ptr; switch (var_name) { case 0: /* Special variable ibase. */ push_copy (_zero_); int2num (&ex_stack->s_num, i_base); break; case 1: /* Special variable obase. */ push_copy (_zero_); int2num (&ex_stack->s_num, o_base); break; case 2: /* Special variable scale. */ push_copy (_zero_); int2num (&ex_stack->s_num, scale); break; default: /* It is a simple variable. */ var_ptr = variables[var_name]; if (var_ptr != NULL) push_copy (var_ptr->v_value); else push_copy (_zero_); } } /* Load a copy of VAR_NAME on to the execution stack. This includes the special variables ibase, obase and scale. */ void load_array (var_name) int var_name; { bc_num *num_ptr; long index; if (!check_stack(1)) return; index = num2long (ex_stack->s_num); if (index < 0 || index > BC_DIM_MAX || (index == 0 && !is_zero(ex_stack->s_num))) rt_error ("Array %s subscript out of bounds.", a_names[var_name]); else { num_ptr = get_array_num (var_name, index); if (num_ptr != NULL) { pop(); push_copy (*num_ptr); } } } /* Decrement VAR_NAME by one. This includes the special variables ibase, obase, and scale. */ void decr_var (var_name) int var_name; { bc_var *var_ptr; switch (var_name) { case 0: /* ibase */ if (i_base > 2) i_base--; else rt_warn ("ibase too small in --"); break; case 1: /* obase */ if (o_base > 2) o_base--; else rt_warn ("obase too small in --"); break; case 2: /* scale */ if (scale > 0) scale--; else rt_warn ("scale can not be negative in -- "); break; default: /* It is a simple variable. */ var_ptr = get_var (var_name); if (var_ptr != NULL) bc_sub (var_ptr->v_value,_one_,&var_ptr->v_value); } } /* Decrement VAR_NAME by one. VAR_NAME is an array, and the top of the execution stack is the index and it is popped off the stack. */ void decr_array (var_name) char var_name; { bc_num *num_ptr; long index; /* It is an array variable. */ if (!check_stack (1)) return; index = num2long (ex_stack->s_num); if (index < 0 || index > BC_DIM_MAX || (index == 0 && !is_zero (ex_stack->s_num))) rt_error ("Array %s subscript out of bounds.", a_names[var_name]); else { num_ptr = get_array_num (var_name, index); if (num_ptr != NULL) { pop (); bc_sub (*num_ptr, _one_, num_ptr); } } } /* Increment VAR_NAME by one. This includes the special variables ibase, obase, and scale. */ void incr_var (var_name) int var_name; { bc_var *var_ptr; switch (var_name) { case 0: /* ibase */ if (i_base < 16) i_base++; else rt_warn ("ibase too big in ++"); break; case 1: /* obase */ if (o_base < BC_BASE_MAX) o_base++; else rt_warn ("obase too big in ++"); break; case 2: if (scale < BC_SCALE_MAX) scale++; else rt_warn ("Scale too big in ++"); break; default: /* It is a simple variable. */ var_ptr = get_var (var_name); if (var_ptr != NULL) bc_add (var_ptr->v_value, _one_, &var_ptr->v_value); } } /* Increment VAR_NAME by one. VAR_NAME is an array and top of execution stack is the index and is popped off the stack. */ void incr_array (var_name) int var_name; { bc_num *num_ptr; long index; if (!check_stack (1)) return; index = num2long (ex_stack->s_num); if (index < 0 || index > BC_DIM_MAX || (index == 0 && !is_zero (ex_stack->s_num))) rt_error ("Array %s subscript out of bounds.", a_names[var_name]); else { num_ptr = get_array_num (var_name, index); if (num_ptr != NULL) { pop (); bc_add (*num_ptr, _one_, num_ptr); } } } /* Routines for processing autos variables and parameters. */ /* NAME is an auto variable that needs to be pushed on its stack. */ void auto_var (name) int name; { bc_var *v_temp; bc_var_array *a_temp; int ix; if (name > 0) { /* A simple variable. */ ix = name; v_temp = (bc_var *) bc_malloc (sizeof (bc_var)); v_temp->v_next = variables[ix]; init_num (&v_temp->v_value); variables[ix] = v_temp; } else { /* An array variable. */ ix = -name; a_temp = (bc_var_array *) bc_malloc (sizeof (bc_var_array)); a_temp->a_next = arrays[ix]; a_temp->a_value = NULL; a_temp->a_param = FALSE; arrays[ix] = a_temp; } } /* Free_a_tree frees everything associated with an array variable tree. This is used when popping an array variable off its auto stack. */ void free_a_tree ( root, depth ) bc_array_node *root; int depth; { int ix; if (root != NULL) { if (depth > 1) for (ix = 0; ix < NODE_SIZE; ix++) free_a_tree (root->n_items.n_down[ix], depth-1); else for (ix = 0; ix < NODE_SIZE; ix++) free_num ( &(root->n_items.n_num[ix])); free (root); } } /* LIST is an NULL terminated list of varible names that need to be popped off their auto stacks. */ void pop_vars (list) arg_list *list; { bc_var *v_temp; bc_var_array *a_temp; int ix; while (list != NULL) { ix = list->av_name; if (ix > 0) { /* A simple variable. */ v_temp = variables[ix]; if (v_temp != NULL) { variables[ix] = v_temp->v_next; free_num (&v_temp->v_value); free (v_temp); } } else { /* An array variable. */ ix = -ix; a_temp = arrays[ix]; if (a_temp != NULL) { arrays[ix] = a_temp->a_next; if (!a_temp->a_param && a_temp->a_value != NULL) { free_a_tree (a_temp->a_value->a_tree, a_temp->a_value->a_depth); free (a_temp->a_value); } free (a_temp); } } list = list->next; } } /* A call is being made to FUNC. The call types are at PC. Process the parameters by doing an auto on the parameter variable and then store the value at the new variable or put a pointer the the array variable. */ void process_params (pc, func) program_counter *pc; int func; { char ch; arg_list *params; char warned = FALSE; int ix, ix1; bc_var *v_temp; bc_var_array *a_src, *a_dest; bc_num *n_temp; /* Get the parameter names from the function. */ params = functions[func].f_params; while ((ch = byte(pc)) != ':') { if (params != NULL) { if ((ch == '0') && params->av_name > 0) { /* A simple variable. */ ix = params->av_name; v_temp = (bc_var *) bc_malloc (sizeof(bc_var)); v_temp->v_next = variables[ix]; v_temp->v_value = ex_stack->s_num; init_num (&ex_stack->s_num); variables[ix] = v_temp; } else if ((ch == '1') && (params->av_name < 0)) { /* The variables is an array variable. */ /* Compute source index and make sure some structure exists. */ ix = (int) num2long (ex_stack->s_num); n_temp = get_array_num (ix, 0); /* Push a new array and Compute Destination index */ auto_var (params->av_name); ix1 = -params->av_name; /* Set up the correct pointers in the structure. */ if (ix == ix1) a_src = arrays[ix]->a_next; else a_src = arrays[ix]; a_dest = arrays[ix1]; a_dest->a_param = TRUE; a_dest->a_value = a_src->a_value; } else { if (params->av_name < 0) rt_error ("Parameter type mismatch parameter %s.", a_names[-params->av_name]); else rt_error ("Parameter type mismatch, parameter %s.", v_names[params->av_name]); params++; } pop (); } else { if (!warned) { rt_error ("Parameter number mismatch"); warned = TRUE; } } params = params->next; } if (params != NULL) rt_error ("Parameter number mismatch"); } /* util.c: Utility routines for bc. */ /* This file is part of bc written for MINIX. Copyright (C) 1991, 1992 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License , or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. You may contact the author by: e-mail: phil@cs.wwu.edu us-mail: Philip A. Nelson Computer Science Department, 9062 Western Washington University Bellingham, WA 98226-9062 *************************************************************************/ #include "bcdefs.h" #ifndef VARARGS #include #else #include #endif #include "global.h" #include "proto.h" /* strcopyof mallocs new memory and copies a string to to the new memory. */ char * strcopyof (str) char *str; { char *temp; temp = (char *) bc_malloc (strlen (str)+1); return (strcpy (temp,str)); } /* nextarg adds another value to the list of arguments. */ arg_list * nextarg (args, val) arg_list *args; char val; { arg_list *temp; temp = (arg_list *) bc_malloc (sizeof (arg_list)); temp->av_name = val; temp->next = args; return (temp); } /* For generate, we must produce a string in the form "val,val,...,val". We also need a couple of static variables for retaining old generated strings. It also uses a recursive function that builds the string. */ static char *arglist1 = NULL, *arglist2 = NULL; /* make_arg_str does the actual construction of the argument string. ARGS is the pointer to the list and LEN is the maximum number of characters needed. 1 char is the minimum needed. COMMAS tells if each number should be seperated by commas.*/ _PROTOTYPE (static char *make_arg_str, (arg_list *args, int len, int commas)); static char * make_arg_str (args, len, commas) arg_list *args; int len; int commas; { char *temp; char sval[20]; /* Recursive call. */ if (args != NULL) temp = make_arg_str (args->next, len+11, commas); else { temp = (char *) bc_malloc (len); *temp = 0; return temp; } /* Add the current number to the end of the string. */ if (len != 1 && commas) sprintf (sval, "%d,", args->av_name); else sprintf (sval, "%d", args->av_name); temp = strcat (temp, sval); return (temp); } char * arg_str (args, commas) arg_list *args; int commas; { if (arglist2 != NULL) free (arglist2); arglist2 = arglist1; arglist1 = make_arg_str (args, 1, commas); return (arglist1); } /* free_args frees an argument list ARGS. */ void free_args (args) arg_list *args; { arg_list *temp; temp = args; while (temp != NULL) { args = args->next; free (temp); temp = args; } } /* Check for valid parameter (PARAMS) and auto (AUTOS) lists. There must be no duplicates any where. Also, this is where warnings are generated for array parameters. */ void check_params ( params, autos ) arg_list *params, *autos; { arg_list *tmp1, *tmp2; /* Check for duplicate parameters. */ if (params != NULL) { tmp1 = params; while (tmp1 != NULL) { tmp2 = tmp1->next; while (tmp2 != NULL) { if (tmp2->av_name == tmp1->av_name) yyerror ("duplicate parameter names"); tmp2 = tmp2->next; } if (tmp1->av_name < 0) warn ("Array parameter"); tmp1 = tmp1->next; } } /* Check for duplicate autos. */ if (autos != NULL) { tmp1 = autos; while (tmp1 != NULL) { tmp2 = tmp1->next; while (tmp2 != NULL) { if (tmp2->av_name == tmp1->av_name) yyerror ("duplicate auto variable names"); tmp2 = tmp2->next; } tmp1 = tmp1->next; } } /* Check for duplicate between parameters and autos. */ if ((params != NULL) && (autos != NULL)) { tmp1 = params; while (tmp1 != NULL) { tmp2 = autos; while (tmp2 != NULL) { if (tmp2->av_name == tmp1->av_name) yyerror ("variable in both parameter and auto lists"); tmp2 = tmp2->next; } tmp1 = tmp1->next; } } } /* Initialize the code generator the parser. */ void init_gen () { /* Get things ready. */ break_label = 0; continue_label = 0; next_label = 1; out_count = 2; if (compile_only) printf ("@i"); else init_load (); had_error = FALSE; did_gen = FALSE; } /* generate code STR for the machine. */ void generate (str) char *str; { did_gen = TRUE; if (compile_only) { printf ("%s",str); out_count += strlen(str); if (out_count > 60) { printf ("\n"); out_count = 0; } } else load_code (str); } /* Execute the current code as loaded. */ void run_code() { /* If no compile errors run the current code. */ if (!had_error && did_gen) { if (compile_only) { printf ("@r\n"); out_count = 0; } else execute (); } /* Reinitialize the code generation and machine. */ if (did_gen) init_gen(); else had_error = FALSE; } /* Output routines: Write a character CH to the standard output. It keeps track of the number of characters output and may break the output with a "\". */ void out_char (ch) char ch; { if (ch == '\n') { out_col = 0; putchar ('\n'); } else { out_col++; if (out_col == 70) { putchar ('\\'); putchar ('\n'); out_col = 1; } putchar (ch); } } /* The following are "Symbol Table" routines for the parser. */ /* find_id returns a pointer to node in TREE that has the correct ID. If there is no node in TREE with ID, NULL is returned. */ id_rec * find_id (tree, id) id_rec *tree; char *id; { int cmp_result; /* Check for an empty tree. */ if (tree == NULL) return NULL; /* Recursively search the tree. */ cmp_result = strcmp (id, tree->id); if (cmp_result == 0) return tree; /* This is the item. */ else if (cmp_result < 0) return find_id (tree->left, id); else return find_id (tree->right, id); } /* insert_id_rec inserts a NEW_ID rec into the tree whose ROOT is provided. insert_id_rec returns TRUE if the tree height from ROOT down is increased otherwise it returns FALSE. This is a recursive balanced binary tree insertion algorithm. */ int insert_id_rec (root, new_id) id_rec **root; id_rec *new_id; { id_rec *A, *B; /* If root is NULL, this where it is to be inserted. */ if (*root == NULL) { *root = new_id; new_id->left = NULL; new_id->right = NULL; new_id->balance = 0; return (TRUE); } /* We need to search for a leaf. */ if (strcmp (new_id->id, (*root)->id) < 0) { /* Insert it on the left. */ if (insert_id_rec (&((*root)->left), new_id)) { /* The height increased. */ (*root)->balance --; switch ((*root)->balance) { case 0: /* no height increase. */ return (FALSE); case -1: /* height increase. */ return (FALSE); case -2: /* we need to do a rebalancing act. */ A = *root; B = (*root)->left; if (B->balance <= 0) { /* Single Rotate. */ A->left = B->right; B->right = A; *root = B; A->balance = 0; B->balance = 0; } else { /* Double Rotate. */ *root = B->right; B->right = (*root)->left; A->left = (*root)->right; (*root)->left = B; (*root)->right = A; switch ((*root)->balance) { case -1: A->balance = 1; B-;;;;;;;;;>balance = 0; break; case 0: A->balance = 0; B->balance = 0; break; case 1: A->balance = 0; B->balance = -1; break; } (*root)->balance = 0; } } } } else { /* Insert it on the right. */ if (insert_id_rec (&((*root)->right), new_id)) { /* The height increased. */ (*root)->balance ++; switch ((*root)->balance) { case 0: /* no height increase. */ return (FALSE); case 1: /* height increase. */ return (FALSE); case 2: /* we need to do a rebalancing act. */ A = *root; B = (*root)->right; if (B->balance >= 0) { /* Single Rotate. */ A->right = B->left; B->left = A; *root = B; A->balance = 0; B->balance = 0; } else { /* Double Rotate. */ *root = B->left; B->left = (*root)->right; A->right = (*root)->left; (*root)->left = A; (*root)->right = B; switch ((*root)->balance) { case -1: A->balance = 0; B->balance = 1; break; case 0: A->balance = 0; B->balance = 0; break; case 1: A->balance = -1; B->balance = 0; break; } (*root)->balance = 0; } } } } /* If we fall through to here, the tree did not grow in height. */ return (FALSE); } /* Initialize variables for the symbol table tree. */ void init_tree() { name_tree = NULL; next_array = 1; next_func = 1; next_var = 4; /* 0 => ibase, 1 => obase, 2 => scale, 3 => last. */ } /* Lookup routines for symbol table names. */ int lookup (name, namekind) char *name; int namekind; { id_rec *id; /* Warn about non-standard name. */ if (strlen(name) != 1) warn ("multiple letter name - %s", name); /* Look for the id. */ id = find_id (name_tree, name); if (id == NULL) { /* We need to make a new item. */ id = (id_rec *) bc_malloc (sizeof (id_rec)); id->id = strcopyof (name); id->a_name = 0; id->f_name = 0; id->v_name = 0; insert_id_rec (&name_tree, id); } /* Return the correct value. */ switch (namekind) { case ARRAY: /* ARRAY variable numbers are returned as negative numbers. */ if (id->a_name != 0) { free (name); return (-id->a_name); } id->a_name = next_array++; a_names[id->a_name] = name; if (id->a_name < MAX_STORE) { if (id->a_name >= a_count) more_arrays (); return (-id->a_name); } yyerror ("Too many array variables"); exit (1); case FUNCT: if (id->f_name != 0) { free(name); return (id->f_name); } id->f_name = next_func++; f_names[id->f_name] = name; if (id->f_name < MAX_STORE) { if (id->f_name >= f_count) more_functions (); return (id->f_name); } yyerror ("Too many functions"); exit (1); case SIMPLE: if (id->v_name != 0) { free(name); return (id->v_name); } id->v_name = next_var++; v_names[id->v_name - 1] = name; if (id->v_name <= MAX_STORE) { if (id->v_name >= v_count) more_variables (); return (id->v_name); } yyerror ("Too many variables"); exit (1); } } /* Print the welcome banner. */ void welcome() { #if !__minix printf ("This is free software with ABSOLUTELY NO WARRANTY.\n"); printf ("For details type `warranty'. \n"); #endif } /* Print out the warranty information. */ void warranty(prefix) char *prefix; { printf ("\n%s%s\n\n", prefix, BC_VERSION); printf ("%s%s%s%s%s%s%s%s%s%s%s", " This program is free software; you can redistribute it and/or modify\n", " it under the terms of the GNU General Public License as published by\n", " the Free Software Foundation; either version 2 of the License , or\n", " (at your option) any later version.\n\n", " This program is distributed in the hope that it will be useful,\n", " but WITHOUT ANY WARRANTY; without even the implied warranty of\n", " MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n", " GNU General Public License for more details.\n\n", " You should have received a copy of the GNU General Public License\n", " along with this program. If not, write to the Free Software\n", " Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.\n\n"); } /* Print out the limits of this program. */ void limits() { printf ("BC_BASE_MAX = %d\n", BC_BASE_MAX); printf ("BC_DIM_MAX = %ld\n", (long) BC_DIM_MAX); printf ("BC_SCALE_MAX = %d\n", BC_SCALE_MAX); printf ("BC_STRING_MAX = %d\n", BC_STRING_MAX); printf ("MAX Exponent = %ld\n", (long) LONG_MAX); printf ("MAX code = %ld\n", (long) BC_MAX_SEGS * (long) BC_SEG_SIZE); printf ("multiply digits = %ld\n", (long) LONG_MAX / (long) 90); printf ("Number of vars = %ld\n", (long) MAX_STORE); #ifdef OLD_EQ_OP printf ("Old assignment operatiors are valid. (=-, =+, ...)\n"); #endif } /* bc_malloc will check the return value so all other places do not have to do it! SIZE is the number of types to allocate. */ char * bc_malloc (size) int size; { char *ptr; ptr = (char *) malloc (size); if (ptr == NULL) out_of_memory (); return ptr; } /* The following routines are error routines for various problems. */ /* Malloc could not get enought memory. */ void out_of_memory() { fprintf (stderr, "Fatal error: Out of memory for malloc.\n"); exit (1); } /* The standard yyerror routine. Built with variable number of argumnets. */ #ifndef VARARGS #ifdef __STDC__ void yyerror (char *str, ...) #else void yyerror (str) char *str; #endif #else void yyerror (str, va_alist) char *str; #endif { char *name; va_list args; #ifndef VARARGS va_start (args, str); #else va_start (args); #endif if (is_std_in) name = "(standard_in)"; else name = g_argv[optind-1]; fprintf (stderr,"%s %d: ",name,line_no); vfprintf (stderr, str, args); fprintf (stderr, "\n"); had_error = TRUE; va_end (args); } /* The routine to produce warnings about non-standard features found during parsing. */ #ifndef VARARGS #ifdef __STDC__ void warn (char *mesg, ...) #else void warn (mesg) char *mesg; #endif #else void warn (mesg, va_alist) char *mesg; #endif { char *name; va_list args; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif if (std_only) { if (is_std_in) name = "(standard_in)"; else name = g_argv[optind-1]; fprintf (stderr,"%s %d: ",name,line_no); vfprintf (stderr, mesg, args); fprintf (stderr, "\n"); had_error = TRUE; } else if (warn_not_std) { if (is_std_in) name = "(standard_in)"; else name = g_argv[optind-1]; fprintf (stderr,"%s %d: (Warning) ",name,line_no); vfprintf (stderr, mesg, args); fprintf (stderr, "\n"); } va_end (args); } /* Runtime error will print a message and stop the machine. */ #ifndef VARARGS #ifdef __STDC__ void rt_error (char *mesg, ...) #else void rt_error (mesg) char *mesg; #endif #else void rt_error (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, "Runtime error (func=%s, adr=%d): %s\n", f_names[pc.pc_func], pc.pc_addr, error_mesg); runtime_error = TRUE; } /* A runtime warning tells of some action taken by the processor that may change the program execution but was not enough of a problem to stop the execution. */ #ifndef VARARGS #ifdef __STDC__ void rt_warn (char *mesg, ...) #else void rt_warn (mesg) char *mesg; #endif #else void rt_warn (mesg, va_alist) char *mesg; #endif { va_list args; char error_mesg [255]; #ifndef VARARGS va_start (args, mesg); #else va_start (args); #endif vsprintf (error_mesg, mesg, args); va_end (args); fprintf (stderr, "Runtime warning (func=%s, adr=%d): %s\n", f_names[pc.pc_func], pc.pc_addr, error_mesg); } #define BC_VERSION \ "bc 1.02 (Mar 3, 92) Copyright (C) 1991, 1992 Free Software Foundation, Inc." #define NEWLINE 257 #define AND 258 #define OR 259 #define NOT 260 #define STRING 261 #define NAME 262 #define NUMBER 263 #define MUL_OP 264 #define ASSIGN_OP 265 #define REL_OP 266 #define INCR_DECR 267 #define Define 268 #define Break 269 #define Quit 270 #define Length 271 #define Return 272 #define For 273 #define If 274 #define While 275 #define Sqrt 276 #define Else 277 #define Scale 278 #define Ibase 279 #define Obase 280 #define Auto 281 #define Read 282 #define Warranty 283 #define Halt 284 #define Last 285 #define Continue 286 #define Print 287 #define Limits 288 #define UNARY_MINUS 289 typedef union { char *s_value; char c_value; int i_value; arg_list *a_value; } YYSTYPE; extern YYSTYPE yylval; ...ACKNOWLEDGEMENMANIFESTMakefileNEW_FEATURESNOTESNO_WARRANTYREADMEclosure.cdefs.herror.clalr.clr0.cmain.cmkpar.c output.c reader.c skeleton.c symtab.c verbose.c warshall.c Berkeley Yacc owes much to the unflagging efforts of Keith Bostic. His badgering kept me working on it long after I was ready to quit. Berkeley Yacc is based on the excellent algorithm for computing LALR(1) lookaheads developed by Tom Pennello and Frank DeRemer. The algorithm is described in their almost impenetrable article in TOPLAS 4,4. Finally, much of the credit for the latest version must go to those who pointed out deficiencies of my earlier releases. Among the most prolific contributors were Benson I. Margulies Dave Gentzel Antoine Verheijen Peter S. Housel Dale Smith Ozan Yigit John Campbell Bill Sommerfeld Paul Hilfinger Gary Bridgewater Dave Bakken Dan Lanciani Richard Sargent Parag Patel File Name Archive # Description ----------------------------------------------------------- ACKNOWLEDGEMENTS 1 CSU.diffs 1 MANIFEST 1 This shipping list Makefile 1 NEW_FEATURES 1 NOTES 1 NO_WARRANTY 1 README 1 closure.c 1 defs.h 1 error.c 1 lalr.c 1 lr0.c 1 main.c 1 mkpar.c 1 output.c 2 reader.c 3 skeleton.c 1 symtab.c 1 test 1 test/error.output 1 test/error.tab.c 1 test/error.tab.h 1 test/error.y 1 test/ftp.output 2 test/ftp.tab.c 3 test/ftp.tab.h 1 test/ftp.y 2 verbose.c 1 warshall.c 1 yacc.1 1 # Makefile for Berkeley yacc. BINDIR = /usr/bin HDRS = defs.h CFLAGS = -DNDEBUG -D_MINIX -D_POSIX_SOURCE -wo $(OPT) LDFLAGS = -i LIBS = LINKER = $(CC) MAKEFILE = Makefile OBJS = closure.o \ error.o \ lalr.o \ lr0.o \ main.o \ mkpar.o \ output.o \ reader.o \ skeleton.o \ symtab.o \ verbose.o \ warshall.o PRINT = pr -f -l88 PROGRAM = yacc SRCS = closure.c \ error.c \ lalr.c \ lr0.c \ main.c \ mkpar.c \ output.c \ reader.c \ skeleton.c \ symtab.c \ verbose.c \ warshall.c all: $(PROGRAM) $(PROGRAM): $(OBJS) $(LIBS) $(LINKER) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) install -S 384k $(PROGRAM) install: $(BINDIR)/yacc $(BINDIR)/yacc: $(PROGRAM) install -cs -o bin $(PROGRAM) $@ clean:; rm -f $(OBJS) $(PROGRAM) core #depend:; @mkmf -f $(MAKEFILE) PROGRAM=$(PROGRAM) DEST=$(DEST) # #index:; @ctags -wx $(HDRS) $(SRCS) # #listing:; @$(PRINT) Makefile $(HDRS) $(SRCS) | lpr # #lint:; @lint $(SRCS) # #program: $(PROGRAM) # #tags: $(HDRS) $(SRCS); @ctags $(HDRS) $(SRCS) ### closure.o: defs.h error.o: defs.h lalr.o: defs.h lr0.o: defs.h main.o: defs.h mkpar.o: defs.h output.o: defs.h reader.o: defs.h skeleton.o: defs.h symtab.o: defs.h verbose.o: defs.h warshall.o: defs.h The -r option has been implemented. The -r option tells Yacc to put the read-only tables in y.tab.c and the code and variables in y.code.c. Keith Bostic asked for this option so that :yyfix could be eliminated. The -l and -t options have been implemented. The -l option tells Yacc not to include #line directives in the code it produces. The -t option causes debugging code to be included in the compiled parser. The code for error recovery has been changed to implement the same algorithm as AT&T Yacc. There will still be differences in the way error recovery works because AT&T Yacc uses more default reductions than Berkeley Yacc. The environment variable TMPDIR determines the directory where temporary files will be created. If TMPDIR is defined, temporary files will be created in the directory whose pathname is the value of TMPDIR. By default, temporary files are created in /tmp. The keywords are now case-insensitive. For example, %nonassoc, %NONASSOC, %NonAssoc, and %nOnAsSoC are all equivalent. Commas and semicolons that are not part of C code are treated as commentary. Line-end comments, as in BCPL, are permitted. Line-end comments begin with // and end at the next end-of-line. Line-end comments are permitted in C code; they are converted to C comments on output. The form of y.output files has been changed to look more like those produced by AT&T Yacc. A new kind of declaration has been added. The form of the declaration is %ident string where string is a sequence of characters begining with a double quote and ending with either a double quote or the next end-of-line, whichever comes first. The declaration will cause a #ident directive to be written near the start of the output file. If a parser has been compiled with debugging code, that code can be enabled by setting an environment variable. If the environment variable YYDEBUG is set to 0, debugging output is suppressed. If it is set to 1, debugging output is written to standard output. Berkeley Yacc reflects its origins. The reason so many routines use exactly six register variables is that Berkeley Yacc was developed on a VAX using PCC. PCC placed at most six variables in registers. I went to considerable effort to find which six variables most belonged in registers. Changes in machines and compilers make that effort worthless, perhaps even harmful. The code contains many instances where address calculations are performed in particular ways to optimize the code for the VAX. Berkeley Yacc is distributed with no warranty whatever. The author and any other contributors take no responsibility for the consequences of its use. Berkeley Yacc is an LALR(1) parser generator. Berkeley Yacc has been made as compatible as possible with AT&T Yacc. Berkeley Yacc can accept any input specification that conforms to the AT&T Yacc documentation. Specifications that take advantage of undocumented features of AT&T Yacc will probably be rejected. Berkeley Yacc is distributed with no warranty whatever. The code is certain to contain errors. Neither the author nor any contributor takes responsibility for any consequences of its use. Berkeley Yacc is in the public domain. The data structures and algorithms used in Berkeley Yacc are all either taken from documents available to the general public or are inventions of the author. Anyone may freely distribute source or binary forms of Berkeley Yacc whether unchanged or modified. Distributers may charge whatever fees they can obtain for Berkeley Yacc. Programs generated by Berkeley Yacc may be distributed freely. Please report bugs to robert.corbett@eng.Sun.COM Include a small example if possible. Please include the banner string from skeleton.c with the bug report. Do not expect rapid responses. #include "defs.h" short *itemset; short *itemsetend; unsigned *ruleset; static unsigned *first_derives; static unsigned *EFF; set_EFF() { register unsigned *row; register int symbol; register short *sp; register int rowsize; register int i; register int rule; rowsize = WORDSIZE(nvars); EFF = NEW2(nvars * rowsize, unsigned); row = EFF; for (i = start_symbol; i < nsyms; i++) { sp = derives[i]; for (rule = *sp; rule > 0; rule = *++sp) { symbol = ritem[rrhs[rule]]; if (ISVAR(symbol)) { symbol -= start_symbol; SETBIT(row, symbol); } } row += rowsize; } reflexive_transitive_closure(EFF, nvars); #ifdef DEBUG print_EFF(); #endif } set_first_derives() { register unsigned *rrow; register unsigned *vrow; register int j; register unsigned k; register unsigned cword; register short *rp; int rule; int i; int rulesetsize; int varsetsize; rulesetsize = WORDSIZE(nrules); varsetsize = WORDSIZE(nvars); first_derives = NEW2(nvars * rulesetsize, unsigned) - ntokens * rulesetsize; set_EFF(); rrow = first_derives + ntokens * rulesetsize; for (i = start_symbol; i < nsyms; i++) { vrow = EFF + ((i - ntokens) * varsetsize); k = BITS_PER_WORD; for (j = start_symbol; j < nsyms; k++, j++) { if (k >= BITS_PER_WORD) { cword = *vrow++; k = 0; } if (cword & (1 << k)) { rp = derives[j]; while ((rule = *rp++) >= 0) { SETBIT(rrow, rule); } } } vrow += varsetsize; rrow += rulesetsize; } #ifdef DEBUG print_first_derives(); #endif FREE(EFF); } closure(nucleus, n) short *nucleus; int n; { register int ruleno; register unsigned word; register unsigned i; register short *csp; register unsigned *dsp; register unsigned *rsp; register int rulesetsize; short *csend; unsigned *rsend; int symbol; int itemno; rulesetsize = WORDSIZE(nrules); rsp = ruleset; rsend = ruleset + rulesetsize; for (rsp = ruleset; rsp < rsend; rsp++) *rsp = 0; csend = nucleus + n; for (csp = nucleus; csp < csend; ++csp) { symbol = ritem[*csp]; if (ISVAR(symbol)) { dsp = first_derives + symbol * rulesetsize; rsp = ruleset; while (rsp < rsend) *rsp++ |= *dsp++; } } ruleno = 0; itemsetend = itemset; csp = nucleus; for (rsp = ruleset; rsp < rsend; ++rsp) { word = *rsp; if (word) { for (i = 0; i < BITS_PER_WORD; ++i) { if (word & (1 << i)) { itemno = rrhs[ruleno+i]; while (csp < csend && *csp < itemno) *itemsetend++ = *csp++; *itemsetend++ = itemno; while (csp < csend && *csp == itemno) ++csp; } } } ruleno += BITS_PER_WORD; } while (csp < csend) *itemsetend++ = *csp++; #ifdef DEBUG print_closure(n); #endif } finalize_closure() { FREE(itemset); FREE(ruleset); FREE(first_derives + ntokens * WORDSIZE(nrules)); } #ifdef DEBUG print_closure(n) int n; { register short *isp; printf("\n\nn = %d\n\n", n); for (isp = itemset; isp < itemsetend; isp++) printf(" %d\n", *isp); } print_EFF() { register int i, j; register unsigned *rowp; register unsigned word; register unsigned k; printf("\n\nEpsilon Free Firsts\n"); for (i = start_symbol; i < nsyms; i++) { printf("\n%s", symbol_name[i]); rowp = EFF + ((i - start_symbol) * WORDSIZE(nvars)); word = *rowp++; k = BITS_PER_WORD; for (j = 0; j < nvars; k++, j++) { if (k >= BITS_PER_WORD) { word = *rowp++; k = 0; } if (word & (1 << k)) printf(" %s", symbol_name[start_symbol + j]); } } } print_first_derives() { register int i; register int j; register unsigned *rp; register unsigned cword; register unsigned k; printf("\n\n\nFirst Derives\n"); for (i = start_symbol; i < nsyms; i++) { printf("\n%s derives\n", symbol_name[i]); rp = first_derives + i * WORDSIZE(nrules); k = BITS_PER_WORD; for (j = 0; j <= nrules; k++, j++) { if (k >= BITS_PER_WORD) { cword = *rp++; k = 0; } if (cword & (1 << k)) printf(" %d\n", j); } } fflush(stdout); } #endif #include #include #include /* machine-dependent definitions */ /* the following definitions are for the Tahoe */ /* they might have to be changed for other machines */ /* MAXCHAR is the largest unsigned character value */ /* MAXSHORT is the largest value of a C short */ /* MINSHORT is the most negative value of a C short */ /* MAXTABLE is the maximum table size */ /* BITS_PER_WORD is the number of bits in a C unsigned */ /* WORDSIZE computes the number of words needed to */ /* store n bits */ /* BIT returns the value of the n-th bit starting */ /* from r (0-indexed) */ /* SETBIT sets the n-th bit starting from r */ #if !__STDC__ #define MAXCHAR 255 #define MAXSHORT 32767 #define MINSHORT -32768 #define BITS_PER_WORD 32 #else #include #define MAXCHAR UCHAR_MAX #define MAXSHORT SHRT_MAX #define MINSHORT SHRT_MIN #define BITS_PER_WORD (INT_MAX == 32767 ? 16 : 32) #define BITS_PER_BPW (INT_MAX == 32767 ? 4 : 5) #endif #define MAXTABLE 32500 #define WORDSIZE(n) (((n)+(BITS_PER_WORD-1))/BITS_PER_WORD) #define BIT(r, n) ((((r)[(n)>>BITS_PER_BPW])>>((n)&(BITS_PER_WORD-1)))&1) #define SETBIT(r, n) ((r)[(n)>>BITS_PER_BPW]|=((unsigned)1<<((n)&(BITS_PER_WORD-1)))) /* character names */ #define NUL '\0' /* the null character */ #define NEWLINE '\n' /* line feed */ #define SP ' ' /* space */ #define BS '\b' /* backspace */ #define HT '\t' /* horizontal tab */ #define VT '\013' /* vertical tab */ #define CR '\r' /* carriage return */ #define FF '\f' /* form feed */ #define QUOTE '\'' /* single quote */ #define DOUBLE_QUOTE '\"' /* double quote */ #define BACKSLASH '\\' /* backslash */ /* defines for constructing filenames */ #define CODE_SUFFIX ".code.c" #define DEFINES_SUFFIX ".tab.h" #define OUTPUT_SUFFIX ".tab.c" #define VERBOSE_SUFFIX ".output" /* keyword codes */ #define TOKEN 0 #define LEFT 1 #define RIGHT 2 #define NONASSOC 3 #define MARK 4 #define TEXT 5 #define TYPE 6 #define START 7 #define UNION 8 #define IDENT 9 /* symbol classes */ #define UNKNOWN 0 #define TERM 1 #define NONTERM 2 /* the undefined value */ #define UNDEFINED (-1) /* action codes */ #define SHIFT 1 #define REDUCE 2 /* character macros */ #define IS_IDENT(c) (isalnum(c) || (c) == '_' || (c) == '.' || (c) == '$') #define IS_OCTAL(c) ((c) >= '0' && (c) <= '7') #define NUMERIC_VALUE(c) ((c) - '0') /* symbol macros */ #define ISTOKEN(s) ((s) < start_symbol) #define ISVAR(s) ((s) >= start_symbol) /* storage allocation macros */ #define CALLOC(k,n) (calloc((unsigned)(k),(unsigned)(n))) #define FREE(x) (free((char*)(x))) #define MALLOC(n) (malloc((unsigned)(n))) #define NEW(t) ((t*)allocate(sizeof(t))) #define NEW2(n,t) ((t*)allocate((unsigned)((n)*sizeof(t)))) #define REALLOC(p,n) (realloc((char*)(p),(unsigned)(n))) /* the structure of a symbol table entry */ typedef struct bucket bucket; struct bucket { struct bucket *link; struct bucket *next; char *name; char *tag; short value; short index; short prec; char class; char assoc; }; /* the structure of the LR(0) state machine */ typedef struct core core; struct core { struct core *next; struct core *link; short number; short accessing_symbol; short nitems; short items[1]; }; /* the structure used to record shifts */ typedef struct shifts shifts; struct shifts { struct shifts *next; short number; short nshifts; short shift[1]; }; /* the structure used to store reductions */ typedef struct reductions reductions; struct reductions { struct reductions *next; short number; short nreds; short rules[1]; }; /* the structure used to represent parser actions */ typedef struct action action; struct action { struct action *next; short symbol; short number; short prec; char action_code; char assoc; char suppressed; }; /* global variables */ extern char dflag; extern char lflag; extern char rflag; extern char tflag; extern char vflag; extern char *symbol_prefix; extern char *myname; extern char *cptr; extern char *line; extern int lineno; extern int outline; extern char *banner[]; extern char *tables[]; extern char *header[]; extern char *body[]; extern char *trailer[]; extern char *action_file_name; extern char *code_file_name; extern char *defines_file_name; extern char *input_file_name; extern char *output_file_name; extern char *text_file_name; extern char *union_file_name; extern char *verbose_file_name; extern FILE *action_file; extern FILE *code_file; extern FILE *defines_file; extern FILE *input_file; extern FILE *output_file; extern FILE *text_file; extern FILE *union_file; extern FILE *verbose_file; extern int nitems; extern int nrules; extern int nsyms; extern int ntokens; extern int nvars; extern int ntags; extern char unionized; extern char line_format[]; extern int start_symbol; extern char **symbol_name; extern short *symbol_value; extern short *symbol_prec; extern char *symbol_assoc; extern short *ritem; extern short *rlhs; extern short *rrhs; extern short *rprec; extern char *rassoc; extern short **derives; extern char *nullable; extern bucket *first_symbol; extern bucket *last_symbol; extern int nstates; extern core *first_state; extern shifts *first_shift; extern reductions *first_reduction; extern short *accessing_symbol; extern core **state_table; extern shifts **shift_table; extern reductions **reduction_table; extern unsigned *LA; extern short *LAruleno; extern short *lookaheads; extern short *goto_map; extern short *from_state; extern short *to_state; extern action **parser; extern int SRtotal; extern int RRtotal; extern short *SRconflicts; extern short *RRconflicts; extern short *defred; extern short *rules_used; extern short nunused; extern short final_state; /* global functions */ extern char *allocate(); extern bucket *lookup(); extern bucket *make_bucket(); /* system variables */ extern int errno; /* system functions */ extern void free(); extern char *calloc(); extern char *malloc(); extern char *realloc(); extern char *strcpy(); /* routines for printing error messages */ #include "defs.h" fatal(msg) char *msg; { fprintf(stderr, "%s: f - %s\n", myname, msg); done(2); } no_space() { fprintf(stderr, "%s: f - out of space\n", myname); done(2); } open_error(filename) char *filename; { fprintf(stderr, "%s: f - cannot open \"%s\"\n", myname, filename); done(2); } unexpected_EOF() { fprintf(stderr, "%s: e - line %d of \"%s\", unexpected end-of-file\n", myname, lineno, input_file_name); done(1); } print_pos(st_line, st_cptr) char *st_line; char *st_cptr; { register char *s; if (st_line == 0) return; for (s = st_line; *s != '\n'; ++s) { if (isprint(*s) || *s == '\t') putc(*s, stderr); else putc('?', stderr); } putc('\n', stderr); for (s = st_line; s < st_cptr; ++s) { if (*s == '\t') putc('\t', stderr); else putc(' ', stderr); } putc('^', stderr); putc('\n', stderr); } syntax_error(st_lineno, st_line, st_cptr) int st_lineno; char *st_line; char *st_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", syntax error\n", myname, st_lineno, input_file_name); print_pos(st_line, st_cptr); done(1); } unterminated_comment(c_lineno, c_line, c_cptr) int c_lineno; char *c_line; char *c_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", unmatched /*\n", myname, c_lineno, input_file_name); print_pos(c_line, c_cptr); done(1); } unterminated_string(s_lineno, s_line, s_cptr) int s_lineno; char *s_line; char *s_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated string\n", myname, s_lineno, input_file_name); print_pos(s_line, s_cptr); done(1); } unterminated_text(t_lineno, t_line, t_cptr) int t_lineno; char *t_line; char *t_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", unmatched %%{\n", myname, t_lineno, input_file_name); print_pos(t_line, t_cptr); done(1); } unterminated_union(u_lineno, u_line, u_cptr) int u_lineno; char *u_line; char *u_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated %%union \ declaration\n", myname, u_lineno, input_file_name); print_pos(u_line, u_cptr); done(1); } over_unionized(u_cptr) char *u_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", too many %%union \ declarations\n", myname, lineno, input_file_name); print_pos(line, u_cptr); done(1); } illegal_tag(t_lineno, t_line, t_cptr) int t_lineno; char *t_line; char *t_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", illegal tag\n", myname, t_lineno, input_file_name); print_pos(t_line, t_cptr); done(1); } illegal_character(c_cptr) char *c_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", illegal character\n", myname, lineno, input_file_name); print_pos(line, c_cptr); done(1); } used_reserved(s) char *s; { fprintf(stderr, "%s: e - line %d of \"%s\", illegal use of reserved symbol \ %s\n", myname, lineno, input_file_name, s); done(1); } tokenized_start(s) char *s; { fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s cannot be \ declared to be a token\n", myname, lineno, input_file_name, s); done(1); } retyped_warning(s) char *s; { fprintf(stderr, "%s: w - line %d of \"%s\", the type of %s has been \ redeclared\n", myname, lineno, input_file_name, s); } reprec_warning(s) char *s; { fprintf(stderr, "%s: w - line %d of \"%s\", the precedence of %s has been \ redeclared\n", myname, lineno, input_file_name, s); } revalued_warning(s) char *s; { fprintf(stderr, "%s: w - line %d of \"%s\", the value of %s has been \ redeclared\n", myname, lineno, input_file_name, s); } terminal_start(s) char *s; { fprintf(stderr, "%s: e - line %d of \"%s\", the start symbol %s is a \ token\n", myname, lineno, input_file_name, s); done(1); } restarted_warning() { fprintf(stderr, "%s: w - line %d of \"%s\", the start symbol has been \ redeclared\n", myname, lineno, input_file_name); } no_grammar() { fprintf(stderr, "%s: e - line %d of \"%s\", no grammar has been \ specified\n", myname, lineno, input_file_name); done(1); } terminal_lhs(s_lineno) int s_lineno; { fprintf(stderr, "%s: e - line %d of \"%s\", a token appears on the lhs \ of a production\n", myname, s_lineno, input_file_name); done(1); } prec_redeclared() { fprintf(stderr, "%s: w - line %d of \"%s\", conflicting %%prec \ specifiers\n", myname, lineno, input_file_name); } unterminated_action(a_lineno, a_line, a_cptr) int a_lineno; char *a_line; char *a_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", unterminated action\n", myname, a_lineno, input_file_name); print_pos(a_line, a_cptr); done(1); } dollar_warning(a_lineno, i) int a_lineno; int i; { fprintf(stderr, "%s: w - line %d of \"%s\", $%d references beyond the \ end of the current rule\n", myname, a_lineno, input_file_name, i); } dollar_error(a_lineno, a_line, a_cptr) int a_lineno; char *a_line; char *a_cptr; { fprintf(stderr, "%s: e - line %d of \"%s\", illegal $-name\n", myname, a_lineno, input_file_name); print_pos(a_line, a_cptr); done(1); } untyped_lhs() { fprintf(stderr, "%s: e - line %d of \"%s\", $$ is untyped\n", myname, lineno, input_file_name); done(1); } untyped_rhs(i, s) int i; char *s; { fprintf(stderr, "%s: e - line %d of \"%s\", $%d (%s) is untyped\n", myname, lineno, input_file_name, i, s); done(1); } unknown_rhs(i) int i; { fprintf(stderr, "%s: e - line %d of \"%s\", $%d is untyped\n", myname, lineno, input_file_name, i); done(1); } default_action_warning() { fprintf(stderr, "%s: w - line %d of \"%s\", the default action assigns an \ undefined value to $$\n", myname, lineno, input_file_name); } undefined_goal(s) char *s; { fprintf(stderr, "%s: e - the start symbol %s is undefined\n", myname, s); done(1); } undefined_symbol_warning(s) char *s; { fprintf(stderr, "%s: w - the symbol %s is undefined\n", myname, s); } #include "defs.h" typedef struct shorts { struct shorts *next; short value; } shorts; int tokensetsize; short *lookaheads; short *LAruleno; unsigned *LA; short *accessing_symbol; core **state_table; shifts **shift_table; reductions **reduction_table; short *goto_map; short *from_state; short *to_state; short **transpose(); static int infinity; static int maxrhs; static int ngotos; static unsigned *F; static short **includes; static shorts **lookback; static short **R; static short *INDEX; static short *VERTICES; static int top; lalr() { tokensetsize = WORDSIZE(ntokens); set_state_table(); set_accessing_symbol(); set_shift_table(); set_reduction_table(); set_maxrhs(); initialize_LA(); set_goto_map(); initialize_F(); build_relations(); compute_FOLLOWS(); compute_lookaheads(); } set_state_table() { register core *sp; state_table = NEW2(nstates, core *); for (sp = first_state; sp; sp = sp->next) state_table[sp->number] = sp; } set_accessing_symbol() { register core *sp; accessing_symbol = NEW2(nstates, short); for (sp = first_state; sp; sp = sp->next) accessing_symbol[sp->number] = sp->accessing_symbol; } set_shift_table() { register shifts *sp; shift_table = NEW2(nstates, shifts *); for (sp = first_shift; sp; sp = sp->next) shift_table[sp->number] = sp; } set_reduction_table() { register reductions *rp; reduction_table = NEW2(nstates, reductions *); for (rp = first_reduction; rp; rp = rp->next) reduction_table[rp->number] = rp; } set_maxrhs() { register short *itemp; register short *item_end; register int length; register int max; length = 0; max = 0; item_end = ritem + nitems; for (itemp = ritem; itemp < item_end; itemp++) { if (*itemp >= 0) { length++; } else { if (length > max) max = length; length = 0; } } maxrhs = max; } initialize_LA() { register int i, j, k; register reductions *rp; lookaheads = NEW2(nstates + 1, short); k = 0; for (i = 0; i < nstates; i++) { lookaheads[i] = k; rp = reduction_table[i]; if (rp) k += rp->nreds; } lookaheads[nstates] = k; LA = NEW2(k * tokensetsize, unsigned); LAruleno = NEW2(k, short); lookback = NEW2(k, shorts *); k = 0; for (i = 0; i < nstates; i++) { rp = reduction_table[i]; if (rp) { for (j = 0; j < rp->nreds; j++) { LAruleno[k] = rp->rules[j]; k++; } } } } set_goto_map() { register shifts *sp; register int i; register int symbol; register int k; register short *temp_map; register int state2; register int state1; goto_map = NEW2(nvars + 1, short) - ntokens; temp_map = NEW2(nvars + 1, short) - ntokens; ngotos = 0; for (sp = first_shift; sp; sp = sp->next) { for (i = sp->nshifts - 1; i >= 0; i--) { symbol = accessing_symbol[sp->shift[i]]; if (ISTOKEN(symbol)) break; if (ngotos == MAXSHORT) fatal("too many gotos"); ngotos++; goto_map[symbol]++; } } k = 0; for (i = ntokens; i < nsyms; i++) { temp_map[i] = k; k += goto_map[i]; } for (i = ntokens; i < nsyms; i++) goto_map[i] = temp_map[i]; goto_map[nsyms] = ngotos; temp_map[nsyms] = ngotos; from_state = NEW2(ngotos, short); to_state = NEW2(ngotos, short); for (sp = first_shift; sp; sp = sp->next) { state1 = sp->number; for (i = sp->nshifts - 1; i >= 0; i--) { state2 = sp->shift[i]; symbol = accessing_symbol[state2]; if (ISTOKEN(symbol)) break; k = temp_map[symbol]++; from_state[k] = state1; to_state[k] = state2; } } FREE(temp_map + ntokens); } /* Map_goto maps a state/symbol pair into its numeric representation. */ int map_goto(state, symbol) int state; int symbol; { register int high; register int low; register int middle; register int s; low = goto_map[symbol]; high = goto_map[symbol + 1]; for (;;) { assert(low <= high); middle = (low + high) >> 1; s = from_state[middle]; if (s == state) return (middle); else if (s < state) low = middle + 1; else high = middle - 1; } } initialize_F() { register int i; register int j; register int k; register shifts *sp; register short *edge; register unsigned *rowp; register short *rp; register short **reads; register int nedges; register int stateno; register int symbol; register int nwords; nwords = ngotos * tokensetsize; F = NEW2(nwords, unsigned); reads = NEW2(ngotos, short *); edge = NEW2(ngotos + 1, short); nedges = 0; rowp = F; for (i = 0; i < ngotos; i++) { stateno = to_state[i]; sp = shift_table[stateno]; if (sp) { k = sp->nshifts; for (j = 0; j < k; j++) { symbol = accessing_symbol[sp->shift[j]]; if (ISVAR(symbol)) break; SETBIT(rowp, symbol); } for (; j < k; j++) { symbol = accessing_symbol[sp->shift[j]]; if (nullable[symbol]) edge[nedges++] = map_goto(stateno, symbol); } if (nedges) { reads[i] = rp = NEW2(nedges + 1, short); for (j = 0; j < nedges; j++) rp[j] = edge[j]; rp[nedges] = -1; nedges = 0; } } rowp += tokensetsize; } SETBIT(F, 0); digraph(reads); for (i = 0; i < ngotos; i++) { if (reads[i]) FREE(reads[i]); } FREE(reads); FREE(edge); } build_relations() { register int i; register int j; register int k; register short *rulep; register short *rp; register shifts *sp; register int length; register int nedges; register int done; register int state1; register int stateno; register int symbol1; register int symbol2; register short *shortp; register short *edge; register short *states; register short **new_includes; includes = NEW2(ngotos, short *); edge = NEW2(ngotos + 1, short); states = NEW2(maxrhs + 1, short); for (i = 0; i < ngotos; i++) { nedges = 0; state1 = from_state[i]; symbol1 = accessing_symbol[to_state[i]]; for (rulep = derives[symbol1]; *rulep >= 0; rulep++) { length = 1; states[0] = state1; stateno = state1; for (rp = ritem + rrhs[*rulep]; *rp >= 0; rp++) { symbol2 = *rp; sp = shift_table[stateno]; k = sp->nshifts; for (j = 0; j < k; j++) { stateno = sp->shift[j]; if (accessing_symbol[stateno] == symbol2) break; } states[length++] = stateno; } add_lookback_edge(stateno, *rulep, i); length--; done = 0; while (!done) { done = 1; rp--; if (ISVAR(*rp)) { stateno = states[--length]; edge[nedges++] = map_goto(stateno, *rp); if (nullable[*rp] && length > 0) done = 0; } } } if (nedges) { includes[i] = shortp = NEW2(nedges + 1, short); for (j = 0; j < nedges; j++) shortp[j] = edge[j]; shortp[nedges] = -1; } } new_includes = transpose(includes, ngotos); for (i = 0; i < ngotos; i++) if (includes[i]) FREE(includes[i]); FREE(includes); includes = new_includes; FREE(edge); FREE(states); } add_lookback_edge(stateno, ruleno, gotono) int stateno, ruleno, gotono; { register int i, k; register int found; register shorts *sp; i = lookaheads[stateno]; k = lookaheads[stateno + 1]; found = 0; while (!found && i < k) { if (LAruleno[i] == ruleno) found = 1; else ++i; } assert(found); sp = NEW(shorts); sp->next = lookback[i]; sp->value = gotono; lookback[i] = sp; } short ** transpose(R, n) short **R; int n; { register short **new_R; register short **temp_R; register short *nedges; register short *sp; register int i; register int k; nedges = NEW2(n, short); for (i = 0; i < n; i++) { sp = R[i]; if (sp) { while (*sp >= 0) nedges[*sp++]++; } } new_R = NEW2(n, short *); temp_R = NEW2(n, short *); for (i = 0; i < n; i++) { k = nedges[i]; if (k > 0) { sp = NEW2(k + 1, sh;;;ort); new_R[i] = sp; temp_R[i] = sp; sp[k] = -1; } } FREE(nedges); for (i = 0; i < n; i++) { sp = R[i]; if (sp) { while (*sp >= 0) *temp_R[*sp++]++ = i; } } FREE(temp_R); return (new_R); } compute_FOLLOWS() { digraph(includes); } compute_lookaheads() { register int i, n; register unsigned *fp1, *fp2, *fp3; register shorts *sp, *next; register unsigned *rowp; rowp = LA; n = lookaheads[nstates]; for (i = 0; i < n; i++) { fp3 = rowp + tokensetsize; for (sp = lookback[i]; sp; sp = sp->next) { fp1 = rowp; fp2 = F + tokensetsize * sp->value; while (fp1 < fp3) *fp1++ |= *fp2++; } rowp = fp3; } for (i = 0; i < n; i++) for (sp = lookback[i]; sp; sp = next) { next = sp->next; FREE(sp); } FREE(lookback); FREE(F); } digraph(relation) short **relation; { register int i; infinity = ngotos + 2; INDEX = NEW2(ngotos + 1, short); VERTICES = NEW2(ngotos + 1, short); top = 0; R = relation; for (i = 0; i < ngotos; i++) INDEX[i] = 0; for (i = 0; i < ngotos; i++) { if (INDEX[i] == 0 && R[i]) traverse(i); } FREE(INDEX); FREE(VERTICES); } traverse(i) register int i; { register unsigned *fp1; register unsigned *fp2; register unsigned *fp3; register int j; register short *rp; int height; unsigned *base; VERTICES[++top] = i; INDEX[i] = height = top; base = F + i * tokensetsize; fp3 = base + tokensetsize; rp = R[i]; if (rp) { while ((j = *rp++) >= 0) { if (INDEX[j] == 0) traverse(j); if (INDEX[i] > INDEX[j]) INDEX[i] = INDEX[j]; fp1 = base; fp2 = F + j * tokensetsize; while (fp1 < fp3) *fp1++ |= *fp2++; } } if (INDEX[i] == height) { for (;;) { j = VERTICES[top--]; INDEX[j] = infinity; if (i == j) break; fp1 = base; fp2 = F + j * tokensetsize; while (fp1 < fp3) *fp2++ = *fp1++; } } } #include "defs.h" extern short *itemset; extern short *itemsetend; extern unsigned *ruleset; int nstates; core *first_state; shifts *first_shift; reductions *first_reduction; int get_state(); core *new_state(); static core **state_set; static core *this_state; static core *last_state; static shifts *last_shift; static reductions *last_reduction; static int nshifts; static short *shift_symbol; static short *redset; static short *shiftset; static short **kernel_base; static short **kernel_end; static short *kernel_items; allocate_itemsets() { register short *itemp; register short *item_end; register int symbol; register int i; register int count; register int max; register short *symbol_count; count = 0; symbol_count = NEW2(nsyms, short); item_end = ritem + nitems; for (itemp = ritem; itemp < item_end; itemp++) { symbol = *itemp; if (symbol >= 0) { count++; symbol_count[symbol]++; } } kernel_base = NEW2(nsyms, short *); kernel_items = NEW2(count, short); count = 0; max = 0; for (i = 0; i < nsyms; i++) { kernel_base[i] = kernel_items + count; count += symbol_count[i]; if (max < symbol_count[i]) max = symbol_count[i]; } shift_symbol = symbol_count; kernel_end = NEW2(nsyms, short *); } allocate_storage() { allocate_itemsets(); shiftset = NEW2(nsyms, short); redset = NEW2(nrules + 1, short); state_set = NEW2(nitems, core *); } append_states() { register int i; register int j; register int symbol; #ifdef TRACE fprintf(stderr, "Entering append_states()\n"); #endif for (i = 1; i < nshifts; i++) { symbol = shift_symbol[i]; j = i; while (j > 0 && shift_symbol[j - 1] > symbol) { shift_symbol[j] = shift_symbol[j - 1]; j--; } shift_symbol[j] = symbol; } for (i = 0; i < nshifts; i++) { symbol = shift_symbol[i]; shiftset[i] = get_state(symbol); } } free_storage() { FREE(shift_symbol); FREE(redset); FREE(shiftset); FREE(kernel_base); FREE(kernel_end); FREE(kernel_items); FREE(state_set); } generate_states() { allocate_storage(); itemset = NEW2(nitems, short); ruleset = NEW2(WORDSIZE(nrules), unsigned); set_first_derives(); initialize_states(); while (this_state) { closure(this_state->items, this_state->nitems); save_reductions(); new_itemsets(); append_states(); if (nshifts > 0) save_shifts(); this_state = this_state->next; } finalize_closure(); free_storage(); } int get_state(symbol) int symbol; { register int key; register short *isp1; register short *isp2; register short *iend; register core *sp; register int found; register int n; #ifdef TRACE fprintf(stderr, "Entering get_state(%d)\n", symbol); #endif isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; n = iend - isp1; key = *isp1; assert(0 <= key && key < nitems); sp = state_set[key]; if (sp) { found = 0; while (!found) { if (sp->nitems == n) { found = 1; isp1 = kernel_base[symbol]; isp2 = sp->items; while (found && isp1 < iend) { if (*isp1++ != *isp2++) found = 0; } } if (!found) { if (sp->link) { sp = sp->link; } else { sp = sp->link = new_state(symbol); found = 1; } } } } else { state_set[key] = sp = new_state(symbol); } return (sp->number); } initialize_states() { register int i; register short *start_derives; register core *p; start_derives = derives[start_symbol]; for (i = 0; start_derives[i] >= 0; ++i) continue; p = (core *) MALLOC(sizeof(core) + i*sizeof(short)); if (p == 0) no_space(); p->next = 0; p->link = 0; p->number = 0; p->accessing_symbol = 0; p->nitems = i; for (i = 0; start_derives[i] >= 0; ++i) p->items[i] = rrhs[start_derives[i]]; first_state = last_state = this_state = p; nstates = 1; } new_itemsets() { register int i; register int shiftcount; register short *isp; register short *ksp; register int symbol; for (i = 0; i < nsyms; i++) kernel_end[i] = 0; shiftcount = 0; isp = itemset; while (isp < itemsetend) { i = *isp++; symbol = ritem[i]; if (symbol > 0) { ksp = kernel_end[symbol]; if (!ksp) { shift_symbol[shiftcount++] = symbol; ksp = kernel_base[symbol]; } *ksp++ = i + 1; kernel_end[symbol] = ksp; } } nshifts = shiftcount; } core * new_state(symbol) int symbol; { register int n; register core *p; register short *isp1; register short *isp2; register short *iend; #ifdef TRACE fprintf(stderr, "Entering new_state(%d)\n", symbol); #endif if (nstates >= MAXSHORT) fatal("too many states"); isp1 = kernel_base[symbol]; iend = kernel_end[symbol]; n = iend - isp1; p = (core *) allocate((unsigned) (sizeof(core) + (n - 1) * sizeof(short))); p->accessing_symbol = symbol; p->number = nstates; p->nitems = n; isp2 = p->items; while (isp1 < iend) *isp2++ = *isp1++; last_state->next = p; last_state = p; nstates++; return (p); } /* show_cores is used for debugging */ show_cores() { core *p; int i, j, k, n; int itemno; k = 0; for (p = first_state; p; ++k, p = p->next) { if (k) printf("\n"); printf("state %d, number = %d, accessing symbol = %s\n", k, p->number, symbol_name[p->accessing_symbol]); n = p->nitems; for (i = 0; i < n; ++i) { itemno = p->items[i]; printf("%4d ", itemno); j = itemno; while (ritem[j] >= 0) ++j; printf("%s :", symbol_name[rlhs[-ritem[j]]]); j = rrhs[-ritem[j]]; while (j < itemno) printf(" %s", symbol_name[ritem[j++]]); printf(" ."); while (ritem[j] >= 0) printf(" %s", symbol_name[ritem[j++]]); printf("\n"); fflush(stdout); } } } /* show_ritems is used for debugging */ show_ritems() { int i; for (i = 0; i < nitems; ++i) printf("ritem[%d] = %d\n", i, ritem[i]); } /* show_rrhs is used for debugging */ show_rrhs() { int i; for (i = 0; i < nrules; ++i) printf("rrhs[%d] = %d\n", i, rrhs[i]); } /* show_shifts is used for debugging */ show_shifts() { shifts *p; int i, j, k; k = 0; for (p = first_shift; p; ++k, p = p->next) { if (k) printf("\n"); printf("shift %d, number = %d, nshifts = %d\n", k, p->number, p->nshifts); j = p->nshifts; for (i = 0; i < j; ++i) printf("\t%d\n", p->shift[i]); } } save_shifts() { register shifts *p; register short *sp1; register short *sp2; register short *send; p = (shifts *) allocate((unsigned) (sizeof(shifts) + (nshifts - 1) * sizeof(short))); p->number = this_state->number; p->nshifts = nshifts; sp1 = shiftset; sp2 = p->shift; send = shiftset + nshifts; while (sp1 < send) *sp2++ = *sp1++; if (last_shift) { last_shift->next = p; last_shift = p; } else { first_shift = p; last_shift = p; } } save_reductions() { register short *isp; register short *rp1; register short *rp2; register int item; register int count; register reductions *p; register short *rend; count = 0; for (isp = itemset; isp < itemsetend; isp++) { item = ritem[*isp]; if (item < 0) { redset[count++] = -item; } } if (count) { p = (reductions *) allocate((unsigned) (sizeof(reductions) + (count - 1) * sizeof(short))); p->number = this_state->number; p->nreds = count; rp1 = redset; rp2 = p->rules; rend = rp1 + count; while (rp1 < rend) *rp2++ = *rp1++; if (last_reduction) { last_reduction->next = p; last_reduction = p; } else { first_reduction = p; last_reduction = p; } } } set_derives() { register int i, k; register int lhs; register short *rules; derives = NEW2(nsyms, short *); rules = NEW2(nvars + nrules, short); k = 0; for (lhs = start_symbol; lhs < nsyms; lhs++) { derives[l;;;hs] = rules + k; for (i = 0; i < nrules; i++) { if (rlhs[i] == lhs) { rules[k] = i; k++; } } rules[k] = -1; k++; } #ifdef DEBUG print_derives(); #endif } free_derives() { FREE(derives[start_symbol]); FREE(derives); } #ifdef DEBUG print_derives() { register int i; register short *sp; printf("\nDERIVES\n\n"); for (i = start_symbol; i < nsyms; i++) { printf("%s derives ", symbol_name[i]); for (sp = derives[i]; *sp >= 0; sp++) { printf(" %d", *sp); } putchar('\n'); } putchar('\n'); } #endif set_nullable() { register int i, j; register int empty; int done; nullable = MALLOC(nsyms); if (nullable == 0) no_space(); for (i = 0; i < nsyms; ++i) nullable[i] = 0; done = 0; while (!done) { done = 1; for (i = 1; i < nitems; i++) { empty = 1; while ((j = ritem[i]) >= 0) { if (!nullable[j]) empty = 0; ++i; } if (empty) { j = rlhs[-j]; if (!nullable[j]) { nullable[j] = 1; done = 0; } } } } #ifdef DEBUG for (i = 0; i < nsyms; i++) { if (nullable[i]) printf("%s is nullable\n", symbol_name[i]); else printf("%s is not nullable\n", symbol_name[i]); } #endif } free_nullable() { FREE(nullable); } lr0() { set_derives(); set_nullable(); generate_states(); } #include #include #include "defs.h" char dflag; char lflag; char rflag; char tflag; char vflag; char *symbol_prefix; char *file_prefix = "y"; char *myname = "yacc"; char *temp_form = "yacc.XXXXXXX"; int lineno; int outline; char *action_file_name; char *code_file_name; char *defines_file_name; char *input_file_name = ""; char *output_file_name; char *text_file_name; char *union_file_name; char *verbose_file_name; FILE *action_file; /* a temp file, used to save actions associated */ /* with rules until the parser is written */ FILE *code_file; /* y.code.c (used when the -r option is specified) */ FILE *defines_file; /* y.tab.h */ FILE *input_file; /* the input file */ FILE *output_file; /* y.tab.c */ FILE *text_file; /* a temp file, used to save text until all */ /* symbols have been defined */ FILE *union_file; /* a temp file, used to save the union */ /* definition until all symbol have been */ /* defined */ FILE *verbose_file; /* y.output */ int nitems; int nrules; int nsyms; int ntokens; int nvars; int start_symbol; char **symbol_name; short *symbol_value; short *symbol_prec; char *symbol_assoc; short *ritem; short *rlhs; short *rrhs; short *rprec; char *rassoc; short **derives; char *nullable; extern char *mktemp(); extern char *getenv(); done(k) int k; { if (action_file) { fclose(action_file); unlink(action_file_name); } if (text_file) { fclose(text_file); unlink(text_file_name); } if (union_file) { fclose(union_file); unlink(union_file_name); } exit(k); } void onintr(signo) int signo; { done(1); } set_signals() { #ifdef SIGINT if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr); #endif #ifdef SIGTERM if (signal(SIGTERM, SIG_IGN) != SIG_IGN) signal(SIGTERM, onintr); #endif #ifdef SIGHUP if (signal(SIGHUP, SIG_IGN) != SIG_IGN) signal(SIGHUP, onintr); #endif } usage() { fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname); exit(1); } getargs(argc, argv) int argc; char *argv[]; { register int i; register char *s; if (argc > 0) myname = argv[0]; for (i = 1; i < argc; ++i) { s = argv[i]; if (*s != '-') break; switch (*++s) { case '\0': input_file = stdin; if (i + 1 < argc) usage(); return; case '-': ++i; goto no_more_options; case 'b': if (*++s) file_prefix = s; else if (++i < argc) file_prefix = argv[i]; else usage(); continue; case 'd': dflag = 1; break; case 'l': lflag = 1; break; case 'p': if (*++s) symbol_prefix = s; else if (++i < argc) symbol_prefix = argv[i]; else usage(); continue; case 'r': rflag = 1; break; case 't': tflag = 1; break; case 'v': vflag = 1; break; default: usage(); } for (;;) { switch (*++s) { case '\0': goto end_of_option; case 'd': dflag = 1; break; case 'l': lflag = 1; break; case 'r': rflag = 1; break; case 't': tflag = 1; break; case 'v': vflag = 1; break; default: usage(); } } end_of_option:; } no_more_options:; if (i + 1 != argc) usage(); input_file_name = argv[i]; } char * allocate(n) unsigned n; { register char *p; p = NULL; if (n) { p = CALLOC(1, n); if (!p) no_space(); } return (p); } create_file_names() { int i, len; char *tmpdir; tmpdir = getenv("TMPDIR"); if (tmpdir == 0) tmpdir = "/tmp"; len = strlen(tmpdir); i = len + 13; if (len && tmpdir[len-1] != '/') ++i; action_file_name = MALLOC(i); if (action_file_name == 0) no_space(); text_file_name = MALLOC(i); if (text_file_name == 0) no_space(); union_file_name = MALLOC(i); if (union_file_name == 0) no_space(); strcpy(action_file_name, tmpdir); strcpy(text_file_name, tmpdir); strcpy(union_file_name, tmpdir); if (len && tmpdir[len - 1] != '/') { action_file_name[len] = '/'; text_file_name[len] = '/'; union_file_name[len] = '/'; ++len; } strcpy(action_file_name + len, temp_form); strcpy(text_file_name + len, temp_form); strcpy(union_file_name + len, temp_form); action_file_name[len + 5] = 'a'; text_file_name[len + 5] = 't'; union_file_name[len + 5] = 'u'; mktemp(action_file_name); mktemp(text_file_name); mktemp(union_file_name); len = strlen(file_prefix); output_file_name = MALLOC(len + 7); if (output_file_name == 0) no_space(); strcpy(output_file_name, file_prefix); strcpy(output_file_name + len, OUTPUT_SUFFIX); if (rflag) { code_file_name = MALLOC(len + 8); if (code_file_name == 0) no_space(); strcpy(code_file_name, file_prefix); strcpy(code_file_name + len, CODE_SUFFIX); } else code_file_name = output_file_name; if (dflag) { defines_file_name = MALLOC(len + 7); if (defines_file_name == 0) no_space(); strcpy(defines_file_name, file_prefix); strcpy(defines_file_name + len, DEFINES_SUFFIX); } if (vflag) { verbose_file_name = MALLOC(len + 8); if (verbose_file_name == 0) no_space(); strcpy(verbose_file_name, file_prefix); strcpy(verbose_file_name + len, VERBOSE_SUFFIX); } } open_files() { create_file_names(); if (input_file == 0) { input_file = fopen(input_file_name, "r"); if (input_file == 0) open_error(input_file_name); } action_file = fopen(action_file_name, "w"); if (action_file == 0) open_error(action_file_name); text_file = fopen(text_file_name, "w"); if (text_file == 0) open_error(text_file_name); if (vflag) { verbose_file = fopen(verbose_file_name, "w"); if (verbose_file == 0) open_error(verbose_file_name); } if (dflag) { defines_file = fopen(defines_file_name, "w"); if (defines_file == 0) open_error(defines_file_name); union_file = fopen(union_file_name, "w"); if (union_file == 0) open_error(union_file_name); } output_file = fopen(output_file_name, "w"); if (output_file == 0) open_error(output_file_name); if (rflag) { code_file = fopen(code_file_name, "w"); if (code_file == 0) open_error(code_file_name); } else code_file = output_file; } int main(argc, argv) int argc; char *argv[]; { set_signals(); getargs(argc, argv); open_files(); reader(); lr0(); lalr(); make_parser(); verbose(); output(); done(0); /*NOTREACHED*/ } #include "defs.h" action **parser; int SRtotal; int RRtotal; short *SRconflicts; short *RRconflicts; short *defred; short *rules_used; short nunused; short final_state; static int SRcount; static int RRcount; extern action *parse_actions(); extern action *get_shifts(); extern action *add_reductions(); extern action *add_reduce(); make_parser() { register int i; parser = NEW2(nstates, action *); for (i = 0; i < nstates; i++) parser[i] = parse_actions(i); find_final_state(); remove_conflicts(); unused_rules(); if (SRtotal + RRtotal > 0) total_conflicts(); defreds(); } action * parse_actions(stateno) register int stateno; { register action *actions; actions = get_shifts(stateno); actions = add_reductions(stateno, actions); return (actions); } action * get_shifts(stateno) int stateno; { register action *actions, *temp; register shifts *sp; register short *to_state; register int i, k; register int symbol; actions = 0; sp = shift_table[stateno]; if (sp) { to_state = sp->shift; for (i = sp->nshifts - 1; i >= 0; i--) { k = to_state[i]; symbol = accessing_symbol[k]; if (ISTOKEN(symbol)) { temp = NEW(action); temp->next = actions; temp->symbol = symbol; temp->number = k; temp->prec = symbol_prec[symbol]; temp->action_code = SHIFT; temp->assoc = symbol_assoc[symbol]; actions = temp; } } } return (actions); } action * add_reductions(stateno, actions) int stateno; register action *actions; { register int i, j, m, n; register int ruleno, tokensetsize; register unsigned *rowp; tokensetsize = WORDSIZE(ntokens); m = lookaheads[stateno]; n = lookaheads[stateno + 1]; for (i = m; i < n; i++) { ruleno = LAruleno[i]; rowp = LA + i * tokensetsize; for (j = ntokens - 1; j >= 0; j--) { if (BIT(rowp, j)) actions = add_reduce(actions, ruleno, j); } } return (actions); } action * add_reduce(actions, ruleno, symbol) register action *actions; register int ruleno, symbol; { register action *temp, *prev, *next; prev = 0; for (next = actions; next && next->symbol < symbol; next = next->next) prev = next; while (next && next->symbol == symbol && next->action_code == SHIFT) { prev = next; next = next->next; } while (next && next->symbol == symbol && next->action_code == REDUCE && next->number < ruleno) { prev = next; next = next->next; } temp = NEW(action); temp->next = next; temp->symbol = symbol; temp->number = ruleno; temp->prec = rprec[ruleno]; temp->action_code = REDUCE; temp->assoc = rassoc[ruleno]; if (prev) prev->next = temp; else actions = temp; return (actions); } find_final_state() { register int goal, i; register short *to_state; register shifts *p; p = shift_table[0]; to_state = p->shift; goal = ritem[1]; for (i = p->nshifts - 1; i >= 0; --i) { final_state = to_state[i]; if (accessing_symbol[final_state] == goal) break; } } unused_rules() { register int i; register action *p; rules_used = (short *) MALLOC(nrules*sizeof(short)); if (rules_used == 0) no_space(); for (i = 0; i < nrules; ++i) rules_used[i] = 0; for (i = 0; i < nstates; ++i) { for (p = parser[i]; p; p = p->next) { if (p->action_code == REDUCE && p->suppressed == 0) rules_used[p->number] = 1; } } nunused = 0; for (i = 3; i < nrules; ++i) if (!rules_used[i]) ++nunused; if (nunused) if (nunused == 1) fprintf(stderr, "%s: 1 rule never reduced\n", myname); else fprintf(stderr, "%s: %d rules never reduced\n", myname, nunused); } remove_conflicts() { register int i; register int symbol; register action *p, *pref; SRtotal = 0; RRtotal = 0; SRconflicts = NEW2(nstates, short); RRconflicts = NEW2(nstates, short); for (i = 0; i < nstates; i++) { SRcount = 0; RRcount = 0; symbol = -1; for (p = parser[i]; p; p = p->next) { if (p->symbol != symbol) { pref = p; symbol = p->symbol; } else if (i == final_state && symbol == 0) { SRcount++; p->suppressed = 1; } else if (pref->action_code == SHIFT) { if (pref->prec > 0 && p->prec > 0) { if (pref->prec < p->prec) { pref->suppressed = 2; pref = p; } else if (pref->prec > p->prec) { p->suppressed = 2; } else if (pref->assoc == LEFT) { pref->suppressed = 2; pref = p; } else if (pref->assoc == RIGHT) { p->suppressed = 2; } else { pref->suppressed = 2; p->suppressed = 2; } } else { SRcount++; p->suppressed = 1; } } else { RRcount++; p->suppressed = 1; } } SRtotal += SRcount; RRtotal += RRcount; SRconflicts[i] = SRcount; RRconflicts[i] = RRcount; } } total_conflicts() { fprintf(stderr, "%s: ", myname); if (SRtotal == 1) fprintf(stderr, "1 shift/reduce conflict"); else if (SRtotal > 1) fprintf(stderr, "%d shift/reduce conflicts", SRtotal); if (SRtotal && RRtotal) fprintf(stderr, ", "); if (RRtotal == 1) fprintf(stderr, "1 reduce/reduce conflict"); else if (RRtotal > 1) fprintf(stderr, "%d reduce/reduce conflicts", RRtotal); fprintf(stderr, ".\n"); } int sole_reduction(stateno) int stateno; { register int count, ruleno; register action *p; count = 0; ruleno = 0; for (p = parser[stateno]; p; p = p->next) { if (p->action_code == SHIFT && p->suppressed == 0) return (0); else if (p->action_code == REDUCE && p->suppressed == 0) { if (ruleno > 0 && p->number != ruleno) return (0); if (p->symbol != 1) ++count; ruleno = p->number; } } if (count == 0) return (0); return (ruleno); } defreds() { register int i; defred = NEW2(nstates, short); for (i = 0; i < nstates; i++) defred[i] = sole_reduction(i); } free_action_row(p) register action *p; { register action *q; while (p) { q = p->next; FREE(p); p = q; } } free_parser() { register int i; for (i = 0; i < nstates; i++) free_action_row(parser[i]); FREE(parser); } #include "defs.h" static int nvectors; static int nentries; static short **froms; static short **tos; static short *tally; static short *width; static short *state_count; static short *order; static short *base; static short *pos; static int maxtable; static short *table; static short *check; static int lowzero; static int high; output() { free_itemsets(); free_shifts(); free_reductions(); output_prefix(); output_stored_text(); output_defines(); output_rule_data(); output_yydefred(); output_actions(); free_parser(); output_debug(); output_stype(); if (rflag) write_section(tables); write_section(header); output_trailing_text(); write_section(body); output_semantic_actions(); write_section(trailer); } output_prefix() { if (symbol_prefix == NULL) symbol_prefix = "yy"; else { ++outline; fprintf(code_file, "#define yyparse %sparse\n", symbol_prefix); ++outline; fprintf(code_file, "#define yylex %slex\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyerror %serror\n", symbol_prefix); ++outline; fprintf(code_file, "#define yychar %schar\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyval %sval\n", symbol_prefix); ++outline; fprintf(code_file, "#define yylval %slval\n", symbol_prefix); ++outline; fprintf(code_file, "#define yydebug %sdebug\n", symbol_prefix); ++outline; fprintf(code_file, "#define yynerrs %snerrs\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyerrflag %serrflag\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyss %sss\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyssp %sssp\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyvs %svs\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyvsp %svsp\n", symbol_prefix); ++outline; fprintf(code_file, "#define yylhs %slhs\n", symbol_prefix); ++outline; fprintf(code_file, "#define yylen %slen\n", symbol_prefix); ++outline; fprintf(code_file, "#define yydefred %sdefred\n", symbol_prefix); ++outline; fprintf(code_file, "#define yydgoto %sdgoto\n", symbol_prefix); ++outline; fprintf(code_file, "#define yysindex %ssindex\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyrindex %srindex\n", symbol_prefix); ++outline; fprintf(code_file, "#define yygindex %sgindex\n", symbol_prefix); ++outline; fprintf(code_file, "#define yytable %stable\n", symbol_prefix); ++outline; fprintf(code_file, "#define yycheck %scheck\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyname %sname\n", symbol_prefix); ++outline; fprintf(code_file, "#define yyrule %srule\n", symbol_prefix); } ++outline; fprintf(code_file, "#define YYPREFIX \"%s\"\n", symbol_prefix); } output_rule_data() { register int i; register int j; fprintf(output_file, "short %slhs[] = {%42d,", symbol_prefix, symbol_value[start_symbol]); j = 10; for (i = 3; i < nrules; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", symbol_value[rlhs[i]]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); fprintf(output_file, "short %slen[] = {%42d,", symbol_prefix, 2); j = 10; for (i = 3; i < nrules; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else j++; fprintf(output_file, "%5d,", rrhs[i + 1] - rrhs[i] - 1); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); } output_yydefred() { register int i, j; fprintf(output_file, "short %sdefred[] = {%39d,", symbol_prefix, (defred[0] ? defred[0] - 2 : 0)); j = 10; for (i = 1; i < nstates; i++) { if (j < 10) ++j; else { if (!rflag) ++outline; putc('\n', output_file); j = 1; } fprintf(output_file, "%5d,", (defred[i] ? defred[i] - 2 : 0)); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); } output_actions() { nvectors = 2*nstates + nvars; froms = NEW2(nvectors, short *); tos = NEW2(nvectors, short *); tally = NEW2(nvectors, short); width = NEW2(nvectors, short); token_actions(); FREE(lookaheads); FREE(LA); FREE(LAruleno); FREE(accessing_symbol); goto_actions(); FREE(goto_map + ntokens); FREE(from_state); FREE(to_state); sort_actions(); pack_table(); output_base(); output_table(); output_check(); } token_actions() { register int i, j; register int shiftcount, reducecount; register int max, min; register short *actionrow, *r, *s; register action *p; actionrow = NEW2(2*ntokens, short); for (i = 0; i < nstates; ++i) { if (parser[i]) { for (j = 0; j < 2*ntokens; ++j) actionrow[j] = 0; shiftcount = 0; reducecount = 0; for (p = parser[i]; p; p = p->next) { if (p->suppressed == 0) { if (p->action_code == SHIFT) { ++shiftcount; actionrow[p->symbol] = p->number; } else if (p->action_code == REDUCE && p->number != defred[i]) { ++reducecount; actionrow[p->symbol + ntokens] = p->number; } } } tally[i] = shiftcount; tally[nstates+i] = reducecount; width[i] = 0; width[nstates+i] = 0; if (shiftcount > 0) { froms[i] = r = NEW2(shiftcount, short); tos[i] = s = NEW2(shiftcount, short); min = MAXSHORT; max = 0; for (j = 0; j < ntokens; ++j) { if (actionrow[j]) { if (min > symbol_value[j]) min = symbol_value[j]; if (max < symbol_value[j]) max = symbol_value[j]; *r++ = symbol_value[j]; *s++ = actionrow[j]; } } width[i] = max - min + 1; } if (reducecount > 0) { froms[nstates+i] = r = NEW2(reducecount, short); tos[nstates+i] = s = NEW2(reducecount, short); min = MAXSHORT; max = 0; for (j = 0; j < ntokens; ++j) { if (actionrow[ntokens+j]) { if (min > symbol_value[j]) min = symbol_value[j]; if (max < symbol_value[j]) max = symbol_value[j]; *r++ = symbol_value[j]; *s++ = actionrow[ntokens+j] - 2; } } width[nstates+i] = max - min + 1; } } } FREE(actionrow); } goto_actions() { register int i, j, k; state_count = NEW2(nstates, short); k = default_goto(start_symbol + 1); fprintf(output_file, "short %sdgoto[] = {%40d,", symbol_prefix, k); save_column(start_symbol + 1, k); j = 10; for (i = start_symbol + 2; i < nsyms; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; k = default_goto(i); fprintf(output_file, "%5d,", k); save_column(i, k); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); FREE(state_count); } int default_goto(symbol) int symbol; { register int i; register int m; register int n; register int default_state; register int max; m = goto_map[symbol]; n = goto_map[symbol + 1]; if (m == n) return (0); for (i = 0; i < nstates; i++) state_count[i] = 0; for (i = m; i < n; i++) state_count[to_state[i]]++; max = 0; default_state = 0; for (i = 0; i < nstates; i++) { if (state_count[i] > max) { max = state_count[i]; default_state = i; } } return (default_state); } save_column(symbol, default_state) int symbol; int default_state; { register int i; register int m; register int n; register short *sp; register short *sp1; register short *sp2; register int count; register int symno; m = goto_map[symbol]; n = goto_map[symbol + 1]; count = 0; for (i = m; i < n; i++) { if (to_state[i] != default_state) ++count; } if (count == 0) return; symno = symbol_value[symbol] + 2*nstates; froms[symno] = sp1 = sp = NEW2(count, short); tos[symno] = sp2 = NEW2(count, short); for (i = m; i < n; i++) { if (to_state[i] != default_state) { *sp1++ = from_state[i]; *sp2++ = to_state[i]; } } < < < < <<<<<<<<<<<< tally[symno] = count; width[symno] = sp1[-1] - sp[0] + 1; } sort_actions() { register int i; register int j; register int k; register int t; register int w; order = NEW2(nvectors, short); nentries = 0; for (i = 0; i < nvectors; i++) { if (tally[i] > 0) { t = tally[i]; w = width[i]; j = nentries - 1; while (j >= 0 && (width[order[j]] < w)) j--; while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) j--; for (k = nentries - 1; k > j; k--) order[k + 1] = order[k]; order[j + 1] = i; nentries++; } } } pack_table() { register int i; register int place; register int state; base = NEW2(nvectors, short); pos = NEW2(nentries, short); maxtable = BITS_PER_WORD == 16 ? 400 : 1000; table = NEW2(maxtable, short); check = NEW2(maxtable, short); lowzero = 0; high = 0; for (i = 0; i < maxtable; i++) check[i] = -1; for (i = 0; i < nentries; i++) { state = matching_vector(i); if (state < 0) place = pack_vector(i); else place = base[state]; pos[i] = place; base[order[i]] = place; } for (i = 0; i < nvectors; i++) { if (froms[i]) FREE(froms[i]); if (tos[i]) FREE(tos[i]); } FREE(froms); FREE(tos); FREE(pos); } /* The function matching_vector determines if the vector specified by */ /* the input parameter matches a previously considered vector. The */ /* test at the start of the function checks if the vector represents */ /* a row of shifts over terminal symbols or a row of reductions, or a */ /* column of shifts over a nonterminal symbol. Berkeley Yacc does not */ /* check if a column of shifts over a nonterminal symbols matches a */ /* previously considered vector. Because of the nature of LR parsing */ /* tables, no two columns can match. Therefore, the only possible */ /* match would be between a row and a column. Such matches are */ /* unlikely. Therefore, to save time, no attempt is made to see if a */ /* column matches a previously considered vector. */ /* */ /* Matching_vector is poorly designed. The test could easily be made */ /* faster. Also, it depends on the vectors being in a specific */ /* order. */ int matching_vector(vector) int vector; { register int i; register int j; register int k; register int t; register int w; register int match; register int prev; i = order[vector]; if (i >= 2*nstates) return (-1); t = tally[i]; w = width[i]; for (prev = vector - 1; prev >= 0; prev--) { j = order[prev]; if (width[j] != w || tally[j] != t) return (-1); match = 1; for (k = 0; match && k < t; k++) { if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k]) match = 0; } if (match) return (j); } return (-1); } int pack_vector(vector) int vector; { register int i, j, k, l; register int t; register int loc; register int ok; register short *from; register short *to; int newmax; i = order[vector]; t = tally[i]; assert(t); from = froms[i]; to = tos[i]; j = lowzero - from[0]; for (k = 1; k < t; ++k) if (lowzero - from[k] > j) j = lowzero - from[k]; for (;; ++j) { if (j == 0) continue; ok = 1; for (k = 0; ok && k < t; k++) { loc = j + from[k]; if (loc >= maxtable) { if (loc >= MAXTABLE) fatal("maximum table size exceeded"); newmax = maxtable; do { newmax += 200; } while (newmax <= loc); table = (short *) REALLOC(table, newmax*sizeof(short)); if (table == 0) no_space(); check = (short *) REALLOC(check, newmax*sizeof(short)); if (check == 0) no_space(); for (l = maxtable; l < newmax; ++l) { table[l] = 0; check[l] = -1; } maxtable = newmax; } if (check[loc] != -1) ok = 0; } for (k = 0; ok && k < vector; k++) { if (pos[k] == j) ok = 0; } if (ok) { for (k = 0; k < t; k++) { loc = j + from[k]; table[loc] = to[k]; check[loc] = from[k]; if (loc > high) high = loc; } while (check[lowzero] != -1) ++lowzero; return (j); } } } output_base() { register int i, j; fprintf(output_file, "short %ssindex[] = {%39d,", symbol_prefix, base[0]); j = 10; for (i = 1; i < nstates; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", base[i]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\nshort %srindex[] = {%39d,", symbol_prefix, base[nstates]); j = 10; for (i = nstates + 1; i < 2*nstates; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", base[i]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\nshort %sgindex[] = {%39d,", symbol_prefix, base[2*nstates]); j = 10; for (i = 2*nstates + 1; i < nvectors - 1; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", base[i]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); FREE(base); } output_table() { register int i; register int j; ++outline; fprintf(code_file, "#define YYTABLESIZE %d\n", high); fprintf(output_file, "short %stable[] = {%40d,", symbol_prefix, table[0]); j = 10; for (i = 1; i <= high; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", table[i]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); FREE(table); } output_check() { register int i; register int j; fprintf(output_file, "short %scheck[] = {%40d,", symbol_prefix, check[0]); j = 10; for (i = 1; i <= high; i++) { if (j >= 10) { if (!rflag) ++outline; putc('\n', output_file); j = 1; } else ++j; fprintf(output_file, "%5d,", check[i]); } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); FREE(check); } int is_C_identifier(name) char *name; { register char *s; register int c; s = name; c = *s; if (c == '"') { c = *++s; if (!isalpha(c) && c != '_' && c != '$') return (0); while ((c = *++s) != '"') { if (!isalnum(c) && c != '_' && c != '$') return (0); } return (1); } if (!isalpha(c) && c != '_' && c != '$') return (0); while (c = *++s) { if (!isalnum(c) && c != '_' && c != '$') return (0); } return (1); } output_defines() { register int c, i; register char *s; for (i = 2; i < ntokens; ++i) { s = symbol_name[i]; if (is_C_identifier(s)) { fprintf(code_file, "#define "); if (dflag) fprintf(defines_file, "#define "); c = *s; if (c == '"') { while ((c = *++s) != '"') { putc(c, code_file); if (dflag) putc(c, defines_file); } } else { do { putc(c, code_file); if (dflag) putc(c, defines_file); } while (c = *++s); } ++outline; fprintf(code_file, " %d\n", symbol_value[i]); if (dflag) fprintf(defines_file, " %d\n", symbol_value[i]); } } ++outline; fprintf(code_file, "#define YYERRCODE %d\n", symbol_value[1]); if (dflag && unionized) { fclose(union_file); union_file = fopen(union_file_name, "r"); if (union_file == NULL) open_error(union_file_name); while ((c = getc(union_file)) != EOF) putc(c, defines_file); fprintf(defines_file, " YYSTYPE;\nextern YYSTYPE %slval;\n", symbol_prefix); } } output_stored_text() { register int c; register FILE *in, *out; fclose(text_file); text_file = fopen(text_file_name, "r"); if (text_file == NULL) open_error(text_file_name); in = text_file; if ((c = getc(in)) == EOF) return; out = code_file; if (c == '\n') ++outline; putc(c, out); while ((c = getc(in)) != EOF) { if (c == '\n') ++outline; putc(c, out); } if (!lflag) fprintf(out, line_format, ++outline + 1, code_file_name); } output_debug() { register int i, j, k, max; char **symnam, *s; ++outline; fprintf(code_file, "#define YYFINAL %d\n", final_state); outline += 3; fprintf(code_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", tflag); if (rflag) fprintf(output_file, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n", tflag); max = 0; for (i = 2; i < ntokens; ++i) if (symbol_value[i] > max) max = symbol_value[i]; ++outline; fprintf(code_file, "#define YYMAXTOKEN %d\n", max); symnam = (char **) MALLOC((max+1)*sizeof(char *)); if (symnam == 0) no_space(); /* Note that it is not necessary to initialize the element */ /* symnam[max]. */ for (i = 0; i < max; ++i) symnam[i] = 0; for (i = ntokens - 1; i >= 2; --i) symnam[symbol_value[i]] = symbol_name[i]; symnam[0] = "end-of-file"; if (!rflag) ++outline; fprintf(output_file, "#if YYDEBUG\nchar *%sname[] = {", symbol_prefix); j = 80; for (i = 0; i <= max; ++i) { if (s = symnam[i]) { if (s[0] == '"') { k = 7; while (*++s != '"') { ++k; if (*s == '\\') { k += 2; if (*++s == '\\') ++k; } } j += k; if (j > 80) { if (!rflag) ++outline; putc('\n', output_file); j = k; } fprintf(output_file, "\"\\\""); s = symnam[i]; while (*++s != '"') { if (*s == '\\') { fprintf(output_file, "\\\\"); if (*++s == '\\') fprintf(output_file, "\\\\"); else putc(*s, output_file); } else putc(*s, output_file); } fprintf(output_file, "\\\"\","); } else if (s[0] == '\'') { if (s[1] == '"') { j += 7; if (j > 80) { if (!rflag) ++outline; putc('\n', output_file); j = 7; } fprintf(output_file, "\"'\\\"'\","); } else { k = 5; while (*++s != '\'') { ++k; if (*s == '\\') { k += 2; if (*++s == '\\') ++k; } } j += k; if (j > 80) { if (!rflag) ++outline; putc('\n', output_file); j = k; } fprintf(output_file, "\"'"); s = symnam[i]; while (*++s != '\'') { if (*s == '\\') { fprintf(output_file, "\\\\"); if (*++s == '\\') fprintf(output_file, "\\\\"); else putc(*s, output_file); } else putc(*s, output_file); } fprintf(output_file, "'\","); } } else { k = strlen(s) + 3; j += k; if (j > 80) { if (!rflag) ++outline; putc('\n', output_file); j = k; } putc('"', output_file); do { putc(*s, output_file); } while (*++s); fprintf(output_file, "\","); } } else { j += 2; if (j > 80) { if (!rflag) ++outline; putc('\n', output_file); j = 2; } fprintf(output_file, "0,"); } } if (!rflag) outline += 2; fprintf(output_file, "\n};\n"); FREE(symnam); if (!rflag) ++outline; fprintf(output_file, "char *%srule[] = {\n", symbol_prefix); for (i = 2; i < nrules; ++i) { fprintf(output_file, "\"%s :", symbol_name[rlhs[i]]); for (j = rrhs[i]; ritem[j] > 0; ++j) { s = symbol_name[ritem[j]]; if (s[0] == '"') { fprintf(output_file, " \\\""); while (*++s != '"') { if (*s == '\\') { if (s[1] == '\\') fprintf(output_file, "\\\\\\\\"); else fprintf(output_file, "\\\\%c", s[1]); ++s; } else putc(*s, output_file); } fprintf(output_file, "\\\""); } else if (s[0] == '\'') { if (s[1] == '"') fprintf(output_file, " '\\\"'"); else if (s[1] == '\\') { if (s[2] == '\\') fprintf(output_file, " '\\\\\\\\"); else fprintf(output_file, " '\\\\%c", s[2]); s += 2; while (*++s != '\'') putc(*s, output_file); putc('\'', output_file); } else fprintf(output_file, " '%c'", s[1]); } else fprintf(output_file, " %s", s); } if (!rflag) ++outline; fprintf(output_file, "\",\n"); } if (!rflag) outline += 2; fprintf(output_file, "};\n#endif\n"); } output_stype() { if (!unionized && ntags == 0) { outline += 3; fprintf(code_file, "#ifndef YYSTYPE\ntypedef int YYSTYPE;\n#endif\n"); } } output_trailing_text() { register int c, last; register FILE *in, *out; if (line == 0) return; in = input_file; out = code_file; c = *cptr; if (c == '\n') { ++lineno; if ((c = getc(in)) == EOF) return; if (!lflag) { ++outline; fprintf(out, line_format, lineno, input_file_name); } if (c == '\n') ++outline; putc(c, out); last = c; } else { if (!lflag) { ++outline; fprintf(out, line_format, lineno, input_file_name); } do { putc(c, out); } while ((c = *++cptr) != '\n'); ++outline; putc('\n', out); last = '\n'; } while ((c = getc(in)) != EOF) { if (c == '\n') ++outline; putc(c, out); last = c; } if (last != '\n') { ++outline; putc('\n', out); } if (!lflag) fprintf(out, line_format, ++outline + 1, code_file_name); } output_semantic_actions() { register int c, last; register FILE *out; fclose(action_file); action_file = fopen(action_file_name, "r"); if (action_file == NULL) open_error(action_file_name); if ((c = getc(action_file)) == EOF) return; out = code_file; last = c; if (c == '\n') ++outline; putc(c, out); while ((c = getc(action_file)) != EOF) { if (c == '\n') ++outline; putc(c, out); last = c; } if (last != '\n') { ++outline; putc('\n', out); } if (!lflag) fprintf(out, line_format, ++outline + 1, code_file_name); } free_itemsets() { register core *cp, *next; FREE(state_table); for (cp = first_state; cp; cp = next) { next = cp->next; FREE(cp); } } free_shifts() { register shifts *sp, *next; FREE(shift_table); for (sp = first_shift; sp; sp = next) { next = sp->next; FREE(sp); } } free_reductions() { register reductions *rp, *next; FREE(reduction_table); for (rp = first_reduction; rp; rp = next) { next = rp->next; FREE(rp); } } #include "defs.h" /* The line size must be a positive integer. One hundred was chosen */ /* because few lines in Yacc input grammars exceed 100 characters. */ /* Note that if a line exceeds LINESIZE characters, the line buffer */ /* will be expanded to accomodate it. */ #define LINESIZE 100 char *cache; int cinc, cache_size; int ntags, tagmax; char **tag_table; char saw_eof, unionized; char *cptr, *line; int linesize; bucket *goal; int prec; int gensym; char last_was_action; int maxitems; bucket **pitem; int maxrules; bucket **plhs; int name_pool_size; char *name_pool; char line_format[] = "#line %d \"%s\"\n"; cachec(c) int c; { assert(cinc >= 0); if (cinc >= cache_size) { cache_size += 256; cache = REALLOC(cache, cache_size); if (cache == 0) no_space(); } cache[cinc] = c; ++cinc; } get_line() { register FILE *f = input_file; register int c; register int i; if (saw_eof || (c = getc(f)) == EOF) { if (line) { FREE(line); line = 0; } cptr = 0; saw_eof = 1; return; } if (line == 0 || linesize != (LINESIZE + 1)) { if (line) FREE(line); linesize = LINESIZE + 1; line = MALLOC(linesize); if (line == 0) no_space(); } i = 0; ++lineno; for (;;) { line[i] = c; if (c == '\n') { cptr = line; return; } if (++i >= linesize) { linesize += LINESIZE; line = REALLOC(line, linesize); if (line == 0) no_space(); } c = getc(f); if (c == EOF) { line[i] = '\n'; saw_eof = 1; cptr = line; return; } } } char * dup_line() { register char *p, *s, *t; if (line == 0) return (0); s = line; while (*s != '\n') ++s; p = MALLOC(s - line + 1); if (p == 0) no_space(); s = line; t = p; while ((*t++ = *s++) != '\n') continue; return (p); } skip_comment() { register char *s; int st_lineno = lineno; char *st_line = dup_line(); char *st_cptr = st_line + (cptr - line); s = cptr + 2; for (;;) { if (*s == '*' && s[1] == '/') { cptr = s + 2; FREE(st_line); return; } if (*s == '\n') { get_line(); if (line == 0) unterminated_comment(st_lineno, st_line, st_cptr); s = cptr; } else ++s; } } int nextc() { register char *s; if (line == 0) { get_line(); if (line == 0) return (EOF); } s = cptr; for (;;) { switch (*s) { case '\n': get_line(); if (line == 0) return (EOF); s = cptr; break; case ' ': case '\t': case '\f': case '\r': case '\v': case ',': case ';': ++s; break; case '\\': cptr = s; return ('%'); case '/': if (s[1] == '*') { cptr = s; skip_comment(); s = cptr; break; } else if (s[1] == '/') { get_line(); if (line == 0) return (EOF); s = cptr; break; } /* fall through */ default: cptr = s; return (*s); } } } int keyword() { register int c; char *t_cptr = cptr; c = *++cptr; if (isalpha(c)) { cinc = 0; for (;;) { if (isalpha(c)) { if (isupper(c)) c = tolower(c); cachec(c); } else if (isdigit(c) || c == '_' || c == '.' || c == '$') cachec(c); else break; c = *++cptr; } cachec(NUL); if (strcmp(cache, "token") == 0 || strcmp(cache, "term") == 0) return (TOKEN); if (strcmp(cache, "type") == 0) return (TYPE); if (strcmp(cache, "left") == 0) return (LEFT); if (strcmp(cache, "right") == 0) return (RIGHT); if (strcmp(cache, "nonassoc") == 0 || strcmp(cache, "binary") == 0) return (NONASSOC); if (strcmp(cache, "start") == 0) return (START); if (strcmp(cache, "union") == 0) return (UNION); if (strcmp(cache, "ident") == 0) return (IDENT); } else { ++cptr; if (c == '{') return (TEXT); if (c == '%' || c == '\\') return (MARK); if (c == '<') return (LEFT); if (c == '>') return (RIGHT); if (c == '0') return (TOKEN); if (c == '2') return (NONASSOC); } syntax_error(lineno, line, t_cptr); /*NOTREACHED*/ } copy_ident() { register int c; register FILE *f = output_file; c = nextc(); if (c == EOF) unexpected_EOF(); if (c != '"') syntax_error(lineno, line, cptr); ++outline; fprintf(f, "#ident \""); for (;;) { c = *++cptr; if (c == '\n') { fprintf(f, "\"\n"); return; } putc(c, f); if (c == '"') { putc('\n', f); ++cptr; return; } } } copy_text() { register int c; int quote; register FILE *f = text_file; int need_newline = 0; int t_lineno = lineno; char *t_line = dup_line(); char *t_cptr = t_line + (cptr - line - 2); if (*cptr == '\n') { get_line(); if (line == 0) unterminated_text(t_lineno, t_line, t_cptr); } if (!lflag) fprintf(f, line_format, lineno, input_file_name); loop: c = *cptr++; switch (c) { case '\n': next_line: putc('\n', f); need_newline = 0; get_line(); if (line) goto loop; unterminated_text(t_lineno, t_line, t_cptr); case '\'': case '"': { int s_lineno = lineno; char *s_line = dup_line(); char *s_cptr = s_line + (cptr - line - 1); quote = c; putc(c, f); for (;;) { c = *cptr++; putc(c, f); if (c == quote) { need_newline = 1; FREE(s_line); goto loop; } if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); if (c == '\\') { c = *cptr++; putc(c, f); if (c == '\n') { get_line(); if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); } } } } case '/': putc(c, f); need_newline = 1; c = *cptr; if (c == '/') { putc('*', f); while ((c = *++cptr) != '\n') { if (c == '*' && cptr[1] == '/') fprintf(f, "* "); else putc(c, f); } fprintf(f, "*/"); goto next_line; } if (c == '*') { int c_lineno = lineno; char *c_line = dup_line(); char *c_cptr = c_line + (cptr - line - 1); putc('*', f); ++cptr; for (;;) { c = *cptr++; putc(c, f); if (c == '*' && *cptr == '/') { putc('/', f); ++cptr; FREE(c_line); goto loop; } if (c == '\n') { get_line(); if (line == 0) unterminated_comment(c_lineno, c_line, c_cptr); } } } need_newline = 1; goto loop; case '%': case '\\': if (*cptr == '}') { if (need_newline) putc('\n', f); ++cptr; FREE(t_line); return; } /* fall through */ default: putc(c, f); need_newline = 1; goto loop; } } copy_union() { register int c; int quote; int depth; int u_lineno = lineno; char *u_line = dup_line(); char *u_cptr = u_line + (cptr - line - 6); if (unionized) over_unionized(cptr - 6); unionized = 1; if (!lflag) fprintf(text_file, line_format, lineno, input_file_name); fprintf(text_file, "typedef union"); if (dflag) fprintf(union_file, "typedef union"); depth = 0; loop: c = *cptr++; putc(c, text_file); if (dflag) putc(c, union_file); switch (c) { case '\n': next_line: get_line(); if (line == 0) unterminated_union(u_lineno, u_line, u_cptr); goto loop; case '{': ++depth; goto loop; case '}': if (--depth == 0) { fprintf(text_file, " YYSTYPE;\n"); FREE(u_line); return; } goto loop; case '\'': case '"': { int s_lineno = lineno; char *s_line = dup_line(); char *s_cptr = s_line + (cptr - line - 1); quote = c; for (;;) { c = *cptr++; putc(c, text_file); if (dflag) putc(c, union_file); if (c == quote) { FREE(s_line); goto loop; } if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); if (c == '\\') { c = *cptr++; putc(c, text_file); if (dflag) putc(c, union_file); if (c == '\n') { get_line(); if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); } } } } case '/': c = *cptr; if (c == '/') { putc('*', text_file); if (dflag) <"<#<$<%<&<'<(<)<*<+<,<-<.</<0<1<2<3<4<5<6<7<putc('*', union_file); while ((c = *++cptr) != '\n') { if (c == '*' && cptr[1] == '/') { fprintf(text_file, "* "); if (dflag) fprintf(union_file, "* "); } else { putc(c, text_file); if (dflag) putc(c, union_file); } } fprintf(text_file, "*/\n"); if (dflag) fprintf(union_file, "*/\n"); goto next_line; } if (c == '*') { int c_lineno = lineno; char *c_line = dup_line(); char *c_cptr = c_line + (cptr - line - 1); putc('*', text_file); if (dflag) putc('*', union_file); ++cptr; for (;;) { c = *cptr++; putc(c, text_file); if (dflag) putc(c, union_file); if (c == '*' && *cptr == '/') { putc('/', text_file); if (dflag) putc('/', union_file); ++cptr; FREE(c_line); goto loop; } if (c == '\n') { get_line(); if (line == 0) unterminated_comment(c_lineno, c_line, c_cptr); } } } goto loop; default: goto loop; } } int hexval(c) int c; { if (c >= '0' && c <= '9') return (c - '0'); if (c >= 'A' && c <= 'F') return (c - 'A' + 10); if (c >= 'a' && c <= 'f') return (c - 'a' + 10); return (-1); } bucket * get_literal() { register int c, quote; register int i; register int n; register char *s; register bucket *bp; int s_lineno = lineno; char *s_line = dup_line(); char *s_cptr = s_line + (cptr - line); quote = *cptr++; cinc = 0; for (;;) { c = *cptr++; if (c == quote) break; if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); if (c == '\\') { char *c_cptr = cptr - 1; c = *cptr++; switch (c) { case '\n': get_line(); if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); continue; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': n = c - '0'; c = *cptr; if (IS_OCTAL(c)) { n = (n << 3) + (c - '0'); c = *++cptr; if (IS_OCTAL(c)) { n = (n << 3) + (c - '0'); ++cptr; } } if (n > MAXCHAR) illegal_character(c_cptr); c = n; break; case 'x': c = *cptr++; n = hexval(c); if (n < 0 || n >= 16) illegal_character(c_cptr); for (;;) { c = *cptr; i = hexval(c); if (i < 0 || i >= 16) break; ++cptr; n = (n << 4) + i; if (n > MAXCHAR) illegal_character(c_cptr); } c = n; break; case 'a': c = 7; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'n': c = '\n'; break; case 'r': c = '\r'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; } } cachec(c); } FREE(s_line); n = cinc; s = MALLOC(n); if (s == 0) no_space(); for (i = 0; i < n; ++i) s[i] = cache[i]; cinc = 0; if (n == 1) cachec('\''); else cachec('"'); for (i = 0; i < n; ++i) { c = ((unsigned char *)s)[i]; if (c == '\\' || c == cache[0]) { cachec('\\'); cachec(c); } else if (isprint(c)) cachec(c); else { cachec('\\'); switch (c) { case 7: cachec('a'); break; case '\b': cachec('b'); break; case '\f': cachec('f'); break; case '\n': cachec('n'); break; case '\r': cachec('r'); break; case '\t': cachec('t'); break; case '\v': cachec('v'); break; default: cachec(((c >> 6) & 7) + '0'); cachec(((c >> 3) & 7) + '0'); cachec((c & 7) + '0'); break; } } } if (n == 1) cachec('\''); else cachec('"'); cachec(NUL); bp = lookup(cache); bp->class = TERM; if (n == 1 && bp->value == UNDEFINED) bp->value = *(unsigned char *)s; FREE(s); return (bp); } int is_reserved(name) char *name; { char *s; if (strcmp(name, ".") == 0 || strcmp(name, "$accept") == 0 || strcmp(name, "$end") == 0) return (1); if (name[0] == '$' && name[1] == '$' && isdigit(name[2])) { s = name + 3; while (isdigit(*s)) ++s; if (*s == NUL) return (1); } return (0); } bucket * get_name() { register int c; cinc = 0; for (c = *cptr; IS_IDENT(c); c = *++cptr) cachec(c); cachec(NUL); if (is_reserved(cache)) used_reserved(cache); return (lookup(cache)); } int get_number() { register int c; register int n; n = 0; for (c = *cptr; isdigit(c); c = *++cptr) n = 10*n + (c - '0'); return (n); } char * get_tag() { register int c; register int i; register char *s; int t_lineno = lineno; char *t_line = dup_line(); char *t_cptr = t_line + (cptr - line); ++cptr; c = nextc(); if (c == EOF) unexpected_EOF(); if (!isalpha(c) && c != '_' && c != '$') illegal_tag(t_lineno, t_line, t_cptr); cinc = 0; do { cachec(c); c = *++cptr; } while (IS_IDENT(c)); cachec(NUL); c = nextc(); if (c == EOF) unexpected_EOF(); if (c != '>') illegal_tag(t_lineno, t_line, t_cptr); ++cptr; for (i = 0; i < ntags; ++i) { if (strcmp(cache, tag_table[i]) == 0) return (tag_table[i]); } if (ntags >= tagmax) { tagmax += 16; tag_table = (char **) (tag_table ? REALLOC(tag_table, tagmax*sizeof(char *)) : MALLOC(tagmax*sizeof(char *))); if (tag_table == 0) no_space(); } s = MALLOC(cinc); if (s == 0) no_space(); strcpy(s, cache); tag_table[ntags] = s; ++ntags; FREE(t_line); return (s); } declare_tokens(assoc) int assoc; { register int c; register bucket *bp; int value; char *tag = 0; if (assoc != TOKEN) ++prec; c = nextc(); if (c == EOF) unexpected_EOF(); if (c == '<') { tag = get_tag(); c = nextc(); if (c == EOF) unexpected_EOF(); } for (;;) { if (isalpha(c) || c == '_' || c == '.' || c == '$') bp = get_name(); else if (c == '\'' || c == '"') bp = get_literal(); else return; if (bp == goal) tokenized_start(bp->name); bp->class = TERM; if (tag) { if (bp->tag && tag != bp->tag) retyped_warning(bp->name); bp->tag = tag; } if (assoc != TOKEN) { if (bp->prec && prec != bp->prec) reprec_warning(bp->name); bp->assoc = assoc; bp->prec = prec; } c = nextc(); if (c == EOF) unexpected_EOF(); value = UNDEFINED; if (isdigit(c)) { value = get_number(); if (bp->value != UNDEFINED && value != bp->value) revalued_warning(bp->name); bp->value = value; c = nextc(); if (c == EOF) unexpected_EOF(); } } } declare_types() { register int c; register bucket *bp; char *tag; c = nextc(); if (c == EOF) unexpected_EOF(); if (c != '<') syntax_error(lineno, line, cptr); tag = get_tag(); for (;;) { c = nextc(); if (isalpha(c) || c == '_' || c == '.' || c == '$') bp = get_name(); else if (c == '\'' || c == '"') bp = get_literal(); else return; if (bp->tag && tag != bp->tag) retyped_warning(bp->name); bp->tag = tag; } } declare_start() { register int c; register bucket *bp; c = nextc(); if (c == EOF) unexpected_EOF(); if (!isalpha(c) && c != '_' && c != '.' && c != '$') syntax_error(lineno, line, cptr); bp = get_name(); if (bp->class == TERM) terminal_start(bp->name); if (goal && goal != bp) restarted_warning(); goal = bp; } read_declarations() { register int c, k; cache_size = 256; cache = MALLOC(cache_size); if (cache == 0) no_space(); for (;;) { c = nextc(); if (c == EOF) unexpected_EOF(); if (c != '%') syntax_error(lineno, line, cptr); switch (k = keyword()) { case MARK: return; case IDENT: copy_ident(); break; case TEXT: copy_text(); break; case UNION: copy_union(); break; case TOKEN: case LEFT: case RIGHT: case NONASSOC: declare_tokens(k); break; case TYPE: declare_types(); break; case START: declare_start(); break; } } } initialize_grammar() { nitems = 4; maxitems = 300; pitem = (bucket **) MALLOC(maxitems*sizeof(bucket *)); if (pitem == 0) no_space(); pitem[0] = 0; pitem[1] = 0; pitem[2] = 0; pitem[3] = 0; nrules = 3; maxrules = 100; plhs = (bucket **) MALLOC(maxrules*sizeof(bucket *)); if (plhs == 0) no_space(); plhs[0] = 0; plhs[1] = 0; plhs[2] = 0; rprec = (short *) MALLOC(maxrules*sizeof(short)); if (rprec == 0) no_space(); rprec[0] = 0; rprec[1] = 0; rprec[2] = 0; rassoc = (char *) MALLOC(maxrules*sizeof(char)); if (rassoc == 0) no_space(); rassoc[0] = TOKEN; rassoc[1] = TOKEN; rassoc[2] = TOKEN; } expand_items() { maxitems += 300; pitem = (bucket **) REALLOC(pitem, maxitems*sizeof(bucket *)); if (pitem == 0) no_space(); } expand_rules() { maxrules += 100; plhs = (bucket **) REALLOC(plhs, maxrules*sizeof(bucket *)); if (plhs == 0) no_space(); rprec = (short *) REALLOC(rprec, maxrules*sizeof(short)); if (rprec == 0) no_space(); rassoc = (char *) REALLOC(rassoc, maxrules*sizeof(char)); if (rassoc == 0) no_space(); } advance_to_start() { register int c; register bucket *bp; char *s_cptr; int s_lineno; for (;;) { c = nextc(); if (c != '%') break; s_cptr = cptr; switch (keyword()) { case MARK: no_grammar(); case TEXT: copy_text(); break; case START: declare_start(); break; default: syntax_error(lineno, line, s_cptr); } } c = nextc(); if (!isalpha(c) && c != '_' && c != '.' && c != '_') syntax_error(lineno, line, cptr); bp = get_name(); if (goal == 0) { if (bp->class == TERM) terminal_start(bp->name); goal = bp; } s_lineno = lineno; c = nextc(); if (c == EOF) unexpected_EOF(); if (c != ':') syntax_error(lineno, line, cptr); start_rule(bp, s_lineno); ++cptr; } start_rule(bp, s_lineno) register bucket *bp; int s_lineno; { if (bp->class == TERM) terminal_lhs(s_lineno); bp->class = NONTERM; if (nrules >= maxrules) expand_rules(); plhs[nrules] = bp; rprec[nrules] = UNDEFINED; rassoc[nrules] = TOKEN; } end_rule() { register int i; if (!last_was_action && plhs[nrules]->tag) { for (i = nitems - 1; pitem[i]; --i) continue; if (pitem[i+1] == 0 || pitem[i+1]->tag != plhs[nrules]->tag) default_action_warning(); } last_was_action = 0; if (nitems >= maxitems) expand_items(); pitem[nitems] = 0; ++nitems; ++nrules; } insert_empty_rule() { register bucket *bp, **bpp; assert(cache); sprintf(cache, "$$%d", ++gensym); bp = make_bucket(cache); last_symbol->next = bp; last_symbol = bp; bp->tag = plhs[nrules]->tag; bp->class = NONTERM; if ((nitems += 2) > maxitems) expand_items(); bpp = pitem + nitems - 1; *bpp-- = bp; while (bpp[0] = bpp[-1]) --bpp; if (++nrules >= maxrules) expand_rules(); plhs[nrules] = plhs[nrules-1]; plhs[nrules-1] = bp; rprec[nrules] = rprec[nrules-1]; rprec[nrules-1] = 0; rassoc[nrules] = rassoc[nrules-1]; rassoc[nrules-1] = TOKEN; } add_symbol() { register int c; register bucket *bp; int s_lineno = lineno; c = *cptr; if (c == '\'' || c == '"') bp = get_literal(); else bp = get_name(); c = nextc(); if (c == ':') { end_rule(); start_rule(bp, s_lineno); ++cptr; return; } if (last_was_action) insert_empty_rule(); last_was_action = 0; if (++nitems > maxitems) expand_items(); pitem[nitems-1] = bp; } copy_action() { register int c; register int i, n; int depth; int quote; char *tag; register FILE *f = action_file; int a_lineno = lineno; char *a_line = dup_line(); char *a_cptr = a_line + (cptr - line); if (last_was_action) insert_empty_rule(); last_was_action = 1; fprintf(f, "case %d:\n", nrules - 2); if (!lflag) fprintf(f, line_format, lineno, input_file_name); if (*cptr == '=') ++cptr; n = 0; for (i = nitems - 1; pitem[i]; --i) ++n; depth = 0; loop: c = *cptr; if (c == '$') { if (cptr[1] == '<') { int d_lineno = lineno; char *d_line = dup_line(); char *d_cptr = d_line + (cptr - line); ++cptr; tag = get_tag(); c = *cptr; if (c == '$') { fprintf(f, "yyval.%s", tag); ++cptr; FREE(d_line); goto loop; } else if (isdigit(c)) { i = get_number(); if (i > n) dollar_warning(d_lineno, i); fprintf(f, "yyvsp[%d].%s", i - n, tag); FREE(d_line); goto loop; } else if (c == '-' && isdigit(cptr[1])) { ++cptr; i = -get_number() - n; fprintf(f, "yyvsp[%d].%s", i, tag); FREE(d_line); goto loop; } else dollar_error(d_lineno, d_line, d_cptr); } else if (cptr[1] == '$') { if (ntags) { tag = plhs[nrules]->tag; if (tag == 0) untyped_lhs(); fprintf(f, "yyval.%s", tag); } else fprintf(f, "yyval"); cptr += 2; goto loop; } else if (isdigit(cptr[1])) { ++cptr; i = get_number(); if (ntags) { if (i <= 0 || i > n) unknown_rhs(i); tag = pitem[nitems + i - n - 1]->tag; if (tag == 0) untyped_rhs(i, pitem[nitems + i - n - 1]->name); fprintf(f, "yyvsp[%d].%s", i - n, tag); } else { if (i > n) dollar_warning(lineno, i); fprintf(f, "yyvsp[%d]", i - n); } goto loop; } else if (cptr[1] == '-') { cptr += 2; i = get_number(); if (ntags) unknown_rhs(-i); fprintf(f, "yyvsp[%d]", -i - n); goto loop; } } if (isalpha(c) || c == '_' || c == '$') { do { putc(c, f); c = *++cptr; } while (isalnum(c) || c == '_' || c == '$'); goto loop; } putc(c, f); ++cptr; switch (c) { case '\n': next_line: get_line(); if (line) goto loop; unterminated_action(a_lineno, a_line, a_cptr); case ';': if (depth > 0) goto loop; fprintf(f, "\nbreak;\n"); return; case '{': ++depth; goto loop; case '}': if (--depth > 0) goto loop; fprintf(f, "\nbreak;\n"); return; case '\'': case '"': { int s_lineno = lineno; char *s_line = dup_line(); char *s_cptr = s_line + (cptr - line - 1); quote = c; for (;;) { c = *cptr++; putc(c, f); if (c == quote) { FREE(s_line); goto loop; } if (c == '\n') unterminated_string(s_lineno, s_line, s_cptr); if (c == '\\') { c = *cptr++; putc(c, f); if (c == '\n') { get_line(); if (line == 0) unterminated_string(s_lineno, s_line, s_cptr); } } } } case '/': c = *cptr; if (c == '/') { putc('*', f); while ((c = *++cptr) != '\n') { if (c == '*' && cptr[1] == '/') fprintf(f, "* "); else putc(c, f); } fprintf(f, "*/\n"); goto next_line; } if (c == '*') { int c_lineno = lineno; char *c_line = dup_line(); char *c_cptr = c_line + (cptr - line - 1); putc('*', f); ++cptr; for (;;) { c = *cptr++; putc(c, f); if (c == '*' && *cptr == '/') { putc('/', f); ++cptr; FREE(c_line); goto loop; } if (c == '\n') { get_line(); if (line == 0) unterminated_comment(c_lineno, c_line, c_cptr); } } } goto loop; default: goto loop; } } int mark_symbol() { register int c; register bucket *bp; c = cptr[1]; if (c == '%' || c == '\\') { cptr += 2; return (1); } if (c == '=') cptr += 2; else if ((c == 'p' || c == 'P') && ((c = cptr[2]) == 'r' || c == 'R') && ((c = cptr[3]) == 'e' || c == 'E') && ((c = cptr[4]) == 'c' || c == 'C') && ((c = cptr[5], !IS_IDENT(c)))) cptr += 5; else syntax_error(lineno, line, cptr); c = nextc(); if (isalpha(c) || c == '_' || c == '.' || c == '$') bp = get_name(); else if (c == '\'' || c == '"') bp = get_literal(); else { syntax_error(lineno, line, cptr); /*NOTREACHED*/ } if (rprec[nrules] != UNDEFINED && bp->prec != rprec[nrules]) prec_redeclared(); rprec[nrules] = bp->prec; rassoc[nrules] = bp->assoc; return (0); } read_grammar() { register int c; initialize_grammar(); advance_to_start(); for (;;) { c = nextc(); if (c == EOF) break; if (isalpha(c) || c == '_' || c == '.' || c == '$' || c == '\'' || c == '"') add_symbol(); else if (c == '{' || c == '=') copy_action(); else if (c == '|') { end_rule(); start_rule(plhs[nrules-1], 0); ++cptr; } else if (c == '%') { if (mark_symbol()) break; } else syntax_error(lineno, line, cptr); } end_rule(); } free_tags() { register int i; if (tag_table == 0) return; for (i = 0; i < ntags; ++i) { assert(tag_table[i]); FREE(tag_table[i]); } FREE(tag_table); } pack_names() { register bucket *bp; register char *p, *s, *t; name_pool_size = 13; /* 13 == sizeof("$end") + sizeof("$accept") */ for (bp = first_symbol; bp; bp = bp->next) name_pool_size += strlen(bp->name) + 1; name_pool = MALLOC(name_pool_size); if (name_pool == 0) no_space(); strcpy(name_pool, "$accept"); strcpy(name_pool+8, "$end"); t = name_pool + 13; for (bp = first_symbol; bp; bp = bp->next) { p = t; s = bp->name; while (*t++ = *s++) continue; FREE(bp->name); bp->name = p; } } check_symbols() { register bucket *bp; if (goal->class == UNKNOWN) undefined_goal(goal->name); for (bp = first_symbol; bp; bp = bp->next) { if (bp->class == UNKNOWN) { undefined_symbol_warning(bp->name); bp->class = TERM; } } } pack_symbols() { register bucket *bp; register bucket **v; register int i, j, k, n; nsyms = 2; ntokens = 1; for (bp = first_symbol; bp; bp = bp->next) { ++nsyms; if (bp->class == TERM) ++ntokens; } start_symbol = ntokens; nvars = nsyms - ntokens; symbol_name = (char **) MALLOC(nsyms*sizeof(char *)); if (symbol_name == 0) no_space(); symbol_value = (short *) MALLOC(nsyms*sizeof(short)); if (symbol_value == 0) no_space(); symbol_prec = (short *) MALLOC(nsyms*sizeof(short)); if (symbol_prec == 0) no_space(); symbol_assoc = MALLOC(nsyms); if (symbol_assoc == 0) no_space(); v = (bucket **) MALLOC(nsyms*sizeof(bucket *)); if (v == 0) no_space(); v[0] = 0; v[start_symbol] = 0; i = 1; j = start_symbol + 1; for (bp = first_symbol; bp; bp = bp->next) { if (bp->class == TERM) v[i++] = bp; else v[j++] = bp; } assert(i == ntokens && j == nsyms); for (i = 1; i < ntokens; ++i) v[i]->index = i; goal->index = start_symbol + 1; k = start_symbol + 2; while (++i < nsyms) if (v[i] != goal) { v[i]->index = k; ++k; } goal->value = 0; k = 1; for (i = start_symbol + 1; i < nsyms; ++i) { if (v[i] != goal) { v[i]->value = k; ++k; } } k = 0; for (i = 1; i < ntokens; ++i) { n = v[i]->value; if (n > 256) { for (j = k++; j > 0 && symbol_value[j-1] > n; --j) symbol_value[j] = symbol_value[j-1]; symbol_value[j] = n; } } if (v[1]->value == UNDEFINED) v[1]->value = 256; j = 0; n = 257; for (i = 2; i < ntokens; ++i) { if (v[i]->value == UNDEFINED) { while (j < k && n == symbol_value[j]) { while (++j < k && n == symbol_value[j]) continue; ++n; } v[i]->value = n; ++n; } } symbol_name[0] = name_pool + 8; symbol_value[0] = 0; symbol_prec[0] = 0; symbol_assoc[0] = TOKEN; for (i = 1; i < ntokens; ++i) { symbol_name[i] = v[i]->name; symbol_value[i] = v[i]->value; symbol_prec[i] = v[i]->prec; symbol_assoc[i] = v[i]->assoc; } symbol_name[start_symbol] = name_pool; symbol_value[start_symbol] = -1; symbol_prec[start_symbol] = 0; symbol_assoc[start_symbol] = TOKEN; for (++i; i < nsyms; ++i) { k = v[i]->index; symbol_name[k] = v[i]->name; symbol_value[k] = v[i]->value; symbol_prec[k] = v[i]->prec; symbol_assoc[k] = v[i]->assoc; } FREE(v); } pack_grammar() { register int i, j; int assoc, prec; ritem = (short *) MALLOC(nitems*sizeof(short)); if (ritem == 0) no_space(); rlhs = (short *) MALLOC(nrules*sizeof(short)); if (rlhs == 0) no_space(); rrhs = (short *) MALLOC((nrules+1)*sizeof(short)); if (rrhs == 0) no_space(); rprec = (short *) REALLOC(rprec, nrules*sizeof(short)); if (rprec == 0) no_space(); rassoc = REALLOC(rassoc, nrules); if (rassoc == 0) no_space(); ritem[0] = -1; ritem[1] = goal->index; ritem[2] = 0; ritem[3] = -2; rlhs[0] = 0; rlhs[1] = 0; rlhs[2] = start_symbol; rrhs[0] = 0; rrhs[1] = 0; rrhs[2] = 1; j = 4; for (i = 3; i < nrules; ++i) { rlhs[i] = plhs[i]->index; rrhs[i] = j; assoc = TOKEN; prec = 0; while (pitem[j]) { ritem[j] = pitem[j]->index; if (pitem[j]->class == TERM) { prec = pitem[j]->prec; assoc = pitem[j]->assoc; } ++j; } ritem[j] = -i; ++j; if (rprec[i] == UNDEFINED) { rprec[i] = prec; rassoc[i] = assoc; } } rrhs[i] = j; FREE(plhs); FREE(pitem); } print_grammar() { register int i, j, k; int spacing; register FILE *f = verbose_file; if (!vflag) return; k = 1; for (i = 2; i < nrules; ++i) { if (rlhs[i] != rlhs[i-1]) { if (i != 2) fprintf(f, "\n"); fprintf(f, "%4d %s :", i - 2, symbol_name[rlhs[i]]); spacing = strlen(symbol_name[rlhs[i]]) + 1; } else { fprintf(f, "%4d ", i - 2); j = spacing; while (--j >= 0) putc(' ', f); putc('|', f); } while (ritem[k] >= 0) { fprintf(f, " %s", symbol_name[ritem[k]]); ++k; } ++k; putc('\n', f); } } reader() { write_section(banner); create_symbol_table(); read_declarations(); read_grammar(); free_symbol_table(); free_tags(); pack_names(); check_symbols(); pack_symbols(); pack_grammar(); free_symbols(); print_grammar(); } #include "defs.h" /* The definition of yysccsid in the banner should be replaced with */ /* a #pragma ident directive if the target C compiler supports */ /* #pragma ident directives. */ /* */ /* If the skeleton is changed, the banner should be changed so that */ /* the altered version can be easily distinguished from the original. */ /* */ /* The #defines included with the banner are there because they are */ /* useful in subsequent code. The macros #defined in the header or */ /* the body either are not useful outside of semantic actions or */ /* are conditional. */ char *banner[] = { "#ifndef lint", "static char yysccsid[] = \"@(#)yaccpar 1.9 (Berkeley) 02/21/93\";", "#endif", "#define YYBYACC 1", "#define YYMAJOR 1", "#define YYMINOR 9", "#define yyclearin (yychar=(-1))", "#define yyerrok (yyerrflag=0)", "#define YYRECOVERING (yyerrflag!=0)", 0 }; char *tables[] = { "extern short yylhs[];", "extern short yylen[];", "extern short yydefred[];", "extern short yydgoto[];", "extern short yysindex[];", "extern short yyrindex[];", "extern short yygindex[];", "extern short yytable[];", "extern short yycheck[];", "#if YYDEBUG", "extern char *yyname[];", "extern char *yyrule[];", "#endif", 0 }; char *header[] = { "#ifdef YYSTACKSIZE", "#undef YYMAXDEPTH", "#define YYMAXDEPTH YYSTACKSIZE", "#else", "#ifdef YYMAXDEPTH", "#define YYSTACKSIZE YYMAXDEPTH", "#else", "#define YYSTACKSIZE 500", "#define YYMAXDEPTH 500", "#endif", "#endif", "int yydebug;", "int yynerrs;", "int yyerrflag;", "int yychar;", "short *yyssp;", "YYSTYPE *yyvsp;", "YYSTYPE yyval;", "YYSTYPE yylval;", "short yyss[YYSTACKSIZE];", "YYSTYPE yyvs[YYSTACKSIZE];", "#define yystacksize YYSTACKSIZE", 0 }; char *body[] = { "#define YYABORT goto yyabort", "#define YYREJECT goto yyabort", "#define YYACCEPT goto yyaccept", "#define YYERROR goto yyerrlab", "int", "yyparse()", "{", " register int yym, yyn, yystate;", "#if YYDEBUG", " register char *yys;", " extern char *getenv();", "", " if (yys = getenv(\"YYDEBUG\"))", " {", " yyn = *yys;", " if (yyn >= '0' && yyn <= '9')", " yydebug = yyn - '0';", " }", "#endif", "", " yynerrs = 0;", " yyerrflag = 0;", " yychar = (-1);", "", " yyssp = yyss;", " yyvsp = yyvs;", " *yyssp = yystate = 0;", "", "yyloop:", " if (yyn = yydefred[yystate]) goto yyreduce;", " if (yychar < 0)", " {", " if ((yychar = yylex()) < 0) yychar = 0;", "#if YYDEBUG", " if (yydebug)", " {", " yys = 0;", " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", " if (!yys) yys = \"illegal-symbol\";", " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", " YYPREFIX, yystate, yychar, yys);", " }", "#endif", " }", " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&", " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", " {", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: state %d, shifting to state %d\\n\",", " YYPREFIX, yystate, yytable[yyn]);", "#endif", " if (yyssp >= yyss + yystacksize - 1)", " {", " goto yyoverflow;", " }", " *++yyssp = yystate = yytable[yyn];", " *++yyvsp = yylval;", " yychar = (-1);", " if (yyerrflag > 0) --yyerrflag;", " goto yyloop;", " }", " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&", " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", " {", " yyn = yytable[yyn];", " goto yyreduce;", " }", " if (yyerrflag) goto yyinrecovery;", "#ifdef lint", " goto yynewerror;", "#endif", "yynewerror:", " yyerror(\"syntax error\");", "#ifdef lint", " goto yyerrlab;", "#endif", "yyerrlab:", " ++yynerrs;", "yyinrecovery:", " if (yyerrflag < 3)", " {", " yyerrflag = 3;", " for (;;)", " {", " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&", " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)", " {", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: state %d, error recovery shifting\\", " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);", "#endif", " if (yyssp >= yyss + yystacksize - 1)", " {", " goto yyoverflow;", " }", " *++yyssp = yystate = yytable[yyn];", " *++yyvsp = yylval;", " goto yyloop;", " }", " else", " {", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: error recovery discarding state %d\ \\n\",", " YYPREFIX, *yyssp);", "#endif", " if (yyssp <= yyss) goto yyabort;", " --yyssp;", " --yyvsp;", " }", " }", " }", " else", " {", " if (yychar == 0) goto yyabort;", "#if YYDEBUG", " if (yydebug)", " {", " yys = 0;", " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", " if (!yys) yys = \"illegal-symbol\";", " printf(\"%sdebug: state %d, error recovery discards token %d\ (%s)\\n\",", " YYPREFIX, yystate, yychar, yys);", " }", "#endif", " yychar = (-1);", " goto yyloop;", " }", "yyreduce:", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",", " YYPREFIX, yystate, yyn, yyrule[yyn]);", "#endif", " yym = yylen[yyn];", " yyval = yyvsp[1-yym];", " switch (yyn)", " {", 0 }; char *trailer[] = { " }", " yyssp -= yym;", " yystate = *yyssp;", " yyvsp -= yym;", " yym = yylhs[yyn];", " if (yystate == 0 && yym == 0)", " {", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: after reduction, shifting from state 0 to\\", " state %d\\n\", YYPREFIX, YYFINAL);", "#endif", " yystate = YYFINAL;", " *++yyssp = YYFINAL;", " *++yyvsp = yyval;", " if (yychar < 0)", " {", " if ((yychar = yylex()) < 0) yychar = 0;", "#if YYDEBUG", " if (yydebug)", " {", " yys = 0;", " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", " if (!yys) yys = \"illegal-symbol\";", " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", " YYPREFIX, YYFINAL, yychar, yys);", " }", "#endif", " }", " if (yychar == 0) goto yyaccept;", " goto yyloop;", " }", " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&", " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)", " yystate = yytable[yyn];", " else", " yystate = yydgoto[yym];", "#if YYDEBUG", " if (yydebug)", " printf(\"%sdebug: after reduction, shifting from state %d \\", "to state %d\\n\", YYPREFIX, *yyssp, yystate);", "#endif", " if (yyssp >= yyss + yystacksize - 1)", " {", " goto yyoverflow;", " }", " *++yyssp = yystate;", " *++yyvsp = yyval;", " goto yyloop;", "yyoverflow:", " yyerr?<A<or(\"yacc stack overflow\");", "yyabort:", " return (1);", "yyaccept:", " return (0);", "}", 0 }; write_section(section) char *section[]; { register int c; register int i; register char *s; register FILE *f; f = code_file; for (i = 0; s = section[i]; ++i) { ++outline; while (c = *s) { putc(c, f); ++s; } putc('\n', f); } } #include "defs.h" /* TABLE_SIZE is the number of entries in the symbol table. */ /* TABLE_SIZE must be a power of two. */ #define TABLE_SIZE 1024 bucket **symbol_table; bucket *first_symbol; bucket *last_symbol; int hash(name) char *name; { register char *s; register int c, k; assert(name && *name); s = name; k = *s; while (c = *++s) k = (31*k + c) & (TABLE_SIZE - 1); return (k); } bucket * make_bucket(name) char *name; { register bucket *bp; assert(name); bp = (bucket *) MALLOC(sizeof(bucket)); if (bp == 0) no_space(); bp->link = 0; bp->next = 0; bp->name = MALLOC(strlen(name) + 1); if (bp->name == 0) no_space(); bp->tag = 0; bp->value = UNDEFINED; bp->index = 0; bp->prec = 0; bp-> class = UNKNOWN; bp->assoc = TOKEN; if (bp->name == 0) no_space(); strcpy(bp->name, name); return (bp); } bucket * lookup(name) char *name; { register bucket *bp, **bpp; bpp = symbol_table + hash(name); bp = *bpp; while (bp) { if (strcmp(name, bp->name) == 0) return (bp); bpp = &bp->link; bp = *bpp; } *bpp = bp = make_bucket(name); last_symbol->next = bp; last_symbol = bp; return (bp); } create_symbol_table() { register int i; register bucket *bp; symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *)); if (symbol_table == 0) no_space(); for (i = 0; i < TABLE_SIZE; i++) symbol_table[i] = 0; bp = make_bucket("error"); bp->index = 1; bp->class = TERM; first_symbol = bp; last_symbol = bp; symbol_table[hash("error")] = bp; } free_symbol_table() { FREE(symbol_table); symbol_table = 0; } free_symbols() { register bucket *p, *q; for (p = first_symbol; p; p = q) { q = p->next; FREE(p); } } #include "defs.h" static short *null_rules; verbose() { register int i; if (!vflag) return; null_rules = (short *) MALLOC(nrules*sizeof(short)); if (null_rules == 0) no_space(); fprintf(verbose_file, "\f\n"); for (i = 0; i < nstates; i++) print_state(i); FREE(null_rules); if (nunused) log_unused(); if (SRtotal || RRtotal) log_conflicts(); fprintf(verbose_file, "\n\n%d terminals, %d nonterminals\n", ntokens, nvars); fprintf(verbose_file, "%d grammar rules, %d states\n", nrules - 2, nstates); } log_unused() { register int i; register short *p; fprintf(verbose_file, "\n\nRules never reduced:\n"); for (i = 3; i < nrules; ++i) { if (!rules_used[i]) { fprintf(verbose_file, "\t%s :", symbol_name[rlhs[i]]); for (p = ritem + rrhs[i]; *p >= 0; ++p) fprintf(verbose_file, " %s", symbol_name[*p]); fprintf(verbose_file, " (%d)\n", i - 2); } } } log_conflicts() { register int i; fprintf(verbose_file, "\n\n"); for (i = 0; i < nstates; i++) { if (SRconflicts[i] || RRconflicts[i]) { fprintf(verbose_file, "State %d contains ", i); if (SRconflicts[i] == 1) fprintf(verbose_file, "1 shift/reduce conflict"); else if (SRconflicts[i] > 1) fprintf(verbose_file, "%d shift/reduce conflicts", SRconflicts[i]); if (SRconflicts[i] && RRconflicts[i]) fprintf(verbose_file, ", "); if (RRconflicts[i] == 1) fprintf(verbose_file, "1 reduce/reduce conflict"); else if (RRconflicts[i] > 1) fprintf(verbose_file, "%d reduce/reduce conflicts", RRconflicts[i]); fprintf(verbose_file, ".\n"); } } } print_state(state) int state; { if (state) fprintf(verbose_file, "\n\n"); if (SRconflicts[state] || RRconflicts[state]) print_conflicts(state); fprintf(verbose_file, "state %d\n", state); print_core(state); print_nulls(state); print_actions(state); } print_conflicts(state) int state; { register int symbol, act, number; register action *p; symbol = -1; for (p = parser[state]; p; p = p->next) { if (p->suppressed == 2) continue; if (p->symbol != symbol) { symbol = p->symbol; number = p->number; if (p->action_code == SHIFT) act = SHIFT; else act = REDUCE; } else if (p->suppressed == 1) { if (state == final_state && symbol == 0) { fprintf(verbose_file, "%d: shift/reduce conflict \ (accept, reduce %d) on $end\n", state, p->number - 2); } else { if (act == SHIFT) { fprintf(verbose_file, "%d: shift/reduce conflict \ (shift %d, reduce %d) on %s\n", state, number, p->number - 2, symbol_name[symbol]); } else { fprintf(verbose_file, "%d: reduce/reduce conflict \ (reduce %d, reduce %d) on %s\n", state, number - 2, p->number - 2, symbol_name[symbol]); } } } } } print_core(state) int state; { register int i; register int k; register int rule; register core *statep; register short *sp; register short *sp1; statep = state_table[state]; k = statep->nitems; for (i = 0; i < k; i++) { sp1 = sp = ritem + statep->items[i]; while (*sp >= 0) ++sp; rule = -(*sp); fprintf(verbose_file, "\t%s : ", symbol_name[rlhs[rule]]); for (sp = ritem + rrhs[rule]; sp < sp1; sp++) fprintf(verbose_file, "%s ", symbol_name[*sp]); putc('.', verbose_file); while (*sp >= 0) { fprintf(verbose_file, " %s", symbol_name[*sp]); sp++; } fprintf(verbose_file, " (%d)\n", -2 - *sp); } } print_nulls(state) int state; { register action *p; register int i, j, k, nnulls; nnulls = 0; for (p = parser[state]; p; p = p->next) { if (p->action_code == REDUCE && (p->suppressed == 0 || p->suppressed == 1)) { i = p->number; if (rrhs[i] + 1 == rrhs[i+1]) { for (j = 0; j < nnulls && i > null_rules[j]; ++j) continue; if (j == nnulls) { ++nnulls; null_rules[j] = i; } else if (i != null_rules[j]) { ++nnulls; for (k = nnulls - 1; k > j; --k) null_rules[k] = null_rules[k-1]; null_rules[j] = i; } } } } for (i = 0; i < nnulls; ++i) { j = null_rules[i]; fprintf(verbose_file, "\t%s : . (%d)\n", symbol_name[rlhs[j]], j - 2); } fprintf(verbose_file, "\n"); } print_actions(stateno) int stateno; { register action *p; register shifts *sp; register int as; if (stateno == final_state) fprintf(verbose_file, "\t$end accept\n"); p = parser[stateno]; if (p) { print_shifts(p); print_reductions(p, defred[stateno]); } sp = shift_table[stateno]; if (sp && sp->nshifts > 0) { as = accessing_symbol[sp->shift[sp->nshifts - 1]]; if (ISVAR(as)) print_gotos(stateno); } } print_shifts(p) register action *p; { register int count; register action *q; count = 0; for (q = p; q; q = q->next) { if (q->suppressed < 2 && q->action_code == SHIFT) ++count; } if (count > 0) { for (; p; p = p->next) { if (p->action_code == SHIFT && p->suppressed == 0) fprintf(verbose_file, "\t%s shift %d\n", symbol_name[p->symbol], p->number); } } } print_reductions(p, defred) register action *p; register int defred; { register int k, anyreds; register action *q; anyreds = 0; for (q = p; q ; q = q->next) { if (q->action_code == REDUCE && q->suppressed < 2) { anyreds = 1; break; } } if (anyreds == 0) fprintf(verbose_file, "\t. error\n"); else { for (; p; p = p->next) { if (p->action_code == REDUCE && p->number != defred) { k = p->number - 2; if (p->suppressed == 0) fprintf(verbose_file, "\t%s reduce %d\n", symbol_name[p->symbol], k); } } if (defred > 0) fprintf(verbose_file, "\t. reduce %d\n", defred - 2); } } print_gotos(stateno) int stateno; { register int i, k; register int as; register short *to_state; register shifts *sp; putc('\n', verbose_file); sp = shift_table[stateno]; to_state = sp->shift; for (i = 0; i < sp->nshifts; ++i) { k = to_state[i]; as = accessing_symbol[k]; if (ISVAR(as)) fprintf(verbose_file, "\t%s goto %d\n", symbol_name[as], k); } } #include "defs.h" transitive_closure(R, n) unsigned *R; int n; { register int rowsize; register unsigned i; register unsigned *rowj; register unsigned *rp; register unsigned *rend; register unsigned *ccol; register unsigned *relend; register unsigned *cword; register unsigned *rowi; rowsize = WORDSIZE(n); relend = R + n*rowsize; cword = R; i = 0; rowi = R; while (rowi < relend) { ccol = cword; rowj = R; while (rowj < relend) { if (*ccol & (1 << i)) { rp = rowi; rend = rowj + rowsize; while (rowj < rend) *rowj++ |= *rp++; } else { rowj += rowsize; } ccol += rowsize; } if (++i >= BITS_PER_WORD) { i = 0; cword++; } rowi += rowsize; } } reflexive_transitive_closure(R, n) unsigned *R; int n; { register int rowsize; register unsigned i; register unsigned *rp; register unsigned *relend; transitive_closure(R, n); rowsize = WORDSIZE(n); relend = R + n*rowsize; i = 0; rp = R; while (rp < relend) { *rp |= (1 << i); if (++i >= BITS_PER_WORD) { i = 0; rp++; } rp += rowsize; } }  ... Makefile README ansi.h bsfilt.c cawf.c cawf.h cawflib.h common device.c device.cf diffs dumb.dev error.c expand.c expr.c getopt.c macsup.c man.mac me.mac mnx.mac ms.mac nreq.c output.c pass2.c pass3.c proto.h! regerror.c" regexp.c# regexp.h$ regmagic.h% store.c& string.c# Makefile for cawf # Define UNIX for vanilla Unix systems -- e.g., older DYNIX. # # Define UNIX and USG for System V, BSD 4.3 and for SunOS. # # USG may also be needed if the required string function prototypes -- # e.g., for strrchr() -- are in rather than . # #DEFS = -DUNIX -DUSG # # Define STDLIB for systems that have -- e.g., AIX and # SunOS. # # Redefine CAWFLIB by adding -DCAWFLIB=\"...\" to DEFS. # #DEFS = -DUNIX -DUSG -DCAWFLIB=\"/usr/local/lib/cawf\" # # Customize the install rule. # # -ansi and -pedantic are ANSI compliance options for the gcc compiler. # Remove them if your compiler objects. # # If you're using xlc 2.1 on AIX 3.2 for the RISC/SYSTEM 6000, you # must delete the definition of __STR__ (two leading and two trailing # underscore characters), because the xlc 2.1 compiler incorrectly # inlines string functions when compiling pass3.c. # #DEFS = -DUNIX -DSTDLIB -U__STR__ # # Unix systems that have a need MALLOCH defined, unless # they also have a that provides a function prototype for # malloc() and its relatives (most do). # #DEFS = -DUNIX -DMALLOCH DEFS = -DUNIX -DUSG -DSTDLIB CFLAGS = -i -f -wo -O ${DEFS} HDR = ansi.h cawf.h cawflib.h proto.h regexp.h regmagic.h SRC = cawf.c device.c error.c expand.c expr.c getopt.c macsup.c nreq.c \ output.c pass2.c pass3.c regerror.c regexp.c store.c string.c OBJ = cawf.o device.o error.o expand.o expr.o getopt.o macsup.o nreq.o \ output.o pass2.o pass3.o regerror.o regexp.o store.o string.o all: bsfilt cawf bsfilt: bsfilt.c ${CC} ${CFLAGS} bsfilt.c -o $@ install -S 4kw $@ cawf: ${OBJ} ${CC} ${CFLAGS} ${OBJ} -o $@ install -S 56k $@ clean: rm -f *.o a.out core *errs bsfilt cawf ${OBJ}: ${HDR} install: \ /usr/bin/bsfilt /usr/bin/colcrt /usr/bin/cawf \ /usr/bin/nroff /usr/lib/cawf /usr/lib/cawf/common \ /usr/lib/cawf/device.cf /usr/lib/cawf/dumb.dev \ /usr/lib/cawf/man.mac /usr/lib/cawf/me.mac \ /usr/lib/cawf/ms.mac /usr/lib/cawf/mnx.mac /usr/bin/bsfilt: bsfilt install -cs -o bin bsfilt $@ /usr/bin/colcrt: /usr/bin/bsfilt install -l /usr/bin/bsfilt $@ /usr/bin/cawf: cawf install -cs -o bin cawf $@ /usr/bin/nroff: /usr/bin/cawf install -l /usr/bin/cawf $@ /usr/lib/cawf: install -d -o bin /usr/lib/cawf /usr/lib/cawf/common: common install -c -o bin common $@ /usr/lib/cawf/device.cf: device.cf install -c -o bin device.cf $@ /usr/lib/cawf/dumb.dev: dumb.dev install -c -o bin dumb.dev $@ /usr/lib/cawf/man.mac: man.mac install -c -o bin man.mac $@ /usr/lib/cawf/me.mac: me.mac install -c -o bin me.mac $@ /usr/lib/cawf/ms.mac: ms.mac install -c -o bin ms.mac $@ /usr/lib/cawf/mnx.mac: mnx.mac install -c -o bin mnx.mac $@ Cawf - nroff-like text formatter Cawf is a C version of awf, Henry Spencer's Amazingly Workable (text) Formatter. (Awf is written in awk and appears in comp.sources.unix, Volume 23, Issue 27.) Cawf and awf provide a usable subset of raw nroff capabilities and the styles of the man(7), me(7) and ms(7) macro sets. One of cawf's virtues is that it will run on PC clones under MS-DOS. It is also, like awf, totally independent of any licensed Unix source code. This distribution contains complete source, make files for Unix and MS-DOS, documentation (raw and formatted) and MS-DOS executables for cawf and a companion output filters, bsfilt. This is the fourth distribution of cawf. Changes include: * Some rudimentary output device support has been added, via a device configuration file. * The code has been converted to use unsigned characters. * An attempt has been made to make the code ANSI C compliant. * The following bugs have been fixed: A bug in the locating of the device file has been corrected, so that the code performs as documented. Null macro arguments are ignored. Some unused arguments to local functions have been more carefully type cast to avoid portability problems. * The .fl and .rn requests are now supported. * Limited support has been added for the non-break request control character, the acute accent ('). * Argument count conditionals -- operating on \n(.$ -- may now use the >= and <= operators in addition to [<=>]. * Macros may be terminated with "..", ".", "''" or "'". * String interpolation is performed if it is specified at the start of the .ds request argument. * The .tr request has been enhanced to handle named characters and string interpolation. * The SS macro is now included in man.mac. * The cawf version number is now displayed in the help output. * A limited -me macro set is included in me.mac. Changes to cawf to run under Minix: * The DOS binaries and make files have been removed. * Tabs stops changed from per 5 to per 8. * Bold and underline as it should be in device.cf. * Added .SB and .TA to man.mac. * Numerous prototypes added. CONTENTS -------- This Minix distribution of cawf includes: README this file *.c and *.h source files to build cawf and bsfilt (bsfilt removes Backspaces from cawf output) bsfilt.1 nroff source for the bsfilt manual page cawf.1 nroff source for the cawf manual page common initialization file for CAWFLIB library device.cf output device configuration file for CAWFLIB library dumb.dev device description file for CAWFLIB library Makefile Unix-style make file man.mac man(7) macros for CAWFLIB library me.mac me(7) macros for CAWFLIB library ms.mac ms(7) macros for CAWFLIB library diffs Minix patches #ifdef PUTTING_IT_ON_THE_NET cawf bsfilt binaries compiled under Minix-PC 1.5 using the ACK ANSI C compiler using software floating point #endif LIBRARY ------- To use cawf, you must select a location for the CAWFLIB library files. The distributed cawf binary expects to find them in /usr/local/lib/cawf but you can alter that with the CAWFLIB environment variable, or you can change the CAWFLIB #define in cawf.h and rebuild cawf from the sources. CAWFLIB contains a minimum of six files: common common raw nroff commands to get cawf started dumb.dev a set of character definitions for a plain, "dumb" ASCII device - e. g., the console display, a CRT or a basic line printer device.cf the output device configuration file man.mac the man(7) macros me.mac the me(7) macros ms.mac the ms(7) macros You may want to add your own macro files to the library. Just name them "m[your-name].mac", following the usual nroff naming convention for macro files. If you have fancy output devices with special character specifications, you may want to generate new *.dev files for them. Follow the format of dumb.dev in making new character specifications. To define characters for a new device, select a name prefix for it and create a file in CAWFLIB with the name ".dev". To use the new file, set the TERM environment variable to - e. g., when I test cawf on Unix, I need a vt100.dev, because my TERM environment variable value is usually vt100. All I do is make vt100.dev a symbolic link to dumb.dev. Even that isn't even necessary, because cawf will use dumb.dev if it can't find TERM.dev. In addition to the character specifications possible through the *.dev files, cawf provides one-time font selection and bold or italic face support for output devices via its -d and -f options. Cawf can be directed to issue specific device codes for bold and italic characters, and one font can be specified for the entire document. Cawf has some built-in output device support, and addition support is contained in the device configuration file, device.cf. Additional devices may be defined in device.cf. It is not necessary to generate a new *.dev file for each output device definition. Only when you need special character definitions do you need to create a *.dev file. The dumb.dev file is adequate for most devices you define in device.cf. SOURCES ------- The Unix make file has some definitions that help tune it to the local Unix environment: CAWFLIB is a string that can be used in lieu of changes to cawf.h's CWFLIB #define. MALLOCH is a string that should be defined when a UNIX environment has a , unless it also has a with protoypes for malloc() and its relatives. In the latter case, you should define STDLIB, but you don't need to define MALLOCH. STDLIB indicates that standard library function prototype definitions may be found in . STDLIB must be defined for MS-DOS Quick C. If STDLIB is not defined, the cawf sources try to define their own library function return values. __STR__ The definition of this string must be deleted when using the xlc 1.2 compiler on the RISC/System 6000 under AIX 3.2. Put -U__STR__ in the Makefile DEFS string. This must be done because the xlc 1.2 compiler does not correctly inline string functions when compiling pass3.c. UNIX switches the build environment to Unix. You may also have to decide about MALLOCH, STDLIB, __STR__ and USG when you define UNIX. Do not define UNIX for MS-DOS Quick-C; do define STDLIB. USG adjusts for System V. (UNIX must also be defined.) You may also need to define USG to select the proper header file for string function prototypes. If UNIX and USG are defined, "proto.h" selects ; if only UNIX, . Cawf needs the more complete set of definitions, including strchr() and strrchr(). If #includes , as is sometimes the case, define only UNIX. I have built and tested cawf in the UNIX context under AIX 3.2 (see the note above on __STR__), BSD4.3-Tahoe, Sequent DYNIX, ETAV (SYSV 3.0), NeXTStep 3.0, SunOS 4.1.1 and Ultrix 2.2. If you build under another Unix variant, you may have to adjust the source code, header files and Makefile to fit. Check the Makefile first for hints. ANSI C COMPLIANCE ----------------- Some effort has been devoted to making the cawf sources ANSI C compliant. The header file proto.h contains function prototypes that enable ANSI C argument checking. The state of definition of the __STDC__ symbol is used to select options that depend on strict adherence to the ANSI C standard -- e.g., the need for the isascii() test before islower() or isupper(). If your ANSI compiler doesn't define this variable when it's acting in strict ANSI C mode, you may have to define it in the Makefile. MS-DOS CONSIDERATIONS --------------------- The MS-DOS version of cawf was created to run under the KornShell of the Mortis Kern Systems Toolkit. One ramification of using MKS' ksh is that it supports the separate standard error and standard output streams. Hence, cawf blithely distributes its error messages to the standard error file, and assumes the user's shell is capabX<Z<[<le of separating them from standard output. If you don't use the MKS KornShell, but do want to separate the output streams, you'll have to modify the cawf source code. As a rudimentary aid, cawf uses a separate stream pointer, Efs, for writing error output, but sets it to stderr. You can change that process to open a separate error file and set Efs to point to it. COPYRIGHTS AND CREDITS ---------------------- The sources are copyrighted, but freely distributable under usual terms - retention of credit, etc. Please acknowledge: AT&T for their public-domain release of getopt(3) at the 1985 UNIFORUM conference; Chet Creider, Bob Hardy and Ted Campbell for their contributions to font filtering; Henry Spencer for awf and his regular expression package; Andy Tanenbaum for his help in ANSI C compliance, including his ansi.h header file from Minix. Henry says about awf, "I can't believe I really wrote this." Those are my sentiments exactly about cawf, but I also understand that necessity sometimes forces us to do what we would prefer to avoid. BUGS AND ENHANCEMENTS --------------------- I'll be glad to hear about bugs and needs for enhancements, but make no promises about delivering fixes or upgrades in response. Vic Abell 24 November 1992 MINIX SPECIFIC TINKERING ------------------------ Kees J. Bot 26 November 1992 /* The header attempts to decide whether the compiler has enough * conformance to Standard C for Minix to take advantage of. If so, the * symbol _ANSI is defined (as 31415). Otherwise _ANSI is not defined * here, but it may be defined by applications that want to bend the rules. * The magic number in the definition is to inhibit unnecessary bending * of the rules. (For consistency with the new '#ifdef _ANSI" tests in * the headers, _ANSI should really be defined as nothing, but that would * break many library routines that use "#if _ANSI".) * If _ANSI ends up being defined, a macro * * _PROTOTYPE(function, params) * * is defined. This macro expands in different ways, generating either * ANSI Standard C prototypes or old-style K&R (Kernighan & Ritchie) * prototypes, as needed. Finally, some programs use _CONST, _VOIDSTAR etc * in such a way that they are portable over both ANSI and K&R compilers. * The appropriate macros are defined here. */ #ifndef _ANSI_H #define _ANSI_H #if __STDC__ == 1 #define _ANSI 31459 /* compiler claims full ANSI conformance */ #endif #ifdef __GNUC__ #define _ANSI 31459 /* gcc conforms enough even in non-ANSI mode */ #endif #ifdef _ANSI /* Keep everything for ANSI prototypes. */ #define _PROTOTYPE(function, params) function params #define _VOIDSTAR void * #define _VOID void #define _CONST const #define _VOLATILE volatile #define _SIZET size_t #else /* Throw away the parameters for K&R prototypes. */ #define _PROTOTYPE(function, params) function() #define _VOIDSTAR void * #define _VOID void #define _CONST #define _VOLATILE #define _SIZET int #endif /* _ANSI */ #endif /* ANSI_H */ /* * bsfilt.c - a colcrt-like processor for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include #ifdef UNIX # ifdef USG #include # else /* not USG */ #include # endif /* USG */ #else /* not UNIX */ #include #endif /* UNIX */ #include #include "ansi.h" #define MAXLL 2048 /* ridiculous maximum line length */ int Dash = 1; /* underline with dashes */ int Dp = 0; /* dash pending */ int Lc = 0; /* line count */ char *Pname; /* program name */ unsigned char Ulb[MAXLL]; /* underline buffer */ int Ulx = 0; /* underline buffer index */ _PROTOTYPE(void Putchar,(int ch)); main(argc, argv) int argc; char *argv[]; { int ax = 1; /* argument index */ unsigned char c; /* character buffer */ FILE *fs; /* file stream */ int nf = 0; /* number of files processed */ unsigned char pc; /* previous character */ int under = 0; /* underline */ /* * Save program name. */ if ((Pname = strrchr(argv[0], '/')) != NULL) Pname++; else if ((Pname = strrchr(argv[0], '\\')) != NULL) Pname++; else Pname = argv[0]; /* * Process options. */ if (argc > 1 && argv[1][0] == '-') { switch (argv[1][1]) { /* * "-U" - underline with dashes. */ case 'U': Dash = 0; under = 1; break; /* * "-" - do no underlining at all. */ case '\0': Dash = under = 0; break; default: (void) fprintf(stderr, "%s usage: [-] [-U] [file]\n", Pname); exit(1); } ax++; } /* * Process files. Read standard input if no files names. */ while (ax < argc || nf == 0) { if (ax >= argc) fs = stdin; else { #ifdef UNIX if ((fs = fopen(argv[ax], "r")) == NULL) #else if ((fs = fopen(argv[ax], "rt")) == NULL) #endif { (void) fprintf(stderr, "%s: can't open %s\n", Pname, argv[ax]); exit(1); } ax++; } nf++; /* * Read input a character at a time. */ for (pc = '\0';;) { c = (unsigned char)fgetc(fs); if (feof(fs)) break; switch(c) { case '\n': if (pc) Putchar((int)pc); Putchar('\n'); pc = '\0'; break; case '\b': if (pc == '_') { if (under) { putchar(pc); putchar('\b'); } else if (Dash) Dp = 1; } pc = '\0'; break; default: if (pc) Putchar((int)pc); pc = c; } } if (pc) { Putchar((int)pc); Putchar((int)'\n'); } } exit(0); } /* * Putchar(ch) - put a character with possible underlining */ void Putchar(ch) int ch; { int i; /* temporary index */ if ((unsigned char)ch == '\n') { /* * Handle end of line. */ putchar('\n'); if (Ulx) { while (Ulx && Ulb[Ulx-1] == ' ') Ulx--; if (Ulx) { for (i = 0; i < Ulx; i++) putchar(Ulb[i]); putchar('\n'); } } Dp = Ulx = 0; Lc++; return; } /* * Put "normal" character. */ putchar((unsigned char)ch); if (Dash) { /* * Handle dash-type underlining. */ if (Ulx >= MAXLL) { (void) fprintf(stderr, "%s: underline for line %d > %d characters\n", Pname, Lc, MAXLL); exit(1); } Ulb[Ulx++] = Dp ? '-' : ' '; Dp = 0; } } /* * cawf - a C version of Henry Spencer's awf(1), the Amazingly * Workable (text) Formatter * * V. Abell, Purdue University Computing Center */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ static char Version[] = "4.0"; #include "cawf.h" #include #ifndef UNIX #include #include #include #include #include #endif main(argc, argv) int argc; char *argv[]; { char *ep; /* environment pointer */ int fff = 0; /* final form feed status */ char **files; /* file names */ int help = 0; /* help status */ int i; /* temporary index */ size_t l; /* length */ char *lib = CAWFLIB; /* library path */ int libl; /* library path length */ int mac = 0; /* macro specification status */ int nf = 0; /* number of files */ char *np; /* name pointer */ int pc; /* prolog count */ struct stat sbuf; /* stat buffer */ /* * Save program name. */ if ((Pname = strrchr(argv[0], '\\')) != NULL) Pname++; else if ((Pname = strrchr(argv[0], '/')) != NULL) Pname++; else Pname = argv[0]; /* * Set error file stream pointer. */ Efs = stderr; /* * Get library name. */ if ((np = getenv("CAWFLIB")) != NULL) lib = np; libl = strlen(lib); /* * Get device file name. */ for (ep = getenv("TERM");; ep = NULL) { if (ep == NULL || *ep == '\0') ep = "dumb"; l = libl + 1 + strlen(ep) + strlen(".dev") + 1; if ((np = malloc(l)) == NULL) Error(FATAL, NOLINE, " no string space for device file: ", ep); (void) sprintf(np, "%s/%s.dev", lib, ep); if (stat(np, &sbuf) == 0) break; if (strcmp(ep, "dumb") == 0) Error(FATAL, NOLINE, " no dumb.dev file in ", lib); (void) free(np); } if ((files = malloc((argc + 2) * sizeof(files[0]))) == NULL) Error(FATAL, NOLINE, " no space for file list", NULL); files[nf++] = np; /* * Get common text file name. */ l = libl + 1 + strlen("common") + 1; if ((np = malloc(l)) == NULL) Error(FATAL, NOLINE, " no string space for common file name", NULL); (void) sprintf(np, "%s/common", lib); files[nf++] = np; /* * Process options. */ while ((i = getopt(argc, argv, "c:d:ef:hm:")) != EOF) { switch (i) { /* * -c> */ case 'c': Devconf = optarg; break; /* * -d -- define output device name * * The default output device name is NORMAL -- i.e., a device that * does bold face with backspace and overprinting and italic face with * underscore. NORMAL is usually a terminal device. * * There is a built-in device, named ANSI, that does bold face with * the ANSI shadow mode and italic face with the ANSI underscore mode. * ANSI is normally a terminal device that supports the ANSI shadow * and underscore modes. * * There is a built-in output device, named NONE, that does nothing * at all for the bold or italic faces. This is usually a terminal * device. * * All other device names must match a stanza in the device * configuration file. */ case 'd': Device = optarg; break; /* * -e -- eject: issue final form feed */ case 'e': fff = 1; break; /* * -f -- define font name for the output * device (from device configuration * file) */ case 'f': Devfont = optarg; break; /* * -h -- display help (usage) */ case 'h': help = 1; break; /* * -m * * Special support is provided for -man, -me and -ms. */ case 'm': if (mac) { Error(WARN, NOLINE, "multiple macro file declaration", NULL); break; } l = libl + 2 + strlen(optarg) + strlen(".mac") + 1; if ((np = malloc(l)) == NULL) Error(FATAL, NOLINE, " no string space for ", argv[1]); (void) sprintf(np, "%s/m%s.mac", lib, optarg); files[nf++] = np; if (strcmp(optarg, "an") == 0) Marg = MANMACROS; else if (strcmp(optarg, "s") == 0 || strcmp(optarg, "e") == 0) Marg = MSMACROS; mac++; break; /* * Option not recognized by getopt(). */ case '?': Err = 1; } } if (Defdev()) Err++; if (help || Err) { (void) fprintf(stderr, "%s %s usage: [-c] [-d] [-e] [-f] [-h] [-m] file...\n", Pname, Version); (void) fprintf(stderr, "\t-c is the device configuration file path\n"); (void) fprintf(stderr, "\t-d is the output device name\n"); (void) fprintf(stderr, "\t (default = NORMAL, using \\b for bold and italic)\n"); (void) fprintf(stderr, "\t (built-ins = ANSI, NONE and NORMAL)\n"); (void) fprintf(stderr, "\t-e issue eject after last page\n"); (void) fprintf(stderr, "\t-f is the output device font name\n"); (void) fprintf(stderr, "\t-h display help (this output)\n"); (void) fprintf(stderr, "\t-m m is the macro file name\n"); (void) fprintf(stderr, "\tfile ... source file names\n"); exit(Err); } if (mac == 0) { /* * No macroes - enable Bold, Italic, Roman and Courier fonts. */ for (i = 0; Fcode[i].nm; i++) { switch (Fcode[i].nm) { case 'B': case 'I': case 'R': case 'C': Fcode[i].status = '1'; } } } /* * Add user-supplied file names. */ pc = nf; if (optind >= argc) { files[nf++] = NULL; /* STDIN */ } else { while (optind < argc) files[nf++] = argv[optind++]; } /* * Make sure all input files are accessible. */ for (i = 0; i < nf; i++) { if (files[i] != NULL) { if (stat(files[i], &sbuf) != 0) Error(WARN, NOLINE, " can't find ", files[i]); } } if (Err) exit(1); /* * Miscellaneous initialization. */ for (i = 0; ; i++) { if (Pat[i].re == NULL) break; if ((Pat[i].pat = regcomp(Pat[i].re)) == NULL) Error(WARN, NOLINE, Pat[i].re, " regcomp failure"); } if ((i = Findscale((int)'n', 0.0, 0)) < 0) Error(WARN, NOLINE, " can't find Scale['n']", NULL); Scalen = Scale[i].val; if ((i = Findscale((int)'u', 0.0, 0)) < 0) Error(WARN, NOLINE, " can't find Scale['u']", NULL); Scaleu = Scale[i].val; if ((i = Findscale((int)'v', 0.0, 0)) < 0) Error(WARN, NOLINE, " can't find Scale['v']", NULL); Scalev = Scale[i].val; (void) Findstr((unsigned char *)"CH", (unsigned char *)"= % -", 1); Cont = Newstr((unsigned char *)" "); Contlen = 1; if ((Trtbl = (unsigned char *)malloc(256)) == NULL) Error(WARN, NOLINE, " can't allocate translate table space", NULL); else { *Trtbl = ' '; for (i = 1; i < 256; i++) Trtbl[i] = (unsigned char) i; } if (Err) exit(1); /* * Here begins pass1 of awf - reading input lines and expanding macros. */ /* * Output prolog. */ if (Fstr.i) { for (i = 0; i < Fstr.il; i++) { Charput((int)Fstr.i[i]); } } Macro((unsigned char *)".^x"); Macro((unsigned char *)".^b"); Macro((unsigned char *)".^# 1 "); /* * Read input files. */ for (i = 0; i < nf; i++) { Dowarn = (i >= pc); if (files[i] == NULL) { np = "stdin"; Ifs = stdin; } else { #ifdef UNIX if ((Ifs = fopen(files[i], "r")) == NULj<l<m<n<o<L) #else if ((Ifs = fopen(files[i], "rt")) == NULL) #endif Error(FATAL, NOLINE, " can't open ", files[i]); np = files[i]; } if (i >= pc) { (void) sprintf((char *)Line, ".^# 1 %s", np); Macro(Line); NR = 0; } Fsp = 0; do { while (fgets((char *)Line, MAXLINE, Ifs) != NULL) { NR++; if ((np = strrchr((char *)Line, '\n')) != NULL) *np = '\0'; else Line[MAXLINE-1] = '\0'; Macro(Line); } if (i >= pc) Macro((unsigned char *)".^e"); if (Ifs != stdin) (void) fclose(Ifs); if (Fsp > 0) { Free(&Inname); Inname = Inn_stk[Fsp-1]; NR = NR_stk[Fsp-1]; Ifs = Ifs_stk[Fsp-1]; } } while (Fsp-- > 0); } Macro(NULL); if (fff) Charput((int)'\f'); exit(Err); } /* * Macro(inp) - process a possible macro statement * pass non-macros and macros alike to pass 2 */ void Macro(inp) unsigned char *inp; /* possible macro statement pointer */ { unsigned char c[2]; /* characters */ int endm; /* end of macro status */ FILE *fs; /* temporary file stream */ int i, j, k; /* temporary indexes */ int mx; /* Macrotab[] index */ int req; /* request character status */ unsigned char *s1, *s2; /* temporary string pointers */ if (inp == NULL) { Pass2(NULL); return; } req = (*inp == '.' || *inp == '\'') ? 1 : 0; /* * Check for file name designator. */ if (req && inp[1] == '^' && inp[2] == '#') { Free(&Inname); Inname = Field(3, inp, 1); F = NULL; Pass2(inp); return; } /* * Check for source command - "^[.']so". */ if (req && inp[1] == 's' && inp[2] == 'o') { if ((s1 = Field(2, inp, 1)) == NULL) { Error(WARN, LINE, " no file specified", NULL); return; } if ((fs = fopen((char *)s1, "r")) == NULL) { Error(WARN, LINE, " can't open", NULL); return; } if (Fsp >= MAXFSTK) { (void) fclose(fs); Error(WARN, LINE, " nesting too deep", NULL); return; } Ifs_stk[Fsp] = Ifs; Ifs = fs; Inn_stk[Fsp] = Inname; Inname = F; F = NULL; NR_stk[Fsp++] = NR; NR = 0; return; } /* * Check for ignore. */ if (req && inp[1] == 'i' && inp[2] == 'g') { while (fgets((char *)inp, MAXLINE, Ifs) != NULL) { NR++; if (inp[0] == '.' && inp[1] == '.') break; } return; } /* * Check for start of macro definition. */ if (req && inp[1] == 'd' && inp[2] == 'e') { if (inp[3] != ' ' || inp[4] == '\0') { Error(WARN, LINE, " illegal macro definition", NULL); return; } c[0] = inp[4]; c[1] = inp[5]; Curmx = Findmacro(c, 1); return; } /* * Check for macro text. Remove double backslashes. */ if (req && (inp[1] == '\0' || (inp[2] == '\0' && inp[0] == inp[1]))) endm = 1; else endm = 0; if (Curmx >= 0 && !endm) { if (Mtx >= MAXMTXT) Error(FATAL, LINE, " out of macro text space", NULL); if ((s1 = (unsigned char *)strchr((char *)inp, '\\')) == NULL) Macrotxt[Mtx] = Newstr(inp); else { for (s1 = Pass1ln, s2 = inp;; s1++) { if ((*s1 = *s2++) == '\0') break; if (*s1 == '\\' && *s2 == '\\') s2++; } Macrotxt[Mtx] = Newstr(Pass1ln); } if (Macrotab[Curmx].bx == -1) Macrotab[Curmx].bx = Mtx; Mtx++; Macrotab[Curmx].ct++; return; } /* * Check for end of macro. */ if (Curmx >= 0 && endm) { Curmx = -1; (void) sprintf((char *)Pass1ln, ".^# %d %s", NR, Inname); Pass2(Pass1ln); return; } /* * Check for conditionals and macro expansions. */ if (req && (((mx = Findmacro(inp+1, 0)) != -1) || regexec(Pat[0].pat, inp))) { Expand(inp); return; } /* * None of the above: forward the line. */ Pass2(inp); } /* * cawf.h - definitions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include #ifdef UNIX #include #else #include #endif #include "regexp.h" #include "cawflib.h" #include "proto.h" #define DEVCONFIG "device.cf" /* device configuration file */ #define ESC '\033' /* ESCape character */ #define MAXEXP 30 /* maximum expressions * (and TABs) */ #define MAXFSTK 5 /* maximum file stack * (for .so) */ #define MAXHYCH 10 /* maximum hyphen characters */ #define MAXLINE 512 /* maximum line length */ #define MAXMACRO 100 /* maximum number of macros */ #define MAXMTXT 1024 /* maximum macro text lines */ #define MAXNHNR 10 /* maximum ".NH" numbers * (but 0 not used) */ #define MAXNR 50 /* maximum number reg */ #define MAXOLL 512 /* maximum output line length */ #define MAXSCH 256 /* maximum special characters */ #define MAXSP 25 /* maximum stack pointer (for * nesting of macro calls) */ #define MAXSTR 100 /* maximum ".ds" strings */ /* * Output line adjustment modes */ #define LEFTADJ 0 #define RIGHTADJ 1 #define BOTHADJ 2 /* * Error handling codes */ #define FATAL 0 /* fatal error */ #define LINE 0 /* display line */ #define NOLINE 1 /* don't display line */ #define WARN 1 /* warning error */ /* * Padding directions */ #define PADLEFT 0 /* pad from left */ #define PADRIGHT 1 /* pad from right */ /* * Pass 3 signal codes */ #define NOBREAK -1 #define DOBREAK -2 #define MESSAGE -3 /* * Macro argument types */ #define MANMACROS 1 /* -man */ #define MSMACROS 2 /* -ms */ struct fcode { unsigned char nm; /* font name character */ unsigned char status; /* status */ }; struct fontstr { /* font control strings */ unsigned char *i; /* font initialization string */ int il; /* length of *i */ unsigned char *b; /* bold */ int bl; /* length of *bb */ unsigned char *it; /* italic */ int itl; /* length of *itb */ unsigned char *r; /* roman string */ int rl; /* length of *r */ }; struct hytab { unsigned char font; /* font name character */ int len; /* effective length */ unsigned char *str; /* value string */ }; struct macro { unsigned char name[2]; /* macro name */ int bx; /* beginning Macrotxt[] index */ int ct; /* index count */ }; struct nbr { unsigned char nm[2]; /* register name */ int val; /* value */ }; struct parms { char nm[2]; /* parameter name */ char *cmd; /* pass 3 command */ int val; /* current value */ int prev; /* previous value */ }; struct rx { char *re; /* regular expression */ struct regexp *pat; /* compiled pattern */ }; struct scale { unsigned char nm; /* scale factor name */ double val; /* value */ }; struct schtab { unsigned char nm[2]; /* character name */ int len; /* effective length */ unsigned char *str; /* value string */ }; struct str { unsigned char nm[2]; /* string name */ unsigned char *str; /* string value */ }; extern int Adj; /* output line adjustment mode */ extern unsigned char *Aftnxt; /* action after next line */ extern unsigned char *Args[]; /* macro arguments */ extern unsigned char *Argstack[]; /* stack for Expand()'s "args[]" */ extern int Backc; /* last word ended with '\\c' */ extern int Botmarg; /* bottom margin */ extern int Centering; /* centering count */ extern int Condstack[]; /* stack for Expand()'s "cond" */ extern unsigned char *Cont; /* continue line append */ extern int Contlen; /* continue line append length */ extern int Curmx; /* current macro name */ extern char *Device; /* output device name */ extern char *Devconf; /* device configuration file path */ extern char *Devfont; /* output device font */ extern int Divert; /* diversion status */ extern FILE *Efs; /* error file stream pointer */ extern unsigned char *Eol; /* end of line information */ extern int Eollen; /* end of line length */ extern int Err; /* error flag */ extern unsigned char *F; /* field value */ extern struct fcode Fcode[]; /* font codes */ extern int Fill; /* fill status */ extern unsigned char Font[]; /* current font */ extern int Fontctl; /* output font control */ extern char Fontstat; /* output font status */ extern int Fph; /* first page header status */ extern int Fsp; /* files stack pointer (for .so) */ extern struct fontstr Fstr; /* font control strings */ extern unsigned char *Ftc; /* center footer */ extern unsigned char *Ftl; /* left footer */ extern unsigned char *Ftr; /* right footer */ extern unsigned char *Hdc; /* center header */ extern int Hdft; /* header/footer status */ extern unsigned char *Hdl; /* left header */ extern unsigned char *Hdr; /* right header */ extern FILE *Ifs; /* input file stream */ extern FILE *Ifs_stk[]; /* Ifs stack */ extern int Ind; /* indentation amount */ extern unsigned char *Inname; /* input file name */ extern unsigned char *Inn_stk[]; /* Inname stack */ extern struct hytab Hychar[]; /* hyphen characters */ extern int LL; /* line length */ extern unsigned char Line[]; /* input line */ extern int Lockil; /* pass 2 line number is locked * (processing is inside macro) */ extern int Marg; /* macro argument - man, ms, etc. */ extern struct macro Macrotab[]; /* macro table */ extern int Macrostack[]; /* stack for Expand()'s "macro" */ extern unsigned char *Macrotxt[]; /* macro text */ extern int Mtx; /* macro text index */ extern int Mxstack[]; /* stack for Expand()'s "mx" */ extern int Nhnr[]; /* ".NH" numbers */ extern int Nhy; /* number of Hychar[] entries */ extern int Nleftstack[]; /* stack for Expand()'s "nleft" */ extern int Nmac; /* number of macros */ extern int Nnr; /* number of Numb[] entries */ extern int Nospmode; /* no space mode */ extern int Nparms; /* number of Parms[] entries */ extern int NR; /* number of record, ala awk */ extern int NR_stk[]; /* NR stack */ extern int Nsch; /* number of Schar[] entries */ extern int Nstr; /* number of entries in Str[] */ extern int Ntabs; /* number of TAB positions */ extern struct nbr Numb[]; /* number registers */ extern int Nxtln; /* next line number */ extern char *optarg; /* getopt(3) argument pointer */ extern int optind; /* getopt(3) index */ extern int Outll; /* output line length */ extern unsigned char Outln[]; /* output line */ extern int Outlx; /* output line index */ extern int P2il; /* pass 2 input line number */ extern unsigned char *P2name; /* pass 2 input file name */ extern int P3fill; /* pass 3 fill status */ extern int Padchar[]; /* padding character locations */ exw<y<z<tern int Padfrom; /* which end to pad from */ extern int Padx; /* Padchar[] index */ extern struct parms Parms[]; /* parameter registers */ extern unsigned char Pass1ln[]; /* pass 1 output line */ extern unsigned char Pass2ln[]; /* pass 2 output line */ extern struct rx Pat[]; /* compiled regexp patterns */ extern int Pglen; /* page length */ extern int Pgoff; /* page offset */ extern char *Pname; /* program name */ extern unsigned char Prevfont; /* previous font */ extern int Ptrstack[]; /* stack for Expand()'s "ptr" */ extern struct scale Scale[]; /* scaling factors */ extern double Scalen; /* 'n' scaling factor */ extern double Scaleu; /* 'u' scaling factor */ extern double Scalev; /* 'v' scaling factor */ extern struct schtab Schar[]; /* special characters */ extern int Sp; /* stack pointer */ extern struct str Str[]; /* ".ds" strings */ extern int Sx; /* string index */ extern int Tabs[]; /* TAB positions */ extern int Thispg; /* this page number */ extern int Tind; /* temporary indentation amount */ extern int Topmarg; /* top margin */ extern unsigned char *Trtbl; /* .tr table */ extern int Uhyph; /* hyphen usage state */ extern int Vspace; /* vertical (inter-text-line) spacing */ extern unsigned char Word[]; /* pass 2 word buffer */ extern int Wordl; /* effective length of Word[] */ extern int Wordx; /* Word[] index */ extern int Dowarn; /* Enables warnings when true */ /* * cawflib.h - definition of cawf's library path */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #ifndef CAWFLIB #ifdef UNIX #define CAWFLIB "/usr/lib/cawf" /* UNIX library location */ #else #define CAWFLIB "c:/sys/lib/cawf" /* PC-DOS library location */ #endif #endif /* (CAWFLIB environment * variable over-rides it) */ .\" Common startup code, fully device-independent. .\" -------------------------------- .fi .ce 0 .ta +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 .in 0 .ti 0 /* * device.c -- cawf(1) output device support functions */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" #include _PROTOTYPE(static unsigned char *Convstr,(char *s, int *len)); _PROTOTYPE(static int Convfont,(char *nm, char *s, char **fn, unsigned char **fi)); #ifndef UNIX #define strcasecmp strcmpi #endif /* * Convstr(s, len) - convert a string */ static unsigned char * Convstr(s, len) char *s; /* input string */ int *len; /* length of result */ { int c; /* character assembly */ unsigned char *cp; /* temporary character pointer */ char *em; /* error message */ int i; /* temporary index */ int l; /* length */ unsigned char *r; /* result string */ /* * Make space for the result. */ if ((r = (unsigned char *)malloc(strlen((char *)s) + 1)) == NULL) { (void) fprintf(stderr, "%s: out of string space at %s\n", Pname, s); return(NULL); } /* * Copy the input string to the result, processing '\\' escapes. */ for (cp = r, l = 0; *s;) { switch (*s) { case '\\': s++; if (*s >= '0' && *s <= '7') { /* * '\xxx' -- octal form */ for (c = i = 0; i < 3; i++, s++) { if (*s < '0' || *s > '7') { em = "non-octal char"; bad_string: (void) fprintf(stderr, "%s: %s : %s\n", Pname, em, (char *)r); return(NULL); } c = (c << 3) + *s - '0'; } if (c > 0377) { em = "octal char > 0377"; goto bad_string; } *cp++ = c; l++; } else if (*s == 'x') { /* * '\xyy' -- hexadecimal form */ s++; for (c = i = 0; i < 2; i++, s++) { #if defined(__STDC__) if ( ! isalpha(*s) && ! isdigit(*s)) #else if ( ! isascii(*s) && ! isalpha(*s) && ! isdigit(*s)) #endif { non_hex_char: em = "non-hex char"; goto bad_string; } c = c << 4; if (*s >= '0' && *s <= '9') c += *s - '0'; else if ((*s >= 'a' && *s <= 'f') || (*s >= 'A' && *s <= 'F')) c += *s + 10 - (isupper(*s) ? 'A' : 'a'); else goto non_hex_char; } *cp++ = (unsigned char)c; l++; } else if (*s == 'E' || *s == 'e') { /* * '\E' or '\e' -- ESCape */ *cp++ = ESC; l++; s++; } else if (*s == '\0') { em = "no char after \\"; goto bad_string; } else { /* * escaped character (for some reason) */ *cp++ = *s++; l++; } break; /* * Copy a "normal" character. */ default: *cp++ = *s++; l++; } } *cp = '\0'; *len = l; return(r); } /* * Convfont(nm, s, fn, fi) - convert a font for a device */ static int Convfont(nm, s, fn, fi) char *nm; /* output device name */ char *s; /* font definition string */ char **fn; /* font name address */ unsigned char **fi; /* initialization string address */ { char *cp; /* temporary character pointer */ int len; /* length */ /* * Get the font name, allocate space for it and allocate space for * a font structure. */ if ((cp = strchr(s, '=')) == NULL) { (void) fprintf(stderr, "%s: bad %s font line format: %s\n", Pname, nm, s); return(0); } if ((*fn = (char *)malloc(cp - s + 1)) == NULL) { (void) fprintf(stderr, "%s: no space for %s font name %s\n", Pname, nm, s); return(0); } (void) strncpy(*fn, s, cp - s); (*fn)[cp - s] = '\0'; /* * Assmble the font initialization string. */ if ((*fi = Convstr(cp + 1, &len)) == NULL) return(0); return(len); } /* * Defdev() - define the output device */ int Defdev() { unsigned char *fi = NULL; /* last font initialization string */ char *fn = NULL; /* font name */ int fd = 0; /* found-device flag */ FILE *fs; /* file stream */ int err = 0; /* errror count */ int i; /* temporary index */ int len; /* length */ char line[MAXLINE]; /* line buffer */ char *p; /* output device configuration file */ char *s; /* temporary string pointer */ /* * Check for the built-in devices, ANSI, NONE or NORMAL (default). */ Fstr.b = Fstr.i = Fstr.it = Fstr.r = NULL; Fstr.bl = Fstr.il = Fstr.itl = Fstr.rl = 0; if (Device == NULL || strcasecmp(Device, "normal") == 0) { Fontctl = 0; check_font: if (Devfont) { (void) fprintf(stderr, "%s: font %s for device %s illegal\n", Pname, Devfont, Device ? Device : "NORMAL"); return(1); } return(0); } Fontctl = 1; if (strcasecmp(Device, "ansi") == 0) { Fstr.b = Newstr((unsigned char *)"x[1m"); Fstr.it = Newstr((unsigned char *)"x[4m"); Fstr.r = Newstr((unsigned char *)"x[0m"); Fstr.b[0] = Fstr.it[0] = Fstr.r[0] = ESC; Fstr.bl = Fstr.itl = Fstr.rl = 4; goto check_font; } if (strcasecmp(Device, "none") == 0) goto check_font; /* * If a device configuration file path is supplied, use it. */ if (Devconf) p = Devconf; else { /* * Use the CAWFLIB environment if it is defined. */ if ((p = getenv("CAWFLIB")) == NULL) p = CAWFLIB; len = strlen(p) + 1 + strlen(DEVCONFIG) + 1; if ((s = (char *)malloc(len)) == NULL) { (void) fprintf(stderr, "%s: no space for %s name\n", Pname, DEVCONFIG); return(1); } (void) sprintf(s, "%s/%s", p, DEVCONFIG); p = s; } /* * Open the configuration file. */ #ifdef UNIX if ((fs = fopen(p, "r")) == NULL) #else if ((fs = fopen(p, "rt")) == NULL) #endif { (void) fprintf(stderr, "%s: can't open config file: %s\n", Pname, p); return(1); } *line = ' '; /* * Look for a device definition line -- a line that begins with a name. */ while ( ! feof(fs)) { if (*line == '\t' || *line == '#' || *line == ' ') { (void) fgets(line, MAXLINE, fs); continue; } if ((s = strrchr(line, '\n')) != NULL) *s = '\0'; else line[MAXLINE-1] = '\0'; /* * Match device name. */ if (strcmp(Device, line) != 0) { (void) fgets(line, MAXLINE, fs); continue; } fd = 1; /* * Read the parameter lines for the device. */ while (fgets(line, MAXLINE, fs) != NULL) { if (*line == ' ') { for (i = 1; line[i] == ' '; i++) ; } else if (*line == '\t') i = 1; else break; #if defined(__STDC__) if ( ! isalpha(line[i]) #else if ( ! isascii(line[i]) || ! isalpha(line[i]) #endif || line[i+1] != '=') break; if ((s = strrchr(line, '\n')) != NULL) *s = '\0'; else line[MAXLINE-1] = '\0'; switch (line[i]) { /* * \tb= */ case 'b': if (Fstr.b != NULL) { (void) fprintf(stderr, "%s: dup bold for %s in %s: %s\n", Pname, Device, p, line); (void) free(Fstr.b); Fstr.b = NULL; } if ((Fstr.b = Convstr(&line[i+2], &Fstr.bl)) == NULL) err++; break; /* * \ti= */ case 'i': if (Fstr.it != NULL) { (void) fprintf(stderr, "%s: dup italic for %s in %s: %s\n", Pname, Device, p, line); (void) free(Fstr.it); Fstr.it = NULL; } if ((Fstr.it = Convstr(&line[i+2], &Fstr.itl)) == NULL) err++; break; /* * \tr= */ case 'r': if (Fstr.r != NULL) { (void) fprintf(stderr, "%s: dup roman for %s in %s: %s\n", Pname, Device, p, line); (void) free(Fstr.r); Fstr.r = NULL; } if ((Fstr.r = Convstr(&lin<<<e[i+2], &Fstr.rl)) == NULL) err++; break; /* * \tf== */ case 'f': if ( ! Devfont || Fstr.i) break; if ((i = Convfont(Device, &line[i+2], &fn, &fi)) < 0) err++; else if (fn && strcmp(Devfont, fn) == 0) { Fstr.i = fi; Fstr.il = i; fi = NULL; } if (fn) { (void) free(fn); fn = NULL; } if (fi) { (void) free((char *)fi); fi = NULL; } break; /* * ???? */ default: (void) fprintf(stderr, "%s: unknown device %s line: %s\n", Pname, Device, line); err++; } } break; } (void) fclose(fs); if (err) return(1); /* * See if the device stanza was located and the font exists. */ if ( ! fd) { (void) fprintf(stderr, "%s: can't find device %s in %s\n", Pname, Device, p); return(1); } if (Devfont && ! Fstr.i) { (void) fprintf(stderr, "%s: font %s for device %s not found in %s\n", Pname, Devfont, Device, p); return(1); } return(0); } # cawf(1) device configuration file # # device # \tb=bold_control_sequence # \ti=italic_control_sequence # \tr=roman_control_sequence # \tf=font_name=font_initialization # # The first font name is the default for the device. # # sorted in reverse alphabetical order by device name # VGA monochrome monitors # italic = underline vgamono b=\033[1m i=\033[4m r=\033[0m # HP LaserJet III lj3 b=\x1b(s7B i=\x1b(s1S r=\x1b(s0B\x1b(s0S f=c10=\x1b&l0O\x1b(8U\x1b(s0p12h10v0s0b3T f=c12ibm=\x1b&l0O\x1b(10U\x1b(s0p10.00h12.0v0s0b3T f=lg12=\x1b&l0O\x1b(8U\x1b(s12h12v0s0b6T # Panasonic KX-P1180 # bold = Emphasized # # all fonts are Near Letter Quality (NLQ) kxp1180 b=\033E i=\0334 r=\0335\033F f=c10=\033x1\033k0\033P f=bps10=\033x1\033k6\033P f=bps12=\033x1\033k6\033M f=c12=\033x1\033k0\033M f=p10=\033x1\033k3\033P f=p12=\033x1\033k3\033M f=ss10=\033x1\033k1\033P f=ss12=\033x1\033k1\033M # Panasonic KX-P1124 (from Bob Hardy ) # bold = Emphasized # # all fonts are Near Letter Quality (NLQ) # # The s10 and s12 fonts are Script, which is only available on the more # deluxe models of the Panasonic KX-P1100 series -- e.g., Script is not # supported on the KX-P1180, but is supported on the KX-P1124. kxp1124 b=\033E i=\0334 r=\0335\033F f=c10=\033x1\033k0\033P f=bps10=\033x1\033k6\033P f=bps12=\033x1\033k6\033M f=c12=\033x1\033k0\033M f=p10=\033x1\033k3\033P f=p12=\033x1\033k3\033M f=s10=\033x1\033k4\033P f=s12=\033x1\033k4\033M f=ss10=\033x1\033k1\033P f=ss12=\033x1\033k1\033M # IBM Personal Printer Data Stream (PPDS) protocol # bold = Double-strike # italic = Underline ibmppds b=\033G i=\033-\001 r=\033-\000\033H # Epson FX-86e/FX-800 # bold = double strike epson b=\033G i=\0334 r=\0335\033H diff -c1 ../4.0.2.dist/Makefile ./Makefile *** ../4.0.2.dist/Makefile Thu Nov 26 09:06:28 1992 --- ./Makefile Thu Nov 26 09:17:08 1992 *************** *** 36,40 **** ! DEFS = -DUNIX -DSTDLIB -ansi -pedantic ! CFLAGS = -O ${DEFS} --- 36,40 ---- ! DEFS = -DUNIX -DUSG -DSTDLIB ! CFLAGS = -i -s -f -O ${DEFS} diff -c1 ../4.0.2.dist/README ./README *** ../4.0.2.dist/README Thu Nov 26 09:06:28 1992 --- ./README Thu Nov 26 09:19:26 1992 *************** *** 54,56 **** --- 54,68 ---- + Changes to cawf to run under Minix: + * The DOS binaries and make files have been removed. + + * Tabs stops changed from per 5 to per 8. + + * Bold and underline as it should be in device.cf. + + * Added .SB and .TA to man.mac. + + * Numerous prototypes added. + + CONTENTS *************** *** 58,62 **** ! This Unix distribution of cawf includes: ! 00readme this file *.c and *.h source files to build cawf and bsfilt (bsfilt --- 70,74 ---- ! This Minix distribution of cawf includes: ! README this file *.c and *.h source files to build cawf and bsfilt (bsfilt *************** *** 64,70 **** bsfilt.1 nroff source for the bsfilt manual page - bsfilt.exe.uue uuencoded MS-DOS bsfilt executable - bsfilt.mak MS-DOS Quick-C make file for bsfilt cawf.1 nroff source for the cawf manual page - cawf.exe.uue uuencoded MS-DOS cawf executable - cawf.mak MS-DOS Quick-C make file for cawf common initialization file for CAWFLIB library --- 76,78 ---- *************** *** 77,86 **** ms.mac ms(7) macros for CAWFLIB library - Hint: to generate an MS-DOS executable, uudecode the *.exe.uue file -- e.g. - $ uudecode cawf.exe.uue - - yields a cawf.exe file. - - LIBRARY --- 85,94 ---- ms.mac ms(7) macros for CAWFLIB library + diffs Minix patches + #ifdef PUTTING_IT_ON_THE_NET + cawf + bsfilt binaries compiled under Minix-PC 1.5 using the ACK + ANSI C compiler using software floating point + #endif LIBRARY *************** *** 89,92 **** To use cawf, you must select a location for the CAWFLIB library files. The ! distributed cawf.exe expects to find them in c:\sys\lib\cawf, but you can ! alter that with the CAWFLIB environment variable, or you can change the CAWFLIB #define in cawf.h and rebuild cawf from the sources. --- 97,100 ---- To use cawf, you must select a location for the CAWFLIB library files. The ! distributed cawf binary expects to find them in /usr/local/lib/cawf but you ! can alter that with the CAWFLIB environment variable, or you can change the CAWFLIB #define in cawf.h and rebuild cawf from the sources. *************** *** 135,139 **** ! A Unix make file and a cawf.mak file for version 2.5 of Microsoft MS-DOS ! Quick-C are included. The Unix make file has some definitions that help ! tune it to the local Unix environment: --- 143,146 ---- ! The Unix make file has some definitions that help tune it to the local ! Unix environment: *************** *** 251 **** --- 258,264 ---- + + MINIX SPECIFIC TINKERING + ------------------------ + + Kees J. Bot + 26 November 1992 diff -c1 ../4.0.2.dist/cawflib.h ./cawflib.h *** ../4.0.2.dist/cawflib.h Thu Nov 26 09:06:35 1992 --- ./cawflib.h Thu Nov 26 09:17:10 1992 *************** *** 32,34 **** #ifdef UNIX ! #define CAWFLIB "/Homes/abe/lib/cawf" /* UNIX library location */ #else --- 32,34 ---- #ifdef UNIX ! #define CAWFLIB "/usr/local/lib/cawf" /* UNIX library location */ #else diff -c1 ../4.0.2.dist/common ./common *** ../4.0.2.dist/common Thu Nov 26 09:06:36 1992 --- ./common Thu Nov 26 09:17:10 1992 *************** *** 4,6 **** .ce 0 ! .ta +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 .in 0 --- 4,6 ---- .ce 0 ! .ta +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 .in 0 diff -c1 ../4.0.2.dist/device.c ./device.c *** ../4.0.2.dist/device.c Thu Nov 26 09:06:36 1992 --- ./device.c Thu Nov 26 09:34:09 1992 *************** *** 229,231 **** if (strcasecmp(Device, "ansi") == 0) { ! Fstr.b = Newstr((unsigned char *)"x[7m"); Fstr.it = Newstr((unsigned char *)"x[4m"); --- 229,231 ---- if (strcasecmp(Device, "ansi") == 0) { ! Fstr.b = Newstr((unsigned char *)"x[1m"); Fstr.it = Newstr((unsigned char *)"x[4m"); diff -c1 ../4.0.2.dist/device.cf ./device.cf *** ../4.0.2.dist/device.cf Thu Nov 26 09:06:37 1992 --- ./device.cf Thu Nov 26 09:21:17 1992 *************** *** 13,15 **** # VGA monochrome monitors ! # italic = reverse video --- 13,15 ---- # VGA monochrome monitors ! # italic = underline *************** *** 17,19 **** b=\033[1m ! i=\033[7m r=\033[0m --- 17,19 ---- b=\033[1m ! i=\033[4m r=\033[0m Only in .: diffs diff -c1 ../4.0.2.dist/man.mac ./man.mac *** ../4.0.2.dist/man.mac Thu Nov 26 09:06:42 1992 --- ./man.mac Thu Nov 26 09:17:12 1992 *************** *** 5,7 **** .ds LH "\\$1(\\$2) ! .ds CH "Unix Programmer's Manual .ds RH "\\$1(\\$2) --- 5,7 ---- .ds LH "\\$1(\\$2) ! .ds CH "Minix Programmer's Manual .ds RH "\\$1(\\$2) *************** *** 120,121 **** --- 120,128 ---- .\"----------------- + .de SB + .\" Can't reduce size, just do bold + .ft B + .it 1 fP + .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 + .. + .\"----------------- .de IR *************** *** 150,152 **** .de DT ! .ta +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 .. --- 157,163 ---- .de DT ! .ta +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 ! .. ! .\"----------------- ! .de TA ! .ta \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\" Device-dependent but not macro-set-dependent definitions. .\" -------------------------------- .\" overall formatting initialization .\" 12 cpi horizontal exploits 80-column terminal well (6.5i@12 = 78) .^r cpi 12 6 .\" call margin adjustment device-dependent for sake of some unusual cases .ad .\" page parameters .pl 10i .ll 6.5i .po 0 .\" -------------------------------- .\" fonts, and their hyphens, last font change doubled to set up \fP .^f R .ft R .^c hy 1 - .^f I .ft I .^c hy 1 - .^f B .ft B .^c hy 1 -\b-\b- .^f C .ft C .^c hy 1 -\b-\b- .ft R .ft R .\" -------------------------------- .\" definitions of nroff special characters .\" The character definitions here operate on the "better ugly than invisible" .\" principle, and try to approximate the character *somehow*. They were .\" tuned for a Teletype 40 line printer, but should give vaguely plausible .\" results on any overprinting ASCII device. .\" .\" first, things that nroff considered builtins .^c \ 1 \\ .^c e 1 \\ .^c ' 1 ' .^c ` 1 ` .^c - 1 - .\" some things seem to assume that \+ is like \- .^c + 1 + .\" we do not do backslash-space here, it can't be done with .^c, but the .\" other forms of space we can do .^c 0 1 " .^c | 0 .^c ^ 0 .^c & 0 .\" .\" and more normal characters .\" note, the hyphenation logic knows about em .^c em 2 -- .^c en 1 - .\" hy is a special case, see above .^c bu 1 +\bo .^c sq 2 [] .^c ru 1 _ .^c 12 3 1/2 .^c 14 3 1/4 .^c 34 3 3/4 .^c de 1 '\b` .^c dg 1 -\b! .^c fm 1 ' .^c ct 1 /\bc .^c rg 3 (R) .^c co 3 (c) .^c pl 1 + .^c mi 1 - .^c eq 1 = .^c ** 1 * .^c sc 1 j\bf .^c aa 1 ' .^c ga 1 ` .^c ul 1 _ .^c sl 1 / .^c *a 1 <\ba .^c *b 1 ,\bB .^c *g 1 ,\by .^c *d 1 S\bo .^c *e 1 -\bc .^c *z 1 ,\bL .^c *y 1 ,\bn .^c *h 1 -\b0 .^c *i 1 ,\bi .^c *k 1 <\bK .^c *l 1 \\\b> .^c *m 1 ,\bu .^c *n 1 ,\bv .^c *c 1 ,\b3 .^c *o 1 o .^c *p 1 -\bn .^c *r 1 p .^c *s 1 -\bo .^c ts 1 s .^c *t 1 ~\bt .^c *u 1 u .^c *f 1 /\bo .^c *x 1 /\b\\ .^c *q 1 |\bu .^c *w 1 u\bw .^c *G 2 ~\b|~ .^c *D 2 _\b/_\b\\ .^c *H 1 -\bO .^c *L 2 /\\ .^c *C 1 _\b-\b~ .^c *P 2 ~\b|~\b| .^c *S 1 ~\b_\b> .^c *U 1 Y .^c *F 1 |\bO .^c *Q 1 |\bU .^c *W 2 _\b(_\b) .^c sr 2 \\/ .^c rn 1 ~ .^c >= 1 _\b> .^c <= 1 _\b< .^c == 1 _\b= .^c ~= 1 ~\b= .^c ap 1 ~ .^c != 1 /\b= .^c -> 2 -> .^c <- 2 <- .^c ua 1 |\b^ .^c da 1 |\bv .^c mu 1 x .^c di 1 -\b: .^c +- 1 _\b+ .^c cu 1 U .^c ca 3 (^) .^c sb 2 (_\b~ .^c sp 2 _\b~) .^c ib 2 (~\b_\b= .^c ip 2 ~\b_\b=) .^c if 2 oo .^c pd 1 3\bo .^c gr 1 ~\bV .^c no 1 - .^c is 1 '\b,\bI .^c pt 2 oc .^c es 1 /\bO .^c mo 1 -\bC .^c br 1 | .^c dd 1 I\b| .^c rh 1 =\b> .^c lh 1 =\b< .^c bs 4 (:-) .^c or 1 | .^c ci 1 O .^c lt 1 ~\b( .^c lb 1 _\b( .^c rt 1 ~\b) .^c rb 1 _\b) .^c lk 1 -\b( .^c rk 1 -\b) .^c bv 1 | .^c lf 1 _\b[ .^c rf 1 _\b] .^c lc 1 ~\b[ .^c rc 1 ~\b] /* * error.c - error handling functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" /* * Error(t, l, s1, s2) - issue error message */ void Error(t, l, s1, s2) int t; /* type: WARN or FATAL */ int l; /* LINE: display Line[] */ char *s1, *s2; /* optional text */ { char msg[MAXLINE]; /* message */ if (t == WARN && !Dowarn) return; if (l == LINE) (void) fprintf(Efs, "%s: (%s, %d):%s%s - %s\n", Pname, Inname, NR, (s1 == NULL) ? "" : s1, (s2 == NULL) ? "" : s2, Line); else (void) fprintf(Efs, "%s:%s%s\n", Pname, (s1 == NULL) ? "" : s1, (s2 == NULL) ? "" : s2); if (t == FATAL) exit(1); Err = 1; return; } /* * Error3(len, word, sarg, narg) - process error in pass3 */ void Error3(len, word, sarg, narg, msg) int len; /* length (negative is special */ char *word; /* word */ char *sarg; /* string argument */ int narg; /* numeric argument */ char *msg; /* message */ { if (len == MESSAGE) { (void) fprintf(Efs, "%s: (%s, %d) %s\n", Pname, (word == NULL) ? "" : word, narg, (sarg == NULL) ? "" : sarg); return; } (void) fprintf(Efs, "%s: pass3, len=%d, word=\"%s\", sarg=\"%s\", narg=%d%s%s\n", Pname, len, (word == NULL) ? "" : word, (sarg == NULL) ? "" : sarg, narg, (msg == NULL) ? "" : " - ", (msg == NULL) ? "" : msg); Err = 1; } /* * expand.c - macro expansion functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" /* * Expand(line) - expand macro or if/ie/el line */ void Expand(line) unsigned char *line; { unsigned char buf[2*MAXLINE]; /* line buffer */ unsigned char cmd[4]; /* nroff command */ int cmdl; /* command length */ int cmdx; /* cmd index in Macrotab[] */ int cond = 0; /* conditional statuses */ int i, j; /* temporary indexes */ int iflen; /* if statement length */ int invert; /* inversion status */ unsigned char *lp; /* line pointer */ int mx = -1; /* Macrotab[] index */ int n1, n2; /* temporary numbers */ int nargs = 0; /* number of arguments */ int nleft = 0; /* number of macro lines left */ char op; /* comparison operator */ int prevcond; /* previous condition (for else's) */ int ptr = -1; /* Macrotxt[] index */ int quote; /* quoted string status */ unsigned char *s1, *s2; /* temporary string pointers */ (void) sprintf((char *)buf, ".^= %d %s", NR, (char *)Inname); Pass2(buf); for (lp = line; *lp; ) { invert = regexec(Pat[1].pat, lp); prevcond = cond; cond = 0; if (regexec(Pat[0].pat, lp) == 0) { /* * Not conditional: - ! "^[.'](i[ef]|el)" */ cond = 1; iflen = 0; } else if (regexec(Pat[2].pat, lp)) { /* * Argument count comparison: - * "^[.']i[ef] !?\\n\(\.\$(>|>=|=|<|<=)[0-9] " */ iflen = strlen(".if \\n(.$=n ") + invert; s1 = lp + iflen - 3; op = *s1++; if (*s1 == '=' && (op == '>' || op == '<')) { s1++; op = (op == '>') ? 'G' : 'L'; } n1 = (int)(*s1 - '0'); switch (op) { case '=': if ((nargs - 1) == n1) cond = 1; break; case '<': if ((nargs - 1) < n1) cond = 1; break; case '>': if ((nargs - 1) > n1) cond = 1; break; case 'G': /* >= */ if ((nargs - 1) >= n1) cond = 1; break; case 'L': /* <= */ if ((nargs - 1) <= n1) cond = 1; } } else if (regexec(Pat[3].pat, lp)) { /* * Argument string comparison: - "^[.']i[ef] !?'\\\$[0-9]'[^']*' " */ iflen = strlen(".if '\\$n'") + invert; n1 = (int)(*(lp + iflen - 2) - '0'); if (n1 >= 0 && n1 < nargs) s1 = Args[n1]; else s1 = (unsigned char *)""; if ((s2 = (unsigned char *)strchr((char *)lp + iflen, '\'')) != NULL) { n2 = s2 - lp - iflen; if (strncmp((char *)s1, (char *)lp + iflen, n2) == 0) cond = 1; iflen += n2 + 2; } } else if (regexec(Pat[4].pat, lp)) { /* * Nroff or troff: - "^[.']i[ef] !?[nt] " */ iflen = strlen(".if n ") + invert; if (*(lp + iflen - 2) == 'n') cond = 1; } else if ((*lp == '.' || *lp == '\'') && strncmp((char *)lp+1, "el ", 3) == 0) { /* * Else clause: - "^[.']el " */ cond = 1 - prevcond; iflen = 4; } else { /* * Unknown conditional: */ cond = 1; iflen = 0; (void) sprintf((char *)buf, ".tm unknown .if/.ie form: %s", (char *)lp); lp = buf; } /* * Handle conditional. If case is true, locate predicate. * If predicate is an .i[ef], process it. */ if (invert) cond = 1 - cond; if (cond && iflen > 0) { lp += iflen; if (regexec(Pat[15].pat, lp)) continue; } /* * Do argument substitution, as necessary. */ if (cond && regexec(Pat[5].pat, lp)) { /* "\$[0-9]" ??? */ for (s1 = buf;;) { if ((n1 = Pat[5].pat->startp[0] - lp) > 0) { (void) strncpy((char *)s1, (char *)lp, n1); s1 += n1; } *s1 = '\0'; lp = Pat[5].pat->endp[0]; n1 = (int)(*(lp-1) - '0'); if (n1 >= 0 && n1 < nargs) { (void) strcpy((char *)s1, (char *)Args[n1]); s1 += strlen((char *)Args[n1]); } if (*lp == '\0') break; if (regexec(Pat[5].pat, lp) == 0) { (void) strcpy((char *)s1, (char *)lp); break; } } lp = buf; } /* * Check for nroff command. */ if (cond) { cmdl = 0; if (cond && (*lp == '.' || *lp == '\'')) { if ((*cmd = *(lp+1)) != '\0') { cmdl++; if ((*(cmd+1) = *(lp+2)) == ' ') *(cmd+1) = '\0'; else cmdl++; } } cmd[cmdl] = '\0'; } if (cond == 0) i = i; /* do nothing if condition is false */ else if (cmdl == 0 || ((cmdx = Findmacro(cmd, 0)) < 0)) Pass2(lp); else if (Sp >= MAXSP) { (void) sprintf((char *)buf, " macro nesting > %d", MAXSP); Error(WARN, LINE, (char *)buf, NULL); } else { /* * Stack macros. */ /* * Push stack. */ Sp++; Nleftstack[Sp] = nleft; Ptrstack[Sp] = ptr; Mxstack[Sp] = mx; Condstack[Sp] = cond; for (i = 10*Sp, j = 0; j < 10; i++, j++) { Argstack[i] = Args[j]; Args[j] = NULL; } /* * Start new stack entry. */ mx = cmdx; ptr = Macrotab[mx].bx; cond = 0; nleft = Macrotab[mx].ct; Args[0] = Newstr(cmd); /* * Parse arguments. */ for (s1 = lp + cmdl + 1, nargs = 1; nargs < 10;) { while (*s1 && (*s1 == ' ' || *s1 == '\t')) s1++; if (*s1 == '\0') break; if (*s1 == '"') { s1++; quote = 1; } else quote = 0; for (s2 = buf;;) { if (!quote && (*s1 == ' ' || *s1 == '\t')) { *s2 = '\0'; break; } if ((*s2 = *s1) == '\0') break; s1++; if (quote && *s2 == '"') { *s2 = '\0'; break; } s2++; } if (buf[0]) Args[nargs++] = Newstr(buf); } for (i = nargs; i < 10; i++) { Args[i] = NULL; } } /* * Unstack completed macros. */ while (nleft <= 0 && Sp >= 0) { nleft = Nleftstack[Sp]; mx = Mxstack[Sp]; ptr = Ptrstack[Sp]; cond = Condstack[Sp]; for (i = 10*Sp, j = 0, nargs = -1; j < 10; i++, j++) { Free(&Args[j]); if ((Args[j] = Argstack[i]) != NULL) nargs = j; } Sp--; nargs++; } /* * Get next line. */ if (nleft > 0) { lp = Macrotxt[ptr++]; nleft--; } else lp = (unsigned char *)""; } (void) sprintf((char *)buf, ".^# %d %s", NR, (char *)Inname); Pass2(buf); } </* * expr.c - expression support functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" /* * Asmcode(s, c) - assemble number/name code following backslash-character * definition - e. .g, "\\nPO" */ unsigned char * Asmcode(s, c) unsigned char **s; /* pointer to character after '\\' */ unsigned char *c; /* code destination (c[3]) */ { unsigned char *s1; s1 = *s + 1; c[0] = c[1] = c[2] = '\0'; if ((c[0] = *s1) == '(') { s1++; if ((c[0] = *s1) != '\0') { s1++; c[1] = *s1; } } return(s1); } /* * Delnum(nx) - delete number */ void Delnum(nx) int nx; /* number index */ { unsigned char buf[MAXLINE]; /* message buffer */ if (nx >= Nnr) { (void) sprintf((char *)buf, " bad Delnum(%d) index", nx); Error(FATAL, LINE, (char *)buf, NULL); } while (nx < (Nnr - 1)) { Numb[nx] = Numb[nx + 1]; nx++; } Nnr--; } /* * Findnum(n, v, e) - find or optionally enter number value */ Findnum(n, v, e) unsigned char *n; /* register name */ int v; /* value */ int e; /* 0 = find, don't enter * 1 = enter, don't find */ { int cmp, low, hi, mid; /* binary search controls */ unsigned char c[3]; /* name buffer */ c[0] = n[0]; c[1] = (n[1] == ' ' || n[1] == '\t') ? '\0' : n[1]; c[2] = '\0'; low = mid = 0; hi = Nnr - 1; while (low <= hi) { mid = (low + hi) / 2; if ((cmp = strncmp((char *)c, (char *)Numb[mid].nm, 2)) < 0) hi = mid - 1; else if (cmp > 0) low = mid + 1; else { if (e) Numb[mid].val = v; return(mid); } } if ( ! e) return(-1); if (Nnr >= MAXNR) Error(FATAL, LINE, " out of number registers at ", (char *)c); if (Nnr) { if (cmp > 0) mid++; for (hi = Nnr - 1; hi >= mid; hi--) Numb[hi+1] = Numb[hi]; } Nnr++; Numb[mid].nm[0] = c[0]; Numb[mid].nm[1] = c[1]; Numb[mid].val = v; return(mid); } /* * Findparms(n) - find parameter registers */ Findparms(n) unsigned char *n; /* parameter name */ { unsigned char c[3]; /* character buffer */ int i; /* temporary index */ c[0] = n[0]; c[1] = (n[1] == ' ' || n[1] == '\t') ? '\0' : n[1]; c[2] = '\0'; for (i = 0; Parms[i].nm[0]; i++) { if (c[0] == Parms[i].nm[0] && c[1] == Parms[i].nm[1]) return(i); } return(-1); } /* * Findscale(n, v, e) - find and optionally enter scaling factor value */ Findscale(n, v, e) int n; /* scaling factor name */ double v; /* value */ int e; /* 0 = find, don't enter * 1 = enter, don't find */ { int i; double *pval; for (i = 0; Scale[i].nm; i++) { if ((unsigned char )n == Scale[i].nm) break; } if (Scale[i].nm) { if (e) { pval = &Scale[i].val; *pval = v; } return(i); } return(-1); } /* Newsgroups: mod.std.unix Subject: public domain AT&T getopt source Date: 3 Nov 85 19:34:15 GMT Here's something you've all been waiting for: the AT&T public domain source for getopt(3). It is the code which was given out at the 1985 UNIFORUM conference in Dallas. I obtained it by electronic mail directly from AT&T. The people there assure me that it is indeed in the public domain. */ /*LINTLIBRARY*/ #define NULL 0 #define EOF (-1) #define ERR(s, c) if(opterr){\ extern int strlen(), write();\ char errbuf[2];\ errbuf[0] = c; errbuf[1] = '\n';\ (void) write(2, argv[0], (unsigned)strlen(argv[0]));\ (void) write(2, s, (unsigned)strlen(s));\ (void) write(2, errbuf, 2);} extern int strcmp(); extern char *strchr(); int opterr = 1; int optind = 1; int optopt; char *optarg; int getopt(argc, argv, opts) int argc; char **argv, *opts; { static int sp = 1; register int c; register char *cp; if(sp == 1) if(optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return(EOF); else if(strcmp(argv[optind], "--") == NULL) { optind++; return(EOF); } optopt = c = argv[optind][sp]; if(c == ':' || (cp=strchr(opts, c)) == NULL) { ERR(": illegal option -- ", c); if(argv[optind][++sp] == '\0') { optind++; sp = 1; } return('?'); } if(*++cp == ':') { if(argv[optind][sp+1] != '\0') optarg = &argv[optind++][sp+1]; else if(++optind >= argc) { ERR(": option requires an argument -- ", c); sp = 1; return('?'); } else optarg = argv[optind++]; sp = 1; } else { if(argv[optind][++sp] == '\0') { sp = 1; optind++; } optarg = NULL; } return(c); } /* * macsup.c - macro processing support functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" /* * Delmacro(mx) - delete macro */ Delmacro(mx) int mx; /* macro index */ { unsigned char buf[MAXLINE]; /* error message buffer */ int i, j; /* temporary indexes */ if (mx >= Nmac) { (void) sprintf((char *)buf, " bad Delmacro(%d) index", mx); Error(FATAL, LINE, (char *)buf, NULL); } for (i = Macrotab[mx].bx, j = i + Macrotab[mx].ct; i < j; i++) { Free(&Macrotxt[i]); } for (i = mx; i < (Nmac - 1); i++) { Macrotab[i] = Macrotab[i+1]; } Nmac--; } /* * Field(n, p, c) - skip to field n in p and optionally return a copy */ unsigned char * Field(n, p, c) int n; /* field number */ unsigned char *p; /* pointer to line containing fields */ int c; /* 1: make a copy of the field */ { unsigned char *fs, *fe, *s; if (c) Free(&F); fe = p; while (n) { while (*fe == ' ' || *fe == '\t') fe++; fs = fe; while (*fe && *fe != ' ' && *fe != '\t') fe++; if (fs == fe) return(NULL); if (n == 1) { if ( ! c) return(fs); if ((F = (unsigned char *)malloc((size_t)(fe - fs + 1))) == NULL) Error(FATAL, LINE, " Field out of string space", NULL); (void) strncpy((char *)F, (char *)fs, (fe - fs)); F[fe -fs] = '\0'; return(F); } n--; } return(NULL); } /* * Findmacro(p, e) - find macro and optionally enter it * * return = Macrotab[] index or -1 if not found */ Findmacro(p, e) unsigned char *p; /* pointer to 2 character macro name */ int e; /* 0 = find, don't enter * 1 = enter, don't find */ { unsigned char c[3]; int cmp, hi, low, mid; c[0] = p[0]; c[1] = (p[1] == ' ' || p[1] == '\t') ? '\0' : p[1]; c[2] = '\0'; low = mid = 0; hi = Nmac - 1; while (low <= hi) { mid = (low + hi) / 2; if ((cmp = strncmp((char *)c, (char *)Macrotab[mid].name, 2)) < 0) hi = mid - 1; else if (cmp > 0) low = mid + 1; else { if ( ! e) return(mid); Error(WARN, LINE, " duplicate macro ", (char *)c); hi = Macrotab[mid].bx + Macrotab[mid].ct; for (low = Macrotab[mid].bx; low < hi; low++) { Free(&Macrotxt[low]); } goto new_macro; } } if ( ! e) return(-1); if (Nmac >= MAXMACRO) Error(FATAL, LINE, " macro table full at ", (char *)c); if (Nmac) { if (cmp > 0) mid++; for (hi = Nmac - 1; hi >= mid; hi--) Macrotab[hi+1] = Macrotab[hi]; } Nmac++; Macrotab[mid].name[0] = c[0]; Macrotab[mid].name[1] = c[1]; new_macro: Macrotab[mid].bx = -1; Macrotab[mid].ct = 0; return(mid); } void Free(p) unsigned char **p; { if (*p != NULL) { (void) free(*p); *p = NULL; } } /* * Newstr(s) - allocate space for string */ unsigned char * Newstr(s) unsigned char *s; { unsigned char *ns; if ((ns = (unsigned char *)malloc((size_t)(strlen((char *)s) + 1))) == NULL) Error(FATAL, LINE, " Newstr out of malloc space at ", (char *)s); (void) strcpy((char *)ns, (char *)s); return(ns); } .^b HF 1 .^b fh 1 .\"----------------- .de TH .ds LH "\\$1(\\$2) .ds CH "Minix Programmer's Manual .ds RH "\\$1(\\$2) .ds LF " .ds CF "\\$3 .ds RF "% .. .\"----------------- .de AT .. .\"----------------- .de IX .. .\"----------------- .de NB .ds nb "\\$1 .lF .. .\"----------------- .de BY .ds by "\\$1 .lF .. .\"----------------- .de UC .BY "\\$1BSD" .. .\"----------------- .\" common initialization for headers and paragraphs: .In need .de In .ne \\$1 .sp \\n(PDu .fi .in 0 .ti 0 .in \\n(inu .it .ft R .ns .. .\"----------------- .de SH .In 6 .in 0 .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .nr in 5n .in \\n(inu .. .\"----------------- .de SS .In 6 .in 2n .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .in \\n(inu .. .\"----------------- .de LP .In 4 .. .\"----------------- .de PP .LP .. .\"----------------- .de P .LP .. .\"----------------- .de HP .In 4 .if \\n(.$>0 .ti 0-\\$1 .if \\n(.$=0 .ti 0-\\n(tpu .. .\"----------------- .de TP .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .it 1 tP .. .\"----------------- .de IP .ie \\n(.$>1 .TP "\\$2" .el .TP \&\\$1 .. .\"----------------- .de I .ft I .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de B .ft B .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de SB .\" Can't reduce size, just do bold .ft B .it 1 fR .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de IR \&\\fI\\$1\\fR\\$2\\fI\\$3\\fR\\$4\\fI\\$5\\fR\\$6\\fI\\$7\\fR\\$8\\fI\\$9\\fR .. .\"----------------- .de RI \&\\$1\\fI\\$2\\fR\\$3\\fI\\$4\\fR\\$5\\fI\\$6\\fR\\$7\\fI\\$8\\fR\\$9 .. .\"----------------- .de BR \&\\fB\\$1\\fR\\$2\\fB\\$3\\fR\\$4\\fB\\$5\\fR\\$6\\fB\\$7\\fR\\$8\\fB\\$9\\fR .. .\"----------------- .de RB \&\\$1\\fB\\$2\\fR\\$3\\fB\\$4\\fR\\$5\\fB\\$6\\fR\\$7\\fB\\$8\\fR\\$9 .. .\"----------------- .de BI \&\\fB\\$1\\fI\\$2\\fB\\$3\\fI\\$4\\fB\\$5\\fI\\$6\\fB\\$7\\fI\\$8\\fB\\$9\\fR .. .\"----------------- .de IB \&\\fI\\$1\\fB\\$2\\fI\\$3\\fB\\$4\\fI\\$5\\fB\\$6\\fI\\$7\\fB\\$8\\fI\\$9\\fR .. .\"----------------- .de SM .\" no-op .if \\n(.$>0 \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de DT .ta +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 +8 .. .\"----------------- .de TA .ta \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .. .\"----------------- .de RS .in +5n .. .\"----------------- .de RE .in -5n .. .de DS .br .. .de DE .br .. .\"----------------- .de PD .ie \\n(.$=0 .nr PD 0.3v .el .nr PD \\$1n .. .\"----------------- .\" misc. initialization .nr tp 5n .PD .ds lq \&" .ds rq \&" .ds R \(rg .ds S " .ds Tm (TM) .nr )P 1v .^b HF 1 .^b fh 0 .^b NH .\"----------------- .de r .ie \\n(.$=0 .ft R .el \\fR\\$1\\fP\\$2 .. .\"----------------- .de i .ie \\n(.$=0 .ft I .el \\fI\\$1\\fP\\$2 .. .\"----------------- .de b .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de UX \\$2UNIX\\$1 .. .\"----------------- .de DA .ds DY "\\$1 \\$2 \\$3 .\" keep trailing spaces out of CF .if \\n(.$=1 .ds CF "\\$1 .if \\n(.$=2 .ds CF "\\$1 \\$2 .if \\n(.$>2 .ds CF "\\$1 \\$2 \\$3 .. .\"----------------- .de ND .\" it's our default, ignore it .. .\"----------------- .de TL .rs .sp 5 .ft B .ce 9999 .. .\"----------------- .de AU .sp 2 .ft R .. .\"----------------- .de AI .sp .ft R .. .\"----------------- .de AB .sp 2 .ce 0 .ll -7n .in +7n .. .\"----------------- .de AE .sp .ll .in .. .\" common initialization for headers and paragraphs: .In need extraspace .de In .ne \\$1 .sp \\n(Tsu .nr Ts 0 .ie \\n(.$>1 .nr iN \\$2v .el .nr iN 0 .sp \\n(psu+\\n(iNu .ce 0 .ft R .in 0 .ti 0 .in \\n(inu .ll \\n(LLu .ns .fi .. .\"----------------- .de uh .\" unnumbered section head .nr in 0 .In 6 1 .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de sh .\" numbered section head .nr in 0 .In 6 1 .ft B .\" punt to awk code to get the header numbering right .nH \\$1 .\" and pick up the result \&\\*(Nh \\$2 .ft R .. .\"----------------- .de lp .\" left-blocked paragraph .In 4 .. .\"----------------- .de pp .\" paragraph, first line indented .In 4 .ti \\n(piu .. .\"----------------- .de tp .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .\" .it 1 tP .. .\"----------------- .de ip .\" indented paragraph .ie \\n(.$>1 .tp "\\$2" .el .tp 4n \&\\$1 .. .\"----------------- .de np .\" numbered paragraph .nr $p +1 \" increment paragraph number .ip (\n($p) .. .\"----------------- .de bu .\" bulleted paragraph .ip \(bu .. .\"----------------- .de (q .\" begin major quote .nr in +5n .nr LL -5n .In 4 .. .\"----------------- .de )q .\" end major quote .sp .nr in -5n .nr LL +5n .In 4 .. .\"----------------- .de (l .\" begin list .In 5 .if '\\$1'C' .ce 9999 .if '\\$1'' .in +5n .if '\\$1'L' .in 0 .nf .. .\"----------------- .de )l .\" end list .In 3 .sp .rs .. .\"----------------- .de u \&\\fI$1\\fP .. .\"----------------- .de sm .. .\"----------------- .\" exdented paragraph macro borrowed from Berkeley -ms .de XP .lp .in \\n(piu .ti .. .\"----------------- .\" the -ms accent strings .ds ' "'\b .ds ` "`\b .ds : ":\b .ds ^ "^\b .ds ~ "~\b .ds C "v\b .ds , ",\b .\" post-title spacing (set to 4v if using .TL macro) .nr Ts 0v .\" and parameter setup .nr LL 6i .ll \n(LLu .nr ps 0.3v .nr pi 5n .\" -mnx macros for the Minix "Book manual pages". Author: Kees J. Bot .\" 19 Nov 1994 .\" Uses -ms: .so /usr/lib/cawf/ms.mac .tr ~ .ds OQ \&' .ds CQ \&' .ds SQ \&' .ds M0 MINIX .ds M1 \\s-1MINIX\\s+1 .ds M2 \\s-2MINIX\\s+2 .ds M9 \\s-1MINIX\\s+1 .ds m0 minix .de MX \s-2MINIX\s+2\\$1 .. .de Ux \s-2UNIX\s+2\\$1 .. .ds Mx \\s-1MINIX\\s0 .ds Mp \\s-1MINIX-PC\\s0 .ds Ms \\s-1MINIX-ST\\s0 .ds M0 MINIX .ds M1 MINIX .ds M2 MINIX .ds M9 MINIX .ds Mx MINIX .ds Mp MINIX-PC .ds Ms MINIX-ST .de CD .LP .ne 2 .ta 11m 15m 36m .ds SX Syntax: .ds FL Flags: .ds EX Examples: .ds EY Example: .in +16m .ti -16m \\fBCommand:\& \\$1\\fR .in -16m .br .. .de SX .in +16m .ti -16m \\fB\*(SX\& \\$1 .in -16m .ds SX .br .. .de FL .in +15m .ti -15m \\fB\*(FL\& \\fB\\$1 \\fR\\$2 .in -15m .ds FL .br .. .de EX .br .in +38m .ti -38m \\fB\*(EX\& \\fR\\$1 \\fR# \\$2 .in -38m .ds EX .ds EY .br .. .de EY .br .in +38m .ti -38m \\fB\*(EY\& \\fR\\$1 \\fR# \\$2 .in -38m .ds EX .ds EY .br .. .de Cx .in +8 .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .in -8 .. .de DI .ft B \&\\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 .ft R .. .de SY \\$3\\$1\\$2 .. .de HS .sp 0.5 .. .de SP .sp .. .\" Major section (normally numbered) .de SE .sp 1 \fB\\$1\fP .sp 1 .. .\" Subsection (normally numbered) .de SS .sp 1 \fB\\$1\fP .. .de UU .SH \\$1 .sp 1 .. .\" Start list .de LI .in +0.25i .ll -0.25i .HS .. .\" End list .de LX .sp 1 .in -0.25i .ll +0.25i .LP .. .\" List item .de IT .HS .. .\"Short unnumbered lines .de UN .HS .. .^b HF 1 .^b fh 0 .^b NH .\"----------------- .de R .ie \\n(.$=0 .ft R .el \\fR\\$1\\fP\\$2 .. .\"----------------- .de I .ie \\n(.$=0 .ft I .el \\fI\\$1\\fP\\$2 .. .\"----------------- .de B .ie \\n(.$=0 .ft B .el \\fB\\$1\\fP\\$2 .. .\"----------------- .de UX \\$2UNIX\\$1 .. .\"----------------- .de DA .ds DY "\\$1 \\$2 \\$3 .\" keep trailing spaces out of CF .if \\n(.$=1 .ds CF "\\$1 .if \\n(.$=2 .ds CF "\\$1 \\$2 .if \\n(.$>2 .ds CF "\\$1 \\$2 \\$3 .. .\"----------------- .de ND .\" it's our default, ignore it .. .\"----------------- .de TL .rs .sp 5 .ft B .ce 9999 .. .\"----------------- .de AU .sp 2 .ft R .. .\"----------------- .de AI .sp .ft R .. .\"----------------- .de AB .sp 2 .ce 0 .ll -7n .in +7n .. .\"----------------- .de AE .sp .ll .in .. .\"----------------- .\" common initialization for headers and paragraphs: .In need extraspace .de In .ne \\$1 .sp \\n(Tsu .nr Ts 0 .ie \\n(.$>1 .nr iN \\$2v .el .nr iN 0 .sp \\n(PDu+\\n(iNu .ce 0 .ft R .in 0 .ti 0 .in \\n(inu .ll \\n(LLu .ns .fi .. .\"----------------- .de SH .nr in 0 .In 6 1 .ft B .. .\"----------------- .de NH .nr in 0 .In 6 1 .ft B .\" punt to awk code to get the header numbering right .nH \\$1 .\" and pick up the result \&\\*(Nh .. .\"----------------- .de LP .In 4 .. .\"----------------- .de PP .In 4 .ti \\n(PIu .. .\"----------------- .de TP .In 4 .if \\n(.$>0 .nr tp \\$1n .in \\n(inu+\\n(tpu .ti 0-\\n(tpu .it 1 tP .. .\"----------------- .de IP .ie \\n(.$>1 .TP "\\$2" .el .TP 4n \&\\$1 .. .\"----------------- .de QP .In 4 .in +5n .ll -5n .. .\"----------------- .de QS .nr in +5n .nr LL -5n .In 4 .. .\"----------------- .de QE .nr in -5n .nr LL +5n .In 4 .. .\"----------------- .de DS .In 5 .if '\\$1'C' .ce 9999 .if '\\$1'' .in +5n .nf .. .\"----------------- .de CD .In 5 .ce 9999 .nf .. .\"----------------- .de LD .In 5 .nf .. .\"----------------- .de ID .In 5 .in +5n .nf .. .\"----------------- .de DE .In 3 .rs .. .\"----------------- .de RS .nr in +5n .in \\n(inu .. .\"----------------- .de RE .nr in -5n .in \\n(inu .. .\"----------------- .de UL \&\\fI$1\\fP .. .\"----------------- .de RP .. .\"----------------- .de LG .. .\"----------------- .de SM .. .\"----------------- .de NL .. .\"----------------- .\" the -ms accent strings .ds ' "'\b .ds ` "`\b .ds : ":\b .ds ^ "^\b .ds ~ "~\b .ds C "v\b .ds , ",\b .\" post-title spacing .nr Ts 4v .\" and parameter setup .nr LL 6i .ll \n(LLu .nr PD 0.3v .nr PI 5n /* * nreq.c - cawf(1) processing of nroff requests */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" #include /* * Prototypes for request processing functions. */ _PROTOTYPE(static void nr_UL,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_Ub,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_Uc,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_Uf,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_Ur,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_ad,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_bp,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_br,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_ce,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_di,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_ds,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_fi,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_fl,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_ft,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_it,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_na,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_nf,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_ns,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_rm,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_rn,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_rr,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_rs,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_tm,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_tr,(unsigned char *line, int brk)); _PROTOTYPE(static void nr_nil,(unsigned char *line, int brk)); /* * NrReqt[] - nroff request processing table * * CAUTION: place new entries in their proper alphabetical order, since * this table is processed with a binary search. */ static struct nr_req { char *nm; /* nroff request */ void (*fun)(); /* processing function */ } NrReqt[] = { { "\\\"", nr_nil }, /* backslash-quote */ { "^#", nr_UL }, { "^=", nr_UL }, { "^b", nr_Ub }, { "^c", nr_Uc }, { "^d", nr_nil }, { "^e", nr_nil }, { "^f", nr_Uf }, { "^r", nr_Ur }, { "^x", nr_nil }, { "ad", nr_ad }, { "bp", nr_bp }, { "br", nr_br }, { "ce", nr_ce }, { "di", nr_di }, { "ds", nr_ds }, { "fi", nr_fi }, { "fl", nr_fl }, { "ft", nr_ft }, { "i0", nr_nil }, { "it", nr_it }, { "lg", nr_nil }, { "li", nr_nil }, { "na", nr_na }, { "nf", nr_nf }, { "ns", nr_ns }, { "ps", nr_nil }, { "rm", nr_rm }, { "rn", nr_rn }, { "rr", nr_rr }, { "rs", nr_rs }, { "tm", nr_tm }, { "tr", nr_tr }, { "vs", nr_nil }, }; /* * Nreq(line, brk) - process miscellaneous nroff requests from line * buffer with request status of (brk) */ void Nreq(line, brk) unsigned char *line; int brk; { unsigned char c[3]; /* command buffer */ int cmp, hi, low, mid; /* binary search indixes */ c[0] = c[1] = c[2] = '\0'; if ((c[0] = line[1]) != '\0') c[1] = line[2]; low = mid = 0; hi = sizeof(NrReqt) / sizeof(struct nr_req); while (low <= hi) { mid = (low + hi) / 2; if ((cmp = strcmp((char *)c, NrReqt[mid].nm)) < 0) hi = mid - 1; else if (cmp > 0) low = mid + 1; else { (void) (*NrReqt[mid].fun)(line, brk); return; } } /* * Unknown request starting with a '.' or '\''.. */ Error(WARN, LINE, " unknown request", NULL); } /* * Adjust - "^[.']ad" */ static void nr_ad(line, brk) unsigned char *line; int brk; { Pass3(NOBREAK, (unsigned char *)"both", NULL, 0); } /* * Begin new page - "^[.']bp" */ static void nr_bp(line, brk) unsigned char *line; int brk; { Pass3(brk, (unsigned char *)"need", NULL, 999); } /* * Break - "^[.']br" */ static void nr_br(line, brk) unsigned char *line; int brk; { Pass3(brk, (unsigned char *)"flush", NULL, 0); } /* * Center - "^[.']ce" */ static void nr_ce(line, brk) unsigned char *line; int brk; { unsigned char *s; /* string poiner */ if ((s = Field(2, line, 0)) != NULL) Centering = atoi((char *)s); else Centering = 1; } /* * Diversion on and off - "^[.']di" */ static void nr_di(line, brk) unsigned char *line; int brk; { Pass3(DOBREAK, (unsigned char *)"flush", NULL, 0); Divert ^= 1; } /* * Define string - "^[.']ds" */ static void nr_ds(line, brk) unsigned char *line; int brk; { unsigned char buf[MAXLINE]; /* temporary buffer */ unsigned char nm[4], nm1[4]; /* name buffers */ unsigned char *s1, *s2, *s3, /* temporary string pointers */ *s4; if (Asmname(&line[3], nm) == 0) { Error(WARN, LINE, " no name", NULL); return; } s1 = Field(3, line, 0); s2 = Findstr(nm, s1, 1); while (*s2 == '\\' && *(s2 + 1) == '*') { s2++; s3 = Asmcode(&s2, nm1); s2 = Findstr(nm1, NULL, 0); } if (Hdft) { /* * Look for names LH, LF, CH, CF, RH, RF. */ if ((nm[0]=='L' || nm[0]=='C' || nm[0]=='R') && (nm[1]=='F' || nm[1]=='H')) { (void) sprintf((char *)buf, "%s", (char *)nm); Pass3(NOBREAK, buf, s2, 0); } } } /* * Fill - "^[.']fi" */ static void nr_fi(line, brk) unsigned char *line; int brk; { Fill = 1; Pass3(brk, (unsigned char *)"flush", NULL, 0); } /* * Flush - "^[.']fl" */ static void nr_fl(line, brk) unsigned char *line; int brk; { Pass3(brk, (unsigned char *)"flush", NULL, 0); } /* * Font - "^[.']ft " */ static void nr_ft(line, brk) unsigned char *line; int brk; { int i; /* temporary index */ if (line[3] == '\0' || line[4] == '\0') line[4] = 'P'; if (line[4] == 'P') { Font[0] = Prevfont; return; } for (i = 0; Fcode[i].nm; i++) { if (Fcode[i].nm == line[4]) break; } if (Fcode[i].status == '\0') { Error(WARN, LINE, " bad font code", NULL); return; } Prevfont = Font[0]; Font[0] = line[4]; } /* * Input trap - "^[.']it [1 ]" */ static void nr_it(line, brk) unsigned char *line; int brk; { unsigned char buf[MAXLINE]; /* temporary buffer */ int i; /* temporary index */ unsigned char *s1, *s2; /* temporary string pointers */ if ((s1 = Field(2, line, 0)) == NULL) { Free(&Aftnxt); return; } if ((i = atoi((char *)s1)) != 1) { Error(WARN, LINE, " first .it arg must be 1", NULL); return; } if ((s2 = Field(3, line, 0)) == NULL) Free(&Aftnxt); else { (void) sprintf((char *)buf, "%s,%s", (Aftnxt == NULL) ? "" : (char *)Aftnxt, (char *)s2); Free(&Aftnxt); Aftnxt = Newstr(buf); } } /* * Comment - "^[.']\\" - do nothing * * Debug - "^[.']\^d" - do nothing * * Finalization - "[.']\^e" - do nothing * * Error file - "^[.']\^x " - do nothing * * "^[.']i0", "^[.']lg" and "^[.']li" - do nothing * * Point size - "^[.']ps" - do nothing * * Vertical spacing - "^[.']vs" - do nothing * */ static void nr_nil(line, brk) unsigned char *line; int brk; { } /* * No adjust "^[.']na" */ static void nr_na(line, brk) unsigned char *line; int brk; { Pass3(NOBREAK, (unsigned char *)"left", NULL, 0); } /* * No fill - "^[.']nf" */ static void nr_nf(line, brk) unsigned char *line; int brk; { Fill = 0; Pass3(brk, (unsigned char *)"f<<<<<<<<<<<lush", NULL, 0); } /* * No space - "^[.']ns" */ static void nr_ns(line, brk) unsigned char *line; int brk; { Pass3(NOBREAK, (unsigned char *)"nospace", NULL, 0); } /* * Remove macro or string - "^[.']rm" */ static void nr_rm(line, brk) unsigned char *line; int brk; { int i; /* temporary index */ unsigned char nm[4]; /* name buffer */ if (Asmname(&line[3], nm) == 0) { Error(WARN, LINE, " no name", NULL); return; } if ((i = Findmacro(nm, 0)) >= 0) { Delmacro(i); return; } (void) Findstr(nm, NULL, 0); if (Sx >= 0) { Delstr(Sx); return; } Error(WARN, LINE, " no macro/string", NULL); } /* * Rename macro or string - "^[.']rn" */ static void nr_rn(line, brk) unsigned char *line; int brk; { int i, j; /* temporary indexes */ unsigned char nm[4], nm1[4]; /* name buffers */ unsigned char *s1; /* temporary string pointer */ if ((s1 = Field(2, line, 0)) == NULL || Asmname(s1, nm) == 0) { Error(WARN, LINE, " no name", NULL); return; } if ((s1 = Field(3, line, 0)) == NULL || Asmname(s1, nm1) == 0) { Error(WARN, LINE, " no new name", NULL); return; } if ((i = Findmacro(nm, 0)) >= 0) { if ((j = Findmacro(nm1, 0)) >= 0) Delmacro(j); j = Findmacro(nm1, 1); Macrotab[j].bx = Macrotab[i].bx; Macrotab[i].bx = -1; Macrotab[j].ct = Macrotab[i].ct; Macrotab[i].ct = 0; Delmacro(i); return; } (void) Findstr(nm, NULL, 0); if ((i = Sx) >= 0) { (void) Findstr(nm1, Str[i].str, 1); Delstr(i); return; } if (Findmacro(nm1, 0) < 0) (void) Findmacro(nm1, 1); } /* * Remove register - "^[.']rr" */ static void nr_rr(line, brk) unsigned char *line; int brk; { int i; /* temporary index */ unsigned char nm[4]; /* name buffer */ if (Asmname(&line[3], nm) == 0) { Error(WARN, LINE, " no name", NULL); return; } if ((i = Findnum(nm, 0, 0)) < 0) { Error(WARN, LINE, " no register", NULL); return; } Delnum(i); } /* * Resume space - "^[.']rs" */ static void nr_rs(line, brk) unsigned char *line; int brk; { Pass3(NOBREAK, (unsigned char *)"yesspace", NULL, 0); } /* * Message - "^[.']tm" */ static void nr_tm(line, brk) unsigned char *line; int brk; { Pass3(MESSAGE, Inname, (line[3] == ' ') ? &line[4] : &line[3], NR); } /* * Translate - "^[.']tr abcd..." */ static void nr_tr(line, brk) unsigned char *line; int brk; { unsigned char buf[MAXLINE]; /* temporary buffer */ int i, j; /* temporary indexes */ unsigned char nm[4], nm1[4]; /* name buffers */ unsigned char *s1, *s2; /* temporary string pointers */ int trin, trout; /* types: 0 = char; 1 = named char */ unsigned char xbuf[MAXLINE]; /* temporary buffer */ if (line[3] != ' ') { Error(WARN, LINE, " unknown translation", NULL); return; } for (s1 = &line[4]; *s1;) { nm[1] = nm[2] = '\0'; s2 = s1 + 1; /* * Assemble the input value. */ if (*s1 == '\\' && (*s2 == '*' || *s2 == '(')) { if (*s2 == '(') { /* * Input is named character -- "\(xx". */ trin = 1; s1 = s2 + 1; if ((nm[0] = *s1) != '\0') { s1++; if ((nm[1] = *s1) != '\0') s1++; } } else { /* * Input is interpolated string -- "\*x" or "\*(xx". */ s1 = Asmcode(&s2, nm); if (*s1) s1++; s2 = Findstr(nm, NULL, 0); if (*s2 != '\0') { if ((strlen((char *)s2) + strlen((char *)s1) + 1) >= MAXLINE) Error(WARN, LINE, " string too long: ", (char *)nm); else { (void) sprintf((char *)buf, "%s%s", (char *)s2, (char *)s1); (void) strcpy((char *)xbuf, (char *)buf); s1 = xbuf; } } continue; } } else { /* * Input is a simple character. */ trin = 0; if ((nm[0] = *s1) != '\0') s1++; } /* * Assemble the output value. */ assemble_output: nm1[1] = nm1[2] = '\0'; if (*s1 == '\0') { /* * Supply a space if there is no output character. */ trout = 0; nm1[0] = ' '; } else { s2 = s1 + 1; if (*s1 == '\\' && (*s2 == '(' || *s2 == '*')) { if (*s2 == '(') { /* * The output is a named character -- "\(xx". */ trout = 1; s1 = s2 + 1; if ((nm1[0] = *s1) != '\0') { s1++; if ((nm1[1] = *s1) != '\0') s1++; } } else { /* * The output is an interpolated string -- * "\*x" or "\*(xx". */ s1 = Asmcode(&s2, nm1); if (*s1) s1++; s2 = Findstr(nm1, NULL, 0); if (*s2 != '\0') { /* * Interpolate a string value. */ if ((strlen((char *)s2) + strlen((char *)s1) + 1) >= MAXLINE) Error(WARN, LINE, " string too long: ", (char *)nm); else { (void) sprintf((char *)buf, "%s%s", (char *)s2, (char *)s1); (void) strcpy((char *)xbuf, (char *)buf); s1 = xbuf; } } goto assemble_output; } } else { trout = 0; if ((nm1[0] = *s1) != '0') s1++; else nm1[0] = ' '; } } /* * Do the translation. */ switch (trin) { case 0: /* simple char */ switch (trout) { case 0: /* to simple char */ Trtbl[(int)nm[0]] = nm1[0]; break; case 1: /* to named char */ if ((i = Findchar(nm1, 0, NULL, 0)) < 0 || strlen((char *)Schar[i].str) != 1) Error(WARN, LINE, " bad named character: ", (char *)nm1); else Trtbl[(int)nm[0]] = *(Schar[i].str); break; } break; case 1: /* named char */ if ((i = Findchar(nm, 0, NULL, 0)) < 0) Error(WARN, LINE, " unknown named character: ", (char *)nm); else { switch (trout) { case 0: /* to simple char */ Free(&Schar[i].str); Schar[i].str = Newstr(nm1); Schar[i].len = 1; break; case 1: /* to named char */ if ((j = Findchar(nm1, 0, NULL, 0)) < 0) Error(WARN, LINE, " unknown named character: ", (char *)nm1); else (void) Findchar(nm, Schar[j].len, Schar[j].str, 1); break; } } break; } } } /* * Initialization - "^[.']\^b (fh|HF|NH) [01]" * * fh = first page header status * HF = header/footer status * NH = initialize number headers */ static void nr_Ub(line, brk) unsigned char *line; int brk; { int i; /* temporary index */ unsigned char *s1, *s2; /* temporary string pointers */ if ((s1 = Field(2, line, 0)) == NULL) return; if ((s2 = Field(3, line, 0)) == NULL) i = 0; else i = atoi((char *)s2); if (s1[0] == 'f' && s1[1] == 'h') Pass3(NOBREAK, (unsigned char *)"fph", NULL, i); else if (s1[0] == 'H' && s1[1] == 'F') Hdft = i; else if (s1[0] == 'N' && s1[1] == 'H') { for (i = 0; i < MAXNHNR; i++) Nhnr[i] = 0; } else Error(WARN, LINE, " unknown initialization", NULL); } /* * Character definitions - "^[.']\^c" */ static void nr_Uc(line, brk) unsigned char *line; int brk; { unsigned char buf[MAXLINE]; /* temporary buffer */ int i; /* temporary index */ unsigned char *s1, *s2, *s3, /* temporary string pointers */ *s4, *s5; s2 = Field(2, line, 0); i = atoi((char *)Field(3, line, 0)); s4 = Field(4, line, 0); if (i < 0 || i > MAXLINE/2 || *s2 == '\0') { Error(WARN, LINE, " bad character definition", NULL); return; } if (s4 == NULL) s4 = (unsigned char *)""; else if (*s4 == '"') s4++; s1 = buf; while ((s5 = (unsigned char *)strchr((char *)s4, '\\')) != NULL) { while (s5 > s4) *s1++ = *s4++; s4 = ++s5; if (*s5 == '\\') *s1++ = '\\'; else if (*s5 == 'b') *s1++ = '\b'; if (*s4) s4++; } while (*s1++ = *s4++) ; if (*s2 == 'h' && *(s2+1) == 'y') (void) Findhy(buf, i, 1); else (void) Findchar(s2, i, buf, 1); } /* * Font is OK - "[.']\^f " */ static void nr_Uf(line, brk) unsigned char *line; int brk; { int i; /* temporary index */ if (line[3] != '\0' && line[4] != '\0') { for (i = 0; Fcode[i].nm; i++) { if (line[4] == Fcode[i].nm) { Fcode[i].status = '1'; return; } } } Error(WARN, LINE, " unknown font", NULL); } /* * Resolutions - "[.']\^r cpi horizontal vertical" */ static void nr_Ur(line, brk) unsigned char *line; int brk; { unsigned char buf[MAXLINE]; /* temporary buffer */ int i, j; /* temporary indexes */ double tval; /* temporary value */ if ((i = atoi((char *)Field(3, line, 0))) <= 0 || (j = atoi((char *)Field(4, line, 0))) <= 0) { Error(WARN, LINE, " bad cpi resolutions", NULL); return; } tval = (double) (240.0 / (double) i); if (Findscale((int)'m', tval, 1) < 0) Error(FATAL, LINE, " missing Scal['m']", NULL); Scalen = tval; if (Scalen <= 0.0) { (void) sprintf((char *)buf, " bad Scale['n'] (%f)", Scalen); Error(FATAL, LINE, (char *)buf, NULL); } if (Findscale((int)'n', tval, 1) < 0) Error(FATAL, LINE, " missing Scale['n']", NULL); Scalev = (double) (240.0 / (double) j); if (Scalev <= 0.0) { (void) sprintf((char *)buf, " bad Scale['v'] (%f)", Scalen); Error(FATAL, LINE, (char *)buf, NULL); } if (Findscale((int)'v', Scalev, 1) < 0) Error(FATAL, LINE, " missing Scale['v']", NULL); } /* * Set line number and file name - "^[.']\^# " * * Lock line number and file name - "^[.']\^= " */ static void nr_UL(line, brk) unsigned char *line; int brk; { unsigned char *s1; /* temporary string pointer */ if ((s1 = Field(2, line, 0)) != NULL) P2il = atoi((char *)s1) - 1; else P2il = 0; Lockil = (line[2] == '#') ? 0 : 1; Free(&P2name); if (Field(3, line, 1) != NULL) { P2name = F; F = NULL; } else P2name = NULL; } /* * output-c - output support functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" /* * LenprtHF(s, p, t) - get length of print header or footer with page number * interpolation */ LenprtHF(s, p, t) unsigned char *s; /* header/footer string */ int p; /* page number */ int t; /* type: 0 = get interpolated length * 1 = print */ { unsigned char buf[10]; /* buffer for page number */ int len; /* line length */ unsigned char *s1; /* temporary string pointer */ if (s == NULL) return(0); for (len = 0; *s && *s != '%'; s++) { len++; if (t) Charput((int)*s); } if (*s) { (void) sprintf((char *)buf, "%d", p); for (s1 = buf; *s1; s1++) { len++; if (t) Charput((int)*s1); } for (s++; *s; s++) { len++; if (t) Charput((int)*s); } } return(len); } /* * Charput(s) - put a character to output, subject to diversion */ void Charput(c) int c; /* character to put */ { if (Divert == 0) putchar((unsigned char)c); } /* * Stringput(s) - put a string to output, subject to diversion */ void Stringput(s) unsigned char *s; /* string to put */ { if (Divert == 0) fputs((char *)s, stdout); } /* * pass2.c - cawf(1) pass 2 function */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" #include /* * Pass2(line) - process the nroff requests in a line and break * text into words for pass 3 */ void Pass2(line) unsigned char *line; { int brk; /* request break status */ unsigned char buf[MAXLINE]; /* working buffer */ unsigned char c; /* character buffer */ double d; /* temporary double */ double exscale; /* expression scaling factor */ double expr[MAXEXP]; /* expressions */ unsigned char exsign[MAXEXP]; /* expression signs */ int i, j; /* temporary indexes */ int inword; /* word processing status */ int nexpr; /* number of expressions */ unsigned char nm[4], nm1[4]; /* names */ int nsp; /* number of spaces */ unsigned char op; /* expression term operator */ unsigned char opstack[MAXSP]; /* expression operation stack */ unsigned char period; /* end of word status */ unsigned char *s1, *s2, *s3; /* temporary string pointers */ double sexpr[MAXEXP]; /* signed expressions */ int sp; /* expression stack pointer */ unsigned char ssign; /* expression's starting sign */ int tabpos; /* tab position */ double tscale; /* term scaling factor */ double tval; /* term value */ double val; /* term value */ double valstack[MAXSP]; /* expression value stack */ unsigned char xbuf[MAXLINE]; /* expansion buffer */ if (line == NULL) { /* * End of macro expansion. */ Pass3(DOBREAK, (unsigned char *)"need", NULL, 999); return; } /* * Adjust line number. */ if (Lockil == 0) P2il++; /* * Empty line - "^[ \t]*$" or "^\\\"". */ if (regexec(Pat[6].pat, line) || strncmp((char *)line, "\\\"", 2) == 0) { Pass3(DOBREAK, (unsigned char *)"space", NULL, 0); return; } /* * Line begins with white space. */ if (*line == ' ' || *line == '\t') { Pass3(DOBREAK, (unsigned char *)"flush", NULL, 0); Pass3(0, (unsigned char *)"", NULL, 0); } if (*line != '.' && *line != '\'') { /* * Line contains text (not an nroff request). */ if (Font[0] == 'R' && Backc == 0 && Aftnxt == NULL && regexec(Pat[7].pat, line) == 0) { /* * The font is Roman, there is no "\\c" or "after next" * trap pending and and the line has no '\\', '\t', '-', * or " " (regular expression "\\|\t|-| "). * * Output each word of the line as " ". */ for (s1 = line;;) { while (*s1 && *s1 == ' ') s1++; if (*s1 == '\0') break; for (s2 = s1, s3 = buf; *s2 && *s2 != ' ';) *s3++ = Trtbl[(int)*s2++]; *s3 = '\0'; Pass3((s2 - s1), buf, NULL, 0); s1 = *s2 ? ++s2 : s2; } /* * Line terminates with punctuation and optional * bracketing (regular expression "[.!?:][\])'\"*]*$"). */ if (regexec(Pat[8].pat, line)) Pass3(NOBREAK, (unsigned char *)"gap", NULL, 2); if (Centering > 0) { Pass3(DOBREAK,(unsigned char *)"center", NULL, 0); Centering--; } else if (Fill == 0) Pass3(DOBREAK, (unsigned char *)"flush", NULL, 0); return; } /* * Line must be scanned a character at a time. */ inword = nsp = tabpos = 0; period = '\0'; for (s1 = line;; s1++) { /* * Space or TAB causes state transition. */ if (*s1 == '\0' || *s1 == ' ' || *s1 == '\t') { if (inword) { if (!Backc) { Endword(); Pass3(Wordl, Word, NULL, 0); if (Uhyph) { Pass3(NOBREAK, (unsigned char *)"nohyphen", NULL, 0); } } inword = 0; nsp = 0; } if (*s1 == '\0') break; } else { if (inword == 0) { if (Backc == 0) { Wordl = Wordx = 0; Uhyph = 0; } Backc = 0; inword = 1; if (nsp > 1) { Pass3(NOBREAK, (unsigned char *)"gap", NULL, nsp); } } } /* * Process a character. */ switch (*s1) { /* * Space */ case ' ': nsp++; period = '\0'; break; /* * TAB */ case '\t': tabpos++; if (tabpos <= Ntabs) { Pass3(NOBREAK, (unsigned char *)"tabto", NULL, Tabs[tabpos-1]); } nsp = 0; period = '\0'; break; /* * Hyphen if word is being assembled */ case '-': if (Wordl <= 0) goto ordinary_char; if ((i = Findhy(NULL, 0, 0)) < 0) { Error(WARN, LINE, " no hyphen for font ", (char *)Font); return; } Endword(); Pass3(Wordl, Word, NULL, Hychar[i].len); Pass3(NOBREAK, (unsigned char *)"userhyphen", Hychar[i].str, Hychar[i].len); Wordl = Wordx = 0; period = '\0'; Uhyph = 1; break; /* * Backslash */ case '\\': s1++; switch(*s1) { /* * Comment - "\\\"" */ case '"': while (*(s1+1)) s1++; break; /* * Change font - "\\fN" */ case 'f': s1 = Asmcode(&s1, nm); if (nm[0] == 'P') { Font[0] = Prevfont; break; } for (i = 0; Fcode[i].nm; i++) { if (Fcode[i].nm == nm[0]) break; } if (Fcode[i].nm == '\0' || nm[1] != '\0') { Error(WARN, LINE, " unknown font ", (char *)nm); break; } if (Fcode[i].status != '1') { Error(WARN, LINE, " font undefined ", (char *)nm); break; } else { Prevfont = Font[0]; Font[0] = nm[0]; } break; /* * Positive horizontal motion - "\\h\\n(NN" or * "\\h\\nN" */ case 'h': if (s1[1] != '\\' || s1[2] != 'n') { Error(WARN, LINE, " no \\n after \\h", NULL); break; } s1 +=2; s1 = Asmcode(&s1, nm); if ((i = Findnum(nm, 0, 0)) < 0) goto unknown_num; if ((j = Numb[i].val) < 0) { Error(WARN, LINE, " \\h < 0 ", NULL); break; } if (j == 0) break; if ((strlen((char *)s1+1) + j + 1) >= MAXLINE) goto line_too_long; for (s2 = &xbuf[1]; j; j--) *s2++ = ' '; (void) strcpy((char *)s2, (char *)s1+1); s1 = xbuf; break; /* * Save current position in register if "\\k" */ case 'k': s1 = Asmcode(&s1, nm); if ((i = Findnum(nm, 0, 0)) < 0) i = Findnum(nm, 0, 1); Numb[i].val = (int)((double)Outll * Scalen); break; /* * Interpolate number - "\\n(NN" or "\\nN" */ case 'n': s1 = Asmcode(&s1, nm); if ((i = Findnum(nm, 0, 0)) < 0) { unknown_num: Error(WARN, LINE, " unknown number register ", (char *)nm); break; } (void) sprintf((char *)buf, "%d", Numb[i].val); if ((strlen((char *)buf) + strlen((char *)s1+1) + 1) >= MAXLINE) { line_too_long: Error(WARN, LINE, " line too long", NULL); break; } (void) sprintf((char *)buf, "%d%s", Numb[i].val, (char *)s1+1); (void) str<<<<<<<<<<<<<cpy((char *)&xbuf[1], (char *)buf); s1 = xbuf; break; /* * Change size - "\\s[+-][0-9]" - NOP */ case 's': s1++; if (*s1 == '+' || *s1 == '-') s1++; while (*s1 && isdigit(*s1)) s1++; s1--; break; /* * Continue - "\\c" */ case 'c': Backc = 1; break; /* * Interpolate string - "\\*(NN" or "\\*N" */ case '*': s1 = Asmcode(&s1, nm); s2 = Findstr(nm, NULL, 0); if (*s2 != '\0') { if ((strlen((char *)s2) + strlen((char *)s1+1) + 1) >= MAXLINE) goto line_too_long; (void) sprintf((char *)buf, "%s%s", (char *)s2, (char *)s1+1); (void) strcpy((char *)&xbuf[1], (char *)buf); s1 = xbuf; } break; /* * Discretionary hyphen - "\\%" */ case '%': if (Wordl <= 0) break; if ((i = Findhy(NULL, 0, 0)) < 0) { Error(WARN, LINE, " no hyphen for font ", (char *)Font); break; } Endword(); Pass3(Wordl, Word, NULL, Hychar[i].len); Pass3(NOBREAK, (unsigned char *) "hyphen", Hychar[i].str, Hychar[i].len); Wordl = Wordx = 0; Uhyph = 1; break; /* * None of the above - may be special character * name. */ default: s2 = s1--; s1 = Asmcode(&s1, nm); if ((i = Findchar(nm, 0, NULL, 0)) < 0){ s1 = s2; goto ordinary_char; } if (strcmp((char *)nm, "em") == 0 && Wordx > 0) { /* * "\\(em" is a special case when a word * has been assembled, because of * hyphenation. */ Endword(); Pass3(Wordl, Word, NULL, Schar[i].len); Pass3(NOBREAK, (unsigned char *)"userhyphen", Schar[i].str, Schar[i].len); Wordl = Wordx = 0; period = '\0'; Uhyph = 1; } /* * Interpolate a special character */ if (Str2word(Schar[i].str, strlen((char *)Schar[i].str)) != 0) return; Wordl += Schar[i].len; period = '\0'; } break; /* * Ordinary character */ default: ordinary_char: if (Str2word(s1, 1) != 0) return; Wordl++; if (*s1 == '.' || *s1 == '!' || *s1 == '?' || *s1 == ':') period = '.'; else if (period == '.') { nm[0] = *s1; nm[1] = '\0'; if (regexec(Pat[13].pat, nm) == 0) period = '\0'; } } } /* * End of line processing */ if (!Backc) { if (period == '.') Pass3(NOBREAK, (unsigned char *)"gap", NULL, 2); if (Centering > 0) { Pass3(DOBREAK, (unsigned char *)"center", NULL, 0); Centering--; } else if (!Fill) Pass3(DOBREAK, (unsigned char *)"flush", NULL, 0); } if (Aftnxt == NULL) return; /* else fall through to process an "after next trap */ } /* * Special -man macro handling. */ if (Marg == MANMACROS) { /* * A text line - "^[^.]" - is only processed when there is an * "after next" directive. */ if (*line != '.' && *line != '\'') { if (Aftnxt != NULL) { if (regexec(Pat[9].pat, Aftnxt)) /* ",fP" */ Font[0] = Prevfont; if (regexec(Pat[16].pat, Aftnxt)) /* ",fR" */ Font[0] = 'R'; if (regexec(Pat[10].pat, Aftnxt)) /* ",tP" */ Pass3(DOBREAK, (unsigned char *)"toindent", NULL, 0); Free(&Aftnxt); } return; } /* * Special footer handling - "^.lF" */ if (line[1] == 'l' && line[2] == 'F') { s1 = Findstr((unsigned char *)"by", NULL, 0); s2 = Findstr((unsigned char *)"nb", NULL, 0); if (*s1 == '\0' || *s2 == '\0') (void) sprintf((char *)buf, "%s%s", (char *)s1, (char *)s2); else (void) sprintf((char *)buf, "%s; %s", (char *)s1, (char *)s2); Pass3(NOBREAK, (unsigned char *)"LF", buf, 0); return; } } /* * Special -ms macro handling. */ if (Marg == MSMACROS) { /* * A text line - "^[^.]" - is only processed when there is an * "after next" directive. */ if (*line != '.' && *line != '\'') { if (Aftnxt != NULL) { if (regexec(Pat[10].pat, Aftnxt)) /* ",tP" */ Pass3(DOBREAK, (unsigned char *)"toindent", NULL, 0); Free(&Aftnxt); } return; } /* * Numbered headings - "^[.']nH" */ if (line[1] == 'n' && line[2] == 'H') { s1 = Field(2, line, 0); if (s1 != NULL) { i = atoi((char *)s1) - 1; if (i < 0) { for (j = 0; j < MAXNHNR; j++) { Nhnr[j] = 0; } i = 0; } else if (i >= MAXNHNR) { (void) sprintf((char *)buf, " over NH limit (%d)", MAXNHNR); Error(WARN, LINE, (char *)buf, NULL); } } else i = 0; Nhnr[i]++; for (j = i + 1; j < MAXNHNR; j++) { Nhnr[j] = 0; } s1 = buf; for (j = 0; j <= i; j++) { (void) sprintf((char *)s1, "%d.", Nhnr[j]); s1 = buf + strlen((char *)buf); } (void) Findstr((unsigned char *)"Nh", buf, 1); return; } } /* * Remaining lines should begin with a '.' or '\'' unless an "after next" * trap has failed. */ if (*line != '.' && *line != '\'') { if (Aftnxt != NULL) Error(WARN, LINE, " failed .it: ", (char *)Aftnxt); else Error(WARN, LINE, " unrecognized line ", NULL); return; } brk = (*line == '.') ? DOBREAK : NOBREAK; /* * Evaluate expressions for "^[.'](ta|ll|ls|in|ti|po|ne|sp|pl|nr)" * Then process the requests. */ if (regexec(Pat[11].pat, &line[1])) { /* * Establish default scale factor. */ if ((line[1] == 'n' && line[2] == 'e') || (line[1] == 's' && line[2] == 'p') || (line[1] == 'p' && line[2] == 'l')) exscale = Scalev; else if (line[1] == 'n' && line[2] == 'r') exscale = Scaleu; else exscale = Scalen; /* * Determine starting argument. */ if (line[1] == 'n' && line[2] == 'r') s1 = Field(2, &line[3], 0); else s1 = Field(1, &line[3], 0); /* * Evaluate expressions. */ for (nexpr = 0; s1 != NULL &&*s1 != '\0'; ) { while (*s1 == ' ' || *s1 == '\t') s1++; if (*s1 == '+' || *s1 == '-') ssign = *s1++; else ssign = '\0'; /* * Process terms. */ val = 0.0; sp = -1; c = '+'; s1--; while (c == '+' || c == '*' || c == '%' || c == ')' || c == '-' || c == '/') { op = c; s1++; tscale = exscale; tval = 0.0; /* * Pop stack on right parenthesis. */ if (op == ')') { tval = val; if (sp >= 0) { val = valstack[sp]; op = opstack[sp]; sp--; } else { Error(WARN, LINE, " expression stack underflow", NULL); return; } tscale = Scaleu; /* * Push stack on left parenthesis. */ } else if (*s1 == '(') { sp++; if (sp >= MAXSP) { Error(WARN, LINE, " expression stack overflow", NULL); return; } valstack[sp] = val; opstack[sp] = op; val = 0.0; c = '+'; continue; } else if (*s1 == '\\') { s1++; switch(*s1) { /* * "\\"" begins a comment. */ case '"': while (*s1) s1++; break; /* * Crude width calculation for "\\w" */ case 'w': s2 = ++s1; if (*s1) { s1++; while (*s1 && *s1 != *s2) s1++; tval = (double) (s1 - s2 - 1) * Scalen; if (*s1) s1++; } break; /* * Interpolate number register if "\\n". */ case 'n': s1 = Asmcode(&s1, nm); if ((i = Findnum(nm, 0, 0)) >= 0) tval = Numb[i].val; s1++; } /* * Assemble numeric value. */ } else if (*s1 == '.' || isdigit(*s1)) { for (i = 0; isdigit(*s1) || *s1 == '.'; s1++) { if (*s1 == '.') { i = 10; continue; } d = (double) (*s1 - '0'); if (i) { tval = tval + (d / (double) i); i = i * 10; } else tval = (tval * 10.0) + d; } } else { /* * It's not an expression. Ignore extra scale. */ if ((i = Findscale((int)*s1, 0.0, 0)) < 0) { (void) sprintf((char *)buf, " \"%s\" isn't an expression", (char *)s1); Error(WARN, LINE, (char *)buf, NULL); } s1++; } /* * Add term to expression value. */ if ((i = Findscale((int)*s1, 0.0, 0)) >= 0) { tval *= Scale[i].val; s1++; } else tval *= tscale; switch (op) { case '+': val += tval; break; case '-': val -= tval; break; case '*': val *= tval; break; case '/': case '%': i = (int) val; j = (int) tval; if (j == 0) { Error(WARN, LINE, (*s1 == '/') ? "div" : "mod", " by 0"); return; } if (op == '/') val = (double) (i / j); else val = (double) (i % j); break; } c = *s1; } /* * Save expression value and sign. */ if (nexpr >= MAXEXP) { (void) sprintf((char *)buf, " at expression limit of %d", MAXEXP); Error(WARN, LINE, (char *)buf, NULL); return; } exsign[nexpr] = ssign; expr[nexpr] = val; if (ssign == '-') sexpr[nexpr] = -1.0 * val; else sexpr[nexpr] = val; nexpr++; while (*s1 == ' ' || *s1 == '\t') s1++; } /* * Set parameters "(ll|ls|in|ti|po|pl)" */ if (regexec(Pat[12].pat, &line[1])) { nm[0] = line[1]; nm[1] = line[2]; if ((i = Findparms(nm)) < 0) { Error(WARN, LINE, " can't find parameter register ", (char *)nm); return; } if (nexpr == 0 || exscale == 0.0) j = Parms[i].prev; else if (exsign[0] == '\0' || (nm[0] == 't' && nm[1] == 'i')) j = (int)(sexpr[0] / exscale); else j = Parms[i].val + (int)(sexpr[0] / exscale); Parms[i].prev = Parms[i].val; Parms[i].val = j; nm[0] = (nexpr) ? exsign[0] : '\0'; /* for .ti */ nm[1] = '\0'; Pass3(brk, (unsigned char *)Parms[i].cmd, nm, j); return; } if (line[1] == 'n') { switch(line[2]) { /* * Need - "^[.']ne " */ case 'e': if (nexpr && Scalev > 0.0) i = (int) ((expr[0]/Scalev) + 0.99); else i = 0; Pass3(DOBREAK, (unsigned char *)"need", NULL, i); return; /* * Number - "^[.']nr " */ case 'r': if ((s1 = Field(2, line, 0)) == NULL) { Error(WARN, LINE, " bad number register", NULL); return; } if ((i = Findnum(s1, 0, 0)) < 0) i = Findnum(s1, 0, 1); if (nexpr < 1) { Numb[i].val = 0; return; } if (exsign[0] == '\0') Numb[i].val = (int) expr[0]; else Numb[i].val += (int) sexpr[0]; return; } } /* * Space - "^[.']sp " */ if (line[1] == 's' && line[2] == 'p') { if (nexpr == 0) i = 1; else i = (int)((expr[0] / Scalev) + 0.99); while (i--) Pass3(brk, (unsigned char *)"space", NULL, 0); return; } /* * Tab positions - "^[.']ta . . ." */ if (line[1] == 't' && line[2] == 'a') { tval = 0.0; for (j = 0; j < nexpr; j++) { if (exsign[j] == '\0') tval = expr[j]; else tval += sexpr[j]; Tabs[j] = (int) (tval / Scalen); } Ntabs = nexpr; return; } } /* * Process all other nroff requests via Nreq(). */ (void) Nreq(line, brk); return; } /* * pass3.c - cawf(1) pass 3 function */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" void Pass3(len, word, sarg, narg) int len; /* length (negative is special) */ unsigned char *word; /* word */ unsigned char *sarg; /* string argument */ int narg; /* numeric argument */ { int addto; /* spaces to add to all words */ int i, j, k; /* temporary index */ unsigned char msg[MAXLINE]; /* message buffer */ int n; /* temporary number */ unsigned char *s1; /* temporary string pointer */ int sp = 0; /* no-break spacing switch */ int sp_Outll; /* sp-saved Outll */ char sp_Outln; /* sp-saved Outln[0] */ int sp_Outlx; /* sp-saved Outlx */ int sp_Padx; /* sp-saved Padx */ int sp_Tind; /* sp-saved Tind */ int wl; /* real word length */ int xsp; /* extra spaces to add */ int vsp; /* vertical spacing status */ vsp = 0; if (word != NULL) wl = strlen((char *)word); /* * If not a special command, process a word. */ if (len >= 0 && Outll < 0) { /* * Enter first word. */ (void) strcpy((char *)Outln, (char *)word); Outll = len; Outlx = wl; Padx = 0; } else if (len >= 0 && (Outll+Contlen+len+narg) <= (LL-Pgoff-Ind-Tind)) { /* * The word fits, so enter it. */ if ((Contlen + len) > 0) { line_too_big: if ((Outlx + Contlen + wl) >= MAXOLL) { Error3(len, (char *)word, (char *)sarg, narg, "output line too big"); return; } else { if (Contlen > 0 && Cont != NULL) { if (Contlen == 1 && *Cont == ' ') { Padchar[Padx++] = Outlx; Outln[Outlx++] = ' '; } else { (void) strcpy((char *)&Outln[Outlx], (char *)Cont); Outlx += Contlen; } } if (len > 0) { (void) strcpy((char *)&Outln[Outlx], (char *)word); Outlx += wl; } } } Outll += Contlen + len; } else if (len == NOBREAK || len == MESSAGE) { /* * Do nothing (equivalent to break) */ } else if (len == DOBREAK && strcmp((char *)word, "need") == 0 && (Nxtln + narg) < (Pglen + 1 - Botmarg)) { /* * Do nothing, because there is room on the page. */ } else if (len == DOBREAK && strcmp((char *)word, "toindent") == 0 && (Ind + Tind + Outll) < Ind) { /* * Move to indent position with line - there is room. */ n = Ind - (Ind + Tind +Outll); Outll += n; if ((Outlx + n) >= MAXOLL) goto line_too_big; for (i = n; i; i--) Outln[Outlx++] = ' '; Padx = 0; Free(&Cont); Contlen = 0; } else if (Outll >= 0 || (len == DOBREAK && strcmp((char *)word, "need") == 0)) { /* * A non-empty line or a "need" forces output. */ vsp = 0; print_line: if (Nxtln == 1) { /* * We're at the top of the page, so issue the header. */ if (Thispg > 1) Charput((int)'\f'); for (i = (Topmarg - 1)/2; i > 0; i--) { Charput((int)'\n'); Nxtln++; } /* * Print the page header, as required. */ if (Fph || Thispg > 1) { i = LenprtHF(Hdc, Thispg, 0) + LenprtHF(Hdl, Thispg, 0) + LenprtHF(Hdr, Thispg, 0) + 2; j = (LL - i - Pgoff) / 2 + 1; n = LL - Pgoff - i - j + 2; for (k = 0; k < Pgoff; k++) Charput((int)' '); if (Hdl) LenprtHF(Hdl, Thispg, 1); while (j--) Charput((int)' '); if (Hdc) LenprtHF(Hdc, Thispg, 1); while (n--) Charput((int)' '); if (Hdr) LenprtHF(Hdr, Thispg, 1); Charput((int)'\n'); } else Charput((int)'\n'); Nxtln++; while(Nxtln <= Topmarg) { Charput((int)'\n'); Nxtln++; } } /* * Add a trailing hyphen, if mecessary. */ if (vsp == 0 && Eollen > 0 && Eol != NULL) { i = strlen((char *)Eol); if ((Outlx + i) >= MAXOLL) goto line_too_big; (void) strcpy((char *)&Outln[Outlx], (char *)Eol); Outlx += i; Outll += Eollen; } /* * Trim trailing spaces from the output line. */ while (Outlx > 0) { if (Outln[Outlx - 1] != ' ') break; if (Padx > 0 && (Outlx - 1) == Padchar[Padx - 1]) Padx--; Outlx--; Outln[Outlx] = '\0'; Outll--; } if (Outlx == 0) Charput((int)'\n'); else if (len == DOBREAK && strcmp((char *)word, "center") == 0) { /* * Center the output line. */ i = (LL - Pgoff - Outll) / 2; if (i < 0) i = 0; for (j = (Pgoff + Ind + Tind + i); j; j--) Charput((int)' '); Stringput(Outln); Charput((int)'\n'); } else if (Adj == LEFTADJ || (Adj == BOTHADJ && (len < 0 || Padx == 0))) { /* * No right margin adjustment - disabled, inappropriate * (line ended by break) or impossible. */ for (i = 0; i < (Pgoff + Ind + Tind); i++) Charput((int)' '); Stringput(Outln); Charput((int)'\n'); } else if (Adj == BOTHADJ) { /* * Adjust right margin. */ for (i = 0; i < (Pgoff + Ind + Tind); i++) Charput((int)' '); i = LL - (Pgoff + Ind + Tind); j = i - Outll; addto = Padx ? (j / Padx) : 0; xsp = j - (Padx * addto); for (i = 0, s1 = Outln; i < Padx; i++) { while (*s1 && (s1 - Outln) <= Padchar[i]) Charput((int)*s1++); if (*s1 == '\0') break; j = addto; if (Padfrom == PADLEFT) { if (i < xsp) j++; } else if (i >= (Padx - xsp)) j++; while (j--) Charput((int)' '); } while (*s1) Charput((int)*s1++); Charput((int)'\n'); Padfrom = (Padfrom == PADLEFT) ? PADRIGHT : PADLEFT; } /* * End of line housekeeping */ Nxtln++; Outll = -1; Outlx = 0; Padx = 0; Tind = 0; Nospmode = 0; if (vsp == 0 && len == DOBREAK && strcmp((char *)word, "need") == 0) { /* * Break caused by "need" - satisfy it. */ while (Nxtln < (Pglen + 1 - Botmarg)) { Charput((int)'\n'); Nxtln++; } } if (Nxtln >= (Pglen + 1 - Botmarg)) { /* * Footer required */ for (i = (Botmarg - 1)/2; i > 0; i--) { Charput((int)'\n'); Nxtln++; } i = LenprtHF(Ftl, Thispg, 0) + LenprtHF(Ftc, Thispg, 0) + LenprtHF(Ftr, Thispg, 0) + 2; j = (LL - i - Pgoff) / 2 + 1; n = LL - Pgoff - i - j + 2; for (k = 0; k < Pgoff; k++) Charput((int)' '); if (Ftl) LenprtHF(Ftl, Thispg, 1); while (j--) Charput((int)' '); if (Ftc) LenprtHF(Ftc, Thispg, 1); while (n--) Charput((int)' '); if (Ftr) LenprtHF(Ftr, Thispg, 1); Charput((int)'\n'); Nxtln++; /* * The last blank line on the page is suppressed to assist * printers that can't look ahead to the following FF. */ while (Nxtln < Pglen) { Charput((int)'\n'); Nxtln++; } Nxtln = 1; Thispg++; Nospmode = 1; Padfrom = PADRIGHT; } /* * Initiate any extra vertical spacing. */ if (++vsp < Vspace) goto print_line; /* * Save any input word that might have forced output. */ if (len >= 0) { (void) strcpy((char *)Outln, (char *)word); Outll = len; Outlx = wl; Padx = 0; } } /* * A break causes padding reversal. */ if (len == DOBREAK) Padfrom = PADRIGHT; if (len >= 0 || strcmp((char *)word, "nohyphen") == 0) { /* * Reset conti<<<<<<nuation and hyphenation. */ if (Contlen != 1 || Cont[0] != ' ') { Free(&Cont); Cont = Newstr((unsigned char *)" "); Contlen = 1; } if (Eollen > 0) { Free(&Eol); Eollen = 0; } return; } /* * Now post-process any special commands. */ if (len == MESSAGE) { Error3(len, (char *)word, (char *)sarg, narg, NULL); return; } switch (*word) { case 'b': /* both */ /* * Adjust on both margins. */ Adj = BOTHADJ; return; case 'c': /* center */ return; case 'e': /* errsto */ /* * "errsto" comes from awf. */ return; case 'f': /* flush and fph */ if (word[1] == 'l') return; else if (word[1] == 'p') { /* * First page header status */ Fph = narg; return; } break; case 'g': /* gap */ /* * Increase word gap. (Space is not paddable.) */ if (Outll >= 0) { if ((Outlx + narg - 1) >= MAXOLL) goto line_too_big; for (i = 0; i < (narg - 1); i++) { Outln[Outlx++] = ' '; Outll++; } } return; case 'h': /* hyphen */ /* * Set discretionary hyphen. */ Free(&Cont); Contlen = 0; Free(&Eol); Eol = (sarg != NULL) ? Newstr(sarg) : NULL; Eollen = narg; return; case 'i': /* indent */ /* * Set indentation. */ Ind = narg; return; case 'l': /* left or linelen */ if (word[1] == 'e') { /* * Adjust on left margin. */ Adj = LEFTADJ; return; } else if (word[1] == 'i') { /* * Set line length. */ LL = narg; return; } break; case 'n': /* need or nospace */ if (word[1] == 'e') return; /* need */ else if (word[1] == 'o') { /* * Set no space mode. */ Nospmode = 1; return; } break; case 'p': /* pagelen or pageoffset */ if (strncmp((char *)&word[1], "age", 3) != 0) break; if (word[4] == 'l') { /* * Set page length. */ Pglen = narg; return; } else if (word[4] == 'o') { /* * Set page offset. */ Pgoff = narg; return; } break; case 's': /* space */ if (sp) { /* * Restore values after NOBREAK spacing ("^'sp"). */ Outlx = sp_Outlx; Outln[0] = sp_Outln; Padx = sp_Padx; Outll = sp_Outll; Tind = sp_Tind; return; } if (Nospmode == 0) { if (len == NOBREAK) { /* * Set up for NOBREAK spacing. */ sp_Outlx = Outlx; sp_Outln = Outln[0]; sp_Padx = Padx; sp_Outll = Outll; sp_Tind = Tind; vsp = Vspace + 1; sp = 1; } /* * Generate a blank line. */ Outlx = 0; Outln[0] = '\0'; Padx = 0; Outll = LL - 1; if (sp) goto print_line; } return; case 't': /* tabto, tempindent, or * toindent */ if (word[1] == 'a') { /* * Move to TAB stop. */ if (Outll < 0) Outll = 0; if ((n = narg - Outll) > 0) { if ((Outlx + n) >= MAXOLL) goto line_too_big; Outll += n; for (i = n; i > 0; i--) Outln[Outlx++] = ' '; Free(&Cont); Contlen = 0; Padx = 0; } return; } else if (word[1] == 'e') { /* * Set temporary indentation. */ if (*sarg == '\0' && narg >= 0) Tind = narg - Ind; else Tind = ((Ind + narg) >= 0) ? narg : -Ind; return; } else if (word[1] == 'o') return; /* toindent */ break; case 'u': /* userhyphen */ /* * Set line length. */ Free(&Cont); Free(&Eol); Contlen = Eollen = narg; Cont = (sarg == NULL) ? NULL : Newstr(sarg); Eol = (sarg == NULL) ? NULL : Newstr(sarg); return; case 'v': /* vspace */ /* * Set vertical spacing. */ Vspace = (narg == 0) ? 1 : narg; return; case 'y': /* yesspace */ /* * Set space mode. */ Nospmode = 0; return; } /* end of switch(*word) */ /* * Locate header and footer defintions. */ if (regexec(Pat[14].pat, word)) { if (strcmp((char *)word, "LH") == 0) { /* * Left header */ Free(&Hdl); if (sarg != NULL) Hdl = Newstr(sarg); return; } if (strcmp((char *)word, "CH") == 0) { /* * Center header */ Free(&Hdc); if (sarg != NULL) Hdc = Newstr(sarg); return; } if (strcmp((char *)word, "RH") == 0) { /* * Right header */ Free(&Hdr); if (sarg != NULL) Hdr = Newstr(sarg); return; } if (strcmp((char *)word, "LF") == 0) { /* * Left footer */ Free(&Ftl); if (sarg != NULL) Ftl = Newstr(sarg); return; } if (strcmp((char *)word, "CF") == 0) { /* * Center footer */ Free(&Ftc); if (sarg != NULL) Ftc = Newstr(sarg); return; } if (strcmp((char *)word, "RF") == 0) { /* * Right footer */ Free(&Ftr); if (sarg != NULL) Ftr = Newstr(sarg); return; } } /* * Error on unknown arguments */ Error3(len, (char *)word, (char *)sarg, narg, "unknown request"); } /* * proto.h - function prototype definitions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "ansi.h" #ifdef UNIX # ifdef USG #include # else /* not USG */ #include # endif /* USG */ #else /* not UNIX */ #include #endif /* UNIX */ /* * The following conditional rat's nest intends to: * * for MS-DOS #include and . exists in * MS-DOS so the STDLIB symbol should be defined and UNIX * shouldn't be. * * for Unix #include if the STDLIB symbol is defined. If * STDLIB isn't defined, define a prototype for getenv(). * If the UNIX symbol is defined (and it should be) and if * the MALLOCH symbol is defined, #include ; else * define a prototype for malloc() if UNIX is defined and * MALLOCH isn't. (The Unix usually defines the * malloc() prototype.) * * for ??? Define a prototype for getenv() and #include * if neither STDLIB nor UNIX are defined. (What system is * this?) */ #ifdef STDLIB #include # ifndef UNIX #include # endif /* UNIX */ #else /* not STDLIB */ _PROTOTYPE(char *getenv,(char *name)); # ifdef UNIX # ifdef MALLOCH #include # else /* not MALLOCH */ _PROTOTYPE(char *malloc,(unsigned size)); # endif /* MALLOCH */ # else /* not UNIX */ #include # endif /* UNIX */ #endif /* STDLIB */ _PROTOTYPE(unsigned char *Asmcode,(unsigned char **s, unsigned char *c)); _PROTOTYPE(int Asmname,(unsigned char *s, unsigned char *c)); _PROTOTYPE(void Charput,(int c)); _PROTOTYPE(int Delmacro,(int mx)); _PROTOTYPE(int Defdev,()); _PROTOTYPE(void Delstr,(int sx)); _PROTOTYPE(void Error,(int t, int l, char *s1, char *s2)); _PROTOTYPE(void Error3,(int len, char *word, char *sarg, int narg, char *msg)); _PROTOTYPE(void Expand,(unsigned char *line)); _PROTOTYPE(void Delnum,(int nx)); _PROTOTYPE(unsigned char *Field,(int n, unsigned char *p, int c)); _PROTOTYPE(void Endword,()); _PROTOTYPE(int Findchar,(unsigned char *nm, int l, unsigned char *s, int e)); _PROTOTYPE(int Findhy,(unsigned char *s, int l, int e)); _PROTOTYPE(int Findmacro,(unsigned char *p, int e)); _PROTOTYPE(int Findnum,(unsigned char *n, int v, int e)); _PROTOTYPE(int Findparms,(unsigned char *n)); _PROTOTYPE(int Findscale,(int n, double v, int e)); _PROTOTYPE(unsigned char *Findstr,(unsigned char *nm, unsigned char *s, int e)); _PROTOTYPE(int getopt,(int argc, char **argv, char *opts)); _PROTOTYPE(int LenprtHF,(unsigned char *s, int p, int t)); _PROTOTYPE(int main,(int argc, char *argv[])); _PROTOTYPE(void Macro,(unsigned char *inp)); _PROTOTYPE(void Nreq,(unsigned char *line, int brk)); _PROTOTYPE(void Free,(unsigned char **p)); _PROTOTYPE(unsigned char *Newstr,(unsigned char *s)); _PROTOTYPE(void Pass2,(unsigned char *line)); _PROTOTYPE(void Pass3,(int len, unsigned char *word, unsigned char *sarg, int narg)); _PROTOTYPE(void regerror,(char *s)); _PROTOTYPE(unsigned char *reg,(int paren, int *flagp)); _PROTOTYPE(unsigned char *regatom,(int *flagp)); _PROTOTYPE(unsigned char *regbranch,(int *flagp)); _PROTOTYPE(regexp *regcomp,(char *exp)); _PROTOTYPE(void regdump,(regexp *r)); _PROTOTYPE(int regexec,(regexp *prog, unsigned char *string)); _PROTOTYPE(void Stringput,(unsigned char *s)); _PROTOTYPE(int Str2word,(unsigned char *s, int len)); #include #include "regexp.h" #include "proto.h" void regerror(s) char *s; { #ifndef DOSPORT #ifdef ERRAVAIL error("regexp: %s", s); #else fprintf(stderr, "regexp(3): %s", s); exit(1); #endif /* NOTREACHED */ #endif /* ifdef'd out for less's sake when reporting error inside less */ } /* * regcomp and regexec -- regsub and regerror are elsewhere * * Copyright (c) 1986 by University of Toronto. * Written by Henry Spencer. Not derived from licensed software. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to redistribute it freely, * subject to the following restrictions: * * 1. The author is not responsible for the consequences of use of * this software, no matter how awful, even if they arise * from defects in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. * * Beware that some of this code is subtly aware of the way operator * precedence is structured in regular expressions. Serious changes in * regular-expression syntax might require a total rethink. */ #include #ifdef UNIX #ifdef USG #include #else #include #endif #else #include #endif #include "regexp.h" #include "regmagic.h" #include "proto.h" /* * The "internal use only" fields in regexp.h are present to pass info from * compile to execute that permits the execute phase to run lots faster on * simple cases. They are: * * regstart char that must begin a match; '\0' if none obvious * reganch is the match anchored (at beginning-of-line only)? * regmust string (pointer into program) that match must include, or NULL * regmlen length of regmust string * * Regstart and reganch permit very fast decisions on suitable starting points * for a match, cutting down the work a lot. Regmust permits fast rejection * of lines that cannot possibly match. The regmust tests are costly enough * that regcomp() supplies a regmust only if the r.e. contains something * potentially expensive (at present, the only such thing detected is * or + * at the start of the r.e., which can involve a lot of backup). Regmlen is * supplied because the test in regexec() needs it and regcomp() is computing * it anyway. */ /* * Structure for regexp "program". This is essentially a linear encoding * of a nondeterministic finite-state machine (aka syntax charts or * "railroad normal form" in parsing technology). Each node is an opcode * plus a "next" pointer, possibly plus an operand. "Next" pointers of * all nodes except BRANCH implement concatenation; a "next" pointer with * a BRANCH on both ends of it is connecting two alternatives. (Here we * have one of the subtle syntax dependencies: an individual BRANCH (as * opposed to a collection of them) is never concatenated with anything * because of operator precedence.) The operand of some types of node is * a literal string; for others, it is a node leading into a sub-FSM. In * particular, the operand of a BRANCH node is the first node of the branch. * (NB this is *not* a tree structure: the tail of the branch connects * to the thing following the set of BRANCHes.) The opcodes are: */ /* definition number opnd? meaning */ #define END 0 /* no End of program. */ #define BOL 1 /* no Match "" at beginning of line. */ #define EOL 2 /* no Match "" at end of line. */ #define ANY 3 /* no Match any one character. */ #define ANYOF 4 /* str Match any character in this string. */ #define ANYBUT 5 /* str Match any character not in this string. */ #define BRANCH 6 /* node Match this alternative, or the next... */ #define BACK 7 /* no Match "", "next" ptr points backward. */ #define EXACTLY 8 /* str Match this string. */ #define NOTHING 9 /* no Match empty string. */ #define STAR 10 /* node Match this (simple) thing 0 or more times. */ #define PLUS 11 /* node Match this (simple) thing 1 or more times. */ #define OPEN 20 /* no Mark this point in input as start of #n. */ /* OPEN+1 is number 1, etc. */ #define CLOSE 30 /* no Analogous to OPEN. */ /* * Opcode notes: * * BRANCH The set of branches constituting a single choice are hooked * together with their "next" pointers, since precedence prevents * anything being concatenated to any individual branch. The * "next" pointer of the last BRANCH in a choice points to the * thing following the whole choice. This is also where the * final "next" pointer of each individual branch points; each * branch starts with the operand node of a BRANCH node. * * BACK Normal "next" pointers all implicitly point forward; BACK * exists to make loop structures possible. * * STAR,PLUS '?', and complex '*' and '+', are implemented as circular * BRANCH structures using BACK. Simple cases (one character * per match) are implemented with STAR and PLUS for speed * and to minimize recursive plunges. * * OPEN,CLOSE ...are numbered at compile time. */ /* * A node is one char of opcode followed by two chars of "next" pointer. * "Next" pointers are stored as two 8-bit pieces, high order first. The * value is a positive offset from the opcode of the node containing it. * An operand, if any, simply follows the node. (Note that much of the * code generation knows about this implicit relationship.) * * Using two bytes for the "next" pointer is vast overkill for most things, * but allows patterns to get big without disasters. */ #define OP(p) (*(p)) #define NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377)) #define OPERAND(p) ((p) + 3) /* * See regmagic.h for one further detail of program structure. */ /* * Utility definitions. */ #ifndef CHARBITS #define UCHARAT(p) ((int)*(unsigned char *)(p)) #else #define UCHARAT(p) ((int)*(p)&CHARBITS) #endif #define FAIL(m) { regerror(m); return(NULL); } #define ISMULT(c) ((c) == '*' || (c) == '+' || (c) == '?') #define META "^$.[()|?+*\\" /* * Flags to be passed up and down. */ #define HASWIDTH 01 /* Known never to match null string. */ #define SIMPLE 02 /* Simple enough to be STAR/PLUS operand. */ #define SPSTART 04 /* Starts with * or +. */ #define WORST 0 /* Worst case. */ #define STATIC /* * Global work variables for regcomp(). */ STATIC char *regparse; /* Input-scan pointer. */ STATIC int regnpar; /* () count. */ STATIC unsigned char regdummy; STATIC unsigned char *regcode; /* Code-emit pointer; ®dummy = don't. */ STATIC long regsize; /* Code size. */ /* * Forward declarations for regcomp()'s friends. */ _PROTOTYPE(STATIC unsigned char *reg, (int paren, int *flagp )); _PROTOTYPE(STATIC unsigned char *regbranch, (int *flagp )); _PROTOTYPE(STATIC unsigned char *regpiece, (int *flagp )); _PROTOTYPE(STATIC unsigned char *regatom, (int *flagp )); _PROTOTYPE(STATIC unsigned char *regnode, (int op )); _PROTOTYPE(STATIC void regc, (int b )); _PROTOTYPE(STATIC void reginsert, (int op, unsigned char *opnd )); _PROTOTYPE(STATIC void regtail, (unsigned char *p, unsigned char *val )); _PROTOTYPE(STATIC void regoptail, (unsigned char *p, unsigned char *val )); _PROTOTYPE(STATIC int regtry, (regexp *prog, unsigned char *string )); _PROTOTYPE(STATIC int regmatch, (unsigned char *prog )); _PROTOTYPE(STATIC int regrepeat, (unsigned char *p )); _PROTOTYPE(STATIC unsigned char *regnext, (unsigned char *p )); _PROTOTYPE(STATIC unsigned char *regprop, (unsigned char *op )); #ifdef STRCSPN _PROTOTYPE(STATIC int strcspn, (unsigned char *s1, unsigned char *s2 )); #endif /* - regcomp - compile a regular expression into internal code * * We can't allocate space until we know how big the compiled form will be, * but we can't compile it (and thus know how big it is) until we've got a * place to put the code. So we cheat: we compile it twice, once with code * generation turned off and size counting turned on, and once "for real". * This also means that we don't allocate space until we are sure that the * thing really will compile successfully, and we never have to move the * code and thus invalidate pointers into it. (Note that it has to be in * one piece because free() must be able to free it all.) * * Beware that the optimization-preparation code in here knows about some * of the structure of the compiled regexp. */ regexp * regcomp(exp) char *exp; { register regexp *r; register unsigned char *sca<<<<========= = = = = =====n; register unsigned char *longest; register int len; int flags; if (exp == NULL) FAIL("NULL argument"); /* First pass: determine size, legality. */ regparse = exp; regnpar = 1; regsize = 0L; regcode = ®dummy; regc(MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Small enough for pointer-storage convention? */ if (regsize >= 32767L) /* Probably could be 65535L. */ FAIL("regexp too big"); /* Allocate space. */ r = (regexp *)malloc(sizeof(regexp) + (unsigned)regsize); if (r == NULL) FAIL("out of space"); /* Second pass: emit code. */ regparse = exp; regnpar = 1; regcode = r->program; regc(MAGIC); if (reg(0, &flags) == NULL) return(NULL); /* Dig out information for optimizations. */ r->regstart = '\0'; /* Worst-case defaults. */ r->reganch = 0; r->regmust = NULL; r->regmlen = 0; scan = r->program+1; /* First BRANCH. */ if (OP(regnext(scan)) == END) { /* Only one top-level choice. */ scan = OPERAND(scan); /* Starting-point info. */ if (OP(scan) == EXACTLY) r->regstart = *OPERAND(scan); else if (OP(scan) == BOL) r->reganch++; /* * If there's something expensive in the r.e., find the * longest literal string that must appear and make it the * regmust. Resolve ties in favor of later strings, since * the regstart check works with the beginning of the r.e. * and avoiding duplication strengthens checking. Not a * strong reason, but sufficient in the absence of others. */ if (flags&SPSTART) { longest = NULL; len = 0; for (; scan != NULL; scan = regnext(scan)) if (OP(scan) == EXACTLY && strlen((char *)OPERAND(scan)) >= len) { longest = OPERAND(scan); len = strlen((char *)OPERAND(scan)); } r->regmust = longest; r->regmlen = len; } } return(r); } /* - reg - regular expression, i.e. main body or parenthesized thing * * Caller must absorb opening parenthesis. * * Combining parenthesis handling with the base level of regular expression * is a trifle forced, but the need to tie the tails of the branches to what * follows makes it hard to avoid. */ STATIC unsigned char * reg(paren, flagp) int paren; /* Parenthesized? */ int *flagp; { register unsigned char *ret; register unsigned char *br; register unsigned char *ender; register int parno; int flags; *flagp = HASWIDTH; /* Tentatively. */ /* Make an OPEN node, if parenthesized. */ if (paren) { if (regnpar >= NSUBEXP) FAIL("too many ()"); parno = regnpar; regnpar++; ret = regnode(OPEN+parno); } else ret = NULL; /* Pick up the branches, linking them together. */ br = regbranch(&flags); if (br == NULL) return(NULL); if (ret != NULL) regtail(ret, br); /* OPEN -> first. */ else ret = br; if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; while (*regparse == '|') { regparse++; br = regbranch(&flags); if (br == NULL) return(NULL); regtail(ret, br); /* BRANCH -> BRANCH. */ if (!(flags&HASWIDTH)) *flagp &= ~HASWIDTH; *flagp |= flags&SPSTART; } /* Make a closing node, and hook it on the end. */ ender = regnode((paren) ? CLOSE+parno : END); regtail(ret, ender); /* Hook the tails of the branches to the closing node. */ for (br = ret; br != NULL; br = regnext(br)) regoptail(br, ender); /* Check for proper termination. */ if (paren && *regparse++ != ')') { FAIL("unmatched ()"); } else if (!paren && *regparse != '\0') { if (*regparse == ')') { FAIL("unmatched ()"); } else FAIL("junk on end"); /* "Can't happen". */ /* NOTREACHED */ } return(ret); } /* - regbranch - one alternative of an | operator * * Implements the concatenation operator. */ STATIC unsigned char * regbranch(flagp) int *flagp; { register unsigned char *ret; register unsigned char *chain; register unsigned char *latest; int flags; *flagp = WORST; /* Tentatively. */ ret = regnode(BRANCH); chain = NULL; while (*regparse != '\0' && *regparse != '|' && *regparse != ')') { latest = regpiece(&flags); if (latest == NULL) return(NULL); *flagp |= flags&HASWIDTH; if (chain == NULL) /* First piece. */ *flagp |= flags&SPSTART; else regtail(chain, latest); chain = latest; } if (chain == NULL) /* Loop ran zero times. */ (void) regnode(NOTHING); return(ret); } /* - regpiece - something followed by possible [*+?] * * Note that the branching code sequences used for ? and the general cases * of * and + are somewhat optimized: they use the same NOTHING node as * both the endmarker for their branch list and the body of the last branch. * It might seem that this node could be dispensed with entirely, but the * endmarker role is not redundant. */ STATIC unsigned char * regpiece(flagp) int *flagp; { register unsigned char *ret; register unsigned char op; register unsigned char *next; int flags; ret = regatom(&flags); if (ret == NULL) return(NULL); op = *regparse; if (!ISMULT(op)) { *flagp = flags; return(ret); } if (!(flags&HASWIDTH) && op != '?') FAIL("*+ operand could be empty"); *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH); if (op == '*' && (flags&SIMPLE)) reginsert(STAR, ret); else if (op == '*') { /* Emit x* as (x&|), where & means "self". */ reginsert(BRANCH, ret); /* Either x */ regoptail(ret, regnode(BACK)); /* and loop */ regoptail(ret, ret); /* back */ regtail(ret, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '+' && (flags&SIMPLE)) reginsert(PLUS, ret); else if (op == '+') { /* Emit x+ as x(&|), where & means "self". */ next = regnode(BRANCH); /* Either */ regtail(ret, next); regtail(regnode(BACK), ret); /* loop back */ regtail(next, regnode(BRANCH)); /* or */ regtail(ret, regnode(NOTHING)); /* null. */ } else if (op == '?') { /* Emit x? as (x|) */ reginsert(BRANCH, ret); /* Either x */ regtail(ret, regnode(BRANCH)); /* or */ next = regnode(NOTHING); /* null. */ regtail(ret, next); regoptail(ret, next); } regparse++; if (ISMULT(*regparse)) FAIL("nested *?+"); return(ret); } /* - regatom - the lowest level * * Optimization: gobbles an entire sequence of ordinary characters so that * it can turn them into a single node, which is smaller to store and * faster to run. Backslashed characters are exceptions, each becoming a * separate node; the code is simpler that way and it's not worth fixing. */ STATIC unsigned char * regatom(flagp) int *flagp; { register unsigned char *ret; int flags; *flagp = WORST; /* Tentatively. */ switch (*regparse++) { case '^': ret = regnode(BOL); break; case '$': ret = regnode(EOL); break; case '.': ret = regnode(ANY); *flagp |= HASWIDTH|SIMPLE; break; case '[': { register int class; register int classend; if (*regparse == '^') { /* Complement of range. */ ret = regnode(ANYBUT); regparse++; } else ret = regnode(ANYOF); if (*regparse == ']' || *regparse == '-') regc(*regparse++); while (*regparse != '\0' && *regparse != ']') { if (*regparse == '-') { regparse++; if (*regparse == ']' || *regparse == '\0') regc('-'); else { class = UCHARAT(regparse-2)+1; classend = UCHARAT(regparse); if (class > classend+1) FAIL("invalid [] range"); for (; class <= classend; class++) regc(class); regparse++; } } else regc(*regparse++); } regc('\0'); if (*regparse != ']') FAIL("unmatched []"); regparse++; *flagp |= HASWIDTH|SIMPLE; } break; case '(': ret = reg(1, &flags); if (ret == NULL) return(NULL); *flagp |= flags&(HASWIDTH|SPSTART); break; case '\0': case '|': case ')': FAIL("internal urp"); /* Supposed to be caught earlier. */ break; case '?': case '+': case '*': FAIL("?+* follows nothing"); break; case '\\': if (*regparse == '\0') FAIL("trailing \\"); ret = regnode(EXACTLY); regc(*regparse++); regc('\0'); *flagp |= HASWIDTH|SIMPLE; break; default: { register int len; register unsigned char ender; regparse--; #ifdef STRCSPN len = strcspn(regparse, (unsigned char *)META); #else len = strcspn((char *)regparse, META); #endif if (len <= 0) FAIL("internal disaster"); ender = *(regparse+len); if (len > 1 && ISMULT(ender)) len--; /* Back off clear of ?+* operand. */ *flagp |= HASWIDTH; if (len == 1) *flagp |= SIMPLE; ret = regnode(EXACTLY); while (len > 0) { regc(*regparse++); len--; } regc('\0'); } break; } return(ret); } /* - regnode - emit a node */ STATIC unsigned char * /* Location. */ regnode(iop) int iop; { register unsigned char *ret; register unsigned char *ptr; unsigned char op; op = (unsigned char) iop; ret = regcode; if (ret == ®dummy) { regsize += 3; return(ret); } ptr = ret; *ptr++ = op; *ptr++ = '\0'; /* Null "next" pointer. */ *ptr++ = '\0'; regcode = ptr; return(ret); } /* - regc - emit (if appropriate) a byte of code */ STATIC void regc(ib) int ib; { unsigned char b; b = (unsigned char) ib; if (regcode != ®dummy) *regcode++ = b; else regsize++; } /* - reginsert - insert an operator in front of already-emitted operand * * Means relocating the operand. */ STATIC void reginsert(iop, opnd) int iop; unsigned char *opnd; { register unsigned char *src; register unsigned char *dst; register unsigned char *place; unsigned char op; op = (unsigned char) iop; if (regcode == ®dummy) { regsize += 3; return; } src = regcode; regcode += 3; dst = regcode; while (src > opnd) *--dst = *--src; place = opnd; /* Op node, where operand used to be. */ *place++ = op; *place++ = '\0'; *place++ = '\0'; } /* - regtail - set the next-pointer at the end of a node chain */ STATIC void regtail(p, val) unsigned char *p; unsigned char *val; { register unsigned char *scan; register unsigned char *temp; register int offset; if (p == ®dummy) return; /* Find last node. */ scan = p; for (;;) { temp = regnext(scan); if (temp == NULL) break; scan = temp; } if (OP(scan) == BACK) offset = scan - val; else offset = val - scan; *(scan+1) = (offset>>8)&0377; *(scan+2) = offset&0377; } /* - regoptail - regtail on operand of first argument; nop if operandless */ STATIC void regoptail(p, val) unsigned char *p; unsigned char *val; { /* "Operandless" and "op != BRANCH" are synonymous in practice. */ if (p == NULL || p == ®dummy || OP(p) != BRANCH) return; regtail(OPERAND(p), val); } /* * regexec and friends */ /* * Global work variables for regexec(). */ STATIC unsigned char *reginput; /* String-input pointer. */ STATIC unsigned char *regbol; /* Beginning of input, for ^ check. */ STATIC unsigned char **regstartp; /* Pointer to startp array. */ STATIC unsigned char **regendp; /* Ditto for endp. */ #ifdef DEBUG int regnarrate = 0; void regdump(); STATIC unsigned char *regprop(); #endif /* - regexec - match a regexp against a string */ int regexec(prog, string) register regexp *prog; register unsigned char *string; { register unsigned char *s; #ifndef STDLIB extern char *strchr(); #endif /* Be paranoid... */ if (prog == NULL || string == NULL) { regerror("NULL parameter"); return(0); } /* Check validity of program. */ if (UCHARAT(prog->program) != MAGIC) { regerror("corrupted program"); return(0); } /* If there is a "must appear" string, look for it. */ if (prog->regmust != NULL) { s = string; while ((s = (unsigned char *)strchr((char *)s,prog->regmust[0])) != NULL) { if (strncmp((char *)s, (char *)prog->regmust, prog->regmlen) == 0) break; /* Found it. */ s++; } if (s == NULL) /* Not present. */ return(0); } /* Mark beginning of line for ^ . */ regbol = string; /* Simplest case: anchored match need be tried only once. */ if (prog->reganch) return(regtry(prog, string)); /* Messy cases: unanchored match. */ s = string; if (prog->regstart != '\0') /* We know what char it must start with. */ while ((s = (unsigned char *)strchr((char *)s, prog->regstart)) != NULL) { if (regtry(prog, s)) return(1); s++; } else /* We don't -- general case. */ do { if (regtry(prog, s)) return(1); } while (*s++ != '\0'); /* Failure. */ return(0); } /* - regtry - try match at specific point */ STATIC int /* 0 failure, 1 success */ regtry(prog, string) regexp *prog; unsigned char *string; { register int i; register unsigned char **sp; register unsigned char **ep; reginput = string; regstartp = prog->startp; regendp = prog->endp; sp = prog->startp; ep = prog->endp; for (i = NSUBEXP; i > 0; i--) { *sp++ = NULL; *ep++ = NULL; } if (regmatch(prog->program + 1)) { prog->startp[0] = string; prog->endp[0] = reginput; return(1); } else return(0); } /* - regmatch - main matching routine * * Conceptually the strategy is simple: check to see whether the current * node matches, call self recursively to see whether the rest matches, * and then act accordingly. In practice we make some effort to avoid * recursion, in particular by going through "ordinary" nodes (that don't * need to know whether the rest of the match failed) by a loop instead of * by recursion. */ STATIC int /* 0 failure, 1 success */ regmatch(prog) unsigned char *prog; { register unsigned char *scan; /* Current node. */ unsigned char *next; /* Next node. */ #ifndef STDLIB extern char *strchr(); #endif scan = prog; #ifdef DEBUG if (scan != NULL && regnarrate) fprintf(stderr, "%s(\n", regprop(scan)); #endif while (scan != NULL) { #ifdef DEBUG if (regnarrate) fprintf(stderr, "%s...\n", regprop(scan)); #endif next = regnext(scan); switch (OP(scan)) { case BOL: if (reginput != regbol) return(0); break; case EOL: if (*reginput != '\0') return(0); break; case ANY: if (*reginput == '\0') return(0); reginput++; break; case EXACTLY: { register int len; register unsigned char *opnd; opnd = OPERAND(scan); /* Inline the first character, for speed. */ if (*opnd != *reginput) return(0); len = strlen((char *)opnd); if (len > 1 && strncmp((char *)opnd, (char *)reginput, len) != 0) return(0); reginput += len; } break; case ANYOF: if (*reginput == '\0' || strchr((char *)OPERAND(scan), *reginput) == NULL) return(0); reginput++; break; case ANYBUT: if (*reginput == '\0' || strchr((char *)OPERAND(scan), *reginput) != NULL) return(0); reginput++; break; case NOTHING: break; case BACK: break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: { register int no; register unsigned char *save; no = OP(scan) - OPEN; save = reginput; if (regmatch(next)) { /* * Don't set startp if some later * invocation of the same parentheses * already has. */ if (regstartp[no] == NULL) regstartp[no] = save; return(1); } else return(0); } break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: { register int no; register unsigned char *save; no = OP(scan) - CLOSE; save = reginput; if (regmatch(next)) { /* * Don't set endp if some later * invocation of the same parentheses * already has. */ if (regendp[no] == NULL) regendp[no] = save; return(1); } else return(0); } break; case BRANCH: { register unsigned char *save; if (OP(next) != BRANCH) /* No choice. */ next = OPERAND(scan); /* Avoid recursion. */ else { do { save = reginput; if (regmatch(OPERAND(scan))) return(1); reginput = save; scan = regnext(scan); } while (scan != NULL && OP(scan) == BRANCH); return(0); /* NOTREACHED */ } } break; case STAR: case PLUS: { register unsigned char nextch; register int no; register unsigned char *save; register int min; /* * Lookahead to avoid useless match attempts * when we know what character comes next. */ nextch = '\0'; if (OP(next) == EXACTLY) nextch = *OPERAND(next); min = (OP(scan) == STAR) ? 0 : 1; save = reginput; no = regrepeat(OPERAND(scan)); while (no >= min) { /* If it could work, try it. */ if (nextch == '\0' || *reginput == nextch) if (regmatch(next)) return(1); /* Couldn't or didn't -- back up. */ no--; reginput = save + no; } return(0); } break; case END: return(1); /* Success! */ break; default: regerror("memory corruption"); return(0); break; } scan = next; } /* * We get here only if there's trouble -- normally "case END" is * the terminating point. */ regerror("corrupted pointers"); return(0); } /* - regrepeat - repeatedly match something simple, report how many */ STATIC int regrepeat(p) unsigned char *p; { register int count = 0; register unsigned char *scan; register unsigned char *opnd; scan = reginput; opnd = OPERAND(p); switch (OP(p)) { case ANY: count = strlen((char *)scan); scan += count; break; case EXACTLY: while (*opnd == *scan) { count++; scan++; } break; case ANYOF: while (*scan != '\0' && strchr((char *)opnd, *scan) != NULL) { count++; scan++; } break; case ANYBUT: while (*scan != '\0' && strchr((char *)opnd, *scan) == NULL) { count++; scan++; } break; default: /* Oh dear. Called inappropriately. */ regerror("internal foulup"); count = 0; /* Best compromise. */ break; } reginput = scan; return(count); } /* - regnext - dig the "next" pointer out of a node */ STATIC unsigned char * regnext(p) register unsigned char *p; { register int offset; if (p == ®dummy) return(NULL); offset = NEXT(p); if (offset == 0) return(NULL); if (OP(p) == BACK) return(p-offset); else return(p+offset); } #ifdef DEBUG STATIC unsigned char *regprop(); /* - regdump - dump a regexp onto stdout in vaguely comprehensible form */ void regdump(r) regexp *r; { register unsigned char *s; register unsigned char op = EXACTLY; /* Arbitrary non-END op. */ register unsigned char *next; extern char *strchr(); s = r->program + 1; while (op != END) { /* While that wasn't END last time... */ op = OP(s); printf("%2d%s", s-r->program, regprop(s)); /* Where, what. */ next = regnext(s); if (next == NULL) /* Next ptr. */ printf("(0)"); else printf("(%d)", (s-r->program)+(next-s)); s += 3; if (op == ANYOF || op == ANYBUT || op == EXACTLY) { /* Literal string, where present. */ while (*s != '\0') { putchar(*s); s++; } s++; } putchar('\n'); } /* Header fields of interest. */ if (r->regstart != '\0') printf("start `%c' ", r->regstart); if (r->reganch) printf("anchored "); if (r->regmust != NULL) printf("must have \"%s\"", r->regmust); printf("\n"); } /* - regprop - printable representation of opcode */ STATIC unsigned char * regprop(op) unsigned char *op; { register unsigned char *p; STATIC unsigned char buf[50]; (void) strcpy(buf, ":"); switch (OP(op)) { case BOL: p = "BOL"; break; case EOL: p = "EOL"; break; case ANY: p = "ANY"; break; case ANYOF: p = "ANYOF"; break; case ANYBUT: p = "ANYBUT"; break; case BRANCH: p = "BRANCH"; break; case EXACTLY: p = "EXACTLY"; break; case NOTHING: p = "NOTHING"; break; case BACK: p = "BACK"; break; case END: p = "END"; break; case OPEN+1: case OPEN+2: case OPEN+3: case OPEN+4: case OPEN+5: case OPEN+6: case OPEN+7: case OPEN+8: case OPEN+9: sprintf(buf+strlen(buf), "OPEN%d", OP(op)-OPEN); p = NULL; break; case CLOSE+1: case CLOSE+2: case CLOSE+3: case CLOSE+4: case CLOSE+5: case CLOSE+6: case CLOSE+7: case CLOSE+8: case CLOSE+9: sprintf(buf+strlen(buf), "CLOSE%d", OP(op)-CLOSE); p = NULL; break; case STAR: p = "STAR"; break; case PLUS: p = "PLUS"; break; default: regerror("corrupted opcode"); break; } if (p != NULL) (void) strcat(buf, p); return(buf); } #endif /* * The following is provided for those people who do not have strcspn() in * their C libraries. They should get off their butts and do something * about it; at least one public-domain implementation of those (highly * useful) string routines has been published on Usenet. */ #ifdef STRCSPN /* * strcspn - find length of initial segment of s1 consisting entirely * of characters not from s2 */ STATIC int strcspn(s1, s2) unsigned char *s1; unsigned char *s2; { register unsigned char *scan1; register unsigned char *scan2; register int count; count = 0; for (scan1 = s1; *scan1 != '\0'; scan1++) { for (scan2 = s2; *scan2 != '\0';) /* ++ moved down. */ if (*scan1 == *scan2++) return(count); count++; } return(count); } #endif /* * Definitions etc. for regexp(3) routines. * * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], * not the System V one. */ #define NSUBEXP 10 typedef struct regexp { unsigned char *startp[NSUBEXP]; unsigned char *endp[NSUBEXP]; unsigned char regstart; /* Internal use only. */ unsigned char reganch; /* Internal use only. */ unsigned char *regmust; /* Internal use only. */ unsigned char regmlen; /* Internal use only. */ unsigned char program[1]; /* Unwarranted chumminess with * compiler. */ } regexp; /* * The first byte of the regexp internal "program" is actually this magic * number; the start node begins in the second byte. */ #define MAGIC 0234 /* * store.c - cawf(1) storage areas */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" struct rx Pat[] = { { "^[.'](i[ef]|el)", NULL}, /* 0 */ { "^[.']i[ef] !", NULL}, /* 1 */ { "^[.']i[ef] !?\\\\n\\(\\.\\$(>|>=|=|<|<=)[0-9] ", NULL}, /* 2 */ { "^[.']i[ef] !?'\\\\\\$[0-9]'[^']*' ", NULL}, /* 3 */ { "^[.']i[ef] !?[nt] ", NULL}, /* 4 */ { "\\\\\\$[0-9]", NULL}, /* 5 */ { "^[ \t]*$", NULL}, /* 6 */ { "\\\\|\t|-| ", NULL}, /* 7 */ { "[.!?:][]\\)'\\\"\\*]*$", NULL}, /* 8 */ { ",fP", NULL}, /* 9 */ { ",tP", NULL}, /* 10 */ { "^(ta|ll|ls|in|ti|po|ne|sp|pl|nr)", NULL}, /* 11 */ { "^(ll|ls|in|ti|po|pl)", NULL}, /* 12 */ { "[]\\)'\\\"\\*]", NULL}, /* 13 */ { "^(LH|CH|RH|LF|CF|RF)", NULL}, /* 14 */ { "^[.']i[ef]", NULL}, /* 15 */ { ",fR", NULL}, /* 16 */ { NULL, NULL} /* END */ }; int Adj = BOTHADJ; /* output line adjustment mode */ unsigned char *Aftnxt = NULL; /* action after next line */ unsigned char *Args[] = { NULL, NULL, /* 10 macro arguments */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; unsigned char *Argstack[10*MAXSP]; /* stack for Expand()'s "args[]" */ int Backc = 0; /* last word ended with '\\c' */ int Botmarg = 5; /* bottom margin */ int Centering = 0; /* centering count */ int Condstack[MAXSP]; /* stack for Expand()'s "cond" */ unsigned char *Cont = NULL; /* continue line append */ int Contlen = 0; /* continue line append length */ int Curmx = -1; /* current macro index */ char *Device = NULL; /* output device name */ char *Devconf = NULL; /* device configuration file path */ char *Devfont = NULL; /* output device font */ int Divert = 0; /* diversion status */ FILE *Efs = NULL; /* error file stream */ unsigned char *Eol = NULL; /* end of line information */ int Eollen = 0; /* end of line length */ int Err = 0; /* error flag */ unsigned char *F = NULL; /* field value */ struct fcode Fcode[] = { /* font codes */ { 'B', '\0'}, /* Bold */ { 'I', '\0'}, /* Italic */ { 'R', '\0'}, /* Roman */ { 'C', '\0'}, /* Courier */ { '\0', '\0'} }; int Fill = 0; /* fill status */ unsigned char Font[] = { '\0', '\0' }; /* current font */ int Fontctl; /* output font control */ char Fontstat = 'R'; /* output font status */ int Fph = 0; /* first page header status */ int Fsp = 0; /* files stack pointer (for .so) */ struct fontstr Fstr; /* font control strings */ unsigned char *Ftc = NULL; /* center footer */ unsigned char *Ftl = NULL; /* left footer */ unsigned char *Ftr = NULL; /* right footer */ unsigned char *Hdc = NULL; /* center header */ int Hdft = 0; /* header/footer status */ unsigned char *Hdl = NULL; /* left header */ unsigned char *Hdr = NULL; /* right header */ struct hytab Hychar[MAXHYCH]; /* hyphen characters */ FILE *Ifs = NULL; /* input file stream */ FILE *Ifs_stk[MAXFSTK]; /* Ifs stack */ int Ind = 0; /* indentation amount */ unsigned char *Inname = NULL; /* input file name */ unsigned char *Inn_stk[MAXFSTK]; /* Inname stack */ int LL = 78; /* line length (default) */ unsigned char Line[MAXLINE]; /* input line */ int Lockil = 0; /* pass 2 line number is locked * (processing is inside macro) */ int Marg = 0; /* macro argument - man, ms, etc. */ struct macro Macrotab[MAXMACRO]; /* macro table */ unsigned char *Macrotxt[MAXMTXT]; /* macro text */ int Mtx = 0; /* macro text index */ int Mxstack[MAXSP]; /* stack for Expand()'s "mx" */ int Nfc; /* number of font codes */ int Nhnr[MAXNHNR]; /* ".NH" numbers */ int Nhy = 0; /* number of Hychar[] entries */ int Nleftstack[MAXSP]; /* stack for Expand()'s "nleft" */ int Nmac = 0; /* number of macros */ int Nnr = 0; /* number of Numb[] entries */ int Nospmode = 1; /* no space mode */ int Nparms = 0; /* number of Parms[] entries */ int NR = 0; /* number of record ala awk */ int NR_stk[MAXFSTK]; /* NR stack */ int Nsch = 0; /* number of Schar[] entries */ int Nstr = 0; /* number of entries in Str[] */ int Ntabs = 0; /* number of TAB positions */ struct nbr Numb[MAXNR]; /* number registers */ int Nxtln = 1; /* next line number */ int Outll = -1; /* output line length */ unsigned char Outln[MAXOLL*2]; /* output line */ int Outlx = 0; /* output line index */ int P2il = 0; /* pass 2 input line number */ unsigned char *P2name = NULL; /* pass 2 input file name */ int P3fill = 1; /* pass 3 fill status */ int Padchar[MAXOLL]; /* padding character locations */ int Padfrom = PADLEFT; /* which end to pad from */ int Padx = 0; /* Padchar[] index */ struct parms Parms[] = { /* parameter registers */ { {'i', 'n'}, "indent", 0, 0 }, { {'l', 'l'}, "linelen", 0, 0 }, { {'l', 's'}, "vspace", 0, 0 }, { {'t', 'i'}, "tempindent", 0, 0 }, { {'p', 'o'}, "pageoffset", 0, 0 }, { {'p', 'l'}, "pagelen", 0, 0 }, { {'\0', '\0'}, NULL, 0, 0 } }; unsigned char Pass1ln[MAXLINE]; /* pass 1 output line */ unsigned char Pass2ln[MAXLINE]; /* pass 2 output line */ int Pglen = 66; /* page length */ int Pgoff = 0; /* page offset */ char *Pname = NULL; /* program name */ unsigned char Prevfont = '\0'; /* previous font */ int Ptrstack[MAXSP]; /* stack for Expand()'s "ptr" */ struct scale Scale[] = { /* scaling factors */ { 'i', (240.0) }, { 'c', ((240.0 * 50.0)/127.0) }, { 'P', (240.0/6.0) }, { 'p', (240.0/72.0) }, { 'u', (1.0) }, { 'm', (1.0) }, { 'n', (1.0) }, { 'v', (1.0) }, { '\0', (0.0) } }; double Scalen = 0.0; /* 'n' scaling factor */ double Scaleu = 0.0; /* 'u' scaling factor */ double Scalev = 0.0; /* 'v' scaling factor */ struct schtab Schar[MAXSCH]; /* special characters */ int Sp = -1; /* stack pointer */ struct str Str[MAXSTR]; /* ".ds" strings */ int Sx = -1; /* string index */ int Tabs[MAXEXP+1]; /* TAB positions */ int Thispg = 1; /* this page number */ int Tind = 0; /* temporary indentation amount */ int Topmarg = 5; /* top margin */ unsigned char *Trtbl = NULL; /* .tr table */ int Uhyph = 0; /* hyphen usage state */ int Vspace = 1; /* vertical (inter-text-line) spacing */ unsigned char Word[MAXLINE]; /* pass 2 word buffer */ int Wordl = 0; /* effective length of Word[] */ int Wordx = 0; /* Word[] index */ int Dowarn = 1; /* Enable warnings if true */ =/* * string.c - string support functions for cawf(1) */ /* * Copyright (c) 1991 Purdue University Research Foundation, * West Lafayette, Indiana 47907. All rights reserved. * * Written by Victor A. Abell , Purdue * University Computing Center. Not derived from licensed software; * derived from awf(1) by Henry Spencer of the University of Toronto. * * Permission is granted to anyone to use this software for any * purpose on any computer system, and to alter it and redistribute * it freely, subject to the following restrictions: * * 1. The author is not responsible for any consequences of use of * this software, even if they arise from flaws in it. * * 2. The origin of this software must not be misrepresented, either * by explicit claim or by omission. Credits must appear in the * documentation. * * 3. Altered versions must be plainly marked as such, and must not * be misrepresented as being the original software. Credits must * appear in the documentation. * * 4. This notice may not be removed or altered. */ #include "cawf.h" #include _PROTOTYPE(static void Setroman,()); /* * Asmname(s, c) - assemble name */ Asmname(s, c) unsigned char *s; /* pointer to name */ unsigned char *c; /* code destination (c[3]) */ { c[1] = c[2] = '\0'; while (*s && *s == ' ') s++; if ((c[0] = *s) == '\0') return(0); return(((c[1] = s[1]) == '\0') ? 1 : 2); } /* * Delstr(sx) - delete string */ void Delstr(sx) int sx; /* string index */ { char buf[MAXLINE]; /* message buffer */ if (sx >= Nstr) { (void) sprintf(buf, " bad Delstr(%d) index", sx); Error(FATAL, LINE, buf, NULL); } Free(&Str[sx].str); while (sx < (Nstr - 1)) { Str[sx] = Str[sx + 1]; sx++; } Nstr--; } /* * Endword() - end a word */ void Endword() { if (Fontstat != 'R') Setroman(); Word[Wordx] = '\0'; } /* * Findchar(nm, l, s, e) - find special character definition and * optionally enter it */ Findchar(nm, l, s, e) unsigned char *nm; /* character name */ int l; /* effective length */ unsigned char *s; /* value string */ int e; /* 0 = find, don't enter * 1 = don't find, enter */ { int cmp, hi, low, mid; unsigned char c[3]; c[0] = nm[0]; c[1] = (nm[1] == ' ' || nm[1] == '\t') ? '\0' : nm[1]; c[2] = '\0'; low = mid = 0; hi = Nsch - 1; while (low <= hi) { mid = (low + hi) / 2; if ((cmp = strncmp((char *)c, (char *)Schar[mid].nm, 2)) < 0) hi = mid - 1; else if (cmp > 0) low = mid + 1; else { if ( ! e) return(mid); Free(&Schar[mid].str); goto new_char; } } if ( ! e) return(-1); if (Nsch >= MAXSCH) Error(FATAL, LINE, " at character table limit", NULL); if (Nsch) { if (cmp > 0) mid++; for (hi = Nsch - 1; hi >= mid; hi--) Schar[hi+1] = Schar[hi]; } Nsch++; Schar[mid].nm[0] = c[0]; Schar[mid].nm[1] = c[1]; new_char: Schar[mid].str = Newstr(s); Schar[mid].len = l; return(mid); } /* * Findhy(s, l, e) - find and optionally enter hyphen */ Findhy(s, l, e) unsigned char *s; /* value string */ int l; /* equivalent length */ int e; /* 0 = find, don't enter * 1 = enter, don't find */ { int i; for (i = 0; i < Nhy; i++) { if (Font[0] == Hychar[i].font) break; } if (i >= Nhy) { if ( ! e) return(-1); if (Nhy >= MAXHYCH) Error(FATAL, LINE, " at hyphen limit for font ", (char *)Font); Hychar[i].font = Font[0]; Nhy++; } else { if ( ! e) return(i); Error(WARN, LINE, " duplicate hyphen for font ", (char *)Font); Free(&Hychar[i].str); } Hychar[i].str = Newstr(s); Hychar[i].len = l; return(i); } /* * Findstr(nm, s, e) - find and optionally enter string in Str[] */ unsigned char * Findstr(nm, s, e) unsigned char *nm; /* 2 character string name */ unsigned char *s; /* string value */ int e; /* 0 = find, don't enter * 1 = enter, don't find */ { unsigned char c[3]; /* character buffer */ int cmp, hi, low, mid; /* binary search controls */ int i; /* temporary indexes */ unsigned char *s1, *s2; /* temporary string pointers */ c[0] = nm[0]; c[1] = (nm[1] == ' ' || nm[1] == '\t') ? '\0' : nm[1]; c[2] = '\0'; low = mid = 0; hi = Nstr - 1; Sx = -1; while (low <= hi) { mid = (low + hi) / 2; if ((cmp = strncmp((char *)c, (char *)Str[mid].nm, 2)) < 0) hi = mid - 1; else if (cmp > 0) low = mid + 1; else { Sx = mid; if ( ! e) return(Str[mid].str); Free(&Str[mid].str); goto new_string; } } if ( ! e) return((unsigned char *)""); if (Nstr >= MAXSTR) Error(FATAL, LINE, " out of space for string ", (char *)c); if (Nstr) { if (cmp > 0) mid++; for (hi = Nstr - 1; hi >= mid; hi--) Str[hi+1] = Str[hi]; } Nstr++; Sx = mid; Str[mid].nm[0] = c[0]; Str[mid].nm[1] = c[1]; new_string: if (s == NULL) return (Str[mid].str = Newstr((unsigned char *)"")); i = (*s == '"') ? 1 : 0; s1 = Str[mid].str = Newstr(s + i); if (i) { s2 = s1 + strlen((char *)s1); if (s2 > s1 && *(s2-1) == '"') *(s2-1) = '\0'; } return(s1); } /* * Setroman() - set Roman font */ static void Setroman() { int i; if ((Wordx + Fstr.rl) >= MAXLINE) Error(WARN, LINE, " word too long", NULL); else { if (Fstr.r) { for (i = 0; i < Fstr.rl; i++) { Word[Wordx++] = Fstr.r[i]; } } Fontstat = 'R'; } } /* * Str2word(s, len) - copy len characters from string to Word[] */ Str2word(s, len) unsigned char *s; int len; { int i; for (; len > 0; len--, s++) { switch (Font[0]) { case 'B': case 'C': if (Fontctl == 0) { if ((Wordx + 5) >= MAXLINE) { word_too_long: Error(WARN, LINE, " word too long", NULL); return(1); } Word[Wordx++] = Trtbl[(int)*s]; Word[Wordx++] = '\b'; Word[Wordx++] = Trtbl[(int)*s]; Word[Wordx++] = '\b'; Word[Wordx++] = Trtbl[(int)*s]; break; } if (Fontstat != Font[0]) { if (Fontstat != 'R') Setroman(); if ((Wordx + Fstr.bl) >= MAXLINE) goto word_too_long; if (Fstr.b) { for (i = 0; i < Fstr.bl; i++) { Word[Wordx++] = Fstr.b[i]; } } Fontstat = Font[0]; } if ((Wordx + 1) >= MAXLINE) goto word_too_long; Word[Wordx++] = Trtbl[(int)*s]; break; case 'I': if (isalnum(*s)) { if (Fontctl == 0) { if ((Wordx + 3) >= MAXLINE) goto word_too_long; Word[Wordx++] = '_'; Word[Wordx++] = '\b'; Word[Wordx++] = Trtbl[(int)*s]; break; } if (Fontstat != 'I') { if (Fontstat != 'R') Setroman(); if ((Wordx + Fstr.itl) >= MAXLINE) goto word_too_long; if (Fstr.it) { for (i = 0; i < Fstr.itl; i++) { Word[Wordx++] = Fstr.it[i]; } } Fontstat = 'I'; } if ((Wordx + 1) >= MAXLINE) goto word_too_long; Word[Wordx++] = Trtbl[(int)*s]; break; } /* else fall through */ default: if (Fontstat != 'R') Setroman(); if ((Wordx + 1) >= MAXLINE) goto word_too_long; Word[Wordx++] = Trtbl[(int)*s]; } } return(0); } ' ...( Makefile) README* de.c+ de.h, de_diskio.c- de_recover.c. de_stdin.c/ de_stdout.c# Makefile for de CC = cc CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -D_POSIX_1_SOURCE=2 all: de OBJS = de.o de_stdin.o de_stdout.o de_diskio.o de_recover.o de: $(OBJS) $(CC) -i $(OBJS) -o de install -S 4kw de install: /usr/bin/de /usr/bin/de: de install -cs -o bin de $@ $(OBJS): de.h clean: rm -f *.bak *.o de de - A Minix Disk Editor Terrence W. Holm, Jan. 1989 INTRODUCTION The de(1) disk editor allows a system administrator to look at and modify a Minix file system device. Commands allow movement throughout a file system device, displaying information in a couple of formats, writing blocks from the device onto another file, and rewriting words on the disk. A few changes to the Minix file system aid recovering files. I-node numbers are retained in directory entries now (they get moved to the end). And all the i-node information is not zeroed-out when a file is unlinked. So, after a file is accidently rm(1)'ed, you can find the old i-node, and then manually (or automatically) go to each of the freed blocks and write them to a new file. USES FOR THE DISK EDITOR 1) EDUCATION. Students can look at a file system in a painless manner. For example you don't have to use od(1) to look at the zone numbers in i-nodes. A simple assignment is to change the size of an un-mounted floppy disk file system from 360 to 300 blocks. (A more difficult assignment is to explain why this works, even though fsck(1) and df(1) do not report the correct number of free blocks. :-) 2) ADMINISTRATION. You can visually check inconsistencies reported by fsck(1) before letting fsck(1) fix them. You can change any word on the disk, this greatly simplifies editing file system information. For example, changing the size of a block special device is actually fun, no more "blind" writing to your partitions. Bit maps can be displayed with 2048 "bits" per screen, (on the IBM/PC console), see how your zones are allocated! 3) RECOVERING LOST FILES. You can search a disk for an ASCII string, once found, the block can be written out to a file. A one line change to fs/path.c allows users to get the i-node number for a file after it has been removed from a directory. Another couple lines changed in the file system keep the i-node information available until the i-node is reused (normally this information is zeroed out when an i-node is released.) This allows a de(1) user to go to a released i-node, get all the block numbers, go to these blocks and write them back to a new file. The whole recovery process is automated by running "de -r file". So, IF a file is unlink(2)'ed (eg. "rm file"), AND IF no one allocates a new i-node or block in the mean-time, THEN you can recover the file. RECOVERY SECURITY Normally Minix hard disk partitions are r/w only by the super-user, and floppy disks are r/w by anyone. This means that only "root" can look at hard disk partitions, but others can use de(1) to play with their floppy disks. When recovering files ("de -r file"), a user requires access to the major file system partitions. This can be done by: (a) Give everyone access to the hard disks. DON'T DO THIS, it defeats all the file system protection we already have. (b) Make de(1) set-uid "root". This is the way to go, IF you are running a Minix system that has NO ACCESS from the outside. This allows anyone to execute "de -r file", but only root to use "de /dev/hd3". De(1) does some checking when retrieving lost blocks, eg. making sure they really are free blocks and making sure the user owned the i-node. BUT, file system information has been lost when the file was unlink(2)'ed, so de(1) can not be 100% sure that a recovered block really belonged to the user. THIS IS A SECURITY HOLE. [Since the only access to my machine is from observable terminals and their associated humans, I run de(1) as set-uid root.] (c) Keep the disks rw-------, and don't set-uid de(1). This means that only the super-user can recover lost files. So, if you accidently "rm", you must tell the system administrator to "su" and recover your file, (be sure to inform the other users to stop whatever they are doing until the file is restored). INSTALLATION - Install de.1 in /usr/man/cat1. - Install the files: Makefile, README, de.h, de.c, de_stdin.c, de_stdout.c, de_diskio.c and de_recover.c in commands/de. Add -F and -T. to the Makefile, if necessary. - "make" de(1). If a header file is not found, don't worry: You probably have it somewhere, just link it to what de(1) is looking for. This program also requires the subroutine tolower(3), see EFTH MINIX report #50, if you don't have it. - Do you really want set-uid root on de? - Patch the files fs/path.c, fs/link.c and fs/open.c. If you don't patch the file system then the recover option "-r" and associated commands ('x' and 'X') will not work, but de(1) is still functional and useful. - "make" a new fs, using -DRECOVER. Rebuild a boot diskette. USING DE(1) FOR THE FIRST TIME De(1) starts up in "word" mode at block 0 of the specified device. Hit the PGDN (or space bar) a few times, observing all the information on the screen. Each PGUP/PGDN moves to the next 1024 byte block, (de(1) only knows about 1 block per zone file systems). Note that "word" mode only displays 32 bytes at a time, so you are only observing the first 32 bytes in the first few blocks when you skip using PGDN. Now go back to block 3, (zone bit map), using "g 3 ENTER". Change to "map" mode "v m", and then use the down arrow key to check each 2 Megs in the zone bit map. Now change to "block" mode using "v b". And go to some data block, eg. "g 1000 ENTER". Use PGUP/PGDN to see what data is in each nearby block. Remember 'h' gives you a help page. Try some more commands, for example: 'END', 'I', '/'. (Note: searching through a whole disk under Minix takes a long time: 30-60 seconds per megabyte, depending on your machine, drive and controller, [Minix is embarrassingly slow].) Don't worry about looking at a mounted device, you must specify the "-w" option before the 's' command is operational, and this command is the only one which will try to modify the contents of the device. MINIX-ST Please contact me if you are interesting in attempting a port to MINIX-ST. /****************************************************************/ /* */ /* de.c */ /* */ /* Main loop of the "Disk editor". */ /* */ /****************************************************************/ /* origination 1989-Jan-15 Terrence W. Holm */ /****************************************************************/ #include #include #include #include #include #include #include #undef ERROR /* arrgghh, errno.h has this pollution */ #include #include #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/inode.h" #include "de.h" static char copyright[] = "de (c) Terrence W. Holm 1989"; _PROTOTYPE(void Push , (de_state *s )); _PROTOTYPE(int Get_Base , (int *base )); _PROTOTYPE(int Get_Filename , (de_state *s )); _PROTOTYPE(int Get_Count , (char *units , unsigned long *result )); _PROTOTYPE(void Exec_Shell , (void)); _PROTOTYPE(void Sigint , (int)); /****************************************************************/ /* */ /* main() */ /* */ /* Initialize. Handle the "-r" recovery option if */ /* specified, else enter the main processing loop. */ /* */ /****************************************************************/ void main( argc, argv ) int argc; char *argv[]; { static de_state s; /* it is safer not to put it on the stack * and some things probably now rely on zero * initialization */ char *command_name = argv[0]; int recover = 0; s.device_mode = O_RDONLY; /* Parse arguments */ if ( argc == 3 && strcmp( argv[1], "-r" ) == 0 ) { recover = 1; --argc; ++argv; } else if ( argc == 3 && strcmp( argv[1], "-w" ) == 0 ) { s.device_mode = O_RDWR; --argc; ++argv; } if ( argc != 2 || *argv[1] == '-' ) { fprintf( stderr, "Usage: %s [-w] /dev/device\n", command_name ); fprintf( stderr, " %s -r lost_file_name\n", command_name ); exit( 1 ); } /* Set the effective id to the real id. This eliminates */ /* any increase in privilege done by a set-uid bit on the */ /* executable file. We want to be "root" for recovering */ /* files, because we must be able to read the device. */ /* However, in normal usage, de(1) should not let just */ /* anyone look at a file system, thus we drop the privilege. */ /* */ /* NOTE: There is a security hole when using "-r" with a */ /* set-uid de(1). Do not use set-uid root if there is any */ /* way to externally access your Minix system. */ if ( ! recover ) { setuid( getuid() ); setgid( getgid() ); } /* Set terminal characteristics, and ^C interrupt handler */ Save_Term(); if ( signal( SIGINT, SIG_IGN ) != SIG_IGN ) { signal( SIGINT, Sigint ); signal( SIGQUIT, Sigint ); } Set_Term(); if ( ! Init_Termcap() ) Error( "Requires a termcap entry" ); /* Get the device file name. If recovering, also open an output file. */ if ( recover ) { char *dir_name; char *file_name; struct stat device_stat; struct stat tmp_stat; /* Split the path name into a directory and a file name. */ if ( strlen(argv[1]) > MAX_STRING ) Error( "Path name too long" ); if ( ! Path_Dir_File( argv[1], &dir_name, &file_name ) ) Error( "Recover aborted" ); /* Find the device holding the directory. */ if ( (s.device_name = File_Device( dir_name )) == NULL ) Error( "Recover aborted" ); /* The output file will be in /tmp with the same file name. */ strcpy( s.file_name, TMP ); strcat( s.file_name, "/" ); strcat( s.file_name, file_name ); /* Make sure /tmp is not on the same device as the file we */ /* are trying to recover (we don't want to use up the free */ /* i-node and blocks before we get a chance to recover them). */ if ( stat( s.device_name, &device_stat ) == -1 ) Error( "Can not stat(2) device %s", s.device_name ); if ( stat( TMP, &tmp_stat ) == -1 ) Error( "Can not stat(2) directory %s", TMP ); if ( device_stat.st_rdev == tmp_stat.st_dev ) Error( "Will not recover files on the same device as %s", TMP ); if ( access( s.file_name, F_OK ) == 0 ) Error( "Will not overwrite file %s", s.file_name ); /* Open the output file. */ if ( (s.file_f = fopen( s.file_name, "w" )) == NULL ) Error( "Can not open file %s", s.file_name ); /* Don't let anyone else look at the recovered file */ chmod( s.file_name, 0700 ); /* If running as root then change the owner of the */ /* restored file. If not running as root then the */ /* chown(2) will fail. */ chown( s.file_name, getuid(), getgid() ); } else { s.device_name = argv[1]; s.file_name[ 0 ] = '\0'; } /* Open the device file. */ { struct stat device_stat; off_t size; if ( stat( s.device_name, &device_stat ) == -1 ) Error( "Can not find file %s", s.device_name ); if ( (device_stat.st_mode & S_IFMT) != S_IFBLK && (device_stat.st_mode & S_IFMT) != S_IFREG ) Error( "Can only edit block special or regular files" ); if ( (s.device_d = open( s.device_name, s.device_mode )) == -1 ) Error( "Can not open %s", s.device_name ); if ( (size = lseek( s.device_d, 0L, SEEK_END )) == -1 ) Error( "Error seeking %s", s.device_name ); if ( size % K != 0 ) { Warning( "Device size is not a multiple of 1024" ); Warning( "The (partial) last block will not be accessible" ); } } /* Initialize the rest of the state record */ s.mode = WORD; s.output_base = 10; s.search_string[ 0 ] = '\0'; { int i; for ( i = 0; i < MAX_PREV; ++i ) { s.prev_addr[ i ] = 0L; s.prev_mode[ i ] = WORD; } } sync(); Read_Super_Block( &s ); Read_Bit_Maps( &s ); s.address = 0L; /* Recover mode basically performs an 'x' and an 'X' */ if ( recover ) { ino_t inode = Find_Deleted_Entry( &s, argv[1] ); off_t size; if ( inode == 0 ) { unlink( s.file_name ); Error( "Recover aborted" ); } s.address = ( (long) s.first_data - s.inode_blocks ) * K + (long) (inode - 1) * s.inode_size; Read_Block( &s, s.buffer ); /* Have found the lost i-node, now extract the blocks. */ if ( (size = Recover_Blocks( &s )) == -1L ) { unlink( s.file_name ); Error( "Recover aborted" ); } Reset_Term(); printf( "Recovered %ld bytes, written to file %s\n", size, s.file_name ); exit( 0 ); } /* Enter the main loop, first time redraw the screen */ { int rc = REDRAW; do { if ( rc == REDRAW ) { Read_Block( &s, s.buffer ); Draw_Screen( &s ); s.last_addr = s.address; Draw_Pointers( &s ); } else if ( rc == REDRAW_POINTERS ) { s.offset = (unsigned) (s.address & ~ K_MASK); Draw_Pointers( &s ); } else if ( rc == ERROR ) { Erase_Prompt(); putchar( BELL ); } } while ( (rc = Process( &s, Arrow_Esc(Get_Char()) )) != EOF ); } /* If there is an open output file that was never written to */ /* then remove its directory entry. This occurs when no 'w' */ /* or 'W' command occurred between a 'c' command and exiting */ /* the program. */ if ( s.file_name[0] != '\0' && ! s.file_written ) unlink( s.file_name ); Reset_Term(); /* Restore terminal characteristics */ exit( 0 ); } /****************************************************************/ /* */ /* Get_Base( base ) */ /* */ /* Get a new base value. */ /* Returns REDRAW or ERROR. */ /* */ /****************************************************************/ int Get_Base( base ) int *base; { switch ( Get_Char() ) { case4=6=7=8=9=:=;=<===>=?=@=A=B=C=D=E= 'h' : *base = 16; break; case 'd' : *base = 10; break; case 'o' : *base = 8; break; case 'b' : *base = 2; break; default : return( ERROR ); } return( REDRAW ); } /****************************************************************/ /* */ /* Process( state, input_char ) */ /* */ /* Determine the function requested by the */ /* input character. Returns OK, REDRAW, */ /* REDRAW_POINTERS, ERROR or EOF. */ /* */ /****************************************************************/ int Process( s, c ) de_state *s; int c; { switch ( c ) { case 'b' : /* Back up one block */ case ESC_PGUP : if ( s->address == 0 ) return( ERROR ); s->address = (s->address - K) & K_MASK; return( REDRAW ); case 'B' : /* Back up to home */ case ESC_HOME : if ( s->address == 0 ) return( OK ); Push( s ); s->address = 0L; return( REDRAW ); case 'c' : /* Change file name */ { int rc = Get_Filename( s ); return( rc == OK ? REDRAW : rc ); } case 'd' : /* Down */ case ESC_DOWN : { s->last_addr = s->address; switch ( s->mode ) { case WORD : s->address += 2; if ( (s->address & PAGE_MASK) == 0 ) return( REDRAW ); return( REDRAW_POINTERS ); case BLOCK : s->address += 64; if ( (s->last_addr & K_MASK) != (s->address & K_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); case MAP : s->address += 256; return( REDRAW ); default : Error( "Internal fault (mode)" ); } } case 'f' : /* Forward one block */ case ' ' : case ESC_PGDN : if ( s->block == s->device_size - 1 ) return( ERROR ); s->address = (s->address + K) & K_MASK; return( REDRAW ); case 'F' : /* Forward to end */ case ESC_END : { off_t last_block = ( (long) s->device_size - 1 ) * K; if ( s->address == last_block ) return( OK ); Push( s ); s->address = last_block; return( REDRAW ); } case 'g' : /* Goto block */ { unsigned long block; if ( Get_Count( "Block?", &block ) ) { if ( block >= s->zones ) { Warning( "Block number too large" ); return( REDRAW ); } Push( s ); s->address = (off_t) block * K; return( REDRAW ); } else return( ERROR ); } case 'G' : /* Goto block indirect */ { unsigned block = *( (word_t *) &s->buffer[ s->offset ] ); if ( s->mode != WORD ) { Warning( "Must be in visual mode \"word\"" ); return( REDRAW ); } if ( block >= s->zones ) { Warning( "Block number too large" ); return( REDRAW ); } Push( s ); s->mode = BLOCK; s->address = (long) block * K; return( REDRAW ); } case 'h' : /* Help */ case '?' : Draw_Help_Screen( s ); Wait_For_Key(); return( REDRAW ); case 'i' : /* Goto i-node */ { unsigned long inode; if ( Get_Count( "I-node?", &inode ) ) { if ( inode < 1 || inode > s->inodes ) { Warning( "Illegal i-node number" ); return( REDRAW ); } Push( s ); s->mode = WORD; s->address = (off_t) (s->first_data - s->inode_blocks) * K + (off_t) (inode - 1) * s->inode_size; return( REDRAW ); } else return( ERROR ); } case 'I' : /* Filename to i-node */ { ino_t inode; char *filename; Draw_Prompt( "File name?" ); filename = Get_Line(); if ( filename == NULL || filename[0] == '\0' ) return( ERROR ); inode = Find_Inode( s, filename ); if ( inode ) { Push( s ); s->mode = WORD; s->address = ( (long) s->first_data - s->inode_blocks ) * K + (long) (inode - 1) * s->inode_size; } return( REDRAW ); } case 'l' : /* Left */ case ESC_LEFT : { s->last_addr = s->address; switch ( s->mode ) { case WORD : s->address = s->address - 32; return( REDRAW ); case BLOCK : s->address -= 1; if ( (s->last_addr & K_MASK) != (s->address & K_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); case MAP : s->address -= 4; if ( (s->last_addr & ~ MAP_MASK) != (s->address & ~ MAP_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); default : Error( "Internal fault (mode)" ); } } case 'm' : /* Invoke a Minix shell */ Reset_Term(); Exec_Shell(); Set_Term(); return( REDRAW ); case 'n' : /* Search for next */ { off_t addr; if ( s->search_string[0] == '\0' ) { Warning( "No search string defined" ); return( REDRAW ); } Draw_Prompt( "Searching..." ); if ( (addr = Search( s, s->search_string )) == -1L ) { Warning( "Search string not found" ); Wait_For_Key(); return( REDRAW ); } Push( s ); s->address = addr; return( REDRAW ); } case 'o' : /* Set output base */ Draw_Prompt( "Output base?" ); return( Get_Base( &s->output_base ) ); case 'p' : /* Previous address */ { int i; s->address = s->prev_addr[ 0 ]; s->mode = s->prev_mode[ 0 ]; for ( i = 0; i < MAX_PREV - 1; ++i ) { s->prev_addr[ i ] = s->prev_addr[ i + 1 ]; s->prev_mode[ i ] = s->prev_mode[ i + 1 ]; } return( REDRAW ); } case 'q' : /* Quit */ case EOF : case CTRL_D : return( EOF ); case 'r' : /* Right */ case ESC_RIGHT : { s->last_addr = s->address; switch ( s->mode ) { case WORD : s->address += 32; return( REDRAW ); case BLOCK : s->address += 1; if ( (s->last_addr & K_MASK) != (s->address & K_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); case MAP : s->address += 4; if ( (s->last_addr & ~ MAP_MASK) != (s->address & ~ MAP_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); default : Error( "Internal fault (mode)" ); } } case 's' : /* Store word */ { unsigned long word; if ( s->mode != WORD ) { Warning( "Must be in visual mode \"word\"" ); return( REDRAW ); } if ( s->device_mode == O_RDONLY ) { Warning( "Use -w option to open device for writing" ); return( REDRAW ); } if ( Get_Count( "Store word?", &word ) ) { if ( word != (word_t) word ) { Warning( "Word is more than 16 bits" ); return( REDRAW ); } Write_Word( s, (word_t) word ); return( REDRAW ); } else return( ERROR ); } case 'u' : /* Up */ case ESC_UP : { s->last_addr = s->address; switch ( s->mode ) { case WORD : s->address -= 2; if ( (s->last_addr & PAGE_MASK) == 0 ) return( REDRAW ); return( REDRAW_POINTERS ); case BLOCK : s->address -= 64; if ( (s->last_addr & K_MASK) != (s->address & K_MASK) ) return( REDRAW ); return( REDRAW_POINTERS ); case MAP : s->address -= 256; return( REDRAW ); default : Error( "Internal fault (mode)" ); } } case 'v' : /* Visual mode */ Draw_Prompt( "Visual mode?" ); switch ( Get_Char() ) { case 'w' : s->mode = WORD; break; case 'b' : s->mode = BLOCK; break; case 'm' : { /* Assume user knows if map mode is possible char *tty = ttyname( 0 ); if ( tty == NULL || strcmp( tty, "/dev/tty0" ) != 0 ) Warning( "Must be at console" ); else */ s->mode = MAP; break; } default : return( ERROR ); } return( REDRAW ); case 'w' : /* Write ASCII block */ if ( s->file_name[0] == '\0' ) { int rc = Get_Filename( s ); if ( rc != OK ) return( rc ); } /* We have a successfully opened file */ /* Eliminate non-ASCII characters */ { int i; char buf[ K ]; char *from = s->buffer; char *to = buf; for ( i = 0; i < K; ++i, ++from ) { *to = *from & 0x7f; if ( *to != '\0' && *to != '\177' ) ++to; } if ( fwrite( buf, 1, (int)(to - buf), s->file_f ) != to - buf ) Warning( "Problem writing out buffer" ); s->file_written = 1; return( REDRAW ); } case 'W' : /* Write block exactly */ if ( s->file_name[0] == '\0' ) { int rc = Get_Filename( s ); if ( rc != OK ) return( rc ); } /* We have a successfully opened file */ if ( fwrite( s->buffer, 1, K, s->file_f ) != K ) Warning( "Problem writing out buffer" ); s->file_written = 1; return( REDRAW ); case 'x' : /* eXtract lost entry */ { ino_t inode; char *filename; Draw_Prompt( "Lost file name?" ); filename = Get_Line(); if ( filename == NULL || filename[0] == '\0' ) return( ERROR ); inode = Find_Deleted_Entry( s, filename ); if ( inode ) { Push( s ); s->mode = WORD; s->address = ( (long) s->first_data - s->inode_blocks ) * K + (long) (inode - 1) * s->inode_size; } return( REDRAW ); } case 'X' : /* eXtract lost blocks */ { int rc; if ( s->mode != WORD ) { Warning( "Must be in visual mode \"word\"" ); return( REDRAW ); } /* Force a new output file name. */ if ( (rc = Get_Filename( s )) != OK ) return( rc ); Draw_Strings( s ); Erase_Prompt(); Draw_Prompt( "Recovering..." ); if ( Recover_Blocks( s ) == -1L ) unlink( s->file_name ); /* Force closure of output file. */ fclose( s->file_f ); s->file_name[ 0 ] = '\0'; return( REDRAW ); } case '/' : /* Search */ case ESC_PLUS : { off_t addr; char *string; Draw_Prompt( "Search string?" ); string = Get_Line(); if ( string == NULL ) return( ERROR ); if ( string[0] != '\0' ) { strcpy( s->search_string, string ); Draw_Strings( s ); } else if ( s->search_string[0] == '\0' ) { Warning( "No search string defined" ); return( REDRAW ); } Erase_Prompt(); Draw_Prompt( "Searching..." ); if ( (addr = Search( s, s->search_string )) == -1L ) { Warning( "Search string not found" ); Wait_For_Key(); return( REDRAW ); } Push( s ); s->mode = BLOCK; s->address = addr; return( REDRAW ); } default: return( ERROR ); } } /****************************************************************/ /* */ /* Push( state ) */ /* */ /* Push current address and mode, used by the */ /* commands B, F, g, G, i, I, n, x and /. This */ /* information is popped by the 'p' command. */ /* */ /****************************************************************/ void Push( s ) de_state *s; { int i; for ( i = MAX_PREV - 1; i > 0; --i ) { s->prev_addr[ i ] = s->prev_addr[ i - 1 ]; s->prev_mode[ i ] = s->prev_mode[ i - 1 ]; } s->prev_addr[ 0 ] = s->address; s->prev_mode[ 0 ] = s->mode; } /****************************************************************/ /* */ /* Get_Filename( state ) */ /* */ /* Read and check a filename. */ /* */ /****************************************************************/ int Get_Filename( s ) de_state *s; { char *filename; char *name; FILE *f; Draw_Prompt( "File name?" ); filename = Get_Line(); if ( filename == NULL || filename[0] == '\0' ) return( ERROR ); for ( name = filename; *name != '\0'; ++name ) if ( ! isgraph( *name ) ) { Warning( "File name contains non-graphic characters" ); return( REDRAW ); } if ( access( filename, F_OK ) == 0 ) { Warning( "Will not overwrite file %s", filename ); return( REDRAW ); } if ( (f = fopen( filename, "w" )) == NULL ) { Warning( "Can not open file %s", filename ); return( REDRAW ); } /* If there is already an open output file then */ /* close it. If it was never written to then */ /* remove its directory entry. */ if ( s->file_name[0] != '\0' ) { if ( ! s->file_written ) unlink( s->file_name ); fclose( s->file_f ); } strcpy( s->file_name, filename ); s->file_f = f; s->file_written = 0; return( OK ); } /****************************************************************/ /* */ /* Get_Count() */ /* */ /* Read and check a number. Returns non-zero */ /* if successful. */ /* */ /****************************************************************/ int Get_Count( units, result ) char *units; unsigned long *result; { char *number; Draw_Prompt( units ); number = Get_Line(); if ( number == NULL || number[0] == '\0' ) return( 0 ); errno = 0; *result = strtoul( number, (char **) NULL, 0 ); return( errno == 0 ); } /****************************************************************/ /* */ /* In_Use( bit, map ) */ /* */ /* Is the bit set in the map? */ /* */ /****************************************************************/ int In_Use( bit, map ) bit_t bit; bitchunk_t *map; { return( map[ (int) (bit / (CHAR_BIT * sizeof (bitchunk_t))) ] & (1 << ((unsigned) bit % (CHAR_BIT * sizeof (bitchunk_t)))) ); } /****************************************************************/ /* */ /* Find_Inode( state, filename ) */ /* */ /* Find the i-node for the given file name. */ /* */ /****************************************************************/ ino_t Find_Inode( s, filename ) de_state *s; char *filename; { struct stat device_stat; struct stat file_stat; ino_t inode; if ( fstat( s->device_d, &device_stat ) == -1 ) Error( "Can not fstat(2) file system device" ); #ifdef S_IFLNK if ( lstat( filename, &file_stat ) == -1 ) #else if ( stat( filename, &file_stat ) == -1 ) #endif { Warning( "Can not find file %s", filename ); return( 0 ); } if ( device_stat.st_rdev != file_stat.st_dev ) { Warning( "File is not on device %s", s->device_name ); return( 0 ); } inode = file_stat.st_ino; if ( inode < 1 || inode > s->inodes ) { Warning( "Illegal i-node number" ); return( 0 ); } return( inode ); } /****************************************************************/ /* */ /* Exec_Shell() */ /* */ /* Fork off a sub-process to exec() the shell. */ /* */ /****************************************************************/ void Exec_Shell() { int pid = fork(); if ( pid == -1 ) return; if ( pid == 0 ) { /* The child process */ extern char **environ; char *shell = getenv( "SHELL" ); if ( shell == NULL ) shell = "/bin/sh"; execle( shell, shell, (char *) 0, environ ); perror( shell ); exit( 127 ); } /* The parent process: ignore signals, wait for sub-process */ signal( SIGINT, SIG_IGN ); signal( SIGQUIT, SIG_IGN ); { int status; int w; while ( (w=wait(&status)) != pid && w != -1 ); } signal( SIGINT, Sigint ); signal( SIGQUIT, Sigint ); return; } /****************************************************************/ /* */ /* Sigint() */ /* */ /* Terminate the program on an interrupt (^C) */ /* or quit (^\) signal. */ /* */ /****************************************************************/ void Sigint(n) int n; { Reset_Term(); /* Restore terminal characteristics */ putchar( '\n' ); exit( 1 ); } /****************************************************************/ /* */ /* Error( text, ... ) */ /* */ /* Print an error message on stderr. */ /* */ /****************************************************************/ #if __STDC__ void Error( const char *text, ... ) #else void Error( text ) char *text; #endif { va_list argp; Reset_Term(); fprintf( stderr, "\nde: " ); va_start( argp, text ); vfprintf( stderr, text, argp ); va_end( argp ); if ( errno != 0 ) fprintf( stderr, ": %s", strerror( errno ) ); fprintf( stderr, "\n" ); exit( 1 ); } /****************************************************************/ /* */ /* de.h */ /* */ /* Definitions for the "Disk editor". */ /* */ /****************************************************************/ /* origination 1989-Jan-15 Terrence W. Holm */ /****************************************************************/ /****************************************************************/ /* */ /* de(1) */ /* */ /* This is the MINIX disk editor. It allows the user to */ /* observe and modify a file system. It can also be used */ /* to recover unlink(2)'ed files */ /* */ /* See the de(1) man page. */ /* */ /****************************************************************/ /****************************************************************/ /* */ /* de Copyright Terrence W. Holm 1989 */ /* */ /* This program was written for users of the Minix operating */ /* system, and in the spirit of other public domain software */ /* written for said system, this source code is made available */ /* at no cost to everyone. I assume no responsibility for */ /* damage to file systems caused by this program. */ /* */ /* This program (one .h, five .c's and a "man" page) may be */ /* copied and/or modified subject to (1) no charge must be */ /* made for distribution, other than for the medium, (2) all */ /* modified sources must be clearly marked as such, (3) all */ /* sources must carry this copyright. */ /* */ /****************************************************************/ /****************************************************************/ /* */ /* files */ /* */ /* de.h Definitions */ /* de.c The main loop */ /* de_stdin.c Character input routines */ /* de_stdout.c Output routines */ /* de_diskio.c File system read/write */ /* de_recover.c File restoration routines */ /* */ /* de.1 "Man" page */ /* Makefile For "make" */ /* README Installation help */ /* */ /* */ /* fs/path.c was modified to support the 'x' command. */ /* fs/link.c and fs/open.c were changed for 'X'. */ /* */ /****************************************************************/ #undef printf #include /* General constants */ #define MAX_STRING 60 /* For all input lines */ #define MAX_PREV 8 /* For 'p' command */ #define SEARCH_BUFFER (4*K) /* For '/' and 'n' */ /* Files */ #define TMP "/tmp" /* For "-r" output */ #define DEV "/dev" /* Where devices are */ /* a.out header constants (see a.out.h, if you have it) */ #if (CHIP == INTEL) #define A_OUT 0x0301 #define SPLIT 0x0420 #endif #if (CHIP == M68000) #define A_OUT 0x0301 #define SPLIT 0x0B20 #endif #if (CHIP == SPARC) #define A_OUT 0x0301 #define SPLIT 0x0B20 #endif /* Each buffer is 1k. In WORD mode 16 words (32 bytes) can be */ /* displayed at once. In BLOCK mode 1K bytes can be displayed. */ /* In MAP mode 2048 bits (256 bytes) are displayed. */ #define K 1024 /* STD_BLK */ #define K_MASK (~(K-1)) /* Round to K boundary */ #define K_SHIFT 10 /* Ie. 1<<10 = K */ #define PAGE_MASK 0x1f /* Word mode: 32 bytes */ #define PAGE_SHIFT 5 /* Ie. 1<<5 = 32 */ #define MAP_BITS_PER_BLOCK (8 * K) /* 1k block, 8192 bits */ #define MAP_MASK 0xff /* 256 bytes/screen */ /* Terminal i/o codes */ #define CTRL_D '\004' /* ASCII ^D */ #define BELL '\007' /* ASCII bell code */ #define BS '\010' /* ASCII back space */ #define CTRL_U '\025' /* ASCII ^U */ #define ESCAPE '\033' /* ASCII escape code */ #define DEL '\177' /* ASCII delete code */ /* Input escape codes generated by the Minix console. */ /* Format: ESC [ X. */ #define ESC_HOME ('H' + 0x80) #define ESC_UP ('A' + 0x80) #define ESC_PGUP ('V' + 0x80) #define ESC_LEFT ('D' + 0x80) #define ESC_5 ('G' + 0x80) #define ESC_RIGHT ('C' + 0x80) #define ESC_END ('Y' + 0x80) #define ESC_DOWN ('B' + 0x80) #define ESC_PGDN ('U' + 0x80) #define ESC_PLUS ('T' + 0x80) #define ESC_MINUS ('S' + 0x80) /* Graphic box codes - only applicable for console display */ /* in visual mode "map". */ #if (CHIP == INTEL) #define BOX_CLR ' ' /* Empty box */ #define BOX_ALL '\333' /* Filled box */ #define BOX_TOP '\337' /* Filled upper half */ #define BOX_BOT '\334' /* Filled lower half */ #endif #if (CHIP == M68000) /* Please change these. */ #define BOX_CLR ' ' /* Empty box */ #define BOX_ALL '=' /* Filled box */ #define BOX_TOP '-' /* Filled upper half */ #define BOX_BOT '_' /* Filled lower half */ #endif #if (CHIP == SPARC) /* Please change these. */ #define BOX_CLR ' ' /* Empty box */ #define BOX_ALL '=' /* Filled box */ #define BOX_TOP '-' /* Filled upper half */ #define BOX_BOT '_' /* Filled lower half */ #endif /* Move positions for the output display. */ #define STATUS_COLUMN 2 #define STATUS_LINE 0 #define BLOCK_COLUMN 4 #define BLOCK_LINE 4 #define INFO_COLUMN 30 #define INFO_LINE BLOCK_LINE #define PROMPT_COLUMN 0 #define PROMPT_LINE 23 #define WARNING_COLUMN 5 #define WARNING_LINE 10 /* Values returned by Process() and Get_Filename() */ #define OK 0 /* No update required */ #define REDRAW 1 /* Redraw whole screen */ #define REDRAW_POINTERS 2 /* Redraw just ptrs */ #define ERROR 3 /* Beep */ /* Visual modes */ #define WORD 1 #define BLOCK 2 #define MAP 3 typedef unsigned short word_t; /* For most user i/o */ #if _WORD_SIZE == 2 typedef unsigned int Word_t; /* What it should always be */ #else typedef int Word_t; /* Unsigned promotion under ANSI C */ #endif #ifndef I_MAP_SLOTS /* Max number of inode and zone map blocks we can handle. */ #define I_MAP_SLOTS 8 #define Z_MAP_SLOTS (sizeof(char *) == 2 ? 16 : 128) #endif typedef struct de_state /* State of disk ed. */ { /* Information from super block */ /* The types here are mostly promoted types for simplicity */ /* and efficiency. */ unsigned inodes; /* Number of i-nodes */ zone_t zones; /* Total # of blocks */ unsigned inode_maps; /* I-node map blocks */ unsigned zone_maps; /* Zone map blocks */ unsigned inode_blocks; /* I-node blocks */ unsigned first_data; /* Total non-data blks */ int magic; /* Magic number */ /* Numbers derived from the magic number */ unsigned char is_fs; /* Nonzero for good fs */ unsigned char v1; /* Nonzero for V1 fs */ unsigned inode_size; /* Size of disk inode */ unsigned nr_indirects; /* # indirect blocks */ unsigned zone_num_size; /* Size of disk z num */ /* Other derived numbers */ bit_t inodes_in_map; /* Bits in i-node map */ bit_t zones_in_map; /* Bits in zone map */ int ndzones; /* # direct zones in an inode */ /* Information from map blocks */ bitchunk_t inode_map[ I_MAP_SLOTS * K / sizeof (bitchunk_t) ]; bitchunk_t zone_map[ Z_MAP_SLOTS * K / sizeof (bitchunk_t) ]; /* Information for current block */ off_t address; /* Current address */ off_t last_addr; /* For erasing ptrs */ zone_t block; /* Current block (1K) */ unsigned offset; /* Offset within block */ char buffer[ K ]; /* Display state */ int mode; /* WORD, BLOCK or MAP */ int output_base; /* 2, 8, 10, or 16 */ /* Search information */ char search_string[ MAX_STRING + 1 ]; /* For '/' and 'n' */ off_t prev_addr[ MAX_PREV ]; /* For 'p' command */ int prev_mode[ MAX_PREV ]; /* File information */ char *device_name; /* From command line */ int device_d; int device_mode; /* O_RDONLY or O_RDWR */ zone_t device_size; /* Number of blocks */ char file_name[ MAX_STRING + 1 ]; /* For 'w' and 'W' */ FILE *file_f; int file_written; /* Flag if written to */ } de_state; /* Forward references for external routines */ /* de.c */ _PROTOTYPE(void main , (iM=O=P=Q=nt argc , char *argv [])); _PROTOTYPE(int Process , (de_state *s , int c )); #if __STDC__ void Error( const char *text, ... ); #else void Error(); #endif _PROTOTYPE(int In_Use , (bit_t bit , bitchunk_t *map )); _PROTOTYPE(ino_t Find_Inode , (de_state *s , char *filename )); /* de_stdin.c */ _PROTOTYPE(void Save_Term , (void)); _PROTOTYPE(void Set_Term , (void)); _PROTOTYPE(void Reset_Term , (void)); _PROTOTYPE(int Get_Char , (void)); _PROTOTYPE(char *Get_Line , (void)); _PROTOTYPE(int Arrow_Esc , (int c )); /* de_stdout.c */ _PROTOTYPE(int Init_Termcap , (void)); _PROTOTYPE(void Draw_Help_Screen , (de_state *s )); _PROTOTYPE(void Wait_For_Key , (void)); _PROTOTYPE(void Draw_Prompt , (char *string )); _PROTOTYPE(void Erase_Prompt , (void)); _PROTOTYPE(void Draw_Screen , (de_state *s )); _PROTOTYPE(void Draw_Strings , (de_state *s )); _PROTOTYPE(void Draw_Pointers , (de_state *s )); _PROTOTYPE(void Print_Ascii , (int c )); _PROTOTYPE(void Goto , (int column , int line )); _PROTOTYPE(void Block_Type , (de_state *s )); _PROTOTYPE(void Draw_Words , (de_state *s )); _PROTOTYPE(void Draw_Info , (de_state *s )); _PROTOTYPE(void Draw_Block , (char *block )); _PROTOTYPE(void Draw_Map , (char *block , int max_bits )); _PROTOTYPE(void Draw_Offset , (de_state *s )); _PROTOTYPE(void Word_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Block_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Map_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Print_Number , (Word_t number , int output_base )); _PROTOTYPE(void Draw_Zone_Numbers , (de_state *s , struct inode *inode , int zindex , int zrow )); #if __STDC__ void Warning( const char *text, ... ); #else void Warning(); #endif /* de_diskio.c */ _PROTOTYPE(void Read_Disk , (de_state *s , off_t block_addr , char *buffer )); _PROTOTYPE(void Read_Block , (de_state *s , char *buffer )); _PROTOTYPE(void Read_Super_Block , (de_state *s )); _PROTOTYPE(void Read_Bit_Maps , (de_state *s )); _PROTOTYPE(off_t Search , (de_state *s , char *string )); _PROTOTYPE(void Write_Word , (de_state *s , Word_t word )); /* de_recover.c */ _PROTOTYPE(int Path_Dir_File , (char *path_name , char **dir_name , char **file_name )); _PROTOTYPE(char *File_Device , (char *file_name )); _PROTOTYPE(ino_t Find_Deleted_Entry , (de_state *s , char *path_name )); _PROTOTYPE(off_t Recover_Blocks , (de_state *s )); #undef printf /* Because fs/const.h */ /* defines it. */ /* Static functions are all pre-declared FORWARD but none are */ /* declared static yet - this can wait until all functions are */ /* declared with prototypes. */ #undef FORWARD #define FORWARD /* static */ /****************************************************************/ /* */ /* de_diskio.c */ /* */ /* Reading and writing to a file system device. */ /* */ /****************************************************************/ /* origination 1989-Jan-15 Terrence W. Holm */ /****************************************************************/ #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/super.h" #include "../../fs/inode.h" #include #include "de.h" /****************************************************************/ /* */ /* Read_Disk( state, block_addr, buffer ) */ /* */ /* Reads a 1k block at "block_addr" into "buffer". */ /* */ /****************************************************************/ void Read_Disk( s, block_addr, buffer ) de_state *s; off_t block_addr; char *buffer; { if ( lseek( s->device_d, block_addr, SEEK_SET ) == -1 ) Error( "Error seeking %s", s->device_name ); if ( read( s->device_d, buffer, K ) != K ) Error( "Error reading %s", s->device_name ); } /****************************************************************/ /* */ /* Read_Block( state, buffer ) */ /* */ /* Reads a 1k block from "state->address" into */ /* "buffer". Checks "address", and updates */ /* "block" and "offset". */ /* */ /****************************************************************/ void Read_Block( s, buffer ) de_state *s; char *buffer; { off_t end_addr = (long) s->device_size * K - 1; off_t block_addr; if ( s->address < 0 ) s->address = 0L; if ( s->address > end_addr ) s->address = end_addr; /* The address must be rounded off for */ /* certain visual display modes. */ if ( s->mode == WORD ) s->address &= ~1L; else if ( s->mode == MAP ) s->address &= ~3L; block_addr = s->address & K_MASK; s->block = (zone_t) (block_addr >> K_SHIFT); s->offset = (unsigned) (s->address - block_addr); Read_Disk( s, block_addr, buffer ); } /****************************************************************/ /* */ /* Read_Super_Block( state ) */ /* */ /* Read and check the super block. */ /* */ /****************************************************************/ void Read_Super_Block( s ) de_state *s; { struct super_block *super = (struct super_block *) s->buffer; unsigned inodes_per_block; off_t size; Read_Disk( s, (long) 1 * K, s->buffer ); s->magic = super->s_magic; if ( s->magic == SUPER_MAGIC ) { s->is_fs = TRUE; s->v1 = TRUE; s->inode_size = V1_INODE_SIZE; inodes_per_block = V1_INODES_PER_BLOCK; s->nr_indirects = V1_INDIRECTS; s->zone_num_size = V1_ZONE_NUM_SIZE; s->zones = super->s_nzones; s->ndzones = V1_NR_DZONES; } else if ( s->magic == SUPER_V2 ) { s->is_fs = TRUE; s->v1 = FALSE; s->inode_size = V2_INODE_SIZE; inodes_per_block = V2_INODES_PER_BLOCK; s->nr_indirects = V2_INDIRECTS; s->zone_num_size = V2_ZONE_NUM_SIZE; s->zones = super->s_zones; s->ndzones = V2_NR_DZONES; } else { if ( super->s_magic == SUPER_REV ) Warning( "V1-bytes-swapped file system (?)" ); else if ( super->s_magic == SUPER_V2_REV ) Warning( "V2-bytes-swapped file system (?)" ); else Warning( "Not a Minix file system" ); Warning( "The file system features will not be available" ); s->zones = 100000L; return; } s->inodes = super->s_ninodes; s->inode_maps = bitmapsize( (bit_t) s->inodes + 1 ); if ( s->inode_maps != super->s_imap_blocks ) { if ( s->inode_maps > super->s_imap_blocks ) Error( "Corrupted inode map count or inode count in super block" ); else Warning( "Count of inode map blocks in super block suspiciously high" ); s->inode_maps = super->s_imap_blocks; } s->zone_maps = bitmapsize( (bit_t) s->zones ); if ( s->zone_maps != super->s_zmap_blocks ) { if ( s->zone_maps > super->s_zmap_blocks ) Error( "Corrupted zone map count or zone count in super block" ); else Warning( "Count of zone map blocks in super block suspiciously high" ); s->zone_maps = super->s_zmap_blocks; } s->inode_blocks = (s->inodes + inodes_per_block - 1) / inodes_per_block; s->first_data = 2 + s->inode_maps + s->zone_maps + s->inode_blocks; if ( s->first_data != super->s_firstdatazone ) { if ( s->first_data > super->s_firstdatazone ) Error( "Corrupted first data zone offset or inode count in super block" ); else Warning( "First data zone in super block suspiciously high" ); s->first_data = super->s_firstdatazone; } s->inodes_in_map = s->inodes + 1; s->zones_in_map = s->zones + 1 - s->first_data; /* if ( s->zones != s->device_size ) Warning( "Zone count does not equal device size" ); */ s->device_size = s->zones; if ( super->s_log_zone_size != 0 ) Error( "Can not handle multiple blocks per zone" ); } /****************************************************************/ /* */ /* Read_Bit_Maps( state ) */ /* */ /* Read in the i-node and zone bit maps from the */ /* specified file system device. */ /* */ /****************************************************************/ void Read_Bit_Maps( s ) de_state *s; { int i; if ( s->inode_maps > I_MAP_SLOTS || s->zone_maps > Z_MAP_SLOTS ) { Warning( "Super block specifies too many bit map blocks" ); return; } for ( i = 0; i < s->inode_maps; ++i ) { Read_Disk( s, (long) (2 + i) * K, (char *) &s->inode_map[ i * K / sizeof (bitchunk_t ) ] ); } for ( i = 0; i < s->zone_maps; ++i ) { Read_Disk( s, (long) (2 + s->inode_maps + i) * K, (char *) &s->zone_map[ i * K / sizeof (bitchunk_t ) ] ); } } /****************************************************************/ /* */ /* Search( state, string ) */ /* */ /* Search from the current address for the ASCII */ /* "string" on the device. */ /* */ /****************************************************************/ off_t Search( s, string ) de_state *s; char *string; { off_t address = s->address + 1; off_t last_addr = address; char buffer[ SEARCH_BUFFER ]; int offset; int tail_length = strlen( string ) - 1; int count = SEARCH_BUFFER; int last_offset; for ( ; count == SEARCH_BUFFER; address += SEARCH_BUFFER - tail_length ) { if ( lseek( s->device_d, address, SEEK_SET ) == -1 ) Error( "Error seeking %s", s->device_name ); if ( (count = read( s->device_d, buffer, SEARCH_BUFFER)) == -1 ) Error( "Error reading %s", s->device_name ); if ( address - last_addr >= 500L * K ) { putchar( '.' ); fflush( stdout ); last_addr += 500L * K; } last_offset = count - tail_length; for ( offset = 0; offset < last_offset; ++offset ) { register char c = buffer[ offset ]; if ( c == *string ) { char *tail_buffer = &buffer[ offset + 1 ]; char *tail_string = string + 1; do { if ( *tail_string == '\0' ) return( address + offset ); } while ( *tail_buffer++ == *tail_string++ ); } } /* end for ( offset ) */ } /* end for ( address ) */ return( -1L ); } /****************************************************************/ /* */ /* Write_Word( state, word ) */ /* */ /* Write a word at address. */ /* */ /****************************************************************/ void Write_Word( s, word ) de_state *s; word_t word; { if ( s->address & 01 ) Error( "Internal fault (unaligned address)" ); if ( lseek( s->device_d, s->address, SEEK_SET ) == -1 ) Error( "Error seeking %s", s->device_name ); if ( write( s->device_d, (char *) &word, sizeof word ) != sizeof word ) ErrorY=[=( "Error writing %s", s->device_name ); } /****************************************************************/ /* */ /* de_recover.c */ /* */ /* File restoration routines. */ /* */ /****************************************************************/ /* origination 1989-Jan-21 Terrence W. Holm */ /* handle "holes" 1989-Jan-28 Terrence W. Holm */ /****************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/inode.h" #include #include "de.h" _PROTOTYPE(int Indirect, (de_state *s, zone_t block, off_t *size, int dblind)); _PROTOTYPE(int Data_Block, (de_state *s, zone_t block, off_t *file_size )); _PROTOTYPE(int Free_Block, (de_state *s, zone_t block )); /****************************************************************/ /* */ /* Path_Dir_File( path_name, dir_name, file_name ) */ /* */ /* Split "path_name" into a directory name and */ /* a file name. */ /* */ /* Zero is returned on error conditions. */ /* */ /****************************************************************/ int Path_Dir_File( path_name, dir_name, file_name ) char *path_name; char **dir_name; char **file_name; { char *p; static char directory[ MAX_STRING + 1 ]; static char filename[ MAX_STRING + 1 ]; if ( (p = strrchr( path_name, '/' )) == NULL ) { strcpy( directory, "." ); strcpy( filename, path_name ); } else { *directory = '\0'; strncat( directory, path_name, p - path_name ); strcpy( filename, p + 1 ); } if ( *directory == '\0' ) strcpy( directory, "/" ); if ( *filename == '\0' ) { Warning( "A file name must follow the directory name" ); return( 0 ); } *dir_name = directory; *file_name = filename; return( 1 ); } /****************************************************************/ /* */ /* File_Device( file_name ) */ /* */ /* Return the name of the file system device */ /* containing the file "file_name". */ /* */ /* This is used if the "-r" option was specified. */ /* In this case we have only been given a file */ /* name, and must determine which file system */ /* device to open. */ /* */ /* NULL is returned on error conditions. */ /* */ /****************************************************************/ char *File_Device( file_name ) char *file_name; { struct stat file_stat; struct stat device_stat; int dev_d; struct direct entry; static char device_name[ NAME_MAX + 1 ]; if ( access( file_name, R_OK ) != 0 ) { Warning( "Can not find %s", file_name ); return( NULL ); } if ( stat( file_name, &file_stat ) == -1 ) { Warning( "Can not stat(2) %s", file_name ); return( NULL ); } /* Open /dev for reading */ if ( (dev_d = open( DEV, O_RDONLY )) == -1 ) { Warning( "Can not read %s", DEV ); return( NULL ); } while ( read( dev_d, (char *) &entry, sizeof(struct direct) ) == sizeof(struct direct) ) { if ( entry.d_ino == 0 ) continue; strcpy( device_name, DEV ); strcat( device_name, "/" ); strncat( device_name, entry.d_name, NAME_MAX ); if ( stat( device_name, &device_stat ) == -1 ) continue; if ( (device_stat.st_mode & S_IFMT) != S_IFBLK ) continue; if ( file_stat.st_dev == device_stat.st_rdev ) { close( dev_d ); return( device_name ); } } close( dev_d ); Warning( "The device containing file %s is not in %s", file_name, DEV ); return( NULL ); } /****************************************************************/ /* */ /* Find_Deleted_Entry( state, path_name ) */ /* */ /* Split "path_name" into a directory name and */ /* a file name. Then search the directory for */ /* an entry that would match the deleted file */ /* name. (Deleted entries have a zero i-node */ /* number, but the original i-node number is */ /* placed at the end of the file name.) */ /* */ /* If successful an i-node number is returned, */ /* else zero is returned. */ /* */ /****************************************************************/ ino_t Find_Deleted_Entry( s, path_name ) de_state *s; char *path_name; { char *dir_name; char *file_name; /* Check if the file exists */ if ( access( path_name, F_OK ) == 0 ) { Warning( "File has not been deleted" ); return( 0 ); } /* Split the path name into a directory and a file name */ if ( ! Path_Dir_File( path_name, &dir_name, &file_name ) ) return( 0 ); /* Check to make sure the user has read permission on */ /* the directory. */ if ( access( dir_name, R_OK ) != 0 ) { Warning( "Can not find %s", dir_name ); return( 0 ); } /* Make sure "dir_name" is really a directory. */ { struct stat dir_stat; if ( stat( dir_name, &dir_stat ) == -1 || (dir_stat.st_mode & S_IFMT) != S_IFDIR ) { Warning( "Can not find directory %s", dir_name ); return( 0 ); } } /* Make sure the directory is on the current */ /* file system device. */ if ( Find_Inode( s, dir_name ) == 0 ) return( 0 ); /* Open the directory and search for the lost file name. */ { int dir_d; int count; struct direct entry; if ( (dir_d = open( dir_name, O_RDONLY )) == -1 ) { Warning( "Can not read directory %s", dir_name ); return( 0 ); } while ( (count = read( dir_d, (char *) &entry, sizeof(struct direct) )) == sizeof(struct direct) ) { if ( entry.d_ino == 0 && strncmp( file_name, entry.d_name, NAME_MAX - sizeof(ino_t) ) == 0 ) { ino_t inode = *( (ino_t *) &entry.d_name[ NAME_MAX - sizeof(ino_t) ] ); close( dir_d ); if ( inode < 1 || inode > s->inodes ) { Warning( "Illegal i-node number" ); return( 0 ); } return( inode ); } } close( dir_d ); if ( count == 0 ) Warning( "Can not find a deleted entry for %s", file_name ); else Warning( "Problem reading directory %s", dir_name ); return( 0 ); } } /****************************************************************/ /* */ /* Recover_Blocks( state ) */ /* */ /* Try to recover all the blocks for the i-node */ /* currently pointed to by "s->address". The */ /* i-node and all of the blocks must be marked */ /* as FREE in the bit maps. The owner of the */ /* i-node must match the current real user name. */ /* */ /* "Holes" in the original file are maintained. */ /* This allows moving sparse files from one device */ /* to another. */ /* */ /* On any error -1L is returned, otherwise the */ /* size of the recovered file is returned. */ /* */ /* */ /* NOTE: Once a user has read access to a device, */ /* there is a security hole, as we lose the */ /* normal file system protection. For convenience, */ /* de(1) is sometimes set-uid root, this allows */ /* anyone to use the "-r" option. When recovering, */ /* Recover_Blocks() can only superficially check */ /* the validity of a request. */ /* */ /****************************************************************/ off_t Recover_Blocks( s ) de_state *s; { struct inode core_inode; d1_inode *dip1; d2_inode *dip2; struct inode *inode = &core_inode; bit_t node = (s->address - (s->first_data - s->inode_blocks) * K) / s->inode_size + 1; dip1 = (d1_inode *) &s->buffer[ s->offset & ~ PAGE_MASK ]; dip2 = (d2_inode *) &s->buffer[ s->offset & ~ PAGE_MASK & ~ (V2_INODE_SIZE-1) ]; conv_inode( inode, dip1, dip2, READING, s->magic ); if ( s->block < s->first_data - s->inode_blocks || s->block >= s->first_data ) { Warning( "Not in an inode block" ); return( -1L ); } /* Is tc=e=f=g=h=i=his a valid, but free i-node? */ if ( node > s->inodes ) { Warning( "Not an inode" ); return( -1L ); } if ( In_Use(node, s->inode_map) ) { Warning( "I-node is in use" ); return( -1L ); } /* Only recover files that belonged to the real user. */ { uid_t real_uid = getuid(); struct passwd *user = getpwuid( real_uid ); if ( real_uid != SU_UID && real_uid != inode->i_uid ) { Warning( "I-node did not belong to user %s", user ? user->pw_name : "" ); return( -1L ); } } /* Recover all the blocks of the file. */ { off_t file_size = inode->i_size; int i; /* Up to s->ndzones pointers are stored in the i-node. */ for ( i = 0; i < s->ndzones; ++i ) { if ( file_size == 0 ) return( inode->i_size ); if ( ! Data_Block( s, inode->i_zone[ i ], &file_size ) ) return( -1L ); } if ( file_size == 0 ) return( inode->i_size ); /* An indirect block can contain up to inode->i_indirects more blk ptrs. */ if ( ! Indirect( s, inode->i_zone[ s->ndzones ], &file_size, 0 ) ) return( -1L ); if ( file_size == 0 ) return( inode->i_size ); /* A double indirect block can contain up to inode->i_indirects blk ptrs. */ if ( ! Indirect( s, inode->i_zone[ s->ndzones+1 ], &file_size, 1 ) ) return( -1L ); if ( file_size == 0 ) return( inode->i_size ); Error( "Internal fault (file_size != 0)" ); } /* NOTREACHED */ return( -1L ); } /* Indirect( state, block, &file_size, double ) * * Recover all the blocks pointed to by the indirect block * "block", up to "file_size" bytes. If "double" is true, * then "block" is a double-indirect block pointing to * V*_INDIRECTS indirect blocks. * * If a "hole" is encountered, then just seek ahead in the * output file. */ int Indirect( s, block, file_size, dblind ) de_state *s; zone_t block; off_t *file_size; int dblind; { union { zone1_t ind1[ V1_INDIRECTS ]; zone_t ind2[ V2_INDIRECTS ]; } indirect; int i; zone_t zone; /* Check for a "hole". */ if ( block == NO_ZONE ) { off_t skip = (off_t) s->nr_indirects * K; if ( *file_size < skip || dblind ) { Warning( "File has a hole at the end" ); return( 0 ); } if ( fseek( s->file_f, skip, SEEK_CUR ) == -1 ) { Warning( "Problem seeking %s", s->file_name ); return( 0 ); } *file_size -= skip; return( 1 ); } /* Not a "hole". Recover indirect block, if not in use. */ if ( ! Free_Block( s, block ) ) return( 0 ); Read_Disk( s, (long) block << K_SHIFT, (char *) &indirect ); for ( i = 0; i < s->nr_indirects; ++i ) { if ( *file_size == 0 ) return( 1 ); zone = (s->v1 ? indirect.ind1[ i ] : indirect.ind2[ i ]); if ( dblind ) { if ( ! Indirect( s, zone, file_size, 0 ) ) return( 0 ); } else { if ( ! Data_Block( s, zone, file_size ) ) return( 0 ); } } return( 1 ); } /* Data_Block( state, block, &file_size ) * * If "block" is free then write Min(file_size, k) * bytes from it onto the current output file. * * If "block" is zero, this means that a 1k "hole" * is in the file. The recovered file maintains * the reduced size by not allocating the block. * * The file size is decremented accordingly. */ int Data_Block( s, block, file_size ) de_state *s; zone_t block; off_t *file_size; { char buffer[ K ]; off_t block_size = *file_size > K ? K : *file_size; /* Check for a "hole". */ if ( block == NO_ZONE ) { if ( block_size < K ) { Warning( "File has a hole at the end" ); return( 0 ); } if ( fseek( s->file_f, block_size, SEEK_CUR ) == -1 ) { Warning( "Problem seeking %s", s->file_name ); return( 0 ); } *file_size -= block_size; return( 1 ); } /* Block is not a "hole". Copy it to output file, if not in use. */ if ( ! Free_Block( s, block ) ) return( 0 ); Read_Disk( s, (long) block << K_SHIFT, buffer ); if ( fwrite( buffer, 1, (size_t) block_size, s->file_f ) != (size_t) block_size ) { Warning( "Problem writing %s", s->file_name ); return( 0 ); } *file_size -= block_size; return( 1 ); } /* Free_Block( state, block ) * * Make sure "block" is a valid data block number, and it * has not been allocated to another file. */ int Free_Block( s, block ) de_state *s; zone_t block; { if ( block < s->first_data || block >= s->zones ) { Warning( "Illegal block number" ); return( 0 ); } if ( In_Use( (bit_t) (block - (s->first_data - 1)), s->zone_map ) ) { Warning( "Encountered an \"in use\" data block" ); return( 0 ); } return( 1 ); } /****************************************************************/ /* */ /* de_stdin.c */ /* */ /* Processing input from the "de" user. */ /* */ /****************************************************************/ /* origination 1989-Jan-15 Terrence W. Holm */ /****************************************************************/ #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/inode.h" #include "de.h" FORWARD _PROTOTYPE(int Timed_Get_Char , (int time )); FORWARD _PROTOTYPE(void Timed_Out , (int sig)); /****************************************************************/ /* */ /* Save_Term() */ /* */ /* Save the current terminal characteristics. */ /* */ /* */ /* Set_Term() */ /* */ /* Set up the terminal characteristics. */ /* */ /* */ /* Reset_Term() */ /* */ /* Restore the terminal characteristics. */ /* */ /****************************************************************/ static struct termios saved_term; void Save_Term() { tcgetattr( 0, &saved_term ); } void Set_Term() { struct termios term; term = saved_term; /* No tab expansion, no echo, don't map ^M to ^J, cbreak mode */ term.c_iflag &= ~ICRNL; term.c_oflag &= ~OPOST; term.c_lflag &= ~ICANON & ~ECHO; /* Change the interrupt character to ^C */ term.c_cc[VINTR] = '\003'; tcsetattr( 0, TCSANOW, &term ); } void Reset_Term() { tcsetattr( 0, TCSANOW, &saved_term ); } /****************************************************************/ /* */ /* Get_Char() */ /* */ /* Return the next input character. Escape */ /* sequences are mapped to special codes. */ /* */ /****************************************************************/ int Get_Char() { int c; static int unget_char = EOF; /* Flush the output to the screen before waiting */ /* for input from the user. */ fflush( stdout ); if ( unget_char == EOF ) { while ( (c = Timed_Get_Char( 60 * 60 )) < EOF ) printf( "%c", BELL ); } else { c = unget_char; unget_char = EOF; } if ( c == EOF ) return( EOF ); if ( c != ESCAPE ) return( c ); if ( (c = Timed_Get_Char( 1 )) <= EOF ) return( ESCAPE ); if ( c != '[' ) { unget_char = c; return( ESCAPE ); } if ( (c = Timed_Get_Char( 1 )) <= EOF ) { unget_char = '['; return( ESCAPE ); } return( c | 0x80 ); /* Flag ESC [ x */ } int Timed_Get_Char( time ) int time; { char c; int count; signal( SIGALRM, Timed_Out ); alarm( time ); count = read( 0, &c, 1 ); alarm( 0 ); if ( count <= 0 ) return( EOF + count ); return( c & 0x7f ); } /****************************************************************/ /* */ /* Get_Line() */ /* */ /* Read a line from the user. Returns a pointer */ /* to a local buffer, or NULL if DEL or a non- */ /* ASCII character was typed. Processes ^H and */ /* ^U. ^M terminates the input. */ /* */ /****************************************************************/ char *Get_Line() { int c; int i; static char line[ MAX_STRING + 1 ]; for ( i = 0; i <= MAX_STRING; ++i ) { c = Get_Char(); if ( c == EOF || c == DEL || (c & 0x80) ) return( NULL ); if ( c == BS ) { if ( --i >= 0 ) { printf( "\b \b" ); --i; } } else if ( c == CTRL_U ) { for ( --i; i >= 0; --i ) printf( "\b \b" ); } else if ( c == '\r' ) { line[ i ] = '\0'; return( line ); } else if ( i < MAX_STRING ) { line[ i ] = c; Print_Ascii( c ); } else /* Line buffer is full, don't add any more to it. */ { putchar( BELL ); --i; } } Error( "Internal fault (line buffer overflow)" ); /* NOTREACHED */ return( NULL ); } /****************************************************************/ /* */ /* Arrow_Esc( char ) */ /* */ /* If the keyboard does not generate Ansi escape */ /* codes for the arrow keys, but does generate */ /* single byte control codes, then map these */ /* codes to the special characters we are using */ /* to denote the Ansi escape codes. */ /* */ /****************************************************************/ extern char Kup; /* (ku) - Up arrow key */ extern char Kdown; /* (kd) - Down arrow key */ extern char Kleft; /* (kl) - Left arrow key */ extern char Kright; /* (kr) - Right arrow key */ int Arrow_Esc( c ) int c; { if ( c == Kup ) return( ESC_UP ); if ( c == Kdown ) return( ESC_DOWN ); if ( c == Kleft ) return( ESC_LEFT ); if ( c == Kright ) return( ESC_RIGHT ); return( c ); } void Timed_Out(sig) int sig; {} /* * $PchHeader: /mount/hd2/minix/sys/cmd/de/RCS/de_stdin.c,v 1.3 1995/02/10 08:01:30 philip Exp $ */ /****************************************************************/ /* */ /* de_stdout.c */ /* */ /* Displaying information from the "Disk editor". */ /* */ /****************************************************************/ /* origination 1989-Jan-15 Terrence W. Holm */ /****************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/inode.h" #include #include "de.h" #define major(x) ( (x>>8) & 0377) #define minor(x) (x & 0377) /****************************************************************/ /* Code for handling termcap */ /****************************************************************/ #define TC_BUFFER 1024 /* Size of termcap(3) buffer */ #define TC_STRINGS 200 /* Enough room for cm,cl,so,se */ static char *Tmove; /* (cm) - Format for tgoto */ static char *Tclr_all; /* (cl) - Clear screen */ static char *Treverse; /* (so) - Start reverse mode */ static char *Tnormal; /* (se) - End reverse mode */ char Kup = 0; /* (ku) - Up arrow key */ char Kdown = 0; /* (kd) - Down arrow key */ char Kleft = 0; /* (kl) - Left arrow key */ char Kright = 0; /* (kr) - Right arrow key */ _PROTOTYPE(void Goto , (int column , int line )); _PROTOTYPE(void Block_Type , (de_state *s )); _PROTOTYPE(void Draw_Words , (de_state *s )); _PROTOTYPE(void Draw_Info , (de_state *s )); _PROTOTYPE(void Draw_Block , (char *block )); _PROTOTYPE(void Draw_Map , (char *block , int max_bits )); _PROTOTYPE(void Draw_Offset , (de_state *s )); _PROTOTYPE(void Word_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Block_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Map_Pointers , (off_t old_addr , off_t new_addr )); _PROTOTYPE(void Print_Number , (Word_t number , int output_base )); _PROTOTYPE(void Draw_Zone_Numbers , (de_state *s , struct inode *inode , int zindex , int zrow )); /****************************************************************/ /* */ /* Init_Termcap() */ /* */ /* Initializes the external variables for the */ /* current terminal. */ /* */ /****************************************************************/ int Init_Termcap() { char *term; char buffer[ TC_BUFFER ]; static char strings[ TC_STRINGS ]; char *s = &strings[0]; char *Kcode; term = getenv( "TERM" ); if ( term == NULL ) return( 0 ); if ( tgetent( buffer, term ) != 1 ) return( 0 ); if ( (Tmove = tgetstr( "cm", &s )) == NULL ) return( 0 ); if ( (Tclr_all = tgetstr( "cl", &s )) == NULL ) return( 0 ); if ( (Treverse = tgetstr( "so", &s )) == NULL ) { Treverse = Tnormal = s; *s = '\0'; ++s; } else if ( (Tnormal = tgetstr( "se", &s )) == NULL ) return( 0 ); /* See if there are single character arrow key codes */ if ( (Kcode = tgetstr( "ku", &s )) != NULL && strlen( Kcode ) == 1 ) Kup = Kcode[0]; if ( (Kcode = tgetstr( "kd", &s )) != NULL && strlen( Kcode ) == 1 ) Kdown = Kcode[0]; if ( (Kcode = tgetstr( "kl", &s )) != NULL && strlen( Kcode ) == 1 ) Kleft = Kcode[0]; if ( (Kcode = tgetstr( "kr", &s )) != NULL && strlen( Kcode ) == 1 ) Kright = Kcode[0]; return( 1 ); } /****************************************************************/ /* */ /* Goto( column, line ) */ /* */ /* Use the termcap string to move the cursor. */ /* */ /****************************************************************/ void Goto( column, line ) int column; int line; { fputs( tgoto( Tmove, column, line ), stdout ); } /****************************************************************/ /* Output routines */ /****************************************************************/ /****************************************************************/ /* */ /* Draw_Help_Screen() */ /* */ /****************************************************************/ void Draw_Help_Screen( s ) de_state *s; { int down; int right; switch ( s->mode ) { case WORD : down = 2; right = 32; break; case BLOCK : down = 64; right = 1; break; case MAP : down = 256; right = 4; break; } printf( "%s ", Tclr_all ); printf( "%sDE COMMANDS%s\r\n\n\n", Treverse, Tnormal ); printf( " PGUP b Back one block h Help\r\n" ); printf( " PGDN f Forward one block q Quit\r\n" ); printf( " HOME B Goto first block m Minix shell\r\n" ); printf( " END F Goto last block\r\n" ); printf( " v Visual mode (w b m)\r\n" ); printf( " g Goto specified block o Output base (h d o b)\r\n" ); printf( " G Goto block indirectly\r\n" ); printf( " i Goto i-node c Change file name\r\n" ); printf( " I Filename to i-node w Write ASCII block\r\n" ); printf( " W Write block exactly\r\n" ); printf( " / Search\r\n" ); printf( " n Next occurrence x Extract lost entry\r\n" ); printf( " p Previous address X Extract lost blocks\r\n" ); printf( " s Store word\r\n" ); printf( " UP u Move back %d bytes\r\n", down ); printf( " DOWN d Move forward %d bytes\r\n", down ); printf( " LEFT l Move back %d byte%s\r\n", right, right == 1 ? "" : "s" ); printf( " RIGHT r Move forward %d byte%s\r\n\n\n", right, right == 1 ? "" : "s" ); } /****************************************************************/ /* */ /* Wait_For_Key() */ /* */ /* The user must press a key to continue. */ /* */ /****************************************************************/ void Wait_For_Key() { Draw_Prompt( "Press a key to continue..." ); Get_Char(); } /****************************************************************/ /* */ /* Draw_Prompt( string ) */ /* */ /* Write a message in the "prompt" area. */ /* */ /****************************************************************/ void Draw_Prompt( string ) char *string; { Goto( PROMPT_COLUMN, PROMPT_LINE ); printf( "%s%s%s ", Treverse, string, Tnormal ); } /****************************************************************/ /* */ /* Erase_Prompt() */ /* */ /* Erase the message in the "prompt" area. */ /* */ /****************************************************************/ void Erase_Prompt() { Goto( PROMPT_COLUMN, PROMPT_LINE ); printf( "%77c", ' ' ); Goto( PROMPT_COLUMN, PROMPT_LINE ); } /****************************************************************/ /* */ /* Draw_Screen( state ) */ /* */ /* Redraw everything, except pointers. */ /* */ /****************************************************************/ void Draw_Screen( s ) de_state *s; { fputs( Tclr_all, stdout ); Draw_Strings( s ); Block_Type( s ); switch ( s->mode ) { case WORD : Draw_Words( s ); Draw_Info( s ); break; case BLOCK : Draw_Block( s->buffer ); break; case MAP : { int max_bits = 2 * K; /* Don't display the bits after the end */ /* of the i-node or zone bit maps. */ if ( s->block == 2 + s->inode_maps - 1 ) max_bits = (int) (s->inodes_in_map - CHAR_BIT * K * (ino_t) (s->inode_maps - 1) - CHAR_BIT * (ino_t) (s->offset & ~ MAP_MASK)); else if ( s->block == 2 + s->inode_maps + s->zone_maps - 1 ) max_bits = (int) v=x=y=z={=|=}=~============ (s->zones_in_map - CHAR_BIT * K * (zone_t) (s->zone_maps - 1) - CHAR_BIT * (zone_t) (s->offset & ~ MAP_MASK)); if ( max_bits < 0 ) max_bits = 0; Draw_Map( &s->buffer[ s->offset & ~ MAP_MASK ], max_bits ); break; } } } /****************************************************************/ /* */ /* Draw_Strings( state ) */ /* */ /* The first status line contains the device name, */ /* the current write file name (if one is open) */ /* and the current search string (if one has */ /* been defined). */ /* */ /* Long strings are truncated. */ /* */ /****************************************************************/ void Draw_Strings( s ) de_state *s; { int len; int i; Goto( STATUS_COLUMN, STATUS_LINE ); printf( "Device %s= %-14.14s ", s->device_mode == O_RDONLY ? "" : "(w) ", s->device_name ); switch ( s->magic ) { case SUPER_MAGIC : printf( "V1 file system "); break; case SUPER_REV : printf( "V1-bytes-swapped file system (?) "); break; case SUPER_V2 : printf( "V2 file system "); break; case SUPER_V2_REV : printf( "V2-bytes-swapped file system (?) "); break; default : printf( "not a Minix file system "); break; } len = strlen( s->file_name ); if ( len == 0 ) printf( "%29s", " " ); else if ( len <= 20 ) printf( "File = %-20s ", s->file_name ); else printf( "File = ...%17.17s ", s->file_name + len - 17 ); len = strlen( s->search_string ); if ( len == 0 ) printf( "%20s", " " ); else { printf( "Search = " ); if ( len <= 11 ) { for ( i = 0; i < len; ++i ) Print_Ascii( s->search_string[ i ] ); for ( ; i < 11; ++i ) putchar( ' ' ); } else { for ( i = 0; i < 8; ++i ) Print_Ascii( s->search_string[ i ] ); printf( "..." ); } } } /****************************************************************/ /* */ /* Block_Type( state ) */ /* */ /* Display the current block type. */ /* */ /****************************************************************/ void Block_Type( s ) de_state *s; { Goto( STATUS_COLUMN, STATUS_LINE + 1 ); printf( "Block = %5u of %-5u ", s->block, s->zones ); if ( !s->is_fs ) return; if ( s->block == BOOT_BLOCK ) printf( "Boot block" ); else if ( s->block == SUPER_BLOCK ) printf( "Super block" ); else if ( s->block < 2 + s->inode_maps ) printf( "I-node bit map" ); else if ( s->block < 2 + s->inode_maps + s->zone_maps ) printf( "Zone bit map" ); else if ( s->block < s->first_data ) printf( "I-nodes" ); else printf( "Data block (%sin use)", In_Use( (bit_t) (s->block - (s->first_data - 1)), s->zone_map ) ? "" : "not " ); } /****************************************************************/ /* */ /* Draw_Words( state ) */ /* */ /* Draw a page in word format. */ /* */ /****************************************************************/ void Draw_Words( s ) de_state *s; { int line; int addr = s->offset & ~ PAGE_MASK; for ( line = 0; line < 16; ++line, addr += 2 ) { Goto( BLOCK_COLUMN, BLOCK_LINE + line ); printf( "%5d ", addr ); Print_Number( *( (word_t *) &s->buffer[ addr ] ), s->output_base ); } Goto( BLOCK_COLUMN + 64, BLOCK_LINE ); printf( "(base %d)", s->output_base ); } /****************************************************************/ /* */ /* Draw_Info( state ) */ /* */ /* Add information to a page drawn in word format. */ /* The routine recognizes the super block, inodes, */ /* executables and "ar" archives. If the current */ /* page is not one of these, then ASCII characters */ /* are printed from the data words. */ /* */ /****************************************************************/ char *super_block_info[] = { "number of inodes", "V1 number of zones", "inode bit map blocks", "zone bit map blocks", "first data zone", "blocks per zone shift & flags", "maximum file size", "", "magic number", "fsck magic number", "V2 number of zones" }; void Draw_Info( s ) de_state *s; { int i; int page = s->offset >> PAGE_SHIFT; dev_t dev; if ( s->is_fs && s->block == SUPER_BLOCK && page == 0 ) for ( i = 0; i < 11; ++i ) { Goto( INFO_COLUMN, INFO_LINE + i ); printf( "%s", super_block_info[ i ] ); } else if ( s->is_fs && s->block >= s->first_data - s->inode_blocks && s->block < s->first_data ) { struct inode core_inode; d1_inode *dip1; d2_inode *dip2; struct inode *inode = &core_inode; int special = 0; int m; struct passwd *user; struct group *grp; dip1 = (d1_inode *) &s->buffer[ s->offset & ~ PAGE_MASK ]; dip2 = (d2_inode *) &s->buffer[ s->offset & ~ PAGE_MASK & ~ (V2_INODE_SIZE-1) ]; conv_inode( inode, dip1, dip2, READING, s->magic ); user = getpwuid( inode->i_uid ); grp = getgrgid( inode->i_gid ); if ( s->magic != SUPER_MAGIC && page & 1 ) { Draw_Zone_Numbers( s, inode, 2, 0 ); return; } Goto( INFO_COLUMN, INFO_LINE ); switch( inode->i_mode & S_IFMT ) { case S_IFDIR : printf( "directory " ); break; case S_IFCHR : printf( "character " ); special = 1; break; case S_IFBLK : printf( "block " ); special = 1; break; case S_IFREG : printf( "regular " ); break; #ifdef S_IFIFO case S_IFIFO : printf( "fifo " ); break; #endif #ifdef S_IFLNK case S_IFLNK : printf( "symlink " ); break; #endif #ifdef S_IFSOCK case S_IFSOCK: printf( "socket " ); break; #endif default : printf( "unknown " ); } for ( m = 11; m >= 0; --m ) putchar( (inode->i_mode & (1<magic == SUPER_MAGIC ) { /* V1 file system */ Goto( INFO_COLUMN, INFO_LINE + 1 ); printf( "user %s", user ? user->pw_name : "" ); Goto( INFO_COLUMN, INFO_LINE + 2 ); printf( "file size %lu", inode->i_size ); Goto( INFO_COLUMN, INFO_LINE + 4 ); printf( "m_time %s", ctime( &inode->i_mtime ) ); Goto( INFO_COLUMN, INFO_LINE + 6 ); printf( "links %d, group %s", inode->i_nlinks, grp ? grp->gr_name : "" ); Draw_Zone_Numbers( s, inode, 0, 7 ); } else { /* V2 file system, even page. */ Goto( INFO_COLUMN, INFO_LINE + 1 ); printf( "links %d ", inode->i_nlinks); Goto( INFO_COLUMN, INFO_LINE + 2 ); printf( "user %s", user ? user->pw_name : "" ); Goto( INFO_COLUMN, INFO_LINE + 3 ); printf( "group %s", grp ? grp->gr_name : "" ); Goto( INFO_COLUMN, INFO_LINE + 4 ); printf( "file size %lu", inode->i_size ); Goto( INFO_COLUMN, INFO_LINE + 6 ); printf( "a_time %s", ctime( &inode->i_atime ) ); Goto( INFO_COLUMN, INFO_LINE + 8 ); printf( "m_time %s", ctime( &inode->i_mtime ) ); Goto( INFO_COLUMN, INFO_LINE + 10 ); printf( "c_time %s", ctime( &inode->i_ctime ) ); Draw_Zone_Numbers( s, inode, 0, 12 ); } if ( special ) { Goto( INFO_COLUMN, INFO_LINE + 7 ); dev = (dev_t) inode->i_zone[0]; printf( "major %d, minor %d", major(dev), minor(dev) ); } } else /* Print ASCII characters for each byte in page */ { char *p = &s->buffer[ s->offset & ~ PAGE_MASK ]; for ( i = 0; i < 16; ++i ) { Goto( INFO_COLUMN, INFO_LINE + i ); Print_Ascii( *p++ ); Print_Ascii( *p++ ); } if ( s->block >= s->first_data && page == 0 ) { unsigned magic = ((s->buffer[1] & 0xff) << 8) | (s->buffer[0] & 0xff); unsigned second = ((s->buffer[3] & 0xff) << 8) | (s->buffer[2] & 0xff); /* Is this block the start of an executable file? */ if ( magic == (unsigned) A_OUT ) { Goto( INFO_COLUMN, INFO_LINE ); printf( "executable" ); Goto( INFO_COLUMN, INFO_LINE + 1 ); if ( second == (unsigned) SPLIT ) printf( "separate I & D" ); else printf( "combined I & D" ); } } } } /****************************************************************/ /* */ /* Draw_Block( block ) */ /* */ /* Redraw a 1k block in character format. */ /* */ /****************************************************************/ void Draw_Block( block ) char *block; { int line; int column; int reverse = 0; int msb_flag = 0; for ( line = 0; line < 16; ++line ) { Goto( BLOCK_COLUMN, BLOCK_LINE + line ); for ( column = 0; column < 64; ++column ) { char c = *block++; if ( c & 0x80 ) { msb_flag = 1; c &= 0x7f; } if ( c >= ' ' && c < DEL ) { if ( reverse ) { fputs( Tnormal, stdout ); reverse = 0; } putchar( c ); } else { if ( ! reverse ) { fputs( Treverse, stdout ); reverse = 1; } putchar( c == DEL ? '?' : '@' + c ); } } /* end for ( column ) */ } /* end for ( line ) */ if ( reverse ) { fputs( Tnormal, stdout ); reverse = 0; } if ( msb_flag ) { Goto( BLOCK_COLUMN + 68, BLOCK_LINE + 6 ); fputs( "(MSB)", stdout ); } } /****************************************************************/ /* */ /* Draw_Map( block, max_bits ) */ /* */ /* Redraw a block in a bit map format. */ /* Display min( max_bits, 2048 ) bits. */ /* */ /* The 256 bytes in "block" are displayed from */ /* top to bottom and left to right. Bit 0 of */ /* a byte is towards the top of the screen. */ /* */ /* Special graphic codes are used to generate */ /* two "bits" per character position. So a 16 */ /* line by 64 column display is 32 "bits" by */ /* 64 "bits". Or 4 bytes by 64 bytes. */ /* */ /****************************************************************/ void Draw_Map( block, max_bits ) char *block; int max_bits; { int line; int column; int bit_count = 0; for ( line = 0; line < 16; ++line ) { char *p = &block[ (line & 0xC) >> 2 ]; int shift = (line & 0x3) << 1; Goto( BLOCK_COLUMN, BLOCK_LINE + line ); for ( column = 0; column < 64; ++column, p += 4 ) { char c = (*p >> shift) & 0x3; int current_bit = ((p - block) << 3) + shift; /* Don't display bits past "max_bits" */ if ( current_bit >= max_bits ) break; /* If "max_bits" occurs in between the two bits */ /* I am trying to display as one character, then */ /* zero off the high-order bit. */ if ( current_bit + 1 == max_bits ) c &= 1; switch ( c ) { case 0 : putchar( BOX_CLR ); break; case 1 : putchar( BOX_TOP ); ++bit_count; break; case 2 : putchar( BOX_BOT ); ++bit_count; break; case 3 : putchar( BOX_ALL ); bit_count += 2; break; } } /* end for ( column ) */ } /* end for ( line ) */ Goto( BLOCK_COLUMN + 68, BLOCK_LINE + 6 ); printf( "(%d)", bit_count ); } /****************************************************************/ /* */ /* Draw_Pointers( state ) */ /* */ /* Redraw the pointers and the offset field. */ /* The rest of the screen stays intact. */ /* */ /****************************************************************/ void Draw_Pointers( s ) de_state *s; { Draw_Offset( s ); switch ( s->mode ) { case WORD : Word_Pointers( s->last_addr, s->address ); break; case BLOCK : Block_Pointers( s->last_addr, s->address ); break; case MAP : Map_Pointers( s->last_addr, s->address ); break; } Goto( PROMPT_COLUMN, PROMPT_LINE ); } /****************************************************************/ /* */ /* Draw_Offset( state ) */ /* */ /* Display the offset in the current buffer */ /* and the relative position if within a map */ /* or i-node block. */ /* */ /****************************************************************/ void Draw_Offset( s ) de_state *s; { Goto( STATUS_COLUMN, STATUS_LINE + 2 ); printf( "Offset = %5d ", s->offset ); if ( s->block < 2 ) return; if ( s->block < 2 + s->inode_maps ) { long bit = (s->address - 2 * K) * 8; if ( bit < s->inodes_in_map ) printf( "I-node %ld of %d ", bit, s->inodes ); else printf( "(padding) " ); } else if ( s->block < 2 + s->inode_maps + s->zone_maps ) { long bit = (s->address - (2 + s->inode_maps) * K) * 8; if ( bit < s->zones_in_map ) printf( "Block %ld of %u ", bit + s->first_data - 1, s->zones ); else printf( "(padding) " ); } else if ( s->block < s->first_data ) { bit_t node = (s->address - (2 + s->inode_maps + s->zone_maps) * K) / s->inode_size + 1; if ( node <= s->inodes ) printf( "I-node %lu of %lu (%sin use) ", (unsigned long) node, (unsigned long) s->inodes, In_Use( node, s->inode_map ) ? "" : "not " ); else printf( "(padding) " ); } } /****************************************************************/ /* */ /* Word_Pointers( old_addr, new_addr ) */ /* */ /* Block_Pointers( old_addr, new_addr ) */ /* */ /* Map_Pointers( old_addr, new_addr ) */ /* */ /* Redraw the index pointers for a each type */ /* of display. The pointer at "old_addr" is */ /* erased and a new pointer is positioned */ /* for "new_addr". This makes the screen */ /* update faster and more pleasant for the user. */ /* */ /****************************************************************/ void Word_Pointers( old_addr, new_addr ) off_t old_addr; off_t new_addr; { int from = ( (int) old_addr & PAGE_MASK ) >> 1; int to = ( (int) new_addr & PAGE_MASK ) >> 1; Goto( BLOCK_COLUMN - 2, BLOCK_LINE + from ); putchar( ' ' ); Goto( BLOCK_COLUMN - 2, BLOCK_LINE + to ); putchar( '>' ); } void Block_Pointers( old_addr, new_addr ) off_t old_addr; off_t new_addr; { int from = (int) old_addr & ~K_MASK; int to = (int) new_addr & ~K_MASK; Goto( BLOCK_COLUMN - 2, BLOCK_LINE + from / 64 ); putchar( ' ' ); Goto( BLOCK_COLUMN - 2, BLOCK_LINE + to / 64 ); putchar( '>' ); Goto( BLOCK_COLUMN + from % 64, BLOCK_LINE + 17 ); putchar( ' ' ); Goto( BLOCK_COLUMN + to % 64, BLOCK_LINE + 17 ); putchar( '^' ); } void Map_Pointers( old_addr, new_addr ) off_t old_addr; off_t new_addr; { int from = ( (int) old_addr & MAP_MASK ) >> 2; int to = ( (int) new_addr & MAP_MASK ) >> 2; Goto( BLOCK_COLUMN + from, BLOCK_LINE + 17 ); putchar( ' ' ); Goto( BLOCK_COLUMN + to, BLOCK_LINE + 17 ); putchar( '^' ); } /****************************************************************/ /* */ /* Print_Number( number, output_base ) */ /* */ /* Output "number" in the output base. */ /* */ /****************************************************************/ void Print_Number( number, output_base ) word_t number; int output_base; { switch ( output_base ) { case 16 : printf( "%5x", number ); break; case 10 : printf( "%7u", number ); break; case 8 : printf( "%7o", number ); break; case 2 : { unsigned int mask; char pad = ' '; for ( mask = 0x8000; mask > 1; mask >>= 1 ) putchar( (mask & number) ? (pad = '0', '1') : pad ); putchar( (0x01 & number) ? '1' : '0' ); break; } default : Error( "Internal fault (output_base)" ); } } /****************************************************************/ /* */ /* Print_Ascii( char ) */ /* */ /* Display a character in reverse mode if it */ /* is not a normal printable ASCII character. */ /* */ /****************************************************************/ void Print_Ascii( c ) char c; { c &= 0x7f; if ( c < ' ' ) printf( "%s%c%s", Treverse, '@' + c, Tnormal ); else if ( c == DEL ) printf( "%s?%s", Treverse, Tnormal ); else putchar( c ); } /****************************************************************/ /* */ /* Warning( text, arg1, arg2 ) */ /* */ /* Display a message for 2 seconds. */ /* */ /****************************************************************/ #if __STDC__ void Warning( const char *text, ... ) #else void Warning( text ) char *text; #endif { va_list argp; printf( "%c%s", BELL, Tclr_all ); Goto( WARNING_COLUMN, WARNING_LINE ); printf( "%s Warning: ", Treverse ); va_start( argp, text ); vprintf( text, argp ); va_end( argp ); printf( " %s", Tnormal ); fflush(stdout); /* why does everyone forget this? */ sleep( 2 ); } void Draw_Zone_Numbers( s, inode, zindex, zrow ) de_state *s; struct inode *inode; int zindex; int zrow; { static char *plurals[] = { "", "double ", "triple " }; zone_t zone; for ( ; zrow < 16; ++zindex, zrow += s->zone_num_size / sizeof (word_t) ) { Goto( INFO_COLUMN, INFO_LINE + zrow ); if ( zindex < s->ndzones ) printf( "zone %d", zindex ); else printf( "%sindirect", plurals[ zindex - s->ndzones ] ); if ( s->magic != SUPER_MAGIC ) { zone = inode->i_zone[ zindex ]; if ( zone != (word_t) zone ) { Goto( INFO_COLUMN + 16, INFO_LINE + zrow ); printf("%ld", (long) zone ); } } } } 0 ...1 Makefile2 README3 dis.h4 disfp.c5 dishand.c6 dismain.c7 disrel.c8 distabs.c# Makefile for dis # @(#) Makefile, Ver. 2.1 created 00:00:00 87/09/01 # Makefile for 8088 symbolic disassembler # Copyright (C) 1987 G. M. Harding, all rights reserved. # Permission to copy and redistribute is hereby granted, # provided full source code, with all copyright notices, # accompanies any redistribution. # This Makefile automates the process of compiling and linking # a symbolic object-file disassembler program for the Intel # 8088 CPU. Relatively machine-independent code is contained in # the file dismain.c; lookup tables and handler routines, which # are by their nature machine-specific, are contained in two # files named distabs.c and dishand.c, respectively. (A third # machine-specific file, disfp.c, contains handler routines for # floating-point coprocessor opcodes.) A header file, dis.h, # attempts to mediate between the machine-specific and machine- # independent portions of the code. An attempt has been made to # isolate machine dependencies and to deal with them in fairly # straightforward ways. Thus, it should be possible to target a # different CPU by rewriting the handler routines and changing # the initialization data in the lookup tables. It should not # be necessary to alter the formats of the tables. CFLAGS =-O -wo OBJ = disrel.o dismain.o distabs.o dishand.o disfp.o all: dis88 dis88: $(OBJ) cc -i -o dis88 $(OBJ) install -S 5kw dis88 install: /usr/bin/dis88 /usr/bin/dis88: dis88 install -cs -o bin dis88 $@ disrel.o: disrel.c dismain.o: dismain.c dis.h distabs.o: distabs.c dis.h dishand.o: dishand.c dis.h disfp.o: disfp.c dis.h clean: rm -f *.bak *.o core dis88 dis88 Beta Release 87/09/01 --- G. M. HARDING POB 4142 Santa Clara CA 95054-0142 "Dis88" is a symbolic disassembler for the Intel 8088 CPU, designed to run under the PC/IX operating system on an IBM XT or fully-compatible clone. Its output is in the format of, and is completely compatible with, the PC/IX assembler, "as". The program is copyrighted by its author, but may be copied and re- distributed freely provided that complete source code, with all copyright notices, accompanies any distribution. This provision also applies to any modifications you may make. You are urged to comment such changes, giving, as a miminum, your name and complete address. This release of the program is a beta release, which means that it has been extensively, but not exhaustively, tested. User comments, recommendations, and bug fixes are welcome. The principal features of the current release are: (a) The ability to disassemble any file in PC/IX object format, making full use of symbol and relocation information if it is present, regardless of whether the file is executable or linkable, and regardless of whether it has continuous or split I/D space; (b) Automatic generation of synthetic labels when no sym- bol table is available; and (c) Optional output of address and object-code informa- tion as assembler comment text. Limitations of the current release are: (a) Numeric co-processor (i.e., 8087) mnemonics are not supported. Instructions for the co-processor are disassembled as CPU escape sequences, or as interrupts, depending on how they were assembled in the first place. This limitation will be addressed in a future release. (b) Symbolic references within the object file's data segment are not supported. Thus, for example, if a data segment location is initialized to point to a text segment address, no reference to a text segment symbol will be detected. This limi- tation is likely to remain in future releases, because object code does not, in most cases, contain sufficient information to allow meaningful interpretation of pure data. (Note, however, that symbolic references to the data segment from within the text segment are always supported.) As a final caveat, be aware that the PC/IX assembler does not recognize the "esc" mnemonic, even though it refers to a completely valid CPU operation which is documented in all the Intel literature. Thus, the corresponding opcodes (0xd8 through 0xdf) are disassembled as .byte directives. For reference, how- ever, the syntactically-correct "esc" instruction is output as a comment. To build the disassembler program, transfer all the source files, together with the Makefile, to a suitable (preferably empty) PC/IX directory. Then, simply type "make". To use dis88, place it in a directory which appears in your $PATH list. It may then be invoked by name from whatever directory you happen to be in. As a minimum, the program must be invoked with one command-line argument: the name of the ob- ject file to be disassembled. (Dis88 will complain if the file specified is not an object file.) Optionally, you may specify an output file; stdout is the default. One command-line switch is available: "-o", which makes the program display addresses and object code along with its mnemonic disassembly. The "-o" option is useful primarily for verifying the cor- rectness of the program's output. In particular, it may be used to check the accuracy of local relative jump opcodes. These jumps often target local labels, which are lost at assembly time; thus, the disassembly may contain cryptic instructions like "jnz .+39". As a user convenience, all relative jump and call opcodes are output with a comment which identifies the physical target address. By convention, the release level of the program as a whole is the SID of the file disrel.c, and this SID string appears in each disassembly. Release 2.1 of the program is the first beta release to be distributed on Usenet. .TH dis88 1 LOCAL .SH "NAME" dis88 \- 8088 symbolic disassembler .SH "SYNOPSIS" \fBdis88\fP [ -o ] ifile [ ofile ] .SH "DESCRIPTION" Dis88 reads ifile, which must be in PC/IX a.out format. It interprets the binary opcodes and data locations, and writes corresponding assembler source code to stdout, or to ofile if specified. The program's output is in the format of, and fully compatible with, the PC/IX assembler, as(1). If a symbol table is present in ifile, labels and references will be symbolic in the output. If the input file lacks a symbol table, the fact will be noted, and the disassembly will proceed, with the disassembler generating synthetic labels as needed. If the input file has split I/D space, or if it is executable, the disassembler will make all necessary adjustments in address-reference calculations. .PP If the "-o" option appears, object code will be included in comments during disassembly of the text segment. This feature is used primarily for debugging the disassembler itself, but may provide information of passing interest to users. .PP The program always outputs the current machine address before disassembling an opcode. If a symbol table is present, this address is output as an assembler comment; otherwise, it is incorporated into the synthetic label which is generated internally. Since relative jumps, especially short ones, may target unlabelled locations, the program always outputs the physical target address as a comment, to assist the user in following the code. .PP The text segment of an object file is always padded to an even machine address. In addition, if the file has split I/D space, the text segment will be padded to a paragraph boundary (i.e., an address divisible by 16). As a result of this padding, the disassembler may produce a few spurious, but harmless, instructions at the end of the text segment. .PP Disassembly of the data segment is a difficult matter. The information to which initialized data refers cannot be inferred from context, except in the special case of an external data or address reference, which will be reflected in the relocation table. Internal data and address references will already be resolved in the object file, and cannot be recreated. Therefore, the data segment is disassembled as a byte stream, with long stretches of null data represented by an appropriate ".zerow" pseudo-op. This limitation notwithstanding, labels (as opposed to symbolic references) are always output at appropriate points within the data segment. .PP If disassembly of the data segment is difficult, disassembly of the bss segment is quite easy, because uninitialized data is all zero by definition. No data is output in the bss segment, but symbolic labels are output as appropriate. .PP For each opcode which takes an operand, a particular symbol type (text, data, or bss) is appropriate. This tidy correspondence is complicated somewhat, however, by the existence of assembler symbolic constants and segment override opcodes. Therefore, the disassembler's symbol lookup routine attempts to apply a certain amount of intelligence when it is asked to find a symbol. If it cannot match on a symbol of the preferred type, it may return a symbol of some other type, depending on preassigned (and somewhat arbi====trary) rankings within each type. Finally, if all else fails, it returns a string containing the address sought as a hex constant; this behavior allows calling routines to use the output of the lookup function regardless of the success of its search. .PP It is worth noting, at this point, that the symbol lookup routine operates linearly, and has not been optimized in any way. Execution time is thus likely to increase geometrically with input file size. The disassembler is internally limited to 1500 symbol table entries and 1500 relocation table entries; while these limits are generous (/unix, itself, has fewer than 800 symbols), they are not guaranteed to be adequate in all cases. If the symbol table or the relocation table overflows, the disassembly aborts. .PP Finally, users should be aware of a bug in the assembler, which causes it not to parse the "esc" mnemonic, even though "esc" is a completely legitimate opcode which is documented in all the Intel literature. To accommodate this deficiency, the disassembler translates opcodes of the "esc" family to .byte directives, but notes the correct mnemonic in a comment for reference. .PP In all cases, it should be possible to submit the output of the disassembler program to the assembler, and assemble it without error. In most cases, the resulting object code will be identical to the original; in any event, it will be functionally equivalent. .SH "SEE ALSO" adb(1), as(1), cc(1), ld(1). .br "Assembler Reference Manual" in the PC/IX Programmer's Guide. .SH "DIAGNOSTICS" "can't access input file" if the input file cannot be found, opened, or read. .sp "can't open output file" if the output file cannot be created. .sp "warning: host/cpu clash" if the program is run on a machine with a different CPU. .sp "input file not in object format" if the magic number does not correspond to that of a PC/IX object file. .sp "not an 8086/8088 object file" if the CPU ID of the file header is incorrect. .sp "reloc table overflow" if there are more than 1500 entries in the relocation table. .sp "symbol table overflow" if there are more than 1500 entries in the symbol table. .sp "lseek error" if the input file is corrupted (should never happen). .sp "warning: no symbols" if the symbol table is missing. .sp "can't reopen input file" if the input file is removed or altered during program execution (should never happen). .SH "BUGS" Numeric co-processor (i.e., 8087) mnemonics are not currently supported. Instructions for the co-processor are disassembled as CPU escape sequences, or as interrupts, depending on how they were assembled in the first place. .sp Despite the program's best efforts, a symbol retrieved from the symbol table may sometimes be different from the symbol used in the original assembly. .sp The disassembler's internal tables are of fixed size, and the program aborts if they overflow. /* ** @(#) dis.h, Ver. 2.1 created 00:00:00 87/09/01 */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1987 G. M. Harding, all rights reserved * * * * Permission to copy and redistribute is hereby granted, * * provided full source code, with all copyright notices, * * accompanies any redistribution. * * * * This file contains declarations and definitions used by * * the 8088 disassembler program. The program was designed * * for execution on a machine of its own type (i.e., it is * * not designed as a cross-disassembler); consequently, A * * SIXTEEN-BIT INTEGER SIZE HAS BEEN ASSUMED. This assump- * * tion is not particularly important, however, except in * * the machine-specific portions of the code (i.e., the * * handler routines and the optab[] array). It should be * * possible to override this assumption, for execution on * * 32-bit machines, by use of a pre-processor directive * * (see below); however, this has not been tested. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include #include /* Object file format definitions */ #include /* System file-control definitions */ #include #include #include #include /* System standard I/O definitions */ #define MAXSYM 1500 /* Maximum entries in symbol table */ extern struct nlist /* Array to hold the symbol table */ symtab[MAXSYM]; extern struct reloc /* Array to hold relocation table */ relo[MAXSYM]; extern int symptr; /* Index into the symtab[] array */ extern int relptr; /* Index into the relo[] array */ struct opcode /* Format for opcode data records */ { char *text; /* Pointer to mnemonic text */ void (*func)(); /* Pointer to handler routine */ unsigned min; /* Minimum # of object bytes */ unsigned max; /* Maximum # of object bytes */ }; extern struct opcode /* Array to hold the opcode table */ optab[256]; extern char *REGS[]; /* Table of register names */ extern char *REGS0[]; /* Mode 0 register name table */ extern char *REGS1[]; /* Mode 1 register name table */ #define AL REGS[0] /* CPU register manifests */ #define CL REGS[1] #define DL REGS[2] #define BL REGS[3] #define AH REGS[4] #define CH REGS[5] #define DH REGS[6] #define BH REGS[7] #define AX REGS[8] #define CX REGS[9] #define DX REGS[10] #define BX REGS[11] #define SP REGS[12] #define BP REGS[13] #define SI REGS[14] #define DI REGS[15] #define ES REGS[16] #define CS REGS[17] #define SS REGS[18] #define DS REGS[19] #define BX_SI REGS0[0] #define BX_DI REGS0[1] #define BP_SI REGS0[2] #define BP_DI REGS0[3] extern int symrank[6][6]; /* Symbol type/rank matrix */ extern unsigned long PC; /* Current program counter */ extern int segflg; /* Flag: segment override in effect */ extern int objflg; /* Flag: output object as a comment */ #define OBJMAX 8 /* Size of the object code buffer */ extern unsigned char /* Internal buffer for object code */ objbuf[OBJMAX]; extern int objptr; /* Index into the objbuf[] array */ extern char ADD[], /* Opcode family mnemonic strings */ OR[], ADC[], SBB[], AND[], SUB[], XOR[], CMP[], NOT[], NEG[], MUL[], DIV[], MOV[], ESC[], TEST[], AMBIG[]; extern char *OPFAM[]; /* Indexed mnemonic family table */ extern struct exec HDR; /* Holds the object file's header */ #define LOOK_ABS 0 /* Arguments to lookup() function */ #define LOOK_REL 1 #define LOOK_LNG 2 #define TR_STD 0 /* Arguments to mtrans() function */ #define TR_SEG 8 /* Macro for byte input primitive */ #define FETCH(p) ++PC; p = getchar() & 0xff; objbuf[objptr++] = p /* disfp.c */ _PROTOTYPE(void eshand, (int j )); _PROTOTYPE(void fphand, (int j )); _PROTOTYPE(void inhand, (int j )); /* dishand.c */ _PROTOTYPE(void objini, (int j )); _PROTOTYPE(void objout, (void)); _PROTOTYPE(void badseq, (int j, int k )); _PROTOTYPE(void dfhand, (int j )); _PROTOTYPE(void sbhand, (int j )); _PROTOTYPE(void aohand, (int j )); _PROTOTYPE(void sjhand, (int j )); _PROTOTYPE(void imhand, (int j )); _PROTOTYPE(void mvhand, (int j )); _PROTOTYPE(void mshand, (int j )); _PROTOTYPE(void pohand, (int j )); _PROTOTYPE(void cihand, (int j )); _PROTOTYPE(void mihand, (int j )); _PROTOTYPE(void mqhand, (int j )); _PROTOTYPE(void tqhand, (int j )); _PROTOTYPE(void rehand, (int j )); _PROTOTYPE(void mmhand, (int j )); _PROTOTYPE(void srhand, (int j )); _PROTOTYPE(void aahand, (int j )); _PROTOTYPE(void iohand, (int j )); _PROTOTYPE(void ljhand, (int j )); _PROTOTYPE(void mahand, (int j )); _PROTOTYPE(void mjhand, (int j )); /* dismain.c */ _PROTOTYPE(void main, (int argc, char **argv )); /* distabs.c */ _PROTOTYPE(char *getnam, (int k )); _PROTOTYPE(int lookext, (long off, long loc, char *buf )); _PROTOTYPE(char *lookup, (long addr, int type, int kind, long ext )); _PROTOTYPE(char *mtrans, (int c, int m, int type )); _PROTOTYPE(void mtrunc, (char *a )); static char *sccsid = "@(#) disfp.c, Ver. 2.1 created 00:00:00 87/09/01"; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1987 G. M. Harding, all rights reserved * * * * Permission to copy and redistribute is hereby granted, * * provided full source code, with all copyright notices, * * accompanies any redistribution. * * * * This file contains handler routines for the numeric op- * * codes of the 8087 co-processor, as well as a few other * * opcodes which are related to 8087 emulation. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "dis.h" /* Disassembler declarations */ #define FPINT0 0xd8 /* Floating-point interrupts */ #define FPINT1 0xd9 #define FPINT2 0xda #define FPINT3 0xdb #define FPINT4 0xdc #define FPINT5 0xdd #define FPINT6 0xde #define FPINT7 0xdf /* Test for floating opcodes */ #define ISFLOP(x) \ (((x) >= FPINT0) && ((x) <= FPINT7)) /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for the escape family of opcodes. * * These opcodes place the contents of a specified memory * * location on the system bus, for access by a peripheral * * or by a co-processor such as the 8087. (The 8087 NDP is * * accessed only via bus escapes.) Due to a bug in the * * PC/IX assembler, the "esc" mnemonic is not recognized; * * consequently, escape opcodes are disassembled as .byte * * directives, with the appropriate mnemonic and operand * * included as a comment. FOR NOW, those escape sequences * * corresponding to 8087 opcodes are treated as simple * * escapes. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void eshand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF eshand() * * * * * * * * * */ register char *a; register int k; objini(j); FETCH(k); a = mtrans((j & 0xfd),(k & 0xc7),TR_STD); mtrunc(a); printf("\t.byte\t0x%02.2x\t\t| esc\t%s\n",j,a); for (k = 1; k < objptr; ++k) printf("\t.byte\t0x%02.2x\n",objbuf[k]); }/* * * * * * * * * * * END OF eshand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler routine for floating-point opcodes. * * Since PC/IX must accommodate systems with and without * * 8087 co-processors, it allows floating-point operations * * to be initiated in either of two ways: by a software * * interrput whose type is in the range 0xd8 through 0xdf, * * or by a CPU escape sequence, which is invoked by an op- * * code in the same range. In either case, the subsequent * * byte determines the actual numeric operation to be per- * * formed. However, depending on the method of access, * * either one or two code bytes will precede that byte, * * and the fphand() routine has no way of knowing whether * * it was invoked by interrupt or by an escape sequence. * * Therefore, unlike all of the other handler routines ex- * * cept dfhand(), fphand() does not initialize the object * * buffer, leaving that chore to the caller. * * * * FOR NOW, fphand() does not disassemble floating-point * * opcodes to floating mnemonics, but simply outputs the * * object code as .byte directives. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void fphand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF fphand() * * * * * * * * * */ register int k; segflg = 0; FETCH(k); printf("\t.byte\t0x%02.2x\t\t| 8087 code sequence\n", objbuf[0]); for (k = 1; k < objptr; ++k) printf("\t.byte\t0x%02.2x\n",objbuf[k]); /* objout(); FOR NOW */ }/* * * * * * * * * * * END OF fphand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for variable software interrupt * * opcodes. It is included in this file because PC/IX im- * * plements its software floating-point emulation by means * * of interrupts. Any interrupt in the range 0xd8 through * * 0xdf is an NDP-emulation interrupt, and is specially * * handled by the assembler. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void inhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF inhand() * * * * * * * * * */ register int k; objini(j); FETCH(k); if (ISFLOP(k)) { fphand(k); return; } printf("%s\t%d\n",optab[j].text,k); objout(); }/* * * * * * * * * * * END OF inhand() * * * * * * * * * * */ static char *sccsid = "@(#) dishand.c, Ver. 2.1 created 00:00:00 87/09/01"; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1987 G. M. Harding, all rights reserved * * * * Permission to copy and redistribute is hereby granted, * * provided full source code, with all copyright notices, * * accompanies any redistribution. * * * * This file contains the source code for most of the spe- * * cialized handler routines of the disassembler program. * * (The file disfp.c contains handler routines specific to * * the 8087 numeric co-processor.) Each handler routine * * interprets the opcode byte (and subsequent data bytes, * * if any) of a particular family of opcodes, and is re- * * sponsible for generating appropriate output. All of the * * code in this file is highly MACHINE-SPECIFIC, and would * * have to be rewritten for a different CPU. The handler * * routines are accessed only via pointers in the optab[] * * array, however, so machine dependencies are confined to * * this file, its sister file "disfp.c", and the data file * * "distabs.c". * * * * All of the code in this file is based on the assumption * * of sixteen-bit integers. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "dis.h" /* Disassembler declarations */ int segflg; /* Segment-override flag */ unsigned char objbuf[OBJMAX]; /* Buffer for object code */ int objptr; /* Index into objbuf[] */ unsigned long PC; /* Current program counter */ /* * * * * * MISCELLANEOUS SUPPORTING ROUTINES * * * * * */ void objini(j) /* Object code init routine */ register int j; { if ((segflg == 1) || (segflg == 2)) segflg *= 3; else segflg = 0; objptr = 0; objbuf[objptr++] = (unsigned char)(j); } void objout() /* Object-code output routine */ { register int k; if ( ! objflg ) return; else { printf("\t|"); if (symptr >= 0) printf(" %05.5lx:",(PC + 1L - (long)(objptr))); for (k = 0; k < objptr; ++k) printf(" %02.2x",objbuf[k]); putchar('\n'); } } void badseq(j,k) /* Invalid-sequence routine */ register int j, k; { printf("\t.byte\t0x%02.2x\t\t| invalid code sequence\n",j); printf("\t.byte\t0x%02.2x\n",k); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This routine is the first of several opcode-specific * * handlers, each of which is dedicated to a particular * * opcode family. A pointer to a handler routine is con- * * tained in the second field of each optab[] entry. The * * dfhand() routine is the default handler, invoked when * * no other handler is appropriate (generally, when an in- * * valid opcode is encountered). * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void dfhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF dfhand() * * * * * * * * * */ segflg = 0; printf("\t.byte\t0x%02.2x",j); if (optab[j].min || optab[j].max) putchar('\n'); else printf("\t\t| unimplemented opcode\n"); }/* * * * * * * * * * * END OF dfhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the single-byte handler, invoked whenever a * * one-byte opcode is encountered. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void sbhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF sbhand() * * * * * * * * * */ objini(j); if (j == 0x2e) /* seg cs */ segflg = 1; if ((j == 0x26) /* seg es */ || (j == 0x36) /* seg ss */ || (j == 0x3e)) /* seg ds */ segflg = 2; printf("%s\n",optab[j].text); objout(); }/* * * * * * * * * * * END OF sbhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for most of the processor's regular * * arithmetic operations. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void aohand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF aohand() * * * * * * * * * */ register int k; int m, n; char b[64]; objini(j); switch (j & 7) { case 0 : case 1 : case 2 : case 3 : printf("%s\t",optab[j].text); FETCH(k); printf("%s\n",mtrans(j,k,TR_STD)); break; case 4 : FETCH(k); printf("%s\tal,*0x%02.2x\n",optab[j].text,k); break; case 5 : FETCH(m); FETCH(n); k = (n << 8) | m; if (lookext((long)(k),(PC - 1),b)) printf("%s\tax,#%s\n",optab[j].text,b); else printf("%s\tax,#0x%04.4x\n",optab[j].text,k); break; default : dfhand(j); break; } objout(); }/* * * * * * * * * * * END OF aohand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for opcodes which perform short * * (eight-bit) relative jumps. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void sjhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF sjhand() * * * * * * * * * */ register int k; int m; objini(j); FETCH(m); if (m & 0x80) k = 0xff00; else k = 0; k |= m; printf("%s\t%s\t\t| loc %05.5lx\n",optab[j].text, lookup((PC + k + 1L),N_TEXT,LOOK_REL,-1L), (PC + k + 1L)); objout(); }/* * * * * * * * * * * END OF sjhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for a loosely-knit family of op- * * codes which perform arithmetic and logical operations, * * and which take immediate data. The routine's logic is * * rather complex, so, in an effort to avoid additional * * complexity, the search for external references in the * * relocation table has been dispensed with. Eager hackers * * can try their hand at coding such a search. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void imhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF imhand() * * * * * * * * * */ unsigned long pc; register int k; int offset, oflag, immed, iflag, mod, opi, w, rm; int m, n; static char a[100], b[30]; objini(j); FETCH(k); pc = PC + 1; offset = 0; mod = (k & 0xc0) >> 6; opi = (k & 0x38) >> 3; w = j & 1; rm = k & 7; if ((j & 2) && ((opi == 1) || (opi == 4) || (opi == 6))) { ba===================dseq(j,k); return; } strcpy(a,OPFAM[opi]); if ( ! w ) strcat(a,"b"); if ((oflag = mod) > 2) oflag = 0; if ((mod == 0) && (rm == 6)) { FETCH(m); FETCH(n); offset = (n << 8) | m; } else if (oflag) if (oflag == 2) { FETCH(m); FETCH(n); offset = (n << 8) | m; } else { FETCH(m); if (m & 0x80) n = 0xff00; else n = 0; offset = n | m; } switch (j & 3) { case 0 : case 2 : FETCH(immed); iflag = 0; break; case 1 : FETCH(m); FETCH(n); immed = (n << 8) | m; iflag = 1; break; case 3 : FETCH(immed); if (immed & 0x80) immed &= 0xff00; iflag = 0; break; } strcat(a,"\t"); switch (mod) { case 0 : if (rm == 6) strcat(a, lookup((long)(offset),N_DATA,LOOK_ABS,pc)); else { sprintf(b,"(%s)",REGS0[rm]); strcat(a,b); } break; case 1 : case 2 : if (mod == 1) strcat(a,"*"); else strcat(a,"#"); sprintf(b,"%d(",offset); strcat(a,b); strcat(a,REGS1[rm]); strcat(a,")"); break; case 3 : strcat(a,REGS[(w << 3) | rm]); break; } strcat(a,","); if (iflag) strcat(a,"#"); else strcat(a,"*"); sprintf(b,"%d",immed); strcat(a,b); printf("%s\n",a); objout(); }/* * * * * * * * * * * END OF imhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for various "mov"-type opcodes * * which use the mod, reg, and r/m fields of the second * * code byte in a standard, straightforward way. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mvhand(j) int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mvhand() * * * * * * * * * */ register int k, m = j; objini(j); FETCH(k); if ((m == 0x84) || (m == 0x85) /* Kind of kludgey */ || (m == 0xc4) || (m == 0xc5) || (m == 0x8d)) if (m & 0x40) m |= 0x03; else m |= 0x02; printf("%s\t%s\n",optab[j].text,mtrans(m,k,TR_STD)); objout(); }/* * * * * * * * * * * END OF mvhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for segment-register "mov" opcodes. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mshand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mshand() * * * * * * * * * */ register int k; objini(j); FETCH(k); if (k & 0x20) { badseq(j,k); return; } printf("%s\t%s\n",optab[j].text,mtrans(j,k,TR_SEG)); objout(); }/* * * * * * * * * * * END OF mshand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for pops, other than single-byte * * pops. (The 8088 allows popping into any register, or * * directly into memory, accessed either immediately or * * through a register and an index.) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void pohand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF pohand() * * * * * * * * * */ char *a; register int k; objini(j); FETCH(k); if (k & 0x38) { badseq(j,k); return; } printf("%s\t",optab[j].text); a = mtrans((j & 0xfd),k,TR_STD); mtrunc(a); printf("%s\n",a); objout(); }/* * * * * * * * * * * END OF pohand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler routine for intersegment calls and * * jumps. Its output is never symbolic, because the host * * linker does not allow symbolic intersegment address * * references except by means of symbolic constants, and * * any such constants in the symbol table, even if they * * are of the appropriate value, may be misleading. In * * compiled code, intersegment references should not be * * encountered, and even in assembled code, they should * * occur infrequently. If and when they do occur, however, * * they will be disassembled in absolute form. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void cihand(j) int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF cihand() * * * * * * * * * */ register int m, n; objini(j); printf("%s\t",optab[j].text); FETCH(m); FETCH(n); printf("#0x%04.4x,",((n << 8) | m)); FETCH(m); FETCH(n); printf("#0x%04.4x\n",((n << 8) | m)); objout(); }/* * * * * * * * * * * END OF cihand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for "mov" opcodes with immediate * * data. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mihand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mihand() * * * * * * * * * */ register int k; int m, n; char b[64]; objini(j); printf("%s",optab[j].text); if (j & 8) { FETCH(m); FETCH(n); k = ((n << 8) | m); if (lookext((long)(k),(PC - 1),b)) printf("#%s\n",b); else printf("#%d\n",k); } else { FETCH(m); printf("*%d\n",m); } objout(); }/* * * * * * * * * * * END OF mihand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for a family of quick-move opcodes. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mqhand(j) int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mqhand() * * * * * * * * * */ unsigned long pc; register int m, n; objini(j); pc = PC + 1; FETCH(m); FETCH(n); m = (n << 8) | m; printf("%s\t",optab[j].text); if (j & 2) printf("%s,%s\n", lookup((long)(m),N_DATA,LOOK_ABS,pc), REGS[(j & 1) << 3]); else printf("%s,%s\n", REGS[(j & 1) << 3], lookup((long)(m),N_DATA,LOOK_ABS,pc)); objout(); }/* * * * * * * * * * * END OF mqhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for a family of quick-test opcodes. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void tqhand(j) int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF tqhand() * * * * * * * * * */ register int m, n; int k; char b[64]; objini(j); printf("%s\t%s,",optab[j].text,REGS[(j & 1) << 3]); FETCH(m); if (j & 1) { FETCH(n); k = ((n << 8) | m); if (lookext((long)(k),(PC - 1),b)) printf("#%s\n",b); else printf("#%d\n",k); } else { if (m & 80) m |= 0xff00; printf("*%d\n",m); } objout(); }/* * * * * * * * * * * END OF tqhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for multiple-byte "return" opcodes. * * The 8088 allows returns to take an optional 16-bit ar- * * gument, which reflects the amount to be added to SP * * after the pop of the return address. The idea is to * * facilitate the use of local parameters on the stack. * * After some rumination, it was decided to disassemble * * any such arguments as absolute quantities, rather than * * rummaging through the symbol table for possible corre- * * sponding constants. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void rehand(j) int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF rehand() * * * * * * * * * */ register int m, n; objini(j); FETCH(m); FETCH(n); m = (n << 8) | m; printf("%s\t#0x%04.4x\n",optab[j].text,m); objout(); }/* * * * * * * * * * * END OF rehand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for "mov" opcodes involving memory * * and immediate data. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mmhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mmhand() * * * * * * * * * */ char *a; register int k; char b[64]; objini(j); FETCH(k); if (k & 0x38) { badseq(j,k); return; } printf("%s",optab[j].text); if ( ! (j & 1) ) putchar('b'); a = mtrans((j & 0xfd),(k & 0xc7),TR_STD); mtrunc(a); printf("\t%s,",a); if (j & 1) { FETCH(j); FETCH(k); k = (k << 8) | j; if (lookext((long)(k),(PC - 1),b)) printf("#%s\n",b); else printf("#%d\n",k); } else { FETCH(k); printf("*%d\n",k); } objout(); }/* * * * * * * * * * * END OF mmhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for the 8088 family of shift and * * rotate instructions. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void srhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF srhand() * * * * * * * * * */ char *a; register int k; objini(j); FETCH(k); if ((k & 0x38) == 0x30) { badseq(j,k); return; } printf("%s",OPFAM[((k & 0x38) >> 3) + 16]); if ( ! (j & 1) ) putchar('b'); a = mtrans((j & 0xfd),(k & 0xc7),TR_STD); mtrunc(a); printf("\t%s",a); if (j & 2) printf(",cl\n"); else printf(",*1\n"); objout(); }/* * * * * * * * * * * END OF srhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for the ASCII-adjust opcodes. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void aahand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF aahand() * * * * * * * * * */ register int k; objini(j); FETCH(k); if (k != 0x0a) { badseq(j,k); return; } printf("%s\n",optab[j].text); objout(); }/* * * * * * * * * * * END OF aahand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for port I/O opcodes which specify * * the port address as an immediate operand. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void iohand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF iohand() * * * * * * * * * */ register int k; objini(j); FETCH(k); printf("%s\t0x%02.2x\n",optab[j].text,k); objout(); }/* * * * * * * * * * * END OF iohand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for opcodes which perform long * * (sixteen-bit) relative jumps and calls. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void ljhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF ljhand() * * * * * * * * * */ register int k; int m, n; objini(j); FETCH(m); FETCH(n); k = (n << 8) | m; printf("%s\t%s\t\t| loc %05.5lx\n",optab[j].text, lookup((PC + k + 1L),N_TEXT,LOOK_LNG,(PC - 1L)), (PC + k + 1L)); objout(); }/* * * * * * * * * * * END OF ljhand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for a pair of oddball opcodes (0xf6 * * and 0xf7) which perform miscellaneous arithmetic opera- * * tions not dealt with elsewhere. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mahand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mahand() * * * * * * * * * */ char *a; register int k; char b[64]; objini(j); FETCH(k); a = mtrans((j & 0xfd),(k & 0xc7),TR_STD); mtrunc(a); switch (((k = objbuf[1]) & 0x38) >> 3) { case 0 : printf("\ttest"); break; case 1 : badseq(j,k); return; case 2 : printf("\tnot"); break; case 3 : printf("\tneg"); break; case 4 : printf("\tmul"); break; case 5 : printf("\timul"); break; case 6 : printf("\tdiv"); break; case 7 : printf("\tidiv"); break; } if ( ! (j & 1) ) putchar('b'); printf("\t%s",a); if (k & 0x38) putchar('\n'); else if (j & 1) { FETCH(j); FETCH(k); k = (k << 8) | j; if (lookext((long)(k),(PC - 1),b)) printf(",#%s\n",b); else printf(",#%d\n",k); } else { FETCH(k); printf(",*%d\n",k); } objout(); }/* * * * * * * * * * * END OF mahand() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the handler for miscellaneous jump, call, push, * * and increment/decrement opcodes (0xfe and 0xff) which * * are not dealt with elsewhere. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mjhand(j) register int j; /* Pointer to optab[] entry */ {/* * * * * * * * * * START OF mjhand() * * * * * * * * * */ char *a; register int k; objini(j); FETCH(k); a = mtrans((j & 0xfd),(k & 0xc7),TR_STD); mtrunc(a); switch (((k = objbuf[1]) & 0x38) >> 3) { case 0 : printf("\tinc"); if ( ! (j & 1) ) putchar('b'); putchar('\t'); break; case 1 : printf("\tdec"); if ( ! (j & 1) ) putchar('b'); putchar('\t'); break; case 2 : if (j & 1) printf("\tcall\t@"); else goto BAD; break; case 3 : if (j & 1) printf("\tcalli\t@"); else goto BAD; break; case 4 : if (j & 1) printf("\tjmp\t@"); else goto BAD; break; case 5 : if (j & 1) printf("\tjmpi\t@"); else goto BAD; break; case 6 : if (j & 1) printf("\tpush\t"); else goto BAD; break; case 7 : BAD : badseq(j,k); return; } printf("%s\n",a); objout(); }/* * * * * * * * * * * END OF mjhand() * * * * * * * * * * */ static char *sccsid = "@(#) dismain.c, Ver. 2.1 created 00:00:00 87/09/01"; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1987 G. M. Harding, all rights reserved * * * * Permission to copy and redistribute is hereby granted, * * provided full source code, with all copyright notices, * * accompanies any redistribution. * * * * This file contains the source code for the machine- * * independent portions of a disassembler program to run * * in a Unix (System III) environment. It expects, as its * * input, a file in standard a.out format, optionally con- * * taining symbol table information. If a symbol table is * * present, it will be used in the disassembly; otherwise, * * all address references will be literal (absolute). * * * * The disassembler program was originally written for an * * Intel 8088 CPU. However, all details of the actual CPU * * architecture are hidden in three machine-specific files * * named distabs.c, dishand.c, and disfp.c (the latter * * file is specific to the 8087 numeric co-processor). The * * code in this file is generic, and should require mini- * * mal revision if a different CPU is to be targeted. If a * * different version of Unix is to be targeted, changes to * * this file may be necessary, and if a completely differ- * * ent OS is to be targeted, all bets are off. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "dis.h" /* Disassembler declarations */ extern char *release; /* Contains release string */ static char *IFILE = NULL; /* Points to input file name */ static char *OFILE = NULL; /* Points to output file name */ static char *PRG; /* Name of invoking program */ static unsigned long zcount; /* Consecutive "0" byte count */ int objflg = 0; /* Flag: output object bytes */ #define unix 1 #define i8086 1 #define ibmpc 1 #if unix && i8086 && ibmpc /* Set the CPU identifier */ static int cpuid = 1; #else static int cpuid = 0; #endif _PROTOTYPE(static void usage, (char *s )); _PROTOTYPE(static void fatal, (char *s, char *t )); _PROTOTYPE(static void zdump, (unsigned long beg )); _PROTOTYPE(static void prolog, (void)); _PROTOTYPE(static void distext, (void)); _PROTOTYPE(static void disdata, (void)); _PROTOTYPE(static void disbss, (void)); _PROTOTYPE(static char *invoker, (char *s)); _PROTOTYPE(static int objdump, (char *c)); _PROTOTYPE(static char *getlab, (int type)); _PROTOTYPE(static void prolog, (void)); /* * * * * * * MISCELLANEOUS UTILITY FUNCTIONS * * * * * * */ static void usage(s) register char *s; { fprintf(stderr,"Usage: %s [-o] ifile [ofile]\n",s); exit(-1); } static void fatal(s,t) register char *s, *t; { fprintf(stderr,"\07%s: %s\n",s,t); exit(-1); } static void zdump(beg) unsigned long beg; { beg = PC - beg; if (beg > 1L) printf("\t.zerow\t%ld\n",(beg >> 1)); if (beg & 1L) printf("\t.byte\t0\n"); } static char * invoker(s) register char *s; { register int k; k = strlen(s); while (k--) if (s[k] == '/') { s += k; ++s; break; } return (s); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This rather tricky routine supports the disdata() func- * * tion. Its job is to output the code for a sequence of * * data bytes whenever the object buffer is full, or when * * a symbolic label is to be output. However, it must also * * keep track of consecutive zero words so that lengthy * * stretches of null data can be compressed by the use of * * an appropriate assembler pseudo-op. It does this by * * setting and testing a file-wide flag which counts suc- * * cessive full buffers of null data. The function returns * * a logical TRUE value if it outputs anything, logical * * FALSE otherwise. (This enables disdata() to determine * * whether to output a new synthetic label when there is * * no symbol table.) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static int objdump(c) register char *c; {/* * * * * * * * * * START OF objdump() * * * * * * * * * */ register int k; int retval = 0; if (objptr == OBJMAX) { for (k = 0; k < OBJMAX; ++k) if (objbuf[k]) break; if (k == OBJMAX) { zcount += k; objptr = 0; if (c == NULL) return (retval); } } if (zcount) { printf("\t.zerow\t%ld\n",(zcount >> 1)); ++retval; zcount = 0L; } if (objptr) { printf("\t.byte\t"); ++retval; } else return (retval); for (k = 0; k < objptr; ++k) { printf("0x%02.2x",objbuf[k]); if (k < (objptr - 1)) putchar(','); else putchar('\n'); } objptr = 0; return (retval); }/* * * * * * * * * * END OF objdump() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This routine, called at the beginning of the input * * cycle for each object byte, and before any interpreta- * * tion is attempted, searches the symbol table for any * * symbolic name with a value corresponding to the cur- * * rent PC and a type corresponding to the segment type * * (i.e., text, data, or bss) specified by the function's * * argument. If any such name is found, a pointer to it is * * returned; otherwise, a NULL pointer is returned. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static char * getlab(type) register int type; {/* * * * * * * * * * START OF getlab() * * * * * * * * * */ register int k; static char b[32], c[10]; if (symptr < 0) if ((type == N_TEXT) || ((type == N_DATA) && ( ! objptr ) && ( ! zcount ))) { if (type == N_TEXT) sprintf(b,"T%05.5lx:",PC); else sprintf(b,"D%05.5lx:",PC); return (b); } else return (NULL); for (k = 0; k <= symptr; ++k) if ((symtab[k].n_value == PC) && ((symtab[k].n_sclass & N_SECT) == type)) { sprintf(b,"%s:\n",getnam(k)); if (objflg && (type != N_TEXT)) sprintf(c,"| %05.5lx\n",PC); strcat(b,c); return (b); } return (NULL); }/* * * * * * * * * * * END OF getlab() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This routine performs a preliminary scan of the symbol * * table, before disassembly begins, and outputs declara- * * tions of globals and constants. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static void prolog() {/* * * * * * * * * * START OF prolog() * * * * * * * * * */ register int j, flag; if (symptr < 0) return; for (j = flag = 0; j <= symptr; ++j) if ((symtab[j].n_sclass & N_CLASS) == C_EXT) if (((symtab[j].n_sclass & N_SECT) > N_UNDF) && ((symtab[j].n_sclass & N_SECT) < N_COMM)) { char *c = getnam(j); printf("\t.globl\t%s",c); if (++flag == 1) { putchar('\t'); if (strlen(c) < 8) putchar('\t'); printf("| Internal gl===========obal\n"); } else putchar('\n'); } else if (symtab[j].n_value) { char *c = getnam(j); printf("\t.comm\t%s,0x%08.8lx",c, symtab[j].n_value); if (++flag == 1) printf("\t| Internal global\n"); else putchar('\n'); } if (flag) putchar('\n'); for (j = flag = 0; j <= relptr; ++j) if (relo[j].r_symndx < S_BSS) { char *c = getnam(relo[j].r_symndx); ++flag; printf("\t.globl\t%s",c); putchar('\t'); if (strlen(c) < 8) putchar('\t'); printf("| Undef: %05.5lx\n",relo[j].r_vaddr); } if (flag) putchar('\n'); for (j = flag = 0; j <= symptr; ++j) if ((symtab[j].n_sclass & N_SECT) == N_ABS) { char *c = getnam(j); printf("%s=0x%08.8lx",c,symtab[j].n_value); if (++flag == 1) { printf("\t\t"); if (strlen(c) < 5) putchar('\t'); printf("| Literal\n"); } else putchar('\n'); } if (flag) putchar('\n'); }/* * * * * * * * * * * END OF prolog() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function is responsible for disassembly of the * * object file's text segment. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static void distext() {/* * * * * * * * * * START OF distext() * * * * * * * * * */ char *c; register int j; register void (*f)(); for (j = 0; j < (int)(HDR.a_hdrlen); ++j) getchar(); printf("| %s, %s\n\n",PRG,release); printf("| @("); printf("#)\tDisassembly of %s",IFILE); if (symptr < 0) printf(" (no symbols)\n\n"); else printf("\n\n"); if (HDR.a_flags & A_EXEC) printf("| File is executable\n\n"); if (HDR.a_flags & A_SEP) { printf("| File has split I/D space, and may have\n"); printf("| extraneous instructions in text segment\n\n"); } prolog(); printf("\t.text\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_text); segflg = 0; for (PC = 0L; PC < HDR.a_text; ++PC) { j = getchar() & 0xff; if ((j == 0) && ((PC + 1L) == HDR.a_text)) { ++PC; break; } if ((c = getlab(N_TEXT)) != NULL) printf("%s",c); f = optab[j].func; (*f)(j); } }/* * * * * * * * * * END OF distext() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function handles the object file's data segment. * * There is no good way to disassemble a data segment, be- * * cause it is impossible to tell, from the object code * * alone, what each data byte refers to. If it refers to * * an external symbol, the reference can be resolved from * * the relocation table, if there is one. However, if it * * refers to a static symbol, it cannot be distinguished * * from numeric, character, or other pointer data. In some * * cases, one might make a semi-educated guess as to the * * nature of the data, but such guesses are inherently * * haphazard, and they are bound to be wrong a good por- * * tion of the time. Consequently, the data segment is * * disassembled as a byte stream, which will satisfy no * * one but which, at least, will never mislead anyone. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static void disdata() {/* * * * * * * * * * START OF disdata() * * * * * * * * * */ register char *c; register int j; unsigned long end; putchar('\n'); if (HDR.a_flags & A_SEP) { PC = 0L; end = HDR.a_data; } else end = HDR.a_text + HDR.a_data; printf("\t.data\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_data); segflg = 0; for (objptr = 0, zcount = 0L; PC < end; ++PC) { if ((c = getlab(N_DATA)) != NULL) { objdump(c); printf("%s",c); } if (objptr >= OBJMAX) if (objdump(NULL) && (symptr < 0)) printf("D%05.5lx:",PC); j = getchar() & 0xff; objbuf[objptr++] = j; } objdump(""); }/* * * * * * * * * * END OF disdata() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function handles the object file's bss segment. * * Disassembly of the bss segment is easy, because every- * * thing in it is zero by definition. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ static void disbss() {/* * * * * * * * * * START OF disbss() * * * * * * * * * */ register int j; register char *c; unsigned long beg, end; putchar('\n'); if (HDR.a_flags & A_SEP) end = HDR.a_data + HDR.a_bss; else end = HDR.a_text + HDR.a_data + HDR.a_bss; printf("\t.bss\t\t\t| loc = %05.5lx, size = %05.5lx\n\n", PC,HDR.a_bss); segflg = 0; for (beg = PC; PC < end; ++PC) if ((c = getlab(N_BSS)) != NULL) { if (PC > beg) { zdump(beg); beg = PC; } printf("%s",c); } if (PC > beg) zdump(beg); }/* * * * * * * * * * * END OF disbss() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This is the program entry point. The command line is * * searched for an input file name, which must be present. * * An optional output file name is also permitted; if none * * is found, standard output is the default. One command- * * line option is available: "-o", which causes the pro- * * gram to include object code in comments along with its * * mnemonic output. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void main(argc,argv) int argc; /* Command-line args from OS */ register char **argv; {/* * * * * * * * * * * START OF main() * * * * * * * * * * */ char a[1024]; register int fd; long taboff, tabnum; long reloff, relnum; PRG = invoker(*argv); while (*++argv != NULL) /* Process command-line args */ if (**argv == '-') switch (*++*argv) { case 'o' : if (*++*argv) usage(PRG); else ++objflg; break; default : usage(PRG); } else if (IFILE == NULL) IFILE = *argv; else if (OFILE == NULL) OFILE = *argv; else usage(PRG); if (IFILE == NULL) usage(PRG); else if ((fd = open(IFILE,0)) < 0) { sprintf(a,"can't access input file %s",IFILE); fatal(PRG,a); } if (OFILE != NULL) if (freopen(OFILE,"w",stdout) == NULL) { sprintf(a,"can't open output file %s",OFILE); fatal(PRG,a); } if ( ! cpuid ) fprintf(stderr,"\07%s: warning: host/cpu clash\n",PRG); read(fd, (char *) &HDR,sizeof(struct exec)); if (BADMAG(HDR)) { sprintf(a,"input file %s not in object format",IFILE); fatal(PRG,a); } if (HDR.a_cpu != A_I8086) { sprintf(a,"%s is not an 8086/8088 object file",IFILE); fatal(PRG,a); } if (HDR.a_hdrlen <= A_MINHDR) HDR.a_trsize = HDR.a_drsize = 0L; HDR.a_tbase = HDR.a_dbase = 0L; /* AST emergency patch HDR.a_lnums = HDR.a_toffs = 0L; */ reloff = HDR.a_text /* Compute reloc data offset */ + HDR.a_data + (long)(HDR.a_hdrlen); relnum = (HDR.a_trsize + HDR.a_drsize) / sizeof(struct reloc); taboff = reloff /* Compute name table offset */ + HDR.a_trsize + HDR.a_drsize; tabnum = HDR.a_syms / sizeof(struct nlist); if (relnum > MAXSYM) fatal(PRG,"reloc table overflow"); if (tabnum > MAXSYM) fatal(PRG,"symbol table overflow"); if (relnum) /* Get reloc data */ if (lseek(fd,reloff,0) != reloff) fatal(PRG,"lseek error"); else { for (relptr = 0; relptr < relnum; ++relptr) read(fd, (char *) &relo[relptr],sizeof(struct reloc)); relptr--; } if (tabnum) /* Read in symtab */ if (lseek(fd,taboff,0) != taboff) fatal(PRG,"lseek error"); else { for (symptr = 0; symptr < tabnum; ++symptr) read(fd, (char *) &symtab[symptr],sizeof(struct nlist)); symptr--; } else fprintf(stderr,"\07%s: warning: no symbols\n",PRG); close(fd); if (freopen(IFILE,"r",stdin) == NULL) { sprintf(a,"can't reopen input file %s",IFILE); fatal(PRG,a); } distext(); disdata(); disbss(); exit(0); }/* * * * * * * * * * * END OF main() * * * * * * * * * * */ static char *copyright = "@(#) Copyright (C) 1987 G. M. Harding, all rights reserved"; static char *sccsid = "@(#) disrel.c, Ver. 2.1 created 00:00:00 87/09/01"; char *release = "release 2.1 (MINIX)"; /* ** ** This file documents the major revisions to the 8088 sym- ** bolic disassembler. It also contains the release string ** which is output at the head of each disassembly, and the ** copyright string which must be incorporated in any code ** distribution. ** ** Permission to copy and redistribute is hereby granted, ** provided full source code, with all copyright notices, ** accompanies any redistribution. ** ** REVISION HISTORY: ** ** SEP 87: ** After internal shakeout, released on Usenet. ** ** JUN 88: ** Ported to MINIX */ static char *sccsid = "@(#) distabs.c, Ver. 2.1 created 00:00:00 87/09/01"; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Copyright (C) 1987 G. M. Harding, all rights reserved * * * * Permission to copy and redistribute is hereby granted, * * provided full source code, with all copyright notices, * * accompanies any redistribution. * * * * This file contains the lookup tables and other data * * structures for the Intel 8088 symbolic disassembler. It * * also contains a few global routines which facilitate * * access to the tables, for use primarily by the handler * * functions. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "dis.h" /* Disassembler declarations */ struct exec HDR; /* Used to hold header info */ struct nlist symtab[MAXSYM]; /* Array of symbol table info */ struct reloc relo[MAXSYM]; /* Array of relocation info */ int symptr = -1, /* Index into symtab[] */ relptr = -1; /* Index into relo[] */ char *REGS[] = /* Table of register names */ { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", "es", "cs", "ss", "ds" }; char *REGS0[] = /* Mode 0 register name table */ { "bx_si", "bx_di", "bp_si", "bp_di", "si", "di", "", "bx" }; char *REGS1[] = /* Mode 1 register name table */ { "bx_si", "bx_di", "bp_si", "bp_di", "si", "di", "bp", "bx" }; int symrank[6][6] = /* Symbol type/rank matrix */ { /* UND ABS TXT DAT BSS COM */ /* UND */ 5, 4, 1, 2, 3, 0, /* ABS */ 1, 5, 4, 3, 2, 0, /* TXT */ 4, 1, 5, 3, 2, 0, /* DAT */ 3, 1, 2, 5, 4, 0, /* BSS */ 3, 1, 2, 4, 5, 0, /* COM */ 2, 0, 1, 3, 4, 5 }; /* * * * * * * * * * * * OPCODE DATA * * * * * * * * * * * */ char ADD[] = "\tadd", /* Mnemonics by family */ OR[] = "\tor", ADC[] = "\tadc", SBB[] = "\tsbb", AND[] = "\tand", SUB[] = "\tsub", XOR[] = "\txor", CMP[] = "\tcmp", NOT[] = "\tnot", NEG[] = "\tneg", MUL[] = "\tmul", DIV[] = "\tdiv", MOV[] = "\tmov", ESC[] = "\tesc", TEST[] = "\ttest", AMBIG[] = "", ROL[] = "\trol", ROR[] = "\tror", RCL[] = "\trcl", RCR[] = "\trcr", SAL[] = "\tsal", SHR[] = "\tshr", SHL[] = "\tshl", SAR[] = "\tsar"; char *OPFAM[] = /* Family lookup table */ { ADD, OR, ADC, SBB, AND, SUB, XOR, CMP, NOT, NEG, MUL, DIV, MOV, ESC, TEST, AMBIG, ROL, ROR, RCL, RCR, SAL, SHR, SHL, SAR }; struct opcode optab[] = /* Table of opcode data */ { ADD, aohand, 2, 4, /* 0x00 */ ADD, aohand, 2, 4, /* 0x01 */ ADD, aohand, 2, 4, /* 0x02 */ ADD, aohand, 2, 4, /* 0x03 */ ADD, aohand, 2, 2, /* 0x04 */ ADD, aohand, 3, 3, /* 0x05 */ "\tpush\tes", sbhand, 1, 1, /* 0x06 */ "\tpop\tes", sbhand, 1, 1, /* 0x07 */ OR, aohand, 2, 4, /* 0x08 */ OR, aohand, 2, 4, /* 0x09 */ OR, aohand, 2, 4, /* 0x0a */ OR, aohand, 2, 4, /* 0x0b */ OR, aohand, 2, 2, /* 0x0c */ OR, aohand, 3, 3, /* 0x0d */ "\tpush\tcs", sbhand, 1, 1, /* 0x0e */ NULL, dfhand, 0, 0, /* 0x0f */ ADC, aohand, 2, 4, /* 0x10 */ ADC, aohand, 2, 4, /* 0x11 */ ADC, aohand, 2, 4, /* 0x12 */ ADC, aohand, 2, 4, /* 0x13 */ ADC, aohand, 2, 2, /* 0x14 */ ADC, aohand, 3, 3, /* 0x15 */ "\tpush\tss", sbhand, 1, 1, /* 0x16 */ "\tpop\tss", sbhand, 1, 1, /* 0x17 */ SBB, aohand, 2, 4, /* 0x18 */ SBB, aohand, 2, 4, /* 0x19 */ SBB, aohand, 2, 4, /* 0x1a */ SBB, aohand, 2, 4, /* 0x1b */ SBB, aohand, 2, 2, /* 0x1c */ SBB, aohand, 3, 3, /* 0x1d */ "\tpush\tds", sbhand, 1, 1, /* 0x1e */ "\tpop\tds", sbhand, 1, 1, /* 0x1f */ AND, aohand, 2, 4, /* 0x20 */ AND, aohand, 2, 4, /* 0x21 */ AND, aohand, 2, 4, /* 0x22 */ AND, aohand, 2, 4, /* 0x23 */ AND, aohand, 2, 2, /* 0x24 */ AND, aohand, 3, 3, /* 0x25 */ "\tseg\tes", sbhand, 1, 1, /* 0x26 */ "\tdaa", sbhand, 1, 1, /* 0x27 */ SUB, aohand, 2, 4, /* 0x28 */ SUB, aohand, 2, 4, /* 0x29 */ SUB, aohand, 2, 4, /* 0x2a */ SUB, aohand, 2, 4, /* 0x2b */ SUB, aohand, 2, 2, /* 0x2c */ SUB, aohand, 3, 3, /* 0x2d */ "\tseg\tcs", sbhand, 1, 1, /* 0x2e */ "\tdas", sbhand, 1, 1, /* 0x2f */ XOR, aohand, 2, 4, /* 0x30 */ XOR, aohand, 2, 4, /* 0x31 */ XOR, aohand, 2, 4, /* 0x32 */ XOR, aohand, 2, 4, /* 0x33 */ XOR, aohand, 2, 2, /* 0x34 */ XOR, aohand, 3, 3, /* 0x35 */ "\tseg\tss", sbhand, 1, 1, /* 0x36 */ "\taaa", sbhand, 1, 1, /* 0x37 */ CMP, aohand, 2, 4, /* 0x38 */ CMP, aohand, 2, 4, /* 0x39 */ CMP, aohand, 2, 4, /* 0x3a */ CMP, aohand, 2, 4, /* 0x3b */ CMP, aohand, 2, 2, /* 0x3c */ CMP, aohand, 3, 3, /* 0x3d */ "\tseg\tds", sbhand, 1, 1, /* 0x3e */ "\taas", sbhand, 1, 1, /* 0x3f */ "\tinc\tax", sbhand, 1, 1, /* 0x40 */ "\tinc\tcx", sbhand, 1, 1, /* 0x41 */ "\tinc\tdx", sbhand, 1, 1, /* 0x42 */ "\tinc\tbx", sbhand, 1, 1, /* 0x43 */ "\tinc\tsp", sbhand, 1, 1, /* 0x44 */ "\tinc\tbp", sbhand, 1, 1, /* 0x45 */ "\tinc\tsi", sbhand, 1, 1, /* 0x46 */ "\tinc\tdi", sbhand, 1, 1, /* 0x47 */ "\tdec\tax", sbhand, 1, 1, /* 0x48 */ "\tdec\tcx", sbhand, 1, 1, /* 0x49 */ "\tdec\tdx", sbhand, 1, 1, /* 0x4a */ "\tdec\tbx", sbhand, 1, 1, /* 0x4b */ "\tdec\tsp", sbhand, 1, 1, /* 0x4c */ "\tdec\tbp", sbhand, 1, 1, /* 0x4d */ "\tdec\tsi", sbhand, 1, 1, /* 0x4e =======================*/ "\tdec\tdi", sbhand, 1, 1, /* 0x4f */ "\tpush\tax", sbhand, 1, 1, /* 0x50 */ "\tpush\tcx", sbhand, 1, 1, /* 0x51 */ "\tpush\tdx", sbhand, 1, 1, /* 0x52 */ "\tpush\tbx", sbhand, 1, 1, /* 0x53 */ "\tpush\tsp", sbhand, 1, 1, /* 0x54 */ "\tpush\tbp", sbhand, 1, 1, /* 0x55 */ "\tpush\tsi", sbhand, 1, 1, /* 0x56 */ "\tpush\tdi", sbhand, 1, 1, /* 0x57 */ "\tpop\tax", sbhand, 1, 1, /* 0x58 */ "\tpop\tcx", sbhand, 1, 1, /* 0x59 */ "\tpop\tdx", sbhand, 1, 1, /* 0x5a */ "\tpop\tbx", sbhand, 1, 1, /* 0x5b */ "\tpop\tsp", sbhand, 1, 1, /* 0x5c */ "\tpop\tbp", sbhand, 1, 1, /* 0x5d */ "\tpop\tsi", sbhand, 1, 1, /* 0x5e */ "\tpop\tdi", sbhand, 1, 1, /* 0x5f */ NULL, dfhand, 0, 0, /* 0x60 */ NULL, dfhand, 0, 0, /* 0x61 */ NULL, dfhand, 0, 0, /* 0x62 */ NULL, dfhand, 0, 0, /* 0x63 */ NULL, dfhand, 0, 0, /* 0x64 */ NULL, dfhand, 0, 0, /* 0x65 */ NULL, dfhand, 0, 0, /* 0x66 */ NULL, dfhand, 0, 0, /* 0x67 */ NULL, dfhand, 0, 0, /* 0x68 */ NULL, dfhand, 0, 0, /* 0x69 */ NULL, dfhand, 0, 0, /* 0x6a */ NULL, dfhand, 0, 0, /* 0x6b */ NULL, dfhand, 0, 0, /* 0x6c */ NULL, dfhand, 0, 0, /* 0x6d */ NULL, dfhand, 0, 0, /* 0x6e */ NULL, dfhand, 0, 0, /* 0x6f */ "\tjo", sjhand, 2, 2, /* 0x70 */ "\tjno", sjhand, 2, 2, /* 0x71 */ "\tjc", sjhand, 2, 2, /* 0x72 */ "\tjnc", sjhand, 2, 2, /* 0x73 */ "\tjz", sjhand, 2, 2, /* 0x74 */ "\tjnz", sjhand, 2, 2, /* 0x75 */ "\tjna", sjhand, 2, 2, /* 0x76 */ "\tja", sjhand, 2, 2, /* 0x77 */ "\tjs", sjhand, 2, 2, /* 0x78 */ "\tjns", sjhand, 2, 2, /* 0x79 */ "\tjp", sjhand, 2, 2, /* 0x7a */ "\tjnp", sjhand, 2, 2, /* 0x7b */ "\tjl", sjhand, 2, 2, /* 0x7c */ "\tjnl", sjhand, 2, 2, /* 0x7d */ "\tjng", sjhand, 2, 2, /* 0x7e */ "\tjg", sjhand, 2, 2, /* 0x7f */ AMBIG, imhand, 3, 5, /* 0x80 */ AMBIG, imhand, 4, 6, /* 0x81 */ AMBIG, imhand, 3, 5, /* 0x82 */ AMBIG, imhand, 3, 5, /* 0x83 */ TEST, mvhand, 2, 4, /* 0x84 */ TEST, mvhand, 2, 4, /* 0x85 */ "\txchg", mvhand, 2, 4, /* 0x86 */ "\txchg", mvhand, 2, 4, /* 0x87 */ MOV, mvhand, 2, 4, /* 0x88 */ MOV, mvhand, 2, 4, /* 0x89 */ MOV, mvhand, 2, 4, /* 0x8a */ MOV, mvhand, 2, 4, /* 0x8b */ MOV, mshand, 2, 4, /* 0x8c */ "\tlea", mvhand, 2, 4, /* 0x8d */ MOV, mshand, 2, 4, /* 0x8e */ "\tpop", pohand, 2, 4, /* 0x8f */ "\tnop", sbhand, 1, 1, /* 0x90 */ "\txchg\tax,cx", sbhand, 1, 1, /* 0x91 */ "\txchg\tax,dx", sbhand, 1, 1, /* 0x92 */ "\txchg\tax,bx", sbhand, 1, 1, /* 0x93 */ "\txchg\tax,sp", sbhand, 1, 1, /* 0x94 */ "\txchg\tax,bp", sbhand, 1, 1, /* 0x95 */ "\txchg\tax,si", sbhand, 1, 1, /* 0x96 */ "\txchg\tax,di", sbhand, 1, 1, /* 0x97 */ "\tcbw", sbhand, 1, 1, /* 0x98 */ "\tcwd", sbhand, 1, 1, /* 0x99 */ "\tcalli", cihand, 5, 5, /* 0x9a */ "\twait", sbhand, 1, 1, /* 0x9b */ "\tpushf", sbhand, 1, 1, /* 0x9c */ "\tpopf", sbhand, 1, 1, /* 0x9d */ "\tsahf", sbhand, 1, 1, /* 0x9e */ "\tlahf", sbhand, 1, 1, /* 0x9f */ MOV, mqhand, 3, 3, /* 0xa0 */ MOV, mqhand, 3, 3, /* 0xa1 */ MOV, mqhand, 3, 3, /* 0xa2 */ MOV, mqhand, 3, 3, /* 0xa3 */ "\tmovb", sbhand, 1, 1, /* 0xa4 */ "\tmovw", sbhand, 1, 1, /* 0xa5 */ "\tcmpb", sbhand, 1, 1, /* 0xa6 */ "\tcmpw", sbhand, 1, 1, /* 0xa7 */ TEST, tqhand, 2, 2, /* 0xa8 */ TEST, tqhand, 3, 3, /* 0xa9 */ "\tstob", sbhand, 1, 1, /* 0xaa */ "\tstow", sbhand, 1, 1, /* 0xab */ "\tlodb", sbhand, 1, 1, /* 0xac */ "\tlodw", sbhand, 1, 1, /* 0xad */ "\tscab", sbhand, 1, 1, /* 0xae */ "\tscaw", sbhand, 1, 1, /* 0xaf */ "\tmov\tal,", mihand, 2, 2, /* 0xb0 */ "\tmov\tcl,", mihand, 2, 2, /* 0xb1 */ "\tmov\tdl,", mihand, 2, 2, /* 0xb2 */ "\tmov\tbl,", mihand, 2, 2, /* 0xb3 */ "\tmov\tah,", mihand, 2, 2, /* 0xb4 */ "\tmov\tch,", mihand, 2, 2, /* 0xb5 */ "\tmov\tdh,", mihand, 2, 2, /* 0xb6 */ "\tmov\tbh,", mihand, 2, 2, /* 0xb7 */ "\tmov\tax,", mihand, 3, 3, /* 0xb8 */ "\tmov\tcx,", mihand, 3, 3, /* 0xb9 */ "\tmov\tdx,", mihand, 3, 3, /* 0xba */ "\tmov\tbx,", mihand, 3, 3, /* 0xbb */ "\tmov\tsp,", mihand, 3, 3, /* 0xbc */ "\tmov\tbp,", mihand, 3, 3, /* 0xbd */ "\tmov\tsi,", mihand, 3, 3, /* 0xbe */ "\tmov\tdi,", mihand, 3, 3, /* 0xbf */ NULL, dfhand, 0, 0, /* 0xc0 */ NULL, dfhand, 0, 0, /* 0xc1 */ "\tret", rehand, 3, 3, /* 0xc2 */ "\tret", sbhand, 1, 1, /* 0xc3 */ "\tles", mvhand, 2, 4, /* 0xc4 */ "\tlds", mvhand, 2, 4, /* 0xc5 */ MOV, mmhand, 3, 5, /* 0xc6 */ MOV, mmhand, 4, 6, /* 0xc7 */ NULL, dfhand, 0, 0, /* 0xc8 */ NULL, dfhand, 0, 0, /* 0xc9 */ "\treti", rehand, 3, 3, /* 0xca */ "\treti", sbhand, 1, 1, /* 0xcb */ "\tint", sbhand, 1, 1, /* 0xcc */ "\tint", inhand, 2, 2, /* 0xcd */ "\tinto", sbhand, 1, 1, /* 0xce */ "\tiret", sbhand, 1, 1, /* 0xcf */ AMBIG, srhand, 2, 4, /* 0xd0 */ AMBIG, srhand, 2, 4, /* 0xd1 */ AMBIG, srhand, 2, 4, /* 0xd2 */ AMBIG, srhand, 2, 4, /* 0xd3 */ "\taam", aahand, 2, 2, /* 0xd4 */ "\taad", aahand, 2, 2, /* 0xd5 */ NULL, dfhand, 0, 0, /* 0xd6 */ "\txlat", sbhand, 1, 1, /* 0xd7 */ ESC, eshand, 2, 2, /* 0xd8 */ ESC, eshand, 2, 2, /* 0xd9 */ ESC, eshand, 2, 2, /* 0xda */ ESC, eshand, 2, 2, /* 0xdb */ ESC, eshand, 2, 2, /* 0xdc */ ESC, eshand, 2, 2, /* 0xdd */ ESC, eshand, 2, 2, /* 0xde */ ESC, eshand, 2, 2, /* 0xdf */ "\tloopne", sjhand, 2, 2, /* 0xe0 */ "\tloope", sjhand, 2, 2, /* 0xe1 */ "\tloop", sjhand, 2, 2, /* 0xe2 */ "\tjcxz", sjhand, 2, 2, /* 0xe3 */ "\tin", iohand, 2, 2, /* 0xe4 */ "\tinw", iohand, 2, 2, /* 0xe5 */ "\tout", iohand, 2, 2, /* 0xe6 */ "\toutw", iohand, 2, 2, /* 0xe7 */ "\tcall", ljhand, 3, 3, /* 0xe8 */ "\tjmp", ljhand, 3, 3, /* 0xe9 */ "\tjmpi", cihand, 5, 5, /* 0xea */ "\tj", sjhand, 2, 2, /* 0xeb */ "\tin", sbhand, 1, 1, /* 0xec */ "\tinw", sbhand, 1, 1, /* 0xed */ "\tout", sbhand, 1, 1, /* 0xee */ "\toutw", sbhand, 1, 1, /* 0xef */ "\tlock", sbhand, 1, 1, /* 0xf0 */ NULL, dfhand, 0, 0, /* 0xf1 */ "\trepnz", sbhand, 1, 1, /* 0xf2 */ "\trepz", sbhand, 1, 1, /* 0xf3 */ "\thlt", sbhand, 1, 1, /* 0xf4 */ "\tcmc", sbhand, 1, 1, /* 0xf5 */ AMBIG, mahand, 2, 5, /* 0xf6 */ AMBIG, mahand, 2, 6, /* 0xf7 */ "\tclc", sbhand, 1, 1, /* 0xf8 */ "\tstc", sbhand, 1, 1, /* 0xf9 */ "\tcli", sbhand, 1, 1, /* 0xfa */ "\tsti", sbhand, 1, 1, /* 0xfb */ "\tcld", sbhand, 1, 1, /* 0xfc */ "\tstd", sbhand, 1, 1, /* 0xfd */ AMBIG, mjhand, 2, 4, /* 0xfe */ AMBIG, mjhand, 2, 4 /* 0xff */ }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This simple routine returns the name field of a symbol * * table entry as a printable string. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ char * getnam(k) register int k; {/* * * * * * * * * * START OF getnam() * * * * * * * * * */ register int j; static char a[9]; for (j = 0; j < 8; ++j) if ( ! symtab[k].n_name[j] ) break; else a[j] = symtab[k].n_name[j]; a[j] = '\0'; return (a); }/* * * * * * * * * * * END OF getnam() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function is responsible for mucking through the * * relocation table in search of externally referenced * * symbols to be output as operands. It accepts two long * * arguments: the code-segment location at which an extern * * reference is expected, and the offset value which is * * embedded in the object code and used at link time to * * bias the external value. In the most typical case, the * * function will be called by lookup(), which always makes * * a check for external names before searching the symbol * * table proper. However, it may also be called directly * * by any function (such as the move-immediate handler) * * which wants to make an independent check for externals. * * The caller is expected to supply, as the third argument * * to the function, a pointer to a character buffer large * * enough to hold any possible output string. Lookext() * * will fill this buffer and return a logical TRUE if it * * finds an extern reference; otherwise, it will return a * * logical FALSE, leaving the buffer undisturbed. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ int lookext(off,loc,buf) long off, loc; char *buf; {/* * * * * * * * * * START OF lookext() * * * * * * * * * */ register int k; char c[16]; if ((loc != -1L) && (relptr >= 0)) for (k = 0; k <= relptr; ++k) if ((relo[k].r_vaddr == loc) && (relo[k].r_symndx < S_BSS)) { strcpy(buf,getnam(relo[k].r_symndx)); if (off) { if (off < 0) sprintf(c,"%ld",off); else sprintf(c,"+%ld",off); strcat(buf,c); } return (1); } return (0); }/* * * * * * * * * * END OF lookext() * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function finds an entry in the symbol table by * * value. Its input is a (long) machine address, and its * * output is a pointer to a string containing the corre- * * sponding symbolic name. The function first searches the * * relocation table for a possible external reference; if * * none is found, a linear search of the symbol table is * * undertaken. If no matching symbol has been found at the * * end of these searches, the function returns a pointer * * to a string containing the ASCII equivalent of the ad- * * dress which was to be located, so that, regardless of * * the success of the search, the function's return value * * is suitable for use as a memory-reference operand. The * * caller specifies the type of symbol to be found (text, * * data, bss, undefined, absolute, or common) by means of * * the function's second parameter. The third parameter * * specifies the format to be used in the event of a nu- * * meric output: zero for absolute format, one for short * * relative format, two for long relative format. The * * fourth parameter is the address which would appear in * * the relocation table for the reference in question, or * * -1 if the relocation table is not to be searched. The * * function attempts to apply a certain amount of intelli- * * gence in its selection of symbols, so it is possible * * that, in the absence of a type match, a symbol of the * * correct value but different type will be returned. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ char * lookup(addr,type,kind,ext) long addr; /* Machine address to be located */ int type, /* Type of symbol to be matched */ kind; /* Addressing output mode to use */ long ext; /* Value for extern ref, if any */ {/* * * * * * * * * * START OF lookup() * * * * * * * * * */ register int j, k; static char b[64]; struct { int i; int t; } best; if (lookext(addr,ext,b)) return (b); if (segflg) if (segflg & 1) type = N_TEXT; else type = N_DATA; for (k = 0, best.i = -1; k <= symptr; ++k) if (symtab[k].n_value == addr) if ((j = symtab[k].n_sclass & N_SECT) == type) { best.t = j; best.i = k; break; } else if (segflg || (HDR.a_flags & A_SEP)) continue; else if (best.i < 0) best.t = j, best.i = k; else if (symrank[type][j] > symrank[type][best.t]) best.t = j, best.i = k; if (best.i >= 0) return (getnam(best.i)); if (kind == LOOK_ABS) sprintf(b,"0x%05.5x",addr); else { long x = addr - (PC - kind); if (x < 0) sprintf(b,".%ld",x); else sprintf(b,".+%ld",x); } return (b); }/* * * * * * * * * * * END OF lookup() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This function translates an 8088 addressing mode byte * * to an equivalent assembler string, returning a pointer * * thereto. If necessary, it performs successive inputs * * of bytes from the object file in order to obtain offset * * data, adjusting PC accordingly. (The addressing mode * * byte appears in several 8088 opcodes; it is used to * * specify source and destination operand locations.) The * * third argument to the function is zero if the standard * * registers are to be used, or eight if the segment reg- * * isters are to be used; these constants are defined sym- * * bolically in dis.h. NOTE: The mtrans() function must * * NEVER be called except immediately after fetching the * * mode byte. If any additional object bytes are fetched * * after the fetch of the mode byte, mtrans() will not * * produce correct output! * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ char * mtrans(c,m,type) register int c; /* Primary instruction byte */ register int m; /* Addressing mode byte */ int type; /* Type code: standard or seg */ {/* * * * * * * * * * START OF mtrans() * * * * * * * * * */ unsigned long pc; int offset, oflag, dir, w, mod, reg, rm; static char a[100]; static char b[30]; offset = 0; dir = c & 2; w = c & 1; mod = (m & 0xc0) >> 6; reg = (m & 0x38) >> 3; rm = m & 7; pc = PC + 1; if (type) w = 1; if ((oflag = mod) > 2) oflag = 0; if (oflag) { int j, k; if (oflag == 2) { FETCH(j); FETCH(k); offset = (k << 8) | j; } else { FETCH(j); if (j & 0x80) k = 0xff00; else k = 0; offset = k | j; } } if (dir) { strcpy(a,REGS[type + ((w << 3) | reg)]); strcat(a,","); switch (mod) { case 0 : if (rm == 6) { int j, k; FETCH(j); FETCH(k); offset = (k << 8) | j; strcat(a, lookup((long)(offset),N_DATA,LOOK_ABS,pc)); } else { sprintf(b,"(%s)",REGS0[rm]); strcat(a,b); } break; case 1 : case 2 : if (mod == 1) strcat(a,"*"); else strcat(a,"#"); sprintf(b,"%d(",offset); strcat(a,b); strcat(a,REGS1[rm]); strcat(a,")"); break; case 3 : strcat(a,REGS[(w << 3) | rm]); break; } } else { switch (mod) { case 0 : if (rm == 6) { int j, k; FETCH(j); FETCH(k); offset = (k << 8) | j; strcpy(a, lookup((long)(offset),N_DATA,LOOK_ABS,pc)); } else { sprintf(b,"(%s)",REGS0[rm]); strcpy(a,b); } break; case 1 : case 2 : if (mod == 1) strcpy(a,"*"); else strcpy(a,"#"); sprintf(b,"%d(",offset); strcat(a,b); strcat(a,REGS1[rm]); strcat(a,")"); break; case 3 : strcpy(a,REGS[(w << 3) | rm]); break; } strcat(a,","); strcat(a,REGS[type + ((w << 3) | reg)]); } return (a); }/* * * * * * * * * * * END OF mtrans() * * * * * * * * * * */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This simple routine truncates a string returned by the * * mtrans() function, removing its source operand. This is * * useful in handlers which ignore the "reg" field of the * * mode byte. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ void mtrunc(a) register char *a; /* Ptr. to string to truncate */ {/* * * * * * * * * * START OF mtrunc() * * * * * * * * * */ register int k; for (k = strlen(a) - 1; k >= 0; --k) if (a[k] == ',') { a[k] = '\0'; break; } }/* * * * * * * * * * * END OF mtrunc() * * * * * * * * * * */ 9 ...: Makefile; deffun.e< defprf.c= defprf.e> eebit.c? eebuff.c@ eecmds.cA eediag.cB eedisp.cC eeedit.cD eeerr.cE eef1.cF eef2.cG eef3.cH eefd.cI eefdef.hJ eefed.cK eefidx.hL eefile.cM eefill.cN eehelp.cO eekmac.cP eemain.cQ eemake.cR eeprof.hS eeproto.hT eequer.cU eeques.cV eesigs.hW eesite.cX eesite.hY eesrch.cZ eeterm.c[ eevini.c\ elle.h] ellec.c^ sb.h_ sbbcpy.c` sberr.ca sbm.cb sbproto.hc sbstr.cd sbvall.c# Makefile for elle CFLAGS = -O -DIGN_JOB_CONTROL -D_POSIX_SOURCE -wa LDFLAGS= -i all: elle ellec OBJ = eemain.o eecmds.o eesite.o eevini.o eedisp.o eeterm.o eeerr.o \ eeques.o eebuff.o eefile.o eefed.o eeedit.o eebit.o eef1.o \ eef2.o eefd.o eehelp.o eekmac.o eef3.o eesrch.o eequer.o \ eefill.o eediag.o sbstr.o sbm.o sberr.o sbbcpy.o # It probably isn't necessary to make all this stuff all the time, but it # is fairly easy and makes the whole process simpler. If this is not done, # the dependencies are very complicated because some of the .c and .h files # are made dynamically. elle: ellec $(OBJ) $(FUN_OFILES) elle.h eesite.h # $(CC) $(CFLAGS) -c defprf.c # depends on the new *.h files $(CC) $(LDFLAGS) -o $@ $(OBJ) install -S 64k $@ defprf.c: deffun.e cat deffun.e defprf.e | ellec -Pconf > defprf.c eefdef.h: deffun.e cat deffun.e defprf.e | ellec -Fconf > eefdef.h eefidx.h: deffun.e cat deffun.e defprf.e | ellec -FXconf > eefidx.h # Don't flush these files if interrupted, dammit! .PRECIOUS: ellec deffun.e defprf.e # The following files must be recompiled if eefidx.h is changed eecmds.o eebuff.o eeerr.o eehelp.o eejust.o eemain.o eeques.o eef1.o: eefidx.h # ELLE profile compiler. # Although eefdef.h and defprf.c are included by ELLEC, they # are not listed as dependencies in order to avoid loops (see # their target entries). That is OK because their information is not # used when generating the makecf files; it only furnishes default # values needed when an ELLE user compiles a user profile. ellec: ellec.c $(CC) $(LDFLAGS) $(CFLAGS) -o $@ ellec.c install -S 8kw $@ install: /usr/bin/elle /usr/bin/ellec /usr/bin/elle: elle install -cs -o bin elle $@ /usr/bin/ellec: ellec install -cs -o bin ellec $@ clean: rm -f *.o *.bak core elle ellec ;;; ;;; ELLE Master Function Definition file - "deffun.e" ;;; ;;; This file serves as input to the ellec program. It defines ;;; all ELLE functions which may serve as keyboard-bound user commands. ;;; ;;; Format: (efun ) ;;; Index - an unique index # (used only within ELLE) ;;; Name - an unique string identifying this function to the user. ;;; Routine - the C routine implementing the function within ELLE. ;;; Module - the name of the C source file that the routine is in. ;;; ;;; The following definitions are roughly organized by object. ;;; All functions that emulate EMACS functions are given names identical ;;; to the EMACS function names. For historical reasons these names ;;; are not as consistent as they could be (sigh). ;;; Those which have no exact counterpart in EMACS are identified by comments. (undefall) ; Ensure all predefined stuff is cleared out. ; Simple Insertion (efun 1 "Insert Self" f_insself eef1) (efun 2 "Quoted Insert" f_quotins eef1) (efun 3 "CRLF" f_crlf eef1) ; Characters (efun 4 "Forward Character" f_fchar eef1) (efun 5 "Backward Character" f_bchar eef1) (efun 6 "Delete Character" f_dchar eef1) (efun 7 "Backward Delete Character" f_bdchar eef1) (efun 8 "Delete Horizontal Space" f_delspc eef1) (efun 9 "Transpose Characters" f_tchars eef1) ; Words (efun 10 "Forward Word" f_fword eef1) (efun 11 "Backward Word" f_bword eef1) (efun 12 "Kill Word" f_kword eef1) (efun 13 "Backward Kill Word" f_bkword eef1) (efun 14 "Transpose Words" f_twords eef1) (efun 15 "Uppercase Word" f_ucword eef1) (efun 16 "Lowercase Word" f_lcword eef1) (efun 17 "Uppercase Initial" f_uciword eef1) ; 18-19 reserved ; Lines (efun 20 "Beginning of Line" f_begline eef2) (efun 21 "End of Line" f_endline eef2) (efun 22 "Next Line" f_nxtline eef2) (efun 23 "Previous Line" f_prvline eef2) (efun 24 "Down Real Line" f_dnrline eef2) (efun 25 "Up Real Line" f_uprline eef2) (efun 26 "Open Line" f_oline eef2) (efun 27 "Delete Blank Lines" f_delblines eef2) (efun 28 "Kill Line" f_kline eef2) (efun 29 "Backward Kill Line" f_bkline eef2) ; not EMACS (efun 30 "Goto Line" f_goline eef2) ; not EMACS ; 31-34 reserved ; Regions (efun 35 "Set/Pop Mark" f_setmark eef2) (efun 36 "Exchange Point and Mark" f_exchmark eef2) (efun 37 "Kill Region" f_kregion eef2) (efun 38 "Copy Region" f_copreg eef2) (efun 39 "Uppercase Region" f_ucreg eef2) (efun 40 "Lowercase Region" f_lcreg eef2) (efun 41 "Fill Region" f_fillreg eef2) ; 42-44 reserved ; Paragraphs (efun 45 "Forward Paragraph" f_fpara eef2) (efun 46 "Backward Paragraph" f_bpara eef2) (efun 47 "Mark Paragraph" f_mrkpara eef2) (efun 48 "Fill Paragraph" f_fillpara eef2) ; 49 reserved ; Buffers (efun 50 "Select Buffer" f_selbuffer eebuff) (efun 51 "Select Existing Buffer" f_selxbuffer eebuff) ; not EMACS (efun 52 "Kill Buffer" f_kbuffer eebuff) (efun 53 "List Buffers" f_listbufs eebuff) (efun 54 "Buffer Not Modified" f_bufnotmod eebuff) (efun 55 "EOL CRLF Mode" f_eolmode eebuff) ; ELLE (efun 56 "Goto Beginning" f_gobeg eebuff) (efun 57 "Goto End" f_goend eebuff) (efun 58 "What Page" f_whatpage eebuff) ; 59 reserved ; Files (efun 60 "Find File" f_ffile eefile) (efun 61 "Read File" f_rfile eefile) (efun 62 "Visit File" f_vfile eefile) (efun 63 "Insert File" f_ifile eefile) (efun 64 "Save File" f_sfile eefile) (efun 65 "Save All Files" f_savefiles eebuff) (efun 66 "Write File" f_wfile eefile) (efun 67 "Write Region" f_wreg eefile) (efun 68 "Write Last Kill" f_wlastkill eefile) ; not EMACS ; 69 reserved ; Windows (efun 70 "Two Windows" f_2winds eebuff) (efun 71 "One Window" f_1wind eebuff) (efun 72 "Other Window" f_othwind eebuff) (efun 73 "Grow Window" f_growind eebuff) (efun 74 "Shrink Window" f_shrinkwind eebuff) ; not EMACS (efun 75 "Delete Window" f_delwind eebuff) ; not EMACS (efun 76 "Standout Window" f_sowind eebuff) ; ELLE (efun 77 "Two Mode Windows" f_2modewinds eebuff) ; ELLE ; Window Positioning (efun 78 "New Window" f_newwin eefd) (efun 79 "Next Screen" f_nscreen eefd) (efun 80 "Previous Screen" f_pscreen eefd) (efun 81 "Other New Screen" f_othnscreen eefd) ; not EMACS (efun 82 "Line to Window Border" f_lwindbord eefd) ; not EMACS (efun 83 "Scroll Window Up" f_scupwind eefd) ; not EMACS (efun 84 "Scroll Window Down" f_scdnwind eefd) ; not EMACS (efun 85 "Move to Window Top" f_mvwtop eefd) ; not EMACS (efun 86 "Move to Window Bottom" f_mvwbot eefd) ; not EMACS ; 87-89 reserved ; Command Input (efun 90 "Set Profile" f_setprof eecmds) ; ELLE (efun 91 "Prefix Meta" f_pfxmeta eecmds) (efun 92 "Prefix Extend" f_pfxext eecmds) (efun 93 "Universal Arg" f_uarg eecmds) (efun 94 "Negative Argument" f_negarg eecmds) (efun 95 "Argument Digit" f_argdig eecmds) (efun 96 "VT100 Button Hack" f_vtbuttons eecmds) ; not EMACS ; Help (efun 97 "Describe" f_describe eehelp) ; 98-99 reserved ; Keyboard Macros (efun 100 "Start Kbd Macro" f_skmac eekmac) (efun 101 "End Kbd Macro" f_ekmac eekmac) (efun 102 "Execute Kbd Macro" f_xkmac eekmac) (efun 103 "View Kbd Macro" f_vkmac eekmac) ; 104 reserved ; Killing (efun 105 "Un-kill" f_unkill eef3) (efun 106 "Un-kill Pop" f_unkpop eef3) (efun 107 "Append Next Kill" f_appnkill eef3) ; 108-109 reserved ; Searching (efun 110 "String Search" f_srch eesrch) (efun 111 "Reverse String Search" f_rsrch eesrch) (efun 112 "Incremental Search" f_isrch eesrch) (efun 113 "Reverse Search" f_risrch eesrch) ; Query Replace & friends (efun 114 "Replace String" f_repstr eequer) (efun 115 "Query Replace" f_querep eequer) (efun 116 "Replace in Line" f_repline eequer) ; not EMACS ; Fill Mode (efun 117 "Set Fill Column" f_sfcol eefill) (efun 118 "Set Fill Prefix" f_sfpref eefill) (efun 119 "Auto Fill Mode" f_fillmode eefill) (efun 120 "Text Mode" f_textmode eefill) ; IMAGEN ; Indentation (efun 121 "Indent According to Mode" f_indatm eef3) (efun 122 "Indent New Line" f_indnl eef3) (efun 123 "Back to Indentation" f_backind eef3) (efun 124 "Indent for Comment" f_indcomm eef3) (efun 125 "Indent Relative" f_indrel eef3) ; 126-128 reserved ; Miscellaneous (efun 129 "Match Bracket" f_matchbrack eef3) ; not EMACS ; Process Control (efun 130 "Push to Inferior" f_pshinf eemain) (efun 131 "Return to Superior" f_retsup eemain) (efun 132 "Write File Exit" f_wfexit eemain) ; not EMACS ; 133-139 reserved ; ELLE Debugging (efun 140 "Hit Breakpoint" f_bkpt eeerr) ; ELLE (efun 141 "Debug Mode" f_debug eediag) ; ELLE ; 142-149 reserved ;--------------------------------------------------------------- ; IMAGEN configuration only (efun 150 "Execute Unix Command" f_xucmd eemake) ; IMAGEN (efun 151 "Execute Make" f_make eemake) ; IMAGEN (efun 152 "Find Next Error" f_nxterr eemake) ; IMAGEN ; ICONOGRAPHICS-specific (efun 153 "ICO Extend Command" f_icoxcmd eefico) ; ICONOGRAPHICS (efun 154 "ICO Typeset Funs" f_icotypfns eefico) ; ICONOGRAPHICS (efun 155 "ICO Spec Input Funs" f_icospifns eefico) ; ICONOGRAPHICS ; SUN Mouse functions (efun 156 "Stuff Selection" f_stuffsel eesun) ; SUN (efun 157 "Select Region" f_selregion eesun) ; SUN =/* This file defines the initial data for ELLE's default user profile. ** It is automatically generated by ELLEC, and should not be edited. */ char charmap[] = { 35, /* ( 0) ^@ Set/Pop Mark */ 20, /* ( 1) ^A Beginning of Line */ 5, /* ( 2) ^B Backward Character */ 0, /* ( 3) ^C unknown function */ 6, /* ( 4) ^D Delete Character */ 21, /* ( 5) ^E End of Line */ 4, /* ( 6) ^F Forward Character */ 0, /* ( 7) ^G unknown function */ 5, /* ( 10) ^H Backward Character */ 121, /* ( 11) ^I Indent According to Mode */ 122, /* ( 12) ^J Indent New Line */ 28, /* ( 13) ^K Kill Line */ 78, /* ( 14) ^L New Window */ 3, /* ( 15) ^M CRLF */ 24, /* ( 16) ^N Down Real Line */ 26, /* ( 17) ^O Open Line */ 25, /* ( 20) ^P Up Real Line */ 2, /* ( 21) ^Q Quoted Insert */ 113, /* ( 22) ^R Reverse Search */ 112, /* ( 23) ^S Incremental Search */ 9, /* ( 24) ^T Transpose Characters */ 93, /* ( 25) ^U Universal Arg */ 79, /* ( 26) ^V Next Screen */ 37, /* ( 27) ^W Kill Region */ 92, /* ( 30) ^X Prefix Extend */ 105, /* ( 31) ^Y Un-kill */ 0, /* ( 32) ^Z unknown function */ 91, /* ( 33) ^[ Prefix Meta */ 141, /* ( 34) ^\ Debug Mode */ 0, /* ( 35) ^] unknown function */ 140, /* ( 36) ^^ Hit Breakpoint */ 97, /* ( 37) ^_ Describe */ 1, /* ( 40) Insert Self */ 1, /* ( 41) ! Insert Self */ 1, /* ( 42) " Insert Self */ 1, /* ( 43) # Insert Self */ 1, /* ( 44) $ Insert Self */ 1, /* ( 45) % Insert Self */ 1, /* ( 46) & Insert Self */ 1, /* ( 47) ' Insert Self */ 1, /* ( 50) ( Insert Self */ 1, /* ( 51) ) Insert Self */ 1, /* ( 52) * Insert Self */ 1, /* ( 53) + Insert Self */ 1, /* ( 54) , Insert Self */ 1, /* ( 55) - Insert Self */ 1, /* ( 56) . Insert Self */ 1, /* ( 57) / Insert Self */ 1, /* ( 60) 0 Insert Self */ 1, /* ( 61) 1 Insert Self */ 1, /* ( 62) 2 Insert Self */ 1, /* ( 63) 3 Insert Self */ 1, /* ( 64) 4 Insert Self */ 1, /* ( 65) 5 Insert Self */ 1, /* ( 66) 6 Insert Self */ 1, /* ( 67) 7 Insert Self */ 1, /* ( 70) 8 Insert Self */ 1, /* ( 71) 9 Insert Self */ 1, /* ( 72) : Insert Self */ 1, /* ( 73) ; Insert Self */ 1, /* ( 74) < Insert Self */ 1, /* ( 75) = Insert Self */ 1, /* ( 76) > Insert Self */ 1, /* ( 77) ? Insert Self */ 1, /* (100) @ Insert Self */ 1, /* (101) A Insert Self */ 1, /* (102) B Insert Self */ 1, /* (103) C Insert Self */ 1, /* (104) D Insert Self */ 1, /* (105) E Insert Self */ 1, /* (106) F Insert Self */ 1, /* (107) G Insert Self */ 1, /* (110) H Insert Self */ 1, /* (111) I Insert Self */ 1, /* (112) J Insert Self */ 1, /* (113) K Insert Self */ 1, /* (114) L Insert Self */ 1, /* (115) M Insert Self */ 1, /* (116) N Insert Self */ 1, /* (117) O Insert Self */ 1, /* (120) P Insert Self */ 1, /* (121) Q Insert Self */ 1, /* (122) R Insert Self */ 1, /* (123) S Insert Self */ 1, /* (124) T Insert Self */ 1, /* (125) U Insert Self */ 1, /* (126) V Insert Self */ 1, /* (127) W Insert Self */ 1, /* (130) X Insert Self */ 1, /* (131) Y Insert Self */ 1, /* (132) Z Insert Self */ 1, /* (133) [ Insert Self */ 1, /* (134) \ Insert Self */ 1, /* (135) ] Insert Self */ 1, /* (136) ^ Insert Self */ 1, /* (137) _ Insert Self */ 1, /* (140) ` Insert Self */ 1, /* (141) a Insert Self */ 1, /* (142) b Insert Self */ 1, /* (143) c Insert Self */ 1, /* (144) d Insert Self */ 1, /* (145) e Insert Self */ 1, /* (146) f Insert Self */ 1, /* (147) g Insert Self */ 1, /* (150) h Insert Self */ 1, /* (151) i Insert Self */ 1, /* (152) j Insert Self */ 1, /* (153) k Insert Self */ 1, /* (154) l Insert Self */ 1, /* (155) m Insert Self */ 1, /* (156) n Insert Self */ 1, /* (157) o Insert Self */ 1, /* (160) p Insert Self */ 1, /* (161) q Insert Self */ 1, /* (162) r Insert Self */ 1, /* (163) s Insert Self */ 1, /* (164) t Insert Self */ 1, /* (165) u Insert Self */ 1, /* (166) v Insert Self */ 1, /* (167) w Insert Self */ 1, /* (170) x Insert Self */ 1, /* (171) y Insert Self */ 1, /* (172) z Insert Self */ 1, /* (173) { Insert Self */ 1, /* (174) | Insert Self */ 1, /* (175) } Insert Self */ 1, /* (176) ~ Insert Self */ 7, /* (177) DEL Backward Delete Character */ }; char metamap[] = { 02 , 86, /* M-^B Move to Window Bottom */ 014 , 30, /* M-^L Goto Line */ 016 , 84, /* M-^N Scroll Window Down */ 020 , 83, /* M-^P Scroll Window Up */ 022 ,111, /* M-^R Reverse String Search */ 023 ,110, /* M-^S String Search */ 024 , 85, /* M-^T Move to Window Top */ 027 ,107, /* M-^W Append Next Kill */ 030 , 51, /* M-^X Select Existing Buffer */ 036 , 74, /* M-^^ Shrink Window */ 045 ,115, /* M-% Query Replace */ 055 , 94, /* M-- Negative Argument */ 060 , 95, /* M-0 Argument Digit */ 061 , 95, /* M-1 Argument Digit */ 062 , 95, /* M-2 Argument Digit */ 063 , 95, /* M-3 Argument Digit */ 064 , 95, /* M-4 Argument Digit */ 065 , 95, /* M-5 Argument Digit */ 066 , 95, /* M-6 Argument Digit */ 067 , 95, /* M-7 Argument Digit */ 070 , 95, /* M-8 Argument Digit */ 071 , 95, /* M-9 Argument Digit */ 073 ,124, /* M-; Indent for Comment */ 074 , 56, /* M-< Goto Beginning */ 076 , 57, /* M-> Goto End */ 0133, 46, /* M-[ Backward Paragraph */ 0134, 8, /* M-\ Delete Horizontal Space */ 0135, 45, /* M-] Forward Paragraph */ 0102, 11, /* M-B Backward Word */ 0103, 17, /* M-C Uppercase Initial */ 0104, 12, /* M-D Kill Word */ 0106, 10, /* M-F Forward Word */ 0107, 41, /* M-G Fill Region */ 0110, 47, /* M-H Mark Paragraph */ 0111,125, /* M-I Indent Relative */ 0114, 16, /* M-L Lowercase Word */ 0115,123, /* M-M Back to Indentation */ 0116, 22, /* M-N Next Line */ 0117, 96, /* M-O VT100 Button Hack */ 0120, 23, /* M-P Previous Line */ 0121, 48, /* M-Q Fill Paragraph */ 0124, 14, /* M-T Transpose Words */ 0125, 15, /* M-U Uppercase Word */ 0126, 80, /* M-V Previous Screen */ 0127, 38, /* M-W Copy Region */ 0131,106, /* M-Y Un-kill Pop */ 0176, 54, /* M-~ Buffer Not Modified */ 0177, 13, /* M-DEL Backward Kill Word */ }; char extmap[] = { 02 , 53, /* X-^B List Buffers */ 03 ,132, /* X-^C Write File Exit */ 05 , 67, /* X-^E Write Region */ 06 , 60, /* X-^F Find File */ 013 , 68, /* X-^K Write Last Kill */ 014 , 40, /* X-^L Lowercase Region */ 015 , 55, /* X-^M EOL CRLF Mode */ 017 , 27, /* X-^O Delete Blank Lines */ 020 , 90, /* X-^P Set Profile */ 022 , 61, /* X-^R Read File */ 023 , 64, /* X-^S Save File */ 025 , 39, /* X-^U Uppercase Region */ 026 , 62, /* X-^V Visit File */ 027 , 66, /* X-^W Write File */ 030 , 36, /* X-^X Exchange Point and Mark */ 032 ,131, /* X-^Z Return to Superior */ 041 ,130, /* X-! Push to Inferior */ 044 ,116, /* X-$ Replace in Line */ 045 ,114, /* X-% Replace String */ 050 ,100, /* X-( Start Kbd Macro */ 051 ,101, /* X-) End Kbd Macro */ 052 ,103, /* X-* View Kbd Macro */ 056 ,118, /* X-. Set Fill Prefix */ 060 , 75, /* X-0 Delete Window */ 061 , 71, /* X-1 One Window */ 062 , 70, /* X-2 Two Windows */ 070 , 76, /* X-8 Standout Window */ 071 , 77, /* X-9 Two Mode Windows */ 075 , 58, /* X-= What Page */ 0136, 73, /* X-^ Grow Window */ 0102, 50, /* X-B Select Buffer */ 0105,102, /* X-E Execute Kbd Macro */ 0106,117, /* X-F Set Fill Column */ 0111, 63, /* X-I Insert File */ 0113, 52, /* X-K Kill Buffer */ 0117, 72, /* X-O Other Window */ 0123, 65, /* X-S Save All Files */ 0124,119, /* X-T Auto Fill Mode */ 0177, 29, /* X-DEL Backward Kill Line */ }; struct profile def_prof = { 1, /* Ver */ sizeof(charmap), charmap, sizeof(metamap)/2, metamap, sizeof(extmap)/2, extmap, 0, 0 }; >;;; ;;; ELLE Default Command Profile - "defprf.e" ;;; ;;; This file is input to the ellec program. It defines the default ;;; command key bindings that ELLE uses, in the absence of an individual ;;; user profile. ;;; These defaults attempt to emulate the default EMACS command key ;;; bindings. Differences, where known, are commented. ;;; ;;; "ELLE" means the function is unique to ELLE. ;;; E/G: (cmd altnam) "thisname"; ;;; "E:" refers to TOPS-20 EMACS, "G:" refers to Gnu Emacs. ;;; (cmd) This function exists but is bound to "cmd" instead. ;;; (*) function exists but is not bound to any specific key. ;;; () function does not exist. ;;; (=) function exists, with same binding (normally omitted) ;;; altnam Name by which this function is known. ;;; "thisname" - name of function bound to this command. ;;; - means the command is unbound (undefined). (keyallunbind) ; Flush any predefined bindings (keybind ^@ "Set/Pop Mark") (keybind ^A "Beginning of Line") (keybind ^B "Backward Character") ; ^C not bound. ; E: ()- G: mode-specific-command-prefix (keybind ^D "Delete Character") (keybind ^E "End of Line") (keybind ^F "Forward Character") (keybind ^H "Backward Character") ; G: (^B) help-command (keybind ^I "Indent According to Mode") (keybind ^J "Indent New Line") (keybind ^K "Kill Line") (keybind ^L "New Window") (keybind ^M "CRLF") (keybind ^N "Down Real Line") (keybind ^O "Open Line") (keybind ^P "Up Real Line") (keybind ^Q "Quoted Insert") (keybind ^R "Reverse Search") (keybind ^S "Incremental Search") (keybind ^T "Transpose Characters") (keybind ^U "Universal Arg") (keybind ^V "Next Screen") (keybind ^W "Kill Region") (keybind ^X "Prefix Extend") (keybind ^Y "Un-kill") ; ^Z not bound ; E: Prefix Control-Meta; G: suspend-emacs (keybind ^[ "Prefix Meta") (keybind "^\" "Debug Mode") ; ELLE. E: () Prefix Meta; G: () - ; ^] not bound. ; E+G: Abort Recursive Edit (keybind ^^ "Hit Breakpoint") ; ELLE. E: () Prefix Control; G: () - (keybind ^_ "Describe") ; E: (M-?) Help; G: (^H-k) undo (keybind " " "Insert Self") (keybind ! "Insert Self") (keybind """" "Insert Self") (keybind # "Insert Self") (keybind $ "Insert Self") (keybind % "Insert Self") (keybind & "Insert Self") (keybind ' "Insert Self") (keybind "(" "Insert Self") (keybind ")" "Insert Self") (keybind * "Insert Self") (keybind + "Insert Self") (keybind , "Insert Self") (keybind - "Insert Self") (keybind . "Insert Self") (keybind / "Insert Self") (keybind 0 "Insert Self") (keybind 1 "Insert Self") (keybind 2 "Insert Self") (keybind 3 "Insert Self") (keybind 4 "Insert Self") (keybind 5 "Insert Self") (keybind 6 "Insert Self") (keybind 7 "Insert Self") (keybind 8 "Insert Self") (keybind 9 "Insert Self") (keybind : "Insert Self") (keybind ";" "Insert Self") (keybind < "Insert Self") (keybind = "Insert Self") (keybind > "Insert Self") (keybind ? "Insert Self") (keybind @ "Insert Self") (keybind A "Insert Self") (keybind B "Insert Self") (keybind C "Insert Self") (keybind D "Insert Self") (keybind E "Insert Self") (keybind F "Insert Self") (keybind G "Insert Self") (keybind H "Insert Self") (keybind I "Insert Self") (keybind J "Insert Self") (keybind K "Insert Self") (keybind L "Insert Self") (keybind M "Insert Self") (keybind N "Insert Self") (keybind O "Insert Self") (keybind P "Insert Self") (keybind Q "Insert Self") (keybind R "Insert Self") (keybind S "Insert Self") (keybind T "Insert Self") (keybind U "Insert Self") (keybind V "Insert Self") (keybind W "Insert Self") (keybind X "Insert Self") (keybind Y "Insert Self") (keybind Z "Insert Self") (keybind [ "Insert Self") (keybind "\" "Insert Self") (keybind ] "Insert Self") (keybind ^ "Insert Self") (keybind _ "Insert Self") (keybind ` "Insert Self") (keybind a "Insert Self") (keybind b "Insert Self") (keybind c "Insert Self") (keybind d "Insert Self") (keybind e "Insert Self") (keybind f "Insert Self") (keybind g "Insert Self") (keybind h "Insert Self") (keybind i "Insert Self") (keybind j "Insert Self") (keybind k "Insert Self") (keybind l "Insert Self") (keybind m "Insert Self") (keybind n "Insert Self") (keybind o "Insert Self") (keybind p "Insert Self") (keybind q "Insert Self") (keybind r "Insert Self") (keybind s "Insert Self") (keybind t "Insert Self") (keybind u "Insert Self") (keybind v "Insert Self") (keybind w "Insert Self") (keybind x "Insert Self") (keybind y "Insert Self") (keybind z "Insert Self") (keybind { "Insert Self") (keybind | "Insert Self") (keybind } "Insert Self") (keybind ~ "Insert Self") (keybind DEL "Backward Delete Character") ; Meta chars (keybind M-^B "Move to Window Bottom") ; ELLE (ima). E+G:()- (keybind M-^L "Goto Line") ; E:(); G:(* goto-line) - (keybind M-^N "Scroll Window Down") ; ELLE (ima). E+G:()- forward-list (keybind M-^P "Scroll Window Up") ; ELLE (ima). E+G:()- backward-list (keybind M-^R "Reverse String Search") ; E:(*); G:(* search-backward) - (keybind M-^S "String Search") ; E:(*); G:(* search-forward) isearch-forward-regexp (keybind M-^T "Move to Window Top") ; ELLE (ima). E+G:()- (keybind M-^W "Append Next Kill") (keybind M-^X "Select Existing Buffer") ; ELLE (ima). E+G:()- (keybind M-^^ "Shrink Window") ; ELLE (ima). E+G:()- (keybind M-% "Query Replace") (keybind M-- "Negative Argument") (keybind M-0 "Argument Digit") (keybind M-1 "Argument Digit") (keybind M-2 "Argument Digit") (keybind M-3 "Argument Digit") (keybind M-4 "Argument Digit") (keybind M-5 "Argument Digit") (keybind M-6 "Argument Digit") (keybind M-7 "Argument Digit") (keybind M-8 "Argument Digit") (keybind M-9 "Argument Digit") (keybind "M-;" "Indent for Comment") (keybind M-< "Goto Beginning") (keybind M-> "Goto End") (keybind M-[ "Backward Paragraph") (keybind "M-\" "Delete Horizontal Space") (keybind M-] "Forward Paragraph") (keybind M-B "Backward Word") (keybind M-C "Uppercase Initial") (keybind M-D "Kill Word") (keybind M-F "Forward Word") (keybind M-G "Fill Region") (keybind M-H "Mark Paragraph") (keybind M-I "Indent Relative") ; E+G: (*) Tab to Tab Stop (keybind M-L "Lowercase Word") (keybind M-M "Back to Indentation") (keybind M-N "Next Line") ; E:(*); G:(* forward-line) - (keybind M-O "VT100 button hack") ; ELLE. E+G: () - (keybind M-P "Previous Line") ; E:(*); G:() - (keybind M-Q "Fill Paragraph") (keybind M-T "Transpose Words") (keybind M-U "Uppercase Word") (keybind M-V "Previous Screen") (keybind M-W "Copy Region") (keybind M-Y "Un-kill Pop") (keybind M-~ "Buffer Not Modified") (keybind M-DEL "Backward Kill Word") ; Extended commands (keybind X-^B "List Buffers") (keybind X-^C "Write File Exit") ; ELLE (ima). E:()-; G: (= save-buffers-kill-emacs) (keybind X-^E "Write Region") ; E:(*)-; G:(*) eval-last-sexp (keybind X-^F "Find File") (keybind X-^K "Write Last Kill") ; ELLE (mnx). E+G:()- (keybind X-^L "Lowercase Region") (keybind X-^M "EOL CRLF Mode") ; ELLE. E+G: ()- (keybind X-^O "Delete Blank Lines") (keybind X-^P "Set Profile") ; ELLE. E+G: () Mark Page (keybind X-^R "Read File") (keybind X-^S "Save File") (keybind X-^U "Uppercase Region") (keybind X-^V "Visit File") (keybind X-^W "Write File") (keybind X-^X "Exchange Point and Mark") (keybind X-^Z "Return to Superior") ; G:() suspend-emacs (keybind X-! "Push to Inferior") ; ELLE. E:(*)-; G:()- (keybind X-$ "Replace in Line") ; ELLE (mnx). E+G:()- (keybind X-% "Replace String") ; E+G: (*) - (keybind "X-(" "Start Kbd Macro") (keybind "X-)" "End Kbd Macro") (keybind X-* "View Kbd Macro") ; E: (*)-; G: ()- (keybind X-. "Set Fill Prefix") (keybind X-0 "Delete Window") ; E: ()- (keybind X-1 "One Window") (keybind X-2 "Two Windows") (keybind X-8 "Standout Window") ; ELLE. E+G:()- (keybind X-9 "Two Mode Windows") ; ELLE. E+G:()- (keybind X-= "What Page") ; E+G: (*) What Cursor Position (keybind X-^ "Grow Window") (keybind X-B "Select Buffer") (keybind X-E "Execute Kbd Macro") (keybind X-F "Set Fill Column") (keybind X-I "Insert File") ; E: (*) Info (keybind X-K "Kill Buffer") (keybind X-O "Other Window") (keybind X-S "Save All Files") ; E:(*)-; G:(= save-some-buffers) (keybind X-T "Auto Fill Mode") ; E:(*) Transpose Regions; G:(*)- (keybind X-DEL "Backward Kill Line") ; ELLE(ico) E+G:() Back>>ward Kill Sentence ; IMAGEN-specific functions, not bound. ;(keybind "" "Text Mode") ; IMAGEN E:(*); G:(*) ;(keybind "" "Execute Unix Command") ; IMAGEN E:(); G:(M-! shell-command) ;(keybind "" "Execute Make") ; IMAGEN E:(* Compile); G:(* compile) ;(keybind "" "Find Next Error") ; IMAGEN E:(); G:(X-` next-error) ; SUN Mouse functions, for menuitem selection. ;(menuitem "Stuff Selection") ; SUN ;(menuitem "Select Region") ; SUN ; Forget completely about these. ;(keybind "" "ICO Extend Command") ; ICONOGRAPHICS ;(keybind "" "ICO Typeset Funs") ; ICONOGRAPHICS ;(keybind "" "ICO Spec Input Funs") ; ICONOGRAPHICS /* ELLE - Copyright 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEBIT Bit Array functions */ #include "sb.h" /* Char-bit array functions. All assume that there are at least 8 bits * in a byte, and that the number of bytes per word is a power of 2. */ /* CHBBITS represents log 2 of the # of bits stored per chbit-array word. * WDBITS already has log2 of the # of bytes per word, and we are * assuming each byte has at least 8 bits, so log2(8) = 3. */ #define CHBSIZE (WDSIZE*8) /* # bits per word */ #define CHBBITS (WDBITS+3) /* log2(CHBSIZE) */ #define CHBMASK (CHBSIZE-1) #define CHBARYSIZ (128/CHBSIZE) /* # words per ASCII array */ /* CHBALLOC(size) - Allocates a char-bit array */ int * chballoc(size) int size; { return((int *)calloc((size + CHBSIZE-1)/CHBSIZE, (sizeof(int)))); } /* CHBIT(array, char) - Tests bit in char-bit array */ chbit(array,c) register int *array, c; { return(array[c >> CHBBITS] & (1 << (c & CHBMASK))); } /* CHBIS (array, char) - Sets bit in char-bit array */ chbis(array,c) register int *array, c; { array[c >> CHBBITS] |= (1 << (c & CHBMASK)); } /* CHBIC (array, char) - Clears bit in char-bit array */ chbic(array,c) register int *array, c; { array[c >> CHBBITS] &= ~(1 << (c & CHBMASK)); } /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEBUFF Buffer and Window functions. * Each buffer is an independent SB-string described by a * buffer structure. All buffer structures are allocated dynamically * and chained together starting from buf_head. */ #include "elle.h" #if FX_FILLMODE extern int fill_mode; #endif #if FX_SKMAC extern int kdef_mode; #endif struct buffer *make_buf(), *find_buf(), *sel_mbuf(), *sel_nbuf(); struct window *make_win(); /* EFUN: "Select Buffer" */ /* Select old buffer or create a new one. Defaults to previously * used buffer. */ f_selbuffer() { register char *ans; register struct buffer *b; if((b = last_buf) == cur_buf) /* If default same as current, */ if(!(b = sel_mbuf(b))) /* try to pick a more useful one. */ b = sel_nbuf(cur_buf); ans = ask("Select buffer (%s): ",b->b_name); if (ans == 0) /* he aborted */ return; if (*ans != '\0') /* Null string => use last buff */ { b = find_buf (ans); /* Else find/create one */ if (b == 0) b = make_buf (ans); } sel_buf(b); chkfree(ans); } #if FX_SELXBUFFER /* EFUN: "Select Existing Buffer" (not EMACS) - from IMAGEN config */ static int findstr(); f_selxbuffer() { register char *ans; register struct buffer *b; b = last_buf; /* This is default */ ans = ask("Select existing buffer (%s): ", b->b_name); if (ans == 0) /* Aborted */ return; if (*ans != 0) { for (b = buf_head; b != 0; b = b->b_next) if (findstr(ans, b->b_name)) break; if (b == 0) ding("That isn't a substring of any buffer name!"); } chkfree(ans); if (b != 0) { saytoo(" => "); sayntoo(b->b_name); sel_buf(b); } } static int findstr(str, instr) /* Find "str" in string "instr" */ register char *str, *instr; { register char *sp, *isp; while (*instr) { sp = str; isp = instr; while (*sp) if (*sp++ != *isp++) goto next; return(1); next: ++instr; } return(0); } #endif /*FX_SELXBUFFER*/ /* EFUN: "Kill Buffer" */ /* Kill specified buffer - defaults to current buffer. * This code assumes a killed buffer will never be on a window list unless it * is pointed to by cur_buf or oth_win->w_buf!!!! */ f_kbuffer() { register struct buffer *b, *ob; register char *ans; if((ans = ask("Kill buffer: ")) == 0) return; if(*ans == 0) b = cur_buf; else if(*ans == SP) b = 0; else b = find_buf(ans); chkfree(ans); if(!b) { ding("No such buffer"); return; } #if IMAGEN if (b->b_flags & B_PERMANENT) { ding("Permanent buffer--cannot kill!"); return; } if (b->b_flags & B_MODIFIED) { if ((ans == ask("Buffer is modified; are you sure? ")) == 0) return; if(upcase(*ans) != 'Y') { chkfree(ans); return; } chkfree(ans); } #endif /*IMAGEN*/ if(b == cur_buf || (oth_win && (oth_win->w_buf == b))) { ob = last_buf; do { /* If default same as doomed buffer, try to pick * a more useful alternative. */ if((b == ob) && !(ob = sel_mbuf(b))) ob = sel_nbuf(b); ans = ask("Killing in-use buffer; select which other buffer (%s): ", ob->b_name); if(ans == 0) return; if(*ans) { if(*ans == SP) ob = 0; else ob = find_buf(ans); } chkfree(ans); if(!ob) { ding("No such buffer"); return; } } while (b == ob); /* B is buffer to kill, OB is buffer to replace it with */ if(oth_win && (oth_win->w_buf == b)) { f_othwind(); /* Select other one */ chg_buf(ob); /* Change to new buffer */ f_othwind(); } if(cur_buf == b) chg_buf(ob); } kill_buf(b); /* Die!!!! */ if(last_buf == b) last_buf = cur_buf; } /* EFUN: "List Buffers" */ /* Display a list of all user buffers. Internal buffers, whose names * start with a space, are not shown. */ f_listbufs() { register struct buffer *b; register char *cp; register int i; struct buffer *tbuf, *savbuf; char temp[20]; /* First must set up special buffer... */ savbuf = cur_buf; chg_buf(tbuf = make_buf(" **SHOW**")); e_sputz("Buffers in this ELLE:\n\n"); for(b = buf_head; b; b = b->b_next) { cp = b->b_name; if(*cp == SP) continue; /* Ignore internal buffs */ e_sputz((b->b_flags&B_MODIFIED) ? "* " : " "); e_sputz(cp); /* Insert buffer name */ dottoa(temp,ex_blen(b)); /* Get buff-length string */ if((i = ((FNAMELEN > 14) ? 30 : 20) - strlen(cp) - strlen(temp)) > 0) e_insn(SP, i); e_sputz(" ("); e_sputz(temp); e_sputz(") "); if(cp = b->b_fn) e_sputz(cp); #if IMAGEN if (b->b_flags & B_CMODE) e_sputz(" (C)"); else if (b->b_flags & B_TEXTMODE) e_sputz(" (Text)"); else e_sputz(" (Fundamental)"); #endif /*IMAGEN*/ e_putc(LF); } mk_showin(tbuf); /* Show this buffer in temp window */ chg_buf(savbuf); /* Return to real current buffer */ kill_buf(tbuf); } /* EFUN: "Buffer Not Modified" */ /* Mark the current buffer as not modified. */ f_bufnotmod() { cur_buf -> b_flags &= ~B_MODIFIED; redp(RD_MODE); } #if FX_EOLMODE /* EFUN: "EOL CRLF Mode" (not EMACS) */ /* Toggle the EOL mode of the current buffer. ** LF EOL Mode means LF alone is an EOL. ** CRLF EOL Mode means CRLF together is an EOL. */ f_eolmode() { cur_buf->b_flags ^= B_EOLCRLF; /* Flip this bit */ say((cur_buf->b_flags & B_EOLCRLF) ? "EOL Mode is CRLF" /* If now on */ : "EOL Mode is LF"); /* If now off */ redp(RD_WINRES); /* Redo window for this buf */ } #endif /*FX_EOLMODE*/ #if FX_GOBEG /* EFUN: "Goto Beginning" */ f_gobeg() { e_gobob(); ed_setcur(); } #endif /*FX_GOBEG*/ #if FX_GOEND /* EFUN: "Goto End" */ f_goend() { e_goeob(); ed_setcur(); } #endif /*FX_GOEND*/ #if FX_WHATPAGE /* EFUN: "What Page" */ /* Extra info added as per earlier ICONOGRAPHICS "What Buffer Position" ** Reports on current position as follows: ** Dot=, Page Line (line of ) */ f_whatpage() { register chroff cnt; register int c; register int page, line; int lineatp; char tempstr[12], *dottoa (); saynow("Dot="); dottoa(tempstr, cur_dot); sayntoo(tempstr); e_gobob(); page = line = lineatp = 1; for (cnt = cur_dot; --cnt >= 0;) if ((c = e_getc()) == LF) ++line; else if (c == FF) { ++page; lineatp = line; } saytoo(", Page "); dottoa(tempstr, (chroff)page); saytoo(tempstr); saytoo(" Line "); dottoa(tempstr, (chroff)(1 + line - lineatp)); saytoo(tempstr); saytoo(" Col "); dottoa(tempstr, (chroff)indtion(cur_dot)); saytoo(tempstr); saytoo(" [line "); dottoa(tempstr, (chroff)line); saytoo(tempstr); sayntoo(" of "); /* Force out while scan rest */ for(e_gocur(); e_gonl() ; ++line) ; /* Count lines until EOF */ c = e_rgetc(); /* Remember what last char is */ dottoa(tempstr, (chroff)line); saytoo(tempstr); if (c != LF) /* Check last char */ saytoo(" (no EOL at EOF!)"); sayntoo("]"); e_gocur(); /* Back to original position */ } #endif /*FX_WHATPAGE*/ init_buf () /* init buffer stuff */ { buf_head = 0; lines_buf = cur_buf = make_buf(" **LINES**"); /* For sep_win */ e_insn('-',scr_wid-2); /* Fill with dashes */ last_buf = cur_buf = make_buf ("Main"); /* Make Main buffer */ init_win(); /* Now can init windows */ } struct buffer * make_buf(bname) /* create buffer "bname" if it doesn't exist */ char *bname; { register struct buffer *b; register char *name; b = find_buf(name = bname); if (b) /* if it exists already */ return(b); b = (struct buffer *) memalloc(sizeof (struct buffer)); b -> b_next = buf_head; /* link it in */ buf_head = b; b->b_name = strdup(name); /* Allocate copy of name string */ b->b_dot = 0; /* Set dot to beg */ sb_open(b,(SBSTR *)0); /* Open buffer with null initial sbstring */ b->b_fn = 0; b->b_flags = 0; b->b_mode = cur_mode; /* Inherit current mode */ return(b); } struct buffer * find_buf(name) /* returns pointer to buffer of that name or 0 */ char *name; { register struct buffer *b = bu>>>> >!>">#>$>%>&>'>(>)>*>+>,>->.>f_head; while (b && strcmp(b->b_name, name)) b = b -> b_next; return(b); } sel_buf(b) /* select buffer, saving last */ struct buffer *b; { if(b != cur_buf) last_buf = cur_buf; chg_buf(b); } chg_buf (newbuf) /* change current buffer to newbuf */ struct buffer *newbuf; { register struct buffer *obuf, *nbuf; if ((nbuf = newbuf) == (obuf = cur_buf)) return; /* Do nothing if same buffers */ obuf->b_dot = cur_dot; cur_buf = nbuf; cur_mode = nbuf->b_mode; e_gosetcur(nbuf->b_dot); /* Set cur_dot and go there */ cur_win->w_buf = nbuf; cur_win->w_dot = cur_dot; #if IMAGEN cur_win->w_redp = RD_WINRES|RD_REDO; #else cur_win->w_redp = RD_WINRES; /* Reset flags - do complete update */ #endif /*-IMAGEN*/ unlk_buf(obuf); /* Unlock previous buffer if can */ mark_p = 0; /* this is lazy */ redp(RD_MODE|RD_WINRES); } /* See if specified buffer belongs to any active window, and * if not then get it into an idle, unlocked state; this helps the * edit package compact and swap stuff out while it's not being used. * Assumes proper state of dot has been stored into b_dot. */ unlk_buf(bufp) struct buffer *bufp; { register struct buffer *b; register struct window *w; b = bufp; for(w = win_head; w; w = w->w_next) if(b == w->w_buf) return; /* Buffer is actively being shown */ sb_rewind((SBBUF *)b); /* Return to idle state */ } /* SEL_NBUF(buf) - Select next user buffer. Ignores internal buffers. * Arg of 0 starts at beg of buffer list. Always returns * a buffer pointer - returns argument (which may be 0) * if found no other user buffers. * * SEL_MBUF(buf) - Select next modified buffer. * Returns buffer ptr to "next" modified buffer, if any. * Arg of 0 starts at beg of buffer list and scans all of them. * Returns 0 if no other modified buffers exist (unlike SEL_NBUF!) * Ignores internal buffers, whose names start with a space. */ /* struct buffer *buf_mptr; */ #if 0 struct buffer * sel_mbuf(buf) struct buffer *buf; { register struct buffer *b; register int sweep; sweep = 0; /* Make 2 sweeps only */ if(b = buf) b = b->b_next; do { if(b == 0) /* Initialize if needed */ b = buf_head; for(; b; b = b->b_next) if((b->b_flags & B_MODIFIED) && (*b->b_name != SP)) return((b == buf) ? 0 : b); } while(sweep++ != 0); return(0); } #endif /*COMMENT*/ struct buffer * sel_mbuf(buf) register struct buffer *buf; { register struct buffer *b, *b2; b = b2 = sel_nbuf(buf); do { if(b == buf) break; if(b->b_flags & B_MODIFIED) return(b); } while((b = sel_nbuf(b)) != b2); return(0); } struct buffer * sel_nbuf(buf) register struct buffer *buf; { register struct buffer *b; b = buf; do { if(!b || !(b = b->b_next)) b = buf_head; if(*b->b_name != SP) break; } while (b != buf); return(b); } kill_buf(buf) struct buffer *buf; { register struct buffer *b, *b1, *bt; b = buf; b1 = 0; for(bt = buf_head; bt && bt != b; bt = bt -> b_next) b1 = bt; if(bt == 0) { ring_bell(); errbarf("No such buffer"); /* Internal error */ return; } if (b1 == 0) buf_head = b->b_next; else b1->b_next = b->b_next; sbs_del(sb_close((SBBUF *)b)); /* Close buffer & delete sbstring */ sb_fdcls(-1); /* Make sweep for unused FD's */ if(b->b_fn) chkfree(b->b_fn); /* Flush filename if one */ chkfree(b->b_name); /* Flush name */ chkfree((char *)b); /* Flush buffer */ } /* ZAP_BUFFER - Delete all of the buffer, but if it's been modified, * ask first. Returns 0 if user aborts. */ zap_buffer() { #if IMAGEN extern struct buffer *exec_buf; /* in e_make.c */ if(cur_buf != exec_buf && cur_buf -> b_flags & B_MODIFIED) #else if(cur_buf -> b_flags & B_MODIFIED) #endif /*-IMAGEN*/ if(ask_kbuf(cur_buf) <= 0) return(0); /* Aborted */ ed_reset(); /* This takes care of redisplay too */ mark_p = 0; #if IMAGEN cur_buf->b_flags &= ~B_BACKEDUP; /* Clear backed-up flag */ #endif return(1); } /* ASK_KBUF - Ask user "are you sure?" before killing a buffer. * Returns +1 if user says "yes" - OK to kill. * 0 if user aborts (^G) * -1 if user says "no". */ ask_kbuf(buf) struct buffer *buf; { register struct buffer *b; register char *s; register int ans; b = buf; s = ask("Buffer %s contains changes - forget them? ", b->b_name); if(s == 0) return(0); ans = (upcase(*s) == 'Y') ? 1 : -1; chkfree(s); return(ans); } /* Window stuff */ /* Like EMACS, ELLE only provides at most two user windows. * The current user window is pointed to by user_win; * the "other" one is oth_win. If oth_win == 0, there is only one user * window. */ #if FX_2MODEWINDS int sepmode_p = 0; /* Set true if separator window is a 2nd mode win */ #endif /* EFUN: "Two Windows" */ /* Divide the current window in half, put the current buffer in the * other window, and go to the new window. */ f_2winds() { register int h, t; register struct window *w; if (oth_win) { #if !(IMAGEN) ding("Already 2 windows"); #endif /*-IMAGEN*/ return; } w = cur_win; d_fixcur(); /* Stabilize current window */ h = (w->w_ht) / 2; t = w->w_pos + h; /* Pos of dividing window */ sep_win = make_win(t, 1, lines_buf); /* assume using dashes to separate */ oth_win = make_win(t + 1, w->w_ht - (h + 1), cur_buf); /* Other window has balance */ #if FX_SOWIND oth_win->w_flags |= cur_win->w_flags&W_STANDOUT; sep_win->w_flags |= mode_win->w_flags&W_STANDOUT; #endif #if FX_2MODEWINDS chk2modws(); /* Update 2-mode-wind status */ #endif w->w_ht = h; /* Decrease current window to half */ /* Minimize redisplay by moving each window's dot into * a currently displayed area */ if(cur_dot < (oth_win->w_topldot = scr[t+1]->sl_boff)) oth_win->w_dot = oth_win->w_topldot; /* Adj bottom win */ else /* Adjust top window */ { oth_win->w_dot = cur_dot; /* Bottom keeps dot */ cur_dot = scr[t-1]->sl_boff; /* but top needs new one. */ } f_othwind(); /* switch to other window */ redp(RD_WINDS); /* Update all windows */ } /* EFUN: "One Window" */ /* Revert to using only one window; use the current buffer (unlike * EMACS which always selects the top window's buffer) * Ensures that current window's vars are correctly set for * new dimensions (w_pos, w_ht, plus w_topldot to minimize redisplay), * then kills unneeded windows. */ f_1wind() { register struct window *w; if (oth_win == 0) { #if (!IMAGEN) ding("Only 1 window"); #endif /*-IMAGEN*/ return; } w = cur_win; if(w->w_pos) /* If not top window */ { d_fixcur(); /* Ensure screen-line data correct */ e_go(w->w_topldot); /* Beginning from top of window, */ d_fgoloff(-w->w_pos); /* Move back enough lines */ w->w_topldot = e_dot(); /* To set new start of window */ e_gocur(); /* Then move back to orig place */ w->w_pos = 0; } w->w_ht += oth_win -> w_ht + 1; kill_win (oth_win); kill_win (sep_win); oth_win = sep_win = 0; #if FX_2MODEWINDS chk2modws(); /* Update notion of whether have 2 mode winds */ #endif redp(RD_FIXWIN|RD_WINDS|RD_MODE); /* New topldot for this window, * and check all remaining windows */ } /* EFUN: "Other Window" */ /* Move to the "other" user window. */ f_othwind () { if (oth_win == 0) { #if !(IMAGEN) ding("Only 1 window"); #endif /*-IMAGEN*/ return; } chg_win(oth_win); oth_win = user_win; user_win = cur_win; redp(RD_MODE); } /* EFUN: "Grow Window" */ /* Grow the current window - while in two window mode, * increase the size of the current window by the arg * and decrease the other accordingly */ f_growind() { register struct window *cw, *ow; register int e; if ((ow = oth_win) == 0) { #if !(IMAGEN) ding("Only 1 window"); #endif /*-IMAGEN*/ return; } e = exp; if((cw = cur_win)->w_pos != 0) /* If current window is on bottom */ { cw = ow; /* Then fake code to think it's top */ ow = cur_win; e = -e; } if( cw->w_ht + e < 1 || ow->w_ht + e < 1) { ding("Too much"); return; } cw -> w_ht += e; ow -> w_pos += e; ow -> w_ht -= e; sep_win -> w_pos += e; redp(RD_WINDS | RD_MODE); /* Update all windows */ } #if FX_SHRINKWIND /* EFUN: "Shrink Window" (not EMACS) - from IMAGEN config */ f_shrinkwind() { if (! oth_win) return; f_othwind(); f_growind(); f_othwind(); } #endif /*FX_SHRINKWIND*/ #if FX_DELWIND /* EFUN: "Delete Window" (not EMACS) - from IMAGEN config */ f_delwind() { if(!oth_win) return; f_othwind(); f_1wind(); } #endif /*FX_DELWIND*/ #if FX_SOWIND /* EFUN: "Standout Window" (not EMACS) */ /* Toggles the display standout mode for the current window. ** With argument of 4, toggles the standout mode for the non-buffer ** parts of the screen, such as the ELLE mode line. ** (This corresponds to FS INVMOD$ in EMACS) ** With argument of 0, turns standout mode off for all windows. */ /* It suffices to set the window flag bit and force a RD_WINRES for that * window; the redisplay code will do the rest. */ static void tgso_wind(); f_sowind() { register struct window *w; switch(exp) { default: /* Toggle current window */ tgso_wind(cur_win); break; case 4: /* Toggle mode & separator windows */ tgso_wind(mode_win); tgso_wind(sep_win); /* This may not exist */ break; case 0: /* Turn off standout for all winds */ for(w = win_head; w; w = w->w_next) if(w->w_flags&W_STANDOUT) tgso_wind(w); } #if FX_2MODEWINDS chk2modws(); /* Update notion of whether have 2 mode winds */ #endif } static void tgso_wind(w) /* Toggle standout mode for given window */ register struct window *w; { if (w == 0) return; /* For case of no sep_win */ if (w->w_flags & W_STANDOUT) w->w_flags &= ~W_STANDOUT; else w->w_flags |= W_STANDOUT; w->w_redp |= RD_WINRES; /* Re-do this particular window */ redp(RD_CHKALL); /* Check all windows for changes */ } #endif /*FX_SOWIND*/ #if FX_2MODEWINDS /* EFUN: "Two Mode Windows" (not EMACS) */ /* With arg, sets ev_2modws to that value (0, 1, or 2). ** No arg, toggles current setting between 0 and 2. */ f_2modewinds() { ev_2modws = exp_p ? exp : (ev_2modws ? 0 : 2); chk2modws(); } /* CHK2MODWS - Called after anything changes which might affect ** whether 2 mode windows are in effect or not. Fixes up ** sep_win to either be or not be a mode window. */ chk2modws() { register struct window *w; static struct buffer *sep_buf = 0; if(!(w = sep_win)) { sepmode_p = 0; /* Don't have 2 windows at all */ return; } sepmode_p = (ev_2modws == 1) ? (mode_win->w_flags&W_STANDOUT) : ev_2modws; if(sepmode_p) /* Turn 2-mode-winds on? */ { if(!sep_buf) sep_buf = make_buf(" **SEPMODE**"); w->w_buf = sep_buf; w->w_flags |= W_MODE; } else /* Turn 2-mode-winds off */ { w->w_buf = lines_buf; w->w_flags &= ~W_MODE; redp(RD_CHKALL); /* No longer a mode win, so must */ /* check all to ensure it's updated */ } w->w_redp |= RD_WINRES; redp(RD_MODE); } #endif /*FX_2MODEWINDS*/ init_win () { win_head = 0; oth_win = 0; user_win = make_win(0, scr_ht - (ECHOLINES+1), cur_buf); /* Main */ mode_win = make_win(scr_ht - (ECHOLINES+1), 1, make_buf(" **MODE**")); ask_win = make_win(scr_ht - ECHOLINES, 1, make_buf(" **ASK**")); #if FX_SOWIND if(ev_modwso) mode_win->w_flags |= W_STANDOUT; #endif cur_win = user_win; } chg_win(newwin) /* change current window to newwin */ struct window *newwin; { cur_win->w_dot = cur_dot; /* Save window's current dot */ cur_win->w_redp |= rd_type&RDS_WINFLGS; /* and its redisplay flags */ cur_win = newwin; /* OK, switch to new current window */ cur_buf = newwin->w_buf; /* Set new buffer from win */ e_gosetcur(newwin->w_dot); /* Set new cur_dot from win too */ /* Note done this way to canonicalize the location ** (may be past new EOB) and ensure SB buffer ** internals agree with cur_dot. */ rd_type &= ~RDS_WINFLGS; /* Remove old per-window flags */ redp(RD_WINRES|RD_MODE); /* Maybe caller shd handle? */ /* Note WINRES must be set in case we are pointing * to a buffer that was modified while we were in * the other window! */ } struct window * make_win (pos, ht, buf) int pos, ht; struct buffer *buf; { register struct window *w; register struct buffer *b; b = buf; w = (struct window *) memalloc(sizeof (struct window)); w->w_flags = 0; w->w_pos = pos; w->w_ht = ht; w->w_buf = b; w->w_dot = b->b_dot; /* Set dot from buffer value */ w->w_topldot = 0; /* Set top of window to beg of buffer */ w->w_pct = 200; /* Assume "ALL" */ w->w_bmod = 0; w->w_emod = 0; w->w_oldz = 0; w->w_redp = RD_WINRES; /* Window will need complete update */ w->w_next = win_head; /* Done, now link it in */ win_head = w; return (w); } kill_win (win) struct window *win; { register struct window *w, *w1, *kw; kw = win; w1 = 0; for (w = win_head; w && w != kw; w = w -> w_next) w1 = w; if (w == 0) { ring_bell(); errbarf("No such window"); /* Internal error */ return; } if (w1 == 0) win_head = w -> w_next; else w1 -> w_next = w -> w_next; kw->w_buf->b_dot = (kw == cur_win) ? cur_dot : kw->w_dot; chkfree (kw); #if IMAGEN /* Not needed? */ redp (RD_WINRES|RD_WINDS|RD_REDO); #endif /*IMAGEN*/ } /* * "Show-window" routines, used to set up, step through, and close a * temporary "show" window. * MK_SHOWIN(bufp) * UP_SHOWIN() * KL_SHOWIN() */ /* MK_SHOWIN(bufp) - Temporarily display a buffer */ mk_showin(b) struct buffer *b; { register struct window *w; register int i; int moreflg, intflg; /* Interrupt flag */ struct window *savwin; /* First must set up special window... */ savwin = cur_win; chg_win(w = make_win(0, scr_ht-(ECHOLINES+3), b)); redo: d_fixcur(); /* Fix up screen image of current window */ /* Find how many lines actually used, and reduce size to that */ i = w->w_ht; while(--i >= 0) { if(scr[i]->sl_boff != w->w_oldz) break; } if(++i <= 0) goto skipit; /* Punt the whole thing */ if(!(moreflg = (i >= w->w_ht))) w->w_ht = i; /* Reduce size of window */ intflg = upd_wind(w); /* Update the window! */ if(!intflg) /* Unless input waiting, add prompt. */ { yellat( moreflg ? "--MORE-- (type Space for more, or type any command to flush)" : "------------------------------------------------ (Hit space to continue)--", w->w_ht); } tbufls(); /* Ensure all output forced out */ i = cmd_read(); /* then wait for user to input a char */ if(i == SP) { if(moreflg) { yellat("", w->w_ht); d_screen(1); w->w_redp |= RD_WINRES; goto redo; } } #if !(IMAGEN) /* IMAGEN - always ignore what was typed */ else unrchf = i; #endif /*-IMAGEN*/ skipit: chg_win(savwin); kill_win(w); redp(RD_WINDS); /* Update all remaining windows */ } /* Mode Line generation */ struct window * make_mode(bw) register struct window *bw; /* Base window we are reporting status of */ { register struct buffer *b; /* Buffer of this window */ struct window *mw, *savew; /* Save current window */ struct buffer *saveb; /* and current buffer (in case different) */ char temp[20]; saveb = cur_buf; /* Save values prior to context switch */ savew = cur_win; b = bw->w_buf; /* Get buffer for that window */ #if FX_2MODEWINDS if((mw = sep_win) && (mw->w_flags&W_MODE) && (bw->w_pos == 0)) /* Base window is top window? */ { /* Use sep_win as mode wind */ } else #endif mw = mode_win; /* Default is normal mode window */ chg_win(mw); /* Go to mode line window */ e_gobob(); /* go to beginning */ e_reset(); /* Flush buffer */ #if IMAGEN e_sputz(" "); e_sputz(b->b_name); if (b -> b_flags & B_MODIFIED) e_sputz("*"); e_sputz(" ("); if (b->b_flags & B_QUERYREP) e_sputz("[Query Replace] "); if (b->b_flags & B_CMODE) e_sputz("C"); else if (b->b_flags & B_TEXTMODE) e_sputz("Text"); else e_sputz("Fundamental"); e_sputz(") "); if (b->b_fn) e_sputz(b->b_fn); e_sputz(" "); #else e_sputz(ev_verstr); /* Editor name/version */ e_sputz(" ("); e_sputz(cur_mode->mjm_name); /* insert major mode name */ #if FX_FILLMODE if(fill_mode) e_sputz(" Fill"); #endif /*FX_FILLMODE*/ #if FX_SKMAC if(kdef_mode) e_sputz(" MacroDef"); #endif /*FX_SKMAC*/ e_sputz(") "); e_sputz(b->b_name); /* buffer name */ e_sputz(": "); if (b->b_fn) e_sputz(b->b_fn); /* file name */ if (b->b_flags & B_MODIFIED) e_sputz(" *"); else e_sputz(" "); #endif /*-IMAGEN*/ if(bw->w_pct < 200) /* Not ALL? */ { e_sputz(" --"); switch(bw->w_pct) { case -1: e_sputz("TOP"); break; case 150: e_sputz("BOT"); break; default: dottoa(&temp[0],(chroff)bw->w_pct); e_sputz(&temp[0]); e_putc('%'); } e_sputz("--"); } #if FX_SOWIND if(mw->w_flags&W_STANDOUT) e_insn(SP, (int)(scr_wd0 - e_blen())); /* Stuff out with spaces */ #endif redp(RD_WINRES); chg_win(savew); /* Restore context */ chg_buf(saveb); return(mw); /* Return mode window */ } buf_mod() { register struct buffer *b; b = cur_buf; if((b->b_flags & B_MODIFIED) == 0) { b->b_flags |= B_MODIFIED; redp(RD_MODE); } } /* BUF_TMOD - called when text modified in buffer, to set all * the appropriate indicators so that redisplay works right. * Changed text is everything from CUR_DOT to the given offset * from same. If stuff was deleted, offset should be 0. * BUF_TMAT - similar but argument is location of other end of range, * when caller knows that and wants life easy. */ buf_tmat(dot) chroff dot; { buf_tmod(dot - cur_dot); /* Convert to offset */ } buf_tmod(offset) chroff offset; { register struct window *w; chroff a, b, tmp; w = cur_win; a = cur_dot; b = a + offset; if(a > b) /* Get into right order */ { tmp = a; a = b; b = tmp; } b = e_blen() - b; /* Make upper bound relative to EOB */ if(w->w_bmod < 0) /* Have range vars been set yet? */ { w->w_bmod = a; /* Nope, so can just set 'em now. */ w->w_emod = b; } else { if(a < w->w_bmod) w->w_bmod = a; if(b < w->w_emod) w->w_emod = b; } buf_mod(); /* Maybe later just insert here? */ redp(RD_TMOD); } /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EECMDS Command table lookup and profile code */ #include "elle.h" /* Function table, see the included file for explanation. */ /* First must pre-declare function addrs */ #define EFUN(rtn,rtnstr,name) int rtn(); #define EFUNHOLE #include "eefdef.h" /* Now re-insert to define function table */ int (*funtab[])() = { #undef EFUN /* Avoid redefinition error message */ #undef EFUNHOLE #define EFUN(rtn,rtnstr,name) rtn, #define EFUNHOLE 0, #include "eefdef.h" }; int funmax = sizeof(funtab)/sizeof(funtab[0]); /* 1st illegal function # */ /* Insert default command char map tables and profile structure */ #include "defprf.c" /* EFUN: "Prefix Meta" */ /* Meta-prefix command. * For now, very simple. Perhaps later try to hair up with * time-out "M-" prompt? */ f_pfxmeta() { return(cmd_xct(cmd_read()|CB_META)); } /* EFUN: "Prefix Extend" */ /* Extended-prefix command. * Likewise trivial; perhaps later hair up with timeout "^X-" prompt? */ f_pfxext() { return(cmd_xct(cmd_read()|CB_EXT)); } /* EFUN: "Universal Arg" */ /* This routine is also called by "Argument Digit" with a special arg * of -1 in order to share code. Since that invocation always sets unrchf, * it should always complete at least one digit read loop. * Note that exp and exp_p are set to 1 and 0 at the top-level command * loop. */ f_uarg(ch) int ch; { register int c, oc, i; /* Set distinguishing exp_p value depending on whether invoked * by CTRL-U or another function (Argument Digit, Negative Argument) */ exp_p = (ch < 0) ? 1 : 4; i = 0; /* Read numerical arg if any follows */ for(;;) { oc = cmd_read(); /* Get next input char */ c = oc & 0177; if(c == '-' && !i) { exp_p = -1; exp = 1; /* Set in case no digits follow */ } else if('0' <= c && c <= '9') /* If it's a digit too, */ { i = (i * 10) + c - '0'; /* add digit in. */ if(exp_p >= 0) exp_p = 1; exp = i; } else break; } exp *= exp_p; /* Multiply arg appropriately */ unrchf = oc; /* Not a digit, re-read it next. */ this_cmd = ARGCMD; } /* EFUN: "Negative Argument" */ f_negarg(ch) int ch; { f_uarg(-1); /* Invoke code from Universal Arg */ exp = -exp; } /* EFUN: "Argument Digit" */ f_argdig(ch) int ch; { unrchf = ch; /* Re-read the digit */ f_uarg(-1); /* Invoke code from Universal Arg */ } /* EFUN: "Set Profile" */ /* Asks for a profile file and sets profile from it. */ f_setprof() { int set_profile(); hack_file("Set Profile: ", set_profile); } #if FX_VTBUTTONS /* EFUN: "VT100 Button Hack" */ /* This must be bound to Meta-O if anything, because the VT100 sends * an ESC O prefix when the function buttons are used. */ f_vtbuttons () /* vt100 function buttons */ { switch(cmd_read()) { case ('A'): return (f_uprline ()); case ('B'): return (f_dnrline ()); case ('C'): return (f_fword ()); case ('D'): return (f_bword ()); case ('Q'): /* PF1 */ return (f_kregion()); default: ring_bell (); break; } } #endif /*FX_VTBUTTONS*/ /* CMD_WAIT() - Return TRUE if any command input waiting. */ cmd_wait() { return(unrchf >= 0 #if FX_SKMAC || km_inwait() /* Check for kbdmac input waiting */ #endif /*FX_SKMAC*/ || tinwait()); } /* CMD_READ() - Read a command (single char) from user, and return it. */ cmd_read() { register int c; if((c = unrchf) >= 0) /* Re-reading last char? */ { unrchf = -1; return(c); } #if FX_SKMAC /* Hacking keyboard macros? */ return(km_getc()); /* Yes. This calls tgetc if no kbd macro */ #else return(tgetc()); #endif /*-FX_SKMAC*/ } /* CMD_XCT(ch) - Command Execution dispatch routine. ** Takes char and executes the function (efun) bound to that command key. */ cmd_xct(ch) int ch; { register int (*funct) (); register int c; int (*(cmd_fun())) (); if(funct = cmd_fun(c = ch)) /* Get function to run */ return((*funct) (c&0177)); /* Invoke with char arg */ ring_bell(); /* Undefined command char, error. */ } /* CMD_FUN(ch) - Return function for char, 0 if none */ int (*cmd_fun(c))() int c; { return(funtab[cmd_idx(c)]); } /* CMD_IDX(ch) - Given command char, return function index for it */ cmd_idx(c) register int c; { register char *cp; register int i; if(c&CB_EXT) { cp = def_prof.extvec; i = def_prof.extvcnt; goto inlup; } if(c&CB_META) { cp = def_prof.metavec; i = def_prof.metavcnt; inlup: c = upcase(c); do { if(*cp++ != c) cp++; else { i = *cp&0377; break; } } while(--i); /* If counts out, will return 0! */ } else i = def_prof.chrvec[c&0177]&0377; if(i >= funmax) return(0); return(i); } /* Profile hacking */ #if TOPS20 #include /* for O_BINARY */ #endif set_profile(filename) char *filename; { char pfile[200]; char psfile[200]; register int pfd, len; chroff sbx_fdlen(); register char *profptr; struct stored_profile st_prof; if(filename) strcpy(pfile,filename); else /* Check for user's profile */ { strcat(strcat(strcpy(pfile,homedir),"/"),ev_profile); } if((pfd = open(pfile, #if TOPS20 O_BINARY #else 0 #endif )) < 0) { if(filename) { ding("Cannot open file"); } return; } if((len = (int)sbx_fdlen(pfd)) < sizeof(struct stored_profile)) goto badfil; profptr = memalloc((SBMO)len); if(read(pfd,profptr,len) != len) goto badfmt; /* Have read profile into memory, now set up ptrs etc */ bcopy((SBMA)profptr,(SBMA)&st_prof,sizeof(struct stored_profile)); def_prof.version = prof_upack(st_prof.version); if(def_prof.version != 1) goto badfmt; def_prof.chrvcnt = prof_upack(st_prof.chrvcnt); def_prof.chrvec = profptr + prof_upack(st_prof.chrvec); def_prof.metavcnt = prof_upack(st_prof.metavcnt); def_prof.metavec = profptr + prof_upack(st_prof.metavec); def_prof.extvcnt = prof_upack(st_prof.extvcnt); def_prof.extvec = profptr + prof_upack(st_prof.extvec); #if SUN def_prof.menuvcnt = prof_upack(st_prof.menuvcnt); def_prof.menuvec = profptr + prof_upack(st_prof.menuvec); #endif /*SUN*/ goto done; badfmt: chkfree(profptr); badfil: ding("Bad profile format"); done: close(pfd); } #if SUN /* SUN Menu profile hacking. * This is here, instead of e_sun.c, because * the profile format is still evolving and for the time being I want to * keep all profile-hacking code in one place. --KLH */ #include "suntool/tool_hs.h" #include "suntool/menu.h" #define MENUMAX 16 /* Defined in eesun.c */ extern struct menu *menuptr; extern struct menu menu; char *funamtab[] = { #undef EFUN #undef EFUNHOLE #define EFUN(rtn,rtnstr,name) name, #define EFUNHOLE 0, #include "eefdef.h" }; init_menu() /* initialize the menu for elle from user profile */ { register struct menuitem *mi; register int n, i, fni; if((n = def_prof.menuvcnt) <= 0) return; if(n > MENUMAX) n = MENUMAX; mi = menu.m_items = (struct menuitem *) calloc(n, sizeof *mi); menu.m_itemcount = 0; for(i = 0; i < n; i++) { fni = def_prof.menuvec[i]&0377; if(fni >= funmax) continue; if(funtab[fni] && funamtab[fni]) { mi->mi_data = (caddr_t) funtab[fni]; mi->mi_imagedata = (caddr_t) strdup(funamtab[fni]); mi->mi_imagetype = MENU_IMAGESTRING; mi++; menu.m_itemcount++; } } if(menu.m_itemcount) menuptr = &menu; } #endif /*SUN*/ 6>/* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEDIAG - Error diagnostics and testing routines */ #include "elle.h" #if FX_DEBUG /* EFUN: "Debug Mode" */ /* With no arg, toggles self-checking on and off. * With arg of 4 (^U), enters special debug/diagnostics mode. */ f_debug(ch) int ch; { extern int (*vfy_vec)(); /* In E_MAIN.C */ char *vfy_data(); if(ch < 0) /* Internal call? */ { dbg_diag(); return; } if(exp == 4) { askerr(); return; } if(vfy_vec) vfy_vec = 0; /* Toggle current value */ else vfy_vec = (int (*)())vfy_data; say(vfy_vec ? "Self-checking on" : "Self-checking off"); } char * vfy_data(flag) /* Flag = 0 for quiet check */ int flag; { register char *res, *mess; char *sbe_mvfy(), *sbe_sbvfy(), *sbe_svfy(); if(res = sbe_mvfy(0)) mess = "Mem mgt"; else if(res = sbe_sbvfy(cur_buf,0)) mess = "SBBUF"; else if(res = sbe_svfy(0)) mess = "SD list"; else return(0); /* Success */ if(flag) { int ostate = clean_exit(); printf("\n%s error: %s !!!\n",mess,res); askerr(); if(ostate > 0) set_tty(); } return(res); /* Error seen */ } extern char *asklin(); extern int sbx_nfl,sbm_nfl; char diaghelp[] = "\ Q - Quit diag mode\n\ ! - Goto subshell\n\ V - Verify Mem & SD lists\n\ MF - Mem Freelist\n\ M - Mem list\n\ B - Current buffer SB\n\ DF - SD Freelist\n\ D - SDs in use\n\ DL - SD Logical lists\n\ DP - SD Physical lists\n\ C n - Compact; 0-7=sbx_comp(n), 8=SM freelist, 9=SD freelist.\n\ W - Window printout\n\ X n - Xercise randomly (GC every n)\n\ Z n - like X but with notes\n"; dbg_diag() { register char *cp; register int c; char linbuf[100]; char *sbe_mfl(); char *sbe_sfl(); char *sbe_sbs(); char *sbe_sdlist(); for(;;) { printf("D>"); asklin(cp = linbuf); /* Read a line of input */ switch(upcase(*cp++)) { case '?': writez(1,diaghelp); /* Too long for printf */ continue; case '!': f_pshinf(); /* Invoke inferior subshell */ clean_exit(); /* Restore normal modes */ continue; case 'Q': /* Quit */ return; case 'B': /* Print current SBBUF */ sbe_sbs(cur_buf,1); continue; case 'C': /* C n - Compact */ c = atoi(&linbuf[1]); if(c == 8) sbm_ngc(); /* GC the SM nodes */ #if 0 /* This doesn't work, dangerous to invoke. */ else if(c == 9) sbm_xngc(&sbx_nfl,sizeof(struct sdblk), SM_DNODS); #endif else sbx_comp(512,c); continue; case 'D': /* Print all SD blocks in mem order */ switch(upcase(*cp)) { case 0: /* D - all SDs in mem order */ sbe_sds(); continue; case 'F': /* DF - SD freelist */ sbe_sfl(1); continue; case 'L': /* DL - SD logical list */ sbe_sdlist(1,0); continue; case 'P': /* DP - SD physical list */ sbe_sdlist(1,1); continue; } break; /* failure */ case 'M': switch(upcase(*cp)) { case 0: /* M - all mem alloc info */ sbe_mem(); continue; case 'F': /* MF - mem freelist */ sbe_mfl(1); continue; } break; /* failure */ case 'V': /* Verify */ if(cp = vfy_data(0)) printf(" Failed: %s\n",cp); else printf(" OK\n"); continue; case 'W': /* Print out current window */ db_prwind(cur_win); continue; case 'X': /* Xercise */ c = atoi(&linbuf[1]); vfy_exer(0, c ? c : 100); continue; case 'Z': /* Zercise */ c = atoi(&linbuf[1]); vfy_exer(1, c ? c : 100); continue; } /* End of switch */ printf("?? Type ? for help\n"); } /* Loop forever */ } /* VFY_EXER - a "random" editor exerciser. It creates a buffer, * fills it with some patterned stuff, and then edits it * pseudo-randomly in ways which retain the basic pattern. * Frequent GC's and self-checks are done, and execution * halted either when an error is seen or when typein is detected. */ char *xer_strs [] = { "throne", "too", "sky", "fore", "fingers", "sex", "stone", "010", "nazgul", "base" }; vfy_exer(pf, gcfrq) int pf; /* Nonzero to print notes as we go */ int gcfrq; /* Frequency of GC invocation (# passes per GC) */ { register int i, k, c; long npass; char *res, linbuf[100]; chroff lbeg, lend; struct buffer *bfp, *make_buf(); /* Clean out kill buffer first */ for(i = 0; i < KILL_LEN; ++i) kill_push((SBSTR *)0); bfp = make_buf("**EXORCISE**"); chg_buf(bfp); i = 2000; e_gobol(); do { ed_sins("Line "); ed_sins(xer_strs[i%10]); e_putc(LF); } while(--i); if(pf) printf("Bufflen: %ld\n", e_blen()); /* Buffer now has stuff in it, start hacking. */ npass = 0; srand(1); /* Start random seed */ for(;;) { if(tinwait() && (*asklin(linbuf))) { printf("Typein stop.\n"); break; } ++npass; printf(" Pass %ld",npass); if(npass%gcfrq == 0) /* Time to do a GC? */ { i = rand(); /* Level between 0-4 */ i = (i < 0 ? -i : i) % 5; printf(" - GC lev %d\n", i); sbx_comp(512,i); goto xerchk; } k = (i = rand())%1024; if (i&020000) k = -k; e_igoff(k); /* Move randomly */ e_gobol(); /* Get stuff to flush */ lbeg = e_dot(); k = (i = rand())%64; if(i&010000) k = -k; e_igoff(k); lend = e_nldot(); if(pf) printf(" Kill %ld/ %d;", lbeg, k); ed_kill(lbeg, lend); if(res = vfy_data(0)) { printf("XERR after kill: %s\n",res); break; } k = (i = rand())%2048; if(i&04000) k = -k; e_igoff(k); e_gobol(); e_setcur(); if(pf) printf(" Yank %ld;", e_dot()); f_unkill(); /* Yank back */ if(res = vfy_data(0)) { printf("XERR after yank: %s\n",res); break; } last_cmd = YANKCMD; for(i = rand()%4; i >= 0; --i) { if(pf) printf(" Pop;"); f_unkpop(); /* Do meta-Y */ if(res = vfy_data(0)) { printf("XERR after pop: %s\n",res); goto out; } } if(rand()&07) /* Slowly add stuff */ { if(pf) printf(" Add"); ed_sins("Line "); ed_sins(xer_strs[rand()%10]); e_putc(LF); if(res = vfy_data(0)) { printf("XERR after ins: %s\n",res); break; } } printf("\n"); /* Okay, done with this pass edits, run through the * file to ensure pattern is still there */ xerchk: e_gobob(); while((c = e_getc()) != EOF) if(c == LF && (c = e_getc()) != EOF) { if( c != 'L' || e_getc() != 'i' || e_getc() != 'n' || e_getc() != 'e' || e_getc() != ' ') { printf("XERR in pattern!\n"); goto out; } } } /* User typein or error, stop. */ out: e_setcur(); redp(RD_SCREEN); printf("Loop count = %ld\n",npass); } /* DB_PRWIND(win) - Print out stuff about given window */ db_prwind(w) register struct window *w; { register struct scr_line *s; register int i; char tstr[MAXLINE+MAXCHAR]; char *db_scflgs(); printf("cur_dot/ %ld cur_buf/ %o cur_win/ %o\n", cur_dot, cur_buf, cur_win); printf("Window %o:\n", w); printf(" next/ %o\n", w->w_next); printf(" buf / %o\n", w->w_buf); printf(" redp/ %o\n", w->w_redp); printf(" topldot/ %ld\n", w->w_topldot); printf(" dot / %ld\n", w->w_dot); printf(" bmod/ %ld\n", w->w_bmod); printf(" emod/ %ld\n", w->w_emod); printf(" oldz/ %ld\n", w->w_oldz); printf(" pos / %d\n", w->w_pos); printf(" ht / %d\n", w->w_ht); printf("\ # Flags Boff Len ! Cols Line\n"); for(i = w->w_pos; i < w->w_pos + w->w_ht; ++i) { s = scr[i]; printf("%2d %-5.5s %6ld %3d %1d %4d ", i, db_scflgs(s->sl_flg), s->sl_boff, s->sl_len, s->sl_cont, s->sl_col); strncpy(tstr, s->sl_line, MAXLINE); tstr[s->sl_col] = 0; printf("%-40.40s\n", tstr); if(s->sl_flg&SL_MOD) { printf("%26d ", s->sl_ncol); strncpy(tstr, s->sl_nlin, MAXLINE); tstr[s->sl_ncol] = 0; printf("%-40.40s\n", tstr); } } } char * db_scflgs(flags) int flags; { static char retstr[10]; register char *cp; cp = retstr; if(flags&SL_MOD) *cp++ = 'M'; if(flags&SL_EOL) *cp++ = 'E'; *cp = 0; return(retstr); } #endif /*FX_DEBUG*/ ?>/* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEDISP Redisplay and screen image routines */ #if 0 Note that there are several different types of "efficiency" criteria involved with respect to display updating: (1) Terminal speed: minimize # characters output. (2) Program speed: minimize CPU time used. (3) Program size: minimize code and memory usage. (4) Program modularity: minimize "hooks" between edit/display rtns. The current algorithms necessarily represent a compromise among all of these objectives. The cursor is always located at CUR_DOT in the buffer CUR_BUF of the current window CUR_WIN. This may not be true during function execution, but is always true at the top-level loop of command execution and redisplay. In order to minimize update overhead, there are various flags or variables that the edit functions can use to communicate with "redisplay" and tell it how extensive the updates really need to be. The entire known screen is always represented by a linked list of "windows"; updating the entire screen consists of separately updating every window on the list. Windows can only be defined horizontally (as a range of lines), and must not overlap. Each window has a buffer associated with it; the redisplay routines are responsible for displaying the contents of this buffer. The lowest level data structure for the screen consists of an array of SCR_LINE structures, one for each possible physical screen line. Each line structure has some flags, and pointers to three different representations of what should be on the line: (1) SL_BOFF, SL_LEN - Defines the range of the buffer data which this screen line should represent. If the flag SL_EOL is set, this range ends with (and includes) an EOL character. (2) SL_LINE, SL_COL - Always keeps a copy of the current physical screen line image. Each byte is a character which occupies only one column position on the screen. If the flag SL_CSO is set, the line is in standout mode. (3) SL_NLIN, SL_NCOL - The desired "new" screen line image. This is only valid if the SL_MOD flag is set for the line, indicating that these variables are set and point to the new image of what the screen line should be. If the flag SL_NSO is set, the new line should be in standout mode. Lastly there is a variable SL_CONT, which is needed for continuation of too-long logical lines over several physical lines. If SL_CONT is: 0 = logical line fits entirely on the screen. Either SL_EOL is set, or this line is ended by EOF (end of the buffer). 1 = logical line is too long, but the last buffer char fits entirely on this physical line. SL_EOL is never set. >1 = logical line is too long, and the last buffer char "overruns" the end of the physical image; that is, part of its representation is at the end of this line, but the rest of it is at the start of the next line. This can only happen with "big" characters like TAB, ^A, ~^A, etc. that need more than one column of representation. There are SL_CONT-1 chars of overrun stored at the end of SL_LINE (SL_NLIN if SL_MOD is set). SL_EOL is never set. Note that if a line contains any overrun, and the next line is also part of the same window, the next line''s screen image will start with the SL_CONT-1 chars of overrun, rather than with the representation of that line''s first buffer char. The "EOL" character on Unix systems is normally the new-line character '\n' (ASCII LF). However, on other systems EOL may be indicated by a two-character CR-LF sequence, with either CR or LF alone considered to be "stray". For this reason, the buffer flag B_EOLCRLF exists to control handling and display of EOLs. If the flag is off, the EOL mode is LF, and there are no problems of splitting up characters. If the flag is on, however, the EOL mode is CRLF and the following rules hold: EOL is the sequence CR-LF only. LF without preceding CR is a "stray" LF, displayed as ^J. CR without following LF is a "stray" CR, displayed as ^M. Stray LFs and CRs do not terminate a logical line. "End of Line" as a position is the dot just before the CR of a CR-LF. "Beg of Line" as a position is the dot just after the LF of a CR-LF. If the current dot is between a CR and LF, it is positioned at the beginning of the physical screen line. SL_LINE and SL_COL are always accurate at every stage of processing. The other variables are accurate only after fix_wind has been called to "fix up" the line structures within a window. If either RD_WINRES or RD_TMOD is set, none of these "other variables" should be depended on. Any functions which are screen-relative (d_ type) must be sure that fix_wind is called if necessary, and must give preference to the "new" representation in SL_NLINE and SL_NCOL if SL_MOD is set. The flag RD_UPDWIN will be set by fix_wind if any lines have been modified. Because fix_wind does not perform any actual display update, it is possible for functions to continue operating on the buffer and screen image without requiring that changes be displayed until there is nothing else left to do. The routine upd_wind performs the actual terminal I/O necessary to update all the screen lines which have SL_MOD set. Although the process of updating each line is currently non-interruptible, it is possible for upd_wind to interrupt itself between line updates if it detects that user input has happened, and it will return with the window only partially updated. The screen image state will be completely consistent, however, and the RD_UPDWIN flag will remain set. Communication between the editing functions and the redisplay routines is limited as much as possible to the flags in the global RD_TYPE. Each window has its own copy of these flags in W_REDP, so that if windows are changed, the update hints for that window will be preserved. The flags that can be set are listed below. Those marked with "*" are global in nature; all others apply only within a single window (normally the current window). * RD_SCREEN - Total refresh. Clears entire screen and redisplays all windows. * RD_MODE - Mode line has changed, update it. * RD_CHKALL - Check ALL windows for any redisplay flags, and perform any updates necessary. Otherwise only the current (or specified) window flags are checked. * RD_WINDS - Updates all windows. Like RD_WINRES applied to all windows. RD_WINRES - Update window (assume completely changed). RD_TMOD - Text changed in this window. The range of changes is specified by W_BMOD and W_EMOD in combination with W_OLDZ. Redisplay checking will limit itself to this range. These vars are set by buf_tmod in the main command loop, and reset by fix_wind when the window is fixed up. RD_MOVE - Cursor has moved within current window; may have moved outside the window. W_DOT or CUR_DOT specifies where it should be. RD_ILIN - Hint: Line insert done. Currently no function sets this. RD_DLIN - Hint: Line delete done. Currently no function sets this. Internal flags: RD_UPDWIN - Window needs updating. Used by fix_wind and upd_wind only. Set when window has been "fixed up" and at least one screen line was modified. RD_FIXWIN - Supposed to mean window needs fixing (via call to fix_wind). Not really used. Not implemented, may never be, but comments retained: RD_WINCLR - Clear window (not entire screen) RD_NEWWIN - Window has moved. (not needed? Random stuff here) a. to follow cursor; redisplay selects a new TOPLDOT. b. randomly; new TOPLDOT furnished, use unless cursor out (then a). c. find new TOPLDOT as directed (move up/down N screen lines) For now, assume that (c) doesn''t apply (ie C-V uses (b) and sets TOPLDOT itself). So fix_wind selects new one only if cursor won''t fit. topldot takes precedence over sl_boff. #endif /*COMMENT*/ /* Declarations and stuff */ #include "elle.h" static int sctr(); int trm_mode; /* 0 = TTY in normal, non-edit mode. * 1 = TTY in edit mode. * -1 = TTYH>J>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z>[>\>]>^>_>`>a>b>c>d>e>f>g>h>i>j>k>l>m>n>o>p>q>r>s>t> detached (hung up). * This flag is only used by the 3 routines below, * plus hup_exit. */ /* REDP_INIT() - Called once-only at startup to initialize redisplay * and terminal */ redp_init () { trm_mode = 0; /* Ensure flag says not in edit mode */ ts_init(); /* Get sys term info, set up stuff */ if (trm_ospeed == 0) /* Default speed to 9600 if unknown */ trm_ospeed = 13; t_init(); /* Identify term type, set term-dep stuff */ set_scr(); /* Set up software screen image */ set_tty(); /* Enter editing mode! */ redp(RD_SCREEN|RD_MODE); /* Force full re-display, new mode line */ } /* SET_TTY() - Set up terminal modes for editing */ set_tty() { if(trm_mode) return; /* Ignore if detached or in edit mode */ trm_mode++; ts_enter(); /* Set up system's ideas about terminal */ t_enter(); /* Set terminal up for editing */ } /* CLEAN_EXIT() - Restore original terminal modes. * Returns previous state. */ clean_exit () { register int prevstate = trm_mode; if(prevstate > 0) /* Ignore unless in editing mode */ { trm_mode = 0; t_curpos(scr_ht-1, 0); /* Go to screen bottom */ t_exit(); /* Clean up the terminal */ tbufls(); /* Force out all buffered output */ ts_exit(); /* Restore system's old term state */ #if ! IMAGEN writez(1,"\n"); /* Get fresh line using OS output */ #endif /*-IMAGEN*/ } return prevstate; } /* SET_SCR() - Allocate screen image, set up screenline pointer table */ set_scr() { register struct scr_line **scrp, *stp; register scrsiz; char *sbuf; scr_wd0 = scr_wid - 1; scrsiz = scr_ht*(scr_wid+MAXCHAR); if( scr_ht > MAXHT || scr_wid > MAXLINE) { clean_exit(); printf("ELLE: %dx%d screen too big\n",scr_ht,scr_wid); exit(1); } if((stp = (struct scr_line *) calloc(scr_ht*sizeof(struct scr_line) + scrsiz*2,1)) == 0) { clean_exit(); printf("ELLE: not enough memory\n"); exit(1); } sbuf = (char *)stp + scr_ht*sizeof(struct scr_line); for(scrp = &scr[0]; scrp < &scr[scr_ht]; sbuf += scr_wid+MAXCHAR) { stp->sl_line = sbuf; stp->sl_nlin = sbuf + scrsiz; *scrp++ = stp++; } } /* REDISPLAY() * Main function of redisplay routines. Called every time ELLE * forces update of the terminal screen. "rd_type" contains hints * as to what has changed or needs updating, to avoid wasting time * on things which don't need attention. */ redisplay () { register struct window *w; register i; struct window *make_mode(); w = cur_win; w->w_redp |= rd_type&RDS_WINFLGS; /* Set cur_win's flags */ rd_type &= ~RDS_WINFLGS; /* Leave only globals */ if (rd_type & RD_SCREEN) /* Clear and refresh? */ { t_clear (); /* Clear the screen */ for(i = scr_ht; --i >= 0;) /* Clear screen image */ scr[i]->sl_col = 0; if(w != ask_win) /* If not in ask-window */ { chg_win(ask_win); e_reset(); /* Then flush its contents */ chg_win(w); } redp(RD_WINDS); /* Update all windows */ rd_type &= ~RD_SCREEN; /* If redisplay is interrupted, */ /* don't do it all over again */ } if (rd_type & RD_WINDS) /* Update all windows? */ { redp(RD_CHKALL); for (w = win_head; w; w = w -> w_next) /* For each win */ w->w_redp |= RD_WINRES; rd_type &= ~RD_WINDS; } if (rd_type & RD_CHKALL) /* Check all windows for changes? */ { for (w = win_head; w; w = w->w_next) /* For each win */ if(!(w->w_flags&W_MODE)) /* skip mode wins */ if(w->w_redp && upd_wind(w)) return; /* May be interrupted */ } /* See if ask-window needs updating (to avoid RD_CHKALL in SAY) */ if((w = ask_win)->w_redp && upd_wind(w)) return; /* May be interrupted */ /* Check current window for changes */ if((w = cur_win)->w_redp && upd_wind(w)) return; /* May be interrupted */ /* Now update mode line(s) if necessary */ if(rd_type&RD_MODE) { fupd_wind(w = make_mode(user_win)); #if FX_2MODEWINDS if (sep_win /* If 2 windows */ && (sep_win->w_flags&W_MODE) /* and 2 mode windows */ && (sep_win->w_redp || mode_win->w_redp)) /* Check */ fupd_wind(make_mode(oth_win)); /* Must update both */ #endif } /* Finally, leave cursor in right place. */ if(upd_curs(cur_dot)==0) /* If something screwed up, */ errbarf("Cursor out of window"); /* Complain, */ /* and leave cursor at bot */ rd_type = 0; tbufls(); /* Force out all terminal output */ } fupd_wind(w) /* Force window update */ register struct window *w; { w->w_redp |= RD_WINRES; if(fix_wind(w)) upd_wind(w); } /* * UPD_CURS * Move screen cursor to position of specified dot within current window. * Returns 0 if dot was not within window (and cursor was not moved), * otherwise returns 1 for success. */ upd_curs(adot) chroff adot; { register struct scr_line *s; register int y, x; chroff savdot; if((y = d_line(adot)) < 0) return(0); /* Fail, not within window */ s = scr[y]; /* Now have line that dot is on */ /* Get proper offset for any continuation chars from prev line */ if(y > cur_win->w_pos) { if((x = scr[y-1]->sl_cont) > 0) x--; } else x = 0; savdot = e_dot(); e_go(s->sl_boff); if((x = d_ncols((int)(adot - s->sl_boff),x)) < 0) { /* If lost, assume it's because we are just after a char ** which has its representation continued onto next line. ** Move cursor to end of that continuation. ** d_line should have ensured that this is safe, but ** we double-check just to make sure. */ if((x = s->sl_cont) > 0) /* Set X to end of cont */ --x; /* and on next line down */ if(++y >= (cur_win->w_pos + cur_win->w_ht)) { e_go(savdot); /* Failed, below window */ return(0); } } e_go(savdot); t_move(y, x); /* Move cursor cleverly */ return(1); /* Return success! */ } /* Return line # for given dot, -1 if out of current window */ d_line(cdot) chroff cdot; { register struct scr_line *s; register struct window *w; register int i; chroff savdot; int bot; w = cur_win; i = w->w_pos; bot = i + w->w_ht; for(; i < bot; i++) { s = scr[i]; if(cdot <= s->sl_boff) goto gotl; } /* End of window, repeat test specially for last line */ savdot = s->sl_boff + (chroff)s->sl_len; if(cdot > savdot) /* If past last char of last line */ return(-1); /* then clearly outside */ --i; /* Make i match s (bottom line) */ if(savdot != cdot) /* If not exactly at end */ return(i); /* Then we're inside for sure */ goto linbet; gotl: if(s->sl_boff != cdot) /* Are we on line boundary? */ { if(i <= w->w_pos) /* No, off top of window? */ return(-1); /* Above top, out for sure */ return(--i); } /* Here, dot is exactly on line boundary, have to decide which * line it really belongs to. * Get S = pointer to line which cursor is at the end of. */ if(i <= w->w_pos) /* Quick chk of trivial case, empty buffer */ return(i); s = scr[--i]; linbet: if((s->sl_flg&SL_EOL) /* If line has LF */ || (s->sl_cont > 1)) /* or a continued char */ if(++i >= bot) /* Then cursor is on next line */ return(-1); return(i); } /* D_NCOLS - auxiliary for UPD_CURS. (also called by indtion() in EEFD) ** We are positioned at a place in the current buffer corresponding to ** the beginning of the screen line, and given: ** lcnt - # of chars in buffer to move forward over ** ccol - current column position ** Returns the new column position. There are some special cases: ** Hits EOF: returns normally (new column position) ** Hits EOL: returns -1 ** Position is past end of screen: returns -1 ** The buffer position has changed, but this is irrelevant as upd_curs ** restores it just after the call. */ d_ncols(lcnt, ccol) int lcnt; int ccol; { register int col, i; register SBBUF *sb; int c; char tmp[MAXCHAR*2]; /* MAXCHAR is enough, but *2 just in case */ col = ccol; sb = (SBBUF *) cur_buf; if((i = lcnt) > 0) do { if((c = sb_getc(sb)) == EOF) break; /* Check to see if we've run into an EOL */ #if FX_EOLMODE if(c == CR) { if(eolcrlf(sb)) { if((c = sb_getc(sb)) == LF) /* EOL? */ /* Real EOL. Fail unless point ** is between CR and LF, in which case ** we return 0 (left margin). */ return (i==1 ? 0 : -1); /* Stray CR, back up & fall thru */ if(c != EOF) sb_backc(sb); c = CR; } } else if (c == LF) { if(!eolcrlf(sb)) /* Real EOL? */ return -1; /* Yes, fail */ /* If EOL mode is CRLF then hitting a LF ** can only happen for stray LFs (the ** previous check for CR takes care of ** CRLFs, and we never start scanning ** from the middle of a CRLF. ** Drop thru to show stray LF. */ } #else if(c == LF) return(-1); #endif /*-FX_EOLMODE*/ col += sctr(c, tmp, col); } while(--i); if(col > scr_wd0) return(-1); return(col); } /* D_LUPD - called from command level to completely redisplay a * specific line on the screen. */ d_lupd(w, idx) struct window *w; /* Window this line belongs to, if known */ int idx; { t_curpos(idx, 0); t_docleol(); /* Zap physical screen line */ scr[idx]->sl_col = 0; /* Reflect it on phys screen image */ if(w) /* Mark window for updating */ w->w_redp |= RD_WINRES; else redp(RD_WINDS); /* No window given, assume global */ redp(RD_MOVE); /* Cursor has moved */ } /* Clear a window completely the "quickest possible way" */ clear_wind(w) register struct window *w; { register int i = w->w_pos; /* Top line of window */ register int bot = i + w->w_ht; /* Bottom line (plus 1) of window */ for ( ; i < bot; ++i) d_lupd(w, i); /* Zap that line */ } /* FIX_WIND - Sets up window screen image. Does not generate any * terminal output, but completely specifies what the new screen * image should look like. * Only the following 4 flags (lumped together in RDS_DOFIX) * provoke fix_wind to do something: * RD_MOVE - cursor has moved, must make sure still within * window, and select new one if not. * RD_TMOD - Text has been changed somewhere. * RD_FIXWIN - Something requested that fix_wind fix things. * Normally this is set when a new w_topldot is set. * RD_WINRES - Window needs to be completely regenerated. * Results: * Verifies that the current dot for the window (w_dot) exists. * If it is past the end of buffer, it is reset to EOB, and if this is * the current window, also updates cur_dot. Otherwise, w_dot is never * adjusted; it is fix_wind's responsibility to make sure that the window * displays w_dot. * Verifies that current w_topldot setting will result in cursor * (specified by w_dot) appearing within window. If not, resets w_topldot * to an appropriate value (1/3 of way down from top, unless * moving up in which case 1/3 of way up from bottom). * Makes sure that sl_boff, sl_len, sl_flg, and sl_cont * are set properly for all lines in window. SL_MOD is set * for any lines requiring screen updates; these lines * also have sl_nlin and sl_ncol properly set. * Note that sl_line and sl_col are NOT updated or changed, because * the physical screen has not been altered! * * Returns 0 if no physical screen updates are needed (other than * cursor moving and mode line updating). * Returns 1 if screen updates are needed; RD_UPDWIN is set in w_redp, * indicating that UPD_WIND should be called. */ fix_wind (win) struct window *win; { register struct window *w; register int i; register struct scr_line *s; chroff cdot, bdelta, updot, sdot, newz; chroff savdot; struct buffer *savbuf; int bot, nlmod, savi, contf, ocontf, randomflg; int newpct; if(!(w = win)) return(0); if(!(w->w_redp&RDS_DOFIX)) /* Anything we need to do? */ return(0); /* Nope, just ignore */ /* Find current dot for this window, and set up other stuff */ cdot = (w == cur_win) ? cur_dot : w->w_dot; bot = w->w_pos + w->w_ht; savbuf = cur_buf; cur_buf = w->w_buf; savdot = e_dot(); nlmod = 0; /* No screen image changes so far */ /* Dot (ie cursor) is before current top? If so, must move * backwards to find a new topldot. Note also that buffer may have * changed so that either cdot or topldot points past EOF. */ if(w->w_topldot > cdot) { /* Yes, must search backwards scrht/3 screen lines */ /* from cdot in order to find topldot. */ /* Don't bother updating scr stuff beforehand since we'll * have to revise everything anyway and can do it on the fly. */ i = (ev_mvpct * w->w_ht) / 100; goto skipdn; finddn: i = ((100 - ev_mvpct) * w->w_ht) / 100; skipdn: if(i <= 0) i = 1; /* Ensure # is reasonable */ else if(i >= w->w_ht) i = w->w_ht-1; e_go(cdot); /* Start here (may normalize to EOF)*/ d_backup(i ? i : 1); /* Try to back up cleverly */ w->w_topldot = e_dot(); randomflg = 0; /* We have some idea where we are */ fixall: /* Entry point for later recheck, with randomflg==1 */ newz = e_blen(); if(newz < cdot) /* Part of buf may have gone away */ { /* So normalize dot to EOF */ w->w_dot = cdot = newz; if(w == cur_win) /* Special check for fixing */ cur_dot = newz; /* up cur_dot too! */ goto finddn; /* and get a new top-of-window loc */ } retry: i = w->w_pos; contf = 0; s = 0; for(; i < bot; i++) { nlmod++; fix_line(scr[i], s); /* s = 0 the first time */ s = scr[i]; #if FX_SOWIND if(w->w_flags & W_STANDOUT) s->sl_flg |= SL_NSO; else s->sl_flg &= ~SL_NSO; #endif } if(inwinp(w,cdot)) /* Ensure in window */ goto mdone; if(randomflg) /* If jumped randomly, */ { i = (ev_nwpct * w->w_ht) / 100; goto skipdn; /* Try to select new window */ } /* We tried to back up and went too far. */ if(cdot < w->w_topldot) /* Verify place is ahead */ { errbarf("fix_wind failed"); /* Didn't back up?? */ goto finddn; } /* Move down one line and try again */ if(w->w_ht > 1) w->w_topldot = scr[w->w_pos+1]->sl_boff; else { s = scr[w->w_pos]; w->w_topldot = s->sl_boff + s->sl_len; } e_go(w->w_topldot); goto retry; } /* At some future point, could separate out processing for * RD_WINRES and RD_FIXWIN. Latter flag implies only w_topldot * has changed (new window selected). Former implies whole * buffer has been munged, and everything is completely redone. */ if(w->w_redp&(RD_WINRES|RD_FIXWIN)) /* If re-figuring whole window */ { e_go(w->w_topldot); /* Start here, and */ randomflg = 1; /* set up flag saying random jump */ goto fixall; /* and go crunch all lines. */ } if((w->w_redp&RD_TMOD)==0) /* If claims no text mods, */ { if(inwinp(w,cdot)==0) /* Just verify cursor loc. */ goto finddn; /* Sigh.... */ newz = w->w_oldz; /* Win, set up for exit. */ goto done; } /* Here only when RD_TMOD is set, indicating changes are * between range variables. */ /* Find upper bound of any mods. This is a little gross in the * speed dept and some faster way should perhaps be devised. * In particular the main loop should incrementally keep track of * buffer size, and should set a flag RD_TEXT if anything has * actually been changed. Edit routines should have lots of * flags available to tell main loop more precisely what they did, * so main loop can take care of updating b/emod and stuff. */ if((newz = e_blen()) == 0) goto finddn; /* Ensure blank window is cleared */ bdelta = newz - w->w_oldz; if((updot = newz) > w->w_emod) updot -= w->w_emod; if(bdelta == 0 && (updot == w->w_bmod)) goto inwinq; /* Could also check for updot < w_topldot (changes above win) * or sl_boff+sl_len < w_bmod (changes below win) but those * cases are probably pretty rare. */ /* First find line where changes start */ for(i = w->w_pos; i < bot; i++) { s = scr[i]; if(w->w_bmod <= s->sl_boff) /* Changes prior to this? */ break; } if(i >= bot) /* Test last line specially */ { if(w->w_bmod > (s->sl_boff + (chroff)s->sl_len)) goto inwinq; /* Outside window */ /* Last line changed, hack it */ } if(i > w->w_pos /* If we have a prev line */ && (s->sl_len == 0 /* and we're at EOF, */ || w->w_bmod != s->sl_boff /* or not at start of line */ || scr[i-1]->sl_cont)) /* or prev line is continuation */ s = scr[--i]; /* then it's prev line we want */ /* I has index for screen line changes begin on; S has ptr. * This piece of code handles case where buffer has been modified * starting at BMOD, and BDELTA chars have been inserted/deleted; * range of changes ends at UPDOT. */ savi = i; while(++i < bot) scr[i]->sl_boff += bdelta; i = savi; /* Now start with 1st changed line and start figuring new line * lengths. Stop when hit end, or past updot and boff is correct * for start of line. */ /* can improve this by jumping out when past emod, and testing for * an EOL - then know stuff has to match someplace, so look for that. * could then simply update lengths or something? */ if(i > w->w_pos) /* Find # cols already there from prev line*/ contf = scr[i-1]->sl_cont; else contf = 0; ocontf = 1; /* Fake it so always update 1st line*/ e_go(sdot = s->sl_boff); for(; i < bot; i++) { s = scr[i]; if(updot <= sdot /* If past changed stuff */ && sdot == s->sl_boff /* and locs are lined up */ && contf == 0 /* and previous line clean */ && ocontf == 0) /* (both old and new images) */ break; /* Then done. */ nlmod++; ocontf = s->sl_cont; /* Save old-image contf value */ fix_line(s, (i > w->w_pos) ? scr[i-1] : 0); #if FX_SOWIND if(w->w_flags & W_STANDOUT) s->sl_flg |= SL_NSO; else s->sl_flg &= ~SL_NSO; #endif sdot = e_dot(); contf = s->sl_cont; /* Get new-image contf value */ } if(inwinp(w,cdot)) /* OK, screen fixed, see if cursor inside */ goto mdone; goto finddn; /* Test if still in window and dispatch appropriately */ inwinq: if(inwinp(w,cdot)) goto done; else goto finddn; /* Come here when done, after mods made to window. * Calculate new %-of-buffer position for window's view, and * see if it's changed from current %. */ mdone: if(w != cur_win) goto done; /* If not current window, ignore */ s = scr[bot-1]; if((s->sl_boff + (chroff)s->sl_len) >= newz) if(w->w_topldot) newpct = 150; /* BOT */ else newpct = 200; /* ALL */ else if(w->w_topldot == 0) newpct = -1; /* TOP */ else /* NOTE: This won't work if topldot is huge */ newpct = (w->w_topldot*100)/newz; /* nn% */ if(newpct != w->w_pct) /* OK, now compare with old % */ { w->w_pct = newpct; /* Different, must set and */ redp(RD_MODE); /* invoke redisplay of mode line! */ } done: w->w_bmod = -1; /* To indicate vars not set */ w->w_oldz = newz; w->w_redp &= ~RDS_DOFIX; /* Clear flags that invoked us */ if(nlmod) w->w_redp |= RD_UPDWIN; /* Say stuff to be updated */ e_go(savdot); cur_buf = savbuf; return(nlmod); } /* INWINP - Returns true if given dot is inside given window. */ inwinp(win,cdot) struct window *win; chroff cdot; { register struct scr_line *s; register struct window *w; chroff sdot; w = win; if(cdot < w->w_topldot) return(0); s = scr[(w->w_pos + w->w_ht) - 1]; sdot = s->sl_boff + (chroff)s->sl_len; if(cdot < sdot) return(1); /* Yup, inside window. */ if(cdot > sdot) return(0); /* Dot is exactly at end of window, must check further. */ if(s->sl_len /* If line exists, */ && ((s->sl_flg&SL_EOL) /* and ends in LF, */ || s->sl_cont > 1)) /* or sl_cont > 1, lose. */ return(0); return(1); /* Else inside, win. */ } /* * UPD_WIND * If argument 0, assumes cur_win and DOESN'T interrupt if input * detected. */ upd_wind(win) struct window *win; { register int i, n; register struct scr_line *s; struct window *w; int top, bot, dspf, num, isave, noicost, nodcost, iline, dline; #if FX_SOWIND int oldso; #endif #if IMAGEN int origdspf; char redpmsg[128]; #endif /*IMAGEN*/ if((w=win)==0) w = cur_win; dspf = w->w_redp; /* Get update flags for window */ #if IMAGEN origdspf = dspf; #endif /*IMAGEN*/ if(w == cur_win) /* If updating current window, */ dspf |= rd_type; /* merge in global flags */ if((dspf &= RDS_WINFLGS) == 0) /* Well, it might happen sometimes */ goto zdone; w->w_redp = dspf; if(dspf&(RD_WINRES|RD_TMOD|RD_MOVE|RD_FIXWIN)) { fix_wind(w); /* May set some flags, so */ dspf = w->w_redp; /* get them back... */ } if((dspf&RD_UPDWIN)==0) /* Must ask for update! */ goto zdone; #if IMAGEN if (dbg_redp) { sprintf(redpmsg, "buffer: %14s, rd_type: %06o, w_redp: %06o, dspf: %06o", w->w_buf->b_name, rd_type, origdspf, dspf); barf2(redpmsg); } #endif /*IMAGEN*/ /* Assume screen structure set up by FIX_WIND, just go * effect change for every line modified. */ #if FX_SOWIND oldso = t_dostandout((w->w_flags&W_STANDOUT)? 1:0); #endif top = w->w_pos; bot = top + w->w_ht; for(i = top; i < bot; ++i) if((s = scr[i])->sl_flg&SL_MOD) { if(win && tinwait()) /* If OK, stop if any chars typed */ { tbufls(); w->w_redp = dspf; #if FX_SOWIND t_dostandout(oldso); #endif return(1); /* Return immediately, say int'd */ } if(slineq(s,s)) /* Compare old with new */ goto ldone; /* Lines equal, no update needed */ #if IMAGEN /* If hint says redo entirely */ if (dspf & RD_REDO) { s->sl_flg |= SL_REDO; /* Do "fast update" */ goto nodel; /* Just go update line */ } #endif /*IMAGEN*/ if((trm_flags&TF_IDLIN)==0) goto nodel; /* Just go update line */ /* Check for I/D line. If no hints exist, check for both * insert and delete. */ if((dspf&(RD_ILIN|RD_DLIN))==0) dspf |= RD_ILIN|RD_DLIN; noicost = 0; nodcost = 0; /* Check for insert line. See if the current old screen * line is duplicated among any of the new lines which * follow it. If a match is found, keep looking and add * up the number of characters in the matching lines. */ if(dspf&RD_ILIN) { /* See if this old screen line is needed elsewhere */ if(s->sl_col == 0) /* Ignore if blank */ goto noins; for(n = i+1; n < bot; n++) { if((scr[n]->sl_flg&SL_MOD)==0) break; if(slineq(s, scr[n])) /* Old, new */ { if(!noicost) iline = n; /* 1st time */ noicost += s->sl_col; s++; } else if(noicost) break; } if(!noicost) /* If no match, forget it */ goto noins; /* S will not have changed. */ s = scr[i]; /* Restore S */ n = iline; /* Have matches, get index * of first matching line */ /* Heuristic to decide whether to perform * insert-line operation. Kind of stupid, but * good enough for now. */ num = (n-i)*(tvc_ldn+tvc_lin) + (tvc_li + tvc_ld); if((n-i) >= (scr_ht-(ECHOLINES+3)) /* Don't move lines all the * way down full screen! */ || num >= noicost) /* Compare cost with estimated * cost of not doing insert.*/ goto noins; /* Insert lines! */ dspf &= ~RD_ILIN; inslin(i, n - i, w); for(; i < n; i++) /* Update intervening lines */ upd_line (i); goto ldone; } noins: /* Check for delete line. See if the new screen line * is duplicated among any of the old lines already on * the screen. If a match is found, keep looking and add * up the number of characters in the matching lines. */ if(dspf&RD_DLIN) { /* See if the new line already exists elsewhere */ if(s->sl_ncol == 0) /* Ignore blank lines */ goto nodel; for (n = i + 1; n < bot; n++) { if((scr[n]->sl_flg&SL_MOD)==0) break; if(slineq(scr[n],s)) /* Old, new */ { if(!nodcost) dline = n; /* 1st time */ nodcost += s->sl_ncol; s++; } else if(nodcost) break; } if(!nodcost) /* If no match, forget it */ goto nodel; /* S will not have changed. */ s = scr[i]; /* Restore S */ n = dline; /* Index of 1st match */ /* Heuristic to decide whether to perform * delete-line operation. Same hack as for * insert-line. */ num = (n-i)*(tvc_ldn+tvc_lin) + (tvc_li + tvc_ld); if((n-i) >= (scr_ht-(ECHOLINES+3)) || num >= nodcost) goto nodel; /* Delete lines! */ dspf &= ~RD_DLIN; dellin(i, n - i, w); goto ldone; } nodel: /* All failed, so just update line */ upd_line(i); ldone: s->sl_flg &= ~SL_MOD; /* Clear mod flag */ } done: #if FX_SOWIND t_dostandout(oldso); /* Back to previous mode */ #endif zdone: w->w_redp = 0; return(0); /* Say completed */ } /* * SLINEQ - Compare old, new screen image lines. If new line doesn't * have the modified flag set, use its old image. * If the standout mode differs, always fails. */ slineq(olds, news) struct scr_line *olds; struct scr_line *news; { register char *cpo, *cpn; register int cnt; cpo = (char *)news; if(((struct scr_line *)cpo)->sl_flg&SL_MOD) { cnt = ((struct scr_line *)cpo)->sl_ncol; cpn = ((struct scr_line *)cpo)->sl_nlin; #if FX_SOWIND /* Mode of old must match mode of new */ if(((olds->sl_flg & SL_CSO)==0) != ((((struct scr_line *)cpo)->sl_flg & SL_NSO)==0)) return 0; #endif } else { cnt = ((struct scr_line *)cpo)->sl_col; cpn = ((struct scr_line *)cpo)->sl_line; #if FX_SOWIND /* Modes of current lines must match */ if((olds->sl_flg & SL_CSO) != (((struct scr_line *)cpo)->sl_flg & SL_CSO)) return 0; #endif } /* Crufty match stuff */ if(cnt != olds->sl_col) return(0); if(cnt) { cpo = olds->sl_line; do { if(*cpo++ != *cpn++) return(0); } while(--cnt); } return(1); } /* UPD_LINE(lineno) - Effects the update of a physical screen line, * assuming that the screen line structure for that line has been * properly set up by fix_wind. It cannot be interrupted by typein. * Does a lot of work to check out optimization for char I/D. * Someday it could also check out the possibility of doing a CLEOL at * some point to reduce the number of spaces that need to be output. */ upd_line(y) int y; { register i; register char *sci, *cp; struct scr_line *s; int xpos; /* actual screen position */ int c, c2, p2, cmpcost, delcost; int savc, ocol, ncol; char *savcp, *savsci; #if FX_SOWIND int oldso, newso; int writall = 0; #endif s = scr[y]; savsci = sci = s->sl_line; /* What is currently on the screen */ #if IMAGEN if (s->sl_flg & SL_REDO) { /* Check for line-redo flag */ s->sl_flg &= ~SL_REDO; /* Clear it: we are handling it */ writall = 1; /* Re-do this line completely */ t_move(y, 0); t_docleol(); s->sl_col = 0; } #endif /*IMAGEN*/ #if FX_SOWIND /* See whether modes of the lines are the same or not. */ newso = (s->sl_flg & SL_NSO)!=0; /* Get new mode (true if SO)*/ if(((s->sl_flg & SL_CSO)!=0) != newso) { t_move(y, 0); /* Not same, must zap existing line */ t_docleol(); s->sl_col = 0; writall = newso; /* Output all if SO is new mode */ } oldso = t_dostandout(newso); /* Get in right mode */ #endif ocol = s->sl_col; savcp = cp = s->sl_nlin; ncol = s->sl_ncol; /* Find leading equalness */ i = ocol; if(i > ncol) i = ncol; /* Use minimum count */ if(i) { do { if(*cp++ != *sci++) { --cp; break; } } while(--i); i = cp - savcp; sci = savsci; /* Restore ptr to beg of cur line */ } /* From here on, "i" is now the x-coordinate (column addr) * of the first position that doesn't match. "cp" points to * the first nonmatching char in the new line image. */ #if COHERENT /* Has direct video interface capability */ if(trm_flags&TF_DIRVID) { if(ncol < ocol) { /* Flesh out new line to completely replace old */ fillsp(&s->sl_nlin[ncol], ocol-ncol); ncol = ocol; } /* Spit out changed stuff. t_direct will handle the * case where i == ncol (ie no changes needed). */ t_direct(y,i,cp,ncol-i); goto done; } #endif /*COHERENT*/ if(i == ncol) /* Matched up to end of new line? */ goto idone; /* Yes, can skip big loop! */ #if FX_SOWIND if(writall) /* If simply writing everything...*/ { t_move(y, 0); tputn(cp, ncol); /* Output them all */ curs_col = ncol; /* Update cursor position */ goto idone; /* then wrap up! */ } #endif /* Now must fill out remainder of old line with blanks. */ if(ocol < scr_wid) { #if FX_SOWIND if(newso) fillset(&sci[ocol], scr_wid-ocol, 0); else #endif fillsp(&sci[ocol],scr_wid-ocol); /* Fill out */ } /****** Main update loop. ******/ for (; i < ncol; i++) { c = *cp++; /* Note *CP will point to next */ if(c == sci[i]) continue; if(i >= ocol) /* Past EOL of old line? */ { putin: sci[i] = c; if(y != curs_lin || i != curs_col) t_move(y, i); tput(c); curs_col++; continue; } if((trm_flags&TF_IDCHR)==0) /* Replace */ goto putin; /* Do checking to see whether char I/D operations should * be invoked. This code is quite CPU intensive and * can cause noticeable pauses if run on a slow CPU with * a fast (9600) terminal line. The optimization tradeoff * seems worthwhile most of the time, however. */ cmpcost = 0; /* Default is don't compare */ if(ncol == ocol) /* If line lengths same, must chk */ { /* if(ncol >= scr_wid) */ /* If line overrun, compare */ cmpcost++; } #if 0 If ncol == ocol, have problem with tabs: If don''t use I/D char, but tabs exist, lots of wasteful update. If DO use I/D char, and no tabs exist, potential for mistakenly using I/D when didn''t have to. Not too bad, though? If DO use I/D char, then mild screw when inserting/deleting just before a tab, since could have just overwritten, but I/D insists on jerking things around. Insert test: If old char was space, replace? Problem: will cause cursor jump if really should have shifted a long run of spaces. But that is probably okay. Delete test: If new char is space, replace? again, will cause cursor jump with long run of spaces. #endif /*COMMENT*/ if(ncol < ocol || cmpcost) /* Try delete-char */ { /* Search old for match of c and nextc */ dodel: savc = c; if(i >= ncol-1) goto putin; c2 = *cp; if(c == SP && ncol == ocol) goto tryins; p2 = i; for(;;) { if(c == sci[i] && c2 == sci[i+1]) break; if(++i < ocol) continue; i = p2; if(cmpcost) {cmpcost = 0; goto tryins;} goto putin; } /* Find # chars that match (i.e. will be saved) */ for(c=1; (i+c < ncol) && (sci[i+c] == cp[c-1]); c++); delcost = tvc_cd + tvc_cdn*(i - p2); if(delcost >= c) { c = savc; i = p2; if(cmpcost) { cmpcost = 0; goto tryins;} goto putin; /* Punt */ } if(cmpcost) { c = savc; i = p2; goto tryins; } t_move(y, p2); c = i - p2; /* Find # chars to flush */ strncpy(&sci[p2],&sci[i], ocol-i); ocol -= c; fillsp(&sci[ocol], c); i = p2; /* Restore i */ t_delchr(c); /* Flush this many cols */ continue; } /* Try ins-char */ /* Search new for match of i and i+1 */ /* Note this cannot be used while in standout mode, since ** the new spaces created will probably be in the wrong mode. */ tryins: #if FX_SOWIND if(newso) goto putin; #endif if(i+1 >= ocol) goto putin; savc = c; savcp = cp; c2 = sci[i+1]; if(sci[i] == SP && ncol == ocol) goto putin; xpos = i; /* save current col */ i++; for(;;) { if(i >= ncol) goto puntx; c = *cp++; inlp2: if(c != sci[xpos]) { if(i > scr_wid) goto puntx; i++; continue; } if(i >= ncol) goto puntx; c = *cp++; if(c != c2) { i++; /* Allow for previous c */ goto inlp2; /* which is always 1 */ } break; } if(i >= scr_wid) goto puntx; /* Find how many chars match (i.e. will be saved) */ for(c = 2; xpos+c < ncol && sci[xpos+c] == *cp++; c++); if((p2 = tvc_ci + tvc_cin*(i - xpos)) >= c) goto puntx; /* Not worth it... */ if(cmpcost && p2 >= delcost) goto puntx; /* Do delchr instead */ /* We've decided to insert some chars! */ i -= xpos; /* Get # char positions to insert */ cp = savcp; /* Get ptr to newline string */ --cp; /* Point at 1st char to insert */ /* Make room in scr array */ inspc(&sci[xpos], &sci[(ocol+i >= scr_wid) ? scr_wid-i : ocol], i); ocol += i; /* Update size of old line */ strncpy(&sci[xpos], cp, i); /* Copy all inserted chars */ t_move(y, xpos); /* Now ensure in right place */ t_inschr(i, cp); /* and insert string onto screen! */ cp += i; /* Update source ptr */ cp++; /* Point to next char */ i += xpos; continue; /* Now continue loop! */ puntx: i = xpos; c = savc; cp = savcp; if(cmpcost) { cmpcost = 0; goto dodel;} goto putin; } /* All done putting up new stuff. Now see if any remaining old ** stuff needs to be cleared from end of line. */ idone: if(i < ocol) /* if still have text to right, */ { t_move(y,i); /* move there */ t_docleol(); /* and clear old stuff. */ } done: s->sl_line = s->sl_nlin; /* Replace old image by new */ s->sl_col = s->sl_ncol; s->sl_nlin = sci; s->sl_flg &= ~SL_MOD; #if FX_SOWIND /* Copy standout mode to current */ if(newso) s->sl_flg |= SL_CSO; else s->sl_flg &= ~SL_CSO; #endif } #if FX_SOWIND fillset(str,cnt,c) char *str; int cnt; int c; { register int n; register char *cp; if((n = cnt) <= 0) return; cp = str; do{ *cp++ = c; } while(--n); } #endif fillsp(str,cnt) char *str; int cnt; { register int n; register char *cp; if((n = cnt) <= 0) return; cp = str; do{ *cp++ = SP; } while(--n); } inspc(cp0, cpl, cnt) char *cp0, *cpl; int cnt; { register char *cp, *cp2; register n; if((n = cnt) <= 0) return; cp = cpl; /* ptr to last+1 char in string */ cp2 = cp+n; /* ptr to loc+1 to move to */ n = cp - cp0; /* # chars to move */ do *--cp2 = *--cp; while(--n); n = cnt; /* Now fill gap with spaces */ do *cp++ = SP; while(--n); } /* FIX_LINE - Fixes up new screen image for a single line. Does not * do any actual terminal I/O, and does not change the old screen * image. Assumes that previous line (if any is furnished) has * already been properly set up. */ int sctreol = 0; /* Ugly crock for talking to sctrin() */ /* 0 = no EOL seen, 1 = EOL seen, -1 = EOF seen */ fix_line(slp, olds) struct scr_line *slp; struct scr_line *olds; { register struct scr_line *s; register int col, scrw; char *cp; int ch; col = 0; scrw = scr_wid; cp = slp->sl_nlin; if((s = olds) && (col = s->sl_cont)) { if(--col) strncpy(cp, (s->sl_flg&SL_MOD) ? &s->sl_nlin[scrw] : &s->sl_line[scrw], col); cp += col; } scrw--; /* Note now using scr_wd0 !! */ s = slp; s->sl_boff = e_dot(); col = sctrin(cp, scrw, col); if (col < scrw || sctreol) /* Does line need continuation mark? */ s->sl_cont = 0; /* No, say no cont chars */ else { /* Yes, find # cols of overflow. If not 0, must be > 0 */ /* and char is a biggie. Make room for continuation chars */ if(col -= scrw) inspc(&s->sl_nlin[scrw],&s->sl_nlin[scrw+col], 1); s->sl_cont = col+1; /* # cont chars, plus 1 */ s->sl_nlin[scrw] = CI_CLINE; /* Display "contin" mark */ col = scrw+1; } s->sl_ncol = col; s->sl_len = e_dot() - s->sl_boff; s->sl_flg |= (SL_MOD|SL_EOL); /* Say new, and assume line has EOL */ if(sctreol <= 0) /* unless it doesn't really */ s->sl_flg &= ~SL_EOL; /* in which case turn off flag */ return; } /* SCTRIN - auxiliary for FIX_LINE. * lim - # cols chars are allowed to use * ccol - current column (0 = bol) * Returns when see EOL or EOF, or * when all columns have been filled up. Retval-ccol = # overflow. * Note that any overflow is indivisible (i.e. a char with a * multi-col representation is responsible for the overflow). * So, overflow = 0 means next char would be in 1st non-ex column * and overflow > 0 means last char read has extra columns, but * it did start within bounds. */ sctrin(to, lim, ccol) char *to; int lim; int ccol; { register SBBUF *sb; register col, cnt; sb = (SBBUF *) cur_buf; col = ccol; sctreol = 0; /* No EOL or EOF seen */ do { cnt = sb_getc(sb); if(cnt == EOF) { --sctreol; /* Say EOF seen! */ return(col); } #if FX_EOLMODE if(cnt == CR) /* Possible EOL? */ { if(eolcrlf(sb)) { if((cnt = sb_getc(sb)) == LF) /* Real EOL? */ { sctreol++; return col; /* Yes, return */ } /* Stray CR, back up & fall thru */ if(cnt != EOF) sb_backc(sb); cnt = CR; /* Show stray CR */ } } else if (cnt == LF) { if(!eolcrlf(sb)) /* Real EOL? */ { sctreol++; return col; /* Yes, return */ } /* If EOL mode is CRLF then hitting a LF ** can only happen for stray LFs (the ** previous check for CR takes care of ** CRLFs, and we never start scanning ** from the middle of a CRLF. ** Drop thru to show stray LF. */ } #else if(cnt == LF) { sctreol++; /* Say EOL seen */ return col; } #endif /*_FX_EOLMODE*/ cnt = sctr(cnt, to, col); to += cnt; col += cnt; } while(col < lim); /* If we're stopping because last char put us precisely at the ** end of the line, make a further check to see whether an EOL ** is next. If so, we can include that in the line since it ** doesn't need any more columns for representation! */ if (col == lim) /* If stopping exactly at edge of screen */ switch (sb_getc(sb)) /* Check out next char */ { case EOF: --sctreol; /* Yes, note EOF seen */ break; /* and can return immed */ #if FX_EOLMODE case CR: /* Possible EOL? */ if(eolcrlf(sb)) { if((cnt = sb_getc(sb)) == LF) /* Real EOL? */ { sctreol++; /* Yes, set flag */ break; /* and return */ } /* Stray CR, back up & fall thru */ if(cnt != EOF) /* Back up char that */ sb_backc(sb); /* came after the CR */ sb_rgetc(sb); /* Then back over CR */ break; } sb_backc(sb); break; case LF: if(!eolcrlf(sb)) /* Real EOL? */ { sctreol++; /* Yes, set flag */ break; /* and return */ } /* If EOL mode is CRLF then hitting a LF ** can only happen for stray LFs (the ** previous check for CR takes care of ** CRLFs, and we never start scanning ** from the middle of a CRLF. ** Drop thru into default to back up over LF. */ #else case LF: sctreol++; /* Say EOL seen */ break; /* and return */ #endif /*-FX_EOLMODE*/ default: sb_backc(sb); /* Back up over random char */ break; } return(col); } /* SCTR - Screen Char TRanslation routine. ** This routine is completely responsible for the way a buffer char is ** displayed on the screen. Given a char and the current column position, ** it stores the representation using the given pointer and returns ** the number of chars (columns) used by the representation. ** Normal printing chars (plus space) are simply themselves. ** TAB is a variable number of spaces depending on the column pos. ** (we use standard tabstops of 8) ** All control chars are uparrow followed by a printing char. ** e.g. ctrl-A = ^A ** This includes ESC which is ^[. ** DEL is shown as ^?. ** Chars with the 8th bit set have the prefix CI_META (currently ~) and ** the rest of the representation is as above (except for TAB). ** Chars with the 9th bit set have the prefix CI_TOP (currently |) and ** the rest of the representation is as above (except for TAB). ** This only exists for systems with 9-bit chars such as TOPS-20. */ static int sctr(ch, to, ccol) int ch; /* Buffer char to translate */ char *to; /* Place to deposit translation in */ int ccol; /* Current column position */ { register char *cp; register c, n; c = ch; if(037 < c && c < 0177) /* Most common case */ { *to = c; return(1); } cp = to; if(c == TAB) /* Next most common case */ { n = 010 - (ccol&07); /* Tab stops are every 8 cols */ ccol = n; /* Save value */ do *cp++ = SP; while (--n); return(ccol); } ccol = 1; /* Re-use var */ #if TOPS20 if(c&0400) /* 9th bit set? */ { *cp++ = CI_TOP; ccol++; } #endif /*TOPS20*/ if(c&0200) { *cp++ = CI_META; ccol++; } if((c &= 0177) <= 037 || c == 0177) { *cp++ = CI_CNTRL; c ^= 0100; /* Transform cntrl char */ ccol++; } *cp = c; return(ccol); } /* INSLIN(line, N, wind) - Insert lines * DELLIN(line, N, wind) - Delete lines * Both routines insert/delete N lines at "line" in window "wind" * and update the screen image accordingly. */ inslin (line, n, win) int line; /* line number to insert BEFORE */ int n; /* number of lines to insert */ struct window *win; /* window we are in */ { register int i; register int bot; register char **savp; char *savscr[MAXHT]; bot = win -> w_ht + win -> w_pos; t_curpos (line, 0); t_inslin (n, bot); /* do the insertion on the screen */ savp = &savscr[0]; for (i = 1; i <= n; i++) /* free lines that fall off-screen */ *savp++ = scr[bot - i]->sl_line; for (i = bot - 1; i >= line + n; i--) /* move down lines */ { scr[i]->sl_line = scr[i - n]->sl_line; /* below the insertion */ scr[i]->sl_col = scr[i - n]->sl_col; } savp = &savscr[0]; for (i = line + n - 1; i >= line; i--) /* blank lines where inserted */ { scr[i]->sl_line = *savp++; scr[i]->sl_col = 0; } for(i = line; i < bot; ++i) scr[i]->sl_flg |= SL_MOD; } dellin (line, n, win) int line; /* first line to be deleted */ int n; /* number of lines to be deleted */ struct window *win; /* window we are in */ { register int i; register int bot; register char **savp; char *savscr[MAXHT]; bot = win -> w_ht + win -> w_pos; t_curpos (line, 0); t_dellin (n, bot); /* do the deletion on the screen */ savp = &savscr[0]; for (i = line; i < line + n; i++) /* free the deleted lines */ *savp++ = scr[i]->sl_line; for (i = line; i < bot - n; i++) /* move lines up to fill */ { scr[i]->sl_line = scr[i + n]->sl_line; /* deleted spaces */ scr[i]->sl_col = scr[i + n]->sl_col; } savp = &savscr[0]; for (i = bot - n; i < bot; i++) /* blank lines at bottom */ { scr[i]->sl_line = *savp++; scr[i]->sl_col = 0; } for(i = line; i < bot; ++i) scr[i]->sl_flg |= SL_MOD; } /* T_ Terminal functions - these are similar to the terminal-dependent * routines in EETERM (which they call) but rely on some knowledge of * the screen image in order to do their job cleverly. */ #if FX_SOWIND /* T_DOSTANDOUT(on) - Turn standout mode on or off, cleverly. ** Returns previous state. */ static int curso = 0; /* Current state (initially off) */ int t_dostandout(on) int on; { int oldso; if ((oldso = curso) != on) /* If desired state doesn't match, */ { t_standout(on); /* invoke new state. */ curso = on; } return oldso; } #endif t_move(y,x) register int y,x; { register int d; if(y != curs_lin) /* No vertical smarts yet */ { t_curpos(y, x); return; } if((d = (x - curs_col)) >= 0) /* Find diff in column position */ { if(d == 0) return; /* If none, nothing to do! */ /* Moving right. If distance is less than abs-move cost, * do clever right-move by copying screen image */ if(d < tvc_pos) #if FX_SOWIND /* Ensure not in standout mode */ if((scr[y]->sl_flg&(SL_CSO|SL_NSO))==0) #endif { tputn(&scr[y]->sl_line[curs_col], d); curs_col = x; return; } } /* Moving to left, try to do clever left-move by backspacing * instead of using abs move. */ else if((d = -d)*tvc_bs < tvc_pos) { do { t_backspace(); } while(--d); return; } /* No luck with cleverness, just move. */ t_curpos(y, x); } t_docleol() { register struct scr_line *s; register int cnt, ocol; if(trm_flags&TF_CLEOL) t_cleol(); /* Winning */ else /* Losing */ { s = scr[curs_lin]; if((cnt = s->sl_col - curs_col) > 0) { #if FX_SOWIND int oldso = t_dostandout(0); #endif ocol = curs_col; do { tput(SP); curs_col++; } while(--cnt); #if FX_SOWIND t_dostandout(oldso); #endif t_move(curs_lin, ocol); } } } /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEEDIT - E-type routines */ #include "elle.h" /* E_ - Operate on cur_buf. Do not change value of cur_dot unless * unavoidable side effect (also e_setcur). * EX_ - Like E_ but take SB ptr value. Never touch cur_dot. * ED_ - Like E_, operate on cur_buf, update cur_dot and display stuff. * D_ - Perform necessary display update for given operations. * * Note that "dot" refers to the current read/write pointer for a sbbuffer. * The name comes from EMACS/TECO where "." represents this value. */ #define CURSBB (SBBUF *)cur_buf /* Shorthand for current SB buffer */ e_reset() /* Reset current buffer */ { ex_reset(CURSBB); cur_dot = 0; } /* Basic functions - apply SB routines to current buffer. * There is some optimization here which knows that certain SB functions * are macros. */ e_rgetc() /* Read/move 1 char backward */ { return(sb_rgetc((CURSBB))); } e_rdelc() /* Delete 1 char backward */ { return(sb_rdelc((CURSBB))); } e_delc() /* Delete 1 char forward */ { return(sb_deln(CURSBB,(chroff)1)); } e_getc() /* Read/move 1 char forward */ { register SBBUF *sb; sb = CURSBB; /* Macro: use reg */ return(sb_getc(sb)); } e_backc() /* Move 1 char backward */ { register SBBUF *sb; sb = CURSBB; /* Macro: use reg */ sb_backc(sb); /* No value returned */ } e_putc(c) /* Insert/write 1 char forward */ char c; { register SBBUF *sb; sb = CURSBB; /* Macro: use reg */ return(sb_putc(sb, c)); } e_peekc() /* Read 1 char forward (no move) */ { register SBBUF *sb; sb = CURSBB; /* Macro: use reg */ return(sb_peekc(sb)); } e_ovwc(ch) /* Overwrite 1 char forward */ char ch; { sb_setovw(CURSBB); /* Turn on overwrite mode */ e_putc(ch); sb_clrovw(CURSBB); /* Turn off overwrite mode */ } SBSTR * e_copyn(off) /* Copy N chars forward/backward, return SD to sbstring */ chroff off; { return(sb_cpyn(CURSBB,off)); } e_deln(off) /* Delete N chars forward/backward */ chroff off; { return(sb_deln(CURSBB, off)); } /* E_SETCUR() - set cur_dot to current position (dot). This is the only * E_ routine that mungs cur_dot except for e_reset. */ e_setcur() { cur_dot = e_dot(); } e_gosetcur(dot) /* Go to specified dot and set cur_dot as well */ chroff dot; { sb_seek(CURSBB,dot,0); e_setcur(); /* Not cur_dot = dot since want canonicalization */ } /* E_GO(dot) - Move to specified location. */ /* These "GO" routines all move to the location specified, returning * 0 if successful and -1 on error. "cur_dot" is never changed, * with the exception of e_gosetcur. * Note that other "GO" routines (eg E_GONL) will return 1 if successful * and 0 if stopped by EOF. */ e_gocur() { return(e_go(cur_dot)); } /* Move to cur_dot */ e_gobob() { return(e_go((chroff) 0)); } /* Move to Beg Of Buffer */ e_goeob() { return(sb_seek(CURSBB,(chroff)0,2)); } /* Move to End Of Buffer */ e_go(dot) /* Move to specified location. */ chroff dot; { return(sb_seek(CURSBB,dot,0)); } e_igoff(ioff) /* Move (int) N chars forward/backward */ int ioff; { return(sb_seek(CURSBB,(chroff)ioff,1)); } e_goff(off) /* Move (full) N chars forward/backward */ chroff off; { return(sb_seek(CURSBB,off,1)); } int ex_gonl(), ex_gopl(), ex_gobol(), ex_goeol(); e_gobol() { return(ex_gobol(CURSBB)); } /* Move to beg of this line */ e_goeol() { return(ex_goeol(CURSBB)); } /* Move to end of this line */ e_gonl() { return(ex_gonl(CURSBB)); } /* Move to beg of next line */ e_gopl() { return(ex_gopl(CURSBB)); } /* Move to beg of prev line */ /* E_DOT() - Return current value of dot. */ chroff e_dot() { return(sb_tell(CURSBB)); } /* Current pos */ chroff e_nldot() { return(e_alldot(CURSBB,ex_gonl)); } /* Beg of next line */ chroff e_pldot() { return(e_alldot(CURSBB,ex_gopl)); } /* Beg of prev line */ chroff e_boldot(){ return(e_alldot(CURSBB,ex_gobol));} /* Beg of this line */ chroff e_eoldot(){ return(e_alldot(CURSBB,ex_goeol));} /* End of this line */ chroff e_alldot(sbp,rtn) /* Auxiliary for above stuff */ SBBUF *sbp; int (*rtn)(); { return(ex_alldot(sbp,rtn,e_dot())); } /* E_BLEN - Return length of current buffer */ chroff e_blen() { return(ex_blen(CURSBB)); } /* EX_ routines - similar to E_ but take a buffer/sbbuf argument * instead of assuming current buffer. */ /* EX_RESET - Reset a given buffer */ ex_reset(b) struct buffer *b; { sbs_del(sb_close((SBBUF *)b)); sb_open((SBBUF *)b,(SBSTR *)0); } ex_go(sbp,loc) /* Move to given dot in specified sbbuf */ chroff loc; SBBUF *sbp; { return(sb_seek(sbp,loc,0)); } chroff ex_dot(sbp) /* Return current position in specified sbbuf */ SBBUF *sbp; { return(sb_tell(sbp)); } chroff ex_boldot(sbp,dot) /* Return dot for BOL of specified sbbuf */ SBBUF *sbp; chroff dot; { return(ex_alldot(sbp,ex_gobol,dot)); } chroff ex_alldot(sbp,rtn,dot) /* Auxiliary for some e_ stuff */ SBBUF *sbp; int (*rtn)(); chroff dot; { register SBBUF *sb; chroff savloc, retloc; savloc = sb_tell(sb = sbp); sb_seek(sb,dot,0); (*rtn)(sb); retloc = sb_tell(sb); sb_seek(sb,savloc,0); return(retloc); } /* GO (forward) to Next Line of specified sbbuf - returns 0 if stopped at EOF * before an EOL is seen. */ ex_gonl(sbp) SBBUF *sbp; { register SBBUF *sb; register int c; sb = sbp; #if FX_EOLMODE if(eolcrlf(sb)) while((c = sb_getc(sb)) != EOF) { if(c == LF) /* Possible EOL? */ { sb_backc(sb); /* See if prev char was CR */ if((c = sb_rgetc(sb)) != EOF) sb_getc(sb); sb_getc(sb); /* Must restore position */ if(c == CR) /* Now test for CR */ return(1); /* Won, CR-LF! */ } } else #endif while((c = sb_getc(sb)) != EOF) if(c == LF) return(1); return(0); } /* GO (forward) to End Of Line of specified sbbuf - returns 0 if stopped at * EOF before an EOL is seen. */ ex_goeol(sbp) SBBUF *sbp; { register SBBUF *sb; register int c; sb = sbp; #if FX_EOLMODE if(eolcrlf(sb)) while((c = sb_getc(sb)) != EOF) { if(c == LF) /* Possible EOL? */ { sb_backc(sb); /* See if prev char was CR */ if((c = sb_rgetc(sb)) == CR) return(1); /* Won, CR-LF! */ if(c != EOF) /* No, must restore position */ sb_getc(sb); /* Skip over */ sb_getc(sb); /* Skip over LF */ } } else #endif while((c = sb_getc(sb)) != EOF) if(c == LF) { sb_backc(sb); return(1); } return(0); } /* GO (backward) to Beg Of Line of specified sbbuf - returns 0 if stopped * at EOF */ ex_gobol(sbp) SBBUF *sbp; { register SBBUF *sb; register int c; sb = sbp; #if FX_EOLMODE if(eolcrlf(sb)) while((c = sb_rgetc(sb)) != EOF) { if(c == LF) /* Possible EOL? */ { if((c = sb_rgetc(sb)) == CR) { sb_getc(sb); /* Won, CR-LF! */ sb_getc(sb); /* Move back */ return(1); } if(c != EOF) /* No, must restore position */ sb_getc(sb); /* Undo the rgetc */ } } else #endif while((c = sb_rgetc(sb)) != EOF) if(c == LF) { sb_getc(sb); return(1); } return(0); } /* GO (backward) to Previous Line of specified sbbuf - returns 0 if stopped * at EOF before an EOL is seen (i.e. if already on 1st line of buffer) */ ex_gopl(sbp) SBBUF *sbp; { register SBBUF *sb; register int c; sb = sbp; #if FX_EOLMODE if(eolcrlf(sb)) while((c = sb_rgetc(sb)) != EOF) { if(c == LF) /* Possible EOL? */ { if((c = sb_rgetc(sb)) == CR) { ex_gobol(sb); return(1); /* Won! */ } if(c != EOF) /* No, must restore position */ sb_getc(sb); /* Undo the rgetc */ } } else #endif while((c = sb_rgetc(sb)) != EOF) if(c == LF) { ex_gobol(sb); return(1); /* Won! */ } return(0); } chroff ex_blen(sbp) /* Return length of specified sbbuf */ SBBUF *sbp; { return(sb_tell(sbp)+sb_ztell(sbp)); } /* Miscellaneous stuff */ /* E_GOFWSP() - Forward over whitespace */ e_gofwsp() { register int c; while((c = e_getc()) == SP || c == TAB); if(c != EOF) e_backc(); } /* E_GOBWSP() - Backward over whitespace */ e_gobwsp() { register int c; while((c = e_rgetc()) == SP || c == TAB); if(c != EOF) e_getc(); } /* E_|>~>>>>>>>>GOLINE(n) - Goes N lines forward (or backward). ** If N == 0, goes to beginning of current line. ** Returns 0 if hit EOF. */ e_goline(i) register int i; { if(i > 0) { do { if(!e_gonl()) return(0); } while(--i); } else if(i < 0) { i = -i; do { if(!e_gopl()) return(0); } while(--i); } else e_gobol(); /* arg of 0 */ return 1; } /* E_LBLANKP() - Returns true if all characters in rest of line are blank. * Moves to beginning of next line as side effect, unless fails. */ e_lblankp() { register int c; for(;;) switch(e_getc()) { case SP: case TAB: continue; case LF: /* Normally drop thru to return 1 as for EOF */ #if FX_EOLMODE if(eolcrlf(cur_buf)) { e_rgetc(); if((c = e_rgetc()) != EOF) /* Get prev char */ e_getc(); e_getc(); if(c != CR) /* Now examine */ continue; /* Not CR-LF, go on */ } /* Else drop thru to return win */ #endif case EOF: return(1); default: return(0); } /* Never drops out */ } e_insn(ch, cnt) int ch; int cnt; { register int i; if((i = cnt) > 0) do { e_putc(ch); } while(--i); } e_sputz(acp) char *acp; { register SBBUF *sb; register char *cp; register int c; if(cp = acp) { sb = CURSBB; while(c = *cp++) sb_putc(sb,c); } } /* BOLEQ - Returns TRUE if 2 dots are on the same line * (i.e. have the same Beg-Of-Line) */ boleq(dot1,dot2) chroff dot1,dot2; { return( (ex_boldot(CURSBB,dot1) == ex_boldot(CURSBB,dot2))); } char * dottoa(str,val) char *str; chroff val; { register char *s; s = str; if(val < 0) { *s++ = '-'; val = -val; } if(val >= 10) s = dottoa(s, val/10); *s++ = '0' + (int)(val%10); *s = 0; return(s); } /* Paragraph utilities */ #if FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA #if FX_SFPREF extern char *fill_prefix; /* Defined in eefill.c for now */ extern int fill_plen; /* Ditto */ #endif /*FX_SFPREF*/ #if ICONOGRAPHICS int para_mode = PARABLOCK; /* eexcmd.c only other file that refs this */ #endif /*ICONOGRAPHICS*/ /* Go to beginning of paragraph */ e_gobpa() { register int c; chroff savdot; savdot = e_dot(); e_bwsp(); while((c = e_rgetc()) != EOF) if(c == LF) /* Went past line? */ { e_getc(); /* Back up and check */ #if FX_SFPREF if(fill_plen) if(tstfillp(fill_plen)) { e_igoff(-(fill_plen+1)); continue; } else break; #endif /*FX_SFPREF*/ #if ICONOGRAPHICS c = e_peekc (); if (para_mode == PARABLOCK) if (c == LF) break; if (para_mode == PARALINE) if (c_wsp (c)) break; #else if(c_pwsp(e_peekc())) /* Check 1st chr for wsp */ break; /* If wsp, done */ #endif /*ICONOGRAPHICS*/ e_rgetc(); /* Nope, continue */ } if((c = e_peekc()) == '.' || c == '-') { e_gonl(); if(e_dot() >= savdot) e_gopl(); } } /* Go to end of paragraph */ e_goepa() { register int c; e_gobol(); /* First go to beg of cur line */ e_fwsp(); while((c = e_getc()) != EOF) if (c == LF) { #if FX_SFPREF if(fill_plen) /* If Fill Prefix is defined */ if(tstfillp(fill_plen)) /* then must start with it */ continue; else break; /* or else we're done */ #endif /*FX_SFPREF*/ #if ICONOGRAPHICS if (para_mode == PARABLOCK) if (e_peekc () == LF) break; if (para_mode == PARALINE) if (c_wsp (e_peekc ())) break; #else if(c_pwsp(e_peekc())) break; #endif /*-ICONOGRAPHICS*/ } } exp_do(rpos, rneg) int (*rpos)(), (*rneg)(); { register int e; register int (*rtn)(); if((e = exp) == 0) return; rtn = rpos; if(e < 0) { rtn = rneg; e = -e; } do { (*rtn)(); } while(--e); } e_fwsp() { register int c; while(c_wsp(c = e_getc())); if(c != EOF) e_backc(); } e_bwsp() { register int c; while(c_wsp(c = e_rgetc())); if(c != EOF) e_getc(); } c_wsp(ch) int ch; { register int c; c = ch; if(c == SP || c == TAB || c == LF || c == FF) return(1); return(0); } c_pwsp(ch) int ch; { register int c; c = ch; if(c == '.' || c == '-') return(1); return(c_wsp(c)); } #endif /* FX_FPARA || FX_BPARA || FX_MRKPARA || FX_FILLPARA */ /* Word function auxiliaries */ /* Returns true if this character is a delimiter. */ delimp(c) int c; { static int delim_tab[] = { 0177777, 0177777, /* All controls */ 0177777, 0176000, /* All punct but 0-9 */ 0000001, 0074000, /* All punct but A-Z and _ */ 0000001, 0174000 /* All punct but a-z */ }; return (delim_tab[c >> 4] & (1 << (c & 017))); } e_wding(adot,n) register chroff *adot; int n; { chroff savdot; savdot = e_dot(); e_gowd(n); *adot = e_dot(); e_go(savdot); if(*adot == savdot) { ring_bell(); return(0); } return(1); } chroff e_wdot(dot,n) chroff dot; int n; { chroff savdot, retdot; savdot = e_dot(); e_go(dot); e_gowd(n); retdot = e_dot(); e_go(savdot); return(retdot); } e_gowd(n) int n; { register int (*gch)(), c, cnt; int e_getc(), e_rgetc(); chroff ret_dot; if((cnt = n) == 0) return; if(cnt > 0) gch = e_getc; /* Forward routine */ else { gch = e_rgetc; /* Backward routine */ cnt = -cnt; } do { ret_dot = e_dot(); /* Remember dot for last word found */ while((c = (*gch)()) != EOF && delimp(c)); if(c == EOF) { e_go(ret_dot); /* Use last word found */ break; } while((c = (*gch)()) != EOF && !delimp(c)); if(c == EOF) break; if(n < 0) e_getc(); else e_backc(); } while(--cnt); } /* Searching */ e_search(mstr,mlen,backwards) char *mstr; int mlen; int backwards; { register SBBUF *sb; register char *cp; register int c; char *savcp; int cnt, scnt; #if IMAGEN register int c1; register int caseless = (cur_buf->b_flags & B_TEXTMODE); #endif /*IMAGEN*/ sb = (SBBUF *) cur_buf; if (!backwards) { /* Search forwards */ sfwd: cp = mstr; while((c = sb_getc(sb)) != EOF) { #if IMAGEN if((!caseless && c != *cp) || (caseless && upcase(c) != upcase(*cp))) continue; #else if(c != *cp) continue; #endif /*-IMAGEN*/ cp++; cnt = mlen; while(--cnt > 0) { #if IMAGEN c1 = *cp++; c = e_getc(); if ((!caseless && c1 != c) || (caseless && upcase(c1) != upcase(c))) #else if(*cp++ != (c = e_getc())) #endif /*-IMAGEN*/ { if(c == EOF) return(0); sb_seek(sb,(chroff)(cnt-mlen),1); goto sfwd; } } return(1); } } else { /* Search backwards */ scnt = mlen - 1; savcp = mstr + scnt; /* Point to end of string */ sbck: cp = savcp; while((c = sb_rgetc(sb)) != EOF) { #if IMAGEN if((!caseless && c != *cp) || (caseless && upcase(c) != upcase(*cp))) continue; #else if(c != *cp) continue; #endif /*-IMAGEN*/ cp--; if((cnt = scnt) == 0) return(1); do { #if IMAGEN c1 = *cp--; c = e_rgetc(); if ((!caseless && c1 != c) || (caseless && upcase(c1) != upcase(c))) #else if(*cp-- != (c = e_rgetc())) #endif /*-IMAGEN*/ { if(c == EOF) return(0); sb_seek(sb,(chroff)(mlen-cnt),1); goto sbck; } } while(--cnt); return(1); } } return(0); /* Failed */ } /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEERR - Error handling & testing routines */ #include "elle.h" #if V6 #include "eesigs.h" #else #include #endif /* EFUN: "Hit Breakpoint" */ f_bkpt() { clean_exit(); bpt(); set_tty(); } bpt() {} /* Put a DDT/ADB breakpoint here */ #if !(STRERROR) /* If strerror() not supported, we provide it. */ extern int sys_nerr; /* Max index into sys_errlist */ extern char *sys_errlist[]; char * strerror(num) int num; { static char badbuf[30]; if (num > 0 && num <= sys_nerr) return (sys_errlist[num]); sprintf(badbuf, "unknown error %d", num); return badbuf; } #endif /* -STRERROR */ errsbm(type,adr,str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) register int type; /* Type, flags */ int (*adr)(); /* Addr called from */ char *str; /* Printf string */ { register struct buffer *b; int oldttystate; oldttystate = clean_exit(); /* Ensure not in editing mode */ if(type == SBFERR) /* File overwrite error? A0 is FD */ { printf("WARNING - FILE CORRUPTED!\nBuffers affected:\n"); for(b = buf_head; b; b = b->b_next) { if(sb_fdinp((SBBUF *)b, a0)) printf((b->b_fn ? " %s: %s\n" : " %s\n"), b->b_name, b->b_fn); } if (oldttystate > 0) set_tty(); return(1); /* Try to continue normally */ } printf("%sERR: %o ", (type ? "SBX" : "SBM"), adr); printf(str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); askerr(); } /* * Bite_bag -- Try to save our rear ends after a catastrophe. * This routine is mainly called from "interrupt" * level when a memory fault or bus error occurs. * We try to save the buffer to the file "ELLE.crash" * in the current working directory. If it loses, well * then you have really lost. Note: this routine does * not reset the appropriate signal handler, so it is * never re-entered. If a fault repeats once in this * code, then the world dies. */ bite_bag(fault) /* We come here on any memory error */ int fault; { int ostate; /* Some systems, such as BSD4.x and SUN, do not reset caught signals * to SIG_DFL. * This is a win, but isn't what vanilla UNIX code expects. * Since it doesn't hurt to do it explicitly, we always turn it off * explicitly... */ signal(fault, SIG_DFL); /* Reinstate default handling */ ostate = clean_exit(); /* Fix up the terminal modes first! */ printf("ELLE stopped by fatal interrupt (%d)!\n\ Type S or W to try saving your work.\n",fault); askerr(); if(ostate > 0) set_tty(); signal(fault, bite_bag); /* If continued, re-enable signal */ } /* HUP_EXIT - Called by a SIGHUP hangup signal. * Tries to save all modified buffers before exiting. * Note that the TTY is not touched at all, although the terminal mode * flag is set just in case further error handling routines are invoked. */ hup_exit() { extern int trm_mode; /* See e_disp.c */ trm_mode = -1; /* Say TTY is now detached */ saveworld((struct buffer *)0, 0); /* Save world, w/o feedback */ exit(1); } errint() /* Routine provided for ADB jumps */ { askerr(); } char askh1[] = "\ A - Abort process\n\ B - Breakpoint (must have \"bpt:b\" set in ADB)\n\ C - Continue\n\ D - Diagnostic command mode\n"; char askh2[] = "\ S - Try to save current buffer\n\ W - Try to save world (all modified buffers)\n"; int bsaving = 0; /* Set while in middle of saving buffer(s) */ askerr() { register struct buffer *b; char linbuf[100]; char *asklin(); extern int (*funtab[])(); /* In E_CMDS.C */ int ostate; ostate = clean_exit(); /* Clean up TTY if not already done */ reask: printf("(A,B,C,D,S,W,?)"); switch(upcase(*asklin(linbuf))) { case '?': writez(1,askh1); /* Too long for &$@! printf */ writez(1,askh2); /* Too long for &$@! V6 C */ break; /* optimizer (/lib/c2) */ case 'A': abort(); break; case 'B': bpt(); break; case 'Q': case 'C': goto done; case 'D': if(funtab[FN_DEBUG]) (*funtab[FN_DEBUG])(-1); else printf("Sorry, no diagnostics\n"); break; case 'S': /* Try to save current buffer only */ b = cur_buf; goto savb; case 'W': /* Try to save all modified buffers */ b = 0; savb: if(bsaving++) { printf("Already saving -- continued"); goto done; } saveworld(b, 1); /* Save, with feedback */ bsaving = 0; break; } goto reask; done: if(ostate > 0) set_tty(); } char * asklin(acp) char *acp; { register char *cp; register int c; cp = acp; while((c = tgetc()) != LF) *cp++ = c; *cp++ = 0; return(acp); } /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEF1 Various functions * Char move/ins/del * Case change * Char/word transpose */ #include "elle.h" /* EFUN: "Insert Self" */ f_insself (c) int c; { #if IMAGEN fim_insself(c); #else #if FX_FILLMODE extern int fill_mode; if(fill_mode) fx_insfill(c); else #endif /*FX_FILLMODE*/ ed_insn(c, exp); /* Normal stuff */ #endif /*-IMAGEN*/ } /* EFUN: "Quoted Insert" ** Inserts next char directly, number of times. ** Does not check anything about the char and does not do anything ** depending on the mode. In particular, CR is not turned into EOL. */ f_quotins() { ed_insn(cmd_read(), exp); /* Insert next char directly */ } #if FX_CRLF /* EFUN: "CRLF" */ f_crlf() { #if IMAGEN fim_crlf(); #else register int i; if(e_goeol() == cur_dot /* If at end of current line */ && exp == 1 /* and inserting only 1 new line */ && e_lblankp() && e_lblankp()) /* and next 2 lines blank */ { e_gocur(); /* Then just re-use next line. */ e_gonl(); /* Go to its start */ e_setcur(); /* and establish cur_dot there. */ ed_delete(e_dot(), e_eoldot()); /* Ensure any blanks flushed */ } else { e_gocur(); /* Otherwise back to original place */ if((i = exp) > 0) /* and simply insert newlines */ do ed_crins(); while(--i); } #endif /*-IMAGEN*/ } #endif /*FX_CRLF*/ /* EFUN: "Forward Character" */ f_fchar() { ed_igoff(exp); } /* EFUN: "Backward Character" */ f_bchar() { ed_igoff(-exp); } /* EFUN: "Delete Character" */ f_dchar () { #if IMAGEN fim_dchar(); #else ef_deln(exp); #endif /*-IMAGEN*/ } /* EFUN: "Backward Delete Character" */ f_bdchar () { #if IMAGEN fim_bdchar(); #else ef_deln(-exp); #endif /*-IMAGEN*/ } /* Delete forward or backward N characters. * If arg, kills instead of deleting. */ ef_deln(x) int x; { e_igoff(x); if(exp_p) ed_kill(cur_dot, e_dot()); else ed_delete(cur_dot, e_dot()); } #if FX_DELSPC /* EFUN: "Delete Horizontal Space" */ /* Delete spaces/tabs around point. */ f_delspc() { chroff dot1; e_gobwsp(); /* Move backward over whitespace */ dot1 = e_dot(); /* Save point */ e_gofwsp(); /* Move forward over whitespace */ ed_delete(dot1,e_dot()); /* Delete twixt start and here */ } #endif /*FX_DELSPC*/ #if FX_TCHARS /* EFUN: "Transpose Characters" * Transpose chars before and after cursor. Doesn't hack args yet. * EMACS: With positive arg, exchs chars before & after cursor, moves right, * and repeats the specified # of times, dragging the char to the * left of the cursor right. * With negative arg, transposes 2 chars to left of cursor, moves * between them, and repeats the specified # of times, exactly undoing * the positive arg form. With zero arg, transposes chars at point * and mark. * HOWEVER: at the end of a line, with no arg, the preceding 2 chars * are transposed. */ f_tchars() { register int c, c2; #if IMAGEN c = e_rgetc(); /* Gosmacs style: twiddle prev 2 */ if (c == EOF) return(e_gocur()); /* Do nothing at beginning of bfr */ #else if((c = e_getc()) == EOF /* If at EOF */ || e_rgetc() == LF) /* or at end of line, */ c = e_rgetc(); /* use preceding 2 chars */ #endif /*-IMAGEN*/ if((c2 = e_rgetc()) == EOF) /* At beginning of buffer? */ return(e_gocur()); /* Yes, do nothing */ e_ovwc(c); e_ovwc(c2); e_setcur(); buf_tmod((chroff)-2); /* Munged these 2 chars */ } #endif /*FX_TCHARS*/ #if FX_FWORD /* EFUN: "Forward Word" */ f_fword() { chroff retdot; if(e_wding(&retdot, exp)) ed_go(retdot); } #endif #if FX_BWORD /* EFUN: "Backward Word" */ f_bword() { exp = -exp; f_fword(); } #endif #if FX_KWORD /* EFUN: "Kill Word" */ f_kword() { chroff retdot; if(e_wding(&retdot,exp)) { ed_kill(cur_dot,retdot); this_cmd = KILLCMD; } } #endif #if FX_BKWORD /* EFUN: "Backward Kill Word" */ f_bkword() { exp = -exp; f_kword(); } #endif #if FX_TWORDS /* EFUN: "Transpose Words" */ /* Transpose word. Urk! */ f_twords() { register SBSTR *sd1, *sd2; register SBBUF *sb; chroff begwd1, endwd1, begwd2, endwd2; endwd2 = e_wdot(cur_dot, 1); /* Go to end of 2nd word */ begwd2 = e_wdot(endwd2, -1); /* Go to beg of 2nd word */ if(begwd2 >= endwd2) /* If no 2nd word, punt. */ return; begwd1 = e_wdot(begwd2, -1); /* Go to beg of 1st word */ endwd1 = e_wdot(begwd1, 1); /* Go to end of 1st word */ if(begwd1 >= endwd1) /* If no 1st word, punt. */ return; if(endwd1 > begwd2) /* Avoid possible overlap */ return; e_go(begwd2); sb = (SBBUF *)cur_buf; sd2 = sb_killn(sb, endwd2 - begwd2); /* Excise wd 2 first */ e_go(begwd1); sd1 = sb_killn(sb, endwd1 - begwd1); /* Excise wd 1 */ sb_sins(sb, sd2); /* Replace with wd 2 */ e_goff(begwd2 - endwd1); /* Move past between stuff */ sb_sins(sb, sd1); /* Insert wd 1 */ e_setcur(); buf_tmat(begwd1); /* Modified this range */ } #endif /*FX_TWORDS*/ /* Case hacking functions and support */ #if FX_UCWORD /* EFUN: "Uppercase Word" */ f_ucword() { case_word(0); } #endif /*FX_UCWORD*/ #if FX_LCWORD /* EFUN: "Lowercase Word" */ f_lcword() { case_word(1); } #endif /*FX_LCWORD*/ #if FX_UCIWORD /* EFUN: "Uppercase Initial" */ f_uciword() { case_word(2); } #endif /*FX_UCIWORD*/ #if FX_UCWORD||FX_LCWORD||FX_UCIWORD case_word (downp) { chroff retdot; #if IMAGEN chroff startdot; /* Normalize our position to beginning of "current" word, * where "current" is defined to be the current word we are in, * or else the previous word if we are not in any word. * All this silly nonsense just to perpetuate Gosmacs's * wrong behaviour! */ startdot = cur_dot; /* Save current position */ e_getc(); /* If at beg of word, ensure we get inside it */ e_gowd(-1); /* Go to start of this or prev word */ e_setcur(); /* Set cur_dot */ #endif /*IMAGEN*/ if(e_wding(&retdot, exp)) { ed_case(cur_dot,retdot,downp); e_gosetcur(retdot); } #if IMAGEN e_gosetcur(startdot); #endif /*IMAGEN*/ } #endif /* any case_word caller */ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEF2 Various functions */ #include "elle.h" /* Line Handling functions */ /* EFUN: "Beginning of Line" */ f_begline() { e_gobol(); ed_setcur(); } /* EFUN: "End of Line" */ f_endline() { e_goeol(); ed_setcur(); } /* EFUN: "Next Line" */ /* Goes to beginning of next line */ f_nxtline() { return(down_bline(exp)); } /* EFUN: "Previous Line" */ /* Goes to beginning of previous line */ f_prvline() { return(down_bline(-exp)); } /* EFUN: "Down Real Line" */ f_dnrline () { down_line(exp); } /* EFUN: "Up Real Line" */ f_uprline () { down_line(-exp); } #if FX_OLINE /* EFUN: "Open Line" */ f_oline() { register int i; chroff savdot; savdot = cur_dot; if((i = exp) > 0) do { ed_crins(); } while(--i); e_gosetcur(savdot); } #endif /*FX_OLINE*/ #if FX_DELBLINES /* EFUN: "Delete Blank Lines" */ /* Delete blank lines around point. */ f_delblines() { register int c; chroff dot1, dot2, oldcur; oldcur = cur_dot; do { e_gobwsp(); } while ((c = e_rgetc()) == LF); if (c != EOF) e_gonl(); dot1 = e_dot(); if(dot1 > oldcur) return; do { e_gofwsp(); } while ((c = e_getc()) == LF); if(c != EOF) e_gobol(); dot2 = e_dot(); if(dot2 < oldcur) return; ed_delete(dot1,dot2); } #endif /*FX_DELBLINES*/ #if FX_KLINE /* EFUN: "Kill Line" */ f_kline() { if(exp_p) e_goline(exp); /* Move that many lines */ /* (if 0, goes to BOL) */ else /* No arg, handle specially */ { if(e_lblankp()) /* Is rest of line blank? */ ; /* Yes, now at next line! */ else e_goeol(); /* No, go to EOL rather than NL */ } ed_kill(cur_dot,e_dot()); e_setcur(); this_cmd = KILLCMD; } #endif /*FX_KLINE*/ #if FX_BKLINE /* EFUN: "Backward Kill Line" (not EMACS) */ /* Originally an Iconographics function. */ f_bkline() { if(exp_p) exp = -exp; /* If arg, invert it */ else { exp = 0; /* No arg, furnish 0 */ exp_p = 1; } f_kline(); /* Invoke "Kill Line" */ } #endif /*FX_BKLINE*/ #if FX_GOLINE /* EFUN: "Goto Line" (not EMACS) (GNU goto-line) */ f_goline() { e_gobob(); down_bline(exp-1); /* already at line 1 */ } #endif /*FX_GOLINE*/ down_bline(arg) int arg; { if(arg) e_goline(arg); ed_setcur(); } #if FX_DNRLINE || FX_UPRLINE down_line (x) int x; { register int i, res; res = x ? e_goline(x) : 1; /* Move that many lines */ goal = 0; if(res == 0) /* Hit buffer limits (EOF)? */ { if(x > 0) /* Moving downwards? */ { #if !(IMAGEN) /* If IMAGEN, do not extend!! */ if(x == 1) ed_crins(); /* Yeah, maybe extend */ else #endif goal = indtion(cur_dot); goto done; } } if(last_cmd == LINECMD /* If previous cmd also a line move */ && pgoal != -1) /* and we have a previous goal col */ goal = pgoal; /* then make it the current goal */ else goal = indtion(cur_dot); /* Else invent goal from current pos */ i = inindex(e_dot(), goal); /* See # chars needed to reach goal */ if(i == -1) /* If off edge of line, */ e_goeol(); /* just move to end of this line */ else e_igoff(i); /* else move to goal. */ done: pgoal = goal; this_cmd = LINECMD; ed_setcur(); } #endif /*FX_DNRLINE || FX_UPRLINE*/ /* Region Handling functions */ /* EFUN: "Set/Pop Mark" */ f_setmark() { mark_dot = e_dot(); mark_p = 1; if(ev_markshow) /* If have one, show indicator */ saytoo(ev_markshow); /* that mark was set. */ } /* EFUN: "Exchange Point and Mark" */ f_exchmark() { chroff tmpdot; if(chkmark()) { tmpdot = mark_dot; mark_dot = cur_dot; ed_go(tmpdot); /* Set cur_dot and go there */ } } /* EFUN: "Kill Region" */ f_kregion() { if(chkmark()) { ed_kill(cur_dot,mark_dot); /* Will adj cur_dot, mark_dot */ e_gocur(); this_cmd = KILLCMD; } } /* EFUN: "Copy Region" */ f_copreg() { if(chkmark()) { e_gocur(); kill_push(e_copyn(mark_dot - cur_dot)); e_gocur(); } } /* EFUN: "Uppercase Region" */ f_ucreg() { ef_creg(0); } /* EFUN: "Lowercase Region" */ f_lcreg() { ef_creg(1); } ef_creg(downp) int downp; { if(chkmark()) ed_case(cur_dot,mark_dot,downp); } #if FX_FILLREG /* EFUN: "Fill Region" */ f_fillreg() { if(chkmark()) ed_fill(mark_dot,cur_dot,0); } #endif /*FX_FILLREG*/ /* CHKMARK() - minor utility for region-hacking functions. * Returns TRUE if mark exists. * Otherwise complains to user and returns 0. */ chkmark() { if(mark_p == 0) ding("No mark!"); return(mark_p); } /* Paragraph functions */ #if FX_FPARA /* EFUN: "Forward Paragraph" */ f_fpara() { int e_gobpa(), e_goepa(); exp_do(e_goepa, e_gobpa); ed_setcur(); } #endif /*FX_FPARA*/ #if FX_BPARA /* EFUN: "Backward Paragraph" */ /* Go to beginning of paragraph. * Skip all whitespace until text seen, then stop at beginning of * 1st line starting with whitespace. */ f_bpara() { int e_gobpa(), e_goepa(); exp_do(e_gobpa, e_goepa); ed_setcur(); } #endif /*FX_BPARA*/ #if FX_MRKPARA /* EFUN: "Mark Paragraph" */ f_mrkpara() { f_fpara(); /* Go to end of paragraph */ f_setmark(); /* Put mark there */ f_bpara(); /* Then back to start of paragraph */ } #endif /*FX_MRKPARA*/ #if FX_FILLPARA /* EFUN: "Fill Paragraph" */ f_fillpara() { chroff savloc, endloc; savloc = cur_dot; #if ICONOGRAPHICS e_getc(); /* DON'T go to next para if at end */ e_gobpa(); /* of this one!! */ #endif /*ICONOGRAPHICS*/ e_goepa(); /* Go to end of parag */ if(e_rgetc() != LF) /* If last char EOL, back over it. */ e_getc(); endloc = e_dot(); /* Remember where end is */ e_gobpa(); /* Go to beg of parag */ #if ICONOGRAPHICS kill_push(e_copyn(endloc - e_dot ())); /* put old version on kill ring */ #endif /*ICONOGRAPHICS*/ e_fwsp(); /* Move over initial whitespace */ ed_fill(e_dot(), endloc, 0); /* Fill this region, return to dot */ } #endif /*FX_FILLPARA*/ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEF3 Various Functions (Yanking, Indentation, miscellaneous) */ #include "elle.h" #if FX_APPNKILL /* EFUN: "Append Next Kill" */ f_appnkill() { this_cmd = KILLCMD; /* Fake out next call to ed_kill */ } #endif /*FX_APPNKILL*/ #if FX_UNKILL /* EFUN: "Un-kill" */ f_unkill() { register SBSTR *sd; if((sd = kill_ring[kill_ptr]) == 0) { ring_bell(); return; } mark_dot = cur_dot; /* Set mark at old location */ mark_p = 1; /* Mark's been set */ sb_sins((SBBUF *)cur_buf,sbs_cpy(sd)); /* Insert copy of stuff */ cur_dot = e_dot(); /* We're now after the new stuff */ buf_tmat(mark_dot); /* Say modified from here to cur_dot*/ this_cmd = YANKCMD; } #endif /*FX_UNKILL*/ #if FX_UNKPOP /* EFUN: "Un-kill Pop" */ f_unkpop() { register SBSTR *sd; register int i; if (last_cmd != YANKCMD) { ring_bell (); return; } ed_delete(cur_dot,mark_dot); if(cur_dot > mark_dot) cur_dot = mark_dot; i = KILL_LEN; do { if(--kill_ptr < 0) kill_ptr = KILL_LEN-1; if(sd = kill_ring[kill_ptr]) break; } while(--i); /* kill_ptr now pointing to right place; effect the yank. */ e_gocur(); /* Make sure point at right place too! */ return(f_unkill()); } #endif /*FX_UNKPOP*/ /* Indentation routines - still not polished */ #if FX_INDATM /* EFUN: "Indent According to Mode" */ /* In Fundamental mode, just inserts a tab. */ f_indatm() { f_insself(TAB); /* This takes care of mode checking */ } #endif /*FX_INDATM*/ #if FX_INDNL /* EFUN: "Indent New Line" */ f_indnl() /* execute CR followed by tab */ { #if IMAGEN /* Not dispatch-based, but rather hard-wired to do Gosmacs thing */ ed_crins(); f_indund(); #else cmd_xct(CR); cmd_xct(TAB); #endif /*-IMAGEN*/ } #endif /*FX_INDNL*/ #if FX_BACKIND /* EFUN: "Back to Indentation" ** Moves to end of current line's indentation. */ f_backind() { e_gobol(); /* First move to beg of line */ e_gofwsp(); /* Then forward over whitespace */ ed_setcur(); } #endif /*FX_BACKIND*/ #if FX_INDCOMM static char *comm_beg = "/* "; static char *comm_end = " */"; /* EFUN: "Indent for Comment" */ f_indcomm() { f_endline(); if(indtion(cur_dot) < ev_ccolumn) ed_indto(ev_ccolumn); else ed_sins(" "); ed_sins (comm_beg); ed_sins (comm_end); e_igoff(-strlen (comm_end)); /* back over end string */ e_setcur(); } #endif /*FX_INDCOMM*/ #if FX_INDREL /* EFUN: "Indent Relative" */ /* This used to mistakenly be called Indent Under. ** Still not fully implemented. ** If at beginning of line, looks back at previous indented line, ** and indents this line that much. If there is no preceding indented ** line or not at beginning of line, insert a tab. */ f_indrel() { register int c; register n; #if IMAGEN chroff savdot; #endif /*IMAGEN*/ #if ICONOGRAPHICS chroff savdot; int curind, newind, morebuf; #endif /*ICONOGRAPHICS*/ if((c = e_rgetc()) == EOF) #if IMAGEN return(f_insself(TAB)); /* Do mode-based tabbing */ #else return(ed_insert(TAB)); #endif /*-IMAGEN*/ if(c == LF) { e_gobol(); e_gofwsp(); n = d_curind(); e_gonl(); /* Return to orig pos */ if(n) { ed_indto(n); #if IMAGEN savdot = e_dot(); e_gofwsp(); ed_delete(savdot, e_dot()); #endif /*IMAGEN*/ return; } } #if ICONOGRAPHICS else { e_igoff (1); curind = indtion (savdot = e_dot ()); /* get current dot and indentation */ while (1) /* find a prev line that extends rightward */ { morebuf = e_gopl (); e_goeol (); if ((newind = d_curind()) > curind) break; if (morebuf == 0) /* hit beginning of buffer */ { e_go (savdot); f_delspc(); return (1); } } e_gobol (); e_igoff (inindex (e_dot (), curind)); if (d_curind() > curind) e_rgetc (); /* pushed ahead by tab */ while (c_wsp (e_getc ()) == 0) ; e_backc (); e_fwsp (); newind = d_curind(); e_go (savdot); f_delspc(); ed_indto (newind); } #else else e_getc(); #if IMAGEN f_insself(TAB); /* Do mode-based tabbing */ #else ed_insert(TAB); #endif /*-IMAGEN*/ #endif /*-ICONOGRAPHICS*/ } #endif /*FX_INDREL*/ /* Paren matching stuff. Note that this stuff will be very painful unless ** tinwait() works properly. */ #if 0 /* EFUN: "Self-Insert and Match" (intended to be bound to brackets) */ /* (KLH: Evidently this was never finished) */ insertmatch(c) register int c; { } #endif /* Should change this to Matching Paren */ #if FX_MATCHBRACK /* EFUN: "Match Bracket" (not EMACS) - from IMAGEN config * Show the matching bracket for the character right before dot */ f_matchbrack() { chroff savdot; register int i, mc, secs; if (exp_p) secs = exp; else secs = 1; savdot = cur_dot; /* Save our location */ mc = e_rgetc(); /* Pick up character before dot */ if (mc != ')' && mc != ']' && mc != '}') { e_getc(); /* Nothing, try at dot instead */ e_getc(); mc = e_rgetc(); if (mc != ')' && mc != ']' && mc != '}') { ding("What bracket?"); e_go(savdot); return; } } if (! matchonelevel(mc)) ring_bell(); else { ed_setcur(); if (d_line(cur_dot) < 0) secs = 10; /* Wait longer if off-screen */ redisplay(); /* Wish it were simple upd_wind() */ for (i = 1; i <= secs; ++i) { if (tinwait()) break; sleep(1); } } e_gosetcur(savdot); /* Back to origin */ redp(RD_MOVE); /* Cursor has moved */ } /* Try to match 'mc', return true iff found it */ matchonelevel(mc) register int mc; { register int c; while ((c = e_rgetc()) != EOF) { if (c == /*[*/ ']' || c == /*(*/ ')' || c == /*{*/ '}') { if (! matchonelevel(c)) break; } else if (c == '(' /*)*/) return(mc == /*(*/ ')'); else if (c == '[' /*]*/) return(mc == /*[*/ ']'); else if (c == '{' /*}*/) return(mc == /*{*/ '}'); } return(0); } #endif /*FX_MATCHBRACK*/ /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEFD Display control functions */ #include "elle.h" #if FX_NEWWIN /* EFUN: "New Window" */ /* Clear current window and set as requested. * ^L - clear current window and redisplay it (default top) * ^L - select new window so that current line is * the 'th from top of window (0 = top line) * ^U^L - clear current line and redisplay. */ f_newwin() { register int i, n; register struct window *w; d_fixcur(); /* Ensure screen vars correct */ w = cur_win; if (exp_p) { if((n = exp) == 4 && exp_p == 4 /* CTRL-U? */ && (i = d_line(cur_dot)) >= 0) /* On valid line? */ { d_lupd(w, i); /* Update it */ return; } } else /* No argument given */ { redp(RD_SCREEN); /* Clear whole screen (later just window? */ #if IMAGEN return; #else n = (ev_nwpct*w->w_ht)/100; /* Set new window using % */ #endif /*-IMAGEN*/ } if (n < 0) n = 0; /* Ensure # is reasonable */ else if (n >= w->w_ht) n = w->w_ht - 1; d_fgoloff(-n); /* Go up given # of lines */ w->w_topldot = e_dot(); /* Set new top-line dot */ e_gocur(); /* Move back to cur_dot */ redp(RD_FIXWIN); /* Say to re-hack window */ } #endif /*FX_NEWWIN*/ #if FX_NSCREEN /* EFUN: "Next Screen" */ f_nscreen() { d_screen( exp); } #endif /*FX_NSCREEN*/ #if FX_PSCREEN /* EFUN: "Previous Screen" */ f_pscreen() { d_screen(-exp); } #endif /*FX_PSCREEN*/ #if FX_OTHNSCREEN /* EFUN: "Other New Screen" (not EMACS) - from IMAGEN config */ f_othnscreen() { if (! oth_win) return; f_othwind(); if (exp_p) /* With arg, back up */ d_screen(-1); else d_screen(1); f_othwind(); redp(RD_WINDS); /* Look at all windows */ } #endif /*FX_OTHNSCREEN*/ #if FX_LWINDBORD /* EFUN: "Line to Window Border" (not EMACS) - from IMAGEN config */ f_lwindbord() { if (exp_p) /* With arg, means "to bottom" */ exp = cur_win->w_ht - 1; else /* Else, to top */ exp = 0; /* Just a "front end" for ^L */ exp_p = 1; f_newwin(); } #endif /*FX_LWINDBORD*/ #if FX_SCUPWIND /* EFUN: "Scroll Window Up" (not EMACS) - from IMAGEN config */ f_scupwind() { scroll_win(exp); } #endif /*FX_SCUPWIND*/ #if FX_SCDNWIND /* EFUN: "Scroll Window Down" (not EMACS) - from IMAGEN config */ f_scdnwind() { scroll_win(-exp); } #endif /*FX_SCDNWIND*/ #if FX_MVWTOP /* EFUN: "Move to Window Top" (not EMACS) - from IMAGEN config */ f_mvwtop() { extern moveborder(); moveborder(1); } #endif /*FX_MVWTOP*/ #if FX_MVWBOT /* EFUN: "Move to Window Bottom" (not EMACS) - from IMAGEN config */ f_mvwbot() { extern moveborder(); moveborder(0); } #endif /*FX_MVWBOT*/ #if FX_NSCREEN || FX_PSCREEN || FX_OTHNSCREEN /* Move to new loc by N screenfuls. * If moving downward, keep bottom 2 lines of current screen on top of next. * If moving up, keep top 2 lines of current screen on bottom of next. */ d_screen(rep) int rep; { register int i; register struct window *w; chroff newdot; w = cur_win; if((i = w->w_ht - 2) <= 0) /* Just-in-case check */ i = 1; if((i *= rep) == 0) return; d_fixcur(); /* Ensure window fixed up */ e_go(w->w_topldot); /* Start at top of screen */ d_fgoloff(i); /* Find where we are now, and make that the new top of window. */ if((newdot = e_dot()) != e_blen()) /* If not at EOF, */ w->w_topldot = newdot; /* set new top of window! */ else w->w_topldot = 0; /* Else let fix_wind select top. */ e_setcur(); /* Ensure cur_dot set to real loc */ #if IMAGEN redp(RD_WINRES|RD_REDO); /* HINT: just repaint screen */ #else redp(RD_FIXWIN|RD_MOVE); #endif /*-IMAGEN*/ } #endif /*FX_NSCREEN || FX_PSCREEN || FX_OTHNSCREEN*/ #if FX_SCUPWIND || FX_SCDNWIND /* If want scroll-window function */ scroll_win(n) register int n; { register struct window *w = cur_win; chroff savdot; if (n == 0) return; d_fixcur(); /* Ensure screen vars for win all set up */ e_go(w->w_topldot); /* Go to top of current window */ d_fgoloff(n); /* Move given # of display lines */ w->w_topldot = e_dot(); /* Set new top of window */ redp(RD_FIXWIN); /* Say new window needs fixing up */ /* Now adjust position of current dot so it is still within window */ if (n > 0) { /* Moving screen text "up" (win down) */ if (cur_dot < w->w_topldot) /* See if scrolled off top */ e_setcur(); /* yes, make dot be win top */ } else { /* Moving screen text "down" (win up) */ savdot = cur_dot; /* Save since must temporarily */ e_setcur(); /* set current dot within window, */ d_fixcur(); /* so screen can be fixed up. */ if (inwinp(w, savdot)) /* Now see if old dot in new win */ cur_dot = savdot; /* Yes, just restore it! */ else /* No, make it beg of bottom line. */ cur_dot = scr[w->w_pos + w->w_ht - 1]->sl_boff; } e_gocur(); /* Make current pos be cur_dot */ } #endif /* FX_SC%%WIND */ #if FX_MVWTOP || FX_MVWBOT /* Guts for above two functions */ static moveborder(top) int top; { d_fixcur(); /* Ensure current win screen image fixed up */ e_gosetcur(top ? cur_win->w_topldot : scr[cur_win->w_pos + cur_win->w_ht - 1]->sl_boff); redp(RD_MOVE); /* Should only be cursor adjustment */ } #endif /*FX_MVW%%%*/ /* Given a line and a position in that line, return the xpos. * NOTE CAREFULLY that when line extends over several screen lines, * the value returned is the screen X position even though it * may be some lines down from the start of the logical line! * Also note this won't work very well if tabs exist on the extra * lines. This rtn should not be used for cursor positioning. * Also note: d_ncols() will never return -1 meaning EOL because the * setup guarantees there is no EOL within the range checked. */ d_curind() /* Find current indentation */ { indtion(e_dot()); } indtion(lin) chroff lin; { register int i, col; chroff savdot; chroff nchars; savdot = e_dot(); /* Save current position */ e_go(lin); /* Go to line caller wants */ e_gobol(); /* Go to its beginning */ col = 0; /* Start at left margin */ if((nchars = lin - e_dot()) > 0) do { if(nchars < (i = scr_wd0)) i = nchars; if((col = d_ncols(i, col)) < 0) /* Hit edge of screen? */ col = 0; /* Reset to left margin */ } while((nchars -= i) > 0); e_go(savdot); /* Restore current position */ return(col); } /* ININDEX - How many positions in lin must we go to get to xpos? * Returns -1 if can't be done. Assumes "lin" is at beginning of a line! */ inindex (lin, xpos) chroff lin; int xpos; { register int col, x; chroff savdot; char tmp[MAXLINE+MAXCHAR]; extern int sctreol; /* From EEDISP */ if((x = xpos) <= 0) return(0); if(x >= MAXLINE) return(-1); /* ?!? */ col = 0; savdot = e_dot(); e_go(lin); /* Assumes this is start of line */ col = sctrin(tmp, x, 0); /* Translate from sb_getc input */ if((col - x) >= 0) /* Exact count-out or past it? */ { x = e_dot() - lin; /* Yup, win. */ if (sctreol > 0) /* Did we hit (and include) EOL? */ #if FX_EOLMODE /* If so, back up over the EOL. */ x -= eolcrlf(cur_buf) ? 2 : 1; #else --x; #endif } else x = -1; /* Nope, EOL or EOF hit too soon. */ e_go(savdot); return(x); } /* * D_ ROUTINES - display-relative functions. Similar to E_, but * a "line" is defined as one line of the screen rather than * as a logical text line. Also, for efficiency reasons * arguments are given saying how many lines to hack. */ d_gopl() { return(d_goloff(-1)); } d_gonl() { return(d_goloff( 1)); } /* D_GOLOFF(i) - Go to beginning of a display line * D_FGOLOFF(i) - ditto, but assumes screen image of window already fixed up. * i - # of lines offset. Negative moves up, positive down. * Zero arg goes to beginning of current display line. * Side effects: screen image of window is fixed up at * start of routine, but is NOT updated by the move to new location. */ d_goloff(cnt) int cnt; { d_fixcur(); d_fgoloff(cnt); /* Now can invoke fixed-up fast version */ } d_fgoloff(cnt) register int cnt; { register int y; struct scr_line l; char line[MAXL>>>>>INE+MAXCHAR]; int top, bot; /* Find current position in window, since can save time * by using stuff already in fixed-up screen image. */ if((y = d_line(e_dot())) < 0) /* Get current Y position */ { errbarf("Dot out of window"); y = 0; } top = cur_win->w_pos; /* 1st line of window */ bot = top + cur_win->w_ht; /* 1st line not in window */ l.sl_boff = scr[y]->sl_boff; l.sl_nlin = &line[0]; l.sl_cont = 0; if(cnt > 0) goto down; /* Go upwards. This is hairy because we want to be clever about * huge logical lines -- avoid going all the way back to BOL. */ if((y+cnt) >= top) /* Fits? */ goto onscr; /* Hurray, hack it! */ cnt += y - top; /* Sigh, find # lines to skip */ y = top; l.sl_boff = scr[y]->sl_boff; e_go(l.sl_boff); /* Okay, here's the hairy part. Must go backwards from top * line; if no EOL within scr_wid*cnt chars, then simply assume one is * seen. */ cnt = -cnt; d_backup(cnt); return; /* Really should re-adjust stuff, but... */ /* Go downwards. Not too bad... */ down: if((y+cnt) <= bot) /* Fits? */ goto onscr; /* Hurray, hack it! */ cnt -= bot - y; /* Sigh, find # lines can skip */ y = bot - 1; l.sl_boff = scr[y]->sl_boff + scr[y]->sl_len; if(y > top && (l.sl_cont = scr[y-1]->sl_cont)) l.sl_line = scr[y-1]->sl_line; e_go(l.sl_boff); do { fix_line(&l,&l); } while(--cnt > 0 && l.sl_len); return; onscr: if((y += cnt) >= bot) { --y; e_go(scr[y]->sl_boff + scr[y]->sl_len); } else e_go(scr[y]->sl_boff); } /* D_FIXCUR() - Ensure current window is fixed up, with * current location (not necessarily cur_dot)! * Ensure cur_dot reflects real loc so that fix_wind will work, * and always call fix_wind to ensure that screen image vars * are set properly. Note any active redisplay flags must be carried * on into window redisplay flags, so fix_wind will notice them. */ d_fixcur() { register struct window *w; chroff savedot; w = cur_win; savedot = cur_dot; e_setcur(); w->w_redp |= rd_type&RDS_WINFLGS; fix_wind(w); /* Always ensure window is set up! */ redp(w->w_redp); /* Add back new flags */ rd_type &= ~RDS_DOFIX; /* and flush fix-invoking ones */ cur_dot = savedot; /* Restore cur_dot, no longer hacked. */ } d_backup(nlin) /* Try to back up by nlin screen lines */ int nlin; { register int cnt, n, c; int eolstop; if((cnt = nlin+1) <= 0) return; c = 0; do { n = scr_wid; eolstop = 0; /* Not yet stopped at EOL */ do { if((c = e_rgetc()) == EOF) return; if(c == LF) { #if FX_EOLMODE if(eolcrlf(cur_buf)) { if((c = e_rgetc()) == CR) { eolstop++; break; } if(c != EOF) e_getc(); } else #endif { eolstop++; break; } } } while(--n); } while(--cnt); if(eolstop) { #if FX_EOLMODE if(eolcrlf(cur_buf)) e_getc(); /* Skip back over CR */ #endif e_getc(); /* Skip back over LF */ } /* At this point, dot is guaranteed to be less than goal, * which is the important thing for fix_wind, which can handle * things okay if dot is off bottom of window. */ return(1); /* Say always test result */ } /* .H Function Definition file, generated by ELLEC */ /* 0 */ EFUNHOLE /* Always undefined */ /* 1 */ EFUN( f_insself , "f_insself" , "Insert Self") /* 2 */ EFUN( f_quotins , "f_quotins" , "Quoted Insert") /* 3 */ EFUN( f_crlf , "f_crlf" , "CRLF") /* 4 */ EFUN( f_fchar , "f_fchar" , "Forward Character") /* 5 */ EFUN( f_bchar , "f_bchar" , "Backward Character") /* 6 */ EFUN( f_dchar , "f_dchar" , "Delete Character") /* 7 */ EFUN( f_bdchar , "f_bdchar" , "Backward Delete Character") /* 8 */ EFUN( f_delspc , "f_delspc" , "Delete Horizontal Space") /* 9 */ EFUN( f_tchars , "f_tchars" , "Transpose Characters") /* 10 */ EFUN( f_fword , "f_fword" , "Forward Word") /* 11 */ EFUN( f_bword , "f_bword" , "Backward Word") /* 12 */ EFUN( f_kword , "f_kword" , "Kill Word") /* 13 */ EFUN( f_bkword , "f_bkword" , "Backward Kill Word") /* 14 */ EFUN( f_twords , "f_twords" , "Transpose Words") /* 15 */ EFUN( f_ucword , "f_ucword" , "Uppercase Word") /* 16 */ EFUN( f_lcword , "f_lcword" , "Lowercase Word") /* 17 */ EFUN( f_uciword , "f_uciword" , "Uppercase Initial") /* 18 */ EFUNHOLE /* 19 */ EFUNHOLE /* 20 */ EFUN( f_begline , "f_begline" , "Beginning of Line") /* 21 */ EFUN( f_endline , "f_endline" , "End of Line") /* 22 */ EFUN( f_nxtline , "f_nxtline" , "Next Line") /* 23 */ EFUN( f_prvline , "f_prvline" , "Previous Line") /* 24 */ EFUN( f_dnrline , "f_dnrline" , "Down Real Line") /* 25 */ EFUN( f_uprline , "f_uprline" , "Up Real Line") /* 26 */ EFUN( f_oline , "f_oline" , "Open Line") /* 27 */ EFUN( f_delblines , "f_delblines" , "Delete Blank Lines") /* 28 */ EFUN( f_kline , "f_kline" , "Kill Line") /* 29 */ EFUN( f_bkline , "f_bkline" , "Backward Kill Line") /* 30 */ EFUN( f_goline , "f_goline" , "Goto Line") /* 31 */ EFUNHOLE /* 32 */ EFUNHOLE /* 33 */ EFUNHOLE /* 34 */ EFUNHOLE /* 35 */ EFUN( f_setmark , "f_setmark" , "Set/Pop Mark") /* 36 */ EFUN( f_exchmark , "f_exchmark" , "Exchange Point and Mark") /* 37 */ EFUN( f_kregion , "f_kregion" , "Kill Region") /* 38 */ EFUN( f_copreg , "f_copreg" , "Copy Region") /* 39 */ EFUN( f_ucreg , "f_ucreg" , "Uppercase Region") /* 40 */ EFUN( f_lcreg , "f_lcreg" , "Lowercase Region") /* 41 */ EFUN( f_fillreg , "f_fillreg" , "Fill Region") /* 42 */ EFUNHOLE /* 43 */ EFUNHOLE /* 44 */ EFUNHOLE /* 45 */ EFUN( f_fpara , "f_fpara" , "Forward Paragraph") /* 46 */ EFUN( f_bpara , "f_bpara" , "Backward Paragraph") /* 47 */ EFUN( f_mrkpara , "f_mrkpara" , "Mark Paragraph") /* 48 */ EFUN( f_fillpara , "f_fillpara" , "Fill Paragraph") /* 49 */ EFUNHOLE /* 50 */ EFUN( f_selbuffer , "f_selbuffer" , "Select Buffer") /* 51 */ EFUN( f_selxbuffer, "f_selxbuffer", "Select Existing Buffer") /* 52 */ EFUN( f_kbuffer , "f_kbuffer" , "Kill Buffer") /* 53 */ EFUN( f_listbufs , "f_listbufs" , "List Buffers") /* 54 */ EFUN( f_bufnotmod , "f_bufnotmod" , "Buffer Not Modified") /* 55 */ EFUN( f_eolmode , "f_eolmode" , "EOL CRLF Mode") /* 56 */ EFUN( f_gobeg , "f_gobeg" , "Goto Beginning") /* 57 */ EFUN( f_goend , "f_goend" , "Goto End") /* 58 */ EFUN( f_whatpage , "f_whatpage" , "What Page") /* 59 */ EFUNHOLE /* 60 */ EFUN( f_ffile , "f_ffile" , "Find File") /* 61 */ EFUN( f_rfile , "f_rfile" , "Read File") /* 62 */ EFUN( f_vfile , "f_vfile" , "Visit File") /* 63 */ EFUN( f_ifile , "f_ifile" , "Insert File") /* 64 */ EFUN( f_sfile , "f_sfile" , "Save File") /* 65 */ EFUN( f_savefiles , "f_savefiles" , "Save All Files") /* 66 */ EFUN( f_wfile , "f_wfile" , "Write File") /* 67 */ EFUN( f_wreg , "f_wreg" , "Write Region") /* 68 */ EFUN( f_wlastkill , "f_wlastkill" , "Write Last Kill") /* 69 */ EFUNHOLE /* 70 */ EFUN( f_2winds , "f_2winds" , "Two Windows") /* 71 */ EFUN( f_1wind , "f_1wind" , "One Window") /* 72 */ EFUN( f_othwind , "f_othwind" , "Other Window") /* 73 */ EFUN( f_growind , "f_growind" , "Grow Window") /* 74 */ EFUN( f_shrinkwind, "f_shrinkwind", "Shrink Window") /* 75 */ EFUN( f_delwind , "f_delwind" , "Delete Window") /* 76 */ EFUN( f_sowind , "f_sowind" , "Standout Window") /* 77 */ EFUN( f_2modewinds, "f_2modewinds", "Two Mode Windows") /* 78 */ EFUN( f_newwin , "f_newwin" , "New Window") /* 79 */ EFUN( f_nscreen , "f_nscreen" , "Next Screen") /* 80 */ EFUN( f_pscreen , "f_pscreen" , "Previous Screen") /* 81 */ EFUNHOLE /* 82 */ EFUNHOLE /* 83 */ EFUN( f_scupwind , "f_scupwind" , "Scroll Window Up") /* 84 */ EFUN( f_scdnwind , "f_scdnwind" , "Scroll Window Down") /* 85 */ EFUN( f_mvwtop , "f_mvwtop" , "Move to Window Top") /* 86 */ EFUN( f_mvwbot , "f_mvwbot" , "Move to Window Bottom") /* 87 */ EFUNHOLE /* 88 */ EFUNHOLE /* 89 */ EFUNHOLE /* 90 */ EFUN( f_setprof , "f_setprof" , "Set Profile") /* 91 */ EFUN( f_pfxmeta , "f_pfxmeta" , "Prefix Meta") /* 92 */ EFUN( f_pfxext , "f_pfxext" , "Prefix Extend") /* 93 */ EFUN( f_uarg , "f_uarg" , "Universal Arg") /* 94 */ EFUN( f_negarg , "f_negarg" , "Negative Argument") /* 95 */ EFUN( f_argdig , "f_argdig" , "Argument Digit") /* 96 */ EFUN( f_vtbuttons , "f_vtbuttons" , "VT100 Button Hack") /* 97 */ EFUN( f_describe , "f_describe" , "Describe") /* 98 */ EFUNHOLE /* 99 */ EFUNHOLE /* 100 */ EFUN( f_skmac , "f_skmac" , "Start Kbd Macro") /* 101 */ EFUN( f_ekmac , "f_ekmac" , "End Kbd Macro") /* 102 */ EFUN( f_xkmac , "f_xkmac" , "Execute Kbd Macro") /* 103 */ EFUN( f_vkmac , "f_vkmac" , "View Kbd Macro") /* 104 */ EFUNHOLE /* 105 */ EFUN( f_unkill , "f_unkill" , "Un-kill") /* 106 */ EFUN( f_unkpop , "f_unkpop" , "Un-kill Pop") /* 107 */ EFUN( f_appnkill , "f_appnkill" , "Append Next Kill") /* 108 */ EFUNHOLE /* 109 */ EFUNHOLE /* 110 */ EFUN( f_srch , "f_srch" , "String Search") /* 111 */ EFUN( f_rsrch , "f_rsrch" , "Reverse String Search") /* 112 */ EFUN( f_isrch , "f_isrch" , "Incremental Search") /* 113 */ EFUN( f_risrch , "f_risrch" , "Reverse Search") /* 114 */ EFUN( f_repstr , "f_repstr" , "Replace String") /* 115 */ EFUN( f_querep , "f_querep" , "Query Replace") /* 116 */ EFUN( f_repline , "f_repline" , "Replace in Line") /* 117 */ EFUN( f_sfcol , "f_sfcol" , "Set Fill Column") /* 118 */ EFUN( f_sfpref , "f_sfpref" , "Set Fill Prefix") /* 119 */ EFUN( f_fillmode , "f_fillmode" , "Auto Fill Mode") /* 120 */ EFUNHOLE /* 121 */ EFUN( f_indatm , "f_indatm" , "Indent According to Mode") /* 122 */ EFUN( f_indnl , "f_indnl" , "Indent New Line") /* 123 */ EFUN( f_backind , "f_backind" , "Back to Indentation") /* 124 */ EFUN( f_indcomm , "f_indcomm" , "Indent for Comment") /* 125 */ EFUN( f_indrel , "f_indrel" , "Indent Relative") /* 126 */ EFUNHOLE /* 127 */ EFUNHOLE /* 128 */ EFUNHOLE /* 129 */ EFUNHOLE /* 130 */ EFUN( f_pshinf , "f_pshinf" , "Push to Inferior") /* 131 */ EFUN( f_retsup , "f_retsup" , "Return to Superior") /* 132 */ EFUN( f_wfexit , "f_wfexit" , "Write File Exit") /* 133 */ EFUNHOLE /* 134 */ EFUNHOLE /* 135 */ EFUNHOLE /* 136 */ EFUNHOLE /* 137 */ EFUNHOLE /* 138 */ EFUNHOLE /* 139 */ EFUNHOLE /* 140 */ EFUN( f_bkpt , "f_bkpt" , "Hit Breakpoint") /* 141 */ EFUN( f_debug , "f_debug" , "Debug Mode") /* 142 */ EFUNHOLE /* 143 */ EFUNHOLE /* 144 */ EFUNHOLE /* 145 */ EFUNHOLE /* 146 */ EFUNHOLE /* 147 */ EFUNHOLE /* 148 */ EFUNHOLE /* 149 */ EFUNHOLE /* 150 */ EFUNHOLE /* 151 */ EFUNHOLE /* 152 */ EFUNHOLE /* 153 */ EFUNHOLE /* 154 */ EFUNHOLE /* 155 */ EFUNHOLE /* 156 */ EFUNHOLE /* 157 */ EFUNHOLE >/* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEFED - ED-type functions */ #include "elle.h" /* * ED_INSERT -- Insert character given as argument. */ ed_insert(c) int c; { register SBBUF *sb; sb = (SBBUF *) cur_buf; /* For a little speed */ sb_putc(sb,c); /* Insert the char */ cur_dot++; /* Advance dot */ buf_tmod((chroff)-1); /* Mark buffer modified, for redisplay etc. */ /* Perhaps later use specialized routine? */ } ed_insn(ch, cnt) int ch, cnt; { register int i; if((i = cnt) > 0) do { ed_insert(ch); } while(--i); } ed_crins() { #if FX_EOLMODE if (eolcrlf(cur_buf)) /* If EOL is made of CR-LF */ ed_insert(CR); /* then first insert CR, then drop down to */ #endif ed_insert(LF); /* Insert LF */ } ed_sins (s) /* insert this string */ register char *s; { register c; while (c = *s++) ed_insert (c); } ed_nsins (s, i) /* Insert string of N chars */ register char *s; register int i; { if(i > 0) do { ed_insert(*s++); } while(--i); } /* ED_INDTO(col) - Indent to specified column. ** Finds current cursor position, and inserts tabs and spaces ** so cursor ends up at column goal. Does nothing if already at or past ** specified column. */ ed_indto(goal) register int goal; { register int ng; ng = goal & ~07; /* Get distance to tab stop */ ed_insn(TAB, ((ng - (d_curind() & ~07)) >> 3)); ed_insn(SP, goal-ng); } /* Oddball routine - Set cur_dot to actual I/O location and * tell display that cursor probably moved. This is not really a * function of itself; it provides support for real functions. */ ed_setcur() { e_setcur(); /* Set cur_dot */ redp(RD_MOVE); /* Alert redisplay to check cursor loc */ } /* Go to given dot */ ed_go (dot) chroff dot; { e_go(dot); ed_setcur(); } /* Go to given offset from current location */ ed_goff(off) chroff off; { e_goff(off); ed_setcur(); } /* Go to given INTEGER offset from current location */ ed_igoff(ioff) int ioff; { e_igoff(ioff); ed_setcur(); } /* Reset (delete all of) Buffer * Should buffer be marked modified or not? Currently isn't. */ ed_reset() { if(e_blen() == 0) return; /* Already empty */ e_reset(); cur_dot = 0; cur_win->w_topldot = 0; /* Is this necessary? */ #if IMAGEN redp(RD_WINRES|RD_REDO); #else redp(RD_WINRES); /* This window needs complete update */ #endif /*-IMAGEN*/ /* buf_mod(); */ /* Mark modified ?? */ /* mark_p = 0; */ /* Say no mark set ?? */ } ed_deln(off) chroff off; { chroff dot; dot = e_dot(); e_goff(off); ed_delete(e_dot(), dot); } /* ED_DELETE(dot1,dot2) - Delete all characters between the two * positions indicated by dot1 and dot2. Their order does not * matter; cur_dot and mark_dot are updated as necessary. */ ed_delete(dot1,dot2) chroff dot1,dot2; { chroff tmpdot, savdot; if(dot1 > dot2) { tmpdot = dot1; dot1 = dot2; dot2 = tmpdot; } e_go(dot1); tmpdot = dot2-dot1; sb_deln((SBBUF *)cur_buf,tmpdot); savdot = cur_dot; /* Save cur_dot value */ cur_dot = dot1; /* so can set up for */ buf_tmod((chroff)0); /* call to update disp-change vars */ cur_dot = savdot; if(cur_dot >= dot2) cur_dot -= tmpdot; else if(cur_dot > dot1) cur_dot = dot1; if(mark_dot >= dot2) mark_dot -= tmpdot; else if(mark_dot > dot1) mark_dot = dot1; e_gocur(); } /* ED_KILL(dot1,dot2) - Kill (save and delete) text between two places in * the buffer. * We assume we are deleting from dot1 to dot2, thus if dot1 > dot2 * then backwards deletion is implied, and the saved text is prefixed * (instead of appended) to any previously killed text. */ ed_kill(dot1,dot2) chroff dot1,dot2; { register SBSTR *sd, *sdo; SBSTR *e_copyn(); e_go(dot1); sd = e_copyn(dot2-dot1); if(sd == 0) return; if(last_cmd == KILLCMD && (sdo = kill_ring[kill_ptr])) { if(dot1 > dot2) /* Prefix new killed stuff onto old stuff */ { sbs_app(sd,sdo); kill_ring[kill_ptr] = sd; } else /* Append new stuff to old stuff */ sbs_app(sdo,sd); } else kill_push(sd); ed_delete(dot1,dot2); } kill_push(sdp) SBSTR *sdp; { register SBSTR *sd; if(++kill_ptr >= KILL_LEN) kill_ptr = 0; if(sd = kill_ring[kill_ptr]) sbs_del(sd); kill_ring[kill_ptr] = sdp; } #define isupper(c) (('A' <= c) && (c <= 'Z')) #define islower(c) (('a' <= c) && (c <= 'z')) #define toupper(c) (c + ('A' - 'a')) #define tolower(c) (c + ('a' - 'A')) #if FX_UCWORD||FX_LCWORD||FX_UCIWORD||FX_UCREG||FX_LCREG /* ED_CASE(dot1,dot2,downp) - Change the case within a region. * downp = 0 for uppercase, 1 for lowercase, 2 for capitalize. */ ed_case(dot1, dot2, downp) chroff dot1, dot2; int downp; { chroff dcnt; register int c, a, z; int modflg; modflg = 0; if((dcnt = dot2 - dot1) < 0) { dcnt = dot1; dot1 = dot2; dot2 = dcnt; dcnt -= dot1; } e_go(dot1); if(downp==2) { a = 0; /* 0 looking for wd, 1 in word */ while(--dcnt >= 0) { if(delimp(c = e_getc())) /* Char in wd? */ { a = 0; /* No */ continue; } if(a) /* If already inside word */ { if(isupper(c)) c = tolower(c); else continue; } else /* If encountered start of word */ { a = 1; if(islower(c)) c = toupper(c); else continue; } e_backc(); e_ovwc(c); modflg++; } goto casdon; } if(downp==0) { a = 'a'; /* Convert to lower case */ z = 'z'; downp = -040; } else { a = 'A'; /* Convert to upper case */ z = 'Z'; downp = 040; } while(--dcnt >= 0) { if(a <= (c = e_getc()) && c <= z) { e_backc(); e_ovwc(c+downp); modflg++; } } casdon: dot2 = cur_dot; /* Save dot */ e_setcur(); /* Set up for modification range chk*/ if(modflg) buf_tmat(dot1); /* Stuff munged from there to here */ ed_go(dot2); } #endif /* any ed_case caller */ /* UPCASE(c) - Return upper-case version of character */ upcase(ch) int ch; { register int c; c = ch&0177; return(islower(c) ? toupper(c) : c); } /* .H Function Index Definition file, generated by ELLEC */ /* FN_ defines Function Numbers (indices) for all known functions */ /* FX_ defines Function eXistence in this ELLE configuration */ #define FN_INSSELF 1 /* Insert Self */ #define FX_INSSELF 1 #define FN_QUOTINS 2 /* Quoted Insert */ #define FX_QUOTINS 2 #define FN_CRLF 3 /* CRLF */ #define FX_CRLF 3 #define FN_FCHAR 4 /* Forward Character */ #define FX_FCHAR 4 #define FN_BCHAR 5 /* Backward Character */ #define FX_BCHAR 5 #define FN_DCHAR 6 /* Delete Character */ #define FX_DCHAR 6 #define FN_BDCHAR 7 /* Backward Delete Character */ #define FX_BDCHAR 7 #define FN_DELSPC 8 /* Delete Horizontal Space */ #define FX_DELSPC 8 #define FN_TCHARS 9 /* Transpose Characters */ #define FX_TCHARS 9 #define FN_FWORD 10 /* Forward Word */ #define FX_FWORD 10 #define FN_BWORD 11 /* Backward Word */ #define FX_BWORD 11 #define FN_KWORD 12 /* Kill Word */ #define FX_KWORD 12 #define FN_BKWORD 13 /* Backward Kill Word */ #define FX_BKWORD 13 #define FN_TWORDS 14 /* Transpose Words */ #define FX_TWORDS 14 #define FN_UCWORD 15 /* Uppercase Word */ #define FX_UCWORD 15 #define FN_LCWORD 16 /* Lowercase Word */ #define FX_LCWORD 16 #define FN_UCIWORD 17 /* Uppercase Initial */ #define FX_UCIWORD 17 #define FN_BEGLINE 20 /* Beginning of Line */ #define FX_BEGLINE 20 #define FN_ENDLINE 21 /* End of Line */ #define FX_ENDLINE 21 #define FN_NXTLINE 22 /* Next Line */ #define FX_NXTLINE 22 #define FN_PRVLINE 23 /* Previous Line */ #define FX_PRVLINE 23 #define FN_DNRLINE 24 /* Down Real Line */ #define FX_DNRLINE 24 #define FN_UPRLINE 25 /* Up Real Line */ #define FX_UPRLINE 25 #define FN_OLINE 26 /* Open Line */ #define FX_OLINE 26 #define FN_DELBLINES 27 /* Delete Blank Lines */ #define FX_DELBLINES 27 #define FN_KLINE 28 /* Kill Line */ #define FX_KLINE 28 #define FN_BKLINE 29 /* Backward Kill Line */ #define FX_BKLINE 29 #define FN_GOLINE 30 /* Goto Line */ #define FX_GOLINE 30 #define FN_SETMARK 35 /* Set/Pop Mark */ #define FX_SETMARK 35 #define FN_EXCHMARK 36 /* Exchange Point and Mark */ #define FX_EXCHMARK 36 #define FN_KREGION 37 /* Kill Region */ #define FX_KREGION 37 #define FN_COPREG 38 /* Copy Region */ #define FX_COPREG 38 #define FN_UCREG 39 /* Uppercase Region */ #define FX_UCREG 39 #define FN_LCREG 40 /* Lowercase Region */ #define FX_LCREG 40 #define FN_FILLREG 41 /* Fill Region */ #define FX_FILLREG 41 #define FN_FPARA 45 /* Forward Paragraph */ #define FX_FPARA 45 #define FN_BPARA 46 /* Backward Paragraph */ #define FX_BPARA 46 #define FN_MRKPARA 47 /* Mark Paragraph */ #define FX_MRKPARA 47 #define FN_FILLPARA 48 /* Fill Paragraph */ #define FX_FILLPARA 48 #define FN_SELBUFFER 50 /* Select Buffer */ #define FX_SELBUFFER 50 #define FN_SELXBUFFER 51 /* Select Existing Buffer */ #define FX_SELXBUFFER 51 #define FN_KBUFFER 52 /* Kill Buffer */ #define FX_KBUFFER 52 #define FN_LISTBUFS 53 /* List Buffers */ #define FX_LISTBUFS 53 #define FN_BUFNOTMOD 54 /* Buffer Not Modified */ #define FX_BUFNOTMOD 54 #define FN_EOLMODE 55 /* EOL CRLF Mode */ #define FX_EOLMODE 55 #define FN_GOBEG 56 /* Goto Beginning */ #define FX_GOBEG 56 #define FN_GOEND 57 /* Goto End */ #define FX_GOEND 57 #define FN_WHATPAGE 58 /* What Page */ #define FX_WHATPAGE 58 #define FN_FFILE 60 /* Find File */ #define FX_FFILE 60 #define FN_RFILE 61 /* Read File */ #define FX_RFILE 61 #define FN_VFILE 62 /* Visit File */ #define FX_VFILE 62 #define FN_IFILE 63 /* Insert File */ #define FX_IFILE 63 #define FN_SFILE 64 /* Save File */ #define FX_SFILE 64 #define FN_SAVEFILES 65 /* Save All Files */ #define FX_SAVEFILES 65 #define FN_WFILE 66 /* Write File */ #define FX_WFILE 66 #define FN_WREG 67 /* Write Region */ #define FX_WREG 67 #define FN_WLASTKILL 68 /* Write Last Kill */ #define FX_WLASTKILL 68 #define FN_2WINDS 70 /* Two Windows */ #define FX_2WINDS 70 #define FN_1WIND 71 /* One Window */ #define FX_1WIND 71 #define FN_OTHWIND 72 /* Other Window */ #define FX_OTHWIND 72 #define FN_GROWIND 73 /* Grow Window */ #define FX_GROWIND 73 #define FN_SHRINKWIND 74 /* Shrink Window */ #define FX_SHRINKWIND 74 #define FN_DELWIND 75 /* Delete Window */ #define FX_DELWIND 75 #define FN_SOWIND 76 /* Standout Window */ #define FX_SOWIND 76 #define FN_2MODEWINDS 77 /* Two Mode Windows */ #define FX_2MODEWINDS 77 #define FN_NEWWIN 78 /* New Window */ #define FX_NEWWIN 78 #define FN_NSCREEN 79 /* Next Screen */ #define FX_NSCREEN 79 #define FN_PSCREEN 80 /* Previous Screen */ #define FX_PSCREEN 80 #define FN_OTHNSCREEN 81 /* Other New Screen */ #define FX_OTHNSCREEN 0 #define FN_LWINDBORD 82 /* Line to Window Border */ #define FX_LWINDBORD 0 #define FN_SCUPWIND 83 /* Scroll Window Up */ #define FX_SCUPWIND 83 #define FN_SCDNWIND 84 /* Scroll Window Down */ #define FX_SCDNWIND 84 #define FN_MVWTOP 85 /* Move to Window Top */ #define FX_MVWTOP 85 #define FN_MVWBOT 86 /* Move to Window Bottom */ #define FX_MVWBOT 86 #define FN_SETPROF 90 /* Set Profile */ #define FX_SETPROF 90 #define FN_PFXMETA 91 /* Prefix Meta */ #define FX_PFXMETA 91 #define FN_PFXEXT 92 /* Prefix Extend */ #define FX_PFXEXT 92 #define FN_UARG 93 /* Universal Arg */ #define FX_UARG 93 #define FN_NEGARG 94 /* Negative Argument */ #define FX_NEGARG 94 #define FN_ARGDIG 95 /* Argument Digit */ #define FX_ARGDIG 95 #define FN_VTBUTTONS 96 /* VT100 Button Hack */ #define FX_VTBUTTONS 96 #define FN_DESCRIBE 97 /* Describe */ #define FX_DESCRIBE 97 #define FN_SKMAC 100 /* Start Kbd Macro */ #define FX_SKMAC 100 #define FN_EKMAC 101 /* End Kbd Macro */ #define FX_EKMAC 101 #define FN_XKMAC 102 /* Execute Kbd Macro */ #define FX_XKMAC 102 #define FN_VKMAC 103 /* View Kbd Macro */ #define FX_VKMAC 103 #define FN_UNKILL 105 /* Un-kill */ #define FX_UNKILL 105 #define FN_UNKPOP 106 /* Un-kill Pop */ #define FX_UNKPOP 106 #define FN_APPNKILL 107 /* Append Next Kill */ #define FX_APPNKILL 107 #define FN_SRCH 110 /* String Search */ #define FX_SRCH 110 #define FN_RSRCH 111 /* Reverse String Search */ #define FX_RSRCH 111 #define FN_ISRCH 112 /* Incremental Search */ #define FX_ISRCH 112 #define FN_RISRCH 113 /* Reverse Search */ #define FX_RISRCH 113 #define FN_REPSTR 114 /* Replace String */ #define FX_REPSTR 114 #define FN_QUEREP 115 /* Query Replace */ #define FX_QUEREP 115 #define FN_REPLINE 116 /* Replace in Line */ #define FX_REPLINE 116 #define FN_SFCOL 117 /* Set Fill Column */ #define FX_SFCOL 117 #define FN_SFPREF 118 /* Set Fill Prefix */ #define FX_SFPREF 118 #define FN_FILLMODE 119 /* Auto Fill Mode */ #define FX_FILLMODE>>> 119 #define FN_TEXTMODE 120 /* Text Mode */ #define FX_TEXTMODE 0 #define FN_INDATM 121 /* Indent According to Mode */ #define FX_INDATM 121 #define FN_INDNL 122 /* Indent New Line */ #define FX_INDNL 122 #define FN_BACKIND 123 /* Back to Indentation */ #define FX_BACKIND 123 #define FN_INDCOMM 124 /* Indent for Comment */ #define FX_INDCOMM 124 #define FN_INDREL 125 /* Indent Relative */ #define FX_INDREL 125 #define FN_MATCHBRACK 129 /* Match Bracket */ #define FX_MATCHBRACK 0 #define FN_PSHINF 130 /* Push to Inferior */ #define FX_PSHINF 130 #define FN_RETSUP 131 /* Return to Superior */ #define FX_RETSUP 131 #define FN_WFEXIT 132 /* Write File Exit */ #define FX_WFEXIT 132 #define FN_BKPT 140 /* Hit Breakpoint */ #define FX_BKPT 140 #define FN_DEBUG 141 /* Debug Mode */ #define FX_DEBUG 141 #define FN_XUCMD 150 /* Execute Unix Command */ #define FX_XUCMD 0 #define FN_MAKE 151 /* Execute Make */ #define FX_MAKE 0 #define FN_NXTERR 152 /* Find Next Error */ #define FX_NXTERR 0 #define FN_ICOXCMD 153 /* ICO Extend Command */ #define FX_ICOXCMD 0 #define FN_ICOTYPFNS 154 /* ICO Typeset Funs */ #define FX_ICOTYPFNS 0 #define FN_ICOSPIFNS 155 /* ICO Spec Input Funs */ #define FX_ICOSPIFNS 0 #define FN_STUFFSEL 156 /* Stuff Selection */ #define FX_STUFFSEL 0 #define FN_SELREGION 157 /* Select Region */ #define FX_SELREGION 0 /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEFILE File reading/writing functions */ #include "elle.h" #include /* Use "standard" I/O package for writing */ #ifndef BUFSIZ #define BUFSIZ BUFSIZE /* Some places use wrong name in stdio.h */ #endif /*-BUFSIZ*/ #if V6 struct stat { int st_dev; int st_ino; char *st_mode; char st_nlink; char st_uid; char st_gid; char st_size0; char st_size; int st_addr[8]; long st_atime; long st_mtime; }; #define ENOENT (2) /* Syscall error - no such file or dir */ #else #include #include #include #endif /*-V6*/ #if TOPS20 #include /* Get open mode bits */ #endif extern char *strerror(); /* Return error string for errno */ extern struct buffer *make_buf(), *find_buf(); char *fncons(), *last_fname(); int hoardfd = -1; /* Retain a FD here to ensure we can always write */ /* Flags for iwritfile() */ #define WF_SMASK 07 /* Source Mask */ #define WF_SBUFF 0 /* source: Buffer */ #define WF_SREG 1 /* source: Region */ #define WF_SKILL 2 /* source: Last Kill */ #define WF_ASK 010 /* Ask for filename to write to */ static int iwritfile(); /* EFUN: "Find File" */ /* Ask user for a filename and do a find_file for it. * If buffer exists for that filename, select that buffer. * Else create a buffer for it, and read in the file if it exists. */ f_ffile() { int find_file(); #if IMAGEN hack_file("Visit file: ", find_file); #else hack_file("Find file: ", find_file); #endif /*-IMAGEN*/ } /* EFUN: "Read File" */ /* User read_file function, asks user for a filename and reads it */ f_rfile() { u_r_file("Read file: "); } /* EFUN: "Visit File" */ /* Same as Read File, with different prompt. */ f_vfile() { u_r_file("Visit file: "); } u_r_file(prompt) char *prompt; { register char *f_name; register struct buffer *b; if((f_name = ask (prompt))==0) /* prompt user for filename */ return; /* user punted... */ b = cur_buf; if(*f_name == '\0') { if (b -> b_fn == 0) ding("No default file name."); else read_file(b -> b_fn); } else read_file(f_name); chkfree(f_name); } /* EFUN: "Insert File" */ /* Asks for a filename and inserts the file at current location. * Point is left at beginning, and the mark at the end. */ f_ifile() { int ins_file(); hack_file("Insert file: ", ins_file); } /* EFUN: "Save File" */ /* Save current buffer to its default file name */ f_sfile() { if(cur_buf->b_flags&B_MODIFIED) return(iwritfile(WF_SBUFF)); /* Write buffer, don't ask */ else { saynow("(No changes need to be written)"); return(1); } } #if FX_SAVEFILES || FX_WFEXIT /* EFUN: "Save All Files" */ /* F_SAVEFILES - Offer to save all modified files. * With argument, doesn't ask. * Returns 0 if user aborts or if an error happened. */ f_savefiles() { register struct buffer *b, *savb; register int res = 1; char *ans; savb = cur_buf; for (b = buf_head; res && b; b = b->b_next) if ((b->b_flags & B_MODIFIED) && b->b_fn) { if(exp_p) /* If arg, */ { chg_buf(b); /* just save, don't ask */ res = f_sfile(); continue; /* Check next buffer */ } /* Ask user whether to save */ ans = ask("Buffer %s contains changes - write out? ", b->b_name); if(ans == 0) { res = 0; /* User aborted */ break; } if (upcase(*ans) == 'Y') { chg_buf(b); res = f_sfile(); /* Save File */ } chkfree(ans); } chg_buf(savb); return(res); } #endif /*FX_SAVEFILES||FX_WFEXIT*/ /* EFUN: "Write File" */ /* Write out the buffer to an output file. */ f_wfile() { return iwritfile(WF_ASK|WF_SBUFF); } /* EFUN: "Write Region" */ /* Write region out to a file */ f_wreg() { return iwritfile(WF_ASK|WF_SREG); /* Ask, write region */ } #if FX_WLASTKILL /* EFUN: "Write Last Kill" (not EMACS) */ /* Write current kill buffer out to a file. ** This is mainly for MINIX. */ extern int kill_ptr; /* From EEF3 */ extern SBSTR *kill_ring[]; f_wlastkill() { return iwritfile(WF_ASK|WF_SKILL); } #endif /* HACK_FILE - intermediate subroutine */ hack_file(prompt, rtn) char *prompt; int (*rtn)(); { register char *f_name; if((f_name = ask(prompt)) == 0) return; if (*f_name != '\0') /* Check for null answer */ (*rtn)(f_name); chkfree(f_name); } /* FIND_FILE(f_name) * If there is a buffer whose fn == f_name, select that buffer. * Else create one with name of the last section of f_name and * read the file into that buffer. */ find_file(f_name) register char *f_name; { register struct buffer *b; register char *ans; char *lastn; int fd; #if IMAGEN char real_name[128]; /* File name w/ expanded ~ and $ */ expand_file(real_name, f_name); f_name = real_name; #endif /*IMAGEN*/ for (b = buf_head; b; b = b -> b_next) if(b->b_fn && (strcmp (b -> b_fn, f_name) == 0)) break; if (b) /* if we found one */ { sel_buf(b); /* go there */ return; /* and we are done */ } if((fd = open(f_name,0)) < 0) /* See if file exists */ { if(errno != ENOENT) /* No, check reason */ { ferr_ropn(); /* Strange error, complain */ return; /* and do nothing else. */ } } else close(fd); /* Found! Close FD, since the */ /* read_file rtn will re-open. */ lastn = last_fname(f_name); /* Find buffer name */ b = find_buf(lastn); /* Is there a buffer of that name? */ if (b && (ex_blen(b) || b->b_fn)) { ans = ask("Buffer %s contains %s, which buffer shall I use? ", b -> b_name, b->b_fn ? b->b_fn : "something"); if(ans == 0) return; /* Aborted */ if (*ans != '\0') /* if null answer, use b */ b = make_buf(ans); /* else use ans */ chkfree(ans); } else b = make_buf(lastn); sel_buf(b); if(fd < 0) /* If file doesn't exist, */ { set_fn(f_name); /* just say "new" and set filename */ return; /* and return right away. */ } if (read_file(f_name)==0) /* File exists, read it in! */ { if(b->b_fn) /* Failed... if filename, */ { chkfree(b->b_fn); /* flush the filename. */ b->b_fn = 0; } } } /* READ_FILE(f_name) * Reads file into current buffer, flushing any * previous contents (if buffer modified, will ask about saving) * Returns 0 if failed. */ read_file(f_name) char *f_name; { #if IMAGEN struct stat s; char real_name[128]; /* File name w/ expanded ~ and $ */ #endif /*IMAGEN*/ if(!zap_buffer()) /* Flush the whole buffer */ return; /* Unless user aborts */ #if IMAGEN expand_file(real_name, f_name); f_name = real_name; /* Hack, hack! */ #endif /*IMAGEN*/ set_fn(f_name); if (ins_file(f_name)==0) return 0; f_bufnotmod(); /* Say not modified now */ #if IMAGEN stat(f_name, &s); /* Get file stat */ cur_buf->b_mtime = s.st_mtime; /* and pick out last-modified time */ #endif /*IMAGEN*/ return 1; } /* INS_FILE(f_name) * Inserts file named f_name into current buffer at current point * Point is not moved; mark is set to end of inserted stuff. * Returns 0 if failed, 1 if won. */ ins_file (f_name) char *f_name; { register int ifd; register SBSTR *sd; chroff insdot; /* To check for range of mods */ #if IMAGEN char real_name[128]; /* File name w/ expanded ~ and $ */ expand_file(real_name, f_name); f_name = real_name; #endif /*IMAGEN*/ #if !(TOPS20) if((ifd = open(f_name,0)) < 0) #else if((ifd = open(f_name,O_RDONLY|O_UNCONVERTED)) < 0) #endif /*TOPS20*/ { ferr_ropn(); /* Can't open, complain */ return 0; /* no redisplay */ } errno = 0; if((sd = sb_fduse(ifd)) == 0) { if (ifd >= SB_NFILES) dingtoo(" Cannot read - too many internal files"); else if (errno) ferr_ropn(); else errbarf("SB rtn cannot read file?"); close(ifd); return 0; } sb_sins(cur_buf,sd); insdot = e_dot(); f_setmark(); /* Set mark at current ptr */ if(cur_dot != insdot) /* If pointer was advanced, */ buf_tmat(insdot); /* then stuff was inserted */ e_gocur(); return 1; } ferr_ropn() { ferr(" Cannot read"); } ferr_wopn() { ferr(" Cannot write"); } ferr(str) char *str; { saytoo(str>>>>>>>>>>>>>); saytoo(" - "); dingtoo(strerror(errno)); } /* IWRITFILE - auxiliary for writing files. ** Returns 1 if write successful, 0 if not. */ static int iwritfile(flags) int flags; { register struct buffer *b; register char *o_name; /* output file name */ int styp = flags & WF_SMASK; /* Source type, one of WF_Sxxx */ char *prompt; #ifdef STDWRITE register FILE *o_file; /* output file pointer */ char obuf[BUFSIZ]; chroff dotcnt; #endif /*STDWRITE*/ int ofd; /* output file FD */ SBSTR *sd; char fname[FNAMSIZ]; /* To avoid chkfree hassle */ char newname[FNAMSIZ]; /* for robustness */ char oldname[FNAMSIZ]; /* ditto */ int res; struct stat statb; int statres; #if IMAGEN struct stat s; char real_name[128]; /* File name w/ expanded ~ and $ */ #endif /*IMAGEN*/ res = 1; /* Let's keep track of success */ /* Check for existence of source, and set prompt string */ switch(styp) { case WF_SBUFF: prompt = "Write File: "; break; case WF_SREG: if(!mark_p) { dingtoo(" No Mark!"); return(0); } prompt = "Write Region: "; break; #if FX_WLASTKILL case WF_SKILL: if(!kill_ring[kill_ptr]) { dingtoo("No killed stuff"); return(0); } prompt = "Write Last Kill: "; break; #endif default: /* Internal error */ errbarf("bad iwritfile arg"); return 0; } if (flags&WF_ASK) { if((o_name = ask(prompt))==0) return(0); /* User punted. */ strcpy(&fname[0], o_name); /* Copy filename onto stack */ chkfree(o_name); } o_name = &fname[0]; b = cur_buf; if (!(flags&WF_ASK) || (*o_name == '\0')) { if (b->b_fn == 0) { ding("No default file name."); return(0); } strcpy(o_name, b->b_fn); } #if IMAGEN expand_file(real_name, o_name); o_name = real_name; /* Hack, hack */ #endif /*IMAGEN*/ statres = stat(o_name,&statb); /* Get old file's info (if any) */ #if IMAGEN /* Now, make sure someone hasn't written the file behind our backs */ if ((styp==WF_SBUFF) && !(flags&WF_ASK) && b->b_fn && stat(b->b_fn, &s) >= 0) if (s.st_mtime != b->b_mtime) { char *ans; ans = ask("Since you last read \"%s\", someone has changed it.\nDo you want to write it anyway (NOT RECOMMENDED!)? ", b->b_fn); if (ans == 0 || upcase(*ans) != 'Y') { ding("I suggest you either read it again, or\nwrite it to a temporary file, and merge the two versions manually."); if (ans) chkfree(ans); return(0); } if (ans) chkfree(ans); } #endif /*IMAGEN*/ /* Try to get around major UNIX screw of smashing files. * This still isn't perfect (screws up with long filenames) but... * 1. Write out to * 2. Rename to (may have to delete existing ) * 3. Rename to . */ fncons(oldname,ev_fno1,o_name,ev_fno2); /* Set up "old" filename */ fncons(newname,ev_fnn1,o_name,ev_fnn2); /* Set up "new" filename */ unlink(newname); /* Ensure we don't clobber */ unhoard(); /* Now give up saved FD */ #if !(V6) /* Standard V6 doesn't have access call */ if(statres >= 0) /* If file exists, */ { if(access(o_name, 2) != 0) /* check for write access */ { ferr_wopn(); res = 0; /* Failure */ goto wdone; } } #endif /*-V6*/ #ifdef STDWRITE if(flags&WF_ASK) { if((o_file = fopen(newname, "w")) ==0) /* Create new output file */ { ferr_wopn(); res = 0; /* Failure */ goto wdone; } setbuf(o_file,obuf); /* Ensure always have buffer */ } else /* New stuff */ #endif /*STDWRITE*/ { #if !(TOPS20) if((ofd = creat(newname,ev_filmod)) < 0) #else if((ofd = open(newname,O_WRONLY|O_UNCONVERTED)) < 0) #endif /*TOPS20*/ { ferr_wopn(); res = 0; /* Failure */ goto wdone; } } if (styp==WF_SBUFF) set_fn(o_name); /* Won, so set default fn for buff */ #if IMAGEN saynow("Writing "); switch(styp) { case WF_SBUFF: saytoo(b->b_fn); break; case WF_SREG: saytoo("region"); break; #if FX_WLASTKILL case WF_SKILL: saytoo("last kill"); break; #endif } sayntoo("..."); #else saynow("Writing..."); #endif /*-IMAGEN*/ #if !(TOPS20) /* T20 does all this already */ if(statres >= 0) /* Get old file's modes */ { /* Try to duplicate them */ /* Do chmod first since after changing owner we may not ** have permission to change mode, at least on V6. */ chmod(newname,statb.st_mode & 07777); #if V6 chown(newname, (statb.st_gid<<8)|(statb.st_uid&0377)); #else chown(newname,statb.st_uid,statb.st_gid); #endif /*-V6*/ } #if V6 /* If no old file existed, and we are a V6 system, try to set * the modes explicitly. On V7 we're OK because the user can * diddle "umask" to get whatever is desired. * On TOPS-20 of course everything is all peachy. */ else chmod(newname, ev_filmod); #endif /*V6*/ #endif /*TOPS20*/ #ifdef STDWRITE if(flags&WF_ASK) { switch(styp) { case WF_SBUFF: dotcnt = e_blen(); e_gobob(); break; case WF_SREG: if((dotcnt = mark_dot - cur_dot) < 0) { e_goff(dotcnt); dotcnt = -dotcnt; } else e_gocur(); break; /* WF_SKILL not implemented here */ } while(--dotcnt >= 0) putc(sb_getc(((SBBUF *)b)), o_file); e_gocur(); fflush(o_file); /* Force everything out */ res = ferror(o_file); /* Save result of stuff */ fclose(o_file); /* Now flush FD */ } else /* New stuff */ #endif /*STDWRITE*/ { switch(styp) { case WF_SBUFF: res = sb_fsave((SBBUF *)b, ofd); break; case WF_SREG: e_gocur(); sd = e_copyn((chroff)(mark_dot - cur_dot)); res = sbx_aout(sd, 2, ofd); sbs_del(sd); break; #if FX_WLASTKILL case WF_SKILL: res = sbx_aout(kill_ring[kill_ptr], 2, ofd); break; #endif } close(ofd); } if(errno = res) { ferr(" Output error"); res = 0; /* Failure */ goto wdone; } else res = 1; /* Success so far */ if(styp == WF_SBUFF) f_bufnotmod(); /* Reset "buffer modified" flag */ /* Here we effect the screw-prevention steps explained earlier. */ /* TOPS-20, with generation numbers, need not worry about this. */ #if TOPS20 saynow("Written"); #else /*-TOPS20*/ #if IMAGEN /* KLH -- This conditional bracketting is prone to lossage */ /* Only create the .BAK file once per editing session!! */ if ((styp==WF_SBUFF) || !(b->b_flags & B_BACKEDUP)) { if (styp==WF_SBUFF) b->b_flags |= B_BACKEDUP; #endif /*IMAGEN*/ unlink(oldname); /* remove any existing "old" file */ if(link(o_name,oldname) == 0) /* Rename current to "old" */ unlink(o_name); /* Here is the critical point... if we stop here, there is no * longer any file with the appropriate filename!!! */ #if IMAGEN } else unlink(o_name); #endif /*IMAGEN*/ if(link(newname,o_name) == 0) /* Rename "new" to current */ { unlink(newname); #if IMAGEN sayntoo("OK"); #else saynow("Written"); #endif /*-IMAGEN*/ } else { dingtoo("rename error!"); res = 0; } #endif /*-TOPS20*/ #if IMAGEN /* Update the last-modified time for the file in this buffer */ if ((styp == WF_SBUFF) && b->b_fn) { stat(b->b_fn, &s); b->b_mtime = s.st_mtime; } #endif /*IMAGEN*/ wdone: hoard(); /* Get back a retained FD */ return(res); } /* FNCONS(dest,pre,f_name,post) * Specialized routine to cons up a filename string into "dest", * given prefix and postfix strings to be added onto last component of * filename. */ char * fncons(dest, pre, f_name, post) char *dest,*pre,*f_name,*post; { register char *cp, *cp2; char *last_fname(); cp = dest; *cp = 0; /* Make dest string null initially */ cp2 = last_fname(f_name); /* Get pointer to beg of last name */ strncat(cp,f_name,cp2-f_name); /* Copy first part of filename */ if(pre) strcat(cp, pre); /* If prefix exists, add it on */ cp = last_fname(cp); /* Recheck in case levels added */ strcat(cp, cp2); /* Now add last name */ if(cp2 = post) /* If there's a postfix, must check */ { cp[FNAMELEN-strlen(cp2)] = 0; /* and cut dest so postfix */ strcat(cp, cp2); /* will fit on end. */ } return(dest); } /* LAST_FNAME(string) * Get the last component of a file name. Returns pointer to * start of component; does NOT copy string! */ char * last_fname(f_name) char *f_name; { register char *cp, *p; register int c; p = f_name; /* pointer to last slash */ cp = p; while(c = *cp++) if(c == '/') p = cp; /* point to after the slash */ return(p); } /* SET_FN(string) * Set the default filename for current buffer to "string". */ set_fn (string) char *string; { register struct buffer *b; register char *str; #if IMAGEN register char *cp; register int len; #endif /*IMAGEN*/ char *strdup(); b = cur_buf; str = strdup(string); /* Copy now in case copying self */ if(b->b_fn) chkfree(b->b_fn); b -> b_fn = str; #if IMAGEN /* Do mode determination based on file name (HACK HACK) */ len = strlen(str); b->b_flags &= ~(B_CMODE|B_TEXTMODE); if (len > 4) { if (strcmp(&str[len - 5], "draft") == 0) b->b_flags |= B_TEXTMODE; else { cp = &str[len - 4]; if (strcmp(cp, ".txt") == 0 || strcmp(cp, ".mss") == 0) b->b_flags |= B_TEXTMODE; } } if (len > 2) { cp = &str[len - 2]; if (strcmp(cp, ".h") == 0 || strcmp(cp, ".c") == 0) b->b_flags |= B_CMODE; } #endif /*IMAGEN*/ redp(RD_MODE); } /* SAVEWORLD - Attempt to save all changes user has made. * Currently this amounts to writing out all modified buffers * to the files $HOME/+buffername. If a buffer is given as argument, * only that buffer is saved. * This is only called from the error handling routines with * the TTY either gone or in normal (non-edit) mode. The "grunt" * flag says whether to output feedback during the saving process. */ saveworld(bp, grunt) struct buffer *bp; int grunt; { register struct buffer *b; register int wfd; char sfname[FNAMSIZ]; struct buffer *sel_mbuf(); unhoard(); /* Ensure a FD is free for writing */ if(b = bp) goto once; while(!bp && (b = sel_mbuf(b))) { once: strcat(strcat(strcpy(sfname,homedir),"/+"),b->b_name); if(grunt) printf("Saving %s...",sfname); #if !(TOPS20) if((wfd = creat(sfname, ev_filmod)) < 0) #else if((wfd = open(sfname,O_WRONLY|O_UNCONVERTED)) < 0) #endif /*TOPS20*/ { if(grunt) printf(" error - %s\n", strerror(errno)); } else { sb_fsave((SBBUF *)b, wfd); close(wfd); if(grunt) printf("\n"); } b->b_flags &= ~B_MODIFIED; } hoard(); } /* HOARD, UNHOARD - Routines to save a FD for writing, to make sure * that we can always write out a buffer no matter how many * file descriptors we are currently using. */ hoard() /* Stash away a FD */ { if(hoardfd <= 0) #if !(TOPS20) hoardfd = open("nul:", 1); #else hoardfd = open("/dev/null", 1); #endif } unhoard() /* Give up our stashed FD so it can be re-used */ { close(hoardfd); hoardfd = -1; } #if IMAGEN #include #include /* * expand_file: expand any ~user-name/ or $env-var/ prefixes in sfn, * producing the full name in dfn */ expand_file(dfn, sfn) register char *dfn, *sfn; { register char *sp, *tp; register int c; register struct passwd *pw; char ts[128]; /* HORRIBLE, GROSS, DISGUSTING HACK: if the destination and * source strings are identical (same pointer), then do not * do any expansion--this happens to work with the current * structure very well, since multiple expansions may happen. */ if (dfn == sfn) return; ts[0] = 0; /* If have a leading $, then expand environment variable */ if (*sfn == '$') { ++sfn; tp = ts; while (*tp++ = *sfn) if (!isalnum(*sfn)) break; else ++sfn; *--tp = 0; /* Just in case */ strcpy(ts, getenv(ts)); /* MARGINAL!! */ } /* If have leading ~, then expand login name (null means $HOME) */ else if (*sfn == '~') { ++sfn; if (*sfn == '/' || *sfn == 0) strcpy(ts, getenv("HOME")); else { tp = ts; while (*sfn && *sfn != '/') *tp++ = *sfn++; *tp = 0; pw = (struct passwd *)getpwnam(ts); if (! pw) strcpy(ts, "???"); else strcpy(ts, pw->pw_dir); } } /* Now, ts is either empty or contains the expansion; * sfn has been updated correctly. */ strcpy(dfn, ts); strcat(dfn, sfn); } #endif /*IMAGEN*/ /* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEFILL Fill Mode functions */ #include "elle.h" extern int ev_fcolumn; /* Fill Column variable (defined in EEVINI) */ #if FX_SFPREF char *fill_prefix; /* Fill Prefix variable */ int fill_plen; /* Length of Fill Prefix (0 = no prefix) */ #endif /*FX_SFPREF*/ #if FX_FILLMODE int fill_mode = 0; /* TRUE when Auto Fill Mode is on */ int *fill_trig; /* Pointer to fill-trigger chbit array */ static char *fill_initrig = " \t.,;:)!"; #endif /*FX_FILLMODE*/ /* Following stuff for testing routines on */ /* 1 2 3 4 5 6 7 0123456789012345678901234567890123456789012345678901234567890123456789012345 Okay... more stuff to hack. Okay. a b c d e f g h i j k l m n o p q r s t u v w x y z dfsd stuff to hack 01234 Okay testing more stuff to hack. Okay... more stuff to hack more stuff to hack. Okay... more stuff to line long stuff to hack. Okay... even more gap and. period. okay, end of stuff. This is another fence. */ #if FX_SFCOL /* EFUN: "Set Fill Column" */ f_sfcol() { register int linel; char temp[20]; linel = exp_p ? exp : d_curind(); if(linel < 0) linel = 0; say("Fill column = "); dottoa(temp,(chroff)linel); saytoo(temp); ev_fcolumn = linel; } #endif /*FX_SFCOL*/ #if FX_SFPREF /* EFUN: "Set Fill Prefix" */ f_sfpref() { register int i; register char *cp; if((i = cur_dot - e_boldot()) > MAXLINE) { ding("Absurd Fill Prefix"); return; } if(fill_prefix) { chkfree(fill_prefix); fill_plen = 0; } if(i <= 0) { fill_prefix = 0; cp = ""; } else { fill_prefix = cp = memalloc((SBMO)(i+1)); fill_plen = i; e_gobol(); do { *cp++ = e_getc(); } while(--i); *cp = 0; cp = fill_prefix; } say("Fill Prefix = \""); saytoo(cp); saytoo("\""); } /* TSTFILLP(lim) - Check for existence of Fill Prefix at current dot. If * not there, returns 0 without changing dot. If there, returns * 1 and leaves dot immediately after the Fill Prefix. * Lim = # of chars allowed to scan from buffer. */ tstfillp(lim) int lim; { register int i, c; register char *cp; chroff savdot; if(!(i = fill_plen) || (i > lim)) return(0); savdot = e_dot(); cp = fill_prefix; do { if(*cp++ != e_getc()) { e_go(savdot); return(0); } } while(--i); return(1); } #endif /*FX_SFPREF*/ #if FX_FILLREG || FX_FILLPARA /* ED_FILL(start, end, flag) - Fill a region. * Flag 0 for full filling; extra whitespace is flushed. First * word is always retained. * 1 for skimpy filling such as Auto-Fill likes. * Extra whitespace is NOT flushed, except at * beginning of a newly created line. * This is not yet implemented however. * Note: updates cur_dot to compensate for changes in buffer, and returns * there when done! * Note: Checks for Fill Prefix when it exists. */ ed_fill(begloc, endloc, flag) chroff begloc, endloc; int flag; { register int c; register int len, lastc; chroff savloc; int lastbrk; int parlen; parlen = endloc - begloc; if(parlen < 0) { begloc = endloc; parlen = -parlen; } e_go(begloc); len = d_curind(); /* Set up current col */ #if FX_SFPREF /* If at beg of line, check for fill prefix and skip over it */ if((len == 0) && tstfillp(parlen)) { parlen -= fill_plen; len = d_curind(); } #endif /*FX_SFPREF*/ lastbrk = 0; /* Put next word on no matter what. */ c = 0; for(;;) { #if ICONOGRAPHICS if (c != ')' && c != '"') /* allow for two sp after .) or ." */ #endif /*ICONOGRAPHICS*/ lastc = c; if(--parlen < 0) break; c = e_getc(); if(c == EOF) break; #if FX_SFPREF /* If at beg of line, check for fill prefix and flush it */ if((c == LF) && tstfillp(parlen)) { e_igoff(-(fill_plen+1)); e_ovwc(c = SP); e_deln((chroff)fill_plen); parlen -= fill_plen; if(cur_dot >= e_dot()) cur_dot -= fill_plen; } #endif /*FX_SFPREF*/ if(c == TAB || c == LF) /* Replace tabs+eols by sps */ { e_backc(); /* Back up 1 */ e_ovwc(c = SP); } if(c == SP) { if(lastc == SP) { e_rdelc(); if(cur_dot > e_dot()) --cur_dot; continue; } lastbrk = len; if(lastc == '.' || lastc == '!' || lastc == '?' #if ICONOGRAPHICS || lastc == ':' #endif /*ICONOGRAPHICS*/ ) { if(--parlen < 0) goto done; if((c = e_getc()) == EOF) goto done; len++; if(c != SP) { e_backc(); e_putc(c = SP); if(cur_dot >= e_dot()) ++cur_dot; } } } #if ICONOGRAPHICS if (c == BS) /* adjust for backspaces */ if ((len -= 2) < 0) len = 0; #endif /*ICONOGRAPHICS*/ /* Normal char */ if(++len > ev_fcolumn && lastbrk) /* If went too far */ { c = lastbrk - len; /* Must put EOL at last SP */ e_igoff(c); parlen -= c; /* C is negative, actually adding */ parlen--; e_ovwc(LF); lastbrk = 0; len = 0; c = SP; /* Pretend this char was space */ #if FX_SFPREF if(fill_plen) { if(cur_dot >= e_dot()) cur_dot += fill_plen; /* Better hope no nulls in prefix! */ e_sputz(fill_prefix); len = d_curind(); } #endif /*FX_SFPREF*/ } } done: savloc = cur_dot; e_setcur(); /* Reached paragraph end, set cur_dot temporarily */ buf_tmod(begloc-cur_dot); /* So that proper range is marked */ e_gosetcur(savloc); /* Then restore original cur_dot */ } #endif /*FX_FILLREG || FX_FILLPARA*/ #if FX_FILLMODE /* EFUN: "Auto Fill Mode" */ /* Toggles Auto Fill Mode (a minor mode). */ f_fillmode() { register char *cp; int *chballoc(); fill_mode = fill_mode ? 0 : 1; if(!fill_trig) { fill_trig = chballoc(128); for(cp = fill_initrig; *cp; ++cp) chbis(fill_trig, *cp); } redp(RD_MODE); } /* Called by F_INSSELF to handle char insertion in Auto Fill mode */ fx_insfill(c) int c; { ed_insn(c,exp); if(chbit(fill_trig, c)) { fill_cur_line(); } } fill_cur_line() { register int foundit, i; chroff lastbrkdot, boldot, eoldot; boldot = e_boldot(); /* First back up to find place to make first break. */ e_bwsp(); lastbrkdot = e_dot(); foundit = 0; for(foundit = 0; foundit >= 0;) { if((i = d_curind()) <= ev_fcolumn) { if(foundit) foundit = -1; else break; } else ++foundit; while (!c_wsp (e_rgetc ())) ; e_bwsp(); lastbrkdot = e_dot(); if(lastbrkdot <= boldot) { lastbrkdot = boldot; break; } } if(foundit) ed_fill(lastbrkdot, e_eoldot(), 1); } #endif /*FX_FILLMODE*/ #if IMAGEN #if FX_TEXTMODE /* EFUN: "Text Mode Toggle" (not EMACS) */ f_textmode() { cur_buf->b_flags ^= B_TEXTMODE; redp(RD_MODE); } #endif /*FX_TEXTMODE*/ int curr_indent = -1; /* Current indent (for text mode autowrap) */ /* (misnomered: actually current column) */ chroff best_break; /* Best break point so far */ /* Fill-mode version of "Insert Self" */ fim_insself(c) int c; { register int ind, flags = cur_buf->b_flags; /* In Text mode, auto-wrap happens at spaces after fill column */ if (c == SP && flags & B_TEXTMODE && exp == 1 && magic_wrap(c)) return; /* In C-mode, tab stops are every 4 columns */ else if (c == TAB && flags & B_CMODE && (ind = magic_backto_bol()) >= 0) ed_indto((ind + 4) & ~3); else { ed_insn(c, exp); /* Keep track of indent, once we have a grip on it */ if (last_cmd == INSCMD && curr_indent != -1) { this_cmd = INSCMD; /* Keep the ball rolling */ if (c == TAB) curr_indent = ((curr_indent + 8) & ~7) + 8 * (exp - 1); else if (c == '\n') curr_indent = 0; else if (c < SP || c > 0176) curr_indent += (2 * exp); else curr_indent += exp; } } } /* Fill-mode version of "Delete Character" */ fim_dchar() { /* In C mode, deleting at BOL should do fake TAB preservation */ if (cur_buf->b_flags & B_CMODE) { chroff savdot; register int c, indent; if (e_rgetc() != LF) { /* Only hack this at BOL */ e_getc(); goto normal; } e_getc();>>>>>>>>> savdot = e_dot(); indent = 0; while ((c = e_getc()) == SP || c == TAB) if (c == SP) ++indent; else indent = (indent + 8) & ~7; e_rgetc(); if (indent >= 4) { ed_delete(savdot, e_dot()); ed_indto((indent - 4) & ~3); f_begline(); /* HACK!!!! */ } else { e_go(savdot); ef_deln(exp); } } else normal: return (ef_deln(exp)); } /* Fill-mode version of "Backward Delete Character" */ fim_bdchar() { register int ind; /* If in C mode, and deleting into white space at BOL, hack tabs */ if (exp == 1 && cur_buf->b_flags & B_CMODE && (ind = magic_backto_bol()) > 0) ed_indto(ind < 4 ? ind - 1 : ((ind - 4) & ~3)); else return (ef_deln (-exp)); } /* Fill-mode version of "CRLF" */ fim_crlf() { register int i; if(e_getc() == LF && exp == 1 && e_lblankp() && e_lblankp()) { e_gocur(); e_gonl(); e_setcur(); ed_delete(e_dot(), e_eoldot()); } else { e_gocur(); #if IMAGEN if (cur_buf->b_flags & B_TEXTMODE && exp == 1 && magic_wrap('\n')) return; else #endif /*IMAGEN*/ if((i = exp) > 0) do ed_crins(); while(--i); } } /* Do all magic for auto-wrap in Text mode: * return as did wrap (i.e., everything is taken care of) */ magic_wrap(tc) int tc; /* "trigger char" */ { register int c, indent, i, nc; chroff savdot, modstart, breakdot; savdot = e_dot(); nc = 0; if (last_cmd == INSCMD && curr_indent != -1) { indent = curr_indent; /* Already know our indent */ breakdot = best_break; } else { #ifdef INDENTDEBUG barf2("Full indent calculation"); #endif for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc) ; /* nc: # chars to look at */ if (c == '\n') /* Go back over NL */ e_getc(); indent = 0; /* Search for last line break point, leaving it in breakdot */ breakdot = (chroff)0; while (--nc >= 0) { c = e_getc(); if (c == TAB) indent = (indent + 8) & ~7; else if (c < SP || c > 0176) indent += 2; else ++indent; if ((c == SP || c == TAB) && (breakdot == (chroff)0 || (indent <= ev_fcolumn))) breakdot = e_dot(); } } /* If there is nothing to do, get out */ if (indent <= ev_fcolumn) { e_go(savdot); if (tc == SP) { curr_indent = indent; best_break = (chroff)(savdot + 1); /* Remember here, also */ this_cmd = INSCMD; /* We do know current indent */ } else if (tc == '\n') { curr_indent = 0; best_break = (chroff)0; this_cmd = INSCMD; } else errbarf("bad trigger"); return(0); } if (breakdot == (chroff)0) { /* No breakpoint found or none needed, just break line at end */ e_go(savdot); modstart = savdot; e_putc('\n'); } else { /* Get to breakpoint and replace with newline */ e_go(breakdot); e_rdelc(); modstart = e_dot(); /* Remember where changes start */ e_putc('\n'); /* Insert line break */ e_go(savdot); /* Get back to trigger point */ } if (e_rgetc() != '\n') { /* If not at line start, */ e_getc(); e_putc(tc); /* insert trigger character */ /* Once again, compute new indent by backing up to BOL */ for (nc = 0; (c = e_rgetc()) != EOF && c != '\n'; ++nc) ; if (c == '\n') /* Go back over NL */ e_getc(); indent = 0; breakdot = (chroff)0; while (--nc >= 0) { /* Get back to current dot */ c = e_getc(); if (c == TAB) indent = (indent + 8) & ~7; else if (c < SP || c > 0176) indent += 2; else ++indent; if ((c == SP || c == TAB) && (breakdot == (chroff)0 || (indent <= ev_fcolumn))) breakdot = e_dot(); } if (breakdot == (chroff)0) /* If no good break found, use dot */ breakdot = e_dot(); curr_indent = indent; /* Now we know where we are */ if (tc == '\n') /* If trigger was NL */ best_break = (chroff)0; /* indent is 0, and no best break */ else best_break = breakdot; /* This is best break so far */ } else { e_getc(); curr_indent = 0; /* At line start, no indent */ best_break = (chroff)0; /* Do not have a best break so far */ } ed_setcur(); buf_tmat(modstart); /* Alert to potential changes */ this_cmd = INSCMD; /* Say we know where we are */ return(1); } /* Do lots of magic things for C-mode indent: * erase back to BOL iff we are looking back at white space only, * returning the indent level of the original dot * (< 0 means no erasure done) */ /*#define MYDEBUG /* */ #ifdef MYDEBUG reveal(msg, v1, v2, v3) char *msg; { char ahint[128]; sprintf(ahint, msg, v1, v2, v3); barf2(ahint); } #endif magic_backto_bol() { chroff savdot; register int c, indent, nc, i; savdot = e_dot(); nc = 0; while ((c = e_rgetc()) != EOF && c != LF) { ++nc; /* Count # chars */ if (c != SP && c != TAB) { e_go(savdot); #ifdef MYDEBUG reveal("fail: nc: %d", nc); #endif return -1; } } if (c == LF) /* Go back over the LF */ e_getc(); indent = 0; /* (zero-based indent) */ savdot = e_dot(); /* BOL is now origin for delete */ for (i = 1; i <= nc; ++i) if ((c = e_getc()) == SP) ++indent; else /* (tab) */ indent = (indent + 8) & ~7; if (nc > 0) /* Don't bother deleting nothing */ ed_delete(savdot, e_dot()); #ifdef MYDEBUG reveal("indent: %d, nc: %d, foo: %d", indent, nc, 234); #endif return(indent); } #endif /*IMAGEN*/ #if ICONOGRAPHICS /* Iconographics hack for Auto-Fill mode. Too big and clumsy, but * retained for posterity in case it has some obscure feature. */ fill_current_line () { chroff startpos, endpos, savepos, limitpos; int i, foundit; SBSTR *savep; foundit = 0; while (d_curind() > ev_fcolumn) { foundit = 1; startpos = e_dot (); e_bwsp (); while (d_curind() > ev_fcolumn) /* back up to ends of wds*/ { /* until <= fill column */ while (!c_wsp (e_rgetc ())) ; e_bwsp (); } if (e_dot () == e_boldot ()) { /* ding ("Word does not fit in fill column"); */ return(0); } savep = e_copyn (startpos - e_dot ()); e_setcur (); /* ed_delete does gocur */ ed_delete (savepos = e_dot (), startpos); f_crlf(); /* Now insert newline */ e_sputz(fill_prefix); /* With fill prefix */ startpos += e_dot () - savepos; if (d_curind() > ev_fcolumn) { ed_delete (savepos, e_dot ()); sb_sins (cur_buf, savep); e_setcur (); ding ("Fill prefix > fill column???"); return(0); } savepos = e_dot (); /* gun inherited initial whitespace */ sb_sins (cur_buf, savep); e_go (savepos); e_fwsp (); if ((limitpos = e_dot ()) > startpos) limitpos = startpos; /* in case rest of line was white */ ed_delete (savepos, limitpos); e_gosetcur (startpos + savepos - limitpos); } return foundit; } #endif /*ICONOGRAPHICS*/ /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEHELP - Help function */ #include "elle.h" /* include structure definitions */ #if FX_DESCRIBE /* EFUN: "Describe" */ /* DESCRIBE - Help-command hack. ** Crude approximation of EMACS function. */ static struct buffer *help_buf; f_describe() { register char *cp; register int i, c; char str[10]; struct buffer *savbuf, *b, *make_buf(); chroff bdot; saynow("Help for command: "); i = cmd_idx(c = cmd_read()); /* Get function idx for cmd */ if(c&CB_META) sayntoo("M-"); if(i == FN_PFXMETA) { sayntoo("M-"); i = cmd_idx(c = (cmd_read() | CB_META)); } else if(i == FN_PFXEXT) { sayntoo("^X-"); i = cmd_idx(c = (cmd_read() | CB_EXT)); } str[0] = c&0177; str[1] = 0; sayntoo(str); /* Now read in the help file, if necessary */ savbuf = cur_buf; if(help_buf) chg_buf(help_buf); else { saynow("Loading "); sayntoo(ev_helpfile); sayntoo("..."); chg_buf(help_buf = make_buf(" **HELP**")); if(read_file(ev_helpfile) == 0) { chg_buf(savbuf); kill_buf(help_buf); help_buf = 0; return; } } /* Find function index in current buffer */ cp = str; *cp++ = '<'; *cp++ = 'F'; cp = dottoa(cp, (chroff)i); *cp++ = '>'; e_gobob(); if(e_search(str, cp-str, 0) == 0) sayntoo(" No help found"); else { bdot = e_dot(); while(!e_lblankp()) e_gonl(); /* Move past 1st blank line */ b = make_buf(" *SHOW*"); sb_sins((SBBUF *)b, e_copyn(bdot - e_dot())); mk_showin(b); /* Show the stuff */ kill_buf(b); sayclr(); } chg_buf(savbuf); } #endif /*FX_DESCRIBE*/ /* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEKMAC - Keyboard Macro routines * Modelled after the "e_macro.c" for ICONOGRAPHICS * by C. D. Tavares, 9/11/82 */ #include "elle.h" #if FX_SKMAC /* Entire file is under this conditional! */ int kdef_mode; /* Set when collecting (a "minor mode") */ static int km_flag = 0; /* 1 = executing, -1 collecting, 0 neither */ static int km_exp; /* Arg to "Execute Kbd Macro" - # times more to xct */ static struct buffer *km_buf; /* EFUN: "Start Kbd Macro" */ f_skmac() { register struct buffer *b; struct buffer *make_buf(); if(km_flag) { ding("Kbd macro active, ignoring \"Start Kbd Macro\""); return; } if((b = km_buf) == 0) b = km_buf = make_buf(" *KBDMAC*"); ex_reset(b); km_flag = -1; /* Say starting macro collection */ kdef_mode = 1; redp(RD_MODE); } /* EFUN: "End Kbd Macro" */ f_ekmac() { if(km_flag > 0 && (--km_exp >= 0)) { ex_go((SBBUF *)km_buf, (chroff)0); } else if(km_flag) { km_flag = 0; kdef_mode = 0; /* Flush minor mode */ redp(RD_MODE); } } /* EFUN: "Execute Kbd Macro" */ f_xkmac() { if(km_flag) ding("Already in kbd macro!"); else if(km_buf == 0) ding("No kbd macro defined"); else if((km_exp = exp-1) >= 0) { ex_go((SBBUF *)km_buf, (chroff) 0); km_flag = 1; /* Start macro execution */ } } /* EFUN: "View Kbd Macro" */ f_vkmac() { register struct buffer *b, *savbuf; chroff prmplen; if(!(b = km_buf)) { ding("No kbd macro defined"); return; } savbuf = cur_buf; chg_buf(b); e_gobob(); e_sputz("Current Kbd macro:\n\n"); prmplen = e_dot(); mk_showin(b); /* Show the macro buffer temporarily */ e_gobob(); chg_buf(savbuf); sb_deln((SBBUF *)b, prmplen); /* Flush the prompt */ } /* KM_GETC - return next command char from kbd macro being executed. ** This is < 0 if not executing kbd macro. Also responsible for ** gathering input for kbd macro. */ km_getc() { register int c; while (km_flag > 0) /* Executing macro? */ { c = sb_getc(((SBBUF *)km_buf)); /* Yes, get char */ if(c != EOF) return(c); /* and return as cmd */ if(--km_exp >= 0) /* Macro done. Repeat? */ ex_go((SBBUF *)km_buf, (chroff)0); /* Yes */ else km_flag = 0; /* No, stop execution */ } c = tgetc(); /* Get char from user (TTY) */ if(km_flag < 0) /* Save it if collecting macro */ { sb_putc(((SBBUF *)km_buf), c); } return(c); } /* KM_INWAIT() - Return TRUE if any keyboard-macro input waiting. */ km_inwait() { register int c; if(km_flag > 0) if((c = sb_getc(((SBBUF *)km_buf))) != EOF || (km_exp > 0)) { sb_backc(((SBBUF *)km_buf)); return(1); } return(0); } km_abort () { if(km_flag > 0) /* Executing? */ km_flag = 0; /* Stop */ else if(km_flag < 0) /* Collecting? */ f_ekmac(); /* Close it out */ } #endif /*FX_SKMAC*/ #if 0 /* Old unused stuff */ static char mode_buf [60]; add_mode (mode) char *mode; { register char *cur, *c, *m; if (cur_mode != mode_buf) { strcpy (mode_buf, cur_mode); cur_mode = mode_buf; } if (cur_mode [0]) strcat (cur_mode, ", "); strcat (cur_mode, mode); make_mode (); } remove_mode (mode) char *mode; { register char *cur, *c, *m; if (*cur_mode == 0) return; if (cur_mode != mode_buf) { strcpy (mode_buf, cur_mode); cur_mode = mode_buf; } for (cur = cur_mode ; *cur ; cur++) if (*cur == *mode) /* 1st char matches */ { for (c = cur, m = mode ; *m && (*m == *c) ; m++, c++) ; if (!(*m)) /* ok, mode matched */ { /* kill leading ", " */ if (*(cur - 1) == ' ') --cur; if (*(cur - 1) == ',') --cur; for ( ; *cur = *c ; cur++, c++) ; /* recopy to end */ make_mode (); return; } } } #endif /*COMMENT*/ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEMAIN ELLE Main Command Loop */ #include "elle.h" #include #if !(V6) #include #else #include "eesigs.h" /* Use this on V6 system */ #endif /*V6*/ char *argfile[MAXARGFILES]; /* Filename args at startup */ extern int (*sbm_debug)(); extern int (*sbv_debug)(); int (*vfy_vec)(); /* If non-zero, routine to verify data * after each main-loop command */ main (argc, argv) int argc; char **argv; { register int c; /* Current command character */ register int i; static int waitct; extern int errsbm(); #if SUN extern int sun_rdevf; /* from EESUN */ #endif #ifdef STKMEM char stackm[STKMEM]; /* Allocate some unused stack space */ #endif /*STKMEM*/ sbv_debug = errsbm; /* Load with addrs of routine to */ sbm_debug = errsbm; /* process SB and SBM errors. */ #ifdef STKMEM sbm_init(&stackm[0],(SBMO)STKMEM); /* Initialize mem alloc rtns */ #endif /*STKMEM*/ #if SUN sun_main(&argc, argv); /* On SUN, invoke window startup */ #endif /*SUN*/ setbuf(stdout, (char *)NULL); /* Remove all stdio buffering */ setbuf(stderr, (char *)NULL); /* in case of error reports. */ waitct = 0; /* debugging */ doargs(argc,argv); /* Set up args */ initialize (); /* Initialize the editor */ if (argfile[0]) /* shell line arg */ find_file(argfile[0]); #if MAXARGFILES > 1 if(argfile[1]) { f_2winds(); /* Make 2 windows, go to 2nd */ i = 1; #if MAXARGFILES > 2 for (; i < MAXARGFILES; ++i) #endif /* > 2 files */ find_file(argfile[i]); /* Get further file(s) */ f_othwind(); /* Move back to 1st window */ } #endif /* > 1 file */ redp(RD_SCREEN|RD_MODE); /* Clear and show mode line */ setexit(0); /* catch for ints, ^G throws */ /* ----------------------------------------------------------- ** ELLE MAIN LOOP ** */ for (;;) { /* First set up default arg unless last cmd specified it */ if(this_cmd != ARGCMD) { exp = 1; /* Default arg is 1 */ exp_p = 0; /* Say no explicit arg */ last_cmd = this_cmd; } this_cmd = 0; askclr(); /* If stuff asked, say to clear it */ if(cmd_wait()) waitct++; else if(rd_type != 0) redisplay(); /* Redisplay if needed and no input */ #if SUN sun_rdevf = 1; /* Allow mouse events on this input */ #endif c = cmd_read(); /* Read an editor command */ sayclr(); /* Ask to clear echo area cleverly */ #if SUN if(c != -1) /* SUN may not have real input */ #endif /* if mouse event happened. */ cmd_xct(c); /* Execute the command char! */ if(vfy_vec) /* If debugging, */ (*vfy_vec)(1); /* verify data structs right away */ } } char *prof_file; /* Can specify user profile filename */ doargs(argc,argv) int argc; char **argv; { register int cnt, c; register char **av; extern int tibfmsk; int argfiles = 0; int argsignored = 0; av = argv; cnt = argc; #if V6 /* V6 doesn't have environment thus no TERM var */ /* Hack to force terminal type; analyze pgm name to get * possible ".type" suffix. */ if(cnt && (c = strlen(*av))) while(--c >= 0) { switch(av[0][c]) { case '.': tv_stype = &av[0][c+1]; case '/': break; default: continue; } break; } #endif /*V6*/ while(--cnt > 0) { ++av; if(*av[0] != '-') /* If not switch, */ { /* assume it's an input filename */ if (argfiles < MAXARGFILES) argfile[argfiles++] = *av; else ++argsignored; continue; } c = upcase(av[0][1]); switch(c) /* Switches without args */ { case 'I': /* Allow debug ints */ dbg_isw = 1; continue; case '8': /* Ask for 8-bit input */ tibfmsk = 0377; continue; case '7': /* Ask for 7-bit input */ tibfmsk = 0177; continue; #if IMAGEN case 'R': /* Debug redisplay stuff */ dbg_redp = 1; continue; #endif /*IMAGEN*/ } if(--cnt <= 0) goto stop; ++av; switch(c) /* Switches with args */ { case 'T': /* Terminal type */ tv_stype = *av; break; case 'P': prof_file = *av; default: goto stop; } continue; stop: printf("ELLE: bad switch: %s\n",*av); exit(1); } if (argsignored > 0) { printf("ELLE: more than %d file args, %d ignored.\n", MAXARGFILES, argsignored); sleep(2); /* Complain but continue after pause */ } } int f_throw(); /* throw function */ int bite_bag(); /* Error handling routine */ int hup_exit(); /* Hangup handling routine */ struct majmode ifunmode = { "Fundamental" }; initialize () /* Initialization */ { #if SUN extern int sun_winfd; #endif cur_mode = fun_mode = &ifunmode; /* Set current major mode */ unrchf = pgoal = -1; if(!homedir) { #if V6 extern char *logdir(); homedir = logdir(); #else /* V7 */ homedir = getenv("HOME"); #endif /*-V6*/ } sbx_tset((chroff)0,0); /* Create swapout file */ /* (Temporary hack, fix up later) */ hoard(); /* Hoard a FD for write purposes */ redp_init(); /* Set up the display routines */ init_buf(); /* Set up initial buffers */ set_profile(prof_file); /* Set up user profile */ #if SUN if(sun_winfd) sun_init(); #endif /*SUN*/ /* Set up signal handlers */ #if 0 /* not really used */ signal (SIGQUIT, f_throw); /* Quit - on ^G */ #endif #if !(MINIX) signal (SIGSYS, bite_bag); /* Bad arg to Sys call */ #endif signal (SIGSEGV, bite_bag); /* Segmentation Violation */ #if !(COHERENT) signal (SIGILL, bite_bag); /* Illegal Instruction interrupt */ signal (SIGBUS, bite_bag); /* Bus Error interrupt */ #endif /*-COHERENT*/ #if !(TOPS20) /* T20 just detaches job */ signal (SIGHUP, hup_exit); /* Terminal Hangup interrupt */ #endif /*-TOPS20*/ } /* NOTE: This routine is not actually used, because ELLE does not * allow interrupts to do anything. */ /* EFUN: "Error Throw" */ f_throw () /* abort whatever is going on */ { ring_bell (); curs_lin = -1000; /* make t_curpos do something */ redp(RD_MOVE); /* crock: cursor seems to move, so fix it */ signal(SIGQUIT, f_throw); /* rearm signal */ /* unwind_stack(main); */ reset(1); /* throw to main loop */ } /* RING_BELL - General-purpose feeper when something goes wrong with * a function. */ ring_bell() { t_bell(); /* Tell user something's wrong */ #if FX_SKMAC f_ekmac(); /* Stop collecting keyboard macro if any */ #endif /*FX_SKMAC*/ } /* EFUN: "Return to Superior" * Behavior here is somewhat system-dependent. If it is possible to * suspend the process and continue later, we do not ask about modified * buffers. Otherwise, we do. Questioning can always be forced by using * the prefix ^U. * Note that here we try to be very careful about not letting the user * exit while buffers are still modified, since UNIX flushes the process * if we exit. Also, the code here conspires with sel_mbuf to rotate * through all modified buffers, complaining about a different one each time, * so that the user need not even know how to select a buffer! */ f_retsup() { register char *reply; register int c; register struct buffer *b, *b2; extern struct buffer *sel_mbuf(); extern int tsf_pause; /* If we have capability of pausing and later continuing, do that, * except if CTRL-U forces us into question/save/quit behavior. */ if(tsf_pause && (exp_p != 4)) { clean_exit(); /* Return TTY to normal mode */ ts_pause(); /* Pause this inferior */ set_tty(); /* Continued, return to edit mode */ redp(RD_SCREEN); return; } /* Sigh, do more typical "Are you sure" questioning prior to * killing the editor permanently. */ b = cur_buf; if((b = sel_mbuf(b)) || (b = sel_mbuf((struct buffer *)0)) ) { if(b2 = sel_mbuf(b)) reply = ask( "Quit: buffers %s, %s,... still have changes - forget them? ", b->b_name, b2->b_name); else reply = ask( "Quit: buffer %s still has changes - forget them? ", b->b_name); } else { #if IMAGEN /* Do not ask further if nothing modified */ barf("Bye"); clean_exit(); exit(0); #else reply = ask("Quit? "); >>>>>#endif /*-IMAGEN*/ } if (reply == 0) return; /* Aborted, just return */ c = upcase(*reply); /* Get 1st char of reply */ chkfree(reply); switch(c) { case 'Y': #if IMAGEN barf("Bye"); #endif /*IMAGEN*/ clean_exit(); exit(0); #if 0 case 'S': /* Suspend command for debugging */ bkpt(); return; #endif /*COMMENT*/ default: /* Complain */ ring_bell(); case 'N': if(b) /* B set if we have any modified buffers */ { sel_buf(b); if(b->b_fn) saynow("Use ^X ^S to save buffer"); else saynow("Use ^X ^W to write out buffer"); } } } #if FX_WFEXIT /* EFUN: "Write File Exit" (not EMACS) - from IMAGEN config */ f_wfexit() { exp_p = 1; /* Ensure f_savefiles asks no questions */ if (! f_savefiles()) /* Save all modified buffers, but */ return; /* stay here if any save fails */ saynow("Bye"); clean_exit(); exit(0); } #endif /*FX_WFEXIT*/ /* Subprocess-handling stuff; put here for time being. */ /* EFUN: "Push to Inferior" */ #if TOPS20 #include /* Support for KCC forkexec() call */ #endif f_pshinf() { register int res; register int (*sav2)(), (*sav3)(); int pid, status; char *shellname; #if IMAGEN char fullshell[64]; #endif /*IMAGEN*/ sav2 = signal(SIGINT, SIG_IGN); /* Ignore TTY interrupts */ sav3 = signal(SIGQUIT, SIG_IGN); /* Ditto TTY "quit"s */ clean_exit(); /* Restore normal TTY modes */ #if TOPS20 { struct frkxec fx; fx.fx_flags = FX_WAIT | FX_T20_PGMNAME; fx.fx_name = "SYS:EXEC.EXE"; fx.fx_argv = fx.fx_envp = NULL; if (forkexec(&fx) < 0) writerr("Cannot run EXEC"); } #else /*-TOPS20*/ switch(pid = fork()) { case -1: writerr("Cannot fork"); break; case 0: /* We're the child */ for(res = 3; res < 20;) /* Don't let inf hack fd's */ close(res++); #if V6 execl("/bin/sh","-sh",0); #else signal(SIGINT, SIG_DFL); /* V7 shell wants this?? */ signal(SIGQUIT, SIG_DFL); /* */ #if IMAGEN if((shellname = getenv("SHELL")) == 0) shellname = "sh"; strcpy(fullshell, "/bin/"); strcat(fullshell, shellname); shellname = fullshell; #else if((shellname = getenv("SHELL")) == 0) shellname = "/bin/sh"; #endif /*-IMAGEN*/ if((shellname = getenv("SHELL")) == 0) shellname = "/bin/sh"; execl(shellname, shellname, 0); #endif /*-V6*/ writerr("No shell!"); exit(1); break; default: while((res = wait(&status)) != pid && res != -1); break; } #endif /*-TOPS20*/ signal(SIGINT, sav2); /* Restore signal settings */ signal(SIGQUIT, sav3); set_tty(); /* Restore editor TTY modes */ redp(RD_SCREEN|RD_MODE); /* Done, redisplay */ } /* Miscellaneous utility routines - memory alloc/free and string hacking. * If this page becomes overly large, it can be split off into a separate * file called E_MISC. */ char * strdup(s) char *s; /* Note that STRCPY's return val must be its 1st arg */ { char *strcpy(); return(strcpy(memalloc((SBMO)(strlen(s)+1)), s)); } char * memalloc(size) SBMO size; { register SBMA ptr; extern SBMA sbx_malloc(); if ((ptr = (SBMA)sbx_malloc(size)) != 0) return((char *)ptr); barf("ELLE: No memory left"); askerr(); return(0); /* If we dare to continue... */ } chkfree (ptr) SBMA ptr; { if(!free(ptr)) { errbarf("Something overwrote an allocated block!"); askerr(); } } /* USTRCMP - Uppercase String Compare. * Returns 0 if mismatch, * 1 if full match, * -1 if str1 runs out first (partial match) */ ustrcmp(str1,str2) char *str1, *str2; { register char *s1, *s2; register int c; s1 = str1; s2 = str2; while(c = *s1++) { if(c != *s2 && upcase(c) != upcase(*s2)) return(0); s2++; } return(c == *s2 ? 1 : -1); } /* WRITERR(str) - Output string to standard error output. ** This is a separate routine to save a little space on calls. */ writerr(str) char *str; { return(writez(2, str)); } /* WRITEZ(fd, str) - Miscellaneous general-purpose string output. */ writez(fd,acp) int fd; char *acp; { register char *cp; cp = acp; while(*cp++); write(fd,acp,cp-acp-1); } /* ELLE - Copyright 1982, 1985, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEMAKE - IMAGEN configuration functions for interfacing to "make". * Written by (I think) Chris Ryland at IMAGEN, who also * wrote other functions scattered through ELLE. These are either * conditionalized or are commented as being derived from the IMAGEN * configuration. * * KLH: An attempt has been made to keep these routines updated as ELLE * changed, but their workings cannot be guaranteed. */ /* * eemake: "make" (and other program) support * * Next-error depends on programs writing error messages of the form: * "file", line n: message * which is a de facto standard, at least in some worlds. */ #include "elle.h" #if !(IMAGEN) /* Only with IMAGEN config for now */ f_xucmd() {} f_make() {} f_nxterr() {} #else #include struct buffer *exec_buf; /* Ptr to "Execution" buffer */ /* Only external ref is from e_buff.c */ #define MSGLENGTH (scr_wid - 11) /* Max length of message */ int fresh_make = 1; /* Fresh Execution buffer contents */ chroff last_error_BOL; /* Dot for last-error's BOL */ /* EFUN: "Execute Unix Command" */ f_xucmd() { make_or_unix_cmd(0); } /* EFUN: "Execute Make" */ f_make() { make_or_unix_cmd(1); } /* EFUN: "Find Next Error" */ f_nxterr() { register struct sbstr *sb; register char *cp; register int c; char file[64], line[32]; #ifdef ONEWINDOW char msg[512]; #endif chroff linedot; int lineno; register int len; sel_execbuf(); if (! fresh_make) { e_go(last_error_BOL); e_gonl(); } else { fresh_make = 0; e_gobob(); last_error_BOL = e_dot(); } /* Looking for `"file", line n: msg' */ if (! e_search("\", line ", 8, 0)) goto failed; linedot = e_dot(); e_gobol(); /* Found something, get to BOL */ if (e_getc() != '"') goto failed; /* Insist on beginning "file" */ cp = file; /* Pick up filename */ while ((c = e_getc()) != '"') *cp++ = c; *cp = 0; e_go(linedot); /* Back to after "line " */ cp = line; while ((c = e_getc()) >= '0' && c <= '9') *cp++ = c; *cp = 0; lineno = atoi(line); /* Pick up line number */ #ifdef ONEWINDOW cp = msg; /* Now get rest of line to msg */ len = 0; /* But keep length <= MSGLENGTH */ e_getc(); /* Go past purported space */ while ((c = e_getc()) != LF && c != EOF && len <= MSGLENGTH) { if (c == '\t') len = (len + 8) & ~07; else if (c < ' ' || c > 0176) len += 2; else ++len; *cp++ = c; } *cp = 0; if (len > MSGLENGTH) strcat(msg, "..."); #ifdef DEBUG say("file "); saytoo(file); saytoo(", line "); saytoo(line); saytoo(", msg: "); sayntoo(msg); #else say(line); saytoo(": "); sayntoo(msg); #endif /*DEBUG*/ #else /* -ONEWINDOW */ f_begline(); /* Get to start of line */ last_error_BOL = e_dot(); /* Remember this position */ exp_p = 1; /* Make this the new top line */ exp = 0; f_newwin(); upd_wind(0); #endif /*ONEWINDOW*/ /* Now, visit the given file and line */ #ifdef ONEWINDOW #else f_othwind(); /* To other window */ #endif find_file(file); f_gobeg(); down_line(lineno - 1); #ifdef READJUST /* NAW */ exp_p = 1; exp = cur_win->w_ht / 4; /* Adjust how we look at "error" */ f_newwin(); #endif /*READJUST*/ return; failed: ding("No more errors!"); fresh_make = 1; /* Fake-out: pretend starting over */ return; } /* Do the "cmd" and put its output in the Execution buffer */ do_exec(cmd, nicely) char *cmd; int nicely; { register int n; int status, res, pid, fd[2]; char nicecmd[256]; char pipebuff[512]; struct buffer *b; b = cur_buf; sel_execbuf(); /* Get our execution buffer up */ ed_reset(); /* Clear it out */ fresh_make = 1; upd_wind(0); if (nicely) sayntoo(" ...starting up..."); else sayntoo(" ...starting up (nasty person)..."); pipe(fd); switch (pid = fork()) { case -1: /* Fork failed, in parent */ ding("Cannot fork!?!"); break; case 0: /* In child */ for (n = 0; n < 20; ++n) if (n != fd[0] && n != fd[1]) close(n); open("/dev/null", 0); /* Give ourselves empty stdin */ dup(fd[1]); dup(fd[1]); /* stdout, stderr out to pipe */ close(fd[1]); /* Close the pipe itself */ close(fd[0]); if (nicely) { strcpy(nicecmd, "nice -4 "); strcat(nicecmd, cmd); execl("/bin/sh", "sh", "-c", nicecmd, 0); } else execl("/bin/sh", "sh", "-c", cmd, 0); write(1, "Cannot execute!", 15); _exit(-1); break; default: /* Parent */ close(fd[1]); /* Close the output direction */ while ((n = read(fd[0], pipebuff, sizeof(pipebuff))) > 0) { ed_nsins(pipebuff, n); upd_wind(0); saynow("Chugging along..."); } close(fd[0]); while ((res = wait(&status)) != pid && res != -1) ; /* Wait for this fork to die */ f_bufnotmod(); /* Buffer is fresh */ saynow("Done!"); break; } f_othwind(); /* Back to other window */ chg_buf(b); /* Back to original buffer */ } char last_make_cmd[256]; /* Last Unix/make command */ int have_last_make_cmd = 0; make_or_unix_cmd(domake) int domake; { #if APOLLO register int nicely = exp == 16; /* modification for apollo */ #else register int nicely = exp != 16; #endif /*-APOLLO*/ register char *reply, *cmd = 0; if (domake) /* If "make"-style, */ { int savp = exp_p; exp_p = 1; f_savefiles(); /* write modified files quietly */ exp_p = savp; } if (exp_p || ! domake) { /* Arg given make, or Unix command */ reply = ask((! domake) ? "Unix command: " : "Command: "); if (! reply) return; if (*reply == 0) { if (have_last_make_cmd) cmd = &last_make_cmd[0]; else { chkfree(reply); ding("No previous command!"); return; } } else cmd = reply; if (cmd != &last_make_cmd[0]) /* Update last command */ strcpy(last_make_cmd, cmd); have_last_make_cmd = 1; say("Command: "); sayntoo(cmd); do_exec(cmd, nicely); chkfree(reply); } else if (have_last_make_cmd) { say("Command: "); sayntoo(last_make_cmd); do_exec(last_make_cmd, nicely); } else { saynow("Command: make"); do_exec("make", nicely); } } sel_execbuf() { if(!exec_buf) { /* Make execution buffer; don't let anyone kill it */ exec_buf = make_buf("Execution"); exec_buf->b_flags |= B_PERMANENT; } popto_buf(exec_buf); } /* Utility: pop the given buffer to a window, getting into 2-window mode */ popto_buf(b) register struct buffer *b; { /* See if we already have this buffer in a visible window */ if (b == cur_win->w_buf) { if (oth_win == 0) { f_2winds(); f_othwind(); /* Get back to our window */ } } else if (oth_win != 0 && b == oth_win->w_buf) f_othwind(); else if (oth_win == 0) { /* One window mode */ f_2winds(); /* Get two, get into second */ sel_buf(b); /* Select our new buffer */ } else { f_othwind(); /* Get to other window */ sel_buf(b); /* and select our buffer */ } } #endif /*IMAGEN*/ #define PROF_VER (1) struct profile { int version; int chrvcnt; char *chrvec; int metavcnt; char *metavec; int extvcnt; char *extvec; int menuvcnt; char *menuvec; }; struct stored_profile { unsigned char version[2]; unsigned char chrvcnt[2], chrvec[2]; unsigned char metavcnt[2], metavec[2]; unsigned char extvcnt[2], extvec[2]; unsigned char menuvcnt[2], menuvec[2]; }; #define prof_pack(p, n) ((p)[0] = (n) & 0xFF, (p)[1] = (n) >> 8) #define prof_upack(p) ((p)[0] | ((p)[1] << 8)) #ifndef _ANSI #include #endif /* eebit.c */ _PROTOTYPE( int *chballoc, (int size) ); _PROTOTYPE( int chbit, (int *array, int c) ); _PROTOTYPE( int chbis, (int *array, int c) ); _PROTOTYPE( int chbic, (int *array, int c) ); /* eebuff.c */ _PROTOTYPE( int f_selbuffer, (void) ); _PROTOTYPE( int f_selxbuffer, (void) ); _PROTOTYPE( int f_kbuffer, (void) ); _PROTOTYPE( int f_listbufs, (void) ); _PROTOTYPE( int f_bufnotmod, (void) ); _PROTOTYPE( int f_eolmode, (void) ); _PROTOTYPE( int f_gobeg, (void) ); _PROTOTYPE( int f_goend, (void) ); _PROTOTYPE( int f_whatpage, (void) ); _PROTOTYPE( int init_buf, (void) ); _PROTOTYPE( struct buffer *make_buf, (char *bname) ); _PROTOTYPE( struct buffer *find_buf, (char *name) ); _PROTOTYPE( int sel_buf, (struct buffer *b) ); _PROTOTYPE( int chg_buf, (struct buffer *newbuf) ); _PROTOTYPE( int unlk_buf, (struct buffer *bufp) ); _PROTOTYPE( struct buffer *sel_mbuf, (struct buffer *buf) ); _PROTOTYPE( struct buffer *sel_mbuf, (struct buffer *buf) ); _PROTOTYPE( struct buffer *sel_nbuf, (struct buffer *buf) ); _PROTOTYPE( int kill_buf, (struct buffer *buf) ); _PROTOTYPE( int zap_buffer, (void) ); _PROTOTYPE( int ask_kbuf, (struct buffer *buf) ); _PROTOTYPE( int f_2winds, (void) ); _PROTOTYPE( int f_1wind, (void) ); _PROTOTYPE( int f_othwind, (void) ); _PROTOTYPE( int f_growind, (void) ); _PROTOTYPE( int f_shrinkwind, (void) ); _PROTOTYPE( int f_delwind, (void) ); _PROTOTYPE( int f_sowind, (void) ); _PROTOTYPE( int f_2modewinds, (void) ); _PROTOTYPE( int chk2modws, (void) ); _PROTOTYPE( int init_win, (void) ); _PROTOTYPE( int chg_win, (struct window *newwin) ); _PROTOTYPE( struct window *make_win, (int pos, int ht, struct buffer *buf) ); _PROTOTYPE( int kill_win, (struct window *win) ); _PROTOTYPE( int mk_showin, (struct buffer *b) ); _PROTOTYPE( struct window *make_mode, (struct window *bw) ); _PROTOTYPE( int buf_mod, (void) ); _PROTOTYPE( int buf_tmat, (chroff dot) ); _PROTOTYPE( int buf_tmod, (chroff offset) ); /* eecmds.c */ _PROTOTYPE( int f_pfxmeta, (void) ); _PROTOTYPE( int f_pfxext, (void) ); _PROTOTYPE( int f_uarg, (int ch) ); _PROTOTYPE( int f_negarg, (int ch) ); _PROTOTYPE( int f_argdig, (int ch) ); _PROTOTYPE( int f_setprof, (void) ); _PROTOTYPE( int f_vtbuttons, (void) ); _PROTOTYPE( int cmd_wait, (void) ); _PROTOTYPE( int cmd_read, (void) ); _PROTOTYPE( int cmd_xct, (int ch) ); _PROTOTYPE( int cmd_idx, (int c) ); _PROTOTYPE( int set_profile, (char *filename) ); _PROTOTYPE( int init_menu, (void) ); /* eediag.c */ _PROTOTYPE( int f_debug, (int ch) ); _PROTOTYPE( char *vfy_data, (int flag) ); _PROTOTYPE( int dbg_diag, (void) ); _PROTOTYPE( int vfy_exer, (int pf, int gcfrq) ); _PROTOTYPE( int db_prwind, (struct window *w) ); _PROTOTYPE( char *db_scflgs, (int flags) ); /* eedisp.c */ _PROTOTYPE( int set_tty, (void) ); _PROTOTYPE( int clean_exit, (void) ); _PROTOTYPE( int set_scr, (void) ); _PROTOTYPE( int redisplay, (void) ); _PROTOTYPE( int fupd_wind, (struct window *w) ); _PROTOTYPE( int upd_curs, (chroff adot) ); _PROTOTYPE( int d_line, (chroff cdot) ); _PROTOTYPE( int d_ncols, (int lcnt, int ccol) ); _PROTOTYPE( int d_lupd, (struct window *w, int idx) ); _PROTOTYPE( int clear_wind, (struct window *w) ); _PROTOTYPE( int fix_wind, (struct window *win) ); _PROTOTYPE( int inwinp, (struct window *win, chroff cdot) ); _PROTOTYPE( int upd_wind, (struct window *win) ); _PROTOTYPE( int slineq, (struct scr_line *olds, struct scr_line *news) ); _PROTOTYPE( int upd_line, (int y) ); _PROTOTYPE( int fillset, (char *str, int cnt, int c) ); _PROTOTYPE( int fillsp, (char *str, int cnt) ); _PROTOTYPE( int inspc, (char *cp0, char *cpl, int cnt) ); _PROTOTYPE( int fix_line, (struct scr_line *slp, struct scr_line *olds) ); _PROTOTYPE( int sctrin, (char *to, int lim, int ccol) ); _PROTOTYPE( int inslin, (int line, int n, struct window *win) ); _PROTOTYPE( int dellin, (int line, int n, struct window *win) ); _PROTOTYPE( int t_dostandout, (int on) ); _PROTOTYPE( int t_move, (int y, int x) ); _PROTOTYPE( int t_docleol, (void) ); /* eeedit.c */ _PROTOTYPE( int e_reset, (void) ); _PROTOTYPE( int e_rgetc, (void) ); _PROTOTYPE( int e_rdelc, (void) ); _PROTOTYPE( int e_delc, (void) ); _PROTOTYPE( int e_getc, (void) ); _PROTOTYPE( int e_backc, (void) ); _PROTOTYPE( int e_putc, (int c) ); _PROTOTYPE( int e_peekc, (void) ); _PROTOTYPE( int e_ovwc, (int ch) ); _PROTOTYPE( SBSTR *e_copyn, (chroff off) ); _PROTOTYPE( int e_deln, (chroff off) ); _PROTOTYPE( int e_setcur, (void) ); _PROTOTYPE( int e_gosetcur, (chroff dot) ); _PROTOTYPE( int e_gocur, (void) ); _PROTOTYPE( int e_gobob, (void) ); _PROTOTYPE( int e_goeob, (void) ); _PROTOTYPE( int e_go, (chroff dot) ); _PROTOTYPE( int e_igoff, (int ioff) ); _PROTOTYPE( int e_goff, (chroff off) ); _PROTOTYPE( int e_gobol, (void) ); _PROTOTYPE( int e_goeol, (void) ); _PROTOTYPE( int e_gonl, (void) ); _PROTOTYPE( int e_gopl, (void) ); _PROTOTYPE( chroff e_dot, (void) ); _PROTOTYPE( chroff e_nldot, (void) ); _PROTOTYPE( chroff e_pldot, (void) ); _PROTOTYPE( chroff e_boldot, (void) ); _PROTOTYPE( chroff e_eoldot, (void) ); _PROTOTYPE( chroff e_alldot, (SBBUF *sbp, int (*rtn )()) ); _PROTOTYPE( chroff e_blen, (void) ); _PROTOTYPE( int ex_reset, (struct buffer *b) ); _PROTOTYPE( int ex_go, (SBBUF *sbp, chroff loc) ); _PROTOTYPE( chroff ex_dot, (SBBUF *sbp) ); _PROTOTYPE( chroff ex_boldot, (SBBUF *sbp, chroff dot) ); _PROTOTYPE( chroff ex_alldot, (SBBUF *sbp, int (*rtn )(), chroff dot) ); _PROTOTYPE( int ex_gonl, (SBBUF *sbp) ); _PROTOTYPE( int ex_goeol, (SBBUF *sbp) ); _PROTOTYPE( int ex_gobol, (SBBUF *sbp) ); _PROTOTYPE( int ex_gopl, (SBBUF *sbp) ); _PROTOTYPE( chroff ex_blen, (SBBUF *sbp) ); _PROTOTYPE( int e_gofwsp, (void) ); _PROTOTYPE( int e_gobwsp, (void) ); _PROTOTYPE( int e_goline, (int i) ); _PROTOTYPE( int e_lblankp, (void) ); _PROTOTYPE( int e_insn, (int ch, int cnt) ); _PROTOTYPE( int e_sputz, (char *acp) ); _PROTOTYPE( int boleq, (chroff dot1, chroff dot2) ); _PROTOTYPE( char *dottoa, (char *str, chroff val) ); _PROTOTYPE( int e_gobpa, (void) ); _PROTOTYPE( int e_goepa, (void) ); _PROTOTYPE( int exp_do, (int (*rpos )(), int (*rneg )()) ); _PROTOTYPE( int e_fwsp, (void) ); _PROTOTYPE( int e_bwsp, (void) ); _PROTOTYPE( int c_wsp, (int ch) ); _PROTOTYPE( int c_pwsp, (int ch) ); _PROTOTYPE( int delimp, (int c) ); _PROTOTYPE( int e_wding, (chroff *adot, int n) ); _PROTOTYPE( chroff e_wdot, (chroff dot, int n) ); _PROTOTYPE( int e_gowd, (int n) ); _PROTOTYPE( int e_search, (char *mstr, int mlen, int backwards) ); /* eeerr.c */ _PROTOTYPE( int f_bkpt, (void) ); _PROTOTYPE( int bpt, (void) ); _PROTOTYPE( char *strerror, (int num) ); _PROTOTYPE( int errsbm, (int type, int (*adr )(), char *str, int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12) ); _PROTOTYPE( int bite_bag, (int fault) ); _PROTOTYPE( int hup_exit, (void) ); _PROTOTYPE( int errint, (void) ); _PROTOTYPE( int askerr, (void) ); _PROTOTYPE( char *asklin, (char *acp) ); /* eef1.c */ _PROTOTYPE( int f_insself, (int c) ); _PROTOTYPE( int f_quotins, (void) ); _PROTOTYPE( int f_crlf, (void) ); _PROTOTYPE( int f_fchar, (void) ); _PROTOTYPE( int f_bchar, (void) ); _PROTOTYPE( int f_dchar, (void) ); _PROTOTYPE( int f_bdchar, (void) ); _PROTOTYPE( int ef_deln, (int x) ); _PROTOTYPE( int f_delspc, (void) ); _PROTOTYPE( int f_tchars, (void) ); _PROTOTYPE( int f_fword, (void) ); _PROTOTYPE( int f_bword, (void) ); _PROTOTYPE( int f_kword, (void) ); _PROTOTYPE( int f_bkword, (void) ); _PROTOTYPE( int f_twords, (void) ); _PROTOTYPE( int f_ucword, (void) ); _PROTOTYPE( int f_lcword, (void) ); _PROTOTYPE( int f_uciword, (void) ); _PROTOTYPE( int case_word, (int downp) ); /* eef2.c */ _PROTOTYPE( int f_begline, (void) ); _PROTOTYPE( int f_endline, (void) ); _PROTOTYPE( int f_nxtline, (void) ); _PROTOTYPE( int f_prvline, (void) ); _PROTOTYPE( int f_dnrline, (void) ); _PROTOTYPE( int f_uprline, (void) ); _PROTOTYPE( int f_oline, (void) ); _PROTOTYPE( int f_delblines, (void) ); _PROTOTYPE( int f_kline, (void) ); _PROTOTYPE( int f_bkline, (void) ); _PROTOTYPE( int f_goline, (void) ); _PROTOTYPE( int down_bline, (int arg) ); _PROTOTYPE( int down_line, (int x) ); _PROTOTYPE( int f_set?????????mark, (void) ); _PROTOTYPE( int f_exchmark, (void) ); _PROTOTYPE( int f_kregion, (void) ); _PROTOTYPE( int f_copreg, (void) ); _PROTOTYPE( int f_ucreg, (void) ); _PROTOTYPE( int f_lcreg, (void) ); _PROTOTYPE( int ef_creg, (int downp) ); _PROTOTYPE( int f_fillreg, (void) ); _PROTOTYPE( int chkmark, (void) ); _PROTOTYPE( int f_fpara, (void) ); _PROTOTYPE( int f_bpara, (void) ); _PROTOTYPE( int f_mrkpara, (void) ); _PROTOTYPE( int f_fillpara, (void) ); /* eef3.c */ _PROTOTYPE( int f_appnkill, (void) ); _PROTOTYPE( int f_unkill, (void) ); _PROTOTYPE( int f_unkpop, (void) ); _PROTOTYPE( int f_indatm, (void) ); _PROTOTYPE( int f_indnl, (void) ); _PROTOTYPE( int f_backind, (void) ); _PROTOTYPE( int f_indcomm, (void) ); _PROTOTYPE( int f_indrel, (void) ); _PROTOTYPE( int insertmatch, (int c) ); _PROTOTYPE( int f_matchbrack, (void) ); _PROTOTYPE( int matchonelevel, (int mc) ); /* eefd.c */ _PROTOTYPE( int f_newwin, (void) ); _PROTOTYPE( int f_nscreen, (void) ); _PROTOTYPE( int f_pscreen, (void) ); _PROTOTYPE( int f_othnscreen, (void) ); _PROTOTYPE( int f_lwindbord, (void) ); _PROTOTYPE( int f_scupwind, (void) ); _PROTOTYPE( int f_scdnwind, (void) ); _PROTOTYPE( int f_mvwtop, (void) ); _PROTOTYPE( int f_mvwbot, (void) ); _PROTOTYPE( int d_screen, (int rep) ); _PROTOTYPE( int scroll_win, (int n) ); _PROTOTYPE( int d_curind, (void) ); _PROTOTYPE( int indtion, (chroff lin) ); _PROTOTYPE( int inindex, (chroff lin, int xpos) ); _PROTOTYPE( int d_gopl, (void) ); _PROTOTYPE( int d_gonl, (void) ); _PROTOTYPE( int d_goloff, (int cnt) ); _PROTOTYPE( int d_fgoloff, (int cnt) ); _PROTOTYPE( int d_fixcur, (void) ); _PROTOTYPE( int d_backup, (int nlin) ); /* eefed.c */ _PROTOTYPE( int ed_insert, (int c) ); _PROTOTYPE( int ed_insn, (int ch, int cnt) ); _PROTOTYPE( int ed_crins, (void) ); _PROTOTYPE( int ed_sins, (char *s) ); _PROTOTYPE( int ed_nsins, (char *s, int i) ); _PROTOTYPE( int ed_indto, (int goal) ); _PROTOTYPE( int ed_setcur, (void) ); _PROTOTYPE( int ed_go, (chroff dot) ); _PROTOTYPE( int ed_goff, (chroff off) ); _PROTOTYPE( int ed_igoff, (int ioff) ); _PROTOTYPE( int ed_reset, (void) ); _PROTOTYPE( int ed_deln, (chroff off) ); _PROTOTYPE( int ed_delete, (chroff dot1, chroff dot2) ); _PROTOTYPE( int ed_kill, (chroff dot1, chroff dot2) ); _PROTOTYPE( int kill_push, (SBSTR *sdp) ); _PROTOTYPE( int ed_case, (chroff dot1, chroff dot2, int downp) ); _PROTOTYPE( int upcase, (int ch) ); /* eefile.c */ _PROTOTYPE( int f_ffile, (void) ); _PROTOTYPE( int f_rfile, (void) ); _PROTOTYPE( int f_vfile, (void) ); _PROTOTYPE( int u_r_file, (char *prompt) ); _PROTOTYPE( int f_ifile, (void) ); _PROTOTYPE( int f_sfile, (void) ); _PROTOTYPE( int f_savefiles, (void) ); _PROTOTYPE( int f_wfile, (void) ); _PROTOTYPE( int f_wreg, (void) ); _PROTOTYPE( int f_wlastkill, (void) ); _PROTOTYPE( int hack_file, (char *prompt, int (*rtn )()) ); _PROTOTYPE( int find_file, (char *f_name) ); _PROTOTYPE( int read_file, (char *f_name) ); _PROTOTYPE( int ins_file, (char *f_name) ); _PROTOTYPE( int ferr_ropn, (void) ); _PROTOTYPE( int ferr_wopn, (void) ); _PROTOTYPE( int ferr, (char *str) ); _PROTOTYPE( char *fncons, (char *dest, char *pre, char *f_name, char *post) ); _PROTOTYPE( char *last_fname, (char *f_name) ); _PROTOTYPE( int set_fn, (char *string) ); _PROTOTYPE( int saveworld, (struct buffer *bp, int grunt) ); _PROTOTYPE( int hoard, (void) ); _PROTOTYPE( int unhoard, (void) ); _PROTOTYPE( int expand_file, (char *dfn, char *sfn) ); /* eefill.c */ _PROTOTYPE( int f_sfcol, (void) ); _PROTOTYPE( int f_sfpref, (void) ); _PROTOTYPE( int tstfillp, (int lim) ); _PROTOTYPE( int ed_fill, (chroff begloc, chroff endloc, int flag) ); _PROTOTYPE( int f_fillmode, (void) ); _PROTOTYPE( int fx_insfill, (int c) ); _PROTOTYPE( int fill_cur_line, (void) ); _PROTOTYPE( int f_textmode, (void) ); _PROTOTYPE( int fim_insself, (int c) ); _PROTOTYPE( int fim_dchar, (void) ); _PROTOTYPE( int fim_bdchar, (void) ); _PROTOTYPE( int fim_crlf, (void) ); _PROTOTYPE( int magic_wrap, (int tc) ); _PROTOTYPE( int reveal, (char *msg, int v1, int v2, int v3) ); _PROTOTYPE( int magic_backto_bol, (void) ); _PROTOTYPE( int fill_current_line, (void) ); /* eehelp.c */ _PROTOTYPE( int f_describe, (void) ); /* eekmac.c */ _PROTOTYPE( int f_skmac, (void) ); _PROTOTYPE( int f_ekmac, (void) ); _PROTOTYPE( int f_xkmac, (void) ); _PROTOTYPE( int f_vkmac, (void) ); _PROTOTYPE( int km_getc, (void) ); _PROTOTYPE( int km_inwait, (void) ); _PROTOTYPE( int km_abort, (void) ); _PROTOTYPE( int add_mode, (char *mode) ); _PROTOTYPE( int remove_mode, (char *mode) ); /* eemain.c */ _PROTOTYPE( int doargs, (int argc, char **argv) ); _PROTOTYPE( int initialize, (void) ); _PROTOTYPE( int f_throw, (void) ); _PROTOTYPE( int ring_bell, (void) ); _PROTOTYPE( int f_retsup, (void) ); _PROTOTYPE( int f_wfexit, (void) ); _PROTOTYPE( int f_pshinf, (void) ); _PROTOTYPE( char *strdup, (char *s) ); _PROTOTYPE( char *memalloc, (SBMO size) ); _PROTOTYPE( int chkfree, (SBMA ptr) ); _PROTOTYPE( int ustrcmp, (char *str1, char *str2) ); _PROTOTYPE( int writerr, (char *str) ); _PROTOTYPE( int writez, (int fd, char *acp) ); /* eemake.c */ _PROTOTYPE( int f_xucmd, (void) ); _PROTOTYPE( int f_make, (void) ); _PROTOTYPE( int f_nxterr, (void) ); _PROTOTYPE( int f_xucmd, (void) ); _PROTOTYPE( int f_make, (void) ); _PROTOTYPE( int f_nxterr, (void) ); _PROTOTYPE( int do_exec, (char *cmd, int nicely) ); _PROTOTYPE( int make_or_unix_cmd, (int domake) ); _PROTOTYPE( int sel_execbuf, (void) ); _PROTOTYPE( int popto_buf, (struct buffer *b) ); /* eequer.c */ _PROTOTYPE( int f_querep, (void) ); _PROTOTYPE( int f_repstr, (void) ); _PROTOTYPE( int f_repline, (void) ); _PROTOTYPE( int ed_dorep, (int type, struct majmode *mode) ); /* eeques.c */ #if 0 _PROTOTYPE( char *ask, (char *string, char *arg1, char *arg2, char *arg3) ); #else char *ask(); #endif _PROTOTYPE( int askclr, (void) ); _PROTOTYPE( int say, (char *str) ); _PROTOTYPE( int saynow, (char *str) ); _PROTOTYPE( int saytoo, (char *str) ); _PROTOTYPE( int sayntoo, (char *str) ); _PROTOTYPE( int ding, (char *str) ); _PROTOTYPE( int dingtoo, (char *str) ); _PROTOTYPE( int saylntoo, (char *str, int n) ); _PROTOTYPE( int sayclr, (void) ); #if 0 _PROTOTYPE( int sayall, (char *str, int flags, int len) ); #else int sayall(); #endif _PROTOTYPE( int yellat, (char *str, int line) ); _PROTOTYPE( int yelltoo, (char *str) ); _PROTOTYPE( int errbarf, (char *str) ); _PROTOTYPE( int barf, (char *str) ); _PROTOTYPE( int barf2, (char *str) ); /* eesite.c */ _PROTOTYPE( int ts_inp, (void) ); _PROTOTYPE( int ts_init, (void) ); _PROTOTYPE( int ts_enter, (void) ); _PROTOTYPE( int ts_exit, (void) ); _PROTOTYPE( int tpoke, (int cmd, int bn, int val) ); _PROTOTYPE( int ts_pause, (void) ); /* eesrch.c */ _PROTOTYPE( int f_srch, (void) ); _PROTOTYPE( int f_rsrch, (void) ); _PROTOTYPE( int lin_search, (int backwards) ); _PROTOTYPE( int srchint, (void) ); _PROTOTYPE( char *srch_ask, (char *prompt) ); _PROTOTYPE( int f_risrch, (void) ); _PROTOTYPE( int i_search, (int back) ); /* eeterm.c */ _PROTOTYPE( int t_init, (void) ); _PROTOTYPE( int t_fatal, (char *str) ); _PROTOTYPE( int t_enter, (void) ); _PROTOTYPE( int t_exit, (void) ); _PROTOTYPE( int t_clear, (void) ); _PROTOTYPE( int t_curpos, (int lin, int col) ); _PROTOTYPE( int t_backspace, (void) ); _PROTOTYPE( int t_bell, (void) ); _PROTOTYPE( int t_cleol, (void) ); _PROTOTYPE( int t_inslin, (int n, int bot) ); _PROTOTYPE( int t_dellin, (int n, int bot) ); _PROTOTYPE( int t_inschr, (int n, char *str) ); _PROTOTYPE( int t_delchr, (int n) ); _PROTOTYPE( int t_standout, (int on) ); _PROTOTYPE( int t_direct, (int lin, int col, char *str, int len) ); _PROTOTYPE( int tput, (int ch) ); _PROTOTYPE( int tputz, (char *str) ); _PROTOTYPE( int tputn, (char *str, int cnt) ); _PROTOTYPE( int tbufls, (void) ); _PROTOTYPE( int tgetc, (void) ); _PROTOTYPE( int tinwait, (void) ); /* eevini.c */ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EEQUER Query-Replace and Replace-String functions */ #include "elle.h" /* include structure definitions */ /* EFUN: "Query Replace" */ /* Crude approximation of EMACS function. */ f_querep() { static struct majmode iqrpmode = { "Query Replace" }; ed_dorep(0, &iqrpmode); } /* EFUN: "Replace String" */ /* Similar to Query Replace and uses same code. */ f_repstr() { static struct majmode irepmode = { "Replace String" }; ed_dorep(1, &irepmode); } #if FX_REPLINE /* EFUN: "Replace in Line" (not EMACS) */ /* Acts like Replace String but only operates on current line. ** Currently a big crock. ** Feature of crockishness is that Unkill Pop (M-Y) will restore old ** line. */ f_repline() { extern struct buffer *make_buf(); struct buffer *b, *oldb = cur_buf; static struct majmode rlmode = { "Replace in Line" }; if(!(b = make_buf(" **LINE**"))) { ring_bell(); return; } f_kline(); /* Kill line(s) from original buffer */ chg_buf(b); /* Switch to temp buffer */ f_unkill(); /* Get killed stuff into temp buffer */ e_gosetcur((chroff)0); /* Starting at beginning, */ ed_dorep(1, &rlmode); /* Execute Replace String on it. */ ed_kill((chroff)0, e_blen()); /* Now kill everything in it, */ chg_buf(oldb); /* switch back to original buffer, */ f_unkill(); /* and restore new stuff! */ kill_buf(b); /* Now flush temporary buffer. */ } #endif /* Note that the major mode is set without changing the buffer's major * mode. When the function is done, the current major mode is reset * from the buffer mode. */ ed_dorep(type, mode) /* 0 = Query Replace, 1 = Replace String */ int type; struct majmode *mode; { register int c; register int olen, allflg; char *srch_ask(); char *opromp, *npromp; char *nstr, *ostr; /* Note ostr is == to srch_str */ int nlen; chroff last_loc; #if IMAGEN int nrepled = 0; char replmsg[64]; #endif /*IMAGEN*/ /* Set mode, then get search string and replace string */ #if IMAGEN cur_win->w_buf->b_flags |= B_QUERYREP; #else cur_mode = mode; /* Set major mode pointer */ #endif /*-IMAGEN*/ redp(RD_MODE); nstr = 0; #if IMAGEN opromp = "Old string: "; npromp = "New string: "; #else opromp = "Replace string: "; npromp = "with string: "; #endif /*-IMAGEN*/ if((ostr = srch_ask(opromp)) == 0) goto done; olen = srch_len; /* srch_ask sets this! */ if((nstr = ask("%s%s %s", opromp, ostr, npromp)) == 0) goto done; nlen = ask_len; /* Now enter search and subcommand loop */ allflg = type; /* Unless 0 for Query Rep, replace all */ for(;;) { last_loc = cur_dot; if(e_search(ostr,olen,0) == 0) break; ed_setcur(); /* Cursor moved */ redisp: if(!allflg) redisplay(); /* Update screen */ getcmd: if(!allflg) c = cmd_read(); else c = SP; switch(c) { #if IMAGEN case 'n': #endif /*IMAGEN*/ case DEL: /* Don't replace, go on */ continue; #if IMAGEN case ',': #endif /*IMAGEN*/ case '.': /* Replace and exit */ case SP: /* Replace, go on */ ed_delete(cur_dot,(chroff)(cur_dot-olen)); ed_nsins(nstr,nlen); #if IMAGEN ++nrepled; #endif /*IMAGEN*/ if(c == '.') goto done; continue; #if IMAGEN default: #endif /*IMAGEN*/ case '?': /* Show options */ #if IMAGEN saynow("\ ' '=>change, 'n'=>don't, '.'=>change, quit, '!'=>change rest, '^'=>back up"); #else saynow("\ SP=Replace, DEL=Don't, ESC=Stop, !=Replace all, ^=Back up, .=Replace & Stop"); #endif /*-IMAGEN*/ goto getcmd; case '^': /* Return to last place found */ ed_go(last_loc); goto redisp; case CTRL('G'): case ESC: /* Exit where we are */ goto done; case CTRL('L'): /* Redisplay */ redp(RD_SCREEN); goto redisp; case '!': /* Replace all the rest */ allflg++; goto getcmd; #if !(IMAGEN) case ',': /* Replace and show */ case CTRL('R'): /* Enter edit mode recursively */ case CTRL('W'): /* Delete once and ^R */ saynow("not implemented"); goto getcmd; default: /* Exit and re-read char */ unrchf = c; goto done; #endif /*-IMAGEN*/ } } done: #if IMAGEN cur_win->w_buf->b_flags &= ~B_QUERYREP; #else cur_mode = cur_buf->b_mode; #endif /*-IMAGEN*/ redp(RD_MODE); if(nstr) /* Free nstr (but not ostr, it's == srch_str!) */ chkfree(nstr); #if IMAGEN if (nrepled <= 0) saynow("No replacements done"); else { sprintf(replmsg, "Replaced %d occurences", nrepled); saynow(replmsg); } #endif /*IMAGEN*/ } /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEQUES - Handle queries and status displays */ #include "elle.h" /* * Ask -- ask the user for some input on the lowest line of the screen * * The arg is a string in printf form, followed by up to three args * for the printf string * * The string is read into a sort of mini buffer, only the * last line of which is visible on the screen. All editing * features are available to the user to edit the input string. * When the delim character is typed, input is terminated and * The input string is passed back to the caller. * The delim is either an escape or a cr. * IT IS UP TO THE CALLER TO FREE THIS MEMORY. * * Note that the actual length of the returned string can be found * in the global variable ask_len. This is a crock but allows * callers to hack nulls in arg strings if they want to. */ int chg_win(); struct window *make_mode(); static int ask_lin; /* Saved cursor location when ask is done */ static int ask_blen; /* Non-zero if buffer contains something */ static int ask_cnt; /* Incremented by ask(), cleared by askclr() */ /* Table of allowed functions during ASK */ static char askftab[] = { FN_PFXMETA, FN_INSSELF, FN_BEGLINE, FN_ENDLINE, FN_BCHAR, FN_FCHAR, FN_DCHAR, FN_BDCHAR, FN_TCHARS, FN_QUOTINS, FN_UARG, FN_BKPT, FN_DEBUG, FN_GOBEG, FN_GOEND, FN_FWORD, FN_BWORD, FN_KWORD, FN_BKWORD, FN_UCWORD, FN_LCWORD, FN_UCIWORD, FN_ARGDIG, FN_NEWWIN, FN_KLINE, FN_UNKILL, FN_BKLINE, 0 }; char * ask (string, arg1, arg2, arg3) char *string, *arg1, *arg2, *arg3; { register int i, c; register char *s; struct window *oldwin; char *newline; /* where output line goes */ char cbuf[200]; /* For prompt string creation */ int p_length; /* length of prompt */ chroff anslen; /* Length of answer */ int funnum; /* Crock stuff */ #if FX_FILLMODE extern int fill_mode; int ofillmode = fill_mode; /* Gotta turn this one off */ fill_mode = 0; #endif /*FX_FILLMODE*/ oldwin = cur_win; chg_win (ask_win); ed_reset(); /* Flush contents & request redisp */ ask_lin = cur_win->w_pos; /* Set here in case never redisp */ ask_cnt++; /* Bump # of times called */ /* copy 'string' into line */ cbuf[0] = 0; asklp: sprintf (&cbuf[strlen(cbuf)], string, arg1, arg2, arg3); p_length = strlen(cbuf); /* Find how long it is */ /* now let the user type in */ for(;;) { if ((rd_type & (RDS_WINFLGS|RD_MODE)) && tinwait () == 0) { e_gobob(); /* Gross crock: insert prompt */ e_sputz(cbuf); /* Ugh, bletch */ cur_dot += p_length; /* Temporarily update loc */ redp(RD_WINRES); /* Do complete re-crunch */ upd_wind((struct window *)0); /* Don't interrupt */ /* Ensure mode line is spiffy too. This should ** only have to be invoked the first time ask_win ** redisplay is done, and never thereafter. */ if(rd_type&RD_MODE) /* If mode also needs it, */ fupd_wind(make_mode(user_win)); /* do it */ upd_curs(cur_dot); rd_type &= ~(RDS_WINFLGS|RD_MODE); ask_lin = curs_lin; /* Remember line cursor on */ tbufls(); e_gobob(); /* More crock: Remove prompt */ sb_deln((SBBUF *)cur_buf,(chroff)p_length); /* Ugh etc. */ cur_dot -= p_length; /* Restore loc */ e_gocur(); } exp = 1; exp_p = 0; cont: this_cmd = 0; c = cmd_read(); if ( #if !(ICONOGRAPHICS) c == ESC || #endif /*-ICONOGRAPHICS*/ c == LF || c == CR) break; if (c == BELL) /* ^G means punt.. */ { chg_win(oldwin); ask_blen = 1; /* Assume buffer has something */ ding((char *)0); /* Clear echo window */ ask_cnt = 0; /* Nothing for askclr to do */ #if FX_SKMAC km_abort(); #endif /*FX_SKMAC*/ #if FX_FILLMODE fill_mode = ofillmode; #endif /*FX_FILLMODE*/ return(0); /* Return 0 to indicate we quit */ } /* This censoring section is a real crock! */ funnum = cmd_idx(c); /* Map key to command */ while(funnum == FN_PFXMETA) /* Allow META prefix */ funnum = cmd_idx(c = CB_META|cmd_read()); for(s = askftab; (i = *s&0377); ++s) if(funnum == i) break; switch(i) { default: /* Permissible function */ cmd_xct(c); break; case FN_NEWWIN: /* Wants redisplay, do specially */ clear_wind(ask_win); break; case 0: /* Illegal function */ ring_bell(); #if FX_SKMAC km_abort(); #endif /*FX_SKMAC*/ continue; } if(this_cmd == ARGCMD) goto cont; } if((anslen = e_blen()) > 255) /* Ridiculously long? */ { strcpy(cbuf,"Huh? Try again - "); #if FX_SKMAC km_abort(); #endif /*FX_SKMAC*/ goto asklp; } i = anslen; e_gobob(); /* Go to start of buffer */ e_sputz(cbuf); /* Re-insert prompt so buffer == screen */ ask_blen = i + 1; /* Say buffer has something in it */ s = memalloc((SBMO)(i + 1)); /* Allocate fixed loc for answer */ newline = s; /* Return ptr to allocated string */ ask_len = i; /* And return (via global) length of string */ if(i) do { *s++ = e_getc(); } while(--i); *s = '\0'; /* make sure string terminated */ chg_win(oldwin); #if FX_FILLMODE fill_mode = ofillmode; #endif /*FX_FILLMODE*/ return (newline); /* return pointer to data */ } /* ASKCLR - Clears the echo area (but not immediately) if the last thing ** done to it was an ask() call. Note that invoking a SAY routine ** specifically causes this to be a no-op; SAYCLR must be done instead. */ askclr() { if(ask_cnt) sayclr(); /* Zap if need be */ } /* SAY - put up some text on bottom line. * Does this intelligently; text stays up until next SAY or * screen refresh. * SAYNOW - like SAY but forces display right away * SAYTOO - adds to existing stuff * SAYNTOO - ditto but forces output right away. * DING - Ring_bell then SAYNOW * DINGTOO - is to DING as SAYNTOO is to SAYNOW. * SAYCLR - Clears echo area (but not immediately) */ #define SAY_NOW 01 /* Force display immediately */ #define SAY_TOO 02 /* Add to existing stuff */ #define SAY_BEL 04 /* Ding bell prior to text */ #define SAY_LEN 010 /* String length specified by 3rd arg */ say(str) char *str; { sayall(str, 0); } saynow(str) char *str; { sayall(str, SAY_NOW); } saytoo(str) char *str; { sayall(str, SAY_TOO); } sayntoo(str) char *str; { sayall(str, SAY_NOW|SAY_TOO); } ding(str) char *str; { sayall(str, SAY_NOW|SAY_BEL); } dingtoo(str) char *str; { sayall(str, SAY_NOW|SAY_TOO|SAY_BEL); } saylntoo(str,n) char *str; { sayall(str, SAY_NOW|SAY_TOO|SAY_LEN, n); } sayclr() { sayall((char *)0, 0); } sayall(str,flags,len) char *str; int flags, len; { register struct window *w; register f; f = flags; w = cur_win; ask_cnt = 0; /* Always reset this */ if(str == 0 && ask_blen == 0) /* If clearing, and buff empty */ return; /* nothing to do. */ chg_win(ask_win); if(f&SAY_TOO) e_goeob(); /* Add to end of existing stuff */ else e_reset(); /* Flush previous stuff if any */ if(str) { if(f&SAY_LEN) /* Insert string to post up */ ed_nsins(str,len); else e_sputz(str); } ask_blen = e_dot(); /* Remember whether buffer has something */ e_setcur(); /* and remember to set dot */ if(f&SAY_NOW) { if(f&SAY_BEL) ring_bell(); redp(RD_WINRES); upd_wind((struct window *)0); tbufls(); } else redp(RD_WINRES); /* Set for this window */ chg_win(w); /* Back to previous window */ /* redisplay() does a special check for ask_win->w_redp, so we ** don't need to set a global flag like RD_CHKALL. */ } /* YELLAT -- post string on specified line of screen, immediately. * Differs from SAYNOW and SAYNTOO in that NO buffer * manipulation is done; screen image is hacked directly. */ yellat(str, line) char *str; register int line; { register struct scr_line *s; s = scr[line]; strncpy(s->sl_nlin, str, scr_wd0); s->sl_ncol = strlen(str); #if IMAGEN s->sl_flg |= SL_REDO; #endif upd_line(line); tbufls(); } /* YELLTOO -- Append string to previous echo line of screen, immediately. ** Uses the ask_lin variable which is set by ask(). ** Currently this f%?'?(?unction is only needed for srchint() in EESRCH. */ yelltoo(str) char *str; { register int i; register struct scr_line *s; char nstr[MAXLINE]; s = scr[ask_lin]; i = s->sl_col; nstr[0] = 0; strncat(strncat(nstr, s->sl_line, i), /* Make new string */ str, MAXLINE - i); yellat(nstr, ask_lin); /* Post it */ } /* BARF - output a message on the bottom line of the screen, ** bypassing everything (window, buffer, screen image). ** Does NOT know about SAY's stuff and does not update it! ** Use only in dire straits... ** ERRBARF - same but uses a standard error-message prefix. */ errbarf(str) char *str; { barf("\007ELLE Internal Error: "); tputz(str); tbufls(); } barf(str) char *str; { ask_cnt = 0; /* Ensure askclr() disabled */ t_curpos(scr_ht - ECHOLINES, 0); /* goto echo area */ t_cleol(); tputz(str); tbufls(); curs_col = -1000; /* Say we dunno where cursor is now */ } #if IMAGEN /* Same, but do it far from harm's way */ barf2(str) char *str; { t_curpos (scr_ht - 1, scr_wid - strlen(str) - 8); t_cleol (); tputz(str); tputz(" --M--"); tbufls(); tgetc(); /* Read any char & discard */ curs_col = -1000; /* Say we dunno where cursor is now */ } #endif /*IMAGEN*/ /* ELLE - Copyright 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EESIGS.H * This file is only provided for inclusion only by V6 systems, where * the standard /usr/include/signal.h file may not exist and thus we * need to do our own definitions. */ /* Signals marked with "*" cause a core image dump * if not caught or ignored. */ #define SIGHUP 1 /* Hangup (eg dialup carrier lost) */ #define SIGINT 2 /* Interrupt (user TTY interrupt) */ #define SIGQUIT 3 /* * Quit (user TTY interrupt) */ #define SIGILL 4 /* * Illegal Instruction (not reset when caught) */ #define SIGTRAP 5 /* * Trace Trap (not reset when caught) */ #define SIGIOT 6 /* * IOT instruction */ #define SIGEMT 7 /* * EMT instruction */ #define SIGFPE 8 /* * Floating Point Exception */ #define SIGKILL 9 /* Kill (cannot be caught or ignored) */ #define SIGBUS 10 /* * Bus Error */ #define SIGSEGV 11 /* * Segmentation Violation */ #define SIGSYS 12 /* * Bad argument to system call */ #define SIGPIPE 13 /* Write on a pipe with no one to read it */ #define SIGALRM 14 /* Alarm Clock */ #define SIGTERM 15 /* Software termination signal (from "kill" pgm) */ #define SIG_DFL (int (*)())0 /* Arg to "signal" to resume default action */ #define SIG_IGN (int (*)())1 /* Arg to "signal" to ignore this sig */ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EESITE Site dependent frobs * Primarily TS_ routines for TTY control. Most site-dependent * routine is TS_INP for detection of TTY input. */ #include "elle.h" #if !(V6) #include /* For SIGTSTP in ts_pause */ #else #include "eesigs.h" #endif int tsf_pause = 0; /* Set if ts_pause works. Ref'd by equit in e_main */ #if !(SYSV || BBN) /* SYSV and BBN have weird tty calls */ #if MINIX #include struct termios origterm, newterm; #else #if V6 /* Normal V6 declarations, must provide explicitly */ struct sgttyb { char sg_ispeed; char sg_ospeed; char sg_erase; char sg_kill; int sg_flags; }; #define ECHO (010) #define CRMOD (020) #define RAW (040) #else /* Normal V7 UNIX declarations, can use include file */ #include #endif struct sgttyb nstate; /* Both V6 and V7 */ struct sgttyb ostate; /* Both V6 and V7 */ #endif /*!(SYSV || BBN)*/ #endif /*!MINIX*/ #if BBN /* BBN system frobs */ #include "/sys/sys/h/modtty.h" struct modes nstate; struct modes ostate; #endif /*BBN*/ #if DNTTY /* DN TTY frobs */ #include char partab[2]; /* to satisfy obscene ref in tty.h */ #endif /*DNTTY*/ #if (UCB || TOPS20) /* UCB, TOPS20 additional frobs */ #include /* For ts_inp() and tldisc */ #if IMAGEN struct tchars otchars, ntchars; /* Original and new tchars */ #endif /*IMAGEN*/ #endif /*(UCB || TOPS20)*/ #if SYSV /* System V (and PC/IX) crocks */ #include #include struct termio /* terminal i/o status flags */ origterm, /* status of terminal at start of ELLE */ newterm; /* status of terminal when using ELLE */ #endif /*SYSV*/ /* TS_INP * Ask system if terminal input is available (on file descriptor 0). * Returns non-zero if so, else returns zero. * Very important that this call NOT hang or block in any way, * because it is used to detect type-ahead by the user; * return should be immediate whether or not input is waiting. */ ts_inp() { #if BBN /* Idiosyncratic */ int cap_buf[2]; capac (0, &cap_buf[0], 4); return (cap_buf[0]); #endif /*BBN*/ #if (DNTTY || ONYX) /* Have "empty()" syscall */ return(empty(0) ? 0 : 1); #endif /*DNTTY || ONYX*/ #if (UCB || TOPS20) /* Have FIONREAD ioctl */ long retval; if(ioctl(0,FIONREAD,&retval)) /* If this call fails, */ return(0); /* assume no input waiting */ return((retval ? 1 : 0)); #endif /*UCB || TOPS20*/ #if COHERENT int retval; ioctl(0, TIOCQUERY, &retval); return((retval ? 1 : 0)); #endif /*COHERENT*/ #if VENIX86 struct sgttyb iocbuf; ioctl(0, TIOCQCNT, &iocbuf); return(iocbuf.sg_ispeed != 0 ); #endif /*VENIX86*/ #if !(BBN||COHERENT||DNTTY||ONYX||TOPS20||UCB||VENIX86) return(0); /* Default - never any type-ahead, sigh */ #endif } /* TS_INIT() * Get terminal information from system, initialize things for * ts_enter and ts_exit. This is called before t_init. * Must set "trm_ospeed". */ ts_init() { #if DNTTY signal(16,1); /* DN peculiar - turn off ctl-A */ #endif /*DNTTY*/ #if !(MINIX || SYSV || BBN) /* Normal UNIX stuff */ ioctl(1, TIOCGETP, &ostate); /* Remember old state */ nstate = ostate; /* Set up edit-mode state vars */ nstate.sg_flags |= RAW; /* We'll want raw mode */ nstate.sg_flags &= ~(ECHO|CRMOD); /* with no echoing */ trm_ospeed = ostate.sg_ospeed; #if (IMAGEN && UCB) /* Get around 4.1+ remote/local flow control bug (from Gosmacs) */ ioctl(0, TIOCGETC, &otchars); /* Save original tchars */ ntchars = otchars; ntchars.t_startc = -1; /* Kill start/stop */ ntchars.t_stopc = -1; ioctl(0, TIOCSETC, &ntchars); #endif /*IMAGEN && UCB*/ #endif /*!(SYSV || BBN)*/ #if BBN modtty(1, M_GET | M_MODES, &ostate, sizeof(ostate)); /* Save old */ modtty(1, M_GET | M_MODES, &nstate, sizeof(nstate)); /* Setup new */ nstate.t_erase = nstate.t_kill = nstate.t_intr = nstate.t_esc = nstate.t_eof = nstate.t_replay = 0377; nstate.t_quit = BELL; /* ^G */ nstate.t_breaks = TB_ALL; /* break on all */ nstate.t_iflags &= ~TI_ECHO & ~TI_NOSPCL & ~TI_CRMOD; /* no echos, specials on, no CR -> LF*/ nstate.t_iflags |= TI_CLR_MSB; /* ignore parity */ nstate.t_oflags &= ~TO_CRMOD & ~TO_AUTONL; /* no CR -> NL */ if (trm_flags & NOXONOFF) nstate.t_oflags &= ~TO_XONXOFF; else nstate.t_oflags |= TO_XONXOFF; nstate.t_oflags |= TO_CLR_MSB; /* no special high bits */ nstate.t_pagelen = 0; /* no paging of output */ trm_ospeed = ostate.t_ospeed; #endif /*BBN*/ #if MINIX tcgetattr(0, &origterm); /* How things are now */ newterm = origterm; /* Save them for restore on exit */ /* input flags */ newterm.c_iflag |= IGNBRK; /* Ignore break conditions.*/ newterm.c_iflag &= ~INLCR; /* Don't map NL to CR on input */ newterm.c_iflag &= ~ICRNL; /* Don't map CR to NL on input */ newterm.c_iflag &= ~BRKINT; /* Do not signal on break.*/ newterm.c_iflag &= ~IXON; /* Disable start/stop output control.*/ newterm.c_iflag &= ~IXOFF; /* Disable start/stop input control.*/ /* output flags */ newterm.c_oflag &= ~OPOST; /* Disable output processing */ /* line discipline */ newterm.c_lflag &= ~ISIG; /* Disable signals.*/ newterm.c_lflag &= ~ICANON; /* Want to disable canonical I/O */ newterm.c_lflag &= ~ECHO; /* Disable echo.*/ newterm.c_lflag &= ~ECHONL; /* Disable separate NL echo.*/ newterm.c_lflag &= ~IEXTEN; /* Disable input extensions.*/ newterm.c_cc[VMIN] = 1; /* Min. chars. on input (immed) */ newterm.c_cc[VTIME] = 0; /* Min. time delay on input (immed) */ /* Make it stick */ tcsetattr(0, TCSANOW, &newterm); #endif /*MINIX*/ #if SYSV ioctl(0, TCGETA, &origterm); /* How things are now */ newterm = origterm; /* Save them for restore on exit */ /* input flags */ newterm.c_iflag |= IGNBRK; /* Ignore break conditions.*/ newterm.c_iflag &= ~INLCR; /* Don't map NL to CR on input */ newterm.c_iflag &= ~ICRNL; /* Don't map CR to NL on input */ newterm.c_iflag &= ~BRKINT; /* Do not signal on break.*/ newterm.c_iflag &= ~IXON; /* Disable start/stop output control.*/ newterm.c_iflag &= ~IXOFF; /* Disable start/stop input control.*/ /* line discipline */ newterm.c_lflag &= ~ISIG; /* Disable signals.*/ newterm.c_lflag &= ~ICANON; /* Want to disable canonical I/O */ newterm.c_lflag &= ~ECHO; /* Disable echo.*/ newterm.c_cc[4] = 1; /* Min. chars. on input (immed) */ newterm.c_cc[5] = 1; /* Min. time delay on input (immed) */ /* Make it stick */ ioctl(0, TCSETA, &newterm); #endif /*SYSV*/ #if (UCB || TOPS20) { int tldisc; ioctl(0, TIOCGETD, &tldisc); /* Find line discipline */ /* The flag IGN_JOB_CONTROL has been introduced to allow job control haters * to simply ignore the whole thing. When ELLE is compiled with * -DIGN_JOB_CONTROL, it will exit properly when the Return to Superior * command is executed. */ #if SIGTSTP #ifndef IGN_JOB_CONTROL if(tldisc == NTTYDISC) tsf_pause = 1; #endif #endif /*SIGTSTP*/ } #endif /*UCB || TOPS20*/ } /* TS_ENTER() * Tell system to enter right terminal mode for editing. * This is called before t_enter. */ ts_enter() { #if !(MINIX || SYSV || BBN) ioctl(1, TIOCSETP, &nstate); #if IMAGEN && UCB ioctl(0, TIOCSETC, &ntchars); /* Restore new tchars */ #endif /*IMAGEN && UCB*/ #endif /*!(SYSV||BBN)*/ #if BBN modtty (1, M_SET | M_MODES, &nstate, sizeof (nstate)); #endif /*BBN*/ #if MINIX /* Make it behave as previously defined in ts_init */ tcsetattr(0, TCSANOW, &newterm); #endif /*SYSV*/ #if SYSV /* Make it behave as previously defined in ts_init */ ioctl(0, TCSETA, &newterm); #endif /*SYSV*/ #if DNTTY /* DN hackery! Enable 8-bit input so as to read meta bit. */ if(dbg_isw) { tpoke(TH_CSET,T_2FLGS2,EEI); /* Enable ints */ tpoke(TH_CSETB,T_QUIT, 0377); /* Turn off QUIT intrpt */ } else if(trm_flags & TF_METAKEY) tpoke(TH_CSET,T_2FLGS2,T2_LITIN); /* Turn on 8-bit input! */ #endif /*DNTTY*/ } /* TS_EXIT * Tell system to restore old terminal mode (we are leaving edit mode). * This is called after t_exi2?4?5?t. */ ts_exit() { #if DNTTY if(dbg_isw) tpoke(TH_CCLR,T_2FLGS2,EEI); /* Turn off EEI bit */ else if(trm_flags & TF_METAKEY) tpoke(TH_CCLR,T_2FLGS2,T2_LITIN); /* Turn off 8-bit input */ #endif /*DNTTY*/ #if !(MINIX || SYSV || BBN) ioctl(1, TIOCSETP, &ostate); /* SYSV and BBN don't use stty */ #if IMAGEN && UCB ioctl(0, TIOCSETC, &otchars); /* Restore original tchars */ #endif /*IMAGEN && UCB*/ #endif /*!(SYSV || BBN)*/ #if BBN modtty (1, M_SET | M_MODES, &ostate, sizeof (ostate)); #endif /*BBN*/ #if MINIX tcsetattr(0, TCSANOW, &origterm); #endif /*MINIX*/ #if SYSV ioctl(0, TCSETA, &origterm); #endif /*SYSV*/ } #if DNTTY int thkcmd[] { 0, 0, -1 }; tpoke(cmd,bn,val) int cmd, bn, val; { thkcmd[0] = cmd|bn; thkcmd[1] = val; if(ttyhak(0,&thkcmd) < 0) return(-1); else return(thkcmd[1]); } #endif /*DNTTY*/ /* TS_PAUSE - Stop process and return control of TTY to superior. * There is also a flag variable, TSF_PAUSE, which indicates * whether or not this routine will actually do anything. */ #if TOPS20 #include #endif ts_pause() { #if TOPS20 int acs[5]; jsys(HALTF, acs); #endif #if UCB #if SIGTSTP signal(SIGTSTP, SIG_DFL); #if BSD4_2 #define mask(s) (1 << ((s)-1)) sigsetmask(sigblock(0) &~ mask(SIGTSTP)); #endif /*BSD4_2*/ kill(0, SIGTSTP); #if BSD4_2 sigblock(mask(SIGTSTP)); #endif /*BSD4_2*/ #endif /*SIGTSTP*/ #endif /*UCB*/ } ts_winsize() { #ifdef TIOCGWINSZ struct winsize winsize; if (ioctl(1, TIOCGWINSZ, &winsize) == 0) { if (winsize.ws_row != 0) scr_ht = winsize.ws_row; if (winsize.ws_col != 0) scr_wid = winsize.ws_col; } #endif } /* ELLE - Copyright 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EESITE.H Site-dependent switches & definitions */ /* CONDITIONAL COMPILATION SWITCHES */ #define V6 0 /* Running on V6 system (else V7 assumed) */ #define APOLLO 0 /* Running on an Apollo system */ #define BBN 0 /* Running on BBN system (tty stuff) */ #define BSD4_2 0 /* Running on 4.2BSD system */ #define COHERENT 0 /* Running on Coherent IBM-PC system */ #define DNTTY 0 /* Running on SRI V6 Deafnet system (tty stuff) */ #define HPUX 0 /* Running on Hewlett-Packard System V + */ #define MINIX 1 /* Running on MINIX (IBM-PC) system */ #define ONYX 0 /* Running on ONYX Z8000 system */ #define PCIX 0 /* Running on PC/IX (IBM-PC) system */ #define SUN 0 /* Running on SUN workstation system */ #define SYSV 0 /* Running on Unix System V (or perhaps Sys III) */ #define TOPS20 0 /* Running on TOPS-20 KCC C implementation */ #define UCB 0 /* Running on 2.8, 2.9, or 4.x BSD sys (tty stuff) */ #define VENIX86 0 /* Running on Venix86 (IBM-PC) system */ #define ICONOGRAPHICS 0 /* Using Iconographics configuration version */ #define IMAGEN 0 /* Using Imagen configuration version */ /* Resolve system dependencies */ #if SUN #undef BSD4_2 #define BSD4_2 1 /* SUN uses 4.2BSD */ #endif #if BSD4_2 #undef UCB #define UCB 1 /* 4.2 is special case of general UCB stuff */ #endif /*BSD4_2*/ #if (PCIX || HPUX) #undef SYSV #define SYSV 1 /* PC/IX & HP-UX are based on System III & V (resp) */ #endif /* Set system or site dependent stuff here */ #if V6 #define void int /* May need this for other systems too */ #endif /* Changes to parameters (elle.h) or variable defaults (e_vinit.c) */ #if COHERENT #define EVFNO2 0 /* "Old" filename postfix - use no old file! */ #define EVFNN2 "+" /* "New" filename postfix */ #define TX_COHIBM 1 /* Ensure Coherent IBM-PC console support included */ #endif /*COHERENT*/ #if DNTTY #define EVLLEN 60 /* Short line length for TDDs */ #endif /*DNTTY*/ #if HPUX #define EVFNO2 "~" /* Same as CCA Emacs. Sorts last in listing. */ #endif /*HPUX*/ #if MINIX #define EVFNO2 ".bak" /* "Old" filename postfix */ #define EVMARKSHOW "Mark set" #define EVCCOL (33) /* Use this as Comment Column */ #define EVMVPCT 1 /* 1% - Try to use minimal window repositioning */ #define EVMODWSO 1 /* Use mode window standout if can */ #define STRERROR 1 /* Say that implementation provides strerror() */ #include #include #include #include #endif /*MINIX*/ #if ONYX #define STKMEM (4*512) /* ONYX Z8000 seems to have less room avail */ #endif /*ONYX*/ #if BSD4_2 #define FNAMELEN 255 /* Max size of last filename component */ #define FNAMSIZ 400 /* Max size of complete filename */ #endif /*BSD4_2*/ #if TOPS20 #define EVHELPFILE "elle:help.dat" /* T20 ELLE help file */ #define EVPROFBINFILE "ellep.b1" /* T20 binary profile file */ #define EVPROFTEXTFILE "ellep.e" /* T20 ASCII profile file */ #define EVFNO2 0 /* No old filename postfix (T20 has generations) */ #define EVFNN2 0 /* No new filename postfix (T20 has generations) */ #define FNAMELEN (40*3) /* Max size of non-directory filename component */ #define FNAMSIZ (40*5) /* Max size of complete filename */ #define STRERROR 1 /* Say that implementation provides strerror() */ #endif /*TOPS20*/ #if VENIX86 #define TIBFSIZ 1 /* Venix86 block reads in raw mode */ #endif /*VENIX86*/ /* Configuration settings */ #if ICONOGRAPHICS #define EVFNO2 "@" /* "Old" filename postfix */ #define EVMARKSHOW "Set." #define PARABLOCK 1 /* Values meaningful only for ICONOGRAPHICS */ #define PARALINE 2 #define TXC_VISBEL 1 /* Use visible bell if possible */ #endif /*ICONOGRAPHICS*/ #if IMAGEN #define EVFNO2 ".BAK" /* "Old" filename postfix */ #define EVMARKSHOW "Mark set" #define TOBFSIZ (10*80) /* Size of TTY output buffer */ #define ECHOLINES 2 /* Use 2 echo-area lines, not 1 */ #define MAXARGFILES 10 /* Several startup filename args */ #endif /*IMAGEN*/ /* Now set any defaults for things not already defined */ /* TERMINAL SUPPORT SWITCHES */ /* Only those terminals which have a switch defined here */ /* will be included in ELLE's "hardwired" support. */ /* Switch name: Compiles support for: */ #ifndef TX_TERMCAP #define TX_TERMCAP 1 /* * - most TERMCAP-defined terminals */ #endif #ifndef TX_H19 #define TX_H19 1 /* "H19" - Heath/Zenith-19 */ #endif #ifndef TX_DM2500 #define TX_DM2500 1 /* "DM2500","DM3025" - Datamedia 2500 */ #endif #ifndef TX_COHIBM #define TX_COHIBM 0 /* "COHIBM" - Coherent IBM-PC console */ #endif #ifndef TX_TVI925 #define TX_TVI925 0 /* "TVI925" - TeleVideo 925 */ #endif #ifndef TX_OM8025 #define TX_OM8025 0 /* "OM8025" - Omron 8025AG */ #endif #ifndef TXC_VISBEL /* Non-zero if want to use visible bell */ #define TXC_VISBEL 0 #endif /* Default terminal type string, used if ELLE cannot get type either ** from $TERM or from startup args. */ #ifndef TXS_DEFAULT #define TXS_DEFAULT "H19" /* Default terminal type string */ #endif /* Combination parameter/switch definitions */ /* STKMEM - System-dependent stack allocation crock, defines amount of * stack memory to grab for general-purpose use. This is mainly * useful for PDP-11s or machines with similarly brain-damaged * address space hardware. A PDP-11 memory segment is 8K bytes, * or 16 512-byte blocks, and the stack segment quarantines all of * this space even though the actual stack may only use a miniscule * portion of it. */ /* Use this if compiling for a PDP11 system, otherwise leave undefined.. */ #if (V6 || 0) #define STKMEM (8*512) /* Use half a PDP11 segment */ #endif /* These defaults are in eesite.h so ELLEC can get at them too. */ #ifndef EVPROFBINFILE /* Location of binary user profile, relative to HOME */ #define EVPROFBINFILE ".ellepro.b1" #endif #ifndef EVPROFTEXTFILE /* Location of ASCII user profile (used by ELLEC) */ #define EVPROFTEXTFILE ".ellepro.e" #endif /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EESRCH Searching functions */ #include "elle.h" #if !(V6) #include #else #include "eesigs.h" /* Use this on V6 system */ #endif /*V6*/ /* * Buffer String Search routines * * If no search string is provided, a string that was previously * used in the last search is once again used. */ /* EFUN: "String Search" */ f_srch() { return (lin_search (0)); } /* EFUN: "Reverse String Search" */ f_rsrch() { return (lin_search (1)); } /* LIN_SEARCH - Main routine for non-incremental String Search. Asks for * a search string and looks for it. */ lin_search (backwards) int backwards; { register char *mem; /* item to be searched for */ register int res; int srchint(), (*sav_srchalarm)(); char *srch_ask(); chroff savdot; savdot = cur_dot; /* Save original loc */ #if ICONOGRAPHICS if((mem = srch_ask(backwards ? "Reverse Search%s%s%s" : "Search%s%s%s"))==0) return; #else if((mem = srch_ask(backwards ? "Reverse Search: " : "Search: "))==0) return; #endif /*-ICONOGRAPHICS*/ sav_srchalarm = signal(SIGALRM,/*&*/srchint); /* Handle timeout */ alarm(1); /* One sec from now */ res = e_search(mem,srch_len,backwards); /* Search for str! */ alarm(0); /* Turn off alarm */ signal(SIGALRM,sav_srchalarm); /* Restore old handler */ if(res) /* Search won? */ { ed_setcur(); return; } /* Search failed */ e_gosetcur(savdot); ding("Search Failed"); } srchint() { yelltoo(" ..."); } char * srch_ask(prompt) char *prompt; { register char *ans, *old; #if ICONOGRAPHICS if (srch_str) ans = ask(prompt, " (", srch_str, "): "); else ans = ask (prompt, ": ", "", ""); if (ans == 0) return (0); #else if((ans = ask(prompt)) == 0) return(0); /* user punted ... */ #endif /*-ICONOGRAPHICS*/ old = srch_str; if (*ans == '\0') { chkfree(ans); if ((ans = old) == 0) /* no string specified */ { dingtoo("Nothing to search for"); return(0); } #if !(ICONOGRAPHICS) saylntoo(old, srch_len); /* Show what old string is */ #endif /*-ICONOGRAPHICS*/ } else { if (old) chkfree(old); /* free up old srch string */ srch_str = ans; srch_len = ask_len; } return(ans); } #if 0 Incremental Search stuff. Description of EMACS behavior: ^Q quotes next char. DEL cancels last char. If this cancelled a match, point is moved to previous match. If not all of input can be found, it is not discarded. Can rub out, discard unmatched stuff with ^G, exit, etc. ^S repeats search forward; ^R repeats backward. If empty string, either changes direction (if not same) or brings back previous string ESC exits. If empty string, changes to non-incremental string search. ^G of a winning search aborts, exits, and moves point back to origin. ^G of a failing search discards the input that wasn''t found. Other C- or M- chars exit and are executed. ELLE also interprets ^H (BS) as DEL, because some keyboards make it hard to type DEL and there is no way the user can re-bind the incremental-search commands. #endif /*COMMENT*/ #if FX_ISRCH /* EFUN: "Incremental Search" */ f_isrch() { i_search(0); } #endif /*FX_ISRCH*/ #if FX_RISRCH /* EFUN: "Reverse Search" */ f_risrch() { i_search(1); } #endif /*FX_RISRCH*/ #if FX_ISRCH || FX_RISRCH i_search(back) int back; /* Current mode: 0 if forward, 1 if backward */ { register int c; register int inpcnt; /* # chars in current input srch str */ int inpgood; /* Length of last winning string */ char inpstr[ISRCHLIM]; /* Holds current input search string */ chroff inpdot[ISRCHLIM]; /* Holds winning addrs for each */ struct window *savwin; int winning; /* 1 = currently winning, 0 = currently failing */ int pref, shown; int f_insself(), (*(cmd_fun()))(); winning = 1; inpcnt = 0; inpgood = 0; inpdot[0] = cur_dot; savwin = cur_win; /* Set up prompt and read all TTY input thus far */ shown = 0; sloop: c = cmd_wait(); /* See if any command input waiting */ if(shown || !c) { e_setcur(); /* Assume we moved around, so set cur_dot */ chg_win(ask_win); ed_reset(); /* Flush contents & invoke redisplay */ ed_sins(back ? "R-search: " : "I-search: "); ed_nsins(inpstr, inpcnt); if(!winning) ed_sins("\t(FAILING)"); upd_wind((struct window *)0); /* Force ask_win update */ if(c) { upd_curs(cur_dot); tbufls(); } chg_win(savwin); shown = 1; /* Say search prompt has been shown */ } if(!c) /* If no user input waiting, show buffer */ { redp(RD_MOVE); /* Cursor moved in window */ redisplay(); } c = cmd_read(); /* Get input char */ switch(c) { case DEL: /* Cancel last char */ case BS: /* Hard to type DEL on some kbds */ if(inpcnt <= 0) goto sloop; if(--inpcnt > inpgood) goto sloop; winning = 1; if(inpcnt == inpgood) goto sloop; inpgood--; ed_go(inpdot[inpcnt]); goto sloop; case CTRL('Q'): c = cmd_read(); /* Quote next char */ break; case CTRL('S'): pref = 0; goto ctlsr; case CTRL('R'): pref = 1; goto ctlsr; case CTRL('G'): if(winning) { ed_go(inpdot[0]); goto sdone; } inpcnt = inpgood; winning = 1; goto sloop; case ESC: case CR: if(inpcnt) goto sdone; lin_search(back); return; default: if(f_insself != cmd_fun(c)) { unrchf = c; goto sdone; } case TAB: /* Strange self-inserting char */ break; } if(inpcnt >= ISRCHLIM-1) { ding("I-search str too long"); sleep(1); goto sdone; } inpstr[inpcnt++] = c; if(!winning) goto sloop; /* Now search for string. (Arm alarm interrupt?) */ /* cur_dot has current location cursor is at; we want to back off * from this so a repeated search will find the same location if * appropriate. */ e_igoff(back ? inpcnt : -(inpcnt-1)); dosrch: winning = e_search(inpstr,inpcnt,back); if (winning) { inpgood = inpcnt; /* Remember last win length */ inpdot[inpcnt] = e_dot(); /* and location */ } else e_gocur(); /* Back to start position */ goto sloop; ctlsr: if (pref != back) { back = pref; if(inpcnt <= 0) goto sloop; } if(inpcnt <= 0) { if(!srch_str || (inpcnt = srch_len) <= 0) goto sloop; bcopy((SBMA)srch_str, (SBMA)inpstr, srch_len); inpcnt = srch_len; unrchf = c; /* Repeat cmd after display */ shown = 1; /* Force search-string display */ goto sloop; } goto dosrch; sdone: if(srch_str) chkfree(srch_str); srch_str = memalloc((SBMO)(inpcnt+1)); bcopy((SBMA)inpstr,(SBMA)srch_str,inpcnt); /* Copy into srch_str */ srch_len = inpcnt; e_setcur(); chg_win(ask_win); ed_reset(); chg_win(savwin); redp(RD_CHKALL); } #endif /*FX_ISRCH || FX_RISRCH*/ /* ELLE - Copyright 1982, 1984, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * EETERM ELLE Terminal Driver. * Directly supports DM2500, H-19, Omron 8025AG, Coherent/IBM-PC, TVI925. * Others also supported if using TX_TERMCAP. */ #include "elle.h" /* Define terminal indices (there may be holes but C preprocessor is too * stupid to let us close them). Should be one TN_ definition for every * hardwired terminal type, even though whether or not it is actually * compiled depends on which TX_ switches are defined. */ #define TN_TERMCAP 0 #define TN_DM2500 1 #define TN_H19 2 #define TN_OM8025 3 #define TN_COHIBM 4 /* Coherent IBM-PC console */ #define TN_TVI925 5 #if TX_COHIBM && !(TX_H19) /* Ensure H19 defined if COHIBM is. */ #define TX_H19 1 #endif #ifndef TXS_DEFAULT /* If no default is explicitly specified */ #define TXS_DEFAULT "H19" /* Then settle for H-19 */ #endif /*TXS_DEFAULT*/ extern char *tv_stype; /* If set, specifies terminal type */ extern int tibfmsk; /* Crock to mask off parity (meta) bit */ static int tv_padc; /* Pad character to use */ static int tv_cspeed; /* # msec per char (set from trm_ospeed) */ static int tv_type; /* Index of selected terminal type */ /* Internal functions */ static void tpadn(), tpad(); /* Character speed table, indexed by system output speed value (0-017). * Value in table is 100 * <# msec used per character>. */ static int cspdtab[] = { /* Val Idx Baud CPS Time/char in msec */ 0, /* 0 Hangup - ---- */ 13333, /* 1 50 7.5 133.33 (Baudot) */ 10000, /* 2 75 10 100.0 (Baudot) */ 10000, /* 3 110 10 100.0 */ 8200, /* 4 134.5 12.2 82.0 (IBM2741) */ 6666, /* 5 150 15 66.6666 */ 5000, /* 6 200 20 50.0 */ 3333, /* 7 300 30 33.3333 */ 1666, /* 8 600 60 16.6666 */ 833, /* 9 1200 120 8.3333 */ 555, /* 10 1800 180 5.5555 */ 416, /* 11 2400 240 4.1666 */ 208, /* 12 4800 480 2.0833 */ 104, /* 13 9600 960 1.04166 */ 0, /* 14 Ext A ? ? */ 0 /* 15 Ext B ? ? */ }; #if TX_TERMCAP /* Declarations for TERMCAP stuff. Only EETERM knows about them. */ /* Termcap routines */ extern int tgetent(), tgetnum(), tgetflag(), tputs(); extern char *tgetstr(), *tgoto(); static int getcap(); /* Internal routines */ static void putpad(), putnpad(), putpar(); /* Gross disgusting externals that must be defined for TERMCAP rtns */ char PC; /* Pad char */ char *BC; /* Backspace to use, if not ^H */ char *UP; /* Cursor up */ short ospeed; /* Terminal output speed */ /* Termcap numerical values/flags */ static int tc_am, /* TRUE if has auto-wrap */ tc_km; /* TRUE if meta key exists */ /* Termcap capability strings we want to know about */ struct tcap { char tcicod1, tcicod2, *tccap; }; static struct tcap tcap[] = { #define TC_al tcap[0].tccap /* Add (insert) line */ {'a','l', 0}, #define TC_AL tcap[1].tccap /* Add N lines */ {'A','L', 0}, #define TC_bc tcap[2].tccap /* Backspace Char (for BC) */ {'b','c', 0}, #define TC_ce tcap[3].tccap /* Erase to end of line (CLEOL) */ {'c','e', 0}, #define TC_cl tcap[4].tccap /* Clear screen */ {'c','l', 0}, #define TC_cm tcap[5].tccap /* Cursor motion */ {'c','m', 0}, #define TC_dc tcap[6].tccap /* Delete char */ {'d','c', 0}, #define TC_DC tcap[7].tccap /* Delete N chars */ {'D','C', 0}, #define TC_dl tcap[8].tccap /* Delete line */ {'d','l', 0}, #define TC_DL tcap[9].tccap /* Delete N lines */ {'D','L', 0}, #define TC_dm tcap[10].tccap /* Delete mode on */ {'d','m', 0}, #define TC_ed tcap[11].tccap /* Delete mode off */ {'e','d', 0}, #define TC_ei tcap[12].tccap /* Insert mode off */ {'e','i', 0}, #define TC_ia tcap[13].tccap /* Add line while in insert mode (see note) */ {'i','a', 0}, #define TC_ic tcap[14].tccap /* Insert blank char */ {'i','c', 0}, #define TC_IC tcap[15].tccap /* Insert N blank chars */ {'I','C', 0}, #define TC_id tcap[16].tccap /* Delete line while in del mode (see note) */ {'i','d', 0}, #define TC_im tcap[17].tccap /* Insert mode on */ {'i','m', 0}, #define TC_ip tcap[18].tccap /* Padding to send after char insertion */ {'i','p', 0}, #define TC_mm tcap[19].tccap /* String to set (turn on) meta-key mode */ {'m','m', 0}, #define TC_mo tcap[20].tccap /* String to reset (turn off) meta-key mode */ {'m','o', 0}, #define TC_pc tcap[21].tccap /* Pad Char (for PC) */ {'p','c', 0}, #define TC_se tcap[22].tccap /* End standout mode */ {'s','e', 0}, #define TC_so tcap[23].tccap /* Enter standout mode */ {'s','o', 0}, #define TC_te tcap[24].tccap /* String to end programs that use termcap */ {'t','e', 0}, #define TC_ti tcap[25].tccap /* String to beg programs that use termcap */ {'t','i', 0}, #define TC_up tcap[26].tccap /* Move cursor up (for UP) */ {'u','p', 0}, #define TC_vb tcap[27].tccap /* Visible bell */ {'v','b', 0}, }; #define NTCAPS ((sizeof(tcap))/(sizeof(struct tcap))) /* # entries */ /* * There are many other things that must be taken into account. * The termcap code here will probably not work for many termcap entries, * but the only sure way to find out which ones they are is to try them. */ /* Note that the "ia" and "id" strings are not defined by the TERMCAP doc; * their usage here is derived from examining other TERMCAP-using programs. * Sigh!!!! */ #endif /*TX_TERMCAP*/ /* T_INIT is called once only at program startup, to identify the * terminal type and set up any one-time things. * T_FATAL is only called if some routine detects an error related to the * terminal specification, before any initialization is done. * It prints a short error message and exits the program. * T_ENTER is called after TS_ENTER to set the terminal parameters for * editing (as opposed to normal typeout). It may be called * several times. * T_EXIT is called before TS_EXIT to restore normal typeout modes. * It is called on exit from the program, and perhaps other times. */ t_init() { char *getenv(); /* Set some default parameters */ scr_ht = 24; scr_wid = 79; trm_flags = 0; tvc_cin = 1; /* Assume 1 char per char I/D pos */ tvc_cdn = 1; tvc_pos = 4; /* Default abs-move cost is 4 chars */ tvc_bs = 1; /* Default backspace cost is 1 char */ tv_cspeed = cspdtab[trm_ospeed]; /* Find # msec per char */ /* First must determine terminal type, and check for terminals * that are hardwired into ELLE. */ if(!tv_stype /* String set in command line args? */ #if !(V6) && !(tv_stype = getenv("TERM")) /* or given by TERM var? */ #endif /*-V6*/ ) tv_stype = TXS_DEFAULT; /* No, try using default */ if(0) ; /* Sigh, stupid construct */ #if TX_H19 else if(ustrcmp(tv_stype,"H19")) tv_type = TN_H19; #endif /*TX_H19*/ #if TX_OM8025 else if(ustrcmp(tv_stype,"OM8025")) tv_type = TN_OM8025; #endif /*TX_OM8025*/ #if TX_DM2500 else if(ustrcmp(tv_stype,"DM2500")) tv_type = TN_DM2500; else if(ustrcmp(tv_stype,"DM3025")) tv_type = TN_DM2500; #endif /*TX_DM2500*/ #if TX_COHIBM else if(ustrcmp(tv_stype,"COHIBM")) tv_type = TN_COHIBM; #endif /*TX_COHIBM*/ #if TX_TVI925 else if(ustrcmp(tv_stype,"TVI925")) tv_type = TN_TVI925; #endif /*TX_TVI925*/ #if TX_TERMCAP /* This should be last thing */ else if(getcap(tv_stype)) tv_type = TN_TERMCAP; #endif /*TX_TERMCAP*/ else t_fatal("type unknown"); /* Ugh, barf and exit */ /* Terminal selected, now initialize parameters for it. */ switch(tv_type) { #if TX_DM2500 case TN_DM2500: tv_padc = 0177; /* Use rubout for pad */ tvc_pos = 3; /* Only 3 chars for abs mov */ tvc_ci = 2; /* tvc_cin = 1; */ /* Default is OK */ tvc_cd = 2; /* tvc_cdn = 1; */ /* Default is OK */ tvc_ld = 2; tvc_ldn = 1; tvc_li = 2; tvc_lin = 1; if(trm_ospeed == 13) /* If 9600, */ { tvc_cin = 5; /* Sigh, high cost */ tvc_cdn = 2; tvc_lin = 18; tvc_ldn = 2; } trm_flags |= TF_IDLIN|TF_IDCHR|TF_CLEOL|TF_METAKEY; break; #endif /*TX_DM2500*/ #if TX_H19 case TN_H19: trm_flags |= TF_IDLIN|TF_IDCHR|TF_CLEOL; tvc_ci = 8; /* tvc_cin = 1; */ /* default is ok */ tvc_cd = 0;J?L?M?N?O?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?^?_?`?a?b? tvc_cdn = 2; /* tvc_ld = 0; */ /* Default is OK */ tvc_ldn = 1 << (trm_ospeed - 7); /* tvc_li = 0; */ /* Default is OK */ tvc_lin = tvc_ldn; break; #endif /*TX_H19*/ #if TX_COHIBM case TN_COHIBM: trm_flags |= TF_IDLIN|TF_IDCHR|TF_CLEOL|TF_METAKEY|TF_DIRVID; /* Always use lowest possible costs */ /* tvc_ci = 0; */ /* Default */ tvc_cin = 2; /* tvc_cd = 0; */ /* Default */ tvc_cdn = 2; /* tvc_ld = 0; */ /* Default */ tvc_ldn = 2; /* tvc_li = 0; */ /* Default */ tvc_lin = 2; break; #endif /*TX_COHIBM*/ #if TX_OM8025 case TN_OM8025: trm_flags |= TF_IDLIN|TF_IDCHR|TF_CLEOL; tvc_pos = 6; /* tvc_ci = tvc_cd = 0; */ /* Default */ tvc_cin = 4; tvc_cdn = 2; /* tvc_ld = tvc_li = 0; */ /* Default */ tvc_ldn = 10; /* Crude approx */ tvc_lin = 10; if(trm_ospeed > 7) /* If faster than 300 baud */ trm_flags &= ~TF_IDLIN; /* Turn off LID */ break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: trm_flags |= TF_IDLIN|TF_IDCHR|TF_CLEOL; tvc_ci = tvc_cd = tvc_cin = tvc_cdn = tvc_ldn = tvc_lin = 2; break; #endif /*TX_TVI925*/ } if(tibfmsk < 0) /* If mask is still default -1, set it. */ tibfmsk = ((trm_flags&TF_METAKEY) ? 0377 : 0177); } /* T_FATAL(str) - prints error message and exits. */ t_fatal(str) char *str; { writerr("ELLE: \""); writerr(tv_stype); writerr("\" terminal "); writerr(str); writerr("\n"); exit(1); /* Terminate with prejudice */ } /* T_ENTER is called after TS_ENTER to set the terminal parameters for * editing (as opposed to normal typeout). * Standout mode must initially be off. */ t_enter() { switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(TC_ti); if(tc_km) putpad(TC_mm); /* Use meta if poss */ #if FX_SOWIND t_standout(0); /* Ensure standout mode off */ #endif break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(030); /* Just in case, flush stray modes */ break; #endif /*TX_DM2500*/ #if TX_COHIBM case TN_COHIBM: /* Note TN_H19 will exist too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: /* Enter ZDS (Heath) mode, then * Exit graphics mode (G) Exit ins-char mode (O) * exit rev video mode (q) exit hold-screen mode (\) * set cursor on (y5) */ tputz("\033[?2h\033G\033O\033q\033\\\033y5"); /* Set Discard-at-EOL (w) * Set no auto-CR (y9) * Enable 25th line (x1) */ tputz("\033w\033y9\033x1"); break; #endif /*TX_H19*/ } } /* T_EXIT - Leave editing modes. This function should restore ** the terminal's modes to what they were before ELLE was started. ** Standout mode is turned off. */ t_exit() { switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: if(tc_km) putpad(TC_mo); /* Turn off meta */ putpad(TC_te); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(035); /* Turn on roll mode */ break; #endif /*TX_DM2500*/ #if TX_COHIBM case TN_COHIBM: /* If this exists, TN_H19 will too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz("\033v"); /* Turn EOL-wrap back on */ #if DNTTY tputz("\033<"); /* Return to ANSI mode */ #endif /*DNTTY*/ break; #endif /*TX_H19*/ } } /* T_CLEAR() - Clears the screen and homes the cursor. * Always valid - ELLE refuses to support terminals without this. */ t_clear () { switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putnpad(TC_cl,scr_ht); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tputz("\036\036"); /* Double Master Clear */ break; #endif /*TX_DM2500*/ #if TX_COHIBM case TN_COHIBM: /* Note TN_H19 will exist too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz("\033E"); /* tputn(zpadstr,9); */ break; #endif /*TX_H19*/ #if TX_OM8025 case TN_OM8025: tputz("\033H\033J"); /* Home then CLEOS */ tpad(1000); /* One second!!!! */ break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: tput(032); /* ^Z */ break; #endif /*TX_TVI925*/ } curs_lin = curs_col = 0; } /* T_CURPOS(y, x) - Absolute move. Place cursor in given position * regardless of where it currently is. * Updates curs_lin, curs_col. * Always valid -- ELLE refuses to support terminals without this. */ t_curpos (lin, col) register int lin, col; { if(col > scr_wid) /* Easiest to catch here */ col = scr_wid; /* Do absolute positioning */ switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(tgoto(TC_cm, col, lin)); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(014); tput(col^0140); tput(lin^0140); break; #endif /*TX_DM2500*/ #if TX_COHIBM case TN_COHIBM: /* If this exists, TN_H19 will too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz("\033Y"); tput(lin+040); tput(col+040); break; #endif /*TX_H19*/ #if TX_OM8025 case TN_OM8025: tputz("\033\175"); tput(0100+((lin+1)>>4)); tput(0100+((lin+1)&017)); tput(0100+((col+1)>>4)); tput(0100+((col+1)&017)); break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: tputz("\033="); tput(lin+040); tput(col+040); break; #endif /*TX_TVI925*/ } curs_lin = lin; curs_col = col; } /* T_BACKSPACE() - Back up 1 character position. * Updates curs_col. * Only valid if tvc_bs has a "reasonable" value ( < 1000) */ t_backspace() { #if TX_TERMCAP if(BC) tputz(BC); /* Use alternate BS */ else #endif tput('\010'); /* Send BS */ --curs_col; } /* T_BELL() - Ring terminal's bell (or flash something, or whatever). * Forces out all output thus far, to ensure immediate attention. * This used to be an unbuffered feep, but was changed to use normal * output path in order to avoid messing up terminal escape sequences. */ t_bell() { #if TXC_VISBEL && TX_TERMCAP if(TC_vb) tputz(TC_vb); /* Do visible bell if possible */ else #endif tput(BELL); tbufls(); /* Force it out */ } /* T_CLEOL() - Clear to End Of Line. * Only valid if trm_flags has TF_CLEOL set. */ t_cleol () { switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(TC_ce); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(027); break; #endif /*TX_DM2500*/ #if TX_COHIBM case TN_COHIBM: /* If this exists, TN_H19 will too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz("\033K"); break; #endif /*TX_H19*/ #if TX_OM8025 case TN_OM8025: tputz("\033K"); tpad(41); /* 1/25 sec padding */ break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: tputz("\033T"); break; #endif /*TX_TVI925*/ } } /* T_INSLIN(n, bot) - Insert lines in window. * n - # blank lines to insert. * bot - # of last line of current window * * The current line is moved down and N blank lines inserted. * Lines which are moved past bot are lost. * May leave cursor in random place. * Only valid if trm_flags has TF_IDLIN set. */ t_inslin (n, bot) int n; /* number of lines */ int bot; /* line number of last line in window */ { register i, j; int savc,savl; if((i = n) <= 0) return; if(bot < (scr_ht-1)) { savc = curs_col; savl = curs_lin; t_curpos(bot-i, 0); t_dellin(i, scr_ht); t_curpos(savl, savc); } switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: if(TC_AL) putpar(TC_AL, i, i); else if(TC_ia) { putpad(TC_im); do { putpad(TC_ia); } while(--i); putpad(TC_ei); } else do { putnpad(TC_al, scr_ht - curs_lin); } while(--i); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(020); /* Enter I/D mode */ do { tput(012); /* Insert line */ switch(trm_ospeed) { case 13: j = 17; break; /* 9600 */ case 12: j = 8; break; /* 4800 */ case 11: j = 4; break; /* 2400 */ case 9: j = 2; break; /* 1200 */ default: j = 0; break; } tpadn(j); } while(--i); tput(030); /* Exit I/D mode */ break; #endif /*TX_DM2500*/ #if TX_H19 /* NOTE: H19 supposedly requires 19 ms for each line during line I/D * operations. * In actual practice, at 9600 baud 25 pads are necessary (24 wont work!) * for both I and D. Plus esc-E needs 9 pads. */ case TN_H19: do { tputz("\033L"); switch(trm_ospeed) { case 13: j = 25; break; case 9: j = 4; break; case 7: j = 1; break; default: j = 0; break; } tpadn(j); } while(--i); break; #endif /*TX_H19*/ #if TX_COHIBM case TN_COHIBM: do { tputz("\033L"); /* no padding required */ } while(--i); break; #endif /*TX_COHIBM*/ #if TX_OM8025 case TN_OM8025: do { tputz("\033L"); tpad(100*(scr_ht - curs_lin)); /* .1 per moved line*/ } while(--i); break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: do tputz("\033E"); while(--i); break; #endif /*TX_TVI925*/ } } /* T_DELLIN(n, bot) - Delete lines from window. * n - # lines to delete. * bot - # of last line of current window. * The current line, and N-1 following lines, are deleted. * Blank lines are inserted past bot. * Cursor should be left at original position. * Only valid if trm_flags has TF_IDLIN set. */ t_dellin (n, bot) int n; /* number of lines */ int bot; /* line number of last line in window */ { register i, j; int savl, savc; if((i = n) <= 0) return; switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: if(TC_DL) putpar(TC_DL, i, i); else if(TC_id) { putpad(TC_dm); do putpad(TC_id); while(--i); putpad(TC_ed); } else do { putnpad(TC_dl,scr_ht - curs_lin); } while(--i); break; #endif /*TX_TERMCAP*/ #if TX_DM2500 case TN_DM2500: tput(020); do { tput(032); if(trm_ospeed >= 13) /* 9600 */ tput(0177); } while(--i); tput(030); break; #endif /*TX_DM2500*/ #if TX_H19 case TN_H19: do { tputz("\033M"); switch(trm_ospeed){ case 13: j = 25; break; case 9: j = 4; break; case 7: j = 1; break; default: j = 0; break; } tpadn(j); } while(--i); break; #endif /*TX_H19*/ #if TX_COHIBM case TN_COHIBM: do { tputz("\033M"); /* no padding required */ } while(--i); break; #endif /*TX_COHIBM*/ #if TX_OM8025 case TN_OM8025: do { tputz("\033M"); tpad(100*(scr_ht - curs_lin)); } while(--i); break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: do { tputz("\033R"); } while(--i); break; #endif /*TX_TVI925*/ } if(bot < (scr_ht-1)) { savl = curs_lin; savc = curs_col; t_curpos(bot-n,0); t_inslin(n,scr_ht); t_curpos(savl,savc); } } /* T_INSCHR(n, str) - Insert n chars in current line * n - # characters to insert * str - Pointer to char string. If 0, insert spaces. * * Insert N characters from string str at current position. * The cursor may move but curs_col must be updated. * Only valid if trm_flags has TF_IDCHR set. */ t_inschr(n, str) int n; char *str; { register int i; register char *cp; if((i = n) <= 0) return; cp = str; switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(TC_im); /* Go into insert mode */ if(TC_IC) { putpar(TC_IC, i, 1); if(cp) tputn(cp, i); else do tput(SP); while(--i); } else do { if(TC_ic) putpad(TC_ic); if(cp) tput(*cp++); else tput(SP); if(TC_ip) putpad(TC_ip); } while(--i); putpad(TC_ei); /* Exit insert mode */ curs_col += n; break; #endif /*TX_TERMCAP*/ #if TX_COHIBM case TN_COHIBM: /* If this exists, TN_H19 will too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz("\033@"); /* Enter ins char mode */ do { if(cp) tput(*cp++); else tput(SP); } while(--i); tputz("\033O"); /* Exit ins char mode */ curs_col += n; break; #endif /*TX_H19*/ #if TX_DM2500 case TN_DM2500: tput(020); /* Enter I/D mode */ if(trm_ospeed == 13) /* 9600 baud lossage */ { do { tputz(" \177"); /* SP and DEL */ } while(--i); tput(030); i = n; if(i < 3) /* If close enough, */ tputn("\010\010", i); /* use BSes */ else t_curpos(curs_lin, curs_col); } else /* Not 9600, can win */ { do { tput(034); } while(--i); tput(030); if(cp == 0) return; i = n; } do { if(cp) tput(*cp++); else tput(SP); } while(--i); curs_col += n; break; #endif /*TX_DM2500*/ #if TX_OM8025 case TN_OM8025: do { tputz("\033@"); if(cp) tput(*cp++); else tput(SP); } while(--i); curs_col += n; break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: do { tputz("\033Q"); } while(--i); if(cp) { tputn(cp, n); curs_col += n; } break; #endif /*TX_TVI925*/ } } /* T_DELCHR(n) - Delete N chars in current line. * Deletes the N characters to the right of the cursor. Remaining * chars are shifted left. The cursor should not move. * Only valid if trm_flags has TF_IDCHR set. */ t_delchr(n) /* Delete N chars at current loc */ int n; { register int i; if((i = n) <= 0) return; switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(TC_dm); /* Enter delete mode */ if(TC_DC) putpar(TC_DC, i, 1); else do { /* Delete char while in del mode */ putpad(TC_dc); } while(--i); putpad(TC_ed); /* Exit delete mode */ break; #endif /*TX_TERMCAP*/ #if TX_COHIBM case TN_COHIBM: /* If this exists, TN_H19 will too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: do tputz("\033N"); while(--i); break; #endif /*TX_H19*/ #if TX_DM2500 case TN_DM2500: tput(020); /* Enter I/D mode */ do if(trm_ospeed == 13) /* 9600? */ tputz("\010\177"); /* BS and DEL */ else tput(010); while(--i); tput(030); /* Exit I/D mode */ break; #endif /*TX_DM2500*/ #if TX_OM8025 case TN_OM8025: do tputz("\033P"); while (--i); break; #endif /*TX_OM8025*/ #if TX_TVI925 case TN_TVI925: do { tputz("\033W"); } while(--i); #endif /*TX_TVI925*/ } } #if FX_SOWIND /* T_STANDOUT(n) - Enter or leave standout mode. * n - 0 to return to normal display mode, * 1 to enter standout display mode. * This is usually reverse video but may be something else. * * Only valid if trm_flags has TF_SO set. */ t_standout(on) int on; { switch(tv_type) { #if TX_TERMCAP case TN_TERMCAP: putpad(on ? TC_so : TC_se); break; #endif /*TX_TERMCAP*/ #if TX_COHIBM case TN_COHIBM: /* Note TN_H19 will exist too */ #endif /*TX_COHIBM*/ #if TX_H19 case TN_H19: tputz(on ? "\033p" : "\033q"); break; #endif /*TX_H19*/ } } #endif /*FX_SOWIND*/ /* TPADN(n) - Output N pad chars. */ static void tpadn(n) int n; { register int i, pad; if((i = n) > 0) { pad = tv_padc; do { tput(pad); } while(--i); } } /* TPAD(msec) - Output padding for given # of milliseconds. */ static void tpad(n) int n; { register int i, i2; i = n; while(i > 0) { if((i2 = 320) < i) /* So can use integers */ i2 = i; i -= i2; i2 *= 100; while((i2 -= tv_cspeed) > 0) tput(tv_padc); } } #if TX_TERMCAP /* * Print the string str, interpreting padding. */ int tput(); /* Our output function */ static void putpad(str) char *str; { if(str) tputs(str, 1, tput); /* Invoke TERMCAP function */ } static void putnpad(str,n) char *str; int n; { if(str) tputs(str, n, tput); } static void putpar(str, par, n) /* Wish we had tparm() */ char *str; int par,n; { putnpad(tgoto(str, 0, par), n); } #endif /*TX_TERMCAP*/ /* * Read in the stuff from termcap upon startup. */ #if TX_TERMCAP static int tstrlen(), tstrlp(); #ifndef TCAPSLEN #define TCAPSLEN 1024 /* Default size of buffer for TERMCAP strings */ #endif /*-TCAPSLEN*/ static int getcap(stype) char *stype; { register char *t; register int i; int buflen; char *tcbuf, *tcbptr; /* Pointers into termcap buffer */ char tmpstr[4]; char tmpbuf[TCAPSLEN]; /* Allocate from stack */ char *malloc(); char *realloc(); /* First see if can find the terminal type. */ if((tgetent(tmpbuf, stype)) != 1) return(0); /* Found it! Set up a string buffer to save the caps. */ if(!(tcbuf = malloc(TCAPSLEN))) /* Get permanent buffer */ t_fatal(" - cannot allocate termcap buffer"); tcbptr = tcbuf; /* Now gobble all the string caps that ELLE wants to know about. */ tmpstr[3] = '\0'; i = NTCAPS; do { tmpstr[0] = tcap[i].tcicod1; /* Make str of the code */ tmpstr[1] = tcap[i].tcicod2; tcap[i].tccap = tgetstr(tmpstr, &tcbptr); /* Get cap */ } while(--i); buflen = tcbptr - tcbuf; /* String buffer done, finalize */ if(buflen >= TCAPSLEN) t_fatal("description too big!"); realloc(tcbuf, buflen); /* Free up unused part of buffer */ /* (this better not move it!!!) */ /* Now get the number/flag stuff that ELLE needs. */ tc_am = tgetflag("am"); /* auto wrap */ if (tgetflag("xn")) tc_am = 0; /* auto wrap at 81st char, nice! */ tc_km = (tgetflag("km") /* TTY has meta key */ || tgetflag("MT")); /* Alternate version of "km"?? */ scr_ht = tgetnum("li"); /* Set screen height (# lines) */ scr_wid = tgetnum("co"); /* Set screen width (# cols) */ ts_winsize(); /* Now initialize the stupid external vars that TERMCAP rtns want. */ if(TC_pc) PC = *TC_pc; /* Pad char */ BC = TC_bc; /* Backspace str (if no BS) */ UP = TC_up; /* Cursor up */ ospeed = trm_ospeed; /* Put output speed here */ /* Basic data extracted, now mull over it and set the remaining * ELLE variables */ #if FX_SOWIND if(tgetnum("sg") <= 0) /* If no magic cookie problems */ { if (TC_so && TC_se) /* And have standout caps, */ trm_flags |= TF_SO; /* Say has standout cap */ } #endif if (!(TC_cm && TC_cl)) t_fatal("lacks cursor addressing or clear screen."); tvc_pos = tstrlen(TC_cm); /* Find cost of abs move */ if(BC) /* Find cost of backspace */ tvc_bs = tstrlen(BC); /* Find costs for doing I/D char operations */ if ((TC_im||TC_ic) && (TC_dm||TC_dc)) { trm_flags |= TF_IDCHR; tvc_ci = tstrlen(TC_im)+tstrlen(TC_ei); tvc_cin = tstrlen(TC_ic)+1+tstrlen(TC_ip); if(TC_IC) /* If have multi-IC, use it */ { tvc_ci += tstrlp(TC_IC, 1); tvc_cin = 1; } tvc_cd = tstrlen(TC_dm)+tstrlen(TC_ed); tvc_cdn = tstrlen(TC_dc); if(TC_DC) /* If have multi-DC, use it */ { tvc_cd += tstrlp(TC_DC, 1); tvc_cdn = 0; } } /* Find costs for doing I/D line operations */ if ((TC_ia || TC_al) && (TC_id || TC_dl)) { trm_flags |= TF_IDLIN; tvc_li = 0; /* Usual case */ tvc_lin = tstrlen(TC_al); if(TC_AL) /* If have multi-IL, use it */ { tvc_li = tstrlp(TC_AL, 1); tvc_lin = tstrlp(TC_AL, 2) - tvc_lin; } else if(TC_ia) { tvc_li = tstrlen(TC_im)+tstrlen(TC_ei); tvc_lin = tstrlen(TC_ia); } tvc_ld = 0; /* Usual case */ tvc_ldn = tstrlen(TC_dl); if(TC_DL) /* If have multi-DL, use it */ { tvc_ld = tstrlp(TC_DL, 1); tvc_ldn = tstrlp(TC_DL, 2) - tvc_ld; } else if(TC_id) { tvc_ld = tstrlen(TC_dm)+tstrlen(TC_ed); tvc_ldn = tstrlen(TC_id); } } if (tc_am) { scr_wid--; /* For now, avoid invoking wrap. */ #if 0 trm_flags |= AUTOWRAP; /* */ #endif } if (TC_ce) trm_flags |= TF_CLEOL; /* Term has CLEOL? */ if (tc_km) trm_flags |= TF_METAKEY; /* Term has meta key? */ return(1); } /* Pair of routines which conspire in order to find # chars actually output * by a particular termcap string. */ static int _tslen; /* Stored count */ static void _tslinc(ch) { _tslen++; } static int tstrlen(str) char *str; { _tslen = 0; if(str && str[0]) tputs(str, 1, _tslinc); /* Mult padding by just 1 */ return(_tslen); } static int tstrlp(str, par) /* Same but with parameter */ char *str; int par; { #if 0 if(str) { char *cp = tgoto(str, 0, par); int i = strlen(cp); while(--i >= 0) printf(" %o", *cp++); printf("\n"); } #endif return !str ? 0 : tstrlen(tgoto(str, 0, par)); } #endif /*TX_TERMCAP*/ /* Direct-Video terminal output routine * Currently only COHERENT has this capability. */ #if COHERENT #include struct vidctl { int v_position; /* Position in video memory */ int v_count; /* Number of characters to transfer */ char *v_buffer; /* Character buffer to read/write */ }; /* * Attribute masks for TIOVPUTB - attributes occupy odd addresses * in video memory. */ #define VNORM 0x07 /* Ordinary Video */ #define VINTE 0x08 /* Intense video */ #define VBLIN 0x80 /* Blinking video */ #define VREVE 0x70 /* Reverse video */ #define VUNDE 0x01 /* Underline video (mono board) */ /* T_DIRECT(line, col, string, len) - Do direct-video output of string. * Puts the string ("len" chars in length) on the screen starting at * the X,Y character position given by col, line. * This routine is only called if terminal has the "TF_DIRVID" flag set. */ t_direct(lin, col, str, len) int lin, col; register char *str; register int len; { register char *cp; char vbuf[MAXLINE*2]; struct vidctl v; if(len <= 0) return; tbufls(); /* Ensure normal output is forced out */ v.v_position = (lin*80 + col)*2; v.v_count = len*2; v.v_buffer = cp = vbuf; do { *cp++ = *str++; *cp++ = VNORM; } while(--len); ioctl(1, TIOVPUTB, &v); } #endif /*COHERENT*/ /* * Terminal Output buffering routines */ static char tbuf[TOBFSIZ]; /* Output buffer */ static int tbufcnt = 0; /* # chars of room left in buffer */ static char *tbufp = 0; /* Pointer to deposit in buffer */ tput(ch) int ch; { if(--tbufcnt < 0) tbufls(); *tbufp++ = ch; } tputz(str) char *str; { register int c; register char *cp, *tp; cp = str; tp = tbufp; while(c = *cp++) { if(--tbufcnt < 0) { tbufp = tp; tbufls(); tp = tbufp; } *tp++ = c; } tbufp = tp; } tputn(str,cnt) char *str; int cnt; { register int c; register char *cp, *tp; cp = str; tp = tbufp; if((c = cnt) > 0) do { if(--tbufcnt < 0) { tbufp = tp; tbufls(); tp = tbufp; } *tp++ = *cp++; } while(--c); tbufp = tp; } tbufls() { register int cnt; if(tbufp && (cnt = tbufp - tbuf) > 0) /* # chars written */ write(1, tbuf, cnt); /* Out they go */ tbufp = tbuf; tbufcnt = TOBFSIZ-1; /* Allow for usual expected decrement */ } /* * Terminal Input buffering routines */ int tibfmsk = -1; /* Mask AND'ed with input chars (external) */ static char tibuf[TIBFSIZ]; /* TTY input buffer */ static char *tibfp; /* Pointer to read from buffer */ static int tibfcnt = 0; /* # chars left to be read from buffer */ tgetc() { #if SUN register int c; extern int sun_winfd, sun_rdevf; if(sun_winfd) { if(!sun_rdevf) return(sun_input(1)&tibfmsk); sun_rdevf = 0; /* Check mouse too, but only once! */ c = sun_input(0); if(c != -1) c &= tibfmsk; return(c); } #endif /*SUN*/ while(--tibfcnt < 0) tibfcnt = read(0,(tibfp = tibuf),TIBFSIZ); return((*tibfp++)&tibfmsk); } tinwait() { return(tibfcnt > 0 || ts_inp()); } /* ELLE - Copyright 1982, 1987 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* EEVINI - ELLE initialized variables and array storage. * Initial values are defined here, but the vars must be * declared in ELLE.H as well so that references from all modules will * compile correctly. * Arrays are also allocated here, so size re-definitions only require * re-compiling this single small module. */ #define EXT /* Allocate storage for non-initialized vars */ #include "elle.h" #ifndef EVFILMOD #if V6 #define EVFILMOD (0600) /* (int) Default file creation mode on V6 */ #else #define EVFILMOD (0666) /* (int) Default file creation mode on V7, note */ #endif /*-V6*/ /* paranoids can use V7 "umask" in shell. */ #endif #ifndef EVFNO1 #define EVFNO1 0 /* (char *) "Old" filename prefix */ #endif #ifndef EVFNN1 #define EVFNN1 0 /* (char *) "New" filename prefix */ #endif #ifndef EVFNO2 #define EVFNO2 "O" /* (char *) "Old" filename postfix */ #endif #ifndef EVFNN2 #define EVFNN2 "N" /* (char *) "New" filename postfix */ #endif #ifndef EVFCOL #define EVFCOL (71) /* (int) Initial value for Fill Column */ #endif #ifndef EVCCOL #define EVCCOL (40) /* (int) Initial value for Comment Column */ #endif #ifndef EVNWPCT #define EVNWPCT 50 /* (int) 50% For random New Window, center cursor. */ #endif #ifndef EVMVPCT #define EVMVPCT 67 /* (int) 67% When move off edge, show 67% new stuff */ #endif #ifndef EVMODWSO #define EVMODWSO 0 /* (bool) Initial mode window standout mode */ #endif #ifndef EV2MODEWS #define EV2MODEWS 1 /* 2-mode-window flag. 0=Never, 1=if SO, 2=always */ #endif #ifndef EVMARKSHOW #define EVMARKSHOW 0 /* (char *) String shown for Set Mark */ #endif #ifndef EVHELPFILE /* (char *) Location of ELLE help file. */ #define EVHELPFILE "/usr/src/elle/help.dat" #endif char *ev_verstr = "ELLE 4.1b"; /* String: Editor name and version # */ int ev_filmod = EVFILMOD; /* Default file creation mode */ char *ev_fno1 = EVFNO1; /* "Old" filename prefix */ char *ev_fnn1 = EVFNN1; /* "New" filename prefix */ char *ev_fno2 = EVFNO2; /* "Old" filename postfix */ char *ev_fnn2 = EVFNN2; /* "New" filename postfix */ int ev_fcolumn = EVFCOL; /* Initial value for Fill Column */ #if FX_INDCOMM int ev_ccolumn = EVCCOL; /* Initial value for Comment Column */ #endif /* New window selection parameters. ** Both are expressed as an integer % of window lines (where the whole ** window is 100), and apply when a new window is selected. ** ev_nwpct - when "New Window" is called, % of lines between top and cursor. ** Also applies when screen has changed randomly. ** ev_mvpct - when cursor moves out of window, this is the % of lines ** between top and cursor (if moved off top) or between bottom and ** cursor (if moved off bottom). */ int ev_nwpct = EVNWPCT; /* New Window cursor loc preference (%) */ int ev_mvpct = EVMVPCT; /* Moved cursor loc preference (%) */ #if FX_SOWIND int ev_modwso = EVMODWSO; /* Initial mode window standout flag */ #endif #if FX_2MODEWINDS int ev_2modws = EV2MODEWS; /* Initial 2-mode-wind flag */ #endif char *ev_markshow = EVMARKSHOW; /* String to display when Set Mark done */ char *ev_helpfile = EVHELPFILE; /* Location of ELLE help file */ char *ev_profile = EVPROFBINFILE; /* Location of ELLE binary user profile */ /* Note ELLE doesn't use EVPROFTEXTFILE. */ /* Array allocations */ struct scr_line *scr[MAXHT]; /* Array of screen line structures */ SBSTR *kill_ring[KILL_LEN]; /* Kill ring table */ /* ELLE - Copyright 1982, 1984 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* * ELLE.H Global ELLE definitions */ #ifndef EXT #define EXT extern /* Default assumes these are referencing decls */ #endif /* Make identifiers unique in 1st 6 chars as per ANSI rule for externals */ #define tvc_cin tvccin #define tvc_cdn tvccdn #define tvc_lin tvclin #define tvc_ldn tvcldn #define ev_fno1 evfno1 #define ev_fno2 evfno2 #define ev_fnn1 evfnn1 #define ev_fnn2 evfnn2 #define ask_sall asksal /* eebuff.c */ #define ask_save asksav #define buf_tmod buftmo #define buf_tmat buftma #define e_gobob egobob /* eeedit.c */ #define e_gobol egobol #define e_goeob egoeob #define e_goeol egoeol #define fill_prefix filpfx /* eefill.c */ #define fill_plen filpln #define fill_cur_line filcln #define kill_ptr kilptr /* eef3.c */ #define kill_push kilpsh #define ed_insert edinst /* eefed.c */ #define ed_insn edinsn #define ed_deln eddeln #define ed_delete eddele #define f_fillreg ffilrg /* eejust.c */ #define f_fillpara ffilpa #include "eesite.h" /* Insert site-dependent flags and parameters */ #include "sb.h" /* Insert SB package definitions */ #include "eeprof.h" /* Insert user profile definition. This is a * separate file so ELLEC can use it too. */ #include "eefidx.h" /* Insert desired function defs */ /* ELLE Compile-time parameter defaults */ #ifndef KILL_LEN #define KILL_LEN 8 /* Size of kill ring */ #endif #ifndef MAXHT #define MAXHT 72 /* Height (# lines) of largest screen we'll suport */ #endif #ifndef MAXLINE #define MAXLINE 132 /* Width (# chars) of largest screen we'll support */ #endif #ifndef FNAMELEN #define FNAMELEN 14 /* Sys-dep: Max size of last filename component */ #endif /* Check FNAMSIZ if you change this. */ #ifndef FNAMSIZ #define FNAMSIZ 100 /* Sys-dep: Max size of complete filename */ #endif /* This must be at least as large as FNAMELEN! */ #ifndef ISRCHLIM #define ISRCHLIM 50 /* Max # of chars to allow I-search on */ #endif #ifndef TOBFSIZ #define TOBFSIZ 80 /* Size of TTY output buffer */ #endif #ifndef TIBFSIZ #define TIBFSIZ 50 /* Size of TTY input buffer */ #endif #ifndef ECHOLINES #define ECHOLINES 1 /* # of lines for echo area (below mode line) */ #endif #ifndef MAXARGFILES #define MAXARGFILES 2 /* # of filename args OK at startup */ #endif /* ELLE initialized variables. * Initial values are defined in EEVINI.C, but the vars must be * declared here as well so that references from all modules will * compile correctly. */ extern char *ev_verstr; /* String: Editor name and version # */ extern int ev_filmod; /* Default file creation mode */ extern char *ev_fno1,*ev_fno2; /* Pre, postfix for "old" filenames */ extern char *ev_fnn1,*ev_fnn2; /* Pre, postfix for "new" filenames */ extern int ev_fcolumn; /* Fill Column variable */ #if FX_INDCOMM extern int ev_ccolumn; /* Comment Column variable */ #endif extern int ev_nwpct, ev_mvpct; /* New window selection percentages */ #if FX_SOWIND extern int ev_modwso; /* Initial mode window standout flag */ #endif #if FX_2MODEWINDS extern int ev_2modws; /* Initial setting of 2-mode-window flag */ #endif extern char *ev_markshow; /* String to show when Set Mark done */ extern char *ev_helpfile; /* Location of ELLE help file */ extern char *ev_profile; /* Filename of ELLE binary user profile */ extern struct profile def_prof; /* ELLE default user profile */ /* Global variables */ EXT chroff cur_dot; /* Current dot */ EXT chroff mark_dot; /* Dot for mark */ EXT int mark_p; /* flag indicating whether mark exists */ EXT int this_cmd, last_cmd; /* Command type */ EXT int unrchf; /* Stuffed character back for readcommand */ EXT int exp; /* Numeric argument for commands */ EXT int exp_p; /* Flag meaning an arg was given */ EXT int pgoal; /* Permanent goal column */ EXT int goal; EXT char *srch_str; /* Last search string specified (0 = none) */ EXT int srch_len; /* Length of srch_str string */ EXT int ask_len; /* Length of last string returned by "ask" */ EXT char *homedir; /* User's home directory */ EXT int kill_ptr; /* Index into kill ring */ extern SBSTR *kill_ring[]; /* Kill ring table (allocated in eevini) */ /* Editor Command types */ #define KILLCMD 1 /* Kill command, for kill merging */ #define ARGCMD 2 /* Argument-setter, for main loop */ #define YANKCMD 3 /* Yank command, for yankpop */ #define LINECMD 4 /* Next or previous line goal hacking */ #if IMAGEN #define INSCMD 5 /* Simple char-insert command, for autowrap */ #endif /*IMAGEN*/ /* Misc char definitions */ #define CTRL(ch) (037&ch) #define BELL ('\007') /* Will become \a in ANSI */ #define BS ('\b') #define TAB ('\t') #define LF ('\n') #define FF ('\f') #define CR ('\r') #define ESC ('\033') #define SP (' ') #define DEL ('\177') #define CB_META (0200) /* Meta bit in command char */ #define CB_EXT (0400) /* Extend bit in command char */ #define METIZER ESC #define EXTIZER CTRL('X') /* Terminal parameters - set at runtime startup */ EXT char *tv_stype; /* Terminal type string specified by user/system */ EXT int scr_ht; /* # lines of main screen area */ EXT int scr_wid; /* # columns of screen */ EXT int scr_wd0; /* scr_wid - 1 (for 0-origin stuff) */ EXT int trm_ospeed; /* Output speed index */ EXT int tvc_pos; /* Cost for absolute move (# of output chars) */ EXT int tvc_bs; /* Cost for backspace */ EXT int tvc_ci, tvc_cin; /* Char ins cost per call, cost per column */ EXT int tvc_cd, tvc_cdn; /* Char del " " " " " " */ EXT int tvc_li, tvc_lin; /* Line ins cost per call, cost per line */ EXT int tvc_ld, tvc_ldn; /* Line del " " " " " " */ EXT int trm_flags; /* Terminal capabilities - bit flags */ /* Maybe change to word vars someday (faster) */ #define TF_IDLIN 01 /* Has I/D line */ #define TF_IDCHR 02 /* Has I/D char */ #define TF_SO 04 /* Has usable standout mode */ #define TF_CLEOL 010 /* Has clear-to-eol */ #define TF_METAKEY 020 /* Has meta key */ #define TF_DIRVID 040 /* Has direct-video type interface */ /* Redisplay definitions */ EXT int curs_lin; /* Line # of current cursor (0 origin) */ EXT int curs_col; /* Column # of current cursor (0 origin) */ EXT int rd_type; /* Global var: holds redisplay "hints" */ #define redp(n) rd_type |= (n) #define RD_SCREEN 01 /* Clear everything and redisplay */ #define RD_WINDS 02 /* Check all windows for changes (b/emod) */ #define RD_MODE 04 /* Mode line has changed, update it. */ #define RD_WINRES 0400 /* Assume all of window was changed (clear b/emod) */ #define RD_MOVE 010 /* Cursor has moved */ #define RD_UPDWIN 020 /* Window fixed, must update modified screen lines */ /*#define RD_ICHR 0 *//* Hint: Char insert done */ /*#define RD_DCHR 0 *//* Hint: Char del done */ #define RD_ILIN 0100 /* Hint: Line insert done */ #define RD_DLIN 0200 /* Hint: Line del done */ /* #define RD_MOVWIN 02000 *//* Window should be re-positioned */ #define RD_FIXWIN 02000 /* Window needs fixing (call fix_wind) */ #define RD_TMOD 04000 /* Text changed in this window, check it. */ #define RD_WINCLR 010000 /* Clear window with CLEOLs (not yet) */ #define RD_CHKALL 020000 /* Check all windows for redisplay flags */ #if IMAGEN #define RD_REDO 040000 /* Just re-do the entire window, don't think */ #endif /*IMAGEN*/ /* Flags with global effects, only seen in rd_type */ #define RDS_GLOBALS (RD_SCREEN|RD_MODE|RD_WINDS|RD_CHKALL) /* Flags which are allowed per-window (in w_redp) */ #define RDS_WINFLGS (~RDS_GLOBALS) /* Flags which force FIX_WIND() to do something */ #define RDS_DOFIX (RD_WINRES|RD_TMOD|RD_FIXWIN|RD_MOVE) #define CI_CLINE '!' /* Char indicator for continued line */ #define CI_CNTRL '^' /* Char indicator for control chars */ #define CI_META '~' /* Char indicator for meta-bit (8th) set */ #define CI_TOP '|' /* Char indicator for top-bit (9th) set */ #define MAXCHAR (8+3) /* Longest char representation (TAB) + slop */ /* Definitions for screen structures */ struct scr_line { chroff sl_boff; /* Ptr to start on?p?q?r?s?t?f line's text in buffer */ int sl_len; /* # buffer chars in line (incl NL) */ char *sl_line; /* Ptr to screen image of line */ int sl_col; /* # chars in image == # columns used */ char sl_flg; /* Flags - set if this line modified */ char sl_cont; /* If line being continued on next, this */ /* contains 1 plus # extra chars (if any) */ /* stored at end of this line which shd be */ /* put at beg of next line. */ char *sl_nlin; /* New screen image line if modified flag set */ int sl_ncol; }; /* sl_flg definitions */ #define SL_MOD 01 /* New line exists, must update to it */ #define SL_EOL 02 /* Buffer line ends with EOL */ #define SL_CSO 04 /* Current screen line is in standout mode */ #define SL_NSO 010 /* New screen line is in standout mode */ #if IMAGEN #define SL_REDO 0100 /* Line should be redone completely */ #endif /*IMAGEN*/ extern struct scr_line *scr[]; /* Screen line ptrs (allocated in e_vinit) */ /* Buffer stuff */ struct buffer { SBBUF b_sb; /* MUST be 1st thing! */ struct buffer *b_next; /* ptr to next in chain */ char *b_name; /* text name */ char *b_fn; /* filename */ chroff b_dot; /* point (dot) */ int b_flags; /* misc. bits */ struct majmode *b_mode; /* Mode of buffer */ #if IMAGEN long b_mtime; /* Last file modification time */ #endif /*IMAGEN*/ }; /* b_flags definitions */ #define B_MODIFIED 01 /* Buffer is modified */ #define B_EOLCRLF 0200 /* On = CRLF mode, off = LF mode */ #if IMAGEN #define B_PERMANENT 002 /* buffer cannot be killed */ #define B_CMODE 004 /* "C" mode (HACK HACK) */ #define B_BACKEDUP 010 /* Buffer has been backed up once */ #define B_TEXTMODE 020 /* Text mode (auto-wrap, basically) */ #define B_QUERYREP 040 /* Query-replace mode (qualifier) */ #endif /*IMAGEN*/ /* Handy macro to check EOL mode */ #define eolcrlf(buf) (((struct buffer *)buf)->b_flags&B_EOLCRLF) /* Buffer pointers */ EXT struct buffer *buf_head, /* head of list of all buffers */ *cur_buf, /* buffer we are editing now */ *last_buf, /* buffer we were editing before */ *lines_buf; /* buffer for sep_win */ /* Window stuff */ struct window { struct window *w_next; /* ptr to next in chain */ int w_flags; /* Window flags */ int w_pos; /* index of top line */ int w_ht; /* number of lines */ struct buffer *w_buf; /* buffer in this window */ int w_pct; /* % of buffer window is at */ int w_redp; /* Redisplay hints */ chroff w_topldot; /* line currently at top of window */ chroff w_dot; /* Saved dot while not cur_win */ chroff w_bmod; /* Lower bound of modified text */ chroff w_emod; /* Upper bound of modified text */ /* (offset from end of buffer!) */ chroff w_oldz; /* Buffer len as of last update */ }; /* Window flags */ #define W_STANDOUT 01 /* Use terminal's standout mode for window */ #define W_MODE 02 /* This is a mode window */ /* Window pointers */ EXT struct window *win_head, /* head of list of all windows */ *cur_win, /* window we are now in */ *user_win, /* current user window */ *oth_win, /* "other" user window */ *mode_win, /* window for mode line */ *ask_win, /* window for ask (echo) area */ *sep_win; /* window for separation dashes */ /* Major Mode stuff. Each buffer has its own major mode. * Only one major mode may be in effect at any time. */ struct majmode { char *mjm_name; /* Simple for now */ }; EXT struct majmode *fun_mode; /* Fundamental mode - the default */ EXT struct majmode *cur_mode; /* Current major mode */ /* Minor modes are currently implemented by means of flag variables * which have global effects (regardless of buffer or major mode). * Each variable has the name "x_mode" where x is the name of the minor * mode. These are declared in the modules containing their support code. * In the future this may be generalized along the lines of major modes. */ /* Miscellaneous debug stuff */ EXT int dbgval; /* Set nonzero to do verify stuff */ EXT int dbg_isw; /* Set to enable interrupts if possible */ #if IMAGEN EXT int dbg_redp; /* Set to debug redisplay algorithms */ #endif /*IMAGEN*/ extern int errno; /* V7 routines for setexit/reset emulation */ #if !(V6) #include EXT jmp_buf env_main; #define setexit(a) setjmp(env_main) #define reset(a) longjmp(env_main,a) #endif /*-V6*/ /* Declare functions returning CHROFF values (offsets into a buffer) */ extern chroff e_dot(),e_nldot(),e_pldot(),e_boldot(),e_eoldot(), e_alldot(),ex_boldot(),ex_alldot(), ex_blen(),e_blen(),ex_dot(),e_wdot(); extern SBSTR *e_copyn(); /* Some other commonly needed declarations */ extern char *memalloc(), *ask(), *dottoa(), *strdup(); #if !(V6) extern char *getenv(); #endif /*-V6*/ #include "eeproto.h" /* function prototypes */ /* ELLEC - Copyright 1983 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. */ /* ELLEC - ELLE Compiler * Invoked with no arguments, acts as general ELLE compiler filter; * reads ASCII profile input, and outputs a binary profile. * Otherwise: * -Profile Compiles user's profile. * HOME/.ellepro.e -> HOME/.ellepro.bN (N = fmt version #) * NOTE: on V6, "HOME/" is left out. * -Pconf Outputs defprf.c for ELLE (accepts std in) (old -E) * -Fconf Outputs eefdef.h for ELLE (accepts std in) * -FXconf Outputs eefidx.h for ELLE (accepts std in) * -CMconf Outputs config makefile for ELLE ( " ) * -CSconf arg Outputs config file using "arg" - for V6 config.v6 file. * -Pdump Outputs defprf.e user profile (old -P) * -Fdump Outputs deffun.e */ #if 0 The ASCII profile file associates command chars with functions. It is simply a series of lisp-like expressions of the form (keybind ) e.g. (keybind "C-Y" "Yank Pop") Command char specification: Allowed prefixes: The char itself C- Controlify (zap bits 140) ^ Ditto M- Meta (add bit 200) - case ignored X- Extended (add bit) - case ignored To quote a char or char spec, use quoted-string syntax. Function name specification: Function names are specified by quoted strings containing the entire long-form ASCII function name. Matching is done case-independently. #endif /*COMMENT*/ #include "eesite.h" /* Site specific stuff if any */ #include #include #include #include "eeprof.h" /* Profile structure definition */ #define EFUNMAX 400 /* Maximum # (+1) of functions that can be defined */ #define KBTSIZ (128*2) /* Initial size of key binding tables */ /* EFUN Function definition table. ** Functions that were copied from the pre-defined table will ** have a value of NULL in ef_mod. */ struct fun { int ef_idx; /* Function index (same as index of entry) */ char *ef_name; /* Function name */ char *ef_adr; /* C routine name in ELLE */ char *ef_mod; /* Source module that C routine lives in */ }; struct fun efuntab[EFUNMAX]; int efxmax = 0; /* Largest function idx used */ int format_ver = PROF_VER; /* Current version # of binary profile fmt */ /* Keybind mapping tables. There are four separate tables: ** Simple character. Always 128 single-byte items, indexed by the simple ** command char. Each item is the corresponding function index. ** Meta char. Variable number of 2-byte items; first is a command char ** and second is its function index. ** Extended char. Same format as Meta char. ** Menu item (SUN only). Variable number of single-byte items, each ** a function index. ** */ char *chrptr; /* Pointer to simple-char table */ int chrsiz = 128; /* Current size of table */ int chrcnt = 0; /* # bytes actually used */ char *mtaptr; /* Pointer to meta-char table */ int mtasiz = KBTSIZ; /* Current size (twice the # of items) */ int mtacnt = 0; /* # bytes actually used */ char *extptr; /* Pointer to ext-char table */ int extsiz = KBTSIZ; /* Current size (twice the # of items) */ int extcnt = 0; /* # bytes actually used */ char *mnuptr; /* Pointer to menu-item table (SUN only) */ int mnusiz = KBTSIZ; /* Current size */ int mnucnt = 0; /* # bytes actually used */ #define CB_EXT 0400 /* "X-" prefix on command char */ #define CB_META 0200 /* "M-" prefix on command char */ /* Set up the pre-defined data areas. This includes the ** predefined function table plus the default profile (keyboard mappings). ** Note this only contains entries for ef_name and ef_adr. */ struct fun pdfuntab[] = { /* Pre-Defined Function table */ #define EFUN(rtn,rtnstr,name) 0, name, rtnstr, 0, #define EFUNHOLE 0, 0, 0, 0, #include "eefdef.h" }; int npdfuns = sizeof(pdfuntab)/sizeof(struct fun); /* # of entries */ #include "defprf.c" /* Insert default profile mapping */ /* This defines charmap, metamap, and extmap. */ /* Stuff for feeble-minded list processor */ #define NIL ((struct lnode *)0) #define LTRUE (<ruenode) #define LT_VAL 0 #define LT_STR 1 #define LT_LIST 2 #define LT_ATOM 3 /* Should use this later instead of LT_STR */ struct lnode { struct lnode *lnxt; int ltyp; union { int lvi; char *lvs; struct lnode *lvl; } lval; }; struct lnode ltruenode; /* Constant TRUE */ _PROTOTYPE(int main , (int argc , char **argv )); _PROTOTYPE(int doargs , (int argc , char **argv )); _PROTOTYPE(char **findkey , (char *cp , char ***aretp , char **tabp , int tabsiz , int elsize )); _PROTOTYPE(int nstrcmp , (char *s1 , char *s2 )); _PROTOTYPE(int ustrcmp , (char *s1 , char *s2 )); _PROTOTYPE(int strueq , (char *s1 , char *s2 )); _PROTOTYPE(int do_opcod , (void)); _PROTOTYPE(int do_opasc , (void)); _PROTOTYPE(int outkbind , (int c , int fx )); _PROTOTYPE(int do_obprof , (void)); _PROTOTYPE(int mupcase , (int ch )); _PROTOTYPE(int upcase , (int ch )); _PROTOTYPE(char *qstr , (char *str )); _PROTOTYPE(char *charep , (int c )); _PROTOTYPE(int do_ocnf , (char *str )); _PROTOTYPE(int do_ofcod , (void)); _PROTOTYPE(int do_ofasc , (void)); _PROTOTYPE(int do_ofxcod , (void)); _PROTOTYPE(int compile_stdin , (void)); _PROTOTYPE(int lrch , (void)); _PROTOTYPE(struct lnode *lread , (void)); _PROTOTYPE(int wspfls , (void)); _PROTOTYPE(struct lnode *lrstr , (int flg )); _PROTOTYPE(int islword , (int c )); _PROTOTYPE(struct lnode *eval , (struct lnode *lp )); _PROTOTYPE(struct lnode *undefall , (struct lnode *lp )); _PROTOTYPE(struct lnode *efun , (struct lnode *lp )); _PROTOTYPE(struct lnode *keybind , (struct lnode *lp )); _PROTOTYPE(struct lnode *keyallun , (void)); _PROTOTYPE(struct lnode *menuitem , (struct lnode *lp )); _PROTOTYPE(int repchar , (char *str )); _PROTOTYPE(struct lnode *getln , (void)); _PROTOTYPE(int numcvt , (char *str , int *anum )); _PROTOTYPE(int listcnt , (struct lnode *lp )); _PROTOTYPE(char *funname , (int i )); _PROTOTYPE(int findfun , (char *name )); _PROTOTYPE(int funcnt , (int *arr )); _PROTOTYPE(int scpy , (char *from , char *to , int cnt )); _PROTOTYPE(char *stripsp , (char *cp )); int warn(); int lerr(); int fatal(); /* ELLEC argument stuff */ char *argfile; char *outfile; int swfilter; /* If no args */ int swprof; /* -P */ int swelle; /* -E */ int uproflg; /* Do compilation of user's profile */ int swpcnf; /* Output defprf.c (C initialization of profile) */ int swfcnf; /* Output eefdef.h */ int swfxcnf; /* Output eefidx.h */ int swcmcnf; /* Output config makefile (makecf.fun) */ char *swcscnf; /* Output config specially (for V6) */ int swallc; /* Do all of config stuff */ int swfdmp; /* Output deffun.e */ int nfiles; /* # file specs seen */ main(argc,argv) int argc; char **argv; { register int i; register char *cp; char temp[300]; /* Initialize LTRUE ** (cannot portably initialize a union at compile time) */ ltruenode.ltyp = LT_VAL; /* Set type (other fields zero) */ /* Process switches */ if(argc <= 1) swfilter++; /* If no args, assume filter */ else doargs(argc,argv); /* Initialize function definitions and key bindings from predefs */ chrptr = malloc(chrsiz); mtaptr = malloc(mtasiz); extptr = malloc(extsiz); mnuptr = malloc(mnusiz); if (!chrptr || !mtaptr || !extptr || !mnuptr) fatal("cannot init, no memory"); scpy(charmap, chrptr, (chrcnt = sizeof(charmap))); scpy(metamap, mtaptr, (mtacnt = sizeof(metamap))); scpy( extmap, extptr, (extcnt = sizeof(extmap))); if(def_prof.menuvec) scpy(def_prof.menuvec, mnuptr, (mnucnt = def_prof.menuvcnt)); for(i = 0; i < npdfuns; ++i) /* Initialize function defs */ if(pdfuntab[i].ef_name) { efuntab[i].ef_idx = i; efuntab[i].ef_name = pdfuntab[i].ef_name; efuntab[i].ef_adr = stripsp(pdfuntab[i].ef_adr); if(efxmax < i) efxmax = i; } /* Routines expect input from stdin and output their results * to stdout. */ if(argfile) if(freopen(argfile,"r",stdin) == NULL) fatal("cannot open input file \"%s\"",argfile); if(outfile) if(freopen(outfile,"w",stdout) == NULL) fatal("cannot open output file \"%s\"",outfile); /* Chec|?~????????????????????????k for general compilation */ if(swfilter) { /* Not really implemented yet */ fatal("bad usage, see doc"); } /* Do profile hacking of some kind */ if(swprof || swelle) { if (compile_stdin()) /* Compile input profile */ { if(swprof) do_opasc(); /* Output ASCII profile (.e) */ else if(swelle) do_opcod(); /* Output bin profile (.b1) */ } exit(0); } /* Check for variousness */ if(swpcnf) { if(compile_stdin()) /* Compile input */ do_opcod(); /* Output the C initialization code */ exit(0); } if(swfxcnf) { if(compile_stdin()) /* Compile input */ do_ofxcod(); /* Output the eefidx.h code */ exit(0); } if(swfcnf) { if(compile_stdin()) /* Compile input */ do_ofcod(); /* Output the eefdef.h code */ exit(0); } if(swcmcnf || swcscnf) { if(compile_stdin()) /* Compile input */ do_ocnf(swcscnf); /* Output the makecf.fun code */ exit(0); } if(swfdmp) { if(compile_stdin()) /* Compile input */ do_ofasc(); /* Output the deffun.e code */ exit(0); } /* Hack user's profile */ if(!uproflg) exit(0); if(!argfile) { temp[0] = 0; #if !V6 if (cp = getenv("HOME")) strcat(temp, cp); #if !TOPS20 strcat(temp,"/"); #endif /*-TOPS20*/ #endif /*-V6*/ strcat(temp, EVPROFTEXTFILE); if(freopen(temp,"r",stdin) == NULL) fatal("cannot open profile \"%s\"",temp); } if(!outfile) { temp[0] = 0; #if !V6 if (cp = getenv("HOME")) strcat(temp, cp); #if !TOPS20 strcat(temp,"/"); #endif /*-TOPS20*/ #endif /*-V6*/ strcat(temp, EVPROFBINFILE); if(freopen(temp,"wb",stdout) == NULL /* Try binary 1st */ && freopen(temp,"w",stdout) == NULL) fatal("cannot open output profile \"%s\"",temp); } /* Hack user's profile */ if(compile_stdin()) /* Compile input profile */ do_obprof(); /* Output the binary */ } #define SW_FLG 0 #define SW_VAR 1 #define SW_STR 2 struct swarg { char *sw_name; long sw_type; int *sw_avar; char **sw_astr; } swtab[] = { "P", SW_FLG, &swprof, 0, /* Old stuff */ "E", SW_FLG, &swelle, 0, "Profile", SW_FLG, &uproflg, 0, "Pconf", SW_FLG, &swpcnf, 0, "Fconf", SW_FLG, &swfcnf, 0, "FXconf", SW_FLG, &swfxcnf, 0, "CMconf", SW_FLG, &swcmcnf, 0, "CSconf", SW_STR, 0, &swcscnf, "Allconf", SW_FLG, &swallc, 0, "Pdump", SW_FLG, &swprof, 0, "Fdump", SW_FLG, &swfdmp, 0 }; doargs(argc,argv) int argc; char **argv; { register int cnt, c; register char **av; register int i; register struct swarg *swp; struct swarg *swp2; int swerrs = 0; av = argv; cnt = argc; nfiles = 0; while(--cnt > 0) { ++av; if(*av[0] != '-') /* If not switch, */ { /* assume it's an input filename */ nfiles++; continue; } av[0]++; /* Try to look up switch in table */ swp = (struct swarg *)findkey(av[0], &swp2, swtab, (sizeof(swtab))/(sizeof(struct swarg)), (sizeof(struct swarg))/(sizeof(char *))); if(swp2) { fprintf(stderr,"ellec: ambiguous switch: -%s = %s or %s\n", av[0], swp->sw_name, swp2->sw_name); goto swdone; } if(swp) switch(swp->sw_type) { case SW_FLG: *(swp->sw_avar) = 1; goto swdone; case SW_VAR: *(swp->sw_avar) = 1; if(cnt <= 1) goto swdone; if(isdigit(*av[1])) { *(swp->sw_avar) = atoi(av[1]); --cnt; goto swargdone; } goto swdone; case SW_STR: if(cnt <= 1) goto swdone; *(swp->sw_astr) = av[1]; goto swargdone; default: fprintf(stderr,"ellec: bad switch type: %s\n", av[0]); swerrs++; } stop: fprintf(stderr,"ellec: bad switch: %s\n",*av); swerrs++; goto swdone; swargdone: av[0] = 0; av++; swdone: av[0] = 0; } if(swerrs) exit(1); /* Stop if any problems */ } char ** findkey(cp, aretp, tabp, tabsiz, elsize) register char *cp; char ***aretp; register char **tabp; int tabsiz, elsize; { register char **mp1, **mp2; register int i, res; *aretp = mp1 = mp2 = 0; for(i = 0; i < tabsiz; ++i, tabp += elsize) { if(res = ustrcmp(cp,*tabp)) { if(res > 0) return(tabp); if(!mp1) mp1 = tabp; else mp2 = tabp; } } if(mp2) *aretp = mp2; /* Ambiguous */ return(mp1); } /* NSTRCMP - New string compare. * Returns: * 2 if str2 > str1 (mismatch) * 1 if str2 counted out (str1 > str2) * 0 if full match * -1 if str1 counted out (str1 < str2) * -2 if str1 < str2 (mismatch) */ nstrcmp(s1,s2) register char *s1, *s2; { register int c, d; while(c = *s1++) { if(c != *s2) { if((d = upcase(c) - upcase(*s2)) != 0) return(*s2==0 ? 1 : (d > 0 ? 2 : -2)); } ++s2; } return(*s2 ? -1 : 0); } /* USTRCMP - uppercase string compare. * Returns 0 if mismatch, * 1 if full match, * -1 if str1 runs out first (partial match) */ ustrcmp(s1,s2) register char *s1, *s2; { register int c; if ( ! s1 || ! s2 ) return ( 0 ); /* Check for null ptr */ while(c = *s1++) { if(c != *s2) { if(((c ^ *s2) != 040) || (upcase(c) != upcase(*s2))) return(0); } s2++; } return(c == *s2 ? 1 : -1); } strueq(s1,s2) char *s1; char *s2; { return (ustrcmp(s1, s2) > 0 ? 1 : 0); } /* Output C initialization code for default profile (defprf.c) */ do_opcod() { register int i, c, f; printf("\ /* This file defines the initial data for ELLE's default user profile.\n\ ** It is automatically generated by ELLEC, and should not be edited.\n\ */\n\ char charmap[] = {\n"); for(i=0; i < chrcnt; i++) { printf("\t%2d,",(f = chrptr[i]&0377)); printf("\t/* (%3o) %3s",i,charep(i)); printf(" %s",funname(f)); printf(" */\n"); } printf("};\n char metamap[] = {\n"); for(i = 0; i < mtacnt; i += 2) { printf("\t0%-3o,%3d,",(c = mtaptr[i]&0377),(f = mtaptr[i+1]&0377)); printf("\t/* %4s",charep(c|CB_META)); printf(" %s",funname(f)); printf(" */\n"); } printf("};\n char extmap[] = {\n"); for(i = 0; i < extcnt; i += 2) { printf("\t0%-3o,%3d,",(c = extptr[i]&0377),(f = extptr[i+1]&0377)); printf("\t/* %4s",charep(c|CB_EXT)); printf(" %s",funname(f)); printf(" */\n"); } printf("};\n"); printf("struct profile def_prof = {\n"); printf(" %d, /* Ver */\n", format_ver); printf(" sizeof(charmap), charmap,\n"); printf(" sizeof(metamap)/2, metamap,\n"); printf(" sizeof(extmap)/2, extmap, \n"); printf(" 0, 0\n"); printf("};\n"); } /* Output ASCII version of default profile */ int oerrs; do_opasc() { register int i, c, f; oerrs = 0; printf("; ELLE default ASCII profile\n\n"); printf("(keyallunbind) ; To flush all existing bindings\n\n"); for(i=0; i < chrcnt; i++) outkbind(i, chrptr[i]&0377); printf("\n; Meta chars\n\n"); for(i = 0; i < mtacnt; i += 2) outkbind(CB_META | (mtaptr[i]&0377), mtaptr[i+1]&0377); printf("\n ; Extended commands\n\n"); for(i = 0; i < extcnt; i += 2) outkbind(CB_EXT | (extptr[i]&0377), extptr[i+1]&0377); printf("\n"); if(oerrs) fatal("%d errors encountered, check output file.", oerrs); } outkbind(c, fx) { if(fx == 0) /* Allow key to be mapped to nothing. */ return; if(fx <= 0 || fx > efxmax) printf(";INTERNAL ERROR: Bad function index %d for key %s\n", fx, charep(c)); else if(efuntab[fx].ef_name == NULL) printf(";INTERNAL ERROR: No name for function %d while mapping key %s\n", fx, charep(c)); else { printf("(keybind %s \"%s\")\n", qstr(charep(c)),efuntab[fx].ef_name); return; } oerrs++; } /* Output binary user profile */ do_obprof() { register unsigned int rp; /* Relative "pointer" */ struct stored_profile st_prof; rp = sizeof(st_prof); /* Initialize */ /* Fixed by Kochin Chang, July 1995 */ /* format version should be the first field in compiled profile */ prof_pack(st_prof.version, format_ver); prof_pack(st_prof.chrvec, rp); prof_pack(st_prof.chrvcnt, chrcnt); rp += chrcnt; prof_pack(st_prof.metavec, rp); prof_pack(st_prof.metavcnt, mtacnt/2); rp += mtacnt; prof_pack(st_prof.extvec, rp); prof_pack(st_prof.extvcnt, extcnt/2); rp += extcnt; prof_pack(st_prof.menuvec, rp); prof_pack(st_prof.menuvcnt, mnucnt); rp += mnucnt; fwrite((char *)&st_prof,sizeof(st_prof),1,stdout); fwrite(chrptr,sizeof(char),chrcnt,stdout); if(mtacnt) fwrite(mtaptr, sizeof(*mtaptr), mtacnt, stdout); if(extcnt) fwrite(extptr, sizeof(*extptr), extcnt, stdout); if(mnucnt) fwrite(mnuptr,sizeof(*mnuptr),mnucnt,stdout); } /* Return upper-case version of character */ mupcase(ch) register int ch; { return((ch&(~0177)) | upcase(ch)); } upcase (ch) { register int c; c = ch&0177; return((('a' <= c) && (c <= 'z')) ? (c - ('a'-'A')) : c); } char * qstr(str) register char *str; { register int c; static char qstrbuf[100]; register char *cp; cp = str; while((c = *cp++) && islword(c)); if(c == 0) return(str); /* No quoting needed */ cp = qstrbuf; *cp++ = '"'; while(*cp++ = c = *str++) if(c == '"') *cp++ = c; /* Double the quotes */ cp[-1] = '"'; *cp = 0; return(qstrbuf); } char * charep(c) register int c; { static char chrbuf[10]; register char *cp; cp = chrbuf; if(c&CB_EXT) { *cp++ = 'X'; *cp++ = '-'; c &= ~CB_EXT; } if(c&CB_META) { *cp++ = 'M'; *cp++ = '-'; c &= ~CB_META; } if(c <= 037) { *cp++ = '^'; c += 0100; } if(c == 0177) { *cp++ = 'D'; *cp++ = 'E'; *cp++ = 'L'; } else *cp++ = c; *cp = 0; return(chrbuf); } /* Output config Makefile (makecf.fun) * If argument is 0 (NULL), does Makefile type output. * Otherwise uses string for special-purpose output. */ do_ocnf(str) char *str; { register struct fun *fnp; register int i, mi; register char *cp; int fmtab[EFUNMAX]; int nfmods; char *modtab[EFUNMAX]; char *unknown = "unknown-module"; if(str == NULL) /* If not V6 version */ { printf("# Function module definition file, generated by ELLEC\n"); printf("FUN_OFILES = "); } nfmods = 0; funcnt(fmtab); /* Count function occs */ for(i = 1; i <= efxmax; ++i) { if(fmtab[i] == 0) continue; fnp = &efuntab[i]; if(fnp->ef_name == 0) fatal("internal error - no name for function %d", i); /* Got a function, store its module name if not a dup */ if ((cp = fnp->ef_mod) == NULL) /* Substitute if undef */ cp = unknown; for(mi=0; mi < nfmods; ++mi) if(ustrcmp(cp, modtab[mi]) > 0) break; if(mi < nfmods) continue; modtab[nfmods++] = cp; } /* Now have table of all modules used. Crunch them into output. */ for(mi=0; mi < nfmods; ++mi) if (modtab[mi] != unknown) { if(str != NULL) /* V6 version? */ printf("%s %s\n", str, modtab[mi]); else printf("\\\n\t%s.o", modtab[mi]); } printf("\n"); } /* Output eefdef.h */ do_ofcod() { register struct fun *fnp; register int i; char temp[40]; int fmtab[EFUNMAX]; printf("/* .H Function Definition file, generated by ELLEC */\n"); printf("/* 0 */ EFUNHOLE /* Always undefined */\n"); funcnt(fmtab); /* Count function occs */ for(i = 1; i <= efxmax ; ++i) { fnp = &efuntab[i]; printf("/* %3d */ ", i); if(fmtab[i] == 0 || fnp->ef_name == 0) printf("EFUNHOLE\n"); else { sprintf(temp, "\"%s\"", fnp->ef_adr); printf("EFUN( %-12s, %-14s, \"%s\")\n", fnp->ef_adr, temp, fnp->ef_name); } } } /* Output ascii version of function def file */ do_ofasc() { register struct fun *fnp; register int i; register char *fa, *fm; printf("; Master Function Definition file\n"); for(i = 1; i <= efxmax ; ++i) { fnp = &efuntab[i]; if(fnp->ef_idx == 0) /* No definition for this index? */ continue; if(fnp->ef_name == 0) { warn("internal error - no name for function %d", i); continue; } if ((fa = fnp->ef_adr) == NULL) fa = "unknown-addr"; if ((fm = fnp->ef_mod) == NULL) fm = "unknown-module"; printf("(efun %d \"%s\" %s %s)\n", fnp->ef_idx, fnp->ef_name, fa, fm); } } /* Output eefidx.h */ do_ofxcod() { register struct fun *fnp; register int i; register char *cp, *cp2; int fmtab[EFUNMAX]; char tmpstr[100]; printf("\ /* .H Function Index Definition file, generated by ELLEC */\n"); printf("\ /* FN_ defines Function Numbers (indices) for all known functions */\n"); printf("\ /* FX_ defines Function eXistence in this ELLE configuration */\n"); funcnt(fmtab); /* Count function occs */ for(i = 1; i <= efxmax ; ++i) { fnp = &efuntab[i]; if(fnp->ef_idx == 0) /* No definition for this index? */ continue; if(fnp->ef_adr == 0 || fnp->ef_name == 0) { warn("internal error - no addr/name for function %d", i); continue; } cp2 = fnp->ef_adr; cp = tmpstr; while(*cp++ = upcase(*cp2++)); cp = tmpstr; if((*cp++ != 'F') || (*cp++ != '_')) cp = tmpstr; /* Always define FN_ as index */ printf("#define FN_%-14s %3d /* %s */\n", cp, i, fnp->ef_name); /* Define FX_ as 0 if unused, else same as FN_ */ printf("#define FX_%-14s %3d\n", cp, (fmtab[i] == 0) ? 0 : i); /* 0 if unused */ } } /* Compile input! */ compile_stdin() { register struct lnode *lp; while((lp = lread()) != NIL) eval(lp); return(1); } #define MAXLINE 300 int llstch = -1; int leofflg; #define unlrch(c) llstch = c int lineno = 0; char linebuf[MAXLINE]; char *linecp = linebuf; lrch() { register int c; if((c = llstch) >= 0) { if(c == 0 && leofflg) return(EOF); llstch = -1; return(c); } if((c = getc(stdin)) == EOF) { leofflg = 1; llstch = 0; *linecp = 0; linecp = linebuf; return(c); } if(c == '\n') { lineno++; linecp = linebuf; } else *linecp++ = c; return(c); } struct lnode * lread() { register int c; register struct lnode *lp, *lp2; struct lnode *head; wspfls(); if((c = lrch())== EOF) return(NIL); if(c == ')') /* End of a list? */ return(NIL); if(c == '(') /* Start of a list? */ { head = lp = getln(); lp->ltyp = LT_LIST; if((head->lval.lvl = lp = lread()) == NIL) return(head); /* Return empty list */ while(lp2 = lread()) { lp->lnxt = lp2; lp = lp2; } return(head); } /* Atom of some kind */ if(c=='"') { return(lrstr(1)); } unlrch(c); return(lrstr(0)); } wspfls() { register int c; for(;;) { c = lrch(); if(isspace(c)) continue; if(c == ';') while((c = lrch()) != '\n') if(c == EOF) return; break; } if(c != EOF) unlrch(c); } #define LSMAX 300 /* Max # chars in atom string */ struct lnode * lrstr(flg) { char cbuf[LSMAX]; register char *cp; register int c, i; struct lnode *lp; cp = cbuf; i = 0; while((c = lrch()) != EOF) if (flg) switch(c) { case '"': if((c = lrch()) == EOF) return(NIL); if(c != '"') { unlrch(c); goto out; } default: ok: if(++i > LSMAX) break; *cp++ = c; continue; } else { if(islword(c)) goto ok; unlrch(c); break; } out: lp = getln(); lp->ltyp = LT_STR; lp->lval.lvs = malloc(i+1); *cp = 0; strcpy(lp->lval.lvs, cbuf); return(lp); } islword(c) { return((040 < c && c < 0177 && c != '(' && c !=')' && c != ';' && c != '"' && c != '\\') ? 1 : 0); } struct lnode *keybind(), *keyallun(), *menuitem(), *efun(), *undefall(); struct lfun { char *lfname; /* Name of list function */ struct lnode * (*lfrtn)(); /* Function address */ } lfntab[] = { "keybind", keybind, "efun", efun, "menuitem", menuitem, "keyallunbind", keyallun, /* "keyunbind", keyunbind, */ /* Not yet */ "undefall", undefall, /* "undef", undef, */ /* Not yet */ 0, 0 }; struct lnode * eval(lp) register struct lnode *lp; { register struct lnode *flp; register struct lfun *lfent; if(lp->ltyp != LT_LIST) return(lp); if((flp = lp->lval.lvl) == NIL) return(NIL); if(flp->ltyp != LT_STR) return(NIL); /* Look up list function and invoke it */ for(lfent = lfntab; lfent->lfname; lfent++) if(strueq(flp->lval.lvs, lfent->lfname)) return((*(lfent->lfrtn))(flp->lnxt)); lerr("unknown op: (%s)", flp->lval.lvs); return(NIL); } /* UNDEFALL - (undefall) ** Undefines all functions. Typically used to clear out ** predefined functions prior to compiling a set of new efuns. */ struct lnode * undefall(lp) register struct lnode *lp; { register int i; efxmax = 0; /* Say nothing in function def table! */ for(i = 0; i < EFUNMAX; ++i) { efuntab[i].ef_idx = 0; efuntab[i].ef_name = 0; efuntab[i].ef_adr = 0; efuntab[i].ef_mod = 0; } return(LTRUE); } /* EFUN - (efun
) ** Checks out the args and if no problems, stores the function ** definition in efuntab. */ struct lnode * efun(lp) register struct lnode *lp; { struct lnode *nlp; register int c, i; register struct fun *fnp; char *fname, *faddr, *fmod; int fni, num; if(listcnt(lp) < 4) { lerr("efun - not enough args"); return(NIL); } /* First thing should be function index */ switch(lp->ltyp) { case LT_VAL: fni = lp->lval.lvi; break; case LT_STR: if(numcvt(lp->lval.lvs, &num)) { fni = num; break; } default: lerr("efun - non-value function index"); return(NIL); } /* Next thing should be function name */ lp = lp->lnxt; if(lp->ltyp != LT_STR) /* Function name not a string */ { lerr("efun - non-string function name"); return(NIL); } fname = lp->lval.lvs; /* Next thing should be function addr */ lp = lp->lnxt; if(lp->ltyp != LT_STR) /* Function addr not a string */ { lerr("efun - non-string function addr"); return(NIL); } faddr = lp->lval.lvs; /* Next thing should be function module */ lp = lp->lnxt; if(lp->ltyp != LT_STR) /* Function module not a string */ { lerr("efun - non-string function module"); return(NIL); } fmod = lp->lval.lvs; /* Now see if already exists or anything */ if(fni <= 0 || fni > EFUNMAX) { lerr("efun - bad function index %d", fni); return(NIL); } fnp = &efuntab[fni]; if(fnp->ef_idx != 0) { if (fnp->ef_idx == fni && strueq(fnp->ef_name, fname) && strueq(fnp->ef_adr, faddr) && (fnp->ef_mod == NULL || strueq(fnp->ef_mod, fmod))) goto win; /* Benign redefinition */ lerr("efun - redefining function (%d \"%s\" %s %s)", fnp->ef_idx, fnp->ef_name, fnp->ef_adr, (fnp->ef_mod ? fnp->ef_mod : "unknown-module")); } for(i = 0; i < EFUNMAX; ++i) { if(efuntab[i].ef_idx == 0) continue; if(ustrcmp(efuntab[i].ef_adr,faddr) > 0 || ustrcmp(efuntab[i].ef_name, fname) > 0) { if(i == fni) continue; lerr("efun - name or address dup! \"%s\"", fname); return(NIL); } } /* No problems, store the function def in efuntab! */ win: fnp->ef_idx = fni; fnp->ef_mod = fmod; fnp->ef_adr = faddr; fnp->ef_name = fname; if(efxmax < fni) efxmax = fni; return(LTRUE); } /* KEYBIND - (keybind ) */ struct lnode * keybind(lp) register struct lnode *lp; { struct lnode *nlp; register int c, i; int fni; if(lp == NIL || (nlp = lp->lnxt)== NIL) return(NIL); switch(lp->ltyp) { case LT_VAL: c = lp->lval.lvi; break; case LT_LIST: return(NIL); case LT_STR: c = repchar(lp->lval.lvs); break; } if(c == -1) return(NIL); /* No such command char name */ lp = nlp; if(lp->ltyp != LT_STR) /* Function name not a string */ { lerr("(keybind) non-string function name"); return(NIL); } fni = findfun(lp->lval.lvs); if(fni == 0) /* No such function name */ { lerr("(keybind) no such function - \"%s\"", lp->lval.lvs); return(NIL); } if(c & CB_EXT) { c &= ~CB_EXT; /* Check for redefinition */ for(i = 0; i < extcnt; i += 2) if(c == (extptr[i]&0377)) /* Already there? */ { if((extptr[i+1]&0377) != fni) /* Yes, check fn */ lerr("(keybind) redefining X-%s as %d=\"%s\"", charep(c), fni, lp->lval.lvs); break; } if(i >= extcnt) /* Didn't find? */ { if(extcnt >= extsiz) { lerr("(keybind) too many X- commands"); return(NIL); /* Too many EXT cmds */ } i = extcnt; /* Increase size of table */ extcnt += 2; } /* Now store new binding */ extptr[i] = c; extptr[i+1] = fni; } else if(c&CB_META) { c &= ~CB_META; /* Check for redefinition */ for(i = 0; i < mtacnt; i += 2) if(c == (mtaptr[i]&0377)) /* Already there? */ { if((mtaptr[i+1]&0377) != fni) /* Yes, check fn */ lerr("(keybind) redefining M-%s as %d=\"%s\"", charep(c), fni, lp->lval.lvs); break; } if(i >= mtacnt) /* Didn't find? */ { if(mtacnt >= mtasiz) { lerr("(keybind) too many M- commands"); return(NIL); /* Too many META cmds */ } i = mtacnt; /* Increase size of table */ mtacnt += 2; } /* Now store new binding */ mtaptr[i] = c; mtaptr[i+1] = fni; } else { i = c & 0177; if (chrptr[i] && (chrptr[i]&0377) != fni) lerr("(keybind) redefining %s as %d=\"%s\"", charep(c), fni, lp->lval.lvs); chrptr[i] = fni; } return(LTRUE); } /* KEYALLUNBIND - (keyallunbind) */ struct lnode * keyallun() { register int i; register char *cp; /* fprintf(stderr, "ellec: clearing all key definitions\n"); */ for(i = 0, cp = chrptr; i < chrcnt; i++) *cp++ = 0; mtacnt = extcnt = mnucnt = 0; return(LTRUE); } /* MENUITEM - (menuitem ) */ struct lnode * menuitem(lp) register struct lnode *lp; { register int i, fni; if(lp == NIL) return(NIL); switch(lp->ltyp) { case LT_VAL: fni = lp->lval.lvi; break; case LT_LIST: return(NIL); case LT_STR: fni = findfun(lp->lval.lvs); break; } if(fni == 0) return(NIL); /* Bad val or no such function name */ for(i = 0; i < mnusiz; i++) if(fni == (mnuptr[i]&0377) || mnuptr[i] == 0) { mnuptr[i] = fni; mnucnt++; return(LTRUE); } return(NIL); /* Too many menu items */ } repchar(str) register char *str; { register int c; register int i, l; if (str == 0) return (-1); i = 0; l = strlen(str); c = (*str++)&0377; if(l == 0) return(-1); if(l == 1) return(c); /* One-char representation */ if(c == '^') if(l == 2) return((~0140) & mupcase(*str)); else return(-1); c = mupcase(c); if (*str == '-') { if(*++str == 0) return(-1); switch(c) { case 'X': return(CB_EXT | mupcase(repchar(str))); case 'M': return(CB_META | mupcase(repchar(str))); case 'C': return((~0140) & repchar(str)); } } if(c == 'S' && upcase(*str) == 'P' && l == 2) return(' '); if(c == 'D' && upcase(*str++) == 'E' && upcase(*str++) == 'L' && *str == 0) return(0177); return(-1); } struct lnode * getln() { return((struct lnode *)calloc(1,sizeof(struct lnode))); } numcvt(str, anum) char *str; int *anum; { register char *cp; register int i, c, sign; if((cp = str) == 0) return 0; i = sign = 0; if(*cp == '-') cp++, sign++; while(c = *cp++) if(!isdigit(c)) return(0); else i = 10*i + (c - '0'); *anum = sign ? -i : i; return(1); } listcnt(lp) register struct lnode *lp; { register int i; i = 0; while(lp) ++i, lp = lp->lnxt; return(i); } /* FUNNAME - Given function index, return function name. ** Always wins; returns "unknown" for bad indices. */ char * funname(i) register int i; { register char *cp = NULL; if(0 < i && i <= efxmax && (cp = efuntab[i].ef_name)) return cp; return("unknown function"); } findfun(name) register char *name; { register int i; if((i = efxmax) > 0) { do { if(strueq(name, efuntab[i].ef_name)) return(i); } while(--i); return(0); } return(0); } /* FUNCNT - Scan all key bindings, counting each occurrence of every ** function index. ** This is used to determine which functions are actually used. */ funcnt(arr) register int *arr; /* Pointer to array of EFUNMAX ints */ { register int i; for(i = 0; i < EFUNMAX; ++i) /* Clear the array */ arr[i] = 0; for(i = 0; i < chrcnt; ++i) /* Scan bindings */ arr[chrptr[i]&0377]++; for(i = 0; i < mtacnt; i += 2) arr[mtaptr[i+1]&0377]++; for(i = 0; i < extcnt; i += 2) arr[extptr[i+1]&0377]++; } scpy(from,to,cnt) register char *from,*to; register int cnt; { if(cnt > 0) do { *to++ = *from++; } while(--cnt); } /* STRIPSP - strip spaces from string. Returns ptr to start. */ char * stripsp(cp) register char *cp; { register char *ep, *lastp; while(*cp == ' ') ++cp; if (*cp) { ep = cp + strlen(cp); /* Point to null ending the str */ while (*--ep == ' '); *++ep = 0; /* Tie it off */ } return cp; } warn(str,a,b,c,d,e,f,g,h,i) char *str; { fprintf(stderr, "ellec: "); fprintf(stderr, str, a,b,c,d,e,f,g,h,i); fprintf(stderr, "\n"); } lerr(str,a,b,c,d,e,f,g,h,i) char *str; { warn(str, a,b,c,d,e,f,g,h,i); *linecp = 0; /* Tie off current line buffer */ fprintf(stderr, " Line %d: %s\n", lineno, linebuf); } fatal(str,a,b,c,d,e,f,g,h,i) char *str; { warn(str, a,b,c,d,e,f,g,h,i); exit(1); } /* SB - Copyright 1982 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. In all cases * the source code and any modifications thereto must remain * available to any user. * * This is part of the SB library package. * Any software using the SB library must likewise be made * quasi-public, with freely available sources. */ #ifdef COMMENT The initials "SB" stand for "String Block" or "String Buffer". SBBUFFER - A SB buffer containing a sbstring opened for editing. SBFILE - A structure holding file-specific information for all SDBLKs pointing to that file. SBSTRING - A SB string; conceptually a single string, but actually a linked list of SDBLKs. Unless opened by a SBBUFFER, only a few operations are allowed on SBSTRINGs (creating, copying, deleting). SDBLK - One of the linked nodes constituting a sbstring. Each SDBLK node points to a continuous string either in memory or on disk, or both. SBLK - Another name for SDBLK. SMBLK - An allocated chunk of memory. Also refers to the node structure maintained by the SBM memory management routines, which points to the actual chunk of memory. SBM - Name of the memory management package. SBM routines are used to allocate memory in general, and are not just for use by SB routines. ************ MACHINE DEPENDENT DEFINITIONS ********** The following compile time definitions represent machine dependent parameters which are intended mainly for use only by SBM and SBSTR routines. Other programs should use them with caution. Note that a great deal of code assumes that type "int" corresponds to a basic machine word (as per C Reference Manual). The current definitions will only work for machines which have 1, 2, 4, or 8 "char" bytes in a machine word. Any other size will require some changes to the definitions and possibly to some places using them. WORD - integer-type definition corresponding to machine word. WDSIZE - # addressable char bytes in a machine word. (1, 2, 4, 8) WDBITS - # low order bits in an address, ie log2(WDSIZE). (0, 1, 2, 3) WDMASK - Mask for low order bits of address (0, 1, 3, 7) CHAR_MASK - If defined, machine does sign-extension on chars, and they must be masked with this value. Note that the macro for WDBITS has no mathematical significance other than being an expression which happens to evaluate into the right constant for the 4 allowed values of WDSIZE, and in fact it is this crock which restricts WDSIZE! If C had a base 2 logarithm expression then any power of 2 could be used. Values for machines WORD WDSIZE WDBITS WDMASK PDP11, Z8000, I8086 int 2 1 01 VAX11, M68000, PDP10 int 4 2 03 #endif /* COMMENT */ /* First try to define a few things in a semi-portable way */ #include "eesite.h" #ifdef __STDC__ /* Implementation supports ANSI stuff? */ #include /* Get sizes for char stuff */ #define _SBMUCHAR 1 /* Can use "unsigned char" */ #define _SBMCHARSIGN (CHAR_MIN < 0) /* True if "char" is sign-extended */ #define CHAR_MASK (UCHAR_MAX) #else /* not ANSI */ #ifndef _SBMUCHAR /* Default assumes no "unsigned char" */ #define _SBMUCHAR 0 #endif #ifndef _SBMCHARSIGN /* Default assumes "char" is sign-extended */ #define _SBMCHARSIGN 1 #endif #ifndef CHAR_MASK /* Default assumes "char" is 8 bits */ #define CHAR_MASK 0377 #endif #endif /* not ANSI */ /* Define "sb_uchartoint" as a macro which ensures that an unsigned ** character value is converted properly to an int value. */ #if (_SBMUCHAR || (_SBMCHARSIGN==0)) #define sb_uchartoint(a) (a) /* No fear of sign extension */ #else #define sb_uchartoint(a) ((a)&CHAR_MASK) /* Bah, sign extension */ #endif /* Defs for machines with a base-2 WDSIZE. Yes, the (int) is indeed necessary * (to allow implicit conversion to long where needed - the PDP11 compiler * is known to lose without it, because sizeof is cast as "unsigned int" * which loses big in long masks!) */ #define WORD int #define WDSIZE ((int)(sizeof(WORD))) #define WDMASK (WDSIZE-1) #define WDBITS ((WDSIZE>>2)+(1&WDMASK)) #define rnddiv(a) ((a)>>WDBITS) /* # words, rounded down */ #define rndrem(a) ((a)&WDMASK) /* # bytes remaining past wd bndary */ #define rnddwn(a) ((a)&~WDMASK) /* Round down to word boundary */ #define rndup(a) rnddwn((a)+WDSIZE-1) /* Round up to word boundary */ #ifdef COMMENT /* The following are for machines without a base-2 WDSIZE */ #define rnddiv(a) ((a)/WDSIZE) #define rndrem(a) ((a)%WDSIZE) #define rnddwn(a) ((a)-rndrem(a)) #define rndup(a) rnddwn((a)+WDSIZE-1) #undef WDMASK /* These become meaningless and anything */ #undef WDBITS /* which uses them should be changed! */ #endif /* COMMENT */ /* The following 3 definitions are somewhat machine-dependent, * but are specifically intended for general use and work for all * currently known C implementations. * SBMO must be an integer-type object large enough to hold * the largest difference in SBMA pointers, and must not be * used in signed comparisons. */ typedef long chroff; /* CHROFF - Char offset in disk/sbstr */ typedef unsigned int SBMO; /* SBMO - Char offset in memory */ typedef #if _SBMUCHAR unsigned #endif char *SBMA; /* SBMA - Pointer to char loc in memory */ /* The following definitions tend to be system-dependent. Only the * SBM and SBSTR routines use them. */ #define SB_NFILES 32 /* # of open files we can hack. Actually * this is max FD value plus 1. */ #define SB_BUFSIZ 512 /* Optimal buffer size (system block size) */ #define SB_SLOP (16*WDSIZE) /* # slop chars to tolerate for allocations */ #define SMNODES (20) /* # SM or SD nodes to create when needed */ #define SMCHUNKSIZ (16*512) /* # bytes of mem to create (via sbrk) " " */ #define MAXSBMO ((SBMO)-1) /* Used in SBM only */ /* MAXSBMO should be the largest possible SBMO value. */ #define EOF (-1) #define SBFILE struct sbfile #define SBBUF struct sbbuffer #define SBSTR struct sdblk /* Start of a sbstring */ struct sbfile { int sfflags; /* Various flags */ int sffd; /* FD for file (-1 if none) */ struct sdblk *sfptr1; /* Ptr to 1st node in phys list */ chroff sflen; /* Original length of file FD is for */ }; /* Definition of SBBUF string/buffer */ struct sbbuffer { SBMA sbiop; /* I/O pointer into in-core text */ int sbrleft; /* # chars left for reading */ int sbwleft; /* # chars left for writing */ int sbflags; /* Various flags */ chroff sbdot; /* Logical pos for start of current sdblk */ chroff sboff; /* Offset into current sdblk (if no smblk)*/ struct sdblk *sbcur; /* Pointer to current SD block of string */ }; /* Flags for "sbflags" */ #define SB_OVW 01 /* Over-write mode */ #define SB_WRIT 02 /* Written; smuse needs to be updated from sbiop */ /* NOTE: An unused sbbuf structure should be completely zeroed. * This will cause routines to handle it properly * if they are accidentally pointed at it. */ /* Definition of SDBLK */ struct sdblk { struct sdblk *slforw; /* Logical sequence forward link */ struct sdblk *slback; /* Logical sequence backward link */ int sdflags; struct sdblk *sdforw; /* Physical sequence (disk) */ struct sdblk *sdback; /* ditto - backptr for easy flushing */ struct smblk *sdmem; /* Mem pointer, 0 if no in-core version */ SBFILE *sdfile; /* File pointer, 0 if no disk version */ chroff sdlen; /* # chars in disk text */ chroff sdaddr; /* Disk address of text */ }; /* Flags for "sdflags" */ #define SD_LOCK 0100000 /* Locked because opened by a SBBUF */ #define SD_LCK2 0040000 /* Locked for other reasons */ #define SD_MOD 0020000 /* Modified, mem blk is real stuff */ #define SD_NID 0323 /* Node ID marks active (not on freelist) */ #define SD_LOCKS (SD_LOCK|SD_LCK2) /* Note sdback is ONLY needed for fixing up phys list when a sdblk is * deleted (so as to find previous blk in phys list). Perhaps it shd * be flushed (ie only use SDFORW)? How to do deletions - use circular * list? Sigh. */ /* Definition of SMBLK (used by SBM routines) */ struct smblk { struct smblk *smforw; /* Li????nks to other mem blks, in phys order */ struct smblk *smback; int smflags; /* Type, in-use flags */ SBMA smaddr; /* Mem address of text */ SBMO smlen; /* # bytes in mem block */ SBMO smuse; /* # bytes "used" in block */ }; /* Flags for "smflags" */ #define SM_USE 0100000 /* Block is in use (mem free if off) */ #define SM_NXM 040000 /* Block mem is non-existent */ #define SM_EXT 020000 /* Block mem owned by external (non-SBM) rtn*/ #define SM_MNODS 010000 /* Block holds SMBLK nodes */ #define SM_DNODS 04000 /* Block holds SDBLK nodes */ #define SM_NID 0315 /* Node in-use identifier (low byte) */ /* Error handler type values */ #define SBMERR 0 /* Error in SBM package */ #define SBXERR 1 /* Error in SBSTR package */ #define SBFERR 2 /* "Error" - SBSTR package found a file overwritten. * Non-zero return will continue normally. */ /* Redefine certain external symbols to be unique in the first 6 chars ** to conform with ANSI requirements. */ #define sbm_nfre sbmnfre /* SBM stuff */ #define sbm_nfor sbmnfor #define sbm_nmov sbmnmov #define sbm_ngc sbmngc #define sbx_ndget sbxndg /* SBSTR stuff */ #define sbx_ndel sbxnde #define sbx_ndfre sbxndf #define sbx_sdcpy sbxsdc #define sbx_sdgc sbxsdg #define sbe_sdlist sbesls /* SBERR stuff */ #define sbe_sdtab sbestb #define sbe_sds sbesds #define sbe_sbvfy sbesbv #define sbe_sbs sbesbs /* Forward declarations */ extern SBMA sbm_lowaddr; /* For roundoff purposes */ extern SBFILE sbv_tf; /* SBFILE for temp swapout file */ extern int (*sbv_debug)(); /* Error handler address */ extern off_t lseek(); /* For sbstr code mostly */ extern char *mktemp(); extern char *malloc(); extern char *calloc(); extern SBBUF *sb_open(); extern SBSTR *sb_close(), *sb_fduse(), *sbs_cpy(), *sbs_app(), *sb_cpyn(), *sb_killn(); extern struct sdblk *sbx_ready(); extern chroff sb_tell(), sb_ztell(), sbs_len(); /* Definition of SB_GETC, SB_PUTC, SB_BACKC macros */ #define sb_putc(s,c) (--((s)->sbwleft) >= 0 ? \ (*(s)->sbiop++ = c) : sb_sputc(s,c)) #define sb_getc(s) (--((s)->sbrleft) >= 0 ? \ sb_uchartoint(*(s)->sbiop++) : sb_sgetc(s)) #define sb_peekc(s) ((s)->sbrleft > 0 ? \ sb_uchartoint(*(s)->sbiop) : sb_speekc(s)) /* WARNING - sb_backc must ONLY be used if last operation was a * successful sb_getc!! For slow but sure invocation use sb_rgetc. */ #define sb_backc(s) (++(s->sbrleft), --(s->sbiop)) #include "sbproto.h" /* function prototypes */ #include "sb.h" /* BCOPY(from,to,cnt) - Copy string of bytes. * Normally this routine is an assembly-language library routine, * but not all systems have it. Hence this C-language version * which tries to be fairly machine-independent. * Attempts to be clever about using word moves instead of byte moves. * Does not hack overlapping backward moves. */ bcopy(from, to, cnt) /* Copy count bytes from -> to */ register SBMA from; register SBMA to; register unsigned cnt; { if(!cnt) return; while(rndrem((int)from)) /* Get source aligned */ { *to++ = *from++; if(--cnt == 0) return; } if(rndrem((int)to) == 0) /* Do word move if dest now aligned */ { register unsigned tmp; tmp = cnt; if((cnt = rnddiv(cnt)) > 4) { sbm_wcpy((int *)from, (int *)to, cnt); if((cnt = rndrem(tmp)) == 0) return; /* No leftover bytes, all done */ tmp -= cnt; /* Ugh, must update pointers */ from += tmp; to += tmp; } else cnt = tmp; /* Not worth call overhead */ } do { *to++ = *from++; } /* Finish up with byte loop */ while(--cnt); } /* SBM_WCPY - word-move auxiliary routine. * This is a separate routine so that machines with only a few * registers have a chance to use them for the word copy loop. * This cannot be made part of BCOPY without doing some * unnecessary pointer conversions and using extra variables * (since most compilers will not accept type casts on lvalues, * which are needed to treat (char *) as (int *)). */ sbm_wcpy(from, to, cnt) register int *from, *to; register unsigned cnt; { if(cnt) do { *to++ = *from++; } while(--cnt); } /* SB - Copyright 1982 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. In all cases * the source code and any modifications thereto must remain * available to any user. * * This is part of the SB library package. * Any software using the SB library must likewise be made * quasi-public, with freely available sources. */ #define PRINT /* Include printout stuff */ #include "sb.h" #include extern struct smblk *sbm_nfl; extern struct smblk *sbm_list; extern struct sdblk *sbx_nfl; #ifdef PRINT #define PRF(stmt) {if(p) stmt;} #define PRFBUG(str,stmt) {if(p) stmt;else return(str);} #define PRFBAD(str,stmt) {if(p) stmt; return(str);} #else #define PRF(stmt) ; #define PRFBUG(str,stmt) return(str); #define PRFBAD(str,stmt) return(str); #endif #ifndef NPTRS #define NPTRS (1000) /* Catch loops of period less than this. */ #endif int sbe_dec = 0; /* Set nonzero to use decimal printout */ struct ptab { int pt_pflag; /* Printflag value */ char *pt_err; /* Error string return */ int pt_xerr; /* Error index return */ int pt_hidx; /* Highest freelist entry */ int pt_nsto; /* # entries stored in table */ int pt_cnt; /* # of entry store attempts */ struct smblk *pt_tab[NPTRS]; }; _PROTOTYPE( char *sbe_sdtab, (struct ptab *pt, int p, int phys) ); _PROTOTYPE( char *sbe_schk, (struct sdblk *sd, struct ptab *pt) ); _PROTOTYPE( int sbe_tbent, (struct ptab *pt, struct smblk *sm) ); #define PTF_PRF 01 /* Do printout stuff */ #define PTF_OVFERR 02 /* Complain if table overflows */ #define PTF_SDPHYS 04 /* Follow SD phys links (else logical links) */ struct flgt { int flg_bit; int flg_chr; }; _PROTOTYPE( char *sbe_fstr, (int flags, struct flgt *fp) ); char *sbe_mvfy(), *sbe_mfl(), *sbe_mlst(); /* SBM */ char *sbe_sbvfy(), *sbe_sbs(); /* SBBUF */ char *sbe_svfy(), *sbe_sdlist(), *sbe_sdtab(), *sbe_schk(); /* SD */ char *sbe_fstr(); /* Misc utility */ /* SBE_MEM() - Print out memory usage list */ sbe_mem() { printf("\nMemory Usage:\n"); printf("\tsbm_nfl : %6o\n",sbm_nfl); printf("\tsbm_list: %6o\n",sbm_list); printf("\tsmblk nodes are %o bytes long.\n",sizeof (struct smblk)); sbe_mlst(1); /* Scan mem list, printing stuff. */ } /* SBE_MVFY() - Verify memory allocation structures * Returns error message (0 if no errors found). */ char * sbe_mvfy() { register char *res; if((res = sbe_mfl(0)) || (res = sbe_mlst(0))) return(res); return(0); } /* SBM Debugging Routines */ struct flgt smflgtab[] = { SM_USE, 'U', SM_NXM, 'N', SM_EXT, 'E', SM_MNODS,'M', SM_DNODS,'D', 0,0 }; static char smfhelp[] = "U-Used, N-NXM, E-External, M-SMnodes, D-SDnodes"; static char smhdline[] = "\ SM: back smaddr smlen smuse smflags"; /* SBE_MFL(printflag) - Verify/Print memory freelist * Returns error message (0 if no errors found). */ char * sbe_mfl(p) int p; { register struct smblk *sm; register int i; struct ptab smtab; /* For loop detection */ PRF(printf("Tracing SM node freelist --\n")) PRF(printf(" Maximum loop detection size is %d.", NPTRS)) if((sm = sbm_nfl) == 0) { PRF(printf("\n\tNo list.\n")) return(0); /* Null freelist is ok */ } smtab.pt_pflag = p ? PTF_PRF : 0; smtab.pt_nsto = smtab.pt_cnt = 0; i = 0; /* Print 8 addrs/line */ for(; sm; sm = sm->smforw) { PRF(printf("%s%7o->", (i==0 ? "\n " : ""), sm)) if(++i >= 8) i = 0; if(sbe_tbent(&smtab, sm) < 0) /* If hit loop, stop */ PRFBAD("SM freelist loop", printf("\nLOOP - %o seen as node %d!!\n", sm, smtab.pt_xerr)) if(sm->smflags) { PRF((i = 0, printf("\nFreelist node has flags:\n"))) PRFBUG("Free SM flagged", sbe_smp(sm, 0)) } } PRF(printf("\nEnd - %d nodes on SM freelist.\n", smtab.pt_cnt)) return(0); } /* SBE_MLST(printflag) - Verify/Print allocated memory list. * Returns error message (0 if no errors found). */ char * sbe_mlst(p) int p; { register struct smblk *sm, *smf, *smb; char *nextaddr; int i; struct ptab smtab; /* For loop detection */ PRF(printf("Tracing mem list -- \n")) if((sm = sbm_list) == 0) { PRF(printf("\tNo list?!\n")) if(sbm_nfl) /* Ensure rest are 0 too */ return("No mem list?!!"); return(0); } smtab.pt_pflag = p; smtab.pt_cnt = smtab.pt_nsto = 0; smb = 0; PRF(printf(" Flags: %s\n%s\n", smfhelp, smhdline)) for(; sm; sm = smf) { PRF(printf(" %6o: ",sm)) if(sbe_tbent(&smtab, sm) < 0) PRFBAD("Loop in mem list!!", printf("LOOP - seen as node %d!!\n", smtab.pt_xerr)) if(sm->smback == smb) PRF(printf("^ ")) /* Back ptr OK */ else PRFBUG("Bad back ptr!", printf("%6o BAD Backptr!!\n\t ",sm->smback)) if((sm->smflags&0377)!= SM_NID) PRFBUG("SM: bad node ID", printf("BAD - no node ID!\n\t ")) PRF(printf((sm->smflags&SM_USE) ? " " : "FREE ")) if(sm->smlen == 0) PRFBUG("SM: len 0", printf("Zero-length area!")) if((sm->smflags&SM_USE)==0 && rndrem(sm->smaddr - sbm_lowaddr)) PRFBUG("Bad free-mem block", printf("Bad free-mem block")) PRF(sbe_smp(sm, 1)) /* Print out rest of info */ if(nextaddr != sm->smaddr && smtab.pt_cnt != 1) /* 1st time needs init */ { PRFBUG("Alignment error!", printf("\t BAD!! %6o expected; ",nextaddr)) #if !(MINIX) PRF((i = sm->smaddr - nextaddr) > 0 ? printf("%d skipped.\n",i) : printf("%d overlapped.\n",-i)) #endif } nextaddr = sm->smaddr + sm->smlen; smf = sm->smforw; smb = sm; /* Save ptr to back */ } PRF(printf("End = %6o\n",nextaddr)) return(0); } #ifdef PRINT sbe_smp(sm,type) register struct smblk *sm; int type; { if(type==0) printf(" %6o: %s ", sm, ((sm->smflags&SM_USE) ? " " : "FREE")); printf("%6o: ", sm->smaddr); printf((sbe_dec ? "%5d. %5d." : "%6o %6o"), sm->smlen, sm->smuse); printf(" %7o = %s\n", sm->smflags, sbe_fstr(sm->smflags, smflgtab)); } #endif /*PRINT*/ /* SD (SBSTR) debugging routines */ struct flgt sdflgtab[] = { SD_LOCK, 'L', SD_LCK2, 'T', SD_MOD, '*', 0,0 }; static char sdfhelp[] = "\ flags: *-MOD (disk outofdate), L-LOCK, T-LCK2 (temp)"; static char sdhdline[] = "\ SD: slforw slback sdflgs sdforw sdback sdmem sdfile sdaddr sdlen"; /* SBE_SFL(printflag) - Verify/Print SD freelist * Returns error message (0 if no errors found). */ char * sbe_sfl(p) int p; { register struct sdblk *sd; register int i; struct ptab sdtab; /* For loop detection */ PRF(printf("Tracing SDBLK node freelist --\n")) PRF(printf(" Maximum loop detection size is %d.", NPTRS)) if((sd = sbx_nfl) == 0) { PRF(printf("\n\tNo list.\n")) return(0); /* Null freelist is ok */ } sdtab.pt_pflag = p ? PTF_PRF : 0; sdtab.pt_nsto = sdtab.pt_cnt = 0; i = 0; /* Print 8 addrs/line */ for(; sd; sd = sd->slforw) { PRF(printf("%s%7o->", (i==0 ? "\n " : ""), sd)) if(++i >= 8) i = 0; if(sbe_tbent(&sdtab, sd) < 0) /* If hit loop, stop */ PRFBAD("SD freelist loop", printf("\nLOOP - %o seen as node %d!!", sd, sdtab.pt_xerr)) if(sd->sdflags) { PRF((i = 0, printf("\nFreelist node has flags:\n"))) PRFBUG("Free SD flagged", sbe_psd(sd)) } } PRF(printf("\nEnd - %d nodes on SD freelist.\n", sdtab.pt_cnt)) return(0); } /* SBE_SDS() - Print out all sdblk data stuff */ sbe_sds() { int sbe_psd(); printf("Printout of all in-use SDBLKs:\n"); printf(" %s\n", sdfhelp); printf("%s\n", sdhdline); sbm_nfor(SM_DNODS,sizeof(struct sdblk),sbe_psd,0); printf("\n"); } /* SBE_PSD - Auxiliary for invocation by SBE_SDS above. */ sbe_psd(sd) register struct sdblk *sd; { register int flags; flags = sd->sdflags; printf("%c%c%c", ((flags&SD_MOD) ? '*' : ' '), ((flags&SD_LOCK) ? 'L' : ' '), ((flags&SD_LCK2) ? 'T' : ' ')); printf(" %7o: %6o %6o %6o %6o %6o %6o %6o %7lo %5ld.\n", sd, sd->slforw, sd->slback, sd->sdflags, sd->sdforw, sd->sdback, sd->sdmem, sd->sdfile, sd->sdaddr, sd->sdlen); return(0); } /* SBE_SVFY() - Verify all SD blocks * Returns error message (0 if no errors found). */ char * sbe_svfy() { register char *res; return((res = sbe_sdlis???????????t(0,0)) ? res : sbe_sdlist(0,1)); } /* SBE_SDLIST(printflag, physflag) - Verify/Print all SD blocks. * Show logical lists if physflag 0 * Show physical lists otherwise * Returns error message (0 if no errors found). */ char * sbe_sdlist(p,phys) int p, phys; { register char *res; struct ptab sdtab; /* The SDLIST table to use */ /* First put freelist in table, then scan for all * SD nodes. Each active node (not in table) gets * its entire list traced forward/backward and added to table. */ if(res = sbe_sdtab(&sdtab, p, phys)) /* Set up freelist table */ return(res); /* Freelist entered in table, now scan all SD's */ res = (char *)sbm_nfor(SM_DNODS,sizeof(struct sdblk), sbe_schk, &sdtab); PRF(printf("\n")) return(res); } /* SBE_SDTAB(tableptr, printflag, physflag) - Auxiliary for SBE_SDLIST. * Stuffs all freelist SDBLK addresses in table for dup detection. * Returns error message (0 if no errors found). */ char * sbe_sdtab(pt, p, phys) register struct ptab *pt; int p, phys; { register struct sdblk *sd; register int res; pt->pt_pflag = (p ? PTF_PRF : 0) | (phys ? PTF_SDPHYS : 0) | PTF_OVFERR; pt->pt_cnt = pt->pt_nsto = 0; /* Initialize */ /* Stick freelist in table */ for(sd = sbx_nfl; sd; sd = sd->slforw) { if(sbe_tbent(pt, sd) < 0) { if(pt->pt_xerr < 0) PRFBAD("SD freelist too long", printf("SD freelist too long (%d)\n", NPTRS)) PRFBAD("SD freelist loop", printf("SD freelist loop at %o\n", pt->pt_xerr)) } if(sd->sdflags) { PRF(printf("Bad free SD, non-zero flag:\n")) PRFBUG("Free SD flagged", sbe_psd(sd)) } } pt->pt_hidx = pt->pt_nsto; /* Set idx of 1st non-FL entry */ return(0); } /* SBE_SCHK(SDptr, tableptr) - Auxiliary for SBE_SDLIST. * If SD not already in table, verifies or prints * the complete physical or logical list it's on, and enters all * of its SDs into table (to prevent doing it again). * Returns 0 if no errors, else error string. ** There is a problem when the table overflows. The tbent routine ** wants to add it (wrapping around at bottom) in that case, because ** that still helps detect loops. But this routine wants to reset ** the table back (after scanning to head of list) and once it starts ** scanning forward again it will fail, because some of the SDs are ** still in the table due to the wraparound! Thus PTF_OVFERR is always ** set, in order to at least give the right error message. */ char * sbe_schk(sd, pt) register struct sdblk *sd; struct ptab *pt; { register struct sdblk *sdx; register struct smblk *sm; struct sbfile *savfile; chroff lastaddr; int p, res, savidx, phys; phys = pt->pt_pflag&PTF_SDPHYS; /* Set up physflag */ if(phys && (sd->sdfile == 0)) /* Ignore non-phys stuff if phys */ return(0); p = pt->pt_pflag&PTF_PRF; /* Set up printflag */ savidx = pt->pt_nsto; /* Remember initial extent of table */ if(sbe_tbent(pt, sd) < 0) { if(pt->pt_xerr >= 0) /* OK if already in table */ return(0); PRFBAD("Too many SDs", printf("Too many SDs for table (%d)\n", NPTRS)) } /* Now search backward for start of list */ while(sdx = (phys ? sd->sdback : sd->slback)) if(sbe_tbent(pt,sdx) >= 0) sd = sdx; else break; if(sdx) { if(pt->pt_xerr < 0) /* Table error? */ PRFBAD("Too many SDs", printf("Too many SDs for table (%d)\n",NPTRS)) PRF(printf("Backlist loop!! Dup'd node:%s\n", (pt->pt_xerr < pt->pt_hidx) ? "(on freelist!)" : "" )) PRFBUG((phys ? "Phys SD loop" : "SD loop"), sbe_psd(sdx)) } /* Reset table to flush nodes backed over */ pt->pt_cnt = pt->pt_nsto = savidx; /* SD now points to start of list. Begin stepping thru list... */ PRF(printf("---- %sList started: ", (phys ? "Phys " : ""))) if(phys) { savfile = sd->sdfile; PRF(printf(" SF: %o, fd= %d, ln= %ld\n", savfile,savfile->sffd,savfile->sflen)) if(savfile->sfptr1 != sd) PRFBUG("SFPTR1 bad", printf(" BAD!! Sfptr1 %o doesn't match SD %o!!\n", savfile->sfptr1, sd)) lastaddr = 0; } else PRF(printf("\n")) PRF(printf("%s\n", sdhdline)) for(sdx = 0; sd; (sdx = sd, sd = (phys ? sd->sdforw : sd->slforw))) { PRF(sbe_psd(sd)) /* Print it out */ if(sdx != (phys ? sd->sdback : sd->slback)) { if(phys) PRFBUG("PSD bad sdback",printf("\tBad phys backptr\n")) else PRFBUG("SD bad slback",printf("\tBad backptr\n")) } if((sd->sdflags&0377) != SD_NID) PRFBUG("Bad SD node ID", printf("\tBad node ID!\n")) if(sd->sdfile && (sd->sdlen < 0 || sd->sdaddr < 0)) PRFBUG("SD: neg len/addr", printf("\tNeg disk len/addr\n")) if(phys) goto dophys; /* Do special stuff for logical list */ if(sm = sd->sdmem) { if((sm->smflags&0377) != SM_NID) PRFBUG("SD: bad SM", printf("\nBad SMBLK ptr\n")) if((sd->sdflags&SD_MOD)==0 && sd->sdlen != sm->smuse) PRFBUG("SD != SM", printf("\tBad SMBLK? Len conflict\n")) if(sm->smlen < sm->smuse) PRFBUG("SD: SM len < use", printf("\tBad SMBLK, len < use\n")) } goto doboth; /* Skip phys stuff */ /* Do special stuff for phys list */ dophys: if(sd->sdfile != savfile) PRFBUG("SD: bad sdfile", printf("\tBad sdfile ptr! Shd be %o\n", savfile)) if(sd->sdaddr < lastaddr) PRFBUG("SD addr out of order", printf("\tBad disk addr, not in order!\n")) lastaddr = sd->sdaddr; /* Done with special phys stuff */ doboth: if(sbe_tbent(pt, sd) < 0) { if(pt->pt_xerr < 0) PRFBAD("Too many SDs", printf("Too many SDs for table (%d)\n",NPTRS)) PRFBUG("SD loop", printf("\tLOOP!! This SD already seen%s.\n", (pt->pt_xerr < pt->pt_hidx) ? " (on freelist!)" : "" )) break; } } PRF(printf("-----------\n")) return(0); } /* SBE_DSK(SFptr) - Print out disk usage list for specific file */ sbe_dsk(sfp) SBFILE *sfp; { printf("SBFILE printout not coded: %o\n",sfp); } /* SBBUF structure debugging routines */ struct flgt sbflgtab[] = { SB_OVW, 'O', SB_WRIT,'W', 0,0 }; static char sbfhelp[] = "O-Overwrite, W-Write"; /* SBE_SBVFY(SBptr) - Verify a SB-string. * Returns error message (0 if no errors found). */ char * sbe_sbvfy(sbp) SBBUF *sbp; { return(sbe_sbs(sbp,0)); } /* SBE_SBS(SBptr, printflag) - Verify/Print SBSTR data stuff * Returns error message (0 if no errors found). */ char * sbe_sbs(sbp,p) SBBUF *sbp; int p; { register SBBUF *sb; register struct smblk *sm; register struct sdblk *sd; sb = sbp; PRF(printf("SBSTR %o: ",sb)) if(sb == 0) PRFBUG(0,printf("Zero pointer???\n")) /* First print out cryptic summary in case pointers bomb * out farther on. */ PRF(printf(" (io,cur,r,w,f,.,+ = %o,%o,%d,%d,%o,%lo,%lo)\n", sb->sbiop, sb->sbcur, sb->sbrleft, sb->sbwleft, sb->sbflags, sb->sbdot, sb->sboff)) PRF(printf(" sbflags %5o = %s (%s)\n", sb->sbflags, sbe_fstr(sb->sbflags,sbflgtab), sbfhelp)) if(sd = sb->sbcur) /* Okay, now try getting pointers */ sm = sd->sdmem; else sm = 0; PRF(printf(" sbcur %6o",sd)) if(sd) { PRF(printf("\n %s\n ", sdhdline)) PRF(sbe_psd(sd)) if((sd->sdflags&0377) != SD_NID) PRFBUG("SBCUR not SD?",printf(" BAD SDBLK ID!! \n")) if(sm) { PRF(printf(" %s\n ", smhdline)) PRF(sbe_smp(sm,0)) if((sm->smflags&0377) != SM_NID) PRFBUG("SBCUR has bad SM", printf(" BAD SMBLK ID!!\n")) } } PRF(printf(" sbiop %6o",sb->sbiop)) if(sb->sbiop) { if(!sm || sb->sbiop < sm->smaddr || sb->sbiop > (sm->smaddr + sm->smlen)) PRFBUG("Bad SBIOP", printf(" BAD")) } else if(sb->sbrleft > 0 || sb->sbwleft > 0) PRFBUG("Bad SBIOP/cnts", printf(" BAD")) PRF(printf("\n")) PRF(printf(" sbrleft %5o = %5d.",sb->sbrleft, sb->sbrleft)) if(sb->sbrleft && ( !sm || sb->sbwleft || (sb->sbflags&SB_WRIT) || (sb->sbrleft != (sm->smuse - (sb->sbiop - sm->smaddr))) )) PRFBUG("Bad sbrleft", printf(" BAD")) PRF(printf("\n")) PRF(printf(" sbwleft %5o = %5d.", sb->sbwleft, sb->sbwleft)) if(sb->sbwleft && ( !sm || (sb->sbflags&SB_WRIT) == 0 || (sb->sbwleft > (sm->smlen - (sb->sbiop - sm->smaddr))) )) PRFBUG("Bad sbwleft", printf(" BAD")) PRF(printf("\n")) PRF(printf(" sbdot %7lo = %7ld.", sb->sbdot, sb->sbdot)) if(sb->sbdot < 0) PRFBUG("Bad sbdot", printf(" BAD")) PRF(printf("\n sboff %7lo = %7ld.\n", sb->sboff, sb->sboff)) PRF(printf(" I/O ptr loc: %ld.\n\n", sb_tell(sb))) return(0); } /* SBE_TBENT() - Auxiliary to add and check entries to a pointer table. * Note we assume here that smblk ptrs are used, although sdblks * can also be hacked. This wins as long as the two kinds of ptrs * are basically identical (saves horrible casting problems). * Returns index # if successful (between 0 and NPTRS-1 inclusive). * Otherwise an error (-1), with relevant info in pt_xerr: * -1 if out of room and flag set making it an error * 0-n if entry already existed. */ sbe_tbent(pt, sm) register struct ptab *pt; struct smblk *sm; { register struct smblk **smt; register int i; int p; p = pt->pt_pflag&PTF_PRF; /* Set up print flag */ smt = &(pt->pt_tab[0]); if(i = pt->pt_nsto) { do { if(sm == *smt++) { pt->pt_xerr = pt->pt_nsto - i; return(-1); } } while(--i); --smt; } i = pt->pt_cnt++; if(++(pt->pt_nsto) > NPTRS) { if(pt->pt_pflag&PTF_OVFERR) { pt->pt_err = "Ptrtab overflow"; pt->pt_xerr = -1; return(-1); } pt->pt_nsto = NPTRS; i %= NPTRS; } pt->pt_tab[i] = sm; return(i); } /* SBE_FSTR(flags, flagtab) - Auxiliary to convert flag word to a string * and return pointer to it. Handy for printfs. */ char * sbe_fstr(flags, fp) register int flags; register struct flgt *fp; { static char retstr[17]; /* Max of 16 flags */ register char *cp; cp = retstr; for(; fp->flg_bit; ++fp) *cp++ = (fp->flg_bit&flags) ? fp->flg_chr : ' '; *cp = 0; return(retstr); } /* SB - Copyright 1982 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. In all cases * the source code and any modifications thereto must remain * available to any user. * * This is part of the SB library package. * Any software using the SB library must likewise be made * quasi-public, with freely available sources. */ #if 0 This file contains the low-level memory allocation subroutines which are used by the SBLK routines. The code here is quite machine-dependent, and the definitions in "sb.h" should be carefully checked to verify that they are correct for the target machine. The ultimate low-level routine is "sbrk()" which must be provided by the system''s C library. SBM expects that successive calls to sbrk() will return contiguous areas of memory with progressively higher addresses. Also, the very first call to sbrk() is assumed to return a word-aligned address. #endif /*COMMENT*/ #include "sb.h" #define FUDGE (sizeof(struct smblk)) /* Allow this much fudge in allocation, to prevent undue fragmentation */ char *(*sbm_debug)(); /* Debug switch - user-furnished routine */ struct smblk *sbm_nfl; /* Pointer to node freelist */ struct smblk *sbm_nxtra; /* Reserved extra free node */ struct smblk *sbm_list; /* Pointer to smblk memory alloc list. * ALL smblks are strung onto this list * except for the freelist! */ SBMA sbm_lowaddr; /* Lowest word-aligned address we know about.*/ /* If compiling with debug switch set, use special routine in place of * sbrk so we can pretend we have a very limited area of free memory. */ #ifdef DBG_SIZE #define SBM_SBRK sbm_brk char *sbm_brk(); #else #define SBM_SBRK sbrk #endif /*DBG_SIZE*/ /* Forward routine declarations */ char *sbrk(); struct smblk *sbm_nmak(), *sbm_nget(), *sbm_mget(), *sbm_split(); struct smblk *sbm_lmak(), *sbm_err(); /* SBM_INIT - Initialize storage management. * If args are zero, normal initialization is done. Otherwise, * args are understood to be pointers to an area of memory allocated * on the stack (eg by an "int mem[2000]" declaration in MAIN) and * initialization will include this area in addition to the * unused space between "_end" and the start of the stack segment. * This is mostly of use for PDP11s which would otherwise waste a lot * of address space. * Maybe should have a SBM_RESET() function? */ struct smblk * sbm_init(xaddr,xlen) SBMA xaddr; /* Address of allocated stack area if any */ SBMO xlen; /* Size of this area */ { register struct smblk *sm, *sml; register char *cp; /* Get initial chunk of memory from standard system rtn */ if((cp = SBM_SBRK(SMNODES*sizeof(struct smblk))) == 0 || (int) cp == -1) return(sbm_err(0,"Can't sbrk")); sm = (struct smblk *)cp; /* Better be word-aligned! */ sbm_lmak(sm,(SBMO)sizeof(struct smblk),SMNODES); /* Make list */ sbm_nfl = sm; /* Point freelist at it */ sbm_lowaddr = (SBMA)sm; /* Remember lowest addr seen */ /* Set up 1st node pointing to all memory from here on up. * We don't know exactly how much will be available at this point, * so we just pretend we have the maximum possible. */ sbm_list = sml = sbm_nget(); sml->smforw = sml->smback = 0; sml->smflags = SM_USE|SM_NID; /* Initial flags */ sml->smaddr = (SBMA) sml; sml->smlen = MAXSBMO; /* Pretend we have lots */ sml->smuse = (SMNODES * sizeof(struct smblk)); /* Now split off everything above initial allocation as NXM. */ sm = sbm_split(sml, sm->smuse); sml->smflags |= SM_MNODS; /* Mark 1st node as having SM nodes */ sm->smflags |= SM_NXM; /* Mark 2nd node as NXM */ /* Now possibly set up extra nodes, if stack mem is being allocated * (From our viewpoint it looks as if a chunk in the middle of * the initial NXM section has been declared usable) */ if(xlen) { /* Allow for "extra" static stack memory */ /* Will lose if xaddr <= 1st NXM! */ sml = sbm_split(sm, (SBMO)(xaddr - sm->smaddr)); sbm_split(sml, xlen); /* Split off following NXM */ sml->smflags &= ~(SM_USE|SM_NXM); /* This node is free mem! */ } /* Now set up a small additional node which points to the NXM * that we cannot get from SBRK. At this stage, this is just * a place-holder, to reserve the node so we don't have to * worry about running out of nodes at the same time sbrk stops * returning memory. * SM points to the NXM that we expect SBRK to dig into. */ sbm_split(sm, sm->smlen - WDSIZE); /* Chop off teensy bit */ sm->smflags &= ~SM_USE; /* Now mark NXM "free"!! */ /* Finally, reserve an "extra" SM node for use by sbm_nget * when it is allocating more freelist node chunks. */ sbm_nxtra = sbm_nget(); return(sbm_list); } /* SBM_NGET() - Get a free SM node. * Note the hair to provide a spare SM node when * we are allocating memory for more SM nodes. This is necessary * because sbm_mget and sbm_nget call each other recursively and * sbm_mget cannot create any new memory without a SM node to point * at the allocated chunk. */ struct smblk * sbm_nget() { register struct smblk *sm, *sml; if(!(sm = sbm_nfl)) /* Get a node from freelist */ { /* Freelist is empty, try to allocate more nodes. */ /* Put our "spare" smblk on freelist temporarily so that * sbm_mget has a chance of winning. * Infinite recursion is avoided by a test * in sbm_mget which checks sbm_nfl and sbm_nxtra. */ if(!(sm = sbm_nxtra)) return(sbm_err(0,"Zero sbm_nxtra!")); sm->smforw = 0; sbm_nfl = sm; sbm_nxtra = 0; /* Try to allocate another chunk of SM nodes. */ sml = sbm_nmak(sizeof(struct smblk),SM_MNODS); /* Put the new free nodes (if any) on freelist. * Done this way because freelist may have had one or two * nodes added to it by sbm_mget, so can't just stick * a new pointer in sbm_nfl. */ while(sm = sml) { sml = sm->smforw; sbm_nfre(sm); } /* Now reserve an extra node again. * It is an error if there is nothing on freelist here, * because even if sbm_mget failed the "extra node" should * still be on freelist. The check for a zero sbm_nxtra * above will catch such an error. */ sbm_nxtra = sbm_nget(); /* Now see if anything to return */ if(!(sm = sbm_nfl)) /* If freelist empty again, */ return(0); /* give up. */ } sbm_nfl = sm->smforw; /* If win, take it off freelist */ return(sm); /* Return ptr or 0 if none */ } /* SBM_NFRE(sm) - Return a SM node to the SM freelist. */ sbm_nfre(smp) struct smblk *smp; { register struct smblk *sm; (sm = smp)->smflags = 0; sm->smforw = sbm_nfl; sbm_nfl = sm; } /* SBM_NMAK(elsize, flag) - Make (allocate & build) a typeless node freelist. */ struct smblk * sbm_nmak(elsize, flag) SBMO elsize; unsigned flag; { register struct smblk *sm, *smp; register int cnt; if((sm = sbm_mget(SMNODES*elsize,SMNODES*elsize)) == 0) return(0); sm->smflags |= flag; /* Indicate type of nodes */ cnt = sm->smlen/elsize; /* Find # nodes that will fit */ sm->smuse = cnt * elsize; /* Actual size used */ smp = (struct smblk *)(sm->smaddr); /* Ptr to 1st loc of mem */ sbm_lmak(smp, (SBMO)elsize, cnt); /* Build freelist */ return(smp); /* Return 1st free node. Caller is */ /* responsible for setting freelist ptr. */ } /* SBM_LMAK - Build freelist of typeless nodes. * Note this does not allocate memory, it just converts an already * allocated memory area. */ struct smblk * sbm_lmak(addr, elsize, num) SBMA addr; SBMO elsize; int num; { register struct smblk *sm, *smp; register int cnt; smp = (struct smblk *) addr; if((cnt = num) <= 0) return(0); do { sm = smp; /* Save ptr */ sm->smforw = (smp = (struct smblk *) ((SBMA)smp + elsize)); sm->smflags = 0; } while(--cnt); sm->smforw = 0; /* Last node points to nothing */ return(sm); /* Return ptr to last node */ } /* SBM_NMOV(sm1, sm2, begp, elsize) - Move a typeless node. * Copy sm1 to sm2, adjust ptrs, leave sm1 free. */ sbm_nmov(smp1,smp2,begp,elsize) ????????????????????????struct smblk *smp1, *smp2, **begp; int elsize; { register struct smblk *sm; bcopy((SBMA)smp1,(SBMA)(sm = smp2), elsize); /* Copy the stuff */ if(sm->smforw) sm->smforw->smback = sm; /* Fix up links */ if(sm->smback) sm->smback->smforw = sm; else *begp = sm; } /* SBM_MGET(min,max) - Get a SMBLK with specified amount of memory. * Returns 0 if none available. * Memory is guaranteed to start on word boundary, but may not * end on one. Note that sbm_mfree is responsible for * ensuring that free mem starts word-aligned. * A subtle but major concern of this code is the number of freelist * nodes gobbled by a single call. If the freelist happens to not have * enough nodes, then a recursive call to sbm_mget is made (via sbm_nget) * in order to allocate a new batch of freelist nodes! sbm_nget will * always provide a single "spare" node during such an allocation, but * there is only one and it is essential that sbm_mget gobble only ONE * (if any) during such a call, which is indicated by sbm_nxtra==0. * The maximum # of freelist nodes that sbm_mget can gobble is * 2, when (1) NXM memory is obtained, and a SM is needed to point at * the new free mem, plus (2) the resulting SM is too big, and has to * be split up, which requires another SM for the remainder. * The "used-NXM" smblk is set up at init time precisely in order to * avoid the necessity of creating it here when sbrk stops winning, since * that would require yet another freelist node and make it possible for * sbm_mget to gobble 3 during one call -- too many. * Further note: the sbm_nfl checks are necessary in order * to ensure that a SM node is available for use by sbm_split. Otherwise * the calls to sbm_split might create a new SM freelist by gobbling the * very memory which we are hoping to return! */ SBMO sbm_chksiz = SMCHUNKSIZ; /* Current chunk size to feed sbrk */ struct smblk * sbm_mget(cmin,cmax) SBMO cmin,cmax; { register struct smblk *sm, *sml; register SBMO csiz; register SBMA addr, xaddr; if((sm = sbm_list) == 0 /* If never done, */ && (sm = sbm_init((SBMA)0,(SBMO)0)) == 0) /* initialize mem alloc stuff. */ return(0); /* Can't init??? */ /* Round up sizes to word boundary */ if(rndrem(cmin)) cmin = rndup(cmin); if(rndrem(cmax)) cmax = rndup(cmax); /* Search for a free block having enough memory. * If run into a free-NXM block, always "win", since there may be * a combination of preceding free-mem and new mem which will satisfy * the request. If it turns out this didn't work, we'll just fail * a little farther on. */ retry: csiz = cmin; /* Set size that will satisfy us */ do { if( ((sm->smflags&SM_USE) == 0) && ((sm->smlen >= csiz) || (sm->smflags&SM_NXM)) ) break; } while(sm = sm->smforw); if(sm == 0) return(0); /* Found none that minimum would fit */ if(sm->smflags&SM_NXM) { /* Found free area, but it's marked NXM and the system * must be persuaded (via sbrk) to let us use that portion * of our address space. Grab a good-sized chunk. */ if(sbm_nfl == 0) /* Verify a spare SM node is avail */ goto getnod; /* Nope, must get one. */ /* Decide amount of mem to ask system for, via sbrk. * The fine point here is the check of sbm_nxtra to make sure * that, when building more freelist nodes, we don't have * to use more than one SM node in the process. If we * asked for too much mem, we'd have to use a SM node * to hold the excess after splitting. */ csiz = cmax; if(sbm_nxtra /* If normal then try for big chunk */ && csiz < sbm_chksiz) csiz = sbm_chksiz; /* Max */ if (csiz > sm->smlen) csiz = sm->smlen; /* Min */ /* Get the NXM mem */ if((addr = (SBMA)SBM_SBRK(csiz)) != sm->smaddr) { /* Unexpected value returned from SBRK! */ if((int)addr != 0 && (int)addr != -1) { return(sbm_err(0,"SBRK %o != %o", addr, sm->smaddr)); #if 0 /* If value indicates couldn't get the stuff, then * we have probably hit our limit and the rest of * NXM should be declared "used" to prevent further * hopeless sbrk calls. We split off the portion * of NXM that is known for sure to be unavailable, * and mark it "used". If a "used NXM" area already * exists following this one, the two are merged. * The chunk size is then reduced by half, so * only log2(SMCHUNKSIZ) attempts will be made, and * we try again. */ /* If returned some mem which starts outside * the NXM then something is screwed up. */ if(addr < sm->smaddr || (addr >= sm->smaddr+sm->smlen)) return(sbm_err(0,"SBRK %o != %o", addr, sm->smaddr)); /* Got some mem, falls within NXM. * Presumably someone else has called sbrk * since last time, so we need to fence off * the intervening area. */ sm = sbm_split((sml=sm),(addr - sm->smaddr)); sml->smflags |= SM_USE|SM_EXT; return(sbm_mget(cmin,cmax)); #endif /*COMMENT*/ } /* Handle case of SBRK claiming no more memory. * Gobble as much as we can, and then turn this NXM * block into a free-mem block, and leave the * remainder in the used-NXM block (which should * immediately follow this free-NXM block!) */ if(!(sml = sm->smforw) /* Ensure have used-NXM blk */ || (sml->smflags&(SM_USE|SM_NXM)) != (SM_USE|SM_NXM)) return(sbm_err(0,"No uNXM node!")); xaddr = sm->smaddr; /* Use this for checking */ sm->smuse = 0; /* Use this for sum */ for(csiz = sm->smlen; csiz > 0;) { addr = SBM_SBRK(csiz); if((int)addr == 0 || (int)addr == -1) { csiz >>= 1; continue; } if(addr != xaddr) return(sbm_err(0,"SBRK %o != %o", addr, xaddr)); sm->smuse += csiz; xaddr += csiz; } /* Have gobbled as much from SBRK as we could. * Turn the free-NXM block into a free-mem block, * unless we got nothing, in which case just merge * it into the used-NXM block and continue * searching from this point. */ if(!(csiz = sm->smuse)) /* Get total added */ { sm->smflags = sml->smflags; /* Ugh. */ sbm_mmrg(sm); goto retry; /* Keep looking */ } else { sml->smaddr = sm->smaddr + csiz; sml->smlen += sm->smlen - csiz; sm->smlen = csiz; sm->smflags &= ~SM_NXM; /* No longer NXM */ } } /* Here when we've acquired CSIZ more memory from sbrk. * If preceding mem area is not in use, merge new mem * into it. */ if((sml = sm->smback) && (sml->smflags&(SM_USE|SM_NXM))==0) /* Previous free? */ { sml->smlen += csiz; /* Yes, simple! */ sm->smaddr += csiz; /* Fix up */ if((sm->smlen -= csiz) == 0) /* If no NXM left,*/ sbm_mmrg(sml); /* Merge NXM node w/prev */ sm = sml; /* Prev is now winning node */ } else { /* Prev node isn't a free area. Split up the NXM * node to account for acquired mem, unless we * gobbled all the mem available. */ if(sm->smlen > csiz /* Split unless all used */ && !sbm_split(sm,csiz)) /* Call shd always win */ return(sbm_err(0,"getsplit err: %o",sm)); sm->smflags &= ~SM_NXM; /* Node is now real mem */ } /* Now make a final check that we have enough memory. * This can fail because SBRK may not have been able * to gobble enough memory, either because (1) not * as much NXM was available as we thought, * or (2) we noticed the free-NXM area and immediately * gambled on trying it without checking any lengths. * In any case, we try again starting from the current SM * because there may be more free mem higher up (eg on * stack). */ if(sm->smlen < cmin) goto retry; } /* Check to see if node has too much mem. This is especially true * for memory just acquired via sbrk, which gobbles a huge chunk each * time. If there's too much, we split up the area. */ if(sm->smlen > cmax+FUDGE) /* Got too much? (Allow some fudge)*/ /* Yes, split up so don't gobble too much. */ if(sbm_nfl) /* If success guaranteed, */ sbm_split(sm,cmax); /* split it, all's well. */ else goto getnod; sm->smuse = 0; sm->smflags |= SM_USE; /* Finally seize it by marking "in-use". */ return(sm); /* Come here when we will need to get another SM node but the * SM freelist is empty. We have to forget about using the area * we just found, because sbm_nget may gobble it for the * freelist. So, we first force a refill of the freelist, and then * invoke ourselves again on what's left. */ getnod: if(sml = sbm_nget()) /* Try to build freelist */ { sbm_nfre(sml); /* Won, give node back, */ sm = sbm_list; /* and retry, starting over! */ goto retry; } /* Failed. Not enough memory for both this request * and one more block of SM nodes. Since such a SM_MNODS * block isn't very big, we are so close to the limits that it * isn't worth trying to do something fancy here to satisfy the * original request. So we just fail. */ return(0); } #ifdef DBG_SIZE /* Code for debugging stuff by imposing an artificial limitation on size * of available memory. */ SBMO sbm_dlim = MAXSBMO; /* Amount of mem to allow (default is max) */ char * sbm_brk(size) unsigned size; { register char *addr; if(size > sbm_dlim) return(0); addr = sbrk(size); if((int)addr == 0 || (int)addr == -1) return(0); sbm_dlim -= size; return(addr); } #endif /*DBG_SIZE*/ /* SBM_MFREE(sm) - Free up an allocated memory area. */ sbm_mfree(sm) register struct smblk *sm; { register struct smblk *smx; register SBMO crem; sm->smflags &= ~SM_USE; /* Say mem is free */ if((smx = sm->smback) /* Check preceding mem */ && (smx->smflags&(SM_USE|SM_NXM))==0) /* If it's free, */ sbm_mmrg(sm = smx); /* then merge 'em. */ if((smx = sm->smforw) /* Check following mem */ && (smx->smflags&(SM_USE|SM_NXM))==0) /* Again, if free, */ sbm_mmrg(sm); /* merge them. */ if(sm->smlen == 0) /* Just in case, chk for null blk */ { if(smx = sm->smback) /* If pred exists, */ sbm_mmrg(smx); /* merge quietly. */ else { sbm_list = sm->smforw; /* 1st node on list, so */ sbm_nfre(sm); /* simply flush it. */ } return; } /* This code is slightly over-general for some machines. * The pointer subtraction is done in order to get a valid integer * offset value regardless of the internal representation of a pointer. * We cannot reliably force alignment via casts; some C implementations * treat that as a no-op. */ if(crem = rndrem(sm->smaddr - sbm_lowaddr)) /* On word bndry? */ { /* No -- must adjust. All free mem blks MUST, by fiat, * start on word boundary. Here we fix things by * making the leftover bytes belong to the previous blk, * no matter what it is used for. Prev blk is guaranteed to * (1) Exist (this cannot be 1st blk since 1st is known to * start on wd boundary) and to be (2) Non-free (else it would * have been merged). */ if((smx = sm->smback) == 0) /* Get ptr to prev blk */ { sbm_err(0,"Align err"); /* Catch screws */ return; } crem = WDSIZE - crem; /* Find # bytes to flush */ if(crem >= sm->smlen) /* Make sure node has that many */ { sbm_mmrg(smx); /* Flush node to avoid zero length */ return; } smx->smlen += crem; /* Make stray bytes part of prev */ sm->smaddr += crem; /* And flush from current. */ sm->smlen -= crem; } } /* SBM_EXP - Expand (or shrink) size of an allocated memory chunk. * "nsize" is desired new size; may be larger or smaller than current * size. */ struct smblk * sbm_exp(sm,size) register struct smblk *sm; register SBMO size; { register struct smblk *smf; register SBMO mexp, pred, succ; if(sm->smlen >= size) /* Do we want truncation? */ goto realo2; /* Yup, go split block */ /* Block is expanding. */ mexp = size - sm->smlen; /* Get # bytes to expand by */ pred = succ = 0; if((smf = sm->smforw) /* See if free mem follows */ && (smf->smflags&(SM_USE|SM_NXM)) == 0) if((succ = smf->smlen) >= mexp) goto realo1; /* Quick stuff if succ OK */ if((smf = sm->smback) /* See if free mem precedes */ && (smf->smflags&(SM_USE|SM_NXM)) == 0) pred = smf->smlen; /* If not enough free space combined on both sides of this chunk, * we have to look for a completely new block. */ if(pred+succ < mexp) { if((smf = sbm_mget(size,size)) == 0) return(0); /* Couldn't find one */ else pred = 0; /* Won, indicate new block */ } /* OK, must copy either into new block or down into predecessor * (overlap is OK as long as bcopy moves 1st byte first) */ bcopy(sm->smaddr, smf->smaddr, sm->smlen); smf->smflags = sm->smflags; /* Copy extra attribs */ smf->smuse = sm->smuse; if(!pred) /* If invoked sbm_mget */ { sbm_mfree(sm); /* then must free up old area */ return(smf); /* and can return immediately. */ } sbm_mmrg(smf); /* Merge current into pred blk */ sm = smf; /* Now pred is current blk. */ if(succ) realo1: sbm_mmrg(sm); /* Merge succ into current blk */ realo2: if(sm->smlen > size /* If now have too much, */ && sbm_split(sm, size)) /* split up and possibly */ sbm_mfree(sm->smforw); /* free up unused space. */ return(sm); /* Note that sbm_split can fail if it can't get a free node, * which is only possible if we are reducing the size of an area. * If it fails, we just return anyway without truncating the area. */ } /* SBM_MMRG(sm) - Merge a memory area with the area following it. * The node (and memory area) following the SM pointed to are * merged in and the successor node freed up. The flags * and smuse of the current SM (which is not moved or anything) * remain the same. */ sbm_mmrg(smp) struct smblk *smp; { register struct smblk *sm, *sm2; sm = smp; sm->smlen += (sm2 = sm->smforw)->smlen; /* Add succ's len */ if(sm->smforw = sm2->smforw) /* and fix linkages */ sm->smforw->smback = sm; sbm_nfre(sm2); /* now can flush succ node */ } /* SBM_SPLIT - Split up an area (gets a new smblk to point to split-off * portion.) * Note returned value is ptr to 2nd smblk, since this is a new one. * Ptr to 1st remains valid since original smblk stays where it is. * NOTE: Beware of splitting up free mem (SM_USE == 0) since sbm_nget may * steal it out from under unless precautions are taken! See comments * at sbm_mget related to this. */ struct smblk * sbm_split(smp,coff) struct smblk *smp; SBMO coff; { register struct smblk *sm, *smx; register SBMO csiz; if((sm = smp)->smlen <= (csiz = coff)) return(0); if((smx = sbm_nget()) == 0) return(0); smx->smlen = sm->smlen - csiz; /* Set 2nd size */ smx->smaddr = sm->smaddr + csiz; /* Set 2nd addr */ sm->smlen = csiz; /* Take from 1st size */ smx->smflags = sm->smflags; /* Copy flags */ if(smx->smforw = sm->smforw) /* Splice 2nd after 1 */ smx->smforw->smback = smx; smx->smback = sm; sm->smforw = smx; /* Put 2nd into chain */ return(smx); /* Return ptr to 2nd smblk */ } #if 0 /* Replaced by "bcopy" for system-dep efficiency */ /* SBM_SCPY - Copy string of bytes. Somewhat machine-dependent; * Tries to be clever about using word moves instead of byte moves. */ sbm_scpy(from, to, count) /* Copy count bytes from -> to */ char *from, *to; unsigned count; { register char *s1, *s2; register unsigned cnt; int tmp; if((cnt = count) == 0) return; s1 = from; s2 = to; while(rndrem((int)s1)) /* Get 1st ptr aligned */ { *s2++ = *s1++; if(--cnt == 0) return; } if(rndrem((int)s2) == 0) /* Do wd move if ptr 2 now aligned */ { #ifdef DUMBPCC /* Code for dumber (Portable C type) compiler */ register WORD *ap, *bp; tmp = cnt; ap = (WORD *) s1; bp = (WORD *) s2; if(cnt = rnddiv(cnt)) do { *bp++ = *ap++; } while(--cnt); if ((cnt = rndrem(tmp)) ==0) return; s1 = (char *) ap; s2 = (char *) bp; #else /* Tight loop for efficient copying on 11s */ tmp = cnt; if(cnt = rnddiv(cnt)) do { *((WORD *)s2)++ = *((WORD *)s1)++; } while(--cnt); if((cnt = rndrem(tmp)) == 0) return; #endif /*-DUMBPCC*/ } do { *s2++ = *s1++; } /* Finish up with byte loop */ while(--cnt); } #endif /*COMMENT*/ struct smblk * /* If it returns at all, this is most common type */ sbm_err(val,str,a0,a1,a2,a3) char *str; struct smblk *val; { int *sptr; sptr = (int *) &sptr; /* Point to self on stack */ sptr += 5; /* Point to return addr */ if((int)sbm_debug==1) abort(); if(sbm_debug) (*sbm_debug)(0,*sptr,str,a0,a1,a2,a3); return(val); } /* These routines correspond to the V7 LIBC routines as described * in the V7 UPM (3). They should provide satisfactory emulation * if the documentation is correct. Replacement is necessary since * the SBM routines are jealous and cannot tolerate competition for * calls of SBRK; i.e. the memory being managed must be contiguous. */ /* Guaranteed to return word-aligned pointer to area of AT LEAST * requested size. Area size is rounded up to word boundary. */ char * malloc(size) unsigned size; { register struct smblk *sm, **sma; register SBMO siz; siz = rndup(size + sizeof (struct smblk *)); /* Make room for ptr */ if((sm = sbm_mget(siz,siz)) == 0) return(0); *(sma = (struct smblk **)sm->smaddr) = sm; /* Store ptr in addr-1 */ return((char *)++sma); } char * alloc(size) /* For V6 programs - note different failure value! */ unsigned size; { register char *addr; return((addr = malloc(size)) ? addr : (char *) -1); } free(ptr) char *ptr; { register struct smblk *sm, **smp; smp = &((struct smblk **)ptr)[-1]; /* Point to addr-1 */ sm = *smp; /* Pluck SM ptr therefrom */ if(((sm->smflags&0377) != SM_NID) || sm->smaddr != (SBMA)smp) return((int)sbm_err(0,"free: bad arg %o", ptr)); sbm_mfree(sm); return(1); } char * realloc(ptr,size) char *ptr; unsigned size; { register struct smblk *sm, **smp; smp = &((struct smblk **)ptr)[-1]; /* Point to addr-1 */ sm = *smp; /* Pluck SM ptr therefrom */ if(((sm->smflags&0377) != SM_NID) || (sm->smaddr != (SBMA)smp)) return((char *)sbm_err(0,"realloc: bad arg %o",ptr)); if((sm = sbm_exp(sm, rndup(size+(sizeof(struct smblk *))))) == 0) return(0); *(smp = (struct smblk **)sm->smaddr) = sm; /* Save smblk ptr */ return((char *)++smp); } char * calloc(nelem,elsize) unsigned nelem, elsize; { register SBMO cmin; register WORD *ip; /* Clear in units of words */ register char *addr; if((cmin = nelem*elsize) == 0 /* Find # bytes to get */ || (addr = malloc(cmin)) == 0) /* Get it */ return(0); ip = (WORD *) addr; /* Set up ptr to area */ cmin = rnddiv(cmin+WDSIZE-1); /* Find # words to clear */ do { *ip++ = 0; } while (--cmin); /* Zap the area */ return(addr); } /* SBM_NGC() - Specific routine for GC'ing SMBLK nodes. * * SBM_XNGC(begp, elsize, type) - Compact nodes of specified type. * Scans allocated mem from low to high to find chunks with nodes of * the specified type. * Flushes current freelist and rebuilds it as scan progresses, * such that 1st thing on list is lowest-addr node. When a node is * seen that can be moved, new node is acquired from freelist if * it exists, otherwise no move is made. If a chunk has been scanned * and no active nodes remain, it is flushed and freelist updated. * NOTE: This has not yet been verified to work with nodes of any * type other than SMBLK. */ sbm_ngc() { register struct smblk *sm; if(!(sm = sbm_nxtra)) return((int)sbm_err(0,"Zero sbm_nxtra")); sm->smflags |= SM_USE; /* Ensure this one isn't GC'd */ sbm_xngc(&sbm_nfl, sizeof(struct smblk), SM_MNODS); sm->smflags = 0; /* Flush temporary crock */ } sbm_xngc(begp, elsize, flag) struct smblk **begp; unsigned elsize, flag; { register struct smblk *sm, *chk, *smf; struct smblk *ftail, *savtail; int cnt, inuse; *begp = ftail = 0; /* Flush node freelist */ for(chk = sbm_list; chk; chk = chk->smforw) if(chk->smflags&flag) { sm = (struct smblk *) chk->smaddr; cnt = (chk->smuse)/elsize; savtail = ftail; inuse = 0; smf = *begp; /* Set up ptr to 1st freelist node */ while(--cnt >= 0) { /* Here decide if movable */ if(sm->smflags && smf /* Live and have copy place */ && ( (sm->smflags&SM_USE) == 0 /* Free mem? */ || (sm->smflags&(SM_MNODS|SM_DNODS)) ) && sm->smback) /* has backptr (see ncpy) */ { /* Move the node */ *begp = smf->smforw; /* Get free node */ if(smf == ftail) ftail = 0; if(smf == savtail) savtail = 0; /* Move node. Already checked for back ptr * of 0 since no obvious way to tell where * the ptr to list is kept. Sigh. */ sbm_nmov(sm,smf,(struct smblk **)0,elsize); /* Get ptr to new freelist node. Note * check to ensure that it is not in this * same chunk (if it is, no point in moving * any nodes!) */ if((smf = *begp) >= chk) smf = 0; /* Zero if same chk */ sm->smflags = 0; /* Make node free */ } /* At this point, not movable */ if(sm->smflags == 0) /* Free node? */ { if(ftail) /* Add to freelist */ ftail->smforw = sm; ftail = sm; if(*begp == 0) *begp = sm; sm->smforw = 0; } else inuse++; sm = (struct smblk *)((SBMA)sm + elsize); } if(inuse == 0 /* All free? */ && (sm = chk->smback)) /* & not 1st? */ { if(savtail) /* Edit freelist */ (ftail = savtail)->smforw = 0; else *begp = ftail = 0; sbm_mfree(chk); chk = sm; } } } /* * Note that proc must return a zero value, or loop aborts and * returns that selfsame value. */ sbm_nfor(flag,nodsiz,proc,arg) int flag; int (*proc)(); int nodsiz; struct sbfile *arg; { register struct smblk *sm, *np; register int cnt; int res; for(sm = sbm_list; sm; sm = sm->smforw) if(sm->smflags&flag) { np = (struct smblk *) sm->smaddr; cnt = sm->smuse/nodsiz; do { if(np->smflags) if(res = (*proc)(np,arg)) return(res); np = (struct smblk *)((SBMA)np + nodsiz); } while(--cnt); } return(0); } #ifndef _ANSI #include #endif /* sbbcpy.c */ _PROTOTYPE( int bcopy, (SBMA from, SBMA to, unsigned cnt) ); _PROTOTYPE( int sbm_wcpy, (int *from, int *to, unsigned cnt) ); /* sberr.c */ _PROTOTYPE( int sbe_mem, (void) ); _PROTOTYPE( char *sbe_mvfy, (void) ); _PROTOTYPE( char *sbe_mfl, (int p) ); _PROTOTYPE( char *sbe_mlst, (int p) ); _PROTOTYPE( int sbe_smp, (struct smblk *sm, int type) ); _PROTOTYPE( char *sbe_sfl, (int p) ); _PROTOTYPE( int sbe_sds, (void) ); _PROTOTYPE( int sbe_psd, (struct sdblk *sd) ); _PROTOTYPE( char *sbe_svfy, (void) ); _PROTOTYPE( char *sbe_sdlist, (int p, int phys) ); _PROTOTYPE( int sbe_dsk, (SBFILE *sfp) ); _PROTOTYPE( char *sbe_sbvfy, (SBBUF *sbp) ); _PROTOTYPE( char *sbe_sbs, (SBBUF *sbp, int p) ); /* sbm.c */ _PROTOTYPE( struct smblk *sbm_init, (SBMA xaddr, SBMO xlen) ); _PROTOTYPE( struct smblk *sbm_nget, (void) ); _PROTOTYPE( int sbm_nfre, (struct smblk *smp) ); _PROTOTYPE( struct smblk *sbm_nmak, (SBMO elsize, unsigned flag) ); _PROTOTYPE( struct smblk *sbm_lmak, (SBMA addr, SBMO elsize, int num) ); _PROTOTYPE( int sbm_nmov, (struct smblk *smp1, struct smblk *smp2, struct smblk **begp, int elsize) ); _PROTOTYPE( struct smblk *sbm_mget, (SBMO cmin, SBMO cmax) ); _PROTOTYPE( char *sbm_brk, (unsigned size) ); _PROTOTYPE( int sbm_mfree, (struct smblk *sm) ); _PROTOTYPE( struct smblk *sbm_exp, (struct smblk *sm, SBMO size) ); _PROTOTYPE( int sbm_mmrg, (struct smblk *smp) ); _PROTOTYPE( struct smblk *sbm_split, (struct smblk *smp, SBMO coff) ); _PROTOTYPE( int sbm_scpy, (char *from, char *to, unsigned count) ); #if 0 _PROTOTYPE( struct smblk *sbm_err, (struct smblk *val, char *str, int a0, int a1, int a2, int a3) ); #else struct smblk *sbm_err(); #endif _PROTOTYPE( char *malloc, (unsigned size) ); _PROTOTYPE( char *alloc, (unsigned size) ); _PROTOTYPE( int free, (char *ptr) ); _PROTOTYPE( char *realloc, (char *ptr, unsigned size) ); _PROTOTYPE( char *calloc, (unsigned nelem, unsigned elsize) ); _PROTOTYPE( int sbm_ngc, (void) ); _PROTOTYPE( int sbm_xngc, (struct smblk **begp, unsigned elsize, unsigned flag) ); _PROTOTYPE( int sbm_nfor, (int flag, int nodsiz, int (*proc )(), struct sbfile *arg) ); /* sbstr.c */ _PROTOTYPE( SBSTR *sb_close, (SBBUF *sbp) ); _PROTOTYPE( int sb_setovw, (SBBUF *sbp) ); _PROTOTYPE( int sb_clrovw, (SBBUF *sbp) ); _PROTOTYPE( chroff sbx_fdlen, (int fd) ); _PROTOTYPE( SBSTR *sb_fduse, (int ifd) ); _PROTOTYPE( int sb_fdcls, (int ifd) ); _PROTOTYPE( int sbx_fcls, (struct sbfile *sfp) ); _PROTOTYPE( int sb_fdinp, (SBBUF *sb, int fd) ); _PROTOTYPE( int sb_fsave, (SBBUF *sb, int fd) ); _PROTOTYPE( int sb_sgetc, (SBBUF *sb) ); _PROTOTYPE( int sb_sputc, (SBBUF *sb, int ch) ); _PROTOTYPE( int sb_speekc, (SBBUF *sb) ); _PROTOTYPE( int sb_rgetc, (SBBUF *sb) ); _PROTOTYPE( int sb_rdelc, (SBBUF *sbp) ); _PROTOTYPE( int sb_deln, (SBBUF *sbp, chroff num) ); _PROTOTYPE( struct sdblk *sb_killn, (SBBUF *sbp, chroff num) ); _PROTOTYPE( SBSTR *sb_cpyn, (SBBUF *sbp, chroff num) ); _PROTOTYPE( int sb_sins, (SBBUF *sbp, struct sdblk *sdp) ); _PROTOTYPE( SBSTR *sbs_cpy, (SBSTR *sdp) ); _PROTOTYPE( int sbs_del, (SBSTR *sdp) ); _PROTOTYPE( SBSTR *sbs_app, (struct sdblk *sdp, struct sdblk *sdp2) ); _PROTOTYPE( chroff sbs_len, (SBSTR *sdp) ); _PROTOTYPE( int sb_seek, (SBBUF *sbp, chroff coff, int flg) ); _PROTOTYPE( int sb_rewind, (SBBUF *sbp) ); _PROTOTYPE( chroff sb_tell, (SBBUF *sbp) ); _PROTOTYPE( chroff sb_ztell, (SBBUF *sbp) ); #if 0 _PROTOTYPE( struct sdblk *sbx_ready, (SBBUF *sbp, int type, SBMO cmin, SBMO cmax) ); #else struct sdblk *sbx_ready(); #endif _PROTOTYPE( struct sdblk *sbx_next, (SBBUF *sbp) ); _PROTOTYPE( struct sdblk *sbx_norm, (SBBUF *sbp, int mode) ); _PROTOTYPE( struct sdblk *sbx_beg, (struct sdblk *sdp) ); _PROTOTYPE( int sbx_smdisc, (SBBUF *sbp) ); _PROTOTYPE( int sbx_sbrdy, (SBBUF *sbp) ); _PROTOTYPE( struct sdblk *sbx_scpy, (struct sdblk *sdp, struct sdblk *sdlast) ); _PROTOTYPE( struct sdblk *sbx_sdcpy, (struct sdblk *sdp) ); _PROTOTYPE( struct sdblk *sbx_xcis, (SBBUF *sbp, chroff num, struct sdblk **asd2, chroff *adot) ); _PROTOTYPE( struct sdblk *sbx_split, (struct sdblk *sdp, chroff coff) ); _PROTOTYPE( struct smblk *sbx_msplit, (struct smblk *smp, SBMO size) ); _PROTOTYPE( struct sdblk *sbx_ndel, (struct sdblk *sdp) ); _PROTOTYPE( int sbx_npdel, (struct sdblk *sdp) ); _PROTOTYPE( struct sdblk *sbx_ndget, (void) ); _PROTOTYPE( int sbx_ndfre, (struct sdblk *sdp) ); _PROTOTYPE( SBMA sbx_malloc, (unsigned size) ); _PROTOTYPE( struct smblk *sbx_mget, (SBMO cmin, SBMO cmax) ); _PROTOTYPE( int sbx_comp, (int cmin, int lev) ); _PROTOTYPE( int sbx_sdgc, (struct sdblk *sdp, int lev) ); #if 0 _PROTOTYPE( int sbx_aout, (struct sdblk *sdp, int flag, int fd) ); #else int sbx_aout(); #endif _PROTOTYPE( chroff sbx_qlen, (struct sdblk *sdp) ); _PROTOTYPE( int sbx_tset, (chroff loff, int align) ); _PROTOTYPE( struct sdblk *sbx_ffnd, (SBFILE *sfp, chroff size, chroff *aloc) ); _PROTOTYPE( int sbx_rdf, (int fd, char *addr, int cnt, int skflg, chroff loc) ); _PROTOTYPE( int sbx_rugpull, (int fd) ); _PROTOTYPE( int sbx_unpur, (struct sdblk *sd, struct sbfile *sf) ); #if 0 _PROTOTYPE( int sbx_err, (int val, char *str, int a0, int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9, int a10, int a11, int a12) ); #else int sbx_err(); #endif /* sbvall.c */ _PROTOTYPE( char *valloc, (unsigned size) ); /* SB - Copyright 1982 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. In all cases * the source code and any modifications thereto must remain * available to any user. * * This is part of the SB library package. * Any software using the SB library must likewise be made * quasi-public, with freely available sources. */ #if 0 Todo stuff: New definitions: sbbuffer - old sbstr. Abbrev & struct "sbbuff". Macro SBBUFF (or SBBUF?) sbstring - list of sds. Abbrev sbstr. Macro SBSTR. Should *sbstr == *sdblk? Yeah. sbfile - as before. Macro SBFILE. (or SBFIL?) Try to get zero-length sdblks flushed on the fly, rather than waiting for moby GC. Also, need to set up compaction of SD freelist, as well as SM freelist. Make SM freelist compact self-invoked by SBM_MGET? Any need for phys disk ptrs other than for tempfile? Can do sbm_forn through SDblks to find active sdfiles so list isn''t needed for that. Can sdback be flushed? (not needed for keeping list sorted, or for searching it -- only used when linking blocks in or out of list.) Perhaps use circular list? If list only used for tmpfile, then to link in/out could always start from sfptr1 of tmpfile? Sure, but slow? Last SD on phys list could belong to no logical list, and denote free space on tmpfile? -------------------------- An "open" SBBUFFER will allow one to read, write, insert into, and delete from a sbstring (a logical character string). "Dot" refers to the current logical character position, which is where all operations must happen; sb_fseek must be used to change this location. There are several states that the I/O can be in: !SBCUR ----CLOSED---- All other elements, including SBIOP, should also be 0. Dot is 0. SBCUR && !SBIOP ----OPEN/IDLE---- SBCUR points to a SD block (its SDMEM may or may not exist) SBIOP==0 (otherwise it would be open/ready) Dot is SBDOT + SBOFF. R/Wleft must be 0. SBCUR && SBIOP ----OPEN/READY---- SBCUR points to a SDBLK (SDMEM must exist!) SBIOP exists. Dot is SBDOT + offset into SMBLK. SBOFF is ignored! SB_WRIT flag is set if "smuse" must be updated. The R/Wleft counts are set up: 1. Rleft 0, Wleft 0 -- Since SBIOP is set, must assume counts are too. So this means at end of text, no room left. Otherwise would imply that setup needs doing. 2. Rleft N, Wleft 0 -- At beg or middle of text 3. Rleft 0, Wleft N -- At end of text 4. Rleft N, Wleft N -- Shouldn''t ever happen Note that Rleft is always correct. Wleft is sometimes set 0 in order to force a call to determine real state. Note that SBIOP alone is a sufficient test for being OPEN/READY. The important thing about updating the smblk is to ensure that the "smuse" field is correct. This can only be changed by writing or deleting. We assume that deletions always update immediately, thus to determine if an update is necessary, see if SB_WRIT is set. If so, update smuse before doing anything but more writing!!!! The SDBLK must be marked "modified" whenever a write operation is done. We try to do this only the first time, by keeping Wleft zero until after the first write. This is also when SB_WRIT gets set. However, if in overwrite mode, Wleft must be kept zero in order to force the proper actions; SB_WRIT is also not turned on since smuse will not change. Note that at EOF, overwrite becomes the same thing as insert and is treated identically... If a SBLK has an in-core copy but no disk copy, it can be freely modified. Otherwise, modifications should preferably split the block so as to retain "pure" blocks as long as possible. "Pure" blocks can always have their in-core versions flushed immediately (unless for compaction purposes they''ll need to be written out in the same GC pass). Alternatively, mods can simply mark the disk copy "free" and go ahead as if no such copy existed. No additions or changes to a pure block are allowed, but deletions from the end or beginning are always allowed. All other changes must split or insert new blocks to accomplish the changes. Locking: SDBLKs are subject to unpredictable relocation, compaction, and garbage collecting. There are three ways in which a SDBLK can remain fixed: 1. The SDBLK has the SD_LOCK flag set. This flag is used whenever a SBBUF''s SBCUR is pointing to this SDBLK. 2. The SDBLK has the SD_LCK2 flag set. This flag is used only during execution of various internal routines and should not be seen anywhere during execution of user code. 3. The SDBLK has no back-pointer (is first block in a sbstring). Such SDBLKs cannot be relocated (since it is not known what may be pointing to them) but unlike the other 2 cases they are still subject to compaction with succeeding SDBLKs. The SDBLK must be locked with SD_LOCK for as long as it is being pointed to by SBCUR. The sole exception is when a SBBUF in the OPEN/IDLE state is pointing to the first SDBLK of a sbstring; this sdblk is guaranteed not to be moved, since sdblks without a back-pointer are never moved. SD_LOCK is asserted as soon as the state changes to OPEN/READY, of course. The internal routines take pains to always move SD_LOCK as appropriate. Note that only one SD in a sbstring can ever have SD_LOCK turned on. SD_LCK2 is an auxiliary flag which may appear in more than one SDBLK, for use by low-level routines for various temporary reasons; either will prevent the SDBLK from being modified in any way by the storage compactor. SEEKs are a problem because it''s unclear at seek time what will happen next, so the excision of the smblk can''t be optimized. If the seek happens to land in a sdblk with an existing smblk, there''s no problem; but if it''s a sdblk alone, how to decide which part of it to read in??? If next action is: write - split up sdblk and create new one. Read nothing in. read - read in 512 bytes starting at disk blk boundary if possible else read in 128 bytes starting with selected char (include beg of sdblk if less than 64 chars away) overwrite - as for read. backread - like read but position at end of sdblk. delete - split up sdblk, read nothing in. We solve this through the OPEN/IDLE state, where SBIOP == 0 means SBOFF points to logical offset from start of current sdblk, so that the seek need not take any action. Only when a specific operation is requested will the transition to OPEN/READY take place, at which time we''ll know what the optimal excision strategy is. The routine SBX_READY performs this function. The physical links (SDFORW and SDBACK) are only valid when SDFILE is set (likewise for SDLEN and SDADDR). In other words, mungs to a sdblk must check SDFILE to see whether or not the phys links should be altered. Normally they aren''t except during sdblk creation, deletion, or swapout, no matter how much the sdblk gets shuffled around logically. The disk physical list is kept sorted in order of starting addresses. The text blocks indicated can overlap. When a GC is necessary, the code must figure out how much space is actually free. -------------- Old woolgathering, ignore rest of this page --------------- Question: should 512-byte buffers be maintained, one for each SBFILE? Or should the in-core text be hacked up to serve for buffering? Question is where to point the READ/WRITE system calls. Currently, they are pointed directly at the in-core text, and there are no auxiliary buffers. If use auxiliary buffers: How to handle flushing, when changing location etc? Could be clever about reading from large disk block, only get part of it into buffer instead of splitting up in order to read a "whole" block. Problem: sbstrings can include pieces of several different files. Hard to maintain just one buffer per FD without hacking done on one sbstring screwing that on another. If don''t use buffers: Need to have a "chars-left" field in mem blocks, so know how much more can be added. Will need heuristics for how much extra space to allocate. #endif /*COMMENT*/ /???????????????????????????@@@@@@@@@ @ @ @ @ @@@@@@@@@@@@@@@@@@* Includes, initial definitions */ #include #include "sb.h" #ifndef V6 #define V6 0 #endif #if V6 #include #else #include #include #if MINIX #include /* For open() flags */ #else #include /* For open() flags */ #endif /* MINIX */ #endif /*-V6*/ extern int errno; extern char *strerror(); /* From ANSI */ /* Allocation decls */ SBFILE sbv_tf; /* SBFILE for temp swapout file */ int (*sbv_debug)(); /* Error handler address */ /* SBX_READY argument flags (internal to SBSTR routines only) * The following values should all be unique; the exact value * doesn't matter as long as the right SKM flags are given. */ #define SK_READF 0 /* 0-skip fwd, align BOB */ #define SK_READB (0|SKM_0BACK|SKM_EOB) /* 0-skip bkwd, align EOB */ #define SK_WRITEF (0|SKM_EOB) /* 0-skip fwd, align EOB */ #define SK_DELF (4|SKM_0BACK) /* 0-skip bkwd, align BOB */ #define SK_DELB (4|SKM_EOB) /* 0-skip fwd, align EOB */ #define SKM_0BACK 01 /* Zero-skip direction: 0 = fwd, set = backwd * Don't ever change this value! See SBX_NORM. */ #define SKM_EOB 02 /* Alignment: 0 = Beg-Of-Buf, set = End-Of-Buf */ /* Note on routine names: * "SB_" User callable, deals with sbbufs (usually). * "SBS_" User callable, deals with sbstrings only. * "SBX_" Internal routine, not meant for external use. * "SBM_" Routine handling mem alloc, usually user callable. */ /* SBBUF Opening, Closing, Mode setting */ /* SB_OPEN(sb,sd) - Sets up SBBUF given pointer to first SD of a sbstring. * If SD == 0 then creates null sbstring. * Any previous contents of SBBUF are totally ignored!!! If you * want to save the stuff, use SB_UNSET. * Sets I/O ptr to start of sbstring. * Returns 0 if error, else the given SB. */ SBBUF * sb_open(sbp,sdp) SBBUF *sbp; SBSTR *sdp; { register struct sdblk *sd; register int cnt; register WORD *clrp; if(!sbp) return((SBBUF *)0); if((sd = sdp) == 0) { sd = sbx_ndget(); /* Get a fresh node */ clrp = (WORD *) sd; /* Clear it all */ cnt = rnddiv(sizeof(struct sdblk)); do { *clrp++ = 0; } while(--cnt); sd->sdflags = SD_NID; /* Except flags of course */ } else if(sd->slback) /* Must be first thing in sbstring */ return((SBBUF *)0); /* Perhaps could normalize tho */ clrp = (WORD *) sbp; /* Clear sbbuffer stuff */ cnt = rnddiv(sizeof(SBBUF)); do { *clrp++ = 0; } while(--cnt); sbp->sbcur = sd; /* Note that SD_LOCK need not be set, because first SDBLK has no * backptr. This is desirable to allow storage compactor maximum * freedom in merging sdblks. */ /* sd->sdflags |= SD_LOCK; */ /* Lock this one */ return(sbp); } /* SB_CLOSE(sb) - Close a SBBUF. * Returns pointer to start of sbstring (first SD). * Returns 0 if error. */ SBSTR * sb_close(sbp) SBBUF *sbp; { register SBBUF *sb; register struct sdblk *sd; if((sb = sbp) == 0) /* Verify pointer */ return((SBSTR *)0); sb_rewind(sb); /* Do most of the work, including unlock */ sd = sb->sbcur; /* Save ptr to sbstring */ sb->sbcur = 0; /* Now reset the sbbuffer structure */ sb->sbflags = 0; return(sd); } /* SB_SETOVW(sbp) - Set SBBUF Over-write mode for PUTC's. * SB_CLROVW(sbp) - Clear ditto. */ sb_setovw(sbp) SBBUF *sbp; { register SBBUF *sb; if(sb=sbp) { sb->sbflags |= SB_OVW; sb->sbwleft = 0; } } sb_clrovw(sbp) SBBUF *sbp; { register SBBUF *sb; if(sb=sbp) sb->sbflags &= ~SB_OVW; } /* SBSTRING file system operations (see also sb_fsave) */ /* SB_FDUSE(fd) - Make a sbstring for given file. * FD is an open file descriptor. * Returns pointer to a SBSTR containing the given file, or 0 if error. * The FD must not be closed until a SB_FDCLS is done to * purge memory of any blocks pointing at the file. * ** Maybe allocate sbfile structs with sbx_ndget, i.e. overlay on * ** top of sdblk node?? Wd this screw verify, GC, etc? Maybe not if * ** SD_LCK2 set... */ struct sbfile *sbv_ftab[SB_NFILES]; chroff sbx_fdlen(fd) int fd; { #if !V6 struct stat statb; #else struct statb statb; chroff len; struct {int hiwd ; int lowd;} foo; #endif /*V6*/ if(fstat(fd,&statb) < 0) return((chroff)-1); #if V6 len = statb.i_size1; len.hiwd = statb.i_size0 & 0377; return(len); #else return((chroff)statb.st_size); #endif /*-V6*/ } SBSTR * sb_fduse(ifd) int ifd; { register struct sdblk *sd; register struct sbfile *sf; register int fd; chroff len; if((fd = ifd) < 0 || SB_NFILES <= fd /* Check for absurd FD */ || sbv_ftab[fd]) /* and slot already in use */ return((SBSTR *)0); if((len = sbx_fdlen(fd)) < 0) return((SBSTR *)0); sbv_ftab[fd]= sf = (struct sbfile *)sbx_malloc(sizeof(struct sbfile)); sf->sffd = fd; sf->sfptr1 = sd = sbx_ndget(); sf->sflen = len; sd->slforw = 0; sd->slback = 0; sd->sdforw = 0; sd->sdback = 0; sd->sdmem = 0; sd->sdfile = sf; sd->sdlen = len; sd->sdaddr = 0; return(sd); } /* SB_FDCLS(fd) - Close a file descriptor being used by sbstrings. * If arg is -1, closes all FD's that are unused (a "sweep"). * For specific arg, returns 0 if couldn't close FD because still in use. * Perhaps later version of routine could have option to copy * still-used SD's to tempfile, and force the FD closed? */ sb_fdcls(ifd) int ifd; { register int fd; if((fd = ifd) >= 0) { if(fd >= SB_NFILES) return(0); /* Error of sorts */ return(sbx_fcls(sbv_ftab[fd])); } fd = SB_NFILES-1; do { sbx_fcls(sbv_ftab[fd]); } while(--fd); /* Doesn't try FD 0 ! */ return(1); } sbx_fcls(sfp) struct sbfile *sfp; { register struct sbfile *sf; register int fd; if((sf = sfp)==0 /* Ignore null args */ || sf == &sbv_tf) /* and never close our tempfile! */ return(0); fd = sf->sffd; /* Find sys file descriptor */ if(sbv_ftab[fd] != sf) /* Ensure consistency */ return(sbx_err(0,"SF table inconsistency")); if(sf->sfptr1) /* Any phys list still exists? */ return(0); /* Yes, still in use, can't close */ close(fd); /* Maybe do this when list gone? */ sbv_ftab[fd] = 0; /* Remove from table */ free(sf); /* Remove sbfile struct from mem */ } /* SB_FDINP(sb,fd) - Returns TRUE if specified fd is still in use * by specified sbbuffer. */ sb_fdinp(sb, fd) register SBBUF *sb; int fd; { register struct sdblk *sd; register struct sbfile *sf; if((sf = sbv_ftab[fd]) == 0 || (sd = sb->sbcur) == 0) return(0); sd = sbx_beg(sd); /* Move to beginning of sbstring */ for(; sd; sd = sd->slforw) /* Scan thru all blocks in string */ if(sd->sdfile == sf) /* If any of them match, */ return(1); /* Return tally-ho */ return(0); } /* SB_FSAVE(sb,fd) - Write entire SBBUF out to specified FD. * Returns 0 if successful, else system call error number. */ sb_fsave(sb,fd) /* Write all of given sbbuf to given fd */ register SBBUF *sb; int fd; { sbx_smdisc(sb); return(sbx_aout(sbx_beg(sb->sbcur), 2, fd)); } /* SBBUF Character Operations */ /* SB_GETC(sb) - Get next char from sbstring. * Returns char at current location and advances I/O ptr. * Returns EOF on error or end-of-string. */ int sb_sgetc(sb) register SBBUF *sb; { if(--(sb->sbrleft) >= 0) return sb_uchartoint(*sb->sbiop++); /* Must do hard stuff -- check ptrs, get next blk */ sb->sbrleft = 0; /* Reset cnt to zero */ if(sb->sbcur == 0 /* Make sure sbbuffer there */ || (int)sbx_ready(sb,SK_READF,0,SB_BUFSIZ) <= 0) /* Normalize & gobble */ return(EOF); return(sb_sgetc(sb)); /* Try again */ } /* Loop wd be faster, but PDL OV will catch infinite-loop bugs */ /* SB_PUTC(sb,ch) - Put char into sbstring. * Inserts char at current location. * Returns EOF on error, else the char value. */ int sb_sputc(sb,ch) register SBBUF *sb; int ch; { register struct sdblk *sd; if(--(sb->sbwleft) >= 0) return(*sb->sbiop++ = ch); sb->sbwleft = 0; /* Reset cnt to avoid overflow */ if((sd = sb->sbcur) == 0) /* Verify string is there */ return(EOF); /* Could perhaps create it?? */ if(sb->sbflags&SB_OVW) /* If overwriting, handle std case */ { if(sb->sbiop && --sb->sbrleft >= 0) /* Use this for real count */ { sd->sdflags |= SD_MOD; /* Win, munging... */ return(*sb->sbiop++ = ch); } /* Overwriting and hit end of this block. */ if((int)sbx_ready(sb,SK_READF,0,SB_BUFSIZ) > 0) /* Re-normalize */ return(sb_sputc(sb,ch)); /* No blks left, fall through to insert stuff at end */ } /* Do canonical setup with heavy artillery */ if((int)sbx_ready(sb,SK_WRITEF,SB_SLOP,SB_BUFSIZ) <= 0) /* Get room */ return(EOF); /* Should never happen, but... */ sb->sbflags |= SB_WRIT; sb->sbcur->sdflags |= SD_MOD; return(sb_sputc(sb,ch)); /* Try again */ } /* Loop wd be faster, but PDL OV will catch infinite-loop bugs */ /* SB_PEEKC(sb) - Peek at next char from sbstring. * Returns char that sb_getc would next return, but without * changing I/O ptr. * Returns EOF on error or end-of-string. */ int sb_speekc(sb) register SBBUF *sb; { if (sb->sbrleft <= 0) /* See if OK to read */ { if (sb_sgetc(sb) == EOF) /* No, try hard to get next */ return EOF; /* Failed, return EOF */ sb_backc(sb); /* Won, back up */ } return sb_uchartoint(*sb->sbiop); } /* SB_RGETC(sb) - Get previous char from sbstring. * Returns char prior to current location and backs up I/O ptr. * Returns EOF on error or beginning-of-string. */ int sb_rgetc(sb) register SBBUF *sb; { register struct smblk *sm; register struct sdblk *sd; if((sd=sb->sbcur) && (sm = sd->sdmem) && sb->sbiop > sm->smaddr) { if(sb->sbflags&SB_WRIT) { sm->smuse = sb->sbiop - sm->smaddr; sb->sbwleft = 0; sb->sbflags &= ~SB_WRIT; } sb->sbrleft++; return sb_uchartoint(*--sb->sbiop); /* Return char */ } if((int)sbx_ready(sb,SK_READB,SB_BUFSIZ,0) <= 0) return(EOF); return(sb_rgetc(sb)); } /* SB_RDELC(sb) - Delete backwards one char. * Returns nothing. */ sb_rdelc(sbp) SBBUF *sbp; { register SBBUF *sb; register struct sdblk *sd; if(((sb=sbp)->sbflags&SB_WRIT) /* Handle simple case fast */ && sb->sbiop > (sd = sb->sbcur)->sdmem->smaddr) { sb->sbwleft++; sb->sbiop--; sd->sdflags |= SD_MOD; return; } else sb_deln(sb,(chroff) -1); /* Else punt... */ } /* SB_DELC(sb) - Delete one char forward? */ /* SB_INSC(sb,ch) - Insert char? (instead of or in addition to PUTC) */ /* SBBUF string or N-char operations */ /* SB_DELN(sb,chroff) - delete N chars. Negative N means backwards. * Differs from sb_killn in that it flushes the text forever, * and doesn't return anything. */ sb_deln(sbp, num) SBBUF *sbp; chroff num; { register struct sdblk *sd; if(sd = sb_killn(sbp,num)) sbs_del(sd); /* Punt */ } /* SB_KILLN(sb,chroff) - delete N chars, saving. Negative N means backwards. * Returns SD pointer to beginning of saved sbstring. */ struct sdblk * sb_killn(sbp, num) SBBUF *sbp; chroff num; { register SBBUF *sb; register struct sdblk *sd, *sd2; struct sdblk *sdr, *sdx; chroff savdot; if((sd = sbx_xcis((sb=sbp),num,&sdr,&savdot)) == 0) return((struct sdblk *)0); sb->sbcur->sdflags &= ~SD_LOCK; /* Now can flush sbcur lock */ /* SD and SD2 now delimit bounds of stuff to excise. * First do direction dependent fixups */ if(num >= 0) /* If deleting forward, */ sb->sbdot = savdot; /* must reset dot to initial loc */ /* SD and SD2 now in first/last order. Complete SBCUR fixup. */ sd2 = sdr; /* sdr has ptr to end of stuff */ if(sd2 = sd2->slforw) /* More stuff after killed list? */ { sb->sbcur = sd2; /* Yes, point at it */ sb->sboff = 0; /* Dot already set right */ } else if(sdx = sd->slback) /* See if any prior to killed list */ { sb->sbcur = sdx; /* Yes, point at it */ sb->sboff = (sdx->sdmem ? /* Get len of prev blk */ sdx->sdmem->smuse : sdx->sdlen); sb->sbdot -= sb->sboff; } else sb_open(sb,(SBSTR *)0); /* No stuff left! Create null sbstring */ /* Fix up logical links. Note SD2 points to succ of killed stuff */ if(sd->slback) /* If previous exists */ { if(sd->slback->slforw = sd2) /* Point it to succ, and */ sd2->slback = sd->slback; /* thence to self */ sd->slback = 0; /* Now init killed list */ } else if(sd2) sd2->slback = 0; /* No prev, clean rest */ (sd2 = sdr)->slforw = 0; /* Finish killed list */ sb->sbcur->sdflags |= SD_LOCK; /* Ensure current SD now locked */ sd->sdflags &= ~SD_LCK2; /* And unlock killed list */ sd2->sdflags &= ~SD_LCK2; return(sd); } /* SB_CPYN(sbp,num) - Copy num characters, returns SD to sbstring. * Like SB_KILLN but doesn't take chars out of original sbstring. */ SBSTR * sb_cpyn(sbp,num) SBBUF *sbp; chroff num; { register SBBUF *sb; register struct sdblk *sd, *sd2; struct sdblk *sdr; chroff savloc; sb = sbp; if((sd = sbx_xcis(sb,num,&sdr,&savloc)) == 0) return((SBSTR *)0); sd2 = sbx_scpy(sd,sdr); sb_seek(sb,-num,1); /* Return to original loc */ return(sd2); /* Return val is ptr to head of copy. * It needn't be locked, because GC will * never move list heads! */ } /* SB_SINS(sb,sd) - Insert sbstring at current location * */ sb_sins(sbp,sdp) SBBUF *sbp; struct sdblk *sdp; { register SBBUF *sb; register struct sdblk *sd, *sdx; chroff inslen; if((sb = sbp)==0 || (sd = sdp) == 0) return(0); if(sd->slback) /* Perhaps normalize to beg? */ return(0); if((sdx = (struct sdblk *)sbx_ready(sb,SK_DELB)) == 0) /* Get cur pos ready */ return(0); inslen = sbs_len(sd); /* Save length of inserted stuff */ sd->slback = sdx; /* Fix up links */ if(sdx->slforw) { while(sd->slforw) /* Hunt for end of inserted sbstring */ sd = sd->slforw; sd->slforw = sdx->slforw; sd->slforw->slback = sd; } sdx->slforw = sdp; sb->sboff += inslen; /* Set IO ptr to end of new stuff */ return(1); } /* SBSTRING routines - operate on "bare" sbstrings. */ /* SBS_CPY(sd) - Copies given sbstring, returns ptr to new sbstring. */ SBSTR * sbs_cpy(sdp) SBSTR *sdp; { return(sbx_scpy(sdp,(struct sdblk *)0)); } /* SBS_DEL(sd) - Flush a sbstring. */ sbs_del(sdp) SBSTR *sdp; { register struct sdblk *sd; if(sd = sdp) while(sd = sbx_ndel(sd)); } /* SBS_APP(sd1,sd2) - Appends sbstring sd2 at end of sbstring sd1. * Returns sd1 (pointer to new sbstring). */ SBSTR * sbs_app(sdp,sdp2) struct sdblk *sdp,*sdp2; { register struct sdblk *sd, *sdx; if(sd = sdp) { while(sdx = sd->slforw) sd = sdx; if(sd->slforw = sdx = sdp2) sdx->slback = sd; } return(sdp); } /* SBS_LEN(sd) - Find length of sbstring. */ chroff sbs_len(sdp) SBSTR *sdp; { register struct sdblk *sd; register struct smblk *sm; chroff len; if((sd = sdp)==0) return((chroff)0); len = 0; for(; sd ; sd = sd->slforw) { if(sm = sd->sdmem) len += (chroff)sm->smuse; else len += sd->sdlen; } return(len); } /* SBBUF I/O pointer ("dot") routines */ /* SB_SEEK(sb,chroff,flag) - Like FSEEK. Changes I/O ptr value as * indicated by "flag": * 0 - offset from beg * 1 - offset from current pos * 2 - offset from EOF * Returns -1 on errors. * Seeking beyond beginning or end of sbbuf will leave pointer * at the beginning or end respectively. * Returns 0 unless error (then returns -1). */ sb_seek(sbp, coff, flg) SBBUF *sbp; chroff coff; int flg; { register SBBUF *sb; register struct smblk *sm; register struct sdblk *sd; SBMO moff; sb = sbp; if((sd = sb->sbcur) == 0) return(-1); if(sb->sbiop == 0) { switch(flg) { case 0: if(coff == 0) /* Optimize common case */ return(sb_rewind(sb)); sb->sboff = coff - sb->sbdot; /* Abs */ break; case 1: sb->sboff += coff; /* Rel */ break; case 2: sb->sboff += sb_ztell(sb) + coff; break; default: return(-1); } sbx_norm(sb,0); return(0); } if((sm = sd->sdmem) == 0) return(sbx_err(-1,"SDMEM 0")); moff = sb->sbiop - sm->smaddr; /* Get cur smblk offset */ if(sb->sbflags&SB_WRIT) /* Update since moving out */ { sm->smuse = moff; sb->sbflags &= ~SB_WRIT; } sb->sbwleft = 0; /* Always gets zapped */ switch(flg) { case 0: /* Offset from beginning */ coff -= sb->sbdot + (chroff)moff; /* Make rel */ case 1: /* Offset from current loc */ break; case 2: /* Offset from end */ coff += sb_ztell(sb); break; default: return(-1); } /* COFF now has relative offset from current location */ if (-(chroff)moff <= coff && coff <= sb->sbrleft) { /* Win! Handle repos-within-smblk */ sb->sbiop += coff; sb->sbrleft -= coff; /* Set r; wleft already 0 */ return(0); } /* Come here when moving to a different sdblk. */ sb->sbrleft = 0; sb->sbiop = 0; sb->sboff = coff + (chroff)moff; sbx_norm(sb,0); return(0); } /* SB_REWIND(sb) - Go to beginning of sbbuffer. * Much faster than using sb_seek. Note that this leaves the sbbuffer * in an open/idle state which is maximally easy to compact. */ sb_rewind(sbp) SBBUF *sbp; { register SBBUF *sb; register struct sdblk *sd; if((sb = sbp)==0) return; sbx_smdisc(sb); /* Ensure I/O disconnected */ (sd = sb->sbcur)->sdflags &= ~SD_LOCK; /* Unlock current blk */ sd = sbx_beg(sd); /* Move to beg of sbstring */ /* Need not lock - see sb_open comments, also sb_close */ /* sd->sdflags |= SD_LOCK; */ /* Lock onto this one */ sb->sbcur = sd; sb->sbdot = 0; sb->sboff = 0; } /* SB_TELL(sb) - Get I/O ptr value for SBBUF. * Returns -1 on errors. */ chroff sb_tell(sbp) SBBUF *sbp; { register SBBUF *sb; register struct smblk *sm; register struct sdblk *sd; if((sd = (sb=sbp)->sbcur) == 0) return((chroff)-1); if(sb->sbiop == 0) return(sb->sbdot + sb->sboff); if((sm = sd->sdmem) == 0) return(sbx_err(0,"SDMEM 0")); return(sb->sbdot + (unsigned)(sb->sbiop - sm->smaddr)); } /* SB_ZTELL(sb) - Get I/O ptr relative to "Z" (EOF). * Returns # chars from current location to EOF; 0 if any errors. */ chroff sb_ztell(sbp) SBBUF *sbp; { register SBBUF *sb; register struct smblk *sm; register struct sdblk *sd; if((sd = (sb=sbp)->sbcur) == 0) return((chroff)0); if(sb->sbiop && (sm = sd->sdmem)) { if(sb->sbflags&SB_WRIT) /* If actively writing, */ return(sbs_len(sd->slforw)); /* ignore this blk. */ /* Note that previous code makes it unnecessary * to invoke sbx_smdisc. (otherwise wrong * smuse would confuse sbs_len). */ return(sbs_len(sd) - (sb->sbiop - sm->smaddr)); } else return(sbs_len(sd) - sb->sboff); } /* Code past this point should insofar as possible be INTERNAL. */ /* SBX_READY(sb,type,cmin,cmax) - Set up SBBUF for reading or writing. * * If no current smblk: * reading - set up for reading * writing - set up for splitting? * If current smblk: * reading - if can read, OK. Else position at beg of next sdblk * writing - if can write, OK. Else position at end of prev sdblk, * or set up for splitting? * Types: * 0 - Read forward (BOB) * 1 - Read backward (EOB) * 3 - Write (insert forward) (EOB) * 4 - Delete forward (return SD, force BOB-aligned) * 5 - Delete backward (return SD, force EOB-aligned) * Connected SD is always locked. * Returns 0 if error, -1 if EOF-type error, 1 for success. * * For types 0,1: * CMIN,CMAX represent max # chars to read in to left and right of * I/O ptr (prev and post). Actual amount read in may be * much less, but will never be zero. * Successful return guarantees that SBIOP etc. are ready. * For type 3: * If new block is allocated, CMIN and CMAX represent min, max sizes * of the block. * Successful return guarantees that SBIOP etc. are ready, but * NOTE that SB_WRIT and SD_MOD are not set! If not going to use * for writing, be sure to clear sbwleft on return! * For types 4,5: * CMIN, CMAX are ignored. * SBIOP is always cleared. SBOFF is guaranteed to be 0 for * type 4, SMUSE for type 5. * Return value is a SD ptr; 0 indicates error. -1 isn't used. */ struct sdblk * sbx_ready(sbp,type,cmin,cmax) SBBUF *sbp; int type; SBMO cmin,cmax; { register SBBUF *sb; register struct sdblk *sd; register struct smblk *sm; int cnt, slop, rem; SBMO moff; if((sd = (sb=sbp)->sbcur) == 0) return(0); if(sb->sbiop) /* Canonicalize for given operation */ { if((sm = sd->sdmem)==0) return(0); moff = sb->sbiop - sm->smaddr; /* Current block offset */ switch(type) { case SK_READF: /* Read Forward */ if(sb->sbrleft > 0) /* Already set up? */ return(1); /* Yup, fast return */ sbx_smdisc(sb); /* None left, disc to get next */ if((sd = sbx_next(sb)) == 0) /* Try to get next blk */ return(-1); /* At EOF */ break; case SK_READB: /* Read Backward */ if(moff) /* Stuff there to read? */ { if(sb->sbflags&SB_WRIT) /* Yup, turn writes off */ { sm->smuse = moff; sb->sbflags &= ~SB_WRIT; } sb->sbwleft = 0; return(1); } sbx_smdisc(sb); break; case SK_WRITEF: /* Writing */ if(sb->sbrleft <= 0) sb->sbwleft = sm->smlen - moff; if(sb->sbwleft > 0) return(1); /* OK to write now */ /* NOTE: flags not set!!! */ sbx_smdisc(sb); break; case SK_DELF: /* Delete forward - force BOB */ if(sb->sbrleft <= 0) /* At end of blk? */ { sbx_smdisc(sb); /* Win, unhook */ return(sbx_next(sb)); /* Return next or 0 if EOF */ } sbx_smdisc(sb); /* Not at end, but see if */ if(moff == 0) /* at beg of blk? */ return(sd); /* Fast win! */ break; case SK_DELB: /* Delete backward - force EOB */ if(sb->sbrleft <= 0) /* Win if already EOB */ { sbx_smdisc(sb); return(sd); } sbx_smdisc(sb); break; default: return(0); } } /* Schnarf in the text, or whatever. * SD points to current sdblk (must be SD_LOCKed) * SBDOT must have correct value for this SD * SBOFF has offset from there to put I/O ptr at. * * After normalization, SBOFF is guaranteed to point within * the SD. Other guarantees apply to boundary cases, depending * on the mode (type) bits. */ sd = sbx_norm(sb,type); /* Normalize I/O pos appropriately */ sm = sd->sdmem; switch(type) { case SK_READB: /* Read Backward */ if(sb->sboff == 0) /* Due to normalize, if 0 seen */ return(-1); /* then we know it's BOF */ if(sm) goto sekr2; else goto sekr1; case SK_READF: /* Read Forward */ if(sm) goto sekr2; if(sb->sboff == sd->sdlen) /* Normalize means if EOB */ return(-1); /* then at EOF. */ sekr1: slop = SB_SLOP; sekr3: if(sb->sboff > cmin+slop) /* Too much leading text? */ { /* Split off leading txt */ sbx_split(sd,(chroff)(sb->sboff - cmin)); sd = sbx_next(sb); /* Point to next sdblk */ sb->sboff = cmin; /* Set correct offset */ /* (sbx_next assumes 0) */ } if(sd->sdlen > sb->sboff+cmax+slop) /* Too much trailing txt? */ sbx_split(sd,(chroff)(sb->sboff+cmax)); /* ----- Try to get mem blk to read stuff into ----- */ /* Note alignment hack for extra efficiency. This ensures * that all reads from disk to memory are made with the same * source and destination word alignment, so the system kernel * only needs byte-moves for the first or last bytes; all * others can be word-moves. * This works because sbx_mget always returns word-aligned * storage, and we use sbx_msplit to trim off the right number * of bytes from the start. */ cnt = sd->sdlen; /* Get # bytes we'd like */ if(rem = rndrem(sd->sdaddr)) /* If disk not word-aligned */ cnt += rem; /* allow extra for aligning.*/ if(sm == 0) /* Always true 1st time */ { sm = sbx_mget(SB_SLOP,cnt); /* Get room (may GC!)*/ if(sm->smlen < cnt) /* Got what we wanted? */ { slop = 0; /* NO!! Impose stricter */ cmin = 0; /* limits. Allow for new */ cmax = sm->smlen - (WDSIZE-1); /* rem. */ if(type == SK_READB) { cmin = cmax; cmax = 0; } goto sekr3; /* Go try again, sigh. */ } } else if(sm->smlen < cnt) /* 2nd time shd always win */ { sbx_err(0,"Readin blksiz err"); /* Internal error, */ if((cmax /= 2) > 0) goto sekr3; /* w/crude recovery */ return(0); } if(rem) /* If disk not word-aligned, hack stuff */ { sm = sbx_msplit(sm, (SBMO)rem); /* Trim off from beg*/ sbm_mfree(sm->smback); /* Free the excess */ } sd->sdmem = sm; sm->smuse = sd->sdlen; if(sd->sdfile == 0) return(sbx_err(0,"No file")); /* Gasp? */ if(!sbx_rdf(sd->sdfile->sffd, sm->smaddr, sm->smuse, 1, sd->sdaddr)) return(sbx_err(0,"Readin SD: %o", sd)); /* ------- */ sekr2: sbx_sbrdy(sb); /* Make it current, pt to beg */ sb->sbwleft = 0; /* Ensure not set (esp if READB) */ break; case SK_WRITEF: /* Write-type seek */ if(sm == 0) { /* Block is on disk, so always split (avoid readin) */ if(sd->sdlen) /* May be empty */ { sbx_split(sd, sb->sboff); /* Split at IO ptr */ sd = sbx_next(sb); /* Move to 2nd part */ if(sd->sdlen) /* If stuff there, */ /* split it again. */ sbx_split(sd, (chroff) 0); } goto sekwget; } /* Block in memory */ moff = sm->smuse; if(sb->sboff == moff) /* At end of the block? */ { if(sm->smlen > moff) /* Yes, have room? */ goto sekw; /* Win, go setup and ret */ if(sm->smforw /* If next mem blk */ && (sm->smforw->smflags /* Can have bytes */ & (SM_USE|SM_NXM))==0 /* stolen from it */ && (sd->sdflags&SD_MOD) /* and we ain't pure*/ && sm->smlen < cmax) /* and not too big */ { /* Then steal some core!! Note that without * the size test, a stream of putc's could * create a monster block gobbling all mem. */ cmin = cmax - sm->smlen; if(cmin&01) cmin++; /* Ensure wd-align */ if(sm->smforw->smlen <= cmin) { sbm_mmrg(sm); goto sekw; } sm->smforw->smlen -= cmin; sm->smforw->smaddr += cmin; sm->smlen += cmin; goto sekw; } /* Last try... check next logical blk for room */ if(sd->slforw && (sm = sd->slforw->sdmem) && sm->smuse == 0 && sm->smlen) { sd = sbx_next(sb); /* Yup, go there */ goto sekw; } } /* Middle of block, split up to insert */ sbx_split(sd, sb->sboff); /* Split at IO ptr */ if(sd->sdmem) /* Unless blk now empty, */ { sd = sbx_next(sb); /* move to next. */ if(sd->sdmem) /* If not empty either */ sbx_split(sd, (chroff) 0); /* Split again */ } /* Have empty SD block, get some mem for it */ sekwget: sd->sdmem = sm = sbx_mget(cmin,cmax); sm->smuse = 0; sekw: sbx_sbrdy(sb); /* Sets up sbwleft... */ return(1); case SK_DELF: /* Delete forward */ if(sb->sboff == 0) /* At block beg already? */ return(sd); /* Win, return it */ sbx_split(sd, sb->sboff); /* No, split up and */ return(sbx_next(sb)); /* return ptr to 2nd part */ case SK_DELB: /* Delete backward (force EOB align) */ if(sb->sboff != /* If not at EOB already, */ (sm ? (chroff)(sm->smuse) : sd->sdlen)) sbx_split(sd, sb->sboff); /* Then split */ return(sd); /* And return ptr to 1st part */ break; default: return(0); } /* End of switch */ return(1); } struct sdblk * sbx_next (sbp) SBBUF *sbp; { register SBBUF *sb; register struct sdblk *sd, *sdf; if((sdf = (sd = (sb=sbp)->sbcur)->slforw) == 0) return((struct sdblk *)0); sb->sbdot += (sd->sdmem ? (chroff)sd->sdmem->smuse : sd->sdlen); sb->sboff = 0; sd->sdflags &= ~SD_LOCK; /* Unlock current */ sdf->sdflags |= SD_LOCK; /* Lock next */ sb->sbcur = sdf; return(sdf); } /* SBX_NORM(sb,mode) - Normalizes I/O position as desired. * The SBBUF must have I/O disconnected (SBIOP==0). * Adjusts SBCUR, SBDOT, and SBOFF so that SBOFF is guaranteed * to point to a location in the current SD block. * The mode flags determine action when there is more than * one possible SD that could be pointed to, as is the case * when the I/O pos falls on a block boundary (possibly with * adjacent zero-length blocks as well). * SKM_0BACK - Zero-skip direction. * 0 = Skip forward over zero-length blocks. * set = Skip backward over zero-length blocks. * SKM_EOB - Block-end selection (applies after skipping done). * 0 = Point to BOB (Beginning Of Block). * set = Point to EOB (End Of Block). * Returns the new current SD as a convenience. * Notes: * The SKM_0BACK flag value is a special hack to search in * the right direction when SBOFF is initially 0. * None of the mode flags have any effect if the I/O pos falls * within a block. * Perhaps this routine should flush the zero-length blks it * finds, if they're not locked?? */ struct sdblk * sbx_norm(sbp,mode) SBBUF *sbp; int mode; { register struct sdblk *sd; register struct smblk *sm; register SBBUF *sb; chroff len; if((sd = (sb=sbp)->sbcur) == 0) { sb->sbdot = 0; sb->sboff = 0; return(sd); } sd->sdflags &= ~SD_LOCK; /* Unlock current blk */ if(sb->sboff >= (mode&01)) /* Hack hack to get right skip */ for(;;) /* Scan forwards */ { if(sm = sd->sdmem) /* Get length of this blk */ len = sm->smuse; else len = sd->sdlen; if(sb->sboff <= len) if(sb->sboff < len /* If == and fwd 0-skip, continue */ || (mode&SKM_0BACK)) { if((mode&SKM_EOB) /* Done, adjust to EOB? */ && sb->sboff == 0 /* Yes, are we at BOB? */ && sd->slback) /* and can do it? */ { sd = sd->slback; /* Move to EOB */ sb->sboff = (sm = sd->sdmem) ? (chroff)(sm->smuse) : sd->sdlen; sb->sbdot -= sb->sboff; } break; } if(sd->slforw == 0) /* At EOF? */ { sb->sboff = len; break; } sd = sd->slforw; sb->sboff -= len; sb->sbdot += len; } else /* Scan backwards */ for(;;) { if(sd->slback == 0) /* At BOF? */ { sb->sboff = 0; sb->sbdot = 0; /* Should already be 0, but... */ break; } sd = sd->slback; if(sm = sd->sdmem) /* Get length of this blk */ len = sm->smuse; else len = sd->sdlen; sb->sbdot -= len; if((sb->sboff += len) >= 0) if(sb->sboff > 0 /* If == 0 and bkwd 0-skip, continue */ || !(mode&SKM_0BACK)) { if((mode&SKM_EOB) == 0 /* Done, adjust to BOB? */ && sb->sboff == len /* Yes, are we at EOB? */ && sd->slforw) /* and can do it? */ { sd = sd->slforw; /* Move to BOB */ sb->sboff = 0; sb->sbdot += len; } break; } } sb->sbcur = sd; sd->sdflags |= SD_LOCK; return(sd); } struct sdblk * sbx_beg(sdp) struct sdblk *sdp; { register struct sdblk *sd, *sdx; if(sd = sdp) while(sdx = sd->slback) sd = sdx; return(sd); } sbx_smdisc(sbp) SBBUF *sbp; { register SBBUF *sb; register struct smblk *sm; register struct sdblk *sd; sb = sbp; if((sd = sb->sbcur) == 0 || (sm = sd->sdmem) == 0) return; if(sb->sbflags&SB_WRIT) { sm->smuse = sb->sbiop - sm->smaddr; sb->sbflags &= ~SB_WRIT; } sb->sboff = sb->sbiop - sm->smaddr; sb->sbiop = 0; sb->sbrleft = sb->sbwleft = 0; } sbx_sbrdy(sbp) /* Sets up SBIOP, SBRLEFT, SBWLEFT */ SBBUF *sbp; { register SBBUF *sb; register struct sdblk *sd; register struct smblk *sm; if((sd = (sb=sbp)->sbcur) == 0 || (sm = sd->sdmem) == 0) return; sd->sdflags |= SD_LOCK; sb->sbiop = sm->smaddr + sb->sboff; if(sb->sbrleft = sm->smuse - sb->sboff) sb->sbwleft = 0; else sb->sbwleft = sm->smlen - sm->smuse; } /* SBX_SCPY(sd,sdl) - Copies given sbstring, returns ptr to new sbstring. * Only goes as far as sdl (last copied blk); 0 for entire sbstring. */ struct sdblk * sbx_scpy(sdp,sdlast) struct sdblk *sdp, *sdlast; { register struct sdblk *sd, *sd2, *sdn; struct sdblk *sdr; if((sd = sdp) == 0) return((struct sdblk *)0); sdn = 0; do { sd->sdflags |= SD_LCK2; sd2 = sbx_sdcpy(sd); if(sd2->slback = sdn) { sdn->slforw = sd2; sdn->sdflags &= ~SD_LOCKS; } else sdr = sd2; /* Save 1st */ sdn = sd2; sd->sdflags &= ~SD_LCK2; } while(sd != sdlast && (sd = sd->slforw)); sd2->slforw = 0; sd2->sdflags &= ~SD_LOCKS; return(sdr); } /* SBX_SDCPY(sd) - Copies given sdblk, returns ptr to new blk. * Does not set locks, assumes caller does this (which it MUST, * to avoid compaction lossage!) */ struct sdblk * sbx_sdcpy(sdp) struct sdblk *sdp; { register struct sdblk *sd, *sd2; register struct smblk *sm, *sm2; if((sd = sdp) == 0) return((struct sdblk *)0); sd2 = sbx_ndget(); /* Get a free sdblk */ bcopy((SBMA)sd, (SBMA)sd2, sizeof(struct sdblk)); /* Copy sdblk data */ sd2->slforw = 0; /* Don't let it think it's on a list */ sd2->slback = 0; if(sd2->sdfile) /* If has disk copy, */ { sd->sdforw = sd2; /* Fix phys list ptrs */ sd2->sdback = sd; if(sd2->sdforw) sd2->sdforw->sdback = sd2; } if(sm = sd2->sdmem) /* If has in-core copy, try to */ { if(sm2 = sbm_mget(sm->smuse,sm->smuse)) /* get mem for it */ { bcopy(sm->smaddr,sm2->smaddr,sm->smuse); sm2->smuse = sm->smuse; sd2->sdmem = sm2; /* Point new sd to copy */ } else /* Can't get mem... */ { if(sd2->sdflags&SD_MOD) sbx_aout(sd2,1); /* Swap out the blk */ sd2->sdmem = 0; /* Don't have incore copy */ } } return(sd2); } /* SBX_XCIS(sbp,coff,&sdp2,adot) - Internal routine to excise a sbstring, * defined as everything between current location and given offset. * SD to first sdblk is returned (0 if error) * SD2 (address passed as 3rd arg) is set to last sdblk. * Both are locked with LCK2 to ensure that pointers are valid. * The current location at time of call is also returned via adot. */ struct sdblk * sbx_xcis(sbp,num,asd2,adot) SBBUF *sbp; chroff num, *adot; struct sdblk **asd2; { register SBBUF *sb; register struct sdblk *sd, *sd2; int dirb; if((sb = sbp) == 0) return((struct sdblk *)0); dirb = 0; /* Delete forward */ if(num == 0) return((struct sdblk *)0); /* Delete nothing */ if(num < 0) dirb++; /* Delete backward */ if((sd = (struct sdblk *) sbx_ready(sb, (dirb ? SK_DELB : SK_DELF))) == 0) return((struct sdblk *)0); /* Maybe nothing there */ sd->sdflags |= SD_LCK2; /* Lock up returned SD */ *adot = sb->sbdot; /* Save current location */ sb->sboff += num; /* Move to other end of range */ if((sd2 = (struct sdblk *) sbx_ready(sb,(dirb ? SK_DELF : SK_DELB))) == 0) { sd->sdflags &= ~SD_LCK2; /* This shd never happen if */ return( /* we got this far, but... */ (struct sdblk *)sbx_err(0,"KILLN SD2 failed")); } sd2->sdflags |= SD_LCK2; /* Lock up other end of stuff */ /* SD and SD2 now delimit bounds of stuff to excise. * Now do direction dependent fixups */ if(dirb) { /* Backward, current sbdot is ok but must get SD/SD2 * into first/last order. Also, due to nature of block * splitups, a backward delete within single block will leave * SD actually pointing at predecessor block. */ if(sd->slforw == sd2) /* If SD became pred, fix things. */ { sd->sdflags &= ~SD_LCK2; /* Oops, unlock! */ sd = sd2; } else /* Just need to swap SD, SD2 ptrs. */ { /* Goddamit why doesn't C have an */ /* exchange operator??? */ *asd2 = sd; return(sd2); } } *asd2 = sd2; return(sd); } /* SBX_SPLIT(sd,chroff) - Splits block SD at point CHROFF (offset from * start of block). SD remains valid; it is left locked. * The smblk is split too, if one exists, and SMUSE adjusted. * If offset 0, or equal to block length, the 1st or 2nd SD respectively * will not have a smblk and its sdlen will be 0. * (Note that if a smblk exists, a zero sdlen doesn't indicate much) */ struct sdblk * sbx_split(sdp, coff) struct sdblk *sdp; chroff coff; { register struct sdblk *sd, *sdf, *sdx; if((sd=sdp) == 0) return((struct sdblk *)0); sd->sdflags |= SD_LOCK; if(sd->sdflags&SD_MOD) /* If block has been munged, */ sbx_npdel(sd); /* Flush from phys list now. */ sdf = sbx_ndget(); /* Get a sdblk node */ bcopy((SBMA)sd, (SBMA)sdf, (sizeof (struct sdblk))); /* Copy node */ /* Note that the flags are copied, so both sdblks are locked and * safe from possible GC compaction during call to sbx_msplit... */ if(coff == 0) /* If offset was 0, */ { /* then 1st SD becomes null */ if(sdf->sdfile) /* Fix up phys links here */ { if(sdx = sdf->sdback) sdx->sdforw = sdf; else sdf->sdfile->sfptr1 = sdf; if(sdx = sdf->sdforw) sdx->sdback = sdf; } sdx = sd; goto nulsdx; } else if(sd->sdmem) if(coff >= sd->sdmem->smuse) goto nulsdf; else sdf->sdmem = sbx_msplit(sd->sdmem, (SBMO)coff); else if(coff >= sd->sdlen) nulsdf: { sdx = sdf; nulsdx: sdx->sdforw = 0; sdx->sdback = 0; sdx->sdmem = 0; sdx->sdfile = 0; sdx->sdlen = 0; sdx->sdaddr = 0; goto nulskp; } if(sd->sdfile) { sdf->sdlen -= coff; /* Set size of remainder */ sdf->sdaddr += coff; /* and address */ sd->sdlen = coff; /* Set size of 1st part */ /* Link 2nd block into proper place in physical sequence. * 1st block is already in right place. Search forward until * find a block with same or higher disk address, and insert * in front of it. If sdlen is zero, just flush the links, * which is OK since the 1st block is what's pointed to anyway. */ if(sdf->sdlen > 0) { while((sdx = sd->sdforw) /* Find place to insert */ && sdf->sdaddr > sdx->sdaddr) sd = sdx; sdf->sdback = sd; /* Link following sd. */ if(sdf->sdforw = sd->sdforw) sdf->sdforw->sdback = sdf; sd->sdforw = sdf; sd = sdp; /* Restore pointer */ } else { sdf->sdforw = 0; sdf->sdback = 0; sdf->sdfile = 0; /* Say no disk */ } } nulskp: sdf->slback = sd; /* Link in logical sequence */ if(sd->slforw) sd->slforw->slback = sdf; sd->slforw = sdf; sdf->sdflags &= ~SD_LOCKS; /* Unlock 2nd but not 1st */ return(sd); /* Note sd, not sdf */ } /* SBX_MSPLIT - Like sbm_split but never fails, and sets * SMUSE values appropriately */ struct smblk * sbx_msplit(smp, size) struct smblk *smp; SBMO size; { register struct smblk *sm, *smx; register int lev; lev = 0; while((smx = sbm_split((sm = smp), size)) == 0) sbx_comp(SB_BUFSIZ,lev++); /* Need to get some smblk nodes */ if(sm->smlen >= sm->smuse) /* Split across used portion? */ smx->smuse = 0; /* Nope, new blk is all free */ else { smx->smuse = sm->smuse - sm->smlen; sm->smuse = sm->smlen; } return(smx); } /* SBX_NDEL - flush a SD and associated SM. Fixes up logical * and physical links properly. Returns ptr to next logical SD. * NOTE: if sd->slback does not exist, the returned SD is your * only hold on the list, since the SD gets flushed anyway! */ struct sdblk * sbx_ndel(sdp) struct sdblk *sdp; { register struct sdblk *sd, *sdx; register struct smblk *sm; sd = sdp; if(sm = sd->sdmem) /* If smblk exists, */ { sbm_mfree(sm); /* flush it. */ sd->sdmem = 0; } if(sdx = sd->slback) sdx->slforw = sd->slforw; if(sd->slforw) sd->slforw->slback = sdx; /* May be zero */ /* Logical links done, now hack phys links */ if(sd->sdfile) /* Have phys links? */ sbx_npdel(sd); /* Yes, flush from phys list */ sdx = sd->slforw; sbx_ndfre(sd); return(sdx); } sbx_npdel(sdp) struct sdblk *sdp; { register struct sdblk *sd, *sdx; register struct sbfile *sf; if((sf = (sd=sdp)->sdfile) == 0) return; if(sdx = sd->sdback) /* Start of disk file? */ sdx->sdforw = sd->sdforw; else sf->sfptr1 = sd->sdforw; if(sdx = sd->sdforw) sdx->sdback = sd->sdback; sd->sdfile = 0; sd->sdlen = 0; } struct sdblk *sbx_nfl; /* Pointer to sdblk node freelist */ struct sdblk * sbx_ndget() /* Like sbm_nget but never fails! */ { register struct sdblk *sd; register int lev; lev = 0; while((sd = sbx_nfl) == 0 /* Get a node */ /* If fail, make more */ && (sd = sbm_nmak((sizeof (struct sdblk)),SM_DNODS)) == 0) /* If still fail, try GC */ sbx_comp(sizeof(struct sdblk)*SM_DNODS,lev++); sbx_nfl = sd->slforw; /* Take it off freelist */ sd->sdflags = SD_NID; return(sd); /* Return ptr to it */ } sbx_ndfre(sdp) struct sdblk *sdp; { register struct sdblk *sd; (sd = sdp)->sdflags = 0; sd->slforw = sbx_nfl; sbx_nfl = sd; } SBMA sbx_malloc(size) unsigned size; { register int lev; register SBMA res; lev = 0; while((res = (SBMA)malloc(size)) == 0) sbx_comp(size,lev++); return(res); } struct smblk * sbx_mget(cmin,cmax) /* like sbm_mget but never fails! */ SBMO cmin, cmax; { register struct smblk *sm; register int lev, csiz; lev = 0; csiz = cmax; for(;;) { if(sm = sbm_mget(csiz,cmax)) return(sm); /* Won right off... */ sbx_comp(csiz,lev++); /* Barf, invoke GC */ if(sm = sbm_mget(csiz,cmax)) /* Then try again */ return(sm); if((csiz >>= 1) < cmin) /* If still short, reduce */ csiz = cmin; /* request down to min */ } } chroff sbv_taddr; /* Disk addr of place to write into (set by TSET) */ struct sdblk *sbv_tsd; /* SD that disk addr comes after (set by TSET) */ #define sbx_qlk(sd) (sd->sdflags&SD_LOCKS) #if 0 This is the compaction routine, which is the key to the entire scheme. Paging text to and from disk is trivial, but the ability to merge blocks is the important thing since it allows flushing the pointer information as well as the actual text! This eliminates fragmentation as a fatal problem. There are a variety of ways that storage can be reclaimed: - "pure" in-core blocks can be flushed instantly. - "impure" incore blocks can be written to tempfile storage and flushed. - The SM node freelist can be compacted so as to flush memory which is used for nothing but holding free nodes. - The SD node freelist can be compacted, ditto. - SBBUFs can be compacted, by: - Merging logically & physically adjacent on-disk pieces - merging logically & physically adjacent in-core pieces - merging logically adjacent in-core pieces - merging logically adjacent disk pieces, by reading in and then writing out to tempfile storage. Worst case would reduce whole sbstr to single tempfile block. Problems: What is "optimal" algorithm for typical usage? Must go over all code to make sure right things get locked and unlocked to avoid having rug pulled out from under. Could have optional "registration table" for sbstruc; if exist in table, can check during GC. If find one, can first do sbx_smdisc and then repoint sbcur to 1st block, with sbdot of 0 and sboff of sb_tell(). This allows reducing whole thing to one block even tho "locked". Never touch stuff locked with SD_LCK2, though. Also may need way to protect the sbstr SD actually being pointed to by current sbx routine processing. Could have count of # nodes free for SM and SD; don''t GC unless # is some number greater than size of a node block! Have different levels of compaction; pass level # down thru calls so as to invoke progressively sterner compaction measures. Can invoke sbx_comp with any particular level! Must have list somewhere of SBBUFs? or maybe OK to scan core for SM_DNODS, then scan sdblks? Screw: could happen that stuff gets flushed (cuz pure) or even written out to tempfile, and then we have to read it back in so as to compact more stuff into tempfile... how to avoid? If pure stuff small and next to impure stuff, merge? Some calls just want to get another free node and don''t need new core. How to indicate this? How to decide between freeing up used nodes, and creating new node freelist? #endif /*COMMENT*/ /* Compact stuff. * General algorithm for getting storage is: * 1) allocate from freelist if enough there * 2) find unlocked pure smblk to free up * 3) find unlocked impure smblks, write out. * 4) Compact stuff by reducing # of sdblks. This is key to scheme! * Otherwise fragmentation will kill program. * Maybe put age cnt in each sbstr? Bump global and set cntr each time * sbstr gets major hacking (not just getc/putc). */ extern struct smblk *sbm_list; sbx_comp(cmin,lev) int cmin, lev; { int sbx_sdgc(); if(lev > 100) /* If program has no way to handle this, */ abort(); /* then simply blow up. */ if(lev > 10) /* Too many iterations? Try to warn. */ return(sbx_err(0,"GC loop, cannot free block of size %d", cmin)); /* Step thru core hunting for SD node blocks */ sbm_nfor(SM_DNODS,sizeof(struct sdblk),sbx_sdgc,lev); } /* Do GC stuff on a sdblk. Guaranteed to exist, but may be locked */ sbx_sdgc(sdp,lev) struct sdblk *sdp; int lev; { register struct sdblk *sd, *sdf; register struct smblk *sm; struct smblk *smf, *sbm_exp (); SBMO more; sd = sdp; if(sbx_qlk(sd)) return(0); sm = sd->sdmem; sdf = sd->slforw; if (lev < 4) goto lev3; /* Level 4 - write out everything possible */ /* Back up to start of sbstr */ while((sdf = sd->slback) && !sbx_qlk(sdf)) sd = sdf; if((sdf = sd->slforw) == 0 /* If only 1 blk, ensure on disk */ || sbx_qlk(sdf)) { if(sm = sd->sdmem) { if(sd->sdflags&SD_MOD) /* If impure, */ sbx_aout(sd, 1); /* swap out the SD */ sbm_mfree(sm); sd->sdmem = 0; } return(0); } /* At least two blocks in string. Set up for flushout. */ sbx_aout(sd, 0); /* Swapout as much of sbstring as possible */ return(0); lev3: /* Level 3 - write out more */ lev2: /* Level 2 - write out all impure & small pure */ lev1: if(lev >= 1) /* Level 1 - merge small impure & small pure */ { if(!sm || !sdf) return(0); while(((smf = sdf->sdmem) && !(sdf->sdflags&SD_LOCKS) && (more = smf->smuse + sm->smuse) < SB_BUFSIZ) ) { if(sm->smforw != smf && more > sm->smlen) /* If need more rm */ { sm = sbm_exp(sm,more); /* Get it */ if(!sm) return(0); /* If none, stop */ sd->sdmem = sm; } bcopy(smf->smaddr, sm->smaddr + sm->smuse, smf->smuse); sm->smuse = more; if(sm->smforw == smf) { sdf->sdmem = 0; sbm_mmrg(sm); /* Merge */ if(sm->smlen > more+SB_SLOP) sbm_mfree(sbm_split(sm, more)); /* Guaranteed to win since mmrg * just freed a mem node */ } sd->sdflags |= SD_MOD; if(sdf = sbx_ndel(sdf)) continue; return(0); } } if(lev <= 0) /* Level 0 - free up large pure blocks */ /* Also merge blocks which are adjacent on disk */ { if(sm) { if(sm->smuse == 0) sd->sdlen = 0; else if((sd->sdflags&SD_MOD) == 0 && sm->smuse > 64) { sbm_mfree(sm); sd->sdmem = 0; goto lev0adj; } else goto lev0adj; } if(sd->sdlen == 0 /* Free zero blocks */ && sd->slback) /* Make sure don't lose list */ { sbx_ndel(sd); if((sd = sdf) == 0) return(0); sdf = sd->slforw; } lev0adj: /* Merge blocks if adjacent on disk */ /* This is common after reading thru large chunks * of a file but not modifying it much. */ if((sd->sdflags&SD_MOD) == 0 /* Pure */ && sdf && (sdf->sdflags&(SD_LOCKS|SD_MOD)) == 0 && sd->sdfile && (sd->sdfile == sdf->sdfile) && (sd->sdaddr + sd->sdlen) == sdf->sdaddr ) { sd->sdlen += sdf->sdlen; sbx_ndel(sdf); /* Flush 2nd */ if(sm = sd->sdmem) { sbm_mfree(sm); sd->sdmem = 0; } } return(0); } return(0); } /* SBX_AOUT - output ALL of a hackable sbstring starting at given sdblk. * Note that code is careful to do things so that an abort at any * time (e.g. write error) will still leave sbstring in valid state. * Flag value: * 0 - Writes out as many unlocked sdblks as possible, and merges * so that resulting sdblk (same one pointed to by arg) * incorporates all stuff written out. * 1 - Writes out single sdblk indicated, whether unlocked or not. * Doesn't free mem or merge anything; does update physlist * and flags. * 2 - Writes out all sdblks to specified FD/offset, no mods at all, * not even to physlist or flags. Good for saving files * when something seems wrong. (How to pass fd/off args?) * (offset arg not implemented, no need yet; 0 assumed) * Returns 0 if successful, else UNIX system call error number. */ sbx_aout(sdp,flag,fd) struct sdblk *sdp; int flag, fd; { register struct sdblk *sd; register struct smblk *sm; register int cnt; int ifd, ofd, skflg, rem; chroff inlen; extern SBMA sbm_lowaddr; /* Need this from SBM for rndrem */ char buf[SB_BUFSIZ+16]; /* Get buffer space from stack! */ /* Allow extra for word-align reads. */ /* This should be +WDSIZE, but some */ /* C compilers (eg XENIX) can't handle */ /* "sizeof" arith in allocation stmts! */ /* This flag and the two ptrs below are needed because UNIX * maintains only one I/O ptr per open file, and we can sometimes * be reading from/writing to the swapout file at same time. * Using DUP() to get a new FD (to avoid seeking back and forth) * won't help since both FD's will use the same I/O ptr!!! * Lastly, can't depend on returned value of LSEEK to push/pop * ptr, since V6 systems don't implement tell() or lseek() directly. * So we have to do it by hand... */ int botchflg; chroff outptr, inptr; if((sd = sdp)==0) return; ofd = sbv_tf.sffd; /* Default output FD */ if(flag==0) { sbx_tset(sbx_qlen(sd),0);/* Find place for whole string */ outptr = sbv_taddr; /* We'll have to update wrt ptr */ } else if (flag==1) /* Single SD block, so it's reasonable to * try aligning the output with the input. */ { if(sm = sd->sdmem) { cnt = rndrem(sm->smaddr - sbm_lowaddr); sbx_tset((chroff)(sm->smuse),cnt); } else { cnt = rndrem(sd->sdaddr); sbx_tset(sd->sdlen, cnt); } outptr = sbv_taddr; /* We'll have to update wrt ptr */ } else /* Outputting a whole sbstring to a file */ { ofd = fd; outptr = 0; } for(; sd;) { if(flag==0 && sbx_qlk(sd)) break; /* Stop when hit locked sdblk */ if(sm = sd->sdmem) { if(cnt = sm->smuse) if(write(ofd, sm->smaddr, cnt) != cnt) return(sbx_err(errno,"Swapout wrt err")); outptr += cnt; if(flag==0) { sd->sdmem = 0; /* Flush the mem used */ sbm_mfree(sm); } inlen = cnt; } else if(inlen = sd->sdlen) { if(sd->sdfile == 0) return(sbx_err(errno,"Sdfile 0, SD %o",sd)); /* Foo on UNIX */ botchflg = ((ifd = sd->sdfile->sffd) == ofd) ? 1 : 0; skflg = 1; /* Always seek first time */ inptr = sd->sdaddr; /* Efficiency hack - set up for first read so that * transfer is word-aligned and terminates at end * of a disk block. */ rem = rndrem(inptr); /* Get alignment */ cnt = SB_BUFSIZ - (int)(inptr%SB_BUFSIZ); while(inlen > 0) { if(inlen < cnt) cnt = inlen; if(!sbx_rdf(ifd, buf+rem, cnt, skflg, inptr)) return(sbx_err(errno,"Swapout err, SD %o",sd)); /* Further seeks depend on botch setting */ if(skflg = botchflg) { if(lseek(ofd,outptr,0) < 0) return(sbx_err(errno, "Swapout sk err")); inptr += cnt; } if(write(ofd, buf+rem, cnt) != cnt) return(sbx_err(errno, "Swapout wrt err")); outptr += cnt; inlen -= cnt; cnt = SB_BUFSIZ; /* Now can use full blocks */ rem = 0; /* Aligned nicely, too! */ } inlen = sd->sdlen; } /* Text written out, now merge block in */ if(flag == 2) /* No merge if saving file */ goto donxt; if(sd != sdp) /* First block? */ { sdp->sdlen += inlen; /* No, simple merge */ sd = sbx_ndel(sd); /* Flush, get next */ continue; } /* Handle 1st block specially */ if(sd->sdfile /* Unlink from phys list */ && sd != sbv_tsd) /* Don't unlink if self */ sbx_npdel(sd); sd->sdlen = inlen; sd->sdfile = &sbv_tf; sd->sdaddr = sbv_taddr; /* Set from sbx_tset val */ sd->sdflags &= ~SD_MOD; /* On disk, no longer modified */ /* Now insert into phys list at specified place */ if(sd == sbv_tsd) /* If already same place */ goto next; /* Skip linkin. */ if(sd->sdback = sbv_tsd) { sd->sdforw = sbv_tsd->sdforw; sd->sdback->sdforw = sd; } else { sd->sdforw = sbv_tf.sfptr1; sbv_tf.sfptr1 = sd; } if(sd->sdforw) sd->sdforw->sdback = sd; next: if(flag==1) /* If only doing 1 sdblk, */ break; /* stop here. */ donxt: sd = sd->slforw; /* Done with 1st, get next */ } return(0); /* Win return, no errors */ } /* Returns hackable length of a sbstring (ends at EOF or locked block) */ chroff sbx_qlen(sdp) struct sdblk *sdp; { register struct sdblk *sd; register struct smblk *sm; chroff len; len = 0; for(sd = sdp; sd && !sbx_qlk(sd); sd = sd->slforw) if(sm = sd->sdmem) len += (chroff)sm->smuse; else len += sd->sdlen; return(len); } /* SBX_TSET - finds a place on temp swapout file big enough to hold * given # of chars. Sets SBV_TADDR to that location, as well * as seeking to it so the next write call will output there. * This location is guaranteed to have the requested * byte alignment (0 = word-aligned). */ sbx_tset(loff, align) chroff loff; int align; { register int fd; if(sbv_tf.sffd <= 0) { /* Must open the temp file! */ /* Temporary file mechanism is system-dependent. Eventually this ** will probably require inclusion of a true c-env header file; for the ** time being, we can cheat a little by checking O_T20_WILD, which will ** be defined by on TOPS-20. Otherwise, we assume we are ** on a real Unix. */ #ifdef O_T20_WILD extern char *tmpnam(); /* Use ANSI function */ fd = open(tmpnam((char *)NULL), O_RDWR | O_CREAT | O_TRUNC | O_BINARY); if(fd < 0) return(sbx_err(0,"Swapout creat err")); #else /* Real Unix */ static char fcp[] = "/tmp/sbd.XXXXXX"; if((fd = creat(mktemp(fcp),0600)) < 0) return(sbx_err(0,"Swapout creat err")); /* Must re-open so that we can both read and write to it */ close(fd); if((fd = open(fcp,2)) < 0) return(sbx_err(0,"Swapout open err")); unlink(fcp); /* Set so it vanishes when we do */ #endif sbv_tf.sffd = fd; /* Initialize the sbfile struct */ sbv_tf.sfptr1 = 0; sbv_ftab[fd] = &sbv_tf; /* Record in table of all sbfiles */ sbv_taddr = 0; /* "Return" this value */ return; /* Ignore alignment for now */ } sbv_tsd = sbx_ffnd(&sbv_tf, loff+align, &sbv_taddr); sbv_taddr += align; if(lseek(sbv_tf.sffd, sbv_taddr, 0) < 0) return(sbx_err(0,"Swapout seek err: (%d,%ld,0) %d %s", sbv_tf.sffd, sbv_taddr, errno, strerror(errno))); } /* SBX_FFND - searches disk list of given file for free space of * at least size chars. Note that list must be sorted by ascending * disk addrs in order for this to work! If sdaddrs are only * changed in SBX_SPLIT this will be true. * Sets "aloc" to disk address for writing (this is guaranteed to * be word-aligned, for efficiency), and returns SD ptr to * block which this addr should follow in the physical list. If ptr * is 0, it means addr should be 1st thing in list. */ struct sdblk * sbx_ffnd(sfp, size, aloc) SBFILE *sfp; chroff size, *aloc; { register struct sdblk *sd, *sds, *sdl; chroff cur; cur = 0; sds = 0; sd = sfp->sfptr1; redo: for(; sd ; sd = (sds=sd)->sdforw) { if(cur < sd->sdaddr) /* Gap seen? */ { if(size <= (sd->sdaddr - cur)) /* Yes, big enuf? */ break; /* Yup! */ } /* No, bump. */ else if(cur >=(sd->sdaddr + sd->sdlen)) /* No gap but chk */ continue; /* No overlap, ok */ /* Bump to next possible gap. */ cur = sd->sdaddr + sd->sdlen; cur = (long)rndup(cur); /* Round up to word boundary! */ } *aloc = cur; /* Return winning addr */ /* Perform verification check -- make sure this really is OK * and complain if not. If this never blows up, eventually can * take the check out. */ sdl = sd; for(sd = sfp->sfptr1; sd; sd = sd->sdforw) { if(cur < sd->sdaddr) { if(size <= (sd->sdaddr - cur)) continue; } else if(cur >= (sd->sdaddr + sd->sdlen)) continue; sbx_err(0,"FFND blew it, but recovered. SD %o siz %ld", sd, size); sd = (sds = sdl)->sdforw; goto redo; } return(sds); /* Return ptr to block this addr follows */ } sbx_rdf(fd,addr,cnt,skflg,loc) register int fd; char *addr; int skflg; chroff loc; { register int rres, eres; long lres; char *errtyp, *ftyp; chroff curlen; errno = 0; if(skflg && (lres = lseek(fd, (long)loc, 0)) == -1) { errtyp = "Sk err"; goto errhan; } if((rres = read(fd, addr, cnt)) != cnt) { lres = rres; errtyp = "Rd err"; goto errhan; } return(rres); errhan: /* Handle read or seek error */ eres = errno; if(fd == sbv_tf.sffd) /* See if dealing with swapout file */ { ftyp = "(swap)"; curlen = 0; } else { /* No, normal buffer file. */ ftyp = ""; curlen = sbx_fdlen(fd); if(sbv_ftab[fd] && (curlen != sbv_ftab[fd]->sflen)) /* File changed? */ if(sbx_rugpull(fd)) /* Yes, handle special case */ return(cnt); /* Allow "win" return */ } sbx_err(0,"%s %d:%s, %ld:(%d%s,%o,%d)=%ld (fl %ld)", errtyp, eres, strerror(eres), loc, fd, ftyp, addr, cnt, lres, curlen); return(0); } /* SBX_RUGPULL(fd) - Special routine called when package detects that * the file indicated by the fd has changed since its original * opening. This can happen when a file is over-written by some * other program (ED, for example). * This means that all sdblks which reference this fd * are probably bad. Pass special error back up to the calling * program to give it a chance at doing something. * Extra credit: scan all sdblks and unpurify all which point to this * file, so as to protect everything we still remember about it. * Otherwise a GC could flush pure in-core portions. */ sbx_rugpull(fd) /* FD already known to have entry in sbv_ftab */ register int fd; { int sbx_unpur(); /* First scan all sdblks to save what we still have. */ /* This does NOT remove the sdfile pointer, so we can still * find blocks that are affected. */ sbm_nfor(SM_DNODS, sizeof(struct sdblk), sbx_unpur, sbv_ftab[fd]); if((int)sbv_debug == 1 || !sbv_debug) return(0); /* Nothing else we can do */ return((*sbv_debug)(2,(int *)0,"",fd)); /* Let caller handle it */ } sbx_unpur(sd, sf) /* Auxiliary routine for SBX_RUGPULL */ register struct sdblk *sd; register struct sbfile *sf; { if(sd->sdfile == sf /* If sdblk belongs to affected file */ && sd->sdmem) /* and has in-core version of text, */ sd->sdflags |= SD_MOD; /* then ensure core version is used */ } sbx_err(val,str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12) char *str; { int *sptr; sptr = (int *) &sptr; /* Point to self on stack */ sptr += 5; /* Point to return addr */ if((int)sbv_debug == 1) { abort(); } if(sbv_debug) (*sbv_debug)(1,*sptr,str,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12); return(val); } /* VALLOC - Aligned memory allocator * Emulation of the 4.2BSD library routine of the same name. * Copyright 1985 by Ken Harrenstien, SRI International * This software is quasi-public; it may be used freely with * like software, but may NOT be sold or made part of licensed * products without permission of the author. In all cases * the source code and any modifications thereto must remain * available to any user. * * This is part of the SB library package. * Any software using the SB library must likewise be made * quasi-public, with freely available sources. */ #include "sb.h" char * valloc(size) unsigned size; { register int pagmsk; register SBMO i; register struct smblk *sm, *smr; struct smblk *sbm_mget(), *sbm_split(); pagmsk = getpagesize() - 1; /* Get page size in bytes, less 1 */ if(!(sm = sbm_mget(size+pagmsk, size+pagmsk))) /* Get area big enuf */ return(0); /* Now find # bytes prior to 1st page boundary. * This expression gives 0 if already at boundary, else #-1. */ i = pagmsk - ((int)(sm->smaddr) & pagmsk); if(i) /* If need to split off preceding stuff, */ { smr = sbm_split(sm, i+1); /* do so (note i adjusted) */ sbm_mfree(sm); /* Release preceding mem */ if(!(sm = smr)) return(0); /* If couldn't split, fail */ } if(i = (sm->smlen - size)) /* See if any trailing stuff */ { smr = sbm_split(sm, size); /* Yeah, split it off too */ if(smr) sbm_mfree(smr); /* If couldn't split, excess OK. */ } return((char *)(sm->smaddr)); } e ...f Doc.shg Knownbug.txth Makedoci Makefilej Man.shk Readme.txtl blk.cm cmd1.cn cmd2.co config.hp ctags.cq ctype.cr ctype.hs curses.ct curses.hu cut.cv elvprsv.cw elvrec.cx ex.cy fmt.cz input.c{ main.c| misc.c} modify.c~ move1.c move2.c move3.c move4.c move5.c opts.c prsvunix.c recycle.c redraw.c ref.c regexp.c regexp.h regsub.c system.c tinyprnt.c tinytcap.c tio.c tmp.c unix.c vars.c vcmd.c vi.c vi.hecho x - cflags.ms sed '/^X/s///' > cflags.ms << '/' X.Go 9 "CFLAGS" X.PP X\*E uses many preprocessor symbols to control compilation. XSome of these control the sizes of buffers and such. XThe "-DNO_XXXX" options remove small sets of related features. X.PP XMost \*E users will probably want to keep all features available. XMinix-PC users, though, will have to sacrifice some sets because otherwise X\*E would be too bulky to compile. XThe "asld" phase of the compiler craps out. X.IP "-DM_SYSV, -Dbsd, -DTOS, -DCOHERENT, -Damiga" XThese flags tell the compiler that \*E is being compiled for XSystem-V UNIX, BSD UNIX, Atari TOS, Coherent, or AmigaDos, respectively. XFor other systems, the config.h file can generally figure it out automatically. X.IP -DRAINBOW XFor MS-DOS systems, this causes support for the DEC Rainbow to be compiled Xinto \*E. X.IP -DS5WINSIZE XSome versions of SysV UNIX don't support support the "winsize" Xstyle of screen-size testing, Xso elvis ignores window size changes by default. X.IP XHowever, many of the newer SysV systems defines "winsize" in the Xfile "/usr/include/sys/ptem.h". XIf your SysV system has "winsize" then you should add X-DS5SWINSIZE to the CFLAGS setting. X.IP -DTERMIOS XPOSIX is a SysV-derived specification which uses a terminal control Xpackage called "termios", instead of "termio". XSome other SysV systems may also use termios. XYou can make elvis uses termios instead of the more common termio Xby adding -DTERMIOS to CFLAGS. X(Note: This hasn't been tested very well.) X.IP -DNBUFS=\fInumber\fP X\*E keeps most of your text in a temporary file; Xonly a small amount is actually stored in RAM. XThis flag allows you to control how much of the file can be in RAM at any time. XThe default is 5 blocks, and the minimum is 3 blocks. X(See the -DBLKSIZE flag, below.) X.IP XMore RAM allows global changes to happen a little faster. X f you're just making many small changes in one section of a file, though, Xextra RAM won't help much. X.IP -DBLKSIZE=\fInumber\fP XThis controls the size of blocks that \*E uses internally. XThe value of BLKSIZE must be a power of two. XEvery time you double BLKSIZE, you quadruple the size of a text file that X\*E can handle, but you also cause the temporary file to grow faster. XFor MS-DOS, Coherent, and Minix-PC, the default value is 1024, which allows Xyou to edit files up to almost 512K bytes long. XFor all other systems, the default value is 2048, which allows you to edit Xfiles that are nearly 2 megabytes long. X.IP XThe BLKSIZE also determines the maximum line length, and a few other limits. XBLKSIZE should be either 256, 512, 1024, or 2048. XValues other than these can lead to strange behaviour. X.IP -DTMPDIR=\fIstring\fP XThis sets the default value of the "directory" option, which specifies where Xthe temporary files should reside. XThe value of TMPDIR must be a string, so be sure your value includes the Xquote characters on each end. X.IP "-DEXRC=\fIstr\fP, -DHMEXRC=\fIstr\fP, -DSYSEXRC=\fIstr\fP, -DEXINIT=\fIstr\fP" XThis lets you control the names of the initialization files. XTheir values must be strings, so be careful about quoting. X.IP XEXRC is the name of the initialization file in the current directory. XIts default value is ".exrc" on UNIX systems -- the same as the real vi. XSince that isn't a legal DOS filename, under DOS the default is "elvis.rc". XFor other systems, check the config.h file. X.IP XHMEXRC is the name of the initialization file in your home directory. XBy default, it is the same as EXRC. X\*E will automatically prepend the name of your home directory to HMEXRC Xat run time, so don't give a full path name. X.IP XSYSEXRC is the name of a system-wide initialization file. XIt has no default value; Xif you don't define a value for it, then Xthe code that supports SYSEXRC just isn't compiled. XThe value of SYSEXRC should be a full pathname, in quotes. X.IP XEXINIT is the name of an environment variable that can contain initialization Xcommands. XNormally, its value is "EXINIT". X.IP -DKEYWORDPRG=\fIstring\fP XThis flag determines the default value of the "keywordprg" option. XIts value must be a string, so be careful about quoting. XThe default value of this flag is "ref", which is a C reference program. X.IP "-DCC_COMMAND=\fIstring\fP -DMAKE_COMMAND=\fIstring\fP -DERRLIST=\fIstring\fP" XThese control the names of the C compiler, the "make" utility, and the Xerror output file, respectively. XThey are only used if -DNO_ERRLIST is not given. X.IP XThe default value of CC_COMMAND depends on the Operating System and compiler Xthat you use to compile elvis; Xfor UNIX, the default is "cc". XThe default values of MAKE_COMMAND and ERRLIST are "make" and "errlist", Xrespectively. X.IP -DMAXRCLEN=\fInumber\fP XThis determines how large a :@ macro command can be (measured in bytes). XThe default is 1000 bytes. XIf you increase this value significantly, Xthen you may need to allocate extra memory for the stack. XSee the "CHMEM" setting in the Makefile. X.IP -DSHELL=\fIstring\fP XThis is the default value of the "shell" option, and hence Xthe default shell used from within \*E. XThis only controls the default; Xthe value you give here may be overridden at run-time by setting Xan environment variable named SHELL (or COMSPEC for MS-DOS). XIts value must be a string constant, so be careful about quoting. X.IP -DTAGS=\fIstring\fP XThis sets the name of the "tags" file, Xwhich is used by the :tag command. XIts value must be a string constant, so be careful about quoting. X.IP "-DCS_IBMPC -DCS_LATIN1 -DCS_SPECIAL" XThe digraph table and flipcase option will normally start out empty. XHowever, if you add -DCS_IBMPC or -DCS_LATIN1 to your CFLAGS, Xthen they will start out filled with values that are appropriate for the XIBM PC character set or the ISO Latin-1 character set, respectively. X.IP XYou can also use -DCS_IBMPC and -DCS_SPECIAL together to get digraphs Xthat produce the PC's graphic characters. X.IP "-DDEBUG -DEBUG2" X-DDEBUG adds the ":debug" and ":validate" commands, Xand also adds many internal consistency checks. XIt increases the size of the ".text" segment by about 6K. X.IP X-DDEBUG2 causes a line to be appended to a file called "debug.out" Xeverytime any change is made to the edit buffer. X.IP -DCRUNCH XThis flag removes some non-critical code, so that \*E is smaller. XFor example, it removes a short-cut from the regexp package, so that Xtext searches are slower. XAlso, screen updates are not as efficient. XA couple of obscure features are disabled by this, too. X.IP -DNO_MKEXRC XThis removes the ":mkexrc" command, Xso you have to create any .exrc files manually. XThe size of the .text segment will be reduced by about 600 bytes. X.IP -DNO_CHARATTR XPermanently disables the charattr option. XThis reduces the size of your ".text" segment by about 850 bytes. X.IP -DNO_RECYCLE XNormally, \*E will recycle space (from the temporary file) which contains Xtotally obsolete text. XThis flag disables this recycling. XWithout recycling, the ".text" segment is about 1K smaller Xthan it would otherwise be, Xbut the tmp file grows much faster. XIf you have a lot of free space on your hard disk, Xbut \*E is too bulky to run with recycling, Xthen try it without recycling. X.IP XWhen using a version of \*E that has been compiled with -DNO_RECYCLE, Xyou should be careful to avoid making many small changes to a file Xbecause each individual change will cause the tmp file to grow by at least 1k. XHitting "x" thirty times counts as thirty changes, Xbut typing "30x" counts as one change. XAlso, you should occasionally do a ":w" followed by a ":e" to start with a Xfresh tmp file. X.IP XInterestingly, the real vi never recycles space from its temporary file. X.IP -DNO_SENTENCE XLeaves out the "(" and ")" visual mode commands. XAlso, the "[[", "]]", "{", and "}" commands will not recognize *roff macros. XThe sections and paragraphs options go away. XThis saves about 650 bytes in the ".text" segment. X.IP -DNO_CHARSEARCH XLeaves out the visual commands which locate a given character Xin the current line: X"f", "t", "F", "T", "," and ";". XThis saves about 900 bytes. X.IP -DNO_EXTEN)@+@,@-@.@/@0@1@2@3@4@5@6@7@8@9@:@;@<@=@>@?@@@A@B@C@D@E@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@`@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@{@|@}@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@SIONS XLeaves out the "K" and "#" visual commands. XAlso, the arrow keys will no longer work in input mode. XRegular expressions will no longer recognize the \\{\\} operator. X(Other extensions are either inherent in the design of \*E, Xor are controlled by more specific flags, Xor are too tiny to be worth removing.) XThis saves about 250 bytes. X.IP -DNO_MAGIC XPermanently disables the "magic" option, so that most meta-characters Xin a regular expression are *NOT* recognized. XThis saves about 3k of space in the ".text" segment, because Xthe complex regular expression code can be replaced by much simpler code. X.IP -DNO_SHOWMODE XPermanently disables the "showmode" option, saving about 250 bytes. X.IP -DNO_CURSORSHAPE XNormally, \*E tries to adjust the shape of the cursor as a reminder Xof which mode you're in. XThe -DNO_CURSORSHAPE flag disables this, saving about 150 bytes. X.IP -DNO_DIGRAPH XTo allow entry of non-ASCII characters, \*E supports digraphs. XA digraph is a single (non-ASCII) character which is entered as a Xcombination of two other (ASCII) characters. XIf you don't need to input non-ASCII characters, Xor if your keyboard supports a better way of entering non-ASCII characters, Xthen you can disable the digraph code and save about 450 bytes. X.IP -DNO_ERRLIST X\*E adds a ":errlist" command, which is useful to programmers. XIf you don't need this feature, you can disable it via the -DNO_ERRLIST flag. XThis will reduce the .text segment by about 900 bytes, and the .bss segment Xby about 300 bytes. X.IP -DNO_ABBR XThe -DNO_ABBR flag disables the ":abbr" command, Xand reduces the size of \*E by about 250 bytes. X.IP -DNO_OPTCOLS XWhen \*E displays the current options settings via the ":set" command, Xthe options are normally sorted into columns. XThe -DNO_OPTCOLS flag causes the options to be sorted across the rows, Xwhich is much simpler for the computer. XThe -DNO_OPTCOLS flag will reduce the size of your .text segment by about X500 bytes. X.IP -DNO_MODELINES XThis removes all support for modelines. X.IP -DNO_TAG XThis disables tag lookup. XIt reduces the size of the .text segment by about 750 bytes. X.IP "-DNO_ALT_FKEY -DNO_CTRL_FKEY -DNO_SHIFT_FKEY -DNO_FKEY" XThese remove explicit support of function keys. X-DNO_ALT_FKEY removes support for the versions function keys. X-DNO_CTRL_FKEY removes support for the and versions function keys. X-DNO_SHIFT_FKEY removes support for the , , and versions function keys. X-DNO_FKEY removes all support of function keys. X.IP X\*E's ":map" command normally allows you to use the special sequence "#" Xto map function key . XFor example, ":map #1 {!}fmt^M" will cause the key to reformat a paragraph. X\*E checks the :k1=: field in the termcap description of your terminal Xto figure out what code is sent by the key. XThis is handy because it allows you to create a .exrc file which maps function Xkeys the same way regardless of what type of terminal you use. X.IP XThat behaviour is standard; most implementations of the real vi supports it too. X\*E extends this to allow you to use "#1s" to refer to +, X"#1c" to refer to +, and X"#1a" to refer to +. XThe termcap description for the terminal should have fields named X:s1=:c1=:a1=: respectively, to define the code sent by these key conbinations. X(You should also have :k2=:s2=:c2=:a2=: for the key, and so on.) X.IP XBut there may be problems. XThe terminfo database doesn't support :s1=:c1=:a1=:, so no terminfo terminal Xdescription could ever support shift/control/alt function keys; Xso you might as well add -DNO_SHIFT_FKEY to CFLAGS if you're using terminfo. X.IP XNote that, even if you have -DNO_FKEYS, you can still configure \*E to use Xyour function keys my mapping the literal character codes sent by the key. XYou just couldn't do it in a terminal-independent way. XTERM_925 X.IP "-DTERM_AMIGA -DTERM_VT100 -DTERM_VT52 etc." XThe tinytcap.c file contains descriptions of several terminal types. XFor each system that uses tinytcap, a reasonable subset of the available Xdescriptions is actually compiled into \*E. XIf you wish to enlarge this subset, then you can add the appropriate -DTERM_XXX Xflag to your CFLAGS settings. X.IP XFor a list of the available terminal types, check the tinytcap.c file. X.IP -DINTERNAL_TAGS XNormally, \*E uses the "ref" program to perform tag lookup. XThis is more powerful than the real vi's tag lookup, Xbut it can be much slower. X.IP XIf you add -DINTERNAL_TAGS to your CFLAGS setting, Xthen \* will use its own internal tag lookup code, which is faster. X.IP -DPRSVDIR=\fIdirectory\fR XThis controls where preserved files will be placed. XAn appropriate default has been chosen for each Operating System, Xso you probably don't need to worry about it. X.IP -DFILEPERMS=\fInumber\fR XThis affects the attributes of files that are created by \*E; Xit is used as the second argument to the creat() function. XThe default is 0666 which (on UNIX systems at least) means that Xanybody can read or write the new file, but nobody can execute it. XOn UNIX systems, the creat() call modifies this via the umask setting. X.IP -DKEYBUFSIZE=\fInumber\fR XThis determines the size of the type-ahead buffer that elvis uses. XIt also limits the size of keymaps that it can handle. XThe default is 1000 characters, which should be plenty. / echo x - cutbufs.ms sed '/^X/s///' > cutbufs.ms << '/' X.Go 6 "CUT BUFFERS" X.PP XWhen \*E deletes text, it stores that text in a cut buffer. XThis happens in both visual mode and EX mode. XThere is no practical limit to how much text a cut buffer can hold. X.PP XThere are 36 cut buffers: X26 named buffers ("a through "z), X9 anonymous buffers ("1 through "9), Xand 1 extra cut buffer (".). X.PP XIn EX mode, the :move and :copy commands use a cut buffer to temporarily Xhold the text to be moved/copied. X.NH 2 XPutting text into a Cut Buffer X.PP XIn visual mode, text is copied into a cut buffer when you use the Xd, y, c, C, s, or x commands. XThere are also a few others. X.PP XBy default, the text goes into the "1 buffer. XThe text that used to be in "1 gets shifted into "2, X"2 gets shifted into "3, and so on. XThe text that used to be in "9 is lost. XThis way, the last 9 things you deleted are still accessible. X.PP XYou can also put the text into a named buffer -- "a through "z. XTo do this, you should type the buffer's name X(two keystrokes: a double-quote and a lowercase letter) Xbefore the command that will cut the text. XWhen you do this, "1 through "9 are not affected by the cut. X.PP XYou can append text to one of the named buffers. XTo do this, type the buffer's name in uppercase X(a double-quote and an uppercase letter) Xbefore the d/y/c/C/s/x command. X.PP XThe ". buffer is special. XIt isn't affected by the d/y/c/C/s/x command. XInstead, it stores the text that you typed in Xthe last time you were in input mode. XIt is used to implement the . visual command, Xand ^A in input mode. X.PP XIn EX mode (also known as colon mode), Xthe :delete, :change, and :yank commands all copy text into a cut buffer. XLike the visual commands, these EX commands normally use the "1 buffer, Xbut you can use one of the named buffers by giving its name after the command. XFor example, X.sp 1 X.ti +0.5i X:20,30y a X.sp X.LP Xwill copy lines 20 through 30 into cut buffer "a. X.PP XYou can't directly put text into the ". buffer, or the "2 through "9 buffers. X.NH 2 XPasting from a Cut Buffer X.PP XThere are two styles of pasting: Xline-mode and character-mode. XIf a cut buffer contains whole lines (from a command like "dd") Xthen line-mode pasting is used; Xif it contains partial lines (from a command like "dw") Xthen character-mode pasting is used. XThe EX commands always cut whole lines. X.PP XCharacter-mode pasting causes the text to be inserted into the line that Xthe cursor is on. X.PP XLine-mode pasting inserts the text on a new line above or below the line Xthat the cursor is on. XIt doesn't affect the cursor's line at all. X.PP XIn visual mode, the p and P commands insert text from a cut buffer. XUppercase P will insert it before the cursor, Xand lowercase p will insert it after the cursor. XNormally, these commands will paste from the "1 buffer, but you can Xspecify any other buffer to paste from. XJust type its name (a double-quote and another character) Xbefore you type the P or p. X.PP XIn EX mode, the (pu)t command pastes text after a given line. XTo paste from a buffer other that "1, Xenter its name after the command. X.NH 2 XMacros X.PP XThe contents of a named cut buffer can be executed as a series of Xex/vi commands. X.PP XTo put the instructions into the cut buffer, you must first insert Xthem into the file, and then delete them into a named cut buffer. X.PP XTo execute a cut buffer's contents as EX commands, Xyou should give the EX command "@" and the name of the buffer. XFor example, :@z will execute "z as a series of EX commands. X.PP XTo execute a cut buffer's contents as visual commands, Xyou should give the visual command "@" and the letter of the buffer's name. XThe visual "@" command is different from the EX "@" command. XThey interpret the cut buffer's contents differently. X.PP XThe visual @ command can be rather finicky. XEach character in the buffer is interpretted as a keystroke. XIf you load the instructions into the cut buffer via a "zdd command, Xthen the newline character at the end of the line will be executed just Xlike any other character, so the cursor would be moved down 1 line. XIf you don't want the cursor to move down 1 line at the end of each X@z command, then you should load the cut buffer by saying 0"zD instead. X.PP XAlthough cut buffers can hold any amount of text, X\*E can only \fIexecute\fR small buffers. XThe size limit is roughly 1000 characters, for either EX macros or VI macros. XIf a buffer is too large to execute, an error message is displayed. X.PP XYou can't nest :@ commands. XYou can't run :@ commands from your .exrc file, Xor any other :source file either. XSimilarly, you can't run a :source command from within an @ command. XHopefully, these restrictions will be lifted in a later version. X.NH 2 XThe Effect of Switching Files X.PP XWhen \*E first starts up, all cut buffers are empty. XWhen you switch to a different file X(via the :n or :e commands perhaps) Xthe 9 anonymous cut buffers are emptied again, Xbut the other 27 buffers ("a through "z, and ".) retain their text. / echo x - differ.ms sed '/^X/s///' > differ.ms << '/' X.Go 7 "DIFFERENCES BETWEEN \*E & BSD VI/EX" X.PP X\*E is not 100% compatible with the real vi/ex. X\*E has many small extensions, some omissions, and a few features which Xare implemented in a slightly different manner. X.NH 2 XExtensions X.IP "Save Configuration" 1i XThe :mkexrc command saves the current :set and :map configurations in Xthe ".exrc" file in your current directory. X.IP "Previous File" 1i XThe :N or :prev command moves backwards through the args list. X.IP "Center Current Row" 1i XIn visual command mode, the (lowercase) "zz" command will center the current Xline on the screen, like "z=". X.IP "Changing Repeat Count" 1i XThe default count value for . is the same as the previous command Xwhich . is meant to repeat. XHowever, you can supply a new count if you wish. XFor example, after "3dw", "." will delete 3 words, Xbut "5." will delete 5 words. X.IP "Previous Text" 1i XThe text which was most recently input X(via a "cw" command, or something similar) Xis saved in a cut buffer called ". (which Xis a pretty hard name to write in an English sentence). X.IP "Keyword Lookup" 1i XIn visual command mode, you can move the cursor onto a word and press Xshift-K to have \*E run a reference program to look that word up. XThis command alone is worth the price of admission! XSee the ctags and ref programs. X.IP "Increment/Decrement" 1i XIn visual command mode, you can move the cursor onto a number and Xthen hit ## or #+ to increment that number by 1. XTo increment it by a larger amount, Xtype in the increment value before hitting the initial #. XThe number can also be decremented or set by hitting #- or #=, respectively. X.IP "Input Mode" 1i XYou can backspace past the beginning of the line. X.IP "" 1i XThe arrow keys work in input mode. X.IP "" 1i XIf you type control-A, then the text that you input last time is inserted. XYou will remain in input mode, so you can backspace over part of it, Xor add more to it. X(This is sort of like control-@ on the real vi, Xexcept that control-A really works.) X.IP "" 1i XControl-P will insert the contents of the cut buffer. X.IP "" 1i XReal vi can only remember up to 128 characters of input, Xbut \*E can remember any amount. X.IP "" 1i XThe ^T and ^D keys can adjust the indent of a line no matter where Xthe cursor happens to be in that line. X.IP "" 1i XYou can save your file and exit \*E directly from input mode by hitting Xcontrol-Z twice. X.IP "" 1i X\*E supports digraphs as a way to enter non-ASCII characters. X.IP "Start in Input Mode" 1i XIf you ":set inputmode" in your .exrc file, then \*E will start up in Xinput mode instead of visual command mode. X.IP "Visible Fonts" 1i XWith ":set charattr", \*E can display "backslash-f" style character attributes on the Xscreen as you edit. XThe following example shows the recognized atributes: X.sp X.ti +0.5i Xnormal \\fBboldface\\fR \\fIitalics\\fR \\fUunderlined\\fR normal X.sp XNOTE: you must compile \*E without the -DNO_CHARATTR flag for Xthis to work. X.IP "File Syncing" 1i XAfter a crash, you can usually recover the altered form of the file Xfrom the temporary file that \*E uses -- unless the temporary file was Xcorrupted. X.IP "" 1i XUNIX systems use a delayed-write cache, which means that when \*E tries to Xwrite to the temporary file, the information might still be in RAM instead Xof on the disk. XA power failure at that time would cause the in-RAM information to be lost. XUNIX's sync() call will force all such information to disk. X.IP "" 1i XMS-DOS and Atari TOS don't write a file's length to disk until that file Xis closed. XConsequently, the temporary file would appear to be 0 bytes long if power Xfailed when we were editing. XTo avoid this problem, a sync() function has been written which will close Xthe temporary file and then immediately reopen it. X.IP "Cursor Shape" 1i X\*E changes the shape of the cursor to indicate which mode you're in, Xif your terminal's termcap entry includes the necessary capabilities. X.IP "Hide nroff Lines" 1i XTh ":set hideformat" option hides nroff format control lines. X(They are displayed on the screen as blank lines.) X.ne 7 X.IP "Compiler Interface" 1i X\*E is clever enough to parse the error messages emitted by many compilers. XTo use this feature, Xyou should collect your compiler's error messages into a file called "errlist"; X\*E will read this file, Xdetermine which source file caused the error messages, Xstart editing that file, Xmove the cursor to the line where the error was detected, Xand display the error message on the status line. XNifty! X.IP "Visible Text Selection" 1i XIn visual command mode, 'v' starts visibly selecting characters and X\&'V' starts visibly selecting whole lines. XThe character or line where the cursor is located becomes one Xendpoint of the selection. XYou can then use the standard cursor movement commands to move the cursor Xto the other endpoint, and then press one of the operator commands X(c/d/y//!/=/\\). XThe operator will then immediately be applied to the selected text. X.IP "Pop-up Menu Operator" 1i XThe '\\' key is a new operator, Xsimilar in operation to the c/d/y//! operators XIt conjures up a menu, from which you can select any of the other Xoperators plus a few other common commands. X.IP "Preset Filter Operator" 1i XThe '=' key is another new operator. XIt is similar to the '!' operator, except that while X\&'!' asks you to type in a filter command each time, X\&'=' assumes it should always run the command stored in the \fIequalprg\fR option. X.IP "Move to a Given Percentage" 1i XThe '%' movement key can now accept an optional count. XWithout a count, the '%' key still moves to a matching parenthesis Xlike it always did. XWith a count somewhere between 1 and 100, though, it moves the cursor to Xapproximately a given percentage of the way through the file. XFor example, typing "50%" will move the cursor to the middle of the file. X.IP "Regular Expressions" XIn regular expressions, several new forms of closure operators are supported: X\\{\fIn\fR}, \\{\fIn\fR,\fIm\fR}, \\+, and \\?. X.NH 2 XOmissions X.PP XThe replace mode is a hack. XIt doesn't save the text that it overwrites. X.PP XLong lines are displayed differently -- where the real vi would Xwrap a long line onto several rows of the screen, \*E simply Xdisplays part of the line, and allows you to scroll the screen Xsideways to see the rest of it. X.PP XThe ":preserve" and ":recover" commands are missing. XSo is the -r flag. XI've never had a good reason to use ":preserve", Xand since ":recover" is used so rarely XI decided to implement it as a separate program. XThere's no need to load the recovery code into memory every Xtime you edit a file, I figured. X.PP XLISP support is missing. XHowever, the = key is still an operator that reformats lines of text. XBy default, it reformats lines by sending them through the \fIfmt\fP filter, Xbut you could write your own LISP beautifier and configure elvis to use it. XKey mappings could take care of most other differences. XAuto-indent is the only thing that is irrecoverably lost. X.PP XAutoindent mode acts a little different from the real vi, anyway. XIt doesn't handle ^^D or 0^D correctly. XOn the other hand, it \fIdoes\fP allow ^D and ^T to be used anywhere in the Xline, to adjust the indentation for the whole line. / echo x - environ.ms sed '/^X/s///' > environ.ms << '/' X.Go 11 "ENVIRONMENT VARIABLES" X.PP X\*E examines several environment variables when it starts up. XThe values of these variables are used internally for a variety Xof purposes. XYou don't need to define all of these; Xon most systems, \*E only requires TERM to be defined. XOn AmigaDOS, MS-DOS or TOS systems, even that is optional. X.SH XTERM, TERMCAP X.PP XTERM tells \*E the name of the termcap entry to use. XTERMCAP may contain either the entire termcap entry, Xor the full pathname of the termcap file to search through. X.PP XIf your version of \*E is using tinytcap instead of the full termcap library, Xthen the value of TERMCAP \fIcannot\fR contain any backslash escapes (\\E, \\r, etc.) Xor carat escapes (^[, ^M, etc.), because tinytcap doesn't understand them. XInstead, you should embed the actual control character into the string. X.SH XTMP, TEMP X.PP XThese only work for AmigaDOS, MS-DOS and Atari TOS. XEither of these variables may be used to set the "directory" option, Xwhich controls where temporary files are stored. XIf you define them both, then TMP is used, and TEMP is ignored. X.SH XLINES, COLUMNS X.PP XThe termcap entry for your terminal should specify the size of your screen. XIf you're using a windowing interface, then there is an ioctl() call which Xwill provide the size of the window; the ioctl() values will override the Xvalues in the termcap entry. XThe LINES and COLUMNS environment variables (if defined) Xwill override either of these sources. XThey, in turn, can be overridden by a ":set" command. X.PP XNormally, the LINES and COLUMNS variables shouldn't need to be defined. X.SH XEXINIT X.PP XThis variable's value may contain one or more colon-mode commands, Xwhich will be executed after all of the ".exrc" files Xbut before interactive editing begins. X.PP XTo put more than one command in EXINIT, you can separate the commands Xwith either a newline or a '|' character. X.SH XSHELL, COMSPEC X.PP XYou can use COMSPEC in MS-DOS, or SHELL in any other system, Xto specify which shell should be used for executing commands and Xexpanding wildcards. X.SH XHOME X.PP XThis variable should give the full pathname of your home directory. X\*E needs to know the name of your home directory so it can locate Xthe ".exrc" file there. X.SH XTAGPATH X.PP XThis variable is used by the "ref" program. XIt contains a list of directories that might contain a relevent "tags" file. XUnder AmigaDOS, MS-DOS or Atari TOS, the names of the directories should be separated by Xsemicolons (";"). XUnder other operating systems, the names should be separated by colons (":"). X.PP XIf you don't define TAGPATH, then "ref" will use a default list which includes Xthe current directory and a few other likely places. XSee the definition of DEFTAGPATH at the start of ref.c for an accurate list. / echo x - ex.ms sed '/^X/s///' > ex.ms << '/' X.Go 3 "COLON MODE COMMANDS" X.ID X.ps X.in 0.8i X.ta 2i 3.i X.\" NOTE: The following macro is used to output a single line of the X.\" command chart. Its usage is: X.\" X.\" .Cm ... X.\" X.de Cm X.if "\\$1"0" \t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 X.if "\\$1"1" \s-2[line]\s+2\t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 X.if "\\$1"2" \s-2[line][,line]\s+2\t\\$2\t\\$3 \\$4 \\$5 \\$6 \\$7 \\$8 \\$9 X.. X.if t .ds Q `` X.if t .ds U '' X.if n .ds Q " X.if n .ds U " X\s+2LINES COMMAND ARGUMENTS\s-2 X.Cm 0 ab[br] [short] [expanded form] X.Cm 1 a[ppend][!] X.Cm 0 ar[gs] [files] X.Cm 0 cc [files] X.Cm 0 cd[!] [directory] X.Cm 2 c[hange] X.Cm 0 chd[ir][!] [directory] X.Cm 2 co[py] line X.Cm 0 col[or] [when] [[\*Qlight\*U] color] [\*Qon\*U color] X.Cm 2 d[elete] [\*Ux] X.Cm 0 dig[raph][!] [XX [Y]] X.Cm 0 e[dit][!] [file] X.Cm 0 er[rlist][!] [errlist] X.Cm 0 f[ile] [file] X.Cm 2 g[lobal] /regexp/ command X.Cm 1 i[nsert] X.Cm 2 j[oin][!] X.Cm 2 l[ist] X.Cm 0 mak[e] [target] X.Cm 0 map[!] key mapped_to X.Cm 1 ma[rk] \*Ux X.Cm 0 mk[exrc] X.Cm 2 m[ove] line X.Cm 0 n[ext][!] [files] X.Cm 0 N[ext][!] X.Cm 2 nu[mber] X.Cm 2 p[rint] X.Cm 1 pu[t] [\*Ux] X.Cm 0 q[uit][!] X.Cm 1 r[ead] file X.Cm 0 rew[ind][!] X.Cm 0 se[t] [options] X.Cm 0 so[urce] file X.Cm 2 s[ubstitute] /regexp/replacement/[p][g][c] X.Cm 0 ta[g][!] tagname X.Cm 0 una[bbr] [short] X.Cm 0 u[ndo] X.Cm 0 unm[ap][!] key X.Cm 0 ve[rsion] X.Cm 2 v[global] /regexp/ command X.Cm 0 vi[sual] [filename] X.Cm 0 wq X.Cm 2 w[rite][!] [[>>]file] X.Cm 0 x[it][!] X.Cm 2 y[ank] [\*Ux] X.Cm 2 ! command X.Cm 2 < X.Cm 2 = X.Cm 2 > X.Cm 2 & X.Cm 0 @ "" \*Ux X.DE X.TA X.PP XTo use colon mode commands, you must switch from visual command Xmode to colon command mode. XThe visual mode commands to do this are ":" for a single colon command, Xor "Q" for many colon mode commands. X.NH 2 XLine Specifiers X.PP XLine specifiers are always optional. XThe first line specifier of most commands usually defaults to the current line. XThe second line specifier usually defaults to be the same Xas the first line specifier. XExceptions are :write, :global, and :vglobal, which act on all lines of the Xfile by default, and :!, which acts on no lines by default. X.PP XLine specifiers consist of an absolute part and a relative part. XThe absolute part of a line specifier may be either an explicit line number, Xa mark, a dot to denote the current line, a dollar sign to denote the last Xline of the file, or a forward or backward search. X.PP XAn explicit line number is simply a decimal number, expressed as a Xstring of digits. X.PP XA mark is typed in as an apostrophe followed by a letter. XMarks must be set before they can be used. XYou can set a mark in visual command mode by typing "m" and a letter, Xor you can set it in colon command mode via the "mark" command. X.PP XA forward search is typed in as a regular expression surrounded by Xslash characters; searching begins at the default line. XA backward search is typed in as a regular expression surrounded by Xquestion marks; searching begins at the line before the default line. X.PP XIf you omit the absolute part, then the default line is used. X.PP XThe relative part of a line specifier is typed as a "+" or "-" character Xfollowed by a decimal number. XThe number is added to or subtracted from the absolute part Xof the line specifier to produce the final line number. X.PP XAs a special case, the % character may be used to specify all lines of the file. XIt is roughly equivelent to saying 1,$. XThis can be a handy shortcut. X.PP XSome examples: X.LD X.ps X.ta 0.5i 1.8i X :p print the current line X :37p print line 37 X :'gp print the line which contains mark g X :/foo/p print the next line that contains "foo" X :$p print the last line of the file X :20,30p print lines 20 through 30 X :1,$p print all lines of the file X :%p print all lines of the file X :/foo/-2,+4p print 5 lines around the next "foo" X.TA X.DE X.NH 2 XText Entry Commands X.if n .ul 0 X.ID X.ps X[line] append X[line][,line] change ["x] X[line] insert X.DE X.PP XThe \fBa\fRppend command inserts text after the specified line. X.PP XThe \fBi\fRnsert command inserts text before the specified line. X.PP XThe \fBc\fRhange command copies the range of lines into a cut buffer, Xdeletes them, and inserts new text where the old text used to be. X.PP XFor all of these commands, you indicate the end of the text you're Xinserting by hitting ^D or by entering a line which contains only a Xperiod. X.NH 2 XCut & Paste Commands X.if n .ul 0 X.ID X.ps X[line][,line] delete ["x] X[line][,line] yank ["x] X[line] put ["x] X[line][,line] copy line X[line][,line] to line X[line][,line] move line X.DE X.PP XThe \fBd\fRelete command copies the specified range of lines into a Xcut buffer, and then deletes them. X.PP XThe \fBy\fRank command copies the specified range of lines into a cut Xbuffer, but does *not* delete them. X.PP XThe \fBpu\fRt command inserts text from a cut buffer after the Xspecified line. X.PP XThe \fBco\fRpy and \fBt\fRo commands yank the specified range of lines and Xthen immediately paste them after some other line. X.PP XThe \fBm\fRove command deletes the specified range of lines and then Ximmediately pastes them after some other line. XIf the destination line comes after the deleted text, Xthen it will be adjusted automatically to account for the deleted lines. X.NH 2 XDisplay Text Commands X.if n .ul 0 X.ID X.ps X[line][,line] print X[line][,line] list X[line][,line] number X.DE X.PP XThe \fBp\fRrint command displays the specified range of lines. X.PP XThe \fBnu\fRmber command displays the lines, with line numbers. X.PP XThe \fBl\fRist command also displays them, but it is careful to make Xcontrol characters visible. X.NH 2 XGlobal Operations Commands X.if n .ul 0 X.ID X.ps X[line][,line] global /regexp/ command X[line][,line] vglobal /regexp/ command X.DE X.PP XThe \fBg\fRlobal command searches through the lines of the specified range X(or through the whole file if no range is specified) Xfor lines that contain a given regular expression. XIt then moves the cursor to each of these lines and Xruns some other command on them. X.PP XThe \fBv\fRglobal command is similar, but it searches for lines that \fIdon't\fR Xcontain the regular expression. X.NH 2 XLine Editing Commands X.if n .ul 0 X.ID X.ps X[line][,line] join[!] X[line][,line] ! program X[line][,line] < X[line][,line] > X[line][,line] substitute /regexp/replacement/[p][g][c] X[line][,line] & X.DE X.PP XThe \fBj\fRoin command catenates all lines in the specified range together Xto form one big line. XIf only a single line is specified, then the following line is catenated Xonto it. XThe normal ":join" inserts one or two spaces between the lines; Xthe ":join!" variation (with a '!') doesn't insert spaces. X.PP XThe \fB!\fR command runs an external filter program, Xand feeds the specified range of lines to it's stdin. XThe lines are then replaced by the output of the filter. XA typical example would be ":'a,'z!sort" to sort the lines 'a,'z. X.PP XThe \fB<\fR and \fB>\fR commands shift the specified range of lines left or right, Xnormally by the width of 1 tab character. XThe "shiftwidth" option determines the shifting amount. X.PP XThe \fBs\fRubstitute command finds the regular expression in each line, Xand replaces it with the replacement text. XThe "p" option causes the altered lines to be printed. XThe "g" option permits all instances of the regular expression Xto be found & replaced. X(Without "g", only the first occurrence in each line is replaced.) XThe "c" option asks for confirmation before each substitution. X.PP XThe \fB&\fR command repeats the previous substitution command. XActually, "&" is equivelent to "s//~/" with the same options as last time. XIt searches for the last regular expression that you specified for any purpose, Xand replaces it with the the same text Xthat was used in the previous substitution. X.NH 2 XUndo Command X.if n .ul 0 X.ID X.ps Xundo X.DE X.PP XThe \fBu\fRndo command restores the file to the state it was in before Xyour most recent command which changed text. X.NH 2 XConfiguration & Status Commands X.if n .ul 0 X.ID X.ps Xmap[!] [key mapped_to] Xunmap[!] key Xabbr [word expanded_form_of_word] Xunabbr word Xdigraph[!] [XX [Y]] Xset [options] Xmkexrc X[line] mark "x Xvisual Xversion X[line][,line] = Xfile [file] Xsource file X@ "x Xcolor [when] [["light"] color] ["on" color] X.DE X.PP XThe \fBma\fRp command allows you to configure \*E to recognize your function keys, Xand treat them as though they transmitted some other sequence of characters. XNormally this mapping is done only when in the visual command mode, Xbut with the [!] present it will map keys under input and replace modes as well. XWhen this command is given with no arguments, Xit prints a table showing all mappings currently in effect. XWhen called with two arguments, the first is the sequence that your Xfunction key really sends, and the second is the sequence that you want X\*E to treat it as having sent. XAs a special case, if the first argument is a number then \*E will map the Xcorresponding function key; Xfor example, ":map 7 dd" will cause the key to delete a line. X.PP XThe \fBunm\fRap command removes key definitions that were made via the map command. X.PP XThe \fBab\fRbr command is used to define/list a table of abbreviations. XThe table contains both the abbreviated form and the fully spelled-out form. XWhen you're in visual input mode, and you type in the abbreviated form, X\*E will replace the abbreviated form with the fully spelled-out form. XWhen this command is called without arguments, it lists the table; Xwith two or more arguments, the first argument is taken as the abbreviated Xform, and the rest of the command line is the fully-spelled out form. X.PP XThe \fBuna\fRbbr command deletes entries from the abbr table. X.PP XThe \fBdi\fRgraph command allows you to display the set of digraphs that \*E is Xusing, or add/remove a digraph. XTo list the set of digraphs, use the digraph command with no arguments. XTo add a digraph, you should give the digraph command two arguments. XThe first argument is the two ASCII characters that are to be combined; Xthe second is the non-ASCII character that they represent. XThe non-ASCII character's most significant bit is automatically set by the Xdigraph command, unless to append a ! to the command name. XRemoval of a digraph is similar to adding a digraph, except that you should Xleave off the second argument. X.PP XThe \fBse\fRt command allows you examine or set various options. XWith no arguments, it displays the values of options that have been changed. XWith the single argument "all" it displays the values of all options, Xregardless of whether they've been explicitly set or not. XOtherwise, the arguments are treated as options to be set. X.PP XThe \fBmk\fRexrc command saves the current configuration to a file Xcalled ".exrc" in the current directory. X.PP XThe mar\fBk\fR command defines a named mark to refer to a specific place Xin the file. XThis mark may be used later to specify lines for other commands. X.PP XThe \fBvi\fRsual command puts the editor into visual mode. XInstead of emulating ex, \*E will start emulating vi. X.PP XThe \fBve\fRrsion command tells you that what version of \*E this is. X.PP XThe \fB=\fR command tells you what line you specified, or, Xif you specified a range of lines, it will tell you both endpoints and Xthe number of lines included in the range. X.PP XThe \fBf\fRile command tells you the name of the file, Xwhether it has been modified, Xthe number of lines in the file, Xand the current line number. XYou can also use it to change the name of the current file. X.PP XThe \fBso\fRurce command reads a sequence of colon mode commands from a file, Xand interprets them. X.PP XThe \fB@\fR command executes the contents of a cut-buffer as EX commands. X.PP XThe \fBcol\fRor command only works under MS-DOS, or if you have an ANSI-compatible Xcolor terminal. XIt allows you to set the foreground and background colors Xfor different types of text: Xnormal, bold, italic, underlined, standout, pop-up menu, and visible selection. XBy default, it changes the "normal" colors; Xto change other colors, the first argument to the :color command should be Xthe first letter of the type of text you want. XThe syntax for the colors themselves is fairly intuitive. XFor example, ":color light cyan on blue" causes normal text to be displayed Xin light cyan on a blue background, and X":color b bright white" causes bold text to be displayed in bright white on Xa blue background. XThe background color always defaults to the current background color of Xnormal text. XYour first :color command \fImust\fP specify both the foreground and background Xfor normal text. X.NH 2 XMultiple File Commands X.if n .ul 0 X.ID X.ps Xargs [files] Xnext[!] [files] XNext[!] Xprevious[!] Xrewind[!] X.DE X.PP XWhen you invoke \*E from your shell's command line, Xany filenames that you give to \*E as arguments are stored in the args list. XThe \fBar\fRgs command will display this list, or define a new one. X.PP XThe \fBn\fRext command switches from the current file to the next one Xin the args list. XYou may specify a new args list here, too. X.PP XThe \fBN\fRext and \fBpre\fRvious commands X(they're really aliases for the same command) Xswitch from the current file to the preceding file in the args list. X.PP XThe \fBrew\fRind command switches from the current file to the first file Xin the args list. X.NH 2 XSwitching Files X.if n .ul 0 X.ID X.ps Xedit[!] [file] Xtag[!] tagname X.DE X.PP XThe \fBe\fRdit command allows to switch from the current file to some other file. XThis has nothing to do with the args list, by the way. X.PP XThe \fBta\fRg command looks up a given tagname in a file called "tags". XThis tells it which file the tag is in, and how to find it in that file. X\*E then switches to the tag's file and finds the tag. X.NH 2 XWorking with a Compiler X.if n .ul 0 X.ID X.ps Xcc [files] Xmake [target] Xerrlist[!] [errlist] X.DE X.PP XThe \fBcc\fR and \fBmak\fRe commands execute your compiler or "make" utility Xand redirect any error messages into a file called "errlist". XBy default, cc is run on the current file. X(You should write it before running cc.) XThe contents of the "errlist" file are then scanned for error messages. XIf an error message is found, then the cursor is moved to the line where Xthe error was detected, Xand the description of the error is displayed on the status line. X.PP XAfter you've fixed one error, the \fBer\fRrlist command will move Xthe cursor to the next error. XIn visual command mode, Xhitting `*' will do this, too. X.PP XYou can also create an "errlist" file from outside of \*E, Xand use "\*E -m" to start elvis and have the cursor moved to the Xfirst error. XNote that you don't need to supply a filename with "\*E -m" because Xthe error messages always say which source file an error is in. X.PP XNote: XWhen you use errlist repeatedly to fix several errors in a single file, Xit will attempt to adjust the reported line numbers to allow for lines Xthat you have inserted or deleted. XThese adjustments are made with the assumption that you will work though Xthe file from the beginning to the end. X.NH 2 XExit Commands X.if n .ul 0 X.ID X.ps Xquit[!] Xwq Xxit X.DE X.PP XThe \fBq\fRuit command exits from the editor without saving your file. X.PP XThe \fBwq\fR command writes your file out, then then exits. X.PP XThe \fBx\fRit command is similar to the \fBwq\fR command, except that X\fBx\fRit won't bother to write your file if you haven't modified it. X.NH 2 XFile I/O Commands X.if n .ul 0 X.ID X.ps X[line] read file X[line][,line] write[!] [[>>]file] X.DE X.PP XThe \fBr\fRead command gets text from another file and inserts it Xafter the specified line. XIt can also read the output of a program; Xsimply precede the program name by a '!' and use it in place of the file name. X.PP XThe \fBw\fRrite command writes the whole file, or just part of it, Xto some other file. XThe !, if present, will permit the lines to be written even if you've set Xthe readonly option. XIf you precede the filename by >> then the lines will be appended to the file. XYou can send the lines to the standard input of a program by replacing the Xfilename with a '!' followed by the command and its arguments. X.PP XNote: Be careful not to confuse ":w!filename" and ":w !command". XTo write to a program, you must have at least one blank before the '!'. X.NH 2 XDirectory Commands X.if n .ul 0 X.ID X.ps Xcd [directory] Xchdir [directory] Xshell X.DE X.PP XThe \fBcd\fR and \fBchd\fRir commands X(really two names for one command) Xswitch the current working directory. X.PP XThe \fBsh\fRell command starts an interactive shell. X.NH 2 XDebugging Commands X.if n .ul 0 X.ID X.ps X[line][,line] debug[!] Xvalidate[!] X.DE X.PP XThese commands are only available if you compile \*E with the -DDEBUG flag. X.PP XThe de\fBb\fRug command lists statistics for the blocks which contain Xthe specified range of lines. XIf the ! is present, then the contents of those blocks is displayed, too. X.PP XThe \fBva\fRlidate command checks certain variables for internal consistency. XNormally it doesn't output anything unless it detects a problem. XWith the !, though, it will always produce *some* output. / echo x - index.ms sed '/^X/s///' > index.ms << '/' X.XS 1 XINTRODUCTION XWhat E\s-2LVIS\s+2 does, XCopyright, XHow to compile E\s-2LVIS\s+2, XOverview X.XA 2 XVISUAL MODE COMMANDS XNormal interactive editing, XInput mode, XArrow keys, XDigraphs, XAbbreviations, XAuto-indentation X.XA 3 XCOLON MODE COMMANDS XLine specifiers, XText entry, XCut & paste, XDisplay text, XGlobal operations, XLine editing, XUndo, XConfiguration & status, XMultiple files, XSwitching files, XWorking with a compiler, XExiting, XFile I/O, XDirectory & shell, XDebugging X.XA 4 XREGULAR EXPRESSIONS XSyntax, XOptions, XSubstitutions, XExamples X.XA 5 XOPTIONS XAutoindent, XAutoprint, Xetc. X.XA 6 XCUT BUFFERS XPutting text into a cut buffer, XPasting from a cut buffer, XMacros, XThe effect of switching files X.XA 7 XDIFFERENCES BETWEEN E\s-2LVIS\s+2 AND THE REAL VI/EX XExtensions, XOmissions X.XA 8 XINTERNAL XFor programmers only, XThe temporary file, XImplementation of editing, XMarks and the cursor, XColon command interpretation, XScreen control, XPortability X.XA 9 XCFLAGS X.XA 10 XTERMCAP X.XA 11 XENVIRONMENT VARIABLES X.XA 12 XVERSIONS X.XA 13 XQUESTIONS & ANSWERS X.XE X.PX X.sp 0.3i X.ce 1 XUNIX-style "man" pages appear at the end of this manual. / echo x - internal.ms sed '/^X/s///' > internal.ms << '/' X.Go 8 "INTERNAL" X.PP XYou don't need to know the material in this section to use \*E. XYou only need it if you intend to modify \*E. X.PP XYou should also check out the CFLAGS, TERMCAP, ENVIRONMENT VARIABLES, XVERSIONS, and QUIESTIONS & ANSWERS sections of this manual. X.NH 2 XThe temporary file X.PP XThe temporary file is divided into blocks of 1024 bytes each. XThe functions in "blk.c" maintain a cache of the five most recently used blocks, Xto minimize file I/O. X.PP XWhen \*E starts up, the file is copied into the temporary file Xby the function \fBtmpstart()\fR in "tmp.c". XSmall amounts of extra space are inserted into the temporary file to Xinsure that no text lines cross block boundaries. XThis speeds up processing and simplifies storage management. XThe extra space is filled with NUL characters. Xthe input file must not contain any NULs, to avoid confusion. XThis also limits lines to a length of 1023 characters or less. X.PP XThe data blocks aren't necessarily stored in sequence. XFor example, it is entirely possible that the data block containing Xthe first lines of text will be stored after the block containing the Xlast lines of text. X.PP XIn RAM, \*E maintains two lists: one that describes the "proper" Xorder of the disk blocks, and another that records the line number of Xthe last line in each block. XWhen \*E needs to fetch a given line of text, it uses these tables Xto locate the data block which contains that line. X.PP XBefore each change is made to the file, these lists are copied. XThe copies can be used to "undo" the change. XAlso, the first list X-- the one that lists the data blocks in their proper order -- Xis written to the first data block of the temp file. XThis list can be used during file recovery. X.PP XWhen blocks are altered, they are rewritten to a \fIdifferent\fR block in the file, Xand the order list is updated accordingly. XThe original block is left intact, so that "undo" can be performed easily. X\*E will eventually reclaim the original block, when it is no longer needed. X.NH 2 XImplementation of Editing X.PP XThere are three basic operations which affect text: X.ID X\(bu delete text - delete(from, to) X\(bu add text - add(at, text) X\(bu yank text - cut(from, to) X.DE X.PP XTo yank text, all text between two text positions is copied into a cut buffer. XThe original text is not changed. XTo copy the text into a cut buffer, Xyou need only remember which physical blocks that contain the cut text, Xthe offset into the first block of the start of the cut, Xthe offset into the last block of the end of the cut, Xand what kind of cut it was. X(Cuts may be either character cuts or line cuts; Xthe kind of a cut affects the way it is later "put".) XYanking is implemented in the function \fBcut()\fR, Xand pasting is implemented in the function \fBpaste()\fR. XThese functions are defined in "cut.c". X.PP XTo delete text, you must modify the first and last blocks, and Xremove any reference to the intervening blocks in the header's list. XThe text to be deleted is specified by two marks. XThis is implemented in the function \fBdelete()\fR. X.PP XTo add text, you must specify Xthe text to insert (as a NUL-terminated string) Xand the place to insert it (as a mark). XThe block into which the text is to be inserted may need to be split into Xas many as four blocks, with new intervening blocks needed as well... Xor it could be as simple as modifying a single block. XThis is implemented in the function \fBadd()\fR. X.PP XThere is also a \fBchange()\fR function, Xwhich generally just calls delete() and add(). XFor the special case where a single character is being replaced by another Xsingle character, though, change() will optimize things somewhat. XThe add(), delete(), and change() functions are all defined in "modify.c". X.PP XThe \fBinput()\fR function reads text from a user and inserts it into the file. XIt makes heavy use of the add(), delete(), and change() functions. XIt inserts characters one at a time, as they are typed. X.PP XWhen text is modified, an internal file-revision counter, called \fBchanges\fR, Xis incremented. XThis counter is used to detect when certain caches are out of date. X(The "changes" counter is also incremented when we switch to a different file, Xand also in one or two similar situations -- all related to invalidating caches.) X.NH 2 XMarks and the Cursor X.PP XMarks are places within the text. XThey are represented internally as 32-bit values which are split Xinto two bitfields: Xa line number and a character index. XLine numbers start with 1, and character indexes start with 0. XLines can be up to 1023 characters long, so the character index is 10 bits Xwide and the line number fills the remaining 22 bits in the long int. X.PP XSince line numbers start with 1, Xit is impossible for a valid mark to have a value of 0L. X0L is therefore used to represent unset marks. X.PP XWhen you do the "delete text" change, any marks that were part of Xthe deleted text are unset, and any marks that were set to points Xafter it are adjusted. XMarks are adjusted similarly after new text is inserted. X.PP XThe cursor is represented as a mark. X.NH 2 XColon Command Interpretation X.PP XColon commands are parsed, and the command name is looked up in an array Xof structures which also contain a pointer to the function that implements Xthe command, and a description of the arguments that the command can take. XIf the command is recognized and its arguments are legal, Xthen the function is called. X.PP XEach function performs its task; this may cause the cursor to be Xmoved to a different line, or whatever. X.NH 2 XScreen Control X.PP XIn input mode or visual command mode, Xthe screen is redrawn by a function called \fBredraw()\fR. XThis function is called in the getkey() function before each keystroke is Xread in, if necessary. X.PP XRedraw() write to the screen via a package which looks like the "curses" Xlibrary, but isn't. XIt is actually much simpler. XMost curses operations are implemented as macros which copy characters Xinto a large I/O buffer, which is then written with a single large Xwrite() call as part of the refresh() operation. X.PP X(Note: Under MS-DOS, the pseudo-curses macros check to see whether you're Xusing the pcbios interface. If you are, then the macros call functions Xin "pc.c" to implement screen updates.) X.PP XThe low-level functions which modify text (namely add(), delete(), and change()) Xsupply redraw() with clues to help redraw() decide which parts of the Xscreen must be redrawn. XThe clues are given via a function called \fBredrawrange()\fR. X.PP XMost EX commands use the pseudo-curses package to perform their output, Xlike redraw(). X.PP XThere is also a function called \fBmsg()\fR which uses the same syntax as printf(). XIn EX mode, msg() writes message to the screen and automatically adds a Xnewline. XIn VI mode, msg() writes the message on the bottom line of the screen Xwith the "standout" character attribute turned on. X.NH 2 XOptions X.PP XFor each option available through the ":set" command, X\*E contains a character array variable, named "o_\fIoption\fR". XFor example, the "lines" option uses a variable called "o_lines". X.PP XFor boolean options, the array has a dimension of 1. XThe first (and only) character of the array will be NUL if the Xvariable's value is FALSE, and some other value if it is TRUE. XTo check the value, just by dereference the array name, Xas in "if (*o_autoindent)". X.PP XFor number options, the array has a dimension of 3. XThe array is treated as three unsigned one-byte integers. XThe first byte is the current value of the option. XThe second and third bytes are the lower and upper bounds of that Xoption. X.PP XFor string options, the array usually has a dimension of about 60 Xbut this may vary. XThe option's value is stored as a normal NUL-terminated string. X.PP XAll of the options are declared in "opts.c". XMost are initialized to their default values; Xthe \fBinitopts()\fR function is used to perform any environment-specific Xinitialization. X.NH 2 XPortability X.PP XTo improve portability, \*E collects as many of the system-dependent Xdefinitions as possible into the "config.h" file. XThis file begins with some preprocessor instructions which attempt to Xdetermine which compiler and operating system you have. XAfter that, it conditionally defines some macros and constants for your system. X.PP XOne of the more significant macros is \fBttyread()\fR. XThis macro is used to read raw characters from the keyboard, possibly Xwith timeout. XFor UNIX systems, this basically reads bytes from stdin. XFor MSDOS, TOS, and OS9, ttyread() is a function defined in curses.c. XThere is also a \fBttywrite()\fR macro. X.PP XThe \fBtread()\fR and \fBtwrite()\fR macros are versions of read() and write() that are Xused for text files. XOn UNIX systems, these are equivelent to read() and write(). XOn MS-DOS, these are also equivelent to read() and write(), Xsince DOS libraries are generally clever enough to convert newline characters Xautomatically. XFor Atari TOS, though, the MWC library is too stupid to do this, Xso we had to do the conversion explicitly. X.PP XOther macros may substitute index() for strchr(), or bcopy() for memcpy(), Xor map the "void" data type to "int", or whatever. X.PP XThe file "tinytcap.c" contains a set of functions that emulate the termcap Xlibrary for a small set of terminal types. XThe terminal-specific info is hard-coded into this file. XIt is only used for systems that don't support real termcap. XAnother alternative for screen control can be seen in Xthe "curses.h" and "pc.c" files. XHere, macros named VOIDBIOS and CHECKBIOS are used to indirectly call Xfunctions which perform low-level screen manipulation via BIOS calls. X.PP XThe stat() function must be able to come up with UNIX-style major/minor/inode Xnumbers that uniquely identify a file or directory. X.PP XPlease try to keep you changes localized, Xand wrap them in #if/#endif pairs, Xso that \*E can still be compiled on other systems. XAnd PLEASE let me know about it, so I can incorporate your changes into Xmy latest-and-greatest version of \*E. / echo x - intro.ms sed '/^X/s///' > intro.ms << '/' X.Go 1 "INTRODUCTION" X.PP X\*E is a clone of vi/ex, the standard UNIX editor. X\*E supports nearly all of the vi/ex commands, Xin both visual mode and colon mode. X.PP XLike vi/ex, \*E stores most of the text in a temporary file, instead of RAM. XThis allows it to edit files that are too large to fit Xin a single process' data space. XAlso, the edit buffer can survive a power failure or crash. X.PP X\*E runs under BSD UNIX, AT&T SysV UNIX, Minix, MS-DOS, Atari TOS, XCoherent, OS9/68000, VMS and AmigaDos. XThe next version is also expected to add MS-Windows, OS/2 and MacOS. XContact me before you start porting it to some other OS, Xbecause somebody else may have already done it for you. X.PP X\*E is freely redistributable, in either source form or executable form. XThere are no restrictions on how you may use it. X.NH 2 XCompiling X.PP XSee the "Versions" section of this manual for instructions on how to compile X\*E. X.PP XIf you want to port \*E to another O.S. or compiler, then Xyou should start be reading the "Portability" part of the "Internal" section. X.NH 2 XOverview of \*E X.PP XThe user interface of \*E/vi/ex is weird. XThere are two major command modes in \*E, and a few text input modes as well. XEach command mode has a command which allows you to switch to the other mode. X.PP XYou will probably use the \fIvisual command mode\fR Xmost of the time. XThis is the mode that \*E normally starts up in. X.PP XIn visual command mode, the entire screen is filled with lines of text Xfrom your file. XEach keystroke is interpretted as part of a visual command. XIf you start typing text, it will \fInot\fR be inserted, Xit will be treated as part of a command. XTo insert text, you must first give an "insert text" command. XThis will take some getting used to. X(An alternative exists. XLookup the "inputmode" option.) X.PP XThe \fIcolon mode\fR is quite different. X\*E displays a ":" character on the bottom line of the screen, as a prompt. XYou are then expected to type in a command line and hit the key. XThe set of commands recognized in the colon mode is different Xfrom visual mode's. / echo x - options.ms sed '/^X/s///' > options.ms << '/' X.Go 5 "OPTIONS" X.PP XOptions may be set or examined via the colon command "set". XThe values of options will affect the operation of later commands. X.PP XFor convenience, options have both a long descriptive name and a short name Xwhich is easy to type. XYou may use either name interchangably. XI like the short names, myself. X.PP XThere are three types of options: Boolean, string, and numeric. XBoolean options are made TRUE by giving the name of the option as an Xargument to the "set" command; Xthey are made FALSE by prefixing the name with "no". XFor example, "set autoindent" makes the autoindent option TRUE, Xand "set noautoindent" makes it FALSE. X\*E also allows boolean options to be toggled by prefixing the name with "neg". XSo, ":map g :set neglist^M" will cause the key to alternately toggle the X"list" option on and off. X(The "neg" prefix is an extension; the real vi doesn't support it.) X.PP XTo change the value of a string or numeric option, pass the "set" command Xthe name of the option, followed by an "=" sign and the option's new value. XFor example, "set tabstop=8" will give the tabstop option a value of 8. XFor string options, you may enclose the new value in quotes. X.LD X.ta 1.9i 2.4i 3.8i X.ps +2 X\fBNAMES TYPE DEFAULT MEANING\fP X.ps Xautoindent, ai Bool noai auto-indent during input Xautoprint, ap Bool ap in EX, print the current line Xautotab, at Bool at auto-indent allowed to use tabs? Xautowrite, aw Bool noaw auto-write when switching files Xbeautify, bf Bool nobf strip control chars from file? Xcharattr, ca Bool noca interpret \\fX sequences? Xcc, cc Str cc="cc -c" name of the C compiler Xcolumns, co Num co=80 width of the screen Xdigraph, dig Bool nodig recognize digraphs? Xdirectory, dir Str dir="/usr/tmp" where tmp files are kept Xedcompatible, ed Bool noed remember ":s//" options Xequalprg, ep Bool ep="fmt" program to run for = operator Xerrorbells, eb Bool eb ring bell on error Xexrc, exrc Bool noexrc read "./.exrc" file? Xexrefresh, er Bool er write lines indiviually in EX Xflash, vbell Bool flash use visible alternative to bell Xflipcase, fc Str fc="" non-ASCII chars flipped by ~ Xhideformat, hf Bool hf hide text formatter commands Xignorecase, ic Bool noic upper/lowercase match in search Xinputmode, im Bool noim start vi in insert mode? Xkeytime, kt Num kt=2 timeout for mapped key entry Xkeywordprg, kp Str kp="ref" full pathname of shift-K prog Xlines, ln Num ln=25 number of lines on the screen Xlist, li Bool noli display lines in "list" mode Xmagic, ma Bool ma use regular expression in search Xmake, mk Str mk="make" name of the "make" program Xmesg, ms Bool ms allow messages from other users? Xmodelines, ml Bool noml are modelines processed? Xmore, more Bool more pause between messages? Xnovice, nov Bool nonovice set options for ease of use Xparagraphs, para Str para="PPppIPLPQP" names of "paragraph" nroff cmd Xprompt, pr Bool pr show ':' prompt in \fIex\fR mode Xreadonly, ro Bool noro prevent overwriting of orig file Xremap, rem Bool remap allow key maps to call key maps Xreport, re Num re=5 report when 5 or more changes Xruler, ru Bool noru display line/column numbers Xscroll, sc Num sc=12 scroll amount for ^U and ^D Xsections, sect Str sect="NHSHSSSEse" names of "section" nroff cmd Xshell, sh Str sh="/bin/sh" full pathname of the shell Xshowmatch, sm Bool nosm show matching ()[]{} Xshowmode, smd Bool nosmd say when we're in input mode Xshiftwidth, sw Num sw=8 shift amount for < and > Xsidescroll, ss Num ss=8 amount of sideways scrolling Xsync, sy Bool nosy call sync() often Xtabstop, ts Num ts=8 width of tab characters Xtaglength, tl Num tl=0 significant chars in tag name Xterm, te Str te="$TERM" name of the termcap entry Xterse, tr Bool notr give shorter error messages Xtimeout, to Bool to distinguish from ? Xwarn, wa Bool wa warn for ! if file modified Xwindow, wi Num wi=24 lines to redraw after long move Xwrapmargin, wm Num wm=0 wrap long lines in input mode Xwrapscan, ws Bool ws at EOF, searches wrap to line 1 Xwriteany, wr Bool nowr allow :w to clobber files X.DE X.TA X.ne 6 X.IP "autoindent, ai" XDuring input mode, the autoindent option will cause each added line Xto begin with the same amount of leading whitespace as the line above it. XWithout autoindent, added lines are initially empty. X.IP "autoprint, ap" XThis option only affects EX mode. XIf the autoprint option on, Xand either the cursor has moved to a different line Xor the previous command modified the file, Xthen \*E will print the current line. X.IP "autotab, at" XThis option affects the behaviour of the autoindent mode. XIf autoindent is turned off, then autotab has no effect. X.IP XWhen autotab is turned on, elvis will use a mixture of spaces and tabs Xto create the proper amount of indentation. XThis is the default. X.IP XWhen autotab is turned off, elvis will only use spaces for auto-indent. X\*E will still insert a real tab character when you hit the key, though; Xthe autotab option only affects \fIautomatic\fR indentation. X.IP "autowrite, aw" XWhen you're editing one file and decide to switch to another X\- via the :tag command, or :next command, perhaps \- Xif your current file has been modified, Xthen \*E will normally print an error message and refuse to switch. X.IP XHowever, if the autowrite option is on, Xthen \*E will write the modified version of the current file Xand successfully switch to the new file. X.IP "beautify, bf" XThis option causes all control characters to be deleted from the text file, Xat the time when you start editing it. XIf you're already editing a file when you turn on the beautify option, Xthen that file won't be affected. X.IP cc XThe :cc command runs the C compiler. XThis option should be set to the name of your compiler. X.IP "charattr, ca" XMany text formatting programs allow you to designate portions of Xyour text to be underlined, italicized, or boldface by embedding Xthe special strings \\fU, \\fI, and \\fB in your text. XThe special string \\fP marks the end of underlined or boldface text. X.IP X\*E normally treats those special strings just like any other text. X.IP XHowever, if the charattr option is on, then \*E will interpret Xthose special strings correctly, Xto display underlined or boldface text on the screen. X(This only works, of course, if your terminal can display Xunderlined and boldface, and if the TERMCAP entry says how to do it.) X.IP "columns, co" XThis option shows how wide your screen is. X.IP "digraph, dig" XThis option is used to enable/disable recognition of digraphs. XThe default value is nodigraph, which means that digraphs will not be Xrecognized. X.IP "directory, dir" X\*E stores text in temporary files. XThis option allows you to control which directory those temporary files will Xappear in. XThe default is /usr/tmp. X.IP XThis option can only be set in a .exrc file; Xafter that, \*E will have already started making temporary files Xin some other directory, so it would be too late. X.IP "edcompatible, ed" XThis option affects the behaviour of the ":s/regexp/text/options" command. XIt is normally off (:se noed) which causes all of the substitution options Xto be off unless explicitly given. X.IP XHowever, with edcompatible on (:se ed), the substitution command remembers Xwhich options you used last time. XThose same options will continue to be used until you change them. XIn edcompatible mode, when you explicitly give the name of a Xsubstitution option, you will toggle the state of that option. X.IP XThis all seems very strange to me, but its implementation was almost free Xwhen I added the ":&" command to repeat the previous substitution, Xso there it is. X.IP "equalprg, ep" XThis holds the name & arguments of the external filter program Xused the the visual = operator. XThe defualt value is "fmt", Xso the = operator will adjust line breaks in text. X.IP "errorbells, eb" X\*E normally rings a bell when you do something wrong. XThis option lets you disable the bell. X.IP exrc XThis option specifies whether a .exrc file in the current directory Xshould be executed. XBy default, this option is off (":set noexrc") which prevents elvis from Xexecuting .exrc in the current directory. XIf the .exrc file in your home directory turns this option on (":set exrc") Xthen the \*E will attempt to execute the .exrc file in the current directory. X.IP XThis option exist mainly for security reasons. XA mean-spirited person could do something like X.br X echo >/tmp/.exrc '!rm -rf $HOME' X.br Xand then anybody who attempted to edit or view a file in the /tmp directory Xwould lose most of their files. XWith the exrc option turned off, this couldn't happen to you. X.IP "exrefresh, er" XThe EX mode of \*E writes many lines to the screen. XYou can make \*E either write each line to the screen separately, Xor save up many lines and write them all at once. X.IP XThe exrefresh option is normally on, so each line is written to the Xscreen separately. X.IP XYou may wish to turn the exrefresh option off (:se noer) if the X"write" system call is costly on your machine, or if you're using a Xwindowing environment. X(Windowing environments scroll text a lot faster when you write Xmany lines at once.) X.IP XThis option has no effect in visual command mode or input mode. X.IP "flash, vbell" XIf your termcap entry describes a visible alternative to ringing Xyour terminal's bell, then this option will say whether the visible Xversion gets used or not. XNormally it will be. X.IP XIf your termcap does NOT include a visible bell capability, Xthen the flash option will be off, and you can't turn it on. X.IP "flipcase, fc" XThe flipcase option allows you to control how the non-ASCII characters are Xaltered by the "~" command. X.IP XThe string is divided into pairs of characters. XWhen "~" is applied to a non-ASCII character, X\*E looks up the character in the flipcase string to see which pair it's in, Xand replaces it by the other character of the pair. X.IP "hideformat, hf" XMany text formatters require you to embed format commands in your text, Xon lines that start with a "." character. X\*E normally displays these lines like any other text, Xbut if the hideformat option is on, Xthen format lines are displayed as blank lines. X.IP "ignorecase, ic" XNormally, when \*E searches for text, it treats uppercase letters Xas being different for lowercase letters. X.IP XWhen the ignorecase option is on, uppercase and lowercase are treated as equal. X.IP "inputmode, im" XThis option allows you to have \*E start up in insert mode. XYou can still exit insert mode at any time by hitting the ESC key, as usual. XUsually, this option would be set in your ".exrc" file. X.IP "keytime, kt" XThe arrow keys of most terminals send a multi-character sequence. XIt takes a measurable amount of time for these sequences to be transmitted. XThe keytime option allows you to control the maximum amount of time Xto allow for an arrow key (or other mapped key) to be received in full. X.IP XOn most systems, the setting is the number of tenths of a second to allow Xbetween characters. XOn some other systems, the setting is in whole seconds. X.IP XTry to avoid setting keytime=1. XMost systems just count clock beats, so if you tried to read a character Xshortly before a clock beat, you could allow almost no time at all for Xreading the characters. XFor higher keytime settings, the difference is less critical. X.IP XIf your system's response time is poor, you might want to increase the keytime. XIn particular, I've found that when keystrokes must be sent through a network X(via X windows, rlogin, or telnet, for example) the keytime should be set to Xat least 1 second. X.IP XAs a special case, Xyou can set keytime to 0 to disable this time limit stuff altogether. XThe big problem here is: XIf your arrow keys' sequences start with an ESC, Xthen every time you hit your ESC key \*E will wait... and wait... Xto see if maybe that ESC was part of an arrow key's sequence. X.IP XNOTE: this option is a generalization of the timeout option of the real vi. X.IP "keywordprg, kp" X\*E has a special keyword lookup feature. XYou move the cursor onto a word, and hit shift-K, Xand \*E uses another program to look up the word Xand display information about it. X.IP XThis option says which program gets run. X.IP XThe default value of this option is "ref", Xwhich is a program that looks up the definition of a function in C. XIt looks up the function name in a file called "refs" which is created by ctags. X.IP XYou can subtitute other programs, such as an English dictionary program Xor the online manual. X\*E runs the program, using the keyword as its only argument. XThe program should write information to stdout. XThe program's exit status should be 0, unless you want \*E to print X"<<< failed >>>". X.IP "lines, ln" XThis option says how many lines you screen has. X.IP "list, li" XIn nolist mode (the default), \*E displays text in a "normal" manner X-- with tabs expanded to an appropriate number of spaces, etc. X.IP XHowever, sometimes it is useful to have tab characters displayed differently. XIn list mode, tabs are displayed as "^I", Xand a "$" is displayed at the end of each line. X.IP "magic, ma" XThe search mechanism in \*E can accept "regular expressions" X-- strings in which certain characters have special meaning. X.IP XThe magic option is normally on, which causes these characters to be treated Xspecially. X.IP XIf you turn the magic option off (:se noma), Xthen all characters except ^ and $ are treated literally. X^ and $ retain their special meanings regardless of the setting of magic. X.IP "make, mk" XThe :make command runs your "make" program. XThis option defines the name of your "make" program. X.IP mesg XWith the real vi, running under real UNIX, X":set nomesg" would prevent other users from sending you messages. X\*E ignores it, though. X.IP "modelines, ml" X\*E supports modelines. XModelines are lines near the beginning or end of your text file which Xcontain "ex:yowza:", Xwhere "yowza" is any EX command. XA typical "yowza" would be something like "set ts=5 ca kp=spell wm=15". XOther text may also appear on a modeline, Xso you can place the "ex:yowza:" in a comment: X.br X.ID X/* ex:set sw=4 ai: */ X.DE X.IP XNormally these lines are ignored, for security reasons, Xbut if you have "set modelines" in your .exrc file Xthen "yowza" is executed. X.IP "novice, nov" XThe command ":set novice" is equivelent to ":set nomagic report=1 showmode". X.IP "paragraphs, pa" XThe { and } commands move the cursor forward or backward in increments Xof one paragraph. XParagraphs may be separated by blank lines, or by a "dot" command of Xa text formatter. XDifferent text formatters use different "dot" commands. XThis option allows you to configure \*E to work with your text formatter. X.IP XIt is assumed that your formatter uses commands that start with a X"." character at the front of a line, Xand then have a one- or two-character command name. X.IP XThe value of the paragraphs option is a string in which each pair Xof characters is one possible form of your text formatter's paragraph Xcommand. X.IP "more" XWhen \*E must display a sequence of messages at the bottom line of the screen Xin visual mode, it normally pauses after all but the last one, so you have Xtime to read them all. X.IP XIf you turn off the "more" option, then \*E will not pause. XThis means you can only read the last message, but it is usually the most Ximportant one anyway. X.IP "prompt, pr" XIf you ":set noprompt", then \*E will no longer emit a ':' when it Xexpects you to type in an \fIex\fR command. XThis is slightly useful if you're using an astonishingly slow UNIX machine, Xbut the rest of us can just ignore this one. X.IP "readonly, ro" XNormally, \*E will let you write back any file to which you have Xwrite permission. XIf you don't have write permission, then you can only write the changed Xversion of the file to a \fIdifferent\fP file. X.IP XIf you set the readonly option, Xthen \*E will pretend you don't have write permission to \fIany\fP file you edit. XIt is useful when you really only mean to use \*E to look at a file, Xnot to change it. XThis way you can't change it accidentally. X.IP XThis option is normally off, unless you use the "view" alias of \*E. X"View" is like "vi" except that the readonly option is on. X.IP "remap" XThe ":map" command allows you to convert one key sequence into another. XThe remap option allows you to specify what should happen if portions of Xthat other sequence are also in the map table. XIf remap is on, then those portions will also be mapped, just as if they Xhad been typed on the keyboard. XIf remap is off, then the matching portions will not be mapped. X.IP XFor example, if you enter the commands ":map A B" and ":map B C", Xthen when remap is on, A will be converted to C. XBut when remap is off, A will be converted only to B. X.IP "report, re" XCommands in \*E may affect many lines. XFor commands that affect a lot of lines, \*E will output a message saying Xwhat was done and how many lines were affected. XThis option allows you to define what "a lot of lines" means. XThe default is 5, so any command which affects 5 or more lines will cause Xa message to be shown. X.IP "ruler, ru" XThis option is normally off. XIf you turn it on, then \*E will constantly display the line/column numbers Xof the cursor, at the bottom of the screen. X.IP "scroll, sc" XThe ^U and ^D keys normally scroll backward or forward by half a screenful, Xbut this is adjustable. XThe value of this option says how many lines those keys should scroll by. XIf you invoke ^U or ^D with a count argument (for example, "33^D") then Xthis option's value is set to the count. X.IP "sections, se" XThe [[ and ]] commands move the cursor backward or forward in increments of X1 section. XSections may be delimited by a { character in column 1 X(which is useful for C source code) Xor by means of a text formatter's "dot" commands. X.IP XThis option allows you to configure \*E to work with your text formatter's X"section" command, in exectly the same way that the paragraphs option makes Xit work with the formatter's "paragraphs" command. X.IP "shell, sh" XWhen \*E forks a shell X(perhaps for the :! or :shell commands) Xthis is the program that is uses as a shell. XThis is "/bin/sh" by default, Xunless you have set the SHELL (or COMSPEC, for MS-DOS) environment variable, Xit which case the default value is copied from the environment. X.IP "shiftwidth, sw" XThe < and > commands shift text left or right by some uniform number of columns. XThe shiftwidth option defines that "uniform number". XThe default is 8. X.IP "showmatch, sm" XWith showmatch set, Xin input mode every time you hit one of )}], X\*E will momentarily move the cursor to the matching ({[. X.IP "showmode, smd" XIn visual mode, it is easy to forget whether you're in the visual command mode Xor input/replace mode. XNormally, the showmode option is off, and you haven't a clue as to which mode Xyou're in. XIf you turn the showmode option on, though, a little message will appear in the Xlower right-hand corner of your screen, telling you which mode you're in. X.IP "sidescroll, ss" XFor long lines, \*E scrolls sideways. X(This is different from the real vi, Xwhich wraps a single long line onto several rows of the screen.) X.IP XTo minimize the number of scrolls needed, X\*E moves the screen sideways by several characters at a time. XThe value of this option says how many characters' widths to scroll at a time. X.IP XGenerally, the faster your screen can be redrawn, Xthe lower the value you will want in this option. X.IP "sync, sy" XIf the system crashes during an edit session, then most of your work Xcan be recovered from the temporary file that \*E uses to store Xchanges. XHowever, sometimes the OS will not copy changes to the Xhard disk immediately, so recovery might not be possible. XThe [no]sync option lets you control this. X.IP XIn nosync mode (which is the default, for UNIX), \*E lets the operating system Xcontrol when data is written to the disk. XThis is generally faster. X.IP XIn sync mode (which is the default for MS-DOS, AmigaDos, and Atari TOS), X\*E forces all changes out Xto disk every time you make a change. XThis is generally safer, but slower. XIt can also be a rather rude thing to do on a multi-user system. X.IP "tabstop, ts" XTab characters are normally 8 characters wide, Xbut you can change their widths by means of this option. X.IP "taglength, tl" XThis option allows you to specify how many characters of a tag's name Xmust match when performing tag lookup. XAs a special case, ":set taglength=0" means that all characters of a tag's Xname must match. X.IP XNote: some configurations of \*E don't support this option. X.IP "term, te" XThis read-only option shows the name of the termcap entry that X\*E is using for your terminal. X.IP "terse, tr" XThe real vi uses this option to select longer vs. shorter error messages. X\*E has only one set of error messages, though, so this option has no effect. X.IP "timeout, to" XThe command ":set notimeout" is equivelent to ":set keytime=0", Xand ":set timeout" is equivelent to ":set keytime=1". XThis affects the behaviour of the key. XSee the discussion of the "keytime" option for more information. X.IP "warn, wa" XIf you have modified a file but not yet written it back to disk, then X\*E will normally print a warning before executing a ":!cmd" command. XHowever, in nowarn mode, this warning is not given. X.IP X\*E also normally prints a message after a successful search that Xwrapped at EOF. XThe [no]warn option can also disable this warning. X.IP "window, wi" XThis option controls how many lines are redrawn after a long move. X.IP XOn fast terminals, this is usually set to the number of rows that the Xterminal can display, minus one. XThis causes the entire screen to be filled with text around the cursor. X.IP XOn slow terminals, you may wish to reduce this value to about 7 or so. XThat way, if you're doing something like repeatedly hitting 'n' to search Xfor each occurrence of some string and trying to find a particular occurrence, Xthen you don't need to wait as long for \*E to redraw the screen after each Xsearch. X.IP "wrapmargin, wm" XNormally (with wrapmargin=0) \*E will let you type in extremely long Xlines, if you wish. X.IP XHowever, with warpmargin set to something other that 0 (wrapmargin=10 Xis nice), \*E will automatically cause long lines to be "wrapped" Xon a word break for lines come too close to the right-hand margin. XFor example: On an 80-column screen, ":set wm=10" will cause lines to Xwrap when their length exceeds 70 columns. X.IP "wrapscan, ws" XNormally, when you search for something, \*E will find it no matter Xwhere it is in the file. X\*E starts at the cursor position, and searches forward. XIf \*E hits EOF without finding what you're looking for, Xthen it wraps around to continue searching from line 1. XIf you turn off the wrapscan option (:se nows), Xthen when \*E hits EOF during a search, it will stop and say so. X.IP "writeany, wr" XWith "writeany" turned off, elvis will prevent you from accidentally Xoverwriting a file. XFor example, if "foo" exists then ":w foo" will fail. XIf you turn on the "writeany" option, then ":w foo" will work. X.IP XRegardless of the setting of "writeany", though, ":w! foo" will work. XThe '!' forces the ":w" command to write the file unless the operating system Xwon't allow it. / echo x - question.ms sed '/^X/s///' > question.ms << '/' X.nr Qn 0 1 X.de QQ X.sp X.IP \fB\\n+(Qn) 0.3i X.. X.de AA X.IP \fR 0.75i X.. X.Go 13 "QUESTIONS & ANSWERS" X.QQ XHow can I make elvis run faster under DOS? X.AA XThere are several things you can do. XThe first thing to do is get a good screen driver such as NANSI.SYS. XThis can speed up screen redrawing by as much as a factor of eight! XThe DOS-specific part of section 12 tells you how to do this. X.AA XYou might also consider reducing the size of the blocks that elvis uses. XYou'll need to recompile \*E to do this. XThe default BLKSIZE is 1024 byte for the DOS version of \*E, which means Xthat for each keystroke that you insert, elvis must shift an average of Xabout 500 bytes. XThat's a lot to ask from a little old 5MHz 8088. XA BLKSIZE of 512 bytes might be more appropriate. X.AA XIf you're \fIreally\fR desperate for more speed, you might want to make X\*E store its temporary files on a RAM disk. XHowever, this limits the size of the file you can edit, and it eliminates any Xchance you may have had to recover your work after a power failure Xor system crash, but it might be worth it; you decide. XTo do this, add ":set dir=R:\\" (or whatever your RAM disk's name is) Xto the \fIelvis.rc\fP file. X.AA XNext, consider turning off the "sync" option. XWhen the sync option is turned on, \*E will close the temporary file Xand reopen it after every change, in order to force DOS to update Xthe file's directory entry. XIf you put ":set nosync" into the \fIelvis.rc\fP file, then elvis will Xonly close the file when you start editing a different text file, or Xwhen you're exiting \*E. XConsequently, there is no chance that you'll be able to recover your Xchanges after a power failure... so if you're going to this, then you Xmight as well store the temp files on the RAM disk, too. X.QQ XWhere's the key on a DEC keyboard? X.AA XI don't know. Maybe the key? XYou could always use ":map!" to make some other key act like the key. XIf all else fails, use <[>. X.QQ XIs there a way to show which keys do what? X.AA XYes. The command ":map" will show what each key does in command mode, Xand ":map!" (with an exclamation mark) shows what each key does in Xinput mode. X.AA XThe table is divided into three columns: the key's label, the characters Xthat it sends, and the characters that \*E pretends you typed. X.QQ XHow can I make \*E display long lines like the real vi? X.AA XYou can't yet. XThe next version of \*E shouldsupport this, though. X.QQ XI can't recover my text [under MS-DOS or Atari TOS]. XAccording to the directory listing, the temporary file is 0 bytes long. XWhat went wrong? X.AA XMS-DOS and TOS only update a file's directory entry when the file is closed. XIf the system crashes while the file is still open, then the file's length Xis stored as 0 bytes. XThe ":set sync" option is supposed to prevent this; Xyou probably turned it off in the interest of speed, right? X.AA XUnder MS-DOS [I don't know about TOS], you should delete the empty Xtemporary file, and then run CHKDSK/F. XThis \fImight\fP find the data that belonged in the empty file, Xand place it in a new file with a name like "000001.CHK" -- something like that. XYou can then try to extract the text from that temporary file by giving the Xcommand "elvprsv -R 000001.chk >goodnews.txt". XIf you're lucky, then your text might be in GOODNEWS.TXT. X.QQ XWhat is the most current version of \*E? X.AA XEach version of \*E that is released to the public has a version number Xof the form "number point number". XAs I write this, the most current version of elvis is 1.5. X.AA XThe intermediate steps between one release and the next are labeled with Xthe \fInext\fP version number, with a letter appended. XFor example, after 1.4 was released, I started working on 1.5a. XI am currently working on 2.0a. XWhen \*E reaches a stable state, I'll call it 2.0 and release it. X.AA XSometimes a beta-test version of elvis will be available via anonymous FTP Xfrom m2xenix.psg.com, in the directory "pub/elvis/beta". X.QQ XI only got executables, but now I want the source code. XWhere can I get it? X.AA XIf you have access to the Internet, then you should be able to fetch it Xfrom one of the public archives such as \fBplains.nodak.edu\fP. XIt is accessible via anonymous FTP, or via an email server named X"archive-server@plains.nodak.edu". XElvis is located in the directory "/pub/Minix/all.contrib". X.AA XI will also offer it to the C Users' Group. XThey sell C source code for us$8 per diskette X(or slightly more outside North America). XTheir phone number is (913) 841-1631, Xand their address is: X.ID XThe C Users' Group XPO Box 3127 XLawrence KS 66046-0127 X.DE X.QQ XIs this shareware, or public domain, or what? X.AA XIt is not public domain; it is copyrighted by me, Steve Kirkendall. XHowever, this particular version is freely redistributable, in either Xsource form or executable form. X(I would prefer that you give copies away for free, complete with the Xfull source code... but I'm not going to force you.) X.AA XIt is not shareware; you aren't expected to send me anything. XYou can use it without guilt. X.AA XIt is not "copylefted." XI hold a copyright, but currently I have not added any of the usual restrictions Xthat you would find on copylefted software. XIf people start doing really obnoxious things to \*E, then I will start Xadding restrictions to subsequent versions, but earlier versions won't Xbe affected. X(So far, everybody has been pretty good about this so no restrictions Xhave been necessary.) X.QQ XCan I reuse parts of your source code? X.AA XYes. Please be careful, though, to make sure that the code really is mine. XSome of the code was contributed by other people, and I don't have the Xauthority to give you permission to use it. XThe author's name can be found near the top of each source file. XIf it says "Steve Kirkendall" then you may use it; Xotherwise, you'd better contact the author first. X.AA XPlease don't remove my name from the source code. XIf you modify the source, please make a note of that fact in a comment Xnear the top of the source code. XAnd, finally, please mention my name in your documentation. X.QQ XCan \*E work with non-ASCII files? X.AA X\*E can't edit binary files because it can't handle the NUL character, Xand because of line-length limitations. XHowever, it is 8-bit clean so you should be able to edit any European Xextended ASCII file without any surprises. X.AA X\*E has also been modified to work with 16-bit character sets. XYongguang Zhang (ygz@cs.purdue.edu) has created a Chinese version of \*E Xthat uses 16-bit characters and runs under cxterm (Chinese X-term) Xon X-windows systems. XJunichiro Itoh (itojun@foretune.co.jp) has modified \*E to edit Japanese Xtext under MS-DOS. / echo x - regexp.ms sed '/^X/s///' > regexp.ms << '/' X.Go 4 "REGULAR EXPRESSIONS" X X.PP X\*E uses regular expressions for searching and substututions. XA regular expression is a text string in which some characters have Xspecial meanings. XThis is much more powerful than simple text matching. X.SH XSyntax X.PP X\*E' regexp package treats the following one- or two-character Xstrings (called meta-characters) in special ways: X.IP "\\\\\\\\(\fIsubexpression\fP\\\\\\\\)" 0.8i XThe \\( and \\) metacharacters are used to delimit subexpressions. XWhen the regular expression matches a particular chunk of text, X\*E will remember which portion of that chunk matched the \fIsubexpression\fP. XThe :s/regexp/newtext/ command makes use of this feature. X.IP "^" 0.8i XThe ^ metacharacter matches the beginning of a line. XIf, for example, you wanted to find "foo" at the beginning of a line, Xyou would use a regular expression such as /^foo/. XNote that ^ is only a metacharacter if it occurs Xat the beginning of a regular expression; Xanyplace else, it is treated as a normal character. X.IP "$" 0.8i XThe $ metacharacter matches the end of a line. XIt is only a metacharacter when it occurs at the end of a regular expression; Xelsewhere, it is treated as a normal character. XFor example, the regular expression /$$/ will search for a dollar sign at Xthe end of a line. X.IP "\\\\\\\\<" 0.8i XThe \\< metacharacter matches a zero-length string at the beginning of Xa word. XA word is considered to be a string of 1 or more letters and digits. XA word can begin at the beginning of a line Xor after 1 or more non-alphanumeric characters. X.IP "\\\\\\\\>" 0.8i XThe \\> metacharacter matches a zero-length string at the end of a word. XA word can end at the end of the line Xor before 1 or more non-alphanumeric characters. XFor example, /\\/ would find any instance of the word "end", Xbut would ignore any instances of e-n-d inside another word Xsuch as "calendar". X.IP "\&." 0.8i XThe . metacharacter matches any single character. X.IP "[\fIcharacter-list\fP]" 0.8i XThis matches any single character from the \fIcharacter-list\fP. XInside the \fIcharacter-list\fP, you can denote a span of characters Xby writing only the first and last characters, with a hyphen between Xthem. XIf the \fIcharacter-list\fP is preceded by a ^ character, then the Xlist is inverted -- it will match character that \fIisn't\fP mentioned Xin the list. XFor example, /[a-zA-Z]/ matches any letter, and /[^ ]/ matches anything Xother than a blank. X.IP "\\\\\\\\{\fIn\fP\\\\\\\\}" 0.8i XThis is a closure operator, Xwhich means that it can only be placed after something that matches a Xsingle character. XIt controls the number of times that the single-character expression Xshould be repeated. X.IP "" 0.8i XThe \\{\fIn\fP\\} operator, in particular, means that the preceding Xexpression should be repeated exactly \fIn\fP times. XFor example, /^-\\{80\\}$/ matches a line of eighty hyphens, and X/\\<[a-zA-Z]\\{4\\}\\>/ matches any four-letter word. X.IP "\\\\\\\\{\fIn\fP,\fIm\fP\\\\\\\\}" 0.8i XThis is a closure operator which means that the preceding single-character Xexpression should be repeated between \fIn\fP and \fIm\fP times, inclusive. XIf the \fIm\fP is omitted (but the comma is present) then \fIm\fP is Xtaken to be inifinity. XFor example, /"[^"]\\{3,5\\}"/ matches any pair of quotes which contains Xthree, four, or five non-quote characters. X.IP "*" 0.8i XThe * metacharacter is a closure operator which means that the preceding Xsingle-character expression can be repeated zero or more times. XIt is equivelent to \\{0,\\}. XFor example, /.*/ matches a whole line. X.IP "\\\\\\\\+" 0.8i XThe \\+ metacharacter is a closure operator which means that the preceding Xsingle-character expression can be repeated one or more times. XIt is equivelent to \\{1,\\}. XFor example, /.\\+/ matches a whole line, but only if the line contains Xat least one character. XIt doesn't match empty lines. X.IP "\\\\\\\\?" 0.8i XThe \\? metacharacter is a closure operator which indicates that the Xpreceding single-character expression is optional -- that is, that it Xcan occur 0 or 1 times. XIt is equivelent to \\{0,1\\}. XFor example, /no[ -]\\?one/ matches "no one", "no-one", or "noone". X.PP XAnything else is treated as a normal character which must exactly match Xa character from the scanned text. XThe special strings may all be preceded by a backslash to Xforce them to be treated normally. X.SH XSubstitutions X.PP XThe :s command has at least two arguments: a regular expression, Xand a substitution string. XThe text that matched the regular expression is replaced by text Xwhich is derived from the substitution string. X.br X.ne 15 \" so we don't mess up the table X.PP XMost characters in the substitution string are copied into the Xtext literally but a few have special meaning: X.LD X.ta 0.75i 1.3i X & Insert a copy of the original text X ~ Insert a copy of the previous replacement text X \\1 Insert a copy of that portion of the original text which X matched the first set of \\( \\) parentheses X \\2-\\9 Do the same for the second (etc.) pair of \\( \\) X \\U Convert all chars of any later & or \\# to uppercase X \\L Convert all chars of any later & or \\# to lowercase X \\E End the effect of \\U or \\L X \\u Convert the first char of the next & or \\# to uppercase X \\l Convert the first char of the next & or \\# to lowercase X.TA X.DE X.PP XThese may be preceded by a backslash to force them to be treated normally. XIf "nomagic" mode is in effect, Xthen & and ~ will be treated normally, Xand you must write them as \\& and \\~ for them to have special meaning. X.SH XOptions X.PP X\*E has two options which affect the way regular expressions are used. XThese options may be examined or set via the :set command. X.PP XThe first option is called "[no]magic". XThis is a boolean option, and it is "magic" (TRUE) by default. XWhile in magic mode, all of the meta-characters behave as described above. XIn nomagic mode, only ^ and $ retain their special meaning. X.PP XThe second option is called "[no]ignorecase". XThis is a boolean option, and it is "noignorecase" (FALSE) by default. XWhile in ignorecase mode, the searching mechanism will not distinguish between Xan uppercase letter and its lowercase form. XIn noignorecase mode, uppercase and lowercase are treated as being different. X.PP XAlso, the "[no]wrapscan" option affects searches. X.SH XExamples X.PP XThis example changes every occurence of "utilize" to "use": X.sp X.ti +1i X:%s/utilize/use/g X.PP XThis example deletes all whitespace that occurs at the end of a line anywhere Xin the file. X(The brackets contain a single space and a single tab.): X.sp X.ti +1i X:%s/[ ]\\+$// X.PP XThis example converts the current line to uppercase: X.sp X.ti +1i X:s/.*/\\U&/ X.PP XThis example underlines each letter in the current line, Xby changing it into an "underscore backspace letter" sequence. X(The ^H is entered as "control-V backspace".): X.sp X.ti +1i X:s/[a-zA-Z]/_^H&/g X.PP XThis example locates the last colon in a line, Xand swaps the text before the colon with the text after the colon. XThe first \\( \\) pair is used to delimit the stuff before the colon, Xand the second pair delimit the stuff after. XIn the substitution text, \\1 and \\2 are given in reverse order Xto perform the swap: X.sp X.ti +1i X:s/\\(.*\\):\\(.*\\)/\\2:\\1/ / echo x - termcap.ms sed '/^X/s///' > termcap.ms << '/' X.Go 10 "TERMCAP" X.PP X\*E uses fairly standard termcap fields for most things. XI invented the cursor shape names Xbut other than that there should be few surprises. X.SH XRequired numeric fields X.if n .ul 0 X.ID X:co#: number of columns on the screen (chars per line) X:li#: number of lines on the screen X.DE X.SH XRequired string fields X.ID X.if n .ul 0 X:ce=: clear to end-of-line X:cl=: home the cursor & clear the screen X:cm=: move the cursor to a given row/column X:up=: move the cursor up one line X.DE X.SH XBoolean fields X.if n .ul 0 X.ID X:am: auto margins - wrap when char is written in last column? X:xn: brain-damaged auto margins - newline ignored after wrap X:pt: physical tabs? X.DE X.SH XOptional string fields X.if n .ul 0 X.ID X:al=: insert a blank row on the screen X:dl=: delete a row from the screen X:cd=: clear to end of display X:ei=: end insert mode X:ic=: insert a blank character X:im=: start insert mode X:dc=: delete a character X:sr=: scroll reverse (insert row at top of screen) X:vb=: visible bell X:ti=: terminal initialization string, to start full-screen mode X:te=: terminal termination, to end full-screen mode X:ks=: enables the cursor keypad X:ke=: disables the cursor keypad X.DE X.SH XOptional strings received from the keyboard X.if n .ul 0 X.ID X:kd=: sequence sent by the key X:kl=: sequence sent by the key X:kr=: sequence sent by the key X:ku=: sequence sent by the key X:kP=: sequence sent by the key X:kN=: sequence sent by the key X:kh=: sequence sent by the key X:kH=: sequence sent by the key X:kI=: sequence sent by the key X.DE X.PP XOriginally, termcap didn't have any names for the , , , Xand keys. XAlthough the capability names shown in the table above are the most common, Xthey are \fInot\fR universal. XSCO Xenix uses :PU=:PD=:HM=:EN=: for those keys. XAlso, if the four arrow keys happen to be part of a 3x3 keypad, Xthen the five non-arrow keys may be named :K1=: through :K5=:, Xso an IBM PC keyboard may be described using those names instead. X\*E can find any of these names. X.SH XOptional strings sent by function keys X.if n .ul 0 X.ID X:k1=:...:k9=:k0=: codes sent by through keys X:s1=:...:s9=:s0=: codes sent by ... X:c1=:...:c9=:c0=: codes sent by ... X:a1=:...:a9=:a0=: codes sent by ... X.DE X.PP XNote that :k0=: is used to describe the key. XSome termcap documents recommend :ka=: or even :k;=: for describing Xthe key, but \*E doesn't support that. X.PP XAlso, the :s1=:..., :c1=:..., and :a1=:... codes are very non-standard. XThe terminfo library doesn't support them. X.SH XOptional fields that describe character attributes X.if n .ul 0 X.ID X:so=:se=: start/end standout mode (We don't care about :sg#:) X:us=:ue=: start/end underlined mode X:md=:me=: start/end boldface mode X:as=:ae=: start/end alternate character set (italics) X:ug#: visible gap left by :us=:ue=:md=:me=:as=:ae=: X.DE X.SH XOptional fields that affect the cursor's shape X.PP XThe :cQ=: string is used by \*E immediately before exiting to undo Xthe effects of the other cursor shape strings. XIf :cQ=: is not given, then all other cursor shape strings are ignored. X.ID X:cQ=: normal cursor X:cX=: cursor used for reading EX command X:cV=: cursor used for reading VI commands X:cI=: cursor used during VI input mode X:cR=: cursor used during VI replace mode X.DE X.PP XIf the capabilities above aren't given, then \*E will try to use the Xfollowing values instead. X.ID X:ve=: normal cursor, used as :cQ=:cX=:cI=:cR=: X:vs=: gaudy cursor, used as :cV=: X.DE X.SH XAn example X.PP XHere's the termcap entry I use on my Minix-ST system. XSome of the fields in it have nothing to do with \*E. XSome can only work on my system; XI have modified my kernel's screen driver. X.sp X.LD X.ne 14 Xmx|minix|minixst|ansi:\\ X :is=\\E[0~:co#80:li#25:bs:pt:\\ X :cm=\\E[%i%d;%dH:up=\\E[A:do=^J:nd=\\E[C:sr=\\EM:\\ X :cd=\\E[J:ce=\\E[K:cl=\\E[H\\E[J:\\ X :al=\\E[L:dl=\\E[M:ic=\\E[@:dc=\\E[P:im=:ei=:\\ X :so=\\E[7m:se=\\E[m:us=\\E[4m:ue=\\E[m:\\ X :md=\\E[1m:me=\\E[m:as=\\E[1;3m:ae=\\E[m:\\ X :ku=\\E[A:kd=\\E[B:kr=\\E[C:kl=\\E[D:\\ X :k1=\\E[1~:k2=\\E[2~:k3=\\E[3~:k4=\\E[4~:k5=\\E[5~:\\ X :k6=\\E[6~:k7=\\E[17~:k8=\\E[18~:k9=\\E[19~:k0=\\E[20~:\\ X :kU=\\E[36~:kQ=\\E[32~:kH=\\E[28~:\\ X :GV=3:GH=D:G1=?:G2=Z:G3=@:G4=Y:GC=E:GL=4:GR=C:GU=A:GD=B:\\ X :cQ=\\E[k:cX=\\E[2;0k:cV=\\E[16;0k:cI=\\E[k:cR=\\E[16;20k: X.DE / echo x - title.ms sed '/^X/s///' > title.ms << '/' X.de tE X.ps 80 X.ce 1 X\*E X.. X.de nE X.ce 7 X####### X# # # # # #### X# # # # # # X##### # # # # #### X# # # # # # X# # # # # # # X####### ###### ## # #### X.. X.sp |2i X.if t .tE X.if n .nE X.ps 10 X.sp 1 X.ce 2 X- a clone of vi/ex - Xversion \*V X.sp |7.5i X.IP Author: 0.9i XSteve Kirkendall X.br X14407 SW Teal Blvd., Apt C X.br XBeaverton, OR 97005 X.IP E-Mail: 0.9i Xkirkenda@cs.pdx.edu X.IP Phone: 0.9i X(503) 643-6980 / echo x - ver.ms sed '/^X/s///' > ver.ms << '/' X.ds V 1.5j-betatest X.if t .ds E E\s-2LVIS\s+2 X.if n .ds E Elvis X.\" X.\" usage: .Go X.de Go X.ds LH "\\$1-\\\\n% X.ds RH "\\$1-\\\\n% X.ds CH "\\$2 X.NH S \\$1 X\\$2 X.\"if !\\n%=1 .bp 1 X.if n .ul 0 X.. / echo x - versions.ms sed '/^X/s///' > versions.ms << '/' X.Go 12 "VERSIONS" X.PP X\*E currently works under BSD UNIX, AT&T System-V UNIX, SCO XENIX, XMinix, Coherent, MS-DOS, Atari TOS, OS9/68k, VAX/VMS, and AmigaDos. XThis section of the manual provides special information that applies to each Xparticular version of \*E. X.PP XFor all versions except MS-DOS, Xthe file "Makefile.mix" should be copied to "Makefile", Xand then edited to select the correct set of options for your system. XThere is more information about this embedded in the file itself. X.NH 2 XBSD UNIX X.PP XTemporary files are stored in /tmp. X.PP XYou should modify /etc/rc so that Xthe temp files are preserved when the system is rebooted. XFind a line in /etc/rc which reads X.br X.ti +0.5i Xex4.3preserve /tmp X.PP Xor something like that, and append the following line after it: X.br X.ti +0.5i Xelvprsv /tmp/elv* X.PP XIf you do not have permission to modify /etc/rc, don't fret. XThe above modification is only needed to allow you to recover your changes Xafter a system crash. XYou can still run \*E without that modification, Xand you can still recover your changes when \*E crashes Xor when your dialup modem looses the carrier signal, or something like that. XOnly a system crash or power failure could hurt you. X.PP XBoth \*E and the real Vi Xread initialization commands from a file called ".exrc", Xbut the commands in that file might work on one but not the other. XFor example, "set keywordprg=man" will work for \*E, Xbut Vi will complain because it doesn't have a "keywordprg" option. XIf the warning messages annoy you, then you can edit the config.h file Xto change the name of the initialization file ".exrc" to something else, Xsuch as ".elvisrc". X.PP XIf you use X windows, you may wish to add "-DCS_LATIN1" to CFLAGS. XThis will cause the digraph table and the flipcase option to have default Xvalues that are appropriate for the LATIN-1 character set. XThat's the standard character set for X. X.PP XThe default keyboard macro time-out value is larger for BSD than it is for Xsome other systems, because I've had trouble running \*E via rlogin or Xterm. XI guess it takes a while for those keystokes to squirt through the net. X.NH 2 XSystem-V UNIX X.PP XMost SysV UNIX systems use terminfo instead of termcap, Xbut the terminfo library doesn't seem to have a standard name. XAs shipped, Elvis' Makefile.mix is configured with "LIBS=-lterm". XYou may need to change it to "LIBS=-ltermcap" or "LIBS=-lterminfo" Xor even "LIBS=-lcurses". X.PP XThe /etc/rc file should be modified as described for BSD systems, above. XThe only difference is that SysV systems tend to have directories for Xinitialization, instead of a single large /etc/rc file. XEditor recovery is usually done somewhere in the /etc/rc2.d directory. X.PP XThe potential trouble with ".exrc" described above for BSD UNIX applies Xto System-V UNIX as well. X.PP X\*E uses control-C as the interrupt key, not Delete. X.NH 2 XSCO Xenix X.PP XFor Xenix-386, you can use the generic System-V settings. XYou may wish to add "-DCS_IBMPC" to CFLAGS, to have the digraph table and Xflipcase option start up in a mode that is appropriate for the console. X XThere is a separate group of settings for use with Xenix-286. XIt already has "-DCS_IBMPC" in CFLAGS. X.PP XBecause Xenix is so similar to System-V, everything I said earlier about XSystem-V applies to the Xenix version too, except that editor recovery Xprobably belongs in a directory called /etc/rc.d/8. X.NH 2 XMinix X.PP XThere are separate settings in Makefile.mix for Minix-PC and Minix-68k. XThe differences between these two are that Xthe 68k version uses ".o" for the object file extension where Xthe PC version uses ".s", and Xthe PC version has some extra flags in CFLAGS to reduce the size of \*E. XThe PC version also uses tinytcap (instead of the full termcap) to make it smaller. X.PP XMinix-PC users should read the CFLAGS section of this manual very carefully. XYou have some choices to make... X.PP XThe temporary files are stored in /usr/tmp. XThe /usr/tmp directory must exist before you run \*E, Xand it must be readable/writable by everybody. XWe use /usr/tmp instead of /tmp because Xafter a system crash or power failure, Xyou can recover the altered version of a file from the temporary file Xin /usr/tmp. XIf it was stored in /tmp, though, then it would be lost because /tmp is Xnormally located on the RAM disk. X.PP X\*E uses control-C as the interrupt key, not Delete. X.NH 2 XCoherent X.PP X\*E was ported to Coherent by Esa Ahola. X.PP X\*E is too large to run under Coherent unless you eliminate some Xfeatures via the CFLAGS setting. XThe recommended settings, in Makefile.mix, produce a working version Xof \*E which emulates Vi faithfully, but lacks most of the extensions. XYou should read the CFLAGS section of this manual carefully. X.PP XYou can probably reduce the size of \*E by using tinytcap.c instead of -lterm. XThis would allow you to keep most features of \*E, Xat the expense of terminal independence. X(Tinytcap.c has ANSI escape sequences hard-coded into it.) XTo use tinytcap, just add "tinytcap.o" to the "EXTRA=" line in the Makefile, Xand remove "-lterm" from the "LIBS=" line. X.PP XThe temporary files are stored in /tmp. XYou should modify your /etc/rc file as described for BSD earlier. X.NH 2 XMS-DOS X.PP X\*E was ported to MS-DOS by Guntram Blohm and Martin Patzel. XWillett Kempton added support for the DEC Rainbow. X.PP XIdeally, \*E should be compiled with Microsoft C 5.10 and the standard XMicrosoft Make utility, Xvia the command "make elvis.mak". XThis will compile \*E and all related utilities. X.PP XWith Microsoft C 6.00, you may have trouble compiling regexp.c. XIf so, try compiling it without optimization. X.PP XThe "Makefile.mix" file contains a set of suggested settings for compiling Xelvis with Turbo-C or Borland C. X(If you have Turbo-C, but not the Make utility, Xthen you can \fIalmost\fR use the "\*E.prj" file to compile \*E, Xbut you must explicitly force Turbo-C to compile it with the "medium" memory model. XMost of the related programs [ctags, ref, virec, refont, and wildcard] are Xonly one file long, so you should have no trouble compiling them.) XThe "alias.c" file is meant to be compiled once into an executable named X"ex.exe". XYou should then copy "ex.exe" to "vi.exe" and "view.exe". X.PP X\*E stores its temporary files in C:\\tmp. XIf this is not satisfactory, then you should edit the CFLAGS line of Xyour Makefile to change TMPDIR to something else before compiling. XYou can also control the name of the temp directory via an environment Xvariable named TMP or TEMP. XThe directory must exist before you can run \*E. X.PP XThe TERM environment variable determines how elvis will write to the screen. XIt can be set to any one of the following values: X.LD X.ta 1.5i 2.5i X pcbios Use BIOS calls on an IBM-PC clone. X rainbow Use DEC Rainbow interface. X ansi Use ANSI.SYS driver. X nansi User faster NANSI.SYS driver. X.DE X.PP XIf the TERM variable isn't set, then elvis will automatically select either Xthe "rainbow" interface (when run on a Rainbow) or "pcbios" (on an IBM clone). X.PP XYou may prefer to use NANSI.SYS for speed; Xor you may NEED to use ANSI.SYS for a non-clone, such as a lap-top. XIf so, you should Xinstall one of these drivers by adding "driver = nansi.sys" (or whatever) Xto your CONFIG.SYS file, Xand then you should define TERM to be "nansi" (or whatever) by adding X"set TERM=nansi" to your AUTOEXEC.BAT file. XYou must then reboot for these changes to take effect. XAfter that, \*E will notice the "TERM" setting and use the driver. X.PP XSince ".exrc" is not a valid DOS filename, Xthe name of the initialization file has been changed to "elvis.rc". XElvis will look for an "elvis.rc" file first in your home directory, Xand then in the current directory. XNote that you must set an environment variable named "HOME" to the Xfull pathname of your home directory, for Elvis to check there; Xif "HOME" isn't set, then Elvis will only look in the current directory. XTo set "HOME", you would typically add the following line to your XAUTOEXEC.BAT file: X.br X.ti +0.5i Xset HOME c:\\ X.PP XAn extra program, called "wildcard", is needed for MS-DOS. XIt expands wildcard characters in file names. XIf \*E flashes a "Bad command or filename" message when it starts, Xthen you've probably lost the WILDCARD.EXE program somehow. X.PP X\*E can run under Windows, but only in full-screen mode. XAlso, Windows uses an environment variable called TEMP which interferes with Xelvis' usage of TEMP; Xto work around this, you can simply set an environment variable named XTMP (with no 'E') to the name of elvis' temporary directory. XWhen TEMP and TMP are both set, \*E uses TMP and ignored TEMP. X.NH 2 XAtari TOS X.PP X\*E was ported to Atari TOS by Guntram Blohm and Martin Patzel. XIt is very similar to the MS-DOS version. XIt has been tested with the Mark Williams C compiler and also GNU-C. X.PP XThe TERM environment variable is ignored; Xthe ST port always assumes that TERM=vt52. XThe SHELL (not COMSPEC!) variable should be set to Xthe name of a line-oriented shell. X.PP XA simple shell in included with \*E. XIts source is in "shell.c", and the name of the executable is "shell.ttp". XThe file "profile.sh" should contain a set of instructions to be executed Xwhen the shell first starts up. XAn example of this file is included, but you will almost certainly want to Xedit it right away to match your configuration. X(If you already have a command-line shell, Xthen you'll probably want to continue using it. XThe shell that comes with \*E is very limited.) X.PP XCurrently, character attributes cannot be displayed on the screen. X.PP X\*E runs under MiNT (a free multi-tasking extension to TOS) Xbut it can be a CPU hog because of the way that \*E reads from the Xkeyboard with timeout. XAlso, \*E doesn't use any of the special features of MiNT. XI have received a set of patches that optimize \*E for MiNT, Xbut they arrived too late to integrate into this release. X.NH 2 XOS9/68k X.PP X\*E was ported to OS9/68k by Peter Reinig. X.PP XThe Makefile is currently configured to install \*E and the related Xprograms in /dd/usr/cmds XIf this this is unacceptable, then you should change the BIN setting Xto some other directory. XSimilarly, it expects the source code to reside in /dd/usr/src/elvis; Xthe ODIR setting is used to control this. X.PP XTemporary files are stored in the /dd/tmp directory. XYour /dd/startup file may need to be modified Xto prevent it from deleting \*E' temporary files; Xmake /dd/startup run the \fIelvprsv\fR program before it wipes out /dd/tmp. X.PP XThe program in alias.c is linked repeatedly to produce the X"vi", "view", and "input" aliases for \*E. XSadly, the "ex" alias is impossible to implement under OS9 Xbecause the shell has a built-in command by that name. X.PP XFor some purposes, Xyou must give `make' the "-b" option. XSpecifically, you need this for "make -b clean" and "make -b install". X.NH 2 XVAX/VMS X.PP XJohn Campbell ported \*E to VAX/VMS. X.PP XA heavily laden VAX can take half an hour to compile elvis. XThis is normal. XDon't panic. X.PP XWhile running, elvis will create temporary files in SYS$SCRATCH. XEnter SHOW LOGICAL SYS$SCRATCH to see what actual directory you are using. XMany sites have SYS$SCRATCH equivalenced to SYS$LOGIN. XThe elvis temporary files look like the following on VMS while elvis is running: X.br X.ti 0.75i XELV_1123A.1;1 ELV_1123A.2;1 SO070202.;1 X.PP XAlso, filtering commands (like !!dir and !}fmt) should work on VMS. XThis assumes, however, that you can create temporary mailboxes and that Xyour mailbox quota (a sysgen parameter) is at least 256 bytes for a Xsingle write to the mailbox. XThis is the default sysgen parameter, Xso there should be few people who experience filter problems. X.PP XAdditionally, an attempt was made to support the standard terminals on VMS: X"vt52", "vt100", "vt200", "vt300", "vt101", "vt102". XNon-standard terminals could be supported by setting your terminal type to XUNKNOWN (by entering SET TERM/UNKNOWN) Xand defining the logical name ELVIS_TERM. XWhatever ELVIS_TERM translates to, however, will have to be included in Xtinytcap.c. XNote that the upper/lowercase distinctions are significant, Xand that DCL will upshift characters that are not quoted strings, so Xenter DEFINE ELVIS_TERM "hp2621a". XAs distributed, it would probably not be a good idea to have more than the Xstandard terminals in tinytcap.c (else it wouldn't be tiny, would it?). XChanges here, of course, would require a recompilation to take effect. X.PP XIf you have a version of the "termcap" library and database on your system, Xthen you may wish to replace tinytcap with the real termcap. X.NH 2 XAmigaDOS X.PP XMike Rieser and Dale Rahn ported \*E to AmigaDOS. X.PP XThe port was done using Manx Aztec C version 5.2b. X\*E uses about as much space as it can and still be small code and data. X\*E should also compile under DICE, though there may be a little trouble with Xsigned versus unsigned chars. X.PP XThe port has been done so the same binary will run under both versions of AmigaDOS. XUnder AmigaDOS 2.04, \*E supports all the documented features. XIt also uses an external program ref to do tag lookup. XSo, the accompanying programs: ref and ctags are recommended. XUnder AmigaDOS 1.2/1.3 \*E works, buts lacks the more advanced features. X.PP XFor the port to AmigaDOS 2.04, we tried to use as many Native AmigaDOS Xcalls as we could. XThis should increase Elvis's chances at being compiled with other compilers. XDICE seems to have a different default char type. XYou may need to use the UCHAR() macro in tio.c. XTo test it, try the :map command; if it looks right, things are cool. X.PP XFor the port to AmigaDOS 1.3, we tried to make sure the program was at Xleast usable. XMany features are missing, most notably running commands in subshells. XAlso, what we could get working, we used Aztec functions to support them, Xso this part is little more compiler dependent. X.PP XAztec is compatible with the SAS libcall #pragma. XI personally prefer using the includes that come from Commodore over the ones Xsupplied with Aztec, but for people with a straight Aztec installation, XI went with the default names for the Aztec pragmas. X.PP XOne include you'll need is <sys/types.h>. XIts a common include when porting software just make yourself one. XIts a two line file that saves a lot of hassle especially in the elvis source. XSo, make a directory where your includes are located called `sys' Xand in a file below that type: X.br X.ti +0.8i X/* sys/types.h */ X.br X.ti +0.8i X#include <exec/types.h> X.PP XWhen setting environment variables (either local or global) for Xvariables that specify a directory, make sure the variable ends in `:' Xor `/'. XThis saved from having to change much of the way elvis works. XThe default temporary directory (if TEMP and TMP aren't specified) is "T:". XThe default if HOME directory (if no HOME environment variable is set) is "S:". X.PP XTo avoid conlict with other uses, \*E uses elvis.rc instead of .exrc or Xwhere it looks for macros. X.NH 2 XOther Systems X.PP XFor Sun workstations, use the BSD configuration. XEarlier versions of elvis didn't link correctly due to a quirk in Sun's Xversion of the "make" utility, but this version of elvis has a work-around Xfor that quirk so you should have no trouble at all. X.PP XFor Linux, use the SysV settings. XYou can probably just remove the "-lterm" from the "LIBS= -lterm" line, Xsince linux keeps the termcap functions in the standard C library. X.PP XFor other UNIXoid systems, I suggest you start with the Minix-68k settings Xand then grow from that. XMinix is a nice starting point because it is a clone of Version 7 UNIX, Xwhich was the last common ancestor of BSD UNIX and SysV UNIX. XAny Operating System which claims any UNIX compatibility what so ever Xwill therefore support V7/Minix code. XYou may need to fiddle with #include directives or something, though. XMinix-68k is a better starting point than Minix-PC because the PC compiler Xhas some severe quirks. / echo x - visual.ms sed '/^X/s///' > visual.ms << '/' X.Go 2 "VISUAL MODE COMMANDS" X.PP XMost visual mode commands are one keystroke long. XThe following table lists the operation performed by each keystroke, Xand also denotes any options or arguments that it accepts. XNotes at the end of the table describe the notation used in this table. X.PP XIn addition to the keys listed here, your keyboard's "arrow" keys Xwill be interpretted as the appropriate cursor movement commands. XThe same goes for <PgUp> and <PgDn>, if your keyboard has them. XThe <Insert> key will toggle between insert mode and replace mode. XThere is a colon mode command (":map", to be described later) Xwhich will allow you to define other keys, such as function keys. X.PP XA tip: visual command mode looks a lot like text input mode. XIf you forget which mode you're in, just hit the <Esc> key. XIf \*E beeps, then you're in visual command mode. XIf \*E does not beep, then you were in input mode, Xbut by hitting <Esc> you will have switched to visual command mode. XSo, one way or another, after <Esc> \*E will be ready for a command. X.LD X.ta 0.7i 1.3i X\s+2COMMAND DESCRIPTION\s-2 X ^A Search for next occurence of word at cursor (MOVE)(EXT) X ^B Move toward the top of the file by 1 screenful X ^C --- (usually sends SIGINT, to interupt a command) Xcount ^D Scroll down <count> lines (default 1/2 screen) Xcount ^E Scroll up <count> lines X ^F Move toward the bottom of the file by 1 screenful X ^G Show file status, and the current line # Xcount ^H Move left, like h (MOVE) X ^I --- Xcount ^J Move down (MOVE) X ^K --- X ^L Redraw the screen Xcount ^M Move to the front of the next line (MOVE) Xcount ^N Move down (MOVE) X ^O --- Xcount ^P Move up (MOVE) X ^Q --- (typically XON, which restarts screen updates) X ^R Redraw the screen X ^S --- (typically XOFF, which stops screen updates) X ^T --- Xcount ^U Scroll up <count> lines (default 1/2 screen) X ^V --- X ^W --- Xcount ^X Move to a physical column number on the screen (MOVE) (EXT) Xcount ^Y Scroll down <count> lines X ^Z --- (sometimes sends SIGSUSP, to suspend execution) X ESC --- X ^\\ --- (usually sends SIGQUIT, which is ignored) X ^] If the cursor is on a tag name, go to that tag X ^^ Switch to the previous file, like ":e #" X ^_ --- Xcount SPC Move right,like l (MOVE) X ! \s-2mv\s+2 Run the selected lines thru an external filter program X " \s-2key\s+2 Select which cut buffer to use next Xcount # \s-2+\s+2 Increment a number (EDIT) (EXT) X $ Move to the rear of the current line (MOVE) Xcount % Move to matching (){}[] or to a given % of file (MOVE) (EXT) Xcount & Repeat the previous ":s//" command here (EDIT) X ' \s-2key\s+2 Move to a marked line (MOVE) Xcount ( Move backward <count> sentences (MOVE) Xcount ) Move forward <count> sentences (MOVE) X * Go to the next error in the errlist (EXT) Xcount + Move to the front of the next line (MOVE) Xcount , Repeat the previous [fFtT] but in the other direction (MOVE) Xcount - Move to the front of the preceding line (MOVE) Xcount . Repeat the previous "edit" command X / \s-2text\s+2 Search forward for a given regular expression (MOVE) X 0 If not part of count, move to 1st char of this line (MOVE) X 1 Part of count X 2 Part of count X 3 Part of count X 4 Part of count X 5 Part of count X 6 Part of count X 7 Part of count X 8 Part of count X 9 Part of count X : \s-2text\s+2 Run single EX cmd Xcount ; Repeat the previous [fFtT] cmd (MOVE) X < \s-2mv\s+2 Shift text left (EDIT) X = \s-2mv\s+2 Reformat X > \s-2mv\s+2 Shift text right (EDIT) X ? \s-2text\s+2 Search backward for a given regular expression (MOVE) X @ \s-2key\s+2 Execute the contents of a cut-buffer as VI commands Xcount A \s-2inp\s+2 Append at end of the line (EDIT) Xcount B Move back Word (MOVE) X C \s-2inp\s+2 Change text from the cursor through the end of the line (EDIT) X D Delete text from the cursor through the end of the line (EDIT) Xcount E Move end of Word (MOVE) Xcount F \s-2key\s+2 Move leftward to a given character (MOVE) Xcount G Move to line #<count> (default is the bottom line) (MOVE) Xcount H Move to home row (the line at the top of the screen) Xcount I \s-2inp\s+2 Insert at the front of the line (after indents) (EDIT) Xcount J Join lines, to form one big line (EDIT) X K Look up keyword (EXT) Xcount L Move to last row (the line at the bottom of the screen) X M Move to middle row X N Repeat previous search, but in the opposite direction (MOVE) Xcount O \s-2inp\s+2 Open up a new line above the current line (EDIT) X P Paste text before the cursor (EDIT) X Q Quit to EX mode X R \s-2inp\s+2 Overtype (EDIT) Xcount S \s-2inp\s+2 Change lines, like <count>cc Xcount T \s-2key\s+2 Move leftward *almost* to a given character (MOVE) X U Undo all recent changes to the current line X V Start marking lines for c/d/y/</>/!/\\ (EXT) Xcount W Move forward <count> Words (MOVE) Xcount X Delete the character(s) to the left of the cursor (EDIT) Xcount Y Yank text line(s) (copy them into a cut buffer) X Z Z Save the file & exit X [ [ Move back 1 section (MOVE) X \\ \s-2mv\s+2 Pop-up menu for modifying text (EXT) X ] ] Move forward 1 section (MOVE) X ^ Move to the front of the current line (after indent) (MOVE) Xcount _ Move to the current line X ` \s-2key\s+2 Move to a marked character (MOVE) Xcount a \s-2inp\s+2 Insert text after the cursor (EDIT) Xcount b Move back <count> words (MOVE) X c \s-2mv\s+2 Change text (EDIT) X d \s-2mv\s+2 Delete text (EDIT) Xcount e Move forward to the end of the current word (MOVE) Xcount f \s-2key\s+2 Move rightward to a given character (MOVE) X g --- Xcount h Move left (MOVE) Xcount i \s-2inp\s+2 Insert text at the cursor (EDIT) Xcount j Move down (MOVE) Xcount k Move up (MOVE) Xcount l Move right (MOVE) X m \s-2key\s+2 Mark a line or character X n Repeat the previous search (MOVE) Xcount o \s-2inp\s+2 Open a new line below the current line (EDIT) X p Paste text after the cursor (EDIT) X q --- Xcount r \s-2key\s+2 Replace <count> chars by a given character (EDIT) Xcount s \s-2inp\s+2 Replace <count> chars with text from the user (EDIT) Xcount t \s-2key\s+2 Move rightward *almost* to a given character (MOVE) X u Undo the previous edit command X v Start marking characters for c/d/y/</>/!/\\ (EXT) Xcount w Move forward <count> words (MOVE) Xcount x Delete the character that the cursor's on (EDIT) X y \s-2mv\s+2 Yank text (copy it into a cut buffer) X z \s-2key\s+2 Scroll current line to the screen's +=top -=bottom .=middle Xcount { Move back <count> paragraphs (MOVE) Xcount | Move to column <count> (the leftmost column is 1) Xcount } Move forward <count> paragraphs (MOVE) Xcount ~ Switch a character between uppercase & lowercase (EDIT) X DEL --- (usually mapped to shift-X, so it deletes one character) X.DE X.IP count XMany commands may be preceded by a count. This is a sequence of digits Xrepresenting a decimal number. For most commands that use a count, Xthe command is repeated <count> times. The count is always optional, Xand usually defaults to 1. X.IP key XSome commands require two keystrokes. The first key always determines Xwhich command is to be executed. The second key is used as a parameter Xto the command. X.IP mv XSome commands (! < > c d y \\ =) operate on text between the cursor and some Xother position. XThere are three ways that you can specifify that other position. X.IP XThe first way is to follow the command keystroke with a movement command. XFor example, "dw" deletes a single word. X"d3w" and "3dw" both delete three words. X.IP XThe second way is to type the command keystroke twice. XThis causes whole lines to be acted upon. XFor example, ">>" indents the current line. X"3>>" indents the current line and the following two lines. X.IP XThe last way is to move the cursor to one end of the text, Xtype 'v' or 'V' to start marking, Xmove the cursor to the other end, Xand then type the desired command key. X.IP inp XMany commands allow the user to interactively enter text. XSee the discussion of "input mode" in the following section. X.IP (EXT) XThese commands are extensions -- the real vi doesn't have them. X.IP (EDIT) XThese commands affect text, and may be repeated by the "." command. X.IP (MOVE) XThese commands move the cursor, and may be used to specify the extent Xof a member of the "mv" class of commands. X.NH 2 XInput Mode X.PP XYou can't type text into your file directly from visual command mode. XInstead, you must first give a command which will put you into input mode. XThe commands to do this are A/C/I/O/R/S/a/i/o/s. X.PP XThe S/s/C/c commands temporarily place a $ at the end of the text that Xthey are going to change. X.PP XIn input mode, all keystrokes are inserted into the text at the Xcursor's position, except for the following: X.ID X^A insert a copy of the last input text X^D delete one indent character X^H (backspace) erase the character before the cursor X^L redraw the screen X^M (carriage return) insert a newline (^J, linefeed) X^O execute next key as a visual command (limited!) X^P insert the contents of the cut buffer X^R redraw the screen, like ^L X^T insert an indent character X^U backspace to the beginning of the line X^V insert the following keystroke, even if special X^W backspace to the beginning of the current word X^Z^Z write the file & exit \*E X^[ (ESCape) exit from input mode, back to command mode X.DE X.PP XAlso, on some systems, ^S may stop output, ^Q may restart output, Xand ^C may interupt execution. X^@ (the NUL character) cannot be inserted. X.PP XThe R visual command puts you in overtype mode, Xwhich is a slightly different form of input mode. XIn overtype mode, each time you insert a character, Xone of the old characters is deleted from the file. X.NH 2 XArrow keys in Input Mode X.PP XThe arrow keys can be used to move the cursor in input mode. X(This is an extension; the real Vi doesn't support arrow keys in input mode.) XThe <PgUp>, <PgDn>, <Home>, and <End> keys work in input mode, too. XThe <Delete> key deletes a single character in input mode. XThe <Insert> key toggles between input mode and replace mode. X.PP XThe best thing about allowing arrow keys to work in input mode is that Xas long as you're in input mode, X\*E seems to have a fairly ordinary user interface. XWith most other text editors, you are always in either insert mode or Xreplace mode, and you can use the arrow keys at any time to move the cursor. XNow, \*E can act like that, too. XIn fact, with the new "inputmode" option and the "control-Z control-Z" input Xcommand, you may never have to go into visual command mode for simple edit Xsessions. X.NH 2 XDigraphs X.PP X\*E supports digraphs as a way to enter non-ASCII characters. XA digraph is a character which is composed of two other characters. XFor example, an apostrophe and the letter i could be defined as a digraph Xwhich is to be stored & displayed as an accented i. X.PP XThere is no single standard for extended ASCII character sets. X\*E can be compiled to fill the digraph with values appropriate for Xeither the IBM PC character set, or the LATIN-1 character set used by XX windows, or neither. X(See the discussions of -DCS_IBMPC and -DCS_LATIN1 in the CFLAGS section Xof this manual.) XYou can view or edit the digraph table via the ":digraph" colon command. X.PP XDigraphs will not be recognized until you've entered ":set digraph". X.PP XTo actually use a digraph Xtype the first character, then hit <Backspace>, and then type the Xsecond character. X\*E will then substitute the non-ASCII character in their place. X.NH 2 XAbbreviations X.PP X\*E can expand abbreviations for you. XYou define an abbreviation with the :abbr command, Xand then whenever you type in the abbreviated form while in input mode, X\*E will immediately replace it with the long form. XCOBOL programmers should find this useful. :-) X.PP X\*E doesn't perform the substitution until you type a non-alphanumeric Xcharacter to mark the end of the word. XIf you type a control-V before that non-alphanumeric character, then X\*E will not perform the substitution. X.NH 2 XAuto-Indent X.PP XWith the ":set autoindent" option turned on, X\*E will automatically insert leading whitespace at the beginning of each Xnew line that you type in. XThe leading whitespace is copied from the preceding line. X.PP XTo add more leading whitespace, type control-T. XTo remove some whitespace, type control-D. X.PP XIf you ":set noautotab", then the whitespace generated by control-T will Xalways consist of spaces -- never tabs. XSome people seem to prefer this. X.PP X\*E' autoindent mode isn't 100% compatible with vi's. XIn \*E, 0^D and ^^D don't work, X^U can wipeout all indentation, Xand sometimes \*E will use a different amount of indentation than vi would. / ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������The following options are missing: [no]optimize - affects screen redrawing method [no]redraw - simulate character insertion by redrawing line [no]slowopen - don't use character insertion tags="tags" - list of tags, used as TAGPATH I'd like to improve the versatility of the options whose value is a command: cc, make, kp, and ep. I'd like to add some notation that allows you to say where to insert the current filename or current word. ------------------------------------------------------------------------------- Currently, elvis is configured to look for | only in .exrc files. It doesn't look for | in any interactively entered command lines, yet. ------------------------------------------------------------------------------- The 'p', '#', and 'l' flags aren't supported. Also, ex commands don't accept counts; e.g., ":c5" can't be used to change five lines. ------------------------------------------------------------------------------- The following have been reported, but have not been verified. If you have experienced any of the following, and haven't reported it yet, then please report it now! I need more information about these bugs. [Bugs that are not in this list should also be reported, of course.] - Under VMS on an 80-column screen, after scolling sideways to approximately column 110, a ^L will not redraw the part of the line after the cursor. - On an Atari ST running under TOS: some ASCII keys seem to send '#' plus another key. (This is normal for non-ASCII keys like <F1> or <Help>, but ASCII keys should always send a single ASCII character.) ------------------------------------------------------------------------------- BIG JOBS: Desirable extension: merge input mode and visual command mode. Display long lines by wrapping, like the real vi (if ":set sidescroll=0") ------------------------------------------------------------------------------- - In the ":w >>filename" command, elvis doesn't allow any whitespace between the ">>" and "filename". - Elvis doesn't allow "backslash newline" inside a single EX command. - VMS intercepts the control-T character, which is normally used to increase indentation. The <Tab> key works, but it doesn't do quite the same thing. (":map! ^I ^T" helps.) - Under VMS, file I/O is very slow. Looking over the vmsio.c file, I get the impression that it is rather over-done for elvis. Its speed could probably be inproved. - The errlist feature doesn't seem to work with the Borland compilers. Perhaps they write to stderr instead of stdout? This will probably be easy to solve once I modify the "cc" and "make" options, as described earlier. - The command ":0" should move the cursor to line 1. Currently, it doesn't move the cursor at all. - File preservation is still flakey. On DOS/TOS/VMS systems, it is also more complex that it should be. - The act of appending to a cut buffer (as in "Ayy) sets file modification flag. It shouldn't! - The .exrc file is limited to BLKSIZE bytes -- 2048 on most systems, but 1024 on Minicx-PC, Coherent, and MS-DOS. - I *still* haven't quite perfected the screen update code. If you suspect that the screen doesn't accurately reflect the contents of the edit buffer, then you should try doing a control-L. I'll be overhauling the screen update code soon to make it wrap long lines like the real vi. I expect to fix this bug then. ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# This is the Makefile for Elvis' "doc" directory. It makes use of a # troff-like formatter called mroff. Since you probably don't have mroff, # you'll need to edit this Makefile before you can fully use it. It can # also use nroff, though, so you should be able to get something out of it. # # make Use nroff to create an ASCII version of the manual. # make foo.doc Use nroff to create an ASCII version of foo.man or foo.ms # make manual Use MROFF to print a typeset manual on a laser printer # make foo.1200 Use MROFF to print a typeset version of foo.man or foo.ms # make foo.100 Use MROFF to print a draft-quality version of foo.man or foo.ms # make foo.more Use MROFF to preview foo.man or foo.more on your terminal # ############################################################################### # Definitions... MAN= ctags.man elvis.man elvprsv.man elvrec.man fmt.man ref.man MS= title.ms index.ms intro.ms visual.ms ex.ms regexp.ms options.ms\ cutbufs.ms differ.ms internal.ms cflags.ms termcap.ms environ.ms\ versions.ms question.ms ASC= title.doc index.doc intro.doc visual.doc ex.doc regexp.doc options.doc\ cutbufs.doc differ.doc internal.doc cflags.doc termcap.doc environ.doc\ versions.doc question.doc\ ctags.doc elvis.doc elvprsv.doc elvrec.doc fmt.doc ref.doc MANUAL= title.1200 index.1200 intro.1200 visual.1200 ex.1200 regexp.1200 options.1200\ cutbufs.1200 differ.1200 internal.1200 cflags.1200 termcap.1200 environ.1200\ versions.1200\ ctags.1200 elvis.1200 elvprsv.1200 elvrec.1200 fmt.1200 ref.1200 VER= ver.ms TROFF= mroff NROFF= nroff ############################################################################### # Rules... .SUFFIXES: .tmp .100 .1200 .more .doc .man .ms .vga .vgas .ms.tmp: $(TROFF) -ms $(VER) $< >tmp .man.tmp: $(TROFF) -man $< >tmp .ms.more: $(TROFF) -ms $(VER) $< | draft | more .man.more: $(TROFF) -man $< | draft | more .ms.1200: $(TROFF) -ms $(VER) $< | hp2 1200 | lp -og $(PRINTER) .man.1200: $(TROFF) -man $< | hp2 1200 | lp -og $(PRINTER) .ms.100: $(TROFF) -ms $(VER) $< | hp2 100 | lp -og $(PRINTER) .man.100: $(TROFF) -man $< | hp2 100 | lp -og $(PRINTER) .ms.doc: $(NROFF) -ms $(VER) $< >$@ .man.doc: $(NROFF) -man $< >$@ .ms.vga: $(TROFF) -ms $(VER) $< >/tmp/foo -vga /tmp/foo rm /tmp/foo .ms.vgas: $(TROFF) -ms $(VER) $< >/tmp/foo -vgas /tmp/foo rm /tmp/foo ############################################################################# # Targets... asc: $(ASC) cat $(ASC) >asc manual: $(MANUAL) clean: rm -f *.doc *.sh ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for elvis # # Several groups of Makefile settings are included below. Choose *ONE* group # of settings for your particular system, and leave the others commented out. # The meanings of these settings are: # EXTRA version-specific object files used in elvis # CC the C compiler command, possibly with "memory model" flags # CFLAGS compiler flags used to select compile-time options # PROGS the list of all programs # SORT if the "tags" file must be sorted, then SORT=-DSORT PROGS= elvis ctags ref elvrec fmt elvprsv #---- These settings are recommended for Minix-PC ---- EXTRA= tinytcap.o tinyprnt.o CFLAGS= -O -w -D_POSIX_SOURCE -D_MINIX -DCRUNCH \ -DNO_MKEXRC -DNO_CURSORSHAPE -DNO_CHARATTR -DNO_SHOWMODE \ -DNO_MODELINE -DNO_OPTCOLS -DNO_DIGRAPH -DNO_EXTENSIONS \ -DNO_ERRLIST -DNO_FKEY -DNO_VISIBLE -DNO_COLOR -DNO_POPUP LDFLAGS=-i #---- These settings are recommended for Minix-ST ---- #EXTRA= #CFLAGS= ########################################################################### ### The rest of this Makefile contains no user-serviceable parts ### ########################################################################### OBJ=blk.o cmd1.o cmd2.o ctype.o curses.o cut.o ex.o input.o \ main.o misc.o modify.o move1.o move2.o move3.o move4.o move5.o \ opts.o recycle.o redraw.o regexp.o regsub.o system.o tio.o tmp.o \ unix.o vars.o vcmd.o vi.o all: $(PROGS) elvis: $(OBJ) $(CC) $(LDFLAGS) -o elvis $(OBJ) install -S 18kw elvis ctags: ctags.c $(CC) $(CFLAGS) $(SORT) $(LDFLAGS) -o ctags ctags.c install -S 4kw $@ ref: ref.c $(CC) $(CFLAGS) $(LDFLAGS) -o ref ref.c install -S 4kw $@ elvrec: elvrec.c $(CC) $(CFLAGS) $(LDFLAGS) -o elvrec elvrec.c install -S 4kw $@ fmt: fmt.c $(CC) $(CFLAGS) $(LDFLAGS) -o fmt fmt.c install -S 4kw $@ elvprsv: elvprsv.c $(CC) $(CFLAGS) $(LDFLAGS) -o elvprsv elvprsv.c ctype.o install -S 4kw $@ install: /usr/bin/elvis /usr/bin/ex /usr/bin/vi \ /usr/bin/ctags /usr/bin/ref /usr/bin/fmt \ /usr/bin/elvrec /usr/bin/elvprsv /usr/bin/elvis: elvis install -cs -o bin elvis $@ /usr/bin/ex /usr/bin/vi: /usr/bin/elvis install -l /usr/bin/elvis $@ /usr/bin/ctags: ctags install -cs -o bin ctags $@ /usr/bin/ref: ref install -cs -o bin ref $@ /usr/bin/fmt: fmt install -cs -o bin fmt $@ /usr/bin/elvrec: elvrec install -cs -o root -m 4755 elvrec $@ /usr/bin/elvprsv: elvprsv install -cs -o root -m 4755 elvprsv $@ # Dependencies $(OBJ): vi.h curses.h config.h regexp.h ctype.h clean: rm -f *.o ctags ref elvrec fmt elvprsv elvis �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������echo x - ctags.man sed '/^X/s///' > ctags.man << '/' X.TH CTAGS 1 X.SH NAME Xctags - Generates "tags" and (optionally) "refs" files X.SH SYNOPSIS X\fBctags\fP [\fB-stvra\fP] \fIfilesnames\fP... X.SH DESCRIPTION X\fIctags\fP generates the "tags" and "refs" files Xfrom a group of C source files. XThe "tags" file is used by Elvis' ":tag" command, Xcontrol-] command, Xand -t option. XThe "refs" file is sometimes used by the \fIref(1)\fP program. X.PP XEach C source file is scanned for #define statements and Xglobal function definitions. XThe name of the macro or function becomes the name of a tag. XFor each tag, a line is added to the "tags" file which contains: X.RS X.nf X - the name of the tag X - a tab character X - the name of the file containing the tag X - a tab character X - a way to find the particular line within the file. X.RE X.fi X.PP XThe filenames list will typically be the names of all C source Xfiles in the current directory, like this: X.RS X.nf X$ ctags -stv *.[ch] X.RE X.fi X.SH OPTIONS X.IP \fB-t\fR XInclude typedefs. XA tag will be generated for each user-defined type. XAlso tags will be generated for struct and enum names. XTypes are considered to be global if they are defined in a header file, Xand static if they are defined in a C source file. X.IP \fB-v\fR XInclude variable declarations. XA tag will be generated for each variable, except for those that are declared Xinside the body of a function. X.IP \fB-s\fR XInclude static tags. X\fICtags\fR will normally put global tags in the "tags" file, and silently ignore Xthe static tags. XThis flag causes both global and static tags to be added. XThe name of a static tag is generated by prefixing the name of the declared Xitem with the name of the file where it is defined, with a colon in between. XFor example, "static foo(){}" in "bar.c" results in a tag named "bar.c:foo". X.IP \fB-r\fP XThis causes \fIctags\fP to generate both "tags" and "refs". XWithout \fB-r\fP, it would only generate "tags". X.IP \fB-a\fR XAppend to "tags", and maybe "refs". XNormally, \fIctags\fR overwrites these files each time it is invoked. XThis flag is useful when you have to many files in the current directory Xfor you to list them on a single command-line; Xit allows you to split the arguments among several invocations. X.SH FILES X.IP tags XA cross-reference that lists each tag name, the name of the source file that Xcontains it, and a way to locate a particular line in the source file. X.IP refs XThe "refs" file contains the definitions for each tag in the "tags" file, Xand very little else. XThis file can be useful, for example, when licensing restrictions prevent Xyou from making the source code to the standard C library readable by everybody, Xbut you still everybody to know what arguments the library functions need. X.SH BUGS X.PP X\fIctags\fR is sensitive to indenting and line breaks. XConsequently, it might not discover all of the tags in a file that Xis formatted in an unusual way. X.SH "SEE ALSO" Xelvis(1), refs(1) X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi / echo x - elvis.man sed '/^X/s///' > elvis.man << '/' X.TH ELVIS 1 X.SH NAME Xelvis, ex, vi, view, input - The editor X.SH SYNOPSIS X\fBelvis\fP [\fIflags\fP] [\fB+\fP\fIcmd\fP] [\fIfiles\fP...] X.SH DESCRIPTION X\fIElvis\fP is a text editor which emulates \fIvi\fP/\fIex\fP. X.PP XOn systems which pass the program name as an argument, such as Unix and Minix, Xyou may also install \fIelvis\fP under the names "ex", "vi", "view", and "input". XThese extra names would normally be links to elvis; Xsee the "ln" shell command. X.PP XWhen \fIelvis\fP is invoked as "vi", Xit behaves exactly as though it was invoked as "elvis". XHowever, if you invoke \fIelvis\fP as "view", Xthen the readonly option is set as though you had given it the "-R" flag. XIf you invoke \fIelvis\fP as "ex", Xthen \fIelvis\fP will start up in the colon command mode Xinstead of the visual command mode, Xas though you had given it the "-e" flag. XIf you invoke \fIelvis\fP as "input" or "edit", Xthen \fIelvis\fP will start up in input mode, Xas though the "-i" flag was given. X.SH OPTIONS X.IP \fB-r\fP XTo the real vi, this flag means that a previous edit should be recovered. X\fIElvis\fP, though, has a separate program, called \fIelvrec(1)\fP, for recovering Xfiles. XWhen you invoke \fIelvis\fP with -r, \fIelvis\fP will tell you to run \fIelvrec\fP. X.IP \fB-R\fP XThis sets the "readonly" option, Xso you won't accidentally overwrite a file. X.IP "\fB-t\fP \fItag\fP" XThis causes \fIelvis\fP to start editing at the given tag. X.IP "\fB-m\fP [\fIfile\fP]" X\fIElvis\fP will search through \fIfile\fP for something that looks like Xan error message from a compiler. XIt will then begin editing the source file that caused the error, Xwith the cursor sitting on the line where the error was detected. XIf you don't explicitly name a \fIfile\fP, then "errlist" is assumed. X.IP \fB-e\fP X\fIElvis\fP will start up in colon command mode. X.IP \fB-v\fP X\fIElvis\fP will start up in visual command mode. X.IP \fB-i\fP X\fIElvis\fP will start up in input mode. X.IP "\fB-w\fR \fIwinsize\fR" XSets the "window" option's value to \fIwinsize\fR. X.IP "\fB+\fP\fIcommand\fP or \fB-c\fP \fIcommand\fP" XIf you use the +\fIcommand\fP parameter, Xthen after the first file is loaded X\fIcommand\fP is executed as an EX command. XA typical example would be "elvis +237 foo", Xwhich would cause \fIelvis\fP to start editing foo and Xthen move directly to line 237. XThe "-c \fIcommand\fP" variant was added for UNIX SysV compatibility. X.SH FILES X.IP /tmp/elv* XDuring editing, X\fIelvis\fP stores text in a temporary file. XFor UNIX, this file will usually be stored in the /tmp directory, Xand the first three characters will be "elv". XFor other systems, the temporary files may be stored someplace else; Xsee the version-specific section of the documentation. X.IP tags XThis is the database used by the \fI:tags\fP command and the \fB-t\fP option. XIt is usually created by the \fIctags(1)\fP program. X.IP ".exrc or elvis.rc" XOn UNIX-like systems, a file called ".exrc" in your home directory Xis executed as a series of \fIex\fR commands. XA file by the same name may be executed in the current directory, too. XOn non-UNIX systems, ".exrc" is usually an invalid file name; Xthere, the initialization file is called "elvis.rc" instead. X.SH "SEE ALSO" Xctags(1), ref(1), virec(1) X.PP X\fIElvis - A Clone of Vi/Ex\fP, the complete \fIelvis\fP documentation. X.SH BUGS XThere is no LISP support. XCertain other features are missing, too. X.PP XAuto-indent mode is not quite compatible with the real vi. XAmong other things, 0^D and ^^D don't do what you might expect. X.PP XLong lines are displayed differently. XThe real vi wraps long lines onto multiple rows of the screen, Xbut \fIelvis\fP scrolls sideways. X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi X.PP XMany other people have worked to port \fIelvis\fP to various operating systems. XTo see who deserves credit, run the \fI:version\fP command from within \fIelvis\fP, Xor look in the system-specific section of the complete documentation. / echo x - elvprsv.man sed '/^X/s///' > elvprsv.man << '/' X.TH ELVPRSV 1 X.SH NAME Xelvprsv - Preserve the the modified version of a file after a crash. X.SH SYNOPSIS X.nf X\fB\fBelvprsv\fP ["-\fIwhy elvis died\fP"] /tmp/\fIfilename\fP... X\fB\fBelvprsv\fP -R /tmp/\fIfilename\fP... X.fi X.SH DESCRIPTION X.PP X\fIelvprsv\fP preserves your edited text after \fIelvis\fP dies. XThe text can be recovered later, via the \fIelvprsv\fP program. X.PP XFor UNIX-like systems, Xyou should never need to run this program from the command line. XIt is run automatically when \fIelvis\fP is about to die, Xand it should be run (via /etc/rc) when the computer is booted. XTHAT'S ALL! X.PP XFor non-UNIX systems such as MS-DOS, you can either use \fIelvprsv\fP Xthe same way as under UNIX systems (by running it from your AUTOEXEC.BAT file), Xor you can run it separately with the "-R" flag to recover the files Xin one step. X.PP XIf you're editing a file when \fIelvis\fP dies X(due to a bug, @��@��@��@��@��@��@��@��@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������system crash, power failure, etc.) Xthen \fIelvprsv\fP will preserve the most recent version of your text. XThe preserved text is stored in a special directory; it does NOT overwrite Xyour text file automatically. X.PP X\fIelvprsv\fP will send mail to any user whose work it preserves, Xif your operating system normally supports mail. X.SH FILES X.IP /tmp/elv* XThe temporary file that \fIelvis\fP was using when it died. X.IP /usr/preserve/p* XThe text that is preserved by \fIelvprsv\fP. X.IP /usr/preserve/Index XA text file which lists the names of all preserved files, and the names Xof the /usr/preserve/p* files which contain their preserved text. X.SH BUGS X.PP XDue to the permissions on the /usr/preserve directory, on UNIX systems X\fIelvprsv\fP must be run as superuser. XThis is accomplished by making the \fIelvprsv\fP executable be owned by "root" Xand turning on its "set user id" bit. X.PP XIf you're editing a nameless buffer when \fIelvis\fP dies, then \fIelvprsv\fP will pretend Xthat the file was named "foo". X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi / echo x - elvrec.man sed '/^X/s///' > elvrec.man << '/' X.TH ELVREC 1 X.SH NAME Xelvrec - Recover the modified version of a file after a crash X.SH SYNOPSIS X.nf X\fBelvrec\fP [\fIpreservedfile\fP [\fInewfile\fR]] X.fi X.SH DESCRIPTION X.PP XIf you're editing a file when \fIelvis\fP dies, the system crashes, or power fails, Xthe most recent version of your text will be preserved. XThe preserved text is stored in a special directory; it does NOT overwrite Xyour text file automatically. X.PP XThe \fIelvrec\fP program locates the preserved version of a given file, Xand writes it over the top of your text file -- or to a new file, if you prefer. XThe recovered file will have nearly all of your changes. X.PP XTo see a list of all recoverable files, run \fIelvrec\fP with no arguments. X.SH FILES X.IP /usr/preserve/p* XThe text that was preserved when \fIelvis\fP died. X.IP /usr/preserve/Index XA text file which lists the names of all preserved files, and the names Xof the /usr/preserve/p* files which contain their preserved text. X.SH BUGS X.PP X\fIelvrec\fP is very picky about filenames. XYou must tell it to recover the file using exactly the same pathname as Xwhen you were editing it. XThe simplest way to do this is to go into the same directory that you were Xediting, and invoke \fIelvrec\fP with the same filename as \fIelvis\fP. XIf that doesn't work, then try running \fIelvrec\fP with no arguments, Xto see exactly which pathname it is using for the desired file. X.PP XDue to the permissions on the /usr/preserve directory, on UNIX systems X\fIelvrec\fP must be run as superuser. XThis is accomplished by making the \fIelvrec\fP executable be owned by "root" Xand setting its "set user id" bit. X.PP XIf you're editing a nameless buffer when \fIelvis\fP dies, then \fIelvrec\fP Xwill pretend that the file was named "foo". X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi / echo x - fmt.man sed '/^X/s///' > fmt.man << '/' X.TH FMT 1 X.SH NAME Xfmt - adjust line-length for paragraphs of text X.SH SYNOPSIS X\fBfmt\fP [\-\fIwidth\fP] [\fIfiles\fP]... X.SH DESCRIPTION X\fIfmt\fR is a simple text formatter. XIt inserts or deletes newlines, as necessary, to make all lines in a Xparagraph be approximately the same width. XIt preserves indentation and word spacing. X.PP XThe default line width is 72 characters. XYou can override this with the \-\fIwidth\fR flag. XIf you don't name any files on the command line, Xthen \fIfmt\fR will read from stdin. X.PP XIt is typically used from within \fIvi\fR to adjust the line breaks Xin a single paragraph. XTo do this, move the cursor to the top of the paragraph, Xtype "!}fmt", and Xhit <Return>. X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi / echo x - ref.man sed '/^X/s///' > ref.man << '/' X.TH REF 1 X.SH NAME Xref - Display a C function header X.SH SYNOPSIS X\fBref\fR [-t] [-c \fIclass\fR]... [-f \fIfile\fR]... \fItag\fR X.SH DESCRIPTION X\fIref\fP quickly locates and displays the header of a function. XTo do this, \fIref\fR Xlooks in the "tags" file for the line that describes the function, and then Xscans the source file for the function. XWhen it locates the function, it displays an introductory comment X(if there is one), the function's declaration, and the declarations of all Xarguments. X.SH "SEARCH METHOD" X.PP X\fIref\fR uses a fairly sophisticated tag look-up algorithm. XIf you supply a filename via \fB-f\fR \fIfile\fR, then elvis first scans Xthe tags file for a static tag from that file. XThis search is limited to the tags file in the current directory. X.PP XIf you supply a classname via \fB-c\fR \fIclass\fR, then elvis searches Xfor a tag from that class. XThis search is not limited to the current directory; XYou can supply a list of directories in the environment variable \fITAGPATH\fR, Xand \fIref\fR will search through the "tags" file in each directory until it finds Xa tag in the desired class. X.PP XIf that fails, \fIref\fR will then try to look up an ordinary global tag. XThis search checks all of the directories listed in \fITAGPATH\fR, too. X.PP XIf you've given the \fB-t\fR flag, then \fIref\fR will simply output the tag line that Xit found, and then exit. XWithout \fB-t\fR, though, \fIref\fR will search for the tag line. XIt will try to open the source file, which should be in the same directory Xas the tags file where the tag was discovered. XIf the source file doesn't exist, or is unreadable, then \fIref\fR will try to open Xa file called "\fIrefs\fR" in that directory. XEither way, \fIref\fR will try to locate the tag, and display whatever it finds. X.SH "INTERACTION WITH ELVIS" X.PP X\fIref\fP is used by \fIelvis\fR' shift-K command. XIf the cursor is located on a word such as "splat", in the file "foo.c", Xthen \fIelvis\fR will invoke \fIref\fR with the command "ref -f foo.c splat". X.PP XIf \fIelvis\fR has been compiled with the -DEXTERNAL_TAGS flag, then \fIelvis\fR will Xuse \fIref\fR \fB\fRto scan the tags files. XThis is slower than the built-in tag searching, but it allows \fIelvis\fR to access Xthe more sophisticated tag lookup provided by \fIref\fR. XOther than that, external tags should act exactly like internal tags. X.SH OPTIONS X.IP \fB-t\fR XOutput tag info, instead of the function header. X.IP "\fB-f\fR \fIfile\fR" XThe tag might be a static function in \fIfile\fR. XYou can use several -f flags to have \fIref\fR consider static tags from more than one file. X.IP "\fB-c\fR \fIclass\fR" XThe tag might be a member of class \fIclass\fR. XYou can use several -c flags to have \fIref\fR consider tags from more than one class. X.SH FILES X.IP \fBtags\fR XList of function names and their locations, generated by \fIctags\fR. X.IP \fBrefs\fR XFunction headers extracted from source files (optional). X.SH ENVIRONMENT X.IP \fBTAGPATH\fR XList of directories to be searched. XThe elements in the list are separated by either Xsemicolons (for MS-DOS, Atari TOS, and AmigaDos), or Xby colons (every other operating system). XFor each operating system, \fIref\fR has a built-in default which is probably Xadequate. X.SH NOTES X.PP XYou might want to generate a "tags" file the directory that contains the Xsource code for standard C library on your system. XIf licensing restrictions prevent you from making the library source readable Xby everybody, then you can have \fIctags\fR generate a "refs" file, Xand make "refs" readable by everybody. X.PP XIf your system doesn't come with the library source code, then perhaps you Xcan produce something workable from the \fIlint\fR libraries. X.SH "SEE ALSO" Xelvis(1), ctags(1) X.SH AUTHOR X.nf XSteve Kirkendall Xkirkenda@cs.pdx.edu X.fi / ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Elvis is a clone of vi/ex, the standard UNIX editor. Elvis supports nearly all of the vi/ex commands, in both visual mode and colon mode. Elvis runs under BSD UNIX, AT&T SysV UNIX, SCO Xenix, Minix, MS-DOS (Turbo-C or MSC 5.1), Atari TOS, OS9/68000, Coherent, VMS, and AmigaDos. Ports to other operating systems are in progress; contact me before you start porting it to some other OS, because somebody else may have already done it for you. Elvis is freely redistributable, in either source form or executable form. There are no restrictions on how you may use it. The file "elvisman.txt" contains the manual for elvis. It is a plain ASCII file with nothing more exotic than a newline character. It is formatted for 66-line, 80-column pages. There may also be an archive of "*.ms" and "*.man" files, which contain the TROFF source text used to generate that manual. The file named "Makefile.mix" is used to compile elvis for all systems except VMS and possibly MS-DOS. You should copy "Makefile.mix" to "Makefile", and then edit "Makefile" to select the appropriate group of settings for your system. Author: Steve Kirkendall 14407 SW Teal Blvd. #C Beaverton, OR 97005 E-mail: kirkenda@cs.pdx.edu Phone: (503) 643-6980 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* blk.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the functions that get/put blocks from the temp file. * It also contains the "do" and "undo" functions. */ #include "config.h" #include "vi.h" #ifndef NBUFS # define NBUFS 5 /* must be at least 3 -- more is better */ #endif /*------------------------------------------------------------------------*/ BLK hdr; /* buffer for the header block */ static int b4cnt; /* used to count context of beforedo/afterdo */ static struct _blkbuf { BLK buf; /* contents of a text block */ unsigned short logical; /* logical block number */ int dirty; /* must the buffer be rewritten? */ } blk[NBUFS], /* buffers for text[?] blocks */ *toonew, /* buffer which shouldn't be recycled yet */ *newtoo, /* another buffer which should be recycled */ *recycle = blk; /* next block to be recycled */ /* This function wipes out all buffers */ void blkinit() { int i; for (i = 0; i < NBUFS; i++) { blk[i].logical = 0; blk[i].dirty = FALSE; } for (i = 0; i < MAXBLKS; i++) { hdr.n[i] = 0; } } /* This function allocates a buffer and fills it with a given block's text */ BLK *blkget(logical) int logical; /* logical block number to fetch */ { REG struct _blkbuf *this; /* used to step through blk[] */ REG int i; /* if logical is 0, just return the hdr buffer */ if (logical == 0) { return &hdr; } /* see if we have that block in mem already */ for (this = blk; this < &blk[NBUFS]; this++) { if (this->logical == logical) { newtoo = toonew; toonew = this; return &this->buf; } } /* choose a block to be recycled */ do { this = recycle++; if (recycle == &blk[NBUFS]) { recycle = blk; } } while (this == toonew || this == newtoo); /* if it contains a block, flush that block */ blkflush(this); /* fill this buffer with the desired block */ this->logical = logical; if (hdr.n[logical]) { /* it has been used before - fill it from tmp file */ lseek(tmpfd, (long)hdr.n[logical] * (long)BLKSIZE, 0); if (read(tmpfd, this->buf.c, (unsigned)BLKSIZE) != BLKSIZE) { msg("Error reading back from tmp file!"); } } else { /* it is new - zero it */ for (i = 0; i < BLKSIZE; i++) { this->buf.c[i] = 0; } } /* This isn't really a change, but it does potentially invalidate * the kinds of shortcuts that the "changes" variable is supposed * to protect us from... so count it as a change. */ changes++; /* mark it as being "not dirty" */ this->dirty = 0; /* return it */ newtoo = toonew; toonew = this; return &this->buf; } /* This function writes a block out to the temporary file */ void blkflush(this) REG struct _blkbuf *this; /* the buffer to flush */ { long seekpos; /* seek position of the new block */ unsigned short physical; /* physical block number */ /* if its empty (an orphan blkadd() maybe?) then make it dirty */ if (this->logical && !*this->buf.c) { blkdirty(&this->buf); } /* if it's an empty buffer or a clean version is on disk, quit */ if (!this->logical || hdr.n[this->logical] && !this->dirty) { return; } /* find a free place in the file */ #ifndef NO_RECYCLE seekpos = allocate(); lseek(tmpfd, seekpos, 0); #else seekpos = lseek(tmpfd, 0L, 2); #endif physical = seekpos / BLKSIZE; /* put the block there */ if (write(tmpfd, this->buf.c, (unsigned)BLKSIZE) != BLKSIZE) { msg("Trouble writing to tmp file"); } this->dirty = FALSE; /* update the header so it knows we put it there */ hdr.n[this->logical] = physical; } /* This function sets a block's "dirty" flag or deletes empty blocks */ void blkdirty(bp) BLK *bp; /* buffer returned by blkget() */ { REG int i, j; REG char *scan; REG int k; /* find the buffer */ for (i = 0; i < NBUFS && bp != &blk[i].buf; i++) { } #ifdef DEBUG if (i >= NBUFS) { msg("blkdirty() called with unknown buffer at 0x%lx", bp); return; } if (blk[i].logical == 0) { msg("blkdirty called with freed buffer"); return; } #endif /* if this block ends with line# INFINITY, then it must have been * allocated unnecessarily during tmpstart(). Forget it. */ if (lnum[blk[i].logical] == INFINITY) { #ifdef DEBUG if (blk[i].buf.c[0]) { msg("bkldirty called with non-empty extra BLK"); } #endif blk[i].logical = 0; blk[i].dirty = FALSE; return; } /* count lines in this block */ for (j = 0, scan = bp->c; *scan && scan < bp->c + BLKSIZE; scan++) { if (*scan == '\n') { j++; } } /* adjust lnum, if necessary */ k = blk[i].logical; j += (lnum[k - 1] - lnum[k]); if (j != 0) { nlines += j; while (k < MAXBLKS && lnum[k] != INFINITY) { lnum[k++] += j; } } /* if it still has text, mark it as dirty */ if (*bp->c) { blk[i].dirty = TRUE; } else /* empty block, so delete it */ { /* adjust the cache */ k = blk[i].logical; for (j = 0; j < NBUFS; j++) { if (blk[j].logical >= k) { blk[j].logical--; } } /* delete it from hdr.n[] and lnum[] */ blk[i].logical = 0; blk[i].dirty = FALSE; while (k < MAXBLKS - 1) { hdr.n[k] = hdr.n[k + 1]; lnum[k] = lnum[k + 1]; k++; } hdr.n[MAXBLKS - 1] = 0; lnum[MAXBLKS - 1] = INFINITY; } } /* insert a new block into hdr, and adjust the cache */ BLK *blkadd(logical) int logical; /* where to insert the new block */ { REG int i; /* adjust hdr and lnum[] */ for (i = MAXBLKS - 1; i > logical; i--) { hdr.n[i] = hdr.n[i - 1]; lnum[i] = lnum[i - 1]; } hdr.n[logical] = 0; lnum[logical] = lnum[logical - 1]; /* adjust the cache */ for (i = 0; i < NBUFS; i++) { if (blk[i].logical >= logical) { blk[i].logical++; } } /* return the new block, via blkget() */ return blkget(logical); } /* This function forces all dirty blocks out to disk */ void blksync() { int i; for (i = 0; i < NBUFS; i++) { /* blk[i].dirty = TRUE; */ blkflush(&blk[i]); } if (*o_sync) { sync(); } } /*------------------------------------------------------------------------*/ static MARK undocurs; /* where the cursor should go if undone */ static long oldnlines; static long oldlnum[MAXBLKS]; /* This function should be called before each command that changes the text. * It defines the state that undo() will reset the file to. */ void beforedo(forundo) int forundo; /* boolean: is this for an undo? */ { REG int i; REG long l; /* if this is a nested call to beforedo, quit! Use larger context */ if (b4cnt++ > 0) { return; } /* force all block buffers to disk */ blksync(); #ifndef NO_RECYCLE /* perform garbage collection on blocks from tmp file */ garbage(); #endif /* force the header out to disk */ lseek(tmpfd, 0L, 0); if (write(tmpfd, hdr.c, (unsigned)BLKSIZE) != BLKSIZE) { msg("Trouble writing header to tmp file "); } /* copy or swap oldnlines <--> nlines, oldlnum <--> lnum */ if (forundo) { for (i = 0; i < MAXBLKS; i++) { l = lnum[i]; lnum[i] = oldlnum[i]; oldlnum[i] = l; } l = nlines; nlines = oldnlines; oldnlines = l; } else { for (i = 0; i < MAXBLKS; i++) { oldlnum[i] = lnum[i]; } oldnlines = nlines; } /* save the cursor position */ undocurs = cursor; /* upon return, the calling function continues and makes changes... */ } /* This function marks the end of a (nested?) change to the file */ void afterdo() { if (--b4cnt) { /* after abortdo(), b4cnt may decribe nested beforedo/afterdo * pairs incorrectly. If it is decremented to often, then * keep b4cnt sane but don't do anything else. */ if (b4cnt < 0) b4cnt = 0; return; } /* make sure the cursor wasn't left stranded in deleted text */ if (markline(cursor) > nlines) { cursor = MARK_LAST; } /* NOTE: it is still possible that markidx(cursor) is after the * end of a line, so the Vi mode will have to take care of that * itself */ /* if a significant change has been made to this file, then set the * MODIFIED flag. */ if (significant) { setflag(file, MODIFIED); setflag(file, UNDOABLE); } } /* This function cuts short the current set of changes. It is called after * a SIGINT@��@��@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������. */ void abortdo() { /* finish the operation immediately. */ if (b4cnt > 0) { b4cnt = 1; afterdo(); } /* in visual mode, the screen is probably screwed up */ if (mode == MODE_COLON) { mode = MODE_VI; } if (mode == MODE_VI) { redraw(MARK_UNSET, FALSE); } } /* This function discards all changes made since the last call to beforedo() */ int undo() { BLK oldhdr; /* if beforedo() has never been run, fail */ if (!tstflag(file, UNDOABLE)) { msg("You haven't modified this file yet."); return FALSE; } /* read the old header form the tmp file */ lseek(tmpfd, 0L, 0); if (read(tmpfd, oldhdr.c, (unsigned)BLKSIZE) != BLKSIZE) { msg("Trouble rereading the old header from tmp file"); } /* "do" the changed version, so we can undo the "undo" */ cursor = undocurs; beforedo(TRUE); afterdo(); /* wipe out the block buffers - we can't assume they're correct */ blkinit(); /* use the old header -- and therefore the old text blocks */ hdr = oldhdr; /* This is a change */ significant = TRUE; changes++; return TRUE; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cmd1.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains some of the EX commands - mostly ones that deal with * files, options, etc. -- anything except text. */ #include "config.h" #include "ctype.h" #include "vi.h" #include "regexp.h" #ifdef DEBUG /* print the selected lines with info on the blocks */ /*ARGSUSED*/ void cmd_debug(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { REG char *scan; REG long l; REG int i; int len; /* scan lnum[] to determine which block its in */ l = markline(frommark); for (i = 1; l > lnum[i]; i++) { } do { /* fetch text of the block containing that line */ scan = blkget(i)->c; /* calculate its length */ if (scan[BLKSIZE - 1]) { len = BLKSIZE; } else { len = strlen(scan); } /* print block stats */ msg("##### hdr[%d]=%d, lnum[%d-1]=%ld, lnum[%d]=%ld (%ld lines)", i, hdr.n[i], i, lnum[i-1], i, lnum[i], lnum[i] - lnum[i - 1]); msg("##### len=%d, buf=0x%lx, %sdirty", len, scan, ((int *)scan)[MAXBLKS + 1] ? "" : "not "); if (bang) { while (--len >= 0) { addch(*scan); scan++; } } exrefresh(); /* next block */ i++; } while (i < MAXBLKS && lnum[i] && lnum[i - 1] < markline(tomark)); } /* This function checks a lot of conditions to make sure they aren't screwy */ /*ARGSUSED*/ void cmd_validate(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { char *scan; int i; int nlcnt; /* used to count newlines */ int len; /* counts non-NUL characters */ /* check lnum[0] */ if (lnum[0] != 0L) { msg("lnum[0] = %ld", lnum[0]); } /* check each block */ for (i = 1; lnum[i] <= nlines; i++) { scan = blkget(i)->c; if (scan[BLKSIZE - 1]) { msg("block %d has no NUL at the end", i); } else { for (nlcnt = len = 0; *scan; scan++, len++) { if (*scan == '\n') { nlcnt++; } } if (scan[-1] != '\n') { msg("block %d doesn't end with '\\n' (length %d)", i, len); } if (bang || nlcnt != lnum[i] - lnum[i - 1]) { msg("block %d (line %ld?) has %d lines, but should have %ld", i, lnum[i - 1] + 1L, nlcnt, lnum[i] - lnum[i - 1]); } } exrefresh(); } /* check lnum again */ if (lnum[i] != INFINITY) { msg("hdr.n[%d] = %d, but lnum[%d] = %ld", i, hdr.n[i], i, lnum[i]); } msg("# = \"%s\", %% = \"%s\"", prevorig, origname); msg("V_from=%ld.%d, cursor=%ld.%d", markline(V_from), markidx(V_from), markline(cursor), markidx(cursor)); } #endif /* DEBUG */ /*ARGSUSED*/ void cmd_mark(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { /* validate the name of the mark */ if (*extra == '"') { extra++; } /* valid mark names are lowercase ascii characters */ if (!isascii(*extra) || !islower(*extra) || extra[1]) { msg("Invalid mark name"); return; } mark[*extra - 'a'] = tomark; } /*ARGSUSED*/ void cmd_write(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { int fd; int append; /* boolean: write in "append" mode? */ REG long l; REG char *scan; REG int i; /* if writing to a filter, then let filter() handle it */ if (*extra == '!') { filter(frommark, tomark, extra + 1, FALSE); return; } /* if all lines are to be written, use tmpsave() */ if (frommark == MARK_FIRST && tomark == MARK_LAST && cmd == CMD_WRITE) { tmpsave(extra, bang); return; } /* see if we're going to do this in append mode or not */ append = FALSE; if (extra[0] == '>' && extra[1] == '>') { extra += 2; append = TRUE; } /* either the file must not exist, or we must have a ! or be appending */ if (access(extra, 0) == 0 && !bang && !append) { msg("File already exists - Use :w! to overwrite"); return; } /* else do it line-by-line, like cmd_print() */ if (append) { #ifdef O_APPEND fd = open(extra, O_WRONLY|O_APPEND); #else fd = open(extra, O_WRONLY); if (fd >= 0) { lseek(fd, 0L, 2); } #endif } else { fd = -1; /* so we know the file isn't open yet */ } if (fd < 0) { fd = creat(extra, FILEPERMS); if (fd < 0) { msg("Can't write to \"%s\"", extra); return; } } for (l = markline(frommark); l <= markline(tomark); l++) { /* get the next line */ scan = fetchline(l); i = strlen(scan); scan[i++] = '\n'; /* print the line */ if (twrite(fd, scan, i) < i) { msg("Write failed"); break; } } rptlines = markline(tomark) - markline(frommark) + 1; rptlabel = "written"; close(fd); } /*ARGSUSED*/ void cmd_shell(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { static char prevextra[80]; /* special case: ":sh" means ":!sh" */ if (cmd == CMD_SHELL) { extra = o_shell; frommark = tomark = 0L; } /* if extra is "!", substitute previous command */ if (*extra == '!') { if (!*prevextra) { msg("No previous shell command to substitute for '!'"); return; } extra = prevextra; } else if (cmd == CMD_BANG && strlen(extra) < sizeof(prevextra) - 1) { strcpy(prevextra, extra); } /* warn the user if the file hasn't been saved yet */ if (*o_warn && tstflag(file, MODIFIED)) { if (mode == MODE_VI) { mode = MODE_COLON; } msg("Warning: \"%s\" has been modified but not yet saved", origname); } /* if no lines were specified, just run the command */ suspend_curses(); if (frommark == 0L) { system(extra); } else /* pipe lines from the file through the command */ { filter(frommark, tomark, extra, TRUE); } /* resume curses quietly for MODE_EX, but noisily otherwise */ resume_curses(mode == MODE_EX); } /*ARGSUSED*/ void cmd_global(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; /* rest of the command line */ { char *cmdptr; /* the command from the command line */ char cmdln[100]; /* copy of the command from the command line */ char *line; /* a line from the file */ long l; /* used as a counter to move through lines */ long lqty; /* quantity of lines to be scanned */ long nchanged; /* number of lines changed */ regexp *re; /* the compiled search expression */ /* can't nest global commands */ if (doingglobal) { msg("Can't nest global commands."); rptlines = -1L; return; } /* ":g! ..." is the same as ":v ..." */ if (bang) { cmd = CMD_VGLOBAL; } /* make sure we got a search pattern */ if (*extra != '/' && *extra != '?') { msg("Usage: %c /regular expression/ command", cmd == CMD_GLOBAL ? 'g' : 'v'); return; } /* parse & compile the search pattern */ cmdptr = parseptrn(extra); if (!extra[1]) { msg("Can't use empty regular expression with '%c' command", cmd == CMD_GLOBAL ? 'g' : 'v'); return; } re = regcomp(extra + 1); if (!re) { /* regcomp found & described an error */ return; } /* for each line in the range */ doingglobal = TRUE; ChangeText { /* NOTE: we have to go through the lines in a forward order, * otherwise "g/re/p" would look funny. *BUT* for "g/re/d" * to work, simply adding 1 to the line# on each loop won't * work. The solution: count lines relative to the end of * the file. Think about it. */ for (l = nlines - markline(frommark), lqty = markline(tomark) - markline(frommark) + 1L, nchanged = 0L; lqty > 0 && nlines - l >= 0 && nchanged >= 0L; l--, lqty--) { /* fetch the line */ line = fetchline(nlines - l); /* if it contains the search pattern... */ if ((!regexec(re, line, 1)) == (cmd != CMD_GLOBAL)) { /* move the cursor to that line */ cursor = MARK_AT_LINE(nlines - l); /* do the ex command (without mucking up * the original copy of the command line) */ strcpy(cmdln, cmdptr); rptlines = 0L; doexcmd(cmdln); nchanged += rptlines; } } } doingglobal = FALSE; /* free the regexp */ free(re); /* Reporting...*/ rptlines = nchanged; } /*ARGSUSED*/ void cmd_file(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; @��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@��@������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������int bang; char *extra; { #ifndef CRUNCH /* if we're given a new filename, use it as this file's name */ if (extra && *extra) { strcpy(origname, extra); storename(origname); setflag(file, NOTEDITED); } #endif if (cmd == CMD_FILE) { #ifndef CRUNCH msg("\"%s\" %s%s%s %ld lines, line %ld [%ld%%]", #else msg("\"%s\" %s%s %ld lines, line %ld [%ld%%]", #endif *origname ? origname : "[NO FILE]", tstflag(file, MODIFIED) ? "[MODIFIED]" : "", #ifndef CRUNCH tstflag(file, NOTEDITED) ?"[NOT EDITED]":"", #endif tstflag(file, READONLY) ? "[READONLY]" : "", nlines, markline(frommark), markline(frommark) * 100 / nlines); } #ifndef CRUNCH else if (markline(frommark) != markline(tomark)) { msg("range \"%ld,%ld\" contains %ld lines", markline(frommark), markline(tomark), markline(tomark) - markline(frommark) + 1L); } #endif else { msg("%ld", markline(frommark)); } } /*ARGSUSED*/ void cmd_edit(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { long line = 1L; /* might be set to prevline */ #ifndef CRUNCH char *init = (char *)0; #endif /* if ":vi", then switch to visual mode, and if no file is named * then don't switch files. */ if (cmd == CMD_VISUAL) { mode = MODE_VI; msg(""); if (!*extra) { return; } } /* Editing previous file? Then start at previous line */ if (!strcmp(extra, prevorig)) { line = prevline; } #ifndef CRUNCH /* if we were given an explicit starting line, then start there */ if (*extra == '+') { for (init = ++extra; !isspace(*extra); extra++) { } while (isspace(*extra)) { *extra++ = '\0'; } if (!*init) { init = "$"; } if (!extra) { extra = origname; } } #endif /* not CRUNCH */ /* switch files */ if (tmpabort(bang)) { tmpstart(extra); if (line <= nlines && line >= 1L) { cursor = MARK_AT_LINE(line); } #ifndef CRUNCH if (init) { doexcmd(init); } #endif } else { msg("Use edit! to abort changes, or w to save changes"); /* so we can say ":e!#" next time... */ strcpy(prevorig, extra); prevline = 1L; } } /* This code is also used for rewind -- GB */ /*ARGSUSED*/ void cmd_next(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { int i, j; char *scan; /* if extra stuff given, use ":args" to define a new args list */ if (cmd == CMD_NEXT && extra && *extra) { cmd_args(frommark, tomark, cmd, bang, extra); } /* move to the next arg */ if (cmd == CMD_NEXT) { i = argno + 1; } else if (cmd == CMD_PREVIOUS) { i = argno - 1; } else /* cmd == CMD_REWIND */ { i = 0; } if (i < 0 || i >= nargs) { msg("No %sfiles to edit", cmd == CMD_REWIND ? "" : "more "); return; } /* find & isolate the name of the file to edit */ for (j = i, scan = args; j > 0; j--) { while(*scan++) { } } /* switch to the next file */ if (tmpabort(bang)) { tmpstart(scan); argno = i; } else { msg("Use :%s! to abort changes, or w to save changes", cmd == CMD_NEXT ? "next" : cmd == CMD_PREVIOUS ? "previous" : "rewind"); } } /* also called from :wq -- always writes back in this case */ /*ARGSUSED*/ void cmd_xit(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { static long whenwarned; /* when the user was last warned of extra files */ int oldflag; /* if there are more files to edit, then warn user */ if (argno >= 0 && argno + 1 < nargs && whenwarned != changes && (!bang || cmd != CMD_QUIT)) { msg("More files to edit -- Use \":n\" to go to next file"); whenwarned = changes; return; } if (cmd == CMD_QUIT) { oldflag = *o_autowrite; *o_autowrite = FALSE; if (tmpabort(bang)) { mode = MODE_QUIT; } else { msg("Use q! to abort changes, or wq to save changes"); } *o_autowrite = oldflag; } else { /* else try to save this file */ oldflag = tstflag(file, MODIFIED); if (cmd == CMD_WQUIT) setflag(file, MODIFIED); if (tmpend(bang)) { mode = MODE_QUIT; } else { msg("Could not save file -- use quit! to abort changes, or w filename"); } if (!oldflag) clrflag(file, MODIFIED); } } /*ARGSUSED*/ void cmd_args(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { char *scan; int col; int arg; int scrolled = FALSE; int width; /* if no extra names given, or just current name, then report the args * we have now. */ if (!extra || !*extra) { /* empty args list? */ if (nargs == 1 && !*args) { return; } /* list the arguments */ for (scan = args, col = arg = 0; arg < nargs; scan += width + 1, col += width, arg++) { width = strlen(scan); if (col + width >= COLS - 4) { addch('\n'); col = 0; scrolled = TRUE; } else if (col > 0) { addch(' '); col++; } if (arg == argno) { addch('['); addstr(scan); addch(']'); col += 2; } else { addstr(scan); } } /* write a trailing newline */ if ((mode == MODE_EX || mode == MODE_COLON || scrolled) && col) { addch('\n'); } exrefresh(); } else /* new args list given */ { for (scan = args, nargs = 1; *extra; ) { if (isspace(*extra)) { *scan++ = '\0'; while (isspace(*extra)) { extra++; } if (*extra) { nargs++; } } else { *scan++ = *extra++; } } *scan = '\0'; /* reset argno to before the first, so :next will go to first */ argno = -1; if (nargs != 1) { msg("%d files to edit", nargs); } } } /*ARGSUSED*/ void cmd_cd(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { char *getenv(); #ifndef CRUNCH /* if current file is modified, and no '!' was given, then error */ if (tstflag(file, MODIFIED) && !bang) { msg("File modified; use \"cd! %s\" to switch anyway", extra); } #endif /* default directory name is $HOME */ if (!*extra) { extra = getenv("HOME"); if (!extra) { msg("environment variable $HOME not set"); return; } } /* go to the directory */ if (chdir(extra) < 0) { perror(extra); } } /*ARGSUSED*/ void cmd_map(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { char *mapto; char *build, *scan; #ifndef NO_FKEY static char *fnames[NFKEYS] = { "#10", "#1", "#2", "#3", "#4", "#5", "#6", "#7", "#8", "#9", # ifndef NO_SHIFT_FKEY "#10s", "#1s", "#2s", "#3s", "#4s", "#5s", "#6s", "#7s", "#8s", "#9s", # ifndef NO_CTRL_FKEY "#10c", "#1c", "#2c", "#3c", "#4c", "#5c", "#6c", "#7c", "#8c", "#9c", # ifndef NO_ALT_FKEY "#10a", "#1a", "#2a", "#3a", "#4a", "#5a", "#6a", "#7a", "#8a", "#9a", # endif # endif # endif }; int key; #endif /* "map" with no extra will dump the map table contents */ if (!*extra) { #ifndef NO_ABBR if (cmd == CMD_ABBR) { dumpkey(bang ? WHEN_EX|WHEN_VIINP|WHEN_VIREP : WHEN_VIINP|WHEN_VIREP, TRUE); } else #endif { dumpkey(bang ? WHEN_VIINP|WHEN_VIREP : WHEN_VICMD, FALSE); } } else { /* "extra" is key to map, followed by what it maps to */ /* handle quoting inside the "raw" string */ for (build = mapto = extra; *mapto && (*mapto != ' ' && *mapto != '\t'); *build++ = *mapto++) { if (*mapto == ctrl('V') && mapto[1]) { mapto++; } } /* skip whitespace, and mark the end of the "raw" string */ while ((*mapto == ' ' || *mapto == '\t')) { *mapto++ = '\0'; } *build = '\0'; /* strip ^Vs from the "cooked" string */ for (scan = build = mapto; *scan; *build++ = *scan++) { if (*scan == ctrl('V') && scan[1]) { scan++; } } *build = '\0'; #ifndef NO_FKEY /* if the mapped string is '#' and a number, then assume * the user wanted that function key */ if (extra[0] == '#' && isdigit(extra[1])) { key = atoi(extra + 1) % 10; # ifndef NO_SHIFT_FKEY build = extra + strlen(extra) - 1; if (*build == 's') key += 10; # ifndef NO_CTRL_FKEY else if (*build == 'c') key += 20; # ifndef NO_ALT_FKEY else if (*build == 'a') key += 30; # endif # endif # endif if (FKEY[key]) mapkey(FKEY[key], mapto, bang ? WHEN_VIINP|WHEN_VIREP : WHEN_VICMD, fnames[key]); else msg("This terminal has no %s key", fnames[key]); } else #endif #ifndef NO_ABBR if (cmd == CMD_ABBR || cmd == CMD_UNABBR) { mapkey(extra, mapto, bang ? WHEN_EX|WHEN_VIINP|WHEN_VIREP : WHEN_VIINP|WHEN_VIREP, "abbr"); } else #endif { mapkey(extra, mapto, bang ? WHEN_VIINP|WHEN_VIREP : WHEN_VICMD, (char *)0); } } } /*ARGSUSED*/ void cmd_set(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { if (!*extra) { dumpopts(FALSE);/* "FALSE" means "don't dump all" - only set */ } else if (!strcmp(extra, "all")) { dumpopts(TRUE); /* "TRUE" means "dump all" - even unset vars */ } else { setopts(extra); /* That option may have affected the appearence of text */ changes++; } } /*ARGSUSED*/ void cmd_tag(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { int fd; /* file descriptor used to read the file */ char *scan; /* used to scan through the tmpblk.c */ #ifdef INTERNAL_TAGS char *cmp; /* char of tag name we're comparing, or NULL */ char *end; /* marks the end of chars in tmpblk.c */ #else int i; #endif #ifndef NO_MAGIC char wasmagic; /* preserves the original state of o_magic */ #endif static char prevtag[30]; /* if no tag is given, use the previous tag */ if (!extra || !*extra) { if (!*prevtag) { msg("No previous tag"); return; } extra = prevtag; } else { strncpy(prevtag, extra, sizeof prevtag); prevtag[sizeof prevtag - 1] = '\0'; } #ifndef INTERNAL_TAGS /* use "ref" to look up the tag info for this tag */ sprintf(tmpblk.c, "ref -t %s%s %s", (*origname ? "-f" : ""),origname, prevtag); fd = rpipe(tmpblk.c, 0); if (fd < 0) { msg("Can't run \"%s\"", tmpblk.c); return; } /* try to read the tag info */ for (scan = tmpblk.c; (i = tread(fd, scan, scan - tmpblk.c + BLKSIZE)) > 0; scan += i) { } *scan = '\0'; /* close the pipe. abort if error */ if (rpclose(fd) != 0 || scan < tmpblk.c + 3) { msg("tag \"%s\" not found", extra); return; } #else /* use internal code to look up the tag */ /* open the tags file */ fd = open(TAGS, O_RDONLY); if (fd < 0) { msg("No tags file"); return; } /* Hmmm... this would have been a lot easier with <stdio.h> */ /* find the line with our tag in it */ for(scan = end = tmpblk.c, cmp = extra; ; scan++) { /* read a block, if necessary */ if (scan >= end) { end = tmpblk.c + tread(fd, tmpblk.c, BLKSIZE); scan = tmpblk.c; if (scan >= end) { msg("tag \"%s\" not found", extra); close(fd); return; } } /* if we're comparing, compare... */ if (cmp) { /* matched??? wow! */ if (!*cmp && *scan == '\t') { break; } if (*cmp++ != *scan) { /* failed! skip to newline */ cmp = (char *)0; } } /* if we're skipping to newline, do it fast! */ if (!cmp) { while (scan < end && *scan != '\n') { scan++; } if (scan < end) { cmp = extra; } } } /* found it! get the rest of the line into memory */ for (cmp = tmpblk.c, scan++; scan < end && *scan != '\n'; ) { *cmp++ = *scan++; } if (scan == end) { tread(fd, cmp, BLKSIZE - (int)(cmp - tmpblk.c)); } else *cmp = *scan; /* we can close the tags file now */ close(fd); #endif /* INTERNAL_TAGS */ /* extract the filename from the line, and edit the file */ for (scan = tmpblk.c; *scan != '\t'; scan++) { } *scan++ = '\0'; if (strcmp(origname, tmpblk.c) != 0) { if (!tmpabort(bang)) { msg("Use :tag! to abort changes, or :w to save changes"); return; } tmpstart(tmpblk.c); } /* move to the desired line (or to line 1 if that fails) */ #ifndef NO_MAGIC wasmagic = *o_magic; *o_magic = FALSE; #endif cursor = MARK_FIRST; linespec(scan, &cursor); if (cursor == MARK_UNSET) { cursor = MARK_FIRST; msg("Tag's address is out of date"); } #ifndef NO_MAGIC *o_magic = wasmagic; #endif } /* describe this version of the program */ /*ARGSUSED*/ void cmd_version(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { msg("%s", VERSION); #ifdef CREDIT msg("%s", CREDIT); #endif #ifdef CREDIT2 msg("%s", CREDIT2); #endif #ifdef COMPILED_BY msg("Compiled by %s", COMPILED_BY); #endif #ifdef COPYING msg("%s", COPYING); #endif } #ifndef NO_MKEXRC /* make a .exrc file which describes the current configuration */ /*ARGSUSED*/ void cmd_mkexrc(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { int fd; /* the default name for the .exrc file EXRC */ if (!*extra) { extra = EXRC; } /* create the .exrc file */ fd = creat(extra, FILEPERMS); if (fd < 0) { msg("Couldn't create a new \"%s\" file", extra); return; } /* save stuff */ saveopts(fd); savemaps(fd, FALSE); #ifndef NO_ABBR savemaps(fd, TRUE); #endif #ifndef NO_DIGRAPH savedigs(fd); #endif #ifndef NO_COLOR savecolor(fd); #endif /* close the file */ close(fd); msg("Configuration saved"); } #endif #ifndef NO_DIGRAPH /*ARGSUSED*/ void cmd_digraph(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { do_digraph(bang, extra); } #endif #ifndef NO_ERRLIST static char errfile[256]; /* the name of a file containing an error */ static long errline; /* the line number for an error */ static int errfd = -2; /* fd of the errlist file */ /* This static function tries to parse an error message. * * For most compilers, the first word is taken to be the name of the erroneous * file, and the first number after that is taken to be the line number where * the error was detected. The description of the error follows, possibly * preceded by an "error ... :" or "warning ... :" label which is skipped. * * For Coherent, error messages look like "line#: filename: message". * * For non-error lines, or unparsable error lines, this function returns NULL. * Normally, though, it alters errfile and errline, and returns a pointer to * the description. */ static char *parse_errmsg(text) REG char *text; { REG char *cpy; long atol(); # if COHERENT || TOS /* any Mark Williams compiler */ /* Get the line number. If no line number, then ignore this line. */ errline = atol(text); if (errline == 0L) return (char *)0; /* Skip to the start of the filename */ while (*text && *text++ != ':') { } if (!*text++) return (char *)0; /* copy the filename to errfile */ for (cpy = errfile; *text && (*cpy++ = *text++) != ':'; ) { } if (!*text++) return (char *)0; cpy[-1] = '\0'; return text; # else /* not a Mark Williams compiler */ char *errmsg; /* the error message is the whole line, by default */ errmsg = text; /* skip leading garbage */ while (*text && !isalnum(*text)) { text++; } /* copy over the filename */ cpy = errfile; while(isalnum(*text) || *text == '.') { *cpy++ = *text++; } *cpy = '\0'; /* ignore the name "Error" and filenames that contain a '/' */ if (*text == '/' || !*errfile || !strcmp(errfile + 1, "rror") || access(errfile, 0) < 0) { return (char *)0; } /* skip garbage between filename and line number */ while (*text && !isdigit(*text)) { text++; } /* if the number is part of a larger word, then ignore this line */ if (*text && isalpha(text[-1])) { return (char *)0; } /* get the error line */ errline = 0L; while (isdigit(*text)) { errline *= 10; errline += (*text - '0'); text++; } /* any line which lacks a filename or line number should be ignored */ if (!errfile[0] || !errline) { return (char *)0; } /* locate the beginning of the error description */ while (*text && !isspace(*text)) { text++; } while (*text) { # ifndef CRUNCH /* skip "error #:" and "warning #:" clauses */ if (!strncmp(text + 1, "rror ", 5) || !strncmp(text + 1, "arning ", 7) || !strncmp(text + 1, "atal error", 10)) { do { text++; } while (*text && *text != ':'); continue; } # endif /* anything other than whitespace or a colon is important */ if (!isspace(*text) && *text != ':') { errmsg = text; break; } /* else keep looking... */ text++; } return errmsg; # endif /* not COHERENT */ } /*ARGSUSED*/ void cmd_errlist(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { static long endline;/* original number of lines in this file */ static long offset; /* offset of the next line in the errlist file */ int i; char *errmsg; /* if a new errlist file is named, open it */ if (extra && extra[0]) { /* close the old one */ if (errfd >= 0) { close(errfd); } /* open the new one */ errfd = open(extra, O_RDONLY); offset = 0L; endline = nlines; } else if (errfd < 0) { /* open the default file */ errfd = open(ERRLIST, O_RDONLY); offset = 0L; endline = nlines; } /* do we have an errlist file now? */ if (errfd < 0) { msg("There is no errlist file"); beep(); return; } /* find the next error message in the file */ do { /* read the next line from the errlist */ lseek(errfd, offset, 0); if (tread(errfd, tmpblk.c, (unsigned)BLKSIZE) <= 0) { msg("No more errors"); beep(); close(errfd); errfd = -2; return; } for (i = 0; tmpblk.c[i] != '\n'; i++) { } tmpblk.c[i++] = 0; /* look for an error message in the line */ errmsg = parse_errmsg(tmpblk.c); if (!errmsg) { offset += i; } } while (!errmsg); /* switch to the file containing the error, if this isn't it */ if (strcmp(origname, errfile)) { if (!tmpabort(bang)) { msg("Use :er! to abort changes, or :w to save changes"); beep(); return; } tmpstart(errfile); endline = nlines; } else if (endline == 0L) { endline = nlines; } /* go to the line where the error was detected */ cursor = MARK_AT_LINE(errline + (nlines - endline)); if (cursor > MARK_LAST) { cursor = MARK_LAST; } if (mode == MODE_VI) { redraw(cursor, FALSE); } /* display the error message */ #ifdef CRUNCH msg("%.70s", errmsg); #else if (nlines > endline) { msg("line %ld(+%ld): %.60s", errline, nlines - endline, errmsg); } else if (nlines < endline) { msg("line %ld(-%ld): %.60s", errline, endline - nlines, errmsg); } else { msg("line %ld: %.65s", errline, errmsg); } #endif /* remember where the NEXT error line will start */ offset += i; } /*ARGSUSED*/ void cmd_make(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { BLK buf; /* if the file hasn't been saved, then complain unless ! */ if (tstflag(file, MODIFIED) && !bang) { msg("\"%s\" not saved yet", origname); return; } /* build the command */ sprintf(buf.c, "%s %s %s%s", (cmd == CMD_CC ? o_cc : o_make), extra, REDIRECT, ERRLIST); qaddstr(buf.c); addch('\n'); /* close the old errlist file, if any */ if (errfd >= 0) { close(errfd); errfd = -3; } /* run the command, with curses temporarily disabled */ suspend_curses(); system(buf.c); resume_curses(mode == MODE_EX); if (mode == MODE_COLON) mode = MODE_VI; /* run the "errlist" command */ cmd_errlist(MARK_UNSET, MARK_UNSET, cmd, bang, ERRLIST); } #endif #ifndef NO_COLOR /* figure out the number of text colors we use with this configuration */ # ifndef NO_POPUP # ifndef NO_VISIBLE # define NCOLORS 7 # else # define NCOLORS 6 # endif # else # ifndef NO_VISIBLE # define NCOLORS 6 # else # define NCOLORS 5 # endif # endif /* the attribute bytes used in each of "when"s */ static char bytes[NCOLORS]; static struct { char *word; /* a legal word */ int type; /* what type of word this is */ int val; /* some other value */ } words[] = { {"normal", 1, A_NORMAL}, /* all "when" names must come */ {"standout", 1, A_STANDOUT}, /* at the top of the list. */ {"bold", 1, A_BOLD}, /* The first 3 must be normal,*/ {"underlined", 1, A_UNDERLINE}, /* standout, and bold; the */ {"italics", 1, A_ALTCHARSET}, /* remaining names follow. */ #ifndef NO_POPUP {"popup", 1, A_POPUP}, #endif #ifndef NO_VISIBLE {"visible", 1, A_VISIBLE}, #endif {"black", 3, 0x00}, /* The color names start right*/ {"blue", 3, 0x01}, /* after the "when" names. */ {"green", 3, 0x02}, {"cyan", 3, 0x03}, {"red", 3, 0x04}, {"magenta", 3, 0x05}, {"brown", 3, 0x06}, {"white", 3, 0x07}, {"yellow", 3, 0x0E}, /* bright brown */ {"gray", 3, 0x08}, /* bright black? of course! */ {"grey", 3, 0x08}, {"bright", 2, 0x08}, {"light", 2, 0x08}, {"blinking", 2, 0x80}, {"on", 0, 0}, {"n", 1, A_NORMAL}, {"s", 1, A_STANDOUT}, {"b", 1, A_BOLD}, {"u", 1, A_UNDERLINE}, {"i", 1, A_ALTCHARSET}, #ifndef NO_POPUP {"p", 1, A_POPUP}, {"menu", 1, A_POPUP}, #endif #ifndef NO_VISIBLE {"v", 1, A_VISIBLE}, #endif {(char *)0, 0, 0} }; /*ARGSUSED*/ void cmd_color(frommark, tomark, cmd, bang, extra) MARK frommark, tomark; CMD cmd; int bang; char *extra; { int attrbyte; int cmode; int nowbg; /* BOOLEAN: is the next color background? */ REG char *scan; REG i; #ifndef CRUNCH /* if no args are given, then report the current colors */ if (!*extra) { /* if no colors are set, then say so */ if (!bytes[0]) { msg("no colors have been set"); return; } /* report all five color combinations */ for (i = 0; i < NCOLORS; i++) { qaddstr("color "); qaddstr(words[i].word); qaddch(' '); if (bytes[i] & 0x80) qaddstr("blinking "); switch (bytes[i] & 0xf) { case 0x08: qaddstr("gray"); break; case 0x0e: qaddstr("yellow"); break; case 0x0f: qaddstr("bright white");break; default: if (bytes[i] & 0x08) qaddstr("light "); qaddstr(words[(bytes[i] & 0x07) + NCOLORS].word); } qaddstr(" on "); qaddstr(words[((bytes[i] >> 4) & 0x07) + NCOLORS].word); addch('\n'); exrefresh(); } return; } #endif /* The default background color is the same as "normal" chars. * There is no default foreground color. */ cmode = A_NORMAL; attrbyte = bytes[0] & 0x70; nowbg = FALSE; /* parse each word in the "extra" text */ for (scan = extra; *extra; extra = scan) { /* locate the end of the word */ while (*scan && *scan != ' ') { scan++; } /* skip whitespace at the end of the word */ while(*scan == ' ') { *scan++ = '\0'; } /* lookup the word */ for (i = 0; words[i].word && strcmp(words[i].word, extra); i++) { } /* if not a word, then complain */ if (!words[i].word) { msg("Invalid color name: %s", extra); return; } /* process the word */ switch (words[i].type) { case 1: cmode = words[i].val; break; case 2: attrbyte |= words[i].val; break; case 3: if (nowbg) attrbyte = ((attrbyte & ~0x70) | ((words[i].val & 0x07) << 4)); else attrbyte |= words[i].val; nowbg = TRUE; break; } } /* if nowbg isn't set now, then we were never given a foreground color */ if (!nowbg) { msg("usage: color [when] [\"bright\"] [\"blinking\"] foreground [background]"); return; } /* the first ":color" command MUST define the "normal" colors */ if (!bytes[0]) cmode = A_NORMAL; /* we should now have a cmode and an attribute byte... */ /* set the color */ setcolor(cmode, attrbyte); /* remember what we just did */ bytes[cmode] = attrbyte; /* if the other colors haven't been set yet, then set them to defaults */ if (!bytes[1]) { /* standout is the opposite of normal */ bytes[1] = ((attrbyte << 4) & 0x70 | (attrbyte >> 4) & 0x07); setcolor(A_STANDOUT, bytes[1]); /* if "normal" isn't bright, then bold defaults to normal+bright * else bold defaults to bright white. */ bytes[2] = attrbyte | ((attrbyte & 0x08) ? 0x0f : 0x08); setcolor(A_BOLD, bytes[2]); /* all others default to the "standout" colors, without blinking */ for (i = 3; i < NCOLORS; i++) { bytes[i] = (bytes[1] & 0x7f); setcolor(words[i].val, bytes[i]); } } /* force a redraw, so we see the new colors */ redraw(MARK_UNSET, FALSE); } void savecolor(fd) int fd; /* file descriptor to write colors to */ { int i; char buf[80]; /* if no colors are set, then return */ if (!bytes[0]) { return; } /* save all five color combinations */ for (i = 0; i < NCOLORS; i++) { strcpy(buf, "color "); strcat(buf, words[i].word); strcat(buf, " "); if (bytes[i] & 0x80) strcat(buf, "blinking "); switch (bytes[i] & 0xf) { case 0x08: strcat(buf, "gray"); break; case 0x0e: strcat(buf, "yellow"); break; case 0x0f: strcat(buf, "bright white");break; default: if (bytes[i] & 0x08) strcat(buf, "light "); strcat(buf, words[(bytes[i] & 0x07) + NCOLORS].word); } strcat(buf, " on "); strcat(buf, words[((bytes[i] >> 4) & 0x07) + NCOLORS].word); strcat(buf, "\n"); twrite(fd, buf, (unsigned)strlen(buf)); } } #endif #ifdef SIGTSTP /* temporarily suspend elvis */ /*ARGSUSED*/ void cmd_suspend(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { void (*func)(); /* stores the previous setting of SIGTSTP */ #if ANY_UNIX /* the Bourne shell can't handle ^Z */ if (!strcmp(o_shell, "/bin/sh")) { msg("The /bin/sh shell doesn't support ^Z"); return; } #endif move(LINES - 1, 0); if (tstflag(file, MODIFIED)) { addstr("Warning: \""); addstr(origname); addstr("\" modified but not yet saved"); clrtoeol(); } refresh(); suspend_curses(); func = signal(SIGTSTP, SIG_DFL); kill (0, SIGTSTP); /* the process stops and resumes here */ signal(SIGTSTP, func); resume_curses(TRUE); if (mode == MODE_VI || mode == MODE_COLON) redraw(MARK_UNSET, FALSE); else refresh (); } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cmd2.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains some of the commands - mostly ones that change text */ #include "config.h" #include "ctype.h" #include "vi.h" #include "regexp.h" #if TOS # include <stat.h> #else # if OSK # include "osk.h" # else # if AMIGA # include "amistat.h" # else # include <sys/stat.h> # endif # endif #endif /*ARGSUSED*/ void cmd_substitute(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; /* rest of the command line */ { char *line; /* a line from the file */ regexp *re; /* the compiled search expression */ char *subst; /* the substitution string */ char *opt; /* substitution options */ long l; /* a line number */ char *s, *d; /* used during subtitutions */ char *conf; /* used during confirmation */ long chline; /* # of lines changed */ long chsub; /* # of substitutions made */ static optp; /* boolean option: print when done? */ static optg; /* boolean option: substitute globally in line? */ static optc; /* boolean option: confirm before subst? */ #ifndef CRUNCH long oldnlines; #endif /* for now, assume this will fail */ rptlines = -1L; if (cmd == CMD_SUBAGAIN) { #ifndef NO_MAGIC if (*o_magic) subst = "~"; else #endif subst = "\\~"; re = regcomp(""); /* if visual "&", then turn off the "p" and "c" options */ if (bang) { optp = optc = FALSE; } } else /* CMD_SUBSTITUTE */ { /* make sure we got a search pattern */ if (*extra != '/' && *extra != '?') { msg("Usage: s/regular expression/new text/"); return; } /* parse & compile the search pattern */ subst = parseptrn(extra); re = regcomp(extra + 1); } /* abort if RE error -- error message already given by regcomp() */ if (!re) { return; } if (cmd == CMD_SUBSTITUTE) { /* parse the substitution string & find the option string */ for (opt = subst; *opt && *opt != *extra; opt++) { if (*opt == '\\' && opt[1]) { opt++; } } if (*opt) { *opt++ = '\0'; } /* analyse the option string */ if (!*o_edcompatible) { optp = optg = optc = FALSE; } while (*opt) { switch (*opt++) { case 'p': optp = !optp; break; case 'g': optg = !optg; break; case 'c': optc = !optc; break; case ' ': case '\t': break; default: msg("Subst options are p, c, and g -- not %c", opt[-1]); return; } } } /* if "c" or "p" flag was given, and we're in visual mode, then NEWLINE */ if ((optc || optp) && mode == MODE_VI) { addch('\n'); exrefresh(); } ChangeText { /* reset the change counters */ chline = chsub = 0L; /* for each selected line */ for (l = markline(frommark); l <= markline(tomark); l++) { /* fetch the line */ line = fetchline(l); /* if it contains the search pattern... */ if (regexec(re, line, TRUE)) { /* increment the line change counter */ chline++; /* initialize the pointers */ s = line; d = tmpblk.c; /* do once or globally ... */ do { #ifndef CRUNCH /* confirm, if necessary */ if (optc) { for (conf = line; conf < re->startp[0]; conf++) addch(*conf); standout(); for ( ; conf < re->endp[0]; conf++) addch(*conf); standend(); for (; *conf; conf++) addch(*conf); addch('\n'); exrefresh(); if (getkey(0) != 'y') { /* copy accross the original chars */ while (s < re->endp[0]) *d++ = *s++; /* skip to next match on this line, if any */ goto Continue; } } #endif /* not CRUNCH */ /* increment the substitution change counter */ chsub++; /* copy stuff from before the match */ while (s < re->startp[0]) { *d++ = *s++; } /* substitute for the matched part */ regsub(re, subst, d); s = re->endp[0]; d += strlen(d); Continue: /* if this regexp could conceivably match * a zero-length string, then require at * least 1 unmatched character between * matches. */ if (re->minlen == 0) { if (!*s) break; *d++ = *s++; } } while (optg && regexec(re, s, FALSE)); /* copy stuff from after the match */ while (*d++ = *s++) /* yes, ASSIGNMENT! */ { } #ifndef CRUNCH /* NOTE: since the substitution text is allowed to have ^Ms which are * translated into newlines, it is possible that the number of lines * in the file will increase after each line has been substituted. * we need to adjust for this. */ oldnlines = nlines; #endif /* replace the old version of the line with the new */ d[-1] = '\n'; d[0] = '\0'; change(MARK_AT_LINE(l), MARK_AT_LINE(l + 1), tmpblk.c); #ifndef CRUNCH l += nlines - oldnlines; tomark += MARK_AT_LINE(nlines - oldnlines); #endif /* if supposed to print it, do so */ if (optp) { addstr(tmpblk.c); exrefresh(); } /* move the cursor to that line */ cursor = MARK_AT_LINE(l); } } } /* free the regexp */ free(re); /* if done from within a ":g" command, then finish silently */ if (doingglobal) { rptlines = chline; rptlabel = "changed"; return; } /* Reporting */ if (chsub == 0) { msg("Substitution failed"); } else if (chline >= *o_report) { msg("%ld substitutions on %ld lines", chsub, chline); } rptlines = 0L; } /*ARGSUSED*/ void cmd_delete(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { MARK curs2; /* an altered form of the cursor */ /* choose your cut buffer */ if (*extra == '"') { extra++; } if (*extra) { cutname(*extra); } /* make sure we're talking about whole lines here */ frommark = frommark & ~(BLKSIZE - 1); tomark = (tomark & ~(BLKSIZE - 1)) + BLKSIZE; /* yank the lines */ cut(frommark, tomark); /* if CMD_DELETE then delete the lines */ if (cmd != CMD_YANK) { curs2 = cursor; ChangeText { /* delete the lines */ delete(frommark, tomark); } if (curs2 > tomark) { cursor = curs2 - tomark + frommark; } else if (curs2 > frommark) { cursor = frommark; } } } /*ARGSUSED*/ void cmd_append(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { long l; /* line counter */ #ifndef CRUNCH /* if '!' then toggle auto-indent */ if (bang) { *o_autoindent = !*o_autoindent; } #endif ChangeText { /* if we're doing a change, delete the old version */ if (cmd == CMD_CHANGE) { /* delete 'em */ cmd_delete(frommark, tomark, cmd, bang, extra); } /* new lines start at the frommark line, or after it */ l = markline(frommark); if (cmd == CMD_APPEND) { l++; } /* get lines until no more lines, or "." line, and insert them */ while (vgets('\0', tmpblk.c, BLKSIZE) >= 0) { addch('\n'); if (!strcmp(tmpblk.c, ".")) { break; } strcat(tmpblk.c, "\n"); add(MARK_AT_LINE(l), tmpblk.c); l++; } } /* on the odd chance that we're calling this from vi mode ... */ redraw(MARK_UNSET, FALSE); } /*ARGSUSED*/ void cmd_put(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { /* choose your cut buffer */ if (*extra == '"') { extra++; } if (*extra) { cutname(*extra); } /* paste it */ ChangeText { cursor = paste(frommark, TRUE, FALSE); } } /*ARGSUSED*/ void cmd_join(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { long l; char *scan; int len; /* length of the new line */ /* if only one line is specified, assume the following one joins too */ if (markline(frommark) == nlines) { msg("Nothing to join with this line"); return; } if (markline(frommark) == markline(tomark)) { tomark += BLKSIZE; } /* get the first line */ l = markline(frommark); strcpy(tmpblk.c, fetchline(l)); len = strlen(tmpblk.c); /* build the longer line */ while (++l <= markline(tomark)) { /* get the next line */ scan = fet@��@��@��@��@��@��@��@���A��A��A����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������chline(l); /* remove any leading whitespace */ while (*scan == '\t' || *scan == ' ') { scan++; } /* see if the line will fit */ if (strlen(scan) + len + 3 > BLKSIZE) { msg("Can't join -- the resulting line would be too long"); return; } /* catenate it, with a space (or two) in between */ if (!bang) { if (len >= 1) { if (tmpblk.c[len - 1] == '.' || tmpblk.c[len - 1] == '?' || tmpblk.c[len - 1] == '!') { tmpblk.c[len++] = ' '; } tmpblk.c[len++] = ' '; } } strcpy(tmpblk.c + len, scan); len += strlen(scan); } tmpblk.c[len++] = '\n'; tmpblk.c[len] = '\0'; /* make the change */ ChangeText { frommark &= ~(BLKSIZE - 1); tomark &= ~(BLKSIZE - 1); tomark += BLKSIZE; change(frommark, tomark, tmpblk.c); } /* Reporting... */ rptlines = markline(tomark) - markline(frommark) - 1L; rptlabel = "joined"; } /*ARGSUSED*/ void cmd_shift(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { long l; /* line number counter */ int oldidx; /* number of chars previously used for indent */ int newidx; /* number of chars in the new indent string */ int oldcol; /* previous indent amount */ int newcol; /* new indent amount */ char *text; /* pointer to the old line's text */ ChangeText { /* for each line to shift... */ for (l = markline(frommark); l <= markline(tomark); l++) { /* get the line - ignore empty lines unless ! mode */ text = fetchline(l); if (!*text && !bang) continue; /* calc oldidx and oldcol */ for (oldidx = 0, oldcol = 0; text[oldidx] == ' ' || text[oldidx] == '\t'; oldidx++) { if (text[oldidx] == ' ') { oldcol += 1; } else { oldcol += *o_tabstop - (oldcol % *o_tabstop); } } /* calc newcol */ if (cmd == CMD_SHIFTR) { newcol = oldcol + (*o_shiftwidth & 0xff); } else { newcol = oldcol - (*o_shiftwidth & 0xff); if (newcol < 0) newcol = 0; } /* if no change, then skip to next line */ if (oldcol == newcol) continue; /* build a new indent string */ newidx = 0; if (*o_autotab) { while (newcol >= *o_tabstop) { tmpblk.c[newidx++] = '\t'; newcol -= *o_tabstop; } } while (newcol > 0) { tmpblk.c[newidx++] = ' '; newcol--; } tmpblk.c[newidx] = '\0'; /* change the old indent string into the new */ change(MARK_AT_LINE(l), MARK_AT_LINE(l) + oldidx, tmpblk.c); } } /* Reporting... */ rptlines = markline(tomark) - markline(frommark) + 1L; if (cmd == CMD_SHIFTR) { rptlabel = ">ed"; } else { rptlabel = "<ed"; } } /*ARGSUSED*/ void cmd_read(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { int fd, rc; /* used while reading from the file */ char *scan; /* used for finding NUL characters */ int hadnul; /* boolean: any NULs found? */ int addnl; /* boolean: forced to add newlines? */ int len; /* number of chars in current line */ long lines; /* number of lines in current block */ struct stat statb; /* special case: if ":r !cmd" then let the filter() function do it */ if (extra[0] == '!') { filter(frommark, MARK_UNSET, extra + 1, TRUE); return; } /* open the file */ fd = open(extra, O_RDONLY); if (fd < 0) { msg("Can't open \"%s\"", extra); return; } #ifndef CRUNCH if (stat(extra, &statb) < 0) { msg("Can't stat \"%s\"", extra); } # if TOS if (statb.st_mode & S_IJDIR) # else # if OSK if (statb.st_mode & S_IFDIR) # else if ((statb.st_mode & S_IFMT) != S_IFREG) # endif # endif { msg("\"%s\" is not a regular file", extra); return; } #endif /* not CRUNCH */ /* get blocks from the file, and add them */ ChangeText { /* insertion starts at the line following frommark */ tomark = frommark = (frommark | (BLKSIZE - 1L)) + 1L; len = 0; hadnul = addnl = FALSE; /* add an extra newline, so partial lines at the end of * the file don't trip us up */ add(tomark, "\n"); /* for each chunk of text... */ while ((rc = tread(fd, tmpblk.c, BLKSIZE - 1)) > 0) { /* count newlines, convert NULs, etc. ... */ for (lines = 0, scan = tmpblk.c; rc > 0; rc--, scan++) { /* break up long lines */ if (*scan != '\n' && len + 2 > BLKSIZE) { *scan = '\n'; addnl = TRUE; } /* protect against NUL chars in file */ if (!*scan) { *scan = 0x80; hadnul = TRUE; } /* starting a new line? */ if (*scan == '\n') { /* reset length at newline */ len = 0; lines++; } else { len++; } } /* add the text */ *scan = '\0'; add(tomark, tmpblk.c); tomark += MARK_AT_LINE(lines) + len - markidx(tomark); } /* if partial last line, then retain that first newline */ if (len > 0) { msg("Last line had no newline"); tomark += BLKSIZE; /* <- for the rptlines calc */ } else /* delete that first newline */ { delete(tomark, (tomark | (BLKSIZE - 1L)) + 1L); } } /* close the file */ close(fd); /* Reporting... */ rptlines = markline(tomark) - markline(frommark); rptlabel = "read"; if (mode == MODE_EX) { cursor = (tomark & ~BLKSIZE) - BLKSIZE; } else { cursor = frommark; } if (addnl) msg("Newlines were added to break up long lines"); if (hadnul) msg("NULs were converted to 0x80"); } /*ARGSUSED*/ void cmd_undo(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { undo(); } /* print the selected lines */ /*ARGSUSED*/ void cmd_print(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { REG char *scan; REG long l; REG int col; for (l = markline(frommark); l <= markline(tomark); l++) { /* display a line number, if CMD_NUMBER */ if (cmd == CMD_NUMBER) { sprintf(tmpblk.c, "%6ld ", l); qaddstr(tmpblk.c); col = 8; } else { col = 0; } /* get the next line & display it */ for (scan = fetchline(l); *scan; scan++) { /* expand tabs to the proper width */ if (*scan == '\t' && cmd != CMD_LIST) { do { qaddch(' '); col++; } while (col % *o_tabstop != 0); } else if (*scan > 0 && *scan < ' ' || *scan == '\177') { qaddch('^'); qaddch(*scan ^ 0x40); col += 2; } else if ((*scan & 0x80) && cmd == CMD_LIST) { sprintf(tmpblk.c, "\\%03o", UCHAR(*scan)); qaddstr(tmpblk.c); col += 4; } else { qaddch(*scan); col++; } /* wrap at the edge of the screen */ if (!has_AM && col >= COLS) { addch('\n'); col -= COLS; } } if (cmd == CMD_LIST) { qaddch('$'); } addch('\n'); exrefresh(); } } /* move or copy selected lines */ /*ARGSUSED*/ void cmd_move(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { MARK destmark; /* parse the destination linespec. No defaults. Line 0 is okay */ destmark = cursor; if (!strcmp(extra, "0")) { destmark = 0L; } else if (linespec(extra, &destmark) == extra || !destmark) { msg("invalid destination address"); return; } /* flesh the marks out to encompass whole lines */ frommark &= ~(BLKSIZE - 1); tomark = (tomark & ~(BLKSIZE - 1)) + BLKSIZE; destmark = (destmark & ~(BLKSIZE - 1)) + BLKSIZE; /* make sure the destination is valid */ if (cmd == CMD_MOVE && destmark >= frommark && destmark < tomark) { msg("invalid destination address"); } /* Do it */ ChangeText { /* save the text to a cut buffer */ cutname('\0'); cut(frommark, tomark); /* if we're not copying, delete the old text & adjust destmark */ if (cmd != CMD_COPY) { delete(frommark, tomark); if (destmark >= frommark) { destmark -= (tomark - frommark); } } /* add the new text */ paste(destmark, FALSE, FALSE); } /* move the cursor to the last line of the moved text */ cursor = destmark + (tomark - frommark) - BLKSIZE; if (cursor < MARK_FIRST || cursor >= MARK_LAST + BLKSIZE) { cursor = MARK_LAST; } /* Reporting... */ rptlabel = ( (cmd == CMD_COPY) ? "copied" : "moved" ); } /* execute EX commands from a file */ /*ARGSUSED*/ void cmd_source(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { /* must have a filename */ if (!*extra) { msg("\"source\" requires a filename"); return; } doexrc(extra); } #ifndef NO_AT /*ARGSUSED*/ void cmd_at(frommark, tomark, cmd, bang, extra) MARK frommark; MARK tomark; CMD cmd; int bang; char *extra; { static nest = FALSE; int result; char buf[MAXRCLEN]; /* don't allow nested macros */ if (nest) { msg("@ macros can't be nested"); return; } nest = TRUE; /* require a buffer name */ if (*extra == '"') extra++; if (!*extra || !isascii(*extra) ||!islower(*extra)) { msg("@ requires a cut buffer name (a-z)"); } /* get the contents of the buffer */ result = cb2str(*extra, buf, (unsigned)(sizeof buf)); if (result <= 0) { msg("buffer \"%c is empty", *extra); } else if (result >= sizeof buf) { msg("buffer \"%c is too large to execute", *extra); } else { /* execute the contents of the buffer as ex commands */ exstring(buf, result, '\\'); } nest = FALSE; } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * vi configuration file * We try to automatically configure to various compilers and operating * systems. Extend the autoconf section as needed. */ #ifndef _CONFIG_H # define _CONFIG_H /*************************** autoconf section ************************/ /* Commodore-Amiga */ #ifdef amiga # define AMIGA 1 # define COMPILED_BY "Manx Aztec C 5.2b" #endif /* standard unix V (?) */ #ifdef M_SYSV # define UNIXV 1 #endif /* xelos system, University of Ulm */ #ifdef xelos # define UNIXV 1 #endif /* BSD UNIX? */ #ifdef bsd # define BSD 1 #else # ifdef sun # define BSD 1 # endif #endif /* Microsoft C: sorry, Watcom does the same thing */ #ifdef M_I86 # ifndef M_SYSV # define MSDOS 1 # ifdef IBMC2 # define COMPILED_BY "IBM C/2 1.00" # else # define MICROSOFT 1 # define COMPILED_BY "Microsoft C 5.10" # endif # endif #endif /* Borland's Turbo C */ #ifdef __TURBOC__ # define MSDOS 1 # define TURBOC 1 # ifdef __BORLANDC__ # define COMPILED_BY "Borland C 2.00" # else # define COMPILED_BY (__TURBOC__ >= 661 ? "Turbo C++ 1.00" : "Turbo C 2.00") # endif #endif /* Tos Mark-Williams */ #ifdef M68000 # define TOS 1 # define COMPILED_BY "Mark Williams C" #endif /* Tos GNU-C */ #if defined(__atarist__) && defined(__gem__) # define TOS 1 # define COMPILED_BY "GNU-C " __VERSION__ #endif /* OS9/68000 */ #ifdef OSK # define COMPILED_BY "Microware C V2.3 Edition 40" #endif /* DEC Rainbow, running MS-DOS (handled by earlier MS-DOS tests) */ /* (would need -DRAINBOW in CFLAGS to compile a Rainbow-compatible .EXE) */ #ifdef VMS # define COMPILED_BY "VAX/VMS VAXC compiler" # undef VMS # define VMS 1 #endif /*************************** end of autoconf section ************************/ /* All undefined symbols are defined to zero here, to allow for older */ /* compilers which dont understand #if defined() or #if UNDEFINED_SYMBOL */ /*************************** operating systems *****************************/ #ifndef BSD # define BSD 0 /* UNIX - Berkeley 4.x */ #endif #ifndef UNIXV # define UNIXV 0 /* UNIX - AT&T SYSV */ #endif #ifndef UNIX7 # define UNIX7 0 /* UNIX - version 7 */ #endif #ifndef MSDOS # define MSDOS 0 /* PC */ #endif #ifndef TOS # define TOS 0 /* Atari ST */ #endif #ifndef AMIGA # define AMIGA 0 /* Commodore Amiga */ #endif #ifndef OSK # define OSK 0 /* OS-9 / 68k */ #endif #ifndef COHERENT # define COHERENT 0 /* Coherent */ #endif #ifndef RAINBOW /* DEC Rainbow support, under MS-DOS */ # define RAINBOW 0 #endif #ifndef VMS # define VMS 0 /* VAX/VMS */ #endif /* Minix has no predefines */ #if !BSD && !UNIXV && !UNIX7 && !MSDOS && !TOS && !AMIGA && !OSK && !COHERENT && !VMS # define MINIX 1 #else # define MINIX 0 #endif /* generic combination of Unices */ #if UNIXV || UNIX7 || BSD || MINIX || COHERENT # define ANY_UNIX 1 #else # define ANY_UNIX 0 #endif /*************************** compilers **************************************/ #ifndef AZTEC_C # define AZTEC_C 0 #endif #ifndef MICROSOFT # define MICROSOFT 0 #endif #ifndef TURBOC # define TURBOC 0 #endif /******************************* Credit ************************************/ #if MSDOS # define CREDIT "Ported to MS-DOS by Guntram Blohm & Martin Patzel" # if RAINBOW # define CREDIT2 "Rainbow support added by Willett Kempton" # endif #endif #if AMIGA # define CREDIT "Ported to AmigaDOS 2.04 by Mike Rieser & Dale Rahn" #endif #if TOS # define CREDIT "Ported to Atari/TOS by Guntram Blohm & Martin Patzel" #endif #if OSK # define CREDIT "Ported to Microware OS9/68k by Peter Reinig" #endif #if COHERENT # define CREDIT "Ported to Coherent by Esa Ahola" #endif #if VMS # define CREDIT "Ported to VAX/VMS by John Campbell" #endif /*************************** functions depending on OS *********************/ /* There are two terminal-related functions that we need: ttyread() and * ttywrite(). The ttyread() function implements read-with-timeout and is * a true function on all systems. The ttywrite() function is almost always * just a macro... */ #if !TOS && !AMIGA # define ttywrite(buf, len) write(1, buf, (unsigned)(len)) /* raw write */ #endif /* The strchr() function is an official standard now, so everybody has it * except Unix version 7 (which is old) and BSD Unix (which is academic). * Those guys use something called index() to do the same thing. */ #if BSD || UNIX7 || OSK # define strchr index #endif extern char *strchr(); /* BSD uses bcopy() instead of memcpy() */ #if BSD # define memcpy(dest, src, siz) bcopy(src, dest, siz) #endif /* BSD uses getwd() instead of getcwd(). The arguments are a little different, * but we'll ignore that and hope for the best; adding arguments to the macro * would mess up an "extern" declaration of the function. */ #if BSD || COHERENT # define getcwd getwd #endif extern char *getcwd(); /* text versa binary mode for read/write */ #if !TOS #define tread(fd,buf,n) read(fd,buf,(unsigned)(n)) #define twrite(fd,buf,n) write(fd,buf,(unsigned)(n)) #endif /**************************** Compiler quirks *********************************/ /* the UNIX version 7 and (some) TOS compilers, don't allow "void" */ #if UNIX7 || TOS # define void int #endif /* as far as I know, all compilers except version 7 support unsigned char */ /* NEWFLASH: the Minix-ST compiler has subtle problems with unsigned char */ #if UNIX7 || MINIX # define UCHAR(c) ((c) & 0xff) # define uchar char #else # define UCHAR(c) ((unsigned char)(c)) # define uchar unsigned char #endif /* Some compilers prefer to have malloc declared as returning a (void *) */ #if BSD || AMIGA extern void *malloc(); #else extern char *malloc(); #endif /* everybody but Amiga wants lseek declared here */ #if !AMIGA extern long lseek(); #endif /******************* Names of files and environment vars **********************/ #if ANY_UNIX # ifndef TMPDIR # if MINIX # define TMPDIR "/usr/tmp" /* Keep elvis' temp files off RAM disk! */ # else # define TMPDIR "/tmp" /* directory where temp files live */ # endif # endif # ifndef PRSVDIR # define PRSVDIR "/usr/preserve" /* directory where preserved file live */ # endif # ifndef PRSVINDEX # define PRSVINDEX "/usr/preserve/Index" /* index of files in PRSVDIR */ # endif # ifndef EXRC # define EXRC ".exrc" /* init file in current directory */ # endif # define SCRATCHOUT "%s/soXXXXXX" /* temp file used as input to filter */ # ifndef SHELL # define SHELL "/bin/sh" /* default shell */ # endif # if COHERENT # ifndef REDIRECT # define REDIRECT ">" /* Coherent CC writes errors to stdout */ # endif # endif #endif #if AMIGA /* Specify AMIGA environment */ # ifndef CC_COMMAND # define CC_COMMAND "cc" /* generic C compiler */ # endif # ifndef COLON # define COLON ':' /* Amiga files can also end in `:' */ # endif # ifndef SYSEXRC # define SYSEXRC "S:" EXRC /* name of ".exrc" file in system dir */ # endif # ifndef MAXRCLEN # define MAXRCLEN 2048 /* max size of a .exrc file */ # endif # ifndef NBUFS # define NBUFS 10 /* must be at least 3 -- more is better */ # endif # ifndef NEEDSYNC # define NEEDSYNC TRUE /* assume ":se sync" by default */ # endif # ifndef PRSVDIR # define PRSVDIR "Elvis:" /* directory where preserved file live */ # endif # ifndef PRSVINDEX # define PRSVINDEX "Elvis:Index" /* index of files in PRSVDIR */ # endif # ifndef REDIRECT # define REDIRECT ">" /* Amiga writes errors to stdout */ # endif # ifndef SCRATCHIN # define SCRATCHIN "%sSIXXXXXX" # endif # ifndef SCRATCHOUT # define SCRATCHOUT "%sSOXXXXXX" # endif # ifndef SHELL # define SHELL "newshell" /* default shell */ # endif # ifndef TERMTYPE # define TERMTYPE "amiga" /* default termtype */ # endif # ifndef TMPDIR /* for AMIGA should end in `:' or `/' */ # define TMPDIR "T:" /* directory where temp files live */ # endif # ifndef TMPNAME # define TMPNAME "%selv_%x.%x" /* format of names for temp files */ # endif #endif #if MSDOS || TOS /* do not change TMPNAME and SCRATCH*: they MUST begin with '%s\\'! */ # ifndef TMPDIR # define TMPDIR "C:\\tmp" /* directory where temp files live */ # endif # ifndef PRSVDIR # define PRSVDIR "C:\\preserve" /* directory where p A�� A�� A��A��A��A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������reserved file live */ # endif # ifndef PRSVINDEX # define PRSVINDEX "C:\\preserve\\Index" /* index of files in PRSVDIR */ # endif # define TMPNAME "%s\\elv_%x.%x" /* temp file */ # if MSDOS # if MICROSOFT # define CC_COMMAND "cl -c" /* C compiler */ # else # if __BORLANDC__ /* Borland C */ # define CC_COMMAND "bcc" /* C compiler */ # else # if TURBOC /* Turbo C */ # define CC_COMMAND "tcc" /* C compiler */ # endif /* TURBOC */ # endif /* BORLANDC */ # endif /* MICROSOFT */ # endif /* MSDOS */ # define SCRATCHIN "%s\\siXXXXXX" /* DOS ONLY - output of filter program */ # define SCRATCHOUT "%s\\soXXXXXX" /* temp file used as input to filter */ # define SLASH '\\' # ifndef SHELL # if TOS # define SHELL "shell.ttp" /* default shell */ # else # define SHELL "command.com" /* default shell */ # endif # endif # define NEEDSYNC TRUE /* assume ":se sync" by default */ # if TOS && __GNUC__ /* probably on other systems, too */ # define REDIRECT "2>" /* GNUC reports on 2, others on 1 */ # define CC_COMMAND "gcc -c" # else # define REDIRECT ">" /* shell's redirection of stderr */ # endif #endif #if VMS /* do not change TMPNAME, and SCRATCH*: they MUST begin with '%s\\'! */ # ifndef TMPDIR # define TMPDIR "sys$scratch:" /* directory where temp files live */ # endif # define TMPNAME "%selv_%x.%x;1" /* temp file */ # define SCRATCHIN "%ssiXXXXXX" /* DOS ONLY - output of filter program */ # define SCRATCHOUT "%ssoXXXXXX" /* temp file used as input to filter */ # define SLASH '\:' /* Worry point... jdc */ # ifndef SHELL # define SHELL "" /* default shell */ # endif # define REDIRECT ">" /* shell's redirection of stderr */ # define tread(fd,buf,n) vms_read(fd,buf,(unsigned)(n)) # define close vms_close # define lseek vms_lseek # define unlink vms_delete # define delete __delete /* local routine conflicts w/VMS rtl routine. */ # define rpipe vms_rpipe # define rpclose vms_rpclose # define ttyread vms_ttyread /* There is no sync() on vms */ # define sync() /* jdc -- seems VMS external symbols are case insensitive */ # define m_fWord m_fw_ord # define m_bWord m_bw_ord # define m_eWord m_ew_ord # define m_Nsrch m_n_srch # define m_Fch m_f_ch # define m_Tch m_t_ch # define v_Xchar v_x_char /* jdc -- also, braindead vms curses always found by linker. */ # define LINES elvis_LINES # define COLS elvis_COLS # define curscr elvis_curscr # define stdscr elvis_stdscr # define initscr elvis_initscr # define endwin elvis_endwin # define wrefresh elvis_wrefresh #endif #if OSK # ifndef TMPDIR # define TMPDIR "/dd/tmp" /* directory where temp files live */ # endif # ifndef PRSVDIR # define PRSVDIR "/dd/usr/preserve" /* directory where preserved file live */ # endif # ifndef PRSVINDEX # define PRSVINDEX "/dd/usr/preserve/Index" /* index of files in PRSVDIR */ # endif # ifndef CC_COMMAND # define CC_COMMAND "cc -r" /* name of the compiler */ # endif # ifndef EXRC # define EXRC ".exrc" /* init file in current directory */ # endif # define SCRATCHOUT "%s/soXXXXXX" /* temp file used as input to filter */ # ifndef SHELL # define SHELL "shell" /* default shell */ # endif # define FILEPERMS (S_IREAD|S_IWRITE) /* file permissions used for creat() */ # define REDIRECT ">>-" /* shell's redirection of stderr */ # define sync() /* OS9 doesn't need a sync() */ #endif #ifndef TAGS # define TAGS "tags" /* name of the tags file */ #endif #ifndef TMPNAME # define TMPNAME "%s/elv_%x.%x" /* format of names for temp files */ #endif #ifndef EXINIT # define EXINIT "EXINIT" /* name of EXINIT environment variable */ #endif #ifndef EXRC # define EXRC "elvis.rc" /* name of ".exrc" file in current dir */ #endif #ifndef HMEXRC # define HMEXRC EXRC /* name of ".exrc" file in home dir */ #endif #ifndef KEYWORDPRG # define KEYWORDPRG "ref" #endif #ifndef SCRATCHOUT # define SCRATCHIN "%s/SIXXXXXX" # define SCRATCHOUT "%s/SOXXXXXX" #endif #ifndef ERRLIST # define ERRLIST "errlist" #endif #ifndef SLASH # define SLASH '/' #endif #ifndef SHELL # define SHELL "shell" #endif #ifndef REG # define REG register #endif #ifndef NEEDSYNC # define NEEDSYNC FALSE #endif #ifndef FILEPERMS # define FILEPERMS 0666 #endif #ifndef PRESERVE # define PRESERVE "elvprsv" /* name of the "preserve" program */ #endif #ifndef CC_COMMAND # define CC_COMMAND "cc -c" #endif #ifndef MAKE_COMMAND # define MAKE_COMMAND "make" #endif #ifndef REDIRECT # define REDIRECT "2>" #endif #ifndef BLKSIZE # ifdef CRUNCH # define BLKSIZE 1024 # else # define BLKSIZE 2048 # endif #endif #ifndef KEYBUFSIZE # define KEYBUFSIZE 1000 #endif #endif /* ndef _CONFIG_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ctags.c */ /* This is a reimplementation of the ctags(1) program. It supports ANSI C, * and has heaps o' flags. It is meant to be distributed with elvis. */ #include <stdio.h> #include "config.h" #ifndef FALSE # define FALSE 0 # define TRUE 1 #endif #ifndef TAGS # define TAGS "tags" #endif #ifndef REFS # define REFS "refs" #endif #ifndef BLKSIZE # define BLKSIZE 1024 #endif #include "ctype.c" /* yes, that really is the .c file, not the .h one. */ /* -------------------------------------------------------------------------- */ /* Some global variables */ /* The following boolean variables are set according to command line flags */ int incl_static; /* -s include static tags */ int incl_types; /* -t include typedefs and structs */ int incl_vars; /* -v include variables */ int make_refs; /* -r generate a "refs" file */ int append_files; /* -a append to "tags" [and "refs"] files */ /* The following are used for outputting to the "tags" and "refs" files */ FILE *tags; /* used for writing to the "tags" file */ FILE *refs; /* used for writing to the "refs" file */ /* -------------------------------------------------------------------------- */ /* These are used for reading a source file. It keeps track of line numbers */ char *file_name; /* name of the current file */ FILE *file_fp; /* stream used for reading the file */ long file_lnum; /* line number in the current file */ long file_seek; /* fseek() offset to the start of current line */ int file_afternl; /* boolean: was previous character a newline? */ int file_prevch; /* a single character that was ungotten */ int file_header; /* boolean: is the current file a header file? */ /* This function opens a file, and resets the line counter. If it fails, it * it will display an error message and leave the file_fp set to NULL. */ void file_open(name) char *name; /* name of file to be opened */ { /* if another file was already open, then close it */ if (file_fp) { fclose(file_fp); } /* try to open the file for reading. The file must be opened in * "binary" mode because otherwise fseek() would misbehave under DOS. */ #if MSDOS || TOS file_fp = fopen(name, "rb"); #else file_fp = fopen(name, "r"); #endif if (!file_fp) { perror(name); } /* reset the name & line number */ file_name = name; file_lnum = 0L; file_seek = 0L; file_afternl = TRUE; /* determine whether this is a header file */ file_header = FALSE; name += strlen(name) - 2; if (name >= file_name && name[0] == '.' && (name[1] == 'h' || name[1] == 'H')) { file_header = TRUE; } } /* This function reads a single character from the stream. If the *previous* * character was a newline, then it also increments file_lnum and sets * file_offset. */ int file_getc() { int ch; /* if there is an ungotten character, then return it. Don't do any * other processing on it, though, because we already did that the * first time it was read. */ if (file_prevch) { ch = file_prevch; file_prevch = 0; return ch; } /* if previous character was a newline, then we're starting a line */ if (file_afternl) { file_afternl = FALSE; file_seek = ftell(file_fp); file_lnum++; } /* Get a character. If no file is open, then return EOF */ ch = (file_fp ? getc(file_fp) : EOF); /* if it is a newline, then remember that fact */ if (ch == '\n') { file_afternl = TRUE; } /* return the character */ return ch; } /* This function ungets a character from the current source file */ void file_ungetc(ch) int ch; /* character to be ungotten */ { file_prevch = ch; } /* This function copies the current line out some other fp. It has no effect * on the file_getc() function. During copying, any '\' characters are doubled * and a leading '^' or trailing '$' is also quoted. The newline character is * not copied. * * This is meant to be used when generating a tag line. */ void file_copyline(seek, fp) long seek; /* where the lines starts in the source file */ FILE *fp; /* the output stream to copy it to */ { long oldseek;/* where the file's pointer was before we messed it up */ char ch; /* a single character from the file */ char next; /* the next character from this file */ /* go to the start of the line */ oldseek = ftell(file_fp); fseek(file_fp, seek, 0); /* if first character is '^', then emit \^ */ ch = getc(file_fp); if (ch == '^') { putc('\\', fp); putc('^', fp); ch = getc(file_fp); } /* write everything up to, but not including, the newline */ while (ch != '\n') { /* preread the next character from this file */ next = getc(file_fp); /* if character is '\', or a terminal '$', then quote it */ if (ch == '\\' || (ch == '$' && next == '\n')) { putc('\\', fp); } putc(ch, fp); /* next character... */ ch = next; } /* seek back to the old position */ fseek(file_fp, oldseek, 0); } /* -------------------------------------------------------------------------- */ /* This section handles preprocessor directives. It strips out all of the * directives, and may emit a tag for #define directives. */ int cpp_afternl; /* boolean: look for '#' character? */ int cpp_prevch; /* an ungotten character, if any */ int cpp_refsok; /* boolean: can we echo characters out to "refs"? */ /* This function opens the file & resets variables */ void cpp_open(name) char *name; /* name of source file to be opened */ { /* use the lower-level file_open function to open the file */ file_open(name); /* reset variables */ cpp_afternl = TRUE; cpp_refsok = TRUE; } /* This function copies a character from the source file to the "refs" file */ void cpp_echo(ch) int ch; /* the character to copy */ { static wasnl; /* echo non-EOF chars, unless not making "ref", or echo turned off */ if (ch != EOF && make_refs && cpp_refsok && !file_header) { /* try to avoid blank lines */ if (ch == '\n') { if (wasnl) { return; } wasnl = TRUE; } else { wasnl = FALSE; } /* add the character */ putc(ch, refs); } } /* This function returns the next character which isn't part of a directive */ int cpp_getc() { static int ch; /* the next input character */ char *scan; /* if we have an ungotten character, then return it */ if (cpp_prevch) { ch = cpp_prevch; cpp_prevch = 0; return ch; } /* Get a character from the file. Return it if not special '#' */ ch = file_getc(); if (ch == '\n') { cpp_afternl = TRUE; cpp_echo(ch); return ch; } else if (ch != '#' || !cpp_afternl) { /* normal character. Any non-whitespace should turn off afternl */ if (ch != ' ' && ch != '\t') { cpp_afternl = FALSE; } cpp_echo(ch); return ch; } /* Yikes! We found a directive */ /* see whether this is a #define line */ scan = " define "; while (*scan) { if (*scan == ' ') { /* space character matches any whitespace */ do { ch = file_getc(); } while (ch == ' ' || ch == '\t'); file_ungetc(ch); } else { /* other characters should match exactly */ ch = file_getc(); if (ch != *scan) { file_ungetc(ch); break; } } scan++; } /* is this a #define line? and should we generate a tag for it? */ if (!*scan && (file_header || incl_static)) { /* if not a header, then this will be a static tag */ if (!file_header) { fputs(file_name, tags); putc(':', tags); } /* output the tag name */ for (ch = file_getc(); isalnum(ch) || ch == '_'; ch = file_getc()) { putc(ch, tags); } /* output a tab, the filename, another tab, and the line number */ fprintf(tags, "\t%s\t%ld\n", file_name, file_lnum); } /* skip to the end of the directive -- a newline that isn't preceded * by a '\' character. */ while (ch != EOF && ch != '\n') { if (ch == '\\') { ch = file_getc(); } ch = file_getc(); } /* return the newline that we found at the end of the directive */ cpp_echo(ch); return ch; } /* This puts a character back into the input queue for the source file */ cpp_ungetc(ch) int ch; /* a character to be ungotten */ { cpp_prevch = ch; } /* -------------------------------------------------------------------------- */ /* This is the lexical anA��A��A��A��A��A��A�� A��!A��"A��#A����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������alyser. It gets characters from the preprocessor, * and gives tokens to the parser. Some special codes are... * (deleted) /*...* / (comments) * (deleted) //...\n (comments) * (deleted) (* (parens used in complex declaration) * (deleted) [...] (array subscript, when ... contains no ]) * (deleted) struct (intro to structure declaration) * BODY {...} ('{' can occur anywhere, '}' only at BOW if ... has '{') * ARGS (...{ (args of function, not extern or forward) * ARGS (...); (args of an extern/forward function declaration) * COMMA , (separate declarations that have same scope) * SEMICOLON ; (separate declarations that have different scope) * SEMICOLON =...; (initializer) * TYPEDEF typedef (the "typedef" keyword) * STATIC static (the "static" keyword) * STATIC private (the "static" keyword) * STATIC PRIVATE (the "static" keyword) * NAME [a-z]+ (really any valid name that isn't reserved word) */ /* #define EOF -1 */ #define DELETED 0 #define BODY 1 #define ARGS 2 #define COMMA 3 #define SEMICOLON 4 #define TYPEDEF 5 #define STATIC 6 #define EXTERN 7 #define NAME 8 char lex_name[BLKSIZE]; /* the name of a "NAME" token */ long lex_seek; /* start of line that contains lex_name */ lex_gettoken() { int ch; /* a character from the preprocessor */ int next; /* the next character */ int token; /* the token that we'll return */ int i; /* loop until we get a token that isn't "DELETED" */ do { /* get the next character */ ch = cpp_getc(); /* process the character */ switch (ch) { case ',': token = COMMA; break; case ';': token = SEMICOLON; break; case '/': /* get the next character */ ch = cpp_getc(); switch (ch) { case '*': /* start of C comment */ ch = cpp_getc(); next = cpp_getc(); while (next != EOF && (ch != '*' || next != '/')) { ch = next; next = cpp_getc(); } break; case '/': /* start of a C++ comment */ do { ch = cpp_getc(); } while (ch != '\n' && ch != EOF); break; default: /* some other slash */ cpp_ungetc(ch); } token = DELETED; break; case '(': ch = cpp_getc(); if (ch == '*') { token = DELETED; } else { next = cpp_getc(); while (ch != '{' && ch != EOF && (ch != ')' || next != ';'))/*}*/ { ch = next; next = cpp_getc(); } if (ch == '{')/*}*/ { cpp_ungetc(ch); } else if (next == ';') { cpp_ungetc(next); } token = ARGS; } break; case '{':/*}*/ /* don't send the next characters to "refs" */ cpp_refsok = FALSE; /* skip ahead to closing '}', or to embedded '{' */ do { ch = cpp_getc(); } while (ch != '{' && ch != '}' && ch != EOF); /* if has embedded '{', then skip to '}' in column 1 */ if (ch == '{') /*}*/ { ch = cpp_getc(); next = cpp_getc(); while (ch != EOF && (ch != '\n' || next != '}'))/*{*/ { ch = next; next = cpp_getc(); } } /* resume "refs" processing */ cpp_refsok = TRUE; cpp_echo('}'); token = BODY; break; case '[': /* skip to matching ']' */ do { ch = cpp_getc(); } while (ch != ']' && ch != EOF); token = DELETED; break; case '=': /* skip to next ';' */ do { ch = cpp_getc(); /* leave array initializers out of "refs" */ if (ch == '{') { cpp_refsok = FALSE; } } while (ch != ';' && ch != EOF); /* resume echoing to "refs" */ if (!cpp_refsok) { cpp_refsok = TRUE; cpp_echo('}'); cpp_echo(';'); } token = SEMICOLON; break; case EOF: token = EOF; break; default: /* is this the start of a name/keyword? */ if (isalpha(ch) || ch == '_') { /* collect the whole word */ lex_name[0] = ch; for (i = 1, ch = cpp_getc(); i < BLKSIZE - 1 && (isalnum(ch) || ch == '_'); i++, ch = cpp_getc()) { lex_name[i] = ch; } lex_name[i] = '\0'; cpp_ungetc(ch); /* is it a reserved word? */ if (!strcmp(lex_name, "typedef")) { token = TYPEDEF; lex_seek = -1L; } else if (!strcmp(lex_name, "static") || !strcmp(lex_name, "private") || !strcmp(lex_name, "PRIVATE")) { token = STATIC; lex_seek = -1L; } else if (!strcmp(lex_name, "extern") || !strcmp(lex_name, "EXTERN") || !strcmp(lex_name, "FORWARD")) { token = EXTERN; lex_seek = -1L; } else { token = NAME; lex_seek = file_seek; } } else /* not part of a name/keyword */ { token = DELETED; } } /* end switch(ch) */ } while (token == DELETED); return token; } /* -------------------------------------------------------------------------- */ /* This is the parser. It locates tag candidates, and then decides whether to * generate a tag for them. */ /* This function generates a tag for the object in lex_name, whose tag line is * located at a given seek offset. */ void maketag(scope, seek) int scope; /* 0 if global, or STATIC if static */ long seek; /* the seek offset of the line */ { /* output the tagname and filename fields */ if (scope == EXTERN) { /* whoa! we should *never* output a tag for "extern" decl */ return; } else if (scope == STATIC) { fprintf(tags, "%s:%s\t%s\t", file_name, lex_name, file_name); } else { fprintf(tags, "%s\t%s\t", lex_name, file_name); } /* output the target line */ putc('/', tags); putc('^', tags); file_copyline(seek, tags); putc('$', tags); putc('/', tags); putc('\n', tags); } /* This function parses a source file, adding any tags that it finds */ void ctags(name) char *name; /* the name of a source file to be checked */ { int prev; /* the previous token from the source file */ int token; /* the current token from the source file */ int scope; /* normally 0, but could be a TYPEDEF or STATIC token */ int gotname;/* boolean: does lex_name contain a tag candidate? */ long tagseek;/* start of line that contains lex_name */ /* open the file */ cpp_open(name); /* reset */ scope = 0; gotname = FALSE; token = SEMICOLON; /* parse until the end of the file */ while (prev = token, (token = lex_gettoken()) != EOF) { /* scope keyword? */ if (token == TYPEDEF || token == STATIC || token == EXTERN) { scope = token; gotname = FALSE; continue; } /* name of a possible tag candidate? */ if (token == NAME) { tagseek = file_seek; gotname = TRUE; continue; } /* if NAME BODY, without ARGS, then NAME is a struct tag */ if (gotname && token == BODY && prev != ARGS) { gotname = FALSE; /* ignore if in typedef -- better name is coming soon */ if (scope == TYPEDEF) { continue; } /* generate a tag, if -t and maybe -s */ if (incl_types && (file_header || incl_static)) { maketag(file_header ? 0 : STATIC, tagseek); } } /* If NAME ARGS BODY, then NAME is a function */ if (gotname && prev == ARGS && token == BODY) { gotname = FALSE; /* generate a tag, maybe checking -s */ if (scope != STATIC || incl_static) { maketag(scope, tagseek); } } /* If NAME SEMICOLON or NAME COMMA, then NAME is var/typedef */ if (gotname && (token == SEMICOLON || token == COMMA)) { gotname = FALSE; /* generate a tag, if -v/-t and maybe -s */ if (scope == TYPEDEF && incl_types && (file_header || incl_static) || scope == STATIC && incl_vars && incl_static || incl_vars) { /* a TYPEDEF outside of a header is STATIC */ if (scope == TYPEDEF && !file_header) { maketag(STATIC, tagseek); } else /* use whatever scope was declared */ { maketag(scope, tagseek); } } } /* reset after a semicolon or ARGS BODY pair */ if (token == SEMICOLON || (prev == ARGS && token == BODY)) { scope = 0; gotname = FALSE; } } /* The source file will be automatically closed */ } /* -------------------------------------------------------------------------- */ void usage() { fprintf(stderr, "usage: ctags [flags] filenames...\n"); fprintf(stderr, "\t-s include static functions\n"); fprintf(stderr, "\t-t include typedefs\n"); fprintf(stderr, "\t-v include variable declarations\n"); fprintf(stderr, "\t-r generate a \"refs\" file, too\n"); fprintf(stderr, "\t-a append to \"tags\", instead of overwriting\n"); exit(2); } #if AMIGA # include "amiwild.c" #endif #if VMS # include "vmswild.c" #endif main(argc, argv) int argc; char **argv; { int i, j; #if MSDOS || TOS char **wildexpand(); argv = wildexpand(&argc, argv); #endif /* build the tables used by the ctype macros */ _ct_init(""); /* parse the option flags */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { for (j = 1; argv[i][j]; j++) { switch (argv[i][j]) { case 's': incl_static = TRUE; break; case 't': incl_types = TRUE; break; case 'v': incl_vars = TRUE; break; case 'r': make_refs = TRUE; break; case 'a': append_files = TRUE; break; default: usage(); } } } /* There should always be at least one source file named in args */ if (i == argc) { usage(); } /* open the "tags" and maybe "refs" files */ tags = fopen(TAGS, append_files ? "a" : "w"); if (!tags) { perror(TAGS); exit(3); } if (make_refs) { refs = fopen(REFS, append_files ? "a" : "w"); if (!refs) { perror(REFS); exit(4); } } /* parse each source file */ for (; i < argc; i++) { ctags(argv[i]); } /* close "tags" and maybe "refs" */ fclose(tags); if (make_refs) { fclose(refs); } #ifdef SORT /* This is a hack which will sort the tags list. It should * on UNIX and OS-9. You may have trouble with csh. Note * that the tags list only has to be sorted if you intend to * use it with the real vi; elvis permits unsorted tags. */ # if OSK system("qsort tags >-_tags; -nx; del tags; rename _tags tags"); # else system("sort tags >_tags$$; mv _tags$$ tags"); # endif #endif exit(0); /*NOTREACHED*/ } #if MSDOS || TOS # define WILDCARD_NO_MAIN # include "wildcard.c" #endif �������������������/* ctype.c */ /* This file contains the tables and initialization function for elvis' * version of <ctype.h>. It should be portable. */ #include "config.h" #include "ctype.h" uchar _ct_toupper[256]; uchar _ct_tolower[256]; uchar _ct_ctypes[256]; /* This function initializes the tables used by the ctype macros. It should * be called at the start of the program. It can be called again anytime you * wish to change the non-standard "flipcase" list. The "flipcase" list is * a string of characters which are taken to be lowercase/uppercase pairs. * If you don't want to use any special flipcase characters, then pass an * empty string. */ void _ct_init(flipcase) uchar *flipcase; /* list of non-standard lower/upper letter pairs */ { int i; uchar *scan; /* reset all of the tables */ for (i = 0; i < 256; i++) { _ct_toupper[i] = _ct_tolower[i] = i; _ct_ctypes[i] = 0; } /* add the digits */ for (scan = (uchar *)"0123456789"; *scan; scan++) { _ct_ctypes[*scan] |= _CT_DIGIT | _CT_ALNUM; } /* add the whitespace */ for (scan = (uchar *)" \t\n\r\f"; *scan; scan++) { _ct_ctypes[*scan] |= _CT_SPACE; } /* add the standard ASCII letters */ for (scan = (uchar *)"aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ"; *scan; scan += 2) { _ct_ctypes[scan[0]] |= _CT_LOWER | _CT_ALNUM; _ct_ctypes[scan[1]] |= _CT_UPPER | _CT_ALNUM; _ct_toupper[scan[0]] = scan[1]; _ct_tolower[scan[1]] = scan[0]; } /* add the flipcase letters */ for (scan = flipcase; scan[0] && scan[1]; scan += 2) { _ct_ctypes[scan[0]] |= _CT_LOWER | _CT_ALNUM; _ct_ctypes[scan[1]] |= _CT_UPPER | _CT_ALNUM; _ct_toupper[scan[0]] = scan[1]; _ct_tolower[scan[1]] = scan[0]; } /* include '_' in the isalnum() list */ _ct_ctypes[UCHAR('_')] |= _CT_ALNUM; /* !!! find the control characters in an ASCII-dependent way */ for (i = 0; i < ' '; i++) { _ct_ctypes[i] |= _CT_CNTRL; } _ct_ctypes[127] |= _CT_CNTRL; _ct_ctypes[255] |= _CT_CNTRL; } �������������������������������������������������������������������������/* ctype.h */ /* This file contains macros definitions and extern declarations for a * version of <ctype.h> which is aware of the o_flipcase letters used in * elvis. * * This file uses the "uchar" data type and "UCHAR" conversion macro which * are defined in "config.h". Consequently, any file that includes this * header must include config.h first. */ #ifndef _CT_UPPER #define _CT_UPPER 0x01 #define _CT_LOWER 0x02 #define _CT_SPACE 0x04 #define _CT_DIGIT 0x08 #define _CT_ALNUM 0x10 #define _CT_CNTRL 0x20 #define isalnum(c) (_ct_ctypes[UCHAR(c)] & _CT_ALNUM) #define isalpha(c) (_ct_ctypes[UCHAR(c)] & (_CT_LOWER|_CT_UPPER)) #define isdigit(c) (_ct_ctypes[UCHAR(c)] & _CT_DIGIT) #define islower(c) (_ct_ctypes[UCHAR(c)] & _CT_LOWER) #define isspace(c) (_ct_ctypes[UCHAR(c)] & _CT_SPACE) #define isupper(c) (_ct_ctypes[UCHAR(c)] & _CT_UPPER) #define iscntrl(c) (_ct_ctypes[UCHAR(c)] & _CT_CNTRL) #define ispunct(c) (!_ct_ctypes[UCHAR(c)]) /* punct = "none of the above" */ #define isascii(c) (!((c) & 0x80)) #define toupper(c) _ct_toupper[UCHAR(c)] #define tolower(c) _ct_tolower[UCHAR(c)] extern uchar _ct_toupper[]; extern uchar _ct_tolower[]; extern uchar _ct_ctypes[]; extern void _ct_init(/* char *flipcase */); #endif /* ndef _CT_UPPER */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* curses.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the functions & variables needed for a tiny subset of * curses. The principle advantage of this version of curses is its * extreme speed. Disadvantages are potentially larger code, few supported * functions, limited compatibility with full curses, and only stdscr. */ #include "config.h" #include "vi.h" #if ANY_UNIX /* The termios/termio/sgtty #ifdefs were a mess, so I removed all but termios. * (KJB) */ # include <termios.h> # if MINIX # include <sys/ioctl.h> # endif #endif #if TOS # include <osbind.h> #endif #if OSK # include <sgstat.h> #endif #if VMS extern int VMS_read_raw; /* Set in initscr() */ #endif extern char *getenv(); static void starttcap(); /* variables, publicly available & used in the macros */ char *termtype; /* name of terminal entry */ short ospeed; /* speed of the tty, eg B2400 */ #if OSK char PC_; /* Pad char */ char *BC; /* backspace character string */ #else char PC; /* Pad char */ #endif WINDOW *stdscr; /* pointer into kbuf[] */ WINDOW kbuf[KBSIZ]; /* a very large output buffer */ int LINES; /* :li#: number of rows */ int COLS; /* :co#: number of columns */ int AM; /* :am: boolean: auto margins? */ int PT; /* :pt: boolean: physical tabs? */ char *VB; /* :vb=: visible bell */ char *UP; /* :up=: move cursor up */ char *SO = ""; /* :so=: standout start */ char *SE = ""; /* :se=: standout end */ char *US = ""; /* :us=: underline start */ char *UE = ""; /* :ue=: underline end */ char *MD = ""; /* :md=: bold start */ char *ME = ""; /* :me=: bold end */ char *AS = ""; /* :as=: alternate (italic) start */ char *AE = ""; /* :ae=: alternate (italic) end */ #ifndef NO_VISIBLE char *MV; /* :mv=: "visible" selection start */ #endif char *CM; /* :cm=: cursor movement */ char *CE; /* :ce=: clear to end of line */ char *CD; /* :cd=: clear to end of screen */ char *AL; /* :al=: add a line */ char *DL; /* :dl=: delete a line */ #if OSK char *SR_; /* :sr=: scroll reverse */ #else char *SR; /* :sr=: scroll reverse */ #endif char *KS = ""; /* :ks=: init string for cursor */ char *KE = ""; /* :ke=: restore string for cursor */ char *KU; /* :ku=: key sequence sent by up arrow */ char *KD; /* :kd=: key sequence sent by down arrow */ char *KL; /* :kl=: key sequence sent by left arrow */ char *KR; /* :kr=: key sequence sent by right arrow */ char *HM; /* :HM=: key sequence sent by the <Home> key */ char *EN; /* :EN=: key sequence sent by the <End> key */ char *PU; /* :PU=: key sequence sent by the <PgUp> key */ char *PD; /* :PD=: key sequence sent by the <PgDn> key */ char *KI; /* :kI=: key sequence sent by the <Insert> key */ #ifndef NO_FKEY char *FKEY[NFKEYS]; /* :k0=: ... :k9=: sequences sent by function keys */ #endif char *IM = ""; /* :im=: insert mode start */ char *IC = ""; /* :ic=: insert the following character */ char *EI = ""; /* :ei=: insert mode end */ char *DC; /* :dc=: delete a character */ char *TI = ""; /* :ti=: terminal init */ /* GB */ char *TE = ""; /* :te=: terminal exit */ /* GB */ #ifndef NO_CURSORSHAPE #if 1 char *CQ = (char *)0;/* :cQ=: normal cursor */ char *CX = (char *)1;/* :cX=: cursor used for EX command/entry */ char *CV = (char *)2;/* :cV=: cursor used for VI command mode */ char *CI = (char *)3;/* :cI=: cursor used for VI input mode */ char *CR = (char *)4;/* :cR=: cursor used for VI replace mode */ #else char *CQ = ""; /* :cQ=: normal cursor */ char *CX = ""; /* :cX=: cursor used for EX command/entry */ char *CV = ""; /* :cV=: cursor used for VI command mode */ char *CI = ""; /* :cI=: cursor used for VI input mode */ char *CR = ""; /* :cR=: cursor used for VI replace mode */ #endif #endif char *aend = ""; /* end an attribute -- either UE or ME */ char ERASEKEY; /* backspace key taken from ioctl structure */ #ifndef NO_COLOR char normalcolor[16]; char SOcolor[16]; char SEcolor[16]; char UScolor[16]; char UEcolor[16]; char MDcolor[16]; char MEcolor[16]; char AScolor[16]; char AEcolor[16]; # ifndef NO_POPUP char POPUPcolor[16]; # endif # ifndef NO_VISIBLE char VISIBLEcolor[16]; # endif #endif #if ANY_UNIX static struct termios oldtermio; /* original tty mode */ static struct termios newtermio; /* cbreak/noecho tty mode */ #endif #if OSK static struct sgbuf oldsgttyb; /* orginal tty mode */ static struct sgbuf newsgttyb; /* noecho tty mode */ #endif static char *capbuf; /* capability string buffer */ /* Initialize the Curses package. */ void initscr() { /* make sure TERM variable is set */ termtype = getenv("TERM"); #if VMS /* VMS getenv() handles TERM as a environment setting. Foreign * terminal support can be implemented by setting the ELVIS_TERM * logical or symbol to match a tinytcap entry. */ if (!strcmp(termtype,"unknown")) termtype = getenv("ELVIS_TERM"); #endif #if MSDOS /* For MS-DOS, if TERM is unset we can default to "pcbios", or * maybe "rainbow". */ if (!termtype) { #ifdef RAINBOW if (*(unsigned char far*)(0xffff000eL) == 6 /* Rainbow 100a */ || *(unsigned char far*)(0xffff000eL) == 148)/* Rainbow 100b */ { termtype = "rainbow"; } else #endif termtype = "pcbios"; } if (!strcmp(termtype, "pcbios")) #else if (!termtype) #endif { #if ANY_UNIX write(2, "Environment variable TERM must be set\n", (unsigned)38); exit(1); #endif #if OSK writeln(2, "Environment variable TERM must be set\n", (unsigned)38); exit(1); #endif #if AMIGA termtype = TERMTYPE; starttcap(termtype); #endif #if MSDOS starttcap("pcbios"); #endif #if TOS termtype = "vt52"; starttcap(termtype); #endif #if VMS write(2, "UNKNOWN terminal: define ELVIS_TERM\n", (unsigned)36); exit(1); #endif } else { #if MSDOS *o_pcbios = 0; #endif /* start termcap stuff */ starttcap(termtype); } /* create stdscr and curscr */ stdscr = kbuf; /* change the terminal mode to cbreak/noecho */ #if ANY_UNIX tcgetattr(2, &oldtermio); #endif #if OSK _gs_opt(0, &oldsgttyb); #endif #if VMS VMS_read_raw = 1; /* cbreak/noecho */ vms_open_tty(); #endif resume_curses(TRUE); } /* Shut down the Curses package. */ void endwin() { /* change the terminal mode back the way it was */ suspend_curses(); #if AMIGA amiclosewin(); #endif } static int curses_active = FALSE; /* Send any required termination strings. Turn off "raw" mode. */ void suspend_curses() { #ifndef NO_CURSORSHAPE if (has_CQ) { do_CQ(); } #endif if (has_TE) /* GB */ { do_TE(); } if (has_KE) { do_KE(); } #ifndef NO_COLOR quitcolor(); #endif refresh(); /* change the terminal mode back the way it was */ #if ANY_UNIX tcsetattr(2, TCSADRAIN, &oldtermio); #endif #if OSK _ss_opt(0, &oldsgttyb); #endif #if AMIGA ttyshutdown(); #endif #if MSDOS raw_set_stdio(FALSE); #endif #if VMS VMS_read_raw = 0; #endif curses_active = FALSE; } /* put the terminal in RAW mode. If "quietly" is FALSE, then ask the user * to hit a key, and wait for keystroke before returning. */ void resume_curses(quietly) int quietly; { if (!curses_active) { /* change the terminal mode to cbreak/noecho */ #if ANY_UNIX ospeed = cfgetospeed(&oldtermio); ERASEKEY = oldtermio.c_cc[VERASE]; newtermio = oldtermio; newtermio.c_iflag &= (IXON|IXOFF|IXANY|ISTRIP|IGNBRK); newtermio.c_oflag &= ~OPOST; newtermio.c_lflag &= ISIG; newtermio.c_cc[VINTR] = ctrl('C'); /* always use ^C for interrupts */ newtermio.c_cc[VMIN] = 1; newtermio.c_cc[VTIME] = 0; newtermio.c_cc[VSUSP] = 0; tcsetattr(2, TCSADRAIN, &newtermio); #endif #if OSK newsgttyb = oldsgttyb; newsgttyb.sg_echo = 0; newsgttyb.sg_eofch = 0; newsgttyb.sg_kbach = 0; newsgttyb.sg_kbich = ctrl('C'); _ss_opt(0, &newsgttyb); ospeed = oldsgttyb.sg_baud; ERASEKEY = oldsgttyb.sg_bspch; #endif #if AMIGA /* turn on window resize and RAW */ ttysetup(); #endif #if MSDOS raw_set_stdio(TRUE); #endif #if VMS VMS_read_raw = 1; { int c; read(0,&c,0); /* Flush the tty buffer. */ } ERASEKEY = '\177'; /* Accept <DEL> as <^H> for VMS */ #endif if (has_TI) /* GB */ { do_TI(); } if (has_KS) { do_KS(); } curses_active = T/A��1A��2A��3A��4A��5A��6A��7A��8A��9A��:A��;A��<A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RUE; } /* If we're supposed to quit quietly, then we're done */ if (quietly) { return; } signal(SIGINT, SIG_IGN); move(LINES - 1, 0); do_SO(); #if VMS qaddstr("\n[Press <RETURN> to continue]"); #else qaddstr("[Press <RETURN> to continue]"); #endif do_SE(); refresh(); ttyread(kbuf, 20, 0); /* in RAW mode, so <20 is very likely */ if (kbuf[0] == ':') { mode = MODE_COLON; addch('\n'); refresh(); } else { mode = MODE_VI; redraw(MARK_UNSET, FALSE); } exwrote = FALSE; #if TURBOC || __GNUC__ || _ANSI signal(SIGINT, (void(*)()) trapint); #else signal(SIGINT, trapint); #endif } /* This function fetches an optional string from termcap */ static void mayhave(T, s) char **T; /* where to store the returned pointer */ char *s; /* name of the capability */ { char *val; val = tgetstr(s, &capbuf); if (val) { *T = val; } } /* This function fetches a required string from termcap */ static void musthave(T, s) char **T; /* where to store the returned pointer */ char *s; /* name of the capability */ { mayhave(T, s); if (!*T) { write(2, "This termcap entry lacks the :", (unsigned)30); write(2, s, (unsigned)2); write(2, "=: capability\n", (unsigned)14); #if OSK write(2, "\l", 1); #endif exit(1); } } /* This function fetches a pair of strings from termcap. If one of them is * missing, then the other one is ignored. */ static void pair(T, U, sT, sU) char **T; /* where to store the first pointer */ char **U; /* where to store the second pointer */ char *sT; /* name of the first capability */ char *sU; /* name of the second capability */ { mayhave(T, sT); mayhave(U, sU); if (!**T || !**U) { *T = *U = ""; } } /* Read everything from termcap */ static void starttcap(term) char *term; { static char cbmem[800]; /* allocate memory for capbuf */ capbuf = cbmem; /* get the termcap entry */ switch (tgetent(kbuf, term)) { case -1: write(2, "Can't read /etc/termcap\n", (unsigned)24); #if OSK write(2, "\l", 1); #endif exit(2); case 0: write(2, "Unrecognized TERM type\n", (unsigned)23); #if OSK write(2, "\l", 1); #endif exit(3); } /* get strings */ musthave(&UP, "up"); mayhave(&VB, "vb"); musthave(&CM, "cm"); pair(&SO, &SE, "so", "se"); mayhave(&TI, "ti"); mayhave(&TE, "te"); if (tgetnum("ug") <= 0) { pair(&US, &UE, "us", "ue"); pair(&MD, &ME, "md", "me"); /* get italics, or have it default to underline */ pair(&AS, &AE, "as", "ae"); if (!*AS) { AS = US; AE = UE; } } #ifndef NO_VISIBLE MV = SO; /* by default */ mayhave(&MV, "mv"); #endif mayhave(&AL, "al"); mayhave(&DL, "dl"); musthave(&CE, "ce"); mayhave(&CD, "cd"); #if OSK mayhave(&SR_, "sr"); #else mayhave(&SR, "sr"); #endif pair(&IM, &EI, "im", "ei"); mayhave(&IC, "ic"); mayhave(&DC, "dc"); /* other termcap stuff */ AM = (tgetflag("am") && !tgetflag("xn")); PT = tgetflag("pt"); #if AMIGA amiopenwin(termtype); /* Must run this before ttysetup(); */ ttysetup(); /* Must run this before getsize(0); */ #endif getsize(0); /* Key sequences */ pair(&KS, &KE, "ks", "ke"); mayhave(&KU, "ku"); /* up */ mayhave(&KD, "kd"); /* down */ mayhave(&KL, "kl"); /* left */ mayhave(&KR, "kr"); /* right */ mayhave(&PU, "kP"); /* PgUp */ mayhave(&PD, "kN"); /* PgDn */ mayhave(&HM, "kh"); /* Home */ mayhave(&EN, "kH"); /* End */ mayhave(&KI, "kI"); /* Insert */ #ifndef CRUNCH if (!PU) mayhave(&PU, "K2"); /* "3x3 pad" names for PgUp, etc. */ if (!PD) mayhave(&PD, "K5"); if (!HM) mayhave(&HM, "K1"); if (!EN) mayhave(&EN, "K4"); mayhave(&PU, "PU"); /* old XENIX names for PgUp, etc. */ mayhave(&PD, "PD"); /* (overrides others, if used.) */ mayhave(&HM, "HM"); mayhave(&EN, "EN"); #endif #ifndef NO_FKEY mayhave(&FKEY[0], "k0"); /* function key codes */ mayhave(&FKEY[1], "k1"); mayhave(&FKEY[2], "k2"); mayhave(&FKEY[3], "k3"); mayhave(&FKEY[4], "k4"); mayhave(&FKEY[5], "k5"); mayhave(&FKEY[6], "k6"); mayhave(&FKEY[7], "k7"); mayhave(&FKEY[8], "k8"); mayhave(&FKEY[9], "k9"); # ifndef NO_SHIFT_FKEY mayhave(&FKEY[10], "s0"); /* shift function key codes */ mayhave(&FKEY[11], "s1"); mayhave(&FKEY[12], "s2"); mayhave(&FKEY[13], "s3"); mayhave(&FKEY[14], "s4"); mayhave(&FKEY[15], "s5"); mayhave(&FKEY[16], "s6"); mayhave(&FKEY[17], "s7"); mayhave(&FKEY[18], "s8"); mayhave(&FKEY[19], "s9"); # ifndef NO_CTRL_FKEY mayhave(&FKEY[20], "c0"); /* control function key codes */ mayhave(&FKEY[21], "c1"); mayhave(&FKEY[22], "c2"); mayhave(&FKEY[23], "c3"); mayhave(&FKEY[24], "c4"); mayhave(&FKEY[25], "c5"); mayhave(&FKEY[26], "c6"); mayhave(&FKEY[27], "c7"); mayhave(&FKEY[28], "c8"); mayhave(&FKEY[29], "c9"); # ifndef NO_ALT_FKEY mayhave(&FKEY[30], "a0"); /* alt function key codes */ mayhave(&FKEY[31], "a1"); mayhave(&FKEY[32], "a2"); mayhave(&FKEY[33], "a3"); mayhave(&FKEY[34], "a4"); mayhave(&FKEY[35], "a5"); mayhave(&FKEY[36], "a6"); mayhave(&FKEY[37], "a7"); mayhave(&FKEY[38], "a8"); mayhave(&FKEY[39], "a9"); # endif # endif # endif #endif #ifndef NO_CURSORSHAPE /* cursor shapes */ CQ = tgetstr("cQ", &capbuf); if (has_CQ) { CX = tgetstr("cX", &capbuf); if (!CX) CX = CQ; CV = tgetstr("cV", &capbuf); if (!CV) CV = CQ; CI = tgetstr("cI", &capbuf); if (!CI) CI = CQ; CR = tgetstr("cR", &capbuf); if (!CR) CR = CQ; } # ifndef CRUNCH else { CQ = CV = ""; pair(&CQ, &CV, "ve", "vs"); CX = CI = CR = CQ; } # endif /* !CRUNCH */ #endif /* !NO_CURSORSHAPE */ #ifndef NO_COLOR strcpy(SOcolor, SO); strcpy(SEcolor, SE); strcpy(AScolor, AS); strcpy(AEcolor, AE); strcpy(MDcolor, MD); strcpy(MEcolor, ME); strcpy(UScolor, US); strcpy(UEcolor, UE); # ifndef NO_POPUP strcpy(POPUPcolor, SO); # endif # ifndef NO_VISIBLE strcpy(VISIBLEcolor, MV); # endif #endif } /* This function gets the window size. It uses the TIOCGWINSZ ioctl call if * your system has it, or tgetnum("li") and tgetnum("co") if it doesn't. * This function is called once during initialization, and thereafter it is * called whenever the SIGWINCH signal is sent to this process. */ int getsize(signo) int signo; { int lines; int cols; #ifdef TIOCGWINSZ struct winsize size; #endif #ifdef SIGWINCH /* reset the signal vector */ signal(SIGWINCH, getsize); #endif /* get the window size, one way or another. */ lines = cols = 0; #ifdef TIOCGWINSZ if (ioctl(2, TIOCGWINSZ, &size) >= 0) { lines = size.ws_row; cols = size.ws_col; } #endif #if AMIGA /* Amiga gets window size by asking the console.device */ if (!strcmp(TERMTYPE, termtype)) { auto long len; auto char buf[30]; Write(Output(), "\2330 q", 4); /* Ask the console.device */ len = Read(Input(), buf, 29); buf[len] = '\000'; sscanf(&buf[5], "%d;%d", &lines, &cols); } #endif if ((lines == 0 || cols == 0) && signo == 0) { LINES = tgetnum("li"); COLS = tgetnum("co"); } #if MSDOS # ifdef RAINBOW if (!strcmp(termtype, "rainbow")) { /* Determine whether Rainbow is in 80-column or 132-column mode */ cols = *(unsigned char far *)0xee000f57L; } else # endif { lines = v_rows(); cols = v_cols(); } #endif if (lines >= 2) { LINES = lines; } if (cols >= 30) { COLS = cols; } /* Make sure we got values that we can live with */ if (LINES < 2 || COLS < 30) { write(2, "Screen too small\n", (unsigned)17); #if OSK write(2, "\l", 1); #endif endwin(); exit(2); } #if AMIGA if (*o_lines != LINES || *o_columns != COLS) { *o_lines = LINES; *o_columns = COLS; } #endif return 0; } /* This is a function version of addch() -- it is used by tputs() */ int faddch(ch) int ch; { addch(ch); return 0; } /* This function quickly adds a string to the output queue. It does *NOT* * convert \n into <CR><LF>. */ void qaddstr(str) char *str; { REG char *s_, *d_; #if MSDOS if (o_pcbios[0]) { while (*str) qaddch(*str++); return; } #endif for (s_=(str), d_=stdscr; *d_++ = *s_++; ) { } stdscr = d_ - 1; } /* Output the ESC sequence needed to go into any video mode, if supported */ void attrset(a) int a; { do_aend(); if (a == A_BOLD) { do_MD(); aend = ME; } else if (a == A_UNDERLINE) { do_US(); aend = UE; } else if (a == A_ALTCHARSET) { do_AS(); aend = AE; } else { aend = ""; } } /* Insert a single character into the display */ void insch(ch) int ch; { if (has_IM) do_IM(); do_IC(); qaddch(ch); if (has_EI) do_EI(); } void wrefresh() { if (stdscr != kbuf) { VOIDBIOS(;,ttywrite(kbuf, (unsigned)(stdscr - kbuf))); stdscr = kbuf; } } void wqrefresh() { if (stdscr - kbuf > 2000) { VOIDBIOS(stdscr = kbuf, { ttywrite(kbuf, (unsigned)(stdscr - kbuf)); stdscr = kbuf; }); } } #ifndef NO_COLOR /* This function is called during termination. It resets color modes */ int ansiquit() { /* if ANSI color terminal, then reset the colors */ if (!strcmp(UP, "\033[A")) { tputs("\033[37;40m\033[m", 1, faddch); clrtoeol(); return 1; } return 0; } /* This sets the color strings that work for ANSI terminals. If the TERMCAP * doesn't look like an ANSI terminal, then it returns FALSE. If the colors * aren't understood, it also returns FALSE. If all goes well, it returns TRUE */ int ansicolor(cmode, attrbyte) int cmode; /* mode to set, e.g. A_NORMAL */ int attrbyte; /* IBM PC attribute byte */ { char temp[16]; /* hold the new mode string */ /* if not ANSI-ish, then fail */ if (strcmp(UP, "\033[A") && strcmp(UP, "\033OA")) { msg("Don't know how to set colors for this terminal"); return 0; } /* construct the color string */ sprintf(temp, "\033[m\033[3%c;4%c%s%sm", "04261537"[attrbyte & 0x07], "04261537"[(attrbyte >> 4) & 0x07], (attrbyte & 0x08) ? ";1" : "", (attrbyte & 0x80) ? ";5" : ""); /* stick it in the right place */ switch (cmode) { case A_NORMAL: if (!strcmp(MEcolor, normalcolor)) strcpy(MEcolor, temp); if (!strcmp(UEcolor, normalcolor)) strcpy(UEcolor, temp); if (!strcmp(AEcolor, normalcolor)) strcpy(AEcolor, temp); if (!strcmp(SEcolor, normalcolor)) strcpy(SEcolor, temp); strcpy(normalcolor, temp); tputs(normalcolor, 1, faddch); break; case A_BOLD: strcpy(MDcolor, temp); strcpy(MEcolor, normalcolor); break; case A_UNDERLINE: strcpy(UScolor, temp); strcpy(UEcolor, normalcolor); break; case A_ALTCHARSET: strcpy(AScolor, temp); strcpy(AEcolor, normalcolor); break; case A_STANDOUT: strcpy(SOcolor, temp); strcpy(SEcolor, normalcolor); break; #ifndef NO_POPUP case A_POPUP: strcpy(POPUPcolor, temp); break; #endif #ifndef NO_VISIBLE case A_VISIBLE: strcpy(VISIBLEcolor, temp); break; #endif } return 1; } /* This function outputs the ESC sequence needed to switch the screen back * to "normal" mode. On color terminals which haven't had their color set * yet, this is one of the termcap strings; for color terminals that really * have had colors defined, we just the "normal color" escape sequence. */ endcolor() { if (aend == ME) tputs(MEcolor, 1, faddch); else if (aend == UE) tputs(UEcolor, 1, faddch); else if (aend == AE) tputs(AEcolor, 1, faddch); else if (aend == SE) tputs(SEcolor, 1, faddch); aend = ""; return 0; } #endif /* !NO_COLOR */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* curses.h */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This is the header file for a small, fast, fake curses package */ /* termcap stuff */ extern char *tgoto(); extern char *tgetstr(); extern void tputs(); #if MSDOS /* BIOS interface used instead of termcap for MS-DOS */ extern int vmode; extern void v_up(); extern void v_cb(); extern void v_cs(); extern void v_ce(); extern void v_cl(); extern void v_cd(); extern void v_al(); extern void v_dl(); extern void v_sr(); extern void v_move(); #endif /* faddch() is a function. a pointer to it is passed to tputs() */ extern int faddch(); /* data types */ #define WINDOW char /* CONSTANTS & SYMBOLS */ #define TRUE 1 #define FALSE 0 #define A_NORMAL 0 #define A_STANDOUT 1 #define A_BOLD 2 #define A_UNDERLINE 3 #define A_ALTCHARSET 4 #define A_POPUP 5 #define A_VISIBLE 6 #define KBSIZ 4096 /* figure out how many function keys we need to allow. */ #ifndef NO_FKEY # ifdef NO_SHIFT_FKEY # define NFKEYS 10 # else # ifdef NO_CTRL_FKEY # define NFKEYS 20 # else # ifdef NO_ALT_FKEY # define NFKEYS 30 # else # define NFKEYS 40 # endif # endif # endif extern char *FKEY[NFKEYS]; /* :k0=:...:k9=: codes sent by function keys */ #endif /* extern variables, defined in curses.c */ extern char *termtype; /* name of terminal entry */ extern short ospeed; /* tty speed, eg B2400 */ #if OSK extern char PC_; /* Pad char */ extern char *BC; /* Backspace char string */ #else extern char PC; /* Pad char */ #endif extern WINDOW *stdscr; /* pointer into kbuf[] */ extern WINDOW kbuf[KBSIZ]; /* a very large output buffer */ extern int LINES; /* :li#: number of rows */ extern int COLS; /* :co#: number of columns */ extern int AM; /* :am: boolean: auto margins? */ extern int PT; /* :pt: boolean: physical tabs? */ extern char *VB; /* :vb=: visible bell */ extern char *UP; /* :up=: move cursor up */ extern char *SO; /* :so=: standout start */ extern char *SE; /* :se=: standout end */ extern char *US; /* :us=: underline start */ extern char *UE; /* :ue=: underline end */ extern char *MD; /* :md=: bold start */ extern char *ME; /* :me=: bold end */ extern char *AS; /* :as=: alternate (italic) start */ extern char *AE; /* :ae=: alternate (italic) end */ #ifndef NO_VISIBLE extern char *MV; /* :mv=: "visible" selection start */ #endif extern char *CM; /* :cm=: cursor movement */ extern char *CE; /* :ce=: clear to end of line */ extern char *CD; /* :cd=: clear to end of screen */ extern char *AL; /* :al=: add a line */ extern char *DL; /* :dl=: delete a line */ #if OSK extern char *SR_; /* :sr=: scroll reverse */ #else extern char *SR; /* :sr=: scroll reverse */ #endif extern char *KS; /* :ks=: init string for cursor */ extern char *KE; /* :ke=: restore string for cursor */ extern char *KU; /* :ku=: sequence sent by up key */ extern char *KD; /* :kd=: sequence sent by down key */ extern char *KL; /* :kl=: sequence sent by left key */ extern char *KR; /* :kr=: sequence sent by right key */ extern char *PU; /* :PU=: key sequence sent by PgUp key */ extern char *PD; /* :PD=: key sequence sent by PgDn key */ extern char *HM; /* :HM=: key sequence sent by Home key */ extern char *EN; /* :EN=: key sequence sent by End key */ extern char *KI; /* :kI=: key sequence sent by Insert key */ extern char *IM; /* :im=: insert mode start */ extern char *IC; /* :ic=: insert following char */ extern char *EI; /* :ei=: insert mode end */ extern char *DC; /* :dc=: delete a character */ extern char *TI; /* :ti=: terminal init */ /* GB */ extern char *TE; /* :te=: terminal exit */ /* GB */ #ifndef NO_CURSORSHAPE extern char *CQ; /* :cQ=: normal cursor */ extern char *CX; /* :cX=: cursor used for EX command/entry */ extern char *CV; /* :cV=: cursor used for VI command mode */ extern char *CI; /* :cI=: cursor used for VI input mode */ extern char *CR; /* :cR=: cursor used for VI replace mode */ #endif extern char *aend; /* end an attribute -- either UE or ME */ extern char ERASEKEY; /* taken from the ioctl structure */ #ifndef NO_COLOR extern char SOcolor[]; extern char SEcolor[]; extern char UScolor[]; extern char UEcolor[]; extern char MDcolor[]; extern char MEcolor[]; extern char AScolor[]; extern char AEcolor[]; # ifndef NO_POPUP extern char POPUPcolor[]; # endif # ifndef NO_VISIBLE extern char VISIBLEcolor[]; # endif extern char normalcolor[]; #endif /* undef NO_COLOR */ /* Msdos-versions may use bios; others always termcap. * Will emit some 'code has no effect' warnings in unix. */ #if MSDOS extern char o_pcbios[1]; /* BAH! */ #define CHECKBIOS(x,y) (*o_pcbios ? (x) : (y)) #define VOIDBIOS(x,y) {if (*o_pcbios) {x;} else {y;}} #else #define CHECKBIOS(x,y) (y) #define VOIDBIOS(x,y) {y;} #endif #ifndef NO_COLOR # define setcolor(m,a) CHECKBIOS(bioscolor(m,a), ansicolor(m,a)) # define fixcolor() VOIDBIOS(;, tputs(normalcolor, 1, faddch)) # define quitcolor() CHECKBIOS(biosquit(), ansiquit()) # define do_SO() VOIDBIOS((vmode=A_STANDOUT), tputs(SOcolor, 1, faddch)) # define do_SE() VOIDBIOS((vmode=A_NORMAL), tputs(SEcolor, 1, faddch)) # define do_US() VOIDBIOS((vmode=A_UNDERLINE), tputs(UScolor, 1, faddch)) # define do_UE() VOIDBIOS((vmode=A_NORMAL), tputs(UEcolor, 1, faddch)) # define do_MD() VOIDBIOS((vmode=A_BOLD), tputs(MDcolor, 1, faddch)) # define do_ME() VOIDBIOS((vmode=A_NORMAL), tputs(MEcolor, 1, faddch)) # define do_AS() VOIDBIOS((vmode=A_ALTCHARSET), tputs(AScolor, 1, faddch)) # define do_AE() VOIDBIOS((vmode=A_NORMAL), tputs(AEcolor, 1, faddch)) # define do_POPUP() VOIDBIOS((vmode=A_POPUP), tputs(POPUPcolor, 1, faddch)) # define do_VISIBLE() VOIDBIOS((vmode=A_VISIBLE), tputs(VISIBLEcolor, 1, faddch)) #else # define do_SO() VOIDBIOS((vmode=A_STANDOUT), tputs(SO, 1, faddch)) # define do_SE() VOIDBIOS((vmode=A_NORMAL), tputs(SE, 1, faddch)) # define do_US() VOIDBIOS((vmode=A_UNDERLINE), tputs(US, 1, faddch)) # define do_UE() VOIDBIOS((vmode=A_NORMAL), tputs(UE, 1, faddch)) # define do_MD() VOIDBIOS((vmode=A_BOLD), tputs(MD, 1, faddch)) # define do_ME() VOIDBIOS((vmode=A_NORMAL), tputs(ME, 1, faddch)) # define do_AS() VOIDBIOS((vmode=A_ALTCHARSET), tputs(AS, 1, faddch)) # define do_AE() VOIDBIOS((vmode=A_NORMAL), tputs(AE, 1, faddch)) # define do_POPUP() VOIDBIOS((vmode=A_POPUP), tputs(SO, 1, faddch)) # define do_VISIBLE() VOIDBIOS((vmode=A_VISIBLE), tputs(MV, 1, faddch)) #endif #define do_VB() VOIDBIOS(;, tputs(VB, 1, faddch)) #define do_UP() VOIDBIOS(v_up(), tputs(UP, 1, faddch)) #undef do_CM /* move */ #define do_CE() VOIDBIOS(v_ce(), tputs(CE, 1, faddch)) #define do_CD() VOIDBIOS(v_cd(), tputs(CD, 1, faddch)) #define do_AL() VOIDBIOS(v_al(), tputs(AL, LINES, faddch)) #define do_DL() VOIDBIOS(v_dl(), tputs(DL, LINES, faddch)) #if OSK #define do_SR() VOIDBIOS(v_sr(), tputs(SR_, 1, faddch)) #else #define do_SR() VOIDBIOS(v_sr(), tputs(SR, 1, faddch)) #endif #define do_KS() VOIDBIOS(1, tputs(KS, 1, faddch)) #define do_KE() VOIDBIOS(1, tputs(KE, 1, faddch)) #define do_IM() VOIDBIOS(;, tputs(IM, 1, faddch)) #define do_IC() VOIDBIOS(;, tputs(IC, 1, faddch)) #define do_EI() VOIDBIOS(;, tputs(EI, 1, faddch)) #define do_DC() VOIDBIOS(;, tputs(DC, COLS, faddch)) #define do_TI() VOIDBIOS(;, (void)ttywrite(TI, (unsigned)strlen(TI))) #define do_TE() VOIDBIOS(;, (void)ttywrite(TE, (unsigned)strlen(TE))) #ifndef NO_CURSORSHAPE # define do_CQ() VOIDBIOS(v_cs(), tputs(CQ, 1, faddch)) # define do_CX() VOIDBIOS(v_cs(), tputs(CX, 1, faddch)) # define do_CV() VOIDBIOS(v_cs(), tputs(CV, 1, faddch)) # define do_CI() VOIDBIOS(v_cb(), tputs(CI, 1, faddch)) # define do_CR() VOIDBIOS(v_cb(), tputs(CR, 1, faddch)) #endif #ifndef NO_COLOR # define do_aend() VOIDBIOS((vmode=A_NORMAL), endcolor()) #else # define do_aend() VOIDBIOS((vmode=A_NORMAL), tputs(aend, 1, faddch)) #endif #define has_AM CHECKBIOS(1, AM) #define has_PT CHECKBIOS(0, PT) #define has_VB CHECKBIOS((char *)0, VB) #define has_UP CHECKBIOS((char *)1, UP) #define has_SO CHECKBIOS((char)1, (*SO)) #define has_SE CHECKBIOS((char)1, (*SE)) #define has_US CHECKBIOS((char)1, (*US)) #define has_UE CHECKBIOS((char)1, (*UE)) #define has_DA��FA��GA��HA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MD CHECKBIOS((char)1, (*MD)) #define has_ME CHECKBIOS((char)1, (*ME)) #define has_AS CHECKBIOS((char)1, (*AS)) #define has_AE CHECKBIOS((char)1, (*AE)) #undef has_CM /* cursor move: don't need */ #define has_CB CHECKBIOS(1, 0) #define has_CS CHECKBIOS(1, 0) #define has_CE CHECKBIOS((char *)1, CE) #define has_CD CHECKBIOS((char *)1, CD) #define has_AL CHECKBIOS((char *)1, AL) #define has_DL CHECKBIOS((char *)1, DL) #if OSK #define has_SR CHECKBIOS((char *)1, SR_) #else #define has_SR CHECKBIOS((char *)1, SR) #endif #define has_KS CHECKBIOS((char)1, (*KS)) #define has_KE CHECKBIOS((char)1, (*KE)) #define has_KU KU #define has_KD KD #define has_KL KL #define has_KR KR #define has_HM HM #define has_EN EN #define has_PU PU #define has_PD PD #define has_KI KI #define has_IM CHECKBIOS((char)0, (*IM)) #define has_IC CHECKBIOS((char)0, (*IC)) #define has_EI CHECKBIOS((char)0, (*EI)) #define has_DC CHECKBIOS((char *)0, DC) #define has_TI CHECKBIOS((char)0, (*TI)) #define has_TE CHECKBIOS((char)0, (*TE)) #ifndef NO_CURSORSHAPE #define has_CQ CHECKBIOS((char *)1, CQ) #endif /* (pseudo)-Curses-functions */ #ifdef lint # define _addCR VOIDBIOS(;, (stdscr[-1] == '\n' ? qaddch('\r') : (stdscr[-1] = '\n'))) #else # if OSK # define _addCR VOIDBIOS(;, (stdscr[-1] == '\n' ? qaddch('\l') : (stdscr[-1] = stdscr[-1]))) # else # define _addCR VOIDBIOS(;, (stdscr[-1] == '\n' ? qaddch('\r') : 0)) # endif #endif #ifdef AZTEC_C # define qaddch(ch) CHECKBIOS(v_put(ch), (*stdscr = (ch), *stdscr++)) #else #define qaddch(ch) CHECKBIOS(v_put(ch), (*stdscr++ = (ch))) #endif #if OSK #define addch(ch) if (qaddch(ch) == '\n') qaddch('\l'); else #else #define addch(ch) if (qaddch(ch) == '\n') qaddch('\r'); else #endif extern void initscr(); extern void endwin(); extern void suspend_curses(); extern void resume_curses(); extern void attrset(); extern void insch(); extern void qaddstr(); extern void wrefresh(); extern void wqrefresh(); #define addstr(str) {qaddstr(str); _addCR;} #define move(y,x) VOIDBIOS(v_move(x,y), tputs(tgoto(CM, x, y), 1, faddch)) #define mvaddch(y,x,ch) {move(y,x); addch(ch);} #define refresh() VOIDBIOS(;, wrefresh()) #define standout() do_SO() #define standend() do_SE() #define clrtoeol() do_CE() #define clrtobot() do_CD() #define insertln() do_AL() #define deleteln() do_DL() #define delch() do_DC() #define scrollok(w,b) #define raw() #define echo() #define cbreak() #define noraw() #define noecho() #define nocbreak() �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cut.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains function which manipulate the cut buffers. */ #include "config.h" #include "vi.h" #if TURBOC #include <process.h> /* needed for getpid */ #endif #if TOS #include <osbind.h> #define rename(a,b) Frename(0,a,b) #endif # define NANONS 9 /* number of anonymous buffers */ static struct cutbuf { short *phys; /* pointer to an array of #s of BLKs containing text */ int nblks; /* number of blocks in phys[] array */ int start; /* offset into first block of start of cut */ int end; /* offset into last block of end of cut */ int tmpnum; /* ID number of the temp file */ char lnmode; /* boolean: line-mode cut? (as opposed to char-mode) */ } named[27], /* cut buffers "a through "z and ". */ anon[NANONS]; /* anonymous cut buffers */ static char cbname; /* name chosen for next cut/paste operation */ static char dotcb; /* cut buffer to use if "doingdot" is set */ #ifndef NO_RECYCLE /* This function builds a list of all blocks needed in the current tmp file * for the contents of cut buffers. * !!! WARNING: if you have more than ~450000 bytes of text in all of the * cut buffers, then this will fail disastrously, because buffer overflow * is *not* allowed for. */ int cutneeds(need) BLK *need; /* this is where we deposit the list */ { struct cutbuf *cb; /* used to count through cut buffers */ int i; /* used to count through blocks of a cut buffer */ int n; /* total number of blocks in list */ n = 0; /* first the named buffers... */ for (cb = named; cb < &named[27]; cb++) { if (cb->tmpnum != tmpnum) continue; for (i = cb->nblks; i-- > 0; ) { need->n[n++] = cb->phys[i]; } } /* then the anonymous buffers */ for (cb = anon; cb < &anon[NANONS]; cb++) { if (cb->tmpnum != tmpnum) continue; for (i = cb->nblks; i-- > 0; ) { need->n[n++] = cb->phys[i]; } } /* return the length of the list */ return n; } #endif static void maybezap(num) int num; /* the tmpnum of the temporary file to [maybe] delete */ { char cutfname[80]; int i; /* if this is the current tmp file, then we'd better keep it! */ if (tmpfd >= 0 && num == tmpnum) { return; } /* see if anybody else needs this tmp file */ for (i = 27; --i >= 0; ) { if (named[i].nblks > 0 && named[i].tmpnum == num) { break; } } if (i < 0) { for (i = NANONS; --i >= 0 ; ) { if (anon[i].nblks > 0 && anon[i].tmpnum == num) { break; } } } /* if nobody else needs it, then discard the tmp file */ if (i < 0) { #if MSDOS || TOS strcpy(cutfname, o_directory); if ((i = strlen(cutfname)) && !strchr(":/\\", cutfname[i - 1])) cutfname[i++] = SLASH; sprintf(cutfname + i, TMPNAME + 3, getpid(), num); #else sprintf(cutfname, TMPNAME, o_directory, getpid(), num); #endif unlink(cutfname); } } /* This function frees a cut buffer. If it was the last cut buffer that * refered to an old temp file, then it will delete the temp file. */ static void cutfree(buf) struct cutbuf *buf; { int num; /* return immediately if the buffer is already empty */ if (buf->nblks <= 0) { return; } /* else free up stuff */ num = buf->tmpnum; buf->nblks = 0; #ifdef DEBUG if (!buf->phys) msg("cutfree() tried to free a NULL buf->phys pointer."); else #endif free((char *)buf->phys); /* maybe delete the temp file */ maybezap(num); } /* This function is called when we are about to abort a tmp file. * * To minimize the number of extra files lying around, only named cut buffers * are preserved in a file switch; the anonymous buffers just go away. */ void cutswitch() { int i; /* mark the current temp file as being "obsolete", and close it. */ storename((char *)0); close(tmpfd); tmpfd = -1; /* discard all anonymous cut buffers */ for (i = 0; i < NANONS; i++) { cutfree(&anon[i]); } /* delete the temp file, if we don't really need it */ maybezap(tmpnum); } /* This function should be called just before termination of vi */ void cutend() { int i; /* free the anonymous buffers, if they aren't already free */ cutswitch(); /* free all named cut buffers, since they might be forcing an older * tmp file to be retained. */ for (i = 0; i < 27; i++) { cutfree(&named[i]); } /* delete the temp file */ maybezap(tmpnum); } /* This function is used to select the cut buffer to be used next */ void cutname(name) int name; /* a single character */ { cbname = name; } /* This function copies a selected segment of text to a cut buffer */ void cut(from, to) MARK from; /* start of text to cut */ MARK to; /* end of text to cut */ { int first; /* logical number of first block in cut */ int last; /* logical number of last block used in cut */ long line; /* a line number */ int lnmode; /* boolean: will this be a line-mode cut? */ MARK delthru;/* end of text temporarily inserted for apnd */ REG struct cutbuf *cb; REG long l; REG int i; REG char *scan; char *blkc; /* detect whether this must be a line-mode cut or char-mode cut */ if (markidx(from) == 0 && markidx(to) == 0) lnmode = TRUE; else lnmode = FALSE; /* by default, we don't "delthru" anything */ delthru = MARK_UNSET; /* handle the "doingdot" quirks */ if (doingdot) { if (!cbname) { cbname = dotcb; } } else if (cbname != '.') { dotcb = cbname; } /* decide which cut buffer to use */ if (!cbname) { /* free up the last anonymous cut buffer */ cutfree(&anon[NANONS - 1]); /* shift the anonymous cut buffers */ for (i = NANONS - 1; i > 0; i--) { anon[i] = anon[i - 1]; } /* use the first anonymous cut buffer */ cb = anon; cb->nblks = 0; } else if (cbname >= 'a' && cbname <= 'z') { cb = &named[cbname - 'a']; cutfree(cb); } #ifndef CRUNCH else if (cbname >= 'A' && cbname <= 'Z') { cb = &named[cbname - 'A']; if (cb->nblks > 0) { /* resolve linemode/charmode differences */ if (!lnmode && cb->lnmode) { from &= ~(BLKSIZE - 1); if (markidx(to) != 0 || to == from) { to = to + BLKSIZE - markidx(to); } lnmode = TRUE; } /* insert the old cut-buffer before the new text */ mark[28] = to; delthru = paste(from, FALSE, TRUE); if (delthru == MARK_UNSET) { return; } delthru++; to = mark[28]; } cutfree(cb); } #endif /* not CRUNCH */ else if (cbname == '.') { cb = &named[26]; cutfree(cb); } else { msg("Invalid cut buffer name: \"%c", cbname); dotcb = cbname = '\0'; return; } cbname = '\0'; cb->tmpnum = tmpnum; /* detect whether we're doing a line mode cut */ cb->lnmode = lnmode; /* ---------- */ /* Reporting... */ if (markidx(from) == 0 && markidx(to) == 0) { rptlines = markline(to) - markline(from); rptlabel = "yanked"; } /* ---------- */ /* make sure each block has a physical disk address */ blksync(); /* find the first block in the cut */ line = markline(from); for (first = 1; line > lnum[first]; first++) { } /* fetch text of the block containing that line */ blkc = scan = blkget(first)->c; /* find the mark in the block */ for (l = lnum[first - 1]; ++l < line; ) { while (*scan++ != '\n') { } } scan += markidx(from); /* remember the offset of the start */ cb->start = scan - blkc; /* ---------- */ /* find the last block in the cut */ line = markline(to); for (last = first; line > lnum[last]; last++) { } /* fetch text of the block containing that line */ if (last != first) { blkc = scan = blkget(last)->c; } else { scan = blkc; } /* find the mark in the block */ for (l = lnum[last - 1]; ++l < line; ) { while (*scan++ != '\n') { } } if (markline(to) <= nlines) { scan += markidx(to); } /* remember the offset of the end */ cb->end = scan - blkc; /* ------- */ /* remember the physical block numbers of all included blocks */ cb->nblks = last - first; if (cb->end > 0) { cb->nblks++; } #ifdef lint cb->phys = (short *)0; #else cb->phys = (short *)malloc((unsigned)(cb->nblks * sizeof(short))); #endif for (i = 0; i < cb->nblks; i++) { cb->phys[i] = hdr.n[first++]; } #iPA��RA��SA��TA��UA��VA��WA��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������fndef CRUNCH /* if we temporarily inserted text for appending, then delete that * text now -- before the user sees it. */ if (delthru) { line = rptlines; delete(from, delthru); rptlines = line; rptlabel = "yanked"; } #endif /* not CRUNCH */ } static void readcutblk(cb, blkno) struct cutbuf *cb; int blkno; { char cutfname[50];/* name of an old temp file */ int fd; /* either tmpfd or the result of open() */ #if MSDOS || TOS int i; #endif /* decide which fd to use */ if (cb->tmpnum == tmpnum) { fd = tmpfd; } else { #if MSDOS || TOS strcpy(cutfname, o_directory); if ((i = strlen(cutfname)) && !strchr(":/\\", cutfname[i-1])) cutfname[i++]=SLASH; sprintf(cutfname+i, TMPNAME+3, getpid(), cb->tmpnum); #else sprintf(cutfname, TMPNAME, o_directory, getpid(), cb->tmpnum); #endif fd = open(cutfname, O_RDONLY); } /* get the block */ lseek(fd, (long)cb->phys[blkno] * (long)BLKSIZE, 0); if (read(fd, tmpblk.c, (unsigned)BLKSIZE) != BLKSIZE) { msg("Error reading back from tmp file for pasting!"); } /* close the fd, if it isn't tmpfd */ if (fd != tmpfd) { close(fd); } } /* This function inserts text from a cut buffer, and returns the MARK where * insertion ended. Return MARK_UNSET on errors. */ MARK paste(at, after, retend) MARK at; /* where to insert the text */ int after; /* boolean: insert after mark? (rather than before) */ int retend; /* boolean: return end of text? (rather than start) */ { REG struct cutbuf *cb; REG int i; /* handle the "doingdot" quirks */ if (doingdot) { if (!cbname) { if (dotcb >= '1' && dotcb < '1' + NANONS - 1) { dotcb++; } cbname = dotcb; } } else if (cbname != '.') { dotcb = cbname; } /* decide which cut buffer to use */ if (cbname >= 'A' && cbname <= 'Z') { cb = &named[cbname - 'A']; } else if (cbname >= 'a' && cbname <= 'z') { cb = &named[cbname - 'a']; } else if (cbname >= '1' && cbname <= '9') { cb = &anon[cbname - '1']; } else if (cbname == '.') { cb = &named[26]; } else if (!cbname) { cb = anon; } else { msg("Invalid cut buffer name: \"%c", cbname); cbname = '\0'; return MARK_UNSET; } /* make sure it isn't empty */ if (cb->nblks == 0) { if (cbname) msg("Cut buffer \"%c is empty", cbname); else msg("Cut buffer is empty"); cbname = '\0'; return MARK_UNSET; } cbname = '\0'; /* adjust the insertion MARK for "after" and line-mode cuts */ if (cb->lnmode) { at &= ~(BLKSIZE - 1); if (after) { at += BLKSIZE; } } else if (after) { /* careful! if markidx(at) == 0 we might be pasting into an * empty line -- so we can't blindly increment "at". */ if (markidx(at) == 0) { pfetch(markline(at)); if (plen != 0) { at++; } } else { at++; } } /* put a copy of the "at" mark in the mark[] array, so it stays in * sync with changes made via add(). */ mark[27] = at; /* simple one-block paste? */ if (cb->nblks == 1) { /* get the block */ readcutblk(cb, 0); /* isolate the text we need within it */ if (cb->end) { tmpblk.c[cb->end] = '\0'; } /* insert it */ ChangeText { add(at, &tmpblk.c[cb->start]); } } else { /* multi-block paste */ ChangeText { i = cb->nblks - 1; /* add text from the last block first */ if (cb->end > 0) { readcutblk(cb, i); tmpblk.c[cb->end] = '\0'; add(at, tmpblk.c); i--; } /* add intervening blocks */ while (i > 0) { readcutblk(cb, i); add(at, tmpblk.c); i--; } /* add text from the first cut block */ readcutblk(cb, 0); add(at, &tmpblk.c[cb->start]); } } /* Reporting... */ rptlines = markline(mark[27]) - markline(at); rptlabel = "pasted"; /* return the mark at the beginning/end of inserted text */ if (retend) { return mark[27] - 1L; } return at; } #ifndef NO_AT /* This function copies characters from a cut buffer into a string. * It returns the number of characters in the cut buffer. If the cut * buffer is too large to fit in the string (i.e. if cb2str() returns * a number >= size) then the characters will not have been copied. * It returns 0 if the cut buffer is empty, and -1 for invalid cut buffers. */ int cb2str(name, buf, size) int name; /* the name of a cut-buffer to get: a-z only! */ char *buf; /* where to put the string */ unsigned size; /* size of buf */ { REG struct cutbuf *cb; REG char *src; REG char *dest; /* decide which cut buffer to use */ if (name >= 'a' && name <= 'z') { cb = &named[name - 'a']; } else { return -1; } /* if the buffer is empty, return 0 */ if (cb->nblks == 0) { return 0; } /* !!! if not a single-block cut, then fail */ if (cb->nblks != 1) { return size; } /* if too big, return the size now, without doing anything */ if (cb->end - cb->start >= size) { return cb->end - cb->start; } /* get the block */ readcutblk(cb, 0); /* isolate the string within that blk */ if (cb->start == 0) { tmpblk.c[cb->end] = '\0'; } else { for (dest = tmpblk.c, src = dest + cb->start; src < tmpblk.c + cb->end; ) { *dest++ = *src++; } *dest = '\0'; } /* copy the string into the buffer */ if (buf != tmpblk.c) { strcpy(buf, tmpblk.c); } /* return the length */ return cb->end - cb->start; } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* elvprsv.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the portable sources for the "elvprsv" program. * "Elvprsv" is run by Elvis when Elvis is about to die. It is also * run when the computer boots up. It is not intended to be run directly * by the user, ever. * * Basically, this program does the following four things: * - It extracts the text from the temporary file, and places the text in * a file in the /usr/preserve directory. * - It adds a line to the /usr/preserve/Index file, describing the file * that it just preserved. * - It removes the temporary file. * - It sends mail to the owner of the file, saying that the file was * preserved, and how it can be recovered. * * The /usr/preserve/Index file is a log file that contains one line for each * file that has ever been preserved. Each line of this file describes one * preserved file. The first word on the line is the name of the file that * contains the preserved text. The second word is the full pathname of the * file that was being edited; for anonymous buffers, this is the directory * name plus "/foo". * * If elvprsv's first argument (after the command name) starts with a hyphen, * then the characters after the hyphen are used as a description of when * the editor went away. This is optional. * * The remaining arguments are all the names of temporary files that are * to be preserved. For example, on a UNIX system, the /etc/rc file might * invoke it this way: * * elvprsv "-the system went down" /tmp/elv_*.* * * This file contains only the portable parts of the preserve program. * It must #include a system-specific file. The system-specific file is * expected to define the following functions: * * char *ownername(char *filename) - returns name of person who owns file * * void mail(char *user, char *name, char *when) * - tell user that file was preserved */ #include <stdio.h> #include "config.h" #include "vi.h" #if AMIGA BLK tmpblk; #error AMIGA here DEBUG # include "amiwild.c" # include "amiprsv.c" #endif #if OSK # undef sprintf #endif #if ANY_UNIX || OSK # include "prsvunix.c" #endif #if MSDOS || TOS # include "prsvdos.c" # define WILDCARD_NO_MAIN # include "wildcard.c" #endif BLK buf; BLK hdr; BLK name; int rewrite_now; /* boolean: should we send text directly to orig file? */ /* This function preserves a single file, and announces its success/failure * via an e-mail message. */ void preserve(tname, when) char *tname; /* name of a temp file to be preserved */ char *when; /* description of when the editor died */ { int infd; /* fd used for reading from the temp file */ FILE *outfp; /* fp used for writing to the recovery file */ FILE *index; /* fp used for appending to index file */ char outname[100]; /* the name of the recovery file */ char *user; /* name of the owner of the temp file */ #if AMIGA char *prsvdir; #endif int i; /* open the temp file */ infd = open(tname, O_RDONLY|O_BINARY); if (infd < 0) { /* if we can't open the file, then we should assume that * the filename contains wildcard characters that weren't * expanded... and also assume that they weren't expanded * because there are no files that need to be preserved. * THEREFORE... we should silently ignore it. * (Or loudly ignore it if the user was using -R) */ if (rewrite_now) { perror(tname); } return; } /* read the header and name from the file */ if (read(infd, hdr.c, BLKSIZE) != BLKSIZE || read(infd, name.c, BLKSIZE) != BLKSIZE) { /* something wrong with the file - sorry */ fprintf(stderr, "%s: trucated header blocks\n", tname); close(infd); return; } /* If the filename block contains an empty string, then Elvis was * only keeping the temp file around because it contained some text * that was needed for a named cut buffer. The user doesn't care * about that kind of temp file, so we should silently delete it. */ if (name.c[0] == '\0' && name.c[1] == '\177') { close(infd); unlink(tname); return; } if (rewrite_now) { /* we don't need to open the index file */ index = (FILE *)0; /* make sure we can read every block! */ for (i = 1; i < MAXBLKS && hdr.n[i]; i++) { lseek(infd, (long)hdr.n[i] * (long)BLKSIZE, 0); if (read(infd, buf.c, BLKSIZE) != BLKSIZE) { /* messed up header */ fprintf(stderr, "%s: unrecoverable -- header trashed\n", name.c); close(infd); return; } } /* open the user's file for writing */ outfp = fopen(name.c, "w"); if (!outfp) { perror(name.c); close(infd); return; } } else { /* open/create the index file */ index = fopen(PRSVINDEX, "a"); if (!index) { perror(PRSVINDEX); exit(1); } /* create the recovery file in the PRESVDIR directory */ #if AMIGA prsvdir = &PRSVDIR[strlen(PRSVDIR) - 1]; if (*prsvdir == '/' || *prsvdir == ':') { sprintf(outname, "%sp%ld", PRSVDIR, ftell(index)); } else #endif sprintf(outname, "%s%cp%ld", PRSVDIR, SLASH, ftell(index)); outfp = fopen(outname, "w"); if (!outfp) { perror(outname); close(infd); fclose(index); return; } } /* write the text of the file out to the recovery file */ for (i = 1; i < MAXBLKS && hdr.n[i]; i++) { lseek(infd, (long)hdr.n[i] * (long)BLKSIZE, 0); if (read(infd, buf.c, BLKSIZE) != BLKSIZE) { /* messed up header */ fprintf(stderr, "%s: unrecoverable -- header trashed\n", name.c); fclose(outfp); close(infd); if (index) { fclose(index); } unlink(outname); return; } fputs(buf.c, outfp); } /* add a line to the index file */ if (index) { fprintf(index, "%s %s\n", outname, name.c); } /* close everything */ close(infd); fclose(outfp); if (index) { fclose(index); } /* Are we doing this due to something more frightening than just * a ":preserve" command? */ if (*when) { /* send a mail message */ mail(ownername(tname), name.c, when); /* remove the temp file -- the editor has died already */ unlink(tname); } } main(argc, argv) int argc; char **argv; { int i; char *when = "the editor went away"; #if MSDOS || TOS /* expand any wildcards in the command line */ argv = wildexpand(&argc, argv); #endif /* do we have a "when" argument? */ i = 1; if (argc >= i + 1 && !strcmp(argv[i], "-R")) { rewrite_now = 1; when = ""; i++; #if ANY_UNIX setuid(geteuid()); #endif } #if OSK else { setuid(0); } #endif if (argc >= i + 1 && argv[i][0] == '-') { when = argv[i] + 1; i++; } /* preserve everything we're supposed to */ while (i < argc) { preserve(argv[i], when); i++; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* elvrec.c */ /* This file contains the file recovery program */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ #include <stdio.h> #include "config.h" #include "vi.h" #include <sys/stat.h> void recover(basename, outname) char *basename; /* the name of the file to recover */ char *outname; /* the name of the file to write to */ { char pathname[500]; /* full pathname of the file to recover */ char line[600]; /* a line from the /usr/preserve/Index file */ int ch; /* a character from the text being recovered */ FILE *from; /* the /usr/preserve file, or /usr/preserve/Index */ FILE *to; /* the user's text file */ char *ptr; struct stat st; #if OSK int uid; #endif /* convert basename to a full pathname */ if (basename) { #ifndef CRUNCH # if MSDOS || TOS if (!basename[0] || basename[1] != ':') # else if (basename[0] != SLASH) # endif { ptr = getcwd(pathname, sizeof pathname); if (ptr != pathname) { strcpy(pathname, ptr); } ptr = pathname + strlen(pathname); *ptr++ = SLASH; strcpy(ptr, basename); } else #endif { strcpy(pathname, basename); } } #if OSK uid = getuid(); if(setuid(0)) exit(_errmsg(errno, "Can't set uid\n")); #endif /* scan the /usr/preserve/Index file, for the *oldest* unrecovered * version of this file. */ from = fopen(PRSVINDEX, "r"); while (from && fgets(line, sizeof line, from)) { /* strip off the newline from the end of the string */ line[strlen(line) - 1] = '\0'; /* parse the line into a "preserve" name and a "text" name */ for (ptr = line; *ptr != ' '; ptr++) { } *ptr++ = '\0'; /* If the "preserve" file is missing, then ignore this line * because it describes a file that has already been recovered. */ if (stat(line, &st) < 0) { continue; } /* are we looking for a specific file? */ if (basename) { /* quit if we found it */ if (!strcmp(ptr, pathname)) { break; } } else { /* list this file as "available for recovery" */ puts(ptr); } } /* file not found? */ if (!basename || !from || feof(from)) { if (from != NULL) fclose(from); if (basename) { fprintf(stderr, "%s: no recovered file has that exact name\n", pathname); } return; } if (from != NULL) fclose(from); /* copy the recovered text back into the user's file... */ /* open the /usr/preserve file for reading */ from = fopen(line, "r"); if (!from) { perror(line); exit(2); } #if ANY_UNIX /* Be careful about user-id. We want to be running under the user's * real id when we open/create the user's text file... but we want * to be superuser when we delete the /usr/preserve file. For UNIX, * we accomplish this by deleting the /usr/preserve file *now*, * when it is open but before we've read it. Then we revert to the * user's real id. */ unlink(line); setuid(getuid()); #endif #if OSK setuid(uid); #endif if (outname == NULL) return; /* open the user's file for writing */ to = fopen(outname, "w"); if (!to) { perror(ptr); exit(2); } /* copy the text */ while ((ch = getc(from)) != EOF) { putc(ch, to); } #if !ANY_UNIX #if OSK fclose(from); setuid(0); #endif /* delete the /usr/preserve file */ unlink(line); #if OSK setuid(uid); #endif #endif } main(argc, argv) int argc; char **argv; { /* check arguments */ if (argc > 3) { fprintf(stderr, "usage: %s [preserved_file [recovery_file]]\n", argv[0]); exit(1); } /* recover the requested file, or list recoverable files */ if (argc == 3) { /* recover the file, but write it to a different filename */ recover (argv[1], argv[2]); } else if (argc == 2) { /* recover the file */ recover(argv[1], argv[1]); } else { /* list the recoverable files */ recover((char *)0, (char *)0); } /* success! */ exit(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ex.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the code for reading ex commands. */ #include "config.h" #include "ctype.h" #include "vi.h" /* This data type is used to describe the possible argument combinations */ typedef short ARGT; #define FROM 1 /* allow a linespec */ #define TO 2 /* allow a second linespec */ #define BANG 4 /* allow a ! after the command name */ #define EXTRA 8 /* allow extra args after command name */ #define XFILE 16 /* expand wildcards in extra part */ #define NOSPC 32 /* no spaces allowed in the extra part */ #define DFLALL 64 /* default file range is 1,$ */ #define DFLNONE 128 /* no default file range */ #define NODFL 256 /* do not default to the current file name */ #define EXRCOK 512 /* can be in a .exrc file */ #define NL 1024 /* if mode!=MODE_EX, then write a newline first */ #define PLUS 2048 /* allow a line number, as in ":e +32 foo" */ #define ZERO 4096 /* allow 0 to be given as a line number */ #define NOBAR 8192 /* treat following '|' chars as normal */ #define FILES (XFILE + EXTRA) /* multiple extra files allowed */ #define WORD1 (EXTRA + NOSPC) /* one extra word allowed */ #define FILE1 (FILES + NOSPC) /* 1 file allowed, defaults to current file */ #define NAMEDF (FILE1 + NODFL) /* 1 file allowed, defaults to "" */ #define NAMEDFS (FILES + NODFL) /* multiple files allowed, default is "" */ #define RANGE (FROM + TO) /* range of linespecs allowed */ #define NONE 0 /* no args allowed at all */ /* This array maps ex command names to command codes. The order in which * command names are listed below is significant -- ambiguous abbreviations * are always resolved to be the first possible match. (e.g. "r" is taken * to mean "read", not "rewind", because "read" comes before "rewind") */ static struct { char *name; /* name of the command */ CMD code; /* enum code of the command */ void (*fn)();/* function which executes the command */ ARGT argt; /* command line arguments permitted/needed/used */ } cmdnames[] = { /* cmd name cmd code function arguments */ {"append", CMD_APPEND, cmd_append, FROM+ZERO+BANG }, #ifdef DEBUG {"bug", CMD_DEBUG, cmd_debug, RANGE+BANG+EXTRA+NL}, #endif {"change", CMD_CHANGE, cmd_append, RANGE+BANG }, {"delete", CMD_DELETE, cmd_delete, RANGE+WORD1 }, {"edit", CMD_EDIT, cmd_edit, BANG+FILE1+PLUS }, {"file", CMD_FILE, cmd_file, NAMEDF }, {"global", CMD_GLOBAL, cmd_global, RANGE+BANG+EXTRA+DFLALL+NOBAR}, {"insert", CMD_INSERT, cmd_append, FROM+BANG }, {"join", CMD_INSERT, cmd_join, RANGE+BANG }, {"k", CMD_MARK, cmd_mark, FROM+WORD1 }, {"list", CMD_LIST, cmd_print, RANGE+NL }, {"move", CMD_MOVE, cmd_move, RANGE+EXTRA }, {"next", CMD_NEXT, cmd_next, BANG+NAMEDFS }, {"Next", CMD_PREVIOUS, cmd_next, BANG }, {"print", CMD_PRINT, cmd_print, RANGE+NL }, {"quit", CMD_QUIT, cmd_xit, BANG }, {"read", CMD_READ, cmd_read, FROM+ZERO+NAMEDF}, {"substitute", CMD_SUBSTITUTE, cmd_substitute, RANGE+EXTRA }, {"to", CMD_COPY, cmd_move, RANGE+EXTRA }, {"undo", CMD_UNDO, cmd_undo, NONE }, {"vglobal", CMD_VGLOBAL, cmd_global, RANGE+EXTRA+DFLALL+NOBAR}, {"write", CMD_WRITE, cmd_write, RANGE+BANG+FILE1+DFLALL}, {"xit", CMD_XIT, cmd_xit, BANG+NL }, {"yank", CMD_YANK, cmd_delete, RANGE+WORD1 }, {"!", CMD_BANG, cmd_shell, EXRCOK+RANGE+NAMEDFS+DFLNONE+NL+NOBAR}, {"#", CMD_NUMBER, cmd_print, RANGE+NL }, {"<", CMD_SHIFTL, cmd_shift, RANGE }, {">", CMD_SHIFTR, cmd_shift, RANGE }, {"=", CMD_EQUAL, cmd_file, RANGE }, {"&", CMD_SUBAGAIN, cmd_substitute, RANGE }, #ifndef NO_AT {"@", CMD_AT, cmd_at, EXTRA }, #endif #ifndef NO_ABBR {"abbreviate", CMD_ABBR, cmd_map, EXRCOK+BANG+EXTRA}, #endif {"args", CMD_ARGS, cmd_args, EXRCOK+NAMEDFS }, #ifndef NO_ERRLIST {"cc", CMD_CC, cmd_make, BANG+FILES }, #endif {"cd", CMD_CD, cmd_cd, EXRCOK+BANG+NAMEDF}, {"copy", CMD_COPY, cmd_move, RANGE+EXTRA }, #ifndef NO_DIGRAPH {"digraph", CMD_DIGRAPH, cmd_digraph, EXRCOK+BANG+EXTRA}, #endif #ifndef NO_ERRLIST {"errlist", CMD_ERRLIST, cmd_errlist, BANG+NAMEDF }, #endif {"ex", CMD_EDIT, cmd_edit, BANG+FILE1 }, {"mark", CMD_MARK, cmd_mark, FROM+WORD1 }, #ifndef NO_MKEXRC {"mkexrc", CMD_MKEXRC, cmd_mkexrc, NAMEDF }, #endif {"number", CMD_NUMBER, cmd_print, RANGE+NL }, {"put", CMD_PUT, cmd_put, FROM+ZERO+WORD1 }, {"set", CMD_SET, cmd_set, EXRCOK+EXTRA }, {"shell", CMD_SHELL, cmd_shell, NL }, {"source", CMD_SOURCE, cmd_source, EXRCOK+NAMEDF }, #ifdef SIGTSTP {"stop", CMD_STOP, cmd_suspend, NONE }, #endif {"tag", CMD_TAG, cmd_tag, BANG+WORD1 }, {"version", CMD_VERSION, cmd_version, EXRCOK+NONE }, {"visual", CMD_VISUAL, cmd_edit, BANG+NAMEDF }, {"wq", CMD_WQUIT, cmd_xit, NL }, #ifdef DEBUG {"debug", CMD_DEBUG, cmd_debug, RANGE+BANG+EXTRA+NL}, {"validate", CMD_VALIDATE, cmd_validate, BANG+NL }, #endif {"chdir", CMD_CD, cmd_cd, EXRCOK+BANG+NAMEDF}, #ifndef NO_COLOR {"color", CMD_COLOR, cmd_color, EXRCOK+EXTRA }, #endif #ifndef NO_ERRLIST {"make", CMD_MAKE, cmd_make, BANG+NAMEDFS }, #endif {"map", CMD_MAP, cmd_map, EXRCOK+BANG+EXTRA}, {"previous", CMD_PREVIOUS, cmd_next, BANG }, {"rewind", CMD_REWIND, cmd_next, BANG }, #ifdef SIGTSTP {"suspend", CMD_SUSPEND, cmd_suspend, NONE }, #endif {"unmap", CMD_UNMAP, cmd_map, EXRCOK+BANG+EXTRA}, #ifndef NO_ABBR {"unabbreviate",CMD_UNABBR, cmd_map, EXRCOK+WORD1 }, #endif {(char *)0} }; /* This function parses a search pattern - given a pointer to a / or ?, * it replaces the ending / or ? with a \0, and returns a pointer to the * stuff that came after the pattern. */ char *parseptrn(ptrn) REG char *ptrn; { REG char *scan; for (scan = ptrn + 1; *scan && *scan != *ptrn; scan++) { /* allow backslashed versions of / and ? in the pattern */ if (*scan == '\\' && scan[1] != '\0') { scan++; } } if (*scan) { *scan++ = '\0'; } return scan; } /* This function parses a line specifier for ex commands */ char *linespec(s, markptr) REG char *s; /* start of the line specifier */ MARK *markptr; /* where to store the mark's value */ { long num; REG char *t; /* parse each ;-delimited clause of this linespec */ do { /* skip an initial ';', if any */ if (*s == ';') { s++; } /* skip leading spaces */ while (isspace(*s)) { s++; } /* dot means current position */ if (*s == '.') { s++; *markptr = cursor; } /* '$' means the last line */ else if (*s == '$') { s++; *markptr = MARK_LAST; } /* digit means an absolute line number */ else if (isdigit(*s)) { for (num = 0; isdigit(*s); s++) { num = num * 10 + *s - '0'; } *markptr = MARK_AT_LINE(num); } /* appostrophe means go to a set mark */ else if (*s == '\'') { s++; *markptr = m_tomark(cursor, 1L, (int)*s); s++; } /* slash means do a search */ else if (*s == '/' || *s == '?') { /* put a '\0' at the end of the search pattern */ t = parseptrn(s); /* search for the pattern */ *markptr &= ~(BLKSIZE - 1); if (*s == '/') { pfetch(markline(*markptr)); if (plen > 0) *markptr += plen - 1; *markptr = m_fsrch(*markptr, s); } else { *markptr = m_bsrch(*markptr, s); } /* adjust command string pointer */ s = t; } /* if linespec was faulty, quit now */ if (!*markptr) { return s; } /* maybe add an offset */ t = s; if (*t == '-' || *t == '+') { s++; for (num = 0; isdigit(*s); s++) { num = num * 10 + *s - '0'; } if (num == 0) { num = 1; } *markptr = m_updnto(*markptr, num, *t); } } while (*s == ';' || *s == '+' || *s == '-'); /* protect against invalid line numbers */ num = markline(*markptr); if (num < 1L || num > nlines) { msg("Invalid line number -- must be from 1 to %ld", nlines); *markptr = MARK_UNSET; } return s; } /* This function reads an ex command and executes it. */ void ex() { char cmdbuf[150]; REG int cmdlen; static long oldline; significant = FALSE; oldline = markline(cursor); while (mode == MODE_EX) { /* read a line */ #ifdef CRUNCH cmdlen = vgets(':', cmdbuf, sizeof(cmdbufjA��lA��mA��nA��oA��pA��qA��rA��sA������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)); #else cmdlen = vgets(*o_prompt ? ':' : '\0', cmdbuf, sizeof(cmdbuf)); #endif if (cmdlen < 0) { return; } /* if empty line, assume ".+1" */ if (cmdlen == 0) { strcpy(cmdbuf, ".+1"); qaddch('\r'); clrtoeol(); } else { addch('\n'); } refresh(); /* parse & execute the command */ doexcmd(cmdbuf); /* handle autoprint */ if (significant || markline(cursor) != oldline) { significant = FALSE; oldline = markline(cursor); if (*o_autoprint && mode == MODE_EX) { cmd_print(cursor, cursor, CMD_PRINT, FALSE, ""); } } } } void doexcmd(cmdbuf) char *cmdbuf; /* string containing an ex command */ { REG char *scan; /* used to scan thru cmdbuf */ MARK frommark; /* first linespec */ MARK tomark; /* second linespec */ REG int cmdlen; /* length of the command name given */ CMD cmd; /* what command is this? */ ARGT argt; /* argument types for this command */ short forceit; /* bang version of a command? */ REG int cmdidx; /* index of command */ REG char *build; /* used while copying filenames */ int iswild; /* boolean: filenames use wildcards? */ int isdfl; /* using default line ranges? */ int didsub; /* did we substitute file names for % or # */ /* ex commands can't be undone via the shift-U command */ U_line = 0L; /* permit extra colons at the start of the line */ for (; *cmdbuf == ':'; cmdbuf++) { } /* ignore command lines that start with a double-quote */ if (*cmdbuf == '"') { return; } scan = cmdbuf; /* parse the line specifier */ if (nlines < 1) { /* no file, so don't allow addresses */ } else if (*scan == '%') { /* '%' means all lines */ frommark = MARK_FIRST; tomark = MARK_LAST; scan++; } else if (*scan == '0') { frommark = tomark = MARK_UNSET; scan++; } else { frommark = cursor; scan = linespec(scan, &frommark); tomark = frommark; if (frommark && *scan == ',') { scan++; scan = linespec(scan, &tomark); } if (!tomark) { /* faulty line spec -- fault already described */ return; } if (frommark > tomark) { msg("first address exceeds the second"); return; } } isdfl = (scan == cmdbuf); /* skip whitespace */ while (isspace(*scan)) { scan++; } /* if no command, then just move the cursor to the mark */ if (!*scan) { if (tomark != MARK_UNSET) cursor = tomark; return; } /* figure out how long the command name is */ if (!isalpha(*scan)) { cmdlen = 1; } else { for (cmdlen = 1; isalpha(scan[cmdlen]); cmdlen++) { } } /* lookup the command code */ for (cmdidx = 0; cmdnames[cmdidx].name && strncmp(scan, cmdnames[cmdidx].name, cmdlen); cmdidx++) { } argt = cmdnames[cmdidx].argt; cmd = cmdnames[cmdidx].code; if (cmd == CMD_NULL) { msg("Unknown command \"%.*s\"", cmdlen, scan); return; } /* !!! if the command doesn't have NOBAR set, then replace | with \0 */ /* if the command ended with a bang, set the forceit flag */ scan += cmdlen; if ((argt & BANG) && *scan == '!') { scan++; forceit = 1; } else { forceit = 0; } /* skip any more whitespace, to leave scan pointing to arguments */ while (isspace(*scan)) { scan++; } /* a couple of special cases for filenames */ if (argt & XFILE) { /* if names were given, process them */ if (*scan) { for (build = tmpblk.c, iswild = didsub = FALSE; *scan; scan++) { switch (*scan) { case '\\': if (scan[1] == '\\' || scan[1] == '%' || scan[1] == '#') { *build++ = *++scan; } else { *build++ = '\\'; } break; case '%': if (!*origname) { msg("No filename to substitute for %%"); return; } strcpy(build, origname); while (*build) { build++; } didsub = TRUE; break; case '#': if (!*prevorig) { msg("No filename to substitute for #"); return; } strcpy(build, prevorig); while (*build) { build++; } didsub = TRUE; break; case '*': case '?': #if !(MSDOS || TOS) case '[': case '`': case '{': /* } */ case '$': case '~': #endif *build++ = *scan; iswild = TRUE; break; default: *build++ = *scan; } } *build = '\0'; if (cmd == CMD_BANG || cmd == CMD_READ && tmpblk.c[0] == '!' || cmd == CMD_WRITE && tmpblk.c[0] == '!') { if (didsub) { if (mode != MODE_EX) { addch('\n'); } addstr(tmpblk.c); addch('\n'); exrefresh(); } } else { if (iswild && tmpblk.c[0] != '>') { scan = wildcard(tmpblk.c); } } } else /* no names given, maybe assume origname */ { if (!(argt & NODFL)) { strcpy(tmpblk.c, origname); } else { *tmpblk.c = '\0'; } } scan = tmpblk.c; } /* bad arguments? */ if (!(argt & EXRCOK) && nlines < 1L) { msg("Can't use the \"%s\" command in a %s file", cmdnames[cmdidx].name, EXRC); return; } if (!(argt & (ZERO | EXRCOK)) && frommark == MARK_UNSET) { msg("Can't use address 0 with \"%s\" command.", cmdnames[cmdidx].name); return; } if (!(argt & FROM) && frommark != cursor && nlines >= 1L) { msg("Can't use address with \"%s\" command.", cmdnames[cmdidx].name); return; } if (!(argt & TO) && tomark != frommark && nlines >= 1L) { msg("Can't use a range with \"%s\" command.", cmdnames[cmdidx].name); return; } if (!(argt & EXTRA) && *scan) { msg("Extra characters after \"%s\" command.", cmdnames[cmdidx].name); return; } if ((argt & NOSPC) && !(cmd == CMD_READ && (forceit || *scan == '!'))) { build = scan; #ifndef CRUNCH if ((argt & PLUS) && *build == '+') { while (*build && !isspace(*build)) { build++; } while (*build && isspace(*build)) { build++; } } #endif /* not CRUNCH */ for (; *build; build++) { if (isspace(*build)) { msg("Too many %s to \"%s\" command.", (argt & XFILE) ? "filenames" : "arguments", cmdnames[cmdidx].name); return; } } } /* some commands have special default ranges */ if (isdfl && (argt & DFLALL)) { frommark = MARK_FIRST; tomark = MARK_LAST; } else if (isdfl && (argt & DFLNONE)) { frommark = tomark = 0L; } /* write a newline if called from visual mode */ if ((argt & NL) && mode != MODE_EX && !exwrote) { addch('\n'); exrefresh(); } /* act on the command */ (*cmdnames[cmdidx].fn)(frommark, tomark, cmd, forceit, scan); } /* This function executes EX commands from a file. It returns 1 normally, or * 0 if the file could not be opened for reading. */ int doexrc(filename) char *filename; /* name of a ".exrc" file */ { int fd; /* file descriptor */ int len; /* length of the ".exrc" file */ /* !!! kludge: we use U_text as the buffer. This has the side-effect * of interfering with the shift-U visual command. Disable shift-U. */ U_line = 0L; /* open the file, read it, and close */ fd = open(filename, O_RDONLY); if (fd < 0) { return 0; } len = tread(fd, U_text, BLKSIZE); close(fd); /* execute the string */ exstring(U_text, len, ctrl('V')); return 1; } /* This function executes EX commands from a string. The commands may be * separated by newlines or by | characters. It also handles quoting. * Each individual command is limited to 132 bytes, but the total string * may be longer. */ void exstring(buf, len, qchar) char *buf; /* the commands to execute */ int len; /* the length of the string */ int qchar; /* the quote character -- ^V for file, or \ for kbd */ { char single[133]; /* a single command */ char *src, *dest; int i; /* find & do each command */ for (src = buf; src < &buf[len]; src++) { /* Copy a single command into single[]. Convert any quoted | * into a normal |, and stop at a newline or unquoted |. */ for (dest = single, i = 0; i < 132 && src < &buf[len] && *src != '\n' && *src != '|'; src++, i++) { if (src[0] == qchar && src[1] == '|') { src++; } *dest++ = *src; } *dest = '\0'; /* do it */ doexcmd(single); } } �������/* fmt.c */ /* usage: fmt [-width] [files]... * * Fmt rearrages text in order to make each line have roughly the * same width. Indentation and word spacing is preserved. * * The default width is 72 characters, but you can override that via -width. * If no files are given on the command line, then it reads stdin. */ #include <stdio.h> #ifndef TRUE # define TRUE 1 # define FALSE 0 #endif int width = 72; /* the desired line width */ int isblank; /* is the current output line blank? */ int indent; /* width of the indentation */ char ind[512]; /* indentation text */ char word[1024]; /* word buffer */ /* This function displays a usage message and quits */ void usage() { fprintf(stderr, "usage: fmt [-width] [files]...\n"); exit(2); } /* This function outputs a single word. It takes care of spacing and the * newlines within a paragraph. */ void putword() { int i; /* index into word[], or whatever */ int ww; /* width of the word */ int sw; /* width of spacing after word */ static int psw; /* space width of previous word */ static int tab; /* the width of text already written */ /* separate the word and its spacing */ for (ww = 0; word[ww] && word[ww] != ' '; ww++) { } sw = strlen(word) - ww; word[ww] = '\0'; /* if no spacing (that is, the word was at the end of the line) then * assume 1 space unless the last char of the word was punctuation */ if (sw == 0) { sw = 1; if (word[ww - 1] == '.' || word[ww - 1] == '?' || word[ww - 1] == '!') sw = 2; } /* if this is the first word on the line... */ if (isblank) { /* output the indentation first */ fputs(ind, stdout); tab = indent; } else /* text has already been written to this output line */ { /* will the word fit on this line? */ if (psw + ww + tab <= width) { /* yes - so write the previous word's spacing */ for (i = 0; i < psw; i++) { putchar(' '); } tab += psw; } else { /* no, so write a newline and the indentation */ putchar('\n'); fputs(ind, stdout); tab = indent; } } /* write the word itself */ fputs(word, stdout); tab += ww; /* remember this word's spacing */ psw = sw; /* this output line isn't blank anymore. */ isblank = FALSE; } /* This function reformats text. */ void fmt(in) FILE *in; /* the name of the input stream */ { int ch; /* character from input stream */ int prevch; /* the previous character in the loop */ int i; /* index into ind[] or word[] */ int inword; /* boolean: are we between indent & newline? */ /* for each character in the stream... */ for (indent = -1, isblank = TRUE, inword = FALSE, i = 0, prevch = '\n'; (ch = getc(in)) != EOF; prevch = ch) { /* is this the end of a line? */ if (ch == '\n') { /* if end of last word in the input line */ if (inword) { /* if it really is a word */ if (i > 0) { /* output it */ word[i] = '\0'; putword(); } } else /* blank line in input */ { /* finish the previous paragraph */ if (!isblank) { putchar('\n'); isblank = TRUE; } /* output a blank line */ putchar('\n'); } /* continue with next input line... */ indent = -1; i = 0; inword = FALSE; continue; } /* if we're expecting indentation now... */ if (indent < 0) { /* if this is part of the indentation... */ if (ch == ' ' || ch == '\t') { /* remember it */ ind[i++] = ch; } else /* end of indentation */ { /* mark the end of the indentation string */ ind[i] = '\0'; /* calculate the width of the indentation */ for (i = indent = 0; ind[i]; i++) { if (ind[i] == '\t') indent = (indent | 7) + 1; else indent++; } /* reset the word index */ i = 0; /* reprocess that last character */ ungetc(ch, in); } /* continue in the for-loop */ continue; } /* if we get here, we're either in a word or in the space * after a word. */ inword = TRUE; /* is this the start of a new word? */ if (ch != ' ' && prevch == ' ') { /* yes! output the previous word */ word[i] = '\0'; putword(); /* reset `i' to the start of the word[] buffer */ i = 0; } word[i++] = ch; } /* if necessary, write a final newline */ if (!isblank) { putchar('\n'); isblank = TRUE; } } int main(argc, argv) int argc; char **argv; { FILE *in; /* an input stream */ int error; /* if non-zero, then an error occurred */ int i; /* handle the -width flag, if given */ if (argc > 1 && argv[1][0] == '-') { width = atoi(argv[1] + 1); if (width <= 0) { usage(); } argc--; argv++; } /* if no filenames given, then process stdin */ if (argc == 1) { fmt(stdin); } else /* one or more filenames given */ { for (error = 0, i = 1; i < argc; i++) { in = fopen(argv[i], "r"); if (!in) { perror(argv[i]); error = 3; } else { fmt(in); fclose(in); } } } /* exit, possibly indicating an error */ exit(error); /*NOTREACHED*/ } ��������������������������������������������/* input.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the input() function, which implements vi's INPUT mode. * It also contains the code that supports digraphs. */ #include "config.h" #include "ctype.h" #include "vi.h" #ifndef NO_DIGRAPH static struct _DIG { struct _DIG *next; char key1; char key2; char dig; char save; } *digs; char digraph(key1, key2) char key1; /* the underlying character */ char key2; /* the second character */ { int newkey; REG struct _DIG *dp; /* if digraphs are disabled, then just return the new char */ if (!*o_digraph) { return key2; } /* remember the new key, so we can return it if this isn't a digraph */ newkey = key2; /* sort key1 and key2, so that their original order won't matter */ if (key1 > key2) { key2 = key1; key1 = newkey; } /* scan through the digraph chart */ for (dp = digs; dp && (dp->key1 != key1 || dp->key2 != key2); dp = dp->next) { } /* if this combination isn't in there, just use the new key */ if (!dp) { return newkey; } /* else use the digraph key */ return dp->dig; } /* this function lists or defines digraphs */ void do_digraph(bang, extra) int bang; char extra[]; { int dig; REG struct _DIG *dp; struct _DIG *prev; static int user_defined = FALSE; /* boolean: are all later digraphs user-defined? */ char listbuf[8]; /* if "extra" is NULL, then we've reached the end of the built-ins */ if (!extra) { user_defined = TRUE; return; } /* if no args, then display the existing digraphs */ if (*extra < ' ') { listbuf[0] = listbuf[1] = listbuf[2] = listbuf[5] = ' '; listbuf[7] = '\0'; for (dig = 0, dp = digs; dp; dp = dp->next) { if (dp->save || bang) { dig += 7; if (dig >= COLS) { addch('\n'); exrefresh(); dig = 7; } listbuf[3] = dp->key1; listbuf[4] = dp->key2; listbuf[6] = dp->dig; qaddstr(listbuf); } } addch('\n'); exrefresh(); return; } /* make sure we have at least two characters */ if (!extra[1]) { msg("Digraphs must be composed of two characters"); return; } /* sort key1 and key2, so that their original order won't matter */ if (extra[0] > extra[1]) { dig = extra[0]; extra[0] = extra[1]; extra[1] = dig; } /* locate the new digraph character */ for (dig = 2; extra[dig] == ' ' || extra[dig] == '\t'; dig++) { } dig = extra[dig]; if (!bang && dig) { dig |= 0x80; } /* search for the digraph */ for (prev = (struct _DIG *)0, dp = digs; dp && (dp->key1 != extra[0] || dp->key2 != extra[1]); prev = dp, dp = dp->next) { } /* deleting the digraph? */ if (!dig) { if (!dp) { #ifndef CRUNCH msg("%c%c not a digraph", extra[0], extra[1]); #endif return; } if (prev) prev->next = dp->next; else digs = dp->next; free(dp); return; } /* if necessary, create a new digraph struct for the new digraph */ if (dig && !dp) { dp = (struct _DIG *)malloc(sizeof *dp); if (!dp) { msg("Out of space in the digraph table"); return; } if (prev) prev->next = dp; else digs = dp; dp->next = (struct _DIG *)0; } /* assign it the new digraph value */ dp->key1 = extra[0]; dp->key2 = extra[1]; dp->dig = dig; dp->save = user_defined; } # ifndef NO_MKEXRC void savedigs(fd) int fd; { static char buf[] = "digraph! XX Y\n"; REG struct _DIG *dp; for (dp = digs; dp; dp = dp->next) { if (dp->save) { buf[9] = dp->key1; buf[10] = dp->key2; buf[12] = dp->dig; write(fd, buf, (unsigned)14); } } } # endif #endif /* This function allows the user to replace an existing (possibly zero-length) * chunk of text with typed-in text. It returns the MARK of the last character * that the user typed in. */ MARK input(from, to, when, above) MARK from; /* where to start inserting text */ MARK to; /* extent of text to delete */ int when; /* either WHEN_VIINP or WHEN_VIREP */ int above; /* boolean: take indentation from lower line? */ { char key[2]; /* key char followed by '\0' char */ char *build; /* used in building a newline+indent string */ char *scan; /* used while looking at the indent chars of a line */ MARK m; /* some place in the text */ #ifndef NO_EXTENSIONS int quit = FALSE; /* boolean: are we exiting after this? */ int inchg; /* boolean: have we done a "beforedo()" yet? */ #endif #ifdef DEBUG /* if "from" and "to" are reversed, complain */ if (from > to) { msg("ERROR: input(%ld:%d, %ld:%d)", markline(from), markidx(from), markline(to), markidx(to)); return MARK_UNSET; } #endif key[1] = 0; /* if we're replacing text with new text, save the old stuff */ /* (Alas, there is no easy way to save text for replace mode) */ if (from != to) { cut(from, to); } /* if doing a dot command, then reuse the previous text */ if (doingdot) { ChangeText { /* delete the text that's there now */ if (from != to) { delete(from, to); } /* insert the previous text */ cutname('.'); cursor = paste(from, FALSE, TRUE) + 1L; } } else /* interactive version */ { /* assume that whoever called this already did a beforedo() */ #ifndef NO_EXTENSIONS inchg = TRUE; #endif /* if doing a change within the line... */ if (from != to && markline(from) == markline(to)) { /* mark the end of the text with a "$" */ change(to - 1, to, "$"); } else { /* delete the old text right off */ if (from != to) { delete(from, to); } to = from; } /* handle autoindent of the first line, maybe */ cursor = from; m = (above ? (cursor + BLKSIZE) : (cursor - BLKSIZE)); if (*o_autoindent && markidx(m) == 0 && markline(m) >= 1L && markline(m) <= nlines) { /* Only autoindent blank lines. */ pfetch(markline(cursor)); if (plen == 0) { /* Okay, we really want to autoindent */ pfetch(markline(m)); for (scan = ptext, build = tmpblk.c; *scan == ' ' || *scan == '\t'; ) { *build++ = *scan++; } if (build > tmpblk.c) { *build = '\0'; add(cursor, tmpblk.c); cursor += (build - tmpblk.c); if (cursor > to) to = cursor; } } } /* repeatedly add characters from the user */ for (;;) { /* Get a character */ redraw(cursor, TRUE); #ifdef DEBUG2 msg("cursor=%ld.%d, to=%ld.%d", markline(cursor), markidx(cursor), markline(to), markidx(to)); #endif #ifndef NO_ABBR pfetch(markline(cursor)); build = ptext; if (pline == markline(from)) build += markidx(from); for (scan = ptext + markidx(cursor); --scan >= build && isalnum(*scan); ) { } scan++; key[0] = getabkey(when, scan, (int)(ptext + markidx(cursor) - scan)); #else key[0] = getkey(when); #endif #ifndef NO_VISIBLE if (key[0] != '\0' && V_from != MARK_UNSET) { msg("Can't modify text during a selection"); beep(); continue; } #endif #ifndef NO_EXTENSIONS if (key[0] == ctrl('O')) { if (inchg) { if (cursor < to) { delete(cursor, to); redraw(cursor, TRUE); } afterdo(); inchg = FALSE; } } else if (key[0] != ctrl('[')) { if (!inchg) { beforedo(FALSE); inchg = TRUE; } } #endif #ifndef CRUNCH /* if wrapmargin is set & we're past the * warpmargin, then change the last whitespace * characters on line into a newline */ if (*o_wrapmargin != 0) { pfetch(markline(cursor)); if (idx2col(cursor, ptext, TRUE) > COLS - (*o_wrapmargin & 0xff)) { build = tmpblk.c; *build++ = '\n'; if (*o_autoindent) { /* figure out indent for next line */ for (scan = ptext; *scan == ' ' || *scan == '\t'; ) { *build++ = *scan++; } } *build = '\0'; scan = ptext + plen; m = cursor & ~(BLKSIZE - 1); while (ptext < scan) { scan--; if (*scan != ' ' && *scan != '\t') continue; /*break up line, and we do autoindent if needed*/ change(m + (scan - ptext), m + (scan - ptext) + 1, tmpblk.c); cursor = (cursor & ~(BLKSA��A��A��A��A��A��A��A��A��A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IZE - 1)) + BLKSIZE + strlen(tmpblk.c) - 1 + plen - (scan - ptext) - 1; /*remove trailing spaces on previous line*/ pfetch(markline(m)); scan = ptext + plen; while (ptext < scan) { scan--; if (*scan != ' ' && *scan != '\t') break; } delete(m + (scan-ptext) + 1, m + plen); break; } } } #endif /* !CRUNCH */ /* process it */ switch (*key) { #ifndef NO_EXTENSIONS case ctrl('O'): /* special movement mapped keys */ *key = getkey(0); switch (*key) { case 'h': m = m_left(cursor, 0L); break; case 'j': case 'k': m = m_updnto(cursor, 0L, *key); break; case 'l': m = cursor + 1; break; case 'B': case 'b': m = m_bword(cursor, 0L, *key); break; case 'W': case 'w': m = m_fword(cursor, 0L, *key, '\0'); break; case '^': m = m_front(cursor, 0L); break; case '$': m = m_rear(cursor, 0L); break; case ctrl('B'): case ctrl('F'): m = m_scroll(cursor, 0L, *key); break; case 'x': #ifndef NO_VISIBLE if (V_from) beep(); else #endif ChangeText { m = v_xchar(cursor, 0L, 'x'); } break; case 'i': m = to = from = cursor; when = WHEN_VIINP + WHEN_VIREP - when; break; case 'K': pfetch(markline(cursor)); changes++; /* <- after this, we can alter ptext */ ptext[markidx(cursor)] = 0; for (scan = ptext + markidx(cursor) - 1; scan >= ptext && isalnum(*scan); scan--) { } scan++; m = (*scan ? v_keyword(scan, cursor, 0L) : cursor); break; # ifndef NO_VISIBLE case 'v': case 'V': if (V_from) V_from = MARK_UNSET; else V_from = cursor; m = from = to = cursor; V_linemd = (*key == 'V'); break; case 'd': case 'y': case '\\': /* do nothing if unmarked */ if (!V_from) { msg("You must mark the text first"); beep(); break; } /* "from" must come before "to" */ if (V_from < cursor) { from = V_from; to = cursor; } else { from = cursor; to = V_from; } /* we don't need V_from anymore */ V_from = MARK_UNSET; if (V_linemd) { /* adjust for line mode */ from &= ~(BLKSIZE - 1); to |= (BLKSIZE - 1); } else { /* in character mode, we must * worry about deleting the newline * at the end of the last line */ pfetch(markline(to)); if (markidx(to) == plen) to |= (BLKSIZE - 1); } to++; switch (*key) { case 'y': cut(from, to); break; case 'd': ChangeText { cut(from, to); delete(from, to); } cursor = from; break; #ifndef NO_POPUP case '\\': ChangeText { cursor = v_popup(from, to); } break; #endif } m = from = to = cursor; break; case 'p': case 'P': V_from = MARK_UNSET; ChangeText { m = from = to = cursor = paste(cursor, (*key == 'p'), FALSE); } break; # endif /* !NO_VISIBLE */ default: m = MARK_UNSET; } /* adjust the moved cursor */ if (m != cursor) { m = adjmove(cursor, m, (*key == 'j' || *key == 'k' ? 0x20 : 0)); if (*key == '$' || (*key == 'l' && m <= cursor)) { m++; } } /* if the cursor is reasonable, use it */ if (m == MARK_UNSET) { beep(); } else { from = to = cursor = m; } break; case ctrl('Z'): if (getkey(0) == ctrl('Z')) { quit = TRUE; goto BreakBreak; } break; #endif case ctrl('['): /* if last line contains only whitespace, then remove whitespace */ if (*o_autoindent) { pfetch(markline(cursor)); for (scan = ptext; isspace(*scan); scan++) { } if (scan > ptext && !*scan) { cursor &= ~(BLKSIZE - 1L); if (to < cursor + plen) { to = cursor + plen; } } } goto BreakBreak; case ctrl('U'): if (markline(cursor) == markline(from)) { cursor = from; } else { cursor &= ~(BLKSIZE - 1); } break; case ctrl('D'): case ctrl('T'): if (to > cursor) { delete(cursor, to); } mark[27] = cursor; cmd_shift(cursor, cursor, *key == ctrl('D') ? CMD_SHIFTL : CMD_SHIFTR, TRUE, ""); if (mark[27]) { cursor = mark[27]; } else { cursor = m_front(cursor, 0L); } to = cursor; break; case '\b': if (cursor <= from) { beep(); } else if (markidx(cursor) == 0) { cursor -= BLKSIZE; pfetch(markline(cursor)); cursor += plen; } else { cursor--; } break; case ctrl('W'): m = m_bword(cursor, 1L, 'b'); if (markline(m) == markline(cursor) && m >= from) { cursor = m; if (from > cursor) { from = cursor; } } else { beep(); } break; case '\n': #if OSK case '\l': #else case '\r': #endif build = tmpblk.c; *build++ = '\n'; if (*o_autoindent) { /* figure out indent for next line */ pfetch(markline(cursor)); for (scan = ptext; *scan == ' ' || *scan == '\t'; ) { *build++ = *scan++; } /* remove indent from this line, if blank */ if ((scan - ptext) >= markidx(cursor) && plen > 0) { to = cursor &= ~(BLKSIZE - 1); delete(cursor, cursor + plen); } } *build = 0; if (cursor >= to && when != WHEN_VIREP) { add(cursor, tmpblk.c); } else { change(cursor, to, tmpblk.c); } redraw(cursor, TRUE); to = cursor = (cursor & ~(BLKSIZE - 1)) + BLKSIZE + (int)(build - tmpblk.c) - 1; break; case ctrl('A'): case ctrl('P'): if (cursor < to) { delete(cursor, to); } if (*key == ctrl('A')) { cutname('.'); } to = cursor = paste(cursor, FALSE, TRUE) + 1L; break; case ctrl('V'): if (cursor >= to && when != WHEN_VIREP) { add(cursor, "^"); } else { change(cursor, to, "^"); to = cursor + 1; } redraw(cursor, TRUE); *key = getkey(0); if (*key == '\n') { /* '\n' too hard to handle */ #if OSK *key = '\l'; #else *key = '\r'; #endif } change(cursor, cursor + 1, key); cursor++; if (cursor > to) { to = cursor; } break; case ctrl('L'): case ctrl('R'): redraw(MARK_UNSET, FALSE); break; default: if (cursor >= to && when != WHEN_VIREP) { add(cursor, key); cursor++; to = cursor; } else { pfetch(markline(cursor)); if (markidx(cursor) == plen) { add(cursor, key); } else { #ifndef NO_DIGRAPH *key = digraph(ptext[markidx(cursor)], *key); #endif change(cursor, cursor + 1, key); } cursor++; } #ifndef NO_SHOWMATCH /* show matching "({[" if necessary */ if (*o_showmatch && strchr(")}]", *key)) { redraw(cursor, TRUE); m = m_match(cursor - 1, 0L); if (markline(m) >= topline && markline(m) <= botline) { redraw(m, TRUE); refresh(); sleep(1); } } #endif } /* end switch(*key) */ } /* end for(;;) */ BreakBreak:; /* delete any excess characters */ if (cursor < to) { #ifndef NO_EXTENSIONS /* if we aren't in the middle of a change, start one! */ if (!inchg) { beforedo(FALSE); inchg = TRUE; } #endif delete(cursor, to); } } /* end if doingdot else */ /* put the new text into a cut buffer for possible reuse */ if (!doingdot) { blksync(); cutname('.'); cut(from, cursor); } /* move to last char that we inputted, unless it was newline */ if (markidx(cursor) != 0) { cursor--; } redraw(cursor, FALSE); #ifndef NO_EXTENSIONS if (quit) { /* if this is a nested "do", then cut it short */ abortdo(); /* exit, unless we can't write out the file */ cursor = v_xit(cursor, 0L, 'Z'); } #endif rptlines = 0L; return cursor; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* main.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the main() function of vi */ /* HACK! bcc needs to disable use of precompiled headers for this file, or else command line args will not be passed to elvis */ #if __BORLANDC__ #include "borland.h" #endif #include "config.h" #include <setjmp.h> #include "vi.h" extern trapint(); /* defined below */ extern char *getenv(); jmp_buf jmpenv; #ifndef NO_DIGRAPH static init_digraphs(); #endif /*---------------------------------------------------------------------*/ #if AMIGA # include "amiwild.c" main (argc, argv) #else # if VMS # include "vmswild.c" main (argc, argv) # else void main(argc, argv) # endif #endif int argc; char *argv[]; { int i; char *cmd = (char *)0; char *err = (char *)0; char *str; char *tag = (char *)0; /* set mode to MODE_VI or MODE_EX depending on program name */ switch (argv[0][strlen(argv[0]) - 1]) { case 'x': /* "ex" */ mode = MODE_EX; break; case 'w': /* "view" */ mode = MODE_VI; *o_readonly = TRUE; break; #ifndef NO_EXTENSIONS case 't': /* "edit" or "input" */ mode = MODE_VI; *o_inputmode = TRUE; break; #endif default: /* "vi" or "elvis" */ mode = MODE_VI; } #ifndef DEBUG # ifdef SIGQUIT /* normally, we ignore SIGQUIT. SIGINT is trapped later */ signal(SIGQUIT, SIG_IGN); # endif #endif /* temporarily ignore SIGINT */ signal(SIGINT, SIG_IGN); /* start curses */ initscr(); cbreak(); noecho(); scrollok(stdscr, TRUE); /* arrange for deadly signals to be caught */ # ifdef SIGHUP signal(SIGHUP, (void(*)()) deathtrap); # endif # ifndef DEBUG # ifdef SIGILL signal(SIGILL, (void(*)()) deathtrap); # endif # ifdef SIGBUS signal(SIGBUS, (void(*)()) deathtrap); # endif # ifdef SIGSEGV signal(SIGSEGV, (void(*)()) deathtrap); # endif # ifdef SIGSYS signal(SIGSYS, (void(*)()) deathtrap); # endif # endif /* !DEBUG */ # ifdef SIGPIPE signal(SIGPIPE, (void(*)()) deathtrap); # endif # ifdef SIGTERM signal(SIGTERM, (void(*)()) deathtrap); # endif # ifdef SIGUSR1 signal(SIGUSR1, (void(*)()) deathtrap); # endif # ifdef SIGUSR2 signal(SIGUSR2, (void(*)()) deathtrap); # endif /* initialize the options - must be done after initscr(), so that * we can alter LINES and COLS if necessary. */ initopts(); /* map the arrow keys. The KU,KD,KL,and KR variables correspond to * the :ku=: (etc.) termcap capabilities. The variables are defined * as part of the curses package. */ if (has_KU) mapkey(has_KU, "k", WHEN_VICMD|WHEN_INMV, "<Up>"); if (has_KD) mapkey(has_KD, "j", WHEN_VICMD|WHEN_INMV, "<Down>"); if (has_KL) mapkey(has_KL, "h", WHEN_VICMD|WHEN_INMV, "<Left>"); if (has_KR) mapkey(has_KR, "l", WHEN_VICMD|WHEN_INMV, "<Right>"); if (has_HM) mapkey(has_HM, "^", WHEN_VICMD|WHEN_INMV, "<Home>"); if (has_EN) mapkey(has_EN, "$", WHEN_VICMD|WHEN_INMV, "<End>"); if (has_PU) mapkey(has_PU, "\002", WHEN_VICMD|WHEN_INMV, "<PageUp>"); if (has_PD) mapkey(has_PD, "\006", WHEN_VICMD|WHEN_INMV, "<PageDn>"); if (has_KI) mapkey(has_KI, "i", WHEN_VICMD|WHEN_INMV, "<Insert>"); #if MSDOS # if RAINBOW if (!strcmp("rainbow", o_term)) { mapkey("\033[1~", "/", WHEN_VICMD, "<Find>"); mapkey("\033[3~", "x", WHEN_VICMD|WHEN_INMV, "<Remove>"); mapkey("\033[4~", "v", WHEN_VICMD|WHEN_INMV, "<Select>"); mapkey("\033[17~", ":sh\n", WHEN_VICMD, "<Intrpt>"); mapkey("\033[19~", ":q\n", WHEN_VICMD, "<Cancel>"); mapkey("\033[21~", "ZZ", WHEN_VICMD, "<Exit>"); mapkey("\033[26~", "V", WHEN_VICMD|WHEN_INMV, "<AddlOp>"); mapkey("\033[28~", "\\", WHEN_VICMD|WHEN_INMV, "<Help>"); mapkey("\033[29~", "K", WHEN_VICMD|WHEN_INMV, "<Do>"); } else # endif /* RAINBOW */ { mapkey("#S", "x", WHEN_VICMD|WHEN_INMV, "<Delete>"); mapkey("#s", "B", WHEN_VICMD|WHEN_INMV, "^<Left>"); mapkey("#t", "W", WHEN_VICMD|WHEN_INMV, "^<Right>"); } #else /* not MSDOS */ # if COHERENT mapkey("\033[P", "x", WHEN_VICMD|WHEN_INMV, "<Del>"); # else #if AMIGA mapkey("\233?~", "\\", WHEN_VICMD|WHEN_INMV, "<Help>"); #endif if (ERASEKEY != '\177') { mapkey("\177", "x", WHEN_VICMD|WHEN_INMV, "<Del>"); } # endif #endif #ifndef NO_DIGRAPH init_digraphs(); #endif /* NO_DIGRAPH */ /* process any flags */ for (i = 1; i < argc && *argv[i] == '-'; i++) { switch (argv[i][1]) { case 'R': /* readonly */ *o_readonly = TRUE; break; case 'L': case 'r': /* recover */ msg("Use the `elvrec` program to recover lost files"); endmsgs(); refresh(); endwin(); exit(0); break; case 't': /* tag */ if (argv[i][2]) { tag = argv[i] + 2; } else { tag = argv[++i]; } break; case 'v': /* vi mode */ mode = MODE_VI; break; case 'e': /* ex mode */ mode = MODE_EX; break; #ifndef NO_EXTENSIONS case 'i': /* input mode */ *o_inputmode = TRUE; break; #endif #ifndef NO_ERRLIST case 'm': /* use "errlist" as the errlist */ if (argv[i][2]) { err = argv[i] + 2; } else if (i + 1 < argc) { err = argv[++i]; } else { err = ""; } break; #endif #ifndef CRUNCH case 'c': /* run the following command, later */ if (argv[i][2]) { cmd = argv[i] + 2; } else { cmd = argv[++i]; } break; case 'w': /* set the window size */ if (argv[i][2]) { *o_window = atoi(argv[i] + 2); wset = TRUE; } else { *o_window = atoi(argv[++i]); wset = TRUE; } break; #endif default: msg("Ignoring unknown flag \"%s\"", argv[i]); } } /* if we were given an initial ex command, save it... */ if (i < argc && *argv[i] == '+') { if (argv[i][1]) { cmd = argv[i++] + 1; } else { cmd = "$"; /* "vi + file" means start at EOF */ i++; } } /* the remaining args are file names. */ if (i < argc) { strcpy(args, argv[i]); while (++i < argc && strlen(args) + 1 + strlen(argv[i]) < sizeof args) { strcat(args, " "); strcat(args, argv[i]); } #if MSDOS || TOS /* expand wildcard characters, if necessary */ if (strchr(args, '*') || strchr(args, '?')) { strcpy(args, wildcard(args)); } #endif strcpy(tmpblk.c, args); cmd_args(MARK_UNSET, MARK_UNSET, CMD_ARGS, TRUE, tmpblk.c); } else { /* empty args list */ args[0] = '\0'; nargs = 1; argno = -1; } /* perform the .exrc files and EXINIT environment variable */ #ifdef SYSEXRC doexrc(SYSEXRC); #endif #ifdef HMEXRC str = getenv("HOME"); if (str && *str) { strcpy(tmpblk.c, str); str = tmpblk.c + strlen(tmpblk.c); #if !VMS # if AMIGA /* Don't SLASH a device. "Elvis:.exrc" */ if (str[-1] != COLON && str[-1] != SLASH) # else if (str[-1] != SLASH) # endif { *str++ = SLASH; } #endif strcpy(str, HMEXRC); doexrc(tmpblk.c); } #endif #ifndef CRUNCH if (*o_exrc) #endif { doexrc(EXRC); } #ifdef EXINIT str = getenv(EXINIT); if (str) { exstring(str, strlen(str), ctrl('V')); } #endif /* search for a tag (or an error) now, if desired */ blkinit(); if (tag) { cmd_tag(MARK_FIRST, MARK_FIRST, CMD_TAG, 0, tag); } #ifndef NO_ERRLIST else if (err) { cmd_errlist(MARK_FIRST, MARK_FIRST, CMD_ERRLIST, 0, err); } #endif /* if no tag/err, or tag failed, then start with first arg */ if (tmpfd < 0) { /* start with first arg */ cmd_next(MARK_UNSET, MARK_UNSET, CMD_NEXT, FALSE, ""); /* pretend to do something, just to force a recoverable * version of the file out to disk */ ChangeText { } clrflag(file, MODIFIED); } /* now we do the immediate ex command that we noticed before */ if (cmd) { doexcmd(cmd); } /* repeatedly call ex() or vi() (depending on the mode) until the * mode is set to MODE_QUIT */ while (mode != MODE_QUIT) { if (setjmp(jmpenv)) { /* Maybe we just aborted a change? */ abortdo(); } signal(SIGINT, (void(*)()) trapint); switch (mode) { case MODE_VI: vi(); break; case MODE_EX: ex(); break; #ifdef DEBUG default: msg("mode = %d?", mode); mode = MODE_QUIT; #endif } } /* free up the cut buffers */ cutend(); /* end curses */ #ifndef NO_CURSORA��A��A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SHAPE if (has_CQ) do_CQ(); #endif endmsgs(); move(LINES - 1, 0); clrtoeol(); refresh(); endwin(); exit(0); /*NOTREACHED*/ } /*ARGSUSED*/ int trapint(signo) int signo; { beep(); resume_curses(FALSE); abortdo(); #if OSK sigmask(-1); #endif #if TURBOC || __GNUC__ || _ANSI signal(signo, (void (*)())trapint); #else signal(signo, trapint); #endif doingglobal = FALSE; longjmp(jmpenv, 1); return 0; } #ifndef NO_DIGRAPH /* This stuff us used to build the default digraphs table. */ static char digtable[][4] = { # ifdef CS_IBMPC "C,\200", "u\"\1", "e'\2", "a^\3", "a\"\4", "a`\5", "a@\6", "c,\7", "e^\10", "e\"\211", "e`\12", "i\"\13", "i^\14", "i`\15", "A\"\16", "A@\17", "E'\20", "ae\21", "AE\22", "o^\23", "o\"\24", "o`\25", "u^\26", "u`\27", "y\"\30", "O\"\31", "U\"\32", "a'\240", "i'!", "o'\"", "u'#", "n~$", "N~%", "a-&", "o-'", "~?(", "~!-", "\"<.", "\">/", # ifdef CS_SPECIAL "2/+", "4/,", "^+;", "^q<", "^c=", "^r>", "^t?", "pp]", "^^^", "oo_", "*a`", "*ba", "*pc", "*Sd", "*se", "*uf", "*tg", "*Ph", "*Ti", "*Oj", "*dk", "*Hl", "*hm", "*En", "*No", "eqp", "pmq", "ger", "les", "*It", "*iu", "*/v", "*=w", "sq{", "^n|", "^2}", "^3~", "^_\377", # endif /* CS_SPECIAL */ # endif /* CS_IBMPC */ # ifdef CS_LATIN1 "~!!", "a-*", "\">+", "o-:", "\"<>", "~??", "A`@", "A'A", "A^B", "A~C", "A\"D", "A@E", "AEF", "C,G", "E`H", "E'I", "E^J", "E\"K", "I`L", "I'M", "I^N", "I\"O", "-DP", "N~Q", "O`R", "O'S", "O^T", "O~U", "O\"V", "O/X", "U`Y", "U'Z", "U^[", "U\"\\", "Y'_", "a``", "a'a", "a^b", "a~c", "a\"d", "a@e", "aef", "c,g", "e`h", "e'i", "e^j", "e\"k", "i`l", "i'm", "i^n", "i\"o", "-dp", "n~q", "o`r", "o's", "o^t", "o~u", "o\"v", "o/x", "u`y", "u'z", "u^{", "u\"|", "y'~", # endif /* CS_LATIN1 */ "" }; static init_digraphs() { int i; for (i = 0; *digtable[i]; i++) { do_digraph(FALSE, digtable[i]); } do_digraph(FALSE, (char *)0); return 0; } #endif /* NO_DIGRAPH */ ����������/* misc.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains functions which didn't seem happy anywhere else */ #include "config.h" #include "vi.h" /* find a particular line & return a pointer to a copy of its text */ char *fetchline(line) long line; /* line number of the line to fetch */ { int i; REG char *scan; /* used to search for the line in a BLK */ long l; /* line number counter */ static BLK buf; /* holds ONLY the selected line (as string) */ REG char *cpy; /* used while copying the line */ static long nextline; /* } These four variables are used */ static long chglevel; /* } to implement a shortcut when */ static char *nextscan; /* } consecutive lines are fetched */ static long nextlnum; /* } */ /* can we do a shortcut? */ if (changes == chglevel && line == nextline) { scan = nextscan; } else { /* scan lnum[] to determine which block its in */ for (i = 1; line > lnum[i]; i++) { } nextlnum = lnum[i]; /* fetch text of the block containing that line */ scan = blkget(i)->c; /* find the line in the block */ for (l = lnum[i - 1]; ++l < line; ) { while (*scan++ != '\n') { } } } /* copy it into a block by itself, with no newline */ for (cpy = buf.c; *scan != '\n'; ) { *cpy++ = *scan++; } *cpy = '\0'; /* maybe speed up the next call to fetchline() ? */ if (line < nextlnum) { nextline = line + 1; chglevel = changes; nextscan = scan + 1; } else { nextline = 0; } /* Calls to fetchline() interfere with calls to pfetch(). Make sure * that pfetch() resets itself on its next invocation. */ pchgs = 0L; /* Return a pointer to the line's text */ return buf.c; } /* error message from the regexp code */ void regerror(txt) char *txt; /* an error message */ { msg("RE error: %s", txt); } /* This function is equivelent to the pfetch() macro */ void pfetch(l) long l; /* line number of line to fetch */ { if(l != pline || changes != pchgs) { pline = (l); ptext = fetchline(pline); plen = strlen(ptext); pchgs = changes; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* modify.c */ /* This file contains the low-level file modification functions: * delete(frommark, tomark) - removes line or portions of lines * add(frommark, text) - inserts new text * change(frommark, tomark, text) - delete, then add */ #include "config.h" #include "vi.h" #ifdef DEBUG2 # include <stdio.h> static FILE *dbg; /*VARARGS1*/ debout(msg, arg1, arg2, arg3, arg4, arg5) char *msg, *arg1, *arg2, *arg3, *arg4, *arg5; { if (!dbg) { dbg = fopen("debug.out", "w"); if (!dbg) return; setbuf(dbg, (FILE *)0); } fprintf(dbg, msg, arg1, arg2, arg3, arg4, arg5); } #endif /* DEBUG2 */ /* delete a range of text from the file */ void delete(frommark, tomark) MARK frommark; /* first char to be deleted */ MARK tomark; /* AFTER last char to be deleted */ { int i; /* used to move thru logical blocks */ REG char *scan; /* used to scan thru text of the blk */ REG char *cpy; /* used when copying chars */ BLK *blk; /* a text block */ long l; /* a line number */ MARK m; /* a traveling version of frommark */ #ifdef DEBUG2 debout("delete(%ld.%d, %ld.%d)\n", markline(frommark), markidx(frommark), markline(tomark), markidx(tomark)); #endif /* if not deleting anything, quit now */ if (frommark == tomark) { return; } /* This is a change */ changes++; significant = TRUE; /* supply clues to the redraw module */ redrawrange(markline(frommark), markline(tomark), markline(frommark)); /* adjust marks 'a through 'z and '' as needed */ l = markline(tomark); for (i = 0; i < NMARKS; i++) { if (mark[i] < frommark) { continue; } else if (mark[i] < tomark) { mark[i] = MARK_UNSET; } else if (markline(mark[i]) == l) { if (markline(frommark) == l) { mark[i] -= markidx(tomark) - markidx(frommark); } else { mark[i] -= markidx(tomark); } } else { mark[i] -= MARK_AT_LINE(l - markline(frommark)); } } /* Reporting... */ if (markidx(frommark) == 0 && markidx(tomark) == 0) { rptlines = markline(tomark) - markline(frommark); rptlabel = "deleted"; } /* find the block containing frommark */ l = markline(frommark); for (i = 1; lnum[i] < l; i++) { } /* process each affected block... */ for (m = frommark; m < tomark && lnum[i] < INFINITY; m = MARK_AT_LINE(lnum[i - 1] + 1)) { /* fetch the block */ blk = blkget(i); /* find the mark in the block */ scan = blk->c; for (l = markline(m) - lnum[i - 1] - 1; l > 0; l--) { while (*scan++ != '\n') { } } scan += markidx(m); /* figure out where the changes to this block end */ if (markline(tomark) > lnum[i]) { cpy = blk->c + BLKSIZE; } else if (markline(tomark) == markline(m)) { cpy = scan - markidx(m) + markidx(tomark); } else { cpy = scan; for (l = markline(tomark) - markline(m); l > 0; l--) { while (*cpy++ != '\n') { } } cpy += markidx(tomark); } /* delete the stuff by moving chars within this block */ while (cpy < blk->c + BLKSIZE) { *scan++ = *cpy++; } while (scan < blk->c + BLKSIZE) { *scan++ = '\0'; } /* adjust tomark to allow for lines deleted from this block */ tomark -= MARK_AT_LINE(lnum[i] + 1 - markline(m)); /* if this block isn't empty now, then advance i */ if (*blk->c) { i++; } /* the buffer has changed. Update hdr and lnum. */ blkdirty(blk); } /* must have at least 1 line */ if (nlines == 0) { blk = blkadd(1); blk->c[0] = '\n'; blkdirty(blk); cursor = MARK_FIRST; } } /* add some text at a specific place in the file */ void add(atmark, newtext) MARK atmark; /* where to insert the new text */ char *newtext; /* NUL-terminated string to insert */ { REG char *scan; /* used to move through string */ REG char *build; /* used while copying chars */ int addlines; /* number of lines we're adding */ int lastpart; /* size of last partial line */ BLK *blk; /* the block to be modified */ int blkno; /* the logical block# of (*blk) */ REG char *newptr; /* where new text starts in blk */ BLK buf; /* holds chars from orig blk */ BLK linebuf; /* holds part of line that didn't fit */ BLK *following; /* the BLK following the last BLK */ int i; long l; #ifdef DEBUG2 debout("add(%ld.%d, \"%s\")\n", markline(atmark), markidx(atmark), newtext); #endif #ifdef lint buf.c[0] = 0; #endif /* if not adding anything, return now */ if (!*newtext) { return; } /* This is a change */ changes++; significant = TRUE; /* count the number of lines in the new text */ for (scan = newtext, lastpart = addlines = 0; *scan; ) { if (*scan++ == '\n') { addlines++; lastpart = 0; } else { lastpart++; } } /* Reporting... */ if (lastpart == 0 && markidx(atmark) == 0) { rptlines = addlines; rptlabel = "added"; } /* extract the line# from atmark */ l = markline(atmark); /* supply clues to the redraw module */ if ((markidx(atmark) == 0 && lastpart == 0) || addlines == 0) { redrawrange(l, l, l + addlines); } else { /* make sure the last line gets redrawn -- it was * split, so its appearance has changed */ redrawrange(l, l + 1L, l + addlines + 1L); } /* adjust marks 'a through 'z and '' as needed */ for (i = 0; i < NMARKS; i++) { if (mark[i] < atmark) { /* earlier line, or earlier in same line: no change */ continue; } else if (markline(mark[i]) > l) { /* later line: move down a whole number of lines */ mark[i] += MARK_AT_LINE(addlines); } else { /* later in same line */ if (addlines > 0) { /* multi-line add, which split this line: * move down, and possibly left or right, * depending on where the split was and how * much text was inserted after the last \n */ mark[i] += MARK_AT_LINE(addlines) + lastpart - markidx(atmark); } else { /* totally within this line: move right */ mark[i] += lastpart; } } } /* get the block to be modified */ for (blkno = 1; lnum[blkno] < l && lnum[blkno + 1] < INFINITY; blkno++) { } blk = blkget(blkno); buf = *blk; /* figure out where the new text starts */ for (newptr = buf.c, l = markline(atmark) - lnum[blkno - 1] - 1; l > 0; l--) { while (*newptr++ != '\n') { } } newptr += markidx(atmark); /* keep start of old block */ build = blk->c + (int)(newptr - buf.c); /* fill this block (or blocks) from the newtext string */ while (*newtext) { while (*newtext && build < blk->c + BLKSIZE - 1) { *build++ = *newtext++; } if (*newtext) { /* save the excess */ for (scan = linebuf.c + BLKSIZE; build > blk->c && build[-1] != '\n'; ) { *--scan = *--build; } /* write the block */ while (build < blk->c + BLKSIZE) { *build++ = '\0'; } blkdirty(blk); /* add another block */ blkno++; blk = blkadd(blkno); /* copy in the excess from last time */ for (build = blk->c; scan < linebuf.c + BLKSIZE; ) { *build++ = *scan++; } } } /* fill this block(s) from remainder of orig block */ while (newptr < buf.c + BLKSIZE && *newptr) { while (newptr < buf.c + BLKSIZE && *newptr && build < blk->c + BLKSIZE - 1) { *build++ = *newptr++; } if (newptr < buf.c + BLKSIZE && *newptr) { /* save the excess */ for (scan = linebuf.c + BLKSIZE; build > blk->c && build[-1] != '\n'; ) { *--scan = *--build; } /* write the block */ while (build < blk->c + BLKSIZE) { *build++ = '\0'; } blkdirty(blk); /* add another block */ blkno++; blk = blkadd(blkno); /* copy in the excess from last time */ for (build = blk->c; scan < linebuf.c + BLKSIZE; ) { *build++ = *scan++; } } } /* see if we can combine our last block with the following block */ if (lnum[blkno] < nlines && lnum[blkno + 1] - lnum[blkno] < (BLKSIZE >> 6)) { /* hey, we probably can! Get the following block & see... */ following = blkget(blkno + 1); if (strlen(following->c) + (build - blk->c) < BLKSIZE - 1) { /* we can! Copy text from following to blk */ for (scan = following->c; *scan; ) { *build++ = A��A��A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*scan++; } while (build < blk->c + BLKSIZE) { *build++ = '\0'; } blkdirty(blk); /* pretend the following was the last blk */ blk = following; build = blk->c; } } /* that last block is dirty by now */ while (build < blk->c + BLKSIZE) { *build++ = '\0'; } blkdirty(blk); } /* change the text of a file */ void change(frommark, tomark, newtext) MARK frommark, tomark; char *newtext; { int i; long l; char *text; BLK *blk; #ifdef DEBUG2 debout("change(%ld.%d, %ld.%d, \"%s\")\n", markline(frommark), markidx(frommark), markline(tomark), markidx(tomark), newtext); #endif /* optimize for single-character replacement */ if (frommark + 1 == tomark && newtext[0] && !newtext[1] && newtext[0] != '\n') { /* find the block containing frommark */ l = markline(frommark); for (i = 1; lnum[i] < l; i++) { } /* get the block */ blk = blkget(i); /* find the line within the block */ for (text = blk->c, i = l - lnum[i - 1] - 1; i > 0; text++) { if (*text == '\n') { i--; } } /* replace the char */ text += markidx(frommark); if (*text == newtext[0]) { /* no change was needed - same char */ return; } else if (*text != '\n') { /* This is a change */ changes++; significant = TRUE; ChangeText { *text = newtext[0]; blkdirty(blk); } redrawrange(markline(frommark), markline(tomark), markline(frommark)); return; } /* else it is a complex change involving newline... */ } /* couldn't optimize, so do delete & add */ ChangeText { delete(frommark, tomark); add(frommark, newtext); rptlabel = "changed"; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* move1.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains most movement functions */ #include "config.h" #include "vi.h" #include "ctype.h" MARK m_updnto(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ char cmd; /* the command character */ { DEFAULT(cmd == 'G' ? nlines : 1L); /* move up or down 'cnt' lines */ switch (cmd) { case ctrl('P'): case '-': case 'k': m -= MARK_AT_LINE(cnt); break; case 'G': if (cnt < 1L || cnt > nlines) { msg("Only %ld lines", nlines); return MARK_UNSET; } m = MARK_AT_LINE(cnt); break; case '_': cnt--; /* fall through... */ default: m += MARK_AT_LINE(cnt); } /* if that left us screwed up, then fail */ if (m < MARK_FIRST || markline(m) > nlines) { return MARK_UNSET; } return m; } /*ARGSUSED*/ MARK m_right(m, cnt, key, prevkey) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int key; /* movement keystroke */ int prevkey;/* operator keystroke, or 0 if none */ { int idx; /* index of the new cursor position */ DEFAULT(1); /* If used with an operator, then move 1 less character, since the 'l' * command includes the character that it moves onto. */ if (prevkey != '\0') { cnt--; } /* move to right, if that's OK */ pfetch(markline(m)); idx = markidx(m) + cnt; if (idx < plen) { m += cnt; } else { return MARK_UNSET; } return m; } /*ARGSUSED*/ MARK m_left(m, cnt) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ { DEFAULT(1); /* move to the left, if that's OK */ if (markidx(m) >= cnt) { m -= cnt; } else { return MARK_UNSET; } return m; } /*ARGSUSED*/ MARK m_tocol(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either ctrl('X') or '|' */ { char *text; /* text of the line */ int col; /* column number */ int idx; /* index into the line */ /* if doing ^X, then adjust for sideways scrolling */ if (cmd == ctrl('X')) { DEFAULT(*o_columns & 0xff); cnt += leftcol; } else { DEFAULT(1); } /* internally, columns are numbered 0..COLS-1, not 1..COLS */ cnt--; /* if 0, that's easy */ if (cnt == 0) { m &= ~(BLKSIZE - 1); return m; } /* find that column within the line */ pfetch(markline(m)); text = ptext; for (col = idx = 0; col < cnt && *text; text++, idx++) { if (*text == '\t' && !*o_list) { col += *o_tabstop; col -= col % *o_tabstop; } else if (UCHAR(*text) < ' ' || *text == '\177') { col += 2; } #ifndef NO_CHARATTR else if (text[0] == '\\' && text[1] == 'f' && text[2] && *o_charattr) { text += 2; /* plus one more as part of for loop */ } #endif else { col++; } } if (!*text) { /* the desired column was past the end of the line, so * act like the user pressed "$" instead. */ return m | (BLKSIZE - 1); } else { m = (m & ~(BLKSIZE - 1)) + idx; } return m; } /*ARGSUSED*/ MARK m_front(m, cnt) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument (ignored) */ { char *scan; /* move to the first non-whitespace character */ pfetch(markline(m)); scan = ptext; m &= ~(BLKSIZE - 1); while (*scan == ' ' || *scan == '\t') { scan++; m++; } return m; } /*ARGSUSED*/ MARK m_rear(m, cnt) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument (ignored) */ { /* Try to move *EXTREMELY* far to the right. It is fervently hoped * that other code will convert this to a more reasonable MARK before * anything tries to actually use it. (See adjmove() in vi.c) */ return m | (BLKSIZE - 1); } #ifndef NO_SENTENCE static int isperiod(ptr) char *ptr; /* pointer to possible sentence-ender */ { /* if not '.', '?', or '!', then it isn't a sentence ender */ if (*ptr != '.' && *ptr != '?' && *ptr != '!') { return FALSE; } /* skip any intervening ')', ']', or '"' characters */ do { ptr++; } while (*ptr == ')' || *ptr == ']' || *ptr == '"'); /* do we have two spaces or EOL? */ if (!*ptr || ptr[0] == ' ' && ptr[1] == ' ') { return TRUE; } return FALSE; } /*ARGSUSED*/ MARK m_sentence(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either '(' or ')' */ { REG char *text; REG long l; DEFAULT(1); /* If '(' command, then move back one word, so that if we hit '(' at * the start of a sentence we don't simply stop at the end of the * previous sentence and bounce back to the start of this one again. */ if (cmd == '(') { m = m_bword(m, 1L, 'b'); if (!m) { return m; } } /* get the current line */ l = markline(m); pfetch(l); text = ptext + markidx(m); /* for each requested sentence... */ while (cnt-- > 0) { /* search forward for one of [.?!] followed by spaces or EOL */ do { if (cmd == ')') { /* move forward, wrap at end of line */ if (!text[0]) { if (l >= nlines) { return MARK_UNSET; } l++; pfetch(l); text = ptext; } else { text++; } } else { /* move backward, wrap at beginning of line */ if (text == ptext) { do { if (l <= 1) { return MARK_FIRST; } l--; pfetch(l); } while (!*ptext); text = ptext + plen - 1; } else { text--; } } } while (!isperiod(text)); } /* construct a mark for this location */ m = buildmark(text); /* move forward to the first word of the next sentence */ m = m_fword(m, 1L, 'w', '\0'); return m; } #endif MARK m_paragraph(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either '{' or '}' */ { char *text; /* text of the current line */ char *pscn; /* used to scan thru value of "paragraphs" option */ long l, ol; /* current line number, original line number */ int dir; /* -1 if we're moving up, or 1 if down */ char col0; /* character to expect in column 0 */ #ifndef NO_SENTENCE # define SENTENCE(x) (x) char *list; /* either o_sections or o_paragraph */ #else # define SENTENCE(x) #endif DEFAULT(1); /* set the direction, based on the command */ switch (cmd) { case '{': dir = -1; col0 = '\0'; SENTENCE(list = o_paragraphs); break; case '}': dir = 1; col0 = '\0'; SENTENCE(list = o_paragraphs); break; case '[': if (getkey(0) != '[') { return MARK_UNSET; } dir = -1; col0 = '{'; SENTENCE(list = o_sections); break; case ']': if (getkey(0) != ']') { return MARK_UNSET; } dir = 1; col0 = '{'; SENTENCE(list = o_sections); break; } ol = l = markline(m); /* for each paragraph that we want to travel through... */ while (l > 0 && l <= nlines && cnt-- > 0) { /* skip blank lines between paragraphs */ while (l > 0 && l <= nlines && col0 == *(text = fetchline(l))) { l += dir; } /* skip non-blank lines that aren't paragraph separators */ do { #ifndef NO_SENTENCE if (*text == '.' && l != ol) { for (pscn = list; pscn[0] && pscn[1]; pscn += 2) { if (pscn[0] == text[1] && pscn[1] == text[2]) { pscn = (char *)0; goto BreakBreak; } } } #endif l += dir; } while (l > 0 && l <= nlines && col0 != *(text = fetchline(l))); BreakBreak: ; } if (l > nlines) { m = MARK_LAST; } else if (l <= 0) { m = MARK_FIRST; } else { m = MARK_AT_LINE(l); } return m; } /*ARGSUSED*/ MARK m_match(m, cnt) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument (normally 0) */ { long l; REG char *text; REG char match; REG char nest; REG int count; #ifndef NO_EXTENSIONS /* if we're given a number, then treat it as a percentage of the file */ if (cnt > 0) { /* make sure it is a reasonable number */ if (cnt > 100) { msg("can only be from 1%% to 100%%"); return MARK_UNSET; } /* return the appropriate line number */ l = (nlines - 1L) * cnt / 100L + 1L; return MARK_AT_LINE(l); A��A��A��A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������} #endif /* undef NO_EXTENSIONS */ /* get the current line */ l = markline(m); pfetch(l); text = ptext + markidx(m); /* search forward within line for one of "[](){}" */ for (match = '\0'; !match && *text; text++) { /* tricky way to recognize 'em in ASCII */ nest = *text; if ((nest & 0xdf) == ']' || (nest & 0xdf) == '[') { match = nest ^ ('[' ^ ']'); } else if ((nest & 0xfe) == '(') { match = nest ^ ('(' ^ ')'); } else { match = 0; } } if (!match) { return MARK_UNSET; } text--; /* search forward or backward for match */ if (match == '(' || match == '[' || match == '{') { /* search backward */ for (count = 1; count > 0; ) { /* wrap at beginning of line */ if (text == ptext) { do { if (l <= 1L) { return MARK_UNSET; } l--; pfetch(l); } while (!*ptext); text = ptext + plen - 1; } else { text--; } /* check the char */ if (*text == match) count--; else if (*text == nest) count++; } } else { /* search forward */ for (count = 1; count > 0; ) { /* wrap at end of line */ if (!*text) { if (l >= nlines) { return MARK_UNSET; } l++; pfetch(l); text = ptext; } else { text++; } /* check the char */ if (*text == match) count--; else if (*text == nest) count++; } } /* construct a mark for this place */ m = buildmark(text); return m; } /*ARGSUSED*/ MARK m_tomark(m, cnt, key) MARK m; /* movement is relative to this mark */ long cnt; /* (ignored) */ int key; /* keystroke - the mark to move to */ { /* mark '' is a special case */ if (key == '\'' || key == '`') { if (mark[26] == MARK_UNSET) { return MARK_FIRST; } else { return mark[26]; } } /* if not a valid mark number, don't move */ if (key < 'a' || key > 'z') { return MARK_UNSET; } /* return the selected mark -- may be MARK_UNSET */ if (!mark[key - 'a']) { msg("mark '%c is unset", key); } return mark[key - 'a']; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* move2.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This function contains the movement functions that perform RE searching */ #include "config.h" #include "vi.h" #include "regexp.h" extern long atol(); static regexp *re; /* compiled version of the pattern to search for */ static prevsf; /* boolean: previous search direction was forward? */ #ifndef NO_EXTENSIONS /*ARGSUSED*/ MARK m_wsrch(word, m, cnt) char *word; /* the word to search for */ MARK m; /* the starting point */ int cnt; /* ignored */ { char buffer[30]; /* wrap \< and \> around the word */ strcpy(buffer, "/\\<"); strcat(buffer, word); strcat(buffer, "\\>"); /* show the searched-for word on the bottom line */ move(LINES - 1, 0); qaddstr(buffer); clrtoeol(); refresh(); /* search for the word */ return m_fsrch(m, buffer); } #endif MARK m_nsrch(m) MARK m; /* where to start searching */ { if (prevsf) { m = m_fsrch(m, (char *)0); prevsf = TRUE; } else { m = m_bsrch(m, (char *)0); prevsf = FALSE; } return m; } MARK m_Nsrch(m) MARK m; /* where to start searching */ { if (prevsf) { m = m_bsrch(m, (char *)0); prevsf = TRUE; } else { m = m_fsrch(m, (char *)0); prevsf = FALSE; } return m; } MARK m_fsrch(m, ptrn) MARK m; /* where to start searching */ char *ptrn; /* pattern to search for */ { long l; /* line# of line to be searched */ char *line; /* text of line to be searched */ int wrapped;/* boolean: has our search wrapped yet? */ int pos; /* where we are in the line */ #ifndef CRUNCH long delta = INFINITY;/* line offset, for things like "/foo/+1" */ #endif /* remember: "previous search was forward" */ prevsf = TRUE; if (ptrn && *ptrn) { /* locate the closing '/', if any */ line = parseptrn(ptrn); #ifndef CRUNCH if (*line) { delta = atol(line); } #endif ptrn++; /* free the previous pattern */ if (re) free(re); /* compile the pattern */ re = regcomp(ptrn); if (!re) { return MARK_UNSET; } } else if (!re) { msg("No previous expression"); return MARK_UNSET; } /* search forward for the pattern */ pos = markidx(m) + 1; pfetch(markline(m)); if (pos >= plen) { pos = 0; m = (m | (BLKSIZE - 1)) + 1; } wrapped = FALSE; for (l = markline(m); l != markline(m) + 1 || !wrapped; l++) { /* wrap search */ if (l > nlines) { /* if we wrapped once already, then the search failed */ if (wrapped) { break; } /* else maybe we should wrap now? */ if (*o_wrapscan) { l = 0; wrapped = TRUE; continue; } else { break; } } /* get this line */ line = fetchline(l); /* check this line */ if (regexec(re, &line[pos], (pos == 0))) { /* match! */ if (wrapped && *o_warn) msg("(wrapped)"); #ifndef CRUNCH if (delta != INFINITY) { l += delta; if (l < 1 || l > nlines) { msg("search offset too big"); return MARK_UNSET; } force_flags = LNMD|INCL; return MARK_AT_LINE(l); } #endif return MARK_AT_LINE(l) + (int)(re->startp[0] - line); } pos = 0; } /* not found */ msg(*o_wrapscan ? "Not found" : "Hit bottom without finding RE"); return MARK_UNSET; } MARK m_bsrch(m, ptrn) MARK m; /* where to start searching */ char *ptrn; /* pattern to search for */ { long l; /* line# of line to be searched */ char *line; /* text of line to be searched */ int wrapped;/* boolean: has our search wrapped yet? */ int pos; /* last acceptable idx for a match on this line */ int last; /* remembered idx of the last acceptable match on this line */ int try; /* an idx at which we strat searching for another match */ #ifndef CRUNCH long delta = INFINITY;/* line offset, for things like "/foo/+1" */ #endif /* remember: "previous search was not forward" */ prevsf = FALSE; if (ptrn && *ptrn) { /* locate the closing '?', if any */ line = parseptrn(ptrn); #ifndef CRUNCH if (*line) { delta = atol(line); } #endif ptrn++; /* free the previous pattern, if any */ if (re) free(re); /* compile the pattern */ re = regcomp(ptrn); if (!re) { return MARK_UNSET; } } else if (!re) { msg("No previous expression"); return MARK_UNSET; } /* search backward for the pattern */ pos = markidx(m); wrapped = FALSE; for (l = markline(m); l != markline(m) - 1 || !wrapped; l--) { /* wrap search */ if (l < 1) { if (*o_wrapscan) { l = nlines + 1; wrapped = TRUE; continue; } else { break; } } /* get this line */ line = fetchline(l); /* check this line */ if (regexec(re, line, 1) && (int)(re->startp[0] - line) < pos) { /* match! now find the last acceptable one in this line */ do { last = (int)(re->startp[0] - line); try = (int)(re->endp[0] - line); } while (try > 0 && regexec(re, &line[try], FALSE) && (int)(re->startp[0] - line) < pos); if (wrapped && *o_warn) msg("(wrapped)"); #ifndef CRUNCH if (delta != INFINITY) { l += delta; if (l < 1 || l > nlines) { msg("search offset too big"); return MARK_UNSET; } force_flags = LNMD|INCL; return MARK_AT_LINE(l); } #endif return MARK_AT_LINE(l) + last; } pos = BLKSIZE; } /* not found */ msg(*o_wrapscan ? "Not found" : "Hit top without finding RE"); return MARK_UNSET; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* move3.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains movement functions that perform character searches */ #include "config.h" #include "vi.h" #ifndef NO_CHARSEARCH static MARK (*prevfwdfn)(); /* function to search in same direction */ static MARK (*prevrevfn)(); /* function to search in opposite direction */ static char prev_key; /* sought cvhar from previous [fFtT] */ MARK m__ch(m, cnt, cmd) MARK m; /* current position */ long cnt; char cmd; /* command: either ',' or ';' */ { MARK (*tmp)(); if (!prevfwdfn) { msg("No previous f, F, t, or T command"); return MARK_UNSET; } if (cmd == ',') { m = (*prevrevfn)(m, cnt, prev_key); /* Oops! we didn't want to change the prev*fn vars! */ tmp = prevfwdfn; prevfwdfn = prevrevfn; prevrevfn = tmp; return m; } else { return (*prevfwdfn)(m, cnt, prev_key); } } /* move forward within this line to next occurrence of key */ MARK m_fch(m, cnt, key) MARK m; /* where to search from */ long cnt; char key; /* what to search for */ { REG char *text; DEFAULT(1); prevfwdfn = m_fch; prevrevfn = m_Fch; prev_key = key; pfetch(markline(m)); text = ptext + markidx(m); while (cnt-- > 0) { do { m++; text++; } while (*text && *text != key); } if (!*text) { return MARK_UNSET; } return m; } /* move backward within this line to previous occurrence of key */ MARK m_Fch(m, cnt, key) MARK m; /* where to search from */ long cnt; char key; /* what to search for */ { REG char *text; DEFAULT(1); prevfwdfn = m_Fch; prevrevfn = m_fch; prev_key = key; pfetch(markline(m)); text = ptext + markidx(m); while (cnt-- > 0) { do { m--; text--; } while (text >= ptext && *text != key); } if (text < ptext) { return MARK_UNSET; } return m; } /* move forward within this line almost to next occurrence of key */ MARK m_tch(m, cnt, key) MARK m; /* where to search from */ long cnt; char key; /* what to search for */ { /* skip the adjacent char */ pfetch(markline(m)); if (plen <= markidx(m)) { return MARK_UNSET; } m++; m = m_fch(m, cnt, key); if (m == MARK_UNSET) { return MARK_UNSET; } prevfwdfn = m_tch; prevrevfn = m_Tch; return m - 1; } /* move backward within this line almost to previous occurrence of key */ MARK m_Tch(m, cnt, key) MARK m; /* where to search from */ long cnt; char key; /* what to search for */ { /* skip the adjacent char */ if (markidx(m) == 0) { return MARK_UNSET; } m--; m = m_Fch(m, cnt, key); if (m == MARK_UNSET) { return MARK_UNSET; } prevfwdfn = m_Tch; prevrevfn = m_tch; return m + 1; } #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* move4.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains movement functions which are screen-relative */ #include "config.h" #include "vi.h" /* This moves the cursor to a particular row on the screen */ /*ARGSUSED*/ MARK m_row(m, cnt, key) MARK m; /* the cursor position */ long cnt; /* the row we'll move to */ int key; /* the keystroke of this move - H/L/M */ { DEFAULT(1); /* calculate destination line based on key */ cnt--; switch (key) { case 'H': cnt = topline + cnt; break; case 'M': cnt = topline + (LINES - 1) / 2; break; case 'L': cnt = botline - cnt; break; } /* return the mark of the destination line */ return MARK_AT_LINE(cnt); } /* This function repositions the current line to show on a given row */ MARK m_z(m, cnt, key) MARK m; /* the cursor */ long cnt; /* the line number we're repositioning */ int key; /* key struck after the z */ { long newtop; int i; /* Which line are we talking about? */ if (cnt < 0 || cnt > nlines) { return MARK_UNSET; } if (cnt) { m = MARK_AT_LINE(cnt); newtop = cnt; } else { newtop = markline(m); } /* allow a "window size" number to be entered */ for (i = 0; key >= '0' && key <= '9'; key = getkey(0)) { i = i * 10 + key - '0'; } #ifndef CRUNCH if (i > 0 && i <= LINES - 1) { *o_window = i; wset = TRUE; } #else /* the number is ignored if -DCRUNCH */ #endif /* figure out which line will have to be at the top of the screen */ switch (key) { case '\n': #if OSK case '\l': #else case '\r': #endif case '+': break; case '.': case 'z': newtop -= LINES / 2; break; case '-': newtop -= LINES - 1; break; default: return MARK_UNSET; } /* make the new topline take effect */ redraw(MARK_UNSET, FALSE); if (newtop >= 1) { topline = newtop; } else { topline = 1L; } redrawrange(0L, INFINITY, INFINITY); /* The cursor doesn't move */ return m; } /* This function scrolls the screen. It does this by calling redraw() with * an off-screen line as the argument. It will move the cursor if necessary * so that the cursor is on the new screen. */ /*ARGSUSED*/ MARK m_scroll(m, cnt, key) MARK m; /* the cursor position */ long cnt; /* for some keys: the number of lines to scroll */ int key; /* keystroke that causes this movement */ { MARK tmp; /* a temporary mark, used as arg to redraw() */ /* adjust cnt, and maybe *o_scroll, depending of key */ switch (key) { case ctrl('F'): case ctrl('B'): DEFAULT(1); redrawrange(0L, INFINITY, INFINITY); /* force complete redraw */ cnt = cnt * (LINES - 1) - 2; /* keeps two old lines on screen */ break; case ctrl('E'): case ctrl('Y'): DEFAULT(1); break; case ctrl('U'): case ctrl('D'): if (cnt == 0) /* default */ { cnt = *o_scroll; } else { if (cnt > LINES - 1) { cnt = LINES - 1; } *o_scroll = cnt; } break; } /* scroll up or down, depending on key */ switch (key) { case ctrl('B'): case ctrl('Y'): case ctrl('U'): cnt = topline - cnt; if (cnt < 1L) { cnt = 1L; m = MARK_FIRST; } tmp = MARK_AT_LINE(cnt) + markidx(m); redraw(tmp, FALSE); if (markline(m) > botline) { m = MARK_AT_LINE(botline); } break; case ctrl('F'): case ctrl('E'): case ctrl('D'): cnt = botline + cnt; if (cnt > nlines) { cnt = nlines; m = MARK_LAST; } tmp = MARK_AT_LINE(cnt) + markidx(m); redraw(tmp, FALSE); if (markline(m) < topline) { m = MARK_AT_LINE(topline); } break; } return m; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* move5.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the word-oriented movement functions */ #include "config.h" #include "ctype.h" #include "vi.h" MARK m_fword(m, cnt, cmd, prevkey) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either 'w' or 'W' */ int prevkey;/* previous command... if 'c' then exclude whitespace */ { REG long l; REG char *text; REG int i; DEFAULT(1); l = markline(m); pfetch(l); text = ptext + markidx(m); #ifndef CRUNCH /* As a special case, "cw" or "cW" on whitespace without a count * treats the single whitespace character under the cursor as a word. */ if (cnt == 1L && prevkey == 'c' && isspace(*text)) { return m + 1L; } #endif while (cnt-- > 0) /* yes, ASSIGNMENT! */ { i = *text++; if (cmd == 'W') { /* include any non-whitespace */ while (i && !isspace(i)) { i = *text++; } } else if (isalnum(i) || i == '_') { /* include an alphanumeric word */ while (i && isalnum(i)) { i = *text++; } } else { /* include contiguous punctuation */ while (i && !isalnum(i) && !isspace(i)) { i = *text++; } } /* if not part of "cw" or "cW" command... */ if (prevkey != 'c' || cnt > 0) { /* include trailing whitespace */ while (!i || isspace(i)) { /* did we hit the end of this line? */ if (!i) { /* "dw" shouldn't delete newline after word */ if (prevkey && cnt == 0) { break; } /* move to next line, if there is one */ l++; if (l > nlines) { return MARK_UNSET; } pfetch(l); text = ptext; } i = *text++; } } text--; } /* if argument to operator, then back off 1 char since "w" and "W" * include the last char in the affected text. */ if (prevkey) { text--; } /* construct a MARK for this place */ m = buildmark(text); return m; } MARK m_bword(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either 'b' or 'B' */ { REG long l; REG char *text; DEFAULT(1); l = markline(m); pfetch(l); text = ptext + markidx(m); while (cnt-- > 0) /* yes, ASSIGNMENT! */ { text--; /* include preceding whitespace */ while (text < ptext || isspace(*text)) { /* did we hit the end of this line? */ if (text < ptext) { /* move to preceding line, if there is one */ l--; if (l <= 0) { return MARK_UNSET; } pfetch(l); text = ptext + plen - 1; } else { text--; } } if (cmd == 'B') { /* include any non-whitespace */ while (text >= ptext && !isspace(*text)) { text--; } } else if (isalnum(*text) || *text == '_') { /* include an alphanumeric word */ while (text >= ptext && isalnum(*text)) { text--; } } else { /* include contiguous punctuation */ while (text >= ptext && !isalnum(*text) && !isspace(*text)) { text--; } } text++; } /* construct a MARK for this place */ m = buildmark(text); return m; } MARK m_eword(m, cnt, cmd) MARK m; /* movement is relative to this mark */ long cnt; /* a numeric argument */ int cmd; /* either 'e' or 'E' */ { REG long l; REG char *text; REG int i; DEFAULT(1); l = markline(m); pfetch(l); text = ptext + markidx(m); while (cnt-- > 0) /* yes, ASSIGNMENT! */ { if (*text) text++; i = *text++; /* include preceding whitespace */ while (!i || isspace(i)) { /* did we hit the end of this line? */ if (!i) { /* move to next line, if there is one */ l++; if (l > nlines) { return MARK_UNSET; } pfetch(l); text = ptext; } i = *text++; } if (cmd == 'E') { /* include any non-whitespace */ while (i && !isspace(i)) { i = *text++; } } else if (isalnum(i) || i == '_') { /* include an alphanumeric word */ while (i && isalnum(i)) { i = *text++; } } else { /* include contiguous punctuation */ while (i && !isalnum(i) && !isspace(i)) { i = *text++; } } text -= 2; } /* construct a MARK for this place */ m = buildmark(text); return m; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* opts.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the code that manages the run-time options -- The * values that can be modified via the "set" command. */ #include "config.h" #include "vi.h" #include "ctype.h" #ifndef NULL #define NULL (char *)0 #endif extern char *getenv(); /* maximum width to permit for strings, including ="" */ #define MAXWIDTH 20 /* These are the default values of all options */ char o_autoindent[1] = {FALSE}; char o_autoprint[1] = {TRUE}; char o_autotab[1] = {TRUE}; char o_autowrite[1] = {FALSE}; char o_columns[3] = {80, 32, 255}; char o_directory[30] = TMPDIR; char o_edcompatible[1] = {FALSE}; char o_equalprg[80] = {"fmt"}; char o_errorbells[1] = {TRUE}; char o_exrefresh[1] = {TRUE}; char o_ignorecase[1] = {FALSE}; char o_keytime[3] = {1, 0, 50}; char o_keywordprg[80] = {KEYWORDPRG}; char o_lines[3] = {25, 2, 96}; char o_list[1] = {FALSE}; char o_number[1] = {FALSE}; char o_readonly[1] = {FALSE}; char o_remap[1] = {TRUE}; char o_report[3] = {5, 1, 127}; char o_scroll[3] = {12, 1, 127}; char o_shell[60] = SHELL; char o_shiftwidth[3] = {8, 1, 255}; char o_sidescroll[3] = {8, 1, 40}; char o_sync[1] = {NEEDSYNC}; char o_tabstop[3] = {8, 1, 40}; char o_term[30] = "?"; char o_flash[1] = {TRUE}; char o_warn[1] = {TRUE}; char o_wrapscan[1] = {TRUE}; #ifndef CRUNCH char o_beautify[1] = {FALSE}; char o_exrc[1] = {FALSE}; char o_mesg[1] = {TRUE}; char o_more[1] = {TRUE}; char o_novice[1] = {FALSE}; char o_prompt[1] = {TRUE}; char o_taglength[3] = {0, 0, 30}; char o_terse[1] = {FALSE}; char o_window[3] = {0, 1, 24}; char o_wrapmargin[3] = {0, 0, 255}; char o_writeany[1] = {FALSE}; #endif #ifndef NO_ERRLIST char o_cc[30] = {CC_COMMAND}; char o_make[30] = {MAKE_COMMAND}; #endif #ifndef NO_CHARATTR char o_charattr[1] = {FALSE}; #endif #ifndef NO_DIGRAPH char o_digraph[1] = {FALSE}; char o_flipcase[80] # ifdef CS_IBMPC = {"\207\200\201\232\202\220\204\216\206\217\221\222\224\231\244\245"} # endif # ifdef CS_LATIN1 /* initialized by initopts() */ # endif ; #endif #ifndef NO_SENTENCE char o_hideformat[1] = {FALSE}; #endif #ifndef NO_EXTENSIONS char o_inputmode[1] = {FALSE}; char o_ruler[1] = {FALSE}; #endif #ifndef NO_MAGIC char o_magic[1] = {TRUE}; #endif #ifndef NO_MODELINES char o_modelines[1] = {FALSE}; #endif #ifndef NO_SENTENCE char o_paragraphs[30] = "PPppIPLPQP"; char o_sections[30] = "NHSHSSSEse"; #endif #if MSDOS char o_pcbios[1] = {TRUE}; #endif #ifndef NO_SHOWMATCH char o_showmatch[1] = {FALSE}; #endif #ifndef NO_SHOWMODE char o_smd[1] = {FALSE}; #endif /* The following describes the names & types of all options */ #define BOOL 0 #define NUM 1 #define STR 2 #define SET 0x01 /* this option has had its value altered */ #define CANSET 0x02 /* this option can be set at any time */ #define RCSET 0x06 /* this option can be set in a .exrc file only */ #define NOSAVE 0x0a /* this option should never be saved by mkexrc */ #define WSET 0x20 /* is this the "window" size option? */ #define MR 0x40 /* does this option affect the way text is displayed? */ struct { char *name; /* name of an option */ char *nm; /* short name of an option */ char type; /* type of an option */ char flags; /* boolean: has this option been set? */ char *value; /* value */ } opts[] = { /* name type flags value */ { "autoindent", "ai", BOOL, CANSET, o_autoindent }, { "autoprint", "ap", BOOL, CANSET, o_autoprint }, { "autotab", "at", BOOL, CANSET, o_autotab }, { "autowrite", "aw", BOOL, CANSET, o_autowrite }, #ifndef CRUNCH { "beautify", "bf", BOOL, CANSET, o_beautify }, #endif #ifndef NO_ERRLIST { "cc", "cc", STR, CANSET, o_cc }, #endif #ifndef NO_CHARATTR { "charattr", "ca", BOOL, CANSET|MR, o_charattr }, #endif { "columns", "co", NUM, SET|NOSAVE|MR, o_columns }, #ifndef NO_DIGRAPH { "digraph", "dig", BOOL, CANSET, o_digraph }, #endif { "directory", "dir", STR, RCSET, o_directory }, { "edcompatible","ed", BOOL, CANSET, o_edcompatible }, { "equalprg", "ep", STR, CANSET, o_equalprg }, { "errorbells", "eb", BOOL, CANSET, o_errorbells }, #ifndef CRUNCH { "exrc", "exrc", BOOL, CANSET, o_exrc }, #endif { "exrefresh", "er", BOOL, CANSET, o_exrefresh }, { "flash", "vbell",BOOL, CANSET, o_flash }, #ifndef NO_DIGRAPH { "flipcase", "fc", STR, CANSET, o_flipcase }, #endif #ifndef NO_SENTENCE { "hideformat", "hf", BOOL, CANSET|MR, o_hideformat }, #endif { "ignorecase", "ic", BOOL, CANSET, o_ignorecase }, #ifndef NO_EXTENSIONS { "inputmode", "im", BOOL, CANSET, o_inputmode }, #endif { "keytime", "kt", NUM, CANSET, o_keytime }, { "keywordprg", "kp", STR, CANSET, o_keywordprg }, { "lines", "ls", NUM, SET|NOSAVE|MR, o_lines }, { "list", "li", BOOL, CANSET|MR, o_list }, #ifndef NO_MAGIC { "magic", "ma", BOOL, CANSET, o_magic }, #endif #ifndef NO_ERRLIST { "make", "mk", STR, CANSET, o_make }, #endif #ifndef CRUNCH { "mesg", "me", BOOL, CANSET, o_mesg }, #endif #ifndef NO_MODELINES { "modelines", "ml", BOOL, CANSET, o_modelines }, #endif #ifndef CRUNCH { "more", "mo", BOOL, CANSET, o_more }, { "novice", "nov", BOOL, CANSET, o_novice }, #endif { "number", "nu", BOOL, CANSET|MR, o_number }, #ifndef NO_SENTENCE { "paragraphs", "para", STR, CANSET, o_paragraphs }, #endif #if MSDOS { "pcbios", "pc", BOOL, SET|NOSAVE, o_pcbios }, #endif #ifndef CRUNCH { "prompt", "pr", BOOL, CANSET, o_prompt }, #endif { "readonly", "ro", BOOL, CANSET, o_readonly }, { "remap", "remap",BOOL, CANSET, o_remap }, { "report", "re", NUM, CANSET, o_report }, #ifndef NO_EXTENSIONS { "ruler", "ru", BOOL, CANSET, o_ruler }, #endif { "scroll", "sc", NUM, CANSET, o_scroll }, #ifndef NO_SENTENCE { "sections", "sect", STR, CANSET, o_sections }, #endif { "shell", "sh", STR, CANSET, o_shell }, #ifndef NO_SHOWMATCH { "showmatch", "sm", BOOL, CANSET, o_showmatch }, #endif #ifndef NO_SHOWMODE { "showmode", "smd", BOOL, CANSET, o_smd }, #endif { "shiftwidth", "sw", NUM, CANSET, o_shiftwidth }, { "sidescroll", "ss", NUM, CANSET, o_sidescroll }, { "sync", "sy", BOOL, CANSET, o_sync }, { "tabstop", "ts", NUM, CANSET|MR, o_tabstop }, #ifndef CRUNCH { "taglength", "tl", NUM, CANSET, o_taglength }, #endif { "term", "te", STR, SET, o_term }, #ifndef CRUNCH { "terse", "tr", BOOL, CANSET, o_terse }, { "timeout", "to", BOOL, CANSET, o_keytime }, #endif #ifndef CRUNCH { "window", "wi", NUM, CANSET|MR|WSET, o_window }, { "wrapmargin", "wm", NUM, CANSET, o_wrapmargin }, #endif { "wrapscan", "ws", BOOL, CANSET, o_wrapscan }, #ifndef CRUNCH { "writeany", "wr", BOOL, CANSET, o_writeany }, #endif { NULL, NULL, 0, CANSET, NULL } }; /* This function initializes certain options from environment variables, etc. */ void initopts() { char *val; int i; /* set some stuff from environment variables */ #if MSDOS if (val = getenv("COMSPEC")) /* yes, ASSIGNMENT! */ #else if (val = getenv("SHELL")) /* yes, ASSIGNMENT! */ #endif { strcpy(o_shell, val); } strcpy(o_term, termtype); #if MSDOS if (strcmp(termtype, "pcbios")) { o_pcbios[0] = FALSE; } else { o_pcbios[0] = TRUE; } #endif #if AMIGA || MSDOS || TOS if ((val = getenv("TMP")) /* yes, ASSIGNMENT! */ || (val = getenv("TEMP"))) strcpy(o_directory, val); #endif #ifndef CRUNCH if ((val = getenv("LINES")) && atoi(val) > 4) /* yes, ASSIGNMENT! */ { LINES = atoi(val); } if ((val = getenv("COLUMNS")) && atoi(val) > 30) /* yes, ASSIGNMENT! */ { COLS = atoi(val); } #endif *o_lines = LINES; *o_columns = COLS; *o_scroll = LINES / 2 - 1; #ifndef CRUNCH if (o_window[0] == 0) { o_window[0] = o_window[2] = *o_lines; } #endif /* disable the flash option if we don't know how to do a flash */ if (!has_VB) { for (i = 0; opts[i].value != o_flash; i++) { } opts[i].flags &= ~CANSET; *o_flash = FALSE; } #ifndef NO_DIGRAPH # ifdef CS_LATIN1 for (i = 0, val = o_flipcase; i < 32; i++) { /* leave out the multiply/divide symbols */ if (i == 23) continue; /* add lower/uppercase pair */ *val++ = i + 0xe0; *val++ = i + 0xc0; } *val = '\0'; # endif /* CS_LATIN1 */ /*A��A��A��A��A��A��A��A��A��A�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� initialize the ctype package */ _ct_init(o_flipcase); #else _ct_init(""); #endif /* not NO_DIGRAPH */ } /* This function lists the current values of all options */ void dumpopts(all) int all; /* boolean: dump all options, or just set ones? */ { #ifndef NO_OPTCOLS int i, j, k; char nbuf[4]; /* used for converting numbers to ASCII */ int widths[5]; /* width of each column, including gap */ int ncols; /* number of columns */ int nrows; /* number of options per column */ int nset; /* number of options to be output */ int width; /* width of a particular option */ int todump[60]; /* indicies of options to be dumped */ /* step 1: count the number of set options */ for (nset = i = 0; opts[i].name; i++) { if (all || (opts[i].flags & SET)) { todump[nset++] = i; } } /* step two: try to use as many columns as possible */ for (ncols = (nset > 5 ? 5 : nset); ncols > 1; ncols--) { /* how many would go in this column? */ nrows = (nset + ncols - 1) / ncols; /* figure out the width of each column */ for (i = 0; i < ncols; i++) { widths[i] = 0; for (j = 0, k = nrows * i; j < nrows && k < nset; j++, k++) { /* figure out the width of a particular option */ switch (opts[todump[k]].type) { case BOOL: if (!*opts[todump[k]].value) width = 2; else width = 0; break; case STR: width = 3 + strlen(opts[todump[k]].value); if (width > MAXWIDTH) width = MAXWIDTH; break; case NUM: width = 4; break; } width += strlen(opts[todump[k]].name); /* if this is the widest so far, widen col */ if (width > widths[i]) { widths[i] = width; } } } /* if the total width is narrow enough, then use it */ for (width = -2, i = 0; i < ncols; i++) { width += widths[i] + 2; } if (width < COLS - 1) { break; } } /* step 3: output the columns */ nrows = (nset + ncols - 1) / ncols; for (i = 0; i < nrows; i++) { for (j = 0; j < ncols; j++) { /* if we hit the end of the options, quit */ k = i + j * nrows; if (k >= nset) { break; } /* output this option's value */ width = 0; switch (opts[todump[k]].type) { case BOOL: if (!*opts[todump[k]].value) { qaddch('n'); qaddch('o'); width = 2; } qaddstr(opts[todump[k]].name); width += strlen(opts[todump[k]].name); break; case NUM: sprintf(nbuf, "%-3d", UCHAR(*opts[todump[k]].value)); qaddstr(opts[todump[k]].name); qaddch('='); qaddstr(nbuf); width = 4 + strlen(opts[todump[k]].name); break; case STR: qaddstr(opts[todump[k]].name); qaddch('='); qaddch('"'); strcpy(tmpblk.c, opts[todump[k]].value); width = 3 + strlen(tmpblk.c); if (width > MAXWIDTH) { width = MAXWIDTH; strcpy(tmpblk.c + MAXWIDTH - 6, "..."); } qaddstr(tmpblk.c); qaddch('"'); width += strlen(opts[todump[k]].name); break; } /* pad the field to the correct size */ if (k + nrows <= nset) { while (width < widths[j] + 2) { qaddch(' '); width++; } } } addch('\n'); exrefresh(); } #else int i; int col; char nbuf[4]; for (i = col = 0; opts[i].name; i++) { /* if not set and not all, ignore this option */ if (!all && !(opts[i].flags & SET)) { continue; } /* align this option in one of the columns */ if (col > 52) { addch('\n'); col = 0; } else if (col > 26) { while (col < 52) { qaddch(' '); col++; } } else if (col > 0) { while (col < 26) { qaddch(' '); col++; } } switch (opts[i].type) { case BOOL: if (!*opts[i].value) { qaddch('n'); qaddch('o'); col += 2; } qaddstr(opts[i].name); col += strlen(opts[i].name); break; case NUM: sprintf(nbuf, "%-3d", UCHAR(*opts[i].value)); qaddstr(opts[i].name); qaddch('='); qaddstr(nbuf); col += 4 + strlen(opts[i].name); break; case STR: qaddstr(opts[i].name); qaddch('='); qaddch('"'); qaddstr(opts[i].value); qaddch('"'); col += 3 + strlen(opts[i].name) + strlen(opts[i].value); break; } exrefresh(); } if (col > 0) { addch('\n'); exrefresh(); } #endif } #ifndef NO_MKEXRC /* This function saves the current configuration of options to a file */ void saveopts(fd) int fd; /* file descriptor to write to */ { int i; char buf[256], *pos; /* write each set options */ for (i = 0; opts[i].name; i++) { /* if unset or unsettable, ignore this option */ if ((opts[i].flags & (SET|CANSET|NOSAVE)) != (SET|CANSET)) { continue; } strcpy(buf, "set "); pos = &buf[4]; switch (opts[i].type) { case BOOL: if (!*opts[i].value) { *pos++='n'; *pos++='o'; } strcpy(pos, opts[i].name); strcat(pos, "\n"); break; case NUM: sprintf(pos, "%s=%-3d\n", opts[i].name, *opts[i].value & 0xff); break; case STR: sprintf(pos, "%s=\"%s\"\n", opts[i].name, opts[i].value); break; } twrite(fd, buf, (unsigned)strlen(buf)); } } #endif /* This function changes the values of one or more options. */ void setopts(assignments) char *assignments; /* a string containing option assignments */ { char *name; /* name of variable in assignments */ char *value; /* value of the variable */ char *scan; /* used for moving through strings */ char *build; /* used for copying chars from "scan" */ char *prefix; /* pointer to "neg" or "no" at front of a boolean */ int quote; /* boolean: inside '"' quotes? */ int i, j; #ifndef CRUNCH /* reset the upper limit of "window" option to lines-1 */ *o_window = *o_lines - 1; #endif /* for each assignment... */ for (name = assignments; *name; ) { /* skip whitespace */ if (*name == ' ' || *name == '\t') { name++; continue; } /* after the name, find the value (if any) */ for (scan = name; isalnum(*scan); scan++) { } if (*scan == '=') { *scan++ = '\0'; value = build = scan; for (quote = FALSE; *scan && (quote || !isspace(*scan)); scan++) { if (*scan == '"') { quote = !quote; } else if (*scan == '\\' && scan[1]) { *build++ = *++scan; } else { *build++ = *scan; } } if (*scan) scan++; *build = '\0'; } else /* no "=" so it is probably boolean... */ { if (*scan) { *scan++ = '\0'; } value = NULL; prefix = name; #ifndef CRUNCH if (!strcmp(name, "novice")) /* don't check for a "no" prefix */; else #endif if (prefix[0] == 'n' && prefix[1] == 'o') name += 2; else if (prefix[0] == 'n' && prefix[1] == 'e' && prefix[2] == 'g') name += 3; } /* find the variable */ for (i = 0; opts[i].name && strcmp(opts[i].name, name) && strcmp(opts[i].nm, name); i++) { } /* change the variable */ if (!opts[i].name) { msg("invalid option name \"%s\"", name); } else if ((opts[i].flags & CANSET) != CANSET) { msg("option \"%s\" can't be altered", name); } else if ((opts[i].flags & RCSET) != CANSET && nlines >= 1L) { msg("option \"%s\" can only be set in a %s file", name, EXRC); } else if (value) { switch (opts[i].type) { case BOOL: msg("option \"[no]%s\" is boolean", name); break; case NUM: j = atoi(value); if (j == 0 && *value != '0') { msg("option \"%s\" must have a numeric value", name); } else if (j < opts[i].value[1] || j > (opts[i].value[2] & 0xff)) { msg("option \"%s\" must have a value between %d and %d", name, opts[i].value[1], opts[i].value[2] & 0xff); } else { *opts[i].value = atoi(value); opts[i].flags |= SET; } break; case STR: strcpy(opts[i].value, value); opts[i].flags |= SET; break; } if (opts[i].flags & MR) { redraw(MARK_UNSET, FALSE); } #ifndef CRUNCH if (opts[i].flags & WSET) { wset = TRUE; } #endif } else /* valid option, no value */ { if (opts[i].type == BOOL) { if (prefix == name) *opts[i].value = TRUE; else if (prefix[1] == 'o') *opts[i].value = FALSE; else *opts[i].value = !*opts[i].value; opts[i].flags |= SET; if (opts[i].flags & MR) { redraw(MARK_UNSET, FALSE); } } else { msg("option \"%s\" must be given a value", name); } } /* move on to the next option */ name = scan; } /* special processing ... */ #ifndef CRUNCH /* if "novice" is set, then ":set report=1 showmode nomagic" */ if (*o_novice) { *o_report = 1; # ifndef NO_SHOWMODE *o_smd = TRUE; # endif # ifndef NO_MAGIC *o_magic = FALSE; # endif } #endif /* if "readonly" then set the READONLY flag for this file */ if (*o_readonly) { setflag(file, READONLY); } #ifndef NO_DIGRAPH /* re-initialize the ctype package */ _ct_init(o_flipcase); #endif /* not NO_DIGRAPH */ /* copy o_lines and o_columns into LINES and COLS */ LINES = (*o_lines & 255); COLS = (*o_columns & 255); } ������������������������������������������������������������������������������������������������������������������������������������������������������/* prsvunix.c */ /* This file contains the UNIX-specific parts of the "elvprsv" program. */ #if OSK #define ELVPRSV #include "osk.c" #else #include <sys/stat.h> #include <pwd.h> #endif extern struct passwd *getpwuid(); /* This variable is used to add extra error messages for mail sent to root */ char *ps; /* This function returns the login name of the owner of a file */ char *ownername(filename) char *filename; /* name of a file */ { struct stat st; struct passwd *pw; /* stat the file, to get its uid */ if (stat(filename, &st) < 0) { ps = "stat() failed"; return "root"; } /* get the /etc/passwd entry for that user */ pw = getpwuid(st.st_uid); if (!pw) { ps = "uid not found in password file"; return "root"; } /* return the user's name */ return pw->pw_name; } /* This function sends a mail message to a given user, saying that a file * has been preserved. */ void mail(user, file, when) char *user; /* name of user who should receive the mail */ char *file; /* name of original text file that was preserved */ char *when; /* description of why the file was preserved */ { char cmd[80];/* buffer used for constructing a "mail" command */ FILE *m, *popen(); /* stream used for giving text to the "mail" program */ char *base; /* basename of the file */ /* separate the directory name from the basename. */ for (base = file + strlen(file); --base > file && *base != SLASH; ) { } if (*base == SLASH) { *base++ = '\0'; } /* for anonymous buffers, pretend the name was "foo" */ if (!strcmp(base, "*")) { base = "foo"; } /* open a pipe to the "mail" program */ #if OSK sprintf(cmd, "mail \"-s=%s preserved!\" %s", base, user); #else /* ANY_UNIX */ sprintf(cmd, "mail %s >/dev/null 2>/dev/null", user); #endif m = popen(cmd, "w"); if (!m) { /* Can't send mail! Hope the user figures it out. */ return; } /* Tell the user that the file was preserved */ fprintf(m, "A version of your file \"%s%c%s\"\n", file, SLASH, base); fprintf(m, "was preserved when %s.\n", when); fprintf(m, "To recover this file, do the following:\n"); fprintf(m, "\n"); #if OSK fprintf(m, " chd %s\n", file); #else /* ANY_UNIX */ fprintf(m, " cd %s\n", file); #endif fprintf(m, " elvrec %s\n", base); fprintf(m, "\n"); fprintf(m, "With fond wishes for a speedy recovery,\n"); fprintf(m, " Elvis\n"); if (ps) { fprintf(m, "\nP.S. %s\n", ps); ps = (char *)0; } /* close the stream */ pclose(m); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* recycle.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the functions perform garbage collection and allocate * reusable blocks. */ #include "config.h" #include "vi.h" #ifndef NO_RECYCLE /* this whole file would have be skipped if NO_RECYCLE is defined */ #define BTST(bitno, byte) ((byte) & (1 << (bitno))) #define BSET(bitno, byte) ((byte) |= (1 << (bitno))) #define BCLR(bitno, byte) ((byte) &= ~(1 << (bitno))) #define TST(blkno) ((blkno) < MAXBIT ? BTST((blkno) & 7, bitmap[(blkno) >> 3]) : 1) #define SET(blkno) if ((blkno) < MAXBIT) BSET((blkno) & 7, bitmap[(blkno) >> 3]) #define CLR(blkno) if ((blkno) < MAXBIT) BCLR((blkno) & 7, bitmap[(blkno) >> 3]) /* bitmap of free blocks in first 4096k of tmp file */ static unsigned char bitmap[512]; #define MAXBIT (sizeof bitmap << 3) /* this function locates all free blocks in the current tmp file */ void garbage() { int i; BLK oldhdr; /* start by assuming every block is free */ for (i = 0; i < sizeof bitmap; i++) { bitmap[i] = 255; } /* header blocks aren't free */ #ifndef lint CLR(0); CLR(1); #endif /* blocks needed for current hdr aren't free */ for (i = 1; i < MAXBLKS; i++) { CLR(hdr.n[i]); } /* blocks needed for undo version aren't free */ lseek(tmpfd, 0L, 0); if (read(tmpfd, &oldhdr, (unsigned)sizeof oldhdr) != sizeof oldhdr) { msg("garbage() failed to read oldhdr??"); for (i = 0; i < sizeof bitmap; i++) { bitmap[i] = 0; } return; } for (i = 1; i < MAXBLKS; i++) { CLR(oldhdr.n[i]); } /* blocks needed for cut buffers aren't free */ for (i = cutneeds(&oldhdr) - 1; i >= 0; i--) { CLR(oldhdr.n[i]); } } /* This function allocates the first available block in the tmp file */ long allocate() { int i; long offset; /* search for the first byte with a free bit set */ for (i = 0; i < sizeof bitmap && bitmap[i] == 0; i++) { } /* if we hit the end of the bitmap, return the end of the file */ if (i == sizeof bitmap) { offset = lseek(tmpfd, 0L, 2); } else /* compute the offset for the free block */ { for (i <<= 3; TST(i) == 0; i++) { } offset = (long)i * (long)BLKSIZE; /* mark the block as "allocated" */ CLR(i); } return offset; } #endif #ifdef DEBUG # include <stdio.h> # undef malloc # undef free # define MEMMAGIC 0x19f72cc0L # define MAXALLOC 800 static char *allocated[MAXALLOC]; static char *fromfile[MAXALLOC]; static int fromline[MAXALLOC]; static int sizes[MAXALLOC]; char *dbmalloc(size, file, line) int size; char *file; int line; { char *ret; int i; size = size + sizeof(long) - (size % sizeof(long)); ret = (char *)malloc(size + 2 * sizeof(long)) + sizeof(long); for (i = 0; i < MAXALLOC && allocated[i]; i++) { } if (i == MAXALLOC) { endwin(); fprintf(stderr, "\r\n%s(%d): Too many malloc calls!\n", file, line); abort(); } sizes[i] = size/sizeof(long); allocated[i] = ret; fromfile[i] = file; fromline[i] = line; ((long *)ret)[-1] = MEMMAGIC; ((long *)ret)[sizes[i]] = MEMMAGIC; return ret; } dbfree(ptr, file, line) char *ptr; char *file; int line; { int i; for (i = 0; i < MAXALLOC && allocated[i] != ptr; i++) { } if (i == MAXALLOC) { endwin(); fprintf(stderr, "\r\n%s(%d): attempt to free mem that wasn't allocated\n", file, line); abort(); } allocated[i] = (char *)0; if (((long *)ptr)[-1] != MEMMAGIC) { endwin(); fprintf(stderr, "\r\n%s(%d): underflowed malloc space, allocated at %s(%d)\n", file, line, fromfile[i], fromline[i]); abort(); } if (((long *)ptr)[sizes[i]] != MEMMAGIC) { endwin(); fprintf(stderr, "\r\n%s(%d): overflowed malloc space, allocated at %s(%d)\n", file, line, fromfile[i], fromline[i]); abort(); } free(ptr - sizeof(long)); } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* redraw.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains functions that draw text on the screen. The major entry * points are: * redrawrange() - called from modify.c to give hints about what parts * of the screen need to be redrawn. * redraw() - redraws the screen (or part of it) and positions * the cursor where it belongs. * idx2col() - converts a markidx() value to a logical column number. */ #include "config.h" #include "vi.h" /* This variable contains the line number that smartdrawtext() knows best */ static long smartlno; /* This function remembers where changes were made, so that the screen can be * redraw in a more efficient manner. */ static long redrawafter; /* line# of first line that must be redrawn */ static long preredraw; /* line# of last line changed, before change */ static long postredraw; /* line# of last line changed, after change */ static int mustredraw; /* boolean: anything forcing a screen update? */ void redrawrange(after, pre, post) long after; /* lower bound of redrawafter */ long pre; /* upper bound of preredraw */ long post; /* upper bound of postredraw */ { if (after == redrawafter) { /* multiple insertions/deletions at the same place -- combine * them */ preredraw -= (post - pre); if (postredraw < post) { preredraw += (post - postredraw); postredraw = post; } if (redrawafter > preredraw) { redrawafter = preredraw; } if (redrawafter < 1L) { redrawafter = 0L; preredraw = postredraw = INFINITY; } } else if (postredraw > 0L) { /* multiple changes in different places -- redraw everything * after "after". */ postredraw = preredraw = INFINITY; if (after < redrawafter) redrawafter = after; } else { /* first change */ redrawafter = after; preredraw = pre; postredraw = post; } mustredraw = TRUE; } #ifndef NO_CHARATTR /* see if a given line uses character attribute strings */ static int hasattr(lno, text) long lno; /* the line# of the cursor */ REG char *text; /* the text of the line, from fetchline */ { static long plno; /* previous line number */ static long chgs; /* previous value of changes counter */ static int panswer;/* previous answer */ char *scan; /* if charattr is off, then the answer is "no, it doesn't" */ if (!*o_charattr) { chgs = 0; /* <- forces us to check if charattr is later set */ return FALSE; } /* if we already know the answer, return it... */ if (lno == plno && chgs == changes) { return panswer; } /* get the line & look for "\fX" */ if (!text[0] || !text[1] || !text[2]) { panswer = FALSE; } else { for (scan = text; scan[2] && !(scan[0] == '\\' && scan[1] == 'f'); scan++) { } panswer = (scan[2] != '\0'); } /* save the results */ plno = lno; chgs = changes; /* return the results */ return panswer; } #endif #ifndef NO_VISIBLE /* This function checks to make sure that the correct lines are shown in * reverse-video. This is used to handle the "v" and "V" commands. */ static long vizlow, vizhigh; /* the starting and ending lines */ static int vizleft, vizright; /* starting & ending indicies */ static int vizchange; /* boolean: must use stupid drawtext? */ static void setviz(curs) MARK curs; { long newlow, newhigh; long extra = 0L; /* for now, assume the worst... */ vizchange = TRUE; /* set newlow & newhigh according to V_from and cursor */ if (!V_from) { /* no lines should have reverse-video */ if (vizlow) { redrawrange(vizlow, vizhigh + 1L, vizhigh + 1L); vizlow = vizhigh = 0L; } else { vizchange = FALSE; } return; } /* figure out which lines *SHOULD* have hilites */ if (V_from < curs) { newlow = markline(V_from); newhigh = markline(curs); vizleft = markidx(V_from); vizright = markidx(curs) + 1; } else { newlow = markline(curs); newhigh = markline(V_from); vizleft = markidx(curs); vizright = markidx(V_from) + 1; } /* adjust for line-mode hiliting */ if (V_linemd) { vizleft = 0; vizright = BLKSIZE - 1; } else { extra = 1L; } /* arrange for the necessary lines to be redrawn */ if (vizlow == 0L) { /* just starting to redraw */ redrawrange(newlow, newhigh, newhigh); } else { /* Were new lines added/removed at the front? */ if (newlow != vizlow) { if (newlow < vizlow) redrawrange(newlow, vizlow + extra, vizlow + extra); else redrawrange(vizlow, newlow + extra, newlow + extra); } /* Were new lines added/removed at the back? */ if (newhigh != vizhigh) { if (newhigh < vizhigh) redrawrange(newhigh + 1L - extra, vizhigh + 1L, vizhigh + 1L); else redrawrange(vizhigh + 1L - extra, newhigh, newhigh); } } /* remember which lines will contain hilighted text now */ vizlow = newlow; vizhigh = newhigh; } #endif /* !NO_VISIBLE */ /* This function converts a MARK to a column number. It doesn't automatically * adjust for leftcol; that must be done by the calling function */ int idx2col(curs, text, inputting) MARK curs; /* the line# & index# of the cursor */ REG char *text; /* the text of the line, from fetchline */ int inputting; /* boolean: called from input() ? */ { static MARK pcursor;/* previous cursor, for possible shortcut */ static MARK pcol; /* column number for pcol */ static long chgs; /* previous value of changes counter */ REG int col; /* used to count column numbers */ REG int idx; /* used to count down the index */ REG int i; /* for now, assume we have to start counting at the left edge */ col = 0; idx = markidx(curs); /* if the file hasn't changed & line number is the same & it has no * embedded character attribute strings, can we do shortcuts? */ if (chgs == changes && !((curs ^ pcursor) & ~(BLKSIZE - 1)) #ifndef NO_CHARATTR && !hasattr(markline(curs), text) #endif ) { /* no movement? */ if (curs == pcursor) { /* return the column of the char; for tabs, return its last column */ if (text[idx] == '\t' && !inputting && !*o_list) { return pcol + *o_tabstop - (pcol % *o_tabstop) - 1; } else { return pcol; } } /* movement to right? */ if (curs > pcursor) { /* start counting from previous place */ col = pcol; idx = markidx(curs) - markidx(pcursor); text += markidx(pcursor); } } /* count over to the char after the idx position */ while (idx > 0 && (i = *text)) /* yes, ASSIGNMENT! */ { if (i == '\t' && !*o_list) { col += *o_tabstop; col -= col % *o_tabstop; } else if (i >= '\0' && i < ' ' || i == '\177') { col += 2; } #ifndef NO_CHARATTR else if (i == '\\' && text[1] == 'f' && text[2] && *o_charattr) { text += 2; /* plus one more at bottom of loop */ idx -= 2; } #endif else { col++; } text++; idx--; } /* save stuff to speed next call */ pcursor = curs; pcol = col; chgs = changes; /* return the column of the char; for tabs, return its last column */ if (*text == '\t' && !inputting && !*o_list) { return col + *o_tabstop - (col % *o_tabstop) - 1; } else { return col; } } /* This function is similar to idx2col except that it takes care of sideways * scrolling - for the given line, at least. */ int mark2phys(m, text, inputting) MARK m; /* a mark to convert */ char *text; /* the line that m refers to */ int inputting; /* boolean: caled from input() ? */ { int i; i = idx2col(m, text, inputting); while (i < leftcol) { leftcol -= *o_sidescroll; mustredraw = TRUE; redrawrange(1L, INFINITY, INFINITY); } while (i > rightcol) { leftcol += *o_sidescroll; mustredraw = TRUE; redrawrange(1L, INFINITY, INFINITY); } physrow = markline(m) - topline; physcol = i - leftcol; if (*o_number) physcol += 8; return physcol; } /* This function draws a single line of text on the screen. The screen's * cursor is assumed to be located at the leftmost column of the appropriate * row. */ static void drawtext(text, lno, clr) REG char *text; /* the text to draw */ long lno; /* the number of the line to draw */ int clr; /* boolean: do a clrtoeol? */ { REG int coA��A��A��A��A��A��A��A��A��A��A��A��A��A��A��A��A��A������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l; /* column number */ REG int i; REG int tabstop; /* *o_tabstop */ REG int limitcol; /* leftcol or leftcol + COLS */ int abnormal; /* boolean: charattr != A_NORMAL? */ #ifndef NO_VISIBLE int rev; /* boolean: standout mode, too? */ int idx = 0; #endif char numstr[9]; /* show the line number, if necessary */ if (*o_number) { sprintf(numstr, "%6ld |", lno); qaddstr(numstr); } #ifndef NO_SENTENCE /* if we're hiding format lines, and this is one of them, then hide it */ if (*o_hideformat && *text == '.') { clrtoeol(); #if OSK qaddch('\l'); #else qaddch('\n'); #endif return; } #endif /* move some things into registers... */ limitcol = leftcol; tabstop = *o_tabstop; abnormal = FALSE; #ifndef CRUNCH if (clr) clrtoeol(); #endif /* skip stuff that was scrolled off left edge */ for (col = 0; (i = *text) && col < limitcol; /* yes, ASSIGNMENT! */ text++) { #ifndef NO_VISIBLE idx++; #endif if (i == '\t' && !*o_list) { col = col + tabstop - (col % tabstop); } else if (i >= 0 && i < ' ' || i == '\177') { col += 2; } #ifndef NO_CHARATTR else if (i == '\\' && text[1] == 'f' && text[2] && *o_charattr) { text += 2; /* plus one more as part of "for" loop */ /* since this attribute might carry over, we need it */ switch (*text) { case 'R': case 'P': attrset(A_NORMAL); abnormal = FALSE; break; case 'B': attrset(A_BOLD); abnormal = TRUE; break; case 'U': attrset(A_UNDERLINE); abnormal = TRUE; break; case 'I': attrset(A_ALTCHARSET); abnormal = TRUE; break; } } #endif else { col++; } } #ifndef NO_VISIBLE /* Should we start hiliting at the first char of this line? */ if ((lno > vizlow && lno <= vizhigh || lno == vizlow && vizleft < idx) && !(lno == vizhigh && vizright < idx)) { do_VISIBLE(); rev = TRUE; } #endif /* adjust for control char that was partially visible */ while (col > limitcol) { qaddch(' '); limitcol++; } /* now for the visible characters */ limitcol = leftcol + COLS; if (*o_number) limitcol -= 8; for (; (i = *text) && col < limitcol; text++) { #ifndef NO_VISIBLE /* maybe turn hilite on/off in the middle of the line */ if (lno == vizlow && vizleft == idx) { do_VISIBLE(); rev = TRUE; } if (lno == vizhigh && vizright == idx) { do_SE(); rev = FALSE; } idx++; /* if hiliting, never emit physical tabs */ if (rev && i == '\t' && !*o_list) { i = col + tabstop - (col % tabstop); do { qaddch(' '); col++; } while (col < i); } else #endif /* !NO_VISIBLE */ if (i == '\t' && !*o_list) { i = col + tabstop - (col % tabstop); if (i < limitcol) { #ifdef CRUNCH if (!clr && has_PT && !((i - leftcol) & 7)) #else if (has_PT && !((i - leftcol) & 7)) #endif { do { qaddch('\t'); col += 8; /* not exact! */ } while (col < i); col = i; /* NOW it is exact */ } else { do { qaddch(' '); col++; } while (col < i); } } else /* tab ending after screen? next line! */ { col = limitcol; if (has_AM) { addch('\n'); /* GB */ } } } else if (i >= 0 && i < ' ' || i == '\177') { col += 2; qaddch('^'); if (col <= limitcol) { qaddch(i ^ '@'); } } #ifndef NO_CHARATTR else if (i == '\\' && text[1] == 'f' && text[2] && *o_charattr) { text += 2; /* plus one more as part of "for" loop */ switch (*text) { case 'R': case 'P': attrset(A_NORMAL); abnormal = FALSE; break; case 'B': attrset(A_BOLD); abnormal = TRUE; break; case 'U': attrset(A_UNDERLINE); abnormal = TRUE; break; case 'I': attrset(A_ALTCHARSET); abnormal = TRUE; break; } } #endif else { col++; qaddch(i); } } /* get ready for the next line */ #ifndef NO_CHARATTR if (abnormal) { attrset(A_NORMAL); } #endif if (*o_list && col < limitcol) { qaddch('$'); col++; } #ifndef NO_VISIBLE /* did we hilite this whole line? If so, STOP! */ if (rev) { do_SE(); } #endif #ifdef CRUNCH if (clr && col < limitcol) { clrtoeol(); } #endif if (!has_AM || col < limitcol) { addch('\n'); } wqrefresh(); } #ifndef CRUNCH static void nudgecursor(same, scan, new, lno) int same; /* number of chars to be skipped over */ char *scan; /* where the same chars end */ char *new; /* where the visible part of the line starts */ long lno; /* line number of this line */ { int col; if (same > 0) { if (same < 5) { /* move the cursor by overwriting */ while (same > 0) { qaddch(scan[-same]); same--; } } else { /* move the cursor by calling move() */ col = (int)(scan - new); if (*o_number) col += 8; move((int)(lno - topline), col); } } } #endif /* not CRUNCH */ /* This function draws a single line of text on the screen, possibly with * some cursor optimization. The cursor is repositioned before drawing * begins, so its position before doesn't really matter. */ static void smartdrawtext(text, lno, showit) REG char *text; /* the text to draw */ long lno; /* line number of the text */ int showit; /* boolean: output line? (else just remember it) */ { #ifdef CRUNCH move((int)(lno - topline), 0); if (showit) { drawtext(text, lno, TRUE); } #else /* not CRUNCH */ static char old[256]; /* how the line looked last time */ char new[256]; /* how it looks now */ char *build; /* used to put chars into new[] */ char *scan; /* used for moving thru new[] or old[] */ char *end; /* last non-blank changed char */ char *shift; /* used to insert/delete chars */ int same; /* length of a run of unchanged chars */ int limitcol; int col; int i; char numstr[9]; # ifndef NO_CHARATTR /* if this line has attributes, do it the dumb way instead */ if (hasattr(lno, text)) { move((int)(lno - topline), 0); drawtext(text, lno, TRUE); return; } # endif # ifndef NO_SENTENCE /* if this line is a format line, & we're hiding format lines, then * let the dumb drawtext() function handle it */ if (*o_hideformat && *text == '.') { move((int)(lno - topline), 0); drawtext(text, lno, TRUE); return; } # endif # ifndef NO_VISIBLE if (vizchange) { move((int)(lno - topline), 0); drawtext(text, lno, TRUE); smartlno = 0L; return; } # endif /* skip stuff that was scrolled off left edge */ limitcol = leftcol; for (col = 0; (i = *text) && col < limitcol; /* yes, ASSIGNMENT! */ text++) { if (i == '\t' && !*o_list) { col = col + *o_tabstop - (col % *o_tabstop); } else if (i >= 0 && i < ' ' || i == '\177') { col += 2; } else { col++; } } /* adjust for control char that was partially visible */ build = new; while (col > limitcol) { *build++ = ' '; limitcol++; } /* now for the visible characters */ limitcol = leftcol + COLS; if (*o_number) limitcol -= 8; for (; (i = *text) && col < limitcol; text++) { if (i == '\t' && !*o_list) { i = col + *o_tabstop - (col % *o_tabstop); while (col < i && col < limitcol) { *build++ = ' '; col++; } } else if (i >= 0 && i < ' ' || i == '\177') { col += 2; *build++ = '^'; if (col <= limitcol) { *build++ = (i ^ '@'); } } else { col++; *build++ = i; } } if (col < limitcol && *o_list) { *build++ = '$'; col++; } end = build; while (col < limitcol) { *build++ = ' '; col++; } /* if we're just supposed to remember this line, then remember it */ if (!showit) { smartlno = lno; strncpy(old, new, COLS); return; } /* locate the last non-blank character */ while (end > new && end[-1] == ' ') { end--; } /* can we optimize the displaying of this line? */ if (lno != smartlno) { /* nope, can't optimize - different line */ move((int)(lno - topline), 0); /* show the line number, if necessary */ if (*o_number) { sprintf(numstr, "%6ld |", lno); qaddstr(numstr); } /* show the new line */ for (scan = new, build = old; scan < end; ) { qaddch(*scan); *build++ = *scan++; } if (end < new + COLS - (*o_number ? 8 : 0)) { clrtoeol(); while (build < old + COLS) { *build++ = ' '; } } smartlno = lno; return; } /* skip any initial unchanged characters */ for (scan = new, build = old; scan < end && *scan == *build; scan++, build++) { } i = (scan - new); if (*o_number) i += 8; move((int)(lno - topline), i); /* The in-between characters must be changed */ same = 0; while (scan < end) { /* is this character a match? */ if (scan[0] == build[0]) { same++; } else /* do we want to insert? */ if (scan < end - 1 && scan[1] == build[0] && (has_IC || has_IM)) { nudgecursor(same, scan, new, lno); same = 0; insch(*scan); for (shift = old + COLS; --shift > build; ) { shift[0] = shift[-1]; } *build = *scan; } else /* do we want to delete? */ if (build < old + COLS - 1 && scan[0] == build[1] && has_DC) { nudgecursor(same, scan, new, lno); same = 0; delch(); same++; for (shift = build; shift < old + COLS - 1; shift++) { shift[0] = shift[1]; } if (*o_number) shift -= 8; *shift = ' '; } else /* we must overwrite */ { nudgecursor(same, scan, new, lno); same = 0; addch(*scan); *build = *scan; } build++; scan++; } /* maybe clear to EOL */ end = old + COLS - (*o_number ? 8 : 0); while (build < end && *build == ' ') { build++; } if (build < end) { nudgecursor(same, scan, new, lno); same = 0; clrtoeol(); while (build < old + COLS) { *build++ = ' '; } } #endif /* not CRUNCH */ } /* This function is used in visual mode for drawing the screen (or just parts * of the screen, if that's all thats needed). It also takes care of * scrolling. */ void redraw(curs, inputting) MARK curs; /* where to leave the screen's cursor */ int inputting; /* boolean: being called from input() ? */ { char *text; /* a line of text to display */ static long chgs; /* previous changes level */ long l; int i; #ifndef CRUNCH static long showtop; /* top line in window */ static long showbottom; /* bottom line in window */ #endif /* if curs == MARK_UNSET, then we should reset internal vars */ if (curs == MARK_UNSET) { if (topline < 1 || topline > nlines) { topline = 1L; } else { move(LINES - 1, 0); clrtoeol(); } leftcol = 0; mustredraw = TRUE; redrawafter = INFINITY; preredraw = 0L; postredraw = 0L; chgs = 0; smartlno = 0L; #ifndef NO_VISIBLE vizlow = vizhigh = 0L; vizchange = FALSE; #endif #ifndef CRUNCH showtop = 0; showbottom = INFINITY; #endif return; } #ifndef NO_VISIBLE /* adjustments to hilited area may force extra lines to be redrawn. */ setviz(curs); #endif /* figure out which column the cursor will be in */ l = markline(curs); text = fetchline(l); mark2phys(curs, text, inputting); #ifndef NO_COLOR fixcolor(); #endif /* adjust topline, if necessary, to get the cursor on the screen */ if (l >= topline && l <= botline) { /* it is on the screen already */ /* if the file was changed but !mustredraw, then redraw line */ if (!mustredraw && (chgs != changes #ifndef NO_VISIBLE || V_from #endif #ifndef CRUNCH || l < showtop || l > showbottom #endif )) { smartdrawtext(text, l, (chgs != changes)); } } else if (l < topline && l > topline - LINES && (has_SR || has_AL)) { /* near top - scroll down */ if (!mustredraw) { move(0,0); while (l < topline) { topline--; if (has_SR) { do_SR(); } else { insertln(); } text = fetchline(topline); drawtext(text, topline, FALSE); do_UP(); } /* blank out the last line */ move(LINES - 1, 0); clrtoeol(); } else { topline = l; redrawrange(0L, INFINITY, INFINITY); } } else if (l > topline && l < botline + LINES) { /* near bottom -- scroll up */ if (!mustredraw) { move(LINES - 1,0); clrtoeol(); while (l > botline) { topline++; /* <-- also adjusts botline */ text = fetchline(botline); drawtext(text, botline, FALSE); } #ifndef CRUNCH showbottom = l; #endif } else { topline = l - (LINES - 2); redrawrange(0L, INFINITY, INFINITY); } } else { /* distant line - center it & force a redraw */ topline = l - (LINES / 2) - 1; if (topline < 1) { topline = 1; } redrawrange(0L, INFINITY, INFINITY); changes++; } #ifndef CRUNCH /* make sure the current line is included in the "window" */ if (l < showtop) { redrawrange(l, showtop, showtop); showtop = l; } if (l > showbottom) { redrawrange(showbottom, l, l); showbottom = l; } #endif /* Now... do we really have to redraw? */ if (mustredraw) { /* If redrawfter (and friends) aren't set, assume we should * redraw everything. */ if (redrawafter == INFINITY) { redrawafter = 0L; preredraw = postredraw = INFINITY; } #ifndef CRUNCH /* shrink the window, if possible */ if (showtop < topline) { showtop = topline; } if (showbottom > botline) { showbottom = botline; } if (postredraw == INFINITY) { /* these will be set to more reasonable values later */ showtop = INFINITY; showbottom = 0L; } #endif /* adjust smartlno to correspond with inserted/deleted lines */ if (smartlno >= redrawafter) { if (smartlno < preredraw && postredraw != preredraw) /*!!!*/ { smartlno = 0L; } else { smartlno += (postredraw - preredraw); } } /* should we insert some lines into the screen? */ if (preredraw < postredraw && preredraw <= botline) { /* lines were inserted into the file */ /* decide where insertion should start */ if (preredraw < topline) { l = topline; } else { l = preredraw; } /* insert the lines... maybe */ if (l + postredraw - preredraw > botline || !has_AL || *o_number) { /* Whoa! a whole screen full - just redraw */ preredraw = postredraw = INFINITY; } else { /* really insert 'em */ move((int)(l - topline), 0); for (i = postredraw - preredraw; i > 0; i--) { insertln(); } /* NOTE: the contents of those lines will be * drawn as part of the regular redraw loop. */ /* clear the last line */ move(LINES - 1, 0); clrtoeol(); } } /* do we want to delete some lines from the screen? */ if (preredraw > postredraw && postredraw <= botline) { if (preredraw > botline || !has_DL || *o_number) { postredraw = preredraw = INFINITY; } else /* we'd best delete some lines from the screen */ { /* clear the last line, so it doesn't look * ugly as it gets pulled up into the screen */ move(LINES - 1, 0); clrtoeol(); /* delete the lines */ move((int)(postredraw - topline), 0); for (l = postredraw; l < preredraw && l <= botline; l++) { deleteln(); } /* draw the lines that are now newly visible * at the bottom of the screen */ i = LINES - 1 + (postredraw - preredraw); move(i, 0); for (l = topline + i; l <= botline; l++) { /* clear this line */ clrtoeol(); /* draw the line, or ~ for non-lines */ if (l <= nlines) { text = fetchline(l); drawtext(text, l, FALSE); } else { addstr("~\n"); } } } } /* redraw the current line */ l = markline(curs); pfetch(l); smartdrawtext(ptext, l, TRUE); #ifndef CRUNCH /* decide which lines must be in the "window" around the cursor */ l = markline(curs); if ((*o_window & 0xff) + 1 == LINES) { showtop = 1; showbottom = INFINITY; } else if (l < showtop || l > showbottom) { l -= (*o_window & 0xff) / 2; if (l < topline) { l = topline; } if (l < showtop) { showtop = l; } l += (*o_window & 0xff) - 1; if (l > botline) { showtop = showtop - l + botline; l = botline; } if (l > showbottom) { showbottom = l; } } #endif /* decide where we should start redrawing from */ if (redrawafter < topline) { l = topline; } else { l = redrawafter; } if (l <= botline && l < postredraw && (l != smartlno || botline != smartlno)) { /* draw the other lines */ move((int)(l - topline), 0); for (; l <= botline && l < postredraw; l++) { /* we already drew the current line, so skip it now */ if (l == smartlno) { #if OSK qaddch('\l'); #else qaddch('\n'); #endif continue; } /* draw the line, or ~ for non-lines */ if (l > nlines) { qaddch('~'); clrtoeol(); addch('\n'); } #ifndef CRUNCH else if (l < showtop || l > showbottom) { qaddch('@'); clrtoeol(); addch('\n'); } #endif else { text = fetchline(l); drawtext(text, l, TRUE); } } } mustredraw = FALSE; } /* force total (non-partial) redraw next time if not set */ redrawafter = INFINITY; preredraw = 0L; postredraw = 0L; /* move the cursor to where it belongs */ move((int)(markline(curs) - topline), physcol); wqrefresh(); chgs = changes; } ������������������/* ref2.c */ /* This is a totally rewritten version of ref. This version looks for the * desired function name in the "tags" file, and then reads the header out * from the source file. There is no longer any need for a "refs" file. * * Usage: ref [-a] [-t] [-f file] [-c class] tag * Options: -t output tag info, not the description * -f file default filename for static functions * -c class default class names for class functions */ #include <stdio.h> #include "config.h" extern char *getenv(); extern char *fgets(); /* This is the default path that is searched for tags */ #if OSK # define DEFTAGPATH ".:/dd/defs:/dd/defs/sys:/dd/usr/src/lib:../lib:/dd/usr/lib" #else # if ANY_UNIX # define DEFTAGPATH ".:/usr/include:/usr/include/sys:/usr/src/lib:../lib:/usr/local/lib" # else # if MSDOS || TOS # define DEFTAGPATH ".;C:\\include;C:\\include\\sys;C:\\lib;..\\lib" # define SEP ';' # else # if AMIGA # define DEFTAGPATH ".;Include:;Include:sys" # define SEP ';' # else /* any other OS */ # define DEFTAGPATH "." # endif # endif # endif #endif #ifndef SEP # define SEP ':' #endif /* These variables reflect the command-line options given by the user. */ int taginfo; /* boolean: give only the tag info? (not header?) */ char *def_file; /* default filename for static functions */ char *def_class; /* default classname for class members */ int colons; /* #colons in tag: 0=normal, 1=static, 2=member */ /* This function checks for a tag in the "tags" file of given directory. * If the tag is found, then it returns a pointer to a static buffer which * contains the filename, a tab character, and a linespec for finding the * the tag. If the tag is not found in the "tags" file, or if the "tags" * file cannot be opened or doesn't exist, then this function returns NULL. */ char *cktagdir(tag, dir) char *tag; /* name of the tag to look for */ char *dir; /* name of the directory to check */ { char buf[BLKSIZE]; static char found[BLKSIZE]; FILE *tfile; int len; #if AMIGA if (dir[strlen(dir) - 1] == COLON) sprintf(buf, "%s%s", dir, TAGS); /* no slash after colon. */ else #endif /* construct the name of the "tags" file in this directory */ sprintf(buf, "%s%c%s", dir, SLASH, TAGS); /* Try to open the tags file. Return NULL if can't open */ #if AMIGA if (buf[0] == '.' && buf[1] == SLASH) tfile = fopen(&buf[2], "r"); else #endif tfile = fopen(buf, "r"); if (!tfile) { return (char *)0; } /* compute the length of the tagname once */ len = strlen(tag); /* read lines until we get the one for this tag */ found[0] = '\0'; while (fgets(buf, sizeof buf, tfile)) { /* is this the one we want? */ if (!strncmp(buf, tag, len) && buf[len] == '\t') { /* we've found a match -- remember it */ strcpy(found, buf); /* if there is no default file, or this match is in * the default file, then we've definitely found the * one we want. Break out of the loop now. */ if (!def_file || !strncmp(&buf[len + 1], def_file, strlen(def_file))) { break; } } } /* we're through reading */ fclose(tfile); /* if there's anything in found[], use it */ if (found[0]) { return &found[len + 1]; } /* else we didn't find it */ return (char *)0; } /* This function reads a single textline from a binary file. It returns * the number of bytes read, or 0 at EOF. */ int getline(buf, limit, fp) char *buf; /* buffer to read into */ int limit; /* maximum characters to read */ FILE *fp; /* binary stream to read from */ { int bytes; /* number of bytes read so far */ int ch; /* single character from file */ for (bytes = 0, ch = 0; ch != '\n' && --limit > 0 && (ch = getc(fp)) != EOF; bytes++) { #if MSDOS || TOS /* since this is a binary file, we'll need to manually strip CR's */ if (ch == '\r') { continue; } #endif *buf++ = ch; } *buf = '\0'; return bytes; } /* This function reads a source file, looking for a given tag. If it finds * the tag, then it displays it and returns TRUE. Otherwise it returns FALSE. * To display the tag, it attempts to output any introductory comment, the * tag line itself, and any arguments. Arguments are assumed to immediately * follow the tag line, and start with whitespace. Comments are assumed to * start with lines that begin with "/*", "//", "(*", or "--", and end at the * tag line or at a blank line. */ int lookup(dir, entry) char *dir; /* name of the directory that contains the source */ char *entry; /* source filename, <Tab>, linespec */ { char buf[BLKSIZE]; /* pathname of sourcefile */ long lnum; /* line number */ long here; /* seek position where current line began */ long comment; /* seek position of introductory comment, or -1L */ FILE *sfile; /* used for reading the source file */ int len; /* length of string */ char *ptr; /* construct the pathname of the source file */ strcpy(buf, dir); ptr = buf + strlen(buf); #if AMIGA if (ptr[-1] != COLON) #endif *ptr++ = SLASH; while (*entry != '\t') { *ptr++ = *entry++; } *ptr = '\0'; entry++; /* searching for string or number? */ if (*entry >= '0' && *entry <= '9') { /* given a specific line number */ lnum = atol(entry); entry = (char *)0; } else { /* given a string -- strip off "/^" and "$/\n" */ entry += 2; len = strlen(entry) - 2; if (entry[len - 1] == '$') { entry[len - 1] = '\n'; } lnum = 0L; } /* Open the file. Note that we open the file in binary mode even * though we know it is a text file, because ftell() and fseek() * don't work on text files. */ #if MSDOS || TOS sfile = fopen(buf, "rb"); #else # if AMIGA if (buf[0] == '.' && buf[1] == SLASH) sfile = fopen(&buf[2], "r"); else # endif sfile = fopen(buf, "r"); #endif if (!sfile) { /* can't open the real source file. Try "refs" instead */ #if AMIGA if (dir[strlen(dir) - 1] == COLON) sprintf(buf, "%srefs", dir); else #endif sprintf(buf, "%s%crefs", dir, SLASH); #if MSDOS || TOS sfile = fopen(buf, "rb"); #else # if AMIGA if (buf[0] == '.' && buf[1] == SLASH) sfile = fopen(&buf[2], "r"); else # endif sfile = fopen(buf, "r"); #endif if (!sfile) { /* failed! */ return 0; } } /* search the file */ for (comment = -1L; here = ftell(sfile), getline(buf, BLKSIZE, sfile) > 0; ) { /* Is this the start/end of a comment? */ if (comment == -1L) { /* starting a comment? */ if (buf[0] == '/' && buf[1] == '*' || buf[0] == '/' && buf[1] == '/' || buf[0] == '(' && buf[1] == '*' || buf[0] == '-' && buf[1] == '-') { comment = here; } } else { /* ending a comment? */ if (buf[0] == '\n' || buf[0] == '#') { comment = -1L; } } /* is this the tag line? */ if (--lnum == 0L || (entry && !strncmp(buf, entry, len))) { /* if there were introductory comments, show them */ if (comment != -1L) { fseek(sfile, comment, 0); while (comment != here) { getline(buf, BLKSIZE, sfile); fputs(buf, stdout); comment = ftell(sfile); } /* re-fetch the tag line */ fgets(buf, BLKSIZE, sfile); } /* show the tag line */ fputs(buf, stdout); /* show any argument lines */ while (getline(buf, BLKSIZE, sfile) > 0 && buf[0] != '#' && strchr(buf, '{') == (char *)0) { fputs(buf, stdout); } /* Done! Close the file, and return TRUE */ fclose(sfile); return 1; } } /* not found -- return FALSE */ return 0; } /* This function searches through the entire search path for a given tag. * If it finds the tag, then it displays the info and returns TRUE; * otherwise it returns FALSE. */ int find(tag) char *tag; /* the tag to look up */ { char *tagpath; char dir[80]; char *ptr; int len; if (colons == 1) { /* looking for static function -- only look in current dir */ tagpath = "."; } else { /* get the tagpath from the environment. Default to DEFTAGPATH */ tagpath = getenv("TAGPATH"); if (!tagpath) { tagpath = DEFTAGPATH; } } /* for each entry in the path... */ while (*tagpath) { /* Copy the entry into the dir[] buffer */ for (ptr = dir; *tagpath &A��A��A���B��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������& *tagpath != SEP; tagpath++) { *ptr++ = *tagpath; } if (*tagpath == SEP) { tagpath++; } /* if the entry ended with "/tags", then strip that off */ len = strlen(TAGS); if (&dir[len] < ptr && ptr[-len - 1] == SLASH && !strncmp(&ptr[-len], TAGS, len)) { ptr -= len + 1; } /* if the entry is now an empty string, then assume "." */ if (ptr == dir) { *ptr++ = '.'; } *ptr = '\0'; /* look for the tag in this path. If found, then display it * and exit. */ ptr = cktagdir(tag, dir); if (ptr) { /* just supposed to display tag info? */ if (taginfo) { /* then do only that! */ if (strcmp(dir, ".")) { printf("%s%c%s", dir, SLASH, ptr); } else { /* avoid leading "./" if possible */ fputs(ptr, stdout); } return 1; } else { /* else look up the declaration of the thing */ return lookup(dir, ptr); } } } /* if we get here, then the tag wasn't found anywhere */ return 0; } void usage() { fputs("usage: ref [-a] [-t] [-c class] [-f file] tag\n", stderr); fputs(" -a function's args may be flush against left margin\n", stderr); fputs(" -t output tag info, instead of the function header\n", stderr); fputs(" -f File tag might be a static function in File\n", stderr); fputs(" -c Class tag might be a member of class Class\n", stderr); exit(2); } int countcolons(str) char *str; { while (*str != ':' && *str) { str++; } if (str[0] != ':') { return 0; } else if (str[1] != ':') { return 1; } return 2; } int main(argc, argv) int argc; char **argv; { char def_tag[100]; /* used to build tag name with default file/class */ int i; /* parse flags */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { switch (argv[i][1]) { case 't': taginfo = 1; break; case 'f': if (argv[i][2]) { def_file = &argv[i][2]; } else if (++i < argc) { def_file = argv[i]; } else { usage(); } break; case 'c': if (argv[i][2]) { def_class = &argv[i][2]; } else if (++i < argc) { def_class = argv[i]; } else { usage(); } break; default: usage(); } } /* if no tag was given, complain */ if (i + 1 != argc) { usage(); } /* does the tag have an explicit class or file? */ colons = countcolons(argv[i]); /* if not, then maybe try some defaults */ if (colons == 0) { /* try a static function in the file first */ if (def_file) { sprintf(def_tag, "%s:%s", def_file, argv[i]); colons = 1; if (find(def_tag)) { exit(0); } } /* try a member function for a class */ if (def_class) { sprintf(def_tag, "%s::%s", def_class, argv[i]); colons = 2; if (find(def_tag)) { exit(0); } } /* oh, well */ colons = 0; } /* find the tag */ if (find(argv[i])) { exit(0); } exit(1); /*NOTREACHED*/ } ���������������������������������������������������������������������������������������������������������������������������������������/* regexp.c */ /* This file contains the code that compiles regular expressions and executes * them. It supports the same syntax and features as vi's regular expression * code. Specifically, the meta characters are: * ^ matches the beginning of a line * $ matches the end of a line * \< matches the beginning of a word * \> matches the end of a word * . matches any single character * [] matches any character in a character class * \( delimits the start of a subexpression * \) delimits the end of a subexpression * * repeats the preceding 0 or more times * NOTE: You cannot follow a \) with a *. * * The physical structure of a compiled RE is as follows: * - First, there is a one-byte value that says how many character classes * are used in this regular expression * - Next, each character class is stored as a bitmap that is 256 bits * (32 bytes) long. * - A mixture of literal characters and compiled meta characters follows. * This begins with M_BEGIN(0) and ends with M_END(0). All meta chars * are stored as a \n followed by a one-byte code, so they take up two * bytes apiece. Literal characters take up one byte apiece. \n can't * be used as a literal character. * * If NO_MAGIC is defined, then a different set of functions is used instead. * That right, this file contains TWO versions of the code. */ #include <setjmp.h> #include "config.h" #include "ctype.h" #include "vi.h" #include "regexp.h" static char *previous; /* the previous regexp, used when null regexp is given */ #ifndef NO_MAGIC /* THE REAL REGEXP PACKAGE IS USED UNLESS "NO_MAGIC" IS DEFINED */ /* These are used to classify or recognize meta-characters */ #define META '\0' #define BASE_META(m) ((m) - 256) #define INT_META(c) ((c) + 256) #define IS_META(m) ((m) >= 256) #define IS_CLASS(m) ((m) >= M_CLASS(0) && (m) <= M_CLASS(9)) #define IS_START(m) ((m) >= M_START(0) && (m) <= M_START(9)) #define IS_END(m) ((m) >= M_END(0) && (m) <= M_END(9)) #define IS_CLOSURE(m) ((m) >= M_SPLAT && (m) <= M_RANGE) #define ADD_META(s,m) (*(s)++ = META, *(s)++ = BASE_META(m)) #define GET_META(s) (*(s) == META ? INT_META(*++(s)) : *s) /* These are the internal codes used for each type of meta-character */ #define M_BEGLINE 256 /* internal code for ^ */ #define M_ENDLINE 257 /* internal code for $ */ #define M_BEGWORD 258 /* internal code for \< */ #define M_ENDWORD 259 /* internal code for \> */ #define M_ANY 260 /* internal code for . */ #define M_SPLAT 261 /* internal code for * */ #define M_PLUS 262 /* internal code for \+ */ #define M_QMARK 263 /* internal code for \? */ #define M_RANGE 264 /* internal code for \{ */ #define M_CLASS(n) (265+(n)) /* internal code for [] */ #define M_START(n) (275+(n)) /* internal code for \( */ #define M_END(n) (285+(n)) /* internal code for \) */ /* These are used during compilation */ static int class_cnt; /* used to assign class IDs */ static int start_cnt; /* used to assign start IDs */ static int end_stk[NSUBEXP];/* used to assign end IDs */ static int end_sp; static char *retext; /* points to the text being compiled */ /* error-handling stuff */ jmp_buf errorhandler; #define FAIL(why) regerror(why); longjmp(errorhandler, 1) /* This function builds a bitmap for a particular class */ static char *makeclass(text, bmap) REG char *text; /* start of the class */ REG char *bmap; /* the bitmap */ { REG int i; int complement = 0; /* zero the bitmap */ for (i = 0; bmap && i < 32; i++) { bmap[i] = 0; } /* see if we're going to complement this class */ if (*text == '^') { text++; complement = 1; } /* add in the characters */ while (*text && *text != ']') { /* is this a span of characters? */ if (text[1] == '-' && text[2]) { /* spans can't be backwards */ if (text[0] > text[2]) { FAIL("Backwards span in []"); } /* add each character in the span to the bitmap */ for (i = text[0]; bmap && i <= text[2]; i++) { bmap[i >> 3] |= (1 << (i & 7)); } /* move past this span */ text += 3; } else { /* add this single character to the span */ i = *text++; if (bmap) { bmap[i >> 3] |= (1 << (i & 7)); } } } /* make sure the closing ] is missing */ if (*text++ != ']') { FAIL("] missing"); } /* if we're supposed to complement this class, then do so */ if (complement && bmap) { for (i = 0; i < 32; i++) { bmap[i] = ~bmap[i]; } } return text; } /* This function gets the next character or meta character from a string. * The pointer is incremented by 1, or by 2 for \-quoted characters. For [], * a bitmap is generated via makeclass() (if re is given), and the * character-class text is skipped. */ static int gettoken(sptr, re) char **sptr; regexp *re; { int c; c = **sptr; ++*sptr; if (c == '\\') { c = **sptr; ++*sptr; switch (c) { case '<': return M_BEGWORD; case '>': return M_ENDWORD; case '(': if (start_cnt >= NSUBEXP) { FAIL("Too many \\(s"); } end_stk[end_sp++] = start_cnt; return M_START(start_cnt++); case ')': if (end_sp <= 0) { FAIL("Mismatched \\)"); } return M_END(end_stk[--end_sp]); case '*': return (*o_magic ? c : M_SPLAT); case '.': return (*o_magic ? c : M_ANY); case '+': return M_PLUS; case '?': return M_QMARK; #ifndef CRUNCH case '{': return M_RANGE; #endif default: return c; } } else if (*o_magic) { switch (c) { case '^': if (*sptr == retext + 1) { return M_BEGLINE; } return c; case '$': if (!**sptr) { return M_ENDLINE; } return c; case '.': return M_ANY; case '*': return M_SPLAT; case '[': /* make sure we don't have too many classes */ if (class_cnt >= 10) { FAIL("Too many []s"); } /* process the character list for this class */ if (re) { /* generate the bitmap for this class */ *sptr = makeclass(*sptr, re->program + 1 + 32 * class_cnt); } else { /* skip to end of the class */ *sptr = makeclass(*sptr, (char *)0); } return M_CLASS(class_cnt++); default: return c; } } else /* unquoted nomagic */ { switch (c) { case '^': if (*sptr == retext + 1) { return M_BEGLINE; } return c; case '$': if (!**sptr) { return M_ENDLINE; } return c; default: return c; } } /*NOTREACHED*/ } /* This function calculates the number of bytes that will be needed for a * compiled RE. Its argument is the uncompiled version. It is not clever * about catching syntax errors; that is done in a later pass. */ static unsigned calcsize(text) char *text; { unsigned size; int token; retext = text; class_cnt = 0; start_cnt = 1; end_sp = 0; size = 5; while ((token = gettoken(&text, (regexp *)0)) != 0) { if (IS_CLASS(token)) { size += 34; } #ifndef CRUNCH else if (token == M_RANGE) { size += 4; while ((token = gettoken(&text, (regexp *)0)) != 0 && token != '}') { } if (!token) { return size; } } #endif else if (IS_META(token)) { size += 2; } else { size++; } } return size; } /* This function compiles a regexp. */ regexp *regcomp(exp) char *exp; { int needfirst; unsigned size; int token; int peek; char *build; regexp *re; #ifndef CRUNCH int from; int to; int digit; #endif /* prepare for error handling */ re = (regexp *)0; if (setjmp(errorhandler)) { if (re) { free(re); } return (regexp *)0; } /* if an empty regexp string was given, use the previous one */ if (*exp == 0) { if (!previous) { FAIL("No previous RE"); } exp = previous; } else /* non-empty regexp given, so remember it */ { if (previous) free(previous); previous = (char *)malloc((unsigned)(strlen(exp) + 1)); if (previous) strcpy(previous, exp); } /* allocate memory */ class_cnt = 0; start_cnt = 1; end_sp = 0; retext = exp; size = calcsize(exp) + sizeof(regexp) + 10; /* !!! 10 bytes for slop */ #ifdef lint re = ((regexp *)0) + size; #else re = (regexp *)malloc((unsigned)size); #endiB�� B�� B�� B�� B��B��B��B��B��B��B��B������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f if (!re) { FAIL("Not enough memory for this RE"); } /* compile it */ build = &re->program[1 + 32 * class_cnt]; re->program[0] = class_cnt; for (token = 0; token < NSUBEXP; token++) { re->startp[token] = re->endp[token] = (char *)0; } re->first = 0; re->bol = 0; re->minlen = 0; needfirst = 1; class_cnt = 0; start_cnt = 1; end_sp = 0; retext = exp; for (token = M_START(0), peek = gettoken(&exp, re); token; token = peek, peek = gettoken(&exp, re)) { /* special processing for the closure operator */ if (IS_CLOSURE(peek)) { /* detect misuse of closure operator */ if (IS_START(token)) { FAIL("Closure operator follows nothing"); } else if (IS_META(token) && token != M_ANY && !IS_CLASS(token)) { FAIL("Closure operators can only follow a normal character or . or []"); } #ifndef CRUNCH /* if \{ \} then read the range */ if (peek == M_RANGE) { from = 0; for (digit = gettoken(&exp, re); !IS_META(digit) && isdigit(digit); digit = gettoken(&exp, re)) { from = from * 10 + digit - '0'; } if (digit == '}') { to = from; } else if (digit == ',') { to = 0; for (digit = gettoken(&exp, re); !IS_META(digit) && isdigit(digit); digit = gettoken(&exp, re)) { to = to * 10 + digit - '0'; } if (to == 0) { to = 255; } } if (digit != '}') { FAIL("Bad characters after \\{"); } else if (to < from || to == 0 || from >= 255) { FAIL("Invalid range for \\{ \\}"); } re->minlen += from; } else #endif if (peek != M_SPLAT) { re->minlen++; } /* it is okay -- make it prefix instead of postfix */ ADD_META(build, peek); #ifndef CRUNCH if (peek == M_RANGE) { *build++ = from; *build++ = (to < 255 ? to : 255); } #endif /* take care of "needfirst" - is this the first char? */ if (needfirst && peek == M_PLUS && !IS_META(token)) { re->first = token; } needfirst = 0; /* we used "peek" -- need to refill it */ peek = gettoken(&exp, re); if (IS_CLOSURE(peek)) { FAIL("* or \\+ or \\? doubled up"); } } else if (!IS_META(token)) { /* normal char is NOT argument of closure */ if (needfirst) { re->first = token; needfirst = 0; } re->minlen++; } else if (token == M_ANY || IS_CLASS(token)) { /* . or [] is NOT argument of closure */ needfirst = 0; re->minlen++; } /* the "token" character is not closure -- process it normally */ if (token == M_BEGLINE) { /* set the BOL flag instead of storing M_BEGLINE */ re->bol = 1; } else if (IS_META(token)) { ADD_META(build, token); } else { *build++ = token; } } /* end it with a \) which MUST MATCH the opening \( */ ADD_META(build, M_END(0)); if (end_sp > 0) { FAIL("Not enough \\)s"); } return re; } /*---------------------------------------------------------------------------*/ /* This function checks for a match between a character and a token which is * known to represent a single character. It returns 0 if they match, or * 1 if they don't. */ int match1(re, ch, token) regexp *re; REG char ch; REG int token; { if (!ch) { /* the end of a line can't match any RE of width 1 */ return 1; } if (token == M_ANY) { return 0; } else if (IS_CLASS(token)) { if (re->program[1 + 32 * (token - M_CLASS(0)) + (ch >> 3)] & (1 << (ch & 7))) return 0; } else if (ch == token || *o_ignorecase && tolower(ch) == tolower(token)) { return 0; } return 1; } /* This function checks characters up to and including the next closure, at * which point it does a recursive call to check the rest of it. This function * returns 0 if everything matches, or 1 if something doesn't match. */ int match(re, str, prog, here) regexp *re; /* the regular expression */ char *str; /* the string */ REG char *prog; /* a portion of re->program, an compiled RE */ REG char *here; /* a portion of str, the string to compare it to */ { REG int token; /* the roken pointed to by prog */ REG int nmatched;/* counter, used during closure matching */ REG int closure;/* the token denoting the type of closure */ int from; /* minimum number of matches in closure */ int to; /* maximum number of matches in closure */ for (token = GET_META(prog); !IS_CLOSURE(token); prog++, token = GET_META(prog)) { switch (token) { /*case M_BEGLINE: can't happen; re->bol is used instead */ case M_ENDLINE: if (*here) return 1; break; case M_BEGWORD: if (here != str && (here[-1] == '_' || isalnum(here[-1]))) return 1; break; case M_ENDWORD: if (here[0] == '_' || isalnum(here[0])) return 1; break; case M_START(0): case M_START(1): case M_START(2): case M_START(3): case M_START(4): case M_START(5): case M_START(6): case M_START(7): case M_START(8): case M_START(9): re->startp[token - M_START(0)] = (char *)here; break; case M_END(0): case M_END(1): case M_END(2): case M_END(3): case M_END(4): case M_END(5): case M_END(6): case M_END(7): case M_END(8): case M_END(9): re->endp[token - M_END(0)] = (char *)here; if (token == M_END(0)) { return 0; } break; default: /* literal, M_CLASS(n), or M_ANY */ if (match1(re, *here, token) != 0) return 1; here++; } } /* C L O S U R E */ /* step 1: see what we have to match against, and move "prog" to point * to the remainder of the compiled RE. */ closure = token; prog++; switch (closure) { case M_SPLAT: from = 0; to = strlen(str); /* infinity */ break; case M_PLUS: from = 1; to = strlen(str); /* infinity */ break; case M_QMARK: from = 0; to = 1; break; #ifndef CRUNCH case M_RANGE: from = UCHAR(*prog++); to = UCHAR(*prog++); if (to == 255) { to = strlen(str); /* infinity */ } break; #endif } token = GET_META(prog); prog++; /* step 2: see how many times we can match that token against the string */ for (nmatched = 0; nmatched < to && *here && match1(re, *here, token) == 0; nmatched++, here++) { } /* step 3: try to match the remainder, and back off if it doesn't */ while (nmatched >= from && match(re, str, prog, here) != 0) { nmatched--; here--; } /* so how did it work out? */ if (nmatched >= from) return 0; return 1; } /* This function searches through a string for text that matches an RE. */ int regexec(re, str, bol) regexp *re; /* the compiled regexp to search for */ char *str; /* the string to search through */ int bol; /* boolean: does str start at the beginning of a line? */ { char *prog; /* the entry point of re->program */ int len; /* length of the string */ REG char *here; /* if must start at the beginning of a line, and this isn't, then fail */ if (re->bol && !bol) { return 0; } len = strlen(str); prog = re->program + 1 + 32 * re->program[0]; /* search for the RE in the string */ if (re->bol) { /* must occur at BOL */ if ((re->first && match1(re, *(char *)str, re->first))/* wrong first letter? */ || len < re->minlen /* not long enough? */ || match(re, (char *)str, prog, str)) /* doesn't match? */ return 0; /* THEN FAIL! */ } #ifndef CRUNCH else if (!*o_ignorecase) { /* can occur anywhere in the line, noignorecase */ for (here = (char *)str; (re->first && re->first != *here) || match(re, (char *)str, prog, here); here++, len--) { if (len < re->minlen) return 0; } } #endif else { /* can occur anywhere in the line, ignorecase */ for (here = (char *)str; (re->first && match1(re, *here, (int)re->first)) || match(re, (char *)str, prog, here); here++, len--) { if (len < re->minlen) return 0; } } /* if we didn't fail, then we must have succeeded */ return 1; } /*============================================================================*/ #else /* NO_MAGIC */ regexp *regcomp(exp) char *exp; { char *src; char *dest; regexp *re; int i; /* allocate a big enough regexp structure */ #ifdef lint re = (regexp *)0; #else re = (regexp *)malloc((unsigned)(strlen(exp) + 1 + sizeof(struct regexp))); #endif if (!re) { regerror("Could not malloc a regexp structure"); return (regexp *)0; } /* initialize all fields of the structure */ for (i = 0; i < NSUBEXP; i++) { re->startp[i] = re->endp[i] = (char *)0; } re->minlen = 0; re->first = 0; re->bol = 0; /* copy the string into it, translating ^ and $ as needed */ for (src = exp, dest = re->program + 1; *src; src++) { switch (*src) { case '^': if (src == exp) { re->bol += 1; } else { *dest++ = '^'; re->minlen++; } break; case '$': if (!src[1]) { re->bol += 2; } else { *dest++ = '$'; re->minlen++; } break; case '\\': if (src[1]) { *dest++ = *++src; re->minlen++; } else { regerror("extra \\ at end of regular expression"); } break; default: *dest++ = *src; re->minlen++; } } *dest = '\0'; return re; } /* This "helper" function checks for a match at a given location. It returns * 1 if it matches, 0 if it doesn't match here but might match later on in the * string, or -1 if it could not possibly match */ static int reghelp(prog, string, bolflag) struct regexp *prog; char *string; int bolflag; { char *scan; char *str; /* if ^, then require bolflag */ if ((prog->bol & 1) && !bolflag) { return -1; } /* if it matches, then it will start here */ prog->startp[0] = string; /* compare, possibly ignoring case */ if (*o_ignorecase) { for (scan = &prog->program[1]; *scan; scan++, string++) if (tolower(*scan) != tolower(*string)) return *string ? 0 : -1; } else { for (scan = &prog->program[1]; *scan; scan++, string++) if (*scan != *string) return *string ? 0 : -1; } /* if $, then require string to end here, too */ if ((prog->bol & 2) && *string) { return 0; } /* if we get to here, it matches */ prog->endp[0] = string; return 1; } int regexec(prog, string, bolflag) struct regexp *prog; char *string; int bolflag; { int rc; /* keep trying to match it */ for (rc = reghelp(prog, string, bolflag); rc == 0; rc = reghelp(prog, string, 0)) { string++; } /* did we match? */ return rc == 1; } #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Definitions etc. for regexp(3) routines. * * Caveat: this is V8 regexp(3) [actually, a reimplementation thereof], * not the System V one. */ #define NSUBEXP 10 typedef struct regexp { char *startp[NSUBEXP]; char *endp[NSUBEXP]; int minlen; /* length of shortest possible match */ char first; /* first character, if known; else \0 */ char bol; /* boolean: must start at beginning of line? */ char program[1]; /* Unwarranted chumminess with compiler. */ } regexp; extern regexp *regcomp(); extern int regexec(); extern void regsub(); extern void regerror(); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* regsub.c */ /* This file contains the regsub() function, which performs substitutions * after a regexp match has been found. */ #include "config.h" #include "ctype.h" #include "vi.h" #include "regexp.h" /* perform substitutions after a regexp match */ void regsub(re, src, dst) regexp *re; /* the regexp with pointers into matched text */ REG char *src; /* the replacement string */ REG char *dst; /* where to put the result of the subst */ { REG char *cpy; /* pointer to start of text to copy */ REG char *end; /* pointer to end of text to copy */ REG char c; char *start; #ifndef CRUNCH int mod = 0;/* used to track \U, \L, \u, \l, and \E */ int len; /* used to calculate length of subst string */ static char *prev; /* a copy of the text from the previous subst */ /* replace \~ (or maybe ~) by previous substitution text */ /* step 1: calculate the length of the new substitution text */ for (len = strlen(src), c = '\0', cpy = src; *cpy; cpy++) { # ifdef NO_MAGIC if (c == '\\' && *cpy == '~') # else if (c == (*o_magic ? '\0' : '\\') && *cpy == '~') # endif { if (!prev) { regerror("No prev text to substitute for ~"); return; } len += strlen(prev) - 1; # ifndef NO_MAGIC if (!*o_magic) # endif len -= 1; /* because we lose the \ too */ } /* watch backslash quoting */ if (c != '\\' && *cpy == '\\') c = '\\'; else c = '\0'; } /* allocate memory for the ~ed version of src */ start = cpy = (char *)malloc((unsigned)(len + 1)); if (!cpy) { regerror("Not enough memory for ~ expansion"); return; } /* copy src into start, replacing the ~s by the previous text */ while (*src) { # ifndef NO_MAGIC if (*o_magic && *src == '~') { strcpy(cpy, prev); cpy += strlen(prev); src++; } else if (!*o_magic && *src == '\\' && *(src + 1) == '~') # else /* NO_MAGIC */ if (*src == '\\' && *(src + 1) == '~') # endif /* NO_MAGIC */ { strcpy(cpy, prev); cpy += strlen(prev); src += 2; } else { *cpy++ = *src++; } } *cpy = '\0'; #ifdef DEBUG if ((int)(cpy - start) != len) { msg("Bug in regsub.c! Predicted length = %d, Actual length = %d", len, (int)(cpy - start)); } #endif /* remember this as the "previous" for next time */ if (prev) free(prev); prev = src = start; #endif /* undef CRUNCH */ start = src; while ((c = *src++) != '\0') { #ifndef NO_MAGIC /* recognize any meta characters */ if (c == '&' && *o_magic) { cpy = re->startp[0]; end = re->endp[0]; } else #endif /* not NO_MAGIC */ if (c == '\\') { c = *src++; switch (c) { #ifndef NO_MAGIC case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* \0 thru \9 mean "copy subexpression" */ c -= '0'; cpy = re->startp[c]; end = re->endp[c]; break; # ifndef CRUNCH case 'U': case 'u': case 'L': case 'l': /* \U and \L mean "convert to upper/lowercase" */ mod = c; continue; case 'E': case 'e': /* \E ends the \U or \L */ mod = 0; continue; # endif /* not CRUNCH */ case '&': /* "\&" means "original text" */ if (*o_magic) { *dst++ = c; continue; } cpy = re->startp[0]; end = re->endp[0]; break; #else /* NO_MAGIC */ case '&': /* "\&" means "original text" */ cpy = re->startp[0]; end = re->endp[0]; break; #endif /* NO_MAGIC */ default: /* ordinary char preceded by backslash */ *dst++ = c; continue; } } #ifndef CRUNCH # if OSK else if (c == '\l') # else else if (c == '\r') # endif { /* transliterate ^M into newline */ *dst++ = '\n'; continue; } #endif /* !CRUNCH */ else { /* ordinary character, so just copy it */ *dst++ = c; continue; } /* Note: to reach this point in the code, we must have evaded * all "continue" statements. To do that, we must have hit * a metacharacter that involves copying. */ /* if there is nothing to copy, loop */ if (!cpy) continue; /* copy over a portion of the original */ while (cpy < end) { #ifndef NO_MAGIC # ifndef CRUNCH switch (mod) { case 'U': case 'u': /* convert to uppercase */ *dst++ = toupper(*cpy++); break; case 'L': case 'l': /* convert to lowercase */ *dst++ = tolower(*cpy++); break; default: /* copy without any conversion */ *dst++ = *cpy++; } /* \u and \l end automatically after the first char */ if (mod && (mod == 'u' || mod == 'l')) { mod = 0; } # else /* CRUNCH */ *dst++ = *cpy++; # endif /* CRUNCH */ #else /* NO_MAGIC */ *dst++ = *cpy++; #endif /* NO_MAGIC */ } } *dst = '\0'; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* system.c -- UNIX version */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains a new version of the system() function and related stuff. * * Entry points are: * system(cmd) - run a single shell command * wildcard(names) - expand wildcard characters in filanames * filter(m,n,cmd,back) - run text lines through a filter program * * This is probably the single least portable file in the program. The code * shown here should work correctly if it links at all; it will work on UNIX * and any O.S./Compiler combination which adheres to UNIX forking conventions. */ #include "config.h" #include "vi.h" extern char **environ; #if ANY_UNIX /* This is a new version of the system() function. The only difference * between this one and the library one is: this one uses the o_shell option. */ int system(cmd) char *cmd; /* a command to run */ { int pid; /* process ID of child */ int died; int status; /* exit status of the command */ signal(SIGINT, SIG_IGN); pid = fork(); switch (pid) { case -1: /* error */ msg("fork() failed"); status = -1; break; case 0: /* child */ /* for the child, close all files except stdin/out/err */ for (status = 3; status < 60 && (close(status), errno != EINVAL); status++) { } signal(SIGINT, SIG_DFL); if (cmd == o_shell) { execle(o_shell, o_shell, (char *)0, environ); } else { execle(o_shell, o_shell, "-c", cmd, (char *)0, environ); } msg("execle(\"%s\", ...) failed", o_shell); exit(1); /* if we get here, the exec failed */ default: /* parent */ do { died = wait(&status); } while (died >= 0 && died != pid); if (died < 0) { status = -1; } #if __GNUC__ || _ANSI signal(SIGINT, (void (*)()) trapint); #else signal(SIGINT, trapint); #endif } return status; } /* This private function opens a pipe from a filter. It is similar to the * system() function above, and to popen(cmd, "r"). */ int rpipe(cmd, in) char *cmd; /* the filter command to use */ int in; /* the fd to use for stdin */ { int r0w1[2];/* the pipe fd's */ /* make the pipe */ if (pipe(r0w1) < 0) { return -1; /* pipe failed */ } /* The parent process (elvis) ignores signals while the filter runs. * The child (the filter program) will reset this, so that it can * catch the signal. */ signal(SIGINT, SIG_IGN); switch (fork()) { case -1: /* error */ return -1; case 0: /* child */ /* close the "read" end of the pipe */ close(r0w1[0]); /* redirect stdout to go to the "write" end of the pipe */ close(1); dup(r0w1[1]); close(2); dup(r0w1[1]); close(r0w1[1]); /* redirect stdin */ if (in != 0) { close(0); dup(in); close(in); } /* the filter should accept SIGINT signals */ signal(SIGINT, SIG_DFL); /* exec the shell to run the command */ execle(o_shell, o_shell, "-c", cmd, (char *)0, environ); exit(1); /* if we get here, exec failed */ default: /* parent */ /* close the "write" end of the pipe */ close(r0w1[1]); return r0w1[0]; } } #endif /* non-DOS */ #if OSK /* This private function opens a pipe from a filter. It is similar to the * system() function above, and to popen(cmd, "r"). */ int rpipe(cmd, in) char *cmd; /* the filter command to use */ int in; /* the fd to use for stdin */ { return osk_popen(cmd, "r", in, 0); } #endif #if ANY_UNIX || OSK /* This function closes the pipe opened by rpipe(), and returns 0 for success */ int rpclose(fd) int fd; { int status; close(fd); wait(&status); #if __GNUC__ || _ANSI signal(SIGINT, (void (*)()) trapint); #else signal(SIGINT, trapint); #endif return status; } #endif /* non-DOS */ /* This function expands wildcards in a filename or filenames. It does this * by running the "echo" command on the filenames via the shell; it is assumed * that the shell will expand the names for you. If for any reason it can't * run echo, then it returns the names unmodified. */ #if MSDOS || TOS #define PROG "wildcard " #define PROGLEN 9 #include <string.h> #else #define PROG "echo " #define PROGLEN 5 #endif #if !AMIGA char *wildcard(names) char *names; { # if VMS /* We could use expand() [vmswild.c], but what's the point on VMS? Anyway, echo is the wrong thing to do, it takes too long to build a subprocess on VMS and any "echo" program would have to be supplied by elvis. More importantly, many VMS utilities expand names themselves (the shell doesn't do any expansion) so the concept is non-native. jdc */ return names; # else int i, j, fd; REG char *s, *d; /* build the echo command */ if (names != tmpblk.c) { /* the names aren't in tmpblk.c, so we can do it the easy way */ strcpy(tmpblk.c, PROG); strcat(tmpblk.c, names); } else { /* the names are already in tmpblk.c, so shift them to make * room for the word "echo " */ for (s = names + strlen(names) + 1, d = s + PROGLEN; s > names; ) { *--d = *--s; } strncpy(names, PROG, PROGLEN); } /* run the command & read the resulting names */ fd = rpipe(tmpblk.c, 0); if (fd < 0) return names; i = 0; do { j = tread(fd, tmpblk.c + i, BLKSIZE - i); i += j; } while (j > 0); /* successful? */ if (rpclose(fd) == 0 && j == 0 && i < BLKSIZE && i > 0) { tmpblk.c[i-1] = '\0'; /* "i-1" so we clip off the newline */ return tmpblk.c; } else { return names; } # endif } #endif /* This function runs a range of lines through a filter program, and replaces * the original text with the filtered version. As a special case, if "to" * is MARK_UNSET, then it runs the filter program with stdin coming from * /dev/null, and inserts any output lines. */ int filter(from, to, cmd, back) MARK from, to; /* the range of lines to filter */ char *cmd; /* the filter command */ int back; /* boolean: will we read lines back? */ { int scratch; /* fd of the scratch file */ int fd; /* fd of the pipe from the filter */ char scrout[50]; /* name of the scratch out file */ MARK new; /* place where new text should go */ long sent, rcvd; /* number of lines sent/received */ int i, j; /* write the lines (if specified) to a temp file */ if (to) { /* we have lines */ #if MSDOS || TOS strcpy(scrout, o_directory); if ((i=strlen(scrout)) && !strchr("\\/:", scrout[i-1])) scrout[i++]=SLASH; strcpy(scrout+i, SCRATCHOUT+3); #else sprintf(scrout, SCRATCHOUT, o_directory); #endif mktemp(scrout); cmd_write(from, to, CMD_BANG, FALSE, scrout); sent = markline(to) - markline(from) + 1L; /* use those lines as stdin */ scratch = open(scrout, O_RDONLY); if (scratch < 0) { unlink(scrout); return -1; } } else { scratch = 0; sent = 0L; } /* start the filter program */ #if VMS /* VMS doesn't know a thing about file descriptor 0. The rpipe concept is non-portable. Hence we need a file name argument. */ fd = rpipe(cmd, scratch, scrout); #else fd = rpipe(cmd, scratch); #endif if (fd < 0) { if (to) { close(scratch); unlink(scrout); } return -1; } if (back) { ChangeText { /* adjust MARKs for whole lines, and set "new" */ from &= ~(BLKSIZE - 1); if (to) { to &= ~(BLKSIZE - 1); to += BLKSIZE; new = to; } else { new = from + BLKSIZE; } #if VMS /* Reading from a VMS mailbox (pipe) is record oriented... */ # define tread vms_pread #endif /* repeatedly read in new text and add it */ rcvd = 0L; while ((i = tread(fd, tmpblk.c, BLKSIZE - 1)) > 0) { tmpblk.c[i] = '\0'; add(new, tmpblk.c); #if VMS /* What! An advantage to record oriented reads? */ new += (i - 1); new = (new & ~(BLKSIZE - 1)) + BLKSIZE; rcvd++; #else for (i = 0; tmpblk.c[i]; i++) { if (tmpblk.c[i] == '\n') { new = (new & ~(BLKSIZE - 1)) + BLKSIZE; rcvd++; } else { new++; } } #endif } } /* delete old text, if any */ if (to) { cut(from, to); delete(from, to); } } else { /* read the command's output, and copy it to the screen */ while ((i = tread(fd, tmpblk.c,"B��$B���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� BLKSIZE - 1)) > 0) { for (j = 0; j < i; j++) { addch(tmpblk.c[j]); } } rcvd = 0; } /* Reporting... */ if (sent >= *o_report || rcvd >= *o_report) { if (sent > 0L && rcvd > 0L) { msg("%ld lines out, %ld lines back", sent, rcvd); } else if (sent > 0) { msg("%ld lines written to filter", sent); } else { msg("%ld lines read from filter", rcvd); } } rptlines = 0L; /* cleanup */ rpclose(fd); if (to) { close(scratch); unlink(scrout); } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tinyprnt.c */ #if OSK #define sprintf Sprintf #endif /* This is a limited version of sprintf(). It is useful for Minix-PC and * Coherent-286 because those systems are both limited to 64k+64k and the * standard sprintf() is just too damn big. * * It should also be useful for OS-9 because OS-9's sprintf() doesn't * understand the true meaning of asterisks in a format string. This one * does. */ /* Place-holders in format strings look like "%<pad><clip><type>". * * The <pad> adds space to the front (or, if negative, to the back) of the * output value, to pad it to a given width. If <pad> is absent, then 0 is * assumed. If <pad> is an asterisk, then the next argument is assumed to * be an (int) which used as the pad width. * * The <clip> string can be absent, in which case no clipping is done. * However, if it is present, then it should be either a "." followed by * a number, or a "." followed by an asterisk. The asterisk means that the * next argument is an (int) which should be used as the pad width. Clipping * only affects strings; for other data types it is ignored. * * The <type> is one of "s" for strings, "c" for characters (really ints that * are assumed to be legal char values), "d" for ints, "ld" for long ints, or * "%" to output a percent sign. */ /* NOTE: Variable argument lists are handled by direct stack-twiddling. Sorry! */ static void cvtnum(buf, num, base) char *buf; /* where to store the number */ unsigned long num; /* the number to convert */ int base; /* either 8, 10, or 16 */ { static char digits[] = "0123456789abcdef"; unsigned long tmp; /* if the number is 0, then just stuff a "0" into the buffer */ if (num == 0L) { buf[0] = '0'; buf[1] = '\0'; return; } /* use tmp to figure out how many digits we'll need */ for (tmp = num; tmp > 0; tmp /= base) { buf++; } /* mark the spot that will be the end of the string */ *buf = '\0'; /* generate all digits, as needed */ for (tmp = num; tmp > 0; tmp /= base) { *--buf = digits[tmp % base]; } } int sprintf(buf, fmt, argref) char *buf; /* where to deposit the formatted output */ char *fmt; /* the format string */ int argref; /* the first argument is located at &argref */ { char *argptr;/* pointer to next argument on the stack */ int pad; /* value of the pad string */ int clip; /* value of the clip string */ long num; /* a binary number being converted to ASCII digits */ long digit; /* used during conversion */ char *src, *dst; /* make argptr point to the first argument after the format string */ argptr = (char *)&argref; /* loop through the whole format string */ while (*fmt) { /* if not part of a place-holder, then copy it literally */ if (*fmt != '%') { *buf++ = *fmt++; continue; } /* found a place-holder! Get <pad> value */ fmt++; if ('*' == *fmt) { pad = *((int *)argptr)++; fmt++; } else if (*fmt == '-' || (*fmt >= '0' && *fmt <= '9')) { pad = atol(fmt); do { fmt++; } while (*fmt >= '0' && *fmt <= '9'); } else { pad = 0; } /* get a <clip> value */ if (*fmt == '.') { fmt++; if ('*' == *fmt) { clip = *((int *)argptr)++; fmt++; } else if (*fmt >= '0' && *fmt <= '9') { clip = atol(fmt); do { fmt++; } while (*fmt >= '0' && *fmt <= '9'); } } else { clip = 0; } /* handle <type>, possibly noticing <clip> */ switch (*fmt++) { case 'c': buf[0] = *((int *)argptr)++; buf[1] = '\0'; break; case 's': src = *((char **)argptr)++; if (!src) { src = "(null)"; } if (clip) { strncpy(buf, src, clip); buf[clip] = '\0'; } else { strcpy(buf, src); } break; case 'l': fmt++; /* to skip the "d" in "%ld" */ num = *((long *)argptr)++; dst = buf; if (num < 0) { *dst++ = '-'; num = -num; } cvtnum(dst, num, 10); break; case 'x': num = *((int *)argptr)++; cvtnum(buf, num, 16); break; case 'd': num = *((int *)argptr)++; dst = buf; if (num < 0) { *dst++ = '-'; num = -num; } cvtnum(dst, num, 10); break; default: buf[0] = fmt[-1]; buf[1] = '\0'; } /* now fix the padding, if the value is too short */ clip = strlen(buf); if (pad < 0) { /* add spaces after the value */ pad = -pad - clip; for (buf += clip; pad > 0; pad--) { *buf++ = ' '; } *buf = '\0'; } else { /* add spaces before the value */ pad -= clip; if (pad > 0) { src = buf + clip; dst = src + pad; *dst = '\0'; while (src > buf) { *--dst = *--src; } while (dst > buf) { *--dst = ' '; } } buf += strlen(buf); } } /* mark the end of the output string */ *buf = '\0'; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tinytcap.c */ /* This file contains functions which simulate the termcap functions. * * It doesn't access a "termcap" file. Instead, it uses an initialized array * of strings to store the entries. Any string that doesn't start with a ':' * is taken to be the name of a type of terminal. Any string that does start * with a ':' is interpretted as the list of fields describing all of the * terminal types that precede it. * * Note: since these are C strings, you can't use special sequences like * ^M or \E in the fields; your C compiler won't understand them. Also, * at run time there is no way to tell the difference between ':' and '\072' * so I sure hope your terminal definition doesn't require a ':' character. * * getenv(TERM) on VMS checks the SET TERM device setting. To implement * non-standard terminals set the logical ELVIS_TERM in VMS. (jdc) * * Other possible terminal types are... * TERM_WYSE925 - "wyse925", a Wyse 50 terminal emulating Televideo 925 * ... or you could set $TERMCAP to the terminal's description string, which * $TERM set up to match it. * * Note that you can include several terminal types at the same time. Elvis * chooses which entry to use at runtime, based primarily on the value of $TERM. */ #include "config.h" extern char *getenv(); /* decide which terminal descriptions should *always* be included. */ #if MSDOS # define TERM_NANSI # define TERM_DOSANSI # if RAINBOW # define TERM_RAINBOW # endif #endif #if VMS # define TERM_VT100 # define TERM_VT100W # define TERM_VT52 #endif #if AMIGA # define TERM_AMIGA /* Internal Amiga termcap entry */ /* # define TERM_VT52 /* The rest of these are here for those */ # define TERM_VT100 /* people who want to use elvis over an */ /* # define TERM_NANSI /* AUX: port (serial.device). */ /* # define TERM_DOSANSI /* Take out all but AMIGA to save memory. */ /* # define TERM_MINIX /* Vanilla ANSI? */ /* # define TERM_925 /* Hang a terminal off your Amiga */ #endif #if MINIX || UNIXV # define TERM_MINIX #endif #if COHERENT # define TERM_COHERENT #endif #if TOS # define TERM_ATARI #endif static char *termcap[] = { #ifdef TERM_AMIGA "AA", "amiga", "Amiga ANSI", /* Amiga termcap modified from version 1.3 by Kent Polk */ ":co#80:li#24:am:bs:bw:xn:\ :AL=\233%dL:DC=\233%dP:DL=\233%dM:DO=\233%dB:\ :LE=\233%dD:RI=\233%dC:SF=\233%dS:SR=\233%dT:UP=\233%dA:IC=\233%d@:\ :ae=\2330m:al=\233L:as=\2333m:bl=\007:bt=\233Z:cd=\233J:\ :ce=\233K:cl=\013:cm=\233%i%d;%dH:dc=\233P:dl=\233M:do=\233B:\ :kb=^H:ho=\233H:ic=\233@:is=\23320l:\ :mb=\2337;2m:md=\2331m:me=\2330m:mh=\2332m:mk=\2338m:mr=\2337m:nd=\233C:\ :rs=\033c:se=\2330m:sf=\233S:so=\2337m:sb=\233T:sr=\233T:ue=\23323m:\ :up=\233A:us=\2334m:vb=\007:ve=\233\040p:vi=\2330\040p:\ :k1=\2330~:k2=\2331~:k3=\2332~:k4=\2333~:k5=\2334~:\ :k6=\2335~:k7=\2336~:k8=\2337~:k9=\2338~:k0=\2339~:\ :s1=\23310~:s2=\23311~:s3=\23312~:s4=\23313~:s5=\23314~:\ :s6=\23315~:s7=\23316~:s8=\23317~:s9=\23318~:s0=\23319~:\ :kd=\233B:kl=\233D:kn#10:kr=\233C:ku=\233A:le=\233D:\ :kP=\233T:kN=\233S:kh=\233\040A:kH=\233\040@:", #endif #ifdef TERM_NANSI "fansi", "nnansi", "nansi", "pcbios", ":al=\033[L:dl=\033[M:am:bs:ce=\033[K:cl=\033[2J:\ :cm=\033[%i%d;%dH:co#80:do=\033[B:\ :k1=#;:k2=#<:k3=#=:k4=#>:k5=#?:k6=#@:k7=#A:k8=#B:k9=#C:k0=#D:\ :s1=#T:s2=#U:s3=#V:s4=#W:s5=#X:s6=#Y:s7=#Z:s8=#[:s9=#\\:s0=#]:\ :c1=#^:c2=#_:c3=#`:c4=#a:c5=#b:c6=#c:c7=#d:c8=#e:c9=#f:c0=#g:\ :a1=#h:a2=#i:a3=#j:a4=#k:a5=#l:a6=#m:a7=#n:a8=#o:a9=#p:a0=#q:\ :kd=#P:kh=#G:kH=#O:kI=#R:kl=#K:kN=#Q:kP=#I:kr=#M:ku=#H:\ :li#25:md=\033[1m:me=\033[m:nd=\033[C:se=\033[m:so=\033[7m:\ :ue=\033[m:up=\033[A:us=\033[4m:", #endif #ifdef TERM_DOSANSI #if !ANY_UNIX "ansi", #endif "dosansi", ":am:bs:ce=\033[K:cl=\033[2J:\ :cm=\033[%i%d;%dH:co#80:do=\033[B:\ :k1=#;:k2=#<:k3=#=:k4=#>:k5=#?:k6=#@:k7=#A:k8=#B:k9=#C:k0=#D:\ :s1=#T:s2=#U:s3=#V:s4=#W:s5=#X:s6=#Y:s7=#Z:s8=#[:s9=#\\:s0=#]:\ :c1=#^:c2=#_:c3=#`:c4=#a:c5=#b:c6=#c:c7=#d:c8=#e:c9=#f:c0=#g:\ :a1=#h:a2=#i:a3=#j:a4=#k:a5=#l:a6=#m:a7=#n:a8=#o:a9=#p:a0=#q:\ :kd=#P:kh=#G:kH=#O:kI=#R:kl=#K:kN=#Q:kP=#I:kr=#M:ku=#H:\ :li#25:md=\033[1m:me=\033[m:nd=\033[C:se=\033[m:so=\033[7m:\ :ue=\033[m:up=\033[A:us=\033[4m:", #endif #ifdef TERM_RAINBOW "vt220", "rainbow", ":al=\033[L:dl=\033[M:am:bs:ce=\033[K:cl=\033[2J:\ :cm=\033[%i%d;%dH:co#80:do=\033[B:kd=\033[B:kl=\033[D:\ :kr=\033[C:ku=\033[A:kP=\033[5~:kN=\033[6~:kI=\033[2~:\ :li#24:md=\033[1m:me=\033[m:nd=\033[C:se=\033[m:so=\033[7m:\ :ue=\033[m:up=\033[A:us=\033[4m:xn:", #endif #ifdef TERM_VT100 "vt100-80", "vt200-80", "vt300-80", "vt101-80", "vt102-80", ":al=\033[L:am:bs:ce=\033[K:cl=\033[2J:cm=\033[%i%d;%dH:\ :co#80:dl=\033[M:do=\033[B:k0=\033[20~:k1=\033[1~:\ :k2=\033[2~:k3=\033[3~:k4=\033[4~:k5=\033[5~:k6=\033[6~:\ :k7=\033[17~:k8=\033[18~:k9=\033[19~:kd=\033[B:kh=\033[H:\ :kH=\033[Y:kI=\033[I:kl=\033[D:kN=\033[U:kP=\033[V:\ :kr=\033[C:ku=\033[A:li#24:md=\033[1m:me=\033[m:nd=\033[C:\ :se=\033[m:so=\033[7m:ti=\033[1;24r\033[24;1H:\ :ue=\033[m:up=\033[A:us=\033[4m:xn:", #endif #ifdef TERM_VT100W "vt100-w", "vt200-w", "vt300-w", "vt101-w", "vt102-w", "vt100-132", "vt200-132", "vt300-132", "vt101-132", "vt102-132", ":al=\033[L:am:bs:ce=\033[K:cl=\033[2J:cm=\033[%i%d;%dH:\ :co#132:dl=\033[M:do=\033[B:k0=\033[20~:k1=\033[1~:\ :k2=\033[2~:k3=\033[3~:k4=\033[4~:k5=\033[5~:k6=\033[6~:\ :k7=\033[17~:k8=\033[18~:k9=\033[19~:kd=\033[B:kh=\033[H:\ :kH=\033[Y:kI=\033[I:kl=\033[D:kN=\033[U:kP=\033[V:\ :kr=\033[C:ku=\033[A:li#24:md=\033[1m:me=\033[m:nd=\033[C:\ :se=\033[m:so=\033[7m:ti=\033[1;24r\033[24;1H:\ :ue=\033[m:up=\033[A:us=\033[4m:xn:", #endif #ifdef TERM_VT52 "vt52", ":do=\n:le=\b:up=\033A:nd=\033C:cm=\033Y%+ %+ :ti=\033e\033v:\ :sr=\033I:cd=\033J:ce=\033K:cl=\033H\033J:co#80:li#24:\ :ku=\033A:kd=\033B:kr=\033C:kl=\033D:kb=\b:pt:am:xn:bs:", #endif #ifdef TERM_MINIX "minix", "ansi", "AT386", ":al=\033[L:am:bs:ce=\033[K:cl=\033[2J:cm=\033[%i%d;%dH:\ :co#80:dl=\033[M:do=\033[B:k0=\033[20~:k1=\033[1~:\ :k2=\033[2~:k3=\033[3~:k4=\033[4~:k5=\033[5~:k6=\033[6~:\ :k7=\033[17~:k8=\033[18~:k9=\033[19~:kd=\033[B:kh=\033[H:\ :kH=\033[Y:kI=\033[I:kl=\033[D:kN=\033[U:kP=\033[V:\ :kr=\033[C:ku=\033[A:li#25:md=\033[1m:me=\033[m:nd=\033[C:\ :se=\033[m:so=\033[7m:ue=\033[m:up=\033[A:us=\033[4m:", #endif /* MINIX */ #ifdef TERM_COHERENT "coherent", "ansipc", ":al=\033[L:am:bs:ce=\033[K:cl=\033[2J:cm=\033[%i%d;%dH:\ :co#80:dl=\033[M:do=\033[B:k0=\033[0x:k1=\033[1x:k2=\033[2x:\ :k3=\033[3x:k4=\033[4x:k5=\033[5x:k6=\033[6x:\ :k7=\033[7x:k8=\033[8x:k9=\033[9x:kd=\033[B:kh=\033[H:\ :kH=\033[24H:kI=\033[@:kl=\033[D:kN=\033[U:kP=\033[V:\ :kr=\033[C:ku=\033[A:li#24:md=\033[1m:me=\033[m:\ :nd=\033[C:se=\033[m:so=\033[7m:ue=\033[m:up=\033[A:\ :us=\033[4m:", #endif /* COHERENT */ #ifdef TERM_ATARI "atari-st", "vt52", ":al=\033L:am:bs:ce=\033K:cl=\033E:cm=\033Y%i%+ %+ :\ :co#80:dl=\033M:do=\033B:\ :k1=#;:k2=#<:k3=#=:k4=#>:k5=#?:k6=#@:k7=#A:k8=#B:k9=#C:k0=#D:\ :s1=#T:s2=#U:s3=#V:s4=#W:s5=#X:s6=#Y:s7=#Z:s8=#[:s9=#\\:s0=#]:\ :c1=#^:c2=#_:c3=#`:c4=#a:c5=#b:c6=#c:c7=#d:c8=#e:c9=#f:c0=#g:\ :a1=#h:a2=#i:a3=#j:a4=#k:a5=#l:a6=#m:a7=#n:a8=#o:a9=#p:a0=#q:\ kd=#P:kh=#G:kI=#R:kl=#K:kr=#M:ku=#H:li#25:nd=\033C:se=\033q:\ :so=\033p:te=:ti=\033e\033v:up=\033A:", #endif #ifdef TERM_925 "wyse925", ":xn@:\ :hs:am:bs:co#80:li#24:cm=\033=%+ %+ :cl=\033*:cd=\033y:\ :ce=\033t:is=\033l\033\":\ :al=\033E:dl=\033R:im=:ei=:ic=\033Q:dc=\033W:\ :ho=\036:nd=\014:bt=\033I:pt:so=\033G4:se=\033G0:sg#1:us=\033G8:ue=\033G0:ug#1:\ :up=\013:do=\026:kb=\010:ku=\013:kd=\026:kl=\010:kr=\014:\ :kh=\036:ma=\026\012\014 :\ :k1=\001@\r:k2=\001A\r:k3=\001B\r:k4=\001C\r:k5=\001D\r:k6=\001E\r:k7=\001F\r:\ :k8=\001G\r:k9=\001H\r:k0=\001I\r:ko=ic,dc,al,dl,cl,ce,cd,bt:\ :ts=\033f:fs=\033g:ds=\033h:sr=\033j:", /* was :xn: for tvi925 alone*/ #endif (char *)0 }; static char *fields; /*ARGSUSED*/ int tgetent(bp, name) char *bp; /* buffer for storing the entry -- ignored */ char *name; /* name of the entry */ { int i; /* if TERMCAP is defined, and seems to match, then use it */ fields = getenv("TERMCAP"); if (fields) { for (i = 0; fields[i] && fields[i] != ':'; i++) { if (!strncmp(fields + i, name, strlen(name))) { return 1; } } } /* locate the entry1B��3B��4B��5B�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� in termcap[] */ for (i = 0; termcap[i] && strcmp(termcap[i], name); i++) { } if (!termcap[i]) { return 0; } /* search forward for fields */ while (termcap[i][0] != ':') { i++; } fields = termcap[i]; return 1; } static char *find(id, vtype) char *id; /* name of a value to locate */ int vtype; /* '=' for strings, '#' for numbers, or 0 for bools */ { int i; /* search for a ':' followed by the two-letter id */ for (i = 0; fields[i]; i++) { if (fields[i] == ':' && fields[i + 1] == id[0] && fields[i + 2] == id[1]) { /* if correct type, then return its value */ if (fields[i + 3] == vtype) return &fields[i + 4]; else return (char *)0; } } return (char *)0; } int tgetnum(id) char *id; { id = find(id, '#'); if (id) { return atoi(id); } return -1; } int tgetflag(id) char *id; { if (find(id, ':')) { return 1; } return 0; } /*ARGSUSED*/ char *tgetstr(id, bp) char *id; char **bp; /* pointer to pointer to buffer - ignored */ { char *cpy; /* find the string */ id = find(id, '='); if (!id) { return (char *)0; } /* copy it into the buffer, and terminate it with NUL */ for (cpy = *bp; *id != ':'; ) { if (id[0] == '\\' && id[1] == 'E') *cpy++ = '\033', id += 2; else *cpy++ = *id++; } *cpy++ = '\0'; /* update the bp pointer */ id = *bp; *bp = cpy; /* return a pointer to the copy of the string */ return id; } /*ARGSUSED*/ char *tgoto(cm, destcol, destrow) char *cm; /* cursor movement string -- ignored */ int destcol;/* destination column, 0 - 79 */ int destrow;/* destination row, 0 - 24 */ { static char buf[30]; #ifdef CRUNCH # if TOS sprintf(buf, "\033Y%c%c", ' ' + destrow, ' ' + destcol); # else sprintf(buf, "\033[%d;%dH", destrow + 1, destcol + 1); # endif #else if (cm[1] == 'Y' || cm[1] == '=') sprintf(buf, "\033%c%c%c", cm[1], ' ' + destrow, ' ' + destcol); else sprintf(buf, "\033[%d;%dH", destrow + 1, destcol + 1); #endif return buf; } /*ARGSUSED*/ void tputs(cp, affcnt, outfn) char *cp; /* the string to output */ int affcnt; /* number of affected lines -- ignored */ int (*outfn)(); /* the output function */ { while (*cp) { (*outfn)(*cp); cp++; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tio.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains terminal I/O functions */ #include "config.h" #include "vi.h" #include "ctype.h" /* This function reads in a line from the terminal. */ int vgets(prompt, buf, bsize) char prompt; /* the prompt character, or '\0' for none */ char *buf; /* buffer into which the string is read */ int bsize; /* size of the buffer */ { int len; /* how much we've read so far */ int ch; /* a character from the user */ int quoted; /* is the next char quoted? */ int tab; /* column position of cursor */ char widths[132]; /* widths of characters */ int word; /* index of first letter of word */ #ifndef NO_DIGRAPH int erased; /* 0, or first char of a digraph */ #endif /* show the prompt */ move(LINES - 1, 0); tab = 0; if (prompt) { addch(prompt); tab = 1; } clrtoeol(); refresh(); /* read in the line */ #ifndef NO_DIGRAPH erased = #endif quoted = len = 0; for (;;) { #ifndef NO_ABBR if (quoted || mode == MODE_EX) { ch = getkey(0); } else { /* maybe expand an abbreviation while getting key */ for (word = len; --word >= 0 && isalnum(buf[word]); ) { } word++; ch = getabkey(WHEN_EX, &buf[word], len - word); } #else ch = getkey(0); #endif #ifndef NO_EXTENSIONS if (ch == ctrl('O')) { ch = getkey(quoted ? 0 : WHEN_EX); } #endif /* some special conversions */ if (ch == ctrl('D') && len == 0) ch = ctrl('['); #ifndef NO_DIGRAPH if (*o_digraph && erased != 0 && ch != '\b') { ch = digraph(erased, ch); erased = 0; } #endif /* inhibit detection of special chars (except ^J) after a ^V */ if (quoted && ch != '\n') { ch |= 256; } /* process the character */ switch(ch) { case ctrl('V'): qaddch('^'); qaddch('\b'); quoted = TRUE; break; case ctrl('['): return -1; case '\n': #if OSK case '\l': #else case '\r': #endif clrtoeol(); goto BreakBreak; case '\b': if (len > 0) { len--; #ifndef NO_DIGRAPH erased = buf[len]; #endif for (ch = widths[len]; ch > 0; ch--) addch('\b'); if (mode == MODE_EX) { clrtoeol(); } tab -= widths[len]; } else { return -1; } break; default: /* strip off quotation bit */ if (ch & 256) { ch &= ~256; qaddch(' '); qaddch('\b'); } /* add & echo the char */ if (len < bsize - 1) { if (ch == '\t' && !quoted) { widths[len] = *o_tabstop - (tab % *o_tabstop); addstr(" " + 8 - widths[len]); tab += widths[len]; } else if (ch > 0 && ch < ' ') /* > 0 by GB */ { addch('^'); addch(ch + '@'); widths[len] = 2; tab += 2; } else if (ch == '\177') { addch('^'); addch('?'); widths[len] = 2; tab += 2; } else { addch(ch); widths[len] = 1; tab++; } buf[len++] = ch; } else { beep(); } quoted = FALSE; } } BreakBreak: refresh(); buf[len] = '\0'; return len; } static int manymsgs; /* This variable keeps msgs from overwriting each other */ static char pmsg[80]; /* previous message (waiting to be displayed) */ static int showmsg() { /* if there is no message to show, then don't */ if (!manymsgs) return FALSE; /* display the message */ move(LINES - 1, 0); if (*pmsg) { standout(); qaddch(' '); qaddstr(pmsg); qaddch(' '); standend(); } clrtoeol(); manymsgs = FALSE; return TRUE; } void endmsgs() { if (manymsgs) { showmsg(); addch('\n'); } } /* Write a message in an appropriate way. This should really be a varargs * function, but there is no such thing as vwprintw. Hack!!! * * In MODE_EX or MODE_COLON, the message is written immediately, with a * newline at the end. * * In MODE_VI, the message is stored in a character buffer. It is not * displayed until getkey() is called. msg() will call getkey() itself, * if necessary, to prevent messages from being lost. * * msg("") - clears the message line * msg("%s %d", ...) - does a printf onto the message line */ /*VARARGS1*/ void msg(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7) char *fmt; long arg1, arg2, arg3, arg4, arg5, arg6, arg7; { if (mode != MODE_VI) { sprintf(pmsg, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7); qaddstr(pmsg); addch('\n'); exrefresh(); } else { /* wait for keypress between consecutive msgs */ if (manymsgs) { getkey(WHEN_MSG); } /* real message */ sprintf(pmsg, fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7); if (*fmt) { manymsgs = TRUE; } } } /* This function calls refresh() if the option exrefresh is set */ void exrefresh() { char *scan; /* If this ex command wrote ANYTHING set exwrote so vi's : command * can tell that it must wait for a user keystroke before redrawing. */ for (scan=kbuf; scan<stdscr; scan++) if (*scan == '\n') exwrote = TRUE; /* now we do the refresh thing */ if (*o_exrefresh) { refresh(); } else { wqrefresh(); } if (mode != MODE_VI) { manymsgs = FALSE; } } /* This structure is used to store maps and abbreviations. The distinction * between them is that maps are stored in the list referenced by the "maps" * pointer, while abbreviations are referenced by the "abbrs" pointer. */ typedef struct _map { struct _map *next; /* another abbreviation */ short len; /* length of the "rawin" characters */ short flags; /* various flags */ char *label; /* label of the map/abbr, or NULL */ char *rawin; /* the "rawin" characters */ char *cooked;/* the "cooked" characters */ } MAP; static char keybuf[KEYBUFSIZE]; static int cend; /* end of input characters */ static int user; /* from user through end are chars typed by user */ static int next; /* index of the next character to be returned */ static MAP *match; /* the matching map, found by countmatch() */ static MAP *maps; /* the map table */ #ifndef NO_ABBR static MAP *abbrs; /* the abbreviation table */ #endif /* ring the terminal's bell */ void beep() { /* do a visible/audible bell */ if (*o_flash) { do_VB(); refresh(); } else if (*o_errorbells) { ttywrite("\007", 1); } /* discard any buffered input, and abort macros */ next = user = cend; } /* This function replaces a "rawin" character sequence with the "cooked" version, * by modifying the internal type-ahead buffer. */ void execmap(rawlen, cookedstr, visual) int rawlen; /* length of rawin text -- string to delete */ char *cookedstr; /* the cooked text -- string to insert */ int visual; /* boolean -- chars to be executed in visual mode? */ { int cookedlen; char *src, *dst; int i; /* find the length of the cooked string */ cookedlen = strlen(cookedstr); #ifndef NO_EXTENSIONS if (visual) { cookedlen *= 2; } #endif /* if too big to fit in type-ahead buffer, then don't do it */ if (cookedlen + (cend - next) - rawlen > KEYBUFSIZE) { return; } /* shift to make room for cookedstr at the front of keybuf */ src = &keybuf[next + rawlen]; dst = &keybuf[cookedlen]; i = cend - (next + rawlen); if (src >= dst) { while (i-- > 0) { *dst++ = *src++; } } else { src += i; dst += i; while (i-- > 0) { *--dst = *--src; } } /* insert cookedstr, and adjust offsets */ cend += cookedlen - rawlen - next; user += cookedlen - rawlen - next; next = 0; for (dst = keybuf, src = cookedstr; *src; ) { #ifndef NO_EXTENSIONS if (visual) { *dst++ = ctrl('O'); cookedlen--; } #endif *dst++ = *src++; } #ifdef DEBUG2 { #include <stdio.h> FILE *debout; int i; debout = fopen("debug.out", "a"); fprintf(debout, "After execmap(%d, \"%s\", %d)...\n", rawlen, cookedstr, visual); for (i = 0; i < cend; i++) { if (i == next) fprintf(debout, "(next)"); if (i == user) fprintf(debout, "(user)"); if (UCHAR(keybuf[i]) < ' ') fprintf(debout, "^%c", keybuf[i] ^ '@'); else fprintf(debout, "%c", keybuf[i]); } fprintf(debout, "(end)\n"); fclose(debout); } #endif } /* This function calls ttyread(). If necessary, it will also redraw the screen, * ch=B��?B��@B��AB��BB��CB��DB��EB��FB��GB��HB��IB��JB��KB����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ange the cursor shape, display the mode, and update the ruler. If the * number of characters read is 0, and we didn't time-out, then it exits because * we've apparently reached the end of an EX script. */ static int fillkeybuf(when, timeout) int when; /* mixture of WHEN_XXX flags */ int timeout;/* timeout in 1/10 second increments, or 0 */ { int nkeys; #ifndef NO_SHOWMODE static int oldwhen; /* "when" from last time */ static int oldleft; static long oldtop; static long oldnlines; char *str; #endif #ifndef NO_CURSORSHAPE static int oldcurs; #endif #ifdef DEBUG watch(); #endif #ifndef NO_CURSORSHAPE /* make sure the cursor is the right shape */ if (has_CQ) { if (when != oldcurs) { switch (when) { case WHEN_EX: do_CX(); break; case WHEN_VICMD: do_CV(); break; case WHEN_VIINP: do_CI(); break; case WHEN_VIREP: do_CR(); break; } oldcurs = when; } } #endif #ifndef NO_SHOWMODE /* if "showmode" then say which mode we're in */ if (*o_smd && (when & WHENMASK)) { /* redraw the screen before we check to see whether the * "showmode" message needs to be redrawn. */ redraw(cursor, !(when & WHEN_VICMD)); /* now the "topline" test should be valid */ if (when != oldwhen || topline != oldtop || leftcol != oldleft || nlines != oldnlines) { oldwhen = when; oldtop = topline; oldleft = leftcol; oldnlines = nlines; if (when & WHEN_VICMD) str = "Command"; else if (when & WHEN_VIINP) str = " Input "; else if (when & WHEN_VIREP) str = "Replace"; else if (when & WHEN_REP1) str = " Rep 1 "; else if (when & WHEN_CUT) str = "BufName"; else if (when & WHEN_MARK) str = "Mark AZ"; else if (when & WHEN_CHAR) str = "Dest Ch"; else str = (char *)0; if (str) { move(LINES - 1, COLS - 10); standout(); qaddstr(str); standend(); } } } #endif #ifndef NO_EXTENSIONS /* maybe display the ruler */ if (*o_ruler && (when & (WHEN_VICMD|WHEN_VIINP|WHEN_VIREP))) { char buf[20]; redraw(cursor, !(when & WHEN_VICMD)); pfetch(markline(cursor)); sprintf(buf, "%7ld,%-4d", markline(cursor), 1 + idx2col(cursor, ptext, when & (WHEN_VIINP|WHEN_VIREP))); move(LINES - 1, COLS - 22); addstr(buf); } #endif /* redraw, so the cursor is in the right place */ if (when & WHENMASK) { redraw(cursor, !(when & (WHENMASK & ~(WHEN_VIREP|WHEN_VIINP)))); } /* Okay, now we can finally read the rawin keystrokes */ refresh(); nkeys = ttyread(keybuf + cend, sizeof keybuf - cend, timeout); /* if nkeys == 0 then we've reached EOF of an ex script. */ if (nkeys == 0 && timeout == 0) { tmpabort(TRUE); move(LINES - 1, 0); clrtoeol(); refresh(); endwin(); exit(1); } cend += nkeys; user += nkeys; return nkeys; } /* This function counts the number of maps that could match the characters * between &keybuf[next] and &keybuf[cend], including incomplete matches. * The longest comlete match is remembered via the "match" variable. */ static int countmatch(when) int when; /* mixture of WHEN_XXX flags */ { MAP *map; int count; /* clear the "match" variable */ match = (MAP *)0; /* check every map */ for (count = 0, map = maps; map; map = map->next) { /* can't match if wrong mode */ if ((map->flags & when) == 0) { continue; } /* would this be a complete match? */ if (map->len <= cend - next) { /* Yes, it would be. Now does it really match? */ if (!strncmp(map->rawin, &keybuf[next], map->len)) { count++; /* if this is the longest complete match, * then remember it. */ if (!match || match->len < map->len) { match = map; } } } else { /* No, it wouldn't. But check for partial match */ if (!strncmp(map->rawin, &keybuf[next], cend - next)) { count++; } } } return count; } #ifndef NO_ABBR /* This function checks to see whether a word is an abbreviation. If it is, * then an appropriate number of backspoace characters is inserted into the * type-ahead buffer, followed by the expanded form of the abbreviation. */ static void expandabbr(word, wlen) char *word; int wlen; { MAP *abbr; /* if the next character wouldn't end the word, then don't expand */ if (isalnum(keybuf[next]) || keybuf[next] == ctrl('V')) { return; } /* find the abbreviation, if any */ for (abbr = abbrs; abbr && (abbr->len != wlen || strncmp(abbr->rawin, word, wlen)); abbr = abbr->next) { } /* If an abbreviation was found, then expand it by inserting the long * version into the type-ahead buffer, and then inserting (in front of * the long version) enough backspaces to erase to the short version. */ if (abbr) { execmap(0, abbr->cooked, FALSE); while (wlen > 15) { execmap(0, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b", FALSE); wlen -= 15; } if (wlen > 0) { execmap(0, "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" + 15 - wlen, FALSE); } } } #endif /* This function calls getabkey() without attempting to expand abbreviations */ int getkey(when) int when; /* mixture of WHEN_XXX flags */ { return getabkey(when, "", 0); } /* This is it. This function returns keystrokes one-at-a-time, after mapping * and abbreviations have been taken into account. */ int getabkey(when, word, wlen) int when; /* mixture of WHEN_XXX flags */ char *word; /* a word that may need to be expanded as an abbr */ int wlen; /* length of "word" -- since "word" might not have \0 */ { int matches; /* if this key is needed for delay between multiple error messages, * then reset the manymsgs flag and abort any mapped key sequence. */ if (showmsg()) { if (when == WHEN_MSG) { #ifndef CRUNCH if (!*o_more) { refresh(); return ' '; } #endif qaddstr("[More...]"); refresh(); execmap(user, "", FALSE); } } #ifdef DEBUG /* periodically check for screwed up internal tables */ watch(); #endif /* if buffer empty, read some characters without timeout */ if (next >= cend) { next = user = cend = 0; fillkeybuf(when, 0); } /* try to map the key, unless already mapped and not ":set noremap" */ if (next >= user || *o_remap) { do { do { matches = countmatch(when); } while (matches > 1 && fillkeybuf(when, *o_keytime) > 0); if (matches == 1) { execmap(match->len, match->cooked, (match->flags & WHEN_INMV) != 0 && (when & (WHEN_VIINP|WHEN_VIREP)) != 0); } } while (*o_remap && matches == 1); } #ifndef NO_ABBR /* try to expand an abbreviation, except in visual command mode */ if (wlen > 0 && (mode & (WHEN_EX|WHEN_VIINP|WHEN_VIREP)) != 0) { expandabbr(word, wlen); } #endif /* ERASEKEY should always be mapped to '\b'. */ if (keybuf[next] == ERASEKEY) { keybuf[next] = '\b'; } /* return the next key */ return keybuf[next++]; } /* This function maps or unmaps a key */ void mapkey(rawin, cooked, when, name) char *rawin; /* the input key sequence, before mapping */ char *cooked;/* after mapping -- or NULL to remove map */ short when; /* bitmap of when mapping should happen */ char *name; /* name of the key, NULL for no name, "abbr" for abbr */ { MAP **head; /* head of list of maps or abbreviations */ MAP *scan; /* used for scanning through the list */ MAP *prev; /* used during deletions */ /* Is this a map or an abbreviation? Choose the right list. */ #ifndef NO_ABBR head = ((!name || strcmp(name, "abbr")) ? &maps : &abbrs); #else head = &maps; #endif /* try to find the map in the list */ for (scan = *head, prev = (MAP *)0; scan && (strcmp(rawin, scan->rawin) || !(scan->flags & when & (WHEN_EX|WHEN_VICMD|WHEN_VIINP|WHEN_VIREP))); prev = scan, scan = scan->next) { } /* trying to map? (not unmap) */ if (cooked && *cooked) { /* if map starts with "visual ", then mark it as a visual map */ if (head == &maps && !strncmp(cooked, "visual ", 7)) { cooked += 7; when |= WHEN_INMV; } /* "visual" maps always work in input mode */ if (when & WHEN_INMV) { when |= WHEN_VIINP|WHEN_VIREP|WHEN_POPUP; } /* if not already in the list, then allocate a new structure */ if (!scan) { scan = (MAP *)malloc(sizeof(MAP)); scan->len = strlen(rawin); scan->rawin = malloc(scan->len + 1); strcpy(scan->rawin, rawin); scan->flags = when; scan->label = name; if (*head) { prev->next = scan; } else { *head = scan; } scan->next = (MAP *)0; } else /* recycle old structure */ { free(scan->cooked); } scan->cooked = malloc(strlen(cooked) + 1); strcpy(scan->cooked, cooked); } else /* unmapping */ { /* if nothing to unmap, then exit silently */ if (!scan) { return; } /* unlink the structure from the list */ if (prev) { prev->next = scan->next; } else { *head = scan->next; } /* free it, and the strings that it refers to */ free(scan->rawin); free(scan->cooked); free(scan); } } /* This function returns a printable version of a string. It uses tmpblk.c */ char *printable(str) char *str; /* the string to convert */ { char *build; /* used for building the string */ for (build = tmpblk.c; *str; str++) { #if AMIGA if (*str == '\233') { *build++ = '<'; *build++ = 'C'; *build++ = 'S'; *build++ = 'I'; *build++ = '>'; } else #endif if (UCHAR(*str) < ' ' || *str == '\177') { *build++ = '^'; *build++ = *str ^ '@'; } else { *build++ = *str; } } *build = '\0'; return tmpblk.c; } /* This function displays the contents of either the map table or the * abbreviation table. User commands call this function as follows: * :map dumpkey(WHEN_VICMD, FALSE); * :map! dumpkey(WHEN_VIREP|WHEN_VIINP, FALSE); * :abbr dumpkey(WHEN_VIINP|WHEN_VIREP, TRUE); * :abbr! dumpkey(WHEN_EX|WHEN_VIINP|WHEN_VIREP, TRUE); */ void dumpkey(when, abbr) int when; /* WHEN_XXXX of mappings to be dumped */ int abbr; /* boolean: dump abbreviations instead of maps? */ { MAP *scan; char *str; int len; #ifndef NO_ABBR for (scan = (abbr ? abbrs : maps); scan; scan = scan->next) #else for (scan = maps; scan; scan = scan->next) #endif { /* skip entries that don't match "when" */ if ((scan->flags & when) == 0) { continue; } /* dump the key label, if any */ if (!abbr) { len = 8; if (scan->label) { qaddstr(scan->label); len -= strlen(scan->label); } do { qaddch(' '); } while (len-- > 0); } /* dump the rawin version */ str = printable(scan->rawin); qaddstr(str); len = strlen(str); do { qaddch(' '); } while (len++ < 8); /* dump the mapped version */ #ifndef NO_EXTENSIONS if ((scan->flags & WHEN_INMV) && (when & (WHEN_VIINP|WHEN_VIREP))) { qaddstr("visual "); } #endif str = printable(scan->cooked); qaddstr(str); addch('\n'); exrefresh(); } } #ifndef NO_MKEXRC static safequote(str) char *str; { char *build; build = tmpblk.c + strlen(tmpblk.c); while (*str) { if (*str <= ' ' && *str >= 1 || *str == '|') { *build++ = ctrl('V'); } *build++ = *str++; } *build = '\0'; } /* This function saves the contents of either the map table or the * abbreviation table into a file. Both the "bang" and "no bang" versions * are saved. * :map dumpkey(WHEN_VICMD, FALSE); * :map! dumpkey(WHEN_VIREP|WHEN_VIINP, FALSE); * :abbr dumpkey(WHEN_VIINP|WHEN_VIREP, TRUE); * :abbr! dumpkey(WHEN_EX|WHEN_VIINP|WHEN_VIREP, TRUE); */ savemaps(fd, abbr) int fd; /* file descriptor of an open file to write to */ int abbr; /* boolean: do abbr table? (else do map table) */ { MAP *scan; char *str; int bang; int when; int len; # ifndef NO_ABBR for (scan = (abbr ? abbrs : maps); scan; scan = scan->next) # else for (scan = maps; scan; scan = scan->next) # endif { /* skip maps that have labels, except for function keys */ if (scan->label && *scan->label != '#') { continue; } for (bang = 0; bang < 2; bang++) { /* decide which "when" flags we want */ # ifndef NO_ABBR if (abbr) when = (bang ? WHEN_EX|WHEN_VIINP|WHEN_VIREP : WHEN_VIINP|WHEN_VIREP); else # endif when = (bang ? WHEN_VIREP|WHEN_VIINP : WHEN_VICMD); /* skip entries that don't match "when" */ if ((scan->flags & when) == 0) { continue; } /* write a "map" or "abbr" command name */ # ifndef NO_ABBR if (abbr) strcpy(tmpblk.c, "abbr"); else # endif strcpy(tmpblk.c, "map"); /* maybe write a bang. Definitely write a space */ if (bang) strcat(tmpblk.c, "! "); else strcat(tmpblk.c, " "); /* write the rawin version */ # ifndef NO_FKEY if (scan->label) strcat(tmpblk.c, scan->label); else # endif safequote(scan->rawin); strcat(tmpblk.c, " "); /* dump the mapped version */ # ifndef NO_EXTENSIONS if ((scan->flags & WHEN_INMV) && (when & (WHEN_VIINP|WHEN_VIREP))) { strcat(tmpblk.c, "visual "); } # endif safequote(scan->cooked); strcat(tmpblk.c, "\n"); twrite(fd, tmpblk.c, strlen(tmpblk.c)); } } } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tmp.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains functions which create & readback a TMPFILE */ #include "config.h" #include "vi.h" #if TOS # include <stat.h> #else # if OSK # include "osk.h" # else # if AMIGA # include "amistat.h" # else # include <sys/stat.h> # endif # endif #endif #if TURBOC # include <process.h> #endif #ifndef NO_MODELINES static void do_modelines(l, stop) long l; /* line number to start at */ long stop; /* line number to stop at */ { char *str; /* used to scan through the line */ char *start; /* points to the start of the line */ char buf[80]; /* if modelines are disabled, then do nothing */ if (!*o_modelines) { return; } /* for each line... */ for (; l <= stop; l++) { /* for each position in the line.. */ for (str = fetchline(l); *str; str++) { /* if it is the start of a modeline command... */ if ((str[0] == 'e' && str[1] == 'x' || str[0] == 'v' && str[1] == 'i') && str[2] == ':') { start = str += 3; /* find the end */ for (str = start + strlen(start); *--str != ':'; ) { } /* if it is a well-formed modeline, execute it */ if (str > start && str - start < sizeof buf) { strncpy(buf, start, (int)(str - start)); exstring(buf, str - start, '\\'); break; } } } } } #endif /* The FAIL() macro prints an error message and then exits. */ #define FAIL(why,arg) mode = MODE_EX; msg(why, arg); endwin(); exit(9) /* This is the name of the temp file */ static char tmpname[80]; /* This function creates the temp file and copies the original file into it. * Returns if successful, or stops execution if it fails. */ int tmpstart(filename) char *filename; /* name of the original file */ { int origfd; /* fd used for reading the original file */ struct stat statb; /* stat buffer, used to examine inode */ REG BLK *this; /* pointer to the current block buffer */ REG BLK *next; /* pointer to the next block buffer */ int inbuf; /* number of characters in a buffer */ int nread; /* number of bytes read */ REG int j, k; int i; long nbytes; /* switching to a different file certainly counts as a change */ changes++; redraw(MARK_UNSET, FALSE); /* open the original file for reading */ *origname = '\0'; if (filename && *filename) { strcpy(origname, filename); origfd = open(origname, O_RDONLY); if (origfd < 0 && errno != ENOENT) { msg("Can't open \"%s\"", origname); return tmpstart(""); } if (origfd >= 0) { if (stat(origname, &statb) < 0) { FAIL("Can't stat \"%s\"", origname); } #if TOS if (origfd >= 0 && (statb.st_mode & S_IJDIR)) #else # if OSK if (origfd >= 0 && (statb.st_mode & S_IFDIR)) # else if (origfd >= 0 && (statb.st_mode & S_IFMT) != S_IFREG) # endif #endif { msg("\"%s\" is not a regular file", origname); return tmpstart(""); } } else { stat(".", &statb); } if (origfd >= 0) { origtime = statb.st_mtime; #if OSK if (*o_readonly || !(statb.st_mode & ((getuid() >> 16) == 0 ? S_IOWRITE | S_IWRITE : ((statb.st_gid != (getuid() >> 16) ? S_IOWRITE : S_IWRITE))))) #endif #if AMIGA || MSDOS || (TOS && defined(__GNUC__)) if (*o_readonly || !(statb.st_mode & S_IWRITE)) #endif #if TOS && !defined(__GNUC__) if (*o_readonly || (statb.st_mode & S_IJRON)) #endif #if ANY_UNIX if (*o_readonly || !(statb.st_mode & ((geteuid() == 0) ? 0222 : ((statb.st_uid != geteuid() ? 0022 : 0200))))) #endif #if VMS if (*o_readonly) #endif { setflag(file, READONLY); } } else { origtime = 0L; } } else { setflag(file, NOFILE); origfd = -1; origtime = 0L; stat(".", &statb); } /* make a name for the tmp file */ tmpnum++; #if MSDOS || TOS /* MS-Dos doesn't allow multiple slashes, but supports drives * with current directories. * This relies on TMPNAME beginning with "%s\\"!!!! */ strcpy(tmpname, o_directory); if ((i = strlen(tmpname)) && !strchr(":/\\", tmpname[i-1])) tmpname[i++]=SLASH; sprintf(tmpname+i, TMPNAME+3, getpid(), tmpnum); #else sprintf(tmpname, TMPNAME, o_directory, getpid(), tmpnum); #endif /* make sure nobody else is editing the same file */ if (access(tmpname, 0) == 0) { FAIL("Temp file \"%s\" already exists?", tmpname); } /* create the temp file */ #if ANY_UNIX close(creat(tmpname, 0600)); /* only we can read it */ #else close(creat(tmpname, FILEPERMS)); /* anybody body can read it, alas */ #endif tmpfd = open(tmpname, O_RDWR | O_BINARY); if (tmpfd < 0) { FAIL("Can't create temp file... Does directory \"%s\" exist?", o_directory); return 1; } /* allocate space for the header in the file */ write(tmpfd, hdr.c, (unsigned)BLKSIZE); write(tmpfd, tmpblk.c, (unsigned)BLKSIZE); #ifndef NO_RECYCLE /* initialize the block allocator */ /* This must already be done here, before the first attempt * to write to the new file! GB */ garbage(); #endif /* initialize lnum[] */ for (i = 1; i < MAXBLKS; i++) { lnum[i] = INFINITY; } lnum[0] = 0; /* if there is no original file, then create a 1-line file */ if (origfd < 0) { hdr.n[0] = 0; /* invalid inode# denotes new file */ this = blkget(1); /* get the new text block */ strcpy(this->c, "\n"); /* put a line in it */ lnum[1] = 1L; /* block 1 ends with line 1 */ nlines = 1L; /* there is 1 line in the file */ nbytes = 1L; if (*origname) { msg("\"%s\" [NEW FILE] 1 line, 1 char", origname); } else { msg("\"[NO FILE]\" 1 line, 1 char"); } } else /* there is an original file -- read it in */ { nbytes = nlines = 0; /* preallocate 1 "next" buffer */ i = 1; next = blkget(i); inbuf = 0; /* loop, moving blocks from orig to tmp */ for (;;) { /* "next" buffer becomes "this" buffer */ this = next; /* read [more] text into this block */ nread = tread(origfd, &this->c[inbuf], BLKSIZE - 1 - inbuf); if (nread < 0) { close(origfd); close(tmpfd); tmpfd = -1; unlink(tmpname); FAIL("Error reading \"%s\"", origname); } /* convert NUL characters to something else */ for (j = k = inbuf; k < inbuf + nread; k++) { if (!this->c[k]) { setflag(file, HADNUL); this->c[j++] = 0x80; } #ifndef CRUNCH else if (*o_beautify && this->c[k] < ' ' && this->c[k] > 0) { if (this->c[k] == '\t' || this->c[k] == '\n' || this->c[k] == '\f') { this->c[j++] = this->c[k]; } else if (this->c[k] == '\b') { /* delete '\b', but complain */ setflag(file, HADBS); } /* else silently delete control char */ } #endif else { this->c[j++] = this->c[k]; } } inbuf = j; /* if the buffer is empty, quit */ if (inbuf == 0) { goto FoundEOF; } #if MSDOS || TOS /* BAH! MS text mode read fills inbuf, then compresses eliminating \r but leaving garbage at end of buf. The same is true for TURBOC. GB. */ memset(this->c + inbuf, '\0', BLKSIZE - inbuf); #endif /* search backward for last newline */ for (k = inbuf; --k >= 0 && this->c[k] != '\n';) { } if (k++ < 0) { if (inbuf >= BLKSIZE - 1) { k = 80; } else { k = inbuf; } } /* allocate next buffer */ next = blkget(++i); /* move fragmentary last line to next buffer */ inbuf -= k; for (j = 0; k < BLKSIZE; j++, k++) { next->c[j] = this->c[k]; this->c[k] = 0; } /* if necessary, add a newline to this buf */ for (k = BLKSIZE - inbuf; --k >= 0 && !this->c[k]; ) { } if (this->c[k] != '\n') { setflag(file, ADDEDNL); this->c[k + 1] = '\n'; } /* count the lines in this block */ for (k = 0; k < BLKSIZE && this->c[k]; k++) { if (this->c[k] == '\n') { nlines++; } nbytes++; } lnum[i - 1] = nlines; } FoundEOF: /* if this is a zero-length file, add 1 line */ if (nlines == 0) { this = blkget(1); /* get the new text block */ strcpy(this->c, "\n"); /* put a line in it */ lnum[1] = 1; /* block 1 ends with line 1 */ nlinesSB��UB��VB��WB��XB��YB��ZB��[B��\B��]B�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� = 1; /* there is 1 line in the file */ nbytes = 1; } #if MSDOS || TOS /* each line has an extra CR that we didn't count yet */ nbytes += nlines; #endif /* report the number of lines in the file */ msg("\"%s\" %s %ld line%s, %ld char%s", origname, (tstflag(file, READONLY) ? "[READONLY]" : ""), nlines, nlines == 1 ? "" : "s", nbytes, nbytes == 1 ? "" : "s"); } /* initialize the cursor to start of line 1 */ cursor = MARK_FIRST; /* close the original file */ close(origfd); /* any other messages? */ if (tstflag(file, HADNUL)) { msg("This file contained NULs. They've been changed to \\x80 chars"); } if (tstflag(file, ADDEDNL)) { msg("Newline characters have been inserted to break up long lines"); } #ifndef CRUNCH if (tstflag(file, HADBS)) { msg("Backspace characters deleted due to ':set beautify'"); } #endif storename(origname); #ifndef NO_MODELINES if (nlines > 10) { do_modelines(1L, 5L); do_modelines(nlines - 4L, nlines); } else { do_modelines(1L, nlines); } #endif /* force all blocks out onto the disk, to support file recovery */ blksync(); return 0; } /* This function copies the temp file back onto an original file. * Returns TRUE if successful, or FALSE if the file could NOT be saved. */ int tmpsave(filename, bang) char *filename; /* the name to save it to */ int bang; /* forced write? */ { int fd; /* fd of the file we're writing to */ REG int len; /* length of a text block */ REG BLK *this; /* a text block */ long bytes; /* byte counter */ REG int i; /* if no filename is given, assume the original file name */ if (!filename || !*filename) { filename = origname; } /* if still no file name, then fail */ if (!*filename) { msg("Don't know a name for this file -- NOT WRITTEN"); return FALSE; } /* can't rewrite a READONLY file */ #if AMIGA if (!strcmp(filename, origname) && tstflag(file, READONLY) && !bang) #else if (!strcmp(filename, origname) && *o_readonly && !bang) #endif { msg("\"%s\" [READONLY] -- NOT WRITTEN", filename); return FALSE; } /* open the file */ if (*filename == '>' && filename[1] == '>') { filename += 2; while (*filename == ' ' || *filename == '\t') { filename++; } #ifdef O_APPEND fd = open(filename, O_WRONLY|O_APPEND); #else fd = open(filename, O_WRONLY); lseek(fd, 0L, 2); #endif } else { /* either the file must not exist, or it must be the original * file, or we must have a bang, or "writeany" must be set. */ if (strcmp(filename, origname) && access(filename, 0) == 0 && !bang #ifndef CRUNCH && !*o_writeany #endif ) { msg("File already exists - Use :w! to overwrite"); return FALSE; } #if VMS /* Create a new VMS version of this file. */ { char *strrchr(), *ptr = strrchr(filename,';'); if (ptr) *ptr = '\0'; /* Snip off any ;number in the name */ } #endif fd = creat(filename, FILEPERMS); } if (fd < 0) { msg("Can't write to \"%s\" -- NOT WRITTEN", filename); return FALSE; } /* write each text block to the file */ bytes = 0L; for (i = 1; i < MAXBLKS && (this = blkget(i)) && this->c[0]; i++) { for (len = 0; len < BLKSIZE && this->c[len]; len++) { } if (twrite(fd, this->c, len) < len) { msg("Trouble writing to \"%s\"", filename); if (!strcmp(filename, origname)) { setflag(file, MODIFIED); } close(fd); return FALSE; } bytes += len; } /* reset the "modified" flag, but not the "undoable" flag */ clrflag(file, MODIFIED); significant = FALSE; /* report lines & characters */ #if MSDOS || TOS bytes += nlines; /* for the inserted carriage returns */ #endif msg("Wrote \"%s\" %ld lines, %ld characters", filename, nlines, bytes); /* close the file */ close(fd); return TRUE; } /* This function deletes the temporary file. If the file has been modified * and "bang" is FALSE, then it returns FALSE without doing anything; else * it returns TRUE. * * If the "autowrite" option is set, then instead of returning FALSE when * the file has been modified and "bang" is false, it will call tmpend(). */ int tmpabort(bang) int bang; { /* if there is no file, return successfully */ if (tmpfd < 0) { return TRUE; } /* see if we must return FALSE -- can't quit */ if (!bang && tstflag(file, MODIFIED)) { /* if "autowrite" is set, then act like tmpend() */ if (*o_autowrite) return tmpend(bang); else return FALSE; } /* delete the tmp file */ cutswitch(); strcpy(prevorig, origname); prevline = markline(cursor); *origname = '\0'; origtime = 0L; blkinit(); nlines = 0; initflags(); return TRUE; } /* This function saves the file if it has been modified, and then deletes * the temporary file. Returns TRUE if successful, or FALSE if the file * needs to be saved but can't be. When it returns FALSE, it will not have * deleted the tmp file, either. */ int tmpend(bang) int bang; { /* save the file if it has been modified */ if (tstflag(file, MODIFIED) && !tmpsave((char *)0, FALSE) && !bang) { return FALSE; } /* delete the tmp file */ tmpabort(TRUE); return TRUE; } /* If the tmp file has been changed, then this function will force those * changes to be written to the disk, so that the tmp file will survive a * system crash or power failure. */ #if AMIGA || MSDOS || TOS sync() { /* MS-DOS and TOS don't flush their buffers until the file is closed, * so here we close the tmp file and then immediately reopen it. */ close(tmpfd); tmpfd = open(tmpname, O_RDWR | O_BINARY); return 0; } #endif /* This function stores the file's name in the second block of the temp file. * SLEAZE ALERT! SLEAZE ALERT! The "tmpblk" buffer is probably being used * to store the arguments to a command, so we can't use it here. Instead, * we'll borrow the buffer that is used for "shift-U". */ storename(name) char *name; /* the name of the file - normally origname */ { #ifndef CRUNCH int len; char *ptr; #endif /* we're going to clobber the U_text buffer, so reset U_line */ U_line = 0L; if (!name) { strncpy(U_text, "", BLKSIZE); U_text[1] = 127; } #ifndef CRUNCH else if (*name != SLASH) { /* get the directory name */ ptr = getcwd(U_text, BLKSIZE); if (ptr != U_text) { strcpy(U_text, ptr); } /* append a slash to the directory name */ len = strlen(U_text); U_text[len++] = SLASH; /* append the filename, padded with heaps o' NULs */ strncpy(U_text + len, *name ? name : "foo", BLKSIZE - len); } #endif else { /* copy the filename into U_text */ strncpy(U_text, *name ? name : "foo", BLKSIZE); } if (tmpfd >= 0) { /* write the name out to second block of the temp file */ lseek(tmpfd, (long)BLKSIZE, 0); write(tmpfd, U_text, (unsigned)BLKSIZE); } return 0; } /* This function handles deadly signals. It restores sanity to the terminal * preserves the current temp file, and deletes any old temp files. */ int deathtrap(sig) int sig; /* the deadly signal that we caught */ { char *why; /* restore the terminal's sanity */ endwin(); #ifdef CRUNCH why = "-Elvis died"; #else /* give a more specific description of how Elvis died */ switch (sig) { # ifdef SIGHUP case SIGHUP: why = "-the modem lost its carrier"; break; # endif # ifndef DEBUG # ifdef SIGILL case SIGILL: why = "-Elvis hit an illegal instruction"; break; # endif # ifdef SIGBUS case SIGBUS: why = "-Elvis had a bus error"; break; # endif # if defined(SIGSEGV) && !defined(TOS) case SIGSEGV: why = "-Elvis had a segmentation violation"; break; # endif # ifdef SIGSYS case SIGSYS: why = "-Elvis munged a system call"; break; # endif # endif /* !DEBUG */ # ifdef SIGPIPE case SIGPIPE: why = "-the pipe reader died"; break; # endif # ifdef SIGTERM case SIGTERM: why = "-Elvis was terminated"; break; # endif # if !MINIX # ifdef SIGUSR1 case SIGUSR1: why = "-Elvis was killed via SIGUSR1"; break; # endif # ifdef SIGUSR2 case SIGUSR2: why = "-Elvis was killed via SIGUSR2"; break; # endif # endif default: why = "-Elvis died"; break; } #endif /* if we had a temp file going, then preserve it */ if (tmpnum > 0 && tmpfd >= 0) { close(tmpfd); sprintf(tmpblk.c, "%s \"%s\" %s", PRESERVE, why, tmpname); system(tmpblk.c); } /* delete any old temp files */ cutend(); /* exit with the proper exit status */ exit(sig); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* unix.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the unix-specific versions the ttyread() functions. * There are actually three versions of ttyread() defined here, because * BSD, SysV, and V7 all need quite different implementations. */ #include "config.h" #if ANY_UNIX # include "vi.h" # if BSD /* For BSD, we use select() to wait for characters to become available, * and then do a read() to actually get the characters. We also try to * handle SIGWINCH -- if the signal arrives during the select() call, then * we adjust the o_columns and o_lines variables, and fake a control-L. */ # include <sys/types.h> # include <sys/time.h> int ttyread(buf, len, time) char *buf; /* where to store the gotten characters */ int len; /* maximum number of characters to read */ int time; /* maximum time to allow for reading */ { fd_set rd; /* the file descriptors that we want to read from */ static tty; /* 'y' if reading from tty, or 'n' if not a tty */ int i; struct timeval t; struct timeval *tp; /* do we know whether this is a tty or not? */ if (!tty) { tty = (isatty(0) ? 'y' : 'n'); } /* compute the timeout value */ if (time) { t.tv_sec = time / 10; t.tv_usec = (time % 10) * 100000L; tp = &t; } else { tp = (struct timeval *)0; } /* loop until we get characters or a definite EOF */ for (;;) { if (tty == 'y') { /* wait until timeout or characters are available */ FD_ZERO(&rd); FD_SET(0, &rd); i = select(1, &rd, (fd_set *)0, (fd_set *)0, tp); } else { /* if reading from a file or pipe, never timeout! * (This also affects the way that EOF is detected) */ i = 1; } /* react accordingly... */ switch (i) { case -1: /* assume we got an EINTR because of SIGWINCH */ if (*o_lines != LINES || *o_columns != COLS) { *o_lines = LINES; *o_columns = COLS; #ifndef CRUNCH if (!wset) { *o_window = LINES - 1; } #endif if (mode != MODE_EX) { /* pretend the user hit ^L */ *buf = ctrl('L'); return 1; } } break; case 0: /* timeout */ return 0; default: /* characters available */ return read(0, buf, len); } } } # else # if M_SYSV /* For System-V or Coherent, we use VMIN/VTIME to implement the timeout. * For no timeout, VMIN should be 1 and VTIME should be 0; for timeout, * VMIN should be 0 and VTIME should be the timeout value. */ # include <termio.h> int ttyread(buf, len, time) char *buf; /* where to store the gotten characters */ int len; /* maximum number of characters to read */ int time; /* maximum time to allow for reading */ { struct termio tio; int bytes; /* number of bytes actually read */ /* arrange for timeout */ ioctl(0, TCGETA, &tio); if (time) { tio.c_cc[VMIN] = 0; tio.c_cc[VTIME] = time; } else { tio.c_cc[VMIN] = 1; tio.c_cc[VTIME] = 0; } ioctl(0, TCSETA, &tio); /* Perform the read. Loop if EINTR error happens */ while ((bytes = read(0, buf, len)) < 0) { /* probably EINTR error because a SIGWINCH was received */ if (*o_lines != LINES || *o_columns != COLS) { *o_lines = LINES; *o_columns = COLS; #ifndef CRUNCH if (!wset) { *o_window = LINES - 1; } #endif if (mode != MODE_EX) { /* pretend the user hit ^L */ *buf = ctrl('L'); return 1; } } } /* return the number of bytes read */ return bytes; /* NOTE: The terminal may be left in a timeout-mode after this function * returns. This shouldn't be a problem since Elvis *NEVER* tries to * read from the keyboard except through this function. */ } # else /* any other version of UNIX, assume it is V7 compatible */ /* For V7 UNIX (including Minix) we set an alarm() before doing a blocking * read(), and assume that the SIGALRM signal will cause the read() function * to give up. */ #include <setjmp.h> static jmp_buf env; /*ARGSUSED*/ int dummy(signo) int signo; { longjmp(env, 1); } int ttyread(buf, len, time) char *buf; /* where to store the gotten characters */ int len; /* maximum number of characters to read */ int time; /* maximum time to allow for reading */ { /* arrange for timeout */ #if __GNUC__ || _ANSI signal(SIGALRM, (void (*)()) dummy); #else signal(SIGALRM, dummy); #endif alarm(time); /* perform the blocking read */ if (setjmp(env) == 0) { len = read(0, buf, len); } else /* I guess we timed out */ { len = 0; } /* cancel the alarm */ #if _ANSI signal(SIGALRM, (void (*)())dummy); /* work around a bug in Minix */ #else signal(SIGALRM, dummy); /* work around a bug in Minix */ #endif alarm(0); /* return the number of bytes read */ if (len < 0) len = 0; return len; } # endif /* !(M_SYSV || COHERENT) */ # endif /* !BSD */ #endif /* ANY_UNIX */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vars.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains variables which weren't happy anyplace else */ #include "config.h" #include "vi.h" /*------------------------------------------------------------------------*/ /* used to remember whether the file has been modified */ struct _viflags viflags; /* used to access the tmp file */ long lnum[MAXBLKS]; long nlines; int tmpfd = -1; int tmpnum; #ifndef CRUNCH int wset = FALSE; #endif /* used to keep track of the current file & alternate file */ long origtime; char origname[256]; char prevorig[256]; long prevline = 1; /* used to track various places in the text */ MARK mark[NMARKS]; /* marks 'a through 'z, plus mark '' */ MARK cursor; /* the cursor position within the file */ /* which mode of the editor we're in */ int mode; /* vi mode? ex mode? quitting? */ /* used to manage the args list */ char args[BLKSIZE]; /* list of filenames to edit */ int argno; /* index of current file in args list */ int nargs; /* number of filenames in args[] */ /* dummy var, never explicitly referenced */ int bavar; /* used only in BeforeAfter macros */ /* used to detect changes that invalidate cached text/blocks */ long changes; /* incremented when file is changed */ int significant; /* boolean: was a *REAL* change made? */ /* used to support the pfetch() macro */ int plen; /* length of the line */ long pline; /* line number that len refers to */ long pchgs; /* "changes" level that len refers to */ char *ptext; /* text of previous line, if valid */ /* misc temporary storage - mostly for strings */ BLK tmpblk; /* a block used to accumulate changes */ /* screen oriented stuff */ long topline; /* file line number of top line */ int leftcol; /* column number of left col */ int physcol; /* physical column number that cursor is on */ int physrow; /* physical row number that cursor is on */ /* used to help minimize that "[Hit a key to continue]" message */ int exwrote; /* Boolean: was the last ex command wordy? */ /* This variable affects the behaviour of certain functions -- most importantly * the input function. */ int doingdot; /* boolean: are we doing the "." command? */ /* This variable affects the behaviour of the ":s" command, and it is also * used to detect & prohibit nesting of ":g" commands */ int doingglobal; /* boolean: are doing a ":g" command? */ /* This variable is zeroed before a command executes, and later ORed with the * command's flags after the command has been executed. It is used to force * certain flags to be TRUE for *some* invocations of a particular command. * For example, "/regexp/+offset" forces the LNMD flag, and sometimes a "p" * or "P" command will force FRNT. */ int force_flags; /* These are used for reporting multi-line changes to the user */ long rptlines; /* number of lines affected by a command */ char *rptlabel; /* description of how lines were affected */ /* These store info that pertains to the shift-U command */ long U_line; /* line# of the undoable line, or 0l for none */ char U_text[BLKSIZE]; /* contents of the undoable line */ #ifndef NO_VISIBLE /* These are used to implement the 'v' and 'V' commands */ MARK V_from; /* starting point for v or V */ int V_linemd; /* boolean: doing line-mode version? (V, not v) */ #endif /* Bigger stack req'ed for TOS and TURBOC */ #if TOS long _stksize = 16384; #endif #if TURBOC #include <dos.h> extern unsigned _stklen = 16384U; #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vcmd.c */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ /* This file contains the functions that handle VI commands */ #include "config.h" #include "ctype.h" #include "vi.h" #if MSDOS # include <process.h> # include <string.h> #endif #if TOS # include <osbind.h> # include <string.h> #endif #if OSK # include <stdio.h> #endif /* This function puts the editor in EX mode */ MARK v_quit() { move(LINES - 1, 0); mode = MODE_EX; return cursor; } /* This function causes the screen to be redrawn */ MARK v_redraw() { redraw(MARK_UNSET, FALSE); return cursor; } /* This function executes a string of EX commands, and waits for a user keystroke * before returning to the VI screen. If that keystroke is another ':', then * another EX command is read and executed. */ /*ARGSUSED*/ MARK v_1ex(m, text) MARK m; /* the current line */ char *text; /* the first command to execute */ { /* run the command. be careful about modes & output */ exwrote = (mode == MODE_COLON); doexcmd(text); exrefresh(); /* if mode is no longer MODE_VI, then we should quit right away! */ if (mode != MODE_VI && mode != MODE_COLON) return cursor; /* The command did some output. Wait for a keystoke. */ if (exwrote) { mode = MODE_VI; msg("[Hit <RETURN> to continue]"); if (getkey(0) == ':') { mode = MODE_COLON; addch('\n'); } else redraw(MARK_UNSET, FALSE); } return cursor; } /* This function undoes the last change */ /*ARGSUSED*/ MARK v_undo(m) MARK m; /* (ignored) */ { if (undo()) { redraw(MARK_UNSET, FALSE); } return cursor; } /* This function deletes the character(s) that the cursor is on */ MARK v_xchar(m, cnt, cmd) MARK m; /* where to start deletions */ long cnt; /* number of chars to delete */ int cmd; /* either 'x' or 'X' */ { DEFAULT(1); /* for 'X', adjust so chars are deleted *BEFORE* cursor */ if (cmd == 'X') { if (markidx(m) < cnt) return MARK_UNSET; m -= cnt; } /* make sure we don't try to delete more thars than there are */ pfetch(markline(m)); if (markidx(m + cnt) > plen) { cnt = plen - markidx(m); } if (cnt == 0L) { return MARK_UNSET; } /* do it */ ChangeText { cut(m, m + cnt); delete(m, m + cnt); } return m; } /* This function defines a mark */ /*ARGSUSED*/ MARK v_mark(m, count, key) MARK m; /* where the mark will be */ long count; /* (ignored) */ int key; /* the ASCII label of the mark */ { if (key < 'a' || key > 'z') { msg("Marks must be from a to z"); } else { mark[key - 'a'] = m; } return m; } /* This function toggles upper & lower case letters */ MARK v_ulcase(m, cnt) MARK m; /* where to make the change */ long cnt; /* number of chars to flip */ { REG char *pos; REG int j; DEFAULT(1); /* fetch the current version of the line */ pfetch(markline(m)); /* for each position in the line */ for (j = 0, pos = &ptext[markidx(m)]; j < cnt && *pos; j++, pos++) { if (isupper(*pos)) { tmpblk.c[j] = tolower(*pos); } else { tmpblk.c[j] = toupper(*pos); } } /* if the new text is different from the old, then change it */ if (strncmp(tmpblk.c, &ptext[markidx(m)], j)) { ChangeText { tmpblk.c[j] = '\0'; change(m, m + j, tmpblk.c); } } return m + j; } MARK v_replace(m, cnt, key) MARK m; /* first char to be replaced */ long cnt; /* number of chars to replace */ int key; /* what to replace them with */ { REG char *text; REG int i; DEFAULT(1); /* map ^M to '\n' */ if (key == '\r') { key = '\n'; } /* make sure the resulting line isn't too long */ if (cnt > BLKSIZE - 2 - markidx(m)) { cnt = BLKSIZE - 2 - markidx(m); } /* build a string of the desired character with the desired length */ for (text = tmpblk.c, i = cnt; i > 0; i--) { *text++ = key; } *text = '\0'; /* make sure cnt doesn't extend past EOL */ pfetch(markline(m)); key = markidx(m); if (key + cnt > plen) { cnt = plen - key; } /* do the replacement */ ChangeText { change(m, m + cnt, tmpblk.c); } if (*tmpblk.c == '\n') { return (m & ~(BLKSIZE - 1)) + cnt * BLKSIZE; } else { return m + cnt - 1; } } MARK v_overtype(m) MARK m; /* where to start overtyping */ { MARK end; /* end of a substitution */ static long width; /* width of a single-line replace */ /* the "doingdot" version of replace is really a substitution */ if (doingdot) { /* was the last one really repeatable? */ if (width < 0) { msg("Can't repeat a multi-line overtype command"); return MARK_UNSET; } /* replacing nothing by nothing? Don't bother */ if (width == 0) { return m; } /* replace some chars by repeated text */ return v_subst(m, width); } /* Normally, we input starting here, in replace mode */ ChangeText { end = input(m, m, WHEN_VIREP, FALSE); } /* if we ended on the same line we started on, then this * overtype is repeatable via the dot key. */ if (markline(end) == markline(m) && end >= m - 1L) { width = end - m + 1L; } else /* it isn't repeatable */ { width = -1L; } return end; } /* This function selects which cut buffer to use */ /*ARGSUSED*/ MARK v_selcut(m, cnt, key) MARK m; long cnt; int key; { cutname(key); return m; } /* This function pastes text from a cut buffer */ /*ARGSUSED*/ MARK v_paste(m, cnt, cmd) MARK m; /* where to paste the text */ long cnt; /* (ignored) */ int cmd; /* either 'p' or 'P' */ { MARK dest; ChangeText { /* paste the text, and find out where it ends */ dest = paste(m, cmd == 'p', TRUE); /* was that a line-mode paste? */ if (dest && markline(dest) != markline(m)) { /* line-mode pastes leave the cursor at the front * of the first pasted line. */ dest = m; if (cmd == 'p') { dest += BLKSIZE; } force_flags |= FRNT; } } return dest; } /* This function yanks text into a cut buffer */ MARK v_yank(m, n) MARK m, n; /* range of text to yank */ { cut(m, n); return m; } /* This function deletes a range of text */ MARK v_delete(m, n) MARK m, n; /* range of text to delete */ { /* illegal to try and delete nothing */ if (n <= m) { return MARK_UNSET; } /* Do it */ ChangeText { cut(m, n); delete(m, n); } return m; } /* This starts input mode without deleting anything */ MARK v_insert(m, cnt, key) MARK m; /* where to start (sort of) */ long cnt; /* repeat how many times? */ int key; /* what command is this for? {a,A,i,I,o,O} */ { int wasdot; long reps; int above; /* boolean: new line going above old line? */ DEFAULT(1); ChangeText { /* tweak the insertion point, based on command key */ above = FALSE; switch (key) { case 'i': break; case 'a': pfetch(markline(m)); if (plen > 0) { m++; } break; case 'I': m = m_front(m, 1L); break; case 'A': pfetch(markline(m)); m = (m & ~(BLKSIZE - 1)) + plen; break; case 'O': m &= ~(BLKSIZE - 1); add(m, "\n"); above = TRUE; break; case 'o': m = (m & ~(BLKSIZE - 1)) + BLKSIZE; add(m, "\n"); break; } /* insert the same text once or more */ for (reps = cnt, wasdot = doingdot; reps > 0; reps--, doingdot = TRUE) { m = input(m, m, WHEN_VIINP, above) + 1; } if (markidx(m) > 0) { m--; } doingdot = wasdot; } #ifndef CRUNCH # ifndef NO_EXTENSIONS if (key == 'i' && *o_inputmode && mode == MODE_VI) { msg("Now in command mode! To return to input mode, hit <i>"); } # endif #endif return m; } /* This starts input mode with some text deleted */ MARK v_change(m, n) MARK m, n; /* the range of text to change */ { int lnmode; /* is this a line-mode change? */ /* swap them if they're in reverse order */ if (m > n) { MARK tmp; tmp = m; m = n; n = tmp; } /* for line mode, retain the last newline char */ lnmode = (markidx(m) == 0 && markidx(n) == 0 && m != n); if (lnmode) { n -= BLKSIZE; pfetch(markline(n)); n = (n & ~(BLKSIZE - 1)) + plen; } ChangeText { cut(m, n); m = input(m, n, WHEN_VIINP, FALSE); } return m; } /* This function replaces a given number of characters with input */ MARK v_subst(m, cnt) MARK m; /* where substitutionsnB��pB��qB��rB��sB��tB��uB��vB��wB��xB�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� start */ long cnt; /* number of chars to replace */ { DEFAULT(1); /* make sure we don't try replacing past EOL */ pfetch(markline(m)); if (markidx(m) + cnt > plen) { cnt = plen - markidx(m); } /* Go for it! */ ChangeText { cut(m, m + cnt); m = input(m, m + cnt, WHEN_VIINP, FALSE); } return m; } /* This calls the ex "join" command to join some lines together */ MARK v_join(m, cnt) MARK m; /* the first line to be joined */ long cnt; /* number of other lines to join */ { MARK joint; /* where the lines were joined */ DEFAULT(1); /* figure out where the joint will be */ pfetch(markline(m)); joint = (m & ~(BLKSIZE - 1)) + plen; /* join the lines */ cmd_join(m, m + MARK_AT_LINE(cnt), CMD_JOIN, 0, ""); /* the cursor should be left at the joint */ return joint; } /* This calls the ex "<" command to shift some lines left */ MARK v_lshift(m, n) MARK m, n; /* range of lines to shift */ { /* adjust for inclusive endmarks in ex */ n -= BLKSIZE; cmd_shift(m, n, CMD_SHIFTL, FALSE, (char *)0); return m; } /* This calls the ex ">" command to shift some lines right */ MARK v_rshift(m, n) MARK m, n; /* range of lines to shift */ { /* adjust for inclusive endmarks in ex */ n -= BLKSIZE; cmd_shift(m, n, CMD_SHIFTR, FALSE, (char *)0); return m; } /* This filters some lines through a preset program, to reformat them */ MARK v_reformat(m, n) MARK m, n; /* range of lines to shift */ { /* adjust for inclusive endmarks in ex */ n -= BLKSIZE; /* run the filter command */ filter(m, n, o_equalprg, TRUE); redraw(MARK_UNSET, FALSE); return m; } /* This runs some lines through a filter program */ MARK v_filter(m, n) MARK m, n; /* range of lines to shift */ { char cmdln[150]; /* a shell command line */ /* adjust for inclusive endmarks in ex */ n -= BLKSIZE; if (vgets('!', cmdln, sizeof(cmdln)) > 0) { filter(m, n, cmdln, TRUE); } redraw(MARK_UNSET, FALSE); return m; } /* This function runs the ex "file" command to show the file's status */ MARK v_status() { cmd_file(cursor, cursor, CMD_FILE, 0, ""); return cursor; } /* This function runs the ":&" command to repeat the previous :s// */ MARK v_again(m, n) MARK m, n; { cmd_substitute(m, n - BLKSIZE, CMD_SUBAGAIN, TRUE, ""); return cursor; } /* This function switches to the previous file, if possible */ MARK v_switch() { if (!*prevorig) msg("No previous file"); else { strcpy(tmpblk.c, prevorig); cmd_edit(cursor, cursor, CMD_EDIT, 0, tmpblk.c); } return cursor; } /* This function does a tag search on a keyword */ /*ARGSUSED*/ MARK v_tag(keyword, m, cnt) char *keyword; MARK m; long cnt; { /* move the cursor to the start of the tag name, where m is */ cursor = m; /* perform the tag search */ cmd_tag(cursor, cursor, CMD_TAG, 0, keyword); return cursor; } #ifndef NO_EXTENSIONS /* This function looks up a keyword by calling the helpprog program */ /*ARGSUSED*/ MARK v_keyword(keyword, m, cnt) char *keyword; MARK m; long cnt; { int waswarn; char cmdline[130]; move(LINES - 1, 0); addstr("---------------------------------------------------------\n"); clrtoeol(); refresh(); sprintf(cmdline, "%s %s", o_keywordprg, keyword); waswarn = *o_warn; *o_warn = FALSE; suspend_curses(); if (system(cmdline)) { addstr("<<< failed >>>\n"); } resume_curses(FALSE); mode = MODE_VI; redraw(MARK_UNSET, FALSE); *o_warn = waswarn; return m; } MARK v_increment(keyword, m, cnt) char *keyword; MARK m; long cnt; { static sign; char newval[12]; long atol(); DEFAULT(1); /* get one more keystroke, unless doingdot */ if (!doingdot) { sign = getkey(0); } /* adjust the number, based on that second keystroke */ switch (sign) { case '+': case '#': cnt = atol(keyword) + cnt; break; case '-': cnt = atol(keyword) - cnt; break; case '=': break; default: return MARK_UNSET; } sprintf(newval, "%ld", cnt); ChangeText { change(m, m + strlen(keyword), newval); } return m; } #endif /* This function acts like the EX command "xit" */ /*ARGSUSED*/ MARK v_xit(m, cnt, key) MARK m; /* ignored */ long cnt; /* ignored */ int key; /* must be a second 'Z' */ { /* if second char wasn't 'Z', fail */ if (key != 'Z') { return MARK_UNSET; } /* move the cursor to the bottom of the screen */ move(LINES - 1, 0); clrtoeol(); /* do the xit command */ cmd_xit(m, m, CMD_XIT, FALSE, ""); /* return the cursor */ return m; } /* This function undoes changes to a single line, if possible */ MARK v_undoline(m) MARK m; /* where we hope to undo the change */ { /* make sure we have the right line in the buffer */ if (markline(m) != U_line) { return MARK_UNSET; } /* fix it */ ChangeText { strcat(U_text, "\n"); change(MARK_AT_LINE(U_line), MARK_AT_LINE(U_line + 1), U_text); } /* nothing in the buffer anymore */ U_line = -1L; /* return, with the cursor at the front of the line */ return m & ~(BLKSIZE - 1); } #ifndef NO_ERRLIST MARK v_errlist(m) MARK m; { cmd_errlist(m, m, CMD_ERRLIST, FALSE, ""); return cursor; } #endif #ifndef NO_AT /*ARGSUSED*/ MARK v_at(m, cnt, key) MARK m; long cnt; int key; { int size; size = cb2str(key, tmpblk.c, BLKSIZE); if (size <= 0 || size == BLKSIZE) { return MARK_UNSET; } execmap(0, tmpblk.c, FALSE); return cursor; } #endif #ifdef SIGTSTP MARK v_suspend() { cmd_suspend(MARK_UNSET, MARK_UNSET, CMD_SUSPEND, FALSE, ""); return MARK_UNSET; } #endif #ifndef NO_VISIBLE /*ARGSUSED*/ MARK v_start(m, cnt, cmd) MARK m; /* starting point for a v or V command */ long cnt; /* ignored */ int cmd; /* either 'v' or 'V' */ { if (V_from) { V_from = MARK_UNSET; } else { V_from = m; V_linemd = isupper(cmd); } return m; } #endif #ifndef NO_POPUP # define MENU_HEIGHT 11 # define MENU_WIDTH 23 MARK v_popup(m, n) MARK m, n; /* the range of text to change */ { int i; int y, x; /* position where the window will pop up at */ int key; /* keystroke from the user */ int sel; /* index of the selected operation */ static int dfltsel;/* default value of sel */ static char *labels[11] = { "ESC cancel! ", " d delete (cut) ", " y yank (copy) ", " p paste after ", " P paste before ", " > more indented ", " < less indented ", " = reformat ", " ! external filter ", " ZZ save & exit ", " u undo previous " }; /* try to position the menu near the cursor */ x = physcol - (MENU_WIDTH / 2); if (x < 0) x = 0; else if (x + MENU_WIDTH + 2 > COLS) x = COLS - MENU_WIDTH - 2; if (markline(cursor) < topline || markline(cursor) > botline) y = 0; else if (markline(cursor) + 1L + MENU_HEIGHT > botline) y = (int)(markline(cursor) - topline) - MENU_HEIGHT; else y = (int)(markline(cursor) - topline) + 1L; /* draw the menu */ for (sel = 0; sel < MENU_HEIGHT; sel++) { move(y + sel, x); do_POPUP(); if (sel == dfltsel) qaddstr("-->"); else qaddstr(" "); qaddstr(labels[sel]); do_SE(); } /* get a selection */ move(y + dfltsel, x + 4); for (sel = dfltsel; (key = getkey(WHEN_POPUP)) != '\\' && key != '\r'; ) { /* erase the selection arrow */ move(y + sel, x); do_POPUP(); qaddstr(" "); qaddstr(labels[sel]); do_SE(); /* process the user's keystroke */ if (key == 'j' && sel < MENU_HEIGHT - 1) { sel++; } else if (key == 'k' && sel > 0) { sel--; } else if (key == '\033') { sel = 0; break; } else { for (i = 1; i < MENU_HEIGHT && labels[i][1] != key; i++) { } if (i < MENU_HEIGHT) { sel = i; break; } } /* redraw the arrow, possibly in a new place */ move(y + sel, x); do_POPUP(); qaddstr("-->"); qaddstr(labels[sel]); do_SE(); move(y + sel, x + 4); } /* in most cases, the default selection is "paste after" */ dfltsel = 3; /* perform the appropriate action */ switch (sel) { case 0: m = cursor; dfltsel = 0; break; case 1: /* delete (cut) */ m = v_delete(m, n); break; case 2: /* yank (copy) */ m = v_yank(m, n); break; case 3: /* paste after */ m = v_paste(n, 1L, 'P'); break; case 4: /* paste before */ m = v_paste(m, 1L, 'P'); dfltsel = 4; break; case 5: /* more indented */ m = v_rshift(m, n); dfltsel = 5; break; case 6: /* less indented */ m = v_lshift(m, n); dfltsel = 6; break; case 7: /* reformat */ m = v_reformat(m, n); dfltsel = 7; break; case 8: /* external filter */ m = v_filter(m, n); dfltsel = 0; break; case 9: /* save & exit */ /* get confirmation first */ do { key = getkey(0); } while (key != '\\' && key != 'Z' && key != '\r' /* good */ && key != '\033'); /* bad */ if (key != '\033') { m = v_xit(m, 0L, 'Z'); } break; case 10: /* undo previous */ m = v_undo(m); dfltsel = 9; break; } /* arrange for the menu to be erased (except that "chg from kbd" * already erased it, and "save & exit" doesn't care) */ if (sel != 5 && sel != 9) redraw(MARK_UNSET, FALSE); return m; } #endif /* undef NO_POPUP */ ��������������������������������������������������������������������������������������������������������/* vi.c */ /* Author: * Steve Kirkendall * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ #include "config.h" #include "ctype.h" #include "vi.h" /* This array describes what each key does */ #define NO_FUNC (MARK (*)())0 #define NO_ARGS 0 #define CURSOR 1 #define CURSOR_CNT_KEY 2 #define CURSOR_MOVED 3 #define CURSOR_EOL 4 #define ZERO 5 #define DIGIT 6 #define CURSOR_TEXT 7 #define KEYWORD 8 #define ARGSMASK 0x0f #define C_C_K_REP1 (CURSOR_CNT_KEY | 0x10) #define C_C_K_CUT (CURSOR_CNT_KEY | 0x20) #define C_C_K_MARK (CURSOR_CNT_KEY | 0x30) #define C_C_K_CHAR (CURSOR_CNT_KEY | 0x40) #ifndef NO_SHOWMODE static int keymodes[] = {0, WHEN_REP1, WHEN_CUT, WHEN_MARK, WHEN_CHAR}; # define KEYMODE(args) (keymodes[(args) >> 4]) #else # define KEYMODE(args) 0 #endif static struct keystru { MARK (*func)(); /* the function to run */ uchar args; /* description of the args needed */ #ifndef NO_VISIBLE short flags; #else uchar flags; /* other stuff */ #endif } vikeys[] = { /* NUL not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #ifndef NO_EXTENSIONS /* ^A find cursor word */ {m_wsrch, KEYWORD, MVMT|NREL|VIZ}, #else /* ^A not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* ^B page backward */ {m_scroll, CURSOR, FRNT|VIZ}, /* ^C not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^D scroll dn 1/2page*/ {m_scroll, CURSOR, NCOL|VIZ}, /* ^E scroll up */ {m_scroll, CURSOR, NCOL|VIZ}, /* ^F page forward */ {m_scroll, CURSOR, FRNT|VIZ}, /* ^G show file status */ {v_status, NO_ARGS, NO_FLAGS}, /* ^H move left, like h*/ {m_left, CURSOR, MVMT|VIZ}, /* ^I not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^J move down */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL}, /* ^K not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^L redraw screen */ {v_redraw, NO_ARGS, NO_FLAGS|VIZ}, /* ^M mv front next ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL}, /* ^N move down */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL|NCOL}, /* ^O not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^P move up */ {m_updnto, CURSOR, MVMT|LNMD|VIZ|INCL|NCOL}, /* ^Q not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^R redraw screen */ {v_redraw, NO_ARGS, NO_FLAGS|VIZ}, /* ^S not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^T not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^U scroll up 1/2page*/ {m_scroll, CURSOR, NCOL|VIZ}, /* ^V not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^W not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^X move to phys col */ {m_tocol, CURSOR, MVMT|NREL|VIZ}, /* ^Y scroll down */ {m_scroll, CURSOR, NCOL|VIZ}, #ifdef SIGTSTP /* ^Z suspend elvis */ {v_suspend, NO_ARGS, NO_FLAGS}, #else /* ^Z not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* ESC not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^\ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ^] keyword is tag */ {v_tag, KEYWORD, NO_FLAGS}, /* ^^ previous file */ {v_switch, CURSOR, NO_FLAGS}, /* ^_ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* SPC move right,like l*/ {m_right, CURSOR, MVMT|INCL|VIZ}, /* ! run thru filter */ {v_filter, CURSOR_MOVED, FRNT|LNMD|INCL|VIZ}, /* " select cut buffer*/ {v_selcut, C_C_K_CUT, PTMV|VIZ}, #ifndef NO_EXTENSIONS /* # increment number */ {v_increment, KEYWORD, SDOT}, #else /* # not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* $ move to rear */ {m_rear, CURSOR, MVMT|INCL|VIZ}, /* % move to match */ {m_match, CURSOR, MVMT|INCL|VIZ}, /* & repeat subst */ {v_again, CURSOR_MOVED, SDOT|NCOL|LNMD|INCL}, /* ' move to a mark */ {m_tomark, C_C_K_MARK, MVMT|FRNT|NREL|LNMD|INCL|VIZ}, #ifndef NO_SENTENCE /* ( mv back sentence */ {m_sentence, CURSOR, MVMT|VIZ}, /* ) mv fwd sentence */ {m_sentence, CURSOR, MVMT|VIZ}, #else /* ( not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* ) not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif #ifndef NO_ERRLIST /* * errlist */ {v_errlist, CURSOR, FRNT|NREL}, #else /* * not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* + mv front next ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL}, #ifndef NO_CHARSEARCH /* , reverse [fFtT] cmd*/ {m__ch, CURSOR, MVMT|INCL|VIZ}, #else /* , not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* - mv front prev ln */ {m_updnto, CURSOR, MVMT|FRNT|LNMD|VIZ|INCL}, /* . special... */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* / forward search */ {m_fsrch, CURSOR_TEXT, MVMT|NREL|VIZ}, /* 0 part of count? */ {NO_FUNC, ZERO, MVMT|PTMV|VIZ}, /* 1 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 2 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 3 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 4 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 5 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 6 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 7 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 8 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* 9 part of count */ {NO_FUNC, DIGIT, PTMV|VIZ}, /* : run single EX cmd*/ {v_1ex, CURSOR_TEXT, NO_FLAGS}, #ifndef NO_CHARSEARCH /* ; repeat [fFtT] cmd*/ {m__ch, CURSOR, MVMT|INCL|VIZ}, #else /* ; not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS|VIZ}, #endif /* < shift text left */ {v_lshift, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ}, /* = preset filter */ {v_reformat, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ}, /* > shift text right */ {v_rshift, CURSOR_MOVED, SDOT|FRNT|LNMD|INCL|VIZ}, /* ? backward search */ {m_bsrch, CURSOR_TEXT, MVMT|NREL|VIZ}, #ifndef NO_AT /* @ execute a cutbuf */ {v_at, C_C_K_CUT, NO_FLAGS}, #else /* @ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* A append at EOL */ {v_insert, CURSOR, SDOT}, /* B move back Word */ {m_bword, CURSOR, MVMT|VIZ}, /* C change to EOL */ {v_change, CURSOR_EOL, SDOT}, /* D delete to EOL */ {v_delete, CURSOR_EOL, SDOT}, /* E move end of Word */ {m_eword, CURSOR, MVMT|INCL|VIZ}, #ifndef NO_CHARSEARCH /* F move bk to char */ {m_Fch, C_C_K_CHAR, MVMT|INCL|VIZ}, #else /* F not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* G move to line # */ {m_updnto, CURSOR, MVMT|NREL|LNMD|FRNT|INCL|VIZ}, /* H move to row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL}, /* I insert at front */ {v_insert, CURSOR, SDOT}, /* J join lines */ {v_join, CURSOR, SDOT}, #ifndef NO_EXTENSIONS /* K look up keyword */ {v_keyword, KEYWORD, NO_FLAGS}, #else /* K not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* L move to last row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL}, /* M move to mid row */ {m_row, CURSOR, MVMT|LNMD|FRNT|VIZ|INCL}, /* N reverse prev srch*/ {m_Nsrch, CURSOR, MVMT|NREL|VIZ}, /* O insert above line*/ {v_insert, CURSOR, SDOT}, /* P paste before */ {v_paste, CURSOR, SDOT}, /* Q quit to EX mode */ {v_quit, NO_ARGS, NO_FLAGS}, /* R overtype */ {v_overtype, CURSOR, SDOT}, /* S change line */ {v_change, CURSOR_MOVED, SDOT}, #ifndef NO_CHARSEARCH /* T move bk to char */ {m_Tch, C_C_K_CHAR, MVMT|INCL|VIZ}, #else /* T not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* U undo whole line */ {v_undoline, CURSOR, FRNT}, #ifndef NO_VISIBLE /* V start visible */ {v_start, CURSOR, INCL|LNMD|VIZ}, #else /* V not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* W move forward Word*/ {m_fword, CURSOR, MVMT|INCL|VIZ}, /* X delete to left */ {v_xchar, CURSOR, SDOT}, /* Y yank text */ {v_yank, CURSOR_MOVED, NCOL}, /* Z save file & exit */ {v_xit, CURSOR_CNT_KEY, NO_FLAGS}, /* [ move back section*/ {m_paragraph, CURSOR, MVMT|LNMD|NREL|VIZ}, #ifndef NO_POPUP /* \ pop-up menu */ {v_popup, CURSOR_MOVED, VIZ}, #else /* \ not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* ] move fwd section */ {m_paragraph, CURSOR, MVMT|LNMD|NREL|VIZ}, /* ^ move to front */ {m_front, CURSOR, MVMT|VIZ}, /* _ current line */ {m_updnto, CURSOR, MVMT|LNMD|FRNT|INCL}, /* ` move to mark */ {m_tomark, C_C_K_MARK, MVMT|NREL|VIZ}, /* a append at cursor */ {v_insert, CURSOR, SDOT}, /* b move back word */ {m_bword, CURSOR, MVMT|VIZ}, /* c change text */ {v_change, CURSOR_MOVED, SDOT|VIZ}, /* d delete op */ {v_delete, CURSOR_MOVED, SDOT|VIZ}, /* e move end word */ {m_eword, CURSOR, MVMT|INCL|VIZ}, #ifndef NO_CHARSEARCH /* f move fwd for char*/ {m_fch, C_C_K_CB��B��B��B��B��B��B��B��B��B��B��B��B��B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������HAR, MVMT|INCL|VIZ}, #else /* f not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* g not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* h move left */ {m_left, CURSOR, MVMT|VIZ}, /* i insert at cursor */ {v_insert, CURSOR, SDOT}, /* j move down */ {m_updnto, CURSOR, MVMT|NCOL|LNMD|VIZ|INCL}, /* k move up */ {m_updnto, CURSOR, MVMT|NCOL|LNMD|VIZ|INCL}, /* l move right */ {m_right, CURSOR, MVMT|INCL|VIZ}, /* m define a mark */ {v_mark, C_C_K_MARK, NO_FLAGS}, /* n repeat prev srch */ {m_nsrch, CURSOR, MVMT|NREL|VIZ}, /* o insert below line*/ {v_insert, CURSOR, SDOT}, /* p paste after */ {v_paste, CURSOR, SDOT}, /* q not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, /* r replace chars */ {v_replace, C_C_K_REP1, SDOT}, /* s subst N chars */ {v_subst, CURSOR, SDOT}, #ifndef NO_CHARSEARCH /* t move fwd to char */ {m_tch, C_C_K_CHAR, MVMT|INCL|VIZ}, #else /* t not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* u undo */ {v_undo, CURSOR, NO_FLAGS}, #ifndef NO_VISIBLE /* v start visible */ {v_start, CURSOR, INCL|VIZ}, #else /* v not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS}, #endif /* w move fwd word */ {m_fword, CURSOR, MVMT|INCL|VIZ}, /* x delete character */ {v_xchar, CURSOR, SDOT}, /* y yank text */ {v_yank, CURSOR_MOVED, NCOL|VIZ}, /* z adjust scrn row */ {m_z, CURSOR_CNT_KEY, NCOL|VIZ}, /* { back paragraph */ {m_paragraph, CURSOR, MVMT|LNMD|VIZ}, /* | move to column */ {m_tocol, CURSOR, MVMT|NREL|VIZ}, /* } fwd paragraph */ {m_paragraph, CURSOR, MVMT|LNMD|VIZ}, /* ~ upper/lowercase */ {v_ulcase, CURSOR, SDOT}, /* DEL not defined */ {NO_FUNC, NO_ARGS, NO_FLAGS} }; void vi() { REG int key; /* keystroke from user */ long count; /* numeric argument to some functions */ REG struct keystru *keyptr;/* pointer to vikeys[] element */ MARK tcurs; /* temporary cursor */ int prevkey;/* previous key, if d/c/y/</>/! */ MARK range; /* start of range for d/c/y/</>/! */ char text[132]; int dotkey; /* last "key" of a change */ int dotpkey;/* last "prevkey" of a change */ int dotkey2;/* last extra "getkey()" of a change */ int dotcnt; /* last "count" of a change */ int firstkey; REG int i; /* tell the redraw() function to start from scratch */ redraw(MARK_UNSET, FALSE); #ifdef lint /* lint says that "range" might be used before it is set. This * can't really happen due to the way "range" and "prevkey" are used, * but lint doesn't know that. This line is here ONLY to keep lint * happy. */ range = 0L; #endif /* safeguard against '.' with no previous command */ dotkey = dotpkey = dotkey2 = dotcnt = 0; /* go immediately into insert mode, if ":set inputmode" */ firstkey = 0; #ifndef NO_EXTENSIONS if (*o_inputmode) { firstkey = 'i'; } #endif /* Repeatedly handle VI commands */ for (count = 0, prevkey = '\0'; mode == MODE_VI; ) { /* if we've moved off the undoable line, then we can't undo it at all */ if (markline(cursor) != U_line) { U_line = 0L; } /* report any changes from the previous command */ if (rptlines >= *o_report) { redraw(cursor, FALSE); msg("%ld line%s %s", rptlines, (rptlines==1?"":"s"), rptlabel); } rptlines = 0L; /* get the next command key. It must be ASCII */ if (firstkey) { key = firstkey; firstkey = 0; } else { do { key = getkey(WHEN_VICMD); } while (key < 0 || key > 127); } /* Convert a doubled-up operator such as "dd" into "d_" */ if (prevkey && key == prevkey) { key = '_'; } /* look up the structure describing this command */ keyptr = &vikeys[key]; /* '&' and uppercase operators always act like doubled */ if (!prevkey && keyptr->args == CURSOR_MOVED && (key == '&' || isupper(key))) { range = cursor; prevkey = key; key = '_'; keyptr = &vikeys[key]; } #ifndef NO_VISIBLE /* if we're in the middle of a v/V command, reject commands * that aren't operators or movement commands */ if (V_from && !(keyptr->flags & VIZ)) { beep(); prevkey = 0; count = 0; continue; } #endif /* if we're in the middle of a d/c/y/</>/! command, reject * anything but movement. */ if (prevkey && !(keyptr->flags & (MVMT|PTMV))) { beep(); prevkey = 0; count = 0; continue; } /* set the "dot" variables, if we're supposed to */ if (((keyptr->flags & SDOT) || (prevkey && vikeys[prevkey].flags & SDOT)) #ifndef NO_VISIBLE && !V_from #endif ) { dotkey = key; dotpkey = prevkey; dotkey2 = '\0'; dotcnt = count; /* remember the line before any changes are made */ if (U_line != markline(cursor)) { U_line = markline(cursor); strcpy(U_text, fetchline(U_line)); } } /* if this is "." then set other vars from the "dot" vars */ if (key == '.') { key = dotkey; keyptr = &vikeys[key]; prevkey = dotpkey; if (prevkey) { range = cursor; } if (count == 0) { count = dotcnt; } doingdot = TRUE; /* remember the line before any changes are made */ if (U_line != markline(cursor)) { U_line = markline(cursor); strcpy(U_text, fetchline(U_line)); } } else { doingdot = FALSE; } /* process the key as a command */ tcurs = cursor; force_flags = NO_FLAGS; switch (keyptr->args & ARGSMASK) { case ZERO: if (count == 0) { tcurs = cursor & ~(BLKSIZE - 1); break; } /* else fall through & treat like other digits... */ case DIGIT: count = count * 10 + key - '0'; break; case KEYWORD: /* if not on a keyword, fail */ pfetch(markline(cursor)); key = markidx(cursor); if (!isalnum(ptext[key])) { tcurs = MARK_UNSET; break; } /* find the start of the keyword */ while (key > 0 && isalnum(ptext[key - 1])) { key--; } tcurs = (cursor & ~(BLKSIZE - 1)) + key; /* copy it into a buffer, and NUL-terminate it */ i = 0; do { text[i++] = ptext[key++]; } while (isalnum(ptext[key])); text[i] = '\0'; /* call the function */ tcurs = (*keyptr->func)(text, tcurs, count); count = 0L; break; case NO_ARGS: if (keyptr->func) { (*keyptr->func)(); } else { beep(); } count = 0L; break; case CURSOR: tcurs = (*keyptr->func)(cursor, count, key, prevkey); count = 0L; break; case CURSOR_CNT_KEY: if (doingdot) { tcurs = (*keyptr->func)(cursor, count, dotkey2); } else { /* get a key */ i = getkey(KEYMODE(keyptr->args)); if (i == '\033') /* ESC */ { count = 0; tcurs = MARK_UNSET; break; /* exit from "case CURSOR_CNT_KEY" */ } else if (i == ctrl('V')) { i = getkey(0); } /* if part of an SDOT command, remember it */ if (keyptr->flags & SDOT || (prevkey && vikeys[prevkey].flags & SDOT)) { dotkey2 = i; } /* do it */ tcurs = (*keyptr->func)(cursor, count, i); } count = 0L; break; case CURSOR_MOVED: #ifndef NO_VISIBLE if (V_from) { range = cursor; tcurs = V_from; count = 0L; prevkey = key; key = (V_linemd ? 'V' : 'v'); keyptr = &vikeys[key]; } else #endif { prevkey = key; range = cursor; force_flags = LNMD|INCL; } break; case CURSOR_EOL: prevkey = key; /* a zero-length line needs special treatment */ pfetch(markline(cursor)); if (plen == 0) { /* act on a zero-length section of text */ range = tcurs = cursor; key = '0'; } else { /* act like CURSOR_MOVED with '$' movement */ range = cursor; tcurs = m_rear(cursor, 1L); key = '$'; } count = 0L; keyptr = &vikeys[key]; break; case CURSOR_TEXT: do { text[0] = key; if (vgets(key, text + 1, sizeof text - 1) >= 0) { /* reassure user that <CR> was hit */ qaddch('\r'); refresh(); /* call the function with the text */ tcurs = (*keyptr->func)(cursor, text); } else { if (exwrote || mode == MODE_COLON) { redraw(MARK_UNSET, FALSE); } mode = MODE_VI; } } while (mode == MODE_COLON); count = 0L; break; } /* if that command took us out of vi mode, then exit the loop * NOW, without tweaking the cursor or anything. This is very * important when mode == MODE_QUIT. */ if (mode != MODE_VI) { break; } /* now move the cursor, as appropriate */ if (keyptr->args == CURSOR_MOVED) { /* the < and > keys have FRNT, * but it shouldn't be applied yet */ tcurs = adjmove(cursor, tcurs, 0); } else { tcurs = adjmove(cursor, tcurs, (int)keyptr->flags | force_flags); } /* was that the end of a d/c/y/</>/! command? */ if (prevkey && ((keyptr->flags & MVMT) #ifndef NO_VISIBLE || V_from #endif ) && count == 0L) { #ifndef NO_VISIBLE /* turn off the hilight */ V_from = 0L; #endif /* if the movement command failed, cancel operation */ if (tcurs == MARK_UNSET) { prevkey = 0; count = 0; continue; } /* make sure range=front and tcurs=rear. Either way, * leave cursor=range since that's where we started. */ cursor = range; if (tcurs < range) { range = tcurs; tcurs = cursor; } /* The 'w' and 'W' destinations should never take us * to the front of a line. Instead, they should take * us only to the end of the preceding line. */ if ((keyptr->flags & (MVMT|NREL|LNMD|FRNT|INCL)) == MVMT && markline(range) < markline(tcurs) && (markline(tcurs) > nlines || tcurs == m_front(tcurs, 0L))) { tcurs = (tcurs & ~(BLKSIZE - 1)) - BLKSIZE; pfetch(markline(tcurs)); tcurs += plen; } /* adjust for line mode & inclusion of last char/line */ i = (keyptr->flags | vikeys[prevkey].flags); switch ((i | force_flags) & (INCL|LNMD)) { case INCL: tcurs++; break; case INCL|LNMD: tcurs += BLKSIZE; /* fall through... */ case LNMD: range &= ~(BLKSIZE - 1); tcurs &= ~(BLKSIZE - 1); break; } /* run the function */ tcurs = (*vikeys[prevkey].func)(range, tcurs); if (mode == MODE_VI) { (void)adjmove(cursor, cursor, 0); cursor = adjmove(cursor, tcurs, (int)vikeys[prevkey].flags); } /* cleanup */ prevkey = 0; } else if (!prevkey) { if (tcurs != MARK_UNSET) cursor = tcurs; } } } /* This function adjusts the MARK value that they return; here we make sure * it isn't past the end of the line, and that the column hasn't been * *accidentally* changed. */ MARK adjmove(old, new, flags) MARK old; /* the cursor position before the command */ REG MARK new; /* the cursor position after the command */ int flags; /* various flags regarding cursor mvmt */ { static int colno; /* the column number that we want */ REG char *text; /* used to scan through the line's text */ REG int i; #ifdef DEBUG watch(); #endif /* if the command failed, bag it! */ if (new == MARK_UNSET) { beep(); return old; } /* if this is a non-relative movement, set the '' mark */ if (flags & NREL) { mark[26] = old; } /* make sure it isn't past the end of the file */ if (markline(new) < 1) { new = MARK_FIRST; } else if (markline(new) > nlines) { new = MARK_LAST; } /* fetch the new line */ pfetch(markline(new)); /* move to the front, if we're supposed to */ if (flags & FRNT) { new = m_front(new, 1L); } /* change the column#, or change the mark to suit the column# */ if (!(flags & NCOL)) { /* change the column# */ i = markidx(new); if (i == BLKSIZE - 1) { new &= ~(BLKSIZE - 1); if (plen > 0) { new += plen - 1; } colno = BLKSIZE * 8; /* one heck of a big colno */ } else if (plen > 0) { if (i >= plen) { new = (new & ~(BLKSIZE - 1)) + plen - 1; } colno = idx2col(new, ptext, FALSE); } else { new &= ~(BLKSIZE - 1); colno = 0; } } else { /* adjust the mark to get as close as possible to column# */ for (i = 0, text = ptext; i <= colno && *text; text++) { if (*text == '\t' && !*o_list) { i += *o_tabstop - (i % *o_tabstop); } else if (UCHAR(*text) < ' ' || *text == 127) { i += 2; } #ifndef NO_CHARATTR else if (*o_charattr && text[0] == '\\' && text[1] == 'f' && text[2]) { text += 2; /* plus one more in "for()" stmt */ } #endif else { i++; } } if (text > ptext) { text--; } new = (new & ~(BLKSIZE - 1)) + (int)(text - ptext); } return new; } #ifdef DEBUG watch() { static wasset; if (*origname) { wasset = TRUE; } else if (wasset) { mode = MODE_EX; msg("origname was clobbered"); endwin(); abort(); } if (wasset && nlines == 0) { mode = MODE_EX; msg("nlines=0"); endwin(); abort(); } } #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vi.h */ /* Author: * Steve Kirkendall * 14407 SW Teal Blvd. #C * Beaverton, OR 97005 * kirkenda@cs.pdx.edu */ #define VERSION "ELVIS 1.5, by Steve Kirkendall (23 March 1992)" #define COPYING "This version of ELVIS is freely redistributable." #include <errno.h> extern int errno; #if TOS && !defined(__GNUC__) #define ENOENT (-AEFILNF) #endif #if TOS || VMS # include <types.h> # define O_RDONLY 0 # define O_WRONLY 1 # define O_RDWR 2 # ifdef __GNUC__ # define S_IJDIR S_IFDIR # endif #else # if OSK # include <modes.h> # define O_RDONLY S_IREAD # define O_WRONLY S_IWRITE # define O_RDWR (S_IREAD | S_IWRITE) # define ENOENT E_PNNF # define sprintf Sprintf # else # include <sys/types.h> # if COHERENT # include <sys/fcntl.h> # else # include <fcntl.h> # endif # endif #endif #ifndef O_BINARY # define O_BINARY 0 #endif #include "curses.h" #include <signal.h> /*------------------------------------------------------------------------*/ /* Miscellaneous constants. */ #define INFINITY 2000000001L /* a very large integer */ #define LONGKEY 10 /* longest possible raw :map key */ #ifndef MAXRCLEN # define MAXRCLEN 1000 /* longest possible :@ command */ #endif /*------------------------------------------------------------------------*/ /* These describe how temporary files are divided into blocks */ #define MAXBLKS (BLKSIZE / sizeof(unsigned short)) typedef union { char c[BLKSIZE]; /* for text blocks */ unsigned short n[MAXBLKS]; /* for the header block */ } BLK; /*------------------------------------------------------------------------*/ /* These are used manipulate BLK buffers. */ extern BLK hdr; /* buffer for the header block */ extern BLK *blkget(); /* given index into hdr.c[], reads block */ extern BLK *blkadd(); /* inserts a new block into hdr.c[] */ /*------------------------------------------------------------------------*/ /* These are used to keep track of various flags */ extern struct _viflags { short file; /* file flags */ } viflags; /* file flags */ #define NEWFILE 0x0001 /* the file was just created */ #define READONLY 0x0002 /* the file is read-only */ #define HADNUL 0x0004 /* the file contained NUL characters */ #define MODIFIED 0x0008 /* the file has been modified, but not saved */ #define NOFILE 0x0010 /* no name is known for the current text */ #define ADDEDNL 0x0020 /* newlines were added to the file */ #define HADBS 0x0040 /* backspace chars were lost from the file */ #define UNDOABLE 0x0080 /* file has been modified */ #define NOTEDITED 0x0100 /* the :file command has been used */ /* macros used to set/clear/test flags */ #define setflag(x,y) viflags.x |= y #define clrflag(x,y) viflags.x &= ~y #define tstflag(x,y) (viflags.x & y) #define initflags() viflags.file = 0; /* The options */ extern char o_autoindent[1]; extern char o_autoprint[1]; extern char o_autotab[1]; extern char o_autowrite[1]; extern char o_columns[3]; extern char o_directory[30]; extern char o_edcompatible[1]; extern char o_equalprg[80]; extern char o_errorbells[1]; extern char o_exrefresh[1]; extern char o_ignorecase[1]; extern char o_keytime[3]; extern char o_keywordprg[80]; extern char o_lines[3]; extern char o_list[1]; extern char o_number[1]; extern char o_readonly[1]; extern char o_remap[1]; extern char o_report[3]; extern char o_scroll[3]; extern char o_shell[60]; extern char o_shiftwidth[3]; extern char o_sidescroll[3]; extern char o_sync[1]; extern char o_tabstop[3]; extern char o_term[30]; extern char o_flash[1]; extern char o_warn[1]; extern char o_wrapscan[1]; #ifndef CRUNCH extern char o_beautify[1]; extern char o_exrc[1]; extern char o_mesg[1]; extern char o_more[1]; extern char o_novice[1]; extern char o_prompt[1]; extern char o_taglength[3]; extern char o_terse[1]; extern char o_window[3]; extern char o_wrapmargin[3]; extern char o_writeany[1]; #endif #ifndef NO_ERRLIST extern char o_cc[30]; extern char o_make[30]; #endif #ifndef NO_CHARATTR extern char o_charattr[1]; #endif #ifndef NO_DIGRAPH extern char o_digraph[1]; extern char o_flipcase[80]; #endif #ifndef NO_SENTENCE extern char o_hideformat[1]; #endif #ifndef NO_EXTENSIONS extern char o_inputmode[1]; extern char o_ruler[1]; #endif #ifndef NO_MAGIC extern char o_magic[1]; #endif #ifndef NO_MODELINES extern char o_modelines[1]; #endif #ifndef NO_SENTENCE extern char o_paragraphs[30]; extern char o_sections[30]; #endif #if MSDOS extern char o_pcbios[1]; #endif #ifndef NO_SHOWMATCH extern char o_showmatch[1]; #endif #ifndef NO_SHOWMODE extern char o_smd[1]; #endif /*------------------------------------------------------------------------*/ /* These help support the single-line multi-change "undo" -- shift-U */ extern char U_text[BLKSIZE]; extern long U_line; /*------------------------------------------------------------------------*/ /* These are used to refer to places in the text */ typedef long MARK; #define markline(x) (long)((x) / BLKSIZE) #define markidx(x) (int)((x) & (BLKSIZE - 1)) #define MARK_UNSET ((MARK)0) #define MARK_FIRST ((MARK)BLKSIZE) #define MARK_LAST ((MARK)(nlines * BLKSIZE)) #define MARK_AT_LINE(x) ((MARK)(x) * BLKSIZE) #define NMARKS 29 extern MARK mark[NMARKS]; /* marks a-z, plus mark ' and two temps */ extern MARK cursor; /* mark where line is */ /*------------------------------------------------------------------------*/ /* These are used to keep track of the current & previous files. */ extern long origtime; /* modification date&time of the current file */ extern char origname[256]; /* name of the current file */ extern char prevorig[256]; /* name of the preceding file */ extern long prevline; /* line number from preceding file */ /*------------------------------------------------------------------------*/ /* misc housekeeping variables & functions */ extern int tmpfd; /* fd used to access the tmp file */ extern int tmpnum; /* counter used to generate unique filenames */ extern long lnum[MAXBLKS]; /* last line# of each block */ extern long nlines; /* number of lines in the file */ extern char args[BLKSIZE]; /* file names given on the command line */ extern int argno; /* the current element of args[] */ extern int nargs; /* number of filenames in args */ extern long changes; /* counts changes, to prohibit short-cuts */ extern int significant; /* boolean: was a *REAL* change made? */ extern BLK tmpblk; /* a block used to accumulate changes */ extern long topline; /* file line number of top line */ extern int leftcol; /* column number of left col */ #define botline (topline + LINES - 2) #define rightcol (leftcol + COLS - (*o_number ? 9 : 1)) extern int physcol; /* physical column number that cursor is on */ extern int physrow; /* physical row number that cursor is on */ extern int exwrote; /* used to detect verbose ex commands */ extern int doingdot; /* boolean: are we doing the "." command? */ extern int doingglobal; /* boolean: are doing a ":g" command? */ extern long rptlines; /* number of lines affected by a command */ extern char *rptlabel; /* description of how lines were affected */ extern char *fetchline(); /* read a given line from tmp file */ extern char *parseptrn(); /* isolate a regexp in a line */ extern MARK paste(); /* paste from cut buffer to a given point */ extern char *wildcard(); /* expand wildcards in filenames */ extern MARK input(); /* inserts characters from keyboard */ extern char *linespec(); /* finds the end of a /regexp/ string */ #define ctrl(ch) ((ch)&037) #ifndef NO_RECYCLE extern long allocate(); /* allocate a free block of the tmp file */ #endif extern int trapint(); /* trap handler for SIGINT */ extern int deathtrap(); /* trap handler for deadly signals */ extern void blkdirty(); /* marks a block as being "dirty" */ extern void blkflush(); /* writes a single dirty block to the disk */ extern void blksync(); /* forces all "dirty" blocks to disk */ extern void blkinit(); /* resets the block cache to "empty" state */ extern void beep(); /* rings the terminal's bell */ extern void exrefresh(); /* writes text to the screen */ extern void msg(); /* writes a printfB��B��B��B��B��B��B��B��B��B��B��B��B��B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-style message to the screen */ extern void endmsgs(); /* if "manymsgs" is set, then scroll up 1 line */ extern void garbage(); /* reclaims any garbage blocks */ extern void redraw(); /* updates the screen after a change */ extern void resume_curses();/* puts the terminal in "cbreak" mode */ extern void beforedo(); /* saves current revision before a new change */ extern void afterdo(); /* marks end of a beforedo() change */ extern void abortdo(); /* like "afterdo()" followed by "undo()" */ extern int undo(); /* restores file to previous undo() */ extern void dumpkey(); /* lists key mappings to the screen */ extern void mapkey(); /* defines a new key mapping */ extern void savekeys(); /* lists key mappings to a file */ extern void redrawrange(); /* records clues from modify.c */ extern void cut(); /* saves text in a cut buffer */ extern void delete(); /* deletes text */ extern void add(); /* adds text */ extern void change(); /* deletes text, and then adds other text */ extern void cutswitch(); /* updates cut buffers when we switch files */ extern void do_abbr(); /* defines or lists abbreviations */ extern void do_digraph(); /* defines or lists digraphs */ extern void exstring(); /* execute a string as EX commands */ extern void dumpopts(); extern void setopts(); extern void saveopts(); extern void savedigs(); extern void saveabbr(); extern void savecolor(); extern void cutname(); extern void cutname(); extern void initopts(); extern void cutend(); #ifndef CRUNCH extern int wset; /* boolean: has the "window" size been set? */ #endif /*------------------------------------------------------------------------*/ /* macros that are used as control structures */ #define BeforeAfter(before, after) for((before),bavar=1;bavar;(after),bavar=0) #define ChangeText BeforeAfter(beforedo(FALSE),afterdo()) extern int bavar; /* used only in BeforeAfter macros */ /*------------------------------------------------------------------------*/ /* These are the movement commands. Each accepts a mark for the starting */ /* location & number and returns a mark for the destination. */ extern MARK m_updnto(); /* k j G */ extern MARK m_right(); /* h */ extern MARK m_left(); /* l */ extern MARK m_tocol(); /* | */ extern MARK m_front(); /* ^ */ extern MARK m_rear(); /* $ */ extern MARK m_fword(); /* w */ extern MARK m_bword(); /* b */ extern MARK m_eword(); /* e */ extern MARK m_paragraph(); /* { } [[ ]] */ extern MARK m_match(); /* % */ #ifndef NO_SENTENCE extern MARK m_sentence(); /* ( ) */ #endif extern MARK m_tomark(); /* 'm */ #ifndef NO_EXTENSIONS extern MARK m_wsrch(); /* ^A */ #endif extern MARK m_nsrch(); /* n */ extern MARK m_Nsrch(); /* N */ extern MARK m_fsrch(); /* /regexp */ extern MARK m_bsrch(); /* ?regexp */ #ifndef NO_CHARSEARCH extern MARK m__ch(); /* ; , */ extern MARK m_fch(); /* f */ extern MARK m_tch(); /* t */ extern MARK m_Fch(); /* F */ extern MARK m_Tch(); /* T */ #endif extern MARK m_row(); /* H L M */ extern MARK m_z(); /* z */ extern MARK m_scroll(); /* ^B ^F ^E ^Y ^U ^D */ /* Some stuff that is used by movement functions... */ extern MARK adjmove(); /* a helper fn, used by move fns */ /* This macro is used to set the default value of cnt */ #define DEFAULT(val) if (cnt < 1) cnt = (val) /* These are used to minimize calls to fetchline() */ extern int plen; /* length of the line */ extern long pline; /* line number that len refers to */ extern long pchgs; /* "changes" level that len refers to */ extern char *ptext; /* text of previous line, if valid */ extern void pfetch(); extern char digraph(); /* This is used to build a MARK that corresponds to a specific point in the * line that was most recently pfetch'ed. */ #define buildmark(text) (MARK)(BLKSIZE * pline + (int)((text) - ptext)) /*------------------------------------------------------------------------*/ /* These are used to handle EX commands. */ #define CMD_NULL 0 /* NOT A VALID COMMAND */ #define CMD_ABBR 1 /* "define an abbreviation" */ #define CMD_ARGS 2 /* "show me the args" */ #define CMD_APPEND 3 /* "insert lines after this line" */ #define CMD_AT 4 /* "execute a cut buffer's contents via EX" */ #define CMD_BANG 5 /* "run a single shell command" */ #define CMD_CC 6 /* "run `cc` and then do CMD_ERRLIST" */ #define CMD_CD 7 /* "change directories" */ #define CMD_CHANGE 8 /* "change some lines" */ #define CMD_COLOR 9 /* "change the default colors" */ #define CMD_COPY 10 /* "copy the selected text to a given place" */ #define CMD_DELETE 11 /* "delete the selected text" */ #define CMD_DIGRAPH 12 /* "add a digraph, or display them all" */ #define CMD_EDIT 13 /* "switch to a different file" */ #define CMD_EQUAL 14 /* "display a line number" */ #define CMD_ERRLIST 15 /* "locate the next error in a list" */ #define CMD_FILE 16 /* "show the file's status" */ #define CMD_GLOBAL 17 /* "globally search & do a command" */ #define CMD_INSERT 18 /* "insert lines before the current line" */ #define CMD_JOIN 19 /* "join the selected line & the one after" */ #define CMD_LIST 20 /* "print lines, making control chars visible" */ #define CMD_MAKE 21 /* "run `make` and then do CMD_ERRLIST" */ #define CMD_MAP 22 /* "adjust the keyboard map" */ #define CMD_MARK 23 /* "mark this line" */ #define CMD_MKEXRC 24 /* "make a .exrc file" */ #define CMD_MOVE 25 /* "move the selected text to a given place" */ #define CMD_NEXT 26 /* "switch to next file in args" */ #define CMD_NUMBER 27 /* "print lines from the file w/ line numbers" */ #define CMD_PRESERVE 28 /* "act as though vi crashed" */ #define CMD_PREVIOUS 29 /* "switch to the previous file in args" */ #define CMD_PRINT 30 /* "print the selected text" */ #define CMD_PUT 31 /* "insert any cut lines before this line" */ #define CMD_QUIT 32 /* "quit without writing the file" */ #define CMD_READ 33 /* "append the given file after this line */ #define CMD_RECOVER 34 /* "recover file after vi crashes" - USE -r FLAG */ #define CMD_REWIND 35 /* "rewind to first file" */ #define CMD_SET 36 /* "set a variable's value" */ #define CMD_SHELL 37 /* "run some lines through a command" */ #define CMD_SHIFTL 38 /* "shift lines left" */ #define CMD_SHIFTR 39 /* "shift lines right" */ #define CMD_SOURCE 40 /* "interpret a file's contents as ex commands" */ #define CMD_STOP 41 /* same as CMD_SUSPEND */ #define CMD_SUBAGAIN 42 /* "repeat the previous substitution" */ #define CMD_SUBSTITUTE 43 /* "substitute text in this line" */ #define CMD_SUSPEND 44 /* "suspend the vi session" */ #define CMD_TR 45 /* "transliterate chars in the selected lines" */ #define CMD_TAG 46 /* "go to a particular tag" */ #define CMD_UNABBR 47 /* "remove an abbreviation definition" */ #define CMD_UNDO 48 /* "undo the previous command" */ #define CMD_UNMAP 49 /* "remove a key sequence map */ #define CMD_VERSION 50 /* "describe which version this is" */ #define CMD_VGLOBAL 51 /* "apply a cmd to lines NOT containing an RE" */ #define CMD_VISUAL 52 /* "go into visual mode" */ #define CMD_WQUIT 53 /* "write this file out (any case) & quit" */ #define CMD_WRITE 54 /* "write the selected(?) text to a given file" */ #define CMD_XIT 55 /* "write this file out (if modified) & quit" */ #define CMD_YANK 56 /* "copy the selected text into the cut buffer" */ #ifdef DEBUG # define CMD_DEBUG 57 /* access to internal data structures */ # define CMD_VALIDATE 58 /* check for internal consistency */ #endif typedef int CMD; extern void ex(); extern void vi(); extern void doexcmd(); extern void cmd_append(); extern void cmd_args(); #ifndef NO_AT extern void cmd_at(); #endif extern void cmd_cd(); #ifndef NO_COLOR extern void cmd_color(); #endif extern void cmd_delete(); #ifndef NO_DIGRAPH extern void cmd_digraph(); #endif extern void cmd_edit(); #ifndef NO_ERRLIST extern void cmd_errlist(); #endif extern void cmd_file(); extern void cmd_global(); extern void cmd_join(); extern void cmd_mark(); #ifndef NO_ERRLIST extern void cmd_make(); #endif extern void cmd_map(); #ifndef NO_MKEXRC extern void cmd_mkexrc(); #endif extern void cmd_next(); extern void cmd_print(); extern void cmd_put(); extern void cmd_read(); extern void cmd_set(); extern void cmd_shell(); extern void cmd_shift(); extern void cmd_source(); extern void cmd_substitute(); extern void cmd_tag(); extern void cmd_undo(); extern void cmd_version(); extern void cmd_write(); extern void cmd_xit(); extern void cmd_move(); #ifdef DEBUG extern void cmd_debug(); extern void cmd_validate(); #endif #ifdef SIGTSTP extern void cmd_suspend(); #endif /*----------------------------------------------------------------------*/ /* These are used to handle VI commands */ extern MARK v_1ex(); /* : */ extern MARK v_mark(); /* m */ extern MARK v_quit(); /* Q */ extern MARK v_redraw(); /* ^L ^R */ extern MARK v_ulcase(); /* ~ */ extern MARK v_undo(); /* u */ extern MARK v_xchar(); /* x X */ extern MARK v_replace(); /* r */ extern MARK v_overtype(); /* R */ extern MARK v_selcut(); /* " */ extern MARK v_paste(); /* p P */ extern MARK v_yank(); /* y Y */ extern MARK v_delete(); /* d D */ extern MARK v_join(); /* J */ extern MARK v_insert(); /* a A i I o O */ extern MARK v_change(); /* c C */ extern MARK v_subst(); /* s */ extern MARK v_lshift(); /* < */ extern MARK v_rshift(); /* > */ extern MARK v_reformat(); /* = */ extern MARK v_filter(); /* ! */ extern MARK v_status(); /* ^G */ extern MARK v_switch(); /* ^^ */ extern MARK v_tag(); /* ^] */ extern MARK v_xit(); /* ZZ */ extern MARK v_undoline(); /* U */ extern MARK v_again(); /* & */ #ifndef NO_EXTENSIONS extern MARK v_keyword(); /* K */ extern MARK v_increment(); /* * */ #endif #ifndef NO_ERRLIST extern MARK v_errlist(); /* * */ #endif #ifndef NO_AT extern MARK v_at(); /* @ */ #endif #ifdef SIGTSTP extern MARK v_suspend(); /* ^Z */ #endif #ifndef NO_POPUP extern MARK v_popup(); /* \ */ #endif /*----------------------------------------------------------------------*/ /* These flags describe the quirks of the individual visual commands */ #define NO_FLAGS 0x00 #define MVMT 0x01 /* this is a movement command */ #define PTMV 0x02 /* this can be *part* of a movement command */ #define FRNT 0x04 /* after move, go to front of line */ #define INCL 0x08 /* include last char when used with c/d/y */ #define LNMD 0x10 /* use line mode of c/d/y */ #define NCOL 0x20 /* this command can't change the column# */ #define NREL 0x40 /* this is "non-relative" -- set the '' mark */ #define SDOT 0x80 /* set the "dot" variables, for the "." cmd */ #ifndef NO_VISIBLE # define VIZ 0x100 /* commands which can be used with 'v' */ #else # define VIZ 0 #endif /* This variable is zeroed before a command executes, and later ORed with the * command's flags after the command has been executed. It is used to force * certain flags to be TRUE for *some* invocations of a particular command. * For example, "/regexp/+offset" forces the LNMD flag, and sometimes a "p" * or "P" command will force FRNT. */ extern int force_flags; /*----------------------------------------------------------------------*/ /* These describe what mode we're in */ #define MODE_EX 1 /* executing ex commands */ #define MODE_VI 2 /* executing vi commands */ #define MODE_COLON 3 /* executing an ex command from vi mode */ #define MODE_QUIT 4 extern int mode; #define WHEN_VICMD 1 /* getkey: we're reading a VI command */ #define WHEN_VIINP 2 /* getkey: we're in VI's INPUT mode */ #define WHEN_VIREP 4 /* getkey: we're in VI's REPLACE mode */ #define WHEN_EX 8 /* getkey: we're in EX mode */ #define WHEN_MSG 16 /* getkey: we're at a "more" prompt */ #define WHEN_POPUP 32 /* getkey: we're in the pop-up menu */ #define WHEN_REP1 64 /* getkey: we're getting a single char for 'r' */ #define WHEN_CUT 128 /* getkey: we're getting a cut buffer name */ #define WHEN_MARK 256 /* getkey: we're getting a mark name */ #define WHEN_CHAR 512 /* getkey: we're getting a destination for f/F/t/T */ #define WHEN_INMV 4096 /* in input mode, interpret the key in VICMD mode */ #define WHEN_FREE 8192 /* free the keymap after doing it once */ #define WHENMASK (WHEN_VICMD|WHEN_VIINP|WHEN_VIREP|WHEN_REP1|WHEN_CUT|WHEN_MARK|WHEN_CHAR) #ifndef NO_VISIBLE extern MARK V_from; extern int V_linemd; extern MARK v_start(); #endif #ifdef DEBUG # define malloc(size) dbmalloc(size, __FILE__, __LINE__) # define free(ptr) dbfree(ptr, __FILE__, __LINE__) extern char *dbmalloc(); #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ COPYING������� Changes������� Makefile������ README�������� ccl.c��������� dfa.c��������� ecs.c��������� flex.skel����� flexdef.h����� gen.c��������� initscan.c���� libmain.c����� main.c�������� misc.c�������� nfa.c��������� parse.y������� scan.c�������� scan.l�������� sym.c��������� tblcmp.c������ yylex.c���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Flex carries the copyright used for BSD software, slightly modified because it originated at the Lawrence Berkeley (not Livermore!) Laboratory, which operates under a contract with the Department of Energy: Copyright (c) 1990 The Regents of the University of California. All rights reserved. This code is derived from software contributed to Berkeley by Vern Paxson. The United States Government has rights in this work pursuant to contract no. DE-AC03-76SF00098 between the United States Department of Energy and the University of California. Redistribution and use in source and binary forms are permitted provided that: (1) source distributions retain this entire copyright notice and comment, and (2) distributions including binaries display the following acknowledgement: ``This product includes software developed by the University of California, Berkeley and its contributors'' in the documentation or other materials provided with the distribution and in all advertising materials mentioning features or use of this software. Neither the name of the University nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. This basically says "do whatever you please with this software except remove this notice or take advantage of the University's (or the flex authors') name". Note that the "flex.skel" scanner skeleton carries no copyright notice. You are free to do whatever you please with scanners generated using flex; for them, you are not even bound by the above copyright. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Changes between 2.3 Patch #7 (28Mar91) and 2.3 Patch #6: - Fixed out-of-bounds array access that caused bad tables to be produced on machines where the bad reference happened to yield a 1. This caused problems installing or running flex on some Suns, in particular. Changes between 2.3 Patch #6 (29Aug90) and 2.3 Patch #5: - Fixed a serious bug in yymore() which basically made it completely broken. Thanks goes to Jean Christophe of the Nethack development team for finding the problem and passing along the fix. Changes between 2.3 Patch #5 (16Aug90) and 2.3 Patch #4: - An up-to-date version of initscan.c so "make test" will work after applying the previous patches Changes between 2.3 Patch #4 (14Aug90) and 2.3 Patch #3: - Fixed bug in hexadecimal escapes which allowed only digits, not letters, in escapes - Fixed bug in previous "Changes" file! Changes between 2.3 Patch #3 (03Aug90) and 2.3 Patch #2: - Correction to patch #2 for gcc compilation; thanks goes to Paul Eggert for catching this. Changes between 2.3 Patch #2 (02Aug90) and original 2.3 release: - Fixed (hopefully) headaches involving declaring malloc() and free() for gcc, which defines __STDC__ but (often) doesn't come with the standard include files such as <stdlib.h>. Reordered #ifdef maze in the scanner skeleton in the hope of getting the declarations right for cfront and g++, too. - Note that this patch supercedes patch #1 for release 2.3, which was never announced but was available briefly for anonymous ftp. Changes between 2.3 (full) release of 28Jun90 and 2.2 (alpha) release: User-visible: - A lone <<EOF>> rule (that is, one which is not qualified with a list of start conditions) now specifies the EOF action for *all* start conditions which haven't already had <<EOF>> actions given. To specify an end-of-file action for just the initial state, use <INITIAL><<EOF>>. - -d debug output is now contigent on the global yy_flex_debug being set to a non-zero value, which it is by default. - A new macro, YY_USER_INIT, is provided for the user to specify initialization action to be taken on the first call to the scanner. This action is done before the scanner does its own initialization. - yy_new_buffer() has been added as an alias for yy_create_buffer() - Comments beginning with '#' and extending to the end of the line now work, but have been deprecated (in anticipation of making flex recognize #line directives). - The funky restrictions on when semi-colons could follow the YY_NEW_FILE and yyless macros have been removed. They now behave identically to functions. - A bug in the sample redefinition of YY_INPUT in the documentation has been corrected. - A bug in the sample simple tokener in the documentation has been corrected. - The documentation on the incompatibilities between flex and lex has been reordered so that the discussion of yylineno and input() come first, as it's anticipated that these will be the most common source of headaches. Things which didn't used to be documented but now are: - flex interprets "^foo|bar" differently from lex. flex interprets it as "match either a 'foo' or a 'bar', providing it comes at the beginning of a line", whereas lex interprets it as "match either a 'foo' at the beginning of a line, or a 'bar' anywhere". - flex initializes the global "yyin" on the first call to the scanner, while lex initializes it at compile-time. - yy_switch_to_buffer() can be used in the yywrap() macro/routine. - flex scanners do not use stdio for their input, and hence when writing an interactive scanner one must explictly call fflush() after writing out a prompt. - flex scanner can be made reentrant (after a fashion) by using "yyrestart( yyin );". This is useful for interactive scanners which have interrupt handlers that long-jump out of the scanner. - a defense of why yylineno is not supported is included, along with a suggestion on how to convert scanners which rely on it. Other changes: - Prototypes and proper declarations of void routines have been added to the flex source code, courtesy of Kevin B. Kenny. - Routines dealing with memory allocation now use void* pointers instead of char* - see Makefile for porting implications. - Error-checking is now done when flex closes a file. - Various lint tweaks were added to reduce the number of gripes. - Makefile has been further parameterized to aid in porting. - Support for SCO Unix added. - Flex now sports the latest & greatest UC copyright notice (which is only slightly different from the previous one). - A note has been added to flexdoc.1 mentioning work in progress on modifying flex to generate straight C code rather than a table-driven automaton, with an email address of whom to contact if you are working along similar lines. Changes between 2.2 Patch #3 (30Mar90) and 2.2 Patch #2: - fixed bug which caused -I scanners to bomb Changes between 2.2 Patch #2 (27Mar90) and 2.2 Patch #1: - fixed bug writing past end of input buffer in yyunput() - fixed bug detecting NUL's at the end of a buffer Changes between 2.2 Patch #1 (23Mar90) and 2.2 (alpha) release: - Makefile fixes: definition of MAKE variable for systems which don't have it; installation of flexdoc.1 along with flex.1; fixed two bugs which could cause "bigtest" to fail. - flex.skel fix for compiling with g++. - README and flexdoc.1 no longer list an out-of-date BITNET address for contacting me. - minor typos and formatting changes to flex.1 and flexdoc.1. Changes between 2.2 (alpha) release of March '90 and previous release: User-visible: - Full user documentation now available. - Support for 8-bit scanners. - Scanners now accept NUL's. - A facility has been added for dealing with multiple input buffers. - Two manual entries now. One which fully describes flex (rather than just its differences from lex), and the other for quick(er) reference. - A number of changes to bring flex closer into compliance with the latest POSIX lex draft: %t support flex now accepts multiple input files and concatenates them together to form its input previous -c (compress) flag renamed -C do-nothing -c and -n flags added Any indented code or code within %{}'s in section 2 is now copied to the output - yyleng is now a bona fide global integer. - -d debug information now gives the line number of the matched rule instead of which number rule it was from the beginning of the file. - -v output now includes a summary of the flags used to generate the scanner. - unput() and yyrestart() are now globally callable. - yyrestart() no longer closes the previous value of yyin. - C++ support; generated scanners can be compiled with C++ compiler. - Primitive -lfl library added, containing default main() which calls yylex(). A number of routines currently living in the scanner skeleton will probably migrate to here in the future (in particular, yywrap() will probably cease to be a macro and instead be a function in the -lfl library). - Hexadecimal (\x) escape sequences added. - Support for MS-DOS, VMS, and Turbo-C integrated. - The %used/%unused operators have been deprecated. They may go away soon. Other changes: - Makefile enhanced for easier testing and installation. - The parser has been tweaked to detect some erroneous constructions which previously were missed. - Scanner input buffer overflow is now detected. - Bugs with missing "const" declarations fixed. - Out-of-date Minix/Atari patches provided. - Scanners no longer require printf() unless FLEX_DEBUG is being used. - A subtle input() bug has been fixed. - Line numbers for "continued action" rules (those following the special '|' action) are now correct. - unput() bug fixed; had been causing problems porting flex to VMS. - yymore() handling rewritten to fix bug with interaction between yymore() and trailing context. - EOF in actions now generates an error mB��B��B��B��B��B������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������essage. - Bug involving -CFe and generating equivalence classes fixed. - Bug which made -CF be treated as -Cf fixed. - Support for SysV tmpnam() added. - Unused #define's for scanner no longer generated. - Error messages which are associated with a particular input line are now all identified with their input line in standard format. - % directives which are valid to lex but not to flex are now ignored instead of generating warnings. - -DSYS_V flag can now also be specified -DUSG for System V compilation. Changes between 2.1 beta-test release of June '89 and previous release: User-visible: - -p flag generates a performance report to stderr. The report consists of comments regarding features of the scanner rules which result in slower scanners. - -b flag generates backtracking information to lex.backtrack. This is a list of scanner states which require backtracking and the characters on which they do so. By adding rules one can remove backtracking states. If all backtracking states are eliminated, the generated scanner will run faster. Backtracking is not yet documented in the manual entry. - Variable trailing context now works, i.e., one can have rules like "(foo)*/[ \t]*bletch". Some trailing context patterns still cannot be properly matched and generate error messages. These are patterns where the ending of the first part of the rule matches the beginning of the second part, such as "zx*/xy*", where the 'x*' matches the 'x' at the beginning of the trailing context. Lex won't get these patterns right either. - Faster scanners. - End-of-file rules. The special rule "<<EOF>>" indicates actions which are to be taken when an end-of-file is encountered and yywrap() returns non-zero (i.e., indicates no further files to process). See manual entry for example. - The -r (reject used) flag is gone. flex now scans the input for occurrences of the string "REJECT" to determine if the action is needed. It tries to be intelligent about this but can be fooled. One can force the presence or absence of REJECT by adding a line in the first section of the form "%used REJECT" or "%unused REJECT". - yymore() has been implemented. Similarly to REJECT, flex detects the use of yymore(), which can be overridden using "%used" or "%unused". - Patterns like "x{0,3}" now work (i.e., with lower-limit == 0). - Removed '\^x' for ctrl-x misfeature. - Added '\a' and '\v' escape sequences. - \<digits> now works for octal escape sequences; previously \0<digits> was required. - Better error reporting; line numbers are associated with rules. - yyleng is a macro; it cannot be accessed outside of the scanner source file. - yytext and yyleng should not be modified within a flex action. - Generated scanners #define the name FLEX_SCANNER. - Rules are internally separated by YY_BREAK in lex.yy.c rather than break, to allow redefinition. - The macro YY_USER_ACTION can be redefined to provide an action which is always executed prior to the matched rule's action. - yyrestart() is a new action which can be used to restart the scanner after it has seen an end-of-file (a "real" one, that is, one for which yywrap() returned non-zero). It takes a FILE* argument indicating a new file to scan and sets things up so that a subsequent call to yylex() will start scanning that file. - Internal scanner names all preceded by "yy_" - lex.yy.c is deleted if errors are encountered during processing. - Comments may be put in the first section of the input by preceding them with '#'. Other changes: - Some portability-related bugs fixed, in particular for machines with unsigned characters or sizeof( int* ) != sizeof( int ). Also, tweaks for VMS and Microsoft C (MS-DOS), and identifiers all trimmed to be 31 or fewer characters. Shortened file names for dinosaur OS's. Checks for allocating > 64K memory on 16 bit'ers. Amiga tweaks. Compiles using gcc on a Sun-3. - Compressed and fast scanner skeletons merged. - Skeleton header files done away with. - Generated scanner uses prototypes and "const" for __STDC__. - -DSV flag is now -DSYS_V for System V compilation. - Removed all references to FTL language. - Software now covered by BSD Copyright. - flex will replace lex in subsequent BSD releases. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# make file for "flex" tool # @(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/Makefile,v 2.9 90/05/26 17:28:44 vern Exp $ (LBL) # Porting considerations: # # For System V Unix machines, add -DUSG to CFLAGS (if it's not # automatically defined) # For Vax/VMS, add "-DVMS -DUSG" to CFLAGS. # For MS-DOS, add "-DMS_DOS -DUSG" to CFLAGS. Create \tmp if not present. # You will also want to rename flex.skel to something with a three # character extension, change SKELETON_FILE below appropriately, # See MSDOS.notes for more info. # For Amiga, add "-DAMIGA -DUSG" to CFLAGS. # For SCO Unix, add "-DSCO_UNIX" to CFLAGS. # # For C compilers which don't know about "void", add -Dvoid=int to CFLAGS. # # If your C compiler is ANSI standard but does not include the <stdlib.h> # header file (some installations of gcc have this problem), then add # -DDONT_HAVE_STDLIB_H to CFLAGS. # # By default, flex will be configured to generate 8-bit scanners only # if the -8 flag is given. If you want it to always generate 8-bit # scanners, add "-DDEFAULT_CSIZE=256" to CFLAGS. Note that doing # so will double the size of all uncompressed scanners. # # If on your system you have trouble building flex due to 8-bit # character problems, remove the -8 from FLEX_FLAGS and the # "#define FLEX_8_BIT_CHARS" from the beginning of flexdef.h. # the first time around use "make first_flex" # Installation targeting. Files will be installed under the tree rooted # at DESTDIR. User commands will be installed in BINDIR, library files # in LIBDIR (which will be created if necessary), auxiliary files in # AUXDIR. DESTDIR = BINDIR = /usr/bin LIBDIR = /usr/lib/flex AUXDIR = /usr/lib/flex # MAKE = make SKELETON_FILE = $(DESTDIR)$(AUXDIR)/flex.skel SKELFLAGS = -DDEFAULT_SKELETON_FILE=\"$(SKELETON_FILE)\" CFLAGS = $(OPT) -wo -D_MINIX -D_POSIX_SOURCE -DUSG LDFLAGS = -i COMPRESSION = FLEX_FLAGS = -ist8 -Sflex.skel # which "flex" to use to generate scan.c from scan.l FLEX = PATH=.:$$PATH flex # CC = cc FLEXOBJS = \ ccl.o \ dfa.o \ ecs.o \ gen.o \ main.o \ misc.o \ nfa.o \ parse.o \ scan.o \ sym.o \ tblcmp.o \ yylex.o FLEX_C_SOURCES = \ ccl.c \ dfa.c \ ecs.c \ gen.c \ main.c \ misc.c \ nfa.c \ parse.c \ scan.c \ sym.c \ tblcmp.c \ yylex.c FLEX_LIB_OBJS = \ libmain.o FLEXLIB = flexlib.a all : flex flex : $(FLEXOBJS) $(CC) $(CFLAGS) -o flex $(LDFLAGS) $(FLEXOBJS) first_flex: cp initscan.c scan.c $(MAKE) $(MFLAGS) flex parse.h parse.c : parse.y $(YACC) -d parse.y @mv y.tab.c parse.c @mv y.tab.h parse.h scan.c : scan.l $(FLEX) $(FLEX_FLAGS) $(COMPRESSION) scan.l >scan.c scan.o : scan.c parse.h flexdef.h $(CC) $(CFLAGS) -wa -c scan.c main.o : main.c flexdef.h $(CC) $(CFLAGS) -c $(SKELFLAGS) main.c ccl.o : ccl.c flexdef.h dfa.o : dfa.c flexdef.h ecs.o : ecs.c flexdef.h gen.o : gen.c flexdef.h misc.o : misc.c flexdef.h nfa.o : nfa.c flexdef.h parse.o : parse.c flexdef.h sym.o : sym.c flexdef.h tblcmp.o : tblcmp.c flexdef.h yylex.o : yylex.c flexdef.h $(FLEXLIB) : $(FLEX_LIB_OBJS) aal cr $(FLEXLIB) $(FLEX_LIB_OBJS) lint : $(FLEX_C_SOURCES) lint $(FLEX_C_SOURCES) > flex.lint distrib : mv scan.c initscan.c chmod 444 initscan.c $(MAKE) $(MFLAGS) clean install: \ $(DESTDIR)$(BINDIR)/flex $(DESTDIR)$(BINDIR)/lex \ $(SKELETON_FILE) $(DESTDIR)$(BINDIR)/flex: flex install -S 512k -cs -o bin flex $@ $(DESTDIR)$(BINDIR)/lex: $(DESTDIR)$(BINDIR)/flex install -l $(DESTDIR)$(BINDIR)/flex $@ $(SKELETON_FILE): flex.skel install -d -o bin $(DESTDIR)$(LIBDIR) install -c -o bin flex.skel $@ # Not installed yet. Should be part of the lib tree. install-lib: $(DESTDIR)$(LIBDIR) $(FLEXLIB) install -c -o bin -m 644 $(FLEXLIB) $(DESTDIR)$(LIBDIR)/libfl.a clean : rm -f core errs flex *.o parse.c *.lint parse.h flex.man tags \ $(FLEXLIB) tags : ctags $(FLEX_C_SOURCES) vms : flex.man $(MAKE) $(MFLAGS) distrib test : flex ./flex $(FLEX_FLAGS) $(COMPRESSION) scan.l | diff scan.c - bigtest : rm -f scan.c ; $(MAKE) COMPRESSION="-C" test rm -f scan.c ; $(MAKE) COMPRESSION="-Ce" test rm -f scan.c ; $(MAKE) COMPRESSION="-Cm" test rm -f scan.c ; $(MAKE) COMPRESSION="-Cfe" test rm -f scan.c ; $(MAKE) COMPRESSION="-CFe" test rm -f scan.c ; $(MAKE) COMPRESSION="-Cf" test rm -f scan.c ; $(MAKE) COMPRESSION="-CF" test rm -f scan.c ; $(MAKE) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������// $Header: /usr/fsys/odin/a/vern/flex/RCS/README,v 2.8 90/05/26 17:31:27 vern Exp $ This is release 2.3 of flex - a full release. The flex distribution consists of the following files: README This message Makefile flexdef.h parse.y scan.l ccl.c dfa.c ecs.c flex sources gen.c main.c misc.c nfa.c sym.c tblcmp.c yylex.c libmain.c flex library (-lfl) source initscan.c pre-flex'd version of scan.l flex.skel skeleton for generated scanners flexdoc.1 full user documentation flex.1 reference documentation Changes Differences between this release and the previous one COPYING flex's copyright MISC/ a directory containing miscellaneous porting-related notes (for Atari, MS-DOS, Turbo-C, and VMS) Decide where you want to keep flex.skel (suggestion: /usr/local/lib), but don't move it there yet. Edit "Makefile" and change the definition of SKELETON_FILE to reflect the full pathname of flex.skel. Read the "Porting considerations" note in the Makefile and make the necessary changes. To make flex for the first time, use: make first_flex which uses the pre-generated copy of the flex scanner (the scanner itself is written using flex). Assuming it builds successfully, you can test it using make test The "diff" should not show any differences. If you're feeling adventurous, issue "make bigtest" and be prepared to wait a while. Install flex using: make install Please send problems and feedback to: vern@cs.cornell.edu decvax!cornell!vern Vern Paxson CS Department 4126 Upson Hall Cornell University Ithaca, NY 14853-7501 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ccl - routines for character classes */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ccl.c,v 2.5 90/06/27 23:48:13 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* ccladd - add a single character to a ccl * * synopsis * int cclp; * int ch; * ccladd( cclp, ch ); */ void ccladd( cclp, ch ) int cclp; int ch; { int ind, len, newpos, i; len = ccllen[cclp]; ind = cclmap[cclp]; /* check to see if the character is already in the ccl */ for ( i = 0; i < len; ++i ) if ( ccltbl[ind + i] == ch ) return; newpos = ind + len; if ( newpos >= current_max_ccl_tbl_size ) { current_max_ccl_tbl_size += MAX_CCL_TBL_SIZE_INCREMENT; ++num_reallocs; ccltbl = reallocate_character_array( ccltbl, current_max_ccl_tbl_size ); } ccllen[cclp] = len + 1; ccltbl[newpos] = ch; } /* cclinit - make an empty ccl * * synopsis * int cclinit(); * new_ccl = cclinit(); */ int cclinit() { if ( ++lastccl >= current_maxccls ) { current_maxccls += MAX_CCLS_INCREMENT; ++num_reallocs; cclmap = reallocate_integer_array( cclmap, current_maxccls ); ccllen = reallocate_integer_array( ccllen, current_maxccls ); cclng = reallocate_integer_array( cclng, current_maxccls ); } if ( lastccl == 1 ) /* we're making the first ccl */ cclmap[lastccl] = 0; else /* the new pointer is just past the end of the last ccl. Since * the cclmap points to the \first/ character of a ccl, adding the * length of the ccl to the cclmap pointer will produce a cursor * to the first free space */ cclmap[lastccl] = cclmap[lastccl - 1] + ccllen[lastccl - 1]; ccllen[lastccl] = 0; cclng[lastccl] = 0; /* ccl's start out life un-negated */ return ( lastccl ); } /* cclnegate - negate a ccl * * synopsis * int cclp; * cclnegate( ccl ); */ void cclnegate( cclp ) int cclp; { cclng[cclp] = 1; } /* list_character_set - list the members of a set of characters in CCL form * * synopsis * int cset[CSIZE]; * FILE *file; * list_character_set( cset ); * * writes to the given file a character-class representation of those * characters present in the given set. A character is present if it * has a non-zero value in the set array. */ void list_character_set( file, cset ) FILE *file; int cset[]; { register int i; char *readable_form(); putc( '[', file ); for ( i = 0; i < csize; ++i ) { if ( cset[i] ) { register int start_char = i; putc( ' ', file ); fputs( readable_form( i ), file ); while ( ++i < csize && cset[i] ) ; if ( i - 1 > start_char ) /* this was a run */ fprintf( file, "-%s", readable_form( i - 1 ) ); putc( ' ', file ); } } putc( ']', file ); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dfa - DFA construction routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/dfa.c,v 2.7 90/06/27 23:48:15 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* declare functions that have forward references */ void dump_associated_rules PROTO((FILE*, int)); void dump_transitions PROTO((FILE*, int[])); void sympartition PROTO((int[], int, int[], int[])); int symfollowset PROTO((int[], int, int, int[])); /* check_for_backtracking - check a DFA state for backtracking * * synopsis * int ds, state[numecs]; * check_for_backtracking( ds, state ); * * ds is the number of the state to check and state[] is its out-transitions, * indexed by equivalence class, and state_rules[] is the set of rules * associated with this state */ void check_for_backtracking( ds, state ) int ds; int state[]; { if ( (reject && ! dfaacc[ds].dfaacc_set) || ! dfaacc[ds].dfaacc_state ) { /* state is non-accepting */ ++num_backtracking; if ( backtrack_report ) { fprintf( backtrack_file, "State #%d is non-accepting -\n", ds ); /* identify the state */ dump_associated_rules( backtrack_file, ds ); /* now identify it further using the out- and jam-transitions */ dump_transitions( backtrack_file, state ); putc( '\n', backtrack_file ); } } } /* check_trailing_context - check to see if NFA state set constitutes * "dangerous" trailing context * * synopsis * int nfa_states[num_states+1], num_states; * int accset[nacc+1], nacc; * check_trailing_context( nfa_states, num_states, accset, nacc ); * * NOTES * Trailing context is "dangerous" if both the head and the trailing * part are of variable size \and/ there's a DFA state which contains * both an accepting state for the head part of the rule and NFA states * which occur after the beginning of the trailing context. * When such a rule is matched, it's impossible to tell if having been * in the DFA state indicates the beginning of the trailing context * or further-along scanning of the pattern. In these cases, a warning * message is issued. * * nfa_states[1 .. num_states] is the list of NFA states in the DFA. * accset[1 .. nacc] is the list of accepting numbers for the DFA state. */ void check_trailing_context( nfa_states, num_states, accset, nacc ) int *nfa_states, num_states; int *accset; register int nacc; { register int i, j; for ( i = 1; i <= num_states; ++i ) { int ns = nfa_states[i]; register int type = state_type[ns]; register int ar = assoc_rule[ns]; if ( type == STATE_NORMAL || rule_type[ar] != RULE_VARIABLE ) { /* do nothing */ } else if ( type == STATE_TRAILING_CONTEXT ) { /* potential trouble. Scan set of accepting numbers for * the one marking the end of the "head". We assume that * this looping will be fairly cheap since it's rare that * an accepting number set is large. */ for ( j = 1; j <= nacc; ++j ) if ( accset[j] & YY_TRAILING_HEAD_MASK ) { fprintf( stderr, "%s: Dangerous trailing context in rule at line %d\n", program_name, rule_linenum[ar] ); return; } } } } /* dump_associated_rules - list the rules associated with a DFA state * * synopisis * int ds; * FILE *file; * dump_associated_rules( file, ds ); * * goes through the set of NFA states associated with the DFA and * extracts the first MAX_ASSOC_RULES unique rules, sorts them, * and writes a report to the given file */ void dump_associated_rules( file, ds ) FILE *file; int ds; { register int i, j; register int num_associated_rules = 0; int rule_set[MAX_ASSOC_RULES + 1]; int *dset = dss[ds]; int size = dfasiz[ds]; for ( i = 1; i <= size; ++i ) { register rule_num = rule_linenum[assoc_rule[dset[i]]]; for ( j = 1; j <= num_associated_rules; ++j ) if ( rule_num == rule_set[j] ) break; if ( j > num_associated_rules ) { /* new rule */ if ( num_associated_rules < MAX_ASSOC_RULES ) rule_set[++num_associated_rules] = rule_num; } } bubble( rule_set, num_associated_rules ); fprintf( file, " associated rule line numbers:" ); for ( i = 1; i <= num_associated_rules; ++i ) { if ( i % 8 == 1 ) putc( '\n', file ); fprintf( file, "\t%d", rule_set[i] ); } putc( '\n', file ); } /* dump_transitions - list the transitions associated with a DFA state * * synopisis * int state[numecs]; * FILE *file; * dump_transitions( file, state ); * * goes through the set of out-transitions and lists them in human-readable * form (i.e., not as equivalence classes); also lists jam transitions * (i.e., all those which are not out-transitions, plus EOF). The dump * is done to the given file. */ void dump_transitions( file, state ) FILE *file; int state[]; { register int i, ec; int out_char_set[CSIZE]; for ( i = 0; i < csize; ++i ) { ec = abs( ecgroup[i] ); out_char_set[i] = state[ec]; } fprintf( file, " out-transitions: " ); list_character_set( file, out_char_set ); /* now invert the members of the set to get the jam transitions */ for ( i = 0; i < csize; ++i ) out_char_set[i] = ! out_char_set[i]; fprintf( file, "\n jam-transitions: EOF " ); list_character_set( file, out_char_set ); putc( '\n', file ); } /* epsclosure - construct the epsilon closure of a set of ndfa states * * synopsis * int t[current_max_dfa_size], numstates, accset[num_rules + 1], nacc; * int hashval; * int *epsclosure(); * t = epsclosure( t, &numstates, accset, &nacc, &hashval ); * * NOTES * the epsilon closure is the set of all states reachable by an arbitrary * number of epsilon transitions which themselves do not have epsilon * transitions going out, unioned with the set of states which have non-null * accepting numbers. t is an array of size numstates of nfa state numbers. * Upon return, t holds the epsilon closure and numstates is updated. accset * holds a list of the accepting numbers, and the size of accset is given * by nacc. t may be subjected to reallocation if it is not large enough * to hold the epsilon closure. * * hashval is the hash value for the dfa corresponding to the state set */ int *epsclosure( t, ns_addr, accset, nacc_addr, hv_addr ) int *t, *ns_addr, accset[], *nacc_addr, *hv_addr; { register int stkpos, ns, tsp; int numstates = *ns_addr, nacc, hashval, transsym, nfaccnum; int stkend, nstate; static int did_stk_init = false, *stk; #define MARK_STATE(state) \ trans1[state] = trans1[state] - MARKER_DIFFERENCE; #define IS_MARKED(state) (trans1[state] < 0) #define UNMARK_STATE(state) \ trans1[state] = trans1[state] + MARKER_DIFFERENCE; #defineB��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B��B���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� CHECK_ACCEPT(state) \ { \ nfaccnum = accptnum[state]; \ if ( nfaccnum != NIL ) \ accset[++nacc] = nfaccnum; \ } #define DO_REALLOCATION \ { \ current_max_dfa_size += MAX_DFA_SIZE_INCREMENT; \ ++num_reallocs; \ t = reallocate_integer_array( t, current_max_dfa_size ); \ stk = reallocate_integer_array( stk, current_max_dfa_size ); \ } \ #define PUT_ON_STACK(state) \ { \ if ( ++stkend >= current_max_dfa_size ) \ DO_REALLOCATION \ stk[stkend] = state; \ MARK_STATE(state) \ } #define ADD_STATE(state) \ { \ if ( ++numstates >= current_max_dfa_size ) \ DO_REALLOCATION \ t[numstates] = state; \ hashval = hashval + state; \ } #define STACK_STATE(state) \ { \ PUT_ON_STACK(state) \ CHECK_ACCEPT(state) \ if ( nfaccnum != NIL || transchar[state] != SYM_EPSILON ) \ ADD_STATE(state) \ } if ( ! did_stk_init ) { stk = allocate_integer_array( current_max_dfa_size ); did_stk_init = true; } nacc = stkend = hashval = 0; for ( nstate = 1; nstate <= numstates; ++nstate ) { ns = t[nstate]; /* the state could be marked if we've already pushed it onto * the stack */ if ( ! IS_MARKED(ns) ) PUT_ON_STACK(ns) CHECK_ACCEPT(ns) hashval = hashval + ns; } for ( stkpos = 1; stkpos <= stkend; ++stkpos ) { ns = stk[stkpos]; transsym = transchar[ns]; if ( transsym == SYM_EPSILON ) { tsp = trans1[ns] + MARKER_DIFFERENCE; if ( tsp != NO_TRANSITION ) { if ( ! IS_MARKED(tsp) ) STACK_STATE(tsp) tsp = trans2[ns]; if ( tsp != NO_TRANSITION ) if ( ! IS_MARKED(tsp) ) STACK_STATE(tsp) } } } /* clear out "visit" markers */ for ( stkpos = 1; stkpos <= stkend; ++stkpos ) { if ( IS_MARKED(stk[stkpos]) ) { UNMARK_STATE(stk[stkpos]) } else flexfatal( "consistency check failed in epsclosure()" ); } *ns_addr = numstates; *hv_addr = hashval; *nacc_addr = nacc; return ( t ); } /* increase_max_dfas - increase the maximum number of DFAs */ void increase_max_dfas() { current_max_dfas += MAX_DFAS_INCREMENT; ++num_reallocs; base = reallocate_integer_array( base, current_max_dfas ); def = reallocate_integer_array( def, current_max_dfas ); dfasiz = reallocate_integer_array( dfasiz, current_max_dfas ); accsiz = reallocate_integer_array( accsiz, current_max_dfas ); dhash = reallocate_integer_array( dhash, current_max_dfas ); dss = reallocate_int_ptr_array( dss, current_max_dfas ); dfaacc = reallocate_dfaacc_union( dfaacc, current_max_dfas ); if ( nultrans ) nultrans = reallocate_integer_array( nultrans, current_max_dfas ); } /* ntod - convert an ndfa to a dfa * * synopsis * ntod(); * * creates the dfa corresponding to the ndfa we've constructed. the * dfa starts out in state #1. */ void ntod() { int *accset, ds, nacc, newds; int sym, hashval, numstates, dsize; int num_full_table_rows; /* used only for -f */ int *nset, *dset; int targptr, totaltrans, i, comstate, comfreq, targ; int *epsclosure(), snstods(), symlist[CSIZE + 1]; int num_start_states; int todo_head, todo_next; /* note that the following are indexed by *equivalence classes* * and not by characters. Since equivalence classes are indexed * beginning with 1, even if the scanner accepts NUL's, this * means that (since every character is potentially in its own * equivalence class) these arrays must have room for indices * from 1 to CSIZE, so their size must be CSIZE + 1. */ int duplist[CSIZE + 1], state[CSIZE + 1]; int targfreq[CSIZE + 1], targstate[CSIZE + 1]; /* this is so find_table_space(...) will know where to start looking in * chk/nxt for unused records for space to put in the state */ if ( fullspd ) firstfree = 0; accset = allocate_integer_array( num_rules + 1 ); nset = allocate_integer_array( current_max_dfa_size ); /* the "todo" queue is represented by the head, which is the DFA * state currently being processed, and the "next", which is the * next DFA state number available (not in use). We depend on the * fact that snstods() returns DFA's \in increasing order/, and thus * need only know the bounds of the dfas to be processed. */ todo_head = todo_next = 0; for ( i = 0; i <= csize; ++i ) { duplist[i] = NIL; symlist[i] = false; } for ( i = 0; i <= num_rules; ++i ) accset[i] = NIL; if ( trace ) { dumpnfa( scset[1] ); fputs( "\n\nDFA Dump:\n\n", stderr ); } inittbl(); /* check to see whether we should build a separate table for transitions * on NUL characters. We don't do this for full-speed (-F) scanners, * since for them we don't have a simple state number lying around with * which to index the table. We also don't bother doing it for scanners * unless (1) NUL is in its own equivalence class (indicated by a * positive value of ecgroup[NUL]), (2) NUL's equilvalence class is * the last equivalence class, and (3) the number of equivalence classes * is the same as the number of characters. This latter case comes about * when useecs is false or when its true but every character still * manages to land in its own class (unlikely, but it's cheap to check * for). If all these things are true then the character code needed * to represent NUL's equivalence class for indexing the tables is * going to take one more bit than the number of characters, and therefore * we won't be assured of being able to fit it into a YY_CHAR variable. * This rules out storing the transitions in a compressed table, since * the code for interpreting them uses a YY_CHAR variable (perhaps it * should just use an integer, though; this is worth pondering ... ###). * * Finally, for full tables, we want the number of entries in the * table to be a power of two so the array references go fast (it * will just take a shift to compute the major index). If encoding * NUL's transitions in the table will spoil this, we give it its * own table (note that this will be the case if we're not using * equivalence classes). */ /* note that the test for ecgroup[0] == numecs below accomplishes * both (1) and (2) above */ if ( ! fullspd && ecgroup[0] == numecs ) { /* NUL is alone in its equivalence class, which is the last one */ int use_NUL_table = (numecs == csize); if ( fulltbl && ! use_NUL_table ) { /* we still may want to use the table if numecs is a power of 2 */ int power_of_two; for ( power_of_two = 1; power_of_two <= csize; power_of_two *= 2 ) if ( numecs == power_of_two ) { use_NUL_table = true; break; } } if ( use_NUL_table ) nultrans = allocate_integer_array( current_max_dfas ); /* from now on, nultrans != nil indicates that we're * saving null transitions for later, separate encoding */ } if ( fullspd ) { for ( i = 0; i <= numecs; ++i ) state[i] = 0; place_state( state, 0, 0 ); } else if ( fulltbl ) { if ( nultrans ) /* we won't be including NUL's transitions in the table, * so build it for entries from 0 .. numecs - 1 */ num_full_table_rows = numecs; else /* take into account the fact that we'll be including * the NUL entries in the transition table. Build it * from 0 .. numecs. */ num_full_table_rows = numecs + 1; /* declare it "short" because it's a real long-shot that that * won't be large enough. */ printf( "static short int yy_nxt[][%d] =\n {\n", /* '}' so vi doesn't get too confused */ num_full_table_rows ); /* generate 0 entries for state #0 */ for ( i = 0; i < num_full_table_rows; ++i ) mk2data( 0 ); /* force ',' and dataflush() next call to mk2data */ datapos = NUMDATAITEMS; /* force extra blank line next dataflush() */ dataline = NUMDATALINES; } /* create the first states */ num_start_states = lastsc * 2; for ( i = 1; i <= num_start_states; ++i ) { numstates = 1; /* for each start condition, make one state for the case when * we're at the beginning of the line (the '%' operator) and * one for the case when we're not */ if ( i % 2 == 1 ) nset[numstates] = scset[(i / 2) + 1]; else nset[numstates] = mkbranch( scbol[i / 2], scset[i / 2] ); nset = epsclosure( nset, &numstates, accset, &nacc, &hashval ); if ( snstods( nset, numstates, accset, nacc, hashval, &ds ) ) { numas += nacc; totnst += numstates; ++todo_next; if ( variable_trailing_context_rules && nacc > 0 ) check_trailing_context( nset, numstates, accset, nacc ); } } if ( ! fullspd ) { if ( ! snstods( nset, 0, accset, 0, 0, &end_of_buffer_state ) ) flexfatal( "could not create unique end-of-buffer state" ); ++numas; ++num_start_states; ++todo_next; } while ( todo_head < todo_next ) { targptr = 0; totaltrans = 0; for ( i = 1; i <= numecs; ++i ) state[i] = 0; ds = ++todo_head; dset = dss[ds]; dsize = dfasiz[ds]; if ( trace ) fprintf( stderr, "state # %d:\n", ds ); sympartition( dset, dsize, symlist, duplist ); for ( sym = 1; sym <= numecs; ++sym ) { if ( symlist[sym] ) { symlist[sym] = 0; if ( duplist[sym] == NIL ) { /* symbol has unique out-transitions */ numstates = symfollowset( dset, dsize, sym, nset ); nset = epsclosure( nset, &numstates, accset, &nacc, &hashval ); if ( snstods( nset, numstates, accset, nacc, hashval, &newds ) ) { totnst = totnst + numstates; ++todo_next; numas += nacc; if ( variable_trailing_context_rules && nacc > 0 ) check_trailing_context( nset, numstates, accset, nacc ); } state[sym] = newds; if ( trace ) fprintf( stderr, "\t%d\t%d\n", sym, newds ); targfreq[++targptr] = 1; targstate[targptr] = newds; ++numuniq; } else { /* sym's equivalence class has the same transitions * as duplist(sym)'s equivalence class */ targ = state[duplist[sym]]; state[sym] = targ; if ( trace ) fprintf( stderr, "\t%d\t%d\n", sym, targ ); /* update frequency count for destination state */ i = 0; while ( targstate[++i] != targ ) ; ++targfreq[i]; ++numdup; } ++totaltrans; duplist[sym] = NIL; } } numsnpairs = numsnpairs + totaltrans; if ( caseins && ! useecs ) { register int j; for ( i = 'A', j = 'a'; i <= 'Z'; ++i, ++j ) state[i] = state[j]; } if ( ds > num_start_states ) check_for_backtracking( ds, state ); if ( nultrans ) { nultrans[ds] = state[NUL_ec]; state[NUL_ec] = 0; /* remove transition */ } if ( fulltbl ) { /* supply array's 0-element */ if ( ds == end_of_buffer_state ) mk2data( -end_of_buffer_state ); else mk2data( end_of_buffer_state ); for ( i = 1; i < num_full_table_rows; ++i ) /* jams are marked by negative of state number */ mk2data( state[i] ? state[i] : -ds ); /* force ',' and dataflush() next call to mk2data */ datapos = NUMDATAITEMS; /* force extra blank line next dataflush() */ dataline = NUMDATALINES; } else if ( fullspd ) place_state( state, ds, totaltrans ); else if ( ds == end_of_buffer_state ) /* special case this state to make sure it does what it's * supposed to, i.e., jam on end-of-buffer */ stack1( ds, 0, 0, JAMSTATE ); else /* normal, compressed state */ { /* determine which destination state is the most common, and * how many transitions to it there are */ comfreq = 0; comstate = 0; for ( i = 1; i <= targptr; ++i ) if ( targfreq[i] > comfreq ) { comfreq = targfreq[i]; comstate = targstate[i]; } bldtbl( state, ds, totaltrans, comstate, comfreq ); } } if ( fulltbl ) dataend(); else if ( ! fullspd ) { cmptmps(); /* create compressed template entries */ /* create tables for all the states with only one out-transition */ while ( onesp > 0 ) { mk1tbl( onestate[onesp], onesym[onesp], onenext[onesp], onedef[onesp] ); --onesp; } mkdeftbl(); } } /* snstods - converts a set of ndfa states into a dfa state * * synopsis * int sns[numstates], numstates, newds, accset[num_rules + 1], nacc, hashval; * int snstods(); * is_new_state = snstods( sns, numstates, accset, nacc, hashval, &newds ); * * on return, the dfa state number is in newds. */ int snstods( sns, numstates, accset, nacc, hashval, newds_addr ) int sns[], numstates, accset[], nacc, hashval, *newds_addr; { int didsort = 0; register int i, j; int newds, *oldsns; for ( i = 1; i <= lastdfa; ++i ) if ( hashval == dhash[i] ) { if ( numstates == dfasiz[i] ) { oldsns = dss[i]; if ( ! didsort ) { /* we sort the states in sns so we can compare it to * oldsns quickly. we use bubble because there probably * aren't very many states */ bubble( sns, numstates ); didsort = 1; } for ( j = 1; j <= numstates; ++j ) if ( sns[j] != oldsns[j] ) break; if ( j > numstates ) { ++dfaeql; *newds_addr = i; return ( 0 ); } ++hshcol; } else ++hshsave; } /* make a new dfa */ if ( ++lastdfa >= current_max_dfas ) increase_max_dfas(); newds = lastdfa; dss[newds] = (int *) malloc( (unsigned) ((numstates + 1) * sizeof( int )) ); if ( ! dss[newds] ) flexfatal( "dynamic memory failure in snstods()" ); /* if we haven't already sorted the states in sns, we do so now, so that * future comparisons with it can be made quickly */ if ( ! didsort ) bubble( sns, numstates ); for ( i = 1; i <= numstates; ++i ) dss[newds][i] = sns[i]; dfasiz[newds] = numstates; dhash[newds] = hashval; if ( nacc == 0 ) { if ( reject ) dfaacc[newds].dfaacc_set = (int *) 0; else dfaacc[newds].dfaacc_state = 0; accsiz[newds] = 0; } else if ( reject ) { /* we sort the accepting set in increasing order so the disambiguating * rule that the first rule listed is considered match in the event of * ties will work. We use a bubble sort since the list is probably * quite small. */ bubble( accset, nacc ); dfaacc[newds].dfaacc_set = (int *) malloc( (unsigned) ((nacc + 1) * sizeof( int )) ); if ( ! dfaacc[newds].dfaacc_set ) flexfatal( "dynamic memory failure in snstods()" ); /* save the accepting set for later */ for ( i = 1; i <= nacc; ++i ) dfaacc[newds].dfaacc_set[i] = accset[i]; accsiz[newds] = nacc; } else { /* find lowest numbered rule so the disambiguating rule will work */ j = num_rules + 1; for ( i = 1; i <= nacc; ++i ) if ( accset[i] < j ) j = accset[i]; dfaacc[newds].dfaacc_state = j; } *newds_addr = newds; return ( 1 ); } /* symfollowset - follow the symbol transitions one step * * synopsis * int ds[current_max_dfa_size], dsize, transsym; * int nset[current_max_dfa_size], numstates; * numstates = symfollowset( ds, dsize, transsym, nset ); */ int symfollowset( ds, dsize, transsym, nset ) int ds[], dsize, transsym, nset[]; { int ns, tsp, sym, i, j, lenccl, ch, numstates; int ccllist; numstates = 0; for ( i = 1; i <= dsize; ++i ) { /* for each nfa state ns in the state set of ds */ ns = ds[i]; sym = transchar[ns]; tsp = trans1[ns]; if ( sym < 0 ) { /* it's a character class */ sym = -sym; ccllist = cclmap[sym]; lenccl = ccllen[sym]; if ( cclng[sym] ) { for ( j = 0; j < lenccl; ++j ) { /* loop through negated character class */ ch = ccltbl[ccllist + j]; if ( ch == 0 ) ch = NUL_ec; if ( ch > transsym ) break; /* transsym isn't in negated ccl */ else if ( ch == transsym ) /* next 2 */ goto bottom; } /* didn't find transsym in ccl */ nset[++numstates] = tsp; } else for ( j = 0; j < lenccl; ++j ) { ch = ccltbl[ccllist + j]; if ( ch == 0 ) ch = NUL_ec; if ( ch > transsym ) break; else if ( ch == transsym ) { nset[++numstates] = tsp; break; } } } else if ( sym >= 'A' && sym <= 'Z' && caseins ) flexfatal( "consistency check failed in symfollowset" ); else if ( sym == SYM_EPSILON ) { /* do nothing */ } else if ( abs( ecgroup[sym] ) == transsym ) nset[++numstates] = tsp; bottom: ; } return ( numstates ); } /* sympartition - partition characters with same out-transitions * * synopsis * integer ds[current_max_dfa_size], numstates, duplist[numecs]; * symlist[numecs]; * sympartition( ds, numstates, symlist, duplist ); */ void sympartition( ds, numstates, symlist, duplist ) int ds[], numstates, duplist[]; int symlist[]; { int tch, i, j, k, ns, dupfwd[CSIZE + 1], lenccl, cclp, ich; /* partitioning is done by creating equivalence classes for those * characters which have out-transitions from the given state. Thus * we are really creating equivalence classes of equivalence classes. */ for ( i = 1; i <= numecs; ++i ) { /* initialize equivalence class list */ duplist[i] = i - 1; dupfwd[i] = i + 1; } duplist[1] = NIL; dupfwd[numecs] = NIL; for ( i = 1; i <= numstates; ++i ) { ns = ds[i]; tch = transchar[ns]; if ( tch != SYM_EPSILON ) { if ( tch < -lastccl || tch > csize ) { if ( tch > csize && tch <= CSIZE ) flexerror( "scanner requires -8 flag" ); else flexfatal( "bad transition character detected in sympartition()" ); } if ( tch >= 0 ) { /* character transition */ /* abs() needed for fake %t ec's */ int ec = abs( ecgroup[tch] ); mkechar( ec, dupfwd, duplist ); symlist[ec] = 1; } else { /* character class */ tch = -tch; lenccl = ccllen[tch]; cclp = cclmap[tch]; mkeccl( ccltbl + cclp, lenccl, dupfwd, duplist, numecs, NUL_ec ); if ( cclng[tch] ) { j = 0; for ( k = 0; k < lenccl; ++k ) { ich = ccltbl[cclp + k]; if ( ich == 0 ) ich = NUL_ec; for ( ++j; j < ich; ++j ) symlist[j] = 1; } for ( ++j; j <= numecs; ++j ) symlist[j] = 1; } else for ( k = 0; k < lenccl; ++k ) { ich = ccltbl[cclp + k]; if ( ich == 0 ) ich = NUL_ec; symlist[ich] = 1; } } } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ecs - equivalence class routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/ecs.c,v 2.5 90/06/27 23:48:17 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* ccl2ecl - convert character classes to set of equivalence classes * * synopsis * ccl2ecl(); */ void ccl2ecl() { int i, ich, newlen, cclp, ccls, cclmec; for ( i = 1; i <= lastccl; ++i ) { /* we loop through each character class, and for each character * in the class, add the character's equivalence class to the * new "character" class we are creating. Thus when we are all * done, character classes will really consist of collections * of equivalence classes */ newlen = 0; cclp = cclmap[i]; for ( ccls = 0; ccls < ccllen[i]; ++ccls ) { ich = ccltbl[cclp + ccls]; cclmec = ecgroup[ich]; if ( xlation && cclmec < 0 ) { /* special hack--if we're doing %t tables then it's * possible that no representative of this character's * equivalence class is in the ccl. So waiting till * we see the representative would be disastrous. Instead, * we add this character's equivalence class anyway, if it's * not already present. */ int j; /* this loop makes this whole process n^2; but we don't * really care about %t performance anyway */ for ( j = 0; j < newlen; ++j ) if ( ccltbl[cclp + j] == -cclmec ) break; if ( j >= newlen ) { /* no representative yet, add this one in */ ccltbl[cclp + newlen] = -cclmec; ++newlen; } } else if ( cclmec > 0 ) { ccltbl[cclp + newlen] = cclmec; ++newlen; } } ccllen[i] = newlen; } } /* cre8ecs - associate equivalence class numbers with class members * * synopsis * int cre8ecs(); * number of classes = cre8ecs( fwd, bck, num ); * * fwd is the forward linked-list of equivalence class members. bck * is the backward linked-list, and num is the number of class members. * * Returned is the number of classes. */ int cre8ecs( fwd, bck, num ) int fwd[], bck[], num; { int i, j, numcl; numcl = 0; /* create equivalence class numbers. From now on, abs( bck(x) ) * is the equivalence class number for object x. If bck(x) * is positive, then x is the representative of its equivalence * class. */ for ( i = 1; i <= num; ++i ) if ( bck[i] == NIL ) { bck[i] = ++numcl; for ( j = fwd[i]; j != NIL; j = fwd[j] ) bck[j] = -numcl; } return ( numcl ); } /* ecs_from_xlation - associate equivalence class numbers using %t table * * synopsis * numecs = ecs_from_xlation( ecmap ); * * Upon return, ecmap will map each character code to its equivalence * class. The mapping will be positive if the character is the representative * of its class, negative otherwise. * * Returns the number of equivalence classes used. */ int ecs_from_xlation( ecmap ) int ecmap[]; { int i; int nul_is_alone = false; int did_default_xlation_class = false; if ( xlation[0] != 0 ) { /* if NUL shares its translation with other characters, choose one * of the other characters as the representative for the equivalence * class. This allows a cheap test later to see whether we can * do away with NUL's equivalence class. */ for ( i = 1; i < csize; ++i ) if ( xlation[i] == -xlation[0] ) { xlation[i] = xlation[0]; ecmap[0] = -xlation[0]; break; } if ( i >= csize ) /* didn't find a companion character--remember this fact */ nul_is_alone = true; } for ( i = 1; i < csize; ++i ) if ( xlation[i] == 0 ) { if ( did_default_xlation_class ) ecmap[i] = -num_xlations; else { /* make an equivalence class for those characters not * specified in the %t table */ ++num_xlations; ecmap[i] = num_xlations; did_default_xlation_class = true; } } else ecmap[i] = xlation[i]; if ( nul_is_alone ) /* force NUL's equivalence class to be the last one */ { ++num_xlations; ecmap[0] = num_xlations; /* there's actually a bug here: if someone is fanatic enough to * put every character in its own translation class, then right * now we just promoted NUL's equivalence class to be csize + 1; * we can handle NUL's class number being == csize (by instead * putting it in its own table), but we can't handle some *other* * character having to be put in its own table, too. So in * this case we bail out. */ if ( num_xlations > csize ) flexfatal( "too many %t classes!" ); } return num_xlations; } /* mkeccl - update equivalence classes based on character class xtions * * synopsis * Char ccls[]; * int lenccl, fwd[llsiz], bck[llsiz], llsiz, NUL_mapping; * mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping ); * * where ccls contains the elements of the character class, lenccl is the * number of elements in the ccl, fwd is the forward link-list of equivalent * characters, bck is the backward link-list, and llsiz size of the link-list * * NUL_mapping is the value which NUL (0) should be mapped to. */ void mkeccl( ccls, lenccl, fwd, bck, llsiz, NUL_mapping ) Char ccls[]; int lenccl, fwd[], bck[], llsiz, NUL_mapping; { int cclp, oldec, newec; int cclm, i, j; static unsigned char cclflags[CSIZE]; /* initialized to all '\0' */ /* note that it doesn't matter whether or not the character class is * negated. The same results will be obtained in either case. */ cclp = 0; while ( cclp < lenccl ) { cclm = ccls[cclp]; if ( NUL_mapping && cclm == 0 ) cclm = NUL_mapping; oldec = bck[cclm]; newec = cclm; j = cclp + 1; for ( i = fwd[cclm]; i != NIL && i <= llsiz; i = fwd[i] ) { /* look for the symbol in the character class */ for ( ; j < lenccl; ++j ) { register int ccl_char; if ( NUL_mapping && ccls[j] == 0 ) ccl_char = NUL_mapping; else ccl_char = ccls[j]; if ( ccl_char > i ) break; if ( ccl_char == i && ! cclflags[j] ) { /* we found an old companion of cclm in the ccl. * link it into the new equivalence class and flag it as * having been processed */ bck[i] = newec; fwd[newec] = i; newec = i; cclflags[j] = 1; /* set flag so we don't reprocess */ /* get next equivalence class member */ /* continue 2 */ goto next_pt; } } /* symbol isn't in character class. Put it in the old equivalence * class */ bck[i] = oldec; if ( oldec != NIL ) fwd[oldec] = i; oldec = i; next_pt: ; } if ( bck[cclm] != NIL || oldec != bck[cclm] ) { bck[cclm] = NIL; fwd[oldec] = NIL; } fwd[newec] = NIL; /* find next ccl member to process */ for ( ++cclp; cclflags[cclp] && cclp < lenccl; ++cclp ) { /* reset B��B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"doesn't need processing" flag */ cclflags[cclp] = 0; } } } /* mkechar - create equivalence class for single character * * synopsis * int tch, fwd[], bck[]; * mkechar( tch, fwd, bck ); */ void mkechar( tch, fwd, bck ) int tch, fwd[], bck[]; { /* if until now the character has been a proper subset of * an equivalence class, break it away to create a new ec */ if ( fwd[tch] != NIL ) bck[fwd[tch]] = bck[tch]; if ( bck[tch] != NIL ) fwd[bck[tch]] = fwd[tch]; fwd[tch] = NIL; bck[tch] = NIL; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* A lexical scanner generated by flex */ /* scanner skeleton version: * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ */ #define FLEX_SCANNER #include <stdio.h> /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include <stdlib.h> #include <osfcn.h> /* use prototypes in function declarations */ #define YY_USE_PROTOS /* the "const" storage-class-modifier is valid */ #define YY_USE_CONST #else /* ! __cplusplus */ #ifdef __STDC__ #ifdef __GNUC__ #include <stddef.h> void *malloc( size_t ); void free( void* ); #else #include <stdlib.h> #endif /* __GNUC__ */ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #define YY_USE_CONST #endif #ifndef YY_USE_CONST #define const #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () /* we can't get here if it's an ANSI C compiler, or a C++ compiler, * so it's got to be a K&R compiler, and therefore there's no standard * place from which to include these definitions */ char *malloc(); int free(); int read(); #endif /* amount of stuff to slurp up with each read */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* returned upon end-of-file */ #define YY_END_TOK 0 /* copy whatever the last rule matched to the standard output */ /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ /* this used to be an fputs(), but since the string might contain NUL's, * we now use fwrite() */ #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) /* gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); #define YY_NULL 0 /* no semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #define yyterminate() return ( YY_NULL ) /* report a fatal error */ /* The funky do-while is used to turn this macro definition into * a single C statement (which needs a semi-colon terminator). * This avoids problems with code like: * * if ( something_happens ) * YY_FATAL_ERROR( "oops, the something happened" ); * else * everything_okay(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the YY_FATAL_ERROR() call. */ #define YY_FATAL_ERROR(msg) \ do \ { \ (void) fputs( msg, stderr ); \ (void) putc( '\n', stderr ); \ exit( 1 ); \ } \ while ( 0 ) /* default yywrap function - always treat EOF as an EOF */ #define yywrap() 1 /* enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN */ #define BEGIN yy_start = 1 + 2 * /* action number for EOF rule of a given start state */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* special action meaning "start processing a new file" */ #define YY_NEW_FILE \ do \ { \ yy_init_buffer( yy_current_buffer, yyin ); \ yy_load_buffer_state(); \ } \ while ( 0 ) /* default declaration of generated scanner - a define so the user can * easily add parameters */ #define YY_DECL int yylex YY_PROTO(( void )) /* code executed at the end of each rule */ #define YY_BREAK break; #define YY_END_OF_BUFFER_CHAR 0 #ifndef YY_BUF_SIZE #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ #endif typedef struct yy_buffer_state *YY_BUFFER_STATE; %% section 1 definitions go here /* done after the current pattern has been matched and before the * corresponding action - sets up yytext */ #define YY_DO_BEFORE_ACTION \ yytext = yy_bp; \ %% code to fiddle yytext and yyleng for yymore() goes here yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* return all but the first 'n' matched characters back to the input stream */ #define yyless(n) \ do \ { \ /* undo effects of setting up yytext */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext ) struct yy_buffer_state { FILE *yy_input_file; YY_CHAR *yy_ch_buf; /* input buffer */ YY_CHAR *yy_buf_pos; /* current position in input buffer */ /* size of input buffer in bytes, not including room for EOB characters*/ int yy_buf_size; /* number of characters read into yy_ch_buf, not including EOB characters */ int yy_n_chars; int yy_eof_status; /* whether we've seen an EOF on this buffer */ #define EOF_NOT_SEEN 0 /* "pending" happens when the EOF has been seen but there's still * some text process */ #define EOF_PENDING 1 #define EOF_DONE 2 }; static YY_BUFFER_STATE yy_current_buffer; /* we provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state" */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed */ static YY_CHAR yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif #ifndef YY_USER_INIT #define YY_USER_INIT #endif extern YY_CHAR *yytext; extern int yyleng; extern FILE *yyin, *yyout; YY_CHAR *yytext; int yyleng; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; %% data tables for the DFA go here /* these variables are all declared out here so that section 3 code can * manipulate them */ /* points to current character in buffer */ static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); #define yy_new_buffer yy_create_buffer #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif YY_DECL { register yy_state_type yy_current_state; register YY_CHAR *yy_cp, *yy_bp; register int yy_act; %% user's declarations go here if ( yy_init ) { YY_USER_INIT; if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( yy_current_buffer ) yy_init_buffer( yy_current_buffer, yyin ); else yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); yy_init = 0; } while ( 1 ) /* loops until end-of-file is reached */ { %% yymore()-related code goes here yy_cp = yy_c_buf_p; /* support of yytext */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; %% code to set up and find next match goes here yy_find_action: %% code to find the action number goes here YY_DO_BEFORE_ACTION; YY_USER_ACTION; do_action: /* this label is used only to access EOF actions */ %% debB��B��B��B��B��B��B��B��B��B��B��B��B��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ug code goes here switch ( yy_act ) { %% actions go here case YY_END_OF_BUFFER: { /* amount of text matched not including the EOB char */ int yy_amount_of_matched_text = yy_cp - yytext - 1; /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; /* note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the end- * of-buffer state). Contrast this with the test in yyinput(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ { yy_state_type yy_next_state; yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* okay, we're now positioned to make the * NUL transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we * don't want to build jamming into it because * then it will run more slowly) */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext + YY_MORE_ADJ; if ( yy_next_state ) { /* consume the NUL */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { %% code to do backtracking for compressed tables and set up yy_cp goes here goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* note: because we've taken care in * yy_get_next_buffer() to have set up yytext, * we can now set up yy_c_buf_p so that if some * total hoser (like flex itself) wants * to call the scanner after we return the * YY_NULL, it'll still work - another YY_NULL * will get returned. */ yy_c_buf_p = yytext + YY_MORE_ADJ; yy_act = YY_STATE_EOF((yy_start - 1) / 2); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_find_action; } break; } default: #ifdef FLEX_DEBUG printf( "action # %d\n", yy_act ); #endif YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } } } /* yy_get_next_buffer - try to read in a new buffer * * synopsis * int yy_get_next_buffer(); * * returns a code representing an action * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); /* try to read more data */ /* first move last chars to start of buffer */ number_to_move = yy_c_buf_p - yytext; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; else if ( num_to_read <= 0 ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); /* read in more data */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); } if ( yy_n_chars == 0 ) { if ( number_to_move == 1 ) { ret_val = EOB_ACT_END_OF_FILE; yy_current_buffer->yy_eof_status = EOF_DONE; } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_eof_status = EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; /* yytext begins at the second character in yy_ch_buf; the first * character is the one which preceded it before reading in the latest * buffer; it needs to be kept around in case it's a newline, so * yy_get_previous_state() will have with '^' rules active */ yytext = &yy_current_buffer->yy_ch_buf[1]; return ( ret_val ); } /* yy_get_previous_state - get the state just before the EOB char was reached * * synopsis * yy_state_type yy_get_previous_state(); */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register YY_CHAR *yy_cp; %% code to get the start state into yy_current_state goes here for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { %% code to find the next state goes here } return ( yy_current_state ); } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) register yy_state_type yy_current_state; #endif { register int yy_is_jam; %% code to find the next state, and perhaps do backtracking, goes here return ( yy_is_jam ? 0 : yy_current_state ); } #ifdef YY_USE_PROTOS static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) #else static void yyunput( c, yy_bp ) YY_CHAR c; register YY_CHAR *yy_bp; #endif { register YY_CHAR *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ register YY_CHAR *dest = &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; register YY_CHAR *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += dest - source; yy_bp += dest - source; yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) yy_cp[-2] = '\n'; *--yy_cp = c; /* note: the formal parameter *must* be called "yy_bp" for this * macro to now work correctly */ YY_DO_BEFORE_ACTION; /* set up yytext again */ } #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; YY_CHAR *yy_cp = yy_c_buf_p; *yy_cp = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext + YY_MORE_ADJ; return ( EOF ); } YY_NEW_FILE; #ifdef __cplusplus return ( yyinput() ); #else return ( input() ); #endif } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *yy_c_buf_p; yy_hold_char = *++yy_c_buf_p; return ( c ); } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* flush out information for old buffer */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* we don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); yy_init_buffer( b, file ); return ( b ); } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; free( (char *) b->yy_ch_buf ); free( (char *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { b->yy_input_file = file; /* we put in the '\n' and start reading from [1] so that an * initial match-at-newline will be true. */ b->yy_ch_buf[0] = '\n'; b->yy_n_chars = 1; /* we always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[1]; b->yy_eof_status = EOF_NOT_SEEN; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* flexdef - definitions file for flex */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* @(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/flexdef.h,v 2.10 90/08/03 14:09:52 vern Exp $ (LBL) */ #ifndef FILE #include <stdio.h> #endif /* always be prepared to generate an 8-bit scanner */ #define FLEX_8_BIT_CHARS #ifdef FLEX_8_BIT_CHARS #define CSIZE 256 #define Char unsigned char #else #define Char char #define CSIZE 128 #endif /* size of input alphabet - should be size of ASCII set */ #ifndef DEFAULT_CSIZE #define DEFAULT_CSIZE 128 #endif #ifndef PROTO #ifdef __STDC__ #define PROTO(proto) proto #else #define PROTO(proto) () #endif #endif #ifdef USG #define SYS_V #endif #ifdef SYS_V #include <string.h> #else #include <strings.h> #ifdef lint char *sprintf(); /* keep lint happy */ #endif #ifdef SCO_UNIX void *memset(); #else char *memset(); #endif #endif #ifdef AMIGA #define bzero(s, n) setmem((char *)(s), n, '\0') #ifndef abs #define abs(x) ((x) < 0 ? -(x) : (x)) #endif #else #define bzero(s, n) (void) memset((char *)(s), '\0', n) #endif #ifdef VMS #define unlink delete #define SHORT_FILE_NAMES #endif #ifdef __STDC__ #ifdef __GNUC__ #include <stddef.h> void *malloc( size_t ); void free( void* ); #else #include <stdlib.h> #endif #else /* ! __STDC__ */ char *malloc(), *realloc(); #endif /* maximum line length we'll have to deal with */ #define MAXLINE BUFSIZ /* maximum size of file name */ #define FILENAMESIZE 1024 #ifndef min #define min(x,y) ((x) < (y) ? (x) : (y)) #endif #ifndef max #define max(x,y) ((x) > (y) ? (x) : (y)) #endif #ifdef MS_DOS #ifndef abs #define abs(x) ((x) < 0 ? -(x) : (x)) #endif #define SHORT_FILE_NAMES #endif #define true 1 #define false 0 #ifndef DEFAULT_SKELETON_FILE #define DEFAULT_SKELETON_FILE "flex.skel" #endif /* special chk[] values marking the slots taking by end-of-buffer and action * numbers */ #define EOB_POSITION -1 #define ACTION_POSITION -2 /* number of data items per line for -f output */ #define NUMDATAITEMS 10 /* number of lines of data in -f output before inserting a blank line for * readability. */ #define NUMDATALINES 10 /* transition_struct_out() definitions */ #define TRANS_STRUCT_PRINT_LENGTH 15 /* returns true if an nfa state has an epsilon out-transition slot * that can be used. This definition is currently not used. */ #define FREE_EPSILON(state) \ (transchar[state] == SYM_EPSILON && \ trans2[state] == NO_TRANSITION && \ finalst[state] != state) /* returns true if an nfa state has an epsilon out-transition character * and both slots are free */ #define SUPER_FREE_EPSILON(state) \ (transchar[state] == SYM_EPSILON && \ trans1[state] == NO_TRANSITION) \ /* maximum number of NFA states that can comprise a DFA state. It's real * big because if there's a lot of rules, the initial state will have a * huge epsilon closure. */ #define INITIAL_MAX_DFA_SIZE 750 #define MAX_DFA_SIZE_INCREMENT 750 /* a note on the following masks. They are used to mark accepting numbers * as being special. As such, they implicitly limit the number of accepting * numbers (i.e., rules) because if there are too many rules the rule numbers * will overload the mask bits. Fortunately, this limit is \large/ (0x2000 == * 8192) so unlikely to actually cause any problems. A check is made in * new_rule() to ensure that this limit is not reached. */ /* mask to mark a trailing context accepting number */ #define YY_TRAILING_MASK 0x2000 /* mask to mark the accepting number of the "head" of a trailing context rule */ #define YY_TRAILING_HEAD_MASK 0x4000 /* maximum number of rules, as outlined in the above note */ #define MAX_RULE (YY_TRAILING_MASK - 1) /* NIL must be 0. If not, its special meaning when making equivalence classes * (it marks the representative of a given e.c.) will be unidentifiable */ #define NIL 0 #define JAM -1 /* to mark a missing DFA transition */ #define NO_TRANSITION NIL #define UNIQUE -1 /* marks a symbol as an e.c. representative */ #define INFINITY -1 /* for x{5,} constructions */ #define INITIAL_MAX_CCLS 100 /* max number of unique character classes */ #define MAX_CCLS_INCREMENT 100 /* size of table holding members of character classes */ #define INITIAL_MAX_CCL_TBL_SIZE 500 #define MAX_CCL_TBL_SIZE_INCREMENT 250 #define INITIAL_MAX_RULES 100 /* default maximum number of rules */ #define MAX_RULES_INCREMENT 100 #define INITIAL_MNS 2000 /* default maximum number of nfa states */ #define MNS_INCREMENT 1000 /* amount to bump above by if it's not enough */ #define INITIAL_MAX_DFAS 1000 /* default maximum number of dfa states */ #define MAX_DFAS_INCREMENT 1000 #define JAMSTATE -32766 /* marks a reference to the state that always jams */ /* enough so that if it's subtracted from an NFA state number, the result * is guaranteed to be negative */ #define MARKER_DIFFERENCE 32000 #define MAXIMUM_MNS 31999 /* maximum number of nxt/chk pairs for non-templates */ #define INITIAL_MAX_XPAIRS 2000 #define MAX_XPAIRS_INCREMENT 2000 /* maximum number of nxt/chk pairs needed for templates */ #define INITIAL_MAX_TEMPLATE_XPAIRS 2500 #define MAX_TEMPLATE_XPAIRS_INCREMENT 2500 #define SYM_EPSILON (CSIZE + 1) /* to mark transitions on the symbol epsilon */ #define INITIAL_MAX_SCS 40 /* maximum number of start conditions */ #define MAX_SCS_INCREMENT 40 /* amount to bump by if it's not enough */ #define ONE_STACK_SIZE 500 /* stack of states with only one out-transition */ #define SAME_TRANS -1 /* transition is the same as "default" entry for state */ /* the following percentages are used to tune table compression: * the percentage the number of out-transitions a state must be of the * number of equivalence classes in order to be considered for table * compaction by using protos */ #define PROTO_SIZE_PERCENTAGE 15 /* the percentage the number of homogeneous out-transitions of a state * must be of the number of total out-transitions of the state in order * that the state's transition table is first compared with a potential * template of the most common out-transition instead of with the first * proto in the proto queue */ #define CHECK_COM_PERCENTAGE 50 /* the percentage the number of differences between a state's transition * table and the proto it was first compared with must be of the total * number of out-transitions of the state in order to keep the first * proto as a good match and not search any further */ #define FIRST_MATCH_DIFF_PERCENTAGE 10 /* the percentage the number of differences between a state's transition * table and the most similar proto must be of the state's total number * of out-transitions to use the proto as an acceptable close match */ #define ACCEPTABLE_DIFF_PERCENTAGE 50 /* the percentage the number of homogeneous out-transitions of a state * must be of the number of total out-transitions of the state in order * to consider making a template from the state */ #define TEMPLATE_SAME_PERCENC��C��C��C�� C�� C�� C�� C�� C��C��C��C��C��C��C��C��C��C��C��C��C��C��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TAGE 60 /* the percentage the number of differences between a state's transition * table and the most similar proto must be of the state's total number * of out-transitions to create a new proto from the state */ #define NEW_PROTO_DIFF_PERCENTAGE 20 /* the percentage the total number of out-transitions of a state must be * of the number of equivalence classes in order to consider trying to * fit the transition table into "holes" inside the nxt/chk table. */ #define INTERIOR_FIT_PERCENTAGE 15 /* size of region set aside to cache the complete transition table of * protos on the proto queue to enable quick comparisons */ #define PROT_SAVE_SIZE 2000 #define MSP 50 /* maximum number of saved protos (protos on the proto queue) */ /* maximum number of out-transitions a state can have that we'll rummage * around through the interior of the internal fast table looking for a * spot for it */ #define MAX_XTIONS_FULL_INTERIOR_FIT 4 /* maximum number of rules which will be reported as being associated * with a DFA state */ #define MAX_ASSOC_RULES 100 /* number that, if used to subscript an array, has a good chance of producing * an error; should be small enough to fit into a short */ #define BAD_SUBSCRIPT -32767 /* absolute value of largest number that can be stored in a short, with a * bit of slop thrown in for general paranoia. */ #define MAX_SHORT 32766 /* Declarations for global variables. */ /* variables for symbol tables: * sctbl - start-condition symbol table * ndtbl - name-definition symbol table * ccltab - character class text symbol table */ struct hash_entry { struct hash_entry *prev, *next; char *name; char *str_val; int int_val; } ; typedef struct hash_entry *hash_table[]; #define NAME_TABLE_HASH_SIZE 101 #define START_COND_HASH_SIZE 101 #define CCL_HASH_SIZE 101 extern struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; extern struct hash_entry *sctbl[START_COND_HASH_SIZE]; extern struct hash_entry *ccltab[CCL_HASH_SIZE]; /* variables for flags: * printstats - if true (-v), dump statistics * syntaxerror - true if a syntax error has been found * eofseen - true if we've seen an eof in the input file * ddebug - if true (-d), make a "debug" scanner * trace - if true (-T), trace processing * spprdflt - if true (-s), suppress the default rule * interactive - if true (-I), generate an interactive scanner * caseins - if true (-i), generate a case-insensitive scanner * useecs - if true (-Ce flag), use equivalence classes * fulltbl - if true (-Cf flag), don't compress the DFA state table * usemecs - if true (-Cm flag), use meta-equivalence classes * fullspd - if true (-F flag), use Jacobson method of table representation * gen_line_dirs - if true (i.e., no -L flag), generate #line directives * performance_report - if true (i.e., -p flag), generate a report relating * to scanner performance * backtrack_report - if true (i.e., -b flag), generate "lex.backtrack" file * listing backtracking states * csize - size of character set for the scanner we're generating; * 128 for 7-bit chars and 256 for 8-bit * yymore_used - if true, yymore() is used in input rules * reject - if true, generate backtracking tables for REJECT macro * real_reject - if true, scanner really uses REJECT (as opposed to just * having "reject" set for variable trailing context) * continued_action - true if this rule's action is to "fall through" to * the next rule's action (i.e., the '|' action) * yymore_really_used - has a REALLY_xxx value indicating whether a * %used or %notused was used with yymore() * reject_really_used - same for REJECT */ extern int printstats, syntaxerror, eofseen, ddebug, trace, spprdflt; extern int interactive, caseins, useecs, fulltbl, usemecs; extern int fullspd, gen_line_dirs, performance_report, backtrack_report, csize; extern int yymore_used, reject, real_reject, continued_action; #define REALLY_NOT_DETERMINED 0 #define REALLY_USED 1 #define REALLY_NOT_USED 2 extern int yymore_really_used, reject_really_used; /* variables used in the flex input routines: * datapos - characters on current output line * dataline - number of contiguous lines of data in current data * statement. Used to generate readable -f output * linenum - current input line number * skelfile - the skeleton file * yyin - input file * temp_action_file - temporary file to hold actions * backtrack_file - file to summarize backtracking states to * infilename - name of input file * action_file_name - name of the temporary file * input_files - array holding names of input files * num_input_files - size of input_files array * program_name - name with which program was invoked */ extern int datapos, dataline, linenum; extern FILE *skelfile, *yyin, *temp_action_file, *backtrack_file; extern char *infilename; extern char *action_file_name; extern char **input_files; extern int num_input_files; extern char *program_name; /* variables for stack of states having only one out-transition: * onestate - state number * onesym - transition symbol * onenext - target state * onedef - default base entry * onesp - stack pointer */ extern int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; extern int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; /* variables for nfa machine data: * current_mns - current maximum on number of NFA states * num_rules - number of the last accepting state; also is number of * rules created so far * current_max_rules - current maximum number of rules * lastnfa - last nfa state number created * firstst - physically the first state of a fragment * lastst - last physical state of fragment * finalst - last logical state of fragment * transchar - transition character * trans1 - transition state * trans2 - 2nd transition state for epsilons * accptnum - accepting number * assoc_rule - rule associated with this NFA state (or 0 if none) * state_type - a STATE_xxx type identifying whether the state is part * of a normal rule, the leading state in a trailing context * rule (i.e., the state which marks the transition from * recognizing the text-to-be-matched to the beginning of * the trailing context), or a subsequent state in a trailing * context rule * rule_type - a RULE_xxx type identifying whether this a a ho-hum * normal rule or one which has variable head & trailing * context * rule_linenum - line number associated with rule */ extern int current_mns, num_rules, current_max_rules, lastnfa; extern int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; extern int *accptnum, *assoc_rule, *state_type, *rule_type, *rule_linenum; /* different types of states; values are useful as masks, as well, for * routines like check_trailing_context() */ #define STATE_NORMAL 0x1 #define STATE_TRAILING_CONTEXT 0x2 /* global holding current type of state we're making */ extern int current_state_type; /* different types of rules */ #define RULE_NORMAL 0 #define RULE_VARIABLE 1 /* true if the input rules include a rule with both variable-length head * and trailing context, false otherwise */ extern int variable_trailing_context_rules; /* variables for protos: * numtemps - number of templates created * numprots - number of protos created * protprev - backlink to a more-recently used proto * protnext - forward link to a less-recently used proto * prottbl - base/def table entry for proto * protcomst - common state of proto * firstprot - number of the most recently used proto * lastprot - number of the least recently used proto * protsave contains the entire state array for protos */ extern int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; extern int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; /* variables for managing equivalence classes: * numecs - number of equivalence classes * nextecm - forward link of Equivalence Class members * ecgroup - class number or backward link of EC members * nummecs - number of meta-equivalence classes (used to compress * templates) * tecfwd - forward link of meta-equivalence classes members * tecbck - backward link of MEC's * xlation - maps character codes to their translations, or nil if no %t table * num_xlations - number of different xlation values */ /* reserve enough room in the equivalence class arrays so that we * can use the CSIZE'th element to hold equivalence class information * for the NUL character. Later we'll move this information into * the 0th element. */ extern int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs; /* meta-equivalence classes are indexed starting at 1, so it's possible * that they will require positions from 1 .. CSIZE, i.e., CSIZE + 1 * slots total (since the arrays are 0-based). nextecm[] and ecgroup[] * don't require the extra position since they're indexed from 1 .. CSIZE - 1. */ extern int tecfwd[CSIZE + 1], tecbck[CSIZE + 1]; extern int *xlation; extern int num_xlations; /* variables for start conditions: * lastsc - last start condition created * current_max_scs - current limit on number of start conditions * scset - set of rules active in start condition * scbol - set of rules active only at the beginning of line in a s.c. * scxclu - true if start condition is exclusive * sceof - true if start condition has EOF rule * scname - start condition name * actvsc - stack of active start conditions for the current rule */ extern int lastsc, current_max_scs, *scset, *scbol, *scxclu, *sceof, *actvsc; extern char **scname; /* variables for dfa machine data: * current_max_dfa_size - current maximum number of NFA states in DFA * current_max_xpairs - current maximum number of non-template xtion pairs * current_max_template_xpairs - current maximum number of template pairs * current_max_dfas - current maximum number DFA states * lastdfa - last dfa state number created * nxt - state to enter upon reading character * chk - check value to see if "nxt" applies * tnxt - internal nxt table for templates * base - offset into "nxt" for given state * def - where to go if "chk" disallows "nxt" entry * nultrans - NUL transition for each state * NUL_ec - equivalence class of the NUL character * tblend - last "nxt/chk" table entry being used * firstfree - first empty entry in "nxt/chk" table * dss - nfa state set for each dfa * dfasiz - size of nfa state set for each dfa * dfaacc - accepting set for each dfa state (or accepting number, if * -r is not given) * accsiz - size of accepting set for each dfa state * dhash - dfa state hash value * numas - number of DFA accepting states created; note that this * is not necessarily the same value as num_rules, which is the analogous * value for the NFA * numsnpairs - number of state/nextstate transition pairs * jambase - position in base/def where the default jam table starts * jamstate - state number corresponding to "jam" state * end_of_buffer_state - end-of-buffer dfa state number */ extern int current_max_dfa_size, current_max_xpairs; extern int current_max_template_xpairs, current_max_dfas; extern int lastdfa, lasttemp, *nxt, *chk, *tnxt; extern int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; extern union dfaacc_union { int *dfaacc_set; int dfaacc_state; } *dfaacc; extern int *accsiz, *dhash, numas; extern int numsnpairs, jambase, jamstate; extern int end_of_buffer_state; /* variables for ccl information: * lastccl - ccl index of the last created ccl * current_maxccls - current limit on the maximum number of unique ccl's * cclmap - maps a ccl index to its set pointer * ccllen - gives the length of a ccl * cclng - true for a given ccl if the ccl is negated * cclreuse - counts how many times a ccl is re-used * current_max_ccl_tbl_size - current limit on number of characters needed * to represent the unique ccl's * ccltbl - holds the characters in each ccl - indexed by cclmap */ extern int lastccl, current_maxccls, *cclmap, *ccllen, *cclng, cclreuse; extern int current_max_ccl_tbl_size; extern Char *ccltbl; /* variables for miscellaneous information: * starttime - real-time when we started * endtime - real-time when we ended * nmstr - last NAME scanned by the scanner * sectnum - section number currently being parsed * nummt - number of empty nxt/chk table entries * hshcol - number of hash collisions detected by snstods * dfaeql - number of times a newly created dfa was equal to an old one * numeps - number of epsilon NFA states created * eps2 - number of epsilon states which have 2 out-transitions * num_reallocs - number of times it was necessary to realloc() a group * of arrays * tmpuses - number of DFA states that chain to templates * totnst - total number of NFA states used to make DFA states * peakpairs - peak number of transition pairs we had to store internally * numuniq - number of unique transitions * numdup - number of duplicate transitions * hshsave - number of hash collisions saved by checking number of states * num_backtracking - number of DFA states requiring back-tracking * bol_needed - whether scanner needs beginning-of-line recognition */ extern char *starttime, *endtime, nmstr[MAXLINE]; extern int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; extern int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; extern int num_backtracking, bol_needed; void *allocate_array(), *reallocate_array(); #define allocate_integer_array(size) \ (int *) allocate_array( size, sizeof( int ) ) #define reallocate_integer_array(array,size) \ (int *) reallocate_array( (void *) array, size, sizeof( int ) ) #define allocate_int_ptr_array(size) \ (int **) allocate_array( size, sizeof( int * ) ) #define allocate_char_ptr_array(size) \ (char **) allocate_array( size, sizeof( char * ) ) #define allocate_dfaacc_union(size) \ (union dfaacc_union *) \ allocate_array( size, sizeof( union dfaacc_union ) ) #define reallocate_int_ptr_array(array,size) \ (int **) reallocate_array( (void *) array, size, sizeof( int * ) ) #define reallocate_char_ptr_array(array,size) \ (char **) reallocate_array( (void *) array, size, sizeof( char * ) ) #define reallocate_dfaacc_union(array, size) \ (union dfaacc_union *) \ reallocate_array( (void *) array, size, sizeof( union dfaacc_union ) ) #define allocate_character_array(size) \ (Char *) allocate_array( size, sizeof( Char ) ) #define reallocate_character_array(array,size) \ (Char *) reallocate_array( (void *) array, size, sizeof( Char ) ) /* used to communicate between scanner and parser. The type should really * be YYSTYPE, but we can't easily get our hands on it. */ extern int yylval; /* external functions that are cross-referenced among the flex source files */ /* from file ccl.c */ extern void ccladd PROTO((int, int)); /* Add a single character to a ccl */ extern int cclinit PROTO(()); /* make an empty ccl */ extern void cclnegate PROTO((int)); /* negate a ccl */ /* list the members of a set of characters in CCL form */ extern void list_character_set PROTO((FILE*, int[])); /* from file dfa.c */ /* increase the maximum number of dfas */ extern void increase_max_dfas PROTO(()); extern void ntod PROTO(()); /* convert a ndfa to a dfa */ /* from file ecs.c */ /* convert character classes to set of equivalence classes */ extern void ccl2ecl PROTO(()); /* associate equivalence class numbers with class members */ extern int cre8ecs PROTO((int[], int[], int)); /* associate equivalence class numbers using %t table */ extern int ecs_from_xlation PROTO((int[])); /* update equivalence classes based on character class transitions */ extern void mkeccl PROTO((Char[], int, int[], int[], int, int)); /* create equivalence class for single character */ extern void mkechar PROTO((int, int[], int[])); /* from file gen.c */ extern void make_tables PROTO(()); /* generate transition tables */ /* from file main.c */ extern void flexend PROTO((int)); /* from file misc.c */ /* write out the actions from the temporary file to lex.yy.c */ extern void action_out PROTO(()); /* true if a string is all lower case */ extern int all_lower PROTO((register Char *)); /* true if a string is all upper case */ extern int all_upper PROTO((register Char *)); /* bubble sort an integer array */ extern void bubble PROTO((int [], int)); /* shell sort a character array */ extern void cshell PROTO((Char [], int, int)); extern void dataend PROTO(()); /* finish up a block of data declarations */ /* report an error message and terminate */ extern void flexerror PROTO((char[])); /* report a fatal error message and terminate */ extern void flexfatal PROTO((char[])); /* report an error message formatted with one integer argument */ extern void lerrif PROTO((char[], int)); /* report an error message formatted with one string argument */ extern void lerrsf PROTO((char[], char[])); /* spit out a "# line" statement */ extern void line_directive_out PROTO((FILE*)); /* generate a data statment for a two-dimensional array */ extern void mk2data PROTO((int)); extern void mkdata PROTO((int)); /* generate a data statement */ /* return the integer represented by a string of digits */ extern int myctoi PROTO((Char [])); /* write out one section of the skeleton file */ extern void skelout PROTO(()); /* output a yy_trans_info structure */ extern void transition_struct_out PROTO((int, int)); /* from file nfa.c */ /* add an accepting state to a machine */ extern void add_accept PROTO((int, int)); /* make a given number of copies of a singleton machine */ extern int copysingl PROTO((int, int)); /* debugging routine to write out an nfa */ extern void dumpnfa PROTO((int)); /* finish up the processing for a rule */ extern void finish_rule PROTO((int, int, int, int)); /* connect two machines together */ extern int link_machines PROTO((int, int)); /* mark each "beginning" state in a machine as being a "normal" (i.e., * not trailing context associated) state */ extern void mark_beginning_as_normal PROTO((register int)); /* make a machine that branches to two machines */ extern int mkbranch PROTO((int, int)); extern int mkclos PROTO((int)); /* convert a machine into a closure */ extern int mkopt PROTO((int)); /* make a machine optional */ /* make a machine that matches either one of two machines */ extern int mkor PROTO((int, int)); /* convert a machine into a positive closure */ extern int mkposcl PROTO((int)); extern int mkrep PROTO((int, int, int)); /* make a replicated machine */ /* create a state with a transition on a given symbol */ extern int mkstate PROTO((int)); extern void new_rule PROTO(()); /* initialize for a new rule */ /* from file parse.y */ /* write out a message formatted with one string, pinpointing its location */ extern void format_pinpoint_message PROTO((char[], char[])); /* write out a message, pinpointing its location */ extern void pinpoint_message PROTO((char[])); extern void synerr PROTO((char [])); /* report a syntax error */ extern int yyparse PROTO(()); /* the YACC parser */ /* from file scan.l */ extern int flexscan PROTO(()); /* the Flex-generated scanner for flex */ /* open the given file (if NULL, stdin) for scanning */ extern void set_input_file PROTO((char*)); extern int yywrap PROTO(()); /* wrapup a file in the lexical analyzer */ /* from file sym.c */ /* save the text of a character class */ extern void cclinstal PROTO ((Char [], int)); /* lookup the number associated with character class */ extern int ccllookup PROTO((Char [])); extern void ndinstal PROTO((char[], Char[])); /* install a name definition */ extern void scinstal PROTO((char[], int)); /* make a start condition */ /* lookup the number associated with a start condition */ extern int sclookup PROTO((char[])); /* from file tblcmp.c */ /* build table entries for dfa state */ extern void bldtbl PROTO((int[], int, int, int, int)); extern void cmptmps PROTO(()); /* compress template table entries */ extern void inittbl PROTO(()); /* initialize transition tables */ extern void mkdeftbl PROTO(()); /* make the default, "jam" table entries */ /* create table entries for a state (or state fragment) which has * only one out-transition */ extern void mk1tbl PROTO((int, int, int, int)); /* place a state into full speed transition table */ extern void place_state PROTO((int*, int, int)); /* save states with only one out-transition to be processed later */ extern void stack1 PROTO((int, int, int, int)); /* from file yylex.c */ extern int yylex PROTO(()); /* The Unix kernel calls used here */ extern int read PROTO((int, char*, int)); extern int unlink PROTO((char*)); extern int write PROTO((int, char*, int)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* gen - actual generation (writing) of flex scanners */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /home/horse/u0/vern/flex/RCS/gen.c,v 2.12 91/03/28 12:01:38 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* declare functions that have forward references */ void gen_next_state PROTO((int)); void genecs PROTO(()); void indent_put2s PROTO((char [], char [])); void indent_puts PROTO((char [])); static int indent_level = 0; /* each level is 4 spaces */ #define indent_up() (++indent_level) #define indent_down() (--indent_level) #define set_indent(indent_val) indent_level = indent_val /* *everything* is done in terms of arrays starting at 1, so provide * a null entry for the zero element of all C arrays */ static char C_short_decl[] = "static const short int %s[%d] =\n { 0,\n"; static char C_long_decl[] = "static const long int %s[%d] =\n { 0,\n"; static char C_state_decl[] = "static const yy_state_type %s[%d] =\n { 0,\n"; /* indent to the current level */ void do_indent() { register int i = indent_level * 4; while ( i >= 8 ) { putchar( '\t' ); i -= 8; } while ( i > 0 ) { putchar( ' ' ); --i; } } /* generate the code to keep backtracking information */ void gen_backtracking() { if ( reject || num_backtracking == 0 ) return; if ( fullspd ) indent_puts( "if ( yy_current_state[-1].yy_nxt )" ); else indent_puts( "if ( yy_accept[yy_current_state] )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_last_accepting_state = yy_current_state;" ); indent_puts( "yy_last_accepting_cpos = yy_cp;" ); indent_puts( "}" ); indent_down(); } /* generate the code to perform the backtrack */ void gen_bt_action() { if ( reject || num_backtracking == 0 ) return; set_indent( 3 ); indent_puts( "case 0: /* must backtrack */" ); indent_puts( "/* undo the effects of YY_DO_BEFORE_ACTION */" ); indent_puts( "*yy_cp = yy_hold_char;" ); if ( fullspd || fulltbl ) indent_puts( "yy_cp = yy_last_accepting_cpos + 1;" ); else /* backtracking info for compressed tables is taken \after/ * yy_cp has been incremented for the next state */ indent_puts( "yy_cp = yy_last_accepting_cpos;" ); indent_puts( "yy_current_state = yy_last_accepting_state;" ); indent_puts( "goto yy_find_action;" ); putchar( '\n' ); set_indent( 0 ); } /* genctbl - generates full speed compressed transition table * * synopsis * genctbl(); */ void genctbl() { register int i; int end_of_buffer_action = num_rules + 1; /* table of verify for transition and offset to next state */ printf( "static const struct yy_trans_info yy_transition[%d] =\n", tblend + numecs + 1 ); printf( " {\n" ); /* We want the transition to be represented as the offset to the * next state, not the actual state number, which is what it currently is. * The offset is base[nxt[i]] - base[chk[i]]. That's just the * difference between the starting points of the two involved states * (to - from). * * first, though, we need to find some way to put in our end-of-buffer * flags and states. We do this by making a state with absolutely no * transitions. We put it at the end of the table. */ /* at this point, we're guaranteed that there's enough room in nxt[] * and chk[] to hold tblend + numecs entries. We need just two slots. * One for the action and one for the end-of-buffer transition. We * now *assume* that we're guaranteed the only character we'll try to * index this nxt/chk pair with is EOB, i.e., 0, so we don't have to * make sure there's room for jam entries for other characters. */ base[lastdfa + 1] = tblend + 2; nxt[tblend + 1] = end_of_buffer_action; chk[tblend + 1] = numecs + 1; chk[tblend + 2] = 1; /* anything but EOB */ nxt[tblend + 2] = 0; /* so that "make test" won't show arb. differences */ /* make sure every state has a end-of-buffer transition and an action # */ for ( i = 0; i <= lastdfa; ++i ) { register int anum = dfaacc[i].dfaacc_state; chk[base[i]] = EOB_POSITION; chk[base[i] - 1] = ACTION_POSITION; nxt[base[i] - 1] = anum; /* action number */ } for ( i = 0; i <= tblend; ++i ) { if ( chk[i] == EOB_POSITION ) transition_struct_out( 0, base[lastdfa + 1] - i ); else if ( chk[i] == ACTION_POSITION ) transition_struct_out( 0, nxt[i] ); else if ( chk[i] > numecs || chk[i] == 0 ) transition_struct_out( 0, 0 ); /* unused slot */ else /* verify, transition */ transition_struct_out( chk[i], base[nxt[i]] - (i - chk[i]) ); } /* here's the final, end-of-buffer state */ transition_struct_out( chk[tblend + 1], nxt[tblend + 1] ); transition_struct_out( chk[tblend + 2], nxt[tblend + 2] ); printf( " };\n" ); printf( "\n" ); /* table of pointers to start states */ printf( "static const struct yy_trans_info *yy_start_state_list[%d] =\n", lastsc * 2 + 1 ); printf( " {\n" ); for ( i = 0; i <= lastsc * 2; ++i ) printf( " &yy_transition[%d],\n", base[i] ); dataend(); if ( useecs ) genecs(); } /* generate equivalence-class tables */ void genecs() { register int i, j; static char C_char_decl[] = "static const %s %s[%d] =\n { 0,\n"; int numrows; Char clower(); if ( numecs < csize ) printf( C_char_decl, "YY_CHAR", "yy_ec", csize ); else printf( C_char_decl, "short", "yy_ec", csize ); for ( i = 1; i < csize; ++i ) { if ( caseins && (i >= 'A') && (i <= 'Z') ) ecgroup[i] = ecgroup[clower( i )]; ecgroup[i] = abs( ecgroup[i] ); mkdata( ecgroup[i] ); } dataend(); if ( trace ) { char *readable_form(); fputs( "\n\nEquivalence Classes:\n\n", stderr ); numrows = csize / 8; for ( j = 0; j < numrows; ++j ) { for ( i = j; i < csize; i = i + numrows ) { fprintf( stderr, "%4s = %-2d", readable_form( i ), ecgroup[i] ); putc( ' ', stderr ); } putc( '\n', stderr ); } } } /* generate the code to find the action number */ void gen_find_action() { if ( fullspd ) indent_puts( "yy_act = yy_current_state[-1].yy_nxt;" ); else if ( fulltbl ) indent_puts( "yy_act = yy_accept[yy_current_state];" ); else if ( reject ) { indent_puts( "yy_current_state = *--yy_state_ptr;" ); indent_puts( "yy_lp = yy_accept[yy_current_state];" ); puts( "find_rule: /* we branch to this label when backtracking */" ); indent_puts( "for ( ; ; ) /* until we find what rule we matched */" ); indent_up(); indent_puts( "{" ); indent_puts( "if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_act = yy_acclist[yy_lp];" ); if ( variable_trailing_context_rules ) { indent_puts("C��$C��%C��&C��'C��(C��)C��*C��+C��,C��-C��.C��/C��0C��1C��2C��3C��4C��5C��6C��7C��8C��9C��:C������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ "if ( yy_act & YY_TRAILING_HEAD_MASK ||" ); indent_puts( " yy_looking_for_trail_begin )" ); indent_up(); indent_puts( "{" ); indent_puts( "if ( yy_act == yy_looking_for_trail_begin )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_looking_for_trail_begin = 0;" ); indent_puts( "yy_act &= ~YY_TRAILING_HEAD_MASK;" ); indent_puts( "break;" ); indent_puts( "}" ); indent_down(); indent_puts( "}" ); indent_down(); indent_puts( "else if ( yy_act & YY_TRAILING_MASK )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_looking_for_trail_begin = yy_act & ~YY_TRAILING_MASK;" ); indent_puts( "yy_looking_for_trail_begin |= YY_TRAILING_HEAD_MASK;" ); if ( real_reject ) { /* remember matched text in case we back up due to REJECT */ indent_puts( "yy_full_match = yy_cp;" ); indent_puts( "yy_full_state = yy_state_ptr;" ); indent_puts( "yy_full_lp = yy_lp;" ); } indent_puts( "}" ); indent_down(); indent_puts( "else" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_full_match = yy_cp;" ); indent_puts( "yy_full_state = yy_state_ptr;" ); indent_puts( "yy_full_lp = yy_lp;" ); indent_puts( "break;" ); indent_puts( "}" ); indent_down(); indent_puts( "++yy_lp;" ); indent_puts( "goto find_rule;" ); } else { /* remember matched text in case we back up due to trailing context * plus REJECT */ indent_up(); indent_puts( "{" ); indent_puts( "yy_full_match = yy_cp;" ); indent_puts( "break;" ); indent_puts( "}" ); indent_down(); } indent_puts( "}" ); indent_down(); indent_puts( "--yy_cp;" ); /* we could consolidate the following two lines with those at * the beginning, but at the cost of complaints that we're * branching inside a loop */ indent_puts( "yy_current_state = *--yy_state_ptr;" ); indent_puts( "yy_lp = yy_accept[yy_current_state];" ); indent_puts( "}" ); indent_down(); } else /* compressed */ indent_puts( "yy_act = yy_accept[yy_current_state];" ); } /* genftbl - generates full transition table * * synopsis * genftbl(); */ void genftbl() { register int i; int end_of_buffer_action = num_rules + 1; printf( C_short_decl, "yy_accept", lastdfa + 1 ); dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; for ( i = 1; i <= lastdfa; ++i ) { register int anum = dfaacc[i].dfaacc_state; mkdata( anum ); if ( trace && anum ) fprintf( stderr, "state # %d accepts: [%d]\n", i, anum ); } dataend(); if ( useecs ) genecs(); /* don't have to dump the actual full table entries - they were created * on-the-fly */ } /* generate the code to find the next compressed-table state */ void gen_next_compressed_state( char_map ) char *char_map; { indent_put2s( "register YY_CHAR yy_c = %s;", char_map ); /* save the backtracking info \before/ computing the next state * because we always compute one more state than needed - we * always proceed until we reach a jam state */ gen_backtracking(); indent_puts( "while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_current_state = yy_def[yy_current_state];" ); if ( usemecs ) { /* we've arrange it so that templates are never chained * to one another. This means we can afford make a * very simple test to see if we need to convert to * yy_c's meta-equivalence class without worrying * about erroneously looking up the meta-equivalence * class twice */ do_indent(); /* lastdfa + 2 is the beginning of the templates */ printf( "if ( yy_current_state >= %d )\n", lastdfa + 2 ); indent_up(); indent_puts( "yy_c = yy_meta[yy_c];" ); indent_down(); } indent_puts( "}" ); indent_down(); indent_puts( "yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];" ); } /* generate the code to find the next match */ void gen_next_match() { /* NOTE - changes in here should be reflected in gen_next_state() and * gen_NUL_trans() */ char *char_map = useecs ? "yy_ec[*yy_cp]" : "*yy_cp"; char *char_map_2 = useecs ? "yy_ec[*++yy_cp]" : "*++yy_cp"; if ( fulltbl ) { indent_put2s( "while ( (yy_current_state = yy_nxt[yy_current_state][%s]) > 0 )", char_map ); indent_up(); if ( num_backtracking > 0 ) { indent_puts( "{" ); gen_backtracking(); putchar( '\n' ); } indent_puts( "++yy_cp;" ); if ( num_backtracking > 0 ) indent_puts( "}" ); indent_down(); putchar( '\n' ); indent_puts( "yy_current_state = -yy_current_state;" ); } else if ( fullspd ) { indent_puts( "{" ); indent_puts( "register const struct yy_trans_info *yy_trans_info;\n" ); indent_puts( "register YY_CHAR yy_c;\n" ); indent_put2s( "for ( yy_c = %s;", char_map ); indent_puts( " (yy_trans_info = &yy_current_state[yy_c])->yy_verify == yy_c;" ); indent_put2s( " yy_c = %s )", char_map_2 ); indent_up(); if ( num_backtracking > 0 ) indent_puts( "{" ); indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); if ( num_backtracking > 0 ) { putchar( '\n' ); gen_backtracking(); indent_puts( "}" ); } indent_down(); indent_puts( "}" ); } else { /* compressed */ indent_puts( "do" ); indent_up(); indent_puts( "{" ); gen_next_state( false ); indent_puts( "++yy_cp;" ); indent_puts( "}" ); indent_down(); do_indent(); if ( interactive ) printf( "while ( yy_base[yy_current_state] != %d );\n", jambase ); else printf( "while ( yy_current_state != %d );\n", jamstate ); if ( ! reject && ! interactive ) { /* do the guaranteed-needed backtrack to figure out the match */ indent_puts( "yy_cp = yy_last_accepting_cpos;" ); indent_puts( "yy_current_state = yy_last_accepting_state;" ); } } } /* generate the code to find the next state */ void gen_next_state( worry_about_NULs ) int worry_about_NULs; { /* NOTE - changes in here should be reflected in get_next_match() */ char char_map[256]; if ( worry_about_NULs && ! nultrans ) { if ( useecs ) (void) sprintf( char_map, "(*yy_cp ? yy_ec[*yy_cp] : %d)", NUL_ec ); else (void) sprintf( char_map, "(*yy_cp ? *yy_cp : %d)", NUL_ec ); } else (void) strcpy( char_map, useecs ? "yy_ec[*yy_cp]" : "*yy_cp" ); if ( worry_about_NULs && nultrans ) { if ( ! fulltbl && ! fullspd ) /* compressed tables backtrack *before* they match */ gen_backtracking(); indent_puts( "if ( *yy_cp )" ); indent_up(); indent_puts( "{" ); } if ( fulltbl ) indent_put2s( "yy_current_state = yy_nxt[yy_current_state][%s];", char_map ); else if ( fullspd ) indent_put2s( "yy_current_state += yy_current_state[%s].yy_nxt;", char_map ); else gen_next_compressed_state( char_map ); if ( worry_about_NULs && nultrans ) { indent_puts( "}" ); indent_down(); indent_puts( "else" ); indent_up(); indent_puts( "yy_current_state = yy_NUL_trans[yy_current_state];" ); indent_down(); } if ( fullspd || fulltbl ) gen_backtracking(); if ( reject ) indent_puts( "*yy_state_ptr++ = yy_current_state;" ); } /* generate the code to make a NUL transition */ void gen_NUL_trans() { /* NOTE - changes in here should be reflected in get_next_match() */ int need_backtracking = (num_backtracking > 0 && ! reject); if ( need_backtracking ) /* we'll need yy_cp lying around for the gen_backtracking() */ indent_puts( "register YY_CHAR *yy_cp = yy_c_buf_p;" ); putchar( '\n' ); if ( nultrans ) { indent_puts( "yy_current_state = yy_NUL_trans[yy_current_state];" ); indent_puts( "yy_is_jam = (yy_current_state == 0);" ); } else if ( fulltbl ) { do_indent(); printf( "yy_current_state = yy_nxt[yy_current_state][%d];\n", NUL_ec ); indent_puts( "yy_is_jam = (yy_current_state <= 0);" ); } else if ( fullspd ) { do_indent(); printf( "register int yy_c = %d;\n", NUL_ec ); indent_puts( "register const struct yy_trans_info *yy_trans_info;\n" ); indent_puts( "yy_trans_info = &yy_current_state[yy_c];" ); indent_puts( "yy_current_state += yy_trans_info->yy_nxt;" ); indent_puts( "yy_is_jam = (yy_trans_info->yy_verify != yy_c);" ); } else { char NUL_ec_str[20]; (void) sprintf( NUL_ec_str, "%d", NUL_ec ); gen_next_compressed_state( NUL_ec_str ); if ( reject ) indent_puts( "*yy_state_ptr++ = yy_current_state;" ); do_indent(); if ( interactive ) printf( "yy_is_jam = (yy_base[yy_current_state] == %d);\n", jambase ); else printf( "yy_is_jam = (yy_current_state == %d);\n", jamstate ); } /* if we've entered an accepting state, backtrack; note that * compressed tables have *already* done such backtracking, so * we needn't bother with it again */ if ( need_backtracking && (fullspd || fulltbl) ) { putchar( '\n' ); indent_puts( "if ( ! yy_is_jam )" ); indent_up(); indent_puts( "{" ); gen_backtracking(); indent_puts( "}" ); indent_down(); } } /* generate the code to find the start state */ void gen_start_state() { if ( fullspd ) indent_put2s( "yy_current_state = yy_start_state_list[yy_start%s];", bol_needed ? " + (yy_bp[-1] == '\\n' ? 1 : 0)" : "" ); else { indent_puts( "yy_current_state = yy_start;" ); if ( bol_needed ) { indent_puts( "if ( yy_bp[-1] == '\\n' )" ); indent_up(); indent_puts( "++yy_current_state;" ); indent_down(); } if ( reject ) { /* set up for storing up states */ indent_puts( "yy_state_ptr = yy_state_buf;" ); indent_puts( "*yy_state_ptr++ = yy_current_state;" ); } } } /* gentabs - generate data statements for the transition tables * * synopsis * gentabs(); */ void gentabs() { int i, j, k, *accset, nacc, *acc_array, total_states; int end_of_buffer_action = num_rules + 1; /* *everything* is done in terms of arrays starting at 1, so provide * a null entry for the zero element of all C arrays */ static char C_char_decl[] = "static const YY_CHAR %s[%d] =\n { 0,\n"; acc_array = allocate_integer_array( current_max_dfas ); nummt = 0; /* the compressed table format jams by entering the "jam state", * losing information about the previous state in the process. * In order to recover the previous state, we effectively need * to keep backtracking information. */ ++num_backtracking; if ( reject ) { /* write out accepting list and pointer list * * first we generate the "yy_acclist" array. In the process, we compute * the indices that will go into the "yy_accept" array, and save the * indices in the dfaacc array */ int EOB_accepting_list[2]; /* set up accepting structures for the End Of Buffer state */ EOB_accepting_list[0] = 0; EOB_accepting_list[1] = end_of_buffer_action; accsiz[end_of_buffer_state] = 1; dfaacc[end_of_buffer_state].dfaacc_set = EOB_accepting_list; printf( C_short_decl, "yy_acclist", max( numas, 1 ) + 1 ); j = 1; /* index into "yy_acclist" array */ for ( i = 1; i <= lastdfa; ++i ) { acc_array[i] = j; if ( accsiz[i] != 0 ) { accset = dfaacc[i].dfaacc_set; nacc = accsiz[i]; if ( trace ) fprintf( stderr, "state # %d accepts: ", i ); for ( k = 1; k <= nacc; ++k ) { int accnum = accset[k]; ++j; if ( variable_trailing_context_rules && ! (accnum & YY_TRAILING_HEAD_MASK) && accnum > 0 && accnum <= num_rules && rule_type[accnum] == RULE_VARIABLE ) { /* special hack to flag accepting number as part * of trailing context rule */ accnum |= YY_TRAILING_MASK; } mkdata( accnum ); if ( trace ) { fprintf( stderr, "[%d]", accset[k] ); if ( k < nacc ) fputs( ", ", stderr ); else putc( '\n', stderr ); } } } } /* add accepting number for the "jam" state */ acc_array[i] = j; dataend(); } else { dfaacc[end_of_buffer_state].dfaacc_state = end_of_buffer_action; for ( i = 1; i <= lastdfa; ++i ) acc_array[i] = dfaacc[i].dfaacc_state; /* add accepting number for jam state */ acc_array[i] = 0; } /* spit out "yy_accept" array. If we're doing "reject", it'll be pointers * into the "yy_acclist" array. Otherwise it's actual accepting numbers. * In either case, we just dump the numbers. */ /* "lastdfa + 2" is the size of "yy_accept"; includes room for C arrays * beginning at 0 and for "jam" state */ k = lastdfa + 2; if ( reject ) /* we put a "cap" on the table associating lists of accepting * numbers with state numbers. This is needed because we tell * where the end of an accepting list is by looking at where * the list for the next state starts. */ ++k; printf( C_short_decl, "yy_accept", k ); for ( i = 1; i <= lastdfa; ++i ) { mkdata( acc_array[i] ); if ( ! reject && trace && acc_array[i] ) fprintf( stderr, "state # %d accepts: [%d]\n", i, acc_array[i] ); } /* add entry for "jam" state */ mkdata( acc_array[i] ); if ( reject ) /* add "cap" for the list */ mkdata( acc_array[i] ); dataend(); if ( useecs ) genecs(); if ( usemecs ) { /* write out meta-equivalence classes (used to index templates with) */ if ( trace ) fputs( "\n\nMeta-Equivalence Classes:\n", stderr ); printf( C_char_decl, "yy_meta", numecs + 1 ); for ( i = 1; i <= numecs; ++i ) { if ( trace ) fprintf( stderr, "%d = %d\n", i, abs( tecbck[i] ) ); mkdata( abs( tecbck[i] ) ); } dataend(); } total_states = lastdfa + numtemps; printf( tblend > MAX_SHORT ? C_long_decl : C_short_decl, "yy_base", total_states + 1 ); for ( i = 1; i <= lastdfa; ++i ) { register int d = def[i]; if ( base[i] == JAMSTATE ) base[i] = jambase; if ( d == JAMSTATE ) def[i] = jamstate; else if ( d < 0 ) { /* template reference */ ++tmpuses; def[i] = lastdfa - d + 1; } mkdata( base[i] ); } /* generate jam state's base index */ mkdata( base[i] ); for ( ++i /* skip jam state */; i <= total_states; ++i ) { mkdata( base[i] ); def[i] = jamstate; } dataend(); printf( tblend > MAX_SHORT ? C_long_decl : C_short_decl, "yy_def", total_states + 1 ); for ( i = 1; i <= total_states; ++i ) mkdata( def[i] ); dataend(); printf( lastdfa > MAX_SHORT ? C_long_decl : C_short_decl, "yy_nxt", tblend + 1 ); for ( i = 1; i <= tblend; ++i ) { if ( nxt[i] == 0 || chk[i] == 0 ) nxt[i] = jamstate; /* new state is the JAM state */ mkdata( nxt[i] ); } dataend(); printf( lastdfa > MAX_SHORT ? C_long_decl : C_short_decl, "yy_chk", tblend + 1 ); for ( i = 1; i <= tblend; ++i ) { if ( chk[i] == 0 ) ++nummt; mkdata( chk[i] ); } dataend(); } /* write out a formatted string (with a secondary string argument) at the * current indentation level, adding a final newline */ void indent_put2s( fmt, arg ) char fmt[], arg[]; { do_indent(); printf( fmt, arg ); putchar( '\n' ); } /* write out a string at the current indentation level, adding a final * newline */ void indent_puts( str ) char str[]; { do_indent(); puts( str ); } /* make_tables - generate transition tables * * synopsis * make_tables(); * * Generates transition tables and finishes generating output file */ void make_tables() { register int i; int did_eof_rule = false; skelout(); /* first, take care of YY_DO_BEFORE_ACTION depending on yymore being used */ set_indent( 2 ); if ( yymore_used ) { indent_puts( "yytext -= yy_more_len; \\" ); indent_puts( "yyleng = yy_cp - yytext; \\" ); } else indent_puts( "yyleng = yy_cp - yy_bp; \\" ); set_indent( 0 ); skelout(); printf( "#define YY_END_OF_BUFFER %d\n", num_rules + 1 ); if ( fullspd ) { /* need to define the transet type as a size large * enough to hold the biggest offset */ int total_table_size = tblend + numecs + 1; char *trans_offset_type = total_table_size > MAX_SHORT ? "long" : "short"; set_indent( 0 ); indent_puts( "struct yy_trans_info" ); indent_up(); indent_puts( "{" ); indent_puts( "short yy_verify;" ); /* in cases where its sister yy_verify *is* a "yes, there is a * transition", yy_nxt is the offset (in records) to the next state. * In most cases where there is no transition, the value of yy_nxt * is irrelevant. If yy_nxt is the -1th record of a state, though, * then yy_nxt is the action number for that state */ indent_put2s( "%s yy_nxt;", trans_offset_type ); indent_puts( "};" ); indent_down(); indent_puts( "typedef const struct yy_trans_info *yy_state_type;" ); } else indent_puts( "typedef int yy_state_type;" ); if ( fullspd ) genctbl(); else if ( fulltbl ) genftbl(); else gentabs(); if ( num_backtracking > 0 ) { indent_puts( "static yy_state_type yy_last_accepting_state;" ); indent_puts( "static YY_CHAR *yy_last_accepting_cpos;\n" ); } if ( nultrans ) { printf( C_state_decl, "yy_NUL_trans", lastdfa + 1 ); for ( i = 1; i <= lastdfa; ++i ) { if ( fullspd ) { if ( nultrans ) printf( " &yy_transition[%d],\n", base[i] ); else printf( " 0,\n" ); } else mkdata( nultrans[i] ); } dataend(); } if ( ddebug ) { /* spit out table mapping rules to line numbers */ indent_puts( "extern int yy_flex_debug;" ); indent_puts( "int yy_flex_debug = 1;\n" ); printf( C_short_decl, "yy_rule_linenum", num_rules ); for ( i = 1; i < num_rules; ++i ) mkdata( rule_linenum[i] ); dataend(); } if ( reject ) { /* declare state buffer variables */ puts( "static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;" ); puts( "static YY_CHAR *yy_full_match;" ); puts( "static int yy_lp;" ); if ( variable_trailing_context_rules ) { puts( "static int yy_looking_for_trail_begin = 0;" ); puts( "static int yy_full_lp;" ); puts( "static int *yy_full_state;" ); printf( "#define YY_TRAILING_MASK 0x%x\n", YY_TRAILING_MASK ); printf( "#define YY_TRAILING_HEAD_MASK 0x%x\n", YY_TRAILING_HEAD_MASK ); } puts( "#define REJECT \\" ); puts( "{ \\" ); puts( "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \\" ); puts( "yy_cp = yy_full_match; /* restore poss. backed-over text */ \\" ); if ( variable_trailing_context_rules ) { puts( "yy_lp = yy_full_lp; /* restore orig. accepting pos. */ \\" ); puts( "yy_state_ptr = yy_full_state; /* restore orig. state */ \\" ); puts( "yy_current_state = *yy_state_ptr; /* restore curr. state */ \\" ); } puts( "++yy_lp; \\" ); puts( "goto find_rule; \\" ); puts( "}" ); } else { puts( "/* the intent behind this definition is that it'll catch" ); puts( " * any uses of REJECT which flex missed" ); puts( " */" ); puts( "#define REJECT reject_used_but_not_detected" ); } if ( yymore_used ) { indent_puts( "static int yy_more_flag = 0;" ); indent_puts( "static int yy_doing_yy_more = 0;" ); indent_puts( "static int yy_more_len = 0;" ); indent_puts( "#define yymore() { yy_more_flag = 1; }" ); indent_puts( "#define YY_MORE_ADJ (yy_doing_yy_more ? yy_more_len : 0)" ); } else { indent_puts( "#define yymore() yymore_used_but_not_detected" ); indent_puts( "#define YY_MORE_ADJ 0" ); } skelout(); if ( ferror( temp_action_file ) ) flexfatal( "error occurred when writing temporary action file" ); else if ( fclose( temp_action_file ) ) flexfatal( "error occurred when closing temporary action file" ); temp_action_file = fopen( action_file_name, "r" ); if ( temp_action_file == NULL ) flexfatal( "could not re-open temporary action file" ); /* copy prolog from action_file to output file */ action_out(); skelout(); set_indent( 2 ); if ( yymore_used ) { indent_puts( "yy_more_len = 0;" ); indent_puts( "yy_doing_yy_more = yy_more_flag;" ); indent_puts( "if ( yy_doing_yy_more )" ); indent_up(); indent_puts( "{" ); indent_puts( "yy_more_len = yyleng;" ); indent_puts( "yy_more_flag = 0;" ); indent_puts( "}" ); indent_down(); } skelout(); gen_start_state(); /* note, don't use any indentation */ puts( "yy_match:" ); gen_next_match(); skelout(); set_indent( 2 ); gen_find_action(); skelout(); if ( ddebug ) { indent_puts( "if ( yy_flex_debug )" ); indent_up(); indent_puts( "{" ); indent_puts( "if ( yy_act == 0 )" ); indent_up(); indent_puts( "fprintf( stderr, \"--scanner backtracking\\n\" );" ); indent_down(); do_indent(); printf( "else if ( yy_act < %d )\n", num_rules ); indent_up(); indent_puts( "fprintf( stderr, \"--accepting rule at line %d (\\\"%s\\\")\\n\"," ); indent_puts( " yy_rule_linenum[yy_act], yytext );" ); indent_down(); do_indent(); printf( "else if ( yy_act == %d )\n", num_rules ); indent_up(); indent_puts( "fprintf( stderr, \"--accepting default rule (\\\"%s\\\")\\n\"," ); indent_puts( " yytext );" ); indent_down(); do_indent(); printf( "else if ( yy_act == %d )\n", num_rules + 1 ); indent_up(); indent_puts( "fprintf( stderr, \"--(end of buffer or a NUL)\\n\" );" ); indent_down(); do_indent(); printf( "else\n" ); indent_up(); indent_puts( "fprintf( stderr, \"--EOF\\n\" );" ); indent_down(); indent_puts( "}" ); indent_down(); } /* copy actions from action_file to output file */ skelout(); indent_up(); gen_bt_action(); action_out(); /* generate cases for any missing EOF rules */ for ( i = 1; i <= lastsc; ++i ) if ( ! sceof[i] ) { do_indent(); printf( "case YY_STATE_EOF(%s):\n", scname[i] ); did_eof_rule = true; } if ( did_eof_rule ) { indent_up(); indent_puts( "yyterminate();" ); indent_down(); } /* generate code for handling NUL's, if needed */ /* first, deal with backtracking and setting up yy_cp if the scanner * finds that it should JAM on the NUL */ skelout(); set_indent( 7 ); if ( fullspd || fulltbl ) indent_puts( "yy_cp = yy_c_buf_p;" ); else { /* compressed table */ if ( ! reject && ! interactive ) { /* do the guaranteed-needed backtrack to figure out the match */ indent_puts( "yy_cp = yy_last_accepting_cpos;" ); indent_puts( "yy_current_state = yy_last_accepting_state;" ); } } /* generate code for yy_get_previous_state() */ set_indent( 1 ); skelout(); if ( bol_needed ) indent_puts( "register YY_CHAR *yy_bp = yytext;\n" ); gen_start_state(); set_indent( 2 ); skelout(); gen_next_state( true ); set_indent( 1 ); skelout(); gen_NUL_trans(); skelout(); /* copy remainder of input to output */ line_directive_out( stdout ); (void) flexscan(); /* copy remainder of input to output */ } �������������������������������������������������������������������������������������������������������������������������������/* A lexical scanner generated by flex */ /* scanner skeleton version: * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ */ #define FLEX_SCANNER #include <stdio.h> /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include <stdlib.h> #include <osfcn.h> /* use prototypes in function declarations */ #define YY_USE_PROTOS /* the "const" storage-class-modifier is valid */ #define YY_USE_CONST #else /* ! __cplusplus */ #ifdef __STDC__ #ifdef __GNUC__ #include <stddef.h> void *malloc( size_t ); void free( void* ); #else #include <stdlib.h> #endif /* __GNUC__ */ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #define YY_USE_CONST #endif #ifndef YY_USE_CONST #define const #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () /* we can't get here if it's an ANSI C compiler, or a C++ compiler, * so it's got to be a K&R compiler, and therefore there's no standard * place from which to include these definitions */ char *malloc(); int free(); int read(); #endif /* amount of stuff to slurp up with each read */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* returned upon end-of-file */ #define YY_END_TOK 0 /* copy whatever the last rule matched to the standard output */ /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ /* this used to be an fputs(), but since the string might contain NUL's, * we now use fwrite() */ #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) /* gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); #define YY_NULL 0 /* no semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #define yyterminate() return ( YY_NULL ) /* report a fatal error */ /* The funky do-while is used to turn this macro definition into * a single C statement (which needs a semi-colon terminator). * This avoids problems with code like: * * if ( something_happens ) * YY_FATAL_ERROR( "oops, the something happened" ); * else * everything_okay(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the YY_FATAL_ERROR() call. */ #define YY_FATAL_ERROR(msg) \ do \ { \ (void) fputs( msg, stderr ); \ (void) putc( '\n', stderr ); \ exit( 1 ); \ } \ while ( 0 ) /* default yywrap function - always treat EOF as an EOF */ #define yywrap() 1 /* enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN */ #define BEGIN yy_start = 1 + 2 * /* action number for EOF rule of a given start state */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* special action meaning "start processing a new file" */ #define YY_NEW_FILE \ do \ { \ yy_init_buffer( yy_current_buffer, yyin ); \ yy_load_buffer_state(); \ } \ while ( 0 ) /* default declaration of generated scanner - a define so the user can * easily add parameters */ #define YY_DECL int yylex YY_PROTO(( void )) /* code executed at the end of each rule */ #define YY_BREAK break; #define YY_END_OF_BUFFER_CHAR 0 #ifndef YY_BUF_SIZE #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ #endif typedef struct yy_buffer_state *YY_BUFFER_STATE; #define YY_CHAR unsigned char # line 1 "scan.l" #define INITIAL 0 /* scan.l - scanner for flex input */ # line 5 "scan.l" /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; #endif #undef yywrap #include "flexdef.h" #include "parse.h" #define ACTION_ECHO fprintf( temp_action_file, "%s", yytext ) #define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" ); #undef YY_DECL #define YY_DECL \ int flexscan() #define RETURNCHAR \ yylval = yytext[0]; \ return ( CHAR ); #define RETURNNAME \ (void) strcpy( nmstr, (char *) yytext ); \ return ( NAME ); #define PUT_BACK_STRING(str, start) \ for ( i = strlen( (char *) (str) ) - 1; i >= start; --i ) \ unput((str)[i]) #define CHECK_REJECT(str) \ if ( all_upper( str ) ) \ reject = true; #define CHECK_YYMORE(str) \ if ( all_lower( str ) ) \ yymore_used = true; #define SECT2 1 #define SECT2PROLOG 2 #define SECT3 3 #define CODEBLOCK 4 #define PICKUPDEF 5 #define SC 6 #define CARETISBOL 7 #define NUM 8 #define QUOTE 9 #define FIRSTCCL 10 #define CCL 11 #define ACTION 12 #define RECOVER 13 #define BRACEERROR 14 #define C_COMMENT 15 #define ACTION_COMMENT 16 #define ACTION_STRING 17 #define PERCENT_BRACE_ACTION 18 #define USED_LIST 19 #define CODEBLOCK_2 20 #define XLATION 21 # line 84 "scan.l" /* done after the current pattern has been matched and before the * corresponding action - sets up yytext */ #define YY_DO_BEFORE_ACTION \ yytext = yy_bp; \ yyleng = yy_cp - yy_bp; \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* return all but the first 'n' matched characters back to the input stream */ #define yyless(n) \ do \ { \ /* undo effects of setting up yytext */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext ) struct yy_buffer_state { FILE *yy_input_file; YY_CHAR *yy_ch_buf; /* input buffer */ YY_CHAR *yy_buf_pos; /* current position in input buffer */ /* size of input buffer in bytes, not including room for EOB characters*/ int yy_buf_size; /* number of characters read into yy_ch_buf, not including EOB characters */ int yy_n_chars; int yy_eof_status; /* whether we've seen an EOF on this buffer */ #define EOF_NOT_SEEN 0 /* "pending" happens when the EOF has been seen but there's still * some text process */ #define EOF_PENDING 1 #define EOF_DONE 2 }; static YY_BUFFER_STATE yy_current_buffer; /* we provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state" */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed */ static YY_CHAR yy_hold_char;BC��DC��EC��FC��GC��HC��IC��JC��KC��LC��MC��NC��OC��PC��QC��RC��SC��TC��UC��VC��WC��XC��YC��ZC��[C��\C��]C��^C��_C��`C��aC��bC��cC��dC��eC��fC��gC��hC��iC��jC��kC��lC��mC��nC��oC��pC��qC��rC��sC��tC��uC��vC��wC��xC��yC��zC��{C��|C��}C��~C������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ static int yy_n_chars; /* number of characters read into yy_ch_buf */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif #ifndef YY_USER_INIT #define YY_USER_INIT #endif extern YY_CHAR *yytext; extern int yyleng; extern FILE *yyin, *yyout; YY_CHAR *yytext; int yyleng; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; #define YY_END_OF_BUFFER 121 typedef int yy_state_type; static const short int yy_accept[341] = { 0, 0, 0, 0, 0, 0, 0, 119, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 19, 7, 18, 19, 16, 1, 17, 19, 19, 19, 15, 67, 59, 60, 53, 67, 66, 51, 67, 67, 67, 50, 49, 67, 52, 120, 47, 119, 119, 28, 29, 28, 28, 28, 28, 31, 30, 32, 73, 120, 69, 70, 72, 74, 88, 89, 86, 85, 87, 75, 77, 76, 75, 81, 80, 81, 81, 83, 83, 83, 84, 99, 104, 103, 105, 105, 100, 100, 100, 97, 98, 120, 33, 91, 90, 22, 24, 23, 107, 109, 108, 111, 113, 114, 115, 95, 95, 96, 95, 95, 95, 95, 38, 35, 34, 38, 38, 44, 42, 45, 44, 44, 41, 41, 41, 40, 41, 7, 18, 0, 16, 1, 17, 0, 2, 14, 8, 0, 12, 4, 0, 0, 5, 0, 3, 15, 59, 60, 0, 0, 56, 0, 0, 0, 117, 117, 117, 55, 54, 55, 50, 49, 63, 50, 0, 47, 46, 119, 119, 28, 28, 28, 28, 28, 31, 30, 71, 72, 85, 118, 118, 118, 78, 79, 82, 99, 0, 102, 0, 101, 100, 100, 100, 0, 33, 22, 20, 107, 106, 111, 112, 95, 95, 95, 92, 95, 95, 95, 38, 35, 38, 38, 42, 0, 43, 43, 43, 42, 40, 0, 13, 14, 8, 8, 0, 12, 4, 0, 0, 0, 5, 0, 6, 57, 0, 58, 0, 64, 0, 0, 117, 117, 55, 55, 65, 63, 28, 28, 28, 25, 0, 118, 118, 100, 100, 0, 21, 92, 92, 95, 95, 38, 38, 0, 39, 43, 43, 0, 11, 4, 0, 11, 0, 0, 5, 0, 0, 0, 117, 28, 28, 118, 100, 100, 95, 95, 38, 38, 43, 0, 9, 0, 0, 0, 28, 28, 100, 100, 95, 95, 38, 38, 0, 0, 26, 27, 93, 94, 93, 94, 36, 37, 10, 62, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 6, 7, 8, 9, 1, 10, 11, 11, 12, 11, 13, 14, 11, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 1, 17, 1, 18, 11, 1, 24, 25, 26, 27, 28, 29, 23, 23, 23, 30, 31, 23, 32, 33, 34, 31, 23, 35, 36, 37, 38, 23, 23, 39, 40, 23, 19, 20, 21, 22, 23, 1, 24, 25, 26, 27, 28, 29, 23, 23, 23, 30, 31, 23, 32, 33, 34, 31, 23, 35, 36, 37, 38, 23, 23, 39, 40, 23, 41, 42, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[44] = { 0, 1, 2, 3, 2, 2, 4, 1, 1, 1, 5, 1, 6, 1, 7, 5, 8, 1, 1, 1, 9, 10, 1, 11, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 1, 13 } ; static const short int yy_base[404] = { 0, 0, 43, 85, 126, 1371, 1370, 1369, 1353, 168, 1346, 104, 108, 211, 0, 1332, 1320, 120, 252, 95, 119, 137, 144, 100, 141, 295, 0, 1327, 1323, 113, 336, 254, 255, 257, 258, 253, 268, 379, 0, 338, 421, 0, 0, 273, 460, 1325, 1442, 281, 1442, 1287, 0, 287, 1442, 1279, 472, 1257, 0, 1442, 425, 1442, 1442, 147, 1442, 1239, 1235, 78, 513, 433, 1442, 83, 1442, 1248, 0, 1247, 1442, 0, 1442, 0, 1218, 1205, 1194, 0, 342, 1442, 1442, 1442, 1442, 1202, 0, 1442, 1442, 1442, 1442, 1201, 1442, 1442, 1442, 1442, 79, 1442, 1442, 103, 1198, 1442, 0, 248, 1442, 0, 1442, 1442, 252, 1199, 0, 1173, 1158, 1442, 1442, 1185, 1442, 1442, 1442, 0, 1442, 1170, 0, 1442, 1152, 0, 1442, 1442, 0, 0, 346, 1442, 1123, 0, 1125, 1105, 0, 352, 1442, 1116, 1103, 1442, 356, 1442, 1100, 329, 1442, 360, 1093, 1101, 333, 441, 1442, 445, 0, 449, 1442, 1101, 1442, 365, 453, 1094, 466, 0, 480, 330, 0, 1095, 1442, 0, 555, 1442, 1044, 1077, 1442, 1051, 133, 456, 1442, 1059, 0, 0, 1442, 584, 563, 1442, 0, 1442, 1071, 0, 1442, 1063, 1442, 0, 0, 1010, 1007, 627, 0, 484, 1442, 0, 998, 1442, 992, 0, 1442, 1442, 1442, 0, 421, 1442, 0, 1442, 0, 971, 964, 992, 1442, 0, 962, 0, 1442, 0, 1442, 0, 488, 921, 670, 0, 717, 714, 0, 497, 715, 712, 569, 573, 1442, 727, 0, 577, 726, 581, 1442, 585, 0, 590, 738, 597, 0, 712, 683, 691, 0, 670, 1442, 1442, 623, 1442, 591, 1442, 458, 702, 590, 0, 0, 0, 1442, 0, 576, 569, 0, 1442, 593, 575, 0, 560, 546, 567, 1442, 0, 0, 541, 529, 534, 527, 730, 1442, 500, 0, 509, 1442, 0, 734, 1442, 468, 467, 0, 462, 704, 724, 1442, 461, 438, 1442, 440, 425, 433, 405, 413, 398, 1442, 404, 1442, 359, 259, 332, 338, 346, 334, 331, 257, 253, 226, 137, 133, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1442, 1442, 1442, 753, 766, 779, 792, 805, 818, 831, 844, 857, 870, 883, 896, 909, 922, 935, 948, 955, 967, 980, 986, 998, 1011, 1024, 1037, 1050, 1063, 1070, 1082, 1089, 1101, 1114, 1127, 1140, 1150, 1157, 1169, 1182, 1195, 1208, 1221, 1234, 1241, 1253, 1266, 1279, 1282, 1284, 1296, 1309, 1315, 1327, 1339, 1345, 1357, 1363, 1375, 1382, 1388, 1393, 1405, 1411, 1423, 1429 } ; static const short int yy_def[404] = { 0, 340, 340, 341, 341, 342, 342, 343, 343, 340, 9, 344, 344, 340, 13, 345, 345, 346, 346, 347, 347, 348, 348, 349, 349, 340, 25, 350, 350, 345, 345, 351, 351, 352, 352, 353, 353, 340, 37, 354, 354, 37, 37, 355, 356, 340, 340, 340, 340, 340, 357, 340, 340, 358, 359, 340, 360, 340, 340, 340, 340, 340, 340, 340, 361, 362, 340, 340, 340, 340, 340, 363, 364, 365, 340, 366, 340, 367, 367, 367, 366, 368, 340, 340, 340, 340, 340, 340, 369, 340, 340, 340, 340, 340, 340, 340, 340, 340, 362, 340, 340, 370, 371, 340, 372, 362, 340, 373, 340, 340, 374, 340, 375, 375, 375, 340, 340, 376, 340, 340, 340, 377, 340, 340, 378, 340, 340, 379, 340, 340, 380, 381, 381, 340, 381, 382, 382, 382, 383, 340, 340, 383, 383, 340, 340, 340, 340, 384, 340, 340, 340, 340, 384, 340, 340, 340, 357, 340, 340, 358, 340, 340, 385, 340, 340, 386, 340, 340, 387, 388, 340, 360, 340, 340, 340, 389, 340, 340, 361, 361, 340, 340, 390, 391, 340, 391, 340, 340, 392, 340, 363, 364, 340, 365, 340, 366, 367, 367, 367, 340, 368, 340, 340, 369, 340, 340, 340, 393, 340, 340, 340, 373, 374, 340, 374, 340, 375, 375, 375, 376, 340, 377, 394, 378, 340, 379, 340, 381, 381, 381, 340, 382, 382, 382, 383, 340, 383, 383, 340, 340, 340, 340, 395, 340, 340, 340, 340, 340, 385, 385, 396, 340, 397, 396, 340, 340, 398, 388, 340, 340, 389, 340, 340, 340, 361, 361, 340, 399, 391, 185, 340, 392, 367, 367, 199, 340, 400, 340, 401, 375, 375, 394, 340, 230, 402, 382, 382, 383, 383, 340, 340, 340, 403, 396, 340, 397, 396, 340, 340, 340, 398, 340, 361, 265, 340, 367, 367, 340, 375, 375, 382, 382, 383, 383, 340, 340, 340, 340, 361, 361, 367, 367, 375, 375, 382, 382, 383, 383, 340, 340, 367, 367, 375, 375, 382, 382, 383, 383, 340, 340, 0, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static const short int yy_nxt[1486] = { 0, 46, 47, 48, 47, 47, 46, 46, 46, 49, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 46, 46, 46, 46, 51, 52, 51, 51, 46, 53, 46, 54, 46, 46, 46, 46, 46, 55, 46, 46, 46, 46, 46, 46, 46, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 46, 46, 46, 58, 59, 58, 58, 60, 188, 61, 181, 181, 62, 62, 96, 339, 62, 97, 63, 85, 64, 65, 82, 83, 82, 82, 82, 83, 82, 82, 104, 98, 119, 182, 182, 206, 105, 106, 96, 91, 189, 97, 66, 62, 67, 68, 67, 67, 60, 92, 61, 69, 93, 62, 62, 98, 85, 62, 207, 63, 85, 64, 65, 85, 70, 176, 176, 100, 176, 179, 263, 104, 120, 101, 100, 102, 338, 105, 106, 94, 101, 337, 102, 66, 62, 75, 75, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 77, 77, 77, 77, 79, 75, 75, 75, 84, 84, 85, 84, 84, 84, 84, 84, 84, 84, 84, 84, 86, 84, 84, 84, 84, 87, 84, 84, 84, 84, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 84, 84, 84, 91, 128, 122, 122, 129, 125, 125, 213, 336, 181, 92, 123, 123, 93, 126, 126, 128, 214, 130, 129, 144, 145, 144, 144, 179, 263, 335, 146, 153, 154, 153, 153, 182, 130, 157, 158, 157, 157, 147, 334, 94, 107, 107, 108, 107, 107, 109, 107, 107, 107, 110, 107, 107, 107, 107, 111, 107, 107, 107, 107, 107, 107, 107, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 112, 112, 112, 114, 115, 107, 116, 119, 139, 140, 139, 139, 201, 241, 201, 201, 228, 241, 228, 228, 179, 263, 235, 229, 235, 235, 238, 333, 238, 238, 243, 254, 243, 243, 255, 247, 242, 247, 247, 332, 242, 141, 331, 330, 244, 329, 142, 120, 131, 132, 133, 132, 132, 131, 131, 131, 134, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 135, 135, 135, 135, 137, 131, 131, 131, 139, 140, 139, 139, 172, 173, 172, 172, 213, 328, 327, 174, 186, 187, 186, 186, 326, 325, 214, 174, 153, 154, 153, 153, 245, 246, 245, 245, 157, 158, 157, 157, 249, 141, 249, 249, 324, 323, 142, 149, 145, 149, 149, 322, 175, 251, 150, 251, 251, 264, 321, 302, 175, 151, 178, 179, 263, 152, 162, 245, 246, 245, 253, 201, 320, 201, 201, 228, 317, 228, 228, 316, 265, 163, 229, 164, 235, 163, 235, 235, 163, 315, 163, 163, 164, 165, 166, 167, 168, 294, 169, 183, 183, 240, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 183, 183, 183, 183, 183, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 183, 183, 183, 172, 173, 172, 172, 313, 312, 311, 174, 186, 187, 186, 186, 310, 282, 238, 174, 238, 238, 289, 290, 289, 289, 243, 309, 243, 243, 245, 246, 245, 245, 247, 308, 247, 247, 205, 249, 244, 249, 249, 275, 175, 269, 251, 269, 251, 251, 306, 305, 175, 180, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 301, 261, 270, 274, 274, 275, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, 283, 283, 258, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 283, 283, 283, 296, 297, 296, 296, 303, 299, 318, 298, 179, 263, 179, 263, 303, 303, 303, 303, 303, 303, 289, 290, 289, 289, 296, 297, 296, 296, 319, 294, 244, 291, 288, 287, 286, 285, 319, 319, 319, 319, 319, 319, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 156, 156, 230, 282, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 171, 171, 220, 280, 171, 171, 178, 178, 279, 178, 178, 178, 178, 178, 178, 277, 178, 178, 178, 180, 180, 204, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 192, 273, 272, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 195, 195, 194, 195, 195, 195, 195, 195, 195, 195, 191, 266, 195, 196, 196, 262, 261, 196, 196, 200, 200, 259, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 258, 250, 203, 203, 205, 205, 160, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 208, 208, 244, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 210, 210, 239, 210, 210, 210, 210, 210, 210, 239, 210, 210, 210, 211, 211, 237, 236, 233, 211, 211, 211, 211, 211, 212, 212, 232, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 216, 216, 230, 224, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 221, 221, 222, 221, 221, 220, 221, 221, 221, 221, 221, 221, 221, 223, 223, 218, 223, 223, 217, 223, 223, 223, 223, 223, 223, 223, 225, 225, 215, 209, 225, 225, 225, 225, 204, 225, 225, 225, 225, 226, 226, 202, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 199, 227, 227, 227, 227, 227, 227, 227, 198, 197, 227, 231, 231, 194, 191, 231, 231, 234, 179, 177, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 240, 240, 170, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 248, 248, 160, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 252, 252, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 267, 155, 340, 118, 267, 268, 268, 118, 268, 268, 268, 268, 268, 268, 268, 268, 268, 271, 271, 89, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 278, 89, 80, 74, 278, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 292, 74, 72, 72, 292, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 295, 295, 340, 340, 295, 295, 300, 300, 340, 340, 300, 300, 304, 340, 340, 340, 304, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 307, 340, 340, 340, 307, 284, 284, 340, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 314, 340, 340, 340, 314, 45, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static const short int yy_chk[1486] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 69, 3, 65, 98, 3, 3, 19, 329, 3, 19, 3, 23, 3, 3, 11, 11, 11, 11, 12, 12, 12, 12, 23, 19, 29, 65, 98, 101, 23, 23, 20, 17, 69, 20, 3, 3, 4, 4, 4, 4, 4, 17, 4, 4, 17, 4, 4, 20, 21, 4, 101, 4, 24, 4, 4, 22, 4, 61, 61, 21, 61, 178, 178, 24, 29, 21, 22, 21, 328, 24, 24, 17, 22, 327, 22, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 35, 31, 32, 35, 33, 34, 110, 326, 105, 18, 31, 32, 18, 33, 34, 36, 110, 35, 36, 43, 43, 43, 43, 318, 318, 325, 43, 47, 47, 47, 47, 105, 36, 51, 51, 51, 51, 43, 324, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 39, 39, 39, 39, 82, 147, 82, 82, 132, 152, 132, 132, 319, 319, 139, 132, 139, 139, 144, 323, 144, 144, 149, 167, 149, 149, 167, 161, 147, 161, 161, 322, 152, 39, 321, 320, 149, 317, 39, 30, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 58, 58, 58, 58, 212, 315, 313, 58, 67, 67, 67, 67, 312, 311, 212, 67, 153, 153, 153, 153, 155, 155, 155, 155, 157, 157, 157, 157, 162, 40, 162, 162, 310, 309, 40, 44, 44, 44, 44, 308, 58, 164, 44, 164, 164, 179, 306, 264, 67, 44, 179, 264, 264, 44, 54, 166, 166, 166, 166, 201, 305, 201, 201, 228, 301, 228, 228, 299, 179, 54, 228, 54, 235, 54, 235, 235, 54, 298, 54, 54, 54, 54, 54, 54, 54, 293, 54, 66, 66, 291, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 172, 172, 172, 172, 288, 287, 286, 172, 186, 186, 186, 186, 285, 281, 238, 186, 238, 238, 239, 239, 239, 239, 243, 280, 243, 243, 245, 245, 245, 245, 247, 279, 247, 247, 277, 249, 243, 249, 249, 276, 172, 185, 251, 185, 251, 251, 273, 272, 186, 266, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 262, 260, 185, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 230, 230, 257, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 253, 253, 253, 253, 265, 255, 302, 254, 265, 265, 302, 302, 265, 265, 265, 265, 265, 265, 289, 289, 289, 289, 296, 296, 296, 296, 303, 250, 244, 241, 237, 236, 233, 232, 303, 303, 303, 303, 303, 303, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 357, 357, 229, 222, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 360, 360, 219, 218, 360, 360, 361, 361, 217, 361, 361, 361, 361, 361, 361, 206, 361, 361, 361, 362, 362, 204, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 364, 198, 197, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 366, 366, 193, 366, 366, 366, 366, 366, 366, 366, 190, 181, 366, 367, 367, 177, 175, 367, 367, 368, 368, 174, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 369, 169, 163, 369, 369, 370, 370, 159, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 371, 371, 151, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 372, 372, 150, 372, 372, 372, 372, 372, 372, 146, 372, 372, 372, 373, 373, 142, 141, 137, 373, 373, 373, 373, 373, 374, 374, 136, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 134, 126, 375, 375, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, 377, 123, 377, 377, 117, 377, 377, 377, 377, 377, 377, 377, 378, 378, 114, 378, 378, 113, 378, 378, 378, 378, 378, 378, 378, 379, 379, 111, 102, 379, 379, 379, 379, 93, 379, 379, 379, 379, 380, 380, 87, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 381, 381, 80, 381, 381, 381, 381, 381, 381, 381, 79, 78, 381, 382, 382, 73, 71, 382, 382, 383, 64, 63, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 384, 384, 55, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 385, 53, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 386, 387, 387, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 49, 45, 28, 390, 391, 391, 27, 391, 391, 391, 391, 391, 391, 391, 391, 391, 392, 392, 16, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 393, 15, 10, 8, 393, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 7, 6, 5, 395, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 0, 0, 397, 397, 398, 398, 0, 0, 398, 398, 399, 0, 0, 0, 399, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 401, 0, 0, 0, 401, 402, 402, 0, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 403, 0, 0, 0, 403, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static yy_state_type yy_last_accepting_state; static YY_CHAR *yy_last_accepting_cpos; /* the intent behind this definition is that it'll catch * any uses of REJECT which flex missed */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 /* these variables are all declared out here so that section 3 code can * manipulate them */ /* points to current character in buffer */ static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); #define yy_new_buffer yy_create_buffer #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif YY_DECL { register yy_state_type yy_current_state; register YY_CHAR *yy_cp, *yy_bp; register int yy_act; static int bracelevel, didadef; int i, indented_code, checking_used, new_xlation; int doing_codeblock = false; Char nmdef[MAXLINE], myesc(); if ( yy_init ) { YY_USER_INIT; if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( yy_current_buffer ) yy_init_buffer( yy_current_buffer, yyin ); else yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); yy_init = 0; } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* support of yytext */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; yy_current_state = yy_start; if ( yy_bp[-1] == '\n' ) ++yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[*yy_cp]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_current_state != 340 ); yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; YY_USER_ACTION; do_action: /* this label is used only to access EOF actions */ switch ( yy_act ) { case 0: /* must backtrack */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: # line 90 "scan.l" indented_code = true; BEGIN(CODEBLOCK); YY_BREAK case 2: # line 91 "scan.l" ++linenum; /* treat as a comment */ YY_BREAK case 3: # line 92 "scan.l" ECHO; BEGIN(C_COMMENT); YY_BREAK case 4: # line 93 "scan.l" return ( SCDECL ); YY_BREAK case 5: # line 94 "scan.l" return ( XSCDECL ); YY_BREAK case 6: # line 95 "scan.l" { ++linenum; line_directive_out( stdout ); indented_code = false; BEGIN(CODEBLOCK); } YY_BREAK case 7: # line 102 "scan.l" return ( WHITESPACE ); YY_BREAK case 8: # line 104 "scan.l" { sectnum = 2; line_directive_out( stdout ); BEGIN(SECT2PROLOG); return ( SECTEND ); } YY_BREAK case 9: # line 111 "scan.l" { pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_USED; BEGIN(USED_LIST); } YY_BREAK case 10: # line 115 "scan.l" { checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); } YY_BREAK case 11: # line 122 "scan.l" { #ifdef NOTDEF fprintf( stderr, "old-style lex command at line %d ignored:\n\t%s", linenum, yytext ); #endif ++linenum; } YY_BREAK case 12: # line 131 "scan.l" /* ignore old lex directive */ YY_BREAK case 13: # line 133 "scan.l" { ++linenum; xlation = (int *) malloc( sizeof( int ) * (unsigned) csize ); if ( ! xlation ) flexfatal( "dynamic memory failure building %t table" ); for ( i = 0; i < csize; ++i ) xlation[i] = 0; num_xlations = 0; BEGIN(XLATION); } YY_BREAK case 14: # line 150 "scan.l" synerr( "unrecognized '%' directive" ); YY_BREAK case 15: # line 152 "scan.l" { (void) strcpy( nmstr, (char *) yytext ); didadef = false; BEGIN(PICKUPDEF); } YY_BREAK case 16: # line 158 "scan.l" RETURNNAME; YY_BREAK case 17: # line 159 "scan.l" ++linenum; /* allows blank lines in section 1 */ YY_BREAK case 18: # line 160 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 19: # line 161 "scan.l" synerr( "illegal character" ); BEGIN(RECOVER); YY_BREAK case 20: # line 164 "scan.l" ECHO; BEGIN(INITIAL); YY_BREAK case 21: # line 165 "scan.l" ++linenum; ECHO; BEGIN(INITIAL); YY_BREAK case 22: # line 166 "scan.l" ECHO; YY_BREAK case 23: # line 167 "scan.l" ECHO; YY_BREAK case 24: # line 168 "scan.l" ++linenum; ECHO; YY_BREAK case 25: # line 171 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 26: # line 172 "scan.l" ECHO; CHECK_REJECT(yytext); YY_BREAK case 27: # line 173 "scan.l" ECHO; CHECK_YYMORE(yytext); YY_BREAK case 28: # line 174 "scan.l" ECHO; YY_BREAK case 29: # line 175 "scan.l" { ++linenum; ECHO; if ( indented_code ) BEGIN(INITIAL); } YY_BREAK case 30: # line 183 "scan.l" /* separates name and definition */ YY_BREAK case 31: # line 185 "scan.l" { (void) strcpy( (char *) nmdef, (char *) yytext ); for ( i = strlen( (char *) nmdef ) - 1; i >= 0 && nmdef[i] == ' ' || nmdef[i] == '\t'; --i ) ; nmdef[i + 1] = '\0'; ndinstal( nmstr, nmdef ); didadef = true; } YY_BREAK case 32: # line 200 "scan.l" { if ( ! didadef ) synerr( "incomplete name definition" ); BEGIN(INITIAL); ++linenum; } YY_BREAK case 33: # line 207 "scan.l" ++linenum; BEGIN(INITIAL); RETURNNAME; YY_BREAK case 34: # line 210 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 35: # line 211 "scan.l" YY_BREAK case 36: # line 212 "scan.l" { if ( all_upper( yytext ) ) reject_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } YY_BREAK case 37: # line 218 "scan.l" { if ( all_lower( yytext ) ) yymore_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } YY_BREAK case 38: # line 224 "scan.l" synerr( "unrecognized %used/%unused construct" ); YY_BREAK case 39: # line 227 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 40: # line 228 "scan.l" ++num_xlations; new_xlation = true; YY_BREAK case 41: # line 229 "scan.l" synerr( "bad row in translation table" ); YY_BREAK case 42: # line 230 "scan.l" /* ignore whitespace */ YY_BREAK case 43: # line 232 "scan.l" { xlation[myesc( yytext )] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } YY_BREAK case 44: # line 237 "scan.l" { xlation[yytext[0]] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } YY_BREAK case 45: # line 243 "scan.l" ++linenum; YY_BREAK case 46: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 246 "scan.l" { ++linenum; ACTION_ECHO; MARK_END_OF_PROLOG; BEGIN(SECT2); } YY_BREAK case 47: # line 253 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case YY_STATE_EOF(SECT2PROLOG): # line 255 "scan.l" MARK_END_OF_PROLOG; yyterminate(); YY_BREAK case 49: # line 257 "scan.l" ++linenum; /* allow blank lines in section 2 */ YY_BREAK case 50: # line 259 "scan.l" { indented_code = (yytext[0] != '%'); doing_codeblock = true; bracelevel = 1; if ( indented_code ) ACTION_ECHO; BEGIN(CODEBLOCK_2); } YY_BREAK case 51: # line 270 "scan.l" BEGIN(SC); return ( '<' ); YY_BREAK case 52: # line 271 "scan.l" return ( '^' ); YY_BREAK case 53: # line 272 "scan.l" BEGIN(QUOTE); return ( '"' ); YY_BREAK case 54: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 273 "scan.l" BEGIN(NUM); return ( '{' ); YY_BREAK case 55: # line 274 "scan.l" BEGIN(BRACEERROR); YY_BREAK case 56: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 275 "scan.l" return ( '$' ); YY_BREAK case 57: # line 277 "scan.l" { bracelevel = 1; BEGIN(PERCENT_BRACE_ACTION); return ( '\n' ); } YY_BREAK case 58: # line 282 "scan.l" continued_action = true; ++linenum; return ( '\n' ); YY_BREAK case 59: # line 284 "scan.l" { /* this rule is separate from the one below because * otherwise we get variable trailing context, so * we can't build the scanner using -{f,F} */ bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } YY_BREAK case 60: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 295 "scan.l" { bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } YY_BREAK case 61: # line 302 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 62: # line 304 "scan.l" return ( EOF_OP ); YY_BREAK case 63: # line 306 "scan.l" { sectnum = 3; BEGIN(SECT3); return ( EOF ); /* to stop the parser */ } YY_BREAK case 64: # line 312 "scan.l" { int cclval; (void) strcpy( nmstr, (char *) yytext ); /* check to see if we've already encountered this ccl */ if ( (cclval = ccllookup( (Char *) nmstr )) ) { yylval = cclval; ++cclreuse; return ( PREVCCL ); } else { /* we fudge a bit. We know that this ccl will * soon be numbered as lastccl + 1 by cclinit */ cclinstal( (Char *) nmstr, lastccl + 1 ); /* push back everything but the leading bracket * so the ccl can be rescanned */ PUT_BACK_STRING((Char *) nmstr, 1); BEGIN(FIRSTCCL); return ( '[' ); } } YY_BREAK case 65: # line 341 "scan.l" { register Char *nmdefptr; Char *ndlookup(); (void) strcpy( nmstr, (char *) yytext ); nmstr[yyleng - 1] = '\0'; /* chop trailing brace */ /* lookup from "nmstr + 1" to chop leading brace */ if ( ! (nmdefptr = ndlookup( nmstr + 1 )) ) synerr( "undefined {name}" ); else { /* push back name surrounded by ()'s */ unput(')'); PUT_BACK_STRING(nmdefptr, 0); unput('('); } } YY_BREAK case 66: # line 360 "scan.l" return ( yytext[0] ); YY_BREAK case 67: # line 361 "scan.l" RETURNCHAR; YY_BREAK case 68: # line 362 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 69: # line 365 "scan.l" return ( ',' ); YY_BREAK case 70: # line 366 "scan.l" BEGIN(SECT2); return ( '>' ); YY_BREAK case 71: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 367 "scan.l" BEGIN(CARETISBOL); return ( '>' ); YY_BREAK case 72: # line 368 "scan.l" RETURNNAME; YY_BREAK case 73: # line 369 "scan.l" synerr( "bad start condition name" ); YY_BREAK case 74: # line 371 "scan.l" BEGIN(SECT2); return ( '^' ); YY_BREAK case 75: # line 374 "scan.l" RETURNCHAR; YY_BREAK case 76: # line 375 "scan.l" BEGIN(SECT2); return ( '"' ); YY_BREAK case 77: # line 377 "scan.l" { synerr( "missing quote" ); BEGIN(SECT2); ++linenum; return ( '"' ); } YY_BREAK case 78: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 385 "scan.l" BEGIN(CCL); return ( '^' ); YY_BREAK case 79: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 386 "scan.l" return ( '^' ); YY_BREAK case 80: # line 387 "scan.l" BEGIN(CCL); yylval = '-'; return ( CHAR ); YY_BREAK case 81: # line 388 "scan.l" BEGIN(CCL); RETURNCHAR; YY_BREAK case 82: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 390 "scan.l" return ( '-' ); YY_BREAK case 83: # line 391 "scan.l" RETURNCHAR; YY_BREAK case 84: # line 392 "scan.l" BEGIN(SECT2); return ( ']' ); YY_BREAK case 85: # line 395 "scan.l" { yylval = myctoi( yytext ); return ( NUMBER ); } YY_BREAK case 86: # line 400 "scan.l" return ( ',' ); YY_BREAK case 87: # line 401 "scan.l" BEGIN(SECT2); return ( '}' ); YY_BREAK case 88: # line 403 "scan.l" { synerr( "bad character inside {}'s" ); BEGIN(SECT2); return ( '}' ); } YY_BREAK case 89: # line 409 "scan.l" { synerr( "missing }" ); BEGIN(SECT2); ++linenum; return ( '}' ); } YY_BREAK case 90: # line 417 "scan.l" synerr( "bad name in {}'s" ); BEGIN(SECT2); YY_BREAK case 91: # line 418 "scan.l" synerr( "missing }" ); ++linenum; BEGIN(SECT2); YY_BREAK case 92: # line 421 "scan.l" bracelevel = 0; YY_BREAK case 93: # line 422 "scan.l" { ACTION_ECHO; CHECK_REJECT(yytext); } YY_BREAK case 94: # line 426 "scan.l" { ACTION_ECHO; CHECK_YYMORE(yytext); } YY_BREAK case 95: # line 430 "scan.l" ACTION_ECHO; YY_BREAK case 96: # line 431 "scan.l" { ++linenum; ACTION_ECHO; if ( bracelevel == 0 || (doing_codeblock && indented_code) ) { if ( ! doing_codeblock ) fputs( "\tYY_BREAK\n", temp_action_file ); doing_codeblock = false; BEGIN(SECT2); } } YY_BREAK /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ case 97: # line 447 "scan.l" ACTION_ECHO; ++bracelevel; YY_BREAK case 98: # line 448 "scan.l" ACTION_ECHO; --bracelevel; YY_BREAK case 99: # line 449 "scan.l" ACTION_ECHO; YY_BREAK case 100: # line 450 "scan.l" ACTION_ECHO; YY_BREAK case 101: # line 451 "scan.l" ACTION_ECHO; BEGIN(ACTION_COMMENT); YY_BREAK case 102: # line 452 "scan.l" ACTION_ECHO; /* character constant */ YY_BREAK case 103: # line 453 "scan.l" ACTION_ECHO; BEGIN(ACTION_STRING); YY_BREAK case 104: # line 454 "scan.l" { ++linenum; ACTION_ECHO; if ( bracelevel == 0 ) { fputs( "\tYY_BREAK\n", temp_action_file ); BEGIN(SECT2); } } YY_BREAK case 105: # line 463 "scan.l" ACTION_ECHO; YY_BREAK case 106: # line 465 "scan.l" ACTION_ECHO; BEGIN(ACTION); YY_BREAK case 107: # line 466 "scan.l" ACTION_ECHO; YY_BREAK case 108: # line 467 "scan.l" ACTION_ECHO; YY_BREAK case 109: # line 468 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case 110: # line 469 "scan.l" ACTION_ECHO; YY_BREAK case 111: # line 471 "scan.l" ACTION_ECHO; YY_BREAK case 112: # line 472 "scan.l" ACTION_ECHO; YY_BREAK case 113: # line 473 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case 114: # line 474 "scan.l" ACTION_ECHO; BEGIN(ACTION); YY_BREAK case 115: # line 475 "scan.l" ACTION_ECHO; YY_BREAK case YY_STATE_EOF(ACTION): case YY_STATE_EOF(ACTION_COMMENT): case YY_STATE_EOF(ACTION_STRING): # line 477 "scan.l" { synerr( "EOF encountered inside an action" ); yyterminate(); } YY_BREAK case 117: # line 483 "scan.l" { yylval = myesc( yytext ); return ( CHAR ); } YY_BREAK case 118: # line 488 "scan.l" { yylval = myesc( yytext ); BEGIN(CCL); return ( CHAR ); } YY_BREAK case 119: # line 495 "scan.l" ECHO; YY_BREAK case 120: # line 496 "scan.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(SECT2): case YY_STATE_EOF(SECT3): case YY_STATE_EOF(CODEBLOCK): case YY_STATE_EOF(PICKUPDEF): case YY_STATE_EOF(SC): case YY_STATE_EOF(CARETISBOL): case YY_STATE_EOF(NUM): case YY_STATE_EOF(QUOTE): case YY_STATE_EOF(FIRSTCCL): case YY_STATE_EOF(CCL): case YY_STATE_EOF(RECOVER): case YY_STATE_EOF(BRACEERROR): case YY_STATE_EOF(C_COMMENT): case YY_STATE_EOF(PERCENT_BRACE_ACTION): case YY_STATE_EOF(USED_LIST): case YY_STATE_EOF(CODEBLOCK_2): case YY_STATE_EOF(XLATION): yyterminate(); case YY_END_OF_BUFFER: { /* amount of text matched not including the EOB char */ int yy_amount_of_matched_text = yy_cp - yytext - 1; /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; /* note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the end- * of-buffer state). Contrast this with the test in yyinput(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ { yy_state_type yy_next_state; yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* okay, we're now positioned to make the * NUL transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we * don't want to build jamming into it because * then it will run more slowly) */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext + YY_MORE_ADJ; if ( yy_next_state ) { /* consume the NUL */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* note: because we've taken care in * yy_get_next_buffer() to have set up yytext, * we can now set up yy_c_buf_p so that if some * total hoser (like flex itself) wants * to call the scanner after we return the * YY_NULL, it'll still work - another YY_NULL * will get returned. */ yy_c_buf_p = yytext + YY_MORE_ADJ; yy_act = YY_STATE_EOF((yy_start - 1) / 2); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_find_action; } break; } default: #ifdef FLEX_DEBUG printf( "action # %d\n", yy_act ); #endif YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } } } /* yy_get_next_buffer - try to read in a new buffer * * synopsis * int yy_get_next_buffer(); * * returns a code representing an action * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); /* try to read more data */ /* first move last chars to start of buffer */ number_to_move = yy_c_buf_p - yytext; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; else if ( num_to_read <= 0 ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); /* read in more data */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); } if ( yy_n_chars == 0 ) { if ( number_to_move == 1 ) { ret_val = EOB_ACT_END_OF_FILE; yy_current_buffer->yy_eof_status = EOF_DONE; } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_eof_status = EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; /* yytext begins at the second character in yy_ch_buf; the first * character is the one which preceded it before reading in the latest * buffer; it needs to be kept around in case it's a newline, so * yy_get_previous_state() will have with '^' rules active */ yytext = &yy_current_buffer->yy_ch_buf[1]; return ( ret_val ); } /* yy_get_previous_state - get the state just before the EOB char was reached * * synopsis * yy_state_type yy_get_previous_state(); */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register YY_CHAR *yy_cp; register YY_CHAR *yy_bp = yytext; yy_current_state = yy_start; if ( yy_bp[-1] == '\n' ) ++yy_current_state; for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[*yy_cp] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return ( yy_current_state ); } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) register yy_state_type yy_current_state; #endif { register int yy_is_jam; register YY_CHAR *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 340); return ( yy_is_jam ? 0 : yy_current_state ); } #ifdef YY_USE_PROTOS static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) #else static void yyunput( c, yy_bp ) YY_CHAR c; register YY_CHAR *yy_bp; #endif { register YY_CHAR *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ register YY_CHAR *dest = &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; register YY_CHAR *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += dest - source; yy_bp += dest - source; yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) yy_cp[-2] = '\n'; *--yy_cp = c; /* note: the formal parameter *must* be called "yy_bp" for this * macro to now work correctly */ YY_DO_BEFORE_ACTION; /* set up yytext again */ } #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; YY_CHAR *yy_cp = yy_c_buf_p; *yy_cp = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext + YY_MORE_ADJ; return ( EOF ); } YY_NEW_FILE; #ifdef __cplusplus return ( yyinput() ); #else return ( input() ); #endif } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *yy_c_buf_p; yy_hold_char = *++yy_c_buf_p; return ( c ); } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* flush out information for old buffer */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* we don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); yy_init_buffer( b, file ); return ( b ); } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; free( (char *) b->yy_ch_buf ); free( (char *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { b->yy_input_file = file; /* we put in the '\n' and start reading from [1] so that an * initial match-at-newline will be true. */ b->yy_ch_buf[0] = '\n'; b->yy_n_chars = 1; /* we always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[1]; b->yy_eof_status = EOF_NOT_SEEN; } # line 496 "scan.l" int yywrap() { if ( --num_input_files > 0 ) { set_input_file( *++input_files ); return ( 0 ); } else return ( 1 ); } /* set_input_file - open the given file (if NULL, stdin) for scanning */ void set_input_file( file ) char *file; { if ( file ) { infilename = file; yyin = fopen( infilename, "r" ); if ( yyin == NULL ) lerrsf( "can't open %s", file ); } else { yyin = stdin; infilename = "<stdin>"; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* libmain - flex run-time support library "main" function */ /* $Header: /usr/fsys/odin/a/vern/flex/RCS/libmain.c,v 1.2 90/05/26 16:50:08 vern Exp $ */ extern int yylex(); int main( argc, argv ) int argc; char *argv[]; { return yylex(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* flex - tool to generate fast lexical analyzers */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1990 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/main.c,v 2.9 90/06/27 23:48:24 vern Exp $ (LBL)"; #endif #include "flexdef.h" static char flex_version[] = "2.3"; /* declare functions that have forward references */ void flexinit PROTO((int, char**)); void readin PROTO(()); void set_up_initial_allocations PROTO(()); /* these globals are all defined and commented in flexdef.h */ int printstats, syntaxerror, eofseen, ddebug, trace, spprdflt; int interactive, caseins, useecs, fulltbl, usemecs; int fullspd, gen_line_dirs, performance_report, backtrack_report, csize; int yymore_used, reject, real_reject, continued_action; int yymore_really_used, reject_really_used; int datapos, dataline, linenum; FILE *skelfile = NULL; char *infilename = NULL; int onestate[ONE_STACK_SIZE], onesym[ONE_STACK_SIZE]; int onenext[ONE_STACK_SIZE], onedef[ONE_STACK_SIZE], onesp; int current_mns, num_rules, current_max_rules, lastnfa; int *firstst, *lastst, *finalst, *transchar, *trans1, *trans2; int *accptnum, *assoc_rule, *state_type, *rule_type, *rule_linenum; int current_state_type; int variable_trailing_context_rules; int numtemps, numprots, protprev[MSP], protnext[MSP], prottbl[MSP]; int protcomst[MSP], firstprot, lastprot, protsave[PROT_SAVE_SIZE]; int numecs, nextecm[CSIZE + 1], ecgroup[CSIZE + 1], nummecs, tecfwd[CSIZE + 1]; int tecbck[CSIZE + 1]; int *xlation = (int *) 0; int num_xlations; int lastsc, current_max_scs, *scset, *scbol, *scxclu, *sceof, *actvsc; char **scname; int current_max_dfa_size, current_max_xpairs; int current_max_template_xpairs, current_max_dfas; int lastdfa, *nxt, *chk, *tnxt; int *base, *def, *nultrans, NUL_ec, tblend, firstfree, **dss, *dfasiz; union dfaacc_union *dfaacc; int *accsiz, *dhash, numas; int numsnpairs, jambase, jamstate; int lastccl, current_maxccls, *cclmap, *ccllen, *cclng, cclreuse; int current_max_ccl_tbl_size; Char *ccltbl; char *starttime, *endtime, nmstr[MAXLINE]; int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; int num_backtracking, bol_needed; FILE *temp_action_file; FILE *backtrack_file; int end_of_buffer_state; char *action_file_name = NULL; char **input_files; int num_input_files; char *program_name; #ifndef SHORT_FILE_NAMES static char *outfile = "lex.yy.c"; #else static char *outfile = "lexyy.c"; #endif static int outfile_created = 0; static int use_stdout; static char *skelname = NULL; int main( argc, argv ) int argc; char **argv; { flexinit( argc, argv ); readin(); if ( syntaxerror ) flexend( 1 ); if ( yymore_really_used == REALLY_USED ) yymore_used = true; else if ( yymore_really_used == REALLY_NOT_USED ) yymore_used = false; if ( reject_really_used == REALLY_USED ) reject = true; else if ( reject_really_used == REALLY_NOT_USED ) reject = false; if ( performance_report ) { if ( interactive ) fprintf( stderr, "-I (interactive) entails a minor performance penalty\n" ); if ( yymore_used ) fprintf( stderr, "yymore() entails a minor performance penalty\n" ); if ( reject ) fprintf( stderr, "REJECT entails a large performance penalty\n" ); if ( variable_trailing_context_rules ) fprintf( stderr, "Variable trailing context rules entail a large performance penalty\n" ); } if ( reject ) real_reject = true; if ( variable_trailing_context_rules ) reject = true; if ( (fulltbl || fullspd) && reject ) { if ( real_reject ) flexerror( "REJECT cannot be used with -f or -F" ); else flexerror( "variable trailing context rules cannot be used with -f or -F" ); } ntod(); /* generate the C state transition tables from the DFA */ make_tables(); /* note, flexend does not return. It exits with its argument as status. */ flexend( 0 ); /*NOTREACHED*/ } /* flexend - terminate flex * * synopsis * int status; * flexend( status ); * * status is exit status. * * note * This routine does not return. */ void flexend( status ) int status; { int tblsiz; char *flex_gettime(); if ( skelfile != NULL ) { if ( ferror( skelfile ) ) flexfatal( "error occurred when writing skeleton file" ); else if ( fclose( skelfile ) ) flexfatal( "error occurred when closing skeleton file" ); } if ( temp_action_file ) { if ( ferror( temp_action_file ) ) flexfatal( "error occurred when writing temporary action file" ); else if ( fclose( temp_action_file ) ) flexfatal( "error occurred when closing temporary action file" ); else if ( unlink( action_file_name ) ) flexfatal( "error occurred when deleting temporary action file" ); } if ( status != 0 && outfile_created ) { if ( ferror( stdout ) ) flexfatal( "error occurred when writing output file" ); else if ( fclose( stdout ) ) flexfatal( "error occurred when closing output file" ); else if ( unlink( outfile ) ) flexfatal( "error occurred when deleting output file" ); } if ( backtrack_report && backtrack_file ) { if ( num_backtracking == 0 ) fprintf( backtrack_file, "No backtracking.\n" ); else if ( fullspd || fulltbl ) fprintf( backtrack_file, "%d backtracking (non-accepting) states.\n", num_backtracking ); else fprintf( backtrack_file, "Compressed tables always backtrack.\n" ); if ( ferror( backtrack_file ) ) flexfatal( "error occurred when writing backtracking file" ); else if ( fclose( backtrack_file ) ) flexfatal( "error occurred when closing backtracking file" ); } if ( printstats ) { endtime = flex_gettime(); fprintf( stderr, "%s version %s usage statistics:\n", program_name, flex_version ); fprintf( stderr, " started at %s, finished at %s\n", starttime, endtime ); fprintf( stderr, " scanner options: -" ); if ( backtrack_report ) putc( 'b', stderr ); if ( ddebug ) putc( 'd', stderr ); if ( interactive ) putc( 'I', stderr ); if ( caseins ) putc( 'i', stderr ); if ( ! gen_line_dirs ) putc( 'L', stderr ); if ( performance_report ) putc( 'p', stderr ); if ( spprdflt ) putc( 's', stderr ); if ( use_stdout ) putc( 't', stderr ); if ( trace ) putc( 'T', stderr ); if ( printstats ) putc( 'v', stderr ); /* always true! */ if ( csize == 256 ) putc( '8', stderr ); fprintf( stderr, " -C" ); if ( fulltbl ) putc( 'f', stderr ); if ( fullspd ) putc( 'F', stderr ); if ( useecs ) putc( 'e', stderr ); if ( usemecs ) putc( 'm', stderr ); if ( strcmp( skelname, DEFAULT_SKELETON_FILE ) ) fprintf( stderr, " -S%s", skelname );C��C��C��C��C��C��C��C��C��C��C��C��C�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� putc( '\n', stderr ); fprintf( stderr, " %d/%d NFA states\n", lastnfa, current_mns ); fprintf( stderr, " %d/%d DFA states (%d words)\n", lastdfa, current_max_dfas, totnst ); fprintf( stderr, " %d rules\n", num_rules - 1 /* - 1 for def. rule */ ); if ( num_backtracking == 0 ) fprintf( stderr, " No backtracking\n" ); else if ( fullspd || fulltbl ) fprintf( stderr, " %d backtracking (non-accepting) states\n", num_backtracking ); else fprintf( stderr, " compressed tables always backtrack\n" ); if ( bol_needed ) fprintf( stderr, " Beginning-of-line patterns used\n" ); fprintf( stderr, " %d/%d start conditions\n", lastsc, current_max_scs ); fprintf( stderr, " %d epsilon states, %d double epsilon states\n", numeps, eps2 ); if ( lastccl == 0 ) fprintf( stderr, " no character classes\n" ); else fprintf( stderr, " %d/%d character classes needed %d/%d words of storage, %d reused\n", lastccl, current_maxccls, cclmap[lastccl] + ccllen[lastccl], current_max_ccl_tbl_size, cclreuse ); fprintf( stderr, " %d state/nextstate pairs created\n", numsnpairs ); fprintf( stderr, " %d/%d unique/duplicate transitions\n", numuniq, numdup ); if ( fulltbl ) { tblsiz = lastdfa * numecs; fprintf( stderr, " %d table entries\n", tblsiz ); } else { tblsiz = 2 * (lastdfa + numtemps) + 2 * tblend; fprintf( stderr, " %d/%d base-def entries created\n", lastdfa + numtemps, current_max_dfas ); fprintf( stderr, " %d/%d (peak %d) nxt-chk entries created\n", tblend, current_max_xpairs, peakpairs ); fprintf( stderr, " %d/%d (peak %d) template nxt-chk entries created\n", numtemps * nummecs, current_max_template_xpairs, numtemps * numecs ); fprintf( stderr, " %d empty table entries\n", nummt ); fprintf( stderr, " %d protos created\n", numprots ); fprintf( stderr, " %d templates created, %d uses\n", numtemps, tmpuses ); } if ( useecs ) { tblsiz = tblsiz + csize; fprintf( stderr, " %d/%d equivalence classes created\n", numecs, csize ); } if ( usemecs ) { tblsiz = tblsiz + numecs; fprintf( stderr, " %d/%d meta-equivalence classes created\n", nummecs, csize ); } fprintf( stderr, " %d (%d saved) hash collisions, %d DFAs equal\n", hshcol, hshsave, dfaeql ); fprintf( stderr, " %d sets of reallocations needed\n", num_reallocs ); fprintf( stderr, " %d total table entries needed\n", tblsiz ); } #ifndef VMS exit( status ); #else exit( status + 1 ); #endif } /* flexinit - initialize flex * * synopsis * int argc; * char **argv; * flexinit( argc, argv ); */ void flexinit( argc, argv ) int argc; char **argv; { int i, sawcmpflag; char *arg, *flex_gettime(), *mktemp(); printstats = syntaxerror = trace = spprdflt = interactive = caseins = false; backtrack_report = performance_report = ddebug = fulltbl = fullspd = false; yymore_used = continued_action = reject = false; yymore_really_used = reject_really_used = false; gen_line_dirs = usemecs = useecs = true; sawcmpflag = false; use_stdout = false; csize = DEFAULT_CSIZE; program_name = argv[0]; /* read flags */ for ( --argc, ++argv; argc ; --argc, ++argv ) { if ( argv[0][0] != '-' || argv[0][1] == '\0' ) break; arg = argv[0]; for ( i = 1; arg[i] != '\0'; ++i ) switch ( arg[i] ) { case 'b': backtrack_report = true; break; case 'c': fprintf( stderr, "%s: Assuming use of deprecated -c flag is really intended to be -C\n", program_name ); /* fall through */ case 'C': if ( i != 1 ) flexerror( "-C flag must be given separately" ); if ( ! sawcmpflag ) { useecs = false; usemecs = false; fulltbl = false; sawcmpflag = true; } for ( ++i; arg[i] != '\0'; ++i ) switch ( arg[i] ) { case 'e': useecs = true; break; case 'F': fullspd = true; break; case 'f': fulltbl = true; break; case 'm': usemecs = true; break; default: lerrif( "unknown -C option '%c'", (int) arg[i] ); break; } goto get_next_arg; case 'd': ddebug = true; break; case 'f': useecs = usemecs = false; fulltbl = true; break; case 'F': useecs = usemecs = false; fullspd = true; break; case 'I': interactive = true; break; case 'i': caseins = true; break; case 'L': gen_line_dirs = false; break; case 'n': /* stupid do-nothing deprecated option */ break; case 'p': performance_report = true; break; case 'S': if ( i != 1 ) flexerror( "-S flag must be given separately" ); skelname = arg + i + 1; goto get_next_arg; case 's': spprdflt = true; break; case 't': use_stdout = true; break; case 'T': trace = true; break; case 'v': printstats = true; break; case '8': csize = CSIZE; break; default: lerrif( "unknown flag '%c'", (int) arg[i] ); break; } get_next_arg: /* used by -C and -S flags in lieu of a "continue 2" control */ ; } if ( (fulltbl || fullspd) && usemecs ) flexerror( "full table and -Cm don't make sense together" ); if ( (fulltbl || fullspd) && interactive ) flexerror( "full table and -I are (currently) incompatible" ); if ( fulltbl && fullspd ) flexerror( "full table and -F are mutually exclusive" ); if ( ! skelname ) { static char skeleton_name_storage[400]; skelname = skeleton_name_storage; (void) strcpy( skelname, DEFAULT_SKELETON_FILE ); } if ( ! use_stdout ) { FILE *prev_stdout = freopen( outfile, "w", stdout ); if ( prev_stdout == NULL ) lerrsf( "could not create %s", outfile ); outfile_created = 1; } num_input_files = argc; input_files = argv; set_input_file( num_input_files > 0 ? input_files[0] : NULL ); if ( backtrack_report ) { #ifndef SHORT_FILE_NAMES backtrack_file = fopen( "lex.backtrack", "w" ); #else backtrack_file = fopen( "lex.bck", "w" ); #endif if ( backtrack_file == NULL ) flexerror( "could not create lex.backtrack" ); } else backtrack_file = NULL; lastccl = 0; lastsc = 0; /* initialize the statistics */ starttime = flex_gettime(); if ( (skelfile = fopen( skelname, "r" )) == NULL ) lerrsf( "can't open skeleton file %s", skelname ); #ifdef SYS_V action_file_name = tmpnam( NULL ); #endif if ( action_file_name == NULL ) { static char temp_action_file_name[32]; #ifndef SHORT_FILE_NAMES (void) strcpy( temp_action_file_name, "/tmp/flexXXXXXX" ); #else (void) strcpy( temp_action_file_name, "flexXXXXXX.tmp" ); #endif (void) mktemp( temp_action_file_name ); action_file_name = temp_action_file_name; } if ( (temp_action_file = fopen( action_file_name, "w" )) == NULL ) lerrsf( "can't open temporary action file %s", action_file_name ); lastdfa = lastnfa = num_rules = numas = numsnpairs = tmpuses = 0; numecs = numeps = eps2 = num_reallocs = hshcol = dfaeql = totnst = 0; numuniq = numdup = hshsave = eofseen = datapos = dataline = 0; num_backtracking = onesp = numprots = 0; variable_trailing_context_rules = bol_needed = false; linenum = sectnum = 1; firstprot = NIL; /* used in mkprot() so that the first proto goes in slot 1 * of the proto queue */ lastprot = 1; if ( useecs ) { /* set up doubly-linked equivalence classes */ /* We loop all the way up to csize, since ecgroup[csize] is the * position used for NUL characters */ ecgroup[1] = NIL; for ( i = 2; i <= csize; ++i ) { ecgroup[i] = i - 1; nextecm[i - 1] = i; } nextecm[csize] = NIL; } else { /* put everything in its own equivalence class */ for ( i = 1; i <= csize; ++i ) { ecgroup[i] = i; nextecm[i] = BAD_SUBSCRIPT; /* to catch errors */ } } set_up_initial_allocations(); } /* readin - read in the rules section of the input file(s) * * synopsis * readin(); */ void readin() { skelout(); if ( ddebug ) puts( "#define FLEX_DEBUG" ); if ( csize == 256 ) puts( "#define YY_CHAR unsigned char" ); else puts( "#define YY_CHAR char" ); line_directive_out( stdout ); if ( yyparse() ) { pinpoint_message( "fatal parse error" ); flexend( 1 ); } if ( xlation ) { numecs = ecs_from_xlation( ecgroup ); useecs = true; } else if ( useecs ) numecs = cre8ecs( nextecm, ecgroup, csize ); else numecs = csize; /* now map the equivalence class for NUL to its expected place */ ecgroup[0] = ecgroup[csize]; NUL_ec = abs( ecgroup[0] ); if ( useecs ) ccl2ecl(); } /* set_up_initial_allocations - allocate memory for internal tables */ void set_up_initial_allocations() { current_mns = INITIAL_MNS; firstst = allocate_integer_array( current_mns ); lastst = allocate_integer_array( current_mns ); finalst = allocate_integer_array( current_mns ); transchar = allocate_integer_array( current_mns ); trans1 = allocate_integer_array( current_mns ); trans2 = allocate_integer_array( current_mns ); accptnum = allocate_integer_array( current_mns ); assoc_rule = allocate_integer_array( current_mns ); state_type = allocate_integer_array( current_mns ); current_max_rules = INITIAL_MAX_RULES; rule_type = allocate_integer_array( current_max_rules ); rule_linenum = allocate_integer_array( current_max_rules ); current_max_scs = INITIAL_MAX_SCS; scset = allocate_integer_array( current_max_scs ); scbol = allocate_integer_array( current_max_scs ); scxclu = allocate_integer_array( current_max_scs ); sceof = allocate_integer_array( current_max_scs ); scname = allocate_char_ptr_array( current_max_scs ); actvsc = allocate_integer_array( current_max_scs ); current_maxccls = INITIAL_MAX_CCLS; cclmap = allocate_integer_array( current_maxccls ); ccllen = allocate_integer_array( current_maxccls ); cclng = allocate_integer_array( current_maxccls ); current_max_ccl_tbl_size = INITIAL_MAX_CCL_TBL_SIZE; ccltbl = allocate_character_array( current_max_ccl_tbl_size ); current_max_dfa_size = INITIAL_MAX_DFA_SIZE; current_max_xpairs = INITIAL_MAX_XPAIRS; nxt = allocate_integer_array( current_max_xpairs ); chk = allocate_integer_array( current_max_xpairs ); current_max_template_xpairs = INITIAL_MAX_TEMPLATE_XPAIRS; tnxt = allocate_integer_array( current_max_template_xpairs ); current_max_dfas = INITIAL_MAX_DFAS; base = allocate_integer_array( current_max_dfas ); def = allocate_integer_array( current_max_dfas ); dfasiz = allocate_integer_array( current_max_dfas ); accsiz = allocate_integer_array( current_max_dfas ); dhash = allocate_integer_array( current_max_dfas ); dss = allocate_int_ptr_array( current_max_dfas ); dfaacc = allocate_dfaacc_union( current_max_dfas ); nultrans = (int *) 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* misc - miscellaneous flex routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/misc.c,v 2.9 90/08/14 00:10:24 vern Exp $ (LBL)"; #endif #include <ctype.h> #include "flexdef.h" /* ANSI C does not guarantee that isascii() is defined */ #ifndef isascii #define isascii(c) ((c) <= 0177) #endif /* declare functions that have forward references */ void dataflush PROTO(()); int otoi PROTO((Char [])); /* action_out - write the actions from the temporary file to lex.yy.c * * synopsis * action_out(); * * Copies the action file up to %% (or end-of-file) to lex.yy.c */ void action_out() { char buf[MAXLINE]; while ( fgets( buf, MAXLINE, temp_action_file ) != NULL ) if ( buf[0] == '%' && buf[1] == '%' ) break; else fputs( buf, stdout ); } /* allocate_array - allocate memory for an integer array of the given size */ void *allocate_array( size, element_size ) int size, element_size; { register void *mem; /* on 16-bit int machines (e.g., 80286) we might be trying to * allocate more than a signed int can hold, and that won't * work. Cheap test: */ if ( element_size * size <= 0 ) flexfatal( "request for < 1 byte in allocate_array()" ); mem = (void *) malloc( (unsigned) (element_size * size) ); if ( mem == NULL ) flexfatal( "memory allocation failed in allocate_array()" ); return ( mem ); } /* all_lower - true if a string is all lower-case * * synopsis: * Char *str; * int all_lower(); * true/false = all_lower( str ); */ int all_lower( str ) register Char *str; { while ( *str ) { if ( ! isascii( *str ) || ! islower( *str ) ) return ( 0 ); ++str; } return ( 1 ); } /* all_upper - true if a string is all upper-case * * synopsis: * Char *str; * int all_upper(); * true/false = all_upper( str ); */ int all_upper( str ) register Char *str; { while ( *str ) { if ( ! isascii( *str ) || ! isupper( (char) *str ) ) return ( 0 ); ++str; } return ( 1 ); } /* bubble - bubble sort an integer array in increasing order * * synopsis * int v[n], n; * bubble( v, n ); * * description * sorts the first n elements of array v and replaces them in * increasing order. * * passed * v - the array to be sorted * n - the number of elements of 'v' to be sorted */ void bubble( v, n ) int v[], n; { register int i, j, k; for ( i = n; i > 1; --i ) for ( j = 1; j < i; ++j ) if ( v[j] > v[j + 1] ) /* compare */ { k = v[j]; /* exchange */ v[j] = v[j + 1]; v[j + 1] = k; } } /* clower - replace upper-case letter to lower-case * * synopsis: * Char clower(); * int c; * c = clower( c ); */ Char clower( c ) register int c; { return ( (isascii( c ) && isupper( c )) ? tolower( c ) : c ); } /* copy_string - returns a dynamically allocated copy of a string * * synopsis * char *str, *copy, *copy_string(); * copy = copy_string( str ); */ char *copy_string( str ) register char *str; { register char *c; char *copy; /* find length */ for ( c = str; *c; ++c ) ; copy = malloc( (unsigned) ((c - str + 1) * sizeof( char )) ); if ( copy == NULL ) flexfatal( "dynamic memory failure in copy_string()" ); for ( c = copy; (*c++ = *str++); ) ; return ( copy ); } /* copy_unsigned_string - * returns a dynamically allocated copy of a (potentially) unsigned string * * synopsis * Char *str, *copy, *copy_unsigned_string(); * copy = copy_unsigned_string( str ); */ Char *copy_unsigned_string( str ) register Char *str; { register Char *c; Char *copy; /* find length */ for ( c = str; *c; ++c ) ; copy = (Char *) malloc( (unsigned) ((c - str + 1) * sizeof( Char )) ); if ( copy == NULL ) flexfatal( "dynamic memory failure in copy_unsigned_string()" ); for ( c = copy; (*c++ = *str++); ) ; return ( copy ); } /* cshell - shell sort a character array in increasing order * * synopsis * * Char v[n]; * int n, special_case_0; * cshell( v, n, special_case_0 ); * * description * does a shell sort of the first n elements of array v. * If special_case_0 is true, then any element equal to 0 * is instead assumed to have infinite weight. * * passed * v - array to be sorted * n - number of elements of v to be sorted */ void cshell( v, n, special_case_0 ) Char v[]; int n, special_case_0; { int gap, i, j, jg; Char k; for ( gap = n / 2; gap > 0; gap = gap / 2 ) for ( i = gap; i < n; ++i ) for ( j = i - gap; j >= 0; j = j - gap ) { jg = j + gap; if ( special_case_0 ) { if ( v[jg] == 0 ) break; else if ( v[j] != 0 && v[j] <= v[jg] ) break; } else if ( v[j] <= v[jg] ) break; k = v[j]; v[j] = v[jg]; v[jg] = k; } } /* dataend - finish up a block of data declarations * * synopsis * dataend(); */ void dataend() { if ( datapos > 0 ) dataflush(); /* add terminator for initialization */ puts( " } ;\n" ); dataline = 0; datapos = 0; } /* dataflush - flush generated data statements * * synopsis * dataflush(); */ void dataflush() { putchar( '\n' ); if ( ++dataline >= NUMDATALINES ) { /* put out a blank line so that the table is grouped into * large blocks that enable the user to find elements easily */ putchar( '\n' ); dataline = 0; } /* reset the number of characters written on the current line */ datapos = 0; } /* flexerror - report an error message and terminate * * synopsis * char msg[]; * flexerror( msg ); */ void flexerror( msg ) char msg[]; { fprintf( stderr, "%s: %s\n", program_name, msg ); flexend( 1 ); } /* flexfatal - report a fatal error message and terminate * * synopsis * char msg[]; * flexfatal( msg ); */ void flexfatal( msg ) char msg[]; { fprintf( stderr, "%s: fatal internal error, %s\n", program_name, msg ); flexend( 1 ); } /* flex_gettime - return current time * * synopsis * char *flex_gettime(), *time_str; * time_str = flex_gettime(); * * note * the routine name has the "flex_" prefix because of name clashes * with Turbo-C */ /* include sys/types.h to use time_t and make lint happy */ #ifndef MS_DOS #ifndef VMS #include <sys/types.h> #else #include <types.h> #endif #endif #ifdef MS_DOS #include <time.h> typedef long time_t; #endif char *flex_gettime() { time_t t, time(); char *result, *ctime(), *copy_string(); t = time( (long *) 0 ); result = copy_string( ctime( &t ) ); /* get rid of trailing newline */ result[24] = '\0'; return ( result ); } /* lerrif - report an error message formaC��C��C��C��C��C��C��C����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tted with one integer argument * * synopsis * char msg[]; * int arg; * lerrif( msg, arg ); */ void lerrif( msg, arg ) char msg[]; int arg; { char errmsg[MAXLINE]; (void) sprintf( errmsg, msg, arg ); flexerror( errmsg ); } /* lerrsf - report an error message formatted with one string argument * * synopsis * char msg[], arg[]; * lerrsf( msg, arg ); */ void lerrsf( msg, arg ) char msg[], arg[]; { char errmsg[MAXLINE]; (void) sprintf( errmsg, msg, arg ); flexerror( errmsg ); } /* htoi - convert a hexadecimal digit string to an integer value * * synopsis: * int val, htoi(); * Char str[]; * val = htoi( str ); */ int htoi( str ) Char str[]; { int result; (void) sscanf( (char *) str, "%x", &result ); return ( result ); } /* is_hex_digit - returns true if a character is a valid hex digit, false * otherwise * * synopsis: * int true_or_false, is_hex_digit(); * int ch; * val = is_hex_digit( ch ); */ int is_hex_digit( ch ) int ch; { if ( isdigit( ch ) ) return ( 1 ); switch ( clower( ch ) ) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': return ( 1 ); default: return ( 0 ); } } /* line_directive_out - spit out a "# line" statement */ void line_directive_out( output_file_name ) FILE *output_file_name; { if ( infilename && gen_line_dirs ) fprintf( output_file_name, "# line %d \"%s\"\n", linenum, infilename ); } /* mk2data - generate a data statement for a two-dimensional array * * synopsis * int value; * mk2data( value ); * * generates a data statement initializing the current 2-D array to "value" */ void mk2data( value ) int value; { if ( datapos >= NUMDATAITEMS ) { putchar( ',' ); dataflush(); } if ( datapos == 0 ) /* indent */ fputs( " ", stdout ); else putchar( ',' ); ++datapos; printf( "%5d", value ); } /* mkdata - generate a data statement * * synopsis * int value; * mkdata( value ); * * generates a data statement initializing the current array element to * "value" */ void mkdata( value ) int value; { if ( datapos >= NUMDATAITEMS ) { putchar( ',' ); dataflush(); } if ( datapos == 0 ) /* indent */ fputs( " ", stdout ); else putchar( ',' ); ++datapos; printf( "%5d", value ); } /* myctoi - return the integer represented by a string of digits * * synopsis * Char array[]; * int val, myctoi(); * val = myctoi( array ); * */ int myctoi( array ) Char array[]; { int val = 0; (void) sscanf( (char *) array, "%d", &val ); return ( val ); } /* myesc - return character corresponding to escape sequence * * synopsis * Char array[], c, myesc(); * c = myesc( array ); * */ Char myesc( array ) Char array[]; { Char c, esc_char; register int sptr; switch ( array[1] ) { case 'a': return ( '\a' ); case 'b': return ( '\b' ); case 'f': return ( '\f' ); case 'n': return ( '\n' ); case 'r': return ( '\r' ); case 't': return ( '\t' ); case 'v': return ( '\v' ); case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* \<octal> */ sptr = 1; while ( isascii( array[sptr] ) && isdigit( array[sptr] ) ) /* don't increment inside loop control because if * isdigit() is a macro it might expand into multiple * increments ... */ ++sptr; c = array[sptr]; array[sptr] = '\0'; esc_char = otoi( array + 1 ); array[sptr] = c; return ( esc_char ); } case 'x': { /* \x<hex> */ int sptr = 2; while ( isascii( array[sptr] ) && is_hex_digit( array[sptr] ) ) /* don't increment inside loop control because if * isdigit() is a macro it might expand into multiple * increments ... */ ++sptr; c = array[sptr]; array[sptr] = '\0'; esc_char = htoi( array + 2 ); array[sptr] = c; return ( esc_char ); } default: return ( array[1] ); } } /* otoi - convert an octal digit string to an integer value * * synopsis: * int val, otoi(); * Char str[]; * val = otoi( str ); */ int otoi( str ) Char str[]; { int result; (void) sscanf( (char *) str, "%o", &result ); return ( result ); } /* readable_form - return the the human-readable form of a character * * synopsis: * int c; * char *readable_form(); * <string> = readable_form( c ); * * The returned string is in static storage. */ char *readable_form( c ) register int c; { static char rform[10]; if ( (c >= 0 && c < 32) || c >= 127 ) { switch ( c ) { case '\n': return ( "\\n" ); case '\t': return ( "\\t" ); case '\f': return ( "\\f" ); case '\r': return ( "\\r" ); case '\b': return ( "\\b" ); default: (void) sprintf( rform, "\\%.3o", c ); return ( rform ); } } else if ( c == ' ' ) return ( "' '" ); else { rform[0] = c; rform[1] = '\0'; return ( rform ); } } /* reallocate_array - increase the size of a dynamic array */ void *reallocate_array( array, size, element_size ) void *array; int size, element_size; { register void *new_array; /* same worry as in allocate_array(): */ if ( size * element_size <= 0 ) flexfatal( "attempt to increase array size by less than 1 byte" ); new_array = (void *) realloc( (char *)array, (unsigned) (size * element_size )); if ( new_array == NULL ) flexfatal( "attempt to increase array size failed" ); return ( new_array ); } /* skelout - write out one section of the skeleton file * * synopsis * skelout(); * * DESCRIPTION * Copies from skelfile to stdout until a line beginning with "%%" or * EOF is found. */ void skelout() { char buf[MAXLINE]; while ( fgets( buf, MAXLINE, skelfile ) != NULL ) if ( buf[0] == '%' && buf[1] == '%' ) break; else fputs( buf, stdout ); } /* transition_struct_out - output a yy_trans_info structure * * synopsis * int element_v, element_n; * transition_struct_out( element_v, element_n ); * * outputs the yy_trans_info structure with the two elements, element_v and * element_n. Formats the output with spaces and carriage returns. */ void transition_struct_out( element_v, element_n ) int element_v, element_n; { printf( "%7d, %5d,", element_v, element_n ); datapos += TRANS_STRUCT_PRINT_LENGTH; if ( datapos >= 75 ) { putchar( '\n' ); if ( ++dataline % 10 == 0 ) putchar( '\n' ); datapos = 0; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nfa - NFA construction routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/nfa.c,v 2.6 90/06/27 23:48:29 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* declare functions that have forward references */ int dupmachine PROTO((int)); void mkxtion PROTO((int, int)); /* add_accept - add an accepting state to a machine * * synopsis * * add_accept( mach, accepting_number ); * * accepting_number becomes mach's accepting number. */ void add_accept( mach, accepting_number ) int mach, accepting_number; { /* hang the accepting number off an epsilon state. if it is associated * with a state that has a non-epsilon out-transition, then the state * will accept BEFORE it makes that transition, i.e., one character * too soon */ if ( transchar[finalst[mach]] == SYM_EPSILON ) accptnum[finalst[mach]] = accepting_number; else { int astate = mkstate( SYM_EPSILON ); accptnum[astate] = accepting_number; mach = link_machines( mach, astate ); } } /* copysingl - make a given number of copies of a singleton machine * * synopsis * * newsng = copysingl( singl, num ); * * newsng - a new singleton composed of num copies of singl * singl - a singleton machine * num - the number of copies of singl to be present in newsng */ int copysingl( singl, num ) int singl, num; { int copy, i; copy = mkstate( SYM_EPSILON ); for ( i = 1; i <= num; ++i ) copy = link_machines( copy, dupmachine( singl ) ); return ( copy ); } /* dumpnfa - debugging routine to write out an nfa * * synopsis * int state1; * dumpnfa( state1 ); */ void dumpnfa( state1 ) int state1; { int sym, tsp1, tsp2, anum, ns; fprintf( stderr, "\n\n********** beginning dump of nfa with start state %d\n", state1 ); /* we probably should loop starting at firstst[state1] and going to * lastst[state1], but they're not maintained properly when we "or" * all of the rules together. So we use our knowledge that the machine * starts at state 1 and ends at lastnfa. */ /* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */ for ( ns = 1; ns <= lastnfa; ++ns ) { fprintf( stderr, "state # %4d\t", ns ); sym = transchar[ns]; tsp1 = trans1[ns]; tsp2 = trans2[ns]; anum = accptnum[ns]; fprintf( stderr, "%3d: %4d, %4d", sym, tsp1, tsp2 ); if ( anum != NIL ) fprintf( stderr, " [%d]", anum ); fprintf( stderr, "\n" ); } fprintf( stderr, "********** end of dump\n" ); } /* dupmachine - make a duplicate of a given machine * * synopsis * * copy = dupmachine( mach ); * * copy - holds duplicate of mach * mach - machine to be duplicated * * note that the copy of mach is NOT an exact duplicate; rather, all the * transition states values are adjusted so that the copy is self-contained, * as the original should have been. * * also note that the original MUST be contiguous, with its low and high * states accessible by the arrays firstst and lastst */ int dupmachine( mach ) int mach; { int i, init, state_offset; int state = 0; int last = lastst[mach]; for ( i = firstst[mach]; i <= last; ++i ) { state = mkstate( transchar[i] ); if ( trans1[i] != NO_TRANSITION ) { mkxtion( finalst[state], trans1[i] + state - i ); if ( transchar[i] == SYM_EPSILON && trans2[i] != NO_TRANSITION ) mkxtion( finalst[state], trans2[i] + state - i ); } accptnum[state] = accptnum[i]; } if ( state == 0 ) flexfatal( "empty machine in dupmachine()" ); state_offset = state - i + 1; init = mach + state_offset; firstst[init] = firstst[mach] + state_offset; finalst[init] = finalst[mach] + state_offset; lastst[init] = lastst[mach] + state_offset; return ( init ); } /* finish_rule - finish up the processing for a rule * * synopsis * * finish_rule( mach, variable_trail_rule, headcnt, trailcnt ); * * An accepting number is added to the given machine. If variable_trail_rule * is true then the rule has trailing context and both the head and trail * are variable size. Otherwise if headcnt or trailcnt is non-zero then * the machine recognizes a pattern with trailing context and headcnt is * the number of characters in the matched part of the pattern, or zero * if the matched part has variable length. trailcnt is the number of * trailing context characters in the pattern, or zero if the trailing * context has variable length. */ void finish_rule( mach, variable_trail_rule, headcnt, trailcnt ) int mach, variable_trail_rule, headcnt, trailcnt; { add_accept( mach, num_rules ); /* we did this in new_rule(), but it often gets the wrong * number because we do it before we start parsing the current rule */ rule_linenum[num_rules] = linenum; /* if this is a continued action, then the line-number has * already been updated, giving us the wrong number */ if ( continued_action ) --rule_linenum[num_rules]; fprintf( temp_action_file, "case %d:\n", num_rules ); if ( variable_trail_rule ) { rule_type[num_rules] = RULE_VARIABLE; if ( performance_report ) fprintf( stderr, "Variable trailing context rule at line %d\n", rule_linenum[num_rules] ); variable_trailing_context_rules = true; } else { rule_type[num_rules] = RULE_NORMAL; if ( headcnt > 0 || trailcnt > 0 ) { /* do trailing context magic to not match the trailing characters */ char *scanner_cp = "yy_c_buf_p = yy_cp"; char *scanner_bp = "yy_bp"; fprintf( temp_action_file, "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" ); if ( headcnt > 0 ) fprintf( temp_action_file, "%s = %s + %d;\n", scanner_cp, scanner_bp, headcnt ); else fprintf( temp_action_file, "%s -= %d;\n", scanner_cp, trailcnt ); fprintf( temp_action_file, "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" ); } } line_directive_out( temp_action_file ); } /* link_machines - connect two machines together * * synopsis * * new = link_machines( first, last ); * * new - a machine constructed by connecting first to last * first - the machine whose successor is to be last * last - the machine whose predecessor is to be first * * note: this routine concatenates the machine first with the machine * last to produce a machine new which will pattern-match first first * and then last, and will fail if either of the sub-patterns fails. * FIRST is set to new by the operation. last is unmolested. */ int link_machines( first, last ) int first, last; { if ( first == NIL ) return ( last ); else if ( last == NIL ) return ( first ); else { mkxtion( finalst[first], last ); finalst[first] = finalst[last]; lC��C��C��C��C��C��C��C��C��C��C����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������astst[first] = max( lastst[first], lastst[last] ); firstst[first] = min( firstst[first], firstst[last] ); return ( first ); } } /* mark_beginning_as_normal - mark each "beginning" state in a machine * as being a "normal" (i.e., not trailing context- * associated) states * * synopsis * * mark_beginning_as_normal( mach ) * * mach - machine to mark * * The "beginning" states are the epsilon closure of the first state */ void mark_beginning_as_normal( mach ) register int mach; { switch ( state_type[mach] ) { case STATE_NORMAL: /* oh, we've already visited here */ return; case STATE_TRAILING_CONTEXT: state_type[mach] = STATE_NORMAL; if ( transchar[mach] == SYM_EPSILON ) { if ( trans1[mach] != NO_TRANSITION ) mark_beginning_as_normal( trans1[mach] ); if ( trans2[mach] != NO_TRANSITION ) mark_beginning_as_normal( trans2[mach] ); } break; default: flexerror( "bad state type in mark_beginning_as_normal()" ); break; } } /* mkbranch - make a machine that branches to two machines * * synopsis * * branch = mkbranch( first, second ); * * branch - a machine which matches either first's pattern or second's * first, second - machines whose patterns are to be or'ed (the | operator) * * note that first and second are NEITHER destroyed by the operation. Also, * the resulting machine CANNOT be used with any other "mk" operation except * more mkbranch's. Compare with mkor() */ int mkbranch( first, second ) int first, second; { int eps; if ( first == NO_TRANSITION ) return ( second ); else if ( second == NO_TRANSITION ) return ( first ); eps = mkstate( SYM_EPSILON ); mkxtion( eps, first ); mkxtion( eps, second ); return ( eps ); } /* mkclos - convert a machine into a closure * * synopsis * new = mkclos( state ); * * new - a new state which matches the closure of "state" */ int mkclos( state ) int state; { return ( mkopt( mkposcl( state ) ) ); } /* mkopt - make a machine optional * * synopsis * * new = mkopt( mach ); * * new - a machine which optionally matches whatever mach matched * mach - the machine to make optional * * notes: * 1. mach must be the last machine created * 2. mach is destroyed by the call */ int mkopt( mach ) int mach; { int eps; if ( ! SUPER_FREE_EPSILON(finalst[mach]) ) { eps = mkstate( SYM_EPSILON ); mach = link_machines( mach, eps ); } /* can't skimp on the following if FREE_EPSILON(mach) is true because * some state interior to "mach" might point back to the beginning * for a closure */ eps = mkstate( SYM_EPSILON ); mach = link_machines( eps, mach ); mkxtion( mach, finalst[mach] ); return ( mach ); } /* mkor - make a machine that matches either one of two machines * * synopsis * * new = mkor( first, second ); * * new - a machine which matches either first's pattern or second's * first, second - machines whose patterns are to be or'ed (the | operator) * * note that first and second are both destroyed by the operation * the code is rather convoluted because an attempt is made to minimize * the number of epsilon states needed */ int mkor( first, second ) int first, second; { int eps, orend; if ( first == NIL ) return ( second ); else if ( second == NIL ) return ( first ); else { /* see comment in mkopt() about why we can't use the first state * of "first" or "second" if they satisfy "FREE_EPSILON" */ eps = mkstate( SYM_EPSILON ); first = link_machines( eps, first ); mkxtion( first, second ); if ( SUPER_FREE_EPSILON(finalst[first]) && accptnum[finalst[first]] == NIL ) { orend = finalst[first]; mkxtion( finalst[second], orend ); } else if ( SUPER_FREE_EPSILON(finalst[second]) && accptnum[finalst[second]] == NIL ) { orend = finalst[second]; mkxtion( finalst[first], orend ); } else { eps = mkstate( SYM_EPSILON ); first = link_machines( first, eps ); orend = finalst[first]; mkxtion( finalst[second], orend ); } } finalst[first] = orend; return ( first ); } /* mkposcl - convert a machine into a positive closure * * synopsis * new = mkposcl( state ); * * new - a machine matching the positive closure of "state" */ int mkposcl( state ) int state; { int eps; if ( SUPER_FREE_EPSILON(finalst[state]) ) { mkxtion( finalst[state], state ); return ( state ); } else { eps = mkstate( SYM_EPSILON ); mkxtion( eps, state ); return ( link_machines( state, eps ) ); } } /* mkrep - make a replicated machine * * synopsis * new = mkrep( mach, lb, ub ); * * new - a machine that matches whatever "mach" matched from "lb" * number of times to "ub" number of times * * note * if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach" */ int mkrep( mach, lb, ub ) int mach, lb, ub; { int base_mach, tail, copy, i; base_mach = copysingl( mach, lb - 1 ); if ( ub == INFINITY ) { copy = dupmachine( mach ); mach = link_machines( mach, link_machines( base_mach, mkclos( copy ) ) ); } else { tail = mkstate( SYM_EPSILON ); for ( i = lb; i < ub; ++i ) { copy = dupmachine( mach ); tail = mkopt( link_machines( copy, tail ) ); } mach = link_machines( mach, link_machines( base_mach, tail ) ); } return ( mach ); } /* mkstate - create a state with a transition on a given symbol * * synopsis * * state = mkstate( sym ); * * state - a new state matching sym * sym - the symbol the new state is to have an out-transition on * * note that this routine makes new states in ascending order through the * state array (and increments LASTNFA accordingly). The routine DUPMACHINE * relies on machines being made in ascending order and that they are * CONTIGUOUS. Change it and you will have to rewrite DUPMACHINE (kludge * that it admittedly is) */ int mkstate( sym ) int sym; { if ( ++lastnfa >= current_mns ) { if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS ) lerrif( "input rules are too complicated (>= %d NFA states)", current_mns ); ++num_reallocs; firstst = reallocate_integer_array( firstst, current_mns ); lastst = reallocate_integer_array( lastst, current_mns ); finalst = reallocate_integer_array( finalst, current_mns ); transchar = reallocate_integer_array( transchar, current_mns ); trans1 = reallocate_integer_array( trans1, current_mns ); trans2 = reallocate_integer_array( trans2, current_mns ); accptnum = reallocate_integer_array( accptnum, current_mns ); assoc_rule = reallocate_integer_array( assoc_rule, current_mns ); state_type = reallocate_integer_array( state_type, current_mns ); } firstst[lastnfa] = lastnfa; finalst[lastnfa] = lastnfa; lastst[lastnfa] = lastnfa; transchar[lastnfa] = sym; trans1[lastnfa] = NO_TRANSITION; trans2[lastnfa] = NO_TRANSITION; accptnum[lastnfa] = NIL; assoc_rule[lastnfa] = num_rules; state_type[lastnfa] = current_state_type; /* fix up equivalence classes base on this transition. Note that any * character which has its own transition gets its own equivalence class. * Thus only characters which are only in character classes have a chance * at being in the same equivalence class. E.g. "a|b" puts 'a' and 'b' * into two different equivalence classes. "[ab]" puts them in the same * equivalence class (barring other differences elsewhere in the input). */ if ( sym < 0 ) { /* we don't have to update the equivalence classes since that was * already done when the ccl was created for the first time */ } else if ( sym == SYM_EPSILON ) ++numeps; else { if ( useecs ) /* map NUL's to csize */ mkechar( sym ? sym : csize, nextecm, ecgroup ); } return ( lastnfa ); } /* mkxtion - make a transition from one state to another * * synopsis * * mkxtion( statefrom, stateto ); * * statefrom - the state from which the transition is to be made * stateto - the state to which the transition is to be made */ void mkxtion( statefrom, stateto ) int statefrom, stateto; { if ( trans1[statefrom] == NO_TRANSITION ) trans1[statefrom] = stateto; else if ( (transchar[statefrom] != SYM_EPSILON) || (trans2[statefrom] != NO_TRANSITION) ) flexfatal( "found too many transitions in mkxtion()" ); else { /* second out-transition for an epsilon state */ ++eps2; trans2[statefrom] = stateto; } } /* new_rule - initialize for a new rule * * synopsis * * new_rule(); * * the global num_rules is incremented and the any corresponding dynamic * arrays (such as rule_type[]) are grown as needed. */ void new_rule() { if ( ++num_rules >= current_max_rules ) { ++num_reallocs; current_max_rules += MAX_RULES_INCREMENT; rule_type = reallocate_integer_array( rule_type, current_max_rules ); rule_linenum = reallocate_integer_array( rule_linenum, current_max_rules ); } if ( num_rules > MAX_RULE ) lerrif( "too many rules (> %d)!", MAX_RULE ); rule_linenum[num_rules] = linenum; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /* parse.y - parser for flex input */ %token CHAR NUMBER SECTEND SCDECL XSCDECL WHITESPACE NAME PREVCCL EOF_OP %{ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/parse.y,v 2.7 90/06/27 23:48:31 vern Exp $ (LBL)"; #endif #include "flexdef.h" int pat, scnum, eps, headcnt, trailcnt, anyccl, lastchar, i, actvp, rulelen; int trlcontxt, xcluflg, cclsorted, varlength, variable_trail_rule; Char clower(); static int madeany = false; /* whether we've made the '.' character class */ int previous_continued_action; /* whether the previous rule's action was '|' */ %} %% goal : initlex sect1 sect1end sect2 initforrule { /* add default rule */ int def_rule; pat = cclinit(); cclnegate( pat ); def_rule = mkstate( -pat ); finish_rule( def_rule, false, 0, 0 ); for ( i = 1; i <= lastsc; ++i ) scset[i] = mkbranch( scset[i], def_rule ); if ( spprdflt ) fputs( "YY_FATAL_ERROR( \"flex scanner jammed\" )", temp_action_file ); else fputs( "ECHO", temp_action_file ); fputs( ";\n\tYY_BREAK\n", temp_action_file ); } ; initlex : { /* initialize for processing rules */ /* create default DFA start condition */ scinstal( "INITIAL", false ); } ; sect1 : sect1 startconddecl WHITESPACE namelist1 '\n' | | error '\n' { synerr( "unknown error processing section 1" ); } ; sect1end : SECTEND ; startconddecl : SCDECL { /* these productions are separate from the s1object * rule because the semantics must be done before * we parse the remainder of an s1object */ xcluflg = false; } | XSCDECL { xcluflg = true; } ; namelist1 : namelist1 WHITESPACE NAME { scinstal( nmstr, xcluflg ); } | NAME { scinstal( nmstr, xcluflg ); } | error { synerr( "bad start condition list" ); } ; sect2 : sect2 initforrule flexrule '\n' | ; initforrule : { /* initialize for a parse of one rule */ trlcontxt = variable_trail_rule = varlength = false; trailcnt = headcnt = rulelen = 0; current_state_type = STATE_NORMAL; previous_continued_action = continued_action; new_rule(); } ; flexrule : scon '^' rule { pat = $3; finish_rule( pat, variable_trail_rule, headcnt, trailcnt ); for ( i = 1; i <= actvp; ++i ) scbol[actvsc[i]] = mkbranch( scbol[actvsc[i]], pat ); if ( ! bol_needed ) { bol_needed = true; if ( performance_report ) pinpoint_message( "'^' operator results in sub-optimal performance" ); } } | scon rule { pat = $2; finish_rule( pat, variable_trail_rule, headcnt, trailcnt ); for ( i = 1; i <= actvp; ++i ) scset[actvsc[i]] = mkbranch( scset[actvsc[i]], pat ); } | '^' rule { pat = $2; finish_rule( pat, variable_trail_rule, headcnt, trailcnt ); /* add to all non-exclusive start conditions, * including the default (0) start condition */ for ( i = 1; i <= lastsc; ++i ) if ( ! scxclu[i] ) scbol[i] = mkbranch( scbol[i], pat ); if ( ! bol_needed ) { bol_needed = true; if ( performance_report ) pinpoint_message( "'^' operator results in sub-optimal performance" ); } } | rule { pat = $1; finish_rule( pat, variable_trail_rule, headcnt, trailcnt ); for ( i = 1; i <= lastsc; ++i ) if ( ! scxclu[i] ) scset[i] = mkbranch( scset[i], pat ); } | scon EOF_OP { build_eof_action(); } | EOF_OP { /* this EOF applies to all start conditions * which don't already have EOF actions */ actvp = 0; for ( i = 1; i <= lastsc; ++i ) if ( ! sceof[i] ) actvsc[++actvp] = i; if ( actvp == 0 ) pinpoint_message( "warning - all start conditions already have <<EOF>> rules" ); else build_eof_action(); } | error { synerr( "unrecognized rule" ); } ; scon : '<' namelist2 '>' ; namelist2 : namelist2 ',' NAME { if ( (scnum = sclookup( nmstr )) == 0 ) format_pinpoint_message( "undeclared start condition %s", nmstr ); else actvsc[++actvp] = scnum; } | NAME { if ( (scnum = sclookup( nmstr )) == 0 ) format_pinpoint_message( "undeclared start condition %s", nmstr ); else actvsc[actvp = 1] = scnum; } | error { synerr( "bad start condition list" ); } ; rule : re2 re { if ( transchar[lastst[$2]] != SYM_EPSILON ) /* provide final transition \now/ so it * will be marked as a trailing context * state */ $2 = link_machines( $2, mkstate( SYM_EPSILON ) ); mark_beginning_as_normal( $2 ); current_state_type = STATE_NORMAL; if ( previous_continued_action ) { /* we need to treat this as variable trailing * context so that the backup does not happen * in the action but before the action switch * statement. If the backup happens in the * action, then the rules "falling into" this * one's action will *also* do the backup, * erroneously. */ if ( ! varlength || headcnt != 0 ) { fprintf( stderr, "%s: warning - trailing context rule at line %d made variable because\n", program_name, linenum ); fprintf( stderr, " of preceding '|' action\n" ); } /* mark as variable */ varlength = true; headcnt = 0; } if ( varlength && headcnt == 0 ) { /* variable trailing context rule */ /* mark the first part of the rule as the accepting * "head" part of a trailing context rule */ /* by the way, we didn't do this at the beginning * of this production because back then * current_state_type was set up for a trail * rule, and add_accept() can create a new * state ... */ add_accept( $1, num_rules | YY_TRAILING_HEAD_MASK ); variable_trail_rule = true; } else trailcnt = rulelen; $$ = link_machines( $1, $2 ); } | re2 re '$' { synerr( "trailing context used twice" ); } | re '$' { if ( trlcontxt ) { synerr( "trailing context used twice" ); $$ = mkstate( SYM_EPSILON ); } else if ( previous_continued_action ) { /* see the comment in the rule for "re2 re" * above */ if ( ! varlength || headcnt != 0 ) { fprintf( stderr, "%s: warning - trailing context rule at line %d made variable because\n", program_name, linenum ); fprintf( stderr, C��C��C��C��C��C��C��C���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� " of preceding '|' action\n" ); } /* mark as variable */ varlength = true; headcnt = 0; } trlcontxt = true; if ( ! varlength ) headcnt = rulelen; ++rulelen; trailcnt = 1; eps = mkstate( SYM_EPSILON ); $$ = link_machines( $1, link_machines( eps, mkstate( '\n' ) ) ); } | re { $$ = $1; if ( trlcontxt ) { if ( varlength && headcnt == 0 ) /* both head and trail are variable-length */ variable_trail_rule = true; else trailcnt = rulelen; } } ; re : re '|' series { varlength = true; $$ = mkor( $1, $3 ); } | series { $$ = $1; } ; re2 : re '/' { /* this rule is written separately so * the reduction will occur before the trailing * series is parsed */ if ( trlcontxt ) synerr( "trailing context used twice" ); else trlcontxt = true; if ( varlength ) /* we hope the trailing context is fixed-length */ varlength = false; else headcnt = rulelen; rulelen = 0; current_state_type = STATE_TRAILING_CONTEXT; $$ = $1; } ; series : series singleton { /* this is where concatenation of adjacent patterns * gets done */ $$ = link_machines( $1, $2 ); } | singleton { $$ = $1; } ; singleton : singleton '*' { varlength = true; $$ = mkclos( $1 ); } | singleton '+' { varlength = true; $$ = mkposcl( $1 ); } | singleton '?' { varlength = true; $$ = mkopt( $1 ); } | singleton '{' NUMBER ',' NUMBER '}' { varlength = true; if ( $3 > $5 || $3 < 0 ) { synerr( "bad iteration values" ); $$ = $1; } else { if ( $3 == 0 ) $$ = mkopt( mkrep( $1, $3, $5 ) ); else $$ = mkrep( $1, $3, $5 ); } } | singleton '{' NUMBER ',' '}' { varlength = true; if ( $3 <= 0 ) { synerr( "iteration value must be positive" ); $$ = $1; } else $$ = mkrep( $1, $3, INFINITY ); } | singleton '{' NUMBER '}' { /* the singleton could be something like "(foo)", * in which case we have no idea what its length * is, so we punt here. */ varlength = true; if ( $3 <= 0 ) { synerr( "iteration value must be positive" ); $$ = $1; } else $$ = link_machines( $1, copysingl( $1, $3 - 1 ) ); } | '.' { if ( ! madeany ) { /* create the '.' character class */ anyccl = cclinit(); ccladd( anyccl, '\n' ); cclnegate( anyccl ); if ( useecs ) mkeccl( ccltbl + cclmap[anyccl], ccllen[anyccl], nextecm, ecgroup, csize, csize ); madeany = true; } ++rulelen; $$ = mkstate( -anyccl ); } | fullccl { if ( ! cclsorted ) /* sort characters for fast searching. We use a * shell sort since this list could be large. */ cshell( ccltbl + cclmap[$1], ccllen[$1], true ); if ( useecs ) mkeccl( ccltbl + cclmap[$1], ccllen[$1], nextecm, ecgroup, csize, csize ); ++rulelen; $$ = mkstate( -$1 ); } | PREVCCL { ++rulelen; $$ = mkstate( -$1 ); } | '"' string '"' { $$ = $2; } | '(' re ')' { $$ = $2; } | CHAR { ++rulelen; if ( caseins && $1 >= 'A' && $1 <= 'Z' ) $1 = clower( $1 ); $$ = mkstate( $1 ); } ; fullccl : '[' ccl ']' { $$ = $2; } | '[' '^' ccl ']' { /* *Sigh* - to be compatible Unix lex, negated ccls * match newlines */ #ifdef NOTDEF ccladd( $3, '\n' ); /* negated ccls don't match '\n' */ cclsorted = false; /* because we added the newline */ #endif cclnegate( $3 ); $$ = $3; } ; ccl : ccl CHAR '-' CHAR { if ( $2 > $4 ) synerr( "negative range in character class" ); else { if ( caseins ) { if ( $2 >= 'A' && $2 <= 'Z' ) $2 = clower( $2 ); if ( $4 >= 'A' && $4 <= 'Z' ) $4 = clower( $4 ); } for ( i = $2; i <= $4; ++i ) ccladd( $1, i ); /* keep track if this ccl is staying in alphabetical * order */ cclsorted = cclsorted && ($2 > lastchar); lastchar = $4; } $$ = $1; } | ccl CHAR { if ( caseins ) if ( $2 >= 'A' && $2 <= 'Z' ) $2 = clower( $2 ); ccladd( $1, $2 ); cclsorted = cclsorted && ($2 > lastchar); lastchar = $2; $$ = $1; } | { cclsorted = true; lastchar = 0; $$ = cclinit(); } ; string : string CHAR { if ( caseins ) if ( $2 >= 'A' && $2 <= 'Z' ) $2 = clower( $2 ); ++rulelen; $$ = link_machines( $1, mkstate( $2 ) ); } | { $$ = mkstate( SYM_EPSILON ); } ; %% /* build_eof_action - build the "<<EOF>>" action for the active start * conditions */ void build_eof_action() { register int i; for ( i = 1; i <= actvp; ++i ) { if ( sceof[actvsc[i]] ) format_pinpoint_message( "multiple <<EOF>> rules for start condition %s", scname[actvsc[i]] ); else { sceof[actvsc[i]] = true; fprintf( temp_action_file, "case YY_STATE_EOF(%s):\n", scname[actvsc[i]] ); } } line_directive_out( temp_action_file ); } /* synerr - report a syntax error */ void synerr( str ) char str[]; { syntaxerror = true; pinpoint_message( str ); } /* format_pinpoint_message - write out a message formatted with one string, * pinpointing its location */ void format_pinpoint_message( msg, arg ) char msg[], arg[]; { char errmsg[MAXLINE]; (void) sprintf( errmsg, msg, arg ); pinpoint_message( errmsg ); } /* pinpoint_message - write out a message, pinpointing its location */ void pinpoint_message( str ) char str[]; { fprintf( stderr, "\"%s\", line %d: %s\n", infilename, linenum, str ); } /* yyerror - eat up an error message from the parser; * currently, messages are ignore */ void yyerror( msg ) char msg[]; { } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* A lexical scanner generated by flex */ /* scanner skeleton version: * $Header: /usr/fsys/odin/a/vern/flex/RCS/flex.skel,v 2.16 90/08/03 14:09:36 vern Exp $ */ #define FLEX_SCANNER #include <stdio.h> /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus #define __cplusplus #endif #endif #ifdef __cplusplus #include <stdlib.h> #include <osfcn.h> /* use prototypes in function declarations */ #define YY_USE_PROTOS /* the "const" storage-class-modifier is valid */ #define YY_USE_CONST #else /* ! __cplusplus */ #ifdef __STDC__ #ifdef __GNUC__ #include <stddef.h> void *malloc( size_t ); void free( void* ); #else #include <stdlib.h> #endif /* __GNUC__ */ #define YY_USE_PROTOS #define YY_USE_CONST #endif /* __STDC__ */ #endif /* ! __cplusplus */ #ifdef __TURBOC__ #define YY_USE_CONST #endif #ifndef YY_USE_CONST #define const #endif #ifdef YY_USE_PROTOS #define YY_PROTO(proto) proto #else #define YY_PROTO(proto) () /* we can't get here if it's an ANSI C compiler, or a C++ compiler, * so it's got to be a K&R compiler, and therefore there's no standard * place from which to include these definitions */ char *malloc(); int free(); int read(); #endif /* amount of stuff to slurp up with each read */ #ifndef YY_READ_BUF_SIZE #define YY_READ_BUF_SIZE 8192 #endif /* returned upon end-of-file */ #define YY_END_TOK 0 /* copy whatever the last rule matched to the standard output */ /* cast to (char *) is because for 8-bit chars, yytext is (unsigned char *) */ /* this used to be an fputs(), but since the string might contain NUL's, * we now use fwrite() */ #define ECHO (void) fwrite( (char *) yytext, yyleng, 1, yyout ) /* gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #define YY_INPUT(buf,result,max_size) \ if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ YY_FATAL_ERROR( "read() in flex scanner failed" ); #define YY_NULL 0 /* no semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #define yyterminate() return ( YY_NULL ) /* report a fatal error */ /* The funky do-while is used to turn this macro definition into * a single C statement (which needs a semi-colon terminator). * This avoids problems with code like: * * if ( something_happens ) * YY_FATAL_ERROR( "oops, the something happened" ); * else * everything_okay(); * * Prior to using the do-while the compiler would get upset at the * "else" because it interpreted the "if" statement as being all * done when it reached the ';' after the YY_FATAL_ERROR() call. */ #define YY_FATAL_ERROR(msg) \ do \ { \ (void) fputs( msg, stderr ); \ (void) putc( '\n', stderr ); \ exit( 1 ); \ } \ while ( 0 ) /* default yywrap function - always treat EOF as an EOF */ #define yywrap() 1 /* enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN */ #define BEGIN yy_start = 1 + 2 * /* action number for EOF rule of a given start state */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* special action meaning "start processing a new file" */ #define YY_NEW_FILE \ do \ { \ yy_init_buffer( yy_current_buffer, yyin ); \ yy_load_buffer_state(); \ } \ while ( 0 ) /* default declaration of generated scanner - a define so the user can * easily add parameters */ #define YY_DECL int yylex YY_PROTO(( void )) /* code executed at the end of each rule */ #define YY_BREAK break; #define YY_END_OF_BUFFER_CHAR 0 #ifndef YY_BUF_SIZE #define YY_BUF_SIZE (YY_READ_BUF_SIZE * 2) /* size of default input buffer */ #endif typedef struct yy_buffer_state *YY_BUFFER_STATE; #define YY_CHAR unsigned char # line 1 "scan.l" #define INITIAL 0 /* scan.l - scanner for flex input */ # line 5 "scan.l" /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; #endif #undef yywrap #include "flexdef.h" #include "parse.h" #define ACTION_ECHO fprintf( temp_action_file, "%s", yytext ) #define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" ); #undef YY_DECL #define YY_DECL \ int flexscan() #define RETURNCHAR \ yylval = yytext[0]; \ return ( CHAR ); #define RETURNNAME \ (void) strcpy( nmstr, (char *) yytext ); \ return ( NAME ); #define PUT_BACK_STRING(str, start) \ for ( i = strlen( (char *) (str) ) - 1; i >= start; --i ) \ unput((str)[i]) #define CHECK_REJECT(str) \ if ( all_upper( str ) ) \ reject = true; #define CHECK_YYMORE(str) \ if ( all_lower( str ) ) \ yymore_used = true; #define SECT2 1 #define SECT2PROLOG 2 #define SECT3 3 #define CODEBLOCK 4 #define PICKUPDEF 5 #define SC 6 #define CARETISBOL 7 #define NUM 8 #define QUOTE 9 #define FIRSTCCL 10 #define CCL 11 #define ACTION 12 #define RECOVER 13 #define BRACEERROR 14 #define C_COMMENT 15 #define ACTION_COMMENT 16 #define ACTION_STRING 17 #define PERCENT_BRACE_ACTION 18 #define USED_LIST 19 #define CODEBLOCK_2 20 #define XLATION 21 # line 84 "scan.l" /* done after the current pattern has been matched and before the * corresponding action - sets up yytext */ #define YY_DO_BEFORE_ACTION \ yytext = yy_bp; \ yyleng = yy_cp - yy_bp; \ yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yy_c_buf_p = yy_cp; #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 /* return all but the first 'n' matched characters back to the input stream */ #define yyless(n) \ do \ { \ /* undo effects of setting up yytext */ \ *yy_cp = yy_hold_char; \ yy_c_buf_p = yy_cp = yy_bp + n; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yytext ) struct yy_buffer_state { FILE *yy_input_file; YY_CHAR *yy_ch_buf; /* input buffer */ YY_CHAR *yy_buf_pos; /* current position in input buffer */ /* size of input buffer in bytes, not including room for EOB characters*/ int yy_buf_size; /* number of characters read into yy_ch_buf, not including EOB characters */ int yy_n_chars; int yy_eof_status; /* whether we've seen an EOF on this buffer */ #define EOF_NOT_SEEN 0 /* "pending" happens when the EOF has been seen but there's still * some text process */ #define EOF_PENDING 1 #define EOF_DONE 2 }; static YY_BUFFER_STATE yy_current_buffer; /* we provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state" */ #define YY_CURRENT_BUFFER yy_current_buffer /* yy_hold_char holds the character lost when yytext is formed */ static YY_CHAR yy_hold_char;C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C��C���D��D��D��D��D��D��D��D��D�� D�� D�� D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ static int yy_n_chars; /* number of characters read into yy_ch_buf */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif #ifndef YY_USER_INIT #define YY_USER_INIT #endif extern YY_CHAR *yytext; extern int yyleng; extern FILE *yyin, *yyout; YY_CHAR *yytext; int yyleng; FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; #define YY_END_OF_BUFFER 121 typedef int yy_state_type; static const short int yy_accept[341] = { 0, 0, 0, 0, 0, 0, 0, 119, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 19, 7, 18, 19, 16, 1, 17, 19, 19, 19, 15, 67, 59, 60, 53, 67, 66, 51, 67, 67, 67, 50, 49, 67, 52, 120, 47, 119, 119, 28, 29, 28, 28, 28, 28, 31, 30, 32, 73, 120, 69, 70, 72, 74, 88, 89, 86, 85, 87, 75, 77, 76, 75, 81, 80, 81, 81, 83, 83, 83, 84, 99, 104, 103, 105, 105, 100, 100, 100, 97, 98, 120, 33, 91, 90, 22, 24, 23, 107, 109, 108, 111, 113, 114, 115, 95, 95, 96, 95, 95, 95, 95, 38, 35, 34, 38, 38, 44, 42, 45, 44, 44, 41, 41, 41, 40, 41, 7, 18, 0, 16, 1, 17, 0, 2, 14, 8, 0, 12, 4, 0, 0, 5, 0, 3, 15, 59, 60, 0, 0, 56, 0, 0, 0, 117, 117, 117, 55, 54, 55, 50, 49, 63, 50, 0, 47, 46, 119, 119, 28, 28, 28, 28, 28, 31, 30, 71, 72, 85, 118, 118, 118, 78, 79, 82, 99, 0, 102, 0, 101, 100, 100, 100, 0, 33, 22, 20, 107, 106, 111, 112, 95, 95, 95, 92, 95, 95, 95, 38, 35, 38, 38, 42, 0, 43, 43, 43, 42, 40, 0, 13, 14, 8, 8, 0, 12, 4, 0, 0, 0, 5, 0, 6, 57, 0, 58, 0, 64, 0, 0, 117, 117, 55, 55, 65, 63, 28, 28, 28, 25, 0, 118, 118, 100, 100, 0, 21, 92, 92, 95, 95, 38, 38, 0, 39, 43, 43, 0, 11, 4, 0, 11, 0, 0, 5, 0, 0, 0, 117, 28, 28, 118, 100, 100, 95, 95, 38, 38, 43, 0, 9, 0, 0, 0, 28, 28, 100, 100, 95, 95, 38, 38, 0, 0, 26, 27, 93, 94, 93, 94, 36, 37, 10, 62, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 6, 7, 8, 9, 1, 10, 11, 11, 12, 11, 13, 14, 11, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1, 1, 17, 1, 18, 11, 1, 24, 25, 26, 27, 28, 29, 23, 23, 23, 30, 31, 23, 32, 33, 34, 31, 23, 35, 36, 37, 38, 23, 23, 39, 40, 23, 19, 20, 21, 22, 23, 1, 24, 25, 26, 27, 28, 29, 23, 23, 23, 30, 31, 23, 32, 33, 34, 31, 23, 35, 36, 37, 38, 23, 23, 39, 40, 23, 41, 42, 43, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[44] = { 0, 1, 2, 3, 2, 2, 4, 1, 1, 1, 5, 1, 6, 1, 7, 5, 8, 1, 1, 1, 9, 10, 1, 11, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 1, 13 } ; static const short int yy_base[404] = { 0, 0, 43, 85, 126, 1371, 1370, 1369, 1353, 168, 1346, 104, 108, 211, 0, 1332, 1320, 120, 252, 95, 119, 137, 144, 100, 141, 295, 0, 1327, 1323, 113, 336, 254, 255, 257, 258, 253, 268, 379, 0, 338, 421, 0, 0, 273, 460, 1325, 1442, 281, 1442, 1287, 0, 287, 1442, 1279, 472, 1257, 0, 1442, 425, 1442, 1442, 147, 1442, 1239, 1235, 78, 513, 433, 1442, 83, 1442, 1248, 0, 1247, 1442, 0, 1442, 0, 1218, 1205, 1194, 0, 342, 1442, 1442, 1442, 1442, 1202, 0, 1442, 1442, 1442, 1442, 1201, 1442, 1442, 1442, 1442, 79, 1442, 1442, 103, 1198, 1442, 0, 248, 1442, 0, 1442, 1442, 252, 1199, 0, 1173, 1158, 1442, 1442, 1185, 1442, 1442, 1442, 0, 1442, 1170, 0, 1442, 1152, 0, 1442, 1442, 0, 0, 346, 1442, 1123, 0, 1125, 1105, 0, 352, 1442, 1116, 1103, 1442, 356, 1442, 1100, 329, 1442, 360, 1093, 1101, 333, 441, 1442, 445, 0, 449, 1442, 1101, 1442, 365, 453, 1094, 466, 0, 480, 330, 0, 1095, 1442, 0, 555, 1442, 1044, 1077, 1442, 1051, 133, 456, 1442, 1059, 0, 0, 1442, 584, 563, 1442, 0, 1442, 1071, 0, 1442, 1063, 1442, 0, 0, 1010, 1007, 627, 0, 484, 1442, 0, 998, 1442, 992, 0, 1442, 1442, 1442, 0, 421, 1442, 0, 1442, 0, 971, 964, 992, 1442, 0, 962, 0, 1442, 0, 1442, 0, 488, 921, 670, 0, 717, 714, 0, 497, 715, 712, 569, 573, 1442, 727, 0, 577, 726, 581, 1442, 585, 0, 590, 738, 597, 0, 712, 683, 691, 0, 670, 1442, 1442, 623, 1442, 591, 1442, 458, 702, 590, 0, 0, 0, 1442, 0, 576, 569, 0, 1442, 593, 575, 0, 560, 546, 567, 1442, 0, 0, 541, 529, 534, 527, 730, 1442, 500, 0, 509, 1442, 0, 734, 1442, 468, 467, 0, 462, 704, 724, 1442, 461, 438, 1442, 440, 425, 433, 405, 413, 398, 1442, 404, 1442, 359, 259, 332, 338, 346, 334, 331, 257, 253, 226, 137, 133, 81, 0, 0, 0, 0, 0, 0, 0, 0, 1442, 1442, 1442, 753, 766, 779, 792, 805, 818, 831, 844, 857, 870, 883, 896, 909, 922, 935, 948, 955, 967, 980, 986, 998, 1011, 1024, 1037, 1050, 1063, 1070, 1082, 1089, 1101, 1114, 1127, 1140, 1150, 1157, 1169, 1182, 1195, 1208, 1221, 1234, 1241, 1253, 1266, 1279, 1282, 1284, 1296, 1309, 1315, 1327, 1339, 1345, 1357, 1363, 1375, 1382, 1388, 1393, 1405, 1411, 1423, 1429 } ; static const short int yy_def[404] = { 0, 340, 340, 341, 341, 342, 342, 343, 343, 340, 9, 344, 344, 340, 13, 345, 345, 346, 346, 347, 347, 348, 348, 349, 349, 340, 25, 350, 350, 345, 345, 351, 351, 352, 352, 353, 353, 340, 37, 354, 354, 37, 37, 355, 356, 340, 340, 340, 340, 340, 357, 340, 340, 358, 359, 340, 360, 340, 340, 340, 340, 340, 340, 340, 361, 362, 340, 340, 340, 340, 340, 363, 364, 365, 340, 366, 340, 367, 367, 367, 366, 368, 340, 340, 340, 340, 340, 340, 369, 340, 340, 340, 340, 340, 340, 340, 340, 340, 362, 340, 340, 370, 371, 340, 372, 362, 340, 373, 340, 340, 374, 340, 375, 375, 375, 340, 340, 376, 340, 340, 340, 377, 340, 340, 378, 340, 340, 379, 340, 340, 380, 381, 381, 340, 381, 382, 382, 382, 383, 340, 340, 383, 383, 340, 340, 340, 340, 384, 340, 340, 340, 340, 384, 340, 340, 340, 357, 340, 340, 358, 340, 340, 385, 340, 340, 386, 340, 340, 387, 388, 340, 360, 340, 340, 340, 389, 340, 340, 361, 361, 340, 340, 390, 391, 340, 391, 340, 340, 392, 340, 363, 364, 340, 365, 340, 366, 367, 367, 367, 340, 368, 340, 340, 369, 340, 340, 340, 393, 340, 340, 340, 373, 374, 340, 374, 340, 375, 375, 375, 376, 340, 377, 394, 378, 340, 379, 340, 381, 381, 381, 340, 382, 382, 382, 383, 340, 383, 383, 340, 340, 340, 340, 395, 340, 340, 340, 340, 340, 385, 385, 396, 340, 397, 396, 340, 340, 398, 388, 340, 340, 389, 340, 340, 340, 361, 361, 340, 399, 391, 185, 340, 392, 367, 367, 199, 340, 400, 340, 401, 375, 375, 394, 340, 230, 402, 382, 382, 383, 383, 340, 340, 340, 403, 396, 340, 397, 396, 340, 340, 340, 398, 340, 361, 265, 340, 367, 367, 340, 375, 375, 382, 382, 383, 383, 340, 340, 340, 340, 361, 361, 367, 367, 375, 375, 382, 382, 383, 383, 340, 340, 367, 367, 375, 375, 382, 382, 383, 383, 340, 340, 0, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static const short int yy_nxt[1486] = { 0, 46, 47, 48, 47, 47, 46, 46, 46, 49, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 46, 46, 46, 46, 51, 52, 51, 51, 46, 53, 46, 54, 46, 46, 46, 46, 46, 55, 46, 46, 46, 46, 46, 46, 46, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 46, 46, 46, 58, 59, 58, 58, 60, 188, 61, 181, 181, 62, 62, 96, 339, 62, 97, 63, 85, 64, 65, 82, 83, 82, 82, 82, 83, 82, 82, 104, 98, 119, 182, 182, 206, 105, 106, 96, 91, 189, 97, 66, 62, 67, 68, 67, 67, 60, 92, 61, 69, 93, 62, 62, 98, 85, 62, 207, 63, 85, 64, 65, 85, 70, 176, 176, 100, 176, 179, 263, 104, 120, 101, 100, 102, 338, 105, 106, 94, 101, 337, 102, 66, 62, 75, 75, 76, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 78, 77, 77, 77, 77, 79, 75, 75, 75, 84, 84, 85, 84, 84, 84, 84, 84, 84, 84, 84, 84, 86, 84, 84, 84, 84, 87, 84, 84, 84, 84, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 84, 84, 84, 91, 128, 122, 122, 129, 125, 125, 213, 336, 181, 92, 123, 123, 93, 126, 126, 128, 214, 130, 129, 144, 145, 144, 144, 179, 263, 335, 146, 153, 154, 153, 153, 182, 130, 157, 158, 157, 157, 147, 334, 94, 107, 107, 108, 107, 107, 109, 107, 107, 107, 110, 107, 107, 107, 107, 111, 107, 107, 107, 107, 107, 107, 107, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 113, 112, 112, 112, 112, 114, 115, 107, 116, 119, 139, 140, 139, 139, 201, 241, 201, 201, 228, 241, 228, 228, 179, 263, 235, 229, 235, 235, 238, 333, 238, 238, 243, 254, 243, 243, 255, 247, 242, 247, 247, 332, 242, 141, 331, 330, 244, 329, 142, 120, 131, 132, 133, 132, 132, 131, 131, 131, 134, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, 136, 135, 135, 135, 135, 137, 131, 131, 131, 139, 140, 139, 139, 172, 173, 172, 172, 213, 328, 327, 174, 186, 187, 186, 186, 326, 325, 214, 174, 153, 154, 153, 153, 245, 246, 245, 245, 157, 158, 157, 157, 249, 141, 249, 249, 324, 323, 142, 149, 145, 149, 149, 322, 175, 251, 150, 251, 251, 264, 321, 302, 175, 151, 178, 179, 263, 152, 162, 245, 246, 245, 253, 201, 320, 201, 201, 228, 317, 228, 228, 316, 265, 163, 229, 164, 235, 163, 235, 235, 163, 315, 163, 163, 164, 165, 166, 167, 168, 294, 169, 183, 183, 240, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 184, 183, 183, 183, 183, 183, 183, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 183, 183, 183, 172, 173, 172, 172, 313, 312, 311, 174, 186, 187, 186, 186, 310, 282, 238, 174, 238, 238, 289, 290, 289, 289, 243, 309, 243, 243, 245, 246, 245, 245, 247, 308, 247, 247, 205, 249, 244, 249, 249, 275, 175, 269, 251, 269, 251, 251, 306, 305, 175, 180, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 301, 261, 270, 274, 274, 275, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 274, 274, 274, 283, 283, 258, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 283, 283, 283, 296, 297, 296, 296, 303, 299, 318, 298, 179, 263, 179, 263, 303, 303, 303, 303, 303, 303, 289, 290, 289, 289, 296, 297, 296, 296, 319, 294, 244, 291, 288, 287, 286, 285, 319, 319, 319, 319, 319, 319, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 156, 156, 230, 282, 156, 156, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 161, 171, 171, 220, 280, 171, 171, 178, 178, 279, 178, 178, 178, 178, 178, 178, 277, 178, 178, 178, 180, 180, 204, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 190, 192, 273, 272, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 195, 195, 194, 195, 195, 195, 195, 195, 195, 195, 191, 266, 195, 196, 196, 262, 261, 196, 196, 200, 200, 259, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 203, 203, 258, 250, 203, 203, 205, 205, 160, 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, 208, 208, 244, 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, 210, 210, 239, 210, 210, 210, 210, 210, 210, 239, 210, 210, 210, 211, 211, 237, 236, 233, 211, 211, 211, 211, 211, 212, 212, 232, 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, 216, 216, 230, 224, 216, 216, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 221, 221, 222, 221, 221, 220, 221, 221, 221, 221, 221, 221, 221, 223, 223, 218, 223, 223, 217, 223, 223, 223, 223, 223, 223, 223, 225, 225, 215, 209, 225, 225, 225, 225, 204, 225, 225, 225, 225, 226, 226, 202, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 227, 199, 227, 227, 227, 227, 227, 227, 227, 198, 197, 227, 231, 231, 194, 191, 231, 231, 234, 179, 177, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 240, 240, 170, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 248, 248, 160, 248, 248, 248, 248, 248, 248, 248, 248, 248, 248, 252, 252, 256, 256, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 267, 155, 340, 118, 267, 268, 268, 118, 268, 268, 268, 268, 268, 268, 268, 268, 268, 271, 271, 89, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 278, 89, 80, 74, 278, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 292, 74, 72, 72, 292, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 293, 295, 295, 340, 340, 295, 295, 300, 300, 340, 340, 300, 300, 304, 340, 340, 340, 304, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 307, 340, 340, 340, 307, 284, 284, 340, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 314, 340, 340, 340, 314, 45, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static const short int yy_chk[1486] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 69, 3, 65, 98, 3, 3, 19, 329, 3, 19, 3, 23, 3, 3, 11, 11, 11, 11, 12, 12, 12, 12, 23, 19, 29, 65, 98, 101, 23, 23, 20, 17, 69, 20, 3, 3, 4, 4, 4, 4, 4, 17, 4, 4, 17, 4, 4, 20, 21, 4, 101, 4, 24, 4, 4, 22, 4, 61, 61, 21, 61, 178, 178, 24, 29, 21, 22, 21, 328, 24, 24, 17, 22, 327, 22, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 18, 35, 31, 32, 35, 33, 34, 110, 326, 105, 18, 31, 32, 18, 33, 34, 36, 110, 35, 36, 43, 43, 43, 43, 318, 318, 325, 43, 47, 47, 47, 47, 105, 36, 51, 51, 51, 51, 43, 324, 18, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30, 39, 39, 39, 39, 82, 147, 82, 82, 132, 152, 132, 132, 319, 319, 139, 132, 139, 139, 144, 323, 144, 144, 149, 167, 149, 149, 167, 161, 147, 161, 161, 322, 152, 39, 321, 320, 149, 317, 39, 30, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 40, 40, 40, 40, 58, 58, 58, 58, 212, 315, 313, 58, 67, 67, 67, 67, 312, 311, 212, 67, 153, 153, 153, 153, 155, 155, 155, 155, 157, 157, 157, 157, 162, 40, 162, 162, 310, 309, 40, 44, 44, 44, 44, 308, 58, 164, 44, 164, 164, 179, 306, 264, 67, 44, 179, 264, 264, 44, 54, 166, 166, 166, 166, 201, 305, 201, 201, 228, 301, 228, 228, 299, 179, 54, 228, 54, 235, 54, 235, 235, 54, 298, 54, 54, 54, 54, 54, 54, 54, 293, 54, 66, 66, 291, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 172, 172, 172, 172, 288, 287, 286, 172, 186, 186, 186, 186, 285, 281, 238, 186, 238, 238, 239, 239, 239, 239, 243, 280, 243, 243, 245, 245, 245, 245, 247, 279, 247, 247, 277, 249, 243, 249, 249, 276, 172, 185, 251, 185, 251, 251, 273, 272, 186, 266, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 185, 262, 260, 185, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 199, 230, 230, 257, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 253, 253, 253, 253, 265, 255, 302, 254, 265, 265, 302, 302, 265, 265, 265, 265, 265, 265, 289, 289, 289, 289, 296, 296, 296, 296, 303, 250, 244, 241, 237, 236, 233, 232, 303, 303, 303, 303, 303, 303, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 341, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 342, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 347, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 349, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 352, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 353, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 355, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, 357, 357, 229, 222, 357, 357, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 359, 360, 360, 219, 218, 360, 360, 361, 361, 217, 361, 361, 361, 361, 361, 361, 206, 361, 361, 361, 362, 362, 204, 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 364, 198, 197, 364, 364, 364, 364, 364, 364, 364, 364, 364, 364, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 366, 366, 193, 366, 366, 366, 366, 366, 366, 366, 190, 181, 366, 367, 367, 177, 175, 367, 367, 368, 368, 174, 368, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, 369, 169, 163, 369, 369, 370, 370, 159, 370, 370, 370, 370, 370, 370, 370, 370, 370, 370, 371, 371, 151, 371, 371, 371, 371, 371, 371, 371, 371, 371, 371, 372, 372, 150, 372, 372, 372, 372, 372, 372, 146, 372, 372, 372, 373, 373, 142, 141, 137, 373, 373, 373, 373, 373, 374, 374, 136, 374, 374, 374, 374, 374, 374, 374, 374, 374, 374, 375, 375, 134, 126, 375, 375, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 376, 377, 377, 123, 377, 377, 117, 377, 377, 377, 377, 377, 377, 377, 378, 378, 114, 378, 378, 113, 378, 378, 378, 378, 378, 378, 378, 379, 379, 111, 102, 379, 379, 379, 379, 93, 379, 379, 379, 379, 380, 380, 87, 380, 380, 380, 380, 380, 380, 380, 380, 380, 380, 381, 381, 80, 381, 381, 381, 381, 381, 381, 381, 79, 78, 381, 382, 382, 73, 71, 382, 382, 383, 64, 63, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 384, 384, 55, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 385, 53, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 386, 387, 387, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 49, 45, 28, 390, 391, 391, 27, 391, 391, 391, 391, 391, 391, 391, 391, 391, 392, 392, 16, 392, 392, 392, 392, 392, 392, 392, 392, 392, 392, 393, 15, 10, 8, 393, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 394, 395, 7, 6, 5, 395, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 0, 0, 397, 397, 398, 398, 0, 0, 398, 398, 399, 0, 0, 0, 399, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 401, 0, 0, 0, 401, 402, 402, 0, 402, 402, 402, 402, 402, 402, 402, 402, 402, 402, 403, 0, 0, 0, 403, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340 } ; static yy_state_type yy_last_accepting_state; static YY_CHAR *yy_last_accepting_cpos; /* the intent behind this definition is that it'll catch * any uses of REJECT which flex missed */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 /* these variables are all declared out here so that section 3 code can * manipulate them */ /* points to current character in buffer */ static YY_CHAR *yy_c_buf_p = (YY_CHAR *) 0; static int yy_init = 1; /* whether we need to initialize */ static int yy_start = 0; /* start state number */ /* flag which is used to allow yywrap()'s to do buffer switches * instead of setting up a fresh yyin. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; static yy_state_type yy_get_previous_state YY_PROTO(( void )); static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); static int yy_get_next_buffer YY_PROTO(( void )); static void yyunput YY_PROTO(( YY_CHAR c, YY_CHAR *buf_ptr )); void yyrestart YY_PROTO(( FILE *input_file )); void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); void yy_load_buffer_state YY_PROTO(( void )); YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); #define yy_new_buffer yy_create_buffer #ifdef __cplusplus static int yyinput YY_PROTO(( void )); #else static int input YY_PROTO(( void )); #endif YY_DECL { register yy_state_type yy_current_state; register YY_CHAR *yy_cp, *yy_bp; register int yy_act; static int bracelevel, didadef; int i, indented_code, checking_used, new_xlation; int doing_codeblock = false; Char nmdef[MAXLINE], myesc(); if ( yy_init ) { YY_USER_INIT; if ( ! yy_start ) yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( yy_current_buffer ) yy_init_buffer( yy_current_buffer, yyin ); else yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); yy_load_buffer_state(); yy_init = 0; } while ( 1 ) /* loops until end-of-file is reached */ { yy_cp = yy_c_buf_p; /* support of yytext */ *yy_cp = yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of the * current run. */ yy_bp = yy_cp; yy_current_state = yy_start; if ( yy_bp[-1] == '\n' ) ++yy_current_state; yy_match: do { register YY_CHAR yy_c = yy_ec[*yy_cp]; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_current_state != 340 ); yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; YY_USER_ACTION; do_action: /* this label is used only to access EOF actions */ switch ( yy_act ) { case 0: /* must backtrack */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; case 1: # line 90 "scan.l" indented_code = true; BEGIN(CODEBLOCK); YY_BREAK case 2: # line 91 "scan.l" ++linenum; /* treat as a comment */ YY_BREAK case 3: # line 92 "scan.l" ECHO; BEGIN(C_COMMENT); YY_BREAK case 4: # line 93 "scan.l" return ( SCDECL ); YY_BREAK case 5: # line 94 "scan.l" return ( XSCDECL ); YY_BREAK case 6: # line 95 "scan.l" { ++linenum; line_directive_out( stdout ); indented_code = false; BEGIN(CODEBLOCK); } YY_BREAK case 7: # line 102 "scan.l" return ( WHITESPACE ); YY_BREAK case 8: # line 104 "scan.l" { sectnum = 2; line_directive_out( stdout ); BEGIN(SECT2PROLOG); return ( SECTEND ); } YY_BREAK case 9: # line 111 "scan.l" { pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_USED; BEGIN(USED_LIST); } YY_BREAK case 10: # line 115 "scan.l" { checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); } YY_BREAK case 11: # line 122 "scan.l" { #ifdef NOTDEF fprintf( stderr, "old-style lex command at line %d ignored:\n\t%s", linenum, yytext ); #endif ++linenum; } YY_BREAK case 12: # line 131 "scan.l" /* ignore old lex directive */ YY_BREAK case 13: # line 133 "scan.l" { ++linenum; xlation = (int *) malloc( sizeof( int ) * (unsigned) csize ); if ( ! xlation ) flexfatal( "dynamic memory failure building %t table" ); for ( i = 0; i < csize; ++i ) xlation[i] = 0; num_xlations = 0; BEGIN(XLATION); } YY_BREAK case 14: # line 150 "scan.l" synerr( "unrecognized '%' directive" ); YY_BREAK case 15: # line 152 "scan.l" { (void) strcpy( nmstr, (char *) yytext ); didadef = false; BEGIN(PICKUPDEF); } YY_BREAK case 16: # line 158 "scan.l" RETURNNAME; YY_BREAK case 17: # line 159 "scan.l" ++linenum; /* allows blank lines in section 1 */ YY_BREAK case 18: # line 160 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 19: # line 161 "scan.l" synerr( "illegal character" ); BEGIN(RECOVER); YY_BREAK case 20: # line 164 "scan.l" ECHO; BEGIN(INITIAL); YY_BREAK case 21: # line 165 "scan.l" ++linenum; ECHO; BEGIN(INITIAL); YY_BREAK case 22: # line 166 "scan.l" ECHO; YY_BREAK case 23: # line 167 "scan.l" ECHO; YY_BREAK case 24: # line 168 "scan.l" ++linenum; ECHO; YY_BREAK case 25: # line 171 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 26: # line 172 "scan.l" ECHO; CHECK_REJECT(yytext); YY_BREAK case 27: # line 173 "scan.l" ECHO; CHECK_YYMORE(yytext); YY_BREAK case 28: # line 174 "scan.l" ECHO; YY_BREAK case 29: # line 175 "scan.l" { ++linenum; ECHO; if ( indented_code ) BEGIN(INITIAL); } YY_BREAK case 30: # line 183 "scan.l" /* separates name and definition */ YY_BREAK case 31: # line 185 "scan.l" { (void) strcpy( (char *) nmdef, (char *) yytext ); for ( i = strlen( (char *) nmdef ) - 1; i >= 0 && nmdef[i] == ' ' || nmdef[i] == '\t'; --i ) ; nmdef[i + 1] = '\0'; ndinstal( nmstr, nmdef ); didadef = true; } YY_BREAK case 32: # line 200 "scan.l" { if ( ! didadef ) synerr( "incomplete name definition" ); BEGIN(INITIAL); ++linenum; } YY_BREAK case 33: # line 207 "scan.l" ++linenum; BEGIN(INITIAL); RETURNNAME; YY_BREAK case 34: # line 210 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 35: # line 211 "scan.l" YY_BREAK case 36: # line 212 "scan.l" { if ( all_upper( yytext ) ) reject_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } YY_BREAK case 37: # line 218 "scan.l" { if ( all_lower( yytext ) ) yymore_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } YY_BREAK case 38: # line 224 "scan.l" synerr( "unrecognized %used/%unused construct" ); YY_BREAK case 39: # line 227 "scan.l" ++linenum; BEGIN(INITIAL); YY_BREAK case 40: # line 228 "scan.l" ++num_xlations; new_xlation = true; YY_BREAK case 41: # line 229 "scan.l" synerr( "bad row in translation table" ); YY_BREAK case 42: # line 230 "scan.l" /* ignore whitespace */ YY_BREAK case 43: # line 232 "scan.l" { xlation[myesc( yytext )] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } YY_BREAK case 44: # line 237 "scan.l" { xlation[yytext[0]] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } YY_BREAK case 45: # line 243 "scan.l" ++linenum; YY_BREAK case 46: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 246 "scan.l" { ++linenum; ACTION_ECHO; MARK_END_OF_PROLOG; BEGIN(SECT2); } YY_BREAK case 47: # line 253 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case YY_STATE_EOF(SECT2PROLOG): # line 255 "scan.l" MARK_END_OF_PROLOG; yyterminate(); YY_BREAK case 49: # line 257 "scan.l" ++linenum; /* allow blank lines in section 2 */ YY_BREAK case 50: # line 259 "scan.l" { indented_code = (yytext[0] != '%'); doing_codeblock = true; bracelevel = 1; if ( indented_code ) ACTION_ECHO; BEGIN(CODEBLOCK_2); } YY_BREAK case 51: # line 270 "scan.l" BEGIN(SC); return ( '<' ); YY_BREAK case 52: # line 271 "scan.l" return ( '^' ); YY_BREAK case 53: # line 272 "scan.l" BEGIN(QUOTE); return ( '"' ); YY_BREAK case 54: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 273 "scan.l" BEGIN(NUM); return ( '{' ); YY_BREAK case 55: # line 274 "scan.l" BEGIN(BRACEERROR); YY_BREAK case 56: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 275 "scan.l" return ( '$' ); YY_BREAK case 57: # line 277 "scan.l" { bracelevel = 1; BEGIN(PERCENT_BRACE_ACTION); return ( '\n' ); } YY_BREAK case 58: # line 282 "scan.l" continued_action = true; ++linenum; return ( '\n' ); YY_BREAK case 59: # line 284 "scan.l" { /* this rule is separate from the one below because * otherwise we get variable trailing context, so * we can't build the scanner using -{f,F} */ bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } YY_BREAK case 60: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp -= 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 295 "scan.l" { bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } YY_BREAK case 61: # line 302 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 62: # line 304 "scan.l" return ( EOF_OP ); YY_BREAK case 63: # line 306 "scan.l" { sectnum = 3; BEGIN(SECT3); return ( EOF ); /* to stop the parser */ } YY_BREAK case 64: # line 312 "scan.l" { int cclval; (void) strcpy( nmstr, (char *) yytext ); /* check to see if we've already encountered this ccl */ if ( (cclval = ccllookup( (Char *) nmstr )) ) { yylval = cclval; ++cclreuse; return ( PREVCCL ); } else { /* we fudge a bit. We know that this ccl will * soon be numbered as lastccl + 1 by cclinit */ cclinstal( (Char *) nmstr, lastccl + 1 ); /* push back everything but the leading bracket * so the ccl can be rescanned */ PUT_BACK_STRING((Char *) nmstr, 1); BEGIN(FIRSTCCL); return ( '[' ); } } YY_BREAK case 65: # line 341 "scan.l" { register Char *nmdefptr; Char *ndlookup(); (void) strcpy( nmstr, (char *) yytext ); nmstr[yyleng - 1] = '\0'; /* chop trailing brace */ /* lookup from "nmstr + 1" to chop leading brace */ if ( ! (nmdefptr = ndlookup( nmstr + 1 )) ) synerr( "undefined {name}" ); else { /* push back name surrounded by ()'s */ unput(')'); PUT_BACK_STRING(nmdefptr, 0); unput('('); } } YY_BREAK case 66: # line 360 "scan.l" return ( yytext[0] ); YY_BREAK case 67: # line 361 "scan.l" RETURNCHAR; YY_BREAK case 68: # line 362 "scan.l" ++linenum; return ( '\n' ); YY_BREAK case 69: # line 365 "scan.l" return ( ',' ); YY_BREAK case 70: # line 366 "scan.l" BEGIN(SECT2); return ( '>' ); YY_BREAK case 71: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 367 "scan.l" BEGIN(CARETISBOL); return ( '>' ); YY_BREAK case 72: # line 368 "scan.l" RETURNNAME; YY_BREAK case 73: # line 369 "scan.l" synerr( "bad start condition name" ); YY_BREAK case 74: # line 371 "scan.l" BEGIN(SECT2); return ( '^' ); YY_BREAK case 75: # line 374 "scan.l" RETURNCHAR; YY_BREAK case 76: # line 375 "scan.l" BEGIN(SECT2); return ( '"' ); YY_BREAK case 77: # line 377 "scan.l" { synerr( "missing quote" ); BEGIN(SECT2); ++linenum; return ( '"' ); } YY_BREAK case 78: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 385 "scan.l" BEGIN(CCL); return ( '^' ); YY_BREAK case 79: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 386 "scan.l" return ( '^' ); YY_BREAK case 80: # line 387 "scan.l" BEGIN(CCL); yylval = '-'; return ( CHAR ); YY_BREAK case 81: # line 388 "scan.l" BEGIN(CCL); RETURNCHAR; YY_BREAK case 82: *yy_cp = yy_hold_char; /* undo effects of setting up yytext */ yy_c_buf_p = yy_cp = yy_bp + 1; YY_DO_BEFORE_ACTION; /* set up yytext again */ # line 390 "scan.l" return ( '-' ); YY_BREAK case 83: # line 391 "scan.l" RETURNCHAR; YY_BREAK case 84: # line 392 "scan.l" BEGIN(SECT2); return ( ']' ); YY_BREAK case 85: # line 395 "scan.l" { yylval = myctoi( yytext ); return ( NUMBER ); } YY_BREAK case 86: # line 400 "scan.l" return ( ',' ); YY_BREAK case 87: # line 401 "scan.l" BEGIN(SECT2); return ( '}' ); YY_BREAK case 88: # line 403 "scan.l" { synerr( "bad character inside {}'s" ); BEGIN(SECT2); return ( '}' ); } YY_BREAK case 89: # line 409 "scan.l" { synerr( "missing }" ); BEGIN(SECT2); ++linenum; return ( '}' ); } YY_BREAK case 90: # line 417 "scan.l" synerr( "bad name in {}'s" ); BEGIN(SECT2); YY_BREAK case 91: # line 418 "scan.l" synerr( "missing }" ); ++linenum; BEGIN(SECT2); YY_BREAK case 92: # line 421 "scan.l" bracelevel = 0; YY_BREAK case 93: # line 422 "scan.l" { ACTION_ECHO; CHECK_REJECT(yytext); } YY_BREAK case 94: # line 426 "scan.l" { ACTION_ECHO; CHECK_YYMORE(yytext); } YY_BREAK case 95: # line 430 "scan.l" ACTION_ECHO; YY_BREAK case 96: # line 431 "scan.l" { ++linenum; ACTION_ECHO; if ( bracelevel == 0 || (doing_codeblock && indented_code) ) { if ( ! doing_codeblock ) fputs( "\tYY_BREAK\n", temp_action_file ); doing_codeblock = false; BEGIN(SECT2); } } YY_BREAK /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ case 97: # line 447 "scan.l" ACTION_ECHO; ++bracelevel; YY_BREAK case 98: # line 448 "scan.l" ACTION_ECHO; --bracelevel; YY_BREAK case 99: # line 449 "scan.l" ACTION_ECHO; YY_BREAK case 100: # line 450 "scan.l" ACTION_ECHO; YY_BREAK case 101: # line 451 "scan.l" ACTION_ECHO; BEGIN(ACTION_COMMENT); YY_BREAK case 102: # line 452 "scan.l" ACTION_ECHO; /* character constant */ YY_BREAK case 103: # line 453 "scan.l" ACTION_ECHO; BEGIN(ACTION_STRING); YY_BREAK case 104: # line 454 "scan.l" { ++linenum; ACTION_ECHO; if ( bracelevel == 0 ) { fputs( "\tYY_BREAK\n", temp_action_file ); BEGIN(SECT2); } } YY_BREAK case 105: # line 463 "scan.l" ACTION_ECHO; YY_BREAK case 106: # line 465 "scan.l" ACTION_ECHO; BEGIN(ACTION); YY_BREAK case 107: # line 466 "scan.l" ACTION_ECHO; YY_BREAK case 108: # line 467 "scan.l" ACTION_ECHO; YY_BREAK case 109: # line 468 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case 110: # line 469 "scan.l" ACTION_ECHO; YY_BREAK case 111: # line 471 "scan.l" ACTION_ECHO; YY_BREAK case 112: # line 472 "scan.l" ACTION_ECHO; YY_BREAK case 113: # line 473 "scan.l" ++linenum; ACTION_ECHO; YY_BREAK case 114: # line 474 "scan.l" ACTION_ECHO; BEGIN(ACTION); YY_BREAK case 115: # line 475 "scan.l" ACTION_ECHO; YY_BREAK case YY_STATE_EOF(ACTION): case YY_STATE_EOF(ACTION_COMMENT): case YY_STATE_EOF(ACTION_STRING): # line 477 "scan.l" { synerr( "EOF encountered inside an action" ); yyterminate(); } YY_BREAK case 117: # line 483 "scan.l" { yylval = myesc( yytext ); return ( CHAR ); } YY_BREAK case 118: # line 488 "scan.l" { yylval = myesc( yytext ); BEGIN(CCL); return ( CHAR ); } YY_BREAK case 119: # line 495 "scan.l" ECHO; YY_BREAK case 120: # line 496 "scan.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK case YY_STATE_EOF(INITIAL): case YY_STATE_EOF(SECT2): case YY_STATE_EOF(SECT3): case YY_STATE_EOF(CODEBLOCK): case YY_STATE_EOF(PICKUPDEF): case YY_STATE_EOF(SC): case YY_STATE_EOF(CARETISBOL): case YY_STATE_EOF(NUM): case YY_STATE_EOF(QUOTE): case YY_STATE_EOF(FIRSTCCL): case YY_STATE_EOF(CCL): case YY_STATE_EOF(RECOVER): case YY_STATE_EOF(BRACEERROR): case YY_STATE_EOF(C_COMMENT): case YY_STATE_EOF(PERCENT_BRACE_ACTION): case YY_STATE_EOF(USED_LIST): case YY_STATE_EOF(CODEBLOCK_2): case YY_STATE_EOF(XLATION): yyterminate(); case YY_END_OF_BUFFER: { /* amount of text matched not including the EOB char */ int yy_amount_of_matched_text = yy_cp - yytext - 1; /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yy_hold_char; /* note that here we test for yy_c_buf_p "<=" to the position * of the first EOB in the buffer, since yy_c_buf_p will * already have been incremented past the NUL character * (since all states make transitions on EOB to the end- * of-buffer state). Contrast this with the test in yyinput(). */ if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ { yy_state_type yy_next_state; yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); /* okay, we're now positioned to make the * NUL transition. We couldn't have * yy_get_previous_state() go ahead and do it * for us because it doesn't know how to deal * with the possibility of jamming (and we * don't want to build jamming into it because * then it will run more slowly) */ yy_next_state = yy_try_NUL_trans( yy_current_state ); yy_bp = yytext + YY_MORE_ADJ; if ( yy_next_state ) { /* consume the NUL */ yy_cp = ++yy_c_buf_p; yy_current_state = yy_next_state; goto yy_match; } else { yy_cp = yy_last_accepting_cpos; yy_current_state = yy_last_accepting_state; goto yy_find_action; } } else switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { yy_did_buffer_switch_on_eof = 0; if ( yywrap() ) { /* note: because we've taken care in * yy_get_next_buffer() to have set up yytext, * we can now set up yy_c_buf_p so that if some * total hoser (like flex itself) wants * to call the scanner after we return the * YY_NULL, it'll still work - another YY_NULL * will get returned. */ yy_c_buf_p = yytext + YY_MORE_ADJ; yy_act = YY_STATE_EOF((yy_start - 1) / 2); goto do_action; } else { if ( ! yy_did_buffer_switch_on_eof ) YY_NEW_FILE; } } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + yy_amount_of_matched_text; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_match; case EOB_ACT_LAST_MATCH: yy_c_buf_p = &yy_current_buffer->yy_ch_buf[yy_n_chars]; yy_current_state = yy_get_previous_state(); yy_cp = yy_c_buf_p; yy_bp = yytext + YY_MORE_ADJ; goto yy_find_action; } break; } default: #ifdef FLEX_DEBUG printf( "action # %d\n", yy_act ); #endif YY_FATAL_ERROR( "fatal flex scanner internal error--no action found" ); } } } /* yy_get_next_buffer - try to read in a new buffer * * synopsis * int yy_get_next_buffer(); * * returns a code representing an action * EOB_ACT_LAST_MATCH - * EOB_ACT_CONTINUE_SCAN - continue scanning from current position * EOB_ACT_END_OF_FILE - end of file */ static int yy_get_next_buffer() { register YY_CHAR *dest = yy_current_buffer->yy_ch_buf; register YY_CHAR *source = yytext - 1; /* copy prev. char, too */ register int number_to_move, i; int ret_val; if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) YY_FATAL_ERROR( "fatal flex scanner internal error--end of buffer missed" ); /* try to read more data */ /* first move last chars to start of buffer */ number_to_move = yy_c_buf_p - yytext; for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); if ( yy_current_buffer->yy_eof_status != EOF_NOT_SEEN ) /* don't do the read, it's not guaranteed to return an EOF, * just force an EOF */ yy_n_chars = 0; else { int num_to_read = yy_current_buffer->yy_buf_size - number_to_move - 1; if ( num_to_read > YY_READ_BUF_SIZE ) num_to_read = YY_READ_BUF_SIZE; else if ( num_to_read <= 0 ) YY_FATAL_ERROR( "fatal error - scanner input buffer overflow" ); /* read in more data */ YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); } if ( yy_n_chars == 0 ) { if ( number_to_move == 1 ) { ret_val = EOB_ACT_END_OF_FILE; yy_current_buffer->yy_eof_status = EOF_DONE; } else { ret_val = EOB_ACT_LAST_MATCH; yy_current_buffer->yy_eof_status = EOF_PENDING; } } else ret_val = EOB_ACT_CONTINUE_SCAN; yy_n_chars += number_to_move; yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; /* yytext begins at the second character in yy_ch_buf; the first * character is the one which preceded it before reading in the latest * buffer; it needs to be kept around in case it's a newline, so * yy_get_previous_state() will have with '^' rules active */ yytext = &yy_current_buffer->yy_ch_buf[1]; return ( ret_val ); } /* yy_get_previous_state - get the state just before the EOB char was reached * * synopsis * yy_state_type yy_get_previous_state(); */ static yy_state_type yy_get_previous_state() { register yy_state_type yy_current_state; register YY_CHAR *yy_cp; register YY_CHAR *yy_bp = yytext; yy_current_state = yy_start; if ( yy_bp[-1] == '\n' ) ++yy_current_state; for ( yy_cp = yytext + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) { register YY_CHAR yy_c = (*yy_cp ? yy_ec[*yy_cp] : 1); if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; } return ( yy_current_state ); } /* yy_try_NUL_trans - try to make a transition on the NUL character * * synopsis * next_state = yy_try_NUL_trans( current_state ); */ #ifdef YY_USE_PROTOS static yy_state_type yy_try_NUL_trans( register yy_state_type yy_current_state ) #else static yy_state_type yy_try_NUL_trans( yy_current_state ) register yy_state_type yy_current_state; #endif { register int yy_is_jam; register YY_CHAR *yy_cp = yy_c_buf_p; register YY_CHAR yy_c = 1; if ( yy_accept[yy_current_state] ) { yy_last_accepting_state = yy_current_state; yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = yy_def[yy_current_state]; if ( yy_current_state >= 341 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; yy_is_jam = (yy_current_state == 340); return ( yy_is_jam ? 0 : yy_current_state ); } #ifdef YY_USE_PROTOS static void yyunput( YY_CHAR c, register YY_CHAR *yy_bp ) #else static void yyunput( c, yy_bp ) YY_CHAR c; register YY_CHAR *yy_bp; #endif { register YY_CHAR *yy_cp = yy_c_buf_p; /* undo effects of setting up yytext */ *yy_cp = yy_hold_char; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) { /* need to shift things up to make room */ register int number_to_move = yy_n_chars + 2; /* +2 for EOB chars */ register YY_CHAR *dest = &yy_current_buffer->yy_ch_buf[yy_current_buffer->yy_buf_size + 2]; register YY_CHAR *source = &yy_current_buffer->yy_ch_buf[number_to_move]; while ( source > yy_current_buffer->yy_ch_buf ) *--dest = *--source; yy_cp += dest - source; yy_bp += dest - source; yy_n_chars = yy_current_buffer->yy_buf_size; if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) YY_FATAL_ERROR( "flex scanner push-back overflow" ); } if ( yy_cp > yy_bp && yy_cp[-1] == '\n' ) yy_cp[-2] = '\n'; *--yy_cp = c; /* note: the formal parameter *must* be called "yy_bp" for this * macro to now work correctly */ YY_DO_BEFORE_ACTION; /* set up yytext again */ } #ifdef __cplusplus static int yyinput() #else static int input() #endif { int c; YY_CHAR *yy_cp = yy_c_buf_p; *yy_cp = yy_hold_char; if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) { /* yy_c_buf_p now points to the character we want to return. * If this occurs *before* the EOB characters, then it's a * valid NUL; if not, then we've hit the end of the buffer. */ if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) /* this was really a NUL */ *yy_c_buf_p = '\0'; else { /* need more input */ yytext = yy_c_buf_p; ++yy_c_buf_p; switch ( yy_get_next_buffer() ) { case EOB_ACT_END_OF_FILE: { if ( yywrap() ) { yy_c_buf_p = yytext + YY_MORE_ADJ; return ( EOF ); } YY_NEW_FILE; #ifdef __cplusplus return ( yyinput() ); #else return ( input() ); #endif } break; case EOB_ACT_CONTINUE_SCAN: yy_c_buf_p = yytext + YY_MORE_ADJ; break; case EOB_ACT_LAST_MATCH: #ifdef __cplusplus YY_FATAL_ERROR( "unexpected last match in yyinput()" ); #else YY_FATAL_ERROR( "unexpected last match in input()" ); #endif } } } c = *yy_c_buf_p; yy_hold_char = *++yy_c_buf_p; return ( c ); } #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else void yyrestart( input_file ) FILE *input_file; #endif { yy_init_buffer( yy_current_buffer, input_file ); yy_load_buffer_state(); } #ifdef YY_USE_PROTOS void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) #else void yy_switch_to_buffer( new_buffer ) YY_BUFFER_STATE new_buffer; #endif { if ( yy_current_buffer == new_buffer ) return; if ( yy_current_buffer ) { /* flush out information for old buffer */ *yy_c_buf_p = yy_hold_char; yy_current_buffer->yy_buf_pos = yy_c_buf_p; yy_current_buffer->yy_n_chars = yy_n_chars; } yy_current_buffer = new_buffer; yy_load_buffer_state(); /* we don't actually know whether we did this switch during * EOF (yywrap()) processing, but the only time this flag * is looked at is after yywrap() is called, so it's safe * to go ahead and always set it. */ yy_did_buffer_switch_on_eof = 1; } #ifdef YY_USE_PROTOS void yy_load_buffer_state( void ) #else void yy_load_buffer_state() #endif { yy_n_chars = yy_current_buffer->yy_n_chars; yytext = yy_c_buf_p = yy_current_buffer->yy_buf_pos; yyin = yy_current_buffer->yy_input_file; yy_hold_char = *yy_c_buf_p; } #ifdef YY_USE_PROTOS YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) #else YY_BUFFER_STATE yy_create_buffer( file, size ) FILE *file; int size; #endif { YY_BUFFER_STATE b; b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) ); if ( ! b ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); b->yy_buf_size = size; /* yy_ch_buf has to be 2 characters longer than the size given because * we need to put in 2 end-of-buffer characters. */ b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 2) ); if ( ! b->yy_ch_buf ) YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); yy_init_buffer( b, file ); return ( b ); } #ifdef YY_USE_PROTOS void yy_delete_buffer( YY_BUFFER_STATE b ) #else void yy_delete_buffer( b ) YY_BUFFER_STATE b; #endif { if ( b == yy_current_buffer ) yy_current_buffer = (YY_BUFFER_STATE) 0; free( (char *) b->yy_ch_buf ); free( (char *) b ); } #ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) #else void yy_init_buffer( b, file ) YY_BUFFER_STATE b; FILE *file; #endif { b->yy_input_file = file; /* we put in the '\n' and start reading from [1] so that an * initial match-at-newline will be true. */ b->yy_ch_buf[0] = '\n'; b->yy_n_chars = 1; /* we always need two end-of-buffer characters. The first causes * a transition to the end-of-buffer state. The second causes * a jam in that state. */ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; b->yy_ch_buf[2] = YY_END_OF_BUFFER_CHAR; b->yy_buf_pos = &b->yy_ch_buf[1]; b->yy_eof_status = EOF_NOT_SEEN; } # line 496 "scan.l" int yywrap() { if ( --num_input_files > 0 ) { set_input_file( *++input_files ); return ( 0 ); } else return ( 1 ); } /* set_input_file - open the given file (if NULL, stdin) for scanning */ void set_input_file( file ) char *file; { if ( file ) { infilename = file; yyin = fopen( infilename, "r" ); if ( yyin == NULL ) lerrsf( "can't open %s", file ); } else { yyin = stdin; infilename = "<stdin>"; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /* scan.l - scanner for flex input */ %{ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/scan.l,v 2.9 90/06/27 23:48:34 vern Exp $ (LBL)"; #endif #undef yywrap #include "flexdef.h" #include "parse.h" #define ACTION_ECHO fprintf( temp_action_file, "%s", yytext ) #define MARK_END_OF_PROLOG fprintf( temp_action_file, "%%%% end of prolog\n" ); #undef YY_DECL #define YY_DECL \ int flexscan() #define RETURNCHAR \ yylval = yytext[0]; \ return ( CHAR ); #define RETURNNAME \ (void) strcpy( nmstr, (char *) yytext ); \ return ( NAME ); #define PUT_BACK_STRING(str, start) \ for ( i = strlen( (char *) (str) ) - 1; i >= start; --i ) \ unput((str)[i]) #define CHECK_REJECT(str) \ if ( all_upper( str ) ) \ reject = true; #define CHECK_YYMORE(str) \ if ( all_lower( str ) ) \ yymore_used = true; %} %x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE %x FIRSTCCL CCL ACTION RECOVER BRACEERROR C_COMMENT ACTION_COMMENT %x ACTION_STRING PERCENT_BRACE_ACTION USED_LIST CODEBLOCK_2 XLATION WS [ \t\f]+ OPTWS [ \t\f]* NOT_WS [^ \t\f\n] NAME [a-z_][a-z_0-9-]* NOT_NAME [^a-z_\n]+ SCNAME {NAME} ESCSEQ \\([^\n]|[0-9]{1,3}|x[0-9a-f]{1,2}) %% static int bracelevel, didadef; int i, indented_code, checking_used, new_xlation; int doing_codeblock = false; Char nmdef[MAXLINE], myesc(); ^{WS} indented_code = true; BEGIN(CODEBLOCK); ^#.*\n ++linenum; /* treat as a comment */ ^"/*" ECHO; BEGIN(C_COMMENT); ^"%s"{NAME}? return ( SCDECL ); ^"%x"{NAME}? return ( XSCDECL ); ^"%{".*\n { ++linenum; line_directive_out( stdout ); indented_code = false; BEGIN(CODEBLOCK); } {WS} return ( WHITESPACE ); ^"%%".* { sectnum = 2; line_directive_out( stdout ); BEGIN(SECT2PROLOG); return ( SECTEND ); } ^"%used" { pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_USED; BEGIN(USED_LIST); } ^"%unused" { checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); pinpoint_message( "warning - %%used/%%unused have been deprecated" ); checking_used = REALLY_NOT_USED; BEGIN(USED_LIST); } ^"%"[aeknopt]" ".*\n { #ifdef NOTDEF fprintf( stderr, "old-style lex command at line %d ignored:\n\t%s", linenum, yytext ); #endif ++linenum; } ^"%"[cr]{OPTWS} /* ignore old lex directive */ %t{OPTWS}\n { ++linenum; xlation = (int *) malloc( sizeof( int ) * (unsigned) csize ); if ( ! xlation ) flexfatal( "dynamic memory failure building %t table" ); for ( i = 0; i < csize; ++i ) xlation[i] = 0; num_xlations = 0; BEGIN(XLATION); } ^"%"[^sxanpekotcru{}]{OPTWS} synerr( "unrecognized '%' directive" ); ^{NAME} { (void) strcpy( nmstr, (char *) yytext ); didadef = false; BEGIN(PICKUPDEF); } {SCNAME} RETURNNAME; ^{OPTWS}\n ++linenum; /* allows blank lines in section 1 */ {OPTWS}\n ++linenum; return ( '\n' ); . synerr( "illegal character" ); BEGIN(RECOVER); <C_COMMENT>"*/" ECHO; BEGIN(INITIAL); <C_COMMENT>"*/".*\n ++linenum; ECHO; BEGIN(INITIAL); <C_COMMENT>[^*\n]+ ECHO; <C_COMMENT>"*" ECHO; <C_COMMENT>\n ++linenum; ECHO; <CODEBLOCK>^"%}".*\n ++linenum; BEGIN(INITIAL); <CODEBLOCK>"reject" ECHO; CHECK_REJECT(yytext); <CODEBLOCK>"yymore" ECHO; CHECK_YYMORE(yytext); <CODEBLOCK>{NAME}|{NOT_NAME}|. ECHO; <CODEBLOCK>\n { ++linenum; ECHO; if ( indented_code ) BEGIN(INITIAL); } <PICKUPDEF>{WS} /* separates name and definition */ <PICKUPDEF>{NOT_WS}.* { (void) strcpy( (char *) nmdef, (char *) yytext ); for ( i = strlen( (char *) nmdef ) - 1; i >= 0 && nmdef[i] == ' ' || nmdef[i] == '\t'; --i ) ; nmdef[i + 1] = '\0'; ndinstal( nmstr, nmdef ); didadef = true; } <PICKUPDEF>\n { if ( ! didadef ) synerr( "incomplete name definition" ); BEGIN(INITIAL); ++linenum; } <RECOVER>.*\n ++linenum; BEGIN(INITIAL); RETURNNAME; <USED_LIST>\n ++linenum; BEGIN(INITIAL); <USED_LIST>{WS} <USED_LIST>"reject" { if ( all_upper( yytext ) ) reject_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } <USED_LIST>"yymore" { if ( all_lower( yytext ) ) yymore_really_used = checking_used; else synerr( "unrecognized %used/%unused construct" ); } <USED_LIST>{NOT_WS}+ synerr( "unrecognized %used/%unused construct" ); <XLATION>"%t"{OPTWS}\n ++linenum; BEGIN(INITIAL); <XLATION>^{OPTWS}[0-9]+ ++num_xlations; new_xlation = true; <XLATION>^. synerr( "bad row in translation table" ); <XLATION>{WS} /* ignore whitespace */ <XLATION>{ESCSEQ} { xlation[myesc( yytext )] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } <XLATION>. { xlation[yytext[0]] = (new_xlation ? num_xlations : -num_xlations); new_xlation = false; } <XLATION>\n ++linenum; <SECT2PROLOG>.*\n/{NOT_WS} { ++linenum; ACTION_ECHO; MARK_END_OF_PROLOG; BEGIN(SECT2); } <SECT2PROLOG>.*\n ++linenum; ACTION_ECHO; <SECT2PROLOG><<EOF>> MARK_END_OF_PROLOG; yyterminate(); <SECT2>^{OPTWS}\n ++linenum; /* allow blank lines in section 2 */ <SECT2>^({WS}|"%{") { indented_code = (yytext[0] != '%'); doing_codeblock = true; bracelevel = 1; if ( indented_code ) ACTION_ECHO; BEGIN(CODEBLOCK_2); } <SECT2>"<" BEGIN(SC); return ( '<' ); <SECT2>^"^" return ( '^' ); <SECT2>\" BEGIN(QUOTE); return ( '"' ); <SECT2>"{"/[0-9] BEGIN(NUM); return ( '{' ); <SECT2>"{"[^0-9\n][^}\n]* BEGIN(BRACEERROR); <SECT2>"$"/[ \t\n] return ( '$' ); <SECT2>{WS}"%{" { bracelevel = 1; BEGIN(PERCENT_BRACE_ACTION); return ( '\n' ); } <SECT2>{WS}"|".*\n continued_action = true; ++linenum; return ( '\n' ); <SECT2>{WS} { /* this rule is separate from the one below because * otherwise we get variable trailing context, so * we can't build the scanner using -{f,F} */ bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } <SECT2>{OPTWS}/\n { bracelevel = 0; continued_action = false; BEGIN(ACTION); return ( '\n' ); } <SECT2>^{OPTWS}\n ++linenum; return ( '\n' ); <SECT2>"<<EOF>>" return ( EOF_OP ); <SECT2>^"%%".* { sectnum = 3; BEGIN(SECT3); return ( EOF ); /* to stop the parser */ } <SECT2>"["([^\\\]\n]|{ESCSEQ})+"]" { int cclval; (void) strcpy( nmstr, (char *) yytext ); /* check to see if we've already encountered this ccl */ if ( (cclval = ccllookup( (Char *) nmstr )) ) { yylval = cclval; ++cclreuse; return ( PREVCCL ); } else { /* we fudge a bit. We know that this ccl will * soon be numbered as lastccl + 1 by cclinit */ cclinstal( (Char *) nmstr, lastccl + 1 ); /* push back everything but the leadD��D��D��D��D��D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ing bracket * so the ccl can be rescanned */ PUT_BACK_STRING((Char *) nmstr, 1); BEGIN(FIRSTCCL); return ( '[' ); } } <SECT2>"{"{NAME}"}" { register Char *nmdefptr; Char *ndlookup(); (void) strcpy( nmstr, (char *) yytext ); nmstr[yyleng - 1] = '\0'; /* chop trailing brace */ /* lookup from "nmstr + 1" to chop leading brace */ if ( ! (nmdefptr = ndlookup( nmstr + 1 )) ) synerr( "undefined {name}" ); else { /* push back name surrounded by ()'s */ unput(')'); PUT_BACK_STRING(nmdefptr, 0); unput('('); } } <SECT2>[/|*+?.()] return ( yytext[0] ); <SECT2>. RETURNCHAR; <SECT2>\n ++linenum; return ( '\n' ); <SC>"," return ( ',' ); <SC>">" BEGIN(SECT2); return ( '>' ); <SC>">"/"^" BEGIN(CARETISBOL); return ( '>' ); <SC>{SCNAME} RETURNNAME; <SC>. synerr( "bad start condition name" ); <CARETISBOL>"^" BEGIN(SECT2); return ( '^' ); <QUOTE>[^"\n] RETURNCHAR; <QUOTE>\" BEGIN(SECT2); return ( '"' ); <QUOTE>\n { synerr( "missing quote" ); BEGIN(SECT2); ++linenum; return ( '"' ); } <FIRSTCCL>"^"/[^-\n] BEGIN(CCL); return ( '^' ); <FIRSTCCL>"^"/- return ( '^' ); <FIRSTCCL>- BEGIN(CCL); yylval = '-'; return ( CHAR ); <FIRSTCCL>. BEGIN(CCL); RETURNCHAR; <CCL>-/[^\]\n] return ( '-' ); <CCL>[^\]\n] RETURNCHAR; <CCL>"]" BEGIN(SECT2); return ( ']' ); <NUM>[0-9]+ { yylval = myctoi( yytext ); return ( NUMBER ); } <NUM>"," return ( ',' ); <NUM>"}" BEGIN(SECT2); return ( '}' ); <NUM>. { synerr( "bad character inside {}'s" ); BEGIN(SECT2); return ( '}' ); } <NUM>\n { synerr( "missing }" ); BEGIN(SECT2); ++linenum; return ( '}' ); } <BRACEERROR>"}" synerr( "bad name in {}'s" ); BEGIN(SECT2); <BRACEERROR>\n synerr( "missing }" ); ++linenum; BEGIN(SECT2); <PERCENT_BRACE_ACTION,CODEBLOCK_2>{OPTWS}"%}".* bracelevel = 0; <PERCENT_BRACE_ACTION,CODEBLOCK_2,ACTION>"reject" { ACTION_ECHO; CHECK_REJECT(yytext); } <PERCENT_BRACE_ACTION,CODEBLOCK_2,ACTION>"yymore" { ACTION_ECHO; CHECK_YYMORE(yytext); } <PERCENT_BRACE_ACTION,CODEBLOCK_2>{NAME}|{NOT_NAME}|. ACTION_ECHO; <PERCENT_BRACE_ACTION,CODEBLOCK_2>\n { ++linenum; ACTION_ECHO; if ( bracelevel == 0 || (doing_codeblock && indented_code) ) { if ( ! doing_codeblock ) fputs( "\tYY_BREAK\n", temp_action_file ); doing_codeblock = false; BEGIN(SECT2); } } /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */ <ACTION>"{" ACTION_ECHO; ++bracelevel; <ACTION>"}" ACTION_ECHO; --bracelevel; <ACTION>[^a-z_{}"'/\n]+ ACTION_ECHO; <ACTION>{NAME} ACTION_ECHO; <ACTION>"/*" ACTION_ECHO; BEGIN(ACTION_COMMENT); <ACTION>"'"([^'\\\n]|\\.)*"'" ACTION_ECHO; /* character constant */ <ACTION>\" ACTION_ECHO; BEGIN(ACTION_STRING); <ACTION>\n { ++linenum; ACTION_ECHO; if ( bracelevel == 0 ) { fputs( "\tYY_BREAK\n", temp_action_file ); BEGIN(SECT2); } } <ACTION>. ACTION_ECHO; <ACTION_COMMENT>"*/" ACTION_ECHO; BEGIN(ACTION); <ACTION_COMMENT>[^*\n]+ ACTION_ECHO; <ACTION_COMMENT>"*" ACTION_ECHO; <ACTION_COMMENT>\n ++linenum; ACTION_ECHO; <ACTION_COMMENT>. ACTION_ECHO; <ACTION_STRING>[^"\\\n]+ ACTION_ECHO; <ACTION_STRING>\\. ACTION_ECHO; <ACTION_STRING>\n ++linenum; ACTION_ECHO; <ACTION_STRING>\" ACTION_ECHO; BEGIN(ACTION); <ACTION_STRING>. ACTION_ECHO; <ACTION,ACTION_COMMENT,ACTION_STRING><<EOF>> { synerr( "EOF encountered inside an action" ); yyterminate(); } <SECT2,QUOTE,CCL>{ESCSEQ} { yylval = myesc( yytext ); return ( CHAR ); } <FIRSTCCL>{ESCSEQ} { yylval = myesc( yytext ); BEGIN(CCL); return ( CHAR ); } <SECT3>.*(\n?) ECHO; %% int yywrap() { if ( --num_input_files > 0 ) { set_input_file( *++input_files ); return ( 0 ); } else return ( 1 ); } /* set_input_file - open the given file (if NULL, stdin) for scanning */ void set_input_file( file ) char *file; { if ( file ) { infilename = file; yyin = fopen( infilename, "r" ); if ( yyin == NULL ) lerrsf( "can't open %s", file ); } else { yyin = stdin; infilename = "<stdin>"; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sym - symbol table routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/sym.c,v 2.4 90/06/27 23:48:36 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* declare functions that have forward references */ int hashfunct PROTO((register char[], int)); struct hash_entry *ndtbl[NAME_TABLE_HASH_SIZE]; struct hash_entry *sctbl[START_COND_HASH_SIZE]; struct hash_entry *ccltab[CCL_HASH_SIZE]; struct hash_entry *findsym(); /* addsym - add symbol and definitions to symbol table * * synopsis * char sym[], *str_def; * int int_def; * hash_table table; * int table_size; * 0 / -1 = addsym( sym, def, int_def, table, table_size ); * * -1 is returned if the symbol already exists, and the change not made. */ int addsym( sym, str_def, int_def, table, table_size ) register char sym[]; char *str_def; int int_def; hash_table table; int table_size; { int hash_val = hashfunct( sym, table_size ); register struct hash_entry *sym_entry = table[hash_val]; register struct hash_entry *new_entry; register struct hash_entry *successor; while ( sym_entry ) { if ( ! strcmp( sym, sym_entry->name ) ) { /* entry already exists */ return ( -1 ); } sym_entry = sym_entry->next; } /* create new entry */ new_entry = (struct hash_entry *) malloc( sizeof( struct hash_entry ) ); if ( new_entry == NULL ) flexfatal( "symbol table memory allocation failed" ); if ( (successor = table[hash_val]) ) { new_entry->next = successor; successor->prev = new_entry; } else new_entry->next = NULL; new_entry->prev = NULL; new_entry->name = sym; new_entry->str_val = str_def; new_entry->int_val = int_def; table[hash_val] = new_entry; return ( 0 ); } /* cclinstal - save the text of a character class * * synopsis * Char ccltxt[]; * int cclnum; * cclinstal( ccltxt, cclnum ); */ void cclinstal( ccltxt, cclnum ) Char ccltxt[]; int cclnum; { /* we don't bother checking the return status because we are not called * unless the symbol is new */ Char *copy_unsigned_string(); (void) addsym( (char *) copy_unsigned_string( ccltxt ), (char *) 0, cclnum, ccltab, CCL_HASH_SIZE ); } /* ccllookup - lookup the number associated with character class text * * synopsis * Char ccltxt[]; * int ccllookup, cclval; * cclval/0 = ccllookup( ccltxt ); */ int ccllookup( ccltxt ) Char ccltxt[]; { return ( findsym( (char *) ccltxt, ccltab, CCL_HASH_SIZE )->int_val ); } /* findsym - find symbol in symbol table * * synopsis * char sym[]; * hash_table table; * int table_size; * struct hash_entry *sym_entry, *findsym(); * sym_entry = findsym( sym, table, table_size ); */ struct hash_entry *findsym( sym, table, table_size ) register char sym[]; hash_table table; int table_size; { register struct hash_entry *sym_entry = table[hashfunct( sym, table_size )]; static struct hash_entry empty_entry = { (struct hash_entry *) 0, (struct hash_entry *) 0, NULL, NULL, 0, } ; while ( sym_entry ) { if ( ! strcmp( sym, sym_entry->name ) ) return ( sym_entry ); sym_entry = sym_entry->next; } return ( &empty_entry ); } /* hashfunct - compute the hash value for "str" and hash size "hash_size" * * synopsis * char str[]; * int hash_size, hash_val; * hash_val = hashfunct( str, hash_size ); */ int hashfunct( str, hash_size ) register char str[]; int hash_size; { register int hashval; register int locstr; hashval = 0; locstr = 0; while ( str[locstr] ) hashval = ((hashval << 1) + str[locstr++]) % hash_size; return ( hashval ); } /* ndinstal - install a name definition * * synopsis * char nd[]; * Char def[]; * ndinstal( nd, def ); */ void ndinstal( nd, def ) char nd[]; Char def[]; { char *copy_string(); Char *copy_unsigned_string(); if ( addsym( copy_string( nd ), (char *) copy_unsigned_string( def ), 0, ndtbl, NAME_TABLE_HASH_SIZE ) ) synerr( "name defined twice" ); } /* ndlookup - lookup a name definition * * synopsis * char nd[], *def; * char *ndlookup(); * def/NULL = ndlookup( nd ); */ Char *ndlookup( nd ) char nd[]; { return ( (Char *) findsym( nd, ndtbl, NAME_TABLE_HASH_SIZE )->str_val ); } /* scinstal - make a start condition * * synopsis * char str[]; * int xcluflg; * scinstal( str, xcluflg ); * * NOTE * the start condition is Exclusive if xcluflg is true */ void scinstal( str, xcluflg ) char str[]; int xcluflg; { char *copy_string(); /* bit of a hack. We know how the default start-condition is * declared, and don't put out a define for it, because it * would come out as "#define 0 1" */ /* actually, this is no longer the case. The default start-condition * is now called "INITIAL". But we keep the following for the sake * of future robustness. */ if ( strcmp( str, "0" ) ) printf( "#define %s %d\n", str, lastsc ); if ( ++lastsc >= current_max_scs ) { current_max_scs += MAX_SCS_INCREMENT; ++num_reallocs; scset = reallocate_integer_array( scset, current_max_scs ); scbol = reallocate_integer_array( scbol, current_max_scs ); scxclu = reallocate_integer_array( scxclu, current_max_scs ); sceof = reallocate_integer_array( sceof, current_max_scs ); scname = reallocate_char_ptr_array( scname, current_max_scs ); actvsc = reallocate_integer_array( actvsc, current_max_scs ); } scname[lastsc] = copy_string( str ); if ( addsym( scname[lastsc], (char *) 0, lastsc, sctbl, START_COND_HASH_SIZE ) ) format_pinpoint_message( "start condition %s declared twice", str ); scset[lastsc] = mkstate( SYM_EPSILON ); scbol[lastsc] = mkstate( SYM_EPSILON ); scxclu[lastsc] = xcluflg; sceof[lastsc] = false; } /* sclookup - lookup the number associated with a start condition * * synopsis * char str[], scnum; * int sclookup; * scnum/0 = sclookup( str ); */ int sclookup( str ) char str[]; { return ( findsym( str, sctbl, START_COND_HASH_SIZE )->int_val ); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!D��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tblcmp - table compression routines */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/tblcmp.c,v 2.5 90/06/27 23:48:38 vern Exp $ (LBL)"; #endif #include "flexdef.h" /* declarations for functions that have forward references */ void mkentry PROTO((register int*, int, int, int, int)); void mkprot PROTO((int[], int, int)); void mktemplate PROTO((int[], int, int)); void mv2front PROTO((int)); int tbldiff PROTO((int[], int, int[])); /* bldtbl - build table entries for dfa state * * synopsis * int state[numecs], statenum, totaltrans, comstate, comfreq; * bldtbl( state, statenum, totaltrans, comstate, comfreq ); * * State is the statenum'th dfa state. It is indexed by equivalence class and * gives the number of the state to enter for a given equivalence class. * totaltrans is the total number of transitions out of the state. Comstate * is that state which is the destination of the most transitions out of State. * Comfreq is how many transitions there are out of State to Comstate. * * A note on terminology: * "protos" are transition tables which have a high probability of * either being redundant (a state processed later will have an identical * transition table) or nearly redundant (a state processed later will have * many of the same out-transitions). A "most recently used" queue of * protos is kept around with the hope that most states will find a proto * which is similar enough to be usable, and therefore compacting the * output tables. * "templates" are a special type of proto. If a transition table is * homogeneous or nearly homogeneous (all transitions go to the same * destination) then the odds are good that future states will also go * to the same destination state on basically the same character set. * These homogeneous states are so common when dealing with large rule * sets that they merit special attention. If the transition table were * simply made into a proto, then (typically) each subsequent, similar * state will differ from the proto for two out-transitions. One of these * out-transitions will be that character on which the proto does not go * to the common destination, and one will be that character on which the * state does not go to the common destination. Templates, on the other * hand, go to the common state on EVERY transition character, and therefore * cost only one difference. */ void bldtbl( state, statenum, totaltrans, comstate, comfreq ) int state[], statenum, totaltrans, comstate, comfreq; { int extptr, extrct[2][CSIZE + 1]; int mindiff, minprot, i, d; int checkcom; /* If extptr is 0 then the first array of extrct holds the result of the * "best difference" to date, which is those transitions which occur in * "state" but not in the proto which, to date, has the fewest differences * between itself and "state". If extptr is 1 then the second array of * extrct hold the best difference. The two arrays are toggled * between so that the best difference to date can be kept around and * also a difference just created by checking against a candidate "best" * proto. */ extptr = 0; /* if the state has too few out-transitions, don't bother trying to * compact its tables */ if ( (totaltrans * 100) < (numecs * PROTO_SIZE_PERCENTAGE) ) mkentry( state, numecs, statenum, JAMSTATE, totaltrans ); else { /* checkcom is true if we should only check "state" against * protos which have the same "comstate" value */ checkcom = comfreq * 100 > totaltrans * CHECK_COM_PERCENTAGE; minprot = firstprot; mindiff = totaltrans; if ( checkcom ) { /* find first proto which has the same "comstate" */ for ( i = firstprot; i != NIL; i = protnext[i] ) if ( protcomst[i] == comstate ) { minprot = i; mindiff = tbldiff( state, minprot, extrct[extptr] ); break; } } else { /* since we've decided that the most common destination out * of "state" does not occur with a high enough frequency, * we set the "comstate" to zero, assuring that if this state * is entered into the proto list, it will not be considered * a template. */ comstate = 0; if ( firstprot != NIL ) { minprot = firstprot; mindiff = tbldiff( state, minprot, extrct[extptr] ); } } /* we now have the first interesting proto in "minprot". If * it matches within the tolerances set for the first proto, * we don't want to bother scanning the rest of the proto list * to see if we have any other reasonable matches. */ if ( mindiff * 100 > totaltrans * FIRST_MATCH_DIFF_PERCENTAGE ) { /* not a good enough match. Scan the rest of the protos */ for ( i = minprot; i != NIL; i = protnext[i] ) { d = tbldiff( state, i, extrct[1 - extptr] ); if ( d < mindiff ) { extptr = 1 - extptr; mindiff = d; minprot = i; } } } /* check if the proto we've decided on as our best bet is close * enough to the state we want to match to be usable */ if ( mindiff * 100 > totaltrans * ACCEPTABLE_DIFF_PERCENTAGE ) { /* no good. If the state is homogeneous enough, we make a * template out of it. Otherwise, we make a proto. */ if ( comfreq * 100 >= totaltrans * TEMPLATE_SAME_PERCENTAGE ) mktemplate( state, statenum, comstate ); else { mkprot( state, statenum, comstate ); mkentry( state, numecs, statenum, JAMSTATE, totaltrans ); } } else { /* use the proto */ mkentry( extrct[extptr], numecs, statenum, prottbl[minprot], mindiff ); /* if this state was sufficiently different from the proto * we built it from, make it, too, a proto */ if ( mindiff * 100 >= totaltrans * NEW_PROTO_DIFF_PERCENTAGE ) mkprot( state, statenum, comstate ); /* since mkprot added a new proto to the proto queue, it's possible * that "minprot" is no longer on the proto queue (if it happened * to have been the last entry, it would have been bumped off). * If it's not there, then the new proto took its physical place * (though logically the new proto is at the beginning of the * queue), so in that case the following call will do nothing. */ mv2front( minprot ); } } } /* cmptmps - compress template table entries * * synopsis * cmptmps(); * * template tables are compressed by using the 'template equivalence * classes', which are collections of transition character equivalence * classes which always appear together in templates - really meta-equivalence * classes. until this point, the tables for templates have been stored * up at the top end of the nxt array; they will now be compressed and have * table entries made for them. */ void cmptmps() {*D��,D��-D��.D��/D��0D��1D��2D��3D��4D��5D��6D��7D��8D��9D��:D��;D��<D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ int tmpstorage[CSIZE + 1]; register int *tmp = tmpstorage, i, j; int totaltrans, trans; peakpairs = numtemps * numecs + tblend; if ( usemecs ) { /* create equivalence classes base on data gathered on template * transitions */ nummecs = cre8ecs( tecfwd, tecbck, numecs ); } else nummecs = numecs; if ( lastdfa + numtemps + 1 >= current_max_dfas ) increase_max_dfas(); /* loop through each template */ for ( i = 1; i <= numtemps; ++i ) { totaltrans = 0; /* number of non-jam transitions out of this template */ for ( j = 1; j <= numecs; ++j ) { trans = tnxt[numecs * i + j]; if ( usemecs ) { /* the absolute value of tecbck is the meta-equivalence class * of a given equivalence class, as set up by cre8ecs */ if ( tecbck[j] > 0 ) { tmp[tecbck[j]] = trans; if ( trans > 0 ) ++totaltrans; } } else { tmp[j] = trans; if ( trans > 0 ) ++totaltrans; } } /* it is assumed (in a rather subtle way) in the skeleton that * if we're using meta-equivalence classes, the def[] entry for * all templates is the jam template, i.e., templates never default * to other non-jam table entries (e.g., another template) */ /* leave room for the jam-state after the last real state */ mkentry( tmp, nummecs, lastdfa + i + 1, JAMSTATE, totaltrans ); } } /* expand_nxt_chk - expand the next check arrays */ void expand_nxt_chk() { register int old_max = current_max_xpairs; current_max_xpairs += MAX_XPAIRS_INCREMENT; ++num_reallocs; nxt = reallocate_integer_array( nxt, current_max_xpairs ); chk = reallocate_integer_array( chk, current_max_xpairs ); bzero( (char *) (chk + old_max), MAX_XPAIRS_INCREMENT * sizeof( int ) / sizeof( char ) ); } /* find_table_space - finds a space in the table for a state to be placed * * synopsis * int *state, numtrans, block_start; * int find_table_space(); * * block_start = find_table_space( state, numtrans ); * * State is the state to be added to the full speed transition table. * Numtrans is the number of out-transitions for the state. * * find_table_space() returns the position of the start of the first block (in * chk) able to accommodate the state * * In determining if a state will or will not fit, find_table_space() must take * into account the fact that an end-of-buffer state will be added at [0], * and an action number will be added in [-1]. */ int find_table_space( state, numtrans ) int *state, numtrans; { /* firstfree is the position of the first possible occurrence of two * consecutive unused records in the chk and nxt arrays */ register int i; register int *state_ptr, *chk_ptr; register int *ptr_to_last_entry_in_state; /* if there are too many out-transitions, put the state at the end of * nxt and chk */ if ( numtrans > MAX_XTIONS_FULL_INTERIOR_FIT ) { /* if table is empty, return the first available spot in chk/nxt, * which should be 1 */ if ( tblend < 2 ) return ( 1 ); i = tblend - numecs; /* start searching for table space near the * end of chk/nxt arrays */ } else i = firstfree; /* start searching for table space from the * beginning (skipping only the elements * which will definitely not hold the new * state) */ while ( 1 ) /* loops until a space is found */ { if ( i + numecs > current_max_xpairs ) expand_nxt_chk(); /* loops until space for end-of-buffer and action number are found */ while ( 1 ) { if ( chk[i - 1] == 0 ) /* check for action number space */ { if ( chk[i] == 0 ) /* check for end-of-buffer space */ break; else i += 2; /* since i != 0, there is no use checking to * see if (++i) - 1 == 0, because that's the * same as i == 0, so we skip a space */ } else ++i; if ( i + numecs > current_max_xpairs ) expand_nxt_chk(); } /* if we started search from the beginning, store the new firstfree for * the next call of find_table_space() */ if ( numtrans <= MAX_XTIONS_FULL_INTERIOR_FIT ) firstfree = i + 1; /* check to see if all elements in chk (and therefore nxt) that are * needed for the new state have not yet been taken */ state_ptr = &state[1]; ptr_to_last_entry_in_state = &chk[i + numecs + 1]; for ( chk_ptr = &chk[i + 1]; chk_ptr != ptr_to_last_entry_in_state; ++chk_ptr ) if ( *(state_ptr++) != 0 && *chk_ptr != 0 ) break; if ( chk_ptr == ptr_to_last_entry_in_state ) return ( i ); else ++i; } } /* inittbl - initialize transition tables * * synopsis * inittbl(); * * Initializes "firstfree" to be one beyond the end of the table. Initializes * all "chk" entries to be zero. Note that templates are built in their * own tbase/tdef tables. They are shifted down to be contiguous * with the non-template entries during table generation. */ void inittbl() { register int i; bzero( (char *) chk, current_max_xpairs * sizeof( int ) / sizeof( char ) ); tblend = 0; firstfree = tblend + 1; numtemps = 0; if ( usemecs ) { /* set up doubly-linked meta-equivalence classes * these are sets of equivalence classes which all have identical * transitions out of TEMPLATES */ tecbck[1] = NIL; for ( i = 2; i <= numecs; ++i ) { tecbck[i] = i - 1; tecfwd[i - 1] = i; } tecfwd[numecs] = NIL; } } /* mkdeftbl - make the default, "jam" table entries * * synopsis * mkdeftbl(); */ void mkdeftbl() { int i; jamstate = lastdfa + 1; ++tblend; /* room for transition on end-of-buffer character */ if ( tblend + numecs > current_max_xpairs ) expand_nxt_chk(); /* add in default end-of-buffer transition */ nxt[tblend] = end_of_buffer_state; chk[tblend] = jamstate; for ( i = 1; i <= numecs; ++i ) { nxt[tblend + i] = 0; chk[tblend + i] = jamstate; } jambase = tblend; base[jamstate] = jambase; def[jamstate] = 0; tblend += numecs; ++numtemps; } /* mkentry - create base/def and nxt/chk entries for transition array * * synopsis * int state[numchars + 1], numchars, statenum, deflink, totaltrans; * mkentry( state, numchars, statenum, deflink, totaltrans ); * * "state" is a transition array "numchars" characters in size, "statenum" * is the offset to be used into the base/def tables, and "deflink" is the * entry to put in the "def" table entry. If "deflink" is equal to * "JAMSTATE", then no attempt will be made to fit zero entries of "state" * (i.e., jam entries) into the table. It is assumed that by linking to * "JAMSTATE" they will be taken care of. In any case, entries in "state" * marking transitions to "SAME_TRANS" are treated as though they will be * taken care of by whereever "deflink" points. "totaltrans" is the total * number of transitions out of the state. If it is below a certain threshold, * the tables are searched for an interior spot that will accommodate the * state array. */ void mkentry( state, numchars, statenum, deflink, totaltrans ) register int *state; int numchars, statenum, deflink, totaltrans; { register int minec, maxec, i, baseaddr; int tblbase, tbllast; if ( totaltrans == 0 ) { /* there are no out-transitions */ if ( deflink == JAMSTATE ) base[statenum] = JAMSTATE; else base[statenum] = 0; def[statenum] = deflink; return; } for ( minec = 1; minec <= numchars; ++minec ) { if ( state[minec] != SAME_TRANS ) if ( state[minec] != 0 || deflink != JAMSTATE ) break; } if ( totaltrans == 1 ) { /* there's only one out-transition. Save it for later to fill * in holes in the tables. */ stack1( statenum, minec, state[minec], deflink ); return; } for ( maxec = numchars; maxec > 0; --maxec ) { if ( state[maxec] != SAME_TRANS ) if ( state[maxec] != 0 || deflink != JAMSTATE ) break; } /* Whether we try to fit the state table in the middle of the table * entries we have already generated, or if we just take the state * table at the end of the nxt/chk tables, we must make sure that we * have a valid base address (i.e., non-negative). Note that not only are * negative base addresses dangerous at run-time (because indexing the * next array with one and a low-valued character might generate an * array-out-of-bounds error message), but at compile-time negative * base addresses denote TEMPLATES. */ /* find the first transition of state that we need to worry about. */ if ( totaltrans * 100 <= numchars * INTERIOR_FIT_PERCENTAGE ) { /* attempt to squeeze it into the middle of the tabls */ baseaddr = firstfree; while ( baseaddr < minec ) { /* using baseaddr would result in a negative base address below * find the next free slot */ for ( ++baseaddr; chk[baseaddr] != 0; ++baseaddr ) ; } if ( baseaddr + maxec - minec >= current_max_xpairs ) expand_nxt_chk(); for ( i = minec; i <= maxec; ++i ) if ( state[i] != SAME_TRANS ) if ( state[i] != 0 || deflink != JAMSTATE ) if ( chk[baseaddr + i - minec] != 0 ) { /* baseaddr unsuitable - find another */ for ( ++baseaddr; baseaddr < current_max_xpairs && chk[baseaddr] != 0; ++baseaddr ) ; if ( baseaddr + maxec - minec >= current_max_xpairs ) expand_nxt_chk(); /* reset the loop counter so we'll start all * over again next time it's incremented */ i = minec - 1; } } else { /* ensure that the base address we eventually generate is * non-negative */ baseaddr = max( tblend + 1, minec ); } tblbase = baseaddr - minec; tbllast = tblbase + maxec; if ( tbllast >= current_max_xpairs ) expand_nxt_chk(); base[statenum] = tblbase; def[statenum] = deflink; for ( i = minec; i <= maxec; ++i ) if ( state[i] != SAME_TRANS ) if ( state[i] != 0 || deflink != JAMSTATE ) { nxt[tblbase + i] = state[i]; chk[tblbase + i] = statenum; } if ( baseaddr == firstfree ) /* find next free slot in tables */ for ( ++firstfree; chk[firstfree] != 0; ++firstfree ) ; tblend = max( tblend, tbllast ); } /* mk1tbl - create table entries for a state (or state fragment) which * has only one out-transition * * synopsis * int state, sym, onenxt, onedef; * mk1tbl( state, sym, onenxt, onedef ); */ void mk1tbl( state, sym, onenxt, onedef ) int state, sym, onenxt, onedef; { if ( firstfree < sym ) firstfree = sym; while ( chk[firstfree] != 0 ) if ( ++firstfree >= current_max_xpairs ) expand_nxt_chk(); base[state] = firstfree - sym; def[state] = onedef; chk[firstfree] = state; nxt[firstfree] = onenxt; if ( firstfree > tblend ) { tblend = firstfree++; if ( firstfree >= current_max_xpairs ) expand_nxt_chk(); } } /* mkprot - create new proto entry * * synopsis * int state[], statenum, comstate; * mkprot( state, statenum, comstate ); */ void mkprot( state, statenum, comstate ) int state[], statenum, comstate; { int i, slot, tblbase; if ( ++numprots >= MSP || numecs * numprots >= PROT_SAVE_SIZE ) { /* gotta make room for the new proto by dropping last entry in * the queue */ slot = lastprot; lastprot = protprev[lastprot]; protnext[lastprot] = NIL; } else slot = numprots; protnext[slot] = firstprot; if ( firstprot != NIL ) protprev[firstprot] = slot; firstprot = slot; prottbl[slot] = statenum; protcomst[slot] = comstate; /* copy state into save area so it can be compared with rapidly */ tblbase = numecs * (slot - 1); for ( i = 1; i <= numecs; ++i ) protsave[tblbase + i] = state[i]; } /* mktemplate - create a template entry based on a state, and connect the state * to it * * synopsis * int state[], statenum, comstate, totaltrans; * mktemplate( state, statenum, comstate, totaltrans ); */ void mktemplate( state, statenum, comstate ) int state[], statenum, comstate; { int i, numdiff, tmpbase, tmp[CSIZE + 1]; Char transset[CSIZE + 1]; int tsptr; ++numtemps; tsptr = 0; /* calculate where we will temporarily store the transition table * of the template in the tnxt[] array. The final transition table * gets created by cmptmps() */ tmpbase = numtemps * numecs; if ( tmpbase + numecs >= current_max_template_xpairs ) { current_max_template_xpairs += MAX_TEMPLATE_XPAIRS_INCREMENT; ++num_reallocs; tnxt = reallocate_integer_array( tnxt, current_max_template_xpairs ); } for ( i = 1; i <= numecs; ++i ) if ( state[i] == 0 ) tnxt[tmpbase + i] = 0; else { transset[tsptr++] = i; tnxt[tmpbase + i] = comstate; } if ( usemecs ) mkeccl( transset, tsptr, tecfwd, tecbck, numecs, 0 ); mkprot( tnxt + tmpbase, -numtemps, comstate ); /* we rely on the fact that mkprot adds things to the beginning * of the proto queue */ numdiff = tbldiff( state, firstprot, tmp ); mkentry( tmp, numecs, statenum, -numtemps, numdiff ); } /* mv2front - move proto queue element to front of queue * * synopsis * int qelm; * mv2front( qelm ); */ void mv2front( qelm ) int qelm; { if ( firstprot != qelm ) { if ( qelm == lastprot ) lastprot = protprev[lastprot]; protnext[protprev[qelm]] = protnext[qelm]; if ( protnext[qelm] != NIL ) protprev[protnext[qelm]] = protprev[qelm]; protprev[qelm] = NIL; protnext[qelm] = firstprot; protprev[firstprot] = qelm; firstprot = qelm; } } /* place_state - place a state into full speed transition table * * synopsis * int *state, statenum, transnum; * place_state( state, statenum, transnum ); * * State is the statenum'th state. It is indexed by equivalence class and * gives the number of the state to enter for a given equivalence class. * Transnum is the number of out-transitions for the state. */ void place_state( state, statenum, transnum ) int *state, statenum, transnum; { register int i; register int *state_ptr; int position = find_table_space( state, transnum ); /* base is the table of start positions */ base[statenum] = position; /* put in action number marker; this non-zero number makes sure that * find_table_space() knows that this position in chk/nxt is taken * and should not be used for another accepting number in another state */ chk[position - 1] = 1; /* put in end-of-buffer marker; this is for the same purposes as above */ chk[position] = 1; /* place the state into chk and nxt */ state_ptr = &state[1]; for ( i = 1; i <= numecs; ++i, ++state_ptr ) if ( *state_ptr != 0 ) { chk[position + i] = i; nxt[position + i] = *state_ptr; } if ( position + numecs > tblend ) tblend = position + numecs; } /* stack1 - save states with only one out-transition to be processed later * * synopsis * int statenum, sym, nextstate, deflink; * stack1( statenum, sym, nextstate, deflink ); * * if there's room for another state one the "one-transition" stack, the * state is pushed onto it, to be processed later by mk1tbl. If there's * no room, we process the sucker right now. */ void stack1( statenum, sym, nextstate, deflink ) int statenum, sym, nextstate, deflink; { if ( onesp >= ONE_STACK_SIZE - 1 ) mk1tbl( statenum, sym, nextstate, deflink ); else { ++onesp; onestate[onesp] = statenum; onesym[onesp] = sym; onenext[onesp] = nextstate; onedef[onesp] = deflink; } } /* tbldiff - compute differences between two state tables * * synopsis * int state[], pr, ext[]; * int tbldiff, numdifferences; * numdifferences = tbldiff( state, pr, ext ) * * "state" is the state array which is to be extracted from the pr'th * proto. "pr" is both the number of the proto we are extracting from * and an index into the save area where we can find the proto's complete * state table. Each entry in "state" which differs from the corresponding * entry of "pr" will appear in "ext". * Entries which are the same in both "state" and "pr" will be marked * as transitions to "SAME_TRANS" in "ext". The total number of differences * between "state" and "pr" is returned as function value. Note that this * number is "numecs" minus the number of "SAME_TRANS" entries in "ext". */ int tbldiff( state, pr, ext ) int state[], pr, ext[]; { register int i, *sp = state, *ep = ext, *protp; register int numdiff = 0; protp = &protsave[numecs * (pr - 1)]; for ( i = numecs; i > 0; --i ) { if ( *++protp == *++sp ) *++ep = SAME_TRANS; else { *++ep = *sp; ++numdiff; } } return ( numdiff ); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* yylex - scanner front-end for flex */ /*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * Vern Paxson. * * The United States Government has rights in this work pursuant * to contract no. DE-AC03-76SF00098 between the United States * Department of Energy and the University of California. * * Redistribution and use in source and binary forms are permitted provided * that: (1) source distributions retain this entire copyright notice and * comment, and (2) distributions including binaries display the following * acknowledgement: ``This product includes software developed by the * University of California, Berkeley and its contributors'' in the * documentation or other materials provided with the distribution and in * all advertising materials mentioning features or use of this software. * Neither the name of the University nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #ifndef lint static char rcsid[] = "@(#) $Header: /usr/fsys/odin/a/vern/flex/RCS/yylex.c,v 2.5 90/06/27 23:48:40 vern Exp $ (LBL)"; #endif #include <ctype.h> #include "flexdef.h" #include "parse.h" /* ANSI C does not guarantee that isascii() is defined */ #ifndef isascii #define isascii(c) ((c) <= 0177) #endif /* yylex - scan for a regular expression token * * synopsis * * token = yylex(); * * token - return token found */ int yylex() { int toktype; static int beglin = false; if ( eofseen ) toktype = EOF; else toktype = flexscan(); if ( toktype == EOF || toktype == 0 ) { eofseen = 1; if ( sectnum == 1 ) { synerr( "premature EOF" ); sectnum = 2; toktype = SECTEND; } else if ( sectnum == 2 ) { sectnum = 3; toktype = 0; } else toktype = 0; } if ( trace ) { if ( beglin ) { fprintf( stderr, "%d\t", num_rules + 1 ); beglin = 0; } switch ( toktype ) { case '<': case '>': case '^': case '$': case '"': case '[': case ']': case '{': case '}': case '|': case '(': case ')': case '-': case '/': case '\\': case '?': case '.': case '*': case '+': case ',': (void) putc( toktype, stderr ); break; case '\n': (void) putc( '\n', stderr ); if ( sectnum == 2 ) beglin = 1; break; case SCDECL: fputs( "%s", stderr ); break; case XSCDECL: fputs( "%x", stderr ); break; case WHITESPACE: (void) putc( ' ', stderr ); break; case SECTEND: fputs( "%%\n", stderr ); /* we set beglin to be true so we'll start * writing out numbers as we echo rules. flexscan() has * already assigned sectnum */ if ( sectnum == 2 ) beglin = 1; break; case NAME: fprintf( stderr, "'%s'", nmstr ); break; case CHAR: switch ( yylval ) { case '<': case '>': case '^': case '$': case '"': case '[': case ']': case '{': case '}': case '|': case '(': case ')': case '-': case '/': case '\\': case '?': case '.': case '*': case '+': case ',': fprintf( stderr, "\\%c", yylval ); break; default: if ( ! isascii( yylval ) || ! isprint( yylval ) ) fprintf( stderr, "\\%.3o", yylval ); else (void) putc( yylval, stderr ); break; } break; case NUMBER: fprintf( stderr, "%d", yylval ); break; case PREVCCL: fprintf( stderr, "[%d]", yylval ); break; case EOF_OP: fprintf( stderr, "<<EOF>>" ); break; case 0: fprintf( stderr, "End Marker" ); break; default: fprintf( stderr, "*Something Weird* - tok: %d val: %d\n", toktype, yylval ); break; } } return ( toktype ); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .�������������..������������ Makefile������ file.c�������� file.h�������� ftp.c��������� ftp.h��������� local.c������� local.h������� net.c��������� net.h��������� other.c������� other.h�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for ftp # # 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> # CFLAGS= -O -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i BINDIR=/usr/bin PROG= ftp OBJS= ftp.o local.o file.o other.o net.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) install -S 8kw $@ clean: rm -f $(PROG) $(OBJS) install: $(BINDIR)/$(PROG) $(BINDIR)/$(PROG): $(PROG) install -cs -o bin $? $@ ftp.o: ftp.c ftp.h local.h file.h other.h net.h local.o: local.c ftp.h local.h file.o: file.c ftp.h file.h net.h other.o: other.c ftp.h other.h net.o: net.c ftp.h file.h net.h �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* file.c * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include "ftp.h" #include "file.h" #include "net.h" _PROTOTYPE(static char *dir, (char *path, int full)); _PROTOTYPE(static int asciisend, (int fd, int fdout)); _PROTOTYPE(static int binarysend, (int fd, int fdout)); _PROTOTYPE(static int asciirecv, (int fd, int fdin)); _PROTOTYPE(static int binaryrecv, (int fd, int fdin)); _PROTOTYPE(static int asciisize, (int fd, off_t *filesize)); _PROTOTYPE(static off_t asciisetsize, (int fd, off_t filesize)); static char buffer[512 << sizeof(char *)]; static char bufout[512 << sizeof(char *)]; static char line2[512]; static char *dir(path, full) char *path; int full; { char cmd[128]; static char name[32]; tmpnam(name); if(full) sprintf(cmd, "ls -l %s > %s", path, name); else sprintf(cmd, "ls %s > %s", path, name); system(cmd); return(name); } static int asciisend(fd, fdout) int fd; int fdout; { int s, len; char c; char *p; char *op, *ope; unsigned long total=0L; if(atty) { printf("Sent "); fflush(stdout); } op = bufout; ope = bufout + sizeof(bufout) - 3; while((s = read(fd, buffer, sizeof(buffer))) > 0) { total += (long)s; p = buffer; while(s-- > 0) { c = *p++; if(c == '\r') { *op++ = '\r'; total++; } *op++ = c; if(op >= ope) { write(fdout, bufout, op - bufout); op = bufout; } } if(atty) { printf("%8lu bytes\b\b\b\b\b\b\b\b\b\b\b\b\b\b", total); fflush(stdout); } } if(op > bufout) write(fdout, bufout, op - bufout); if(atty) { printf("\n"); fflush(stdout); } return(s); } static int binarysend(fd, fdout) int fd; int fdout; { int s; unsigned long total=0L; if(atty) { printf("Sent "); fflush(stdout); } while((s = read(fd, buffer, sizeof(buffer))) > 0) { write(fdout, buffer, s); total += (long)s; if(atty) { printf("%8lu bytes\b\b\b\b\b\b\b\b\b\b\b\b\b\b", total); fflush(stdout); } } if(atty) { printf("\n"); fflush(stdout); } return(s); } int sendfile(fd, fdout) int fd; int fdout; { int s; switch(type) { case TYPE_A: s = asciisend(fd, fdout); break; default: s = binarysend(fd, fdout); } if(s < 0) return(-1); else return(0); } static int asciirecv(fd, fdin) int fd; int fdin; { int s, len; int gotcr; char c; char *p; char *op, *ope; unsigned long total=0L; if(isatty && fd > 2) { printf("Received "); fflush(stdout); } gotcr = 0; op = bufout; ope = bufout + sizeof(bufout) - 3; while((s = read(fdin, buffer, sizeof(buffer))) > 0) { p = buffer; total += (long)s; while(s-- > 0) { c = *p++; if(gotcr) { gotcr = 0; if(c != '\n') *op++ = '\r'; } if(c == '\r') gotcr = 1; else *op++ = c; if(op >= ope) { write(fd, bufout, op - bufout); op = bufout; } } if(atty && fd > 2) { printf("%8lu bytes\b\b\b\b\b\b\b\b\b\b\b\b\b\b", total); fflush(stdout); } } if(gotcr) *op++ = '\r'; if(op > bufout) write(fd, bufout, op - bufout); if(atty && fd > 2) { printf("\n"); fflush(stdout); } return(s); } static binaryrecv(fd, fdin) int fd; int fdin; { int s; unsigned long total=0L; if(atty && fd > 2) { printf("Received "); fflush(stdout); } while((s = read(fdin, buffer, sizeof(buffer))) > 0) { write(fd, buffer, s); total += (long)s; if(atty && fd > 2) { printf("%8lu bytes\b\b\b\b\b\b\b\b\b\b\b\b\b\b", total); fflush(stdout); } } if(atty && fd > 2) { printf("\n"); fflush(stdout); } return(s); } int recvfile(fd, fdin) int fd; int fdin; { int s; switch(type) { case TYPE_A: s = asciirecv(fd, fdin); break; default: s = binaryrecv(fd, fdin); } if(s < 0) return(-1); else return(0); } int DOascii() { int s; if(DOcmdcheck()) return(0); s = DOcommand("TYPE", "A"); type = TYPE_A; return(s); } int DObinary() { int s; if(DOcmdcheck()) return(0); s = DOcommand("TYPE", "I"); type = TYPE_I; return(s); } int DOpwd() { int s; if(DOcmdcheck()) return(0); s = DOcommand("PWD", ""); if(s == 500 || s == 502) s = DOcommand("XPWD", ""); return(s); } int DOcd() { char *path; int s; if(DOcmdcheck()) return(0); path = cmdargv[1]; if(cmdargc < 2) { readline("Path: ", line2, sizeof(line2)); path = line2; } if(!strcmp(path, "..")) s = DOcommand("CDUP", ""); else s = DOcommand("CWD", path); if(s == 500 || s == 502) { if(!strcmp(path, "..")) s = DOcommand("XCUP", ""); else s = DOcommand("XCWD", path); } return(s); } int DOmkdir() { char *path; int s; if(DOcmdcheck()) return(0); path = cmdargv[1]; if(cmdargc < 2) { readline("Directory: ", line2, sizeof(line2)); path = line2; } s = DOcommand("MKD", path); if(s == 500 || s == 502) s = DOcommand("XMKD", path); return(s); } int DOrmdir() { char *path; int s; if(DOcmdcheck()) return(0); path = cmdargv[1]; if(cmdargc < 2) { readline("Directory: ", line2, sizeof(line2)); path = line2; } s = DOcommand("RMD", path); if(s == 500 || s == 502) s = DOcommand("XRMD", path); return(s); } int DOdelete() { char *file; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("File: ", line2, sizeof(line2)); file = line2; } return(DOcommand("DELE", file)); } int DOmdtm() { char *file; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("File: ", line2, sizeof(line2)); file = line2; } return(DOcommand("MDTM", file)); } int DOsize() { char *file; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("File: ", line2, sizeof(line2)); file = line2; } return(DOcommand("SIZE", file)); } int DOstat() { char *file; if(cmdargc < 2) if(!linkopen) { printf("You must \"OPEN\" a connection first.\n"); return(0); } else return(DOcommand("STAT", "")); if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("File: ", line2, sizeof(line2)); file = line2; } return(DOcommand("STAT", file)); } int DOlist() { char *path; char *local; int fd; int s; if(DOcmdcheck()) return(0); path = cmdargv[1]; if(cmdargc < 2) path = ""; if(cmdargc < 3) local = ""; else local = cmdargv[2]; if(*local == '\0') fd = 1; else fd = open(local, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) { printf("Could not open local file %s. Error %s\n", local, strerror(errno)); return(0); } s = DOdata("LIST", path, RETR, fd); if(fd > 2) close(fd); return(s); } int DOnlst() { char *path; char *local; int fd; int s; if(DOcmdcheck()) return(0); path = cmdargv[1]; if(cmdargc < 2) path = ""; if(cmdargc < 3) local = ""; else local = cmdargv[2]; if(*local == '\0') fd = 1; else fd = open(local, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) { printf("Could not open local file %s. Error %s\n", local, strerror(errno)); return(0); } s = DOdata("NLST", path, RETR, fd); if(fd > 2) close(fd); return(s); } int DOretr() { char *file, *localfile; int fd; int s; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Remote File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) localfile = file; else localfile = cmdargv[2]; fd = open(localfile, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) { printf("Could not open local file %s. Error %s\n", localfile, strerror(errno)); return(0); } s = DOdata("RETR", file, RETR, fd); close(fd); return(s); } int DOrretr() { char *file, *localfile; int fd; int s; off_t filesize; char restart[16]; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Remote File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) localfile = file; else localfile = cmdargv[2]; fd = open(localfile, O_RDWR); if(fd < 0) { prinKD��MD��ND��OD��PD��QD��RD��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tf("Could not open local file %s. Error %s\n", localfile, strerror(errno)); return(0); } if(type == TYPE_A) { if(asciisize(fd, &filesize)) { printf("Could not determine ascii file size of %s\n", localfile); close(fd); return(0); } } else filesize = lseek(fd, 0, SEEK_END); sprintf(restart, "%lu", filesize); s = DOcommand("REST", restart); if(s != 350) { close(fd); return(s); } s = DOdata("RETR", file, RETR, fd); close(fd); return(s); } int DOMretr() { char *files; int fd, s; FILE *fp; char name[32]; if(DOcmdcheck()) return(0); files = cmdargv[1]; if(cmdargc < 2) { readline("Files: ", line2, sizeof(line2)); files = line2; } tmpnam(name); fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) { printf("Could not open local file %s. Error %s\n", name, strerror(errno)); return(0); } s = DOdata("NLST", files, RETR, fd); close(fd); if(s == 226) { fp = fopen(name, "r"); unlink(name); if(fp == (FILE *)NULL) { printf("Unable to open file listing.\n"); return(0); } while(fgets(line2, sizeof(line2), fp) != (char *)NULL) { line2[strlen(line2)-1] = '\0'; printf("Retrieving file: %s\n", line2); fflush(stdout); fd = open(line2, O_WRONLY | O_CREAT | O_TRUNC, 0666); if(fd < 0) printf("Unable to open local file %s\n", line2); else { s = DOdata("RETR", line2, RETR, fd); close(fd); if(s < 0) break; } } fclose(fp); } else unlink(name); return(s); } int DOappe() { char *file, *remotefile; int fd; int s; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Local File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) remotefile = file; else remotefile = cmdargv[2]; fd = open(file, O_RDONLY); if(fd < 0) { printf("Could not open local file %s. Error %s\n", file, strerror(errno)); return(0); } s = DOdata("APPE", remotefile, STOR, fd); close(fd); return(s); } int DOstor() { char *file, *remotefile; int fd; int s; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Local File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) remotefile = file; else remotefile = cmdargv[2]; fd = open(file, O_RDONLY); if(fd < 0) { printf("Could not open local file %s. Error %s\n", file, strerror(errno)); return(0); } s = DOdata("STOR", remotefile, STOR, fd); close(fd); return(s); } int DOrstor() { char *file, *remotefile; int fd; int s; off_t filesize, rmtsize; char restart[16]; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Local File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) remotefile = file; else remotefile = cmdargv[2]; s = DOcommand("SIZE", remotefile); if(s != 215) return(s); rmtsize = atol(reply+4); fd = open(file, O_RDONLY); if(fd < 0) { printf("Could not open local file %s. Error %s\n", file, strerror(errno)); return(0); } if(type == TYPE_A) filesize = asciisetsize(fd, rmtsize); else filesize = lseek(fd, rmtsize, SEEK_SET); if(filesize != rmtsize) { printf("Could not set file start of %s\n", file); close(fd); return(0); } sprintf(restart, "%lu", rmtsize); s = DOcommand("REST", restart); if(s != 350) { close(fd); return(s); } s = DOdata("STOR", remotefile, STOR, fd); close(fd); return(s); } int DOstou() { char *file, *remotefile; int fd; int s; if(DOcmdcheck()) return(0); file = cmdargv[1]; if(cmdargc < 2) { readline("Local File: ", line2, sizeof(line2)); file = line2; } if(cmdargc < 3) remotefile = file; else remotefile = cmdargv[2]; fd = open(file, O_RDONLY); if(fd < 0) { printf("Could not open local file %s. Error %s\n", file, strerror(errno)); return(0); } s = DOdata("STOU", remotefile, STOR, fd); close(fd); return(s); } int DOMstor() { char *files; char *name; int fd, s; FILE *fp; if(DOcmdcheck()) return(0); files = cmdargv[1]; if(cmdargc < 2) { readline("Files: ", line2, sizeof(line2)); files = line2; } name = dir(files, 0); fp = fopen(name, "r"); if(fp == (FILE *)NULL) { printf("Unable to open listing file.\n"); return(0); } while(fgets(line2, sizeof(line2), fp) != (char *)NULL) { line2[strlen(line2)-1] = '\0'; printf("Sending file: %s\n", line2); fflush(stdout); fd = open(line2, O_RDONLY); if(fd < 0) printf("Unable to open local file %s\n", line2); else { s = DOdata("STOR", line2, STOR, fd); close(fd); if(s < 0) break; } } fclose(fp); unlink(name); return(s); } static int asciisize(fd, filesize) int fd; off_t *filesize; { unsigned long count; char *p, *pp; int cnt; count = 0; while((cnt = read(fd, buffer, sizeof(buffer))) > 0) { p = buffer; pp = buffer + cnt; count += cnt; while(p < pp) if(*p++ == '\n') count++; } if(cnt == 0) { *filesize = count; return(0); } return(1); } static off_t asciisetsize(fd, filesize) int fd; off_t filesize; { off_t sp; int s; sp = 0; while(sp < filesize) { s = read(fd, buffer, 1); if(s < 0) return(-1); if(s == 0) break; sp++; if(*buffer == '\n') sp++; } return(sp); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* file.h * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(int recvfile, (int fd, int fdin)); _PROTOTYPE(int sendfile, (int fd, int fdout)); _PROTOTYPE(int DOascii, (void)); _PROTOTYPE(int DObinary, (void)); _PROTOTYPE(int DOpwd, (void)); _PROTOTYPE(int DOcd, (void)); _PROTOTYPE(int DOmkdir, (void)); _PROTOTYPE(int DOrmdir, (void)); _PROTOTYPE(int DOdelete, (void)); _PROTOTYPE(int DOmdtm, (void)); _PROTOTYPE(int DOsize, (void)); _PROTOTYPE(int DOstat, (void)); _PROTOTYPE(int DOlist, (void)); _PROTOTYPE(int DOnlst, (void)); _PROTOTYPE(int DOretr, (void)); _PROTOTYPE(int DOrretr, (void)); _PROTOTYPE(int DOMretr, (void)); _PROTOTYPE(int DOappe, (void)); _PROTOTYPE(int DOstor, (void)); _PROTOTYPE(int DOrstor, (void)); _PROTOTYPE(int DOstou, (void)); _PROTOTYPE(int DOMstor, (void)); �������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ftp.c by Michael Temari 06/21/92 * * ftp An ftp client program for use with TNET. * * Usage: ftp [[host] [port]] * * Version: 0.10 06/21/92 (pre-release not yet completed) * 0.20 07/01/92 * 0.30 01/15/96 (Minix 1.7.1 initial release) * 0.40 08/27/96 * * Author: Michael Temari, <temari@ix.netcom.com> */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "ftp.h" #include "local.h" #include "file.h" #include "other.h" #include "net.h" FILE *fpcommin; FILE *fpcommout; int linkopen; int loggedin; int type; int format; int mode; int structure; int passive; int atty; int cmdargc; char *cmdargv[NUMARGS]; char reply[1024]; _PROTOTYPE(static int makeargs, (char *buff)); _PROTOTYPE(int DOhelp, (void)); _PROTOTYPE(int main, (int argc, char *argv[])); static int makeargs(buff) char *buff; { char *p; int i; for(i = 0; i < NUMARGS; i++) cmdargv[i] = (char *)0; p = buff + strlen(buff) - 1; while(p != buff) if(*p == '\r' || *p == '\n' || isspace(*p)) *p-- = '\0'; else break; p = buff; cmdargc = 0; while(cmdargc < NUMARGS) { while(*p && isspace(*p)) p++; if(*p == '\0') break; cmdargv[cmdargc++] = p; while(*p && !isspace(*p)) { if(cmdargc == 1) *p = tolower(*p); p++; } if(*p == '\0') break; *p = '\0'; p++; } } int readline(prompt, buff, len) char *prompt; char *buff; int len; { printf(prompt); fflush(stdout); if(fgets(buff, len, stdin) == (char *)NULL) { printf("\nEnd of file on input!\n"); exit(1); } *strchr(buff, '\n') = 0; if(!atty) { printf("%s\n", buff); fflush(stdout); } return(0); } int DOgetreply() { char *p; char buff[6]; int s; int firsttime; do { firsttime = 1; do { if(fgets(reply, sizeof(reply), fpcommin) == (char *)0) return(-1); p = reply + strlen(reply) - 1; while(p != reply) if(*p == '\r' || *p == '\n' || isspace(*p)) *p-- = '\0'; else break; printf("%s\n", reply); fflush(stdout); if(firsttime) { firsttime = 0; strncpy(buff, reply, 4); buff[3] = ' '; } } while(strncmp(reply, buff, 3) || reply[3] == '-'); s = atoi(buff); } while(s < 200 && s != 125 & s != 150); return(s); } int DOcmdcheck() { if(!linkopen) { printf("You must \"OPEN\" a connection first.\n"); return(1); } if(!loggedin) { printf("You must login first.\n"); return(1); } return(0); } int DOcommand(ftpcommand, ftparg) char *ftpcommand; char *ftparg; { if(*ftparg) fprintf(fpcommout, "%s %s\r\n", ftpcommand, ftparg); else fprintf(fpcommout, "%s\r\n", ftpcommand); fflush(fpcommout); return(DOgetreply()); } int DOhelp() { char junk[10]; printf("Command: Description\n"); printf("! Escape to a shell\n"); printf("append Append a file to remote host\n"); printf("ascii Set file transfer mode to ascii\n"); printf("binary Set file transfer mode to binary\n"); printf("bye Close connection and exit\n"); printf("cd Change directory on remote host\n"); printf("close Close connection\n"); printf("del Remove file on remote host\n"); printf("dir Display long form remote host directory listing\n"); printf("exit Close connection and exit\n"); printf("get Retrieve a file from remote host\n"); printf("help Display this text\n"); printf("lcd Change directory on local host\n"); printf("ldir Display long form local host directory listing\n"); printf("lls Display local host directory listing\n"); printf("lmkdir Create directory on local host\n"); printf("lpwd Display current directory on local host\n"); printf("lrmdir Remove directory on local host\n"); printf("ls Display remote host directory listing\n"); printf("mget Retrieve multiple files from remote host\n"); printf("mkdir Create directory on remote host\n"); printf("mod Get file modification time\n"); readline("Press ENTER to continue... ", junk, sizeof(junk)); printf("mput Send multiple files to remote host\n"); printf("noop Send the ftp NOOP command\n"); printf("open Open connection to remote host\n"); printf("pass Enter remote user password\n"); printf("passive Toggle passive mode\n"); printf("put Send a file to remote host\n"); printf("putu Send a file to remote host(unique)\n"); printf("pwd Display current directory on remote host\n"); printf("quit Close connection and exit\n"); printf("quote Send raw ftp command to remote host\n"); printf("reget Restart a partial file retrieve from remote host\n"); printf("remotehelp Display ftp commands implemented on remote host\n"); printf("reput Restart a partial file send to remote host\n"); printf("rm Remove file on remote host\n"); printf("rmdir Remove directory on remote host\n"); printf("site Send a site specific command\n"); printf("size Get file size information\n"); printf("status Get connection/file status information\n"); printf("system Get remote system type information\n"); printf("user Enter remote user information\n"); return(0); } struct commands { char *name; _PROTOTYPE(int (*func), (void)); }; static struct commands commands[] = { "!", DOlshell, "append", DOappe, "ascii", DOascii, "binary", DObinary, "bin", DObinary, "bye", DOquit, "cd", DOcd, "close", DOclose, "del", DOdelete, "dir", DOlist, "exit", DOquit, "get", DOretr, "help", DOhelp, "lcd", DOlcd, "ldir", DOllist, "lls", DOlnlst, "lmkdir", DOlmkdir, "lpwd", DOlpwd, "lrmdir", DOlrmdir, "ls", DOnlst, "mget", DOMretr, "mkdir", DOmkdir, "mod", DOmdtm, "mput", DOMstor, "noop", DOnoop, "open", DOopen, "pass", DOpass, "passive", DOpassive, "put", DOstor, "putu", DOstou, "pwd", DOpwd, "quit", DOquit, "quote", DOquote, "reget", DOrretr, "remotehelp", DOremotehelp, "reput", DOrstor, "rm", DOdelete, "rmdir", DOrmdir, "site", DOsite, "size", DOsize, "status", DOstat, "system", DOsyst, "user", DOuser, "", (int (*)())0 }; int main(argc, argv) int argc; char *argv[]; { int s; struct commands *cmd; static char buffer[128]; NETinit(); FTPinit(); s = 0; if(argc > 1) { sprintf(buffer, "open %s ", argv[1]); makeargs(buffer); s = DOopen(); if(atty && s > 0) { sprintf(buffer, "user"); makeargs(buffer); s = DOuser(); } } while(s >= 0) { readline("ftp>", buffer, sizeof(buffer)); makeargs(buffer); if(cmdargc == 0) continue; for(cmd = commands; *cmd->name != '\0'; cmd++) if(!strcmp(cmdargv[0], cmd->name)) break; if(*cmd->name != '\0') s = (*cmd->func)(); else { s = 0; printf("Command \"%s\" not recognized.\n", cmdargv[0]); } } return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[D��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ftp.h * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ extern FILE *fpcommin; extern FILE *fpcommout; extern int linkopen; extern int loggedin; extern int type; extern int format; extern int mode; extern int structure; extern int passive; extern int atty; #define NUMARGS 10 extern int cmdargc; extern char *cmdargv[NUMARGS]; extern char reply[1024]; #define RETR 0 #define STOR 1 #define TYPE_A 0 #define TYPE_I 1 _PROTOTYPE(int readline, (char *prompt, char *buff, int len)); _PROTOTYPE(int DOgetreply, (void)); _PROTOTYPE(int DOcmdcheck, (void)); _PROTOTYPE(int DOcommand, (char *ftpcommand, char *ftparg)); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* local.c * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <errno.h> #include "ftp.h" #include "local.h" static char line2[512]; _PROTOTYPE(static void dodir, (char *path, int full)); int DOlpwd() { if(getcwd(line2, sizeof(line2)) == (char *)NULL) printf("Could not determine local directory. %s\n", strerror(errno)); else printf("Current local directory: %s\n", line2); return(0); } int DOlcd() { char *path; int s; path = cmdargv[1]; if(cmdargc < 2) { readline("Path: ", line2, sizeof(line2)); path = line2; } if(chdir(path)) printf("Could not change local directory. %s\n", strerror(errno)); else DOlpwd(); return(0); } int DOlmkdir() { char *path; int s; path = cmdargv[1]; if(cmdargc < 2) { readline("Directory: ", line2, sizeof(line2)); path = line2; } if(mkdir(path, 0777)) printf("Could not make directory %s. %s\n", path, strerror(errno)); else printf("Directory created.\n"); return(0); } int DOlrmdir() { char *path; int s; path = cmdargv[1]; if(cmdargc < 2) { readline("Directory: ", line2, sizeof(line2)); path = line2; } if(rmdir(path)) printf("Could not remove directory %s. %s\n", path, strerror(errno)); else printf("Directory removed.\n"); return(0); } int DOllist(void) { dodir(".", 1); } int DOlnlst(void) { dodir(".", 0); } int DOlshell(void) { system("$SHELL"); } static void dodir(path, full) char *path; int full; { char cmd[128]; static char name[32]; tmpnam(name); if(full) sprintf(cmd, "ls -l %s > %s", path, name); else sprintf(cmd, "ls %s > %s", path, name); system(cmd); sprintf(cmd, "more %s", name); system(cmd); sprintf(cmd, "rm %s", name); system(cmd); } ��������������������������������������������������������������������������������������������������������������������/* local.h * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(int DOlpwd, (void)); _PROTOTYPE(int DOlcd, (void)); _PROTOTYPE(int DOlmkdir, (void)); _PROTOTYPE(int DOlrmdir, (void)); _PROTOTYPE(int DOllist, (void)); _PROTOTYPE(int DOlnlst, (void)); _PROTOTYPE(int DOlshell, (void)); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.c * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <signal.h> #include <errno.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include "ftp.h" #include "file.h" #include "net.h" _PROTOTYPE(void donothing, (int sig)); static int ftpcomm_fd; static ipaddr_t myip; static ipaddr_t hostip; static char host[256]; static int lpid; void NETinit() { int s; char *tcp_device; int tcp_fd; nwio_tcpconf_t nwio_tcpconf; /* All this just to get our ip address */ if((tcp_device = getenv("TCP_DEVICE")) == (char *)NULL) tcp_device = TCP_DEVICE; tcp_fd = open(tcp_device, O_RDWR); if(tcp_fd < 0) { perror("ftp: Could not open tcp_device"); exit(-1); } s = ioctl(tcp_fd, NWIOGTCPCONF, &nwio_tcpconf); if(s < 0) { perror("ftp: Could not get tcp configuration"); exit(-1); } myip = nwio_tcpconf.nwtc_locaddr; close(tcp_fd); } int DOopen() { nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpcopt; char *tcp_device; tcpport_t port; int s; struct hostent *hp; struct servent *servent; if(linkopen) { printf("Use \"CLOSE\" to close the connection first.\n"); return(0); } if(cmdargc < 2) readline("Host: ", host, sizeof(host)); else strncpy(host, cmdargv[1], sizeof(host)); if((servent = getservbyname("ftp", "tcp")) == (struct servent *)NULL) { fprintf(stderr, "ftp: Could not find ftp tcp service\n"); return(-1); } port = (tcpport_t)servent->s_port; hp = gethostbyname(host); if (hp == (struct hostent *)NULL) { hostip = (ipaddr_t)0; printf("Unresolved host %s\n", host); return(0); } else memcpy((char *) &hostip, (char *) hp->h_addr, hp->h_length); /* This HACK allows the server to establish data connections correctly */ /* when using the loopback device to talk to ourselves */ if(hostip == inet_addr("127.0.0.1")) hostip = myip; if((tcp_device = getenv("TCP_DEVICE")) == NULL) tcp_device = "/dev/tcp"; if((ftpcomm_fd = open(tcp_device, O_RDWR)) < 0) { perror("ftp: open error on tcp device"); return(-1); } tcpconf.nwtc_flags = NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr = hostip; tcpconf.nwtc_remport = port; s = ioctl(ftpcomm_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { perror("ftp: ioctl error on NWIOSTCPCONF"); close(ftpcomm_fd); return(s); } tcpcopt.nwtcl_flags = 0; s = ioctl(ftpcomm_fd, NWIOTCPCONN, &tcpcopt); if(s < 0) { perror("ftp: ioctl error on NWIOTCPCONN"); close(ftpcomm_fd); return(s); } s = ioctl(ftpcomm_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("ftp: ioctl error on NWIOGTCPCONF"); close(ftpcomm_fd); return(s); } fpcommin = fdopen(ftpcomm_fd, "r"); fpcommout = fdopen(ftpcomm_fd, "w"); s = DOgetreply(); if(s < 0) { fclose(fpcommin); fclose(fpcommout); close(ftpcomm_fd); return(s); } if(s != 220) { fclose(fpcommin); fclose(fpcommout); close(ftpcomm_fd); return(0); } linkopen = 1; return(s); } int DOclose() { if(!linkopen) { printf("You can't close a connection that isn't open.\n"); return(0); } fclose(fpcommin); fclose(fpcommout); close(ftpcomm_fd); linkopen = 0; loggedin = 0; return(0); } int DOquit() { int s; if(linkopen) { s = DOcommand("QUIT", ""); s = DOclose(); } printf("FTP done.\n"); exit(0); } void donothing(sig) int sig; { } int DOdata(datacom, file, direction, fd) char *datacom; char *file; int direction; /* RETR or STOR */ int fd; { nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcplopt, tcpcopt; char *tcp_device; int ftpdata_fd; char *buff; ipaddr_t ripaddr; tcpport_t rport; static tcpport_t lport = HTONS(0xF000); int s; int i; int cs; int pfd[2]; char dummy; char port[32]; ripaddr = hostip; rport = HTONS(20); /* here we set up a connection to listen on if not passive mode */ /* otherwise we use this to connect for passive mode */ if((tcp_device = getenv("TCP_DEVICE")) == NULL) tcp_device = "/dev/tcp"; if((ftpdata_fd = open(tcp_device, O_RDWR)) < 0) { perror("ftp: open error on tcp device"); return(-1); } if(passive) { s = DOcommand("PASV", ""); if(s != 227) { close(ftpdata_fd); return(s); } /* decode host and port */ buff = reply; while(*buff && (*buff != '(')) buff++; buff++; ripaddr = (ipaddr_t)0; for(i = 0; i < 4; i++) { ripaddr = (ripaddr << 8) + (ipaddr_t)atoi(buff); if((buff = strchr(buff, ',')) == (char *)0) { printf("Could not parse PASV reply\n"); return(-1); } buff++; } rport = (tcpport_t)atoi(buff); if((buff = strchr(buff, ',')) == (char *)0) { printf("Could not parse PASV reply\n"); return(-1); } buff++; rport = (rport << 8) + (tcpport_t)atoi(buff); ripaddr = ntohl(ripaddr); rport = ntohs(rport); } for (;;) { tcpconf.nwtc_flags = NWTC_SET_RA | NWTC_SET_RP; if (passive || ntohs(lport) >= 0xF000) { tcpconf.nwtc_flags |= NWTC_LP_SEL; } else { /* For no good reason Sun hosts don't like it if they have to * connect to the same port twice in a short time... */ lport = htons(ntohs(lport) + 1); tcpconf.nwtc_flags |= NWTC_LP_SET; tcpconf.nwtc_locport = lport; } tcpconf.nwtc_remaddr = ripaddr; tcpconf.nwtc_remport = rport; s = ioctl(ftpdata_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { if (errno == EADDRINUSE) continue; perror("ftp: ioctl error on NWIOSTCPCONF"); close(ftpdata_fd); return(s); } break; } s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("ftp: ioctl error on NWIOGTCPCONF"); close(ftpdata_fd); return(s); } lport = tcpconf.nwtc_locport; if(passive) { tcplopt.nwtcl_flags = 0; s = ioctl(ftpdata_fd, NWIOTCPCONN, &tcpcopt); if(s < 0) { perror("ftp: error on ioctl NWIOTCPCONN"); close(ftpdata_fd); return(0); } s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("ftp: error on ioctl NWIOGTCPCONF"); close(ftpdata_fd); return(0); } } else { tcplopt.nwtcl_flags = 0; if (pipe(pfd) < 0) { perror("ftp: could not create a pipe"); return(s); } lpid = fork(); if(lpid < 0) { perror("ftp: could not fork listener"); close(ftpdata_fd); close(pfd[0]); close(pfd[1]); return(s); } else if(lpid == 0) { close(pfd[0]); signal(SIGALRM, donothing); alarm(15); close(pfd[1]); s = ioctl(ftpdata_fd, NWIOTCPLISTEN, &tcplopt); alarm(0); if(s < 0) if(errno == EINTR) exit(1); /* timed out */ else exit(-1); /* error */ else exit(0); /* connection made */ } /* Wait for the pipe to close, then the listener is ready (almost). */ close(pfd[1]); (void) read(pfd[0], &dummy, 1); close(pfd[0]); while(1) { signal(SIGALRM, donothing); alarm(1); s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); alarm(0); if(s == -1) break; } } #define hiword(x) ((u16_t)((x) >> 16)) #define loword(x) ((u16_t)(x & 0xffff)) #define hibyte(x) (((x) >> 8) & 0xff) #define lobyte(x) ((x) & 0xff) if(!passive) { sprintf(port, "%u,%u,%u,%u,%u,%u", hibyte(hiword(ntohl(myip))), lobyte(hiword(ntohl(myip))), hibyte(loword(ntohl(myip))), lobyte(loword(ntohl(myip))), hibyte(ntohs(lport)), lobyte(ntohs(lport))); s = DOcommand("PORT", port); if(s != 200) { close(ftpdata_fd); kill(lpid, SIGKILL); return(s); } } s = DOcommand(datacom, file); if(s == 125 || s == 150) { if(!passive) { while(1) { s = wait(&cs); if(s < 0 || s == lpid) break; } if(s < 0) { perror("wait error:"); close(ftpdata_fd); kill(lpid, SIGKILL); return(s); } if((cs & 0x00ff)) { printf("Child listener failed %04x\n", cs); close(ftpdata_fd); return(-1); } cs = (cs >> 8) & 0x00ff; if(cs == 1) { printf("Child listener timed out\n"); return(DOgetreply()); } else if(cs) { printf("Child listener returned %02x\n", cs); close(ftpdata_fd); return(-hD��jD����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1); } } switch(direction) { case RETR: s = recvfile(fd, ftpdata_fd); break; case STOR: s = sendfile(fd, ftpdata_fd); break; } close(ftpdata_fd); s = DOgetreply(); } else { if(!passive) kill(lpid, SIGKILL); close(ftpdata_fd); } return(s); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.h * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(void NETinit, (void)); _PROTOTYPE(int DOopen, (void)); _PROTOTYPE(int DOclose, (void)); _PROTOTYPE(int DOquit, (void)); _PROTOTYPE(int DOdata, (char *datacom, char *file, int direction, int fd)); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* other.c by Michael Temari 06/21/92 * * ftp An ftp client program for use with TNET. * * Author: Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <stdio.h> #include <ctype.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include "ftp.h" #include "other.h" void FTPinit() { linkopen = 0; loggedin = 0; type = TYPE_A; format = 0; mode = 0; structure = 0; passive = 0; atty = isatty(0); } int DOpass() { int s; struct termios oldtty, newtty; char *pass; char password[64]; if(!linkopen) { printf("You must \"OPEN\" a connection first.\n"); return(0); } pass = cmdargv[1]; if(cmdargc < 2) { tcgetattr(fileno(stdout), &oldtty); newtty = oldtty; newtty.c_lflag &= ~ECHO; tcsetattr(fileno(stdout), TCSANOW, &newtty); readline("Password: ", password, sizeof(password)); tcsetattr(fileno(stdout), TCSANOW, &oldtty); printf("\n"); pass = password; } s = DOcommand("PASS", pass); if(s == 230) loggedin = 1; return(s); } int DOuser() { char *user; int s; char username[64]; if(!linkopen) { printf("You must \"OPEN\" a connection first.\n"); return(0); } loggedin = 0; user = cmdargv[1]; if(cmdargc < 2) { readline("Username: ", username, sizeof(username)); user = username; } s = DOcommand("USER", user); if(atty && s == 331) { cmdargv[0] = "password"; cmdargc = 1; return(DOpass()); } if(s == 230) loggedin = 1; return(s); } int DOnoop() { if(DOcmdcheck()) return(0); return(DOcommand("NOOP", "")); } int DOpassive() { passive = 1 - passive; printf("Passive mode is now %s\n", (passive ? "ON" : "OFF")); return(0); } int DOsyst() { if(DOcmdcheck()) return(0); return(DOcommand("SYST", "")); } int DOremotehelp() { if(!linkopen) { printf("You must \"OPEN\" a connection first.\n"); return(0); } return(DOcommand("HELP", "")); } int DOquote() { int i; static char args[512]; args[0] = '\0'; for(i = 2; i < cmdargc; i++) { if(i != 2) strcat(args, " "); strcat(args, cmdargv[i]); } return(DOcommand(cmdargv[1], args)); } int DOsite() { int i; static char args[512]; args[0] = '\0'; for(i = 1; i < cmdargc; i++) { if(i != 1) strcat(args, " "); strcat(args, cmdargv[i]); } return(DOcommand("SITE", args)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* other.h * * This file is part of ftp. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(void FTPinit, (void)); _PROTOTYPE(int DOpass, (void)); _PROTOTYPE(int DOuser, (void)); _PROTOTYPE(int DOnoop, (void)); _PROTOTYPE(int DOpassive, (void)); _PROTOTYPE(int DOsyst, (void)); _PROTOTYPE(int DOremotehelp, (void)); _PROTOTYPE(int DOquote, (void)); _PROTOTYPE(int DOsite, (void)); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ access.c������ access.h������ file.c�������� file.h�������� ftpd.c�������� ftpd.h�������� net.c��������� net.h��������� setup.anonftp�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for ftpd # # 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> # CFLAGS= -O -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i BINDIR= /usr/bin PROG= in.ftpd OBJS= ftpd.o access.o file.o net.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) install -S 8kw $@ clean: rm -f $(PROG) $(OBJS) install: $(BINDIR)/$(PROG) $(BINDIR)/setup.anonftp $(BINDIR)/$(PROG): $(PROG) install -cs -o bin $? $@ $(BINDIR)/setup.anonftp: setup.anonftp install -c -o bin $? $@ ftpd.o: ftpd.c ftpd.h access.h file.h net.h access.o: access.c ftpd.h access.h file.o: file.c ftpd.h access.h file.h net.h net.o: net.c ftpd.h net.h ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* access.c * * This file is part of ftpd. * * This file handles: * * USER PASS QUIT * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <pwd.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <net/gen/in.h> #include <net/gen/tcp.h> #include "ftpd.h" #include "access.h" _PROTOTYPE(static int AreWeIn, (char *name, struct passwd *pwd)); static char *msg530 = "530 Not logged in.\r\n"; /* Returns 1 = not logged in, 0 = loggedin */ int ChkLoggedIn() { if(!loggedin) { printf(msg530); return(1); } else return(0); } /* what a USER! */ int doUSER(buff) char *buff; { loggedin = 0; gotuser = 0; strncpy(username, buff, sizeof(username)); if(*username == '\0') { printf("501 Bad user name.\r\n"); return(GOOD); } gotuser = 1; printf("331 Password required for %s.\r\n", username); return(GOOD); } /* secret, secret, secret */ int doPASS(buff) char *buff; { char *name; struct passwd *pwd; int bad=0; name = username; if(!strcmp(name, "anonymous")) name = "ftp"; if(!gotuser || ((pwd = getpwnam(name)) == (struct passwd *)0)) bad = 1; else if(strcmp(name, "ftp")) { if(!strcmp(pwd->pw_passwd, crypt("", pwd->pw_passwd))) bad = 1; if(strcmp(pwd->pw_passwd, crypt(buff, pwd->pw_passwd))) bad = 1; } else { strncpy(anonpass, buff, sizeof(anonpass)); anonpass[sizeof(anonpass)-1] = '\0'; } if(bad) { logit("LOGIN", "FAIL"); printf(msg530); return(GOOD); } return(AreWeIn(name, pwd)); } /* bye, bye don't let the door hit you in the butt on the way out */ int doQUIT(buff) char *buff; { printf("221 Service closing, don't be a stranger.\r\n"); return(BAD); } /* see if this user is okay */ static int AreWeIn(name, pwd) char *name; struct passwd *pwd; { if(!strcmp(name, "ftp")) { if(chroot(pwd->pw_dir) || chdir("/")) { logit("LOGIN", "FAIL"); printf("530 Not logged in, could not chroot.\r\n"); return(GOOD); } anonymous = 1; } if(setgid(pwd->pw_gid) || setuid(pwd->pw_uid)) { logit("LOGIN", "FAIL"); printf(msg530); anonymous = 0; } else { logit("LOGIN", "PASS"); if (chdir(pwd->pw_dir)) { printf("230 User %s logged in, no home directory.\r\n", username); } else { printf("230 User %s logged in, directory %s.\r\n", username, pwd->pw_dir); } loggedin = 1; } (void) umask(anonymous ? 0400 : 0077); return(GOOD); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ftpd.h * * This file is part of ftpd. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(int ChkLoggedIn, (void)); _PROTOTYPE(int doUSER, (char *buff)); _PROTOTYPE(int doPASS, (char *buff)); _PROTOTYPE(int doQUIT, (char *buff)); ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* file.c * * This file is part of ftpd. * * This file handles: * * ALLO APPE CDUP CWD DELE LIST MDTM MODE MKD NLST PWD REST RETR * RMD RNFR RNTO SITE SIZE STAT STOR STOU STRU SYST TYPE * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> #include <string.h> #include <time.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include "ftpd.h" #include "access.h" #include "file.h" #include "net.h" _PROTOTYPE(static int fdxcmd, (char *xcmd, char *args)); _PROTOTYPE(static int endfdxcmd, (int fd)); _PROTOTYPE(static int asciisize, (char *filename, unsigned long *filesize)); _PROTOTYPE(static int cnvtfile, (char *name, char **name2)); _PROTOTYPE(static int procfile, (char *name)); _PROTOTYPE(static int sendfile, (char *name, int xmode)); _PROTOTYPE(static int recvfile, (char *name, int xmode)); _PROTOTYPE(static char *uniqname, (void)); _PROTOTYPE(static int docrc, (char *buff, int xmode)); _PROTOTYPE(static char *path, (char *fname)); #define SEND_FILE 0 #define SEND_NLST 1 #define SEND_LIST 2 #define RECV_FILE 0 #define RECV_APND 1 #define RECV_UNIQ 2 #define CNVT_ERROR 0 #define CNVT_NONE 1 #define CNVT_TAR 2 #define CNVT_TAR_Z 3 #define CNVT_COMP 4 #define CNVT_TAR_GZ 5 #define CNVT_GZIP 6 #define CNVT_UNCOMP 7 #define CMD_SH "/bin/sh" #define CMD_NLST "ls" #define CMD_LIST "ls -lA" #define CMD_CRC "crc" static char *msg550 = "550 %s %s.\r\n"; static unsigned long file_restart = 0; static char rnfr[256]; static char buffer[8192]; static char bufout[8192]; static cmdpid = -1; /* allocate, we don't need no stink'n allocate */ int doALLO(buff) char *buff; { printf("202 ALLO command not needed at this site.\r\n"); return(GOOD); } /* append to a file if it exists */ int doAPPE(buff) char *buff; { return(recvfile(buff, RECV_APND)); } /* change to parent directory */ int doCDUP(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); return(doCWD("..")); } /* change directory */ int doCWD(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); if(chdir(buff)) printf(msg550, buff, strerror(errno)); else printf("250 %s command okay.\r\n", line); return(GOOD); } /* remove a file */ int doDELE(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); if(unlink(buff)) printf(msg550, buff, strerror(errno)); else { printf("250 File \"%s\" deleted.\r\n", buff); logit("DELE", path(buff)); } return(GOOD); } /* directory listing */ int doLIST(buff) char *buff; { file_restart = 0; return(sendfile(buff, SEND_LIST)); } /* file modification time, btw when will this be put into an RFC */ int doMDTM(buff) char *buff; { struct stat st; struct tm *t; if(ChkLoggedIn()) return(GOOD); if(stat(buff, &st)) { printf(msg550, buff, strerror(errno)); return(GOOD); } if((st.st_mode & S_IFMT) != S_IFREG) { printf("550 Not a regular file.\r\n"); return(GOOD); } t = gmtime(&st.st_mtime); printf("215 %04d%02d%02d%02d%02d%02d\r\n", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); return(GOOD); } /* mode */ int doMODE(buff) char *buff; { switch(*buff) { case 's': case 'S': printf("200 Mode set to %c.\r\n", *buff); break; default: printf("501 Unknown mode %c.\r\n", *buff); } return(GOOD); } /* make a directory */ int doMKD(buff) char *buff; { mode_t mask; if(ChkLoggedIn()) return(GOOD); if(anonymous) mask = umask(0000); if(mkdir(buff, 0777)) printf(msg550, buff, strerror(errno)); else { printf("257 \"%s\" directory created.\r\n", buff); logit("MKD ", path(buff)); } if(anonymous) (void) umask(mask); return(GOOD); } /* name listing */ int doNLST(buff) char *buff; { file_restart = 0; return(sendfile(buff, SEND_NLST)); } /* where are we */ int doPWD(buff) char *buff; { char dir[128]; if(ChkLoggedIn()) return(GOOD); if(getcwd(dir, sizeof(dir)) == (char *)NULL) printf(msg550, buff, strerror(errno)); else printf("257 \"%s\" is current directory.\r\n", dir); return(GOOD); } /* restart command */ int doREST(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); file_restart = atol(buff); printf("350 Next file transfer will restart at %lu.\r\n", file_restart); return(GOOD); } /* they want a file */ int doRETR(buff) char *buff; { return(sendfile(buff, SEND_FILE)); } /* remove a directory */ int doRMD(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); if(rmdir(buff)) printf(msg550, buff, strerror(errno)); else { printf("250 Directory \"%s\" deleted.\r\n", buff); logit("RMD ", path(buff)); } return(GOOD); } /* rename from */ int doRNFR(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); strncpy(rnfr, buff, sizeof(rnfr)); rnfr[sizeof(rnfr)-1] = '\0'; printf("350 Got RNFR waiting for RNTO.\r\n"); return(GOOD); } /* rename to */ int doRNTO(buff) char *buff; { if(ChkLoggedIn()) return(GOOD); if(rnfr[0] == '\0') { printf("550 Rename failed.\r\n"); return(GOOD); } if(rename(rnfr, buff) < 0) printf("550 Rename failed. Error %s\r\n", strerror(errno)); else { printf("250 Renamed %s to %s.\r\n", rnfr, buff); logit("RNFR", path(rnfr)); logit("RNTO", path(buff)); } rnfr[0] = '\0'; return(GOOD); } static int docrc(buff, xmode) char *buff; int xmode; { unsigned short cs; long fs; int fd; int s; char *p; if((fd = fdxcmd(CMD_CRC, buff)) < 0) { printf("501 Could not obtain CRC.\r\n"); return(GOOD); } if(xmode == 0) printf("201-SITE CRC \"%s\"\r\n", buff); while(1) { p = buffer; while(1) { if((s = read(fd, p, 1)) != 1) { if(xmode == 0) printf("201 SITE CRC DONE.\r\n"); else printf("501 Could not obtain CRC.\r\n"); endfdxcmd(fd); return(GOOD); } if(*p == '\n') { *p++ = '\r'; *p++ = '\n'; *p = '\0'; break; } p++; } if(xmode != 0) break; printf(" %s", buffer); } cs = atoi(buffer); fs = atol(buffer+6); printf("201 CRC %05u %ld.\r\n", cs, fs); endfdxcmd(fd); return(GOOD); } /* site specific */ int doSITE(buff) char *buff; { char *args; strncpy(line, buff, sizeof(line)); cvtline(&args); if(!strcmp(line, "CRC") || !strcmp(line, "CCRC")) return(docrc(args, strcmp(line, "CRC"))); printf("501 Unknown SITE command %s.\r\n", line); return(GOOD); } /* file size, btw when will this be put into an RFC */ int doSIZE(buff) char *buff; { struct stat st; unsigned long filesize; if(ChkLoggedIn()) return(GOOD); if(stat(buff, &st)) { printf(msg550, buff, strerror(errno)); return(GOOD); } if((st.st_mode & S_IFMT) != S_IFREG) { printf("550 Not a regular file.\r\n"); return(GOOD); } filesize = st.st_size; if(type == TYPE_A) if(asciisize(buff, &filesize)) return(GOOD); printf("215 %lu\r\n", filesize); return(GOOD); } /* server status, or file status */ int doSTAT(buff) char *buff; { time_t now; struct tm *tm; int fd; int s; if(!*buff) { (void) time(&now); tm = localtime(&now); printf("211-%s(%s:%u) FTP server status:\r\n", myhostname, inet_ntoa(myipaddr), ntohs(myport)); printf(" Version %s ", FtpdVersion); printf("%s, %02d %s %d %02d:%02d:%02d %s\r\n", days[tm->tm_wday], tm->tm_mday, months[tm->tm_mon], 1900+tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec, tzname[tm->tm_isdst]); printf(" Connected to %s:%u\r\n", inet_ntoa(rmtipaddr), ntohs(rmtport)); if(!loggedin) printf(" Not logged in\r\n"); else printf(" Logged in %s\r\n", username); printf(" TYPE: %s\r\n",(type == TYPE_A) ? "Ascii" : "Binary"); printf("211 End of status\r\n"); return(GOOD); } if(ChkLoggedIn()) return(GOOD); printf("211-Status of %s:\r\n", buff); if((fd = fdxcmd(CMD_LIST, buff)) < 0) printf(" Could not retrieve status"); else { while((s = read(fd, buffer, 1)) == 1) { if(*buffer == '\n') printf("\r\n"); else printf("%c", *buffer); } endfdxcmd(fd); } printf("211 End }D��D��D��D��D��D��D��D��D��D��D��D��D��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������of status\r\n"); return(GOOD); } /* hey look, we're getting a file */ int doSTOR(buff) char *buff; { return(recvfile(buff, RECV_FILE)); } /* hey, get a file unique */ int doSTOU(buff) char *buff; { return(recvfile(buff, RECV_UNIQ)); } /* structure */ int doSTRU(buff) char *buff; { switch(*buff) { case 'f': case 'F': printf("200 Structure set to %c.\r\n", *buff); break; default: printf("501 Unknown structure %c.\r\n", *buff); } return(GOOD); } /* we're UNIX and proud of it! */ int doSYST(buff) char *buff; { printf("215 UNIX Type: L8\r\n"); return(GOOD); } /* change transfer type */ int doTYPE(buff) char *buff; { if(*(buff+1) != '\0') { printf("501 Syntax error in parameters.\r\n"); return(GOOD); } switch(*buff) { case 'A': case 'a': type = TYPE_A; printf("200 Type set to A.\r\n"); break; case 'I': case 'i': type = TYPE_I; printf("200 Type set to I.\r\n"); break; default: printf("501 Invalid type %c.\r\n", *buff); } return(GOOD); } static int fdxcmd(xcmd, args) char *xcmd; char *args; { char cmd[512]; char *argv[5]; int fds[2]; char *smallenv[] = { "PATH=/bin:/usr/bin:/usr/local/bin", NULL, NULL }; if ((smallenv[1] = getenv("TZ")) != NULL) smallenv[1] -= 3; /* ouch... */ sprintf(cmd, "%s %s", xcmd, args); argv[0] = CMD_SH; argv[1] = "-c"; argv[2] = cmd; argv[3] = (char *)NULL; if(pipe(fds) < 0) return(-1); if((cmdpid = fork()) < 0) { close(fds[0]); close(fds[1]); return(-1); } if(cmdpid == 0) { /* Child */ close(fds[0]); close(0); open("/dev/null", O_RDONLY); dup2(fds[1], 1); dup2(fds[1], 2); close(fds[1]); execve(argv[0], argv, smallenv); exit(0); } close(fds[1]); return(fds[0]); } /* Same as close if not cmd child started */ static int endfdxcmd(fd) int fd; { int s; int cs; close(fd); if(cmdpid == -1) return(0); s = waitpid(cmdpid, &cs, 0); cmdpid = -1; return(0); } /* returns 1 = size could not be determined, */ /* 0 = size determined and in filesize */ static int asciisize(filename, filesize) char *filename; unsigned long *filesize; { unsigned long count; int fd; char *p, *pp; int cnt; if((fd = open(filename, O_RDONLY)) < 0) { printf(msg550, filename, strerror(errno)); return(1); } count = 0; while((cnt = read(fd, buffer, sizeof(buffer))) > 0) { count += cnt; p = buffer; while(cnt > 0) if((pp = memchr(p, '\n', cnt)) != (char *)NULL) { count++; cnt = cnt - 1 - (pp - p); p = pp + 1; } else break; } if(cnt == 0) { *filesize = count; close(fd); return(0); } printf(msg550, filename, strerror(errno)); close(fd); return(1); } /* see if we need to run a command to convert the file */ static int cnvtfile(name, name2) char *name; char **name2; { struct stat st; static char fname[256]; char *p; int mode; if(!stat(name, &st)) /* file exists can't be a conversion */ if((st.st_mode & S_IFMT) != S_IFREG) { /* must be regular file */ printf("550 Not a regular file.\r\n"); return(CNVT_ERROR); } else return(CNVT_NONE); if(errno != ENOENT) { /* doesn't exist is okay, others are not */ printf(msg550, name, strerror(errno)); return(CNVT_ERROR); } /* find out what kind of conversion */ strncpy(fname, name, sizeof(fname)); fname[sizeof(fname)-1] = '\0'; p = fname + strlen(fname); mode = CNVT_ERROR; while(p > fname && mode == CNVT_ERROR) { if(*p == '.') { if(!strcmp(p, ".tar")) mode = CNVT_TAR; else if(!strcmp(p, ".tar.Z")) mode = CNVT_TAR_Z; else if(!strcmp(p, ".Z")) mode = CNVT_COMP; else if(!strcmp(p, ".tar.gz")) mode = CNVT_TAR_GZ; else if(!strcmp(p, ".gz")) mode = CNVT_GZIP; if (mode != CNVT_ERROR) { /* is there a file to convert? */ *p = '\0'; if (!stat(fname, &st)) break; *p = '.'; mode = CNVT_ERROR; } } p--; } if(mode == CNVT_ERROR) { printf(msg550, fname, strerror(errno)); return(mode); } if(mode == CNVT_COMP || mode == CNVT_GZIP || mode == CNVT_UNCOMP) if((st.st_mode & S_IFMT) != S_IFREG) { printf("550 Not a regular file.\r\n"); return(CNVT_ERROR); } *name2 = fname; return(mode); } static int procfile(name) char *name; { int fd; char *name2; static char command[512]; char *cdcmd, *cmdfmt; int ftype; ftype = cnvtfile(name, &name2); /* don't let tar use a full pathname */ cdcmd = ""; switch(ftype) { case CNVT_TAR: case CNVT_TAR_Z: case CNVT_TAR_GZ: if (name2[0] == '/') { while (*name2 == '/') name2++; cdcmd = "cd / &&"; } } /* format for a command to run; use two %s arguments for a 'cd /' and the * file to process */ switch(ftype) { case CNVT_TAR: cmdfmt = "%s tar cf - %s"; break; case CNVT_TAR_Z: cmdfmt = "%s tar cf - %s | compress -q"; break; case CNVT_COMP: cmdfmt = "%s compress -cq %s"; break; case CNVT_TAR_GZ: cmdfmt = "%s tar cf - %s | gzip"; break; case CNVT_GZIP: cmdfmt = "%s gzip -c %s"; break; case CNVT_UNCOMP: cmdfmt = "%s compress -dcq %s"; break; case CNVT_NONE: cmdfmt = NULL; break; case CNVT_ERROR: default: return(-1); } if(cmdfmt != NULL) { sprintf(command, cmdfmt, cdcmd, name2); fd = fdxcmd(command, ""); } else { fd = open(name, O_RDONLY); } if(fd < 0) printf(msg550, name, strerror(errno)); return(fd); } /* oh no, they're taking a file */ static int sendfile(name, xmode) char *name; int xmode; { char *fname; int fd, s; time_t datastart, dataend; unsigned long datacount; long kbs; char c; char *p; char *op, *ope; off_t sp; int doascii; if(ChkLoggedIn()) return(CleanUpData()); switch(xmode) { case SEND_NLST: fname = "NLST"; fd = fdxcmd(CMD_NLST, name); if(fd < 0) printf(msg550, name, strerror(errno)); break; case SEND_LIST: fname = "LIST"; fd = fdxcmd(CMD_LIST, name); if(fd < 0) printf(msg550, name, strerror(errno)); break; default: fname = name; fd = procfile(name); if(fd < 0) { logit("FAIL", path(fname)); } else { logit("SEND", path(fname)); if (anonymous) { loganon(1); logit("SEND", path(fname)); loganon(0); } } } if(fd < 0) return(CleanUpData()); /* set file position at approriate spot */ if(file_restart) { if(type == TYPE_A) { sp = 0; while(sp < file_restart) { sp++; s = read(fd, buffer, 1); if(s < 0) { printf(msg550, fname, strerror(errno)); endfdxcmd(fd); file_restart = 0; return(CleanUpData()); } if(s == 0) break; if(*buffer == '\n') sp++; } } else { sp = lseek(fd, file_restart, SEEK_SET); if(sp == -1) { printf(msg550, fname, strerror(errno)); endfdxcmd(fd); file_restart = 0; return(CleanUpData()); } } if(sp != file_restart) { printf("550 File restart point error. %lu not %lu\r\n", sp, file_restart); endfdxcmd(fd); file_restart = 0; return(CleanUpData()); } } file_restart = 0; printf("150 File %s okay. Opening data connection.\r\n", fname); fflush(stdout); if(DataConnect()) { endfdxcmd(fd); return(GOOD); } #ifdef DEBUG fprintf(stderr, "ftpd: parent %d start sendfile \n", getpid()); #endif /* start transfer */ doascii = (type == TYPE_A) || ((xmode == SEND_LIST) || (xmode == SEND_NLST)); /* per RFC1123 4.1.2.7 */ datacount = 0; time(&datastart); op = bufout; ope = bufout + sizeof(bufout) - 3; while((s = read(fd, buffer, sizeof(buffer))) > 0) { datacount += s; if(doascii) { p = buffer; while(s-- > 0) { c = *p++; if(c == '\n') { *op++ = '\r'; datacount++; } *op++ = c; if(op >= ope) { write(ftpdata_fd, bufout, op - bufout); op = bufout; } } } else write(ftpdata_fd, buffer, s); } if(op > bufout) write(ftpdata_fd, bufout, op - bufout); time(&dataend); #ifdef DEBUG fprintf(stderr, "ftpd: parent %d end sendfile \n", getpid()); #endif endfdxcmd(fd); close(ftpdata_fd); ftpdata_fd = -1; if(dataend == datastart) dataend++; kbs = (datacount * 100 / (dataend - datastart)) / 1024; if(s < 0) printf("451 Transfer aborted.\r\n"); else printf("226 Transfer finished successfully. %ld.%02d KB/s\r\n", (long)(kbs / 100), (int)(kbs % 100)); return(GOOD); } static int recvfile(name, xmode) char *name; int xmode; { char *fname; time_t datastart, dataend; unsigned long datacount; long kbs; char c; char *p; char *op, *ope; int fd, oflag; int s; int gotcr; off_t sp; if(ChkLoggedIn()) return(CleanUpData()); fname = name; switch(xmode) { case RECV_APND: oflag = O_WRONLY | O_APPEND; break; case RECV_UNIQ: fname = uniqname(); oflag = O_WRONLY | O_CREAT; break; default: oflag = O_WRONLY | O_CREAT | O_TRUNC; } if(file_restart) oflag = O_RDWR; fd = open(fname, oflag, 0666); if(fd < 0) { printf(msg550, fname, strerror(errno)); return(CleanUpData()); } /* log the received file */ logit("RECV", path(fname)); /* set file position at approriate spot */ if(file_restart) { if(type == TYPE_A) { sp = 0; while(sp < file_restart) { sp++; s = read(fd, buffer, 1); if(s < 0) { printf(msg550, fname, strerror(errno)); close(fd); file_restart = 0; return(CleanUpData()); } if(s == 0) break; if(*buffer == '\n') sp++; } } else { sp = lseek(fd, file_restart, SEEK_SET); if(sp == -1) { printf(msg550, fname, strerror(errno)); close(fd); file_restart = 0; return(CleanUpData()); } } if(sp != file_restart) { printf("550 File restart point error. %lu not %lu\r\n", sp, file_restart); close(fd); file_restart = 0; return(CleanUpData()); } } file_restart = 0; if(xmode == RECV_UNIQ) printf("150 FILE: %s\r\n", fname); /* per RFC1123 4.1.2.9 */ else printf("150 File %s okay. Opening data connection.\r\n", fname); fflush(stdout); if(DataConnect()) { close(fd); return(GOOD); } #ifdef DEBUG fprintf(stderr, "ftpd: parent %d start recvfile \n", getpid()); #endif /* start receiving file */ datacount = 0; gotcr = 0; op = bufout; ope = bufout + sizeof(bufout) - 3; time(&datastart); while((s = read(ftpdata_fd, buffer, sizeof(buffer))) > 0) { datacount += s; if(type == TYPE_A) { p = buffer; while(s-- > 0) { c = *p++; if(gotcr) { gotcr = 0; if(c != '\n') *op++ = '\r'; } if(c == '\r') gotcr = 1; else *op++ = c; if(op >= ope) { write(fd, bufout, op - bufout); op = bufout; } } } else write(fd, buffer, s); } if(gotcr) *op++ = '\r'; if(op > bufout) write(fd, bufout, op - bufout); time(&dataend); #ifdef DEBUG fprintf(stderr, "ftpd: parent %d end recvfile \n", getpid()); #endif close(fd); close(ftpdata_fd); ftpdata_fd = -1; if(dataend == datastart) dataend++; kbs = (datacount * 100 / (dataend - datastart)) / 1024; if(s < 0) printf("451 Transfer aborted.\r\n"); else { printf("226 Transfer finished successfully. "); if(xmode == RECV_UNIQ) printf("Unique file %s. ", fname); printf("%ld.%02d KB/s\r\n", (long)(kbs / 100), (int)(kbs % 100)); } return(GOOD); } static char *uniqname() { static char uniq[14+1]; int i; struct stat st; for(i = 0; i < 1000; i++) { sprintf(uniq, "ftpd%d%d", getpid(), i); if(stat(uniq, &st) == -1) return(uniq); } return(uniq); } static char *spath[256]; static char *path(fname) char *fname; { char dir[128]; if(fname[0] == '/') sprintf((char *)spath, "%s", fname); else { if(getcwd(dir, sizeof(dir)) == (char *)NULL) sprintf(dir, "???"); if(dir[1] == '\0') sprintf((char *)spath, "/%s", fname); else sprintf((char *)spath, "%s/%s", dir, fname); } return((char *)spath); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* file.h * * This file is part of ftpd. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(int doALLO, (char *buff)); _PROTOTYPE(int doAPPE, (char *buff)); _PROTOTYPE(int doCDUP, (char *buff)); _PROTOTYPE(int doCWD, (char *buff)); _PROTOTYPE(int doDELE, (char *buff)); _PROTOTYPE(int doLIST, (char *buff)); _PROTOTYPE(int doMDTM, (char *buff)); _PROTOTYPE(int doMODE, (char *buff)); _PROTOTYPE(int doMKD, (char *buff)); _PROTOTYPE(int doNLST, (char *buff)); _PROTOTYPE(int doPWD, (char *buff)); _PROTOTYPE(int doREST, (char *buff)); _PROTOTYPE(int doRETR, (char *buff)); _PROTOTYPE(int doRMD, (char *buff)); _PROTOTYPE(int doRNFR, (char *buff)); _PROTOTYPE(int doRNTO, (char *buff)); _PROTOTYPE(int doSITE, (char *buff)); _PROTOTYPE(int doSIZE, (char *buff)); _PROTOTYPE(int doSTAT, (char *buff)); _PROTOTYPE(int doSTOR, (char *buff)); _PROTOTYPE(int doSTOU, (char *buff)); _PROTOTYPE(int doSTRU, (char *buff)); _PROTOTYPE(int doSYST, (char *buff)); _PROTOTYPE(int doTYPE, (char *buff)); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ftpd.c * * ftpd An FTP server program for use with Minix. * * Usage: Minix usage: tcpd ftp ftpd * * 06/14/92 Tnet Release Michael Temari, <temari@ix.netcom.com> * 01/15/96 0.30 Michael Temari, <temari@ix.netcom.com> * 01/25/96 0.90 Michael Temari, <temari@ix.netcom.com> * 03/17/96 0.91 Michael Temari, <temari@ix.netcom.com> * 06/27/96 0.92 Michael Temari, <temari@ix.netcom.com> * 07/02/96 0.93 Michael Temari, <temari@ix.netcom.com> * 07/15/96 0.94 Michael Temari, <temari@ix.netcom.com> * 08/27/96 0.95 Michael Temari, <temari@ix.netcom.com> */ char *FtpdVersion = "0.95"; #include <sys/types.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <time.h> #include <unistd.h> #include <fcntl.h> #include <net/gen/in.h> #include <net/gen/tcp.h> #include "ftpd.h" #include "access.h" #include "file.h" #include "net.h" _PROTOTYPE(static void init, (void)); _PROTOTYPE(static int doHELP, (char *buff)); _PROTOTYPE(static int doNOOP, (char *buff)); _PROTOTYPE(static int doUNIMP, (char *buff)); /* The following defines the inactivity timeout in seconds */ #define INACTIVITY_TIMEOUT 60*60 char *days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; char line[512]; int type, format, mode, structure; int ftpdata_fd = -1; int loggedin, gotuser, anonymous; char username[80]; char anonpass[128]; ipaddr_t myipaddr, rmtipaddr, dataaddr; tcpport_t myport, rmtport, dataport; char myhostname[256], rmthostname[256]; #define FTPLOG "/usr/adm/ftplog" #define AFTPLOG "/usr/adm/aftplog" int fd_ftplog, fd_aftplog, fd_curlog; int timeout = 0; _PROTOTYPE(static int doHELP, (char *buff)); _PROTOTYPE(int readline, (char **args)); _PROTOTYPE(void Timeout, (int sig)); _PROTOTYPE(int main, (int argc, char *argv[])); struct commands { char *name; _PROTOTYPE(int (*func), (char *buff)); }; struct commands commands[] = { "ABOR", doUNIMP, "ACCT", doUNIMP, "ALLO", doALLO, "APPE", doAPPE, "CDUP", doCDUP, "CWD", doCWD, "DELE", doDELE, "HELP", doHELP, "LIST", doLIST, "MDTM", doMDTM, "MKD", doMKD, "MODE", doMODE, "NLST", doNLST, "NOOP", doNOOP, "PASS", doPASS, "PASV", doPASV, "PORT", doPORT, "PWD", doPWD, "QUIT", doQUIT, "REIN", doUNIMP, "REST", doREST, "RETR", doRETR, "RMD", doRMD, "RNFR", doRNFR, "RNTO", doRNTO, "SITE", doSITE, "SIZE", doSIZE, "SMNT", doUNIMP, "STAT", doSTAT, "STOR", doSTOR, "STOU", doSTOU, "STRU", doSTRU, "SYST", doSYST, "TYPE", doTYPE, "USER", doUSER, "XCUP", doCDUP, "XCWD", doCWD, "XMKD", doMKD, "XPWD", doPWD, "XRMD", doRMD, "", (int (*)())0 }; static void init() { loggedin = 0; gotuser = 0; anonymous = 0; type = TYPE_A; format = 0; mode = 0; structure = 0; ftpdata_fd = -1; username[0] = '\0'; anonpass[0] = '\0'; } /* nothing, nada, zilch... */ static int doNOOP(buff) char *buff; { printf("200 NOOP to you too!\r\n"); return(GOOD); } /* giv'em help, what a USER! */ static int doHELP(buff) char *buff; { struct commands *cmd; char star; int i; char *space = " "; printf("214-Here is a list of available ftp commands\r\n"); printf(" Those with '*' are not yet implemented.\r\n"); i = 0; for(cmd = commands; *cmd->name != '\0'; cmd++) { if(cmd->func == doUNIMP) star = '*'; else star = ' '; printf(" %s%c%s", cmd->name, star, space + strlen(cmd->name)); if(++i == 6) { printf("\r\n"); i = 0; } } if(i) printf("\r\n"); printf("214 That's all the help you get.\r\n"); return(GOOD); } /* not implemented */ static int doUNIMP(buff) char *buff; { printf("502 Command \"%s\" not implemented!\r\n", line); return(GOOD); } /* convert line for use */ void cvtline(args) char **args; { char *p; p = line + strlen(line) - 1; while(p != line) if(*p == '\r' || *p == '\n' || isspace(*p)) *p-- = '\0'; else break; p = line; while(*p && !isspace(*p)) { *p = toupper(*p); p++; } if(*p) { *p = '\0'; p++; while(*p && isspace(*p)) p++; } *args = p; return; } /* get a command from the client */ int readline(args) char **args; { if (fgets(line, sizeof(line), stdin) == (char *)NULL) return(BAD); *strchr(line, '\n') = '\0'; cvtline(args); return(GOOD); } /* signal handler for inactivity timeout */ void Timeout(sig) int sig; { timeout = 1; printf("421 Inactivity timer expired.\r\n"); } /* logit */ void logit(type, parm) char *type; char *parm; { time_t now; struct tm *tm; char message[1024]; if(fd_curlog == -1) return; time(&now); tm = localtime(&now); sprintf(message, "%s %s %2d %02d:%02d:%02d %d %s %s %s %s\n", days[tm->tm_wday], months[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, 1900+tm->tm_year, rmthostname, anonymous ? anonpass : username, type, parm); (void) write(fd_curlog, message, strlen(message)); } /* loganon */ void loganon(anon) int anon; { fd_curlog = anon ? fd_aftplog : fd_ftplog; } int main(argc, argv) int argc; char *argv[]; { struct commands *cmd; char *args; int status; time_t now; struct tm *tm; int s; GetNetInfo(); /* open log file and anonymous log file if they exist */ fd_ftplog = open(FTPLOG, O_WRONLY | O_APPEND); fd_aftplog = open(AFTPLOG, O_WRONLY | O_APPEND); loganon(0); /* Let's initialize some stuff */ init(); /* Log the connection */ logit("CONNECT", ""); /* Tell 'em we are ready */ time(&now); tm = localtime(&now); printf("220 FTP service ready on %s at ", myhostname); printf("%s, %02d %s %d %02d:%02d:%02d %s\r\n", days[tm->tm_wday], tm->tm_mday, months[tm->tm_mon], 1900+tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec, tzname[tm->tm_isdst]); fflush(stdout); /* Loop here getting commands */ while(1) { signal(SIGALRM, Timeout); alarm(INACTIVITY_TIMEOUT); if(readline(&args) != GOOD) { if(!timeout) printf("221 Control connection closing (EOF).\r\n"); break; } alarm(0); for(cmd = commands; *cmd->name != '\0'; cmd++) if(!strcmp(line, cmd->name)) break; if(*cmd->name != '\0') status = (*cmd->func)(args); else { printf("500 Command \"%s\" not recognized.\r\n", line); status = GOOD; } fflush(stdout); if(status != GOOD) break; } exit(1); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ftpd.h * * This file is part of ftpd. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ #define GOOD 0 #define BAD 1 #define TYPE_A 0 #define TYPE_I 1 extern char *FtpdVersion; extern int type, format, mode, structure; extern ipaddr_t myipaddr, rmtipaddr, dataaddr; extern tcpport_t myport, rmtport, dataport; extern int ftpdata_fd; extern int loggedin, gotuser, anonymous; extern char *days[], *months[]; extern char username[80]; extern char anonpass[128]; extern char myhostname[256], rmthostname[256]; extern char line[512]; _PROTOTYPE(void cvtline, (char **args)); _PROTOTYPE(void logit, (char *type, char *parm)); _PROTOTYPE(void loganon, (int anon)); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.c * * This file is part of ftpd. * * This file handles: * * PASV PORT * * * 01/25/95 Initial Release Michael Temari, <temari@ix.netcom.com> */ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <time.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include "ftpd.h" #include "access.h" #include "net.h" _PROTOTYPE(static void timeout, (int sig)); static char *msg425 = "425-Could not open data connection.\r\n"; static char *msg501 = "501 Syntax error in parameters.\r\n"; static int gottimeout = 0; static int lpid = -1; /* they must be behind a firewall or using a web browser */ int doPASV(buff) char *buff; { nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcplopt; char *tcp_device; ipaddr_t ipaddr; tcpport_t lport; int s; time_t starttime; int retry; if(ChkLoggedIn()) return(GOOD); /* here we set up a connection to listen on */ if((tcp_device = getenv("TCP_DEVICE")) == NULL) tcp_device = TCP_DEVICE; if(ftpdata_fd >= 0) close(ftpdata_fd); if((ftpdata_fd = open(tcp_device, O_RDWR)) < 0) { printf(msg425); printf("425 Could not open tcp_device. Error %s\r\n", strerror(errno)); return(GOOD); } tcpconf.nwtc_flags = NWTC_LP_SEL | NWTC_SET_RA | NWTC_UNSET_RP; tcpconf.nwtc_remaddr = rmtipaddr; tcpconf.nwtc_remport = htons(0); tcpconf.nwtc_locport = htons(0); s = ioctl(ftpdata_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { printf(msg425); printf("425 Could not ioctl NWIOSTCPCONF. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(GOOD); } s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { printf(msg425); printf("425 Could not NWIOGTCPCONF. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(GOOD); } ipaddr = tcpconf.nwtc_locaddr; lport = tcpconf.nwtc_locport; /* Now lets fork a child to do the listening :-( */ tcplopt.nwtcl_flags = 0; lpid = fork(); if(lpid < 0) { printf(msg425); printf("425 Could not fork listener. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(GOOD); } else if(lpid == 0) { retry = 0; while(1) { #ifdef DEBUG fprintf(stderr, "ftpd: child %d parent %d listen try %d\n", getpid(), getppid(), retry); #endif alarm(300); /* do not wait for ever */ s = ioctl(ftpdata_fd, NWIOTCPLISTEN, &tcplopt); if(!(s == -1 && errno == EAGAIN)) break; if(retry++ > 10) break; sleep(1); } #ifdef DEBUG fprintf(stderr, "ftpd: child %d s %d errno %d\n", getpid(), s, errno); #endif if(s < 0) exit(-1); /* tells parent listen failed */ else exit(0); /* tells parent listen okay */ } #ifdef DEBUG fprintf(stderr, "ftpd: parent %d wait for %d\n", getpid(), lpid); #endif /* wait for child to be listening, no more than serveral seconds */ (void) time(&starttime); while(1) { if(time((time_t *)NULL) > (starttime + 15)) break; signal(SIGALRM, timeout); alarm(1); s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d s %d errno %d start %ld now %ld\n", getpid(), lpid, s, errno, starttime, time((time_t *)NULL)); #endif alarm(0); if(s == -1) break; sleep(1); } #define hiword(x) ((u16_t)((x) >> 16)) #define loword(x) ((u16_t)(x & 0xffff)) #define hibyte(x) (((x) >> 8) & 0xff) #define lobyte(x) ((x) & 0xff) printf("227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n", hibyte(hiword(htonl(ipaddr))), lobyte(hiword(htonl(ipaddr))), hibyte(loword(htonl(ipaddr))), lobyte(loword(htonl(ipaddr))), hibyte(htons(lport)), lobyte(htons(lport))); #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d send 227\n", getpid(), lpid); #endif return(GOOD); } /* they want us to connect here */ int doPORT(buff) char *buff; { u32_t ipaddr; u16_t port; int i; ipaddr = (u32_t)0; for(i = 0; i < 4; i++) { ipaddr = (ipaddr << 8) + (u32_t)atoi(buff); if((buff = strchr(buff, ',')) == (char *)0) { printf(msg501); return(GOOD); } buff++; } port = (u16_t)atoi(buff); if((buff = strchr(buff, ',')) == (char *)0) { printf(msg501); return(0); } buff++; port = (port << 8) + (u16_t)atoi(buff); dataaddr = htonl(ipaddr); dataport = htons(port); printf("200 Port command okay.\r\n"); return(GOOD); } /* connect, huh? */ int DataConnect() { nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpcopt; nwio_tcpcl_t tcplopt; char *tcp_device; int s, cs; int retry; if(ftpdata_fd >= 0) { gottimeout = 0; signal(SIGALRM, timeout); alarm(10); while(!gottimeout) { s = waitpid(lpid, &cs, 0); if((s == lpid) || (s < 0 && errno == ECHILD)) break; #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d waitpid s %d cs %04x errno %d\n", getpid(), lpid, s, cs, errno); #endif } alarm(0); #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d waitpid s %d cs %04x errno %d\n", getpid(), lpid, s, cs, errno); #endif if(gottimeout) { #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d got timeout\n", getpid(), lpid); #endif kill(lpid, SIGKILL); s = waitpid(lpid, &cs, 0); } #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d continuing\n", getpid(), lpid); #endif lpid = -1; if(gottimeout) { printf(msg425); printf("425 Child listener timeout.\r\n"); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } if(s < 0) { printf(msg425); printf("425 Child listener vanished.\r\n"); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } if((cs & 0x00ff)) { printf(msg425); printf("425 Child listener failed %04x\r\n", cs); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } cs = (cs >> 8) & 0x00ff; if(cs) { printf(msg425); printf("425 Child listener returned %02x\r\n", cs); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } #ifdef DEBUG fprintf(stderr, "ftpd: parent %d child %d pasv done\n", getpid(), lpid); #endif return(GOOD); } if((tcp_device = getenv("TCP_DEVICE")) == NULL) tcp_device = TCP_DEVICE; if((ftpdata_fd = open(tcp_device, O_RDWR)) < 0) { printf(msg425); printf("425 Could not open tcp_device. Error %s\r\n", strerror(errno)); return(BAD); } tcpconf.nwtc_flags = NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr = dataaddr; tcpconf.nwtc_remport = dataport; tcpconf.nwtc_locport = htons(20); s = ioctl(ftpdata_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { printf(msg425); printf("425 Could not ioctl NWIOSTCPCONF. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { printf(msg425); printf("425 Could not ioctl NWIOGTCPCONF. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } tcpcopt.nwtcl_flags = 0; retry = 0; do { s = ioctl(ftpdata_fd, NWIOTCPCONN, &tcpcopt); if(!(s == -1 && errno == EAGAIN)) break; if(retry++ > 10) break; sleep(1); } while(1); if(s < 0) { printf(msg425); printf("425 Could not ioctl NWIOTCPCONN. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } s = ioctl(ftpdata_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { printf(msg425); printf("425 Could not ioctl NWIOGTCPCONF. Error %s\r\n", strerror(errno)); close(ftpdata_fd); ftpdata_fd = -1; return(BAD); } return(GOOD); } /* Clean up stuff we did to get a data connection going */ int CleanUpData() { int s, cs; if(lpid >= 0) while(1) { s = waitpid(lpid, &cs, 0); if(s == lpid || (s == -1 && errno == ECHILD)) break; } lpid = -1; return(GOOD); } void GetNetInfo() { nwio_tcpconf_t tcpconf; int s; struct hostent *hostent; /* Ask the system what our hostname is. */ if(gethostname(myhostname, sizeof(myhostname)) < 0) strcpy(myhostname, "unknown"); /* lets get our ip address and the clients ip address *D��D����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/ s = ioctl(0, NWIOGTCPCONF, &tcpconf); if(s < 0) { printf("421 FTP service unable to get remote ip address. Closing.\r\n"); fflush(stdout); exit(1); } myipaddr = tcpconf.nwtc_locaddr; myport = tcpconf.nwtc_locport; rmtipaddr = tcpconf.nwtc_remaddr; rmtport = tcpconf.nwtc_remport; /* Look up the host name of the remote host. */ hostent = gethostbyaddr((char *) &rmtipaddr, sizeof(rmtipaddr), AF_INET); if(!hostent) { printf("421-FTP service unable to translate your IP address (%s)\r\n", inet_ntoa(rmtipaddr)); printf("421 to your host name. Closing.\r\n"); fflush(stdout); exit(1); } strncpy(rmthostname, hostent->h_name, sizeof(rmthostname)-1); rmthostname[sizeof(rmthostname)-1] = '\0'; } static void timeout(sig) int sig; { gottimeout = 1; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.h * * This file is part of ftpd. * * * 01/25/96 Initial Release Michael Temari, <temari@ix.netcom.com> */ _PROTOTYPE(int doPASV, (char *buff)); _PROTOTYPE(int doPORT, (char *buff)); _PROTOTYPE(int DataConnect, (void)); _PROTOTYPE(int CleanUpData, (void)); _PROTOTYPE(void GetNetInfo, (void)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # setup.anonftp - Anonymous FTP setup and maintenance. # # 01/22/96 Initial Release Al Woodhul, <asw@hampshire.edu> # 01/25/96 Michael Temari, <temari@ix.netcom.com> # # What is needed for anon ftp # ref: Hunt TCP/IP Net Admin pp. 338++ # ref: Nemeth et al UNIX System Admin Handbook p. 295 # ref: mail from M. Temari 18.01.96 # programs possibly used by ftpd PROGS="sh ls crc tar compress gzip" echo Checking /etc/passwd if grep '^ftp:[^:]*:[1-9][0-9]*:[1-9][0-9]*:[^:]*:/[^:]*:[^:]*$' \ /etc/passwd >/dev/null then echo -n "OK, ftp entry found: " grep '^ftp:' /etc/passwd else echo "Found no entry for ftp in /etc/passwd, please add one with the" echo "home directory pointing to the anonymous FTP directory" exit 1 fi # ftp directory FTPDIR="`sed '/^ftp:/!d; s/^.*:\\([^:]*\\):[^:]*/\\1/' /etc/passwd`" if [ `whoami` != root ] then echo You must be root to do this exit 1 fi echo Setting up for anonymous ftp echo Making $FTPDIR and subdirectories install -d -m 755 -o root -g operator $FTPDIR install -d -m 751 -o root -g operator $FTPDIR/bin install -d -m 751 -o root -g operator $FTPDIR/dev install -d -m 751 -o root -g operator $FTPDIR/etc install -d -m 755 -o root -g operator $FTPDIR/pub incoming= if [ -d $FTPDIR/pub/incoming ] then incoming=t elif [ -t 0 ] then echo -n "Create \"incoming\" directory? [n] "; read yn case "$yn" in [yY]*|ok|sure) incoming=t esac fi test "$incoming" && install -d -m 777 -o root -g operator $FTPDIR/pub/incoming echo Copying files for PROG in $PROGS do test -f /usr/bin/$PROG && install -lcs /usr/bin/$PROG $FTPDIR/bin done cp -rp /dev/tcp $FTPDIR/dev/tcp echo Copying a minimum of the password and group files sed 's/^\([^:]*\):[^:]*:\([^:]*:[^:]*\):.*$/\1:*:\2:::/' \ /etc/passwd >$FTPDIR/etc/passwd sed 's/^\([^:]*\):[^:]*:\([^:]*\):.*$/\1:*:\2:/' \ /etc/group >$FTPDIR/etc/group chown root:operator $FTPDIR/etc/* chmod 444 $FTPDIR/etc/* echo "Anonymous ftp setup complete" �������������������������������������������������������������������� .�������������..������������ Makefile������ acd.c��������� asmconv������� mtools-3.9.7������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for commands/i386. CFLAGS = -D_MINIX -D_POSIX_SOURCE CCLD = $(CC) -i $(CFLAGS) MAKE = exec make -$(MAKEFLAGS) all:: acd acd: acd.c $(CCLD) -o $@ -DARCH=\"`arch`\" -DDESCR=\"/usr/lib/descr\" $? install -S 25kw $@ install:: /usr/bin/acd /usr/bin/cc /usr/bin/m2 /usr/bin/pc /usr/bin/acd: acd install -cs -o bin $? $@ /usr/bin/cc /usr/bin/m2 /usr/bin/pc: /usr/bin/acd install -l $? $@ clean:: rm -rf a.out core acd all install clean:: cd asmconv && $(MAKE) $@ cd mtools-3.9.7 && $(MAKE) $@ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* acd 1.10 - A compiler driver Author: Kees J. Bot * 7 Jan 1993 * Needs about 25kw heap + stack. */ char version[] = "1.9"; #define nil 0 #define _POSIX_SOURCE 1 #include <sys/types.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <signal.h> #include <errno.h> #include <ctype.h> #include <assert.h> #include <sys/stat.h> #include <sys/wait.h> #ifndef LIB #define LIB "/usr/lib" /* Default library directory. */ #endif #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) char *program; /* Call name. */ int verbose= 0; /* -v0: Silent. * -v1: Show abbreviated pass names. * -v2: Show executed UNIX commands. * -v3: Show executed ACD commands. * -v4: Show descr file as it is read. */ int action= 2; /* 0: An error occured, don't do anything anymore. * 1: (-vn) Do not execute, play-act. * 2: Execute UNIX commands. */ void report(char *label) { if (label == nil || label[0] == 0) { fprintf(stderr, "%s: %s\n", program, strerror(errno)); } else { fprintf(stderr, "%s: %s: %s\n", program, label, strerror(errno)); } action= 0; } void quit(int exit_code); void fatal(char *label) { report(label); quit(-1); } size_t heap_chunks= 0; void *allocate(void *mem, size_t size) /* Safe malloc/realloc. (I have heard that one can call realloc with a * null first argument with the effect below, but that is of course to * ridiculous to believe.) */ { assert(size > 0); if (mem != nil) { mem= realloc(mem, size); } else { mem= malloc(size); heap_chunks++; } if (mem == nil) fatal(nil); return mem; } void deallocate(void *mem) { if (mem != nil) { free(mem); heap_chunks--; } } char *copystr(const char *s) { char *c; c= allocate(nil, (strlen(s)+1) * sizeof(*c)); strcpy(c, s); return c; } /* Every object, list, letter, or variable, is made with cells. */ typedef struct cell { unsigned short refc; /* Reference count. */ char type; /* Type of object. */ unsigned char letter; /* Simply a letter. */ char *name; /* Name of a word. */ struct cell *hash; /* Hash chain. */ struct cell *car, *cdr; /* To form lists. */ /* For a word: */ # define value car /* Value of a variable. */ # define base cdr /* Base-name in transformations. */ # define suffix cdr /* Suffix in a treat-as. */ # define flags letter /* Special flags. */ /* A substitution: */ # define subst car } cell_t; typedef enum type { CELL, /* A list cell. */ STRING, /* To make a list of characters and substs. */ SUBST, /* Variable to substitute. */ /* Unique objects. */ LETTER, /* A letter. */ WORD, /* A string collapses to a word. */ EQUALS, /* = operator, etc. */ OPEN, CLOSE, PLUS, MINUS, STAR, INPUT, OUTPUT, WHITE, COMMENT, SEMI, EOLN, N_TYPES /* number of different types */ } type_t; #define is_unique(type) ((type) >= LETTER) /* Flags on a word. */ #define W_SET 0x01 /* Not undefined, e.g. assigned to. */ #define W_RDONLY 0x02 /* Read only. */ #define W_LOCAL 0x04 /* Local variable, immediate substitution. */ #define W_TEMP 0x08 /* Name of a temporary file, delete on quit. */ #define W_SUFF 0x10 /* Has a suffix set on it. */ void princhar(int c) /* Print a character, escaped if important to the shell *within* quotes. */ { if (strchr("\\'\"<>();~$^&*|{}[]?", c) != nil) fputc('\\', stdout); putchar(c); } void prinstr(char *s) /* Print a string, in quotes if the shell might not like it. */ { int q= 0; char *s2= s; while (*s2 != 0) if (strchr("~`$^&*()=\\|[]{};'\"<>?", *s2++) != nil) q= 1; if (q) fputc('"', stdout); while (*s != 0) princhar(*s++); if (q) fputc('"', stdout); } void prin2(cell_t *p); void prin1(cell_t *p) /* Print a cell structure for debugging purposes. */ { if (p == nil) { printf("(\b(\b()\b)\b)"); return; } switch (p->type) { case CELL: printf("(\b(\b("); prin2(p); printf(")\b)\b)"); break; case STRING: printf("\"\b\"\b\""); prin2(p); printf("\"\b\"\b\""); break; case SUBST: printf("$\b$\b${%s}", p->subst->name); break; case LETTER: princhar(p->letter); break; case WORD: prinstr(p->name); break; case EQUALS: printf("=\b=\b="); break; case PLUS: printf("+\b+\b+"); break; case MINUS: printf("-\b-\b-"); break; case STAR: printf("*\b*\b*"); break; case INPUT: printf(verbose >= 3 ? "<\b<\b<" : "<"); break; case OUTPUT: printf(verbose >= 3 ? ">\b>\b>" : ">"); break; default: assert(0); } } void prin2(cell_t *p) /* Print a list for debugging purposes. */ { while (p != nil && p->type <= STRING) { prin1(p->car); if (p->type == CELL && p->cdr != nil) fputc(' ', stdout); p= p->cdr; } if (p != nil) prin1(p); /* Dotted pair? */ } void prin1n(cell_t *p) { prin1(p); fputc('\n', stdout); } void prin2n(cell_t *p) { prin2(p); fputc('\n', stdout); } /* A program is consists of a series of lists at a certain indentation level. */ typedef struct program { struct program *next; cell_t *file; /* Associated description file. */ unsigned indent; /* Line indentation level. */ unsigned lineno; /* Line number where this is found. */ cell_t *line; /* One line of tokens. */ } program_t; program_t *pc; /* Program Counter (what else?) */ program_t *nextpc; /* Next line to execute. */ cell_t *oldcells; /* Keep a list of old cells, don't deallocate. */ cell_t *newcell(void) /* Make a new empty cell. */ { cell_t *p; if (oldcells != nil) { p= oldcells; oldcells= p->cdr; heap_chunks++; } else { p= allocate(nil, sizeof(*p)); } p->refc= 0; p->type= CELL; p->letter= 0; p->name= nil; p->car= nil; p->cdr= nil; return p; } #define N_CHARS (1 + (unsigned char) -1) #define HASHDENSE 0x400 cell_t *oblist[HASHDENSE + N_CHARS + N_TYPES]; unsigned hashfun(cell_t *p) /* Use a blender on a cell. */ { unsigned h; char *name; switch (p->type) { case WORD: h= 0; name= p->name; while (*name != 0) h= (h * 0x1111) + *name++; return h % HASHDENSE; case LETTER: return HASHDENSE + p->letter; default: return HASHDENSE + N_CHARS + p->type; } } cell_t *search(cell_t *p, cell_t ***hook) /* Search for *p, return the one found. *hook may be used to insert or * delete. */ { cell_t *sp; sp= *(*hook= &oblist[hashfun(p)]); if (p->type == WORD) { /* More than one name per hash slot. */ int cmp= 0; while (sp != nil && (cmp= strcmp(p->name, sp->name)) > 0) sp= *(*hook= &sp->hash); if (cmp != 0) sp= nil; } return sp; } void dec(cell_t *p) /* Decrease the number of references to p, if zero delete and recurse. */ { if (p == nil || --p->refc > 0) return; if (is_unique(p->type)) { /* Remove p from the oblist. */ cell_t *o, **hook; o= search(p, &hook); if (o == p) { /* It's there, remove it. */ *hook= p->hash; p->hash= nil; } if (p->type == WORD && (p->flags & W_TEMP)) { /* A filename to remove. */ if (verbose >= 2) { printf("rm -f "); prinstr(p->name); fputc('\n', stdout); } if (unlink(p->name) < 0 && errno != ENOENT) report(p->name); } } deallocate(p->name); dec(p->car); dec(p->cdr); p->cdr= oldcells; oldcells= p; heap_chunks--; } cell_t *inc(cell_t *p) /* Increase the number of references to p. */ { cell_t *o, **hook; if (p == nil) return nil; if (++p->refc > 1 || !is_unique(p->type)) return p; /* First appearance, put p on the oblist. */ o= search(p, &hook); if (o == nil) { /* Not there yet, add it. */ p->hash= *hook; *hook= p; } else { /* There is another object already there with the same info. */ o->refc++; dec(p); p= o; } return p; } cell_t *go(cell_t *p, cell_t *field) /* Often happening: You've got p, you want p->field. */ { field= inc(field); dec(p); return field; } cell_t *cons(type_t type, cell_t *p) /* P is to be added to a list (or a string). */ { cell_t *l= newcell(); l->type= type; l->refc++; l->car= p; return l; } cell_t *append(type_t type, cell_t *p) /* P is to be appended to a list (or a string). */ { return p == nil || p->type == type ? p : cons(type, p); } cell_t *findnword(char *name, size_t nD��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D��D������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������) /* Find the word with the given name of length n. */ { cell_t *w= newcell(); w->type= WORD; w->name= allocate(nil, (n+1) * sizeof(*w->name)); memcpy(w->name, name, n); w->name[n]= 0; return inc(w); } cell_t *findword(char *name) /* Find the word with the given null-terminated name. */ { return findnword(name, strlen(name)); } void quit(int exstat) /* Remove all temporary names, then exit. */ { cell_t **op, *p, *v, *b; size_t chunks; /* Remove cycles, like X = X. */ for (op= oblist; op < oblist + HASHDENSE; op++) { p= *op; while (p != nil) { if (p->value != nil || p->base != nil) { v= p->value; b= p->base; p->value= nil; p->base= nil; p= *op; dec(v); dec(b); } else { p= p->hash; } } } chunks= heap_chunks; /* Something may remain on an early quit: tempfiles. */ for (op= oblist; op < oblist + HASHDENSE; op++) { while (*op != nil) { (*op)->refc= 1; dec(*op); } } if (exstat != -1 && chunks > 0) { fprintf(stderr, "%s: internal fault: %d chunks still on the heap\n", program, chunks); } exit(exstat); } void interrupt(int sig) { signal(sig, interrupt); if (verbose >= 2) write(1, "# interrupt\n", 12); action= 0; } int extalnum(int c) /* Uppercase, lowercase, digit, underscore or anything non-American. */ { return isalnum(c) || c == '_' || c >= 0200; } char *descr; /* Name of current description file. */ FILE *dfp; /* Open description file. */ int dch; /* Input character. */ unsigned lineno; /* Line number in file. */ unsigned indent; /* Indentation level. */ void getdesc(void) { if (dch == EOF) return; if (dch == '\n') { lineno++; indent= 0; } if ((dch = getc(dfp)) == EOF && ferror(dfp)) fatal(descr); if (dch == 0) { fprintf(stderr, "%s: %s is a binary file.\n", program, descr); quit(-1); } } #define E_BASH 0x01 /* Escaped by backslash. */ #define E_QUOTE 0x02 /* Escaped by double quote. */ #define E_SIMPLE 0x04 /* More simple characters? */ cell_t *get_token(void) /* Read one token from the description file. */ { int whitetype= 0; static int escape= 0; cell_t *tok; char *name; int n, i; if (escape & E_SIMPLE) { /* More simple characters? (Note: performance hack.) */ if (isalnum(dch)) { tok= newcell(); tok->type= LETTER; tok->letter= dch; getdesc(); return inc(tok); } escape&= ~E_SIMPLE; } /* Gather whitespace. */ for (;;) { if (dch == '\\' && whitetype == 0) { getdesc(); if (isspace(dch)) { /* \ whitespace: remove. */ do { getdesc(); if (dch == '#' && !(escape & E_QUOTE)) { /* \ # comment */ do getdesc(); while (dch != '\n' && dch != EOF); } } while (isspace(dch)); continue; } escape|= E_BASH; /* Escaped character. */ } if (escape != 0) break; if (dch == '#' && (indent == 0 || whitetype != 0)) { /* # Comment. */ do getdesc(); while (dch != '\n' && dch != EOF); whitetype= COMMENT; break; } if (!isspace(dch) || dch == '\n' || dch == EOF) break; whitetype= WHITE; indent++; if (dch == '\t') indent= (indent + 7) & ~7; getdesc(); } if (dch == EOF) return nil; /* Make a token. */ tok= newcell(); if (whitetype != 0) { tok->type= whitetype; return inc(tok); } if (!(escape & E_BASH) && dch == '"') { getdesc(); if (!(escape & E_QUOTE)) { /* Start of a string, signal this with a string cell. */ escape|= E_QUOTE; tok->type= STRING; return inc(tok); } else { /* End of a string, back to normal mode. */ escape&= ~E_QUOTE; deallocate(tok); return get_token(); } } if (escape & E_BASH || strchr(escape & E_QUOTE ? "$" : "$=()+-*<>;\n", dch) == nil ) { if (dch == '\n') { fprintf(stderr, "\"%s\", line %u: missing closing quote\n", descr, lineno); escape&= ~E_QUOTE; action= 0; } if (escape & E_BASH && dch == 'n') dch= '\n'; escape&= ~E_BASH; /* A simple character. */ tok->type= LETTER; tok->letter= dch; getdesc(); escape|= E_SIMPLE; return inc(tok); } if (dch != '$') { /* Single character token. */ switch (dch) { case '=': tok->type= EQUALS; break; case '(': tok->type= OPEN; break; case ')': tok->type= CLOSE; break; case '+': tok->type= PLUS; break; case '-': tok->type= MINUS; break; case '*': tok->type= STAR; break; case '<': tok->type= INPUT; break; case '>': tok->type= OUTPUT; break; case ';': tok->type= SEMI; break; case '\n': tok->type= EOLN; break; } getdesc(); return inc(tok); } /* Substitution. */ getdesc(); if (dch == EOF || isspace(dch)) { fprintf(stderr, "\"%s\", line %u: Word expected after '$'\n", descr, lineno); action= 0; deallocate(tok); return get_token(); } name= allocate(nil, (n= 16) * sizeof(*name)); i= 0; if (dch == '{' || dch == '(' /* )} */ ) { /* $(X), ${X} */ int lpar= dch; /* ( */ int rpar= lpar == '{' ? '}' : ')'; for (;;) { getdesc(); if (dch == rpar) { getdesc(); break; } if (isspace(dch) || dch == EOF) { fprintf(stderr, "\"%s\", line %u: $%c unmatched, no '%c'\n", descr, lineno, lpar, rpar); action= 0; break; } name[i++]= dch; if (i == n) name= allocate(name, (n*= 2) * sizeof(char)); } } else if (extalnum(dch)) { /* $X */ do { name[i++]= dch; if (i == n) name= allocate(name, (n*= 2) * sizeof(char)); getdesc(); } while (extalnum(dch)); } else { /* $* */ name[i++]= dch; getdesc(); } name[i++]= 0; name= allocate(name, i * sizeof(char)); tok->type= SUBST; tok->subst= newcell(); tok->subst->type= WORD; tok->subst->name= name; tok->subst= inc(tok->subst); return inc(tok); } typedef enum how { SUPERFICIAL, PARTIAL, FULL, EXPLODE, IMPLODE } how_t; cell_t *explode(cell_t *p, how_t how); cell_t *get_string(cell_t **pp) /* Get a string: A series of letters and substs. Special tokens '=', '+', '-' * and '*' are also recognized if on their own. A finished string is "exploded" * to a word if it consists of letters only. */ { cell_t *p= *pp, *s= nil, **ps= &s; int quoted= 0; while (p != nil) { switch (p->type) { case STRING: quoted= 1; dec(p); break; case EQUALS: case PLUS: case MINUS: case STAR: case SUBST: case LETTER: *ps= cons(STRING, p); ps= &(*ps)->cdr; break; default: goto got_string; } p= get_token(); } got_string: *pp= p; /* A single special token must be folded up. */ if (!quoted && s != nil && s->cdr == nil) { switch (s->car->type) { case EQUALS: case PLUS: case MINUS: case STAR: case SUBST: return go(s, s->car); } } /* Go over the string changing '=', '+', '-', '*' to letters. */ for (p= s; p != nil; p= p->cdr) { int c= 0; switch (p->car->type) { case EQUALS: c= '='; break; case PLUS: c= '+'; break; case MINUS: c= '-'; break; case STAR: c= '*'; break; } if (c != 0) { dec(p->car); p->car= newcell(); p->car->type= LETTER; p->car->letter= c; p->car= inc(p->car); } } return explode(s, SUPERFICIAL); } cell_t *get_list(cell_t **pp, type_t stop) /* Read a series of tokens upto a token of type "stop". */ { cell_t *p= *pp, *l= nil, **pl= &l; while (p != nil && p->type != stop && !(stop == EOLN && p->type == SEMI)) { switch (p->type) { case WHITE: case COMMENT: case SEMI: case EOLN: dec(p); p= get_token(); break; case OPEN: /* '(' words ')'. */ dec(p); p= get_token(); *pl= cons(CELL, get_list(&p, CLOSE)); pl= &(*pl)->cdr; dec(p); p= get_token(); break; case CLOSE: /* Unexpected closing parenthesis. (*/ fprintf(stderr, "\"%s\", line %u: unmatched ')'\n", descr, lineno); action= 0; dec(p); p= get_token(); break; case INPUT: case OUTPUT: *pl= cons(CELL, p); pl= &(*pl)->cdr; p= get_token(); break; case STRING: case EQUALS: case PLUS: case MINUS: case STAR: case LETTER: case SUBST: *pl= cons(CELL, get_string(&p)); pl= &(*pl)->cdr; break; default: assert(0); } } if (p == nil && stop == CLOSE) { /* Couldn't get the closing parenthesis. */ fprintf(stderr, "\"%s\", lines %u-%u: unmatched '('\n", /*)*/ descr, pc->lineno, lineno); action= 0; } *pp= p; return l; } program_t *get_line(cell_t *file) { program_t *l; cell_t *p; static keep_indent= 0; static unsigned old_indent= 0; /* Skip leading whitespace to determine the indentation level. */ indent= 0; while ((p= get_token()) != nil && p->type == WHITE) dec(p); if (p == nil) return nil; /* EOF */ if (p->type == EOLN) indent= old_indent; /* Empty line. */ /* Make a program line. */ pc= l= allocate(nil, sizeof(*l)); l->next= nil; l->file= inc(file); l->indent= keep_indent ? old_indent : indent; l->lineno= lineno; l->line= get_list(&p, EOLN); /* If the line ended in a semicolon then keep the indentation level. */ keep_indent= (p != nil && p->type == SEMI); old_indent= l->indent; dec(p); if (verbose >= 4) { if (l->line == nil) fputc('\n', stdout); else { printf("%*s", (int) l->indent, ""); prin2n(l->line); } } return l; } program_t *get_prog(void) /* Read the description file into core. */ { cell_t *file; program_t *prog, **ppg= &prog; descr= copystr(descr); if (descr[0] == '-' && descr[1] == 0) { /* -descr -: Read from standard input. */ deallocate(descr); descr= copystr("stdin"); dfp= stdin; } else { char *d= descr; if (*d == '.' && *++d == '.') d++; if (*d != '/') { /* -descr name: Read /usr/lib/<name>/descr. */ d= allocate(nil, sizeof(LIB) + (strlen(descr) + 7) * sizeof(*d)); sprintf(d, "%s/%s/descr", LIB, descr); deallocate(descr); descr= d; } if ((dfp= fopen(descr, "r")) == nil) fatal(descr); } file= findword(descr); deallocate(descr); descr= file->name; /* Preread the first character. */ dch= 0; lineno= 1; indent= 0; getdesc(); while ((*ppg= get_line(file)) != nil) ppg= &(*ppg)->next; if (dfp != stdin) (void) fclose(dfp); dec(file); return prog; } void makenames(cell_t ***ppr, cell_t *s, char **name, size_t i, size_t *n) /* Turn a string of letters and lists into words. A list denotes a choice * between several paths, like a search on $PATH. */ { cell_t *p, *q; size_t len; /* Simply add letters, skip empty lists. */ while (s != nil && (s->car == nil || s->car->type == LETTER)) { if (s->car != nil) { if (i == *n) *name= allocate(*name, (*n *= 2) * sizeof(**name)); (*name)[i++]= s->car->letter; } s= s->cdr; } /* If the end is reached then make a word out of the result. */ if (s == nil) { **ppr= cons(CELL, findnword(*name, i)); *ppr= &(**ppr)->cdr; return; } /* Elements of a list must be tried one by one. */ p= s->car; s= s->cdr; while (p != nil) { if (p->type == WORD) { q= p; p= nil; } else { assert(p->type == CELL); q= p->car; p= p->cdr; assert(q != nil); assert(q->type == WORD); } len= strlen(q->name); if (i + len > *n) *name= allocate(*name, (*n += i + len) * sizeof(**name)); memcpy(*name + i, q->name, len); makenames(ppr, s, name, i+len, n); } } int constant(cell_t *p) /* See if a string has been partially evaluated to a constant so that it * can be imploded to a word. */ { while (p != nil) { switch (p->type) { case CELL: case STRING: if (!constant(p->car)) return 0; p= p->cdr; break; case SUBST: return 0; default: return 1; } } return 1; } cell_t *evaluate(cell_t *p, how_t how); cell_t *explode(cell_t *s, how_t how) /* Explode a string with several choices to just one list of choices. */ { cell_t *t, *r= nil, **pr= &r; size_t i, n; char *name; struct stat st; if (how >= PARTIAL) { /* Evaluate the string, expanding substitutions. */ while (s != nil) { assert(s->type == STRING); t= inc(s->car); s= go(s, s->cdr); t= evaluate(t, how == IMPLODE ? EXPLODE : how); /* A list of one element becomes that element. */ if (t != nil && t->type == CELL && t->cdr == nil) t= go(t, t->car); /* Append the result, trying to flatten it. */ *pr= t; /* Find the end of what has just been added. */ while ((*pr) != nil) { *pr= append(STRING, *pr); pr= &(*pr)->cdr; } } s= r; } /* Is the result a simple string of constants? */ if (how <= PARTIAL && !constant(s)) return s; /* Explode the string to all possible choices, by now the string is * a series of characters, words and lists of words. */ r= nil; pr= &r; name= allocate(nil, (n= 16) * sizeof(char)); i= 0; makenames(&pr, s, &name, i, &n); deallocate(name); assert(r != nil); dec(s); s= r; /* "How" may specify that a choice must be made. */ if (how == IMPLODE) { if (s->cdr != nil) { /* More than one choice, find the file. */ do { assert(s->car->type == WORD); if (stat(s->car->name, &st) >= 0) return go(r, s->car); /* Found. */ } while ((s= s->cdr) != nil); } /* The first name is the default if nothing is found. */ return go(r, r->car); } /* If the result is a list of one word then return that word, otherwise * turn it into a string again unless this explode has been called * by another explode. (Exploding a string inside a string, the joys * of recursion.) */ if (s->cdr == nil) return go(s, s->car); return how >= EXPLODE ? s : cons(STRING, s); } void modify(cell_t **pp, cell_t *p, type_t mode) /* Add or remove the element p from the list *pp. */ { while (*pp != nil) { *pp= append(CELL, *pp); if ((*pp)->car == p) { /* Found it, if adding then exit, else remove. */ if (mode == PLUS) break; *pp= go(*pp, (*pp)->cdr); } else pp= &(*pp)->cdr; } if (*pp == nil && mode == PLUS) { /* Not found, add it. */ *pp= cons(CELL, p); } else dec(p); } int tainted(cell_t *p) /* A variable is tainted (must be substituted) if either it is marked as a * local variable, or some subst in its value is. */ { if (p == nil) return 0; switch (p->type) { case CELL: case STRING: return tainted(p->car) || tainted(p->cdr); case SUBST: return p->subst->flags & W_LOCAL || tainted(p->subst->value); default: return 0; } } cell_t *evaluate(cell_t *p, how_t how) /* Evaluate an expression, usually the right hand side of an assignment. */ { cell_t *q, *t, *r= nil, **pr= &r; type_t mode; if (p == nil) return nil; switch (p->type) { case CELL: break; /* see below */ case STRING: return explode(p, how); case SUBST: if (how >= FULL || tainted(p)) p= evaluate(go(p, p->subst->value), how); return p; case EQUALS: fprintf(stderr, "\"%s\", line %u: Can't do nested assignments\n", descr, pc->lineno); action= 0; dec(p); return nil; case LETTER: case WORD: case INPUT: case OUTPUT: case PLUS: case MINUS: return p; default: assert(0); } /* It's a list, see if there is a '*' there forcing a full expansion, * or a '+' or '-' forcing an implosive expansion. (Yeah, right.) * Otherwise evaluate each element. */ q = inc(p); while (p != nil) { if ((t= p->car) != nil) { if (t->type == STAR) { if (how < FULL) how= FULL; dec(q); *pr= evaluate(go(p, p->cdr), how); return r; } if (how>=FULL && (t->type == PLUS || t->type == MINUS)) break; } t= evaluate(inc(t), how); assert(p->type == CELL); p= go(p, p->cdr); if (how >= FULL) { /* Flatten the list. */ *pr= t; } else { /* Keep the nested list structure. */ *pr= cons(CELL, t); } /* Find the end of what has just been added. */ while ((*pr) != nil) { *pr= append(CELL, *pr); pr= &(*pr)->cdr; } } if (p == nil) { /* No PLUS or MINUS: done. */ dec(q); return r; } /* A PLUS or MINUS, reevaluate the original list implosively. */ if (how < IMPLODE) { dec(r); dec(p); return evaluate(q, IMPLODE); } dec(q); /* Execute the PLUSes and MINUSes. */ while (p != nil) { t= inc(p->car); p= go(p, p->cdr); if (t != nil && (t->type == PLUS || t->type == MINUS)) { /* Change the add/subtract mode. */ mode= t->type; dec(t); continue; } t= evaluate(t, IMPLODE); /* Add or remove all elements of t to/from r. */ while (t != nil) { if (t->type == CELL) { modify(&r, inc(t->car), mode); } else { modify(&r, t, mode); break; } t= go(t, t->cdr); } } return r; } /* An ACD program can be in three phases: Initialization (the first run * of the program), argument scanning, and compilation. */ typedef enum phase { INIT, SCAN, COMPILE } phase_t; phase_t phase; typedef struct rule { /* Transformation rule. */ struct rule *next; char type; /* arg, transform, combine */ char flags; unsigned short npaths; /* Number of paths running through. */ # define match from /* Arg matching strings. */ cell_t *from; /* Transformation source suffixe(s) */ cell_t *to; /* Destination suffix. */ cell_t *wait; /* Files waiting to be transformed. */ program_t *prog; /* Program to execute. */ struct rule *path; /* Transformation path. */ } rule_t; typedef enum ruletype { ARG, PREFER, TRANSFORM, COMBINE } ruletype_t; #define R_PREFER 0x01 /* A preferred transformation. */ rule_t *rules= nil; void newrule(ruletype_t type, cell_t *from, cell_t *to) /* Make a new rule cell. */ { rule_t *r= nil, **pr= &rules; /* See if there is a rule with the same suffixes, probably a matching * transform and prefer, or a re-execution of the same arg command. */ while ((r= *pr) != nil) { if (r->from == from && r->to == to) break; pr= &r->next; } if (*pr == nil) { /* Add a new rule. */ *pr= r= allocate(nil, sizeof(*r)); r->next= nil; r->type= type; r->flags= 0; r->from= r->to= r->wait= nil; r->path= nil; } if (type == TRANSFORM) r->type= TRANSFORM; if (type == PREFER) r->flags|= R_PREFER; if (type != PREFER) r->prog= pc; dec(r->from); r->from= from; dec(r->to); r->to= to; } int talk(void) /* True if verbose and if so indent what is to come. */ { if (verbose < 3) return 0; printf("%*s", (int) pc->indent, ""); return 1; } void unix_exec(cell_t *c) /* Execute the list of words p as a UNIX command. */ { cell_t *v, *a; int fd[2]; int *pf; char **argv; int i, n; int r, pid, status; if (action == 0) return; /* Error mode. */ if (talk() || verbose >= 2) prin2n(c); fd[0]= fd[1]= -1; argv= allocate(nil, (n= 16) * sizeof(*argv)); i= 0; /* Gather argv[] and scan for I/O redirection. */ for (v= c; v != nil; v= v->cdr) { a= v->car; pf= nil; if (a->type == INPUT) pf= &fd[0]; if (a->type == OUTPUT) pf= &fd[1]; if (pf == nil) { /* An argument. */ argv[i++]= a->name; if (i==n) argv= allocate(argv, (n*= 2) * sizeof(*argv)); continue; } /* I/O redirection. */ if ((v= v->cdr) == nil || (a= v->car)->type != WORD) { fprintf(stderr, "\"%s\", line %u: I/O redirection without a file\n", descr, pc->lineno); action= 0; if (v == nil) break; } if (*pf >= 0) close(*pf); if (action >= 2 && (*pf= open(a->name, pf == &fd[0] ? O_RDONLY : O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0 ) { report(a->name); action= 0; } } argv[i]= nil; if (i >= 0 && action > 0 && verbose == 1) { char *name= strrchr(argv[0], '/'); if (name == nil) name= argv[0]; else name++; printf("%s\n", name); } if (i >= 0 && action >= 2) { /* Really execute the command. */ fflush(stdout); switch (pid= fork()) { case -1: fatal("fork()"); case 0: if (fd[0] >= 0) { dup2(fd[0], 0); close(fd[0]); } if (fd[1] >= 0) { dup2(fd[1], 1); close(fd[1]); } execvp(argv[0], argv); report(argv[0]); exit(-1); } } if (fd[0] >= 0) close(fd[0]); if (fd[1] >= 0) close(fd[1]); if (i >= 0 && action >= 2) { /* Wait for the command to terminate. */ while ((r= wait(&status)) != pid && (r >= 0 || errno == EINTR)); if (status != 0) { int sig= WTERMSIG(status); if (!WIFEXITED(status) && sig != SIGINT && sig != SIGPIPE) { fprintf(stderr, "%s: %s: Signal %d%s\n", program, argv[0], sig, status & 0x80 ? " - core dumped" : ""); } action= 0; } } deallocate(argv); } /* Special read-only variables ($*) and lists. */ cell_t *V_star, **pV_star; cell_t *L_files, **pL_files= &L_files; cell_t *V_in, *V_out, *V_stop, *L_args, *L_predef; typedef enum exec { DOIT, DONT } exec_t; void execute(exec_t how, unsigned indent); int equal(cell_t *p, cell_t *q) /* Two lists are equal if they contain each others elements. */ { cell_t *t, *m1, *m2; t= inc(newcell()); t->cdr= inc(newcell()); t->cdr->cdr= inc(newcell()); t->cdr->car= newcell(); t->cdr->car->type= MINUS; t->cdr->car= inc(t->cdr->car); /* Compute p - q. */ t->car= inc(p); t->cdr->cdr->car= inc(q); m1= evaluate(inc(t), IMPLODE); dec(m1); /* Compute q - p. */ t->car= q; t->cdr->cdr->car= p; m2= evaluate(t, IMPLODE); dec(m2); /* Both results must be empty. */ return m1 == nil && m2 == nil; } int wordlist(cell_t **pw, int atom) /* Check if p is a list of words, typically an imploded list. Return * the number of words seen, -1 if they are not words (INPUT/OUTPUT?). * If atom is true than a list of one word is turned into a word. */ { int n= 0; cell_t *p, **pp= pw; while (*pp != nil) { *pp= append(CELL, *pp); p= (*pp)->car; n= n >= 0 && p != nil && p->type == WORD ? n+1 : -1; pp= &(*pp)->cdr; } if (atom && n == 1) *pw= go(*pw, (*pw)->car); return n; } char *template; /* Current name of a temporary file. */ static char *tp; /* Current place withing the tempfile. */ char *maketemp(void) /* Return a name that can be used as a temporary filename. */ { int i= 0; if (tp == nil) { size_t len= strlen(template); template= allocate(template, (len+20) * sizeof(*template)); sprintf(template+len, "/acd%d", getpid()); tp= template + strlen(template); } for (;;) { switch (tp[i]) { case 0: tp[i]= 'a'; tp[i+1]= 0; return template; case 'z': tp[i++]= 'a'; break; default: tp[i]++; return template; } } } void inittemp(char *tmpdir) /* Initialize the temporary filename generator. */ { template= allocate(nil, (strlen(tmpdir)+20) * sizeof(*template)); sprintf(template, "%s/acd%d", tmpdir, getpid()); tp= template + strlen(template); /* Create a directory within tempdir that we can safely play in. */ while (action != 1 && mkdir(template, 0700) < 0) { if (errno == EEXIST) { (void) maketemp(); } else { report(template); action= 0; } } if (verbose >= 2) printf("mkdir %s\n", template); while (*tp != 0) tp++; *tp++= '/'; *tp= 0; } void deltemp(void) /* Remove our temporary temporaries directory. */ { while (*--tp != '/') {} *tp = 0; if (rmdir(template) < 0 && errno != ENOENT) report(template); if (verbose >= 2) printf("rmdir %s\n", template); deallocate(template); } cell_t *splitenv(char *env) /* Split a string from the environment into several words at whitespace * and colons. Two colons (::) become a dot. */ { cell_t *r= nil, **pr= &r; char *p; do { while (*env != 0 && isspace(*env)) env++; if (*env == 0) break; p= env; while (*p != 0 && !isspace(*p) && *p != ':') p++; *pr= cons(CELL, p == env ? findword(".") : findnword(env, p-env)); pr= &(*pr)->cdr; env= p; } while (*env++ != 0); return r; } void key_usage(char *how) { fprintf(stderr, "\"%s\", line %u: Usage: %s %s\n", descr, pc->lineno, pc->line->car->name, how); action= 0; } void inappropriate(void) { fprintf(stderr, "\"%s\", line %u: wrong execution phase for '%s'\n", descr, pc->lineno, pc->line->car->name); action= 0; } int readonly(cell_t *v) { if (v->flags & W_RDONLY) { fprintf(stderr, "\"%s\", line %u: %s is read-only\n", descr, pc->lineno, v->name); action= 0; return 1; } return 0; } void complain(cell_t *err) /* acd: err ... */ { cell_t *w; fprintf(stderr, "%s:", program); while (err != nil) { if (err->type == CELL) { w= err->car; err= err->cdr; } else { w= err; err= nil; } fprintf(stderr, " %s", w->name); } action= 0; } int keyword(char *name) /* True if the current line is headed by the given keyword. */ { cell_t *t; return (t= pc->line) != nil && t->type == CELL && (t= t->car) != nil && t->type == WORD && strcmp(t->name, name) == 0; } cell_t *getvar(cell_t *v) /* Return a word or the word referenced by a subst. */ { if (v == nil) return nil; if (v->type == WORD) return v; if (v->type == SUBST) return v->subst; return nil; } void argscan(void), compile(void); void transform(rule_t *); void exec_one(void) /* Execute one line of the program. */ { cell_t *v, *p, *q, *r, *t; unsigned n= 0; static int last_if= 1; /* Description file this line came from. */ descr= pc->file->name; for (p= pc->line; p != nil; p= p->cdr) n++; if (n == 0) return; /* Null statement. */ p= pc->line; q= p->cdr; r= q == nil ? nil : q->cdr; /* Try one by one all the different commands. */ if (n >= 2 && q->car != nil && q->car->type == EQUALS) { /* An assignment. */ int flags; if ((v= getvar(p->car)) == nil) { fprintf(stderr, "\"%s\", line %u: Usage: <var> = expr ...\n", descr, pc->lineno); action= 0; return; } if (readonly(v)) return; flags= v->flags; v->flags|= W_LOCAL|W_RDONLY; t= evaluate(inc(r), PARTIAL); dec(v->value); v->value= t; v->flags= flags | W_SET; if (talk()) { printf("%s =\b=\b= ", v->name); prin2n(t); } } else if (keyword("unset")) { /* Set a variable to "undefined". */ if (n != 2 || (v= getvar(q->car)) == nil) { key_usage("<var>"); return; } if (readonly(v)) return; if (talk()) prin2n(p); dec(v->value); v->value= nil; v->flags&= ~W_SET; } else if (keyword("import")) { /* Import a variable from the UNIX environment. */ char *env; if (n != 2 || (v= getvar(q->car)) == nil) { key_usage("<var>"); return; } if (readonly(v)) return; if ((env= getenv(v->name)) == nil) return; if (talk()) printf("import %s=%s\n", v->name, env); t= splitenv(env); dec(v->value); v->value= t; v->flags|= W_SET; } else if (keyword("mktemp")) { /* Assign a variable the name of a temporary file. */ char *tmp, *suff; r= evaluate(inc(r), IMPLODE); if (n == 3 && wordlist(&r, 1) != 1) n= 0; if ((n != 2 && n != 3) || (v= getvar(q->car)) == nil) { dec(r); key_usage("<var> [<suffix>]"); return; } if (readonly(v)) { dec(r); return; } tmp= maketemp(); suff= r == nil ? "" : r->name; t= newcell(); t->type= WORD; t->name= allocate(nil, (strlen(tmp) + strlen(suff) + 1) * sizeof(*t->name)); strcpy(t->name, tmp); strcat(t->name, suff); t= inc(t); dec(r); dec(v->value); v->value= t; v->flags|= W_SET; t->flags|= W_TEMP; if (talk()) printf("mktemp %s=%s\n", v->name, t->name); } else if (keyword("temporary")) { /* Mark a word as a temporary file. */ cell_t *tmp; tmp= evaluate(inc(q), IMPLODE); if (wordlist(&tmp, 1) < 0) { dec(tmp); key_usage("<word>"); return; } if (talk()) printf("temporary %s\n", tmp->name); tmp->flags|= W_TEMP; dec(tmp); } else if (keyword("stop")) { /* Set the suffix to stop the transformation on. */ cell_t *suff; if (phase > SCAN) { inappropriate(); return; } suff= evaluate(inc(q), IMPLODE); if (wordlist(&suff, 1) != 1) { dec(suff); key_usage("<suffix>"); return; } dec(V_stop); V_stop= suff; if (talk()) printf("stop %s\n", suff->name); } else if (keyword("numeric")) { /* Check if a string denotes a number, like $n in -O$n. */ cell_t *num; char *pn; num= evaluate(inc(q), IMPLODE); if (wordlist(&num, 1) != 1) { dec(num); key_usage("<arg>"); return; } if (talk()) printf("numeric %s\n", num->name); (void) strtoul(num->name, &pn, 10); if (*pn != 0) { complain(phase == SCAN ? V_star->value : nil); if (phase == SCAN) fputc(':', stderr); fprintf(stderr, " '%s' is not a number\n", num->name); } dec(num); } else if (keyword("error")) { /* Signal an error. */ cell_t *err; err= evaluate(inc(q), IMPLODE); if (wordlist(&err, 0) < 1) { dec(err); key_usage("expr ..."); return; } if (talk()) { printf("error "); prin2n(err); } complain(err); fputc('\n', stderr); dec(err); } else if (keyword("if")) { /* if (list) = (list) using set comparison. */ int eq; if (n != 4 || r->car == nil || r->car->type != EQUALS) { key_usage("<expr> = <expr>"); execute(DONT, pc->indent+1); last_if= 1; return; } q= q->car; r= r->cdr->car; if (talk()) { printf("if "); prin1(t= evaluate(inc(q), IMPLODE)); dec(t); printf(" = "); prin1n(t= evaluate(inc(r), IMPLODE)); dec(t); } eq= equal(q, r); execute(eq ? DOIT : DONT, pc->indent+1); last_if= eq; } else if (keyword("ifdef") || keyword("ifndef")) { /* Is a variable defined or undefined? */ int doit; if (n != 2 || (v= getvar(q->car)) == nil) { key_usage("<var>"); execute(DONT, pc->indent+1); last_if= 1; return; } if (talk()) prin2n(p); doit= ((v->flags & W_SET) != 0) ^ (p->car->name[2] == 'n'); execute(doit ? DOIT : DONT, pc->indent+1); last_if= doit; } else if (keyword("iftemp") || keyword("ifhash")) { /* Is a file a temporary file? */ /* Does a file need preprocessing? */ cell_t *file; int doit= 0; file= evaluate(inc(q), IMPLODE); if (wordlist(&file, 1) != 1) { dec(file); key_usage("<arg>"); return; } if (talk()) printf("%s %s\n", p->car->name, file->name); if (p->car->name[2] == 't') { /* iftemp file */ if (file->flags & W_TEMP) doit= 1; } else { /* ifhash file */ int fd; char hash; if ((fd= open(file->name, O_RDONLY)) >= 0) { if (read(fd, &hash, 1) == 1 && hash == '#') doit= 1; close(fd); } } dec(file); execute(doit ? DOIT : DONT, pc->indent+1); last_if= doit; } else if (keyword("else")) { /* Else clause for an if, ifdef, or ifndef. */ if (n != 1) { key_usage(""); execute(DONT, pc->indent+1); return; } if (talk()) prin2n(p); execute(!last_if ? DOIT : DONT, pc->indent+1); } else if (keyword("treat")) { /* Treat a file as having a certain suffix. */ if (phase > SCAN) { inappropriate(); return; } if (n == 3) { q= evaluate(inc(q->car), IMPLODE); r= evaluate(inc(r->car), IMPLODE); } if (n != 3 || wordlist(&q, 1) != 1 || wordlist(&r, 1) != 1) { if (n == 3) { dec(q); dec(r); } key_usage("<file> <suffix>"); return; } if (talk()) printf("treat %s %s\n", q->name, r->name); dec(q->suffix); q->suffix= r; q->flags|= W_SUFF; dec(q); } else if (keyword("apply")) { /* Apply a transformation rule to the current input file. */ rule_t *rule, *sav_path; cell_t *sav_wait, *sav_in, *sav_out; program_t *sav_next; if (phase != COMPILE) { inappropriate(); return; } if (V_star->value->cdr != nil) { fprintf(stderr, "\"%s\", line %u: $* is not one file\n", descr, pc->lineno); action= 0; return; } if (n == 3) { q= evaluate(inc(q->car), IMPLODE); r= evaluate(inc(r->car), IMPLODE); } if (n != 3 || wordlist(&q, 1) != 1 || wordlist(&r, 1) != 1) { if (n == 3) { dec(q); dec(r); } key_usage("<file> <suffix>"); return; } if (talk()) printf("apply %s %s\n", q->name, r->name); /* Find a rule */ for (rule= rules; rule != nil; rule= rule->next) { if (rule->type == TRANSFORM && rule->from == q && rule->to == r) break; } if (rule == nil) { fprintf(stderr, "\"%s\", line %u: no %s %s transformation\n", descr, pc->lineno, q->name, r->name); action= 0; } dec(q); dec(r); if (rule == nil) return; /* Save the world. */ sav_path= rule->path; sav_wait= rule->wait; sav_in= V_in->value; sav_out= V_out->value; sav_next= nextpc; /* Isolate the rule and give it new input. */ rule->path= rule; rule->wait= V_star->value; V_star->value= nil; V_in->value= nil; V_out->value= nil; transform(rule); /* Retrieve the new $* and repair. */ V_star->value= rule->wait; rule->path= sav_path; rule->wait= sav_wait; V_in->value= sav_in; V_out->value= sav_out; V_out->flags= W_SET|W_LOCAL; nextpc= sav_next; } else if (keyword("include")) { /* Include another description file into this program. */ cell_t *file; program_t *incl, *prog, **ppg= &prog; file= evaluate(inc(q), IMPLODE); if (wordlist(&file, 1) != 1) { dec(file); key_usage("<file>"); return; } if (talk()) printf("include %s\n", file->name); descr= file->name; incl= pc; prog= get_prog(); dec(file); /* Raise the program to the include's indent level. */ while (*ppg != nil) { (*ppg)->indent += incl->indent; ppg= &(*ppg)->next; } /* Kill the include and splice the included program in. */ dec(incl->line); incl->line= nil; *ppg= incl->next; incl->next= prog; pc= incl; nextpc= prog; } else if (keyword("arg")) { /* An argument scanning rule. */ if (phase > SCAN) { inappropriate(); return; } if (n < 2) { key_usage("<string> ..."); execute(DONT, pc->indent+1); return; } if (talk()) prin2n(p); newrule(ARG, inc(q), nil); /* Always skip the body, it comes later. */ execute(DONT, pc->indent+1); } else if (keyword("transform")) { /* A file transformation rule. */ if (phase > SCAN) { inappropriate(); return; } if (n == 3) { q= evaluate(inc(q->car), IMPLODE); r= evaluate(inc(r->car), IMPLODE); } if (n != 3 || wordlist(&q, 1) != 1 || wordlist(&r, 1) != 1) { if (n == 3) { dec(q); dec(r); } key_usage("<suffix1> <suffix2>"); execute(DONT, pc->indent+1); return; } if (talk()) printf("transform %s %s\n", q->name, r->name); newrule(TRANSFORM, q, r); /* Body comes later. */ execute(DONT, pc->indent+1); } else if (keyword("prefer")) { /* Prefer a transformation over others. */ if (phase > SCAN) { inappropriate(); return; } if (n == 3) { q= evaluate(inc(q->car), IMPLODE); r= evaluate(inc(r->car), IMPLODE); } if (n != 3 || wordlist(&q, 1) != 1 || wordlist(&r, 1) != 1) { if (n == 3) { dec(q); dec(r); } key_usage("<suffix1> <suffix2>"); return; } if (talk()) printf("prefer %s %s\n", q->name, r->name); newrule(PREFER, q, r); } else if (keyword("combine")) { /* A file combination (loader) rule. */ if (phase > SCAN) { inappropriate(); return; } if (n == 3) { q= evaluate(inc(q->car), IMPLODE); r= evaluate(inc(r->car), IMPLODE); } if (n != 3 || wordlist(&q, 0) < 1 || wordlist(&r, 1) != 1) { if (n == 3) { dec(q); dec(r); } key_usage("<suffix-list> <suffix>"); execute(DONT, pc->indent+1); return; } if (talk()) { printf("combine "); prin1(q); printf(" %s\n", r->name); } newrule(COMBINE, q, r); /* Body comes later. */ execute(DONT, pc->indent+1); } else if (keyword("scan") || keyword("compile")) { program_t *next= nextpc; if (n != 1) { key_usage(""); return; } if (phase != INIT) { inappropriate(); return; } if (talk()) prin2n(p); argscan(); if (p->car->name[0] == 'c') compile(); nextpc= next; } else { /* A UNIX command. */ t= evaluate(inc(pc->line), IMPLODE); unix_exec(t); dec(t); } } void execute(exec_t how, unsigned indent) /* Execute (or skip) all lines with at least the given indent. */ { int work= 0; /* Need to execute at least one line. */ unsigned firstline; unsigned nice_indent= 0; /* 0 = Don't know what's nice yet. */ if (pc == nil) return; /* End of program. */ firstline= pc->lineno; if (how == DONT) { /* Skipping a body, but is there another guard? */ pc= pc->next; if (pc != nil && pc->indent < indent && pc->line != nil) { /* There is one! Bail out, then it get's executed. */ return; } } else { /* Skip lines with a lesser indentation, they are guards for * the same substatements. Don't go past empty lines. */ while (pc != nil && pc->indent < indent && pc->line != nil) pc= pc->next; } /* Execute all lines with an indentation of at least "indent". */ while (pc != nil && pc->indent >= indent) { if (pc->indent != nice_indent && how == DOIT) { if (nice_indent != 0) { fprintf(stderr, "\"%s\", line %u: (warning) sudden indentation shift\n", descr, pc->lineno); } nice_indent= pc->indent; } nextpc= pc->next; if (how == DOIT) exec_one(); pc= nextpc; work= 1; } if (indent > 0 && !work) { fprintf(stderr, "\"%s\", line %u: empty body, no statements\n", descr, firstline); action= 0; } } int argmatch(int shift, cell_t *match, cell_t *match1, char *arg1) /* Try to match an arg rule to the input file list L_args. Execute the arg * body (pc is set to it) on success. */ { cell_t *oldval, *v; int m, oldflags; size_t i, len; int minus= 0; if (shift) { /* An argument has been accepted and may be shifted to $*. */ cell_t **oldpstar= pV_star; *pV_star= L_args; L_args= *(pV_star= &L_args->cdr); *pV_star= nil; if (argmatch(0, match->cdr, nil, nil)) return 1; /* Undo the damage. */ *pV_star= L_args; L_args= *(pV_star= oldpstar); *pV_star= nil; return 0; } if (match == nil) { /* A full match, execute the arg body. */ /* Enable $>. */ V_out->flags= W_SET|W_LOCAL; if (verbose >= 3) { prin2(pc->line); printf(" =\b=\b= "); prin2n(V_star->value); } execute(DOIT, pc->indent+1); /* Append $> to the file list. */ if (V_out->value != nil) { *pL_files= cons(CELL, V_out->value); pL_files= &(*pL_files)->cdr; } /* Disable $>. */ V_out->value= nil; V_out->flags= W_SET|W_LOCAL|W_RDONLY; return 1; } if (L_args == nil) return 0; /* Out of arguments to match. */ /* Match is a list of words, substs and strings containing letters and * substs. Match1 is the current element of the first element of match. * Arg1 is the current character of the first element of L_args. */ if (match1 == nil) { /* match1 is at the end of a string, then arg1 must also. */ if (arg1 != nil) { if (*arg1 != 0) return 0; return argmatch(1, match, nil, nil); } /* If both are nil: Initialize. */ match1= match->car; arg1= L_args->car->name; /* A subst may not match a leading '-'. */ if (arg1[0] == '-') minus= 1; } if (match1->type == WORD && strcmp(match1->name, arg1) == 0) { /* A simple match of an argument. */ return argmatch(1, match, nil, nil); } if (match1->type == SUBST && !minus) { /* A simple match of a subst. */ /* The variable gets the first of the arguments as its value. */ v= match1->subst; if (v->flags & W_RDONLY) return 0; /* ouch */ oldflags= v->flags; v->flags= W_SET|W_LOCAL|W_RDONLY; oldval= v->value; v->value= inc(L_args->car); m= argmatch(1, match, nil, nil); /* Recover the value of the variable. */ dec(v->value); v->flags= oldflags; v->value= oldval; return m; } if (match1->type != STRING) return 0; /* Match the first item in the string. */ if (match1->car == nil) return 0; if (match1->car->type == LETTER && match1->car->letter == (unsigned char) *arg1) { /* A letter matches, try the rest of the string. */ return argmatch(0, match, match1->cdr, arg1+1); } /* It can only be a subst in a string now. */ len= strlen(arg1); if (match1->car->type != SUBST || minus || len == 0) return 0; /* The variable can match from 1 character to all of the argument. * Matching as few characters as possible happens to be the Right Thing. */ v= match1->car->subst; if (v->flags & W_RDONLY) return 0; /* ouch */ oldflags= v->flags; v->flags= W_SET|W_LOCAL|W_RDONLY; oldval= v->value; m= 0; for (i= match1->cdr == nil ? len : 1; !m && i <= len; i++) { v->value= findnword(arg1, i); m= argmatch(0, match, match1->cdr, arg1+i); dec(v->value); } /* Recover the value of the variable. */ v->flags= oldflags; v->value= oldval; return m; } void argscan(void) /* Match all the arguments to the arg rules, those that don't match are * used as files for transformation. */ { rule_t *rule; int m; phase= SCAN; /* Process all the arguments. */ while (L_args != nil) { pV_star= &V_star->value; /* Try all the arg rules. */ m= 0; for (rule= rules; !m && rule != nil; rule= rule->next) { if (rule->type != ARG) continue; pc= rule->prog; m= argmatch(0, rule->match, nil, nil); } dec(V_star->value); V_star->value= nil; /* On failure, add the first argument to the list of files. */ if (!m) { *pL_files= L_args; L_args= *(pL_files= &L_args->cdr); *pL_files= nil; } } phase= INIT; } int member(cell_t *p, cell_t *l) /* True if p is a member of list l. */ { while (l != nil && l->type == CELL) { if (p == l->car) return 1; l= l->cdr; } return p == l; } long basefind(cell_t *f, cell_t *l) /* See if f has a suffix in list l + set the base name of f. * -1 if not found, preference number for a short basename otherwise. */ { cell_t *suff; size_t blen, slen; char *base; /* Determine base name of f, with suffix. */ if ((base= strrchr(f->name, '/')) == nil) base= f->name; else base++; blen= strlen(base); /* Try suffixes. */ while (l != nil) { if (l->type == CELL) { suff= l->car; l= l->cdr; } else { suff= l; l= nil; } if (f->flags & W_SUFF) { /* F has a suffix imposed on it. */ if (f->suffix == suff) return 0; continue; } slen= strlen(suff->name); if (slen < blen && strcmp(base+blen-slen, suff->name) == 0) { /* Got it! */ dec(f->base); f->base= findnword(base, blen-slen); return 10000L * (blen - slen); } } return -1; } #define NO_PATH 2000000000 /* No path found yet. */ long shortest; /* Length of the shortest path as yet. */ rule_t *findpath(long depth, int seek, cell_t *file, rule_t *start) /* Find the path of the shortest transformation to the stop suffix. */ { rule_t *rule; if (action == 0) return nil; if (start == nil) { /* No starting point defined, find one using "file". */ for (rule= rules; rule != nil; rule= rule->next) { if (rule->type < TRANSFORM) continue; if ((depth= basefind(file, rule->from)) >= 0) { if (findpath(depth, seek, nil, rule) != nil) return rule; } } return nil; } /* Cycle? */ if (start->path != nil) { /* We can't have cycles through combines. */ if (start->type == COMBINE) { fprintf(stderr, "\"%s\": contains a combine-combine cycle\n", descr); action= 0; } return nil; } /* Preferred transformations are cheap. */ if (start->flags & R_PREFER) depth-= 100; /* Try to go from start closer to the stop suffix. */ for (rule= rules; rule != nil; rule= rule->next) { if (rule->type < TRANSFORM) continue; if (member(start->to, rule->from)) { start->path= rule; rule->npaths++; if (findpath(depth+1, seek, nil, rule) != nil) return start; start->path= nil; rule->npaths--; } } if (V_stop == nil) { fprintf(stderr, "\"%s\": no stop suffix has been defined\n", descr); action= 0; return nil; } /* End of the line? */ if (start->to == V_stop) { /* Got it. */ if (seek) { /* Second hunt, do we find the shortest? */ if (depth == shortest) return start; } else { /* Is this path shorter than the last one? */ if (depth < shortest) shortest= depth; } } return nil; /* Fail. */ } void transform(rule_t *rule) /* Transform the file(s) connected to the rule according to the rule. */ { cell_t *file, *in, *out; char *base; /* Let $* be the list of input files. */ while (rule->wait != nil) { file= rule->wait; rule->wait= file->cdr; file->cdr= V_star->value; V_star->value= file; } /* Set $< to the basename of the first input file. */ file= file->car; V_in->value= in= inc(file->flags & W_SUFF ? file : file->base); file->flags&= ~W_SUFF; /* Set $> to the output file name of the transformation. */ out= newcell(); out->type= WORD; base= rule->path == nil ? in->name : maketemp(); out->name= allocate(nil, (strlen(base)+strlen(rule->to->name)+1) * sizeof(*out->name)); strcpy(out->name, base); if (rule->path == nil || strchr(rule->to->name, '/') == nil) strcat(out->name, rule->to->name); out= inc(out); if (rule->path != nil) out->flags|= W_TEMP; V_out->value= out; V_out->flags= W_SET|W_LOCAL; /* Do a transformation. (Finally) */ if (verbose >= 3) { printf("%s ", rule->type==TRANSFORM ? "transform" : "combine"); prin2(V_star->value); printf(" %s\n", out->name); } pc= rule->prog; execute(DOIT, pc->indent+1); /* Hand $> over to the next rule, it must be a single word. */ out= evaluate(V_out->value, IMPLODE); if (wordlist(&out, 1) != 1) { fprintf(stderr, "\"%s\", line %u: $> should be returned as a single word\n", descr, rule->prog->lineno); action= 0; } if ((rule= rule->path) != nil) { /* There is a next rule. */ dec(out->base); out->base= in; /* Basename of input file. */ file= inc(newcell()); file->car= out; file->cdr= rule->wait; rule->wait= file; } else { dec(in); dec(out); } /* Undo the damage to $*, $<, and $>. */ dec(V_star->value); V_star->value= nil; V_in->value= nil; V_out->value= nil; V_out->flags= W_SET|W_LOCAL|W_RDONLY; } void compile(void) { rule_t *rule; cell_t *file, *t; phase= COMPILE; /* Implode the files list. */ L_files= evaluate(L_files, IMPLODE); if (wordlist(&L_files, 0) < 0) { fprintf(stderr, "\"%s\": An assignment to $> contained junk\n", descr); action= 0; } while (action != 0 && L_files != nil) { file= L_files->car; /* Initialize. */ shortest= NO_PATH; for (rule= rules; rule != nil; rule= rule->next) rule->path= nil; /* Try all possible transformation paths. */ (void) findpath(0L, 0, file, nil); if (shortest == NO_PATH) { /* Can't match the file. */ fprintf(stderr, "%s: %s: can't compile, no transformation applies\n", program, file->name); action= 0; return; } /* Find the first short path. */ if ((rule= findpath(0L, 1, file, nil)) == nil) return; /* Transform the file until you hit a combine. */ t= inc(newcell()); t->car= inc(file); L_files= go(L_files, L_files->cdr); t->cdr= rule->wait; rule->wait= t; while (action != 0 && rule != nil && rule->type != COMBINE) { transform(rule); rule= rule->path; } } /* All input files have been transformed to combine rule(s). Now * we need to find the combine rule with the least number of paths * running through it (this combine may be followed by another) and * transform from there. */ while (action != 0) { int least; rule_t *comb= nil; for (rule= rules; rule != nil; rule= rule->next) { rule->path= nil; if (rule->type != COMBINE || rule->wait == nil) continue; if (comb == nil || rule->npaths < least) { least= rule->npaths; comb= rule; } } /* No combine? Then we're done. */ if (comb == nil) break; /* Initialize. */ shortest= NO_PATH; /* Try all possible transformation paths. */ (void) findpath(0L, 0, nil, comb); if (shortest == NO_PATH) break; /* Find the first short path. */ if ((rule= findpath(0L, 1, nil, comb)) == nil) return; /* Transform until you hit another combine. */ do { transform(rule); rule= rule->path; } while (action != 0 && rule != nil && rule->type != COMBINE); } phase= INIT; } cell_t *predef(char *var, char *val) /* A predefined variable var with value val, or a special variable. */ { cell_t *p, *t; p= findword(var); if (val != nil) { /* Predefined. */ t= findword(val); dec(p->value); p->value= t; p->flags|= W_SET; if (verbose >= 3) { prin1(p); printf(" =\b=\b= "); prin2n(t); } } else { /* Special: $* and such. */ p->flags= W_SET|W_LOCAL|W_RDONLY; } t= inc(newcell()); t->car= p; t->cdr= L_predef; L_predef= t; return p; } void usage(void) { fprintf(stderr, "Usage: %s -v<n> -vn<n> -name <name> -descr <descr> -T <dir> ...\n", program); exit(-1); } int main(int argc, char **argv) { char *tmpdir; program_t *prog; cell_t **pa; int i; /* Call name of the program, decides which description to use. */ if ((program= strrchr(argv[0], '/')) == nil) program= argv[0]; else program++; /* Directory for temporary files. */ if ((tmpdir= getenv("TMPDIR")) == nil || *tmpdir == 0) tmpdir= "/tmp"; /* Transform arguments to a list, processing the few ACD options. */ pa= &L_args; for (i= 1; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'v') { char *a= argv[i]+2; if (*a == 'n') { a++; action= 1; } verbose= 2; if (*a != 0) { verbose= strtoul(a, &a, 10); if (*a != 0) usage(); } } else if (strcmp(argv[i], "-name") == 0) { if (++i == argc) usage(); program= argv[i]; } else if (strcmp(argv[i], "-descr") == 0) { if (++i == argc) usage(); descr= argv[i]; } else if (argv[i][0] == '-' && argv[i][1] == 'T') { if (argv[i][2] == 0) { if (++i == argc) usage(); tmpdir= argv[i]; } else tmpdir= argv[i]+2; } else { /* Any other argument must be processed. */ *pa= cons(CELL, findword(argv[i])); pa= &(*pa)->cdr; } } #ifndef DESCR /* Default description file is based on the program name. */ if (descr == nil) descr= program; #else /* Default description file is predefined. */ if (descr == nil) descr= DESCR; #endif inittemp(tmpdir); /* Catch user signals. */ if (signal(SIGHUP, SIG_IGN) != SIG_IGN) signal(SIGHUP, interrupt); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, interrupt); if (signal(SIGTERM, SIG_IGN) != SIG_IGN) signal(SIGTERM, interrupt); /* Predefined or special variables. */ predef("PROGRAM", program); predef("VERSION", version); #ifdef ARCH predef("ARCH", ARCH); /* Cross-compilers like this. */ #endif V_star= predef("*", nil); V_in= predef("<", nil); V_out= predef(">", nil); /* Read the description file. */ if (verbose >= 3) printf("include %s\n", descr); prog= get_prog(); phase= INIT; pc= prog; execute(DOIT, 0); argscan(); compile(); /* Delete all allocated data to test inc/dec balance. */ while (prog != nil) { program_t *junk= prog; prog= junk->next; dec(junk->file); dec(junk->line); deallocate(junk); } while (rules != nil) { rule_t *junk= rules; rules= junk->next; dec(junk->from); dec(junk->to); dec(junk->wait); deallocate(junk); } deltemp(); dec(V_stop); dec(L_args); dec(L_files); dec(L_predef); quit(action == 0 ? 1 : 0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .������������� ..������������ Makefile������ asm86.c������� asm86.h������� asmconv.c����� asmconv.h����� emit_ack.c���� emit_gnu.c���� languages.h��� parse_ack.c��� parse_bas.c��� parse_gnu.c��� syntax.ack���� token.h������� tokenize.c����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for asmconv. CFLAGS= $(OPT) LDFLAGS= -i all: asmconv OBJ= asm86.o asmconv.o parse_ack.o parse_gnu.o parse_bas.o \ tokenize.o emit_ack.o emit_gnu.o asmconv: $(OBJ) $(CC) $(LDFLAGS) -o $@ $(OBJ) install -S 8kw $@ install: /usr/lib/asmconv /usr/lib/asmconv: asmconv install -cs -o bin asmconv $@ clean: rm -f $(OBJ) asmconv core # Dependencies. asm86.o: asm86.h asmconv.h token.h asmconv.o: asmconv.h languages.h asm86.h parse_ack.o: asmconv.h languages.h token.h asm86.h parse_gnu.o: asmconv.h languages.h token.h asm86.h parse_bas.o: asmconv.h languages.h token.h asm86.h tokenize.o: asmconv.h token.h emit_ack.o: asmconv.h languages.h token.h asm86.h emit_gnu.o: asmconv.h languages.h token.h asm86.h ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* asm86.c - 80X86 assembly intermediate Author: Kees J. Bot * 24 Dec 1993 */ #define nil 0 #include <stddef.h> #include <string.h> #include <assert.h> #include "asm86.h" #include "asmconv.h" #include "token.h" expression_t *new_expr(void) /* Make a new cell to build an expression. */ { expression_t *e; e= allocate(nil, sizeof(*e)); e->operator= -1; e->left= e->middle= e->right= nil; e->name= nil; e->magic= 31624; return e; } void del_expr(expression_t *e) /* Delete an expression tree. */ { if (e != nil) { assert(e->magic == 31624); e->magic= 0; deallocate(e->name); del_expr(e->left); del_expr(e->middle); del_expr(e->right); deallocate(e); } } asm86_t *new_asm86(void) /* Make a new cell to hold an 80X86 instruction. */ { asm86_t *a; a= allocate(nil, sizeof(*a)); a->opcode= -1; get_file(&a->file, &a->line); a->optype= -1; a->oaz= 0; a->rep= ONCE; a->seg= DEFSEG; a->args= nil; a->magic= 37937; return a; } void del_asm86(asm86_t *a) /* Delete an 80X86 instruction. */ { assert(a != nil); assert(a->magic == 37937); a->magic= 0; del_expr(a->args); deallocate(a); } int isregister(const char *name) /* True if the string is a register name. Return its size. */ { static char *regs[] = { "al", "bl", "cl", "dl", "ah", "bh", "ch", "dh", "ax", "bx", "cx", "dx", "si", "di", "bp", "sp", "cs", "ds", "es", "fs", "gs", "ss", "eax", "ebx", "ecx", "edx", "esi", "edi", "ebp", "esp", "cr0", "cr1", "cr2", "cr3", "st", }; int reg; for (reg= 0; reg < arraysize(regs); reg++) { if (strcmp(name, regs[reg]) == 0) { return reg < 8 ? 1 : reg < 22 ? 2 : 4; } } return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* asm86.h - 80X86 assembly intermediate Author: Kees J. Bot * 27 Jun 1993 */ typedef enum opcode { /* 80486 opcodes, from the i486 reference manual. * Synonyms left out, some new words invented. */ DOT_ALIGN, DOT_ASCII, DOT_ASCIZ, DOT_ASSERT, /* Pseudo's invented */ DOT_BASE, DOT_COMM, DOT_LCOMM, DOT_DATA1, DOT_DATA2, DOT_DATA4, DOT_DEFINE, DOT_EXTERN, DOT_EQU, DOT_FILE, DOT_LINE, DOT_LABEL, DOT_LIST, DOT_NOLIST, DOT_SPACE, DOT_SYMB, DOT_TEXT, DOT_ROM, DOT_DATA, DOT_BSS, DOT_END, DOT_USE16, DOT_USE32, AAA, AAD, AAM, AAS, ADC, ADD, AND, ARPL, BOUND, BSF, BSR, BSWAP, BT, BTC, BTR, BTS, CALL, CALLF, /* CALLF added */ CBW, CLC, CLD, CLI, CLTS, CMC, CMP, CMPS, CMPXCHG, CWD, DAA, DAS, DEC, DIV, ENTER, F2XM1, FABS, FADD, FADDD, FADDS, FADDP, FIADDL, FIADDS, FBLD, FBSTP, FCHS, FCLEX, FCOMD, FCOMS, FCOMPD, FCOMPS, FCOMPP, FCOS, FDECSTP, FDIVD, FDIVS, FDIVP, FIDIVL, FIDIVS, FDIVRD, FDIVRS, FDIVRP, FIDIVRL, FIDIVRS, FFREE, FICOM, FICOMP, FILDQ, FILDL, FILDS, FINCSTP, FINIT, FISTL, FISTS, FISTP, FLDX, FLDD, FLDS, FLD1, FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, FLDZ, FLDCW, FLDENV, FMULD, FMULS, FMULP, FIMULL, FIMULS, FNOP, FPATAN, FPREM, FPREM1, FPTAN, FRNDINT, FRSTOR, FSAVE, FSCALE, FSIN, FSINCOS, FSQRT, FSTD, FSTS, FSTPX, FSTPD, FSTPS, FSTCW, FSTENV, FSTSW, FSUBD, FSUBS, FSUBP, FISUBL, FISUBS, FSUBRD, FSUBRS, FSUBPR, FISUBRL, FISUBRS, FTST, FUCOM, FUCOMP, FUCOMPP, FXAM, FXCH, FXTRACT, FYL2X, FYL2XP1, HLT, IDIV, IMUL, IN, INC, INS, INT, INTO, INVD, INVLPG, IRET, IRETD, JA, JAE, JB, JBE, JCXZ, JE, JG, JGE, JL, JLE, JNE, JNO, JNP, JNS, JO, JP, JS, JMP, JMPF, /* JMPF added */ LAHF, LAR, LEA, LEAVE, LGDT, LIDT, LGS, LSS, LDS, LES, LFS, LLDT, LMSW, LOCK, LODS, LOOP, LOOPE, LOOPNE, LSL, LTR, MOV, MOVS, MOVSX, MOVSXB, MOVZX, MOVZXB, MUL, NEG, NOP, NOT, OR, OUT, OUTS, POP, POPA, POPF, PUSH, PUSHA, PUSHF, RCL, RCR, ROL, ROR, RET, RETF, /* RETF added */ SAHF, SAL, SAR, SHL, SHR, SBB, SCAS, SETA, SETAE, SETB, SETBE, SETE, SETG, SETGE, SETL, SETLE, SETNE, SETNO, SETNP, SETNS, SETO, SETP, SETS, SGDT, SIDT, SHLD, SHRD, SLDT, SMSW, STC, STD, STI, STOS, STR, SUB, TEST, VERR, VERW, WAIT, WBINVD, XADD, XCHG, XLAT, XOR } opcode_t; #define is_pseudo(o) ((o) <= DOT_USE32) #define N_OPCODES ((int) XOR + 1) #define OPZ 0x01 /* Operand size prefix. */ #define ADZ 0x02 /* Address size prefix. */ typedef enum optype { PSEUDO, JUMP, BYTE, WORD, OWORD /* Ordered list! */ } optype_t; typedef enum repeat { ONCE, REP, REPE, REPNE } repeat_t; typedef enum segment { DEFSEG, CSEG, DSEG, ESEG, FSEG, GSEG, SSEG } segment_t; typedef struct expression { int operator; struct expression *left, *middle, *right; char *name; size_t len; unsigned magic; } expression_t; typedef struct asm86 { opcode_t opcode; /* DOT_TEXT, MOV, ... */ char *file; /* Name of the file it is found in. */ long line; /* Line number. */ optype_t optype; /* Type of operands: byte, word... */ int oaz; /* Operand/address size prefix? */ repeat_t rep; /* Repeat prefix used on this instr. */ segment_t seg; /* Segment override. */ expression_t *args; /* Arguments in ACK order. */ unsigned magic; } asm86_t; expression_t *new_expr(void); void del_expr(expression_t *a); asm86_t *new_asm86(void); void del_asm86(asm86_t *a); int isregister(const char *name); /* * Format of the arguments of the asm86_t structure: * * * ACK assembly operands expression_t cell: * or part of operand: {operator, left, middle, right, name, len} * * [expr] {'[', nil, expr, nil} * word {'W', nil, nil, nil, word} * "string" {'S', nil, nil, nil, "string", strlen("string")} * label = expr {'=', nil, expr, nil, label} * expr * expr {'*', expr, nil, expr} * - expr {'-', nil, expr, nil} * (memory) {'(', nil, memory, nil} * offset(base)(index*n) {'O', offset, base, index*n} * base {'B', nil, nil, nil, base} * index*4 {'4', nil, nil, nil, index} * operand, oplist {',', operand, nil, oplist} * label : {':', nil, nil, nil, label} * * The precedence of operators is ignored. The expression is simply copied * as is, including parentheses. Problems like missing operators in the * target language will have to be handled by rewriting the source language. * 16-bit or 32-bit registers must be used where they are required by the * target assembler even though ACK makes no difference between 'ax' and * 'eax'. Asmconv is smart enough to transform compiler output. Human made * assembly can be fixed up to be transformable. */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* asmconv 1.11 - convert 80X86 assembly Author: Kees J. Bot * 24 Dec 1993 */ static char version[] = "1.11"; #define nil 0 #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <assert.h> #include "asmconv.h" #include "asm86.h" #include "languages.h" void fatal(char *label) { fprintf(stderr, "asmconv: %s: %s\n", label, strerror(errno)); exit(EXIT_FAILURE); } void *allocate(void *mem, size_t size) /* A checked malloc/realloc(). Yes, I know ISO C allows realloc(NULL, size). */ { mem= mem == nil ? malloc(size) : realloc(mem, size); if (mem == nil) fatal("malloc()"); return mem; } void deallocate(void *mem) /* Free a malloc()d cell. (Yes I know ISO C allows free(NULL) */ { if (mem != nil) free(mem); } char *copystr(const char *s) { char *c; c= allocate(nil, (strlen(s) + 1) * sizeof(s[0])); strcpy(c, s); return c; } int isanumber(const char *s) /* True if s can be turned into a number. */ { char *end; (void) strtol(s, &end, 0); return end != s && *end == 0; } /* "Invisible" globals. */ int asm_mode32= (sizeof(int) == 4); int err_code= EXIT_SUCCESS; int main(int argc, char **argv) { void (*parse_init)(char *file); asm86_t *(*get_instruction)(void); void (*emit_init)(char *file, const char *banner); void (*emit_instruction)(asm86_t *instr); char *lang_parse, *lang_emit, *input_file, *output_file; asm86_t *instr; char banner[80]; if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'm') { if (strcmp(argv[1], "-mi86") == 0) { set_use16(); } else if (strcmp(argv[1], "-mi386") == 0) { set_use32(); } else { fprintf(stderr, "asmconv: '%s': unknown machine\n", argv[1]+2); } argc--; argv++; } if (argc < 3 || argc > 5) { fprintf(stderr, "Usage: asmconv <input-type> <output-type> [input-file [output-file]]\n"); exit(EXIT_FAILURE); } lang_parse= argv[1]; lang_emit= argv[2]; input_file= argc < 4 ? nil : argv[3]; output_file= argc < 5 ? nil : argv[4]; /* Choose the parsing routines. */ if (strcmp(lang_parse, "ack") == 0) { /* Standard ACK. */ parse_init= ack_parse_init; get_instruction= ack_get_instruction; } else if (strcmp(lang_parse, "ncc") == 0) { /* ACK Xenix assembly, a black sheep among ACK assemblies. */ parse_init= ncc_parse_init; get_instruction= ncc_get_instruction; } else if (strcmp(lang_parse, "gnu") == 0) { /* GNU assembly. Parser by R.S. Veldema. */ parse_init= gnu_parse_init; get_instruction= gnu_get_instruction; } else if (strcmp(lang_parse, "bas") == 0) { /* Bruce Evans' assembler. */ parse_init= bas_parse_init; get_instruction= bas_get_instruction; } else { fprintf(stderr, "asmconv: '%s': unknown input language\n", lang_parse); exit(EXIT_FAILURE); } /* Choose the output language. */ if (strcmp(lang_emit, "ack") == 0) { /* Standard ACK. */ emit_init= ack_emit_init; emit_instruction= ack_emit_instruction; } else if (strcmp(lang_emit, "ncc") == 0) { /* ACK Xenix assembly, can be read by BAS and the 8086 ACK * ANSI C compiler. (Allows us to compile the Boot Monitor.) */ emit_init= ncc_emit_init; emit_instruction= ncc_emit_instruction; } else if (strcmp(lang_emit, "gnu") == 0) { /* GNU assembler. So we can assemble the ACK stuff among the * kernel sources and in the library. */ emit_init= gnu_emit_init; emit_instruction= gnu_emit_instruction; } else { fprintf(stderr, "asmconv: '%s': unknown output language\n", lang_emit); exit(EXIT_FAILURE); } sprintf(banner, "Translated from %s to %s by asmconv %s", lang_parse, lang_emit, version); (*parse_init)(input_file); (*emit_init)(output_file, banner); for (;;) { instr= (*get_instruction)(); (*emit_instruction)(instr); if (instr == nil) break; del_asm86(instr); } exit(err_code); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* asmconv.h - shared functions Author: Kees J. Bot * 19 Dec 1993 */ #define arraysize(a) (sizeof(a)/sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define between(a, c, z) \ ((unsigned)((c) - (a)) <= (unsigned)((z) - (a))) void *allocate(void *mem, size_t size); void deallocate(void *mem); void fatal(char *label); char *copystr(const char *s); int isanumber(const char *s); extern int asm_mode32; /* In 32 bit mode if true. */ #define use16() (!asm_mode32) #define use32() ((int) asm_mode32) #define set_use16() ((void) (asm_mode32= 0)) #define set_use32() ((void) (asm_mode32= 1)) extern int err_code; /* Exit code. */ #define set_error() ((void) (err_code= EXIT_FAILURE)) ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* emit_ack.c - emit ACK assembly Author: Kees J. Bot * emit NCC assembly 27 Dec 1993 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <assert.h> #include "asmconv.h" #include "token.h" #include "asm86.h" #include "languages.h" typedef struct mnemonic { /* ACK as86 mnemonics translation table. */ opcode_t opcode; char *name; } mnemonic_t; static mnemonic_t mnemtab[] = { { AAA, "aaa" }, { AAD, "aad" }, { AAM, "aam" }, { AAS, "aas" }, { ADC, "adc%" }, { ADD, "add%" }, { AND, "and%" }, { ARPL, "arpl" }, { BOUND, "bound" }, { BSF, "bsf" }, { BSR, "bsr" }, { BSWAP, "bswap" }, { BT, "bt" }, { BTC, "btc" }, { BTR, "btr" }, { BTS, "bts" }, { CALL, "call" }, { CALLF, "callf" }, { CBW, "cbw" }, { CLC, "clc" }, { CLD, "cld" }, { CLI, "cli" }, { CLTS, "clts" }, { CMC, "cmc" }, { CMP, "cmp%" }, { CMPS, "cmps%" }, { CMPXCHG, "cmpxchg" }, { CWD, "cwd" }, { DAA, "daa" }, { DAS, "das" }, { DEC, "dec%" }, { DIV, "div%" }, { DOT_ALIGN, ".align" }, { DOT_ASCII, ".ascii" }, { DOT_ASCIZ, ".asciz" }, { DOT_ASSERT, ".assert" }, { DOT_BASE, ".base" }, { DOT_BSS, ".sect .bss" }, { DOT_COMM, ".comm" }, { DOT_DATA, ".sect .data" }, { DOT_DATA1, ".data1" }, { DOT_DATA2, ".data2" }, { DOT_DATA4, ".data4" }, { DOT_DEFINE, ".define" }, { DOT_END, ".sect .end" }, { DOT_EXTERN, ".extern" }, { DOT_FILE, ".file" }, { DOT_LCOMM, ".comm" }, { DOT_LINE, ".line" }, { DOT_LIST, ".list" }, { DOT_NOLIST, ".nolist" }, { DOT_ROM, ".sect .rom" }, { DOT_SPACE, ".space" }, { DOT_SYMB, ".symb" }, { DOT_TEXT, ".sect .text" }, { DOT_USE16, ".use16" }, { DOT_USE32, ".use32" }, { ENTER, "enter" }, { F2XM1, "f2xm1" }, { FABS, "fabs" }, { FADD, "fadd" }, { FADDD, "faddd" }, { FADDP, "faddp" }, { FADDS, "fadds" }, { FBLD, "fbld" }, { FBSTP, "fbstp" }, { FCHS, "fchs" }, { FCLEX, "fclex" }, { FCOMD, "fcomd" }, { FCOMPD, "fcompd" }, { FCOMPP, "fcompp" }, { FCOMPS, "fcomps" }, { FCOMS, "fcoms" }, { FCOS, "fcos" }, { FDECSTP, "fdecstp" }, { FDIVD, "fdivd" }, { FDIVP, "fdivp" }, { FDIVRD, "fdivrd" }, { FDIVRP, "fdivrp" }, { FDIVRS, "fdivrs" }, { FDIVS, "fdivs" }, { FFREE, "ffree" }, { FIADDL, "fiaddl" }, { FIADDS, "fiadds" }, { FICOM, "ficom" }, { FICOMP, "ficomp" }, { FIDIVL, "fidivl" }, { FIDIVRL, "fidivrl" }, { FIDIVRS, "fidivrs" }, { FIDIVS, "fidivs" }, { FILDL, "fildl" }, { FILDQ, "fildq" }, { FILDS, "filds" }, { FIMULL, "fimull" }, { FIMULS, "fimuls" }, { FINCSTP, "fincstp" }, { FINIT, "finit" }, { FISTL, "fistl" }, { FISTP, "fistp" }, { FISTS, "fists" }, { FISUBL, "fisubl" }, { FISUBRL, "fisubrl" }, { FISUBRS, "fisubrs" }, { FISUBS, "fisubs" }, { FLD1, "fld1" }, { FLDCW, "fldcw" }, { FLDD, "fldd" }, { FLDENV, "fldenv" }, { FLDL2E, "fldl2e" }, { FLDL2T, "fldl2t" }, { FLDLG2, "fldlg2" }, { FLDLN2, "fldln2" }, { FLDPI, "fldpi" }, { FLDS, "flds" }, { FLDX, "fldx" }, { FLDZ, "fldz" }, { FMULD, "fmuld" }, { FMULP, "fmulp" }, { FMULS, "fmuls" }, { FNOP, "fnop" }, { FPATAN, "fpatan" }, { FPREM, "fprem" }, { FPREM1, "fprem1" }, { FPTAN, "fptan" }, { FRNDINT, "frndint" }, { FRSTOR, "frstor" }, { FSAVE, "fsave" }, { FSCALE, "fscale" }, { FSIN, "fsin" }, { FSINCOS, "fsincos" }, { FSQRT, "fsqrt" }, { FSTCW, "fstcw" }, { FSTD, "fstd" }, { FSTENV, "fstenv" }, { FSTPD, "fstpd" }, { FSTPS, "fstps" }, { FSTPX, "fstpx" }, { FSTS, "fsts" }, { FSTSW, "fstsw" }, { FSUBD, "fsubd" }, { FSUBP, "fsubp" }, { FSUBPR, "fsubpr" }, { FSUBRD, "fsubrd" }, { FSUBRS, "fsubrs" }, { FSUBS, "fsubs" }, { FTST, "ftst" }, { FUCOM, "fucom" }, { FUCOMP, "fucomp" }, { FUCOMPP, "fucompp" }, { FXAM, "fxam" }, { FXCH, "fxch" }, { FXTRACT, "fxtract" }, { FYL2X, "fyl2x" }, { FYL2XP1, "fyl2xp1" }, { HLT, "hlt" }, { IDIV, "idiv%" }, { IMUL, "imul%" }, { IN, "in%" }, { INC, "inc%" }, { INS, "ins%" }, { INT, "int" }, { INTO, "into" }, { INVD, "invd" }, { INVLPG, "invlpg" }, { IRET, "iret" }, { IRETD, "iretd" }, { JA, "ja" }, { JAE, "jae" }, { JB, "jb" }, { JBE, "jbe" }, { JCXZ, "jcxz" }, { JE, "je" }, { JG, "jg" }, { JGE, "jge" }, { JL, "jl" }, { JLE, "jle" }, { JMP, "jmp" }, { JMPF, "jmpf" }, { JNE, "jne" }, { JNO, "jno" }, { JNP, "jnp" }, { JNS, "jns" }, { JO, "jo" }, { JP, "jp" }, { JS, "js" }, { LAHF, "lahf" }, { LAR, "lar" }, { LDS, "lds" }, { LEA, "lea" }, { LEAVE, "leave" }, { LES, "les" }, { LFS, "lfs" }, { LGDT, "lgdt" }, { LGS, "lgs" }, { LIDT, "lidt" }, { LLDT, "lldt" }, { LMSW, "lmsw" }, { LOCK, "lock" }, { LODS, "lods%" }, { LOOP, "loop" }, { LOOPE, "loope" }, { LOOPNE, "loopne" }, { LSL, "lsl" }, { LSS, "lss" }, { LTR, "ltr" }, { MOV, "mov%" }, { MOVS, "movs%" }, { MOVSX, "movsx" }, { MOVSXB, "movsxb" }, { MOVZX, "movzx" }, { MOVZXB, "movzxb" }, { MUL, "mul%" }, { NEG, "neg%" }, { NOP, "nop" }, { NOT, "not%" }, { OR, "or%" }, { OUT, "out%" }, { OUTS, "outs%" }, { POP, "pop" }, { POPA, "popa" }, { POPF, "popf" }, { PUSH, "push" }, { PUSHA, "pusha" }, { PUSHF, "pushf" }, { RCL, "rcl%" }, { RCR, "rcr%" }, { RET, "ret" }, { RETF, "retf" }, { ROL, "rol%" }, { ROR, "ror%" }, { SAHF, "sahf" }, { SAL, "sal%" }, { SAR, "sar%" }, { SBB, "sbb%" }, { SCAS, "scas%" }, { SETA, "seta" }, { SETAE, "setae" }, { SETB, "setb" }, { SETBE, "setbe" }, { SETE, "sete" }, { SETG, "setg" }, { SETGE, "setge" }, { SETL, "setl" }, { SETLE, "setle" }, { SETNE, "setne" }, { SETNO, "setno" }, { SETNP, "setnp" }, { SETNS, "setns" }, { SETO, "seto" }, { SETP, "setp" }, { SETS, "sets" }, { SGDT, "sgdt" }, { SHL, "shl%" }, { SHLD, "shld" }, { SHR, "shr%" }, { SHRD, "shrd" }, { SIDT, "sidt" }, { SLDT, "sldt" }, { SMSW, "smsw" }, { STC, "stc" }, { STD, "std" }, { STI, "sti" }, { STOS, "stos%" }, { STR, "str" }, { SUB, "sub%" }, { TEST, "test%" }, { VERR, "verr" }, { VERW, "verw" }, { WAIT, "wait" }, { WBINVD, "wbinvd" }, { XADD, "xadd" }, { XCHG, "xchg%" }, { XLAT, "xlat" }, { XOR, "xor%" }, }; #define farjmp(o) ((o) == JMPF || (o) == CALLF) static FILE *ef; static long eline= 1; static char *efile; static char *orig_efile; static char *opcode2name_tab[N_OPCODES]; static enum dialect { ACK, NCC } dialect= ACK; static void ack_putchar(int c) /* LOOK, this programmer checks the return code of putc! What an idiot, noone * does that! */ { if (putc(c, ef) == EOF) fatal(orig_efile); } static void ack_printf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (vfprintf(ef, fmt, ap) == EOF) fatal(orig_efile); va_end(ap); } void ack_emit_init(char *file, const char *banner) /* Prepare producing an ACK assembly file. */ { mnemonic_t *mp; if (file == nil) { file= "stdout"; ef= stdout; } else { if ((ef= fopen(file, "w")) == nil) fatal(file); } orig_efile= file; efile= file; ack_printf("! %s", banner); if (dialect == ACK) { /* Declare the four sections used under Minix. */ ack_printf( "\n.sect .text; .sect .rom; .sect .data; .sect .bss\n.sect .text"); } /* Initialize the opcode to mnemonic translation table. */ for (mp= mnemtab; mp < arraylimit(mnemtab); mp++) { assert(opcode2name_tab[mp->opcode] == nil); opcode2name_tab[mp->opcode]= mp->name; } } #define opcode2name(op) (opcode2name_tab[op] + 0) static void ack_put_string(const char *s, size_t n) /* Emit a string with weird characters quoted. */ { while (n > 0) { int c= *s; if (c < ' ' || c > 0177) { ack_printf("\\%03o", c & 0xFF); } else if (c == '"' || c == '\\') { ack_printf("\\%c", c); } else { ack_putchar(c); } s++; n--; } } static void ack_put_expression(asm86_t *a, expression_t *e, int deref) /* Send an expression, i.e. instruction operands, to the output file. Deref * is true when the rewrite for the ncc dialect may be made. */ { assert(e != nil);D��D��D��D��D��D��D�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� switch (e->operator) { case ',': if (dialect == NCC && farjmp(a->opcode)) { /* ACK jmpf seg:off -> NCC jmpf off,seg */ ack_put_expression(a, e->right, deref); ack_printf(", "); ack_put_expression(a, e->left, deref); } else { ack_put_expression(a, e->left, deref); ack_printf(farjmp(a->opcode) ? ":" : ", "); ack_put_expression(a, e->right, deref); } break; case 'O': if (deref && a->optype == JUMP) ack_putchar('@'); if (e->left != nil) ack_put_expression(a, e->left, 0); if (e->middle != nil) ack_put_expression(a, e->middle, 0); if (e->right != nil) ack_put_expression(a, e->right, 0); break; case '(': if (deref && a->optype == JUMP) ack_putchar('@'); if (!deref) ack_putchar('('); ack_put_expression(a, e->middle, 0); if (!deref) ack_putchar(')'); break; case 'B': ack_printf("(%s)", e->name); break; case '1': case '2': case '4': case '8': ack_printf((use16() && e->operator == '1') ? "(%s)" : "(%s*%c)", e->name, e->operator); break; case '+': case '-': case '~': if (e->middle != nil) { if (deref && a->optype != JUMP) ack_putchar('#'); ack_putchar(e->operator); ack_put_expression(a, e->middle, 0); break; } /*FALL THROUGH*/ case '*': case '/': case '%': case '&': case '|': case '^': case S_LEFTSHIFT: case S_RIGHTSHIFT: if (deref && a->optype != JUMP) ack_putchar('#'); ack_put_expression(a, e->left, 0); if (e->operator == S_LEFTSHIFT) { ack_printf("<<"); } else if (e->operator == S_RIGHTSHIFT) { ack_printf(">>"); } else { ack_putchar(e->operator); } ack_put_expression(a, e->right, 0); break; case '[': if (deref && a->optype != JUMP) ack_putchar('#'); ack_putchar('['); ack_put_expression(a, e->middle, 0); ack_putchar(']'); break; case 'W': if (deref && a->optype == JUMP && isregister(e->name)) { ack_printf("(%s)", e->name); break; } if (deref && a->optype != JUMP && !isregister(e->name)) { ack_putchar('#'); } ack_printf("%s", e->name); break; case 'S': ack_putchar('"'); ack_put_string(e->name, e->len); ack_putchar('"'); break; default: fprintf(stderr, "asmconv: internal error, unknown expression operator '%d'\n", e->operator); exit(EXIT_FAILURE); } } void ack_emit_instruction(asm86_t *a) /* Output one instruction and its operands. */ { int same= 0; char *p; static int high_seg; int deref; if (a == nil) { /* Last call */ ack_putchar('\n'); return; } /* Make sure the line number of the line to be emitted is ok. */ if ((a->file != efile && strcmp(a->file, efile) != 0) || a->line < eline || a->line > eline+10) { ack_putchar('\n'); ack_printf("# %ld \"%s\"\n", a->line, a->file); efile= a->file; eline= a->line; } else { if (a->line == eline) { ack_printf("; "); same= 1; } while (eline < a->line) { ack_putchar('\n'); eline++; } } if (a->opcode == DOT_LABEL) { assert(a->args->operator == ':'); ack_printf("%s:", a->args->name); } else if (a->opcode == DOT_EQU) { assert(a->args->operator == '='); ack_printf("\t%s = ", a->args->name); ack_put_expression(a, a->args->middle, 0); } else if ((p= opcode2name(a->opcode)) != nil) { char *sep= dialect == ACK ? "" : ";"; if (!is_pseudo(a->opcode) && !same) ack_putchar('\t'); switch (a->rep) { case ONCE: break; case REP: ack_printf("rep"); break; case REPE: ack_printf("repe"); break; case REPNE: ack_printf("repne"); break; default: assert(0); } if (a->rep != ONCE) { ack_printf(dialect == ACK ? " " : "; "); } switch (a->seg) { case DEFSEG: break; case CSEG: ack_printf("cseg"); break; case DSEG: ack_printf("dseg"); break; case ESEG: ack_printf("eseg"); break; case FSEG: ack_printf("fseg"); break; case GSEG: ack_printf("gseg"); break; case SSEG: ack_printf("sseg"); break; default: assert(0); } if (a->seg != DEFSEG) { ack_printf(dialect == ACK ? " " : "; "); } if (a->oaz & OPZ) ack_printf(use16() ? "o32 " : "o16 "); if (a->oaz & ADZ) ack_printf(use16() ? "a32 " : "a16 "); if (a->opcode == CBW) { p= !(a->oaz & OPZ) == use16() ? "cbw" : "cwde"; } if (a->opcode == CWD) { p= !(a->oaz & OPZ) == use16() ? "cwd" : "cdq"; } if (a->opcode == DOT_COMM && a->args != nil && a->args->operator == ',' && a->args->left->operator == 'W' ) { ack_printf(".define\t%s; ", a->args->left->name); } while (*p != 0) { if (*p == '%') { if (a->optype == BYTE) ack_putchar('b'); } else { ack_putchar(*p); } p++; } if (a->args != nil) { ack_putchar('\t'); switch (a->opcode) { case IN: case OUT: case INT: deref= 0; break; default: deref= (dialect == NCC && a->optype != PSEUDO); } ack_put_expression(a, a->args, deref); } if (a->opcode == DOT_USE16) set_use16(); if (a->opcode == DOT_USE32) set_use32(); } else { fprintf(stderr, "asmconv: internal error, unknown opcode '%d'\n", a->opcode); exit(EXIT_FAILURE); } } /* A few ncc mnemonics are different. */ static mnemonic_t ncc_mnemtab[] = { { DOT_BSS, ".bss" }, { DOT_DATA, ".data" }, { DOT_END, ".end" }, { DOT_ROM, ".rom" }, { DOT_TEXT, ".text" }, }; void ncc_emit_init(char *file, const char *banner) /* The assembly produced by the Minix ACK ANSI C compiler for the 8086 is * different from the normal ACK assembly, and different from the old K&R * assembler. This brings us endless joy. (It was supposed to make * translation of the assembly used by the old K&R assembler easier by * not deviating too much from that dialect.) */ { mnemonic_t *mp; dialect= NCC; ack_emit_init(file, banner); /* Replace a few mnemonics. */ for (mp= ncc_mnemtab; mp < arraylimit(ncc_mnemtab); mp++) { opcode2name_tab[mp->opcode]= mp->name; } } void ncc_emit_instruction(asm86_t *a) { ack_emit_instruction(a); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* emit_gnu.c - emit GNU assembly Author: Kees J. Bot * 28 Dec 1993 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <assert.h> #include "asmconv.h" #include "token.h" #include "asm86.h" #include "languages.h" typedef struct mnemonic { /* GNU as386 mnemonics translation table. */ opcode_t opcode; char *name; } mnemonic_t; static mnemonic_t mnemtab[] = { { AAA, "aaa" }, { AAD, "aad" }, { AAM, "aam" }, { AAS, "aas" }, { ADC, "adc%" }, { ADD, "add%" }, { AND, "and%" }, { ARPL, "arpl" }, { BOUND, "bound%" }, { BSF, "bsf%" }, { BSR, "bsr%" }, { BSWAP, "bswap" }, { BT, "bt%" }, { BTC, "btc%" }, { BTR, "btr%" }, { BTS, "bts%" }, { CALL, "call" }, { CALLF, "lcall" }, { CBW, "cbtw" }, { CLC, "clc" }, { CLD, "cld" }, { CLI, "cli" }, { CLTS, "clts" }, { CMC, "cmc" }, { CMP, "cmp%" }, { CMPS, "cmps%" }, { CMPXCHG, "cmpxchg" }, { CWD, "cwtd" }, { DAA, "daa" }, { DAS, "das" }, { DEC, "dec%" }, { DIV, "div%" }, { DOT_ALIGN, ".align" }, { DOT_ASCII, ".ascii" }, { DOT_ASCIZ, ".asciz" }, { DOT_ASSERT, ".assert" }, { DOT_BASE, ".base" }, { DOT_BSS, ".bss" }, { DOT_COMM, ".comm" }, { DOT_DATA, ".data" }, { DOT_DATA1, ".byte" }, { DOT_DATA2, ".short" }, { DOT_DATA4, ".long" }, { DOT_DEFINE, ".globl" }, { DOT_EXTERN, ".globl" }, { DOT_FILE, ".file" }, { DOT_LCOMM, ".lcomm" }, { DOT_LINE, ".line" }, { DOT_LIST, ".list" }, { DOT_NOLIST, ".nolist" }, { DOT_ROM, ".data" }, /* Minix -- separate I&D. */ { DOT_SPACE, ".space" }, { DOT_SYMB, ".symb" }, { DOT_TEXT, ".text" }, { DOT_USE16, ".use16" }, { DOT_USE32, ".use32" }, { ENTER, "enter" }, { F2XM1, "f2xm1" }, { FABS, "fabs" }, { FADD, "fadd" }, { FADDD, "faddl" }, { FADDP, "faddp" }, { FADDS, "fadds" }, { FBLD, "fbld" }, { FBSTP, "fbstp" }, { FCHS, "fchs" }, { FCLEX, "fnclex" }, { FCOMD, "fcoml" }, { FCOMPD, "fcompl" }, { FCOMPP, "fcompp" }, { FCOMPS, "fcomps" }, { FCOMS, "fcoms" }, { FCOS, "fcos" }, { FDECSTP, "fdecstp" }, { FDIVD, "fdivl" }, { FDIVP, "fdivp" }, { FDIVRD, "fdivrl" }, { FDIVRP, "fdivrp" }, { FDIVRS, "fdivrs" }, { FDIVS, "fdivs" }, { FFREE, "ffree" }, { FIADDL, "fiaddl" }, { FIADDS, "fiadds" }, { FICOM, "ficom" }, { FICOMP, "ficomp" }, { FIDIVL, "fidivl" }, { FIDIVRL, "fidivrl" }, { FIDIVRS, "fidivrs" }, { FIDIVS, "fidivs" }, { FILDL, "fildl" }, { FILDQ, "fildq" }, { FILDS, "filds" }, { FIMULL, "fimull" }, { FIMULS, "fimuls" }, { FINCSTP, "fincstp" }, { FINIT, "fninit" }, { FISTL, "fistl" }, { FISTP, "fistp" }, { FISTS, "fists" }, { FISUBL, "fisubl" }, { FISUBRL, "fisubrl" }, { FISUBRS, "fisubrs" }, { FISUBS, "fisubs" }, { FLD1, "fld1" }, { FLDCW, "fldcw" }, { FLDD, "fldl" }, { FLDENV, "fldenv" }, { FLDL2E, "fldl2e" }, { FLDL2T, "fldl2t" }, { FLDLG2, "fldlg2" }, { FLDLN2, "fldln2" }, { FLDPI, "fldpi" }, { FLDS, "flds" }, { FLDX, "fldt" }, { FLDZ, "fldz" }, { FMULD, "fmull" }, { FMULP, "fmulp" }, { FMULS, "fmuls" }, { FNOP, "fnop" }, { FPATAN, "fpatan" }, { FPREM, "fprem" }, { FPREM1, "fprem1" }, { FPTAN, "fptan" }, { FRNDINT, "frndint" }, { FRSTOR, "frstor" }, { FSAVE, "fnsave" }, { FSCALE, "fscale" }, { FSIN, "fsin" }, { FSINCOS, "fsincos" }, { FSQRT, "fsqrt" }, { FSTCW, "fnstcw" }, { FSTD, "fstl" }, { FSTENV, "fnstenv" }, { FSTPD, "fstpl" }, { FSTPS, "fstps" }, { FSTPX, "fstpt" }, { FSTS, "fsts" }, { FSTSW, "fstsw" }, { FSUBD, "fsubl" }, { FSUBP, "fsubp" }, { FSUBPR, "fsubpr" }, { FSUBRD, "fsubrl" }, { FSUBRS, "fsubrs" }, { FSUBS, "fsubs" }, { FTST, "ftst" }, { FUCOM, "fucom" }, { FUCOMP, "fucomp" }, { FUCOMPP, "fucompp" }, { FXAM, "fxam" }, { FXCH, "fxch" }, { FXTRACT, "fxtract" }, { FYL2X, "fyl2x" }, { FYL2XP1, "fyl2xp1" }, { HLT, "hlt" }, { IDIV, "idiv%" }, { IMUL, "imul%" }, { IN, "in%" }, { INC, "inc%" }, { INS, "ins%" }, { INT, "int" }, { INTO, "into" }, { INVD, "invd" }, { INVLPG, "invlpg" }, { IRET, "iret" }, { IRETD, "iret" }, { JA, "ja" }, { JAE, "jae" }, { JB, "jb" }, { JBE, "jbe" }, { JCXZ, "jcxz" }, { JE, "je" }, { JG, "jg" }, { JGE, "jge" }, { JL, "jl" }, { JLE, "jle" }, { JMP, "jmp" }, { JMPF, "ljmp" }, { JNE, "jne" }, { JNO, "jno" }, { JNP, "jnp" }, { JNS, "jns" }, { JO, "jo" }, { JP, "jp" }, { JS, "js" }, { LAHF, "lahf" }, { LAR, "lar" }, { LDS, "lds" }, { LEA, "lea%" }, { LEAVE, "leave" }, { LES, "les" }, { LFS, "lfs" }, { LGDT, "lgdt" }, { LGS, "lgs" }, { LIDT, "lidt" }, { LLDT, "lldt" }, { LMSW, "lmsw" }, { LOCK, "lock" }, { LODS, "lods%" }, { LOOP, "loop" }, { LOOPE, "loope" }, { LOOPNE, "loopne" }, { LSL, "lsl" }, { LSS, "lss" }, { LTR, "ltr" }, { MOV, "mov%" }, { MOVS, "movs%" }, { MOVSX, "movswl" }, { MOVSXB, "movsb%" }, { MOVZX, "movzwl" }, { MOVZXB, "movzb%" }, { MUL, "mul%" }, { NEG, "neg%" }, { NOP, "nop" }, { NOT, "not%" }, { OR, "or%" }, { OUT, "out%" }, { OUTS, "outs%" }, { POP, "pop%" }, { POPA, "popa%" }, { POPF, "popf%" }, { PUSH, "push%" }, { PUSHA, "pusha%" }, { PUSHF, "pushf%" }, { RCL, "rcl%" }, { RCR, "rcr%" }, { RET, "ret" }, { RETF, "lret" }, { ROL, "rol%" }, { ROR, "ror%" }, { SAHF, "sahf" }, { SAL, "sal%" }, { SAR, "sar%" }, { SBB, "sbb%" }, { SCAS, "scas%" }, { SETA, "setab" }, { SETAE, "setaeb" }, { SETB, "setbb" }, { SETBE, "setbeb" }, { SETE, "seteb" }, { SETG, "setgb" }, { SETGE, "setgeb" }, { SETL, "setlb" }, { SETLE, "setleb" }, { SETNE, "setneb" }, { SETNO, "setnob" }, { SETNP, "setnpb" }, { SETNS, "setnsb" }, { SETO, "setob" }, { SETP, "setpb" }, { SETS, "setsb" }, { SGDT, "sgdt" }, { SHL, "shl%" }, { SHLD, "shld%" }, { SHR, "shr%" }, { SHRD, "shrd%" }, { SIDT, "sidt" }, { SLDT, "sldt" }, { SMSW, "smsw" }, { STC, "stc" }, { STD, "std" }, { STI, "sti" }, { STOS, "stos%" }, { STR, "str" }, { SUB, "sub%" }, { TEST, "test%" }, { VERR, "verr" }, { VERW, "verw" }, { WAIT, "wait" }, { WBINVD, "wbinvd" }, { XADD, "xadd" }, { XCHG, "xchg%" }, { XLAT, "xlat" }, { XOR, "xor%" }, }; static FILE *ef; static long eline= 1; static char *efile; static char *orig_efile; static char *opcode2name_tab[N_OPCODES]; static void gnu_putchar(int c) /* LOOK, this programmer checks the return code of putc! What an idiot, noone * does that! */ { if (putc(c, ef) == EOF) fatal(orig_efile); } static void gnu_printf(const char *fmt, ...) { va_list ap; va_start(ap, fmt); if (vfprintf(ef, fmt, ap) == EOF) fatal(orig_efile); va_end(ap); } void gnu_emit_init(char *file, const char *banner) /* Prepare producing a GNU assembly file. */ { mnemonic_t *mp; if (file == nil) { file= "stdout"; ef= stdout; } else { if ((ef= fopen(file, "w")) == nil) fatal(file); } orig_efile= file; efile= file; gnu_printf("/ %s", banner); /* Initialize the opcode to mnemonic translation table. */ for (mp= mnemtab; mp < arraylimit(mnemtab); mp++) { assert(opcode2name_tab[mp->opcode] == nil); opcode2name_tab[mp->opcode]= mp->name; } } #define opcode2name(op) (opcode2name_tab[op] + 0) static void gnu_put_string(const char *s, size_t n) /* Emit a string with weird characters quoted. */ { while (n > 0) { int c= *s; if (c < ' ' || c > 0177) { gnu_printf("\\%03o", c); } else if (c == '"' || c == '\\') { gnu_printf("\\%c", c & 0xFF); } else { gnu_putchar(c); } s++; n--; } } static void gnu_put_expression(asm86_t *a, expression_t *e, int deref) /* Send an expression, i.e. instruction operands, to the output file. Deref * is true when the rewrite of "x" -> "#x" or "(x)" -> "x" may be made. */ { assert(e != nil); switch (e->operator) { case ',': if (is_pseudo(a->opcode)) { /* Pseudo's are normal. */ gnu_put_expression(a, e->left, deref); gnu_printf(", "); gnu_put_expression(a, e->right, deref); } else { /* He who invented GNU assembly has seen one VE��E��E��E��E�� E�� E�� E�� E������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������AX too * many, operands are given in the wrong order. This * makes coding from an Intel databook a real delight. * A good thing this program allows us to write the * more normal ACK assembly. */ gnu_put_expression(a, e->right, deref); gnu_printf(", "); gnu_put_expression(a, e->left, deref); } break; case 'O': if (deref && a->optype == JUMP) gnu_putchar('*'); if (e->left != nil) gnu_put_expression(a, e->left, 0); gnu_putchar('('); if (e->middle != nil) gnu_put_expression(a, e->middle, 0); if (e->right != nil) { gnu_putchar(','); gnu_put_expression(a, e->right, 0); } gnu_putchar(')'); break; case '(': if (!deref) gnu_putchar('('); if (deref && a->optype == JUMP) gnu_putchar('*'); gnu_put_expression(a, e->middle, 0); if (!deref) gnu_putchar(')'); break; case 'B': gnu_printf("%%%s", e->name); break; case '1': case '2': case '4': case '8': gnu_printf("%%%s,%c", e->name, e->operator); break; case '+': case '-': case '~': if (e->middle != nil) { if (deref && a->optype >= BYTE) gnu_putchar('$'); gnu_putchar(e->operator); gnu_put_expression(a, e->middle, 0); break; } /*FALL THROUGH*/ case '*': case '/': case '%': case '&': case '|': case '^': case S_LEFTSHIFT: case S_RIGHTSHIFT: if (deref && a->optype >= BYTE) gnu_putchar('$'); gnu_put_expression(a, e->left, 0); if (e->operator == S_LEFTSHIFT) { gnu_printf("<<"); } else if (e->operator == S_RIGHTSHIFT) { gnu_printf(">>"); } else { gnu_putchar(e->operator); } gnu_put_expression(a, e->right, 0); break; case '[': if (deref && a->optype >= BYTE) gnu_putchar('$'); gnu_putchar('('); gnu_put_expression(a, e->middle, 0); gnu_putchar(')'); break; case 'W': if (isregister(e->name)) { if (a->optype == JUMP) gnu_putchar('*'); gnu_printf("%%%s", e->name); } else { if (deref && a->optype >= BYTE) gnu_putchar('$'); gnu_printf("%s", e->name); } break; case 'S': gnu_putchar('"'); gnu_put_string(e->name, e->len); gnu_putchar('"'); break; default: fprintf(stderr, "asmconv: internal error, unknown expression operator '%d'\n", e->operator); exit(EXIT_FAILURE); } } void gnu_emit_instruction(asm86_t *a) /* Output one instruction and its operands. */ { int same= 0; char *p; if (a == nil) { /* Last call */ gnu_putchar('\n'); return; } if (use16()) { fprintf(stderr, "asmconv: the GNU assembler can't translate 8086 code\n"); exit(EXIT_FAILURE); } /* Make sure the line number of the line to be emitted is ok. */ if ((a->file != efile && strcmp(a->file, efile) != 0) || a->line < eline || a->line > eline+10) { gnu_putchar('\n'); gnu_printf("# %ld \"%s\"\n", a->line, a->file); efile= a->file; eline= a->line; } else { if (a->line == eline) { gnu_printf("; "); same= 1; } while (eline < a->line) { gnu_putchar('\n'); eline++; } } if (a->opcode == DOT_LABEL) { assert(a->args->operator == ':'); gnu_printf("%s:", a->args->name); } else if (a->opcode == DOT_EQU) { assert(a->args->operator == '='); gnu_printf("\t%s = ", a->args->name); gnu_put_expression(a, a->args->middle, 0); } else if (a->opcode == DOT_ALIGN) { /* GNU .align thinks in powers of two. */ unsigned long n; unsigned s; assert(a->args->operator == 'W' && isanumber(a->args->name)); n= strtoul(a->args->name, nil, 0); for (s= 0; s <= 4 && (1 << s) < n; s++) {} gnu_printf(".align\t%u", s); } else if ((p= opcode2name(a->opcode)) != nil) { if (!is_pseudo(a->opcode) && !same) gnu_putchar('\t'); switch (a->rep) { case ONCE: break; case REP: gnu_printf("rep; "); break; case REPE: gnu_printf("repe; "); break; case REPNE: gnu_printf("repne; "); break; default: assert(0); } switch (a->seg) { /* Kludge to avoid knowing where to put the "%es:" */ case DEFSEG: break; case CSEG: gnu_printf(".byte 0x2e; "); break; case DSEG: gnu_printf(".byte 0x3e; "); break; case ESEG: gnu_printf(".byte 0x26; "); break; case FSEG: gnu_printf(".byte 0x64; "); break; case GSEG: gnu_printf(".byte 0x65; "); break; case SSEG: gnu_printf(".byte 0x36; "); break; default: assert(0); } /* Exceptions, exceptions... */ if (a->opcode == CBW) { if (!(a->oaz & OPZ)) p= "cwtl"; a->oaz&= ~OPZ; } if (a->opcode == CWD) { if (!(a->oaz & OPZ)) p= "cltd"; a->oaz&= ~OPZ; } if (a->opcode == RET || a->opcode == RETF) { /* Argument of RET needs a '$'. */ a->optype= WORD; } if (a->opcode == MUL && a->args != nil && a->args->operator == ',') { /* Two operand MUL is an IMUL? */ p="imul%"; } /* GAS doesn't understand the interesting combinations. */ if (a->oaz & ADZ) gnu_printf(".byte 0x67; "); if (a->oaz & OPZ && strchr(p, '%') == nil) gnu_printf(".byte 0x66; "); /* Unsupported instructions that Minix code needs. */ if (a->opcode == JMPF && a->args != nil && a->args->operator == ',') { /* JMPF seg:off. */ gnu_printf(".byte 0xEA; .long "); gnu_put_expression(a, a->args->right, 0); gnu_printf("; .short "); gnu_put_expression(a, a->args->left, 0); return; } if (a->opcode == JMPF && a->args != nil && a->args->operator == 'O' && a->args->left != nil && a->args->right == nil && a->args->middle != nil && a->args->middle->operator == 'B' && strcmp(a->args->middle->name, "esp") == 0 ) { /* JMPF offset(ESP). */ gnu_printf(".byte 0xFF,0x6C,0x24,"); gnu_put_expression(a, a->args->left, 0); return; } if (a->opcode == MOV && a->args != nil && a->args->operator == ',' && a->args->left != nil && a->args->left->operator == 'W' && (strcmp(a->args->left->name, "ds") == 0 || strcmp(a->args->left->name, "es") == 0) && a->args->right->operator == 'O' && a->args->right->left != nil && a->args->right->right == nil && a->args->right->middle != nil && a->args->right->middle->operator == 'B' && strcmp(a->args->right->middle->name, "esp") == 0 ) { /* MOV DS, offset(ESP); MOV ES, offset(ESP) */ gnu_printf(".byte 0x8E,0x%02X,0x24,", a->args->left->name[0] == 'd' ? 0x5C : 0x44); gnu_put_expression(a, a->args->right->left, 0); return; } if (a->opcode == MOV && a->args != nil && a->args->operator == ',' && a->args->left != nil && a->args->left->operator == 'W' && (strcmp(a->args->left->name, "ds") == 0 || strcmp(a->args->left->name, "es") == 0) && a->args->right->operator == '(' && a->args->right->middle != nil ) { /* MOV DS, (memory); MOV ES, (memory) */ gnu_printf(".byte 0x8E,0x%02X; .long ", a->args->left->name[0] == 'd' ? 0x1D : 0x05); gnu_put_expression(a, a->args->right->middle, 0); return; } while (*p != 0) { if (*p == '%') { if (a->optype == BYTE) { gnu_putchar('b'); } else if (a->optype == WORD) { gnu_putchar((a->oaz & OPZ) ? 'w' : 'l'); } else { assert(0); } } else { gnu_putchar(*p); } p++; } if (a->args != nil) { static char *aregs[] = { "al", "ax", "eax" }; gnu_putchar('\t'); switch (a->opcode) { case IN: gnu_put_expression(a, a->args, 1); gnu_printf(", %%%s", aregs[a->optype - BYTE]); break; case OUT: gnu_printf("%%%s, ", aregs[a->optype - BYTE]); gnu_put_expression(a, a->args, 1); break; default: gnu_put_expression(a, a->args, 1); } } if (a->opcode == DOT_USE16) set_use16(); if (a->opcode == DOT_USE32) set_use32(); } else { fprintf(stderr, "asmconv: internal error, unknown opcode '%d'\n", a->opcode); exit(EXIT_FAILURE); } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* languages.h - functions that parse or emit assembly * Author: Kees J. Bot * 27 Dec 1993 */ void ack_parse_init(char *file); asm86_t *ack_get_instruction(void); void ncc_parse_init(char *file); asm86_t *ncc_get_instruction(void); void gnu_parse_init(char *file); asm86_t *gnu_get_instruction(void); void bas_parse_init(char *file); asm86_t *bas_get_instruction(void); void ack_emit_init(char *file, const char *banner); void ack_emit_instruction(asm86_t *instr); void ncc_emit_init(char *file, const char *banner); void ncc_emit_instruction(asm86_t *instr); void gnu_emit_init(char *file, const char *banner); void gnu_emit_instruction(asm86_t *instr); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* parse_ack.c - parse ACK assembly Author: Kees J. Bot * parse NCC assembly 18 Dec 1993 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "asmconv.h" #include "token.h" #include "asm86.h" #include "languages.h" typedef struct mnemonic { /* ACK as86 mnemonics translation table. */ char *name; opcode_t opcode; optype_t optype; } mnemonic_t; static mnemonic_t mnemtab[] = { /* This array is sorted. */ { ".align", DOT_ALIGN, PSEUDO }, { ".ascii", DOT_ASCII, PSEUDO }, { ".asciz", DOT_ASCIZ, PSEUDO }, { ".assert", DOT_ASSERT, PSEUDO }, { ".base", DOT_BASE, PSEUDO }, { ".bss", DOT_BSS, PSEUDO }, { ".comm", DOT_LCOMM, PSEUDO }, { ".data", DOT_DATA, PSEUDO }, { ".data1", DOT_DATA1, PSEUDO }, { ".data2", DOT_DATA2, PSEUDO }, { ".data4", DOT_DATA4, PSEUDO }, { ".define", DOT_DEFINE, PSEUDO }, { ".end", DOT_END, PSEUDO }, { ".extern", DOT_EXTERN, PSEUDO }, { ".file", DOT_FILE, PSEUDO }, { ".line", DOT_LINE, PSEUDO }, { ".list", DOT_LIST, PSEUDO }, { ".nolist", DOT_NOLIST, PSEUDO }, { ".rom", DOT_ROM, PSEUDO }, { ".space", DOT_SPACE, PSEUDO }, { ".symb", DOT_SYMB, PSEUDO }, { ".text", DOT_TEXT, PSEUDO }, { ".use16", DOT_USE16, PSEUDO }, { ".use32", DOT_USE32, PSEUDO }, { "aaa", AAA, WORD }, { "aad", AAD, WORD }, { "aam", AAM, WORD }, { "aas", AAS, WORD }, { "adc", ADC, WORD }, { "adcb", ADC, BYTE }, { "add", ADD, WORD }, { "addb", ADD, BYTE }, { "and", AND, WORD }, { "andb", AND, BYTE }, { "arpl", ARPL, WORD }, { "bound", BOUND, WORD }, { "bsf", BSF, WORD }, { "bsr", BSR, WORD }, { "bswap", BSWAP, WORD }, { "bt", BT, WORD }, { "btc", BTC, WORD }, { "btr", BTR, WORD }, { "bts", BTS, WORD }, { "call", CALL, JUMP }, { "callf", CALLF, JUMP }, { "cbw", CBW, WORD }, { "cdq", CWD, WORD }, { "clc", CLC, WORD }, { "cld", CLD, WORD }, { "cli", CLI, WORD }, { "clts", CLTS, WORD }, { "cmc", CMC, WORD }, { "cmp", CMP, WORD }, { "cmpb", CMP, BYTE }, { "cmps", CMPS, WORD }, { "cmpsb", CMPS, BYTE }, { "cmpxchg", CMPXCHG, WORD }, { "cwd", CWD, WORD }, { "cwde", CBW, WORD }, { "daa", DAA, WORD }, { "das", DAS, WORD }, { "dec", DEC, WORD }, { "decb", DEC, BYTE }, { "div", DIV, WORD }, { "divb", DIV, BYTE }, { "enter", ENTER, WORD }, { "f2xm1", F2XM1, WORD }, { "fabs", FABS, WORD }, { "fadd", FADD, WORD }, { "faddd", FADDD, WORD }, { "faddp", FADDP, WORD }, { "fadds", FADDS, WORD }, { "fbld", FBLD, WORD }, { "fbstp", FBSTP, WORD }, { "fchs", FCHS, WORD }, { "fclex", FCLEX, WORD }, { "fcomd", FCOMD, WORD }, { "fcompd", FCOMPD, WORD }, { "fcompp", FCOMPP, WORD }, { "fcomps", FCOMPS, WORD }, { "fcoms", FCOMS, WORD }, { "fcos", FCOS, WORD }, { "fdecstp", FDECSTP, WORD }, { "fdivd", FDIVD, WORD }, { "fdivp", FDIVP, WORD }, { "fdivrd", FDIVRD, WORD }, { "fdivrp", FDIVRP, WORD }, { "fdivrs", FDIVRS, WORD }, { "fdivs", FDIVS, WORD }, { "ffree", FFREE, WORD }, { "fiaddl", FIADDL, WORD }, { "fiadds", FIADDS, WORD }, { "ficom", FICOM, WORD }, { "ficomp", FICOMP, WORD }, { "fidivl", FIDIVL, WORD }, { "fidivrl", FIDIVRL, WORD }, { "fidivrs", FIDIVRS, WORD }, { "fidivs", FIDIVS, WORD }, { "fildl", FILDL, WORD }, { "fildq", FILDQ, WORD }, { "filds", FILDS, WORD }, { "fimull", FIMULL, WORD }, { "fimuls", FIMULS, WORD }, { "fincstp", FINCSTP, WORD }, { "finit", FINIT, WORD }, { "fistl", FISTL, WORD }, { "fistp", FISTP, WORD }, { "fists", FISTS, WORD }, { "fisubl", FISUBL, WORD }, { "fisubrl", FISUBRL, WORD }, { "fisubrs", FISUBRS, WORD }, { "fisubs", FISUBS, WORD }, { "fld1", FLD1, WORD }, { "fldcw", FLDCW, WORD }, { "fldd", FLDD, WORD }, { "fldenv", FLDENV, WORD }, { "fldl2e", FLDL2E, WORD }, { "fldl2t", FLDL2T, WORD }, { "fldlg2", FLDLG2, WORD }, { "fldln2", FLDLN2, WORD }, { "fldpi", FLDPI, WORD }, { "flds", FLDS, WORD }, { "fldx", FLDX, WORD }, { "fldz", FLDZ, WORD }, { "fmuld", FMULD, WORD }, { "fmulp", FMULP, WORD }, { "fmuls", FMULS, WORD }, { "fnop", FNOP, WORD }, { "fpatan", FPATAN, WORD }, { "fprem", FPREM, WORD }, { "fprem1", FPREM1, WORD }, { "fptan", FPTAN, WORD }, { "frndint", FRNDINT, WORD }, { "frstor", FRSTOR, WORD }, { "fsave", FSAVE, WORD }, { "fscale", FSCALE, WORD }, { "fsin", FSIN, WORD }, { "fsincos", FSINCOS, WORD }, { "fsqrt", FSQRT, WORD }, { "fstcw", FSTCW, WORD }, { "fstd", FSTD, WORD }, { "fstenv", FSTENV, WORD }, { "fstpd", FSTPD, WORD }, { "fstps", FSTPS, WORD }, { "fstpx", FSTPX, WORD }, { "fsts", FSTS, WORD }, { "fstsw", FSTSW, WORD }, { "fsubd", FSUBD, WORD }, { "fsubp", FSUBP, WORD }, { "fsubpr", FSUBPR, WORD }, { "fsubrd", FSUBRD, WORD }, { "fsubrs", FSUBRS, WORD }, { "fsubs", FSUBS, WORD }, { "ftst", FTST, WORD }, { "fucom", FUCOM, WORD }, { "fucomp", FUCOMP, WORD }, { "fucompp", FUCOMPP, WORD }, { "fxam", FXAM, WORD }, { "fxch", FXCH, WORD }, { "fxtract", FXTRACT, WORD }, { "fyl2x", FYL2X, WORD }, { "fyl2xp1", FYL2XP1, WORD }, { "hlt", HLT, WORD }, { "idiv", IDIV, WORD }, { "idivb", IDIV, BYTE }, { "imul", IMUL, WORD }, { "imulb", IMUL, BYTE }, { "in", IN, WORD }, { "inb", IN, BYTE }, { "inc", INC, WORD }, { "incb", INC, BYTE }, { "ins", INS, WORD }, { "insb", INS, BYTE }, { "int", INT, WORD }, { "into", INTO, JUMP }, { "invd", INVD, WORD }, { "invlpg", INVLPG, WORD }, { "iret", IRET, JUMP }, { "iretd", IRETD, JUMP }, { "ja", JA, JUMP }, { "jae", JAE, JUMP }, { "jb", JB, JUMP }, { "jbe", JBE, JUMP }, { "jc", JB, JUMP }, { "jcxz", JCXZ, JUMP }, { "je", JE, JUMP }, { "jecxz", JCXZ, JUMP }, { "jg", JG, JUMP }, { "jge", JGE, JUMP }, { "jl", JL, JUMP }, { "jle", JLE, JUMP }, { "jmp", JMP, JUMP }, { "jmpf", JMPF, JUMP }, { "jna", JBE, JUMP }, { "jnae", JB, JUMP }, { "jnb", JAE, JUMP }, { "jnbe", JA, JUMP }, { "jnc", JAE, JUMP }, { "jne", JNE, JUMP }, { "jng", JLE, JUMP }, { "jnge", JL, JUMP }, { "jnl", JGE, JUMP }, { "jnle", JG, JUMP }, { "jno", JNO, JUMP }, { "jnp", JNP, JUMP }, { "jns", JNS, JUMP }, { "jnz", JNE, JUMP }, { "jo", JO, JUMP }, { "jp", JP, JUMP }, { "js", JS, JUMP }, { "jz", JE, JUMP }, { "lahf", LAHF, WORD }, { "lar", LAR, WORD }, { "lds", LDS, WORD }, { "lea", LEA, WORD }, { "leave", LEAVE, WORD }, { "les", LES, WORD }, { "lfs", LFS, WORD }, { "lgdt", LGDT, WORD }, { "lgs", LGS, WORD }, { "lidt", LIDT, WORD }, { "lldt", LLDT, WORD }, { "lmsw", LMSW, WORD }, { "lock", LOCK, WORD }, { "lods", LODS, WORD }, { "lodsb", LODS, BYTE }, { "loop", LOOP, JUMP }, { "loope", LOOPE, JUMP }, { "loopne", LOOPNE, JUMP }, { "loopnz", LOOPNE, JUMP }, { "loopz", LOOPE, JUMP }, { "lsl", LSL, WORD }, { "lss", LSS, WORD }, { "ltr", LTR, WORD }, { "mov", MOV, WORD }, { "movb", MOV, BYTE }, { "movs", MOVS, WORD }, { "movsb", MOVS, BYTE }, { "movsx", MOVSX, WORD }, { "movsxb", MOVSXB, WORD }, { "movzx", MOVZX, WORD }, { "movzxb", MOVZXB, WORD }, { "mul", MUL, WORD }, { "mulb", MUL, BYTE }, { "neg", NEG, WORD }, { "negb", NEG, BYTE }, { "nop", NOP, WORD }, { "not", NOT, WORD }, { "notb", NOT, BYTE }, { "or", OR, WORD }, { "orb", OR, BYTE }, { "out", OUT, WORD }, { "outb", OUT, BYTE }, { "outs", OUTS, WORD }, { "outsb", OUTS, BYTE }, { "pop", POP, WORD }, { "popa", POPA, WORD }, { "popad", POPA, WORD }, { "popf", POPF, WORD }, { "push", PUSH, WORD }, { "pusha", PUSHA, WORD }, { "pushad", PUSHA, WORD }, { "pushf", PUSHF, WORD }, { "rcl", RCL, WORD }, { "rclb", RCL, BYTE }, { "rcr", RCR, WORD }, { "rcrb", RCR, BYTE }, { "ret", RET, JUMP }, { "retf", RETF, JUMP }, { "rol", ROL, WORD }, { "rolb", ROL, BYTE }, { "ror", ROR, WORD }, { "rorb", ROR, BYTE }, { "sahf", SAHF, WORD }, { "sal", SAL, WORD }, { "salb", SAL, BYTE }, { "sar", SAR, WORD }, { "sarb", SAR, BYTE }, { "sbb", SBB, WORD }, { "sbbb", SBB, BYTE }, { "scas", SCAS, WORD }, { "scasb", SCAS, BYTE }, { "seta", SETA, BYTE }, { "setae", SETAE, BYTE }, { "setb", SETB, BYTE }, { "setbe", SETBE, BYTE }, E��E��E��E��E��E��E��E��E��E�� E��!E��"E��#E��$E������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ { "sete", SETE, BYTE }, { "setg", SETG, BYTE }, { "setge", SETGE, BYTE }, { "setl", SETL, BYTE }, { "setna", SETBE, BYTE }, { "setnae", SETB, BYTE }, { "setnb", SETAE, BYTE }, { "setnbe", SETA, BYTE }, { "setne", SETNE, BYTE }, { "setng", SETLE, BYTE }, { "setnge", SETL, BYTE }, { "setnl", SETGE, BYTE }, { "setnle", SETG, BYTE }, { "setno", SETNO, BYTE }, { "setnp", SETNP, BYTE }, { "setns", SETNS, BYTE }, { "seto", SETO, BYTE }, { "setp", SETP, BYTE }, { "sets", SETS, BYTE }, { "setz", SETE, BYTE }, { "sgdt", SGDT, WORD }, { "shl", SHL, WORD }, { "shlb", SHL, BYTE }, { "shld", SHLD, WORD }, { "shr", SHR, WORD }, { "shrb", SHR, BYTE }, { "shrd", SHRD, WORD }, { "sidt", SIDT, WORD }, { "sldt", SLDT, WORD }, { "smsw", SMSW, WORD }, { "stc", STC, WORD }, { "std", STD, WORD }, { "sti", STI, WORD }, { "stos", STOS, WORD }, { "stosb", STOS, BYTE }, { "str", STR, WORD }, { "sub", SUB, WORD }, { "subb", SUB, BYTE }, { "test", TEST, WORD }, { "testb", TEST, BYTE }, { "verr", VERR, WORD }, { "verw", VERW, WORD }, { "wait", WAIT, WORD }, { "wbinvd", WBINVD, WORD }, { "xadd", XADD, WORD }, { "xchg", XCHG, WORD }, { "xchgb", XCHG, BYTE }, { "xlat", XLAT, WORD }, { "xor", XOR, WORD }, { "xorb", XOR, BYTE }, }; static enum dialect { ACK, NCC } dialect= ACK; void ack_parse_init(char *file) /* Prepare parsing of an ACK assembly file. */ { tok_init(file, '!'); } void ncc_parse_init(char *file) /* Prepare parsing of an ACK Xenix assembly file. See emit_ack.c for comments * on this fine assembly dialect. */ { dialect= NCC; ack_parse_init(file); } static void zap(void) /* An error, zap the rest of the line. */ { token_t *t; while ((t= get_token(0))->type != T_EOF && t->symbol != ';') skip_token(1); } static mnemonic_t *search_mnem(char *name) /* Binary search for a mnemonic. (That's why the table is sorted.) */ { int low, mid, high; int cmp; mnemonic_t *m; low= 0; high= arraysize(mnemtab)-1; while (low <= high) { mid= (low + high) / 2; m= &mnemtab[mid]; if ((cmp= strcmp(name, m->name)) == 0) return m; if (cmp < 0) high= mid-1; else low= mid+1; } return nil; } static expression_t *ack_get_C_expression(int *pn) /* Read a "C-like" expression. Note that we don't worry about precedence, * the expression is printed later like it is read. If the target language * does not have all the operators (like ~) then this has to be repaired by * changing the source file. (No problem, you still have one source file * to maintain, not two.) */ { expression_t *e, *a1, *a2; token_t *t; if ((t= get_token(*pn))->symbol == '[') { /* [ expr ]: grouping. */ (*pn)++; if ((a1= ack_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ']') { parse_err(1, t, "missing ]\n"); del_expr(a1); return nil; } (*pn)++; e= new_expr(); e->operator= '['; e->middle= a1; } else if (t->type == T_WORD || t->type == T_STRING) { /* Label, number, or string. */ e= new_expr(); e->operator= t->type == T_WORD ? 'W' : 'S'; e->name= allocate(nil, (t->len+1) * sizeof(e->name[0])); memcpy(e->name, t->name, t->len+1); e->len= t->len; (*pn)++; } else if (t->symbol == '+' || t->symbol == '-' || t->symbol == '~') { /* Unary operator. */ (*pn)++; if ((a1= ack_get_C_expression(pn)) == nil) return nil; e= new_expr(); e->operator= t->symbol; e->middle= a1; } else { parse_err(1, t, "expression syntax error\n"); return nil; } switch ((t= get_token(*pn))->symbol) { case '+': case '-': case '*': case '/': case '%': case '&': case '|': case '^': case S_LEFTSHIFT: case S_RIGHTSHIFT: (*pn)++; a1= e; if ((a2= ack_get_C_expression(pn)) == nil) { del_expr(a1); return nil; } e= new_expr(); e->operator= t->symbol; e->left= a1; e->right= a2; } return e; } static expression_t *ack_get_operand(int *pn, int deref) /* Get something like: (memory), offset(base)(index*scale), or simpler. */ { expression_t *e, *offset, *base, *index; token_t *t; int c; /* Is it (memory)? */ if (get_token(*pn)->symbol == '(' && ((t= get_token(*pn + 1))->type != T_WORD || !isregister(t->name)) ) { /* A memory dereference. */ (*pn)++; if ((offset= ack_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ')') { parse_err(1, t, "operand syntax error\n"); del_expr(offset); return nil; } (*pn)++; e= new_expr(); e->operator= '('; e->middle= offset; return e; } /* #constant? */ if (dialect == NCC && deref && ((c= get_token(*pn)->symbol) == '#' || c == '*')) { /* NCC: mov ax,#constant -> ACK: mov ax,constant */ (*pn)++; return ack_get_C_expression(pn); } /* @address? */ if (dialect == NCC && get_token(*pn)->symbol == '@') { /* NCC: jmp @address -> ACK: jmp (address) */ (*pn)++; if ((offset= ack_get_operand(pn, deref)) == nil) return nil; e= new_expr(); e->operator= '('; e->middle= offset; return e; } /* Offset? */ if (get_token(*pn)->symbol != '(') { /* There is an offset. */ if ((offset= ack_get_C_expression(pn)) == nil) return nil; } else { /* No offset. */ offset= nil; } /* (base)? */ if (get_token(*pn)->symbol == '(' && (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) && get_token(*pn + 2)->symbol == ')' ) { /* A base register expression. */ base= new_expr(); base->operator= 'B'; base->name= copystr(t->name); (*pn)+= 3; } else { /* No base register expression. */ base= nil; } /* (index*scale)? */ if (get_token(*pn)->symbol == '(') { /* An index most likely. */ token_t *m= nil; if (!( /* This must be true: */ (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) && (get_token(*pn + 2)->symbol == ')' || ( get_token(*pn + 2)->symbol == '*' && (m= get_token(*pn + 3))->type == T_WORD && strchr("1248", m->name[0]) != nil && m->name[1] == 0 && get_token(*pn + 4)->symbol == ')' )) )) { /* Alas it isn't */ parse_err(1, t, "operand syntax error\n"); del_expr(offset); del_expr(base); return nil; } /* Found an index. */ index= new_expr(); index->operator= m == nil ? '1' : m->name[0]; index->name= copystr(t->name); (*pn)+= (m == nil ? 3 : 5); } else { /* No index. */ index= nil; } if (dialect == NCC && deref && base == nil && index == nil && !(offset != nil && offset->operator == 'W' && isregister(offset->name)) ) { /* NCC: mov ax,thing -> ACK mov ax,(thing) */ e= new_expr(); e->operator= '('; e->middle= offset; return e; } if (base == nil && index == nil) { /* Return a lone offset as is. */ e= offset; } else { e= new_expr(); e->operator= 'O'; e->left= offset; e->middle= base; e->right= index; } return e; } static expression_t *ack_get_oplist(int *pn, int deref) /* Get a comma (or colon for jmpf and callf) separated list of instruction * operands. */ { expression_t *e, *o1, *o2; token_t *t; if ((e= ack_get_operand(pn, deref)) == nil) return nil; if ((t= get_token(*pn))->symbol == ',' || t->symbol == ':') { o1= e; (*pn)++; if ((o2= ack_get_oplist(pn, deref)) == nil) { del_expr(o1); return nil; } e= new_expr(); e->operator= ','; e->left= o1; e->right= o2; } return e; } static asm86_t *ack_get_statement(void) /* Get a pseudo op or machine instruction with arguments. */ { token_t *t= get_token(0); asm86_t *a; mnemonic_t *m; int n; int prefix_seen; int oaz_prefix; int deref; assert(t->type == T_WORD); if (strcmp(t->name, ".sect") == 0) { /* .sect .text etc. Accept only four segment names. */ skip_token(1); t= get_token(0); if (t->type != T_WORD || ( strcmp(t->name, ".text") != 0 && strcmp(t->name, ".rom") != 0 && strcmp(t->name, ".data") != 0 && strcmp(t->name, ".bss") != 0 && strcmp(t->name, ".end") != 0 )) { parse_err(1, t, "weird section name to .sect\n"); return nil; } } a= new_asm86(); /* Process instruction prefixes. */ oaz_prefix= 0; for (prefix_seen= 0;; prefix_seen= 1) { if (strcmp(t->name, "o16") == 0) { if (use16()) { parse_err(1, t, "o16 in an 8086 section\n"); } oaz_prefix|= OPZ; } else if (strcmp(t->name, "o32") == 0) { if (use32()) { parse_err(1, t, "o32 in an 80386 section\n"); } oaz_prefix|= OPZ; } else if (strcmp(t->name, "a16") == 0) { if (use16()) { parse_err(1, t, "a16 in an 8086 section\n"); } oaz_prefix|= ADZ; } else if (strcmp(t->name, "a32") == 0) { if (use32()) { parse_err(1, t, "a32 in an 80386 section\n"); } oaz_prefix|= ADZ; } else if (strcmp(t->name, "rep") == 0 || strcmp(t->name, "repe") == 0 || strcmp(t->name, "repne") == 0 || strcmp(t->name, "repz") == 0 || strcmp(t->name, "repnz") == 0 ) { if (a->rep != ONCE) { parse_err(1, t, "can't have more than one rep\n"); } switch (t->name[3]) { case 0: a->rep= REP; break; case 'e': case 'z': a->rep= REPE; break; case 'n': a->rep= REPNE; break; } } else if (strchr("cdefgs", t->name[0]) != nil && strcmp(t->name+1, "seg") == 0) { if (a->seg != DEFSEG) { parse_err(1, t, "can't have more than one segment prefix\n"); } switch (t->name[0]) { case 'c': a->seg= CSEG; break; case 'd': a->seg= DSEG; break; case 'e': a->seg= ESEG; break; case 'f': a->seg= FSEG; break; case 'g': a->seg= GSEG; break; case 's': a->seg= SSEG; break; } } else if (!prefix_seen) { /* No prefix here, get out! */ break; } else { /* No more prefixes, next must be an instruction. */ if (t->type != T_WORD || (m= search_mnem(t->name)) == nil || m->optype == PSEUDO ) { parse_err(1, t, "machine instruction expected after instruction prefix\n"); del_asm86(a); return nil; } if (oaz_prefix != 0 && m->optype != JUMP && m->optype != WORD) { parse_err(1, t, "'%s' can't have an operand size prefix\n", m->name); } break; } /* Skip the prefix and extra newlines. */ do { skip_token(1); } while ((t= get_token(0))->symbol == ';'); } /* All the readahead being done upsets the line counter. */ a->line= t->line; /* Read a machine instruction or pseudo op. */ if ((m= search_mnem(t->name)) == nil) { parse_err(1, t, "unknown instruction '%s'\n", t->name); del_asm86(a); return nil; } a->opcode= m->opcode; a->optype= m->optype; a->oaz= oaz_prefix; switch (a->opcode) { case IN: case OUT: case INT: deref= 0; break; default: deref= (a->optype >= BYTE); } n= 1; if (get_token(1)->symbol != ';' && (a->args= ack_get_oplist(&n, deref)) == nil) { del_asm86(a); return nil; } if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage at end of instruction\n"); del_asm86(a); return nil; } switch (a->opcode) { case DOT_ALIGN: /* Restrict .align to have a single numeric argument, some * assemblers think of the argument as a power of two, so * we need to be able to change the value. */ if (a->args == nil || a->args->operator != 'W' || !isanumber(a->args->name)) { parse_err(1, t, ".align is restricted to one numeric argument\n"); del_asm86(a); return nil; } break; case JMPF: case CALLF: /* NCC jmpf off,seg -> ACK jmpf seg:off */ if (dialect == NCC && a->args != nil && a->args->operator == ',') { expression_t *t; t= a->args->left; a->args->left= a->args->right; a->args->right= t; break; } /*FALL THROUGH*/ case JMP: case CALL: /* NCC jmp @(reg) -> ACK jmp (reg) */ if (dialect == NCC && a->args != nil && ( (a->args->operator == '(' && a->args->middle != nil && a->args->middle->operator == 'O') || (a->args->operator == 'O' && a->args->left == nil && a->args->middle != nil && a->args->right == nil) )) { expression_t *t; t= a->args; a->args= a->args->middle; t->middle= nil; del_expr(t); if (a->args->operator == 'B') a->args->operator= 'W'; } break; default:; } skip_token(n+1); return a; } asm86_t *ack_get_instruction(void) { asm86_t *a= nil; expression_t *e; token_t *t; while ((t= get_token(0))->symbol == ';') skip_token(1); if (t->type == T_EOF) return nil; if (t->symbol == '#') { /* Preprocessor line and file change. */ if ((t= get_token(1))->type != T_WORD || !isanumber(t->name) || get_token(2)->type != T_STRING ) { parse_err(1, t, "file not preprocessed?\n"); zap(); } else { set_file(get_token(2)->name, strtol(get_token(1)->name, nil, 0) - 1); /* GNU CPP adds extra cruft, simply zap the line. */ zap(); } a= ack_get_instruction(); } else if (t->type == T_WORD && get_token(1)->symbol == ':') { /* A label definition. */ a= new_asm86(); a->line= t->line; a->opcode= DOT_LABEL; a->optype= PSEUDO; a->args= e= new_expr(); e->operator= ':'; e->name= copystr(t->name); skip_token(2); } else if (t->type == T_WORD && get_token(1)->symbol == '=') { int n= 2; if ((e= ack_get_C_expression(&n)) == nil) { zap(); a= ack_get_instruction(); } else if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage after assignment\n"); zap(); a= ack_get_instruction(); } else { a= new_asm86(); a->line= t->line; a->opcode= DOT_EQU; a->optype= PSEUDO; a->args= new_expr(); a->args->operator= '='; a->args->name= copystr(t->name); a->args->middle= e; skip_token(n+1); } } else if (t->type == T_WORD) { if ((a= ack_get_statement()) == nil) { zap(); a= ack_get_instruction(); } } else { parse_err(1, t, "syntax error\n"); zap(); a= ack_get_instruction(); } return a; } asm86_t *ncc_get_instruction(void) { return ack_get_instruction(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* parse_bas.c - parse BCC AS assembly Author: Kees J. Bot * 13 Nov 1994 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "asmconv.h" #include "token.h" #include "asm86.h" #include "languages.h" typedef struct mnemonic { /* BAS mnemonics translation table. */ char *name; opcode_t opcode; optype_t optype; } mnemonic_t; static mnemonic_t mnemtab[] = { /* This array is sorted. */ { ".align", DOT_ALIGN, PSEUDO }, { ".ascii", DOT_ASCII, PSEUDO }, { ".asciz", DOT_ASCIZ, PSEUDO }, { ".assert", DOT_ASSERT, PSEUDO }, { ".base", DOT_BASE, PSEUDO }, { ".blkb", DOT_SPACE, PSEUDO }, { ".bss", DOT_BSS, PSEUDO }, { ".byte", DOT_DATA1, PSEUDO }, { ".comm", DOT_COMM, PSEUDO }, { ".data", DOT_DATA, PSEUDO }, { ".define", DOT_DEFINE, PSEUDO }, { ".end", DOT_END, PSEUDO }, { ".even", DOT_ALIGN, PSEUDO }, { ".extern", DOT_EXTERN, PSEUDO }, { ".file", DOT_FILE, PSEUDO }, { ".globl", DOT_DEFINE, PSEUDO }, { ".lcomm", DOT_LCOMM, PSEUDO }, { ".line", DOT_LINE, PSEUDO }, { ".list", DOT_LIST, PSEUDO }, { ".long", DOT_DATA4, PSEUDO }, { ".nolist", DOT_NOLIST, PSEUDO }, { ".rom", DOT_ROM, PSEUDO }, { ".space", DOT_SPACE, PSEUDO }, { ".symb", DOT_SYMB, PSEUDO }, { ".text", DOT_TEXT, PSEUDO }, { ".use16", DOT_USE16, PSEUDO }, { ".use32", DOT_USE32, PSEUDO }, { ".word", DOT_DATA2, PSEUDO }, { ".zerob", DOT_SPACE, PSEUDO }, { ".zerow", DOT_SPACE, PSEUDO }, { "aaa", AAA, WORD }, { "aad", AAD, WORD }, { "aam", AAM, WORD }, { "aas", AAS, WORD }, { "adc", ADC, WORD }, { "add", ADD, WORD }, { "and", AND, WORD }, { "arpl", ARPL, WORD }, { "bc", JB, JUMP }, { "beq", JE, JUMP }, { "bge", JGE, JUMP }, { "bgt", JG, JUMP }, { "bhi", JA, JUMP }, { "bhis", JAE, JUMP }, { "ble", JLE, JUMP }, { "blo", JB, JUMP }, { "blos", JBE, JUMP }, { "blt", JL, JUMP }, { "bnc", JAE, JUMP }, { "bne", JNE, JUMP }, { "bound", BOUND, WORD }, { "br", JMP, JUMP }, { "bsf", BSF, WORD }, { "bsr", BSR, WORD }, { "bswap", BSWAP, WORD }, { "bt", BT, WORD }, { "btc", BTC, WORD }, { "btr", BTR, WORD }, { "bts", BTS, WORD }, { "bz", JE, JUMP }, { "call", CALL, JUMP }, { "callf", CALLF, JUMP }, { "cbw", CBW, WORD }, { "cdq", CWD, WORD }, { "clc", CLC, WORD }, { "cld", CLD, WORD }, { "cli", CLI, WORD }, { "clts", CLTS, WORD }, { "cmc", CMC, WORD }, { "cmp", CMP, WORD }, { "cmps", CMPS, WORD }, { "cmpsb", CMPS, BYTE }, { "cmpxchg", CMPXCHG, WORD }, { "cwd", CWD, WORD }, { "cwde", CBW, WORD }, { "daa", DAA, WORD }, { "das", DAS, WORD }, { "dd", DOT_DATA4, PSEUDO }, { "dec", DEC, WORD }, { "div", DIV, WORD }, { "enter", ENTER, WORD }, { "export", DOT_DEFINE, PSEUDO }, { "f2xm1", F2XM1, WORD }, { "fabs", FABS, WORD }, { "fadd", FADD, WORD }, { "faddd", FADDD, WORD }, { "faddp", FADDP, WORD }, { "fadds", FADDS, WORD }, { "fbld", FBLD, WORD }, { "fbstp", FBSTP, WORD }, { "fchs", FCHS, WORD }, { "fclex", FCLEX, WORD }, { "fcomd", FCOMD, WORD }, { "fcompd", FCOMPD, WORD }, { "fcompp", FCOMPP, WORD }, { "fcomps", FCOMPS, WORD }, { "fcoms", FCOMS, WORD }, { "fcos", FCOS, WORD }, { "fdecstp", FDECSTP, WORD }, { "fdivd", FDIVD, WORD }, { "fdivp", FDIVP, WORD }, { "fdivrd", FDIVRD, WORD }, { "fdivrp", FDIVRP, WORD }, { "fdivrs", FDIVRS, WORD }, { "fdivs", FDIVS, WORD }, { "ffree", FFREE, WORD }, { "fiaddl", FIADDL, WORD }, { "fiadds", FIADDS, WORD }, { "ficom", FICOM, WORD }, { "ficomp", FICOMP, WORD }, { "fidivl", FIDIVL, WORD }, { "fidivrl", FIDIVRL, WORD }, { "fidivrs", FIDIVRS, WORD }, { "fidivs", FIDIVS, WORD }, { "fildl", FILDL, WORD }, { "fildq", FILDQ, WORD }, { "filds", FILDS, WORD }, { "fimull", FIMULL, WORD }, { "fimuls", FIMULS, WORD }, { "fincstp", FINCSTP, WORD }, { "finit", FINIT, WORD }, { "fistl", FISTL, WORD }, { "fistp", FISTP, WORD }, { "fists", FISTS, WORD }, { "fisubl", FISUBL, WORD }, { "fisubrl", FISUBRL, WORD }, { "fisubrs", FISUBRS, WORD }, { "fisubs", FISUBS, WORD }, { "fld1", FLD1, WORD }, { "fldcw", FLDCW, WORD }, { "fldd", FLDD, WORD }, { "fldenv", FLDENV, WORD }, { "fldl2e", FLDL2E, WORD }, { "fldl2t", FLDL2T, WORD }, { "fldlg2", FLDLG2, WORD }, { "fldln2", FLDLN2, WORD }, { "fldpi", FLDPI, WORD }, { "flds", FLDS, WORD }, { "fldx", FLDX, WORD }, { "fldz", FLDZ, WORD }, { "fmuld", FMULD, WORD }, { "fmulp", FMULP, WORD }, { "fmuls", FMULS, WORD }, { "fnop", FNOP, WORD }, { "fpatan", FPATAN, WORD }, { "fprem", FPREM, WORD }, { "fprem1", FPREM1, WORD }, { "fptan", FPTAN, WORD }, { "frndint", FRNDINT, WORD }, { "frstor", FRSTOR, WORD }, { "fsave", FSAVE, WORD }, { "fscale", FSCALE, WORD }, { "fsin", FSIN, WORD }, { "fsincos", FSINCOS, WORD }, { "fsqrt", FSQRT, WORD }, { "fstcw", FSTCW, WORD }, { "fstd", FSTD, WORD }, { "fstenv", FSTENV, WORD }, { "fstpd", FSTPD, WORD }, { "fstps", FSTPS, WORD }, { "fstpx", FSTPX, WORD }, { "fsts", FSTS, WORD }, { "fstsw", FSTSW, WORD }, { "fsubd", FSUBD, WORD }, { "fsubp", FSUBP, WORD }, { "fsubpr", FSUBPR, WORD }, { "fsubrd", FSUBRD, WORD }, { "fsubrs", FSUBRS, WORD }, { "fsubs", FSUBS, WORD }, { "ftst", FTST, WORD }, { "fucom", FUCOM, WORD }, { "fucomp", FUCOMP, WORD }, { "fucompp", FUCOMPP, WORD }, { "fxam", FXAM, WORD }, { "fxch", FXCH, WORD }, { "fxtract", FXTRACT, WORD }, { "fyl2x", FYL2X, WORD }, { "fyl2xp1", FYL2XP1, WORD }, { "hlt", HLT, WORD }, { "idiv", IDIV, WORD }, { "imul", IMUL, WORD }, { "in", IN, WORD }, { "inb", IN, BYTE }, { "inc", INC, WORD }, { "ins", INS, WORD }, { "insb", INS, BYTE }, { "int", INT, WORD }, { "into", INTO, JUMP }, { "invd", INVD, WORD }, { "invlpg", INVLPG, WORD }, { "iret", IRET, JUMP }, { "iretd", IRETD, JUMP }, { "j", JMP, JUMP }, { "ja", JA, JUMP }, { "jae", JAE, JUMP }, { "jb", JB, JUMP }, { "jbe", JBE, JUMP }, { "jc", JB, JUMP }, { "jcxz", JCXZ, JUMP }, { "je", JE, JUMP }, { "jecxz", JCXZ, JUMP }, { "jeq", JE, JUMP }, { "jg", JG, JUMP }, { "jge", JGE, JUMP }, { "jgt", JG, JUMP }, { "jhi", JA, JUMP }, { "jhis", JAE, JUMP }, { "jl", JL, JUMP }, { "jle", JLE, JUMP }, { "jlo", JB, JUMP }, { "jlos", JBE, JUMP }, { "jlt", JL, JUMP }, { "jmp", JMP, JUMP }, { "jmpf", JMPF, JUMP }, { "jna", JBE, JUMP }, { "jnae", JB, JUMP }, { "jnb", JAE, JUMP }, { "jnbe", JA, JUMP }, { "jnc", JAE, JUMP }, { "jne", JNE, JUMP }, { "jng", JLE, JUMP }, { "jnge", JL, JUMP }, { "jnl", JGE, JUMP }, { "jnle", JG, JUMP }, { "jno", JNO, JUMP }, { "jnp", JNP, JUMP }, { "jns", JNS, JUMP }, { "jnz", JNE, JUMP }, { "jo", JO, JUMP }, { "jp", JP, JUMP }, { "js", JS, JUMP }, { "jz", JE, JUMP }, { "lahf", LAHF, WORD }, { "lar", LAR, WORD }, { "lds", LDS, WORD }, { "lea", LEA, WORD }, { "leave", LEAVE, WORD }, { "les", LES, WORD }, { "lfs", LFS, WORD }, { "lgdt", LGDT, WORD }, { "lgs", LGS, WORD }, { "lidt", LIDT, WORD }, { "lldt", LLDT, WORD }, { "lmsw", LMSW, WORD }, { "lock", LOCK, WORD }, { "lods", LODS, WORD }, { "lodsb", LODS, BYTE }, { "loop", LOOP, JUMP }, { "loope", LOOPE, JUMP }, { "loopne", LOOPNE, JUMP }, { "loopnz", LOOPNE, JUMP }, { "loopz", LOOPE, JUMP }, { "lsl", LSL, WORD }, { "lss", LSS, WORD }, { "ltr", LTR, WORD }, { "mov", MOV, WORD }, { "movs", MOVS, WORD }, { "movsb", MOVS, BYTE }, { "movsx", MOVSX, WORD }, { "movzx", MOVZX, WORD }, { "mul", MUL, WORD }, { "neg", NEG, WORD }, { "nop", NOP, WORD }, { "not", NOT, WORD }, { "or", OR, WORD }, { "out", OUT, WORD }, { "outb", OUT, BYTE }, { "outs", OUTS, WORD }, { "outsb", OUTS, BYTE }, { "pop", POP, WORD }, { "popa", POPA, WORD }, { "popad", POPA, WORD }, { "popf", POPF, WORD }, { "popfd", POPF, WORD }, { "push", PUSH, WORD }, { "pusha", PUSHA, WORD }, { "pushad", PUSHA, WORD }, { "pushf", PUSHF, WORD }, { "pushfd", PUSHF, WORD }, { "rcl", RCL, WORD }, { "rcr", RCR, WORD }, { "ret", RET, JUMP }, { "retf", RETF, JUMP }, { "rol", ROL, WORD }, { "ror", ROR, WORD }, { "sahf", SAHF, WORD }, { ,E��.E��/E��0E��1E��2E��3E��4E��5E��6E��7E��8E��9E��:E��;E��<E��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"sal", SAL, WORD }, { "sar", SAR, WORD }, { "sbb", SBB, WORD }, { "scas", SCAS, WORD }, { "seta", SETA, BYTE }, { "setae", SETAE, BYTE }, { "setb", SETB, BYTE }, { "setbe", SETBE, BYTE }, { "sete", SETE, BYTE }, { "setg", SETG, BYTE }, { "setge", SETGE, BYTE }, { "setl", SETL, BYTE }, { "setna", SETBE, BYTE }, { "setnae", SETB, BYTE }, { "setnb", SETAE, BYTE }, { "setnbe", SETA, BYTE }, { "setne", SETNE, BYTE }, { "setng", SETLE, BYTE }, { "setnge", SETL, BYTE }, { "setnl", SETGE, BYTE }, { "setnle", SETG, BYTE }, { "setno", SETNO, BYTE }, { "setnp", SETNP, BYTE }, { "setns", SETNS, BYTE }, { "seto", SETO, BYTE }, { "setp", SETP, BYTE }, { "sets", SETS, BYTE }, { "setz", SETE, BYTE }, { "sgdt", SGDT, WORD }, { "shl", SHL, WORD }, { "shld", SHLD, WORD }, { "shr", SHR, WORD }, { "shrd", SHRD, WORD }, { "sidt", SIDT, WORD }, { "sldt", SLDT, WORD }, { "smsw", SMSW, WORD }, { "stc", STC, WORD }, { "std", STD, WORD }, { "sti", STI, WORD }, { "stos", STOS, WORD }, { "stosb", STOS, BYTE }, { "str", STR, WORD }, { "sub", SUB, WORD }, { "test", TEST, WORD }, { "verr", VERR, WORD }, { "verw", VERW, WORD }, { "wait", WAIT, WORD }, { "wbinvd", WBINVD, WORD }, { "xadd", XADD, WORD }, { "xchg", XCHG, WORD }, { "xlat", XLAT, WORD }, { "xor", XOR, WORD }, }; void bas_parse_init(char *file) /* Prepare parsing of an BAS assembly file. */ { tok_init(file, '!'); } static void zap(void) /* An error, zap the rest of the line. */ { token_t *t; while ((t= get_token(0))->type != T_EOF && t->symbol != ';') skip_token(1); } static mnemonic_t *search_mnem(char *name) /* Binary search for a mnemonic. (That's why the table is sorted.) */ { int low, mid, high; int cmp; mnemonic_t *m; low= 0; high= arraysize(mnemtab)-1; while (low <= high) { mid= (low + high) / 2; m= &mnemtab[mid]; if ((cmp= strcmp(name, m->name)) == 0) return m; if (cmp < 0) high= mid-1; else low= mid+1; } return nil; } static expression_t *bas_get_C_expression(int *pn) /* Read a "C-like" expression. Note that we don't worry about precedence, * the expression is printed later like it is read. If the target language * does not have all the operators (like ~) then this has to be repaired by * changing the source file. (No problem, you still have one source file * to maintain, not two.) */ { expression_t *e, *a1, *a2; token_t *t; if ((t= get_token(*pn))->symbol == '(') { /* ( expr ): grouping. */ (*pn)++; if ((a1= bas_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ')') { parse_err(1, t, "missing )\n"); del_expr(a1); return nil; } (*pn)++; e= new_expr(); e->operator= '['; e->middle= a1; } else if (t->type == T_WORD || t->type == T_STRING) { /* Label, number, or string. */ e= new_expr(); e->operator= t->type == T_WORD ? 'W' : 'S'; e->name= allocate(nil, (t->len+1) * sizeof(e->name[0])); memcpy(e->name, t->name, t->len+1); e->len= t->len; (*pn)++; } else if (t->symbol == '+' || t->symbol == '-' || t->symbol == '~') { /* Unary operator. */ (*pn)++; if ((a1= bas_get_C_expression(pn)) == nil) return nil; e= new_expr(); e->operator= t->symbol; e->middle= a1; } else if (t->symbol == '$' && get_token(*pn + 1)->type == T_WORD) { /* A hexadecimal number. */ t= get_token(*pn + 1); e= new_expr(); e->operator= 'W'; e->name= allocate(nil, (t->len+3) * sizeof(e->name[0])); strcpy(e->name, "0x"); memcpy(e->name+2, t->name, t->len+1); e->len= t->len+2; (*pn)+= 2; } else { parse_err(1, t, "expression syntax error\n"); return nil; } switch ((t= get_token(*pn))->symbol) { case '+': case '-': case '*': case '/': case '%': case '&': case '|': case '^': case S_LEFTSHIFT: case S_RIGHTSHIFT: (*pn)++; a1= e; if ((a2= bas_get_C_expression(pn)) == nil) { del_expr(a1); return nil; } e= new_expr(); e->operator= t->symbol; e->left= a1; e->right= a2; } return e; } /* We want to know the sizes of the first two operands. */ static optype_t optypes[2]; static int op_idx; static expression_t *bas_get_operand(int *pn) /* Get something like: [memory], offset[base+index*scale], or simpler. */ { expression_t *e, *offset, *base, *index; token_t *t; int c; optype_t optype; /* Prefixed by 'byte', 'word' or 'dword'? */ if ((t= get_token(*pn))->type == T_WORD && ( strcmp(t->name, "byte") == 0 || strcmp(t->name, "word") == 0 || strcmp(t->name, "dword") == 0) ) { switch (t->name[0]) { case 'b': optype= BYTE; break; case 'w': optype= use16() ? WORD : OWORD; break; case 'd': optype= use32() ? WORD : OWORD; break; } if (op_idx < arraysize(optypes)) optypes[op_idx++]= optype; (*pn)++; /* It may even be "byte ptr"... */ if ((t= get_token(*pn))->type == T_WORD && strcmp(t->name, "ptr") == 0) { (*pn)++; } } /* Is it [memory]? */ if (get_token(*pn)->symbol == '[' && ((t= get_token(*pn + 1))->type != T_WORD || !isregister(t->name)) ) { /* A memory dereference. */ (*pn)++; if ((offset= bas_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ']') { parse_err(1, t, "operand syntax error\n"); del_expr(offset); return nil; } (*pn)++; e= new_expr(); e->operator= '('; e->middle= offset; return e; } /* #something? *something? */ if ((c= get_token(*pn)->symbol) == '#' || c == '*') { /* '#' and '*' are often used to introduce some constant. */ (*pn)++; } /* Offset? */ if (get_token(*pn)->symbol != '[') { /* There is an offset. */ if ((offset= bas_get_C_expression(pn)) == nil) return nil; } else { /* No offset. */ offset= nil; } /* [base]? [base+? base-? */ c= 0; if (get_token(*pn)->symbol == '[' && (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) && ((c= get_token(*pn + 2)->symbol) == ']' || c=='+' || c=='-') ) { /* A base register expression. */ base= new_expr(); base->operator= 'B'; base->name= copystr(t->name); (*pn)+= c == ']' ? 3 : 2; } else { /* No base register expression. */ base= nil; } /* +offset]? -offset]? */ if (offset == nil && (c == '+' || c == '-') && (t= get_token(*pn + 1))->type == T_WORD && !isregister(t->name) ) { (*pn)++; if ((offset= bas_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ']') { parse_err(1, t, "operand syntax error\n"); del_expr(offset); del_expr(base); return nil; } (*pn)++; c= 0; } /* [index*scale]? +index*scale]? */ if (c == '+' || get_token(*pn)->symbol == '[') { /* An index most likely. */ token_t *m= nil; if (!( /* This must be true: */ (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) && (get_token(*pn + 2)->symbol == ']' || ( get_token(*pn + 2)->symbol == '*' && (m= get_token(*pn + 3))->type == T_WORD && strchr("1248", m->name[0]) != nil && m->name[1] == 0 && get_token(*pn + 4)->symbol == ']' )) )) { /* Alas it isn't */ parse_err(1, t, "operand syntax error\n"); del_expr(offset); del_expr(base); return nil; } /* Found an index. */ index= new_expr(); index->operator= m == nil ? '1' : m->name[0]; index->name= copystr(t->name); (*pn)+= (m == nil ? 3 : 5); } else { /* No index. */ index= nil; } if (base == nil && index == nil) { /* Return a lone offset as is. */ e= offset; /* Lone registers tell operand size. */ if (offset->operator == 'W' && isregister(offset->name)) { switch (isregister(offset->name)) { case 1: optype= BYTE; break; case 2: optype= use16() ? WORD : OWORD; break; case 4: optype= use32() ? WORD : OWORD; break; } if (op_idx < arraysize(optypes)) optypes[op_idx++]= optype; } } else { e= new_expr(); e->operator= 'O'; e->left= offset; e->middle= base; e->right= index; } return e; } static expression_t *bas_get_oplist(int *pn) /* Get a comma (or colon for jmpf and callf) separated list of instruction * operands. */ { expression_t *e, *o1, *o2; token_t *t; if ((e= bas_get_operand(pn)) == nil) return nil; if ((t= get_token(*pn))->symbol == ',' || t->symbol == ':') { o1= e; (*pn)++; if ((o2= bas_get_oplist(pn)) == nil) { del_expr(o1); return nil; } e= new_expr(); e->operator= ','; e->left= o1; e->right= o2; } return e; } static asm86_t *bas_get_statement(void) /* Get a pseudo op or machine instruction with arguments. */ { token_t *t= get_token(0); asm86_t *a; mnemonic_t *m; int n; int prefix_seen; assert(t->type == T_WORD); if (strcmp(t->name, ".sect") == 0) { /* .sect .text etc. Accept only four segment names. */ skip_token(1); t= get_token(0); if (t->type != T_WORD || ( strcmp(t->name, ".text") != 0 && strcmp(t->name, ".rom") != 0 && strcmp(t->name, ".data") != 0 && strcmp(t->name, ".bss") != 0 && strcmp(t->name, ".end") != 0 )) { parse_err(1, t, "weird section name to .sect\n"); return nil; } } a= new_asm86(); /* Process instruction prefixes. */ for (prefix_seen= 0;; prefix_seen= 1) { if (strcmp(t->name, "rep") == 0 || strcmp(t->name, "repe") == 0 || strcmp(t->name, "repne") == 0 || strcmp(t->name, "repz") == 0 || strcmp(t->name, "repnz") == 0 ) { if (a->rep != ONCE) { parse_err(1, t, "can't have more than one rep\n"); } switch (t->name[3]) { case 0: a->rep= REP; break; case 'e': case 'z': a->rep= REPE; break; case 'n': a->rep= REPNE; break; } } else if (strcmp(t->name, "seg") == 0 && get_token(1)->type == T_WORD) { if (a->seg != DEFSEG) { parse_err(1, t, "can't have more than one segment prefix\n"); } switch (get_token(1)->name[0]) { case 'c': a->seg= CSEG; break; case 'd': a->seg= DSEG; break; case 'e': a->seg= ESEG; break; case 'f': a->seg= FSEG; break; case 'g': a->seg= GSEG; break; case 's': a->seg= SSEG; break; } skip_token(1); } else if (!prefix_seen) { /* No prefix here, get out! */ break; } else { /* No more prefixes, next must be an instruction. */ if (t->type != T_WORD || (m= search_mnem(t->name)) == nil || m->optype == PSEUDO ) { parse_err(1, t, "machine instruction expected after instruction prefix\n"); del_asm86(a); return nil; } break; } /* Skip the prefix and extra newlines. */ do { skip_token(1); } while ((t= get_token(0))->symbol == ';'); } /* All the readahead being done upsets the line counter. */ a->line= t->line; /* Read a machine instruction or pseudo op. */ if ((m= search_mnem(t->name)) == nil) { parse_err(1, t, "unknown instruction '%s'\n", t->name); del_asm86(a); return nil; } a->opcode= m->opcode; a->optype= m->optype; if (a->opcode == CBW || a->opcode == CWD) { a->optype= (strcmp(t->name, "cbw") == 0 || strcmp(t->name, "cwd") == 0) == use16() ? WORD : OWORD; } for (op_idx= 0; op_idx < arraysize(optypes); op_idx++) optypes[op_idx]= m->optype; op_idx= 0; n= 1; if (get_token(1)->symbol != ';' && (a->args= bas_get_oplist(&n)) == nil) { del_asm86(a); return nil; } if (m->optype == WORD) { /* Does one of the operands overide the optype? */ for (op_idx= 0; op_idx < arraysize(optypes); op_idx++) { if (optypes[op_idx] != m->optype) a->optype= optypes[op_idx]; } } if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage at end of instruction\n"); del_asm86(a); return nil; } switch (a->opcode) { case DOT_ALIGN: /* Restrict .align to have a single numeric argument, some * assemblers think of the argument as a power of two, so * we need to be able to change the value. */ if (strcmp(t->name, ".even") == 0 && a->args == nil) { /* .even becomes .align 2. */ expression_t *e; a->args= e= new_expr(); e->operator= 'W'; e->name= copystr("2"); e->len= 2; } if (a->args == nil || a->args->operator != 'W' || !isanumber(a->args->name)) { parse_err(1, t, ".align is restricted to one numeric argument\n"); del_asm86(a); return nil; } break; case MOVSX: case MOVZX: /* Types of both operands tell the instruction type. */ a->optype= optypes[0]; if (optypes[1] == BYTE) { a->opcode= a->opcode == MOVSX ? MOVSXB : MOVZXB; } break; case SAL: case SAR: case SHL: case SHR: case RCL: case RCR: case ROL: case ROR: /* Only the first operand tells the operand size. */ a->optype= optypes[0]; break; default:; } skip_token(n+1); return a; } asm86_t *bas_get_instruction(void) { asm86_t *a= nil; expression_t *e; token_t *t; while ((t= get_token(0))->symbol == ';') skip_token(1); if (t->type == T_EOF) return nil; if (t->symbol == '#') { /* Preprocessor line and file change. */ if ((t= get_token(1))->type != T_WORD || !isanumber(t->name) || get_token(2)->type != T_STRING ) { parse_err(1, t, "file not preprocessed?\n"); zap(); } else { set_file(get_token(2)->name, strtol(get_token(1)->name, nil, 0) - 1); /* GNU CPP adds extra cruft, simply zap the line. */ zap(); } a= bas_get_instruction(); } else if (t->type == T_WORD && get_token(1)->symbol == ':') { /* A label definition. */ a= new_asm86(); a->line= t->line; a->opcode= DOT_LABEL; a->optype= PSEUDO; a->args= e= new_expr(); e->operator= ':'; e->name= copystr(t->name); skip_token(2); } else if (t->type == T_WORD && get_token(1)->symbol == '=') { int n= 2; if ((e= bas_get_C_expression(&n)) == nil) { zap(); a= bas_get_instruction(); } else if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage after assignment\n"); zap(); a= bas_get_instruction(); } else { a= new_asm86(); a->line= t->line; a->opcode= DOT_EQU; a->optype= PSEUDO; a->args= new_expr(); a->args->operator= '='; a->args->name= copystr(t->name); a->args->middle= e; skip_token(n+1); } } else if (t->type == T_WORD && get_token(1)->type == T_WORD && strcmp(get_token(1)->name, "lcomm") == 0) { /* Local common block definition. */ int n= 2; if ((e= bas_get_C_expression(&n)) == nil) { zap(); a= bas_get_instruction(); } else if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage after lcomm\n"); zap(); a= bas_get_instruction(); } else { a= new_asm86(); a->line= t->line; a->opcode= DOT_LCOMM; a->optype= PSEUDO; a->args= new_expr(); a->args->operator= ','; a->args->right= e; a->args->left= e= new_expr(); e->operator= 'W'; e->name= copystr(t->name); e->len= strlen(e->name)+1; skip_token(n+1); } } else if (t->type == T_WORD) { if ((a= bas_get_statement()) == nil) { zap(); a= bas_get_instruction(); } } else { parse_err(1, t, "syntax error\n"); zap(); a= bas_get_instruction(); } if (a->optype == OWORD) { a->optype= WORD; a->oaz|= OPZ; } return a; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* parse_ack.c - parse GNU assembly Author: R.S. Veldema * <rveldema@cs.vu.nl> * 26 Aug 1996 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #include <assert.h> #include "asmconv.h" #include "token.h" #include "asm86.h" #include "languages.h" typedef struct mnemonic { /* GNU as86 mnemonics translation table. */ char *name; opcode_t opcode; optype_t optype; } mnemonic_t; static mnemonic_t mnemtab[] = { /* This array is sorted. */ { ".align", DOT_ALIGN, PSEUDO }, { ".ascii", DOT_ASCII, PSEUDO }, { ".asciz", DOT_ASCIZ, PSEUDO }, { ".assert", DOT_ASSERT, PSEUDO }, { ".base", DOT_BASE, PSEUDO }, { ".bss", DOT_BSS, PSEUDO }, { ".byte", DOT_DATA1, PSEUDO }, { ".comm", DOT_COMM, PSEUDO }, { ".data", DOT_DATA, PSEUDO }, { ".data1", DOT_DATA1, PSEUDO }, { ".data2", DOT_DATA2, PSEUDO }, { ".data4", DOT_DATA4, PSEUDO }, { ".end", DOT_END, PSEUDO }, { ".extern", DOT_EXTERN, PSEUDO }, { ".file", DOT_FILE, PSEUDO }, { ".globl", DOT_DEFINE, PSEUDO }, { ".lcomm", DOT_LCOMM, PSEUDO }, { ".line", DOT_LINE, PSEUDO }, { ".list", DOT_LIST, PSEUDO }, { ".long", DOT_DATA4, PSEUDO }, { ".nolist", DOT_NOLIST, PSEUDO }, { ".rom", DOT_ROM, PSEUDO }, { ".space", DOT_SPACE, PSEUDO }, { ".symb", DOT_SYMB, PSEUDO }, { ".text", DOT_TEXT, PSEUDO }, { ".word", DOT_DATA2, PSEUDO }, { "aaa", AAA, WORD }, { "aad", AAD, WORD }, { "aam", AAM, WORD }, { "aas", AAS, WORD }, { "adcb", ADC, BYTE }, { "adcl", ADC, WORD }, { "adcw", ADC, OWORD }, { "addb", ADD, BYTE }, { "addl", ADD, WORD }, { "addw", ADD, OWORD }, { "andb", AND, BYTE }, { "andl", AND, WORD }, { "andw", AND, OWORD }, { "arpl", ARPL, WORD }, { "bound", BOUND, WORD }, { "bsf", BSF, WORD }, { "bsr", BSR, WORD }, { "bswap", BSWAP, WORD }, { "btc", BTC, WORD }, { "btl", BT, WORD }, { "btr", BTR, WORD }, { "bts", BTS, WORD }, { "btw", BT, OWORD }, { "call", CALL, JUMP }, { "callf", CALLF, JUMP }, { "cbtw", CBW, OWORD }, { "cbw", CBW, WORD }, { "cdq", CWD, WORD }, { "clc", CLC, WORD }, { "cld", CLD, WORD }, { "cli", CLI, WORD }, { "cltd", CWD, WORD }, { "clts", CLTS, WORD }, { "cmc", CMC, WORD }, { "cmpb", CMP, BYTE }, { "cmpl", CMP, WORD }, { "cmps", CMPS, WORD }, { "cmpsb", CMPS, BYTE }, { "cmpw", CMP, OWORD }, { "cmpxchg", CMPXCHG, WORD }, { "cwd", CWD, WORD }, { "cwde", CBW, WORD }, { "cwtd", CWD, OWORD }, { "cwtl", CBW, WORD }, { "daa", DAA, WORD }, { "das", DAS, WORD }, { "decb", DEC, BYTE }, { "decl", DEC, WORD }, { "decw", DEC, OWORD }, { "divb", DIV, BYTE }, { "divl", DIV, WORD }, { "divw", DIV, OWORD }, { "enter", ENTER, WORD }, { "f2xm1", F2XM1, WORD }, { "fabs", FABS, WORD }, { "fadd", FADD, WORD }, { "faddd", FADDD, WORD }, { "faddp", FADDP, WORD }, { "fadds", FADDS, WORD }, { "fbld", FBLD, WORD }, { "fbstp", FBSTP, WORD }, { "fchs", FCHS, WORD }, { "fcomd", FCOMD, WORD }, { "fcompd", FCOMPD, WORD }, { "fcompp", FCOMPP, WORD }, { "fcomps", FCOMPS, WORD }, { "fcoms", FCOMS, WORD }, { "fcos", FCOS, WORD }, { "fdecstp", FDECSTP, WORD }, { "fdivd", FDIVD, WORD }, { "fdivp", FDIVP, WORD }, { "fdivrd", FDIVRD, WORD }, { "fdivrp", FDIVRP, WORD }, { "fdivrs", FDIVRS, WORD }, { "fdivs", FDIVS, WORD }, { "ffree", FFREE, WORD }, { "fiaddl", FIADDL, WORD }, { "fiadds", FIADDS, WORD }, { "ficom", FICOM, WORD }, { "ficomp", FICOMP, WORD }, { "fidivl", FIDIVL, WORD }, { "fidivrl", FIDIVRL, WORD }, { "fidivrs", FIDIVRS, WORD }, { "fidivs", FIDIVS, WORD }, { "fildl", FILDL, WORD }, { "fildq", FILDQ, WORD }, { "filds", FILDS, WORD }, { "fimull", FIMULL, WORD }, { "fimuls", FIMULS, WORD }, { "fincstp", FINCSTP, WORD }, { "fistl", FISTL, WORD }, { "fistp", FISTP, WORD }, { "fists", FISTS, WORD }, { "fisubl", FISUBL, WORD }, { "fisubrl", FISUBRL, WORD }, { "fisubrs", FISUBRS, WORD }, { "fisubs", FISUBS, WORD }, { "fld1", FLD1, WORD }, { "fldcw", FLDCW, WORD }, { "fldd", FLDD, WORD }, { "fldenv", FLDENV, WORD }, { "fldl2e", FLDL2E, WORD }, { "fldl2t", FLDL2T, WORD }, { "fldlg2", FLDLG2, WORD }, { "fldln2", FLDLN2, WORD }, { "fldpi", FLDPI, WORD }, { "flds", FLDS, WORD }, { "fldx", FLDX, WORD }, { "fldz", FLDZ, WORD }, { "fmuld", FMULD, WORD }, { "fmulp", FMULP, WORD }, { "fmuls", FMULS, WORD }, { "fnclex", FCLEX, WORD }, { "fninit", FINIT, WORD }, { "fnop", FNOP, WORD }, { "fnsave", FSAVE, WORD }, { "fnstcw", FSTCW, WORD }, { "fnstenv", FSTENV, WORD }, { "fpatan", FPATAN, WORD }, { "fprem", FPREM, WORD }, { "fprem1", FPREM1, WORD }, { "fptan", FPTAN, WORD }, { "frndint", FRNDINT, WORD }, { "frstor", FRSTOR, WORD }, { "fscale", FSCALE, WORD }, { "fsin", FSIN, WORD }, { "fsincos", FSINCOS, WORD }, { "fsqrt", FSQRT, WORD }, { "fstd", FSTD, WORD }, { "fstpd", FSTPD, WORD }, { "fstps", FSTPS, WORD }, { "fstpx", FSTPX, WORD }, { "fsts", FSTS, WORD }, { "fstsw", FSTSW, WORD }, { "fsubd", FSUBD, WORD }, { "fsubp", FSUBP, WORD }, { "fsubpr", FSUBPR, WORD }, { "fsubrd", FSUBRD, WORD }, { "fsubrs", FSUBRS, WORD }, { "fsubs", FSUBS, WORD }, { "ftst", FTST, WORD }, { "fucom", FUCOM, WORD }, { "fucomp", FUCOMP, WORD }, { "fucompp", FUCOMPP, WORD }, { "fxam", FXAM, WORD }, { "fxch", FXCH, WORD }, { "fxtract", FXTRACT, WORD }, { "fyl2x", FYL2X, WORD }, { "fyl2xp1", FYL2XP1, WORD }, { "hlt", HLT, WORD }, { "idivb", IDIV, BYTE }, { "idivl", IDIV, WORD }, { "idivw", IDIV, OWORD }, { "imulb", IMUL, BYTE }, { "imull", IMUL, WORD }, { "imulw", IMUL, OWORD }, { "inb", IN, BYTE }, { "incb", INC, BYTE }, { "incl", INC, WORD }, { "incw", INC, OWORD }, { "inl", IN, WORD }, { "insb", INS, BYTE }, { "insl", INS, WORD }, { "insw", INS, OWORD }, { "int", INT, WORD }, { "into", INTO, JUMP }, { "invd", INVD, WORD }, { "invlpg", INVLPG, WORD }, { "inw", IN, OWORD }, { "iret", IRET, JUMP }, { "iretd", IRETD, JUMP }, { "ja", JA, JUMP }, { "jae", JAE, JUMP }, { "jb", JB, JUMP }, { "jbe", JBE, JUMP }, { "jc", JB, JUMP }, { "jcxz", JCXZ, JUMP }, { "je", JE, JUMP }, { "jecxz", JCXZ, JUMP }, { "jg", JG, JUMP }, { "jge", JGE, JUMP }, { "jl", JL, JUMP }, { "jle", JLE, JUMP }, { "jmp", JMP, JUMP }, { "jmpf", JMPF, JUMP }, { "jna", JBE, JUMP }, { "jnae", JB, JUMP }, { "jnb", JAE, JUMP }, { "jnbe", JA, JUMP }, { "jnc", JAE, JUMP }, { "jne", JNE, JUMP }, { "jng", JLE, JUMP }, { "jnge", JL, JUMP }, { "jnl", JGE, JUMP }, { "jnle", JG, JUMP }, { "jno", JNO, JUMP }, { "jnp", JNP, JUMP }, { "jns", JNS, JUMP }, { "jnz", JNE, JUMP }, { "jo", JO, JUMP }, { "jp", JP, JUMP }, { "js", JS, JUMP }, { "jz", JE, JUMP }, { "lahf", LAHF, WORD }, { "lar", LAR, WORD }, { "lds", LDS, WORD }, { "leal", LEA, WORD }, { "leave", LEAVE, WORD }, { "leaw", LEA, OWORD }, { "les", LES, WORD }, { "lfs", LFS, WORD }, { "lgdt", LGDT, WORD }, { "lgs", LGS, WORD }, { "lidt", LIDT, WORD }, { "lldt", LLDT, WORD }, { "lmsw", LMSW, WORD }, { "lock", LOCK, WORD }, { "lods", LODS, WORD }, { "lodsb", LODS, BYTE }, { "loop", LOOP, JUMP }, { "loope", LOOPE, JUMP }, { "loopne", LOOPNE, JUMP }, { "loopnz", LOOPNE, JUMP }, { "loopz", LOOPE, JUMP }, { "lsl", LSL, WORD }, { "lss", LSS, WORD }, { "ltr", LTR, WORD }, { "movb", MOV, BYTE }, { "movl", MOV, WORD }, { "movsb", MOVS, BYTE }, { "movsbl", MOVSXB, WORD }, { "movsbw", MOVSXB, OWORD }, { "movsl", MOVS, WORD }, { "movsw", MOVS, OWORD }, { "movswl", MOVSX, WORD }, { "movw", MOV, OWORD }, { "movzbl", MOVZXB, WORD }, { "movzbw", MOVZXB, OWORD }, { "movzwl", MOVZX, WORD }, { "mulb", MUL, BYTE }, { "mull", MUL, WORD }, { "mulw", MUL, OWORD }, { "negb", NEG, BYTE }, { "negl", NEG, WORD }, { "negw", NEG, OWORD }, { "nop", NOP, WORD }, { "notb", NOT, BYTE }, { "notl", NOT, WORD }, { "notw", NOT, OWORD }, { "orb", OR, BYTE }, { "orl", OR, WORD }, { "orw", OR, OWORD }, { "outb", OUT, BYTE }, { "outl", OUT, WORD }, { "outsb", OUTS, BYTE }, { "outsl", OUTS, WORD }, { "outsw", OUTS, DE��FE��GE��HE��IE��JE��KE��LE��ME��NE��OE��PE��QE��RE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� OWORD }, { "outw", OUT, OWORD }, { "pop", POP, WORD }, { "popa", POPA, WORD }, { "popad", POPA, WORD }, { "popf", POPF, WORD }, { "popl", POP, WORD }, { "push", PUSH, WORD }, { "pusha", PUSHA, WORD }, { "pushad", PUSHA, WORD }, { "pushf", PUSHF, WORD }, { "pushl", PUSH, WORD }, { "rclb", RCL, BYTE }, { "rcll", RCL, WORD }, { "rclw", RCL, OWORD }, { "rcrb", RCR, BYTE }, { "rcrl", RCR, WORD }, { "rcrw", RCR, OWORD }, { "ret", RET, JUMP }, { "retf", RETF, JUMP }, { "rolb", ROL, BYTE }, { "roll", ROL, WORD }, { "rolw", ROL, OWORD }, { "rorb", ROR, BYTE }, { "rorl", ROR, WORD }, { "rorw", ROR, OWORD }, { "sahf", SAHF, WORD }, { "salb", SAL, BYTE }, { "sall", SAL, WORD }, { "salw", SAL, OWORD }, { "sarb", SAR, BYTE }, { "sarl", SAR, WORD }, { "sarw", SAR, OWORD }, { "sbbb", SBB, BYTE }, { "sbbl", SBB, WORD }, { "sbbw", SBB, OWORD }, { "scasb", SCAS, BYTE }, { "scasl", SCAS, WORD }, { "scasw", SCAS, OWORD }, { "seta", SETA, BYTE }, { "setae", SETAE, BYTE }, { "setb", SETB, BYTE }, { "setbe", SETBE, BYTE }, { "sete", SETE, BYTE }, { "setg", SETG, BYTE }, { "setge", SETGE, BYTE }, { "setl", SETL, BYTE }, { "setna", SETBE, BYTE }, { "setnae", SETB, BYTE }, { "setnb", SETAE, BYTE }, { "setnbe", SETA, BYTE }, { "setne", SETNE, BYTE }, { "setng", SETLE, BYTE }, { "setnge", SETL, BYTE }, { "setnl", SETGE, BYTE }, { "setnle", SETG, BYTE }, { "setno", SETNO, BYTE }, { "setnp", SETNP, BYTE }, { "setns", SETNS, BYTE }, { "seto", SETO, BYTE }, { "setp", SETP, BYTE }, { "sets", SETS, BYTE }, { "setz", SETE, BYTE }, { "sgdt", SGDT, WORD }, { "shlb", SHL, BYTE }, { "shldl", SHLD, WORD }, { "shll", SHL, WORD }, { "shlw", SHL, OWORD }, { "shrb", SHR, BYTE }, { "shrdl", SHRD, WORD }, { "shrl", SHR, WORD }, { "shrw", SHR, OWORD }, { "sidt", SIDT, WORD }, { "sldt", SLDT, WORD }, { "smsw", SMSW, WORD }, { "stc", STC, WORD }, { "std", STD, WORD }, { "sti", STI, WORD }, { "stosb", STOS, BYTE }, { "stosl", STOS, WORD }, { "stosw", STOS, OWORD }, { "str", STR, WORD }, { "subb", SUB, BYTE }, { "subl", SUB, WORD }, { "subw", SUB, OWORD }, { "testb", TEST, BYTE }, { "testl", TEST, WORD }, { "testw", TEST, OWORD }, { "verr", VERR, WORD }, { "verw", VERW, WORD }, { "wait", WAIT, WORD }, { "wbinvd", WBINVD, WORD }, { "xadd", XADD, WORD }, { "xchgb", XCHG, BYTE }, { "xchgl", XCHG, WORD }, { "xchgw", XCHG, OWORD }, { "xlat", XLAT, WORD }, { "xorb", XOR, BYTE }, { "xorl", XOR, WORD }, { "xorw", XOR, OWORD }, }; void gnu_parse_init(char *file) /* Prepare parsing of an GNU assembly file. */ { tok_init(file, '#'); } static void zap(void) /* An error, zap the rest of the line. */ { token_t *t; while ((t= get_token(0))->type != T_EOF && t->symbol != ';') skip_token(1); } static mnemonic_t *search_mnem(char *name) /* Binary search for a mnemonic. (That's why the table is sorted.) */ { int low, mid, high; int cmp; mnemonic_t *m; low= 0; high= arraysize(mnemtab)-1; while (low <= high) { mid= (low + high) / 2; m= &mnemtab[mid]; if ((cmp= strcmp(name, m->name)) == 0) return m; if (cmp < 0) high= mid-1; else low= mid+1; } return nil; } static expression_t *gnu_get_C_expression(int *pn) /* Read a "C-like" expression. Note that we don't worry about precedence, * the expression is printed later like it is read. If the target language * does not have all the operators (like ~) then this has to be repaired by * changing the source file. (No problem, you still have one source file * to maintain, not two.) */ { expression_t *e, *a1, *a2; token_t *t; if ((t= get_token(*pn))->symbol == '(') { /* ( expr ): grouping. */ (*pn)++; if ((a1= gnu_get_C_expression(pn)) == nil) return nil; if (get_token(*pn)->symbol != ')') { parse_err(1, t, "missing )\n"); del_expr(a1); return nil; } (*pn)++; e= new_expr(); e->operator= '['; e->middle= a1; } else if (t->type == T_WORD || t->type == T_STRING) { /* Label, number, or string. */ e= new_expr(); e->operator= t->type == T_WORD ? 'W' : 'S'; e->name= allocate(nil, (t->len+1) * sizeof(e->name[0])); memcpy(e->name, t->name , t->len+1); e->len= t->len; (*pn)++; } else if (t->symbol == '+' || t->symbol == '-' || t->symbol == '~') { /* Unary operator. */ (*pn)++; if ((a1= gnu_get_C_expression(pn)) == nil) return nil; e= new_expr(); e->operator= t->symbol; e->middle= a1; } else { parse_err(1, t, "expression syntax error\n"); return nil; } switch ((t= get_token(*pn))->symbol) { case '%': case '+': case '-': case '*': case '/': case '&': case '|': case '^': case S_LEFTSHIFT: case S_RIGHTSHIFT: (*pn)++; a1= e; if ((a2= gnu_get_C_expression(pn)) == nil) { del_expr(a1); return nil; } e= new_expr(); e->operator= t->symbol; e->left= a1; e->right= a2; } return e; } static expression_t *gnu_get_operand(int *pn, int deref) /* Get something like: $immed, memory, offset(%base,%index,scale), or simpler. */ { expression_t *e, *offset, *base, *index; token_t *t; int c; if (get_token(*pn)->symbol == '$') { /* An immediate value. */ (*pn)++; return gnu_get_C_expression(pn); } if (get_token(*pn)->symbol == '*') { /* Indirection. */ (*pn)++; if ((offset= gnu_get_operand(pn, deref)) == nil) return nil; e= new_expr(); e->operator= '('; e->middle= offset; return e; } if ((get_token(*pn)->symbol == '%') && (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) ) { /* A register operand. */ (*pn)+= 2; e= new_expr(); e->operator= 'W'; e->name= copystr(t->name); return e; } /* Offset? */ if (get_token(*pn)->symbol != '(' || get_token(*pn + 1)->symbol != '%') { /* There is an offset. */ if ((offset= gnu_get_C_expression(pn)) == nil) return nil; } else { /* No offset. */ offset= nil; } /* (%base,%index,scale) ? */ base= index= nil; if (get_token(*pn)->symbol == '(') { (*pn)++; /* %base ? */ if (get_token(*pn)->symbol == '%' && (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) ) { /* A base register expression. */ base= new_expr(); base->operator= 'B'; base->name= copystr(t->name); (*pn)+= 2; } if (get_token(*pn)->symbol == ',') (*pn)++; /* %index ? */ if (get_token(*pn)->symbol == '%' && (t= get_token(*pn + 1))->type == T_WORD && isregister(t->name) ) { /* A index register expression. */ index= new_expr(); index->operator= '1'; /* for now */ index->name= copystr(t->name); (*pn)+= 2; } if (get_token(*pn)->symbol == ',') (*pn)++; /* scale ? */ if ((base != nil || index != nil) && (t= get_token(*pn))->type == T_WORD && strchr("1248", t->name[0]) != nil && t->name[1] == 0 ) { if (index == nil) { /* Base is really an index register. */ index= base; base= nil; } index->operator= t->name[0]; (*pn)++; } if (get_token(*pn)->symbol == ')') { /* Ending paren. */ (*pn)++; } else { /* Alas. */ parse_err(1, t, "operand syntax error\n"); del_expr(offset); del_expr(base); del_expr(index); return nil; } } if (base == nil && index == nil) { if (deref) { /* Return a lone offset as (offset). */ e= new_expr(); e->operator= '('; e->middle= offset; } else { /* Return a lone offset as is. */ e= offset; } } else { e= new_expr(); e->operator= 'O'; e->left= offset; e->middle= base; e->right= index; } return e; } static expression_t *gnu_get_oplist(int *pn, int deref) /* Get a comma (or colon for jmpf and callf) separated list of instruction * operands. */ { expression_t *e, *o1, *o2; token_t *t; if ((e= gnu_get_operand(pn, deref)) == nil) return nil; if ((t= get_token(*pn))->symbol == ',' || t->symbol == ':') { o1= e; (*pn)++; if ((o2= gnu_get_oplist(pn, deref)) == nil) { del_expr(o1); return nil; } e= new_expr(); e->operator= ','; e->left= o1; e->right= o2; } return e; } static asm86_t *gnu_get_statement(void) /* Get a pseudo op or machine instruction with arguments. */ { token_t *t= get_token(0); asm86_t *a; mnemonic_t *m; int n; int prefix_seen; int deref; assert(t->type == T_WORD); a= new_asm86(); /* Process instruction prefixes. */ for (prefix_seen= 0;; prefix_seen= 1) { if (strcmp(t->name, "rep") == 0 || strcmp(t->name, "repe") == 0 || strcmp(t->name, "repne") == 0 || strcmp(t->name, "repz") == 0 || strcmp(t->name, "repnz") == 0 ) { if (a->rep != ONCE) { parse_err(1, t, "can't have more than one rep\n"); } switch (t->name[3]) { case 0: a->rep= REP; break; case 'e': case 'z': a->rep= REPE; break; case 'n': a->rep= REPNE; break; } } else if (!prefix_seen) { /* No prefix here, get out! */ break; } else { /* No more prefixes, next must be an instruction. */ if (t->type != T_WORD || (m= search_mnem(t->name)) == nil || m->optype == PSEUDO ) { parse_err(1, t, "machine instruction expected after instruction prefix\n"); del_asm86(a); return nil; } break; } /* Skip the prefix and extra newlines. */ do { skip_token(1); } while ((t= get_token(0))->symbol == ';'); } /* All the readahead being done upsets the line counter. */ a->line= t->line; /* Read a machine instruction or pseudo op. */ if ((m= search_mnem(t->name)) == nil) { parse_err(1, t, "unknown instruction '%s'\n", t->name); del_asm86(a); return nil; } a->opcode= m->opcode; a->optype= m->optype; a->oaz= 0; if (a->optype == OWORD) { a->oaz|= OPZ; a->optype= WORD; } switch (a->opcode) { case IN: case OUT: case INT: deref= 0; break; default: deref= (a->optype >= BYTE); } n= 1; if (get_token(1)->symbol != ';' && (a->args= gnu_get_oplist(&n, deref)) == nil) { del_asm86(a); return nil; } if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage at end of instruction\n"); del_asm86(a); return nil; } if (!is_pseudo(a->opcode)) { /* GNU operand order is the other way around. */ expression_t *e, *t; e= a->args; while (e != nil && e->operator == ',') { t= e->right; e->right= e->left; e->left= t; e= e->left; } } switch (a->opcode) { case DOT_ALIGN: /* Delete two argument .align, because ACK can't do it. * Raise 2 to the power of .align's argument. */ if (a->args == nil || a->args->operator != 'W') { del_asm86(a); return nil; } if (a->args != nil && a->args->operator == 'W' && isanumber(a->args->name) ) { unsigned n; char num[sizeof(int) * CHAR_BIT / 3 + 1]; n= 1 << strtoul(a->args->name, nil, 0); sprintf(num, "%u", n); deallocate(a->args->name); a->args->name= copystr(num); } break; case JMPF: case CALLF: /*FALL THROUGH*/ case JMP: case CALL: break; default:; } skip_token(n+1); return a; } asm86_t *gnu_get_instruction(void) { asm86_t *a= nil; expression_t *e; token_t *t; while ((t= get_token(0))->symbol == ';' || t->symbol == '/') { zap(); /* if a comment started by a '/' */ skip_token(1); } if (t->type == T_EOF) return nil; if (t->symbol == '#') { /* Preprocessor line and file change. */ if ((t= get_token(1))->type != T_WORD || !isanumber(t->name) || get_token(2)->type != T_STRING ) { parse_err(1, t, "file not preprocessed?\n"); zap(); } else { set_file(get_token(2)->name, strtol(get_token(1)->name, nil, 0) - 1); /* GNU CPP adds extra cruft, simply zap the line. */ zap(); } a= gnu_get_instruction(); } else if (t->type == T_WORD && get_token(1)->symbol == ':') { /* A label definition. */ a= new_asm86(); a->line= t->line; a->opcode= DOT_LABEL; a->optype= PSEUDO; a->args= e= new_expr(); e->operator= ':'; e->name= copystr(t->name); skip_token(2); } else if (t->type == T_WORD && get_token(1)->symbol == '=') { int n= 2; if ((e= gnu_get_C_expression(&n)) == nil) { zap(); a= gnu_get_instruction(); } else if (get_token(n)->symbol != ';') { parse_err(1, t, "garbage after assignment\n"); zap(); a= gnu_get_instruction(); } else { a= new_asm86(); a->line= t->line; a->opcode= DOT_EQU; a->optype= PSEUDO; a->args= new_expr(); a->args->operator= '='; a->args->name= copystr(t->name); a->args->middle= e; skip_token(n+1); } } else if (t->type == T_WORD) { if ((a= gnu_get_statement()) == nil) { zap(); a= gnu_get_instruction(); } } else { parse_err(1, t, "syntax error\n"); zap(); a= gnu_get_instruction(); } return a; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������asmprog: comment ? statement asmprog ; asmprog asmprog comment ? \n asmprog letter: [._a-zA-Z] digit: [0-9] identifier: letter (letter | digit)* digit [bf] string: 'C-like string sequence' "C-like string sequence" number: C-like number comment: ! .* statement: label-definition statement empty assignment instruction pseudo-instruction label-definition: identifier : digit : assignment: identifier = expression instruction: iX86-instruction pseudo-instruction: .extern identifier (, identifier)* .define identifier (, identifier)* .data1 expression (, expression)* .data2 expression (, expression)* .data4 expression (, expression)* .ascii string .asciz string .align expression .space expression .comm identifier , expression .sect identifier .base expression .assert expression .symb XXX .line XXX .file XXX .nolist .list iX86-pseudo expression: C-like expression with [ and ] for grouping iX86-instruction: prefix prefix iX86-instruction identifier identifier iX86operand identifier iX86operand , iX86operand identifier iX86operand : iX86operand prefix: o16 o32 a16 a32 rep repz repnz repe repne cseg | dseg | eseg | fseg | gseg | sseg iX86operand: register ( register ) expression ( expression ) expression ( register ) expression ( register * [1248] ) expression ? ( register ) ( register ) expression ? ( register ) ( register * [1248] ) register: al | bl | cl | dl | ah | bh | ch | dh ax | bx | cx | dx | si | di | bp | sp eax | ebx | ecx | edx | esi | edi | ebp | esp cs | ds | es | fs | gs | ss cr0 | cr1 | cr2 | cr3 iX86-pseudo: .use16 .use32 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* token.h - token definition Author: Kees J. Bot * 13 Dec 1993 */ typedef enum toktype { T_EOF, T_CHAR, T_WORD, T_STRING } toktype_t; typedef struct token { struct token *next; long line; toktype_t type; int symbol; /* Single character symbol. */ char *name; /* Word, number, etc. */ size_t len; /* Length of string. */ } token_t; #define S_LEFTSHIFT 0x100 /* << */ #define S_RIGHTSHIFT 0x101 /* >> */ void set_file(char *file, long line); void get_file(char **file, long *line); void parse_err(int err, token_t *where, const char *fmt, ...); void tok_init(char *file, int comment); token_t *get_token(int n); void skip_token(int n); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tokenize.c - split input into tokens Author: Kees J. Bot * 13 Dec 1993 */ #define nil 0 #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "asmconv.h" #include "token.h" static FILE *tf; static char *tfile; static char *orig_tfile; static int tcomment; static int tc; static long tline; static token_t *tq; static void readtc(void) /* Read one character from the input file and put it in the global 'tc'. */ { static int nl= 0; if (nl) tline++; if ((tc= getc(tf)) == EOF && ferror(tf)) fatal(orig_tfile); nl= (tc == '\n'); } void set_file(char *file, long line) /* Set file name and line number, changed by a preprocessor trick. */ { deallocate(tfile); tfile= allocate(nil, (strlen(file) + 1) * sizeof(tfile[0])); strcpy(tfile, file); tline= line; } void get_file(char **file, long *line) /* Get file name and line number. */ { *file= tfile; *line= tline; } void parse_err(int err, token_t *t, const char *fmt, ...) /* Report a parsing error. */ { va_list ap; fprintf(stderr, "\"%s\", line %ld: ", tfile, t == nil ? tline : t->line); va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); if (err) set_error(); } void tok_init(char *file, int comment) /* Open the file to tokenize and initialize the tokenizer. */ { if (file == nil) { file= "stdin"; tf= stdin; } else { if ((tf= fopen(file, "r")) == nil) fatal(file); } orig_tfile= file; set_file(file, 1); readtc(); tcomment= comment; } static int isspace(int c) { return between('\0', c, ' ') && c != '\n'; } #define iscomment(c) ((c) == tcomment) static int isidentchar(int c) { return between('a', c, 'z') || between('A', c, 'Z') || between('0', c, '9') || c == '.' || c == '_' ; } static token_t *new_token(void) { token_t *new; new= allocate(nil, sizeof(*new)); new->next= nil; new->line= tline; new->name= nil; new->symbol= -1; return new; } static token_t *get_word(void) /* Read one word, an identifier, a number, a label, or a mnemonic. */ { token_t *w; char *name; size_t i, len; i= 0; len= 16; name= allocate(nil, len * sizeof(name[0])); while (isidentchar(tc)) { name[i++]= tc; readtc(); if (i == len) name= allocate(name, (len*= 2) * sizeof(name[0])); } name[i]= 0; name= allocate(name, (i+1) * sizeof(name[0])); w= new_token(); w->type= T_WORD; w->name= name; w->len= i; return w; } static token_t *get_string(void) /* Read a single or double quotes delimited string. */ { token_t *s; int quote; char *str; size_t i, len; int n, j; int seen; quote= tc; readtc(); i= 0; len= 16; str= allocate(nil, len * sizeof(str[0])); while (tc != quote && tc != '\n' && tc != EOF) { seen= -1; if (tc == '\\') { readtc(); if (tc == '\n' || tc == EOF) break; switch (tc) { case 'a': tc= '\a'; break; case 'b': tc= '\b'; break; case 'f': tc= '\f'; break; case 'n': tc= '\n'; break; case 'r': tc= '\r'; break; case 't': tc= '\t'; break; case 'v': tc= '\v'; break; case 'x': n= 0; for (j= 0; j < 3; j++) { readtc(); if (between('0', tc, '9')) tc-= '0' + 0x0; else if (between('A', tc, 'A')) tc-= 'A' + 0xA; else if (between('a', tc, 'a')) tc-= 'a' + 0xa; else { seen= tc; break; } n= n*0x10 + tc; } tc= n; break; default: if (!between('0', tc, '9')) break; n= 0; for (j= 0; j < 3; j++) { if (between('0', tc, '9')) tc-= '0'; else { seen= tc; break; } n= n*010 + tc; readtc(); } tc= n; } } str[i++]= tc; if (i == len) str= allocate(str, (len*= 2) * sizeof(str[0])); if (seen < 0) readtc(); else tc= seen; } if (tc == quote) { readtc(); } else { parse_err(1, nil, "string contains newline\n"); } str[i]= 0; str= allocate(str, (i+1) * sizeof(str[0])); s= new_token(); s->type= T_STRING; s->name= str; s->len= i; return s; } static int old_n= 0; /* To speed up n, n+1, n+2, ... accesses. */ static token_t **old_ptq= &tq; token_t *get_token(int n) /* Return the n-th token on the input queue. */ { token_t *t, **ptq; assert(n >= 0); if (0 && n >= old_n) { /* Go forward from the previous point. */ n-= old_n; old_n+= n; ptq= old_ptq; } else { /* Restart from the head of the queue. */ old_n= n; ptq= &tq; } for (;;) { if ((t= *ptq) == nil) { /* Token queue doesn't have element <n>, read a * new token from the input stream. */ while (isspace(tc) || iscomment(tc)) { if (iscomment(tc)) { while (tc != '\n' && tc != EOF) readtc(); } else { readtc(); } } if (tc == EOF) { t= new_token(); t->type= T_EOF; } else if (isidentchar(tc)) { t= get_word(); } else if (tc == '\'' || tc == '"') { t= get_string(); } else { if (tc == '\n') tc= ';'; t= new_token(); t->type= T_CHAR; t->symbol= tc; readtc(); if (t->symbol == '<' && tc == '<') { t->symbol= S_LEFTSHIFT; readtc(); } else if (t->symbol == '>' && tc == '>') { t->symbol= S_RIGHTSHIFT; readtc(); } } *ptq= t; } if (n == 0) break; n--; ptq= &t->next; } old_ptq= ptq; return t; } void skip_token(int n) /* Remove n tokens from the input queue. One is not allowed to skip unread * tokens. */ { token_t *junk; assert(n >= 0); while (n > 0) { assert(tq != nil); junk= tq; tq= tq->next; deallocate(junk->name); deallocate(junk); n--; } /* Reset the old reference. */ old_n= 0; old_ptq= &tq; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .������������� ..������������ COPYING������� README�������� vfat.h�������� Makefile������ direntry.c���� fat_free.c���� file.h�������� mainloop.h���� mtoolsDirent.h buffer.c������ buffer.h������ codepage.h���� config.c������ config.h������ copyfile.c���� devices.c����� devices.h����� dirCache.c���� dirCache.h���� directory.c��� expand.c������ fat.c��������� file.c�������� file_name.c��� file_read.c��� filter.c������ floppyd_io.c�� floppyd_io.h�� force_io.c���� fs.h���������� fsP.h��������� hash.c�������� htable.h������ init.c�������� llong.c������� llong.h������� mainloop.c���� match.c������� mattrib.c����� mbadblocks.c�� mcat.c�������� mcd.c��������� mcopy.c�������� mdel.c�������� mdir.c�������� mdoctorfat.c�� mdu.c��������� mformat.c����� minfo.c������� misc.c�������� missFuncs.c��� mk_direntry.c� mlabel.c������ mmd.c��������� mmount.c������ mmove.c������� mpartition.c�� msdos.h������� mshowfat.c���� mtools.c������ mtools.h������ mtoolsPaths.h�Copyright (C) 1995 Alain Knaff. You may use, distribute and copy this program according to the terms of the GNU General Public License version 2 or later. Alain Knaff ---------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received thdE��fE��gE��hE��iE��jE��kE��lE��mE��nE��oE����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������e program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. <one line to give the program's name and a brief idea of what it does.> Copyright (C) 19yy <name of author> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. <signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Compilation ----------- Type 'make install'. This package has been heavily modified for Minix, and then minimized to only those files needed for Minix. Don't use this as a basis for anything else, get the original package instead. -- kjb Doc --- The most uptodate doc of this package is the texinfo doc. Type 'make info' to get online info doc, and 'make dvi ; dvips mtools.dvi' to get a printed copy. The info doc has a concept index. Make use of it. You may get an info copy using the following command 'make info'. This can then be viewed using emacs' info mode, or using a standalone info viewer. Man pages are still present, but contain less information, and are less uptodate than the texinfo documentation. If you do not have the necessary tools to view the texinfo doc, you may also find it on the Workd Wide Web at the following locations: http://mtools.linux.lu/mtools_toc.html http://www.tux.org/pub/knaff/mtools/mtools_toc.html Compiler -------- Mtools should be compiled with an Ansi compiler, preferably gcc Authors ------- Original code (versions through 2.0.7?) by Emmet P. Gray (Texas, USA), who no longer appears to be reachable by Internet e-mail. Viktor Dukhovni (at Princeton, USA) had major input into v2.0. Since 2.0.7: maintained primarily and until now informally by Alain Knaff (Luxembourg) and David Niemi (Reston, Virginia, USA). Please report bugs to the mtools mailing list at mtools@www.tux.org. Before reporting any problems, check whether they have already been fixed in the Alpha patches at http://mtools.linux.lu and http://www.tux.org/pub/knaff You may subscribe to the mtools mailing list by sending a message containing 'subscribe mtools' in its body to majordomo@www.tux.org Current Status -------------- Stable release 3.3. ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_VFAT_H #define MTOOLS_VFAT_H #include "msdos.h" /* * VFAT-related common header file */ #define VFAT_SUPPORT struct unicode_char { char lchar; char uchar; }; /* #define MAX_VFAT_SUBENTRIES 32 */ /* Theoretical max # of VSEs */ #define MAX_VFAT_SUBENTRIES 20 /* Max useful # of VSEs */ #define VSE_NAMELEN 13 #define VSE1SIZE 5 #define VSE2SIZE 6 #define VSE3SIZE 2 #include "stream.h" struct vfat_subentry { unsigned char id; /* 0x40 = last; & 0x1f = VSE ID */ struct unicode_char text1[VSE1SIZE] PACKED; unsigned char attribute; /* 0x0f for VFAT */ unsigned char hash1; /* Always 0? */ unsigned char sum; /* Checksum of short name */ struct unicode_char text2[VSE2SIZE] PACKED; unsigned char sector_l; /* 0 for VFAT */ unsigned char sector_u; /* 0 for VFAT */ struct unicode_char text3[VSE3SIZE] PACKED; }; /* Enough size for a worst case number of full VSEs plus a null */ #define VBUFSIZE ((MAX_VFAT_SUBENTRIES*VSE_NAMELEN) + 1) /* Max legal length of a VFAT long name */ #define MAX_VNAMELEN (255) #define VSE_PRESENT 0x01 #define VSE_LAST 0x40 #define VSE_MASK 0x1f struct vfat_state { char name[VBUFSIZE]; int status; /* is now a bit map of 32 bits */ int subentries; unsigned char sum; /* no need to remember the sum for each entry, * it is the same anyways */ int present; }; struct scan_state { int match_free; int shortmatch; int longmatch; int free_start; int free_end; int slot; int got_slots; int size_needed; int max_entry; }; #include "mtoolsDirent.h" void clear_vfat(struct vfat_state *); int unicode_write(char *, struct unicode_char *, int num, int *end); int clear_vses(Stream_t *, int, size_t); void autorename_short(char *, int); void autorename_long(char *, int); int lookupForInsert(Stream_t *Dir, char *dosname, char *longname, struct scan_state *ssp, int ignore_entry, int source_entry, int pessimisticShortRename); #define DO_OPEN 1 /* open all files that are found */ #define ACCEPT_LABEL 0x08 #define ACCEPT_DIR 0x10 #define ACCEPT_PLAIN 0x20 #define MATCH_ANY 0x40 #define NO_MSG 0x80 #define NO_DOTS 0x100 /* accept no dots if matched by wildcard */ #define DO_OPEN_DIRS 0x400 /* open all directories that are found */ #define OPEN_PARENT 0x1000 /* in target lookup, open parent * instead of file itself */ #define NO_UNIX 0x2000 /* in target lookup, consider all files to reside on * the DOS fs */ #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Generated automatically from Makefile.in by configure. # # Makefile for Mtools # # check the Configure file for some examples of device-specific setups # Berkeley flavors of Unix should include -DBSD in the CFLAGS. Pick # a lock method... either -DLOCKF, -DFLOCK, or -DFCNTL and put that # string in the CFLAGS line below. # User specified flags USERCFLAGS = USERLDFLAGS = -stack 11m USERLDLIBS = MAKEINFO = makeinfo TEXI2DVI = texi2dvi TEXI2HTML = texi2html # do not edit below this line # ============================================================================= SHELL = /bin/sh top_srcdir=. srcdir=. prefix = /usr exec_prefix = ${prefix} bindir = ${exec_prefix}/bin infodir = ${prefix}/info mandir = ${prefix}/man infodir = ${prefix}/info sysconfdir = /etc CC = cc -D_MINIX CXX = @CXX@ MYCFLAGS = MYCXXFLAGS = CPPFLAGS = HOST_ID = -DCPU_i386 -DVENDOR_pc -DOS_Minix DEFS = -DHAVE_CONFIG_H -DNO_CONFIG $(HOST_ID) LDFLAGS = LIBS = SHLIB = MACHDEPLIBS = LN_S = ln -s INSTALL = /usr/bin/install -cs INSTALL_PROGRAM = ${INSTALL} INSTALL_DATA = ${INSTALL} -m 644 INSTALL_INFO = .SUFFIXES: .SUFFIXES: .o .c .SUFFIXES: .o .c MAN1 = floppyd.1 mattrib.1 mbadblocks.1 mcat.1 mcd.1 mcopy.1 mdel.1 mdeltree.1 mdir.1 \ mdu.1 mformat.1 mkmanifest.1 mlabel.1 mmd.1 mmount.1 mmove.1 mpartition.1 \ mrd.1 mread.1 mren.1 mshowfat.1 mtoolstest.1 mtools.1 mtype.1 mzip.1 MAN1EXT = 1 MAN1DIR = $(mandir)/man${MAN1EXT} MAN5 = mtools.5 MAN5EXT = 5 MAN5DIR = $(mandir)/man${MAN5EXT} # all files in this directory included in the distribution DIST = \ COPYING Changelog INSTALL Makefile Makefile.in README Release.notes \ buffer.c buffer.h codepage.c codepage.h codepages.c config.c \ config.guess config.h.in config.log config.sub configure configure.in \ copyfile.c devices.c devices.h dirCache.c dirCache.h directory.c direntry.c \ expand.c fat.c \ fat_free.c file.c file.h file_name.c file_read.c files filter.c floppyd.1 \ floppyd.c floppyd_io.c floppyd_io.h force_io.c fs.h fsP.h \ getopt.h hash.c htable.h init.c llong.c mainloop.c match.c mattrib.1 \ mattrib.c mbadblocks.1 mbadblocks.c mcat.1 mcat.c mcd.1 mcd.c mcopy.1 \ mcopy.c mdel.1 mdel.c mdeltree.1 mdir.1 mdir.c mdu.c mdu.1 mformat.1 \ mformat.c minfo.c \ misc.c tty.c scsi.c missFuncs.c mk_direntry.c mkmanifest.1 mkmanifest.c \ mlabel.1 mlabel.c mmd.1 mmd.c mmount.1 mmount.c mmove.1 mmove.c \ mpartition.1 mpartition.c mrd.1 \ mread.1 mren.1 msdos.h mshowfat.1 mtoolstest.1 mtools.1 mtools.5 mtools.c \ mtools.conf mtools.h mtype.1 nameclash.h patchlevel.c \ plain_io.c plain_io.h precmd.c privileges.c scripts signal.c stream.c stream.h \ streamcache.c streamcache.h subdir.c sysincludes.h unixdir.c todo toupper.c \ vfat.c vfat.h xdf_io.c xdf_io.h #OBJS1 = buffer.o codepage.o codepages.o config.o copyfile.o devices.o \ #dirCache.o directory.o direntry.o expand.o fat.o fat_free.o file.o file_name.o \ #file_read.o filter.o floppyd_io.o force_io.o hash.o init.o llong.o match.o \ #mainloop.o mattrib.o mbadblocks.o mcat.o mcd.o mcopy.o mdel.o mdir.o \ #mdoctorfat.o mdu.o \ #mformat.o minfo.o misc.o missFuncs.o mk_direntry.o mlabel.o mmd.o mmount.o \ #mmove.o mpartition.o mshowfat.o mzip.o mtools.o patchlevel.o plain_io.o \ #precmd.o privileges.o scsi.o signal.o stream.o streamcache.o subdir.o \ #unixdir.o toupper.o tty.o vfat.o xdf_io.o OBJS1 = buffer.o config.o copyfile.o devices.o \ dirCache.o directory.o direntry.o expand.o fat.o fat_free.o file.o file_name.o \ file_read.o filter.o floppyd_io.o force_io.o hash.o init.o llong.o match.o \ mainloop.o mattrib.o mbadblocks.o mcat.o mcd.o mcopy.o mdel.o mdir.o \ mdoctorfat.o mdu.o \ mformat.o minfo.o misc.o missFuncs.o mk_direntry.o mlabel.o mmd.o mmount.o \ mmove.o mpartition.o mshowfat.o mtools.o patchlevel.o plain_io.o \ precmd.o privileges.o scsi.o signal.o stream.o streamcache.o subdir.o \ unixdir.o toupper.o tty.o vfat.o xdf_io.o OBJS2 = missFuncs.o mkmanifest.o misc.o patchlevel.o SRCS3 = floppyd.c OBJS4 = floppyd_installtest.o misc.o expand.o privileges.o SRCS = buffer.c codepage.c codepages.c config.c copyfile.c devices.c \ dirCache.c directory.c direntry.c expand.c fat.c fat_free.c file.c file_name.c \ file_read.c filter.c floppyd_io.c force_io.c hash.c init.c match.c mainloop.c \ mattrib.c mbadblocks.c mcat.c mcd.c mcopy.c mdel.c mdir.c mdu.c mdoctorfat.c \ mformat.c minfo.c misc.c \ missFuncs.c mk_direntry.c mlabel.c mmd.c mmount.c mmove.c mpartition.c \ mshowfat.c mzip.c mtools.c plain_io.c precmd.c privileges.c scsi.o \ signal.c stream.c streamcache.c subdir.c unixdir.c toupper.c tty.o vfat.c \ xdf_io.c mkmanifest.c SCRIPTS = mcheck mxtar uz tgz mcomp LINKS=mattrib mcat mcd mcopy mdel mdeltree mdir mdu mformat minfo mlabel \ mmd mmount mmove mpartition mrd mread mren mtype mtoolstest mshowfat \ mbadblocks mzip X_CFLAGS = X_LIBS = X_EXTRA_LIBS = X_PRE_LIBS = CFLAGS = $(CPPFLAGS) $(DEFS) $(MYCFLAGS) -I. -I. $(USERCFLAGS) CXXFLAGS = $(CPPFLAGS) $(DEFS) $(MYCXXFLAGS) -I. -I. $(USERCFLAGS) LINK = $(CC) $(LDFLAGS) $(USERLDFLAGS) ALLLIBS = $(USERLDLIBS) $(MACHDEPLIBS) $(SHLIB) $(LIBS) X_LDFLAGS = $(X_EXTRA_LIBS) $(X_LIBS) $(X_PRE_LIBS) -lXau -lX11 $(LIBS) X_CCFLAGS = $(X_CFLAGS) $(CFLAGS) all: mtools %.o: %.c $(CC) $(CFLAGS) -c $< #%.o: %.cpp # $(CXX) $(CXXFLAGS) -c $< mtools: $(OBJS1) $(LINK) $(OBJS1) -o $@ $(ALLLIBS) mkmanifest: $(OBJS2) $(LINK) $(OBJS2) -o $@ $(ALLLIBS) floppyd.o: floppyd.c $(CC) $(X_CCFLAGS) -c $< floppyd: floppyd.o $(LINK) $< -o $@ $(X_LDFLAGS) floppyd_installtest: $(OBJS4) $(LINK) $(OBJS4) -o $@ $(ALLLIBS) $(LINKS): mtools rm -f $@ && $(LN_S) mtools $@ mostlyclean: -rm -f *~ *.orig *.o a.out core 2>/dev/null clean: mostlyclean -rm -f mtools $(LINKS) floppyd floppyd_installtest mkmanifest *.info* *.dvi *.html 2>/dev/null texclean: -rm mtools.aux mtools.toc mtools.log -rm mtools.cps mtools.pgs mtools.vrs -rm mtools.cp mtools.fn mtools.ky -rm mtools.pg mtools.tp mtools.vr info: mtools.info %.info: %.texi $(MAKEINFO) -I$(srcdir) $< --no-split --output=$@ dvi: mtools.dvi %.dvi: %.texi $(TEXI2DVI) $< ps: mtools.ps %.ps: %.dvi dvips -f < $< > $@ pdf: mtools.pdf %.pdf: %.ps ps2pdf $< $@ html: mtools.html mtools_toc.html %.html %_toc.html: %.texi $(TEXI2HTML) $< # Don't cd, to avoid breaking install-sh references. install-info: info $(top_srcdir)/mkinstalldirs $(infodir) if test -f mtools.info; then \ for i in mtools.info*; do \ $(INSTALL_DATA) $$i $(infodir)/$$i; \ done; \ else \ for i in $(srcdir)/mtools.info*; do \ $(INSTALL_DATA) $$i $(infodir)/`echo $$i | sed 's|^$(srcdir)/||'`; \ done; \ fi; \ if [ -n "$(INSTALL_INFO)" ] ; then \ if [ -f $(infodir)/dir.info ] ; then \ $(INSTALL_INFO) $(infodir)/mtools.info $(infodir)/dir.info; \ fi; \ if [ -f $(infodir)/dir ] ; then \ $(INSTALL_INFO) $(infodir)/mtools.info $(infodir)/dir; \ fi; \ fi uninstall-info: cd $(infodir) && rm -f mtools.info* install: $(bindir)/mtools # The manual pages are of such horrible quality that one is better off without # them. (Frankly this whole package is horrible.) Using -? hopefully gives # enough clues for use. -- kjb dontinstall: $(MAN1DIR)/mattrib.1 $(MAN1DIR)/mbadblocks.1 \ $(MAN1DIR)/mcd.1 $(MAN1DIR)/mcopy.1 $(MAN1DIR)/mdel.1 \ $(MAN1DIR)/mdeltree.1 $(MAN1DIR)/mdir.1 $(MAN1DIR)/mdu.1 \ $(MAN1DIR)/mformat.1 $(MAN1DIR)/mlabel.1 \ $(MAN1DIR)/mmd.1 $(MAN1DIR)/mmove.1 $(MAN1DIR)/mrd.1 \ $(MAN1DIR)/mread.1 $(MAN1DIR)/mren.1 \ $(MAN1DIR)/mshowfat.1 $(MAN1DIR)/mtools.1 \ $(MAN1DIR)/mtype.1 $(MAN1DIR)/mzip.1 $(bindir)/mtools: mtools install -c $? $@ $(MAN1DIR)/mattrib.1: mattrib.1 install -lc $? $@ $(MAN1DIR)/mbadblocks.1: mbadblocks.1 install -lc $? $@ $(MAN1DIR)/mcd.1: mcd.1 install -lc $? $@ $(MAN1DIR)/mcopy.1: mcopy.1 install -lc $? $@ $(MAN1DIR)/mdel.1: mdel.1 install -lc $? $@ $(MAN1DIR)/mdeltree.1: mdeltree.1 install -lc $? $@ $(MAN1DIR)/mdir.1: mdir.1 install -lc $? $@ $(MAN1DIR)/mdu.1: mdu.1 install -lc $? $@ $(MAN1DIR)/mformat.1: mformat.1 install -lc $? $@ $(MAN1DIR)/mlabel.1: mlabel.1 install -lc $? $@ $(MAN1DIR)|E��~E��E��E��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/mmd.1: mmd.1 install -lc $? $@ $(MAN1DIR)/mmove.1: mmove.1 install -lc $? $@ $(MAN1DIR)/mrd.1: mrd.1 install -lc $? $@ $(MAN1DIR)/mread.1: mread.1 install -lc $? $@ $(MAN1DIR)/mren.1: mren.1 install -lc $? $@ $(MAN1DIR)/mshowfat.1: mshowfat.1 install -lc $? $@ $(MAN1DIR)/mtools.1: mtools.1 install -lc $? $@ $(MAN1DIR)/mtype.1: mtype.1 install -lc $? $@ $(MAN1DIR)/mzip.1: mzip.1 install -lc $? $@ #install: $(bindir)/mtools install-man install-links \ # $(bindir)/mkmanifest install-scripts install-info # #uninstall: uninstall-bin uninstall-man uninstall-links \ # uninstall-scripts distclean: clean texclean rm -f config.cache config.h config.status config.log Makefile maintainer-clean: distclean #$(bindir)/floppyd: floppyd # $(top_srcdir)/mkinstalldirs $(bindir) # $(INSTALL_PROGRAM) floppyd $(bindir)/floppyd # #$(bindir)/floppyd_installtest: floppyd_installtest # $(top_srcdir)/mkinstalldirs $(bindir) # $(INSTALL_PROGRAM) floppyd_installtest $(bindir)/floppyd_installtest # #$(bindir)/mtools: mtools # $(top_srcdir)/mkinstalldirs $(bindir) # $(INSTALL_PROGRAM) mtools $(bindir)/mtools # #$(bindir)/mkmanifest: mkmanifest # $(top_srcdir)/mkinstalldirs $(bindir) # $(INSTALL_PROGRAM) mkmanifest $(bindir)/mkmanifest #$(ETCDIR)/mtools: mtools.etc # cp mtools.etc $(ETCDIR)/mtools install-links: $(bindir)/mtools @for j in $(LINKS); do \ rm -f $(bindir)/$$j ; \ $(LN_S) mtools $(bindir)/$$j ; \ echo $(bindir)/$$j ; \ done ## "z" is the older version of "gz"; the name is just *too* short install-scripts: $(bindir)/mtools @$(top_srcdir)/mkinstalldirs $(bindir) @for j in $(SCRIPTS) ; do \ $(INSTALL_PROGRAM) $(srcdir)/scripts/$$j $(bindir)/$$j ; \ echo $(bindir)/$$j ; \ done rm -f $(bindir)/lz $(LN_S) uz $(bindir)/lz install-man: @$(top_srcdir)/mkinstalldirs $(MAN1DIR) @for j in $(MAN1); do \ $(INSTALL_DATA) $(srcdir)/$$j $(MAN1DIR)/$$j ; \ echo $(MAN1DIR)/$$j ; \ done @$(top_srcdir)/mkinstalldirs $(MAN5DIR) @for j in $(MAN5); do \ $(INSTALL_DATA) $(srcdir)/$$j $(MAN5DIR)/$$j ; \ echo $(MAN5DIR)/$$j ; \ done uninstall-bin: @for j in mtools mkmanifest; do \ rm -f $(bindir)/$$j ; \ echo $(bindir)/$$j ; \ done uninstall-scripts: @for j in $(SCRIPTS); do \ rm -f $(bindir)/$$j ; \ echo $(bindir)/$$j ; \ done uninstall-man: @for j in $(MAN1); do \ rm -f $(MAN1DIR)/$$j ; \ echo $(MAN1DIR)/$$j ; \ done @for j in $(MAN5); do \ rm -f $(MAN5DIR)/$$j ; \ echo $(MAN5DIR)/$$j ; \ done uninstall-links: @for j in $(LINKS); \ do rm -f $(bindir)/$$j ; \ echo $(bindir)/$$j ; \ done depend: $(SRCS) makedepend -- $(CFLAGS) -- $^ check: echo No self tests included # check target needed even if empty, in order to make life easyer for # automatic tools to install GNU soft # DO NOT DELETE THIS LINE -- make depend depends on it. �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "file.h" #include "mtoolsDirent.h" void initializeDirentry(direntry_t *entry, Stream_t *Dir) { entry->entry = -1; /* entry->parent = getDirentry(Dir);*/ entry->Dir = Dir; entry->beginSlot = 0; entry->endSlot = 0; } int isNotFound(direntry_t *entry) { return entry->entry == -2; } void rewindEntry(direntry_t *entry) { entry->entry = -1; } direntry_t *getParent(direntry_t *entry) { return getDirentry(entry->Dir); } static int getPathLen(direntry_t *entry) { int length=0; while(1) { if(entry->entry == -3) /* rootDir */ return strlen(getDrive(entry->Dir)) + 1 + length + 1; length += 1 + strlen(entry->name); entry = getDirentry(entry->Dir); } } static char *sprintPwd(direntry_t *entry, char *ptr) { if(entry->entry == -3) { strcpy(ptr, getDrive(entry->Dir)); strcat(ptr, ":/"); ptr = strchr(ptr, 0); } else { ptr = sprintPwd(getDirentry(entry->Dir), ptr); if(ptr[-1] != '/') *ptr++ = '/'; strcpy(ptr, entry->name); ptr += strlen(entry->name); } return ptr; } #define NEED_ESCAPE "\"$\\" static void _fprintPwd(FILE *f, direntry_t *entry, int recurs, int escape) { if(entry->entry == -3) { fputs(getDrive(entry->Dir), f); putc(':', f); if(!recurs) putc('/', f); } else { _fprintPwd(f, getDirentry(entry->Dir), 1, escape); if (escape && strpbrk(entry->name, NEED_ESCAPE)) { char *ptr; for(ptr = entry->name; *ptr; ptr++) { if (strchr(NEED_ESCAPE, *ptr)) putc('\\', f); putc(*ptr, f); } } else { fprintf(f, "/%s", entry->name); } } } void fprintPwd(FILE *f, direntry_t *entry, int escape) { if (escape) putc('"', f); _fprintPwd(f, entry, 0, escape); if(escape) putc('"', f); } char *getPwd(direntry_t *entry) { int size; char *ret; size = getPathLen(entry); ret = malloc(size+1); if(!ret) return 0; sprintPwd(entry, ret); return ret; } int isSubdirOf(Stream_t *inside, Stream_t *outside) { while(1) { if(inside == outside) /* both are the same */ return 1; if(getDirentry(inside)->entry == -3) /* root directory */ return 0; /* look further up */ inside = getDirentry(inside)->Dir; } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "fsP.h" #include "mtoolsDirent.h" /* * Remove a string of FAT entries (delete the file). The argument is * the beginning of the string. Does not consider the file length, so * if FAT is corrupted, watch out! */ int fat_free(Stream_t *Dir, unsigned int fat) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); unsigned int next_no_step; /* a zero length file? */ if (fat == 0) return(0); /* CONSTCOND */ while (!This->fat_error) { /* get next cluster number */ next_no_step = fatDecode(This,fat); /* mark current cluster as empty */ fatDeallocate(This,fat); if (next_no_step >= This->last_fat) break; fat = next_no_step; } return(0); } int fatFreeWithDir(Stream_t *Dir, struct directory *dir) { unsigned int first; if((!strncmp(dir->name,". ",8) || !strncmp(dir->name,".. ",8)) && !strncmp(dir->ext," ",3)) { fprintf(stderr,"Trying to remove . or .. entry\n"); return -1; } first = START(dir); if(fat32RootCluster(Dir)) first |= STARTHI(dir) << 16; return fat_free(Dir, first); } int fatFreeWithDirentry(direntry_t *entry) { return fatFreeWithDir(entry->Dir, &entry->dir); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_FILE_H #define MTOOLS_FILE_H #include "stream.h" #include "mtoolsDirent.h" Stream_t *OpenFileByDirentry(direntry_t *entry); Stream_t *OpenRoot(Stream_t *Dir); void printFat(Stream_t *Stream); direntry_t *getDirentry(Stream_t *Stream); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_MAINLOOP_H #define MTOOLS_MAINLOOP_H #ifndef OS_Minix #include <sys/param.h> #endif #include "vfat.h" #include "mtoolsDirent.h" typedef struct MainParam_t { /* stuff needing to be initialised by the caller */ int (*loop)(Stream_t *Dir, struct MainParam_t *mp, const char *filename); int (*dirCallback)(direntry_t *, struct MainParam_t *); int (*callback)(direntry_t *, struct MainParam_t *); int (*unixcallback)(struct MainParam_t *mp); void *arg; /* command-specific parameters * to be passed to callback */ int openflags; /* flags used to open disk */ int lookupflags; /* flags used to lookup up using vfat_lookup */ int fast_quit; /* for commands manipulating multiple files, quit * as soon as even _one_ file has a problem */ char *shortname; /* where to put the short name of the matched file */ char *longname; /* where to put the long name of the matched file */ /* out parameters */ Stream_t *File; direntry_t *direntry; /* dir of this entry */ char *unixSourceName; /* filename of the last opened Unix source * file (Unix equiv of Dos direntry) */ Stream_t *targetDir; /* directory where to place files */ char *unixTarget; /* directory on Unix where to put files */ const char *targetName; /* basename of target file, or NULL if same * basename as source should be conserved */ char *originalArg; /* original argument, complete with wildcards */ int basenameHasWildcard; /* true if there are wildcards in the * basename */ /* internal data */ char mcwd[MAX_PATH+4]; char *fileName; /* resolved Unix filename */ } MainParam_t; void init_mp(MainParam_t *MainParam); int main_loop(MainParam_t *MainParam, char **argv, int argc); int target_lookup(MainParam_t *mp, const char *arg); Stream_t *open_root_dir(char *drivename, int flags); const char *mpGetBasename(MainParam_t *mp); /* statically allocated * string */ void mpPrintFilename(FILE *file, MainParam_t *mp); const char *mpPickTargetName(MainParam_t *mp); /* statically allocated string */ char *mpBuildUnixFilename(MainParam_t *mp); /* dynamically allocated, must * be freed */ int isSpecial(const char *name); #define MISSED_ONE 2 /* set if one cmd line argument didn't match any files */ #define GOT_ONE 4 /* set if a match was found, used for exit status */ #define NO_CWD 8 /* file not found while looking for current working * directory */ #define ERROR_ONE 16 /* flat out error, such as problems with target file, interrupt by user, etc. */ #define STOP_NOW 32 /* stop as soon as possible, not necessarily an error */ #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_DIRENTRY_H #define MTOOLS_DIRENTRY_H #include "sysincludes.h" #include "vfat.h" typedef struct direntry_t { struct Stream_t *Dir; /* struct direntry_t *parent; parent level */ int entry; /* slot in parent directory (-3 if root) */ struct directory dir; /* descriptor in parent directory (random if * root)*/ char name[MAX_VNAMELEN+1]; /* name in its parent directory, or * NULL if root */ int beginSlot; /* begin and end slot, for delete */ int endSlot; } direntry_t; #include "stream.h" int vfat_lookup(direntry_t *entry, const char *filename, int length, int flags, char *shortname, char *longname); struct directory *dir_read(direntry_t *entry, int *error); void initializeDirentry(direntry_t *entry, struct Stream_t *Dir); int isNotFound(direntry_t *entry); direntry_t *getParent(direntry_t *entry); void dir_write(direntry_t *entry); void low_level_dir_write(direntry_t *entry); int fatFreeWithDirentry(direntry_t *entry); int labelit(char *dosname, char *longname, void *arg0, direntry_t *entry); int isSubdirOf(Stream_t *inside, Stream_t *outside); char *getPwd(direntry_t *entry); void fprintPwd(FILE *f, direntry_t *entry, int escape); int write_vfat(Stream_t *, char *, char *, int, direntry_t *); #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Buffer read/write module */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "buffer.h" typedef struct Buffer_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; size_t size; /* size of read/write buffer */ int dirty; /* is the buffer dirty? */ int sectorSize; /* sector size: all operations happen * in multiples of this */ int cylinderSize; /* cylinder size: preferred alignemnt, * but for efficiency, less data may be read */ int ever_dirty; /* was the buffer ever dirty? */ int dirty_pos; int dirty_end; mt_off_t current; /* first sector in buffer */ size_t cur_size; /* the current size */ char *buf; /* disk read/write buffer */ } Buffer_t; /* * Flush a dirty buffer to disk. Resets Buffer->dirty to zero. * All errors are fatal. */ static int _buf_flush(Buffer_t *Buffer) { int ret; if (!Buffer->Next || !Buffer->dirty) return 0; if(Buffer->current < 0L) { fprintf(stderr,"Should not happen\n"); return -1; } #ifdef DEBUG fprintf(stderr, "write %08x -- %02x %08x %08x\n", Buffer, (unsigned char) Buffer->buf[0], Buffer->current + Buffer->dirty_pos, Buffer->dirty_end - Buffer->dirty_pos); #endif ret = force_write(Buffer->Next, Buffer->buf + Buffer->dirty_pos, Buffer->current + Buffer->dirty_pos, Buffer->dirty_end - Buffer->dirty_pos); if(ret != Buffer->dirty_end - Buffer->dirty_pos) { if(ret < 0) perror("buffer_flush: write"); else fprintf(stderr,"buffer_flush: short write\n"); return -1; } Buffer->dirty = 0; Buffer->dirty_end = 0; Buffer->dirty_pos = 0; return 0; } static int invalidate_buffer(Buffer_t *Buffer, mt_off_t start) { /*fprintf(stderr, "invalidate %x\n", Buffer);*/ if(Buffer->sectorSize == 32) { fprintf(stderr, "refreshing directory\n"); } if(_buf_flush(Buffer) < 0) return -1; /* start reading at the beginning of start's sector * don't start reading too early, or we might not even reach * start */ Buffer->current = ROUND_DOWN(start, Buffer->sectorSize); Buffer->cur_size = 0; return 0; } #undef OFFSET #define OFFSET (start - This->current) typedef enum position_t { OUTSIDE, APPEND, INSIDE, ERROR } position_t; static position_t isInBuffer(Buffer_t *This, mt_off_t start, size_t *len) { if(start >= This->current && start < This->current + This->cur_size) { maximize(*len, This->cur_size - OFFSET); return INSIDE; } else if(start == This->current + This->cur_size && This->cur_size < This->size && *len >= This->sectorSize) { /* append to the buffer for this, three conditions have to * be met: * 1. The start falls exactly at the end of the currently * loaded data * 2. There is still space * 3. We append at least one sector */ maximize(*len, This->size - This->cur_size); *len = ROUND_DOWN(*len, This->sectorSize); return APPEND; } else { if(invalidate_buffer(This, start) < 0) return ERROR; maximize(*len, This->cylinderSize - OFFSET); maximize(*len, This->cylinderSize - This->current % This->cylinderSize); return OUTSIDE; } } static int buf_read(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { size_t length; int offset; char *disk_ptr; int ret; DeclareThis(Buffer_t); if(!len) return 0; /*fprintf(stderr, "buf read %x %x %x\n", Stream, start, len);*/ switch(isInBuffer(This, start, &len)) { case OUTSIDE: case APPEND: /* always load until the end of the cylinder */ length = This->cylinderSize - (This->current + This->cur_size) % This->cylinderSize; maximize(length, This->size - This->cur_size); /* read it! */ ret=READS(This->Next, This->buf + This->cur_size, This->current + This->cur_size, length); if ( ret < 0 ) return ret; This->cur_size += ret; if (This->current+This->cur_size < start) { fprintf(stderr, "Short buffer fill\n"); exit(1); } break; case INSIDE: /* nothing to do */ break; case ERROR: return -1; } offset = OFFSET; disk_ptr = This->buf + offset; maximize(len, This->cur_size - offset); memcpy(buf, disk_ptr, len); return len; } static int buf_write(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { char *disk_ptr; DeclareThis(Buffer_t); int offset, ret; if(!len) return 0; This->ever_dirty = 1; #ifdef DEBUG fprintf(stderr, "buf write %x %02x %08x %08x -- %08x %08x -- %08x\n", Stream, (unsigned char) This->buf[0], start, len, This->current, This->cur_size, This->size); fprintf(stderr, "%d %d %d %x %x\n", start == This->current + This->cur_size, This->cur_size < This->size, len >= This->sectorSize, len, This->sectorSize); #endif switch(isInBuffer(This, start, &len)) { case OUTSIDE: #ifdef DEBUG fprintf(stderr, "outside\n"); #endif if(start % This->cylinderSize || len < This->sectorSize) { size_t readSize; readSize = This->cylinderSize - This->current % This->cylinderSize; ret=READS(This->Next, This->buf, This->current, readSize); /* read it! */ if ( ret < 0 ) return ret; This->cur_size = ret; /* for dosemu. Autoextend size */ if(!This->cur_size) { memset(This->buf,0,readSize); This->cur_size = readSize; } offset = OFFSET; break; } /* FALL THROUGH */ case APPEND: #ifdef DEBUG fprintf(stderr, "append\n"); #endif len = ROUND_DOWN(len, This->sectorSize); offset = OFFSET; maximize(len, This->size - offset); This->cur_size += len; if(This->Next->Class->pre_allocate) PRE_ALLOCATE(This->Next, This->current + This->cur_size); break; case INSIDE: /* nothing to do */ #ifdef DEBUG fprintf(stderr, "inside\n"); #endif offset = OFFSET; maximize(len, This->cur_size - offset); break; case ERROR: return -1; default: #ifdef DEBUG fprintf(stderr, "Should not happen\n"); #endif exit(1); } disk_ptr = This->buf + offset; /* extend if we write beyond end */ if(offset + len > This->cur_size) { len -= (offset + len) % This->sectorSize; This->cur_size = len + offset; } memcpy(disk_ptr, buf, len); if(!This->dirty || offset < This->dirty_pos) This->dirty_pos = ROUND_DOWN(offset, This->sectorSize); if(!This->dirty || offset + len > This->dirty_end) This->dirty_end = ROUND_UP(offset + len, This->sectorSize); if(This->dirty_end > This->cur_size) { fprintf(stderr, "Internal error, dirty end too big %x %x %x %d %x\n", This->dirty_end, (unsigned int) This->cur_size, (unsigned int) len, (int) offset, (int) This->sectorSize); fprintf(stderr, "offset + len + grain - 1 = %x\n", (int) (offset + len + This->sectorSize - 1)); fprintf(stderr, "ROUNDOWN(offset + len + grain - 1) = %x\n", (int)ROUND_DOWN(offset + len + This->sectorSize - 1, This->sectorSize)); fprintf(stderr, "This->dirty = %d\n", This->dirty); exit(1); } This->dirty = 1; return len; } static int buf_flush(Stream_t *Stream) { int ret; DeclareThis(Buffer_t); if (!This->ever_dirty) return 0; ret = _buf_flush(This); if(ret == 0) This->ever_dirty = 0; return ret; } static int buf_free(Stream_t *Stream) { DeclareThis(Buffer_t); if(This->buf) free(This->buf); This->buf = 0; return 0; } static Class_t BufferClass = { buf_read, buf_write, buf_flush, buf_free, 0, /* set_geom */ get_data_pass_through, /* get_data */ 0, /* pre-allocate */ }; Stream_t *buf_init(Stream_t *Next, int size, int cylinderSize, int sectorSize) { Buffer_t *Buffer; Stream_t *Stream; if(size % cylinderSize != 0) { fprintf(stderr, "size not multiple of cylinder size\n"); exit(1); } if(cylinderSize % sectorSize != 0) { fprintf(stderr, "cylinder size not multiple of sector size\n"); exit(1); } if(Next->Buffer){ Next->refs--; Next->Buffer->refs++; return Next->Buffer; } Stream = (Stream_t *) malloc (sizeof(Buffer_t)); if(!Stream) return 0; Buffer = (Buffer_t *) Stream; Buffer->buf = malloc(size); if ( !Buffer->buf){ Free(Stream); return 0; } Buffer->size = size; Buffer->dirty = 0; Buffer->cylinderSize = cylinderSize; Buffer->sectorSize = sectorSize; BuffE��E����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������er->ever_dirty = 0; Buffer->dirty_pos = 0; Buffer->dirty_end = 0; Buffer->current = 0; Buffer->cur_size = 0; /* buffer currently empty */ Buffer->Next = Next; Buffer->Class = &BufferClass; Buffer->refs = 1; Buffer->Buffer = 0; Buffer->Next->Buffer = (Stream_t *) Buffer; return Stream; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_BUFFER_H #define MTOOLS_BUFFER_H #include "stream.h" Stream_t *buf_init(Stream_t *Next, int size, int cylinderSize, int sectorSize); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef struct Codepage_l { int nr; unsigned char tounix[128]; } Codepage_t; typedef struct country_l { int country; int codepage; int default_codepage; int to_upper; } country_t; #ifndef NO_CONFIG void init_codepage(void); unsigned char to_dos(unsigned char c); void to_unix(char *a, int n); #define mstoupper(c) mstoupper[(c) & 0x7F] #else /* NO_CONFIG */ /* Imagine a codepage with 128 uppercase letters for the top 128 characters. */ #define mstoupper(c) (c) #define to_dos(c) (c) #define to_unix(a, n) ((void) 0) #define mstoupper(c) (c) #endif extern Codepage_t *Codepage; extern char *mstoupper; extern country_t countries[]; extern unsigned char toucase[][128]; extern Codepage_t codepages[]; extern char *country_string; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "mtools.h" #include "codepage.h" #include "mtoolsPaths.h" /* global variables */ /* they are not really harmful here, because there is only one configuration * file per invocations */ #ifndef NO_CONFIG #define MAX_LINE_LEN 256 /* scanner */ static char buffer[MAX_LINE_LEN+1]; /* buffer for the whole line */ static char *pos; /* position in line */ static char *token; /* last scanned token */ static int token_length; /* length of the token */ static FILE *fp; /* file pointer for configuration file */ static int linenumber; /* current line number. Only used for printing * error messages */ static int lastTokenLinenumber; /* line numnber for last token */ static const char *filename; /* current file name. Only used for printing * error messages */ static int file_nr=0; static int flag_mask; /* mask of currently set flags */ /* devices */ static int cur_devs; /* current number of defined devices */ static int cur_dev; /* device being filled in. If negative, none */ static int trusted=0; /* is the currently parsed device entry trusted? */ static int nr_dev; /* number of devices that the current table can hold */ static int token_nr; /* number of tokens in line */ static char letters[][2] = { /* drive letter to letter-as-a-string */ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", }; #endif /* !NO_CONFIG */ struct device *devices; /* the device table */ /* "environment" variables */ unsigned int mtools_skip_check=0; unsigned int mtools_fat_compatibility=0; unsigned int mtools_ignore_short_case=0; unsigned int mtools_rate_0=0; unsigned int mtools_rate_any=0; unsigned int mtools_no_vfat=0; unsigned int mtools_numeric_tail=1; unsigned int mtools_dotted_dir=0; unsigned int mtools_twenty_four_hour_clock=1; char *mtools_date_string="mm-dd-yyyy"; char *country_string=0; #ifndef NO_CONFIG typedef struct switches_l { const char *name; caddr_t address; enum { T_INT, T_STRING, T_UINT } type; } switches_t; static switches_t switches[] = { { "MTOOLS_LOWER_CASE", (caddr_t) & mtools_ignore_short_case, T_UINT }, { "MTOOLS_FAT_COMPATIBILITY", (caddr_t) & mtools_fat_compatibility, T_UINT }, { "MTOOLS_SKIP_CHECK", (caddr_t) & mtools_skip_check, T_UINT }, { "MTOOLS_NO_VFAT", (caddr_t) & mtools_no_vfat, T_UINT }, { "MTOOLS_RATE_0", (caddr_t) &mtools_rate_0, T_UINT }, { "MTOOLS_RATE_ANY", (caddr_t) &mtools_rate_any, T_UINT }, { "MTOOLS_NAME_NUMERIC_TAIL", (caddr_t) &mtools_numeric_tail, T_UINT }, { "MTOOLS_DOTTED_DIR", (caddr_t) &mtools_dotted_dir, T_UINT }, { "MTOOLS_TWENTY_FOUR_HOUR_CLOCK", (caddr_t) &mtools_twenty_four_hour_clock, T_UINT }, { "MTOOLS_DATE_STRING", (caddr_t) &mtools_date_string, T_STRING }, { "COUNTRY", (caddr_t) &country_string, T_STRING } }; typedef struct { const char *name; int flag; } flags_t; static flags_t openflags[] = { #ifdef O_SYNC { "sync", O_SYNC }, #endif #ifdef O_NDELAY { "nodelay", O_NDELAY }, #endif #ifdef O_EXCL { "exclusive", O_EXCL }, #endif { "none", 0 } /* hack for those compilers that choke on commas * after the last element of an array */ }; static flags_t misc_flags[] = { #ifdef USE_XDF { "use_xdf", USE_XDF_FLAG }, #endif { "scsi", SCSI_FLAG }, { "nolock", NOLOCK_FLAG }, { "mformat_only", MFORMAT_ONLY_FLAG }, { "filter", FILTER_FLAG }, { "privileged", PRIV_FLAG }, { "vold", VOLD_FLAG }, { "remote", FLOPPYD_FLAG } }; static struct { const char *name; signed char fat_bits; int tracks; unsigned short heads; unsigned short sectors; } default_formats[] = { { "hd514", 12, 80, 2, 15 }, { "high-density-5-1/4", 12, 80, 2, 15 }, { "1.2m", 12, 80, 2, 15 }, { "hd312", 12, 80, 2, 18 }, { "high-density-3-1/2", 12, 80, 2, 18 }, { "1.44m", 12, 80, 2, 18 }, { "dd312", 12, 80, 2, 9 }, { "double-density-3-1/2", 12, 80, 2, 9 }, { "720k", 12, 80, 2, 9 }, { "dd514", 12, 40, 2, 9 }, { "double-density-5-1/4", 12, 40, 2, 9 }, { "360k", 12, 40, 2, 9 }, { "320k", 12, 40, 2, 8 }, { "180k", 12, 40, 1, 9 }, { "160k", 12, 40, 1, 8 } }; #define OFFS(x) ((caddr_t)&((struct device *)0)->x) static switches_t dswitches[]= { { "FILE", OFFS(name), T_STRING }, { "OFFSET", OFFS(offset), T_UINT }, { "PARTITION", OFFS(partition), T_UINT }, { "FAT", OFFS(fat_bits), T_INT }, { "FAT_BITS", OFFS(fat_bits), T_UINT }, { "MODE", OFFS(mode), T_UINT }, { "TRACKS", OFFS(tracks), T_UINT }, { "CYLINDERS", OFFS(tracks), T_UINT }, { "HEADS", OFFS(heads), T_UINT }, { "SECTORS", OFFS(sectors), T_UINT }, { "HIDDEN", OFFS(hidden), T_UINT }, { "PRECMD", OFFS(precmd), T_STRING }, { "BLOCKSIZE", OFFS(blocksize), T_UINT } }; static void syntax(const char *msg, int thisLine) { char *drive=NULL; if(thisLine) lastTokenLinenumber = linenumber; if(cur_dev >= 0) drive = devices[cur_dev].drive; fprintf(stderr,"Syntax error at line %d ", lastTokenLinenumber); if(drive) fprintf(stderr, "for drive %s: ", drive); if(token) fprintf(stderr, "column %ld ", (long)(token - buffer)); fprintf(stderr, "in file %s: %s\n", filename, msg); exit(1); } static void get_env_conf(void) { char *s; int i; for(i=0; i< sizeof(switches) / sizeof(*switches); i++) { s = getenv(switches[i].name); if(s) { if(switches[i].type == T_INT) * ((int *)switches[i].address) = (int) strtol(s,0,0); if(switches[i].type == T_UINT) * ((int *)switches[i].address) = (unsigned int) strtoul(s,0,0); else if (switches[i].type == T_STRING) * ((char **)switches[i].address) = s; } } } static int mtools_getline(void) { if(!fgets(buffer, MAX_LINE_LEN, fp)) return -1; linenumber++; pos = buffer; token_nr = 0; buffer[MAX_LINE_LEN] = '\0'; if(strlen(buffer) == MAX_LINE_LEN) syntax("line too long", 1); return 0; } static void skip_junk(int expect) { lastTokenLinenumber = linenumber; while(!pos || !*pos || strchr(" #\n\t", *pos)) { if(!pos || !*pos || *pos == '#') { if(mtools_getline()) { pos = 0; if(expect) syntax("end of file unexpected", 1); return; } } else pos++; } token_nr++; } /* get the next token */ static char *get_next_token(void) { skip_junk(0); if(!pos) { token_length = 0; token = 0; return 0; } token = pos; token_length = strcspn(token, " \t\n#:="); pos += token_length; return token; } static int match_token(const char *template) { return (strlen(template) == token_length && !strncasecmp(template, token, token_length)); } static void expect_char(char c) { char buf[11]; skip_junk(1); if(*pos != c) { sprintf(buf, "expected %c", c); syntax(buf, 1); } pos++; } static char *get_string(void) { char *end, *str; skip_junk(1); if(*pos != '"') syntax(" \" expected", 0); str = pos+1; end = strchr(str, '\"'); if(!end) syntax("unterminated string constant", 1); *end = '\0'; pos = end+1; return str; } static unsigned int get_unumber(void) { char *last; unsigned int n; skip_junk(1); last = pos; n=(unsigned int) strtoul(pos, &pos, 0); if(last == pos) syntax("numeral expected", 0); pos++; token_nr++; return n; } static unsigned int get_number(void) { char *last; int n; skip_junk(1); last = pos; n=(int) strtol(pos, &pos, 0); if(last == pos) syntax("numeral expected", 0); pos++; token_nr++; return n; } /* purge all entries pertaining to a given drive from the table */ static void purge(char drive, int fn) { int i,j; drive = toupper(drive); for(j=0, i=0; i < cur_devs; i++) { if(devices[i].drive[0] != drive || devices[i].drive[1] != 0 || devices[i].file_nr == fn) devices[j++] = devices[i]; } cur_devs = j; } static void grow(void) { if(cur_devs >= nr_dev - 2) { nr_dev = (cur_devs + 2) << 1; if(!(devices=Grow(devices, nr_E��E��E��E��E��E��E��E��E��E��E��E������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dev, struct device))){ printOom(); exit(1); } } } static void init_drive(void) { memset((char *)&devices[cur_dev], 0, sizeof(struct device)); devices[cur_dev].ssize = 2; } /* prepends a device to the table */ static void prepend(void) { int i; grow(); for(i=cur_devs; i>0; i--) devices[i] = devices[i-1]; cur_dev = 0; cur_devs++; init_drive(); } /* appends a device to the table */ static void append(void) { grow(); cur_dev = cur_devs; cur_devs++; init_drive(); } static void finish_drive_clause(void) { char *drive; if(cur_dev == -1) { trusted = 0; return; } drive = devices[cur_dev].drive; if(!devices[cur_dev].name) syntax("missing filename", 0); if(devices[cur_dev].tracks || devices[cur_dev].heads || devices[cur_dev].sectors) { if(!devices[cur_dev].tracks || !devices[cur_dev].heads || !devices[cur_dev].sectors) syntax("incomplete geometry: either indicate all of track/heads/sectors or none of them", 0); if(!(devices[cur_dev].misc_flags & (MFORMAT_ONLY_FLAG | FILTER_FLAG))) syntax("if you supply a geometry, you also must supply one of the `mformat_only' or `filter' flags", 0); } devices[cur_dev].file_nr = file_nr; devices[cur_dev].cfg_filename = filename; if(! (flag_mask & PRIV_FLAG) && IS_SCSI(&devices[cur_dev])) devices[cur_dev].misc_flags |= PRIV_FLAG; if(!trusted && (devices[cur_dev].misc_flags & PRIV_FLAG)) { fprintf(stderr, "Warning: privileged flag ignored for drive %s: defined in file %s\n", devices[cur_dev].drive, filename); devices[cur_dev].misc_flags &= ~PRIV_FLAG; } trusted = 0; cur_dev = -1; } static int set_var(struct switches_l *switches, int nr, caddr_t base_address) { int i; for(i=0; i < nr; i++) { if(match_token(switches[i].name)) { expect_char('='); if(switches[i].type == T_UINT) * ((int *)((long)switches[i].address+base_address)) = get_unumber(); if(switches[i].type == T_INT) * ((int *)((long)switches[i].address+base_address)) = get_number(); else if (switches[i].type == T_STRING) * ((char**)((long)switches[i].address+base_address))= strdup(get_string()); return 0; } } return 1; } static int set_openflags(struct device *dev) { int i; for(i=0; i < sizeof(openflags) / sizeof(*openflags); i++) { if(match_token(openflags[i].name)) { dev->mode |= openflags[i].flag; return 0; } } return 1; } static int set_misc_flags(struct device *dev) { int i; for(i=0; i < sizeof(misc_flags) / sizeof(*misc_flags); i++) { if(match_token(misc_flags[i].name)) { flag_mask |= misc_flags[i].flag; skip_junk(0); if(pos && *pos == '=') { pos++; switch(get_number()) { case 0: return 0; case 1: break; default: syntax("expected 0 or 1", 0); } } dev->misc_flags |= misc_flags[i].flag; return 0; } } return 1; } static int set_def_format(struct device *dev) { int i; for(i=0; i < sizeof(default_formats)/sizeof(*default_formats); i++) { if(match_token(default_formats[i].name)) { if(!dev->ssize) dev->ssize = 2; if(!dev->tracks) dev->tracks = default_formats[i].tracks; if(!dev->heads) dev->heads = default_formats[i].heads; if(!dev->sectors) dev->sectors = default_formats[i].sectors; if(!dev->fat_bits) dev->fat_bits = default_formats[i].fat_bits; return 0; } } return 1; } static void get_codepage(void) { int i; unsigned short n; if(!Codepage) Codepage = New(Codepage_t); for(i=0; i<128; i++) { n = get_number(); if(n > 0xff) n = 0x5f; Codepage->tounix[i] = n; } } static void get_toupper(void) { int i; if(!mstoupper) mstoupper = safe_malloc(128); for(i=0; i<128; i++) mstoupper[i] = get_number(); } static void parse_old_device_line(char drive) { char name[MAXPATHLEN]; int items; long offset; char newdrive; /* finish any old drive */ finish_drive_clause(); /* purge out data of old configuration files */ purge(drive, file_nr); /* reserve slot */ append(); items = sscanf(token,"%c %s %i %i %i %i %li", &newdrive,name,&devices[cur_dev].fat_bits, &devices[cur_dev].tracks,&devices[cur_dev].heads, &devices[cur_dev].sectors, &offset); devices[cur_dev].offset = (off_t) offset; switch(items){ case 2: devices[cur_dev].fat_bits = 0; /* fall thru */ case 3: devices[cur_dev].sectors = 0; devices[cur_dev].heads = 0; devices[cur_dev].tracks = 0; /* fall thru */ case 6: devices[cur_dev].offset = 0; /* fall thru */ default: break; case 0: case 1: case 4: case 5: syntax("bad number of parameters", 1); exit(1); } if(!devices[cur_dev].tracks){ devices[cur_dev].sectors = 0; devices[cur_dev].heads = 0; } devices[cur_dev].drive = letters[toupper(newdrive) - 'A']; if (!(devices[cur_dev].name = strdup(name))) { printOom(); exit(1); } finish_drive_clause(); pos=0; } static int parse_one(int privilege) { int action=0; get_next_token(); if(!token) return 0; if((match_token("drive") && ((action = 1)))|| (match_token("drive+") && ((action = 2))) || (match_token("+drive") && ((action = 3))) || (match_token("clear_drive") && ((action = 4))) ) { /* finish off the previous drive */ finish_drive_clause(); get_next_token(); if(token_length != 1) syntax("drive letter expected", 0); if(action==1 || action==4) /* replace existing drive */ purge(token[0], file_nr); if(action==4) return 1; if(action==3) prepend(); else append(); memset((char*)(devices+cur_dev), 0, sizeof(*devices)); trusted = privilege; flag_mask = 0; devices[cur_dev].drive = letters[toupper(token[0]) - 'A']; expect_char(':'); return 1; } if(token_nr == 1 && token_length == 1) { parse_old_device_line(token[0]); return 1; } if(match_token("default_fucase")) { free(mstoupper); mstoupper=0; } if(match_token("default_tounix")) { Free(Codepage); Codepage = 0; } if(match_token("fucase")) { expect_char(':'); get_toupper(); return 1; } if(match_token("tounix")) { expect_char(':'); get_codepage(); return 1; } if((cur_dev < 0 || (set_var(dswitches, sizeof(dswitches)/sizeof(*dswitches), (caddr_t)&devices[cur_dev]) && set_openflags(&devices[cur_dev]) && set_misc_flags(&devices[cur_dev]) && set_def_format(&devices[cur_dev]))) && set_var(switches, sizeof(switches)/sizeof(*switches), 0)) syntax("unrecognized keyword", 1); return 1; } static int parse(const char *name, int privilege) { fp = fopen(name, "r"); if(!fp) return 0; file_nr++; filename = strdup(name); linenumber = 0; lastTokenLinenumber = 0; pos = 0; token = 0; cur_dev = -1; /* no current device */ while(parse_one(privilege)); finish_drive_clause(); fclose(fp); return 1; } void read_config(void) { char *homedir; char *envConfFile; char conf_file[MAXPATHLEN+sizeof(CFG_FILE1)]; /* copy compiled-in devices */ file_nr = 0; cur_devs = nr_const_devices; nr_dev = nr_const_devices + 2; devices = NewArray(nr_dev, struct device); if(!devices) { printOom(); exit(1); } if(nr_const_devices) memcpy(devices, const_devices, nr_const_devices*sizeof(struct device)); (void) ((parse(CONF_FILE,1) | parse(LOCAL_CONF_FILE,1) | parse(SYS_CONF_FILE,1)) || (parse(OLD_CONF_FILE,1) | parse(OLD_LOCAL_CONF_FILE,1))); /* the old-name configuration files only get executed if none of the * new-name config files were used */ homedir = get_homedir(); if ( homedir ){ strncpy(conf_file, homedir, MAXPATHLEN ); conf_file[MAXPATHLEN]='\0'; strcat( conf_file, CFG_FILE1); parse(conf_file,0); } memset((char *)&devices[cur_devs],0,sizeof(struct device)); envConfFile = getenv("MTOOLSRC"); if(envConfFile) parse(envConfFile,0); /* environmental variables */ get_env_conf(); if(mtools_skip_check) mtools_fat_compatibility=1; init_codepage(); } void mtoolstest(int argc, char **argv, int type) { /* testing purposes only */ struct device *dev; int i,j; char *drive=NULL; char *path; if (argc > 1 && (path = skip_drive(argv[1])) > argv[1]) { drive = get_drive(argv[1], NULL); } for (dev=devices; dev->name; dev++) { if(drive && strcmp(drive, dev->drive) != 0) continue; printf("drive %s:\n", dev->drive); printf("\t#fn=%d mode=%d ", dev->file_nr, dev->mode); if(dev->cfg_filename) printf("defined in %s\n", dev->cfg_filename); else printf("builtin\n"); printf("\tfile=\"%s\" fat_bits=%d \n", dev->name,dev->fat_bits); printf("\ttracks=%d heads=%d sectors=%d hidden=%d\n", dev->tracks, dev->heads, dev->sectors, dev->hidden); printf("\toffset=0x%lx\n", (long) dev->offset); printf("\tpartition=%d\n", dev->partition); if(dev->misc_flags) printf("\t"); if(IS_SCSI(dev)) printf("scsi "); if(IS_PRIVILEGED(dev)) printf("privileged"); if(IS_MFORMAT_ONLY(dev)) printf("mformat_only "); if(SHOULD_USE_VOLD(dev)) printf("vold "); #ifdef USE_XDF if(SHOULD_USE_XDF(dev)) printf("use_xdf "); #endif if(dev->misc_flags) printf("\n"); if(dev->mode) printf("\t"); #ifdef O_SYNC if(dev->mode & O_SYNC) printf("sync "); #endif #ifdef O_NDELAY if((dev->mode & O_NDELAY)) printf("nodelay "); #endif #ifdef O_EXCL if((dev->mode & O_EXCL)) printf("exclusive "); #endif if(dev->mode) printf("\n"); if(dev->precmd) printf("\tprecmd=%s\n", dev->precmd); printf("\n"); } printf("tounix:\n"); for(i=0; i < 16; i++) { putchar('\t'); for(j=0; j<8; j++) printf("0x%02x ", (unsigned char)Codepage->tounix[i*8+j]); putchar('\n'); } printf("\nfucase:\n"); for(i=0; i < 16; i++) { putchar('\t'); for(j=0; j<8; j++) printf("0x%02x ", (unsigned char)mstoupper[i*8+j]); putchar('\n'); } if(country_string) printf("COUNTRY=%s\n", country_string); printf("mtools_fat_compatibility=%d\n",mtools_fat_compatibility); printf("mtools_skip_check=%d\n",mtools_skip_check); printf("mtools_lower_case=%d\n",mtools_ignore_short_case); exit(0); } #else /* NO_CONFIG */ void read_config(void) { /* only compiled-in devices */ devices = NewArray(nr_const_devices + 1, struct device); if(!devices) { fprintf(stderr,"Out of memory error\n"); exit(1); } if(nr_const_devices) memcpy(devices, const_devices, nr_const_devices*sizeof(struct device)); } #endif /* NO_CONFIG */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* config.h. Generated automatically by configure. */ /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if on AIX 3. System headers sometimes define this. We just want to avoid a redefinition error message. */ #ifndef _ALL_SOURCE /* #undef _ALL_SOURCE */ #endif /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define if you have <sys/wait.h> that is POSIX.1 compatible. */ #define HAVE_SYS_WAIT_H 1 /* Define as __inline if that's what the C compiler calls it. */ #define inline /* Define if on MINIX. */ #define _MINIX 1 /* Define if the system does not provide POSIX.1 features except with this defined. */ #define _POSIX_1_SOURCE 2 /* Define if you need to in order for stat and other things to work. */ #define _POSIX_SOURCE 1 /* Define as the return type of signal handlers (int or void). */ #define RETSIGTYPE void /* Define if the `setpgrp' function takes no argument. */ #define SETPGRP_VOID 1 /* Define to `unsigned' if <sys/types.h> doesn't define. */ /* #undef size_t */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both <sys/time.h> and <time.h>. */ /* #undef TIME_WITH_SYS_TIME */ /* Define if your <sys/time.h> declares struct tm. */ /* #undef TM_IN_SYS_TIME */ /* Define if the X Window System is missing or not being used. */ #define X_DISPLAY_MISSING 1 /* Define this if you want to use Xdf */ #define USE_XDF 1 /* Define this if you use mtools together with Solaris' vold */ /* #undef USING_VOLD */ /* Define this if you use mtools together with the new Solaris' vold * support */ /* #undef USING_NEW_VOLD */ /* Define for debugging messages */ /* #undef DEBUG */ /* Define on non Unix OS'es which don't have the concept of tty's */ /* #undef USE_RAWTERM */ /* Define when sys_errlist is defined in the standard include files */ /* #undef DECL_SYS_ERRLIST */ /* Define when you want to include floppyd support */ /* #undef USE_FLOPPYD */ /* Define when the compiler supports LOFF_T type */ /* #undef HAVE_LOFF_T */ /* Define when the compiler supports OFFSET_T type */ /* #undef HAVE_OFFSET_T */ /* Define when the compiler supports LONG_LONG type */ /* #undef HAVE_LONG_LONG */ /* Define when the system has a 64 bit off_t type */ /* #undef HAVE_OFF_T_64 */ /* Define when you have an LLSEEK prototype */ /* #undef HAVE_LLSEEK_PROTOTYPE */ /* Define if you have the atexit function. */ #define HAVE_ATEXIT 1 /* Define if you have the basename function. */ /* #undef HAVE_BASENAME */ /* Define if you have the fchdir function. */ #ifdef __minix_vmd #define HAVE_FCHDIR 1 #endif /* Define if you have the flock function. */ /* #undef HAVE_FLOCK */ /* Define if you have the getpass function. */ #define HAVE_GETPASS 1 /* Define if you have the gettimeofday function. */ #define HAVE_GETTIMEOFDAY 1 /* Define if you have the htons function. */ /* #undef HAVE_HTONS */ /* Define if you have the llseek function. */ /* #undef HAVE_LLSEEK */ /* Define if you have the lockf function. */ #define HAVE_LOCKF 1 /* Define if you have the lseek64 function. */ /* #undef HAVE_LSEEK64 */ /* Define if you have the media_oldaliases function. */ /* #undef HAVE_MEDIA_OLDALIASES */ /* Define if you have the memcpy function. */ #define HAVE_MEMCPY 1 /* Define if you have the memmove function. */ #define HAVE_MEMMOVE 1 /* Define if you have the memset function. */ #define HAVE_MEMSET 1 /* Define if you have the on_exit function. */ /* #undef HAVE_ON_EXIT */ /* Define if you have the random function. */ #define HAVE_RANDOM 1 /* Define if you have the seteuid function. */ /* #undef HAVE_SETEUID */ /* Define if you have the setresuid function. */ /* #undef HAVE_SETRESUID */ /* Define if you have the snprintf function. */ #define HAVE_SNPRINTF 1 /* Define if you have the srandom function. */ #define HAVE_SRANDOM 1 /* Define if you have the strcasecmp function. */ #define HAVE_STRCASECMP 1 /* Define if you have the strchr function. */ #define HAVE_STRCHR 1 /* Define if you have the strcspn function. */ #define HAVE_STRCSPN 1 /* Define if you have the strdup function. */ /* #undef HAVE_STRDUP */ /* Define if you have the strerror function. */ #define HAVE_STRERROR 1 /* Define if you have the strncasecmp function. */ #define HAVE_STRNCASECMP 1 /* Define if you have the strpbrk function. */ #define HAVE_STRPBRK 1 /* Define if you have the strrchr function. */ #define HAVE_STRRCHR 1 /* Define if you have the strspn function. */ #define HAVE_STRSPN 1 /* Define if you have the strtol function. */ #define HAVE_STRTOL 1 /* Define if you have the strtoul function. */ #define HAVE_STRTOUL 1 /* Define if you have the tcflush function. */ #define HAVE_TCFLUSH 1 /* Define if you have the tcsetattr function. */ #define HAVE_TCSETATTR 1 /* Define if you have the tzset function. */ #define HAVE_TZSET 1 /* Define if you have the utime function. */ #define HAVE_UTIME 1 /* Define if you have the utimes function. */ /* #undef HAVE_UTIMES */ /* Define if you have the <arpa/inet.h> header file. */ /* #undef HAVE_ARPA_INET_H */ /* Define if you have the <fcntl.h> header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the <getopt.h> header file. */ /* #undef HAVE_GETOPT_H */ /* Define if you have the <libc.h> header file. */ /* #undef HAVE_LIBC_H */ /* Define if you have the <limits.h> header file. */ #define HAVE_LIMITS_H 1 /* Define if you have the <linux/unistd.h> header file. */ /* #undef HAVE_LINUX_UNISTD_H */ /* Define if you have the <malloc.h> header file. */ /* #undef HAVE_MALLOC_H */ /* Define if you have the <memory.h> header file. */ /* #undef HAVE_MEMORY_H */ /* Define if you have the <mntent.h> header file. */ /* #undef HAVE_MNTENT_H */ /* Define if you have the <netdb.h> header file. */ /* #undef HAVE_NETDB_H */ /* Define if you have the <netinet/in.h> header file. */ /* #undef HAVE_NETINET_IN_H */ /* Define if you have the <sgtty.h> header file. */ #define HAVE_SGTTY_H 1 /* Define if you have the <signal.h> header file. */ #define HAVE_SIGNAL_H 1 /* Define if you have the <stdlib.h> header file. */ #define HAVE_STDLIB_H 1 /* Define if you have the <string.h> header file. */ #define HAVE_STRING_H 1 /* Define if you have the <strings.h> header file. */ /* #undef HAVE_STRINGS_H */ /* Define if you have the <sys/file.h> header file. */ /* #undef HAVE_SYS_FILE_H */ /* Define if you have the <sys/floppy.h> header file. */ /* #undef HAVE_SYS_FLOPPY_H */ /* Define if you have the <sys/ioctl.h> header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define if you have the <sys/param.h> header file. */ /* #undef HAVE_SYS_PARAM_H */ /* Define if you have the <sys/signal.h> header file. */ /* #undef HAVE_SYS_SIGNAL_H */ /* Define if you have the <sys/socket.h> header file. */ /* #undef HAVE_SYS_SOCKET_H */ /* Define if you have the <sys/stat.h> header file. */ #define HAVE_SYS_STAT_H 1 /* Define if you have the <sys/sysmacros.h> header file. */ /* #undef HAVE_SYS_SYSMACROS_H */ /* Define if you have the <sys/termio.h> header file. */ /* #undef HAVE_SYS_TERMIO_H */ /* Define if you have the <sys/termios.h> header file. */ /* #undef HAVE_SYS_TERMIOS_H */ /* Define if you have the <sys/time.h> header file. */ /* #undef HAVE_SYS_TIME_H */ /* Define if you have the <termio.h> header file. */ /* #undef HAVE_TERMIO_H */ /* Define if you have the <termios.h> header file. */ #define HAVE_TERMIOS_H 1 /* Define if you have the <unistd.h> header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the <utime.h> header file. */ #define HAVE_UTIME_H 1 /* Define if you have the cam library (-lcam). */ /* #undef HAVE_LIBCAM */ /* Define if you have the nsl library (-lnsl). */ /* #undef HAVE_LIBNSL */ /* Define if you have the socket library (-lsocket). */ /* #undef HAVE_LIBSOCKET */ /* Define if you have the sun library (-lsun). */ /* #undef HAVE_LIBSUN */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������E��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "file.h" #include "llong.h" /* * Copy the data from source to target */ int copyfile(Stream_t *Source, Stream_t *Target) { char buffer[8*16384]; int pos; int ret, retw; size_t len; mt_size_t mt_len; if (!Source){ fprintf(stderr,"Couldn't open source file\n"); return -1; } if (!Target){ fprintf(stderr,"Couldn't open target file\n"); return -1; } pos = 0; GET_DATA(Source, 0, &mt_len, 0, 0); if (mt_len & ~max_off_t_31) { fprintf(stderr, "File too big\n"); return -1; } len = truncBytes32(mt_len); while(1){ ret = READS(Source, buffer, (mt_off_t) pos, 8*16384); if (ret < 0 ){ perror("file read"); return -1; } if(!ret) break; if(got_signal) return -1; if (ret == 0) break; if ((retw = force_write(Target, buffer, (mt_off_t) pos, ret)) != ret){ if(retw < 0 ) perror("write in copy"); else fprintf(stderr, "Short write %d instead of %d\n", retw, ret); if(errno == ENOSPC) got_signal = 1; return ret; } pos += ret; } return pos; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * This file is modified to perform on the UXP/DS operating system * by FUJITSU Limited on 1996.6.4 */ /* * Device tables. See the Configure file for a complete description. */ #define NO_TERMIO #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "devices.h" #define INIT_NOOP #define DEF_ARG1(x) (x), 0x2,0,(char *)0, 0, 0 #define DEF_ARG0(x) 0,DEF_ARG1(x) #define MDEF_ARG 0L,DEF_ARG0(MFORMAT_ONLY_FLAG) #define FDEF_ARG 0L,DEF_ARG0(0) #define VOLD_DEF_ARG 0L,DEF_ARG0(VOLD_FLAG|MFORMAT_ONLY_FLAG) #define MED312 12,0,80,2,36,0,MDEF_ARG /* 3 1/2 extra density */ #define MHD312 12,0,80,2,18,0,MDEF_ARG /* 3 1/2 high density */ #define MDD312 12,0,80,2, 9,0,MDEF_ARG /* 3 1/2 double density */ #define MHD514 12,0,80,2,15,0,MDEF_ARG /* 5 1/4 high density */ #define MDD514 12,0,40,2, 9,0,MDEF_ARG /* 5 1/4 double density (360k) */ #define MSS514 12,0,40,1, 9,0,MDEF_ARG /* 5 1/4 single sided DD, (180k) */ #define MDDsmall 12,0,40,2, 8,0,MDEF_ARG /* 5 1/4 double density (320k) */ #define MSSsmall 12,0,40,1, 8,0,MDEF_ARG /* 5 1/4 single sided DD, (160k) */ #define FED312 12,0,80,2,36,0,FDEF_ARG /* 3 1/2 extra density */ #define FHD312 12,0,80,2,18,0,FDEF_ARG /* 3 1/2 high density */ #define FDD312 12,0,80,2, 9,0,FDEF_ARG /* 3 1/2 double density */ #define FHD514 12,0,80,2,15,0,FDEF_ARG /* 5 1/4 high density */ #define FDD514 12,0,40,2, 9,0,FDEF_ARG /* 5 1/4 double density (360k) */ #define FSS514 12,0,40,1, 9,0,FDEF_ARG /* 5 1/4 single sided DD, (180k) */ #define FDDsmall 12,0,40,2, 8,0,FDEF_ARG /* 5 1/4 double density (320k) */ #define FSSsmall 12,0,40,1, 8,0,FDEF_ARG /* 5 1/4 single sided DD, (160k) */ #define GENHD 16,0, 0,0, 0,0,MDEF_ARG /* Generic 16 bit FAT fs */ #define GENFD 12,0,80,2,18,0,MDEF_ARG /* Generic 12 bit FAT fs */ #define VOLDFD 12,0,80,2,18,0,VOLD_DEF_ARG /* Generic 12 bit FAT fs with vold */ #define GEN 0,0, 0,0, 0,0,MDEF_ARG /* Generic fs of any FAT bits */ #define ZIPJAZ(x,c,h,s,y) 16,(x),(c),(h),(s),(s),0L, 4, \ DEF_ARG1((y)|MFORMAT_ONLY_FLAG) /* Jaz disks */ #define JAZ(x) ZIPJAZ(x,1021, 64, 32, 0) #define RJAZ(x) ZIPJAZ(x,1021, 64, 32, SCSI_FLAG|PRIV_FLAG) #define ZIP(x) ZIPJAZ(x,96, 64, 32, 0) #define RZIP(x) ZIPJAZ(x,96, 64, 32, SCSI_FLAG|PRIV_FLAG) #define REMOTE {"$DISPLAY", 'X', 0,0, 0,0, 0,0,0L, DEF_ARG0(FLOPPYD_FLAG)} #if defined(INIT_GENERIC) || defined(INIT_NOOP) static int compare_geom(struct device *dev, struct device *orig_dev) { if(IS_MFORMAT_ONLY(orig_dev)) return 0; /* geometry only for mformatting ==> ok */ if(!orig_dev || !orig_dev->tracks || !dev || !dev->tracks) return 0; /* no original device. This is ok */ return(orig_dev->tracks != dev->tracks || orig_dev->heads != dev->heads || orig_dev->sectors != dev->sectors); } #endif #define devices const_devices #ifdef OS_aux #define predefined_devices struct device devices[] = { {"/dev/floppy0", "A", GENFD }, {"/dev/rdsk/c104d0s31", "J", JAZ(O_EXCL) }, {"/dev/rdsk/c105d0s31", "Z", ZIP(O_EXCL) }, REMOTE }; #endif /* aux */ #ifdef OS_lynxos #define predefined_devices struct device devices[] = { {"/dev/fd1440.0", "A", MHD312 }, REMOTE }; #endif #ifdef __BEOS__ #define predefined_devices struct device devices[] = { {"/dev/disk/floppy/raw", "A", MHD312 }, REMOTE }; #endif /* BEBOX */ #ifdef OS_hpux #define predefined_devices struct device devices[] = { #ifdef OS_hpux10 /* hpux10 uses different device names according to Frank Maritato * <frank@math.hmc.edu> */ {"/dev/floppy/c0t0d0", "A", MHD312 }, {"/dev/floppy/c0t0d1", "B", MHD312 }, /* guessed by me */ {"/dev/rscsi", "C", GENHD }, /* guessed by me */ #else /* Use rfloppy, according to Simao Campos <simao@iris.ctd.comsat.com> */ {"/dev/rfloppy/c201d0s0", "A", FHD312 }, {"/dev/rfloppy/c20Ad0s0", "A", FHD312 }, {"/dev/rfloppy/c201d1s0", "B", FHD312 }, {"/dev/rfloppy/c20Ad1s0", "B", FHD312 }, {"/dev/rscsi", "C", GENHD }, #endif {"/dev/rdsk/c201d4", "J", RJAZ(O_EXCL) }, {"/dev/rdsk/c201d4s0", "J", RJAZ(O_EXCL) }, {"/dev/rdsk/c201d5", "Z", RZIP(O_EXCL) }, {"/dev/rdsk/c201d5s0", "Z", RZIP(O_EXCL) }, REMOTE }; #ifdef HAVE_SYS_FLOPPY /* geometry setting ioctl's contributed by Paolo Zeppegno * <paolo@to.sem.it>, may cause "Not a typewriter" messages on other * versions according to support@vital.com */ #include <sys/floppy.h> #undef SSIZE struct generic_floppy_struct { struct floppy_geometry fg; }; #define BLOCK_MAJOR 24 #define CHAR_MAJOR 112 static inline int get_parameters(int fd, struct generic_floppy_struct *floppy) { if (ioctl(fd, FLOPPY_GET_GEOMETRY, &(floppy->fg)) != 0) { perror("FLOPPY_GET_GEOMETRY"); return(1); } return 0; } #define TRACKS(floppy) floppy.fg.tracks #define HEADS(floppy) floppy.fg.heads #define SECTORS(floppy) floppy.fg.sectors #define FD_SECTSIZE(floppy) floppy.fg.sector_size #define FD_SET_SECTSIZE(floppy,v) { floppy.fg.sector_size = v; } static inline int set_parameters(int fd, struct generic_floppy_struct *floppy, struct stat *buf) { if (ioctl(fd, FLOPPY_SET_GEOMETRY, &(floppy->fg)) != 0) { perror(""); return(1); } return 0; } #define INIT_GENERIC #endif #endif /* hpux */ #if (defined(OS_sinix) || defined(VENDOR_sni) || defined(SNI)) #define predefined_devices struct device devices[] = { #ifdef CPU_mips /* for Siemens Nixdorf's SINIX-N/O (mips) 5.4x SVR4 */ { "/dev/at/flp/f0t", "A", FHD312}, { "/dev/fd0", "A", GENFD}, #else #ifdef CPU_i386 /* for Siemens Nixdorf's SINIX-D/L (intel) 5.4x SVR4 */ { "/dev/fd0135ds18", "A", FHD312}, { "/dev/fd0135ds9", "A", FDD312}, { "/dev/fd0", "A", GENFD}, { "/dev/fd1135ds15", "B", FHD514}, { "/dev/fd1135ds9", "B", FDD514}, { "/dev/fd1", "B", GENFD}, #endif /* CPU_i386 */ #endif /*mips*/ REMOTE }; #endif #ifdef OS_ultrix #define predefined_devices struct device devices[] = { {"/dev/rfd0a", "A", GENFD}, /* guessed */ {"/dev/rfd0c", "A", GENFD}, /* guessed */ REMOTE }; #endif #ifdef OS_isc #define predefined_devices #if (defined(OS_isc2) && defined(OLDSTUFF)) struct device devices[] = { {"/dev/rdsk/f0d9dt", "A", FDD514}, {"/dev/rdsk/f0q15dt", "A", FHD514}, {"/dev/rdsk/f0d8dt", "A", FDDsmall}, {"/dev/rdsk/f13ht", "B", FHD312}, {"/dev/rdsk/f13dt", "B", FDD312}, {"/dev/rdsk/0p1", "C", GENHD}, {"/usr/vpix/defaults/C:","D",12, 0, 0, 0, 0,8704L,DEF_ARG0}, {"$HOME/vpix/C:", "E", 12, 0, 0, 0, 0,8704L,MDEF_ARG}, REMOTE }; #else /* contributed by larry.jones@sdrc.com (Larry Jones) */ struct device devices[] = { {"/dev/rfd0", "A", GEN}, {"/dev/rfd1", "B", GEN}, {"/dev/rdsk/0p1", "C", GEN}, {"/usr/vpix/defaults/C:","D", GEN, 1}, {"$HOME/vpix/C:", "E", GEN, 1}, REMOTE }; #include <sys/vtoc.h> #include <sys/sysmacros.h> #undef SSIZE #define BLOCK_MAJOR 1 #define CHAR_MAJOR 1 #define generic_floppy_struct disk_parms int ioctl(int, int, void *); static int get_parameters(int fd, struct generic_floppy_struct *floppy) { mt_off_t off; char buf[512]; off = lseek(fd, 0, SEEK_CUR); if(off < 0) { perror("device seek 1"); exit(1); } if (off == 0) { /* need to read at least 1 sector to get correct info */ read(fd, buf, sizeof buf); if(lseek(fd, 0, SEEK_SET) < 0) { perror("device seek 2"); exit(1); } } return ioctl(fd, V_GETPARMS, floppy); } #define TRACKS(floppy) (floppy).dp_cyls #define HEADS(floppy) (floppy).dp_heads #define SECTORS(floppy) (floppy).dp_sectors #define FD_SECTSIZE(floppy) (floppy).dp_secsiz #define FD_SET_SECTSIZE(floppy,v) { (floppy).dp_secsiz = (v); } static int set_parameters(int fd, struct generic_floppy_struct *floppy, struct stat *buf) { return 1; } #define INIT_GENERIC #endif #endif /* isc */ #ifdef CPU_i370 #define predefined_devices struct device devices[] = { {"/dev/rfd0", "A", GENFD}, REMOTE }; #endif /* CPU_i370 */ #ifdef OS_aix /* modified by Federico Bianchi */ #define predefined_devices struct device devices[] = { {"/dev/fd0","A",GENFD}, REMOTE }; #endif /* aix */ #ifdef OS_osf4 /* modified by Chris Samuel <chris@rivers.dra.hmg.gb> */ #define predefined_devices struct device devices[] = { {"/dev/fd0c","A",GENFD}, REMOTE }; #endif /* OS_osf4 */ #ifdef OS_solaris #ifdefE��E��E��E��E��E��E��E��E��E��E��E��E��E��E��E��E��E��E�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� USING_NEW_VOLD char *alias_name = NULL; extern char *media_oldaliases(char *); extern char *media_findname(char *); char *getVoldName(struct device *dev, char *name) { char *rname; if(!SHOULD_USE_VOLD(dev)) return name; /*** * Solaris specific routines to use the volume management * daemon and libraries to get the correct device name... ***/ rname = media_findname(name); #ifdef HAVE_MEDIA_OLDALIASES if (rname == NULL) { if ((alias_name = media_oldaliases(name)) != NULL) rname = media_findname(alias_name); } #endif if (rname == NULL) { fprintf(stderr, "No such volume or no media in device: %s.\n", name); exit(1); } return rname; } #endif /* USING_NEW_VOLD */ #define predefined_devices struct device devices[] = { #ifdef USING_NEW_VOLD {"floppy", "A", VOLDFD }, #elif USING_VOLD {"/vol/dev/aliases/floppy0", "A", GENFD}, {"/dev/rdiskette", "B", GENFD}, #else /* ! USING_VOLD */ {"/dev/rdiskette", "A", GENFD}, {"/vol/dev/aliases/floppy0", "B", GENFD}, #endif /* USING_VOLD */ {"/dev/rdsk/c0t4d0s2", "J", RJAZ(O_NDELAY)}, {"/dev/rdsk/c0t5d0s2", "Z", RZIP(O_NDELAY)}, REMOTE }; /* * Ofer Licht <ofer@stat.Berkeley.EDU>, May 14, 1997. */ #define INIT_GENERIC #include <sys/fdio.h> #include <sys/mkdev.h> /* for major() */ struct generic_floppy_struct { struct fd_char fdchar; }; #define BLOCK_MAJOR 36 #define CHAR_MAJOR 36 static inline int get_parameters(int fd, struct generic_floppy_struct *floppy) { if (ioctl(fd, FDIOGCHAR, &(floppy->fdchar)) != 0) { perror(""); ioctl(fd, FDEJECT, NULL); return(1); } return 0; } #define TRACKS(floppy) floppy.fdchar.fdc_ncyl #define HEADS(floppy) floppy.fdchar.fdc_nhead #define SECTORS(floppy) floppy.fdchar.fdc_secptrack /* SECTORS_PER_DISK(floppy) not used */ #define FD_SECTSIZE(floppy) floppy.fdchar.fdc_sec_size #define FD_SET_SECTSIZE(floppy,v) { floppy.fdchar.fdc_sec_size = v; } static inline int set_parameters(int fd, struct generic_floppy_struct *floppy, struct stat *buf) { if (ioctl(fd, FDIOSCHAR, &(floppy->fdchar)) != 0) { ioctl(fd, FDEJECT, NULL); perror(""); return(1); } return 0; } #define INIT_GENERIC #endif /* solaris */ #ifdef OS_sunos3 #define predefined_devices struct device devices[] = { {"/dev/rfdl0c", "A", FDD312}, {"/dev/rfd0c", "A", FHD312}, REMOTE }; #endif /* OS_sunos3 */ #ifdef OS_xenix #define predefined_devices struct device devices[] = { {"/dev/fd096ds15", "A", FHD514}, {"/dev/fd048ds9", "A", FDD514}, {"/dev/fd1135ds18", "B", FHD312}, {"/dev/fd1135ds9", "B", FDD312}, {"/dev/hd0d", "C", GENHD}, REMOTE }; #endif /* OS_xenix */ #ifdef OS_sco #define predefined_devices struct device devices[] = { { "/dev/fd0135ds18", "A", FHD312}, { "/dev/fd0135ds9", "A", FDD312}, { "/dev/fd0", "A", GENFD}, { "/dev/fd1135ds15", "B", FHD514}, { "/dev/fd1135ds9", "B", FDD514}, { "/dev/fd1", "B", GENFD}, { "/dev/hd0d", "C", GENHD}, REMOTE }; #endif /* OS_sco */ #ifdef OS_irix #define predefined_devices struct device devices[] = { { "/dev/rdsk/fds0d2.3.5hi", "A", FHD312}, { "/dev/rdsk/fds0d2.3.5", "A", FDD312}, { "/dev/rdsk/fds0d2.96", "A", FHD514}, {"/dev/rdsk/fds0d2.48", "A", FDD514}, REMOTE }; #endif /* OS_irix */ #ifdef OS_sunos4 #include <sys/ioctl.h> #include <sun/dkio.h> #define predefined_devices struct device devices[] = { {"/dev/rfd0c", "A", GENFD}, {"/dev/rsd4c", "J", RJAZ(O_NDELAY)}, {"/dev/rsd5c", "Z", RZIP(O_NDELAY)}, REMOTE }; /* * Stuffing back the floppy parameters into the driver allows for gems * like 10 sector or single sided floppies from Atari ST systems. * * Martin Schulz, Universite de Moncton, N.B., Canada, March 11, 1991. */ #define INIT_GENERIC struct generic_floppy_struct { struct fdk_char dkbuf; struct dk_map dkmap; }; #define BLOCK_MAJOR 16 #define CHAR_MAJOR 54 static inline int get_parameters(int fd, struct generic_floppy_struct *floppy) { if (ioctl(fd, DKIOCGPART, &(floppy->dkmap)) != 0) { perror("DKIOCGPART"); ioctl(fd, FDKEJECT, NULL); return(1); } if (ioctl(fd, FDKIOGCHAR, &( floppy->dkbuf)) != 0) { perror(""); ioctl(fd, FDKEJECT, NULL); return(1); } return 0; } #define TRACKS(floppy) floppy.dkbuf.ncyl #define HEADS(floppy) floppy.dkbuf.nhead #define SECTORS(floppy) floppy.dkbuf.secptrack #define SECTORS_PER_DISK(floppy) floppy.dkmap.dkl_nblk #define FD_SECTSIZE(floppy) floppy.dkbuf.sec_size #define FD_SET_SECTSIZE(floppy,v) { floppy.dkbuf.sec_size = v; } static inline int set_parameters(int fd, struct generic_floppy_struct *floppy, struct stat *buf) { if (ioctl(fd, FDKIOSCHAR, &(floppy->dkbuf)) != 0) { ioctl(fd, FDKEJECT, NULL); perror(""); return(1); } if (ioctl(fd, ( unsigned int) DKIOCSPART, &(floppy->dkmap)) != 0) { ioctl(fd, FDKEJECT, NULL); perror(""); return(1); } return 0; } #define INIT_GENERIC #endif /* sparc && sunos */ #ifdef DPX1000 #define predefined_devices struct device devices[] = { /* [block device]: DPX1000 has /dev/flbm60, DPX2 has /dev/easyfb */ {"/dev/flbm60", "A", MHD514}; {"/dev/flbm60", "B", MDD514}, {"/dev/flbm60", "C", MDDsmall}, {"/dev/flbm60", "D", MSS}, {"/dev/flbm60", "E", MSSsmall}, REMOTE }; #endif /* DPX1000 */ #ifdef OS_bosx #define predefined_devices struct device devices[] = { /* [block device]: DPX1000 has /dev/flbm60, DPX2 has /dev/easyfb */ {"/dev/easyfb", "A", MHD514}, {"/dev/easyfb", "B", MDD514}, {"/dev/easyfb", "C", MDDsmall}, {"/dev/easyfb", "D", MSS}, {"/dev/easyfb", "E", MSSsmall}, REMOTE }; #endif /* OS_bosx */ #ifdef OS_linux const char *error_msg[22]={ "Missing Data Address Mark", "Bad cylinder", "Scan not satisfied", "Scan equal hit", "Wrong cylinder", "CRC error in data field", "Control Mark = deleted", 0, "Missing Address Mark", "Write Protect", "No Data - unreadable", 0, "OverRun", "CRC error in data or address", 0, "End Of Cylinder", 0, 0, 0, "Not ready", "Equipment check error", "Seek end" }; static inline void print_message(RawRequest_t *raw_cmd,const char *message) { int i, code; if(!message) return; fprintf(stderr," "); for (i=0; i< raw_cmd->cmd_count; i++) fprintf(stderr,"%2.2x ", (int)raw_cmd->cmd[i] ); fprintf(stderr,"\n"); for (i=0; i< raw_cmd->reply_count; i++) fprintf(stderr,"%2.2x ", (int)raw_cmd->reply[i] ); fprintf(stderr,"\n"); code = (raw_cmd->reply[0] <<16) + (raw_cmd->reply[1] << 8) + raw_cmd->reply[2]; for(i=0; i<22; i++){ if ((code & (1 << i)) && error_msg[i]) fprintf(stderr,"%s\n", error_msg[i]); } } /* return values: * -1: Fatal error, don't bother retrying. * 0: OK * 1: minor error, retry */ int send_one_cmd(int fd, RawRequest_t *raw_cmd, const char *message) { if (ioctl( fd, FDRAWCMD, raw_cmd) >= 0) { if (raw_cmd->reply_count < 7) { fprintf(stderr,"Short reply from FDC\n"); return -1; } return 0; } switch(errno) { case EBUSY: fprintf(stderr, "FDC busy, sleeping for a second\n"); sleep(1); return 1; case EIO: fprintf(stderr,"resetting controller\n"); if(ioctl(fd, FDRESET, 2) < 0){ perror("reset"); return -1; } return 1; default: perror(message); return -1; } } /* * return values * -1: error * 0: OK, last sector * 1: more raw commands follow */ int analyze_one_reply(RawRequest_t *raw_cmd, int *bytes, int do_print) { if(raw_cmd->reply_count == 7) { int end; if (raw_cmd->reply[3] != raw_cmd->cmd[2]) { /* end of cylinder */ end = raw_cmd->cmd[6] + 1; } else { end = raw_cmd->reply[5]; } *bytes = end - raw_cmd->cmd[4]; /* FIXME: over/under run */ *bytes = *bytes << (7 + raw_cmd->cmd[5]); } else *bytes = 0; switch(raw_cmd->reply[0] & 0xc0){ case 0x40: if ((raw_cmd->reply[0] & 0x38) == 0 && (raw_cmd->reply[1]) == 0x80 && (raw_cmd->reply[2]) == 0) { *bytes += 1 << (7 + raw_cmd->cmd[5]); break; } if ( raw_cmd->reply[1] & ST1_WP ){ *bytes = 0; fprintf(stderr, "This disk is write protected\n"); return -1; } if(!*bytes && do_print) print_message(raw_cmd, ""); return -1; case 0x80: *bytes = 0; fprintf(stderr, "invalid command given\n"); return -1; case 0xc0: *bytes = 0; fprintf(stderr, "abnormal termination caused by polling\n"); return -1; default: break; } #ifdef FD_RAW_MORE if(raw_cmd->flags & FD_RAW_MORE) return 1; #endif return 0; } #define predefined_devices struct device devices[] = { {"/dev/fd0", "A", 0, O_EXCL, 80,2, 18,0, MDEF_ARG}, {"/dev/fd1", "B", 0, O_EXCL, 0,0, 0,0, FDEF_ARG}, /* we assume that the Zip or Jaz drive is the second on the SCSI bus */ {"/dev/sdb4","J", GENHD }, {"/dev/sdb4","Z", GENHD }, /* {"/dev/sda4","D", GENHD },*/ REMOTE }; /* * Stuffing back the floppy parameters into the driver allows for gems * like 21 sector or single sided floppies from Atari ST systems. * * Alain Knaff, Universit Joseph Fourier, France, November 12, 1993. */ #define INIT_GENERIC #define generic_floppy_struct floppy_struct #define BLOCK_MAJOR 2 #define SECTORS(floppy) floppy.sect #define TRACKS(floppy) floppy.track #define HEADS(floppy) floppy.head #define SECTORS_PER_DISK(floppy) floppy.size #define STRETCH(floppy) floppy.stretch #define USE_2M(floppy) ((floppy.rate & FD_2M) ? 0xff : 0x80 ) #define SSIZE(floppy) ((((floppy.rate & 0x38) >> 3 ) + 2) % 8) static inline void set_2m(struct floppy_struct *floppy, int value) { if (value & 0x7f) value = FD_2M; else value = 0; floppy->rate = (floppy->rate & ~FD_2M) | value; } #define SET_2M set_2m static inline void set_ssize(struct floppy_struct *floppy, int value) { value = (( (value & 7) + 6 ) % 8) << 3; floppy->rate = (floppy->rate & ~0x38) | value; } #define SET_SSIZE set_ssize static inline int set_parameters(int fd, struct floppy_struct *floppy, struct stat *buf) { if ( ( MINOR(buf->st_rdev ) & 0x7f ) > 3 ) return 1; return ioctl(fd, FDSETPRM, floppy); } static inline int get_parameters(int fd, struct floppy_struct *floppy) { return ioctl(fd, FDGETPRM, floppy); } #endif /* linux */ /* OS/2, gcc+emx */ #ifdef __EMX__ #define predefined_devices struct device devices[] = { {"A:", "A", GENFD}, {"B:", "B", GENFD}, }; #define INIT_NOOP #endif /*** /jes -- for D.O.S. 486 BL DX2/80 ***/ #ifdef OS_freebsd #define predefined_devices struct device devices[] = { {"/dev/rfd0.1440", "A", FHD312}, {"/dev/rfd0.720", "A", FDD312}, {"/dev/rfd1.1200", "B", MHD514}, {"/dev/sd0s1", "C", GENHD}, REMOTE }; #endif /* __FreeBSD__ */ /*** /jes -- for ALR 486 DX4/100 ***/ #if defined(OS_netbsd) #define predefined_devices struct device devices[] = { {"/dev/rfd0a", "A", FHD312}, {"/dev/rfd0f", "A", FDD312}, {"/dev/rfd0f", "S", MDD312}, {"/dev/rfd1a", "B", FHD514}, {"/dev/rfd1d", "B", FDD514}, {"/dev/rfd1d", "T", MDD514}, {"/dev/rwd0d", "C", 16, 0, 0, 0, 0, 0, 63L*512L, DEF_ARG0(0)}, REMOTE }; #endif /* OS_NetBSD */ /* fgsch@openbsd.org 2000/05/19 */ #if defined(OS_openbsd) #define predefined_devices struct device devices[] = { {"/dev/rfd0Bc", "A", FHD312}, {"/dev/rfd0Fc", "A", FDD312}, {"/dev/rfd1Cc", "B", FHD514}, {"/dev/rfd1Dc", "B", FDD514}, {"/dev/rwd0c", "C", 16, 0, 0, 0, 0, 0, 63L*512L, DEF_ARG0(0)}, REMOTE }; #endif /* OS_openbsd */ #if (!defined(predefined_devices) && defined (CPU_m68000) && defined (OS_sysv)) #include <sys/gdioctl.h> #define predefined_devices struct device devices[] = { {"/dev/rfp020", "A", 12,O_NDELAY,40,2, 9, 0, MDEF_ARG}, {"/usr/bin/DOS/dvd000", "C", GENFD}, REMOTE }; #undef INIT_NOOP int init_geom(int fd, struct device *dev, struct device *orig_dev, struct stat *stat) { struct gdctl gdbuf; if (ioctl(fd, GDGETA, &gdbuf) == -1) { ioctl(fd, GDDISMNT, &gdbuf); return 1; } if((dev->use_2m & 0x7f) || (dev->ssize & 0x7f)) return 1; SET_INT(gdbuf.params.cyls,dev->ntracks); SET_INT(gdbuf.params.heads,dev->nheads); SET_INT(gdbuf.params.psectrk,dev->nsect); dev->ntracks = gdbuf.params.cyls; dev->nheads = gdbuf.params.heads; dev->nsect = gdbuf.params.psectrk; dev->use_2m = 0x80; dev->ssize = 0x82; gdbuf.params.pseccyl = gdbuf.params.psectrk * gdbuf.params.heads; gdbuf.params.flags = 1; /* disk type flag */ gdbuf.params.step = 0; /* step rate for controller */ gdbuf.params.sectorsz = 512; /* sector size */ if (ioctl(fd, GDSETA, &gdbuf) < 0) { ioctl(fd, GDDISMNT, &gdbuf); return(1); } return(0); } #endif /* (defined (m68000) && defined (sysv))*/ #ifdef CPU_alpha #ifndef OS_osf4 #ifdef __osf__ #include <sys/fcntl.h> #define predefined_devices struct device devices[] = { {"/dev/rfd0c", "A", GENFD}, REMOTE }; #endif #endif #endif #ifdef OS_osf #ifndef predefined_devices #define predefined_devices struct device devices[] = { {"/dev/fd0a", "A", MHD312 } }; REMOTE #endif #endif #ifdef OS_nextstep #define predefined_devices struct device devices[] = { #ifdef CPU_m68k {"/dev/rfd0b", "A", MED312 }, REMOTE #else {"/dev/rfd0b", "A", MHD312 }, REMOTE #endif }; #endif #if (!defined(predefined_devices) && defined(OS_sysv4)) #ifdef __uxp__ #define predefined_devices struct device devices[] = { {"/dev/fpd0", "A", FHD312}, {"/dev/fpd0", "A", FDD312}, REMOTE }; #else #define predefined_devices struct device devices[] = { {"/dev/rdsk/f1q15dt", "B", FHD514}, {"/dev/rdsk/f1d9dt", "B", FDD514}, {"/dev/rdsk/f1d8dt", "B", FDDsmall}, {"/dev/rdsk/f03ht", "A", FHD312}, {"/dev/rdsk/f03dt", "A", FDD312}, {"/dev/rdsk/dos", "C", GENHD}, REMOTE }; #endif #endif /* sysv4 */ #ifdef OS_Minix /* Minix and Minix-vmd device list. Only present to attach the A: and B: * drive letters to the floppies by default. Other devices can be given * a drive letter by linking the device file to /dev/dosX, where X is a * drive letter. Or one can use something like 'fd0:' for a drive name. * Kees J. Bot <kjb@cs.vu.nl> */ #include <minix/partition.h> #include <minix/u64.h> #define predefined_devices struct device devices[] = { {"/dev/fd0", "A", GEN}, {"/dev/fd1", "B", GEN}, }; #undef INIT_NOOP int init_geom(int fd, struct device *dev, struct device *orig_dev, struct stat *stat) { /* Try to obtain the device parameters from the device driver. * Don't fret if you can't, mtools will use the DOS boot block. */ struct partition geom; unsigned long tot_sectors; if (ioctl(fd, DIOCGETP, &geom) == 0) { dev->hidden = div64u(geom.base, 512); tot_sectors = div64u(geom.size, 512); dev->tracks = tot_sectors / (geom.heads * geom.sectors); dev->heads = geom.heads; dev->sectors = geom.sectors; } return(0); } #endif /* OS_Minix */ #ifdef INIT_GENERIC #ifndef USE_2M #define USE_2M(x) 0x80 #endif #ifndef SSIZE #define SSIZE(x) 0x82 #endif #ifndef SET_2M #define SET_2M(x,y) return -1 #endif #ifndef SET_SSIZE #define SET_SSIZE(x,y) return -1 #endif #undef INIT_NOOP int init_geom(int fd, struct device *dev, struct device *orig_dev, struct stat *stat) { struct generic_floppy_struct floppy; int change; /* * succeed if we don't have a floppy * this is the case for dosemu floppy image files for instance */ if (!((S_ISBLK(stat->st_mode) && major(stat->st_rdev) == BLOCK_MAJOR) #ifdef CHAR_MAJOR || (S_ISCHR(stat->st_mode) && major(stat->st_rdev) == CHAR_MAJOR) #endif )) return compare_geom(dev, orig_dev); /* * We first try to get the current floppy parameters from the kernel. * This allows us to * 1. get the rate * 2. skip the parameter setting if the parameters are already o.k. */ if (get_parameters( fd, & floppy ) ) /* * autodetection failure. * This mostly occurs because of an absent or unformatted disks. * * It might also occur because of bizarre formats (for example * rate 1 on a 3 1/2 disk). * If this is the case, the user should do an explicit * setfdprm before calling mtools * * Another cause might be pre-existing wrong parameters. The * user should do an setfdprm -c to repair this situation. * * ...fail immediately... ( Theoretically, we could try to save * the situation by trying out all rates, but it would be slow * and awkward) */ return 1; /* * if we have already have the correct parameters, keep them. * the number of tracks doesn't need to match exactly, it may be bigger. * the number of heads and sectors must match exactly, to avoid * miscalculation of the location of a block on the disk */ change = 0; if(compare(dev->sectors, SECTORS(floppy))){ SECTORS(floppy) = dev->sectors; change = 1; } else dev->sectors = SECTORS(floppy); if(compare(dev->heads, HEADS(floppy))){ HEADS(floppy) = dev->heads; change = 1; } else dev->heads = HEADS(floppy); if(compare(dev->tracks, TRACKS(floppy))){ TRACKS(floppy) = dev->tracks; change = 1; } else dev->tracks = TRACKS(floppy); if(compare(dev->use_2m, USE_2M(floppy))){ SET_2M(&floppy, dev->use_2m); change = 1; } else dev->use_2m = USE_2M(floppy); if( ! (dev->ssize & 0x80) ) dev->ssize = 0; if(compare(dev->ssize, SSIZE(floppy) + 128)){ SET_SSIZE(&floppy, dev->ssize); change = 1; } else dev->ssize = SSIZE(floppy); if(!change) /* no change, succeed */ return 0; #ifdef SECTORS_PER_TRACK SECTORS_PER_TRACK(floppy) = dev->sectors * dev->heads; #endif #ifdef SECTORS_PER_DISK SECTORS_PER_DISK(floppy) = dev->sectors * dev->heads * dev->tracks; #endif #ifdef STRETCH /* ... and the stretch */ if ( dev->tracks > 41 ) STRETCH(floppy) = 0; else STRETCH(floppy) = 1; #endif return set_parameters( fd, &floppy, stat) ; } #endif /* INIT_GENERIC */ #ifdef INIT_NOOP int init_geom(int fd, struct device *dev, struct device *orig_dev, struct stat *stat) { return compare_geom(dev, orig_dev); } #endif #ifdef predefined_devices const int nr_const_devices = sizeof(const_devices) / sizeof(*const_devices); #else struct device devices[]={ {"/dev/fd0", "A", 0, O_EXCL, 0,0, 0,0, MDEF_ARG}, /* to shut up Ultrix's native compiler, we can't make this empty :( */ }; const nr_const_devices = 0; #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifdef OS_linux #ifdef HAVE_SYS_SYSMACROS_H #include <sys/sysmacros.h> #ifndef MAJOR #define MAJOR(dev) major(dev) #endif /* MAJOR not defined */ #ifndef MINOR #define MINOR(dev) minor(dev) #endif /* MINOR not defined */ #else #include <linux/fs.h> /* get MAJOR/MINOR from Linux kernel */ #ifndef major #define major(x) MAJOR(x) #endif #endif /* HAVE_SYS_SYSMACROS_H */ #include <linux/fd.h> #include <linux/fdreg.h> #include <linux/major.h> typedef struct floppy_raw_cmd RawRequest_t; UNUSED(static inline void RR_INIT(struct floppy_raw_cmd *request)) { request->data = 0; request->length = 0; request->cmd_count = 9; request->flags = FD_RAW_INTR | FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK #ifdef FD_RAW_SOFTFAILUE | FD_RAW_SOFTFAILURE | FD_RAW_STOP_IF_FAILURE #endif ; request->cmd[1] = 0; request->cmd[6] = 0; request->cmd[7] = 0x1b; request->cmd[8] = 0xff; request->reply_count = 0; } UNUSED(static inline void RR_SETRATE(struct floppy_raw_cmd *request, int rate)) { request->rate = rate; } UNUSED(static inline void RR_SETDRIVE(struct floppy_raw_cmd *request,int drive)) { request->cmd[1] = (request->cmd[1] & ~3) | (drive & 3); } UNUSED(static inline void RR_SETTRACK(struct floppy_raw_cmd *request,int track)) { request->cmd[2] = track; } UNUSED(static inline void RR_SETPTRACK(struct floppy_raw_cmd *request, int track)) { request->track = track; } UNUSED(static inline void RR_SETHEAD(struct floppy_raw_cmd *request, int head)) { if(head) request->cmd[1] |= 4; else request->cmd[1] &= ~4; request->cmd[3] = head; } UNUSED(static inline void RR_SETSECTOR(struct floppy_raw_cmd *request, int sector)) { request->cmd[4] = sector; request->cmd[6] = sector-1; } UNUSED(static inline void RR_SETSIZECODE(struct floppy_raw_cmd *request, int sizecode)) { request->cmd[5] = sizecode; request->cmd[6]++; request->length += 128 << sizecode; } #if 0 static inline void RR_SETEND(struct floppy_raw_cmd *request, int end) { request->cmd[6] = end; } #endif UNUSED(static inline void RR_SETDIRECTION(struct floppy_raw_cmd *request, int direction)) { if(direction == MT_READ) { request->flags |= FD_RAW_READ; request->cmd[0] = FD_READ & ~0x80; } else { request->flags |= FD_RAW_WRITE; request->cmd[0] = FD_WRITE & ~0x80; } } UNUSED(static inline void RR_SETDATA(struct floppy_raw_cmd *request, caddr_t data)) { request->data = data; } #if 0 static inline void RR_SETLENGTH(struct floppy_raw_cmd *request, int length) { request->length += length; } #endif UNUSED(static inline void RR_SETCONT(struct floppy_raw_cmd *request)) { #ifdef FD_RAW_MORE request->flags |= FD_RAW_MORE; #endif } UNUSED(static inline int RR_SIZECODE(struct floppy_raw_cmd *request)) { return request->cmd[5]; } UNUSED(static inline int RR_TRACK(struct floppy_raw_cmd *request)) { return request->cmd[2]; } UNUSED(static inline int GET_DRIVE(int fd)) { struct stat statbuf; if (fstat(fd, &statbuf) < 0 ){ perror("stat"); return -1; } if (!S_ISBLK(statbuf.st_mode) || MAJOR(statbuf.st_rdev) != FLOPPY_MAJOR) return -1; return MINOR( statbuf.st_rdev ); } /* void print_message(RawRequest_t *raw_cmd,char *message);*/ int send_one_cmd(int fd, RawRequest_t *raw_cmd, const char *message); int analyze_one_reply(RawRequest_t *raw_cmd, int *bytes, int do_print); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "vfat.h" #include "dirCache.h" void myfree(void *a) { free(a); } #define free myfree #define BITS_PER_INT (sizeof(unsigned int) * 8) static inline unsigned int rol(unsigned int arg, int shift) { arg &= 0xffffffff; /* for 64 bit machines */ return (arg << shift) | (arg >> (32 - shift)); } static int calcHash(char *name) { unsigned long hash; int i; unsigned char c; hash = 0; i = 0; while(*name) { /* rotate it */ hash = rol(hash,5); /* a shift of 5 makes sure we spread quickly * over the whole width, moreover, 5 is * prime with 32, which makes sure that * successive letters cannot cover each * other easily */ c = toupper(*name); hash ^= (c * (c+2)) ^ (i * (i+2)); hash &= 0xffffffff; i++, name++; } hash = hash * (hash + 2); /* the following two xors make sure all info is spread evenly over all * bytes. Important if we only keep the low order bits later on */ hash ^= (hash & 0xfff) << 12; hash ^= (hash & 0xff000) << 24; return hash; } static int addBit(unsigned int *bitmap, int hash, int checkOnly) { int bit, entry; bit = 1 << (hash % BITS_PER_INT); entry = (hash / BITS_PER_INT) % DC_BITMAP_SIZE; if(checkOnly) return bitmap[entry] & bit; else { bitmap[entry] |= bit; return 1; } } static int _addHash(dirCache_t *cache, unsigned int hash, int checkOnly) { return addBit(cache->bm0, hash, checkOnly) && addBit(cache->bm1, rol(hash,12), checkOnly) && addBit(cache->bm2, rol(hash,24), checkOnly); } static void addNameToHash(dirCache_t *cache, char *name) { _addHash(cache, calcHash(name), 0); } static void hashDce(dirCache_t *cache, dirCacheEntry_t *dce) { if(dce->beginSlot != cache->nrHashed) return; cache->nrHashed = dce->endSlot; if(dce->longName) addNameToHash(cache, dce->longName); addNameToHash(cache, dce->shortName); } int isHashed(dirCache_t *cache, char *name) { int ret; ret = _addHash(cache, calcHash(name), 1); return ret; } void checkXYZ(dirCache_t *cache) { if(cache->entries[2]) printf(" at 2 = %d\n", cache->entries[2]->beginSlot); } int growDirCache(dirCache_t *cache, int slot) { if(slot < 0) { fprintf(stderr, "Bad slot %d\n", slot); exit(1); } if( cache->nr_entries <= slot) { int i; cache->entries = realloc(cache->entries, (slot+1) * 2 * sizeof(dirCacheEntry_t *)); if(!cache->entries) return -1; for(i= cache->nr_entries; i < (slot+1) * 2; i++) { cache->entries[i] = 0; } cache->nr_entries = (slot+1) * 2; } return 0; } dirCache_t *allocDirCache(Stream_t *Stream, int slot) { dirCache_t **dcp; if(slot < 0) { fprintf(stderr, "Bad slot %d\n", slot); exit(1); } dcp = getDirCacheP(Stream); if(!*dcp) { *dcp = New(dirCache_t); if(!*dcp) return 0; (*dcp)->entries = NewArray((slot+1)*2+5, dirCacheEntry_t *); if(!(*dcp)->entries) { free(*dcp); return 0; } (*dcp)->nr_entries = (slot+1) * 2; memset( (*dcp)->bm0, 0, DC_BITMAP_SIZE); memset( (*dcp)->bm1, 0, DC_BITMAP_SIZE); memset( (*dcp)->bm2, 0, DC_BITMAP_SIZE); (*dcp)->nrHashed = 0; } else if(growDirCache(*dcp, slot) < 0) return 0; return *dcp; } static void freeDirCacheRange(dirCache_t *cache, int beginSlot, int endSlot) { dirCacheEntry_t *entry; int clearBegin; int clearEnd; int i; if(endSlot < beginSlot) { fprintf(stderr, "Bad slots %d %d in free range\n", beginSlot, endSlot); exit(1); } while(beginSlot < endSlot) { entry = cache->entries[beginSlot]; if(!entry) { beginSlot++; continue; } clearEnd = entry->endSlot; if(clearEnd > endSlot) clearEnd = endSlot; clearBegin = beginSlot; for(i = clearBegin; i <clearEnd; i++) cache->entries[i] = 0; if(entry->endSlot == endSlot) entry->endSlot = beginSlot; else if(entry->beginSlot == beginSlot) entry->beginSlot = endSlot; else { fprintf(stderr, "Internal error, non contiguous de-allocation\n"); fprintf(stderr, "%d %d\n", beginSlot, endSlot); fprintf(stderr, "%d %d\n", entry->beginSlot, entry->endSlot); exit(1); } if(entry->beginSlot == entry->endSlot) { if(entry->longName) free(entry->longName); if(entry->shortName) free(entry->shortName); free(entry); } beginSlot = clearEnd; } } static dirCacheEntry_t *allocDirCacheEntry(dirCache_t *cache, int beginSlot, int endSlot, dirCacheEntryType_t type) { dirCacheEntry_t *entry; int i; if(growDirCache(cache, endSlot) < 0) return 0; entry = New(dirCacheEntry_t); if(!entry) return 0; entry->type = type; entry->longName = 0; entry->shortName = 0; entry->beginSlot = beginSlot; entry->endSlot = endSlot; freeDirCacheRange(cache, beginSlot, endSlot); for(i=beginSlot; i<endSlot; i++) { cache->entries[i] = entry; } return entry; } dirCacheEntry_t *addUsedEntry(dirCache_t *cache, int beginSlot, int endSlot, char *longName, char *shortName, struct directory *dir) { dirCacheEntry_t *entry; if(endSlot < beginSlot) { fprintf(stderr, "Bad slots %d %d in add used entry\n", beginSlot, endSlot); exit(1); } entry = allocDirCacheEntry(cache, beginSlot, endSlot, DCET_USED); if(!entry) return 0; entry->beginSlot = beginSlot; entry->endSlot = endSlot; if(longName) entry->longName = strdup(longName); entry->shortName = strdup(shortName); entry->dir = *dir; hashDce(cache, entry); return entry; } static void mergeFreeSlots(dirCache_t *cache, int slot) { dirCacheEntry_t *previous, *next; int i; if(slot == 0) return; previous = cache->entries[slot-1]; next = cache->entries[slot]; if(next && next->type == DCET_FREE && previous && previous->type == DCET_FREE) { for(i=next->beginSlot; i < next->endSlot; i++) cache->entries[i] = previous; previous->endSlot = next->endSlot; free(next); } } dirCacheEntry_t *addFreeEntry(dirCache_t *cache, int beginSlot, int endSlot) { dirCacheEntry_t *entry; if(beginSlot < cache->nrHashed) cache->nrHashed = beginSlot; if(endSlot < beginSlot) { fprintf(stderr, "Bad slots %d %d in add free entry\n", beginSlot, endSlot); exit(1); } if(endSlot == beginSlot) return 0; entry = allocDirCacheEntry(cache, beginSlot, endSlot, DCET_FREE); mergeFreeSlots(cache, beginSlot); mergeFreeSlots(cache, endSlot); return cache->entries[beginSlot]; } dirCacheEntry_t *addEndEntry(dirCache_t *cache, int pos) { return allocDirCacheEntry(cache, pos, pos+1, DCET_END); } dirCacheEntry_t *lookupInDircache(dirCache_t *cache, int pos) { if(growDirCache(cache, pos+1) < 0) return 0; return cache->entries[pos]; } void freeDirCache(Stream_t *Stream) { dirCache_t *cache, **dcp; dcp = getDirCacheP(Stream); cache = *dcp; if(cache) { freeDirCacheRange(cache, 0, cache->nr_entries); free(cache); *dcp = 0; } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_DIRCACHE_H #define MTOOLS_DIRCACHE_H typedef enum { DCET_FREE, DCET_USED, DCET_END } dirCacheEntryType_t; #define DC_BITMAP_SIZE 128 typedef struct dirCacheEntry_t { dirCacheEntryType_t type; int beginSlot; int endSlot; char *shortName; char *longName; struct directory dir; } dirCacheEntry_t; typedef struct dirCache_t { struct dirCacheEntry_t **entries; int nr_entries; unsigned int nrHashed; unsigned int bm0[DC_BITMAP_SIZE]; unsigned int bm1[DC_BITMAP_SIZE]; unsigned int bm2[DC_BITMAP_SIZE]; } dirCache_t; int isHashed(dirCache_t *cache, char *name); int growDirCache(dirCache_t *cache, int slot); dirCache_t *allocDirCache(Stream_t *Stream, int slot); dirCacheEntry_t *addUsedEntry(dirCache_t *Stream, int begin, int end, char *longName, char *shortName, struct directory *dir); void freeDirCache(Stream_t *Stream); dirCacheEntry_t *addFreeEntry(dirCache_t *Stream, int begin, int end); dirCacheEntry_t *addEndEntry(dirCache_t *Stream, int pos); dirCacheEntry_t *lookupInDircache(dirCache_t *Stream, int pos); #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "mtools.h" #include "file.h" #include "fs.h" /* #define DEBUG */ /* * Read a directory entry into caller supplied buffer */ struct directory *dir_read(direntry_t *entry, int *error) { int n; *error = 0; if((n=force_read(entry->Dir, (char *) (&entry->dir), (mt_off_t) entry->entry * MDIR_SIZE, MDIR_SIZE)) != MDIR_SIZE) { if (n < 0) { *error = -1; } return NULL; } return &entry->dir; } /* * Make a subdirectory grow in length. Only subdirectories (not root) * may grow. Returns a 0 on success, 1 on failure (disk full), or -1 * on error. */ int dir_grow(Stream_t *Dir, int size) { Stream_t *Stream = GetFs(Dir); DeclareThis(FsPublic_t); int ret; int buflen; char *buffer; if (!getfreeMinClusters(Dir, 1)) return -1; buflen = This->cluster_size * This->sector_size; if(! (buffer=malloc(buflen)) ){ perror("dir_grow: malloc"); return -1; } memset((char *) buffer, '\0', buflen); ret = force_write(Dir, buffer, (mt_off_t) size * MDIR_SIZE, buflen); free(buffer); if(ret < buflen) return -1; return 0; } void low_level_dir_write(direntry_t *entry) { force_write(entry->Dir, (char *) (&entry->dir), (mt_off_t) entry->entry * MDIR_SIZE, MDIR_SIZE); } /* * Make a directory entry. Builds a directory entry based on the * name, attribute, starting cluster number, and size. Returns a pointer * to a static directory structure. */ struct directory *mk_entry(const char *filename, char attr, unsigned int fat, size_t size, time_t date, struct directory *ndir) { struct tm *now; time_t date2 = date; unsigned char hour, min_hi, min_low, sec; unsigned char year, month_hi, month_low, day; now = localtime(&date2); strncpy(ndir->name, filename, 8); strncpy(ndir->ext, filename + 8, 3); ndir->attr = attr; ndir->ctime_ms = 0; hour = now->tm_hour << 3; min_hi = now->tm_min >> 3; min_low = now->tm_min << 5; sec = now->tm_sec / 2; ndir->ctime[1] = ndir->time[1] = hour + min_hi; ndir->ctime[0] = ndir->time[0] = min_low + sec; year = (now->tm_year - 80) << 1; month_hi = (now->tm_mon + 1) >> 3; month_low = (now->tm_mon + 1) << 5; day = now->tm_mday; ndir -> adate[1] = ndir->cdate[1] = ndir->date[1] = year + month_hi; ndir -> adate[0] = ndir->cdate[0] = ndir->date[0] = month_low + day; set_word(ndir->start, fat & 0xffff); set_word(ndir->startHi, fat >> 16); set_dword(ndir->size, size); return ndir; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Do filename expansion with the shell. */ #define EXPAND_BUF 2048 #include "sysincludes.h" #include "mtools.h" int safePopenOut(char **command, char *output, int len) { int pipefd[2]; pid_t pid; int status; int last; if(pipe(pipefd)) { return -2; } switch((pid=fork())){ case -1: return -2; case 0: /* the son */ close(pipefd[0]); destroy_privs(); close(1); close(2); /* avoid nasty error messages on stderr */ dup(pipefd[1]); close(pipefd[1]); execvp(command[0], command+1); exit(1); default: close(pipefd[1]); break; } last=read(pipefd[0], output, len); kill(pid,9); wait(&status); if(last<0) { return -1; } return last; } const char *expand(const char *input, char *ans) { int last; char buf[256]; char *command[] = { "/bin/sh", "sh", "-c", 0, 0 }; ans[EXPAND_BUF-1]='\0'; if (input == NULL) return(NULL); if (*input == '\0') return(""); /* any thing to expand? */ if (!strpbrk(input, "$*(){}[]\\?`~")) { strncpy(ans, input, EXPAND_BUF-1); return(ans); } /* popen an echo */ #ifdef HAVE_SNPRINTF snprintf(buf, 255, "echo %s", input); #else sprintf(buf, "echo %s", input); #endif command[3]=buf; last=safePopenOut(command, ans, EXPAND_BUF-1); if(last<0) { perror("Pipe read error"); exit(1); } if(last) ans[last-1] = '\0'; else strncpy(ans, input, EXPAND_BUF-1); return ans; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "mtools.h" #include "fsP.h" extern Stream_t *default_drive; #ifdef HAVE_LONG_LONG typedef long long fatBitMask; #else typedef long fatBitMask; #endif typedef struct FatMap_t { unsigned char *data; fatBitMask dirty; fatBitMask valid; } FatMap_t; #define SECT_PER_ENTRY (sizeof(fatBitMask)*8) #define ONE ((fatBitMask) 1) static inline int readSector(Fs_t *This, char *buf, unsigned int off, size_t size) { return READS(This->Next, buf, sectorsToBytes((Stream_t *)This, off), size << This->sectorShift); } static inline int forceReadSector(Fs_t *This, char *buf, unsigned int off, size_t size) { return force_read(This->Next, buf, sectorsToBytes((Stream_t *)This, off), size << This->sectorShift); } static inline int writeSector(Fs_t *This, char *buf, unsigned int off, size_t size) { return WRITES(This->Next, buf, sectorsToBytes((Stream_t*)This, off), size << This->sectorShift); } static inline int forceWriteSector(Fs_t *This, char *buf, unsigned int off, size_t size) { return force_write(This->Next, buf, sectorsToBytes((Stream_t*)This, off), size << This->sectorShift); } static FatMap_t *GetFatMap(Fs_t *Stream) { int nr_entries,i; FatMap_t *map; Stream->fat_error = 0; nr_entries = (Stream->fat_len + SECT_PER_ENTRY - 1) / SECT_PER_ENTRY; map = NewArray(nr_entries, FatMap_t); if(!map) return 0; for(i=0; i< nr_entries; i++) { map[i].data = 0; map[i].valid = 0; map[i].dirty = 0; } return map; } static inline int locate(Fs_t *Stream, int offset, int *slot, int *bit) { if(offset >= Stream->fat_len) return -1; *slot = offset / SECT_PER_ENTRY; *bit = offset % SECT_PER_ENTRY; return 0; } static inline int fatReadSector(Fs_t *This, int sector, int slot, int bit, int dupe) { int fat_start, ret; dupe = (dupe + This->primaryFat) % This->num_fat; fat_start = This->fat_start + This->fat_len * dupe; /* first, read as much as the buffer can give us */ ret = readSector(This, (char *)(This->FatMap[slot].data+(bit<<This->sectorShift)), fat_start+sector, (SECT_PER_ENTRY - bit%SECT_PER_ENTRY)); if(ret < 0) return 0; if(ret < This->sector_size) { /* if we got less than one sector's worth, insist to get at * least one sector */ ret = forceReadSector(This, (char *) (This->FatMap[slot].data + (bit << This->sectorShift)), fat_start+sector, 1); if(ret < This->sector_size) return 0; return 1; } return ret >> This->sectorShift; } static int fatWriteSector(Fs_t *This, int sector, int slot, int bit, int dupe) { int fat_start; dupe = (dupe + This->primaryFat) % This->num_fat; if(dupe && !This->writeAllFats) return This->sector_size; fat_start = This->fat_start + This->fat_len * dupe; return forceWriteSector(This, (char *) (This->FatMap[slot].data + bit * This->sector_size), fat_start+sector, 1); } static unsigned char *loadSector(Fs_t *This, unsigned int sector, fatAccessMode_t mode, int recurs) { int slot, bit, i, ret; if(locate(This,sector, &slot, &bit) < 0) return 0; #if 0 if (((This->fat_len + SECT_PER_ENTRY - 1) / SECT_PER_ENTRY) <= slot) { fprintf(stderr,"This should not happen\n"); fprintf(stderr, "fat_len = %d\n", This->fat_len); fprintf(stderr, "SECT_PER_ENTRY=%d\n", (int)SECT_PER_ENTRY); fprintf(stderr, "sector = %d slot = %d bit=%d\n", sector, slot, bit); fprintf(stderr, "left = %d",(int) ((This->fat_len+SECT_PER_ENTRY-1) / SECT_PER_ENTRY)); return 0; } #endif if(!This->FatMap[slot].data) { /* allocate the storage space */ This->FatMap[slot].data = malloc(This->sector_size * SECT_PER_ENTRY); if(!This->FatMap[slot].data) return 0; memset(This->FatMap[slot].data, 0xee, This->sector_size * SECT_PER_ENTRY); } if(! (This->FatMap[slot].valid & (ONE << bit))) { ret = -1; for(i=0; i< This->num_fat; i++) { /* read the sector */ ret = fatReadSector(This, sector, slot, bit, i); if(ret == 0) { fprintf(stderr, "Error reading fat number %d\n", i); continue; } break; } /* all copies bad. Return error */ if(ret == 0) return 0; for(i=0; i < ret; i++) This->FatMap[slot].valid |= ONE << (bit + i); if(!recurs && ret == 1) /* do some prefetching, if we happened to only * get one sector */ loadSector(This, sector+1, mode, 1); if(!recurs && batchmode) for(i=0; i < 1024; i++) loadSector(This, sector+i, mode, 1); } if(mode == FAT_ACCESS_WRITE) { This->FatMap[slot].dirty |= ONE << bit; This->fat_dirty = 1; } return This->FatMap[slot].data + (bit << This->sectorShift); } static unsigned char *getAddress(Fs_t *Stream, unsigned int num, fatAccessMode_t mode) { unsigned char *ret; int sector; int offset; sector = num >> Stream->sectorShift; ret = 0; if(sector == Stream->lastFatSectorNr && Stream->lastFatAccessMode >= mode) ret = Stream->lastFatSectorData; if(!ret) { ret = loadSector(Stream, sector, mode, 0); if(!ret) return 0; Stream->lastFatSectorNr = sector; Stream->lastFatSectorData = ret; Stream->lastFatAccessMode = mode; } offset = num & Stream->sectorMask; return ret+offset; } static int readByte(Fs_t *Stream, int start) { unsigned char *address; address = getAddress(Stream, start, FAT_ACCESS_READ); if(!address) return -1; return *address; } /* * Fat 12 encoding: * | byte n | byte n+1 | byte n+2 | * |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0| * | | | | | | | | | | | | | | | | | | | | | | | | | * | n+0.0 | n+0.5 | n+1.0 | n+1.5 | n+2.0 | n+2.5 | * \_____ \____ \______/________/_____ / * ____\______\________/ _____/ ____\_/ * / \ \ / / \ * | n+1.5 | n+0.0 | n+0.5 | n+2.0 | n+2.5 | n+1.0 | * | FAT entry k | FAT entry k+1 | */ /* * Get and decode a FAT (file allocation table) entry. Returns the cluster * number on success or 1 on failure. */ static unsigned int fat12_decode(Fs_t *Stream, unsigned int num) { unsigned int start = num * 3 / 2; int byte0 = readByte(Stream, start); int byte1 = readByte(Stream, start+1); if (num < 2 || byte0 < 0 || byte1 < 0 || num > Stream->num_clus+1) { fprintf(stderr,"[1] Bad address %d\n", num); return 1; } if (num & 1) return (byte1 << 4) | ((byte0 & 0xf0)>>4); else return ((byte1 & 0xf) << 8) | byte0; } /* * Puts a code into the FAT table. Is the opposite of fat_decode(). No * sanity checking is done on the code. Returns a 1 on error. */ static void fat12_encode(Fs_t *Stream, unsigned int num, unsigned int code) { int start = num * 3 / 2; unsigned char *address0 = getAddress(Stream, start, FAT_ACCESS_WRITE); unsigned char *address1 = getAddress(Stream, start+1, FAT_ACCESS_WRITE); if (num & 1) { /* (odd) not on byte boundary */ *address0 = (*address0 & 0x0f) | ((code << 4) & 0xf0); *address1 = (code >> 4) & 0xff; } else { /* (even) on byte boundary */ *address0 = code & 0xff; *address1 = (*address1 & 0xf0) | ((code >> 8) & 0x0f); } } /* * Fat 16 encoding: * | byte n | byte n+1 | * |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0| * | | | | | | | | | | | | | | | | | * | FAT entry k | */ static unsigned int fat16_decode(Fs_t *Stream, unsigned int num) { unsigned char *address = getAddress(Stream, num << 1, FAT_ACCESS_READ); return _WORD(address); } static void fat16_encode(Fs_t *Stream, unsigned int num, unsigned int code) { unsigned char *address = getAddress(Stream, num << 1, FAT_ACCESS_WRITE); set_word(address, code); } static unsigned int fast_fat16_decode(Fs_t *Stream, unsigned int num) { unsigned short *address = (unsigned short *) getAddress(Stream, num << 1, FAT_ACCESS_READ); return *address; } static void fast_fat16_encode(Fs_t *Stream, unsigned int num, unsigned int code) { unsigned short *address = (unsigned short *) getAddress(Stream, num << 1, FAT_ACCESS_WRITE); *address = code; } /* * Fat 32 encoding *E��E��E��E��E��E��E��E��E��E��E��E��E��E��E������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/ static unsigned int fat32_decode(Fs_t *Stream, unsigned int num) { unsigned char *address = getAddress(Stream, num << 2, FAT_ACCESS_READ); return _DWORD(address); } static void fat32_encode(Fs_t *Stream, unsigned int num, unsigned int code) { unsigned char *address = getAddress(Stream, num << 2, FAT_ACCESS_WRITE); set_dword(address, code); } static unsigned int fast_fat32_decode(Fs_t *Stream, unsigned int num) { unsigned int *address = (unsigned int *) getAddress(Stream, num << 2, FAT_ACCESS_READ); return *address; } static void fast_fat32_encode(Fs_t *Stream, unsigned int num, unsigned int code) { unsigned int *address = (unsigned int *) getAddress(Stream, num << 2, FAT_ACCESS_WRITE); *address = code; } /* * Write the FAT table to the disk. Up to now the FAT manipulation has * been done in memory. All errors are fatal. (Might not be too smart * to wait till the end of the program to write the table. Oh well...) */ void fat_write(Fs_t *This) { int i, j, dups, ret, bit, slot; int fat_start; /*fprintf(stderr, "Fat write\n");*/ if (!This->fat_dirty) return; dups = This->num_fat; if (This->fat_error) dups = 1; for(i=0; i<dups; i++){ j = 0; fat_start = This->fat_start + i*This->fat_len; for(slot=0;j<This->fat_len;slot++) { if(!This->FatMap[slot].dirty) { j += SECT_PER_ENTRY; continue; } for(bit=0; bit < SECT_PER_ENTRY && j<This->fat_len; bit++,j++) { if(!(This->FatMap[slot].dirty & (ONE << bit))) continue; ret = fatWriteSector(This,j,slot, bit, i); if (ret < This->sector_size){ if (ret < 0 ){ perror("error in fat_write"); exit(1); } else { fprintf(stderr, "end of file in fat_write\n"); exit(1); } } /* if last dupe, zero it out */ if(i==dups-1) This->FatMap[slot].dirty &= ~(1<<bit); } } } /* write the info sector, if any */ if(This->infoSectorLoc && This->infoSectorLoc != MAX32) { /* initialize info sector */ InfoSector_t *infoSector; infoSector = (InfoSector_t *) safe_malloc(This->sector_size); set_dword(infoSector->signature1, INFOSECT_SIGNATURE1); memset(infoSector->filler1, sizeof(infoSector->filler1),0); memset(infoSector->filler2, sizeof(infoSector->filler2),0); set_dword(infoSector->signature2, INFOSECT_SIGNATURE2); set_dword(infoSector->pos, This->last); set_dword(infoSector->count, This->freeSpace); set_dword(infoSector->signature3, 0xaa55); if(forceWriteSector(This, (char *)infoSector, This->infoSectorLoc, 1) != This->sector_size) fprintf(stderr,"Trouble writing the info sector\n"); free(infoSector); } This->fat_dirty = 0; This->lastFatAccessMode = FAT_ACCESS_READ; } /* * Zero-Fat * Used by mformat. */ int zero_fat(Fs_t *Stream, int media_descriptor) { int i, j; int fat_start; unsigned char *buf; buf = malloc(Stream->sector_size); if(!buf) { perror("alloc fat sector buffer"); return -1; } for(i=0; i< Stream->num_fat; i++) { fat_start = Stream->fat_start + i*Stream->fat_len; for(j = 0; j < Stream->fat_len; j++) { if(j <= 1) memset(buf, 0, Stream->sector_size); if(!j) { buf[0] = media_descriptor; buf[2] = buf[1] = 0xff; if(Stream->fat_bits > 12) buf[3] = 0xff; if(Stream->fat_bits > 16) { buf[4] = 0xff; buf[5] = 0xff; buf[6] = 0xff; buf[7] = 0x0f; } } if(forceWriteSector(Stream, (char *)buf, fat_start + j, 1) != Stream->sector_size) { fprintf(stderr, "Trouble initializing a FAT sector\n"); free(buf); return -1; } } } free(buf); Stream->FatMap = GetFatMap(Stream); if (Stream->FatMap == NULL) { perror("alloc fat map"); return -1; } return 0; } void set_fat12(Fs_t *This) { This->fat_bits = 12; This->end_fat = 0xfff; This->last_fat = 0xff6; This->fat_decode = fat12_decode; This->fat_encode = fat12_encode; } static char word_endian_test[] = { 0x34, 0x12 }; void set_fat16(Fs_t *This) { This->fat_bits = 16; This->end_fat = 0xffff; This->last_fat = 0xfff6; if(sizeof(unsigned short) == 2 && * (unsigned short *) word_endian_test == 0x1234) { This->fat_decode = fast_fat16_decode; This->fat_encode = fast_fat16_encode; } else { This->fat_decode = fat16_decode; This->fat_encode = fat16_encode; } } static char dword_endian_test[] = { 0x78, 0x56, 0x34, 0x12 }; void set_fat32(Fs_t *This) { This->fat_bits = 32; This->end_fat = 0xfffffff; This->last_fat = 0xffffff6; if(sizeof(unsigned int) == 4 && * (unsigned int *) dword_endian_test == 0x12345678) { This->fat_decode = fast_fat32_decode; This->fat_encode = fast_fat32_encode; } else { This->fat_decode = fat32_decode; This->fat_encode = fat32_encode; } } static int check_fat(Fs_t *This) { /* * This is only a sanity check. For disks with really big FATs, * there is no point in checking the whole FAT. */ int i, f, tocheck; if(mtools_skip_check) return 0; /* too few sectors in the FAT */ if(This->fat_len < NEEDED_FAT_SIZE(This)) return -1; /* we do not warn about too much sectors in FAT, which may * happen when a partition has been shrunk using FIPS, or on * other occurrences */ tocheck = This->num_clus; if (tocheck < 0 || tocheck + 1 >= This->last_fat) { fprintf(stderr, "Too many clusters in FAT\n"); return -1; } if(tocheck > 4096) tocheck = 4096; for ( i= 3 ; i < tocheck; i++){ f = This->fat_decode(This,i); if (f == 1 || (f < This->last_fat && f > This->num_clus)){ fprintf(stderr, "Cluster # at %d too big(%#x)\n", i,f); fprintf(stderr,"Probably non MS-DOS disk\n"); return -1; } } return 0; } /* * Read the first sector of FAT table into memory. Crude error detection on * wrong FAT encoding scheme. */ static int check_media_type(Fs_t *This, struct bootsector *boot, unsigned int tot_sectors) { unsigned char *address; This->num_clus = (tot_sectors - This->clus_start) / This->cluster_size; This->FatMap = GetFatMap(This); if (This->FatMap == NULL) { perror("alloc fat map"); return -1; } address = getAddress(This, 0, FAT_ACCESS_READ); if(!address) { fprintf(stderr, "Could not read first FAT sector\n"); return -1; } if(mtools_skip_check) return 0; if(!address[0] && !address[1] && !address[2]) /* Some Atari disks have zeroes where Dos has media descriptor * and 0xff. Do not consider this as an error */ return 0; if((address[0] != boot->descr && boot->descr >= 0xf0 && ((address[0] != 0xf9 && address[0] != 0xf7) || boot->descr != 0xf0)) || address[0] < 0xf0) { fprintf(stderr, "Bad media types %02x/%02x, probably non-MSDOS disk\n", address[0], boot->descr); return -1; } if(address[1] != 0xff || address[2] != 0xff){ fprintf(stderr,"Initial byte of fat is not 0xff\n"); return -1; } return 0; } static int fat_32_read(Fs_t *This, struct bootsector *boot, unsigned int tot_sectors) { int size; This->fat_len = DWORD(ext.fat32.bigFat); This->writeAllFats = !(boot->ext.fat32.extFlags[0] & 0x80); This->primaryFat = boot->ext.fat32.extFlags[0] & 0xf; This->rootCluster = DWORD(ext.fat32.rootCluster); This->clus_start = This->fat_start + This->num_fat * This->fat_len; /* read the info sector */ size = This->sector_size; This->infoSectorLoc = WORD(ext.fat32.infoSector); if(This->sector_size >= 512 && This->infoSectorLoc && This->infoSectorLoc != MAX32) { InfoSector_t *infoSector; infoSector = (InfoSector_t *) safe_malloc(size); if(forceReadSector(This, (char *)infoSector, This->infoSectorLoc, 1) == This->sector_size && _DWORD(infoSector->signature1) == INFOSECT_SIGNATURE1 && _DWORD(infoSector->signature2) == INFOSECT_SIGNATURE2) { This->freeSpace = _DWORD(infoSector->count); This->last = _DWORD(infoSector->pos); } free(infoSector); } set_fat32(This); return(check_media_type(This,boot, tot_sectors) || check_fat(This)); } static int old_fat_read(Fs_t *This, struct bootsector *boot, int config_fat_bits, size_t tot_sectors, int nodups) { This->writeAllFats = 1; This->primaryFat = 0; This->dir_start = This->fat_start + This->num_fat * This->fat_len; This->clus_start = This->dir_start + This->dir_len; This->infoSectorLoc = MAX32; if(nodups) This->num_fat = 1; if(check_media_type(This,boot, tot_sectors)) return -1; if(This->num_clus > FAT12) { set_fat16(This); /* third FAT byte must be 0xff */ if(!mtools_skip_check && readByte(This, 3) != 0xff) return -1; } else set_fat12(This); return check_fat(This); } /* * Read the first sector of the FAT table into memory and initialize * structures. */ int fat_read(Fs_t *This, struct bootsector *boot, int fat_bits, size_t tot_sectors, int nodups) { This->fat_error = 0; This->fat_dirty = 0; This->last = MAX32; This->freeSpace = MAX32; This->lastFatSectorNr = 0; This->lastFatSectorData = 0; if(This->fat_len) return old_fat_read(This, boot, fat_bits, tot_sectors, nodups); else return fat_32_read(This, boot, tot_sectors); } unsigned int fatDecode(Fs_t *This, unsigned int pos) { int ret; ret = This->fat_decode(This, pos); if(ret && (ret < 2 || ret > This->num_clus+1) && ret < This->last_fat) { fprintf(stderr, "Bad FAT entry %d at %d\n", ret, pos); This->fat_error++; } return ret; } /* append a new cluster */ void fatAppend(Fs_t *This, unsigned int pos, unsigned int newpos) { This->fat_encode(This, pos, newpos); This->fat_encode(This, newpos, This->end_fat); if(This->freeSpace != MAX32) This->freeSpace--; } /* de-allocates the given cluster */ void fatDeallocate(Fs_t *This, unsigned int pos) { This->fat_encode(This, pos, 0); if(This->freeSpace != MAX32) This->freeSpace++; } /* allocate a new cluster */ void fatAllocate(Fs_t *This, unsigned int pos, unsigned int value) { This->fat_encode(This, pos, value); if(This->freeSpace != MAX32) This->freeSpace--; } void fatEncode(Fs_t *This, unsigned int pos, unsigned int value) { unsigned int oldvalue = This->fat_decode(This, pos); This->fat_encode(This, pos, value); if(This->freeSpace != MAX32) { if(oldvalue) This->freeSpace++; if(value) This->freeSpace--; } } unsigned int get_next_free_cluster(Fs_t *This, unsigned int last) { int i; if(This->last != MAX32) last = This->last; if (last < 2 || last >= This->num_clus+1) last = 1; for (i=last+1; i< This->num_clus+2; i++) { if (!fatDecode(This, i)) { This->last = i; return i; } } for(i=2; i < last+1; i++) { if (!fatDecode(This, i)) { This->last = i; return i; } } fprintf(stderr,"No free cluster %d %d\n", This->preallocatedClusters, This->last); return 1; } int fat_error(Stream_t *Dir) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); if(This->fat_error) fprintf(stderr,"Fat error detected\n"); return This->fat_error; } int fat32RootCluster(Stream_t *Dir) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); if(This->fat_bits == 32) return This->rootCluster; else return 0; } /* * Get the amount of free space on the diskette */ mt_size_t getfree(Stream_t *Dir) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); if(This->freeSpace == MAX32 || This->freeSpace == 0) { register unsigned int i; size_t total; total = 0L; for (i = 2; i < This->num_clus + 2; i++) if (!fatDecode(This,i)) total++; This->freeSpace = total; } return sectorsToBytes((Stream_t*)This, This->freeSpace * This->cluster_size); } /* * Ensure that there is a minimum of total sectors free */ int getfreeMinClusters(Stream_t *Dir, size_t size) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); register unsigned int i, last; size_t total; if(batchmode && This->freeSpace == MAX32) getfree(Stream); if(This->freeSpace != MAX32) { if(This->freeSpace >= size) return 1; else { fprintf(stderr, "Disk full\n"); got_signal = 1; return 0; } } total = 0L; /* we start at the same place where we'll start later to actually * allocate the sectors. That way, the same sectors of the FAT, which * are already loaded during getfreeMin will be able to be reused * during get_next_free_cluster */ last = This->last; if ( last < 2 || last >= This->num_clus + 2) last = 1; for (i=last+1; i< This->num_clus+2; i++){ if (!fatDecode(This, i)) total++; if(total >= size) return 1; } for(i=2; i < last+1; i++){ if (!fatDecode(This, i)) total++; if(total >= size) return 1; } fprintf(stderr, "Disk full\n"); got_signal = 1; return 0; } int getfreeMinBytes(Stream_t *Dir, mt_size_t size) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); size_t size2; size2 = size / (This->sector_size * This->cluster_size); if(size % (This->sector_size * This->cluster_size)) size2++; return getfreeMinClusters(Dir, size2); } unsigned int getStart(Stream_t *Dir, struct directory *dir) { Stream_t *Stream = GetFs(Dir); unsigned int first; first = START(dir); if(fat32RootCluster(Stream)) first |= STARTHI(dir) << 16; return first; } int fs_free(Stream_t *Stream) { DeclareThis(Fs_t); if(This->FatMap) { int i, nr_entries; nr_entries = (This->fat_len + SECT_PER_ENTRY - 1) / SECT_PER_ENTRY; for(i=0; i< nr_entries; i++) if(This->FatMap[i].data) free(This->FatMap[i].data); free(This->FatMap); } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "mtools.h" #include "fsP.h" #include "file.h" #include "htable.h" #include "dirCache.h" typedef struct File_t { Class_t *Class; int refs; struct Fs_t *Fs; /* Filesystem that this fat file belongs to */ Stream_t *Buffer; int (*map)(struct File_t *this, off_t where, size_t *len, int mode, mt_off_t *res); size_t FileSize; size_t preallocatedSize; int preallocatedClusters; /* Absolute position of first cluster of file */ unsigned int FirstAbsCluNr; /* Absolute position of previous cluster */ unsigned int PreviousAbsCluNr; /* Relative position of previous cluster */ unsigned int PreviousRelCluNr; direntry_t direntry; int hint; struct dirCache_t *dcp; unsigned int loopDetectRel; unsigned int loopDetectAbs; } File_t; static Class_t FileClass; T_HashTable *filehash; static File_t *getUnbufferedFile(Stream_t *Stream) { while(Stream->Class != &FileClass) Stream = Stream->Next; return (File_t *) Stream; } Fs_t *getFs(Stream_t *Stream) { return getUnbufferedFile(Stream)->Fs; } struct dirCache_t **getDirCacheP(Stream_t *Stream) { return &getUnbufferedFile(Stream)->dcp; } direntry_t *getDirentry(Stream_t *Stream) { return &getUnbufferedFile(Stream)->direntry; } static int recalcPreallocSize(File_t *This) { size_t currentClusters, neededClusters; int clus_size; int neededPrealloc; Fs_t *Fs = This->Fs; int r; if(This->FileSize & 0xc0000000) { fprintf(stderr, "Bad filesize\n"); } if(This->preallocatedSize & 0xc0000000) { fprintf(stderr, "Bad preallocated size %x\n", (int) This->preallocatedSize); } clus_size = Fs->cluster_size * Fs->sector_size; currentClusters = (This->FileSize + clus_size - 1) / clus_size; neededClusters = (This->preallocatedSize + clus_size - 1) / clus_size; neededPrealloc = neededClusters - currentClusters; if(neededPrealloc < 0) neededPrealloc = 0; r = fsPreallocateClusters(Fs, neededPrealloc - This->preallocatedClusters); if(r) return r; This->preallocatedClusters = neededPrealloc; return 0; } static int _loopDetect(unsigned int *oldrel, unsigned int rel, unsigned int *oldabs, unsigned int abs) { if(*oldrel && rel > *oldrel && abs == *oldabs) { fprintf(stderr, "loop detected! oldrel=%d newrel=%d abs=%d\n", *oldrel, rel, abs); return -1; } if(rel >= 2 * *oldrel + 1) { *oldrel = rel; *oldabs = abs; } return 0; } static int loopDetect(File_t *This, unsigned int rel, unsigned int abs) { return _loopDetect(&This->loopDetectRel, rel, &This->loopDetectAbs, abs); } static unsigned int _countBlocks(Fs_t *This, unsigned int block) { unsigned int blocks; unsigned int rel, oldabs, oldrel; blocks = 0; oldabs = oldrel = rel = 0; while (block <= This->last_fat && block != 1 && block) { blocks++; block = fatDecode(This, block); rel++; if(_loopDetect(&oldrel, rel, &oldabs, block) < 0) block = -1; } return blocks; } unsigned int countBlocks(Stream_t *Dir, unsigned int block) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); return _countBlocks(This, block); } /* returns number of bytes in a directory. Represents a file size, and * can hence be not bigger than 2^32 */ static size_t countBytes(Stream_t *Dir, unsigned int block) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); return _countBlocks(This, block) * This->sector_size * This->cluster_size; } void printFat(Stream_t *Stream) { File_t *This = getUnbufferedFile(Stream); unsigned long n; int rel; unsigned long begin, end; int first; n = This->FirstAbsCluNr; if(!n) { printf("Root directory or empty file\n"); return; } rel = 0; first = 1; begin = end = 0; do { if (first || n != end+1) { if (!first) { if (begin != end) printf("-%lu", end); printf("> "); } begin = end = n; printf("<%lu", begin); } else { end++; } first = 0; n = fatDecode(This->Fs, n); rel++; if(loopDetect(This, rel, n) < 0) n = 1; } while (n <= This->Fs->last_fat && n != 1); if(!first) { if (begin != end) printf("-%lu", end); printf(">"); } } static int normal_map(File_t *This, off_t where, size_t *len, int mode, mt_off_t *res) { int offset; off_t end; int NrClu; /* number of clusters to read */ unsigned int RelCluNr; unsigned int CurCluNr; unsigned int NewCluNr; unsigned int AbsCluNr; int clus_size; Fs_t *Fs = This->Fs; *res = 0; clus_size = Fs->cluster_size * Fs->sector_size; offset = where % clus_size; if (mode == MT_READ) maximize(*len, This->FileSize - where); if (*len == 0 ) return 0; if (This->FirstAbsCluNr < 2){ if( mode == MT_READ || *len == 0){ *len = 0; return 0; } NewCluNr = get_next_free_cluster(This->Fs, 1); if (NewCluNr == 1 ){ errno = ENOSPC; return -2; } hash_remove(filehash, (void *) This, This->hint); This->FirstAbsCluNr = NewCluNr; hash_add(filehash, (void *) This, &This->hint); fatAllocate(This->Fs, NewCluNr, Fs->end_fat); } RelCluNr = where / clus_size; if (RelCluNr >= This->PreviousRelCluNr){ CurCluNr = This->PreviousRelCluNr; AbsCluNr = This->PreviousAbsCluNr; } else { CurCluNr = 0; AbsCluNr = This->FirstAbsCluNr; } NrClu = (offset + *len - 1) / clus_size; while (CurCluNr <= RelCluNr + NrClu){ if (CurCluNr == RelCluNr){ /* we have reached the beginning of our zone. Save * coordinates */ This->PreviousRelCluNr = RelCluNr; This->PreviousAbsCluNr = AbsCluNr; } NewCluNr = fatDecode(This->Fs, AbsCluNr); if (NewCluNr == 1 || NewCluNr == 0){ fprintf(stderr,"Fat problem while decoding %d %x\n", AbsCluNr, NewCluNr); exit(1); } if(CurCluNr == RelCluNr + NrClu) break; if (NewCluNr > Fs->last_fat && mode == MT_WRITE){ /* if at end, and writing, extend it */ NewCluNr = get_next_free_cluster(This->Fs, AbsCluNr); if (NewCluNr == 1 ){ /* no more space */ errno = ENOSPC; return -2; } fatAppend(This->Fs, AbsCluNr, NewCluNr); } if (CurCluNr < RelCluNr && NewCluNr > Fs->last_fat){ *len = 0; return 0; } if (CurCluNr >= RelCluNr && NewCluNr != AbsCluNr + 1) break; CurCluNr++; AbsCluNr = NewCluNr; if(loopDetect(This, CurCluNr, AbsCluNr)) { errno = EIO; return -2; } } maximize(*len, (1 + CurCluNr - RelCluNr) * clus_size - offset); end = where + *len; if(batchmode && mode == MT_WRITE && end >= This->FileSize) { *len += ROUND_UP(end, clus_size) - end; } if((*len + offset) / clus_size + This->PreviousAbsCluNr-2 > Fs->num_clus) { fprintf(stderr, "cluster too big\n"); exit(1); } *res = sectorsToBytes((Stream_t*)Fs, (This->PreviousAbsCluNr-2) * Fs->cluster_size + Fs->clus_start) + offset; return 1; } static int root_map(File_t *This, off_t where, size_t *len, int mode, mt_off_t *res) { Fs_t *Fs = This->Fs; if(Fs->dir_len * Fs->sector_size < where) { *len = 0; errno = ENOSPC; return -2; } maximize(*len, Fs->dir_len * Fs->sector_size - where); if (*len == 0) return 0; *res = sectorsToBytes((Stream_t*)Fs, Fs->dir_start) + where; return 1; } static int read_file(Stream_t *Stream, char *buf, mt_off_t iwhere, size_t len) { DeclareThis(File_t); mt_off_t pos; int err; off_t where = truncBytes32(iwhere); Stream_t *Disk = This->Fs->Next; err = This->map(This, where, &len, MT_READ, &pos); if(err <= 0) return err; return READS(Disk, buf, pos, len); } static int write_file(Stream_t *Stream, char *buf, mt_off_t iwhere, size_t len) { DeclareThis(File_t); mt_off_t pos; int ret; size_t requestedLen; Stream_t *Disk = This->Fs->Next; off_t where = truncBytes32(iwhere); int err; requestedLen = len; err = This->map(This, where, &len, MT_WRITE, &pos); if( err <= 0) return err; if(batchmode) ret = force_write(Disk, buf, pos, len); else ret = WRITES(Disk, buf, pos, len); if(ret > requestedLen) ret = requestedLen; if (ret > 0 && where + ret > This->FileSize ) This->FileSize = where + ret; recalcPreallocSize(This); return ret; } /* * Convert an MSDOS time & date stamp to the Unix time() format */ static int month[] = {0, 31, 59, 90, 120, 151, 181, 212, 2F��F��F��F��F��F�� F��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������43, 273, 304, 334, 0, 0, 0 }; static inline time_t conv_stamp(struct directory *dir) { struct tm *tmbuf; long tzone, dst; time_t accum, tmp; accum = DOS_YEAR(dir) - 1970; /* years past */ /* days passed */ accum = accum * 365L + month[DOS_MONTH(dir)-1] + DOS_DAY(dir); /* leap years */ accum += (DOS_YEAR(dir) - 1972) / 4L; /* back off 1 day if before 29 Feb */ if (!(DOS_YEAR(dir) % 4) && DOS_MONTH(dir) < 3) accum--; accum = accum * 24L + DOS_HOUR(dir); /* hours passed */ accum = accum * 60L + DOS_MINUTE(dir); /* minutes passed */ accum = accum * 60L + DOS_SEC(dir); /* seconds passed */ #ifndef OS_Minix /* correct for Time Zone */ #ifdef HAVE_GETTIMEOFDAY { struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); tzone = tz.tz_minuteswest * 60L; } #else #ifdef HAVE_TZSET { #ifndef OS_ultrix /* Ultrix defines this to be a different type */ extern long timezone; #endif tzset(); tzone = (long) timezone; } #else tzone = 0; #endif /* HAVE_TZSET */ #endif /* HAVE_GETTIMEOFDAY */ accum += tzone; #endif /* OS_Minix */ /* correct for Daylight Saving Time */ tmp = accum; tmbuf = localtime(&tmp); #ifndef OS_Minix dst = (tmbuf->tm_isdst) ? (-60L * 60L) : 0L; accum += dst; #endif return accum; } static int get_file_data(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address) { DeclareThis(File_t); if(date) *date = conv_stamp(& This->direntry.dir); if(size) *size = (mt_size_t) This->FileSize; if(type) *type = This->direntry.dir.attr & ATTR_DIR; if(address) *address = This->FirstAbsCluNr; return 0; } static int free_file(Stream_t *Stream) { DeclareThis(File_t); Fs_t *Fs = This->Fs; fsPreallocateClusters(Fs, -This->preallocatedClusters); FREE(&This->direntry.Dir); freeDirCache(Stream); return hash_remove(filehash, (void *) Stream, This->hint); } static int flush_file(Stream_t *Stream) { DeclareThis(File_t); direntry_t *entry = &This->direntry; if(isRootDir(Stream)) { return 0; } if(This->FirstAbsCluNr != getStart(entry->Dir, &entry->dir)) { set_word(entry->dir.start, This->FirstAbsCluNr & 0xffff); set_word(entry->dir.startHi, This->FirstAbsCluNr >> 16); dir_write(entry); } return 0; } static int pre_allocate_file(Stream_t *Stream, mt_size_t isize) { DeclareThis(File_t); size_t size = truncBytes32(isize); if(size > This->FileSize && size > This->preallocatedSize) { This->preallocatedSize = size; return recalcPreallocSize(This); } else return 0; } static Class_t FileClass = { read_file, write_file, flush_file, /* flush */ free_file, /* free */ 0, /* get_geom */ get_file_data, pre_allocate_file }; static unsigned int getAbsCluNr(File_t *This) { if(This->FirstAbsCluNr) return This->FirstAbsCluNr; if(isRootDir((Stream_t *) This)) return 0; return 1; } static unsigned int func1(void *Stream) { DeclareThis(File_t); return getAbsCluNr(This) ^ (long) This->Fs; } static unsigned int func2(void *Stream) { DeclareThis(File_t); return getAbsCluNr(This); } static int comp(void *Stream, void *Stream2) { DeclareThis(File_t); File_t *This2 = (File_t *) Stream2; return This->Fs != This2->Fs || getAbsCluNr(This) != getAbsCluNr(This2); } static void init_hash(void) { static int is_initialised=0; if(!is_initialised){ make_ht(func1, func2, comp, 20, &filehash); is_initialised = 1; } } static Stream_t *_internalFileOpen(Stream_t *Dir, unsigned int first, size_t size, direntry_t *entry) { Stream_t *Stream = GetFs(Dir); DeclareThis(Fs_t); File_t Pattern; File_t *File; init_hash(); This->refs++; if(first != 1){ /* we use the illegal cluster 1 to mark newly created files. * do not manage those by hashtable */ Pattern.Fs = This; Pattern.Class = &FileClass; if(first || (entry && !IS_DIR(entry))) Pattern.map = normal_map; else Pattern.map = root_map; Pattern.FirstAbsCluNr = first; Pattern.loopDetectRel = 0; Pattern.loopDetectAbs = first; if(!hash_lookup(filehash, (T_HashTableEl) &Pattern, (T_HashTableEl **)&File, 0)){ File->refs++; This->refs--; return (Stream_t *) File; } } File = New(File_t); if (!File) return NULL; File->dcp = 0; File->preallocatedClusters = 0; File->preallocatedSize = 0; /* memorize dir for date and attrib */ File->direntry = *entry; if(entry->entry == -3) File->direntry.Dir = (Stream_t *) File; /* root directory */ else COPY(File->direntry.Dir); File->Class = &FileClass; File->Fs = This; if(first || (entry && !IS_DIR(entry))) File->map = normal_map; else File->map = root_map; /* FAT 12/16 root directory */ if(first == 1) File->FirstAbsCluNr = 0; else File->FirstAbsCluNr = first; File->loopDetectRel = 0; File->loopDetectAbs = 0; File->PreviousRelCluNr = 0xffff; File->FileSize = size; File->refs = 1; File->Buffer = 0; hash_add(filehash, (void *) File, &File->hint); return (Stream_t *) File; } Stream_t *OpenRoot(Stream_t *Dir) { unsigned int num; direntry_t entry; size_t size; Stream_t *file; memset(&entry, 0, sizeof(direntry_t)); num = fat32RootCluster(Dir); /* make the directory entry */ entry.entry = -3; entry.name[0] = '\0'; mk_entry("/", ATTR_DIR, num, 0, 0, &entry.dir); if(num) size = countBytes(Dir, num); else { Fs_t *Fs = (Fs_t *) GetFs(Dir); size = Fs->dir_len * Fs->sector_size; } file = _internalFileOpen(Dir, num, size, &entry); bufferize(&file); return file; } Stream_t *OpenFileByDirentry(direntry_t *entry) { Stream_t *file; unsigned int first; size_t size; first = getStart(entry->Dir, &entry->dir); if(!first && IS_DIR(entry)) return OpenRoot(entry->Dir); if (IS_DIR(entry)) size = countBytes(entry->Dir, first); else size = FILE_SIZE(&entry->dir); file = _internalFileOpen(entry->Dir, first, size, entry); if(IS_DIR(entry)) { bufferize(&file); if(first == 1) dir_grow(file, 0); } return file; } int isRootDir(Stream_t *Stream) { File_t *This = getUnbufferedFile(Stream); return This->map == root_map; } ���������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "codepage.h" /* Write a DOS name + extension into a legal unix-style name. */ char *unix_normalize (char *ans, char *name, char *ext) { char *a; int j; for (a=ans,j=0; (j<8) && (name[j] > ' '); ++j,++a) *a = name[j]; if(*ext > ' ') { *a++ = '.'; for (j=0; j<3 && ext[j] > ' '; ++j,++a) *a = ext[j]; } *a++ = '\0'; return ans; } typedef enum Case_l { NONE, UPPER, LOWER } Case_t; static void TranslateToDos(const char *s, char *t, int count, char *end, Case_t *Case, int *mangled) { *Case = NONE; for( ; *s && (s < end || !end); s++) { if(!count) { *mangled |= 3; break; } /* skip spaces & dots */ if(*s == ' ' || *s == '.') { *mangled |= 3; continue; } /* convert to dos */ if((*s) & 0x80) { *mangled |= 1; *t = to_dos(*s); } if ((*s & 0x7f) < ' ' ) { *mangled |= 3; *t = '_'; } else if (islower((unsigned char)*s)) { *t = toupper(*s); if(*Case == UPPER && !mtools_no_vfat) *mangled |= 1; else *Case = LOWER; } else if (isupper((unsigned char)*s)) { *t = *s; if(*Case == LOWER && !mtools_no_vfat) *mangled |= 1; else *Case = UPPER; } else if((*s) & 0x80) *t = mstoupper(*t); /* upper case */ else *t = *s; count--; t++; } } /* dos_name * * Convert a Unix-style filename to a legal MSDOS name and extension. * Will truncate file and extension names, will substitute * the character '~' for any illegal character(s) in the name. */ char *dos_name(char *name, int verbose, int *mangled, char *ans) { char *s, *ext; register int i; Case_t BaseCase, ExtCase; *mangled = 0; /* skip drive letter */ name = skip_drive(name); /* zap the leading path */ name = (char *) _basename(name); if ((s = strrchr(name, '\\'))) name = s + 1; memset(ans, ' ', 11); ans[11]='\0'; /* skip leading dots and spaces */ i = strspn(name, ". "); if(i) { name += i; *mangled = 3; } ext = strrchr(name, '.'); /* main name */ TranslateToDos(name, ans, 8, ext, &BaseCase, mangled); if(ext) TranslateToDos(ext+1, ans+8, 3, 0, &ExtCase, mangled); if(*mangled & 2) autorename_short(ans, 0); if(!*mangled) { if(BaseCase == LOWER) *mangled |= BASECASE; if(ExtCase == LOWER) *mangled |= EXTCASE; if((BaseCase == LOWER || ExtCase == LOWER) && !mtools_no_vfat) { *mangled |= 1; } } return ans; } /* * Get rid of spaces in an MSDOS 'raw' name (one that has come from the * directory structure) so that it can be used for regular expression * matching with a Unix filename. Also used to 'unfix' a name that has * been altered by dos_name(). */ char *unix_name(char *name, char *ext, char Case, char *ans) { char *s, tname[9], text[4]; int i; strncpy(tname, (char *) name, 8); tname[8] = '\0'; if ((s = strchr(tname, ' '))) *s = '\0'; if(!(Case & (BASECASE | EXTCASE)) && mtools_ignore_short_case) Case |= BASECASE | EXTCASE; if(Case & BASECASE) for(i=0;i<8 && tname[i];i++) tname[i] = tolower(tname[i]); strncpy(text, (char *) ext, 3); text[3] = '\0'; if ((s = strchr(text, ' '))) *s = '\0'; if(Case & EXTCASE) for(i=0;i<3 && text[i];i++) text[i] = tolower(text[i]); if (*text) { strcpy(ans, tname); strcat(ans, "."); strcat(ans, text); } else strcpy(ans, tname); /* fix special characters (above 0x80) */ to_unix(ans,11); return(ans); } /* If null encountered, set *end to 0x40 and write nulls rest of way * 950820: Win95 does not like this! It complains about bad characters. * So, instead: If null encountered, set *end to 0x40, write the null, and * write 0xff the rest of the way (that is what Win95 seems to do; hopefully * that will make it happy) */ /* Always return num */ int unicode_write(char *in, struct unicode_char *out, int num, int *end_p) { int j; for (j=0; j<num; ++j) { out->uchar = '\0'; /* Hard coded to ASCII */ if (*end_p) /* Fill with 0xff */ out->uchar = out->lchar = (char) 0xff; else { out->lchar = *in; if (! *in) { *end_p = VSE_LAST; } } ++out; ++in; } return num; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "file.h" /* * Read the clusters given the beginning FAT entry. Returns 0 on success. */ int file_read(FILE *fp, Stream_t *Source, int textmode, int stripmode) { char buffer[16384]; int pos; int ret; if (!Source){ fprintf(stderr,"Couldn't open source file\n"); return -1; } pos = 0; while(1){ ret = Source->Class->read(Source, buffer, (mt_off_t) pos, 16384); if (ret < 0 ){ perror("file read"); return -1; } if ( ret == 0) break; if(!fwrite(buffer, 1, ret, fp)){ perror("write"); return -1; } pos += ret; } return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" typedef struct Filter_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; int dospos; int unixpos; int mode; int rw; int lastchar; } Filter_t; #define F_READ 1 #define F_WRITE 2 /* read filter filters out messy dos' bizarre end of lines and final 0x1a's */ static int read_filter(Stream_t *Stream, char *buf, mt_off_t iwhere, size_t len) { DeclareThis(Filter_t); int i,j,ret; off_t where = truncBytes32(iwhere); if ( where != This->unixpos ){ fprintf(stderr,"Bad offset\n"); exit(1); } if (This->rw == F_WRITE){ fprintf(stderr,"Change of transfer direction!\n"); exit(1); } This->rw = F_READ; ret = READS(This->Next, buf, (mt_off_t) This->dospos, len); if ( ret < 0 ) return ret; j = 0; for (i=0; i< ret; i++){ if ( buf[i] == '\r' ) continue; if (buf[i] == 0x1a) break; This->lastchar = buf[j++] = buf[i]; } This->dospos += i; This->unixpos += j; return j; } static int write_filter(Stream_t *Stream, char *buf, mt_off_t iwhere, size_t len) { DeclareThis(Filter_t); int i,j,ret; char buffer[1025]; off_t where = truncBytes32(iwhere); if(This->unixpos == -1) return -1; if (where != This->unixpos ){ fprintf(stderr,"Bad offset\n"); exit(1); } if (This->rw == F_READ){ fprintf(stderr,"Change of transfer direction!\n"); exit(1); } This->rw = F_WRITE; j=i=0; while(i < 1024 && j < len){ if (buf[j] == '\n' ){ buffer[i++] = '\r'; buffer[i++] = '\n'; j++; continue; } buffer[i++] = buf[j++]; } This->unixpos += j; ret = force_write(This->Next, buffer, (mt_off_t) This->dospos, i); if(ret >0 ) This->dospos += ret; if ( ret != i ){ /* no space on target file ? */ This->unixpos = -1; return -1; } return j; } static int free_filter(Stream_t *Stream) { DeclareThis(Filter_t); char buffer=0x1a; /* write end of file */ if (This->rw == F_WRITE) return force_write(This->Next, &buffer, (mt_off_t) This->dospos, 1); else return 0; } static Class_t FilterClass = { read_filter, write_filter, 0, /* flush */ free_filter, 0, /* set geometry */ get_data_pass_through, 0 }; Stream_t *open_filter(Stream_t *Next) { Filter_t *This; This = New(Filter_t); if (!This) return NULL; This->Class = &FilterClass; This->dospos = This->unixpos = This->rw = 0; This->Next = Next; This->refs = 1; This->Buffer = 0; return (Stream_t *) This; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * IO to the floppyd daemon running on the local X-Server Host * * written by: * * Peter Schlaile * * udbz@rz.uni-karlsruhe.de * */ #include "sysincludes.h" #include "stream.h" #include "mtools.h" #include "msdos.h" #include "scsi.h" #include "partition.h" #include "floppyd_io.h" #ifdef USE_FLOPPYD /* ######################################################################## */ typedef unsigned char Byte; typedef unsigned long Dword; char* AuthErrors[] = { "Auth success!", "Auth failed: Packet oversized!", "Auth failed: X-Cookie doesn't match!", "Auth failed: Wrong transmission protocol version!", "Auth failed: Device locked!" }; typedef struct RemoteFile_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; int fd; mt_off_t offset; mt_off_t lastwhere; mt_off_t size; } RemoteFile_t; #ifndef HAVE_HTONS unsigned short myhtons(unsigned short parm) { Byte val[2]; val[0] = (parm >> 8) & 0xff; val[1] = parm & 0xff; return *((unsigned short*) (val)); } #endif Dword byte2dword(Byte* val) { Dword l; l = (val[0] << 24) + (val[1] << 16) + (val[2] << 8) + val[3]; return l; } void dword2byte(Dword parm, Byte* rval) { rval[0] = (parm >> 24) & 0xff; rval[1] = (parm >> 16) & 0xff; rval[2] = (parm >> 8) & 0xff; rval[3] = parm & 0xff; } Dword read_dword(int handle) { Byte val[4]; read(handle, val, 4); return byte2dword(val); } void write_dword(int handle, Dword parm) { Byte val[4]; dword2byte(parm, val); write(handle, val, 4); } /* ######################################################################## */ int authenticate_to_floppyd(int sock, char *display) { off_t filelen; Byte buf[16]; char *command[] = { "xauth", "xauth", "extract", "-", 0, 0 }; char *xcookie; Dword errcode; command[4] = display; filelen=strlen(display); filelen += 100; xcookie = (char *) safe_malloc(filelen+4); filelen = safePopenOut(command, xcookie+4, filelen); if(filelen < 1) return AUTH_AUTHFAILED; dword2byte(4,buf); dword2byte(FLOPPYD_PROTOCOL_VERSION,buf+4); write(sock, buf, 8); if (read_dword(sock) != 4) { return AUTH_WRONGVERSION; } errcode = read_dword(sock); if (errcode != AUTH_SUCCESS) { return errcode; } dword2byte(filelen, xcookie); write(sock, xcookie, filelen+4); if (read_dword(sock) != 4) { return AUTH_PACKETOVERSIZE; } errcode = read_dword(sock); return errcode; } static int floppyd_reader(int fd, char* buffer, int len) { Dword errcode; Dword gotlen; int l; int start; Byte buf[16]; dword2byte(1, buf); buf[4] = OP_READ; dword2byte(4, buf+5); dword2byte(len, buf+9); write(fd, buf, 13); if (read_dword(fd) != 8) { errno = EIO; return -1; } gotlen = read_dword(fd); errcode = read_dword(fd); if (gotlen != -1) { if (read_dword(fd) != gotlen) { errno = EIO; return -1; } for (start = 0, l = 0; start < gotlen; start += l) { l = read(fd, buffer+start, gotlen-start); if (l == 0) { errno = EIO; return -1; } } } else { errno = errcode; } return gotlen; } static int floppyd_writer(int fd, char* buffer, int len) { Dword errcode; Dword gotlen; Byte buf[16]; dword2byte(1, buf); buf[4] = OP_WRITE; dword2byte(len, buf+5); write(fd, buf, 9); write(fd, buffer, len); if (read_dword(fd) != 8) { errno = EIO; return -1; } gotlen = read_dword(fd); errcode = read_dword(fd); errno = errcode; return gotlen; } static int floppyd_lseek(int fd, mt_off_t offset, int whence) { Dword errcode; Dword gotlen; Byte buf[32]; dword2byte(1, buf); buf[4] = OP_SEEK; dword2byte(8, buf+5); dword2byte(truncBytes32(offset), buf+9); dword2byte(whence, buf+13); write(fd, buf, 17); if (read_dword(fd) != 8) { errno = EIO; return -1; } gotlen = read_dword(fd); errcode = read_dword(fd); errno = errcode; return gotlen; } /* ######################################################################## */ typedef int (*iofn) (int, char *, int); static int floppyd_io(Stream_t *Stream, char *buf, mt_off_t where, int len, iofn io) { DeclareThis(RemoteFile_t); int ret; where += This->offset; if (where != This->lastwhere ){ if(floppyd_lseek( This->fd, where, SEEK_SET) < 0 ){ perror("floppyd_lseek"); This->lastwhere = (mt_off_t) -1; return -1; } } ret = io(This->fd, buf, len); if ( ret == -1 ){ perror("floppyd_io"); This->lastwhere = (mt_off_t) -1; return -1; } This->lastwhere = where + ret; return ret; } static int floppyd_read(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { return floppyd_io(Stream, buf, where, len, (iofn) floppyd_reader); } static int floppyd_write(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { return floppyd_io(Stream, buf, where, len, (iofn) floppyd_writer); } static int floppyd_flush(Stream_t *Stream) { #if 0 Byte buf[16]; DeclareThis(RemoteFile_t); dword2byte(1, buf); buf[4] = OP_FLUSH; write(This->fd, buf, 5); if (read_dword(This->fd) != 8) { errno = EIO; return -1; } read_dword(This->fd); read_dword(This->fd); #endif return 0; } static int floppyd_free(Stream_t *Stream) { Byte buf[16]; DeclareThis(RemoteFile_t); if (This->fd > 2) { dword2byte(1, buf); buf[4] = OP_CLOSE; write(This->fd, buf, 5); return close(This->fd); } else { return 0; } } static int floppyd_geom(Stream_t *Stream, struct device *dev, struct device *orig_dev, int media, struct bootsector *boot) { size_t tot_sectors; int sect_per_track; DeclareThis(RemoteFile_t); dev->ssize = 2; /* allow for init_geom to change it */ dev->use_2m = 0x80; /* disable 2m mode to begin */ if(media == 0xf0 || media >= 0x100){ dev->heads = WORD(nheads); dev->sectors = WORD(nsect); tot_sectors = DWORD(bigsect); SET_INT(tot_sectors, WORD(psect)); sect_per_track = dev->heads * dev->sectors; tot_sectors += sect_per_track - 1; /* round size up */ dev->tracks = tot_sectors / sect_per_track; } else if (media >= 0xf8){ media &= 3; dev->heads = old_dos[media].heads; dev->tracks = old_dos[media].tracks; dev->sectors = old_dos[media].sectors; dev->ssize = 0x80; dev->use_2m = ~1; } else { fprintf(stderr,"Unknown media type\n"); exit(1); } This->size = (mt_off_t) 512 * dev->sectors * dev->tracks * dev->heads; return 0; } static int floppyd_data(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address) { DeclareThis(RemoteFile_t); if(date) /* unknown, and irrelevant anyways */ *date = 0; if(size) /* the size derived from the geometry */ *size = (mt_size_t) This->size; if(type) *type = 0; /* not a directory */ if(address) *address = 0; return 0; } /* ######################################################################## */ static Class_t FloppydFileClass = { floppyd_read, floppyd_write, floppyd_flush, floppyd_free, floppyd_geom, floppyd_data }; /* ######################################################################## */ int get_host_and_port(const char* name, char** hostname, char **display, short* port) { char* newname = strdup(name); char* p; char* p2; p = newname; while (*p != '/' && *p) p++; p2 = p; if (*p) p++; *p2 = 0; *port = atoi(p); if (*port == 0) { *port = FLOPPYD_DEFAULT_PORT; } *display = strdup(newname); p = newname; while (*p != ':' && *p) p++; p2 = p; if (*p) p++; *p2 = 0; *port += atoi(p); /* add display number to the port */ if (!*newname || strcmp(newname, "unix") == 0) { free(newname); newname = strdup("localhost"); } *hostname = newname; return 1; } /* * * Return the IP address of the specified host. * */ static IPaddr_t getipaddress(char *ipaddr) { struct hostent *host; IPaddr_t ip; if (((ip = inet_addr(ipaddr)) == INADDR_NONE) && (strcmp(ipaddr, "255.255.255.255") != 0)) { if ((host = gethostbyname(ipaddr)) != NULL) { memcpy(&ip, host->h_addr, sizeof(ip)); } endhostent(); } #ifdef DEBUG fprintf(stderr, "IP lookup %s -> 0x%08lx\n", ipaddr, ip); #endif return (ip); } /* * * Connect to the floppyd server. * */ static int connect_to_server(IPaddr_t ip, short port) { F��F��F������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������struct sockaddr_in addr; int sock; /* * Allocate a socket. */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { return (-1); } /* * Set the address to connect to. */ addr.sin_family = AF_INET; #ifndef HAVE_HTONS addr.sin_port = myhtons(port); #else addr.sin_port = htons(port); #endif addr.sin_addr.s_addr = ip; /* * Connect our socket to the above address. */ if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { return (-1); } /* * Set the keepalive socket option to on. */ { int on = 1; setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on)); } return (sock); } static int ConnectToFloppyd(const char* name); Stream_t *FloppydOpen(struct device *dev, struct device *dev2, char *name, int mode, char *errmsg, int mode2, int locked) { RemoteFile_t *This; if (!dev || !(dev->misc_flags & FLOPPYD_FLAG)) return NULL; This = New(RemoteFile_t); if (!This){ printOom(); return NULL; } This->Class = &FloppydFileClass; This->Next = 0; This->offset = 0; This->lastwhere = 0; This->refs = 1; This->Buffer = 0; This->fd = ConnectToFloppyd(name); if (This->fd == -1) { Free(This); return NULL; } return (Stream_t *) This; } static int ConnectToFloppyd(const char* name) { char* hostname; char* display; short port; int rval = get_host_and_port(name, &hostname, &display, &port); int sock; int reply; if (!rval) return -1; sock = connect_to_server(getipaddress(hostname), port); if (sock == -1) { fprintf(stderr, "Can't connect to floppyd server on %s, port %i!\n", hostname, port); return -1; } reply = authenticate_to_floppyd(sock, display); if (reply != 0) { fprintf(stderr, "Permission denied, authentication failed!\n" "%s\n", AuthErrors[reply]); return -1; } free(hostname); free(display); return sock; } #endif �����������������������������������������������������������������������������������������������������������#ifndef MTOOLS_FLOPPYDIO_H #define MTOOLS_FLOPPYDIO_H #ifdef USE_FLOPPYD #include "stream.h" /*extern int ConnectToFloppyd(const char* name, Class_t** ioclass);*/ Stream_t *FloppydOpen(struct device *dev, struct device *dev2, char *name, int mode, char *errmsg, int mode2, int locked); #define FLOPPYD_DEFAULT_PORT 5703 #define FLOPPYD_PROTOCOL_VERSION 10 enum FloppydOpcodes { OP_READ, OP_WRITE, OP_SEEK, OP_FLUSH, OP_CLOSE, OP_IOCTL }; enum AuthErrorsEnum { AUTH_SUCCESS, AUTH_PACKETOVERSIZE, AUTH_AUTHFAILED, AUTH_WRONGVERSION, AUTH_DEVLOCKED, AUTH_BADPACKET }; typedef unsigned long IPaddr_t; #endif #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Force I/O to be done to complete transfer length * * written by: * * Alain L. Knaff * alain@linux.lu * */ #include "sysincludes.h" #include "msdos.h" #include "stream.h" static int force_io(Stream_t *Stream, char *buf, mt_off_t start, size_t len, int (*io)(Stream_t *, char *, mt_off_t, size_t)) { int ret; int done=0; while(len){ ret = io(Stream, buf, start, len); if ( ret <= 0 ){ if (done) return done; else return ret; } start += ret; done += ret; len -= ret; buf += ret; } return done; } int force_write(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { return force_io(Stream, buf, start, len, Stream->Class->write); } int force_read(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { return force_io(Stream, buf, start, len, Stream->Class->read); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_FS_H #define MTOOLS_FS_H #include "stream.h" typedef struct FsPublic_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; int serialized; unsigned long serial_number; int cluster_size; unsigned int sector_size; } FsPublic_t; Stream_t *fs_init(char *drive, int mode); int fat_free(Stream_t *Dir, unsigned int fat); int fatFreeWithDir(Stream_t *Dir, struct directory *dir); int fat_error(Stream_t *Dir); int fat32RootCluster(Stream_t *Dir); char *getDrive(Stream_t *Stream); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_FSP_H #define MTOOLS_FSP_H #include "stream.h" #include "msdos.h" #include "fs.h" typedef enum fatAccessMode_t { FAT_ACCESS_READ, FAT_ACCESS_WRITE } fatAccessMode_t; typedef struct Fs_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; int serialized; unsigned long serial_number; int cluster_size; unsigned int sector_size; int fat_error; unsigned int (*fat_decode)(struct Fs_t *This, unsigned int num); void (*fat_encode)(struct Fs_t *This, unsigned int num, unsigned int code); Stream_t *Direct; int fat_dirty; unsigned int fat_start; unsigned int fat_len; int num_fat; unsigned int end_fat; unsigned int last_fat; int fat_bits; struct FatMap_t *FatMap; int dir_start; int dir_len; int clus_start; int num_clus; char *drive; /* for error messages */ /* fat 32 */ unsigned int primaryFat; unsigned int writeAllFats; unsigned int rootCluster; int infoSectorLoc; unsigned int last; /* last sector allocated, or MAX32 if unknown */ unsigned int freeSpace; /* free space, or MAX32 if unknown */ int preallocatedClusters; int lastFatSectorNr; unsigned char *lastFatSectorData; fatAccessMode_t lastFatAccessMode; int sectorMask; int sectorShift; } Fs_t; int fs_free(Stream_t *Stream); void set_fat12(Fs_t *Fs); void set_fat16(Fs_t *Fs); void set_fat32(Fs_t *Fs); unsigned int get_next_free_cluster(Fs_t *Fs, unsigned int last); unsigned int fatDecode(Fs_t *This, unsigned int pos); void fatAppend(Fs_t *This, unsigned int pos, unsigned int newpos); void fatDeallocate(Fs_t *This, unsigned int pos); void fatAllocate(Fs_t *This, unsigned int pos, unsigned int value); void fatEncode(Fs_t *This, unsigned int pos, unsigned int value); int fat_read(Fs_t *This, struct bootsector *boot, int fat_bits, size_t tot_sectors, int nodups); void fat_write(Fs_t *This); int zero_fat(Fs_t *Fs, int media_descriptor); extern Class_t FsClass; int fsPreallocateClusters(Fs_t *Fs, long); Fs_t *getFs(Stream_t *Stream); #endif �����������������������������������������������/* * hash.c - hash table. */ #include "sysincludes.h" #include "htable.h" #include "mtools.h" struct hashtable { T_HashFunc f1,f2; T_ComparFunc compar; int size; /* actual size of the array */ int fill; /* number of deleted or in use slots */ int inuse; /* number of slots in use */ int max; /* maximal number of elements to keep efficient */ T_HashTableEl *entries; }; static int sizes[]={5, 11, 23, 47, 97, 197, 397, 797, 1597, 3203, 6421, 12853, 25717, 51437, 102877, 205759, 411527, 823117, 1646237, 3292489, 6584983, 13169977, 26339969, 52679969, 105359939, 210719881, 421439783, 842879579, 1685759167, 0 }; static int deleted=0; static int unallocated=0; static int alloc_ht(T_HashTable *H, int size) { int i; for(i=0; sizes[i]; i++) if (sizes[i] > size*4 ) break; if (!sizes[i]) for(i=0; sizes[i]; i++) if (sizes[i] > size*2 ) break; if (!sizes[i]) for(i=0; sizes[i]; i++) if (sizes[i] > size) break; if(!sizes[i]) return -1; size = sizes[i]; if(size < H->size) size = H->size; /* never shrink the table */ H->max = size * 4 / 5 - 2; H->size = size; H->fill = 0; H->inuse = 0; H->entries = NewArray(size, T_HashTableEl); if (H->entries == NULL) return -1; /* out of memory error */ for(i=0; i < size; i++) H->entries[i] = &unallocated; return 0; } int make_ht(T_HashFunc f1, T_HashFunc f2, T_ComparFunc c, int size, T_HashTable **H) { *H = New(T_HashTable); if (*H == NULL){ return -1; /* out of memory error */ } (*H)->f1 = f1; (*H)->f2 = f2; (*H)->compar = c; (*H)->size = 0; if(alloc_ht(*H,size)) return -1; return 0; } int free_ht(T_HashTable *H, T_HashFunc entry_free) { int i; if(entry_free) for(i=0; i< H->size; i++) if (H->entries[i] != &unallocated && H->entries[i] != &deleted) entry_free(H->entries[i]); Free(H->entries); Free(H); return 0; } /* add into hash table without checking for repeats */ static int _hash_add(T_HashTable *H,T_HashTableEl *E, int *hint) { int f2, pos, ctr; pos = H->f1(E) % H->size; f2 = -1; ctr = 0; while(H->entries[pos] != &unallocated && H->entries[pos] != &deleted){ if (f2 == -1) f2 = H->f2(E) % (H->size - 1); pos = (pos+f2+1) % H->size; ctr++; } if(H->entries[pos] == &unallocated) H->fill++; /* only increase fill if the previous element was not yet * counted, i.e. unallocated */ H->inuse++; H->entries[pos] = E; if(hint) *hint = pos; return 0; } static int rehash(T_HashTable *H) { int size,i; T_HashTableEl *oldentries; /* resize the table */ size = H->size; oldentries = H->entries; if(alloc_ht(H,((H->inuse+1)*4+H->fill)/5)) return -1; for(i=0; i < size; i++){ if(oldentries[i] != &unallocated && oldentries[i] != &deleted) _hash_add(H, oldentries[i], 0); } Free(oldentries); return 0; } int hash_add(T_HashTable *H, T_HashTableEl *E, int *hint) { if (H->fill >= H->max) rehash(H); if (H->fill == H->size) return -1; /*out of memory error */ return _hash_add(H,E, hint); } /* add into hash table without checking for repeats */ static int _hash_lookup(T_HashTable *H,T_HashTableEl *E, T_HashTableEl **E2, int *hint, int isIdentity) { int f2, pos, upos, ttl; pos = H->f1(E) % H->size; ttl = H->size; f2 = -1; upos = -1; while(ttl && H->entries[pos] != &unallocated && (H->entries[pos] == &deleted || ((isIdentity || H->compar(H->entries[pos], E) != 0) && (!isIdentity || H->entries[pos] != E)))){ if (f2 == -1) f2 = H->f2(E) % (H->size - 1); if (upos == -1 && H->entries[pos] == &deleted) upos = pos; pos = (pos+f2+1) % H->size; ttl--; } if(H->entries[pos] == &unallocated || !ttl) return -1; if (upos != -1){ H->entries[upos] = H->entries[pos]; H->entries[pos] = &deleted; pos = upos; } if(hint) *hint = pos; *E2= H->entries[pos]; return 0; } int hash_lookup(T_HashTable *H,T_HashTableEl *E, T_HashTableEl **E2, int *hint) { return _hash_lookup(H, E, E2, hint, 0); } /* add into hash table without checking for repeats */ int hash_remove(T_HashTable *H,T_HashTableEl *E, int hint) { T_HashTableEl *E2; if (hint >=0 && hint < H->size && H->entries[hint] == E){ H->inuse--; H->entries[hint] = &deleted; return 0; } if(_hash_lookup(H, E, &E2, &hint, 1)) { fprintf(stderr, "Removing non-existent entry\n"); exit(1); return -1; } H->inuse--; H->entries[hint] = &deleted; return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * hashtable */ typedef struct hashtable T_HashTable; typedef void *T_HashTableEl; typedef unsigned int (*T_HashFunc)(void *); typedef int (*T_ComparFunc)(void *, void *); int make_ht(T_HashFunc f1, T_HashFunc f2, T_ComparFunc c, int size, T_HashTable **H); int hash_add(T_HashTable *H, T_HashTableEl *E, int *hint); int hash_remove(T_HashTable *H, T_HashTableEl *E, int hint); int hash_lookup(T_HashTable *H, T_HashTableEl *E, T_HashTableEl **E2, int *hint); int free_ht(T_HashTable *H, T_HashFunc entry_free); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Initialize an MSDOS diskette. Read the boot sector, and switch to the * proper floppy disk device to match the format on the disk. Sets a bunch * of global variables. Returns 0 on success, or 1 on failure. */ #include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "mtools.h" #include "fsP.h" #include "plain_io.h" #include "floppyd_io.h" #include "xdf_io.h" #include "buffer.h" extern int errno; #ifndef OS_Minix /* Minix is memory starved. */ #define FULL_CYL #endif unsigned int num_clus; /* total number of cluster */ /* * Read the boot sector. We glean the disk parameters from this sector. */ static int read_boot(Stream_t *Stream, struct bootsector * boot, int size) { /* read the first sector, or part of it */ if(!size) size = BOOTSIZE; if(size > 1024) size = 1024; if (force_read(Stream, (char *) boot, 0, size) != size) return -1; return 0; } static int fs_flush(Stream_t *Stream) { DeclareThis(Fs_t); fat_write(This); return 0; } Class_t FsClass = { read_pass_through, /* read */ write_pass_through, /* write */ fs_flush, fs_free, /* free */ 0, /* set geometry */ get_data_pass_through, 0 /* pre allocate */ }; static int get_media_type(Stream_t *St, struct bootsector *boot) { int media; media = boot->descr; if(media < 0xf0){ char temp[512]; /* old DOS disk. Media descriptor in the first FAT byte */ /* old DOS disk always have 512-byte sectors */ if (force_read(St,temp,(mt_off_t) 512,512) == 512) media = (unsigned char) temp[0]; else media = 0; } else media += 0x100; return media; } Stream_t *GetFs(Stream_t *Fs) { while(Fs && Fs->Class != &FsClass) Fs = Fs->Next; return Fs; } Stream_t *find_device(char *drive, int mode, struct device *out_dev, struct bootsector *boot, char *name, int *media, mt_size_t *maxSize) { char errmsg[200]; Stream_t *Stream; struct device *dev; int r; #ifdef OS_Minix static char *devname; struct device onedevice[2]; struct stat stbuf; free(devname); devname = safe_malloc((9 + strlen(drive)) * sizeof(devname[0])); strcpy(devname, "/dev/dosX"); if (isupper(drive[0]) && drive[1] == 0) { /* single letter device name, use /dev/dos$drive */ devname[8]= drive[0]; } else if (strchr(drive, '/') == NULL) { /* a simple name, use /dev/$drive */ strcpy(devname+5, drive); } else { /* a pathname, use as is. */ strcpy(devname, drive); } if (stat(devname, &stbuf) != -1) { memset(onedevice, 0, sizeof(onedevice)); onedevice[0].name = devname; onedevice[0].drive = drive; onedevice[1].name = NULL; onedevice[1].drive = NULL; dev = onedevice; } else { dev = devices; } #else dev = devices; #endif Stream = NULL; sprintf(errmsg, "Drive '%s:' not supported", drive); /* open the device */ for (; dev->name; dev++) { FREE(&Stream); if (strcmp(dev->drive, drive) != 0) continue; *out_dev = *dev; expand(dev->name,name); #ifdef USING_NEW_VOLD strcpy(name, getVoldName(dev, name)); #endif Stream = 0; #ifdef USE_XDF Stream = XdfOpen(out_dev, name, mode, errmsg, 0); if(Stream) { out_dev->use_2m = 0x7f; if(maxSize) *maxSize = max_off_t_31; } #endif #ifdef USE_FLOPPYD if(!Stream) { Stream = FloppydOpen(out_dev, dev, name, mode, errmsg, 0, 1); if(Stream && maxSize) *maxSize = max_off_t_31; } #endif if (!Stream) Stream = SimpleFileOpen(out_dev, dev, name, mode, errmsg, 0, 1, maxSize); if( !Stream) continue; /* read the boot sector */ if ((r=read_boot(Stream, boot, out_dev->blocksize)) < 0){ sprintf(errmsg, "init %s: could not read boot sector", drive); continue; } if((*media= get_media_type(Stream, boot)) <= 0xf0 ){ if (boot->jump[2]=='L') sprintf(errmsg, "diskette %s: is Linux LILO, not DOS", drive); else sprintf(errmsg,"init %s: non DOS media", drive); continue; } /* set new parameters, if needed */ errno = 0; if(SET_GEOM(Stream, out_dev, dev, *media, boot)){ if(errno) #ifdef HAVE_SNPRINTF snprintf(errmsg, 199, "Can't set disk parameters for %s: %s", drive, strerror(errno)); #else sprintf(errmsg, "Can't set disk parameters for %s: %s", drive, strerror(errno)); #endif else sprintf(errmsg, "Can't set disk parameters for %s", drive); continue; } break; } /* print error msg if needed */ if ( dev->drive == 0 ){ FREE(&Stream); fprintf(stderr,"%s\n",errmsg); return NULL; } #ifdef OS_Minix /* Minix can lseek up to 4G. */ if (maxSize) *maxSize = 0xFFFFFFFFUL; #endif return Stream; } Stream_t *fs_init(char *drive, int mode) { int blocksize; int media,i; int nhs; int disk_size = 0; /* In case we don't happen to set this below */ size_t tot_sectors; char name[EXPAND_BUF]; int cylinder_size; struct device dev; mt_size_t maxSize; struct bootsector boot0; #define boot (&boot0) Fs_t *This; This = New(Fs_t); if (!This) return NULL; This->Direct = NULL; This->Next = NULL; This->refs = 1; This->Buffer = 0; This->Class = &FsClass; This->preallocatedClusters = 0; This->lastFatSectorNr = 0; This->lastFatAccessMode = 0; This->lastFatSectorData = 0; This->drive = drive; This->last = 0; This->Direct = find_device(drive, mode, &dev, &boot0, name, &media, &maxSize); if(!This->Direct) return NULL; This->sector_size = WORD(secsiz); if(This->sector_size > MAX_SECTOR){ fprintf(stderr,"init %s: sector size too big\n", drive); return NULL; } i = log_2(This->sector_size); if(i == 24) { fprintf(stderr, "init %c: sector size (%d) not a small power of two\n", drive, This->sector_size); return NULL; } This->sectorShift = i; This->sectorMask = This->sector_size - 1; cylinder_size = dev.heads * dev.sectors; if (!tot_sectors) tot_sectors = dev.tracks * cylinder_size; This->serialized = 0; if ((media & ~7) == 0xf8){ i = media & 3; This->cluster_size = old_dos[i].cluster_size; tot_sectors = cylinder_size * old_dos[i].tracks; This->fat_start = 1; This->fat_len = old_dos[i].fat_len; This->dir_len = old_dos[i].dir_len; This->num_fat = 2; This->sector_size = 512; This->sectorShift = 9; This->sectorMask = 511; This->fat_bits = 12; nhs = 0; } else { struct label_blk_t *labelBlock; /* * all numbers are in sectors, except num_clus * (which is in clusters) */ tot_sectors = WORD(psect); if(!tot_sectors) { tot_sectors = DWORD(bigsect); nhs = DWORD(nhs); } else nhs = WORD(nhs); This->cluster_size = boot0.clsiz; This->fat_start = WORD(nrsvsect); This->fat_len = WORD(fatlen); This->dir_len = WORD(dirents) * MDIR_SIZE / This->sector_size; This->num_fat = boot0.nfat; if (This->fat_len) { labelBlock = &boot0.ext.old.labelBlock; } else { labelBlock = &boot0.ext.fat32.labelBlock; } if(labelBlock->dos4 == 0x29) { This->serialized = 1; This->serial_number = _DWORD(labelBlock->serial); } } if (tot_sectors >= (maxSize >> This->sectorShift)) { fprintf(stderr, "Big disks not supported on this architecture\n"); exit(1); } #ifndef OS_Minix /* Strange check, MS-DOS isn't that picky. */ if(!mtools_skip_check && (tot_sectors % dev.sectors)){ fprintf(stderr, "Total number of sectors not a multiple of" " sectors per track!\n"); fprintf(stderr, "Add mtools_skip_check=1 to your .mtoolsrc file " "to skip this test\n"); exit(1); } #endif /* full cylinder buffering */ #ifdef FULL_CYL disk_size = (dev.tracks) ? cylinder_size : 512; #else /* FULL_CYL */ disk_size = (dev.tracks) ? dev.sectors : 512; #endif /* FULL_CYL */ #if (defined OS_sysv4 && !defined OS_solaris) /* * The driver in Dell's SVR4 v2.01 is unreliable with large writes. */ disk_size = 0; #endif /* (defined sysv4 && !defined(solaris)) */ #ifdef OS_linux disk_size = cylinder_size; #endif #if 1 if(disk_size > 256) { disk_size = dev.sectors; if(dev.sectors % 2) disk_size <<= 1; } #endif if (disk_size % 2) disk_size *= 2; if(!dev.blocksize || dev.blocksize < This->sector_size) blocksize = This->sector_size; else blocksize = dev.blocksize; if (disk_size) This->Ne0F��2F����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������xt = buf_init(This->Direct, 8 * disk_size * blocksize, disk_size * blocksize, This->sector_size); else This->Next = This->Direct; if (This->Next == NULL) { perror("init: allocate buffer"); This->Next = This->Direct; } /* read the FAT sectors */ if(fat_read(This, &boot0, dev.fat_bits, tot_sectors, dev.use_2m&0x7f)){ This->num_fat = 1; FREE(&This->Next); Free(This->Next); return NULL; } return (Stream_t *) This; } char *getDrive(Stream_t *Stream) { DeclareThis(Fs_t); if(This->Class != &FsClass) return getDrive(GetFs(Stream)); else return This->drive; } int fsPreallocateClusters(Fs_t *Fs, long size) { if(size > 0 && getfreeMinClusters((Stream_t *)Fs, size) != 1) return -1; Fs->preallocatedClusters += size; return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "stream.h" #include "fsP.h" #include "llong.h" #include "mtools.h" /* Warnings about integer overflow in expression can be ignored. These are * due to the way that maximal values for those integers are computed: * intentional overflow from smallest negative number (1000...) to highest * positive number (0111...) by substraction of 1 */ #ifdef __GNUC__ /* #warning "The following warnings about integer overflow in expression can be safely ignored" */ #endif #if 1 const mt_off_t max_off_t_31 = MAX_OFF_T_B(31); /* Floppyd */ const mt_off_t max_off_t_41 = MAX_OFF_T_B(41); /* SCSI */ const mt_off_t max_off_t_seek = MAX_OFF_T_B(SEEK_BITS); /* SCSI */ #else const mt_off_t max_off_t_31 = MAX_OFF_T_B(10); /* Floppyd */ const mt_off_t max_off_t_41 = MAX_OFF_T_B(10); /* SCSI */ const mt_off_t max_off_t_seek = MAX_OFF_T_B(10); /* SCSI */ #endif off_t truncBytes32(mt_off_t off) { if (off & ~max_off_t_31) { fprintf(stderr, "Internal error, offset too big\n"); exit(1); } return (off_t) off; } mt_off_t sectorsToBytes(Stream_t *Stream, off_t off) { DeclareThis(Fs_t); return (mt_off_t) off << This->sectorShift; } #if defined HAVE_LLSEEK # ifndef HAVE_LLSEEK_PROTOTYPE extern long long llseek (int fd, long long offset, int origin); # endif #endif #if defined HAVE_LSEEK64 # ifndef HAVE_LSEEK64_PROTOTYPE extern long long lseek64 (int fd, long long offset, int origin); # endif #endif int mt_lseek(int fd, mt_off_t where, int whence) { #if defined HAVE_LSEEK64 if(lseek64(fd, where, whence) >= 0) return 0; else return -1; #elif defined HAVE_LLSEEK if(llseek(fd, where, whence) >= 0) return 0; else return -1; #else if (lseek(fd, (off_t) where, whence) >= 0) return 0; else return 1; #endif } int log_2(int size) { int i; for(i=0; i<24; i++) { if(1 << i == size) return i; } return 24; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_LLONG_H #define MTOOLS_LLONG_H #if 1 #ifdef HAVE_OFF_T_64 /* if off_t is already 64 bits, be happy, and don't worry about the * loff_t and llseek stuff */ #define MT_OFF_T off_t #endif #ifndef MT_OFF_T # ifdef HAVE_LLSEEK /* we have llseek. Now, what's its type called? loff_t or offset_t ? */ # ifdef HAVE_LOFF_T # define MT_OFF_T loff_t # else # ifdef HAVE_OFFSET_T # define MT_OFF_T offset_t # endif # endif # endif #endif #ifndef MT_OFF_T /* we still don't have a suitable mt_off_t type...*/ # ifdef HAVE_LONG_LONG /* ... first try long long ... */ # define MT_OFF_T long long # else /* ... and if that fails, fall back on good ole' off_t */ # define MT_OFF_T off_t # endif #endif typedef MT_OFF_T mt_off_t; #else /* testing: meant to flag dubious assignments between 32 bit length types * and 64 bit ones */ typedef struct { int lo; int high; } *mt_off_t; #endif typedef mt_off_t mt_size_t; #define min(a,b) ((a) < (b) ? (a) : (b)) #define MAX_OFF_T_B(bits) \ (((mt_off_t) 1 << min(bits, sizeof(mt_off_t)*8 - 1)) - 1) #ifdef HAVE_LLSEEK # define SEEK_BITS 63 #else # define SEEK_BITS (sizeof(off_t) * 8 - 1) #endif extern const mt_off_t max_off_t_31; extern const mt_off_t max_off_t_41; extern const mt_off_t max_off_t_seek; extern off_t truncBytes32(mt_off_t off); mt_off_t sectorsToBytes(Stream_t *This, off_t off); mt_size_t getfree(Stream_t *Stream); int getfreeMinBytes(Stream_t *Stream, mt_size_t ref); Stream_t *find_device(char *drive, int mode, struct device *out_dev, struct bootsector *boot, char *name, int *media, mt_size_t *maxSize); int mt_lseek(int fd, mt_off_t where, int whence); int log_2(int); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mainloop.c * Iterating over all the command line parameters, and matching patterns * where needed */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "fs.h" #include "mainloop.h" #include "plain_io.h" #include "file.h" int unix_dir_loop(Stream_t *Stream, MainParam_t *mp); int unix_loop(Stream_t *Stream, MainParam_t *mp, char *arg, int follow_dir_link); static int _unix_loop(Stream_t *Dir, MainParam_t *mp, const char *filename) { unix_dir_loop(Dir, mp); return GOT_ONE; } int unix_loop(Stream_t *Stream, MainParam_t *mp, char *arg, int follow_dir_link) { int ret; int isdir; mp->File = NULL; mp->direntry = NULL; mp->unixSourceName = arg; /* mp->dir.attr = ATTR_ARCHIVE;*/ mp->loop = _unix_loop; if((mp->lookupflags & DO_OPEN)){ mp->File = SimpleFileOpen(0, 0, arg, O_RDONLY, 0, 0, 0, 0); if(!mp->File){ perror(arg); #if 0 tmp = _basename(arg); strncpy(mp->filename, tmp, VBUFSIZE); mp->filename[VBUFSIZE-1] = '\0'; #endif return ERROR_ONE; } GET_DATA(mp->File, 0, 0, &isdir, 0); if(isdir) { struct stat buf; FREE(&mp->File); #ifdef S_ISLNK if(!follow_dir_link && lstat(arg, &buf) == 0 && S_ISLNK(buf.st_mode)) { /* skip links to directories in order to avoid * infinite loops */ fprintf(stderr, "skipping directory symlink %s\n", arg); return 0; } #endif if(! (mp->lookupflags & ACCEPT_DIR)) return 0; mp->File = OpenDir(Stream, arg); } } if(isdir) ret = mp->dirCallback(0, mp); else ret = mp->unixcallback(mp); FREE(&mp->File); return ret; } int isSpecial(const char *name) { if(name[0] == '\0') return 1; if(!strcmp(name,".")) return 1; if(!strcmp(name,"..")) return 1; return 0; } static int checkForDot(int lookupflags, const char *name) { return (lookupflags & NO_DOTS) && isSpecial(name); } typedef struct lookupState_t { Stream_t *container; int nbContainers; Stream_t *Dir; int nbDirs; const char *filename; } lookupState_t; static int isUniqueTarget(const char *name) { return name && strcmp(name, "-"); } static int handle_leaf(direntry_t *direntry, MainParam_t *mp, lookupState_t *lookupState) { Stream_t *MyFile=0; int ret; if(got_signal) return ERROR_ONE; if(lookupState) { /* we are looking for a "target" file */ switch(lookupState->nbDirs) { case 0: /* no directory yet, open it */ lookupState->Dir = OpenFileByDirentry(direntry); lookupState->nbDirs++; /* dump the container, we have * better now */ FREE(&lookupState->container); return 0; case 1: /* we have already a directory */ FREE(&lookupState->Dir); fprintf(stderr,"Ambigous\n"); return STOP_NOW | ERROR_ONE; default: return STOP_NOW | ERROR_ONE; } } mp->direntry = direntry; if(IS_DIR(direntry)) { if(mp->lookupflags & (DO_OPEN | DO_OPEN_DIRS)) MyFile = mp->File = OpenFileByDirentry(direntry); ret = mp->dirCallback(direntry, mp); } else { if(mp->lookupflags & DO_OPEN) MyFile = mp->File = OpenFileByDirentry(direntry); ret = mp->callback(direntry, mp); } FREE(&MyFile); if(isUniqueTarget(mp->targetName)) ret |= STOP_NOW; return ret; } static int _dos_loop(Stream_t *Dir, MainParam_t *mp, const char *filename) { Stream_t *MyFile=0; direntry_t entry; int ret; int r; ret = 0; r=0; initializeDirentry(&entry, Dir); while(!got_signal && (r=vfat_lookup(&entry, filename, -1, mp->lookupflags, mp->shortname, mp->longname)) == 0 ){ mp->File = NULL; if(!checkForDot(mp->lookupflags,entry.name)) { MyFile = 0; if((mp->lookupflags & DO_OPEN) || (IS_DIR(&entry) && (mp->lookupflags & DO_OPEN_DIRS))) { MyFile = mp->File = OpenFileByDirentry(&entry); } if(got_signal) break; mp->direntry = &entry; if(IS_DIR(&entry)) ret |= mp->dirCallback(&entry,mp); else ret |= mp->callback(&entry, mp); FREE(&MyFile); } if (fat_error(Dir)) ret |= ERROR_ONE; if(mp->fast_quit && (ret & ERROR_ONE)) break; } if (r == -2) return ERROR_ONE; if(got_signal) ret |= ERROR_ONE; return ret; } static int recurs_dos_loop(MainParam_t *mp, const char *filename0, const char *filename1, lookupState_t *lookupState) { /* Dir is de-allocated by the same entity which allocated it */ const char *ptr; direntry_t entry; int length; int lookupflags; int ret; int have_one; int doing_mcwd; int r; while(1) { /* strip dots and // */ if(!strncmp(filename0,"./", 2)) { filename0 += 2; continue; } if(!strcmp(filename0,".") && filename1) { filename0 ++; continue; } if(filename0[0] == '/') { filename0++; continue; } if(!filename0[0]) { if(!filename1) break; filename0 = filename1; filename1 = 0; continue; } break; } if(!strncmp(filename0,"../", 3) || (!strcmp(filename0, "..") && filename1)) { /* up one level */ mp->File = getDirentry(mp->File)->Dir; return recurs_dos_loop(mp, filename0+2, filename1, lookupState); } doing_mcwd = !!filename1; ptr = strchr(filename0, '/'); if(!ptr) { length = strlen(filename0); ptr = filename1; filename1 = 0; } else { length = ptr - filename0; ptr++; } if(!ptr) { if(mp->lookupflags & OPEN_PARENT) { mp->targetName = filename0; ret = handle_leaf(getDirentry(mp->File), mp, lookupState); mp->targetName = 0; return ret; } if(!strcmp(filename0, ".") || !filename0[0]) { return handle_leaf(getDirentry(mp->File), mp, lookupState); } if(!strcmp(filename0, "..")) { return handle_leaf(getParent(getDirentry(mp->File)), mp, lookupState); } lookupflags = mp->lookupflags; if(lookupState) { lookupState->filename = filename0; if(lookupState->nbContainers + lookupState->nbDirs > 0){ /* we have already one target, don't bother * with this one. */ FREE(&lookupState->container); } else { /* no match yet. Remember this container for * later use */ lookupState->container = COPY(mp->File); } lookupState->nbContainers++; } } else lookupflags = ACCEPT_DIR | DO_OPEN | NO_DOTS; ret = 0; r = 0; have_one = 0; initializeDirentry(&entry, mp->File); while(!(ret & STOP_NOW) && !got_signal && (r=vfat_lookup(&entry, filename0, length, lookupflags | NO_MSG, mp->shortname, mp->longname)) == 0 ){ if(checkForDot(lookupflags, entry.name)) /* while following the path, ignore the * special entries if they were not * explicitly given */ continue; have_one = 1; if(ptr) { Stream_t *SubDir; SubDir = mp->File = OpenFileByDirentry(&entry); ret |= recurs_dos_loop(mp, ptr, filename1, lookupState); FREE(&SubDir); } else { ret |= handle_leaf(&entry, mp, lookupState); if(isUniqueTarget(mp->targetName)) return ret | STOP_NOW; } if(doing_mcwd) break; } if (r == -2) return ERROR_ONE; if(got_signal) return ret | ERROR_ONE; if(doing_mcwd & !have_one) return NO_CWD; return ret; } static int common_dos_loop(MainParam_t *mp, const char *pathname, lookupState_t *lookupState, int open_mode) { Stream_t *RootDir; char *cwd; char *drive; char *rest; int ret; mp->loop = _dos_loop; drive='\0'; cwd = ""; if((rest = skip_drive(pathname)) > pathname) { drive = get_drive(pathname, NULL); if (strncmp(pathname, mp->mcwd, rest - pathname) == 0) cwd = skip_drive(mp->mcwd); pathname = rest; } else { drive = get_drive(mp->mcwd, NULL); cwd = skip_drive(mp->mcwd); } if(*pathname=='/') /* absolute path name */ cwd = ""; RootDir = mp->File = open_root_dir(drive, open_mode); if(!mp->File) return ERROR_ONE; ret = recurs_dos_loop(mp, cwd, pathname, lookupState); if(ret & NO_CWD) { /* no CWD */ *mp->mcwd = '\0'; unlink_mcwd(); ret = recurs_dos_loop(mp, "", pathname, lookupState); } FREE(&RootDir); return ret; } static int dos_loop(MainParam_t *mp, const char *arg) { return common_dos_loop(mp, arg, 0, mp->openflags); } static int dos_target_lookup(MainParam_t *mp, const char *arg) { lookupState_t lookupState; int ret; int lookupflag>F��@F��AF��BF��CF����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������s; lookupState.nbDirs = 0; lookupState.Dir = 0; lookupState.nbContainers = 0; lookupState.container = 0; lookupflags = mp->lookupflags; mp->lookupflags = DO_OPEN | ACCEPT_DIR; ret = common_dos_loop(mp, arg, &lookupState, O_RDWR); mp->lookupflags = lookupflags; if(ret & ERROR_ONE) return ret; if(lookupState.nbDirs) { mp->targetName = 0; mp->targetDir = lookupState.Dir; FREE(&lookupState.container); /* container no longer needed */ return ret; } switch(lookupState.nbContainers) { case 0: /* no match */ fprintf(stderr,"%s: no match for target\n", arg); return MISSED_ONE; case 1: mp->targetName = strdup(lookupState.filename); mp->targetDir = lookupState.container; return ret; default: /* too much */ fprintf(stderr, "Ambigous %s\n", arg); return ERROR_ONE; } } int unix_target_lookup(MainParam_t *mp, const char *arg) { char *ptr; mp->unixTarget = strdup(arg); /* try complete filename */ if(access(mp->unixTarget, F_OK) == 0) return GOT_ONE; ptr = strrchr(mp->unixTarget, '/'); if(!ptr) { mp->targetName = mp->unixTarget; mp->unixTarget = strdup("."); return GOT_ONE; } else { *ptr = '\0'; mp->targetName = ptr+1; return GOT_ONE; } } int target_lookup(MainParam_t *mp, const char *arg) { if((mp->lookupflags & NO_UNIX) || skip_drive(arg) > arg) return dos_target_lookup(mp, arg); else return unix_target_lookup(mp, arg); } int main_loop(MainParam_t *mp, char **argv, int argc) { int i; int ret, Bret; Bret = 0; if(argc != 1 && mp->targetName) { fprintf(stderr, "Several file names given, but last argument (%s) not a directory\n", mp->targetName); } for (i = 0; i < argc; i++) { if ( got_signal ) break; mp->originalArg = argv[i]; mp->basenameHasWildcard = strpbrk(_basename(mp->originalArg), "*[?") != 0; if (mp->unixcallback && skip_drive(argv[i]) == argv[i]) ret = unix_loop(0, mp, argv[i], 1); else ret = dos_loop(mp, argv[i]); if (! (ret & (GOT_ONE | ERROR_ONE)) ) { /* one argument was unmatched */ fprintf(stderr, "%s: File \"%s\" not found\n", progname, argv[i]); ret |= ERROR_ONE; } Bret |= ret; if(mp->fast_quit && (Bret & (MISSED_ONE | ERROR_ONE))) break; } FREE(&mp->targetDir); if(Bret & ERROR_ONE) return 1; if ((Bret & GOT_ONE) && ( Bret & MISSED_ONE)) return 2; if (Bret & MISSED_ONE) return 1; return 0; } static int dispatchToFile(direntry_t *entry, MainParam_t *mp) { if(entry) return mp->callback(entry, mp); else return mp->unixcallback(mp); } void init_mp(MainParam_t *mp) { fix_mcwd(mp->mcwd); mp->openflags = 0; mp->targetName = 0; mp->targetDir = 0; mp->unixTarget = 0; mp->dirCallback = dispatchToFile; mp->unixcallback = NULL; mp->shortname = mp->longname = 0; mp->File = 0; mp->fast_quit = 0; } const char *mpGetBasename(MainParam_t *mp) { if(mp->direntry) return mp->direntry->name; else return _basename(mp->unixSourceName); } void mpPrintFilename(FILE *fp, MainParam_t *mp) { if(mp->direntry) fprintPwd(fp, mp->direntry, 0); else fprintf(fp,"%s",mp->originalArg); } const char *mpPickTargetName(MainParam_t *mp) { /* picks the target name: either the one explicitly given by the * user, or the same as the source */ if(mp->targetName) return mp->targetName; else return mpGetBasename(mp); } char *mpBuildUnixFilename(MainParam_t *mp) { const char *target; char *ret; target = mpPickTargetName(mp); ret = malloc(strlen(mp->unixTarget) + 2 + strlen(target)); if(!ret) return 0; strcpy(ret, mp->unixTarget); if(*target) { #if 1 /* fix for 'mcopy -n x:file existingfile' -- H. Lermen 980816 */ if(!mp->targetName && !mp->targetDir) { struct stat buf; if (!stat(ret, &buf) && !S_ISDIR(buf.st_mode)) return ret; } #endif strcat(ret, "/"); strcat(ret, target); } return ret; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Do shell-style pattern matching for '?', '\', '[..]', and '*' wildcards. * Returns 1 if match, 0 if not. */ #include "sysincludes.h" #include "mtools.h" static int casecmp(char a,char b) { return toupper(a) == toupper(b); } static int exactcmp(char a,char b) { return a == b; } static int parse_range(const char **p, const char *s, char *out, int (*compfn)(char a, char b)) { char table[256]; int reverse; int i; short first, last; if (**p == '^') { reverse = 1; (*p)++; } else reverse=0; for(i=0; i<256; i++) table[i]=0; while(**p != ']') { if(!**p) return 0; if((*p)[1] == '-') { first = **p; (*p)+=2; if(**p == ']') last = 256; else last = *((*p)++); for(i=first; i<last; i++) table[i] = 1; } else table[(int) *((*p)++)] = 1; } if(out) *out = *s; if(table[(int) *s]) return 1 ^ reverse; if(compfn == exactcmp) return reverse; if(table[tolower(*s)]) { if(out) *out = tolower(*s); return 1 ^ reverse; } if(table[toupper(*s)]) { if(out) *out = toupper(*s); return 1 ^ reverse; } return reverse; } static int _match(const char *s, const char *p, char *out, int Case, int length, int (*compfn) (char a, char b)) { for (; *p != '\0' && length; ) { switch (*p) { case '?': /* match any one character */ if (*s == '\0') return(0); if(out) *(out++) = *s; break; case '*': /* match everything */ while (*p == '*' && length) { p++; length--; } /* search for next char in pattern */ while(*s) { if(_match(s, p, out, Case, length, compfn)) return 1; if(out) *out++ = *s; s++; } continue; case '[': /* match range of characters */ p++; length--; if(!parse_range(&p, s, out++, compfn)) return 0; break; case '\\': /* Literal match with next character */ p++; length--; /* fall thru */ default: if (!compfn(*s,*p)) return(0); if(out) *(out++) = *p; break; } p++; length--; s++; } if(out) *out = '\0'; /* string ended prematurely ? */ if (*s != '\0') return(0); else return(1); } int match(const char *s, const char *p, char *out, int Case, int length) { int (*compfn)(char a, char b); if(Case) compfn = casecmp; else /*compfn = exactcmp;*/ compfn = casecmp; return _match(s, p, out, Case, length, compfn); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mattrib.c * Change MSDOS file attribute flags */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "mainloop.h" typedef struct Arg_t { char add; unsigned char remove; struct MainParam_t mp; int recursive; int doPrintName; } Arg_t; int concise; static int attrib_file(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; if(entry->entry != -3) { /* if not root directory, change it */ entry->dir.attr = (entry->dir.attr & arg->remove) | arg->add; dir_write(entry); } return GOT_ONE; } static int replay_attrib(direntry_t *entry, MainParam_t *mp) { if ( (IS_ARCHIVE(entry) && IS_DIR(entry)) || (!IS_ARCHIVE(entry) && !IS_DIR(entry)) || IS_SYSTEM(entry) || IS_HIDDEN(entry)) { printf("mattrib "); if (IS_ARCHIVE(entry) && IS_DIR(entry)) { printf("+a "); } if (!IS_ARCHIVE(entry) && !IS_DIR(entry)) { printf("-a "); } if (IS_SYSTEM(entry)) { printf("+s "); } if (IS_HIDDEN(entry)) { printf("+h "); } fprintPwd(stdout, entry, 1); printf("\n"); } return GOT_ONE; } static int view_attrib(direntry_t *entry, MainParam_t *mp) { printf(" "); if(IS_ARCHIVE(entry)) putchar('A'); else putchar(' '); fputs(" ",stdout); if(IS_SYSTEM(entry)) putchar('S'); else putchar(' '); if(IS_HIDDEN(entry)) putchar('H'); else putchar(' '); if(IS_READONLY(entry)) putchar('R'); else putchar(' '); printf(" "); fprintPwd(stdout, entry, 0); printf("\n"); return GOT_ONE; } static int concise_view_attrib(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; if(IS_ARCHIVE(entry)) putchar('A'); if(IS_DIR(entry)) putchar('D'); if(IS_SYSTEM(entry)) putchar('S'); if(IS_HIDDEN(entry)) putchar('H'); if(IS_READONLY(entry)) putchar('R'); if(arg->doPrintName) { putchar(' '); fprintPwd(stdout, entry, 0); } putchar('\n'); return GOT_ONE; } static int recursive_attrib(direntry_t *entry, MainParam_t *mp) { mp->callback(entry, mp); return mp->loop(mp->File, mp, "*"); } static void usage(void) NORETURN; static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-p/X] [-a|+a] [-h|+h] [-r|+r] [-s|+s] msdosfile [msdosfiles...]\n" "\t-p Replay how mattrib would set up attributes\n" "\t-/ Recursive\n" "\t-X Concise\n", progname); exit(1); } static int letterToCode(int letter) { switch (toupper(letter)) { case 'A': return ATTR_ARCHIVE; case 'H': return ATTR_HIDDEN; case 'R': return ATTR_READONLY; case 'S': return ATTR_SYSTEM; default: usage(); } } void mattrib(int argc, char **argv, int type) { Arg_t arg; int view; int c; int concise; int replay; char *ptr; arg.add = 0; arg.remove = 0xff; arg.recursive = 0; arg.doPrintName = 1; view = 0; concise = 0; replay = 0; while ((c = getopt(argc, argv, "/ahrsAHRSXp")) != EOF) { switch (c) { default: arg.remove &= ~letterToCode(c); break; case 'p': replay = 1; break; case '/': arg.recursive = 1; break; case 'X': concise = 1; break; case '?': usage(); } } for(;optind < argc;optind++) { switch(argv[optind][0]) { case '+': for(ptr = argv[optind] + 1; *ptr; ptr++) arg.add |= letterToCode(*ptr); continue; case '-': for(ptr = argv[optind] + 1; *ptr; ptr++) arg.remove &= ~letterToCode(*ptr); continue; } break; } if(arg.remove == 0xff && !arg.add) view = 1; if (optind >= argc) usage(); init_mp(&arg.mp); if(view){ if(concise) { arg.mp.callback = concise_view_attrib; arg.doPrintName = (argc - optind > 1 || arg.recursive || strpbrk(argv[optind], "*[?") != 0); } else if (replay) { arg.mp.callback = replay_attrib; } else arg.mp.callback = view_attrib; arg.mp.openflags = O_RDONLY; } else { arg.mp.callback = attrib_file; arg.mp.openflags = O_RDWR; } if(arg.recursive) arg.mp.dirCallback = recursive_attrib; arg.mp.arg = (void *) &arg; arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR; if(arg.recursive) arg.mp.lookupflags |= DO_OPEN_DIRS | NO_DOTS; exit(main_loop(&arg.mp, argv + optind, argc - optind)); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mbadblocks.c * Mark bad blocks on disk * */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "mainloop.h" #include "fsP.h" void mbadblocks(int argc, char **argv, int type) { int i; char *in_buf; int in_len; off_t start; struct MainParam_t mp; Fs_t *Fs; Stream_t *Dir; int ret; if (argc != 2 || skip_drive(argv[1]) == argv[1]) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s drive:\n", argv[0]); exit(1); } init_mp(&mp); Dir = open_root_dir(get_drive(argv[1], NULL), O_RDWR); if (!Dir) { fprintf(stderr,"%s: Cannot initialize drive\n", argv[0]); exit(1); } Fs = (Fs_t *)GetFs(Dir); in_len = Fs->cluster_size * Fs->sector_size; in_buf = malloc(in_len); if(!in_buf) { FREE(&Dir); printOom(); exit(1); } for(i=0; i < Fs->clus_start; i++ ){ ret = READS(Fs->Next, in_buf, sectorsToBytes((Stream_t*)Fs, i), Fs->sector_size); if( ret < 0 ){ perror("early error"); exit(1); } if(ret < Fs->sector_size){ fprintf(stderr,"end of file in file_read\n"); exit(1); } } in_len = Fs->cluster_size * Fs->sector_size; for(i=2; i< Fs->num_clus + 2; i++){ if(got_signal) break; if(Fs->fat_decode((Fs_t*)Fs,i)) continue; start = (i - 2) * Fs->cluster_size + Fs->clus_start; ret = force_read(Fs->Next, in_buf, sectorsToBytes((Stream_t*)Fs, start), in_len); if(ret < in_len ){ printf("Bad cluster %d found\n", i); fatEncode((Fs_t*)Fs, i, 0xfff7); continue; } } FREE(&Dir); exit(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mcat.c * Same thing as cat /dev/fd0 or cat file >/dev/fd0 * Something, that isn't possible with floppyd anymore. */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "mainloop.h" #include "fsP.h" #include "xdf_io.h" #include "floppyd_io.h" #include "plain_io.h" void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: mcat [-w] device\n"); fprintf(stderr, " -w write on device else read\n"); exit(1); } #define BUF_SIZE 16000 void mcat(int argc, char **argv, int type) { struct device *dev; struct device out_dev; char *drive, name[EXPAND_BUF]; char errmsg[200]; Stream_t *Stream; char buf[BUF_SIZE]; mt_off_t address = 0; char mode = O_RDONLY; int optindex = 1; size_t len; noPrivileges = 1; if (argc < 2) { usage(); } if (argv[1][0] == '-') { if (argv[1][1] != 'w') { usage(); } mode = O_WRONLY; optindex++; } if (argc - optindex < 1) usage(); if (skip_drive(argv[optindex]) == argv[optindex]) usage(); drive = get_drive(argv[optindex], NULL); /* check out a drive whose letter and parameters match */ sprintf(errmsg, "Drive '%s:' not supported", drive); Stream = NULL; for (dev=devices; dev->name; dev++) { FREE(&Stream); if (strcmp(dev->drive, drive) != 0) continue; out_dev = *dev; expand(dev->name,name); #ifdef USING_NEW_VOLD strcpy(name, getVoldName(dev, name)); #endif Stream = 0; #ifdef USE_XDF Stream = XdfOpen(&out_dev, name, mode, errmsg, 0); if(Stream) out_dev.use_2m = 0x7f; #endif #ifdef USE_FLOPPYD if(!Stream) Stream = FloppydOpen(&out_dev, dev, name, mode, errmsg, 0, 1); #endif if (!Stream) Stream = SimpleFileOpen(&out_dev, dev, name, mode, errmsg, 0, 1, 0); if( !Stream) continue; break; } /* print error msg if needed */ if ( dev->drive == 0 ){ FREE(&Stream); fprintf(stderr,"%s\n",errmsg); exit(1); } if (mode == O_WRONLY) { while ((len = fread(buf, 1, BUF_SIZE, stdin)) == BUF_SIZE) { WRITES(Stream, buf, address, BUF_SIZE); address += BUF_SIZE; } if (len) WRITES(Stream, buf, address, len); } else { while ((len = READS(Stream, buf, address, BUF_SIZE)) == BUF_SIZE) { fwrite(buf, 1, BUF_SIZE, stdout); address += BUF_SIZE; } if (len) fwrite(buf, 1, len, stdout); } FREE(&Stream); exit(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mcd.c: Change MSDOS directories */ #include "sysincludes.h" #include "msdos.h" #include "mainloop.h" #include "mtools.h" static int mcd_callback(direntry_t *entry, MainParam_t *mp) { FILE *fp; if (!(fp = open_mcwd("w"))){ fprintf(stderr,"mcd: Can't open mcwd .file for writing\n"); return ERROR_ONE; } fprintPwd(fp, entry,0); fprintf(fp, "\n"); fclose(fp); return GOT_ONE | STOP_NOW; } void mcd(int argc, char **argv, int type) { struct MainParam_t mp; if (argc > 2) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s: msdosdirectory\n", argv[0]); exit(1); } init_mp(&mp); mp.lookupflags = ACCEPT_DIR | NO_DOTS; mp.dirCallback = mcd_callback; if (argc == 1) { printf("%s\n", mp.mcwd); exit(0); } else exit(main_loop(&mp, argv + 1, 1)); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mcopy.c * Copy an MSDOS files to and from Unix * */ #define LOWERCASE #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "mainloop.h" #include "plain_io.h" #include "nameclash.h" #include "file.h" #include "fs.h" /* * Preserve the file modification times after the fclose() */ static void set_mtime(const char *target, time_t mtime) { if (target && strcmp(target, "-") && mtime != 0L) { #ifdef HAVE_UTIMES struct timeval tv[2]; tv[0].tv_sec = mtime; tv[0].tv_usec = 0; tv[1].tv_sec = mtime; tv[1].tv_usec = 0; utimes((char *)target, tv); #else #ifdef HAVE_UTIME struct utimbuf utbuf; utbuf.actime = mtime; utbuf.modtime = mtime; utime(target, &utbuf); #endif #endif } return; } typedef struct Arg_t { int recursive; int preserveAttributes; int preserveTime; unsigned char attr; char *path; int textmode; int needfilter; int nowarn; int verbose; int type; MainParam_t mp; ClashHandling_t ch; } Arg_t; /* Write the Unix file */ static int unix_write(direntry_t *entry, MainParam_t *mp, int needfilter) { Arg_t *arg=(Arg_t *) mp->arg; time_t mtime; Stream_t *File=mp->File; Stream_t *Target, *Source; struct stat stbuf; int ret; char errmsg[80]; char *unixFile; File->Class->get_data(File, &mtime, 0, 0, 0); if (!arg->preserveTime) mtime = 0L; if(arg->type) unixFile = "-"; else unixFile = mpBuildUnixFilename(mp); if(!unixFile) { printOom(); return ERROR_ONE; } /* if we are creating a file, check whether it already exists */ if(!arg->type) { if (!arg->nowarn && &arg->type && !access(unixFile, 0)){ if( ask_confirmation("File \"%s\" exists, overwrite (y/n) ? ", unixFile,0)) { free(unixFile); return ERROR_ONE; } /* sanity checking */ if (!stat(unixFile, &stbuf) && !S_ISREG(stbuf.st_mode)) { fprintf(stderr,"\"%s\" is not a regular file\n", unixFile); free(unixFile); return ERROR_ONE; } } } if(!arg->type && arg->verbose) { fprintf(stderr,"Copying "); mpPrintFilename(stderr,mp); fprintf(stderr,"\n"); } if(got_signal) { free(unixFile); return ERROR_ONE; } if ((Target = SimpleFileOpen(0, 0, unixFile, O_WRONLY | O_CREAT | O_TRUNC, errmsg, 0, 0, 0))) { ret = 0; if(needfilter && arg->textmode){ Source = open_filter(COPY(File)); if (!Source) ret = -1; } else Source = COPY(File); if (ret == 0 ) ret = copyfile(Source, Target); FREE(&Source); FREE(&Target); if(ret <= -1){ if(!arg->type) { unlink(unixFile); free(unixFile); } return ERROR_ONE; } if(!arg->type) { set_mtime(unixFile, mtime); free(unixFile); } return GOT_ONE; } else { fprintf(stderr,"%s\n", errmsg); if(!arg->type) free(unixFile); return ERROR_ONE; } } static int makeUnixDir(char *filename) { if(!mkdir(filename, 0777)) return 0; if(errno == EEXIST) { struct stat buf; if(stat(filename, &buf) < 0) return -1; if(S_ISDIR(buf.st_mode)) return 0; errno = ENOTDIR; } return -1; } /* Copy a directory to Unix */ static int unix_copydir(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; time_t mtime; Stream_t *File=mp->File; int ret; char *unixFile; if (!arg->recursive && mp->basenameHasWildcard) return 0; File->Class->get_data(File, &mtime, 0, 0, 0); if (!arg->preserveTime) mtime = 0L; if(!arg->type && arg->verbose) { fprintf(stderr,"Copying "); fprintPwd(stderr, entry,0); fprintf(stderr, "\n"); } if(got_signal) return ERROR_ONE; unixFile = mpBuildUnixFilename(mp); if(!unixFile) { printOom(); return ERROR_ONE; } if(arg->type || !*mpPickTargetName(mp) || !makeUnixDir(unixFile)) { Arg_t newArg; newArg = *arg; newArg.mp.arg = (void *) &newArg; newArg.mp.unixTarget = unixFile; newArg.mp.targetName = 0; newArg.mp.basenameHasWildcard = 1; ret = mp->loop(File, &newArg.mp, "*"); set_mtime(unixFile, mtime); free(unixFile); return ret | GOT_ONE; } else { perror("mkdir"); fprintf(stderr, "Failure to make directory %s\n", unixFile); free(unixFile); return ERROR_ONE; } } static int dos_to_unix(direntry_t *entry, MainParam_t *mp) { return unix_write(entry, mp, 1); } static int unix_to_unix(MainParam_t *mp) { return unix_write(0, mp, 0); } static int directory_dos_to_unix(direntry_t *entry, MainParam_t *mp) { return unix_copydir(entry, mp); } /* * Open the named file for read, create the cluster chain, return the * directory structure or NULL on error. */ static int writeit(char *dosname, char *longname, void *arg0, direntry_t *entry) { Stream_t *Target; time_t now; int type, fat, ret; time_t date; mt_size_t filesize, newsize; Arg_t *arg = (Arg_t *) arg0; if (arg->mp.File->Class->get_data(arg->mp.File, & date, &filesize, &type, 0) < 0 ){ fprintf(stderr, "Can't stat source file\n"); return -1; } if (type){ if (arg->verbose) fprintf(stderr, "\"%s\" is a directory\n", longname); return -1; } /*if (!arg->single || arg->recursive)*/ if(arg->verbose) fprintf(stderr,"Copying %s\n", longname); if(got_signal) return -1; /* will it fit? */ if (!getfreeMinBytes(arg->mp.targetDir, filesize)) return -1; /* preserve mod time? */ if (arg->preserveTime) now = date; else getTimeNow(&now); mk_entry(dosname, arg->attr, 1, 0, now, &entry->dir); Target = OpenFileByDirentry(entry); if(!Target){ fprintf(stderr,"Could not open Target\n"); exit(1); } if (arg->needfilter & arg->textmode) Target = open_filter(Target); ret = copyfile(arg->mp.File, Target); GET_DATA(Target, 0, &newsize, 0, &fat); FREE(&Target); if (arg->needfilter & arg->textmode) newsize++; /* ugly hack: we gathered the size before the Ctrl-Z * was written. Increment it manually */ if(ret < 0 ){ fat_free(arg->mp.targetDir, fat); return -1; } else { mk_entry(dosname, arg->attr, fat, truncBytes32(newsize), now, &entry->dir); return 0; } } static int dos_write(direntry_t *entry, MainParam_t *mp, int needfilter) /* write a messy dos file to another messy dos file */ { int result; Arg_t * arg = (Arg_t *) (mp->arg); const char *targetName = mpPickTargetName(mp); if(entry && arg->preserveAttributes) arg->attr = entry->dir.attr; else arg->attr = ATTR_ARCHIVE; arg->needfilter = needfilter; if (entry && mp->targetDir == entry->Dir){ arg->ch.ignore_entry = -1; arg->ch.source = entry->entry; } else { arg->ch.ignore_entry = -1; arg->ch.source = -2; } result = mwrite_one(mp->targetDir, targetName, 0, writeit, (void *)arg, &arg->ch); if(result == 1) return GOT_ONE; else return ERROR_ONE; } static Stream_t *subDir(Stream_t *parent, const char *filename) { direntry_t entry; initializeDirentry(&entry, parent); switch(vfat_lookup(&entry, filename, -1, ACCEPT_DIR, 0, 0)) { case 0: return OpenFileByDirentry(&entry); case -1: return NULL; default: /* IO Error */ return NULL; } } static int dos_copydir(direntry_t *entry, MainParam_t *mp) /* copyes a directory to Dos */ { Arg_t * arg = (Arg_t *) (mp->arg); Arg_t newArg; time_t now; time_t date; int ret; const char *targetName = mpPickTargetName(mp); if (!arg->recursive && mp->basenameHasWildcard) return 0; if(entry && isSubdirOf(mp->targetDir, mp->File)) { fprintf(stderr, "Cannot recursively copy directory "); fprintPwd(stderr, entry,0); fprintf(stderr, " into one of its own subdirectories "); fprintPwd(stderr, getDirentry(mp->targetDir),0); fprintf(stderr, "\n"); return ERROR_ONE; } if (arg->mp.File->Class->get_data(arg->mp.File, & date, 0, 0, 0) < 0 ){ fprintf(stderr, "Can't stat source file\n"); return ERROR_ONE; } if(!arg->type && arg->verbose) fprintf(stderr,"Copying %s\n", mpGetBasename(mp)); if(entry && arg->preserveAttributes) arg->attr = entry->dir.attr; else arg->attr = 0; if (entry && (mp->targetDir == entry->Dir)){ arg->ch.ignore_entry = -1; arg->ch.source = entry->entry; } else { arg->ch.ignore_entry = -1; arg->ch.source = -2; } /* preserve mod time? */ if (arg->preserveTime) now = date; YF��[F��\F��]F��^F����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������else getTimeNow(&now); newArg = *arg; newArg.mp.arg = &newArg; newArg.mp.targetName = 0; newArg.mp.basenameHasWildcard = 1; if(*targetName) { /* maybe the directory already exist. Use it */ newArg.mp.targetDir = subDir(mp->targetDir, targetName); if(!newArg.mp.targetDir) newArg.mp.targetDir = createDir(mp->targetDir, targetName, &arg->ch, arg->attr, now); } else newArg.mp.targetDir = mp->targetDir; if(!newArg.mp.targetDir) return ERROR_ONE; ret = mp->loop(mp->File, &newArg.mp, "*"); if(*targetName) FREE(&newArg.mp.targetDir); return ret | GOT_ONE; } static int dos_to_dos(direntry_t *entry, MainParam_t *mp) { return dos_write(entry, mp, 0); } static int unix_to_dos(MainParam_t *mp) { return dos_write(0, mp, 1); } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-/spabtnmvQB] [-D clash_option] sourcefile targetfile\n", progname); fprintf(stderr, " %s [-/spabtnmvQB] [-D clash_option] sourcefile [sourcefiles...] targetdirectory\n", progname); fprintf(stderr, "\t-/ -s Recursive\n" "\t-p Preserve attributes\n" "\t-a -t Textmode\n" "\t-n Overwrite UNIX files without confirmation\n" "\t-m Preserve file time (default under Minix)\n" "\t-v Verbose\n" "\t-Q Quit on the first error\n" "\t-b -B Batch mode (faster, but less crash resistent)\n" "\t-o Overwrite DOS files without confirmation\n"); exit(1); } void mcopy(int argc, char **argv, int mtype) { Arg_t arg; int c, ret, fastquit; int todir; /* get command line options */ init_clash_handling(& arg.ch); /* get command line options */ todir = 0; arg.recursive = 0; #ifdef OS_Minix arg.preserveTime = 1; /* Copy file time as DOS does. */ #else arg.preserveTime = 0; #endif arg.preserveAttributes = 0; arg.nowarn = 0; arg.textmode = 0; arg.verbose = 0; arg.type = mtype; fastquit = 0; while ((c = getopt(argc, argv, "abB/sptnmvQD:o")) != EOF) { switch (c) { case 's': case '/': arg.recursive = 1; break; case 'p': arg.preserveAttributes = 1; break; case 'a': case 't': arg.textmode = 1; break; case 'n': arg.nowarn = 1; break; case 'm': arg.preserveTime = 1; break; case 'v': arg.verbose = 1; break; case 'Q': fastquit = 1; break; case 'B': case 'b': batchmode = 1; break; case 'o': handle_clash_options(&arg.ch, c); break; case 'D': if(handle_clash_options(&arg.ch, *optarg)) usage(); break; case '?': usage(); default: break; } } if (argc - optind < 1) usage(); init_mp(&arg.mp); arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN | NO_DOTS; arg.mp.fast_quit = fastquit; arg.mp.arg = (void *) &arg; arg.mp.openflags = O_RDONLY; /* last parameter is "-", use mtype mode */ if(!mtype && !strcmp(argv[argc-1], "-")) { arg.type = mtype = 1; argc--; } if(mtype){ /* Mtype = copying to stdout */ arg.mp.targetName = strdup("-"); arg.mp.unixTarget = strdup(""); arg.mp.callback = dos_to_unix; arg.mp.dirCallback = unix_copydir; arg.mp.unixcallback = unix_to_unix; } else { char *target; if (argc - optind == 1) { /* copying to the current directory */ target = "."; } else { /* target is the last item mentioned */ argc--; target = argv[argc]; } ret = target_lookup(&arg.mp, target); if(!arg.mp.targetDir && !arg.mp.unixTarget) { fprintf(stderr,"Bad target %s\n", target); exit(1); } /* callback functions */ if(arg.mp.unixTarget) { arg.mp.callback = dos_to_unix; arg.mp.dirCallback = directory_dos_to_unix; arg.mp.unixcallback = unix_to_unix; } else { arg.mp.dirCallback = dos_copydir; arg.mp.callback = dos_to_dos; arg.mp.unixcallback = unix_to_dos; } } exit(main_loop(&arg.mp, argv + optind, argc - optind)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mdel.c * Delete an MSDOS file * */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "stream.h" #include "mainloop.h" #include "fs.h" #include "file.h" typedef struct Arg_t { int deltype; int verbose; } Arg_t; static int del_entry(direntry_t *entry, MainParam_t *mp) { Arg_t *arg=(Arg_t *) mp->arg; direntry_t longNameEntry; int i; if(got_signal) return ERROR_ONE; if(entry->entry == -3) { fprintf(stderr, "Cannot remove root directory\n"); return ERROR_ONE; } if (arg->verbose) { fprintf(stderr,"Removing "); fprintPwd(stdout, entry,0); putchar('\n'); } if ((entry->dir.attr & (ATTR_READONLY | ATTR_SYSTEM)) && (ask_confirmation("%s: \"%s\" is read only, erase anyway (y/n) ? ", progname, entry->name))) return ERROR_ONE; if (fatFreeWithDirentry(entry)) return ERROR_ONE; initializeDirentry(&longNameEntry, entry->Dir); for(i=entry->beginSlot; i< entry->endSlot; i++) { int error; longNameEntry.entry=i; dir_read(&longNameEntry, &error); if(error) break; longNameEntry.dir.name[0] = (char) DELMARK; dir_write(&longNameEntry); } entry->dir.name[0] = (char) DELMARK; dir_write(entry); return GOT_ONE; } static int del_file(direntry_t *entry, MainParam_t *mp) { char shortname[13]; direntry_t subEntry; Stream_t *SubDir; Arg_t *arg = (Arg_t *) mp->arg; MainParam_t sonmp; int ret; int r; sonmp = *mp; sonmp.arg = mp->arg; r = 0; if (IS_DIR(entry)){ /* a directory */ SubDir = OpenFileByDirentry(entry); initializeDirentry(&subEntry, SubDir); ret = 0; while((r=vfat_lookup(&subEntry, "*", 1, ACCEPT_DIR | ACCEPT_PLAIN, shortname, NULL)) == 0 ){ if(shortname[0] != DELMARK && shortname[0] && shortname[0] != '.' ){ if(arg->deltype != 2){ fprintf(stderr, "Directory "); fprintPwd(stderr, entry,0); fprintf(stderr," non empty\n"); ret = ERROR_ONE; break; } if(got_signal) { ret = ERROR_ONE; break; } ret = del_file(&subEntry, &sonmp); if( ret & ERROR_ONE) break; ret = 0; } } FREE(&SubDir); if (r == -2) return ERROR_ONE; if(ret) return ret; } return del_entry(entry, mp); } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-v] msdosfile [msdosfiles...]\n" "\t-v Verbose\n", progname); exit(1); } void mdel(int argc, char **argv, int deltype) { Arg_t arg; MainParam_t mp; int c,i; arg.verbose = 0; while ((c = getopt(argc, argv, "v")) != EOF) { switch (c) { case 'v': arg.verbose = 1; break; default: usage(); } } if(argc == optind) usage(); init_mp(&mp); mp.callback = del_file; mp.arg = (void *) &arg; mp.openflags = O_RDWR; arg.deltype = deltype; switch(deltype){ case 0: mp.lookupflags = ACCEPT_PLAIN; /* mdel */ break; case 1: mp.lookupflags = ACCEPT_DIR; /* mrd */ break; case 2: mp.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN; /* mdeltree */ break; } mp.lookupflags |= NO_DOTS; for(i=optind;i<argc;i++) { int b,l; b = skip_drive(argv[i]) - argv[i]; l = strlen(argv[i]+b); if(l > 1 && argv[i][b+l-1] == '/') argv[i][b+l-1] = '\0'; } exit(main_loop(&mp, argv + optind, argc - optind)); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mdir.c: * Display an MSDOS directory */ #include "sysincludes.h" #include "msdos.h" #include "vfat.h" #include "mtools.h" #include "file.h" #include "mainloop.h" #include "fs.h" #include "codepage.h" #ifdef TEST_SIZE #include "fsP.h" #endif static int recursive; static int wide; static int all; static int concise; static int fast=0; #if 0 static int testmode = 0; #endif static char *dirPath; static char *currentDrive; static Stream_t *currentDir; static int filesInDir; /* files in current dir */ static int filesOnDrive; /* files on drive */ static int dirsOnDrive; /* number of listed directories on this drive */ static int debug = 0; /* debug mode */ static mt_size_t bytesInDir; static mt_size_t bytesOnDrive; static Stream_t *RootDir; static char shortname[13]; static char longname[VBUFSIZE]; /* * Print an MSDOS directory date stamp. */ static inline void print_date(struct directory *dir) { char year[5]; char day[3]; char month[3]; char *p; sprintf(year, "%04d", DOS_YEAR(dir)); sprintf(day, "%02d", DOS_DAY(dir)); sprintf(month, "%02d", DOS_MONTH(dir)); for(p=mtools_date_string; *p; p++) { if(!strncasecmp(p, "yyyy", 4)) { printf("%04d", DOS_YEAR(dir)); p+= 3; continue; } else if(!strncasecmp(p, "yy", 2)) { printf("%02d", DOS_YEAR(dir) % 100); p++; continue; } else if(!strncasecmp(p, "dd", 2)) { printf("%02d", DOS_DAY(dir)); p++; continue; } else if(!strncasecmp(p, "mm", 2)) { printf("%02d", DOS_MONTH(dir)); p++; continue; } putchar(*p); } } /* * Print an MSDOS directory time stamp. */ static inline void print_time(struct directory *dir) { char am_pm; int hour = DOS_HOUR(dir); if(!mtools_twenty_four_hour_clock) { am_pm = (hour >= 12) ? 'p' : 'a'; if (hour > 12) hour = hour - 12; if (hour == 0) hour = 12; } else am_pm = ' '; printf("%2d:%02d%c", hour, DOS_MINUTE(dir), am_pm); } /* * Return a number in dotted notation */ static const char *dotted_num(mt_size_t num, int width, char **buf) { int len; register char *srcp, *dstp; int size; unsigned long numlo; unsigned long numhi; if (num < 0) { /* warn about negative numbers here. They should not occur */ fprintf(stderr, "Invalid negative number\n"); } size = width + width; *buf = malloc(size+1); if (*buf == NULL) return ""; /* Create the number in maximum width; make sure that the string * length is not exceeded (in %6ld, the result can be longer than 6!) */ numlo = num % 1000000000; numhi = num / 1000000000; if(numhi && size > 9) { sprintf(*buf, "%.*lu%09lu", size-9, numhi, numlo); } else { sprintf(*buf, "%.*lu", size, numlo); } for (srcp=*buf; srcp[1] != '\0'; ++srcp) if (srcp[0] == '0') srcp[0] = ' '; else break; len = strlen(*buf); srcp = (*buf)+len; dstp = (*buf)+len+1; for ( ; dstp >= (*buf)+4 && isdigit (srcp[-1]); ) { srcp -= 3; /* from here we copy three digits */ dstp -= 4; /* that's where we put these 3 digits */ } /* now finally copy the 3-byte blocks to their new place */ while (dstp < (*buf) + len) { dstp[0] = srcp[0]; dstp[1] = srcp[1]; dstp[2] = srcp[2]; if (dstp + 3 < (*buf) + len) /* use spaces instead of dots: they please both * Americans and Europeans */ dstp[3] = ' '; srcp += 3; dstp += 4; } return (*buf) + len-width; } static inline int print_volume_label(Stream_t *Dir, char *drive) { Stream_t *Stream = GetFs(Dir); direntry_t entry; DeclareThis(FsPublic_t); char shortname[13]; char longname[VBUFSIZE]; int r; RootDir = OpenRoot(Stream); if(concise) return 0; /* find the volume label */ initializeDirentry(&entry, RootDir); if((r=vfat_lookup(&entry, 0, 0, ACCEPT_LABEL | MATCH_ANY, shortname, longname)) ) { if (r == -2) { /* I/O Error */ return -1; } printf(" Volume in drive %s has no label", drive); } else if (*longname) printf(" Volume in drive %s is %s (abbr=%s)", drive, longname, shortname); else printf(" Volume in drive %s is %s", drive, shortname); if(This->serialized) printf("\n Volume Serial Number is %04lX-%04lX", (This->serial_number >> 16) & 0xffff, This->serial_number & 0xffff); return 0; } static void printSummary(int files, mt_size_t bytes) { if(!filesInDir) printf("No files\n"); else { char *s1; printf(" %3d file", files); if(files == 1) putchar(' '); else putchar('s'); printf(" %s bytes\n", dotted_num(bytes, 13, &s1)); if(s1) free(s1); } } static void leaveDirectory(int haveError); static void leaveDrive(int haveError) { if(!currentDrive) return; leaveDirectory(haveError); if(!concise && !haveError) { char *s1; if(dirsOnDrive > 1) { printf("\nTotal files listed:\n"); printSummary(filesOnDrive, bytesOnDrive); } if(RootDir && !fast) { mt_off_t bytes = getfree(RootDir); printf(" %s bytes free\n\n", dotted_num(bytes,17, &s1)); #ifdef TEST_SIZE ((Fs_t*)GetFs(RootDir))->freeSpace = 0; bytes = getfree(RootDir); printf(" %s bytes free\n\n", dotted_num(bytes,17, &s1)); #endif } if(s1) free(s1); } FREE(&RootDir); currentDrive = NULL; } static int enterDrive(Stream_t *Dir, char *drive) { int r; if(currentDrive != NULL && strcmp(currentDrive, drive) == 0) return 0; /* still the same */ leaveDrive(0); currentDrive = drive; r = print_volume_label(Dir, drive); if (r) return r; bytesOnDrive = 0; filesOnDrive = 0; dirsOnDrive = 0; return 0; } static char *emptyString="<out-of-memory>"; static void leaveDirectory(int haveError) { if(!currentDir) return; if (!haveError) { if(dirPath && dirPath != emptyString) free(dirPath); if(wide) putchar('\n'); if(!concise) printSummary(filesInDir, bytesInDir); } FREE(¤tDir); } static int enterDirectory(Stream_t *Dir) { int r; char *drive; char *slash; if(currentDir == Dir) return 0; /* still the same directory */ leaveDirectory(0); drive = getDrive(Dir); r=enterDrive(Dir, drive); if(r) return r; currentDir = COPY(Dir); dirPath = getPwd(getDirentry(Dir)); if(!dirPath) dirPath=emptyString; if(concise && (slash = strrchr(dirPath, '/')) != NULL && slash[1] == '\0') *slash = '\0'; /* print directory title */ if(!concise) printf("\nDirectory for %s\n", dirPath); if(!wide && !concise) printf("\n"); dirsOnDrive++; bytesInDir = 0; filesInDir = 0; return 0; } static int list_file(direntry_t *entry, MainParam_t *mp) { unsigned long size; int i; int Case; int r; if(!all && (entry->dir.attr & 0x6)) return 0; if(concise && isSpecial(entry->name)) return 0; r=enterDirectory(entry->Dir); if (r) return ERROR_ONE; if (wide) { if(filesInDir % 5) putchar(' '); else putchar('\n'); } if(IS_DIR(entry)){ size = 0; } else size = FILE_SIZE(&entry->dir); Case = entry->dir.Case; if(!(Case & (BASECASE | EXTCASE)) && mtools_ignore_short_case) Case |= BASECASE | EXTCASE; if(Case & EXTCASE){ for(i=0; i<3;i++) entry->dir.ext[i] = tolower(entry->dir.ext[i]); } to_unix(entry->dir.ext,3); if(Case & BASECASE){ for(i=0; i<8;i++) entry->dir.name[i] = tolower(entry->dir.name[i]); } to_unix(entry->dir.name,8); if(wide){ if(IS_DIR(entry)) printf("[%s]%*s", shortname, (int) (15 - 2 - strlen(shortname)), ""); else printf("%-15s", shortname); } else if(!concise) { /* is a subdirectory */ if(mtools_dotted_dir) printf("%-13s", shortname); else printf("%-8.8s %-3.3s ", entry->dir.name, entry->dir.ext); if(IS_DIR(entry)) printf("<DIR> "); else printf(" %8ld", (long) size); printf(" "); print_date(&entry->dir); printf(" "); print_time(&entry->dir); if(debug) printf(" %s %d ", entry->dir.name, START(&entry->dir)); if(*longname) printf(" %s", longname); printf("\n"); } else { printf("%s/%s", dirPath, entry->name); if(IS_DIR(entry)) putchar('/'); putchar('\n'); } filesOnDrive++; filesInDir++; bytesOnDrive += (mt_size_t) size; bytesInDir += (mt_size_t) size; return GOjF��lF��mF��nF��oF����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������T_ONE; } static int list_non_recurs_directory(direntry_t *entry, MainParam_t *mp) { int r; /* list top-level directory * If this was matched by wildcard in the basename, list it as * file, otherwise, list it as directory */ if (mp->basenameHasWildcard) { /* wildcard, list it as file */ return list_file(entry, mp); } else { /* no wildcard, list it as directory */ MainParam_t subMp; r=enterDirectory(mp->File); if(r) return ERROR_ONE; subMp = *mp; subMp.dirCallback = subMp.callback; return mp->loop(mp->File, &subMp, "*") | GOT_ONE; } } static int list_recurs_directory(direntry_t *entry, MainParam_t *mp) { MainParam_t subMp; int ret; /* first list the files */ subMp = *mp; subMp.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN; subMp.dirCallback = list_file; subMp.callback = list_file; ret = mp->loop(mp->File, &subMp, "*"); /* then list subdirectories */ subMp = *mp; subMp.lookupflags = ACCEPT_DIR | NO_DOTS | NO_MSG | DO_OPEN; return ret | mp->loop(mp->File, &subMp, "*"); } #if 0 static int test_directory(direntry_t *entry, MainParam_t *mp) { Stream_t *File=mp->File; Stream_t *Target; char errmsg[80]; if ((Target = SimpleFileOpen(0, 0, "-", O_WRONLY, errmsg, 0, 0, 0))) { copyfile(File, Target); FREE(&Target); } return GOT_ONE; } #endif static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s: [-waXbfds/] msdosdirectory\n", progname); fprintf(stderr, " %s: [-waXbfds/] msdosfile [msdosfiles...]\n", progname); fprintf(stderr, "\t-w Wide listing\n" "\t-a All, including hidden files\n" "\t-b -X Concise listing\n" "\t-f Fast, no free space summary\n" "\t-d Debug mode\n" "\t-s -/ Recursive\n"); exit(1); } void mdir(int argc, char **argv, int type) { int ret; MainParam_t mp; int faked; int c; char *fakedArgv[] = { "." }; concise = 0; recursive = 0; wide = all = 0; /* first argument */ while ((c = getopt(argc, argv, "waXbfds/")) != EOF) { switch(c) { case 'w': wide = 1; break; case 'a': all = 1; break; case 'b': case 'X': concise = 1; /*recursive = 1;*/ break; case 's': case '/': recursive = 1; break; case 'f': fast = 1; break; case 'd': debug = 1; break; #if 0 case 't': /* test mode */ testmode = 1; break; #endif default: usage(); } } /* fake an argument */ faked = 0; if (optind == argc) { argv = fakedArgv; argc = 1; optind = 0; } init_mp(&mp); currentDrive = '\0'; currentDir = 0; RootDir = 0; dirPath = 0; #if 0 if (testmode) { mp.lookupflags = ACCEPT_DIR | NO_DOTS; mp.dirCallback = test_directory; } else #endif if(recursive) { mp.lookupflags = ACCEPT_DIR | DO_OPEN_DIRS | NO_DOTS; mp.dirCallback = list_recurs_directory; } else { mp.lookupflags = ACCEPT_DIR | ACCEPT_PLAIN | DO_OPEN_DIRS; mp.dirCallback = list_non_recurs_directory; mp.callback = list_file; } mp.longname = longname; mp.shortname = shortname; ret=main_loop(&mp, argv + optind, argc - optind); leaveDirectory(ret); leaveDrive(ret); exit(ret); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Test program for doctoring the fat */ /* * mcopy.c * Copy an MSDOS files to and from Unix * */ #define LOWERCASE #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "mainloop.h" #include "plain_io.h" #include "nameclash.h" #include "file.h" #include "fs.h" #include "fsP.h" typedef struct Arg_t { char *target; MainParam_t mp; ClashHandling_t ch; Stream_t *sourcefile; unsigned long fat; int markbad; int setsize; unsigned long size; Fs_t *Fs; } Arg_t; static int dos_doctorfat(direntry_t *entry, MainParam_t *mp) { Fs_t *Fs = getFs(mp->File); Arg_t *arg=(Arg_t *) mp->arg; if(!arg->markbad && entry->entry != -3) { /* if not root directory, change it */ set_word(entry->dir.start, arg->fat & 0xffff); set_word(entry->dir.startHi, arg->fat >> 16); if(arg->setsize) set_dword(entry->dir.size, arg->size); dir_write(entry); } arg->Fs = Fs; return GOT_ONE; } static int unix_doctorfat(MainParam_t *mp) { fprintf(stderr,"File does not reside on a Dos fs\n"); return ERROR_ONE; } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-b] [-o offset] [-s size] file fat\n", progname); exit(1); } void mdoctorfat(int argc, char **argv, int mtype) { Arg_t arg; int c, ret; long address, begin, end; char *number, *eptr; int i, j; long offset; /* get command line options */ init_clash_handling(& arg.ch); offset = 0; arg.markbad = 0; arg.setsize = 0; /* get command line options */ while ((c = getopt(argc, argv, "bo:s:")) != EOF) { switch (c) { case 'b': arg.markbad = 1; break; case 'o': offset = strtoul(optarg,0,0); break; case 's': arg.setsize=1; arg.size = strtoul(optarg,0,0); break; case '?': usage(); break; } } if (argc - optind < 2) usage(); /* only 1 file to copy... */ init_mp(&arg.mp); arg.mp.arg = (void *) &arg; arg.mp.callback = dos_doctorfat; arg.mp.unixcallback = unix_doctorfat; arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN; arg.mp.openflags = O_RDWR; arg.fat = strtoul(argv[optind+1], 0, 0) + offset; ret=main_loop(&arg.mp, argv + optind, 1); if(ret) exit(ret); address = 0; for(i=optind+1; i < argc; i++) { number = argv[i]; if (*number == '<') { number++; } begin = strtoul(number, &eptr, 0); if (eptr && *eptr == '-') { number = eptr+1; end = strtoul(number, &eptr, 0); } else { end = begin; } if (eptr == number) { fprintf(stderr, "Not a number: %s\n", number); exit(-1); } if (eptr && *eptr == '>') { eptr++; } if (eptr && *eptr) { fprintf(stderr, "Not a number: %s\n", eptr); exit(-1); } for (j=begin; j <= end; j++) { if(arg.markbad) { arg.Fs->fat_encode(arg.Fs, j+offset, arg.Fs->last_fat ^ 6 ^ 8); } else { if(address) { arg.Fs->fat_encode(arg.Fs, address, j+offset); } address = j+offset; } } } if (address && !arg.markbad) { arg.Fs->fat_encode(arg.Fs, address, arg.Fs->end_fat); } exit(ret); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mdu.c: * Display the space occupied by an MSDOS directory */ #include "sysincludes.h" #include "msdos.h" #include "vfat.h" #include "mtools.h" #include "file.h" #include "mainloop.h" #include "fs.h" #include "codepage.h" typedef struct Arg_t { int all; int inDir; int summary; struct Arg_t *parent; char *target; char *path; unsigned int blocks; MainParam_t mp; } Arg_t; static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-as] msdosdirectory\n" "\t-a All (also show individual files)\n" "\t-s Summary for directory only\n", progname); exit(1); } static int file_mdu(direntry_t *entry, MainParam_t *mp) { unsigned int blocks; Arg_t * arg = (Arg_t *) (mp->arg); blocks = countBlocks(entry->Dir,getStart(entry->Dir, &entry->dir)); if(arg->all || !arg->inDir) { printf("%-7d ", blocks); fprintPwd(stdout, entry,0); fputc('\n', stdout); } arg->blocks += blocks; return GOT_ONE; } static int dir_mdu(direntry_t *entry, MainParam_t *mp) { Arg_t *parentArg = (Arg_t *) (mp->arg); Arg_t arg; int ret; arg = *parentArg; arg.mp.arg = (void *) &arg; arg.parent = parentArg; arg.inDir = 1; /* account for the space occupied by the directory itself */ if(!isRootDir(entry->Dir)) { arg.blocks = countBlocks(entry->Dir, getStart(entry->Dir, &entry->dir)); } else { arg.blocks = 0; } /* recursion */ ret = mp->loop(mp->File, &arg.mp, "*"); if(!arg.summary || !parentArg->inDir) { printf("%-7d ", arg.blocks); fprintPwd(stdout, entry,0); fputc('\n', stdout); } arg.parent->blocks += arg.blocks; return ret; } void mdu(int argc, char **argv, int type) { Arg_t arg; int c; arg.all = 0; arg.inDir = 0; arg.summary = 0; while ((c = getopt(argc, argv, "as")) != EOF) { switch (c) { case 'a': arg.all = 1; break; case 's': arg.summary = 1; break; case '?': usage(); } } if (optind >= argc) usage(); if(arg.summary && arg.all) { fprintf(stderr,"-a and -s options are mutually exclusive\n"); usage(); } init_mp(&arg.mp); arg.mp.callback = file_mdu; arg.mp.openflags = O_RDONLY; arg.mp.dirCallback = dir_mdu; arg.mp.arg = (void *) &arg; arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN_DIRS | NO_DOTS; exit(main_loop(&arg.mp, argv + optind, argc - optind)); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mformat.c */ #define DONT_NEED_WAIT #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "mainloop.h" #include "fsP.h" #include "file.h" #include "plain_io.h" #include "floppyd_io.h" #include "nameclash.h" #include "buffer.h" #ifdef USE_XDF #include "xdf_io.h" #endif #include "partition.h" #ifndef abs #define abs(x) ((x)>0?(x):-(x)) #endif #ifdef OS_linux #include "linux/hdreg.h" #define _LINUX_STRING_H_ #define kdev_t int #include "linux/fs.h" #undef _LINUX_STRING_H_ #endif extern int errno; static int init_geometry_boot(struct bootsector *boot, struct device *dev, int sectors0, int rate_0, int rate_any, int *tot_sectors, int keepBoot) { int i; int nb_renum; int sector2; int size2; int j; int sum; set_word(boot->nsect, dev->sectors); set_word(boot->nheads, dev->heads); *tot_sectors = dev->heads * dev->sectors * dev->tracks - DWORD(nhs); if (*tot_sectors < 0x10000){ set_word(boot->psect, *tot_sectors); set_dword(boot->bigsect, 0); } else { set_word(boot->psect, 0); set_dword(boot->bigsect, *tot_sectors); } if (dev->use_2m & 0x7f){ int bootOffset; strncpy(boot->banner, "2M-STV04", 8); boot->ext.old.res_2m = 0; boot->ext.old.fmt_2mf = 6; if ( dev->sectors % ( ((1 << dev->ssize) + 3) >> 2 )) boot->ext.old.wt = 1; else boot->ext.old.wt = 0; boot->ext.old.rate_0= rate_0; boot->ext.old.rate_any= rate_any; if (boot->ext.old.rate_any== 2 ) boot->ext.old.rate_any= 1; i=76; /* Infp0 */ set_word(boot->ext.old.Infp0, i); boot->jump[i++] = sectors0; boot->jump[i++] = 108; for(j=1; j<= sectors0; j++) boot->jump[i++] = j; set_word(boot->ext.old.InfpX, i); boot->jump[i++] = 64; boot->jump[i++] = 3; nb_renum = i++; sector2 = dev->sectors; size2 = dev->ssize; j=1; while( sector2 ){ while ( sector2 < (1 << size2) >> 2 ) size2--; boot->jump[i++] = 128 + j; boot->jump[i++] = j++; boot->jump[i++] = size2; sector2 -= (1 << size2) >> 2; } boot->jump[nb_renum] = ( i - nb_renum - 1 ) / 3; set_word(boot->ext.old.InfTm, i); sector2 = dev->sectors; size2= dev->ssize; while(sector2){ while ( sector2 < 1 << ( size2 - 2) ) size2--; boot->jump[i++] = size2; sector2 -= 1 << (size2 - 2 ); } set_word(boot->ext.old.BootP,i); bootOffset = i; /* checksum */ for (sum=0, j=64; j<i; j++) sum += boot->jump[j];/* checksum */ boot->ext.old.CheckSum=-sum; return bootOffset; } else { if(!keepBoot) { boot->jump[0] = 0xeb; boot->jump[1] = 0; boot->jump[2] = 0x90; strncpy(boot->banner, "MTOOL397", 8); /* It looks like some versions of DOS are * rather picky about this, and assume default * parameters without this, ignoring any * indication about cluster size et al. */ } return 0; } } static int comp_fat_bits(Fs_t *Fs, int estimate, unsigned int tot_sectors, int fat32) { int needed_fat_bits; needed_fat_bits = 12; #define MAX_DISK_SIZE(bits,clusters) \ TOTAL_DISK_SIZE((bits), Fs->sector_size, (clusters), \ Fs->num_fat, MAX_SECT_PER_CLUSTER) if(tot_sectors > MAX_DISK_SIZE(12, FAT12)) needed_fat_bits = 16; if(fat32 || tot_sectors > MAX_DISK_SIZE(16, FAT16)) needed_fat_bits = 32; #undef MAX_DISK_SIZE if(abs(estimate) && abs(estimate) < needed_fat_bits) { if(fat32) { fprintf(stderr, "Contradiction between FAT size on command line and FAT size in conf file\n"); exit(1); } fprintf(stderr, "Device too big for a %d bit FAT\n", estimate); exit(1); } if(needed_fat_bits == 32 && !fat32 && abs(estimate) !=32){ fprintf(stderr,"Warning: Using 32 bit FAT. Drive will only be accessibly by Win95 OEM / Win98\n"); } if(!estimate) { int min_fat16_size; if(needed_fat_bits > 12) return needed_fat_bits; min_fat16_size = DISK_SIZE(16, Fs->sector_size, FAT12+1, Fs->num_fat, 1); if(tot_sectors < min_fat16_size) return 12; else if(tot_sectors >= 2* min_fat16_size) return 16; /* heuristics */ } return estimate; } static void calc_fat_bits2(Fs_t *Fs, unsigned int tot_sectors, int fat_bits) { unsigned int rem_sect; /* * the "remaining sectors" after directory and boot * hasve been accounted for. */ rem_sect = tot_sectors - Fs->dir_len - Fs->fat_start; switch(abs(fat_bits)) { case 0: #define MY_DISK_SIZE(bits,clusters) \ DISK_SIZE( (bits), Fs->sector_size, (clusters), \ Fs->num_fat, Fs->cluster_size) if(rem_sect >= MY_DISK_SIZE(16, FAT12 + 1)) /* big enough for FAT16 */ set_fat16(Fs); else if(rem_sect <= MY_DISK_SIZE(12, FAT12)) /* small enough for FAT12 */ set_fat12(Fs); else { /* "between two chairs", * augment cluster size, and * settle it */ if(Fs->cluster_size < MAX_SECT_PER_CLUSTER) Fs->cluster_size <<= 1; set_fat12(Fs); } break; #undef MY_DISK_SIZE case 12: set_fat12(Fs); break; case 16: set_fat16(Fs); break; case 32: set_fat32(Fs); break; } } static inline void format_root(Fs_t *Fs, char *label, struct bootsector *boot) { Stream_t *RootDir; char *buf; int i; struct ClashHandling_t ch; int dirlen; init_clash_handling(&ch); ch.name_converter = label_name; ch.ignore_entry = -2; buf = safe_malloc(Fs->sector_size); RootDir = OpenRoot((Stream_t *)Fs); if(!RootDir){ fprintf(stderr,"Could not open root directory\n"); exit(1); } memset(buf, '\0', Fs->sector_size); if(Fs->fat_bits == 32) { /* on a FAT32 system, we only write one sector, * as the directory can be extended at will...*/ dirlen = 1; fatAllocate(Fs, Fs->rootCluster, Fs->end_fat); } else dirlen = Fs->dir_len; for (i = 0; i < dirlen; i++) WRITES(RootDir, buf, sectorsToBytes((Stream_t*)Fs, i), Fs->sector_size); ch.ignore_entry = 1; if(label[0]) mwrite_one(RootDir,label, 0, labelit, NULL,&ch); FREE(&RootDir); if(Fs->fat_bits == 32) set_word(boot->dirents, 0); else set_word(boot->dirents, Fs->dir_len * (Fs->sector_size / 32)); free(buf); } static void xdf_calc_fat_size(Fs_t *Fs, unsigned int tot_sectors, int fat_bits) { unsigned int rem_sect; rem_sect = tot_sectors - Fs->dir_len - Fs->fat_start - 2 * Fs->fat_len; if(Fs->fat_len) { /* an XDF disk, we know the fat_size and have to find * out the rest. We start with a cluster size of 1 and * keep doubling until everything fits into the * FAT. This will occur eventually, as our FAT has a * minimal size of 1 */ for(Fs->cluster_size = 1; 1 ; Fs->cluster_size <<= 1) { Fs->num_clus = rem_sect / Fs->cluster_size; if(abs(fat_bits) == 16 || Fs->num_clus > FAT12) set_fat16(Fs); else set_fat12(Fs); if (Fs->fat_len >= NEEDED_FAT_SIZE(Fs)) return; } } fprintf(stderr,"Internal error while calculating Xdf fat size\n"); exit(1); } static void calc_fat_size(Fs_t *Fs, unsigned int tot_sectors) { unsigned int rem_sect; int tries; int occupied; tries=0; /* rough estimate of fat size */ Fs->fat_len = 1; rem_sect = tot_sectors - Fs->dir_len - Fs->fat_start; while(1){ Fs->num_clus = (rem_sect - 2 * Fs->fat_len ) /Fs->cluster_size; Fs->fat_len = NEEDED_FAT_SIZE(Fs); occupied = 2 * Fs->fat_len + Fs->cluster_size * Fs->num_clus; /* if we have used up more than we have, * we'll have to reloop */ if ( occupied > rem_sect ) continue; /* if we have exactly used up all * sectors, fine */ if ( rem_sect - occupied < Fs->cluster_size ) break; /* if we have not used up all our * sectors, try again. After the second * try, decrease the amount of available * space. This is to deal with the case of * 344 or 345, ..., 1705, ... available * sectors. */ switch(tries++){ default: /* this should never happen */ fprintf(stderr, "Internal error in cluster/fat repartition" " calculation.\n"); exit(1); case 2: /* FALLTHROUGH */ case 1: rem_sect-= Fs->cluster_size; Fs->dir_len += Fs->cluster_size; case 0: continue; } } if ( Fs->num_clus > FAT12 && Fs->fat_bits == 12 ){ fprintf(stderr,"Too many clusters for this fat size." " Please choose a 16-bit fat in your /etc/mtools" " or .m~F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��F��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������toolsrc file\n"); exit(1); } if ( Fs->num_clus <= FAT12 && Fs->fat_bits > 12 ){ fprintf(stderr,"Too few clusters for this fat size." " Please choose a 12-bit fat in your /etc/mtools" " or .mtoolsrc file\n"); exit(1); } } static unsigned char bootprog[]= {0xfa, 0x31, 0xc0, 0x8e, 0xd8, 0x8e, 0xc0, 0xfc, 0xb9, 0x00, 0x01, 0xbe, 0x00, 0x7c, 0xbf, 0x00, 0x80, 0xf3, 0xa5, 0xea, 0x00, 0x00, 0x00, 0x08, 0xb8, 0x01, 0x02, 0xbb, 0x00, 0x7c, 0xba, 0x80, 0x00, 0xb9, 0x01, 0x00, 0xcd, 0x13, 0x72, 0x05, 0xea, 0x00, 0x7c, 0x00, 0x00, 0xcd, 0x19}; static inline void inst_boot_prg(struct bootsector *boot, int offset) { memcpy((char *) boot->jump + offset, (char *) bootprog, sizeof(bootprog) /sizeof(bootprog[0])); boot->jump[0] = 0xeb; boot->jump[1] = offset - 1; boot->jump[2] = 0x90; set_word(boot->jump + offset + 20, offset + 24); } static void calc_cluster_size(struct Fs_t *Fs, unsigned int tot_sectors, int fat_bits) { unsigned int max_clusters; /* maximal possible number of sectors for * this FAT entry length (12/16/32) */ unsigned int max_fat_size; /* maximal size of the FAT for this FAT * entry length (12/16/32) */ unsigned int rem_sect; /* remaining sectors after we accounted for * the root directory and boot sector(s) */ switch(abs(fat_bits)) { case 12: max_clusters = FAT12; max_fat_size = Fs->num_fat * FAT_SIZE(12, Fs->sector_size, max_clusters); break; case 16: case 0: /* still hesititating between 12 and 16 */ max_clusters = FAT16; max_fat_size = Fs->num_fat * FAT_SIZE(16, Fs->sector_size, max_clusters); break; case 32: Fs->cluster_size = 8; /* According to * http://www.microsoft.com/kb/articles/q154/9/97.htm, * Micro$oft does not support FAT32 with less than 4K */ return; default: fprintf(stderr,"Bad fat size\n"); exit(1); } rem_sect = tot_sectors - Fs->dir_len - Fs->fat_start; /* double the cluster size until we can fill up the disk with * the maximal number of sectors of this size */ while(Fs->cluster_size * max_clusters + max_fat_size < rem_sect) { if(Fs->cluster_size > 64) { /* bigger than 64. Should fit */ fprintf(stderr, "Internal error while calculating cluster size\n"); exit(1); } Fs->cluster_size <<= 1; } } struct OldDos_t old_dos[]={ { 40, 9, 1, 4, 1, 2, 0xfc }, { 40, 9, 2, 7, 2, 2, 0xfd }, { 40, 8, 1, 4, 1, 1, 0xfe }, { 40, 8, 2, 7, 2, 1, 0xff }, { 80, 9, 2, 7, 2, 3, 0xf9 }, { 80, 15, 2,14, 1, 7, 0xf9 }, { 80, 18, 2,14, 1, 9, 0xf0 }, { 80, 36, 2,15, 2, 9, 0xf0 }, { 1, 8, 1, 1, 1, 1, 0xf0 }, }; static int old_dos_size_to_geom(int size, int *cyls, int *heads, int *sects) { int i; size = size * 2; for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){ if (old_dos[i].sectors * old_dos[i].tracks * old_dos[i].heads == size) { *cyls = old_dos[i].tracks; *heads = old_dos[i].heads; *sects = old_dos[i].sectors; return 0; } } return 1; } static void calc_fs_parameters(struct device *dev, unsigned int tot_sectors, struct Fs_t *Fs, struct bootsector *boot) { int i; for(i=0; i < sizeof(old_dos) / sizeof(old_dos[0]); i++){ if (dev->sectors == old_dos[i].sectors && dev->tracks == old_dos[i].tracks && dev->heads == old_dos[i].heads && (dev->fat_bits == 0 || abs(dev->fat_bits) == 12)){ boot->descr = old_dos[i].media; Fs->cluster_size = old_dos[i].cluster_size; Fs->dir_len = old_dos[i].dir_len; Fs->fat_len = old_dos[i].fat_len; Fs->fat_bits = 12; break; } } if (i == sizeof(old_dos) / sizeof(old_dos[0]) ){ /* a non-standard format */ if(DWORD(nhs)) boot->descr = 0xf8; else boot->descr = 0xf0; if(!Fs->cluster_size) { if (dev->heads == 1) Fs->cluster_size = 1; else { Fs->cluster_size = (tot_sectors > 2000 ) ? 1:2; if (dev->use_2m & 0x7f) Fs->cluster_size = 1; } } if(!Fs->dir_len) { if (dev->heads == 1) Fs->dir_len = 4; else Fs->dir_len = (tot_sectors > 2000) ? 11 : 7; } calc_cluster_size(Fs, tot_sectors, dev->fat_bits); if(Fs->fat_len) xdf_calc_fat_size(Fs, tot_sectors, dev->fat_bits); else { calc_fat_bits2(Fs, tot_sectors, dev->fat_bits); calc_fat_size(Fs, tot_sectors); } } set_word(boot->fatlen, Fs->fat_len); } static void calc_fs_parameters_32(unsigned int tot_sectors, struct Fs_t *Fs, struct bootsector *boot) { if(DWORD(nhs)) boot->descr = 0xf8; else boot->descr = 0xf0; if(!Fs->cluster_size) /* According to * http://www.microsoft.com/kb/articles/q154/9/97.htm, * Micro$oft does not support FAT32 with less than 4K */ Fs->cluster_size = 8; Fs->dir_len = 0; Fs->num_clus = tot_sectors / Fs->cluster_size; set_fat32(Fs); calc_fat_size(Fs, tot_sectors); set_word(boot->fatlen, 0); set_dword(boot->ext.fat32.bigFat, Fs->fat_len); } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-t tracks] [-h heads] [-n sectors] " "[-v label] [-1] [-4] [-8] [-f size] " "[-N serialnumber] " "[-k] [-B bootsector] [-r root_dir_len] [-L fat_len] " "[-F] [-I fsVersion] [-C] [-c cluster_size] " "[-H hidden_sectors] " #ifdef USE_XDF "[-X] " #endif "[-S hardsectorsize] [-M softsectorsize] [-3] " "[-2 track0sectors] [-0 rate0] [-A rateany] [-a]" "device\n", progname); exit(1); } void mformat(int argc, char **argv, int dummy) { int r; /* generic return value */ Fs_t Fs; int hs, hs_set; int arguse_2m = 0; int sectors0=18; /* number of sectors on track 0 */ int create = 0; int rate_0, rate_any; int mangled; int argssize=0; /* sector size */ int msize=0; int fat32 = 0; struct label_blk_t *labelBlock; int bootOffset; #ifdef USE_XDF int i; int format_xdf = 0; struct xdf_info info; #endif struct bootsector *boot; char *bootSector=0; int c; int keepBoot = 0; struct device used_dev; int argtracks, argheads, argsectors; int tot_sectors; int blocksize; char *drive, name[EXPAND_BUF]; char label[VBUFSIZE], buf[MAX_SECTOR], shortlabel[13]; struct device *dev; char errmsg[200]; unsigned long serial; int serial_set; int fsVersion; mt_off_t maxSize; int Atari = 0; /* should we add an Atari-style serial number ? */ #ifdef OS_Minix char *devname; struct device onedevice[2]; struct stat stbuf; #endif hs = hs_set = 0; argtracks = 0; argheads = 0; argsectors = 0; arguse_2m = 0; argssize = 0x2; label[0] = '\0'; serial_set = 0; serial = 0; fsVersion = 0; Fs.cluster_size = 0; Fs.refs = 1; Fs.dir_len = 0; Fs.fat_len = 0; Fs.Class = &FsClass; rate_0 = mtools_rate_0; rate_any = mtools_rate_any; /* get command line options */ while ((c = getopt(argc,argv, "148f:t:n:v:qub" "kB:r:L:IFCc:Xh:s:l:N:H:M:S:230:Aa"))!= EOF) { switch (c) { /* standard DOS flags */ case '1': argheads = 1; break; case '4': argsectors = 9; argtracks = 40; break; case '8': argsectors = 8; argtracks = 40; break; case 'f': r=old_dos_size_to_geom(atoi(optarg), &argtracks, &argheads, &argsectors); if(r) { fprintf(stderr, "Bad size %s\n", optarg); exit(1); } break; case 't': argtracks = atoi(optarg); break; case 'n': /*non-standard*/ case 's': argsectors = atoi(optarg); break; case 'l': /* non-standard */ case 'v': strncpy(label, optarg, VBUFSIZE-1); label[VBUFSIZE-1] = '\0'; break; /* flags supported by Dos but not mtools */ case 'q': case 'u': case 'b': /*case 's': leave this for compatibility */ fprintf(stderr, "Flag %c not supported by mtools\n",c); exit(1); /* flags added by mtools */ case 'F': fat32 = 1; break; case 'S': argssize = atoi(optarg) | 0x80; if(argssize < 0x81) usage(); break; #ifdef USE_XDF case 'X': format_xdf = 1; break; #endif case '2': arguse_2m = 0xff; sectors0 = atoi(optarg); break; case '3': arguse_2m = 0x80; break; case '0': /* rate on track 0 */ rate_0 = atoi(optarg); break; case 'A': /* rate on other tracks */ rate_any = atoi(optarg); break; case 'M': msize = atoi(optarg); if (msize % 256 || msize > 8192 ) usage(); break; case 'N': serial = strtoul(optarg,0,16); serial_set = 1; break; case 'a': /* Atari style serial number */ Atari = 1; break; case 'C': create = O_CREAT; break; case 'H': hs = atoi(optarg); hs_set = 1; break; case 'I': fsVersion = strtoul(optarg,0,0); break; case 'c': Fs.cluster_size = atoi(optarg); break; case 'r': Fs.dir_len = strtoul(optarg,0,0); break; case 'L': Fs.fat_len = strtoul(optarg,0,0); break; case 'B': bootSector = optarg; break; case 'k': keepBoot = 1; break; case 'h': argheads = atoi(optarg); break; default: usage(); } } if (argc - optind != 1 || skip_drive(argv[optind]) == argv[optind]) usage(); #ifdef USE_XDF if(create && format_xdf) { fprintf(stderr,"Create and XDF can't be used together\n"); exit(1); } #endif drive = get_drive(argv[argc -1], NULL); #ifdef OS_Minix devname = safe_malloc((9 + strlen(drive)) * sizeof(devname[0])); strcpy(devname, "/dev/dosX"); if (isupper(drive[0]) && drive[1] == 0) { /* single letter device name, use /dev/dos$drive */ devname[8]= drive[0]; } else if (strchr(drive, '/') == NULL) { /* a simple name, use /dev/$drive */ strcpy(devname+5, drive); } else { /* a pathname, use as is. */ strcpy(devname, drive); } if (stat(devname, &stbuf) != -1) { memset(onedevice, 0, sizeof(onedevice)); onedevice[0].name = devname; onedevice[0].drive = drive; onedevice[1].name = NULL; onedevice[1].drive = NULL; dev = onedevice; } else { dev = devices; } #else dev = devices; #endif /* check out a drive whose letter and parameters match */ sprintf(errmsg, "Drive '%s:' not supported", drive); Fs.Direct = NULL; blocksize = 0; for(;dev->drive;dev++) { FREE(&(Fs.Direct)); /* drive name */ if (strcmp(dev->drive, drive) != 0) continue; used_dev = *dev; SET_INT(used_dev.tracks, argtracks); SET_INT(used_dev.heads, argheads); SET_INT(used_dev.sectors, argsectors); SET_INT(used_dev.use_2m, arguse_2m); SET_INT(used_dev.ssize, argssize); if(hs_set) used_dev.hidden = hs; expand(dev->name, name); #ifdef USING_NEW_VOLD strcpy(name, getVoldName(dev, name)); #endif #ifdef USE_XDF if(!format_xdf) { #endif Fs.Direct = 0; #ifdef USE_FLOPPYD Fs.Direct = FloppydOpen(&used_dev, dev, name, O_RDWR | create, errmsg, 0, 1); if(Fs.Direct) { maxSize = max_off_t_31; } #endif if(!Fs.Direct) { Fs.Direct = SimpleFileOpen(&used_dev, dev, name, O_RDWR | create, errmsg, 0, 1, &maxSize); } #ifdef USE_XDF } else { used_dev.misc_flags |= USE_XDF_FLAG; Fs.Direct = XdfOpen(&used_dev, name, O_RDWR, errmsg, &info); if(Fs.Direct && !Fs.fat_len) Fs.fat_len = info.FatSize; if(Fs.Direct && !Fs.dir_len) Fs.dir_len = info.RootDirSize; } #endif if (!Fs.Direct) continue; #ifdef OS_linux if ((!used_dev.tracks || !used_dev.heads || !used_dev.sectors) && (!IS_SCSI(dev))) { int fd= get_fd(Fs.Direct); struct stat buf; if (fstat(fd, &buf) < 0) { sprintf(errmsg, "Could not stat file (%s)", strerror(errno)); continue; } if (S_ISBLK(buf.st_mode)) { struct hd_geometry geom; long size; int sect_per_track; if (ioctl(fd, HDIO_GETGEO, &geom) < 0) { sprintf(errmsg, "Could not get geometry of device (%s)", strerror(errno)); continue; } if (ioctl(fd, BLKGETSIZE, &size) < 0) { sprintf(errmsg, "Could not get size of device (%s)", strerror(errno)); continue; } sect_per_track = geom.heads * geom.sectors; used_dev.heads = geom.heads; used_dev.sectors = geom.sectors; used_dev.hidden = geom.start % sect_per_track; used_dev.tracks = (size + used_dev.hidden) / sect_per_track; } } #endif /* no way to find out geometry */ if (!used_dev.tracks || !used_dev.heads || !used_dev.sectors){ sprintf(errmsg, "Unknown geometry " "(You must tell the complete geometry " "of the disk, \neither in /etc/mtools.conf or " "on the command line) "); continue; } #if 0 /* set parameters, if needed */ if(SET_GEOM(Fs.Direct, &used_dev, 0xf0, boot)){ sprintf(errmsg,"Can't set disk parameters: %s", strerror(errno)); continue; } #endif Fs.sector_size = 512; if( !(used_dev.use_2m & 0x7f)) { Fs.sector_size = 128 << (used_dev.ssize & 0x7f); } SET_INT(Fs.sector_size, msize); { int i; for(i = 0; i < 31; i++) { if (Fs.sector_size == 1 << i) { Fs.sectorShift = i; break; } } Fs.sectorMask = Fs.sector_size - 1; } if(!used_dev.blocksize || used_dev.blocksize < Fs.sector_size) blocksize = Fs.sector_size; else blocksize = used_dev.blocksize; if(blocksize > MAX_SECTOR) blocksize = MAX_SECTOR; /* do a "test" read */ if (!create && READS(Fs.Direct, (char *) buf, 0, Fs.sector_size) != Fs.sector_size) { sprintf(errmsg, "Error reading from '%s', wrong parameters?", name); continue; } break; } /* print error msg if needed */ if ( dev->drive == 0 ){ FREE(&Fs.Direct); fprintf(stderr,"%s: %s\n", argv[0],errmsg); exit(1); } /* the boot sector */ boot = (struct bootsector *) buf; if(bootSector) { int fd; fd = open(bootSector, O_RDONLY); if(fd < 0) { perror("open boot sector"); exit(1); } read(fd, buf, blocksize); keepBoot = 1; } if(!keepBoot) { memset((char *)boot, '\0', Fs.sector_size); if(Fs.sector_size == 512 && !used_dev.partition) { /* install fake partition table pointing to itself */ struct partition *partTable=(struct partition *) (((char*) boot) + 0x1ae); setBeginEnd(&partTable[1], 0, used_dev.heads * used_dev.sectors * used_dev.tracks, used_dev.heads, used_dev.sectors, 1, 0); } } set_dword(boot->nhs, used_dev.hidden); Fs.Next = buf_init(Fs.Direct, blocksize * used_dev.heads * used_dev.sectors, blocksize * used_dev.heads * used_dev.sectors, blocksize); Fs.Buffer = 0; boot->nfat = Fs.num_fat = 2; if(!keepBoot) set_word(boot->jump + 510, 0xaa55); /* get the parameters */ tot_sectors = used_dev.tracks * used_dev.heads * used_dev.sectors - DWORD(nhs); set_word(boot->nsect, dev->sectors); set_word(boot->nheads, dev->heads); dev->fat_bits = comp_fat_bits(&Fs,dev->fat_bits, tot_sectors, fat32); if(dev->fat_bits == 32) { Fs.primaryFat = 0; Fs.writeAllFats = 1; Fs.fat_start = 32; calc_fs_parameters_32(tot_sectors, &Fs, boot); Fs.clus_start = Fs.num_fat * Fs.fat_len + Fs.fat_start; /* extension flags: mirror fats, and use #0 as primary */ set_word(boot->ext.fat32.extFlags,0); /* fs version. What should go here? */ set_word(boot->ext.fat32.fsVersion,fsVersion); /* root directory */ set_dword(boot->ext.fat32.rootCluster, Fs.rootCluster = 2); /* info sector */ set_word(boot->ext.fat32.infoSector, Fs.infoSectorLoc = 1); Fs.infoSectorLoc = 1; /* no backup boot sector */ set_word(boot->ext.fat32.backupBoot, 6); labelBlock = & boot->ext.fat32.labelBlock; } else { Fs.infoSectorLoc = 0; Fs.fat_start = 1; calc_fs_parameters(&used_dev, tot_sectors, &Fs, boot); Fs.dir_start = Fs.num_fat * Fs.fat_len + Fs.fat_start; Fs.clus_start = Fs.dir_start + Fs.dir_len; labelBlock = & boot->ext.old.labelBlock; } if (!keepBoot) /* only zero out physdrive if we don't have a template * bootsector */ labelBlock->physdrive = 0x00; labelBlock->reserved = 0; labelBlock->dos4 = 0x29; if (!serial_set || Atari) srandom((long)time (0)); if (!serial_set) serial=random(); set_dword(labelBlock->serial, serial); if(!label[0]) strncpy(shortlabel, "NO NAME ",11); else label_name(label, 0, &mangled, shortlabel); strncpy(labelBlock->label, shortlabel, 11); sprintf(labelBlock->fat_type, "FAT%2.2d ", Fs.fat_bits); labelBlock->fat_type[7] = ' '; set_word(boot->secsiz, Fs.sector_size); boot->clsiz = (unsigned char) Fs.cluster_size; set_word(boot->nrsvsect, Fs.fat_start); bootOffset = init_geometry_boot(boot, &used_dev, sectors0, rate_0, rate_any, &tot_sectors, keepBoot); if(!bootOffset) { bootOffset = ((char *) labelBlock) - ((char *) boot) + sizeof(struct label_blk_t); } if(Atari) { boot->banner[4] = 0; boot->banner[5] = random(); boot->banner[6] = random(); boot->banner[7] = random(); } if (create) { WRITES(Fs.Direct, (char *) buf, sectorsToBytes((Stream_t*)&Fs, tot_sectors-1), Fs.sector_size); } if(!keepBoot) inst_boot_prg(boot, bootOffset); if(dev->use_2m & 0x7f) Fs.num_fat = 1; Fs.lastFatSectorNr = 0; Fs.lastFatSectorData = 0; zero_fat(&Fs, boot->descr); Fs.freeSpace = Fs.num_clus; Fs.last = 2; #ifdef USE_XDF if(format_xdf) for(i=0; i < (info.BadSectors+Fs.cluster_size-1)/Fs.cluster_size; i++) fatEncode(&Fs, i+2, 0xfff7); #endif format_root(&Fs, label, boot); WRITES((Stream_t *)&Fs, (char *) boot, (mt_off_t) 0, Fs.sector_size); if(Fs.fat_bits == 32 && WORD(ext.fat32.backupBoot) != MAX32) { WRITES((Stream_t *)&Fs, (char *) boot, sectorsToBytes((Stream_t*)&Fs, WORD(ext.fat32.backupBoot)), Fs.sector_size); } FLUSH((Stream_t *)&Fs); /* flushes Fs. * This triggers the writing of the FAT */ FREE(&Fs.Next); Fs.Class->freeFunc((Stream_t *)&Fs); #ifdef USE_XDF if(format_xdf && isatty(0) && !getenv("MTOOLS_USE_XDF")) fprintf(stderr, "Note:\n" "Remember to set the \"MTOOLS_USE_XDF\" environmental\n" "variable before accessing this disk\n\n" "Bourne shell syntax (sh, ash, bash, ksh, zsh etc):\n" " export MTOOLS_USE_XDF=1\n\n" "C shell syntax (csh and tcsh):\n" " setenv MTOOLS_USE_XDF 1\n" ); #endif exit(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mlabel.c * Make an MSDOS volume label */ #include "sysincludes.h" #include "msdos.h" #include "mainloop.h" #include "vfat.h" #include "mtools.h" #include "nameclash.h" static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-v] drive\n\t-v Verbose\n", progname); exit(1); } static void displayInfosector(Stream_t *Stream, struct bootsector *boot) { InfoSector_t *infosec; if(WORD(ext.fat32.infoSector) == MAX32) return; infosec = (InfoSector_t *) safe_malloc(WORD(secsiz)); force_read(Stream, (char *) infosec, (mt_off_t) WORD(secsiz) * WORD(ext.fat32.infoSector), WORD(secsiz)); printf("\nInfosector:\n"); printf("signature=0x%08x\n", _DWORD(infosec->signature1)); if(_DWORD(infosec->count) != MAX32) printf("free clusters=%u\n", _DWORD(infosec->count)); if(_DWORD(infosec->pos) != MAX32) printf("last allocated cluster=%u\n", _DWORD(infosec->pos)); } void minfo(int argc, char **argv, int type) { struct bootsector boot0; #define boot (&boot0) char name[EXPAND_BUF]; int media; int tot_sectors; struct device dev; char *drive; int verbose=0; int c; Stream_t *Stream; struct label_blk_t *labelBlock; while ((c = getopt(argc, argv, "v")) != EOF) { switch (c) { case 'v': verbose = 1; break; default: usage(); } } if(argc == optind) usage(); for(;optind < argc; optind++) { if(skip_drive(argv[optind]) == argv[optind]) usage(); drive = get_drive(argv[optind], NULL); if(! (Stream = find_device(drive, O_RDONLY, &dev, boot, name, &media, 0))) exit(1); tot_sectors = DWORD(bigsect); SET_INT(tot_sectors, WORD(psect)); printf("device information:\n"); printf("===================\n"); printf("filename=\"%s\"\n", name); printf("sectors per track: %d\n", dev.sectors); printf("heads: %d\n", dev.heads); printf("cylinders: %d\n\n", dev.tracks); printf("mformat command line: mformat -t %d -h %d -s %d ", dev.tracks, dev.heads, dev.sectors); if(DWORD(nhs)) printf("-H %d ", DWORD(nhs)); printf("%s:\n", drive); printf("\n"); printf("bootsector information\n"); printf("======================\n"); printf("banner:\"%8s\"\n", boot->banner); printf("sector size: %d bytes\n", WORD(secsiz)); printf("cluster size: %d sectors\n", boot->clsiz); printf("reserved (boot) sectors: %d\n", WORD(nrsvsect)); printf("fats: %d\n", boot->nfat); printf("max available root directory slots: %d\n", WORD(dirents)); printf("small size: %d sectors\n", WORD(psect)); printf("media descriptor byte: 0x%x\n", boot->descr); printf("sectors per fat: %d\n", WORD(fatlen)); printf("sectors per track: %d\n", WORD(nsect)); printf("heads: %d\n", WORD(nheads)); printf("hidden sectors: %d\n", DWORD(nhs)); printf("big size: %d sectors\n", DWORD(bigsect)); if(WORD(fatlen)) { labelBlock = &boot->ext.old.labelBlock; } else { labelBlock = &boot->ext.fat32.labelBlock; } printf("physical drive id: 0x%x\n", labelBlock->physdrive); printf("reserved=0x%x\n", labelBlock->reserved); printf("dos4=0x%x\n", labelBlock->dos4); printf("serial number: %08X\n", _DWORD(labelBlock->serial)); printf("disk label=\"%11.11s\"\n", labelBlock->label); printf("disk type=\"%8.8s\"\n", labelBlock->fat_type); if(!WORD(fatlen)){ printf("Big fatlen=%u\n", DWORD(ext.fat32.bigFat)); printf("Extended flags=0x%04x\n", WORD(ext.fat32.extFlags)); printf("FS version=0x%04x\n", WORD(ext.fat32.fsVersion)); printf("rootCluster=%u\n", DWORD(ext.fat32.rootCluster)); if(WORD(ext.fat32.infoSector) != MAX32) printf("infoSector location=%d\n", WORD(ext.fat32.infoSector)); if(WORD(ext.fat32.backupBoot) != MAX32) printf("backup boot sector=%d\n", WORD(ext.fat32.backupBoot)); displayInfosector(Stream,boot); } if(verbose) { int size; unsigned char *buf; printf("\n"); size = WORD(secsiz); buf = (unsigned char *) malloc(size); if(!buf) { fprintf(stderr, "Out of memory error\n"); exit(1); } size = READS(Stream, buf, (mt_off_t) 0, size); if(size < 0) { perror("read boot sector"); exit(1); } print_sector("Boot sector hexdump", buf, size); } } exit(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Miscellaneous routines. */ #include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "vfat.h" #include "mtools.h" void printOom(void) { fprintf(stderr, "Out of memory error"); } char *get_homedir(void) { struct passwd *pw; uid_t uid; char *homedir; char *username; homedir = getenv ("HOME"); /* * first we call getlogin. * There might be several accounts sharing one uid */ if ( homedir ) return homedir; pw = 0; username = getenv("LOGNAME"); if ( !username ) username = getlogin(); if ( username ) pw = getpwnam( username); if ( pw == 0 ){ /* if we can't getlogin, look up the pwent by uid */ uid = geteuid(); pw = getpwuid(uid); } /* we might still get no entry */ if ( pw ) return pw->pw_dir; return 0; } static void get_mcwd_file_name(char *file) { char *mcwd_path; char *homedir; mcwd_path = getenv("MCWD"); if (mcwd_path == NULL || *mcwd_path == '\0'){ homedir= get_homedir(); if(!homedir) homedir="/tmp"; strncpy(file, homedir, MAXPATHLEN-6); file[MAXPATHLEN-6]='\0'; strcat( file, "/.mcwd"); } else { strncpy(file, mcwd_path, MAXPATHLEN); file[MAXPATHLEN]='\0'; } } void unlink_mcwd() { char file[MAXPATHLEN+1]; get_mcwd_file_name(file); unlink(file); } FILE *open_mcwd(const char *mode) { struct stat sbuf; char file[MAXPATHLEN+1]; time_t now; get_mcwd_file_name(file); if (*mode == 'r'){ if (stat(file, &sbuf) < 0) return NULL; /* * Ignore the info, if the file is more than 6 hours old */ getTimeNow(&now); if (now - sbuf.st_mtime > 6 * 60 * 60) { fprintf(stderr, "Warning: \"%s\" is out of date, removing it\n", file); unlink(file); return NULL; } } return fopen(file, mode); } /* Fix the info in the MCWD file to be a proper directory name. * Always has a leading separator. Never has a trailing separator * (unless it is the path itself). */ const char *fix_mcwd(char *ans) { FILE *fp; char *s; char buf[MAX_PATH]; fp = open_mcwd("r"); if(!fp){ strcpy(ans, "A:/"); return ans; } if (!fgets(buf, MAX_PATH, fp)) return("A:/"); buf[strlen(buf) -1] = '\0'; fclose(fp); /* drive letter present? */ s = skip_drive(buf); if (s > buf) { strncpy(ans, buf, s - buf); ans[s - buf] = '\0'; } else strcpy(ans, "A:"); /* add a leading separator */ if (*s != '/' && *s != '\\') { strcat(ans, "/"); strcat(ans, s); } else strcat(ans, s); #if 0 /* translate to upper case */ for (s = ans; *s; ++s) { *s = toupper(*s); if (*s == '\\') *s = '/'; } #endif /* if only drive, colon, & separator */ if (strlen(ans) == 3) return(ans); /* zap the trailing separator */ if (*--s == '/') *s = '\0'; return ans; } void *safe_malloc(size_t size) { void *p; p = malloc(size); if(!p){ printOom(); exit(1); } return p; } void print_sector(char *message, unsigned char *data, int size) { int col; int row; printf("%s:\n", message); for(row = 0; row * 16 < size; row++){ printf("%03x ", row * 16); for(col = 0; col < 16; col++) printf("%02x ", data [row*16+col]); for(col = 0; col < 16; col++) { if(isprint(data [row*16+col])) printf("%c", data [row*16+col]); else printf("."); } printf("\n"); } } time_t getTimeNow(time_t *now) { static int haveTime = 0; static time_t sharedNow; if(!haveTime) { time(&sharedNow); haveTime = 1; } if(now) *now = sharedNow; return sharedNow; } char *skip_drive(const char *filename) { char *p; /* Skip drive name. Return pointer just after the `:', or a pointer * to the start of the file name if there is is no drive name. */ p = strchr(filename, ':'); return (p == NULL || p == filename) ? (char *) filename : p + 1; } char *get_drive(const char *filename, const char *def) { const char *path; char *drive; const char *rest; size_t len; /* Return the drive name part of a full filename. */ path = filename; rest = skip_drive(path); if (rest == path) { if (def == NULL) def = "A:"; path = def; rest = skip_drive(path); if (rest == path) { path = "A:"; rest = path+2; } } len = rest - path; drive = safe_malloc(len * sizeof(drive[0])); len--; memcpy(drive, path, len); drive[len] = 0; if (len == 1) drive[0] = toupper(drive[0]); return drive; } #if 0 #undef free #undef malloc static int total=0; void myfree(void *ptr) { int *size = ((int *) ptr)-1; total -= *size; fprintf(stderr, "freeing %d bytes at %p total alloced=%d\n", *size, ptr, total); free(size); } void *mymalloc(size_t size) { int *ptr; ptr = (int *)malloc(size+sizeof(int)); if(!ptr) return 0; *ptr = size; ptr++; total += size; fprintf(stderr, "allocating %d bytes at %p total allocated=%d\n", size, ptr, total); return (void *) ptr; } void *mycalloc(size_t nmemb, size_t size) { void *ptr = mymalloc(nmemb * size); if(!ptr) return 0; memset(ptr, 0, size); return ptr; } void *myrealloc(void *ptr, size_t size) { int oldsize = ((int *)ptr) [-1]; void *new = mymalloc(size); if(!new) return 0; memcpy(new, ptr, oldsize); myfree(ptr); return new; } char *mystrdup(char *src) { char *dest; dest = mymalloc(strlen(src)+1); if(!dest) return 0; strcpy(dest, src); return dest; } #endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (C) 1991 Free Software Foundation, Inc. This file contains excerpts of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "sysincludes.h" #include "mtools.h" #ifndef HAVE_STRDUP char *strdup(const char *str) { char *nstr; if (str == (char*)0) return 0; nstr = (char*)malloc((strlen(str) + 1)); if (nstr == (char*)0) { (void)fprintf(stderr, "strdup(): not enough memory to duplicate `%s'\n", str); exit(1); } (void)strcpy(nstr, str); return nstr; } #endif /* HAVE_STRDUP */ #ifndef HAVE_MEMCPY /* * Copy contents of memory (with possible overlapping). */ char *memcpy(char *s1, const char *s2, size_t n) { bcopy(s2, s1, n); return(s1); } #endif #ifndef HAVE_MEMSET /* * Copies the character c, n times to string s */ char *memset(char *s, char c, size_t n) { char *s1 = s; while (n > 0) { --n; *s++ = c; } return(s1); } #endif /* HAVE_MEMSET */ #ifndef HAVE_STRCHR char * strchr (const char* s, int c) { if (!s) return NULL; while (*s && *s != c) s++; if (*s) return (char*) s; else return NULL; } #endif #ifndef HAVE_STRRCHR char * strrchr (const char* s1, int c) { char* s = (char*) s1; char* start = (char*) s; if (!s) return NULL; s += strlen(s)-1; while (*s != c && (unsigned long) s != (unsigned long) start) s--; if ((unsigned long) s == (unsigned long) start && *s != c) return NULL; else return s; } #endif #ifndef HAVE_STRPBRK /* * Return ptr to first occurrence of any character from `brkset' * in the character string `string'; NULL if none exists. */ char *strpbrk(const char *string, const char *brkset) { register char *p; if (!string || !brkset) return(0); do { for (p = brkset; *p != '\0' && *p != *string; ++p) ; if (*p != '\0') return(string); } while (*string++); return(0); } #endif /* HAVE_STRPBRK */ #ifndef HAVE_STRTOUL static int getdigit(char a, int max) { int dig; if(a < '0') return -1; if(a <= '9') { dig = a - '0'; } else if(a >= 'a') dig = a - 'a' + 10; else if(a >= 'A') dig = a - 'A' + 10; if(dig >= max) return -1; else return dig; } unsigned long strtoul(const char *string, char **eptr, int base) { int accu, dig; if(base < 1 || base > 36) { if(string[0] == '0') { switch(string[1]) { case 'x': case 'X': return strtoul(string+2, eptr, 16); case 'b': case 'B': return strtoul(string+2, eptr, 2); default: return strtoul(string, eptr, 8); } } return strtoul(string, eptr, 10); } if(base == 16 && string[0] == '0' && (string[1] == 'x' || string[1] == 'X')) string += 2; if(base == 2 && string[0] == '0' && (string[1] == 'b' || string[1] == 'B')) string += 2; accu = 0; while( (dig = getdigit(*string, base)) != -1 ) { accu = accu * base + dig; string++; } if(eptr) *eptr = (char *) string; return accu; } #endif /* HAVE_STRTOUL */ #ifndef HAVE_STRTOL long strtol(const char *string, char **eptr, int base) { long l; if(*string == '-') { return -(long) strtoul(string+1, eptr, base); } else { if (*string == '+') string ++; return (long) strtoul(string, eptr, base); } } #endif #ifndef HAVE_STRSPN /* Return the length of the maximum initial segment of S which contains only characters in ACCEPT. */ size_t strspn(const char *s, const char *accept) { register char *p; register char *a; register size_t count = 0; for (p = s; *p != '\0'; ++p) { for (a = accept; *a != '\0'; ++a) if (*p == *a) break; if (*a == '\0') return count; else ++count; } return count; } #endif /* HAVE_STRSPN */ #ifndef HAVE_STRCSPN /* Return the length of the maximum inital segment of S which contains no characters from REJECT. */ size_t strcspn (const char *s, const char *reject) { register size_t count = 0; while (*s != '\0') if (strchr (reject, *s++) == NULL) ++count; else return count; return count; } #endif /* HAVE_STRCSPN */ #ifndef HAVE_STRERROR #ifndef DECL_SYS_ERRLIST extern char *sys_errlist[]; #endif char *strerror(int errno) { return sys_errlist[errno]; } #endif #ifndef HAVE_STRCASECMP /* Compare S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexiographically less than, equal to or greater than S2. */ int strcasecmp(const char *s1, const char *s2) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2) return 0; do { c1 = tolower (*p1++); c2 = tolower (*p2++); if (c1 == '\0') break; } while (c1 == c2); return c1 - c2; } #endif #ifndef HAVE_STRCASECMP /* Compare S1 and S2, ignoring case, returning less than, equal to or greater than zero if S1 is lexiographically less than, equal to or greater than S2. */ int strncasecmp(const char *s1, const char *s2, size_t n) { register const unsigned char *p1 = (const unsigned char *) s1; register const unsigned char *p2 = (const unsigned char *) s2; unsigned char c1, c2; if (p1 == p2) return 0; c1 = c2 = 1; while (c1 && c1 == c2 && n-- > 0) { c1 = tolower (*p1++); c2 = tolower (*p2++); } return c1 - c2; } #endif #ifndef HAVE_GETPASS char *getpass(const char *prompt) { static char password[129]; int l; fprintf(stderr,"%s",prompt); fgets(password, 128, stdin); l = strlen(password); if(l && password[l-1] == '\n') password[l-1] = '\0'; return password; } #endif #ifndef HAVE_ATEXIT #ifdef HAVE_ON_EXIT int atexit(void (*function)(void)) { return on_exit( (void(*)(int,void*)) function, 0); } #else typedef struct exitCallback { void (*function) (void); struct exitCallback *next; } exitCallback_t; static exitCallback_t *callback = 0; int atexit(void (*function) (void)) { exitCallback_t *newCallback; newCallback = New(exitCallback_t); if(!newCallback) { printOom(); exit(1); } newCallback->function = function; newCallback->next = callback; callback = newCallback; return 0; } #undef exit void myexit(int code) { void (*function)(void); while(callback) { function = callback->function; callback = callback->next; function(); } exit(code); } #endif #endif /*#ifndef HAVE_BASENAME*/ const char *_basename(const char *filename) { char *ptr; ptr = strrchr(filename, '/'); if(ptr) return ptr+1; else return filename; } /*#endif*/ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mk_direntry.c * Make new directory entries, and handles name clashes * */ /* * This file is used by those commands that need to create new directory entries */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "nameclash.h" #include "fs.h" #include "stream.h" #include "mainloop.h" static inline int ask_rename(ClashHandling_t *ch, char *longname, int isprimary, char *argname) { char shortname[13]; int mangled; /* TODO: Would be nice to suggest "autorenamed" version of name, press * <Return> to get it. */ #if 0 fprintf(stderr,"Entering ask_rename, isprimary=%d.\n", isprimary); #endif if(!opentty(0)) return 0; #define maxsize (isprimary ? MAX_VNAMELEN+1 : 11+1) #define name (isprimary ? argname : shortname) mangled = 0; do { fprintf(stderr, "New %s name for \"%s\": ", isprimary ? "primary" : "secondary", longname); fflush(stderr); if (! fgets(name, maxsize, opentty(0))) return 0; /* Eliminate newline(s) in the file name */ name[strlen(name)-1]='\0'; if (!isprimary) ch->name_converter(shortname,0, &mangled, argname); } while (mangled & 1); return 1; #undef maxsize #undef name } static inline clash_action ask_namematch(char *name, int isprimary, ClashHandling_t *ch, int no_overwrite, int reason) { char ans[10]; clash_action a; int perm; char unix_shortname[13]; #define EXISTS 0 #define RESERVED 1 #define ILLEGALS 2 static const char *reasons[]= { "already exists", "is reserved", "contains illegal character(s)"}; if (!isprimary) name = unix_normalize(unix_shortname, name, name+8); a = ch->action[isprimary]; if(a == NAMEMATCH_NONE && !opentty(1)) { /* no default, and no tty either . Skip the troublesome file */ return NAMEMATCH_SKIP; } perm = 0; while (a == NAMEMATCH_NONE) { fprintf(stderr, "%s file name \"%s\" %s.\n", isprimary ? "Long" : "Short", name, reasons[reason]); fprintf(stderr, "a)utorename A)utorename-all r)ename R)ename-all "); if(!no_overwrite) fprintf(stderr,"o)verwrite O)verwrite-all"); fprintf(stderr, "\ns)kip S)kip-all q)uit (aArR"); if(!no_overwrite) fprintf(stderr,"oO"); fprintf(stderr,"sSq): "); fflush(stderr); fflush(opentty(1)); if (mtools_raw_tty) { int rep; rep = fgetc(opentty(1)); fputs("\n", stderr); if(rep == EOF) ans[0] = 'q'; else ans[0] = rep; } else { fgets(ans, 9, opentty(0)); } perm = isupper((unsigned char)ans[0]); switch(tolower((unsigned char)ans[0])) { case 'a': a = NAMEMATCH_AUTORENAME; break; case 'r': if(isprimary) a = NAMEMATCH_PRENAME; else a = NAMEMATCH_RENAME; break; case 'o': if(no_overwrite) continue; a = NAMEMATCH_OVERWRITE; break; case 's': a = NAMEMATCH_SKIP; break; case 'q': perm = 0; a = NAMEMATCH_QUIT; break; default: perm = 0; } } /* Keep track of this action in case this file collides again */ ch->action[isprimary] = a; if (perm) ch->namematch_default[isprimary] = a; /* if we were asked to overwrite be careful. We can't set the action * to overwrite, else we get won't get a chance to specify another * action, should overwrite fail. Indeed, we'll be caught in an * infinite loop because overwrite will fail the same way for the * second time */ if(a == NAMEMATCH_OVERWRITE) ch->action[isprimary] = NAMEMATCH_NONE; return a; } /* Returns: * 2 if file is to be overwritten * 1 if file was renamed * 0 if it was skipped * * If a short name is involved, handle conversion between the 11-character * fixed-length record DOS name and a literal null-terminated name (e.g. * "COMMAND COM" (no null) <-> "COMMAND.COM" (null terminated)). * * Also, immediately copy the original name so that messages can use it. */ static inline clash_action process_namematch(char *name, char *longname, int isprimary, ClashHandling_t *ch, int no_overwrite, int reason) { clash_action action; #if 0 fprintf(stderr, "process_namematch: name=%s, default_action=%d, ask=%d.\n", name, default_action, ch->ask); #endif action = ask_namematch(name, isprimary, ch, no_overwrite, reason); switch(action){ case NAMEMATCH_QUIT: got_signal = 1; return NAMEMATCH_SKIP; case NAMEMATCH_SKIP: return NAMEMATCH_SKIP; case NAMEMATCH_RENAME: case NAMEMATCH_PRENAME: /* We need to rename the file now. This means we must pass * back through the loop, a) ensuring there isn't a potential * new name collision, and b) finding a big enough VSE. * Change the name, so that it won't collide again. */ ask_rename(ch, longname, isprimary, name); return action; case NAMEMATCH_AUTORENAME: /* Very similar to NAMEMATCH_RENAME, except that we need to * first generate the name. * TODO: Remember previous name so we don't * keep trying the same one. */ if (isprimary) { autorename_long(name, 1); return NAMEMATCH_PRENAME; } else { autorename_short(name, 1); return NAMEMATCH_RENAME; } case NAMEMATCH_OVERWRITE: if(no_overwrite) return NAMEMATCH_SKIP; else return NAMEMATCH_OVERWRITE; default: return NAMEMATCH_NONE; } } static void clear_scan(char *longname, int use_longname, struct scan_state *s) { s->shortmatch = s->longmatch = s->slot = -1; s->free_end = s->got_slots = s->free_start = 0; if (use_longname & 1) s->size_needed = 2 + (strlen(longname)/VSE_NAMELEN); else s->size_needed = 1; } static int contains_illegals(const char *string, const char *illegals) { for(; *string ; string++) if((*string < ' ' && *string != '\005' && !(*string & 0x80)) || strchr(illegals, *string)) return 1; return 0; } static int is_reserved(char *ans, int islong) { int i; static const char *dev3[] = {"CON", "AUX", "PRN", "NUL", " "}; static const char *dev4[] = {"COM", "LPT" }; for (i = 0; i < sizeof(dev3)/sizeof(*dev3); i++) if (!strncasecmp(ans, dev3[i], 3) && ((islong && !ans[3]) || (!islong && !strncmp(ans+3," ",5)))) return 1; for (i = 0; i < sizeof(dev4)/sizeof(*dev4); i++) if (!strncasecmp(ans, dev4[i], 3) && (ans[3] >= '1' && ans[3] <= '4') && ((islong && !ans[4]) || (!islong && !strncmp(ans+4," ",4)))) return 1; return 0; } static inline clash_action get_slots(Stream_t *Dir, char *dosname, char *longname, struct scan_state *ssp, ClashHandling_t *ch) { int error; clash_action ret; int match=0; direntry_t entry; int isprimary; int no_overwrite; int reason; int pessimisticShortRename; pessimisticShortRename = (ch->action[0] == NAMEMATCH_AUTORENAME); entry.Dir = Dir; no_overwrite = 1; if((is_reserved(longname,1)) || longname[strspn(longname,". ")] == '\0'){ reason = RESERVED; isprimary = 1; } else if(contains_illegals(longname,long_illegals)) { reason = ILLEGALS; isprimary = 1; } else if(is_reserved(dosname,0)) { reason = RESERVED; ch->use_longname = 1; isprimary = 0; } else if(contains_illegals(dosname,short_illegals)) { reason = ILLEGALS; ch->use_longname = 1; isprimary = 0; } else { reason = EXISTS; clear_scan(longname, ch->use_longname, ssp); switch (lookupForInsert(Dir, dosname, longname, ssp, ch->ignore_entry, ch->source_entry, pessimisticShortRename && ch->use_longname)) { case -1: return NAMEMATCH_ERROR; case 0: return NAMEMATCH_SKIP; /* Single-file error error or skip request */ case 5: return NAMEMATCH_GREW; /* Grew directory, try again */ case 6: return NAMEMATCH_SUCCESS; /* Success */ } match = -2; if (ssp->longmatch > -1) { /* Primary Long Name Match */ #ifdef debug fprintf(stderr, "Got longmatch=%d for name %s.\n", longmatch, longname); #endif match = ssp->longmatch; isprimary = 1; } else if ((ch->use_longname & 1) && (ssp->shortmatch != -1)) { /* Secondary Short Name Match */ #ifdef debug fprintf(stderr, "Got secondary short name match for name %s.\n", longname); #endif match = sspF��F��F��F��F��F��F��F����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������->shortmatch; isprimary = 0; } else if (ssp->shortmatch >= 0) { /* Primary Short Name Match */ #ifdef debug fprintf(stderr, "Got primary short name match for name %s.\n", longname); #endif match = ssp->shortmatch; isprimary = 1; } else return NAMEMATCH_RENAME; if(match > -1) { entry.entry = match; dir_read(&entry, &error); if (error) return NAMEMATCH_ERROR; /* if we can't overwrite, don't propose it */ no_overwrite = (match == ch->source || IS_DIR(&entry)); } } ret = process_namematch(isprimary ? longname : dosname, longname, isprimary, ch, no_overwrite, reason); if (ret == NAMEMATCH_OVERWRITE && match > -1){ if((entry.dir.attr & 0x5) && (ask_confirmation("file is read only, overwrite anyway (y/n) ? ",0,0))) return NAMEMATCH_RENAME; /* Free up the file to be overwritten */ if(fatFreeWithDirentry(&entry)) return NAMEMATCH_ERROR; #if 0 if(isprimary && match - ssp->match_free + 1 >= ssp->size_needed){ /* reuse old entry and old short name for overwrite */ ssp->free_start = match - ssp->size_needed + 1; ssp->free_size = ssp->size_needed; ssp->slot = match; ssp->got_slots = 1; strncpy(dosname, dir.name, 3); strncpy(dosname + 8, dir.ext, 3); return ret; } else #endif { entry.dir.name[0] = DELMARK; dir_write(&entry); return NAMEMATCH_RENAME; } } return ret; } static inline int write_slots(Stream_t *Dir, char *dosname, char *longname, struct scan_state *ssp, write_data_callback *cb, void *arg, int Case) { direntry_t entry; /* write the file */ if (fat_error(Dir)) return 0; entry.Dir = Dir; entry.entry = ssp->slot; strncpy(entry.name, longname, sizeof(entry.name)-1); entry.name[sizeof(entry.name)-1]='\0'; entry.dir.Case = Case & (EXTCASE | BASECASE); if (cb(dosname, longname, arg, &entry) >= 0) { if ((ssp->size_needed > 1) && (ssp->free_end - ssp->free_start >= ssp->size_needed)) { ssp->slot = write_vfat(Dir, dosname, longname, ssp->free_start, &entry); } else { ssp->size_needed = 1; write_vfat(Dir, dosname, 0, ssp->free_start, &entry); } /* clear_vses(Dir, ssp->free_start + ssp->size_needed, ssp->free_end); */ } else return 0; return 1; /* Successfully wrote the file */ } static void stripspaces(char *name) { char *p,*non_space; non_space = name; for(p=name; *p; p++) if (*p != ' ') non_space = p; if(name[0]) non_space[1] = '\0'; } int _mwrite_one(Stream_t *Dir, char *argname, char *shortname, write_data_callback *cb, void *arg, ClashHandling_t *ch) { char longname[VBUFSIZE]; const char *dstname; char dosname[13]; int expanded; struct scan_state scan; clash_action ret; expanded = 0; if(isSpecial(argname)) { fprintf(stderr, "Cannot create entry named . or ..\n"); return -1; } if(ch->name_converter == dos_name) { if(shortname) stripspaces(shortname); if(argname) stripspaces(argname); } if(shortname){ ch->name_converter(shortname,0, &ch->use_longname, dosname); if(ch->use_longname & 1){ /* short name mangled, treat it as a long name */ argname = shortname; shortname = 0; } } /* Skip drive letter */ dstname = skip_drive(argname); /* Copy original argument dstname to working value longname */ strncpy(longname, dstname, VBUFSIZE-1); if(shortname) { ch->name_converter(shortname,0, &ch->use_longname, dosname); if(strcmp(shortname, longname)) ch->use_longname |= 1; } else ch->name_converter(longname,0, &ch->use_longname, dosname); ch->action[0] = ch->namematch_default[0]; ch->action[1] = ch->namematch_default[1]; while (1) { switch((ret=get_slots(Dir, dosname, longname, &scan, ch))){ case NAMEMATCH_ERROR: return -1; /* Non-file-specific error, * quit */ case NAMEMATCH_SKIP: return -1; /* Skip file (user request or * error) */ case NAMEMATCH_PRENAME: ch->name_converter(longname,0, &ch->use_longname, dosname); continue; case NAMEMATCH_RENAME: continue; /* Renamed file, loop again */ case NAMEMATCH_GREW: /* No collision, and not enough slots. * Try to grow the directory */ if (expanded) { /* Already tried this * once, no good */ fprintf(stderr, "%s: No directory slots\n", progname); return -1; } expanded = 1; if (dir_grow(Dir, scan.max_entry)) return -1; continue; case NAMEMATCH_OVERWRITE: case NAMEMATCH_SUCCESS: return write_slots(Dir, dosname, longname, &scan, cb, arg, ch->use_longname); default: fprintf(stderr, "Internal error: clash_action=%d\n", ret); return -1; } } } int mwrite_one(Stream_t *Dir, const char *_argname, const char *_shortname, write_data_callback *cb, void *arg, ClashHandling_t *ch) { char *argname; char *shortname; int ret; if(_argname) argname = strdup(_argname); else argname = 0; if(_shortname) shortname = strdup(_shortname); else shortname = 0; ret = _mwrite_one(Dir, argname, shortname, cb, arg, ch); if(argname) free(argname); if(shortname) free(shortname); return ret; } void init_clash_handling(ClashHandling_t *ch) { ch->ignore_entry = -1; ch->source_entry = -2; ch->nowarn = 0; /*Don't ask, just do default action if name collision */ ch->namematch_default[0] = NAMEMATCH_AUTORENAME; ch->namematch_default[1] = NAMEMATCH_NONE; ch->name_converter = dos_name; /* changed by mlabel */ ch->source = -2; } int handle_clash_options(ClashHandling_t *ch, char c) { int isprimary; if(isupper(c)) isprimary = 0; else isprimary = 1; c = tolower(c); switch(c) { case 'o': /* Overwrite if primary name matches */ ch->namematch_default[isprimary] = NAMEMATCH_OVERWRITE; return 0; case 'r': /* Rename primary name interactively */ ch->namematch_default[isprimary] = NAMEMATCH_RENAME; return 0; case 's': /* Skip file if primary name collides */ ch->namematch_default[isprimary] = NAMEMATCH_SKIP; return 0; case 'm': ch->namematch_default[isprimary] = NAMEMATCH_NONE; return 0; case 'a': ch->namematch_default[isprimary] = NAMEMATCH_AUTORENAME; return 0; default: return -1; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mlabel.c * Make an MSDOS volume label */ #include "sysincludes.h" #include "msdos.h" #include "mainloop.h" #include "vfat.h" #include "mtools.h" #include "nameclash.h" char *label_name(char *filename, int verbose, int *mangled, char *ans) { int len; int i; int have_lower, have_upper; strcpy(ans," "); len = strlen(filename); if(len > 11){ *mangled = 1; len = 11; } else *mangled = 0; strncpy(ans, filename, len); have_lower = have_upper = 0; for(i=0; i<11; i++){ if(islower((unsigned char)ans[i])) have_lower = 1; if(isupper(ans[i])) have_upper = 1; ans[i] = toupper((unsigned char)ans[i]); if(strchr("^+=/[]:,?*\\<>|\".", ans[i])){ *mangled = 1; ans[i] = '~'; } } if (have_lower && have_upper) *mangled = 1; return ans; } int labelit(char *dosname, char *longname, void *arg0, direntry_t *entry) { time_t now; /* find out current time */ getTimeNow(&now); mk_entry(dosname, 0x8, 0, 0, now, &entry->dir); return 0; } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-vscn] [-N serial] drive:[label]\n" "\t-v Verbose\n" "\t-s Show label\n" "\t-c Clear label\n" "\t-n New random serial number\n" "\t-N New given serial number\n", progname); exit(1); } void mlabel(int argc, char **argv, int type) { char *drive, *newLabel; int verbose, clear, interactive, show, open_mode; direntry_t entry; int result=0; char longname[VBUFSIZE]; char shortname[13]; ClashHandling_t ch; struct MainParam_t mp; Stream_t *RootDir; int c; int mangled; enum { SER_NONE, SER_RANDOM, SER_SET } set_serial = SER_NONE; long serial = 0; int need_write_boot = 0; int have_boot = 0; char *eptr = ""; struct bootsector boot; Stream_t *Fs=0; int r; struct label_blk_t *labelBlock; init_clash_handling(&ch); ch.name_converter = label_name; ch.ignore_entry = -2; verbose = 0; clear = 0; show = 0; while ((c = getopt(argc, argv, "vcsnN:")) != EOF) { switch (c) { case 'v': verbose = 1; break; case 'c': clear = 1; break; case 's': show = 1; break; case 'n': set_serial = SER_RANDOM; srandom((long)time (0)); serial=random(); break; case 'N': set_serial = SER_SET; serial = strtol(optarg, &eptr, 16); if(*eptr) { fprintf(stderr, "%s not a valid serial number\n", optarg); exit(1); } break; default: usage(); } } if (argc - optind != 1 || skip_drive(argv[optind]) == argv[optind]) usage(); init_mp(&mp); newLabel = skip_drive(argv[optind]); interactive = !show && !clear &&!newLabel[0] && (set_serial == SER_NONE); open_mode = O_RDWR; drive = get_drive(argv[optind], NULL); RootDir = open_root_dir(drive, open_mode); if(strlen(newLabel) > VBUFSIZE) { fprintf(stderr, "Label too long\n"); FREE(&RootDir); exit(1); } if(!RootDir && open_mode == O_RDWR && !clear && !newLabel[0] && ( errno == EACCES || errno == EPERM) ) { show = 1; interactive = 0; RootDir = open_root_dir(drive, O_RDONLY); } if(!RootDir) { fprintf(stderr, "%s: Cannot initialize drive\n", argv[0]); exit(1); } initializeDirentry(&entry, RootDir); r=vfat_lookup(&entry, 0, 0, ACCEPT_LABEL | MATCH_ANY, shortname, longname); if (r == -2) { FREE(&RootDir); exit(1); } if(show || interactive){ if(isNotFound(&entry)) printf(" Volume has no label\n"); else if (*longname) printf(" Volume label is %s (abbr=%s)\n", longname, shortname); else printf(" Volume label is %s\n", shortname); } /* ask for new label */ if(interactive){ newLabel = longname; fprintf(stderr,"Enter the new volume label : "); fgets(newLabel, VBUFSIZE, stdin); if(newLabel[0]) newLabel[strlen(newLabel)-1] = '\0'; } if((!show || newLabel[0]) && !isNotFound(&entry)){ /* if we have a label, wipe it out before putting new one */ if(interactive && newLabel[0] == '\0') if(ask_confirmation("Delete volume label (y/n): ",0,0)){ FREE(&RootDir); exit(0); } entry.dir.name[0] = DELMARK; entry.dir.attr = 0; /* for old mlabel */ dir_write(&entry); } if (newLabel[0] != '\0') { ch.ignore_entry = 1; result = mwrite_one(RootDir,newLabel,0,labelit,NULL,&ch) ? 0 : 1; } have_boot = 0; if( (!show || newLabel[0]) || set_serial != SER_NONE) { Fs = GetFs(RootDir); have_boot = (force_read(Fs,(char *)&boot,0,sizeof(boot)) == sizeof(boot)); } if(_WORD(boot.fatlen)) { labelBlock = &boot.ext.old.labelBlock; } else { labelBlock = &boot.ext.fat32.labelBlock; } if(!show || newLabel[0]){ if(!newLabel[0]) strncpy(shortname, "NO NAME ",11); else label_name(newLabel, verbose, &mangled, shortname); if(have_boot && boot.descr >= 0xf0 && labelBlock->dos4 == 0x29) { strncpy(labelBlock->label, shortname, 11); need_write_boot = 1; } } if((set_serial != SER_NONE) & have_boot) { if(have_boot && boot.descr >= 0xf0 && labelBlock->dos4 == 0x29) { set_dword(labelBlock->serial, serial); need_write_boot = 1; } } if(need_write_boot) { force_write(Fs, (char *)&boot, 0, sizeof(boot)); } FREE(&RootDir); exit(result); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mmd.c * Makes an MSDOS directory */ #define LOWERCASE #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "mainloop.h" #include "plain_io.h" #include "nameclash.h" #include "file.h" #include "fs.h" /* * Preserve the file modification times after the fclose() */ typedef struct Arg_t { char *target; MainParam_t mp; Stream_t *SrcDir; int entry; ClashHandling_t ch; Stream_t *targetDir; } Arg_t; typedef struct CreateArg_t { Stream_t *Dir; Stream_t *NewDir; unsigned char attr; time_t mtime; } CreateArg_t; /* * Open the named file for read, create the cluster chain, return the * directory structure or NULL on error. */ int makeit(char *dosname, char *longname, void *arg0, direntry_t *targetEntry) { Stream_t *Target; CreateArg_t *arg = (CreateArg_t *) arg0; int fat; direntry_t subEntry; /* will it fit? At least one cluster must be free */ if (!getfreeMinClusters(targetEntry->Dir, 1)) return -1; mk_entry(dosname, ATTR_DIR, 1, 0, arg->mtime, &targetEntry->dir); Target = OpenFileByDirentry(targetEntry); if(!Target){ fprintf(stderr,"Could not open Target\n"); return -1; } /* this allocates the first cluster for our directory */ initializeDirentry(&subEntry, Target); subEntry.entry = 1; GET_DATA(targetEntry->Dir, 0, 0, 0, &fat); if (fat == fat32RootCluster(targetEntry->Dir)) { fat = 0; } mk_entry(".. ", ATTR_DIR, fat, 0, arg->mtime, &subEntry.dir); dir_write(&subEntry); FLUSH((Stream_t *) Target); subEntry.entry = 0; GET_DATA(Target, 0, 0, 0, &fat); mk_entry(". ", ATTR_DIR, fat, 0, arg->mtime, &subEntry.dir); dir_write(&subEntry); mk_entry(dosname, ATTR_DIR | arg->attr, fat, 0, arg->mtime, &targetEntry->dir); arg->NewDir = Target; return 0; } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-D clash_option] file targetfile\n", progname); fprintf(stderr, " %s [-D clash_option] file [files...] target_directory\n", progname); exit(1); } Stream_t *createDir(Stream_t *Dir, const char *filename, ClashHandling_t *ch, unsigned char attr, time_t mtime) { CreateArg_t arg; int ret; arg.Dir = Dir; arg.attr = attr; arg.mtime = mtime; if (!getfreeMinClusters(Dir, 1)) return NULL; ret = mwrite_one(Dir, filename,0, makeit, &arg, ch); if(ret < 1) return NULL; else return arg.NewDir; } static int createDirCallback(direntry_t *entry, MainParam_t *mp) { Stream_t *ret; time_t now; ret = createDir(mp->File, mp->targetName, &((Arg_t *)(mp->arg))->ch, ATTR_DIR, getTimeNow(&now)); if(ret == NULL) return ERROR_ONE; else { FREE(&ret); return GOT_ONE; } } void mmd(int argc, char **argv, int type) { Arg_t arg; int c; /* get command line options */ init_clash_handling(& arg.ch); /* get command line options */ while ((c = getopt(argc, argv, "D:o")) != EOF) { switch (c) { case '?': usage(); case 'o': handle_clash_options(&arg.ch, c); break; case 'D': if(handle_clash_options(&arg.ch, *optarg)) usage(); break; default: break; } } if (argc - optind < 1) usage(); init_mp(&arg.mp); arg.mp.arg = (void *) &arg; arg.mp.openflags = O_RDWR; arg.mp.callback = createDirCallback; arg.mp.lookupflags = OPEN_PARENT | DO_OPEN_DIRS; exit(main_loop(&arg.mp, argv + optind, argc - optind)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Mount an MSDOS disk * * written by: * * Alain L. Knaff * alain@linux.lu * */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #ifdef OS_linux #include <sys/wait.h> #include "mainloop.h" #include "fs.h" extern int errno; void mmount(int argc, char **argv, int type) { char drive; int pid; int status; struct device dev; char name[EXPAND_BUF]; int media; struct bootsector boot; Stream_t *Stream; if (argc<2 || !argv[1][0] || argv[1][1] != ':' || argv[1][2]){ fprintf(stderr,"Usage: %s -V drive:\n", argv[0]); exit(1); } drive = toupper(argv[1][0]); Stream = find_device(drive, O_RDONLY, &dev, &boot, name, &media, 0); if(!Stream) exit(1); FREE(&Stream); destroy_privs(); if ( dev.partition ) { char part_name[4]; sprintf(part_name, "%d", dev.partition %1000); strcat(name, part_name); } /* and finally mount it */ switch((pid=fork())){ case -1: fprintf(stderr,"fork failed\n"); exit(1); case 0: close(2); open("/dev/null", O_RDWR); argv[1] = strdup("mount"); if ( argc > 2 ) execvp("mount", argv + 1 ); else execlp("mount", "mount", name, 0); perror("exec mount"); exit(1); default: while ( wait(&status) != pid ); } if ( WEXITSTATUS(status) == 0 ) exit(0); argv[0] = strdup("mount"); argv[1] = strdup("-r"); if(!argv[0] || !argv[1]){ printOom(); exit(1); } if ( argc > 2 ) execvp("mount", argv); else execlp("mount", "mount","-r", name, 0); exit(1); } #endif /* linux */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mmove.c * Renames/moves an MSDOS file * */ #define LOWERCASE #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "mainloop.h" #include "plain_io.h" #include "nameclash.h" #include "file.h" #include "fs.h" /* * Preserve the file modification times after the fclose() */ typedef struct Arg_t { const char *fromname; int verbose; MainParam_t mp; direntry_t *entry; ClashHandling_t ch; } Arg_t; /* * Open the named file for read, create the cluster chain, return the * directory structure or NULL on error. */ int renameit(char *dosname, char *longname, void *arg0, direntry_t *targetEntry) { Arg_t *arg = (Arg_t *) arg0; int fat; targetEntry->dir = arg->entry->dir; strncpy(targetEntry->dir.name, dosname, 8); strncpy(targetEntry->dir.ext, dosname + 8, 3); if(IS_DIR(targetEntry)) { direntry_t *movedEntry; /* get old direntry. It is important that we do this * on the actual direntry which is stored in the file, * and not on a copy, because we will modify it, and the * modification should be visible at file * de-allocation time */ movedEntry = getDirentry(arg->mp.File); if(movedEntry->Dir != targetEntry->Dir) { /* we are indeed moving it to a new directory */ direntry_t subEntry; Stream_t *oldDir; /* we have a directory here. Change its parent link */ initializeDirentry(&subEntry, arg->mp.File); switch(vfat_lookup(&subEntry, "..", 2, ACCEPT_DIR, NULL, NULL)) { case -1: fprintf(stderr, " Directory has no parent entry\n"); break; case -2: return ERROR_ONE; case 0: GET_DATA(targetEntry->Dir, 0, 0, 0, &fat); if (fat == fat32RootCluster(targetEntry->Dir)) { fat = 0; } subEntry.dir.start[1] = (fat >> 8) & 0xff; subEntry.dir.start[0] = fat & 0xff; dir_write(&subEntry); if(arg->verbose){ fprintf(stderr, "Easy, isn't it? I wonder why DOS can't do this.\n"); } break; } /* wipe out original entry */ movedEntry->dir.name[0] = DELMARK; dir_write(movedEntry); /* free the old parent, allocate the new one. */ oldDir = movedEntry->Dir; *movedEntry = *targetEntry; COPY(targetEntry->Dir); FREE(&oldDir); return 0; } } /* wipe out original entry */ arg->mp.direntry->dir.name[0] = DELMARK; dir_write(arg->mp.direntry); return 0; } static int rename_file(direntry_t *entry, MainParam_t *mp) /* rename a messy DOS file to another messy DOS file */ { int result; Stream_t *targetDir; char *shortname; const char *longname; Arg_t * arg = (Arg_t *) (mp->arg); arg->entry = entry; targetDir = mp->targetDir; if (targetDir == entry->Dir){ arg->ch.ignore_entry = -1; arg->ch.source = entry->entry; arg->ch.source_entry = entry->entry; } else { arg->ch.ignore_entry = -1; arg->ch.source = -2; } longname = mpPickTargetName(mp); shortname = 0; result = mwrite_one(targetDir, longname, shortname, renameit, (void *)arg, &arg->ch); if(result == 1) return GOT_ONE; else return ERROR_ONE; } static int rename_directory(direntry_t *entry, MainParam_t *mp) { int ret; /* moves a DOS dir */ if(isSubdirOf(mp->targetDir, mp->File)) { fprintf(stderr, "Cannot move directory "); fprintPwd(stderr, entry,0); fprintf(stderr, " into one of its own subdirectories ("); fprintPwd(stderr, getDirentry(mp->targetDir),0); fprintf(stderr, ")\n"); return ERROR_ONE; } if(entry->entry == -3) { fprintf(stderr, "Cannot move a root directory: "); fprintPwd(stderr, entry,0); return ERROR_ONE; } ret = rename_file(entry, mp); if(ret & ERROR_ONE) return ret; return ret; } static int rename_oldsyntax(direntry_t *entry, MainParam_t *mp) { int result; Stream_t *targetDir; const char *shortname, *longname; Arg_t * arg = (Arg_t *) (mp->arg); arg->entry = entry; targetDir = entry->Dir; arg->ch.ignore_entry = -1; arg->ch.source = entry->entry; arg->ch.source_entry = entry->entry; #if 0 if(!strcasecmp(mp->shortname, arg->fromname)){ longname = mp->longname; shortname = mp->targetName; } else { #endif longname = mp->targetName; shortname = 0; #if 0 } #endif result = mwrite_one(targetDir, longname, shortname, renameit, (void *)arg, &arg->ch); if(result == 1) return GOT_ONE; else return ERROR_ONE; } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-vo] [-D clash_option] file targetfile\n", progname); fprintf(stderr, " %s [-vo] [-D clash_option] file [files...] target_directory\n", progname); fprintf(stderr, "\t-v Verbose\n"); exit(1); } void mmove(int argc, char **argv, int oldsyntax) { Arg_t arg; int c; char shortname[13]; char longname[VBUFSIZE]; char *def_drive; int i; /* get command line options */ init_clash_handling(& arg.ch); /* get command line options */ arg.verbose = 0; while ((c = getopt(argc, argv, "vD:o")) != EOF) { switch (c) { case 'v': /* dummy option for mcopy */ arg.verbose = 1; break; case '?': usage(); case 'o': handle_clash_options(&arg.ch, c); break; case 'D': if(handle_clash_options(&arg.ch, *optarg)) usage(); break; default: break; } } if (argc - optind < 2) usage(); init_mp(&arg.mp); arg.mp.arg = (void *) &arg; arg.mp.openflags = O_RDWR; /* look for a default drive */ def_drive = NULL; for(i=optind; i<argc; i++) if(skip_drive(argv[i]) > argv[i]){ char *drive = get_drive(argv[i], NULL); if(!def_drive) def_drive = drive; else if(strcmp(def_drive, drive) != 0){ fprintf(stderr, "Cannot move files across different drives\n"); exit(1); } } if(def_drive) { char mcwd[MAXPATHLEN]; strcpy(mcwd, skip_drive(arg.mp.mcwd)); if(strlen(def_drive) + 1 + strlen(mcwd) + 1 > MAXPATHLEN){ fprintf(stderr, "Path name to current directory too long\n"); exit(1); } strcpy(arg.mp.mcwd, def_drive); strcat(arg.mp.mcwd, ":"); strcat(arg.mp.mcwd, mcwd); } if (oldsyntax && (argc - optind != 2 || strpbrk(":/", argv[argc-1]))) oldsyntax = 0; arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN_DIRS | NO_DOTS | NO_UNIX; if (!oldsyntax){ target_lookup(&arg.mp, argv[argc-1]); arg.mp.callback = rename_file; arg.mp.dirCallback = rename_directory; } else { /* do not look up the target; it will be the same dir as the * source */ arg.fromname = _basename(skip_drive(argv[optind])); arg.mp.targetName = strdup(argv[argc-1]); arg.mp.callback = rename_oldsyntax; } arg.mp.longname = longname; longname[0]='\0'; arg.mp.shortname = shortname; shortname[0]='\0'; exit(main_loop(&arg.mp, argv + optind, argc - optind - 1)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mformat.c */ #define DONT_NEED_WAIT #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "mainloop.h" #include "fsP.h" #include "file.h" #include "plain_io.h" #include "nameclash.h" #include "buffer.h" #include "scsi.h" #include "partition.h" #ifdef OS_linux #include "linux/hdreg.h" #define _LINUX_STRING_H_ #define kdev_t int #include "linux/fs.h" #undef _LINUX_STRING_H_ #endif #define tolinear(x) \ (sector(x)-1+(head(x)+cyl(x)*used_dev->heads)*used_dev->sectors) static inline void print_hsc(hsc *h) { printf(" h=%d s=%d c=%d\n", head(*h), sector(*h), cyl(*h)); } static void set_offset(hsc *h, int offset, int heads, int sectors) { int head, sector, cyl; if(! heads || !sectors) head = sector = cyl = 0; /* linear mode */ else { sector = offset % sectors; offset = offset / sectors; head = offset % heads; cyl = offset / heads; if(cyl > 1023) cyl = 1023; } h->head = head; h->sector = ((sector+1) & 0x3f) | ((cyl & 0x300)>>2); h->cyl = cyl & 0xff; } void setBeginEnd(struct partition *partTable, int begin, int end, int heads, int sectors, int activate, int type) { set_offset(&partTable->start, begin, heads, sectors); set_offset(&partTable->end, end-1, heads, sectors); set_dword(partTable->start_sect, begin); set_dword(partTable->nr_sects, end-begin); if(activate) partTable->boot_ind = 0x80; else partTable->boot_ind = 0; if(!type) { if(end-begin < 4096) type = 1; /* DOS 12-bit FAT */ else if(end-begin<32*2048) type = 4; /* DOS 16-bit FAT, <32M */ else type = 6; /* DOS 16-bit FAT >= 32M */ } partTable->sys_ind = type; } int consistencyCheck(struct partition *partTable, int doprint, int verbose, int *has_activated, int *last_end, int *j, struct device *used_dev, int target_partition) { int i; int inconsistency; *j = 0; *last_end = 1; /* quick consistency check */ inconsistency = 0; *has_activated = 0; for(i=1; i<5; i++){ if(!partTable[i].sys_ind) continue; if(partTable[i].boot_ind) (*has_activated)++; if((used_dev && (used_dev->heads != head(partTable[i].end)+1 || used_dev->sectors != sector(partTable[i].end))) || sector(partTable[i].start) != 1){ fprintf(stderr, "Partition %d is not aligned\n", i); inconsistency=1; } if(*j && *last_end > BEGIN(partTable[i])) { fprintf(stderr, "Partitions %d and %d badly ordered or overlapping\n", *j,i); inconsistency=1; } *last_end = END(partTable[i]); *j = i; if(used_dev && cyl(partTable[i].start) != 1023 && tolinear(partTable[i].start) != BEGIN(partTable[i])) { fprintf(stderr, "Start position mismatch for partition %d\n", i); inconsistency=1; } if(used_dev && cyl(partTable[i].end) != 1023 && tolinear(partTable[i].end)+1 != END(partTable[i])) { fprintf(stderr, "End position mismatch for partition %d\n", i); inconsistency=1; } if(doprint && verbose) { if(i==target_partition) putchar('*'); else putchar(' '); printf("Partition %d\n",i); printf(" active=%x\n", partTable[i].boot_ind); printf(" start:"); print_hsc(&partTable[i].start); printf(" type=0x%x\n", partTable[i].sys_ind); printf(" end:"); print_hsc(&partTable[i].end); printf(" start=%d\n", BEGIN(partTable[i])); printf(" nr=%d\n", _DWORD(partTable[i].nr_sects)); printf("\n"); } } return inconsistency; } /* setsize function. Determines scsicam mapping if this cannot be inferred from * any existing partitions. Shamelessly snarfed from the Linux kernel ;-) */ /* * Function : static int setsize(unsigned long capacity,unsigned int *cyls, * unsigned int *hds, unsigned int *secs); * * Purpose : to determine a near-optimal int 0x13 mapping for a * SCSI disk in terms of lost space of size capacity, storing * the results in *cyls, *hds, and *secs. * * Returns : -1 on failure, 0 on success. * * Extracted from * * WORKING X3T9.2 * DRAFT 792D * * * Revision 6 * 10-MAR-94 * Information technology - * SCSI-2 Common access method * transport and SCSI interface module * * ANNEX A : * * setsize() converts a read capacity value to int 13h * head-cylinder-sector requirements. It minimizes the value for * number of heads and maximizes the number of cylinders. This * will support rather large disks before the number of heads * will not fit in 4 bits (or 6 bits). This algorithm also * minimizes the number of sectors that will be unused at the end * of the disk while allowing for very large disks to be * accommodated. This algorithm does not use physical geometry. */ static int setsize(unsigned long capacity,unsigned int *cyls,unsigned int *hds, unsigned int *secs) { unsigned int rv = 0; unsigned long heads, sectors, cylinders, temp; cylinders = 1024L; /* Set number of cylinders to max */ sectors = 62L; /* Maximize sectors per track */ temp = cylinders * sectors; /* Compute divisor for heads */ heads = capacity / temp; /* Compute value for number of heads */ if (capacity % temp) { /* If no remainder, done! */ heads++; /* Else, increment number of heads */ temp = cylinders * heads; /* Compute divisor for sectors */ sectors = capacity / temp; /* Compute value for sectors per track */ if (capacity % temp) { /* If no remainder, done! */ sectors++; /* Else, increment number of sectors */ temp = heads * sectors; /* Compute divisor for cylinders */ cylinders = capacity / temp;/* Compute number of cylinders */ } } if (cylinders == 0) rv=(unsigned)-1;/* Give error if 0 cylinders */ *cyls = (unsigned int) cylinders; /* Stuff return values */ *secs = (unsigned int) sectors; *hds = (unsigned int) heads; return(rv); } static void setsize0(unsigned long capacity,unsigned int *cyls, unsigned int *hds, unsigned int *secs) { int r; /* 1. First try "Megabyte" sizes */ if(capacity < 1024 * 2048 && !(capacity % 1024)) { *cyls = capacity >> 11; *hds = 64; *secs = 32; return; } /* then try scsicam's size */ r = setsize(capacity,cyls,hds,secs); if(r || *hds > 255 || *secs > 63) { /* scsicam failed. Do megabytes anyways */ *cyls = capacity >> 11; *hds = 64; *secs = 32; return; } } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s [-pradcv] [-I [-B bootsect-template] [-s sectors] " "[-t cylinders] " "[-h heads] [-T type] [-b begin] [-l length] " "drive\n", progname); exit(1); } void mpartition(int argc, char **argv, int dummy) { Stream_t *Stream; unsigned int dummy2; int i,j; int sec_per_cyl; int doprint = 0; int verbose = 0; int create = 0; int force = 0; int length = 0; int remove = 0; int initialize = 0; int tot_sectors=0; int type = 0; int begin_set = 0; int size_set = 0; int end_set = 0; int last_end = 0; int activate = 0; int has_activated = 0; int inconsistency=0; int begin=0; int end=0; int sizetest=0; int dirty = 0; int open2flags = NO_OFFSET; int c; struct device used_dev; int argtracks, argheads, argsectors; char *drive, name[EXPAND_BUF]; unsigned char buf[512]; struct partition *partTable=(struct partition *)(buf+ 0x1ae); struct device *dev; char errmsg[200]; char *bootSector=0; argtracks = 0; argheads = 0; argsectors = 0; /* get command line options */ while ((c = getopt(argc, argv, "adprcIT:t:h:s:fvpb:l:S:B:")) != EOF) { switch (c) { case 'B': bootSector = optarg; break; case 'a': /* no privs, as it could be abused to * make other partitions unbootable, or * to boot a rogue kernel from this one */ open2flags |= NO_PRIV; activate = 1; dirty = 1; break; case 'd': activate = -1; dirty = 1; break; case 'p': F��F��F��F��F��F��F��F��F��F�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� doprint = 1; break; case 'r': remove = 1; dirty = 1; break; case 'I': /* could be abused to nuke all other * partitions */ open2flags |= NO_PRIV; initialize = 1; dirty = 1; break; case 'c': create = 1; dirty = 1; break; case 'T': /* could be abused to "manually" create * extended partitions */ open2flags |= NO_PRIV; type = strtoul(optarg,0,0); break; case 't': argtracks = atoi(optarg); break; case 'h': argheads = atoi(optarg); break; case 's': argsectors = atoi(optarg); break; case 'f': /* could be abused by creating overlapping * partitions and other such Snafu */ open2flags |= NO_PRIV; force = 1; break; case 'v': verbose++; break; case 'S': /* testing only */ /* could be abused to create partitions * extending beyond the actual size of the * device */ open2flags |= NO_PRIV; tot_sectors = strtoul(optarg,0,0); sizetest = 1; break; case 'b': begin_set = 1; begin = atoi(optarg); break; case 'l': size_set = 1; length = atoi(optarg); break; default: usage(); } } if (argc - optind != 1 || skip_drive(argv[optind]) == argv[optind]) usage(); drive = get_drive(argv[optind], NULL); /* check out a drive whose letter and parameters match */ sprintf(errmsg, "Drive '%s:' not supported", drive); Stream = 0; for(dev=devices;dev->drive;dev++) { FREE(&(Stream)); /* drive letter */ if (strcmp(dev->drive, drive) != 0) continue; if (dev->partition < 1 || dev->partition > 4) { sprintf(errmsg, "Drive '%c:' is not a partition", drive); continue; } used_dev = *dev; SET_INT(used_dev.tracks, argtracks); SET_INT(used_dev.heads, argheads); SET_INT(used_dev.sectors, argsectors); expand(dev->name, name); Stream = SimpleFileOpen(&used_dev, dev, name, dirty ? O_RDWR : O_RDONLY, errmsg, open2flags, 1, 0); if (!Stream) { #ifdef HAVE_SNPRINTF snprintf(errmsg,199,"init: open: %s", strerror(errno)); #else sprintf(errmsg,"init: open: %s", strerror(errno)); #endif continue; } /* try to find out the size */ if(!sizetest) tot_sectors = 0; if(IS_SCSI(dev)) { unsigned char cmd[10]; unsigned char data[10]; cmd[0] = SCSI_READ_CAPACITY; memset ((void *) &cmd[2], 0, 8); memset ((void *) &data[0], 137, 10); scsi_cmd(get_fd(Stream), cmd, 10, SCSI_IO_READ, data, 10, get_extra_data(Stream)); tot_sectors = 1 + (data[0] << 24) + (data[1] << 16) + (data[2] << 8) + (data[3] ); if(verbose) printf("%d sectors in total\n", tot_sectors); } #ifdef OS_linux if (tot_sectors == 0) { ioctl(get_fd(Stream), BLKGETSIZE, &tot_sectors); } #endif /* read the partition table */ if (READS(Stream, (char *) buf, 0, 512) != 512) { #ifdef HAVE_SNPRINTF snprintf(errmsg, 199, "Error reading from '%s', wrong parameters?", name); #else sprintf(errmsg, "Error reading from '%s', wrong parameters?", name); #endif continue; } if(verbose>=2) print_sector("Read sector", buf, 512); break; } /* print error msg if needed */ if ( dev->drive == 0 ){ FREE(&Stream); fprintf(stderr,"%s: %s\n", argv[0],errmsg); exit(1); } if((used_dev.sectors || used_dev.heads) && (!used_dev.sectors || !used_dev.heads)) { fprintf(stderr,"You should either indicate both the number of sectors and the number of heads,\n"); fprintf(stderr," or none of them\n"); exit(1); } if(initialize) { if (bootSector) { int fd; fd = open(bootSector, O_RDONLY); if (fd < 0) { perror("open boot sector"); exit(1); } read(fd, (char *) buf, 512); } memset((char *)(partTable+1), 0, 4*sizeof(*partTable)); set_dword(((unsigned char*)buf)+510, 0xaa55); } /* check for boot signature, and place it if needed */ if((buf[510] != 0x55) || (buf[511] != 0xaa)) { fprintf(stderr,"Boot signature not set\n"); fprintf(stderr, "Use the -I flag to initialize the partition table, and set the boot signature\n"); inconsistency = 1; } if(remove){ if(!partTable[dev->partition].sys_ind) fprintf(stderr, "Partition for drive %c: does not exist\n", drive); if((partTable[dev->partition].sys_ind & 0x3f) == 5) { fprintf(stderr, "Partition for drive %c: may be an extended partition\n", drive); fprintf(stderr, "Use the -f flag to remove it anyways\n"); inconsistency = 1; } memset(&partTable[dev->partition], 0, sizeof(*partTable)); } if(create && partTable[dev->partition].sys_ind) { fprintf(stderr, "Partition for drive %c: already exists\n", drive); fprintf(stderr, "Use the -r flag to remove it before attempting to recreate it\n"); } /* find out number of heads and sectors, and whether there is * any activated partition */ has_activated = 0; for(i=1; i<5; i++){ if(!partTable[i].sys_ind) continue; if(partTable[i].boot_ind) has_activated++; /* set geometry from entry */ if (!used_dev.heads) used_dev.heads = head(partTable[i].end)+1; if(!used_dev.sectors) used_dev.sectors = sector(partTable[i].end); if(i<dev->partition && !begin_set) begin = END(partTable[i]); if(i>dev->partition && !end_set && !size_set) { end = BEGIN(partTable[i]); end_set = 1; } } #ifdef OS_linux if(!used_dev.sectors && !used_dev.heads) { if(!IS_SCSI(dev)) { struct hd_geometry geom; if(ioctl(get_fd(Stream), HDIO_GETGEO, &geom) == 0) { used_dev.heads = geom.heads; used_dev.sectors = geom.sectors; } } } #endif if(!used_dev.sectors && !used_dev.heads) { if(tot_sectors) setsize0(tot_sectors,&dummy2,&used_dev.heads, &used_dev.sectors); else { used_dev.heads = 64; used_dev.sectors = 32; } } if(verbose) fprintf(stderr,"sectors: %d heads: %d %d\n", used_dev.sectors, used_dev.heads, tot_sectors); sec_per_cyl = used_dev.sectors * used_dev.heads; if(create) { if(!end_set && tot_sectors) { end = tot_sectors - tot_sectors % sec_per_cyl; end_set = 1; } /* if the partition starts right at the beginning of * the disk, keep one track unused to allow place for * the master boot record */ if(!begin && !begin_set) begin = used_dev.sectors; if(!size_set && used_dev.tracks) { size_set = 2; length = sec_per_cyl * used_dev.tracks; /* round the size in order to take * into account any "hidden" sectors */ /* do we anchor this at the beginning ?*/ if(begin_set || dev->partition <= 2 || !end_set) length -= begin % sec_per_cyl; else if(end - length < begin) /* truncate any overlap */ length = end - begin; } if(size_set) { if(!begin_set && dev->partition >2 && end_set) begin = end - length; else end = begin + length; } else if(!end_set) { fprintf(stderr,"Unknown size\n"); exit(1); } setBeginEnd(&partTable[dev->partition], begin, end, used_dev.heads, used_dev.sectors, !has_activated, type); } if(activate) { if(!partTable[dev->partition].sys_ind) { fprintf(stderr, "Partition for drive %c: does not exist\n", drive); } else { switch(activate) { case 1: partTable[dev->partition].boot_ind=0x80; break; case -1: partTable[dev->partition].boot_ind=0x00; break; } } } inconsistency |= consistencyCheck(partTable, doprint, verbose, &has_activated, &last_end, &j, &used_dev, dev->partition); if(doprint && !inconsistency && partTable[dev->partition].sys_ind) { printf("The following command will recreate the partition for drive %c:\n", drive); used_dev.tracks = (_DWORD(partTable[dev->partition].nr_sects) + (BEGIN(partTable[dev->partition]) % sec_per_cyl)) / sec_per_cyl; printf("mpartition -c -t %d -h %d -s %d -b %u %c:\n", used_dev.tracks, used_dev.heads, used_dev.sectors, BEGIN(partTable[dev->partition]), drive); } if(tot_sectors && last_end >tot_sectors) { fprintf(stderr, "Partition %d exceeds beyond end of disk\n", j); exit(1); } switch(has_activated) { case 0: fprintf(stderr, "Warning: no active (bootable) partition present\n"); break; case 1: break; default: fprintf(stderr, "Warning: %d active (bootable) partitions present\n", has_activated); fprintf(stderr, "Usually, a disk should have exactly one active partition\n"); break; } if(inconsistency && !force) { fprintf(stderr, "inconsistency detected!\n" ); if(dirty) fprintf(stderr, "Retry with the -f switch to go ahead anyways\n"); exit(1); } if(dirty) { /* write data back to the disk */ if(verbose>=2) print_sector("Writing sector", buf, 512); if (WRITES(Stream, (char *) buf, 0, 512) != 512) { fprintf(stderr,"Error writing partition table"); exit(1); } if(verbose>=3) print_sector("Sector written", buf, 512); FREE(&Stream); } exit(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_MSDOS_H #define MTOOLS_MSDOS_H /* * msdos common header file */ #define MAX_SECTOR 8192 /* largest sector size */ #define MDIR_SIZE 32 /* MSDOS directory entry size in bytes*/ #define MAX_CLUSTER 8192 /* largest cluster size */ #define MAX_PATH 128 /* largest MSDOS path length */ #define MAX_DIR_SECS 64 /* largest directory (in sectors) */ #define MSECTOR_SIZE msector_size #define NEW 1 #define OLD 0 #define _WORD(x) ((unsigned char)(x)[0] + (((unsigned char)(x)[1]) << 8)) #define _DWORD(x) (_WORD(x) + (_WORD((x)+2) << 16)) #define DELMARK ((char) 0xe5) struct directory { char name[8]; /* 0 file name */ char ext[3]; /* 8 file extension */ unsigned char attr; /* 11 attribute byte */ unsigned char Case; /* 12 case of short filename */ unsigned char ctime_ms; /* 13 creation time, milliseconds (?) */ unsigned char ctime[2]; /* 14 creation time */ unsigned char cdate[2]; /* 16 creation date */ unsigned char adate[2]; /* 18 last access date */ unsigned char startHi[2]; /* 20 start cluster, Hi */ unsigned char time[2]; /* 22 time stamp */ unsigned char date[2]; /* 24 date stamp */ unsigned char start[2]; /* 26 starting cluster number */ unsigned char size[4]; /* 28 size of the file */ }; #define EXTCASE 0x10 #define BASECASE 0x8 #define MAX32 0xffffffff #define MAX_SIZE 0x7fffffff #define FILE_SIZE(dir) (_DWORD((dir)->size)) #define START(dir) (_WORD((dir)->start)) #define STARTHI(dir) (_WORD((dir)->startHi)) /* ASSUMPTION: long is at least 32 bits */ UNUSED(static inline void set_dword(unsigned char *data, unsigned long value)) { data[3] = (value >> 24) & 0xff; data[2] = (value >> 16) & 0xff; data[1] = (value >> 8) & 0xff; data[0] = (value >> 0) & 0xff; } /* ASSUMPTION: short is at least 16 bits */ UNUSED(static inline void set_word(unsigned char *data, unsigned short value)) { data[1] = (value >> 8) & 0xff; data[0] = (value >> 0) & 0xff; } /* * hi byte | low byte * |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0| * | | | | | | | | | | | | | | | | | * \ 7 bits /\4 bits/\ 5 bits / * year +80 month day */ #define DOS_YEAR(dir) (((dir)->date[1] >> 1) + 1980) #define DOS_MONTH(dir) (((((dir)->date[1]&0x1) << 3) + ((dir)->date[0] >> 5))) #define DOS_DAY(dir) ((dir)->date[0] & 0x1f) /* * hi byte | low byte * |7|6|5|4|3|2|1|0|7|6|5|4|3|2|1|0| * | | | | | | | | | | | | | | | | | * \ 5 bits /\ 6 bits /\ 5 bits / * hour minutes sec*2 */ #define DOS_HOUR(dir) ((dir)->time[1] >> 3) #define DOS_MINUTE(dir) (((((dir)->time[1]&0x7) << 3) + ((dir)->time[0] >> 5))) #define DOS_SEC(dir) (((dir)->time[0] & 0x1f) * 2) typedef struct InfoSector_t { unsigned char signature1[4]; unsigned char filler1[0x1e0]; unsigned char signature2[4]; unsigned char count[4]; unsigned char pos[4]; unsigned char filler2[14]; unsigned char signature3[2]; } InfoSector_t; #define INFOSECT_SIGNATURE1 0x41615252 #define INFOSECT_SIGNATURE2 0x61417272 typedef struct label_blk_t { unsigned char physdrive; /* 36 physical drive ? */ unsigned char reserved; /* 37 reserved */ unsigned char dos4; /* 38 dos > 4.0 diskette */ unsigned char serial[4]; /* 39 serial number */ char label[11]; /* 43 disk label */ char fat_type[8]; /* 54 FAT type */ } label_blk_t; /* FAT32 specific info in the bootsector */ typedef struct fat32_t { unsigned char bigFat[4]; /* 36 nb of sectors per FAT */ unsigned char extFlags[2]; /* 40 extension flags */ unsigned char fsVersion[2]; /* 42 ? */ unsigned char rootCluster[4]; /* 44 start cluster of root dir */ unsigned char infoSector[2]; /* 48 changeable global info */ unsigned char backupBoot[2]; /* 50 back up boot sector */ unsigned char reserved[6]; /* 52 ? */ unsigned char reserved2[6]; /* 52 ? */ struct label_blk_t labelBlock; } fat32; /* ends at 58 */ typedef struct oldboot_t { struct label_blk_t labelBlock; unsigned char res_2m; /* 62 reserved by 2M */ unsigned char CheckSum; /* 63 2M checksum (not used) */ unsigned char fmt_2mf; /* 64 2MF format version */ unsigned char wt; /* 65 1 if write track after format */ unsigned char rate_0; /* 66 data transfer rate on track 0 */ unsigned char rate_any; /* 67 data transfer rate on track<>0 */ unsigned char BootP[2]; /* 68 offset to boot program */ unsigned char Infp0[2]; /* 70 T1: information for track 0 */ unsigned char InfpX[2]; /* 72 T2: information for track<>0 */ unsigned char InfTm[2]; /* 74 T3: track sectors size table */ unsigned char DateF[2]; /* 76 Format date */ unsigned char TimeF[2]; /* 78 Format time */ unsigned char junk[1024 - 80]; /* 80 remaining data */ } oldboot_t; struct bootsector { unsigned char jump[3]; /* 0 Jump to boot code */ char banner[8] PACKED; /* 3 OEM name & version */ unsigned char secsiz[2] PACKED; /* 11 Bytes per sector hopefully 512 */ unsigned char clsiz; /* 13 Cluster size in sectors */ unsigned char nrsvsect[2]; /* 14 Number of reserved (boot) sectors */ unsigned char nfat; /* 16 Number of FAT tables hopefully 2 */ unsigned char dirents[2] PACKED;/* 17 Number of directory slots */ unsigned char psect[2] PACKED; /* 19 Total sectors on disk */ unsigned char descr; /* 21 Media descriptor=first byte of FAT */ unsigned char fatlen[2]; /* 22 Sectors in FAT */ unsigned char nsect[2]; /* 24 Sectors/track */ unsigned char nheads[2]; /* 26 Heads */ unsigned char nhs[4]; /* 28 number of hidden sectors */ unsigned char bigsect[4]; /* 32 big total sectors */ union { struct fat32_t fat32; struct oldboot_t old; } ext; }; #define CHAR(x) (boot->x[0]) #define WORD(x) (_WORD(boot->x)) #define DWORD(x) (_DWORD(boot->x)) #define OFFSET(x) (((char *) (boot->x)) - ((char *)(boot->jump))) extern struct OldDos_t { int tracks; int sectors; int heads; int dir_len; int cluster_size; int fat_len; int media; } old_dos[]; #define FAT12 4085 /* max. number of clusters described by a 12 bit FAT */ #define FAT16 65525 #define ATTR_ARCHIVE 0x20 #define ATTR_DIR 0x10 #define ATTR_LABEL 0x8 #define ATTR_SYSTEM 0x4 #define ATTR_HIDDEN 0x2 #define ATTR_READONLY 0x1 #define HAS_BIT(entry,x) ((entry)->dir.attr & (x)) #define IS_ARCHIVE(entry) (HAS_BIT((entry),ATTR_ARCHIVE)) #define IS_DIR(entry) (HAS_BIT((entry),ATTR_DIR)) #define IS_LABEL(entry) (HAS_BIT((entry),ATTR_LABEL)) #define IS_SYSTEM(entry) (HAS_BIT((entry),ATTR_SYSTEM)) #define IS_HIDDEN(entry) (HAS_BIT((entry),ATTR_HIDDEN)) #define IS_READONLY(entry) (HAS_BIT((entry),ATTR_READONLY)) #define MAX_SECT_PER_CLUSTER 64 /* Experimentally, it turns out that DOS only accepts cluster sizes * which are powers of two, and less than 128 sectors (else it gets a * divide overflow) */ #define FAT_SIZE(bits, sec_siz, clusters) \ ((((clusters)+2) * ((bits)/4) - 1) / 2 / (sec_siz) + 1) #define NEEDED_FAT_SIZE(x) FAT_SIZE((x)->fat_bits, (x)->sector_size, \ (x)->num_clus) /* disk size taken by FAT and clusters */ #define DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) \ ((n) * FAT_SIZE(bits, sec_siz, clusters) + \ (clusters) * (cluster_size)) #define TOTAL_DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) \ (DISK_SIZE(bits, sec_siz, clusters, n, cluster_size) + 2) /* approx. total disk size: assume 1 boot sector and one directory sector */ extern const char *mversion; extern const char *mdate; extern char *Version; extern char *Date; int init(char drive, int mode); #define MT_READ 1 #define MT_WRITE 2 #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mcopy.c * Copy an MSDOS files to and from Unix * */ #define LOWERCASE #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "mainloop.h" #include "plain_io.h" #include "nameclash.h" #include "file.h" #include "fs.h" typedef struct Arg_t { char *target; MainParam_t mp; ClashHandling_t ch; Stream_t *sourcefile; } Arg_t; static int dos_showfat(direntry_t *entry, MainParam_t *mp) { Stream_t *File=mp->File; fprintPwd(stdout, entry,0); putchar(' '); printFat(File); printf("\n"); return GOT_ONE; } static int unix_showfat(MainParam_t *mp) { fprintf(stderr,"File does not reside on a Dos fs\n"); return ERROR_ONE; } static void usage(void) { fprintf(stderr, "Mtools version %s, dated %s\n", mversion, mdate); fprintf(stderr, "Usage: %s file ...\n", progname); exit(1); } void mshowfat(int argc, char **argv, int mtype) { Arg_t arg; int c, ret; /* get command line options */ init_clash_handling(& arg.ch); /* get command line options */ while ((c = getopt(argc, argv, "")) != EOF) { switch (c) { case '?': usage(); break; } } if (argc - optind < 1) usage(); /* only 1 file to copy... */ init_mp(&arg.mp); arg.mp.arg = (void *) &arg; arg.mp.callback = dos_showfat; arg.mp.unixcallback = unix_showfat; arg.mp.lookupflags = ACCEPT_PLAIN | ACCEPT_DIR | DO_OPEN; ret=main_loop(&arg.mp, argv + optind, argc - optind); exit(ret); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "partition.h" #include "vfat.h" const char *progname; static const struct dispatch { const char *cmd; void (*fn)(int, char **, int); int type; } dispatch[] = { {"attrib",mattrib, 0}, {"badblocks",mbadblocks, 0}, {"cat",mcat, 0}, {"cd",mcd, 0}, {"copy",mcopy, 0}, {"del",mdel, 0}, {"deltree",mdel, 2}, {"dir",mdir, 0}, {"doctorfat",mdoctorfat, 0}, {"du",mdu, 0}, {"format",mformat, 0}, {"info", minfo, 0}, {"label",mlabel, 0}, {"md",mmd, 0}, {"mkdir",mmd, 0}, #ifdef OS_linux {"mount",mmount, 0}, #endif {"partition",mpartition, 0}, {"rd",mdel, 1}, {"rmdir",mdel, 1}, {"read",mcopy, 0}, {"move",mmove, 0}, {"ren",mmove, 1}, {"showfat", mshowfat, 0}, #ifndef NO_CONFIG {"toolstest", mtoolstest, 0}, #endif {"type",mcopy, 1}, {"write",mcopy, 0}, #ifndef OS_Minix {"zip", mzip, 0} #endif }; #define NDISPATCH (sizeof dispatch / sizeof dispatch[0]) int main(int argc,char **argv) { const char *name; int i; init_privs(); #ifdef __EMX__ _wildcard(&argc,&argv); #endif /*#define PRIV_TEST*/ #ifdef PRIV_TEST { int euid; char command[100]; printf("INIT: %d %d\n", getuid(), geteuid()); drop_privs(); printf("DROP: %d %d\n", getuid(), geteuid()); reclaim_privs(); printf("RECLAIM: %d %d\n", getuid(), geteuid()); euid = geteuid(); if(argc & 1) { drop_privs(); printf("DROP: %d %d\n", getuid(), geteuid()); } if(!((argc-1) & 2)) { destroy_privs(); printf("DESTROY: %d %d\n", getuid(), geteuid()); } sprintf(command, "a.out %d", euid); system(command); return 1; } #endif #ifdef __EMX__ _wildcard(&argc,&argv); #endif /* check whether the compiler lays out structures in a sane way */ if(sizeof(struct partition) != 16 || sizeof(struct directory) != 32 || sizeof(struct vfat_subentry) !=32) { fprintf(stderr,"Mtools has not been correctly compiled\n"); fprintf(stderr,"Recompile it using a more recent compiler\n"); return 137; } #ifdef __EMX__ argv[0] = _getname(argv[0]); _remext(argv[0]); name = argv[0]; #else name = _basename(argv[0]); #endif #if 0 /* this allows the different tools to be called as "mtools -c <command>" ** where <command> is mdir, mdel, mcopy etcetera ** Mainly done for the BeOS, which doesn't support links yet. */ if(argc >= 3 && !strcmp(argv[1], "-c") && !strcmp(name, "mtools")) { argc-=2; argv+=2; name = argv[0]; } #endif /* print the version */ if(argc >= 2 && (strcmp(argv[1], "-V") == 0 || strcmp(argv[1], "--version") ==0)) { printf("%c%s version %s, dated %s\n", toupper(name[0]), name+1, mversion, mdate); printf("configured with the following options: "); #ifdef USE_XDF printf("enable-xdf "); #else printf("disable-xdf "); #endif #ifdef USING_VOLD printf("enable-vold "); #else printf("disable-vold "); #endif #ifdef USING_NEW_VOLD printf("enable-new-vold "); #else printf("disable-new-vold "); #endif #ifdef DEBUG printf("enable-debug "); #else printf("disable-debug "); #endif #ifdef USE_RAWTERM printf("enable-raw-term "); #else printf("disable-raw-term "); #endif printf("\n"); return 0; } if (argc >= 2 && strcmp(name, "mtools") == 0) { /* mtools command ... */ argc--; argv++; name = argv[0]; } progname = argv[0]; read_config(); setup_signal(); for (i = 0; i < NDISPATCH; i++) { if (!strcmp(name,dispatch[i].cmd) || (name[0] == 'm' && !strcmp(name+1,dispatch[i].cmd))) dispatch[i].fn(argc, argv, dispatch[i].type); } if (strcmp(name,"mtools")) fprintf(stderr,"Unknown mtools command '%s'\n",name); fprintf(stderr,"Usage: mtools [-V] command [-options] arguments ...\n"); fprintf(stderr,"Supported commands:"); for (i = 0; i < NDISPATCH; i++) { fprintf(stderr, i%8 == 0 ? "\n\t" : ", "); fprintf(stderr, "%s", dispatch[i].cmd); } putc('\n', stderr); fprintf(stderr, "Use 'mtools command -?' for help per command\n"); return 1; } ���������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_MTOOLS_H #define MTOOLS_MTOOLS_H #include "msdos.h" #if defined(OS_sco3) #define MAXPATHLEN 1024 #include <signal.h> extern int lockf(int, int, off_t); /* SCO has no proper include file for lockf */ #endif #define SCSI_FLAG 1 #define PRIV_FLAG 2 #define NOLOCK_FLAG 4 #define USE_XDF_FLAG 8 #define MFORMAT_ONLY_FLAG 16 #define VOLD_FLAG 32 #define FLOPPYD_FLAG 64 #define FILTER_FLAG 128 #define IS_SCSI(x) ((x) && ((x)->misc_flags & SCSI_FLAG)) #define IS_PRIVILEGED(x) ((x) && ((x)->misc_flags & PRIV_FLAG)) #define IS_NOLOCK(x) ((x) && ((x)->misc_flags & NOLOCK_FLAG)) #define IS_MFORMAT_ONLY(x) ((x) && ((x)->misc_flags & MFORMAT_ONLY_FLAG)) #define SHOULD_USE_VOLD(x) ((x)&& ((x)->misc_flags & VOLD_FLAG)) #define SHOULD_USE_XDF(x) ((x)&& ((x)->misc_flags & USE_XDF_FLAG)) typedef struct device { const char *name; /* full path to device */ char *drive; /* the drive letter / device name */ int fat_bits; /* FAT encoding scheme */ unsigned int mode; /* any special open() flags */ unsigned int tracks; /* tracks */ unsigned int heads; /* heads */ unsigned int sectors; /* sectors */ unsigned int hidden; /* number of hidden sectors. Used for * mformatting partitioned devices */ off_t offset; /* skip this many bytes */ unsigned int partition; unsigned int misc_flags; /* Linux only stuff */ unsigned int ssize; unsigned int use_2m; char *precmd; /* command to be executed before opening * the drive */ /* internal variables */ int file_nr; /* used during parsing */ int blocksize; /* size of disk block in bytes */ const char *cfg_filename; /* used for debugging purposes */ } device_t; #ifndef OS_linux #define BOOTSIZE 512 #else #define BOOTSIZE 256 #endif #include "stream.h" extern const char *short_illegals, *long_illegals; #define maximize(target, max) do { \ if(max < 0) { \ if(target > 0) \ target = 0; \ } else if(target > max) { \ target = max; \ } \ } while(0) #define minimize(target, min) do { \ if(target < min) \ target = min; \ } while(0) int init_geom(int fd, struct device *dev, struct device *orig_dev, struct stat *stat); int readwrite_sectors(int fd, /* file descriptor */ int *drive, int rate, int seektrack, int track, int head, int sector, int size, /* address */ char *data, int bytes, int direction, int retries); int lock_dev(int fd, int mode, struct device *dev); char *unix_normalize (char *ans, char *name, char *ext); char *dos_name(char *filename, int verbose, int *mangled, char *buffer); struct directory *mk_entry(const char *filename, char attr, unsigned int fat, size_t size, time_t date, struct directory *ndir); int copyfile(Stream_t *Source, Stream_t *Target); int getfreeMinClusters(Stream_t *Stream, size_t ref); FILE *opentty(int mode); int is_dir(Stream_t *Dir, char *path); void bufferize(Stream_t **Dir); int dir_grow(Stream_t *Dir, int size); int match(const char *, const char *, char *, int, int); char *unix_name(char *name, char *ext, char Case, char *answer); void *safe_malloc(size_t size); Stream_t *open_filter(Stream_t *Next); extern int got_signal; /* int do_gotsignal(char *, int); #define got_signal do_gotsignal(__FILE__, __LINE__) */ void setup_signal(void); #define SET_INT(target, source) \ if(source)target=source UNUSED(static inline int compare (long ref, long testee)) { return (ref && ref != testee); } Stream_t *GetFs(Stream_t *Fs); char *label_name(char *filename, int verbose, int *mangled, char *ans); /* environmental variables */ extern unsigned int mtools_skip_check; extern unsigned int mtools_fat_compatibility; extern unsigned int mtools_ignore_short_case; extern unsigned int mtools_no_vfat; extern unsigned int mtools_numeric_tail; extern unsigned int mtools_dotted_dir; extern unsigned int mtools_twenty_four_hour_clock; extern char *mtools_date_string; extern unsigned int mtools_rate_0, mtools_rate_any; extern int mtools_raw_tty; extern int batchmode; void read_config(void); extern struct device *devices; extern struct device const_devices[]; extern const int nr_const_devices; #define New(type) ((type*)(malloc(sizeof(type)))) #define Grow(adr,n,type) ((type*)(realloc((char *)adr,n*sizeof(type)))) #define Free(adr) (free((char *)adr)); #define NewArray(size,type) ((type*)(calloc((size),sizeof(type)))) void mattrib(int argc, char **argv, int type); void mbadblocks(int argc, char **argv, int type); void mcat(int argc, char **argv, int type); void mcd(int argc, char **argv, int type); void mcopy(int argc, char **argv, int type); void mdel(int argc, char **argv, int type); void mdir(int argc, char **argv, int type); void mdoctorfat(int argc, char **argv, int type); void mdu(int argc, char **argv, int type); void mformat(int argc, char **argv, int type); void minfo(int argc, char **argv, int type); void mlabel(int argc, char **argv, int type); void mmd(int argc, char **argv, int type); void mmount(int argc, char **argv, int type); void mmove(int argc, char **argv, int type); void mpartition(int argc, char **argv, int type); void mshowfat(int argc, char **argv, int mtype); void mtoolstest(int argc, char **argv, int type); void mzip(int argc, char **argv, int type); extern int noPrivileges; void init_privs(void); void reclaim_privs(void); void drop_privs(void); void destroy_privs(void); uid_t get_real_uid(void); void closeExec(int fd); extern const char *progname; void precmd(struct device *dev); void print_sector(char *message, unsigned char *data, int size); time_t getTimeNow(time_t *now); #ifdef USING_NEW_VOLD char *getVoldName(struct device *dev, char *name); #endif Stream_t *OpenDir(Stream_t *Parent, const char *filename); /* int unix_dir_loop(Stream_t *Stream, MainParam_t *mp); int unix_loop(MainParam_t *mp, char *arg); */ struct dirCache_t **getDirCacheP(Stream_t *Stream); int isRootDir(Stream_t *Stream); unsigned int getStart(Stream_t *Dir, struct directory *dir); unsigned int countBlocks(Stream_t *Dir, unsigned int block); char *getDrive(Stream_t *Stream); void printOom(void); int ask_confirmation(const char *, const char *, const char *); char *get_homedir(void); #define EXPAND_BUF 2048 const char *expand(const char *, char *); const char *fix_mcwd(char *); FILE *open_mcwd(const char *mode); void unlink_mcwd(void); char *skip_drive(const char *path); char *get_drive(const char *path, const char *def); int safePopenOut(char **command, char *output, int len); #define ROUND_DOWN(value, grain) ((value) - (value) % (grain)) #define ROUND_UP(value, grain) ROUND_DOWN((value) + (grain)-1, (grain)) #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Paths of the configuration files. * This file may be changed by the user as needed. * There are three empty lines between each definition. * These ensure that "local" patches and official patches have * only a very low probability of conflicting. */ #define CONF_FILE "/etc/mtools.conf" #define OLD_CONF_FILE "/etc/mtools" #define LOCAL_CONF_FILE "/etc/default/mtools.conf" /* Use this if you like to keep the configuration file in a non-standard * place such as /etc/default, /opt/etc, /usr/etc, /usr/local/etc ... */ #define SYS_CONF_FILE SYSCONFDIR "/mtools.conf" #define OLD_LOCAL_CONF_FILE "/etc/default/mtools" #define CFG_FILE1 "/.mtoolsrc" /* END */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� nameclash.h��� partition.h��� patchlevel.c�� plain_io.c���� plain_io.h���� precmd.c������ privileges.c�� scsi.c�������� scsi.h�������� signal.c������ stream.c������ stream.h������ streamcache.c� subdir.c������! sysincludes.h�" toupper.c�����# tty.c���������$ unixdir.c�����% vfat.c��������& xdf_io.c������' xdf_io.h����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_NAMECLASH_H #define MTOOLS_NAMECLASH_H #include "stream.h" typedef enum clash_action { NAMEMATCH_NONE, NAMEMATCH_AUTORENAME, NAMEMATCH_QUIT, NAMEMATCH_SKIP, NAMEMATCH_RENAME, NAMEMATCH_PRENAME, /* renaming of primary name */ NAMEMATCH_OVERWRITE, NAMEMATCH_ERROR, NAMEMATCH_SUCCESS, NAMEMATCH_GREW } clash_action; /* clash handling structure */ typedef struct ClashHandling_t { clash_action action[2]; clash_action namematch_default[2]; int nowarn; /* Don't ask, just do default action if name collision*/ int got_slots; int mod_time; /* unsigned int dot; */ char *myname; unsigned char *dosname; int single; int use_longname; int ignore_entry; int source; /* to prevent the source from overwriting itself */ int source_entry; /* to account for the space freed up by the original * name */ char * (*name_converter)(char *filename, int verbose, int *mangled, char *ans); } ClashHandling_t; /* write callback */ typedef int (write_data_callback)(char *,char *, void *, struct direntry_t *); int mwrite_one(Stream_t *Dir, const char *argname, const char *shortname, write_data_callback *cb, void *arg, ClashHandling_t *ch); int handle_clash_options(ClashHandling_t *ch, char c); void init_clash_handling(ClashHandling_t *ch); Stream_t *createDir(Stream_t *Dir, const char *filename, ClashHandling_t *ch, unsigned char attr, time_t mtime); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������typedef struct hsc { unsigned char byte0; unsigned char head; /* starting head */ unsigned char sector; /* starting sector */ unsigned char cyl; /* starting cylinder */ } hsc; #define head(x) ((x).head) #define sector(x) ((x).sector & 0x3f) #define cyl(x) ((x).cyl | (((x).sector & 0xc0)<<2)) #define BEGIN(p) _DWORD((p).start_sect) #define END(p) (_DWORD((p).start_sect)+(_DWORD((p).nr_sects))) struct partition { hsc start; hsc end; unsigned char start_sect[4]; /* starting sector counting from 0 */ unsigned char nr_sects[4]; /* nr of sectors in partition */ }; #define boot_ind start.byte0 #define sys_ind end.byte0 int consistencyCheck(struct partition *partTable, int doprint, int verbose, int *has_activated, int *last_end, int *j, struct device *used_dev, int target_partition); void setBeginEnd(struct partition *partTable, int begin, int end, int heads, int sector, int activate, int type); ��������������������������������������������������������������������������������const char *mversion="3.9.7"; const char *mdate = "1 jun 2000"; ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Io to a plain file or device * * written by: * * Alain L. Knaff * alain@linux.lu * */ #include "sysincludes.h" #include "stream.h" #include "mtools.h" #include "msdos.h" #include "plain_io.h" #include "scsi.h" #include "partition.h" #include "llong.h" typedef struct SimpleFile_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; struct stat stat; int fd; mt_off_t offset; mt_off_t lastwhere; int seekable; int privileged; #ifdef OS_hpux int size_limited; #endif int scsi_sector_size; void *extra_data; /* extra system dependant information for scsi */ } SimpleFile_t; /* * Create an advisory lock on the device to prevent concurrent writes. * Uses either lockf, flock, or fcntl locking methods. See the Makefile * and the Configure files for how to specify the proper method. */ int lock_dev(int fd, int mode, struct device *dev) { #if (defined(HAVE_FLOCK) && defined (LOCK_EX) && defined(LOCK_NB)) /**/ #else /* FLOCK */ #if (defined(HAVE_LOCKF) && defined(F_TLOCK)) /**/ #else /* LOCKF */ #if (defined(F_SETLK) && defined(F_WRLCK)) struct flock flk; #endif /* FCNTL */ #endif /* LOCKF */ #endif /* FLOCK */ if(IS_NOLOCK(dev)) return 0; #if (defined(HAVE_FLOCK) && defined (LOCK_EX) && defined(LOCK_NB)) if (flock(fd, (mode ? LOCK_EX : LOCK_SH)|LOCK_NB) < 0) #else /* FLOCK */ #if (defined(HAVE_LOCKF) && defined(F_TLOCK)) if (mode && lockf(fd, F_TLOCK, 0) < 0) #else /* LOCKF */ #if (defined(F_SETLK) && defined(F_WRLCK)) flk.l_type = mode ? F_WRLCK : F_RDLCK; flk.l_whence = 0; flk.l_start = 0L; flk.l_len = 0L; if (fcntl(fd, F_SETLK, &flk) < 0) #endif /* FCNTL */ #endif /* LOCKF */ #endif /* FLOCK */ { if(errno == EINVAL #ifdef EOPNOTSUPP || errno == EOPNOTSUPP #endif ) return 0; else return 1; } return 0; } typedef int (*iofn) (int, char *, int); static int file_io(Stream_t *Stream, char *buf, mt_off_t where, int len, iofn io) { DeclareThis(SimpleFile_t); int ret; where += This->offset; if (This->seekable && where != This->lastwhere ){ if(mt_lseek( This->fd, where, SEEK_SET) < 0 ){ perror("seek"); This->lastwhere = (mt_off_t) -1; return -1; } } #ifdef OS_hpux /* * On HP/UX, we can not write more than MAX_LEN bytes in one go. * If more are written, the write fails with EINVAL */ #define MAX_SCSI_LEN (127*1024) if(This->size_limited && len > MAX_SCSI_LEN) len = MAX_SCSI_LEN; #endif ret = io(This->fd, buf, len); #ifdef OS_hpux if (ret == -1 && errno == EINVAL && /* if we got EINVAL */ len > MAX_SCSI_LEN) { This->size_limited = 1; len = MAX_SCSI_LEN; ret = io(This->fd, buf, len); } #endif if ( ret == -1 ){ perror("plain_io"); This->lastwhere = (mt_off_t) -1; return -1; } This->lastwhere = where + ret; return ret; } static int file_read(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { return file_io(Stream, buf, where, len, (iofn) read); } static int file_write(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { return file_io(Stream, buf, where, len, (iofn) write); } static int file_flush(Stream_t *Stream) { #if 0 DeclareThis(SimpleFile_t); return fsync(This->fd); #endif return 0; } static int file_free(Stream_t *Stream) { DeclareThis(SimpleFile_t); if (This->fd > 2) return close(This->fd); else return 0; } static int file_geom(Stream_t *Stream, struct device *dev, struct device *orig_dev, int media, struct bootsector *boot) { int ret; DeclareThis(SimpleFile_t); size_t tot_sectors; int BootP, Infp0, InfpX, InfTm; int sectors, j; unsigned char sum; int sect_per_track; struct label_blk_t *labelBlock; dev->ssize = 2; /* allow for init_geom to change it */ dev->use_2m = 0x80; /* disable 2m mode to begin */ if(media == 0xf0 || media >= 0x100){ dev->heads = WORD(nheads); dev->sectors = WORD(nsect); tot_sectors = DWORD(bigsect); SET_INT(tot_sectors, WORD(psect)); sect_per_track = dev->heads * dev->sectors; tot_sectors += sect_per_track - 1; /* round size up */ dev->tracks = tot_sectors / sect_per_track; BootP = WORD(ext.old.BootP); Infp0 = WORD(ext.old.Infp0); InfpX = WORD(ext.old.InfpX); InfTm = WORD(ext.old.InfTm); if(WORD(fatlen)) { labelBlock = &boot->ext.old.labelBlock; } else { labelBlock = &boot->ext.fat32.labelBlock; } if (boot->descr >= 0xf0 && labelBlock->dos4 == 0x29 && strncmp( boot->banner,"2M", 2 ) == 0 && BootP < 512 && Infp0 < 512 && InfpX < 512 && InfTm < 512 && BootP >= InfTm + 2 && InfTm >= InfpX && InfpX >= Infp0 && Infp0 >= 76 ){ for (sum=0, j=63; j < BootP; j++) sum += boot->jump[j];/* checksum */ dev->ssize = boot->jump[InfTm]; if (!sum && dev->ssize <= 7){ dev->use_2m = 0xff; dev->ssize |= 0x80; /* is set */ } } } else if (media >= 0xf8){ media &= 3; dev->heads = old_dos[media].heads; dev->tracks = old_dos[media].tracks; dev->sectors = old_dos[media].sectors; dev->ssize = 0x80; dev->use_2m = ~1; } else { fprintf(stderr,"Unknown media type\n"); exit(1); } sectors = dev->sectors; dev->sectors = dev->sectors * WORD(secsiz) / 512; #ifdef JPD printf("file_geom:media=%0X=>cyl=%d,heads=%d,sects=%d,ssize=%d,use2m=%X\n", media, dev->tracks, dev->heads, dev->sectors, dev->ssize, dev->use_2m); #endif ret = init_geom(This->fd,dev, orig_dev, &This->stat); dev->sectors = sectors; #ifdef JPD printf("f_geom: after init_geom(), sects=%d\n", dev->sectors); #endif return ret; } static int file_data(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address) { DeclareThis(SimpleFile_t); if(date) *date = This->stat.st_mtime; if(size) *size = This->stat.st_size; if(type) *type = S_ISDIR(This->stat.st_mode); if(address) *address = 0; return 0; } /* ZIP or other scsi device on Solaris or SunOS system. Since Sun won't accept a non-Sun label on a scsi disk, we must bypass Sun's disk interface and use low-level SCSI commands to read or write the ZIP drive. We thus replace the file_read and file_write routines with our own scsi_read and scsi_write routines, that use the uscsi ioctl interface. By James Dugal, jpd@usl.edu, 11-96. Tested under Solaris 2.5 and SunOS 4.3.1_u1 using GCC. Note: the mtools.conf entry for a ZIP drive would look like this: (solaris) drive C: file="/dev/rdsk/c0t5d0s2" partition=4 FAT=16 nodelay exclusive scsi=& (sunos) drive C: file="/dev/rsd5c" partition=4 FAT=16 nodelay exclusive scsi=1 Note 2: Sol 2.5 wants mtools to be suid-root, to use the ioctl. SunOS is happy if we just have access to the device, so making mtools sgid to a group called, say, "ziprw" which has rw permission on /dev/rsd5c, is fine. */ #define MAXBLKSPERCMD 255 static void scsi_init(SimpleFile_t *This) { int fd = This->fd; unsigned char cdb[10],buf[8]; memset(cdb, 0, sizeof cdb); memset(buf,0, sizeof(buf)); cdb[0]=SCSI_READ_CAPACITY; if (scsi_cmd(fd, (unsigned char *)cdb, sizeof(cdb), SCSI_IO_READ, buf, sizeof(buf), This->extra_data)==0) { This->scsi_sector_size= ((unsigned)buf[5]<<16)|((unsigned)buf[6]<<8)|(unsigned)buf[7]; if (This->scsi_sector_size != 512) fprintf(stderr," (scsi_sector_size=%d)\n",This->scsi_sector_size); } } int scsi_io(Stream_t *Stream, char *buf, mt_off_t where, size_t len, int rwcmd) { unsigned int firstblock, nsect; int clen,r,max; off_t offset; unsigned char cdb[10]; DeclareThis(SimpleFile_t); firstblock=truncBytes32((where + This->offset)/This->scsi_sector_size); /* 512,1024,2048,... bytes/sector supported */ offset=truncBytes32(where + This->offset - firstblock*This->scsi_sector_size); nsect=(offset+len+This->scsi_sector_size-1)/ This->scsi_sector_size; #if defined(OS_sun) && defined(OS_i386) if (This->scsi_sector_size>512) firstblock*=This->scsi_sector_size/512; /* work around a uscsi bug */ #endif /* sun && i386 */ if (len>512) { /* avoid buffer overruns. The transfer MUST be smaller or * equal to the requested size! */ while (nsect*This->scsi_sector_size>len) --nsect; F���G��G��G��G��G��G��G��G��G�� G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������if(!nsect) { fprintf(stderr,"Scsi buffer too small\n"); exit(1); } if(rwcmd == SCSI_IO_WRITE && offset) { /* there seems to be no memmove before a write */ fprintf(stderr,"Unaligned write\n"); exit(1); } /* a better implementation should use bounce buffers. * However, in normal operation no buffer overruns or * unaligned writes should happen anyways, as the logical * sector size is (hopefully!) equal to the physical one */ } max = scsi_max_length(); if (nsect > max) nsect=max; /* set up SCSI READ/WRITE command */ memset(cdb, 0, sizeof cdb); switch(rwcmd) { case SCSI_IO_READ: cdb[0] = SCSI_READ; break; case SCSI_IO_WRITE: cdb[0] = SCSI_WRITE; break; } cdb[1] = 0; if (firstblock > 0x1fffff || nsect > 0xff) { /* I suspect that the ZIP drive also understands Group 1 * commands. If that is indeed true, we may chose Group 1 * more agressively in the future */ cdb[0] |= SCSI_GROUP1; clen=10; /* SCSI Group 1 cmd */ /* this is one of the rare case where explicit coding is * more portable than macros... The meaning of scsi command * bytes is standardised, whereas the preprocessor macros * handling it might be not... */ cdb[2] = (unsigned char) (firstblock >> 24) & 0xff; cdb[3] = (unsigned char) (firstblock >> 16) & 0xff; cdb[4] = (unsigned char) (firstblock >> 8) & 0xff; cdb[5] = (unsigned char) firstblock & 0xff; cdb[6] = 0; cdb[7] = (unsigned char) (nsect >> 8) & 0xff; cdb[8] = (unsigned char) nsect & 0xff; cdb[9] = 0; } else { clen = 6; /* SCSI Group 0 cmd */ cdb[1] |= (unsigned char) ((firstblock >> 16) & 0x1f); cdb[2] = (unsigned char) ((firstblock >> 8) & 0xff); cdb[3] = (unsigned char) firstblock & 0xff; cdb[4] = (unsigned char) nsect; cdb[5] = 0; } if(This->privileged) reclaim_privs(); r=scsi_cmd(This->fd, (unsigned char *)cdb, clen, rwcmd, buf, nsect*This->scsi_sector_size, This->extra_data); if(This->privileged) drop_privs(); if(r) { perror(rwcmd == SCSI_IO_READ ? "SCMD_READ" : "SCMD_WRITE"); return -1; } #ifdef JPD printf("finished %u for %u\n", firstblock, nsect); #endif #ifdef JPD printf("zip: read or write OK\n"); #endif if (offset>0) memmove(buf,buf+offset,nsect*This->scsi_sector_size-offset); if (len==256) return 256; else if (len==512) return 512; else return nsect*This->scsi_sector_size-offset; } int scsi_read(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { #ifdef JPD printf("zip: to read %d bytes at %d\n", len, where); #endif return scsi_io(Stream, buf, where, len, SCSI_IO_READ); } int scsi_write(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { #ifdef JPD Printf("zip: to write %d bytes at %d\n", len, where); #endif return scsi_io(Stream, buf, where, len, SCSI_IO_WRITE); } static Class_t ScsiClass = { scsi_read, scsi_write, file_flush, file_free, file_geom, file_data, 0 /* pre-allocate */ }; static Class_t SimpleFileClass = { file_read, file_write, file_flush, file_free, file_geom, file_data, 0 /* pre_allocate */ }; Stream_t *SimpleFileOpen(struct device *dev, struct device *orig_dev, const char *name, int mode, char *errmsg, int mode2, int locked, mt_size_t *maxSize) { SimpleFile_t *This; #ifdef __EMX__ HFILE FileHandle; ULONG Action; APIRET rc; #endif This = New(SimpleFile_t); if (!This){ printOom(); return 0; } This->scsi_sector_size = 512; This->seekable = 1; #ifdef OS_hpux This->size_limited = 0; #endif This->Class = &SimpleFileClass; if (!name || strcmp(name,"-") == 0 ){ if (mode == O_RDONLY) This->fd = 0; else This->fd = 1; This->seekable = 0; This->refs = 1; This->Next = 0; This->Buffer = 0; if (fstat(This->fd, &This->stat) < 0) { Free(This); if(errmsg) #ifdef HAVE_SNPRINTF snprintf(errmsg,199,"Can't stat -: %s", strerror(errno)); #else sprintf(errmsg,"Can't stat -: %s", strerror(errno)); #endif return NULL; } return (Stream_t *) This; } if(dev) { if(!(mode2 & NO_PRIV)) This->privileged = IS_PRIVILEGED(dev); mode |= dev->mode; } precmd(dev); if(IS_PRIVILEGED(dev) && !(mode2 & NO_PRIV)) reclaim_privs(); #ifdef __EMX__ #define DOSOPEN_FLAGS (OPEN_FLAGS_DASD | OPEN_FLAGS_WRITE_THROUGH | \ OPEN_FLAGS_NOINHERIT | OPEN_FLAGS_RANDOM | \ OPEN_FLAGS_NO_CACHE) #define DOSOPEN_FD_ACCESS (OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE) #define DOSOPEN_HD_ACCESS (OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY) if (skip_drive(name) > name) { rc = DosOpen( name, &FileHandle, &Action, 0L, FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS, DOSOPEN_FLAGS | (IS_NOLOCK(dev)?DOSOPEN_HD_ACCESS:DOSOPEN_FD_ACCESS), 0L); #ifdef DEBUG if (rc != NO_ERROR) fprintf (stderr, "DosOpen() returned %d\n", rc); #endif if (!IS_NOLOCK(dev)) { rc = DosDevIOCtl( FileHandle, 0x08L, DSK_LOCKDRIVE, 0, 0, 0, 0, 0, 0); #ifdef DEBUG if (rc != NO_ERROR) fprintf (stderr, "DosDevIOCtl() returned %d\n", rc); #endif } if (rc == NO_ERROR) This->fd = _imphandle(FileHandle); else This->fd = -1; } else #endif { if (IS_SCSI(dev)) This->fd = scsi_open(name, mode, IS_NOLOCK(dev)?0444:0666, &This->extra_data); else This->fd = open(name, mode, IS_NOLOCK(dev)?0444:0666); } if(IS_PRIVILEGED(dev) && !(mode2 & NO_PRIV)) drop_privs(); if (This->fd < 0) { Free(This); if(errmsg) #ifdef HAVE_SNPRINTF snprintf(errmsg, 199, "Can't open %s: %s", name, strerror(errno)); #else sprintf(errmsg, "Can't open %s: %s", name, strerror(errno)); #endif return NULL; } if(IS_PRIVILEGED(dev) && !(mode2 & NO_PRIV)) closeExec(This->fd); #ifdef __EMX__ if (*(name+1) != ':') #endif if (fstat(This->fd, &This->stat) < 0){ Free(This); if(errmsg) { #ifdef HAVE_SNPRINTF snprintf(errmsg,199,"Can't stat %s: %s", name, strerror(errno)); #else if(strlen(name) > 50) { sprintf(errmsg,"Can't stat file: %s", strerror(errno)); } else { sprintf(errmsg,"Can't stat %s: %s", name, strerror(errno)); } #endif } return NULL; } #ifndef __EMX__ /* lock the device on writes */ if (locked && lock_dev(This->fd, mode == O_RDWR, dev)) { if(errmsg) #ifdef HAVE_SNPRINTF snprintf(errmsg,199, "plain floppy: device \"%s\" busy (%s):", dev ? dev->name : "unknown", strerror(errno)); #else sprintf(errmsg, "plain floppy: device \"%s\" busy (%s):", (dev && strlen(dev->name) < 50) ? dev->name : "unknown", strerror(errno)); #endif close(This->fd); Free(This); return NULL; } #endif /* set default parameters, if needed */ if (dev){ if ((IS_MFORMAT_ONLY(dev) || !dev->tracks) && init_geom(This->fd, dev, orig_dev, &This->stat)){ close(This->fd); Free(This); if(errmsg) sprintf(errmsg,"init: set default params"); return NULL; } This->offset = (mt_off_t) dev->offset; } else This->offset = 0; This->refs = 1; This->Next = 0; This->Buffer = 0; if(maxSize) { if (IS_SCSI(dev)) { *maxSize = MAX_OFF_T_B(31+log_2(This->scsi_sector_size)); } else { *maxSize = max_off_t_seek; } if(This->offset > *maxSize) { close(This->fd); Free(This); if(errmsg) sprintf(errmsg,"init: Big disks not supported"); return NULL; } *maxSize -= This->offset; } /* partitioned drive */ /* jpd@usl.edu: assume a partitioned drive on these 2 systems is a ZIP*/ /* or similar drive that must be accessed by low-level scsi commands */ /* AK: introduce new "scsi=1" statement to specifically set * this option. Indeed, there could conceivably be partitioned * devices where low level scsi commands will not be needed */ if(IS_SCSI(dev)) { This->Class = &ScsiClass; if(This->privileged) reclaim_privs(); scsi_init(This); if(This->privileged) drop_privs(); } while(!(mode2 & NO_OFFSET) && dev && dev->partition && dev->partition <= 4) { int has_activated, last_end, j; unsigned char buf[2048]; struct partition *partTable=(struct partition *)(buf+ 0x1ae); size_t partOff; /* read the first sector, or part of it */ if (force_read((Stream_t *)This, (char*) buf, 0, 512) != 512) break; if( _WORD(buf+510) != 0xaa55) break; partOff = BEGIN(partTable[dev->partition]); if (maxSize) { if (partOff > *maxSize >> 9) { close(This->fd); Free(This); if(errmsg) sprintf(errmsg,"init: Big disks not supported"); return NULL; } *maxSize -= (mt_off_t) partOff << 9; } This->offset += (mt_off_t) partOff << 9; if(!partTable[dev->partition].sys_ind) { if(errmsg) sprintf(errmsg, "init: non-existant partition"); close(This->fd); Free(This); return NULL; } if(!dev->tracks) { dev->heads = head(partTable[dev->partition].end)+1; dev->sectors = sector(partTable[dev->partition].end); dev->tracks = cyl(partTable[dev->partition].end) - cyl(partTable[dev->partition].start)+1; } dev->hidden=dev->sectors*head(partTable[dev->partition].start); if(!mtools_skip_check && consistencyCheck((struct partition *)(buf+0x1ae), 0, 0, &has_activated, &last_end, &j, dev, 0)) { fprintf(stderr, "Warning: inconsistent partition table\n"); fprintf(stderr, "Possibly unpartitioned device\n"); fprintf(stderr, "\n*** Maybe try without partition=%d in " "device definition ***\n\n", dev->partition); fprintf(stderr, "If this is a PCMCIA card, or a disk " "partitioned on another computer, this " "message may be in error: add " "mtools_skip_check=1 to your .mtoolsrc " "file to suppress this warning\n"); } break; /* NOTREACHED */ } This->lastwhere = -This->offset; /* provoke a seek on those devices that don't start on a partition * boundary */ return (Stream_t *) This; } int get_fd(Stream_t *Stream) { DeclareThis(SimpleFile_t); return This->fd; } void *get_extra_data(Stream_t *Stream) { DeclareThis(SimpleFile_t); return This->extra_data; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_PLAINIO_H #define MTOOLS_PLAINIO_H #include "stream.h" #include "msdos.h" #ifdef __EMX__ #include <io.h> #endif /* plain io */ #define NO_PRIV 1 #define NO_OFFSET 2 Stream_t *SimpleFileOpen(struct device *dev, struct device *orig_dev, const char *name, int mode, char *errmsg, int mode2, int locked, mt_size_t *maxSize); int check_parameters(struct device *ref, struct device *testee); int get_fd(Stream_t *Stream); void *get_extra_data(Stream_t *Stream); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Do filename expansion with the shell. */ #define EXPAND_BUF 2048 #include "sysincludes.h" #include "mtools.h" void precmd(struct device *dev) { int status; pid_t pid; if(!dev || !dev->precmd) return; switch((pid=fork())){ case -1: perror("Could not fork"); exit(1); break; case 0: /* the son */ execl("/bin/sh", "sh", "-c", dev->precmd, 0); break; default: wait(&status); break; } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" /*#define PRIV_DEBUG*/ #if 0 #undef HAVE_SETEUID #define HAVE_SETRESUID #include <asm/unistd.h> int setresuid(int a, int b, int c) { syscall(164, a, b, c); } #endif static inline void print_privs(const char *message) { #ifdef PRIV_DEBUG /* for debugging purposes only */ fprintf(stderr,"%s egid=%d rgid=%d\n", message, getegid(), getgid()); fprintf(stderr,"%s euid=%d ruid=%d\n", message, geteuid(), getuid()); #endif } int noPrivileges=0; static gid_t rgid, egid; static uid_t ruid, euid; /* privilege management routines for SunOS and Solaris. These are * needed in order to issue raw SCSI read/write ioctls. Mtools drops * its privileges at the beginning, and reclaims them just for the * above-mentioned ioctl's. Before popen(), exec() or system, it * drops its privileges completely, and issues a warning. */ /* group id handling is lots easyer, as long as we don't use group 0. * If you want to use group id's, create a *new* group mtools or * floppy. Chgrp any devices that you only want to be accessible to * mtools to this group, and give them the appropriate privs. Make * sure this group doesn't own any other files: be aware that any user * with access to mtools may mformat these files! */ static inline void Setuid(uid_t uid) { #if defined HAVE_SETEUID || defined HAVE_SETRESUID if(euid == 0) { #ifdef HAVE_SETEUID seteuid(uid); #else setresuid(ruid, uid, euid); #endif } else #endif setuid(uid); } /* In reclaim_privs and drop privs, we have to manipulate group privileges * when having no root privileges, else we might lose them */ void reclaim_privs(void) { if(noPrivileges) return; setgid(egid); Setuid(euid); print_privs("after reclaim privs, both uids should be 0 "); } void drop_privs(void) { Setuid(ruid); setgid(rgid); print_privs("after drop_privs, real should be 0, effective should not "); } void destroy_privs(void) { #if defined HAVE_SETEUID || defined HAVE_SETRESUID if(euid == 0) { #ifdef HAVE_SETEUID setuid(0); /* get the necessary privs to drop real root id */ setuid(ruid); /* this should be enough to get rid of the three * ids */ seteuid(ruid); /* for good measure... just in case we came * accross a system which implemented sane * semantics instead of POSIXly broken * semantics for setuid */ #else setresuid(ruid, ruid, ruid); #endif } #endif /* we also destroy group privileges */ drop_privs(); /* saved set [ug]id will go away by itself on exec */ print_privs("destroy_privs, no uid should be zero "); } uid_t get_real_uid(void) { return ruid; } void init_privs(void) { euid = geteuid(); ruid = getuid(); egid = getegid(); rgid = getgid(); #ifndef F_SETFD if(euid != ruid) { fprintf(stderr, "Setuid installation not supported on this platform\n"); fprintf(stderr, "Missing F_SETFD"); exit(1); } #endif if(euid == 0 && ruid != 0) { #ifdef HAVE_SETEUID setuid(0); /* set real uid to 0 */ #else #ifndef HAVE_SETRESUID /* on this machine, it is not possible to reversibly drop * root privileges. We print an error and quit */ /* BEOS is no longer a special case, as both euid and ruid * return 0, and thus we do not get any longer into this * branch */ fprintf(stderr, "Seteuid call not supported on this architecture.\n"); fprintf(stderr, "Mtools cannot be installed setuid root.\n"); fprintf(stderr, "However, it can be installed setuid to a non root"); fprintf(stderr, "user or setgid to any id.\n"); exit(1); #endif #endif } drop_privs(); print_privs("after init, real should be 0, effective should not "); } void closeExec(int fd) { #ifdef F_SETFD fcntl(fd, F_SETFD, 1); #endif } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * scsi.c * Iomega Zip/Jaz drive tool * change protection mode and eject disk */ /* scis.c by Markus Gyger <mgyger@itr.ch> */ /* This code is based on ftp://gear.torque.net/pub/ziptool.c */ /* by Grant R. Guenther with the following copyright notice: */ /* (c) 1996 Grant R. Guenther, based on work of Itai Nahshon */ /* http://www.torque.net/ziptool.html */ /* A.K. Moved this from mzip.c to a separate file in order to share with * plain_io.c */ #include "sysincludes.h" #include "mtools.h" #include "scsi.h" #if defined OS_hpux #include <sys/scsi.h> #endif #ifdef OS_solaris #include <sys/scsi/scsi.h> #endif /* solaris */ #ifdef OS_sunos #include <scsi/generic/commands.h> #include <scsi/impl/uscsi.h> #endif /* sunos */ #ifdef sgi #include <sys/dsreq.h> #endif #ifdef OS_linux #define SCSI_IOCTL_SEND_COMMAND 1 struct scsi_ioctl_command { int inlen; int outlen; char cmd[5008]; }; #endif #ifdef _SCO_DS #include <sys/scsicmd.h> #endif #if (defined(OS_freebsd)) && (__FreeBSD__ >= 2) #include <camlib.h> #endif int scsi_max_length(void) { #ifdef OS_linux return 8; #else return 255; #endif } int scsi_open(const char *name, int flag, int mode, void **extra_data) { #if (defined(OS_freebsd)) && (__FreeBSD__ >= 2) struct cam_device *cam_dev; cam_dev = cam_open_device(name, O_RDWR); *extra_data = (void *) cam_dev; if (cam_dev) return cam_dev->fd; else return -1; #else return open(name, O_RDONLY #ifdef O_NDELAY | O_NDELAY #endif /* O_RDONLY | dev->mode*/); #endif } int scsi_cmd(int fd, unsigned char *cdb, int cmdlen, scsi_io_mode_t mode, void *data, size_t len, void *extra_data) { #if defined OS_hpux struct sctl_io sctl_io; memset(&sctl_io, 0, sizeof sctl_io); /* clear reserved fields */ memcpy(sctl_io.cdb, cdb, cmdlen); /* copy command */ sctl_io.cdb_length = cmdlen; /* command length */ sctl_io.max_msecs = 2000; /* allow 2 seconds for cmd */ switch (mode) { case SCSI_IO_READ: sctl_io.flags = SCTL_READ; sctl_io.data_length = len; sctl_io.data = data; break; case SCSI_IO_WRITE: sctl_io.flags = 0; sctl_io.data_length = data ? len : 0; sctl_io.data = len ? data : 0; break; } if (ioctl(fd, SIOC_IO, &sctl_io) == -1) { perror("scsi_io"); return -1; } return sctl_io.cdb_status; #elif defined OS_sunos || defined OS_solaris struct uscsi_cmd uscsi_cmd; memset(&uscsi_cmd, 0, sizeof uscsi_cmd); uscsi_cmd.uscsi_cdb = (char *)cdb; uscsi_cmd.uscsi_cdblen = cmdlen; #ifdef OS_solaris uscsi_cmd.uscsi_timeout = 20; /* msec? */ #endif /* solaris */ uscsi_cmd.uscsi_buflen = (u_int)len; uscsi_cmd.uscsi_bufaddr = data; switch (mode) { case SCSI_IO_READ: uscsi_cmd.uscsi_flags = USCSI_READ; break; case SCSI_IO_WRITE: uscsi_cmd.uscsi_flags = USCSI_WRITE; break; } if (ioctl(fd, USCSICMD, &uscsi_cmd) == -1) { perror("scsi_io"); return -1; } if(uscsi_cmd.uscsi_status) { errno = 0; fprintf(stderr,"scsi status=%x\n", (unsigned short)uscsi_cmd.uscsi_status); return -1; } return 0; #elif defined OS_linux struct scsi_ioctl_command scsi_cmd; memcpy(scsi_cmd.cmd, cdb, cmdlen); /* copy command */ switch (mode) { case SCSI_IO_READ: scsi_cmd.inlen = 0; scsi_cmd.outlen = len; break; case SCSI_IO_WRITE: scsi_cmd.inlen = len; scsi_cmd.outlen = 0; memcpy(scsi_cmd.cmd + cmdlen,data,len); break; } if (ioctl(fd, SCSI_IOCTL_SEND_COMMAND, &scsi_cmd) < 0) { perror("scsi_io"); return -1; } switch (mode) { case SCSI_IO_READ: memcpy(data, &scsi_cmd.cmd[0], len); break; case SCSI_IO_WRITE: break; } return 0; /* where to get scsi status? */ #elif defined _SCO_DS struct scsicmd scsi_cmd; memset(scsi_cmd.cdb, 0, SCSICMDLEN); /* ensure zero pad */ memcpy(scsi_cmd.cdb, cdb, cmdlen); scsi_cmd.cdb_len = cmdlen; scsi_cmd.data_len = len; scsi_cmd.data_ptr = data; scsi_cmd.is_write = mode == SCSI_IO_WRITE; if (ioctl(fd,SCSIUSERCMD,&scsi_cmd) == -1) { perror("scsi_io"); printf("scsi status: host=%x; target=%x\n", (unsigned)scsi_cmd.host_sts,(unsigned)scsi_cmd.target_sts); return -1; } return 0; #elif defined sgi struct dsreq scsi_cmd; scsi_cmd.ds_cmdbuf = (char *)cdb; scsi_cmd.ds_cmdlen = cmdlen; scsi_cmd.ds_databuf = data; scsi_cmd.ds_datalen = len; switch (mode) { case SCSI_IO_READ: scsi_cmd.ds_flags = DSRQ_READ|DSRQ_SENSE; break; case SCSI_IO_WRITE: scsi_cmd.ds_flags = DSRQ_WRITE|DSRQ_SENSE; break; } scsi_cmd.ds_time = 10000; scsi_cmd.ds_link = 0; scsi_cmd.ds_synch =0; scsi_cmd.ds_ret =0; if (ioctl(fd, DS_ENTER, &scsi_cmd) == -1) { perror("scsi_io"); return -1; } if(scsi_cmd.ds_status) { errno = 0; fprintf(stderr,"scsi status=%x\n", (unsigned short)scsi_cmd.ds_status); return -1; } return 0; #elif (defined OS_freebsd) && (__FreeBSD__ >= 2) #define MSG_SIMPLE_Q_TAG 0x20 /* O/O */ union ccb *ccb; int flags; int r; struct cam_device *cam_dev = (struct cam_device *) extra_data; if (cam_dev==NULL || cam_dev->fd!=fd) { fprintf(stderr,"invalid file descriptor\n"); return -1; } ccb = cam_getccb(cam_dev); bcopy(cdb, ccb->csio.cdb_io.cdb_bytes, cmdlen); if (mode == SCSI_IO_READ) flags = CAM_DIR_IN; else if (data && len) flags = CAM_DIR_OUT; else flags = CAM_DIR_NONE; cam_fill_csio(&ccb->csio, /* retry */ 1, /* cbfcnp */ NULL, flags, /* tag_action */ MSG_SIMPLE_Q_TAG, /*data_ptr*/ len ? data : 0, /*data_len */ data ? len : 0, 96, cmdlen, 5000); if (cam_send_ccb(cam_dev, ccb) < 0 || (ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { return -1; } return 0; #else fprintf(stderr, "scsi_io not implemented\n"); return -1; #endif } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef __mtools_scsi_h #define __mtools_scsi_h #define SCSI_READ 0x8 #define SCSI_WRITE 0xA #define SCSI_IOMEGA 0xC #define SCSI_INQUIRY 0x12 #define SCSI_MODE_SENSE 0x1a #define SCSI_START_STOP 0x1b #define SCSI_ALLOW_MEDIUM_REMOVAL 0x1e #define SCSI_GROUP1 0x20 #define SCSI_READ_CAPACITY 0x25 typedef enum { SCSI_IO_READ, SCSI_IO_WRITE } scsi_io_mode_t; int scsi_max_length(void); int scsi_cmd(int fd, unsigned char cdb[6], int clen, scsi_io_mode_t mode, void *data, size_t len, void *extra_data); int scsi_open(const char *name, int flags, int mode, void **extra_data); #endif /* __mtools_scsi_h */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "mtools.h" #undef got_signal int got_signal = 0; void signal_handler(int dummy) { got_signal = 1; #if 0 signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); signal(SIGQUIT, SIG_IGN); #endif } #if 0 int do_gotsignal(char *f, int n) { if(got_signal) fprintf(stderr, "file=%s line=%d\n", f, n); return got_signal; } #endif void setup_signal(void) { /* catch signals */ signal(SIGHUP, (SIG_CAST)signal_handler); signal(SIGINT, (SIG_CAST)signal_handler); signal(SIGTERM, (SIG_CAST)signal_handler); signal(SIGQUIT, (SIG_CAST)signal_handler); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" int batchmode = 0; int flush_stream(Stream_t *Stream) { int ret=0; if(!batchmode) { if(Stream->Class->flush) ret |= Stream->Class->flush(Stream); if(Stream->Next) ret |= flush_stream(Stream->Next); } return ret; } Stream_t *copy_stream(Stream_t *Stream) { if(Stream) Stream->refs++; return Stream; } int free_stream(Stream_t **Stream) { int ret=0; if(!*Stream) return -1; if(! --(*Stream)->refs){ if((*Stream)->Class->flush) ret |= (*Stream)->Class->flush(*Stream); if((*Stream)->Class->freeFunc) ret |= (*Stream)->Class->freeFunc(*Stream); if((*Stream)->Next) ret |= free_stream(&(*Stream)->Next); Free(*Stream); } else if ( (*Stream)->Next ) ret |= flush_stream((*Stream)->Next); *Stream = NULL; return ret; } #define GET_DATA(stream, date, size, type, address) \ (stream)->Class->get_data( (stream), (date), (size), (type), (address) ) int get_data_pass_through(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address) { return GET_DATA(Stream->Next, date, size, type, address); } int read_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { return READS(Stream->Next, buf, start, len); } int write_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len) { return WRITES(Stream->Next, buf, start, len); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_STREAM_H #define MTOOLS_STREAM_H typedef struct Stream_t { struct Class_t *Class; int refs; struct Stream_t *Next; struct Stream_t *Buffer; } Stream_t; #include "mtools.h" #include "msdos.h" #include "llong.h" typedef struct Class_t { int (*read)(Stream_t *, char *, mt_off_t, size_t); int (*write)(Stream_t *, char *, mt_off_t, size_t); int (*flush)(Stream_t *); int (*freeFunc)(Stream_t *); int (*set_geom)(Stream_t *, device_t *, device_t *, int media, struct bootsector *); int (*get_data)(Stream_t *, time_t *, mt_size_t *, int *, int *); int (*pre_allocate)(Stream_t *, mt_size_t); } Class_t; #define READS(stream, buf, address, size) \ (stream)->Class->read( (stream), (char *) (buf), (address), (size) ) #define WRITES(stream, buf, address, size) \ (stream)->Class->write( (stream), (char *) (buf), (address), (size) ) #define SET_GEOM(stream, dev, orig_dev, media, boot) \ (stream)->Class->set_geom( (stream), (dev), (orig_dev), (media), (boot) ) #define GET_DATA(stream, date, size, type, address) \ (stream)->Class->get_data( (stream), (date), (size), (type), (address) ) #define PRE_ALLOCATE(stream, size) \ (stream)->Class->pre_allocate((stream), (size)) int flush_stream(Stream_t *Stream); Stream_t *copy_stream(Stream_t *Stream); int free_stream(Stream_t **Stream); #define FLUSH(stream) \ flush_stream( (stream) ) #define FREE(stream) \ free_stream( (stream) ) #define COPY(stream) \ copy_stream( (stream) ) #define DeclareThis(x) x *This = (x *) Stream int force_write(Stream_t *Stream, char *buf, mt_off_t start, size_t len); int force_read(Stream_t *Stream, char *buf, mt_off_t start, size_t len); extern struct Stream_t *default_drive; int get_data_pass_through(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address); int read_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len); int write_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len); #endif ��������������������������������������������������������������/* * streamcache.c * Managing a cache of open disks */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "fs.h" #include "mainloop.h" #include "plain_io.h" #include "file.h" static int is_initialized = 0; static Stream_t *fss[256]; /* open drives */ static void finish_sc(void) { int i; for(i=0; i<256; i++){ if(fss[i] && fss[i]->refs != 1 ) fprintf(stderr,"Streamcache allocation problem:%c %d\n", i, fss[i]->refs); FREE(&(fss[i])); } } static void init_streamcache(void) { int i; if(is_initialized) return; is_initialized = 1; for(i=0; i<256; i++) fss[i]=0; atexit(finish_sc); } Stream_t *open_root_dir(char *drive, int flags) { Stream_t *Fs; int i, k; init_streamcache(); k = -1; for(i=0; i<256; i++) { if (fss[i] == NULL || strcmp(getDrive(fss[i]), drive) == 0) { k = i; break; } } if(k == -1) { fprintf(stderr, "Cannot initialize '%s:', out of table space\n", drive); return NULL; } /* open the drive */ if(fss[k]) Fs = fss[k]; else { Fs = fs_init(drive, flags); if (!Fs){ fprintf(stderr, "Cannot initialize '%s:'\n", drive); return NULL; } fss[k] = Fs; } return OpenRoot(Fs); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "file.h" #include "buffer.h" /* * Find the directory and load a new dir_chain[]. A null directory * is OK. Returns a 1 on error. */ void bufferize(Stream_t **Dir) { Stream_t *BDir; if(!*Dir) return; BDir = buf_init(*Dir, 64*16384, 512, MDIR_SIZE); if(!BDir){ FREE(Dir); *Dir = NULL; } else *Dir = BDir; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* System includes for mtools */ #ifndef SYSINCLUDES_H #define SYSINCLUDES_H #include "config.h" /* OS/2 needs __inline__, but for some reason is not autodetected */ #ifdef __EMX__ # ifndef inline # define inline __inline__ # endif #endif /***********************************************************************/ /* */ /* OS dependancies which cannot be covered by the autoconfigure script */ /* */ /***********************************************************************/ #ifdef OS_aux /* A/UX needs POSIX_SOURCE, just as AIX does. Unlike SCO and AIX, it seems * to prefer TERMIO over TERMIOS */ #ifndef _POSIX_SOURCE # define _POSIX_SOURCE #endif #ifndef POSIX_SOURCE # define POSIX_SOURCE #endif #endif /* On AIX, we have to prefer strings.h, as string.h lacks a prototype * for strcasecmp. On most other architectures, it's string.h which seems * to be more complete */ #if (defined OS_aix && defined HAVE_STRINGS_H) # undef HAVE_STRING_H #endif #ifdef OS_ultrix /* on ultrix, if termios present, prefer it instead of termio */ # ifdef HAVE_TERMIOS_H # undef HAVE_TERMIO_H # endif #endif #ifdef OS_linux_gnu /* RMS strikes again */ # ifndef OS_linux # define OS_linux # endif #endif #ifdef OS_Minix typedef unsigned char *caddr_t; #endif /***********************************************************************/ /* */ /* Compiler dependancies */ /* */ /***********************************************************************/ #if defined __GNUC__ && defined __STDC__ /* gcc -traditional doesn't have PACKED, UNUSED and NORETURN */ # define PACKED __attribute__ ((packed)) # if __GNUC__ == 2 && __GNUC_MINOR__ > 6 || __GNUC__ >= 3 /* gcc 2.6.3 doesn't have "unused" */ /* mool */ # define UNUSED(x) x __attribute__ ((unused));x # else # define UNUSED(x) x # endif # define NORETURN __attribute__ ((noreturn)) #else # define UNUSED(x) x # define PACKED /* */ # define NORETURN /* */ #endif /***********************************************************************/ /* */ /* Include files */ /* */ /***********************************************************************/ #include <sys/types.h> #ifdef OS_Minix typedef unsigned long uoff_t; #define off_t uoff_t #endif #ifdef HAVE_STDLIB_H # include <stdlib.h> #endif #include <stdio.h> #ifndef OS_Minix # include <ctype.h> #else # ifdef __minix_vmd # include <bsd/asciictype.h> /* Minix-vmd: Ignore locales on purpose. */ # else # include <ctype.h> /* Minix: What's that "locale" thing? */ # endif #endif #ifdef HAVE_UNISTD_H # include <unistd.h> #endif #ifdef HAVE_LINUX_UNISTD_H # include <linux/unistd.h> #endif #ifdef HAVE_LIBC_H # include <libc.h> #endif #ifdef HAVE_GETOPT_H # include <getopt.h> #else # ifndef OS_Minix int getopt(); extern char *optarg; extern int optind, opterr; # endif #endif #ifdef HAVE_FCNTL_H # include <fcntl.h> #endif #ifdef HAVE_LIMITS_H # include <limits.h> #endif #ifdef HAVE_SYS_FILE_H # include <sys/file.h> #endif #ifdef HAVE_SYS_IOCTL_H # ifndef sunos # include <sys/ioctl.h> #endif #endif /* if we don't have sys/ioctl.h, we rely on unistd to supply a prototype * for it. If it doesn't, we'll only get a (harmless) warning. The idea * is to get mtools compile on as many platforms as possible, but to not * suppress warnings if the platform is broken, as long as these warnings do * not prevent compilation */ #ifdef TIME_WITH_SYS_TIME # include <sys/time.h> # include <time.h> #else # ifdef HAVE_SYS_TIME_H # include <sys/time.h> # else # include <time.h> # endif #endif #ifndef NO_TERMIO # ifdef HAVE_TERMIO_H # include <termio.h> # elif defined HAVE_SYS_TERMIO_H # include <sys/termio.h> # endif # if !defined OS_ultrix || !(defined HAVE_TERMIO_H || defined HAVE_TERMIO_H) /* on Ultrix, avoid double inclusion of both termio and termios */ # ifdef HAVE_TERMIOS_H # include <termios.h> # elif defined HAVE_SYS_TERMIOS_H # include <sys/termios.h> # endif # endif # ifdef HAVE_STTY_H # include <sgtty.h> # endif #endif #if defined(OS_aux) && !defined(_SYSV_SOURCE) /* compiled in POSIX mode, this is left out unless SYSV */ #define NCC 8 struct termio { unsigned short c_iflag; /* input modes */ unsigned short c_oflag; /* output modes */ unsigned short c_cflag; /* control modes */ unsigned short c_lflag; /* line discipline modes */ char c_line; /* line discipline */ unsigned char c_cc[NCC]; /* control chars */ }; extern int ioctl(int fildes, int request, void *arg); #endif #ifdef HAVE_MNTENT_H # include <mntent.h> #endif #ifdef HAVE_SYS_PARAM_H # include <sys/param.h> #endif /* Can only be done here, as BSD is defined in sys/param.h :-( */ #if defined BSD || defined __BEOS__ /* on BSD and on BEOS, we prefer gettimeofday, ... */ # ifdef HAVE_GETTIMEOFDAY # undef HAVE_TZSET # endif #else /* BSD */ /* ... elsewhere we prefer tzset */ # ifdef HAVE_TZSET # undef HAVE_GETTIMEOFDAY # endif #endif #include <sys/stat.h> #include <errno.h> extern int errno; #include <pwd.h> #ifdef HAVE_STRING_H # include <string.h> #else # ifdef HAVE_STRINGS_H # include <strings.h> # endif #endif #ifdef HAVE_MEMORY_H # include <memory.h> #endif #ifdef HAVE_MALLOC_H # include <malloc.h> #endif #ifdef HAVE_SIGNAL_H # include <signal.h> #else # ifdef HAVE_SYS_SIGNAL_H # include <sys/signal.h> # endif #endif #ifdef HAVE_UTIME_H # include <utime.h> #endif #ifdef HAVE_SYS_WAIT_H # ifndef DONT_NEED_WAIT # include <sys/wait.h> # endif #endif #ifdef USE_FLOPPYD #ifdef HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif #ifdef HAVE_NETINET_IN_H #include <netinet/in.h> #endif #ifdef HAVE_ARPA_INET_H #include <arpa/inet.h> #endif #ifdef HAVE_NETDB_H #include <netdb.h> #endif #ifdef HAVE_X11_XAUTH_H #include <X11/Xauth.h> #endif #ifdef HAVE_X11_XLIB_H #include <X11/Xlib.h> #endif #endif #ifndef INADDR_NONE #define INADDR_NONE (-1) #endif #ifdef sgi #define MSGIHACK __EXTENSIONS__ #undef __EXTENSIONS__ #endif #include <math.h> #ifdef sgi #define __EXTENSIONS__ MSGIHACK #undef MSGIHACK #endif /* missing functions */ #ifndef HAVE_SRANDOM # define srandom srand48 #endif #ifndef HAVE_RANDOM # define random (long)lrand48 #endif #if __minix && !__minix_vmd # define srandom srand # define random rand #endif #ifndef HAVE_STRCHR # define strchr index #endif #ifndef HAVE_STRRCHR # define strrchr rindex #endif #define SIG_CAST RETSIGTYPE(*)() #ifndef HAVE_STRDUP extern char *strdup(const char *str); #endif /* HAVE_STRDUP */ #ifndef HAVE_MEMCPY extern char *memcpy(char *s1, const char *s2, size_t n); #endif #ifndef HAVE_MEMSET extern char *memset(char *s, char c, size_t n); #endif /* HAVE_MEMSET */ #ifndef HAVE_STRPBRK extern char *strpbrk(const char *string, const char *brkset); #endif /* HAVE_STRPBRK */ #ifndef HAVE_STRTOUL unsigned long strtoul(const char *string, char **eptr, int base); #endif /* HAVE_STRTOUL */ #ifndef HAVE_STRSPN size_t strspn(const char *s, const char *accept); #endif /* HAVE_STRSPN */ #ifndef HAVE_STRCSPN size_t strcspn(const char *s, const char *reject); #endif /* HAVE_STRCSPN */ #ifndef HAVE_STRERROR char *strerror(int errno); #endif #ifndef HAVE_ATEXIT int atexit(void (*function)(void)); #ifndef HAVE_ON_EXIT void myexit(int code) NORETURN; #define exit myexit #endif #endif #ifndef HAVE_MEMMOVE # define memmove(DST, SRC, N) bcopy(SRC, DST, N) #endif #ifndef HAVE_STRCASECMP int strcasecmp(const char *s1, const char *s2); #endif #ifndef HAVE_STRNCASECMP int strncasecmp(const char *s1, const char *s2, size_t n); #endif #ifndef HAVE_GETPASS char *getpass(const char *prompt); #endif #if 0 #ifndef HAVE_BASENAME const char *basename(const char *filename); #endif #endif const char *_basename(const char *filename); #ifndef __S'G��)G��*G��+G��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������TDC__ # ifndef signed # define signed /**/ # endif #endif /* !__STDC__ */ /***************************************************************************/ /* */ /* Prototypes for systems where the functions exist but not the prototypes */ /* */ /***************************************************************************/ /* prototypes which might be missing on some platforms, even if the functions * are present. Do not declare argument types, in order to avoid conflict * on platforms where the prototypes _are_ correct. Indeed, for most of * these, there are _several_ "correct" parameter definitions, and not all * platforms use the same. For instance, some use the const attribute for * strings not modified by the function, and others do not. By using just * the return type, which rarely changes, we avoid these problems. */ /* Correction: Now it seems that even return values are not standardized :-( For instance DEC-ALPHA, OSF/1 3.2d uses ssize_t as a return type for read and write. NextStep uses a non-void return value for exit, etc. With the advent of 64 bit system, we'll expect more of these problems in the future. Better uncomment the lot, except on SunOS, which is known to have bad incomplete files. Add other OS'es with incomplete include files as needed */ #if (defined OS_sunos || defined OS_ultrix) int read(); int write(); int fflush(); char *strdup(); int strcasecmp(); int strncasecmp(); char *getenv(); unsigned long strtoul(); int pclose(); void exit(); char *getpass(); int atoi(); FILE *fdopen(); FILE *popen(); #endif #ifndef MAXPATHLEN # ifdef PATH_MAX # define MAXPATHLEN PATH_MAX # else # define MAXPATHLEN 1024 # endif #endif #ifndef OS_linux # undef USE_XDF #endif #ifdef NO_XDF # undef USE_XDF #endif #ifdef __EMX__ #define INCL_BASE #define INCL_DOSDEVIOCTL #include <os2.h> #endif #ifdef OS_nextstep /* nextstep doesn't have this. Unfortunately, we cannot test its presence using AC_EGREP_HEADER, as we don't know _which_ header to test, and in the general case utime.h might be non-existent */ struct utimbuf { time_t actime,modtime; }; #endif /* NeXTStep doesn't have these */ #if !defined(S_ISREG) && defined (_S_IFMT) && defined (_S_IFREG) #define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG)) #endif #if !defined(S_ISDIR) && defined (_S_IFMT) && defined (_S_IFDIR) #define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR)) #endif #if 0 #define malloc(x) mymalloc(x) #define calloc(x,y) mycalloc(x,y) #define free(x) myfree(x) #define realloc(x,y) myrealloc(x,y) #define strdup(a) mystrdup(a) void *mycalloc(size_t nmemb, size_t size); void *mymalloc(size_t size); void myfree(void *ptr); void *myrealloc(void *ptr, size_t size); char *mystrdup(char *a); #endif #endif ������������������������������������������������������������������������������������������������������������������������������������������������#include "codepage.h" /* MS-DOS doesn't use the same ASCII code as Unix does. The appearance * of the characters is defined using code pages. These code pages * aren't the same for all countries. For instance, some code pages * don't contain upper case accented characters. This affects two * things, relating to filenames: * 1. upper case characters. In short names, only upper case * characters are allowed. This also holds for accented characters. * For instance, in a code page which doesn't contain accented * uppercase characters, the accented lowercase characters get * transformed into their unaccented counterparts. This is very bad * design. Indeed, stuff like national language support should never * affect filesystem integrity. And it does: A filename which is legal * in one country could be illegal in another one. Bad News for * frequent travellers. * 2. long file names: Micro$oft has finally come to their senses and * uses a more standard mapping for the long file names. They use * Unicode, which is basically a 32 bit version of ASCII. Its first * 256 characters are identical to Unix ASCII. Thus, the code page * also affects the correspondence between the codes used in long * names and those used in short names. * Such a bad design is rather unbelievable. That's why I quoted the * translation tables. BEGIN FAIR USE EXCERPT: */ unsigned char toucase[][128]={ /* 0 */ /* 437 German Umlauts upcased, French accents * upcased and lose accent */ { 0x80, 0x9a, 0x45, 0x41, 0x8e, 0x41, 0x8f, 0x80, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x8e, 0x8f, 0x90, 0x92, 0x92, 0x4f, 0x99, 0x4f, 0x55, 0x55, 0x59, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 1 */ { 0x43, 0x55, 0x45, 0x41, 0x41, 0x41, 0x86, 0x43, 0x45, 0x45, 0x45, 0x49, 0x49, 0x8d, 0x41, 0x8f, 0x45, 0x45, 0x45, 0x4f, 0x45, 0x49, 0x55, 0x55, 0x98, 0x4f, 0x55, 0x9b, 0x9c, 0x55, 0x55, 0x9f, 0xa0, 0xa1, 0x4f, 0x55, 0xa4, 0xa5, 0xa6, 0xa7, 0x49, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 2 */ { 0x80, 0x9a, 0x90, 0x41, 0x8e, 0x41, 0x8f, 0x80, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x8e, 0x8f, 0x90, 0x92, 0x92, 0x4f, 0x99, 0x4f, 0x55, 0x55, 0x59, 0x99, 0x9a, 0x9d, 0x9c, 0x9d, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 3 */ { 0x80, 0x9a, 0x90, 0x41, 0x8e, 0x41, 0x8f, 0x80, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x8e, 0x8f, 0x90, 0x92, 0x92, 0x4f, 0x99, 0x4f, 0x55, 0x55, 0x59, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 4 * 437: all accented characters lose their accent */ { 0x80, 0x55, 0x45, 0x41, 0x41, 0x41, 0x8f, 0x80, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x41, 0x8f, 0x45, 0x92, 0x92, 0x4f, 0x4f, 0x4f, 0x55, 0x55, 0x98, 0x4f, 0x55, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 5 */ { 0x80, 0x9a, 0x90, 0x8f, 0x8e, 0x91, 0x86, 0x80, 0x89, 0x89, 0x92, 0x8b, 0x8c, 0x98, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x8c, 0x99, 0xa9, 0x96, 0x9d, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x86, 0x8b, 0x9f, 0x96, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 6 All accented characters lose their accent when upcased. C loses cedilla. upcased. loses slash. , , intact */ { 0x43, 0x55, 0x45, 0x41, 0x41, 0x41, 0x41, 0x43, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x41, 0x41, 0x45, 0x92, 0x92, 0x4f, 0x4f, 0x4f, 0x55, 0x55, 0x59, 0x4f, 0x55, 0x4f, 0x9c, 0x4f, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0x41, 0x41, 0x41, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x41, 0x41, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x49, 0xdf, 0x4f, 0xe1, 0x4f, 0x4f, 0x4f, 0x4f, 0xe6, 0xe8, 0xe8, 0x55, 0x55, 0x55, 0x59, 0x59, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 7: As 6, but German Umlauts keep their Umlaut */ { 0x43, 0x9a, 0x45, 0x41, 0x8e, 0x41, 0x41, 0x43, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x8e, 0x41, 0x45, 0x92, 0x92, 0x4f, 0x99, 0x4f, 0x55, 0x55, 0x59, 0x99, 0x9a, 0x4f, 0x9c, 0x4f, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0x41, 0x41, 0x41, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x41, 0x41, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 3G��5G��6G��7G��8G��9G��:G��;G��<G��=G��>G��?G������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ 0x49, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x49, 0xdf, 0x4f, 0xe1, 0x4f, 0x4f, 0x4f, 0x4f, 0xe6, 0xe8, 0xe8, 0x55, 0x55, 0x55, 0x59, 0x59, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 8: All characters except keep their accent */ { 0x80, 0x9a, 0x90, 0xb6, 0x8e, 0xb7, 0x8f, 0x80, 0xd2, 0xd3, 0xd4, 0xd8, 0xd7, 0xde, 0x8e, 0x8f, 0x90, 0x92, 0x92, 0xe2, 0x99, 0xe3, 0xea, 0xeb, 0x59, 0x99, 0x9a, 0x9d, 0x9c, 0x9d, 0x9e, 0x9f, 0xb5, 0xd6, 0xe0, 0xe9, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc7, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0x49, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe5, 0xe5, 0xe6, 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xed, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 9: As 6, but and preserved */ { 0x80, 0x55, 0x45, 0x41, 0x41, 0x41, 0x8f, 0x80, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x41, 0x8f, 0x45, 0x92, 0x92, 0x4f, 0x4f, 0x4f, 0x55, 0x55, 0x98, 0x4f, 0x55, 0x4f, 0x9c, 0x4f, 0x9e, 0x9f, 0x41, 0x49, 0x4f, 0x55, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0x41, 0x41, 0x41, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0x41, 0x41, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0x49, 0xdf, 0x4f, 0xe1, 0x4f, 0x4f, 0x4f, 0x4f, 0xe6, 0xe8, 0xe8, 0x55, 0x55, 0x55, 0x59, 0x59, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 10: every accented character keeps its accent */ { 0x80, 0x9a, 0x90, 0xb6, 0x8e, 0xb7, 0x8f, 0x80, 0xd2, 0xd3, 0xd4, 0xd8, 0xd7, 0xde, 0x8e, 0x8f, 0x90, 0x92, 0x92, 0xe2, 0x99, 0xe3, 0xea, 0xeb, 0x98, 0x99, 0x9a, 0x9d, 0x9c, 0x9d, 0x9e, 0x9f, 0xb5, 0xd6, 0xe0, 0xe9, 0xa5, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc7, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe5, 0xe5, 0xe6, 0xe8, 0xe8, 0xe9, 0xea, 0xeb, 0xed, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, /* 11 */ { 0x80, 0x9a, 0x90, 0xb6, 0x8e, 0xde, 0x8f, 0x80, 0x9d, 0xd3, 0x8a, 0x8a, 0xd7, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x91, 0xe2, 0x99, 0x95, 0x95, 0x97, 0x97, 0x99, 0x9a, 0x9b, 0x9b, 0x9d, 0x9e, 0xac, 0xb5, 0xd6, 0xe0, 0xe9, 0xa4, 0xa4, 0xa6, 0xa6, 0xa8, 0xa8, 0xaa, 0x8d, 0xac, 0xb8, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbd, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd1, 0xd1, 0xd2, 0xd3, 0xd2, 0xd5, 0xd6, 0xd7, 0xb7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe3, 0xd5, 0xe6, 0xe6, 0xe8, 0xe9, 0xe8, 0xeb, 0xed, 0xed, 0xdd, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xeb, 0xfc, 0xfc, 0xfe, 0xff }, /* 14 All accented characters lose their accent, C loses cedilla, * loses slash. upcased. , , intact */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xc6, 0x43, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0xd7, 0x4f, 0x55, 0x55, 0x55, 0x55, 0x59, 0xde, 0xdf, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0xc6, 0x43, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0xf7, 0x4f, 0x55, 0x55, 0x55, 0x55, 0x59, 0xde, 0x59 }, /* 15 as 14, but German Umlauts (, , ) keep their Umlaut when upcased */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0x41, 0x41, 0x41, 0x41, 0xc4, 0x41, 0xc6, 0x43, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0xd6, 0xd7, 0x4f, 0x55, 0x55, 0x55, 0xdc, 0x59, 0xde, 0xdf, 0x41, 0x41, 0x41, 0x41, 0xc4, 0x41, 0xc6, 0x43, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0xd6, 0xf7, 0x4f, 0x55, 0x55, 0x55, 0xdc, 0x59, 0xde, 0x59 }, /* 16 every accented character except keeps its accent */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x59 }, /* 17: As 6, but , and preserved */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0x41, 0x41, 0x41, 0x41, 0x41, 0xc5, 0xc6, 0xc7, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0xd7, 0x4f, 0x55, 0x55, 0x55, 0x55, 0x59, 0xde, 0xdf, 0x41, 0x41, 0x41, 0x41, 0x41, 0xc5, 0xc6, 0xc7, 0x45, 0x45, 0x45, 0x45, 0x49, 0x49, 0x49, 0x49, 0xd0, 0xd1, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0xf7, 0x4f, 0x55, 0x55, 0x55, 0x55, 0x59, 0xde, 0xff }, /* 18 every accented character keeps its accent */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xf7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xff }, /* 19 */ { 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff }, }; country_t countries[]={ { 1, 437, 437, 0 }, { 1, 850, 437, 6 }, { 1, 819, 437, 14 }, { 44, 437, 437, 0 }, { 44, 850, 437, 6 }, { 44, 819, 437, 14 }, { 33, 437, 437, 0 }, { 33, 850, 437, 6 }, { 33, 819, 437, 14 }, { 49, 437, 437, 0 }, { 49, 850, 437, 7 }, { 49, 819, 437, 15 }, { 34, 850, 437, 8 }, { 34, 819, 437, 16 }, { 34, 437, 437, 0 }, { 39, 437, 437, 0 }, { 39, 850, 437, 6 }, { 39, 819, 437, 14 }, { 46, 437, 437, 3 }, { 46, 850, 437, 8 }, { 46, 819, 437, 16 }, { 45, 850, 865, 8 }, { 45, 819, 865, 16 }, { 45, 865, 865, 2 }, { 41, 850, 437, 8 }, { 41, 819, 437, 16 }, { 41, 437, 437, 3 }, { 47, 850, 865, 8 }, { 47, 819, 865, 16 }, { 47, 865, 865, 2 }, { 31, 437, 437, 4 }, { 31, 850, 437, 9 }, { 31, 819, 437, 17 }, { 32, 850, 437, 8 }, { 32, 819, 437, 16 }, { 32, 437, 437, 3 }, { 358, 850, 437, 8 }, { 358, 819, 437, 16 }, { 358, 437, 437, 3 }, { 2, 863, 863, 1 }, { 2, 850, 863, 6 }, { 2, 819, 863, 14 }, { 351, 850, 860, 6 }, { 351, 819, 860, 14 }, { 351, 860, 860, 5 }, { 3, 850, 437, 8 }, { 3, 819, 437, 16 }, { 3, 437, 437, 0 }, { 61, 437, 437, 0 }, { 61, 850, 437, 6 }, { 61, 819, 437, 16 }, { 81, 437, 437, 0 }, { 81, 819, 437, 14 }, { 82, 437, 437, 0 }, { 82, 819, 437, 14 }, { 86, 437, 437, 0 }, { 86, 819, 437, 14 }, { 88, 437, 437, 0 }, { 88, 819, 437, 14 }, { 55, 850, 850, 10 }, { 55, 819, 850, 18 }, { 55, 437, 850, 0 }, { 354, 850, 850, 10 }, { 354, 819, 850, 18 }, { 90, 850, 850, 10 }, { 90, 819, 850, 18 }, { 38, 852, 852, 11 }, { 38, 850, 852, 10 }, { 38, 819, 852, 18 }, { 42, 852, 852, 11 }, { 42, 850, 852, 10 }, { 42, 819, 852, 18 }, { 48, 852, 852, 11 }, { 48, 850, 852, 10 }, { 48, 819, 852, 18 }, { 36, 852, 852, 11 }, { 36, 850, 852, 10 }, { 36, 819, 852, 18 }, { 886, 950, 950, 19 }, /* for Taiwan support (Country code) */ { 0, 0, 0, 0 } }; /* END FAIR USE EXCERPT */ �����������������������������������������������������������������������������������������#include "sysincludes.h" #include "mtools.h" static FILE *tty=NULL; static int notty=0; static int ttyfd=-1; #ifdef USE_RAWTERM int mtools_raw_tty = 1; #else int mtools_raw_tty = 0; #endif #ifdef USE_RAWTERM # if defined TCSANOW && defined HAVE_TCSETATTR /* we have tcsetattr & tcgetattr. Good */ typedef struct termios Terminal; # define stty(a,b) (void)tcsetattr(a,TCSANOW,b) # define gtty(a,b) (void)tcgetattr(a,b) # define USE_TCIFLUSH # elif defined TCSETS && defined TCGETS typedef struct termios Terminal; # define stty(a,b) (void)ioctl(a,TCSETS,(char *)b) # define gtty(a,b) (void)ioctl(a,TCGETS,(char *)b) # define USE_TCIFLUSH # elif defined TCSETA && defined TCGETA typedef struct termio Terminal; # define stty(a,b) (void)ioctl(a,TCSETA,(char *)b) # define gtty(a,b) (void)ioctl(a,TCGETA,(char *)b) # define USE_TCIFLUSH # elif defined(HAVE_SGTTY_H) && defined(TIOCSETP) && defined(TIOCGETP) typedef struct sgttyb Terminal; # define stty(a,b) (void)ioctl(a,TIOCSETP,(char *)b) # define gtty(a,b) (void)ioctl(a,TIOCGETP,(char *)b) # define USE_SGTTY # define discard_input(a) /**/ # else /* no way to use raw terminal */ /* # warning Cannot use raw terminal code (disabled) */ # undef USE_RAWTERM # endif #endif #ifdef USE_TCIFLUSH # if defined TCIFLUSH && defined HAVE_TCFLUSH # define discard_input(a) tcflush(a,TCIFLUSH) # else # define discard_input(a) /**/ # endif #endif #ifdef USE_RAWTERM static int tty_mode = -1; /* 1 for raw, 0 for cooked, -1 for initial */ static int need_tty_reset = 0; static int handlerIsSet = 0; #define restore_tty(a) stty(STDIN,a) #define STDIN ttyfd #define FAIL (-1) #define DONE 0 static Terminal in_orig; /*--------------- Signal Handler routines -------------*/ static void tty_time_out(void) { int exit_code; signal(SIGALRM, SIG_IGN); if(tty && need_tty_reset) restore_tty (&in_orig); #if future if (fail_on_timeout) exit_code=SHFAIL; else { if (default_choice && mode_defined) { if (yes_no) { if ('Y' == default_choice) exit_code=0; else exit_code=1; } else exit_code=default_choice-minc+1; } else exit_code=DONE; } #else exit_code = DONE; #endif exit(exit_code); } static void cleanup_tty(void) { if(tty && need_tty_reset) { restore_tty (&in_orig); setup_signal(); } } static void set_raw_tty(int mode) { Terminal in_raw; if(mode != tty_mode && mode != -1) { if(!handlerIsSet) { /* Determine existing TTY settings */ gtty (STDIN, &in_orig); need_tty_reset = 1; /* Restore original TTY settings on exit */ atexit(cleanup_tty); handlerIsSet = 1; } setup_signal(); signal (SIGALRM, (SIG_CAST) tty_time_out); /* Change STDIN settings to raw */ gtty (STDIN, &in_raw); if(mode) { #ifdef USE_SGTTY in_raw.sg_flags |= CBREAK; #else in_raw.c_lflag &= ~ICANON; in_raw.c_cc[VMIN]=1; in_raw.c_cc[VTIME]=0; #endif stty (STDIN, &in_raw); } else { #ifdef USE_SGTTY in_raw.sg_flags &= ~CBREAK; #else in_raw.c_lflag |= ICANON; #endif stty (STDIN, &in_raw); } tty_mode = mode; discard_input(STDIN); } } #endif FILE *opentty(int mode) { if(notty) return NULL; if (tty == NULL) { ttyfd = open("/dev/tty", O_RDONLY); if(ttyfd >= 0) { tty = fdopen(ttyfd, "r"); } } if (tty == NULL){ if ( !isatty(0) ){ notty = 1; return NULL; } ttyfd = 0; tty = stdin; } #ifdef USE_RAWTERM if(mtools_raw_tty) set_raw_tty(mode); #endif return tty; } int ask_confirmation(const char *format, const char *p1, const char *p2) { char ans[10]; if(!opentty(-1)) return 0; while (1) { fprintf(stderr, format, p1, p2); fflush(stderr); fflush(opentty(-1)); if (mtools_raw_tty) { ans[0] = fgetc(opentty(1)); fputs("\n", stderr); } else { fgets(ans,9, opentty(0)); } if (ans[0] == 'y' || ans[0] == 'Y') return 0; if (ans[0] == 'n' || ans[0] == 'N') return -1; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "sysincludes.h" #include "msdos.h" #include "stream.h" #include "mtools.h" #include "fsP.h" #include "file.h" #include "htable.h" #include "mainloop.h" #include <dirent.h> typedef struct Dir_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; struct stat stat; char *pathname; DIR *dir; #ifdef HAVE_FCHDIR int fd; #endif } Dir_t; /*#define FCHDIR_MODE*/ static int get_dir_data(Stream_t *Stream, time_t *date, mt_size_t *size, int *type, int *address) { DeclareThis(Dir_t); if(date) *date = This->stat.st_mtime; if(size) *size = (mt_size_t) This->stat.st_size; if(type) *type = 1; if(address) *address = 0; return 0; } static int dir_free(Stream_t *Stream) { DeclareThis(Dir_t); Free(This->pathname); closedir(This->dir); return 0; } static Class_t DirClass = { 0, /* read */ 0, /* write */ 0, /* flush */ dir_free, /* free */ 0, /* get_geom */ get_dir_data , 0 /* pre-allocate */ }; #ifdef HAVE_FCHDIR #define FCHDIR_MODE #endif int unix_dir_loop(Stream_t *Stream, MainParam_t *mp); int unix_loop(Stream_t *Stream, MainParam_t *mp, char *arg, int follow_dir_link); int unix_dir_loop(Stream_t *Stream, MainParam_t *mp) { DeclareThis(Dir_t); struct dirent *entry; char *newName; int ret=0; #ifdef FCHDIR_MODE int fd; fd = open(".", O_RDONLY); chdir(This->pathname); #endif while((entry=readdir(This->dir)) != NULL) { if(got_signal) break; if(isSpecial(entry->d_name)) continue; #ifndef FCHDIR_MODE newName = malloc(strlen(This->pathname) + 1 + strlen(entry->d_name) + 1); if(!newName) { ret = ERROR_ONE; break; } strcpy(newName, This->pathname); strcat(newName, "/"); strcat(newName, entry->d_name); #else newName = entry->d_name; #endif ret |= unix_loop(Stream, mp, newName, 0); #ifndef FCHDIR_MODE free(newName); #endif } #ifdef FCHDIR_MODE fchdir(fd); close(fd); #endif return ret; } Stream_t *OpenDir(Stream_t *Stream, const char *filename) { Dir_t *This; This = New(Dir_t); This->Class = &DirClass; This->Next = 0; This->refs = 1; This->Buffer = 0; This->pathname = malloc(strlen(filename)+1); if(This->pathname == NULL) { Free(This); return NULL; } strcpy(This->pathname, filename); if(stat(filename, &This->stat) < 0) { Free(This->pathname); Free(This); return NULL; } This->dir = opendir(filename); if(!This->dir) { Free(This->pathname); Free(This); return NULL; } return (Stream_t *) This; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vfat.c * * Miscellaneous VFAT-related functions */ #include "sysincludes.h" #include "msdos.h" #include "mtools.h" #include "vfat.h" #include "file.h" #include "dirCache.h" /* #define DEBUG */ const char *short_illegals=";+=[]',\"*\\<>/?:|"; const char *long_illegals = "\"*\\<>/?:|\005"; /* Automatically derive a new name */ static void autorename(char *name, char tilda, char dot, const char *illegals, int limit, int bump) { int tildapos, dotpos; unsigned int seqnum=0, maxseq=0; char tmp; char *p; #ifdef DEBUG printf("In autorename for name=%s.\n", name); #endif tildapos = -1; for(p=name; *p ; p++) if((*p < ' ' && *p != '\005') || strchr(illegals, *p)) { *p = '_'; bump = 0; } for(dotpos=0; name[dotpos] && dotpos < limit && name[dotpos] != dot ; dotpos++) { if(name[dotpos] == tilda) { tildapos = dotpos; seqnum = 0; maxseq = 1; } else if (name[dotpos] >= '0' && name[dotpos] <= '9') { seqnum = seqnum * 10 + name[dotpos] - '0'; maxseq = maxseq * 10; } else tildapos = -1; /* sequence number interrupted */ } if(tildapos == -1) { /* no sequence number yet */ if(dotpos > limit - 2) { tildapos = limit - 2; dotpos = limit; } else { tildapos = dotpos; dotpos += 2; } seqnum = 1; } else { if(bump) seqnum++; if(seqnum > 999999) { seqnum = 1; tildapos = dotpos - 2; /* this matches Win95's behavior, and also guarantees * us that the sequence numbers never get shorter */ } if (seqnum == maxseq) { if(dotpos >= limit) tildapos--; else dotpos++; } } tmp = name[dotpos]; if((bump && seqnum == 1) || seqnum > 1 || mtools_numeric_tail) sprintf(name+tildapos,"%c%d",tilda, seqnum); if(dot) name[dotpos]=tmp; /* replace the character if it wasn't a space */ } void autorename_short(char *name, int bump) { autorename(name, '~', ' ', short_illegals, 8, bump); } void autorename_long(char *name, int bump) { autorename(name, '-', '\0', long_illegals, 255, bump); } static inline int unicode_read(struct unicode_char *in, char *out, int num) { char *end_out = out+num; while(out < end_out) { if (in->uchar) *out = '_'; else *out = in->lchar; ++out; ++in; } return num; } void clear_vfat(struct vfat_state *v) { v->subentries = 0; v->status = 0; v->present = 0; } /* sum_shortname * * Calculate the checksum that results from the short name in *dir. * * The sum is formed by circularly right-shifting the previous sum * and adding in each character, from left to right, padding both * the name and extension to maximum length with spaces and skipping * the "." (hence always summing exactly 11 characters). * * This exact algorithm is required in order to remain compatible * with Microsoft Windows-95 and Microsoft Windows NT 3.5. * Thanks to Jeffrey Richter of Microsoft Systems Journal for * pointing me to the correct algorithm. * * David C. Niemi (niemi@tux.org) 95.01.19 */ static inline unsigned char sum_shortname(char *name) { unsigned char sum; char *end = name+11; for (sum=0; name<end; ++name) sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + (*name ? *name : ' '); return(sum); } /* check_vfat * * Inspect a directory and any associated VSEs. * Return 1 if the VSEs comprise a valid long file name, * 0 if not. */ static inline void check_vfat(struct vfat_state *v, struct directory *dir) { char name[12]; if (! v->subentries) { #ifdef DEBUG fprintf(stderr, "check_vfat: no VSEs.\n"); #endif return; } strncpy((char *)name, (char *)dir->name, 8); strncpy((char *)name + 8, (char *)dir->ext, 3); name[11] = '\0'; if (v->sum != sum_shortname(name)) return; if( (v->status & ((1<<v->subentries) - 1)) != (1<<v->subentries) - 1) return; /* missing entries */ /* zero out byte following last entry, for good measure */ v->name[VSE_NAMELEN * v->subentries] = 0; v->present = 1; } int clear_vses(Stream_t *Dir, int entrySlot, size_t last) { direntry_t entry; dirCache_t *cache; int error; entry.Dir = Dir; entry.entry = entrySlot; /*maximize(last, entry.entry + MAX_VFAT_SUBENTRIES);*/ cache = allocDirCache(Dir, last); if(!cache) { fprintf(stderr, "Out of memory error in clear_vses\n"); exit(1); } addFreeEntry(cache, entry.entry, last); for (; entry.entry < last; ++entry.entry) { #ifdef DEBUG fprintf(stderr,"Clearing entry %d.\n", entry.entry); #endif dir_read(&entry, &error); if(error) return error; if(!entry.dir.name[0] || entry.dir.name[0] == DELMARK) break; entry.dir.name[0] = DELMARK; if (entry.dir.attr == 0xf) entry.dir.attr = '\0'; low_level_dir_write(&entry); } return 0; } int write_vfat(Stream_t *Dir, char *shortname, char *longname, int start, direntry_t *mainEntry) { struct vfat_subentry *vse; int vse_id, num_vses; char *c; direntry_t entry; dirCache_t *cache; char unixyName[13]; if(longname) { #ifdef DEBUG printf("Entering write_vfat with longname=\"%s\", start=%d.\n", longname,start); #endif entry.Dir = Dir; vse = (struct vfat_subentry *) &entry.dir; /* Fill in invariant part of vse */ vse->attribute = 0x0f; vse->hash1 = vse->sector_l = vse->sector_u = 0; vse->sum = sum_shortname(shortname); #ifdef DEBUG printf("Wrote checksum=%d for shortname %s.\n", vse->sum,shortname); #endif num_vses = strlen(longname)/VSE_NAMELEN + 1; for (vse_id = num_vses; vse_id; --vse_id) { int end = 0; c = longname + (vse_id - 1) * VSE_NAMELEN; c += unicode_write(c, vse->text1, VSE1SIZE, &end); c += unicode_write(c, vse->text2, VSE2SIZE, &end); c += unicode_write(c, vse->text3, VSE3SIZE, &end); vse->id = (vse_id == num_vses) ? (vse_id | VSE_LAST) : vse_id; #ifdef DEBUG printf("Writing longname=(%s), VSE %d (%13s) at %d, end = %d.\n", longname, vse_id, longname + (vse_id-1) * VSE_NAMELEN, start + num_vses - vse_id, start + num_vses); #endif entry.entry = start + num_vses - vse_id; low_level_dir_write(&entry); } } else num_vses = 0; cache = allocDirCache(Dir, start + num_vses + 1); if(!cache) { fprintf(stderr, "Out of memory error\n"); exit(1); } unix_name(shortname, shortname+8, 0, unixyName); addUsedEntry(cache, start, start + num_vses + 1, longname, unixyName, &mainEntry->dir); low_level_dir_write(mainEntry); return start + num_vses; } void dir_write(direntry_t *entry) { dirCacheEntry_t *dce; dirCache_t *cache; if(entry->entry == -3) { fprintf(stderr, "Attempt to write root directory pointer\n"); exit(1); } cache = allocDirCache(entry->Dir, entry->entry + 1); if(!cache) { fprintf(stderr, "Out of memory error in dir_write\n"); exit(1); } dce = cache->entries[entry->entry]; if(dce) { if(entry->dir.name[0] == DELMARK) { addFreeEntry(cache, dce->beginSlot, dce->endSlot); } else { dce->dir = entry->dir; } } low_level_dir_write(entry); } /* * The following function translates a series of vfat_subentries into * data suitable for a dircache entry */ static inline void parse_vses(direntry_t *entry, struct vfat_state *v) { struct vfat_subentry *vse; unsigned char id, last_flag; char *c; vse = (struct vfat_subentry *) &entry->dir; id = vse->id & VSE_MASK; last_flag = (vse->id & VSE_LAST); if (id > MAX_VFAT_SUBENTRIES) { fprintf(stderr, "parse_vses: invalid VSE ID %d at %d.\n", id, entry->entry); return; } /* 950819: This code enforced finding the VSEs in order. Well, Win95 * likes to write them in *reverse* order for some bizarre reason! So * we pretty much have to tolerate them coming in any possible order. * So skip this check, we'll do without it (What does this do, Alain?). * * 950820: Totally rearranged code to tolerate any order but to warn if * they are not in reverse order like Win95 uses. * * 950909: Tolerate any order. We recognize new chains by mismatching * checksums. In the event that the checksums match, new entries silently * overwrite old entries of the same id. This should accept all valid * entries, but may fail to reject invalid entries in some rare cases. */ /* bad checksum, begin neNG��PG��QG��RG��SG��TG��UG��VG��WG��XG��YG����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������w chain */ if(v->sum != vse->sum) { clear_vfat(v); v->sum = vse->sum; } #ifdef DEBUG if(v->status & (1 << (id-1))) fprintf(stderr, "parse_vses: duplicate VSE %d\n", vse->id); #endif v->status |= 1 << (id-1); if(last_flag) v->subentries = id; #ifdef DEBUG if (id > v->subentries) /* simple test to detect entries preceding * the "last" entry (really the first) */ fprintf(stderr, "parse_vses: new VSE %d sans LAST flag\n", vse->id); #endif c = &(v->name[VSE_NAMELEN * (id-1)]); c += unicode_read(vse->text1, c, VSE1SIZE); c += unicode_read(vse->text2, c, VSE2SIZE); c += unicode_read(vse->text3, c, VSE3SIZE); #ifdef DEBUG printf("Read VSE %d at %d, subentries=%d, = (%13s).\n", id,entry->entry,v->subentries,&(v->name[VSE_NAMELEN * (id-1)])); #endif if (last_flag) *c = '\0'; /* Null terminate long name */ } static dirCacheEntry_t *vfat_lookup_loop_common(direntry_t *direntry, dirCache_t *cache, int lookForFreeSpace, int *io_error) { char newfile[13]; int initpos = direntry->entry + 1; struct vfat_state vfat; char *longname; int error; /* not yet cached */ *io_error = 0; clear_vfat(&vfat); while(1) { ++direntry->entry; if(!dir_read(direntry, &error)){ if(error) { *io_error = error; return NULL; } addFreeEntry(cache, initpos, direntry->entry); return addEndEntry(cache, direntry->entry); } if (direntry->dir.name[0] == '\0'){ /* the end of the directory */ if(lookForFreeSpace) continue; return addEndEntry(cache, direntry->entry); } if(direntry->dir.name[0] != DELMARK && direntry->dir.attr == 0x0f) parse_vses(direntry, &vfat); else /* the main entry */ break; } /* If we get here, it's a short name FAT entry, maybe erased. * thus we should make sure that the vfat structure will be * cleared before the next loop run */ /* deleted file */ if (direntry->dir.name[0] == DELMARK) { return addFreeEntry(cache, initpos, direntry->entry + 1); } check_vfat(&vfat, &direntry->dir); if(!vfat.present) vfat.subentries = 0; /* mark space between last entry and this one as free */ addFreeEntry(cache, initpos, direntry->entry - vfat.subentries); if (direntry->dir.attr & 0x8){ strncpy(newfile, direntry->dir.name,8); newfile[8]='\0'; strncat(newfile, direntry->dir.ext,3); newfile[11]='\0'; } else unix_name(direntry->dir.name, direntry->dir.ext, direntry->dir.Case, newfile); if(vfat.present) longname = vfat.name; else longname = 0; return addUsedEntry(cache, direntry->entry - vfat.subentries, direntry->entry + 1, longname, newfile, &direntry->dir); } static inline dirCacheEntry_t *vfat_lookup_loop_for_read(direntry_t *direntry, dirCache_t *cache, int *io_error) { int initpos = direntry->entry + 1; dirCacheEntry_t *dce; *io_error = 0; dce = cache->entries[initpos]; if(dce) { direntry->entry = dce->endSlot - 1; return dce; } else { return vfat_lookup_loop_common(direntry, cache, 0, io_error); } } typedef enum result_t { RES_NOMATCH, RES_MATCH, RES_END, RES_ERROR } result_t; /* * 0 does not match * 1 matches * 2 end */ static result_t checkNameForMatch(struct direntry_t *direntry, dirCacheEntry_t *dce, const char *filename, char *longname, char *shortname, int length, int flags) { switch(dce->type) { case DCET_FREE: return RES_NOMATCH; case DCET_END: return RES_END; case DCET_USED: break; default: fprintf(stderr, "Unexpected entry type %d\n", dce->type); return RES_ERROR; } direntry->dir = dce->dir; /* make sure the entry is of an accepted type */ if((direntry->dir.attr & 0x8) && !(flags & ACCEPT_LABEL)) return RES_NOMATCH; /*---------- multiple files ----------*/ if(!((flags & MATCH_ANY) || (dce->longName && match(dce->longName, filename, direntry->name, 0, length)) || match(dce->shortName, filename, direntry->name, 1, length))) { return RES_NOMATCH; } /* entry of non-requested type, has to come after name * checking because of clash handling */ if(IS_DIR(direntry) && !(flags & ACCEPT_DIR)) { if(!(flags & (ACCEPT_LABEL|MATCH_ANY|NO_MSG))) fprintf(stderr, "Skipping \"%s\", is a directory\n", dce->shortName); return RES_NOMATCH; } if(!(direntry->dir.attr & (ATTR_LABEL | ATTR_DIR)) && !(flags & ACCEPT_PLAIN)) { if(!(flags & (ACCEPT_LABEL|MATCH_ANY|NO_MSG))) fprintf(stderr, "Skipping \"%s\", is not a directory\n", dce->shortName); return RES_NOMATCH; } return RES_MATCH; } /* * vfat_lookup looks for filenames in directory dir. * if a name if found, it is returned in outname * if applicable, the file is opened and its stream is returned in File */ int vfat_lookup(direntry_t *direntry, const char *filename, int length, int flags, char *shortname, char *longname) { dirCacheEntry_t *dce; result_t result; dirCache_t *cache; int io_error; if(length == -1 && filename) length = strlen(filename); if (direntry->entry == -2) return -1; cache = allocDirCache(direntry->Dir, direntry->entry+1); if(!cache) { fprintf(stderr, "Out of memory error in vfat_lookup [0]\n"); exit(1); } do { dce = vfat_lookup_loop_for_read(direntry, cache, &io_error); if(!dce) { if (io_error) return -2; fprintf(stderr, "Out of memory error in vfat_lookup\n"); exit(1); } result = checkNameForMatch(direntry, dce, filename, longname, shortname, length, flags); } while(result == RES_NOMATCH); if(result == RES_MATCH){ if(longname){ if(dce->longName) strcpy(longname, dce->longName); else *longname ='\0'; } if(shortname) strcpy(shortname, dce->shortName); direntry->beginSlot = dce->beginSlot; direntry->endSlot = dce->endSlot-1; return 0; /* file found */ } else { direntry->entry = -2; return -1; /* no file found */ } } static inline dirCacheEntry_t *vfat_lookup_loop_for_insert(direntry_t *direntry, int initpos, dirCache_t *cache) { dirCacheEntry_t *dce; int io_error; dce = cache->entries[initpos]; if(dce && dce->type != DCET_END) { return dce; } else { direntry->entry = initpos - 1; dce = vfat_lookup_loop_common(direntry, cache, 1, &io_error); if(!dce) { if (io_error) { return NULL; } fprintf(stderr, "Out of memory error in vfat_lookup_loop\n"); exit(1); } return cache->entries[initpos]; } } static void accountFreeSlots(struct scan_state *ssp, dirCacheEntry_t *dce) { if(ssp->got_slots) return; if(ssp->free_end != dce->beginSlot) { ssp->free_start = dce->beginSlot; } ssp->free_end = dce->endSlot; if(ssp->free_end - ssp->free_start >= ssp->size_needed) { ssp->got_slots = 1; ssp->slot = ssp->free_start + ssp->size_needed - 1; } } /* lookup_for_insert replaces the old scandir function. It directly * calls into vfat_lookup_loop, thus eliminating the overhead of the * normal vfat_lookup */ int lookupForInsert(Stream_t *Dir, char *dosname, char *longname, struct scan_state *ssp, int ignore_entry, int source_entry, int pessimisticShortRename) { direntry_t entry; int ignore_match; dirCacheEntry_t *dce; dirCache_t *cache; int pos; /* position _before_ the next answered entry */ char shortName[13]; ignore_match = (ignore_entry == -2 ); initializeDirentry(&entry, Dir); ssp->match_free = 0; /* hash bitmap of already encountered names. Speeds up batch appends * to huge directories, because in the best case, we only need to scan * the new entries rather than the whole directory */ cache = allocDirCache(Dir, 1); if(!cache) { fprintf(stderr, "Out of memory error in lookupForInsert\n"); exit(1); } if(!ignore_match) unix_name(dosname, dosname + 8, 0, shortName); pos = cache->nrHashed; if(source_entry >= 0 || (pos && isHashed(cache, longname))) { pos = 0; } else if(pos && !ignore_match && isHashed(cache, shortName)) { if(pessimisticShortRename) { ssp->shortmatch = -2; return 1; } pos = 0; } else if(growDirCache(cache, pos) < 0) { fprintf(stderr, "Out of memory error in vfat_looup [0]\n"); exit(1); } do { dce = vfat_lookup_loop_for_insert(&entry, pos, cache); switch(dce->type) { case DCET_FREE: accountFreeSlots(ssp, dce); break; case DCET_USED: if(!(dce->dir.attr & 0x8) && dce->endSlot - 1 == source_entry) accountFreeSlots(ssp, dce); /* labels never match, neither does the * ignored entry */ if( (dce->dir.attr & 0x8) || (dce->endSlot - 1 == ignore_entry) ) break; /* check long name */ if((dce->longName && !strcasecmp(dce->longName, longname)) || (dce->shortName && !strcasecmp(dce->shortName, longname))) { ssp->longmatch = dce->endSlot - 1; /* long match is a reason for * immediate stop */ return 1; } /* Long name or not, always check for * short name match */ if (!ignore_match && !strcasecmp(shortName, dce->shortName)) ssp->shortmatch = dce->endSlot - 1; break; case DCET_END: break; } pos = dce->endSlot; } while(dce->type != DCET_END); if (ssp->shortmatch > -1) return 1; ssp->max_entry = dce->beginSlot; if (ssp->got_slots) return 6; /* Success */ /* Need more room. Can we grow the directory? */ if(!isRootDir(Dir)) return 5; /* OK, try to grow the directory */ fprintf(stderr, "No directory slots\n"); return -1; } /* End vfat.c */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Io to an xdf disk * * written by: * * Alain L. Knaff * alain@linux.lu * */ #include "sysincludes.h" #ifdef OS_linux #include "msdos.h" #include "mtools.h" #include "devices.h" #include "xdf_io.h" extern int errno; /* Algorithms can't be patented */ typedef struct sector_map { unsigned int head:1; unsigned int size:7; } sector_map_t; struct { unsigned char track_size; unsigned int track0_size:7; unsigned int rootskip:1; unsigned char rate; sector_map_t map[9]; } xdf_table[]= { { 19, 16, 0, 0, { {0,3}, {0,6}, {1,2}, {0,2}, {1,6}, {1,3}, {0,0} } }, { 23, 19, 0, 0, { {0,3}, {0,4}, {1,6}, {0,2}, {1,2}, {0,6}, {1,4}, {1,3}, {0,0} } }, { 46, 37, 0x43, 1, { {0,3}, {0,4}, {0,5}, {0,7}, {1,3}, {1,4}, {1,5}, {1,7}, {0,0} } }, { 24, 20, 0, 1, { {0,5}, {1,6}, {0,6}, {1, 5} } }, { 48, 41, 0, 1, { {0,6}, {1,7}, {0,7}, {1, 6} } } }; #define NUMBER(x) (sizeof(x)/sizeof(x[0])) typedef struct { unsigned char begin; /* where it begins */ unsigned char end; unsigned char sector; unsigned char sizecode; unsigned int dirty:1; unsigned int phantom:2; unsigned int valid:1; unsigned int head:1; } TrackMap_t; typedef struct Xdf_t { Class_t *Class; int refs; Stream_t *Next; Stream_t *Buffer; int fd; char *buffer; int current_track; sector_map_t *map; int track_size; int track0_size; int sector_size; int FatSize; int RootDirSize; TrackMap_t *track_map; unsigned char last_sector; unsigned char rate; unsigned int stretch:1; unsigned int rootskip:1; signed int drive:4; } Xdf_t; typedef struct { unsigned char head; unsigned char sector; unsigned char ptr; } Compactify_t; static int analyze_reply(RawRequest_t *raw_cmd, int do_print) { int ret, bytes, newbytes; bytes = 0; while(1) { ret = analyze_one_reply(raw_cmd, &newbytes, do_print); bytes += newbytes; switch(ret) { case 0: return bytes; case 1: raw_cmd++; break; case -1: if(bytes) return bytes; else return 0; } } } static int send_cmd(int fd, RawRequest_t *raw_cmd, int nr, const char *message, int retries) { int j; int ret=-1; if(!nr) return 0; for (j=0; j< retries; j++){ switch(send_one_cmd(fd, raw_cmd, message)) { case -1: return -1; case 1: j++; continue; case 0: break; } if((ret=analyze_reply(raw_cmd, j)) > 0) return ret; /* ok */ } if(j > 1 && j == retries) { fprintf(stderr,"Too many errors, giving up\n"); return 0; } return -1; } #define REC (This->track_map[ptr]) #define END(x) (This->track_map[(x)].end) #define BEGIN(x) (This->track_map[(x)].begin) static int add_to_request(Xdf_t *This, int ptr, RawRequest_t *request, int *nr, int direction, Compactify_t *compactify) { #if 0 if(direction == MT_WRITE) { printf("writing %d: %d %d %d %d [%02x]\n", ptr, This->current_track, REC.head, REC.sector, REC.sizecode, *(This->buffer + ptr * This->sector_size)); } else printf(" load %d.%d\n", This->current_track, ptr); #endif if(REC.phantom) { if(direction== MT_READ) memset(This->buffer + ptr * This->sector_size, 0, 128 << REC.sizecode); return 0; } if(*nr && RR_SIZECODE(request+(*nr)-1) == REC.sizecode && compactify->head == REC.head && compactify->ptr + 1 == ptr && compactify->sector +1 == REC.sector) { RR_SETSIZECODE(request+(*nr)-1, REC.sizecode); } else { if(*nr) RR_SETCONT(request+(*nr)-1); RR_INIT(request+(*nr)); RR_SETDRIVE(request+(*nr), This->drive); RR_SETRATE(request+(*nr), This->rate); RR_SETTRACK(request+(*nr), This->current_track); RR_SETPTRACK(request+(*nr), This->current_track << This->stretch); RR_SETHEAD(request+(*nr), REC.head); RR_SETSECTOR(request+(*nr), REC.sector); RR_SETSIZECODE(request+(*nr), REC.sizecode); RR_SETDIRECTION(request+(*nr), direction); RR_SETDATA(request+(*nr), (caddr_t) This->buffer + ptr * This->sector_size); (*nr)++; } compactify->ptr = ptr; compactify->head = REC.head; compactify->sector = REC.sector; return 0; } static void add_to_request_if_invalid(Xdf_t *This, int ptr, RawRequest_t *request, int *nr, Compactify_t *compactify) { if(!REC.valid) add_to_request(This, ptr, request, nr, MT_READ, compactify); } static void adjust_bounds(Xdf_t *This, off_t *begin, off_t *end) { /* translates begin and end from byte to sectors */ *begin = *begin / This->sector_size; *end = (*end + This->sector_size - 1) / This->sector_size; } static inline int try_flush_dirty(Xdf_t *This) { int ptr, nr, bytes; RawRequest_t requests[100]; Compactify_t compactify; if(This->current_track < 0) return 0; nr = 0; for(ptr=0; ptr < This->last_sector; ptr=REC.end) if(REC.dirty) add_to_request(This, ptr, requests, &nr, MT_WRITE, &compactify); #if 1 bytes = send_cmd(This->fd,requests, nr, "writing", 4); if(bytes < 0) return bytes; #else bytes = 0xffffff; #endif for(ptr=0; ptr < This->last_sector; ptr=REC.end) if(REC.dirty) { if(bytes >= REC.end - REC.begin) { bytes -= REC.end - REC.begin; REC.dirty = 0; } else return 1; } return 0; } static int flush_dirty(Xdf_t *This) { int ret; while((ret = try_flush_dirty(This))) { if(ret < 0) return ret; } return 0; } static int load_data(Xdf_t *This, off_t begin, off_t end, int retries) { int ptr, nr, bytes; RawRequest_t requests[100]; Compactify_t compactify; adjust_bounds(This, &begin, &end); ptr = begin; nr = 0; for(ptr=REC.begin; ptr < end ; ptr = REC.end) add_to_request_if_invalid(This, ptr, requests, &nr, &compactify); bytes = send_cmd(This->fd,requests, nr, "reading", retries); if(bytes < 0) return bytes; ptr = begin; for(ptr=REC.begin; ptr < end ; ptr = REC.end) { if(!REC.valid) { if(bytes >= REC.end - REC.begin) { bytes -= REC.end - REC.begin; REC.valid = 1; } else if(ptr > begin) return ptr * This->sector_size; else return -1; } } return end * This->sector_size; } static void mark_dirty(Xdf_t *This, off_t begin, off_t end) { int ptr; adjust_bounds(This, &begin, &end); ptr = begin; for(ptr=REC.begin; ptr < end ; ptr = REC.end) { REC.valid = 1; if(!REC.phantom) REC.dirty = 1; } } static int load_bounds(Xdf_t *This, off_t begin, off_t end) { off_t lbegin, lend; int endp1, endp2; lbegin = begin; lend = end; adjust_bounds(This, &lbegin, &lend); if(begin != BEGIN(lbegin) * This->sector_size && end != BEGIN(lend) * This->sector_size && lend < END(END(lbegin))) /* contiguous end & begin, load them in one go */ return load_data(This, begin, end, 4); if(begin != BEGIN(lbegin) * This->sector_size) { endp1 = load_data(This, begin, begin, 4); if(endp1 < 0) return endp1; } if(end != BEGIN(lend) * This->sector_size) { endp2 = load_data(This, end, end, 4); if(endp2 < 0) return BEGIN(lend) * This->sector_size; } return lend * This->sector_size; } static int fill_t0(Xdf_t *This, int ptr, int size, int *sector, int *head) { int n; for(n = 0; n < size; ptr++,n++) { REC.head = *head; REC.sector = *sector + 129; REC.phantom = 0; (*sector)++; if(!*head && *sector >= This->track0_size - 8) { *sector = 0; *head = 1; } } return ptr; } static int fill_phantoms(Xdf_t *This, int ptr, int size) { int n; for(n = 0; n < size; ptr++,n++) REC.phantom = 1; return ptr; } static void decompose(Xdf_t *This, int where, int len, off_t *begin, off_t *end, int boot) { int ptr, track; sector_map_t *map; int lbegin, lend; track = where / This->track_size / 1024; *begin = where - track * This->track_size * 1024; *end = where + len - track * This->track_size * 1024; maximize(*end, This->track_size * 1024); if(This->current_track == track && !boot) /* already OK, return immediately */ return; if(!boot) flush_dirty(This); This->current_track = track; if(track) { for(ptr=0, map=This->map; map->size; map++) { /* iterate through all sectors */ lbegin = ptr; lend = ptr + (128 << map->size) / This->sector_sizaG��cG��dG��eG��fG��gG��hG��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������e; for( ; ptr < lend ; ptr++) { REC.begin = lbegin; REC.end = lend; REC.head = map->head; REC.sector = map->size + 128; REC.sizecode = map->size; REC.valid = 0; REC.dirty = 0; REC.phantom = 0; } } REC.begin = REC.end = ptr; } else { int sector, head; head = 0; sector = 0; for(ptr=boot; ptr < 2 * This->track_size; ptr++) { REC.begin = ptr; REC.end = ptr+1; REC.sizecode = 2; REC.valid = 0; REC.dirty = 0; } /* boot & 1st fat */ ptr=fill_t0(This, 0, 1 + This->FatSize, §or, &head); /* second fat */ ptr=fill_phantoms(This, ptr, This->FatSize); /* root dir */ ptr=fill_t0(This, ptr, This->RootDirSize, §or, &head); /* "bad sectors" at the beginning of the fs */ ptr=fill_phantoms(This, ptr, 5); if(This->rootskip) sector++; /* beginning of the file system */ ptr = fill_t0(This, ptr, (This->track_size - This->FatSize) * 2 - This->RootDirSize - 6, §or, &head); } This->last_sector = ptr; } static int xdf_read(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { off_t begin, end; size_t len2; DeclareThis(Xdf_t); decompose(This, truncBytes32(where), len, &begin, &end, 0); len2 = load_data(This, begin, end, 4); if(len2 < 0) return len2; len2 -= begin; maximize(len, len2); memcpy(buf, This->buffer + begin, len); return end - begin; } static int xdf_write(Stream_t *Stream, char *buf, mt_off_t where, size_t len) { off_t begin, end; size_t len2; DeclareThis(Xdf_t); decompose(This, truncBytes32(where), len, &begin, &end, 0); len2 = load_bounds(This, begin, end); if(len2 < 0) return len2; maximize(end, len2); len2 -= begin; maximize(len, len2); memcpy(This->buffer + begin, buf, len); mark_dirty(This, begin, end); return end - begin; } static int xdf_flush(Stream_t *Stream) { DeclareThis(Xdf_t); return flush_dirty(This); } static int xdf_free(Stream_t *Stream) { DeclareThis(Xdf_t); Free(This->track_map); Free(This->buffer); return close(This->fd); } static int check_geom(struct device *dev, int media, struct bootsector *boot) { int sect; if(media >= 0xfc && media <= 0xff) return 1; /* old DOS */ if (!IS_MFORMAT_ONLY(dev)) { if(compare(dev->sectors, 19) && compare(dev->sectors, 23) && compare(dev->sectors, 24) && compare(dev->sectors, 46) && compare(dev->sectors, 48)) return 1; /* check against contradictory info from configuration file */ if(compare(dev->heads, 2)) return 1; } /* check against info from boot */ if(boot) { sect = WORD(nsect); if((sect != 19 && sect != 23 && sect != 24 && sect != 46 && sect != 48) || (!IS_MFORMAT_ONLY(dev) && compare(dev->sectors, sect)) || WORD(nheads) !=2) return 1; } return 0; } static void set_geom(struct bootsector *boot, struct device *dev) { /* fill in config info to be returned to user */ dev->heads = 2; dev->use_2m = 0xff; if(boot) { dev->sectors = WORD(nsect); if(WORD(psect)) dev->tracks = WORD(psect) / dev->sectors / 2; } } static int config_geom(Stream_t *Stream, struct device *dev, struct device *orig_dev, int media, struct bootsector *boot) { if(check_geom(dev, media, boot)) return 1; set_geom(boot,dev); return 0; } static Class_t XdfClass = { xdf_read, xdf_write, xdf_flush, xdf_free, config_geom, 0, /* get_data */ 0 /* pre-allocate */ }; Stream_t *XdfOpen(struct device *dev, char *name, int mode, char *errmsg, struct xdf_info *info) { Xdf_t *This; off_t begin, end; struct bootsector *boot; int type; if(dev && (!SHOULD_USE_XDF(dev) || check_geom(dev, 0, 0))) return NULL; This = New(Xdf_t); if (!This) return NULL; This->Class = &XdfClass; This->sector_size = 512; This->stretch = 0; precmd(dev); This->fd = open(name, mode | dev->mode | O_EXCL | O_NDELAY); if(This->fd < 0) { #ifdef HAVE_SNPRINTF snprintf(errmsg,199,"xdf floppy: open: \"%s\"", strerror(errno)); #else sprintf(errmsg,"xdf floppy: open: \"%s\"", strerror(errno)); #endif goto exit_0; } closeExec(This->fd); This->drive = GET_DRIVE(This->fd); if(This->drive < 0) goto exit_1; /* allocate buffer */ This->buffer = (char *) malloc(96 * 512); if (!This->buffer) goto exit_1; This->current_track = -1; This->track_map = (TrackMap_t *) calloc(96, sizeof(TrackMap_t)); if(!This->track_map) goto exit_2; /* lock the device on writes */ if (lock_dev(This->fd, mode == O_RDWR, dev)) { #ifdef HAVE_SNPRINTF snprintf(errmsg,199,"xdf floppy: device \"%s\" busy:", dev->name); #else sprintf(errmsg,"xdf floppy: device \"%s\" busy:", dev->name); #endif goto exit_3; } /* Before reading the boot sector, assume dummy values suitable * for reading at least the boot sector */ This->track_size = 11; This->track0_size = 6; This->rate = 0; This->FatSize = 9; This->RootDirSize = 1; decompose(This, 0, 512, &begin, &end, 0); if (load_data(This, 0, 1, 1) < 0 ) { This->rate = 0x43; if(load_data(This, 0, 1, 1) < 0) goto exit_3; } boot = (struct bootsector *) This->buffer; This->FatSize = WORD(fatlen); This->RootDirSize = WORD(dirents)/16; This->track_size = WORD(nsect); for(type=0; type < NUMBER(xdf_table); type++) { if(xdf_table[type].track_size == This->track_size) { This->map = xdf_table[type].map; This->track0_size = xdf_table[type].track0_size; This->rootskip = xdf_table[type].rootskip; break; } } if(type == NUMBER(xdf_table)) goto exit_3; if(info) { info->RootDirSize = This->RootDirSize; info->FatSize = This->FatSize; info->BadSectors = 5; } decompose(This, 0, 512, &begin, &end, 1); This->refs = 1; This->Next = 0; This->Buffer = 0; if(dev) set_geom(boot, dev); return (Stream_t *) This; exit_3: Free(This->track_map); exit_2: Free(This->buffer); exit_1: close(This->fd); exit_0: Free(This); return NULL; } #endif /* Algorithms can't be patented */ ��������������������������������������������������������������������������������������������������������������������������������������������#ifndef MTOOLS_XDFIO_H #define MTOOLS_XDFIO_H #include "msdos.h" #include "stream.h" struct xdf_info { int FatSize; int RootDirSize; int BadSectors; }; Stream_t *XdfOpen(struct device *dev, char *name, int mode, char *errmsg, struct xdf_info *info); #endif ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������( .�������������..������������) Makefile������* cc.c����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for commands/i86. CFLAGS = -D_MINIX -D_POSIX_SOURCE CCLD = $(CC) -i $(CFLAGS) MAKE = exec make -$(MAKEFLAGS) all: cc cc: cc.c $(CCLD) -o $@ $? install -S 6kb $@ install: /usr/bin/cc /usr/bin/m2 /usr/bin/pc /usr/bin/cc: cc install -cs -o bin $? $@ /usr/bin/m2 /usr/bin/pc: /usr/bin/cc install -l $? $@ clean: rm -rf a.out core cc ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Driver for Minix compilers. Written june 1987 by Ceriel J.H. Jacobs, partly derived from old cc-driver, written by Erik Baalbergen. This driver is mostly table-driven, the table being in the form of some global initialized structures. */ /* $Header: cc.c,v 1.35 91/04/12 15:33:50 ceriel Exp $ */ #include <sys/types.h> #include <sys/wait.h> #include <errno.h> #include <signal.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> /* Paths. (Executables in /usr are first tried with /usr stripped off.) */ #define SHELL "/bin/sh" #define PP "/usr/lib/ncpp" #define IRREL "/usr/lib/irrel" #define CEM "/usr/lib/ncem" #define M2EM "/usr/lib/nm2em" #define ENCODE "/usr/lib/em_encode" #define OPT "/usr/lib/nopt" #define CG "/usr/lib/ncg" #define AS "/usr/lib/as" #define LD "/usr/lib/ld" #define CV "/usr/lib/cv" #define LIBDIR "/usr/lib" #define CRT "/usr/lib/ncrtso.o" #define PEM "/usr/lib/npem" #define PRT "/usr/lib/nprtso.o" #define M2RT "/usr/lib/nm2rtso.o" #define LIBC "/usr/lib/libd.a", "/usr/lib/libc.a" #define LIBP "/usr/lib/libp.a", "/usr/lib/libc.a" #define LIBM2 "/usr/lib/libm2.a", "/usr/lib/libc.a" #define END "/usr/lib/libe.a", "/usr/lib/end.a" #define M2DEF "-I/usr/lib/m2" /* every pass that this program knows about has associated with it a structure, containing such information as its name, where it resides, the flags it accepts, and the like. */ struct passinfo { char *p_name; /* name of this pass */ char *p_path; /* where is it */ char *p_from; /* suffix of source (comma-separated list) */ char *p_to; /* suffix of destination */ char *p_acceptflags; /* comma separated list; format: flag flag* flag=xxx flag*=xxx[*] where a star matches a, possibly empty, string */ int p_flags; #define INPUT 01 /* needs input file as argument */ #define OUTPUT 02 /* needs output file as argument */ #define LOADER 04 /* this pass is the loader */ #define STDIN 010 /* reads from standard input */ #define STDOUT 020 /* writes on standard output */ #define NOCLEAN 040 /* do not remove target if this pass fails */ #define O_OUTPUT 0100 /* -o outputfile, hack for as */ #define PREPALWAYS 0200 /* always to be preprocessed */ #define PREPCOND 0400 /* preprocessed when starting with '#' */ #define PREPNOLN 01000 /* suppress line number info (cpp -P) */ }; #define MAXHEAD 10 #define MAXTAIL 5 #define MAXPASS 7 /* Every language handled by this program has a "compile" structure associated with it, describing the start-suffix, how the driver for this language is called, which passes must be called, which flags and arguments must be passed to these passes, etc. The language is determined by the suffix of the argument program. However, if this suffix does not determine a language (DEFLANG), the callname is used. Notice that the 's' suffix does not determine a language, because the input file could have been derived from f.i. a C-program. So, if you use "cc x.s", the C-runtime system will be used, but if you use "as x.s", it will not. */ struct compile { char *c_suffix; /* starting suffix of this list of passes */ char *c_callname; /* affects runtime system loaded with program */ struct pass { char *pp_name; /* name of the pass */ char *pp_head[MAXHEAD]; /* args in front of filename */ char *pp_tail[MAXTAIL]; /* args after filename */ } c_passes[MAXPASS]; int c_flags; #define DEFLANG 010 /* this suffix determines a language */ }; struct passinfo passinfo[] = { { "cpp", PP, "CPP", "i", "wo=o,I*,D*,U*,P", INPUT|STDOUT }, { "irrel", IRREL, "i", "i", "m", INPUT}, { "cem", CEM, "i,c", "k", "m=o,p,wa=a,wo=o,ws=s,w,T*", INPUT|OUTPUT|PREPALWAYS }, { "pc", PEM, "i,p", "k", "n=L,w,a,A,R", INPUT|OUTPUT|PREPCOND }, { "m2", M2EM, "i,mod", "k", "n=L,w*,A,R,W*,3,I*", INPUT|OUTPUT|PREPCOND }, { "encode", ENCODE, "i,e", "k", "", INPUT|STDOUT|PREPCOND|PREPNOLN }, { "opt", OPT, "k", "m", "", STDIN|STDOUT }, { "cg", CG, "m", "s", "O=p4", INPUT|OUTPUT }, { "as", AS, "i,s", "o", "T*", INPUT|O_OUTPUT|PREPCOND }, { "ld", LD, "o", "out", "i,s", INPUT|LOADER }, /* changed */ { "cv", CV, "out", 0, "", INPUT|OUTPUT|NOCLEAN }, /* must come after loader */ { 0} }; #define PREP_FLAGS "-D_EM_WSIZE=2", "-D_EM_PSIZE=2", "-D_EM_SSIZE=2", \ "-D_EM_LSIZE=4", "-D_EM_FSIZE=4", "-D_EM_DSIZE=8", \ "-D__ACK__", "-D__minix", "-D__i86" struct pass preprocessor = { "cpp", { PREP_FLAGS } , {0} }; struct pass prepnoln = { "cpp", { PREP_FLAGS, "-P" } , {0} }; struct pass irrel = { "irrel", {0} }; /* The "*" in the arguments for the loader indicates the place where the * fp-emulation library should come. */ struct compile passes[] = { { "c", "cc", { { "cem", {"-L"}, {0} }, /* changed */ { "opt", {0}, {0} }, { "cg", {0}, {0} }, { "as", {"-"}, {0} }, { "ld", {CRT}, /* changed */ {LIBC, "*", END}}, { "cv", {0}, {0} } }, DEFLANG }, { "p", "pc", { { "pc", {0}, {0} }, { "opt", {0}, {0} }, { "cg", {0}, {0} }, { "as", {"-"}, {0} }, { "ld", {PRT}, {LIBP, "*", END}}, { "cv", {0}, {0} } }, DEFLANG }, { "mod", "m2", { { "m2", {M2DEF}, {0} }, { "opt", {0}, {0} }, { "cg", {0}, {0} }, { "as", {"-"}, {0} }, { "ld", {M2RT}, {LIBM2, "*", END}}, { "cv", {0}, {0} } }, DEFLANG }, { "e", "encode", { { "encode", {0}, {0}}, { "opt", {0}, {0} }, { "cg", {0}, {0} }, { "as", {"-"}, {0} }, { "ld", {0}, {"*", END}}, { "cv", {0}, {0} } }, DEFLANG }, { "s", "as", { { "as", {0}, {0}} }, 0 }, { "CPP", "cpp", { { "cpp", {PREP_FLAGS}, {0}} }, DEFLANG }, { 0}, }; #define MAXARGC 150 /* maximum number of arguments allowed in a list */ #define USTR_SIZE 64 /* maximum length of string variable */ typedef char USTRING[USTR_SIZE]; struct arglist { int al_argc; char *al_argv[MAXARGC]; }; struct arglist CALLVEC; int kids = -1; char *o_FILE = "a.out"; /* default name for executable file */ #define init(a) ((a)->al_argc = 1) #define cleanup(str) (str && remove(str)) char *ProgCall = 0; int RET_CODE = 0; char *stopsuffix; int v_flag = 0; int t_flag = 0; int noexec = 0; int fp_lib = 1; int E_flag = 0; int i_flag = 1; USTRING curfil; USTRING newfil; struct arglist SRCFILES; struct arglist LDIRS; struct arglist LDFILES; struct arglist GEN_LDFILES; struct arglist FLAGS; char *tmpdir = "/tmp"; char tmpname[64]; struct compile *compbase; struct pass *loader; struct passinfo *loaderinfo; char *source; int maxLlen; _PROTOTYPE(char *library, (char *nm )); _PROTOTYPE(void trapcc, (int sig )); _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(int remove, (char *str )); _PROTOTYPE(char *alloc, (unsigned u )); _PROTOTYPE(int append, (struct arglist *al, char *arg )); _PROTOTYPE(int concat, (struct arglist *al1, struct arglist *al2 )); _PROTOTYPE(char *mkstr, (char *dst, char *arg1, char *arg2, char *arg3 )); _PROTOTYPE(int basename, (char *str, char *dst )); _PROTOTYPE(char *extension, (char *fln )); _PROTOTYPE(int runvec, (struct arglist *vec, struct passinfo *pass, char *in, char *out )); _PROTOTYPE(int prnum, (unsigned x )); _PROTOTYPE(int prs, (char *str )); _PROTOTYPE(int panic, (char *str )); _PROTOTYPE(int pr_vec, (struct arglist *vec )); _PROTOTYPE(int ex_vec, (struct arglist *vec )); _PROTOTYPE(int mktempname, (char *nm )); _PROTOTYPE(int mkbase, (void)); _PROTOTYPE(int mkloader, (void)); _PROTOTYPE(int needsprep, (char *name )); _PROTOTYPE(int cfile, (char *name )); _PROTOTYPE(char *apply, (struct passinfo *pinf, struct compile *cp, char *name, int passindex, int noremove, int first, char *resultname )); _PROTOTYPE(int applicable, (struct passinfo *pinf, char *suffix )); _PROTOTYPE(char *process, (char *name, int noremove )); _PROTOTYPE(int mkvec, (struct arglist *call, char *in, char *out, struct pass *pass, struct passinfo *pinf )); _PROTOTYPE(int callld, (struct arglist *in, char *out, struct pass *pass, struct passinfo *pinf )); _PROTOTYPE(int clean, (struct arglist *c )); _PROTOTYPE(int scanflags, (struct arglist *call, struct passinfo *pinf )); char * library(nm) char *nm; { static csG��uG��vG��wG��xG��yG��zG��{G��|G��}G��~G��G��G��G��G��G��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������har f[512]; int Lcount; for (Lcount = 0; Lcount < LDIRS.al_argc; Lcount++) { mkstr(f, LDIRS.al_argv[Lcount], "/lib", nm); strcat(f, ".a"); if (access(f, 0) != 0) { f[strlen(f)-1] = 'a'; if (access(f, 0) != 0) continue; } return f; } mkstr(f, LIBDIR, "/lib", nm); strcat(f, ".a"); if (access(f, 0) != 0) { int i = strlen(f) - 1; f[i] = 'a'; if (access(f, 0) != 0) f[i] = 'A'; } return f; } void trapcc(sig) int sig; { signal(sig, SIG_IGN); if (kids != -1) kill(kids, sig); cleanup(newfil); cleanup(curfil); exit(1); } main(argc, argv) char *argv[]; { char *str; char **argvec; int count; char *file; maxLlen = strlen(LIBDIR); ProgCall = *argv++; mkbase(); if (signal(SIGHUP, SIG_IGN) != SIG_IGN) signal(SIGHUP, trapcc); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, trapcc); if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) signal(SIGQUIT, trapcc); while (--argc > 0) { if (*(str = *argv++) != '-' || str[1] == 0) { append(&SRCFILES, str); continue; } if (strcmp(str, "-com") == 0) { i_flag = 0; } else if (strcmp(str, "-sep") == 0) { i_flag = 1; } else { switch (str[1]) { case 'c': stopsuffix = "o"; if (str[2] == '.') stopsuffix = str + 3; break; case 'f': fp_lib = (strcmp(str+2, "hard") != 0); break; case 'F': case 'W': /* Ignore. */ break; case 'L': append(&LDIRS, &str[2]); count = strlen(&str[2]); if (count > maxLlen) maxLlen = count; break; case 'l': append(&SRCFILES, library(&str[2])); break; case 'm': /* Use -m, ignore -mxxx. */ if (str[2] == 0) append(&FLAGS, str); break; case 'o': if (argc-- >= 0) o_FILE = *argv++; break; case 'S': stopsuffix = "s"; break; case 'E': E_flag = 1; stopsuffix = "i"; break; case 'P': stopsuffix = "i"; append(&FLAGS, str); break; case 'v': v_flag++; if (str[2] == 'n') noexec = 1; break; case 't': /* save temporaries */ t_flag++; break; case '.': if (str[2] == 'o') { /* no runtime start-off */ loader->pp_head[0] = 0; } break; case 'i': i_flag++; break; case 'T': tmpdir = &str[2]; /*FALLTHROUGH*/ default: append(&FLAGS, str); } } } if (i_flag) append(&FLAGS, "-i"); mktempname(tmpname); count = SRCFILES.al_argc; argvec = &(SRCFILES.al_argv[0]); while (count-- > 0) { file = *argvec++; source = file; file = process(file, 1); if (file && ! stopsuffix) append(&LDFILES, file); } clean(&SRCFILES); /* loader ... */ if (RET_CODE == 0 && LDFILES.al_argc > 0) { register struct passinfo *pp = passinfo; while (!(pp->p_flags & LOADER)) pp++; mkstr(newfil, tmpname, pp->p_to, ""); callld(&LDFILES, !((pp+1)->p_name) ? o_FILE : newfil, loader, pp); if (RET_CODE == 0) { register int i = GEN_LDFILES.al_argc; while (i-- > 0) { remove(GEN_LDFILES.al_argv[i]); free(GEN_LDFILES.al_argv[i]); } if ((++pp)->p_name) { process(newfil, 0); } } } exit(RET_CODE); } remove(str) char *str; { if (t_flag) return; if (v_flag) { prs("rm "); prs(str); prs("\n"); } if (noexec) return; unlink(str); } char * alloc(u) unsigned u; { register char *p = malloc(u); if (p == 0) panic("no space\n"); return p; } append(al, arg) struct arglist *al; char *arg; { char *a = alloc((unsigned) (strlen(arg) + 1)); strcpy(a, arg); if (al->al_argc >= MAXARGC) panic("argument list overflow\n"); al->al_argv[(al->al_argc)++] = a; } concat(al1, al2) struct arglist *al1, *al2; { register i = al2->al_argc; register char **p = &(al1->al_argv[al1->al_argc]); register char **q = &(al2->al_argv[0]); if ((al1->al_argc += i) >= MAXARGC) panic("argument list overflow\n"); while (i-- > 0) *p++ = *q++; } char * mkstr(dst, arg1, arg2, arg3) char *dst, *arg1, *arg2, *arg3; { register char *p; register char *q = dst; p = arg1; while (*q++ = *p++); q--; p = arg2; while (*q++ = *p++); q--; p = arg3; while (*q++ = *p++); q--; return dst; } basename(str, dst) char *str; register char *dst; { register char *p1 = str; register char *p2 = p1; while (*p1) if (*p1++ == '/') p2 = p1; p1--; while (*p1 != '.' && p1 > p2) p1--; if (*p1 == '.') { *p1 = '\0'; while (*dst++ = *p2++); *p1 = '.'; } else while (*dst++ = *p2++); } char * extension(fln) char *fln; { register char *fn = fln; while (*fn) fn++; while (fn > fln && *fn != '.') fn--; if (fn != fln) return fn+1; return (char *)0; } runvec(vec, pass, in, out) struct arglist *vec; struct passinfo *pass; char *in, *out; { int pid, status; int shifted = 0; if ( strncmp(vec->al_argv[1], "/usr/", 5) == 0 && access(vec->al_argv[1] + 4, 1) == 0 ) { vec->al_argv[1] += 4; shifted = 1; } if (v_flag) { pr_vec(vec); if (pass->p_flags & STDIN) { prs(" <"); prs(in); } if (pass->p_flags & STDOUT && !E_flag) { prs(" >"); prs(out); } prs("\n"); } if (noexec) { if (shifted) vec->al_argv[1] -= 4; clean(vec); return 1; } if ((pid = fork()) == 0) { /* start up the process */ if (pass->p_flags & STDIN && strcmp(in, "-") != 0) { /* redirect standard input */ close(0); if (open(in, 0) != 0) panic("cannot open input file\n"); } if (pass->p_flags & STDOUT && !E_flag) { /* redirect standard output */ close(1); if (creat(out, 0666) != 1) panic("cannot create output file\n"); } ex_vec(vec); } if (pid == -1) panic("no more processes\n"); kids = pid; wait(&status); if (status) switch(status & 0177) { case SIGHUP: case SIGINT: case SIGQUIT: case SIGTERM: case 0: break; default: if (E_flag && (status & 0177) == SIGPIPE) break; prs(vec->al_argv[1]); prs(" died with signal "); prnum(status & 0177); prs("\n"); } if (shifted) vec->al_argv[1] -= 4; clean(vec); kids = -1; return status ? ((RET_CODE = 1), 0) : 1; } prnum(x) register unsigned x; { static char numbuf[8]; /* though it prints at most 3 characters */ register char *cp = numbuf + sizeof(numbuf) - 1; *cp = '\0'; while (x >= 10) { *--cp = (x % 10) + '0'; x /= 10; } *--cp = x + '0'; prs(cp); } prs(str) char *str; { if (str && *str) write(2, str, strlen(str)); } panic(str) char *str; { prs(str); trapcc(SIGINT); } pr_vec(vec) register struct arglist *vec; { register char **ap = &vec->al_argv[1]; vec->al_argv[vec->al_argc] = 0; prs(*ap); while (*++ap) { prs(" "); if (strlen(*ap)) prs(*ap); else prs("(empty)"); } } ex_vec(vec) register struct arglist *vec; { extern int errno; vec->al_argv[vec->al_argc] = 0; execv(vec->al_argv[1], &(vec->al_argv[1])); if (errno == ENOEXEC) { /* not an a.out, try it with the SHELL */ vec->al_argv[0] = SHELL; execv(SHELL, &(vec->al_argv[0])); } if (access(vec->al_argv[1], 1) == 0) { /* File is executable. */ prs("Cannot execute "); prs(vec->al_argv[1]); prs(". Not enough memory.\n"); prs("Reduce the memory use of your system and try again\n"); } else { prs(vec->al_argv[1]); prs(" is not executable\n"); } exit(1); } mktempname(nm) register char *nm; { register int i; register int pid = getpid(); mkstr(nm, tmpdir, "/", compbase->c_callname); while (*nm) nm++; for (i = 9; i > 3; i--) { *nm++ = (pid % 10) + '0'; pid /= 10; } *nm++ = '.'; *nm++ = '\0'; /* null termination */ } mkbase() { register struct compile *p = passes; USTRING callname; register int len; basename(ProgCall, callname); len = strlen(callname); while (p->c_suffix) { if (strcmp(p->c_callname, callname+len-strlen(p->c_callname)) == 0) { compbase = p; mkloader(); return; } p++; } /* we should not get here */ panic("internal error\n"); } mkloader() { register struct passinfo *p = passinfo; register struct pass *pass; while (!(p->p_flags & LOADER)) p++; loaderinfo = p; pass = &(compbase->c_passes[0]); while (strcmp(pass->pp_name, p->p_name)) pass++; loader = pass; } needsprep(name) char *name; { int file; char fc; file = open(name,0); if (file <0) return 0; if (read(file, &fc, 1) != 1) fc = 0; close(file); return fc == '#'; } cfile(name) char *name; { while (*name != '\0' && *name != '.') name++; if (*name == '\0') return 0; return (*++name == 'c' && *++name == '\0'); } char * apply(pinf, cp, name, passindex, noremove, first, resultname) register struct passinfo *pinf; register struct compile *cp; char *name, *resultname; { /* Apply a pass, indicated by "pinf", with args in cp->c_passes[passindex], to name "name", leaving the result in a file with name "resultname", concatenated with result suffix. When neccessary, the preprocessor is run first. If "noremove" is NOT set, the file "name" is removed. */ struct arglist *call = &CALLVEC; struct pass *pass = &(cp->c_passes[passindex]); char *outname; if ( /* this pass is the first pass */ first && ( /* preprocessor always needed */ (pinf->p_flags & PREPALWAYS) ||/* or only when "needsprep" says so */ ( (pinf->p_flags & PREPCOND) && needsprep(name)) ) ) { mkstr(newfil, tmpname, passinfo[0].p_to, ""); mkvec(call, name, newfil, (pinf->p_flags & PREPNOLN) ? &prepnoln : &preprocessor, &passinfo[0]); if (! runvec(call, &passinfo[0], name, newfil)) { cleanup(newfil); return 0; } /* A .c file must always be mishandled by irrel. */ if (cfile(name)) { /* newfil is OK */ mkvec(call, newfil, newfil, &irrel, &passinfo[1]); if (! runvec(call, &passinfo[1], newfil, newfil)) { cleanup(newfil); return 0; } } strcpy(curfil, newfil); newfil[0] = '\0'; name = curfil; noremove = 0; } if (pinf->p_to) outname = mkstr(newfil, resultname, pinf->p_to, ""); else outname = o_FILE; mkvec(call, name, outname, pass, pinf); if (! runvec(call, pinf, name, outname)) { if (! (pinf->p_flags & NOCLEAN)) cleanup(outname); if (! noremove) cleanup(name); return 0; } if (! noremove) cleanup(name); strcpy(curfil, newfil); newfil[0] = '\0'; return curfil; } int applicable(pinf, suffix) struct passinfo *pinf; char *suffix; { /* Return one if the pass indicated by "pinfo" is applicable to a file with suffix "suffix". */ register char *sfx = pinf->p_from; int l; if (! suffix) return 0; l = strlen(suffix); while (*sfx) { register char *p = sfx; while (*p && *p != ',') p++; if (l == p - sfx && strncmp(sfx, suffix, l) == 0) { return 1; } if (*p == ',') sfx = p+1; else sfx = p; } return 0; } char * process(name, noremove) char *name; { register struct compile *cp = passes; char *suffix = extension(name); USTRING base; register struct pass *pass; register struct passinfo *pinf; if (E_flag) { /* -E uses the cpp pass. */ suffix = "CPP"; } if (! suffix) return name; basename(name, base); while (cp->c_suffix) { if ((cp->c_flags & DEFLANG) && strcmp(cp->c_suffix, suffix) == 0) break; cp++; } if (! cp->c_suffix) cp = compbase; pass = cp->c_passes; while (pass->pp_name) { int first = 1; for (pinf=passinfo; strcmp(pass->pp_name,pinf->p_name);pinf++) ; if (! (pinf->p_flags & LOADER) && applicable(pinf, suffix)) { int cont = ! stopsuffix || ! pinf->p_to || strcmp(stopsuffix, pinf->p_to) != 0; name = apply(pinf, cp, name, (int) (pass - cp->c_passes), noremove, first, applicable(loaderinfo, pinf->p_to) || !cont ? strcat(base, ".") : tmpname); first = noremove = 0; suffix = pinf->p_to; if (!cont || !name) break; } pass++; } if (!noremove && name) append(&GEN_LDFILES, name); return name; } mkvec(call, in, out, pass, pinf) struct arglist *call; char *in, *out; struct pass *pass; register struct passinfo *pinf; { register int i; init(call); append(call, pinf->p_path); scanflags(call, pinf); if (pass) for (i = 0; i < MAXHEAD; i++) if (pass->pp_head[i]) append(call, pass->pp_head[i]); else break; if (pinf->p_flags & INPUT && strcmp(in, "-") != 0) append(call, in); if (pinf->p_flags & OUTPUT) append(call, out); if (pinf->p_flags & O_OUTPUT) { append(call, "-o"); append(call, out); } if (pass) for (i = 0; i < MAXTAIL; i++) if (pass->pp_tail[i]) append(call, pass->pp_tail[i]); else break; } callld(in, out, pass, pinf) struct arglist *in; char *out; struct pass *pass; register struct passinfo *pinf; { struct arglist *call = &CALLVEC; register int i; init(call); append(call, pinf->p_path); scanflags(call, pinf); append(call, "-o"); append(call, out); for (i = 0; i < MAXHEAD; i++) if (pass->pp_head[i]) append(call, pass->pp_head[i]); else break; if (pinf->p_flags & INPUT) concat(call, in); if (pinf->p_flags & OUTPUT) append(call, out); for (i = 0; i < MAXTAIL; i++) { if (pass->pp_tail[i]) { if (pass->pp_tail[i][0] == '-' && pass->pp_tail[i][1] == 'l') { append(call, library(&(pass->pp_tail[i][2]))); } else if (*(pass->pp_tail[i]) != '*') append(call, pass->pp_tail[i]); else if (fp_lib) append(call, library("fp")); } else break; } if (! runvec(call, pinf, (char *) 0, out)) { cleanup(out); RET_CODE = 1; } } clean(c) register struct arglist *c; { register int i; for (i = 1; i < c->al_argc; i++) { free(c->al_argv[i]); c->al_argv[i] = 0; } c->al_argc = 0; } scanflags(call, pinf) struct arglist *call; struct passinfo *pinf; { /* Find out which flags from FLAGS must be passed to pass "pinf", and how. Append them to "call" */ register int i; USTRING flg; for (i = 0; i < FLAGS.al_argc; i++) { register char *q = pinf->p_acceptflags; while (*q) { register char *p = FLAGS.al_argv[i] + 1; while (*q && *q == *p) { q++; p++; } if (*q == ',' || !*q) { if (! *p) { /* append literally */ append(call, FLAGS.al_argv[i]); } break; } if (*q == '*') { register char *s = flg; if (*++q != '=') { /* append literally */ append(call, FLAGS.al_argv[i]); break; } *s++ = '-'; if (*q) q++; /* skip ',' */ while (*q && *q != ',' && *q != '*') { /* copy replacement flag */ *s++ = *q++; } if (*q == '*') { /* copy rest */ while (*p) *s++ = *p++; } *s = 0; append(call, flg); break; } if (*q == '=') { /* copy replacement */ register char *s = flg; *s++ = '-'; q++; while (*q && *q != ',') *s++ = *q++; *s = 0; append(call, flg); break; } while (*q && *q++ != ',') ; } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+ .�������������..������������, Makefile������- dosread.c�����. fdisk.c�������/ format.c������0 loadfont.c����1 loadkeys.c����2 mixer.c�������3 part.c��������4 partition.c���5 playwave.c����6 postmort.c����7 readclock.c���8 recwave.c�����9 repartition.c�: screendump.c��; sdump.c�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for commands/ibm. # See commands/simple/Makefile for a description. CFLAGS = -D_MINIX -D_POSIX_SOURCE CCLD = $(CC) -i $(CFLAGS) MAKE = exec make -$(MAKEFLAGS) ALL = \ dosread \ fdisk \ format \ loadfont \ loadkeys \ mixer \ part \ partition \ playwave \ postmort \ readclock \ recwave \ repartition \ screendump \ sdump \ all: $(ALL) dosread: dosread.c $(CCLD) -o $@ $? install -S 16kw $@ fdisk: fdisk.c $(CCLD) -o $@ $? install -S 4kw $@ format: format.c $(CCLD) -o $@ $? install -S 4kw $@ loadfont: loadfont.c $(CCLD) -o $@ $? install -S 4kw $@ loadkeys: loadkeys.c $(CCLD) -o $@ $? install -S 4kw $@ mixer: mixer.c $(CCLD) -o $@ $? -lcurses install -S 4kw $@ part: part.c $(CCLD) -o $@ $? install -S 11kw $@ partition: partition.c $(CCLD) -o $@ $? install -S 4kw $@ playwave: playwave.c $(CCLD) -o $@ $? install -S 4kw $@ postmort: postmort.c $(CCLD) -o $@ $? install -S 4kw $@ readclock: readclock.c $(CCLD) -o $@ $? install -S 4kw $@ recwave: recwave.c $(CCLD) -o $@ $? install -S 4kw $@ repartition: repartition.c $(CCLD) -o $@ $? install -S 4kw $@ screendump: screendump.c $(CCLD) -o $@ $? install -S 4kw $@ sdump: sdump.c $(CCLD) -o $@ $? install -S 4kw $@ install: \ /usr/bin/dosread \ /usr/bin/dosdir \ /usr/bin/doswrite \ /usr/bin/fdisk \ /usr/bin/format \ /usr/bin/loadfont \ /usr/bin/loadkeys \ /usr/bin/mixer \ /usr/bin/part \ /usr/bin/partition \ /usr/bin/playwave \ /usr/bin/postmort \ /usr/bin/readclock \ /usr/bin/recwave \ /usr/bin/repartition \ /usr/bin/screendump \ /usr/bin/sdump \ /bin/loadkeys \ /bin/readclock \ /usr/bin/dosread: dosread install -cs -o bin $? $@ /usr/bin/dosdir /usr/bin/doswrite: /usr/bin/dosread install -l $? $@ /usr/bin/fdisk: fdisk install -cs -o bin $? $@ /usr/bin/format: format install -cs -o root -m 4755 $? $@ /usr/bin/loadfont: loadfont install -cs -o bin $? $@ /usr/bin/loadkeys: loadkeys install -cs -o bin $? $@ /usr/bin/mixer: mixer install -cs -o bin $? $@ /usr/bin/part: part install -cs -o bin $? $@ /usr/bin/partition: partition install -cs -o bin $? $@ /usr/bin/playwave: playwave install -cs -o bin $? $@ /usr/bin/postmort: postmort install -cs -o bin $? $@ /usr/bin/readclock: readclock install -cs -o bin $? $@ /usr/bin/recwave: recwave install -cs -o bin $? $@ /usr/bin/repartition: repartition install -cs -o bin $? $@ /usr/bin/screendump: screendump install -cs -o bin $? $@ /usr/bin/sdump: sdump install -cs -o bin $? $@ /bin/loadkeys: /usr/bin/loadkeys install -lcs $? $@ /bin/readclock: /usr/bin/readclock install -lcs $? $@ clean: rm -rf $(ALL) a.out core �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dos{dir|read|write} - {list|read|write} MS-DOS disks Author: M. Huisjes */ /* Dosdir - list MS-DOS directories. doswrite - write stdin to DOS-file * dosread - read DOS-file to stdout * * Author: Michiel Huisjes. * * Usage: dos... [-lra] drive [file/dir] * l: Give long listing. * r: List recursively. * a: Set ASCII bit. */ #include <assert.h> #include <ctype.h> #include <errno.h> #include <limits.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <sys/times.h> #include <unistd.h> #define MAX_CLUSTER_SIZE 4096 #define MAX_ROOT_ENTRIES 512 #define FAT_START 512L /* After bootsector */ #define ROOTADDR (FAT_START + 2L * fat_size) #define clus_add(cl_no) ((long) (((long) cl_no - 2L) \ * (long) cluster_size \ + data_start \ )) struct dir_entry { unsigned char d_name[8]; unsigned char d_ext[3]; unsigned char d_attribute; unsigned char d_reserved[10]; unsigned short d_time; unsigned short d_date; unsigned short d_cluster; unsigned long d_size; }; typedef struct dir_entry DIRECTORY; #define NOT_USED 0x00 #define ERASED 0xE5 #define DIR 0x2E #define DIR_SIZE (sizeof (struct dir_entry)) #define SUB_DIR 0x10 #define NIL_DIR ((DIRECTORY *) 0) #define LAST_CLUSTER12 0xFFF #define LAST_CLUSTER 0xFFFF #define FREE 0x000 #define BAD 0xFF0 #define BAD16 0xFFF0 typedef int BOOL; #define TRUE 1 #define FALSE 0 #define NIL_PTR ((char *) 0) #define DOS_TIME 315532800L /* 1970 - 1980 */ #define READ 0 #define WRITE 1 #define FIND 3 #define LABEL 4 #define ENTRY 5 #define find_entry(d, e, p) directory(d, e, FIND, p) #define list_dir(d, e, f) (void) directory(d, e, f, NIL_PTR) #define label() directory(root, root_entries, LABEL, NIL_PTR) #define new_entry(d, e) directory(d, e, ENTRY, NIL_PTR) #define is_dir(d) ((d)->d_attribute & SUB_DIR) #define STD_OUT 1 char *cmnd; static int disk; /* File descriptor for disk I/O */ static DIRECTORY root[MAX_ROOT_ENTRIES]; static DIRECTORY save_entry; static char drive[] = "/dev/dosX"; #define DRIVE_NR (sizeof (drive) - 2) static char null[MAX_CLUSTER_SIZE], *device = drive, path[128]; static long data_start; static long mark; /* offset of directory entry to be written */ static unsigned short total_clusters, cluster_size, root_entries, sub_entries; static unsigned long fat_size; static BOOL Rflag, Lflag, Aflag, dos_read, dos_write, dos_dir, fat_16 = 0; static BOOL big_endian; /* maximum size of a cooked 12bit FAT. Also Size of 16bit FAT cache * if not enough memory for whole FAT */ #define COOKED_SIZE 8192 /* raw FAT. Only used for 12bit FAT to make conversion easier */ static unsigned char *raw_fat; /* Cooked FAT. May be only part of the FAT for 16 bit FATs */ static unsigned short *cooked_fat; /* lowest and highest entry in fat cache */ static unsigned short fat_low = USHRT_MAX, fat_high = 0; static BOOL fat_dirty = FALSE; static unsigned int cache_size; /* Prototypes. */ _PROTOTYPE(void usage, (char *prog_name) ); _PROTOTYPE(unsigned c2u2, (unsigned char *ucarray) ); _PROTOTYPE(unsigned long c4u4, (unsigned char *ucarray) ); _PROTOTYPE(void determine, (void)); _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(DIRECTORY *directory, (DIRECTORY *dir, int entries, BOOL function, char *pathname) ); _PROTOTYPE(void extract, (DIRECTORY *entry) ); _PROTOTYPE(void make_file, (DIRECTORY *dir_ptr, int entries, char *name) ); _PROTOTYPE(void fill_date, (DIRECTORY *entry) ); _PROTOTYPE(char *make_name, (DIRECTORY *dir_ptr, int dir_fl) ); _PROTOTYPE(int fill, (char *buffer, size_t size) ); _PROTOTYPE(void xmodes, (int mode) ); _PROTOTYPE(void show, (DIRECTORY *dir_ptr, char *name) ); _PROTOTYPE(void free_blocks, (void)); _PROTOTYPE(DIRECTORY *read_cluster, (unsigned int cluster) ); _PROTOTYPE(unsigned short free_cluster, (BOOL leave_fl) ); _PROTOTYPE(void link_fat, (unsigned int cl_1, unsigned int cl_2) ); _PROTOTYPE(unsigned short next_cluster, (unsigned int cl_no) ); _PROTOTYPE(char *slash, (char *str) ); _PROTOTYPE(void add_path, (char *file, BOOL slash_fl) ); _PROTOTYPE(void disk_io, (BOOL op, unsigned long seek, void *address, unsigned bytes) ); _PROTOTYPE(void flush_fat, (void)); _PROTOTYPE(void read_fat, (unsigned int cl_no)); _PROTOTYPE(BOOL free_range, (unsigned short *first, unsigned short *last)); _PROTOTYPE(long lmin, (long a, long b)); void usage(prog_name) register char *prog_name; { fprintf (stderr, "Usage: %s [%s\n", prog_name, (dos_dir ? "-lr] drive [dir]" : "-a] drive file")); exit(1); } unsigned c2u2(ucarray) unsigned char *ucarray; { return ucarray[0] + (ucarray[1] << 8); /* parens vital */ } unsigned long c4u4(ucarray) unsigned char *ucarray; { return ucarray[0] + ((unsigned long) ucarray[1] << 8) + ((unsigned long) ucarray[2] << 16) + ((unsigned long) ucarray[3] << 24); } void determine() { struct dosboot { unsigned char cjump[2]; /* unsigneds avoid bugs */ unsigned char nop; unsigned char name[8]; unsigned char cbytepers[2]; /* don't use shorts, etc */ unsigned char secpclus; /* to avoid struct member */ unsigned char creservsec[2]; /* alignment and byte */ unsigned char fats; /* order bugs */ unsigned char cdirents[2]; unsigned char ctotsec[2]; unsigned char media; unsigned char csecpfat[2]; unsigned char csecptrack[2]; unsigned char cheads[2]; unsigned char chiddensec[2]; unsigned char dos4hidd2[2]; unsigned char dos4totsec[4]; /* Char fill[476]; */ } boot; unsigned short boot_magic; /* last of boot block */ unsigned bytepers, reservsec, dirents; unsigned secpfat, secptrack, heads, hiddensec; unsigned long totsec; unsigned char fat_info, fat_check; unsigned short endiantest = 1; int errcount = 0; big_endian = !(*(unsigned char *)&endiantest); /* Read Bios-Parameterblock */ disk_io(READ, 0L, &boot, sizeof boot); disk_io(READ, 0x1FEL, &boot_magic, sizeof boot_magic); /* Convert some arrays */ bytepers = c2u2(boot.cbytepers); reservsec = c2u2(boot.creservsec); dirents = c2u2(boot.cdirents); totsec = c2u2(boot.ctotsec); if (totsec == 0) totsec = c4u4(boot.dos4totsec); secpfat = c2u2(boot.csecpfat); secptrack = c2u2(boot.csecptrack); heads = c2u2(boot.cheads); /* The `hidden sectors' are the sectors before the partition. * The calculation here is probably wrong (I think the dos4hidd2 * bytes are the msbs), but that doesn't matter, since the * value isn't used anyway */ hiddensec = c2u2(boot.chiddensec); if (hiddensec == 0) hiddensec = c2u2 (boot.dos4hidd2); /* Safety checking */ if (boot_magic != 0xAA55) { fprintf (stderr, "%s: magic != 0xAA55\n", cmnd); ++errcount; } /* Check sectors per track instead of inadequate media byte */ if (secptrack < 15 && /* assume > 15 hard disk & wini OK */ #ifdef SECT10 /* BIOS modified for 10 sec/track */ secptrack != 10 && #endif #ifdef SECT8 /* BIOS modified for 8 sec/track */ secptrack != 8 && #endif secptrack != 9) { fprintf (stderr, "%s: %d sectors per track not supported\n", cmnd, secptrack); ++errcount; } if (bytepers == 0) { fprintf (stderr, "%s: bytes per sector == 0\n", cmnd); ++errcount; } if (boot.secpclus == 0) { fprintf (stderr, "%s: sectors per cluster == 0\n", cmnd); ++errcount; } if (boot.fats != 2 && dos_write) { fprintf (stderr, "%s: fats != 2\n", cmnd); ++errcount; } if (reservsec != 1) { fprintf (stderr, "%s: reserved != 1\n", cmnd); ++errcount; } if (errcount != 0) { fprintf (stderr, "%s: Can't handle disk\n", cmnd); exit(2); } /* Calculate everything. */ if (boot.secpclus == 0) boot.secpclus = 1; total_clusters = (totsec - boot.fats * secpfat - reservsec - dirents * 32L / bytepers ) / boot.secpclus + 2; /* first 2 entries in FAT aren't used */ cluster_size = bytepers * boot.secpclus; fat_size = (unsigned long) secpfat * (unsigned long) bytepers; data_start = (long) bytepers + (long) boot.fats * fat_size + (long) dirents *32L; root_entries = dirents; sub_entries = boot.secpclus * bytepers / 32; if (total_clusters > 4096) faG��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t_16 = 1; /* Further safety checking */ if (cluster_size > MAX_CLUSTER_SIZE) { fprintf (stderr, "%s: cluster size too big\n", cmnd); ++errcount; } disk_io(READ, FAT_START, &fat_info, 1); disk_io(READ, FAT_START + fat_size, &fat_check, 1); if (fat_check != fat_info) { fprintf (stderr, "%s: Disk type in FAT copy differs from disk type in FAT original.\n", cmnd); ++errcount; } if (errcount != 0) { fprintf (stderr, "%s: Can't handle disk\n", cmnd); exit(2); } } int main(argc, argv) int argc; register char *argv[]; { register char *arg_ptr = slash(argv[0]); DIRECTORY *entry; short idx = 1; char dev_nr = '0'; cmnd = arg_ptr; /* needed for error messages */ if (!strcmp(arg_ptr, "dosdir")) dos_dir = TRUE; else if (!strcmp(arg_ptr, "dosread")) dos_read = TRUE; else if (!strcmp(arg_ptr, "doswrite")) dos_write = TRUE; else { fprintf (stderr, "%s: Program should be named dosread, doswrite or dosdir.\n", cmnd); exit(1); } if (argc == 1) usage(argv[0]); if (argv[1][0] == '-') { for (arg_ptr = &argv[1][1]; *arg_ptr; arg_ptr++) { if (*arg_ptr == 'l' && dos_dir) { Lflag = TRUE; } else if (*arg_ptr == 'r' && dos_dir) { Rflag = TRUE; } else if (*arg_ptr == 'a' && !dos_dir) { assert ('\n' == 10); assert ('\r' == 13); Aflag = TRUE; } else { usage(argv[0]); } } idx++; } if (idx == argc) usage(argv[0]); if (strlen(argv[idx]) > 1) { device = argv[idx++]; /* If the device does not contain a / we assume that it * is the name of a device in /dev. Instead of prepending * /dev/ we try to chdir there. */ if (strchr(device, '/') == NULL && chdir("/dev") < 0) { perror("/dev"); exit(1); } } else { if ((dev_nr = toupper (*argv[idx++])) < 'A' || dev_nr > 'Z') usage(argv[0]); device[DRIVE_NR] = dev_nr; } if ((disk = open(device, dos_write ? O_RDWR : O_RDONLY)) < 0) { fprintf (stderr, "%s: cannot open %s: %s\n", cmnd, device, strerror (errno)); exit(1); } determine(); disk_io(READ, ROOTADDR, root, DIR_SIZE * root_entries); if (dos_dir && Lflag) { entry = label(); printf ("Volume in drive %c ", dev_nr); if (entry == NIL_DIR) printf("has no label.\n\n"); else printf ("is %.11s\n\n", entry->d_name); } if (argv[idx] == NIL_PTR) { if (!dos_dir) usage(argv[0]); if (Lflag) printf ("Root directory:\n"); list_dir(root, root_entries, FALSE); if (Lflag) free_blocks(); fflush (stdout); exit(0); } for (arg_ptr = argv[idx]; *arg_ptr; arg_ptr++) if (*arg_ptr == '\\') *arg_ptr = '/'; else *arg_ptr = toupper (*arg_ptr); if (*--arg_ptr == '/') *arg_ptr = '\0'; /* skip trailing '/' */ add_path(argv[idx], FALSE); add_path("/", FALSE); if (dos_dir && Lflag) printf ( "Directory %s:\n", path); entry = find_entry(root, root_entries, argv[idx]); if (dos_dir) { list_dir(entry, sub_entries, FALSE); if (Lflag) free_blocks(); } else if (dos_read) extract(entry); else { if (entry != NIL_DIR) { fflush (stdout); if (is_dir(entry)) fprintf (stderr, "%s: %s is a directory.\n", cmnd, path); else fprintf (stderr, "%s: %s already exists.\n", cmnd, argv[idx]); exit(1); } add_path(NIL_PTR, TRUE); if (*path) make_file(find_entry(root, root_entries, path), sub_entries, slash(argv[idx])); else make_file(root, root_entries, argv[idx]); } (void) close(disk); fflush (stdout); exit(0); return(0); } /* General directory search routine. * * dir: * Points to one or more directory entries * entries: * number of entries * if entries == root_entries, dir points to the entire * root directory. Otherwise it points to a single directory * entry describing the directory to be searched. * * function: * FIND ... find pathname relative to directory dir. * LABEL ... find first label entry in dir. * ENTRY ... create a new empty entry. * FALSE ... list directory * * pathname: * name of the file to be found or directory to be listed. * must be in upper case, pathname components must be * separated by slashes, but can be longer than than * 8+3 characters (The rest is ignored). */ DIRECTORY *directory(dir, entries, function, pathname) DIRECTORY *dir; int entries; int function; register char *pathname; { register DIRECTORY *dir_ptr = dir; DIRECTORY *mem = NIL_DIR; unsigned short cl_no = dir->d_cluster; unsigned short type, last = 0; char file_name[14]; char *name; int i = 0; if (function == FIND) { while (*pathname != '/' && *pathname != '.' && *pathname && i < 8) { file_name[i++] = *pathname++; } if (*pathname == '.') { int j = 0; file_name[i++] = *pathname++; while (*pathname != '/' && *pathname != '.' && *pathname && j++ < 3) { file_name[i++] = *pathname++; } } while (*pathname != '/' && *pathname) pathname++; file_name[i] = '\0'; } do { if (entries != root_entries) { mem = dir_ptr = read_cluster(cl_no); last = cl_no; cl_no = next_cluster(cl_no); } for (i = 0; i < entries; i++, dir_ptr++) { type = dir_ptr->d_name[0] & 0x0FF; if (function == ENTRY) { if (type == NOT_USED || type == ERASED) { if (!mem) mark = ROOTADDR + (long) i *(long) DIR_SIZE; else mark = clus_add(last) + (long) i *(long) DIR_SIZE; return dir_ptr; } continue; } if (type == NOT_USED) break; if (dir_ptr->d_attribute & 0x08) { if (function == LABEL) return dir_ptr; continue; } if (type == DIR || type == ERASED || function == LABEL) continue; type = is_dir(dir_ptr); name = make_name(dir_ptr, (function == FIND) ? FALSE : type); if (function == FIND) { if (strcmp(file_name, name) != 0) continue; if (!type) { if (dos_dir || *pathname) { fflush (stdout); fprintf (stderr, "%s: Not a directory: %s\n", cmnd, file_name); exit(1); } } else if (*pathname == '\0' && dos_read) { fflush (stdout); fprintf (stderr, "%s: %s is a directory.\n", cmnd, path); exit(1); } if (*pathname) { dir_ptr = find_entry(dir_ptr, sub_entries, pathname + 1); } if (mem) { if (dir_ptr) { memcpy((char *)&save_entry, (char *)dir_ptr, DIR_SIZE); dir_ptr = &save_entry; } free( (void *) mem); } return dir_ptr; } else { if (function == FALSE) { show(dir_ptr, name); } else if (type) { /* Recursive */ printf ( "Directory %s%s:\n", path, name); add_path(name, FALSE); list_dir(dir_ptr, sub_entries, FALSE); add_path(NIL_PTR, FALSE); } } } if (mem) free( (void *) mem); } while (cl_no != LAST_CLUSTER && mem); switch (function) { case FIND: if (dos_write && *pathname == '\0') return NIL_DIR; fflush (stdout); fprintf (stderr, "%s: Cannot find `%s'.\n", cmnd, file_name); exit(1); case LABEL: return NIL_DIR; case ENTRY: if (!mem) { fflush (stdout); fprintf (stderr, "%s: No entries left in root directory.\n", cmnd); exit(1); } cl_no = free_cluster(TRUE); link_fat(last, cl_no); link_fat(cl_no, LAST_CLUSTER); disk_io(WRITE, clus_add(cl_no), null, cluster_size); return new_entry(dir, entries); case FALSE: if (Rflag) { printf ("\n"); list_dir(dir, entries, TRUE); } } return NULL; } void extract(entry) register DIRECTORY *entry; { register unsigned short cl_no = entry->d_cluster; char buffer[MAX_CLUSTER_SIZE]; int rest, i; if (entry->d_size == 0) /* Empty file */ return; do { disk_io(READ, clus_add(cl_no), buffer, cluster_size); rest = (entry->d_size > (long) cluster_size) ? cluster_size : (short) entry->d_size; if (Aflag) { for (i = 0; i < rest; i ++) { if (buffer [i] != '\r') putchar (buffer [i]); } if (ferror (stdout)) { fprintf (stderr, "%s: cannot write to stdout: %s\n", cmnd, strerror (errno)); exit (1); } } else { if (fwrite (buffer, 1, rest, stdout) != rest) { fprintf (stderr, "%s: cannot write to stdout: %s\n", cmnd, strerror (errno)); exit (1); } } entry->d_size -= (long) rest; cl_no = next_cluster(cl_no); if (cl_no == BAD16) { fflush (stdout); fprintf (stderr, "%s: reserved cluster value %x encountered.\n", cmnd, cl_no); exit (1); } } while (entry->d_size && cl_no != LAST_CLUSTER); if (cl_no != LAST_CLUSTER) fprintf (stderr, "%s: Too many clusters allocated for file.\n", cmnd); else if (entry->d_size != 0) fprintf (stderr, "%s: Premature EOF: %ld bytes left.\n", cmnd, entry->d_size); } /* Minimum of two long values */ long lmin (a, b) long a, b; { if (a < b) return a; else return b; } void make_file(dir_ptr, entries, name) DIRECTORY *dir_ptr; int entries; char *name; { register DIRECTORY *entry = new_entry(dir_ptr, entries); register char *ptr; char buffer[MAX_CLUSTER_SIZE]; unsigned short cl_no = 0; int i, r; long size = 0L; unsigned short first_cluster, last_cluster; long chunk; memset (&entry->d_name[0], ' ', 11); /* clear entry */ for (i = 0, ptr = name; i < 8 && *ptr != '.' && *ptr; i++) entry->d_name[i] = *ptr++; while (*ptr != '.' && *ptr) ptr++; if (*ptr == '.') ptr++; for (i = 0; i < 3 && *ptr != '.' && *ptr; i++) entry->d_ext[i] = *ptr++; for (i = 0; i < 10; i++) entry->d_reserved[i] = '\0'; entry->d_attribute = '\0'; entry->d_cluster = 0; while (free_range (&first_cluster, &last_cluster)) { do { unsigned short nr_clus; chunk = lmin ((long) (last_cluster - first_cluster + 1) * cluster_size, (long) MAX_CLUSTER_SIZE); r = fill(buffer, chunk); if (r == 0) goto done; nr_clus = (r + cluster_size - 1) / cluster_size; disk_io(WRITE, clus_add(first_cluster), buffer, r); for (i = 0; i < nr_clus; i ++) { if (entry->d_cluster == 0) cl_no = entry->d_cluster = first_cluster; else { link_fat(cl_no, first_cluster); cl_no = first_cluster; } first_cluster ++; } size += r; } while (first_cluster <= last_cluster); } fprintf (stderr, "%s: disk full. File truncated\n", cmnd); done: if (entry->d_cluster != 0) link_fat(cl_no, LAST_CLUSTER); entry->d_size = size; fill_date(entry); disk_io(WRITE, mark, entry, DIR_SIZE); if (fat_dirty) flush_fat (); } #define SEC_MIN 60L #define SEC_HOUR (60L * SEC_MIN) #define SEC_DAY (24L * SEC_HOUR) #define SEC_YEAR (365L * SEC_DAY) #define SEC_LYEAR (366L * SEC_DAY) unsigned short mon_len[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; void fill_date(entry) DIRECTORY *entry; { register long cur_time = time((long *) 0) - DOS_TIME; unsigned short year = 0, month = 1, day, hour, minutes, seconds; int i; long tmp; if (cur_time < 0) /* Date not set on booting ... */ cur_time = 0; for (;;) { tmp = (year % 4 == 0) ? SEC_LYEAR : SEC_YEAR; if (cur_time < tmp) break; cur_time -= tmp; year++; } day = (unsigned short) (cur_time / SEC_DAY); cur_time -= (long) day *SEC_DAY; hour = (unsigned short) (cur_time / SEC_HOUR); cur_time -= (long) hour *SEC_HOUR; minutes = (unsigned short) (cur_time / SEC_MIN); cur_time -= (long) minutes *SEC_MIN; seconds = (unsigned short) cur_time; mon_len[1] = (year % 4 == 0) ? 29 : 28; i = 0; while (day >= mon_len[i]) { month++; day -= mon_len[i++]; } day++; entry->d_date = (year << 9) | (month << 5) | day; entry->d_time = (hour << 11) | (minutes << 5) | seconds; } char *make_name(dir_ptr, dir_fl) register DIRECTORY *dir_ptr; short dir_fl; { static char name_buf[14]; register char *ptr = name_buf; short i; for (i = 0; i < 8; i++) *ptr++ = dir_ptr->d_name[i]; while (*--ptr == ' '); assert (ptr >= name_buf); ptr++; if (dir_ptr->d_ext[0] != ' ') { *ptr++ = '.'; for (i = 0; i < 3; i++) *ptr++ = dir_ptr->d_ext[i]; while (*--ptr == ' '); ptr++; } if (dir_fl) *ptr++ = '/'; *ptr = '\0'; return name_buf; } int fill(buffer, size) register char *buffer; size_t size; { static BOOL nl_mark = FALSE; char *last = &buffer[size]; char *begin = buffer; register int c; while (buffer < last) { if (nl_mark) { *buffer ++ = '\n'; nl_mark = FALSE; } else { c = getchar(); if (c == EOF) break; if (Aflag && c == '\n') { *buffer ++ = '\r'; nl_mark = TRUE; } else { *buffer++ = c; } } } return (buffer - begin); } #define HOUR 0xF800 /* Upper 5 bits */ #define MIN 0x07E0 /* Middle 6 bits */ #define YEAR 0xFE00 /* Upper 7 bits */ #define MONTH 0x01E0 /* Mid 4 bits */ #define DAY 0x01F /* Lowest 5 bits */ char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; void xmodes(mode) int mode; { printf ( "\t%c%c%c%c%c", (mode & SUB_DIR) ? 'd' : '-', (mode & 02) ? 'h' : '-', (mode & 04) ? 's' : '-', (mode & 01) ? '-' : 'w', (mode & 0x20) ? 'a' : '-'); } void show(dir_ptr, name) DIRECTORY *dir_ptr; char *name; { register unsigned short e_date = dir_ptr->d_date; register unsigned short e_time = dir_ptr->d_time; unsigned short next; char bname[20]; short i = 0; while (*name && *name != '/') bname[i++] = *name++; bname[i] = '\0'; if (!Lflag) { printf ( "%s\n", bname); return; } xmodes( (int) dir_ptr->d_attribute); printf ( "\t%s%s", bname, strlen(bname) < 8 ? "\t\t" : "\t"); i = 1; if (is_dir(dir_ptr)) { next = dir_ptr->d_cluster; while ((next = next_cluster(next)) != LAST_CLUSTER) i++; printf ("%8ld", (long) i * (long) cluster_size); } else printf ("%8ld", dir_ptr->d_size); printf (" %02d:%02d %2d %s %d\n", ((e_time & HOUR) >> 11), ((e_time & MIN) >> 5), (e_date & DAY), month[((e_date & MONTH) >> 5) - 1], ((e_date & YEAR) >> 9) + 1980); } void free_blocks() { register unsigned short cl_no; long nr_free = 0; long nr_bad = 0; for (cl_no = 2; cl_no < total_clusters; cl_no++) { switch (next_cluster(cl_no)) { case FREE: nr_free++; break; case BAD16: nr_bad++; break; } } printf ("Free space: %ld bytes.\n", nr_free * (long) cluster_size); if (nr_bad != 0) printf ("Bad sectors: %ld bytes.\n", nr_bad * (long) cluster_size); } DIRECTORY *read_cluster(cluster) register unsigned int cluster; { register DIRECTORY *sub_dir; if ((sub_dir = malloc(cluster_size)) == NULL) { fprintf (stderr, "%s: Cannot set break!\n", cmnd); exit(1); } disk_io(READ, clus_add(cluster), sub_dir, cluster_size); return sub_dir; } static unsigned short cl_index = 2; /* find a range of consecutive free clusters. Return TRUE if found * and return the first and last cluster in the |*first| and |*last|. * If no free clusters are left, return FALSE. * * Warning: Assumes that all of the range is used before the next call * to free_range or free_cluster. */ BOOL free_range (first, last) unsigned short *first, *last; { while (cl_index < total_clusters && next_cluster(cl_index) != FREE) cl_index++; if (cl_index >= total_clusters) return FALSE; *first = cl_index; while (cl_index < total_clusters && next_cluster(cl_index) == FREE) cl_index++; *last = cl_index - 1; return TRUE; } /* find a free cluster. * Return the number of the free cluster or a number > |total_clusters| * if none is found. * If |leave_fl| is TRUE, the the program will be terminated if * no free cluster can be found * * Warning: Assumes that the cluster is used before the next call * to free_range or free_cluster. */ unsigned short free_cluster(leave_fl) BOOL leave_fl; { while (cl_index < total_clusters && next_cluster(cl_index) != FREE) cl_index++; if (leave_fl && cl_index >= total_clusters) { fprintf (stderr, "%s: Diskette full. File not added.\n", cmnd); exit(1); } return cl_index++; } /* read a portion of the fat containing |cl_no| into the cache */ void read_fat (cl_no) unsigned int cl_no; { if (!cooked_fat) { /* Read the fat for the first time. We have to allocate all the * buffers */ if (fat_16) { /* FAT consists of little endian shorts. Easy to convert */ if ((cooked_fat = malloc (fat_size)) == NULL) { /* Oops, FAT doesn't fit into memory, just read * a chunk */ if ((cooked_fat = malloc (COOKED_SIZE)) == NULL) { fprintf (stderr, "%s: not enough memory for FAT cache. Use chmem\n", cmnd); exit (1); } cache_size = COOKED_SIZE / 2; } else { cache_size = fat_size / 2; } } else { /* 12 bit FAT. Difficult encoding, but small. Keep * both raw FAT and cooked version in memory. */ if ((cooked_fat = malloc (total_clusters * sizeof (short))) == NULL || (raw_fat = malloc (fat_size)) == NULL) { fprintf (stderr, "%s: not enough memory for FAT cache. Use chmem\n", cmnd); exit (1); } cache_size = total_clusters; } } fat_low = cl_no / cache_size * cache_size; fat_high = fat_low + cache_size - 1; if (!fat_16) { unsigned short *cp; unsigned char *rp; unsigned short i; disk_io (READ, FAT_START, raw_fat, fat_size); for (rp = raw_fat, cp = cooked_fat, i = 0; i < cache_size; rp += 3, i += 2) { *cp = *rp + ((*(rp + 1) & 0x0f) << 8); if (*cp == BAD) *cp = BAD16; else if (*cp == LAST_CLUSTER12) *cp = LAST_CLUSTER; cp ++; *cp = ((*(rp + 1) & 0xf0) >> 4) + (*(rp + 2) << 4); if (*cp == BAD) *cp = BAD16; else if (*cp == LAST_CLUSTER12) *cp = LAST_CLUSTER; cp ++; } } else { assert (sizeof (short) == 2); assert (CHAR_BIT == 8); /* just in case */ disk_io (READ, FAT_START + fat_low * 2, (void *)cooked_fat, cache_size * 2); if (big_endian) { unsigned short *cp; unsigned char *rp; unsigned short i; for (i = 0, rp = (unsigned char *)cooked_fat /* sic */, cp = cooked_fat; i < cache_size; rp += 2, cp ++, i ++) { *cp = c2u2 (rp); } } } } /* flush the fat cache out to disk */ void flush_fat () { if (fat_16) { if (big_endian) { unsigned short *cp; unsigned char *rp; unsigned short i; for (i = 0, rp = (unsigned char *)cooked_fat /* sic */, cp = cooked_fat; i < cache_size; rp += 2, cp ++, i ++) { *rp = *cp; *(rp + 1) = *cp >> 8; } } disk_io (WRITE, FAT_START + fat_low * 2, (void *)cooked_fat, cache_size * 2); disk_io (WRITE, FAT_START + fat_size + fat_low * 2, (void *)cooked_fat, cache_size * 2); } else { unsigned short *cp; unsigned char *rp; unsigned short i; for (rp = raw_fat, cp = cooked_fat, i = 0; i < cache_size; rp += 3, cp += 2, i += 2) { *rp = *cp; *(rp + 1) = ((*cp & 0xf00) >> 8) | ((*(cp + 1) & 0x00f) << 4); *(rp + 2) = ((*(cp + 1) & 0xff0) >> 4); } disk_io (WRITE, FAT_START, raw_fat, fat_size); disk_io (WRITE, FAT_START + fat_size, raw_fat, fat_size); } } /* make cl_2 the successor of cl_1 */ void link_fat(cl_1, cl_2) unsigned int cl_1; unsigned int cl_2; { if (cl_1 < fat_low || cl_1 > fat_high) { if (fat_dirty) flush_fat (); read_fat (cl_1); } cooked_fat [cl_1 - fat_low] = cl_2; fat_dirty = TRUE; } unsigned short next_cluster(cl_no) register unsigned int cl_no; { if (cl_no < fat_low || cl_no > fat_high) { if (fat_dirty) flush_fat (); read_fat (cl_no); } return cooked_fat [cl_no - fat_low]; } char *slash(str) register char *str; { register char *result = str; while (*str) if (*str++ == '/') result = str; return result; } void add_path(file, slash_fl) char *file; BOOL slash_fl; { register char *ptr = path; while (*ptr) ptr++; if (file == NIL_PTR) { if (ptr != path) ptr--; if (ptr != path) do { ptr--; } while (*ptr != '/' && ptr != path); if (ptr != path && !slash_fl) *ptr++ = '/'; *ptr = '\0'; } else strcpy (ptr, file); } void disk_io(op, seek, address, bytes) register BOOL op; unsigned long seek; void *address; register unsigned bytes; { unsigned int r; if (lseek(disk, seek, SEEK_SET) < 0L) { fflush (stdout); fprintf (stderr, "%s: Bad lseek: %s\n", cmnd, strerror (errno)); exit(1); } if (op == READ) r = read(disk, (char *) address, bytes); else { r = write(disk, (char *) address, bytes); } if (r != bytes) { fprintf (stderr, "%s: read error: %s\n", cmnd, strerror (errno)); exit (1); } } char dosread_c_rcs_id [] = "$Id: dosread.c,v 1.8 1994/05/14 21:53:08 hjp Rel $"; /* $Log: dosread.c,v $ * Revision 1.8 1994/05/14 21:53:08 hjp * filenames with more than 3 characters and extension work again. * removed debugging stuff and b_copy. * * Revision 1.7 1994/04/09 03:09:01 hjp * (posted to comp.os.minix) * merged branch 1.5.387 with stem. * changed treatment of drive parameter * * Revision 1.5.387.9 1994/04/09 02:07:51 hjp * Disk full no longer produces lost clusters but a truncated file. * Truncated file names to 8+3 before comparisons to avoid duplicate * files and filenames containing dots in the extension. * Replaced sbrk and brk by malloc and free (mixing brk and malloc causes * heap corruption which sometimes lead to core dumps. It may also have * been the cause of data corruption Kees reported). * Made global variables static and removed some unused ones. * Error messages now contain program name. * * Revision 1.5.387.8 1993/11/13 00:38:45 hjp * Posted to comp.os.minix and included in Minix-386vm 1.6.25.1. * Speed optimizations for 1.44 MB disks. * Replaced lowlevel I/O by stdio. * Simplified -a: Now only removes resp. adds CRs * Cleaned up. * * Revision 1.5.387.1 1993/01/15 19:32:29 ast * Released with 1.6.24b */ �������������������������������������������������������������������������������������������������������������������������������������������������������/* fdisk - partition a hard disk Author: Jakob Schripsema */ /* Run this with: * * fdisk [-hheads] [-ssectors] [device] * * e.g., * * fdisk (to get the default) * fdisk -h4 -s17 /dev/hd0 (MINIX default) * fdisk -h4 -s17 c: (DOS default) * fdisk -h6 -s25 /dev/hd5 (second drive, probably RLL) * fdisk junkfile (to experiment safely) * * The device is opened in read-only mode if the file permissions do not * permit read-write mode, so it is convenient to use a login account with * only read permission to look at the partition table safely. * * Compile with: * * cc -i -o fdisk fdisk.c (MINIX) * cl -DDOS fdisk.c (DOS with MS C compiler) * * This was modified extensively by Bruce Evans 28 Dec 89. * The new version has not been tried with DOS. The open modes are suspect * (everyone should convert to use fcntl.h). * * Changed 18 Dec 92 by Kees J. Bot: Bootstrap code and geometry from device. * * modified 01 March 95 by asw: updated list of known partition types. Also * changed display format slightly to allow for partition type names of * up to 9 chars (previous format allowed for 7, but there were already * some 8 char names in the list). */ #include <sys/types.h> #include <ibm/partition.h> #include <minix/partition.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <errno.h> #ifdef DOS #include <dos.h> #define DEFAULT_DEV "c:" #define LOAD_OPEN_MODE 0x8000 #define SAVE_CREAT_MODE 0644 #else #define DEFAULT_DEV "/dev/hd0" #define LOAD_OPEN_MODE 0 #define SAVE_CREAT_MODE 0644 #define UNIX /* for MINIX */ #endif /* Constants */ #define DEFAULT_NHEAD 4 /* # heads */ #define DEFAULT_NSEC 17 /* sectors / track */ #define SECSIZE 512 /* sector size */ #define OK 0 #define ERR 1 #define CYL_MASK 0xc0 /* mask to extract cyl bits from sec field */ #define CYL_SHIFT 2 /* shift to extract cyl bits from sec field */ #define SEC_MASK 0x3f /* mask to extract sec bits from sec field */ /* Globals */ char rawsecbuf[SECSIZE + sizeof(long)]; char *secbuf; int badbases; int badsizes; int badorders; char *devname; int nhead; int nsec; int ncyl = 1024; int readonly; int override= 0; _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void getgeom, (void)); _PROTOTYPE(int getboot, (char *buffer)); _PROTOTYPE(int putboot, (char *buffer)); _PROTOTYPE(int load_from_file, (void)); _PROTOTYPE(int save_to_file, (void)); _PROTOTYPE(int dpl_partitions, (int rawflag)); _PROTOTYPE(int chk_table, (void)); _PROTOTYPE(int sec_to_hst, (long logsec, unsigned char *hd, unsigned char *sec, unsigned char *cyl)); _PROTOTYPE(int mark_partition, (struct part_entry *pe)); _PROTOTYPE(int change_partition, (struct part_entry *entry)); _PROTOTYPE(int get_a_char, (void)); _PROTOTYPE(int print_menu, (void)); _PROTOTYPE(void adj_base, (struct part_entry *pe)); _PROTOTYPE(void adj_size, (struct part_entry *pe)); _PROTOTYPE(struct part_entry *ask_partition, (void)); _PROTOTYPE(void footnotes, (void)); _PROTOTYPE(int get_an_int, (char *prompt, int *intptr)); _PROTOTYPE(void list_part_types, (void)); _PROTOTYPE(void mark_npartition, (struct part_entry *pe)); _PROTOTYPE(int mygets, (char *buf, int length)); _PROTOTYPE(char *systype, (int type)); _PROTOTYPE(void toggle_active, (struct part_entry *pe)); _PROTOTYPE(void usage, (void)); /* One featureful master bootstrap. */ char bootstrap[] = { 0353,0001,0000,0061,0300,0216,0330,0216,0300,0372,0216,0320,0274,0000,0174,0373, 0275,0276,0007,0211,0346,0126,0277,0000,0006,0271,0000,0001,0374,0363,0245,0352, 0044,0006,0000,0000,0264,0002,0315,0026,0250,0010,0164,0033,0350,0071,0001,0174, 0007,0060,0344,0315,0026,0242,0205,0007,0054,0060,0074,0012,0163,0363,0120,0350, 0046,0001,0205,0007,0130,0353,0012,0240,0002,0006,0204,0300,0165,0003,0351,0147, 0000,0230,0262,0005,0366,0362,0262,0200,0000,0302,0210,0340,0120,0350,0234,0000, 0163,0003,0351,0147,0000,0130,0054,0001,0175,0003,0351,0141,0000,0276,0276,0175, 0211,0357,0271,0040,0000,0363,0245,0200,0301,0004,0211,0356,0215,0174,0020,0070, 0154,0004,0164,0016,0213,0135,0010,0053,0134,0010,0213,0135,0012,0033,0134,0012, 0163,0014,0212,0044,0206,0144,0020,0210,0044,0106,0071,0376,0162,0364,0211,0376, 0201,0376,0356,0007,0162,0326,0342,0322,0211,0356,0264,0020,0366,0344,0001,0306, 0200,0174,0004,0001,0162,0026,0353,0021,0204,0322,0175,0041,0211,0356,0200,0174, 0004,0000,0164,0013,0366,0004,0200,0164,0006,0350,0070,0000,0162,0053,0303,0203, 0306,0020,0201,0376,0376,0007,0162,0346,0350,0215,0000,0211,0007,0376,0302,0204, 0322,0174,0023,0315,0021,0321,0340,0321,0340,0200,0344,0003,0070,0342,0167,0355, 0350,0011,0000,0162,0350,0303,0350,0003,0000,0162,0146,0303,0211,0356,0214,0134, 0010,0214,0134,0012,0277,0003,0000,0122,0006,0127,0264,0010,0315,0023,0137,0007, 0200,0341,0077,0376,0306,0210,0310,0366,0346,0211,0303,0213,0104,0010,0213,0124, 0012,0367,0363,0222,0210,0325,0366,0361,0060,0322,0321,0352,0321,0352,0010,0342, 0210,0321,0376,0301,0132,0210,0306,0273,0000,0174,0270,0001,0002,0315,0023,0163, 0020,0200,0374,0200,0164,0011,0117,0174,0006,0060,0344,0315,0023,0163,0270,0371, 0303,0201,0076,0376,0175,0125,0252,0165,0001,0303,0350,0013,0000,0243,0007,0353, 0005,0350,0004,0000,0227,0007,0353,0376,0136,0255,0126,0211,0306,0254,0204,0300, 0164,0011,0264,0016,0273,0001,0000,0315,0020,0353,0362,0303,0057,0144,0145,0166, 0057,0150,0144,0077,0010,0000,0015,0012,0000,0116,0157,0156,0145,0040,0141,0143, 0164,0151,0166,0145,0015,0012,0000,0122,0145,0141,0144,0040,0145,0162,0162,0157, 0162,0040,0000,0116,0157,0164,0040,0142,0157,0157,0164,0141,0142,0154,0145,0040, 0000,0000, }; main(argc, argv) int argc; char *argv[]; { int argn; char *argp; int ch; /* Init */ nhead = DEFAULT_NHEAD; nsec = DEFAULT_NSEC; for (argn = 1; argn < argc && (argp = argv[argn])[0] == '-'; ++argn) { if (argp[1] == 'h') nhead = atoi(argp + 2); else if (argp[1] == 's') nsec = atoi(argp + 2); else usage(); override= 1; } if (argn == argc) devname = DEFAULT_DEV; else if (argn == argc - 1) devname = argv[argn]; else usage(); /* Align the sector buffer in such a way that the partition table is at * a mod 4 offset in memory. Some weird people add alignment checks to * their Minix! */ secbuf = rawsecbuf; while ((long)(secbuf + PART_TABLE_OFF) % sizeof(long) != 0) secbuf++; getgeom(); getboot(secbuf); chk_table(); do { putchar('\n'); dpl_partitions(0); printf( "\n(Enter 'h' for help. A null line will abort any operation) "); ch = get_a_char(); putchar('\n'); switch (ch) { case '+': footnotes(); break; case 'a': toggle_active(ask_partition()); break; case 'B': adj_base(ask_partition()); break; case 'c': change_partition(ask_partition()); break; case 'h': print_menu(); break; case 'l': load_from_file(); break; case 'm': mark_partition(ask_partition()); break; case 'n': mark_npartition(ask_partition()); break; case 'p': dpl_partitions(1); break; case 0: case 'q': exit(0); case 'S': adj_size(ask_partition()); break; case 's': save_to_file(); break; case 't': list_part_types(); break; case 'v': printf("Partition table is %svalid\n", chk_table() == OK ? "" : "in"); break; case 'w': if (readonly) printf("Write disabled\n"); else if(chk_table() == OK) { putboot(secbuf); printf( "Partition table has been updated and the file system synced.\n"); printf("Please reboot now.\n"); exit(0); } else printf("Not written\n"); break; default: printf(" %c ????\n", ch); break; } } while (1); } #ifdef UNIX void getgeom() { struct partition geom; int fd, r; if (override) return; if ((fd= open(devname, O_RDONLY)) < 0) return; r = ioctl(fd, DIOCGETP, &geom); close(fd); if (r < 0) return; nhead = geom.heads; nsec = geom.sectors; ncyl = geom.cylinders; printf("Geometry of %s: %dx%dx%d\n", devname, ncyl, nhead, nsec); } static int devfd; getboot(buffer) char *buffer; { devfd = open(devname, 2); if (devfd < 0) { printf("No write permission on %s\n", devname); rG��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������eadonly = 1; devfd = open(devname, 0); } if (devfd < 0) { printf("Cannot open device %s\n", devname); exit(1); } if (read(devfd, buffer, SECSIZE) != SECSIZE) { printf("Cannot read boot sector\n"); exit(1); } if (* (unsigned short *) &buffer[510] != 0xAA55) { printf("Invalid boot sector on %s.\n", devname); printf("Partition table reset and boot code installed.\n"); memset(buffer, 0, 512); memcpy(buffer, bootstrap, sizeof(bootstrap)); * (unsigned short *) &buffer[510] = 0xAA55; } } putboot(buffer) char *buffer; { if (lseek(devfd, 0L, 0) < 0) { printf("Seek error during write\n"); exit(1); } if (write(devfd, buffer, SECSIZE) != SECSIZE) { printf("Write error\n"); exit(1); } sync(); } #endif load_from_file() { /* Load buffer from file */ char file[80]; int fd; printf("Enter name of file to load from: "); if (!mygets(file, (int) sizeof file)) return; fd = open(file, LOAD_OPEN_MODE); if (fd < 0) { printf("Cannot open %s\n", file); return; } if (read(fd, secbuf, SECSIZE) != SECSIZE || close(fd) != 0) { printf("Read error\n"); exit(1); } printf("Loaded from %s OK\n", file); chk_table(); } save_to_file() { /* Save to file */ char file[80]; int fd; printf("Enter name of file to save to: "); if (!mygets(file, (int) sizeof file)) return; if(chk_table() != OK) printf("Saving anyway\n"); fd = creat(file, SAVE_CREAT_MODE); #ifdef DOS if (fd < 0) { printf("Cannot creat %s\n", file); return; } close(fd); fd = open(file, 0x8001); #endif if (fd < 0) printf("Cannot open %s\n", file); else if (write(fd, secbuf, SECSIZE) != SECSIZE || close(fd) != 0) printf("Write error\n"); else printf("Saved to %s OK\n", file); } dpl_partitions(rawflag) int rawflag; { /* Display partition table */ char active[5]; char basefootnote; int cyl_mask; int devnum; char *format; int i; int i1; char orderfootnote; struct part_entry *pe; struct part_entry *pe1; int sec_mask; char sizefootnote; char type[10]; badbases = 0; badsizes = 0; badorders = 0; if (rawflag) { cyl_mask = 0; /* no contribution of cyl to sec */ sec_mask = 0xff; format = "%2d %3d%c %4s %-9s x%02x %3d x%02x x%02x %3d x%02x %7ld%c%7ld %7ld%c\n"; } else { cyl_mask = CYL_MASK; sec_mask = SEC_MASK; format = "%2d %3d%c %4s %-9s %4d %3d %3d %4d %3d %3d %7ld%c%7ld %7ld%c\n"; } printf( " ----first---- -----last---- --------sectors-------\n" ); printf( "Num Sorted Act Type Cyl Head Sec Cyl Head Sec Base Last Size\n" ); pe = (struct part_entry *) &secbuf[PART_TABLE_OFF]; for (i = 1; i <= NR_PARTITIONS; i++, pe++) { if (rawflag) { sprintf(active, "0x%02x", pe->bootind); sprintf(type, "0x%02x", pe->sysind); } else { sprintf(active, "%s", pe->bootind == ACTIVE_FLAG ? "A " : ""); sprintf(type, "%s", systype(pe->sysind)); } /* Prepare warnings about confusing setups from old versions. */ basefootnote = orderfootnote = sizefootnote = ' '; if (pe->sysind == MINIX_PART && pe->lowsec & 1) { basefootnote = '+'; ++badbases; } if (pe->size & 1) { sizefootnote = '-'; ++badsizes; } /* Calculate the "device numbers" resulting from the misguided sorting * in the wini drivers. The drivers use this conditional for * swapping wn[j] > wn[j+1]: * * if ((wn[j].wn_low == 0 && wn[j+1].wn_low != 0) || * (wn[j].wn_low > wn[j+1].wn_low && wn[j+1].wn_low != 0)) { * * which simplifies to: * * if (wn[j+1].wn_low != 0 && * (wn[j].wn_low == 0 || wn[j].wn_low > wn[j+1].wn_low)) { */ devnum = 1; for (i1 = 1, pe1 = (struct part_entry *) &secbuf[PART_TABLE_OFF]; i1 <= NR_PARTITIONS; ++i1, ++pe1) if (pe1->lowsec == 0 && pe->lowsec == 0 && pe1 < pe || pe1->lowsec != 0 && (pe->lowsec == 0 || pe->lowsec > pe1->lowsec)) ++devnum; /* pe1 contents < pe contents */ if (devnum != i) { orderfootnote = '#'; ++badorders; } printf(format, i, devnum, orderfootnote, active, type, pe->start_cyl + ((pe->start_sec & cyl_mask) << CYL_SHIFT), pe->start_head, pe->start_sec & sec_mask, pe->last_cyl + ((pe->last_sec & cyl_mask) << CYL_SHIFT), pe->last_head, pe->last_sec & sec_mask, pe->lowsec, basefootnote, pe->lowsec + (pe->size == 0 ? 0 : pe->size - 1), pe->size, sizefootnote); } } int chk_table() { /* Check partition table */ int active; unsigned char cylinder; unsigned char head; int i; int i1; int maxhead; int maxsec; struct part_entry *pe; struct part_entry *pe1; unsigned char sector; int seenpart; int status; active = 0; maxhead = 0; maxsec = 0; pe = (struct part_entry *) &secbuf[PART_TABLE_OFF]; seenpart = 0; status = OK; for (i = 1; i <= NR_PARTITIONS; i++, ++pe) { if (pe->bootind == ACTIVE_FLAG) active++; sec_to_hst(pe->lowsec, &head, §or, &cylinder); if (pe->size == 0 && pe->lowsec == 0) sector = 0; if (head != pe->start_head || sector != pe->start_sec || cylinder != pe->start_cyl) { printf("Inconsistent base in partition %d.\n", i); printf("Suspect head and sector parameters.\n"); status = ERR; } if (pe->size != 0 || pe->lowsec != 0) sec_to_hst(pe->lowsec + pe->size - 1, &head, §or, &cylinder); if (head != pe->last_head || sector != pe->last_sec || cylinder != pe->last_cyl) { printf("Inconsistent size in partition %d.\n", i); printf("Suspect head and sector parameters.\n"); status = ERR; } if (pe->size == 0) continue; seenpart = 1; for (i1 = i + 1, pe1 = pe + 1; i1 <= NR_PARTITIONS; ++i1, ++pe1) { if (pe->lowsec >= pe1->lowsec && pe->lowsec < pe1->lowsec + pe1->size || pe->lowsec + pe->size - 1 >= pe1->lowsec && pe->lowsec + pe->size - 1 < pe1->lowsec + pe1->size) { printf("Overlap between partitions %d and %d\n", i, i1); status = ERR; } } if (pe->lowsec + pe->size < pe->lowsec) { printf("Overflow from preposterous size in partition %d.\n", i); status = ERR; } if (maxhead < pe->start_head) maxhead = pe->start_head; if (maxhead < pe->last_head) maxhead = pe->last_head; if (maxsec < (pe->start_sec & SEC_MASK)) maxsec = (pe->start_sec & SEC_MASK); if (maxsec < (pe->last_sec & SEC_MASK)) maxsec = (pe->last_sec & SEC_MASK); } if (seenpart) { if (maxhead + 1 != nhead || maxsec != nsec) { printf( "Disk appears to have mis-specified number of heads or sectors.\n"); printf("Try fdisk -h%d -s%d %s instead of\n", maxhead + 1, maxsec, devname); printf(" fdisk -h%d -s%d %s\n", nhead, nsec, devname); seenpart = 0; } } else { printf( "Empty table - skipping test on number of heads and sectors.\n"); printf("Assuming %d heads and %d sectors.\n", nhead, nsec); } if (!seenpart) printf("Do not write the table if you are not sure!.\n"); if (active > 1) { printf("%d active partitions\n", active); status = ERR; } return(status); } sec_to_hst(logsec, hd, sec, cyl) long logsec; unsigned char *hd, *sec, *cyl; { /* Convert a logical sector number to head / sector / cylinder */ int bigcyl; bigcyl = logsec / (nhead * nsec); *sec = (logsec % nsec) + 1 + ((bigcyl >> CYL_SHIFT) & CYL_MASK); *cyl = bigcyl; *hd = (logsec % (nhead * nsec)) / nsec; } mark_partition(pe) struct part_entry *pe; { /* Mark a partition as being of type MINIX. */ if (pe != NULL) { pe->sysind = MINIX_PART; printf("Partition type is now MINIX\n"); } } change_partition(entry) struct part_entry *entry; { /* Get partition info : first & last cylinder */ int first, last; long low, high; int ch; if (entry == NULL) return; while (1) { if (!get_an_int("\tEnter first cylinder (an integer >= 0): ", &first)) return; if (first >= 0) break; printf("\t\tThat looks like %d which is negative\n", first); } while (1) { if (!get_an_int( "\tEnter last cylinder (an integer >= the first cylinder): ", &last)) return; if (last >= first) break; printf("\t\tThat looks like %d which is too small\n", last); } if (first == 0 && last == 0) { entry->bootind = 0; entry->start_head = 0; entry->start_sec = 0; entry->start_cyl = 0; entry->sysind = NO_PART; entry->last_head = 0; entry->last_sec = 0; entry->last_cyl = 0; entry->lowsec = 0; entry->size = 0; printf("Partition deleted\n"); return; } low = first & 0xffff; low = low * nsec * nhead; if (low == 0) low = 1; /* sec0 is master boot record */ high = last & 0xffff; high = (high + 1) * nsec * nhead - 1; entry->lowsec = low; entry->size = high - low + 1; if (entry->size & 1) { /* Adjust size to even since Minix works with blocks of 2 sectors. */ --high; --entry->size; printf("Size reduced by 1 to make it even\n"); } sec_to_hst(low, &entry->start_head, &entry->start_sec, &entry->start_cyl); sec_to_hst(high, &entry->last_head, &entry->last_sec, &entry->last_cyl); printf("Base of partition changed to %ld, size changed to %ld\n", entry->lowsec, entry->size); /* Accept the MINIX partition type. Usually ignore foreign types, so this * fdisk can be used on foreign partitions. Don't allow NO_PART, because * many DOS fdisks crash on it. */ if (entry->sysind == NO_PART) { entry->sysind = MINIX_PART; printf("Partition type changed from None to MINIX\n"); } else if (entry->sysind == MINIX_PART) printf("Leaving partition type as MINIX\n"); else while (1) { printf("\tChange partition type from %s to MINIX? (y/n) ", systype(entry->sysind)); ch = get_a_char(); if (ch == 0 || ch == 'n') { printf("Leaving partition type as %s\n", systype(entry->sysind)); break; } else if (ch == 'y') { entry->sysind = MINIX_PART; printf("Partition type changed from %s to MINIX\n", systype(entry->sysind)); break; } } if (entry->bootind == ACTIVE_FLAG) printf("Leaving partition active\n"); else while (1) { printf("\tChange partition to active? (y/n) "); ch = get_a_char(); if (ch == 0 || ch == 'n') { printf("Leaving partition inactive\n"); break; } else if (ch == 'y') { toggle_active(entry); break; } } } get_a_char() { /* Read 1 character and discard rest of line */ char buf[80]; int ch; if (!mygets(buf, (int) sizeof buf)) return(0); return(*buf); } print_menu() { printf("Type a command letter, then a carriage return:\n"); printf(" + - explain any footnotes (+, -, #)\n"); printf(" a - toggle an active flag\n"); printf(" B - adjust a base sector\n"); printf(" c - change a partition\n"); printf(" l - load boot block (including partition table) from a file\n"); printf(" m - mark a partition as a MINIX partition\n"); printf(" n - mark a partition as a non-MINIX partition\n"); printf(" p - print raw partition table\n"); printf(" q - quit without making any changes\n"); printf(" S - adjust a size (by changing the last sector)\n"); printf(" s - save boot block (including partition table) on a file\n"); printf(" t - print known partition types\n"); printf(" v - verify partition table\n"); if (readonly) printf(" w - write (disabled)\n"); else printf(" w - write changed partition table back to disk and exit\n"); } /* Here are the DOS routines for reading and writing the boot sector. */ #ifdef DOS union REGS regs; struct SREGS sregs; int drivenum; getboot(buffer) char *buffer; { /* Read boot sector */ segread(&sregs); /* get ds */ if (devname[1] != ':') { printf("Invalid drive %s\n", devname); exit(1); } if (*devname >= 'a') *devname += 'A' - 'a'; drivenum = (*devname - 'C') & 0xff; if (drivenum < 0 || drivenum > 7) { printf("Funny drive number %d\n", drivenum); exit(1); } regs.x.ax = 0x201; /* read 1 sectors */ regs.h.ch = 0; /* cylinder */ regs.h.cl = 1; /* first sector = 1 */ regs.h.dh = 0; /* head = 0 */ regs.h.dl = 0x80 + drivenum; /* drive = 0 */ sregs.es = sregs.ds; /* buffer address */ regs.x.bx = (int) buffer; int86x(0x13, ®s, ®s, &sregs); if (regs.x.cflag) { printf("Cannot read boot sector\n"); exit(1); } } putboot(buffer) char *buffer; { /* Write boot sector */ regs.x.ax = 0x301; /* read 1 sectors */ regs.h.ch = 0; /* cylinder */ regs.h.cl = 1; /* first sector = 1 */ regs.h.dh = 0; /* head = 0 */ regs.h.dl = 0x80 + drivenum; /* drive = 0 */ sregs.es = sregs.ds; /* buffer address */ regs.x.bx = (int) buffer; int86x(0x13, ®s, ®s, &sregs); if (regs.x.cflag) { printf("Cannot write boot sector\n"); exit(1); } } #endif void adj_base(pe) struct part_entry *pe; { /* Adjust base sector of partition, usually to make it even. */ int adj; if (pe == NULL) return; while (1) { if (!get_an_int("\tEnter adjustment to base (an integer): ", &adj)) return; if (pe->lowsec + adj < 1) printf( "\t\tThat would make the base %d and too small\n", pe->lowsec + adj); else if (pe->size - adj < 1) printf( "\t\tThat would make the size %d and too small\n", pe->size - adj); else break; } pe->lowsec += adj; pe->size -= adj; sec_to_hst(pe->lowsec, &pe->start_head, &pe->start_sec, &pe->start_cyl); printf("Base of partition adjusted to %ld, size adjusted to %ld\n", pe->lowsec, pe->size); } void adj_size(pe) struct part_entry *pe; { /* Adjust size of partition by reducing high sector. */ int adj; if (pe == NULL) return; while (1) { if (!get_an_int("\tEnter adjustment to size (an integer): ", &adj)) return; if (pe->size + adj >= 1) break; printf("\t\tThat would make the size %d and too small \n", pe->size + adj); } pe->size += adj; sec_to_hst(pe->lowsec + pe->size - 1, &pe->last_head, &pe->last_sec, &pe->last_cyl); printf("Size of partition adjusted to %ld\n", pe->size); } struct part_entry *ask_partition() { /* Ask for a valid partition number and return its entry. */ int num; while (1) { if (!get_an_int("Enter partition number (1 to 4): ", &num)) return(NULL); if (num >= 1 && num <= NR_PARTITIONS) break; printf("\tThat does not look like 1 to 4\n"); } printf("Partition %d\n", num); return((struct part_entry *) &secbuf[PART_TABLE_OFF] + (num - 1)); } void footnotes() { /* Explain the footnotes. */ if (badbases != 0) { printf( "+ The old Minix wini drivers (before V1.5) discarded odd base sectors.\n"); printf( " This causes some old (Minix) file systems to be offset by 1 sector.\n"); printf( " To use these with the new drivers, increase the base by 1 using 'B'.\n"); } if (badsizes != 0) { if (badbases != 0) putchar('\n'); printf( "- Minix cannot access the last sector on an odd-sized partition. This\n"); printf( " causes trouble for programs like dosread. This program will by default\n"); printf( " only create partitions with even sizes. If possible, the current odd\n"); printf( " sizes should be decreased by 1 using 'S'. This is safe for all Minix\n"); printf( " partitions, and may be safe for other partitions which are about to be\n"); printf( " reformatted.\n"); } if (badorders!= 0 ) { if (badbases != 0 || badsizes != 0) putchar('\n'); printf( "# The partitions are in a funny order. This is normal if they were created\n"); printf( " by DOS fdisks prior to DOS 3.3. The Minix wini drivers further confuse\n"); printf( " the order by sorting the partitions on their base. Be careful if the\n"); printf( " device numbers of unchanged partitions have changed.\n"); } } int get_an_int(prompt, intptr) char *prompt; int *intptr; { /* Read an int from the start of line of stdin, discard rest of line. */ char buf[80]; while (1) { printf("%s", prompt); if (!mygets(buf, (int) sizeof buf)) return(0); if ((sscanf(buf, "%d", intptr)) == 1) return(1); printf("\t\tThat does not look like an integer\n"); } } void list_part_types() { /* Print all known partition types. */ int column; int type; for (column = 0, type = 0; type < 0x100; ++type) if (strcmp(systype(type), "Unknown") != 0) { printf("0x%02x: %-9s", type, systype(type)); column += 16; if (column < 80) putchar(' '); else { putchar('\n'); column = 0; } } if (column != 0) putchar('\n'); } void mark_npartition(pe) struct part_entry *pe; { /* Mark a partition with arbitrary type. */ char buf[80]; unsigned type; if (pe == NULL) return; printf("\nKnown partition types are:\n\n"); list_part_types(); while (1) { printf("\nEnter partition type (in 2-digit hex): "); if (!mygets(buf, (int) sizeof buf)) return; if (sscanf(buf, "%x", &type) != 1) printf("Invalid hex number\n"); else if (type >= 0x100) printf("Hex number too large\n"); else break; } pe->sysind = type; printf("Partition type changed to 0x%02x (%s)\n", type, systype(type)); } int mygets(buf, length) char *buf; int length; /* as for fgets(), but must be >= 2 */ { /* Get a non-empty line of maximum length 'length'. */ while (1) { fflush(stdout); if (fgets(buf, length, stdin) == NULL) { putchar('\n'); return(0); } if (strrchr(buf, '\n') != NULL) *strrchr(buf, '\n') = 0; if (*buf != 0) return(1); printf("Use the EOF character to create a null line.\n"); printf("Otherwise, please type something before the newline: "); } } char *systype(type) int type; { /* Convert system indicator into system name. */ /* asw 01.03.95: added types based on info in kjb's part.c and output * from Linux (1.0.8) fdisk. Note comments here, there are disagreements. */ switch(type) { case NO_PART: return("None"); case 1: return("DOS-12"); case 2: return("XENIX"); case 3: return("XENIX usr"); case 4: return("DOS-16"); case 5: return("DOS-EXT"); case 6: return("DOS-BIG"); case 7: return("HPFS"); case 8: return("AIX"); case 9: return("COHERENT"); /* LINUX says AIX bootable */ case 0x0a: return("OS/2"); /* LINUX says OPUS */ case 0x10: return("OPUS"); case 0x40: return("VENIX286"); case 0x51: return("NOVELL?"); case 0x52: return("MICROPORT"); case 0x63: return("386/IX"); /*LINUX calls this GNU HURD */ case 0x64: return("NOVELL286"); case 0x65: return("NOVELL386"); case 0x75: return("PC/IX"); case 0x80: return("MINIX old"); case 0x81: return("MINIX"); case 0x82: return("LINUXswap"); case 0x83: return("LINUX"); case 0x93: return("AMOEBA"); case 0x94: return("AMOEBAbad"); case 0xa5: return("386BSD"); case 0xb7: return("BSDI"); case 0xb8: return("BSDIswap"); case 0xc7: return("Syrinx"); case 0xDB: return("CP/M"); case 0xe1: return("DOS acc"); case 0xe3: return("DOS r/o"); case 0xf2: return("DOS 2ary"); case 0xFF: return("Badblocks"); default: return("Unknown"); } } void toggle_active(pe) struct part_entry *pe; { /* Toggle active flag of a partition. */ if (pe == NULL) return; pe->bootind = (pe->bootind == ACTIVE_FLAG) ? 0 : ACTIVE_FLAG; printf("Partition changed to %sactive\n", pe->bootind ? "" : "in"); } void usage() { /* Print usage message and exit. */ printf("Usage: fdisk [-hheads] [-ssectors] [device]\n"); exit(1); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* format 1.1 - format PC floppy disk Author: Kees J. Bot * 5 Mar 1994 */ #define nil 0 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <time.h> #include <errno.h> #include <limits.h> #include <ibm/diskparm.h> #include <minix/minlib.h> /* Constants. */ #define SECTOR_SIZE 512 #define NR_HEADS 2 #define MAX_SECTORS 18 /* 1.44Mb is the largest. */ /* Name error in <ibm/diskparm.h>, left over from the days floppies were * single sided. */ #define sectors_per_track sectors_per_cylinder /* From floppy device number to drive/type/format-bit and back. See fd(4). */ #define isfloppy(dev) (((dev) & 0xFF00) == 0x0200) #define fl_drive(dev) (((dev) & 0x0003) >> 0) #define fl_type(dev) (((dev) & 0x007C) >> 2) #define fl_format(dev) (((dev) & 0x0080) >> 7) #define fl_makedev(drive, type, fmt) \ ((dev_t) (0x0200 | ((fmt) << 7) | ((type) << 2) | ((drive) << 0))) /* Recognize floppy types. */ #define NR_TYPES 7 /* # non-auto types */ #define isflauto(type) ((type) == 0) #define isfltyped(type) ((unsigned) ((type) - 1) < NR_TYPES) #define isflpart(type) ((unsigned) (type) >= 28) /* Formatting parameters per type. (Most of these parameters have no use * for formatting, disk_parameter_s probably matches a BIOS parameter table.) */ typedef struct disk_parameter_s fmt_params_t; typedef struct type_parameters { unsigned media_size; unsigned drive_size; fmt_params_t fmt_params; } type_parameters_t; #define DC 0 /* Don't care. */ type_parameters_t parameters[NR_TYPES] = { /* mediasize s1 off sec/cyl dlen fill start */ /* drivesize s2 sizecode gap fmtgap settle */ /* pc */ { 360, 360, { DC, DC, DC, 2, 9, DC, DC, 0x50, 0xF6, DC, DC }}, /* at */ { 1200, 1200, { DC, DC, DC, 2, 15, DC, DC, 0x54, 0xF6, DC, DC }}, /* qd */ { 360, 720, { DC, DC, DC, 2, 9, DC, DC, 0x50, 0xF6, DC, DC }}, /* ps */ { 720, 720, { DC, DC, DC, 2, 9, DC, DC, 0x50, 0xF6, DC, DC }}, /* pat */{ 360, 1200, { DC, DC, DC, 2, 9, DC, DC, 0x50, 0xF6, DC, DC }}, /* qh */ { 720, 1200, { DC, DC, DC, 2, 9, DC, DC, 0x50, 0xF6, DC, DC }}, /* PS */ { 1440, 1440, { DC, DC, DC, 2, 18, DC, DC, 0x54, 0xF6, DC, DC }}, }; /* Per sector ID to be sent to the controller by the driver. */ typedef struct sector_id { unsigned char cyl; unsigned char head; unsigned char sector; unsigned char sector_size_code; } sector_id_t; /* Data to be "written" to the driver to format a track. (lseek to the track * first.) The first sector contains sector ID's, the second format params. */ typedef struct track_data { sector_id_t sec_ids[SECTOR_SIZE / sizeof(sector_id_t)]; fmt_params_t fmt_params; char padding[SECTOR_SIZE - sizeof(fmt_params_t)]; } track_data_t; void report(const char *label) { fprintf(stderr, "format: %s: %s\n", label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } void format_track(int ffd, unsigned type, unsigned cyl, unsigned head) /* Format a single track on a floppy. */ { type_parameters_t *tparams= ¶meters[type - 1]; track_data_t track_data; off_t track_pos; unsigned sector; unsigned nr_sectors= tparams->fmt_params.sectors_per_track; sector_id_t *sid; memset(&track_data, 0, sizeof(track_data)); /* Set the sector id's. (Note that sectors count from 1.) */ for (sector= 0; sector <= nr_sectors; sector++) { sid= &track_data.sec_ids[sector]; sid->cyl= cyl; sid->head= head; sid->sector= sector + 1; sid->sector_size_code= tparams->fmt_params.sector_size_code; } /* Format parameters. */ track_data.fmt_params= tparams->fmt_params; /* Seek to the right track. */ track_pos= (off_t) (cyl * NR_HEADS + head) * nr_sectors * SECTOR_SIZE; if (lseek(ffd, track_pos, SEEK_SET) == -1) { fprintf(stderr, "format: seeking to cyl %u, head %u (pos %ld) failed: %s\n", cyl, head, track_pos, strerror(errno)); exit(1); } /* Format track. */ if (write(ffd, &track_data, sizeof(track_data)) < 0) { fprintf(stderr, "format: formatting cyl %d, head %d failed: %s\n", cyl, head, strerror(errno)); exit(1); } } void verify_track(int vfd, unsigned type, unsigned cyl, unsigned head) /* Verify a track by reading it. On error read sector by sector. */ { type_parameters_t *tparams= ¶meters[type - 1]; off_t track_pos; unsigned sector; unsigned nr_sectors= tparams->fmt_params.sectors_per_track; size_t track_bytes; static char buf[MAX_SECTORS * SECTOR_SIZE]; static unsigned bad_count; /* Seek to the right track. */ track_pos= (off_t) (cyl * NR_HEADS + head) * nr_sectors * SECTOR_SIZE; if (lseek(vfd, track_pos, SEEK_SET) == -1) { fprintf(stderr, "format: seeking to cyl %u, head %u (pos %ld) failed: %s\n", cyl, head, track_pos, strerror(errno)); exit(1); } /* Read the track whole. */ track_bytes= nr_sectors * SECTOR_SIZE; if (read(vfd, buf, track_bytes) == track_bytes) return; /* An error occurred, retry sector by sector. */ for (sector= 0; sector < nr_sectors; sector++) { if (lseek(vfd, track_pos, SEEK_SET) == -1) { fprintf(stderr, "format: seeking to cyl %u, head %u, sector %u (pos %ld) failed: %s\n", cyl, head, sector, track_pos, strerror(errno)); exit(1); } switch (read(vfd, buf, SECTOR_SIZE)) { case -1: fprintf(stderr, "format: bad sector at cyl %u, head %u, sector %u (pos %ld)\n", cyl, head, sector, track_pos); bad_count++; break; case SECTOR_SIZE: /* Fine. */ break; default: fprintf(stderr, "format: short read at pos %ld\n", track_pos); bad_count++; } track_pos+= SECTOR_SIZE; if (bad_count >= nr_sectors) { fprintf(stderr, "format: too many bad sectors, floppy unusable\n"); exit(1); } } } void format_device(unsigned drive, unsigned type, int verify) { int ffd, vfd; char *fmt_dev, *ver_dev; struct stat st; unsigned cyl, head; unsigned nr_cyls; type_parameters_t *tparams= ¶meters[type - 1]; int verbose= isatty(1); fmt_dev= tmpnam(nil); if (mknod(fmt_dev, S_IFCHR | 0700, fl_makedev(drive, type, 1)) < 0) { fprintf(stderr, "format: making format device failed: %s\n", strerror(errno)); exit(1); } if ((ffd= open(fmt_dev, O_WRONLY)) < 0 || fstat(ffd, &st) < 0) { report(fmt_dev); (void) unlink(fmt_dev); exit(1); } (void) unlink(fmt_dev); if (st.st_rdev != fl_makedev(drive, type, 1)) { /* Someone is trying to trick me. */ exit(1); } if (verify) { ver_dev= tmpnam(nil); if (mknod(ver_dev, S_IFCHR | 0700, fl_makedev(drive, type, 0)) < 0) { fprintf(stderr, "format: making verify device failed: %s\n", strerror(errno)); exit(1); } if ((vfd= open(ver_dev, O_RDONLY)) < 0) { report(ver_dev); (void) unlink(ver_dev); exit(1); } (void) unlink(ver_dev); } nr_cyls= tparams->media_size * (1024 / SECTOR_SIZE) / NR_HEADS / tparams->fmt_params.sectors_per_track; if (verbose) { printf("Formatting a %uk diskette in a %uk drive\n", tparams->media_size, tparams->drive_size); } for (cyl= 0; cyl < nr_cyls; cyl++) { for (head= 0; head < NR_HEADS; head++) { if (verbose) { printf(" Cyl. %2u, Head %u\r", cyl, head); fflush(stdout); } #if __minix_vmd /* After formatting a track we are too late to format * the next track. So we can sleep at most 1/6 sec to * allow the above printf to get displayed before we * lock Minix into the floppy driver again. */ usleep(50000); /* 1/20 sec will do. */ #endif format_track(ffd, type, cyl, head); if (verify) verify_track(vfd, type, cyl, head); } } if (verbose) fputc('\n', stdout); } void usage(void) { fprintf(stderr, "Usage: format [-v] <device> [<media size> [<drive size>]]\n"); exit(1); } int main(int argc, char **argv) { char *device; unsigned drive; unsigned type; unsigned media_size; unsigned drive_size; int verify= 0; struct stat st0, st; FILE *mfp; char special[PATH_MAX + 1], mounted_on[PATH_MAX + 1]; char version[10], rw_flag[10]; /* Option -v. */ while (argc > 1 && argv[1][0] == '-') { char *p; for (p= argv[1]; *p == '-' || *p == 'v'; p++) { ifG��G��G��G�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� (*p == 'v') verify= 1; } if (*p != 0) usage(); argc--; argv++; if (strcmp(argv[0], "--") == 0) break; } if (argc < 2 || argc > 4) usage(); /* Check if the caller has read-write permission. Use the access() * call to check with the real uid & gid. This program is usually * set-uid root. */ device= argv[1]; if (stat(device, &st0) < 0 || access(device, R_OK|W_OK) < 0 || stat(device, &st) < 0 || (errno= EACCES, 0) /* set errno for following tests */ || st.st_dev != st0.st_dev || st.st_ino != st0.st_ino ) { fatal(device); } if ((!S_ISBLK(st.st_mode) && !S_ISCHR(st.st_mode)) || !isfloppy(st.st_rdev)) { fprintf(stderr, "format: %s: not a floppy device\n", device); exit(1); } drive= fl_drive(st.st_rdev); type= fl_type(st.st_rdev); /* The drive should not be mounted. */ if (load_mtab("mkfs") < 0) return; while (get_mtab_entry(special, mounted_on, version, rw_flag) == 0) { if (stat(special, &st) >= 0 && isfloppy(st.st_rdev) && fl_drive(st.st_rdev) == drive) { fprintf(stderr, "format: %s is mounted on %s\n", device, mounted_on); exit(1); } } if (isflauto(type)) { /* Auto type 0 requires size(s). */ unsigned long lmedia, ldrive; char *end; if (argc < 3) { fprintf(stderr, "format: no size specified for auto floppy device %s\n", device); usage(); } lmedia= strtoul(argv[2], &end, 10); if (end == argv[2] || *end != 0 || lmedia > 20 * 1024) usage(); if (argc == 4) { ldrive= strtoul(argv[3], &end, 10); if (end == argv[3] || *end != 0 || ldrive > 20 * 1024) usage(); } else { ldrive= lmedia; } /* Silently correct wrong ordered sizes. */ if (lmedia > ldrive) { media_size= ldrive; drive_size= lmedia; } else { media_size= lmedia; drive_size= ldrive; } /* A 1.44M drive can do 720k diskettes with no extra tricks. * Diddle with the 720k params so it is found. */ if (media_size == 720 && drive_size == 1440) parameters[4 - 1].drive_size= 1440; /* Translate the auto type to a known type. */ for (type= 1; type <= NR_TYPES; type++) { if (parameters[type - 1].media_size == media_size && parameters[type - 1].drive_size == drive_size ) break; } if (!isfltyped(type)) { fprintf(stderr, "format: can't format a %uk floppy in a %uk drive\n", media_size, drive_size); exit(1); } } else if (isfltyped(type)) { /* No sizes needed for a non-auto type. */ if (argc > 2) { fprintf(stderr, "format: no sizes need to be specified for non-auto floppy device %s\n", device); usage(); } } else if (isflpart(type)) { fprintf(stderr, "format: floppy partition %s can't be formatted\n", device); exit(1); } else { fprintf(stderr, "format: %s: can't format strange type %d\n", device, type); } format_device(drive, type, verify); exit(0); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* loadfont.c - Load custom font into EGA, VGA video card * * Author: Hrvoje Stipetic (hs@hck.hr) Jun-1995. * */ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <termios.h> #include <sys/ioctl.h> void tell(char *s) { write(2, s, strlen(s)); } char *itoa(unsigned i) { static char a[3*sizeof(int)]; char *p = a+sizeof(a)-1; do { *--p = '0' + i%10; } while ((i /= 10) > 0); return p; } void report(char *say) { int err = errno; tell("loadfont: "); if (say != NULL) { tell(say); tell(": "); } tell(strerror(err)); tell("\n"); } void usage(void) { tell("Usage: loadfont fontfile\n"); exit(1); } int main(int argc, char *argv[]) { static u8_t font[256][32]; static u8_t font_file[256 * (16+14+8) + 1]; u8_t *ff; int fd, size, tsize, ch, ln; struct winsize ws; if (argc != 2) usage(); if ((fd = open(argv[1], O_RDONLY)) < 0) { report(argv[1]); exit(1); } switch (read(fd, font_file, sizeof(font_file))) { case 256 * 8: size = 8; break; case 256 * 14: size = 14; break; case 256 * 16: size = 16; break; case 256 * (16+14+8): size = 0; break; case -1: report(argv[1]); exit(1); default: tell("loadfont: "); tell(argv[1]); tell(": fontfile is not an 8x8, 8x14, 8x16, or compound font\n"); exit(1); } close(fd); if (ioctl(0, TIOCGWINSZ, &ws) < 0 || (errno= ENOTTY, ws.ws_row == 0)) { report(NULL); exit(1); } tsize = ws.ws_ypixel / ws.ws_row; if (size == 0) { if (tsize >= 16) { ff = font_file + 256 * (0); } else if (tsize >= 14) { ff = font_file + 256 * (16); } else { ff = font_file + 256 * (16 + 14); } size = tsize; } else { ff = font_file; } for (ch = 0; ch < 256; ch++) { for (ln = 0; ln < size; ln++) font[ch][ln] = ff[ch * size + ln]; } if (ioctl(0, TIOCSFON, font) < 0) { report(NULL); exit(1); } exit(0); } ��������������������������������������������������������������������������������������������������/* loadkeys - load national keyboard map Author: Marcus Hampel */ #include <sys/types.h> #include <sys/ioctl.h> #include <minix/keymap.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #if __minix_vmd #define KBD_DEVICE "/dev/kbd" #else #define KBD_DEVICE ((char *) NULL) #endif u16_t keymap[NR_SCAN_CODES * MAP_COLS]; u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1]; void tell(char *s) { write(2, s, strlen(s)); } void fatal(char *say) { int err = errno; tell("loadkeys: "); if (say != NULL) { tell(say); tell(": "); } tell(strerror(err)); tell("\n"); exit(1); } void usage(void) { tell("Usage: loadkeys mapfile\n"); exit(1); } int main(int argc, char *argv[]) { u8_t *cm; u16_t *km; int fd, n, fb; if (argc != 2) usage(); if ((fd = open(argv[1], O_RDONLY)) < 0) fatal(argv[1]); if (read(fd, comprmap, sizeof(comprmap)) < 0) fatal(argv[1]); if (memcmp(comprmap, KEY_MAGIC, 4) != 0) { tell("loadkeys: "); tell(argv[1]); tell(": not a keymap file\n"); exit(1); } close(fd); /* Decompress the keymap data. */ cm = comprmap + 4; n = 8; for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) { if (n == 8) { /* Need a new flag byte. */ fb = *cm++; n = 0; } *km = *cm++; /* Low byte. */ if (fb & (1 << n)) { *km |= (*cm++ << 8); /* One of the few special keys. */ } n++; } #if __minix_vmd if ((fd = open(KBD_DEVICE, O_WRONLY)) < 0) fatal(KBD_DEVICE); #else fd = 0; #endif if (ioctl(fd, KIOCSMAP, keymap) < 0) fatal(KBD_DEVICE); exit(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mixer * * Michel R. Prevenier. */ #include <sys/types.h> #include <errno.h> #include <curses.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <sys/ioctl.h> #include <minix/sound.h> #define CURS_CTRL '\033' #define ESCAPE 27 #define UP 'A' #define DOWN 'B' #define LEFT 'D' #define RIGHT 'C' #define SPACE ' ' _PROTOTYPE ( int main, (int arg, char **argv)); _PROTOTYPE ( void usage, (void)); _PROTOTYPE ( void non_interactive, (void)); _PROTOTYPE ( void setup_screen, (void)); _PROTOTYPE ( int read_settings, (void)); _PROTOTYPE ( int write_settings, (void)); _PROTOTYPE ( void rdwr_levels, (int flag)); _PROTOTYPE ( void rdwr_inputs, (int flag)); _PROTOTYPE ( void rdwr_outputs, (int flag)); _PROTOTYPE ( void create_slider, (int x, int y, enum Device device)); _PROTOTYPE ( void show_inputs, (int x, int y)); _PROTOTYPE ( void show_outputs, (int x, int y)); _PROTOTYPE ( char *d_name, (enum Device device, char *name)); _PROTOTYPE ( void user_interface, (void)); _PROTOTYPE ( void terminate, (int s)); WINDOW *main_win; int old_stdin; int fd; char name[9]; char *file_name; struct volume_level levels[9]; struct inout_ctrl inputs_left[9]; struct inout_ctrl inputs_right[9]; struct inout_ctrl outputs[9]; void usage() { fprintf(stderr, "Usage: mixer [-r]\n"); exit(-1); } void terminate(s) int s; { /* Restore terminal parameters and exit */ (void) fcntl(0,F_SETFL,old_stdin); move(23, 0); refresh(); resetty(); endwin(); exit(1); } int write_settings() { /* Write the current mixer settings to $HOME/.mixer */ int fd; if ((fd = creat(file_name, 0x124)) > 0) { write(fd, levels, sizeof(levels)); write(fd, inputs_left, sizeof(inputs_left)); write(fd, inputs_right, sizeof(inputs_right)); write(fd, outputs, sizeof(outputs)); close(fd); return 1; } return 0; } int read_settings() { /* Restore mixer settings saved in $HOME/.mixer */ int fd; if ((fd = open(file_name, O_RDONLY)) > 0) { read(fd, levels, sizeof(levels)); read(fd, inputs_left, sizeof(inputs_left)); read(fd, inputs_right, sizeof(inputs_right)); read(fd, outputs, sizeof(outputs)); close(fd); rdwr_levels(1); rdwr_outputs(1); rdwr_inputs(1); return 1; } return 0; } void rdwr_levels(flag) int flag; /* 0 = read, 1 = write */ { /* Get or set mixer settings */ int i; int cmd; cmd = (flag == 0 ? MIXIOGETVOLUME : MIXIOSETVOLUME); for(i = Master; i <= Bass; i++) (void) (ioctl(fd, cmd, &levels[i])); } void rdwr_inputs(flag) int flag; /* 0 = read, 1 = write */ { /* Get or set input settings */ int i; int cmd_left, cmd_right; cmd_left = (flag == 0 ? MIXIOGETINPUTLEFT : MIXIOSETINPUTLEFT); cmd_right = (flag == 0 ? MIXIOGETINPUTRIGHT : MIXIOSETINPUTRIGHT); for(i = Fm; i <= Mic; i++) { (void) (ioctl(fd, cmd_left, &inputs_left[i])); (void) (ioctl(fd, cmd_right, &inputs_right[i])); } } void rdwr_outputs(flag) int flag; /* 0 = read, 1 = write */ { /* Get or set output settings */ int i; int cmd; cmd = (flag == 0 ? MIXIOGETOUTPUT : MIXIOSETOUTPUT); for(i = Cd; i <= Mic; i++) (void) (ioctl(fd, cmd, &outputs[i])); } int main(argc, argv) int argc; char **argv; { int i; char *home_ptr; int fd2; /* Open mixer */ if ((fd = open("/dev/mixer",O_RDONLY)) < 0) { fprintf(stderr, "Cannot open /dev/mixer\n"); exit(-1); } /* Get user's home directory and construct the $HOME/.mixer * file name */ home_ptr = getenv("HOME"); file_name = malloc(strlen(home_ptr)+strlen("mixer.ini\0")); if (file_name == (char *)0) { fprintf(stderr, "Not enough memory\n"); exit(-1); } strncpy(file_name, home_ptr, strlen(home_ptr)); strncpy(file_name+strlen(home_ptr), "/.mixer\0", 9); /* Fill in the device numbers */ for(i = Master; i <= Bass; i++) { levels[i].device = i; inputs_left[i].device = i; inputs_right[i].device = i; outputs[i].device = i; } /* Get arguments */ if (argc > 1) { if (strncmp(argv[1], "-r", 2) == 0) { if (read_settings()) { printf("Mixer settings restored\n"); exit(0); } else { fprintf(stderr, "Could not restore mixer settings\n"); exit(-1); } } else usage(); } /* Initialize windows. */ (void) initscr(); signal(SIGINT, terminate); old_stdin = fcntl(0,F_GETFL); cbreak(); noecho(); main_win = newwin(23,80,0,0); scrollok(main_win, FALSE); /* Read all current mixer settings */ rdwr_levels(0); rdwr_inputs(0); rdwr_outputs(0); /* Set up the user screen and handle user input */ setup_screen(); user_interface(); } void user_interface() { /* This is the user interface. */ char c; int x,y; int right; int input_scr, input_pos; int output_scr, output_pos; int max_level; enum Device device; int fd2; device = Master; right = 0; input_scr = 0; output_scr = 0; input_pos = 0; output_pos = 0; while(1) { if (input_scr) { y = device + 9; x = 51 + input_pos + (device == Mic ? 2 : 0); } else if (output_scr) { y = device + 15; x = 53 + output_pos + (device == Mic ? 4 : 0); } else { y = (device != Speaker ? 2 : 1) + (device - (device < Treble ? 0 : Treble)) * 3 + (right == 0 ? 0 : 1); if (!right) x = 9 + levels[device].left / (device < Speaker ? 2 : 1 ) + (device > Speaker ? 39 : 0); else x = 9 + levels[device].right / (device < Speaker ? 2 : 1) + (device > Speaker ? 39 : 0); } wmove(main_win,y,x); wrefresh(main_win); c = wgetch(main_win); switch(c) { case CURS_CTRL: { (void) wgetch(main_win); c = wgetch(main_win); switch(c) { case DOWN: { if (output_scr) { if (device < Mic) { device++; if (device == Mic) output_pos = 0; } } else if (right || input_scr) { if (!input_scr) { if (device < Bass) { device++; right = 0; } else { input_scr = 1; input_pos = 0; device = Fm; } } else { if (device < Mic) { device++; if (device == Mic && input_pos > 8) input_pos = 8; } else { device = Cd; output_scr = 1; input_scr = 0; output_pos = 0; } } } else { if (device != Mic && device != Speaker) right = 1; else { device++; right = 0; } } };break; case UP: { if (output_scr) { if (device > Cd) device--; else { device = Mic; output_scr = 0; input_scr = 1; } } else if (!right || input_scr) { if (input_scr) { if (device > Fm) device--; else { input_scr = 0; device = Bass; right = 1; } } else { if (device > Master) { device--; if (device != Mic && device != Speaker) right = 1; } } } else right = 0; };break; case RIGHT: { if (output_scr) { G��G��G��G��G��G��G��G��G������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ if (output_pos < 8 && device != Mic) output_pos = 8; } else if (!input_scr) { if (device < Speaker) max_level = 31; else if (device > Speaker) max_level = 15; else max_level = 4; if (!right) { if (levels[device].left < max_level) levels[device].left+= (device < Speaker ? 2 : 1); } else { if (levels[device].right < max_level) levels[device].right+= (device < Speaker ? 2 : 1); } ioctl(fd, MIXIOSETVOLUME, &levels[device]); ioctl(fd, MIXIOGETVOLUME, &levels[device]); create_slider(1 + (device < Treble ? 0 : 39), (device - (device < Treble ? 0 : Treble))*3 + (device != Speaker ? 2 : 1), device); } else { if ((device != Mic && input_pos < 12) || (device == Mic && input_pos < 8)) input_pos += (4 + (device == Mic ? 4 : 0)); } };break; case LEFT: { if (output_scr) { if (output_pos > 0) output_pos = 0; } else if (!input_scr) { if (!right) { if (levels[device].left > 0) levels[device].left-= (device < Speaker ? 2 : 1); } else { if (levels[device].right > 0) levels[device].right-= (device < Speaker ? 2 : 1); } ioctl(fd, MIXIOSETVOLUME, &levels[device]); ioctl(fd, MIXIOGETVOLUME, &levels[device]); create_slider(1 + (device < Treble ? 0 : 39), (device - (device < Treble ? 0 : Treble))*3 + (device != Speaker ? 2 : 1), device); } else { if (input_pos > 0) input_pos -= (4 + (device == Mic ? 4 : 0)); } };break; } };break; case SPACE: { if (output_scr) { switch(output_pos) { case 0: case 4: { outputs[device].left = (outputs[device].left == ON ? OFF : ON); ioctl(fd, MIXIOSETOUTPUT, &outputs[device]); };break; case 8: { outputs[device].right = (outputs[device].right == ON ? OFF : ON); ioctl(fd, MIXIOSETOUTPUT, &outputs[device]); };break; } ioctl(fd, MIXIOGETOUTPUT, &outputs[device]); show_outputs(41,16); } else if (input_scr) { switch(input_pos) { case 0: { inputs_left[device].left = (inputs_left[device].left == ON ? OFF : ON); ioctl(fd, MIXIOSETINPUTLEFT, &inputs_left[device]); };break; case 4: { inputs_left[device].right = (inputs_left[device].right == ON ? OFF : ON); ioctl(fd, MIXIOSETINPUTLEFT, &inputs_left[device]); };break; case 8: { inputs_right[device].left = (inputs_right[device].left == ON ? OFF : ON); ioctl(fd, MIXIOSETINPUTRIGHT, &inputs_right[device]); };break; case 12: { inputs_right[device].right = (inputs_right[device].right == ON ? OFF : ON); ioctl(fd, MIXIOSETINPUTRIGHT, &inputs_right[device]); };break; } ioctl(fd, MIXIOGETINPUTLEFT, &inputs_left[device]); ioctl(fd, MIXIOGETINPUTRIGHT, &inputs_right[device]); show_inputs(41,8); } };break; case 's': { if (write_settings()) mvwprintw(main_win,22,28, "mixer settings saved"); else mvwprintw(main_win,22,28, "error: file not saved"); wrefresh(main_win); sleep(1); mvwprintw(main_win,22,28, " "); };break; case 'r': { if (read_settings()) mvwprintw(main_win,22,28, "mixer settings restored"); else mvwprintw(main_win,22,28, "error: could not open"); wrefresh(main_win); sleep(1); setup_screen(); };break; case 'e': terminate(1); } } } char *d_name(device, name) enum Device device; char *name; { /* Convert the device number to a name */ switch (device) { case Master: strncpy(name, "Master \0", 9);break; case Dac: strncpy(name, "Dac \0", 9);break; case Fm: strncpy(name, "Fm \0", 9);break; case Cd: strncpy(name, "CD \0", 9);break; case Line: strncpy(name, "Line \0", 9);break; case Mic: strncpy(name, "Mic \0", 9);break; case Speaker: strncpy(name, "Speaker \0", 9);break; case Treble: strncpy(name, "Treble \0", 9);break; case Bass: strncpy(name, "Bass \0", 9);break; } return name; } void create_slider(x, y, device) int x; int y; enum Device device; { /* Create a slider on the screen */ int left; int right; int i; mvwprintw(main_win,y,x, "%s", d_name(device, name)); left = levels[device].left / (device < Speaker ? 2 : 1); right = levels[device].right / (device < Speaker ? 2 : 1); for (i = 0; i < 16; i++) { if (device != Speaker || i < 4) mvwprintw(main_win,y,x+i+8, (i == left ? "*" : "-")); if (device < Mic || device > Speaker) mvwprintw(main_win,y+1,x+i+8, (i == right ? "*" : "-")); } if (device < Mic || device > Speaker) { mvwprintw(main_win,y,x+i+10, "left"); mvwprintw(main_win,y+1,x+i+10, "right"); } wrefresh(main_win); } void show_inputs(x,y) int x; int y; { /* Show the input settings */ int i; mvwprintw(main_win,y,x, " Rec-In "); mvwprintw(main_win,y+1,x," left right"); mvwprintw(main_win,y+2,x," l r l r"); for (i = Fm; i <= Line; i++) { mvwprintw(main_win,y+i+1,x, "%s %d %d %d %d", d_name(i, (char *)name), (inputs_left[i].left == ON ? 1 : 0), (inputs_left[i].right == ON ? 1 : 0), (inputs_right[i].left == ON ? 1 : 0), (inputs_right[i].right == ON ? 1 : 0)); } mvwprintw(main_win,y+i+1,x, "%s %d %d", d_name(Mic, (char *)name), (inputs_left[Mic].left == ON ? 1 : 0), (inputs_right[Mic].left == ON ? 1 : 0)); wrefresh(main_win); } void show_outputs(x,y) int x; int y; { /* Show the output settings */ int i; mvwprintw(main_win,y,x, " Mix-Out "); mvwprintw(main_win,y+1,x, " left right"); for (i = Cd; i <= Line; i++) { mvwprintw(main_win,y+i-1,x,"%s %d %d", d_name(i, (char *)name), (outputs[i].left == ON ? 1 : 0), (outputs[i].right == ON ? 1 : 0)); } mvwprintw(main_win,y+i-1,x,"%s %d", d_name(Mic, (char *)name), (outputs[Mic].left == ON ? 1 : 0)); wrefresh(main_win); } void setup_screen() { int i; wclear(main_win); mvwprintw(main_win,0,23,"------- Mixer Controls -------"); wrefresh(main_win); for(i = 0; i <= Speaker; i++) create_slider(1, i*3+(i <= Mic ? 2 : 1), i); create_slider(40, 2, Treble); create_slider(40, 5, Bass); show_inputs(41,8); show_outputs(41,16); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* part 1.56 - Partition table editor Author: Kees J. Bot * 13 Mar 1992 * Needs about 22k heap+stack. */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <termcap.h> #include <errno.h> #include <unistd.h> #include <stddef.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <fcntl.h> #include <time.h> #include <dirent.h> #include <limits.h> #include <a.out.h> #include <sys/stat.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <minix/config.h> #include <minix/const.h> #include <minix/partition.h> #include <minix/u64.h> #include <ibm/partition.h> #include <termios.h> /* True if a partition is an extended partition. */ #define ext_part(s) ((s) == 0x05 || (s) == 0x0F) /* Minix master bootstrap code. */ static char MASTERBOOT[] = "/usr/mdec/masterboot"; /* Template: ----first---- --geom/last-- ------sectors----- Device Cyl Head Sec Cyl Head Sec Base Size Kb /dev/c0d0 977 5 17 /dev/c0d0:2 0 0 2 976 4 16 2 83043 41521 Num Sort Type 0* p0 81 MINIX 0 0 3 33 4 9 3 2880 1440 1 p1 81 MINIX 33 4 10 178 2 2 2883 12284 6142 2 p2 81 MINIX 178 2 3 976 4 16 15167 67878 33939 3 p3 00 None 0 0 0 0 0 -1 0 0 0 */ #define MAXSIZE 99999999L /* Will 100 G be enough this year? */ #define SECTOR_SIZE 512 #define DEV_FD0 0x200 /* Device number of /dev/fd0 */ #define DEV_C0D0 0x300 /* Device number of /dev/c0d0 */ #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) void report(const char *label) { fprintf(stderr, "part: %s: %s\n", label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } struct termios termios; void save_ttyflags(void) /* Save tty attributes for later restoration. */ { if (tcgetattr(0, &termios) < 0) fatal(""); } void restore_ttyflags(void) /* Reset the tty flags to how we got 'em. */ { if (tcsetattr(0, TCSANOW, &termios) < 0) fatal(""); } void tty_raw(void) /* Set the terminal to raw mode, no signals, no echoing. */ { struct termios rawterm; rawterm= termios; rawterm.c_lflag &= ~(ICANON|ISIG|ECHO); rawterm.c_iflag &= ~(ICRNL); if (tcsetattr(0, TCSANOW, &rawterm) < 0) fatal(""); } #define ctrl(c) ((c) == '?' ? '\177' : ((c) & '\37')) char t_cd[16], t_cm[32], t_so[16], t_se[16], t_md[16], t_me[16]; int t_li, t_co; #define STATUSROW 10 void init_tty(void) /* Get terminal capabilities and set the tty to "editor" mode. */ { char *term; static char termbuf[1024]; char *tp; if ((term= getenv("TERM")) == nil || tgetent(termbuf, term) != 1) { fprintf(stderr, "part: Can't get terminal capabilities\n"); exit(1); } if (tgetstr("cd", (tp= t_cd, &tp)) == nil || tgetstr("cm", (tp= t_cm, &tp)) == nil) { fprintf(stderr, "part: This terminal is too dumb\n"); exit(1); } t_li= tgetnum("li"); t_co= tgetnum("co"); (void) tgetstr("so", (tp= t_so, &tp)); (void) tgetstr("se", (tp= t_se, &tp)); (void) tgetstr("md", (tp= t_md, &tp)); (void) tgetstr("me", (tp= t_me, &tp)); save_ttyflags(); tty_raw(); } void putchr(int c) { putchar(c); } void putstr(char *s) { int c; while ((c= *s++) != 0) putchr(c); } void set_cursor(int row, int col) { tputs(tgoto(t_cm, col, row), 1, putchr); } int statusrow= STATUSROW; int stat_ktl= 1; int need_help= 1; void stat_start(int serious) /* Prepare for printing on a fresh status line, possibly highlighted. */ { set_cursor(statusrow++, 0); tputs(t_cd, 1, putchr); if (serious) tputs(t_so, 1, putchr); } void stat_end(int ktl) /* Closing bracket for stat_start. Sets "keystrokes to live" of message. */ { tputs(t_se, 1, putchr); stat_ktl= ktl; need_help= 1; } void stat_reset(void) /* Reset the statusline pointer and clear old messages if expired. */ { if (stat_ktl > 0 && --stat_ktl == 0) { statusrow= STATUSROW; need_help= 1; } if (need_help && statusrow < (24-2)) { if (statusrow > STATUSROW) stat_start(0); stat_start(0); putstr( "Type '+' or '-' to change, 'r' to read, '?' for more help, '!' for advice"); } statusrow= STATUSROW; need_help= 0; } void clear_screen(void) { set_cursor(0, 0); tputs(t_cd, 1, putchr); stat_ktl= 1; stat_reset(); } void reset_tty(void) /* Reset the tty to cooked mode. */ { restore_ttyflags(); set_cursor(statusrow, 0); tputs(t_cd, 1, putchr); } void *alloc(size_t n) { void *m; if ((m= malloc(n)) == nil) { reset_tty(); fatal(""); } return m; } #ifndef makedev /* Missing in sys/types.h */ #define minor(dev) (((dev) >> MINOR) & BYTE) #define major(dev) (((dev) >> MAJOR) & BYTE) #define makedev(major, minor) \ ((dev_t) (((major) << MAJOR) | ((minor) << MINOR))) #endif typedef enum parttype { DUNNO, SUBPART, PRIMARY, FLOPPY } parttype_t; typedef struct device { struct device *next, *prev; /* Circular dequeue. */ dev_t rdev; /* Device number (sorting only). */ char *name; /* E.g. /dev/c0d0 */ char *subname; /* E.g. /dev/c0d0:2 */ parttype_t parttype; } device_t; device_t *firstdev= nil, *curdev; void newdevice(char *name, int scanning) /* Add a device to the device list. If scanning is set then we are reading * /dev, so insert the device in device number order and make /dev/c0d0 current. */ { device_t *new, *nextdev, *prevdev; struct stat st; st.st_rdev= 0; if (scanning) { if (stat(name, &st) < 0 || !S_ISBLK(st.st_mode)) return; switch (major(st.st_rdev)) { case 0: case 1: case 15: return; case 2: if (minor(st.st_rdev) >= 4) return; break; default: if (minor(st.st_rdev) >= 0x80 || minor(st.st_rdev) % 5 != 0) return; } /* Interesting device found. */ } else { (void) stat(name, &st); } new= alloc(sizeof(*new)); new->rdev= st.st_rdev; new->name= alloc((strlen(name) + 1) * sizeof(new->name[0])); strcpy(new->name, name); new->subname= new->name; new->parttype= DUNNO; if (major(st.st_rdev) == major(DEV_FD0) && minor(st.st_rdev) < 112) { new->parttype= FLOPPY; } else if (st.st_rdev >= DEV_C0D0 && minor(st.st_rdev) < 128 && minor(st.st_rdev) % 5 == 0) { new->parttype= PRIMARY; } if (firstdev == nil) { firstdev= new; new->next= new->prev= new; curdev= firstdev; return; } nextdev= firstdev; while (new->rdev >= nextdev->rdev && (nextdev= nextdev->next) != firstdev) {} prevdev= nextdev->prev; new->next= nextdev; nextdev->prev= new; new->prev= prevdev; prevdev->next= new; if (new->rdev < firstdev->rdev) firstdev= new; if (new->rdev == DEV_C0D0) curdev= new; if (curdev->rdev != DEV_C0D0) curdev= firstdev; } void getdevices(void) /* Get all block devices from /dev that look interesting. */ { DIR *d; struct dirent *e; char name[5 + NAME_MAX + 1]; if ((d= opendir("/dev")) == nil) fatal("/dev"); while ((e= readdir(d)) != nil) { strcpy(name, "/dev/"); strcpy(name + 5, e->d_name); newdevice(name, 1); } (void) closedir(d); } /* One featureful master bootstrap. */ unsigned char bootstrap[] = { 0353,0001,0000,0061,0300,0216,0330,0216,0300,0372,0216,0320,0274,0000,0174,0373, 0275,0276,0007,0211,0346,0126,0277,0000,0006,0271,0000,0001,0374,0363,0245,0352, 0044,0006,0000,0000,0264,0002,0315,0026,0250,0010,0164,0033,0350,0071,0001,0174, 0007,0060,0344,0315,0026,0242,0205,0007,0054,0060,0074,0012,0163,0363,0120,0350, 0046,0001,0205,0007,0130,0353,0012,0240,0002,0006,0204,0300,0165,0003,0351,0147, 0000,0230,0262,0005,0366,0362,0262,0200,0000,0302,0210,0340,0120,0350,0234,0000, 0163,0003,0351,0147,0000,0130,0054,0001,0175,0003,0351,0141,0000,0276,0276,0175, 0211,0357,0271,0040,0000,0363,0245,0200,0301,0004,0211,0356,0215,0174,0020,0070, 0154,0004,0164,0016,0213,0135,0010,0053,0134,0010,0213,0135,0012,0033,0134,0012, 0163,0014,0212,0044,0206,0144,0020,0210,0044,0106,0071,0376,0162,0364,0211,0376, 0201,0376,0356,0007,0162,0326,0342,0322,0211,0356,0264,0020,0366,0344,0001,0306, 0200,0174,0004,0001,0162,0026,0353,0021,0204,0322,0175,0041,0211,0356,0200,0174, 0004,0000,0164,0013,0366,0004,0200,0164,0006,0350,0070,0000,0162,0053,0G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G��G���H��H��H��H��H��H��H��H��H�� H�� H�� H�� H�� H��H��H��H��H��H��H��H��H��H��H��H��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������303,0203, 0306,0020,0201,0376,0376,0007,0162,0346,0350,0215,0000,0211,0007,0376,0302,0204, 0322,0174,0023,0315,0021,0321,0340,0321,0340,0200,0344,0003,0070,0342,0167,0355, 0350,0011,0000,0162,0350,0303,0350,0003,0000,0162,0146,0303,0211,0356,0214,0134, 0010,0214,0134,0012,0277,0003,0000,0122,0006,0127,0264,0010,0315,0023,0137,0007, 0200,0341,0077,0376,0306,0210,0310,0366,0346,0211,0303,0213,0104,0010,0213,0124, 0012,0367,0363,0222,0210,0325,0366,0361,0060,0322,0321,0352,0321,0352,0010,0342, 0210,0321,0376,0301,0132,0210,0306,0273,0000,0174,0270,0001,0002,0315,0023,0163, 0020,0200,0374,0200,0164,0011,0117,0174,0006,0060,0344,0315,0023,0163,0270,0371, 0303,0201,0076,0376,0175,0125,0252,0165,0001,0303,0350,0013,0000,0243,0007,0353, 0005,0350,0004,0000,0227,0007,0353,0376,0136,0255,0126,0211,0306,0254,0204,0300, 0164,0011,0264,0016,0273,0001,0000,0315,0020,0353,0362,0303,0057,0144,0145,0166, 0057,0150,0144,0077,0010,0000,0015,0012,0000,0116,0157,0156,0145,0040,0141,0143, 0164,0151,0166,0145,0015,0012,0000,0122,0145,0141,0144,0040,0145,0162,0162,0157, 0162,0040,0000,0116,0157,0164,0040,0142,0157,0157,0164,0141,0142,0154,0145,0040, 0000,0000, }; int dirty= 0; unsigned char bootblock[SECTOR_SIZE]; struct part_entry table[1 + NR_PARTITIONS]; int existing[1 + NR_PARTITIONS]; unsigned long offset= 0, extbase= 0, extsize; int submerged= 0; char sort_index[1 + NR_PARTITIONS]; unsigned cylinders= 1, heads= 1, sectors= 1, secpcyl= 1; unsigned alt_cyls= 1, alt_heads= 1, alt_secs= 1; int precise= 0; int device= -1; unsigned long sortbase(struct part_entry *pe) { return pe->sysind == NO_PART ? -1 : pe->lowsec; } void sort(void) /* Let the sort_index array show the order partitions are sorted in. */ { int i, j; int idx[1 + NR_PARTITIONS]; for (i= 1; i <= NR_PARTITIONS; i++) idx[i]= i; for (i= 1; i <= NR_PARTITIONS; i++) { for (j= 1; j <= NR_PARTITIONS-1; j++) { int sj= idx[j], sj1= idx[j+1]; if (sortbase(&table[sj]) > sortbase(&table[sj1])) { idx[j]= sj1; idx[j+1]= sj; } } } for (i= 1; i <= NR_PARTITIONS; i++) sort_index[idx[i]]= i; } void dos2chs(unsigned char *dos, unsigned *chs) /* Extract cylinder, head and sector from the three bytes DOS uses to address * a sector. Note that bits 8 & 9 of the cylinder number come from bit 6 & 7 * of the sector byte. The sector number is rebased to count from 0. */ { chs[0]= ((dos[1] & 0xC0) << 2) | dos[2]; chs[1]= dos[0]; chs[2]= (dos[1] & 0x3F) - 1; } void abs2dos(unsigned char *dos, unsigned long pos) /* Translate a sector offset to three DOS bytes. */ { unsigned h, c, s; c= pos / secpcyl; h= (pos % secpcyl) / sectors; s= pos % sectors + 1; dos[0]= h; dos[1]= s | ((c >> 2) & 0xC0); dos[2]= c & 0xFF; } void recompute0(void) /* Recompute the partition size for the device after a geometry change. */ { if (device < 0) { cylinders= heads= sectors= 1; memset(table, 0, sizeof(table)); } else if (!precise && offset == 0) { table[0].lowsec= 0; table[0].size= (unsigned long) cylinders * heads * sectors; } table[0].sysind= device < 0 ? NO_PART : MINIX_PART; secpcyl= heads * sectors; } void guess_geometry(void) /* With a bit of work one can deduce the disk geometry from the partition * table. This may be necessary if the driver gets it wrong. (If partition * tables didn't have C/H/S numbers we would not care at all...) */ { int i, n; struct part_entry *pe; unsigned chs[3]; unsigned long sec; unsigned h, s; unsigned char HS[256][8]; /* Bit map off all possible H/S */ alt_cyls= alt_heads= alt_secs= 0; /* Initially all possible H/S combinations are possible. HS[h][0] * bit 0 is used to rule out a head value. */ for (h= 1; h <= 255; h++) { for (s= 0; s < 8; s++) HS[h][s]= 0xFF; } for (i= 0; i < 2*NR_PARTITIONS; i++) { pe= &(table+1)[i >> 1]; if (pe->sysind == NO_PART) continue; /* Get the end or start sector numbers (in that order). */ if ((i & 1) == 0) { dos2chs(&pe->last_head, chs); sec= pe->lowsec + pe->size - 1; } else { dos2chs(&pe->start_head, chs); sec= pe->lowsec; } if (chs[0] >= alt_cyls) alt_cyls= chs[0]+1; /* Which H/S combinations can be ruled out? */ for (h= 1; h <= 255; h++) { if (HS[h][0] == 0) continue; n = 0; for (s= 1; s <= 63; s++) { if ((chs[0] * h + chs[1]) * s + chs[2] != sec) { HS[h][s/8] &= ~(1 << (s%8)); } if (HS[h][s/8] & (1 << (s%8))) n++; } if (n == 0) HS[h][0]= 0; } } /* See if only one remains. */ i= 0; for (h= 1; h <= 255; h++) { if (HS[h][0] == 0) continue; for (s= 1; s <= 63; s++) { if (HS[h][s/8] & (1 << (s%8))) { i++; alt_heads= h; alt_secs= s; } } } /* Forget it if more than one choice... */ if (i > 1) alt_cyls= alt_heads= alt_secs= 0; } void geometry(void) /* Find out the geometry of the device by querying the driver, or by looking * at the partition table. These numbers are crosschecked to make sure that * the geometry is correct. Master bootstraps other than the Minix one use * the CHS numbers in the partition table to load the bootstrap of the active * partition. */ { struct stat dst; int err= 0; struct partition geometry; if (submerged) { /* Geometry already known. */ sort(); return; } precise= 0; cylinders= 0; recompute0(); if (device < 0) return; /* Try to guess the geometry from the partition table. */ guess_geometry(); /* Try to get the geometry from the driver. */ (void) fstat(device, &dst); if (S_ISBLK(dst.st_mode) || S_ISCHR(dst.st_mode)) { /* Try to get the drive's geometry from the driver. */ if (ioctl(device, DIOCGETP, &geometry) < 0) err= errno; else { table[0].lowsec= div64u(geometry.base, SECTOR_SIZE); table[0].size= div64u(geometry.size, SECTOR_SIZE); cylinders= geometry.cylinders; heads= geometry.heads; sectors= geometry.sectors; precise= 1; } } else { err= ENODEV; } if (err != 0) { /* Getting the geometry from the driver failed, so use the * alternate geometry. */ if (alt_heads == 0) { alt_cyls= table[0].size / (64 * 32); alt_heads= 64; alt_secs= 32; } cylinders= alt_cyls; heads= alt_heads; sectors= alt_secs; stat_start(1); printf("Failure to get the geometry of %s: %s", curdev->name, errno == ENOTTY ? "No driver support" : strerror(err)); stat_end(5); stat_start(0); printf("The geometry has been guessed as %ux%ux%u", cylinders, heads, sectors); stat_end(5); } else { if (alt_heads == 0) { alt_cyls= cylinders; alt_heads= heads; alt_secs= sectors; } if (heads != alt_heads || sectors != alt_secs) { stat_start(1); printf("WARNING:"); stat_end(10); stat_start(0); printf( "The %ux%ux%u geometry obtained from the device driver does not match", cylinders, heads, sectors); stat_end(10); stat_start(0); printf( "the %ux%ux%u geometry implied by the partition table. Hit 'X' to switch", alt_cyls, alt_heads, alt_secs); stat_end(10); stat_start(0); printf( "between the two geometries to see what is best. Note that the geometry"); stat_end(10); stat_start(0); printf( "must be correct when the table is written or the system may not boot!"); stat_end(10); } } /* Show the base and size of the device instead of the whole drive. * This makes sense for subpartitioning primary partitions. */ if (precise && ioctl(device, DIOCGETP, &geometry) >= 0) { table[0].lowsec= div64u(geometry.base, SECTOR_SIZE); table[0].size= div64u(geometry.size, SECTOR_SIZE); } else { precise= 0; } recompute0(); sort(); } typedef struct indicators { /* Partition type to partition name. */ unsigned char ind; char name[10]; } indicators_t; indicators_t ind_table[]= { { 0x00, "None" }, { 0x01, "FAT-12" }, { 0x02, "XENIX /" }, { 0x03, "XENIX usr" }, { 0x04, "FAT-16" }, { 0x05, "EXTENDED" }, { 0x06, "FAT-16" }, { 0x07, "HPFS/NTFS" }, { 0x08, "AIX" }, { 0x09, "COHERENT" }, { 0x0A, "OS/2" }, { 0x0B, "FAT-32" }, { 0x0C, "FAT?" }, { 0x0E, "FAT?" }, { 0x0F, "EXTENDED" }, { 0x10, "OPUS" }, { 0x40, "VENIX286" }, { 0x42, "W2000 Dyn" }, { 0x52, "MICROPORT" }, { 0x63, "386/IX" }, { 0x64, "NOVELL286" }, { 0x65, "NOVELL386" }, { 0x75, "PC/IX" }, { 0x80, "MINIX-OLD" }, { 0x81, "MINIX" }, { 0x82, "LINUXswap" }, { 0x83, "LINUX" }, { 0x93, "AMOEBA" }, { 0x94, "AMOEBAbad" }, { 0xA5, "386BSD" }, { 0xB7, "BSDI" }, { 0xB8, "BSDI swap" }, { 0xC7, "SYRINX" }, { 0xDB, "CPM" }, { 0xFF, "BADBLOCKS" }, }; char *typ2txt(int ind) /* Translate a numeric partition indicator for human eyes. */ { indicators_t *pind; for (pind= ind_table; pind < arraylimit(ind_table); pind++) { if (pind->ind == ind) return pind->name; } return ""; } int round_sysind(int ind, int delta) /* Find the next known partition type starting with ind in direction delta. */ { indicators_t *pind; ind= (ind + delta) & 0xFF; if (delta < 0) { for (pind= arraylimit(ind_table)-1; pind->ind > ind; pind--) {} } else { for (pind= ind_table; pind->ind < ind; pind++) {} } return pind->ind; } /* Objects on the screen, either simple pieces of the text or the cylinder * number of the start of partition three. */ typedef enum objtype { O_INFO, O_TEXT, O_DEV, O_SUB, O_TYPTXT, O_SORT, O_NUM, O_TYPHEX, O_CYL, O_HEAD, O_SEC, O_SCYL, O_SHEAD, O_SSEC, O_LCYL, O_LHEAD, O_LSEC, O_BASE, O_SIZE, O_KB } objtype_t; #define rjust(type) ((type) >= O_TYPHEX) #define computed(type) ((type) >= O_TYPTXT) typedef struct object { struct object *next; objtype_t type; /* Text field, cylinder number, etc. */ char flags; /* Modifiable? */ char row; char col; char len; struct part_entry *entry; /* What does the object refer to? */ char *text; char value[20]; /* Value when printed. */ } object_t; #define OF_MOD 0x01 /* Object value is modifiable. */ #define OF_ODD 0x02 /* It has a somewhat odd value. */ #define OF_BAD 0x04 /* Its value is no good at all. */ /* Events: (Keypress events are the value of the key pressed.) */ #define E_ENTER (-1) /* Cursor moves onto object. */ #define E_LEAVE (-2) /* Cursor leaves object. */ #define E_WRITE (-3) /* Write, but not by typing 'w'. */ /* The O_SIZE objects have a dual identity. */ enum howend { SIZE, LAST } howend= SIZE; object_t *world= nil; object_t *curobj= nil; object_t *newobject(objtype_t type, int flags, int row, int col, int len) /* Make a new object given a type, flags, position and length on the screen. */ { object_t *new; object_t **aop= &world; new= alloc(sizeof(*new)); new->type= type; new->flags= flags; new->row= row; new->col= col; new->len= len; new->entry= nil; new->text= ""; new->value[0]= 0; new->next= *aop; *aop= new; return new; } unsigned long entry2base(struct part_entry *pe) /* Return the base sector of the partition if defined. */ { return pe->sysind == NO_PART ? 0 : pe->lowsec; } unsigned long entry2last(struct part_entry *pe) { return pe->sysind == NO_PART ? -1 : pe->lowsec + pe->size - 1; } unsigned long entry2size(struct part_entry *pe) { return pe->sysind == NO_PART ? 0 : pe->size; } int overlap(unsigned long sec) /* See if sec is part of another partition. */ { struct part_entry *pe; for (pe= table + 1; pe <= table + NR_PARTITIONS; pe++) { if (pe->sysind == NO_PART) continue; if (pe->lowsec < sec && sec < pe->lowsec + pe->size) return 1; } return 0; } int aligned(unsigned long sec, unsigned unit) /* True if sec is aligned to unit or if it is no problem if it is unaligned. */ { return (offset != 0 && extbase == 0) || (sec % unit == 0); } void print(object_t *op) /* Print an object's value if it changed. */ { struct part_entry *pe= op->entry; int n; unsigned long t; char *name; int oldflags; char oldvalue[20]; /* Remember the old flags and value. */ oldflags= op->flags; strcpy(oldvalue, op->value); op->flags&= ~(OF_ODD | OF_BAD); switch (op->type) { case O_INFO: { /* Current field. */ static struct field { int type; char *name; } fields[]= { { O_DEV, "Select device" }, { O_NUM, "Active flag" }, { O_TYPHEX, "Hex partition type" }, { O_TYPTXT, "Partition type" }, { O_SCYL, "Start cylinder" }, { O_SHEAD, "Start head" }, { O_SSEC, "Start sector" }, { O_CYL, "Number of cylinders" }, { O_HEAD, "Number of heads" }, { O_SEC, "Sectors per track" }, { O_LCYL, "Last cylinder" }, { O_LHEAD, "Last head" }, { O_LSEC, "Last sector" }, { O_BASE, "Base sector" }, { O_SIZE, "Size in sectors" }, { O_KB, "Size in kilobytes" }, { -1, "?" }, }; struct field *fp= fields; while (fp->type >= 0 && fp->type != curobj->type) fp++; strcpy(op->value, fp->name); op->flags|= OF_ODD; break; } case O_TEXT: /* Simple text field. */ strcpy(op->value, op->text); break; case O_DEV: case O_SUB: /* Name of currently edited device. */ name= op->type == O_DEV ? curdev->name : offset == 0 ? "" : curdev->subname; if ((n= strlen(name)) < op->len) n= op->len; strcpy(op->value, name + (n - op->len)); if (device < 0 && op->type == O_DEV) op->flags|= OF_BAD; break; case O_NUM: /* Position and active flag. */ sprintf(op->value, "%d%c", (int) (pe - table - 1), pe->bootind & ACTIVE_FLAG ? '*' : ' '); break; case O_SORT: /* Position if the driver sorts the table. */ sprintf(op->value, "%s%d", curdev->parttype >= PRIMARY ? "p" : curdev->parttype == SUBPART ? "s" : "", (curdev->parttype == SUBPART || curdev->parttype == FLOPPY ? pe - table : sort_index[pe - table]) - 1); break; case O_TYPHEX: /* Hex partition type indicator. */ sprintf(op->value, "%02X", pe->sysind); break; case O_TYPTXT: /* Ascii partition type indicator. */ strcpy(op->value, typ2txt(pe->sysind)); break; case O_SCYL: /* Partition's start cylinder. */ sprintf(op->value, "%lu", entry2base(pe) / secpcyl); break; case O_SHEAD: /* Start head. */ t= entry2base(pe); sprintf(op->value, "%lu", t % secpcyl / sectors); if (!aligned(t, secpcyl) && t != table[0].lowsec + sectors) op->flags|= OF_ODD; break; case O_SSEC: /* Start sector. */ t= entry2base(pe); sprintf(op->value, "%lu", t % sectors); if (!aligned(t, sectors)) op->flags|= OF_ODD; break; case O_CYL: /* Number of cylinders. */ sprintf(op->value, "%u", cylinders); break; case O_HEAD: /* Number of heads. */ sprintf(op->value, "%u", heads); break; case O_SEC: /* Number of sectors per track. */ sprintf(op->value, "%u", sectors); break; case O_LCYL: /* Partition's last cylinder. */ t= entry2last(pe); sprintf(op->value, "%lu", t == -1 ? 0 : t / secpcyl); break; case O_LHEAD: /* Partition's last head. */ t= entry2last(pe); sprintf(op->value, "%lu", t == -1 ? 0 : t % secpcyl / sectors); if (!aligned(t + 1, secpcyl)) op->flags|= OF_ODD; break; case O_LSEC: /* Partition's last sector. */ t= entry2last(pe); sprintf(op->value, t == -1 ? "-1" : "%lu", t % sectors); if (!aligned(t + 1, sectors)) op->flags|= OF_ODD; break; case O_BASE: /* Partition's base sector. */ sprintf(op->value, "%lu", entry2base(pe)); if (pe->sysind != NO_PART && pe != &table[0] && (pe->lowsec <= table[0].lowsec || overlap(pe->lowsec))) op->flags|= OF_BAD; break; case O_SIZE: /* Size of partitition in sectors. */ t= howend == SIZE ? entry2size(pe) : entry2last(pe); sprintf(op->value, "%lu", pe->sysind == NO_PART ? 0 : t); if (pe->sysind != NO_PART && (pe->size == 0 || pe->lowsec + pe->size > table[0].lowsec + table[0].size || overlap(pe->lowsec + pe->size))) op->flags|= OF_BAD; break; case O_KB: /* Size of partitition in kilobytes. */ sprintf(op->value, "%lu", entry2size(pe) / 2); break; default: sprintf(op->value, "?? %d ??", op->type); } if (device < 0 && computed(op->type)) strcpy(op->value, "?"); /* If a value overflows the print field then show a blank * reverse video field. */ if ((n= strlen(op->value)) > op->len) { n= 0; op->flags|= OF_BAD; } /* Right or left justified? */ if (rjust(op->type)) { memmove(op->value + (op->len - n), op->value, n); memset(op->value, ' ', op->len - n); } else { memset(op->value + n, ' ', op->len - n); } op->value[op->len]= 0; if ((op->flags & (OF_ODD | OF_BAD)) == (oldflags & (OF_ODD | OF_BAD)) && strcmp(op->value, oldvalue) == 0) { /* The value did not change. */ return; } set_cursor(op->row, rjust(op->type) ? op->col - (op->len-1) : op->col); if (op->flags & OF_BAD) tputs(t_so, 1, putchr); else if (op->flags & OF_ODD) tputs(t_md, 1, putchr); putstr(op->value); if (op->flags & OF_BAD) tputs(t_se, 1, putchr); else if (op->flags & OF_ODD) tputs(t_me, 1, putchr); } void display(void) /* Repaint all objects that changed. */ { object_t *op; for (op= world; op != nil; op= op->next) print(op); } int typing; /* Set if a digit has been typed to set a value. */ int magic; /* Changes when using the magic key. */ void event(int ev, object_t *op); void m_redraw(int ev, object_t *op) /* Redraw the screen. */ { object_t *op2; if (ev != ctrl('L')) return; clear_screen(); for (op2= world; op2 != nil; op2= op2->next) op2->value[0]= 0; } void m_toggle(int ev, object_t *op) /* Toggle between the driver and alternate geometry. */ { unsigned t; if (ev != 'X') return; if (alt_cyls == cylinders && alt_heads == heads && alt_secs == sectors) return; t= cylinders; cylinders= alt_cyls; alt_cyls= t; t= heads; heads= alt_heads; alt_heads= t; t= sectors; sectors= alt_secs; alt_secs= t; dirty= 1; recompute0(); } char size_last[]= "Size"; void m_orientation(int ev, object_t *op) { if (ev != ' ') return; switch (howend) { case SIZE: howend= LAST; strcpy(size_last, "Last"); break; case LAST: howend= SIZE; strcpy(size_last, "Size"); } } void m_move(int ev, object_t *op) /* Move to the nearest modifiably object in the intended direction. Objects * on the same row or column are really near. */ { object_t *near, *op2; unsigned dist, d2, dr, dc; if (ev != 'h' && ev != 'j' && ev != 'k' && ev != 'l' && ev != 'H') return; if (device < 0) { /* No device open? Then try to read first. */ event('r', op); if (device < 0) return; } near= op; dist= -1; for (op2= world; op2 != nil; op2= op2->next) { if (op2 == op || !(op2->flags & OF_MOD)) continue; dr= abs(op2->row - op->row); dc= abs(op2->col - op->col); d2= 25*dr*dr + dc*dc; if (op2->row != op->row && op2->col != op->col) d2+= 1000; switch (ev) { case 'h': /* Left */ if (op2->col >= op->col) d2= -1; break; case 'j': /* Down */ if (op2->row <= op->row) d2= -1; break; case 'k': /* Up */ if (op2->row >= op->row) d2= -1; break; case 'l': /* Right */ if (op2->col <= op->col) d2= -1; break; case 'H': /* Home */ if (op2->type == O_DEV) d2= 0; } if (d2 < dist) { near= op2; dist= d2; } } if (near != op) event(E_LEAVE, op); event(E_ENTER, near); } void m_updown(int ev, object_t *op) /* Move a partition table entry up or down. */ { int i, j; struct part_entry tmp; int tmpx; if (ev != ctrl('K') && ev != ctrl('J')) return; if (op->entry == nil) return; i= op->entry - table; if (ev == ctrl('K')) { if (i <= 1) return; j= i-1; } else { if (i >= NR_PARTITIONS) return; j= i+1; } tmp= table[i]; table[i]= table[j]; table[j]= tmp; tmpx= existing[i]; existing[i]= existing[j]; existing[j]= tmpx; sort(); dirty= 1; event(ev == ctrl('K') ? 'k' : 'j', op); } void m_enter(int ev, object_t *op) /* We've moved onto this object. */ { if (ev != E_ENTER && ev != ' ' && ev != '<' && ev != '>' && ev != 'X') return; curobj= op; typing= 0; magic= 0; } void m_leave(int ev, object_t *op) /* About to leave this object. */ { if (ev != E_LEAVE) return; } int within(unsigned *var, unsigned low, unsigned value, unsigned high) /* Only set *var to value if it looks reasonable. */ { if (low <= value && value <= high) { *var= value; return 1; } else return 0; } int lwithin(unsigned long *var, unsigned long low, unsigned long value, unsigned long high) { if (low <= value && value <= high) { *var= value; return 1; } else return 0; } int nextdevice(object_t *op, int delta) /* Select the next or previous device from the device list. */ { dev_t rdev; if (offset != 0) return 0; if (dirty) event(E_WRITE, op); if (dirty) return 0; if (device >= 0) { (void) close(device); device= -1; } recompute0(); rdev= curdev->rdev; if (delta < 0) { do curdev= curdev->prev; while (delta < -1 && major(curdev->rdev) == major(rdev) && curdev->rdev < rdev); } else { do curdev= curdev->next; while (delta > 1 && major(curdev->rdev) == major(rdev) && curdev->rdev > rdev); } return 1; } void check_ind(struct part_entry *pe) /* If there are no other partitions then make this new one active. */ { struct part_entry *pe2; if (pe->sysind != NO_PART) return; for (pe2= table + 1; pe2 < table + 1 + NR_PARTITIONS; pe2++) if (pe2->sysind != NO_PART || pe2->bootind & ACTIVE_FLAG) break; if (pe2 == table + 1 + NR_PARTITIONS) pe->bootind= ACTIVE_FLAG; } int check_existing(struct part_entry *pe) /* Check and if not ask if an existing partition may be modified. */ { static int expert= 0; int c; if (expert || pe == nil || !existing[pe - table]) return 1; stat_start(1); putstr("Do you wish to modify existing partitions? (y/n) "); fflush(stdout); while ((c= getchar()) != 'y' && c != 'n') {} putchr(c); stat_end(3); return (expert= (c == 'y')); } void m_modify(int ev, object_t *op) /* Increment, decrement, set, or toggle the value of an object, using * arithmetic tricks the author doesn't understand either. */ { object_t *op2; struct part_entry *pe= op->entry; int mul, delta; unsigned level= 1; unsigned long surplus; int radix= op->type == O_TYPHEX ? 0x10 : 10; unsigned long t; if (device < 0 && op->type != O_DEV) return; switch (ev) { case '-': mul= radix; delta= -1; typing= 0; break; case '+': mul= radix; delta= 1; typing= 0; break; case '\b': if (!typing) return; mul= 1; delta= 0; break; case '\r': typing= 0; return; default: if ('0' <= ev && ev <= '9') delta= ev - '0'; else if (radix == 0x10 && 'a' <= ev && ev <= 'f') delta= ev - 'a' + 10; else if (radix == 0x10 && 'A' <= ev && ev <= 'F') delta= ev - 'A' + 10; else return; mul= typing ? radix*radix : 0; typing= 1; } magic= 0; if (!check_existing(pe)) return; switch (op->type) { case O_DEV: if (ev != '-' && ev != '+') return; if (!nextdevice(op, delta)) return; break; case O_CYL: if (!within(&cylinders, 1, cylinders * mul / radix + delta, 1024)) return; recompute0(); break; case O_HEAD: if (!within(&heads, 1, heads * mul / radix + delta, 255)) return; recompute0(); break; case O_SEC: if (!within(§ors, 1, sectors * mul / radix + delta, 63)) return; recompute0(); break; case O_NUM: if (ev != '-' && ev != '+') return; for (op2= world; op2 != nil; op2= op2->next) { if (op2->type == O_NUM && ev == '+') op2->entry->bootind= 0; } op->entry->bootind= ev == '+' ? ACTIVE_FLAG : 0; break; case O_TYPHEX: check_ind(pe); pe->sysind= pe->sysind * mul / radix + delta; break; case O_TYPTXT: if (ev != '-' && ev != '+') return; check_ind(pe); pe->sysind= round_sysind(pe->sysind, delta); break; case O_SCYL: level= heads; case O_SHEAD: level*= sectors; case O_SSEC: if (op->type != O_SCYL && ev != '-' && ev != '+') return; case O_BASE: if (pe->sysind == NO_PART) memset(pe, 0, sizeof(*pe)); t= pe->lowsec; surplus= t % level; if (!lwithin(&t, 0L, (t / level * mul / radix + delta) * level + surplus, MAXSIZE)) return; if (howend == LAST || op->type != O_BASE) pe->size-= t - pe->lowsec; pe->lowsec= t; check_ind(pe); if (pe->sysind == NO_PART) pe->sysind= MINIX_PART; break; case O_LCYL: level= heads; case O_LHEAD: level*= sectors; case O_LSEC: if (op->type != O_LCYL && ev != '-' && ev != '+') return; if (pe->sysind == NO_PART) memset(pe, 0, sizeof(*pe)); t= pe->lowsec + pe->size - 1 + level; surplus= t % level - mul / radix * level; if (!lwithin(&t, 0L, (t / level * mul / radix + delta) * level + surplus, MAXSIZE)) return; pe->size= t - pe->lowsec + 1; check_ind(pe); if (pe->sysind == NO_PART) pe->sysind= MINIX_PART; break; case O_KB: level= 2; if (mul == 0) pe->size= 0; /* new value, no surplus */ case O_SIZE: if (pe->sysind == NO_PART) { if (op->type == O_KB || howend == SIZE) { /* First let loose magic to set the base. */ event('m', op); magic= 0; pe->size= 0; event(ev, op); return; } memset(pe, 0, sizeof(*pe)); } t= (op->type == O_KB || howend == SIZE) ? pe->size : pe->lowsec + pe->size - 1; surplus= t % level; if (!lwithin(&t, 0L, (t / level * mul / radix + delta) * level + surplus, MAXSIZE)) return; pe->size= (op->type == O_KB || howend == SIZE) ? t : t - pe->lowsec + 1; check_ind(pe); if (pe->sysind == NO_PART) pe->sysind= MINIX_PART; break; default: return; } /* The order among the entries may have changed. */ sort(); dirty= 1; } unsigned long spell[3 + 4 * (1+NR_PARTITIONS)]; int nspells; objtype_t touching; void newspell(unsigned long charm) /* Add a new spell, descending order for the base, ascending for the size. */ { int i, j; if (charm - table[0].lowsec > table[0].size) return; for (i= 0; i < nspells; i++) { if (charm == spell[i]) return; /* duplicate */ if (touching == O_BASE) { if (charm == table[0].lowsec + table[0].size) return; if ((spell[0] - charm) < (spell[0] - spell[i])) break; } else { if (charm == table[0].lowsec) return; if ((charm - spell[0]) < (spell[i] - spell[0])) break; } } for (j= ++nspells; j > i; j--) spell[j]= spell[j-1]; spell[i]= charm; } void m_magic(int ev, object_t *op) /* Apply magic onto a base or size number. */ { struct part_entry *pe= op->entry, *pe2; int rough= (offset != 0 && extbase == 0); if (ev != 'm' || device < 0) return; typing= 0; if (!check_existing(pe)) return; if (magic == 0) { /* See what magic we can let loose on this value. */ nspells= 1; /* First spell, the current value. */ switch (op->type) { case O_SCYL: case O_SHEAD: /* Start of partition. */ case O_SSEC: case O_BASE: touching= O_BASE; spell[0]= pe->lowsec; break; case O_LCYL: case O_LHEAD: case O_LSEC: /* End of partition. */ case O_KB: case O_SIZE: touching= O_SIZE; spell[0]= pe->lowsec + pe->size; break; default: return; } if (pe->sysind == NO_PART) { memset(pe, 0, sizeof(*pe)); check_ind(pe); pe->sysind= MINIX_PART; spell[0]= 0; if (touching == O_SIZE) { /* First let loose magic on the base. */ object_t *op2; for (op2= world; op2 != nil; op2= op2->next) { if (op2->row == op->row && op2->type == O_BASE) { event('m', op2); } } magic= 0; event('m', op); return; } } /* Avoid the first sector on the device. */ if (spell[0] == table[0].lowsec) newspell(spell[0] + 1); /* Further interesting values are the the bases of other * partitions or their ends. */ for (pe2= table; pe2 < table + 1 + NR_PARTITIONS; pe2++) { if (pe2 == pe || pe2->sysind == NO_PART) continue; if (pe2->lowsec == table[0].lowsec) newspell(table[0].lowsec + 1); else newspell(pe2->lowsec); newspell(pe2->lowsec + pe2->size); if (touching == O_BASE && howend == SIZE) { newspell(pe2->lowsec - pe->size); newspell(pe2->lowsec + pe2->size - pe->size); } if (pe2->lowsec % sectors != 0) rough= 1; } /* Present values rounded up to the next cylinder unless * the table is already a mess. Use "start + 1 track" instead * of "start + 1 cylinder". Also add the end of the last * cylinder. */ if (!rough) { unsigned long n= spell[0]; if (n == table[0].lowsec) n++; n= (n + sectors - 1) / sectors * sectors; if (n != table[0].lowsec + sectors) n= (n + secpcyl - 1) / secpcyl * secpcyl; newspell(n); if (touching == O_SIZE) newspell(table[0].size / secpcyl * secpcyl); } } /* Magic has been applied, a spell needs to be chosen. */ if (++magic == nspells) magic= 0; if (touching == O_BASE) { if (howend == LAST) pe->size-= spell[magic] - pe->lowsec; pe->lowsec= spell[magic]; } else pe->size= spell[magic] - pe->lowsec; /* The order among the entries may have changed. */ sort(); dirty= 1; } typedef struct diving { struct diving *up; struct part_entry old0; char *oldsubname; parttype_t oldparttype; unsigned long oldoffset; unsigned long oldextbase; } diving_t; diving_t *diving= nil; void m_in(int ev, object_t *op) /* Go down into a primary or extended partition. */ { diving_t *newdiv; struct part_entry *pe= op->entry, ext; int n; if (ev != '>' || device < 0 || pe == nil || pe == &table[0] || (!(pe->sysind == MINIX_PART && offset == 0) && !ext_part(pe->sysind)) || pe->size == 0) return; ext= *pe; if (extbase != 0) ext.size= extbase + extsize - ext.lowsec; if (dirty) event(E_WRITE, op); if (dirty) return; if (device >= 0) { close(device); device= -1; } newdiv= alloc(sizeof(*newdiv)); newdiv->old0= table[0]; newdiv->oldsubname= curdev->subname; newdiv->oldparttype= curdev->parttype; newdiv->oldoffset= offset; newdiv->oldextbase= extbase; newdiv->up= diving; diving= newdiv; table[0]= ext; n= strlen(diving->oldsubname); curdev->subname= alloc((n + 3) * sizeof(curdev->subname[0])); strcpy(curdev->subname, diving->oldsubname); curdev->subname[n++]= ':'; curdev->subname[n++]= '0' + (pe - table - 1); curdev->subname[n]= 0; curdev->parttype= curdev->parttype == PRIMARY ? SUBPART : DUNNO; offset= ext.lowsec; if (ext_part(ext.sysind) && extbase == 0) { extbase= ext.lowsec; extsize= ext.size; curdev->parttype= DUNNO; } submerged= 1; event('r', op); } void m_out(int ev, object_t *op) /* Go up from an extended or subpartition table to its enclosing. */ { diving_t *olddiv; if (ev != '<' || diving == nil) return; if (dirty) event(E_WRITE, op); if (dirty) return; if (device >= 0) { close(device); device= -1; } olddiv= diving; diving= olddiv->up; table[0]= olddiv->old0; free(curdev->subname); curdev->subname= olddiv->oldsubname; curdev->parttype= olddiv->oldparttype; offset= olddiv->oldoffset; extbase= olddiv->oldextbase; free(olddiv); event('r', op); if (diving == nil) submerged= 0; /* We surfaced. */ } void installboot(unsigned char *bootblock, char *masterboot) /* Install code from a master bootstrap into a boot block. */ { FILE *mfp; struct exec hdr; int n; char *err; if ((mfp= fopen(masterboot, "r")) == nil) { err= strerror(errno); goto m_err; } n= fread(&hdr, sizeof(char), A_MINHDR, mfp); if (ferror(mfp)) { err= strerror(errno); fclose(mfp); goto m_err; } if (n < A_MINHDR || BADMAG(hdr) || hdr.a_cpu != A_I8086) { err= "Not an 8086 executable"; fclose(mfp); goto m_err; } if (hdr.a_text + hdr.a_data > PART_TABLE_OFF) { err= "Does not fit in a boot sector"; fclose(mfp); goto m_err; } fseek(mfp, hdr.a_hdrlen, 0); fread(bootblock, sizeof(char), (size_t) (hdr.a_text + hdr.a_data), mfp); if (ferror(mfp)) { err= strerror(errno); fclose(mfp); goto m_err; } fclose(mfp); /* Bootstrap installed. */ return; m_err: stat_start(1); printf("%s: %s", masterboot, err); stat_end(5); } ssize_t boot_readwrite(int rw) /* Read (0) or write (1) the boot sector. */ { u64_t off64 = mul64u(offset, SECTOR_SIZE); int r; #if __minix_vmd /* Minix-vmd has a 64 bit seek. */ if (fcntl(device, F_SEEK, off64) < 0) return -1; #else /* Minix has to gross things with the partition base. */ struct partition geom0, geom_seek; if (offset >= (LONG_MAX / SECTOR_SIZE - 1)) { /* Move partition base. */ if (ioctl(device, DIOCGETP, &geom0) < 0) return -1; geom_seek.base = add64(geom0.base, off64); geom_seek.size = cvu64(cmp64(add64u(off64, SECTOR_SIZE), geom0.size) <= 0 ? BLOCK_SIZE : 0); sync(); if (ioctl(device, DIOCSETP, &geom_seek) < 0) return -1; if (lseek(device, (off_t) 0, SEEK_SET) == -1) return -1; } else { /* Can reach this point normally. */ if (lseek(device, (off_t) offset * SECTOR_SIZE, SEEK_SET) == -1) return -1; } #endif switch (rw) { case 0: r= read(device, bootblock, SECTOR_SIZE); break; case 1: r= write(device, bootblock, SECTOR_SIZE); break; } #if !__minix_vmd if (offset >= (LONG_MAX / SECTOR_SIZE - 1)) { /* Restore partition base and size. */ sync(); if (ioctl(device, DIOCSETP, &geom0) < 0) return -1; } #endif return r; } void m_read(int ev, object_t *op) /* Read the partition table from the current device. */ { int i, mode, n; struct part_entry *pe; if (ev != 'r' || device >= 0) return; /* Open() may cause kernel messages: */ stat_start(0); fflush(stdout); if (((device= open(curdev->name, mode= O_RDWR, 0666)) < 0 && (errno != EACCES || (device= open(curdev->name, mode= O_RDONLY)) < 0)) ) { stat_start(1); printf("%s: %s", curdev->name, strerror(errno)); stat_end(5); if (device >= 0) { close(device); device= -1; } return; } /* Assume up to five lines of kernel messages. */ statusrow+= 5-1; stat_end(5); if (mode == O_RDONLY) { stat_start(1); printf("%s: Readonly", curdev->name); stat_end(5); } memset(bootblock, 0, sizeof(bootblock)); n= boot_readwrite(0); if (n <= 0) stat_start(1); if (n < 0) { printf("%s: %s", curdev->name, strerror(errno)); close(device); device= -1; } else if (n < SECTOR_SIZE) printf("%s: Unexpected EOF", curdev->subname); if (n <= 0) stat_end(5); if (n < SECTOR_SIZE) n= SECTOR_SIZE; memcpy(table+1, bootblock+PART_TABLE_OFF, NR_PARTITIONS * sizeof(table[1])); for (i= 1; i <= NR_PARTITIONS; i++) { if ((table[i].bootind & ~ACTIVE_FLAG) != 0) break; } if (i <= NR_PARTITIONS || bootblock[510] != 0x55 || bootblock[511] != 0xAA) { /* Invalid boot block, install bootstrap, wipe partition table. */ memset(bootblock, 0, sizeof(bootblock)); installboot(bootblock, MASTERBOOT); memset(table+1, 0, NR_PARTITIONS * sizeof(table[1])); stat_start(1); printf("%s: Invalid partition table (reset)", curdev->subname); stat_end(5); } /* Fix an extended partition table up to something mere mortals can * understand. Record already defined partitions. */ for (i= 1; i <= NR_PARTITIONS; i++) { pe= &table[i]; if (extbase != 0 && pe->sysind != NO_PART) pe->lowsec+= ext_part(pe->sysind) ? extbase : offset; existing[i]= pe->sysind != NO_PART; } geometry(); dirty= 0; /* Warn about grave dangers ahead. */ if (extbase != 0) { stat_start(1); printf("Warning: You are in an extended partition."); stat_end(5); } } void m_write(int ev, object_t *op) /* Write the partition table back if modified. */ { int c; struct part_entry new_table[NR_PARTITIONS], *pe; if (ev != 'w' && ev != E_WRITE) return; if (device < 0) { dirty= 0; return; } if (!dirty) { if (ev == 'w') { stat_start(1); printf("%s is not changed, or has already been written", curdev->subname); stat_end(2); } return; } if (bootblock[510] != 0x55 || bootblock[511] != 0xAA) { /* Invalid boot block, warn user. */ stat_start(1); printf("Warning: About to write a new table on %s", curdev->subname); stat_end(5); } if (extbase != 0) { /* Will this stop the luser? Probably not... */ stat_start(1); printf("You have changed an extended partition. Bad Idea."); stat_end(5); } stat_start(1); putstr("Save partition table? (y/n) "); fflush(stdout); while ((c= getchar()) != 'y' && c != 'n' && c != ctrl('?')) {} if (c == ctrl('?')) putstr("DEL"); else putchr(c); stat_end(5); if (c == 'n' && ev == E_WRITE) dirty= 0; if (c != 'y') return; memcpy(new_table, table+1, NR_PARTITIONS * sizeof(table[1])); for (pe= new_table; pe < new_table + NR_PARTITIONS; pe++) { if (pe->sysind == NO_PART) { memset(pe, 0, sizeof(*pe)); } else { abs2dos(&pe->start_head, pe->lowsec); abs2dos(&pe->last_head, pe->lowsec + pe->size - 1); /* Fear and loathing time: */ if (extbase != 0) pe->lowsec-= ext_part(pe->sysind) ? extbase : offset; } } memcpy(bootblock+PART_TABLE_OFF, new_table, sizeof(new_table)); bootblock[510]= 0x55; bootblock[511]= 0xAA; if (boot_readwrite(1) < 0) { stat_start(1); printf("%s: %s", curdev->name, strerror(errno)); stat_end(5); return; } dirty= 0; } void m_shell(int ev, object_t *op) /* Shell escape, to do calculations for instance. */ { int r, pid, status; void (*sigint)(int), (*sigquit)(int), (*sigterm)(int); if (ev != 's') return; reset_tty(); fflush(stdout); switch (pid= fork()) { case -1: stat_start(1); printf("can't fork: %s\n", strerror(errno)); stat_end(3); break; case 0: if (device >= 0) (void) close(device); execl("/bin/sh", "sh", (char *) nil); r= errno; stat_start(1); printf("/bin/sh: %s\n", strerror(errno)); stat_end(3); exit(127); } sigint= signal(SIGINT, SIG_IGN); sigquit= signal(SIGQUIT, SIG_IGN); sigterm= signal(SIGTERM, SIG_IGN); while (pid >= 0 && (r= wait(&status)) >= 0 && r != pid) {} (void) signal(SIGINT, sigint); (void) signal(SIGQUIT, sigquit); (void) signal(SIGTERM, sigterm); tty_raw(); if (pid < 0) ; else if (WIFEXITED(status) && WEXITSTATUS(status) == 127) stat_start(0); /* Match the stat_start in the child. */ else event(ctrl('L'), op); } void m_dump(int ev, object_t *op) /* Raw dump of the partition table. */ { struct part_entry table[NR_PARTITIONS], *pe; int i; unsigned chs[3]; if (ev != 'p' || device < 0) return; memcpy(table, bootblock+PART_TABLE_OFF, NR_PARTITIONS * sizeof(table[0])); for (i= 0; i < NR_PARTITIONS; i++) { pe= &table[i]; stat_start(0); dos2chs(&pe->start_head, chs); printf("%2d%c %02X%15d%5d%4d", i+1, pe->bootind & ACTIVE_FLAG ? '*' : ' ', pe->sysind, chs[0], chs[1], chs[2]); dos2chs(&pe->last_head, chs); printf("%6d%5d%4d%10lu%10ld%9lu", chs[0], chs[1], chs[2], pe->lowsec, howend == SIZE ? pe->size : pe->size + pe->lowsec - 1, pe->size / 2); stat_end(10); } stat_start(0); printf("(Raw dump of the original %.40s table)", curdev->subname); stat_end(10); } int quitting= 0; void m_quit(int ev, object_t *op) /* Write the partition table if modified and exit. */ { if (ev != 'q' && ev != 'x') return; quitting= 1; if (dirty) event(E_WRITE, op); if (dirty) quitting= 0; } void m_help(int ev, object_t *op) /* For people without a clue; let's hope they can find the '?' key. */ { static struct help { char *keys; char *what; } help[]= { { "? !", "This help / more advice!" }, { "+ - (= _ PgUp PgDn)","Select/increment/decrement/make active" }, { "0-9 (a-f)", "Enter value" }, { "hjkl (arrow keys)", "Move around" }, { "CTRL-K CTRL-J", "Move entry up/down" }, { "CTRL-L", "Redraw screen" }, { ">", "Start a subpartition table" }, { "<", "Back to the primary partition table" }, { "m", "Cycle through magic values" }, { "spacebar", "Show \"Size\" or \"Last\"" }, { "r w", "Read/write partition table" }, { "p s q x", "Raw dump / Shell escape / Quit / Exit" }, { "y n DEL", "Answer \"yes\", \"no\", \"cancel\"" }, }; static char *advice[] = { "* Choose a disk with '+' and '-', then hit 'r'.", "* To change any value: Move to it and use '+', '-' or type the desired value.", "* To make a new partition: Move over to the Size or Kb field of an unused", " partition and type the size. Hit the 'm' key to pad the partition out to", " a cylinder boundary. Hit 'm' again to pad it out to the end of the disk.", " You can hit 'm' more than once on a base or size field to see several", " interesting values go by. Note: Other Operating Systems can be picky about", " partitions that are not padded to cylinder boundaries. Look for highlighted", " head or sector numbers.", "* To reuse a partition: Change the type to MINIX.", "* To delete a partition: Type a zero in the hex Type field.", "* To make a partition active: Type '+' in the Num field.", "* To study the list of keys: Type '?'.", }; if (ev == '?') { struct help *hp; for (hp= help; hp < arraylimit(help); hp++) { stat_start(0); printf("%-25s - %s", hp->keys, hp->what); stat_end(0); } stat_start(0); putstr("Things like "); putstr(t_so); putstr("this"); putstr(t_se); putstr(" must be checked, but "); putstr(t_md); putstr("this"); putstr(t_me); putstr(" is not really a problem"); stat_end(0); } else if (ev == '!') { char **ap; for (ap= advice; ap < arraylimit(advice); ap++) { stat_start(0); putstr(*ap); stat_end(0); } } } void event(int ev, object_t *op) /* Simply call all modifiers for an event, each one knows when to act. */ { m_help(ev, op); m_redraw(ev, op); m_toggle(ev, op); m_orientation(ev, op); m_move(ev, op); m_updown(ev, op); m_enter(ev, op); m_leave(ev, op); m_modify(ev, op); m_magic(ev, op); m_in(ev, op); m_out(ev, op); m_read(ev, op); m_write(ev, op); m_shell(ev, op); m_dump(ev, op); m_quit(ev, op); } int keypress(void) /* Get a single keypress. Translate compound keypresses (arrow keys) to * their simpler equivalents. */ { char ch; int c; int esc= 0; set_cursor(curobj->row, curobj->col); fflush(stdout); do { if (read(0, &ch, sizeof(ch)) < 0) fatal("stdin"); c= (unsigned char) ch; switch (esc) { case 0: switch (c) { case ctrl('['): esc= 1; break; case '_': c= '-'; break; case '=': c= '+'; break; } break; case 1: esc= c == '[' ? 2 : 0; break; case 2: switch (c) { case 'D': c= 'h'; break; case 'B': c= 'j'; break; case 'A': c= 'k'; break; case 'C': c= 'l'; break; case 'H': c= 'H'; break; case 'U': case 'S': c= '-'; break; case 'V': case 'T': c= '+'; break; } /*FALL THROUGH*/ default: esc= 0; } } while (esc > 0); switch (c) { case ctrl('B'): c= 'h'; break; case ctrl('N'): c= 'j'; break; case ctrl('P'): c= 'k'; break; case ctrl('F'): c= 'l'; break; } return c; } void mainloop(void) /* Get keypress, handle event, display results, reset screen, ad infinitum. */ { int key; while (!quitting) { stat_reset(); key= keypress(); event(key, curobj); display(); } } int main(int argc, char **argv) { object_t *op; int i, r, key; struct part_entry *pe; /* Define a few objects to show on the screen. First text: */ op= newobject(O_INFO, 0, 0, 2, 19); op= newobject(O_TEXT, 0, 0, 22, 13); op->text= "----first----"; op= newobject(O_TEXT, 0, 0, 37, 13); op->text= "--geom/last--"; op= newobject(O_TEXT, 0, 0, 52, 18); op->text= "------sectors-----"; op= newobject(O_TEXT, 0, 1, 4, 6); op->text= "Device"; op= newobject(O_TEXT, 0, 1, 23, 12); op->text= "Cyl Head Sec"; op= newobject(O_TEXT, 0, 1, 38, 12); op->text= "Cyl Head Sec"; op= newobject(O_TEXT, 0, 1, 56, 4); op->text= "Base"; op= newobject(O_TEXT, 0, 1, 66, 4); op->text= size_last; op= newobject(O_TEXT, 0, 1, 78, 2); op->text= "Kb"; op= newobject(O_TEXT, 0, 4, 0, 15); op->text= "Num Sort Type"; /* The device is the current object: */ curobj= newobject(O_DEV, OF_MOD, 2, 4, 15); op= newobject(O_SUB, 0, 3, 4, 15); /* Geometry: */ op= newobject(O_CYL, OF_MOD, 2, 40, 5); op->entry= &table[0]; op= newobject(O_HEAD, OF_MOD, 2, 45, 3); op->entry= &table[0]; op= newobject(O_SEC, OF_MOD, 2, 49, 2); op->entry= &table[0]; /* Objects for the device: */ op= newobject(O_SCYL, 0, 3, 25, 5); op->entry= &table[0]; op= newobject(O_SHEAD, 0, 3, 30, 3); op->entry= &table[0]; op= newobject(O_SSEC, 0, 3, 34, 2); op->entry= &table[0]; op= newobject(O_LCYL, 0, 3, 40, 5); op->entry= &table[0]; op= newobject(O_LHEAD, 0, 3, 45, 3); op->entry= &table[0]; op= newobject(O_LSEC, 0, 3, 49, 2); op->entry= &table[0]; op= newobject(O_BASE, 0, 3, 59, 9); op->entry= &table[0]; op= newobject(O_SIZE, 0, 3, 69, 9); op->entry= &table[0]; op= newobject(O_KB, 0, 3, 79, 9); op->entry= &table[0]; /* Objects for each partition: */ for (r= 5, pe= table+1; pe <= table+NR_PARTITIONS; r++, pe++) { op= newobject(O_NUM, OF_MOD, r, 1, 2); op->entry= pe; op= newobject(O_SORT, 0, r, 5, 2); op->entry= pe; op= newobject(O_TYPHEX, OF_MOD, r, 10, 2); op->entry= pe; op= newobject(O_TYPTXT, OF_MOD, r, 12, 9); op->entry= pe; op= newobject(O_SCYL, OF_MOD, r, 25, 5); op->entry= pe; op= newobject(O_SHEAD, OF_MOD, r, 30, 3); op->entry= pe; op= newobject(O_SSEC, OF_MOD, r, 34, 2); op->entry= pe; op= newobject(O_LCYL, OF_MOD, r, 40, 5); op->entry= pe; op= newobject(O_LHEAD, OF_MOD, r, 45, 3); op->entry= pe; op= newobject(O_LSEC, OF_MOD, r, 49, 2); op->entry= pe; op= newobject(O_BASE, OF_MOD, r, 59, 9); op->entry= pe; op= newobject(O_SIZE, OF_MOD, r, 69, 9); op->entry= pe; op= newobject(O_KB, OF_MOD, r, 79, 9); op->entry= pe; } for (i= 1; i < argc; i++) newdevice(argv[i], 0); if (firstdev == nil) { getdevices(); key= ctrl('L'); } else { key= 'r'; } if (firstdev != nil) { init_tty(); clear_screen(); event(key, curobj); display(); mainloop(); reset_tty(); } exit(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* partition 1.12 - Make a partition table Author: Kees J. Bot * 27 Apr 1992 */ #define nil 0 #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <minix/config.h> #include <minix/const.h> #include <minix/partition.h> #include <minix/u64.h> #include <ibm/partition.h> #include <sys/stat.h> #include <string.h> #include <errno.h> #include <sys/ioctl.h> #include <limits.h> #define SECTOR_SIZE 512 #define arraysize(a) (sizeof(a)/sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) char *arg0; void report(const char *label) { fprintf(stderr, "%s: %s: %s\n", arg0, label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } #ifndef makedev #define minor(dev) (((dev) >> MINOR) & BYTE) #define major(dev) (((dev) >> MAJOR) & BYTE) #define makedev(major, minor) \ ((dev_t) (((major) << MAJOR) | ((minor) << MINOR))) #endif int aflag; /* Add a new partition to the current table. */ int mflag; /* Minix rules, no need for alignment. */ int rflag; /* Report current partitions. */ int fflag; /* Force making a table even if too small. */ int cylinders, heads, sectors; /* Device's geometry */ int pad; /* Partitions must be padded. */ /* Descriptions of the device to divide and the partitions to make, including * gaps between partitions. */ struct part_entry primary, table[2 * NR_PARTITIONS + 1]; int npart; /* Extra flag at construction time. */ #define EXPAND_FLAG 0x01 /* Add the remaining sectors to this one */ void sec2dos(unsigned long sec, unsigned char *dos) /* Translate a sector number into the three bytes DOS uses. */ { unsigned secspcyl= heads * sectors; unsigned cyl; cyl= sec / secspcyl; dos[2]= cyl; dos[1]= ((sec % sectors) + 1) | ((cyl >> 2) & 0xC0); dos[0]= (sec % secspcyl) / sectors; } void show_chs(unsigned long pos) { int cyl, head, sec; if (pos == -1) { cyl= head= 0; sec= -1; } else { cyl= pos / (heads * sectors); head= (pos / sectors) - (cyl * heads); sec= pos % sectors; } printf(" %4d/%02d/%02d", cyl, head, sec); } void show_part(struct part_entry *p) { static int banner= 0; int n; n= p - table; if ((n % 2) == 0) return; if (!banner) { printf( "Part First Last Base Size Kb\n"); banner= 1; } printf("%3d ", (n-1) / 2); show_chs(p->lowsec); show_chs(p->lowsec + p->size - 1); printf(" %8lu %8lu %7lu\n", p->lowsec, p->size, p->size / 2); } void usage(void) { fprintf(stderr, "Usage: partition [-mf] device [type:]length[+*] ...\n"); exit(1); } #define between(a, c, z) ((unsigned) ((c) - (a)) <= ((z) - (a))) void parse(char *descr) { int seen= 0, sysind, flags, c; unsigned long size; if (strchr(descr, ':') == nil) { /* A hole. */ if ((npart % 2) != 0) { fprintf(stderr, "%s: Two holes can't be adjacent.\n", arg0); exit(1); } sysind= NO_PART; seen|= 1; } else { /* A partition. */ if ((npart % 2) == 0) { /* Need a hole before this partition. */ if (npart == 0) { /* First hole contains the partition table. */ table[0].size= 1; } npart++; } sysind= 0; for (;;) { c= *descr++; if (between('0', c, '9')) c= (c - '0') + 0x0; else if (between('a', c, 'z')) c= (c - 'a') + 0xa; else if (between('A', c, 'Z')) c= (c - 'A') + 0xA; else break; sysind= 0x10 * sysind + c; seen|= 1; } if (c != ':') usage(); } size= 0; while (between('0', (c= *descr++), '9')) { size= 10 * size + (c - '0'); seen|= 2; } flags= 0; for (;;) { if (c == '*') flags|= ACTIVE_FLAG; else if (c == '+') flags|= EXPAND_FLAG; else break; c= *descr++; } if (seen != 3 || c != 0) usage(); if (npart == arraysize(table)) { fprintf(stderr, "%s: too many partitions, only %d possible.\n", arg0, NR_PARTITIONS); exit(1); } table[npart].bootind= flags; table[npart].sysind= sysind; table[npart].size= size; npart++; } void geometry(char *device) /* Get the geometry of the drive the device lives on, and the base and size * of the device. */ { int fd; struct partition geometry; if ((fd= open(device, O_RDONLY)) < 0) fatal(device); /* Get the geometry of the drive, and the device's base and size. */ if (ioctl(fd, DIOCGETP, &geometry) < 0) fatal(device); close(fd); primary.lowsec= div64u(geometry.base, SECTOR_SIZE); primary.size= div64u(geometry.size, SECTOR_SIZE); cylinders= geometry.cylinders; heads= geometry.heads; sectors= geometry.sectors; /* Is this a primary partition table? If so then pad partitions. */ pad= (!mflag && primary.lowsec == 0); } void boundary(struct part_entry *pe, int exp) /* Expand or reduce a primary partition to a track or cylinder boundary to * avoid giving the fdisk's of simpler operating systems a fit. */ { unsigned n; n= !pad ? 1 : pe == &table[0] ? sectors : heads * sectors; if (exp) pe->size+= n - 1; pe->size= ((pe->lowsec + pe->size) / n * n) - pe->lowsec; } void distribute(char *device) /* Fit the partitions onto the device. Try to start and end them on a * cylinder boundary if so required. The first partition is to start on * track 1, not on cylinder 1. */ { struct part_entry *pe, *exp; long count; unsigned long base, size; do { exp= nil; base= primary.lowsec; count= primary.size; for (pe= table; pe < arraylimit(table); pe++) { pe->lowsec= base; boundary(pe, 1); base+= pe->size; count-= pe->size; if (pe->bootind & EXPAND_FLAG) exp= pe; } if (count < 0) { if (fflag) break; fprintf(stderr, "%s: %s is %ld sectors too small\n", arg0, device, -count); exit(1); } if (exp != nil) { /* Add leftover space to the partition marked for * expanding. */ exp->size+= count; boundary(exp, 0); exp->bootind&= ~EXPAND_FLAG; } } while (exp != nil); for (pe= table; pe < arraylimit(table); pe++) { if (pe->sysind == NO_PART) { memset(pe, 0, sizeof(*pe)); } else { sec2dos(pe->lowsec, &pe->start_head); sec2dos(pe->lowsec + pe->size - 1, &pe->last_head); pe->bootind&= ACTIVE_FLAG; } show_part(pe); } } void write_table(char *device) { int f; short signature= 0xAA55; struct part_entry newtable[NR_PARTITIONS]; int i; for (i= 0; i < NR_PARTITIONS; i++) newtable[i]= table[1 + 2*i]; if ((f= open(device, O_WRONLY)) < 0 || lseek(f, (off_t) PART_TABLE_OFF, SEEK_SET) == -1 || write(f, newtable, sizeof(newtable)) < 0 || write(f, &signature, sizeof(signature)) < 0 || close(f) < 0 ) fatal(device); } int main(int argc, char **argv) { int i; char *device; if ((arg0= strrchr(argv[0], '/')) == nil) arg0= argv[0]; else arg0++; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; while (*opt != 0) switch (*opt++) { case 'a': aflag= 1; break; case 'm': mflag= 1; break; case 'r': rflag= 1; break; case 'f': fflag= 1; break; default: usage(); } } if (rflag) { if (aflag) usage(); if ((argc - i) != 1) usage(); fprintf(stderr, "%s: -r is not yet implemented\n"); exit(1); } else { if ((argc - i) < 1) usage(); if (aflag) fprintf(stderr, "%s: -a is not yet implemented\n"); device= argv[i++]; geometry(device); while (i < argc) parse(argv[i++]); distribute(device); write_table(device); } exit(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� H��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * playwave.c * * Play sound files in wave format. Only MicroSoft PCM is supported. * * Michel R. Prevenier. */ #include <sys/types.h> #include <errno.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <sys/ioctl.h> #include <minix/sound.h> _PROTOTYPE( void main, (int argc, char **argv)); _PROTOTYPE( void usage, (void)); /******* Wave format definitions *********/ #define RIFF_ID 0x46464952 #define WAVE_ID1 0x45564157 #define WAVE_ID2 0x20746D66 #define DATA_ID 0x61746164 #define MS_PCM_FORMAT 0x0001 #define WORD short #define DWORD unsigned long struct RIFF_fields { DWORD RIFF_id; DWORD RIFF_len; DWORD WAVE_id1; DWORD WAVE_id2; DWORD data_ptr; } r_fields; struct common_fields { WORD FormatTag; WORD Channels; DWORD SamplesPerSec; DWORD AvgBytesPerSec; WORD BlockAlign; } c_fields; struct specific_fields { WORD BitsPerSample; } s_fields; DWORD data_id; DWORD data_len; /******** End of wave definitions *********/ void usage() { fprintf(stderr, "Usage: playwav [-i] file\n"); exit(-1); } void main ( int argc, char *argv[] ) { int i, audio, file; char *buffer, *file_name; unsigned int sign; unsigned int fragment_size; unsigned int channels; unsigned int bits; long data_pos; int showinfo = 0; /* Check Parameters */ if (argc > 2) { if (strncmp(argv[1], "-i", 2) == 0) { showinfo = 1; file_name = argv[2]; } else usage(); } else file_name = argv[1]; /* Open DSP */ if ((audio = open("/dev/audio", O_RDWR)) < 0) { printf("Cannot open /dev/audio\n"); exit(-1); } /* Get maximum fragment size and try to allocate a buffer */ ioctl(audio, DSPIOMAX, &fragment_size); if ((buffer = malloc(fragment_size)) == (char *)0) { fprintf(stderr, "Cannot allocate buffer\n"); exit(-1); } ioctl(audio, DSPIOSIZE, &fragment_size); /* Open wav file */ if((file = open(file_name, O_RDONLY)) < 0) { printf("Cannot open %s\n", file_name); exit(-1); } /* Check for valid wave format */ read(file, &r_fields, 20); if(r_fields.RIFF_id != RIFF_ID) { printf("%s not in RIFF format\n", file_name); exit(1); } if(r_fields.WAVE_id1 != WAVE_ID1 || r_fields.WAVE_id2 != WAVE_ID2) { printf("%s not in WAVE format\n", file_name); exit(1); } /* Store data_chunk position */ data_pos = lseek(file, 0L, 1) + r_fields.data_ptr; /* Read the common and specific fields */ read(file, &c_fields, 14); read(file, &s_fields, 2); /* Check for valid wave format, we can only play MicroSoft PCM */ if(c_fields.FormatTag != MS_PCM_FORMAT) { printf("%s not in MicroSoft PCM format\n", file_name); exit(1); } /* Set DSP parameters */ channels = c_fields.Channels; channels--; bits = s_fields.BitsPerSample; ioctl(audio, DSPIOSTEREO, &channels); ioctl(audio, DSPIORATE, &c_fields.SamplesPerSec); ioctl(audio, DSPIOBITS, &bits); sign = (bits == 16 ? 1 : 0); ioctl(audio, DSPIOSIGN, &sign); /* Goto data chunk */ lseek(file, data_pos, SEEK_SET); /* Check for valid data chunk */ read(file, &data_id, sizeof(data_id)); if(data_id != DATA_ID) { printf("Invalid data chunk\n"); exit(1); } /* Get length of data */ read(file, &data_len, sizeof(data_len)); if (showinfo) { printf("\nBits per sample : %d \n", s_fields.BitsPerSample); printf("Stereo : %s \n", (c_fields.Channels == 1 ? "yes" : "no")); printf("Samples per second: %ld \n", c_fields.SamplesPerSec); printf("Average bytes/sec : %ld \n", c_fields.AvgBytesPerSec); printf("Block alignment : %d \n", c_fields.BlockAlign); printf("Datalength (bytes): %ld \n\n", data_len); } /* Play data */ while(data_len > 0) { if (data_len > fragment_size) { /* Read next fragment */ read(file, buffer, fragment_size); data_len-= fragment_size; } else { /* Read until end of file and fill rest of buffer with silence, * in PCM this means: fill buffer with last played value */ read(file, buffer, data_len); for (i = data_len; i< fragment_size; i++) buffer[i] = buffer[(int)data_len-1]; data_len = 0; } /* Copy data to DSP */ write(audio, buffer, fragment_size); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* postmort - post mortem dump Author: C. W. Rose */ /* Postmort: perform post-mortem on PC Minix 1.7 core files. * * $Id$ */ /* The 1.5 core file structure is a struct mem_map, the segment memory map, * followed by a struct proc, the process table, followed by a dump of the * text, data, and stack segments. * * This is the 8086/Intel version; 386 and 68K will differ. It defaults to * using the name 'core' for the core file, and 'a.out' for the symbol file. * If there is no 'a.out', it will try and read the symbol table from * 'symbol.out', then give up. A non-existant symbol table is not a fatal * error unless the -s option was used. * * The PC 1.5 kernel dump routines are odd - they dump the memory maps twice, * the second time as part of the kernel process table, and the kernel * process table size must be a multiple of 4. Should a core file have a * header with a magic number in future? * * The kernel include file paths need to be edited for each machine. */ #include <sys/types.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include <limits.h> #include <signal.h> #include <stdlib.h> #undef EXTERN /* <minix/const.h> defined this */ #define EXTERN /* so we get proc & mproc */ #include "../../kernel/const.h" #include "../../kernel/type.h" #include "../../kernel/proc.h" #undef printf /* kernel's const.h defined this */ #include "../../mm/mproc.h" #include <a.out.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #undef NULL #include <string.h> #include <unistd.h> #define FALSE 0 #undef TRUE #define TRUE ~FALSE #define OK 1 #define FAILED -1 #define CORE "core" #define AOUT "a.out" #define SYMB "symbol.out" #define LINE_LEN 16 #define MAXSYM 200 #define SYMLEN 8 /* Global variables */ int opt_c = FALSE; /* name of core file */ int opt_d = FALSE; /* dump raw data and stack segments */ int opt_p = FALSE; /* dump the kernel process table */ int opt_s = FALSE; /* name of symbol file */ int opt_t = FALSE; /* trace back the stack */ int opt_x = FALSE; /* debugging flag */ char progname[20]; /* program name */ char *segment_name[] = { /* array of segment names */ "Text", "Data", "Stack" }; int dbglvl = 0; /* debugging level */ int maxsym; /* maximum symbol number */ unsigned int baseptr; /* reference copy of stack base pointer */ unsigned int stackptr; /* reference copy of stack pointer */ long int lengths[NR_SEGS]; /* segment lengths */ long int bases[NR_SEGS]; /* segment base addresses */ struct sym { /* symbol table addresses and labels */ unsigned int addr; char label[SYMLEN + 1]; } symtab[MAXSYM]; /* Used by getopt(3) package */ extern int optind, opterr, optopt; extern char *optarg; _PROTOTYPE(int binary, (int uc, char *sp)); _PROTOTYPE(void dump_all_segs, (int fd)); _PROTOTYPE(void dump_maps, (struct mem_map * mp)); _PROTOTYPE(void dump_one_seg, (int fd, int segindex)); _PROTOTYPE(void dump_proc_table, (struct proc * pt)); _PROTOTYPE(void dump_registers, (struct proc * pt)); _PROTOTYPE(void dump_sym_tab, (struct sym *st)); _PROTOTYPE(void dump_stack, (struct stackframe_s * sp)); _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(int parse_line, (char *ps)); _PROTOTYPE(int read_symbol, (int fd)); _PROTOTYPE(void stack_trace, (int fd)); _PROTOTYPE(void usage, (void)); /* B i n a r y * * Produce a binary representation of an 8-bit number. */ int binary(ucc, sp) int ucc; char *sp; { int j; unsigned char k, uc; uc = (unsigned char) ucc; for (k = 0x80, j = 0; j < 8; j++) { if ((uc & k) == 0) *sp++ = '0'; else *sp++ = '1'; if (j == 3) *sp++ = '$'; k >>= 1; } *sp = '\0'; return(0); } /* D u m p _ a l l _ s e g s * * Dump all the segments except for text */ void dump_all_segs(fd) int fd; { int j; long int start; start = (long) (NR_SEGS * sizeof(struct mem_map)) + sizeof(struct proc); for (j = 1; j < NR_SEGS; j++) { start += lengths[j - 1]; (void) lseek(fd, start, 0); printf("\n"); dump_one_seg(fd, j); } } /* D u m p _ m a p s * * Dump the memory maps */ void dump_maps(mp) struct mem_map *mp; { int j; long int vir, phy, len; printf("\t Virtual\t Physical\tLength\n"); printf("\t address\t address\n"); for (j = 0; j < NR_SEGS; j++) { vir = (long) mp[j].mem_vir << CLICK_SHIFT; phy = (long) mp[j].mem_phys << CLICK_SHIFT; len = (long) mp[j].mem_len << CLICK_SHIFT; printf("%s:\t0x%08.8lx\t0x%08.8lx\t%8ld (0x%08.8lx)\n", segment_name[j], vir, phy, len, len); lengths[j] = len; bases[j] = vir; } } /* D u m p _ o n e _ s e g * * Dump a single segment */ void dump_one_seg(fd, segindex) int fd, segindex; { unsigned char dlen[LINE_LEN]; int i, amt, amt_read; long int len, offset; printf("%s segment\n\n", segment_name[segindex]); len = lengths[segindex]; amt = LINE_LEN; for (offset = 0; offset < len; offset += amt) { if ((len - offset) < LINE_LEN) amt = (int) (len - offset); if (dbglvl > 0) printf("Length %ld, offset %ld, amt %d\n", len, offset, amt); if ((amt_read = read(fd, (char *) dlen, (unsigned int) amt)) == -1) { printf("Unexpected end of file\n"); exit(1); } printf("%08.8lx: ", bases[segindex] + offset); for (i = 0; i < amt_read; i++) { if (i == LINE_LEN / 2) printf("- "); printf("%02.2x ", dlen[i]); } printf(" "); for (i = 0; i < amt_read; i++) { if (isprint(dlen[i])) (void) putchar((char) dlen[i]); else (void) putchar('.'); } (void) putchar('\n'); if (dbglvl > 0 && amt_read != amt) printf("wanted = %d, got = %d, offset = %ld\n", amt, amt_read, offset); } } /* D u m p _ p r o c _ t a b l e * * Dump the entire kernel proc table */ void dump_proc_table(pt) struct proc *pt; { printf("Kernel process table entries:\n\n"); #if 0 printf("Process' registers: 0x%04.4x\n", pt->p_reg); /* struct stackframe_s */ printf("Selector in gdt: 0x%04.4x\n", pt->p_ldt_sel); /* reg_t */ printf("Descriptors for code and data: 0x%04.4x\n", pt->p_ldt[2]); /* struct segdesc_s */ #endif printf("Number of this process: 0x%04.4x\n", pt->p_nr); /* int */ printf("Nonzero if blocked by busy task: 0x%04.4x\n", pt->p_int_blocked); /* int */ printf("Nonzero if held by busy syscall: 0x%04.4x\n", pt->p_int_held); /* int */ #if 0 printf("Next in chain of held-up processes: 0x%04.4x\n", pt->p_nextheld); /* struct proc * */ #endif printf("SENDING, RECEIVING, etc.: 0x%04.4x\n", pt->p_flags); /* int */ #if 0 printf("Memory map: 0x%04.4x\n", pt->p_map[NR_SEGS]); /* struct mem_map */ #endif printf("Process id passed in from MM: 0x%04.4x\n", pt->p_pid); /* int */ printf("User time in ticks: %ld\n", pt->user_time); /* time_t */ printf("Sys time in ticks: %ld\n", pt->sys_time); /* time_t */ printf("Cumulative user time of children: %ld\n", pt->child_utime); /* time_t */ printf("Cumulative sys time of children: %ld\n", pt->child_stime); /* time_t */ printf("Time of next alarm in ticks or 0: %ld\n", pt->p_alarm); /* time_t */ #if 0 printf("Ticks used in current quantum: %d\n", pt->quantum_time); /* int */ printf("Ticks used in last quantum: %d\n", pt->quantum_last); /* int */ printf("Current priority of the process: %d\n", pt->curr_prio); /* int */ printf("Base priority of the process: %d\n", pt->base_prio); /* int */ printf("Scale for profiling, 0 = none: %u\n", pt->p_pscale); /* unsigned */ printf("Profiling pc lower boundary: %d\n", pt->p_plow); /* vir_bytes */ printf("Profiling pc upper boundary: %d\n", pt->p_phigh); /* vir_bytes */ printf("Profiling buffer: %d\n", pt->p_pbuf); /* vir_bytes */ printf("Profiling buffer size: %d\n", pt->p_psiz); /* vir_bytes */ #endif #if 0 printf("First proc wishing to send: 0x%04.4x\n", pt->p_callerq); /* struct proc * */ printf("Link to next proc wishing to send: 0x%04.4x\n", pt->p_sendlink); /* struct proc * */ printf("Pointer to message buffer: 0x%04.4x\n", pt->p_messbuf); /* message * */ #endif printf("Expecting message from: 0x%04.4x\n", pt->p_getfrom); /* int */ #if 0 printf("Pointer to next ready process: 0x%04.4x\n", pt->p_nextready); /* struct proc * */ #endi.H��0H��1H��2H��3H��4H��5H��6H��7H��8H��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f printf("Bit map for pending signals 1-16: 0x%04.4x\n", pt->p_pending); /* int */ printf("Count of pending/unfinished signals: 0x%04.4x\n", pt->p_pendcount); /* unsigned */ } /* D u m p _ r e g i s t e r s * * Dump the registers from the proc table */ void dump_registers(pt) struct proc *pt; { char buff[32]; unsigned char uc; /* Print the registers */ dump_stack(&pt->p_reg); /* Build up a binary representation of the signal flags */ uc = (pt->p_pending >> 8) & 0xff; (void) binary((int) uc, buff); buff[9] = '$'; uc = pt->p_pending & 0xff; (void) binary((int) uc, buff + 10); printf("Pending signals = %s\n", buff); } /* D u m p _ s y m _ t a b * * Dump the symbol table */ void dump_sym_tab(st) struct sym *st; { int j; printf("Symbol table entries (text):\n\n"); for (j = 0; j < maxsym; j++) printf("0x%08.8x T %s\n", symtab[j].addr, symtab[j].label); } /* D u m p _ s t a c k * * Dump the stack frame */ void dump_stack(sp) struct stackframe_s *sp; { char buff[32]; unsigned char uc; /* Build up the binary PSW representation */ uc = (sp->psw >> 8) & 0xff; (void) binary((int) uc, buff); uc = sp->psw & 0xff; buff[9] = '$'; (void) binary((int) uc, buff + 10); /* Print all the information */ printf("Stack Frame:\tPC = %04.4x\t\t PSW = %s\n", sp->pc, buff); printf("\t\t\t\t\tStatus = ____ ODIT SZ_A _P_C\n"); printf(" ax bx cx dx di si\n"); printf(" %04.4x\t%04.4x\t%04.4x\t%04.4x\t%04.4x\t%04.4x\n", sp->retreg, sp->bx, sp->cx, sp->dx, sp->di, sp->si); printf(" sp bp ss\n"); printf(" %04.4x\t%04.4x\t%04.4x\n", sp->sp, sp->fp, sp->ss); printf(" cs ds es\n"); printf(" %04.4x\t%04.4x\t%04.4x\n", sp->cs, sp->ds, sp->es); /* Store for future reference */ stackptr = sp->sp; baseptr = sp->fp; if (dbglvl > 0) printf("\nStack pointer 0x%x, Base pointer 0x%x\n", stackptr, baseptr); } /* M a i n * * Main program */ main(argc, argv) int argc; char *argv[]; { int j, fdc, fds; char *cp, corefile[132], symbfile[132]; struct proc proc_entry; struct mem_map mp_segs[NR_SEGS]; /* Initial set up */ if ((cp = strrchr(argv[0], '/')) == (char *) NULL) cp = argv[0]; else cp++; strncpy(progname, cp, 19); strncpy(corefile, CORE, 131); strncpy(symbfile, AOUT, 131); /* Parse arguments */ opterr = 0; while ((j = getopt(argc, argv, "c:dps:tx:")) != EOF) { switch (j & 0177) { case 'c': opt_c = TRUE; strncpy(corefile, optarg, 131); break; case 'd': opt_d = TRUE; break; case 'p': opt_p = TRUE; break; case 's': opt_s = TRUE; strncpy(symbfile, optarg, 131); break; case 't': opt_t = TRUE; break; case 'x': dbglvl = atoi(optarg); opt_x = TRUE; break; case '?': default: usage(); exit(1); break; } } /* We must have a core file */ if ((fdc = open(corefile, O_RDONLY)) == -1) { fprintf(stderr, "Cannot open %s\n", corefile); exit(1); } /* We'd like an a.out file or a symbol table */ if ((fds = open(symbfile, O_RDONLY)) == -1) { if (opt_s) j = FAILED; else { strncpy(symbfile, AOUT, 131); if ((fds = open(symbfile, O_RDONLY)) == -1) j = FAILED; else j = read_symbol(fds); } } else j = read_symbol(fds); /* Only fatal if we insisted */ if (opt_s && j == FAILED) { fprintf(stderr, "Cannot find symbols in %s\n", symbfile); exit(1); } /* Read the process table */ if (dbglvl > 0) { printf("\n"); printf("Size of mproc entry %d\n", NR_SEGS * sizeof(struct mem_map)); printf("Size of process table %d\n", sizeof(proc_entry)); } if (read(fdc, (char *) mp_segs, sizeof(mp_segs)) != sizeof(mp_segs) || read(fdc, (char *) &proc_entry, sizeof(struct proc)) != sizeof(struct proc)) { fprintf(stderr, "Cannot open %s\n", corefile); exit(1); } /* Do the work */ #if 0 dump_maps(mp_segs); /* duplicated in the kernel */ printf("\n"); #endif dump_maps(proc_entry.p_map); printf("\n"); dump_registers(&proc_entry); if (opt_t) { printf("\n"); stack_trace(fdc); } if (opt_p) { printf("\n"); dump_proc_table(&proc_entry); } if (opt_d) { printf("\n"); dump_sym_tab(symtab); dump_all_segs(fdc); } /* Wrap up */ (void) close(fdc); if (fds != -1) (void) close(fds); exit(0); /* NOTREACHED */ } /* P a r s e _ l i n e * * Parse a line of the symbol table */ int parse_line(ps) char *ps; { char c, s[80]; int j, k; unsigned int u; /* We must have space in the table */ if (maxsym == MAXSYM) return(FAILED); /* Lines must be a minimum length to contain information */ if (strlen(ps) < 8) return(FAILED); /* Lines must have a definite structure */ if (ps[1] != ' ' || ps[6] != ' ') return(FAILED); for (j = 2; j < 6; j++) if (!isxdigit(ps[j])) return(FAILED); if (sscanf(ps, "%c %x %s", &c, &u, s) != 3) return (FAILED); if (dbglvl > 0) printf("Address 0x%04.4x, label %s\n", u, s); /* Load the symbol table in sorted order */ for (j = 0; j < maxsym; j++) { if (u < symtab[j].addr) { for (k = maxsym; k > j; k--) symtab[k] = symtab[k - 1]; break; } } symtab[j].addr = u; strncpy(symtab[j].label, s, SYMLEN); maxsym++; return(OK); } /* R e a d _ s y m b o l * * Read the symbol table */ int read_symbol(fd) int fd; { char sym[80], buff[BUFSIZ]; int j, k, m; long int offset; struct exec *ep; struct nlist *np; /* We collect only text symbols, since that's all that's needed here */ /* Initialise the buffer */ if ((j = read(fd, buff, BUFSIZ)) == 0 || j == -1) return(FAILED); k = maxsym = 0; /* Find out what we've got */ ep = (struct exec *) buff; np = (struct nlist *) buff; if (BADMAG(*ep)) { /* Must be a separate symbol table */ while (TRUE) { if (buff[k] == 'T') { for (m = 0; m < 78; m++) { sym[m] = buff[k]; if (++k == j) { if ((j = read(fd, buff, BUFSIZ)) == 0 || j == -1) break; k = 0; } if (buff[k] == '\n') break; } sym[m + 1] = '\0'; (void) parse_line(sym); } if (++k == j) { if ((j = read(fd, buff, BUFSIZ)) == 0 || j == -1) break; k = 0; } } } else if (ep->a_syms != 0L) { /* There's symbols in them thar hills */ offset = 8 * sizeof(long) + ep->a_text + ep->a_data; if (lseek(fd, offset, 0) == -1L) return(FAILED); /* Symbols are in an unsorted list */ while (read(fd, buff, sizeof(struct nlist)) == sizeof(struct nlist)) { if (np->n_sclass == (N_TEXT + C_EXT)) { /* external text symbols */ for (j = 0; j < maxsym; j++) { if (np->n_value < symtab[j].addr) { for (k = maxsym; k > j; k--) symtab[k] = symtab[k - 1]; break; } } symtab[j].addr = np->n_value; strncpy(symtab[j].label, np->n_name, SYMLEN); if (maxsym++ == MAXSYM) break; } } } else if (opt_s) return(FAILED); if (dbglvl > 0) { for (m = 0; m < maxsym; m++) printf("Addr 0x%04.4x, label %s\n", symtab[m].addr, symtab[m].label); printf("Maxsym %d\n", maxsym); } return(OK); } /* S t a c k _ t r a c e * * Trace back down the stack frames. * * WARNING: very, very, non-portable code */ void stack_trace(fd) int fd; { int j; unsigned int framepointer, lastpointer, returnvalue, end; long int offset, bp; /* Bp actually gives the offset from the base of the data segment */ bp = (long) (NR_SEGS * sizeof(struct mem_map)) + sizeof(struct proc) + lengths[0] + lengths[1] - bases[2]; if ((offset = lseek(fd, bp + (long int) baseptr, 0)) == -1L) return; end = (bases[2] + lengths[2] - 1) & 0xffff; if (dbglvl > 0) printf("Baseptr %x, End %x, Bp %ld, Offset %ld\n", baseptr, end, bp, offset); /* Print the header, then try to backtrace */ printf("Stack back trace:\n\n"); printf("Frame address. Contents. Return address."); if (maxsym != 0) printf(" Previous label."); printf("\n"); lastpointer = baseptr; while (TRUE) { /* Read the frame pointer and return address values */ if (read(fd, (char *) &framepointer, sizeof(int)) == -1 || read(fd, (char *) &returnvalue, sizeof(int)) == -1) break; /* Look up the return address - ignored if maxsym == 0 */ for (j = 0; j < maxsym; j++) { if (symtab[j].addr >= returnvalue) break; } if (j > 0) j--; printf(" 0x%04.4x 0x%04.4x 0x%04.4x %s\n", lastpointer, framepointer, returnvalue, (maxsym == 0) ? "" : symtab[j].label); /* If the result is clearly invalid, quit */ if (framepointer == 0 || framepointer >= end || framepointer <= lastpointer) break; /* Otherwise try to move to the next frame base */ lastpointer = framepointer; if ((offset = lseek(fd, bp + (long int) framepointer, 0)) == -1L || offset == 0L) break; } } /* U s a g e * * Usage message */ void usage() { fprintf(stderr, "Usage: %s [-dpt] [-c corefile] [-s symbfile]\n", progname); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* readclock - read the real time clock Authors: T. Holm & E. Froese */ /************************************************************************/ /* */ /* readclock.c */ /* */ /* Read the clock value from the 64 byte CMOS RAM */ /* area, then set system time. */ /* */ /* If the machine ID byte is 0xFC or 0xF8, the device */ /* /dev/mem exists and can be opened for reading, */ /* and no errors in the CMOS RAM are reported by the */ /* RTC, then the time is read from the clock RAM */ /* area maintained by the RTC. */ /* */ /* The clock RAM values are decoded and fed to mktime */ /* to make a time_t value, then stime(2) is called. */ /* */ /* This fails if: */ /* */ /* If the machine ID does not match 0xFC or 0xF8 (no */ /* error message.) */ /* */ /* If the machine ID is 0xFC or 0xF8 and /dev/mem */ /* is missing, or cannot be accessed. */ /* */ /* If the RTC reports errors in the CMOS RAM. */ /* */ /************************************************************************/ /* origination 1987-Dec-29 efth */ /* robustness 1990-Oct-06 C. Sylvain */ /* incorp. B. Evans ideas 1991-Jul-06 C. Sylvain */ /* set time & calibrate 1992-Dec-17 Kees J. Bot */ /* clock timezone 1993-Oct-10 Kees J. Bot */ /* set CMOS clock 1994-Jun-12 Kees J. Bot */ /************************************************************************/ #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <time.h> #include <errno.h> #include <signal.h> #include <ibm/portio.h> #include <ibm/cmos.h> #include <sys/svrctl.h> int nflag = 0; /* Tell what, but don't do it. */ int wflag = 0; /* Set the CMOS clock. */ int Wflag = 0; /* Also set the CMOS clock register bits. */ int y2kflag = 0; /* Interpret 1980 as 2000 for clock with Y2K bug. */ char clocktz[128]; /* Timezone of the clock. */ #define MACH_ID_ADDR 0xFFFFE /* BIOS Machine ID at FFFF:000E */ #define PC_AT 0xFC /* Machine ID byte for PC/AT, PC/XT286, and PS/2 Models 50, 60 */ #define PS_386 0xF8 /* Machine ID byte for PS/2 Model 80 */ /* Manufacturers usually use the ID value of the IBM model they emulate. * However some manufacturers, notably HP and COMPAQ, have had different * ideas in the past. * * Machine ID byte information source: * _The Programmer's PC Sourcebook_ by Thom Hogan, * published by Microsoft Press */ void errmsg(char *s); void get_time(struct tm *t); int read_register(int reg_addr); void set_time(struct tm *t); void write_register(int reg_addr, int value); int bcd_to_dec(int n); int dec_to_bcd(int n); void usage(void); int main(int argc, char **argv) { struct tm time1; struct tm time2; struct tm tmnow; char date[64]; time_t now, rtc; int i, mem; unsigned char mach_id, cmos_state; struct sysgetenv sysgetenv; /* Open /dev/mem to get access to physical memory. */ if ((mem = open("/dev/mem", O_RDONLY)) == -1) { errmsg( "Permission denied." ); exit(1); } if (lseek(mem, (off_t) MACH_ID_ADDR, SEEK_SET) == -1 || read(mem, (void *) &mach_id, sizeof(mach_id)) < 0) { mach_id = -1; } if (mach_id != PS_386 && mach_id != PC_AT) { errmsg( "Machine ID unknown." ); fprintf( stderr, "Machine ID byte = %02x\n", mach_id ); exit(1); } cmos_state = read_register(CMOS_STATUS); if (cmos_state & (CS_LOST_POWER | CS_BAD_CHKSUM | CS_BAD_TIME)) { errmsg( "CMOS RAM error(s) found..." ); fprintf( stderr, "CMOS state = 0x%02x\n", cmos_state ); if (cmos_state & CS_LOST_POWER) errmsg( "RTC lost power. Reset CMOS RAM with SETUP." ); if (cmos_state & CS_BAD_CHKSUM) errmsg( "CMOS RAM checksum is bad. Run SETUP." ); if (cmos_state & CS_BAD_TIME) errmsg( "Time invalid in CMOS RAM. Reset clock." ); exit(1); } /* Process options. */ while (argc > 1) { char *p = *++argv; if (*p++ != '-') usage(); while (*p != 0) { switch (*p++) { case 'n': nflag = 1; break; case 'w': wflag = 1; break; case 'W': Wflag = 1; break; case '2': y2kflag = 1; break; default: usage(); } } argc--; } if (Wflag) wflag = 1; /* -W implies -w */ /* The hardware clock may run in a different time zone, likely GMT or * winter time. Select that time zone. */ strcpy(clocktz, "TZ="); sysgetenv.key = "TZ"; sysgetenv.keylen = 2+1; sysgetenv.val = clocktz+3; sysgetenv.vallen = sizeof(clocktz)-3; if (svrctl(SYSGETENV, &sysgetenv) == 0) { putenv(clocktz); tzset(); } /* Read the CMOS real time clock. */ for (i = 0; i < 10; i++) { get_time(&time1); now = time(NULL); time1.tm_isdst = -1; /* Do timezone calculations. */ time2 = time1; rtc= mktime(&time1); /* Transform to a time_t. */ if (rtc != -1) break; fprintf(stderr, "readclock: Invalid time read from CMOS RTC: %d-%02d-%02d %02d:%02d:%02d\n", time2.tm_year+1900, time2.tm_mon+1, time2.tm_mday, time2.tm_hour, time2.tm_min, time2.tm_sec); sleep(5); } if (i == 10) exit(1); if (!wflag) { /* Set system time. */ if (nflag) { printf("stime(%lu)\n", (unsigned long) rtc); } else { if (stime(&rtc) < 0) { errmsg( "Not allowed to set time." ); exit(1); } } tmnow = *localtime(&rtc); if (strftime(date, sizeof(date), "%a %b %d %H:%M:%S %Z %Y", &tmnow) != 0) { if (date[8] == '0') date[8]= ' '; printf("%s\n", date); } } else { /* Set the CMOS clock to the system time. */ tmnow = *localtime(&now); if (nflag) { printf("%04d-%02d-%02d %02d:%02d:%02d\n", tmnow.tm_year + 1900, tmnow.tm_mon + 1, tmnow.tm_mday, tmnow.tm_hour, tmnow.tm_min, tmnow.tm_sec); } else { set_time(&tmnow); } } exit(0); } void errmsg(char *s) { static char *prompt = "readclock: "; fprintf(stderr, "%s%s\n", prompt, s); prompt = ""; } /***********************************************************************/ /* */ /* get_time( time ) */ /* */ /* Update the structure pointed to by time with the current time */ /* as read from CMOS RAM of the RTC. */ /* If necessary, the time is converted into a binary format before */ /* being stored in the structure. */ /* */ /***********************************************************************/ int dead; void timeout(int sig) { dead= 1; } void get_time(struct tm *t) { int osec, n; unsigned long i; struct sigaction sa; /* Start a timer to keep us from getting stuck on a dead clock. */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = timeout; sigaction(SIGALRM, &sa, NULL); dead = 0; alarm(5); do { osec = -1; n = 0; do { if (dead) { fprintf(stderr, "readclock: CMOS clock appears dead\n"); exit(1); } /* Clock update in progress? */ if (read_register(RTC_REG_A) & RTC_A_UIP) continue; t->tm_sec = read_register(RTC_SEC); if (t->tm_sec != osec) { /* Seconds changed. First from -1, then because the * clock ticked, which is what we're waiting for to * get a precise reading. */ osec = t->tm_sec; n++; } } while (n < 2); /* Read the other registers. */ t->tm_min = read_register(RTC_MIN); t->tm_hour = read_register(RTC_HOUR); t->tm_mday = read_register(RTC_MDAY); t->tm_mon = read_register(RTC_MONTH); t->tm_year = read_register(RTC_YEAR); /* Time stable? */ } while (read_register(RTC_SEC) != t->tm_sec || read_register(RTC_MIN) != t->tm_min || read_register(RTC_HOUR) != t->tm_hour || read_register(RTC_MDAY) != t->tm_mday || read_register(RTC_MONTH) != t->tm_mon || read_register(RTC_YEAR) != t->tm_year); if ((read_register(RTC_REG_B) & RTC_B_DM_BCD) == 0) { /* Convert BCD to binary (default RTC mode). */ t->tm_year = bcd_to_dec(t->tm_year); t->tm_mon = bcd_to_dec(t->tm_mon); t->tm_mday = bcd_to_dec(t-@H��BH��CH��DH��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>tm_mday); t->tm_hour = bcd_to_dec(t->tm_hour); t->tm_min = bcd_to_dec(t->tm_min); t->tm_sec = bcd_to_dec(t->tm_sec); } t->tm_mon--; /* Counts from 0. */ /* Correct the year, good until 2080. */ if (t->tm_year < 80) t->tm_year += 100; if (y2kflag) { /* Clock with Y2K bug, interpret 1980 as 2000, good until 2020. */ if (t->tm_year < 100) t->tm_year += 20; } } int read_register(int reg_addr) { int r; intr_disable(); outb(RTC_INDEX, reg_addr); r= inb(RTC_IO); intr_enable(); return r; } /***********************************************************************/ /* */ /* set_time( time ) */ /* */ /* Set the CMOS RTC to the time found in the structure. */ /* */ /***********************************************************************/ void set_time(struct tm *t) { int regA, regB; if (Wflag) { /* Set A and B registers to their proper values according to the AT * reference manual. (For if it gets messed up, but the BIOS doesn't * repair it.) */ write_register(RTC_REG_A, RTC_A_DV_OK | RTC_A_RS_DEF); write_register(RTC_REG_B, RTC_B_24); } /* Inhibit updates. */ regB= read_register(RTC_REG_B); write_register(RTC_REG_B, regB | RTC_B_SET); t->tm_mon++; /* Counts from 1. */ if (y2kflag) { /* Set the clock back 20 years to avoid Y2K bug, good until 2020. */ if (t->tm_year >= 100) t->tm_year -= 20; } if ((regB & 0x04) == 0) { /* Convert binary to BCD (default RTC mode) */ t->tm_year = dec_to_bcd(t->tm_year % 100); t->tm_mon = dec_to_bcd(t->tm_mon); t->tm_mday = dec_to_bcd(t->tm_mday); t->tm_hour = dec_to_bcd(t->tm_hour); t->tm_min = dec_to_bcd(t->tm_min); t->tm_sec = dec_to_bcd(t->tm_sec); } write_register(RTC_YEAR, t->tm_year); write_register(RTC_MONTH, t->tm_mon); write_register(RTC_MDAY, t->tm_mday); write_register(RTC_HOUR, t->tm_hour); write_register(RTC_MIN, t->tm_min); write_register(RTC_SEC, t->tm_sec); /* Stop the clock. */ regA= read_register(RTC_REG_A); write_register(RTC_REG_A, regA | RTC_A_DV_STOP); /* Allow updates and restart the clock. */ write_register(RTC_REG_B, regB); write_register(RTC_REG_A, regA); } void write_register(int reg_addr, int value) { intr_disable(); outb(RTC_INDEX, reg_addr); outb(RTC_IO, value); intr_enable(); } int bcd_to_dec(int n) { return ((n >> 4) & 0x0F) * 10 + (n & 0x0F); } int dec_to_bcd(int n) { return ((n / 10) << 4) | (n % 10); } void usage(void) { fprintf(stderr, "Usage: readclock [-nwW2]\n"); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * recwave.c * * Record sound files in wave format. Only MicroSoft PCM is supported. * * Michel R. Prevenier. */ #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <termios.h> #include <stdlib.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <sys/ioctl.h> #include <minix/sound.h> _PROTOTYPE (void main, (int argc, char **argv)); _PROTOTYPE (void usage, (void)); _PROTOTYPE ( void write_wave_header, (void)); _PROTOTYPE ( void terminate, (int s)); /******* Wave format definitions *********/ #define RIFF_ID 0x46464952 #define WAVE_ID1 0x45564157 #define WAVE_ID2 0x20746D66 #define DATA_ID 0x61746164 #define MS_PCM_FORMAT 0x0001 #define WORD short #define DWORD unsigned long struct RIFF_fields { DWORD RIFF_id; DWORD RIFF_len; DWORD WAVE_id1; DWORD WAVE_id2; DWORD data_ptr; } r_fields; struct common_fields { WORD FormatTag; WORD Channels; DWORD SamplesPerSec; DWORD AvgBytesPerSec; WORD BlockAlign; } c_fields; struct specific_fields { WORD BitsPerSample; } s_fields; DWORD data_id; DWORD data_len; /******** End of wave format definitions *********/ /* Default recording values */ unsigned int sign = 0; unsigned int bits = 8; unsigned int stereo = 0; unsigned int rate = 22050; unsigned int time = 10; int old_stdin; struct termios old_tty, new_tty; int audio, file; void usage() { fprintf(stderr, "Usage: recwav [-b -s -r] file_name\n"); exit(-1); } void terminate(s) int s; { /* Restore terminal parameters */ tcsetattr(0, TCSANOW, &old_tty); (void) fcntl(0,F_SETFL,old_stdin); close(audio); close(file); exit(0); } void write_wave_header() { /* RIFF fields */ r_fields.RIFF_id = RIFF_ID; r_fields.WAVE_id1 = WAVE_ID1; r_fields.WAVE_id2 = WAVE_ID2; r_fields.data_ptr = 16; r_fields.RIFF_len = 20 + r_fields.data_ptr + data_len; /* MicroSoft PCM specific fields */ s_fields.BitsPerSample = bits; /* Common fields */ c_fields.FormatTag = MS_PCM_FORMAT; c_fields.Channels = stereo + 1; c_fields.SamplesPerSec = rate; c_fields.AvgBytesPerSec = c_fields.Channels * rate * (bits / 8); c_fields.BlockAlign = c_fields.Channels * (bits / 8); /* Data chunk */ data_id = DATA_ID; /* Write wave-file header */ lseek(file, 0L, SEEK_SET); write(file, &r_fields, 20); write(file, &c_fields, 14); write(file, &s_fields, 2); write(file, &data_id, sizeof(data_id)); write(file, &data_len, sizeof(data_len)); } void main(argc, argv) int argc; char **argv; { unsigned int fragment_size; char *buffer, *file_name; char c; int i; /* Read parameters */ if (argc < 2) usage(); i = 1; while (argv[i][0] == '-' && i < argc) { if (strncmp(argv[i], "-b", 2) == 0) bits = atoi(argv[i] + 2); else if (strncmp(argv[i], "-s", 2) == 0) stereo = atoi(argv[i] + 2); else if (strncmp(argv[i], "-r", 2) == 0) rate = (unsigned int) atol(argv[i] + 2); else usage(); i++; } if (i == argc) usage(); file_name = argv[i]; /* Some sanity checks */ if ((bits != 8 && bits != 16) || (rate < 4000 || rate > 44100) || (stereo != 0 && stereo != 1)) { fprintf(stderr, "Invalid parameters\n"); exit(-1); } /* Open DSP */ if ((audio = open("/dev/audio", O_RDWR)) < 0) { fprintf(stderr, "Cannot open /dev/audio\n"); exit(-1); } /* Get maximum fragment size and try to allocate a buffer */ ioctl(audio, DSPIOMAX, &fragment_size); if ((buffer = malloc(fragment_size)) == (char *) 0) { fprintf(stderr, "Cannot allocate buffer\n"); exit(-1); } /* Set sample parameters */ ioctl(audio, DSPIOSIZE, &fragment_size); ioctl(audio, DSPIOSTEREO, &stereo); ioctl(audio, DSPIORATE, &rate); ioctl(audio, DSPIOBITS, &bits); sign = (bits == 16 ? 1 : 0); ioctl(audio, DSPIOSIGN, &sign); /* Create sample file */ if ((file = creat(file_name, 511)) < 0) { fprintf(stderr, "Cannot create %s\n", argv[1]); exit(-1); } /* Skip wave header */ lseek(file, (long)(sizeof(r_fields) + sizeof(c_fields) + sizeof(s_fields) + sizeof(data_id) + sizeof(data_len)), SEEK_SET); printf("\nBits per sample : %u\n", bits); printf("Stereo : %s\n", (stereo == 1 ? "yes" : "no")); printf("Samples per second: %u\n", rate); /* Set terminal parameters and remember the old ones */ tcgetattr(0, &old_tty); new_tty = old_tty; new_tty.c_lflag &= ~(ICANON|ECHO); old_stdin = fcntl(0, F_GETFL); /* Catch break signal to be able to restore terminal parameters in case * of a user interrupt */ signal(SIGINT, terminate); /* Go to non-blocking mode */ tcsetattr(0, TCSANOW, &new_tty); (void) fcntl(0, F_SETFL, old_stdin | O_NONBLOCK); printf("\nPress spacebar to start sampling...\n"); while(!(read(0, &c, 1) == 1 && c == ' ')); printf("Sampling, press spacebar to stop...\n"); while(!(read(0, &c, 1) == 1 && c == ' ')) { /* Read sample fragment and write to sample file */ read(audio, buffer, fragment_size); write(file, buffer, fragment_size); data_len+= fragment_size; } printf("%ld bytes sampled. \n\n", data_len); /* Construct the wave header in front of the raw sample data */ write_wave_header(); /* Restore terminal parameters and exit */ terminate(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* repartition 1.17 - Load a partition table Author: Kees J. Bot * 30 Nov 1991 */ #define nil 0 #include <stdio.h> #include <sys/types.h> #include <sys/ioctl.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <minix/config.h> #include <minix/const.h> #include <minix/partition.h> #include <minix/u64.h> #include <ibm/partition.h> #include <sys/stat.h> #include <string.h> #include <errno.h> #include <dirent.h> #include <limits.h> #define DEV_FD0 0x200 #define SECTOR_SIZE 512 #define arraysize(a) (sizeof(a)/sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) char *arg0; char *dev_file; /* Device to repartition. */ #ifndef S_ISLNK /* There were no symlinks in medieval times. */ #define lstat stat #endif void report(const char *label) { fprintf(stderr, "%s: %s: %s\n", arg0, label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } #ifndef makedev #define minor(dev) (((dev) >> MINOR) & BYTE) #define major(dev) (((dev) >> MAJOR) & BYTE) #define makedev(major, minor) \ ((dev_t) (((major) << MAJOR) | ((minor) << MINOR))) #endif #define MINOR_d0p0s0 128 void partsort(struct part_entry *pe) /* DOS has the misguided idea that partition tables must be sorted. */ { int i,j; struct part_entry tmp; for (i = 0; i < NR_PARTITIONS; i++) for (j = 0; j < NR_PARTITIONS-1; j++) if ((pe[j].sysind == NO_PART && pe[j+1].sysind != NO_PART) || (pe[j].lowsec > pe[j+1].lowsec && pe[j+1].sysind != NO_PART)) { tmp = pe[j]; pe[j] = pe[j+1]; pe[j+1] = tmp; } } char *finddev(dev_t device) /* Find the device next to dev_file with the given device number. */ { DIR *dp; struct dirent *de; static char name[PATH_MAX]; char *np; size_t nlen; struct stat st; if ((np= strrchr(dev_file, '/')) == nil) np= dev_file; else np++; nlen= np - dev_file; if (nlen > PATH_MAX - NAME_MAX - 1) { fprintf(stderr, "%s: %s: Name is way too long\n", arg0, dev_file); exit(1); } memcpy(name, dev_file, nlen); if ((dp= opendir("/dev")) == nil) fatal("/dev"); while ((de= readdir(dp)) != nil) { strcpy(name+nlen, de->d_name); if (lstat(name, &st) == 0 && (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) && st.st_rdev == device ) { closedir(dp); return name; } } fprintf(stderr, "%s: Can't find partition devices associated with %s\n", arg0, dev_file); exit(1); } #define DSETP 0 #define DGETP 1 int diocntl(dev_t device, int request, struct partition *entry) /* Get or set the geometry of a device. */ { char *name; int r, f, err; struct partition geometry; name= finddev(device); if ((f= open(name, O_RDONLY)) < 0) return -1; r= ioctl(f, request == DSETP ? DIOCSETP : DIOCGETP, (void *) entry); err= errno; (void) close(f); errno= err; return r; } struct partition geometry; /* Geometry of the device. */ void print_chs(unsigned long sector) { unsigned secspcyl = geometry.heads * geometry.sectors; int delta= 0; if (sector == -1) { sector= 0; delta= -1; } printf(" %4d/%03d/%02d", (int) (sector / secspcyl), (int) (sector % secspcyl) / geometry.sectors, (int) (sector % geometry.sectors) + delta); } void show_part(char *name, unsigned long base, unsigned long size) { int i; static int len= 0; if (len == 0) { len= strlen(name) + 3; printf("device"); for (i = 6; i < len; i++) fputc(' ', stdout); printf( " first last base size kb\n"); } printf("%s", name); for (i = strlen(name); i < len; i++) fputc(' ', stdout); print_chs(base); print_chs(base + size - 1); printf(" %8lu %8lu %7lu\n", base, size, size / (1024/SECTOR_SIZE)); } int main(int argc, char **argv) { struct stat hdst; struct partition whole, entry; struct part_entry table[4], *pe; int drive, par, device, incr; int partf; char *table_file; int hd_major, hd_minor; int needsort; int shrink; /* True if partitions are shrinked to fit. */ unsigned long base, size, limit; if ((arg0= strrchr(argv[0], '/')) == nil) arg0= argv[0]; else arg0++; if (argc < 2 || argc > 3) { fprintf(stderr, "Usage: %s device [partition-file]\n", arg0); exit(1); } dev_file= argv[1]; table_file= argv[argc - 1]; shrink= (argc == 2); if (stat(dev_file, &hdst) < 0) fatal(dev_file); /* Geometry (to print nice numbers.) */ if (diocntl(hdst.st_rdev, DGETP, &geometry) < 0) fatal(dev_file); if (!S_ISBLK(hdst.st_mode)) { fprintf(stderr, "%s: %s is not a device\n", arg0, dev_file); exit(1); } hd_major= major(hdst.st_rdev); hd_minor= minor(hdst.st_rdev); if (hd_minor >= MINOR_d0p0s0) { errno= EINVAL; fatal(dev_file); } if (hd_major == major(DEV_FD0)) { /* HD is actually a floppy. */ if (hd_minor >= 4) { errno= EINVAL; fatal(dev_file); } device= hd_minor + (28 << 2); incr= 4; needsort= 0; } else if (hd_minor % (1 + NR_PARTITIONS) == 0) { /* Partitioning hd0, hd5, ... */ device= hd_minor + 1; incr= 1; needsort= 1; } else { /* Subpartitioning hd[1-4], hd[6-9], ... */ drive= hd_minor / (1 + NR_PARTITIONS); par= hd_minor % (1 + NR_PARTITIONS) - 1; device= MINOR_d0p0s0 + (drive * NR_PARTITIONS + par) * NR_PARTITIONS; if (device + NR_PARTITIONS - 1 > BYTE) { errno= EINVAL; fatal(dev_file); } incr= 1; needsort= 0; } /* Device is now the first of the minor devices to be repartitioned. */ /* Read the partition table from the boot block. */ if ((partf= open(table_file, O_RDONLY)) < 0 || lseek(partf, (off_t) PART_TABLE_OFF, SEEK_SET) == -1 || (par= read(partf, (char *) table, (int) sizeof(table))) < 0 ) fatal(table_file); if (par < sizeof(table)) { fprintf(stderr, "%s: %s does not contain a partition table\n", arg0, table_file); exit(1); } if (needsort) partsort(table); /* Show the geometry of the affected drive or partition. */ if (diocntl(hdst.st_rdev, DGETP, &whole) < 0) fatal(dev_file); /* Use sector numbers. */ base = div64u(whole.base, SECTOR_SIZE); size = div64u(whole.size, SECTOR_SIZE); limit = base + size; show_part(dev_file, base, size); /* Send the partition table entries to the device driver. */ for (par= 0; par < NR_PARTITIONS; par++, device+= incr) { pe = &table[par]; if (shrink && pe->size != 0) { /* Shrink the partition entry to fit within the * enclosing device just like the driver does. */ unsigned long part_limit= pe->lowsec + pe->size; if (part_limit < pe->lowsec) part_limit= limit; if (part_limit > limit) part_limit= limit; if (pe->lowsec < base) pe->lowsec= base; if (part_limit < pe->lowsec) part_limit= pe->lowsec; pe->size= part_limit - pe->lowsec; } entry.base= mul64u(pe->lowsec, SECTOR_SIZE); entry.size= mul64u(pe->size, SECTOR_SIZE); if (diocntl(makedev(hd_major, device), DSETP, &entry) < 0) fatal(dev_file); show_part(finddev(makedev(hd_major, device)), pe->lowsec, pe->size); } exit(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* screendump 1.2 - dump the contents of the console * Author: Kees J. Bot * 16 Dec 1994 */ #define nil 0 #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <termios.h> #include <sys/ioctl.h> #define BIOS_CRTBASE 0x00463L /* BIOS parameters: CRT base. */ #define CRTBASE_MONO 0x03B4 /* Value of CRT base for mono mode. */ #define MONO_BASE 0xB0000L /* Screen memory in monochrome mode. */ #define COLOR_BASE 0xB8000L /* ... colour mode. */ #define DEF_COLS 80 /* Default screen geometry. */ #define DEF_ROWS 25 #define MAX_COLS 132 /* Maximum screen geometry. */ #define MAX_ROWS 60 char MEMORY[] = "/dev/mem"; /* Memory device to read screen. */ int mfd; /* Open memory device. */ void tell(const char *message) { write(2, message, strlen(message)); } void fatal(const char *label) { const char *err= strerror(errno); tell("screendump: "); tell(label); tell(": "); tell(err); tell("\n"); exit(1); } long video_base(void) /* Is it monochrome or colour? */ { static unsigned short bios_crtbase; if (lseek(mfd, (off_t) BIOS_CRTBASE, SEEK_SET) == -1) fatal(MEMORY); switch (read(mfd, &bios_crtbase, sizeof(bios_crtbase))) { case -1: fatal(MEMORY); default: tell("screendump: can't obtain BIOS parameter: short read\n"); exit(1); case sizeof(bios_crtbase): /* Fine */; } return bios_crtbase == CRTBASE_MONO ? MONO_BASE : COLOR_BASE; } void main(void) { static unsigned char screen[MAX_COLS * MAX_ROWS * 2]; unsigned char *ps; long base; int lfd; int row; int nrows, ncols; struct winsize winsize; /* Open the memory device. */ if ((mfd= open(MEMORY, O_RDONLY)) < 0) fatal(MEMORY); base= video_base(); /* Read screen memory. */ if (lseek(mfd, base, SEEK_SET) == -1) fatal(MEMORY); switch (read(mfd, screen, sizeof(screen))) { case -1: fatal(MEMORY); default: tell("screendump: can't obtain screen dump: short read\n"); exit(1); case sizeof(screen): /* Fine */; } /* Try to obtain the screen geometry from /dev/log. */ ncols= DEF_COLS; nrows= DEF_ROWS; if ((lfd= open("/dev/log", O_WRONLY)) != -1 && ioctl(lfd, TIOCGWINSZ, &winsize) == 0 ) { if (40 <= winsize.ws_col && winsize.ws_col <= MAX_COLS) { ncols= winsize.ws_col; } if (25 <= winsize.ws_row && winsize.ws_row <= MAX_COLS) { nrows= winsize.ws_row; } } if (lfd != -1) close(lfd); /* Print the contents of the screen line by line. Omit trailing * blanks. Note that screen memory consists of pairs of characters * and attribute bytes. */ ps= screen; for (row= 0; row < nrows; row++) { char line[MAX_COLS + 1]; char *pl= line; int column; int blanks= 0; for (column= 0; column < ncols; column++) { if (*ps <= ' ') { /* Skip trailing junk. */ blanks++; } else { /* Reinsert blanks and add a character. */ while (blanks > 0) { *pl++= ' '; blanks--; } *pl++= *ps; } /* Skip character and attribute byte. */ ps+= 2; } *pl++= '\n'; if (write(1, line, pl - line) < 0) fatal("stdout"); } exit(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sdump - dump memory */ #include <minix/config.h> #include <sys/types.h> #include <minix/const.h> #include <minix/type.h> #include <signal.h> #undef EXTERN #define EXTERN #include "../../mm/const.h" #include "../../mm/type.h" #include "../../mm/mproc.h" #include "../../kernel/const.h" #include "../../kernel/type.h" #include "../../kernel/proc.h" #undef printf /* printf was misdefined by the sys headers */ #include <ctype.h> #include <fcntl.h> #include <limits.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> #define STACK_BYTES 30000 char *default_core = "core"; int stack[STACK_BYTES / sizeof (int)]; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void read_segmap, (int fd, struct mproc *mp, long *seg_size)); _PROTOTYPE(void read_registers, (int fd, struct proc *p)); _PROTOTYPE(void dump_stack, (int fd, struct mproc *mp, long *seg_size)); _PROTOTYPE(void error, (char *s1, char *s2)); int main(argc, argv) int argc; char *argv[]; { int fd; long seg_size[NR_SEGS]; /* segment sizes in bytes */ struct mproc *mp; struct proc *p; char *file; if (argc > 2) error("Usage: rdump [core_file]\n", ""); if (argc == 1) file = default_core; else file = argv[1]; if ( (fd = open(file, O_RDONLY)) < 0) error("Cannot open", file); mp = &mproc[0]; p = &proc[0]; read_segmap(fd, mp, seg_size); read_registers(fd, p); dump_stack(fd, mp, seg_size); return(0); } void read_segmap(fd, mp, seg_size) int fd; struct mproc *mp; long seg_size[NR_SEGS]; { int i, segmap_size; /* Read in the segment map. */ segmap_size = sizeof mp->mp_seg; if (read(fd, (char *) mp, segmap_size) != segmap_size) error("Cannot read segmap map from core image file", ""); for (i = 0; i < NR_SEGS; i++) seg_size[i] = (long) mp->mp_seg[i].mem_len << CLICK_SHIFT; printf("Seg sizes in bytes: Text: %ld Data: %ld, Stack: %ld\n", seg_size[T], seg_size[D], seg_size[S]); } void read_registers(fd, p) int fd; struct proc *p; { int proctblsize; struct stackframe_s r; proctblsize = sizeof (struct proc); if (read(fd, (char *) p, proctblsize) != proctblsize) error("Cannot read process table from core image file", ""); r = p->p_reg; /* Print proc table. */ printf("\n"); #if (CHIP == INTEL) #if _WORD_SIZE == 4 printf("eax=%8lX ebx=%8lX ecx=%8lX edx=%8lX\n", r.retreg, r.bx, r.cx, r.dx); printf("esi=%8lX edi=%8lX ebp=%8lX esp=%8lX eip=%8lX\n", r.si, r.di, r.fp, r.sp, r.pc); printf(" ds=%8lX es=%8lX ss=%8lX cs=%8lX\n", r.ds, r.es, r.ss, r.cs); printf(" fs=%8lX gs=%8lX ef=%8lX\n", r.fs, r.gs, r.psw); #else printf( "ax=%4X bx=%4X cx=%4X dx=%4X si=%4X di=%4X bp=%4X sp=%4X ip=%4X\n", r.retreg, r.bx, r.cx, r.dx, r.si, r.di, r.fp, r.sp, r.pc); printf( " f=%4X ds=%4X es=%4X ss=%4X cs=%4X\n", r.psw, r.ds, r.es, r.ss, r.cs); #endif #endif /* (CHIP == INTEL) */ #if (CHIP == M68000) printf("pc=%8lx psw=%4x\n", r.pc, r.psw); printf("d0=%8lx d1=%8lx d2=%8lx d3=%8lx\n", r.retreg, r.d1, r.d2, r.d3); printf("d4=%8lx d5=%8lx d6=%8lx d7=%8lx\n", r.d4, r.d5, r.d6, r.d7); printf("a0=%8lx a1=%8lx a2=%8lx a3=%8lx\n", r.a0, r.a1, r.a2, r.a3); printf("a4=%8lx a5=%8lx a6=%8lx a7=%8lx\n", r.a4, r.a5, r.a6, r.sp); #endif printf("\n"); } void dump_stack(fd, mp, seg_size) int fd; struct mproc *mp; long seg_size[NR_SEGS]; { unsigned char ch; char format[32]; int word, i, stack_size, j; vir_bytes v, vi; /* Seek past text and data segments. */ lseek(fd, seg_size[T] + seg_size[D], SEEK_CUR); v = mp->mp_seg[S].mem_vir << CLICK_SHIFT; stack_size = (int) seg_size[S]; if (stack_size != seg_size[S] || stack_size < 0 || stack_size > STACK_BYTES) error("Stack too large", ""); /* Dump the stack. */ if (read(fd, (char *) stack, stack_size) != stack_size) error("Error reading stack from core file", ""); #define BYTES(num) ((unsigned) sizeof (num)) #define DEC_DIGITS(num) (sizeof (num) <= 2 ? 6 : 11) /* for 16/32 bit num */ #define HEX_DIGITS(num) (((unsigned) sizeof (num) * CHAR_BIT + 3) / 4) printf("%*s %*s %*s %*s\n", HEX_DIGITS(vi), "Addr", HEX_DIGITS(word), "Hex", DEC_DIGITS(word), "Dec", BYTES(word), "Char"); /* The format string depends messily on the size of various things. */ strcpy(format, "%*"); if (sizeof v > sizeof (int)) strcat(format, "l"); strcat(format, "X: %*"); if (sizeof word > sizeof (int)) strcat(format, "l"); strcat(format, "X %*"); if (sizeof word > sizeof (int)) strcat(format, "l"); strcat(format, "d "); for (i = stack_size / sizeof (int) - 1, vi = v + stack_size - sizeof (int); i >= 0; --i, vi -= sizeof (int)) { word = stack[i]; printf(format, HEX_DIGITS(vi), vi, HEX_DIGITS(word), word, DEC_DIGITS(word), word); for (j = 0; j < BYTES(word); ++j, word >>= CHAR_BIT) { ch = (unsigned char) word; if (!isprint(ch)) ch = '.'; putchar(ch); } putchar('\n'); } } void error(s1, s2) char *s1, *s2; { printf("%s %s\n", s1, s2); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������< .�������������..������������= tab.c���������> tab.h���������? Makefile������@ misc.h��������A cron.c��������B misc.c��������C crontab.c���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tab.c - process crontabs and create in-core crontab data * Author: Kees J. Bot * 7 Dec 1996 * Changes: * 17 Jul 2000 by Philip Homburg * - Tab_reschedule() rewritten (and fixed). */ #define nil ((void*)0) #include <sys/types.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <limits.h> #include <time.h> #include <dirent.h> #include <sys/stat.h> #include "misc.h" #include "tab.h" static int nextbit(bitmap_t map, int bit) /* Return the next bit set in 'map' from 'bit' onwards, cyclic. */ { for (;;) { bit= (bit+1) & 63; if (bit_isset(map, bit)) break; } return bit; } void tab_reschedule(cronjob_t *job) /* Reschedule one job. Compute the next time to run the job in job->rtime. */ { struct tm prevtm, nexttm, tmptm; time_t nodst_rtime, dst_rtime; /* AT jobs are only run once. */ if (job->atjob) { job->rtime= NEVER; return; } /* Was the job scheduled late last time? */ if (job->late) job->rtime= now; prevtm= *localtime(&job->rtime); prevtm.tm_sec= 0; nexttm= prevtm; nexttm.tm_min++; /* Minimal increment */ for (;;) { if (nexttm.tm_min > 59) { nexttm.tm_min= 0; nexttm.tm_hour++; } if (nexttm.tm_hour > 23) { nexttm.tm_min= 0; nexttm.tm_hour= 0; nexttm.tm_mday++; } if (nexttm.tm_mday > 31) { nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mday= 1; nexttm.tm_mon++; } if (nexttm.tm_mon >= 12) { nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mday= 1; nexttm.tm_mon= 0; nexttm.tm_year++; } /* Verify tm_year. A crontab entry cannot restrict tm_year * directly. However, certain dates (such as Feb, 29th) do * not occur every year. We limit the difference between * nexttm.tm_year and prevtm.tm_year to detect impossible dates * (e.g, Feb, 31st). In theory every date occurs within a * period of 4 years. However, some years at the end of a * century are not leap years (e.g, the year 2100). An extra * factor of 2 should be enough. */ if (nexttm.tm_year-prevtm.tm_year > 2*4) { job->rtime= NEVER; return; /* Impossible combination */ } if (!job->do_wday) { /* Verify the mon and mday fields. If do_wday and * do_mday are both true we have to merge both * schedules. This is done after the call to mktime. */ if (!bit_isset(job->mon, nexttm.tm_mon)) { /* Clear other fields */ nexttm.tm_mday= 1; nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mon++; continue; } /* Verify mday */ if (!bit_isset(job->mday, nexttm.tm_mday)) { /* Clear other fields */ nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mday++; continue; } } /* Verify hour */ if (!bit_isset(job->hour, nexttm.tm_hour)) { /* Clear tm_min field */ nexttm.tm_min= 0; nexttm.tm_hour++; continue; } /* Verify min */ if (!bit_isset(job->min, nexttm.tm_min)) { nexttm.tm_min++; continue; } /* Verify that we don't have any problem with DST. Try * tm_isdst=0 first. */ tmptm= nexttm; tmptm.tm_isdst= 0; #if 0 fprintf(stderr, "tab_reschedule: trying %04d-%02d-%02d %02d:%02d:%02d isdst=0\n", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); #endif nodst_rtime= job->rtime= mktime(&tmptm); if (job->rtime == -1) { /* This should not happen. */ log(LOG_ERR, "mktime failed for %04d-%02d-%02d %02d:%02d:%02d", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); job->rtime= NEVER; return; } if (tmptm.tm_hour != nexttm.tm_hour || tmptm.tm_min != nexttm.tm_min) { assert(tmptm.tm_isdst); tmptm= nexttm; tmptm.tm_isdst= 1; #if 0 fprintf(stderr, "tab_reschedule: trying %04d-%02d-%02d %02d:%02d:%02d isdst=1\n", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); #endif dst_rtime= job->rtime= mktime(&tmptm); if (job->rtime == -1) { /* This should not happen. */ log(LOG_ERR, "mktime failed for %04d-%02d-%02d %02d:%02d:%02d\n", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); job->rtime= NEVER; return; } if (tmptm.tm_hour != nexttm.tm_hour || tmptm.tm_min != nexttm.tm_min) { assert(!tmptm.tm_isdst); /* We have a problem. This time neither * exists with DST nor without DST. * Use the latest time, which should be * nodst_rtime. */ assert(nodst_rtime > dst_rtime); job->rtime= nodst_rtime; #if 0 fprintf(stderr, "During DST trans. %04d-%02d-%02d %02d:%02d:%02d\n", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); #endif } } /* Verify this the combination (tm_year, tm_mon, tm_mday). */ if (tmptm.tm_mday != nexttm.tm_mday || tmptm.tm_mon != nexttm.tm_mon || tmptm.tm_year != nexttm.tm_year) { /* Wrong day */ #if 0 fprintf(stderr, "Wrong day\n"); #endif nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mday++; continue; } /* Check tm_wday */ if (job->do_wday && bit_isset(job->wday, tmptm.tm_wday)) { /* OK, wday matched */ break; } /* Check tm_mday */ if (job->do_mday && bit_isset(job->mon, tmptm.tm_mon) && bit_isset(job->mday, tmptm.tm_mday)) { /* OK, mon and mday matched */ break; } if (!job->do_wday && !job->do_mday) { /* No need to match wday and mday */ break; } /* Wrong day */ #if 0 fprintf(stderr, "Wrong mon+mday or wday\n"); #endif nexttm.tm_hour= nexttm.tm_min= 0; nexttm.tm_mday++; } #if 0 fprintf(stderr, "Using %04d-%02d-%02d %02d:%02d:%02d \n", 1900+nexttm.tm_year, nexttm.tm_mon+1, nexttm.tm_mday, nexttm.tm_hour, nexttm.tm_min, nexttm.tm_sec); tmptm= *localtime(&job->rtime); fprintf(stderr, "Act. %04d-%02d-%02d %02d:%02d:%02d isdst=%d\n", 1900+tmptm.tm_year, tmptm.tm_mon+1, tmptm.tm_mday, tmptm.tm_hour, tmptm.tm_min, tmptm.tm_sec, tmptm.tm_isdst); #endif /* Is job issuing lagging behind with the progress of time? */ job->late= (job->rtime < now); /* The result is in job->rtime. */ if (job->rtime < next) next= job->rtime; } #define isdigit(c) ((unsigned) ((c) - '0') < 10) static char *get_token(char **ptr) /* Return a pointer to the next token in a string. Move *ptr to the end of * the token, and return a pointer to the start. If *ptr == start of token * then we're stuck against a newline or end of string. */ { char *start, *p; p= *ptr; while (*p == ' ' || *p == '\t') p++; start= p; while (*p != ' ' && *p != '\t' && *p != '\n' && *p != 0) p++; *ptr= p; return start; } static int range_parse(char *file, char *data, bitmap_t map, int min, int max, int *wildcard) /* Parse a comma separated series of 'n', 'n-m' or 'n:m' numbers. 'n' * includes number 'n' in the bit map, 'n-m' includes all numbers between * 'n' and 'm' inclusive, and 'n:m' includes 'n+k*m' for any k if in range. * Numbers must fall between 'min' and 'max'. A '*' means all numbers. A * '?' is allowed as a synonym for the current minute, which only makes sense * in the minute field, i.e. max must be 59. Return true iff parsed ok. */ { char *p; int end; int n, m; /* Clear all bits. */ for (n= 0; n < 8; n++) map[n]= 0; p= data; while (*p != ' ' && *p != '\t' && *p != '\n' && *p != 0) p++; end= *p; *p= 0; p= data; if (*p == 0) { log(LOG_ERR, "%s: not enough time fields\n", file); return 0; } /* Is it a '*'? */ if (p[0] == '*' && p[1] == 0) { for (n= min; n <= max; n++) bit_set(map, n); p[1]= end; *wildcard= 1; return 1; } *wildcard= 0; /* Parse a comma separated series of numbers or ranges. */ for (;;) { if (*p == '?' && max == 59 && p[1] != '-') { n= localtime(&now)->tm_min; p++; } else { if (!isdigit(*p)) goto syntax; n= 0; do { n= 10 * n + (*p++ - '0'); if (n > max) goto range; } while (isdigit(*p)); } if (n < min) goto range; if (*p == '-') { /* A range of the form 'n-m'? */ p++; dH��fH��gH��hH��iH��jH��kH��lH��mH��nH��oH��pH������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ if (!isdigit(*p)) goto syntax; m= 0; do { m= 10 * m + (*p++ - '0'); if (m > max) goto range; } while (isdigit(*p)); if (m < n) goto range; do { bit_set(map, n); } while (++n <= m); } else if (*p == ':') { /* A repeat of the form 'n:m'? */ p++; if (!isdigit(*p)) goto syntax; m= 0; do { m= 10 * m + (*p++ - '0'); if (m > (max-min+1)) goto range; } while (isdigit(*p)); if (m == 0) goto range; while (n >= min) n-= m; while ((n+= m) <= max) bit_set(map, n); } else { /* Simply a number */ bit_set(map, n); } if (*p == 0) break; if (*p++ != ',') goto syntax; } *p= end; return 1; syntax: log(LOG_ERR, "%s: field '%s': bad syntax for a %d-%d time field\n", file, data, min, max); return 0; range: log(LOG_ERR, "%s: field '%s': values out of the %d-%d allowed range\n", file, data, min, max); return 0; } void tab_parse(char *file, char *user) /* Parse a crontab file and add its data to the tables. Handle errors by * yourself. Table is owned by 'user' if non-null. */ { crontab_t **atab, *tab; cronjob_t **ajob, *job; int fd; struct stat st; char *p, *q; size_t n; ssize_t r; int ok, wc; for (atab= &crontabs; (tab= *atab) != nil; atab= &tab->next) { if (strcmp(file, tab->file) == 0) break; } /* Try to open the file. */ if ((fd= open(file, O_RDONLY)) < 0 || fstat(fd, &st) < 0) { if (errno != ENOENT) { log(LOG_ERR, "%s: %s\n", file, strerror(errno)); } if (fd != -1) close(fd); return; } /* Forget it if the file is awfully big. */ if (st.st_size > TAB_MAX) { log(LOG_ERR, "%s: %lu bytes is bigger than my %lu limit\n", file, (unsigned long) st.st_size, (unsigned long) TAB_MAX); return; } /* If the file is the same as before then don't bother. */ if (tab != nil && st.st_mtime == tab->mtime) { close(fd); tab->current= 1; return; } /* Create a new table structure. */ tab= allocate(sizeof(*tab)); tab->file= allocate((strlen(file) + 1) * sizeof(tab->file[0])); strcpy(tab->file, file); tab->user= nil; if (user != nil) { tab->user= allocate((strlen(user) + 1) * sizeof(tab->user[0])); strcpy(tab->user, user); } tab->data= allocate((st.st_size + 1) * sizeof(tab->data[0])); tab->jobs= nil; tab->mtime= st.st_mtime; tab->current= 0; tab->next= *atab; *atab= tab; /* Pull a new table in core. */ n= 0; while (n < st.st_size) { if ((r = read(fd, tab->data + n, st.st_size - n)) < 0) { log(LOG_CRIT, "%s: %s", file, strerror(errno)); close(fd); return; } if (r == 0) break; n+= r; } close(fd); tab->data[n]= 0; if (strlen(tab->data) < n) { log(LOG_ERR, "%s contains a null character\n", file); return; } /* Parse the file. */ ajob= &tab->jobs; p= tab->data; ok= 1; while (ok && *p != 0) { q= get_token(&p); if (*q == '#' || q == p) { /* Comment or empty. */ while (*p != 0 && *p++ != '\n') {} continue; } /* One new job coming up. */ *ajob= job= allocate(sizeof(*job)); *(ajob= &job->next)= nil; job->tab= tab; if (!range_parse(file, q, job->min, 0, 59, &wc)) { ok= 0; break; } q= get_token(&p); if (!range_parse(file, q, job->hour, 0, 23, &wc)) { ok= 0; break; } q= get_token(&p); if (!range_parse(file, q, job->mday, 1, 31, &wc)) { ok= 0; break; } job->do_mday= !wc; q= get_token(&p); if (!range_parse(file, q, job->mon, 1, 12, &wc)) { ok= 0; break; } job->do_mday |= !wc; q= get_token(&p); if (!range_parse(file, q, job->wday, 0, 7, &wc)) { ok= 0; break; } job->do_wday= !wc; /* 7 is Sunday, but 0 is a common mistake because it is in the * tm_wday range. We allow and even prefer it internally. */ if (bit_isset(job->wday, 7)) { bit_clr(job->wday, 7); bit_set(job->wday, 0); } /* The month range is 1-12, but tm_mon likes 0-11. */ job->mon[0] >>= 1; if (bit_isset(job->mon, 8)) bit_set(job->mon, 7); job->mon[1] >>= 1; /* Scan for options. */ job->user= nil; while (q= get_token(&p), *q == '-') { q++; if (q[0] == '-' && q+1 == p) { /* -- */ q= get_token(&p); break; } while (q < p) switch (*q++) { case 'u': if (q == p) q= get_token(&p); if (q == p) goto usage; memmove(q-1, q, p-q); /* gross... */ p[-1]= 0; job->user= q-1; q= p; break; default: usage: log(LOG_ERR, "%s: bad option -%c, good options are: -u username\n", file, q[-1]); ok= 0; goto endtab; } } /* A crontab owned by a user can only do things as that user. */ if (tab->user != nil) job->user= tab->user; /* Inspect the first character of the command. */ job->cmd= q; if (q == p || *q == '#') { /* Rest of the line is empty, i.e. the commands are on * the following lines indented by one tab. */ while (*p != 0 && *p++ != '\n') {} if (*p++ != '\t') { log(LOG_ERR, "%s: contains an empty command\n", file); ok= 0; goto endtab; } while (*p != 0) { if ((*q = *p++) == '\n') { if (*p != '\t') break; p++; } q++; } } else { /* The command is on this line. Alas we must now be * backwards compatible and change %'s to newlines. */ p= q; while (*p != 0) { if ((*q = *p++) == '\n') break; if (*q == '%') *q= '\n'; q++; } } *q= 0; job->rtime= now; job->late= 0; /* It is on time. */ job->atjob= 0; /* True cron job. */ job->pid= IDLE_PID; /* Not running yet. */ tab_reschedule(job); /* Compute next time to run. */ } endtab: if (ok) tab->current= 1; } void tab_find_atjob(char *atdir) /* Find the first to be executed AT job and kludge up an crontab job for it. * We set tab->file to "atdir/jobname", tab->data to "atdir/past/jobname", * and job->cmd to "jobname". */ { DIR *spool; struct dirent *entry; time_t t0, t1; struct tm tmnow, tmt1; static char template[] = "96.365.1546.00"; char firstjob[sizeof(template)]; int i; crontab_t *tab; cronjob_t *job; if ((spool= opendir(atdir)) == nil) return; tmnow= *localtime(&now); t0= NEVER; while ((entry= readdir(spool)) != nil) { /* Check if the name fits the template. */ for (i= 0; template[i] != 0; i++) { if (template[i] == '.') { if (entry->d_name[i] != '.') break; } else { if (!isdigit(entry->d_name[i])) break; } } if (template[i] != 0 || entry->d_name[i] != 0) continue; /* Convert the name to a time. Careful with the century. */ memset(&tmt1, 0, sizeof(tmt1)); tmt1.tm_year= atoi(entry->d_name+0); while (tmt1.tm_year < tmnow.tm_year-10) tmt1.tm_year+= 100; tmt1.tm_mday= 1+atoi(entry->d_name+3); tmt1.tm_min= atoi(entry->d_name+7); tmt1.tm_hour= tmt1.tm_min / 100; tmt1.tm_min%= 100; tmt1.tm_isdst= -1; if ((t1= mktime(&tmt1)) == -1) { /* Illegal time? Try in winter time. */ tmt1.tm_isdst= 0; if ((t1= mktime(&tmt1)) == -1) continue; } if (t1 < t0) { t0= t1; strcpy(firstjob, entry->d_name); } } closedir(spool); if (t0 == NEVER) return; /* AT job spool is empty. */ /* Create new table and job structures. */ tab= allocate(sizeof(*tab)); tab->file= allocate((strlen(atdir) + 1 + sizeof(template)) * sizeof(tab->file[0])); strcpy(tab->file, atdir); strcat(tab->file, "/"); strcat(tab->file, firstjob); tab->data= allocate((strlen(atdir) + 6 + sizeof(template)) * sizeof(tab->data[0])); strcpy(tab->data, atdir); strcat(tab->data, "/past/"); strcat(tab->data, firstjob); tab->user= nil; tab->mtime= 0; tab->current= 1; tab->next= crontabs; crontabs= tab; tab->jobs= job= allocate(sizeof(*job)); job->next= nil; job->tab= tab; job->user= nil; job->cmd= tab->data + strlen(atdir) + 6; job->rtime= t0; job->late= 0; job->atjob= 1; /* One AT job disguised as a cron job. */ job->pid= IDLE_PID; if (job->rtime < next) next= job->rtime; } void tab_purge(void) /* Remove table data that is no longer current. E.g. a crontab got removed. */ { crontab_t **atab, *tab; cronjob_t *job; atab= &crontabs; while ((tab= *atab) != nil) { if (tab->current) { /* Table is fine. */ tab->current= 0; atab= &tab->next; } else { /* Table is not, or no longer valid; delete. */ *atab= tab->next; while ((job= tab->jobs) != nil) { tab->jobs= job->next; deallocate(job); } deallocate(tab->data); deallocate(tab->file); deallocate(tab->user); deallocate(tab); } } } static cronjob_t *reap_or_find(pid_t pid) /* Find a finished job or search for the next one to run. */ { crontab_t *tab; cronjob_t *job; cronjob_t *nextjob; nextjob= nil; next= NEVER; for (tab= crontabs; tab != nil; tab= tab->next) { for (job= tab->jobs; job != nil; job= job->next) { if (job->pid == pid) { job->pid= IDLE_PID; tab_reschedule(job); } if (job->pid != IDLE_PID) continue; if (job->rtime < next) next= job->rtime; if (job->rtime <= now) nextjob= job; } } return nextjob; } void tab_reap_job(pid_t pid) /* A job has finished. Try to find it among the crontab data and reschedule * it. Recompute time next to run a job. */ { (void) reap_or_find(pid); } cronjob_t *tab_nextjob(void) /* Find a job that should be run now. If none are found return null. * Update 'next'. */ { return reap_or_find(NO_PID); } static void pr_map(FILE *fp, bitmap_t map) { int last_bit= -1, bit; char *sep; sep= ""; for (bit= 0; bit < 64; bit++) { if (bit_isset(map, bit)) { if (last_bit == -1) last_bit= bit; } else { if (last_bit != -1) { fprintf(fp, "%s%d", sep, last_bit); if (last_bit != bit-1) { fprintf(fp, "-%d", bit-1); } last_bit= -1; sep= ","; } } } } void tab_print(FILE *fp) /* Print out a stored crontab file for debugging purposes. */ { crontab_t *tab; cronjob_t *job; char *p; struct tm tm; for (tab= crontabs; tab != nil; tab= tab->next) { fprintf(fp, "tab->file = \"%s\"\n", tab->file); fprintf(fp, "tab->user = \"%s\"\n", tab->user == nil ? "(root)" : tab->user); fprintf(fp, "tab->mtime = %s", ctime(&tab->mtime)); for (job= tab->jobs; job != nil; job= job->next) { if (job->atjob) { fprintf(fp, "AT job"); } else { pr_map(fp, job->min); fputc(' ', fp); pr_map(fp, job->hour); fputc(' ', fp); pr_map(fp, job->mday); fputc(' ', fp); pr_map(fp, job->mon); fputc(' ', fp); pr_map(fp, job->wday); } if (job->user != nil && job->user != tab->user) { fprintf(fp, " -u %s", job->user); } fprintf(fp, "\n\t"); for (p= job->cmd; *p != 0; p++) { fputc(*p, fp); if (*p == '\n') fputc('\t', fp); } fputc('\n', fp); tm= *localtime(&job->rtime); fprintf(fp, " rtime = %.24s%s\n", asctime(&tm), tm.tm_isdst ? " (DST)" : ""); if (job->pid != IDLE_PID) { fprintf(fp, " pid = %ld\n", (long) job->pid); } } } } /* * $PchId: tab.c,v 1.5 2000/07/25 22:07:51 philip Exp $ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tab.h - in-core crontab data Author: Kees J. Bot * 7 Dec 1996 */ #ifndef TAB__H #define TAB__H #include <sys/types.h> #include <limits.h> struct crontab; typedef unsigned char bitmap_t[8]; typedef struct cronjob { /* One entry in a crontab file */ struct cronjob *next; struct crontab *tab; /* Associated table file. */ bitmap_t min; /* Minute (0-59) */ bitmap_t hour; /* Hour (0-23) */ bitmap_t mday; /* Day of the month (1-31) */ bitmap_t mon; /* Month (1-12) */ bitmap_t wday; /* Weekday (0-7 with 0 = 7 = Sunday) */ char *user; /* User to run it as (nil = root) */ char *cmd; /* Command to run */ time_t rtime; /* When next to run */ char do_mday; /* True iff mon or mday is not '*' */ char do_wday; /* True iff wday is not '*' */ char late; /* True iff the job is late */ char atjob; /* True iff it is an AT job */ pid_t pid; /* Process-id of job if nonzero */ } cronjob_t; typedef struct crontab { struct crontab *next; char *file; /* Crontab name */ char *user; /* Owner if non-null */ time_t mtime; /* Last modified time */ cronjob_t *jobs; /* List of jobs in the file */ char *data; /* File data */ int current; /* True if current, i.e. file exists */ } crontab_t; crontab_t *crontabs; /* All crontabs. */ /* A time as far in the future as possible. */ #define NEVER ((time_t) ((time_t) -1 < 0 ? LONG_MAX : ULONG_MAX)) /* Don't trust crontabs bigger than this: */ #define TAB_MAX ((sizeof(int) == 2 ? 8 : 128) * 1024) /* Pid if no process running, or a pid value you'll never see. */ #define IDLE_PID ((pid_t) 0) #define NO_PID ((pid_t) -1) /* Bitmap operations. */ #define bit_set(map, n) ((void) ((map)[(n) >> 3] |= (1 << ((n) & 7)))) #define bit_clr(map, n) ((void) ((map)[(n) >> 3] &= ~(1 << ((n) & 7)))) #define bit_isset(map, n) (!!((map)[(n) >> 3] & (1 << ((n) & 7)))) /* Functions. */ void tab_parse(char *file, char *user); void tab_find_atjob(char *atdir); void tab_purge(void); void tab_reap_job(pid_t pid); void tab_reschedule(cronjob_t *job); cronjob_t *tab_nextjob(void); void tab_print(FILE *fp); #endif /* TAB__H */ /* * $PchId: tab.h,v 1.3 2000/07/17 07:57:27 philip Exp $ */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for cron. CFLAGS= -D_MINIX -D_POSIX_SOURCE LDFLAGS= all: cron crontab CRON_OBJ= cron.o tab.o misc.o CRONTAB_OBJ= crontab.o tab.o misc.o cron: $(CRON_OBJ) $(CC) $(LDFLAGS) -o $@ $(CRON_OBJ) install -S 8kw $@ crontab: $(CRONTAB_OBJ) $(CC) $(LDFLAGS) -o $@ $(CRONTAB_OBJ) install -S 4kw $@ install: /usr/bin/cron /usr/bin/crontab /usr/bin/cron: cron install -cs $? $@ /usr/bin/crontab: crontab install -cs -o root -m 4755 $? $@ clean: rm -f *.o cron crontab core a.out # Dependencies. cron.o crontab.o: misc.h tab.h tab.o: misc.h tab.h misc.o: misc.h �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* misc.h - miscellaneous stuff Author: Kees J. Bot * 7 Dec 1996 */ #ifndef MISC__H #define MISC__H #include <time.h> /* The name of the program. */ extern char *prog_name; /* Where cron stores it pid. */ #define PIDFILE "/usr/run/cron.pid" /* Cron's idea of the current time, and the time next to run something. */ extern time_t now; extern time_t next; /* Memory allocation. */ void *allocate(size_t len); void deallocate(void *mem); extern size_t alloc_count; /* Logging, by syslog or to stderr. */ #if __minix_vmd || !__minix #include <sys/syslog.h> #else enum log_dummy { LOG_ERR, LOG_CRIT, LOG_ALERT }; #define openlog(ident, opt, facility) ((void) 0) #define closelog() ((void) 0) #define setlogmask(mask) (0) #endif enum logto { SYSLOG, STDERR }; void selectlog(enum logto where); void log(int level, const char *fmt, ...); #endif /* MISC__H */ /* * $PchId: misc.h,v 1.3 2000/07/17 18:56:02 philip Exp $ */ ������������������������������������������������������������������������������������/* cron 1.4 - clock daemon Author: Kees J. Bot * 7 Dec 1996 */ #define _MINIX_SOURCE #define nil ((void*)0) #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <limits.h> #include <dirent.h> #include <time.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> #include <sys/stat.h> #include <sys/wait.h> #include "misc.h" #include "tab.h" #if __minix && !__minix_vmd #define initgroups(name, gid) (0) #endif static volatile int busy; /* Set when something is afoot, don't sleep! */ static volatile int need_reload;/* Set if table reload required. */ static volatile int need_quit; /* Set if cron must exit. */ static volatile int debug; /* Debug level. */ static int setenv(char *var, char *val) /* Set an environment variable. Return 0/-1 for success/failure. */ { char *env; env= malloc((strlen(var) + strlen(val) + 2) * sizeof(env[0])); if (env == nil) return -1; strcpy(env, var); strcat(env, "="); strcat(env, val); if (putenv(env) < 0) return -1; free(env); return 0; } static void run_job(cronjob_t *job) /* Execute a cron job. Register its pid in the job structure. If a job's * crontab has an owner then its output is mailed to that owner, otherwise * no special provisions are made, so the output will go where cron's output * goes. This keeps root's mailbox from filling up. */ { pid_t pid; int need_mailer; int mailfd[2], errfd[2]; struct passwd *pw; crontab_t *tab= job->tab; need_mailer= (tab->user != nil); if (job->atjob) { struct stat st; need_mailer= 1; if (rename(tab->file, tab->data) < 0) { if (errno == ENOENT) { /* Normal error, job deleted. */ need_reload= 1; } else { /* Bad error, halt processing AT jobs. */ log(LOG_CRIT, "Can't rename %s: %s\n", tab->file, strerror(errno)); tab_reschedule(job); } return; } /* Will need to determine the next AT job. */ need_reload= 1; if (stat(tab->data, &st) < 0) { log(LOG_ERR, "Can't stat %s: %s\n", tab->data, strerror(errno)); tab_reschedule(job); return; } if ((pw= getpwuid(st.st_uid)) == nil) { log(LOG_ERR, "Unknown owner for uid %lu of AT job %s\n", (unsigned long) st.st_uid, job->cmd); tab_reschedule(job); return; } } else { pw= nil; if (job->user != nil && (pw= getpwnam(job->user)) == nil) { log(LOG_ERR, "%s: Unknown user\n", job->user); tab_reschedule(job); return; } } if (need_mailer) { errfd[0]= -1; if (pipe(errfd) < 0 || pipe(mailfd) < 0) { log(LOG_ERR, "pipe() call failed: %s\n", strerror(errno)); if (errfd[0] != -1) { close(errfd[0]); close(errfd[1]); } tab_reschedule(job); return; } (void) fcntl(errfd[1], F_SETFD, fcntl(errfd[1], F_GETFD) | FD_CLOEXEC); if ((pid= fork()) == -1) { log(LOG_ERR, "fork() call failed: %s\n", strerror(errno)); close(errfd[0]); close(errfd[1]); close(mailfd[0]); close(mailfd[1]); tab_reschedule(job); return; } if (pid == 0) { /* Child that is to be the mailer. */ char subject[70+20], *ps; close(errfd[0]); close(mailfd[1]); if (mailfd[0] != 0) { dup2(mailfd[0], 0); close(mailfd[0]); } memset(subject, 0, sizeof(subject)); sprintf(subject, "Output from your %s job: %.50s", job->atjob ? "AT" : "cron", job->cmd); if (subject[70] != 0) { strcpy(subject+70-3, "..."); } for (ps= subject; *ps != 0; ps++) { if (*ps == '\n') *ps= '%'; } execl("/usr/bin/mail", "mail", "-s", subject, pw->pw_name, (char *) nil); write(errfd[1], &errno, sizeof(errno)); _exit(1); } close(mailfd[0]); close(errfd[1]); if (read(errfd[0], &errno, sizeof(errno)) > 0) { log(LOG_ERR, "can't execute /usr/bin/mail: %s\n", strerror(errno)); close(errfd[0]); close(mailfd[1]); tab_reschedule(job); return; } close(errfd[0]); } if (pipe(errfd) < 0) { log(LOG_ERR, "pipe() call failed: %s\n", strerror(errno)); if (need_mailer) close(mailfd[1]); tab_reschedule(job); return; } (void) fcntl(errfd[1], F_SETFD, fcntl(errfd[1], F_GETFD) | FD_CLOEXEC); if ((pid= fork()) == -1) { log(LOG_ERR, "fork() call failed: %s\n", strerror(errno)); close(errfd[0]); close(errfd[1]); if (need_mailer) close(mailfd[1]); tab_reschedule(job); return; } if (pid == 0) { /* Child that is to be the cron job. */ close(errfd[0]); if (need_mailer) { if (mailfd[1] != 1) { dup2(mailfd[1], 1); close(mailfd[1]); } dup2(1, 2); } if (pw != nil) { /* Change id to the owner of the job. */ initgroups(pw->pw_name, pw->pw_gid); setgid(pw->pw_gid); setuid(pw->pw_uid); chdir(pw->pw_dir); if (setenv("USER", pw->pw_name) < 0) goto bad; if (setenv("LOGNAME", pw->pw_name) < 0) goto bad; if (setenv("HOME", pw->pw_dir) < 0) goto bad; if (setenv("SHELL", pw->pw_shell[0] == 0 ? "/bin/sh" : pw->pw_shell) < 0) goto bad; } if (job->atjob) { execl("/bin/sh", "sh", tab->data, (char *) nil); } else { execl("/bin/sh", "sh", "-c", job->cmd, (char *) nil); } bad: write(errfd[1], &errno, sizeof(errno)); _exit(1); } if (need_mailer) close(mailfd[1]); close(errfd[1]); if (read(errfd[0], &errno, sizeof(errno)) > 0) { log(LOG_ERR, "can't execute /bin/sh: %s\n", strerror(errno)); close(errfd[0]); tab_reschedule(job); return; } close(errfd[0]); job->pid= pid; if (debug >= 1) fprintf(stderr, "executing >%s<, pid = %ld\n", job->cmd, (long) job->pid); } static void load_crontabs(void) /* Load all the crontabs we like to run. We didn't bother to make a list in * an array or something, this is too system specific to make nice. */ { DIR *spool; #if __minix_vmd FILE *pkgs; #endif tab_parse("/usr/lib/crontab", nil); tab_parse("/usr/local/lib/crontab", nil); tab_parse("/var/lib/crontab", nil); #if __minix_vmd if ((pkgs= fopen("/usr/lib/packages", "r")) != nil) { char name[NAME_MAX+1]; char *np; int c; char tab[sizeof("/var/opt//lib/crontab") + NAME_MAX]; while ((c= fgetc(pkgs)) != EOF) { np= name; while (c != EOF && c != '/' && c != '\n') { if (np < name+NAME_MAX) *np++ = c; c= fgetc(pkgs); } *np= 0; while (c != EOF && c != '\n') c= fgetc(pkgs); if (name[0] == 0) continue; /* ? */ strcpy(tab, "/var/opt/"); strcat(tab, name); strcat(tab, "/lib/crontab"); tab_parse(tab, nil); } if (ferror(pkgs)) { log(LOG_CRIT, "/usr/lib/packages: %s\n", strerror(errno)); } fclose(pkgs); } else { if (errno != ENOENT) { log(LOG_ERR, "/usr/lib/packages: %s\n", strerror(errno)); } } #endif /* Minix-vmd */ if ((spool= opendir("/usr/spool/crontabs")) != nil) { struct dirent *entry; char tab[sizeof("/usr/spool/crontabs/") + NAME_MAX]; while ((entry= readdir(spool)) != nil) { if (entry->d_name[0] == '.') continue; strcpy(tab, "/usr/spool/crontabs/"); strcat(tab, entry->d_name); tab_parse(tab, entry->d_name); } closedir(spool); } /* Find the first to be executed AT job. */ tab_find_atjob("/usr/spool/at"); tab_purge(); if (debug >= 2) { tab_print(stderr); fprintf(stderr, "%lu memory chunks in use\n", (unsigned long) alloc_count); } } static void handler(int sig) { switch (sig) { case SIGHUP: need_reload= 1; break; case SIGINT: case SIGTERM: need_quit= 1; break; case SIGUSR1: debug++; break; case SIGUSR2: debug= 0; break; } alarm(1); /* A signal may come just before a blocking call. */ busy= 1; } static void usage(void) { fprintf(stderr, "Usage: %s [-d[#]]\n", prog_name); exit(1); } int main(int argc, char **argv) { int i; struct sigaction sa, osa; FILE *pf; int r; prog_name= strrchr(argv[0], '/'); if (prog_name == nil) prog_name= argv[0]; else prog_name++; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'd': if (*opt == 0) { debug= 1; } else { debug= strtoul(opt, &opt, 10); if (*opt != 0) usage(); } break; default: u}H��H��H��H��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������sage(); } } if (i != argc) usage(); selectlog(SYSLOG); openlog(prog_name, LOG_PID, LOG_DAEMON); setlogmask(LOG_UPTO(LOG_INFO)); /* Save process id. */ if ((pf= fopen(PIDFILE, "w")) == NULL) { fprintf(stderr, "%s: %s\n", PIDFILE, strerror(errno)); exit(1); } fprintf(pf, "%d\n", getpid()); if (ferror(pf) || fclose(pf) == EOF) { fprintf(stderr, "%s: %s\n", PIDFILE, strerror(errno)); exit(1); } sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sa.sa_handler= handler; /* Hangup: Reload crontab files. */ sigaction(SIGHUP, &sa, nil); /* User signal 1 & 2: Raise or reset debug level. */ sigaction(SIGUSR1, &sa, nil); sigaction(SIGUSR2, &sa, nil); /* Interrupt and Terminate: Cleanup and exit. */ if (sigaction(SIGINT, nil, &osa) == 0 && osa.sa_handler != SIG_IGN) { sigaction(SIGINT, &sa, nil); } if (sigaction(SIGTERM, nil, &osa) == 0 && osa.sa_handler != SIG_IGN) { sigaction(SIGTERM, &sa, nil); } /* Alarm: Wake up and run a job. */ sigaction(SIGALRM, &sa, nil); /* Initialize current time and time next to do something. */ time(&now); next= NEVER; /* Table load required first time. */ need_reload= 1; do { if (need_reload) { need_reload= 0; load_crontabs(); busy= 1; } /* Run jobs whose time has come. */ if (next <= now) { cronjob_t *job; if ((job= tab_nextjob()) != nil) run_job(job); busy= 1; } if (busy) { /* Did a job finish? */ r= waitpid(-1, nil, WNOHANG); busy= 0; } else { /* Sleep until the next job must be started. */ if (next == NEVER) { alarm(0); } else { #if __minix_vmd struct timeval tvnext; tvnext.tv_sec= next; tvnext.tv_usec= 0; sysutime(UTIME_SETALARM, &tvnext); #else alarm((next - now) > INT_MAX ? INT_MAX : (next - now)); #endif } if (debug >= 1) fprintf(stderr, "%s: sleep until %s", prog_name, ctime(&next)); closelog(); /* Don't keep resources open. */ /* Wait for a job to exit or a timeout. */ r= waitpid(-1, nil, 0); if (r == -1 && errno == ECHILD) pause(); alarm(0); time(&now); } if (r > 0) { /* A job has finished, reschedule it. */ if (debug >= 1) fprintf(stderr, "pid %d has exited\n", r); tab_reap_job((pid_t) r); busy= 1; } } while (!need_quit); /* Remove the pid file to signal that cron is gone. */ unlink(PIDFILE); return 0; } /* * $PchId: cron.c,v 1.4 2000/07/17 19:00:35 philip Exp $ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* misc.c - Miscellaneous stuff for cron Author: Kees J. Bot * 12 Jan 1997 */ #define nil ((void*)0) #include <sys/types.h> #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <time.h> #include "misc.h" char *prog_name; /* Name of this program. */ time_t now; /* Cron's idea of the current time. */ time_t next; /* Time to run the next job. */ size_t alloc_count; /* # Of chunks of memory allocated. */ void *allocate(size_t len) /* Checked malloc(). Better not feed it length 0. */ { void *mem; if ((mem= malloc(len)) == nil) { log(LOG_ALERT, "Out of memory, exiting\n"); exit(1); } alloc_count++; return mem; } void deallocate(void *mem) { if (mem != nil) { free(mem); alloc_count--; } } static enum logto logto= SYSLOG; void selectlog(enum logto where) /* Select where logging output should go, syslog or stdout. */ { logto= where; } void log(int level, const char *fmt, ...) /* Like syslog(), but may go to stderr. */ { va_list ap; va_start(ap, fmt); #if __minix_vmd || !__minix if (logto == SYSLOG) { vsyslog(level, fmt, ap); } else #endif { fprintf(stderr, "%s: ", prog_name); vfprintf(stderr, fmt, ap); } va_end(ap); } /* * $PchId: misc.c,v 1.3 2000/07/17 19:01:57 philip Exp $ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* crontab 1.2 - user crontab manipulation Author: Kees J. Bot * 12 Jan 1997 */ #define nil ((void*)0) #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <time.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <pwd.h> #include <sys/stat.h> #include "misc.h" #include "tab.h" #if __minix && !__minix_vmd #define seteuid(uid) ((uid),0) /* Minix can't fiddle with uids. */ #endif static int opentab(int uid, char *file, int how) /* Open a crontab file under the given uid. How is 'r' or 'w'. Return * the result of open(2). */ { uid_t safe_uid; int flags, r, err; switch (how) { case 'r': flags= O_RDONLY; break; case 'w': flags= O_WRONLY | O_CREAT | O_TRUNC; break; default: errno= EINVAL; return -1; } #if __minix && !__minix_vmd /* Standard Minix has no saved uid, so use the lousy old access(). */ if (uid != 0) { if (access(file, how == 'r' ? R_OK : W_OK) < 0) return -1; } #endif safe_uid= geteuid(); seteuid(uid); r= open(file, flags, 0666); err= errno; seteuid(safe_uid); errno= err; return r; } static void copytab(int fd_in, char *file_in, int fd_out, char *file_out) /* Copy one open file to another. Complain and exit on errors. */ { ssize_t r, w; char buf[1024]; while ((r= read(fd_in, buf, sizeof(buf))) > 0) { w= 0; while (w < r) { if ((r= write(fd_out, buf+w, r-w)) <= 0) { fprintf(stderr, "%s: Write error on %s: %s\n", prog_name, file_out, r == 0 ? "End of file" : strerror(errno)); exit(1); } w+= r; } } if (r < 0) { fprintf(stderr, "%s: Read error on %s: %s\n", prog_name, file_in, strerror(errno)); exit(1); } } static void usage(void) { fprintf(stderr, "Usage: %s -c [user] file # Change crontab\n" " %s -l [user] # List crontab\n" " %s -r [user] # Remove crontab\n" " %s -p # Tell cron to reload\n", prog_name, prog_name, prog_name, prog_name); exit(1); } int main(int argc, char **argv) { int i; int cflag, lflag, rflag, pflag; uid_t uid; char *user, *file; struct passwd *pw; static char SPOOLDIR[]= "/usr/spool/crontabs"; char tabfile[sizeof(SPOOLDIR) + NAME_MAX]; prog_name= strrchr(argv[0], '/'); if (prog_name == nil) prog_name= argv[0]; else prog_name++; cflag= lflag= rflag= pflag= 0; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'c': cflag= 1; break; case 'l': lflag= 1; break; case 'r': rflag= 1; break; case 'p': pflag= 1; break; default: usage(); } } if (cflag + lflag + rflag + pflag != 1) usage(); user= file= nil; if (!pflag && i < argc) user= argv[i++]; if (cflag) { if (user == nil) usage(); if (i < argc) { file= argv[i++]; } else { file= user; user= nil; } } if (i != argc) usage(); if (geteuid() != 0) { fprintf(stderr, "%s: No root privileges?\n", prog_name); } uid= getuid(); if (user == nil) { if ((pw= getpwuid(uid)) == nil) { fprintf(stderr, "%s: Don't know who you (uid %lu) are!\n", prog_name, (unsigned long) uid); exit(1); } } else { if ((pw= getpwnam(user)) == nil) { fprintf(stderr, "%s: Don't know who you (%s) are!\n", prog_name, user); exit(1); } } if (uid != 0 && pw->pw_uid != uid) { fprintf(stderr, "%s: Only root can change the crontabs of others!\n", prog_name); exit(1); } user= pw->pw_name; uid= pw->pw_uid; seteuid(uid); umask(0077); selectlog(STDERR); sprintf(tabfile, "%s/%s", SPOOLDIR, user); if (lflag) { int fd; if ((fd= opentab(0, tabfile, 'r')) < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", prog_name, tabfile, strerror(errno)); exit(1); } copytab(fd, tabfile, 1, "stdout"); close(fd); } if (rflag) { seteuid(0); if (unlink(tabfile) < 0) { fprintf(stderr, "%s: Can't remove %s: %s\n", prog_name, tabfile, strerror(errno)); exit(1); } seteuid(uid); printf("Crontab of %s removed\n", user); pflag= 1; } if (cflag) { int fd1, fd2; if ((fd1= opentab(uid, file, 'r')) < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", prog_name, file, strerror(errno)); exit(1); } /* Try to parse the new crontab file. If the parsing * succeeds then 'crontabs' will be non-null. */ tab_parse(file, user); tab_purge(); if (crontabs == nil) exit(1); if ((fd2= opentab(0, tabfile, 'w')) < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", prog_name, tabfile, strerror(errno)); exit(1); } copytab(fd1, file, fd2, tabfile); close(fd1); close(fd2); printf("New crontab for %s installed\n", user); pflag= 1; } if (pflag) { /* Alert cron to the new situation. */ FILE *fp; seteuid(0); if ((fp= fopen(PIDFILE, "r")) != NULL) { unsigned long pid; int c; pid= 0; while ((c= fgetc(fp)) != EOF && c != '\n') { if ((unsigned) (c - '0') >= 10) { pid= 0; break; } pid= 10*pid + (c - '0'); if (pid >= 30000) { pid= 0; break; } } if (pid > 1 && kill((pid_t) pid, SIGHUP) == 0) { pflag= 0; } } seteuid(uid); if (pflag) { fprintf(stderr, "%s: Alerting cron has failed; cron still running?\n", prog_name); exit(1); } printf("Cron signalled to reload tables\n"); } return 0; } /* * $PchId: crontab.c,v 1.4 2000/07/17 18:54:50 philip Exp $ */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D .�������������..������������E Makefile������F arp.h���������G devices.c�����H dhcpd.c�������I dhcpd.h�������J ether.c�������K tags.c������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for dhcpd. CFLAGS = $(OPT) -D_MINIX LDFLAGS = all: dhcpd OBJ= dhcpd.o tags.o devices.o ether.o dhcpd: $(OBJ) $(CC) $(LDFLAGS) -o $@ $(OBJ) install -S 12kw $@ install: /usr/bin/dhcpd /usr/bin/dhcpd: dhcpd install -c $? $@ clean: rm -f *.o dhcpd core a.out # Dependencies. $(OBJ): dhcpd.h dhcpd.o ether.o: arp.h �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* arp.h - Address Resolution Protocol packet format. * Author: Kees J. Bot * 16 Dec 2000 */ #ifndef ARP_H #define ARP_H typedef struct arp46 { ether_addr_t dstaddr; ether_addr_t srcaddr; ether_type_t ethtype; /* ARP_PROTO. */ u16_t hdr, pro; /* ARP_ETHERNET & ETH_IP_PROTO. */ u8_t hln, pln; /* 6 & 4. */ u16_t op; /* ARP_REQUEST or ARP_REPLY. */ ether_addr_t sha; /* Source hardware address. */ u8_t spa[4]; /* Source protocol address. */ ether_addr_t tha; /* Likewise for the target. */ u8_t tpa[4]; char padding[60 - (4*6 + 2*4 + 4*2 + 2*1)]; } arp46_t; #define ARP_ETHERNET 1 /* ARP on Ethernet. */ #define ARP_REQUEST 1 /* A request for an IP address. */ #define ARP_REPLY 2 /* A reply to a request. */ #endif /* ARP_H */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* devices.c - Handle network devices. * Author: Kees J. Bot * 11 Jun 1999 */ #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <limits.h> #include <time.h> #include <sys/ioctl.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/ether.h> #include <net/gen/eth_hdr.h> #include <net/gen/eth_io.h> #include <net/gen/ip_hdr.h> #include <net/gen/ip_io.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/udp_io.h> #include <net/gen/dhcp.h> #include "dhcpd.h" void get_buf(buf_t **bp) { /* Allocate and return a buffer pointer iff *bp == nil. */ if (*bp != nil) { /* Already has one. */ } else { /* Get one from the heap. */ buf_t *new= allocate(sizeof(*new)); new->dhcp= (dhcp_t *) (new->buf + sizeof(eth_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t)); new->udpio= ((udp_io_hdr_t *) new->dhcp) - 1; new->udp= ((udp_hdr_t *) new->dhcp) - 1; new->ip= ((ip_hdr_t *) new->udp) - 1; new->eth= ((eth_hdr_t *) new->ip) - 1; *bp= new; } } void put_buf(buf_t **bp) { /* Return a buffer to the heap. */ if (*bp != nil) { free(*bp); *bp= nil; } } void give_buf(buf_t **dbp, buf_t **sbp) { /* Hand over a buffer to another variable. */ put_buf(dbp); *dbp= *sbp; *sbp= nil; } #if __minix_vmd #define N_FDS 16 /* Minix-vmd can go async on many fds. */ #else #define N_FDS 1 /* Minix doesn't have async I/O. */ #endif static fd_t fds[N_FDS]; /* List of open descriptors. */ static struct network *fdwaitq; /* Queue of nets waiting for fds. */ network_t *newnetwork(void) { /* Create and initialize a network structure. */ network_t *new; new= allocate(sizeof(*new)); memset(new, 0, sizeof(*new)); new->hostname= nil; new->solicit= NEVER; new->sol_ct= -1; return new; } void closefd(fd_t *fdp) { /* Close a descriptor. */ if (fdp->fdtype != FT_CLOSED) { asyn_close(&asyn, fdp->fd); close(fdp->fd); fdp->fdtype= FT_CLOSED; fdp->since= 0; put_buf(&fdp->bp); if (debug >= 3) printf("%s: Closed\n", fdp->device); } } int opendev(network_t *np, fdtype_t fdtype, int compete) { /* Make sure that a network has the proper device open and configured. * Return true if this is made so, or false if the device doesn't exist. * If compete is true then the caller competes for old descriptors. * The errno value is EAGAIN if we're out of descriptors. */ fd_t *fdp, *fdold; time_t oldest; nwio_ethstat_t ethstat; nwio_ethopt_t ethopt; nwio_ipopt_t ipopt; nwio_udpopt_t udpopt; network_t **pqp; static char devbytype[][4] = { "", "eth", "ip", "udp", "udp" }; fdold= nil; oldest= NEVER; for (fdp= fds; fdp < arraylimit(fds); fdp++) { if (fdp->n == np->n && fdp->fdtype == fdtype) { /* Already open. */ np->fdp= fdp; return 1; } if (fdp->since <= oldest) { fdold= fdp; oldest= fdp->since; } } /* None free? Then wait for one to get old if so desired. */ if (fdold->fdtype != FT_CLOSED && !compete) { errno= EAGAIN; return 0; } if (!(np->flags & NF_WAIT)) { for (pqp= &fdwaitq; *pqp != nil; pqp= &(*pqp)->wait) {} *pqp= np; np->wait= nil; np->flags |= NF_WAIT; } /* We allow a net to keep a descriptor for half of the fast period. */ oldest += DELTA_FAST/2; if (fdwaitq != np || (fdold->fdtype != FT_CLOSED && oldest > now)) { /* This net is not the first in the queue, or the oldest isn't * old enough. Forget it for now. */ if (oldest < event) event= oldest; errno= EAGAIN; return 0; } /* The oldest is mine. */ np->flags &= ~NF_WAIT; fdwaitq= np->wait; closefd(fdold); /* Open the proper device in the proper mode. */ fdp= fdold; fdp->n= np->n; sprintf(fdp->device, "/dev/%s%d", devbytype[fdtype], np->n); np->fdp= fdp; if ((fdp->fd= open(fdp->device, O_RDWR)) < 0) { if (errno == ENOENT || errno == ENODEV || errno == ENXIO) return 0; fatal(fdp->device); } switch (fdtype) { case FT_ETHERNET: if (ioctl(np->fdp->fd, NWIOGETHSTAT, ðstat) < 0) { /* Not an Ethernet. */ close(fdp->fd); return 0; } np->eth= ethstat.nwes_addr; ethopt.nweo_flags= NWEO_COPY | NWEO_EN_LOC | NWEO_EN_BROAD | NWEO_REMANY | NWEO_TYPEANY | NWEO_RWDATALL; if (ioctl(fdp->fd, NWIOSETHOPT, ðopt) < 0) { fprintf(stderr, "%s: %s: Unable to set eth options: %s\n", program, fdp->device, strerror(errno)); exit(1); } break; case FT_ICMP: ipopt.nwio_flags= NWIO_COPY | NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | NWIO_PROTOSPEC | NWIO_HDR_O_SPEC | NWIO_RWDATALL; ipopt.nwio_tos= 0; ipopt.nwio_ttl= 1; ipopt.nwio_df= 0; ipopt.nwio_hdropt.iho_opt_siz= 0; ipopt.nwio_proto= IPPROTO_ICMP; if (ioctl(fdp->fd, NWIOSIPOPT, &ipopt) < 0) { fprintf(stderr, "%s: %s: Unable to set IP options: %s\n", program, fdp->device, strerror(errno)); exit(1); } break; case FT_BOOTPC: udpopt.nwuo_flags= NWUO_COPY | NWUO_EN_LOC | NWUO_EN_BROAD | NWUO_RP_ANY | NWUO_RA_ANY | NWUO_RWDATALL | NWUO_DI_IPOPT | NWUO_LP_SET; udpopt.nwuo_locport= port_client; goto udp; case FT_BOOTPS: udpopt.nwuo_flags= NWUO_EXCL | NWUO_EN_LOC | NWUO_EN_BROAD | NWUO_RP_ANY | NWUO_RA_ANY | NWUO_RWDATALL | NWUO_DI_IPOPT | NWUO_LP_SET; udpopt.nwuo_locport= port_server; udp: if (ioctl(fdp->fd, NWIOSUDPOPT, &udpopt) == -1) { fprintf(stderr, "%s: %s: Unable to set UDP options: %s\n", program, fdp->device, strerror(errno)); exit(1); } break; default:; } fdp->fdtype= fdtype; fdp->since= now; if (debug >= 3) printf("%s: Opened\n", fdp->device); return 1; } void closedev(network_t *np, fdtype_t fdtype) { /* We no longer need a given type of device to be open. */ fd_t *fdp; for (fdp= fds; fdp < arraylimit(fds); fdp++) { if (fdp->n == np->n && fdp->fdtype == fdtype) closefd(fdp); } } char *ipdev(int n) { /* IP device for network #n. */ static char device[sizeof("/dev/ipNNN")]; sprintf(device, "/dev/ip%d", n); return device; } int get_ipconf(char *device, ipaddr_t *ip, ipaddr_t *mask) { /* Get the current IP address and netmask of a given IP device. Return * ENOENT if the device doesn't exist, EAGAIN if it is unconfigured, and * 0 with the address and mask if ok. */ int fd, e; nwio_ipconf_t ipconf; if ((fd= open(device, O_RDWR|O_NONBLOCK)) < 0) { if (errno == ENOENT || errno == ENODEV || errno == ENXIO) return ENOENT; fatal(device); } if (test > 0) { e= EAGAIN; } else if (ioctl(fd, NWIOGIPCONF, &ipconf) < 0) { if ((e= errno) != EAGAIN) fatal(device); } else { *ip= ipconf.nwic_ipaddr; *mask= ipconf.nwic_netmask; e= 0; } close(fd); return e; } void set_ipconf(char *device, ipaddr_t ip, ipaddr_t mask, unsigned mtu) { /* Set IP address and netmask of an IP device. */ int fd; nwio_ipconf_t ipconf; if (test > 0) return; if ((fd= open(device, O_RDWR)) < 0) fatal(device); ipconf.nwic_flags= NWIC_IPADDR_SET | NWIC_NETMASK_SET; ipconf.nwic_ipaddr= ip; ipconf.nwic_netmask= mask; #ifdef NWIC_MTU_SET if (mtu != 0) { ipconf.nwic_flags |= NWIC_MTU_SET; ipconf.nwic_mtu= mtu; } #endif if (ioctl(fd, NWIOSIPCONF, &ipconf) < 0) fatal(device); close(fd); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dhcpd 1.7 - Dynamic Host Configuration Protocol daemon. * Author: Kees J. Bot * 11 Jun 1999 */ #include <sys/types.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <signal.h> #include <string.h> #include <time.h> #include <limits.h> #include <configfile.h> #include <sys/ioctl.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/ether.h> #include <net/gen/if_ether.h> #include <net/gen/eth_hdr.h> #include <net/gen/ip_hdr.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/udp_io.h> #include <net/gen/dhcp.h> #include "arp.h" #define EXTERN #include "dhcpd.h" char *configfile= PATH_DHCPCONF; char *poolfile= PATH_DHCPPOOL; static char *cachefile= PATH_DHCPCACHE; static int qflag; /* True if printing cached DHCP data. */ static int aflag, rflag; /* True if adding or deleting pool addresses. */ #define BCAST_IP HTONL(0xFFFFFFFFUL) /* We try to play with up to this many networks. */ #define N_NETS 16 static unsigned n_nets; /* Actual number of networks. */ void report(const char *label) { fprintf(stderr, "%s: %s: %s\n", program, label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } void *allocate(size_t size) { void *mem; if ((mem= malloc(size)) == nil) fatal("Can't allocate memory"); return mem; } /* Choose a DHCP xid based on the start time and network number. Not really * random, but we don't have anything more random than the clock anyway. */ #define XID(np) htonl(((u32_t) (np)->start << 8) | (np)->n) static network_t *network[N_NETS]; int ifname2if(const char *name) { /* Translate an interface name to a number, -1 if bad. */ char *end; unsigned long n; if (*name++ != 'i' || *name++ != 'p') return -1; n= strtoul(name, &end, 10); if (end == name || *end != 0) return -1; if (n >= N_NETS) return -1; return n; } network_t *if2net(int n) { /* Translate an interface number to a network struct. */ int i; for (i= 0; i < n_nets; i++) { if (network[i]->n == n) return network[i]; } return nil; } static ipaddr_t defaultmask(ipaddr_t ip) { /* Compute netmask by the oldfashioned Class rules. */ if (B(&ip)[0] < 0x80) return HTONL(0xFF000000UL); /* Class A. */ if (B(&ip)[0] < 0xC0) return HTONL(0xFFFF0000UL); /* Class B. */ if (B(&ip)[0] < 0xE0) return HTONL(0xFFFFFF00UL); /* Class C. */ return HTONL(0xFFFFFFFFUL); /* Multicast? Shouldn't happen... */ } #define POOL_MAGIC HTONL(0x81F85D00UL) typedef struct pool { /* Dynamic pool entry. */ u32_t magic; /* Pool file magic number. */ ipaddr_t ip; /* IP address. */ u32_t expire; /* When does/did the lease expire? */ u8_t len; /* Client ID length. */ u8_t unused[19]; /* Space for extensions. */ u8_t clid[CLID_MAX]; /* Client ID of current/last user. */ } pool_t; static int openpool(int mode) { /* Open the dynamic pool and lock it, return fd on success or -1. */ int fd; struct flock lck; if ((fd= open(poolfile, mode, 0644)) < 0) { if (errno != ENOENT) fatal(poolfile); return -1; } if (mode != O_RDONLY) { lck.l_type= F_WRLCK; lck.l_whence= SEEK_SET; lck.l_start= 0; lck.l_len= 0; if (fcntl(fd, F_SETLKW, &lck) < 0) fatal(poolfile); } return fd; } static int readpool(int fd, pool_t *entry) { /* Read one pool table entry, return true unless EOF. */ ssize_t r; if ((r= read(fd, entry, sizeof(*entry))) < 0) fatal(poolfile); if (r == 0) return 0; if (r != sizeof(*entry) || entry->magic != POOL_MAGIC) { fprintf(stderr, "%s: %s: Pool table is corrupt\n", program, poolfile); close(fd); return 0; } return 1; } #if !__minix_vmd /* No fsync() for Minix. */ #define fsync(fd) sync() #endif static void writepool(int fd, pool_t *entry) { /* (Over)write a pool table entry. */ if (write(fd, entry, sizeof(*entry)) < 0 || (entry->expire > now && fsync(fd) < 0) ) { fatal(poolfile); } } static ipaddr_t findpool(u8_t *client, size_t len, ipaddr_t ifip) { /* Look for a client ID in the dynamic address pool within the same network * as 'ifip'. Select an unused one for a new client if necessary. Return * 0 if nothing is available, otherwise the IP address we can offer. */ int fd, found; pool_t entry, oldest; dhcp_t dhcp; u8_t *pmask; ipaddr_t mask; /* Any information available on the network the client is at? */ if (!makedhcp(&dhcp, nil, 0, nil, 0, ifip, ifip, nil)) return 0; if ((fd= openpool(O_RDWR)) < 0) return 0; (void) gettag(&dhcp, DHCP_TAG_NETMASK, &pmask, nil); memcpy(&mask, pmask, sizeof(mask)); oldest.expire= NEVER; while ((found= readpool(fd, &entry))) { /* Deleted entry? */ if (entry.ip == 0) continue; /* Correct network? */ if (((entry.ip ^ ifip) & mask) != 0) continue; /* Client present? */ if (entry.len == len && memcmp(entry.clid, client, len) == 0) break; /* Oldest candidate for a new lease? */ entry.expire= ntohl(entry.expire); if (entry.expire < oldest.expire) oldest= entry; } close(fd); if (found) return entry.ip; if (oldest.expire <= now) return oldest.ip; return 0; } static int commitpool(ipaddr_t ip, u8_t *client, size_t len, time_t expire) { /* Commit a new binding to stable storage, return true on success. */ int fd; pool_t entry; if ((fd= openpool(O_RDWR)) < 0) return 0; do { if (!readpool(fd, &entry)) { close(fd); return 0; } } while (entry.ip != ip); entry.expire= htonl(expire); entry.len= len; memcpy(entry.clid, client, len); if (lseek(fd, -(off_t)sizeof(entry), SEEK_CUR) == -1) fatal(poolfile); writepool(fd, &entry); close(fd); return 1; } static void updatepool(int add, const char *name) { /* Add a new IP address to the dynamic pool. */ ipaddr_t ip; int fd, i; pool_t entry; struct hostent *he; off_t off, off0; if ((he= gethostbyname(name)) == nil || he->h_addrtype != AF_INET) { fprintf(stderr, "%s: %s: Unknown host\n", program, name); exit(1); } for (i= 0; he->h_addr_list[i] != nil; i++) {} if (i != 1) { fprintf(stderr, "%s: %s has %d addresses\n", program, name, i); exit(1); } memcpy(&ip, he->h_addr_list[0], sizeof(ip)); if ((fd= openpool(O_RDWR|O_CREAT)) < 0) fatal(poolfile); off= 0; off0= -1; while (readpool(fd, &entry)) { if (add) { if (entry.ip == ip) { fprintf(stderr, "%s: %s: %s is already present\n", program, poolfile, name); exit(1); } if (entry.ip == 0 && off0 == -1) off0= off; } else { if (entry.ip == ip) { memset(&entry, 0, sizeof(entry)); entry.magic= POOL_MAGIC; entry.ip= 0; if (lseek(fd, off, SEEK_SET) == -1) fatal(poolfile); writepool(fd, &entry); } } off+= sizeof(entry); } if (add) { if (off0 != -1 && lseek(fd, off0, SEEK_SET) == -1) fatal(poolfile); memset(&entry, 0, sizeof(entry)); entry.magic= POOL_MAGIC; entry.ip= ip; writepool(fd, &entry); } close(fd); } static void cachedhcp(int n, dhcp_t *dp) { /* Store a DHCP packet in a cache where those who care can find it. */ static int inited; FILE *fp; int fd; int mode; if (test > 0) return; if (!inited) { /* First time, clear store and also save my pid. */ if ((fp= fopen(PATH_DHCPPID, "w")) != nil) { if (fprintf(fp, "%d\n", getpid()) == EOF || fclose(fp) == EOF) { fatal(PATH_DHCPPID); } } inited= 1; mode= O_WRONLY | O_CREAT | O_TRUNC; } else { mode= O_WRONLY; } dp->xid= htonl(now); /* To tell how old this data is. */ if ((fd= open(cachefile, mode, 0666)) < 0 || lseek(fd, (off_t) n * sizeof(*dp), SEEK_SET) == -1 || write(fd, dp, sizeof(*dp)) < 0 || close(fd) < 0 ) { if (errno != ENOENT) fatal(cachefile); } } static void printdata(void) { /* Show the contents of the cache and the dynamic pool. */ int fd; dhcp_t d; ssize_t r; int i; H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ pool_t entry; unsigned long expire; char delta[3*sizeof(u32_t)]; initdhcpconf(); if ((fd= open(cachefile, O_RDONLY)) < 0) fatal(cachefile); i= 0; while ((r= read(fd, &d, sizeof(d))) == sizeof(d)) { if (d.yiaddr != 0) { printf("DHCP data for network %d:\n", i); printdhcp(&d); } i++; } if (r < 0) fatal(cachefile); close(fd); if ((fd= openpool(O_RDONLY)) >= 0) { printf("Dynamic address pool since %ld:\n", (long) now); while (readpool(fd, &entry)) { if (entry.ip == 0) continue; expire= ntohl(entry.expire); if (expire == 0) { strcpy(delta, "unused"); } else if (expire == 0xFFFFFFFFUL) { strcpy(delta, "infinite"); } else if (expire < now) { sprintf(delta, "-%lu", now - expire); } else { sprintf(delta, "+%lu", expire - now); } printf("\t%-15s %8s ", inet_ntoa(entry.ip), delta); for (i= 0; i < entry.len; i++) { printf("%02X", entry.clid[i]); } fputc('\n', stdout); } close(fd); } } static udpport_t portbyname(const char *name) { struct servent *se; if ((se= getservbyname(name, "udp")) == nil) { fprintf(stderr, "%s: Unknown port \"%s\"\n", program, name); exit(1); } return se->s_port; } static int send(network_t *np, void *data, size_t len) { /* Send out a packet using a filedescriptor that is probably in async mode, * so first dup() a sync version, then write. Return true on success. */ int fd; ssize_t r; if ((fd= dup(np->fdp->fd)) < 0) fatal("Can't dup()"); if ((r= write(fd, data, len)) < 0) { report(np->fdp->device); sleep(10); } close(fd); return r >= 0; } static size_t servdhcp(network_t *np, buf_t *bp, size_t dlen) { buf_t *abp= nil; ipaddr_t cip, ifip; u8_t defclid[1+sizeof(bp->dhcp->chaddr)]; u8_t *pdata, *client, *class, *server, *reqip, *lease; u32_t expire; size_t len, cilen, calen; int type, dyn; u8_t atype; static char NAKMESS[] = "IP address requested isn't yours"; if (test > 0) return 0; /* The IP address of the interface close to the client. */ ifip= bp->dhcp->giaddr != 0 ? bp->dhcp->giaddr : np->ip; /* All kinds of DHCP tags. */ if (gettag(bp->dhcp, DHCP_TAG_TYPE, &pdata, nil)) { type= *pdata; } else { type= -1; /* BOOTP? */ } if (!gettag(bp->dhcp, DHCP_TAG_CLIENTID, &client, &cilen)) { defclid[0]= bp->dhcp->htype; memcpy(defclid+1, bp->dhcp->chaddr, bp->dhcp->hlen); client= defclid; cilen= 1+bp->dhcp->hlen; } if (!gettag(bp->dhcp, DHCP_TAG_CLASSID, &class, &calen)) { calen= 0; } if (!gettag(bp->dhcp, DHCP_TAG_SERVERID, &server, nil)) { server= B(&np->ip); } if (!gettag(bp->dhcp, DHCP_TAG_REQIP, &reqip, nil)) { reqip= nil; } /* I'm a server? Then see if I know this client. */ if ((np->flags & NF_SERVING) && bp->dhcp->op == DHCP_BOOTREQUEST && between(1, bp->dhcp->hlen, sizeof(bp->dhcp->chaddr)) && (server == nil || memcmp(server, &np->ip, sizeof(np->ip)) == 0) ) { get_buf(&abp); dyn= 0; if (type == DHCP_INFORM) { /* This host already has an address, it just wants information. */ cip= bp->dhcp->ciaddr; } else { /* Is this host in my tables? */ (void) makedhcp(abp->dhcp, class, calen, client, cilen, 0, ifip, nil); cip= abp->dhcp->yiaddr; /* If not, do we have a dynamic address? */ if (cip == 0 && (cip= findpool(client, cilen, ifip)) != 0) dyn= 1; } if (cip == 0 || !makedhcp(abp->dhcp, class, calen, client, cilen, cip, ifip, nil)) { put_buf(&abp); } if (abp != nil) { if (gettag(abp->dhcp, DHCP_TAG_LEASE, &lease, nil)) { memcpy(&expire, lease, sizeof(expire)); expire= now + ntohl(expire); if (expire < now) expire= 0xFFFFFFFFUL; } else { if (dyn) { /* A dynamic address must have a lease. */ fprintf(stderr, "%s: No lease set for address %s\n", program, inet_ntoa(cip)); exit(1); } lease= nil; expire= 0xFFFFFFFFUL; } /* What does our client want, and what do we say? */ switch (type) { case DHCP_DISCOVER: atype= DHCP_OFFER; /* Assign this address for a short moment. */ if (dyn && !commitpool(cip, client, cilen, now + DELTA_FAST)) { put_buf(&abp); } break; case -1:/* BOOTP */ case DHCP_REQUEST: case DHCP_INFORM: atype= DHCP_ACK; /* The address wanted must be the address we offer. */ if ((reqip != nil && memcmp(reqip, &cip, sizeof(cip)) != 0) || (bp->dhcp->ciaddr != 0 && bp->dhcp->ciaddr != cip) ) { atype= DHCP_NAK; } else if (dyn && type == DHCP_REQUEST) { /* Assign this address for the duration of the lease. */ if (!commitpool(cip, client, cilen, expire)) put_buf(&abp); } break; case DHCP_DECLINE: /* Our client doesn't want the offered address! */ if (dyn && reqip != nil && memcmp(reqip, &cip, sizeof(cip)) == 0 ) { int i; fprintf(stderr, "%s: ", program); for (i= 0; i < cilen; i++) { fprintf(stderr, "%02X", client[i]); } fprintf(stderr, " declines %s", inet_ntoa(cip)); if (gettag(bp->dhcp, DHCP_TAG_MESSAGE, &pdata, &len)) { fprintf(stderr, " saying: \"%.*s\"", (int)len, pdata); } fputc('\n', stderr); /* Disable address for the duration of the lease. */ (void) commitpool(cip, nil, 0, expire); } put_buf(&abp); break; case DHCP_RELEASE: /* Our client is nice enough to return its address. */ if (dyn) (void) commitpool(cip, client, cilen, now); put_buf(&abp); break; default: /* Anything else is ignored. */ put_buf(&abp); } } if (abp != nil) { /* Finish the return packet. */ abp->dhcp->htype= bp->dhcp->htype; abp->dhcp->hlen= bp->dhcp->hlen; abp->dhcp->hops= 0; abp->dhcp->xid= bp->dhcp->xid; abp->dhcp->secs= 0; abp->dhcp->flags= bp->dhcp->flags; abp->dhcp->ciaddr= 0; abp->dhcp->yiaddr= atype == DHCP_NAK ? 0 : cip; if (atype == DHCP_NAK) abp->dhcp->siaddr= 0; abp->dhcp->giaddr= bp->dhcp->giaddr; memcpy(abp->dhcp->chaddr,bp->dhcp->chaddr,sizeof(bp->dhcp->chaddr)); settag(abp->dhcp, DHCP_TAG_SERVERID, &np->ip, sizeof(np->ip)); if (lease == nil) { /* No lease specified? Then give an infinite lease. */ settag(abp->dhcp, DHCP_TAG_LEASE, &expire, sizeof(expire)); } if (type == DHCP_INFORM) { /* Oops, this one has a fixed address, so no lease business. */ settag(abp->dhcp, DHCP_TAG_LEASE, nil, 0); settag(abp->dhcp, DHCP_TAG_RENEWAL, nil, 0); settag(abp->dhcp, DHCP_TAG_REBINDING, nil, 0); } if (atype == DHCP_NAK) { /* A NAK doesn't need much. */ memset(abp->dhcp->sname, 0, sizeof(abp->dhcp->sname)); memset(abp->dhcp->file, 0, sizeof(abp->dhcp->file)); memset(abp->dhcp->options, 255, sizeof(abp->dhcp->options)); settag(abp->dhcp, DHCP_TAG_MESSAGE, NAKMESS, sizeof(NAKMESS)); } settag(abp->dhcp, DHCP_TAG_TYPE, &atype, sizeof(atype)); if (type == -1) { /* BOOTP */ abp->dhcp->magic= 0; /* Wipe newfangled DHCP stuff. */ memset(abp->dhcp->options, 0, sizeof(abp->dhcp->options)); } /* Figure out where to send this to. */ abp->udpio->uih_src_addr= np->ip; abp->udpio->uih_src_port= port_server; if (bp->dhcp->giaddr != 0) { abp->udpio->uih_dst_addr= bp->dhcp->giaddr; abp->udpio->uih_dst_port= port_server; } else if (bp->dhcp->flags & DHCP_FLAGS_BCAST) { abp->udpio->uih_dst_addr= BCAST_IP; abp->udpio->uih_dst_port= port_client; } else if (bp->udpio->uih_src_addr != 0) { abp->udpio->uih_dst_addr= bp->udpio->uih_src_addr; abp->udpio->uih_dst_port= port_client; } else { abp->udpio->uih_dst_addr= BCAST_IP; abp->udpio->uih_dst_port= port_client; } abp->udpio->uih_ip_opt_len= 0; abp->udpio->uih_data_len= sizeof(dhcp_t); /* Copy the packet to the input buffer, and return the new size. */ memcpy(bp->buf, abp->buf, sizeof(bp->buf)); put_buf(&abp); return sizeof(udp_io_hdr_t) + sizeof(dhcp_t); } } /* I'm a relay? If it is a not already a relayed request then relay. */ if ((np->flags & NF_RELAYING) && bp->dhcp->op == DHCP_BOOTREQUEST && bp->dhcp->giaddr == 0 ) { bp->dhcp->giaddr= np->ip; bp->udpio->uih_src_addr= np->ip; bp->udpio->uih_src_port= port_server; bp->udpio->uih_dst_addr= np->server; bp->udpio->uih_dst_port= port_server; return dlen; } /* I'm a relay? If the server sends a reply to me then relay back. */ if ((np->flags & NF_RELAYING) && bp->udpio->uih_src_addr == np->server && bp->dhcp->op == DHCP_BOOTREPLY ) { bp->dhcp->giaddr= 0; bp->udpio->uih_src_addr= np->ip; bp->udpio->uih_src_port= port_server; bp->udpio->uih_dst_addr= BCAST_IP; bp->udpio->uih_dst_port= port_client; return dlen; } /* Don't know what to do otherwise, so doing nothing seems wise. */ return 0; } static void onsig(int sig) { switch (sig) { case SIGUSR1: debug++; break; case SIGUSR2: debug= 0; break; } } static void usage(void) { fprintf(stderr, "Usage: %s [-qar] [-t[L]] [-d[L]] [-f config] [-c cache] [-p pool] [host ...]\n", program); exit(1); } int main(int argc, char **argv) { int i; network_t *np; struct sigaction sa; ssize_t r= -1; buf_t *bp= nil; static struct timeval eventtv; program= argv[0]; start= now= time(nil); debug= 0; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++]+1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'f': if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } configfile= opt; opt= ""; break; case 'c': if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } cachefile= opt; opt= ""; break; case 'p': if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } poolfile= opt; opt= ""; break; case 't': test= 1; if (between('0', *opt, '9')) test= strtoul(opt, &opt, 10); break; case 'd': debug= 1; if (between('0', *opt, '9')) debug= strtoul(opt, &opt, 10); break; case 'q': qflag= 1; break; case 'a': aflag= 1; break; case 'r': rflag= 1; break; default: usage(); } } if (aflag + rflag + qflag > 1) usage(); if (aflag || rflag) { /* Add or remove addresses from the dynamic pool. */ while (i < argc) updatepool(aflag, argv[i++]); exit(0); } if (i != argc) usage(); if (qflag) { /* Only show the contents of the cache and dynamic pool to the user. */ printdata(); exit(0); } /* BOOTP ports. */ port_server= portbyname("bootps"); port_client= portbyname("bootpc"); sa.sa_handler= onsig; sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sigaction(SIGUSR1, &sa, nil); sigaction(SIGUSR2, &sa, nil); /* Initial configuration. */ for (i= 0; i < N_NETS; i++) { int err; ipaddr_t ip, mask; /* Is there something there? */ err= get_ipconf(ipdev(i), &ip, &mask); if (err == ENOENT) continue; network[n_nets++]= np= newnetwork(); np->n= i; /* Ethernet? */ if (opendev(np, FT_ETHERNET, 1)) { np->type= B(&np->eth)[0] != 'Z' ? NT_ETHERNET : NT_SINK; if (debug >= 1) { printf("%s: Ethernet address is %s%s\n", np->fdp->device, ether_ntoa(&np->eth), np->type == NT_SINK ? " (sink)" : ""); } closedev(np, FT_ETHERNET); } /* Already configured by ifconfig? */ if (err == 0) { np->ip= ip; np->mask= mask; if (debug >= 1) { printf("%s: IP address is %s (ifconfig?)\n", ipdev(np->n), cidr_ntoa(np->ip, np->mask)); } } /* Only true Ethernets worry about DHCP. */ if (np->type != NT_ETHERNET) np->renew= np->rebind= np->lease= NEVER; } /* Try to find my interfaces in the DHCP table. */ for (i= 0; i < n_nets; i++) { ipaddr_t cip; u8_t clid[1+DHCP_HLEN_ETH]; size_t cilen; np= network[i]; if (np->flags & NF_BOUND) continue; if (np->type == NT_IP) { cilen= 0; } else { ether2clid(clid, &np->eth); cilen= 1+DHCP_HLEN_ETH; } /* Try to find an Ethernet address, or the IP address of an already * configured network. If we have data we get an IP address back. */ get_buf(&bp); (void) makedhcp(bp->dhcp, (u8_t *) "Minix", 5, clid, cilen, np->ip, 0, np); cip= bp->dhcp->yiaddr; /* Gather information on the interface. */ if (cip != 0 && makedhcp(bp->dhcp, (u8_t *) "Minix", 5, clid, cilen, cip, cip, np) && test < 2 ) { u8_t *pdata; u16_t mtu; cachedhcp(np->n, bp->dhcp); np->ip= cip; (void) gettag(bp->dhcp, DHCP_TAG_NETMASK, &pdata, nil); memcpy(&np->mask, pdata, sizeof(np->mask)); if (gettag(bp->dhcp, DHCP_TAG_GATEWAY, &pdata, nil)) { memcpy(&np->gateway, pdata, sizeof(np->gateway)); } else { np->gateway= 0; } if (gettag(bp->dhcp, DHCP_TAG_IPMTU, &pdata, nil)) { memcpy(&mtu, pdata, sizeof(mtu)); mtu= ntohs(mtu); } else { mtu= 0; } set_ipconf(ipdev(np->n), np->ip, np->mask, mtu); if (debug >= 1) { printf("%s: IP address is %s (dhcp.conf)\n", ipdev(np->n), cidr_ntoa(np->ip, np->mask)); } np->flags |= NF_BOUND; np->renew= np->rebind= np->lease= NEVER; np->sol_ct= N_SOLICITS; np->solicit= 0; /* Other (previous) interfaces may have been defined. */ i= 0; } put_buf(&bp); } for (;;) { now= time(nil); event= NEVER; /* Is it time to request/renew a lease? */ for (i= 0; i < n_nets; i++) { np= network[i]; if (np->renew <= now) { u8_t type; static u8_t taglist[] = { DHCP_TAG_NETMASK, DHCP_TAG_GATEWAY, DHCP_TAG_DNS }; u8_t ethclid[1+DHCP_HLEN_ETH]; /* We may have lost our binding or even our lease. */ if (np->rebind <= now) np->server= BCAST_IP; if (np->lease <= now) { if (np->flags & NF_BOUND) closedev(np, FT_BOOTPC); if ((np->flags & (NF_BOUND | NF_POSSESSIVE)) == NF_BOUND) { set_ipconf(ipdev(np->n), np->ip= 0, np->mask= 0, 0); if (debug >= 1) { printf("%s: Interface disabled (lease expired)\n", ipdev(np->n)); } } np->flags &= ~NF_BOUND; } /* See if we can open the network we need to send on. */ if (!(np->flags & NF_BOUND)) { if (!opendev(np, FT_ETHERNET, 1)) continue; } else { if (!opendev(np, FT_BOOTPC, 1)) continue; } if (!(np->flags & NF_NEGOTIATING)) { /* We need to start querying a DHCP server. */ np->start= now; np->delta= DELTA_FIRST; np->flags |= NF_NEGOTIATING; } /* Fill in a DHCP query packet. */ get_buf(&bp); dhcp_init(bp->dhcp); bp->dhcp->op= DHCP_BOOTREQUEST; bp->dhcp->htype= DHCP_HTYPE_ETH; bp->dhcp->hlen= DHCP_HLEN_ETH; bp->dhcp->xid= XID(np); bp->dhcp->secs= htons(now - np->start > 0xFFFF ? 0xFFFF : now - np->start); memcpy(bp->dhcp->chaddr, &np->eth, sizeof(np->eth)); if (np->lease <= now) { /* First time, or my old server is unresponsive. */ type= DHCP_DISCOVER; } else { /* Request an offered address or renew an address. */ type= DHCP_REQUEST; if (np->flags & NF_BOUND) { /* A renewal, I claim my current address. */ bp->dhcp->ciaddr= np->ip; } else { /* Nicely ask for the address just offered. */ settag(bp->dhcp, DHCP_TAG_REQIP, &np->ip, sizeof(np->ip)); settag(bp->dhcp, DHCP_TAG_SERVERID, &np->server, sizeof(np->server)); } } settag(bp->dhcp, DHCP_TAG_TYPE, &type, 1); /* My client ID. Simply use the default. */ ether2clid(ethclid, &np->eth); settag(bp->dhcp, DHCP_TAG_CLIENTID, ethclid, sizeof(ethclid)); /* The Class ID may serve to recognize Minix hosts. */ settag(bp->dhcp, DHCP_TAG_CLASSID, "Minix", 5); /* The few tags that Minix can make good use of. */ settag(bp->dhcp, DHCP_TAG_REQPAR, taglist, sizeof(taglist)); /* Some weird sites use a hostname, not a client ID. */ if (np->hostname != nil) { settag(bp->dhcp, DHCP_TAG_HOSTNAME, np->hostname, strlen(np->hostname)); } bp->udpio->uih_src_addr= np->ip; bp->udpio->uih_dst_addr= np->server; bp->udpio->uih_src_port= port_client; bp->udpio->uih_dst_port= port_server; bp->udpio->uih_ip_opt_len= 0; bp->udpio->uih_data_len= sizeof(dhcp_t); if (!(np->flags & NF_BOUND)) { /* Rebind over Ethernet. */ udp2ether(bp, np); if (send(np, bp->eth, sizeof(eth_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_t))) { if (debug >= 1) { printf("%s: Broadcast DHCP %s\n", np->fdp->device, dhcptypename(type)); if (debug >= 2) printdhcp(bp->dhcp); } } } else { /* Renew over UDP. */ if (send(np, bp->udpio, sizeof(udp_io_hdr_t) + sizeof(dhcp_t))) { if (debug >= 1) { printf("%s: Sent DHCP %s to %s\n", np->fdp->device, dhcptypename(type), inet_ntoa(np->server)); if (debug >= 2) printdhcp(bp->dhcp); } } } put_buf(&bp); /* When to continue querying a DHCP server? */ if (np->flags & NF_BOUND) { /* Still bound, keep halving time till next event. */ time_t e, d; e= now < np->rebind ? np->rebind : np->lease; d= (e - now) / 2; if (d < DELTA_SLOW) d= DELTA_SLOW; np->renew= now + d; if (np->renew > e) np->renew= e; } else { /* Not bound, be desparate. */ np->renew= now + np->delta; if ((np->delta *= 2) > DELTA_FAST) np->delta= DELTA_FAST; } } if (np->renew < event) event= np->renew; } /* Read DHCP responses. */ for (i= 0; i < n_nets; i++) { np= network[i]; if (!(np->flags & NF_NEGOTIATING)) continue; if (!(np->flags & NF_BOUND)) { if (!opendev(np, FT_ETHERNET, 0)) continue; get_buf(&np->fdp->bp); r= asyn_read(&asyn, np->fdp->fd, np->fdp->bp->eth, BUF_ETH_SIZE); } else { if (!opendev(np, FT_BOOTPC, 0)) continue; get_buf(&np->fdp->bp); r= asyn_read(&asyn, np->fdp->fd, np->fdp->bp->udpio, BUF_UDP_SIZE); } if (r != -1) break; if (errno != ASYN_INPROGRESS && errno != EPACKSIZE) { report(np->fdp->device); sleep(10); } } /* Is there a response? */ if (i < n_nets) { give_buf(&bp, &np->fdp->bp); if (((!(np->flags & NF_BOUND) && r >= (sizeof(eth_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + offsetof(dhcp_t, options)) && ether2udp(bp) && bp->udpio->uih_dst_port == port_client) || ((np->flags & NF_BOUND) && r >= sizeof(udp_io_hdr_t) + offsetof(dhcp_t, options))) && bp->dhcp->op == DHCP_BOOTREPLY && bp->dhcp->htype == DHCP_HTYPE_ETH && bp->dhcp->hlen == DHCP_HLEN_ETH && bp->dhcp->xid == XID(np) && memcmp(bp->dhcp->chaddr, &np->eth, sizeof(np->eth)) == 0 ) { /* Pfew! We got a DHCP reply! */ u8_t *pdata; size_t len; int type; ipaddr_t mask, gateway, relay, server; u16_t mtu; u32_t lease, renew, rebind; relay= bp->udpio->uih_src_addr; if (gettag(bp->dhcp, DHCP_TAG_SERVERID, &pdata, nil)) { memcpy(&server, pdata, sizeof(server)); } else { server= relay; } if (gettag(bp->dhcp, DHCP_TAG_TYPE, &pdata, nil)) { type= pdata[0]; } else { type= DHCP_ACK; /* BOOTP? */ } if (debug >= 1) { printf("%s: Got a DHCP %s from %s", np->fdp->device, dhcptypename(type), inet_ntoa(server)); printf(relay != server ? " through %s\n" : "\n", inet_ntoa(relay)); if (debug >= 2) printdhcp(bp->dhcp); } if (gettag(bp->dhcp, DHCP_TAG_NETMASK, &pdata, nil)) { memcpy(&mask, pdata, sizeof(mask)); } else { mask= defaultmask(bp->dhcp->ciaddr); } if (gettag(bp->dhcp, DHCP_TAG_IPMTU, &pdata, nil)) { memcpy(&mtu, pdata, sizeof(mtu)); mtu= ntohs(mtu); } else { mtu= 0; } if (gettag(bp->dhcp, DHCP_TAG_GATEWAY, &pdata, nil)) { memcpy(&gateway, pdata, sizeof(gateway)); } else { gateway= 0; } if (gettag(bp->dhcp, DHCP_TAG_LEASE, &pdata, nil)) { memcpy(&lease, pdata, sizeof(lease)); lease= ntohl(lease); } else { lease= NEVER; } if (gettag(bp->dhcp, DHCP_TAG_REBINDING, &pdata, nil)) { memcpy(&rebind, pdata, sizeof(rebind)); rebind= ntohl(rebind); } else { rebind= lease - lease / 8; } if (gettag(bp->dhcp, DHCP_TAG_RENEWAL, &pdata, nil)) { memcpy(&renew, pdata, sizeof(renew)); renew= ntohl(renew); } else { renew= lease / 2; } if (type == DHCP_OFFER && np->rebind <= np->renew) { /* It's an offer for an address and we haven't taken one * yet. It's all the same to us, so take this one. */ np->ip= bp->dhcp->yiaddr; np->mask= mask; np->server= server; np->gateway= gateway; np->delta= DELTA_FIRST; np->renew= now; np->rebind= np->lease= now + DELTA_FAST; /* Send out an ARP request to see if the offered address * is in use already. */ make_arp(bp, np); if (send(np, bp->eth, sizeof(arp46_t))) { if (debug >= 2) { printf("Sent ARP for %s\n", inet_ntoa(np->ip)); } } np->flags &= ~NF_CONFLICT; } if (type == DHCP_ACK && !(np->flags & NF_CONFLICT)) { /* An acknowledgment. The address is all mine. */ cachedhcp(np->n, bp->dhcp); np->ip= bp->dhcp->yiaddr; np->mask= mask; np->server= server; set_ipconf(ipdev(np->n), np->ip, np->mask, mtu); if (debug >= 1) { printf("%s: Address set to %s\n", ipdev(np->n), cidr_ntoa(np->ip, np->mask)); } if (lease >= NEVER - now) { /* The lease is infinite! */ np->renew= np->rebind= np->lease= NEVER; } else { np->lease= now + lease; np->renew= now + renew; np->rebind= now + rebind; } if (test >= 3) { np->renew= now + 60; np->rebind= test >= 4 ? np->renew : np->renew + 60; np->lease= test >= 5 ? np->rebind : np->rebind + 60; } if (!(np->flags & NF_IRDP)) { np->sol_ct= (np->flags & NF_BOUND) ? 1 : N_SOLICITS; np->solicit= 0; } np->flags &= ~NF_NEGOTIATING; np->flags |= NF_BOUND; closedev(np, FT_ETHERNET); closedev(np, FT_BOOTPC); } if (type == DHCP_ACK && (np->flags & NF_CONFLICT)) { /* Alas there is a conflict. Decline to use the address. */ u8_t ethclid[1+DHCP_HLEN_ETH]; static char USED[]= "Address in use by 00:00:00:00:00:00"; type= DHCP_DECLINE; dhcp_init(bp->dhcp); bp->dhcp->op= DHCP_BOOTREQUEST; bp->dhcp->htype= DHCP_HTYPE_ETH; bp->dhcp->hlen= DHCP_HLEN_ETH; bp->dhcp->xid= XID(np); bp->dhcp->secs= 0; memcpy(bp->dhcp->chaddr, &np->eth, sizeof(np->eth)); settag(bp->dhcp, DHCP_TAG_REQIP, &np->ip, sizeof(np->ip)); settag(bp->dhcp, DHCP_TAG_TYPE, &type, 1); ether2clid(ethclid, &np->eth); settag(bp->dhcp, DHCP_TAG_CLIENTID,ethclid,sizeof(ethclid)); strcpy(USED+18, ether_ntoa(&np->conflict)); settag(bp->dhcp, DHCP_TAG_MESSAGE, USED, strlen(USED)); bp->udpio->uih_src_port= port_client; bp->udpio->uih_dst_port= port_server; bp->udpio->uih_ip_opt_len= 0; bp->udpio->uih_data_len= sizeof(dhcp_t); udp2ether(bp, np); if (send(np, bp->eth, sizeof(eth_hdr_t) + sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + sizeof(dhcp_t))) { if (debug >= 1) { printf("%s: Broadcast DHCP %s\n", np->fdp->device, dhcptypename(type)); if (debug >= 2) printdhcp(bp->dhcp); } } np->renew= np->rebind= np->lease= now + DELTA_FAST; np->delta= DELTA_FIRST; } if (type == DHCP_NAK) { /* Oops, a DHCP server doesn't like me, start over! */ np->renew= np->rebind= np->lease= now + DELTA_FAST; np->delta= DELTA_FIRST; fprintf(stderr, "%s: Got a NAK from %s", program, inet_ntoa(server)); if (relay != server) { fprintf(stderr, " through %s", inet_ntoa(relay)); } if (gettag(bp->dhcp, DHCP_TAG_MESSAGE, &pdata, &len)) { fprintf(stderr, " saying: \"%.*s\"", (int)len, pdata); } fputc('\n', stderr); } } else if (!(np->flags & NF_BOUND) && np->rebind > now && r >= sizeof(arp46_t) && is_arp_me(bp, np) ) { /* Oh no, someone else is using the address offered to me! */ np->flags |= NF_CONFLICT; fprintf(stderr, "%s: %s: %s offered by ", program, np->fdp->device, inet_ntoa(np->ip)); fprintf(stderr, "%s is already in use by %s\n", inet_ntoa(np->server), ether_ntoa(&np->conflict)); } put_buf(&bp); if (np->renew < event) event= np->renew; } /* Perform router solicitations. */ for (i= 0; i < n_nets; i++) { np= network[i]; if (np->solicit <= now) { if (!opendev(np, FT_ICMP, 1)) continue; np->solicit= NEVER; get_buf(&bp); if (np->gateway != 0) { /* No IRDP response seen yet, advertise the router given * by DHCP to my own interface. */ icmp_advert(bp, np); if (send(np, bp->ip, sizeof(ip_hdr_t) + 16)) { if (debug >= 2) { printf("%s: Sent advert for %s to self\n", np->fdp->device, inet_ntoa(np->gateway)); } } np->solicit= now + DELTA_ADV/2; } if (np->sol_ct >= 0 && --np->sol_ct >= 0) { /* Send a router solicitation. */ icmp_solicit(bp); if (send(np, bp->ip, sizeof(*bp->ip) + 8)) { if (debug >= 2) { printf("%s: Broadcast router solicitation\n", np->fdp->device); } } np->solicit= now + DELTA_SOL; } else { /* No response, or not soliciting right now. */ closedev(np, FT_ICMP); } put_buf(&bp); } if (np->solicit < event) event= np->solicit; } /* Read router adverts. */ for (i= 0; i < n_nets; i++) { np= network[i]; if (np->sol_ct < 0) continue; if (!opendev(np, FT_ICMP, 0)) continue; get_buf(&np->fdp->bp); r= asyn_read(&asyn, np->fdp->fd, np->fdp->bp->ip, BUF_IP_SIZE); if (r != -1) break; if (errno != ASYN_INPROGRESS && errno != EPACKSIZE) { report(np->fdp->device); sleep(10); } } /* Is there an advert? */ if (i < n_nets && r >= sizeof(ip_hdr_t) + 8) { ipaddr_t router; give_buf(&bp, &np->fdp->bp); if ((router= icmp_is_advert(bp)) != 0) { if (debug >= 2) { printf("%s: Router advert received from %s\n", np->fdp->device, inet_ntoa(router)); } np->solicit= NEVER; np->sol_ct= -1; np->flags |= NF_IRDP; closedev(np, FT_ICMP); } put_buf(&bp); } /* We start serving if the client side stuff has quieted down. */ for (i= 0; i < n_nets; i++) { np= network[i]; if (!(np->flags & NF_BOUND)) continue; if (np->flags & NF_RELAYING) { if (((np->ip ^ np->server) & np->mask) == 0) { /* Don't relay to a server that is on this same net. */ np->flags &= ~NF_RELAYING; } } if (np->flags & (NF_SERVING|NF_RELAYING)) serving= 1; } if (now <= start + 4*DELTA_FAST) { for (i= 0; i < n_nets; i++) { if (network[i]->renew <= now + DELTA_FAST) serving= 0; if (network[i]->solicit <= now + DELTA_SOL) serving= 0; } } /* Read DHCP requests. */ for (i= 0; i < n_nets; i++) { np= network[i]; if (!(np->flags & NF_BOUND)) continue; if (!(np->flags & (NF_SERVING|NF_RELAYING)) || !serving) continue; if (!opendev(np, FT_BOOTPS, 0)) continue; get_buf(&np->fdp->bp); r= asyn_read(&asyn, np->fdp->fd, np->fdp->bp->udpio, BUF_UDP_SIZE); if (r != -1) break; if (errno != ASYN_INPROGRESS && errno != EPACKSIZE) { report(np->fdp->device); sleep(10); } } /* Is there a request? */ if (i < n_nets && r >= sizeof(udp_io_hdr_t) + offsetof(dhcp_t, options) ) { give_buf(&bp, &np->fdp->bp); if (debug >= 1) { printf("%s: Got DHCP packet from %s to ", np->fdp->device, inet_ntoa(bp->udpio->uih_src_addr)); printf("%s\n", inet_ntoa(bp->udpio->uih_dst_addr)); if (debug >= 2) printdhcp(bp->dhcp); } /* Can we do something with this DHCP packet? */ if ((r= servdhcp(np, bp, r)) > 0) { /* Yes, we have something to send somewhere. */ if (send(np, bp->udpio, r)) { if (debug >= 1) { printf("%s: Sent DHCP packet to %s\n", np->fdp->device, inet_ntoa(bp->udpio->uih_dst_addr)); if (debug >= 2) printdhcp(bp->dhcp); } } } put_buf(&bp); } if (debug >= 1) { static char *lastbrk; extern char _end; if (sbrk(0) != lastbrk) { lastbrk= sbrk(0); printf("Memory use = %lu\n", (unsigned long) (lastbrk - &_end)); } fflush(stdout); } /* Bail out if not a server, and there is nothing else to do ever. */ if (!serving && event == NEVER) break; /* Wait for something to do. */ eventtv.tv_sec= event; if (asyn_wait(&asyn, 0, event == NEVER ? nil : &eventtv) < 0) { if (errno != EINTR) { report("asyn_wait()"); sleep(10); } } } if (debug >= 1) printf("Nothing more to do! Bailing out...\n"); return 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dhcpd.h - Dynamic Host Configuration Protocol daemon. * Author: Kees J. Bot * 16 Dec 2000 */ #define nil ((void*)0) /* Paths to files. */ #define PATH_DHCPCONF "/etc/dhcp.conf" #define PATH_DHCPPID "/usr/run/dhcpd.pid" #define PATH_DHCPCACHE "/usr/adm/dhcp.cache" #define PATH_DHCPPOOL "/usr/adm/dhcp.pool" #define CLID_MAX 32 /* Maximum client ID length. */ #ifndef EXTERN #define EXTERN extern #endif EXTERN char *program; /* This program's name. */ extern char *configfile; /* Configuration file. */ extern char *poolfile; /* Dynamic address pool. */ EXTERN int serving; /* True if being a DHCP server. */ EXTERN unsigned test; /* Test level. */ EXTERN unsigned debug; /* Debug level. */ EXTERN asynchio_t asyn; /* Bookkeeping for all async I/O. */ /* BOOTP UDP ports: (That they are different is quite stupid.) */ EXTERN u16_t port_server; /* Port server listens on. */ EXTERN u16_t port_client; /* Port client listens on. */ #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define between(a,c,z) (sizeof(c) <= sizeof(unsigned) ? \ (unsigned) (c) - (a) <= (unsigned) (z) - (a) : \ (unsigned long) (c) - (a) <= (unsigned long) (z) - (a)) /* To treat objects as octet arrays: */ #define B(a) ((u8_t *) (a)) /* Times. */ EXTERN time_t start, now; /* Start and current time. */ EXTERN time_t event; /* Time of the next timed event. */ /* Special times and periods: */ #define NEVER (sizeof(time_t) <= sizeof(int) ? INT_MAX : LONG_MAX) #define DELTA_FIRST 4 /* Between first and second query. */ #define DELTA_FAST 64 /* Unbound queries this often. */ #define DELTA_SLOW 512 /* Bound queries are more relaxed. */ #define N_SOLICITS 3 /* Number of solicitations. */ #define DELTA_SOL 3 /* Time between solicitations. */ #define DELTA_ADV 2048 /* Router adverts to self lifetime. */ /* Buffers for packets. */ typedef struct buf { eth_hdr_t *eth; /* Ethernet header in payload. */ ip_hdr_t *ip; /* IP header in payload. */ udp_hdr_t *udp; /* UDP header in payload. */ udp_io_hdr_t *udpio; /* UDP I/O header in payload. */ dhcp_t *dhcp; /* DHCP data in payload. */ u8_t pad[2]; /* buf[] must start at 2 mod 4. */ /* Payload: */ u8_t buf[ETH_MAX_PACK_SIZE]; } buf_t; #define BUF_ETH_SIZE (ETH_MAX_PACK_SIZE) #define BUF_IP_SIZE (BUF_ETH_SIZE - sizeof(eth_hdr_t)) #define BUF_UDP_SIZE (BUF_IP_SIZE - sizeof(ip_hdr_t) - sizeof(udp_hdr_t) \ + sizeof(udp_io_hdr_t)) /* Type of network device open: Ethernet, ICMP, BOOTP client, BOOTP server. */ typedef enum { FT_CLOSED, FT_ETHERNET, FT_ICMP, FT_BOOTPC, FT_BOOTPS } fdtype_t; typedef struct fd { /* An open descriptor. */ i8_t fd; /* Open descriptor. */ u8_t fdtype; /* Type of network open. */ char device[sizeof("/dev/eth###")]; /* Device name. */ u8_t n; /* Network that owns it. */ buf_t *bp; /* Associated packet buffer. */ time_t since; /* Open since when? */ } fd_t; /* Network state: Any IP device, Ethernet in sink mode, True Ethernet. */ typedef enum { NT_IP, NT_SINK, NT_ETHERNET } nettype_t; typedef struct network { /* Information on a network. */ u8_t n; /* Network number. */ ether_addr_t eth; /* Ethernet address of this net. */ u8_t flags; /* Various flags. */ u8_t type; /* What kind of net is this? */ i8_t sol_ct; /* Router solicitation count. */ ether_addr_t conflict; /* Address conflict with this one. */ fd_t *fdp; /* Current open device. */ struct network *wait; /* Wait for a resource list. */ ipaddr_t ip; /* IP address of this net. */ ipaddr_t mask; /* Associated netmask. */ ipaddr_t gateway; /* My router. */ ipaddr_t server; /* My DHCP server. */ const char *hostname; /* Optional hostname to query for. */ time_t start; /* Query or lease start time. */ time_t delta; /* Query again after delta seconds. */ time_t renew; /* Next query or go into renewal. */ time_t rebind; /* When to go into rebind. */ time_t lease; /* When our lease expires. */ time_t solicit; /* Time to do a router solicitation. */ } network_t; /* Flags. */ #define NF_NEGOTIATING 0x01 /* Negotiating with a DHCP server. */ #define NF_BOUND 0x02 /* Address configured through DHCP. */ #define NF_SERVING 0x04 /* I'm a server on this network. */ #define NF_RELAYING 0x08 /* I'm relaying for this network. */ #define NF_WAIT 0x10 /* Wait for a resource to free up. */ #define NF_IRDP 0x20 /* IRDP is used on this net. */ #define NF_CONFLICT 0x40 /* There is an address conflict. */ #define NF_POSSESSIVE 0x80 /* Keep address if lease expires. */ /* Functions defined in dhcpd.c. */ void report(const char *label); void fatal(const char *label); void *allocate(size_t size); int ifname2if(const char *name); network_t *if2net(int n); /* Devices.c */ void get_buf(buf_t **bp); void put_buf(buf_t **bp); void give_buf(buf_t **dbp, buf_t **sbp); network_t *newnetwork(void); void closefd(fd_t *fdp); int opendev(network_t *np, fdtype_t fdtype, int compete); void closedev(network_t *np, fdtype_t fdtype); char *ipdev(int n); int get_ipconf(char *device, ipaddr_t *ip, ipaddr_t *mask); void set_ipconf(char *device, ipaddr_t ip, ipaddr_t mask, unsigned mtu); /* Ether.c */ void udp2ether(buf_t *bp, network_t *np); int ether2udp(buf_t *bp); void make_arp(buf_t *bp, network_t *np); int is_arp_me(buf_t *bp, network_t *np); void icmp_solicit(buf_t *bp); void icmp_advert(buf_t *bp, network_t *np); ipaddr_t icmp_is_advert(buf_t *bp); /* Tags.c */ #define gettag(dp, st, pd, pl) dhcp_gettag((dp), (st), (pd), (pl)) void settag(dhcp_t *dp, int tag, void *data, size_t len); char *cidr_ntoa(ipaddr_t addr, ipaddr_t mask); void ether2clid(u8_t *clid, ether_addr_t *eth); void initdhcpconf(void); int makedhcp(dhcp_t *dp, u8_t *class, size_t calen, u8_t *client, size_t cilen, ipaddr_t ip, ipaddr_t ifip, network_t *np); char *dhcptypename(int type); void printdhcp(dhcp_t *dp); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ether.c - Raw Ethernet stuff * Author: Kees J. Bot * 16 Dec 2000 */ #include <sys/types.h> #include <fcntl.h> #include <string.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/ether.h> #include <net/gen/eth_hdr.h> #include <net/gen/ip_hdr.h> #include <net/gen/icmp.h> #include <net/gen/icmp_hdr.h> #include <net/gen/oneCsum.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/dhcp.h> #include "arp.h" #include "dhcpd.h" static ether_addr_t BCAST_ETH = {{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }}; #define BCAST_IP HTONL(0xFFFFFFFFUL) #define LOCALHOST HTONL(0x7F000001UL) static u16_t udp_cksum(ipaddr_t src, ipaddr_t dst, udp_hdr_t *udp) { /* Compute the checksum of an UDP packet plus data. */ struct udp_pseudo { ipaddr_t src, dst; u8_t zero, proto; u16_t length; } pseudo; size_t len; /* Fill in the UDP pseudo header that must be prefixed to the UDP * packet to compute the checksum of the whole thing. */ pseudo.src= src; pseudo.dst= dst; pseudo.zero= 0; pseudo.proto= IPPROTO_UDP; pseudo.length= udp->uh_length; len= ntohs(udp->uh_length); if (len & 1) { /* Length is odd? Pad with a zero. */ B(udp)[len++]= 0; } return oneC_sum(oneC_sum(0, &pseudo, sizeof(pseudo)), udp, len); } void udp2ether(buf_t *bp, network_t *np) { /* Transform a packet in UDP format to raw Ethernet. Ignore the UDP * addresses, always broadcast from 0.0.0.0. */ udp_io_hdr_t udpio; /* Save the UDP I/O header. */ udpio= *bp->udpio; /* Fill in the Ethernet, IP and UDP headers. */ bp->eth->eh_dst= BCAST_ETH; bp->eth->eh_src= np->eth; bp->eth->eh_proto= HTONS(ETH_IP_PROTO); bp->ip->ih_vers_ihl= 0x45; bp->ip->ih_tos= 0; bp->ip->ih_length= htons(sizeof(ip_hdr_t) + sizeof(udp_hdr_t) + udpio.uih_data_len); bp->ip->ih_id= 0; bp->ip->ih_flags_fragoff= NTOHS(0x4000); bp->ip->ih_ttl= IP_MAX_TTL; bp->ip->ih_proto= IPPROTO_UDP; bp->ip->ih_hdr_chk= 0; bp->ip->ih_src= 0; bp->ip->ih_dst= BCAST_IP; bp->ip->ih_hdr_chk= ~oneC_sum(0, bp->ip, sizeof(*bp->ip)); bp->udp->uh_src_port= udpio.uih_src_port; bp->udp->uh_dst_port= udpio.uih_dst_port; bp->udp->uh_length= htons(sizeof(udp_hdr_t) + udpio.uih_data_len); bp->udp->uh_chksum= 0; bp->udp->uh_chksum= ~udp_cksum(bp->ip->ih_src, bp->ip->ih_dst, bp->udp); } int ether2udp(buf_t *bp) { /* Transform an UDP packet read from raw Ethernet to normal UDP. * Return true iff the packet is indeed UDP and has no errors. */ udp_io_hdr_t udpio; if (bp->eth->eh_proto != HTONS(ETH_IP_PROTO) || bp->ip->ih_vers_ihl != 0x45 || bp->ip->ih_proto != IPPROTO_UDP || oneC_sum(0, bp->ip, 20) != (u16_t) ~0 || udp_cksum(bp->ip->ih_src, bp->ip->ih_dst, bp->udp) != (u16_t) ~0 ) { /* Not UDP/IP or checksums bad. */ return 0; } udpio.uih_src_addr= bp->ip->ih_src; udpio.uih_dst_addr= bp->ip->ih_dst; udpio.uih_src_port= bp->udp->uh_src_port; udpio.uih_dst_port= bp->udp->uh_dst_port; udpio.uih_ip_opt_len= 0; udpio.uih_data_len= ntohs(bp->udp->uh_length) - sizeof(udp_hdr_t); *bp->udpio= udpio; return 1; } void make_arp(buf_t *bp, network_t *np) { /* Create an ARP packet to query for my IP address. */ arp46_t *arp= (arp46_t *) bp->eth; memset(arp, 0, sizeof(*arp)); arp->dstaddr= BCAST_ETH; arp->srcaddr= np->eth; arp->ethtype= HTONS(ETH_ARP_PROTO); arp->hdr= HTONS(ARP_ETHERNET); arp->pro= HTONS(ETH_IP_PROTO); arp->hln= 6; arp->pln= 4; arp->op= HTONS(ARP_REQUEST); arp->sha= np->eth; memcpy(arp->spa, &np->ip, sizeof(np->ip)); memcpy(arp->tpa, &np->ip, sizeof(np->ip)); } int is_arp_me(buf_t *bp, network_t *np) { /* True iff an ARP packet is a reply from someone else with an address I * thought was mine. (That's like, bad.) */ arp46_t *arp= (arp46_t *) bp->eth; if (arp->ethtype == HTONS(ETH_ARP_PROTO) && arp->hdr == HTONS(ARP_ETHERNET) && arp->pro == HTONS(ETH_IP_PROTO) && arp->op == HTONS(ARP_REPLY) && memcmp(&arp->spa, &np->ip, sizeof(np->ip)) == 0 && memcmp(&arp->sha, &np->eth, sizeof(np->eth)) != 0 ) { np->conflict= arp->sha; return 1; } return 0; } void icmp_solicit(buf_t *bp) { /* Fill in a router solicitation ICMP packet. */ icmp_hdr_t *icmp= (icmp_hdr_t *) (bp->ip + 1); bp->ip->ih_vers_ihl= 0x45; bp->ip->ih_dst= BCAST_IP; icmp->ih_type= ICMP_TYPE_ROUTE_SOL; icmp->ih_code= 0; icmp->ih_hun.ihh_unused= 0; icmp->ih_chksum= 0; icmp->ih_chksum= ~oneC_sum(0, icmp, 8); } void icmp_advert(buf_t *bp, network_t *np) { /* Fill in a router advert to be sent to my own interface. */ icmp_hdr_t *icmp= (icmp_hdr_t *) (bp->ip + 1); bp->ip->ih_vers_ihl= 0x45; bp->ip->ih_dst= LOCALHOST; icmp->ih_type= ICMP_TYPE_ROUTER_ADVER; icmp->ih_code= 0; icmp->ih_hun.ihh_ram.iram_na= 1; icmp->ih_hun.ihh_ram.iram_aes= 2; icmp->ih_hun.ihh_ram.iram_lt= htons(DELTA_ADV); ((u32_t *) icmp->ih_dun.uhd_data)[0] = np->gateway; ((u32_t *) icmp->ih_dun.uhd_data)[1] = HTONL((u32_t) -9999); icmp->ih_chksum= 0; icmp->ih_chksum= ~oneC_sum(0, icmp, 16); } ipaddr_t icmp_is_advert(buf_t *bp) { /* Check if an IP packet is a router advertisement, and if it's genuine, * i.e. the sender is mentioned in the packet. */ icmp_hdr_t *icmp= (icmp_hdr_t *) (bp->ip + 1); int i; if (icmp->ih_type == ICMP_TYPE_ROUTER_ADVER) { for (i= 0; i < icmp->ih_hun.ihh_ram.iram_na; i++) { if (((u32_t *) icmp->ih_dun.uhd_data)[2*i] == bp->ip->ih_src) { /* It's a router! */ return bp->ip->ih_src; } } } return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tags.c - Obtain DHCP tags from the config file * Author: Kees J. Bot * 16 Dec 2000 */ #include <sys/types.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <signal.h> #include <string.h> #include <time.h> #include <limits.h> #include <configfile.h> #include <sys/ioctl.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/ether.h> #include <net/gen/if_ether.h> #include <net/gen/eth_hdr.h> #include <net/gen/ip_hdr.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/dhcp.h> #include "dhcpd.h" #define doff(field) offsetof(dhcp_t, field) void settag(dhcp_t *dp, int tag, void *data, size_t len) { if (!dhcp_settag(dp, tag, data, len)) { /* Oops, it didn't fit? Is this really Minix??? */ fprintf(stderr, "%s: DHCP packet too big, please trim the configuration\n", program); exit(1); } } static int name2ip(ipaddr_t *pip, const char *name, ipaddr_t ifip) { /* Translate a name to an IP address, preferably from the hosts file, * but also from the DNS if being a server. Prefer the address closest * to the interface with IP address 'ifip' if there are choices.. */ extern struct hostent *_gethostent(void); /* File reading versions. */ extern void _endhostent(void); struct hostent *he; size_t len= strlen(name); u32_t d, distance= -1; ipaddr_t ip; int i; char *hn; /* Already an IP address? */ if (inet_aton(name, pip)) return 1; /* In the hosts file? */ while ((he= _gethostent()) != nil) { hn= he->h_name; i= -1; do { if (strncasecmp(name, hn, len) == 0 && (hn[len] == 0 || hn[len] == '.') ) { memcpy(&ip, he->h_addr, sizeof(ip)); d= ntohl(ip) ^ ntohl(ifip); if (d < distance) { *pip= ip; distance= d; } break; } } while ((hn= he->h_aliases[++i]) != nil); } _endhostent(); if (distance < -1) return 1; /* Nothing? Try the real DNS if being a server. */ if (serving) { if ((he= gethostbyname(name)) != nil && he->h_addrtype == AF_INET) { /* Select the address closest to 'ifip'. */ for (i= 0; he->h_addr_list[i] != nil; i++) { memcpy(&ip, he->h_addr_list[i], sizeof(ip)); d= ntohl(ip) ^ ntohl(ifip); if (d < distance) { *pip= ip; distance= d; } } return 1; } } return 0; } static char *ip2name(ipaddr_t ip) { /* Translate an IP address to a name, etc, etc. */ extern struct hostent *_gethostent(void); /* File reading versions. */ extern void _endhostent(void); struct hostent *he; /* In the hosts file? */ while ((he= _gethostent()) != nil) { if (memcmp(he->h_addr, &ip, sizeof(ip)) == 0) break; } _endhostent(); /* Nothing? Try the real DNS if being a server. */ if (he == nil && serving) { he= gethostbyaddr((char *) &ip, sizeof(ip), AF_INET); } return he != nil ? he->h_name : nil; } static int cidr_aton(const char *cidr, ipaddr_t *addr, ipaddr_t *mask) { char *slash, *check; ipaddr_t a; int ok; unsigned long len; if ((slash= strchr(cidr, '/')) == nil) return 0; *slash++= 0; ok= inet_aton(cidr, &a); len= strtoul(slash, &check, 10); if (check == slash || *check != 0 || len > 32) ok= 0; *--slash= '/'; if (!ok) return 0; *addr= a; *mask= htonl(len == 0 ? 0 : (0xFFFFFFFFUL << (32-len)) & 0xFFFFFFFFUL); return 1; } char *cidr_ntoa(ipaddr_t addr, ipaddr_t mask) { ipaddr_t testmask= 0xFFFFFFFFUL; int n; static char result[sizeof("255.255.255.255/255.255.255.255")]; for (n= 32; n >= 0; n--) { if (mask == htonl(testmask)) break; testmask= (testmask << 1) & 0xFFFFFFFFUL; } sprintf(result, "%s/%-2d", inet_ntoa(addr), n); if (n == -1) strcpy(strchr(result, '/')+1, inet_ntoa(mask)); return result; } static size_t ascii2octet(u8_t *b, size_t size, const char *a) { /* Convert a series of hex digit pairs to an octet (binary) array at * 'b' with length 'size'. Return the number of octets in 'a' or * -1 on error. */ size_t len; int n, c; len= 0; n= 0; while ((c= *a++) != 0) { if (between('0', c, '9')) c= (c - '0') + 0x0; else if (between('a', c, 'f')) c= (c - 'a') + 0xa; else if (between('A', c, 'F')) c= (c - 'A') + 0xA; else { return -1; } if (n == 0) { if (len < size) b[len] = c << 4; } else { if (len < size) b[len] |= c; len++; } n ^= 1; } return n == 0 ? len : -1; } void ether2clid(u8_t *clid, ether_addr_t *eth) { /* Convert an Ethernet address to the default client ID form. */ clid[0]= DHCP_HTYPE_ETH; memcpy(clid+1, eth, DHCP_HLEN_ETH); } static size_t ascii2clid(u8_t *clid, const char *a) { /* Convert an ethernet address, or a series of hex digits to a client ID. * Return its length if ok, otherwise -1. */ size_t len; ether_addr_t *eth; if ((eth= ether_aton(a)) != nil) { ether2clid(clid, eth); len= 1+DHCP_HLEN_ETH; } else { len= ascii2octet(clid, CLID_MAX, a); } return len; } static config_t *dhcpconf; /* In-core DHCP configuration. */ /* DHCP tag types. */ typedef enum { TT_ASCII, TT_BOOLEAN, TT_IP, TT_NUMBER, TT_OCTET } tagtype_t; /* DHCP/BOOTP tag definitions. */ typedef struct tagdef { u8_t tag; /* Tag number. */ u8_t type; /* Type and flags. */ u8_t gran; /* Granularity. */ u8_t max; /* Maximum number of arguments. */ const char *name; /* Defined name. */ } tagdef_t; #define TF_TYPE 0x07 /* To mask out the type. */ #define TF_STATIC 0x08 /* "Static", i.e. a struct field. */ #define TF_RO 0x10 /* Read-only, user can't set. */ /* List of static DHCP fields. The tag field is misused here as an offset * into the DHCP structure. */ static tagdef_t statictag[] = { { doff(op), TT_NUMBER|TF_STATIC|TF_RO, 1, 1, "op" }, { doff(htype), TT_NUMBER|TF_STATIC|TF_RO, 1, 1, "htype" }, { doff(hlen), TT_NUMBER|TF_STATIC|TF_RO, 1, 1, "hlen" }, { doff(hops), TT_NUMBER|TF_STATIC|TF_RO, 1, 1, "hops" }, { doff(xid), TT_NUMBER|TF_STATIC|TF_RO, 4, 1, "xid" }, { doff(secs), TT_NUMBER|TF_STATIC|TF_RO, 2, 1, "secs" }, { doff(flags), TT_NUMBER|TF_STATIC|TF_RO, 2, 1, "flags" }, { doff(ciaddr), TT_IP|TF_STATIC|TF_RO, 1, 1, "ciaddr" }, { doff(yiaddr), TT_IP|TF_STATIC|TF_RO, 1, 1, "yiaddr" }, { doff(siaddr), TT_IP|TF_STATIC, 1, 1, "siaddr" }, { doff(giaddr), TT_IP|TF_STATIC|TF_RO, 1, 1, "giaddr" }, { doff(chaddr), TT_OCTET|TF_STATIC|TF_RO, 1, 16, "chaddr" }, { doff(sname), TT_ASCII|TF_STATIC, 1, 64, "sname" }, { doff(file), TT_ASCII|TF_STATIC, 1, 128, "file" }, }; #define N_STATIC arraysize(statictag) static tagdef_t alltagdef[N_STATIC + 254]; /* List of tag definitions. */ #define tagdef (alltagdef+N_STATIC-1) /* Just the optional ones. */ #define tagdefined(tp) ((tp)->name != nil) static void inittagdef(void) { /* Initialize the tag definitions from the "tag" commands in the config * file. */ int t; tagdef_t *tp; static tagdef_t predef[] = { { DHCP_TAG_NETMASK, TT_IP, 1, 1, "netmask" }, { DHCP_TAG_GATEWAY, TT_IP, 1, 255, "gateway" }, { DHCP_TAG_DNS, TT_IP, 1, 255, "DNSserver" }, }; static char *typenames[] = { "ascii", "boolean", "ip", "number", "octet" }; config_t *cfg; static u8_t rotags[] = { DHCP_TAG_REQIP, DHCP_TAG_OVERLOAD, DHCP_TAG_TYPE, DHCP_TAG_SERVERID, DHCP_TAG_REQPAR, DHCP_TAG_MESSAGE, DHCP_TAG_MAXDHCP }; for (t= 1; t <= 254; t++) { tp= &tagdef[t]; tp->tag= t; tp->type= TT_OCTET; tp->name= nil; } /* Set the static and "all Minix needs" tags. */ memcpy(alltagdef, statictag, sizeof(statictag)); for (tp= predef; tp < arraylimit(predef); tp++) tagdef[tp->tag] = *tp; /* Search for tag definitions in the config file. */ for (cfg= dhcpconf; cfg != nil; cfg= cfg->next) { config_t *cmd= cfg->list; if (strcasecmp(cmd->word, "tag") == 0) { ifH��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H��H������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ (config_length(cmd) == 6 && (cmd->next->flags & CFG_DULONG) && config_isatom(cmd->next->next) && config_isatom(cmd->next->next->next) && (cmd->next->next->next->next->flags & CFG_DULONG) && (cmd->next->next->next->next->next->flags & CFG_DULONG) ) { unsigned long tag, gran, max; const char *name, *typename; unsigned type; tag= strtoul(cmd->next->word, nil, 10); name= cmd->next->next->word; typename= cmd->next->next->next->word; gran= strtoul(cmd->next->next->next->next->word, nil, 10); max= strtoul(cmd->next->next->next->next->next->word, nil, 10); for (type= 0; type < arraysize(typenames); type++) { if (strcasecmp(typename, typenames[type]) == 0) break; } if (!(1 <= tag && tag <= 254) || !(type < arraysize(typenames)) || !((type == TT_NUMBER && (gran == 1 || gran == 2 || gran == 4)) || (type != TT_NUMBER && 1 <= gran && gran <= 16)) || !(max <= 255) ) { fprintf(stderr, "\"%s\", line %u: Tag definition is incorrect\n", cmd->file, cmd->line); exit(1); } tp= &tagdef[(int)tag]; tp->type= type; tp->name= name; tp->gran= gran; tp->max= max; } else { fprintf(stderr, "\"%s\", line %u: Usage: tag number name type granularity max\n", cmd->file, cmd->line); exit(1); } } } /* Many DHCP tags are not for the user to play with. */ for (t= 0; t < arraysize(rotags); t++) tagdef[rotags[t]].type |= TF_RO; } static tagdef_t *tagdefbyname(const char *name) { /* Find a tag definition by the name of the tag. Return null if not * defined. */ tagdef_t *tp; for (tp= alltagdef; tp < arraylimit(alltagdef); tp++) { if (tagdefined(tp) && strcasecmp(tp->name, name) == 0) return tp; } return nil; } void initdhcpconf(void) { /* Read/refresh configuration from the DHCP configuration file. */ dhcpconf= config_read(configfile, 0, dhcpconf); if (config_renewed(dhcpconf)) inittagdef(); } static void configtag(dhcp_t *dp, config_t *cmd, ipaddr_t ifip) { /* Add a tag to a DHCP packet from the config file. */ tagdef_t *tp; u8_t data[260], *d; size_t i; int delete= 0; if (strcasecmp(cmd->word, "no") == 0) { if (config_length(cmd) != 2 || !config_isatom(cmd->next)) { fprintf(stderr, "\"%s\", line %u: Usage: no tag-name\n", cmd->file, cmd->line); exit(1); } cmd= cmd->next; delete= 1; } if ((tp= tagdefbyname(cmd->word)) == nil) { fprintf(stderr, "\"%s\", line %u: Unknown tag '%s'\n", cmd->file, cmd->line, cmd->word); exit(1); } if (tp->type & TF_RO) { fprintf(stderr, "\"%s\", line %u: Tag '%s' can't be configured\n", cmd->file, cmd->line, cmd->word); exit(1); } i= 0; d= data; if (!delete) { config_t *arg= cmd->next; do { switch (tp->type & TF_TYPE) { case TT_ASCII: { if (arg == nil || !config_isatom(arg) || arg->next != nil) { fprintf(stderr, "\"%s\", line %u: Usage: %s string\n", cmd->file, cmd->line, cmd->word); exit(1); } strncpy((char *) data, arg->word, sizeof(data)); d += i = strnlen((char *) data, sizeof(data)); break;} case TT_BOOLEAN: { if (arg == nil || !config_isatom(arg) || !(strcasecmp(arg->word, "false") == 0 || strcasecmp(arg->word, "true") == 0) ) { fprintf(stderr, "\"%s\", line %u: Usage: %s false|true ...\n", cmd->file, cmd->line, cmd->word); exit(1); } if (d < arraylimit(data)) { *d++ = (arg->word[0] != 'f' && arg->word[0] != 'F'); } i++; break;} case TT_IP: { ipaddr_t ip; unsigned long len; char *end; if (arg == nil || !config_isatom(arg)) { fprintf(stderr, "\"%s\", line %u: Usage: %s host ...\n", cmd->file, cmd->line, cmd->word); exit(1); } if (arg->word[0] == '/' && between(1, len= strtoul(arg->word+1, &end, 10), 31) && *end == 0 ) { ip= htonl((0xFFFFFFFFUL << (32-len)) & 0xFFFFFFFFUL); } else if (!name2ip(&ip, arg->word, ifip)) { fprintf(stderr, "\"%s\", line %u: Can't translate %s to an IP address\n", arg->file, arg->line, arg->word); exit(1); } if (d <= arraylimit(data) - sizeof(ip)) { memcpy(d, &ip, sizeof(ip)); d += sizeof(ip); } i++; break;} case TT_NUMBER: { unsigned long n; int g; if (arg == nil || !(arg->flags & CFG_CLONG)) { fprintf(stderr, "\"%s\", line %u: Usage: %s number ...\n", cmd->file, cmd->line, cmd->word); exit(1); } n= strtoul(arg->word, nil, 0); g= tp->gran; do { if (d <= arraylimit(data)) *d++ = (n >> (--g * 8)) & 0xFF; } while (g != 0); i++; break;} case TT_OCTET: { if (arg == nil || !config_isatom(arg) || arg->next != nil) { fprintf(stderr, "\"%s\", line %u: Usage: %s hexdigits\n", cmd->file, cmd->line, cmd->word); exit(1); } i= ascii2octet(data, sizeof(data), arg->word); if (i == -1) { fprintf(stderr, "\"%s\", line %u: %s: Bad hexdigit string\n", arg->file, arg->line, arg->word); exit(1); } d= data + i; break;} } } while ((arg= arg->next) != nil); if (d > data + 255) { fprintf(stderr, "\"%s\", line %u: Tag value is way too big\n", cmd->file, cmd->line); exit(1); } if ((tp->type & TF_TYPE) != TT_NUMBER && (i % tp->gran) != 0) { fprintf(stderr, "\"%s\", line %u: Expected a multiple of %d initializers\n", cmd->file, cmd->line, tp->gran); exit(1); } if (tp->max != 0 && i > tp->max) { fprintf(stderr, "\"%s\", line %u: Got %d initializers, can have only %d\n", cmd->file, cmd->line, (int) i, tp->max); exit(1); } } if (tp->type & TF_STATIC) { size_t len= tp->gran * tp->max; if ((tp->type & TF_TYPE) == TT_IP) len *= sizeof(ipaddr_t); memset(B(dp) + tp->tag, 0, len); memcpy(B(dp) + tp->tag, data, (d - data)); } else { settag(dp, tp->tag, data, (d - data)); } } int makedhcp(dhcp_t *dp, u8_t *class, size_t calen, u8_t *client, size_t cilen, ipaddr_t ip, ipaddr_t ifip, network_t *np) { /* Fill in a DHCP packet at 'dp' for the host identified by the * (class, client, ip) combination. Makedhcp is normally called twice, * once to find the IP address (so ip == 0) and once again to find all * data that goes with that IP address (ip != 0). On the first call the * return value of this function should be ignored and only 'yiaddr' * checked and used as 'ip' on the next pass. True is returned iff there * is information for the client on the network at interface address * 'ifip', by checking if the 'ip' and 'ifip' are on the same network. * If np is nonnull then we are working for one of our own interfaces, so * options can be set and adjourning interfaces can be programmed. */ config_t *todo[16]; size_t ntodo= 0; ipaddr_t hip, mask; u8_t *pmask; char *hostname; u32_t distance= -1; initdhcpconf(); /* Start creating a packet. */ dhcp_init(dp); dp->op= DHCP_BOOTREPLY; /* The initial TODO list is the whole DHCP config. */ todo[ntodo++]= dhcpconf; while (ntodo > 0) { config_t *cmd, *follow; if (todo[ntodo-1] == nil) { ntodo--; continue; } cmd= todo[ntodo-1]->list; todo[ntodo-1]= todo[ntodo-1]->next; follow= nil; /* Macro or list to follow next? */ if (strcasecmp(cmd->word, "client") == 0) { u8_t cfgid[CLID_MAX]; size_t cfglen; char *name; int ifno; u32_t d; if (between(3, config_length(cmd), 5) && config_isatom(cmd->next) && (cfglen= ascii2clid(cfgid, cmd->next->word)) != -1 && config_isatom(cmd->next->next) && (((ifno= ifname2if(cmd->next->next->word)) == -1 && config_length(cmd) <= 4) || ((ifno= ifname2if(cmd->next->next->word)) != -1 && config_length(cmd) >= 4 && config_isatom(cmd->next->next->next))) ) { if (cilen == cfglen && memcmp(client, cfgid, cilen) == 0 && (ifno == -1 || np == nil || ifno == np->n) ) { config_t *atname= cmd->next->next; if (ifno != -1) atname= atname->next; name= atname->word; if (name2ip(&hip, name, ifip) && (ip == 0 || ip == hip)) { d= ntohl(hip) ^ ntohl(ifip); if (d < distance) { dp->yiaddr= hip; follow= atname->next; distance= d; } } } } else { fprintf(stderr, "\"%s\", line %u: Usage: client ID [ip#] host [macro|{params}]\n", cmd->file, cmd->line); exit(1); } } else if (strcasecmp(cmd->word, "class") == 0) { config_t *clist; int match; match= 0; for (clist= cmd->next; clist != nil && clist->next != nil && config_isatom(clist); clist= clist->next) { if (calen > 0 && strncmp(clist->word, (char *) class, calen) == 0 ) { match= 1; } } if (clist == cmd->next || clist->next != nil) { fprintf(stderr, "\"%s\", line %u: Usage: class class-name ... macro|{params}\n", cmd->file, cmd->line); } if (match) follow= clist; } else if (strcasecmp(cmd->word, "host") == 0) { if (config_length(cmd) == 3 && config_isatom(cmd->next) ) { if (ip != 0) { if (cidr_aton(cmd->next->word, &hip, &mask)) { if (((hip ^ ip) & mask) == 0) { if (!gettag(dp, DHCP_TAG_NETMASK, nil, nil)) { settag(dp, DHCP_TAG_NETMASK, &mask, sizeof(mask)); } dp->yiaddr= ip; follow= cmd->next->next; } } else if (name2ip(&hip, cmd->next->word, ifip)) { if (hip == ip) { dp->yiaddr= ip; follow= cmd->next->next; } } } } else { fprintf(stderr, "\"%s\", line %u: Usage: host host-spec macro|{params}\n", cmd->file, cmd->line); exit(1); } } else if (strcasecmp(cmd->word, "interface") == 0) { if (between(3, config_length(cmd), 4) && config_isatom(cmd->next) && config_isatom(cmd->next->next) ) { network_t *ifnp; if (np != nil) { if ((ifnp= if2net(ifname2if(cmd->next->word))) == nil) { fprintf(stderr, "\"%s\", line %u: Can't find interface %s\n", cmd->next->file, cmd->next->line, cmd->next->word); exit(1); } if (!name2ip(&hip, cmd->next->next->word, 0)) { fprintf(stderr, "\"%s\", line %u: Can't find IP address of %s\n", cmd->next->next->file, cmd->next->next->line, cmd->next->next->word); exit(1); } ifnp->ip= hip; if (ifnp == np) { dp->yiaddr= hip; follow= cmd->next->next->next; } } } else { fprintf(stderr, "\"%s\", line %u: Usage: interface ip# host%s\n", cmd->file, cmd->line, ntodo==1 ? " [macro|{params}]" : ""); exit(1); } } else if (strcasecmp(cmd->word, "macro") == 0) { if (config_length(cmd) == 2 && config_isatom(cmd->next)) { follow= cmd->next; } else if (ntodo > 1) { fprintf(stderr, "\"%s\", line %u: Usage: macro macro-name\n", cmd->file, cmd->line); exit(1); } } else if (strcasecmp(cmd->word, "tag") == 0) { if (ntodo > 1) { fprintf(stderr, "\"%s\", line %u: A %s can't be defined here\n", cmd->file, cmd->line, cmd->word); exit(1); } } else if (strcasecmp(cmd->word, "option") == 0) { int ifno; network_t *ifnp; config_t *opt; if ((opt= cmd->next) != nil && config_isatom(opt) && (ifno= ifname2if(opt->word)) != -1 ) { if ((ifnp= if2net(ifno)) == nil) { fprintf(stderr, "\"%s\", line %u: Interface %s is not enabled\n", opt->file, opt->line, opt->word); exit(1); } opt= opt->next; } else { ifnp= np; } if (config_length(opt) == 1 && config_isatom(opt) && strcasecmp(opt->word, "server") == 0 ) { if (np != nil) ifnp->flags |= NF_SERVING; } else if (config_length(opt) == 2 && config_isatom(opt) && strcasecmp(opt->word, "relay") == 0 && config_isatom(opt->next) ) { if (np != nil) { if (!name2ip(&hip, opt->next->word, ifip)) { fprintf(stderr, "\"%s\", line %u: Can't find IP address of %s\n", opt->next->file, opt->next->line, opt->next->word); exit(1); } ifnp->flags |= NF_RELAYING; ifnp->server= hip; } } else if (config_length(opt) == 1 && config_isatom(opt) && strcasecmp(opt->word, "possessive") == 0 ) { if (np != nil) ifnp->flags |= NF_POSSESSIVE; } else if (config_length(opt) == 2 && config_isatom(opt) && strcasecmp(opt->word, "hostname") == 0 && config_isatom(opt->next) ) { if (np != nil) np->hostname= opt->next->word; } else { fprintf(stderr, "\"%s\", line %u: Unknown option\n", cmd->file, cmd->line); exit(1); } } else { /* Must be an actual data carrying tag. */ configtag(dp, cmd, ifip); } if (follow != nil) { /* A client/class/host entry selects a macro or list that must * be followed next. */ config_t *macro; if (config_isatom(follow)) { /* Macro name */ config_t *cfg; for (cfg= dhcpconf; cfg != nil; cfg= cfg->next) { macro= cfg->list; if (strcasecmp(macro->word, "macro") == 0) { if (config_length(macro) == 3 && config_isatom(macro->next) && config_issub(macro->next->next) ) { if (strcasecmp(macro->next->word, follow->word) == 0 ) { break; } } else { fprintf(stderr, "\"%s\", line %u: Usage: macro macro-name {params}\n", macro->file, macro->line); } } } follow= cfg == nil ? nil : macro->next->next->list; } else { /* Simply a list of more tags and stuff. */ follow= follow->list; } if (ntodo == arraysize(todo)) { fprintf(stderr, "\"%s\", line %u: Nesting is too deep\n", follow->file, follow->line); exit(1); } todo[ntodo++]= follow; } } /* Check if the IP and netmask are OK for the interface. */ if (!gettag(dp, DHCP_TAG_NETMASK, &pmask, nil)) return 0; memcpy(&mask, pmask, sizeof(mask)); if (((ip ^ ifip) & mask) != 0) return 0; /* Fill in the hostname and/or domain. */ if ((hostname= ip2name(ip)) != nil) { char *domain; if ((domain= strchr(hostname, '.')) != nil) *domain++ = 0; if (!gettag(dp, DHCP_TAG_HOSTNAME, nil, nil)) { settag(dp, DHCP_TAG_HOSTNAME, hostname, strlen(hostname)); } if (domain != nil && !gettag(dp, DHCP_TAG_DOMAIN, nil, nil)) { settag(dp, DHCP_TAG_DOMAIN, domain, strlen(domain)); } } return 1; } static char *dhcpopname(int op) { static char *onames[] = { "??\?", "REQUEST", "REPLY" }; return onames[op < arraysize(onames) ? op : 0]; } char *dhcptypename(int type) { static char *tnames[] = { "??\?", "DISCOVER", "OFFER", "REQUEST", "DECLINE", "ACK", "NAK", "RELEASE", "INFORM" }; return tnames[type < arraysize(tnames) ? type : 0]; } void printdhcp(dhcp_t *dp) { /* Print the contents of a DHCP packet, usually for debug purposes. */ tagdef_t *tp; u8_t *data, *ovld; size_t i, len; for (tp= alltagdef; tp < arraylimit(alltagdef); tp++) { if (tp->type & TF_STATIC) { data= B(dp) + tp->tag; len= tp->gran * tp->max; if ((tp->type & TF_TYPE) == TT_IP) len *= sizeof(ipaddr_t); if (tp->tag == doff(chaddr)) len= dp->hlen; /* Don't show uninteresting stuff. */ if (tp->tag == doff(htype) && dp->htype == DHCP_HTYPE_ETH) continue; if (tp->tag == doff(hlen) && dp->hlen == DHCP_HLEN_ETH) continue; if ((tp->tag == doff(file) || tp->tag == doff(sname)) && gettag(dp, DHCP_TAG_OVERLOAD, &ovld, nil) && (ovld[0] & (tp->tag == doff(file) ? 1 : 2)) ) { continue; } for (i= 0; i < len && data[i] == 0; i++) {} if (i == len) continue; } else { if (!gettag(dp, tp->tag, &data, &len)) continue; } if (tagdefined(tp)) { printf("\t%s =", tp->name); } else { printf("\tT%d =", tp->tag); } i= 0; while (i < len) { switch (tp->type & TF_TYPE) { case TT_ASCII: { printf(" \"%.*s\"", (int) len, data); i= len; break;} case TT_BOOLEAN: { printf(data[i++] == 0 ? " false" : " true"); break;} case TT_IP: { ipaddr_t ip; memcpy(&ip, data+i, sizeof(ip)); printf(" %s", inet_ntoa(ip)); i += sizeof(ip); break;} case TT_NUMBER: { u32_t n= 0; int g= tp->gran; do n= (n << 8) | data[i++]; while (--g != 0); printf(" %lu", (unsigned long) n); if ((tp->type & TF_STATIC) && tp->tag == doff(op)) { printf(" (%s)", dhcpopname(n)); } if (!(tp->type & TF_STATIC) && tp->tag == DHCP_TAG_TYPE) { printf(" (%s)", dhcptypename(n)); } break;} case TT_OCTET: { if (i == 0) fputc(' ', stdout); printf("%02X", data[i++]); break;} } } fputc('\n', stdout); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������L .�������������..������������M Makefile������N ckcdeb.h������O ckcfn2.c������P ckcfns.c������Q ckcker.h������R ckcmai.c������S ckcpro.c������T ckcsym.h������U ckucmd.c������V ckucmd.h������W ckucon.c������X ckudia.c������Y ckufio.c������Z ckuscr.c������[ ckutio.c������\ ckuus2.c������] ckuus3.c������^ ckuusr.c������_ ckuusr.h������` ckwart.c������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for kermit # # CKUMNX.MAK, Version 2.11, 29 January 1988 ########################################################################### # # Compile and Link variables: # CC=exec cc LNKFLAGS=-i CFLAGS=-DV7 -DMINIX -D_MINIX -D_POSIX_SOURCE -O -wa # ########################################################################### # # Dependencies Section: # all: kermit kermit: ckcmai.o ckucmd.o ckuusr.o ckuus2.o ckuus3.o ckcpro.o ckcfns.o \ ckcfn2.o ckucon.o ckutio.o ckufio.o ckudia.o ckuscr.o $(CC) $(LNKFLAGS) -o kermit ckcmai.o ckutio.o \ ckufio.o ckcfns.o \ ckcfn2.o ckcpro.o ckucmd.o ckuus2.o ckuus3.o ckuusr.o \ ckucon.o ckudia.o ckuscr.o install -S 40k $@ install: /usr/bin/kermit /usr/bin/kermit: kermit install -cs -o bin -g uucp -m 2755 kermit $@ ckcmai.o: ckcmai.c ckcker.h ckcdeb.h ckcsym.h ckuusr.o: ckuusr.c ckucmd.h ckcker.h ckuusr.h ckcdeb.h ckuus2.o: ckuus2.c ckucmd.h ckcker.h ckuusr.h ckcdeb.h ckuus3.o: ckuus3.c ckucmd.h ckcker.h ckuusr.h ckcdeb.h ckucmd.o: ckucmd.c ckucmd.h ckcdeb.h ckcpro.o: ckcpro.c ckcker.h ckcdeb.h # I'm using the distributed copy of ckcpro.c. Unfortunately # wart won't compile. If you need to change ckcpro.w, you'll have # to find a way to reduce the number of strings in ckwart.c # # ckcpro.c: ckcpro.w wart # ./wart ckcpro.w ckcpro.c ckcfns.o: ckcfns.c ckcker.h ckcdeb.h ckcsym.h ckcfn2.o: ckcfn2.c ckcker.h ckcdeb.h ckcsym.h ckufio.o: ckufio.c ckcker.h ckcdeb.h ckutio.o: ckutio.c ckcdeb.h ckucon.o: ckucon.c ckcker.h ckcdeb.h wart: ckwart.o $(CC) $(LNKFLAGS) -o wart ckwart.o ckwart.o: ckwart.c ckudia.o: ckudia.c ckcker.h ckcdeb.h ckucmd.h ckuscr.o: ckuscr.c ckcker.h ckcdeb.h #Clean up intermediate and object files clean: rm -f *.o *.bak core kermit ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* C K C D E B . H */ /* For release 4E of C-Kermit, July 87. Incorporates changes from Phil Julian and Jack Rouse of SAS Institute for DG, Apollo, and Amiga support, and from Jim Noble of Planning Research Corp for Macintosh Megamax C support. */ /* This file is included by all C-Kermit modules, including the modules that aren't specific to Kermit (like the command parser and the ck?tio and ck?fio modules. It specifies format codes for debug(), tlog(), and similar functions, and includes any necessary typedefs to be used by all C-Kermit modules, and also includes some feature selection compile-time switches. */ /* Copyright (C) 1987 Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* DEBUG and TLOG should be defined in the Makefile if you want debugging and transaction logs. Don't define them if you want to save the space and overhead. */ #ifndef DEBUG #define debug(a,b,c,d) {} #endif #ifndef TLOG #define tlog(a,b,c,d) {} #endif /* Formats for debug(), tlog(), etc */ #define F000 0 #define F001 1 #define F010 2 #define F011 3 #define F100 4 #define F101 5 #define F110 6 #define F111 7 /* Unix Kernel Dependencies */ #ifdef SVR3 /* Sys V R3 declares signal() differently from other systems. */ typedef void SIGTYP; #else typedef int SIGTYP; #endif /* C Compiler Dependencies */ #ifdef ZILOG #define setjmp setret #define longjmp longret #define jmp_buf ret_buf typedef int ret_buf[10]; #endif /* zilog */ #ifdef PROVX1 typedef char CHAR; typedef long LONG; typedef int void; #else #ifdef V7 typedef char CHAR; typedef long LONG; #else #ifdef C70 typedef char CHAR; typedef long LONG; #else #ifdef BSD29 typedef char CHAR; typedef long LONG; #else typedef unsigned char CHAR; typedef long LONG; #endif #endif #endif #endif #ifdef TOWER1 typedef int void; #endif /* Line delimiter for text files */ /* If the system uses a single character for text file line delimitation, define NLCHAR to the value of that character. For text files, that character will be converted to CRLF upon output, and CRLF will be converted to that character on input during text-mode (default) packet operations. */ #ifdef MAC /* Macintosh */ #define NLCHAR 015 #else /* All Unix-like systems */ #define NLCHAR 012 #endif /* At this point, if there's a system that uses ordinary CRLF line delimitation AND the C compiler actually returns both the CR and the LF when doing input from a file, then #undef NLCHAR. */ /* The device name of a job's controlling terminal */ /* Special for VMS, same for all Unixes (?), not used by Macintosh */ #ifdef vax11c #define CTTNAM "TT:" #else #ifdef datageneral #define CTTNAM "@output" #else #define CTTNAM "/dev/tty" #endif #endif /* Some special includes for VAX/VMS */ #ifndef vax11c /* The following #includes cause problems for some preprocessors. */ /* #endif #ifdef vax11c #include ssdef #include stsdef #endif #ifndef vax11c */ #endif /* Program return codes for VMS, DECUS C, and Unix */ #ifdef vax11c #define GOOD_EXIT (SS$_NORMAL | STS$M_INHIB_MSG) #define BAD_EXIT SS$_ABORT #else #ifdef decus #define GOOD_EXIT IO_NORMAL #define BAD_EXIT IO_ERROR #else #define GOOD_EXIT 0 #define BAD_EXIT 1 #endif #endif /* Special hack for Fortune, which doesn't have <sys/file.h>... */ #ifdef FT18 #define FREAD 0x01 #define FWRITE 0x10 #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* C K C F N 2 -- System-independent Kermit protocol support functions... */ /* ...Part 2 (continued from ckcfns.c) */ /* Modified July 87 to incorporate changes from Jim Noble of Planning Research Corp for Macintosh Megamax C support. */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Note -- if you change this file, please amend the version number and date at the top of ckcfns.c accordingly. */ #include "ckcsym.h" /* Conditional compilation (for Macintosh) */ #include "ckcker.h" #include "ckcdeb.h" extern int spsiz, rpsiz, timint, npad, ebq, ebqflg, rpt, rptq, rptflg, capas; extern int pktnum, prvpkt, sndtyp, bctr, bctu, rsn, rln, maxtry, size; extern int osize, maxsize, spktl, nfils, stdouf, warn, timef, parity, speed; extern int turn, turnch, delay, displa, pktlog, tralog, seslog, xflg, mypadn; extern int deblog, hcflg, binary, fncnv, local, server, cxseen, czseen; extern long filcnt, ffc, flci, flco, tlci, tlco, tfc, fsize; extern char *cmarg, *cmarg2, **cmlist; extern CHAR padch, mypadc, eol, seol, ctlq, myctlq, sstate, *hlptxt; extern CHAR filnam[], sndpkt[], recpkt[], data[], srvcmd[]; extern CHAR *srvptr, stchr, mystch, *rdatap; char *strcpy(); /* Forward declarations */ unsigned chk2(); /* of non-int functions */ CHAR dopar(); /* ... */ static CHAR partab[] = { /* Even parity table for dopar() */ '\000', '\201', '\202', '\003', '\204', '\005', '\006', '\207', '\210', '\011', '\012', '\213', '\014', '\215', '\216', '\017', '\220', '\021', '\022', '\223', '\024', '\225', '\226', '\027', '\030', '\231', '\232', '\033', '\234', '\035', '\036', '\237', '\240', '\041', '\042', '\243', '\044', '\245', '\246', '\047', '\050', '\251', '\252', '\053', '\254', '\055', '\056', '\257', '\060', '\261', '\262', '\063', '\264', '\065', '\066', '\267', '\270', '\071', '\072', '\273', '\074', '\275', '\276', '\077', '\300', '\101', '\102', '\303', '\104', '\305', '\306', '\107', '\110', '\311', '\312', '\113', '\314', '\115', '\116', '\317', '\120', '\321', '\322', '\123', '\324', '\125', '\126', '\327', '\330', '\131', '\132', '\333', '\134', '\335', '\336', '\137', '\140', '\341', '\342', '\143', '\344', '\145', '\146', '\347', '\350', '\151', '\152', '\353', '\154', '\355', '\356', '\157', '\360', '\161', '\162', '\363', '\164', '\365', '\366', '\167', '\170', '\371', '\372', '\173', '\374', '\175', '\176', '\377' }; /* I N P U T -- Attempt to read packet number 'pktnum'. */ /* This is the function that feeds input to Kermit's finite state machine. If a special start state is in effect, that state is returned as if it were the type of an incoming packet. Otherwise: . If the desired packet arrives within MAXTRY tries, return its type, with its data stored in the global 'data' array. . If the previous packet arrives again, resend the last packet and wait for another to come in. . If the desired packet does not arrive within MAXTRY tries, return indicating that an error packet should be sent. */ input() { int type, numtry; if (sstate != 0) { /* If a start state is in effect, */ type = sstate; /* return it like a packet type, */ sstate = 0; /* and then nullify it. */ return(type); } else type = rpack(); /* Else, try to read a packet. */ debug(F111,"input",rdatap,type); /* If it's the same packet we just sent, it's an echo. Read another. */ if (type == sndtyp) type = rpack(); chkint(); /* Check for console interrupts. */ /* If previous packet again, a timeout pseudopacket, or a bad packet, try again. */ for (numtry = 0; (rsn == prvpkt || type == 'T' || type == 'Q' || type == 'N'); numtry++) { if (numtry > maxtry) { /* If too many tries, give up */ strcpy(data,"Timed out."); /* and send a timeout error packet, */ rdatap = data; /* and pretend we read one. */ return('E'); } if (type == 'E') return('E'); /* Don't even bother about seq no */ if ((type == 'N') && (rsn == ((pktnum+1) & 63))) { /* NAK for next packet */ return('Y'); /* is ACK for current. */ } else { resend(); /* Else, send last packet again, */ } if (sstate != 0) { /* If an interrupt routine has set */ type = sstate; /* sstate behind our back, return */ sstate = 0; /* that. */ *data = '\0'; return(type); } else type = rpack(); /* Else try to read a packet. */ chkint(); /* Look again for interruptions. */ if (type == sndtyp) type = rpack(); } ttflui(); /* Got what we want, clear input buffer. */ return(type); /* Success, return packet type. */ } /* S P A C K -- Construct and send a packet */ /* spack() sends a packet of the given type, sequence number n, with len data characters pointed to by d, in either a regular or extended- length packet, depending on length. Returns the number of bytes actually sent, or else -1 upon failure. Uses global npad, padch, mystch, bctu. Leaves packet in null-terminated global sndpkt[] array for later retransmission. Updates global sndpktl (send-packet length). */ spack(type,n,len,d) char type, *d; int n, len; { int i, j, lp; CHAR *sohp = sndpkt; CHAR pc; spktl = 0; pc = dopar(padch); /* The pad character, if any. */ for (i = 0; i < npad; sndpkt[i++] = pc) /* Do any requested padding */ sohp++; sndpkt[i++] = dopar(mystch); /* MARK */ lp = i++; /* Position of LEN, fill in later */ sndpkt[i++] = dopar(tochar(n)); /* SEQ field */ sndpkt[i++] = dopar(sndtyp = type); /* TYPE field */ j = len + bctu; /* True length */ if (j > 95) { /* Long packet? */ sndpkt[lp] = dopar(tochar(0)); /* Set LEN to zero */ sndpkt[i++] = dopar(tochar(j / 95)); /* High part */ sndpkt[i++] = dopar(tochar(j % 95)); /* Low part */ sndpkt[i] = '\0'; /* Header checksum */ sndpkt[i++] = dopar(tochar(chk1(sndpkt+lp))); } else sndpkt[lp] = dopar(tochar(j+2)); /* Normal LEN */ while (len-- > 0) sndpkt[i++] = dopar(*d++); /* Packet data */ sndpkt[i] = '\0'; /* Null-terminate */ switch (bctu) { /* Block check */ case 1: /* 1 = 6-bit chksum */ sndpkt[i++] = dopar(tochar(chk1(sndpkt+lp))); break; case 2: /* 2 = 12-bit chksum */ j = chk2(sndpkt+lp); sndpkt[i++] = dopar( (unsigned) tochar((j >> 6) & 077)); sndpkt[i++] = dopar( (unsigned) tochar(j & 077)); break; case 3: /* 3 = 16-bit CRC */ j = chk3(sndpkt+lp); sndpkt[i++] = dopar(tochar(( (unsigned)(j & 0170000)) >> 12)); sndpkt[i++] = dopar(tochar((j >> 6) & 077)); sndpkt[i++] = dopar(tochar(j & 077)); break; } sndpkt[i++] = dopar(seol); /* End of line (packet terminator) */ sndpkt[i] = '\0'; /* Terminate string */ if (ttol(sndpkt,i) < 0) return(-1); /* Send the packet */ spktl = i; /* Remember packet length */ flco += spktl; /* Count the characters */ tlco += spktl; if (pktlog) { /* If logging packets, log it */ zsout(ZPFILE,"s-"); if (*sndpkt) zsoutl(ZPFILE,sndpkt); else zsoutl(ZPFILE,sohp); } screen(SCR_PT,type,(long)n,sohp); /* Update screen */ return(i); /* Return length */ } /* D O P A R -- Add an appropriate parity bit to a character */ CHAR dopar(ch) CHAR ch; { int a; if (!parity) return(ch & 255); else a = ch & 127; switch (parity) { case 'e': return(partab[a]) & 255; /* Even */ case 'm': return(a | 128); /* Mark */ case 'o': return(partab[a] ^ 128) & 255; /* Odd */ case 's': return(a & 127); /* Space */ default: return(a); } } /* C H K 1 -- Compute a type-1 Kermit 6-bit checksum. */ chk1(pkt) char *pkt; { unsigned int chk; chk = chk2(pkt); chk = (((chk & 0300) >> 6) + chk) & 077; return(chk); } /*H��H��H��H��H��H��H��H���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� C H K 2 -- Compute the numeric sum of all the bytes in the packet. */ unsigned chk2(pkt) CHAR *pkt; { long chk; unsigned int m; m = (parity) ? 0177 : 0377; for (chk = 0; *pkt != '\0'; pkt++) chk += *pkt & m; return(chk & 07777); } /* C H K 3 -- Compute a type-3 Kermit block check. */ /* Calculate the 16-bit CRC of a null-terminated string using a byte-oriented tableless algorithm invented by Andy Lowry (Columbia University). The magic number 010201 is derived from the CRC-CCITT polynomial x^16+x^12+x^5+1. Note - this function could be adapted for strings containing imbedded 0's by including a length argument. Another note - Replacing this function by a table lookup version might speed things up. */ chk3(s) char *s; { unsigned int c, q; LONG crc = 0; while ((c = *s++) != '\0') { if (parity) c &= 0177; /* Strip any parity */ q = (crc ^ c) & 017; /* Low-order nibble */ crc = (crc >> 4) ^ (q * 010201); q = (crc ^ (c >> 4)) & 017; /* High order nibble */ crc = (crc >> 4) ^ (q * 010201); } return(crc); } /* Functions for sending various kinds of packets */ ack() { /* Send an ordinary acknowledgment. */ spack('Y',pktnum,0,""); /* No data. */ nxtpkt(&pktnum); /* Increment the packet number. */ } /* Note, only call this once! */ ack1(s) char *s; { /* Send an ACK with data. */ spack('Y',pktnum,strlen(s),s); /* Send the packet. */ nxtpkt(&pktnum); /* Increment the packet number. */ } /* Only call this once! */ nack() { /* Negative acknowledgment. */ spack('N',pktnum,0,""); /* NAK's never have data. */ } resend() { /* Send the old packet again. */ if (spktl) /* If buffer has something, */ ttol(sndpkt,spktl); /* resend it, */ else nack(); /* otherwise send a NAK. */ debug(F111,"resend",sndpkt,spktl); screen(SCR_PT,'%',(long)pktnum,"(resend)"); /* Say resend occurred */ if (pktlog) { zsout(ZPFILE,"s-"); zsoutl(ZPFILE,"(resend)"); /* Log packet if desired */ } } errpkt(reason) char *reason; { /* Send an error packet. */ encstr(reason); spack('E',pktnum,size,data); clsif(); clsof(1); screen(SCR_TC,0,0l,""); } scmd(t,dat) char t, *dat; { /* Send a packet of the given type */ encstr(dat); /* Encode the command string */ spack(t,pktnum,size,data); } srinit() { /* Send R (GET) packet */ encstr(cmarg); /* Encode the filename. */ spack('R',pktnum,size,data); /* Send the packet. */ } nxtpkt(num) int *num; { prvpkt = *num; /* Save previous */ *num = (*num + 1) % 64; /* Increment packet number mod 64 */ } sigint() { /* Terminal interrupt handler */ errpkt("User typed ^C"); doexit(GOOD_EXIT); /* Exit program */ } /* R P A C K -- Read a Packet */ /* rpack reads a packet and returns the packet type, or else Q if the packet was invalid, or T if a timeout occurred. Upon successful return, sets the values of global rsn (received sequence number), rln (received data length), and rdatap (pointer to null-terminated data field). */ rpack() { int i, j, x, try, type, lp; /* Local variables */ CHAR pbc[4]; /* Packet block check */ CHAR *sohp = recpkt; /* Pointer to SOH */ CHAR e; /* Packet end character */ rsn = rln = -1; /* In case of failure. */ *recpkt = '\0'; /* Clear receive buffer. */ rdatap = ""; e = (turn) ? turnch : eol; /* Use any handshake char for eol */ /* Try several times to get a "line". This allows for hosts that echo our */ /* normal CR packet terminator as CRLF. Don't diagnose CRLF as an */ /* invalid packet. */ #define TTITRY 3 for (try = 0; try < TTITRY; try++) { /* Try x times to get a "line". */ j = ttinl(recpkt,MAXRP,timint,e); if (j < 0) { if (j < -1) doexit(BAD_EXIT); /* Bail out if ^C^C typed. */ debug(F101,"rpack: ttinl fails","",j); screen(SCR_PT,'T',(long)pktnum,""); return('T'); /* Otherwise, call it a timeout. */ } tlci += j; /* All OK, Count the characters. */ flci += j; for (i = 0; (recpkt[i] != stchr) && (i < j); i++) sohp++; /* Find mark */ if (i++ < j) break; /* Found it. */ } if (try >= TTITRY) return('Q'); /* Diagnose bad packet. */ debug(F111,"ttinl",sohp,j); /* Log packet if requested. */ if (pktlog) { zsout(ZPFILE,"r-"); zsoutl(ZPFILE,sohp); } lp = i; /* Remember LEN position. */ if ((j = xunchar(recpkt[i++])) == 0) { if ((j = lp+5) > MAXRP) return('Q'); /* Long packet */ x = recpkt[j]; /* Header checksum. */ recpkt[j] = '\0'; /* Calculate & compare. */ if (xunchar(x) != chk1(recpkt+lp)) return('Q'); recpkt[j] = x; /* Checksum ok. */ rln = xunchar(recpkt[j-2]) * 95 + xunchar(recpkt[j-1]) - bctu; j = 3; /* Data offset. */ } else if (j < 3) { debug(F101,"rpack packet length less than 3","",j); return('Q'); } else { rln = j - bctu - 2; /* Regular packet */ j = 0; /* No extended header */ } rsn = xunchar(recpkt[i++]); /* Sequence number */ type = recpkt[i++]; /* Packet type */ i += j; /* Where data begins */ rdatap = recpkt+i; /* The data itself */ if ((j = rln + i) > MAXRP ) { debug(F101,"packet sticks out too far","",j); return('Q'); /* Find block check */ } /** debug(F101,"block check at","",j); **/ for (x = 0; x < bctu; x++) /* Copy it */ pbc[x] = recpkt[j+x]; pbc[x] = '\0'; /** debug(F110,"block check",pbc,bctu); **/ recpkt[j] = '\0'; /* Null-terminate data */ switch (bctu) { /* Check the block check */ case 1: if (xunchar(*pbc) != chk1(recpkt+lp)) { debug(F110,"checked chars",recpkt+lp,0); debug(F101,"block check","",xunchar(*pbc)); debug(F101,"should be","",chk1(recpkt+lp)); return('Q'); } break; case 2: x = xunchar(*pbc) << 6 | xunchar(pbc[1]); if (x != chk2(recpkt+lp)) { debug(F110,"checked chars",recpkt+lp,0); debug(F101,"block check","", x); debug(F101,"should be","", chk2(recpkt+lp)); return('Q'); } break; case 3: x = xunchar(*pbc) << 12 | xunchar(pbc[1]) << 6 | xunchar(pbc[2]); if (x != chk3(recpkt+lp)) { debug(F110,"checked chars",recpkt+lp,0); debug(F101,"block check","",xunchar(*pbc)); debug(F101,"should be","",chk1(recpkt+lp)); return('Q'); } break; default: return('Q'); } screen(SCR_PT,type,(long)rsn,sohp); /* Update screen */ return(type); /* Return packet type */ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *fnsv = "C-Kermit functions, 4E(053) 14 Sep 87"; /* C K C F N S -- System-independent Kermit protocol support functions. */ /* ...Part 1 (others moved to ckcfn2 to make this module small enough) */ /* 4E includes support for Data General systems from Phil Julian of SAS Institute, and Megamax native Macintosh C compiler support from Jim Noble of Planning Research Corporation. */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* System-dependent primitives defined in: ck?tio.c -- terminal i/o cx?fio.c -- file i/o, directory structure */ #include "ckcsym.h" /* Need this for Mac */ #include "ckcker.h" /* Symbol definitions for Kermit */ #include "ckcdeb.h" /* Debug formats, typedefs, etc. */ #ifndef NULL #define NULL 0 #endif /* Externals from ckcmai.c */ extern int spsiz, rpsiz, timint, rtimo, npad, ebq, ebqflg, rpt, rptq, rptflg, capas, keep; extern int pktnum, prvpkt, sndtyp, bctr, bctu, fmask, size, osize, maxsize, spktl, nfils, stdouf, warn, timef, spsizf; extern int parity, speed, turn, turnch, delay, displa, pktlog, tralog, seslog, xflg, mypadn; extern long filcnt, ffc, flci, flco, tlci, tlco, tfc, fsize; extern int tsecs; extern int deblog, hcflg, binary, savmod, fncnv, local, server, cxseen, czseen; extern int rq, rqf, sq, wsize, urpsiz, rln; extern int atcapr, atcapb, atcapu; extern int lpcapr, lpcapb, lpcapu; extern int swcapr, swcapb, swcapu; extern CHAR padch, mypadc, eol, seol, ctlq, myctlq, sstate; extern CHAR filnam[], sndpkt[], recpkt[], data[], srvcmd[], stchr, mystch; extern char *cmarg, *cmarg2, *hlptxt, **cmlist; extern CHAR *srvptr; extern char *rdatap; long zchki(); char *strcpy(); CHAR *rpar(); /* Variables local to this module */ static char *memptr; /* Pointer for memory strings */ static char cmdstr[100]; /* Unix system command string */ static int sndsrc; /* Flag for where to send from: */ /* -1: name in cmdata */ /* 0: stdin */ /* >0: list in cmlist */ static int memstr, /* Flag for input from memory string */ first; /* Flag for first char from input */ static CHAR t, /* Current character */ next; /* Next character */ #ifdef datageneral extern int quiet; #endif /* E N C S T R -- Encode a string from memory. */ /* Call this instead of getpkt() if source is a string, rather than a file. */ encstr(s) char* s; { int m; char *p; m = memstr; p = memptr; /* Save these. */ memptr = s; /* Point to the string. */ memstr = 1; /* Flag memory string as source. */ first = 1; /* Initialize character lookahead. */ getpkt(spsiz-bctu-3); /* Fill a packet from the string. */ memstr = m; /* Restore memory string flag */ memptr = p; /* and pointer */ first = 1; /* Put this back as we found it. */ } /* E N C O D E - Kermit packet encoding procedure */ encode(a) CHAR a; { /* The current character */ int a7; /* Low order 7 bits of character */ int b8; /* 8th bit of character */ if (rptflg) { /* Repeat processing? */ if (a == next && (first == 0)) { /* Got a run... */ if (++rpt < 94) /* Below max, just count */ return; else if (rpt == 94) { /* Reached max, must dump */ data[size++] = rptq; data[size++] = tochar(rpt); rpt = 0; } } else if (rpt == 1) { /* Run broken, only 2? */ rpt = 0; /* Yes, reset repeat flag & count. */ encode(a); /* Do the character twice. */ if (size <= maxsize) osize = size; rpt = 0; encode(a); return; } else if (rpt > 1) { /* More than two */ data[size++] = rptq; /* Insert the repeat prefix */ data[size++] = tochar(++rpt); /* and count. */ rpt = 0; /* Reset repeat counter. */ } } a7 = a & 0177; /* Isolate ASCII part */ b8 = a & 0200; /* and 8th (parity) bit. */ if (ebqflg && b8) { /* Do 8th bit prefix if necessary. */ data[size++] = ebq; a = a7; } if ((a7 < SP) || (a7==DEL)) { /* Do control prefix if necessary */ data[size++] = myctlq; a = ctl(a); } if (a7 == myctlq) /* Prefix the control prefix */ data[size++] = myctlq; if ((rptflg) && (a7 == rptq)) /* If it's the repeat prefix, */ data[size++] = myctlq; /* quote it if doing repeat counts. */ if ((ebqflg) && (a7 == ebq)) /* Prefix the 8th bit prefix */ data[size++] = myctlq; /* if doing 8th-bit prefixes */ data[size++] = a; /* Finally, insert the character */ data[size] = '\0'; /* itself, and mark the end. */ } /* D E C O D E -- Kermit packet decoding procedure */ /* Call with string to be decoded and an output function. */ /* Returns 0 on success, -1 on failure (e.g. disk full). */ decode(buf,fn) CHAR *buf; int (*fn)(); { unsigned int a, a7, b8; /* Low order 7 bits, and the 8th bit */ rpt = 0; /* Initialize repeat count. */ while ((a = *buf++) != '\0') { if (rptflg) { /* Repeat processing? */ if (a == rptq) { /* Yes, got a repeat prefix? */ rpt = xunchar(*buf++); /* Yes, get the repeat count, */ a = *buf++; /* and get the prefixed character. */ } } b8 = 0; /* Check high order "8th" bit */ if (ebqflg) { /* 8th-bit prefixing? */ if (a == ebq) { /* Yes, got an 8th-bit prefix? */ b8 = 0200; /* Yes, remember this, */ a = *buf++; /* and get the prefixed character. */ } } if (a == ctlq) { /* If control prefix, */ a = *buf++; /* get its operand. */ a7 = a & 0177; /* Only look at low 7 bits. */ if ((a7 >= 0100 && a7 <= 0137) || a7 == '?') /* Uncontrollify */ a = ctl(a); /* if in control range. */ } a |= b8; /* OR in the 8th bit */ if (rpt == 0) rpt = 1; /* If no repeats, then one */ #ifdef NLCHAR if (!binary) { /* If in text mode, */ if (a == CR) continue; /* discard carriage returns, */ if (a == LF) a = NLCHAR; /* convert LF to system's newline. */ } #endif for (; rpt > 0; rpt--) { /* Output the char RPT times */ if ((*fn)(a) < 0) return(-1); /* Send it to the output function. */ ffc++, tfc++; /* Count the character */ } } return(0); } /* Output functions passed to 'decode': */ putsrv(c) char c; { /* Put character in server command buffer */ *srvptr++ = c; *srvptr = '\0'; /* Make sure buffer is null-terminated */ return(0); } puttrm(c) char c; { /* Output character to console. */ conoc(c); return(0); } putfil(c) char c; { /* Output char to file. */ if (zchout(ZOFILE, c & fmask) < 0) { czseen = 1; /* If write error... */ debug(F101,"putfil zchout write error, setting czseen","",1); return(-1); } return(0); } /* G E T P K T -- Fill a packet data field */ /* Gets characters from the current source -- file or memory string. Encodes the data into the packet, filling the packet optimally. Set first = 1 when calling for the first time on a given input stream (string or file). Uses global variables: t -- current character. first -- flag: 1 to start up, 0 for input in progress, -1 for EOF. next -- next character. data -- the packet data buffer. size -- number of characters in the data buffer. Returns the size as value of the function, and also sets global size, and fills (and null-terminates) the global data array. Returns 0 upon eof. */ getpkt(bufmax) int bufmax; { /* Fill one packet buffer */ int i, x; /* Loop index. */ static char leftover[6] = { '\0', '\0', '\0', '\0', '\0', '\0' }; if (first == 1) { /* If first time thru... */ first = 0; /* remember, */ *leftover = '\0'; /* discard any interrupted leftovers, */ x = getchx(&t); /* get first character of file into t, */ if (x == 0) { /* watching out for nul�I��I��I��I��I��I��I��I�� I�� I�� I�� I�� I��I��I��I��I��I��I��I��I��I��I��I��I��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l file, */ first = -1; return(size = 0); } } else if ((first == -1) && (*leftover == '\0')) /* EOF from last time? */ return(size = 0); /* Do any leftovers */ for (size = 0; (data[size] = leftover[size]) != '\0'; size++) ; *leftover = '\0'; if (first == -1) return(size); /* Handle final leftovers leftovers */ /* Now fill up the rest of the packet. */ rpt = 0; /* Clear out any old repeat count. */ while (first > -1) { /* Until EOF... */ x = getchx(&next); /* Get next character for lookahead. */ if (x == 0) first = -1; /* Flag eof for next time. */ osize = size; /* Remember current position. */ encode(t); /* Encode the current character. */ t = next; /* Next is now current. */ if (size == bufmax) { /* If the packet is exactly full, */ /** debug(F101,"getpkt exact fit","",size); **/ return(size); /* ... return. */ } if (size > bufmax) { /* If too big, save some for next. */ for (i = 0; (leftover[i] = data[osize+i]) != '\0'; i++) ; /** debug(F111,"getpkt leftover",leftover,size); **/ /** debug(F101," osize","",osize); **/ size = osize; /* Return truncated packet. */ data[size] = '\0'; return(size); } } /* Otherwise, keep filling. */ debug(F111,"getpkt eof/eot",data,size); /* Fell thru before packet full, */ return(size); /* return partially filled last packet. */ } /* G E T C H X -- Get the next character from file (or pipe). */ /* On systems like Unix, the Macintosh, etc, that use a single character (NLCHAR, defined in ckcdeb.h) to separate lines in text files, and when in text/ascii mode (binary == 0), this function maps the newline character to CRLF. If NLCHAR is not defined, then this mapping is not done, even in text mode. Returns 1 on success with ch set to the character, or 0 on failure (EOF) */ getchx(ch) char *ch; { /* Get next character */ int x; CHAR a; /* The character to return. */ static int b = 0; /* A character to remember. */ if (b > 0) { /* Do we have a LF saved? */ b = 0; /* Yes, return that. */ *ch = LF; return(1); } if (memstr) /* Try to get the next character */ x = ((a = *memptr++) == '\0'); /* from the appropriate source, */ else /* memory or the current file. */ x = (zchin(ZIFILE,&a) == -1); if (x) return(0); /* No more, return 0 for EOF. */ else { /* Otherwise, read the next char. */ ffc++, tfc++; /* Count it. */ a &= fmask; /* Bytesize mask. */ #ifdef NLCHAR if (!binary && (a == NLCHAR)) { /* If nl and we must do nl-CRLF */ b = 1; /* mapping, remember a linefeed, */ *ch = CR; /* and return a carriage return. */ return(1); } else { *ch = a; /* General case, return the char. */ return(1); } #else *ch = a; return(1); #endif } } /* C A N N E D -- Check if current file transfer cancelled */ canned(buf) char *buf; { if (*buf == 'X') cxseen = 1; if (*buf == 'Z') czseen = 1; debug(F101,"canned: cxseen","",cxseen); debug(F101," czseen","",czseen); return((czseen || cxseen) ? 1 : 0); } /* R E S E T C -- Reset per-transaction character counters */ resetc() { tfc = tlci = tlco = 0; /* Total file chars, line chars in & out */ } /* T I N I T -- Initialize a transaction */ tinit() { xflg = 0; /* Reset x-packet flag */ memstr = 0; /* Reset memory-string flag */ memptr = NULL; /* and pointer */ bctu = 1; /* Reset block check type to 1 */ ebq = ebqflg = 0; /* Reset 8th-bit quoting stuff */ if (savmod) { /* If binary file mode was saved, */ binary = 1; /* restore it, */ savmod = 0; /* unsave it. */ } prvpkt = -1; /* Reset packet number */ pktnum = 0; cxseen = czseen = 0; /* Reset interrupt flags */ *filnam = '\0'; /* Clear file name */ *sndpkt = '\0'; /* Clear retransmission buffer */ if (server) /* If acting as server, */ timint = 30; /* Use 30 second timeout, */ } /* R I N I T -- Respond to S packet */ rinit(d) char *d; { char *tp; ztime(&tp); tlog(F110,"Transaction begins",tp,0l); /* Make transaction log entry */ filcnt = 0; /* Init file counter */ spar(d); ack1(rpar()); #ifdef datageneral if ((local) && (!quiet)) /* Only do this if local & not quiet */ consta_mt(); /* Start the asynch read task */ #endif } /* S I N I T -- Make sure file exists, then send Send-Init packet */ sinit() { int x; char *tp; filcnt = 0; sndsrc = nfils; /* Where to look for files to send */ ztime(&tp); tlog(F110,"Transaction begins",tp,0l); /* Make transaction log entry */ debug(F101,"sinit: sndsrc","",sndsrc); if (sndsrc < 0) { /* Must expand from 'send' command */ nfils = zxpand(cmarg); /* Look up literal name. */ if (nfils < 0) { screen(SCR_EM,0,0l,"Too many files"); return(0); } else if (nfils == 0) { /* If none found, */ char xname[100]; /* convert the name. */ zrtol(cmarg,xname); nfils = zxpand(xname); /* Look it up again. */ } if (nfils < 1) { /* If no match, report error. */ if (server) errpkt("File not found"); else screen(SCR_EM,0,0l,"File not found"); return(0); } x = gnfile(); /* Position to first file. */ if (x < 1) { if (!server) screen(SCR_EM,0,0l,"No readable file to send"); else errpkt("No readable file to send"); return(0); } } else if (sndsrc > 0) { /* Command line arglist -- */ x = gnfile(); /* Get the first file from it. */ if (x < 1) return(0); /* (if any) */ } else if (sndsrc == 0) { /* stdin or memory always exist... */ if ((cmarg2 != NULL) && (*cmarg2)) { strcpy(filnam,cmarg2); /* If F packet, "as" name is used */ cmarg2 = ""; /* if provided, */ } else /* otherwise */ strcpy(filnam,"stdin"); /* just use this. */ } debug(F101,"sinit: nfils","",nfils); debug(F110," filnam",filnam,0); debug(F110," cmdstr",cmdstr,0); ttflui(); /* Flush input buffer. */ if (!local && !server) sleep(delay); #ifdef datageneral if ((local) && (!quiet)) /* Only do this if local & not quiet */ consta_mt(); /* Start the asynch read task */ #endif sipkt('S'); /* Send the Send-Init packet. */ return(1); } sipkt(c) char c; { /* Send S or I packet. */ CHAR *rp; ttflui(); /* Flush pending input. */ rp = rpar(); /* Get parameters. */ spack(c,pktnum,strlen(rp),rp); } /* R C V F I L -- Receive a file */ rcvfil() { int x; ffc = flci = flco = 0; /* Init per-file counters */ srvptr = srvcmd; /* Decode file name from packet. */ decode(rdatap,putsrv); if (*srvcmd == '\0') /* Watch out for null F packet. */ strcpy(srvcmd,"NONAME"); screen(SCR_FN,0,0l,srvcmd); /* Put it on screen */ tlog(F110,"Receiving",srvcmd,0l); /* Transaction log entry */ if (cmarg2 != NULL) { /* Check for alternate name */ if (*cmarg2 != '\0') { strcpy(srvcmd,cmarg2); /* Got one, use it. */ *cmarg2 = '\0'; } } x = openo(srvcmd,filnam); /* Try to open it */ if (x) { tlog(F110," as",filnam,0l); screen(SCR_AN,0,0l,filnam); intmsg(++filcnt); #ifdef datageneral /* Need to turn on multi-tasking console interrupt task here, since multiple */ /* files may be received. */ if ((local) && (!quiet)) /* Only do this if local & not quiet */ consta_mt(); /* Start the asynch read task */ #endif } else { tlog(F110,"Failure to open",filnam,0l); screen(SCR_EM,0,0l,"Can't open file"); } return(x); /* Pass on return code from openo */ } /* R E O F -- Receive End Of File */ reof() { int x; if (cxseen == 0) cxseen = (*rdatap == 'D'); /* Got discard directive? */ x = clsof(cxseen | czseen); if (cxseen || czseen) { tlog(F100," *** Discarding","",0l); cxseen = 0; } else fstats(); return(x); } /* R E O T -- Receive End Of Transaction */ reot() { cxseen = czseen = 0; /* Reset interruption flags */ tstats(); } /* S F I L E -- Send File header or teXt header packet */ /* Call with x nonzero for X packet, zero for F packet */ /* Returns 1 on success, 0 on failure */ sfile(x) int x; { char pktnam[100]; /* Local copy of name */ char *s; if (x == 0) { /* F-Packet setup */ if (*cmarg2 != '\0') { /* If we have a send-as name, */ strcpy(pktnam,cmarg2); /* copy it literally, */ cmarg2 = ""; /* and blank it out for next time. */ } else { /* Otherwise use actual file name: */ if (fncnv) { /* If converting names, */ zltor(filnam,pktnam); /* convert it to common form, */ } else { /* otherwise, */ strcpy(pktnam,filnam); /* copy it literally. */ } } debug(F110,"sfile",filnam,0); /* Log debugging info */ debug(F110," pktnam",pktnam,0); if (openi(filnam) == 0) /* Try to open the file */ return(0); s = pktnam; /* Name for packet data field */ } else { /* X-packet setup */ debug(F110,"sxpack",cmdstr,0); /* Log debugging info */ s = cmdstr; /* Name for data field */ } flci = flco = ffc = 0; /* Init counters, etc. */ encstr(s); /* Encode the name into data[]. */ nxtpkt(&pktnum); /* Increment the packet number */ spack(x ? 'X' : 'F', pktnum, size, data); /* Send the F or X packet */ if (x == 0) { /* Display for F packet */ if (displa) { /* Screen */ screen(SCR_FN,'F',(long)pktnum,filnam); screen(SCR_AN,0,0l,pktnam); screen(SCR_FS,0,(long)fsize,""); } tlog(F110,"Sending",filnam,0l); /* Transaction log entry */ tlog(F110," as",pktnam,0l); } else { /* Display for X-packet */ screen(SCR_XD,'X',(long)pktnum,cmdstr); /* Screen */ tlog(F110,"Sending from:",cmdstr,0l); /* Transaction log */ } intmsg(++filcnt); /* Count file, give interrupt msg */ first = 1; /* Init file character lookahead. */ return(1); } /* S D A T A -- Send a data packet */ /* Return -1 if no data to send, else send packet and return length */ sdata() { int len; if (cxseen || czseen) return(-1); /* If interrupted, done. */ if ((len = getpkt(spsiz-bctu-3)) == 0) /* Done if no data. */ return(-1); nxtpkt(&pktnum); /* Increment the packet number */ spack('D',pktnum,len,data); /* Send the packet */ return(len); } /* S E O F -- Send an End-Of-File packet */ /* Call with a string pointer to character to put in the data field, */ /* or else a null pointer or "" for no data. */ seof(s) char *s; { nxtpkt(&pktnum); /* Increment the packet number */ if ((s != NULL) && (*s != '\0')) { spack('Z',pktnum,1,s); tlog(F100," *** interrupted, sending discard request","",0l); } else { spack('Z',pktnum,0,""); fstats(); } } /* S E O T -- Send an End-Of-Transaction packet */ seot() { nxtpkt(&pktnum); /* Increment the packet number */ spack('B',pktnum,0,""); /* Send the EOT packet */ cxseen = czseen = 0; /* Reset interruption flags */ tstats(); /* Log timing info */ } /* R P A R -- Fill the data array with my send-init parameters */ CHAR * rpar() { if (rpsiz > 94) data[1] = tochar(94); else data[1] = tochar(rpsiz); /* Biggest packet I can receive */ data[2] = tochar(rtimo); /* When I want to be timed out */ data[3] = tochar(mypadn); /* How much padding I need (none) */ data[4] = ctl(mypadc); /* Padding character I want */ data[5] = tochar(eol); /* End-Of-Line character I want */ data[6] = '#'; /* Control-Quote character I send */ switch (rqf) { /* 8th-bit prefix */ case -1: case 1: if (parity) ebq = sq = '&'; break; case 0: case 2: break; } data[7] = sq; data[8] = bctr + '0'; /* Block check type */ if (rptflg) /* Run length encoding */ data[9] = rptq; /* If receiving, agree. */ else data[9] = '~'; data[10] = tochar((atcapr?atcapb:0) | (lpcapr?lpcapb:0) | (swcapr?swcapb:0)); data[capas+1] = tochar(swcapr ? wsize : 0); /* Window size */ rpsiz = urpsiz; /* Long packets ... */ data[capas+2] = tochar(rpsiz / 95); /* Long packet size, big part */ data[capas+3] = tochar(rpsiz % 95); /* Long packet size, little part */ data[capas+4] = '\0'; /* Terminate the init string */ if (deblog) { debug(F110,"rpar",data+1,0); rdebu(capas+2); } return(data+1); /* Return pointer to string. */ } spar(s) char *s; { /* Set parameters */ int x, lpsiz; s--; /* Line up with field numbers. */ debug(F101,"spar rln","",rln); /* Limit on size of outbound packets */ x = (rln >= 1) ? xunchar(s[1]) : 80; lpsiz = spsiz; /* Remember what they SET. */ if (spsizf) { /* SET-command override? */ if (x < spsiz) spsiz = x; /* Ignore LEN unless smaller */ } else { /* otherwise */ spsiz = (x < 10) ? 80 : x; /* believe them if reasonable */ } /* Timeout on inbound packets */ if (!timef) { /* Only if not SET-cmd override */ x = (rln >= 2) ? xunchar(s[2]) : 5; timint = (x < 0) ? 5 : x; } /* Outbound Padding */ npad = 0; padch = '\0'; if (rln >= 3) { npad = xunchar(s[3]); if (rln >= 4) padch = ctl(s[4]); else padch = 0; } /* Outbound Packet Terminator */ seol = (rln >= 5) ? xunchar(s[5]) : '\r'; if ((seol < 2) || (seol > 31)) seol = '\r'; /* Control prefix */ x = (rln >= 6) ? s[6] : '#'; myctlq = ((x > 32 && x < 63) || (x > 95 && x < 127)) ? x : '#'; /* 8th-bit prefix */ rq = (rln >= 7) ? s[7] : 0; if (rq == 'Y') rqf = 1; else if ((rq > 32 && rq < 63) || (rq > 95 && rq < 127)) rqf = 2; else rqf = 0; switch (rqf) { case 0: ebqflg = 0; break; case 1: if (parity) { ebqflg = 1; ebq = '&'; } break; case 2: if (ebqflg = (ebq == sq || sq == 'Y')) ebq = rq; } /* Block check */ x = 1; if (rln >= 8) { x = s[8] - '0'; if ((x < 1) || (x > 3)) x = 1; } bctr = x; /* Repeat prefix */ if (rln >= 9) { rptq = s[9]; rptflg = ((rptq > 32 && rptq < 63) || (rptq > 95 && rptq < 127)); } else rptflg = 0; /* Capabilities */ atcapu = lpcapu = swcapu = 0; if (rln >= 10) { x = xunchar(s[10]); atcapu = (x & atcapb) && atcapr; lpcapu = (x & lpcapb) && lpcapr; swcapu = (x & swcapb) && swcapb; for (capas = 10; (xunchar(s[capas]) & 1) && (rln >= capas); capas++) ; } /* Long Packets */ if (lpcapu) { if (rln > capas+2) { x = xunchar(s[capas+2]) * 95 + xunchar(s[capas+3]); if (spsizf) { /* If overriding negotiations */ spsiz = (x < lpsiz) ? x : lpsiz; /* do this, */ } else { /* otherwise */ spsiz = (x > MAXSP) ? MAXSP : x; /* do this. */ } if (spsiz < 10) spsiz = 80; /* Be defensive... */ } } /* Sliding Windows */ if (swcapu) { if (rln > capas+1) { x = xunchar(s[capas+1]); wsize = x > MAXWS ? MAXWS : x; } else wsize = 1; } if (deblog) sdebu(rln); /* Record parameters in debug log */ } /* G N F I L E -- Get the next file name from a file group. */ /* Returns 1 if there's a next file, 0 otherwise */ gnfile() { int x; long y; #ifdef datageneral int dgfiles = 0; /* Number of files expanded */ static int dgnfils = -1; /* Saved nfils value */ #endif /* If file group interruption (C-Z) occured, fail. */ debug(F101,"gnfile: czseen","",czseen); if (czseen) { tlog(F100,"Transaction cancelled","",0l); return(0); } /* If input was stdin or memory string, there is no next file. */ if (sndsrc == 0) return(0); /* If file list comes from command line args, get the next list element. */ y = -1; while (y < 0) { /* Keep trying till we get one... */ if (sndsrc > 0) { if (nfils-- > 0) { #ifdef datageneral /* The DG does not internally expand the file names when a string of */ /* filenames is given. So we must in this case. */ if (dgnfils == -1) { /* This is executed first time only! */ strcpy(filnam,*cmlist++); dgfiles = zxpand(filnam); /* Expand the string */ debug(F111,"gnfile:cmlist filnam (x-init)",filnam,dgfiles); dgnfils = nfils + 1; debug(F111,"gnfile:cmlist filnam (x-init)",filnam,dgnfils); } x = znext(filnam); if (x > 0) { /* Get the next file in the expanded list */ debug(F111,"gnfile znext: filnam (exp-x=)",filnam,x); nfils = dgnfils; /* The virtual number of files left */ } if (x == 0) { /* Expand the next command argument */ if (dgnfils == 1) { dgnfils = -1; /* The last argument resets things */ *filnam = '\0'; debug(F101,"gnfile cmlist: nfils","",nfils); return(0); } strcpy(filnam,*cmlist++); /* Finish expanding last arg */ dgfiles = zxpand(filnam); /* Expand the string */ debug(F111,"gnfile: cmlist filnam (exp)",filnam,dgnfils); x = znext(filnam); debug(F111,"gnfile znext: filnam (exp)",filnam,x); nfils = dgnfils--; } #else strcpy(filnam,*cmlist++); debug(F111,"gnfile: cmlist filnam",filnam,nfils); #endif } else { *filnam = '\0'; debug(F101,"gnfile cmlist: nfils","",nfils); return(0); } } /* Otherwise, step to next element of internal wildcard expansion list. */ if (sndsrc < 0) { x = znext(filnam); debug(F111,"gnfile znext: filnam",filnam,x); if (x == 0) return(0); } /* Get here with a filename. */ y = zchki(filnam); /* Check if file readable */ if (y < 0) { debug(F110,"gnfile skipping:",filnam,0); tlog(F111,filnam,"not sent, reason",(long)y); screen(SCR_ST,ST_SKIP,0l,filnam); } else fsize = y; } return(1); } /* O P E N I -- Open an existing file for input */ openi(name) char *name; { int x, filno; if (memstr) return(1); /* Just return if file is memory. */ debug(F110,"openi",name,0); debug(F101," sndsrc","",sndsrc); filno = (sndsrc == 0) ? ZSTDIO : ZIFILE; /* ... */ debug(F101," file number","",filno); if (zopeni(filno,name)) { /* Otherwise, try to open it. */ debug(F110," ok",name,0); return(1); } else { /* If not found, */ char xname[100]; /* convert the name */ zrtol(name,xname); /* to local form and then */ x = zopeni(filno,xname); /* try opening it again. */ debug(F101," zopeni","",x); if (x) { debug(F110," ok",xname,0); return(1); /* It worked. */ } else { screen(SCR_EM,0,0l,"Can't open file"); /* It didn't work. */ tlog(F110,xname,"could not be opened",0l); debug(F110," openi failed",xname,0); return(0); } } } /* O P E N O -- Open a new file for output. */ /* Returns actual name under which the file was opened in string 'name2'. */ openo(name,name2) char *name, *name2; { char xname[100], *xp; if (stdouf) /* Receiving to stdout? */ return(zopeno(ZSTDIO,"")); debug(F110,"openo: name",name,0); if (cxseen || czseen) { /* If interrupted, get out before */ debug(F100," open cancelled","",0); /* destroying existing file. */ return(1); /* Pretend to succeed. */ } xp = xname; /* OK to proceed. */ if (fncnv) /* If desired, */ zrtol(name,xp); /* convert name to local form */ else /* otherwise, */ strcpy(xname,name); /* use it literally */ debug(F110,"openo: xname",xname,0); if (warn) { /* File collision avoidance? */ if (zchki(xname) != -1) { /* Yes, file exists? */ znewn(xname,&xp); /* Yes, make new name. */ strcpy(xname,xp); debug(F110," exists, new name ",xname,0); } } if (zopeno(ZOFILE,xname) == 0) { /* Try to open the file */ debug(F110,"openo failed",xname,0); tlog(F110,"Failure to open",xname,0l); return(0); } else { strcpy(name2,xname); debug(F110,"openo ok, name2",name2,0); return(1); } } /* O P E N T -- Open the terminal for output, in place of a file */ opent() { ffc = tfc = 0; return(zopeno(ZCTERM,"")); } /* C L S I F -- Close the current input file. */ clsif() { #ifdef datageneral if ((local) && (!quiet)) /* Only do this if local & not quiet */ if (nfils < 1) /* More files to send ... leave it on! */ connoi_mt(); #endif if (memstr) { /* If input was memory string, */ memstr = 0; /* indicate no more. */ } else zclose(ZIFILE); /* else close input file. */ if (czseen || cxseen) screen(SCR_ST,ST_DISC,0l,""); else screen(SCR_ST,ST_OK,0l,""); cxseen = hcflg = 0; /* Reset flags, */ *filnam = '\0'; /* and current file name */ } /* C L S O F -- Close an output file. */ /* Call with disp != 0 if file is to be discarded. */ /* Returns -1 upon failure to close, 0 or greater on success. */ clsof(disp) int disp; { int x; #ifdef datageneral if ((local) && (!quiet)) /* Only do this if local & not quiet */ connoi_mt(); #endif if ((x = zclose(ZOFILE)) < 0) { /* Try to close the file */ tlog(F100,"Failure to close",filnam,0l); screen(SCR_ST,ST_ERR,0l,""); } else if (disp && (keep == 0)) { /* Delete it if interrupted, */ if (*filnam) zdelet(filnam); /* and not keeping incomplete files */ debug(F100,"Discarded","",0); tlog(F100,"Discarded","",0l); screen(SCR_ST,ST_DISC,0l,""); } else { /* Nothing wrong, just keep it */ debug(F100,"Closed","",0); /* and give comforting messages. */ screen(SCR_ST,ST_OK,0l,""); } *filnam = '\0'; /* Zero the current file name. */ return(x); /* Send back zclose() return code. */ } /* S N D H L P -- Routine to send builtin help */ sndhlp() { nfils = 0; /* No files, no lists. */ xflg = 1; /* Flag we must send X packet. */ strcpy(cmdstr,"help text"); /* Data for X packet. */ first = 1; /* Init getchx lookahead */ memstr = 1; /* Just set the flag. */ memptr = hlptxt; /* And the pointer. */ if (binary) { /* If file mode is binary, */ binary = 0; /* turn it back to text for this, */ savmod = 1; /* remember to restore it later. */ } return(sinit()); } /* C W D -- Change current working directory */ /* String passed has first byte as length of directory name, rest of string is name. Fails if can't connect, else ACKs (with name) and succeeds. */ cwd(vdir) char *vdir; { char *cdd, *zgtdir(); vdir[xunchar(*vdir) + 1] = '\0'; /* End with a null */ if (zchdir(vdir+1)) { cdd = zgtdir(); /* Get new working directory. */ encstr(cdd); ack1(data); tlog(F110,"Changed directory to",cdd,0l); return(1); } else { tlog(F110,"Failed to change directory to",vdir+1,0l); return(0); } } /* S Y S C M D -- Do a system command */ /* Command string is formed by concatenating the two arguments. */ syscmd(prefix,suffix) char *prefix, *suffix; { char *cp; if (prefix == NULL || *prefix == '\0') return(0); #ifdef datageneral /* A kludge for now -- the real change needs to be done elsewhere... */ { extern char *WHOCMD; if ((strcmp(prefix,WHOCMD) == 0) && (*suffix == 0)) strcpy(suffix,"[!pids]"); } #endif for (cp = cmdstr; *prefix != '\0'; *cp++ = *prefix++) ; while (*cp++ = *suffix++) ; debug(F110,"syscmd",cmdstr,0); if (zopeni(ZSYSFN,cmdstr) > 0) { debug(F100,"syscmd zopeni ok",cmdstr,0); nfils = sndsrc = 0; /* Flag that input from stdin */ xflg = hcflg = 1; /* And special flags for pipe */ if (binary) { /* If file mode is binary, */ binary = 0; /* turn it back to text for this, */ savmod = 1; /* remember to restore it later. */ } return (sinit()); /* Send S packet */ } else { debug(F100,"syscmd zopeni failed",cmdstr,0); return(0); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ckcker.h -- Symbol and macro definitions for C-Kermit */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Mnemonics for ASCII characters */ #define NUL 000 /* ASCII Null */ #define SOH 001 /* ASCII Start of header */ #define BEL 007 /* ASCII Bell (Beep) */ #define BS 010 /* ASCII Backspace */ #define LF 012 /* ASCII Linefeed */ #define CR 015 /* ASCII Carriage Return */ #define XON 021 /* ASCII XON */ #define SP 040 /* ASCII Space */ #define DEL 0177 /* ASCII Delete (Rubout) */ /* Packet buffer and window sizes, will probably need to be #ifdef'd for */ /* each system. */ #define MAXSP 2048 /* Send packet buffer size */ #define MAXRP 1024 /* Receive packet buffer size */ #define MAXWS 1 /* Maximum window size */ /* Kermit parameters and defaults */ #define MAXPACK 94 /* Maximum unextended packet size */ #define CTLQ '#' /* Control char prefix I will use */ #define MYEBQ '&' /* 8th-Bit prefix char I will use */ #define MYRPTQ '~' /* Repeat count prefix I will use */ #define MAXTRY 10 /* Times to retry a packet */ #define MYPADN 0 /* How many padding chars I need */ #define MYPADC '\0' /* Which padding character I need */ #define DMYTIM 7 /* Default timeout interval to use. */ #define URTIME 10 /* Timeout interval to be used on me. */ #define DEFTRN 0 /* Default line turnaround handshake */ #define DEFPAR 0 /* Default parity */ #define MYEOL CR /* End-Of-Line character I need on packets. */ #define DRPSIZ 90 /* Default incoming packet size. */ #define DSPSIZ 90 /* Default outbound packet size. */ #define DDELAY 5 /* Default delay. */ #define DSPEED 9600 /* Default line speed. */ /* Files */ #define ZCTERM 0 /* Console terminal */ #define ZSTDIO 1 /* Standard input/output */ #define ZIFILE 2 /* Current input file */ #define ZOFILE 3 /* Current output file */ #define ZDFILE 4 /* Current debugging log file */ #define ZTFILE 5 /* Current transaction log file */ #define ZPFILE 6 /* Current packet log file */ #define ZSFILE 7 /* Current session log file */ #define ZSYSFN 8 /* Input from a system function */ #define ZNFILS 9 /* How many defined file numbers */ /* Screen functions */ #define SCR_FN 1 /* filename */ #define SCR_AN 2 /* as-name */ #define SCR_FS 3 /* file-size */ #define SCR_XD 4 /* x-packet data */ #define SCR_ST 5 /* File status: */ #define ST_OK 0 /* Transferred OK */ #define ST_DISC 1 /* Discarded */ #define ST_INT 2 /* Interrupted */ #define ST_SKIP 3 /* Skipped */ #define ST_ERR 4 /* Fatal Error */ #define SCR_PN 6 /* packet number */ #define SCR_PT 7 /* packet type or pseudotype */ #define SCR_TC 8 /* transaction complete */ #define SCR_EM 9 /* error message */ #define SCR_WM 10 /* warning message */ #define SCR_TU 11 /* arbitrary undelimited text */ #define SCR_TN 12 /* arbitrary new text, delimited at beginning */ #define SCR_TZ 13 /* arbitrary text, delimited at end */ #define SCR_QE 14 /* quantity equals (e.g. "foo: 7") */ /* Macros */ #define tochar(ch) ((ch) + SP ) /* Number to character */ #define xunchar(ch) ((ch) - SP ) /* Character to number */ #define ctl(ch) ((ch) ^ 64 ) /* Controllify/Uncontrollify */ #define unpar(ch) ((ch) & 127) /* Clear parity bit */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *versio = "C-Kermit, 4E(070) 29 Jan 88"; /* C K C M A I -- C-Kermit Main program */ /* 4E, add long packet support, plus changes for Apollo and Data General support from SAS Institute, and for Macintosh from Planning Research Corp, plus several important bug fixes. */ /* Author: Frank da Cruz, Columbia University Center for Computing Activities (CUCCA), 1984-88. Copyright (C) 1984, 1988, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* The Kermit file transfer protocol was developed at Columbia University. It is named after Kermit the Frog, star of the television series THE MUPPET SHOW; the name is used by permission of Henson Associates, Inc. "Kermit" is also Celtic for "free". */ /* Thanks to Herm Fischer of Encino CA for extensive contributions to version 4, and to the following people for their contributions over the years: Larry Afrin, Clemson U Stan Barber, Rice U Charles Brooks, EDN Bill Catchings, formerly of CUCCA Bob Cattani, Columbia U CS Dept Howard Chu, U of Michigan Bill Coalson, McDonnell Douglas Alan Crosswell, CUCCA Jeff Damens, formerly of CUCCA Joe R. Doupnik, Utah State U Glenn Everhart, RCA Labs Carl Fongheiser, CWRU Yekta Gursel, MIT Jim Guyton, Rand Corp Stan Hanks, Rice U. Ken Harrenstein, SRI Ron Heiby, Motorola Micromputer Division Steve Hemminger, Tektronix Randy Huntziger, NLM Phil Julian, SAS Institute Jim Knutson, U of Texas at Austin John Kunze, UC Berkeley David Lawyer, UC Irvine S.O. Lidie, Lehigh U Chris Maio, Columbia U CS Dept Leslie Mikesall, American Farm Bureau Martin Minow, DEC Tony Movshon, NYU Dan Murphy, ??? Jim Noble, Planning Research Corporation Paul Placeway, Ohio State U Ken Poulton, HP Labs Frank Prindle, NADC Scott Ribe, ??? Jack Rouse, SAS Institute Stew Rubenstein, Harvard Dan Schullman, DEC Gordon Scott, Micro Focus, Newbury UK David Sizeland, U of London Medical School Bradley Smith, UCLA Markku Toijala, Helsinki U of Technology Dave Tweten, AMES-NAS Walter Underwood, Ford Aerospace Pieter Van Der Linden, Centre Mondial (Paris) Wayne Van Pelt, GE/CRD Mark Vasoll & Gregg Wonderly, Oklahoma State University Stephen Walton, Ametek Computer Lauren Weinstein Joachim Wiesel, U of Karlsruhe Dave Woolley, CAP Communication Systems, London and many others. */ #include "ckcsym.h" /* Macintosh needs this */ #include "ckcker.h" #include "ckcdeb.h" /* Text message definitions.. each should be 256 chars long, or less. */ #ifdef MAC char *hlptxt = "\r\ MacKermit Server Commands:\r\ \r\ BYE\r\ FINISH\r\ GET filespec\r\ REMOTE CWD directory\r\ REMOTE HELP\r\ SEND filespec\r\ \r\0"; #else #ifdef AMIGA char *hlptxt = "C-Kermit Server Commands:\n\ \n\ GET filespec, SEND filespec, FINISH, BYE, REMOTE HELP\n\ \n\0"; #else #ifdef MINIX char *hlptxt = "C-Kermit Server REMOTE Commands:\n\ BYE CWD DELETE DIRECTORY FINISH GET HELP HOST SEND SPACE TYPE WHO\n\ \n\0"; #else /* MINIX */ char *hlptxt = "C-Kermit Server REMOTE Commands:\n\ \n\ GET files REMOTE CWD [dir] REMOTE DIRECTORY [files]\n\ SEND files REMOTE SPACE [dir] REMOTE HOST command\n\ FINISH REMOTE DELETE files REMOTE WHO [user]\n\ BYE REMOTE HELP REMOTE TYPE files\n\ \n\0"; #endif #endif #endif #ifdef MINIX char *srvtxt = "\r\n\ C-Kermit server starting.\n\ \r\n\0"; #else char *srvtxt = "\r\n\ C-Kermit server starting. Return to your local machine by typing\r\n\ its escape sequence for closing the connection, and issue further\r\n\ commands from there. To shut down the C-Kermit server, issue the\r\n\ FINISH or BYE command and then reconnect.\n\ \r\n\0"; #endif /* Declarations for Send-Init Parameters */ int spsiz = DSPSIZ, /* Biggest packet size we can send */ spsizf = 0, /* Flag to override what you ask for */ rpsiz = DRPSIZ, /* Biggest we want to receive */ urpsiz = DRPSIZ, /* User-requested rpsiz */ maxrps = MAXRP, /* Maximum incoming long packet size */ maxsps = MAXSP, /* Maximum outbound l.p. size */ maxtry = MAXTRY, /* Maximum retries per packet */ wsize = 1, /* Window size */ timint = DMYTIM, /* Timeout interval I use */ rtimo = URTIME, /* Timeout I want you to use */ timef = 0, /* Flag to override what you ask */ npad = MYPADN, /* How much padding to send */ mypadn = MYPADN, /* How much padding to ask for */ bctr = 1, /* Block check type requested */ bctu = 1, /* Block check type used */ ebq = MYEBQ, /* 8th bit prefix */ ebqflg = 0, /* 8th-bit quoting flag */ rqf = -1, /* Flag used in 8bq negotiation */ rq = 0, /* Received 8bq bid */ sq = 'Y', /* Sent 8bq bid */ rpt = 0, /* Repeat count */ rptq = MYRPTQ, /* Repeat prefix */ rptflg = 0; /* Repeat processing flag */ int capas = 10, /* Position of Capabilities */ atcapb = 8, /* Attribute capability */ atcapr = 0, /* requested */ atcapu = 0, /* used */ swcapb = 4, /* Sliding Window capability */ swcapr = 0, /* requested */ swcapu = 0, /* used */ lpcapb = 2, /* Long Packet capability */ lpcapr = 1, /* requested */ lpcapu = 0; /* used */ CHAR padch = MYPADC, /* Padding character to send */ mypadc = MYPADC, /* Padding character to ask for */ seol = MYEOL, /* End-Of-Line character to send */ eol = MYEOL, /* End-Of-Line character to look for */ ctlq = CTLQ, /* Control prefix in incoming data */ myctlq = CTLQ; /* Outbound control character prefix */ /* Packet-related variables */ int pktnum = 0, /* Current packet number */ prvpkt = -1, /* Previous packet number */ sndtyp, /* Type of packet just sent */ rsn, /* Received packet sequence number */ rln, /* Received packet length */ size, /* Current size of output pkt data */ osize, /* Previous output packet data size */ maxsize, /* Max size for building data field */ spktl = 0; /* Length packet being sent */ CHAR sndpkt[MAXSP+100], /* Entire packet being sent */ recpkt[MAXRP+200], /* Packet most recently received */ *rdatap, /* Pointer to received packet data */ data[MAXSP+4], /* Packet data buffer */ srvcmd[MAXRP+4], /* Where to decode server command */ *srvptr, /* Pointer to above */ mystch = SOH, /* Outbound packet-start character */ stchr = SOH; /* Incoming packet-start character */ /* File-related variables */ #ifdef datageneral CHAR filnam[256]; /* Name of current file. */ #else CHAR filnam[50]; /* Name of current file. */ #endif int nfils; /* Number of files in file group */ long fsize; /* Size of current file */ /* Communication line variables */ CHAR ttname[50]; /* Name of communication line. */ int parity, /* Parity specified, 0,'e','o',etc */ flow, /* Flow control, 1 = xon/xoff */ speed = -1, /* Line speed */ turn = 0, /* Line turnaround handshake flag */ tu%I��'I��(I��)I��*I��+I��,I��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rnch = XON, /* Line turnaround character */ duplex = 0, /* Duplex, full by default */ escape = 034, /* Escape character for connect */ delay = DDELAY, /* Initial delay before sending */ mdmtyp = 0; /* Modem type (initially none) */ int tlevel = -1; /* Take-file command level */ /* Statistics variables */ long filcnt, /* Number of files in transaction */ flci, /* Characters from line, current file */ flco, /* Chars to line, current file */ tlci, /* Chars from line in transaction */ tlco, /* Chars to line in transaction */ ffc, /* Chars to/from current file */ tfc; /* Chars to/from files in transaction */ int tsecs; /* Seconds for transaction */ /* Flags */ int deblog = 0, /* Flag for debug logging */ pktlog = 0, /* Flag for packet logging */ seslog = 0, /* Session logging */ tralog = 0, /* Transaction logging */ displa = 0, /* File transfer display on/off */ stdouf = 0, /* Flag for output to stdout */ xflg = 0, /* Flag for X instead of F packet */ hcflg = 0, /* Doing Host command */ fncnv = 1, /* Flag for file name conversion */ binary = 0, /* Flag for binary file */ savmod = 0, /* Saved file mode */ cmask = 0177, /* Connect byte mask */ fmask = 0377, /* File byte mask */ warn = 0, /* Flag for file warning */ quiet = 0, /* Be quiet during file transfer */ local = 0, /* Flag for external tty vs stdout */ server = 0, /* Flag for being a server */ cnflg = 0, /* Connect after transaction */ cxseen = 0, /* Flag for cancelling a file */ czseen = 0, /* Flag for cancelling file group */ keep = 0; /* Keep incomplete files */ /* Variables passed from command parser to protocol module */ char parser(); /* The parser itself */ char sstate = 0; /* Starting state for automaton */ char *cmarg = ""; /* Pointer to command data */ char *cmarg2 = ""; /* Pointer to 2nd command data */ char **cmlist; /* Pointer to file list in argv */ /* Miscellaneous */ char **xargv; /* Global copies of argv */ int xargc; /* and argc */ extern char *dftty; /* Default tty name from ckx???.c */ extern int dfloc; /* Default location: remote/local */ extern int dfprty; /* Default parity */ extern int dfflow; /* Default flow control */ /* M A I N -- C-Kermit main program */ #ifdef apollo /* On the Apollo, intercept main to insert a cleanup handler */ ckcmai(argc,argv) int argc; char **argv; { #else main(argc,argv) int argc; char **argv; { #endif char *strcpy(); /* Do some initialization */ xargc = argc; /* Make global copies of argc */ xargv = argv; /* ...and argv. */ sstate = 0; /* No default start state. */ strcpy(ttname,dftty); /* Set up default tty name. */ local = dfloc; /* And whether it's local or remote. */ parity = dfprty; /* Set initial parity, */ flow = dfflow; /* and flow control. */ if (sysinit() < 0) doexit(BAD_EXIT); /* And system-dependent things. */ /*** attempt to take ini file before doing command line ***/ cmdini(); /* Sets tlevel */ while (tlevel > -1) { /* Execute init file. */ sstate = parser(); /* Loop getting commands. */ if (sstate) proto(); /* Enter protocol if requested. */ } /* Look for a UNIX-style command line... */ if (argc > 1) { /* Command line arguments? */ sstate = cmdlin(); /* Yes, parse. */ if (sstate) { proto(); /* Take any requested action, then */ if (!quiet) conoll(""); /* put cursor back at left margin, */ if (cnflg) conect(); /* connect if requested, */ doexit(GOOD_EXIT); /* and then exit with status 0. */ } } /* If no action requested on command line, enter interactive parser */ herald(); /* Display program herald. */ while(1) { /* Loop getting commands. */ sstate = parser(); if (sstate) proto(); /* Enter protocol if requested. */ } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /* WARNING -- This C source program generated by Wart preprocessor. */ /* Do not edit this file; edit the Wart-format source file instead, */ /* and then run it through Wart to produce a new C source file. */ /* Wart Version Info: */ char *wartv = "Wart Version 1A(005) Jan 1988"; char *protv = "C-Kermit Protocol Module 4E(031), 31 Jul 87"; /* -*-C-*- */ /* C K C P R O -- C-Kermit Protocol Module, in Wart preprocessor notation. */ /* Authors: Frank da Cruz (SY.FDC@CU20B), Bill Catchings, Jeff Damens; Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ #include "ckcdeb.h" #include "ckcker.h" /* Note -- This file may also be preprocessed by the Unix Lex program, but you must indent the above #include statements before using Lex, and then restore them to the left margin in the resulting C program before compilation. Also, the invocation of the "wart()" function below must be replaced by an invocation of the "yylex()" function. It might also be necessary to remove comments in the %%...%% section. */ /* State definitions for Wart (or Lex) */ #define ipkt 1 #define rfile 2 #define rdata 3 #define ssinit 4 #define ssfile 5 #define ssdata 6 #define sseof 7 #define sseot 8 #define serve 9 #define generic 10 #define get 11 #define rgen 12 /* External C-Kermit variable declarations */ extern char sstate, *versio, *srvtxt, *cmarg, *cmarg2, *rpar(); extern char data[], filnam[], srvcmd[], ttname[], *srvptr; extern int pktnum, timint, nfils, hcflg, xflg, speed, flow, mdmtyp; extern int prvpkt, cxseen, czseen, server, local, displa, bctu, bctr, quiet; extern int tsecs, parity, backgrd; extern int putsrv(), puttrm(), putfil(), errpkt(); extern char *DIRCMD, *DELCMD, *TYPCMD, *SPACMD, *SPACM2, *WHOCMD; extern char *rdatap; /* Local variables */ static char vstate = 0; /* Saved State */ static char vcmd = 0; /* Saved Command */ int x; /* General-purpose integer */ char *s; /* General-purpose string pointer */ /* Macros - Note, BEGIN is predefined by Wart (and Lex) */ #define SERVE tinit(); BEGIN serve #define RESUME if (server) { SERVE; } else { sleep(2); return; } #define BEGIN state = int state = 0; wart() { int c,actno; extern int tbl[]; while (1) { c = input(); if ((actno = tbl[c + state*128]) != -1) switch(actno) { case 1: { tinit(); /* Do Send command */ if (sinit()) BEGIN ssinit; else RESUME; } break; case 2: { tinit(); BEGIN get; } break; case 3: { tinit(); vstate = get; vcmd = 0; sipkt('I'); BEGIN ipkt; } break; case 4: { tinit(); vstate = rgen; vcmd = 'C'; sipkt('I'); BEGIN ipkt; } break; case 5: { tinit(); vstate = rgen; vcmd = 'G'; sipkt('I'); BEGIN ipkt; } break; case 6: { sleep(1); SERVE; } break; case 7: { errpkt("User cancelled transaction"); /* "Abort" -- Tell other side. */ x = quiet; quiet = 1; /* Close files silently. */ clsif(); clsof(1); quiet = x; return(0); } break; case 8: { rinit(rdatap); bctu = bctr; /* Get Send-Init */ resetc(); /* Reset counters */ rtimer(); /* Reset timer */ BEGIN rfile; } break; case 9: { spar(rdatap); /* Get ack for I-packet */ if (vcmd) { scmd(vcmd,cmarg); vcmd = 0; } if (vstate == get) srinit(); BEGIN vstate; } break; case 10: { if (vcmd) scmd(vcmd,cmarg); /* Get E for I-packet (ignore) */ vcmd = 0; if (vstate == get) srinit(); BEGIN vstate; } break; case 11: { srvptr = srvcmd; decode(rdatap,putsrv); /* Get Receive-Init */ cmarg = srvcmd; nfils = -1; if (sinit()) BEGIN ssinit; else { SERVE; } } break; case 12: { spar(rdatap); ack1(rpar()); /* Get Init Parameters */ pktnum = 0; prvpkt = -1; } break; case 13: { srvptr = srvcmd; decode(rdatap,putsrv); /* Get & decode command. */ putsrv('\0'); putsrv('\0'); sstate = srvcmd[0]; BEGIN generic; } break; case 14: { srvptr = srvcmd; /* Get command for shell */ decode(rdatap,putsrv); putsrv('\0'); if (syscmd(srvcmd,"")) BEGIN ssinit; else { errpkt("Can't do system command"); SERVE; } } break; case 15: { errpkt("Unimplemented server function"); SERVE; } break; case 16: { if (!cwd(srvcmd+1)) errpkt("Can't change directory"); /* CWD */ SERVE; } break; case 17: { if (syscmd(DIRCMD,srvcmd+2)) BEGIN ssinit; /* Directory */ else { errpkt("Can't list directory"); SERVE; } } break; case 18: { if (syscmd(DELCMD,srvcmd+2)) BEGIN ssinit; /* Erase */ else { errpkt("Can't remove file"); SERVE; } } break; case 19: { ack(); screen(SCR_TC,0,0l,""); return(0); } break; case 20: { ack(); ttres(); screen(SCR_TC,0,0l,""); return(zkself()); } break; case 21: { if (sndhlp()) BEGIN ssinit; else { errpkt("Can't send help"); SERVE; } } break; case 22: { if (syscmd(TYPCMD,srvcmd+2)) BEGIN ssinit; else { errpkt("Can't type file"); SERVE; } } break; case 23: { x = *(srvcmd+1); /* Disk Usage query */ x = ((x == '\0') || (x == SP)); x = (x ? syscmd(SPACMD,"") : syscmd(SPACM2,srvcmd+2)); if (x) BEGIN ssinit; else { errpkt("Can't check space"); SERVE; }} break; case 24: { if (syscmd(WHOCMD,srvcmd+2)) BEGIN ssinit; else { errpkt("Can't do who command"); SERVE; } } break; case 25: { errpkt("Unimplemented generic server function"); SERVE; } break; case 26: { decode(rdatap,puttrm); RESUME; } break; case 27: { if (rcvfil()) { ack1(filnam); BEGIN rdata; } /* File header */ else { errpkt("Can't open file"); RESUME; } } break; case 28: { opent(); ack(); BEGIN rdata; } break; case 29: { ack(); tsecs = gtimer(); reot(); RESUME; } break; case 30: { if (cxseen) ack1("X"); /* Got data. */ else if (czseen) ack1("Z"); else ack(); decode(rdatap,putfil); } break; case 31: { if (reof() < 0) { /* Got End Of File */ errpkt("Can't close file"); RESUME; } else { ack(); BEGIN rfile; } } break; case 32: { spar(rdatap); bctu = bctr; /* Got ACK to Send-Init */ x = sfile(xflg); /* Send X or F header packet */ if (x) { resetc(); rtimer(); BEGIN ssfile; } else { s = xflg ? "Can't execute command" : "Can't open file"; errpkt(s); RESUME; } } break; case 33: { srvptr = srvcmd; /* Got ACK to F */ decode(rdatap,putsrv); putsrv('\0'); if (*srvcmd) tlog(F110," stored as",srvcmd,0); if (sdata() < 0) { clsif(); seof(""); BEGIN sseof; } else BEGIN ssdata; } break; case 34: { if (canned(rdatap)) { clsif(); seof("D"); BEGIN sseof; } else if (sdata() < 0) { clsif(); seof(""); BEGIN sseof; } } break; case 35: { if (gnfile() > 0) { /* Got ACK to EOF, get next file */ if (sfile(xflg)) BEGIN ssdata; else { errpkt("Can't open file") ; RESUME; } } else { /* If no next file, EOT */ tsecs = gtimer(); seot(); BEGIN sseot; } } break; case 36: { RESUME; } break; case 37: { ermsg(rdatap); /* Error packet, issue message. */ x = quiet; quiet = 1; /* Close files silently, */ clsif(); clsof(1); /* discarding any output file. */ tsecs = gtimer(); quiet = x; if (backgrd && !server) fatal("Protocol error"); RESUME; } break; case 38: { errpkt("Unknown packet type"); RESUME; } break; } } } int tbl[] = { -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 4I��6I��7I��8I��9I��:I��;I��<I��=I��>I��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 10, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 9, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 29, 38, 38, 37, 27, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 28, 38, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 30, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 31, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 32, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 33, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 34, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 35, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 36, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, -1, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 13, 15, 12, 15, 15, 15, 15, 15, 15, 15, 15, 11, 8, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 15, 4, 15, 15, 15, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 1, 15, 15, 2, 15, 6, 15, 15, 15, 15, 15, 15, 15, -1, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 16, 17, 18, 19, 25, 21, 25, 25, 25, 20, 25, 25, 25, 25, 25, 25, 25, 22, 23, 25, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 7, 25, 4, 25, 25, 25, 5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 3, 1, 25, 25, 2, 25, 6, 25, 25, 25, 25, 25, 25, 25, -1, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 8, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, 0, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 37, 27, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 8, 38, 38, 38, 38, 28, 26, 38, 38, 38, 38, 38, 38, 38, 7, 38, 4, 38, 38, 38, 5, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 3, 1, 38, 38, 2, 38, 6, 38, 38, 38, 38, 38, 38, 38, }; /* P R O T O -- Protocol entry function */ proto() { extern int sigint(); int x; conint(sigint); /* Enable console interrupts */ /* Set up the communication line for file transfer. */ if (local && (speed < 0)) { screen(SCR_EM,0,0l,"Sorry, you must 'set speed' first"); return; } x = -1; if (ttopen(ttname,&x,mdmtyp) < 0) { debug(F111,"failed: proto ttopen local",ttname,local); screen(SCR_EM,0,0l,"Can't open line"); return; } if (x > -1) local = x; debug(F111,"proto ttopen local",ttname,local); x = (local) ? speed : -1; if (ttpkt(x,flow,parity) < 0) { /* Put line in packet mode, */ screen(SCR_EM,0,0l,"Can't condition line"); return; } if (sstate == 'x') { /* If entering server mode, */ server = 1; /* set flag, */ if (!quiet) { if (!local) /* and issue appropriate message. */ conol(srvtxt); else { conol("Entering server mode on "); conoll(ttname); } } } else server = 0; if (sstate == 'v' && !local && !quiet) conoll("Escape back to your local system and give a SEND command..."); if (sstate == 's' && !local && !quiet) conoll("Escape back to your local system and give a RECEIVE command..."); sleep(1); /* The 'wart()' function is generated by the wart program. It gets a character from the input() routine and then based on that character and the current state, selects the appropriate action, according to the state table above, which is transformed by the wart program into a big case statement. The function is active for one transaction. */ wart(); /* Enter the state table switcher. */ if (server) { /* Back from packet protocol. */ server = 0; if (!quiet) /* Give appropriate message */ conoll("C-Kermit server done"); } ttres(); screen(SCR_TC,0,0l,""); /* Transaction complete */ } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* This file is for use with compilers that don't have the capability to * #define symbols on the C compiler command line. This file must * be #include'd before all other ck*.h files so that the symbols #define'd * here can be used for any subsequent conditional code. Symbols should be * #define'd as 1 if TRUE and 0 if FALSE. This implies, of course, that they * be tested with #if's, not #ifdef's and #ifndef's. */ /* * For example, this file was required to compile Macintosh Kermit under * Megamax C (which we don't do any more), because Megamax did not have * a mechanism for defining symbols on the command line, so this file was * used to define the symbol MAC. */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *cmdv = "Unix cmd package V2(022), 27 Jan 88"; /* C K U C M D -- Interactive command package for Unix */ /* V2 adds support for Data General and Apollo Aegis. */ /* Modelled after the DECSYSTEM-20 command parser (the COMND JSYS) Features: . parses and verifies keywords, text strings, numbers, and other data . displays appropriate menu or help message when user types "?" . does keyword and filename completion when user types ESC . accepts any unique abbreviation for a keyword . allows keywords to have attributes, like "invisible" . can supply defaults for fields omitted by user . provides command line editing (character, word, and line deletion) . accepts input from keyboard, command files, or redirected stdin . allows for full or half duplex operation, character or line input . settable prompt, protected from deletion Functions: cmsetp - Set prompt (cmprom is prompt string, cmerrp is error msg prefix) cmsavp - Save current prompt prompt - Issue prompt cmini - Clear the command buffer (before parsing a new command) cmres - Reset command buffer pointers (before reparsing) cmkey - Parse a keyword cmnum - Parse a number cmifi - Parse an input file name cmofi - Parse an output file name cmfld - Parse an arbitrary field cmtxt - Parse a text string cmcfm - Parse command confirmation (end of line) stripq - Strip out backslash quotes from a string. Return codes: -3: no input provided when required -2: input was invalid -1: reparse required (user deleted into a preceding field) 0 or greater: success See individual functions for greater detail. Before using these routines, the caller should #include ckucmd.h, and set the program's prompt by calling cmsetp(). If the file parsing functions cmifi and cmofi are to be used, this module must be linked with a ck?fio file system support module for the appropriate system, e.g. ckufio for Unix. If the caller puts the terminal in character wakeup ("cbreak") mode with no echo, then these functions will provide line editing -- character, word, and line deletion, as well as keyword and filename completion upon ESC and help strings, keyword, or file menus upon '?'. If the caller puts the terminal into character wakeup/noecho mode, care should be taken to restore it before exit from or interruption of the program. If the character wakeup mode is not set, the system's own line editor may be used. Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Includes */ #include <stdio.h> /* Standard C I/O package */ #include <ctype.h> /* Character types */ #include "ckucmd.h" /* Command parsing definitions */ #include "ckcdeb.h" /* Formats for debug() */ /* Local variables */ int psetf = 0, /* Flag that prompt has been set */ cc = 0, /* Character count */ dpx = 0; /* Duplex (0 = full) */ int hw = HLPLW, /* Help line width */ hc = HLPCW, /* Help line column width */ hh, /* Current help column number */ hx; /* Current help line position */ #define PROML 60 /* Maximum length for prompt */ char cmprom[PROML+1]; /* Program's prompt */ char *dfprom = "Command? "; /* Default prompt */ char cmerrp[PROML+1]; /* Program's error message prefix */ int cmflgs; /* Command flags */ char cmdbuf[CMDBL+4]; /* Command buffer */ char hlpbuf[HLPBL+4]; /* Help string buffer */ char atmbuf[ATMBL+4]; /* Atom buffer */ char filbuf[ATMBL+4]; /* File name buffer */ /* Command buffer pointers */ static char *bp, /* Current command buffer position */ *pp, /* Start of current field */ *np; /* Start of next field */ long zchki(); /* From ck?fio.c. */ /* C M S E T P -- Set the program prompt. */ cmsetp(s) char *s; { char *sx, *sy, *strncpy(); psetf = 1; /* Flag that prompt has been set. */ strncpy(cmprom,s,PROML - 1); /* Copy the string. */ cmprom[PROML] = NUL; /* Ensure null terminator. */ sx = cmprom; sy = cmerrp; /* Also use as error message prefix. */ while (*sy++ = *sx++) ; /* Copy. */ sy -= 2; if (*sy == '>') *sy = NUL; /* Delete any final '>'. */ } /* C M S A V P -- Save a copy of the current prompt. */ cmsavp(s,n) int n; char s[]; { extern char *strncpy(); /* +1 */ strncpy(s,cmprom,n-1); s[n] = NUL; } /* P R O M P T -- Issue the program prompt. */ prompt() { if (psetf == 0) cmsetp(dfprom); /* If no prompt set, set default. */ printf("\r%s",cmprom); /* Print the prompt. */ } /* C M R E S -- Reset pointers to beginning of command buffer. */ cmres() { cc = 0; /* Reset character counter. */ pp = np = bp = cmdbuf; /* Point to command buffer. */ cmflgs = -5; /* Parse not yet started. */ } /* C M I N I -- Clear the command and atom buffers, reset pointers. */ /* The argument specifies who is to echo the user's typein -- 1 means the cmd package echoes 0 somebody else (system, front end, terminal) echoes */ cmini(d) int d; { for (bp = cmdbuf; bp < cmdbuf+CMDBL; bp++) *bp = NUL; *atmbuf = NUL; dpx = d; cmres(); } stripq(s) char *s; { /* Function to strip '\' quotes */ char *t; while (*s) { if (*s == '\\') { for (t = s; *t != '\0'; t++) *t = *(t+1); } s++; } } /* C M N U M -- Parse a number in the indicated radix */ /* For now, only works for positive numbers in base 10. */ /* Returns -3 if no input present when required, -2 if user typed an illegal number, -1 if reparse needed, 0 otherwise, with n set to number that was parsed */ cmnum(xhlp,xdef,radix,n) char *xhlp, *xdef; int radix, *n; { int x; char *s; if (radix != 10) { /* Just do base 10 for now */ printf("cmnum: illegal radix - %d\n",radix); return(-1); } x = cmfld(xhlp,xdef,&s); debug(F101,"cmnum: cmfld","",x); if (x < 0) return(x); /* Parse a field */ if (digits(atmbuf)) { /* Convert to number */ *n = atoi(atmbuf); return(x); } else { printf("\n?not a number - %s\n",s); return(-2); } } /* C M O F I -- Parse the name of an output file */ /* Depends on the external function zchko(); if zchko() not available, use cmfld() to parse output file names. Returns -3 if no input present when required, -2 if permission would be denied to create the file, -1 if reparse needed, 0 or 1 otherwise, with xp pointing to name. */ cmofi(xhlp,xdef,xp) char *xhlp, *xdef, **xp; { int x; char *s; if (*xhlp == NUL) xhlp = "Output file"; *xp = ""; if ((x = cmfld(xhlp,xdef,&s)) < 0) return(x); if (chkwld(s)) { printf("\n?Wildcards not allowed - %s\n",s); return(-2); } if (zchko(s) < 0) { printf("\n?Write permission denied - %s\n",s); return(-2); } else { *xp = s; return(x); } } /* C M I F I -- Parse the name of an existing file */ /* This function depends on the external functions: zchki() - Check if input file exists and is readable. zxpand() - ExpaGI��II��JI��KI��LI��MI��NI��OI��PI��QI��RI��SI��TI��UI��VI��WI��XI��YI��ZI��[I��\I��]I��^I��_I��`I��aI��bI��cI��dI����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������nd a wild file specification into a list. znext() - Return next file name from list. If these functions aren't available, then use cmfld() to parse filenames. */ /* Returns -4 EOF -3 if no input present when required, -2 if file does not exist or is not readable, -1 if reparse needed, 0 or 1 otherwise, with: xp pointing to name, wild = 1 if name contains '*' or '?', 0 otherwise. */ cmifi(xhlp,xdef,xp,wild) char *xhlp, *xdef, **xp; int *wild; { int i, x, xc; long y; char *sp; cc = xc = 0; /* Initialize counts & pointers */ *xp = ""; if ((x = cmflgs) != 1) { /* Already confirmed? */ x = gtword(); /* No, get a word */ } else { cc = setatm(xdef); /* If so, use default, if any. */ } *xp = atmbuf; /* Point to result. */ *wild = chkwld(*xp); while (1) { xc += cc; /* Count the characters. */ debug(F111,"cmifi: gtword",atmbuf,xc); switch (x) { case -4: /* EOF */ case -2: /* Out of space. */ case -1: /* Reparse needed */ return(x); /* cont'd... */ /* ...cmifi(), cont'd */ case 0: /* SP or NL */ case 1: if (xc == 0) *xp = xdef; /* If no input, return default. */ else *xp = atmbuf; if (**xp == NUL) return(-3); /* If field empty, return -3. */ /* If filespec is wild, see if there are any matches */ *wild = chkwld(*xp); debug(F101," *wild","",*wild); if (*wild != 0) { y = zxpand(*xp); if (y == 0) { printf("\n?No files match - %s\n",*xp); return(-2); } else if (y < 0) { printf("\n?Too many files match - %s\n",*xp); return(-2); } else return(x); } /* If not wild, see if it exists and is readable. */ y = zchki(*xp); if (y == -3) { printf("\n?Read permission denied - %s\n",*xp); return(-2); } else if (y == -2) { printf("\n?File not readable - %s\n",*xp); return(-2); } else if (y < 0) { printf("\n?File not found - %s\n",*xp); return(-2); } return(x); /* cont'd... */ /* ...cmifi(), cont'd */ case 2: /* ESC */ if (xc == 0) { if (*xdef != '\0') { printf("%s ",xdef); /* If at beginning of field, */ addbuf(xdef); /* supply default. */ cc = setatm(xdef); } else { /* No default */ putchar(BEL); } break; } if (*wild = chkwld(*xp)) { /* No completion if wild */ putchar(BEL); break; } sp = atmbuf + cc; *sp++ = '*'; *sp-- = '\0'; y = zxpand(atmbuf); /* Add * and expand list. */ *sp = '\0'; /* Remove *. */ if (y == 0) { printf("\n?No files match - %s\n",atmbuf); return(-2); } else if (y < 0) { printf("\n?Too many files match - %s\n",atmbuf); return(-2); } else if (y > 1) { /* Not unique, just beep. */ putchar(BEL); } else { /* Unique, complete it. */ znext(filbuf); /* Get whole name of file. */ sp = filbuf + cc; /* Point past what user typed. */ printf("%s ",sp); /* Complete the name. */ addbuf(sp); /* Add the characters to cmdbuf. */ setatm(pp); /* And to atmbuf. */ *xp = atmbuf; /* Return pointer to atmbuf. */ return(cmflgs = 0); } break; /* cont'd... */ /* ...cmifi(), cont'd */ case 3: /* Question mark */ if (*xhlp == NUL) printf(" Input file specification"); else printf(" %s",xhlp); if (xc > 0) { sp = atmbuf + cc; /* Insert * at end */ #ifdef datageneral *sp++ = '+'; /* Insert +, the DG wild card */ #else *sp++ = '*'; #endif *sp-- = '\0'; y = zxpand(atmbuf); *sp = '\0'; if (y == 0) { printf("\n?No files match - %s\n",atmbuf); return(-2); } else if (y < 0) { printf("\n?Too many file match - %s\n",atmbuf); return(-2); } else { printf(", one of the following:\n"); clrhlp(); for (i = 0; i < y; i++) { znext(filbuf); addhlp(filbuf); } dmphlp(); } } else printf("\n"); printf("%s%s",cmprom,cmdbuf); break; } x = gtword(); } } /* C H K W L D -- Check for wildcard characters '*' or '?' */ chkwld(s) char *s; { for ( ; *s != '\0'; s++) { #ifdef datageneral /* Valid DG wild cards are '-', '+', '#', or '*' */ if ( (*s <= '-') && (*s >= '#') && ((*s == '-') || (*s == '+') || (*s == '#') || (*s == '*')) ) #else if ((*s == '*') || (*s == '?')) #endif return(1); } return(0); } /* C M F L D -- Parse an arbitrary field */ /* Returns -3 if no input present when required, -2 if field too big for buffer, -1 if reparse needed, 0 otherwise, xp pointing to string result. */ cmfld(xhlp,xdef,xp) char *xhlp, *xdef, **xp; { int x, xc; cc = xc = 0; /* Initialize counts & pointers */ *xp = ""; if ((x = cmflgs) != 1) { /* Already confirmed? */ x = gtword(); /* No, get a word */ } else { cc = setatm(xdef); /* If so, use default, if any. */ } *xp = atmbuf; /* Point to result. */ while (1) { xc += cc; /* Count the characters. */ debug(F111,"cmfld: gtword",atmbuf,xc); debug(F101," x","",x); switch (x) { case -4: /* EOF */ case -2: /* Out of space. */ case -1: /* Reparse needed */ return(x); case 0: /* SP or NL */ case 1: if (xc == 0) *xp = xdef; /* If no input, return default. */ else *xp = atmbuf; if (**xp == NUL) x = -3; /* If field empty, return -3. */ return(x); case 2: /* ESC */ if (xc == 0) { printf("%s ",xdef); /* If at beginning of field, */ addbuf(xdef); /* supply default. */ cc = setatm(xdef); /* Return as if whole field */ return(0); /* typed, followed by space. */ } else { putchar(BEL); /* Beep if already into field. */ } break; case 3: /* Question mark */ if (*xhlp == NUL) printf(" Please complete this field"); else printf(" %s",xhlp); printf("\n%s%s",cmprom,cmdbuf); break; } x = gtword(); } } /* C M T X T -- Get a text string, including confirmation */ /* Print help message 'xhlp' if ? typed, supply default 'xdef' if null string typed. Returns -1 if reparse needed or buffer overflows. 1 otherwise. with cmflgs set to return code, and xp pointing to result string. */ cmtxt(xhlp,xdef,xp) char *xhlp; char *xdef; char **xp; { int x; static int xc; debug(F101,"cmtxt, cmflgs","",cmflgs); cc = 0; /* Start atmbuf counter off at 0 */ if (cmflgs == -1) { /* If reparsing, */ xc = strlen(*xp); /* get back the total text length, */ } else { /* otherwise, */ *xp = ""; /* start fresh. */ xc = 0; } *atmbuf = NUL; /* And empty atom buffer. */ if ((x = cmflgs) != 1) { x = gtword(); /* Get first word. */ *xp = pp; /* Save pointer to it. */ } while (1) { xc += cc; /* Char count for all words. */ debug(F111,"cmtxt: gtword",atmbuf,xc); debug(F101," x","",x); switch (x) { case -4: /* EOF */ case -2: /* Overflow */ case -1: /* Deletion */ return(x); case 0: /* Space */ xc++; /* Just count it */ break; case 1: /* CR or LF */ if (xc == 0) *xp = xdef; return(x); case 2: /* ESC */ if (xc == 0) { printf("%s ",xdef); cc = addbuf(xdef); } else { putchar(BEL); } break; case 3: /* Question Mark */ if (*xhlp == NUL) printf(" Text string"); else printf(" %s",xhlp); printf("\n%s%s",cmprom,cmdbuf); break; default: printf("\n?Unexpected return code from gtword() - %d\n",x); return(-2); } x = gtword(); } } /* C M K E Y -- Parse a keyword */ /* Call with: table -- keyword table, in 'struct keytab' format; n -- number of entries in table; xhlp -- pointer to help string; xdef -- pointer to default keyword; Returns: -3 -- no input supplied and no default available -2 -- input doesn't uniquely match a keyword in the table -1 -- user deleted too much, command reparse required n >= 0 -- value associated with keyword */ cmkey(table,n,xhlp,xdef) struct keytab table[]; int n; char *xhlp, *xdef; { int i, y, z, zz, xc; char *xp; xc = cc = 0; /* Clear character counters. */ if ((zz = cmflgs) == 1) /* Command already entered? */ setatm(xdef); else zz = gtword(); debug(F101,"cmkey: table length","",n); debug(F101," cmflgs","",cmflgs); debug(F101," zz","",zz); while (1) { xc += cc; debug(F111,"cmkey: gtword",atmbuf,xc); switch(zz) { case -4: /* EOF */ case -2: /* Buffer overflow */ case -1: /* Or user did some deleting. */ return(zz); case 0: /* User terminated word with space */ case 1: /* or newline */ if (cc == 0) setatm(xdef); y = lookup(table,atmbuf,n,&z); switch (y) { case -2: printf("\n?Ambiguous - %s\n",atmbuf); return(cmflgs = -2); case -1: printf("\n?Invalid - %s\n",atmbuf); return(cmflgs = -2); default: break; } return(y); /* cont'd... */ /* ...cmkey(), cont'd */ case 2: /* User terminated word with ESC */ if (cc == 0) { if (*xdef != NUL) { /* Nothing in atmbuf */ printf("%s ",xdef); /* Supply default if any */ addbuf(xdef); cc = setatm(xdef); debug(F111,"cmkey: default",atmbuf,cc); } else { putchar(BEL); /* No default, just beep */ break; } } y = lookup(table,atmbuf,n,&z); /* Something in atmbuf */ debug(F111,"cmkey: esc",atmbuf,y); if (y == -2) { putchar(BEL); break; } if (y == -1) { printf("\n?Invalid - %s\n",atmbuf); return(cmflgs = -2); } xp = table[z].kwd + cc; printf("%s ",xp); addbuf(xp); debug(F110,"cmkey: addbuf",cmdbuf,0); return(y); /* cont'd... */ /* ...cmkey(), cont'd */ case 3: /* User terminated word with "?" */ y = lookup(table,atmbuf,n,&z); if (y > -1) { printf(" %s\n%s%s",table[z].kwd,cmprom,cmdbuf); break; } else if (y == -1) { printf("\n?Invalid\n"); return(cmflgs = -2); } if (*xhlp == NUL) printf(" One of the following:\n"); else printf(" %s, one of the following:\n",xhlp); clrhlp(); for (i = 0; i < n; i++) { if (!strncmp(table[i].kwd,atmbuf,cc) && !test(table[i].flgs,CM_INV)) addhlp(table[i].kwd); } dmphlp(); printf("%s%s", cmprom, cmdbuf); break; default: printf("\n%d - Unexpected return code from gtword\n",zz); return(cmflgs = -2); } zz = gtword(); } } /* C M C F M -- Parse command confirmation (end of line) */ /* Returns -2: User typed anything but whitespace or newline -1: Reparse needed 0: Confirmation was received */ cmcfm() { int x, xc; debug(F101,"cmcfm: cmflgs","",cmflgs); xc = cc = 0; if (cmflgs == 1) return(0); while (1) { x = gtword(); xc += cc; debug(F111,"cmcfm: gtword",atmbuf,xc); switch (x) { case -4: /* EOF */ case -2: case -1: return(x); case 0: /* Space */ continue; case 1: /* End of line */ if (xc > 0) { printf("?Not confirmed - %s\n",atmbuf); return(-2); } else return(0); case 2: putchar(BEL); continue; case 3: if (xc > 0) { printf("\n?Not confirmed - %s\n",atmbuf); return(-2); } printf("\n Type a carriage return to confirm the command\n"); printf("%s%s",cmprom,cmdbuf); continue; } } } /* Keyword help routines */ /* C L R H L P -- Initialize/Clear the help line buffer */ clrhlp() { /* Clear the help buffer */ hlpbuf[0] = NUL; hh = hx = 0; } /* A D D H L P -- Add a string to the help line buffer */ addhlp(s) char *s; { /* Add a word to the help buffer */ int j; hh++; /* Count this column */ for (j = 0; (j < hc) && (*s != NUL); j++) { /* Fill the column */ hlpbuf[hx++] = *s++; } if (*s != NUL) /* Still some chars left in string? */ hlpbuf[hx-1] = '+'; /* Mark as too long for column. */ if (hh < (hw / hc)) { /* Pad col with spaces if necessary */ for (; j < hc; j++) { hlpbuf[hx++] = SP; } } else { /* If last column, */ hlpbuf[hx++] = NUL; /* no spaces. */ dmphlp(); /* Print it. */ return; } } /* D M P H L P -- Dump the help line buffer */ dmphlp() { /* Print the help buffer */ hlpbuf[hx++] = NUL; printf(" %s\n",hlpbuf); clrhlp(); } /* L O O K U P -- Lookup the string in the given array of strings */ /* Call this way: v = lookup(table,word,n,&x); table - a 'struct keytab' table. word - the target string to look up in the table. n - the number of elements in the table. x - address of an integer for returning the table array index. The keyword table must be arranged in ascending alphabetical order, and all letters must be lowercase. Returns the keyword's associated value ( zero or greater ) if found, with the variable x set to the array index, or: -3 if nothing to look up (target was null), -2 if ambiguous, -1 if not found. A match is successful if the target matches a keyword exactly, or if the target is a prefix of exactly one keyword. It is ambiguous if the target matches two or more keywords from the table. */ lookup(table,cmd,n,x) char *cmd; struct keytab table[]; int n, *x; { int i, v, cmdlen; /* Lowercase & get length of target, if it's null return code -3. */ if ((((cmdlen = lower(cmd))) == 0) || (n < 1)) return(-3); /* Not null, look it up */ for (i = 0; i < n-1; i++) { if (!strcmp(table[i].kwd,cmd) || ((v = !strncmp(table[i].kwd,cmd,cmdlen)) && strncmp(table[i+1].kwd,cmd,cmdlen))) { *x = i; return(table[i].val); } if (v) return(-2); } /* Last (or only) element */ if (!strncmp(table[n-1].kwd,cmd,cmdlen)) { *x = n-1; return(table[n-1].val); } else return(-1); } /* G E T W D -- Gets a "word" from the command input stream */ /* Usage: retcode = gtword(); Returns: -4 if end of file (e.g. pipe broken) -2 if command buffer overflows -1 if user did some deleting 0 if word terminates with SP or tab 1 if ... CR 2 if ... ESC 3 if ... ? With: pp pointing to beginning of word in buffer bp pointing to after current position atmbuf containing a copy of the word cc containing the number of characters in the word copied to atmbuf */ gtword() { int c; /* Current char */ static int inword = 0; /* Flag for start of word found */ int quote = 0; /* Flag for quote character */ int echof = 0; /* Flag for whether to echo */ int ignore = 0; #ifdef datageneral extern int termtype; /* DG terminal type flag */ extern int con_reads_mt; /* Console read asynch is active */ if (con_reads_mt) connoi_mt(); /* Task would interfere w/cons read */ #endif pp = np; /* Start of current field */ debug(F101,"gtword: cmdbuf","",(int) cmdbuf); debug(F101," bp","",(int) bp); debug(F101," pp","",(int) pp); debug(F110," cmdbuf",cmdbuf,0); while (bp < cmdbuf+CMDBL) { /* Loop */ ignore = echof = 0; /* Flag for whether to echo */ if ((c = *bp) == NUL) { /* Get next character */ if (dpx) echof = 1; /* from reparse buffer */ #ifdef datageneral { char ch; c = dgncinb(0,&ch,1); /* -1 is EOF, -2 TO, * -c is AOS/VS error */ if (c == -2) { /* timeout was enabled? */ resto(channel(0)); /* reset timeouts */ c = dgncinb(0,&ch,1); /* retry this now! */ } if (c < 0) return(-4); /* EOF or some error */ else c = (int) ch & 0177; /* Get char without parity */ echof = 1; } #else c = getchar(); /* or from tty. */ if (c == EOF) { /*** perror("ckucmd getchar"); (just return silently) ***/ return(-4); } #endif } else ignore = 1; if (quote == 0) { if (!ignore && (c == '\\')) { /* Quote character */ quote = 1; continue; } if (c == FF) { /* Formfeed. */ c = NL; /* Replace with newline */ #ifdef apollo putchar(FF); #else #ifdef AMIGA putchar(FF); #else #ifdef datageneral putchar(FF); #else system("clear"); /* and clear the screen. */ #endif #endif #endif } if (c == HT) c = SP; /* Substitute space for tab. */ /* cont'd... */ /* ...gtword(), cont'd */ if (c == SP) { /* If space */ *bp++ = c; /* deposit it in buffer. */ if (echof) putchar(c); /* echo it. */ if (inword == 0) { /* If leading, gobble it. */ pp++; continue; } else { /* If terminating, return. */ np = bp; setatm(pp); inword = 0; return(cmflgs = 0); } } if (c == NL || c == CR) { /* CR, LF */ *bp = NUL; /* End the string */ if (echof) { /* If echoing, */ putchar(c); /* echo the typein */ #ifdef apollo if (c == CR) putchar(NL); #endif #ifdef AMIGA if (c == CR) putchar(NL); #endif #ifdef datageneral if (c == CR) putchar(NL); #endif } np = bp; /* Where to start next field. */ setatm(pp); /* Copy this field to atom buffer. */ inword = 0; return(cmflgs = 1); } if (!ignore && (c == '?')) { /* Question mark */ putchar(c); *bp = NUL; setatm(pp); return(cmflgs = 3); } if (c == ESC) { /* ESC */ *bp = NUL; setatm(pp); return(cmflgs = 2); } if (c == BS || c == RUB) { /* Character deletion */ if (bp > cmdbuf) { /* If still in buffer... */ #ifdef datageneral /* DG '\b' is EM (^y or \031) */ if (termtype == 1) /* Erase a character from non-DG screen, */ dgncoub(1,"\010 \010",3); else #endif printf("\b \b"); /* erase character from screen, */ bp--; /* point behind it, */ if (*bp == SP) inword = 0; /* Flag if current field gone */ *bp = NUL; /* Erase character from buffer. */ } else { /* Otherwise, */ putchar(BEL); /* beep, */ cmres(); /* and start parsing a new command. */ } if (pp < bp) continue; else return(cmflgs = -1); } if (c == LDEL) { /* ^U, line deletion */ #ifdef datageneral /* DG '\b' is EM (^y or \031) */ if (termtype == 1) /* Erase a character from a non-DG screen, */ while ((bp--) > cmdbuf) { dgncoub(1,"\010 \010",3); *bp = NUL; } else #endif /* datageneral */ while ((bp--) > cmdbuf) { printf("\b \b"); *bp = NUL; } cmres(); /* Restart the command. */ inword = 0; return(cmflgs = -1); } /* cont'd... */ /* ...gtword(), cont'd */ if (c == WDEL) { /* ^W, word deletion */ if (bp <= cmdbuf) { /* Beep if nothing to delete */ putchar(BEL); cmres(); return(cmflgs = -1); } bp--; #ifdef datageneral /* DG '\b' is EM (^y or \031) */ if (termtype == 1) { /* Erase a character from a non-DG screen, */ for ( ; (bp >= cmdbuf) && (*bp == SP) ; bp--) { dgncoub(1,"\010 \010",3); *bp = NUL; } for ( ; (bp >= cmdbuf) && (*bp != SP) ; bp--) { dgncoub(1,"\010 \010",3); *bp = NUL; } } else { #endif /* datageneral */ for ( ; (bp >= cmdbuf) && (*bp == SP) ; bp--) { printf("\b \b"); *bp = NUL; } for ( ; (bp >= cmdbuf) && (*bp != SP) ; bp--) { printf("\b \b"); *bp = NUL; } #ifdef datageneral } /* Termtype == 1 */ #endif bp++; inword = 0; return(cmflgs = -1); } if (c == RDIS) { /* ^R, redisplay */ *bp = NUL; printf("\n%s%s",cmprom,cmdbuf); continue; } } if (echof) putchar(c); /* If tty input, echo. */ inword = 1; /* Flag we're in a word. */ if (quote == 0 || c != NL) *bp++ = c; /* And deposit it. */ quote = 0; /* Turn off quote. */ } /* end of big while */ putchar(BEL); /* Get here if... */ printf("\n?Buffer full\n"); return(cmflgs = -2); } /* Utility functions */ /* A D D B U F -- Add the string pointed to by cp to the command buffer */ addbuf(cp) char *cp; { int len = 0; while ((*cp != NUL) && (bp < cmdbuf+CMDBL)) { *bp++ = *cp++; /* Copy and */ len++; /* count the characters. */ } *bp++ = SP; /* Put a space at the end */ *bp = NUL; /* Terminate with a null */ np = bp; /* Update the next-field pointer */ return(len); /* Return the length */ } /* S E T A T M -- Deposit a string in the atom buffer */ setatm(cp) char *cp; { char *ap; cc = 0; ap = atmbuf; *ap = NUL; while (*cp == SP) cp++; while ((*cp != SP) && (*cp != NL) && (*cp != NUL) && (*cp != CR)) { *ap++ = *cp++; cc++; } *ap++ = NUL; return(cc); /* Return length */ } /* D I G I T S -- Verify that all the characters in line are digits */ digits(s) char *s; { while (*s) { if (!isdigit(*s)) return(0); s++; } return(1); } /* L O W E R -- Lowercase a string */ lower(s) char *s; { int n = 0; while (*s) { if (isupper(*s)) *s = tolower(*s); s++, n++; } return(n); } /* T E S T -- Bit test */ test(x,m) int x, m; { /* Returns 1 if any bits from m are on in x, else 0 */ return((x & m) ? 1 : 0); } ����������������������������������������������������/* C K U C M D . H -- Header file for Unix cmd package */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Special getchars... */ #ifdef vax11c #define getchar() vms_getchar() #endif #ifdef aegis #undef getchar #define getchar() coninc(0) #endif #ifdef AMIGA #undef getchar #define getchar() coninc(0) #endif /* Sizes of things */ #define HLPLW 78 /* Width of ?-help line */ #define HLPCW 19 /* Width of ?-help column */ #define CMDBL 200 /* Command buffer length */ #define HLPBL 100 /* Help string buffer length */ #define ATMBL 100 /* Command atom buffer length*/ /* Special characters */ #ifndef NUL #define NUL '\0' /* Null */ #endif #define HT '\t' /* Horizontal Tab */ #define NL '\n' /* Newline */ #ifndef CR #define CR '\r' #endif #define FF 0014 /* Formfeed (^L) */ #define RDIS 0022 /* Redisplay (^R) */ #define LDEL 0025 /* Delete line (^U) */ #define WDEL 0027 /* Delete word (^W) */ #define ESC 0033 /* Escape */ #define RUB 0177 /* Rubout */ #ifndef BEL #define BEL 0007 /* Bell */ #endif #ifndef BS #define BS 0010 /* Backspace */ #endif #ifndef SP #define SP 0040 /* Space */ #endif /* Keyword table flags */ #define CM_INV 1 /* Invisible keyword */ /* Keyword Table Template */ struct keytab { /* Keyword table */ char *kwd; /* Pointer to keyword string */ int val; /* Associated value */ int flgs; /* Flags (as defined above) */ }; ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *connv = "Connect Command for Unix, V4E(017) 14 Sep 87"; /* C K U C O N -- Dumb terminal connection to remote system, for Unix */ /* This module should work under all versions of Unix. It calls externally defined system-dependent functions for i/o, but depends upon the existence of the fork() function. Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. Enhanced by H. Fischer to detect when child process (modem reader) reports that the communications line has been broken and hang up. Also enhanced to allow escaping from connect state to command interpreter, to allow sending/receiving without breaking connection. */ #include <sys/types.h> #include <stdio.h> #include <ctype.h> /* Character types */ #include "ckcdeb.h" #include "ckcker.h" #include <signal.h> #ifndef ZILOG #include <setjmp.h> /* Longjumps */ #else #include <setret.h> #endif #ifndef SIGUSR1 #define SIGUSR1 16 #endif extern int local, speed, escape, duplex, parity, flow, seslog, mdmtyp; extern int errno, cmask, fmask; extern char ttname[], sesfil[]; extern CHAR dopar(); int i, active; /* Variables global to this module */ char *chstr(); char temp[50]; #define LBUFL 200 /* Line buffer */ char lbuf[LBUFL]; /* Connect state parent/child communication signal handlers */ static jmp_buf env_con; /* Envir ptr for connect errors */ static conn_int() { /* Modem read failure handler, */ longjmp(env_con,1); /* notifies parent process to stop */ } /* C O N E C T -- Perform terminal connection */ conect() { int pid, /* process id of child (modem reader) */ parent_id, /* process id of parent (keyboard reader) */ n; int c; /* c is a character, but must be signed integer to pass thru -1, which is the modem disconnection signal, and is different from the character 0377 */ char errmsg[50], *erp; if (!local) { printf("Sorry, you must 'set line' first\n"); return(-2); } if (speed < 0) { printf("Sorry, you must 'set speed' first\n"); return(-2); } if ((escape < 0) || (escape > 0177)) { printf("Your escape character is not ASCII - %d\n",escape); return(-2); } if (ttopen(ttname,&local,mdmtyp) < 0) { erp = errmsg; sprintf(erp,"Sorry, can't open %s",ttname); perror(errmsg); return(-2); } printf("Connecting thru %s, speed %d.\r\n",ttname,speed); printf("The escape character is %s (%d).\r\n",chstr(escape),escape); printf("Type the escape character followed by C to get back,\r\n"); printf("or followed by ? to see other options.\r\n"); if (seslog) printf("(Session logged to %s.)\r\n",sesfil); /* Condition console terminal and communication line */ if (conbin(escape) < 0) { printf("Sorry, can't condition console terminal\n"); return(-2); } if (ttvt(speed,flow) < 0) { conres(); printf("Sorry, Can't condition communication line\n"); return(-2); } /* cont'd... */ /* ...connect, cont'd */ parent_id = getpid(); /* Get parent id for signalling */ signal(SIGUSR1,SIG_IGN); /* Don't kill parent */ pid = fork(); /* All ok, make a fork */ if (pid == -1) { conres(); /* Reset the console. */ perror("Can't create keyboard fork"); printf("[Back at Local System]\n"); return(0); } if (pid) { active = 1; /* This fork reads, sends keystrokes */ if (!setjmp(env_con)) { /* comm error in child process */ signal(SIGUSR1,conn_int); /* routine for child process exit */ while (active) { c = coninc(0) & cmask; /* Get character from keyboard */ if ((c & 0177) == escape) { /* Look for escape char */ c = coninc(0) & 0177; /* Got esc, get its arg */ doesc(c); /* And process it */ } else { /* Ordinary character */ if (ttoc(dopar(c)) > -1) { if (duplex) { /* Half duplex? */ conoc(c); /* Yes, also echo it. */ if (seslog) /* And maybe log it. */ if (zchout(ZSFILE,c) < 0) seslog = 0; } } else { perror("\r\nCan't send character"); active = 0; } } } } /* Come here on death of child */ kill(pid,9); /* Done, kill inferior fork. */ wait((int *)0); /* Wait till gone. */ conres(); /* Reset the console. */ printf("[Back at Local System]\n"); return(0); } else { /* Inferior reads, prints port input */ sleep(1); /* Wait for parent's handler setup */ while (1) { /* Fresh read, wait for a character */ if ((c = ttinc(0)) < 0) { /* Comm line hangup detected */ if (errno == 9999) /* this value set by ckutio.c myread */ printf("\r\nCommunications disconnect "); else perror("\r\nCan't get character"); kill(parent_id,SIGUSR1); /* notify parent. */ pause(); /* Wait to be killed by parent. */ } c &= cmask; /* Got a char, strip parity, etc */ conoc(c); /* Put it on the screen. */ if (seslog) zchout(ZSFILE,c); /* If logging, log it. */ while ((n = ttchk()) > 0) { /* Any more left in buffer? */ if (n > LBUFL) n = LBUFL; /* Get them all at once. */ if ((n = ttxin(n,lbuf)) > 0) { for (i = 0; i < n; i++) lbuf[i] &= cmask; /* Strip */ conxo(n,lbuf); /* Output */ if (seslog) zsoutx(ZSFILE,lbuf,n); /* Log */ } } } } } /* H C O N N E -- Give help message for connect. */ hconne() { int c; static char *hlpmsg[] = {"\ \r\nC to close the connection, or:", "\r\n 0 (zero) to send a null", "\r\n B to send a BREAK", "\r\n H to hangup and close connection", "\r\n S for status", "\r\n ? for help", "\r\n escape character twice to send the escape character.\r\n\r\n", "" }; conola(hlpmsg); /* Print the help message. */ conol("Command>"); /* Prompt for command. */ c = coninc(0) & 0177; /* Get character, strip any parity. */ conoc(c); /* Echo it. */ conoll(""); return(c); /* Return it. */ } /* C H S T R -- Make a printable string out of a character */ char * chstr(c) int c; { static char s[8]; char *cp = s; if (c < SP) { sprintf(cp,"CTRL-%c",ctl(c)); } else sprintf(cp,"'%c'\n",c); cp = s; return(cp); } /* D O E S C -- Process an escape character argument */ doesc(c) char c; { CHAR d; while (1) { if (c == escape) { /* Send escape character */ d = dopar(c); ttoc(d); return; } else /* Or else look it up below. */ if (isupper(c)) c = tolower(c); switch (c) { case 'c': /* Close connection */ case '\03': active = 0; conol("\r\n"); return; case 'b': /* Send a BREAK signal */ case '\02': ttsndb(); return; case 'h': /* Hangup */ case '\010': tthang(); active = 0; conol("\r\n"); return; case 's': /* Status */ conol("\r\nConnected thru "); conol(ttname); if (speed >= 0) { sprintf(temp,", speed %d",speed); conol(temp); } sprintf(temp,", %d bits",(cmask == 0177) ? 7 : 8); if (parity) { conol(", "); switch (parity) { case 'e': conol("even"); break; case 'o': conol("odd"); break; case 's': conol("space"); break; case 'm': conol("mark"); break; } conol(" parity"); } if (seslog) { conol(", logging to "); conol(sesfil); } conoll(""); return; case '?': /* Help */ c = hconne(); continue; case '0': /* Send a null */ c = '\0'; d = dopar(c); ttoc(d); return; case SP: /* Space, ignore */ return; default: /* Other */ conoc(BEL); return; /* Invalid esc arg, beep */ } } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������nI��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *dialv = "Dial Command, V2.0(009) 24 Jan 88"; /* C K U D I A -- Dialing program for connection to remote system */ /* Author: Herm Fischer (HFISCHER@USC-ECLB) Contributed to Columbia University for inclusion in C-Kermit. Copyright (C) 1985, Herman Fischer, 16400 Ventura Blvd, Encino CA 91436 Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. ------ This module should work under all versions of Unix. It calls externally defined system-depended functions for i/o, but depends upon the existence of various modem control functions. This module, and the supporting routines in the ckutio.c module, assume that the computer and modem properly utilize the following data communi- cations signals (that means one should prepare the modem to use, not circumvent, these signals): Data Terminal Ready: This signal is asserted by the computer when Kermit is about to ask the modem to dial a call, and is removed when Kermit wishes to have the modem hang up a call. The signal is asserted both while Kermit is asking the modem to dial a specific number, and after connection, while Kermit is in a data exchange mode. Carrier detect: This signal must be asserted by the modem when a carrier is detected from a remote modem on a communications circuit. It must be removed by the modem when the circuit disconnects or is hung up. (Carrier detect is ignored while Kermit is asking the modem to dial the call, because there is no consistant usage of this signal during the dialing phase among different modem manufacturers.) */ /* * Modifications: * * 21-Jul-85 Fixed failure returns hanging on no carrier signal * Requires tthang change too (ckutio.c revision) * -- Herm Fischer * * 28-Jun-85 Fixed bug with defaulting the modem-failure message * in lbuf. * -- Dan Schullman * * 27-Jun-85 Merged in code from Joe Orost at Berkeley for * supporting the US Robotics modem, which included * changing the single characters in MDMINF into * multi-character strings and modifying waitFor. * -- Dan Schullman * * 26-Jun-85 Allow interrupts to be used to abort dialing, * and ring the bell when a connection is made. * Reorganized some of the failure paths to use the * same code, and now close the line on failures. * Allow use of stored numbers with the DF100 and * DF200 modems. Handlers now declared after the * call to setjmp. * -- Dan Schullman * * 24-May-85 DF03, DF100-series, DF200-series, and "unknown" modem * support added. Also restructured the various data * tables, fixed some bugs related to missing data and * missing case labels, and modified the failure message * to display the "reason" given by the modem. * -- Dan Schullman * 16-Mar-87 Support for the ATT7300 UNIX PC internal modem was * added. * -- Richard E. Hill */ /* * To add support for another modem, do the following: * * Define a modem number symbol (n_XXX) for it, keeping the list * in alphabetical and numerical order, and renumbering the values * as necessary. * * Create a MDMINF structure for it, again keeping the list alphabetical * for sanity's sake. * * Add the address of the MDMINF structure to the ptrtab array, again * in alphabetical and numerical order. * * Add the "user visible" modem name and corresponding modem number to * the mdmtab array, again in alphabetical order. * * Read through the code and add modem-specific sections as necessary. */ /* * The intent of the "unknown" modem is hopefully to allow KERMIT to support * unknown modems by having the user type the entire autodial sequence * (possibly including control characters, etc.) as the "phone number". * The only reason that the CONNECT command cannot be used to do this is * that a remote line cannot normally be opened unless carrier is present. * * The protocol and other characteristics of this modem are unknown, with * some "reasonable" values being chosen for some of them. The only way to * detect if a connection is made is to look for carrier present. * * SUPPORT IS CURRENTLY ONLY PARTIALLY SKETCHED OUT FOR THIS. ALSO, IT * SHOULD PERHAPS BE HANDLED MUCH EARLIER, SIMPLY READING USER INPUT AND * SENDING IT TO THE MODEM AND ECHOING MODEM RESPONSES BACK TO THE USER, * ALL THE TIME LOOKING FOR CARRIER. OF COURSE, THE PROBLEM THEN BECOMES * ONE OF ALLOWING THE USER TO ABORT THE DIALING. WE COULD CHOOSE SOME * PHRASE THAT WOULD PRESUMABLY NEVER BE A PART OF A VALID AUTODIAL SEQUENCE * (E.G., "QUIT" and "quit"). -- DS */ #include <sys/types.h> #include "ckcdeb.h" #include <stdio.h> #include <ctype.h> #include <signal.h> #include "ckcker.h" #include "ckucmd.h" #ifndef ZILOG #include <setjmp.h> /* Longjumps */ #else #include <setret.h> #endif extern int flow, local, mdmtyp, quiet, speed, parity, seslog; extern char ttname[], sesfil[]; #ifndef MINIX #define MDMINF struct mdminf MDMINF /* structure for modem-specific information */ { int dial_time; /* time modem allows for dialing (secs) */ char *pause_chars; /* character(s) to tell modem to pause */ int pause_time; /* time associated with pause chars (secs) */ char *wake_str; /* string to wakeup modem & put in cmd mode */ int wake_rate; /* delay between wake_str characters (msecs) */ char *wake_prompt; /* string prompt after wake_str */ char *dmode_str; /* string to put modem in dialing mode */ char *dmode_prompt; /* string prompt for dialing mode */ char *dial_str; /* dialing string, with "%s" for number */ int dial_rate; /* delay between dialing characters (msecs) */ }; /* * Define symbolic modem numbers. * * The numbers MUST correspond to the ordering of entries * within the ptrtab array, and start at one (1). * * It is assumed that there are relatively few of these * values, and that the high(er) bytes of the value may * be used for modem-specific mode information. * * REMEMBER that only the first eight characters of these * names are guaranteed to be unique. */ #define n_CERMETEK 1 #define n_DF03 2 #define n_DF100 3 #define n_DF200 4 #define n_GDC 5 #define n_HAYES 6 #define n_PENRIL 7 #define n_RACAL 8 #define n_UNKNOWN 9 #define n_USROBOT 10 #define n_VENTEL 11 #define n_CONCORD 12 #define n_ATT7300 13 /* added for PC7300 */ /* * Declare modem "variant" numbers for any of the above for which it is * necessary to note various operational modes, using the second byte * of a modem number. * * It is assumed that such modem modes share the same modem-specific * information (see MDMINF structure) but may differ in some of the actions * that are performed. */ #define n_HAYESNV ( n_HAYES + ( 1<<8 ) ) /* * Declare structures containing modem-specific information. * * REMEMBER that only the first SEVEN characters of these * names are guaranteed to be unique. */ static MDMINF CERMETEK = /* information for "Cermetek Info-Mate 212 A" modem */ { 20, /* dial_time */ "BbPpTt", /* pause_chars */ 0, /* pause_time */ /** unknown -- DS **/ " XY\016R\r", /* wake_str */ 200, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "\016D '%s'\r", /* dial_str */ 200 /* dial_rate */ }; static MDMINF DF03 = /* information for "DEC DF03-AC" modem */ { 27, /* dial_time */ "=", /* pause_chars */ /* wait for second dial tone */ 15, /* pause_time */ "\001\002", /* wake_str */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "%s", /* dial_str */ 0 /* dial_rate */ }; static MDMINF DF100 = /* information for "DEC DF100-series" modem */ /* * The telephone "number" can include "P"s and/or "T"s * within it to indicate that subsequent digits are * to be dialed using pulse or tone dialing. The * modem defaults to pulse dialing. YouwI��yI��zI��{I��|I��}I��~I��I��I��I��I��I��I��I��I��I��I��I��I��I���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� may modify * the dial string below to explicitly default all * dialing to pulse or tone, but doing so prevents * the use of phone numbers that you may have stored * in the modem's memory. */ { 30, /* dial_time */ "=", /* pause_chars */ /* wait for second dial tone */ 15, /* pause_time */ "\001", /* wake_str */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "%s#", /* dial_str */ 0 /* dial_rate */ }; static MDMINF DF200 = /* information for "DEC DF200-series" modem */ /* * The telephone "number" can include "P"s and/or "T"s * within it to indicate that subsequent digits are * to be dialed using pulse or tone dialing. The * modem defaults to pulse dialing. You may modify * the dial string below to explicitly default all * dialing to pulse or tone, but doing so prevents * the use of phone numbers that you may have stored * in the modem's memory. */ { 30, /* dial_time */ "=W", /* pause_chars */ /* =: second tone; W: 5 secs */ 15, /* pause_time */ /* worst case */ "\002", /* wake_str */ /* allow stored number usage */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "%s!", /* dial_str */ 0 /* dial_rate */ }; static MDMINF GDC = /* information for "GeneralDataComm 212A/ED" modem */ { 32, /* dial_time */ "%", /* pause_chars */ 3, /* pause_time */ "\r\r", /* wake_str */ 500, /* wake_rate */ "$", /* wake_prompt */ "D\r", /* dmode_str */ ":", /* dmode_prompt */ "T%s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF HAYES = /* information for "Hayes" modem */ { 35, /* dial_time */ ",", /* pause_chars */ 2, /* pause_time */ "AT\r", /* wake_str */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "AT D %s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF PENRIL = /* information for "Penril" modem */ { 50, /* dial_time */ "", /* pause_chars */ /** unknown -- HF **/ 0, /* pause_time */ "\r\r", /* wake_str */ 300, /* wake_rate */ ">", /* wake_prompt */ "k\r", /* dmode_str */ ":", /* dmode_prompt */ "%s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF RACAL = /* information for "Racal Vadic" modem */ { 35, /* dial_time */ "Kk", /* pause_chars */ 5, /* pause_time */ "\005\r", /* wake_str */ 50, /* wake_rate */ "*", /* wake_prompt */ "D\r", /* dmode_str */ "?", /* dmode_prompt */ "%s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF UNKNOWN = /* information for "Unknown" modem */ { 30, /* dial_time */ "", /* pause_chars */ 0, /* pause_time */ "", /* wake_str */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "%s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF USROBOT = /* information for "US Robotics 212A" modem */ { 30, /* dial_time */ ",", /* pause_chars */ 2, /* pause_time */ "ATS2=01\r", /* wake_str */ 0, /* wake_rate */ "OK\r", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "ATTD%s\r", /* dial_str */ 0 /* dial_rate */ }; static MDMINF VENTEL = /* information for "Ventel" modem */ { 20, /* dial_time */ "%", /* pause_chars */ 5, /* pause_time */ "\r\r\r", /* wake_str */ 300, /* wake_rate */ "$", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "<K%s\r>", /* dial_str */ 0 /* dial_rate */ }; static MDMINF CONCORD = /* Info for Condor CDS 220 2400b modem */ { 35, /* dial_time */ ",", /* pause_chars */ 2, /* pause_time */ "\r\r", /* wake_str */ 20, /* wake_rate */ "CDS >", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "<D M%s\r>", /* dial_str */ 0 /* dial_rate */ }; static MDMINF ATT7300 = /* dummy information for "ATT7300" internal modem */ { 30, /* dial_time */ "", /* pause_chars */ 0, /* pause_time */ "", /* wake_str */ 0, /* wake_rate */ "", /* wake_prompt */ "", /* dmode_str */ "", /* dmode_prompt */ "%s\r", /* dial_str */ 0 /* dial_rate */ }; /* * Declare table for converting modem numbers to information pointers. * * The entries MUST be in ascending order by modem number, without any * "gaps" in the numbers, and starting from one (1). * * This table should NOT include entries for the "variant" modem numbers, * since it is assumed that they share the same information as the normal * value. */ static MDMINF *ptrtab[] = { &CERMETEK, &DF03, &DF100, &DF200, &GDC, &HAYES, &PENRIL, &RACAL, &UNKNOWN, &USROBOT, &VENTEL, &CONCORD, &ATT7300 }; /* * Declare modem names and associated numbers for command parsing, * and also for doing number-to-name translation. * * The entries MUST be in alphabetical order by modem name. */ struct keytab mdmtab[] = { "att7300", n_ATT7300, 0, "cermetek", n_CERMETEK, 0, "concord", n_CONCORD, 0, "df03-ac", n_DF03, 0, "df100-series", n_DF100, 0, "df200-series", n_DF200, 0, "direct", 0, 0, "gendatacomm", n_GDC, 0, "hayes", n_HAYES, 0, "penril", n_PENRIL, 0, "racalvadic", n_RACAL, 0, "unknown", n_UNKNOWN, 0, "usrobotics-212a", n_USROBOT, 0, "ventel", n_VENTEL, 0 }; int nmdm = (sizeof(mdmtab) / sizeof(struct keytab)); /* number of modems */ #define DIALING 4 /* for ttpkt parameter */ #define CONNECT 5 #define CONNECTED 1 /* for completion status */ #define FAILED 2 /* * Failure reasons for use with the 'longjmp' exit. */ #define F_time 1 /* timeout */ #define F_int 2 /* interrupt */ #define F_modem 3 /* modem-detected failure */ #define F_minit 4 /* cannot initialize modem */ static char *F_reason[5] = { /* failure reasons for message */ "Unknown", "Timeout", "Interrupt", "Modem", "Initialize" }; static int tries = 0; #define LBUFL 100 static char lbuf[LBUFL]; static jmp_buf sjbuf; static SIGTYP (*savAlrm)(); /* for saving alarm handler */ static SIGTYP (*savInt)(); /* for saving interrupt handler */ dialtime() { /* timer interrupt handler */ longjmp( sjbuf, F_time ); } dialint() /* user-interrupt handler */ { longjmp( sjbuf, F_int ); } static ttolSlow(s,millisec) char *s; int millisec; { /* output s-l-o-w-l-y */ for (; *s; s++) { ttoc(*s); msleep(millisec); } } /* * Wait for a string of characters. * * The characters are waited for individually, and other characters may * be received "in between". This merely guarantees that the characters * ARE received, and in the order specified. */ static waitFor(s) char *s; { CHAR c; while ( c = *s++ ) /* while more characters remain... */ while ( ( ttinc(0) & 0177 ) != c ) ; /* wait for the character */ } static didWeGet(s,r) char *s, *r; { /* Looks in string s for response r */ int lr = strlen(r); /* 0 means not found, 1 means found it */ int i; for (i = strlen(s)-lr; i >= 0; i--) if ( s[i] == r[0] ) if ( !strncmp(s+i,r,lr) ) return( 1 ); return( 0 ); } #endif /* not MINIX */ /* R E S E T -- Reset alarms, etc. on exit. */ static reset () { alarm(0); #ifndef MINIX signal(SIGALRM,savAlrm); /* restore alarm handler */ signal(SIGINT,savInt); /* restore interrupt handler */ #endif } /* C K D I A L -- Dial up the remote system */ ckdial(telnbr) char *telnbr; { #ifndef MINIX char c; char *i, *j; int waitct, status; char errmsg[50], *erp; MDMINF *pmdminf; /* pointer to modem-specific info */ int augmdmtyp; /* "augmented" modem type, to handle modem modes */ int mdmEcho = 0; /* assume modem does not echo */ int n, n1; char *pc; /* pointer to a character */ if (!mdmtyp) { printf("Sorry, you must 'set modem' first\n"); return(-2); } if (!local) { printf("Sorry, you must 'set line' first\n"); return(-2); } if (speed < 0) { printf("Sorry, you must 'set speed' first\n"); return(-2); } #ifdef ATT7300 /* The following if-statement added by R.E.Hill to handle the internal modem available on the ATT PC7300 computer and other ATT systems which uses internal modems activated by system routines - "dial" & "undial" */ if (mdmtyp == n_ATT7300) { if (attdial(ttname,speed,telnbr)) return (-2); if ( ! quiet ) printf ("call completed.\07\r\n"); return(0); } #endif /* ATT7300 */ if (ttopen(ttname,&local,mdmtyp) < 0) { /* Open, no carrier wait */ erp = errmsg; sprintf(erp,"Sorry, can't open %s",ttname); perror(errmsg); return(-2); } pmdminf = ptrtab[mdmtyp-1]; /* set pointer to modem info */ augmdmtyp = mdmtyp; /* initialize "augmented" modem type */ /* cont'd... */ /* interdigit waits for tone dial */ /* ...dial, cont'd */ waitct = 1*strlen(telnbr) ; /* compute time to dial worst case */ waitct += pmdminf->dial_time; /* dialtone + completion wait times */ for (i=telnbr; *i; i++) /* add in pause characters time */ for (j=pmdminf->pause_chars; *j; j++) if (*i == *j) { waitct += pmdminf->pause_time; break; } printf("Dialing thru %s, speed %d, number %s.\r\n",ttname,speed,telnbr); printf("The timeout for completing the call is %d seconds.\r\n",waitct); printf("Type the interrupt character to cancel the dialing.\r\n"); /* Hang up the modem (in case it wasn't "on hook") */ if ( tthang() < 0 ) { printf("Sorry, Can't hang up tty line\n"); return(-2); } /* Condition console terminal and communication line */ /* place line into "clocal" dialing state */ if ( ttpkt(speed,DIALING,parity) < 0 ) { printf("Sorry, Can't condition communication line\n"); return(-2); } /* * Establish jump vector, or handle "failure" jumps. */ if ( n = setjmp(sjbuf) ) /* if a "failure jump" was taken... */ { alarm ( 0 ); /* disable timeouts */ if ( n1 = setjmp(sjbuf) ) /* failure while handling failure */ { printf ( "%s failure while handling failure.\r\n", F_reason[n1] ); } else /* first (i.e., non-nested) failure */ { signal ( SIGALRM, dialtime ); /* be sure to catch signals */ if ( signal ( SIGINT, SIG_IGN ) != SIG_IGN ) signal ( SIGINT, dialint ); alarm ( 5 ); /* be sure to get out of this section */ ttclos (); /* hangup and close the line */ } switch ( n ) /* type of failure */ { case F_time: /* timed out */ { printf ( "No connection made within the allotted time.\r\n" ); break; } case F_int: /* dialing interrupted */ { printf ( "Dialing interrupted.\r\n" ); break; } case F_modem: /* modem detected a failure */ { printf ( "Failed (\"" ); for ( pc=lbuf; *pc; pc++ ) if ( isprint(*pc) ) putchar(*pc); /* display printable reason */ printf ( "\").\r\n" ); break; } case F_minit: /* cannot initialize modem */ { printf ( "Cannot initialize modem.\r\n" ); break; } } reset (); /* reset alarms, etc. */ return ( -2 ); /* exit with failure code */ } /* * Set timer and interrupt handlers. */ savAlrm = signal(SIGALRM,dialtime); /* set alarm handler */ if ( ( savInt = signal ( SIGINT, SIG_IGN ) ) != SIG_IGN ) signal ( SIGINT, dialint ); /* set int handler if not ignored */ alarm(10); /* give modem 10 seconds to wake up */ ttflui(); /* flush input buffer if any */ /* * Put modem in command mode. */ #define OKAY 1 /* modem attention attempt status */ #define IGNORE 2 #define GOT_O -2 #define GOT_A -3 switch (augmdmtyp) { case n_HAYES: case n_HAYESNV: while(tries++ < 4) { ttol( HAYES.wake_str, strlen(HAYES.wake_str) ); /* wakeup */ status = 0; while ( status <= 0 ) { switch (ttinc(0) & 0177) { case 'A': /* echoing, ignore */ status = GOT_A; break; case 'T': if (status == GOT_A) { mdmEcho = 1; /* expect echoing later */ status = 0; break; } status = IGNORE; break; case '\n': case '\r': status = 0; break; case '0': /* numeric result code */ augmdmtyp = n_HAYESNV; /* nonverbal result codes */ status = OKAY; break; case 'O': /* maybe English result code*/ status = GOT_O; break; case 'K': if (status == GOT_O) { augmdmtyp = n_HAYES; status = OKAY; break; } /* else its default anyway */ default: status = IGNORE; break; } } if (status == OKAY) break; if (status == IGNORE) ttflui(); sleep(1); /* wait before retrying */ } if (status != 0) break; longjmp( sjbuf, F_minit ); /* modem-initialization failure */ /* cont'd... */ /* interdigit waits for tone dial */ /* ...dial, cont'd */ default: /* place modem into command mode */ ttolSlow(pmdminf->wake_str, pmdminf->wake_rate); waitFor(pmdminf->wake_prompt); break; } alarm(0); /* turn off alarm */ msleep(500); /* give things settling time */ alarm(10); /* alarm on dialing prompts */ /* Dial the number */ /* put modem into dialing mode */ ttolSlow(pmdminf->dmode_str, pmdminf->dial_rate); if (pmdminf->dmode_prompt) { /* wait for prompt, if any expected */ waitFor(pmdminf->dmode_prompt); msleep(300); } alarm(0); /* turn off alarm on dialing prompts */ alarm(waitct); /* time to allow for connecting */ ttflui(); /* clear out stuff from waking modem up */ sprintf(lbuf, pmdminf->dial_str, telnbr); /* form dialing string */ ttolSlow(lbuf,pmdminf->dial_rate); /* send dialing string */ if (augmdmtyp == n_RACAL) { /* acknowledge printout of dialing string */ sleep(3); ttflui(); ttoc('\r'); } /* cont'd... */ /* interdigit waits for tone dial */ /* ...dial, cont'd */ /* Check for connection */ /* * I believe we also need to look for carrier in order to determine if a * connection has been made. In fact, for many we may only want to look for * the "failure" responses in order to short-circuit the timeout, and let * carrier be the determination of whether a connection has been made. -- DS */ status = 0; strcpy(lbuf,"No Connection"); /* default failure reason */ while (status == 0) { switch (augmdmtyp) { default: for (n=0; n < LBUFL; n++) { /* accumulate response */ lbuf[n] = (ttinc(0) & 0177); if ( lbuf[n] == '\r' || lbuf[n] == '\n' ) break; } lbuf[n] = '\0'; /* terminate response from modem */ if (n) { /* if one or more characters present */ switch (augmdmtyp) { case n_CERMETEK: if (didWeGet(lbuf,"\016A")) { status = CONNECTED; ttolSlow("\016U 1\r",200); /* make transparent*/ } break; case n_DF100: /* DF100 won't generate some of these */ case n_DF200: if (didWeGet(lbuf,"Attached")) status = CONNECTED; /* * The DF100 will respond with "Attached" even if DTR * and/or carrier are not present. Another reason to * (also) wait for carrier? */ if (didWeGet(lbuf,"Busy")) status = FAILED; if (didWeGet(lbuf,"Disconnected")) status = FAILED; if (didWeGet(lbuf,"Error")) status = FAILED; if (didWeGet(lbuf,"No answer")) status = FAILED; if (didWeGet(lbuf,"No dial tone")) status = FAILED; if (didWeGet(lbuf,"Speed:")) status = FAILED; /* * It appears that the "Speed:..." response comes after an * "Attached" response, so this is never seen. HOWEVER, * it would be very handy to detect this and temporarily * reset the speed, since it's a nuiscance otherwise. * If we wait for some more input from the modem, how do * we know if it's from the remote host or the modem? * Carrier reportedly doesn't get set until after the * "Speed:..." response (if any) is sent. Another reason * to (also) wait for carrier. */ break; case n_GDC: if (didWeGet(lbuf,"ON LINE")) status = CONNECTED; if (didWeGet(lbuf,"NO CONNECT")) status = FAILED; break; case n_HAYES: case n_USROBOT: if (didWeGet(lbuf,"CONNECT")) status = CONNECTED; if (didWeGet(lbuf,"NO CARRIER")) status = FAILED; break; case n_PENRIL: if (didWeGet(lbuf,"OK")) status = CONNECTED; if (didWeGet(lbuf,"BUSY")) status = FAILED; if (didWeGet(lbuf,"NO RING")) status = FAILED; break; case n_RACAL: if (didWeGet(lbuf,"ON LINE")) status = CONNECTED; if (didWeGet(lbuf,"FAILED CALL")) status = FAILED; break; case n_VENTEL: if (didWeGet(lbuf,"ONLINE!")) status = CONNECTED; if (didWeGet(lbuf,"BUSY")) status = FAILED; if (didWeGet(lbuf,"DEAD PHONE")) status = FAILED; break; case n_CONCORD: if (didWeGet(lbuf,"INITIATING")) status = CONNECTED; if (didWeGet(lbuf,"BUSY")) status = FAILED; if (didWeGet(lbuf,"CALL FAILED")) status = FAILED; break; } } break; case n_DF03: /* because response lacks CR or NL */ c = ttinc(0) & 0177; if ( c == 'A' ) status = CONNECTED; if ( c == 'B' ) status = FAILED; break; case n_HAYESNV: c = ttinc(0) & 0177; if (mdmEcho) { /* sponge up dialing string */ mdmEcho = c!='\r'; /* until return is echoed */ break; } if (c == '1') status = CONNECTED; if (c == '3') status = FAILED; if (c == '5') status = CONNECTED; break; case n_UNKNOWN: /** SHOULD WAIT FOR CARRIER OR TIMEOUT -- DS **/ break; } /* switch (augmdmtyp) */ } /* while status == 0 */ alarm(0); /* turn off alarm on connecting */ if ( status != CONNECTED ) /* modem-detected failure */ longjmp( sjbuf, F_modem ); /* exit (with reason in lbuf) */ alarm(3); /* precaution in case of trouble */ ttpkt(speed,CONNECT,parity); /* cancel dialing state ioctl */ reset (); /* reset alarms, etc. */ if ( ! quiet ) printf ( "Call completed.\07\r\n" ); #endif /* not MINIX */ return ( 0 ); /* return, and presumably connect */ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *ckzv = "Unix file support, 4E(037) 27 Jan 88"; /* C K U F I O -- Kermit file system support for Unix systems */ /* 4E, conditionals added for Apollo Aegis. */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Includes */ #include <sys/types.h> /* Data types */ #include "ckcker.h" /* Kermit definitions */ #include "ckcdeb.h" /* Typedefs, debug formats, etc */ #include <ctype.h> /* Character types */ #include <stdio.h> /* Standard i/o */ #ifdef MINIX #include <limits.h> #endif #include <dirent.h> /* Directory structure */ #include <pwd.h> /* Password file for shell name */ #ifdef CIE #include <stat.h> /* File status */ #else #include <sys/stat.h> #endif /* Berkeley Unix Version 4.x */ /* 4.1bsd support added by Charles E Brooks, EDN-VAX */ #ifdef BSD4 #ifdef MAXNAMLEN #define BSD42 char *ckzsys = " 4.2 BSD"; #else #ifdef FT18 #define BSD41 char *ckzsys = " Fortune For:Pro 1.8"; #else #define BSD41 char *ckzsys = " 4.1 BSD"; #endif #endif #endif /* 2.9bsd support contributed by Bradley Smith, UCLA */ #ifdef BSD29 char *ckzsys = " 2.9 BSD"; #endif /* Version 7 Unix */ #ifdef V7 char *ckzsys = " Version 7 Unix"; #endif /* DEC Professional-300 series with Venturcom Venix v1 */ #ifdef PROVX1 char *ckzsys = " DEC Pro-3xx/Venix v1"; #endif /* NCR Tower support contributed by John Bray, Auburn, AL. */ /* Tower OS is like Sys III but with BSD features -- mostly follows BSD. */ #ifdef TOWER1 char *ckzsys = " NCR Tower 1632, OS 1.02"; #endif /* Sys III/V, Xenix, PC/IX,... support by Herm Fischer, Litton Data Systems */ #ifdef UXIII #ifdef XENIX char *ckzsys = " Xenix/286"; #else #ifdef PCIX char *ckzsys = " PC/IX"; #else #ifdef ISIII char *ckzsys = " Interactive Systems Corp, System III"; #else #ifdef ZILOG char *ckzsys = " Zilog S8000 Zeus 3.21+"; #else char *ckzsys = " AT&T System III/System V"; #endif #endif #endif #endif #endif /* Definitions of some Unix system commands */ char *DELCMD = "rm -f "; /* For file deletion */ char *PWDCMD = "pwd "; /* For saying where I am */ #ifdef FT18 char *DIRCMD = "ls -l | more "; /* For directory listing */ char *TYPCMD = "more "; /* For typing a file */ #else char *TYPCMD = "cat "; /* For typing a file */ char *DIRCMD = "ls -l "; /* For directory listing */ #endif #ifdef FT18 #undef BSD4 #endif #ifdef BSD4 char *SPACMD = "pwd ; quota ; df ."; /* Space/quota of current directory */ #else #ifdef FT18 char #SPACMD = "pwd ; du ; df ."; #else char *SPACMD = "df "; #endif #endif char *SPACM2 = "df "; /* For space in specified directory */ #ifdef FT18 #define BSD4 #endif #ifdef BSD4 char *WHOCMD = "finger "; /* For seeing who's logged in */ #else char *WHOCMD = "who "; /* For seeing who's logged in */ #endif /* Functions (n is one of the predefined file numbers from ckermi.h): zopeni(n,name) -- Opens an existing file for input. zopeno(n,name) -- Opens a new file for output. zclose(n) -- Closes a file. zchin(n,&c) -- Gets the next character from an input file. zsout(n,s) -- Write a null-terminated string to output file, buffered. zsoutl(n,s) -- Like zsout, but appends a line terminator. zsoutx(n,s,x) -- Write x characters to output file, unbuffered. zchout(n,c) -- Add a character to an output file, unbuffered. zchki(name) -- Check if named file exists and is readable, return size. zchko(name) -- Check if named file can be created. znewn(name,s) -- Make a new unique file name based on the given name. zdelet(name) -- Delete the named file. zxpand(string) -- Expands the given wildcard string into a list of files. znext(string) -- Returns the next file from the list in "string". zxcmd(cmd) -- Execute the command in a lower fork. zclosf() -- Close input file associated with zxcmd()'s lower fork. zrtol(n1,n2) -- Convert remote filename into local form. zltor(n1,n2) -- Convert local filename into remote form. zchdir(dirnam) -- Change working directory. zhome() -- Return pointer to home directory name string. zkself() -- Kill self, log out own job. */ #ifdef FT18 #define PROVX1 #endif /* Which systems include <sys/file.h>... */ #ifndef PROVX1 #ifndef aegis #ifndef CIE #ifndef MINIX #ifndef XENIX /* Watch out, some versions of Xenix might need to do this include, */ /* but reportedly SCO Xenix 2.2 on an 80x86 system does not. */ #include <sys/file.h> /* File access */ #endif #endif #endif #endif #endif #ifdef FT18 #undef PROVX1 #endif /* Some systems define these symbols in include files, others don't... */ #ifndef R_OK #define R_OK 4 /* For access */ #endif #ifndef W_OK #define W_OK 2 #endif #ifdef PROVX1 #define MAXNAMLEN DIRSIZ /* Max file name length */ #endif #ifdef UXIII #include <fcntl.h> #define MAXNAMLEN DIRSIZ #endif #ifndef O_RDONLY #define O_RDONLY 000 #endif #ifndef MAXNAMLEN #define MAXNAMLEN 14 /* If still not defined... */ #endif #ifdef PROVX1 #define MAXWLD 50 /* Maximum wildcard filenames */ #else #ifdef BSD29 #define MAXWLD 50 /* Maximum wildcard filenames */ #else #define MAXWLD 500 #endif #endif /* Declarations */ FILE *fp[ZNFILS] = { /* File pointers */ NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static int pid; /* pid of child fork */ static int fcount; /* Number of files in wild group */ static char nambuf[MAXNAMLEN+2]; /* Buffer for a filename */ char *malloc(), *getenv(), *strcpy(); /* System functions */ extern errno; /* System error code */ static char *mtchs[MAXWLD], /* Matches found for filename */ **mtchptr; /* Pointer to current match */ /* Z K S E L F -- Kill Self: log out own job, if possible. */ /* Note, should get current pid, but if your system doesn't have */ /* getppid(), then just kill(0,9)... */ zkself() { /* For "bye", but no guarantee! */ #ifdef PROVX1 return(kill(0,9)); #else #ifdef V7 return(kill(0,9)); #else #ifdef TOWER1 return(kill(0,9)); #else #ifdef FT18 return(kill(0,9)); #else #ifdef aegis return(kill(0,9)); #else return(kill(getppid(),1)); #endif #endif #endif #endif #endif } /* Z O P E N I -- Open an existing file for input. */ zopeni(n,name) int n; char *name; { debug(F111," zopeni",name,n); debug(F101," fp","",(int) fp[n]); if (chkfn(n) != 0) return(0); if (n == ZSYSFN) { /* Input from a system function? */ debug(F110," invoking zxcmd",name,0); return(zxcmd(name)); /* Try to fork the command */ } if (n == ZSTDIO) { /* Standard input? */ if (isatty(0)) { ermsg("Terminal input not allowed"); debug(F110,"zopeni: attempts input from unredirected stdin","",0); return(0); } fp[ZIFILE] = stdin; return(1); } fp[n] = fopen(name,"r"); /* Real file. */ debug(F111," zopeni", name, (int) fp[n]); if (fp[n] == NULL) perror("zopeni"); return((fp[n] != NULL) ? 1 : 0); } /* Z O P E N O -- Open a new file for output. */ zopeno(n,name) int n; char *name; { debug(F111," zopeno",name,n); if (chkfn(n) != 0) return(0); if ((n == ZCTERM) || (n == ZSTDIO)) { /* Terminal or standard output */ fp[ZOFILE] = stdout; debug(F101," fp[]=stdout", "", (int) fp[n]); return(1); } fp[n] = fopen(name,"w"); /* A real file, try to open */ if (fp[n] == NULL) { perror("zopeno can't open"); } else { chown(name, getuid(), getgid()); /* In case set[gu]id */ if (n == ZDFILE) setbuf(fp[n],(char *)NULL); /* Debugging file unbuffered */ } debug(F101, " fp[n]", "", (int) fp[n]); return((fp[n] != NULL) ? 1 : 0); } /* Z C L O S E -- Close the given file. */ /* Returns 0 if arg out of range, 1 if successful, -1 if close failed. */ zclose(n) int n; { int x; if (chkfn(n) < 1) return(0); /* Check range of n */ if ((nI��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� == ZIFILE) && fp[ZSYSFN]) { /* If system function */ x = zclosf(); /* do it specially */ } else { if ((fp[n] != stdout) && (fp[n] != stdin)) x = fclose(fp[n]); fp[n] = NULL; } return((x == EOF) ? -1 : 1); } /* Z C H I N -- Get a character from the input file. */ /* Returns -1 if EOF, 0 otherwise with character returned in argument */ zchin(n,c) int n; char *c; { int a; if (chkfn(n) < 1) return(-1); a = getc(fp[n]); if (a == EOF) return(-1); *c = a & 0377; return(0); } /* Z S O U T -- Write a string to the given file, buffered. */ zsout(n,s) int n; char *s; { if (chkfn(n) < 1) return(-1); fputs(s,fp[n]); return(0); } /* Z S O U T L -- Write string to file, with line terminator, buffered */ zsoutl(n,s) int n; char *s; { if (chkfn(n) < 1) return(-1); fputs(s,fp[n]); fputs("\n",fp[n]); return(0); } /* Z S O U T X -- Write x characters to file, unbuffered. */ zsoutx(n,s,x) int n, x; char *s; { if (chkfn(n) < 1) return(-1); /* return(write(fp[n]->_file,s,x)); */ return(write(fileno(fp[n]),s,x)); } /* Z C H O U T -- Add a character to the given file. */ /* Should return 0 or greater on success, -1 on failure (e.g. disk full) */ zchout(n,c) int n; char c; { if (chkfn(n) < 1) return(-1); if (n == ZSFILE) return(write(fileno(fp[n]),&c,1)); /* Use unbuffered for session log */ else { /* Buffered for everything else */ if (putc(c,fp[n]) == EOF) /* If true, maybe there was an error */ return(ferror(fp[n])?-1:0); /* Check to make sure */ else /* Otherwise... */ return(0); /* There was no error. */ } } /* C H K F N -- Internal function to verify file number is ok */ /* Returns: -1: File number n is out of range 0: n is in range, but file is not open 1: n in range and file is open */ chkfn(n) int n; { switch (n) { case ZCTERM: case ZSTDIO: case ZIFILE: case ZOFILE: case ZDFILE: case ZTFILE: case ZPFILE: case ZSFILE: case ZSYSFN: break; default: debug(F101,"chkfn: file number out of range","",n); fprintf(stderr,"?File number out of range - %d\n",n); return(-1); } return( (fp[n] == NULL) ? 0 : 1 ); } /* Z C H K I -- Check if input file exists and is readable */ /* Returns: >= 0 if the file can be read (returns the size). -1 if file doesn't exist or can't be accessed, -2 if file exists but is not readable (e.g. a directory file). -3 if file exists but protected against read access. */ /* For Berkeley Unix, a file must be of type "regular" to be readable. Directory files, special files, and symbolic links are not readable. */ long zchki(name) char *name; { struct stat buf; int x; long y; x = stat(name,&buf); if (x < 0) { debug(F111,"zchki stat fails",name,errno); return(-1); } x = buf.st_mode & S_IFMT; /* Isolate file format field */ if ((x != 0) && (x != S_IFREG)) { debug(F111,"zchki skipping:",name,x); return(-2); } debug(F111,"zchki stat ok:",name,x); if ((x = access(name,R_OK)) < 0) { /* Is the file accessible? */ debug(F111," access failed:",name,x); /* No */ return(-3); } else { y = buf.st_size; debug(F111," access ok:",name,(int) y); /* Yes */ return( (y > -1) ? y : 0 ); } } /* Z C H K O -- Check if output file can be created */ /* Returns -1 if write permission for the file would be denied, 0 otherwise. */ zchko(name) char *name; { int i, x; char s[50], *sp; sp = s; /* Make a copy, get length */ x = 0; while ((*sp++ = *name++) != '\0') x++; if (x == 0) return(-1); /* If no filename, fail. */ debug(F101," length","",x); for (i = x; i > 0; i--) /* Strip filename. */ if (s[i-1] == '/') break; debug(F101," i","",i); if (i == 0) /* If no path, use current directory */ strcpy(s,"./"); else /* Otherwise, use given one. */ s[i] = '\0'; x = access(s,W_OK); /* Check access of path. */ if (x < 0) { debug(F111,"zchko access failed:",s,errno); return(-1); } else { debug(F111,"zchko access ok:",s,x); return(0); } } /* Z D E L E T -- Delete the named file. */ zdelet(name) char *name; { unlink(name); } /* Z R T O L -- Convert remote filename into local form */ /* For UNIX, this means changing uppercase letters to lowercase. */ zrtol(name,name2) char *name, *name2; { for ( ; *name != '\0'; name++) { *name2++ = isupper(*name) ? tolower(*name) : *name; } *name2 = '\0'; debug(F110,"zrtol:",name2,0); } /* Z L T O R -- Local TO Remote */ /* Convert filename from local format to common (remote) form. */ zltor(name,name2) char *name, *name2; { char work[100], *cp, *pp; int dc = 0; #ifdef aegis char *getenv(), *index(), *namechars; int tilde = 0, bslash = 0; if ((namechars = getenv("NAMECHARS")) != NULL) { if (index(namechars, '~' ) != NULL) tilde = '~'; if (index(namechars, '\\') != NULL) bslash = '\\'; } else { tilde = '~'; bslash = '\\'; } #endif debug(F110,"zltor",name,0); pp = work; #ifdef aegis cp = name; if (tilde && *cp == tilde) ++cp; for (; *cp != '\0'; cp++) { /* strip path name */ if (*cp == '/' || *cp == bslash) { #else for (cp = name; *cp != '\0'; cp++) { /* strip path name */ if (*cp == '/') { #endif dc = 0; pp = work; } else if (islower(*cp)) *pp++ = toupper(*cp); /* Uppercase letters */ else if (*cp == '~') *pp++ = 'X'; /* Change tilde to 'X' */ else if (*cp == '#') *pp++ = 'X'; /* Change number sign to 'X' */ else if ((*cp == '.') && (++dc > 1)) *pp++ = 'X'; /* & extra dots */ else *pp++ = *cp; } *pp = '\0'; /* Tie it off. */ cp = name2; /* If nothing before dot, */ if (*work == '.') *cp++ = 'X'; /* insert 'X' */ strcpy(cp,work); debug(F110," name2",name2,0); } /* Z C H D I R -- Change directory */ zchdir(dirnam) char *dirnam; { char *hd; if (*dirnam == '\0') hd = getenv("HOME"); else hd = dirnam; return((chdir(hd) == 0) ? 1 : 0); } /* Z H O M E -- Return pointer to user's home directory */ char * zhome() { return(getenv("HOME")); } /* Z G T D I R -- Return pointer to user's current directory */ char * zgtdir() { #ifdef MAXPATHLEN #define CWDBL MAXPATHLEN #else #define CWDBL 100 #endif #ifdef UXIII char cwdbuf[CWDBL+1]; char *buf; char *getcwd(); buf = cwdbuf; return(getcwd(buf,CWDBL)); #else #ifdef BSD4 char cwdbuf[CWDBL+1]; char *buf; char *getwd(); buf = cwdbuf; return(getwd(buf)); #else return("(directory unknown)"); #endif #endif } /* Z X C M D -- Run a system command so its output can be read like a file */ zxcmd(comand) char *comand; { int pipes[2]; if (pipe(pipes) != 0) { debug(F100,"zxcmd pipe failure","",0); return(0); /* can't make pipe, fail */ } #ifdef aegis if ((pid = vfork()) == 0) { /* child */ #else if ((pid = fork()) == 0) { /* child */ #endif /*#if BSD4*/ /* Code from Dave Tweten@AMES-NAS */ /* readapted to use getpwuid to find login shell */ /* -- H. Fischer */ char *shpath, *shname, *shptr; /* to find desired shell */ #ifndef aegis struct passwd *p; extern struct passwd * getpwuid(); extern int getuid(); char *defShel = "/bin/sh"; /* default shell */ #endif close(pipes[0]); /* close input side of pipe */ close(0); /* close stdin */ if (open("/dev/null",0) < 0) return(0); /* replace input by null */ #ifndef UXIII dup2(pipes[1],1); /* replace stdout & stderr */ dup2(pipes[1],2); /* by the pipe */ #else close(1); /* simulate dup2 */ if (dup(pipes[1]) != 1 ) conol("trouble duping stdout in routine zxcmd\n"); close(2); /* simulate dup2 */ if (dup(pipes[1]) != 2 ) conol("trouble duping stderr in routine zxcmd\n"); #endif close(pipes[1]); /* get rid of this copy of the pipe */ #ifdef aegis if ((shpath = getenv("SERVERSHELL")) == NULL) shpath = "/bin/sh"; #else /**** shptr = shname = shpath = getenv("SHELL"); /* What shell? */ p = getpwuid( getuid() ); /* get login data */ if ( p == (struct passwd *) NULL || !*(p->pw_shell) ) shpath = defShel; else shpath = p->pw_shell; #endif shptr = shname = shpath; while (*shptr != '\0') if (*shptr++ == '/') shname = shptr; debug(F100,"zxcmd...","",0); debug(F110,shpath,shname,0); /* Remove the following uid calls if they cause trouble... */ #ifdef BSD4 setegid(getgid()); /* Override 4.3BSD csh */ seteuid(getuid()); /* security checks */ #endif /* bsd4 */ execl(shpath,shname,"-c",comand,(char *)NULL); /* Execute the cmd */ exit(0); /* just punt if it failed. */ } else if (pid == -1) { debug(F100,"zxcmd fork failure","",0); return(0); } close(pipes[1]); /* don't need the output side */ fp[ZIFILE] = fdopen(pipes[0],"r"); /* open a stream for it */ fp[ZSYSFN] = fp[ZIFILE]; /* Remember. */ return(1); } /* Z C L O S F - wait for the child fork to terminate and close the pipe. */ zclosf() { int wstat; if (kill(pid,9) == 0) { debug(F101,"zclosf pid =","",pid); while ((wstat = wait((int *)0)) != pid && wstat != -1) ; pid = 0; } fclose(fp[ZIFILE]); fp[ZIFILE] = fp[ZSYSFN] = NULL; return(1); } /* Z X P A N D -- Expand a wildcard string into an array of strings */ /* Returns the number of files that match fn1, with data structures set up so that first file (if any) will be returned by the next znext() call. */ zxpand(fn) char *fn; { fcount = fgen(fn,mtchs,MAXWLD); /* Look up the file. */ if (fcount > 0) { mtchptr = mtchs; /* Save pointer for next. */ } debug(F111,"zxpand",mtchs[0],fcount); return(fcount); } /* Z N E X T -- Get name of next file from list created by zxpand(). */ /* Returns >0 if there's another file, with its name copied into the arg string, or 0 if no more files in list. */ znext(fn) char *fn; { if (fcount-- > 0) strcpy(fn,*mtchptr++); else *fn = '\0'; debug(F111,"znext",fn,fcount+1); return(fcount+1); } /* Z N E W N -- Make a new name for the given file */ znewn(fn,s) char *fn, **s; { #ifdef BSD4 static char buf[256]; #else static char buf[100]; #endif char *bp, *xp; int len = 0, n = 0, d = 0, t, i, power = 1; #ifdef MAXNAMLEN int max = MAXNAMLEN; #else int max = 14; #endif bp = buf; while (*fn) { /* Copy name into buf */ *bp++ = *fn++; len++; } if (len > max-2) { /* Don't let it get too long */ bp = buf + max-2; len = max - 2; } for (i = 1; i < 4; i++) { /* Try up to 999 times */ power *= 10; *bp++ = '*'; /* Put a star on the end */ *bp-- = '\0'; n = zxpand(buf); /* Expand the resulting wild name */ while (n-- > 0) { /* Find any existing name~d files */ xp = *mtchptr++; xp += len; if (*xp == '~') { t = atoi(xp+1); if (t > d) d = t; /* Get maximum d */ } } if (d < power-1) { sprintf(bp,"~%d",d+1); /* Make name~(d+1) */ *s = buf; return; } bp--; len--; } /* If we ever get here, we'll overwrite the xxx~100 file... */ } /* Directory Functions for Unix, written by Jeff Damens, CUCCA, 1984. */ /* * The path structure is used to represent the name to match. * Each slash-separated segment of the name is kept in one * such structure, and they are linked together, to make * traversing the name easier. */ struct path { char npart[MAXNAMLEN]; /* name part of path segment */ struct path *fwd; /* forward ptr */ }; #ifdef PROVX1 #define SSPACE 500 #else #ifdef BSD29 #define SSPACE 500 #else #ifdef aegis #define SSPACE 10000 /* size of string-generating buffer */ static char bslash; /* backslash character if active */ #else #define SSPACE 2000 /* size of string-generating buffer */ #endif #endif #endif static char sspace[SSPACE]; /* buffer to generate names in */ static char *freeptr,**resptr; /* copies of caller's arguments */ static int remlen; /* remaining length in caller's array*/ static int numfnd; /* number of matches found */ /* * splitpath: * takes a string and splits the slash-separated portions into * a list of path structures. Returns the head of the list. The * structures are allocated by malloc, so they must be freed. * Splitpath is used internally by the filename generator. * * Input: A string. * Returns: A linked list of the slash-separated segments of the input. */ struct path * splitpath(p) char *p; { struct path *head,*cur,*prv; int i; head = prv = NULL; if (*p == '/') p++; /* skip leading slash */ while (*p != '\0') { cur = (struct path *) malloc(sizeof (struct path)); debug(F101,"splitpath malloc","",cur); if (cur == NULL) fatal("malloc fails in splitpath()"); cur -> fwd = NULL; if (head == NULL) head = cur; else prv -> fwd = cur; /* link into chain */ prv = cur; #ifdef aegis /* treat backslash as "../" */ if (bslash && *p == bslash) { strcpy(cur->npart, ".."); ++p; } else { for (i=0; i < MAXNAMLEN && *p && *p != '/' && *p != bslash; i++) cur -> npart[i] = *p++; cur -> npart[i] = '\0'; /* end this segment */ if (i >= MAXNAMLEN) while (*p && *p != '/' && *p != bslash) p++; } if (*p == '/') p++; #else for (i=0; i < MAXNAMLEN && *p != '/' && *p != '\0'; i++) cur -> npart[i] = *p++; cur -> npart[i] = '\0'; /* end this segment */ if (i >= MAXNAMLEN) while (*p != '/' && *p != '\0') p++; if (*p == '/') p++; #endif } return(head); } /* * fgen: * This is the actual name generator. It is passed a string, * possibly containing wildcards, and an array of character pointers. * It finds all the matching filenames and stores them into the array. * The returned strings are allocated from a static buffer local to * this module (so the caller doesn't have to worry about deallocating * them); this means that successive calls to fgen will wipe out * the results of previous calls. This isn't a problem here * because we process one wildcard string at a time. * * Input: a wildcard string, an array to write names to, the * length of the array. * Returns: the number of matches. The array is filled with filenames * that matched the pattern. If there wasn't enough room in the * array, -1 is returned. * By: Jeff Damens, CUCCA, 1984. */ fgen(pat,resarry,len) char *pat,*resarry[]; int len; { struct path *head; char scratch[100],*sptr; #ifdef aegis char *getenv(), *index(), *namechars; int tilde = 0, bquote = 0; if ((namechars = getenv("NAMECHARS")) != NULL) { if (index(namechars, '~' ) != NULL) tilde = '~'; if (index(namechars, '\\') != NULL) bslash = '\\'; if (index(namechars, '`' ) != NULL) bquote = '`'; } else { tilde = '~'; bslash = '\\'; bquote = '`'; } sptr = scratch; /* copy "`node_data", etc. anchors */ if (bquote && *pat == bquote) while (*pat && *pat != '/' && *pat != bslash) *sptr++ = *pat++; else if (tilde && *pat == tilde) *sptr++ = *pat++; while (*pat == '/') *sptr++ = *pat++; if (sptr == scratch) { strcpy(scratch,"./"); sptr = scratch+2; } /* init buffer correctly */ head = splitpath(pat); #else head = splitpath(pat); if (*pat == '/') { scratch[0] = '/'; sptr = scratch+1; } else { strcpy(scratch,"./"); sptr = scratch+2; } /* init buffer correctly */ #endif numfnd = 0; /* none found yet */ freeptr = sspace; /* this is where matches are copied */ resptr = resarry; /* static copies of these so*/ remlen = len; /* recursive calls can alter them */ traverse(head,scratch,sptr); /* go walk the directory tree */ for (; head != NULL; head = head -> fwd) free(head); /* return the path segments */ return(numfnd); /* and return the number of matches */ } /* traverse: * Walks the directory tree looking for matches to its arguments. * The algorithm is, briefly: * If the current pattern segment contains no wildcards, that * segment is added to what we already have. If the name so far * exists, we call ourselves recursively with the next segment * in the pattern string; otherwise, we just return. * * If the current pattern segment contains wildcards, we open the name * we've accumulated so far (assuming it is really a directory), then read * each filename in it, and, if it matches the wildcard pattern segment, add * that filename to what we have so far and call ourselves recursively on the * next segment. * * Finally, when no more pattern segments remain, we add what's accumulated * so far to the result array and increment the number of matches. * * Input: a pattern path list (as generated by splitpath), a string * pointer that points to what we've traversed so far (this * can be initialized to "/" to start the search at the root * directory, or to "./" to start the search at the current * directory), and a string pointer to the end of the string * in the previous argument. * Returns: nothing. */ traverse(pl,sofar,endcur) struct path *pl; char *sofar,*endcur; { DIR *fd, *opendir(); struct dirent *dirbuf; struct stat statbuf; if (pl == NULL) { *--endcur = '\0'; /* end string, overwrite trailing / */ addresult(sofar); return; } if (!iswild(pl -> npart)) { strcpy(endcur,pl -> npart); endcur += strlen(pl -> npart); *endcur = '\0'; /* end current string */ if (stat(sofar,&statbuf) == 0) /* if current piece exists */ { *endcur++ = '/'; /* add slash to end */ *endcur = '\0'; /* and end the string */ traverse(pl -> fwd,sofar,endcur); } return; } /* cont'd... */ /*...traverse, cont'd */ /* segment contains wildcards, have to search directory */ *endcur = '\0'; /* end current string */ if (stat(sofar,&statbuf) == -1) return; /* doesn't exist, forget it */ if ((statbuf.st_mode & S_IFDIR) == 0) return; /* not a directory, skip */ if ((fd = opendir(sofar)) == NULL) return; /* can't open, forget it */ while (dirbuf = readdir(fd)) { strncpy(nambuf,dirbuf->d_name,MAXNAMLEN); /* Get a null terminated copy!!! */ nambuf[MAXNAMLEN] = '\0'; if (dirbuf->d_ino != 0 && match(pl -> npart,nambuf)) { char *eos; strcpy(endcur,nambuf); eos = endcur + strlen(nambuf); *eos = '/'; /* end this segment */ traverse(pl -> fwd,sofar,eos+1); } } closedir(fd); } /* * addresult: * Adds a result string to the result array. Increments the number * of matches found, copies the found string into our string * buffer, and puts a pointer to the buffer into the caller's result * array. Our free buffer pointer is updated. If there is no * more room in the caller's array, the number of matches is set to -1. * Input: a result string. * Returns: nothing. */ addresult(str) char *str; { int l; if (strncmp(str,"./",2) == 0) str += 2; if (--remlen < 0) { numfnd = -1; return; } l = strlen(str) + 1; /* size this will take up */ if ((freeptr + l) > &sspace[SSPACE-1]) { numfnd = -1; /* do not record if not enough space */ return; } strcpy(freeptr,str); *resptr++ = freeptr; freeptr += l; numfnd++; } iswild(str) char *str; { char c; while ((c = *str++) != '\0') if (c == '*' || c == '?') return(1); return(0); } /* * match: * pattern matcher. Takes a string and a pattern possibly containing * the wildcard characters '*' and '?'. Returns true if the pattern * matches the string, false otherwise. * by: Jeff Damens, CUCCA * * Input: a string and a wildcard pattern. * Returns: 1 if match, 0 if no match. */ match(pattern,string) char *pattern,*string; { char *psave,*ssave; /* back up pointers for failure */ psave = ssave = NULL; while (1) { for (; *pattern == *string; pattern++,string++) /* skip first */ if (*string == '\0') return(1); /* end of strings, succeed */ if (*string != '\0' && *pattern == '?') { pattern++; /* '?', let it match */ string++; } else if (*pattern == '*') { /* '*' ... */ psave = ++pattern; /* remember where we saw it */ ssave = string; /* let it match 0 chars */ } else if (ssave != NULL && *ssave != '\0') { /* if not at end */ /* ...have seen a star */ string = ++ssave; /* skip 1 char from string */ pattern = psave; /* and back up pattern */ } else return(0); /* otherwise just fail */ } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *loginv = "Script Command, V2.0(007) 3 Aug 87"; /* C K U S C R -- Login script for logging onto remote system */ /* This module should work under all versions of Unix. It calls externally defined system-depended functions for i/o. The module expects a login string of the expect send [expect send] ... format. It is intended to operate similarly to the way the common uucp "L.sys" login entries work. Conditional responses are supported expect[-send-expect[...]] as with uucp. The send keyword EOT sends a control-d, and the keyword BREAK sends a break. Letters prefixed by '~' are '~b' backspace, '~s' space, '~n' linefeed, '~r' return, '~x' xon, '~t' tab, '~q' ? (not allowed on kermit command lines), '~' ~, '~'', '~"', '~c' don't append return, '~o[o[o]]' octal character. As with some uucp systems, sent strings are followed by ~r (not ~n) unless they end with ~c. Null expect strings (e.g., ~0 or --) cause a short delay, and are useful for sending sequences requiring slight pauses. Author: Herm Fischer (HFISCHER@USC-ECLB) Contributed to Columbia University for inclusion in C-Kermit. Copyright (C) 1985, Herman Fischer, 16400 Ventura Blvd, Encino CA 91436 Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ #include <sys/types.h> #include "ckcdeb.h" #include <stdio.h> #include <ctype.h> #include <signal.h> #include <setjmp.h> #include "ckcker.h" #ifndef MINIX extern int local, speed, flow, seslog, mdmtyp, quiet, duplex; extern char ttname[]; extern CHAR dopar(); static char * chstr(); static int EXP_ALRM = 15; /* Time to wait for expect string */ #define SND_ALRM 15 /* Time to allow for sending string */ #define NULL_EXP 2 /* Time to pause on null expect strg*/ #define DEL_MSEC 300 /* milliseconds to pause on ~d */ #define SBUFL 512 static char seq_buf[SBUFL], *s; /* Login Sequence buffer */ static char fls_buf[SBUFL]; /* Flush buffer */ static int got_it, no_cr; /* connect state parent/child communication signal handlers */ static jmp_buf alrmRng; /* Envir ptr for connect errors */ scrtime() { /* modem read failure handler, */ longjmp(alrmRng,1); /* notifies parent process to stop */ } /* Sequence interpreter -- pick up next sequence from command string, decode escapes and place into seq_buf If string contains a ~d (delay) then sequenc returns a 1 expecting to be called again after the ~d executes. */ static sequenc() { int i; char c, oct_char; no_cr = 0; /* output needs cr appended */ for (i=0; i<SBUFL; ) { if (*s == '\0' || *s == '-' || isspace(*s) ) { /* done */ seq_buf[i] = '\0'; return(0) ; } if (*s == '~') { /* escape character */ switch (c = *(++s) ) { case 'n': seq_buf[i++] = '\n'; break; case 'r': seq_buf[i++] = '\r'; break; case 't': seq_buf[i++] = '\t'; break; case 'b': seq_buf[i++] = '\b'; break; case 'q': seq_buf[i++] = '?'; break; case '~': seq_buf[i++] = '~'; break; case '\'': seq_buf[i++] = '\''; break; case '\"': seq_buf[i++] = '\"'; break; case 's': seq_buf[i++] = ' '; break; case 'x': seq_buf[i++] = '\021'; break; case 'c': no_cr = 1; break; case 'd': { /* send what we have & then */ seq_buf[i] = '\0'; /* expect to send rest after */ no_cr = 1; /* sender delays a little */ s++; return(1); } case 'w': { /* wait count */ EXP_ALRM = 15; /* default to 15 sec */ if ( isdigit( *(s+1) ) ) { EXP_ALRM = (*(++s)) & 15; if ( isdigit( *(s+1) ) ) { EXP_ALRM = EXP_ALRM*10 + ( (*(++s)) & 15 ); } } break; } default: if ( isdigit(c) ) { /* octal character */ oct_char = (c & 7); /* most significant digit */ if (isdigit( *(s+1) ) ) { oct_char = (oct_char<<3) | ( (*(++s)) & 7 ) ; if (isdigit( *(s+1) ) ) { oct_char = (oct_char<<3) | ( (*(++s)) & 7 ) ; } } seq_buf[i++] = oct_char; break; } } } else seq_buf[i++] = *s; /* plain old character */ s++; } seq_buf[i] = '\0'; return(0); /* end of space, return anyway */ } /* Receive sequence -- see if expected response comes return success (or failure) in got_it */ static recvSeq() { char *e, got[7], trace[SBUFL]; int i, l; sequenc(); l = strlen(e=seq_buf); /* no more than 7 chars allowed */ if (l > 7) { e += l-7; l = 7; } tlog(F111,"expecting sequence",e,(long) l); if (l == 0) { /* null sequence, just delay a little */ sleep (NULL_EXP); got_it = 1; tlog(F100,"got it (null sequence)","",0l); return; } *trace = '\0'; for (i=0; i<7; i++) got[i]='\0'; signal(SIGALRM,scrtime); /* did we get it? */ if (!setjmp(alrmRng)) { /* not timed out yet */ alarm(EXP_ALRM); while (!got_it) { for (i=0; i<(l-1); i++) got[i] = got[i+1]; /* shift over one */ got[l-1] = ttinc(0) & 0177; /* next char */ if (seslog) /* Log in session log */ zchout(ZSFILE,got[l-1]); if (strlen(trace) < sizeof(trace)-2 ) strcat(trace,chstr(got[l-1])); got_it = (!strncmp(seq_buf, got, l) ) ; } } else got_it = 0; /* timed out here */ alarm(0); signal(SIGALRM,SIG_IGN); tlog(F110,"received sequence: ",trace,0l); tlog(F101,"returning with got-it code","",(long) got_it); return; } /* Output A Sequence starting at pointer s, return 0 if okay, 1 if failed to read (modem hangup or whatever) */ static int outSeq() { char *sb; int l; int delay; int retCode = 0; while(1) { delay = sequenc(); l = strlen(seq_buf); tlog(F111,"sending sequence ",seq_buf,(long) l); signal(SIGALRM,scrtime); if (!setjmp(alrmRng)) { alarm(SND_ALRM); if (!strcmp(seq_buf,"EOT")) { ttoc(dopar('\004')); if (seslog && duplex) zsout(ZSFILE,"{EOT}"); } else if (!strcmp(seq_buf,"BREAK")) { ttsndb(); zsout(ZSFILE,"{BREAK}"); } else { if (l > 0) { for ( sb=seq_buf; *sb; sb++) *sb = dopar(*sb); ttol(seq_buf,l); /* with parity */ if (seslog && duplex) zsout(ZSFILE,seq_buf); } if (!no_cr) { ttoc( dopar('\r') ); if (seslog && duplex) zchout(ZSFILE,dopar('\r')); } } } else retCode |= -1; /* else -- alarm rang */ alarm(0); signal(SIGALRM,SIG_IGN); if (!delay) return ( retCode ); msleep(DEL_MSEC); /* delay, and loop to next stuff to send */ } } #endif /* not MINIX */ /* L O G I N -- Login to remote system */ login(cmdstr) char *cmdstr; { #ifndef MINIX SIGTYP (*saveAlm)(); /* save incoming alarm function */ char *e; s = cmdstr; /* make global to ckuscr.c */ tlog(F100,loginv,"",0l); if (!local) { printf("Sorry, you must 'set line' first\n"); return(-2); } if (speed < 0) { printf("Sorry, you must 'set speed' first\n"); return(-2); } if (ttopen(ttname,&local,mdmtyp) < 0) { sprintf(seq_buf,"Sorry, can't open %s",ttname); perror(seq_buf); return(-2); } if (!quiet) printf("Executing script thru %s, speed %d.\r\n",ttname,speed); *seq_buf=0; for (e=s; *e; e++) strcat(seq_buf, chstr(*e) ); if (!quiet) printf("Script string: %s\r\n",seq_buf); tlog(F110,"Script string: ",seq_buf, 0l); /* Condition console terminal and communication line */ if (ttvt(speed,flow) < 0) { printf("Sorry, Can't condition communication line\n"); return(-2); } /* save initial timer interrupt value */ saveAlm = signal(SIGALRM,SIG_IGN); flushi(); /* flush stale input */ /* cont'd... */ /* ...login, cont'd */ /* start expect - send sequence */ while (*s) { /* while not done with buffer */ while (*s && isspace(*s)) s++; /* skip over separating whitespaces */ /* gather up expect sequence */ got_it = 0; recvSeq(); while (!got_it) { /* no, is there a conditional send */ if (*s++ != '-') goto failRet; /* no -- return failure */ /* start of conditional send */ flushi(); /* flush out input buffer */ if (outSeq()) goto failRet; /* if unable to send! */ if (*s++ != '-') goto failI��I��I������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ret; /* must have condit respon.*/ recvSeq(); } /* loop back and check got_it */ while (*s && !isspace(*s++) ) ; /* Skip over conditionals */ while (*s && isspace(*s)) s++; /* Skip over separating whitespaces */ flushi(); /* Flush */ if (*s) if (outSeq()) goto failRet; /* If any */ } signal(SIGALRM,saveAlm); if (!quiet) printf("Script successful.\r\n"); tlog(F100,"Script successful.","",0l); #endif /* not MINIX */ return(0); #ifndef MINIX failRet: signal(SIGALRM,saveAlm); printf("Sorry, script failed\r\n"); tlog(F100,"Script failed","",0l); return(-2); #endif /* not MINIX */ } /* C H S T R -- Make printable string from a character */ #ifndef MINIX static char * chstr(c) char c; { static char sc[4]; if (c < SP) sprintf(sc, "^%c",ctl(c) ); else sprintf(sc, "%c", c); return(sc); } /* F L U S H I -- Flush, but log, input buffer */ flushi() { int n; if (seslog) { /* Logging session? */ n = ttchk(); /* Yes, anything in buffer? */ if (n > 0) { /* If so, */ if (n > SBUFL) n = SBUFL; /* make sure not too much, */ n = ttxin(n,fls_buf); /* then read it, */ zsout(ZSFILE,fls_buf); /* and log it. */ } } else ttflui(); /* Otherwise just flush. */ } #endif /* not MINIX */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *ckxv = "Unix tty I/O, 4E(047), 27 Jan 88"; /* C K U T I O */ /* C-Kermit interrupt, terminal control & i/o functions for Unix systems */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, 1988, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Includes for all Unixes (conditional includes come later) */ #include <sys/types.h> /* Types */ #ifndef MINIX #include <sys/dir.h> /* Directory */ #endif #include <ctype.h> /* Character types */ #ifdef NULL #undef NULL #endif /* NULL */ #include <stdio.h> /* Unix Standard i/o */ #include <signal.h> /* Interrupts */ #ifndef ZILOG #include <setjmp.h> /* Longjumps */ #else #include <setret.h> #endif #ifdef MINIX #include <sys/stat.h> /* File attributes */ #endif #include "ckcdeb.h" /* Typedefs, formats for debug() */ /* Maximum length for the name of a tty device */ #ifndef DEVNAMLEN #define DEVNAMLEN 25 #endif /* 4.1 BSD support added by Charles E. Brooks, EDN-VAX */ /* Fortune 32:16 Pro:For 1.8 support mostly like 4.1, added by J-P Dumas */ #ifdef BSD4 #define ANYBSD #ifdef MAXNAMLEN #define BSD42 #ifdef aegis char *ckxsys = " Apollo DOMAIN/IX 4.2 BSD"; #else char *ckxsys = " 4.2 BSD"; #endif /* aegis */ #else #ifdef FT18 #define BSD41 char *ckxsys = " Fortune For:Pro 1.8"; #else #define BSD41 #ifndef C70 char *ckxsys = " 4.1 BSD"; #endif /* not c70 */ #endif /* ft18 */ #endif /* maxnamlen */ #endif /* bsd4 */ /* 2.9bsd support contributed by Bradley Smith, UCLA */ #ifdef BSD29 #define ANYBSD char *ckxsys = " 2.9 BSD"; #endif /* bsd29 */ /* Version 7 UNIX support contributed by Gregg Wonderly, Oklahoma State University: gregg@okstate.csnet */ #ifdef V7 #ifndef MINIX char *ckxsys = " Version 7 UNIX (tm)"; #endif #endif /* v7 */ /* Minix support added by Charles Hedrick, Rutgers University: hedrick@aramis.rutgers.edu Minix also has V7 enabled. */ #ifdef MINIX char *ckxsys = " Minix"; #define TANDEM 0 #define MYREAD #include <limits.h> #endif /* BBN C70 support from Frank Wancho, WANCHO@SIMTEL20 */ #ifdef C70 char *ckxsys = " BBN C/70"; #endif /* c70 */ /* IBM 370 IX/370 support from Wayne Van Pelt, GE/CRD, Schenectedy, NY */ #ifdef IX370 char *ckxsys = " IBM IX/370"; #endif /* ix370 */ /* Amdahl UTS 2.4 (v7 derivative) for IBM 370 series compatible mainframes */ /* Contributed by Garard Gaye, Jean-Pierre Dumas, DUMAS@SUMEX-AIM. */ #ifdef UTS24 char *ckxsys = " Amdahl UTS 2.4"; #endif /* uts24 */ /* Pro/Venix Version 1.x support from Columbia U. */ #ifdef PROVX1 char *ckxsys = " Pro-3xx Venix v1"; #endif /* provx1 */ /* Tower support contributed by John Bray, Auburn, Alabama */ #ifdef TOWER1 char *ckxsys = " NCR Tower 1632, OS 1.02"; #endif /* tower1 */ /* Sys III/V, Xenix, PC/IX support by Herm Fischer, Encino, CA */ #ifdef UXIII #ifdef XENIX char *ckxsys = " Xenix/286"; #else #ifdef PCIX char *ckxsys = " PC/IX"; #else #ifdef ISIII char *ckxsys = " Interactive Systems Corp System III"; #else #ifdef hpux /* HP 9000 Series changes contributed by Bill Coalson */ char *ckxsys = " HP 9000 Series HP-UX"; #else #ifdef aegis /* Apollo Aegis support from SAS Institute, Cary, NC */ char *ckxsys = " Apollo DOMAIN/IX System V"; #else #ifdef ZILOG char *ckxsys = " Zilog S8000 Zeus 3.21+"; #else #ifdef VXVE /* Control Data Corp VX/VE 5.2.1 System V support by */ /* S.O. Lidie, Lehigh University, LUSOL@LEHICDC1.BITNET */ char *ckxsys = " CDC VX/VE 5.2.1 System V"; #else char *ckxsys = " AT&T System III/System V"; #endif /* vxve */ #endif /* zilog */ #endif /* aegis */ #endif /* hpux */ #endif /* isiii */ #endif /* pcix */ #endif /* xenix */ #endif /* uxiii */ /* Features... */ /* Do own buffering, using unbuffered read() calls... */ #ifdef UXIII #define MYREAD #endif /* uxiii */ #ifdef BSD42 #undef MYREAD #include <errno.h> #endif /* bsd42 */ /* Variables available to outside world: dftty -- Pointer to default tty name string, like "/dev/tty". dfloc -- 0 if dftty is console, 1 if external line. dfprty -- Default parity dfflow -- Default flow control ckxech -- Flag for who echoes console typein: 1 - The program (system echo is turned off) 0 - The system (or front end, or terminal). functions that want to do their own echoing should check this flag before doing so. flfnam -- Name of lock file, including its path, e.g., "/usr/spool/uucp/LCK..cul0" or "/etc/locks/tty77" hasLock -- Flag set if this kermit established a uucp lock. inbufc -- number of tty line rawmode unread characters (system III/V unixes) backgrd -- Flag indicating program executing in background ( & on end of shell command). Used to ignore INT and QUIT signals. Functions for assigned communication line (either external or console tty): sysinit() -- System dependent program initialization syscleanup() -- System dependent program shutdown ttopen(ttname,local,mdmtyp) -- Open the named tty for exclusive access. ttclos() -- Close & reset the tty, releasing any access lock. ttpkt(speed,flow) -- Put the tty in packet mode and set the speed. ttvt(speed,flow) -- Put the tty in virtual terminal mode. or in DIALING or CONNECTED modem control state. ttinl(dest,max,timo) -- Timed read line from the tty. ttinc(timo) -- Timed read character from tty. myread() -- System 3 raw mode bulk buffer read, gives -- subsequent chars one at a time and simulates -- FIONREAD! myunrd(c) -- Places c back in buffer to be read (one only) ttchk() -- See how many characters in tty input buffer. ttxin(n,buf) -- Read n characters from tty (untimed). ttol(string,length) -- Write a string to the tty. ttoc(c) -- Write a character to the tty. ttflui() -- Flush tty input buffer. ttlock(ttname) -- Lock against uucp collisions (Sys III) ttunlck() -- Unlock " " " look4lk(ttname) -- Check if a lock file exists */ /* Functions for console terminal: congm() -- Get console terminal modes. concb(esc) -- Put the console in single-character wakeup mode with no echo. conbin(esc) -- Put the console in binary (raw) mode. conres() -- Restore the console to mode obtained by congm(). conoc(c) -- Unbuffered output, one character to console. conol(s) -- Unbuffered output, null-terminated string to the console. conola(s) -- Unbuffered output, array of strings to the console. conxo(n,s) -- Unbuffered output, n characters to the console. conchk() -- Check if characters available at console (bsd 4.2). Check if escape char (^\) typed at console (System III/V). coninc(timo) -- Timed get a character from the console. conint() -- Enable terminal interrupts on the console if not background. connoi() -- Disable terminal interrupts on the console if not background. Time functions msleep(m) -- Millisecond sleep ztime(&s) -- Return pointer to date/time string rtimer() -- Reset timer gtimer() -- Get elapsed time since last call to rtimer() */ /* Conditional Includes */ #ifdef FT18 #include <sys/file.h> /* File information */ #endif /* ft18 */ /* Whether to #include <sys/file.h>... */ #ifndef PROVX1 #ifndef aegis #ifndef MINIX #ifndef XENIX #include <sys/file.h> /* File information */ #endif /* xenix */ #endif /* MINIX */ #endif /* aegis */ #endif /* provx1 */ #ifdef aegis #ifdef BSD4 #include <sys/file.h> #include <fcntl.h> #endif /* bsd4 */ #endif /* aegis */ /* System III, System V */ #ifdef UXIII #include <termio.h> #include <sys/ioctl.h> #include <fcntl.h> /* directory reading for locking */ #include <errno.h> /* error numbers for system returns */ #endif /* uxiii */ #ifdef HPUX #include <sys/modem.h> #endif /* Not Sys III/V */ #ifndef UXIII #include <termios.h> /* Set/Get tty modes */ #ifndef PROVX1 #ifndef V7 I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��I��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#ifndef BSD41 #include <sys/time.h> /* Clock info (for break generation) */ #endif /* not bsd41 */ #endif /* not v7 */ #endif /* not provx1 */ #endif /* not uxiii */ #ifdef BSD41 #include <sys/timeb.h> /* BSD 4.1 ... ceb */ #endif /* bsd41 */ #ifdef BSD29 #include <sys/timeb.h> /* BSD 2.9 (Vic Abell, Purdue) */ #endif /* bsd29 */ #ifdef TOWER1 #include <sys/timeb.h> /* Clock info for NCR Tower */ #endif /* tower1 */ #ifdef aegis #include "/sys/ins/base.ins.c" #include "/sys/ins/error.ins.c" #include "/sys/ins/ios.ins.c" #include "/sys/ins/sio.ins.c" #include "/sys/ins/pad.ins.c" #include "/sys/ins/time.ins.c" #include "/sys/ins/pfm.ins.c" #include "/sys/ins/pgm.ins.c" #include "/sys/ins/ec2.ins.c" #include "/sys/ins/type_uids.ins.c" #include <default_acl.h> #undef TIOCEXCL #undef FIONREAD #endif /* The following two conditional #defines are catch-alls for those systems */ /* that didn't have or couldn't find <file.h>... */ #ifndef FREAD #define FREAD 0x01 #endif #ifndef FWRITE #define FWRITE 0x10 #endif /* Declarations */ long time(); /* All Unixes should have this... */ extern int errno; /* System call error code. */ /* Special stuff for V7 input buffer peeking */ #ifdef V7 int kmem[2] = { -1, -1}; char *initrawq(), *qaddr[2]={0,0}; #define CON 0 #define TTY 1 #endif /* v7 */ /* dftty is the device name of the default device for file transfer */ /* dfloc is 0 if dftty is the user's console terminal, 1 if an external line */ #ifdef PROVX1 char *dftty = "/dev/com1.dout"; /* Only example so far of a system */ int dfloc = 1; /* that goes in local mode by default */ #else char *dftty = CTTNAM; /* Remote by default, use normal */ int dfloc = 0; /* controlling terminal name. */ #endif /* provx1 */ int dfprty = 0; /* Default parity (0 = none) */ int ttprty = 0; /* Parity in use. */ int ttmdm = 0; /* Modem in use. */ int dfflow = 1; /* Xon/Xoff flow control */ int backgrd = 0; /* Assume in foreground (no '&' ) */ int ckxech = 0; /* 0 if system normally echoes console characters, else 1 */ /* Declarations of variables global within this module */ static long tcount; /* Elapsed time counter */ static char *brnuls = "\0\0\0\0\0\0\0"; /* A string of nulls */ static jmp_buf sjbuf, jjbuf; /* Longjump buffer */ static int lkf = 0, /* Line lock flag */ conif = 0, /* Console interrupts on/off flag */ cgmf = 0, /* Flag that console modes saved */ xlocal = 0, /* Flag for tty local or remote */ ttyfd = -1; /* TTY file descriptor */ static char escchr; /* Escape or attn character */ #ifdef BSD42 static struct timeval tv; /* For getting time, from sys/time.h */ static struct timezone tz; #endif /* bsd42 */ #ifdef BSD29 static long clock; /* For getting time from sys/time.h */ static struct timeb ftp; /* And from sys/timeb.h */ #endif /* bsd29 */ #ifdef BSD41 static long clock; /* For getting time from sys/time.h */ static struct timeb ftp; /* And from sys/timeb.h */ #endif /* bsd41 */ #ifdef TOWER1 static long clock; /* For getting time from sys/time.h */ static struct timeb ftp; /* And from sys/timeb.h */ #endif /* tower1 */ #ifdef V7 static long clock; #endif /* v7 */ /* termio/termios information... */ #ifdef UXIII static struct termio ttold = {0}; /* Init'd for word alignment, */ static struct termio ttraw = {0}; /* which is important for some */ static struct termio tttvt = {0}; /* systems, like Zilog... */ static struct termio ccold = {0}; static struct termio ccraw = {0}; static struct termio cccbrk = {0}; #else static struct termios /* termios info... */ ttold, ttraw, tttvt, ttbuf, /* for communication line */ ccold, ccraw, cccbrk; /* and for console */ #endif /* uxiii */ static char flfnam[80]; /* uucp lock file path name */ static int hasLock = 0; /* =1 if this kermit locked uucp */ static int inbufc = 0; /* stuff for efficient SIII raw line */ static int ungotn = -1; /* pushback to unread character */ static int conesc = 0; /* set to 1 if esc char (^\) typed */ static int ttlock(); /* definition of ttlock subprocedure */ static int ttunlck(); /* and unlock subprocedure */ static char ttnmsv[DEVNAMLEN]; /* copy of open path for tthang */ #ifdef aegis static status_$t st; /* error status return value */ static short concrp = 0; /* true if console is CRP pad */ #define CONBUFSIZ 10 static char conbuf[CONBUFSIZ]; /* console readahead buffer */ static int conbufn = 0; /* # chars in readahead buffer */ static char *conbufp; /* next char in readahead buffer */ static uid_$t ttyuid; /* tty type uid */ static uid_$t conuid; /* stdout type uid */ /* APOLLO Aegis main() * establish acl usage and cleanup handling * this makes sure that CRP pads * get restored to a usable mode */ main(argc,argv) int argc; char **argv; { status_$t status; pfm_$cleanup_rec dirty; int pid = getpid(); /* acl usage according to invoking environment */ default_acl(USE_DEFENV); /* establish a cleanup continuation */ status = pfm_$cleanup(dirty); if (status.all != pfm_$cleanup_set) { /* only handle faults for the original process */ if (pid == getpid() && status.all > pgm_$max_severity) { /* blew up in main process */ status_$t quo; pfm_$cleanup_rec clean; /* restore the console in any case */ conres(); /* attempt a clean exit */ debug(F101, "cleanup fault status", "", status.all); /* doexit(), then send status to continuation */ quo = pfm_$cleanup(clean); if (quo.all == pfm_$cleanup_set) doexit(pgm_$program_faulted); else if (quo.all > pgm_$max_severity) pfm_$signal(quo); /* blew up in doexit() */ } /* send to the original continuation */ pfm_$signal(status); /*NOTREACHED*/ } return(ckcmai(argc, argv)); } #endif /* aegis */ /* S Y S I N I T -- System-dependent program initialization. */ sysinit() { /* for now, nothing... */ return(0); } /* S Y S C L E A N U P -- System-dependent program cleanup. */ syscleanup() { /* for now, nothing... */ return(0); } /* T T O P E N -- Open a tty for exclusive access. */ /* Returns 0 on success, -1 on failure. */ /* If called with lcl < 0, sets value of lcl as follows: 0: the terminal named by ttname is the job's controlling terminal. 1: the terminal named by ttname is not the job's controlling terminal. But watch out: if a line is already open, or if requested line can't be opened, then lcl remains (and is returned as) -1. */ ttopen(ttname,lcl,modem) char *ttname; int *lcl, modem; { #ifdef UXIII #ifndef CIE char *ctermid(); /* Wish they all had this! */ #endif /* not cie */ #endif /* uxiii */ #ifdef CIE /* CIE Regulus doesn't... */ #define ctermid(x) strcpy(x,"") #endif char *x; #ifndef MINIX extern char* ttyname(); #endif char cname[DEVNAMLEN+4]; if (ttyfd > -1) return(0); /* If already open, ignore this call */ ttmdm = modem; /* Make this available to other fns */ xlocal = *lcl; /* Make this available to other fns */ #ifdef NEWUUCP acucntrl("disable",ttname); /* Open getty on line (4.3BSD) */ #endif /* newuucp */ #ifdef UXIII /* if modem connection, don't wait for carrier */ ttyfd = open(ttname,O_RDWR | (modem ? O_NDELAY : 0) ); #else ttyfd = open(ttname,2); /* Try to open for read/write */ #endif /* uxiii */ if (ttyfd < 0) { /* If couldn't open, fail. */ perror(ttname); return(-1); } #ifdef aegis /* Apollo C runtime claims that console pads are tty devices, which * is reasonable, but they aren't any good for packet transfer. */ ios_$inq_type_uid((short)ttyfd, ttyuid, st); if (st.all != status_$ok) { fprintf(stderr, "problem getting tty object type: "); error_$print(st); } else if (ttyuid != sio_$uid) { /* reject non-SIO lines */ close(ttyfd); ttyfd = -1; errno = ENOTTY; perror(ttname); return(-1); } #endif /* aegis */ strncpy(ttnmsv,ttname,DEVNAMLEN); /* Open, keep copy of name locally. */ /* Caller wants us to figure out if line is controlling tty */ debug(F111,"ttopen ok",ttname,*lcl); if (*lcl == -1) { if (strcmp(ttname,CTTNAM) == 0) { /* "/dev/tty" always remote */ debug(F110," Same as CTTNAM",ttname,0); xlocal = 0; } else if (isatty(0)) { /* Else, if stdin not redirected */ #ifndef MINIX x = ttyname(0); /* then compare its device name */ strncpy(cname,x,DEVNAMLEN); /* (copy from internal static buf) */ debug(F110," ttyname(0)",x,0); x = ttyname(ttyfd); /* ...with real name of ttname. */ xlocal = (strncmp(x,cname,DEVNAMLEN) == 0) ? 0 : 1; debug(F111," ttyname",x,xlocal); #else xlocal = 1; /* can't do this test in minix */ #endif /* MINIX */ } else { /* Else, if stdin redirected... */ #ifdef UXIII /* Sys III/V provides nice ctermid() function to get name of controlling tty */ ctermid(cname); /* Get name of controlling terminal */ debug(F110," ctermid",cname,0); x = ttyname(ttyfd); /* Compare with name of comm line. */ xlocal = (strncmp(x,cname,DEVNAMLEN) == 0) ? 0 : 1; debug(F111," ttyname",x,xlocal); #else /* Just assume local, so "set speed" and similar commands will work */ /* If not really local, how could it work anyway?... */ xlocal = 1; debug(F101," redirected stdin","",xlocal); #endif /* uxiii */ } } /* Now check if line is locked -- if so fail, else lock for ourselves */ lkf = 0; /* Check lock */ if (xlocal > 0) { if (ttlock(ttname) < 0) { fprintf(stderr,"Exclusive access to %s denied\n",ttname); close(ttyfd); ttyfd = -1; debug(F110," Access denied by lock",ttname,0); return(-1); /* Not if already locked */ } else lkf = 1; } /* Got the line, now set the desired value for local. */ if (*lcl < 0) *lcl = xlocal; /* Some special stuff for v7... */ #ifdef V7 #ifndef MINIX if (kmem[TTY] < 0) { /* If open, then skip this. */ qaddr[TTY] = initrawq(ttyfd); /* Init the queue. */ if ((kmem[TTY] = open("/dev/kmem", 0)) < 0) { fprintf(stderr, "Can't read /dev/kmem in ttopen.\n"); perror("/dev/kmem"); exit(1); } } #endif /* not MINIX */ #endif /* v7 */ /* Request exclusive access on systems that allow it. */ #ifndef XENIX /* Xenix exclusive access prevents open(close(...)) from working... */ #ifdef TIOCEXCL if (ioctl(ttyfd,TIOCEXCL, (char *) NULL) < 0) fprintf(stderr,"Warning, problem getting exclusive access\n"); #endif /* tiocexcl */ #endif /* xenix */ /* Get tty device settings */ #ifndef UXIII tcgetattr(ttyfd,&ttold); /* Get termios info */ #ifdef aegis sio_$control((short)ttyfd, sio_$raw_nl, false, st); if (xlocal) { /* ignore breaks from local line */ sio_$control((short)ttyfd, sio_$int_enable, false, st); sio_$control((short)ttyfd, sio_$quit_enable, false, st); } #endif /* aegis */ tcgetattr(ttyfd,&ttraw); /* And a copy of it for packets*/ tcgetattr(ttyfd,&tttvt); /* And one for virtual tty service */ #else ioctl(ttyfd,TCGETA,&ttold); /* Same deal for Sys III, Sys V */ #ifdef aegis sio_$control((short)ttyfd, sio_$raw_nl, false, st); if (xlocal) { /* ignore breaks from local line */ sio_$control((short)ttyfd, sio_$int_enable, false, st); sio_$control((short)ttyfd, sio_$quit_enable, false, st); } #endif /* aegis */ ioctl(ttyfd,TCGETA,&ttraw); ioctl(ttyfd,TCGETA,&tttvt); #endif /* not uxiii */ #ifdef VXVE ttraw.c_line = 0; /* STTY line 0 for VX/VE */ ioctl(ttyfd,TCSETA,&ttraw); tttvt.c_line = 0; /* STTY line 0 for VX/VE */ ioctl(ttyfd,TCSETA,&tttvt); #endif /* vxve */ debug(F101,"ttopen, ttyfd","",ttyfd); debug(F101," lcl","",*lcl); debug(F111," lock file",flfnam,lkf); return(0); } /* T T C L O S -- Close the TTY, releasing any lock. */ ttclos() { if (ttyfd < 0) return(0); /* Wasn't open. */ if (xlocal) { #ifdef notdef if (tthang()) /* Hang up phone line */ fprintf(stderr,"Warning, problem hanging up the phone\n"); #endif if (ttunlck()) /* Release uucp-style lock */ fprintf(stderr,"Warning, problem releasing lock\n"); } ttold.c_cflag &= ~HUPCL; ttres(); /* Reset modes. */ /* Relinquish exclusive access if we might have had it... */ #ifndef XENIX #ifdef TIOCEXCL #ifdef TIOCNXCL if (ioctl(ttyfd, TIOCNXCL, (char *) NULL) < 0) fprintf(stderr,"Warning, problem relinquishing exclusive access\n"); #endif /* tiocnxcl */ #endif /* tiocexcl */ #endif /* not xenix */ close(ttyfd); /* Close it. */ #ifdef NEWUUCP acucntrl("enable",flfnam); /* Close getty on line. */ #endif /* newuucp */ ttyfd = -1; /* Mark it as closed. */ return(0); } /* T T H A N G -- Hangup phone line */ tthang() { #ifdef UXIII #ifdef HPUX unsigned long dtr_down = 00000000000, modem_rtn; #else unsigned short ttc_save; #endif /* hpux */ #endif /* uxiii */ if (ttyfd < 0) return(0); /* Not open. */ #ifdef aegis sio_$control((short)ttyfd, sio_$dtr, false, st); /* DTR down */ msleep(500); /* pause */ sio_$control((short)ttyfd, sio_$dtr, true, st); /* DTR up */ #else #ifdef ANYBSD ioctl(ttyfd,TIOCCDTR,0); /* Clear DTR */ msleep(500); /* Let things settle */ ioctl(ttyfd,TIOCSDTR,0); /* Restore DTR */ #endif /* anybsd */ #ifdef UXIII #ifdef HPUX /* Hewlett Packard way of modem control */ if (ioctl(ttyfd,MCSETAF,&dtr_down) < 0) return(-1); /* lower DTR */ msleep(500); if (ioctl(ttyfd,MCGETA,&modem_rtn) < 0) return(-1); /* get line status */ if ((modem_rtn & MDCD) != 0) return(-1); /* check if DCD is low */ modem_rtn = MRTS | MDTR; /* bits for RTS & DTR */ if (ioctl(ttyfd,MCSETAF,&modem_rtn) < 0) return(-1); /* set lines */ #else ttc_save = ttraw.c_cflag; ttraw.c_cflag &= ~CBAUD; /* swa: set baud rate to 0 to hangup */ if (ioctl(ttyfd,TCSETAF,&ttraw) < 0) return(-1); /* do it */ msleep(100); /* let things settle */ ttraw.c_cflag = ttc_save; /* NOTE - The following #ifndef...#endif can be removed for SCO Xenix 2.1.3 */ /* or later, but must keep for earlier versions, which can't do close/open. */ #ifndef XENIX /* xenix cannot do close/open when carrier drops */ /* following corrects a PC/IX defficiency */ ttc_save = fcntl(ttyfd,F_GETFL,0); close(ttyfd); /* close/reopen file descriptor */ if ((ttyfd = open(ttnmsv, ttc_save)) < 0) return(-1); #endif /* not xenix */ if (ioctl(ttyfd,TCSETAF,&ttraw) < 0) return(-1); /* un-do it */ #endif /* uxiii */ #endif /* hpux */ #endif /* aegis */ return (0); } /* T T R E S -- Restore terminal to "normal" mode. */ ttres() { /* Restore the tty to normal. */ int x; if (ttyfd < 0) return(-1); /* Not open. */ #ifndef UXIII /* except for sIII, */ sleep(1); /* Wait for pending i/o to finish. */ #endif /* uxiii */ /* (sIII does wait in ioctls) */ #ifdef UXIII if (ioctl(ttyfd,TCSETAW,&ttold) < 0) return(-1); /* restore termio stuff */ if (fcntl(ttyfd,F_SETFL, fcntl(ttyfd, F_GETFL, 0) & ~O_NDELAY) < 0 ) return(-1); #else /* not uxiii */ #ifdef FIONBIO x = 0; x = ioctl(ttyfd,FIONBIO,&x); if (x < 0) { perror("ttres ioctl"); debug(F101,"ttres ioctl","",x); } #else /* not fionbio */ #ifdef FNDELAY x = (fcntl(ttyfd,F_SETFL,fcntl(ttyfd,F_GETFL,0) & ~FNDELAY) == -1); debug(F101,"ttres fcntl","",x); if (x < 0) perror("fcntl"); #endif /* fndelay */ #endif /* fionbio */ x = tcsetattr(ttyfd,TCSANOW,&ttold); /* Restore termios stuff */ debug(F101,"ttres tcsetattr","",x); if (x < 0) perror("tcsetattr"); #endif /* uxiii */ return(x); } /* Exclusive uucp file locking control */ /* by H. Fischer, creative non-Bell coding ! copyright rights for lock modules assigned to Columbia University */ static char * xxlast(s,c) char *s; char c; { /* Equivalent to strrchr() */ int i; for (i = strlen(s); i > 0; i--) if ( s[i-1] == c ) return( s + (i - 1) ); return(NULL); } static look4lk(ttname) char *ttname; { extern char *strcat(), *strcpy(); char *device, *devname; char lockfil[50]; /* Max length for lock file name */ #ifdef MINIX char *lockdir = "/usr/spool/locks"; struct stat stbuf; #else #ifdef ISIII char *lockdir = "/etc/locks"; #else #if ATT3BX char *lockdir = "/usr/spool/locks"; #else #ifdef NEWUUCP char *lockdir = "/usr/spool/uucp/LCK"; #else char *lockdir = "/usr/spool/uucp"; #endif /* newuucp */ #endif /* att3bx | minix */ #endif /* isiii */ #endif /* minix */ device = ( (devname=xxlast(ttname,'/')) != NULL ? devname+1 : ttname); #ifdef MINIX if (stat(ttname, &stbuf) == -1) { fprintf(stderr,"Warning, can't access %s\n", ttname); return( 1 ); /* cannot check or set lock file */ } sprintf(lockfil, "LK.%03d.%03d.%03d", (int) ((stbuf.st_dev >> 8) & 0xFF), (int) ((stbuf.st_rdev >> 8) & 0xFF), (int) ((stbuf.st_rdev >> 0) & 0xFF)); #else #ifdef ISIII (void) strcpy( lockfil, device ); #else strcat( strcpy( lockfil, "LCK.." ), device ); #endif /* isiii */ #endif /* minix */ #ifndef MINIX if (access( lockdir, 04 ) < 0) { /* read access denied on lock dir */ fprintf(stderr,"Warning, read access to lock directory denied\n"); return( 1 ); /* cannot check or set lock file */ } #endif strcat(strcat(strcpy(flfnam,lockdir),"/"), lockfil); debug(F110,"look4lk",flfnam,0); if ( ! stat( flfnam, &stbuf ) ) { /* print out lock file entry */ char lckcmd[40] ; strcat( strcpy(lckcmd, "ls -l ") , flfnam); system(lckcmd); #ifndef MINIX if (access(flfnam,02) == 0) printf("(You may type \"! rm %s\" to remove this file)\n",flfnam); #endif return( -1 ); } #ifndef MINIX if ( access( lockdir, 02 ) < 0 ) { /* lock file cannot be written */ fprintf(stderr,"Warning, write access to lock directory denied\n"); return( 1 ); } #endif return( 0 ); /* okay to go ahead and lock */ } /* T T L O C K */ static ttlock(ttfd) char *ttfd; { /* lock uucp if possible */ #ifndef aegis #ifdef ATT3BX FILE *lck_fild; #endif /* att3bx */ int lck_fil, l4l; int pid_buf = getpid(); /* pid to save in lock file */ hasLock = 0; /* not locked yet */ l4l = look4lk(ttfd); if (l4l < 0) return (-1); /* already locked */ if (l4l == 1) return (0); /* can't read/write lock directory */ lck_fil = creat(flfnam, 0444); /* create lock file ... */ if (lck_fil < 0) return (-1); /* create of lockfile failed */ /* creat leaves file handle open for writing -- hf */ #ifdef ATT3BX fprintf((lck_fild = fdopen(lck_fil, "w")), "%10d\n", pid_buf); fflush(lck_fild); #else write (lck_fil, &pid_buf, sizeof(pid_buf) ); /* uucp expects int in file */ #endif /* att3bx */ close (lck_fil); hasLock = 1; /* now is locked */ #endif /* not aegis */ return(0); } /* T T U N L O C K */ static ttunlck() { /* kill uucp lock if possible */ if (hasLock) return( unlink( flfnam ) ); return(0); } /* New-style (4.3BSD) UUCP line direction control (Stan Barber, Rice U) */ #ifdef NEWUUCP acucntrl(flag,ttname) char *flag, *ttname; { char x[DEVNAMLEN+32], *device, *devname; if (strcmp(ttname,CTTNAM) == 0 || xlocal == 0) /* If not local, */ return; /* just return. */ device = ((devname = xxlast(ttname,'/')) != NULL ? devname+1 : ttname); if (strncmp(device,"LCK..",4) == 0) device += 5; sprintf(x,"/usr/lib/uucp/acucntrl %s %s",flag,device); debug(F000,"called ",x,0); system(x); } #endif /* newuucp */ /* T T P K T -- Condition the communication line for packets. */ /* or for modem dialing */ #define DIALING 4 /* flags (via flow) for modem handling */ #define CONNECT 5 /* If called with speed > -1, also set the speed. */ /* Returns 0 on success, -1 on failure. */ ttpkt(speed,flow,parity) int speed, flow, parity; { int s, x; if (ttyfd < 0) return(-1); /* Not open. */ ttprty = parity; /* Let other tt functions see this. */ debug(F101,"ttpkt setting ttprty","",ttprty); s = ttsspd(speed); /* Check the speed */ #ifndef UXIII if (flow == 1) ttraw.c_iflag |= (IXON|IXOFF); if (flow == 0) ttraw.c_iflag &= ~(IXON|IXOFF); if (flow == DIALING) ttraw.c_cflag |= CLOCAL|HUPCL; if (flow == CONNECT) ttraw.c_cflag &= ~CLOCAL; ttraw.c_lflag &= ~(ICANON|ECHO); ttraw.c_lflag |= ISIG; /* do check for interrupt */ ttraw.c_iflag |= (BRKINT|IGNPAR); ttraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|INPCK|ISTRIP); ttraw.c_oflag &= ~OPOST; ttraw.c_cflag &= ~(CSIZE|PARENB); ttraw.c_cflag |= (CS8|CREAD); ttraw.c_cc[VMIN] = 1; ttraw.c_cc[VTIME] = 0; if (s > -1) { /* Do the speed */ cfsetispeed(&ttraw, s); cfsetospeed(&ttraw, s); } if (tcsetattr(ttyfd,TCSANOW,&ttraw) < 0) return(-1);/* Set the new modes. */ #ifdef MYREAD #ifdef BSD4 /* Try to make reads nonblocking */ #ifdef aegis return(0); #endif /* aegis */ #ifdef FIONBIO x = 1; if (ioctl(ttyfd,FIONBIO,&x) < 0) { perror("ttpkt ioctl"); return(-1); } #else /* fionbio */ #ifdef FNDELAY if (fcntl(ttyfd,F_SETFL,fcntl(ttyfd,F_GETFL,0) | FNDELAY) == -1) { return(-1); } #endif /* fndelay */ #endif /* fionbio */ ttflui(); /* Flush any pending input */ return(0); #endif /* bsd4 */ #ifdef MINIX ttflui(); /* Flush any pending input */ return(0); #endif #else /* myread */ ttflui(); /* Flush any pending input */ return(0); #endif /* myread */ #endif /* not uxiii */ #ifdef UXIII if (flow == 1) ttraw.c_iflag |= (IXON|IXOFF); if (flow == 0) ttraw.c_iflag &= ~(IXON|IXOFF); if (flow == DIALING) ttraw.c_cflag |= CLOCAL|HUPCL; if (flow == CONNECT) ttraw.c_cflag &= ~CLOCAL; ttraw.c_lflag &= ~(ICANON|ECHO); ttraw.c_lflag |= ISIG; /* do check for interrupt */ ttraw.c_iflag |= (BRKINT|IGNPAR); ttraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IUCLC|INPCK|ISTRIP|IXANY); ttraw.c_oflag &= ~OPOST; ttraw.c_cflag &= ~(CSIZE|PARENB); ttraw.c_cflag |= (CS8|CREAD); #ifdef IX370 ttraw.c_cc[4] = 48; /* So Series/1 doesn't interrupt on every char */ ttraw.c_cc[5] = 1; #else #ifdef VXVE ttraw.c_cc[4] = 1; /* [VMIN] for CDC VX/VE */ ttraw.c_cc[5] = 0; /* [VTIME] for CDC VX/VE */ #else #ifdef MYREAD ttraw.c_cc[4] = 200; /* return max of this many characters */ ttraw.c_cc[5] = 1; /* or when this many secs/10 expire w/no input */ #else ttraw.c_cc[4] = 1; /* [VMIN] Maybe should be bigger for all Sys V? */ ttraw.c_cc[5] = 0; /* [VTIME] Should be set high enough to ignore */ /* intercharacter spacing? */ /* But then we have to distinguish between Sys III and Sys V.. */ #endif #endif #endif if (s > -1) { /* set speed */ ttraw.c_cflag &= ~CBAUD; ttraw.c_cflag |= s; } if (ioctl(ttyfd,TCSETAW,&ttraw) < 0) return(-1); /* set new modes . */ if (flow == DIALING) { #ifndef aegis if (fcntl(ttyfd,F_SETFL, fcntl(ttyfd, F_GETFL, 0) & ~O_NDELAY) < 0 ) return(-1); #endif /* not aegis */ close( open(ttnmsv,2) ); /* magic to force mode change!!! */ } ttflui(); return(0); #endif /* uxiii */ } /* T T V T -- Condition communication line for use as virtual terminal */ ttvt(speed,flow) int speed, flow; { int s; if (ttyfd < 0) return(-1); /* Not open. */ s = ttsspd(speed); /* Check the speed */ #ifndef UXIII if (flow == 1) tttvt.c_iflag |= (IXON|IXOFF); if (flow == 0) tttvt.c_iflag &= ~(IXON|IXOFF); if (flow == DIALING) tttvt.c_cflag |= CLOCAL|HUPCL; if (flow == CONNECT) tttvt.c_cflag &= ~CLOCAL; tttvt.c_lflag &= ~(ISIG|ICANON|ECHO); tttvt.c_iflag |= (IGNBRK|IGNPAR); tttvt.c_iflag &= ~(INLCR|IGNCR|ICRNL|BRKINT|INPCK|ISTRIP); tttvt.c_oflag &= ~OPOST; tttvt.c_cflag &= ~(CSIZE|PARENB); tttvt.c_cflag |= (CS8|CREAD); tttvt.c_cc[VMIN] = 1; tttvt.c_cc[VTIME] = 0; if (s > -1) { /* set speed */ cfsetispeed(&tttvt, s); cfsetospeed(&tttvt, s); } if (tcsetattr(ttyfd,TCSANOW,&tttvt) < 0) return(-1); #ifdef MYREAD #ifdef BSD4 /* Make reads nonblocking */ #ifdef aegis return(0); #endif if (fcntl(ttyfd,F_SETFL,fcntl(ttyfd,F_GETFL,0) | FNDELAY) == -1) return(-1); else return(0); #endif /* bsd4 */ #endif /* myread */ #else /* uxiii */ if (flow == 1) tttvt.c_iflag |= (IXON|IXOFF); if (flow == 0) tttvt.c_iflag &= ~(IXON|IXOFF); if (flow == DIALING) tttvt.c_cflag |= CLOCAL|HUPCL; if (flow == CONNECT) tttvt.c_cflag &= ~CLOCAL; tttvt.c_lflag &= ~(ISIG|ICANON|ECHO); tttvt.c_iflag |= (IGNBRK|IGNPAR); tttvt.c_iflag &= ~(INLCR|IGNCR|ICRNL|IUCLC|BRKINT|INPCK|ISTRIP|IXANY); tttvt.c_oflag &= ~OPOST; tttvt.c_cflag &= ~(CSIZE|PARENB); tttvt.c_cflag |= (CS8|CREAD); tttvt.c_cc[4] = 1; tttvt.c_cc[5] = 0; if (s > -1) { /* set speed */ tttvt.c_cflag &= ~CBAUD; tttvt.c_cflag |= s; } if (ioctl(ttyfd,TCSETAW,&tttvt) < 0) return(-1); /* set new modes . */ if (flow == DIALING) { #ifndef aegis if (fcntl(ttyfd,F_SETFL, fcntl(ttyfd, F_GETFL, 0) & ~O_NDELAY) < 0 ) return(-1); #endif close( open(ttnmsv,2) ); /* magic to force mode change!!! */ } #endif return(0); } /* T T S S P D -- Return the internal baud rate code for 'speed'. */ ttsspd(speed) { int s, spdok; if (speed < 0) return(-1); spdok = 1; /* Assume arg ok */ switch (speed) { #ifndef MINIX case 0: s = B0; break; /* Just the common ones. */ #endif case 110: s = B110; break; /* The others from ttydev.h */ #ifndef MINIX case 150: s = B150; break; /* could also be included if */ #endif case 300: s = B300; break; /* necessary... */ #ifndef MINIX case 600: s = B600; break; #endif case 1200: s = B1200; break; #ifndef MINIX case 1800: s = B1800; break; #endif case 2400: s = B2400; break; case 4800: s = B4800; break; case 9600: s = B9600; break; #ifdef MINIX case 19200: s = B19200; break; case 38400: s = B38400; break; case 57600: s = B57600; break; case 115200: s = B115200; break; #endif #ifdef PLEXUS case 19200: s = EXTA; break; #endif #ifdef aegis case 19200: s = EXTA; break; #endif default: spdok = 0; fprintf(stderr,"Unsupported line speed - %d\n",speed); fprintf(stderr,"Current speed not changed\n"); break; } if (spdok) return(s); else return(-1); } /* T T F L U I -- Flush tty input buffer */ ttflui() { #ifndef UXIII long n; #endif if (ttyfd < 0) return(-1); /* Not open. */ ungotn = -1; /* Initialize myread() stuff */ inbufc = 0; #ifdef aegis sio_$control((short)ttyfd, sio_$flush_in, true, st); if (st.all != status_$ok) { fprintf(stderr, "flush failed: "); error_$print(st); } else { /* sometimes the flush doesn't work */ for (;;) { char buf[256]; /* eat all the characters that shouldn't be available */ (void)ios_$get((short)ttyfd, ios_$cond_opt, buf, 256L, st); if (st.all == ios_$get_conditional_failed) break; fprintf(stderr, "flush failed(2): "); error_$print(st); } } #else #ifdef UXIII #ifndef VXVE if (ioctl(ttyfd,TCFLSH,0) < 0) perror("flush failed"); #endif /* vxve */ #else #ifdef TIOCFLUSH #ifdef ANYBSD n = FREAD; /* Specify read queue */ if (ioctl(ttyfd,TIOCFLUSH,&n) < 0) perror("flush failed"); #else if (ioctl(ttyfd,TIOCFLUSH, (char *)NULL) < 0) perror("flush failed"); #endif #endif #endif #endif return(0); } /* Interrupt Functions */ /* Timeout handler for communication line input functions */ timerh() { longjmp(sjbuf,1); } /* Set up terminal interrupts on console terminal */ #ifdef UXIII esctrp() { /* trap console escapes (^\) */ conesc = 1; signal(SIGQUIT,SIG_IGN); /* ignore until trapped */ } #endif #ifdef V7 esctrp() { /* trap console escapes (^\) */ conesc = 1; signal(SIGQUIT,SIG_IGN); /* ignore until trapped */ } #endif #ifdef C70 esctrp() { /* trap console escapes (^\) */ conesc = 1; signal(SIGQUIT,SIG_IGN); /* ignore until trapped */ } #endif /* C O N I N T -- Console Interrupt setter */ conint(f) int (*f)(); { /* Set an interrupt trap. */ int x, y; #ifdef SIGTSTP int stptrap(); /* Suspend trap */ #endif /* Check for background operation, even if not running on real tty, so that */ /* background flag can be set correctly. */ #ifdef BSD4 int mypgrp; /* In BSD, we can check whether */ int ctpgrp; /* this process's group is the */ /* same as the controlling */ mypgrp = getpgrp(0); /* terminal's process group. */ ioctl (1, TIOCGPGRP, &ctpgrp); x = (mypgrp != ctpgrp); /* If they differ, then background. */ debug(F101,"conint process group test","",x); #else x = (signal(SIGINT,SIG_IGN) == SIG_IGN); debug(F101,"conint signal test","",x); #endif y = isatty(0); debug(F101,"conint isatty test","",y); #ifdef BSD29 /* For some reason the signal() test doesn't work under 2.9 BSD... */ backgrd = !y; #else #ifdef MINIX /* Signal test definitely doesn't work on Minix */ backgrd = !y; #else backgrd = (x || !y); #endif #endif debug(F101,"conint backgrd","",backgrd); signal(SIGHUP,f); /* Ensure lockfile cleared on hangup */ signal(SIGTERM,f); /* or soft kill. */ /* check if invoked in background -- if so signals set to be ignored */ if (backgrd) { /* In background, ignore signals */ #ifdef SIGTSTP signal(SIGTSTP,SIG_IGN); /* Keyboard stop */ #endif signal(SIGQUIT,SIG_IGN); /* Keyboard quit */ signal(SIGINT,SIG_IGN); /* Keyboard interrupt */ } else { signal(SIGINT,f); /* Catch terminal interrupt */ #ifdef SIGTSTP signal(SIGTSTP,stptrap); /* Keyboard stop */ #endif #ifdef UXIII signal(SIGQUIT,esctrp); /* Quit signal, Sys III/V. */ if (conesc) conesc = 0; /* Clear out pending escapes */ #else #ifdef V7 signal(SIGQUIT,esctrp); /* V7 like Sys III/V */ if (conesc) conesc = 0; #else #ifdef aegis signal(SIGQUIT,f); /* Apollo, catch it like others. */ #else signal(SIGQUIT,SIG_IGN); /* Others, ignore like 4D & earlier. */ #endif #endif #endif conif = 1; /* Flag console interrupts on. */ } return; } /* C O N N O I -- Reset console terminal interrupts */ connoi() { /* Console-no-interrupts */ #ifdef SIGTSTP signal(SIGTSTP,SIG_DFL); #endif signal(SIGINT,SIG_DFL); signal(SIGHUP,SIG_DFL); signal(SIGQUIT,SIG_DFL); signal(SIGTERM,SIG_DFL); conif = 0; /* Flag interrupt trapping off */ } /* myread() -- For use by systems that can do nonblocking read() calls */ /* Returns: -1 if no characters available, timer expired -2 upon error (such as disconnect), otherwise value of character (0 or greater) */ myread() { static int inbuf_item; static CHAR inbuf[257]; CHAR readit; if (ungotn >= 0) { readit = ungotn; ungotn = -1; } else { if (inbufc > 0) { readit = inbuf[++inbuf_item]; } else { #ifdef aegis /* myread() returns -1 when no input is available. All the users of */ /* myread() explicitly loop until it returns a character or error. */ /* The Apollo code waits for input to be available. */ /* read in characters */ inbufc = ios_$get((short)ttyfd, ios_$cond_opt, inbuf, 256L, st); errno = EIO; if (st.all == ios_$get_conditional_failed) /* get at least one */ inbufc = ios_$get((short)ttyfd, 0, inbuf, 1L, st); if (st.all == ios_$end_of_file) inbufc = 0; else if (st.all != status_$ok) { inbufc = -1; errno = EIO; } #else inbufc = read(ttyfd,inbuf,256); if (inbufc > 0) { inbuf[inbufc] = '\0'; debug(F101,"myread read","",inbufc); } #endif /* aegis */ if (inbufc == 0) { if (ttmdm) { debug(F101,"myread read=0, ttmdm","",ttmdm); errno = 9999; /* magic number for no carrier */ return(-2); /* end of file has no errno */ } else return(-1); /* in sys 5 means no data available */ } if (inbufc < 0) { /* Real error */ #ifdef EWOULDBLOCK if (errno == EWOULDBLOCK) return(-1); else return(-2); #else return(-2); #endif /* ewouldblock */ } readit = inbuf[inbuf_item = 0]; } inbufc--; } return(((int) readit) & 255); } myunrd(ch) CHAR ch; { /* push back up to one character */ ungotn = ch; } /* I N I T R A W Q -- Set up to read /DEV/KMEM for character count. */ #ifdef V7 /* Used in Version 7 to simulate Berkeley's FIONREAD ioctl call. This eliminates blocking on a read, because we can read /dev/kmem to get the number of characters available for raw input. If your system can't or you won't let it read /dev/kmem (the world that is) then you must figure out a different way to do the counting of characters available, or else replace this by a dummy function that always returns 0. */ /* * Call this routine as: initrawq(tty) * where tty is the file descriptor of a terminal. It will return * (as a char *) the kernel-mode memory address of the rawq character * count, which may then be read. It has the side-effect of flushing * input on the terminal. */ /* * John Mackin, Physiology Dept., University of Sydney (Australia) * ...!decvax!mulga!physiol.su.oz!john * * Permission is hereby granted to do anything with this code, as * long as this comment is retained unmodified and no commercial * advantage is gained. */ #ifndef MINIX #include <a.out.h> #include <sys/proc.h> #endif char *initrawq(tty) int tty; { #ifdef MINIX return(0); #else #ifdef UTS24 return(0); #else #ifdef BSD29 return(0); #else long lseek(); static struct nlist nl[] = { {PROCNAME}, {NPROCNAME}, {""} }; static struct proc *pp; char *malloc(), *qaddr, *p, c; int m, pid, me; NPTYPE xproc; /* Its type is defined in makefile. */ int catch(); me = getpid(); if ((m = open("/dev/kmem", 0)) < 0) err("kmem"); nlist(BOOTNAME, nl); if (nl[0].n_type == 0) err("proc array"); if (nl[1].n_type == 0) err("nproc"); lseek(m, (long)(nl[1].n_value), 0); read (m, &xproc, sizeof(xproc)); signal(SIGALRM, catch); if ((pid = fork()) == 0) { while(1) read(tty, &c, 1); } alarm(2); if(setjmp(jjbuf) == 0) { while(1) read(tty, &c, 1); } signal(SIGALRM, SIG_DFL); #ifdef DIRECT pp = (struct proc *) nl[0].n_value; #else if (lseek(m, (long)(nl[0].n_value), 0) < 0L) err("seek"); if (read(m, &pp, sizeof(pp)) != sizeof(pp)) err("no read of proc ptr"); #endif lseek(m, (long)(nl[1].n_value), 0); read(m, &xproc, sizeof(xproc)); if (lseek(m, (long)pp, 0) < 0L) err("Can't seek to proc"); if ((p = malloc(xproc * sizeof(struct proc))) == NULL) err("malloc"); if (read(m,p,xproc * sizeof(struct proc)) != xproc*sizeof(struct proc)) err("read proc table"); for (pp = (struct proc *)p; xproc > 0; --xproc, ++pp) { if (pp -> p_pid == (short) pid) goto iout; } err("no such proc"); iout: close(m); qaddr = (char *)(pp -> p_wchan); free (p); kill(pid, SIGKILL); wait((int *)0); /* Destroy the ZOMBIEs! */ return (qaddr); #endif #endif #endif } /* More V7-support functions... */ static err(s) char *s; { char buf[200]; sprintf(buf, "fatal error in initrawq: %s", s); perror(buf); doexit(1); } static catch() { longjmp(jjbuf, -1); } /* G E N B R K -- Simulate a modem break. */ #ifndef MINIX #define BSPEED B150 genbrk(fn) int fn; { struct sgttyb ttbuf; int ret, sospeed; ret = ioctl(fn, TIOCGETP, &ttbuf); sospeed = ttbuf.sg_ospeed; ttbuf.sg_ospeed = BSPEED; ret = ioctl(fn, TIOCSETP, &ttbuf); ret = write(fn, "\0\0\0\0\0\0\0\0\0\0\0\0", 8); ttbuf.sg_ospeed = sospeed; ret = ioctl(fn, TIOCSETP, &ttbuf); ret = write(fn, "@", 1); return; } #endif #endif /* T T C H K -- Tell how many characters are waiting in tty input buffer */ ttchk() { int x; long n; #ifdef FIONREAD x = ioctl(ttyfd, FIONREAD, &n); /* Berkeley and maybe some others */ debug(F101,"ttchk","",n); return((x < 0) ? 0 : n); #else #ifdef V7 #ifdef MINIX return(0); #else lseek(kmem[TTY], (long) qaddr[TTY], 0); /* 7th Edition Unix */ x = read(kmem[TTY], &n, sizeof(int)); return((x == sizeof(int))? n: 0); #endif #else #ifdef UXIII return(inbufc + (ungotn >= 0) ); /* Sys III, Sys V */ #else #ifdef PROVX1 x = ioctl(ttyfd, TIOCQCNT, &ttbuf); /* Pro/3xx Venix V.1 */ n = ttbuf.sg_ispeed & 0377; return((x < 0) ? 0 : n); #else #ifdef aegis return(inbufc + (ungotn >= 0) ); /* Apollo Aegis */ #else #ifdef C70 return(inbufc + (ungotn >= 0) ); /* etc... */ #else return(0); #endif #endif #endif #endif #endif #endif } /* T T X I N -- Get n characters from tty input buffer */ /* Returns number of characters actually gotten, or -1 on failure */ /* Intended for use only when it is known that n characters are actually */ /* Available in the input buffer. */ ttxin(n,buf) int n; char *buf; { int x; #ifdef MYREAD for( x = 0; (x > -1) && (x < n); buf[x++] = myread() ); #else debug(F101,"ttxin: n","",n); x = read(ttyfd,buf,n); debug(F101," x","",x); #endif if (x > 0) buf[x] = '\0'; if (x < 0) x = -1; return(x); } /* T T O L -- Similar to "ttinl", but for writing. */ ttol(s,n) int n; char *s; { int x; if (ttyfd < 0) return(-1); /* Not open. */ x = write(ttyfd,s,n); debug(F111,"ttol",s,n); if (x < 0) debug(F101,"ttol failed","",x); return(x); } /* T T O C -- Output a character to the communication line */ ttoc(c) char c; { if (ttyfd < 0) return(-1); /* Not open. */ return(write(ttyfd,&c,1)); } /* T T I N L -- Read a record (up to break character) from comm line. */ /* If no break character encountered within "max", return "max" characters, with disposition of any remaining characters undefined. Otherwise, return the characters that were read, including the break character, in "dest" and the number of characters read as the value of the function, or 0 upon end of file, or -1 if an error occurred. Times out & returns error if not completed within "timo" seconds. */ #define CTRLC '\03' ttinl(dest,max,timo,eol) int max,timo; CHAR *dest, eol; { int x = 0, ccn = 0, c, i, j, m, n; /* local variables */ if (ttyfd < 0) return(-1); /* Not open. */ m = (ttprty) ? 0177 : 0377; /* Parity stripping mask. */ *dest = '\0'; /* Clear destination buffer */ if (timo) signal(SIGALRM,timerh); /* Enable timer interrupt */ alarm(timo); /* Set it. */ if (setjmp(sjbuf)) { /* Timer went off? */ x = -1; } else { i = 0; /* Next char to process */ j = 0; /* Buffer position */ while (1) { if ((n = ttchk()) > 0) { /* See how many chars have arrived */ if (n > (max - j)) n = max - j; if ((n = ttxin(n,dest+i)) < 0) { /* Get them all at once */ x = -1; break; } } else { /* Or else... */ n = 1; /* just wait for a char */ if ((c = ttinc(0)) == -1) { x = -1; break; } dest[i] = c; /* Got one. */ } j = i + n; /* Remember next buffer position. */ if (j >= max) { debug(F101,"ttinl buffer overflow","",j); x = -1; break; } for (i; i < j; i++) { /* Go thru all chars we just got */ dest[i] &= m; /* Strip any parity */ if (dest[i] == eol) { /* Got eol? */ dest[++i] = '\0'; /* Yes, tie off string, */ alarm(0); /* turn off timers, etc, */ if (timo) signal(SIGALRM,SIG_DFL); /* and return length. */ return(i); } else if ((dest[i] & 0177) == CTRLC) { /* Check for ^C^C */ if (++ccn > 1) { /* If we got 2 in a row, clean up */ alarm(0); /* and exit. */ signal(SIGALRM,SIG_DFL); fprintf(stderr,"^C..."); ttres(); fprintf(stderr,"\n"); return(-2); } } else ccn = 0; /* Not ^C, so reset ^C counter, */ } } } debug(F100,"ttinl timout","",0); /* Get here on timeout. */ debug(F111," with",dest,i); alarm(0); /* Turn off timer */ signal(SIGALRM,SIG_DFL); /* and interrupt, */ return(x); /* and return error code. */ } /* T T I N C -- Read a character from the communication line */ ttinc(timo) int timo; { int m, n = 0; CHAR ch = 0; m = (ttprty) ? 0177 : 0377; /* Parity stripping mask. */ if (ttyfd < 0) return(-1); /* Not open. */ if (timo <= 0) { /* Untimed. */ #ifdef MYREAD /* comm line failure returns -1 thru myread, so no &= 0377 */ while ((n = myread()) == -1) ; /* Wait for a character... */ if (n == -2) n++; return( (n < 0) ? -1 : n & m ); #else while ((n = read(ttyfd,&ch,1)) == 0) ; /* Wait for a character. */ return( (n < 0) ? -1 : (ch & 0377) ); #endif } signal(SIGALRM,timerh); /* Timed, set up timer. */ alarm(timo); if (setjmp(sjbuf)) { n = -1; } else { #ifdef MYREAD while ((n = myread()) == -1) ; /* If managing own buffer... */ if (n == -2) { n++; } else { ch = n; n = 1; } #else n = read(ttyfd,&ch,1); /* Otherwise call the system. */ #endif } alarm(0); /* Turn off timer, */ signal(SIGALRM,SIG_DFL); /* and interrupt. */ return( (n < 0) ? -1 : (ch & m) ); /* Return char or -1. */ } /* T T S N D B -- Send a BREAK signal */ ttsndb() { int x; long n; char spd; if (ttyfd < 0) return(-1); /* Not open. */ #ifdef PROVX1 gtty(ttyfd,&ttbuf); /* Get current tty flags */ spd = ttbuf.sg_ospeed; /* Save speed */ ttbuf.sg_ospeed = B50; /* Change to 50 baud */ stty(ttyfd,&ttbuf); /* ... */ write(ttyfd,brnuls,3); /* Send 3 nulls */ ttbuf.sg_ospeed = spd; /* Restore speed */ stty(ttyfd,&ttbuf); /* ... */ return(0); #else #ifdef aegis sio_$control((short)ttyfd, sio_$send_break, 250, st); return(0); #else #ifdef UXIII if (ioctl(ttyfd,TCSBRK,(char *)0) < 0) { /* Send a BREAK */ perror("Can't send BREAK"); return(-1); } return(0); #else #ifdef ANYBSD n = FWRITE; /* Flush output queue. */ ioctl(ttyfd,TIOCFLUSH,&n); /* Ignore any errors.. */ if (ioctl(ttyfd,TIOCSBRK,(char *)0) < 0) { /* Turn on BREAK */ perror("Can't send BREAK"); return(-1); } x = msleep(275); /* Sleep for so many milliseconds */ if (ioctl(ttyfd,TIOCCBRK,(char *)0) < 0) { /* Turn off BREAK */ perror("BREAK stuck!!!"); doexit(1); /* Get out, closing the line. */ /* with exit status = 1 */ } return(x); #else #ifdef MINIX tcsendbreak(ttyfd, 0); #else #ifdef V7 genbrk(ttyfd); /* Simulate a BREAK */ return(x); #endif #endif #endif #endif #endif #endif } /* M S L E E P -- Millisecond version of sleep(). */ /* Intended only for small intervals. For big ones, just use sleep(). */ msleep(m) int m; { #ifdef aegis time_$clock_t dur; dur.c2.high16 = 0; dur.c2.low32 = 250 * m; /* one millisecond = 250 four microsecond ticks */ time_$wait(time_$relative, dur, st); return(0); #else #ifdef PROVX1 if (m <= 0) return(0); sleep(-((m * 60 + 500) / 1000)); return(0); #endif #ifdef ANYBSD int t1, t3, t4; if (m <= 0) return(0); #ifndef BSD42 /* 2.9 and 4.1 BSD do it this way */ if (ftime(&ftp) < 0) return(-1); /* Get current time. */ t1 = ((ftp.time & 0xff) * 1000) + ftp.millitm; while (1) { ftime(&ftp); /* new time */ t3 = (((ftp.time & 0xff) * 1000) + ftp.millitm) - t1; if (t3 > m) return(t3); } #else /* 4.2 & above can do it with select()... */ if (gettimeofday(&tv, &tz) < 0) return(-1); /* Get current time. */ t1 = tv.tv_sec; /* Seconds */ tv.tv_sec = 0; /* Use select() */ tv.tv_usec = m * 1000; return(select( 0, (int *)0, (int *)0, (int *)0, &tv) ); #endif #endif /* The clock-tick business is a pain. Wm. E. Davidsen suggested: */ /* #include <sys/param.h> */ /* #define CLOCK_TICK 1000/HZ */ /* But I don't see the symbol HZ in this file on my VAX. */ /* Maybe just for XENIX. */ #ifdef UXIII #ifdef XENIX /* Actually, watch out. It's 50 on the AT, 20 on older PCs... */ #define CLOCK_TICK 50 /* millisecs per clock tick */ #else #ifndef XENIX #define CLOCK_TICK 17 /* 1/60 sec */ #endif #endif extern long times(); long t1, t2, tarray[4]; int t3; /* In SCO Xenix 2.1.3 or later, you can use nap((long)m) to do this. */ if (m <= 0) return(0); if ((t1 = times(tarray)) < 0) return(-1); while (1) { if ((t2 = times(tarray)) < 0) return(-1); t3 = ((int)(t2 - t1)) * CLOCK_TICK; if (t3 > m) return(t3); } #endif #ifdef TOWER1 int t1, t3; if (m <= 0) return(0); if (ftime(&ftp) < 0) return(-1); /* Get current time. */ t1 = ((ftp.time & 0xff) * 1000) + ftp.millitm; while (1) { ftime(&ftp); /* new time */ t3 = (((ftp.time & 0xff) * 1000) + ftp.millitm) - t1; if (t3 > m) return (t3); } #endif #endif } /* R T I M E R -- Reset elapsed time counter */ rtimer() { tcount = time( (long *) 0 ); } /* G T I M E R -- Get current value of elapsed time counter in seconds */ gtimer() { int x; x = (int) (time( (long *) 0 ) - tcount); rtimer(); return( (x < 0) ? 0 : x ); } /* Z T I M E -- Return date/time string */ ztime(s) char **s; { #ifdef UXIII extern long time(); /* Sys III/V way to do it */ char *ctime(); long clock_storage; clock_storage = time( (long *) 0 ); *s = ctime( &clock_storage ); #endif #ifdef PROVX1 int utime[2]; /* Venix way */ time(utime); *s = ctime(utime); #endif #ifdef ANYBSD char *asctime(); /* Berkeley way */ struct tm *localtime(); struct tm *tp; #ifdef BSD42 gettimeofday(&tv, &tz); /* BSD 4.2 */ time(&tv.tv_sec); tp = localtime(&tv.tv_sec); #else time(&clock); /* BSD 4.1, 2.9 ... ceb */ tp = localtime(&clock); #endif *s = asctime(tp); #endif #ifdef TOWER1 char *asctime(); /* Tower way */ struct tm *localtime(); struct tm *tp; time(&clock); tp = localtime(&clock); *s = asctime(tp); #endif #ifdef V7 #ifdef MINIX int utime[2]; /* Venix way */ time(utime); *s = ctime(utime); #else char *asctime(); /* V7 way */ struct tm *localtime(); struct tm *tp; time(&clock); tp = localtime(&clock); *s = asctime(tp); #endif #endif } /* C O N G M -- Get console terminal modes. */ /* Saves current console mode, and establishes variables for switching between current (presumably normal) mode and other modes. */ congm() { if (!isatty(0)) return(0); /* only for real ttys */ #ifdef aegis ios_$inq_type_uid(ios_$stdin, conuid, st); if (st.all != status_$ok) { fprintf(stderr, "problem getting stdin objtype: "); error_$print(st); } concrp = (conuid == mbx_$uid); conbufn = 0; #endif #ifndef UXIII tcgetattr(0,&ccold); /* Structure for restoring */ tcgetattr(0,&cccbrk); /* For setting CBREAK mode */ tcgetattr(0,&ccraw); /* For setting RAW mode */ #else ioctl(0,TCGETA,&ccold); ioctl(0,TCGETA,&cccbrk); ioctl(0,TCGETA,&ccraw); #endif #ifdef VXVE cccbrk.c_line = 0; /* STTY line 0 for CDC VX/VE */ ioctl(0,TCSETA,&cccbrk); ccraw.c_line = 0; /* STTY line 0 for CDC VX/VE */ ioctl(0,TCSETA,&ccraw); #endif /* vxve */ cgmf = 1; /* Flag that we got them. */ return(0); } /* C O N C B -- Put console in cbreak mode. */ /* Returns 0 if ok, -1 if not */ concb(esc) char esc; { int x; if (!isatty(0)) return(0); /* only for real ttys */ if (cgmf == 0) congm(); /* Get modes if necessary. */ escchr = esc; /* Make this available to other fns */ ckxech = 1; /* Program can echo characters */ #ifdef aegis conbufn = 0; if (concrp) return(write(1, "\035\002", 2)); if (conuid == input_pad_$uid) {pad_$raw(ios_$stdin, st); return(0);} #endif #ifndef UXIII cccbrk.c_lflag &= ~(ICANON|ECHO); cccbrk.c_cc[VINTR] = 003; /* interrupt char is control-c */ cccbrk.c_cc[VQUIT] = escchr; /* escape during packet modes */ cccbrk.c_cc[VMIN] = 1; cccbrk.c_cc[VTIME] = 1; x = tcsetattr(0,TCSANOW,&cccbrk); #else cccbrk.c_lflag &= ~(ICANON|ECHO); cccbrk.c_cc[0] = 003; /* interrupt char is control-c */ cccbrk.c_cc[1] = escchr; /* escape during packet modes */ cccbrk.c_cc[4] = 1; #ifdef ZILOG cccbrk.c_cc[5] = 0; #else cccbrk.c_cc[5] = 1; #endif /* zilog */ x = ioctl(0,TCSETAW,&cccbrk); /* set new modes . */ #endif #ifndef aegis if (x > -1) setbuf(stdout,(char *) NULL); /* Make console unbuffered. */ #endif #ifdef V7 #ifndef MINIX if (kmem[CON] < 0) { qaddr[CON] = initrawq(0); if((kmem[CON] = open("/dev/kmem", 0)) < 0) { fprintf(stderr, "Can't read /dev/kmem in concb.\n"); perror("/dev/kmem"); exit(1); } } #endif #endif return(x); } /* C O N B I N -- Put console in binary mode */ /* Returns 0 if ok, -1 if not */ conbin(esc) char esc; { if (!isatty(0)) return(0); /* only for real ttys */ if (cgmf == 0) congm(); /* Get modes if necessary. */ escchr = esc; /* Make this available to other fns */ ckxech = 1; /* Program can echo characters */ #ifdef aegis conbufn = 0; if (concrp) return(write(1, "\035\002", 2)); if (conuid == input_pad_$uid) {pad_$raw(ios_$stdin, st); return(0);} #endif #ifndef UXIII ccraw.c_lflag &= ~(ISIG|ICANON|ECHO); ccraw.c_iflag |= (BRKINT|IGNPAR); ccraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IXON|IXOFF|INPCK|ISTRIP); ccraw.c_oflag &= ~OPOST; ccraw.c_cc[VMIN] = 1; ccraw.c_cc[VTIME] = 1; return(tcsetattr(0,TCSANOW,&ccraw)); #else ccraw.c_lflag &= ~(ISIG|ICANON|ECHO); ccraw.c_iflag |= (BRKINT|IGNPAR); ccraw.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IUCLC|IXON|IXANY|IXOFF |INPCK|ISTRIP); ccraw.c_oflag &= ~OPOST; /*** Kermit used to put the console in 8-bit raw mode, but some users have *** pointed out that this should not be done, since some sites actually *** use terminals with parity settings on their Unix systems, and if we *** override the current settings and stop doing parity, then their terminals *** will display blotches for characters whose parity is wrong. Therefore, *** the following two lines are commented out (Larry Afrin, Clemson U): *** *** ccraw.c_cflag &= ~(PARENB|CSIZE); *** ccraw.c_cflag |= (CS8|CREAD); *** *** Sys III/V sites that have trouble with this can restore these lines. ***/ ccraw.c_cc[4] = 1; ccraw.c_cc[5] = 1; return(ioctl(0,TCSETAW,&ccraw) ); /* set new modes . */ #endif } /* C O N R E S -- Restore the console terminal */ conres() { if (cgmf == 0) return(0); /* Don't do anything if modes */ if (!isatty(0)) return(0); /* only for real ttys */ #ifndef UXIII /* except for sIII, */ sleep(1); /* not known! */ #endif /* (sIII does wait in ioctls) */ ckxech = 0; /* System should echo chars */ #ifdef aegis conbufn = 0; if (concrp) return(write(1, "\035\001", 2)); if (conuid == input_pad_$uid) {pad_$cooked(ios_$stdin, st); return(0);} #endif #ifndef UXIII return(tcsetattr(0,TCSANOW,&ccold)); /* Restore controlling tty */ #else return(ioctl(0,TCSETAW,&ccold)); #endif } /* C O N O C -- Output a character to the console terminal */ conoc(c) char c; { write(1,&c,1); } /* C O N X O -- Write x characters to the console terminal */ conxo(x,s) char *s; int x; { write(1,s,x); } /* C O N O L -- Write a line to the console terminal */ conol(s) char *s; { int len; len = strlen(s); write(1,s,len); } /* C O N O L A -- Write an array of lines to the console terminal */ conola(s) char *s[]; { int i; for (i=0 ; *s[i] ; i++) conol(s[i]); } /* C O N O L L -- Output a string followed by CRLF */ conoll(s) char *s; { conol(s); write(1,"\r\n",2); } /* C O N C H K -- Return how many characters available at console */ conchk() { int x; long n; #ifdef PROVX1 x = ioctl(0, TIOCQCNT, &ttbuf); n = ttbuf.sg_ispeed & 0377; return((x < 0) ? 0 : n); #else #ifdef aegis if (conbufn > 0) return(conbufn); /* use old count if nonzero */ /* read in more characters */ conbufn = ios_$get(ios_$stdin, ios_$cond_opt, conbuf, (long)sizeof(conbuf), st); if (st.all != status_$ok) conbufn = 0; conbufp = conbuf; return(conbufn); #else #ifdef V7 #ifdef MINIX if (conesc) { /* Escape typed */ conesc = 0; signal(SIGQUIT,esctrp); /* Restore escape */ return(1); } return(0); #else lseek(kmem[CON], (long) qaddr[CON], 0); x = read(kmem[CON], &n, sizeof(int)); return((x == sizeof(int))? n: 0); #endif #else #ifdef UXIII if (conesc) { /* Escape typed */ conesc = 0; signal(SIGQUIT,esctrp); /* Restore escape */ return(1); } return(0); #else #ifdef C70 if (conesc) { /* Escape typed */ conesc = 0; signal(SIGQUIT,esctrp); /* Restore escape */ return(1); } return(0); #else #ifdef FIONREAD x = ioctl(0, FIONREAD, &n); /* BSD and maybe some others */ return((x < 0) ? 0 : n); #else return(0); /* Others can't do. */ #endif #endif #endif #endif #endif #endif } /* C O N I N C -- Get a character from the console */ coninc(timo) int timo; { int n = 0; char ch; #ifdef aegis fflush(stdout); if (conchk() > 0) { --conbufn; return(*conbufp++ & 0377); } #endif if (timo <= 0 ) { /* untimed */ n = read(0, &ch, 1); /* Read a character. */ ch &= 0377; if (n > 0) return(ch); /* Return the char if read */ else #ifdef UXIII #ifndef CIE /* CIE Regulus has no such symbol */ if (n < 0 && errno == EINTR) /* if read was interrupted by QUIT */ return(escchr); /* user entered escape character */ else /* couldnt be ^c, sigint never returns */ #endif #endif return(-1); /* Return the char, or -1. */ } signal(SIGALRM,timerh); /* Timed read, so set up timer */ alarm(timo); if (setjmp(sjbuf)) n = -2; else { n = read(0, &ch, 1); ch &= 0377; } alarm(0); /* Stop timing, we got our character */ signal(SIGALRM,SIG_DFL); if (n > 0) return(ch); else #ifdef UXIII #ifndef CIE /* CIE Regulus has no such symbol */ if (n == -1 && errno == EINTR) /* If read interrupted by QUIT, */ return(escchr); /* user entered escape character, */ else /* can't be ^c, sigint never returns */ #endif #endif return(-1); } #ifdef ATT7300 #include <sys/phone.h> #include <dial.h> #define ATT7300 4 /* REH */ CALL tcfig; struct termio ctermio = {0}; struct updata ph; static int att7300 = 0; /* REH */ /* A T T D I A L -- Dial up the remote system */ /* Purpose: to open and dial a number on the internal modem available on the * ATT7300 UNIX PC. Richard E. Hill, Dickinson, TX. */ attdial(ttname,speed,telnbr) char *ttname,*telnbr; int speed; { int err; if (ttyfd > 0) { ioctl(ttyfd,TCGETA,&ctermio); /* save current settings */ err=ttclos(); /* close port */ } else ioctl(0,TCGETA,&ctermio); /* get standard settings */ /* Open line, check availability & data mode, turn on speaker, close port. */ ttyfd = open (ttname,O_RDWR | O_NDELAY); if (err=ioctl(ttyfd,PIOCOFFHOOK,&ph)) { printf("Phone line for %s not available:%d %d %d\n", ttname,ttyfd,err,errno); close(ttyfd); ttyfd = -1; return(-1); } ioctl(ttyfd,PIOCGETP,&ph); /* set phone parameters */ if (ph.c_lineparam & VOICE) { printf("Phone line %s not in data mode. Switch to data & redial\n", ttname); ioctl(ttyfd,PIOCDISC,&ph); close(ttyfd); ttyfd = -1; return(-1); } ph.c_feedback |= (SPEAKERON | RINGON | NORMSPK); ioctl(ttyfd,PIOCSETP,&ph); /* set phone parameters */ ioctl(ttyfd,PIOCDISC,&ph); /* release phone resources for dial */ close(ttyfd); /* fprintf(stderr,"Phone line status. line_par:%o dialtone_wait:%o \ line_status:%o feedback:%o\n", ph.c_lineparam, ph.c_waitdialtone, ph.c_linestatus,ph.c_feedback); */ /* Close line so that it can be reopened using system routine "dial". */ /* Set terminal configuration parameters. */ ctermio.c_iflag |= (BRKINT|IGNPAR|IXON|IXOFF); ctermio.c_iflag &= ~(IGNBRK|INLCR|IGNCR|ICRNL|IUCLC|INPCK|ISTRIP| IXANY); ctermio.c_oflag &= ~OPOST; ctermio.c_cflag = (B1200 | CS8 | CREAD | CLOCAL | HUPCL); ctermio.c_lflag &= ~(ICANON|ECHO); ctermio.c_cc[4] = 1; ctermio.c_cc[5] = 0; tcfig.attr = &ctermio; tcfig.baud = speed <= 1200 ? speed : 1200; tcfig.speed = speed <= 300 ? 300 : 1200; tcfig.line = ttname; tcfig.telno = telnbr; tcfig.modem = 0; fprintf (stderr,"dialing:%s on line:%s at %d baud, speed:%d\n", tcfig.telno,tcfig.line,tcfig.baud,tcfig.speed); if ((ttyfd = dial(tcfig)) > 0) { att7300 = 1; /* ioctl(ttyfd,TCGETA,&ctermio); fprintf(stderr,"after dial:iflag:%o, oflag:%o, cflag:%o, lflag:%o,\ line:%o\n", ctermio.c_iflag,ctermio.c_oflag,ctermio.c_cflag, ctermio.c_lflag, ctermio.c_line); */ return(0); } printf("Sorry, connection not made. Error status: %d\n",ttyfd); return(-2); } #endif /* ATT7300 */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* C K U U S 2 -- "User Interface" STRINGS module for Unix Kermit */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* This module separates long strings from the body of the ckuser module. */ #include "ckcdeb.h" #include <stdio.h> #include <ctype.h> #include "ckcker.h" #include "ckucmd.h" #include "ckuusr.h" extern CHAR mystch, stchr, eol, seol, padch, mypadc, ctlq; extern CHAR data[], *rdatap, ttname[]; extern char cmdbuf[], line[], debfil[], pktfil[], sesfil[], trafil[]; extern int nrmt, nprm, dfloc, deblog, seslog, speed, local, parity, duplex; extern int turn, turnch, pktlog, tralog, mdmtyp, flow, cmask, timef, spsizf; extern int rtimo, timint, npad, mypadn, bctr, delay; extern int maxtry, spsiz, urpsiz, maxsps, maxrps, ebqflg, ebq; extern int rptflg, rptq, fncnv, binary, pktlog, warn, quiet, fmask, keep; extern int tsecs, bctu, len, atcapu, lpcapu, swcapu, wsize, sq, rpsiz; extern int capas; extern long filcnt, tfc, tlci, tlco, ffc, flci, flco; extern char *dftty, *versio, *ckxsys; extern struct keytab prmtab[]; extern struct keytab remcmd[]; #ifndef MINIX static char *hlp1[] = { "\n", " Usage: kermit [-x arg [-x arg]...[-yyy]..]]\n", " x is an option that requires an argument, y an option with no argument:\n", " actions (* options also require -l and -b) --\n", " -s file(s) send (use '-s -' to send from stdin)\n", " -r receive\n", " -k receive to stdout\n", " * -g file(s) get remote file(s) from server (quote wildcards)\n", " -a name alternate name, used with -s, -r, -g\n", " -x enter server mode\n", " * -f finish remote server\n", " * -c connect before transaction\n", " * -n connect after transaction\n", " settings --\n", " -l line communication line device\n", " -b baud line speed, e.g. 1200\n", " -i binary file or Unix-to-Unix (text by default)\n", " -p x parity, x is one of e,o,m,s,n\n", " -t line turnaround handshake = xon, half duplex\n", " -w don't write over preexisting files\n", " -q be quiet during file transfer\n", " -d log debugging info to debug.log\n", " -e length (extended) receive packet length\n", " If no action command is included, enter interactive dialog.\n", "" }; /* U S A G E */ usage() { conola(hlp1); } #else /* MINIX */ usage () {} #endif /* MINIX */ /* Help string definitions */ #ifndef MINIX static char *tophlp[] = { "\n\ Type ? for a list of commands, type 'help x' for any command x.\n\ While typing commands, use the following special characters:\n\n\ DEL, RUBOUT, BACKSPACE, CTRL-H: Delete the most recent character typed.\n\ CTRL-W: Delete the most recent word typed.\n", "\ CTRL-U: Delete the current line.\n\ CTRL-R: Redisplay the current line.\n\ ? (question mark) display help on the current command or field.\n\ ESC (Escape or Altmode) Attempt to complete the current field.\n", "\ \\ (backslash) include the following character literally.\n\n\ From system level, type 'kermit -h' to get help about command line args.\ \n", "" }; static char *hmxxbye = "\ Shut down and log out a remote Kermit server"; static char *hmxxclo = "\ Close one of the following logs:\n\ session, transaction, packet, debugging -- 'help log' for further info."; static char *hmxxcon = "\ Connect to a remote system via the tty device given in the\n\ most recent 'set line' command"; static char *hmxxget = "\ Format: 'get filespec'. Tell the remote Kermit server to send the named\n\ files. If filespec is omitted, then you are prompted for the remote and\n\ local filenames separately."; static char *hmxxlg[] = { "\ Record information in a log file:\n\n\ debugging Debugging information, to help track down\n\ (default debug.log) bugs in the C-Kermit program.\n\n\ packets Kermit packets, to help track down protocol problems.\n\ (packet.log)\n\n", " session Terminal session, during CONNECT command.\n\ (session.log)\n\n\ transactions Names and statistics about files transferred.\n\ (transact.log)\n", "" } ; static char *hmxxlogi[] = { "\ Syntax: script text\n\n", "Login to a remote system using the text provided. The login script\n", "is intended to operate similarly to uucp \"L.sys\" entries.\n", "A login script is a sequence of the form:\n\n", " expect send [expect send] . . .\n\n", "where 'expect' is a prompt or message to be issued by the remote site, and\n", "'send' is the names, numbers, etc, to return. The send may also be the\n", "keyword EOT, to send control-d, or BREAK, to send a break. Letters in\n", "send may be prefixed by ~ to send special characters. These are:\n", "~b backspace, ~s space, ~q '?', ~n linefeed, ~r return, ~c don\'t\n", "append a return, and ~o[o[o]] for octal of a character. As with some \n", "uucp systems, sent strings are followed by ~r unless they end with ~c.\n\n", "Only the last 7 characters in each expect are matched. A null expect,\n", "e.g. ~0 or two adjacent dashes, causes a short delay. If you expect\n", "that a sequence might not arrive, as with uucp, conditional sequences\n", "may be expressed in the form:\n\n", " -send-expect[-send-expect[...]]\n\n", "where dashed sequences are followed as long as previous expects fail.\n", "" }; static char *hmxxrc[] = { "\ Format: 'receive [filespec]'. Wait for a file to arrive from the other\n\ Kermit, which must be given a 'send' command. If the optional filespec is\n", "given, the (first) incoming file will be stored under that name, otherwise\n\ it will be stored under the name it arrives with.", "" } ; static char *hmxxsen = "\ Format: 'send file1 [file2]'. File1 may contain wildcard characters '*' or\n\ '?'. If no wildcards, then file2 may be used to specify the name file1 is\n\ sent under; if file2 is omitted, file1 is sent under its own name."; static char *hmxxser = "\ Enter server mode on the currently selected line. All further commands\n\ will be taken in packet form from the other Kermit program."; static char *hmhset[] = { "\ The 'set' command is used to establish various communication or file\n", "parameters. The 'show' command can be used to display the values of\n", "'set' parameters. Help is available for each individual parameter;\n", "type 'help set ?' to see what's available.\n", "" } ; static char *hmxychkt[] = { "\ Type of packet block check to be used for error detection, 1, 2, or 3.\n", "Type 1 is standard, and catches most errors. Types 2 and 3 specify more\n", "rigorous checking at the cost of higher overhead. Not all Kermit programs\n", "support types 2 and 3.\n", "" } ; static char *hmxyf[] = { "\set file: names, type, warning, display.\n\n", "'names' are normally 'converted', which means file names are converted\n", "to 'common form' during transmission; 'literal' means use filenames\n", "literally (useful between like systems).\n\n", "'type' is normally 'text', in which conversion is done between Unix\n", "newlines and CRLF line delimiters; 'binary' means to do no conversion.\n", "Use 'binary' for executable programs or binary data.\n\n", "'warning' is 'on' or 'off', normally off. When off, incoming files will\n", "overwrite existing files of the same name. When on, new names will be\n", "given to incoming files whose names are the same as existing files.\n", "\n\ 'display' is normally 'on', causing file transfer progress to be displayed\n", "on your screen when in local mode. 'set display off' is useful for\n", "allowing file transfers to proceed in the background.\n\n", "" } ; static char *hmhrmt[] = { "\ The 'remote' command is used to send file management instructions to a\n", "remote KI���J��J��J��J��J��J��J��J��J�� J�� J�� J�� J�� J��J��J��J��J��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ermit server. There should already be a Kermit running in server\n", "mode on the other end of the currently selected line. Type 'remote ?' to\n", "see a list of available remote commands. Type 'help remote x' to get\n", "further information about a particular remote command 'x'.\n", "" } ; #endif /* MINIX */ /* D O H L P -- Give a help message */ dohlp(xx) int xx; { int x,y; #ifdef MINIX return(0); #else if (xx < 0) return(xx); switch (xx) { case XXBYE: return(hmsg(hmxxbye)); case XXCLO: return(hmsg(hmxxclo)); case XXCON: return(hmsg(hmxxcon)); case XXCWD: #ifdef vms return(hmsg("\ Change Working Directory, equivalent to VMS SET DEFAULT command")); #else #ifdef datageneral return(hmsg("Change Working Directory, equivalent to DG 'dir' command")); #else return(hmsg("Change Working Directory, equivalent to Unix 'cd' command")); #endif #endif case XXDEL: return(hmsg("Delete a local file or files")); case XXDIAL: return(hmsg("Dial a number using modem autodialer")); case XXDIR: return(hmsg("Display a directory of local files")); case XXECH: return(hmsg("Display the rest of the command on the terminal,\n\ useful in command files.")); case XXEXI: case XXQUI: return(hmsg("Exit from the Kermit program, closing any open logs.")); case XXFIN: return(hmsg("\ Tell the remote Kermit server to shut down without logging out.")); case XXGET: return(hmsg(hmxxget)); case XXHLP: return(hmsga(tophlp)); case XXLOG: return(hmsga(hmxxlg)); case XXLOGI: return(hmsga(hmxxlogi)); case XXREC: return(hmsga(hmxxrc)); case XXREM: if ((y = cmkey(remcmd,nrmt,"Remote command","")) == -2) return(y); if (y == -1) return(y); if (x = (cmcfm()) < 0) return(x); return(dohrmt(y)); case XXSEN: return(hmsg(hmxxsen)); case XXSER: return(hmsg(hmxxser)); case XXSET: if ((y = cmkey(prmtab,nprm,"Parameter","")) == -2) return(y); if (y == -2) return(y); if (x = (cmcfm()) < 0) return(x); return(dohset(y)); case XXSHE: #ifdef vms return(hmsg("\ Issue a command to VMS (space required after '!')")); #else #ifdef AMIGA return(hmsg("\ Issue a command to CLI (space required after '!')")); #else #ifdef datageneral return(hmsg("\ Issue a command to the CLI (space required after '!')")); #else return(hmsg("\ Issue a command to the Unix shell (space required after '!')")); #endif #endif #endif case XXSHO: return(hmsg("\ Display current values of 'set' parameters; 'show version' will display\n\ program version information for each of the C-Kermit modules.")); case XXSPA: #ifdef datageneral return(hmsg("\ Display disk usage in current device, directory,\n\ or return space for a specified device, directory.")); #else return(hmsg("Display disk usage in current device, directory")); #endif case XXSTA: return(hmsg("Display statistics about most recent file transfer")); case XXTAK: return(hmsg("\ Take Kermit commands from the named file. Kermit command files may\n\ themselves contain 'take' commands, up to a reasonable depth of nesting.")); default: if (x = (cmcfm()) < 0) return(x); printf("Not available yet - %s\n",cmdbuf); break; } return(0); #endif /* MINIX */ } /* H M S G -- Get confirmation, then print the given message */ hmsg(s) char *s; { int x; if ((x = cmcfm()) < 0) return(x); puts(s); return(0); } hmsga(s) char *s[]; { /* Same function, but for arrays */ int x, i; if ( x = (cmcfm()) < 0) return(x); for ( i = 0; *s[i] ; i++ ) fputs(s[i], stdout); fputc( '\n', stdout); return(0); } /* D O H S E T -- Give help for SET command */ dohset(xx) int xx; { #ifdef MINIX return(0); #else if (xx == -3) return(hmsga(hmhset)); if (xx < 0) return(xx); switch (xx) { case XYCHKT: return(hmsga(hmxychkt)); case XYDELA: puts("\ Number of seconds to wait before sending first packet after 'send' command."); return(0); case XYDUPL: puts("\ During 'connect': 'full' means remote host echoes, 'half' means this program"); puts("does its own echoing."); return(0); case XYESC: printf("%s","\ Decimal ASCII value for escape character during 'connect', normally 28\n\ (Control-\\)\n"); return(0); case XYFILE: return(hmsga(hmxyf)); case XYFLOW: puts("\ Type of flow control to be used. Choices are 'xon/xoff' and 'none'."); puts("normally xon/xoff."); return(0); case XYHAND: puts("\ Decimal ASCII value for character to use for half duplex line turnaround"); puts("handshake. Normally, handshaking is not done."); return(0); case XYLINE: printf("\ Device name of communication line to use. Normally %s.\n",dftty); if (!dfloc) { printf("\ If you set the line to other than %s, then Kermit\n",dftty); printf("\ will be in 'local' mode; 'set line' will reset Kermit to remote mode.\n"); puts("\ If the line has a modem, and if the modem-dialer is set to direct, this"); puts("\ command causes waiting for a carrier detect (e.g. on a hayes type modem)."); puts("\ This can be used to wait for incoming calls."); puts("\ To use the modem to dial out, first set modem-dialer (e.g., to hayes), then"); puts("set line, next issue the dial command, and finally connect."); } return(0); case XYMODM: puts("\ Type of modem for dialing remote connections. Needed to indicate modem can"); puts("\ be commanded to dial without 'carrier detect' from modem. Many recently"); puts("\ manufactured modems use 'hayes' protocol. Type 'set modem ?' to see what"); puts("\ types of modems are supported by this program."); return(0); case XYPARI: puts("Parity to use during terminal connection and file transfer:"); puts("even, odd, mark, space, or none. Normally none."); return(0); case XYPROM: puts("Prompt string for this program, normally 'C-Kermit>'."); return(0); case XYRETR: puts("\ How many times to retransmit a particular packet before giving up"); return(0); case XYSPEE: puts("\ Communication line speed for external tty line specified in most recent"); #ifdef AMIGA puts("\ 'set line' command. Any baud rate between 110 and 292000, although you"); puts(" will receive a warning if you do not use a standard baud rate:"); puts("\ 110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600."); #else #ifdef datageneral puts("\ 'set line' command. Any of the common baud rates:"); puts(" 0, 50, 75, 110, 134, 150, 300, 600, 1200, 1800, "); puts(" 2400, 3600, 7200, 4800, 9600, 19200, 38400."); #else #ifdef MINIX puts("\ 'set line' command. Any of the common baud rates:"); puts(" 0, 110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200."); #else puts("\ 'set line' command. Any of the common baud rates:"); puts(" 0, 110, 150, 300, 600, 1200, 1800, 2400, 4800, 9600."); #endif #endif #endif return(0); case XYRECV: puts("\ Specify parameters for inbound packets:"); puts("\ End-Of-Packet (ASCII value), Packet-Length (1000 or less),"); puts("\ Padding (amount, 94 or less), Pad-Character (ASCII value),"); puts("\ Start-Of-Packet (ASCII value), and Timeout (94 seconds or less),"); puts("\ all specified as decimal numbers."); return(0); case XYSEND: puts("\ Specify parameters for outbound packets:"); puts("\ End-Of-Packet (ASCII value), Packet-Length (2000 or less),"); puts("\ Padding (amount, 94 or less), Pad-Character (ASCII value),"); puts("\ Start-Of-Packet (ASCII value), and Timeout (94 seconds or less),"); puts("\ all specified as decimal numbers."); return(0); default: printf("%s","Not available yet - %s\n",cmdbuf); return(0); } #endif /* MINIX */ } /* D O H R M T -- Give help about REMOTE command */ dohrmt(xx) int xx; { #ifdef MINIX return(0); #else int x; if (xx == -3) return(hmsga(hmhrmt)); if (xx < 0) return(xx); switch (xx) { case XZCWD: return(hmsg("\ Ask remote Kermit server to change its working directory.")); case XZDEL: return(hmsg("\ Ask remote Kermit server to delete the named file(s).")); case XZDIR: return(hmsg("\ Ask remote Kermit server to provide directory listing of the named file(s).")); case XZHLP: return(hmsg("\ Ask remote Kermit server to tell you what services it provides.")); case XZHOS: return(hmsg("\ Send a command to the remote system in its own command language\n\ through the remote Kermit server.")); case XZSPA: return(hmsg("\ Ask the remote Kermit server to tell you about its disk space.")); case XZTYP: return(hmsg("\ Ask the remote Kermit server to type the named file(s) on your screen.")); case XZWHO: return(hmsg("\ Ask the remote Kermit server to list who's logged in, or to give information\n\ about the specified user.")); default: if (x = (cmcfm()) < 0) return(x); printf("%s","not working yet - %s\n",cmdbuf); return(-2); } #endif /* MINIX */ } /*** The following functions moved here from ckuusr.c because that module ***/ /*** got too big for PDP-11s. ***/ /* D O L O G -- Do the log command */ dolog(x) int x; { int y; char *s; switch (x) { case LOGD: #ifdef DEBUG y = cmofi("Name of debugging log file","debug.log",&s); #else y = -2; s = ""; printf("%s","- Sorry, debug log not available\n"); #endif break; case LOGP: y = cmofi("Name of packet log file","packet.log",&s); break; case LOGS: y = cmofi("Name of session log file","session.log",&s); break; case LOGT: #ifdef TLOG y = cmofi("Name of transaction log file","transact.log",&s); #else y = -2; s = ""; printf("%s","- Sorry, transaction log not available\n"); #endif break; default: printf("\n?Unexpected log designator - %d\n",x); return(-2); } if (y < 0) return(y); strcpy(line,s); s = line; if ((y = cmcfm()) < 0) return(y); /* cont'd... */ /* ...dolog, cont'd */ switch (x) { #ifdef DEBUG case LOGD: return(deblog = debopn(s)); #endif case LOGP: zclose(ZPFILE); y = zopeno(ZPFILE,s); if (y > 0) strcpy(pktfil,s); else *pktfil = '\0'; return(pktlog = y); case LOGS: zclose(ZSFILE); y = zopeno(ZSFILE,s); if (y > 0) strcpy(sesfil,s); else *sesfil = '\0'; return(seslog = y); #ifdef TLOG case LOGT: zclose(ZTFILE); tralog = zopeno(ZTFILE,s); if (tralog > 0) { strcpy(trafil,s); tlog(F110,"Transaction Log:",versio,0l); tlog(F100,ckxsys,"",0); ztime(&s); tlog(F100,s,"",0l); } else *trafil = '\0'; return(tralog); #endif default: return(-2); } } /* D E B O P N -- Open a debugging file */ debopn(s) char *s; { #ifdef DEBUG char *tp; zclose(ZDFILE); deblog = zopeno(ZDFILE,s); if (deblog > 0) { strcpy(debfil,s); debug(F110,"Debug Log ",versio,0); debug(F100,ckxsys,"",0); ztime(&tp); debug(F100,tp,"",0); } else *debfil = '\0'; return(deblog); #else return(0); #endif } /* S H O P A R -- Show Parameters */ shopar() { int i; #ifndef MINIX extern struct keytab mdmtab[]; extern int nmdm; #endif printf("\n%s,%s, ",versio,ckxsys); puts("Communications Parameters:"); printf(" Line: %s, speed: %d, mode: ",ttname,speed); if (local) printf("local"); else printf("remote"); #ifndef MINIX for (i = 0; i < nmdm; i++) { if (mdmtab[i].val == mdmtyp) { printf(", modem-dialer: %s",mdmtab[i].kwd); break; } } #endif printf("\n Bits: %d",(parity) ? 7 : 8); printf(", parity: "); switch (parity) { case 'e': printf("even"); break; case 'o': printf("odd"); break; case 'm': printf("mark"); break; case 's': printf("space"); break; case 0: printf("none"); break; default: printf("invalid - %d",parity); break; } printf(", duplex: "); if (duplex) printf("half, "); else printf("full, "); printf("flow: "); if (flow == 1) printf("xon/xoff"); else if (flow == 0) printf("none"); else printf("%d",flow); printf(", handshake: "); if (turn) printf("%d\n",turnch); else printf("none\n"); printf("Terminal emulation: %d bits\n", (cmask == 0177) ? 7 : 8); printf("\nProtocol Parameters: Send Receive"); if (timef || spsizf) printf(" (* = override)"); printf("\n Timeout: %11d%9d", rtimo, timint); if (timef) printf("*"); printf("\n Padding: %11d%9d", npad, mypadn); printf(" Block Check: %6d\n",bctr); printf( " Pad Character:%11d%9d", padch, mypadc); printf(" Delay: %6d\n",delay); printf( " Packet Start: %11d%9d", mystch, stchr); printf(" Max Retries: %6d\n",maxtry); printf( " Packet End: %11d%9d", seol, eol); if (ebqflg) printf(" 8th-Bit Prefix: '%c'",ebq); printf( "\n Packet Length:%11d", spsiz); printf( spsizf ? "*" : " " ); printf("%8d", urpsiz); printf( (urpsiz > 94) ? " (94)" : " "); if (rptflg) printf(" Repeat Prefix: '%c'",rptq); printf( "\n Length Limit: %11d%9d\n", maxsps, maxrps); printf("\nFile parameters:\n File Names: "); if (fncnv) printf("%-12s","converted"); else printf("%-12s","literal"); #ifdef DEBUG printf(" Debugging Log: "); if (deblog) printf("%s",debfil); else printf("none"); #endif printf("\n File Type: "); if (binary) printf("%-12s","binary"); else printf("%-12s","text"); printf(" Packet Log: "); if (pktlog) printf(pktfil); else printf("none"); printf("\n File Warning: "); if (warn) printf("%-12s","on"); else printf("%-12s","off"); printf(" Session Log: "); if (seslog) printf(sesfil); else printf("none"); printf("\n File Display: "); if (quiet) printf("%-12s","off"); else printf("%-12s","on"); #ifdef TLOG printf(" Transaction Log: "); if (tralog) printf(trafil); else printf("none"); #endif printf("\n\nFile Byte Size: %d",(fmask == 0177) ? 7 : 8); printf(", Incomplete File Disposition: "); if (keep) printf("keep"); else printf("discard"); #ifdef KERMRC printf(", Init file: %s",KERMRC); #endif puts("\n"); } /* D O S T A T -- Display file transfer statistics. */ dostat() { printf("\nMost recent transaction --\n"); printf(" files: %ld\n",filcnt); printf(" total file characters : %ld\n",tfc); printf(" communication line in : %ld\n",tlci); printf(" communication line out : %ld\n",tlco); printf(" elapsed time : %d sec\n",tsecs); if (filcnt > 0) { if (tsecs > 0) { long lx; lx = (tfc * 10l) / tsecs; printf(" effective baud rate : %ld\n",lx); if (speed > 0) { lx = (lx * 100l) / speed; printf(" efficiency : %ld %%\n",lx); } } printf(" packet length : %d (send), %d (receive)\n", spsiz,urpsiz); printf(" block check type used : %d\n",bctu); printf(" compression : "); if (rptflg) printf("yes [%c]\n",rptq); else printf("no\n"); printf(" 8th bit prefixing : "); if (ebqflg) printf("yes [%c]\n",ebq); else printf("no\n\n"); } else printf("\n"); return(0); } /* F S T A T S -- Record file statistics in transaction log */ fstats() { tlog(F100," end of file","",0l); tlog(F101," file characters ","",ffc); tlog(F101," communication line in ","",flci); tlog(F101," communication line out ","",flco); } /* T S T A T S -- Record statistics in transaction log */ tstats() { char *tp; int x; ztime(&tp); /* Get time stamp */ tlog(F110,"End of transaction",tp,0l); /* Record it */ if (filcnt < 1) return; /* If no files, done. */ /* If multiple files, record character totals for all files */ if (filcnt > 1) { tlog(F101," files","",filcnt); tlog(F101," total file characters ","",tfc); tlog(F101," communication line in ","",tlci); tlog(F101," communication line out ","",tlco); } /* Record timing info for one or more files */ tlog(F101," elapsed time (seconds) ","",(long) tsecs); if (tsecs > 0) { x = (tfc / tsecs) * 10; tlog(F101," effective baud rate ","",x); if (speed > 0) { x = (x * 100) / speed; tlog(F101," efficiency (percent) ","",x); } } tlog(F100,"","",0); /* Leave a blank line */ } /* S D E B U -- Record spar results in debugging log */ sdebu(len) int len; { debug(F111,"spar: data",rdatap,len); debug(F101," spsiz ","", spsiz); debug(F101," timint","",timint); debug(F101," npad ","", npad); debug(F101," padch ","", padch); debug(F101," seol ","", seol); debug(F101," ctlq ","", ctlq); debug(F101," ebq ","", ebq); debug(F101," ebqflg","",ebqflg); debug(F101," bctr ","", bctr); debug(F101," rptq ","", rptq); debug(F101," rptflg","",rptflg); debug(F101," atcapu","",atcapu); debug(F101," lpcapu","",lpcapu); debug(F101," swcapu","",swcapu); debug(F101," wsize ","", wsize); } /* R D E B U -- Debugging display of rpar() values */ rdebu(len) int len; { debug(F111,"spar: data",rdatap,len); debug(F101," rpsiz ","",xunchar(data[1])); debug(F101," rtimo ","", rtimo); debug(F101," mypadn","",mypadn); debug(F101," mypadc","",mypadc); debug(F101," eol ","", eol); debug(F101," ctlq ","", ctlq); debug(F101," sq ","", sq); debug(F101," ebq ","", ebq); debug(F101," ebqflg","",ebqflg); debug(F101," bctr ","", bctr); debug(F101," rptq ","",data[9]); debug(F101," rptflg","",rptflg); debug(F101," capas ","",capas); debug(F101," bits ","",data[capas]); debug(F101," atcapu","",atcapu); debug(F101," lpcapu","",lpcapu); debug(F101," swcapu","",swcapu); debug(F101," wsize ","", wsize); debug(F101," rpsiz(extended)","",rpsiz); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* C K U U S 3 -- "User Interface" for Unix Kermit, part 3 */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* SET and REMOTE commands; screen, debug, interrupt, and logging functions */ /* Includes */ #include "ckcdeb.h" #include <stdio.h> #include <ctype.h> #include "ckcker.h" #include "ckucmd.h" #include "ckuusr.h" #ifdef UXIII #include <termio.h> #endif #ifdef datageneral extern int con_reads_mt, /* Flag if console read asynch is active */ conint_ch, /* The character read by asynch read */ conint_avl; /* Flag that char available */ #endif /* Variables */ extern int size, spsiz, rpsiz, urpsiz, npad, timint, rtimo, speed, local, server, lpcapr, fmask, cmask, backgrd, flow, displa, binary, fncnv, delay, parity, deblog, escape, xargc, turn, duplex, cxseen, czseen, nfils, ckxech, pktlog, seslog, tralog, stdouf, turnch, bctr, bctu, dfloc, mdmtyp, keep, maxtry, rptflg, ebqflg, warn, quiet, cnflg, timef, spsizf, mypadn; extern long filcnt, tlci, tlco, ffc, tfc, fsize; extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv; extern char *cmarg, *cmarg2, **xargv, **cmlist; extern CHAR stchr, mystch, sstate, padch, mypadc, eol, seol, ctlq; extern CHAR filnam[], ttname[]; char *strcpy(); /* Declarations from cmd package */ extern char cmdbuf[]; /* Command buffer */ /* From main ckuser module... */ extern char line[100], *lp; /* Character buffer for anything */ extern char debfil[50], /* Debugging log file name */ pktfil[50], /* Packet log file name */ sesfil[50], /* Session log file name */ trafil[50]; /* Transaction log file name */ extern int tlevel; /* Take Command file level */ extern FILE *tfile[]; /* Array of take command fd's */ /* Keyword tables for SET commands */ /* Block checks */ struct keytab blktab[] = { "1", 1, 0, "2", 2, 0, "3", 3, 0 }; /* Duplex keyword table */ struct keytab dpxtab[] = { "full", 0, 0, "half", 1, 0 }; struct keytab filtab[] = { "display", XYFILD, 0, "names", XYFILN, 0, "type", XYFILT, 0, "warning", XYFILW, 0 }; int nfilp = (sizeof(filtab) / sizeof(struct keytab)); /* Send/Receive Parameters */ struct keytab srtab[] = { "end-of-packet", XYEOL, 0, "packet-length", XYLEN, 0, "pad-character", XYPADC, 0, "padding", XYNPAD, 0, "start-of-packet", XYMARK, 0, "timeout", XYTIMO, 0 }; int nsrtab = (sizeof(srtab) / sizeof(struct keytab)); /* Flow Control */ struct keytab flotab[] = { "none", 0, 0, "xon/xoff", 1, 0 }; int nflo = (sizeof(flotab) / sizeof(struct keytab)); /* Handshake characters */ struct keytab hshtab[] = { "bell", 007, 0, "cr", 015, 0, "esc", 033, 0, "lf", 012, 0, "none", 999, 0, /* (can't use negative numbers) */ "xoff", 023, 0, "xon", 021, 0 }; int nhsh = (sizeof(hshtab) / sizeof(struct keytab)); struct keytab fntab[] = { /* File naming */ "converted", 1, 0, "literal", 0, 0 }; struct keytab fttab[] = { /* File types */ "binary", 1, 0, "text", 0, 0 }; extern struct keytab mdmtab[] ; /* Modem types (in module ckudia.c) */ extern int nmdm; /* Parity keyword table */ struct keytab partab[] = { "even", 'e', 0, "mark", 'm', 0, "none", 0, 0, "odd", 'o', 0, "space", 's', 0 }; int npar = (sizeof(partab) / sizeof(struct keytab)); /* On/Off table */ struct keytab onoff[] = { "off", 0, 0, "on", 1, 0 }; /* Incomplete File Disposition table */ struct keytab ifdtab[] = { "discard", 0, 0, "keep", 1, 0 }; /* Terminal parameters table */ struct keytab trmtab[] = { "bytesize", 0, 0 }; /* D O P R M -- Set a parameter. */ /* Returns: -2: illegal input -1: reparse needed 0: success */ doprm(xx) int xx; { int x, y, z; char *s; switch (xx) { case XYEOL: /* These have all been moved to set send/receive... */ case XYLEN: /* Let the user know what to do. */ case XYMARK: case XYNPAD: case XYPADC: case XYTIMO: printf("...Use 'set send' or 'set receive' instead.\n"); printf("Type 'help set send' or 'help set receive' for more info.\n"); return(0); case XYIFD: /* Incomplete file disposition */ if ((y = cmkey(ifdtab,2,"","discard")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); keep = y; return(0); case XYLINE: if ((x = cmtxt("Device name",dftty,&s)) < 0) return(x); ttclos(); /* close old line, if any was open */ x = strcmp(s,dftty) ? -1 : dfloc; /* Maybe let ttopen figure it out... */ if (ttopen(s,&x,mdmtyp) < 0 ) { /* Can we open the new line? */ perror("Sorry, can't open line"); return(-2); /* If not, give bad return */ } if (x > -1) local = x; /* Set local/remote status. */ strcpy(ttname,s); /* OK, copy name into real place. */ if (!local) speed = -1; /* If remote, say speed unknown. */ debug(F111,"set line ",ttname,local); return(0); case XYCHKT: if ((y = cmkey(blktab,3,"","1")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); bctr = y; return(0); case XYDEBU: return(seton(&deblog)); case XYDELA: y = cmnum("Number of seconds before starting to send","5",10,&x); debug(F101,"XYDELA: y","",y); return(setnum(&delay,x,y,94)); case XYDUPL: if ((y = cmkey(dpxtab,2,"","full")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); duplex = y; return(0); case XYESC: y = cmnum("Decimal ASCII code for escape character","",10,&x); return(setcc(&escape,x,y)); case XYFILE: if ((y = cmkey(filtab,nfilp,"File parameter","")) < 0) return(y); switch (y) { int z; case XYFILD: /* Display */ y = seton(&z); if (y < 0) return(y); quiet = !z; return(0); case XYFILN: /* Names */ if ((x = cmkey(fntab,2,"how to handle filenames","converted")) < 0) return(x); if ((z = cmcfm()) < 0) return(z); fncnv = x; return(0); case XYFILT: /* Type */ if ((x = cmkey(fttab,2,"type of file","text")) < 0) return(x); if ((y = cmnum("file byte size (7 or 8)","8",10,&z)) < 0) return(y); if (z != 7 && z != 8) { printf("\n?The choices are 7 and 8\n"); return(-2); } if ((y = cmcfm()) < 0) return(y); binary = x; if (z == 7) fmask = 0177; else if (z == 8) fmask = 0377; return(0); case XYFILW: /* Warning/Write-Protect */ return(seton(&warn)); default: printf("?unexpected file parameter\n"); return(-2); } case XYFLOW: /* Flow control */ if ((y = cmkey(flotab,nflo,"","xon/xoff")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); flow = y; return(0); case XYHAND: /* Handshake */ if ((y = cmkey(hshtab,nhsh,"","none")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); turn = (y > 0127) ? 0 : 1 ; turnch = y; return(0); case XYMODM: #ifndef MINIX if ((x=cmkey(mdmtab,nmdm,"type of modem, direct means none","direct")) < 0) return(x); #endif if ((z = cmcfm()) < 0) return(z); mdmtyp = x; return(0); case XYPARI: /* Parity */ if ((y = cmkey(partab,npar,"","none")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); /* If parity not none, then we also want 8th-bit prefixing */ if (parity = y) ebqflg = 1; else ebqflg = 0; return(0); case XYPROM: if ((x = cmtxt("Program's command prompt","C-Kermit>",&s)) < 0) return(x); if (*s == '\42') { /* Quoted string? */ x = strlen(s) - 1; /* Yes, strip quotes. */ if (*(s+x) == '\42') /* This allows leading or trailing */ *(s+x) = '\0'; /* blanks. */ s++; } cmsetp(s); return(0); case XYRETR: /* Per-packet retry limit */ y = cmnum("Maximum retries per packetJ��J��J��J��J��J�� J��!J��"J��#J��$J��%J��&J��'J��(J��)J��*J��+J��,J��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������","10",10,&x); return(setnum(&maxtry,x,y,94)); case XYTERM: /* Terminal parameters */ if ((y = cmkey(trmtab,1,"","bytesize")) < 0) return(y); switch (y) { case 0: if ((y = cmnum("bytesize for terminal connection","8",10,&x)) < 0) return(y); if (x != 7 && x != 8) { printf("\n?The choices are 7 and 8\n"); return(-2); } if ((y = cmcfm()) < 0) return(y); if (x == 7) cmask = 0177; else if (x == 8) cmask = 0377; return(y); default: /* Add more cases when we think of more parameters */ return(-2); } /* SET SEND/RECEIVE... */ case XYRECV: case XYSEND: if (xx == XYRECV) strcpy(line,"Parameter for inbound packets"); else strcpy(line,"Parameter for outbound packets"); if ((y = cmkey(srtab,nsrtab,line,"")) < 0) return(y); switch (y) { case XYEOL: y = cmnum("Decimal ASCII code for packet terminator","13",10,&x); if ((y = setcc(&z,x,y)) < 0) return(y); if (xx == XYRECV) eol = z; else seol = z; return(y); case XYLEN: y = cmnum("Maximum number of characters in a packet","90",10,&x); if (xx == XYRECV) { /* Receive... */ if ((y = setnum(&z,x,y,MAXRP)) < 0) return(y); urpsiz = z; rpsiz = (z > 94) ? 94 : z; } else { /* Send... */ if ((y = setnum(&z,x,y,MAXSP)) < 0) return(y); spsiz = z; /* Set it and flag that it was set */ spsizf = 1; /* to allow overriding Send-Init. */ } if (z > 94 && !backgrd) printf("Extended-length packets requested\n"); return(y); case XYMARK: y = cmnum("Decimal ASCII code for packet-start character","1",10,&x); if ((y = setcc(&z,x,y)) < 0) return(y); if (xx == XYRECV) stchr = z; else mystch = z; return(y); case XYNPAD: /* Padding */ y = cmnum("How many padding characters for inbound packets","0",10,&x); if ((y = setnum(&z,x,y,94)) < 0) return(y); if (xx == XYRECV) mypadn = z; else npad = z; return(y); case XYPADC: /* Pad character */ y = cmnum("Decimal ASCII code for inbound pad character","0",10,&x); if ((y = setcc(&z,x,y)) < 0) return(y); if (xx == XYRECV) mypadc = z; else padch = z; return(y); case XYTIMO: y = cmnum("Interpacket timeout interval","5",10,&x); if ((y = setnum(&z,x,y,94)) < 0) return(y); if (xx == XYRECV) { timef = 1; timint = z; } else rtimo = z; return(y); } case XYSPEE: if (!local) { printf("\nSpeed setting can only be done on an external line\n"); printf("You must 'set line' before issuing this command\n"); return(0); } lp = line; sprintf(lp,"Baud rate for %s",ttname); if ((y = cmnum(line,"",10,&x)) < 0) return(y); if (y = (cmcfm()) < 0) return(y); y = chkspd(x); if (y < 0) printf("?Unsupported line speed - %d\n",x); else { speed = y; if (!backgrd) printf("%s: %d baud\n",ttname,speed); } return(0); default: if ((x = cmcfm()) < 0) return(x); printf("Not working yet - %s\n",cmdbuf); return(0); } } /* C H K S P D -- Check if argument is a valid baud rate */ chkspd(x) int x; { switch (x) { #ifndef AMIGA case 0: #endif #ifndef datageneral case 110: case 150: case 300: case 600: case 1200: case 1800: case 2400: case 4800: case 9600: #ifdef MINIX case 19200: case 38400: case 57600: case 115200: #else #ifdef apollo case 19200: #else #ifdef AMIGA case 19200: case 38400: case 57600: #else /* #ifdef B19200 (this high speed stuff needs much more work...) /* case 19200: (have to make corresponding changes in ckuus2, ckutio) /* #else /* #ifdef B38400 /* case 38400: /* #endif /* #endif */ #endif #endif #endif #endif #ifdef datageneral case 50: case 75: case 134: case 3600: case 7200: case 19200: case 38400: #endif return(x); default: #ifdef AMIGA if (ttsspd(x) > 0) { printf("Warning: non-standard baud rate - %d\n", x); return(x); } #endif return(-1); } } /* S E T O N -- Parse on/off (default on), set parameter to result */ seton(prm) int *prm; { int x, y; if ((y = cmkey(onoff,2,"","on")) < 0) return(y); if ((x = cmcfm()) < 0) return(x); *prm = y; return(0); } /* S E T N U M -- Set parameter to result of cmnum() parse. */ /* Call with x - number from cnum parse, y - return code from cmnum */ setnum(prm,x,y,max) int x, y, *prm, max; { debug(F101,"setnum","",y); if (y < 0) return(y); if (x > max) { printf("\n?Sorry, %d is the maximum\n",max); return(-2); } if ((y = cmcfm()) < 0) return(y); *prm = x; return(0); } /* S E T C C -- Set parameter to an ASCII control character value. */ setcc(prm,x,y) int x, y, *prm; { if (y < 0) return(y); if ((x > 037) && (x != 0177)) { printf("\n?Not in ASCII control range - %d\n",x); return(-2); } if ((y = cmcfm()) < 0) return(y); *prm = x; return(0); } /* D O R M T -- Do a remote command */ dormt(xx) int xx; { int x; char *s, sbuf[50], *s2; if (xx < 0) return(xx); switch (xx) { case XZCWD: /* CWD */ if ((x = cmtxt("Remote directory name","",&s)) < 0) return(x); debug(F111,"XZCWD: ",s,x); *sbuf = NUL; s2 = sbuf; if (*s != NUL) { /* If directory name given, */ /* get password on separate line. */ if (tlevel > -1) { /* From take file... */ if (fgets(sbuf,50,tfile[tlevel]) == NULL) fatal("take file ends prematurely in 'remote cwd'"); debug(F110," pswd from take file",s2,0); for (x = strlen(sbuf); x > 0 && (sbuf[x-1] == '\n' || sbuf[x-1] == '\r'); x--) sbuf[x-1] = '\0'; } else { /* From terminal... */ printf(" Password: "); /* get a password */ while (((x = getchar()) != NL) && (x != CR)) { /* with no echo */ if ((x &= 0177) == '?') { printf("? Password of remote directory\n Password: "); s2 = sbuf; *sbuf = NUL; } else if (x == ESC) /* Mini command line editor... */ putchar(BEL); else if (x == BS || x == 0177) s2--; else if (x == 025) { /* Ctrl-U */ s2 = sbuf; *sbuf = NUL; } else *s2++ = x; } *s2 = NUL; putchar('\n'); } s2 = sbuf; } else s2 = ""; debug(F110," password",s2,0); sstate = setgen('C',s,s2,""); return(0); case XZDEL: /* Delete */ if ((x = cmtxt("Name of remote file(s) to delete","",&s)) < 0) return(x); return(sstate = rfilop(s,'E')); case XZDIR: /* Directory */ if ((x = cmtxt("Remote directory or file specification","",&s)) < 0) return(x); return(sstate = setgen('D',s,"","")); case XZHLP: /* Help */ if (x = (cmcfm()) < 0) return(x); sstate = setgen('H',"","",""); return(0); case XZHOS: /* Host */ if ((x = cmtxt("Command for remote system","",&cmarg)) < 0) return(x); return(sstate = 'c'); case XZPRI: /* Print */ if ((x = cmtxt("Remote file(s) to print on remote printer","",&s)) < 0) return(x); return(sstate = rfilop(s,'S')); case XZSPA: /* Space */ if ((x = cmtxt("Confirm, or remote directory name","",&s)) < 0) return(x); return(sstate = setgen('U',s,"","")); case XZTYP: /* Type */ if ((x = cmtxt("Remote file specification","",&s)) < 0) return(x); return(sstate = rfilop(s,'T')); case XZWHO: if ((x = cmtxt("Remote user name, or carriage return","",&s)) < 0) return(x); return(sstate = setgen('W',s,"","")); default: if (x = (cmcfm()) < 0) return(x); printf("not working yet - %s\n",cmdbuf); return(-2); } } /* R F I L O P -- Remote File Operation */ rfilop(s,t) char *s, t; { if (*s == NUL) { printf("?File specification required\n"); return(-2); } debug(F111,"rfilop",s,t); return(setgen(t,s,"","")); } /* S C R E E N -- Screen display function */ /* screen(f,c,n,s) f - argument descriptor c - a character or small integer n - a long integer s - a string. Fill in this routine with the appropriate display update for the system. This version is for a dumb tty. */ screen(f,c,n,s) int f; long n; char c; char *s; { static int p = 0; /* Screen position */ int len; /* Length of string */ char buf[80]; /* Output buffer */ len = strlen(s); /* Length of string */ if (!displa || quiet) return; /* No update if display flag off */ switch (f) { case SCR_FN: /* filename */ conoll(""); conol(s); conoc(SP); p = len + 1; return; case SCR_AN: /* as-name */ if (p + len > 75) { conoll(""); p = 0; } conol("=> "); conol(s); if ((p += (len + 3)) > 78) { conoll(""); p = 0; } return; case SCR_FS: /* file-size */ sprintf(buf,", Size: %ld",n); conoll(buf); p = 0; return; case SCR_XD: /* x-packet data */ conoll(""); conoll(s); p = 0; return; case SCR_ST: /* File status */ switch (c) { case ST_OK: /* Transferred OK */ if ((p += 5) > 78) { conoll(""); p = 0; } conoll(" [OK]"); p += 5; return; case ST_DISC: /* Discarded */ if ((p += 12) > 78) { conoll(""); p = 0; } conoll(" [discarded]"); p += 12; return; case ST_INT: /* Interrupted */ if ((p += 14) > 78) { conoll(""); p = 0; } conoll(" [interrupted]"); p += 14; return; case ST_SKIP: /* Skipped */ conoll(""); conol("Skipping "); conoll(s); p = 0; return; default: conoll("*** screen() called with bad status ***"); p = 0; return; } case SCR_PN: /* Packet number */ sprintf(buf,"%s: %ld",s,n); conol(buf); p += strlen(buf); return; case SCR_PT: /* Packet type or pseudotype */ if (c == 'Y') return; /* Don't bother with ACKs */ if (c == 'D') { /* Only show every 4th data packet */ if (n % 4) return; c = '.'; } #ifndef AMIGA if (p++ > 78) { /* If near right margin, */ conoll(""); /* Start new line */ p = 0; /* and reset counter. */ } #endif conoc(c); /* Display the character. */ #ifdef AMIGA if (c == 'G') conoll(""); /* new line after G packets */ #endif return; case SCR_TC: /* transaction complete */ conoc(BEL); return; case SCR_EM: /* Error message */ conoll(""); conoc('?'); conoll(s); p = 0; return; /* +1 */ case SCR_WM: /* Warning message */ conoll(""); conoll(s); p = 0; return; case SCR_TU: /* Undelimited text */ if ((p += len) > 78) { conoll(""); p = len; } conol(s); return; case SCR_TN: /* Text delimited at beginning */ conoll(""); conol(s); p = len; return; case SCR_TZ: /* Text delimited at end */ if ((p += len) > 78) { conoll(""); p = len; } conoll(s); return; case SCR_QE: /* Quantity equals */ sprintf(buf,"%s: %ld",s,n); conoll(buf); p = 0; return; default: conoll("*** screen() called with bad object ***"); p = 0; return; } } /* I N T M S G -- Issue message about terminal interrupts */ intmsg(n) long n; { extern char *chstr(); char buf[80]; if ((!displa) || (quiet)) return; #ifdef UXIII (void) conchk(); /* clear out pending escape-signals in ckxbsd.c */ #endif if (n == 1) { #ifdef UXIII #ifndef apollo #ifndef datageneral /* we need to signal before kb input */ sprintf(buf,"Type escape (%s) followed by:",chstr(escape)); screen(SCR_TN,0,0l,buf); #endif #endif #endif screen(SCR_TN,0,0l,"CTRL-F to cancel file, CTRL-R to resend current packet"); screen(SCR_TN,0,0l,"CTRL-B to cancel batch, CTRL-A for status report: "); } else screen(SCR_TU,0,0l," "); } /* C H K I N T -- Check for console interrupts */ /*** should rework not to destroy typeahead ***/ chkint() { int ch, cn; if ((!local) || (quiet)) return(0); /* Only do this if local & not quiet */ #ifdef datageneral cn = (con_reads_mt) ? 1 : conchk(); /* Any input waiting? */ #else cn = conchk(); /* Any input waiting? */ #endif debug(F101,"conchk","",cn); while (cn > 0) { /* Yes, read it. */ cn--; /* give read 5 seconds for interrupt character */ #ifdef datageneral /* We must be careful to just print out one result for each character * read. The flag, conint_avl, controls duplication of characters. * Only one character is handled at a time, which is a reasonable * limit. More complicated schemes could handle a buffer. */ if (con_reads_mt) { if ((ch = conint_ch) <= 0) return(0); /* I/O error, or no data */ else if (conint_avl == 0) return(0); /* Char already read */ else conint_avl = 0; /* Flag character as read */ } else { if ((ch = coninc(5)) < 0) return(0); } #else if ((ch = coninc(5)) < 0) return(0); #endif switch (ch & 0177) { case 0001: /* CTRL-A */ screen(SCR_TN,0,0l,"^A Status report:"); screen(SCR_TN,0,0l," file type: "); if (binary) screen(SCR_TZ,0,0l,"binary"); else screen(SCR_TZ,0,0l,"text"); screen(SCR_QE,0,(long)filcnt," file number"); screen(SCR_QE,0,(long)ffc, " characters "); screen(SCR_QE,0,(long)bctu, " block check"); screen(SCR_QE,0,(long)rptflg," compression"); screen(SCR_QE,0,(long)ebqflg," 8th-bit prefixing"); continue; case 0002: /* CTRL-B */ screen(SCR_TN,0,0l,"^B - Cancelling Batch "); czseen = 1; continue; case 0006: /* CTRL-F */ screen(SCR_TN,0,0l,"^F - Cancelling File "); cxseen = 1; continue; case 0022: /* CTRL-R */ screen(SCR_TN,0,0l,"^R - Resending "); resend(); return(1); default: /* Anything else, just ignore */ screen(SCR_TU,0,0l," [Ignored] "); continue; } } return(0); } /* D E B U G -- Enter a record in the debugging log */ /* Call with a format, two strings, and a number: f - Format, a bit string in range 0-7. If bit x is on, then argument number x is printed. s1 - String, argument number 1. If selected, printed as is. s2 - String, argument number 2. If selected, printed in brackets. n - Int, argument 3. If selected, printed preceded by equals sign. f=0 is special: print s1,s2, and interpret n as a char. */ #ifdef DEBUG #define DBUFL 1000 debug(f,s1,s2,n) int f, n; char *s1, *s2; { static char s[DBUFL]; char *sp = s; if (!deblog) return; /* If no debug log, don't */ switch (f) { case F000: /* 0, print both strings, */ if (strlen(s1) + strlen(s2) + 3 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"%s%s%c\n",s1,s2,n); /* interpret n as a char */ zsout(ZDFILE,s); break; case F001: /* 1, "=n" */ sprintf(sp,"=%d\n",n); zsout(ZDFILE,s); break; case F010: /* 2, "[s2]" */ if (strlen(s2) + 4 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"[%s]\n",s2); zsout(ZDFILE,""); break; case F011: /* 3, "[s2]=n" */ if (strlen(s2) + 15 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"[%s]=%d\n",s2,n); zsout(ZDFILE,s); break; case F100: /* 4, "s1" */ zsoutl(ZDFILE,s1); break; case F101: /* 5, "s1=n" */ if (strlen(s1) + 15 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"%s=%d\n",s1,n); zsout(ZDFILE,s); break; case F110: /* 6, "s1[s2]" */ if (strlen(s1) + strlen(s2) + 4 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"%s[%s]\n",s1,s2); zsout(ZDFILE,s); break; case F111: /* 7, "s1[s2]=n" */ if (strlen(s1) + strlen(s2) + 15 > DBUFL) sprintf(sp,"DEBUG string too long\n"); else sprintf(sp,"%s[%s]=%d\n",s1,s2,n); zsout(ZDFILE,s); break; default: sprintf(sp,"\n?Invalid format for debug() - %d\n",n); zsout(ZDFILE,s); } } #endif #ifdef TLOG #define TBUFL 300 /* T L O G -- Log a record in the transaction file */ /* Call with a format and 3 arguments: two strings and a number: f - Format, a bit string in range 0-7, bit x is on, arg #x is printed. s1,s2 - String arguments 1 and 2. n - Int, argument 3. */ tlog(f,s1,s2,n) int f; long n; char *s1, *s2; { static char s[TBUFL]; char *sp = s; int x; if (!tralog) return; /* If no transaction log, don't */ switch (f) { case F000: /* 0 (special) "s1 n s2" */ if (strlen(s1) + strlen(s2) + 15 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"%s %ld %s\n",s1,n,s2); zsout(ZTFILE,s); break; case F001: /* 1, " n" */ sprintf(sp," %ld\n",n); zsout(ZTFILE,s); break; case F010: /* 2, "[s2]" */ x = strlen(s2); if (s2[x] == '\n') s2[x] = '\0'; if (x + 6 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"[%s]\n",s2); zsout(ZTFILE,""); break; case F011: /* 3, "[s2] n" */ x = strlen(s2); if (s2[x] == '\n') s2[x] = '\0'; if (x + 6 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"[%s] %ld\n",s2,n); zsout(ZTFILE,s); break; case F100: /* 4, "s1" */ zsoutl(ZTFILE,s1); break; case F101: /* 5, "s1: n" */ if (strlen(s1) + 15 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"%s: %ld\n",s1,n); zsout(ZTFILE,s); break; case F110: /* 6, "s1 s2" */ x = strlen(s2); if (s2[x] == '\n') s2[x] = '\0'; if (strlen(s1) + x + 4 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"%s %s\n",s1,s2); zsout(ZTFILE,s); break; case F111: /* 7, "s1 s2: n" */ x = strlen(s2); if (s2[x] == '\n') s2[x] = '\0'; if (strlen(s1) + x + 15 > TBUFL) sprintf(sp,"?T-Log string too long\n"); else sprintf(sp,"%s %s: %ld\n",s1,s2,n); zsout(ZTFILE,s); break; default: sprintf(sp,"\n?Invalid format for tlog() - %ld\n",n); zsout(ZTFILE,s); } } #endif ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char *userv = "User Interface 4E(059), 29 Jan 88"; /* C K U U S R -- "User Interface" for Unix Kermit (Part 1) */ /* 4E, support for Apollo Aegis, Data General added, July 87. */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* The ckuusr module contains the terminal input and output functions for Unix Kermit. It includes a simple Unix-style command line parser as well as an interactive prompting keyword command parser. It depends on the existence of Unix facilities like fopen, fgets, feof, (f)printf, argv/argc, etc. Other functions that are likely to vary among Unix implementations -- like setting terminal modes or interrupts -- are invoked via calls to functions that are defined in the system-dependent modules, ck?[ft]io.c. The command line parser processes any arguments found on the command line, as passed to main() via argv/argc. The interactive parser uses the facilities of the cmd package (developed for this program, but usable by any program). Any command parser may be substituted for this one. The only requirements for the Kermit command parser are these: 1. Set parameters via global variables like duplex, speed, ttname, etc. See ckmain.c for the declarations and descriptions of these variables. 2. If a command can be executed without the use of Kermit protocol, then execute the command directly and set the variable sstate to 0. Examples include 'set' commands, local directory listings, the 'connect' command. 3. If a command requires the Kermit protocol, set the following variables: sstate string data 'x' (enter server mode) (none) 'r' (send a 'get' command) cmarg, cmarg2 'v' (enter receive mode) cmarg2 'g' (send a generic command) cmarg 's' (send files) nfils, cmarg & cmarg2 OR cmlist 'c' (send a remote host command) cmarg cmlist is an array of pointers to strings. cmarg, cmarg2 are pointers to strings. nfils is an integer. cmarg can be a filename string (possibly wild), or a pointer to a prefabricated generic command string, or a pointer to a host command string. cmarg2 is the name to send a single file under, or the name under which to store an incoming file; must not be wild. cmlist is a list of nonwild filenames, such as passed via argv. nfils is an integer, interpreted as follows: -1: argument string is in cmarg, and should be expanded internally. 0: stdin. >0: number of files to send, from cmlist. The screen() function is used to update the screen during file transfer. The tlog() function maintains a transaction log. The debug() function maintains a debugging log. The intmsg() and chkint() functions provide the user i/o for interrupting file transfers. */ /* Includes */ #include <sys/types.h> #include "ckcdeb.h" #include <stdio.h> #include <ctype.h> #ifndef AMIGA #include <signal.h> #endif #include "ckcker.h" #include "ckucmd.h" #include "ckuusr.h" #ifdef datageneral #define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd) #define fork() vfork() /* DG version 3.21 of C has bugs in the following routines, since they * depend on /etc/passwd. In the context where the routines are used, * we don't need them anyway. */ #define getgid() -1 #define getuid() -1 #define geteuid() -1 #endif /* External Kermit Variables, see ckmain.c for description. */ extern int size, rpsiz, urpsiz, speed, local, server, displa, binary, parity, deblog, escape, xargc, flow, turn, duplex, nfils, ckxech, pktlog, seslog, tralog, stdouf, turnch, dfloc, keep, maxrps, warn, quiet, cnflg, tlevel; extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv; extern char *dialv, *loginv; extern char *ckxsys, *ckzsys, *cmarg, *cmarg2, **xargv, **cmlist; extern char *DIRCMD, *PWDCMD, cmerrp[]; extern CHAR sstate, ttname[]; char *strcpy(), *getenv(); #ifdef AMIGA char *getcwd(); #endif /* Declarations from cmd package */ extern char cmdbuf[]; /* Command buffer */ /* Declarations from ck?fio.c module */ extern char *SPACMD, *zhome(); /* Space command, home directory. */ extern int backgrd; /* Kermit executing in background */ /* The background flag is set by ckutio.c (via conint() ) to note whether */ /* this kermit is executing in background ('&' on shell command line). */ /* Variables and symbols local to this module */ char line[CMDBL+10], *lp; /* Character buffer for anything */ char debfil[50]; /* Debugging log file name */ char pktfil[50]; /* Packet log file name */ char sesfil[50]; /* Session log file name */ char trafil[50]; /* Transaction log file name */ int n, /* General purpose int */ cflg, /* Command-line connect cmd given */ action, /* Action selected on command line*/ repars, /* Reparse needed */ cwdf = 0; /* CWD has been done */ #define MAXTAKE 20 /* Maximum nesting of TAKE files */ FILE *tfile[MAXTAKE]; /* File pointers for TAKE command */ char *homdir; /* Pointer to home directory string */ char cmdstr[100]; /* Place to build generic command */ /* C M D L I N -- Get arguments from command line */ /* Simple Unix-style command line parser, conforming with 'A Proposed Command Syntax Standard for Unix Systems', Hemenway & Armitage, Unix/World, Vol.1, No.3, 1984. */ cmdlin() { char x; /* Local general-purpose int */ cmarg = ""; /* Initialize globals */ cmarg2 = ""; action = cflg = 0; while (--xargc > 0) { /* Go through command line words */ xargv++; debug(F111,"xargv",*xargv,xargc); if (**xargv == '-') { /* Got an option (begins with dash) */ x = *(*xargv+1); /* Get the option letter */ x = doarg(x); /* Go handle the option */ if (x < 0) doexit(BAD_EXIT); } else { /* No dash where expected */ usage(); doexit(BAD_EXIT); } } debug(F101,"action","",action); if (!local) { if ((action == 'g') || (action == 'r') || (action == 'c') || (cflg != 0)) fatal("-l and -b required"); } if (*cmarg2 != 0) { if ((action != 's') && (action != 'r') && (action != 'v')) fatal("-a without -s, -r, or -g"); } if ((action == 'v') && (stdouf) && (!local)) { if (isatty(1)) fatal("unredirected -k can only be used in local mode"); } if ((action == 's') || (action == 'v') || (action == 'r') || (action == 'x')) { if (local) displa = 1; if (stdouf) { displa = 0; quiet = 1; } } if (quiet) displa = 0; /* No display if quiet requested */ if (cflg) { conect(); /* Connect if requested */ if (action == 0) { if (cnflg) conect(); /* And again if requested */ doexit(GOOD_EXIT); /* Then exit indicating success */ } } if (displa) concb(escape); /* (for console "interrupts") */ return(action); /* Then do any requested protocol */ } /* D O A R G -- Do a command-line argument. */ doarg(x) char x; { int z; char *xp; xp = *xargv+1; /* Pointer for bundled args */ while (x) { switch (x) { case 'x': /* server */ if (action) fatal("conflicting actions"); action = 'x'; break; case 'f': if (action) fatal("conflicting actions"); action = setgen('F',"","",""); break; case 'r': /* receive */ if (action) fatal("conflicting actions"); action = 'v'; break; case 'k': /* receive to stdout */ if (action) fatal("conflicting actions"); stdouf = 1; action = 'v'; break; case 's': /* send */ if (action) fatal("conflicting actions"); if (*(xp+1)) fatal("invalid argument bundling after -s"); z = nfils = 0; /* Initialize file counter, flag */ cmlist = xargv+1; /* Remember this pointer */ while (--xargc 4J��6J��7J��8J��9J��:J��;J��<J��=J��>J��?J��@J��AJ��BJ��CJ��DJ��EJ��FJ��GJ��HJ��IJ��JJ��KJ��LJ��MJ��NJ��OJ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������> 0) { /* Traverse the list */ *xargv++; if (**xargv == '-') { /* Check for sending stdin */ if (strcmp(*xargv,"-") != 0) break; z++; } nfils++; /* Bump file counter */ } xargc++, *xargv--; /* Adjust argv/argc */ if (nfils < 1) fatal("missing filename for -s"); if (z > 1) fatal("-s: too many -'s"); if (z == 1) { if (nfils == 1) nfils = 0; else fatal("invalid mixture of filenames and '-' in -s"); } if (nfils == 0) { if (isatty(0)) fatal("sending from terminal not allowed"); } debug(F101,*xargv,"",nfils); action = 's'; break; /* cont'd... */ /* ...doarg(), cont'd */ case 'g': /* get */ if (action) fatal("conflicting actions"); if (*(xp+1)) fatal("invalid argument bundling after -g"); *xargv++, xargc--; if ((xargc == 0) || (**xargv == '-')) fatal("missing filename for -g"); cmarg = *xargv; action = 'r'; break; case 'c': /* connect before */ cflg = 1; break; case 'n': /* connect after */ cnflg = 1; break; case 'h': /* help */ usage(); return(-1); case 'a': /* "as" */ if (*(xp+1)) fatal("invalid argument bundling after -a"); *xargv++, xargc--; if ((xargc < 1) || (**xargv == '-')) fatal("missing name in -a"); cmarg2 = *xargv; break; case 'l': /* set line */ if (*(xp+1)) fatal("invalid argument bundling after -l"); *xargv++, xargc--; if ((xargc < 1) || (**xargv == '-')) fatal("communication line device name missing"); strcpy(ttname,*xargv); /* if (strcmp(ttname,dftty) == 0) local = dfloc; else local = 1; */ local = (strcmp(ttname,CTTNAM) != 0); /* (better than old way) */ debug(F101,"local","",local); ttopen(ttname,&local,0); break; case 'b': /* set baud */ if (*(xp+1)) fatal("invalid argument bundling"); *xargv++, xargc--; if ((xargc < 1) || (**xargv == '-')) fatal("missing baud"); z = atoi(*xargv); /* Convert to number */ if (chkspd(z) > -1) speed = z; /* Check it */ else fatal("unsupported baud rate"); break; case 'e': /* Extended packet length */ if (*(xp+1)) fatal("invalid argument bundling"); *xargv++, xargc--; if ((xargc < 1) || (**xargv == '-')) fatal("missing length"); z = atoi(*xargv); /* Convert to number */ if (z > 10 && z < maxrps) { rpsiz = urpsiz = z; if (z > 94) rpsiz = 94; /* Fallback if other Kermit can't */ } else fatal("Unsupported packet length"); break; case 'i': /* Treat files as binary */ binary = 1; break; /* cont'd... */ /* ...doarg(), cont'd */ case 'w': /* File warning */ warn = 1; break; case 'q': /* Quiet */ quiet = 1; break; case 'd': /* debug */ debopn("debug.log"); break; case 'p': /* set parity */ if (*(xp+1)) fatal("invalid argument bundling"); *xargv++, xargc--; if ((xargc < 1) || (**xargv == '-')) fatal("missing parity"); switch(x = **xargv) { case 'e': case 'o': case 'm': case 's': parity = x; break; case 'n': parity = 0; break; default: fatal("invalid parity"); } break; case 't': turn = 1; /* Line turnaround handshake */ turnch = XON; /* XON is turnaround character */ duplex = 1; /* Half duplex */ flow = 0; /* No flow control */ break; default: fatal("invalid argument, type 'kermit -h' for help"); } x = *++xp; /* See if options are bundled */ } return(0); } /* Misc */ fatal(msg) char *msg; { /* Fatal error message */ fprintf(stderr,"\r\nFatal: %s\n",msg); tlog(F110,"Fatal:",msg,0l); doexit(BAD_EXIT); /* Exit indicating failure */ } ermsg(msg) char *msg; { /* Print error message */ if (!quiet) fprintf(stderr,"\r\n%s - %s\n",cmerrp,msg); tlog(F110,"Error -",msg,0l); } /* Interactive command parser */ /* Top-Level Keyword Table */ struct keytab cmdtab[] = { "!", XXSHE, 0, "%", XXCOM, CM_INV, "bye", XXBYE, 0, "c", XXCON, CM_INV, "close", XXCLO, 0, "connect", XXCON, 0, "cwd", XXCWD, 0, "dial", XXDIAL, 0, "directory", XXDIR, 0, "echo", XXECH, 0, "exit", XXEXI, 0, "finish", XXFIN, 0, "get", XXGET, 0, "help", XXHLP, 0, "log", XXLOG, 0, "quit", XXQUI, 0, "r", XXREC, CM_INV, "receive", XXREC, 0, "remote", XXREM, 0, "s", XXSEN, CM_INV, "script", XXLOGI, 0, "send", XXSEN, 0, "server", XXSER, 0, "set", XXSET, 0, "show", XXSHO, 0, "space", XXSPA, 0, "statistics", XXSTA, 0, "take", XXTAK, 0 }; int ncmd = (sizeof(cmdtab) / sizeof(struct keytab)); /* Parameter keyword table */ struct keytab prmtab[] = { "baud", XYSPEE, CM_INV, "block-check", XYCHKT, 0, "delay", XYDELA, 0, "duplex", XYDUPL, 0, "end-of-packet", XYEOL, CM_INV, /* moved to send/receive */ "escape-character", XYESC, 0, "file", XYFILE, 0, "flow-control", XYFLOW, 0, "handshake", XYHAND, 0, "incomplete", XYIFD, 0, "line", XYLINE, 0, "modem-dialer", XYMODM, 0, "packet-length", XYLEN, CM_INV, /* moved to send/receive */ "pad-character", XYPADC, CM_INV, /* moved to send/receive */ "padding", XYNPAD, CM_INV, /* moved to send/receive */ "parity", XYPARI, 0, "prompt", XYPROM, 0, "receive", XYRECV, 0, "retry", XYRETR, 0, "send", XYSEND, 0, "speed", XYSPEE, 0, "start-of-packet", XYMARK, CM_INV, /* moved to send/receive */ "terminal", XYTERM, 0, "timeout", XYTIMO, CM_INV /* moved to send/receive */ }; int nprm = (sizeof(prmtab) / sizeof(struct keytab)); /* How many parameters */ /* Remote Command Table */ struct keytab remcmd[] = { "cwd", XZCWD, 0, "delete", XZDEL, 0, "directory", XZDIR, 0, "help", XZHLP, 0, "host", XZHOS, 0, "space", XZSPA, 0, "type", XZTYP, 0, "who", XZWHO, 0 }; int nrmt = (sizeof(remcmd) / sizeof(struct keytab)); struct keytab logtab[] = { "debugging", LOGD, 0, "packets", LOGP, 0, "session", LOGS, 0, "transactions", LOGT, 0 }; int nlog = (sizeof(logtab) / sizeof(struct keytab)); /* Show command arguments */ #define SHPAR 0 /* Parameters */ #define SHVER 1 /* Versions */ struct keytab shotab[] = { "parameters", SHPAR, 0, "versions", SHVER, 0 }; /* C M D I N I -- Initialize the interactive command parser */ cmdini() { #ifdef AMIGA congm(); concb(escape); #endif tlevel = -1; /* Take file level */ cmsetp("C-Kermit>"); /* Set default prompt */ /* Look for init file in home or current directory. */ homdir = zhome(); lp = line; lp[0] = '\0'; if (homdir) { strcpy(lp,homdir); if (lp[0] == '/') strcat(lp,"/"); } strcat(lp,KERMRC); #ifdef AMIGA reqoff(); /* disable requestors */ #endif if ((tfile[0] = fopen(line,"r")) != NULL) { tlevel = 0; debug(F110,"init file",line,0); } if (homdir && (tlevel < 0)) { strcpy(lp,KERMRC); if ((tfile[0] = fopen(line,"r")) != NULL) { tlevel = 0; debug(F110,"init file",line,0); } else { debug(F100,"no init file","",0); } } #ifdef AMIGA reqpop(); /* restore requestors */ #else congm(); /* Get console tty modes */ #endif } /* Display version herald and initial prompt */ herald() { if (!backgrd) printf("%s,%s\nType ? for help\n",versio,ckxsys); } /* T R A P -- Terminal interrupt handler */ trap() { debug(F100,"terminal interrupt...","",0); doexit(GOOD_EXIT); /* Exit indicating success */ } /* S T P T R A P -- Handle SIGTSTP signals */ stptrap() { conres(); /* Reset the console */ #ifdef SIGTSTP kill(0, SIGSTOP); /* If job control, suspend the job */ #else doexit(GOOD_EXIT); /* Probably won't happen otherwise */ #endif concb(); /* Put console back in Kermit mode */ } /* P A R S E R -- Top-level interactive command parser. */ parser() { int xx, cbn; char *cbp; #ifdef AMIGA reqres(); /* restore AmigaDOS requestors */ #endif concb(escape); /* Put console in cbreak mode. */ conint(trap); /* Turn on console terminal interrupts. */ /* sstate becomes nonzero when a command has been parsed that requires some action from the protocol module. Any non-protocol actions, such as local directory listing or terminal emulation, are invoked directly from below. */ if (local && !backgrd) printf("\n"); /*** Temporary kludge ***/ sstate = 0; /* Start with no start state. */ while (sstate == 0) { /* Parse cmds until action requested */ while ((tlevel > -1) && feof(tfile[tlevel])) { /* If end of take */ fclose(tfile[tlevel--]); /* file, close it. */ cmini(ckxech); /* and clear the cmd buffer. */ if (tlevel < 0) { /* Just popped out of cmd files? */ conint(trap); /* Check background stuff again. */ return(0); /* End of init file or whatever. */ } } debug(F101,"tlevel","",tlevel); if (tlevel > -1) { /* If in take file */ cbp = cmdbuf; /* Get the next line. */ cbn = CMDBL; /* Loop to get next command line and all continuation lines from take file. */ again: if (fgets(line,cbn,tfile[tlevel]) == NULL) continue; lp = line; /* Got one, copy it. */ while (*cbp++ = *lp++) if (--cbn < 1) fatal("Command too long for internal buffer"); if (*(cbp - 3) == '\\') { /* Continued on next line? */ cbp -= 3; /* If so, back up pointer, */ goto again; /* go back, get next line. */ } stripq(cmdbuf); /* Strip any quotes from cmd buffer. */ } else { /* No take file, get typein. */ if (!backgrd) prompt(); /* Issue interactive prompt. */ cmini(ckxech); } repars = 1; displa = 0; while (repars) { cmres(); /* Reset buffer pointers. */ xx = cmkey(cmdtab,ncmd,"Command",""); debug(F101,"top-level cmkey","",xx); switch (docmd(xx)) { case -4: /* EOF */ doexit(GOOD_EXIT); /* ...exit successfully */ case -1: /* Reparse needed */ repars = 1; continue; case -2: /* Invalid command given */ if (backgrd) /* if in background, terminate */ fatal("Kermit command error in background execution"); if (tlevel > -1) { /* If in take file, quit */ ermsg("Kermit command error: take file terminated."); fclose(tfile[tlevel]); tlevel--; } cmini(ckxech); /* (fall thru) */ case -3: /* Empty command OK at top level */ default: /* Anything else (fall thru) */ repars = 0; /* No reparse, get new command. */ continue; } } } /* Got an action command; disable terminal interrupts and return start state */ if (!local) connoi(); /* Interrupts off only if remote */ return(sstate); } /* D O E X I T -- Exit from the program. */ doexit(exitstat) int exitstat; { ttclos(); /* Close external line, if any */ if (local) { strcpy(ttname,dftty); /* Restore default tty */ local = dfloc; /* And default remote/local status */ } if (!quiet) conres(); /* Restore console terminal. */ if (!quiet) connoi(); /* Turn off console interrupt traps. */ if (deblog) { /* Close any open logs. */ debug(F100,"Debug Log Closed","",0); *debfil = '\0'; deblog = 0; zclose(ZDFILE); } if (pktlog) { *pktfil = '\0'; pktlog = 0; zclose(ZPFILE); } if (seslog) { *sesfil = '\0'; seslog = 0; zclose(ZSFILE); } if (tralog) { tlog(F100,"Transaction Log Closed","",0l); *trafil = '\0'; tralog = 0; zclose(ZTFILE); } syscleanup(); exit(exitstat); /* Exit from the program. */ } /* B L D L E N -- Make length-encoded copy of string */ char * bldlen(str,dest) char *str, *dest; { int len; len = strlen(str); *dest = tochar(len); strcpy(dest+1,str); return(dest+len+1); } /* S E T G E N -- Construct a generic command */ setgen(type,arg1,arg2,arg3) char type, *arg1, *arg2, *arg3; { char *upstr, *cp; cp = cmdstr; *cp++ = type; *cp = NUL; if (*arg1 != NUL) { upstr = bldlen(arg1,cp); if (*arg2 != NUL) { upstr = bldlen(arg2,upstr); if (*arg3 != NUL) bldlen(arg3,upstr); } } cmarg = cmdstr; debug(F110,"setgen",cmarg,0); return('g'); } /* D O C M D -- Do a command */ /* Returns: -2: user typed an illegal command -1: reparse needed 0: parse was successful (even tho command may have failed). */ docmd(cx) int cx; { int x, y; char *s; switch (cx) { case -4: /* EOF */ if (!quiet && !backgrd) printf("\r\n"); doexit(GOOD_EXIT); case -3: /* Null command */ return(0); case -2: /* Error */ case -1: /* Reparse needed */ return(cx); case XXBYE: /* bye */ if ((x = cmcfm()) < 0) return(x); if (!local) { printf("You have to 'set line' first\n"); return(0); } sstate = setgen('L',"","",""); return(0); case XXCOM: /* comment */ if ((x = cmtxt("Text of comment line","",&s)) < 0) return(x); return(0); case XXCON: /* connect */ if ((x = cmcfm()) < 0) return(x); return(doconect()); case XXCWD: #ifdef AMIGA if (cmtxt("Name of local directory, or carriage return","",&s) < 0) return(-1); /* if no name, just print directory name */ if (*s) { if (chdir(s)) perror(s); cwdf = 1; } if (getcwd(line, sizeof(line)) == NULL) printf("Current directory name not available.\n"); else if (!backgrd) printf("%s\n", line); #else if (cmtxt("Name of local directory, or carriage return",homdir,&s) < 0) return(-1); if (chdir(s)) perror(s); cwdf = 1; system(PWDCMD); #endif return(0); case XXCLO: x = cmkey(logtab,nlog,"Which log to close",""); if (x == -3) { printf("?You must tell which log\n"); return(-2); } if (x < 0) return(x); if ((y = cmcfm()) < 0) return(y); switch (x) { case LOGD: if (deblog == 0) { printf("?Debugging log wasn't open\n"); return(0); } *debfil = '\0'; deblog = 0; return(zclose(ZDFILE)); case LOGP: if (pktlog == 0) { printf("?Packet log wasn't open\n"); return(0); } *pktfil = '\0'; pktlog = 0; return(zclose(ZPFILE)); case LOGS: if (seslog == 0) { printf("?Session log wasn't open\n"); return(0); } *sesfil = '\0'; seslog = 0; return(zclose(ZSFILE)); case LOGT: if (tralog == 0) { printf("?Transaction log wasn't open\n"); return(0); } *trafil = '\0'; tralog = 0; return(zclose(ZTFILE)); default: printf("\n?Unexpected log designator - %ld\n", x); return(0); } case XXDIAL: /* dial number */ if ((x = cmtxt("Number to be dialed","",&s)) < 0) return(x); return(ckdial(s)); case XXDIR: /* directory */ #ifdef AMIGA if ((x = cmtxt("Directory/file specification","",&s)) < 0) return(x); #else #ifdef datageneral if ((x = cmtxt("Directory/file specification","+",&s)) < 0) return(x); #else if ((x = cmtxt("Directory/file specification",".",&s)) < 0) return(x); #endif #endif lp = line; sprintf(lp,"%s %s",DIRCMD,s); system(line); return(0); case XXECH: /* echo */ if ((x = cmtxt("Material to be echoed","",&s)) < 0) return(x); for ( ; *s; s++) { if ((x = *s) == 0134) { /* Convert octal escapes */ s++; /* up to 3 digits */ for (x = y = 0; *s >= '0' && *s <= '7' && y < 3; s++,y++) { x = x * 8 + (int) *s - 48; } s--; } putchar(x); } printf("\n"); return(0); case XXQUI: /* quit, exit */ case XXEXI: if ((x = cmcfm()) > -1) doexit(GOOD_EXIT); else return(x); case XXFIN: /* finish */ if ((x = cmcfm()) < 0) return(x); if (!local) { printf("You have to 'set line' first\n"); return(0); } sstate = setgen('F',"","",""); return(0); case XXGET: /* get */ if (!local) { printf("\nYou have to 'set line' first\n"); return(0); } x = cmtxt("Name of remote file(s), or carriage return","",&cmarg); if ((x == -2) || (x == -1)) return(x); /* If foreign file name omitted, get foreign and local names separately */ x = 0; /* For some reason cmtxt returns 1 */ if (*cmarg == NUL) { if (tlevel > -1) { /* Input is from take file */ if (fgets(line,100,tfile[tlevel]) == NULL) fatal("take file ends prematurely in 'get'"); debug(F110,"take-get 2nd line",line,0); stripq(line); for (x = strlen(line); x > 0 && (line[x-1] == '\n' || line[x-1] == '\r'); x--) line[x-1] = '\0'; cmarg = line; if (fgets(cmdbuf,CMDBL,tfile[tlevel]) == NULL) fatal("take file ends prematurely in 'get'"); stripq(cmdbuf); for (x = strlen(cmdbuf); x > 0 && (cmdbuf[x-1] == '\n' || cmdbuf[x-1] == '\r'); x--) cmdbuf[x-1] = '\0'; if (*cmdbuf == NUL) cmarg2 = line; else cmarg2 = cmdbuf; x = 0; /* Return code */ } else { /* Input is from terminal */ char psave[40]; /* Save old prompt */ cmsavp(psave,40); cmsetp(" Remote file specification: "); /* Make new one */ cmini(ckxech); x = -1; if (!backgrd) prompt(); while (x == -1) { /* Prompt till they answer */ x = cmtxt("Name of remote file(s)","",&cmarg); debug(F111," cmtxt",cmarg,x); } if (x < 0) { cmsetp(psave); return(x); } if (*cmarg == NUL) { /* If user types a bare CR, */ printf("(cancelled)\n"); /* Forget about this. */ cmsetp(psave); /* Restore old prompt, */ return(0); /* and return. */ } strcpy(line,cmarg); /* Make a safe copy */ cmarg = line; cmsetp(" Local name to store it under: "); /* New prompt */ cmini(ckxech); x = -1; if (!backgrd) prompt(); while (x == -1) { /* Again, parse till answered */ x = cmofi("Local file name","",&cmarg2); } if (x == -3) { /* If bare CR, */ printf("(cancelled)\n"); /* escape from this... */ cmsetp(psave); /* Restore old prompt, */ return(0); /* and return. */ } else if (x < 0) return(x); /* Handle parse errors. */ x = -1; /* Get confirmation. */ while (x == -1) x = cmcfm(); cmsetp(psave); /* Restore old prompt. */ } } if (x == 0) { /* Good return from cmtxt or cmcfm, */ sstate = 'r'; /* set start state. */ if (local) displa = 1; } return(x); case XXHLP: /* Help */ x = cmkey(cmdtab,ncmd,"C-Kermit command","help"); return(dohlp(x)); case XXLOG: /* Log */ x = cmkey(logtab,nlog,"What to log",""); if (x == -3) { printf("?You must specify what is to be logged\n"); return(-2); } if (x < 0) return(x); return(dolog(x)); case XXLOGI: /* Send script remote system */ if ((x = cmtxt("Text of login script","",&s)) < 0) return(x); return( login(s) ); /* Return 0=completed, -2=failed */ case XXREC: /* Receive */ cmarg2 = ""; x = cmofi("Name under which to store the file, or CR","",&cmarg2); if ((x == -1) || (x == -2)) return(x); debug(F111,"cmofi cmarg2",cmarg2,x); if ((x = cmcfm()) < 0) return(x); sstate = 'v'; if (local) displa = 1; return(0); case XXREM: /* Remote */ if (!local) { printf("\nYou have to 'set line' first\n"); return(-2); } x = cmkey(remcmd,nrmt,"Remote Kermit server command",""); if (x == -3) { printf("?You must specify a command for the remote server\n"); return(-2); } return(dormt(x)); case XXSEN: /* Send */ cmarg = cmarg2 = ""; if ((x = cmifi("File(s) to send","",&s,&y)) < 0) { if (x == -3) { printf("?A file specification is required\n"); return(-2); } return(x); } nfils = -1; /* Files come from internal list. */ strcpy(line,s); /* Save copy of string just parsed. */ debug(F101,"Send: wild","",y); *cmarg2 = '\0'; /* Initialize send-as name */ if (y == 0) { if ((x = cmtxt("Name to send it with","",&cmarg2)) < 0) return(x); } else { if ((x = cmcfm()) < 0) return(x); } cmarg = line; /* File to send */ debug(F110,"Sending:",cmarg,0); if (*cmarg2 != '\0') debug(F110," as:",cmarg2,0); sstate = 's'; /* Set start state */ if (local) displa = 1; return(0); case XXSER: /* Server */ if ((x = cmcfm()) < 0) return(x); sstate = 'x'; if (local) displa = 1; #ifdef AMIGA reqoff(); /* no DOS requestors while server */ #endif return(0); case XXSET: /* Set */ x = cmkey(prmtab,nprm,"Parameter",""); if (x == -3) { printf("?You must specify a parameter to set\n"); return(-2); } if (x < 0) return(x); return(doprm(x)); /* XXSHE code by H. Fischer; copyright rights assigned to Columbia Univ */ /* Adapted to use getpwuid to find login shell because many systems do not have SHELL in environment, and to use direct calling of shell rather than intermediate system() call. -- H. Fischer */ case XXSHE: /* Local shell command */ { int pid; #ifdef AMIGA if (cmtxt("Command to execute","",&s) < 0) return(-1); #else if (cmtxt("Unix shell command to execute","",&s) < 0) return(-1); #endif conres(); /* Make console normal */ #ifdef AMIGA system(s); #else #ifdef MSDOS zxcmd(s); #else #ifdef vax11c system(s); /* Best we can do for VMS? */ #else /* All Unix systems... */ #ifdef datageneral if (*s == NUL) /* Interactive shell requested? */ #ifdef mvux system("/bin/sh "); #else system("x :cli prefix Kermit_Baby:"); #endif else /* Otherwise, */ system(s); /* Best for aos/vs?? */ #else /* All Unix systems... */ #ifdef apollo if ((pid = vfork()) == 0) { /* Make child quickly */ char *shpath, *shname, *shptr; /* For finding desired shell */ if ((shpath = getenv("SHELL")) == NULL) shpath = "/com/sh"; #else if ((pid = fork()) == 0) { /* Make child */ char *shpath, *shname, *shptr; /* For finding desired shell */ struct passwd *p; extern struct passwd * getpwuid(); extern int getuid(); char *defShel = "/bin/sh"; /* Default */ p = getpwuid( getuid() ); /* Get login data */ if ( p == (struct passwd *) NULL || !*(p->pw_shell) ) shpath = defShel; else shpath = p->pw_shell; #endif shptr = shname = shpath; while (*shptr != '\0') if (*shptr++ == '/') shname = shptr; /* Remove following uid calls if they cause trouble */ #ifdef BSD4 setegid(getgid()); /* Override 4.3BSD csh security */ seteuid(getuid()); /* checks. */ #endif if (*s == NUL) /* Interactive shell requested? */ execl(shpath,shname,"-i",(char *)NULL); /* Yes, do that */ else /* Otherwise, */ execl(shpath,shname,"-c",s,(char *)NULL); /* exec the given command */ exit(BAD_EXIT); } /* Just punt if it didn't work */ else { /* Parent */ int wstat; /* Kermit must wait for child */ SIGTYP (*istat)(), (*qstat)(); istat = signal(SIGINT,SIG_IGN); /* Let the fork handle keyboard */ qstat = signal(SIGQUIT,SIG_IGN); /* interrupts itself... */ while (((wstat = wait((int *)0)) != pid) && (wstat != -1)) /* Wait for fork */ signal(SIGINT,istat); /* Restore interrupts */ signal(SIGQUIT,qstat); } #endif #endif #endif #endif concb(escape); /* Console back in cbreak mode */ return(0); } case XXSHO: /* Show */ x = cmkey(shotab,2,"","parameters"); if (x < 0) return(x); if ((y = cmcfm()) < 0) return(y); switch (x) { case SHPAR: shopar(); break; case SHVER: printf("\nVersions:\n %s\n %s\n",versio,protv); printf(" %s\n",fnsv); printf(" %s\n %s\n",cmdv,userv); printf(" %s for%s\n",ckxv,ckxsys); printf(" %s for%s\n",ckzv,ckzsys); printf(" %s\n",connv); printf(" %s\n %s\n\n",dialv,loginv); break; default: printf("\nNothing to show...\n"); break; } return(0); case XXSPA: /* space */ #ifdef datageneral /* The DG can take an argument after its "space" command. */ if ((x = cmtxt("Confirm, or local directory name","",&s)) < 0) return(x); if (*s == NULL) system(SPACMD); else { char *cp; cp = alloc(strlen(s) + 7); /* For "space *s" */ strcpy(cp,"space "), strcat(cp,s); system(cp); free(cp); } #else if ((x = cmcfm()) < 0) return(x); system(SPACMD); #endif return(0); case XXSTA: /* statistics */ if ((x = cmcfm()) < 0) return(x); return(dostat()); case XXTAK: /* take */ if (tlevel > MAXTAKE-1) { printf("?Take files nested too deeply\n"); return(-2); } if ((y = cmifi("C-Kermit command file","",&s,&x)) < 0) { if (y == -3) { printf("?A file specification is required\n"); return(-2); } else return(y); } if (x != 0) { printf("?Wildcards not allowed in command file name\n"); return(-2); } strcpy(line,s); /* Make a safe copy of the string */ if ((y = cmcfm()) < 0) return(y); if ((tfile[++tlevel] = fopen(line,"r")) == NULL) { perror(line); debug(F110,"Failure to open",line,0); tlevel--; } return(0); default: printf("Not available - %s\n",cmdbuf); return(-2); } } /* D O C O N E C T -- Do the connect command */ /* Note, we don't call this directly from dial, because we need to give */ /* the user a chance to change parameters (e.g. parity) after the */ /* connection is made. */ doconect() { int x; conres(); /* Put console back to normal */ x = conect(); /* Connect */ concb(escape); /* Put console into cbreak mode, */ return(x); /* for more command parsing. */ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* C K U U S R . H -- Symbol definitions for C-Kermit ckuus*.c modules */ /* Author: Frank da Cruz (SY.FDC@CU20B), Columbia University Center for Computing Activities, January 1985. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. */ /* Name of C-Kermit program initialization file. */ #ifdef vax11c #define KERMRC "kermit.ini" #else #define KERMRC ".kermrc" #endif #ifndef AMIGA #ifndef vax11c #ifndef datageneral #ifdef MINIX #include <sys/types.h> #endif #include <pwd.h> #endif #endif #endif /* Values associated with top-level commands, must be 0 or greater. */ #define XXBYE 0 /* BYE */ #define XXCLE 1 /* CLEAR */ #define XXCLO 2 /* CLOSE */ #define XXCON 3 /* CONNECT */ #define XXCPY 4 /* COPY */ #define XXCWD 5 /* CWD (Change Working Directory) */ #define XXDEF 6 /* DEFINE (a command macro) */ #define XXDEL 7 /* (Local) DELETE */ #define XXDIR 8 /* (Local) DIRECTORY */ #define XXDIS 9 /* DISCONNECT */ #define XXECH 10 /* ECHO */ #define XXEXI 11 /* EXIT */ #define XXFIN 12 /* FINISH */ #define XXGET 13 /* GET */ #define XXHLP 14 /* HELP */ #define XXINP 15 /* INPUT */ #define XXLOC 16 /* LOCAL */ #define XXLOG 17 /* LOG */ #define XXMAI 18 /* MAIL */ #define XXMOU 19 /* (Local) MOUNT */ #define XXMSG 20 /* (Local) MESSAGE */ #define XXOUT 21 /* OUTPUT */ #define XXPAU 22 /* PAUSE */ #define XXPRI 23 /* (Local) PRINT */ #define XXQUI 24 /* QUIT */ #define XXREC 25 /* RECEIVE */ #define XXREM 26 /* REMOTE */ #define XXREN 27 /* (Local) RENAME */ #define XXSEN 28 /* SEND */ #define XXSER 29 /* SERVER */ #define XXSET 30 /* SET */ #define XXSHE 31 /* Command for SHELL */ #define XXSHO 32 /* SHOW */ #define XXSPA 33 /* (Local) SPACE */ #define XXSTA 34 /* STATISTICS */ #define XXSUB 35 /* (Local) SUBMIT */ #define XXTAK 36 /* TAKE */ #define XXTRA 37 /* TRANSMIT */ #define XXTYP 38 /* (Local) TYPE */ #define XXWHO 39 /* (Local) WHO */ #define XXDIAL 40 /* (Local) DIAL */ #define XXLOGI 41 /* (Local) SCRIPT */ #define XXCOM 42 /* Comment */ /* SET parameters */ #define XYBREA 0 /* BREAK simulation */ #define XYCHKT 1 /* Block check type */ #define XYDEBU 2 /* Debugging */ #define XYDELA 3 /* Delay */ #define XYDUPL 4 /* Duplex */ #define XYEOL 5 /* End-Of-Line (packet terminator) */ #define XYESC 6 /* Escape character */ #define XYFILE 7 /* File Parameters */ #define XYFILN 0 /* Naming */ #define XYFILT 1 /* Type */ #define XYFILW 2 /* Warning */ #define XYFILD 3 /* ... */ /* empty space to add something */ #define XYFLOW 9 /* Flow Control */ #define XYHAND 10 /* Handshake */ #define XYIFD 11 /* Incomplete File Disposition */ #define XYIMAG 12 /* "Image Mode" */ #define XYINPU 13 /* INPUT command parameters */ #define XYLEN 14 /* Maximum packet length to send */ #define XYLINE 15 /* Communication line to use */ #define XYLOG 16 /* Log file */ #define XYMARK 17 /* Start of Packet mark */ #define XYNPAD 18 /* Amount of padding */ #define XYPADC 19 /* Pad character */ #define XYPARI 20 /* Parity */ #define XYPAUS 21 /* Interpacket pause */ #define XYPROM 22 /* Program prompt string */ #define XYQBIN 23 /* 8th-bit prefix */ #define XYQCTL 24 /* Control character prefix */ #define XYREPT 25 /* Repeat count prefix */ #define XYRETR 26 /* Retry limit */ #define XYSPEE 27 /* Line speed (baud rate) */ #define XYTACH 28 /* Character to be doubled */ #define XYTIMO 29 /* Timeout interval */ #define XYMODM 30 /* Modem type */ #define XYSEND 31 /* SEND parameters, used with some of the above */ #define XYRECV 32 /* RECEIVE parameters, ditto */ #define XYTERM 33 /* Terminal parameters */ /* REMOTE command symbols */ #define XZCPY 0 /* Copy */ #define XZCWD 1 /* Change Working Directory */ #define XZDEL 2 /* Delete */ #define XZDIR 3 /* Directory */ #define XZHLP 4 /* Help */ #define XZHOS 5 /* Host */ #define XZKER 6 /* Kermit */ #define XZLGI 7 /* Login */ #define XZLGO 8 /* Logout */ #define XZMAI 9 /* Mail */ #define XZMOU 10 /* Mount */ #define XZMSG 11 /* Message */ #define XZPRI 12 /* Print */ #define XZREN 13 /* Rename */ #define XZSET 14 /* Set */ #define XZSPA 15 /* Space */ #define XZSUB 16 /* Submit */ #define XZTYP 17 /* Type */ #define XZWHO 18 /* Who */ /* Symbols for logs */ #define LOGD 0 /* Debugging */ #define LOGP 1 /* Packets */ #define LOGS 2 /* Session */ #define LOGT 3 /* Transaction */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Jim Noble at Planning Research Corporation, June 1987. Fixes for */ /* miscellaneous bugs found when reformatting state transititon code in */ /* CKCPRO.W. */ char *wartv = "Wart Version 1A(005) Jan 1988"; /* W A R T */ /* pre-process a lex-like file into a C program. Author:Jeff Damens, Columbia University Center for Computing Activites, 11/84. Copyright (C) 1985, Trustees of Columbia University in the City of New York. Permission is granted to any individual or institution to use, copy, or redistribute this software so long as it is not sold for profit, provided this copyright notice is retained. * input format is: * lines to be copied | %state <state names...> * %% * <state> | <state,state,...> CHAR { actions } * ... * %% */ #include "ckcdeb.h" /* Includes */ #include <stdio.h> #include <ctype.h> #define C_L 014 /* Formfeed */ #define SEP 1 /* Token types */ #define LBRACK 2 #define RBRACK 3 #define WORD 4 #define COMMA 5 /* Storage sizes */ #define MAXSTATES 50 /* max number of states */ #define MAXWORD 50 /* max # of chars/word */ #define SBYTES ((MAXSTATES+7)/8) /* # of bytes for state bitmask */ /* Name of wart function in generated program */ #ifndef FNAME #define FNAME "wart" #endif /* Structure for state information */ struct trans { CHAR states[SBYTES]; /* included states */ int anyst; /* true if this good from any state */ CHAR inchr; /* input character */ int actno; /* associated action */ struct trans *nxt; }; /* next transition */ typedef struct trans *Trans; char *malloc(); /* Returns pointer (not int) */ /* Variables and tables */ int lines,nstates,nacts; char tokval[MAXWORD]; int tbl[MAXSTATES*128]; char *txt1 = "\n#define BEGIN state =\n\nint state = 0;\n\n"; char *fname = FNAME; /* function name goes here */ /* rest of program... */ char *txt2 = "()\n\ {\n\ int c,actno;\n\ extern int tbl[];\n\ while (1) {\n\ c = input();\n\ if ((actno = tbl[c + state*128]) != -1)\n\ switch(actno) {\n"; /* this program's output goes here, followed by final text... */ char *txt3 = "\n }\n }\n\}\n\n"; /* * turn on the bit associated with the given state * */ setstate(state,t) int state; Trans t; { int idx,msk; idx = state/8; /* byte associated with state */ msk = 0x80 >> (state % 8); /* bit mask for state */ t->states[idx] |= msk; } /* * see if the state is involved in the transition * */ teststate(state,t) int state; Trans t; { int idx,msk; idx = state/8; msk = 0x80 >> (state % 8); return(t->states[idx] & msk); } /* * read input from here... * */ Trans rdinput(infp,outfp) FILE *infp,*outfp; { Trans x,rdrules(); lines = 1; /* line counter */ nstates = 0; /* no states */ nacts = 0; /* no actions yet */ fprintf(outfp,"\n%c* WARNING -- This C source program generated by ",'/'); fprintf(outfp,"Wart preprocessor. */\n"); fprintf(outfp,"%c* Do not edit this file; edit the Wart-format ",'/'); fprintf(outfp,"source file instead, */\n"); fprintf(outfp,"%c* and then run it through Wart to produce a new ",'/'); fprintf(outfp,"C source file. */\n\n"); fprintf(outfp,"%c* Wart Version Info: */\n",'/'); fprintf(outfp,"char *wartv = \"%s\";\n\n",wartv); initial(infp,outfp); /* read state names, initial defs */ prolog(outfp); /* write out our initial code */ x = rdrules(infp,outfp); /* read rules */ epilogue(outfp); /* write out epilogue code */ return(x); } /* * initial - read initial definitions and state names. Returns * on EOF or %%. * */ initial(infp,outfp) FILE *infp,*outfp; { int c; char wordbuf[MAXWORD]; while ((c = getc(infp)) != EOF) { if (c == '%') { rdword(infp,wordbuf); if (strcmp(wordbuf,"states") == 0) rdstates(infp,outfp); else if (strcmp(wordbuf,"%") == 0) return; else fprintf(outfp,"%%%s",wordbuf); } else putc(c,outfp); if (c == '\n') lines++; } } /* * boolean function to tell if the given character can be part of * a word. * */ isin(s,c) char *s; int c; { for (; *s != '\0'; s++) if (*s == c) return(1); return(0); } isword(c) int c; { static char special[] = ".%_-$@"; /* these are allowable */ return(isalnum(c) || isin(special,c)); } /* * read the next word into the given buffer. * */ rdword(fp,buf) FILE *fp; char *buf; { int len = 0,c; while (isword(c = getc(fp)) && ++len < MAXWORD) *buf++ = c; *buf++ = '\0'; /* tie off word */ ungetc(c,fp); /* put break char back */ } /* * read state names, up to a newline. * */ rdstates(fp,ofp) FILE *fp,*ofp; { int c; char wordbuf[MAXWORD]; while ((c = getc(fp)) != EOF && c != '\n') { if (isspace(c) || c == C_L) continue; /* skip whitespace */ ungetc(c,fp); /* put char back */ rdword(fp,wordbuf); /* read the whole word */ enter(wordbuf,++nstates); /* put into symbol tbl */ fprintf(ofp,"#define %s %d\n",wordbuf,nstates); } lines++; } /* * allocate a new, empty transition node * */ Trans newtrans() { Trans new; int i; new = (Trans) malloc(sizeof (struct trans)); for (i=0; i<SBYTES; i++) new->states[i] = 0; new->anyst = 0; new->nxt = NULL; return(new); } /* * read all the rules. * */ Trans rdrules(fp,out) FILE *fp,*out; { Trans head,cur,prev; int curtok,i; head = cur = NULL; while ((curtok = gettoken(fp)) != SEP) switch(curtok) { case LBRACK: if (cur == NULL) cur = newtrans(); else fatal("duplicate state list"); statelist(fp,cur);/* set states */ continue; /* prepare to read char */ case WORD: if (strlen(tokval) != 1) fatal("multiple chars in state"); if (cur == NULL) { cur = newtrans(); cur->anyst = 1; } cur->actno = ++nacts; cur->inchr = tokval[0]; if (head == NULL) head = cur; else prev->nxt = cur; prev = cur; cur = NULL; copyact(fp,out,nacts); break; default: fatal("bad input format"); } return(head); } /* * read a list of (comma-separated) states, set them in the * given transition. * */ statelist(fp,t) FILE *fp; Trans t; { int curtok,sval; curtok = COMMA; while (curtok != RBRACK) { if (curtok != COMMA) fatal("missing comma"); if ((curtok = gettoken(fp)) != WORD) fatal("missing state name"); if ((sval = lkup(tokval)) == -1) { fprintf(stderr,"state %s undefined\n",tokval); fatal("undefined state"); } setstate(sval,t); curtok = gettoken(fp); } } /* * copy an action from the input to the output file * */ copyact(inp,outp,actno) FILE *inp,*outp; int actno; { int c,bcnt; fprintf(outp,"case %d:\n",actno); while (c = getc(inp), (isspace(c) || c == C_L)) if (c == '\n') lines++; if (c == '{') { bcnt = 1; fputs(" {",outp); while (bcnt > 0 && (c = getc(inp)) != EOF) { if (c == '{') bcnt++; else if (c == '}') bcnt--; else if (c == '\n') lines++; putc(c,outp); } if (bcnt > 0) fatal("action doesn't end"); } else { while (c != '\n' && c != EOF) { putc(c,outp); c = getc(inp); } lines++; } fprintf(outp,"\n break;\n"); } /* * find the action associated with a given character and state. * returns -1 if one can't be found. * */ faction(hd,state,chr) Trans hd; int state,chr; { while (hd != NULL) { if (hd->anyst || teststate(state,hd)) if (hd->inchr == '.' || hd->inchr == chr) return(hd->actno); hd = hd->nxt; } return(-1); } /* * empty the table... * */ emptytbl() { int i; for (i=0; i<nstates*128; i++) tbl[i] = -1; } /* * add the specified action to the output for the given state and chr. * */ addaction(act,state,chr) int act,state,chr; { tbl[state*128 + chr] = act; } writetbl(fp) FILE *fp; { warray(fp,"tbl",tbl,128*(nstates+1)); } /* * write an array to the output file, given its name and size. * */ warray(fp,nam,cont,siz) FILE *fp; char *nam; int cont[],siz; { int i; fprintf(fp,"int %s[] = {\n",nam); for (i = 0; i < siz; ) { fprintf(fp,"%2d, ",cont[i]); if ((++i % 16) == 0) putc('\n',fp); } fprintf(fp,"};\n"); } main(a\J��^J��_J��`J��aJ��bJ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rgc,argv) int argc; char *argv[]; { Trans head; int state,c; FILE *infile,*outfile; if (argc > 1) { if ((infile = fopen(argv[1],"r")) == NULL) { fprintf(stderr,"Can't open %s\n",argv[1]); fatal("unreadable input file"); } } else infile = stdin; if (argc > 2) { if ((outfile = fopen(argv[2],"w")) == NULL) { fprintf(stderr,"Can't write to %s\n",argv[2]); fatal("bad output file"); } } else outfile = stdout; clrhash(); /* empty hash table */ head = rdinput(infile,outfile); /* read input file */ emptytbl(); /* empty our tables */ for (state = 0; state <= nstates; state++) for (c = 1; c < 128; c++) addaction(faction(head,state,c),state,c); /* find actions, add to tbl */ writetbl(outfile); copyrest(infile,outfile); printf("%d states, %d actions\n",nstates,nacts); #ifdef undef for (state = 1; state <= nstates; state ++) for (c = 1; c < 128; c++) if (tbl[state*128 + c] != -1) printf("state %d, chr %d, act %d\n", state,c,tbl[state*128 + c]); #endif exit(GOOD_EXIT); } /* * fatal error handler * */ fatal(msg) char *msg; { fprintf(stderr,"error in line %d: %s\n",lines,msg); exit(BAD_EXIT); } prolog(outfp) FILE *outfp; { int c; while ((c = *txt1++) != '\0') putc(c,outfp); while ((c = *fname++) != '\0') putc(c,outfp); while ((c = *txt2++) != '\0') putc(c,outfp); } epilogue(outfp) FILE *outfp; { int c; while ((c = *txt3++) != '\0') putc(c,outfp); } copyrest(in,out) FILE *in,*out; { int c; while ((c = getc(in)) != EOF) putc(c,out); } /* * gettoken - returns token type of next token, sets tokval * to the string value of the token if appropriate. * */ gettoken(fp) FILE *fp; { int c; while (1) { /* loop if reading comments... */ do { c = getc(fp); if (c == '\n') lines++; } while ((isspace(c) || c == C_L)); /* skip whitespace */ switch(c) { case EOF: return(SEP); case '%': if ((c = getc(fp)) == '%') return(SEP); tokval[0] = '%'; tokval[1] = c; rdword(fp,tokval+2); return(WORD); case '<': return(LBRACK); case '>': return(RBRACK); case ',': return(COMMA); case '/': if ((c = getc(fp)) == '*') { rdcmnt(fp); /* skip over the comment */ continue; } /* and keep looping */ else { ungetc(c,fp); /* put this back into input */ c = '/'; } /* put character back, fall thru */ default: if (isword(c)) { ungetc(c,fp); rdword(fp,tokval); return(WORD); } else fatal("Invalid character in input"); } } } /* * skip over a comment * */ rdcmnt(fp) FILE *fp; { int c,star,prcnt; prcnt = star = 0; /* no star seen yet */ while (!((c = getc(fp)) == '/' && star)) { if (c == EOF || (prcnt && c == '%')) fatal("Unterminated comment"); prcnt = (c == '%'); star = (c == '*'); if (c == '\n') lines++; } } /* * symbol table management for wart * * entry points: * clrhash - empty hash table. * enter - enter a name into the symbol table * lkup - find a name's value in the symbol table. * */ #define HASHSIZE 101 /* # of entries in hash table */ struct sym { char *name; /* symbol name */ int val; /* value */ struct sym *hnxt; } /* next on collision chain */ *htab[HASHSIZE]; /* the hash table */ /* * empty the hash table before using it... * */ clrhash() { int i; for (i=0; i<HASHSIZE; i++) htab[i] = NULL; } /* * compute the value of the hash for a symbol * */ hash(name) char *name; { int sum; for (sum = 0; *name != '\0'; name++) sum += (sum + *name); sum %= HASHSIZE; /* take sum mod hashsize */ if (sum < 0) sum += HASHSIZE; /* disallow negative hash value */ return(sum); } /* * make a private copy of a string... * */ char * copy(s) char *s; { char *new; new = (char *) malloc(strlen(s) + 1); strcpy(new,s); return(new); } /* * enter state name into the hash table * */ enter(name,svalue) char *name; int svalue; { int h; struct sym *cur; if (lkup(name) != -1) { fprintf(stderr,"state %s appears twice...\n"); exit(BAD_EXIT); } h = hash(name); cur = (struct sym *)malloc(sizeof (struct sym)); cur->name = copy(name); cur->val = svalue; cur->hnxt = htab[h]; htab[h] = cur; } /* * find name in the symbol table, return its value. Returns -1 * if not found. * */ lkup(name) char *name; { struct sym *cur; for (cur = htab[hash(name)]; cur != NULL; cur = cur->hnxt) if (strcmp(cur->name,name) == 0) return(cur->val); return(-1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������a .�������������..������������b Ack.m4��������c Hanoi.m4������d Hash.m4�������e M4.out��������f Makefile������g READ_ME�������h Sqroot.m4�����i String.m4�����j Test.m4�������k eval.c��������l expr.c��������m extr.h��������n look.c��������o main.c��������p mdef.h��������q misc.c��������r patchlevel.h��s serv.c����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������define(ack, `ifelse($1,0,incr($2),$2,0,`ack(DECR($1),1)', `ack(DECR($1), ack($1,DECR($2)))')') �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������define(hanoi, `trans(A, B, C, $1)') define(moved,`move disk from $1 to $2 ') define(trans, `ifelse($4,1,`moved($1,$2)', `trans($1,$3,$2,DECR($4))moved($1,$2)trans($3,$2,$1,DECR($4))')') �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������dnl This probably will not run on any m4 that cannot dnl handle char constants in eval. dnl changequote(<,>) define(HASHVAL,99) dnl define(hash,<eval(str(substr($1,1),0)%HASHVAL)>) dnl define(str, <ifelse($1,",$2, <str(substr(<$1>,1),<eval($2+'substr($1,0,1)')>)>) >) dnl define(KEYWORD,<$1,hash($1),>) dnl define(TSTART, <struct prehash { char *keyword; int hashval; } keytab[] = {>) dnl define(TEND,< "",0 };>) dnl �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # test file for mp (not comprehensive) # # v7 m4 does not have `decr'. # # # include string macros # # # create some fortrash strings for an even uglier language # integer TEXT(5) data TEXT(1)/LETt/ data TEXT(2)/LETe/ data TEXT(3)/LETx/ data TEXT(4)/LETt/ data TEXT(5)/EOS/ integer DATA(5) data DATA(1)/LETd/ data DATA(2)/LETa/ data DATA(3)/LETt/ data DATA(4)/LETa/ data DATA(5)/EOS/ integer BEGIN(6) data BEGIN(1)/LETb/ data BEGIN(2)/LETe/ data BEGIN(3)/LETg/ data BEGIN(4)/LETi/ data BEGIN(5)/LETn/ data BEGIN(6)/EOS/ integer END(4) data END(1)/LETe/ data END(2)/LETn/ data END(3)/LETd/ data END(4)/EOS/ integer IF(3) data IF(1)/LETi/ data IF(2)/LETf/ data IF(3)/EOS/ integer THEN(5) data THEN(1)/LETt/ data THEN(2)/LETh/ data THEN(3)/LETe/ data THEN(4)/LETn/ data THEN(5)/EOS/ integer ELSE(5) data ELSE(1)/LETe/ data ELSE(2)/LETl/ data ELSE(3)/LETs/ data ELSE(4)/LETe/ data ELSE(5)/EOS/ integer CASE(5) data CASE(1)/LETc/ data CASE(2)/LETa/ data CASE(3)/LETs/ data CASE(4)/LETe/ data CASE(5)/EOS/ integer REPEAT(7) data REPEAT(1)/LETr/ data REPEAT(2)/LETe/ data REPEAT(3)/LETp/ data REPEAT(4)/LETe/ data REPEAT(5)/LETa/ data REPEAT(6)/LETt/ data REPEAT(7)/EOS/ integer WHILE(6) data WHILE(1)/LETw/ data WHILE(2)/LETh/ data WHILE(3)/LETi/ data WHILE(4)/LETl/ data WHILE(5)/LETe/ data WHILE(6)/EOS/ integer DEFAULT(8) data DEFAULT(1)/LETd/ data DEFAULT(2)/LETe/ data DEFAULT(3)/LETf/ data DEFAULT(4)/LETa/ data DEFAULT(5)/LETu/ data DEFAULT(6)/LETl/ data DEFAULT(7)/LETt/ data DEFAULT(8)/EOS/ integer UNTIL(6) data UNTIL(1)/LETu/ data UNTIL(2)/LETn/ data UNTIL(3)/LETt/ data UNTIL(4)/LETi/ data UNTIL(5)/LETl/ data UNTIL(6)/EOS/ integer FUNCTION(9) data FUNCTION(1)/LETf/ data FUNCTION(2)/LETu/ data FUNCTION(3)/LETn/ data FUNCTION(4)/LETc/ data FUNCTION(5)/LETt/ data FUNCTION(6)/LETi/ data FUNCTION(7)/LETo/ data FUNCTION(8)/LETn/ data FUNCTION(9)/EOS/ integer PROCEDURE(10) data PROCEDURE(1)/LETp/ data PROCEDURE(2)/LETr/ data PROCEDURE(3)/LETo/ data PROCEDURE(4)/LETc/ data PROCEDURE(5)/LETe/ data PROCEDURE(6)/LETd/ data PROCEDURE(7)/LETu/ data PROCEDURE(8)/LETr/ data PROCEDURE(9)/LETe/ data PROCEDURE(10)/EOS/ integer EXTERNAL(9) data EXTERNAL(1)/LETe/ data EXTERNAL(2)/LETx/ data EXTERNAL(3)/LETt/ data EXTERNAL(4)/LETe/ data EXTERNAL(5)/LETr/ data EXTERNAL(6)/LETn/ data EXTERNAL(7)/LETa/ data EXTERNAL(8)/LETl/ data EXTERNAL(9)/EOS/ integer FORWARD(8) data FORWARD(1)/LETf/ data FORWARD(2)/LETo/ data FORWARD(3)/LETr/ data FORWARD(4)/LETw/ data FORWARD(5)/LETa/ data FORWARD(6)/LETr/ data FORWARD(7)/LETd/ data FORWARD(8)/EOS/ integer TYPE(5) data TYPE(1)/LETt/ data TYPE(2)/LETy/ data TYPE(3)/LETp/ data TYPE(4)/LETe/ data TYPE(5)/EOS/ integer VAR(4) data VAR(1)/LETv/ data VAR(2)/LETa/ data VAR(3)/LETr/ data VAR(4)/EOS/ integer CONST(6) data CONST(1)/LETc/ data CONST(2)/LETo/ data CONST(3)/LETn/ data CONST(4)/LETs/ data CONST(5)/LETt/ data CONST(6)/EOS/ integer PROGRAM(8) data PROGRAM(1)/LETp/ data PROGRAM(2)/LETr/ data PROGRAM(3)/LETo/ data PROGRAM(4)/LETg/ data PROGRAM(5)/LETr/ data PROGRAM(6)/LETa/ data PROGRAM(7)/LETm/ data PROGRAM(8)/EOS/ integer INPUT(6) data INPUT(1)/LETi/ data INPUT(2)/LETn/ data INPUT(3)/LETp/ data INPUT(4)/LETu/ data INPUT(5)/LETt/ data INPUT(6)/EOS/ integer OUTPUT(7) data OUTPUT(1)/LETo/ data OUTPUT(2)/LETu/ data OUTPUT(3)/LETt/ data OUTPUT(4)/LETp/ data OUTPUT(5)/LETu/ data OUTPUT(6)/LETt/ data OUTPUT(7)/EOS/ # defined # # v7 m4 does this wrong. The right output is # this is A vEry lon sEntEnCE # see m4 documentation for translit. # this is A vEry lon sEntEnCE # # include towers-of-hanoi # # # some reasonable set of disks # move disk from A to C move disk from A to B move disk from C to B move disk from A to C move disk from B to A move disk from B to C move disk from A to C move disk from A to B move disk from C to B move disk from C to A move disk from B to A move disk from C to B move disk from A to C move disk from A to B move disk from C to B move disk from A to C move disk from B to A move disk from B to C move disk from A to C move disk from B to A move disk from C to B move disk from C to A move disk from B to A move disk from B to C move disk from A to C move disk from A to B move disk from C to B move disk from A to C move disk from B to A move disk from B to C move disk from A to C move disk from A to B move disk from C to B move disk from C to A move disk from B to A move disk from C to B move disk from A to C move disk from A to B move disk from C to B move disk from C to A move disk from B to A move disk from B to C move disk from A to C move disk from B to A move disk from C to B move disk from C to A move disk from B to A move disk from C to B move disk from A to C move disk from A to B move disk from C to B move disk from A to C move disk from B to A move disk from B to C move disk from A to C move disk from A to B move disk from C to B move disk from C to A move disk from B to A move disk from C to B move disk from A to C move disk from A to B move disk from C to B # # include ackermann's function # # # something like (3,3) will blow away un*x m4. # 9 # # include a square_root function for fixed nums # # # some square roots. # 3 10 negative-square-root 146 # # some textual material for enjoyment. # [taken from the 'Clemson University Computer Newsletter', September 1981, pp. 6-7] I am a wizard in the magical Kingdom of Transformation and I slay dragons for a living. Actually, I am a systems programmer. One of the problems with systems programming is explaining to non-computer enthusiasts what that is. All of the terms I use to describe my job are totally meaningless to them. Usually my response to questions about my work is to say as little as possible. For instance, if someone asks what happened at work this week, I say "Nothing much" and then I change the subject. With the assistance of my brother, a mechanical engineer, I have devised an analogy that everyone can understand. The analogy describes the "Kingdom of Transformation" where travelers wander and are magically transformed. This kingdom is the computer and the travelers are information. The purpose of the computer is to change information to a more meaningful forma. The law of conservation applies here: The computer never creates and never intentionally destroys data. With no further ado, let us travel to the Kingdom of Transformation: In a land far, far away, there is a magical kingdom called the Kingdom of Transformation. A king rules over this land and employs a Council of Wizardry. The main purpose of this kingdom is to provide a way for neighboring kingdoms to transform citizens into more useful citizens. This is done by allowing the citizens to enter the kingdom at one of its ports and to travel any of the many routes in the kingdom. They are magically transformed along the way. The income of the Kingdom of Transformation comes from the many toll roads within its boundaries. The Kingdom of Transformation was created when several kingdoms got together and discovered a mutual need for new talents and abilities for citizens. They employed CTK, Inc. (Creators of Transformation, Inc.) to create this kingdom. CTK designed the country, its transportation routes, and its laws of transformation, and created the major highway system. Hazards ======= Because magic is not truly controllable, CTK invariably, but unknowingly, creates dragons. Dragons are huge fire-breathing beasts which sometimes injure or kill travelers. Fortunately, they do not travel, but always remain near their den. Other hazards also exist which are potentially harmful. As the roads become older and more weatherbeaten, pot-holes will develop, trees will fall on travelers, etc. CTK maintenance men are called to fix these problems. Wizards ======= The wizards play a major role in creating and maintaining the kingdom but get little credit for their work because it is performed secretly. The wizards do not wan the workers or travelers to learn their incantations because many laws would be broken and chaos would result. CTK's grand design is always general enough to be applicable in many different situatinJ��pJ��qJ��rJ��sJ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ons. As a result, it is often difficult to use. The first duty of the wizards is to tailor the transformation laws so as to be more beneficial and easier to use in their particular environment. After creation of the kingdom, a major duty of the wizards is to search for and kill dragons. If travelers do not return on time or if they return injured, the ruler of the country contacts the wizards. If the wizards determine that the injury or death occurred due to the traveler's negligence, they provide the traveler's country with additional warnings. If not, they must determine if the cause was a road hazard or a dragon. If the suspect a road hazard, they call in a CTK maintenance man to locate the hazard and to eliminate it, as in repairing the pothole in the road. If they think that cause was a dragon, then they must find and slay it. The most difficult part of eliminating a dragon is finding it. Sometimes the wizard magically knows where the dragon's lair it, but often the wizard must send another traveler along the same route and watch to see where he disappears. This sounds like a failsafe method for finding dragons (and a suicide mission for thr traveler) but the second traveler does not always disappear. Some dragons eat any traveler who comes too close; others are very picky. The wizards may call in CTK who designed the highway system and transformation laws to help devise a way to locate the dragon. CTK also helps provide the right spell or incantation to slay the dragon. (There is no general spell to slay dragons; each dragon must be eliminated with a different spell.) Because neither CTK nor wizards are perfect, spells to not always work correctly. At best, nothing happens when the wrong spell is uttered. At worst, the dragon becomes a much larger dragon or multiplies into several smaller ones. In either case, new spells must be found. If all existing dragons are quiet (i.e. have eaten sufficiently), wizards have time to do other things. They hide in castles and practice spells and incatations. They also devise shortcuts for travelers and new laws of transformation. Changes in the Kingdom ====================== As new transformation kingdoms are created and old ones are maintained, CTK, Inc. is constantly learning new things. It learns ways to avoid creating some of the dragons that they have previously created. It also discovers new and better laws of transformation. As a result, CTK will periodically create a new grand design which is far better than the old. The wizards determine when is a good time to implement this new design. This is when the tourist season is slow or when no important travelers (VIPs) are to arrive. The kingdom must be closed for the actual implementation and is leter reopened as a new and better place to go. A final question you might ask is what happens when the number of tourists becomes too great for the kingdom to handle in a reasonable period of time (i.e., the tourist lines at the ports are too long). The Kingdom of Transformation has three options: (1) shorten the paths that a tourist must travel, or (2) convince CTK to develop a faster breed of horses so that the travelers can finish sooner, or (3) annex more territories so that the kingdom can handle more travelers. Thus ends the story of the Kingdom of Transformation. I hope this has explained my job to you: I slay dragons for a living. # #should do an automatic undivert.. # diversion #1 diversion #2 diversion #3 diversion #4 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for M4 # -DEXTENDED #if you like to get paste & spaste macros. # -DVOID #if your C compiler does NOT support void. # -DGETOPT #if you STILL do not have getopt in your library. # -DDUFFCP #if you do not have fast memcpy in your library. # CFLAGS = -DEXTENDED -O -D_POSIX_SOURCE -D_MINIX OBJ = main.o eval.o serv.o look.o misc.o expr.o INCL = mdef.h extr.h patchlevel.h all: m4 m4: $(OBJ) $(INCL) cc -i -o m4 $(OBJ) install -S 4kw m4 install: /usr/bin/m4 /usr/bin/m4: m4 install -cs -o bin m4 $@ clean: rm -f *.o m4 core *bak ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������This code *is* PD. You (public) have all the rights to the code. [But this also means you (singular) do not have any *extra* rights to the code, hence it is impossible for you to restrict the use and distribution of this code (original) in any way.] Dedication: This posting is a dedication to an old 750 that started out running 4.1BSD and had 1.5 meg, 1 dz11, and 2 Rk07 drives. It was named yetti [sic] by accident, and was managed by the author until its retirement two years ago. [the name yetti now identifies a different machine] If you have any important fixes and/or speed improvements, I am much interested. I am also interested in hearing about any unique applica- tions of M4. I am NOT interested in gratuitous hacks or "neat" kitchen-sink features. Author: Usenet: uunet!utai!yunexus!oz || oz@nexus.yorku.ca Bitnet: oz@yulibra.BITNET Phonet: [416] 736-5257 x 3976 enjoy. oz Testing: This directory contains a test file called test.m4. To use it, type m4 <Test.m4 >out The output file, out, should be identical to M4.out ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������define(square_root, `ifelse(eval($1<0),1,negative-square-root, `square_root_aux($1, 1, eval(($1+1)/2))')') define(square_root_aux, `ifelse($3, $2, $3, $3, eval($1/$2), $3, `square_root_aux($1, $3, eval(($3+($1/$3))/2))')') ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ define(string,`integer $1(len(substr($2,1))) str($1,substr($2,1),0) data $1(len(substr($2,1)))/EOS/ ') define(str,`ifelse($2,",,data $1(incr($3))/`LET'substr($2,0,1)/ `str($1,substr($2,1),incr($3))')') ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# # test file for mp (not comprehensive) # # v7 m4 does not have `decr'. # define(DECR,`eval($1-1)') # # include string macros # include(String.m4) # # create some fortrash strings for an even uglier language # string(TEXT, "text") string(DATA, "data") string(BEGIN, "begin") string(END, "end") string(IF, "if") string(THEN, "then") string(ELSE, "else") string(CASE, "case") string(REPEAT, "repeat") string(WHILE, "while") string(DEFAULT, "default") string(UNTIL, "until") string(FUNCTION, "function") string(PROCEDURE, "procedure") string(EXTERNAL, "external") string(FORWARD, "forward") string(TYPE, "type") string(VAR, "var") string(CONST, "const") string(PROGRAM, "program") string(INPUT, "input") string(OUTPUT, "output") # divert(2) diversion #1 divert(3) diversion #2 divert(4) diversion #3 divert(5) diversion #4 divert(0) define(abc,xxx) ifdef(`abc',defined,undefined) # # v7 m4 does this wrong. The right output is # this is A vEry lon sEntEnCE # see m4 documentation for translit. # translit(`this is a very long sentence', abcdefg, ABCDEF) # # include towers-of-hanoi # include(Hanoi.m4) # # some reasonable set of disks # hanoi(6) # # include ackermann's function # include(Ack.m4) # # something like (3,3) will blow away un*x m4. # ack(2,3) # # include a square_root function for fixed nums # include(Sqroot.m4) # # some square roots. # square_root(15) square_root(100) square_root(-4) square_root(21372) # # some textual material for enjoyment. # [taken from the 'Clemson University Computer Newsletter', September 1981, pp. 6-7] I am a wizard in the magical Kingdom of Transformation and I slay dragons for a living. Actually, I am a systems programmer. One of the problems with systems programming is explaining to non-computer enthusiasts what that is. All of the terms I use to describe my job are totally meaningless to them. Usually my response to questions about my work is to say as little as possible. For instance, if someone asks what happened at work this week, I say "Nothing much" and then I change the subject. With the assistance of my brother, a mechanical engineer, I have devised an analogy that everyone can understand. The analogy describes the "Kingdom of Transformation" where travelers wander and are magically transformed. This kingdom is the computer and the travelers are information. The purpose of the computer is to change information to a more meaningful forma. The law of conservation applies here: The computer never creates and never intentionally destroys data. With no further ado, let us travel to the Kingdom of Transformation: In a land far, far away, there is a magical kingdom called the Kingdom of Transformation. A king rules over this land and employs a Council of Wizardry. The main purpose of this kingdom is to provide a way for neighboring kingdoms to transform citizens into more useful citizens. This is done by allowing the citizens to enter the kingdom at one of its ports and to travel any of the many routes in the kingdom. They are magically transformed along the way. The income of the Kingdom of Transformation comes from the many toll roads within its boundaries. The Kingdom of Transformation was created when several kingdoms got together and discovered a mutual need for new talents and abilities for citizens. They employed CTK, Inc. (Creators of Transformation, Inc.) to create this kingdom. CTK designed the country, its transportation routes, and its laws of transformation, and created the major highway system. Hazards ======= Because magic is not truly controllable, CTK invariably, but unknowingly, creates dragons. Dragons are huge fire-breathing beasts which sometimes injure or kill travelers. Fortunately, they do not travel, but always remain near their den. Other hazards also exist which are potentially harmful. As the roads become older and more weatherbeaten, pot-holes will develop, trees will fall on travelers, etc. CTK maintenance men are called to fix these problems. Wizards ======= The wizards play a major role in creating and maintaining the kingdom but get little credit for their work because it is performed secretly. The wizards do not wan the workers or travelers to learn their incantations because many laws would be broken and chaos would result. CTK's grand design is always general enough to be applicable in many different situations. As a result, it is often difficult to use. The first duty of the wizards is to tailor the transformation laws so as to be more beneficial and easier to use in their particular environment. After creation of the kingdom, a major duty of the wizards is to search for and kill dragons. If travelers do not return on time or if they return injured, the ruler of the country contacts the wizards. If the wizards determine that the injury or death occurred due to the traveler's negligence, they provide the traveler's country with additional warnings. If not, they must determine if the cause was a road hazard or a dragon. If the suspect a road hazard, they call in a CTK maintenance man to locate the hazard and to eliminate it, as in repairing the pothole in the road. If they think that cause was a dragon, then they must find and slay it. The most difficult part of eliminating a dragon is finding it. Sometimes the wizard magically knows where the dragon's lair it, but often the wizard must send another traveler along the same route and watch to see where he disappears. This sounds like a failsafe method for finding dragons (and a suicide mission for thr traveler) but the second traveler does not always disappear. Some dragons eat any traveler who comes too close; others are very picky. The wizards may call in CTK who designed the highway system and transformation laws to help devise a way to locate the dragon. CTK also helps provide the right spell or incantation to slay the dragon. (There is no general spell to slay dragons; each dragon must be eliminated with a different spell.) Because neither CTK nor wizards are perfect, spells to not always work correctly. At best, nothing happens when the wrong spell is uttered. At worst, the dragon becomes a much larger dragon or multiplies into several smaller ones. In either case, new spells must be found. If all existing dragons are quiet (i.e. have eaten sufficiently), wizards have time to do other things. They hide in castles and practice spells and incatations. They also devise shortcuts for travelers and new laws of transformation. Changes in the Kingdom ====================== As new transformation kingdoms are created and old ones are maintained, CTK, Inc. is constantly learning new things. It learns ways to avoid creating some of the dragons that they have previously created. It also discovers new and better laws of transformation. As a result, CTK will periodically create a new grand design which is far better than the old. The wizards determine when is a good time to implement this new design. This is when the tourist season is slow or when no important travelers (VIPs) are to arrive. The kingdom must be closed for the actual implementation and is leter reopened as a new and better place to go. A final question you might ask is what happens when the number of tourists becomes too great for the kingdom to handle in a reasonable period of time (i.e., the tourist lines at the ports are too long). The Kingdom of Transformation has three options: (1) shorten the paths that a tourist must travel, or (2) convince CTK to develop a faster breed of horses so that the travelers can finish sooner, or (3) annex more territories so that the kingdom can handle more travelers. Thus ends the story of the Kingdom of Transformation. I hope this has explained my job to you: I slay dragons for a living. # #should do an automatic undivert.. # ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������J��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * eval.c * Facility: m4 macro processor * by: oz */ #include "mdef.h" #include "extr.h" /* * eval - evaluate built-in macros. * argc - number of elements in argv. * argv - element vector : * argv[0] = definition of a user * macro or nil if built-in. * argv[1] = name of the macro or * built-in. * argv[2] = parameters to user-defined * . macro or built-in. * . * * Note that the minimum value for argc is 3. A call in the form * of macro-or-builtin() will result in: * argv[0] = nullstr * argv[1] = macro-or-builtin * argv[2] = nullstr * */ void eval (argv, argc, td) register char *argv[]; register int argc; register int td; { register int c, n; static int sysval; #ifdef DEBUG printf("argc = %d\n", argc); for (n = 0; n < argc; n++) printf("argv[%d] = %s\n", n, argv[n]); #endif /* * if argc == 3 and argv[2] is null, * then we have macro-or-builtin() type call. * We adjust argc to avoid further checking.. * */ if (argc == 3 && !*(argv[2])) argc--; switch (td & ~STATIC) { case DEFITYPE: if (argc > 2) dodefine(argv[2], (argc > 3) ? argv[3] : null); break; case PUSDTYPE: if (argc > 2) dopushdef(argv[2], (argc > 3) ? argv[3] : null); break; case DUMPTYPE: dodump(argv, argc); break; case EXPRTYPE: /* * doexpr - evaluate arithmetic expression * */ if (argc > 2) pbnum(expr(argv[2])); break; case IFELTYPE: if (argc > 4) doifelse(argv, argc); break; case IFDFTYPE: /* * doifdef - select one of two alternatives based * on the existence of another definition */ if (argc > 3) { if (lookup(argv[2]) != nil) pbstr(argv[3]); else if (argc > 4) pbstr(argv[4]); } break; case LENGTYPE: /* * dolen - find the length of the argument * */ if (argc > 2) pbnum((argc > 2) ? strlen(argv[2]) : 0); break; case INCRTYPE: /* * doincr - increment the value of the argument * */ if (argc > 2) pbnum(atoi(argv[2]) + 1); break; case DECRTYPE: /* * dodecr - decrement the value of the argument * */ if (argc > 2) pbnum(atoi(argv[2]) - 1); break; #if unix || vms case SYSCTYPE: /* * dosys - execute system command * */ if (argc > 2) sysval = system(argv[2]); break; case SYSVTYPE: /* * dosysval - return value of the last system call. * */ pbnum(sysval); break; #endif case INCLTYPE: if (argc > 2) if (!doincl(argv[2])) { fprintf(stderr,"m4: %s: ",argv[2]); error("cannot open for read."); } break; case SINCTYPE: if (argc > 2) (void) doincl(argv[2]); break; #ifdef EXTENDED case PASTTYPE: if (argc > 2) if (!dopaste(argv[2])) { fprintf(stderr,"m4: %s: ",argv[2]); error("cannot open for read."); } break; case SPASTYPE: if (argc > 2) (void) dopaste(argv[2]); break; #endif case CHNQTYPE: dochq(argv, argc); break; case CHNCTYPE: dochc(argv, argc); break; case SUBSTYPE: /* * dosub - select substring * */ if (argc > 3) dosub(argv,argc); break; case SHIFTYPE: /* * doshift - push back all arguments except the * first one (i.e. skip argv[2]) */ if (argc > 3) { for (n = argc-1; n > 3; n--) { putback(rquote); pbstr(argv[n]); putback(lquote); putback(','); } putback(rquote); pbstr(argv[3]); putback(lquote); } break; case DIVRTYPE: if (argc > 2 && (n = atoi(argv[2])) != 0) dodiv(n); else { active = stdout; oindex = 0; } break; case UNDVTYPE: doundiv(argv, argc); break; case DIVNTYPE: /* * dodivnum - return the number of current * output diversion * */ pbnum(oindex); break; case UNDFTYPE: /* * doundefine - undefine a previously defined * macro(s) or m4 keyword(s). */ if (argc > 2) for (n = 2; n < argc; n++) remhash(argv[n], ALL); break; case POPDTYPE: /* * dopopdef - remove the topmost definitions of * macro(s) or m4 keyword(s). */ if (argc > 2) for (n = 2; n < argc; n++) remhash(argv[n], TOP); break; case MKTMTYPE: /* * dotemp - create a temporary file * */ if (argc > 2) pbstr(mktemp(argv[2])); break; case TRNLTYPE: /* * dotranslit - replace all characters in the * source string that appears in * the "from" string with the corresponding * characters in the "to" string. * */ if (argc > 3) { char temp[MAXTOK]; if (argc > 4) map(temp, argv[2], argv[3], argv[4]); else map(temp, argv[2], argv[3], null); pbstr(temp); } else if (argc > 2) pbstr(argv[2]); break; case INDXTYPE: /* * doindex - find the index of the second argument * string in the first argument string. * -1 if not present. */ pbnum((argc > 3) ? indx(argv[2], argv[3]) : -1); break; case ERRPTYPE: /* * doerrp - print the arguments to stderr file * */ if (argc > 2) { for (n = 2; n < argc; n++) fprintf(stderr,"%s ", argv[n]); fprintf(stderr, "\n"); } break; case DNLNTYPE: /* * dodnl - eat-up-to and including newline * */ while ((c = gpbc()) != '\n' && c != EOF) ; break; case M4WRTYPE: /* * dom4wrap - set up for wrap-up/wind-down activity * */ m4wraps = (argc > 2) ? strsave(argv[2]) : null; break; case EXITTYPE: /* * doexit - immediate exit from m4. * */ exit((argc > 2) ? atoi(argv[2]) : 0); break; case DEFNTYPE: if (argc > 2) for (n = 2; n < argc; n++) dodefn(argv[n]); break; default: error("m4: major botch in eval."); break; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * expression evaluator: performs a standard recursive * descent parse to evaluate any expression permissible * within the following grammar: * * expr : query EOS * query : lor * | lor "?" query ":" query * lor : land { "||" land } * land : bor { "&&" bor } * bor : bxor { "|" bxor } * bxor : band { "^" band } * band : eql { "&" eql } * eql : relat { eqrel relat } * relat : shift { rel shift } * shift : primary { shop primary } * primary : term { addop term } * term : unary { mulop unary } * unary : factor * | unop unary * factor : constant * | "(" query ")" * constant: num * | "'" CHAR "'" * num : decnum * | "0" octnum * | "0x" hexnum * octnum : OCTDIGIT * | OCTDIGIT octnum * decnum : DECDIGIT * | DECDIGIT decnum * hexnum : HEXDIGIT * | HEXDIGIT hexnum * shop : "<<" * | ">>" * eqlrel : "=" * | "==" * | "!=" * rel : "<" * | ">" * | "<=" * | ">=" * * * This expression evaluator is lifted from a public-domain * C Pre-Processor included with the DECUS C Compiler distribution. * It is hacked somewhat to be suitable for m4. * * Originally by: Mike Lutz * Bob Harper */ #include "mdef.h" #define TRUE 1 #define FALSE 0 #define EOS (char) 0 #define EQL 0 #define NEQ 1 #define LSS 2 #define LEQ 3 #define GTR 4 #define GEQ 5 static char *nxtch; /* Parser scan pointer */ /* * For longjmp */ #include <setjmp.h> static jmp_buf expjump; /* * macros: * * ungetch - Put back the last character examined. * getch - return the next character from expr string. */ #define ungetch() nxtch-- #define getch() *nxtch++ int expr(expbuf) char *expbuf; { register int rval; nxtch = expbuf; if (setjmp(expjump) != 0) return (FALSE); rval = query(); if (skipws() == EOS) return(rval); experr("Ill-formed expression"); /* NOTREACHED */ return(0); } /* * query : lor | lor '?' query ':' query * */ int query() { register int bool, true_val, false_val; bool = lor(); if (skipws() != '?') { ungetch(); return(bool); } true_val = query(); if (skipws() != ':') experr("Bad query"); false_val = query(); return(bool ? true_val : false_val); } /* * lor : land { '||' land } * */ int lor() { register int c, vl, vr; vl = land(); while ((c = skipws()) == '|' && getch() == '|') { vr = land(); vl = vl || vr; } if (c == '|') ungetch(); ungetch(); return(vl); } /* * land : bor { '&&' bor } * */ int land() { register int c, vl, vr; vl = bor(); while ((c = skipws()) == '&' && getch() == '&') { vr = bor(); vl = vl && vr; } if (c == '&') ungetch(); ungetch(); return(vl); } /* * bor : bxor { '|' bxor } * */ int bor() { register int vl, vr, c; vl = bxor(); while ((c = skipws()) == '|' && getch() != '|') { ungetch(); vr = bxor(); vl |= vr; } if (c == '|') ungetch(); ungetch(); return(vl); } /* * bxor : band { '^' band } * */ int bxor() { register int vl, vr; vl = band(); while (skipws() == '^') { vr = band(); vl ^= vr; } ungetch(); return(vl); } /* * band : eql { '&' eql } * */ int band() { register int vl, vr, c; vl = eql(); while ((c = skipws()) == '&' && getch() != '&') { ungetch(); vr = eql(); vl &= vr; } if (c == '&') ungetch(); ungetch(); return(vl); } /* * eql : relat { eqrel relat } * */ int eql() { register int vl, vr, rel; vl = relat(); while ((rel = geteql()) != -1) { vr = relat(); switch (rel) { case EQL: vl = (vl == vr); break; case NEQ: vl = (vl != vr); break; } } return(vl); } /* * relat : shift { rel shift } * */ int relat() { register int vl, vr, rel; vl = shift(); while ((rel = getrel()) != -1) { vr = shift(); switch (rel) { case LEQ: vl = (vl <= vr); break; case LSS: vl = (vl < vr); break; case GTR: vl = (vl > vr); break; case GEQ: vl = (vl >= vr); break; } } return(vl); } /* * shift : primary { shop primary } * */ int shift() { register int vl, vr, c; vl = primary(); while (((c = skipws()) == '<' || c == '>') && c == getch()) { vr = primary(); if (c == '<') vl <<= vr; else vl >>= vr; } if (c == '<' || c == '>') ungetch(); ungetch(); return(vl); } /* * primary : term { addop term } * */ int primary() { register int c, vl, vr; vl = term(); while ((c = skipws()) == '+' || c == '-') { vr = term(); if (c == '+') vl += vr; else vl -= vr; } ungetch(); return(vl); } /* * <term> := <unary> { <mulop> <unary> } * */ int term() { register int c, vl, vr; vl = unary(); while ((c = skipws()) == '*' || c == '/' || c == '%') { vr = unary(); switch (c) { case '*': vl *= vr; break; case '/': vl /= vr; break; case '%': vl %= vr; break; } } ungetch(); return(vl); } /* * unary : factor | unop unary * */ int unary() { register int val, c; if ((c = skipws()) == '!' || c == '~' || c == '-') { val = unary(); switch (c) { case '!': return(! val); case '~': return(~ val); case '-': return(- val); } } ungetch(); return(factor()); } /* * factor : constant | '(' query ')' * */ int factor() { register int val; if (skipws() == '(') { val = query(); if (skipws() != ')') experr("Bad factor"); return(val); } ungetch(); return(constant()); } /* * constant: num | 'char' * */ int constant() { /* * Note: constant() handles multi-byte constants */ register int i; register int value; register char c; int v[sizeof (int)]; if (skipws() != '\'') { ungetch(); return(numJ��J��J��J��J����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������()); } for (i = 0; i < sizeof(int); i++) { if ((c = getch()) == '\'') { ungetch(); break; } if (c == '\\') { switch (c = getch()) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': ungetch(); c = num(); break; case 'n': c = 012; break; case 'r': c = 015; break; case 't': c = 011; break; case 'b': c = 010; break; case 'f': c = 014; break; } } v[i] = c; } if (i == 0 || getch() != '\'') experr("Illegal character constant"); for (value = 0; --i >= 0;) { value <<= 8; value += v[i]; } return(value); } /* * num : digit | num digit * */ int num() { register int rval, c, base; int ndig; ndig = 0; if ((c = skipws()) == '0') { c = getch (); if (c == 'x' || c == 'X') { base = 16; c = getch (); } else { base = 8; ndig = 1; } } else { base = 10; } rval = 0; for (;;) { if (isdigit(c)) c -= '0'; else if (isupper (c)) c -= ('A' - 10); else if (islower (c)) c -= ('a' - 10); else break; if (c < 0 || c >= base) break; rval *= base; rval += c; c = getch(); ndig++; } ungetch(); if (ndig) return(rval); experr("Bad constant"); /* NOTREACHED */ return(0); } /* * eqlrel : '=' | '==' | '!=' * */ int geteql() { register int c1, c2; c1 = skipws(); c2 = getch(); switch (c1) { case '=': if (c2 != '=') ungetch(); return(EQL); case '!': if (c2 == '=') return(NEQ); ungetch(); ungetch(); return(-1); default: ungetch(); ungetch(); return(-1); } } /* * rel : '<' | '>' | '<=' | '>=' * */ int getrel() { register int c1, c2; c1 = skipws(); c2 = getch(); switch (c1) { case '<': if (c2 == '=') return(LEQ); ungetch(); return(LSS); case '>': if (c2 == '=') return(GEQ); ungetch(); return(GTR); default: ungetch(); ungetch(); return(-1); } } /* * Skip over any white space and return terminating char. */ int skipws() { register char c; while ((c = getch()) <= ' ' && c > EOS) ; return(c); } /* * Error handler - resets environment to eval(), prints an error, * and returns FALSE. */ int experr(msg) char *msg; { printf("mp: %s\n",msg); longjmp(expjump, -1); /* Force eval() to return FALSE */ } ���������������������������������������������������������������������������������������������������������������������������������������������������extern ndptr hashtab[]; /* hash table for macros etc. */ extern char buf[]; /* push-back buffer */ extern char *bp; /* first available character */ extern char *endpbb; /* end of push-back buffer */ extern stae mstack[]; /* stack of m4 machine */ extern char *ep; /* first free char in strspace */ extern char *endest; /* end of string space */ extern int sp; /* current m4 stack pointer */ extern int fp; /* m4 call frame pointer */ extern FILE *infile[]; /* input file stack (0=stdin) */ extern FILE *outfile[]; /* diversion array(0=bitbucket)*/ extern FILE *active; /* active output file pointer */ extern char *m4temp; /* filename for diversions */ extern int ilevel; /* input file stack pointer */ extern int oindex; /* diversion index.. */ extern char *null; /* as it says.. just a null.. */ extern char *m4wraps; /* m4wrap string default.. */ extern char lquote; /* left quote character (`) */ extern char rquote; /* right quote character (') */ extern char scommt; /* start character for comment */ extern char ecommt; /* end character for comment */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * look.c * Facility: m4 macro processor * by: oz */ #include "mdef.h" #include "extr.h" /* * hash - compute hash value using the proverbial * hashing function. Taken from K&R. */ int hash (name) register char *name; { register int h = 0; while (*name) h += *name++; return (h % HASHSIZE); } /* * lookup - find name in the hash table * */ ndptr lookup(name) char *name; { register ndptr p; for (p = hashtab[hash(name)]; p != nil; p = p->nxtptr) if (strcmp(name, p->name) == 0) break; return (p); } /* * addent - hash and create an entry in the hash * table. The new entry is added in front * of a hash bucket. */ ndptr addent(name) char *name; { register int h; ndptr p; h = hash(name); if ((p = (ndptr) malloc(sizeof(struct ndblock))) != NULL) { p->nxtptr = hashtab[h]; hashtab[h] = p; p->name = strsave(name); } else error("m4: no more memory."); return p; } /* * remhash - remove an entry from the hashtable * */ void remhash(name, all) char *name; int all; { register int h; register ndptr xp, tp, mp; h = hash(name); mp = hashtab[h]; tp = nil; while (mp != nil) { if (strcmp(mp->name, name) == 0) { mp = mp->nxtptr; if (tp == nil) { freent(hashtab[h]); hashtab[h] = mp; } else { xp = tp->nxtptr; tp->nxtptr = mp; freent(xp); } if (!all) break; } else { tp = mp; mp = mp->nxtptr; } } } /* * freent - free a hashtable information block * */ void freent(p) ndptr p; { if (!(p->type & STATIC)) { free(p->name); if (p->defn != null) free(p->defn); } free(p); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * main.c * Facility: m4 macro processor * by: oz */ #include "mdef.h" /* * m4 - macro processor * * PD m4 is based on the macro tool distributed with the software * tools (VOS) package, and described in the "SOFTWARE TOOLS" and * "SOFTWARE TOOLS IN PASCAL" books. It has been expanded to include * most of the command set of SysV m4, the standard UN*X macro processor. * * Since both PD m4 and UN*X m4 are based on SOFTWARE TOOLS macro, * there may be certain implementation similarities between * the two. The PD m4 was produced without ANY references to m4 * sources. * * References: * * Software Tools distribution: macro * * Kernighan, Brian W. and P. J. Plauger, SOFTWARE * TOOLS IN PASCAL, Addison-Wesley, Mass. 1981 * * Kernighan, Brian W. and P. J. Plauger, SOFTWARE * TOOLS, Addison-Wesley, Mass. 1976 * * Kernighan, Brian W. and Dennis M. Ritchie, * THE M4 MACRO PROCESSOR, Unix Programmer's Manual, * Seventh Edition, Vol. 2, Bell Telephone Labs, 1979 * * System V man page for M4 * * Modification History: * * Jan 28 1986 Oz Break the whole thing into little * pieces, for easier (?) maintenance. * * Dec 12 1985 Oz Optimize the code, try to squeeze * few microseconds out.. * * Dec 05 1985 Oz Add getopt interface, define (-D), * undefine (-U) options. * * Oct 21 1985 Oz Clean up various bugs, add comment handling. * * June 7 1985 Oz Add some of SysV m4 stuff (m4wrap, pushdef, * popdef, decr, shift etc.). * * June 5 1985 Oz Initial cut. * * Implementation Notes: * * [1] PD m4 uses a different (and simpler) stack mechanism than the one * described in Software Tools and Software Tools in Pascal books. * The triple stack nonsense is replaced with a single stack containing * the call frames and the arguments. Each frame is back-linked to a * previous stack frame, which enables us to rewind the stack after * each nested call is completed. Each argument is a character pointer * to the beginning of the argument string within the string space. * The only exceptions to this are (*) arg 0 and arg 1, which are * the macro definition and macro name strings, stored dynamically * for the hash table. * * . . * | . | <-- sp | . | * +-------+ +-----+ * | arg 3 ------------------------------->| str | * +-------+ | . | * | arg 2 --------------+ . * +-------+ | * * | | | * +-------+ | +-----+ * | plev | <-- fp +---------------->| str | * +-------+ | . | * | type | . * +-------+ * | prcf -----------+ plev: paren level * +-------+ | type: call type * | . | | prcf: prev. call frame * . | * +-------+ | * | <----------+ * +-------+ * * [2] We have three types of null values: * * nil - nodeblock pointer type 0 * null - null string ("") * NULL - Stdio-defined NULL * */ ndptr hashtab[HASHSIZE]; /* hash table for macros etc. */ char buf[BUFSIZE]; /* push-back buffer */ char *bp = buf; /* first available character */ char *endpbb = buf+BUFSIZE; /* end of push-back buffer */ stae mstack[STACKMAX+1]; /* stack of m4 machine */ char strspace[STRSPMAX+1]; /* string space for evaluation */ char *ep = strspace; /* first free char in strspace */ char *endest= strspace+STRSPMAX;/* end of string space */ int sp; /* current m4 stack pointer */ int fp; /* m4 call frame pointer */ FILE *infile[MAXINP]; /* input file stack (0=stdin) */ FILE *outfile[MAXOUT]; /* diversion array(0=bitbucket)*/ FILE *active; /* active output file pointer */ char *m4temp; /* filename for diversions */ int ilevel = 0; /* input file stack pointer */ int oindex = 0; /* diversion index.. */ char *null = ""; /* as it says.. just a null.. */ char *m4wraps = ""; /* m4wrap string default.. */ char lquote = LQUOTE; /* left quote character (`) */ char rquote = RQUOTE; /* right quote character (') */ char scommt = SCOMMT; /* start character for comment */ char ecommt = ECOMMT; /* end character for comment */ struct keyblk keywrds[] = { /* m4 keywords to be installed */ "include", INCLTYPE, "sinclude", SINCTYPE, "define", DEFITYPE, "defn", DEFNTYPE, "divert", DIVRTYPE, "expr", EXPRTYPE, "eval", EXPRTYPE, "substr", SUBSTYPE, "ifelse", IFELTYPE, "ifdef", IFDFTYPE, "len", LENGTYPE, "incr", INCRTYPE, "decr", DECRTYPE, "dnl", DNLNTYPE, "changequote", CHNQTYPE, "changecom", CHNCTYPE, "index", INDXTYPE, #ifdef EXTENDED "paste", PASTTYPE, "spaste", SPASTYPE, #endif "popdef", POPDTYPE, "pushdef", PUSDTYPE, "dumpdef", DUMPTYPE, "shift", SHIFTYPE, "translit", TRNLTYPE, "undefine", UNDFTYPE, "undivert", UNDVTYPE, "divnum", DIVNTYPE, "maketemp", MKTMTYPE, "errprint", ERRPTYPE, "m4wrap", M4WRTYPE, "m4exit", EXITTYPE, #if unix || vms "syscmd", SYSCTYPE, "sysval", SYSVTYPE, #endif #if unix "unix", MACRTYPE, #else #if vms "vms", MACRTYPE, #endif #endif }; #define MAXKEYS (sizeof(keywrds)/sizeof(struct keyblk)) extern int optind; extern char *optarg; int main(argc,argv) int argc; char *argv[]; { register int c; register int n; char *p; static char divnam[] = DIVNAM; if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr); #ifdef NONZEROPAGES initm4(); #endif initkwds(); while ((c = getopt(argc, argv, "tD:U:o:")) != EOF) switch(c) { case 'D': /* define something..*/ for (p = optarg; *p; p++) if (*p == '=') break; if (*p) *p++ = EOS; dodefine(optarg, p); break; case 'U': /* undefine... */ remhash(optarg, TOP); break; case 'o': /* specific output */ case '?': default: usage(); } infile[0] = stdin; /* default input (naturally) */ active = stdout; /* default active output */ m4temp = mktemp(divnam); /* filename for diversions */ sp = -1; /* stack pointer initialized */ fp = 0; /* frame pointer initialized */ macro(); /* get some work done here */ if (*m4wraps) { /* anything for rundown ?? */ ilevel = 0; /* in case m4wrap includes.. */ putback(EOF); /* eof is a must !! */ pbstr(m4wraps); /* user-defined wrapup act */ macro(); /* last will and testament */ } else /* default wrap-up: undivert */ for (n = 1; n < MAXOUT; n++) if (outfile[n] != NULL) getdiv(n); /* remove bitbucket if used */ if (outfile[0] != NULL) { (void) fclose(outfile[0]); m4temp[UNIQUE] = '0'; #if vms (void) remove(m4temp); #else (void) unlink(m4temp); #endif } exit(0); } /* * macro - the work horse.. * */ void macro() { char token[MAXTOK]; register char *s; register int t, l; register ndptr p; register int nlpar; cycle { if ((t = gpbc()) == '_' || isalpha(t)) { putback(t); if ((p = inspect(s = token)) == nil) { if (sp < 0) while (*s) putc(*s++, active); else while (*s) chrsave(*s++); } else { /* * real thing.. First build a call frame: * */ pushf(fp); /* previous call frm */ pushf(p->type); /* type of the call */ pushf(0); /* parenthesis level */ fp = sp; /* new frame pointer */ /* * now push the string arguments: * */ pushs(p->defn); /* defn string */ pushs(p->name); /* macro name */ pushs(ep); /* start next..*/ putback(l = gpbc()); if (l != LPAREN) { /* add bracks */ putback(RPAREN); putback(LPAREN); } } } else if (t == EOF) { if (sp > -1) error("m4: unexpected end of input"); if (--ilevel < 0) break; /* all done thanks.. */ (void) fclose(infile[ilevel+1]); continue; } /* * non-alpha single-char token seen.. * [the order of else if .. stmts is * important.] * */ else if (t == lquote) { /* strip quotes */ nlpar = 1; do { if ((l = gpbc()) == rquote) nlpar--; else if (l == lquote) nlparJ��J��J��J��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������++; else if (l == EOF) error("m4: missing right quote"); if (nlpar > 0) { if (sp < 0) putc(l, active); else chrsave(l); } } while (nlpar != 0); } else if (sp < 0) { /* not in a macro at all */ if (t == scommt) { /* comment handling here */ putc(t, active); while ((t = gpbc()) != ecommt) putc(t, active); } putc(t, active); /* output directly.. */ } else switch(t) { case LPAREN: if (PARLEV > 0) chrsave(t); while (isspace(l = gpbc())) ; /* skip blank, tab, nl.. */ putback(l); PARLEV++; break; case RPAREN: if (--PARLEV > 0) chrsave(t); else { /* end of argument list */ chrsave(EOS); if (sp == STACKMAX) error("m4: internal stack overflow"); if (CALTYP == MACRTYPE) expand((char**)mstack+fp+1,(int)sp-fp); else eval((char**)mstack+fp+1,sp-fp,CALTYP); ep = PREVEP; /* flush strspace */ sp = PREVSP; /* previous sp.. */ fp = PREVFP; /* rewind stack...*/ } break; case COMMA: if (PARLEV == 1) { chrsave(EOS); /* new argument */ while (isspace(l = gpbc())) ; putback(l); pushs(ep); } break; default: chrsave(t); /* stack the char */ break; } } } /* * build an input token.. * consider only those starting with _ or A-Za-z. This is a * combo with lookup to speed things up. */ ndptr inspect(tp) register char *tp; { register int h = 0; register char c; register char *name = tp; register char *etp = tp+MAXTOK; register ndptr p; while (tp < etp && (isalnum(c = gpbc()) || c == '_')) h += (*tp++ = c); putback(c); if (tp == etp) error("m4: token too long"); *tp = EOS; for (p = hashtab[h%HASHSIZE]; p != nil; p = p->nxtptr) if (strcmp(name, p->name) == 0) break; return(p); } #ifdef NONZEROPAGES /* * initm4 - initialize various tables. Useful only if your system * does not know anything about demand-zero pages. * */ void initm4() { register int i; for (i = 0; i < HASHSIZE; i++) hashtab[i] = nil; for (i = 0; i < MAXOUT; i++) outfile[i] = NULL; } #endif /* * initkwds - initialise m4 keywords as fast as possible. * This very similar to install, but without certain overheads, * such as calling lookup. Malloc is not used for storing the * keyword strings, since we simply use the static pointers * within keywrds block. We also assume that there is enough memory * to at least install the keywords (i.e. malloc won't fail). * */ void initkwds() { register int i; register int h; register ndptr p; for (i = 0; i < MAXKEYS; i++) { h = hash(keywrds[i].knam); p = (ndptr) malloc(sizeof(struct ndblock)); p->nxtptr = hashtab[h]; hashtab[h] = p; p->name = keywrds[i].knam; p->defn = null; p->type = keywrds[i].ktyp | STATIC; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * mdef.h * Facility: m4 macro processor * by: oz */ #define unix 1 /* (kjb) */ #ifndef unix #define unix 0 #endif #ifndef vms #define vms 0 #endif #if vms #include stdio #include ctype #include signal #else #include <sys/types.h> #include <ctype.h> #include <signal.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #endif /* * * m4 constants.. * */ #define MACRTYPE 1 #define DEFITYPE 2 #define EXPRTYPE 3 #define SUBSTYPE 4 #define IFELTYPE 5 #define LENGTYPE 6 #define CHNQTYPE 7 #define SYSCTYPE 8 #define UNDFTYPE 9 #define INCLTYPE 10 #define SINCTYPE 11 #define PASTTYPE 12 #define SPASTYPE 13 #define INCRTYPE 14 #define IFDFTYPE 15 #define PUSDTYPE 16 #define POPDTYPE 17 #define SHIFTYPE 18 #define DECRTYPE 19 #define DIVRTYPE 20 #define UNDVTYPE 21 #define DIVNTYPE 22 #define MKTMTYPE 23 #define ERRPTYPE 24 #define M4WRTYPE 25 #define TRNLTYPE 26 #define DNLNTYPE 27 #define DUMPTYPE 28 #define CHNCTYPE 29 #define INDXTYPE 30 #define SYSVTYPE 31 #define EXITTYPE 32 #define DEFNTYPE 33 #define STATIC 128 /* * m4 special characters */ #define ARGFLAG '$' #define LPAREN '(' #define RPAREN ')' #define LQUOTE '`' #define RQUOTE '\'' #define COMMA ',' #define SCOMMT '#' #define ECOMMT '\n' /* * definitions of diversion files. If the name of * the file is changed, adjust UNIQUE to point to the * wildcard (*) character in the filename. */ #if unix #define DIVNAM "/tmp/m4*XXXXXX" /* unix diversion files */ #define UNIQUE 7 /* unique char location */ #else #if vms #define DIVNAM "sys$login:m4*XXXXXX" /* vms diversion files */ #define UNIQUE 12 /* unique char location */ #else #define DIVNAM "\M4*XXXXXX" /* msdos diversion files */ #define UNIQUE 3 /* unique char location */ #endif #endif /* * other important constants */ #define EOS (char) 0 #define MAXINP 10 /* maximum include files */ #define MAXOUT 10 /* maximum # of diversions */ #define MAXSTR 512 /* maximum size of string */ #define BUFSIZE 4096 /* size of pushback buffer */ #define STACKMAX 1024 /* size of call stack */ #define STRSPMAX 4096 /* size of string space */ #define MAXTOK MAXSTR /* maximum chars in a tokn */ #define HASHSIZE 199 /* maximum size of hashtab */ #define ALL 1 #define TOP 0 #define TRUE 1 #define FALSE 0 #define cycle for(;;) #ifdef VOID #define void int /* define if void is void. */ #endif /* * m4 data structures */ typedef struct ndblock *ndptr; struct ndblock { /* hastable structure */ char *name; /* entry name.. */ char *defn; /* definition.. */ int type; /* type of the entry.. */ ndptr nxtptr; /* link to next entry.. */ }; #define nil ((ndptr) 0) struct keyblk { char *knam; /* keyword name */ int ktyp; /* keyword type */ }; typedef union { /* stack structure */ int sfra; /* frame entry */ char *sstr; /* string entry */ } stae; /* * macros for readibility and/or speed * * gpbc() - get a possibly pushed-back character * min() - select the minimum of two elements * pushf() - push a call frame entry onto stack * pushs() - push a string pointer onto stack */ #define gpbc() (bp > buf) ? *--bp : getc(infile[ilevel]) #define min(x,y) ((x > y) ? y : x) #define pushf(x) if (sp < STACKMAX) mstack[++sp].sfra = (x) #define pushs(x) if (sp < STACKMAX) mstack[++sp].sstr = (x) /* * . . * | . | <-- sp | . | * +-------+ +-----+ * | arg 3 ----------------------->| str | * +-------+ | . | * | arg 2 ---PREVEP-----+ . * +-------+ | * . | | | * +-------+ | +-----+ * | plev | PARLEV +-------->| str | * +-------+ | . | * | type | CALTYP . * +-------+ * | prcf ---PREVFP--+ * +-------+ | * | . | PREVSP | * . | * +-------+ | * | <----------+ * +-------+ * */ #define PARLEV (mstack[fp].sfra) #define CALTYP (mstack[fp-1].sfra) #define PREVEP (mstack[fp+3].sstr) #define PREVSP (fp-3) #define PREVFP (mstack[fp-2].sfra) /* function prototypes */ /* eval.c */ _PROTOTYPE(void eval, (char *argv [], int argc, int td )); /* expr.c */ _PROTOTYPE(int expr, (char *expbuf )); _PROTOTYPE(int query, (void)); _PROTOTYPE(int lor, (void)); _PROTOTYPE(int land, (void)); _PROTOTYPE(int bor, (void)); _PROTOTYPE(int bxor, (void)); _PROTOTYPE(int band, (void)); _PROTOTYPE(int eql, (void)); _PROTOTYPE(int relat, (void)); _PROTOTYPE(int shift, (void)); _PROTOTYPE(int primary, (void)); _PROTOTYPE(int term, (void)); _PROTOTYPE(int unary, (void)); _PROTOTYPE(int factor, (void)); _PROTOTYPE(int constant, (void)); _PROTOTYPE(int num, (void)); _PROTOTYPE(int geteql, (void)); _PROTOTYPE(int getrel, (void)); _PROTOTYPE(int skipws, (void)); _PROTOTYPE(int experr, (char *msg )); /* look.c */ _PROTOTYPE(int hash, (char *name )); _PROTOTYPE(ndptr lookup, (char *name )); _PROTOTYPE(ndptr addent, (char *name )); _PROTOTYPE(void remhash, (char *name, int all )); _PROTOTYPE(void freent, (ndptr p )); /* main.c */ _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void macro, (void)); _PROTOTYPE(ndptr inspect, (char *tp )); _PROTOTYPE(void initm4, (void)); _PROTOTYPE(void initkwds, (void)); /* misc.c */ _PROTOTYPE(int indx, (char *s1, char *s2 )); _PROTOTYPE(void putback, (int c )); _PROTOTYPE(void pbstr, (char *s )); _PROTOTYPE(void pbnum, (int n )); _PROTOTYPE(void chrsave, (int c )); _PROTOTYPE(void getdiv, (int ind )); _PROTOTYPE(void error, (char *s )); _PROTOTYPE(void onintr, (int s )); _PROTOTYPE(void killdiv, (void)); _PROTOTYPE(char *strsave, (char *s )); _PROTOTYPE(void usage, (void)); /* serv.c */ _PROTOTYPE(void expand, (char *argv [], int argc )); _PROTOTYPE(void dodefine, (char *name, char *defn )); _PROTOTYPE(void dodefn, (char *name )); _PROTOTYPE(void dopushdef, (char *name, char *defn )); _PROTOTYPE(void dodump, (char *argv [], int argc )); _PROTOTYPE(void doifelse, (char *argv [], int argc )); _PROTOTYPE(int doincl, (char *ifile )); _PROTOTYPE(int dopaste, (char *pfile )); _PROTOTYPE(void dochq, (char *argv [], int argc )); _PROTOTYPE(void dochc, (char *argv [], int argc )); _PROTOTYPE(void dodiv, (int n )); _PROTOTYPE(void doundiv, (char *argv [], int argc )); _PROTOTYPE(void dosub, (char *argv [], int argc )); _PROTOTYPE(void map, (char *dest, char *src, char *from, char *to )); ��������������������������������������/* * misc.c * Facility: m4 macro processor * by: oz */ #include "mdef.h" #include "extr.h" /* * indx - find the index of second str in the * first str. */ int indx(s1, s2) char *s1; char *s2; { register char *t; register char *p; register char *m; for (p = s1; *p; p++) { for (t = p, m = s2; *m && *m == *t; m++, t++) ; if (!*m) return(p - s1); } return (-1); } /* * putback - push character back onto input * */ void putback (c) char c; { if (bp < endpbb) *bp++ = c; else error("m4: too many characters pushed back"); } /* * pbstr - push string back onto input * putback is replicated to improve * performance. * */ void pbstr(s) register char *s; { register char *es; register char *zp; es = s; zp = bp; while (*es) es++; es--; while (es >= s) if (zp < endpbb) *zp++ = *es--; if ((bp = zp) == endpbb) error("m4: too many characters pushed back"); } /* * pbnum - convert number to string, push back on input. * */ void pbnum (n) int n; { register int num; num = (n < 0) ? -n : n; do { putback(num % 10 + '0'); } while ((num /= 10) > 0); if (n < 0) putback('-'); } /* * chrsave - put single char on string space * */ void chrsave (c) char c; { /*** if (sp < 0) putc(c, active); else ***/ if (ep < endest) *ep++ = c; else error("m4: string space overflow"); } /* * getdiv - read in a diversion file, and * trash it. */ void getdiv(ind) int ind; { register int c; register FILE *dfil; if (active == outfile[ind]) error("m4: undivert: diversion still active."); (void) fclose(outfile[ind]); outfile[ind] = NULL; m4temp[UNIQUE] = ind + '0'; if ((dfil = fopen(m4temp, "r")) == NULL) error("m4: cannot undivert."); else while((c = getc(dfil)) != EOF) putc(c, active); (void) fclose(dfil); #if vms if (remove(m4temp)) #else if (unlink(m4temp) == -1) #endif error("m4: cannot unlink."); } /* * Very fatal error. Close all files * and die hard. */ void error(s) char *s; { killdiv(); fprintf(stderr,"%s\n",s); exit(1); } /* * Interrupt handling */ static char *msg = "\ninterrupted."; void onintr(s) int s; /* ANSI requires the parameter */ { error(msg); } /* * killdiv - get rid of the diversion files * */ void killdiv() { register int n; for (n = 0; n < MAXOUT; n++) if (outfile[n] != NULL) { (void) fclose (outfile[n]); m4temp[UNIQUE] = n + '0'; #if vms (void) remove (m4temp); #else (void) unlink (m4temp); #endif } } /* * save a string somewhere.. * */ char *strsave(s) char *s; { register int n; char *p; n = strlen(s)+1; p = (char *) malloc(n); if (p != NULL) (void) memcpy(p, s, n); return (p); } void usage() { fprintf(stderr, "Usage: m4 [-Dname[=val]] [-Uname]\n"); exit(1); } #ifdef GETOPT /* * H. Spencer getopt - get option letter from argv * * #include <stdio.h> * */ char *optarg; /* Global argument pointer. */ int optind = 0; /* Global argv index. */ static char *scan = NULL; /* Private scan pointer. */ int getopt(argc, argv, optstring) int argc; char *argv[]; char *optstring; { register char c; register char *place; optarg = NULL; if (scan == NULL || *scan == '\0') { if (optind == 0) optind++; if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') return(EOF); if (strcmp(argv[optind], "--")==0) { optind++; return(EOF); } scan = argv[optind]+1; optind++; } c = *scan++; place = index(optstring, c); if (place == NULL || c == ':') { fprintf(stderr, "%s: unknown option -%c\n", argv[0], c); return('?'); } place++; if (*place == ':') { if (*scan != '\0') { optarg = scan; scan = NULL; } else { optarg = argv[optind]; optind++; } } return(c); } #endif #ifdef DUFFCP /* * This code uses Duff's Device (tm Tom Duff) * to unroll the copying loop: * while (count-- > 0) * *to++ = *from++; */ #define COPYBYTE *to++ = *from++ void memcpy(to, from, count) register char *from, *to; register int count; { if (count > 0) { register int loops = (count+8-1) >> 3; /* div 8 round up */ switch (count&(8-1)) { /* mod 8 */ case 0: do { COPYBYTE; case 7: COPYBYTE; case 6: COPYBYTE; case 5: COPYBYTE; case 4: COPYBYTE; case 3: COPYBYTE; case 2: COPYBYTE; case 1: COPYBYTE; } while (--loops > 0); } } } #endif ��������������������������������������������������������#define PATCHLEVEL 1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * serv.c * Facility: m4 macro processor * by: oz */ #include "mdef.h" #include "extr.h" char *dumpfmt = "`%s'\t`%s'\n"; /* format string for dumpdef */ /* * expand - user-defined macro expansion * */ void expand(argv, argc) register char *argv[]; register int argc; { register char *t; register char *p; register int n; register int argno; t = argv[0]; /* defn string as a whole */ p = t; while (*p) p++; p--; /* last character of defn */ while (p > t) { if (*(p-1) != ARGFLAG) putback(*p); else { switch (*p) { case '#': pbnum(argc-2); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if ((argno = *p - '0') < argc-1) pbstr(argv[argno+1]); break; case '*': for (n = argc - 1; n > 2; n--) { pbstr(argv[n]); putback(','); } pbstr(argv[2]); break; default : putback(*p); break; } p--; } p--; } if (p == t) /* do last character */ putback(*p); } /* * dodefine - install definition in the table * */ void dodefine(name, defn) register char *name; register char *defn; { register ndptr p; if (!*name) error("m4: null definition."); if (strcmp(name, defn) == 0) error("m4: recursive definition."); if ((p = lookup(name)) == nil) p = addent(name); else if (p->defn != null) free(p->defn); if (!*defn) p->defn = null; else p->defn = strsave(defn); p->type = MACRTYPE; } /* * dodefn - push back a quoted definition of * the given name. */ void dodefn(name) char *name; { register ndptr p; if ((p = lookup(name)) != nil && p->defn != null) { putback(rquote); pbstr(p->defn); putback(lquote); } } /* * dopushdef - install a definition in the hash table * without removing a previous definition. Since * each new entry is entered in *front* of the * hash bucket, it hides a previous definition from * lookup. */ void dopushdef(name, defn) register char *name; register char *defn; { register ndptr p; if (!*name) error("m4: null definition"); if (strcmp(name, defn) == 0) error("m4: recursive definition."); p = addent(name); if (!*defn) p->defn = null; else p->defn = strsave(defn); p->type = MACRTYPE; } /* * dodumpdef - dump the specified definitions in the hash * table to stderr. If nothing is specified, the entire * hash table is dumped. * */ void dodump(argv, argc) register char *argv[]; register int argc; { register int n; ndptr p; if (argc > 2) { for (n = 2; n < argc; n++) if ((p = lookup(argv[n])) != nil) fprintf(stderr, dumpfmt, p->name, p->defn); } else { for (n = 0; n < HASHSIZE; n++) for (p = hashtab[n]; p != nil; p = p->nxtptr) fprintf(stderr, dumpfmt, p->name, p->defn); } } /* * doifelse - select one of two alternatives - loop. * */ void doifelse(argv,argc) register char *argv[]; register int argc; { cycle { if (strcmp(argv[2], argv[3]) == 0) pbstr(argv[4]); else if (argc == 6) pbstr(argv[5]); else if (argc > 6) { argv += 3; argc -= 3; continue; } break; } } /* * doinclude - include a given file. * */ int doincl(ifile) char *ifile; { if (ilevel+1 == MAXINP) error("m4: too many include files."); if ((infile[ilevel+1] = fopen(ifile, "r")) != NULL) { ilevel++; return (1); } else return (0); } #ifdef EXTENDED /* * dopaste - include a given file without any * macro processing. */ int dopaste(pfile) char *pfile; { FILE *pf; register int c; if ((pf = fopen(pfile, "r")) != NULL) { while((c = getc(pf)) != EOF) putc(c, active); (void) fclose(pf); return(1); } else return(0); } #endif /* * dochq - change quote characters * */ void dochq(argv, argc) register char *argv[]; register int argc; { if (argc > 2) { if (*argv[2]) lquote = *argv[2]; if (argc > 3) { if (*argv[3]) rquote = *argv[3]; } else rquote = lquote; } else { lquote = LQUOTE; rquote = RQUOTE; } } /* * dochc - change comment characters * */ void dochc(argv, argc) register char *argv[]; register int argc; { if (argc > 2) { if (*argv[2]) scommt = *argv[2]; if (argc > 3) { if (*argv[3]) ecommt = *argv[3]; } else ecommt = ECOMMT; } else { scommt = SCOMMT; ecommt = ECOMMT; } } /* * dodivert - divert the output to a temporary file * */ void dodiv(n) register int n; { if (n < 0 || n >= MAXOUT) n = 0; /* bitbucket */ if (outfile[n] == NULL) { m4temp[UNIQUE] = n + '0'; if ((outfile[n] = fopen(m4temp, "w")) == NULL) error("m4: cannot divert."); } oindex = n; active = outfile[n]; } /* * doundivert - undivert a specified output, or all * other outputs, in numerical order. */ void doundiv(argv, argc) register char *argv[]; register int argc; { register int ind; register int n; if (argc > 2) { for (ind = 2; ind < argc; ind++) { n = atoi(argv[ind]); if (n > 0 && n < MAXOUT && outfile[n] != NULL) getdiv(n); } } else for (n = 1; n < MAXOUT; n++) if (outfile[n] != NULL) getdiv(n); } /* * dosub - select substring * */ void dosub (argv, argc) register char *argv[]; register int argc; { register char *ap, *fc, *k; register int nc; if (argc < 5) nc = MAXTOK; else #ifdef EXPR nc = expr(argv[4]); #else nc = atoi(argv[4]); #endif ap = argv[2]; /* target string */ #ifdef EXPR fc = ap + expr(argv[3]); /* first char */ #else fc = ap + atoi(argv[3]);J��J��J��J��J���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� /* first char */ #endif if (fc >= ap && fc < ap+strlen(ap)) for (k = fc+min(nc,strlen(fc))-1; k >= fc; k--) putback(*k); } /* * map: * map every character of s1 that is specified in from * into s3 and replace in s. (source s1 remains untouched) * * This is a standard implementation of map(s,from,to) function of ICON * language. Within mapvec, we replace every character of "from" with * the corresponding character in "to". If "to" is shorter than "from", * than the corresponding entries are null, which means that those * characters dissapear altogether. Furthermore, imagine * map(dest, "sourcestring", "srtin", "rn..*") type call. In this case, * `s' maps to `r', `r' maps to `n' and `n' maps to `*'. Thus, `s' * ultimately maps to `*'. In order to achieve this effect in an efficient * manner (i.e. without multiple passes over the destination string), we * loop over mapvec, starting with the initial source character. if the * character value (dch) in this location is different than the source * character (sch), sch becomes dch, once again to index into mapvec, until * the character value stabilizes (i.e. sch = dch, in other words * mapvec[n] == n). Even if the entry in the mapvec is null for an ordinary * character, it will stabilize, since mapvec[0] == 0 at all times. At the * end, we restore mapvec* back to normal where mapvec[n] == n for * 0 <= n <= 127. This strategy, along with the restoration of mapvec, is * about 5 times faster than any algorithm that makes multiple passes over * destination string. * */ void map(dest,src,from,to) register char *dest; register char *src; register char *from; register char *to; { register char *tmp; register char sch, dch; static char mapvec[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127 }; if (*src) { tmp = from; /* * create a mapping between "from" and "to" */ while (*from) mapvec[*from++] = (*to) ? *to++ : (char) 0; while (*src) { sch = *src++; dch = mapvec[sch]; while (dch != sch) { sch = dch; dch = mapvec[sch]; } if (*dest = dch) dest++; } /* * restore all the changed characters */ while (*tmp) { mapvec[*tmp] = *tmp; tmp++; } } *dest = (char) 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t .�������������..������������u Makefile������v archive.c�����w check.c�������x h.h�����������y input.c�������z macro.c�������{ main.c��������| make.c��������} reader.c������~ rules.c�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for make (!) CFLAGS = -O -Dunix -D_MINIX -D_POSIX_SOURCE OBJ = check.o input.o macro.o main.o make.o reader.o rules.o archive.o all: make make : $(OBJ) $(CC) -i -o make $(OBJ) install -S 96k make install: /usr/bin/make /usr/bin/make: make install -cs -o bin make $@ $(OBJ): h.h clean: rm -f *.o *.bak core make �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* archive.c - archive support Author: Kees J. Bot * 13 Nov 1993 */ #include "h.h" #ifdef unix #include <unistd.h> #include <fcntl.h> #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) /* ASCII ar header. */ #define ASCII_ARMAG "!<arch>\n" #define ASCII_SARMAG 8 #define ASCII_ARFMAG "`\n" struct ascii_ar_hdr { char ar_name[16]; char ar_date[12]; char ar_uid[6]; char ar_gid[6]; char ar_mode[8]; char ar_size[10]; char ar_fmag[2]; }; /* ACK ar header. */ #define ACK_ARMAG 0177545 #define ACK_AALMAG 0177454 struct ack_ar_hdr { char ar_name[14]; unsigned long ar_date; unsigned char ar_uid; unsigned char ar_gid; unsigned short ar_mode; unsigned long ar_size; }; typedef struct archname { struct archname *next; /* Next on the hash chain. */ char name[16]; /* One archive entry. */ time_t date; /* The timestamp. */ /* (no need for other attibutes) */ } archname_t; static size_t namelen; /* Max name length, 14 or 16. */ #define HASHSIZE (64 << sizeof(int)) static archname_t *nametab[HASHSIZE]; _PROTOTYPE( static int hash, (char *name) ); _PROTOTYPE( static int searchtab, (char *name, time_t *date, int scan) ); _PROTOTYPE( static void deltab, (void) ); _PROTOTYPE( static long ar_atol, (char *s, size_t n) ); _PROTOTYPE( static int read_ascii_archive, (int afd) ); _PROTOTYPE( static int read_ack_archive, (int afd) ); static char *lpar, *rpar; /* Leave these at '(' and ')'. */ int is_archive_ref(name) char *name; /* True if name is of the form "archive(file)". */ { char *p = name; while (*p != 0 && *p != '(' && *p != ')') p++; lpar = p; if (*p++ != '(') return 0; while (*p != 0 && *p != '(' && *p != ')') p++; rpar = p; if (*p++ != ')') return 0; return *p == 0; } static int hash(name) char *name; /* Compute a hash value out of a name. */ { unsigned h = 0; unsigned char *p = (unsigned char *) name; int n = namelen; while (*p != 0) { h = h * 0x1111 + *p++; if (--n == 0) break; } return h % arraysize(nametab); } static int searchtab(name, date, scan) char *name; time_t *date; int scan; /* Enter a name to the table, or return the date of one already there. */ { archname_t **pnp, *np; int cmp = 1; pnp = &nametab[hash(name)]; while ((np = *pnp) != NULL && (cmp = strncmp(name, np->name, namelen)) > 0) { pnp= &np->next; } if (cmp != 0) { if (scan) { errno = ENOENT; return -1; } if ((np = (archname_t *) malloc(sizeof(*np))) == NULL) fatal("No memory for archive name cache",(char *)0,0); strncpy(np->name, name, namelen); np->date = *date; np->next = *pnp; *pnp = np; } if (scan) *date = np->date; return 0; } static void deltab() /* Delete the name cache, a different library is to be read. */ { archname_t **pnp, *np, *junk; for (pnp = nametab; pnp < arraylimit(nametab); pnp++) { for (np = *pnp; np != NULL; ) { junk = np; np = np->next; free(junk); } *pnp = NULL; } } static long ar_atol(s, n) char *s; size_t n; /* Transform a string into a number. Ignore the space padding. */ { long l= 0; while (n > 0) { if (*s != ' ') l= l * 10 + (*s - '0'); s++; n--; } return l; } static int read_ascii_archive(afd) int afd; /* Read a modern ASCII type archive. */ { struct ascii_ar_hdr hdr; off_t pos= 8; char *p; time_t date; namelen = 16; for (;;) { if (lseek(afd, pos, SEEK_SET) == -1) return -1; switch (read(afd, &hdr, sizeof(hdr))) { case sizeof(hdr): break; case -1: return -1; default: return 0; } if (strncmp(hdr.ar_fmag, ASCII_ARFMAG, sizeof(hdr.ar_fmag)) != 0) { errno= EINVAL; return -1; } /* Strings are space padded! */ for (p= hdr.ar_name; p < hdr.ar_name + sizeof(hdr.ar_name); p++) { if (*p == ' ') { *p= 0; break; } } /* Add a file to the cache. */ date = ar_atol(hdr.ar_date, sizeof(hdr.ar_date)); searchtab(hdr.ar_name, &date, 0); pos+= sizeof(hdr) + ar_atol(hdr.ar_size, sizeof(hdr.ar_size)); pos= (pos + 1) & (~ (off_t) 1); } } static int read_ack_archive(afd) int afd; /* Read an ACK type archive. */ { unsigned char raw_hdr[14 + 4 + 1 + 1 + 2 + 4]; struct ack_ar_hdr hdr; off_t pos= 2; time_t date; namelen = 14; for (;;) { if (lseek(afd, pos, SEEK_SET) == -1) return -1; switch (read(afd, raw_hdr, sizeof(raw_hdr))) { case sizeof(raw_hdr): break; case -1: return -1; default: return 0; } /* Copy the useful fields from the raw bytes transforming PDP-11 * style numbers to native format. */ memcpy(hdr.ar_name, raw_hdr + 0, 14); hdr.ar_date= (long) raw_hdr[14 + 1] << 24 | (long) raw_hdr[14 + 0] << 16 | (long) raw_hdr[14 + 3] << 8 | (long) raw_hdr[14 + 2] << 0; hdr.ar_size= (long) raw_hdr[22 + 1] << 24 | (long) raw_hdr[22 + 0] << 16 | (long) raw_hdr[22 + 3] << 8 | (long) raw_hdr[22 + 2] << 0; /* Add a file to the cache. */ date = hdr.ar_date; searchtab(hdr.ar_name, &date, 0); pos= (pos + 26 + hdr.ar_size + 1) & (~ (off_t) 1); } } int archive_stat(name, stp) char *name; struct stat *stp; /* Search an archive for a file and return that file's stat info. */ { int afd; int r= -1; char magic[8]; char *file; static dev_t ardev; static ino_t arino = 0; static time_t armtime; if (!is_archive_ref(name)) { errno = EINVAL; return -1; } *lpar= 0; *rpar= 0; file= lpar + 1; if (stat(name, stp) < 0) goto bail_out; if (stp->st_ino != arino || stp->st_dev != ardev) { /* Either the first (and probably only) library, or a different * library. */ arino = stp->st_ino; ardev = stp->st_dev; armtime = stp->st_mtime; deltab(); if ((afd= open(name, O_RDONLY)) < 0) goto bail_out; switch (read(afd, magic, sizeof(magic))) { case 8: if (strncmp(magic, ASCII_ARMAG, 8) == 0) { r= read_ascii_archive(afd); break; } if ((magic[0] & 0xFF) == ((ACK_AALMAG >> 0) & 0xFF) && (magic[1] & 0xFF) == ((ACK_AALMAG >> 8) & 0xFF) ) { r= read_ack_archive(afd); break; } /*FALL THROUGH*/ default: errno = EINVAL; /*FALL THROUGH*/ case -1: /* r= -1 */; } { int e= errno; close(afd); errno= e; } } else { /* Library is cached. */ r = 0; } if (r == 0) { /* Search the cache. */ r = searchtab(file, &stp->st_mtime, 1); if (stp->st_mtime > armtime) stp->st_mtime = armtime; } bail_out: /* Repair the name(file) thing. */ *lpar= '('; *rpar= ')'; return r; } #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : c h e c k . c * * debugging stuff: Check structures for make. *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 23.08.89 adapted to new name tree structure RAL * 3 30.08.89 indention changed PSH,RAL * 4 06.09.89 prt output redirected to stdout RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #include "h.h" /* * Prints out the structures as defined in memory. Good for check * that you make file does what you want (and for debugging make). */ void prt() { register struct name *np; register struct depend *dp; register struct line *lp; register struct cmd *cp; register struct macro *mp; register int i; for (mp = macrohead; mp; mp = mp->m_next) printf("%s = %s\n", mp->m_name, mp->m_val); putchar('\n'); for (i = 0; i <= maxsuffarray ; i++) for (np = suffparray[i]->n_next; np; np = np->n_next) { if (np->n_flag & N_DOUBLE) printf("%s::\n", np->n_name); else printf("%s:\n", np->n_name); if (np == firstname) printf("(MAIN NAME)\n"); for (lp = np->n_line; lp; lp = lp->l_next) { putchar(':'); for (dp = lp->l_dep; dp; dp = dp->d_next) printf(" %s", dp->d_name->n_name); putchar('\n'); for (cp = lp->l_cmd; cp; cp = cp->c_next) #ifdef os9 printf("- %s\n", cp->c_cmd); #else printf("-\t%s\n", cp->c_cmd); #endif putchar('\n'); } putchar('\n'); } } /* * Recursive routine that does the actual checking. */ void check(np) struct name *np; { register struct depend *dp; register struct line *lp; if (np->n_flag & N_MARK) fatal("Circular dependency from %s", np->n_name,0); np->n_flag |= N_MARK; for (lp = np->n_line; lp; lp = lp->l_next) for (dp = lp->l_dep; dp; dp = dp->d_next) check(dp->d_name); np->n_flag &= ~N_MARK; } /* * Look for circular dependancies. * ie. * a: b * b: a * is a circular dep */ void circh() { register struct name *np; register int i; for (i = 0; i <= maxsuffarray ; i++) for (np = suffparray[i]->n_next; np; np = np->n_next) check(np); } /* * Check the target .PRECIOUS, and mark its dependentd as precious */ void precious() { register struct depend *dp; register struct line *lp; register struct name *np; if (!((np = newname(".PRECIOUS"))->n_flag & N_TARG)) return; for (lp = np->n_line; lp; lp = lp->l_next) for (dp = lp->l_dep; dp; dp = dp->d_next) dp->d_name->n_flag |= N_PREC; } ����������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : h . h * * include file for make *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 23.08.89 LZ increased,N_EXISTS added,suffix as macro added RAL * 3 30.08.89 macro flags added, indention changed PSH,RAL * 4 03.09.89 fixed LZ eliminated, struct str added,... RAL * 5 06.09.89 TABCHAR,M_MAKE added RAL * 6 09.09.89 tos support added, EXTERN,INIT,PARMS added PHH,RAL * 7 17.09.89 __STDC__ added, make1 decl. fixed , N_EXEC added RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #ifdef unix #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <utime.h> #include <stdio.h> #include <limits.h> #endif #ifdef eon #include <sys/stat.h> #include <sys/err.h> #endif #ifdef os9 #include <time.h> #include <os9.h> #include <modes.h> #include <direct.h> #include <errno.h> #endif #ifdef tos struct DOSTIME {short time,date; }; /* time structure of TOS */ #ifdef LATTICE #include <error.h> #include <sys/types.h> #include <sys/stat.h> #include <osbind.h> #endif /* LATTICE */ #ifdef TURBO #include <tos.h> #include <errno.h> #include <string.h> #endif /* TURBO */ #endif /* tos */ #include <ctype.h> #include <stdio.h> #include <assert.h> #ifdef eon #define MNOENT ER_NOTF #else #define MNOENT ENOENT #endif #ifndef uchar #ifdef os9 #define uchar char #define void int #define fputc putc #else #define uchar unsigned char #endif #endif #define bool uchar #ifndef time_t #define time_t long #endif #define TRUE (1) #define FALSE (0) #define max(a,b) ((a)>(b)?(a):(b)) #ifdef unix #define DEFN1 "makefile" #define DEFN2 "Makefile" #endif #ifdef eon #define DEFN1 "makefile" #define DEFN2 "Makefile" #endif #ifdef tos #define DEFN1 "makefile." #define DEFN2 (char *)0 #endif #ifdef os9 #define DEFN1 "makefile" #define DEFN2 (char *)0 #endif #ifdef os9 #define TABCHAR ' ' #else #define TABCHAR '\t' #endif #define LZ1 (2048) /* Initial input/expand string size */ #define LZ2 (256) /* Initial input/expand string size */ /* * A name. This represents a file, either to be made, or existant */ struct name { struct name *n_next; /* Next in the list of names */ char *n_name; /* Called */ struct line *n_line; /* Dependencies */ time_t n_time; /* Modify time of this name */ uchar n_flag; /* Info about the name */ }; #define N_MARK 0x01 /* For cycle check */ #define N_DONE 0x02 /* Name looked at */ #define N_TARG 0x04 /* Name is a target */ #define N_PREC 0x08 /* Target is precious */ #define N_DOUBLE 0x10 /* Double colon target */ #define N_EXISTS 0x20 /* File exists */ #define N_ERROR 0x40 /* Error occured */ #define N_EXEC 0x80 /* Commands executed */ /* * Definition of a target line. */ struct line { struct line *l_next; /* Next line (for ::) */ struct depend *l_dep; /* Dependents for this line */ struct cmd *l_cmd; /* Commands for this line */ }; /* * List of dependents for a line */ struct depend { struct depend *d_next; /* Next dependent */ struct name *d_name; /* Name of dependent */ }; /* * Commands for a line */ struct cmd { struct cmd *c_next; /* Next command line */ char *c_cmd; /* Command line */ }; /* * Macro storage */ struct macro { struct macro *m_next; /* Next variable */ char *m_name; /* Called ... */ char *m_val; /* Its value */ uchar m_flag; /* Infinite loop check */ }; #define M_MARK 0x01 /* for infinite loop check */ #define M_OVERRIDE 0x02 /* command-line override */ #define M_MAKE 0x04 /* for MAKE macro */ /* * String */ struct str { char **ptr; /* ptr to real ptr. to string */ int len; /* length of string */ int pos; /* position */ }; /* Declaration, definition & initialization of variables */ #ifndef EXTERN #define EXTERN extern #endif #ifndef INIT #define INIT(x) #endif extern int errno; extern char **environ; EXTERN char *myname; EXTERN bool domake INIT(TRUE); /* Go through the motions option */ EXTERN bool ignore INIT(FALSE); /* Ignore exit status option */ EXTERN bool conterr INIT(FALSE); /* continue on errors */ EXTERN bool silent INIT(FALSE); /* Silent option */ EXTERN bool print INIT(FALSE); /* Print debuging information */ EXTERN bool rules INIT(TRUE); /* Use inbuilt rules */ EXTERN bool dotouch INIT(FALSE); /* Touch files instead of making */ EXTERN bool quest INIT(FALSE); /* Question up-to-dateness of file */ EXTERN bool useenv INIT(FALSE); /* Env. macro def. overwrite makefile def.*/ EXTERN bool dbginfo INIT(FALSE); /* Print lot of debugging information */ EXTERN bool ambigmac INIT(TRUE); /* guess undef. ambiguous macros (*,<) */ EXTERN struct name *firstname; EXTERN char *str1; EXTERN char *str2; EXTERN struct str str1s; EXTERN struct str str2s; EXTERN struct name **suffparray; /* ptr. to array of ptrs. to name chains */ EXTERN int sizesuffarray INIT(20); /* size of suffarray */ EXTERN int maxsuffarray INIT(0); /* last used entry in suffarray */ EXTERN struct macro *macrohead; EXTERN bool expmake; /* TRUE if $(MAKE) has been expanded */ EXTERN char *makefile; /* The make file */ EXTERN int lineno; #ifdef tos #ifdef LATTICE EXTERN int _mneed INIT(60000); /* VERY important for TOS with LATTICE C*/ #endif /* LATTICE */ #endif /* tos */ #ifdef eon #define MEMSPACE (16384) EXTERN unsigned memspace = MEMSPACE; #endif #define suffix(name) strrchr(name,(int)'.') EXTERN int _ctypech; #define mylower(x) (islower(_ctypech=(x)) ? _ctypech :tolower(_ctypech)) #define myupper(x) (isupper(_ctypech=(x)) ? _ctypech :toupper(_ctypech)) /* Prototypes. */ struct sgtbuf; /* check.c */ _PROTOTYPE(void prt, (void)); _PROTOTYPE(void check, (struct name *np )); _PROTOTYPE(void circh, (void)); _PROTOTYPE(void precious, (void)); /* input.c */ _PROTOTYPE(void init, (void)); _PROTOTYPE(void strrealloc, (struct str *strs )); _PROTOTYPE(struct name *newname, (char *name )); _PROTOTYPE(struct name *testname, (char *name )); _PROTOTYPE(struct depend *newdep, (struct name *np, struct depend *dp )); _PROTOTYPE(struct cmd *newcmd, (char *str, struct cmd *cp )); _PROTOTYPE(void newline, (struct name *np, struct depend *dp, struct cmd *cp, int flag )); _PROTOTYPE(void input, (FILE *fd )); /* macro.c */ _PROTOTYPE(struct macro *getmp, (char *name )); _PROTOTYPE(char *getmacro, (char *name )); _PROTOTYPE(struct macro *setmacro, (char *name, char *val )); _PROTOTYPE(void setDFmacro, (char *name, char *val )); _PROTOTYPE(void doexp, (struct str *to, char *from )); _PROTOTYPE(void expand, (struct str *strs )); /* main.c */ _PROTOTYPE(void main, (int argc, char **argv )); _PROTOTYPE(void setoption, (char option )); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void fatal, (char *msg, char *a1, int a2 )); /* make.c */ _PROTOTYPE(int dosh, (char *string, char *shell )); _PROTOTYPE(int makeold, (char *name )); _PROTOTYPE(void docmds1, (struct name *np, struct line *lp )); _PROTOTYPE(void docmds, (struct name *np )); _PROTOTYPE(int Tosexec, (char *string )); _PROTOTYPE(time_t mstonix, (unsigned int date, unsigned int time )); _PROTOTYPE(void getmdate, (int fd, struct sgtbuf *tbp )); _PROTOTYPE(time_t cnvtime, (struct sgtbuf *tbp )); _PROTOTYPE(void modtime, (struct name *np )); _PROTOTYPE(void touch, (struct name *np )); _PROTOTYPE(int make, (struct name *np, int level )); _PROTOTYPE(void make1, (struct name *np, struct line *lp, struct depend *qdp, char *basename, char *inputnameJ��J���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� )); _PROTOTYPE(void implmacros, (struct name *np, struct line *lp, char **pbasename, char **pinputname )); _PROTOTYPE(void dbgprint, (int level, struct name *np, char *comment )); /* reader.c */ _PROTOTYPE(void error, (char *msg, char *a1 )); _PROTOTYPE(bool getline, (struct str *strs, FILE *fd )); _PROTOTYPE(char *gettok, (char **ptr )); /* rules.c */ _PROTOTYPE(bool dyndep, (struct name *np, char **pbasename,char **pinputname)); _PROTOTYPE(void makerules, (void)); /* archive.c */ _PROTOTYPE(int is_archive_ref, (char *name)); _PROTOTYPE(int archive_stat, (char *name, struct stat *stp)); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : i n p u t . c * * Parse a makefile *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 23.08.89 new name tree structure introduced to speed up make, * testname introduced to shrink the memory usage RAL * 3 30.08.89 indention changed PSH,RAL * 4 03.09.89 fixed LZ eliminated RAL * 5 06.09.89 ; command added RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #include "h.h" static struct name *lastrrp; static struct name *freerp = (struct name *)NULL; void init() { if( (suffparray = (struct name **) malloc( sizesuffarray * sizeof(struct name *))) == (struct name **) NULL) fatal("No memory for suffarray",(char *)0,0); if ((*suffparray = (struct name *)malloc(sizeof (struct name))) == (struct name *)0) fatal("No memory for name",(char *)0,0); (*suffparray)->n_next = (struct name *)0; if ((str1 = (char *) malloc(LZ1)) == ((char *)0)) fatal("No memory for str1",(char *)0,0); str1s.ptr = &str1; str1s.len = LZ1; if ((str2 = (char *) malloc(LZ2)) == (char *)0) fatal("No memory for str2",(char *)0,0); str2s.ptr = &str2; str2s.len = LZ2; } void strrealloc(strs) struct str *strs; { strs->len *= 2; *strs->ptr = (char *) realloc(*strs->ptr, strs->len + 16); if(*strs->ptr == (char *) NULL) fatal("No memory for string reallocation",(char *)0,0); } /* * Intern a name. Return a pointer to the name struct */ struct name *newname(name) char *name; { register struct name *rp; register struct name *rrp; register char *cp; register int i; register char *suff; /* ptr. to suffix in current name */ register struct name **sp; /* ptr. to ptr. to chain of names */ if ( (suff = suffix(name)) != (char *)NULL) { for (i = 1, sp = suffparray, sp++; i <= maxsuffarray && strcmp(suff, (*sp)->n_name) != 0; sp++,i++); if (i > maxsuffarray) { if ( i >= sizesuffarray) { /* must realloc suffarray */ sizesuffarray *= 2; if( (suffparray = (struct name **) realloc((char *) suffparray, sizesuffarray * sizeof(struct name *))) == (struct name **) NULL) fatal("No memory for suffarray",(char *)0,0); } maxsuffarray++; sp = &suffparray[i]; if ((*sp = (struct name *)malloc(sizeof (struct name))) == (struct name *)0) fatal("No memory for name",(char *)0,0); (*sp)->n_next = (struct name *)0; if ((cp = (char *) malloc(strlen(suff)+1)) == (char *)0) fatal("No memory for name",(char *)0,0); strcpy(cp, suff); (*sp)->n_name = cp; } } else sp = suffparray; for ( rp = (*sp)->n_next, rrp = *sp; rp; rp = rp->n_next, rrp = rrp->n_next ) if (strcmp(name, rp->n_name) == 0) return rp; if ( freerp == (struct name *)NULL) { if ((rp = (struct name *)malloc(sizeof (struct name))) == (struct name *)0) fatal("No memory for name",(char *)0,0); } else { rp = freerp; freerp = (struct name *)NULL; } rrp->n_next = rp; rp->n_next = (struct name *)0; if ((cp = (char *) malloc(strlen(name)+1)) == (char *)0) fatal("No memory for name",(char *)0,0); strcpy(cp, name); rp->n_name = cp; rp->n_line = (struct line *)0; rp->n_time = (time_t)0; rp->n_flag = 0; lastrrp = rrp; return rp; } /* * Test a name. * If the name already exists return the ptr. to its name structure. * Else if the file exists 'intern' the name and return the ptr. * Otherwise don't waste memory and return a NULL pointer */ struct name *testname(name) char *name; { register struct name *rp; lastrrp = (struct name *)NULL; rp = newname( name); if (rp->n_line || rp->n_flag & N_EXISTS) return(rp); modtime(rp); if (rp->n_flag & N_EXISTS) return(rp); if (lastrrp != (struct name *)NULL) { free (rp->n_name); lastrrp->n_next = (struct name *)NULL; freerp = rp; } return((struct name *)NULL); } /* * Add a dependant to the end of the supplied list of dependants. * Return the new head pointer for that list. */ struct depend *newdep(np, dp) struct name *np; struct depend *dp; { register struct depend *rp; register struct depend *rrp; if ((rp = (struct depend *)malloc(sizeof (struct depend))) == (struct depend *)0) fatal("No memory for dependant",(char *)0,0); rp->d_next = (struct depend *)0; rp->d_name = np; if (dp == (struct depend *)0) return rp; for (rrp = dp; rrp->d_next; rrp = rrp->d_next) ; rrp->d_next = rp; return dp; } /* * Add a command to the end of the supplied list of commands. * Return the new head pointer for that list. */ struct cmd *newcmd(str, cp) char *str; struct cmd *cp; { register struct cmd *rp; register struct cmd *rrp; register char *rcp; if (rcp = strrchr(str, '\n')) *rcp = '\0'; /* Loose newline */ while (isspace(*str)) str++; if (*str == '\0') return cp; /* If nothing left, the exit */ if ((rp = (struct cmd *)malloc(sizeof (struct cmd))) == (struct cmd *)0) fatal("No memory for command",(char *)0,0); rp->c_next = (struct cmd *)0; if ((rcp = (char *) malloc(strlen(str)+1)) == (char *)0) fatal("No memory for command",(char *)0,0); strcpy(rcp, str); rp->c_cmd = rcp; if (cp == (struct cmd *)0) return rp; for (rrp = cp; rrp->c_next; rrp = rrp->c_next) ; rrp->c_next = rp; return cp; } /* * Add a new 'line' of stuff to a target. This check to see * if commands already exist for the target. If flag is set, * the line is a double colon target. * * Kludges: * i) If the new name begins with a '.', and there are no dependents, * then the target must cease to be a target. This is for .SUFFIXES. * ii) If the new name begins with a '.', with no dependents and has * commands, then replace the current commands. This is for * redefining commands for a default rule. * Neither of these free the space used by dependents or commands, * since they could be used by another target. */ void newline(np, dp, cp, flag) struct name *np; struct depend *dp; struct cmd *cp; int flag; { bool hascmds = FALSE; /* Target has commands */ register struct line *rp; register struct line *rrp; /* Handle the .SUFFIXES case */ if (np->n_name[0] == '.' && !dp && !cp) { for (rp = np->n_line; rp; rp = rrp) { rrp = rp->l_next; free(rp); } np->n_line = (struct line *)0; np->n_flag &= ~N_TARG; return; } /* This loop must happen since rrp is used later. */ for ( rp = np->n_line, rrp = (struct line *)0; rp; rrp = rp, rp = rp->l_next) if (rp->l_cmd) hascmds = TRUE; if (hascmds && cp && !(np->n_flag & N_DOUBLE)) /* Handle the implicit rules redefinition case */ if (np->n_name[0] == '.' && dp == (struct depend *)0) { np->n_line->l_cmd = cp; return; } else error("Commands defined twice for target %s", np->n_name); if (np->n_flag & N_TARG) if (!(np->n_flag & N_DOUBLE) != !flag) /* like xor */ error("Inconsistent rules for target %s", np->n_name); if ((rp = (struct line *)malloc(sizeof (struct line))) == (struct line *)0) fatal("No memory for line",(char *)0,0); rp->l_next = (struct line *)0; rp->l_dep = dp; rp->l_cmd = cp; if (rrp) rrp->l_next = rp; else np->n_line = rp; np->n_flag |= N_TARG; if (flag) np->n_flag |= N_DOUBLE; } /* * Parse input from the makefile, and construct a tree structure * of it. */ void input(fd) FILE *fd; { char J��J��J��J�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� *p; /* General */ char *q; register char *a; struct name *np; struct depend *dp; struct cmd *cp; bool dbl; if (getline(&str1s, fd)) return; /* Read the first line */ for(;;) { if (*str1 == TABCHAR) /* Rules without targets */ error("Rules not allowed here",(char *)0); p = str1; while (isspace(*p)) p++; /* Find first target */ while (((q = strchr(p, '=')) != (char *)0) && (p != q) && (q[-1] == '\\')) /* Find value */ { a = q - 1; /* Del \ chr; move rest back */ p = q; while(*a++ = *q++) ; } if (q != (char *)0) { *q++ = '\0'; /* Separate name and val */ while (isspace(*q)) q++; if (p = strrchr(q, '\n')) *p = '\0'; p = str1; if ((a = gettok(&p)) == (char *)0) error("No macro name",(char *)0); setmacro(a, q); if (getline(&str1s, fd)) return; continue; } /* include? */ p = str1; while (isspace(*p)) p++; if (strncmp(p, "include", 7) == 0 && isspace(p[7])) { char *old_makefile = makefile; int old_lineno = lineno; FILE *ifd; p += 8; memmove(str1, p, strlen(p)+1); expand(&str1s); p = str1; while (isspace(*p)) p++; if ((q = malloc(strlen(p)+1)) == (char *)0) fatal("No memory for include",(char *)0,0); strcpy(q, p); p = q; while ((makefile = gettok(&q)) != (char *)0) { if ((ifd = fopen(makefile, "r")) == (FILE *)0) fatal("Can't open %s: %s", makefile, errno); lineno = 0; input(ifd); fclose(ifd); } free(p); makefile = old_makefile; lineno = old_lineno; if (getline(&str1s, fd)) return; continue; } /* Search for commands on target line --- do not expand them ! */ q = str1; cp = (struct cmd *)0; if ((a = strchr(q, ';')) != (char *)0) { *a++ = '\0'; /* Separate dependents and commands */ if ( a) cp = newcmd(a, cp); } expand(&str1s); p = str1; while (isspace(*p)) p++; while (((q = strchr(p, ':')) != (char *)0) && (p != q) && (q[-1] == '\\')) /* Find dependents */ { a = q - 1; /* Del \ chr; move rest back */ p = q; while(*a++ = *q++) ; } if (q == (char *)0) error("No targets provided",(char *)0); *q++ = '\0'; /* Separate targets and dependents */ if (*q == ':') { /* Double colon */ dbl = 1; q++; } else dbl = 0; for (dp = (struct depend *)0; ((p = gettok(&q)) != (char *)0);) /* get list of dep's */ { np = newname(p); /* Intern name */ dp = newdep(np, dp); /* Add to dep list */ } *((q = str1) + strlen(str1) + 1) = '\0'; /* Need two nulls for gettok (Remember separation) */ if (getline(&str2s, fd) == FALSE) { /* Get commands */ while (*str2 == TABCHAR) { cp = newcmd(&str2[0], cp); if (getline(&str2s, fd)) break; } } while ((p = gettok(&q)) != (char *)0) /* Get list of targ's */ { np = newname(p); /* Intern name */ newline(np, dp, cp, dbl); if (!firstname && p[0] != '.') firstname = np; } if (feof(fd)) /* EOF? */ return; while (strlen(str2) >= str1s.len) strrealloc(&str1s); strcpy(str1, str2); } } ����������������������������������/************************************************************************* * * m a k e : m a c r o . c * * Macro control for make *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 23.08.89 Error message corrected RAL * 3 30.08.89 macro flags added, indention ch. PSH,RAL * 4 03.09.89 fixed LZ eliminated, doexp(...) changed RAL * 5 06.09.89 M_MAKE added, setDFmacro added RAL * 6 20.09.89 work around for Minix PC ACK bug BE,RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #include "h.h" static char buf[256]; struct macro *getmp(name) char *name; { register struct macro *rp; for (rp = macrohead; rp; rp = rp->m_next) if (strcmp(name, rp->m_name) == 0) return rp; return (struct macro *)0; } char *getmacro(name) char *name; { struct macro *mp; if (mp = getmp(name)) return mp->m_val; /* else*/ return ""; } struct macro *setmacro(name, val) char *name; char *val; { register struct macro *rp; register char *cp; /* Replace macro definition if it exists */ for (rp = macrohead; rp; rp = rp->m_next) if (strcmp(name, rp->m_name) == 0) { if(rp->m_flag & M_OVERRIDE) return rp; /* mustn't change */ free(rp->m_val); /* Free space from old */ break; } if (!rp) /* If not defined, allocate space for new */ { if ((rp = (struct macro *)malloc(sizeof (struct macro))) == (struct macro *)0) fatal("No memory for macro",(char *)0,0); rp->m_next = macrohead; macrohead = rp; rp->m_flag = FALSE; if ((cp = (char *) malloc(strlen(name)+1)) == (char *)0) fatal("No memory for macro",(char *)0,0); strcpy(cp, name); rp->m_name = cp; } if ((cp = (char *) malloc(strlen(val)+1)) == (char *)0) fatal("No memory for macro",(char *)0,0); strcpy(cp, val); /* Copy in new value */ rp->m_val = cp; return rp; } void setDFmacro(name, val) char *name; char *val; { char *c,*tmp; int len; static char filename[]="@F"; static char dirname[] ="@D"; setmacro(name,val); *filename = *name; *dirname = *name; /* Null string -- not defined macro */ if ( !(*val)) { setmacro(filename,""); setmacro(dirname,""); return; } if (!(c = strrchr(val,(int)'/'))) { setmacro(filename,val); setmacro(dirname,"./"); return; } setmacro(filename,c+1); len = c - val + 1; if((tmp = (char *) malloc(len + 1)) == (char *) 0) fatal("No memory for tmp",(char *)0,0); strncpy(tmp,val,len); tmp[len] = '\0'; setmacro(dirname,tmp); free(tmp); return; } /* * Do the dirty work for expand */ void doexp(to, from) struct str *to; char *from; { register char *rp; register char *p; char *q; struct macro *mp; rp = from; p = &(*to->ptr)[to->pos]; while (*rp) { if (*rp != '$') { *p++ = *rp++; to->pos++; } else { q = buf; if (*++rp == '{') while (*++rp && *rp != '}') *q++ = *rp; else if (*rp == '(') while (*++rp && *rp != ')') *q++ = *rp; else if (!*rp) { *p++ = '$'; to->pos++; goto bail; } else *q++ = *rp; *q = '\0'; if (*rp) rp++; if (!(mp = getmp(buf))) mp = setmacro(buf, ""); if (mp->m_flag & M_MARK) fatal("Infinitely recursive macro %s", mp->m_name,0); mp->m_flag |= M_MARK; if ( mp->m_flag & M_MAKE) expmake = TRUE; doexp(to, mp->m_val); p = &(*to->ptr)[to->pos]; mp->m_flag &= ~M_MARK; } bail: if (to->pos >= to->len) { strrealloc(to); p = &(*to->ptr)[to->pos]; } } *p = '\0'; } /* * Expand any macros in str. */ void expand(strs) struct str *strs; { char *a; if ((a = (char *) malloc(strlen(*strs->ptr)+1)) == (char *)0) fatal("No memory for temporary string",(char *)0,0); strcpy(a, *strs->ptr); strs->pos = 0; doexp(strs, a); free(a); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : m a i n . c * *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 01.07.89 strcmp(makefile,..) only if makefile a valid ptr. RAL * 3 23.08.89 initname() added RAL * 4 30.08.89 argument parsing impr., indention ch., macro fl. add.PSH,RAL * 5 03.09.89 k-option added, initname -> init changed RAL * 6 06.09.89 environment, MAKEFLAGS, e,d,a options added, RAL * 7 09.09.89 tos support added, fatal args added, fopen makefile PHH,RAL * 8 17.09.89 setoptions fixed for __STDC__ RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ /* * make: * * -a try to guess undefined ambiguous macros (*,<) * -d print debugging info * -e environment macro def. overwrite makefile def. * -f makefile name * -i ignore exit status * -k continue on errors * -n pretend to make * -p print all macros & targets * -q question up-to-dateness of target. Return exit status 1 if not * -r don't not use inbuilt rules * -s make silently * -t touch files instead of making them * -m Change memory requirements (EON only) */ #define EXTERN #define INIT(x) = x #define INITARRAY #include "h.h" static char version[]= "2.0"; static FILE *ifd; /* Input file desciptor */ static char *ptrmakeflags; /* There must be enough 'space' for all possible flags ! */ static char makeflags[] = "MAKEFLAGS= "; void main(argc, argv) int argc; char **argv; { register char *p; /* For argument processing */ int estat = 0; /* For question */ register struct name *np; struct macro *mp; int targc; /* temporary for multiple scans */ char **targv; char **nargv; /* for removing items from argv */ char **envp; /* enivironment ptr */ ptrmakeflags = &makeflags[10]; myname = (argc-- < 1) ? "make" : *argv++; #ifdef tos myname = "Make"; #endif targc = argc; targv = nargv = argv; while (targc--) { if((p = strchr(*targv, '=')) != (char *)NULL) { *p = '\0'; mp = setmacro(*targv, p + 1); mp->m_flag |= M_OVERRIDE; --argc; } else *nargv++ = *targv; ++targv; } targc = argc; targv = nargv = argv; while (targc--) { if (**targv == '-') { --argc; p = *targv++; while (*++p != '\0') { switch(mylower(*p)) { case 'f': /* Alternate file name */ if (*++p == '\0') { --argc; if (targc-- == 0) usage(); p = *targv++; } makefile = p; goto end_of_args; #ifdef eon case 'm': /* Change space requirements */ if (*++p == '\0') { --argc; if (targc-- <= 0) usage(); p = *targv++; } memspace = atoi(p); goto end_of_args; #endif default : setoption(*p); break; } } end_of_args:; } else *nargv++ = *targv++; } /* evaluate and update environment MAKEFLAGS */ if((p =getenv("MAKEFLAGS")) != (char *)0) while(*p) setoption(*p++); for( p = ptrmakeflags; !isspace((int)*p); p++) ; *p = '\0'; putenv(makeflags); #ifdef eon if (initalloc(memspace) == 0xffff) /* Must get memory for alloc */ fatal("Cannot initalloc memory",(char *)0,0); #endif if (makefile && strcmp(makefile, "-") == 0) /* use stdin as makefile */ ifd = stdin; else if (!makefile) { /* If no file, then use default */ if ((ifd = fopen(makefile = DEFN1, "r")) == (FILE *)0) { if (errno != MNOENT || !DEFN2) fatal("Can't open %s: %s", DEFN1, errno); else if ((ifd = fopen(makefile = DEFN2, "r")) == (FILE *)0) fatal("Can't open %s: %s", DEFN2, errno); } } else if ((ifd = fopen(makefile, "r")) == (FILE *)0) fatal("Can't open %s: %s", makefile, errno); init(); makerules(); mp = setmacro("MAKE", myname); mp->m_flag |= M_MAKE; setmacro("$", "$"); /* set environment macros */ envp = environ; /* get actual environment ptr. */ while (*envp) { if((p = strchr(*envp, '=')) != (char *)NULL) { *p = '\0'; mp = setmacro(*envp, p + 1); *p = '='; if (useenv) mp->m_flag |= M_OVERRIDE; } else fatal("invalid environment: %s",*envp,0); ++envp; } input(ifd); /* Input all the gunga */ fclose(ifd); /* Finished with makefile */ lineno = 0; /* Any calls to error now print no line number */ if (print) prt(); /* Print out structures */ np = newname(".SILENT"); if (np->n_flag & N_TARG) silent = TRUE; np = newname(".IGNORE"); if (np->n_flag & N_TARG) ignore = TRUE; precious(); if (!firstname) fatal("No targets defined",(char *)0,0); circh(); /* Check circles in target definitions */ if (!argc) estat = make(firstname, 0); else while (argc--) { estat |= make(newname(*argv++), 0); } if (quest) exit(estat); else exit(0); } #ifdef __STDC__ void setoption(char option) #else void setoption(option) char option; #endif { register char *c; option = mylower(option); switch(option) { case 'n': /* Pretend mode */ domake = FALSE; break; case 'i': /* Ignore fault mode */ ignore = TRUE; break; case 'k': /* Continue on errror */ conterr = TRUE; break; case 's': /* Silent about commands */ silent = TRUE; break; case 'p': print = TRUE; break; case 'r': rules = FALSE; break; case 't': dotouch = TRUE; break; case 'q': quest = TRUE; break; case 'e': useenv = TRUE; break; case 'd': dbginfo = TRUE; break; case 'a': ambigmac = TRUE; break; default: /* Wrong option */ usage(); } for( c = ptrmakeflags; !isspace((int)*c); c++) if ( *c == option) return; *c = option; } void usage() { fprintf(stderr, "Syntax: %s [{options | macro=val | target}]\n", myname); fprintf(stderr, "Function: maintaining computer programs V%s\n",version); fprintf(stderr, "Options : -a : try to guess undefined ambiguous macros (*,<)\n"); fprintf(stderr, " -d : print debugging information\n"); fprintf(stderr, " -e : environment macro def. overwrite makefile def.\n"); fprintf(stderr, " -f filename : makefile name (default: makefile, Makefile)\n"); fprintf(stderr, " -i : ignore exit status of executed commands\n"); fprintf(stderr, " -k : continue with unrelated branches on errors\n"); fprintf(stderr, " -n : pretend to make\n"); fprintf(stderr, " -p : print all macros & targets\n"); fprintf(stderr, " -q : question up-to-dateness of target\n"); fprintf(stderr, " -r : don't use inbuilt rules\n"); fprintf(stderr, " -s : make silently\n"); fprintf(stderr, " -t : touch files instead of making them\n"); fprintf(stderr, "Environment: MAKEFLAGS\n"); exit(1); } void fatal(msg, a1, a2) char *msg; char *a1; int a2; { fprintf(stderr, "%s: ", myname); fprintf(stderr, msg, a1, strerror(a2)); fputc('\n', stderr); exit(1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������J��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : m a k e . c * * Do the actual making for make plus system dependent stuff *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 01.07.89 $<,$* bugs fixed RAL * 3 23.08.89 (time_t)time((time_t*)0) bug fixed, N_EXISTS added RAL * 4 30.08.89 leading sp. in cmd. output eliminated, indention ch. PSH,RAL * 5 03.09.89 :: time fixed, error output -> stderr, N_ERROR intr. * fixed LZ elimintaed RAL * 6 07.09.89 implmacro, DF macros,debug stuff added RAL * 7 09.09.89 tos support added PHH,RAL * 8 17.09.89 make1 arg. fixed, N_EXEC introduced RAL * ------------ Version 2.0 released ------------------------------- RAL * 18.05.90 fixed -n bug with silent rules. (Now echos them.) PAN * *************************************************************************/ #include "h.h" #include <sys/wait.h> #include <unistd.h> _PROTOTYPE(static void tellstatus, (FILE *out, char *name, int status)); static bool execflag; /* * Exec a shell that returns exit status correctly (/bin/esh). * The standard EON shell returns the process number of the last * async command, used by the debugger (ugg). * [exec on eon is like a fork+exec on unix] */ int dosh(string, shell) char *string; char *shell; { int number; #ifdef unix return system(string); #endif #ifdef tos return Tosexec(string); #endif #ifdef eon return ((number = execl(shell, shell,"-c", string, 0)) == -1) ? -1: /* couldn't start the shell */ wait(number); /* return its exit status */ #endif #ifdef os9 int status, pid; strcat(string, "\n"); if ((number = os9fork(shell, strlen(string), string, 0, 0, 0)) == -1) return -1; /* Couldn't start a shell */ do { if ((pid = wait(&status)) == -1) return -1; /* child already died!?!? */ } while (pid != number); return status; #endif } #ifdef unix /* * Make a file look very outdated after an error trying to make it. * Don't remove, this keeps hard links intact. (kjb) */ int makeold(name) char *name; { struct utimbuf a; a.actime = a.modtime = 0; /* The epoch */ return utime(name, &a); } #endif static void tellstatus(out, name, status) FILE *out; char *name; int status; { char cwd[PATH_MAX]; fprintf(out, "%s in %s: ", name, getcwd(cwd, sizeof(cwd)) == NULL ? "?" : cwd); if (WIFEXITED(status)) { fprintf(out, "Exit code %d", WEXITSTATUS(status)); } else { fprintf(out, "Signal %d%s", WTERMSIG(status), status & 0x80 ? " - core dumped" : ""); } } /* * Do commands to make a target */ void docmds1(np, lp) struct name *np; struct line *lp; { register char *q; register char *p; register struct cmd *cp; bool ssilent; bool signore; int estat; char *shell; if (*(shell = getmacro("SHELL")) == '\0') #ifdef eon shell = ":bin/esh"; #endif #ifdef unix shell = "/bin/sh"; #endif #ifdef os9 shell = "shell"; #endif #ifdef tos shell = "DESKTOP"; /* TOS has no shell */ #endif for (cp = lp->l_cmd; cp; cp = cp->c_next) { execflag = TRUE; strcpy(str1, cp->c_cmd); expmake = FALSE; expand(&str1s); q = str1; ssilent = silent; signore = ignore; while ((*q == '@') || (*q == '-')) { if (*q == '@') /* Specific silent */ ssilent = TRUE; else /* Specific ignore */ signore = TRUE; if (!domake) putchar(*q); /* Show all characters. */ q++; /* Not part of the command */ } for (p=q; *p; p++) { if (*p == '\n' && p[1] != '\0') { *p = ' '; if (!ssilent || !domake) fputs("\\\n", stdout); } else if (!ssilent || !domake) putchar(*p); } if (!ssilent || !domake) putchar('\n'); if (domake || expmake) { /* Get the shell to execute it */ fflush(stdout); if ((estat = dosh(q, shell)) != 0) { if (estat == -1) fatal("Couldn't execute %s", shell,0); else if (signore) { tellstatus(stdout, myname, estat); printf(" (Ignored)\n"); } else { tellstatus(stderr, myname, estat); fprintf(stderr, "\n"); if (!(np->n_flag & N_PREC)) #ifdef unix if (makeold(np->n_name) == 0) fprintf(stderr,"%s: made '%s' look old.\n", myname, np->n_name); #else if (unlink(np->n_name) == 0) fprintf(stderr,"%s: '%s' removed.\n", myname, np->n_name); #endif if (!conterr) exit(estat != 0); np->n_flag |= N_ERROR; return; } } } } } void docmds(np) struct name *np; { register struct line *lp; for (lp = np->n_line; lp; lp = lp->l_next) docmds1(np, lp); } #ifdef tos /* * execute the command submitted by make, * needed because TOS has no internal shell, * so we use Pexec to do the job * v 1.1 of 10/sep/89 by yeti */ #define DELM1 ';' #define DELM2 ' ' #define DELM3 ',' int Tosexec(string) char *string; { register char *help, *help2, c; register unsigned char l=1; char progname[80], command[255], plain[15]; static char **envp,*env; register int error,i; /* generate strange TOS environment (RAL) */ for ( i = 0, envp = environ; *envp; envp++) i += strlen(*envp) +1; if ((env = malloc(i+1)) == (char *)0) fatal("No memory for TOS environment",(char *)0,0); for ( envp = environ, help = env; *envp; envp++) { strcpy ( help, *envp); while ( *(help++)) ; } *help = '\0'; help = progname; while((*help++=*string++) != ' '); /* progname is command name */ *--help = '\0'; l = strlen(string); /* build option list */ command[0] = l; /* TOS likes it complicated */ strcpy(&command[1],string); if ((error = (int) Pexec(0,progname,command,env)) != -33) { free(env); return(error); } /* could'nt find program, try to search the PATH */ if((help=strrchr(progname,'\\')) != (char *) 0) /* just the */ strcpy(plain,++help); /* name */ else if((help=strrchr(progname,'/')) != (char *) 0) strcpy(plain,++help); else if((help=strrchr(progname,':')) != (char *) 0) strcpy(plain,++help); else strcpy(plain,progname); if(*(help=getmacro("PATH")) == '\0') { free(env); return(-33); } c = 1; while(c) { help2 = &progname[-1]; i = 0; while((c=*help++) != '\0' && i<80 && c != DELM1 && c != DELM2 && c != DELM3) *++help2 = c, i++; *++help2 = '\\'; strcpy(++help2,plain); if((error=(int) Pexec(0,progname,command,env))!=-33) { free(env); return(error); } } free(env); return(-33); } /* (stolen from ZOO -- thanks to Rahul Dehsi) Function mstonix() accepts an MSDOS format date and time and returns a **IX format time. No adjustment is done for timezone. */ time_t mstonix (date, time) unsigned int date, time; { int year, month, day, hour, min, sec, daycount; time_t longtime; /* no. of days to beginning of month for each month */ static int dsboy[12] = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; if (date == 0 && time == 0) /* special case! */ return (0L); /* part of following code is common to zoolist.c */ year = (((unsigned int) date >> 9) & 0x7f) + 1980; month = ((unsigned int) date >> 5) & 0x0f; day = date & 0x1f; hour = ((unsigned int) time >> 11)& 0x1f; min = ((unsigned int) time >> 5) & 0x3f; sec = ((unsigned int) time & 0x1f) * 2; /* DEBUG and leap year fixes thanks to Mark Alexander <uunet!amdahl!drivax!alexande>*/ #ifdef DEBUG printf ("mstonix: year=%d month=%d day=%d hour=%d min=%d sec=%d\n", year, month, day, hour, min, sec); #endif /* Calculate days since 19J��J��J��J��J��J��J��J��J���K��K��K������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������70/01/01 */ daycount = 365 * (year - 1970) + /* days due to whole years */ (year - 1969) / 4 + /* days due to leap years */ dsboy[month-1] + /* days since beginning of this year */ day-1; /* days since beginning of month */ if (year % 4 == 0 && year % 400 != 0 && month >= 3) /* if this is a leap year and month */ daycount++; /* is March or later, add a day */ /* Knowing the days, we can find seconds */ longtime = daycount * 24L * 60L * 60L + hour * 60L * 60L + min * 60 + sec; return (longtime); } #endif /* tos */ #ifdef os9 /* * Some stuffing around to get the modified time of a file * in an os9 file system */ void getmdate(fd, tbp) int fd; struct sgtbuf *tbp; { struct registers regs; static struct fildes fdbuf; regs.rg_a = fd; regs.rg_b = SS_FD; regs.rg_x = &fdbuf; regs.rg_y = sizeof (fdbuf); if (_os9(I_GETSTT, ®s) == -1) { errno = regs.rg_b & 0xff; return -1; } if (tbp) { _strass(tbp, fdbuf.fd_date, sizeof (fdbuf.fd_date)); tbp->t_second = 0; /* Files are only acurate to mins */ } return 0; } /* * Kludge routine to return an aproximation of how many * seconds since 1980. Dates will be in order, but will not * be lineer */ time_t cnvtime(tbp) struct sgtbuf *tbp; { long acc; acc = tbp->t_year - 80; /* Baseyear is 1980 */ acc = acc * 12 + tbp->t_month; acc = acc * 31 + tbp->t_day; acc = acc * 24 + tbp->t_hour; acc = acc * 60 + tbp->t_minute; acc = acc * 60 + tbp->t_second; return acc; } /* * Get the current time in the internal format */ void time(tp) time_t *tp; { struct sgtbuf tbuf; if (getime(&tbuf) < 0) return -1; if (tp) *tp = cnvtime(&tbuf); return 0; } #endif /* * Get the modification time of a file. If the first * doesn't exist, it's modtime is set to 0. */ void modtime(np) struct name *np; { #ifdef unix struct stat info; int r; if (is_archive_ref(np->n_name)) { r = archive_stat(np->n_name, &info); } else { r = stat(np->n_name, &info); } if (r < 0) { if (errno != ENOENT) fatal("Can't open %s: %s", np->n_name, errno); np->n_time = 0L; np->n_flag &= ~N_EXISTS; } else { np->n_time = info.st_mtime; np->n_flag |= N_EXISTS; } #endif #ifdef tos struct DOSTIME fm; int fd; if((fd=Fopen(np->n_name,0)) < 0) { np->n_time = 0L; np->n_flag &= ~N_EXISTS; } else { Fdatime(&fm,fd,0); Fclose(fd); np->n_time = mstonix((unsigned int)fm.date,(unsigned int)fm.time); np->n_flag |= N_EXISTS; } #endif #ifdef eon struct stat info; int fd; if ((fd = open(np->n_name, 0)) < 0) { if (errno != ER_NOTF) fatal("Can't open %s: %s", np->n_name, errno); np->n_time = 0L; np->n_flag &= ~N_EXISTS; } else if (getstat(fd, &info) < 0) fatal("Can't getstat %s: %s", np->n_name, errno); else { np->n_time = info.st_mod; np->n_flag |= N_EXISTS; } close(fd); #endif #ifdef os9 struct sgtbuf info; int fd; if ((fd = open(np->n_name, 0)) < 0) { if (errno != E_PNNF) fatal("Can't open %s: %s", np->n_name, errno); np->n_time = 0L; np->n_flag &= ~N_EXISTS; } else if (getmdate(fd, &info) < 0) fatal("Can't getstat %s: %s", np->n_name, errno); else { np->n_time = cnvtime(&info); np->n_flag |= N_EXISTS; } close(fd); #endif } /* * Update the mod time of a file to now. */ void touch(np) struct name *np; { char c; int fd; if (!domake || !silent) printf("touch(%s)\n", np->n_name); if (domake) { #ifdef unix struct utimbuf a; a.actime = a.modtime = time((time_t *)NULL); if (utime(np->n_name, &a) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); #endif #ifdef tos struct DOSTIME fm; int fd; if((fd=Fopen(np->n_name,0)) < 0) { printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); } else { fm.date = Tgetdate(); fm.time = Tgettime(); Fdatime(&fm,fd,1); Fclose(fd); } #endif #ifdef eon if ((fd = open(np->n_name, 0)) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); else { uread(fd, &c, 1, 0); uwrite(fd, &c, 1); } close(fd); #endif #ifdef os9 /* * Strange that something almost as totally useless * as this is easy to do in os9! */ if ((fd = open(np->n_name, S_IWRITE)) < 0) printf("%s: '%s' not touched - non-existant\n", myname, np->n_name); close(fd); #endif } } /* * Recursive routine to make a target. */ int make(np, level) struct name *np; int level; { register struct depend *dp; register struct line *lp; register struct depend *qdp; time_t now, t, dtime = 0; bool dbgfirst = TRUE; char *basename = (char *) 0; char *inputname = (char *) 0; if (np->n_flag & N_DONE) { if(dbginfo) dbgprint(level,np,"already done"); return 0; } modtime(np); /* Gets modtime of this file */ while (time(&now) == np->n_time) { /* Time of target is equal to the current time. This bothers us, because * we can't tell if it needs to be updated if we update a file it depends * on within a second. So wait a second. (A per-second timer is too * coarse for today's fast machines.) */ sleep(1); } if (rules) { for (lp = np->n_line; lp; lp = lp->l_next) if (lp->l_cmd) break; if (!lp) dyndep(np,&basename,&inputname); } if (!(np->n_flag & (N_TARG | N_EXISTS))) { fprintf(stderr,"%s: Don't know how to make %s\n", myname, np->n_name); if (conterr) { np->n_flag |= N_ERROR; if (dbginfo) dbgprint(level,np,"don't know how to make"); return 0; } else exit(1); } for (qdp = (struct depend *)0, lp = np->n_line; lp; lp = lp->l_next) { for (dp = lp->l_dep; dp; dp = dp->d_next) { if(dbginfo && dbgfirst) { dbgprint(level,np," {"); dbgfirst = FALSE; } make(dp->d_name, level+1); if (np->n_time < dp->d_name->n_time) qdp = newdep(dp->d_name, qdp); dtime = max(dtime, dp->d_name->n_time); if (dp->d_name->n_flag & N_ERROR) np->n_flag |= N_ERROR; if (dp->d_name->n_flag & N_EXEC ) np->n_flag |= N_EXEC; } if (!quest && (np->n_flag & N_DOUBLE) && (np->n_time < dtime || !( np->n_flag & N_EXISTS))) { execflag = FALSE; make1(np, lp, qdp, basename, inputname); /* free()'s qdp */ dtime = 0; qdp = (struct depend *)0; if(execflag) np->n_flag |= N_EXEC; } } np->n_flag |= N_DONE; if (quest) { t = np->n_time; np->n_time = now; return (t < dtime); } else if ((np->n_time < dtime || !( np->n_flag & N_EXISTS)) && !(np->n_flag & N_DOUBLE)) { execflag = FALSE; make1(np, (struct line *)0, qdp, basename, inputname); /* free()'s qdp */ np->n_time = now; if ( execflag) np->n_flag |= N_EXEC; } else if ( np->n_flag & N_EXEC ) { np->n_time = now; } if (dbginfo) { if(dbgfirst) { if(np->n_flag & N_ERROR) dbgprint(level,np,"skipped because of error"); else if(np->n_flag & N_EXEC) dbgprint(level,np,"successfully made"); else dbgprint(level,np,"is up to date"); } else { if(np->n_flag & N_ERROR) dbgprint(level,(struct name *)0,"} skipped because of error"); else if(np->n_flag & N_EXEC) dbgprint(level,(struct name *)0,"} successfully made"); else dbgprint(level,(struct name *)0,"} is up to date"); } } if (level == 0 && !(np->n_flag & N_EXEC)) printf("%s: '%s' is up to date\n", myname, np->n_name); if(basename) free(basename); return 0; } void make1(np, lp, qdp, basename, inputname) struct name *np; struct line *lp; register struct depend *qdp; char *basename; char *inputname; { register struct depend *dp; if (dotouch) touch(np); else if (!(np->n_flag & N_ERROR)) { strcpy(str1, ""); if(!inputname) { inputname = str1; /* default */ if (ambigmac) implmacros(np,lp,&basename,&inputname); } setDFmacro("<",inputname); if(!basename) basename = str1; setDFmacro("*",basename); for (dp = qdp; dp; dp = qdp) { if (strlen(str1)) strcat(str1, " "); strcat(str1, dp->d_name->n_name); qdp = dp->d_next; free(dp); } setmacro("?", str1); setDFmacro("@", np->n_name); if (lp) /* lp set if doing a :: rule */ docmds1(np, lp); else docmds(np); } } void implmacros(np,lp, pbasename,pinputname) struct name *np; struct line *lp; char **pbasename; /* Name without suffix */ char **pinputname; { struct line *llp; register char *p; register char *q; register char *suff; /* Old suffix */ int baselen; struct depend *dp; bool dpflag = FALSE; /* get basename out of target name */ p = str2; q = np->n_name; suff = suffix(q); while ( *q && (q < suff || !suff)) *p++ = *q++; *p = '\0'; if ((*pbasename = (char *) malloc(strlen(str2)+1)) == (char *)0 ) fatal("No memory for basename",(char *)0,0); strcpy(*pbasename,str2); baselen = strlen(str2); if ( lp) llp = lp; else llp = np->n_line; while (llp) { for (dp = llp->l_dep; dp; dp = dp->d_next) { if( strncmp(*pbasename,dp->d_name->n_name,baselen) == 0) { *pinputname = dp->d_name->n_name; return; } if( !dpflag) { *pinputname = dp->d_name->n_name; dpflag = TRUE; } } if (lp) break; llp = llp->l_next; } #if NO_WE_DO_WANT_THIS_BASENAME free(*pbasename); /* basename ambiguous or no dependency file */ *pbasename = (char *)0; #endif return; } void dbgprint(level,np,comment) int level; struct name *np; char *comment; { char *timep; if(np) { timep = ctime(&np->n_time); timep[24] = '\0'; fputs(&timep[4],stdout); } else fputs(" ",stdout); fputs(" ",stdout); while(level--) fputs(" ",stdout); if (np) { fputs(np->n_name,stdout); if (np->n_flag & N_DOUBLE) fputs(" :: ",stdout); else fputs(" : ",stdout); } fputs(comment,stdout); putchar((int)'\n'); fflush(stdout); return; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/************************************************************************* * * m a k e : r e a d e r . c * * Read in makefile *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 23.08.89 cast to NULL added RAL * 3 30.08.89 indention changed PSH,RAL * 4 03.09.89 fixed LZ eliminated RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #include "h.h" /* * Syntax error handler. Print message, with line number, and exits. */ void error(msg, a1) char *msg; char *a1; { fprintf(stderr, "%s: ", myname); fprintf(stderr, msg, a1); if (lineno) fprintf(stderr, " in %s near line %d", makefile, lineno); fputc('\n', stderr); exit(1); } /* * Read a line into the supplied string. Remove * comments, ignore blank lines. Deal with quoted (\) #, and * quoted newlines. If EOF return TRUE. * * The comment handling code has been changed to leave comments and * backslashes alone in shell commands (lines starting with a tab). * This is not what POSIX wants, but what all makes do. (KJB) */ bool getline(strs, fd) struct str *strs; FILE *fd; { register char *p; char *q; int c; for (;;) { strs->pos = 0; for (;;) { do { if (strs->pos >= strs->len) strrealloc(strs); if ((c = getc(fd)) == EOF) return TRUE; /* EOF */ (*strs->ptr)[strs->pos++] = c; } while (c != '\n'); lineno++; if (strs->pos >= 2 && (*strs->ptr)[strs->pos - 2] == '\\') { (*strs->ptr)[strs->pos - 2] = '\n'; strs->pos--; } else { break; } } if (strs->pos >= strs->len) strrealloc(strs); (*strs->ptr)[strs->pos] = '\0'; p = q = *strs->ptr; while (isspace(*q)) q++; if (*p != '\t' || *q == '#') { while (((q = strchr(p, '#')) != (char *)0) && (p != q) && (q[-1] == '\\')) { char *a; a = q - 1; /* Del \ chr; move rest back */ p = q; while (*a++ = *q++) ; } if (q != (char *)0) { q[0] = '\n'; q[1] = '\0'; } } p = *strs->ptr; while (isspace(*p)) /* Checking for blank */ p++; if (*p != '\0') return FALSE; } } /* * Get a word from the current line, surounded by white space. * return a pointer to it. String returned has no white spaces * in it. */ char *gettok(ptr) register char **ptr; { register char *p; while (isspace(**ptr)) /* Skip spaces */ (*ptr)++; if (**ptr == '\0') /* Nothing after spaces */ return ((char *)NULL); p = *ptr; /* word starts here */ while ((**ptr != '\0') && (!isspace(**ptr))) (*ptr)++; /* Find end of word */ *(*ptr)++ = '\0'; /* Terminate it */ return(p); } ��������������������������������/************************************************************************* * * m a k e : r u l e s . c * * Control of the implicit suffix rules *======================================================================== * Edition history * * # Date Comments By * --- -------- ---------------------------------------------------- --- * 1 ?? ?? * 2 01.07.89 $<,$* bugs fixed, impl. r. ending in expl. r. added RAL * 3 23.08.89 suffix as macro, testname intr., algorithem to find * source dep. made more intelligent (see Readme3) RAL * 4 30.08.89 indention changed PSH,RAL * 5 03.09.89 fixed LZ eliminated RAL * 6 07.09.89 rules of type '.c', .DEFAULT added, dep. search impr.RAL * ------------ Version 2.0 released ------------------------------- RAL * *************************************************************************/ #include "h.h" /* * Dynamic dependency. This routine applies the suffis rules * to try and find a source and a set of rules for a missing * target. If found, np is made into a target with the implicit * source name, and rules. Returns TRUE if np was made into * a target. */ bool dyndep(np,pbasename,pinputname) struct name *np; char **pbasename; /* Name without suffix */ char **pinputname; { register char *p; register char *q; register char *suff; /* Old suffix */ struct name *op = (struct name *)0,*optmp; /* New dependent */ struct name *sp; /* Suffix */ struct line *lp,*nlp; struct depend *dp,*ndp; struct cmd *cmdp; char *newsuff; bool depexists = FALSE; p = str1; q = np->n_name; suff = suffix(q); while (*q && (q < suff || !suff)) *p++ = *q++; *p = '\0'; if ((*pbasename = (char *) malloc(strlen(str1)+1)) == (char *)0 ) fatal("No memory for basename",(char *)0,0); strcpy(*pbasename,str1); if ( !suff) suff = p - str1 + *pbasename; /* set suffix to nullstring */ if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG)) return FALSE; /* search all .SUFFIXES lines */ for (lp = sp->n_line; lp; lp = lp->l_next) /* try all suffixes */ for (dp = lp->l_dep; dp; dp = dp->d_next) { /* compose implicit rule name (.c.o)...*/ newsuff = dp->d_name->n_name; while (strlen(suff)+strlen(newsuff)+1 >= str1s.len) strrealloc(&str1s); p = str1; q = newsuff; while (*p++ = *q++) ; p--; q = suff; while (*p++ = *q++) ; /* look if the rule exists */ sp = newname(str1); if (sp->n_flag & N_TARG) { /* compose resulting dependency name */ while (strlen(*pbasename) + strlen(newsuff)+1 >= str1s.len) strrealloc(&str1s); q = *pbasename; p = str1; while (*p++ = *q++) ; p--; q = newsuff; while (*p++ = *q++) ; /* test if dependency file or an explicit rule exists */ if ((optmp= testname(str1)) != (struct name *)0) { /* store first possible dependency as default */ if ( op == (struct name *)0) { op = optmp; cmdp = sp->n_line->l_cmd; } /* check if testname is an explicit dependency */ for ( nlp=np->n_line; nlp; nlp=nlp->l_next) { for( ndp=nlp->l_dep; ndp; ndp=ndp->d_next) { if ( strcmp( ndp->d_name->n_name, str1) == 0) { op = optmp; cmdp = sp->n_line->l_cmd; ndp = (struct depend *) 0; goto found2; } depexists = TRUE; } } /* if no explicit dependencies : accept testname */ if (!depexists) goto found; } } } if ( op == (struct name *)0) { if( np->n_flag & N_TARG) { /* DEFAULT handling */ if (!((sp = newname(".DEFAULT"))->n_flag & N_TARG)) return FALSE; if (!(sp->n_line)) return FALSE; cmdp = sp->n_line->l_cmd; for ( nlp=np->n_line; nlp; nlp=nlp->l_next) { if ( ndp=nlp->l_dep) { op = ndp->d_name; ndp = (struct depend *)0; goto found2; } } newline(np, (struct depend *)0, cmdp, 0); *pinputname = (char *)0; *pbasename = (char *)0; return TRUE; } else return FALSE; } found: ndp = newdep(op, (struct depend *)0); found2: newline(np, ndp, cmdp, 0); *pinputname = op->n_name; return TRUE; } /* * Make the default rules */ void makerules() { struct cmd *cp; struct name *np; struct depend *dp; #ifdef eon setmacro("BDSCC", "asm"); /* setmacro("BDSCFLAGS", ""); */ cp = newcmd("$(BDSCC) $(BDSCFLAGS) -n $<", (struct cmd *)0); np = newname(".c.o"); newline(np, (struct depend *)0, cp, 0); setmacro("CC", "c"); setmacro("CFLAGS", "-O"); cp = newcmd("$(CC) $(CFLAGS) -c $<", (struct cmd *)0); np = newname(".c.obj"); newline(np, (struct depend *)0, cp, 0); setmacro("M80", "asm -n"); /* setmacro("M80FLAGS", ""); */ cp = newcmd("$(M80) $(M80FLAGS) $<", (struct cmd *)0); np = newname(".mac.o"); newline(np, (struct depend *)0, cp, 0); setmacro("AS", "zas"); /* setmacro("ASFLAGS", ""); */ cp = newcmd("$(ZAS) $(ASFLAGS) -o $@ $<", (struct cmd *)0); np = newname(".as.obj"); newline(np, (struct depend *)0, cp, 0); np = newname(".as"); dp = newdep(np, (struct depend *)0); np = newname(".obj"); dp = newdep(np, dp); np = newname(".c"); dp = newdep(np, dp); np = newname(".o"); dp = newdep(np, dp); np = newname(".mac"); dp = newdep(np, dp); np = newname(".SUFFIXES"); newline(np, dp, (struct cmd *)0, 0); #endif #ifdef tos #define unix #endif /* * Some of the UNIX implicit rules */ #ifdef unix setmacro("CC", "cc"); setmacro("CFLAGS", ""); cp = newcmd("$(CC) -S $(CFLAGS) $<", (struct cmd *)0); np = newname(".c.s"); newline(np, (struct depend *)0, cp, 0); cp = newcmd("$(CC) -c $(CFLAGS) $<", (struct cmd *)0); np = newname(".c.o"); newline(np, (struct depend *)0, cp, 0); #if this_rule_is_a_bit_too_much_of_a_good_thing #ifdef MINIXPC cp = newcmd("$(CC) $(CFLAGS) -i -o $@ $<", (struct cmd *)0); #else cp = newcmd("$(CC) $(CFLAGS) -o $@ $<", (struct cmd *)0); #endif /* MINIXPC */ np = newname(".c"); newline(np, (struct depend *)0, cp, 0); #endif cp = newcmd("$(CC) -c $(CFLAGS) $<", (struct cmd *)0); np = newname(".s.o"); newline(np, (struct depend *)0, cp, 0); setmacro("YACC", "yacc"); /*setmacro("YFLAGS", ""); */ cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0); cp = newcmd("mv y.tab.c $@", cp); np = newname(".y.c"); newline(np, (struct depend *)0, cp, 0); cp = newcmd("$(YACC) $(YFLAGS) $<", (struct cmd *)0); cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp); cp = newcmd("mv y.tab.o $@", cp); np = newname(".y.o"); cp = newcmd("rm y.tab.c", cp); newline(np, (struct depend *)0, cp, 0); setmacro("FLEX", "flex"); cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0); cp = newcmd("mv lex.yy.c $@", cp); np = newname(".l.c"); newline(np, (struct depend *)0, cp, 0); cp = newcmd("$(FLEX) $(FLEX_FLAGS) $<", (struct cmd *)0); cp = newcmd("$(CC) $(CFLAGS) -c lex.yy.c", cp); cp = newcmd("mv lex.yy.o $@", cp); np = newname(".l.o"); cp = newcmd("rm lex.yy.c", cp); newline(np, (struct depend *)0, cp, 0); np = newname(".o"); dp = newdep(np, (struct depend *)0); np = newname(".s"); dp = newdep(np, dp); np = newname(".c"); dp = newdep(np, dp); np = newname(".y"); dp = newdep(np, dp); np = newname(".l"); dp = newdep(np, dp); np = newname(".SUFFIXES"); newline(np, dp, (struct cmd *)0, 0); #endif /* unix */ #ifdef os9 /* * Fairlight use an enhanced version of the C sub-system. * They have a specialised macro pre-processor. */ setmacro("CC", "cc"); K��K��K������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ setmacro("CFLAGS", "-z"); cp = newcmd("$(CC) $(CFLAGS) -r $<", (struct cmd *)0); np = newname(".c.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".ca.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".a.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".o.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".mc.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".mca.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".ma.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".mo.r"); newline(np, (struct depend *)0, cp, 0); np = newname(".r"); dp = newdep(np, (struct depend *)0); np = newname(".mc"); dp = newdep(np, dp); np = newname(".mca"); dp = newdep(np, dp); np = newname(".c"); dp = newdep(np, dp); np = newname(".ca"); dp = newdep(np, dp); np = newname(".ma"); dp = newdep(np, dp); np = newname(".mo"); dp = newdep(np, dp); np = newname(".o"); dp = newdep(np, dp); np = newname(".a"); dp = newdep(np, dp); np = newname(".SUFFIXES"); newline(np, dp, (struct cmd *)0, 0); #endif } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ mined.h������� mined1.c������ mined2.c����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for mined CFLAGS = -O -wo -D_MINIX -D_POSIX_SOURCE OBJ = mined1.o mined2.o all: mined mined: $(OBJ) $(CC) -i -o $@ $(OBJ) install -S 64k $@ install: /usr/bin/mined /usr/bin/mined: mined install -cs -o bin mined $@ $(OBJ): mined.h clean: rm -f mined *.o *.s core *.bak �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*========================================================================* * Mined.h * *========================================================================*/ #include <minix/config.h> #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <limits.h> #ifndef YMAX #ifdef UNIX #include <stdio.h> #undef putchar #undef getchar #undef NULL #undef EOF extern char *CE, *VS, *SO, *SE, *CL, *AL, *CM; #define YMAX 49 #else #define YMAX 24 /* Maximum y coordinate starting at 0 */ /* Escape sequences. */ extern char *enter_string; /* String printed on entering mined */ extern char *rev_video; /* String for starting reverse video */ extern char *normal_video; /* String for leaving reverse video */ extern char *rev_scroll; /* String for reverse scrolling */ extern char *pos_string; /* Absolute cursor positioning */ #define X_PLUS ' ' /* To be added to x for cursor sequence */ #define Y_PLUS ' ' /* To be added to y for cursor sequence */ #endif /* UNIX */ #define XMAX 79 /* Maximum x coordinate starting at 0*/ #define SCREENMAX (YMAX - 1) /* Number of lines displayed */ #define XBREAK (XMAX - 0) /* Line shift at this coordinate */ #define SHIFT_SIZE 25 /* Number of chars to shift */ #define SHIFT_MARK '!' /* Char indicating line continues */ #define MAX_CHARS 1024 /* Maximum chars on one line */ /* LINE_START must be rounded up to the lowest SHIFT_SIZE */ #define LINE_START (((-MAX_CHARS - 1) / SHIFT_SIZE) * SHIFT_SIZE \ - SHIFT_SIZE) #define LINE_END (MAX_CHARS + 1) /* Highest x-coordinate for line */ #define LINE_LEN (XMAX + 1) /* Number of characters on line */ #define SCREEN_SIZE (XMAX * YMAX) /* Size of I/O buffering */ #define BLOCK_SIZE 1024 /* Return values of functions */ #define ERRORS -1 #define NO_LINE (ERRORS - 1) /* Must be < 0 */ #define FINE (ERRORS + 1) #define NO_INPUT (ERRORS + 2) #define STD_OUT 1 /* File descriptor for terminal */ #if (CHIP == INTEL) #define MEMORY_SIZE (50 * 1024) /* Size of data space to malloc */ #endif #define REPORT 2 /* Report change of lines on # lines */ typedef int FLAG; /* General flags */ #define FALSE 0 #define TRUE 1 #define NOT_VALID 2 #define VALID 3 #define OFF 4 #define ON 5 /* Expression flags */ #define FORWARD 6 #define REVERSE 7 /* Yank flags */ #define SMALLER 8 #define BIGGER 9 #define SAME 10 #define EMPTY 11 #define NO_DELETE 12 #define DELETE 13 #define READ 14 #define WRITE 15 /* * The Line structure. Each line entry contains a pointer to the next line, * a pointer to the previous line, a pointer to the text and an unsigned char * telling at which offset of the line printing should start (usually 0). */ struct Line { struct Line *next; struct Line *prev; char *text; unsigned char shift_count; }; typedef struct Line LINE; /* Dummy line indicator */ #define DUMMY 0x80 #define DUMMY_MASK 0x7F /* Expression definitions */ #define NO_MATCH 0 #define MATCH 1 #define REG_ERROR 2 #define BEGIN_LINE (2 * REG_ERROR) #define END_LINE (2 * BEGIN_LINE) /* * The regex structure. Status can be any of 0, BEGIN_LINE or REG_ERROR. In * the last case, the result.err_mess field is assigned. Start_ptr and end_ptr * point to the match found. For more details see the documentation file. */ struct regex { union { char *err_mess; int *expression; } result; char status; char *start_ptr; char *end_ptr; }; typedef struct regex REGEX; /* NULL definitions */ #define NIL_PTR ((char *) 0) #define NIL_LINE ((LINE *) 0) #define NIL_REG ((REGEX *) 0) #define NIL_INT ((int *) 0) /* * Forward declarations */ extern int nlines; /* Number of lines in file */ extern LINE *header; /* Head of line list */ extern LINE *tail; /* Last line in line list */ extern LINE *top_line; /* First line of screen */ extern LINE *bot_line; /* Last line of screen */ extern LINE *cur_line; /* Current line in use */ extern char *cur_text; /* Pointer to char on current line in use */ extern int last_y; /* Last y of screen. Usually SCREENMAX */ extern int ymax; extern int screenmax; extern char screen[SCREEN_SIZE];/* Output buffer for "writes" and "reads" */ extern int x, y; /* x, y coordinates on screen */ extern FLAG modified; /* Set when file is modified */ extern FLAG stat_visible; /* Set if status_line is visible */ extern FLAG writable; /* Set if file cannot be written */ extern FLAG quit; /* Set when quit character is typed */ extern FLAG rpipe; /* Set if file should be read from stdin */ extern int input_fd; /* Fd for command input */ extern FLAG loading; /* Set if we're loading a file */ extern int out_count; /* Index in output buffer */ extern char file_name[LINE_LEN]; /* Name of file in use */ extern char text_buffer[MAX_CHARS]; /* Buffer for modifying text */ extern char *blank_line; /* Clear line to end */ extern char yank_file[]; /* Temp file for buffer */ extern FLAG yank_status; /* Status of yank_file */ extern long chars_saved; /* Nr of chars saved in buffer */ /* * Empty output buffer */ #define clear_buffer() (out_count = 0) /* * Print character on terminal */ #define putchar(c) (void) write_char(STD_OUT, (c)) /* * Ring bell on terminal */ #define ring_bell() putchar('\07') /* * Print string on terminal */ #define string_print(str) (void) writeline(STD_OUT, (str)) /* * Flush output buffer */ #define flush() (void) flush_buffer(STD_OUT) /* * Convert cnt to nearest tab position */ #define tab(cnt) (((cnt) + 8) & ~07) #define is_tab(c) ((c) == '\t') /* * Word defenitions */ #define white_space(c) ((c) == ' ' || (c) == '\t') #define alpha(c) ((c) != ' ' && (c) != '\t' && (c) != '\n') /* * Print line on terminal at offset 0 and clear tail of line */ #define line_print(line) put_line(line, 0, TRUE) /* * Move to coordinates and set textp. (Don't use address) */ #define move_to(nx, ny) move((nx), NIL_PTR, (ny)) /* * Move to coordinates on screen as indicated by textp. */ #define move_address(address) move(0, (address), y) /* * Functions handling status_line. ON means in reverse video. */ #define status_line(str1, str2) (void) bottom_line(ON, (str1), \ (str2), NIL_PTR, FALSE) #define error(str1, str2) (void) bottom_line(ON, (str1), \ (str2), NIL_PTR, FALSE) #define get_string(str1,str2, fl) bottom_line(ON, (str1), NIL_PTR, (str2), fl) #define clear_status() (void) bottom_line(OFF, NIL_PTR, NIL_PTR, \ NIL_PTR, FALSE) /* * Print info about current file and buffer. */ #define fstatus(mess, cnt) file_status((mess), (cnt), file_name, \ nlines, writable, modified) /* * Get real shift value. */ #define get_shift(cnt) ((cnt) & DUMMY_MASK) #endif /* YMAX */ /* mined1.c */ _PROTOTYPE(void FS, (void)); _PROTOTYPE(void VI, (void)); _PROTOTYPE(int WT, (void)); _PROTOTYPE(void XWT, (void)); _PROTOTYPE(void SH, (void)); _PROTOTYPE(LINE *proceed, (LINE *line, int count )); _PROTOTYPE(int bottom_line, (FLAG revfl, char *s1, char *s2, char *inbuf, FLAG statfl )); _PROTOTYPE(int count_chars, (LINE *line )); _PROTOTYPE(void move, (int new_x, char *new_address, int new_y )); _PROTOTYPE(int find_x, (LINE *line, char *address )); _PROTOTYPE(char *find_address, (LINE *line, int x_coord, int *old_x )); _PROTOTYPE(int length_of, (char *string )); _PROTOTYPE(void copy_string, (char *to, char *from )); _PROTOTYPE(void reset, (LINE *head_line, int screen_y )); _PROTOTYPE(void set_cursor, (int nx, int ny )); _PROTOTYPE(void open_device, (void)); _PROTOTYPE(int getchar, (void)); _PROTOTYPE(void display, (int x_coord, int y_coord, LINE *line, int count )); _PROTOTYPE(int write_char, (int fd, int c )); _PROTOTYPE(int writeline, (int fd, char *text )); _PROTOTYPE(void put_line, (LINE *line, int offset, FLAG clear_line )); _PROTOTYPE(int flush_buffer, (int fd )); _PROTOTYPE(void bad_write, (int fd )); _PROTOTYPE(void catch, (int sig )); _PROTOTYPE(void abort_mined, (void)); _PROTOTYPE(void raw_mode, (FLAG state )); _PROTOTYPE(void panic, (char *message )); _PROTOTYPE(char *alloc, (int bytes )); _PROTOTYPE(void free_space, (char *p )); /* #ifdef UNIX _PROTOTYPE(void (*key_map [128]), (void)K��K��K��K��K����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������); #else _PROTOTYPE(void (*key_map [256]), (void)); #endif */ _PROTOTYPE(void initialize, (void)); _PROTOTYPE(char *basename, (char *path )); _PROTOTYPE(void load_file, (char *file )); _PROTOTYPE(int get_line, (int fd, char *buffer )); _PROTOTYPE(LINE *install_line, (char *buffer, int length )); _PROTOTYPE(void main, (int argc, char *argv [])); _PROTOTYPE(void RD, (void)); _PROTOTYPE(void I, (void)); _PROTOTYPE(void XT, (void)); _PROTOTYPE(void ESC, (void)); _PROTOTYPE(int ask_save, (void)); _PROTOTYPE(int line_number, (void)); _PROTOTYPE(void file_status, (char *message, long count, char *file, int lines, FLAG writefl, FLAG changed )); #if __STDC__ void build_string(char *buf, char *fmt, ...); #else void build_string(); #endif _PROTOTYPE(char *num_out, (long number )); _PROTOTYPE(int get_number, (char *message, int *result )); _PROTOTYPE(int input, (char *inbuf, FLAG clearfl )); _PROTOTYPE(int get_file, (char *message, char *file )); _PROTOTYPE(int _getchar, (void)); _PROTOTYPE(void _flush, (void)); _PROTOTYPE(void _putchar, (int c )); _PROTOTYPE(void get_term, (void)); /* mined2.c */ _PROTOTYPE(void UP, (void)); _PROTOTYPE(void DN, (void)); _PROTOTYPE(void LF, (void)); _PROTOTYPE(void RT, (void)); _PROTOTYPE(void HIGH, (void)); _PROTOTYPE(void LOW, (void)); _PROTOTYPE(void BL, (void)); _PROTOTYPE(void EL, (void)); _PROTOTYPE(void GOTO, (void)); _PROTOTYPE(void PD, (void)); _PROTOTYPE(void PU, (void)); _PROTOTYPE(void HO, (void)); _PROTOTYPE(void EF, (void)); _PROTOTYPE(void SU, (void)); _PROTOTYPE(void SD, (void)); _PROTOTYPE(int forward_scroll, (void)); _PROTOTYPE(int reverse_scroll, (void)); _PROTOTYPE(void MP, (void)); _PROTOTYPE(void move_previous_word, (FLAG remove )); _PROTOTYPE(void MN, (void)); _PROTOTYPE(void move_next_word, (FLAG remove )); _PROTOTYPE(void DCC, (void)); _PROTOTYPE(void DPC, (void)); _PROTOTYPE(void DLN, (void)); _PROTOTYPE(void DNW, (void)); _PROTOTYPE(void DPW, (void)); _PROTOTYPE(void S, (int character )); _PROTOTYPE(void CTL, (void)); _PROTOTYPE(void LIB, (void)); _PROTOTYPE(LINE *line_insert, (LINE *line, char *string, int len )); _PROTOTYPE(int insert, (LINE *line, char *location, char *string )); _PROTOTYPE(LINE *line_delete, (LINE *line )); _PROTOTYPE(void delete, (LINE *start_line, char *start_textp, LINE *end_line, char *end_textp )); _PROTOTYPE(void PT, (void)); _PROTOTYPE(void IF, (void)); _PROTOTYPE(void file_insert, (int fd, FLAG old_pos )); _PROTOTYPE(void WB, (void)); _PROTOTYPE(void MA, (void)); _PROTOTYPE(void YA, (void)); _PROTOTYPE(void DT, (void)); _PROTOTYPE(void set_up, (FLAG remove )); _PROTOTYPE(FLAG checkmark, (void)); _PROTOTYPE(int legal, (void)); _PROTOTYPE(void yank, (LINE *start_line, char *start_textp, LINE *end_line, char *end_textp, FLAG remove )); _PROTOTYPE(int scratch_file, (FLAG mode )); _PROTOTYPE(void SF, (void)); _PROTOTYPE(void SR, (void)); _PROTOTYPE(REGEX *get_expression, (char *message )); _PROTOTYPE(void GR, (void)); _PROTOTYPE(void LR, (void)); _PROTOTYPE(void change, (char *message, FLAG file )); _PROTOTYPE(char *substitute, (LINE *line, REGEX *program, char *replacement )); _PROTOTYPE(void search, (char *message, FLAG method )); _PROTOTYPE(int find_y, (LINE *match_line )); _PROTOTYPE(void finished, (REGEX *program, int *last_exp )); _PROTOTYPE(void compile, (char *pattern, REGEX *program )); _PROTOTYPE(LINE *match, (REGEX *program, char *string, FLAG method )); _PROTOTYPE(int line_check, (REGEX *program, char *string, FLAG method )); _PROTOTYPE(int check_string, (REGEX *program, char *string, int *expression )); _PROTOTYPE(int star, (REGEX *program, char *end_position, char *string, int *expression )); _PROTOTYPE(int in_list, (int *list, int c, int list_length, int opcode )); _PROTOTYPE(void dummy_line, (void)); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Part one of the mined editor. */ /* * Author: Michiel Huisjes. * * 1. General remarks. * * Mined is a screen editor designed for the MINIX operating system. * It is meant to be used on files not larger than 50K and to be fast. * When mined starts up, it reads the file into its memory to minimize * disk access. The only time that disk access is needed is when certain * save, write or copy commands are given. * * Mined has the style of Emacs or Jove, that means that there are no modes. * Each character has its own entry in an 256 pointer to function array, * which is called when that character is typed. Only ASCII characters are * connected with a function that inserts that character at the current * location in the file. Two execptions are <linefeed> and <tab> which are * inserted as well. Note that the mapping between commands and functions * called is implicit in the table. Changing the mapping just implies * changing the pointers in this table. * * The display consists of SCREENMAX + 1 lines and XMAX + 1 characters. When * a line is larger (or gets larger during editing) than XBREAK characters, * the line is either shifted SHIFT_SIZE characters to the left (which means * that the first SHIFT_SIZE characters are not printed) or the end of the * line is marked with the SHIFT_MARK character and the rest of the line is * not printed. A line can never exceed MAX_CHARS characters. Mined will * always try to keep the cursor on the same line and same (relative) * x-coordinate if nothing changed. So if you scroll one line up, the cursor * stays on the same line, or when you move one line down, the cursor will * move to the same place on the line as it was on the previous. * Every character on the line is available for editing including the * linefeed at the the of the line. When the linefeed is deleted, the current * line and the next line are joined. The last character of the file (which * is always a linefeed) can never be deleted. * The bottomline (as indicated by YMAX + 1) is used as a status line during * editing. This line is usually blank or contains information mined needs * during editing. This information (or rather questions) is displayed in * reverse video. * * The terminal modes are changed completely. All signals like start/stop, * interrupt etc. are unset. The only signal that remains is the quit signal. * The quit signal (^\) is the general abort signal for mined. Typing a ^\ * during searching or when mined is asking for filenames, etc. will abort * the function and mined will return to the main loop. Sending a quit * signal during the main loop will abort the session (after confirmation) * and the file is not (!) saved. * The session will also be aborted when an unrecoverable error occurs. E.g * when there is no more memory available. If the file has been modified, * mined will ask if the file has to be saved or not. * If there is no more space left on the disk, mined will just give an error * message and continue. * * The number of system calls are minized. This is done to keep the editor * as fast as possible. I/O is done in SCREEN_SIZE reads/writes. Accumulated * output is also flushed at the end of each character typed. * * 2. Regular expressions * * Mined has a build in regular expression matcher, which is used for * searching and replace routines. A regular expression consists of a * sequence of: * * 1. A normal character matching that character. * 2. A . matching any character. * 3. A ^ matching the begin of a line. * 4. A $ (as last character of the pattern) mathing the end of a line. * 5. A \<character> matching <character>. * 6. A number of characters enclosed in [] pairs matching any of these * characters. A list of characters can be indicated by a '-'. So * [a-z] matches any letter of the alphabet. If the first character * after the '[' is a '^' then the set is negated (matching none of * the characters). * A ']', '^' or '-' can be escaped by putting a '\' in front of it. * Of course this means that a \ must be represented by \\. * 7. If one of the expressions as described in 1-6 is followed by a * '*' than that expressions matches a sequence of 0 or more of * that expression. * * Parsing of regular expression is done in two phases. In the first phase * the expression is compiled into a more comprehensible form. In the second * phase the actual matching is done. For more details see 3.6. * * * 3. Implementation of mined. * * 3.1 Data structures. * * The main data structures are as follows. The whole file is kept in a * double linked list of lines. The LINE structure looks like this: * * typedef struct Line { * struct Line *next; * struct Line *prev; * char *text; * unsigned char shift_count; * } LINE; * * Each line entry contains a pointer to the next line, a pointer to the * previous line and a pointer to the text of that line. A special field * shift_count contains the number of shifts (in units of SHIFT_SIZE) * that is performed on that line. The total size of the structure is 7 * bytes so a file consisting of 1000 empty lines will waste a lot of * memory. A LINE structure is allocated for each line in the file. After * that the number of characters of the line is counted and sufficient * space is allocated to store them (including a linefeed and a '\0'). * The resulting address is assigned to the text field in the structure. * * A special structure is allocated and its address is assigned to the * variable header as well as the variable tail. The text field of this * structure is set to NIL_PTR. The tail->prev of this structure points * to the last LINE of the file and the header->next to the first LINE. * Other LINE *variables are top_line and bot_line which point to the * first line resp. the last line on the screen. * Two other variables are important as well. First the LINE *cur_line, * which points to the LINE currently in use and the char *cur_text, * which points to the character at which the cursor stands. * Whenever an ASCII character is typed, a new line is build with this * character inserted. Then the old data space (pointed to by * cur_line->text) is freed, data space for the new line is allocated and * assigned to cur_line->text. * * Two global variables called x and y represent the x and y coordinates * from the cursor. The global variable nlines contains the number of * lines in the file. Last_y indicates the maximum y coordinate of the * screen (which is usually SCREENMAX). * * A few strings must be initialized by hand before compiling mined. * These string are enter_string, which is printed upon entering mined, * rev_video (turn on reverse video), normal_video, rev_scroll (perform a * reverse scroll) and pos_string. The last string should hold the * absolute position string to be printed for cursor motion. The #define * X_PLUS and Y_PLUS should contain the characters to be added to the * coordinates x and y (both starting at 0) to finish cursor positioning. * * 3.2 Starting up. * * Mined can be called with or without argument and the function * load_file () is called with these arguments. load_file () checks * if the file exists if it can be read and if it is writable and * sets the writable flag accordingly. If the file can be read, * load_file () reads a line from the file and stores this line into * a structure by calling install_line () and line_insert () which * installs the line into the double linked list, until the end of the * file is reached. * Lines are read by the function get_line (), which buffers the * reading in'K��)K��*K��+K��,K��-K��.K��/K��0K��1K��2K��3K��4K��5K��6K��7K��8K��9K��:K��;K��<K��=K��>K��?K��@K��AK��BK��CK��DK��EK��FK��GK��HK��IK��JK��KK��LK��MK��NK��OK��PK��QK��RK��SK��TK��UK��VK��WK��XK��YK��ZK������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ blocks of SCREEN_SIZE. Load_file () also initializes the * LINE *variables described above. * * 3.3 Moving around. * * Several commands are implemented for moving through the file. * Moving up (UP), down (DN) left (LF) and right (RT) are done by the * arrow keys. Moving one line below the screen scrolls the screen one * line up. Moving one line above the screen scrolls the screen one line * down. The functions forward_scroll () and reverse_scroll () take care * of that. * Several other move functions exist: move to begin of line (BL), end of * line (EL) top of screen (HIGH), bottom of screen (LOW), top of file * (HO), end of file (EF), scroll one page down (PD), scroll one page up * (PU), scroll one line down (SD), scroll one line up (SU) and move to a * certain line number (GOTO). * Two functions called MN () and MP () each move one word further or * backwards. A word is a number of non-blanks seperated by a space, a * tab or a linefeed. * * 3.4 Modifying text. * * The modifying commands can be separated into two modes. The first * being inserting text, and the other deleting text. Two functions are * created for these purposes: insert () and delete (). Both are capable * of deleting or inserting large amounts of text as well as one * character. Insert () must be given the line and location at which * the text must be inserted. Is doesn't make any difference whether this * text contains linefeeds or not. Delete () must be given a pointer to * the start line, a pointer from where deleting should start on that * line and the same information about the end position. The last * character of the file will never be deleted. Delete () will make the * necessary changes to the screen after deleting, but insert () won't. * The functions for modifying text are: insert one char (S), insert a * file (file_insert (fd)), insert a linefeed and put cursor back to * end of line (LIB), delete character under the cursor (DCC), delete * before cursor (even linefeed) (DPC), delete next word (DNW), delete * previous word (DPC) and delete to end of line (if the cursor is at * a linefeed delete line) (DLN). * * 3.5 Yanking. * * A few utilities are provided for yanking pieces of text. The function * MA () marks the current position in the file. This is done by setting * LINE *mark_line and char *mark_text to the current position. Yanking * of text can be done in two modes. The first mode just copies the text * from the mark to the current position (or visa versa) into a buffer * (YA) and the second also deletes the text (DT). Both functions call * the function set_up () with the delete flag on or off. Set_up () * checks if the marked position is still a valid one (by using * check_mark () and legal ()), and then calls the function yank () with * a start and end position in the file. This function copies the text * into a scratch_file as indicated by the variable yank_file. This * scratch_file is made uniq by the function scratch_file (). At the end * of copying yank will (if necessary) delete the text. A global flag * called yank_status keeps track of the buffer (or file) status. It is * initialized on NOT_VALID and set to EMPTY (by set_up ()) or VALID (by * yank ()). Several things can be done with the buffer. It can be * inserted somewhere else in the file (PT) or it can be copied into * another file (WB), which will be prompted for. * * 3.6 Search and replace routines. * * Searching for strings and replacing strings are done by regular * expressions. For any expression the function compile () is called * with as argument the expression to compile. Compile () returns a * pointer to a structure which looks like this: * * typedef struct regex { * union { * char *err_mess; * int *expression; * } result; * char status; * char *start_ptr; * char *end_ptr; * } REGEX; * * If something went wrong during compiling (e.g. an illegal expression * was given), the function reg_error () is called, which sets the status * field to REG_ERROR and the err_mess field to the error message. If the * match must be anchored at the beginning of the line (end of line), the * status field is set to BEGIN_LINE (END_LINE). If none of these special * cases are true, the field is set to 0 and the function finished () is * called. Finished () allocates space to hold the compiled expression * and copies this expression into the expression field of the union * (bcopy ()). Matching is done by the routines match() and line_check(). * Match () takes as argument the REGEX *program, a pointer to the * startposition on the current line, and a flag indicating FORWARD or * REVERSE search. Match () checks out the whole file until a match is * found. If match is found it returns a pointer to the line in which the * match was found else it returns a NIL_LINE. Line_check () takes the * same arguments, but return either MATCH or NO_MATCH. * During checking, the start_ptr and end_ptr fields of the REGEX * structure are assigned to the start and end of the match. * Both functions try to find a match by walking through the line * character by character. For each possibility, the function * check_string () is called with as arguments the REGEX *program and the * string to search in. It starts walking through the expression until * the end of the expression or the end of the string is reached. * Whenever a * is encountered, this position of the string is marked, * the maximum number of matches are performed and the function star () * is called in order to try to find the longest match possible. Star () * takes as arguments the REGEX program, the current position of the * string, the marked position and the current position of the expression * Star () walks from the current position of the string back to the * marked position, and calls string_check () in order to find a match. * It returns MATCH or NO_MATCH, just as string_check () does. * Searching is now easy. Both search routines (forward (SF) and * backwards search (SR)) call search () with an apropiate message and a * flag indicating FORWARD or REVERSE search. Search () will get an * expression from the user by calling get_expression(). Get_expression() * returns a pointer to a REGEX structure or NIL_REG upon errors and * prompts for the expression. If no expression if given, the previous is * used instead. After that search will call match (), and if a match is * found, we can move to that place in the file by the functions find_x() * and find_y () which will find display the match on the screen. * Replacing can be done in two ways. A global replace (GR) or a line * replace (LR). Both functions call change () with a message an a flag * indicating global or line replacement. Change () will prompt for the * expression and for the replacement. Every & in the replacement pattern * means substitute the match instead. An & can be escaped by a \. When * a match is found, the function substitute () will perform the * substitution. * * 3.6 Miscellaneous commands. * * A few commands haven't be discussed yet. These are redraw the screen * (RD) fork a shell (SH), print file status (FS), write file to disc * (WT), insert a file at current position (IF), leave editor (XT) and * visit another file (VI). The last two functions will check if the file * has been modified. If it has, they will ask if you want to save the * file by calling ask_save (). * The function ESC () will repeat a command n times. It will prompt for * the number. Aborting the loop can be done by sending the ^\ signal. * * 3.7 Utility functions. * * Several functions exists for internal use. First allocation routines: * alloc (bytes) and newline () will return a pointer to free data space * if the given size. If there is no more memory available, the function * panic () is called. * Signal handling: The only signal that can be send to mined is the * SIGQUIT signal. This signal, functions as a general abort command. * Mined will abort if the signal is given during the main loop. The * function abort_mined () takes care of that. * Panic () is a function with as argument a error message. It will print * the message and the error number set by the kernel (errno) and will * ask if the file must be saved or not. It resets the terminal * (raw_mode ()) and exits. * String handling routines like copy_string(to, from), length_of(string) * and build_string (buffer, format, arg1, arg2, ...). The latter takes * a description of the string out out the format field and puts the * result in the buffer. (It works like printf (3), but then into a * string). The functions status_line (string1, string2), error (string1, * string2), clear_status () and bottom_line () all print information on * the status line. * Get_string (message, buffer) reads a string and getchar () reads one * character from the terminal. * Num_out ((long) number) prints the number into a 11 digit field * without leading zero's. It returns a pointer to the resulting string. * File_status () prints all file information on the status line. * Set_cursor (x, y) prints the string to put the cursor at coordinates * x and y. * Output is done by four functions: writeline(fd,string), clear_buffer() * write_char (fd, c) and flush_buffer (fd). Three defines are provided * to write on filedescriptor STD_OUT (terminal) which is used normally: * string_print (string), putchar (c) and flush (). All these functions * use the global I/O buffer screen and the global index for this array * called out_count. In this way I/O can be buffered, so that reads or * writes can be done in blocks of SCREEN_SIZE size. * The following functions all handle internal line maintenance. The * function proceed (start_line, count) returns the count'th line after * start_line. If count is negative, the count'th line before the * start_line is returned. If header or tail is encountered then that * will be returned. Display (x, y, start_line, count) displays count * lines starting at coordinates [x, y] and beginning at start_line. If * the header or tail is encountered, empty lines are displayed instead. * The function reset (head_line, ny) reset top_line, last_y, bot_line, * cur_line and y-coordinate. This is not a neat way to do the * maintenance, but it sure saves a lot of code. It is usually used in * combination with display (). * Put_line(line, offset, clear_line), prints a line (skipping characters * according to the line->shift_size field) until XBREAK - offset * characters are printed or a '\n' is encountered. If clear_line is * TRUE, spaces are printed until XBREAK - offset characters. * Line_print (line) is a #define from put_line (line, 0, TRUE). * Moving is done by the functions move_to (x, y), move_addres (address) * and move (x, adress, y). This function is the most important one in * mined. New_y must be between 0 and last_y, new_x can be about * anything, address must be a pointer to an character on the current * line (or y). Move_to () first adjust the y coordinate together with * cur_line. If an address is given, it finds the corresponding * x-coordinate. If an new x-coordinate was given, it will try to locate * the corresponding character. After that it sets the shift_count field * of cur_line to an apropiate number according to new_x. The only thing * left to do now is to assign the new values to cur_line, cur_text, x * and y. * * 4. Summary of commands. * * CURSOR MOTION * up-arrow Move cursor 1 line up. At top of screen, reverse scroll * down-arrow Move cursor 1 line down. At bottom, scroll forward. * left-arrow Move cursor 1 character left or to end of previous line * right-arrow Move cursor 1 character right or to start of next line * CTRL-A Move cursor to start of current line * CTRL-Z Move cursor to end of current line * CTRL-^ Move cursor to top of screen * CTRL-_ Move cursor to bottom of screen * CTRL-F Forward to start of next word (even to next line) * CTRL-B Backward to first character of previous word * * SCREEN MOTION * Home key Move cursor to first character of file * End key Move cursor to last character of file * PgUp Scroll backward 1 page. Bottom line becomes top line * PgD Scroll backward 1 page. Top line becomes bottom line * CTRL-D Scroll screen down one line (reverse scroll) * CTRL-U Scroll screen up one line (forward scroll) * * MODIFYING TEXT * ASCII char Self insert character at cursor * tab Insert tab at cursor * backspace Delete the previous char (left of cursor), even line feed * Del Delete the character under the cursor * CTRL-N Delete next word * CTRL-P Delete previous word * CTRL-O Insert line feed at cursor and back up 1 character * CTRL-T Delete tail of line (cursor to end); if empty, delete line * CTRL-@ Set the mark (remember the current location) * CTRL-K Delete text from the mark to current position save on file * CTRL-C Save the text from the mark to the current position * CTRL-Y Insert the contents of the save file at current position * CTRL-Q Insert the contents of the save file into a new file * CTRL-G Insert a file at the current position * * MISCELLANEOUS * CTRL-E Erase and redraw the screen * CTRL-V Visit file (read a new file); complain if old one changed * CTRL-W Write the current file back to the disk * numeric + Search forward (prompt for regular expression) * numeric - Search backward (prompt for regular expression) * numeric 5 Print the current status of the file * CTRL-R (Global) Replace str1 by str2 (prompts for each string) * CTRL-L (Line) Replace string1 by string2 * CTRL-S Fork off a shell and wait for it to finish * CTRL-X EXIT (prompt if file modified) * CTRL-] Go to a line. Prompts for linenumber * CTRL-\ Abort whatever editor was doing and start again * escape key Repeat a command count times; (prompts for count) */ /* ======================================================================== * * Utilities * * ======================================================================== */ #include "mined.h" #include <signal.h> #include <termios.h> #include <limits.h> #include <errno.h> #include <sys/wait.h> #include <sys/ioctl.h> #if __STDC__ #include <stdarg.h> #else #include <varargs.h> #endif extern int errno; int ymax = YMAX; int screenmax = SCREENMAX; /* * Print file status. */ void FS() { fstatus(file_name[0] ? "" : "[buffer]", -1L); } /* * Visit (edit) another file. If the file has been modified, ask the user if * he wants to save it. */ void VI() { char new_file[LINE_LEN]; /* Buffer to hold new file name */ if (modified == TRUE && ask_save() == ERRORS) return; /* Get new file name */ if (get_file("Visit file:", new_file) == ERRORS) return; /* Free old linked list, initialize global variables and load new file */ initialize(); #ifdef UNIX tputs(CL, 0, _putchar); #else string_print (enter_string); #endif /* UNIX */ load_file(new_file[0] == '\0' ? NIL_PTR : new_file); } /* * Write file in core to disc. */ int WT() { register LINE *line; register long count = 0L; /* Nr of chars written */ char file[LINE_LEN]; /* Buffer for new file name */ int fd; /* Filedescriptor of file */ if (modified == FALSE) { error ("Write not necessary.", NIL_PTR); return FINE; } /* Check if file_name is valid and if file can be written */ if (file_name[0] == '\0' || writable == FALSE) { if (get_file("Enter file name:", file) != FINE) return ERRORS; copy_string(file_name, file); /* Save file name */ } if ((fd = creat(file_name, 0644)) < 0) { /* Empty file */ error("Cannot create ", file_name); writable = FALSE; return ERRORS; } else writable = TRUE; clear_buffer(); status_line("Writing ", file_name); for (line = header->next; line != tail; line = line->next) { if (line->shift_count & DUMMY) { if (line->next == tail && line->text[0] == '\n') continue; } if (writeline(fd, line->text) == ERRORS) { count = -1L; break; } count += (long) length_of(line->text); } if (count > 0L && flush_buffer(fd) == ERRORS) count = -1L; (void) close(fd); if (count == -1L) return ERRORS; modified = FALSE; rpipe = FALSE; /* File name is now assigned */ /* Display how many chars (and lines) were written */ fstatus("Wrote", count); return FINE; } /* Call WT and discard value returned. */ void XWT() { (void) WT(); } /* * Call an interactive shell. */ void SH() { register int w; int pid, status; char *shell; if ((shell = getenv("SHELL")) == NIL_PTR) shell = "/bin/sh"; switch (pid = fork()) { case -1: /* Error */ error("Cannot fork.", NIL_PTR); return; case 0: /* This is the child */ set_cursor(0, ymax); putchar('\n'); flush(); raw_mode(OFF); if (rpipe) { /* Fix stdin */ close (0); if (open("/dev/tty", 0) < 0) exit (126); } execl(shell, shell, (char *) 0); exit(127); /* Exit with 127 */ default : /* This is the parent */ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); do { w = wait(&status); } while (w != -1 && w != pid); } raw_mode(ON); RD(); if ((status >> 8) == 127) /* Child died with 127 */ error("Cannot exec ", shell); else if ((status >> 8) == 126) error("Cannot open /dev/tty as fd #0", NIL_PTR); } /* * Proceed returns the count'th line after `line'. When count is negative * it returns the count'th line before `line'. When the next (previous) * line is the tail (header) indicating EOF (tof) it stops. */ LINE *proceed(line, count) register LINE *line; register int count; { if (count < 0) while (count++ < 0 && line != header) line = line->prev; else while (count-- > 0 && line != tail) line = line->next; return line; } /* * Show concatenation of s1 and s2 on the status line (bottom of screen) * If revfl is TRUE, turn on reverse video on both strings. Set stat_visible * only if bottom_line is visible. */ int bottom_line(revfl, s1, s2, inbuf, statfl) FLAG revfl; char *s1, *s2; char *inbuf; FLAG statfl; { int ret = FINE; char buf[LINE_LEN]; register char *p = buf; *p++ = ' '; if (s1 != NIL_PTR) while (*p = *s1++) p++; if (s2 != NIL_PTR) while (*p = *s2++) p++; *p++ = ' '; *p++ = 0; if (revfl == ON && stat_visible == TRUE) clear_status (); set_cursor(0, ymax); if (revfl == ON) { /* Print rev. start sequence */ #ifdef UNIX tputs(SO, 0, _putchar); #else string_print(rev_video); #endif /* UNIX */ stat_visible = TRUE; } else /* Used as clear_status() */ stat_visible = FALSE; string_print(buf); if (inbuf != NIL_PTR) ret = input(inbuf, statfl); /* Print normal video */ #ifdef UNIX tputs(SE, 0, _putchar); tputs(CE, 0, _putchar); #else string_print(normal_video); string_print(blank_line); /* Clear the rest of the line */ #endif /* UNIX */ if (inbuf != NIL_PTR) set_cursor(0, ymax); else set_cursor(x, y); /* Set cursor back to old position */ flush(); /* Perform the actual write */ if (ret != FINE) clear_status(); return ret; } /* * Count_chars() count the number of chars that the line would occupy on the * screen. Counting starts at the real x-coordinate of the line. */ int count_chars(line) LINE *line; { register int cnt = get_shift(line->shift_count) * -SHIFT_SIZE; register char *textp = line->text; /* Find begin of line on screen */ while (cnt < 0) { if (is_tab(*textp++)) cnt = tab(cnt); else cnt++; } /* Count number of chars left */ cnt = 0; while (*textp != '\n') { if (is_tab(*textp++)) cnt = tab(cnt); else cnt++; } return cnt; } /* * Move to coordinates nx, ny at screen. The caller must check that scrolling * is not needed. * If new_x is lower than 0 or higher than XBREAK, move_to() will check if * the line can be shifted. If it can it sets(or resets) the shift_count field * of the current line accordingly. * Move also sets cur_text to the right char. * If we're moving to the same x coordinate, try to move the the x-coordinate * used on the other previous call. */ void move(new_x, new_address, new_y) register int new_x; int new_y; char *new_address; { register LINE *line = cur_line; /* For building new cur_line */ int shift = 0; /* How many shifts to make */ static int rel_x = 0; /* Remember relative x position */ int tx = x; /* Check for illegal values */ if (new_y < 0 || new_y > last_y) return; /* Adjust y-coordinate and cur_line */ if (new_y < y) while (y != new_y) { y--; line = line->prev; } else while (y != new_y) { y++; line = line->next; } /* Set or unset relative x-coordinate */ if (new_address == NIL_PTR) { new_address = find_address(line, (new_x == x) ? rel_x : new_x , &tx); if (new_x != x) rel_x = tx; new_x = tx; } else rel_x = new_x = find_x(line, new_address); /* Adjust shift_count if new_x lower than 0 or higher than XBREAK */ if (new_x < 0 || new_x >= XBREAK) { if (new_x > XBREAK || (new_x == XBREAK && *new_address != '\n')) shift = (new_x - XBREAK) / SHIFT_SIZE + 1; else { shift = new_x / SHIFT_SIZE; if (new_x % SHIFT_SIZE) shift--; } if (shift != 0) { line->shift_count += shift; new_x = find_x(line, new_address); set_cursor(0, y); line_print(line); rel_x = new_x; } } /* Assign and position cursor */ x = new_x; cur_text = new_address; cur_line = line; set_cursor(x, y); } /* * Find_x() returns the x coordinate belonging to address. * (Tabs are expanded). */ int find_x(line, address) LINE *line; char *address; { register char *textp = line->text; register int nx = get_shift(line->shift_count) * -SHIFT_SIZE; while (textp != address && *textp != '\0') { if (is_tab(*textp++)) /* Expand tabs */ nx = tab(nx); else nx++; } return nx; } /* * Find_address() returns the pointer in the line with offset x_coord. * (Tabs are expanded). */ char *find_address(line, x_coord, old_x) LINE *line; int x_coord; int *old_x; { register char *textp = line->text; register int tx = get_shift(line->shift_count) * -SHIFT_SIZE; while (tx < x_coord && *textp != '\n') { if (is_tab(*textp)) { if (*old_x - x_coord == 1 && tab(tx) > x_coord) break; /* Moving left over tab */ else tx = tab(tx); } else tx++; textp++; } *old_x = tx; return textp; } /* * Length_of() returns the number of characters int the string `string' * excluding the '\0'. */ int length_of(string) register char *string; { register int count = 0; if (string != NIL_PTR) { while (*string++ != '\0') count++; } return count; } /* * Copy_string() copies the string `from' into the string `to'. `To' must be * long enough to hold `from'. */ void copy_string(to, from) register char *to; register char *from; { while (*to++ = *from++) ; } /* * Reset assigns bot_line, top_line and cur_line according to `head_line' * which must be the first line of the screen, and an y-coordinate, * which will be the current y-coordinate (if it isn't larger than last_y) */ void reset(head_line, screen_y) LINE *head_line; int screen_y; { register LINE *line; top_line = line = head_line; /* Search for bot_line (might be last line in file) */ for (last_y = 0; last_y < nlines - 1 && last_y < screenmax && line->next != tail; last_y++) line = line->next; bot_line = line; y = (screen_y > last_y) ? last_y : screen_y; /* Set cur_line according to the new y value */ cur_line = proceed(top_line, y); } /* * Set cursor at coordinates x, y. */ void set_cursor(nx, ny) int nx, ny; { #ifdef UNIX extern char *tgoto(); tputs(tgoto(CM, nx, ny), 0, _putchar); #else char text_buffer[10]; build_string(text_buffer, pos_string, ny+1, nx+1); string_print(text_buffer); #endif /* UNIX */ } /* * Routine to open terminal when mined is used in a pipeline. */ void open_device() { if ((input_fd = open("/dev/tty", 0)) < 0) panic("Cannot open /dev/tty for read"); } /* * Getchar() reads one character from the terminal. The character must be * masked with 0377 to avoid sign extension. */ int getchar() { #ifdef UNIX return (_getchar() & 0377); #else char c; if (read(input_fd, &c, 1) != 1 && quit == FALSE) panic("Can't read one char from fd #0"); return c & 0377; #endif /* UNIX */ } /* * Display() shows count lines on the terminal starting at the given * coordinates. When the tail of the list is encountered it will fill the * rest of the screen with blank_line's. * When count is negative, a backwards print from `line' will be done. */ void display(x_coord, y_coord, line, count) int x_coord, y_coord; register LINE *line; register int count; { set_cursor(x_coord, y_coord); /* Find new startline if count is negative */ if (count < 0) { line = proceed(line, count); count = -count; } /* Print the lines */ while (line != tail && count-- >= 0) { line_print(line); line = line->next; } /* Print the blank lines (if any) */ if (loading == FALSE) { while (count-- >= 0) { #ifdef UNIX tputs(CE, 0, _putchar); #else string_print(blank_line); #endif /* UNIX */ putchar('\n'); } } } /* * Write_char does a buffered output. */ int write_char(fd, c) int fd; char c; { screen [out_count++] = c; if (out_count == SCREEN_SIZE) /* Flush on SCREEN_SIZE chars */ return flush_buffer(fd); return FINE; } /* * Writeline writes the given string on the given filedescriptor. */ int writeline(fd, text) register int fd; register char *text; { while(*text) if (write_char(fd, *text++) == ERRORS) return ERRORS; return FINE; } /* * Put_line print the given line on the standard output. If offset is not zero * printing will start at that x-coordinate. If the FLAG clear_line is TRUE, * then (screen) line will be cleared when the end of the line has been * reached. */ void put_line(line, offset, clear_line) LINE *line; /* Line to print */ int offset; /* Offset to start */ FLAG clear_line; /* Clear to eoln if TRUE */ { register char *textp = line->text; register int count = get_shift(line->shift_count) * -SHIFT_SIZE; int tab_count; /* Used in tab expansion */ /* Skip all chars as indicated by the offset and the shift_count field */ while (count < offset) { if (is_tab(*textp++)) count = tab(count); else count++; } while (*textp != '\n' && count < XBREAK) { if (is_tab(*textp)) { /* Expand tabs to spaces */ tab_count = tab(count); while (count < XBREAK && count < tab_count) { count++; putchar(' '); } textp++; } else { if (*textp >= '\01' && *textp <= '\037') { #ifdef UNIX tputs(SO, 0, _putchar); #else string_print (rev_video); #endif /* UNIX */ putchar(*textp++ + '\100'); #ifdef UNIX tputs(SE, 0, _putchar); #else string_print (normal_video); #endif /* UNIX */ } else putchar(*textp++); count++; } } /* If line is longer than XBREAK chars, print the shift_mark */ if (count == XBREAK && *textp != '\n') putchar(textp[1]=='\n' ? *textp : SHIFT_MARK); /* Clear the rest of the line is clear_line is TRUE */ if (clear_line == TRUE) { #ifdef UNIX tputs(CE, 0, _putchar); #else string_print(blank_line); #endif /* UNIX */ putchar('\n'); } } /* * Flush the I/O buffer on filedescriptor fd. */ int flush_buffer(fd) int fd; { if (out_count <= 0) /* There is nothing to flush */ return FINE; #ifdef UNIX if (fd == STD_OUT) { printf("%.*s", out_count, screen); _flush(); } else #endif /* UNIX */ if (write(fd, screen, out_count) != out_count) { bad_write(fd); return ERRORS; } clear_buffer(); /* Empty buffer */ return FINE; } /* * Bad_write() is called when a write failed. Notify the user. */ void bad_write(fd) int fd; { if (fd == STD_OUT) /* Cannot write to terminal? */ exit(1); clear_buffer(); build_string(text_buffer, "Command aborted: %s (File incomplete)", (errno == ENOSPC || errno == -ENOSPC) ? "No space on device" : "Write error"); error(text_buffer, NIL_PTR); } /* * Catch the SIGQUIT signal (^\) send to mined. It turns on the quitflag. */ void catch(sig) int sig; { /* Reset the signal */ signal(SIGQUIT, catch); quit = TRUE; } /* * Abort_mined() will leave mined. Confirmation is asked first. */ void abort_mined() { quit = FALSE; /* Ask for confirmation */ status_line("Really abort? ", NIL_PTR); if (getchar() != 'y') { clear_status(); return; } /* Reset terminal */ raw_mode(OFF); set_cursor(0, ymax); putchar('\n'); flush(); #ifdef UNIX abort(); #else exit(1); #endif /* UNIX */ } #define UNDEF _POSIX_VDISABLE /* * Set and reset tty into CBREAK or old mode according to argument `state'. It * also sets all signal characters (except for ^\) to UNDEF. ^\ is caught. */ void raw_mode(state) FLAG state; { static struct termios old_tty; static struct termios new_tty; if (state == OFF) { tcsetattr(input_fd, TCSANOW, &old_tty); return; } /* Save old tty settings */ tcgetattr(input_fd, &old_tty); /* Set tty to CBREAK mode */ tcgetattr(input_fd, &new_tty); new_tty.c_lflag &= ~(ICANON|ECHO|ECHONL); new_tty.c_iflag &= ~(IXON|IXOFF); /* Unset signal chars, leave only SIGQUIT set to ^\ */ new_tty.c_cc[VINTR] = new_tty.c_cc[VSUSP] = UNDEF; new_tty.c_cc[VQUIT] = '\\' & 037; signal(SIGQUIT, catch); /* Which is caught */ tcsetattr(input_fd, TCSANOW, &new_tty); } /* * Panic() is called with an error number and a message. It is called when * something unrecoverable has happened. * It writes the message to the terminal, resets the tty and exits. * Ask the user if he wants to save his file. */ void panic(message) register char *message; { extern char yank_file[]; #ifdef UNIX tputs(CL, 0, _putchar); build_string(text_buffer, "%s\nError code %d\n", message, errno); #else build_string(text_buffer, "%s%s\nError code %d\n", enter_string, message, errno); #endif /* UNIX */ (void) write(STD_OUT, text_buffer, length_of(text_buffer)); if (loading == FALSE) XT(); /* Check if file can be saved */ else (void) unlink(yank_file); raw_mode(OFF); #ifdef UNIX abort(); #else exit(1); #endif /* UNIX */ } char *alloc(bytes) int bytes; { char *p; p = malloc((unsigned) bytes); if (p == NIL_PTR) { if (loading == TRUE) panic("File too big."); panic("Out of memory."); } return(p); } void free_space(p) char *p; { free(p); } /* ======================================================================== * * Main loops * * ======================================================================== */ /* The mapping between input codes and functions. */ void (*key_map[256])() = { /* map ASCII characters to functions */ /* 000-017 */ MA, BL, MP, YA, SD, RD, MN, IF, DPC, S, S, DT, LR, S, DNW,LIB, /* 020-037 */ DPW, WB, GR, SH, DLN, SU, VI, XWT, XT, PT, EL, ESC, I, GOTO, HIGH, LOW, /* 040-057 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 060-077 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 100-117 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 120-137 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 140-157 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 160-177 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, DCC, /* 200-217 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 220-237 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 240-257 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 260-277 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 300-317 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 320-337 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 340-357 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, /* 360-377 */ S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, }; int nlines; /* Number of lines in file */ LINE *header; /* Head of line list */ LINE *tail; /* Last line in line list */ LINE *cur_line; /* Current line in use */ LINE *top_line; /* First line of screen */ LINE *bot_line; /* Last line of screen */ char *cur_text; /* Current char on current line in use */ int last_y; /* Last y of screen. Usually SCREENMAX */ char screen[SCREEN_SIZE]; /* Output buffer for "writes" and "reads" */ int x, y; /* x, y coordinates on screen */ FLAG modified = FALSE; /* Set when file is modified */ FLAG stat_visible; /* Set if status_line is visible */ FLAG writable; /* Set if file cannot be written */ FLAG loading; /* Set if we are loading a file. */ FLAG quit = FALSE; /* Set when quit character is typed */ FLAG rpipe = FALSE; /* Set if file should be read from stdin */ int input_fd = 0; /* Fd for command input */ int out_count; /* Index in output buffer */ char file_name[LINE_LEN]; /* Name of file in use */ char text_buffer[MAX_CHARS]; /* Buffer for modifying text */ /* Escape sequences. */ #ifdef UNIX char *CE, *VS, *SO, *SE, *CL, *AL, *CM; #else char *enter_string = "\033[H\033[J"; /* String printed on entering mined */ char *pos_string = "\033[%d;%dH"; /* Absolute cursor position */ char *rev_scroll = "\033M"; /* String for reverse scrolling */ char *rev_video = "\033[7m"; /* String for starting reverse video */ char *normal_video = "\033[m"; /* String for leaving reverse video */ char *blank_line = "\033[K"; /* Clear line to end */ #endif /* UNIX */ /* * Yank variables. */ FLAG yank_status = NOT_VALID; /* Status of yank_file */ char yank_file[] = "/tmp/mined.XXXXXX"; long chars_saved; /* Nr of chars in buffer */ /* * Initialize is called when a another file is edited. It free's the allocated * space and sets modified back to FALSE and fixes the header/tail pointer. */ void initialize() { register LINE *line, *next_line; /* Delete the whole list */ for (line = header->next; line != tail; line = next_line) { next_line = line->next; free_space(line->text); free_space((char*)line); } /* header and tail should point to itself */ line->next = line->prev = line; x = y = 0; rpipe = modified = FALSE; } /* * Basename() finds the absolute name of the file out of a given path_name. */ char *basename(path) char *path; { register char *ptr = path; register char *last = NIL_PTR; while (*ptr != '\0') { if (*ptr == '/') last = ptr; ptr++; } if (last == NIL_PTR) return path; if (*(last + 1) == '\0') { /* E.g. /usr/tmp/pipo/ */ *last = '\0'; return basename(path);/* Try again */ } return last + 1; } /* * Load_file loads the file `file' into core. If file is a NIL_PTR or the file * couldn't be opened, just some initializations are done, and a line consisting * of a `\n' is installed. */ void load_file(file) char *file; { register LINE *line = header; register int len; long nr_of_chars = 0L; int fd = -1; /* Filedescriptor for file */ nlines = 0; /* Zero lines to start with */ /* Open file */ writable = TRUE; /* Benefit of the doubt */ if (file == NIL_PTR) { if (rpipe == FALSE) status_line("No file.", NIL_PTR); else { fd = 0; file = "standard input"; } file_name[0] = '\0'; } else { copy_string(file_name, file); /* Save file name */ if (access(file, 0) < 0) /* Cannot access file. */ status_line("New file ", file); else if ((fd = open(file, 0)) < 0) status_line("Cannot open ", file); else if (access(file, 2) != 0) /* Set write flag */ writable = FALSE; } /* Read file */ loading = TRUE; /* Loading file, so set flag */ if (fd >= 0) { status_line("Reading ", file); while ((len = get_line(fd, text_buffer)) != ERRORS) { line = line_insert(line, text_buffer, len); nr_of_chars += (long) len; } if (nlines == 0) /* The file was empty! */ line = line_insert(line, "\n", 1); clear_buffer(); /* Clear output buffer */ cur_line = header->next; fstatus("Read", nr_of_chars); (void) close(fd); /* Close file */ } else /* Just install a "\n" */ (void) line_insert(line, "\n", 1); reset(header->next, 0); /* Initialize pointers */ /* Print screen */ display (0, 0, header->next, last_y); move_to (0, 0); flush(); /* Flush buffer */ loading = FALSE; /* Stop loading, reset flag */ } /* * Get_line reads one line from filedescriptor fd. If EOF is reached on fd, * get_line() returns ERRORS, else it returns the length of the string. */ int get_line(fd, buffer) int fd; register char *buffer; { static char *last = NIL_PTR; static char *current = NIL_PTR; static int read_chars; register char *cur_pos = current; char *begin = buffer; do { if (cur_pos == last) { if ((read_chars = read(fd, screen, SCREEN_SIZE)) <= 0) break; last = &screen[read_chars]; cur_pos = screen; } if (*cur_pos == '\0') *cur_pos = ' '; } while ((*buffer++ = *cur_pos++) != '\n'); current = cur_pos; if (read_chars <= 0) { if (buffer == begin) return ERRORS; if (*(buffer - 1) != '\n') if (loading == TRUE) /* Add '\n' to last line of file */ *buffer++ = '\n'; else { *buffer = '\0'; return NO_LINE; } } *buffer = '\0'; return buffer - begin; } /* * Install_line installs the buffer into a LINE structure It returns a pointer * to the allocated structure. */ LINE *install_line(buffer, length) char *buffer; int length; { register LINE *new_line = (LINE *) alloc(sizeof(LINE)); new_line->text = alloc(length + 1); new_line->shift_count = 0; copy_string(new_line->text, buffer); return new_line; } void main(argc, argv) int argc; char *argv[]; { /* mined is the Minix editor. */ register int index; /* Index in key table */ struct winsize winsize; #ifdef UNIX get_term(); tputs(VS, 0, _putchar); tputs(CL, 0, _putchar); #else string_print(enter_string); /* Hello world */ #endif /* UNIX */ if (ioctl(STD_OUT, TIOCGWINSZ, &winsize) == 0 && winsize.ws_row != 0) { ymax = winsize.ws_row - 1; screenmax = ymax - 1; } if (!isatty(0)) { /* Reading from pipe */ if (argc != 1) { write(2, "Cannot find terminal.\n", 22); exit (1); } rpipe = TRUE; modified = TRUE; /* Set modified so he can write */ open_device(); } raw_mode(ON); /* Set tty to appropriate mode */ header = tail = (LINE *) alloc(sizeof(LINE)); /* Make header of list*/ header->text = NIL_PTR; header->next = tail->prev = header; /* Load the file (if any) */ if (argc < 2) load_file(NIL_PTR); else { (void) get_file(NIL_PTR, argv[1]); /* Truncate filename */ load_file(argv[1]); } /* Main loop of the editor. */ for (;;) { index = getchar(); if (stat_visible == TRUE) clear_status(); if (quit == TRUE) abort_mined(); else { /* Call the function for this key */ (*key_map[index])(index); flush(); /* Flush output (if any) */ if (quit == TRUE) quit = FALSE; } } /* NOTREACHED */ } /* ======================================================================== * * Miscellaneous * * ======================================================================== */ /* * Redraw the screen */ void RD() { /* Clear screen */ #ifdef UNIX tputs(VS, 0, _putchar); tputs(CL, 0, _putchar); #else string_print(enter_string); #endif /* UNIX */ /* Print first page */ display(0, 0, top_line, last_y); /* Clear last line */ set_cursor(0, ymax); #ifdef UNIX tputs(CE, 0, _putchar); #else string_print(blank_line); #endif /* UNIX */ move_to(x, y); } /* * Ignore this keystroke. */ void I() { } /* * Leave editor. If the file has changed, ask if the user wants to save it. */ void XT() { if (modified == TRUE && ask_save() == ERRORS) return; raw_mode(OFF); set_cursor(0, ymax); putchar('\n'); flush(); (void) unlink(yank_file); /* Might not be necessary */ exit(0); } void (*escfunc(c))() int c; { #if (CHIP == M68000) #ifndef COMPAT int ch; #endif #endif if (c == '[') { /* Start of ASCII escape sequence. */ c = getchar(); #if (CHIP == M68000) #ifndef COMPAT if ((c >= '0') && (c <= '9')) ch = getchar(); /* ch is either a tilde or a second digit */ #endif #endif switch (c) { case 'H': return(HO); case 'A': return(UP); case 'B': return(DN); case 'C': return(RT); case 'D': return(LF); #if (CHIP == M68000) #ifndef COMPAT /* F1 = ESC [ 1 ~ */ /* F2 = ESC [ 2 ~ */ /* F3 = ESC [ 3 ~ */ /* F4 = ESC [ 4 ~ */ /* F5 = ESC [ 5 ~ */ /* F6 = ESC [ 6 ~ */ /* F7 = ESC [ 17 ~ */ /* F8 = ESC [ 18 ~ */ case '1': switch (ch) { case '~': return(SF); case '7': (void) getchar(); return(MA); case '8': (void) getchar(); return(CTL); } case '2': return(SR); case '3': return(PD); case '4': return(PU); case '5': return(FS); case '6': return(EF); #endif #endif #if (CHIP == INTEL) case 'G': return(FS); case 'S': return(SR); case 'T': return(SF); case 'U': return(PD); case 'V': return(PU); case 'Y': return(EF); #endif } return(I); } #if (CHIP == M68000) #ifdef COMPAT if (c == 'O') { /* Start of ASCII function key escape sequence. */ switch (getchar()) { case 'P': return(SF); case 'Q': return(SR); case 'R': return(PD); case 'S': return(PU); case 'T': return(FS); case 'U': return(EF); case 'V': return(MA); case 'W': return(CTL); } } #endif #endif return(I); } /* * ESC() wants a count and a command after that. It repeats the * command count times. If a ^\ is given during repeating, stop looping and * return to main loop. */ void ESC() { register int count = 0; register void (*func)(); int index; index = getchar(); while (index >= '0' && index <= '9' && quit == FALSE) { count *= 10; count += index - '0'; index = getchar(); } if (count == 0) { count = 1; func = escfunc(index); } else { func = key_map[index]; if (func == ESC) func = escfunc(getchar()); } if (func == I) { /* Function assigned? */ clear_status(); return; } while (count-- > 0 && quit == FALSE) { if (stat_visible == TRUE) clear_status(); (*func)(index); flush(); } if (quit == TRUE) /* Abort has been given */ error("Aborted", NIL_PTR); } /* * Ask the user if he wants to save his file or not. */ int ask_save() { register int c; status_line(file_name[0] ? basename(file_name) : "[buffer]" , " has been modified. Save? (y/n)"); while((c = getchar()) != 'y' && c != 'n' && quit == FALSE) { ring_bell(); flush(); } clear_status(); if (c == 'y') return WT(); if (c == 'n') return FINE; quit = FALSE; /* Abort character has been given */ return ERRORS; } /* * Line_number() finds the line number we're on. */ int line_number() { register LINE *line = header->next; register int count = 1; while (line != cur_line) { count++; line = line->next; } return count; } /* * Display a line telling how many chars and lines the file contains. Also tell * whether the file is readonly and/or modified. */ void file_status(message, count, file, lines, writefl, changed) char *message; register long count; /* Contains number of characters in file */ char *file; int lines; FLAG writefl, changed; { register LINE *line; char msg[LINE_LEN + 40];/* Buffer to hold line */ char yank_msg[LINE_LEN];/* Buffer for msg of yank_file */ if (count < 0) /* Not valid. Count chars in file */ for (line = header->next; line != tail; line = line->next) count += length_of(line->text); if (yank_status != NOT_VALID) /* Append buffer info */ build_string(yank_msg, " Buffer: %D char%s.", chars_saved, (chars_saved == 1L) ? "" : "s"); else yank_msg[0] = '\0'; build_string(msg, "%s %s%s%s %d line%s %D char%s.%s Line %d", message, (rpipe == TRUE && *message != '[') ? "standard input" : basename(file), (changed == TRUE) ? "*" : "", (writefl == FALSE) ? " (Readonly)" : "", lines, (lines == 1) ? "" : "s", count, (count == 1L) ? "" : "s", yank_msg, line_number()); if (length_of(msg) + 1 > LINE_LEN - 4) { msg[LINE_LEN - 4] = SHIFT_MARK; /* Overflow on status line */ msg[LINE_LEN - 3] = '\0'; } status_line(msg, NIL_PTR); /* Print the information */ } /* * Build_string() prints the arguments as described in fmt, into the buffer. * %s indicates an argument string, %d indicated an argument number. */ #if __STDC__ void build_string(char *buf, char *fmt, ...) { #else void build_string(buf, fmt, va_alist) char *buf, *fmt; va_dcl { #endif va_list argptr; char *scanp; #if __STDC__ va_start(argptr, fmt); #else va_start(argptr); #endif while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt++) { case 's' : scanp = va_arg(argptr, char *); break; case 'd' : scanp = num_out((long) va_arg(argptr, int)); break; case 'D' : scanp = num_out((long) va_arg(argptr, long)); break; default : scanp = ""; } while (*buf++ = *scanp++) ; buf--; } else *buf++ = *fmt++; } va_end(argptr); *buf = '\0'; } /* * Output an (unsigned) long in a 10 digit field without leading zeros. * It returns a pointer to the first digit in the buffer. */ char *num_out(number) long number; { static char num_buf[11]; /* Buffer to build number */ register long digit; /* Next digit of number */ register long pow = 1000000000L; /* Highest ten power of long */ FLAG digit_seen = FALSE; int i; for (i = 0; i < 10; i++) { digit = number / pow; /* Get next digit */ if (digit == 0L && digit_seen == FALSE && i != 9) num_buf[i] = ' '; else { num_buf[i] = '0' + (char) digit; number -= digit * pow; /* Erase digit */ digit_seen = TRUE; } pow /= 10L; /* Get next digit */ } for (i = 0; num_buf[i] == ' '; i++) /* Skip leading spaces */ ; return (&num_buf[i]); } /* * Get_number() read a number from the terminal. The last character typed in is * returned. ERRORS is returned on a bad number. The resulting number is put * into the integer the arguments points to. */ int get_number(message, result) char *message; int *result; { register int index; register int count = 0; status_line(message, NIL_PTR); index = getchar(); if (quit == FALSE && (index < '0' || index > '9')) { error("Bad count", NIL_PTR); return ERRORS; } /* Convert input to a decimal number */ while (index >= '0' && index <= '9' && quit == FALSE) { count *= 10; count += index - '0'; index = getchar(); } if (quit == TRUE) { clear_status(); return ERRORS; } *result = count; return index; } /* * Input() reads a string from the terminal. When the KILL character is typed, * it returns ERRORS. */ int input(inbuf, clearfl) char *inbuf; FLAG clearfl; { register char *ptr; register char c; /* Character read */ ptr = inbuf; *ptr = '\0'; while (quit == FALSE) { flush(); switch (c = getchar()) { case '\b' : /* Erase previous char */ if (ptr > inbuf) { ptr--; #ifdef UNIX tputs(SE, 0, _putchar); #else string_print(normal_video); #endif /* UNIX */ if (is_tab(*ptr)) string_print(" \b\b\b \b\b"); else string_print(" \b\b \b"); #ifdef UNIX tputs(SO, 0, _putchar); #else string_print(rev_video); #endif /* UNIX */ string_print(" \b"); *ptr = '\0'; } else ring_bell(); break; case '\n' : /* End of input */ /* If inbuf is empty clear status_line */ return (ptr == inbuf && clearfl == TRUE) ? NO_INPUT :FINE; default : /* Only read ASCII chars */ if ((c >= ' ' && c <= '~') || c == '\t') { *ptr++ = c; *ptr = '\0'; if (c == '\t') string_print("^I"); else putchar(c); string_print(" \b"); } else ring_bell(); } } quit = FALSE; return ERRORS; } /* * Get_file() reads a filename from the terminal. Filenames longer than * FILE_LENGHT chars are truncated. */ int get_file(message, file) char *message, *file; { char *ptr; int ret; if (message == NIL_PTR || (ret = get_string(message, file, TRUE)) == FINE) { if (length_of((ptr = basename(file))) > NAME_MAX) ptr[NAME_MAX] = '\0'; } return ret; } /* ======================================================================== * * UNIX I/O Routines * * ======================================================================== */ #ifdef UNIX #undef putchar int _getchar() { char c; if (read(input_fd, &c, 1) != 1 && quit == FALSE) panic ("Cannot read 1 byte from input"); return c & 0377; } void _flush() { (void) fflush(stdout); } void _putchar(c) char c; { (void) write_char(STD_OUT, c); } void get_term() { static char termbuf[50]; extern char *tgetstr(), *getenv(); char *loc = termbuf; char entry[1024]; if (tgetent(entry, getenv("TERM")) <= 0) { printf("Unknown terminal.\n"); exit(1); } AL = tgetstr("al", &loc); CE = tgetstr("ce", &loc); VS = tgetstr("vs", &loc); CL = tgetstr("cl", &loc); SO = tgetstr("so", &loc); SE = tgetstr("se", &loc); CM = tgetstr("cm", &loc); ymax = tgetnum("li") - 1; screenmax = ymax - 1; if (!CE || !SO || !SE || !CL || !AL || !CM) { printf("Sorry, no mined on this type of terminal\n"); exit(1); } } #endif /* UNIX */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Part 2 of the mined editor. */ /* ======================================================================== * * Move Commands * * ======================================================================== */ #include "mined.h" #include <string.h> /* * Move one line up. */ void UP() { if (y == 0) { /* Top line of screen. Scroll one line */ (void) reverse_scroll(); move_to(x, y); } else /* Move to previous line */ move_to(x, y - 1); } /* * Move one line down. */ void DN() { if (y == last_y) { /* Last line of screen. Scroll one line */ if (bot_line->next == tail && bot_line->text[0] != '\n') { dummy_line(); /* Create new empty line */ DN(); return; } else { (void) forward_scroll(); move_to(x, y); } } else /* Move to next line */ move_to(x, y + 1); } /* * Move left one position. */ void LF() { if (x == 0 && get_shift(cur_line->shift_count) == 0) {/* Begin of line */ if (cur_line->prev != header) { UP(); /* Move one line up */ move_to(LINE_END, y); } } else move_to(x - 1, y); } /* * Move right one position. */ void RT() { if (*cur_text == '\n') { if (cur_line->next != tail) { /* Last char of file */ DN(); /* Move one line down */ move_to(LINE_START, y); } } else move_to(x + 1, y); } /* * Move to coordinates [0, 0] on screen. */ void HIGH() { move_to(0, 0); } /* * Move to coordinates [0, YMAX] on screen. */ void LOW() { move_to(0, last_y); } /* * Move to begin of line. */ void BL() { move_to(LINE_START, y); } /* * Move to end of line. */ void EL() { move_to(LINE_END, y); } /* * GOTO() prompts for a linenumber and moves to that line. */ void GOTO() { int number; LINE *line; if (get_number("Please enter line number.", &number) == ERRORS) return; if (number <= 0 || (line = proceed(header->next, number - 1)) == tail) error("Illegal line number: ", num_out((long) number)); else move_to(x, find_y(line)); } /* * Scroll forward one page or to eof, whatever comes first. (Bot_line becomes * top_line of display.) Try to leave the cursor on the same line. If this is * not possible, leave cursor on the line halfway the page. */ void PD() { register int i; for (i = 0; i < screenmax; i++) if (forward_scroll() == ERRORS) break; /* EOF reached */ if (y - i < 0) /* Line no longer on screen */ move_to(0, screenmax >> 1); else move_to(0, y - i); } /* * Scroll backwards one page or to top of file, whatever comes first. (Top_line * becomes bot_line of display). The very bottom line (YMAX) is always blank. * Try to leave the cursor on the same line. If this is not possible, leave * cursor on the line halfway the page. */ void PU() { register int i; for (i = 0; i < screenmax; i++) if (reverse_scroll() == ERRORS) break; /* Top of file reached */ set_cursor(0, ymax); /* Erase very bottom line */ #ifdef UNIX tputs(CE, 0, _putchar); #else string_print(blank_line); #endif /* UNIX */ if (y + i > screenmax) /* line no longer on screen */ move_to(0, screenmax >> 1); else move_to(0, y + i); } /* * Go to top of file, scrolling if possible, else redrawing screen. */ void HO() { if (proceed(top_line, -screenmax) == header) PU(); /* It fits. Let PU do it */ else { reset(header->next, 0);/* Reset top_line, etc. */ RD(); /* Display full page */ } move_to(LINE_START, 0); } /* * Go to last line of file, scrolling if possible, else redrawing screen */ void EF() { if (tail->prev->text[0] != '\n') dummy_line(); if (proceed(bot_line, screenmax) == tail) PD(); /* It fits. Let PD do it */ else { reset(proceed(tail->prev, -screenmax), screenmax); RD(); /* Display full page */ } move_to(LINE_START, last_y); } /* * Scroll one line up. Leave the cursor on the same line (if possible). */ void SU() { if (top_line->prev == header) /* Top of file. Can't scroll */ return; (void) reverse_scroll(); set_cursor(0, ymax); /* Erase very bottom line */ #ifdef UNIX tputs(CE, 0, _putchar); #else string_print(blank_line); #endif /* UNIX */ move_to(x, (y == screenmax) ? screenmax : y + 1); } /* * Scroll one line down. Leave the cursor on the same line (if possible). */ void SD() { if (forward_scroll() != ERRORS) move_to(x, (y == 0) ? 0 : y - 1); else set_cursor(x, y); } /* * Perform a forward scroll. It returns ERRORS if we're at the last line of the * file. */ int forward_scroll() { if (bot_line->next == tail) /* Last line of file. No dice */ return ERRORS; top_line = top_line->next; bot_line = bot_line->next; cur_line = cur_line->next; set_cursor(0, ymax); line_print(bot_line); return FINE; } /* * Perform a backwards scroll. It returns ERRORS if we're at the first line * of the file. */ int reverse_scroll() { if (top_line->prev == header) return ERRORS; /* Top of file. Can't scroll */ if (last_y != screenmax) /* Reset last_y if necessary */ last_y++; else bot_line = bot_line->prev; /* Else adjust bot_line */ top_line = top_line->prev; cur_line = cur_line->prev; /* Perform the scroll */ set_cursor(0, 0); #ifdef UNIX tputs(AL, 0, _putchar); #else string_print(rev_scroll); #endif /* UNIX */ set_cursor(0, 0); line_print(top_line); return FINE; } /* * A word is defined as a number of non-blank characters separated by tabs * spaces or linefeeds. */ /* * MP() moves to the start of the previous word. A word is defined as a * number of non-blank characters separated by tabs spaces or linefeeds. */ void MP() { move_previous_word(NO_DELETE); } void move_previous_word(remove) FLAG remove; { register char *begin_line; register char *textp; char start_char = *cur_text; char *start_pos = cur_text; /* Fist check if we're at the beginning of line. */ if (cur_text == cur_line->text) { if (cur_line->prev == header) return; start_char = '\0'; } LF(); begin_line = cur_line->text; textp = cur_text; /* Check if we're in the middle of a word. */ if (!alpha(*textp) || !alpha(start_char)) { while (textp != begin_line && (white_space(*textp) || *textp == '\n')) textp--; } /* Now we're at the end of previous word. Skip non-blanks until a blank comes */ while (textp != begin_line && alpha(*textp)) textp--; /* Go to the next char if we're not at the beginning of the line */ if (textp != begin_line && *textp != '\n') textp++; /* Find the x-coordinate of this address, and move to it */ move_address(textp); if (remove == DELETE) delete(cur_line, textp, cur_line, start_pos); } /* * MN() moves to the start of the next word. A word is defined as a number of * non-blank characters separated by tabs spaces or linefeeds. Always keep in * mind that the pointer shouldn't pass the '\n'. */ void MN() { move_next_word(NO_DELETE); } void move_next_word(remove) FLAG remove; { register char *textp = cur_text; /* Move to the end of the current word. */ while (*textp != '\n' && alpha(*textp)) textp++; /* Skip all white spaces */ while (*textp != '\n' && white_space(*textp)) textp++; /* If we're deleting. delete the text in between */ if (remove == DELETE) { delete(cur_line, cur_text, cur_line, textp); return; } /* If we're at end of line. move to the first word on the next line. */ if (*textp == '\n' && cur_line->next != tail) { DN(); move_to(LINE_START, y); textp = cur_text; while (*textp != '\n' && white_space(*textp)) textp++; } move_address(textp); } /* ======================================================================== * * Modify Commands * * ======================================================================== */ /* * DCC deletes the character under the cursor. If this character is a '\n' the * current line is joined with the next one. * If this character is the only character of the line, the current line will * be deleted. */ void DCC() { if (*cur_text == '\n') delete(cur_line,cur_text, cur_line->next,cur_line->next->text); else delete(cur_line, cur_text, cur_line, cur_text + 1); } /* * DPC delebK��dK��eK��fK��gK��hK��iK��jK��kK��lK��mK��nK��oK��pK��qK��rK��sK��tK��uK��vK��wK��xK��yK��zK��{K��|K��}K��~K��K��K��K��K��K��K��K��K��K��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tes the character on the left side of the cursor. If the cursor is * at the beginning of the line, the last character if the previous line is * deleted. */ void DPC() { if (x == 0 && cur_line->prev == header) return; /* Top of file */ LF(); /* Move one left */ DCC(); /* Delete character under cursor */ } /* * DLN deletes all characters until the end of the line. If the current * character is a '\n', then delete that char. */ void DLN() { if (*cur_text == '\n') DCC(); else delete(cur_line, cur_text, cur_line, cur_text + length_of(cur_text) -1); } /* * DNW() deletes the next word (as described in MN()) */ void DNW() { if (*cur_text == '\n') DCC(); else move_next_word(DELETE); } /* * DPW() deletes the next word (as described in MP()) */ void DPW() { if (cur_text == cur_line->text) DPC(); else move_previous_word(DELETE); } /* * Insert character `character' at current location. */ void S(character) register char character; { static char buffer[2]; buffer[0] = character; /* Insert the character */ if (insert(cur_line, cur_text, buffer) == ERRORS) return; /* Fix screen */ if (character == '\n') { set_cursor(0, y); if (y == screenmax) { /* Can't use display */ line_print(cur_line); (void) forward_scroll(); } else { reset(top_line, y); /* Reset pointers */ display(0, y, cur_line, last_y - y); } move_to(0, (y == screenmax) ? y : y + 1); } else if (x + 1 == XBREAK)/* If line must be shifted, just call move_to*/ move_to(x + 1, y); else { /* else display rest of line */ put_line(cur_line, x, FALSE); move_to(x + 1, y); } } /* * CTL inserts a control-char at the current location. A message that this * function is called is displayed at the status line. */ void CTL() { register char ctrl; status_line("Enter control character.", NIL_PTR); if ((ctrl = getchar()) >= '\01' && ctrl <= '\037') { S(ctrl); /* Insert the char */ clear_status(); } else error ("Unknown control character", NIL_PTR); } /* * LIB insert a line at the current position and moves back to the end of * the previous line. */ void LIB() { S('\n'); /* Insert the line */ UP(); /* Move one line up */ move_to(LINE_END, y); /* Move to end of this line */ } /* * Line_insert() inserts a new line with text pointed to by `string'. * It returns the address of the new line. */ LINE *line_insert(line, string, len) register LINE *line; char *string; int len; { register LINE *new_line; /* Allocate space for LINE structure and text */ new_line = install_line(string, len); /* Install the line into the double linked list */ new_line->prev = line; new_line->next = line->next; line->next = new_line; new_line->next->prev = new_line; /* Increment nlines */ nlines++; return new_line; } /* * Insert() insert the string `string' at the given line and location. */ int insert(line, location, string) register LINE *line; char *location, *string; { register char *bufp = text_buffer; /* Buffer for building line */ register char *textp = line->text; if (length_of(textp) + length_of(string) >= MAX_CHARS) { error("Line too long", NIL_PTR); return ERRORS; } modified = TRUE; /* File has been modified */ /* Copy part of line until `location' has been reached */ while (textp != location) *bufp++ = *textp++; /* Insert string at this location */ while (*string != '\0') *bufp++ = *string++; *bufp = '\0'; if (*(string - 1) == '\n') /* Insert a new line */ (void) line_insert(line, location, length_of(location)); else /* Append last part of line */ copy_string(bufp, location); /* Install the new text in this line */ free_space(line->text); line->text = alloc(length_of(text_buffer) + 1); copy_string(line->text, text_buffer); return FINE; } /* * Line_delete() deletes the argument line out of the line list. The pointer to * the next line is returned. */ LINE *line_delete(line) register LINE *line; { register LINE *next_line = line->next; /* Delete the line */ line->prev->next = line->next; line->next->prev = line->prev; /* Free allocated space */ free_space(line->text); free_space((char*)line); /* Decrement nlines */ nlines--; return next_line; } /* * Delete() deletes all the characters (including newlines) between the * startposition and endposition and fixes the screen accordingly. It * returns the number of lines deleted. */ void delete(start_line, start_textp, end_line, end_textp) register LINE *start_line; LINE *end_line; char *start_textp, *end_textp; { register char *textp = start_line->text; register char *bufp = text_buffer; /* Storage for new line->text */ LINE *line, *stop; int line_cnt = 0; /* Nr of lines deleted */ int count = 0; int shift = 0; /* Used in shift calculation */ int nx = x; modified = TRUE; /* File has been modified */ /* Set up new line. Copy first part of start line until start_position. */ while (textp < start_textp) { *bufp++ = *textp++; count++; } /* Check if line doesn't exceed MAX_CHARS */ if (count + length_of(end_textp) >= MAX_CHARS) { error("Line too long", NIL_PTR); return; } /* Copy last part of end_line if end_line is not tail */ copy_string(bufp, (end_textp != NIL_PTR) ? end_textp : "\n"); /* Delete all lines between start and end_position (including end_line) */ line = start_line->next; stop = end_line->next; while (line != stop && line != tail) { line = line_delete(line); line_cnt++; } /* Check if last line of file should be deleted */ if (end_textp == NIL_PTR && length_of(start_line->text) == 1 && nlines > 1) { start_line = start_line->prev; (void) line_delete(start_line->next); line_cnt++; } else { /* Install new text */ free_space(start_line->text); start_line->text = alloc(length_of(text_buffer) + 1); copy_string(start_line->text, text_buffer); } /* Fix screen. First check if line is shifted. Perhaps we should shift it back*/ if (get_shift(start_line->shift_count)) { shift = (XBREAK - count_chars(start_line)) / SHIFT_SIZE; if (shift > 0) { /* Shift line `shift' back */ if (shift >= get_shift(start_line->shift_count)) start_line->shift_count = 0; else start_line->shift_count -= shift; nx += shift * SHIFT_SIZE;/* Reset x value */ } } if (line_cnt == 0) { /* Check if only one line changed */ if (shift > 0) { /* Reprint whole line */ set_cursor(0, y); line_print(start_line); } else { /* Just display last part of line */ set_cursor(x, y); put_line(start_line, x, TRUE); } move_to(nx, y); /* Reset cur_text */ return; } shift = last_y; /* Save value */ reset(top_line, y); display(0, y, start_line, shift - y); move_to((line_cnt == 1) ? nx : 0, y); } /* ======================================================================== * * Yank Commands * * ======================================================================== */ LINE *mark_line; /* For marking position. */ char *mark_text; int lines_saved; /* Nr of lines in buffer */ /* * PT() inserts the buffer at the current location. */ void PT() { register int fd; /* File descriptor for buffer */ if ((fd = scratch_file(READ)) == ERRORS) error("Buffer is empty.", NIL_PTR); else { file_insert(fd, FALSE);/* Insert the buffer */ (void) close(fd); } } /* * IF() prompt for a filename and inserts the file at the current location * in the file. */ void IF() { register int fd; /* File descriptor of file */ char name[LINE_LEN]; /* Buffer for file name */ /* Get the file name */ if (get_file("Get and insert file:", name) != FINE) return; if ((fd = open(name, 0)) < 0) error("Cannot open ", name); else { file_insert(fd, TRUE); /* Insert the file */ (void) close(fd); } } /* * File_insert() inserts a an opened file (as given by filedescriptor fd) * at the current location. */ void file_insert(fd, old_pos) int fd; FLAG old_pos; { char line_buffer[MAX_CHARS]; /* Buffer for next line */ register LINE *line = cur_line; register int line_count = nlines; /* Nr of lines inserted */ LINE *page = cur_line; int ret = ERRORS; /* Get the first piece of text (might be ended with a '\n') from fd */ if (get_line(fd, line_buffer) == ERRORS) return; /* Empty file */ /* Insert this text at the current location. */ if (insert(line, cur_text, line_buffer) == ERRORS) return; /* Repeat getting lines (and inserting lines) until EOF is reached */ while ((ret = get_line(fd, line_buffer)) != ERRORS && ret != NO_LINE) line = line_insert(line, line_buffer, ret); if (ret == NO_LINE) { /* Last line read not ended by a '\n' */ line = line->next; (void) insert(line, line->text, line_buffer); } /* Calculate nr of lines added */ line_count = nlines - line_count; /* Fix the screen */ if (line_count == 0) { /* Only one line changed */ set_cursor(0, y); line_print(line); move_to((old_pos == TRUE) ? x : x + length_of(line_buffer), y); } else { /* Several lines changed */ reset(top_line, y); /* Reset pointers */ while (page != line && page != bot_line->next) page = page->next; if (page != bot_line->next || old_pos == TRUE) display(0, y, cur_line, screenmax - y); if (old_pos == TRUE) move_to(x, y); else if (ret == NO_LINE) move_to(length_of(line_buffer), find_y(line)); else move_to(0, find_y(line->next)); } /* If nr of added line >= REPORT, print the count */ if (line_count >= REPORT) status_line(num_out((long) line_count), " lines added."); } /* * WB() writes the buffer (yank_file) into another file, which * is prompted for. */ void WB() { register int new_fd; /* Filedescriptor to copy file */ int yank_fd; /* Filedescriptor to buffer */ register int cnt; /* Count check for read/write */ int ret = 0; /* Error check for write */ char file[LINE_LEN]; /* Output file */ /* Checkout the buffer */ if ((yank_fd = scratch_file(READ)) == ERRORS) { error("Buffer is empty.", NIL_PTR); return; } /* Get file name */ if (get_file("Write buffer to file:", file) != FINE) return; /* Creat the new file */ if ((new_fd = creat(file, 0644)) < 0) { error("Cannot create ", file); return; } status_line("Writing ", file); /* Copy buffer into file */ while ((cnt = read(yank_fd, text_buffer, sizeof(text_buffer))) > 0) if (write(new_fd, text_buffer, cnt) != cnt) { bad_write(new_fd); ret = ERRORS; break; } /* Clean up open files and status_line */ (void) close(new_fd); (void) close(yank_fd); if (ret != ERRORS) /* Bad write */ file_status("Wrote", chars_saved, file, lines_saved, TRUE, FALSE); } /* * MA sets mark_line (mark_text) to the current line (text pointer). */ void MA() { mark_line = cur_line; mark_text = cur_text; status_line("Mark set", NIL_PTR); } /* * YA() puts the text between the marked position and the current * in the buffer. */ void YA() { set_up(NO_DELETE); } /* * DT() is essentially the same as YA(), but in DT() the text is deleted. */ void DT() { set_up(DELETE); } /* * Set_up is an interface to the actual yank. It calls checkmark () to check * if the marked position is still valid. If it is, yank is called with the * arguments in the right order. */ void set_up(remove) FLAG remove; /* DELETE if text should be deleted */ { switch (checkmark()) { case NOT_VALID : error("Mark not set.", NIL_PTR); return; case SMALLER : yank(mark_line, mark_text, cur_line, cur_text, remove); break; case BIGGER : yank(cur_line, cur_text, mark_line, mark_text, remove); break; case SAME : /* Ignore stupid behaviour */ yank_status = EMPTY; chars_saved = 0L; status_line("0 characters saved in buffer.", NIL_PTR); break; } } /* * Check_mark() checks if mark_line and mark_text are still valid pointers. If * they are it returns SMALLER if the marked position is before the current, * BIGGER if it isn't or SAME if somebody didn't get the point. * NOT_VALID is returned when mark_line and/or mark_text are no longer valid. * Legal() checks if mark_text is valid on the mark_line. */ FLAG checkmark() { register LINE *line; FLAG cur_seen = FALSE; /* Special case: check is mark_line and cur_line are the same. */ if (mark_line == cur_line) { if (mark_text == cur_text) /* Even same place */ return SAME; if (legal() == ERRORS) /* mark_text out of range */ return NOT_VALID; return (mark_text < cur_text) ? SMALLER : BIGGER; } /* Start looking for mark_line in the line structure */ for (line = header->next; line != tail; line = line->next) { if (line == cur_line) cur_seen = TRUE; else if (line == mark_line) break; } /* If we found mark_line (line != tail) check for legality of mark_text */ if (line == tail || legal() == ERRORS) return NOT_VALID; /* cur_seen is TRUE if cur_line is before mark_line */ return (cur_seen == TRUE) ? BIGGER : SMALLER; } /* * Legal() checks if mark_text is still a valid pointer. */ int legal() { register char *textp = mark_line->text; /* Locate mark_text on mark_line */ while (textp != mark_text && *textp++ != '\0') ; return (*textp == '\0') ? ERRORS : FINE; } /* * Yank puts all the text between start_position and end_position into * the buffer. * The caller must check that the arguments to yank() are valid. (E.g. in * the right order) */ void yank(start_line, start_textp, end_line, end_textp, remove) LINE *start_line, *end_line; char *start_textp, *end_textp; FLAG remove; /* DELETE if text should be deleted */ { register LINE *line = start_line; register char *textp = start_textp; int fd; /* Creat file to hold buffer */ if ((fd = scratch_file(WRITE)) == ERRORS) return; chars_saved = 0L; lines_saved = 0; status_line("Saving text.", NIL_PTR); /* Keep writing chars until the end_location is reached. */ while (textp != end_textp) { if (write_char(fd, *textp) == ERRORS) { (void) close(fd); return; } if (*textp++ == '\n') { /* Move to the next line */ line = line->next; textp = line->text; lines_saved++; } chars_saved++; } /* Flush the I/O buffer and close file */ if (flush_buffer(fd) == ERRORS) { (void) close(fd); return; } (void) close(fd); yank_status = VALID; /* * Check if the text should be deleted as well. If it should, the following * hack is used to save a lot of code. First move back to the start_position. * (This might be the location we're on now!) and them delete the text. * It might be a bit confusing the first time somebody uses it. * Delete() will fix the screen. */ if (remove == DELETE) { move_to(find_x(start_line, start_textp), find_y(start_line)); delete(start_line, start_textp, end_line, end_textp); } status_line(num_out(chars_saved), " characters saved in buffer."); } /* * Scratch_file() creates a uniq file in /usr/tmp. If the file couldn't * be created other combinations of files are tried until a maximum * of MAXTRAILS times. After MAXTRAILS times, an error message is given * and ERRORS is returned. */ #define MAXTRAILS 26 int scratch_file(mode) FLAG mode; /* Can be READ or WRITE permission */ { static int trials = 0; /* Keep track of trails */ register char *y_ptr, *n_ptr; int fd; /* Filedescriptor to buffer */ /* If yank_status == NOT_VALID, scratch_file is called for the first time */ if (yank_status == NOT_VALID && mode == WRITE) { /* Create new file */ /* Generate file name. */ y_ptr = &yank_file[11]; n_ptr = num_out((long) getpid()); while ((*y_ptr = *n_ptr++) != '\0') y_ptr++; *y_ptr++ = 'a' + trials; *y_ptr = '\0'; /* Check file existence */ if (access(yank_file, 0) == 0 || (fd = creat(yank_file, 0644)) < 0) { if (trials++ >= MAXTRAILS) { error("Unable to creat scratchfile.", NIL_PTR); return ERRORS; } else return scratch_file(mode);/* Have another go */ } } else if ((mode == READ && (fd = open(yank_file, 0)) < 0) || (mode == WRITE && (fd = creat(yank_file, 0644)) < 0)) { yank_status = NOT_VALID; return ERRORS; } clear_buffer(); return fd; } /* ======================================================================== * * Search Routines * * ======================================================================== */ /* * A regular expression consists of a sequence of: * 1. A normal character matching that character. * 2. A . matching any character. * 3. A ^ matching the begin of a line. * 4. A $ (as last character of the pattern) mathing the end of a line. * 5. A \<character> matching <character>. * 6. A number of characters enclosed in [] pairs matching any of these * characters. A list of characters can be indicated by a '-'. So * [a-z] matches any letter of the alphabet. If the first character * after the '[' is a '^' then the set is negated (matching none of * the characters). * A ']', '^' or '-' can be escaped by putting a '\' in front of it. * 7. If one of the expressions as described in 1-6 is followed by a * '*' than that expressions matches a sequence of 0 or more of * that expression. */ char typed_expression[LINE_LEN]; /* Holds previous expr. */ /* * SF searches forward for an expression. */ void SF() { search("Search forward:", FORWARD); } /* * SF searches backwards for an expression. */ void SR() { search("Search reverse:", REVERSE); } /* * Get_expression() prompts for an expression. If just a return is typed, the * old expression is used. If the expression changed, compile() is called and * the returning REGEX structure is returned. It returns NIL_REG upon error. * The save flag indicates whether the expression should be appended at the * message pointer. */ REGEX *get_expression(message) char *message; { static REGEX program; /* Program of expression */ char exp_buf[LINE_LEN]; /* Buffer for new expr. */ if (get_string(message, exp_buf, FALSE) == ERRORS) return NIL_REG; if (exp_buf[0] == '\0' && typed_expression[0] == '\0') { error("No previous expression.", NIL_PTR); return NIL_REG; } if (exp_buf[0] != '\0') { /* A new expr. is typed */ copy_string(typed_expression, exp_buf);/* Save expr. */ compile(exp_buf, &program); /* Compile new expression */ } if (program.status == REG_ERROR) { /* Error during compiling */ error(program.result.err_mess, NIL_PTR); return NIL_REG; } return &program; } /* * GR() a replaces all matches from the current position until the end * of the file. */ void GR() { change("Global replace:", VALID); } /* * LR() replaces all matches on the current line. */ void LR() { change("Line replace:", NOT_VALID); } /* * Change() prompts for an expression and a substitution pattern and changes * all matches of the expression into the substitution. change() start looking * for expressions at the current line and continues until the end of the file * if the FLAG file is VALID. */ void change(message, file) char *message; /* Message to prompt for expression */ FLAG file; { char mess_buf[LINE_LEN]; /* Buffer to hold message */ char replacement[LINE_LEN]; /* Buffer to hold subst. pattern */ REGEX *program; /* Program resulting from compilation */ register LINE *line = cur_line; register char *textp; long lines = 0L; /* Nr of lines on which subs occurred */ long subs = 0L; /* Nr of subs made */ int page = y; /* Index to check if line is on screen*/ /* Save message and get expression */ copy_string(mess_buf, message); if ((program = get_expression(mess_buf)) == NIL_REG) return; /* Get substitution pattern */ build_string(mess_buf, "%s %s by:", mess_buf, typed_expression); if (get_string(mess_buf, replacement, FALSE) == ERRORS) return; set_cursor(0, ymax); flush(); /* Substitute until end of file */ do { if (line_check(program, line->text, FORWARD)) { lines++; /* Repeat sub. on this line as long as we find a match*/ do { subs++; /* Increment subs */ if ((textp = substitute(line, program,replacement)) == NIL_PTR) return; /* Line too long */ } while ((program->status & BEGIN_LINE) != BEGIN_LINE && (program->status & END_LINE) != END_LINE && line_check(program, textp, FORWARD)); /* Check to see if we can print the result */ if (page <= screenmax) { set_cursor(0, page); line_print(line); } } if (page <= screenmax) page++; line = line->next; } while (line != tail && file == VALID && quit == FALSE); copy_string(mess_buf, (quit == TRUE) ? "(Aborted) " : ""); /* Fix the status line */ if (subs == 0L && quit == FALSE) error("Pattern not found.", NIL_PTR); else if (lines >= REPORT || quit == TRUE) { build_string(mess_buf, "%s %D substitutions on %D lines.", mess_buf, subs, lines); status_line(mess_buf, NIL_PTR); } else if (file == NOT_VALID && subs >= REPORT) status_line(num_out(subs), " substitutions."); else clear_status(); move_to (x, y); } /* * Substitute() replaces the match on this line by the substitute pattern * as indicated by the program. Every '&' in the replacement is replaced by * the original match. A \ in the replacement escapes the next character. */ char *substitute(line, program, replacement) LINE *line; REGEX *program; char *replacement; /* Contains replacement pattern */ { register char *textp = text_buffer; register char *subp = replacement; char *linep = line->text; char *amp; modified = TRUE; /* Copy part of line until the beginning of the match */ while (linep != program->start_ptr) *textp++ = *linep++; /* * Replace the match by the substitution pattern. Each occurrence of '&' is * replaced by the original match. A \ escapes the next character. */ while (*subp != '\0' && textp < &text_buffer[MAX_CHARS]) { if (*subp == '&') { /* Replace the original match */ amp = program->start_ptr; while (amp < program->end_ptr && textp<&text_buffer[MAX_CHARS]) *textp++ = *amp++; subp++; } else { if (*subp == '\\' && *(subp + 1) != '\0') subp++; *textp++ = *subp++; } } /* Check for line length not exceeding MAX_CHARS */ if (length_of(text_buffer) + length_of(program->end_ptr) >= MAX_CHARS) { error("Substitution result: line too big", NIL_PTR); return NIL_PTR; } /* Append last part of line to the new build line */ copy_string(textp, program->end_ptr); /* Free old line and install new one */ free_space(line->text); line->text = alloc(length_of(text_buffer) + 1); copy_string(line->text, text_buffer); return(line->text + (textp - text_buffer)); } /* * Search() calls get_expression to fetch the expression. If this went well, * the function match() is called which returns the line with the next match. * If this line is the NIL_LINE, it means that a match could not be found. * Find_x() and find_y() display the right page on the screen, and return * the right coordinates for x and y. These coordinates are passed to move_to() */ void search(message, method) char *message; FLAG method; { register REGEX *program; register LINE *match_line; /* Get the expression */ if ((program = get_expression(message)) == NIL_REG) return; set_cursor(0, ymax); flush(); /* Find the match */ if ((match_line = match(program, cur_text, method)) == NIL_LINE) { if (quit == TRUE) status_line("Aborted", NIL_PTR); else status_line("Pattern not found.", NIL_PTR); return; } move(0, program->start_ptr, find_y(match_line)); clear_status(); } /* * find_y() checks if the matched line is on the current page. If it is, it * returns the new y coordinate, else it displays the correct page with the * matched line in the middle and returns the new y value; */ int find_y(match_line) LINE *match_line; { register LINE *line; register int count = 0; /* Check if match_line is on the same page as currently displayed. */ for (line = top_line; line != match_line && line != bot_line->next; line = line->next) count++; if (line != bot_line->next) return count; /* Display new page, with match_line in center. */ if ((line = proceed(match_line, -(screenmax >> 1))) == header) { /* Can't display in the middle. Make first line of file top_line */ count = 0; for (line = header->next; line != match_line; line = line->next) count++; line = header->next; } else /* New page is displayed. Set cursor to middle of page */ count = screenmax >> 1; /* Reset pointers and redraw the screen */ reset(line, 0); RD(); return count; } /* Opcodes for characters */ #define NORMAL 0x0200 #define DOT 0x0400 #define EOLN 0x0800 #define STAR 0x1000 #define BRACKET 0x2000 #define NEGATE 0x0100 #define DONE 0x4000 /* Mask for opcodes and characters */ #define LOW_BYTE 0x00FF #define HIGH_BYTE 0xFF00 /* Previous is the contents of the previous address (ptr) points to */ #define previous(ptr) (*((ptr) - 1)) /* Buffer to store outcome of compilation */ int exp_buffer[BLOCK_SIZE]; /* Errors often used */ char *too_long = "Regular expression too long"; /* * Reg_error() is called by compile() is something went wrong. It set the * status of the structure to error, and assigns the error field of the union. */ #define reg_error(str) program->status = REG_ERROR, \ program->result.err_mess = (str) /* * Finished() is called when everything went right during compilation. It * allocates space for the expression, and copies the expression buffer into * this field. */ void finished(program, last_exp) register REGEX *program; int *last_exp; { register int length = (last_exp - exp_buffer) * sizeof(int); /* Allocate space */ program->result.expression = (int *) alloc(length); /* Copy expression. (expression consists of ints!) */ bcopy(exp_buffer, program->result.expression, length); } /* * Compile compiles the pattern into a more comprehensible form and returns a * REGEX structure. If something went wrong, the status field of the structure * is set to REG_ERROR and an error message is set into the err_mess field of * the union. If all went well the expression is saved and the expression * pointer is set to the saved (and compiled) expression. */ void compile(pattern, program) register char *pattern; /* Pointer to pattern */ REGEX *program; { register int *expression = exp_buffer; int *prev_char; /* Pointer to previous compiled atom */ int *acct_field; /* Pointer to last BRACKET start */ FLAG negate; /* Negate flag for BRACKET */ char low_char; /* Index for chars in BRACKET */ char c; /* Check for begin of line */ if (*pattern == '^') { program->status = BEGIN_LINE; pattern++; } else { program->status = 0; /* If the first character is a '*' we have to assign it here. */ if (*pattern == '*') { *expression++ = '*' + NORMAL; pattern++; } } for (; ;) { switch (c = *pattern++) { case '.' : *expression++ = DOT; break; case '$' : /* * Only means EOLN if it is the last char of the pattern */ if (*pattern == '\0') { *expression++ = EOLN | DONE; program->status |= END_LINE; finished(program, expression); return; } else *expression++ = NORMAL + '$'; break; case '\0' : *expression++ = DONE; finished(program, expression); return; case '\\' : /* If last char, it must! mean a normal '\' */ if (*pattern == '\0') *expression++ = NORMAL + '\\'; else *expression++ = NORMAL + *pattern++; break; case '*' : /* * If the previous expression was a [] find out the * begin of the list, and adjust the opcode. */ prev_char = expression - 1; if (*prev_char & BRACKET) *(expression - (*acct_field & LOW_BYTE))|= STAR; else *prev_char |= STAR; break; case '[' : /* * First field in expression gives information about * the list. * The opcode consists of BRACKET and if necessary * NEGATE to indicate that the list should be negated * and/or STAR to indicate a number of sequence of this * list. * The lower byte contains the length of the list. */ acct_field = expression++; if (*pattern == '^') { /* List must be negated */ pattern++; negate = TRUE; } else negate = FALSE; while (*pattern != ']') { if (*pattern == '\0') { reg_error("Missing ]"); return; } if (*pattern == '\\') pattern++; *expression++ = *pattern++; if (*pattern == '-') { /* Make list of chars */ low_char = previous(pattern); pattern++; /* Skip '-' */ if (low_char++ > *pattern) { reg_error("Bad range in [a-z]"); return; } /* Build list */ while (low_char <= *pattern) *expression++ = low_char++; pattern++; } if (expression >= &exp_buffer[BLOCK_SIZE]) { reg_error(too_long); return; } } pattern++; /* Skip ']' */ /* Assign length of list in acct field */ if ((*acct_field = (expression - acct_field)) == 1) { reg_error("Empty []"); return; } /* Assign negate and bracket field */ *acct_field |= BRACKET; if (negate == TRUE) *acct_field |= NEGATE; /* * Add BRACKET to opcode of last char in field because * a '*' may be following the list. */ previous(expression) |= BRACKET; break; default : *expression++ = c + NORMAL; } if (expression == &exp_buffer[BLOCK_SIZE]) { reg_error(too_long); return; } } /* NOTREACHED */ } /* * Match gets as argument the program, pointer to place in current line to * start from and the method to search for (either FORWARD or REVERSE). * Match() will look through the whole file until a match is found. * NIL_LINE is returned if no match could be found. */ LINE *match(program, string, method) REGEX *program; char *string; register FLAG method; { register LINE *line = cur_line; char old_char; /* For saving chars */ /* Corrupted program */ if (program->status == REG_ERROR) return NIL_LINE; /* Check part of text first */ if (!(program->status & BEGIN_LINE)) { if (method == FORWARD) { if (line_check(program, string + 1, method) == MATCH) return cur_line; /* Match found */ } else if (!(program->status & END_LINE)) { old_char = *string; /* Save char and */ *string = '\n'; /* Assign '\n' for line_check */ if (line_check(program, line->text, method) == MATCH) { *string = old_char; /* Restore char */ return cur_line; /* Found match */ } *string = old_char; /* No match, but restore char */ } } /* No match in last (or first) part of line. Check out rest of file */ do { line = (method == FORWARD) ? line->next : line->prev; if (line->text == NIL_PTR) /* Header/tail */ continue; if (line_check(program, line->text, method) == MATCH) return line; } while (line != cur_line && quit == FALSE); /* No match found. */ return NIL_LINE; } /* * Line_check() checks the line (or rather string) for a match. Method * indicates FORWARD or REVERSE search. It scans through the whole string * until a match is found, or the end of the string is reached. */ int line_check(program, string, method) register REGEX *program; char *string; FLAG method; { register char *textp = string; /* Assign start_ptr field. We might find a match right away! */ program->start_ptr = textp; /* If the match must be anchored, just check the string. */ if (program->status & BEGIN_LINE) return check_string(program, string, NIL_INT); if (method == REVERSE) { /* First move to the end of the string */ for (textp = string; *textp != '\n'; textp++) ; /* Start checking string until the begin of the string is met */ while (textp >= string) { program->start_ptr = textp; if (check_string(program, textp--, NIL_INT)) return MATCH; } } else { /* Move through the string until the end of is found */ while (quit == FALSE && *textp != '\0') { program->start_ptr = textp; if (check_string(program, textp, NIL_INT)) return MATCH; if (*textp == '\n') break; textp++; } } return NO_MATCH; } /* * Check() checks of a match can be found in the given string. Whenever a STAR * is found during matching, then the begin position of the string is marked * and the maximum number of matches is performed. Then the function star() * is called which starts to finish the match from this position of the string * (and expression). Check() return MATCH for a match, NO_MATCH is the string * couldn't be matched or REG_ERROR for an illegal opcode in expression. */ int check_string(program, string, expression) REGEX *program; register char *string; int *expression; { register int opcode; /* Holds opcode of next expr. atom */ char c; /* Char that must be matched */ char *mark; /* For marking position */ int star_fl; /* A star has been born */ if (expression == NIL_INT) expression = program->result.expression; /* Loop until end of string or end of expression */ while (quit == FALSE && !(*expression & DONE) && *string != '\0' && *string != '\n') { c = *expression & LOW_BYTE; /* Extract match char */ opcode = *expression & HIGH_BYTE; /* Extract opcode */ if (star_fl = (opcode & STAR)) { /* Check star occurrence */ opcode &= ~STAR; /* Strip opcode */ mark = string; /* Mark current position */ } expression++; /* Increment expr. */ switch (opcode) { case NORMAL : if (star_fl) while (*string++ == c) /* Skip all matches */ ; else if (*string++ != c) return NO_MATCH; break; case DOT : string++; if (star_fl) /* Skip to eoln */ while (*string != '\0' && *string++ != '\n') ; break; case NEGATE | BRACKET: case BRACKET : if (star_fl) while (in_list(expression, *string++, c, opcode) == MATCH) ; else if (in_list(expression, *string++, c, opcode) == NO_MATCH) return NO_MATCH; expression += c - 1; /* Add length of list */ break; default : panic("Corrupted program in check_string()"); } if (star_fl) return star(program, mark, string, expression); } if (*expression & DONE) { program->end_ptr = string; /* Match ends here */ /* * We might have found a match. The last thing to do is check * whether a '$' was given at the end of the expression, or * the match was found on a null string. (E.g. [a-z]* always * matches) unless a ^ or $ was included in the pattern. */ if ((*expression & EOLN) && *string != '\n' && *string != '\0') return NO_MATCH; if (string == program->start_ptr && !(program->status & BEGIN_LINE) && !(*expression & EOLN)) return NO_MATCH; return MATCH; } return NO_MATCH; } /* * Star() calls check_string() to find out the longest match possible. * It searches backwards until the (in check_string()) marked position * is reached, or a match is found. */ int star(program, end_position, string, expression) REGEX *program; register char *end_position; register char *string; int *expression; { do { string--; if (check_string(program, string, expression)) return MATCH; } while (string != end_position); return NO_MATCH; } /* * In_list() checks if the given character is in the list of []. If it is * it returns MATCH. if it isn't it returns NO_MATCH. These returns values * are reversed when the NEGATE field in the opcode is present. */ int in_list(list, c, list_length, opcode) register int *list; char c; register int list_length; int opcode; { if (c == '\0' || c == '\n') /* End of string, never matches */ return NO_MATCH; while (list_length-- > 1) { /* > 1, don't check acct_field */ if ((*list & LOW_BYTE) == c) return (opcode & NEGATE) ? NO_MATCH : MATCH; list++; } return (opcode & NEGATE) ? MATCH : NO_MATCH; } /* * Dummy_line() adds an empty line at the end of the file. This is sometimes * useful in combination with the EF and DN command in combination with the * Yank command set. */ void dummy_line() { (void) line_insert(tail->prev, "\n", 1); tail->prev->shift_count = DUMMY; if (last_y != screenmax) { last_y++; bot_line = bot_line->next; } } ���������������������������������������������������������������������������������������������������������� .�������������..������������ EXTERN.h������ INTERN.h������ Makefile������ common.h������ config.h������ inp.c��������� inp.h��������� patch.c������� patchlevel.h�� pch.c��������� pch.h��������� util.c�������� util.h�������� version.c����� version.h�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: EXTERN.h,v 2.0 86/09/17 15:35:37 lwall Exp $ * * $Log: EXTERN.h,v $ * Revision 2.0 86/09/17 15:35:37 lwall * Baseline for netwide release. * */ #undef EXT #define EXT extern #undef INIT #define INIT(x) #undef DOINIT ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: INTERN.h,v 2.0 86/09/17 15:35:58 lwall Exp $ * * $Log: INTERN.h,v $ * Revision 2.0 86/09/17 15:35:58 lwall * Baseline for netwide release. * */ #undef EXT #define EXT #undef INIT #define INIT(x) = x #define DOINIT �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for patch CFLAGS= -O -DVOIDSIG -wo -D_MINIX -D_POSIX_SOURCE -DSMALL OBJ = patch.o pch.o inp.o util.o version.o all: patch patch: $(OBJ) cc -i -o patch $(OBJ) install -S 32kw patch install: /usr/bin/patch /usr/bin/patch: patch install -cs -o bin patch $@ patch.o: config.h common.h patch.c inp.h pch.h util.h version.h pch.o: config.h common.h pch.c pch.h util.h inp.o: config.h common.h inp.c inp.h util.h util.o: config.h common.h util.c util.h version.o: config.h common.h version.c version.h patchlevel.h util.h clean: rm -f *.bak *.o *.s core patch �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: common.h,v 2.0.1.2 88/06/22 20:44:53 lwall Locked $ * * $Log: common.h,v $ * Revision 2.0.1.2 88/06/22 20:44:53 lwall * patch12: sprintf was declared wrong * * Revision 2.0.1.1 88/06/03 15:01:56 lwall * patch10: support for shorter extensions. * * Revision 2.0 86/09/17 15:36:39 lwall * Baseline for netwide release. * */ #define DEBUGGING #include "config.h" #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> /* shut lint up about the following when return value ignored */ #define Signal (void)signal #define Unlink (void)unlink #define Lseek (void)lseek #define Fseek (void)fseek #define Fstat (void)fstat #define Pclose (void)pclose #define Close (void)close #define Fclose (void)fclose #define Fflush (void)fflush #define Sprintf (void)sprintf #define Mktemp (void)mktemp #define Strcpy (void)strcpy #define Strcat (void)strcat #include <sys/types.h> #include <sys/stat.h> #include <assert.h> #include <ctype.h> #include <signal.h> #include <stdio.h> /* constants */ #define TRUE (1) #define FALSE (0) #define MAXHUNKSIZE 100000 /* is this enough lines? */ #define INITHUNKMAX 125 /* initial dynamic allocation size */ #define MAXLINELEN 1024 #define BUFFERSIZE 1024 #define SCCSPREFIX "s." #define GET "get -e %s" #define RCSSUFFIX ",v" #define CHECKOUT "co -l %s" #ifdef FLEXFILENAMES #define ORIGEXT ".orig" #define REJEXT ".rej" #else #define ORIGEXT "~" #define REJEXT "#" #endif /* handy definitions */ #define Null(t) ((t)0) #define Nullch Null(char *) #define Nullfp Null(FILE *) #define Nulline Null(LINENUM) #define Ctl(ch) ((ch) & 037) #define strNE(s1,s2) (strcmp(s1, s2)) #define strEQ(s1,s2) (!strcmp(s1, s2)) #define strnNE(s1,s2,l) (strncmp(s1, s2, l)) #define strnEQ(s1,s2,l) (!strncmp(s1, s2, l)) /* typedefs */ typedef int bool; typedef long LINENUM; /* must be signed */ typedef unsigned MEM; /* what to feed malloc */ /* globals */ EXT int Argc; /* guess */ EXT char **Argv; EXT int Argc_last; /* for restarting plan_b */ EXT char **Argv_last; EXT struct stat filestat; /* file statistics area */ EXT int filemode INIT(0644); EXT char buf[MAXLINELEN]; /* general purpose buffer */ EXT FILE *ofp INIT(Nullfp); /* output file pointer */ EXT FILE *rejfp INIT(Nullfp); /* reject file pointer */ EXT bool using_plan_a INIT(TRUE); /* try to keep everything in memory */ EXT bool out_of_mem INIT(FALSE); /* ran out of memory in plan a */ #define MAXFILEC 2 EXT int filec INIT(0); /* how many file arguments? */ EXT char *filearg[MAXFILEC]; EXT bool ok_to_create_file INIT(FALSE); EXT char *bestguess INIT(Nullch); /* guess at correct filename */ EXT char *outname INIT(Nullch); EXT char rejname[128]; EXT char *origext INIT(Nullch); EXT char *origprae INIT(Nullch); EXT char TMPOUTNAME[] INIT("/tmp/patchoXXXXXX"); EXT char TMPINNAME[] INIT("/tmp/patchiXXXXXX"); /* might want /usr/tmp here */ EXT char TMPREJNAME[] INIT("/tmp/patchrXXXXXX"); EXT char TMPPATNAME[] INIT("/tmp/patchpXXXXXX"); #ifdef SMALL EXT char TMPSTRNAME[] INIT("/tmp/patchsXXXXXX"); #endif EXT bool toutkeep INIT(FALSE); EXT bool trejkeep INIT(FALSE); EXT LINENUM last_offset INIT(0); #ifdef DEBUGGING EXT int debug INIT(0); #endif EXT LINENUM maxfuzz INIT(2); EXT bool force INIT(FALSE); EXT bool verbose INIT(TRUE); EXT bool reverse INIT(FALSE); EXT bool noreverse INIT(FALSE); EXT bool skip_rest_of_patch INIT(FALSE); EXT int strippath INIT(957); EXT bool canonicalize INIT(FALSE); #define CONTEXT_DIFF 1 #define NORMAL_DIFF 2 #define ED_DIFF 3 #define NEW_CONTEXT_DIFF 4 EXT int diff_type INIT(0); EXT bool do_defines INIT(FALSE); /* patch using ifdef, ifndef, etc. */ EXT char if_defined[128]; /* #ifdef xyzzy */ EXT char not_defined[128]; /* #ifndef xyzzy */ EXT char else_defined[] INIT("#else\n");/* #else */ EXT char end_defined[128]; /* #endif xyzzy */ EXT char *revision INIT(Nullch); /* prerequisite revision, if any */ _PROTOTYPE(void my_exit , (int status )); ���������������������������������������������������������������������������/* config.h * This file was produced by running the Configure script. * Feel free to modify any of this as the need arises. */ /* How many register declarations are paid attention to? */ #define Reg1 register #define Reg2 register #define Reg3 #define Reg4 #define Reg5 #define Reg6 #define Reg7 #define Reg8 #define Reg9 #define Reg10 #define Reg11 #define Reg12 #define Reg13 #define Reg14 #define Reg15 #define Reg16 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: inp.c,v 2.0.1.1 88/06/03 15:06:13 lwall Locked $ * * $Log: inp.c,v $ * Revision 2.0.1.1 88/06/03 15:06:13 lwall * patch10: made a little smarter about sccs files * * Revision 2.0 86/09/17 15:37:02 lwall * Baseline for netwide release. * */ #include "EXTERN.h" #include "common.h" #include "util.h" #include "pch.h" #include "INTERN.h" #include "inp.h" /* Input-file-with-indexable-lines abstract type */ static long i_size; /* size of the input file */ static char *i_womp; /* plan a buffer for entire file */ static char **i_ptr; /* pointers to lines in i_womp */ static int tifd = -1; /* plan b virtual string array */ static char *tibuf[2]; /* plan b buffers */ static LINENUM tiline[2] = {-1, -1}; /* 1st line in each buffer */ static LINENUM lines_per_buf; /* how many lines per buffer */ static int tireclen; /* length of records in tmp file */ /* New patch--prepare to edit another file. */ void re_input() { if (using_plan_a) { i_size = 0; #ifndef lint if (i_ptr != Null(char**)) free((char *)i_ptr); #endif if (i_womp != Nullch) free(i_womp); i_womp = Nullch; i_ptr = Null(char **); } else { #ifndef SMALL using_plan_a = TRUE; /* maybe the next one is smaller */ #endif Close(tifd); tifd = -1; free(tibuf[0]); free(tibuf[1]); tibuf[0] = tibuf[1] = Nullch; tiline[0] = tiline[1] = -1; tireclen = 0; } } /* Constuct the line index, somehow or other. */ void scan_input(filename) char *filename; { #ifndef SMALL if (!plan_a(filename)) #endif plan_b(filename); if (verbose) { say3("Patching file %s using Plan %s...\n", filename, (using_plan_a ? "A" : "B") ); } } #ifndef SMALL /* Try keeping everything in memory. */ bool plan_a(filename) char *filename; { int ifd; Reg1 char *s; Reg2 LINENUM iline; if (ok_to_create_file && stat(filename, &filestat) < 0) { if (verbose) say2("(Creating file %s...)\n",filename); makedirs(filename, TRUE); close(creat(filename, 0666)); } if (stat(filename, &filestat) < 0) { Sprintf(buf, "RCS/%s%s", filename, RCSSUFFIX); if (stat(buf, &filestat) >= 0 || stat(buf+4, &filestat) >= 0) { Sprintf(buf, CHECKOUT, filename); if (verbose) say2("Can't find %s--attempting to check it out from RCS.\n", filename); if (system(buf) || stat(filename, &filestat)) fatal2("Can't check out %s.\n", filename); } else { Sprintf(buf+20, "SCCS/%s%s", SCCSPREFIX, filename); if (stat(s=buf+20, &filestat) >= 0 || stat(s=buf+25, &filestat) >= 0) { Sprintf(buf, GET, s); if (verbose) say2("Can't find %s--attempting to get it from SCCS.\n", filename); if (system(buf) || stat(filename, &filestat)) fatal2("Can't get %s.\n", filename); } else fatal2("Can't find %s.\n", filename); } } filemode = filestat.st_mode; if ((filemode & S_IFMT) & ~S_IFREG) fatal2("%s is not a normal file--can't patch.\n", filename); i_size = filestat.st_size; if (out_of_mem) { set_hunkmax(); /* make sure dynamic arrays are allocated */ out_of_mem = FALSE; return FALSE; /* force plan b because plan a bombed */ } #ifdef lint i_womp = Nullch; #else i_womp = malloc((MEM)(i_size+2)); /* lint says this may alloc less than */ /* i_size, but that's okay, I think. */ #endif if (i_womp == Nullch) return FALSE; if ((ifd = open(filename, 0)) < 0) fatal2("Can't open file %s\n", filename); #ifndef lint if (read(ifd, i_womp, (int)i_size) != i_size) { Close(ifd); /* probably means i_size > 15 or 16 bits worth */ free(i_womp); /* at this point it doesn't matter if i_womp was */ return FALSE; /* undersized. */ } #endif Close(ifd); if (i_size && i_womp[i_size-1] != '\n') i_womp[i_size++] = '\n'; i_womp[i_size] = '\0'; /* count the lines in the buffer so we know how many pointers we need */ iline = 0; for (s=i_womp; *s; s++) { if (*s == '\n') iline++; } #ifdef lint i_ptr = Null(char**); #else i_ptr = (char **)malloc((MEM)((iline + 2) * sizeof(char *))); #endif if (i_ptr == Null(char **)) { /* shucks, it was a near thing */ free((char *)i_womp); return FALSE; } /* now scan the buffer and build pointer array */ iline = 1; i_ptr[iline] = i_womp; for (s=i_womp; *s; s++) { if (*s == '\n') i_ptr[++iline] = s+1; /* these are NOT null terminated */ } input_lines = iline - 1; /* now check for revision, if any */ if (revision != Nullch) { if (!rev_in_string(i_womp)) { if (force) { if (verbose) say2( "Warning: this file doesn't appear to be the %s version--patching anyway.\n", revision); } else { ask2( "This file doesn't appear to be the %s version--patch anyway? [n] ", revision); if (*buf != 'y') fatal1("Aborted.\n"); } } else if (verbose) say2("Good. This file appears to be the %s version.\n", revision); } return TRUE; /* plan a will work */ } #endif /* Keep (virtually) nothing in memory. */ void plan_b(filename) char *filename; { Reg3 FILE *ifp; Reg1 int i = 0; Reg2 int maxlen = 1; Reg4 bool found_revision = (revision == Nullch); using_plan_a = FALSE; if ((ifp = fopen(filename, "r")) == Nullfp) fatal2("Can't open file %s\n", filename); if ((tifd = creat(TMPINNAME, 0666)) < 0) fatal2("Can't open file %s\n", TMPINNAME); while (fgets(buf, sizeof buf, ifp) != Nullch) { if (revision != Nullch && !found_revision && rev_in_string(buf)) found_revision = TRUE; if ((i = strlen(buf)) > maxlen) maxlen = i; /* find longest line */ } if (revision != Nullch) { if (!found_revision) { if (force) { if (verbose) say2( "Warning: this file doesn't appear to be the %s version--patching anyway.\n", revision); } else { ask2( "This file doesn't appear to be the %s version--patch anyway? [n] ", revision); if (*buf != 'y') fatal1("Aborted.\n"); } } else if (verbose) say2("Good. This file appears to be the %s version.\n", revision); } Fseek(ifp, 0L, 0); /* rewind file */ lines_per_buf = BUFFERSIZE / maxlen; tireclen = maxlen; tibuf[0] = (char *)malloc((MEM)(BUFFERSIZE + 1)); tibuf[1] = (char *)malloc((MEM)(BUFFERSIZE + 1)); if (tibuf[1] == Nullch) fatal1("Can't seem to get enough memory.\n"); for (i=1; ; i++) { if (! (i % lines_per_buf)) /* new block */ if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) fatal1("patch: can't write temp file.\n"); if (fgets(tibuf[0] + maxlen * (i%lines_per_buf), maxlen + 1, ifp) == Nullch) { input_lines = i - 1; if (i % lines_per_buf) if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) fatal1("patch: can't write temp file.\n"); break; } } Fclose(ifp); Close(tifd); if ((tifd = open(TMPINNAME, 0)) < 0) { fatal2("Can't reopen file %s\n", TMPINNAME); } } /* Fetch a line from the input file, \n terminated, not necessarily \0. */ char * ifetch(line,whichbuf) Reg1 LINENUM line; int whichbuf; /* ignored when file in memory */ { if (line < 1 || line > input_lines) return ""; if (using_plan_a) return i_ptr[line]; else { LINENUM offline = line % lines_per_buf; LINENUM baseline = line - offline; if (tiline[0] == baseline) whichbuf = 0; else if (tiline[1] == baseline) whichbuf = 1; else { tiline[whichbuf] = baseline; #ifndef lint /* complains of long accuracy */ Lseek(tifd, (long)baseline / lines_per_buf * BUFFERSIZE, 0); #endif if (read(tifd, tibuf[whichbuf], BUFFERSIZE) < 0) fatal2("Error reading tmp file %s.\n", TMPINNAME); } return tibuf[whichbuf] + (tireclen*offline); } } /* True if the string argument contains the revision number we want. */ bool rev_in_string(string) char *string; { Reg1 char *s; Reg2 int patlen; if (revision == Nullch) return TRUE; patlen = strlen(revision); if (strnEQ(string,revision,patlen) && isspace(s[patlen])) return TRUE; for (s = string; *s; s++) { if (isspace(*s) && strnEQ(s+1, revision, patlen) && isspace(s[patlen+1] )) { return TRUE; } } K��K���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� return FALSE; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: inp.h,v 2.0 86/09/17 15:37:25 lwall Exp $ * * $Log: inp.h,v $ * Revision 2.0 86/09/17 15:37:25 lwall * Baseline for netwide release. * */ EXT LINENUM input_lines INIT(0); /* how long is input file in lines */ EXT LINENUM last_frozen_line INIT(0); /* how many input lines have been */ /* irretractibly output */ _PROTOTYPE(bool rev_in_string , (char *string )); _PROTOTYPE(void scan_input , (char *filename )); _PROTOTYPE(bool plan_a , (char *filename )); _PROTOTYPE(void plan_b , (char *filename )); _PROTOTYPE(char *ifetch , (Reg1 LINENUM line , int whichbuf )); _PROTOTYPE(void re_input , (void)); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������char rcsid[] = "$Header: patch.c,v 2.0.1.6 88/06/22 20:46:39 lwall Locked $"; /* patch - a program to apply diffs to original files * * Copyright 1986, Larry Wall * * This program may be copied as long as you don't try to make any * money off of it, or pretend that you wrote it. * * $Log: patch.c,v $ * Revision 2.0.1.6 88/06/22 20:46:39 lwall * patch12: rindex() wasn't declared * * Revision 2.0.1.5 88/06/03 15:09:37 lwall * patch10: exit code improved. * patch10: better support for non-flexfilenames. * * Revision 2.0.1.4 87/02/16 14:00:04 lwall * Short replacement caused spurious "Out of sync" message. * * Revision 2.0.1.3 87/01/30 22:45:50 lwall * Improved diagnostic on sync error. * Moved do_ed_script() to pch.c. * * Revision 2.0.1.2 86/11/21 09:39:15 lwall * Fuzz factor caused offset of installed lines. * * Revision 2.0.1.1 86/10/29 13:10:22 lwall * Backwards search could terminate prematurely. * * Revision 2.0 86/09/17 15:37:32 lwall * Baseline for netwide release. * * Revision 1.5 86/08/01 20:53:24 lwall * Changed some %d's to %ld's. * Linted. * * Revision 1.4 86/08/01 19:17:29 lwall * Fixes for machines that can't vararg. * Added fuzz factor. * Generalized -p. * General cleanup. * * 85/08/15 van%ucbmonet@berkeley * Changes for 4.3bsd diff -c. * * Revision 1.3 85/03/26 15:07:43 lwall * Frozen. * * Revision 1.2.1.9 85/03/12 17:03:35 lwall * Changed pfp->_file to fileno(pfp). * * Revision 1.2.1.8 85/03/12 16:30:43 lwall * Check i_ptr and i_womp to make sure they aren't null before freeing. * Also allow ed output to be suppressed. * * Revision 1.2.1.7 85/03/12 15:56:13 lwall * Added -p option from jromine@uci-750a. * * Revision 1.2.1.6 85/03/12 12:12:51 lwall * Now checks for normalness of file to patch. * * Revision 1.2.1.5 85/03/12 11:52:12 lwall * Added -D (#ifdef) option from joe@fluke. * * Revision 1.2.1.4 84/12/06 11:14:15 lwall * Made smarter about SCCS subdirectories. * * Revision 1.2.1.3 84/12/05 11:18:43 lwall * Added -l switch to do loose string comparison. * * Revision 1.2.1.2 84/12/04 09:47:13 lwall * Failed hunk count not reset on multiple patch file. * * Revision 1.2.1.1 84/12/04 09:42:37 lwall * Branch for sdcrdcf changes. * * Revision 1.2 84/11/29 13:29:51 lwall * Linted. Identifiers uniqified. Fixed i_ptr malloc() bug. Fixed * multiple calls to mktemp(). Will now work on machines that can only * read 32767 chars. Added -R option for diffs with new and old swapped. * Various cosmetic changes. * * Revision 1.1 84/11/09 17:03:58 lwall * Initial revision * */ /* * 1992-01-15 * Modified by Saeko & Kouichi Hirabayashi to fit small memory (64K+64K) * system by adding "#if[n]def SMALL" parts. */ #include "INTERN.h" #include "common.h" #include "EXTERN.h" #include "version.h" #include "util.h" #include "pch.h" #include "inp.h" /* procedures */ _PROTOTYPE(int main , (int argc , char **argv )); _PROTOTYPE(void reinitialize_almost_everything , (void)); _PROTOTYPE(void get_some_switches , (void)); _PROTOTYPE(LINENUM locate_hunk , (LINENUM fuzz )); _PROTOTYPE(void abort_hunk , (void)); _PROTOTYPE(void apply_hunk , (LINENUM where )); _PROTOTYPE(void init_output , (char *name )); _PROTOTYPE(void init_reject , (char *name )); _PROTOTYPE(void copy_till , (Reg1 LINENUM lastline )); _PROTOTYPE(void spew_output , (void)); _PROTOTYPE(void dump_line , (LINENUM line )); _PROTOTYPE(bool patch_match , (LINENUM base , LINENUM offset , LINENUM fuzz )); _PROTOTYPE(bool similar , (Reg1 char *a , Reg2 char *b , Reg3 int len )); /* Apply a set of diffs as appropriate. */ int main(argc,argv) int argc; char **argv; { LINENUM where; LINENUM newwhere; LINENUM fuzz; LINENUM mymaxfuzz; int hunk = 0; int failed = 0; int failtotal = 0; int i; setbuf(stderr, serrbuf); for (i = 0; i<MAXFILEC; i++) filearg[i] = Nullch; Mktemp(TMPOUTNAME); Mktemp(TMPINNAME); Mktemp(TMPREJNAME); Mktemp(TMPPATNAME); #ifdef SMALL Mktemp(TMPSTRNAME); #endif /* parse switches */ Argc = argc; Argv = argv; get_some_switches(); /* make sure we clean up /tmp in case of disaster */ set_signals(0); for ( open_patch_file(filearg[1]); there_is_another_patch(); reinitialize_almost_everything() ) { /* for each patch in patch file */ if (outname == Nullch) outname = savestr(filearg[0]); /* initialize the patched file */ if (!skip_rest_of_patch) init_output(TMPOUTNAME); /* for ed script just up and do it and exit */ if (diff_type == ED_DIFF) { do_ed_script(); continue; } /* initialize reject file */ init_reject(TMPREJNAME); /* find out where all the lines are */ if (!skip_rest_of_patch) scan_input(filearg[0]); /* from here on, open no standard i/o files, because malloc */ /* might misfire and we can't catch it easily */ /* apply each hunk of patch */ hunk = 0; failed = 0; out_of_mem = FALSE; while (another_hunk()) { hunk++; fuzz = Nulline; mymaxfuzz = pch_context(); if (maxfuzz < mymaxfuzz) mymaxfuzz = maxfuzz; if (!skip_rest_of_patch) { do { where = locate_hunk(fuzz); if (hunk == 1 && where == Nulline && !force) { /* dwim for reversed patch? */ if (!pch_swap()) { if (fuzz == Nulline) say1( "Not enough memory to try swapped hunk! Assuming unswapped.\n"); continue; } reverse = !reverse; where = locate_hunk(fuzz); /* try again */ if (where == Nulline) { /* didn't find it swapped */ if (!pch_swap()) /* put it back to normal */ fatal1("Lost hunk on alloc error!\n"); reverse = !reverse; } else if (noreverse) { if (!pch_swap()) /* put it back to normal */ fatal1("Lost hunk on alloc error!\n"); reverse = !reverse; say1( "Ignoring previously applied (or reversed) patch.\n"); skip_rest_of_patch = TRUE; } else { ask3( "%seversed (or previously applied) patch detected! %s -R? [y] ", reverse ? "R" : "Unr", reverse ? "Assume" : "Ignore"); if (*buf == 'n') { ask1("Apply anyway? [n] "); if (*buf != 'y') skip_rest_of_patch = TRUE; where = Nulline; reverse = !reverse; if (!pch_swap()) /* put it back to normal */ fatal1("Lost hunk on alloc error!\n"); } } } } while (!skip_rest_of_patch && where == Nulline && ++fuzz <= mymaxfuzz); if (skip_rest_of_patch) { /* just got decided */ Fclose(ofp); ofp = Nullfp; } } newwhere = pch_newfirst() + last_offset; if (skip_rest_of_patch) { abort_hunk(); failed++; if (verbose) say3("Hunk #%d ignored at %ld.\n", hunk, newwhere); } else if (where == Nulline) { abort_hunk(); failed++; if (verbose) say3("Hunk #%d failed at %ld.\n", hunk, newwhere); } else { apply_hunk(where); if (verbose) { say3("Hunk #%d succeeded at %ld", hunk, newwhere); if (fuzz) say2(" with fuzz %ld", fuzz); if (last_offset) say3(" (offset %ld line%s)", last_offset, last_offset==1L?"":"s"); say1(".\n"); } } } if (out_of_mem && using_plan_a) { Argc = Argc_last; Argv = Argv_last; say1("\n\nRan out of memory using Plan A--trying again...\n\n"); continue; } assert(hunk); /* finish spewing out the new file */ if (!skip_rest_of_patch) spew_output(); /* and put the output where desired */ ignore_signals(); if (!skip_rest_of_patch) { if (move_file(TMPOUTNAME, outname) < 0) { toutkeep = TRUE; chmod(TMPOUTNAME, filemode); } else chmod(outname, filemode); } Fclose(rejfp); rejfp = Nullfp; if (failed) { failtotal += failed; if (!*rejname) { Strcpy(rejname, outname); #ifndef FLEXFILENAMES { char *s = rindex(rejname,'/'); if (!s) s = rejname; if (strlen(s) > 13) if (s[12] == '.') /* try to preserve difference */ s[12] = s[13]; /* between .h, .c, .y, etc. */ s[13] = '\0'; } #endifK��K��K��K��K��K��K��K��K��K��K��K��K�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Strcat(rejname, REJEXT); } if (skip_rest_of_patch) { say4("%d out of %d hunks ignored--saving rejects to %s\n", failed, hunk, rejname); } else { say4("%d out of %d hunks failed--saving rejects to %s\n", failed, hunk, rejname); } if (move_file(TMPREJNAME, rejname) < 0) trejkeep = TRUE; } set_signals(1); } #ifdef SMALL if (sfp != Nullfp) Fclose(sfp); #endif my_exit(failtotal); } /* Prepare to find the next patch to do in the patch file. */ void reinitialize_almost_everything() { re_patch(); re_input(); input_lines = 0; last_frozen_line = 0; filec = 0; if (filearg[0] != Nullch && !out_of_mem) { free(filearg[0]); filearg[0] = Nullch; } if (outname != Nullch) { free(outname); outname = Nullch; } last_offset = 0; diff_type = 0; if (revision != Nullch) { free(revision); revision = Nullch; } reverse = FALSE; skip_rest_of_patch = FALSE; get_some_switches(); if (filec >= 2) fatal1("You may not change to a different patch file.\n"); } /* Process switches and filenames up to next '+' or end of list. */ void get_some_switches() { Reg1 char *s; rejname[0] = '\0'; Argc_last = Argc; Argv_last = Argv; if (!Argc) return; for (Argc--,Argv++; Argc; Argc--,Argv++) { s = Argv[0]; if (strEQ(s, "+")) { return; /* + will be skipped by for loop */ } if (*s != '-' || !s[1]) { if (filec == MAXFILEC) fatal1("Too many file arguments.\n"); filearg[filec++] = savestr(s); } else { switch (*++s) { case 'b': origext = savestr(Argv[1]); Argc--,Argv++; break; case 'B': origprae = savestr(Argv[1]); Argc--,Argv++; break; case 'c': diff_type = CONTEXT_DIFF; break; case 'd': if (!*++s) { Argc--,Argv++; s = Argv[0]; } if (chdir(s) < 0) fatal2("Can't cd to %s.\n", s); break; case 'D': do_defines = TRUE; if (!*++s) { Argc--,Argv++; s = Argv[0]; } if (!isalpha(*s)) fatal1("Argument to -D not an identifier.\n"); Sprintf(if_defined, "#ifdef %s\n", s); Sprintf(not_defined, "#ifndef %s\n", s); Sprintf(end_defined, "#endif /* %s */\n", s); break; case 'e': diff_type = ED_DIFF; break; case 'f': force = TRUE; break; case 'F': if (*++s == '=') s++; maxfuzz = atoi(s); break; case 'l': canonicalize = TRUE; break; case 'n': diff_type = NORMAL_DIFF; break; case 'N': noreverse = TRUE; break; case 'o': outname = savestr(Argv[1]); Argc--,Argv++; break; case 'p': if (*++s == '=') s++; strippath = atoi(s); break; case 'r': Strcpy(rejname, Argv[1]); Argc--,Argv++; break; case 'R': reverse = TRUE; break; case 's': verbose = FALSE; break; case 'S': skip_rest_of_patch = TRUE; break; case 'v': version(); break; #ifdef DEBUGGING case 'x': debug = atoi(s+1); break; #endif default: fatal2("Unrecognized switch: %s\n", Argv[0]); } } } } /* Attempt to find the right place to apply this hunk of patch. */ LINENUM locate_hunk(fuzz) LINENUM fuzz; { Reg1 LINENUM first_guess = pch_first() + last_offset; Reg2 LINENUM offset; LINENUM pat_lines = pch_ptrn_lines(); Reg3 LINENUM max_pos_offset = input_lines - first_guess - pat_lines + 1; Reg4 LINENUM max_neg_offset = first_guess - last_frozen_line - 1 + pch_context(); if (!pat_lines) /* null range matches always */ return first_guess; if (max_neg_offset >= first_guess) /* do not try lines < 0 */ max_neg_offset = first_guess - 1; if (first_guess <= input_lines && patch_match(first_guess, Nulline, fuzz)) return first_guess; for (offset = 1; ; offset++) { Reg5 bool check_after = (offset <= max_pos_offset); Reg6 bool check_before = (offset <= max_neg_offset); if (check_after && patch_match(first_guess, offset, fuzz)) { #ifdef DEBUGGING if (debug & 1) say3("Offset changing from %ld to %ld\n", last_offset, offset); #endif last_offset = offset; return first_guess+offset; } else if (check_before && patch_match(first_guess, -offset, fuzz)) { #ifdef DEBUGGING if (debug & 1) say3("Offset changing from %ld to %ld\n", last_offset, -offset); #endif last_offset = -offset; return first_guess-offset; } else if (!check_before && !check_after) return Nulline; } } /* We did not find the pattern, dump out the hunk so they can handle it. */ void abort_hunk() { Reg1 LINENUM i; Reg2 LINENUM pat_end = pch_end(); /* add in last_offset to guess the same as the previous successful hunk */ LINENUM oldfirst = pch_first() + last_offset; LINENUM newfirst = pch_newfirst() + last_offset; LINENUM oldlast = oldfirst + pch_ptrn_lines() - 1; LINENUM newlast = newfirst + pch_repl_lines() - 1; char *stars = (diff_type == NEW_CONTEXT_DIFF ? " ****" : ""); char *minuses = (diff_type == NEW_CONTEXT_DIFF ? " ----" : " -----"); fprintf(rejfp, "***************\n"); for (i=0; i<=pat_end; i++) { switch (pch_char(i)) { case '*': if (oldlast < oldfirst) fprintf(rejfp, "*** 0%s\n", stars); else if (oldlast == oldfirst) fprintf(rejfp, "*** %ld%s\n", oldfirst, stars); else fprintf(rejfp, "*** %ld,%ld%s\n", oldfirst, oldlast, stars); break; case '=': if (newlast < newfirst) fprintf(rejfp, "--- 0%s\n", minuses); else if (newlast == newfirst) fprintf(rejfp, "--- %ld%s\n", newfirst, minuses); else fprintf(rejfp, "--- %ld,%ld%s\n", newfirst, newlast, minuses); break; case '\n': fprintf(rejfp, "%s", pfetch(i)); break; case ' ': case '-': case '+': case '!': fprintf(rejfp, "%c %s", pch_char(i), pfetch(i)); break; default: say1("Fatal internal error in abort_hunk().\n"); abort(); } } } /* We found where to apply it (we hope), so do it. */ void apply_hunk(where) LINENUM where; { Reg1 LINENUM old = 1; Reg2 LINENUM lastline = pch_ptrn_lines(); Reg3 LINENUM new = lastline+1; #define OUTSIDE 0 #define IN_IFNDEF 1 #define IN_IFDEF 2 #define IN_ELSE 3 Reg4 int def_state = OUTSIDE; Reg5 bool R_do_defines = do_defines; Reg6 LINENUM pat_end = pch_end(); where--; while (pch_char(new) == '=' || pch_char(new) == '\n') new++; while (old <= lastline) { if (pch_char(old) == '-') { copy_till(where + old - 1); if (R_do_defines) { if (def_state == OUTSIDE) { fputs(not_defined, ofp); def_state = IN_IFNDEF; } else if (def_state == IN_IFDEF) { fputs(else_defined, ofp); def_state = IN_ELSE; } fputs(pfetch(old), ofp); } last_frozen_line++; old++; } else if (new > pat_end) break; else if (pch_char(new) == '+') { copy_till(where + old - 1); if (R_do_defines) { if (def_state == IN_IFNDEF) { fputs(else_defined, ofp); def_state = IN_ELSE; } else if (def_state == OUTSIDE) { fputs(if_defined, ofp); def_state = IN_IFDEF; } } fputs(pfetch(new), ofp); new++; } else { if (pch_char(new) != pch_char(old)) { say3("Out-of-sync patch, lines %ld,%ld--mangled text or line numbers, maybe?\n", pch_hunk_beg() + old, pch_hunk_beg() + new); #ifdef DEBUGGING say3("oldchar = '%c', newchar = '%c'\n", pch_char(old), pch_char(new)); #endif my_exit(1); } if (pch_char(new) == '!') { copy_till(where + old - 1); if (R_do_defines) { fputs(not_defined, ofp); def_state = IN_IFNDEF; } while (pch_char(old) == '!') { if (R_do_defines) { fputs(pfetch(old), ofp); } last_frozen_line++; old++; } if (R_do_defines) { fputs(else_defined, ofp); def_state = IN_ELSE; } while (pch_char(new) == '!') { fputs(pfetch(new), ofp); new++; } if (R_do_defines) { fputs(end_defined, ofp); def_state = OUTSIDE; } } else { assert(pch_char(new) == ' '); old++; new++; } } } if (new <= pat_end && pch_char(new) == '+') { copy_till(where + old - 1); if (R_do_defines) { if (def_state == OUTSIDE) { fputs(if_defined, ofp); def_state = IN_IFDEF; } else if (def_state == IN_IFNDEF) { fputs(else_defined, ofp); def_state = IN_ELSE; } } while (new <= pat_end && pch_char(new) == '+') { fputs(pfetch(new), ofp); new++; } } if (R_do_defines && def_state != OUTSIDE) { fputs(end_defined, ofp); } } /* Open the new file. */ void init_output(name) char *name; { ofp = fopen(name, "w"); if (ofp == Nullfp) fatal2("patch: can't create %s.\n", name); } /* Open a file to put hunks we can't locate. */ void init_reject(name) char *name; { rejfp = fopen(name, "w"); if (rejfp == Nullfp) fatal2("patch: can't create %s.\n", name); } /* Copy input file to output, up to wherever hunk is to be applied. */ void copy_till(lastline) Reg1 LINENUM lastline; { Reg2 LINENUM R_last_frozen_line = last_frozen_line; if (R_last_frozen_line > lastline) say1("patch: misordered hunks! output will be garbled.\n"); while (R_last_frozen_line < lastline) { dump_line(++R_last_frozen_line); } last_frozen_line = R_last_frozen_line; } /* Finish copying the input file to the output file. */ void spew_output() { #ifdef DEBUGGING if (debug & 256) say3("il=%ld lfl=%ld\n",input_lines,last_frozen_line); #endif if (input_lines) copy_till(input_lines); /* dump remainder of file */ Fclose(ofp); ofp = Nullfp; } /* Copy one line from input to output. */ void dump_line(line) LINENUM line; { Reg1 char *s; Reg2 char R_newline = '\n'; /* Note: string is not null terminated. */ for (s=ifetch(line, 0); putc(*s, ofp) != R_newline; s++) ; } /* Does the patch pattern match at line base+offset? */ bool patch_match(base, offset, fuzz) LINENUM base; LINENUM offset; LINENUM fuzz; { Reg1 LINENUM pline = 1 + fuzz; Reg2 LINENUM iline; Reg3 LINENUM pat_lines = pch_ptrn_lines() - fuzz; for (iline=base+offset+fuzz; pline <= pat_lines; pline++,iline++) { if (canonicalize) { if (!similar(ifetch(iline, (offset >= 0)), pfetch(pline), pch_line_len(pline) )) return FALSE; } else if (strnNE(ifetch(iline, (offset >= 0)), pfetch(pline), pch_line_len(pline) )) return FALSE; } return TRUE; } /* Do two lines match with canonicalized white space? */ bool similar(a,b,len) Reg1 char *a; Reg2 char *b; Reg3 int len; { while (len) { if (isspace(*b)) { /* whitespace (or \n) to match? */ if (!isspace(*a)) /* no corresponding whitespace? */ return FALSE; while (len && isspace(*b) && *b != '\n') b++,len--; /* skip pattern whitespace */ while (isspace(*a) && *a != '\n') a++; /* skip target whitespace */ if (*a == '\n' || *b == '\n') return (*a == *b); /* should end in sync */ } else if (*a++ != *b++) /* match non-whitespace chars */ return FALSE; else len--; /* probably not necessary */ } return TRUE; /* actually, this is not reached */ /* since there is always a \n */ } /* Exit with cleanup. */ void my_exit(status) int status; { Unlink(TMPINNAME); if (!toutkeep) { Unlink(TMPOUTNAME); } if (!trejkeep) { Unlink(TMPREJNAME); } Unlink(TMPPATNAME); #ifdef SMALL Unlink(TMPSTRNAME); #endif exit(status); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define PATCHLEVEL 12 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: pch.c,v 2.0.1.7 88/06/03 15:13:28 lwall Locked $ * * $Log: pch.c,v $ * Revision 2.0.1.7 88/06/03 15:13:28 lwall * patch10: Can now find patches in shar scripts. * patch10: Hunks that swapped and then swapped back could core dump. * * Revision 2.0.1.6 87/06/04 16:18:13 lwall * pch_swap didn't swap p_bfake and p_efake. * * Revision 2.0.1.5 87/01/30 22:47:42 lwall * Improved responses to mangled patches. * * Revision 2.0.1.4 87/01/05 16:59:53 lwall * New-style context diffs caused double call to free(). * * Revision 2.0.1.3 86/11/14 10:08:33 lwall * Fixed problem where a long pattern wouldn't grow the hunk. * Also restored p_input_line when backtracking so error messages are right. * * Revision 2.0.1.2 86/11/03 17:49:52 lwall * New-style delete triggers spurious assertion error. * * Revision 2.0.1.1 86/10/29 15:52:08 lwall * Could falsely report new-style context diff. * * Revision 2.0 86/09/17 15:39:37 lwall * Baseline for netwide release. * */ #include "EXTERN.h" #include "common.h" #include "util.h" #include "INTERN.h" #include "pch.h" /* Patch (diff listing) abstract type. */ static long p_filesize; /* size of the patch file */ static LINENUM p_first; /* 1st line number */ static LINENUM p_newfirst; /* 1st line number of replacement */ static LINENUM p_ptrn_lines; /* # lines in pattern */ static LINENUM p_repl_lines; /* # lines in replacement text */ static LINENUM p_end = -1; /* last line in hunk */ static LINENUM p_max; /* max allowed value of p_end */ static LINENUM p_context = 3; /* # of context lines */ static LINENUM p_input_line = 0; /* current line # from patch file */ #ifdef SMALL static long *p_line = Null(long *); /* the text of the hunk */ #else static char **p_line = Null(char**); /* the text of the hunk */ #endif static short *p_len = Null(short*); /* length of each line */ static char *p_char = Nullch; /* +, -, and ! */ static int hunkmax = INITHUNKMAX; /* size of above arrays to begin with */ static int p_indent; /* indent to patch */ static LINENUM p_base; /* where to intuit this time */ static LINENUM p_bline; /* line # of p_base */ static LINENUM p_start; /* where intuit found a patch */ static LINENUM p_sline; /* and the line number for it */ static LINENUM p_hunk_beg; /* line number of current hunk */ static LINENUM p_efake = -1; /* end of faked up lines--don't free */ static LINENUM p_bfake = -1; /* beg of faked up lines */ /* Prepare to look for the next patch in the patch file. */ void re_patch() { p_first = Nulline; p_newfirst = Nulline; p_ptrn_lines = Nulline; p_repl_lines = Nulline; p_end = (LINENUM)-1; p_max = Nulline; p_indent = 0; } /* Open the patch file at the beginning of time. */ void open_patch_file(filename) char *filename; { if (filename == Nullch || !*filename || strEQ(filename, "-")) { pfp = fopen(TMPPATNAME, "w"); if (pfp == Nullfp) fatal2("patch: can't create %s.\n", TMPPATNAME); while (fgets(buf, sizeof buf, stdin) != Nullch) fputs(buf, pfp); Fclose(pfp); filename = TMPPATNAME; } pfp = fopen(filename, "r"); if (pfp == Nullfp) fatal2("patch file %s not found\n", filename); Fstat(fileno(pfp), &filestat); p_filesize = filestat.st_size; next_intuit_at(0L,1L); /* start at the beginning */ set_hunkmax(); } /* Make sure our dynamically realloced tables are malloced to begin with. */ void set_hunkmax() { #ifndef lint #ifdef SMALL if (p_line == Null(long*)) #else if (p_line == Null(char**)) #endif #ifdef SMALL p_line = (long *) malloc((MEM)hunkmax * sizeof(long)); #else p_line = (char**) malloc((MEM)hunkmax * sizeof(char *)); #endif if (p_len == Null(short*)) p_len = (short*) malloc((MEM)hunkmax * sizeof(short)); #endif if (p_char == Nullch) p_char = (char*) malloc((MEM)hunkmax * sizeof(char)); } /* Enlarge the arrays containing the current hunk of patch. */ void grow_hunkmax() { hunkmax *= 2; /* * Note that on most systems, only the p_line array ever gets fresh memory * since p_len can move into p_line's old space, and p_char can move into * p_len's old space. Not on PDP-11's however. But it doesn't matter. */ #ifdef SMALL assert(p_line != Null(long*) && p_len != Null(short*) && p_char != Nullch); #else assert(p_line != Null(char**) && p_len != Null(short*) && p_char != Nullch); #endif #ifndef lint #ifdef SMALL p_line = (long*) realloc((char*)p_line, (MEM)hunkmax * sizeof(long)); #else p_line = (char**) realloc((char*)p_line, (MEM)hunkmax * sizeof(char *)); #endif p_len = (short*) realloc((char*)p_len, (MEM)hunkmax * sizeof(short)); p_char = (char*) realloc((char*)p_char, (MEM)hunkmax * sizeof(char)); #endif #ifdef SMALL if (p_line != Null(long*) && p_len != Null(short*) && p_char != Nullch) #else if (p_line != Null(char**) && p_len != Null(short*) && p_char != Nullch) #endif return; if (!using_plan_a) fatal1("patch: out of memory (grow_hunkmax)\n"); out_of_mem = TRUE; /* whatever is null will be allocated again */ /* from within plan_a(), of all places */ } /* True if the remainder of the patch file contains a diff of some sort. */ bool there_is_another_patch() { if (p_base != 0L && p_base >= p_filesize) { if (verbose) say1("done\n"); return FALSE; } if (verbose) say1("Hmm..."); diff_type = intuit_diff_type(); if (!diff_type) { if (p_base != 0L) { if (verbose) say1(" Ignoring the trailing garbage.\ndone\n"); } else say1(" I can't seem to find a patch in there anywhere.\n"); return FALSE; } if (verbose) say3(" %sooks like %s to me...\n", (p_base == 0L ? "L" : "The next patch l"), diff_type == CONTEXT_DIFF ? "a context diff" : diff_type == NEW_CONTEXT_DIFF ? "a new-style context diff" : diff_type == NORMAL_DIFF ? "a normal diff" : "an ed script" ); if (p_indent && verbose) say3("(Patch is indented %d space%s.)\n", p_indent, p_indent==1?"":"s"); skip_to(p_start,p_sline); while (filearg[0] == Nullch) { if (force) { say1("No file to patch. Skipping...\n"); filearg[0] = savestr(bestguess); return TRUE; } ask1("File to patch: "); if (*buf != '\n') { if (bestguess) free(bestguess); bestguess = savestr(buf); filearg[0] = fetchname(buf, 0, FALSE); } if (filearg[0] == Nullch) { ask1("No file found--skip this patch? [n] "); if (*buf != 'y') { continue; } if (verbose) say1("Skipping patch...\n"); filearg[0] = fetchname(bestguess, 0, TRUE); skip_rest_of_patch = TRUE; return TRUE; } } return TRUE; } /* Determine what kind of diff is in the remaining part of the patch file. */ int intuit_diff_type() { Reg4 long this_line = 0; Reg5 long previous_line; Reg6 long first_command_line = -1; long fcl_line; Reg7 bool last_line_was_command = FALSE; Reg8 bool this_is_a_command = FALSE; Reg9 bool stars_last_line = FALSE; Reg10 bool stars_this_line = FALSE; Reg3 int indent; Reg1 char *s; Reg2 char *t; char *indtmp = Nullch; char *oldtmp = Nullch; char *newtmp = Nullch; char *indname = Nullch; char *oldname = Nullch; char *newname = Nullch; Reg11 int retval; bool no_filearg = (filearg[0] == Nullch); ok_to_create_file = FALSE; Fseek(pfp, p_base, 0); p_input_line = p_bline - 1; for (;;) { previous_line = this_line; last_line_was_command = this_is_a_command; stars_last_line = stars_this_line; this_line = ftell(pfp); indent = 0; p_input_line++; if (fgets(buf, sizeof buf, pfp) == Nullch) { if (first_command_line >= 0L) { /* nothing but deletes!? */ p_start = first_command_line; p_sline = fcl_line; retval = ED_DIFF; goto scan_exit; } else { p_start = this_line; p_sline = p_input_line; retval = 0; goto scan_exit; } } for (s = buf; *s == ' ' || *s == '\t' || *s == 'X'; s++) { if (*s == '\t') indent += 8 - (indent % 8); else indent++; } for (t=s; isdigit(*t) || *t == ','; t++) ; this_is_a_command = (isdigit(*s) && K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K��K�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� (*t == 'd' || *t == 'c' || *t == 'a') ); if (first_command_line < 0L && this_is_a_command) { first_command_line = this_line; fcl_line = p_input_line; p_indent = indent; /* assume this for now */ } if (!stars_last_line && strnEQ(s, "*** ", 4)) oldtmp = savestr(s+4); else if (strnEQ(s, "--- ", 4)) newtmp = savestr(s+4); else if (strnEQ(s, "Index:", 6)) indtmp = savestr(s+6); else if (strnEQ(s, "Prereq:", 7)) { for (t=s+7; isspace(*t); t++) ; revision = savestr(t); for (t=revision; *t && !isspace(*t); t++) ; *t = '\0'; if (!*revision) { free(revision); revision = Nullch; } } if ((!diff_type || diff_type == ED_DIFF) && first_command_line >= 0L && strEQ(s, ".\n") ) { p_indent = indent; p_start = first_command_line; p_sline = fcl_line; retval = ED_DIFF; goto scan_exit; } stars_this_line = strnEQ(s, "********", 8); if ((!diff_type || diff_type == CONTEXT_DIFF) && stars_last_line && strnEQ(s, "*** ", 4)) { if (!atol(s+4)) ok_to_create_file = TRUE; /* if this is a new context diff the character just before */ /* the newline is a '*'. */ while (*s != '\n') s++; p_indent = indent; p_start = previous_line; p_sline = p_input_line - 1; retval = (*(s-1) == '*' ? NEW_CONTEXT_DIFF : CONTEXT_DIFF); goto scan_exit; } if ((!diff_type || diff_type == NORMAL_DIFF) && last_line_was_command && (strnEQ(s, "< ", 2) || strnEQ(s, "> ", 2)) ) { p_start = previous_line; p_sline = p_input_line - 1; p_indent = indent; retval = NORMAL_DIFF; goto scan_exit; } } scan_exit: if (no_filearg) { if (indtmp != Nullch) indname = fetchname(indtmp, strippath, ok_to_create_file); if (oldtmp != Nullch) oldname = fetchname(oldtmp, strippath, ok_to_create_file); if (newtmp != Nullch) newname = fetchname(newtmp, strippath, ok_to_create_file); if (oldname && newname) { if (strlen(oldname) < strlen(newname)) filearg[0] = savestr(oldname); else filearg[0] = savestr(newname); } else if (oldname) filearg[0] = savestr(oldname); else if (newname) filearg[0] = savestr(newname); else if (indname) filearg[0] = savestr(indname); } if (bestguess) { free(bestguess); bestguess = Nullch; } if (filearg[0] != Nullch) bestguess = savestr(filearg[0]); else if (indtmp != Nullch) bestguess = fetchname(indtmp, strippath, TRUE); else { if (oldtmp != Nullch) oldname = fetchname(oldtmp, strippath, TRUE); if (newtmp != Nullch) newname = fetchname(newtmp, strippath, TRUE); if (oldname && newname) { if (strlen(oldname) < strlen(newname)) bestguess = savestr(oldname); else bestguess = savestr(newname); } else if (oldname) bestguess = savestr(oldname); else if (newname) bestguess = savestr(newname); } if (indtmp != Nullch) free(indtmp); if (oldtmp != Nullch) free(oldtmp); if (newtmp != Nullch) free(newtmp); if (indname != Nullch) free(indname); if (oldname != Nullch) free(oldname); if (newname != Nullch) free(newname); return retval; } /* Remember where this patch ends so we know where to start up again. */ void next_intuit_at(file_pos,file_line) long file_pos; long file_line; { p_base = file_pos; p_bline = file_line; } /* Basically a verbose fseek() to the actual diff listing. */ void skip_to(file_pos,file_line) long file_pos; long file_line; { char *ret; assert(p_base <= file_pos); if (verbose && p_base < file_pos) { Fseek(pfp, p_base, 0); say1("The text leading up to this was:\n--------------------------\n"); while (ftell(pfp) < file_pos) { ret = fgets(buf, sizeof buf, pfp); assert(ret != Nullch); say2("|%s", buf); } say1("--------------------------\n"); } else Fseek(pfp, file_pos, 0); p_input_line = file_line - 1; } /* True if there is more of the current diff listing to process. */ bool another_hunk() { Reg1 char *s; Reg8 char *ret; Reg2 int context = 0; while (p_end >= 0) { if (p_end == p_efake) p_end = p_bfake; /* don't free twice */ #ifndef SMALL else free(p_line[p_end]); #endif p_end--; } assert(p_end == -1); p_efake = -1; #ifdef SMALL if (sfp != Nullfp) Fclose(sfp); sfp = fopen(TMPSTRNAME, "w"); if (sfp == Nullfp) fatal2("patch: can't create %s.\n", TMPSTRNAME); #endif p_max = hunkmax; /* gets reduced when --- found */ if (diff_type == CONTEXT_DIFF || diff_type == NEW_CONTEXT_DIFF) { long line_beginning = ftell(pfp); /* file pos of the current line */ LINENUM repl_beginning = 0; /* index of --- line */ Reg4 LINENUM fillcnt = 0; /* #lines of missing ptrn or repl */ Reg5 LINENUM fillsrc; /* index of first line to copy */ Reg6 LINENUM filldst; /* index of first missing line */ bool ptrn_spaces_eaten = FALSE; /* ptrn was slightly misformed */ Reg9 bool repl_could_be_missing = TRUE; /* no + or ! lines in this hunk */ bool repl_missing = FALSE; /* we are now backtracking */ long repl_backtrack_position = 0; /* file pos of first repl line */ LINENUM repl_patch_line; /* input line number for same */ Reg7 LINENUM ptrn_copiable = 0; /* # of copiable lines in ptrn */ ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch || strnNE(buf, "********", 8)) { next_intuit_at(line_beginning,p_input_line); return FALSE; } p_context = 100; p_hunk_beg = p_input_line + 1; while (p_end < p_max) { line_beginning = ftell(pfp); ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) { if (p_max - p_end < 4) Strcpy(buf, " \n"); /* assume blank lines got chopped */ else { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } fatal1("Unexpected end of file in patch.\n"); } } p_end++; assert(p_end < hunkmax); p_char[p_end] = *buf; #ifdef zilog p_line[(short)p_end] = Nullch; #else #ifdef SMALL p_line[p_end] = -1L; p_len[p_end] = 0; #else p_line[p_end] = Nullch; #endif #endif switch (*buf) { case '*': if (strnEQ(buf, "********", 8)) { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } else fatal2("Unexpected end of hunk at line %ld.\n", p_input_line); } if (p_end != 0) { if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } fatal3("Unexpected *** at line %ld: %s", p_input_line, buf); } context = 0; #ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end); #else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; } #endif for (s=buf; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; if (strnEQ(s,"0,0",3)) strcpy(s,s+2); p_first = (LINENUM) atol(s); while (isdigit(*s)) s++; if (*s == ',') { for (; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_ptrn_lines = ((LINENUM)atol(s)) - p_first + 1; } else if (p_first) p_ptrn_lines = 1; else { p_ptrn_lines = 0; p_first = 1; } p_max = p_ptrn_lines + 6; /* we need this much at least */ while (p_max >= hunkmax) grow_hunkmax(); p_max = hunkmax; break; case '-': if (buf[1] == '-') { if (repl_beginning || (p_end != p_ptrn_lines + 1 + (p_char[p_end-1] == '\n'))) { if (p_end == 1) { /* `old' lines were omitted - set up to fill */ /* them in from 'new' context lines. */ p_end = p_ptrn_lines + 1; fillsrc = p_end + 1; filldst = 1; fillcnt = p_ptrn_lines; } else { if (repl_beginning) { if (repl_could_be_missing){ repl_missing = TRUE; goto hunk_done; } fatal3( "Duplicate \"---\" at line %ld--check line numbers at line %ld.\n", p_input_line, p_hunk_beg + repl_beginning); } else { fatal4( "%s \"---\" at line %ld--check line numbers at line %ld.\n", (p_end <= p_ptrn_lines ? "Premature" : "Overdue" ), p_input_line, p_hunk_beg); } } } repl_beginning = p_end; repl_backtrack_position = ftell(pfp); repl_patch_line = p_input_line; #ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end); #else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; } #endif p_char[p_end] = '='; for (s=buf; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_newfirst = (LINENUM) atol(s); while (isdigit(*s)) s++; if (*s == ',') { for (; *s && !isdigit(*s); s++) ; if (!*s) goto malformed; p_repl_lines = ((LINENUM)atol(s)) - p_newfirst + 1; } else if (p_newfirst) p_repl_lines = 1; else { p_repl_lines = 0; p_newfirst = 1; } p_max = p_repl_lines + p_end; if (p_max > MAXHUNKSIZE) fatal4("Hunk too large (%ld lines) at line %ld: %s", p_max, p_input_line, buf); while (p_max >= hunkmax) grow_hunkmax(); if (p_repl_lines != ptrn_copiable) repl_could_be_missing = FALSE; break; } goto change_line; case '+': case '!': repl_could_be_missing = FALSE; change_line: if (buf[1] == '\n' && canonicalize) strcpy(buf+1," \n"); if (!isspace(buf[1]) && buf[1] != '>' && buf[1] != '<' && repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } if (context > 0) { if (context < p_context) p_context = context; context = -1000; } #ifdef SMALL p_line[p_end] = saveStr(buf+2, p_len+p_end); #else p_line[p_end] = savestr(buf+2); if (out_of_mem) { p_end--; return FALSE; } #endif break; case '\t': case '\n': /* assume the 2 spaces got eaten */ if (repl_beginning && repl_could_be_missing && (!ptrn_spaces_eaten || diff_type == NEW_CONTEXT_DIFF) ) { repl_missing = TRUE; goto hunk_done; } #ifdef SMALL p_line[p_end] = saveStr(buf, p_len+p_end); #else p_line[p_end] = savestr(buf); if (out_of_mem) { p_end--; return FALSE; } #endif if (p_end != p_ptrn_lines + 1) { ptrn_spaces_eaten |= (repl_beginning != 0); context++; if (!repl_beginning) ptrn_copiable++; p_char[p_end] = ' '; } break; case ' ': if (!isspace(buf[1]) && repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } context++; if (!repl_beginning) ptrn_copiable++; #ifdef SMALL p_line[p_end] = saveStr(buf+2, p_len+p_end); #else p_line[p_end] = savestr(buf+2); if (out_of_mem) { p_end--; return FALSE; } #endif break; default: if (repl_beginning && repl_could_be_missing) { repl_missing = TRUE; goto hunk_done; } goto malformed; } /* set up p_len for strncmp() so we don't have to */ /* assume null termination */ #ifndef SMALL if (p_line[p_end]) p_len[p_end] = strlen(p_line[p_end]); else p_len[p_end] = 0; #endif } hunk_done: if (p_end >=0 && !repl_beginning) fatal2("No --- found in patch at line %ld\n", pch_hunk_beg()); if (repl_missing) { /* reset state back to just after --- */ p_input_line = repl_patch_line; #ifndef SMALL for (p_end--; p_end > repl_beginning; p_end--) free(p_line[p_end]); #endif Fseek(pfp, repl_backtrack_position, 0); /* redundant 'new' context lines were omitted - set */ /* up to fill them in from the old file context */ fillsrc = 1; filldst = repl_beginning+1; fillcnt = p_repl_lines; p_end = p_max; } if (diff_type == CONTEXT_DIFF && (fillcnt || (p_first > 1 && ptrn_copiable > 2*p_context)) ) { if (verbose) say4("%s\n%s\n%s\n", "(Fascinating--this is really a new-style context diff but without", "the telltale extra asterisks on the *** line that usually indicate", "the new style...)"); diff_type = NEW_CONTEXT_DIFF; } /* if there were omitted context lines, fill them in now */ if (fillcnt) { p_bfake = filldst; /* remember where not to free() */ p_efake = filldst + fillcnt - 1; while (fillcnt-- > 0) { while (fillsrc <= p_end && p_char[fillsrc] != ' ') fillsrc++; if (fillsrc > p_end) fatal2("Replacement text or line numbers mangled in hunk at line %ld\n", p_hunk_beg); p_line[filldst] = p_line[fillsrc]; p_char[filldst] = p_char[fillsrc]; p_len[filldst] = p_len[fillsrc]; fillsrc++; filldst++; } while (fillsrc <= p_end && fillsrc != repl_beginning && p_char[fillsrc] != ' ') fillsrc++; #ifdef DEBUGGING if (debug & 64) printf("fillsrc %ld, filldst %ld, rb %ld, e+1 %ld\n", fillsrc,filldst,repl_beginning,p_end+1); #endif assert(fillsrc==p_end+1 || fillsrc==repl_beginning); assert(filldst==p_end+1 || filldst==repl_beginning); } } else { /* normal diff--fake it up */ char hunk_type; Reg3 int i; LINENUM min, max; long line_beginning = ftell(pfp); p_context = 0; ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch || !isdigit(*buf)) { next_intuit_at(line_beginning,p_input_line); return FALSE; } p_first = (LINENUM)atol(buf); for (s=buf; isdigit(*s); s++) ; if (*s == ',') { p_ptrn_lines = (LINENUM)atol(++s) - p_first + 1; while (isdigit(*s)) s++; } else p_ptrn_lines = (*s != 'a'); hunk_type = *s; if (hunk_type == 'a') p_first++; /* do append rather than insert */ min = (LINENUM)atol(++s); for (; isdigit(*s); s++) ; if (*s == ',') max = (LINENUM)atol(++s); else max = min; if (hunk_type == 'd') min++; p_end = p_ptrn_lines + 1 + max - min + 1; if (p_end > MAXHUNKSIZE) fatal4("Hunk too large (%ld lines) at line %ld: %s", p_end, p_input_line, buf); while (p_end >= hunkmax) grow_hunkmax(); p_newfirst = min; p_repl_lines = max - min + 1; Sprintf(buf, "*** %ld,%ld\n", p_first, p_first + p_ptrn_lines - 1); #ifdef SMALL p_line[0] = saveStr(buf, p_len); #else p_line[0] = savestr(buf); if (out_of_mem) { p_end = -1; return FALSE; } #endif p_char[0] = '*'; for (i=1; i<=p_ptrn_lines; i++) { ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) fatal2("Unexpected end of file in patch at line %ld.\n", p_input_line); if (*buf != '<') fatal2("< expected at line %ld of patch.\n", p_input_line); #ifdef SMALL p_line[i] = saveStr(buf+2, p_len+i); #else p_line[i] = savestr(buf+2); if (out_of_mem) { p_end = i-1; return FALSE; } #endif #ifndef SMALL p_len[i] = strlen(p_line[i]); #endif p_char[i] = '-'; } if (hunk_type == 'c') { ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) fatal2("Unexpected end of file in patch at line %ld.\n", p_input_line); if (*buf != '-') fatal2("--- expected at line %ld of patch.\n", p_input_line); } Sprintf(buf, "--- %ld,%ld\n", min, max); #ifdef SMALL p_line[i] = saveStr(buf, p_len+i); #else p_line[i] = savestr(buf); if (out_of_mem) { p_end = i-1; return FALSE; } #endif p_char[i] = '='; for (i++; i<=p_end; i++) { ret = pgets(buf, sizeof buf, pfp); p_input_line++; if (ret == Nullch) fatal2("Unexpected end of file in patch at line %ld.\n", p_input_line); if (*buf != '>') fatal2("> expected at line %ld of patch.\n", p_input_line); #ifdef SMALL p_line[i] = saveStr(buf+2, p_len+i); #else p_line[i] = savestr(buf+2); if (out_of_mem) { p_end = i-1; return FALSE; } #endif #ifndef SMALL p_len[i] = strlen(p_line[i]); #endif p_char[i] = '+'; } } if (reverse) /* backwards patch? */ if (!pch_swap()) say1("Not enough memory to swap next hunk!\n"); #ifdef SMALL Fclose(sfp); sfp = fopen(TMPSTRNAME, "r"); #endif #ifdef DEBUGGING if (debug & 2) { int i; char special; for (i=0; i <= p_end; i++) { if (i == p_ptrn_lines) special = '^'; else special = ' '; #ifdef SMALL fprintf(stderr, "%3d %c %c %s", i, p_char[i], special, pfetch(i)); #else fprintf(stderr, "%3d %c %c %s", i, p_char[i], special, p_line[i]); #endif Fflush(stderr); } } #endif if (p_end+1 < hunkmax) /* paranoia reigns supreme... */ p_char[p_end+1] = '^'; /* add a stopper for apply_hunk */ return TRUE; malformed: #ifdef SMALL Fclose(sfp); sfp = Nullfp; #endif fatal3("Malformed patch at line %ld: %s", p_input_line, buf); /* about as informative as "Syntax error" in C */ return FALSE; /* for lint */ } /* Input a line from the patch file, worrying about indentation. */ char * pgets(bf,sz,fp) char *bf; int sz; FILE *fp; { char *ret = fgets(bf, sz, fp); Reg1 char *s; Reg2 int indent = 0; if (p_indent && ret != Nullch) { for (s=buf; indent < p_indent && (*s == ' ' || *s == '\t' || *s == 'X'); s++) { if (*s == '\t') indent += 8 - (indent % 7); else indent++; } if (buf != s) Strcpy(buf, s); } return ret; } /* Reverse the old and new portions of the current hunk. */ bool pch_swap() { #ifdef SMALL long *tp_line; /* the text of the hunk */ #else char **tp_line; /* the text of the hunk */ #endif short *tp_len; /* length of each line */ char *tp_char; /* +, -, and ! */ Reg1 LINENUM i; Reg2 LINENUM n; bool blankline = FALSE; Reg3 char *s; i = p_first; p_first = p_newfirst; p_newfirst = i; /* make a scratch copy */ tp_line = p_line; tp_len = p_len; tp_char = p_char; #ifdef SMALL p_line = Null(long*); /* force set_hunkmax to allocate again */ #else p_line = Null(char**); /* force set_hunkmax to allocate again */ #endif p_len = Null(short*); p_char = Nullch; set_hunkmax(); #ifdef SMALL if (p_line == Null(long*) || p_len == Null(short*) || p_char == Nullch) { #else if (p_line == Null(char**) || p_len == Null(short*) || p_char == Nullch) { #endif #ifndef lint #ifdef SMALL if (p_line == Null(long*)) #else if (p_line == Null(char**)) #endif free((char*)p_line); p_line = tp_line; if (p_len == Null(short*)) free((char*)p_len); p_len = tp_len; #endif if (p_char == Nullch) free((char*)p_char); p_char = tp_char; return FALSE; /* not enough memory to swap hunk! */ } /* now turn the new into the old */ i = p_ptrn_lines + 1; if (tp_char[i] == '\n') { /* account for possible blank line */ blankline = TRUE; i++; } if (p_efake >= 0) { /* fix non-freeable ptr range */ if (p_efake <= i) n = p_end - i + 1; else n = -i; p_efake += n; p_bfake += n; } for (n=0; i <= p_end; i++,n++) { p_line[n] = tp_line[i]; p_char[n] = tp_char[i]; if (p_char[n] == '+') p_char[n] = '-'; p_len[n] = tp_len[i]; } if (blankline) { i = p_ptrn_lines + 1; p_line[n] = tp_line[i]; p_char[n] = tp_char[i]; p_len[n] = tp_len[i]; n++; } assert(p_char[0] == '='); p_char[0] = '*'; #ifdef SMALL strEdit(p_line[0], '*', '-'); #else for (s=p_line[0]; *s; s++) if (*s == '-') *s = '*'; #endif /* now turn the old into the new */ assert(tp_char[0] == '*'); tp_char[0] = '='; #ifdef SMALL strEdit(tp_line[0], '-', '*'); #else for (s=tp_line[0]; *s; s++) if (*s == '*') *s = '-'; #endif for (i=0; n <= p_end; i++,n++) { p_line[n] = tp_line[i]; p_char[n] = tp_char[i]; if (p_char[n] == '-') p_char[n] = '+'; p_len[n] = tp_len[i]; } assert(i == p_ptrn_lines + 1); i = p_ptrn_lines; p_ptrn_lines = p_repl_lines; p_repl_lines = i; #ifndef lint #ifdef SMALL if (tp_line == Null(long*)) #else if (tp_line == Null(char**)) #endif free((char*)tp_line); if (tp_len == Null(short*)) free((char*)tp_len); #endif if (tp_char == Nullch) free((char*)tp_char); return TRUE; } /* Return the specified line position in the old file of the old context. */ LINENUM pch_first() { return p_first; } /* Return the number of lines of old context. */ LINENUM pch_ptrn_lines() { return p_ptrn_lines; } /* Return the probable line position in the new file of the first line. */ LINENUM pch_newfirst() { return p_newfirst; } /* Return the number of lines in the replacement text including context. */ LINENUM pch_repl_lines() { return p_repl_lines; } /* Return the number of lines in the whole hunk. */ LINENUM pch_end() { return p_end; } /* Return the number of context lines before the first changed line. */ LINENUM pch_context() { return p_context; } /* Return the length of a particular patch line. */ short pch_line_len(line) LINENUM line; { return p_len[line]; } /* Return the control character (+, -, *, !, etc) for a patch line. */ char pch_char(line) LINENUM line; { return p_char[line]; } /* Return a pointer to a particular patch line. */ #ifdef SMALL long saveStr(str, plen) char *str; short *plen; { long pos, ftell(); int len; pos = ftell(sfp); len = strlen(str); fwrite(str, sizeof(char), len+1, sfp); *plen = len; return pos; } char * pfetch(line) LINENUM line; { static char *s, strbuf[BUFSIZ]; int i, c; if (p_line[line] == -1L) return Nullch; else { Fseek(sfp, p_line[line], 0); for (i = 0, s = strbuf; i < BUFSIZ && (c = fgetc(sfp)) != EOF && c; i++) *s++ = c; if (i == BUFSIZ) fatal2("too long line (%.40s ..\n", strbuf); } *s = '\0'; return strbuf; } void strEdit(pos, to, from) long pos; int to, from; { static char *s, strbuf[BUFSIZ]; int i, c; if (pos != -1L) { for (i = 0, s = strbuf; i < BUFSIZ && (c = fgetc(sfp)) != EOF && c; i++) *s++ = c; for (s = strbuf; *s; s++) if (*s == from) *s = to; fwrite(strbuf, sizeof(char), i+1, sfp); } } #else char * pfetch(line) LINENUM line; { return p_line[line]; } #endif /* Return where in the patch file this hunk began, for error messages. */ LINENUM pch_hunk_beg() { return p_hunk_beg; } /* Apply an ed script by feeding ed itself. */ void do_ed_script() { Reg1 char *t; Reg2 long beginning_of_this_line; Reg3 bool this_line_is_command = FALSE; Reg4 FILE *pipefp; if (!skip_rest_of_patch) { Unlink(TMPOUTNAME); copy_file(filearg[0], TMPOUTNAME); if (verbose) Sprintf(buf, "/bin/ed %s", TMPOUTNAME); else Sprintf(buf, "/bin/ed - %s", TMPOUTNAME); pipefp = popen(buf, "w"); } for (;;) { beginning_of_this_line = ftell(pfp); if (pgets(buf, sizeof buf, pfp) == Nullch) { next_intuit_at(beginning_of_this_line,p_input_line); break; } p_input_line++; for (t=buf; isdigit(*t) || *t == ','; t++) ; this_line_is_command = (isdigit(*buf) && (*t == 'd' || *t == 'c' || *t == 'a') ); if (this_line_is_command) { if (!skip_rest_of_patch) fputs(buf, pipefp); if (*t != 'd') { while (pgets(buf, sizeof buf, pfp) != Nullch) { p_input_line++; if (!skip_rest_of_patch) fputs(buf, pipefp); if (strEQ(buf, ".\n")) break; } } } else { next_intuit_at(beginning_of_this_line,p_input_line); break; } } if (skip_rest_of_patch) return; fprintf(pipefp, "w\n"); fprintf(pipefp, "q\n"); Fflush(pipefp); Pclose(pipefp); ignore_signals(); if (move_file(TMPOUTNAME, outname) < 0) { toutkeep = TRUE; chmod(TMPOUTNAME, filemode); } else chmod(outname, filemode); set_signals(1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: pch.h,v 2.0.1.1 87/01/30 22:47:16 lwall Exp $ * * $Log: pch.h,v $ * Revision 2.0.1.1 87/01/30 22:47:16 lwall * Added do_ed_script(). * * Revision 2.0 86/09/17 15:39:57 lwall * Baseline for netwide release. * */ EXT FILE *pfp INIT(Nullfp); /* patch file pointer */ #ifdef SMALL EXT FILE *sfp INIT(Nullfp); /* string file pointer */ #endif _PROTOTYPE(void re_patch , (void)); _PROTOTYPE(void open_patch_file , (char *filename )); _PROTOTYPE(void set_hunkmax , (void)); _PROTOTYPE(void grow_hunkmax , (void)); _PROTOTYPE(bool there_is_another_patch , (void)); _PROTOTYPE(int intuit_diff_type , (void)); _PROTOTYPE(void next_intuit_at , (long file_pos , long file_line )); _PROTOTYPE(void skip_to , (long file_pos , long file_line )); _PROTOTYPE(bool another_hunk , (void)); _PROTOTYPE(char *pgets , (char *bf , int sz , FILE *fp )); _PROTOTYPE(bool pch_swap , (void)); _PROTOTYPE(LINENUM pch_first , (void)); _PROTOTYPE(LINENUM pch_ptrn_lines , (void)); _PROTOTYPE(LINENUM pch_newfirst , (void)); _PROTOTYPE(LINENUM pch_repl_lines , (void)); _PROTOTYPE(LINENUM pch_end , (void)); _PROTOTYPE(LINENUM pch_context , (void)); _PROTOTYPE(short pch_line_len , (LINENUM line )); _PROTOTYPE(char pch_char , (LINENUM line )); _PROTOTYPE(char *pfetch , (LINENUM line )); _PROTOTYPE(LINENUM pch_hunk_beg , (void)); _PROTOTYPE(void do_ed_script , (void)); #ifdef SMALL _PROTOTYPE(long saveStr , (char *string , short *length )); _PROTOTYPE(void strEdit , (long pos , int from , int to )); #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include "EXTERN.h" #include "common.h" #include "INTERN.h" #include "util.h" /* Rename a file, copying it if necessary. */ int move_file(from,to) char *from, *to; { char bakname[512]; Reg1 char *s; Reg2 int i; Reg3 int fromfd; /* to stdout? */ if (strEQ(to, "-")) { #ifdef DEBUGGING if (debug & 4) say2("Moving %s to stdout.\n", from); #endif fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) if (write(1, buf, i) != i) fatal1("patch: write failed\n"); Close(fromfd); return 0; } if (origprae) { Strcpy (bakname, origprae); Strcat(bakname, to); } else { Strcpy(bakname, to); Strcat(bakname, origext?origext:ORIGEXT); } if (stat(to, &filestat) >= 0) { /* output file exists */ dev_t to_device = filestat.st_dev; ino_t to_inode = filestat.st_ino; char *simplename = bakname; for (s=bakname; *s; s++) { if (*s == '/') simplename = s+1; } /* find a backup name that is not the same file */ while (stat(bakname, &filestat) >= 0 && to_device == filestat.st_dev && to_inode == filestat.st_ino) { for (s=simplename; *s && !islower(*s); s++) ; if (*s) *s = toupper(*s); else Strcpy(simplename, simplename+1); } while (unlink(bakname) >= 0) ; /* while() is for benefit of Eunice */ #ifdef DEBUGGING if (debug & 4) say3("Moving %s to %s.\n", to, bakname); #endif if (link(to, bakname) < 0) { say3("patch: can't backup %s, output is in %s\n", to, from); return -1; } while (unlink(to) >= 0) ; } #ifdef DEBUGGING if (debug & 4) say3("Moving %s to %s.\n", from, to); #endif if (link(from, to) < 0) { /* different file system? */ Reg4 int tofd; tofd = creat(to, 0666); if (tofd < 0) { say3("patch: can't create %s, output is in %s.\n", to, from); return -1; } fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) if (write(tofd, buf, i) != i) fatal1("patch: write failed\n"); Close(fromfd); Close(tofd); } Unlink(from); return 0; } /* Copy a file. */ void copy_file(from,to) char *from, *to; { Reg3 int tofd; Reg2 int fromfd; Reg1 int i; tofd = creat(to, 0666); if (tofd < 0) fatal2("patch: can't create %s.\n", to); fromfd = open(from, 0); if (fromfd < 0) fatal2("patch: internal error, can't reopen %s\n", from); while ((i=read(fromfd, buf, sizeof buf)) > 0) if (write(tofd, buf, i) != i) fatal2("patch: write (%s) failed\n", to); Close(fromfd); Close(tofd); } /* Allocate a unique area for a string. */ char * savestr(s) Reg1 char *s; { Reg3 char *rv; Reg2 char *t; if (!s) s = "Oops"; t = s; while (*t++); rv = (char *)malloc((MEM) (t - s)); if (rv == Nullch) { if (using_plan_a) out_of_mem = TRUE; else fatal1("patch: out of memory (savestr)\n"); } else { t = rv; while (*t++ = *s++); } return rv; } #if defined(lint) && defined(CANVARARG) /*VARARGS ARGSUSED*/ say(pat) char *pat; { ; } /*VARARGS ARGSUSED*/ fatal(pat) char *pat; { ; } /*VARARGS ARGSUSED*/ ask(pat) char *pat; { ; } #else /* Vanilla terminal output (buffered). */ void say(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { fprintf(stderr, pat, arg1, arg2, arg3); Fflush(stderr); } /* Terminal output, pun intended. */ void /* very void */ fatal(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { say(pat, arg1, arg2, arg3); my_exit(1); } /* Get a response from the user, somehow or other. */ void ask(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { int ttyfd; int r; bool tty2 = isatty(2); Sprintf(buf, pat, arg1, arg2, arg3); Fflush(stderr); write(2, buf, strlen(buf)); if (tty2) { /* might be redirected to a file */ r = read(2, buf, sizeof buf); } else if (isatty(1)) { /* this may be new file output */ Fflush(stdout); write(1, buf, strlen(buf)); r = read(1, buf, sizeof buf); } else if ((ttyfd = open("/dev/tty", 2)) >= 0 && isatty(ttyfd)) { /* might be deleted or unwriteable */ write(ttyfd, buf, strlen(buf)); r = read(ttyfd, buf, sizeof buf); Close(ttyfd); } else if (isatty(0)) { /* this is probably patch input */ Fflush(stdin); write(0, buf, strlen(buf)); r = read(0, buf, sizeof buf); } else { /* no terminal at all--default it */ buf[0] = '\n'; r = 1; } if (r <= 0) buf[0] = 0; else buf[r] = '\0'; if (!tty2) say1(buf); } #endif /* lint */ /* How to handle certain events when not in a critical region. */ void set_signals(reset) int reset; { #ifndef lint #ifdef VOIDSIG static void (*hupval)(),(*intval)(); #else static int (*hupval)(),(*intval)(); #endif if (!reset) { hupval = signal(SIGHUP, SIG_IGN); if (hupval != SIG_IGN) #ifdef VOIDSIG hupval = my_exit; #else hupval = (int(*)())my_exit; #endif intval = signal(SIGINT, SIG_IGN); if (intval != SIG_IGN) #ifdef VOIDSIG intval = my_exit; #else intval = (int(*)())my_exit; #endif } Signal(SIGHUP, hupval); Signal(SIGINT, intval); #endif } /* How to handle certain events when in a critical region. */ void ignore_signals() { #ifndef lint Signal(SIGHUP, SIG_IGN); Signal(SIGINT, SIG_IGN); #endif } /* Make sure we'll have the directories to create a file. */ void makedirs(filename,striplast) Reg1 char *filename; bool striplast; { char tmpbuf[256]; Reg2 char *s = tmpbuf; char *dirv[20]; Reg3 int i; Reg4 int dirvp = 0; while (*filename) { if (*filename == '/') { filename++; dirv[dirvp++] = s; *s++ = '\0'; } else { *s++ = *filename++; } } *s = '\0'; dirv[dirvp] = s; if (striplast) dirvp--; if (dirvp < 0) return; strcpy(buf, "mkdir"); s = buf; for (i=0; i<=dirvp; i++) { while (*s) s++; *s++ = ' '; strcpy(s, tmpbuf); *dirv[i] = '/'; } system(buf); } /* Make filenames more reasonable. */ char * fetchname(at,strip_leading,assume_exists) char *at; int strip_leading; int assume_exists; { char *s; char *name; Reg1 char *t; char tmpbuf[200]; if (!at) return Nullch; s = savestr(at); for (t=s; isspace(*t); t++) ; name = t; #ifdef DEBUGGING if (debug & 128) say4("fetchname %s %d %d\n",name,strip_leading,assume_exists); #endif if (strnEQ(name, "/dev/null", 9)) /* so files can be created by diffing */ return Nullch; /* against /dev/null. */ for (; *t && !isspace(*t); t++) if (*t == '/') if (--strip_leading >= 0) name = t+1; *t = '\0'; if (name != s && *s != '/') { name[-1] = '\0'; if (stat(s, &filestat) && filestat.st_mode & S_IFDIR) { name[-1] = '/'; name=s; } } name = savestr(name); Sprintf(tmpbuf, "RCS/%s", name); free(s); if (stat(name, &filestat) < 0 && !assume_exists) { Strcat(tmpbuf, RCSSUFFIX); if (stat(tmpbuf, &filestat) < 0 && stat(tmpbuf+4, &filestat) < 0) { Sprintf(tmpbuf, "SCCS/%s%s", SCCSPREFIX, name); if (stat(tmpbuf, &filestat) < 0 && stat(tmpbuf+5, &filestat) < 0) { free(name); name = Nullch; } } } return name; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������K��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: util.h,v 2.0 86/09/17 15:40:06 lwall Exp $ * * $Log: util.h,v $ * Revision 2.0 86/09/17 15:40:06 lwall * Baseline for netwide release. * */ /* and for those machine that can't handle a variable argument list */ #ifdef CANVARARG #define say1 say #define say2 say #define say3 say #define say4 say #define ask1 ask #define ask2 ask #define ask3 ask #define ask4 ask #define fatal1 fatal #define fatal2 fatal #define fatal3 fatal #define fatal4 fatal #else /* hope they allow multi-line macro actual arguments */ #ifdef lint #define say1(a) say(a, 0, 0, 0) #define say2(a,b) say(a, (b)==(b), 0, 0) #define say3(a,b,c) say(a, (b)==(b), (c)==(c), 0) #define say4(a,b,c,d) say(a, (b)==(b), (c)==(c), (d)==(d)) #define ask1(a) ask(a, 0, 0, 0) #define ask2(a,b) ask(a, (b)==(b), 0, 0) #define ask3(a,b,c) ask(a, (b)==(b), (c)==(c), 0) #define ask4(a,b,c,d) ask(a, (b)==(b), (c)==(c), (d)==(d)) #define fatal1(a) fatal(a, 0, 0, 0) #define fatal2(a,b) fatal(a, (b)==(b), 0, 0) #define fatal3(a,b,c) fatal(a, (b)==(b), (c)==(c), 0) #define fatal4(a,b,c,d) fatal(a, (b)==(b), (c)==(c), (d)==(d)) #else /* lint */ /* if this doesn't work, try defining CANVARARG above */ #define say1(a) say(a, Nullch, Nullch, Nullch) #define say2(a,b) say(a, b, Nullch, Nullch) #define say3(a,b,c) say(a, b, c, Nullch) #define say4 say #define ask1(a) ask(a, Nullch, Nullch, Nullch) #define ask2(a,b) ask(a, b, Nullch, Nullch) #define ask3(a,b,c) ask(a, b, c, Nullch) #define ask4 ask #define fatal1(a) fatal(a, Nullch, Nullch, Nullch) #define fatal2(a,b) fatal(a, b, Nullch, Nullch) #define fatal3(a,b,c) fatal(a, b, c, Nullch) #define fatal4 fatal #endif /* lint */ /* if neither of the above work, join all multi-line macro calls. */ #endif EXT char serrbuf[BUFSIZ]; /* buffer for stderr */ _PROTOTYPE(int move_file , (char *from , char *to )); _PROTOTYPE(void copy_file , (char *from , char *to )); _PROTOTYPE(char *savestr , (Reg1 char *s )); void say(); void fatal(); void ask(); _PROTOTYPE(void set_signals , (int reset )); _PROTOTYPE(void ignore_signals , (void)); _PROTOTYPE(void makedirs , (Reg1 char *filename , bool striplast )); _PROTOTYPE(char *fetchname , (char *at , int strip_leading , int assume_exists )); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: version.c,v 2.0 86/09/17 15:40:11 lwall Exp $ * * $Log: version.c,v $ * Revision 2.0 86/09/17 15:40:11 lwall * Baseline for netwide release. * */ #include "EXTERN.h" #include "common.h" #include "util.h" #include "INTERN.h" #include "patchlevel.h" #include "version.h" /* Print out the version number and die. */ void version() { extern char rcsid[]; #ifdef lint rcsid[0] = rcsid[0]; #else fatal3("%s\nPatch level: %d\n", rcsid, PATCHLEVEL); #endif } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* $Header: version.h,v 2.0 86/09/17 15:40:14 lwall Exp $ * * $Log: version.h,v $ * Revision 2.0 86/09/17 15:40:14 lwall * Baseline for netwide release. * */ _PROTOTYPE(void version , (void)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ README�������� halt.c�������� log.c��������� sh_wall.c����� shutdown.c���� tinyhalt.c��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for shutdown / halt / reboot. CFLAGS=$(OPT) -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i PROGRAMS= shutdown halt tinyhalt MANUALS= shutdown.8 halt.8 reboot.2 reboot.8 all: $(PROGRAMS) shutdown: shutdown.o sh_wall.o log.o $(CC) $(LDFLAGS) -o shutdown shutdown.o sh_wall.o log.o install -S 4kw $@ halt: halt.o log.o $(CC) $(LDFLAGS) -o halt halt.o log.o install -S 4kw $@ tinyhalt: tinyhalt.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $? install -S 4kw $@ install: /usr/bin/halt /usr/bin/reboot /usr/bin/shutdown \ /bin/halt /bin/reboot /usr/bin/halt: halt install -cs -o root -g operator -m 744 $? $@ /usr/bin/reboot: /usr/bin/halt install -l $? $@ /usr/bin/shutdown: shutdown install -cs -o root -g operator -m 4754 $? $@ /bin/halt: tinyhalt install -cs -o root -g operator -m 744 $? $@ /bin/reboot: /bin/halt install -l $? $@ clean: rm -f *.o a.out core $(PROGRAMS) �����������������������������������������������������������������������������������������������������������������������������������������This a new implementation of a shutdown procedure. It allows the system to go down graciously with informing the users. This package contains 3 programs: - halt = Immediately stop the system, no info to users - shutdown = Inform users, close down the system properly - wall = Vincent Archer's implementation of wall (Write all) Installing Shutdown and halt use a new systemcall, which I've added to MM. Therefor there are several diff's which should be applied: callnr.hd - New callnr for reboot(2) Diff against /usr/include/minix/callnr.h. Those of you using a symlink package should change the number and mm/table.c into a free number. I used 54, LSTAT. param.hd - Defines reboot_flag as a part of the messages proto.hd - Add's prototype for do_reboot() table.cd - Interpretation of the systemcall to MM mm.cd - I have added the do_reboot code to mm/getset.c but I couldn't find a getset.c to create a useable diff :-( So you can add where you want it. It is pure code, no diff. Now edit log.c and search for ``host''. Change this into your systemname or make it empty. Shutdown and halt log their actions in /usr/adm/log, edit the makefile and undefine -DLOG if you don't want this (this at the end of the makefile). You can change SHUT_LOG in shutdown.c and log.c if you want it in another file. Then type a `make'. This will take a minute or so (13 sec. with bcc :-). Remember to build a new image and update the ps_database. Type `make install' to place the program's where I've got them. Use them, try them and let me now if you've got problems running something. I have tested to sources both on 16-bits and 32-bits MINIX. I have compiled it with gcc, bcc and ACK, so that shouldn't really give a problem. Maybe the standard MINIX-make chokes on the makefile, atleast mine did. NOTE: Make install does not place the man-pages somewhere. You should do this yourself. -- Edvard Tuinder ed@pulstar.NL.mugnet.org v892231@si.hhs.NL Student Computer Science Haagse Hogeschool, The Hague, The Netherlands �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* halt / reboot - halt or reboot system (depends on name) halt - calling reboot() with RBT_HALT reboot - calling reboot() with RBT_REBOOT author: Edvard Tuinder v892231@si.hhs.NL This program calls the library function reboot(2) which performs the system-call do_reboot. */ #define _POSIX_SOURCE 1 #include <sys/types.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include <sys/wait.h> void write_log _ARGS(( void )); void usage _ARGS(( void )); int main _ARGS(( int argc, char *argv[] )); char *prog; void usage() { fprintf(stderr, "Usage: %s [-hrRf] [-x reboot-code]\n", prog); exit(1); } int main(argc,argv) int argc; char **argv; { int flag = -1; /* default action unknown */ int fast = 0; /* fast halt/reboot, don't bother being nice. */ int i; struct stat dummy; char *monitor_code = ""; pid_t pid; if ((prog = strrchr(argv[0],'/')) == NULL) prog = argv[0]; else prog++; if (strcmp(prog, "halt") == 0) flag = RBT_HALT; if (strcmp(prog, "reboot") == 0) flag = RBT_REBOOT; i = 1; while (i < argc && argv[i][0] == '-') { char *opt = argv[i++] + 1; if (*opt == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'h': flag = RBT_HALT; break; case 'r': flag = RBT_REBOOT; break; case 'R': flag = RBT_RESET; break; case 'f': fast = 1; break; case 'x': flag = RBT_MONITOR; if (*opt == 0) { if (i == argc) usage(); opt = argv[i++]; } monitor_code = opt; opt = ""; break; default: usage(); } } if (i != argc) usage(); if (flag == -1) { fprintf(stderr, "Don't know what to do when named '%s'\n", prog); exit(1); } if (stat("/usr/bin", &dummy) < 0) { /* It seems that /usr isn't present, let's assume "-f." */ fast = 1; } write_log(); if (fast) { /* But not too fast... */ sleep(1); } else { /* Run the shutdown scripts. */ signal(SIGHUP, SIG_IGN); signal(SIGTERM, SIG_IGN); switch ((pid = fork())) { case -1: fprintf(stderr, "%s: can't fork(): %s\n", prog, strerror(errno)); exit(1); case 0: execl("/bin/sh", "sh", "/etc/rc", "down", (char *) NULL); fprintf(stderr, "%s: can't execute: /bin/sh: %s\n", prog, strerror(errno)); exit(1); default: while (waitpid(pid, NULL, 0) != pid) {} } /* Tell init to stop spawning getty's. */ kill(1, SIGTERM); /* Give everybody a chance to die peacefully. */ kill(-1, SIGTERM); sleep(3); } reboot(flag, monitor_code, strlen(monitor_code)); fprintf(stderr, "%s: reboot(): %s\n", strerror(errno)); return 1; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* log - log the shutdown's and the halt's Author: Edvard Tuinder <v892231@si.hhs.NL> shutdown is logged in /usr/adm/wtmp and in /usr/adm/log (if desired) halt is logged only in /usr/adm/wtmp as `halt' to prevent last from reporting halt's as crashes. */ #define _POSIX_SOURCE 1 #include <sys/types.h> #include <stdio.h> #include <utmp.h> #include <pwd.h> #include <fcntl.h> #include <time.h> #include <string.h> #include <unistd.h> #include <sys/utsname.h> #undef WTMP static char WTMP[] = "/usr/adm/wtmp"; /* Record of logins and logouts. */ static char SHUT_LOG[] = "/usr/adm/log"; char who[8]; extern char *prog; static char *month[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; void write_log _ARGS(( void )); void write_log() { int fd; static struct utmp wtmp; static struct passwd *pwd; char mes[90]; struct tm *tm; time_t now; struct utsname utsname; char *host = "localhost"; time(&now); tm = localtime(&now); if (uname(&utsname) >= 0) host = utsname.nodename; pwd = getpwuid(getuid()); if (pwd == (struct passwd *)0) strcpy (who,"root"); else strcpy (who,pwd->pw_name); fd = open(WTMP,O_APPEND|O_WRONLY,1); if (fd) { if (strcmp(prog,"reboot")) strcpy (wtmp.ut_user, prog); else strcpy (wtmp.ut_user, "shutdown"); /* last ... */ strcpy (wtmp.ut_id, "~~"); strcpy (wtmp.ut_line, "~"); wtmp.ut_pid = 0; wtmp.ut_type = BOOT_TIME; wtmp.ut_time = now; wtmp.ut_host[0]= '\0'; write (fd, (char *) &wtmp,sizeof(struct utmp)); close(fd); } fd = open(SHUT_LOG,O_APPEND|O_WRONLY,1); if (!fd) perror ("open"); else { sprintf (mes,"%s %02d %02d:%02d:%02d %s: system %s by %s@%s\n", month[tm->tm_mon],tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec, prog,prog,who,host); write (fd,mes,strlen(mes)); close(fd); } return; } ��������������������������������������������������������������������������������������������������������������������������������������/* wall - write to all logged in users Author: V. Archer */ /* Edvard Tuinder v892231@si.hhs.NL Modified some things to include this with my shutdown/halt package */ #define _POSIX_SOURCE 1 #include <sys/types.h> #include <fcntl.h> #include <pwd.h> #include <string.h> #include <stdio.h> #include <time.h> #include <utmp.h> #include <unistd.h> #include <sys/utsname.h> #include <sys/stat.h> #undef UTMP static char UTMP[] = "/etc/utmp"; /* Currently logged in users. */ void wall _ARGS(( char *when, char *extra )); void crnlcat _ARGS(( char *message, char *more )); void wall(when, extra) char *when; /* When is shutdown */ char *extra; /* If non-nil, why is the shutdown */ { struct utmp utmp; char utmptty[5 + sizeof(utmp.ut_line) + 1]; char message[1024]; struct passwd *pw; int utmpfd, ttyfd; char *ourtty, *ourname; time_t now; struct utsname utsname; struct stat con_st, tty_st; if (ourtty = ttyname(1)) { if (ourname = strrchr(ourtty, '/')) ourtty = ourname+1; } else ourtty = "system task"; if (pw = getpwuid(getuid())) ourname = pw->pw_name; else ourname = "unknown"; time(&now); if (uname(&utsname) != 0) strcpy(utsname.nodename, "?"); sprintf(message, "\r\nBroadcast message from %s@%s (%s)\r\n%.24s...\007\007\007\r\n", ourname, utsname.nodename, ourtty, ctime(&now)); crnlcat(message, when); crnlcat(message, extra); /* Search the UTMP database for all logged-in users. */ if ((utmpfd = open(UTMP, O_RDONLY)) < 0) { fprintf(stderr, "Cannot open utmp file\r\n"); return; } /* first the console */ strcpy(utmptty, "/dev/console"); if ((ttyfd = open(utmptty, O_WRONLY | O_NONBLOCK)) < 0) { perror(utmptty); } else { fstat(ttyfd, &con_st); write(ttyfd, message, strlen(message)); close(ttyfd); } while (read(utmpfd, (char *) &utmp, sizeof(utmp)) == sizeof(utmp)) { /* is this the user we are looking for? */ if (utmp.ut_type != USER_PROCESS) continue; strncpy(utmptty+5, utmp.ut_line, sizeof(utmp.ut_line)); utmptty[5 + sizeof(utmp.ut_line) + 1] = 0; if ((ttyfd = open(utmptty, O_WRONLY | O_NONBLOCK)) < 0) { perror(utmptty); continue; } fstat(ttyfd, &tty_st); if (tty_st.st_rdev != con_st.st_rdev) write(ttyfd, message, strlen(message)); close(ttyfd); } close(utmpfd); return; } void crnlcat(message, more) char *message, *more; { char *p = message; char *m = more; char *end = message + 1024 - 1; while (p < end && *p != 0) *p++; while (p < end && *m != 0) { if (*m == '\n' && (p == message || p[-1] != '\n')) { *p++ = '\r'; if (p == end) p--; } *p++ = *m++; } *p = 0; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* shutdown - close down the system graciously Author: Edvard Tuinder <v892231@si.hhs.NL> This program informs the users that the system is going down, when and why. After that a shutdown notice is written in both /usr/adm/wtmp and by syslog(3). Then reboot(2) is called to really close the system. This actually is a ``nice'' halt(8). Options are supposed to be as with BSD -h: shutdown and halt the system -r: shutdown and reboot -k: stop an already running shutdown -o: obsolete: not implemented New Minix options: -C: crash check, i.e. is the last wtmp entry a shutdown entry? -x: let the monitor execute the given code -R: reset the system */ #define _POSIX_SOURCE 1 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <ctype.h> #include <fcntl.h> #include <time.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <unistd.h> #include <utmp.h> #include <errno.h> #undef WTMP static char WTMP[] = "/usr/adm/wtmp"; static char SHUT_PID[] = "/usr/run/shutdown.pid"; static char NOLOGIN[] = "/etc/nologin"; #ifndef __STDC__ #define inform_user_time inf_time #define inform_user inf_user #endif void usage _ARGS(( void )); void write_pid _ARGS(( void )); int inform_user_time _ARGS(( void )); void inform_user _ARGS(( void )); void terminate _ARGS(( void )); void wall _ARGS(( char *when, char *extra )); int crash_check _ARGS(( void )); void parse_time _ARGS(( char *arg )); void get_message _ARGS(( void )); void main _ARGS(( int argc, char *argv[] )); char *itoa _ARGS(( int n )); long wait_time=0L; char message[1024]; char info[80]; int reboot_flag='h'; /* default is halt */ char *reboot_code=""; /* optional monitor code */ int info_min, info_hour; char *prog; void parse_time (arg) char *arg; { char *p = arg; int hours, minutes; time_t now; struct tm *tm; int delta = 0; int bad = 0; if (p[0] == '+') { delta = 1; p++; } hours = strtoul(p, &p, 10); if (*p == 0 && delta) { minutes = hours; hours = 0; } else { if (*p != ':' && *p != '.') bad = 1; else p++; minutes = strtoul(p, &p, 10); if (*p != 0) bad = 1; } if (bad) { fprintf(stderr,"Invalid time specification `%s'\n",arg); usage(); } time(&now); tm = localtime(&now); if (!delta) { hours -= tm->tm_hour; minutes -= tm->tm_min; } if (minutes < 0) { minutes += 60; hours--; } if (hours < 0) hours += 24; /* Time after midnight. */ tm->tm_hour += hours; tm->tm_min += minutes; (void) mktime(tm); info_hour = tm->tm_hour; info_min = tm->tm_min; sprintf(info, "The system will shutdown in %d hour%s and %d minute%s at %02d:%02d\n\n", hours,hours==1?"":"s",minutes,minutes==1?"":"s",info_hour,info_min); wait_time += hours * 3600 + minutes * 60; return; } void main(argc,argv) int argc; char *argv[]; { int i, now = 0, nologin = 0, want_terminate = 0, want_message = 0, check = 0; char *opt; int tty; static char HALT1[] = "-?"; static char *HALT[] = { "shutdown", HALT1, NULL, NULL }; /* Parse options. */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (argv[i][1] == '-' && argv[i][2] == 0) { /* -- */ i++; break; } for (opt = argv[i] + 1; *opt != 0; opt++) { switch (*opt) { case 'k': want_terminate = 1; break; case 'h': case 'r': case 'x': reboot_flag = *opt; if (reboot_flag == 'x') { if (*++opt == 0) { if (++i == argc) { fprintf (stderr,"shutdown: option '-x' requires an argument\n"); usage(); } opt=argv[i]; } reboot_code=opt; opt=""; } break; case 'R': reboot_flag = 'R'; break; case 'm': want_message = 1; break; case 'C': check = 1; break; default: fprintf (stderr,"shutdown: invalid option '-%c'\n",*opt); usage(); break; } } } if ((argc - i) > 2) usage(); if (check) exit(crash_check() ? 0 : 2); if (i == argc) { /* No timespec, assume "now". */ now = 1; } else { if (!strcmp(argv[i], "now")) now++; else parse_time(argv[i]); } if ((argc - i) == 2) { /* One line message */ strcat(message, argv[i+1]); strcat(message, "\n"); } if (want_terminate) terminate(); if (want_message) get_message(); puts(info); prog = strrchr(*argv,'/'); if (prog == (char *)0) prog = *argv; else prog++; if (!now) { /* Daemonize. */ switch (fork()) { case 0: break; case -1: fprintf(stderr, "%s: can't fork\n", prog); exit(1); default: exit(0); } /* Detach from the terminal (if any). */ if ((tty = open("/dev/tty", O_RDONLY)) != -1) { close(tty); setsid(); } write_pid(); } for (;;) { if (wait_time <= 5 * 60 && !nologin && !now) { close(creat(NOLOGIN,00644)); nologin = 1; } if (wait_time <= 60) break; if(inform_user_time()) inform_user(); sleep (60); wait_time -= 60; } if (!now) { inform_user(); sleep (30); /* Last minute before shutdown */ wait_time -= 30; inform_user(); sleep (30); /* Last 30 seconds before shutdown */ } wait_time = 0; inform_user(); unlink(SHUT_PID); /* No way of stopping anymore */ unlink(NOLOGIN); HALT[1][1] = reboot_flag; if (reboot_flag == 'x') HALT[2] = reboot_code; #if __minix_vmd execv("/usr/sbin/halt", HALT); #else execv("/usr/bin/halt", HALT); #endif if (errno != ENOENT) fprintf(stderr, "Can't execute 'halt': %s\n", strerror(errno)); sleep(2); reboot(RBT_HALT); fprintf(stderr, "Reboot call failed: %s\n", strerror(errno)); exit(1); } void usage() { fputs("Usage: shutdown [-hrRmk] [-x code] [time [message]]\n", stderr); fputs(" -h -> halt system after shutdown\n", stderr); fputs(" -r -> reboot system after shutdown\n", stderr); fputs(" -R -> reset system after shutdown\n", stderr); fputs(" -x -> return to the monitor doing...\n", stderr); fputs(" -m -> read a shutdown message from standard input\n", stderr); fputs(" -k -> stop an already running shutdown\n", stderr); fputs(" code -> boot monitor code to be executed\n", stderr); fputs(" time -> keyword ``now'', minutes before shutdown ``+5'',\n", stderr); fputs(" or absolute time specification ``11:20''\n", stderr); fputs(" message -> short shutdown message\n", stderr); exit(1); } void terminate() { FILE *in; pid_t pid; char c_pid[5]; char buf[80]; in = fopen(SHUT_PID,"r"); if (in == (FILE *)0) { fputs ("Can't get pid of shutdown process, probably not running shutdown\n", stderr); exit(1); } fgets(c_pid,5,in); fclose(in); pid = atoi(c_pid); if (kill(pid,9) == -1) fputs("Can't kill the shutdown process, probably not running anymore\n",stderr); else puts("Shutdown process terminated"); unlink(SHUT_PID); unlink(NOLOGIN); #ifdef not_very_useful in = fopen (SHUT_LOG,"a"); if (in == (FILE *)0) exit(0); sprintf (buf, "Shutdown with pid %d terminated\n",pid); fputs(buf,in); fclose(in); #endif exit(0); } void get_message() { char line[80]; int max_lines=12; puts ("Type your message. End with ^D at an empty line"); fputs ("shutdown> ",stdout);fflush(stdout); while (fgets(line,80,stdin) != (char *)0) { strcat (message,line); bzero(line,strlen(line)); fputs ("shutdown> ",stdout);fflush(stdout); } putc('\n',stdout);fflush(stdout); } int inform_user_time() { int min; min = wait_time /60; if (min == 60 || min == 30 || min == 15 || min == 10 || min <= 5) return 1; else return 0; } void inform_user() { int hour, minute; char mes[80]; hour = 0; minute = wait_time / 60; while (minute >= 60) { minute -= 60; hour++; } if (hour) sprintf(mes, "\nThe system will shutdown in %d hour%s and %d minute%s at %.02d:%.02d\n\n", hour,hour==1?"":"s",minute,minute==1?"":"s",info_hour,info_min); else if (minute > 1) sprintf(mes, "\nThe system will shutdown in %d minutes at %.02d:%.02d\n\n", K��K����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������minute,info_hour,info_min); else if (wait_time > 1) sprintf(mes, "\nThe system will shutdown in %d seconds\n\n", wait_time); else sprintf(mes, "\nThe system will shutdown NOW\n\n"); wall(mes,message); } void write_pid() { char pid[5]; int fd; fd = creat(SHUT_PID,00600); if (!fd) return; strncpy (pid,itoa(getpid()), sizeof(pid)); write (fd,pid,sizeof(pid)); close(fd); return; } int crash_check() { struct utmp last; int fd, crashed; struct stat st; if (stat(WTMP, &st) < 0 || st.st_size == 0) return 0; if ((fd = open(WTMP, O_RDONLY)) < 0) return 0; crashed = (lseek(fd, - (off_t) sizeof(last), SEEK_END) == -1 || read(fd, (void *) &last, sizeof(last)) != sizeof(last) || last.ut_line[0] != '~' || strncmp(last.ut_user, "shutdown", sizeof(last.ut_user))); close(fd); return crashed; } �����������������������������������������������������������������������������������������������������������������������������������������������������������/* tinyhalt 1.0 - small forerunner Author: Kees J. Bot * * Disk space on the root file system is a scarce resource. This little * program sits in /sbin. It normally calls the real halt/reboot, but if * that isn't available then it simply calls reboot(). Can't do any logging * of the event anyhow. */ #define nil 0 #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <unistd.h> int main(int argc, char **argv) { int flag; char *prog; /* Try to run the real McCoy. */ #if __minix_vmd execv("/usr/sbin/halt", argv); #else execv("/usr/bin/halt", argv); #endif if ((prog = strrchr(*argv,'/')) == nil) prog= argv[0]; else argv++; sleep(2); /* Not too fast. */ reboot(strcmp(prog, "reboot") == 0 ? RBT_REBOOT : RBT_HALT); write(2, "reboot call failed\n", 19); return 1; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .�������������..������������ DESCRIBE.sh��� M.sh���������� MAKEDEV.sh���� Makefile������ adduser.sh���� checkhier.sh�� makewhatis.sh� mkdist.sh����� setup.sh������ spell.sh������ srccrc.sh����� svclog.sh����� cd.sh��������� whatis.sh����� whereis.sh���� clear.sh����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # DESCRIBE 2.1 - Describe the given devices. Author: Kees J. Bot # # BUGS # - Arguments may not contain shell metacharacters. case $# in 0) flag=; set -$- /dev ;; *) flag=d ;; esac ls -l$flag $* | \ sed -e '/^total/d' \ -e '/^[^bc]/s/.* /BAD BAD /' \ -e '/^[bc]/s/.* \([0-9][0-9]*\), *\([0-9][0-9]*\).* /\1 \2 /' \ | { ex=0 # exit code while read major minor path do case $path in /*) name=`expr $path : '.*/\\(.*\\)$'` ;; *) name=$path esac dev= des= case $major in # One of the controllers? What is its controller nr? 3) ctrlr=0 ;; 8) ctrlr=1 ;; 10) ctrlr=2 ;; 12) ctrlr=3 ;; esac case $major,$minor in 1,0) des="RAM disk" dev=ram ;; 1,1) des="memory" dev=mem ;; 1,2) des="kernel memory" dev=kmem ;; 1,3) des="null device, data sink" dev=null ;; 2,*) drive=`expr $minor % 4` case `expr $minor - $drive` in 0) des='auto density' dev="fd$drive" ;; 4) des='360k, 5.25"' dev="pc$drive" ;; 8) des='1.2M, 5.25"' dev="at$drive" ;; 12) des='360k in 720k, 5.25"' dev="qd$drive" ;; 16) des='720k, 3.5"' dev="ps$drive" ;; 20) des='360k in 1.2M, 5.25"' dev="pat$drive" ;; 24) des='720k in 1.2M, 5.25"' dev="qh$drive" ;; 28) des='1.44M, 3.5"' dev="PS$drive" ;; 112) des='auto partition 0' dev="fd${drive}p0" ;; 116) des='auto partition 1' dev="fd${drive}p1" ;; 120) des='auto partition 2' dev="fd${drive}p2" ;; 124) des='auto partition 3' dev="fd${drive}p3" ;; *) dev=BAD esac des="floppy drive $drive ($des)" ;; [38],[05]|[38],[123][05]|1[02],[05]|1[02],[123][05]) drive=`expr $minor / 5` des="controller $ctrlr disk $drive" dev=c${ctrlr}d${drive} ;; [38],?|[38],[123]?|1[02],?|1[02],[123]?) drive=`expr $minor / 5` par=`expr $minor % 5 - 1` des="controller $ctrlr disk $drive partition $par" dev=c${ctrlr}d${drive}p${par} ;; [38],12[89]|[38],1[3-9]?|[38],2??|1[02],12[89]|1[02],1[3-9]?|1[02],2??) drive=`expr \\( $minor - 128 \\) / 16` par=`expr \\( \\( $minor - 128 \\) / 4 \\) % 4` sub=`expr \\( $minor - 128 \\) % 4` des="hard disk $drive, partition $par, subpartition $sub" des="controller $ctrlr disk $drive partition $par slice $sub" #par=`expr $drive '*' 5 + $par` dev=c${ctrlr}d${drive}p${par}s${sub} ;; [38],6[4-9]|[38],7?|1[02],6[4-9]|1[02],7?) tape=`expr \\( $minor - 64 \\) / 2` case $minor in *[02468]) des="controller $ctrlr tape $tape (non-rewinding)" dev=c${ctrlr}t${tape}n ;; *[13579]) des="controller $ctrlr tape $tape (rewinding)" dev=c${ctrlr}t${tape} esac ;; 4,0) des="console device" dev=console ;; 4,[1-7])des="virtual console $minor" dev=ttyc$minor ;; 4,15) des="diagnostics device" dev=log ;; 4,1[6-9]) line=`expr $minor - 16` des="serial line $line" dev=tty0$line ;; 4,12[89]|4,1[3-8]?|4,19[01]) p=`expr \\( $minor - 128 \\) / 16 | tr '0123' 'pqrs'` n=`expr $minor % 16` test $n -ge 10 && n=`expr $n - 10 | tr '012345' 'abcdef'` des="pseudo tty `expr $minor - 128`" dev=tty$p$n ;; 4,???) p=`expr \\( $minor - 192 \\) / 16 | tr '0123' 'pqrs'` n=`expr $minor % 16` test $n -ge 10 && n=`expr $n - 10 | tr '012345' 'abcdef'` des="controller of tty$p$n" dev=pty$p$n ;; 5,0) des="anonymous tty" dev=tty ;; 6,0) des="line printer, parallel port" dev=lp ;; 7,*) d=`expr $minor % 16` n=`expr $minor / 16` case $d in 1) case $name in psip*) des="Pseudo IP #$n" dev=psip ;; *) des="raw ethernet #$n" dev=eth esac ;; 2) des="raw IP #$n" dev=ip ;; 3) des="TCP/IP #$n" dev=tcp ;; 4) des="UDP #$n" dev=udp esac case $d in [1234]) if [ "$name" = "$dev" ] then des="$des (default)" else dev=$dev$n fi esac ;; 13,0) des="audio" dev=audio ;; 14,0) des="audio mixer" dev=mixer ;; BAD,BAD) des= dev= ;; *) dev=BAD esac case $name:$dev in *:) echo "$path: not a device" >&2 ex=1 ;; *:*BAD*) echo "$path: cannot describe: major=$major, minor=$minor" >&2 ex=1 ;; $dev:*) echo "$path: $des" ;; *:*) echo "$path: nonstandard name for $dev: $des" esac done exit $ex } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # M, U - mount or unmount standard devices. case $#:$2 in 1:|2:-r) ;; *) echo "Usage: $0 <abbreviation> [-r]" >&2; exit 1 esac . /etc/fstab dev=$1 dir=$1 case $1 in 0) dev=/dev/fd0 dir=fd0 ;; 1) dev=/dev/fd1 dir=fd1 ;; PS0|at0|fd0|pat0|pc0|ps0) dev=/dev/$dev dir=fd0 ;; PS1|at1|fd1|pat1|pc1|ps1) dev=/dev/$dev dir=fd1 ;; root) dev=$root ;; tmp) dev=$tmp ;; usr) dev=$usr ;; *) dev=/dev/$dev dir=mnt esac case $0 in *M) mount $dev /$dir $2 ;; *U) umount $dev esac ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # MAKEDEV 3.1 - Make special devices. Author: Kees J. Bot case $1 in -n) e=echo; shift ;; # Just echo when -n is given. *) e= esac case $#:$1 in 1:std) # Standard devices. set -$- mem fd0 fd1 fd0p0 fd1p0 \ c0d0 c0d0p0 c0d0p0s0 c0d1 c0d1p0 c0d1p0s0 \ c1d0 c1d0p0 c1d0p0s0 c1d1 c1d1p0 c1d1p0s0 \ tty ttyc1 ttyc2 ttyc3 tty00 tty01 ttyp0 ttyp1 ttyp2 ttyp3 eth ;; 0:|1:-\?) cat >&2 <<EOF Usage: $0 [-n] key ... Where key is one of the following: ram mem kmem null # One of these makes all these memory devices fd0 fd1 ... # Floppy devices for drive 0, 1, ... fd0p0 fd1p0 ... # Make floppy partitions fd0p[0-3], fd1p[0-3], ... c0d0 c0d1 ... # Make disks c0d0, c0d1, ... c0d0p0 c0d1p0 ... # Make partitions c0d0p[0-3], c0d1p[0-3], ... c0d0p0s0 c0d1p0s0 ... # Subparts c0d0p[0-3]s[0-3], c0d1p[0-3]s[0-3], ... c1d0(p0)(s0) # Likewise for controller 1 c0t0 c0t1 c1t0 ... # Make tape devices c0t0, c0t0n, c0t1, ... console lp tty log # One of these makes all four ttyc1 ... ttyc7 # Virtual consoles tty00 ... tty03 # Make serial lines ttyp0 ... ttyq0 ... # Make tty, pty pairs eth ip tcp udp # One of these makes some TCP/IP devices audio mixer # Make audio devices std # All standard devices EOF exit 1 esac umask 077 ex=0 for dev do case $dev in # One of the controllers? Precompute major device nr. c0*) maj=3 ;; c1*) maj=8 ;; c2*) maj=10 ;; c3*) maj=12 ;; esac case $dev in ram|mem|kmem|null) # Memory devices. # $e mknod ram b 1 0; $e chmod 600 ram $e mknod mem c 1 1; $e chmod 640 mem $e mknod kmem c 1 2; $e chmod 640 kmem $e mknod null c 1 3; $e chmod 666 null $e chgrp kmem ram mem kmem null ;; fd[0-3]) # Floppy disk drive n. # d=`expr $dev : '.*\\(.\\)'` # Drive number. $e mknod $dev b 2 $d $e chmod 666 $dev ;; pc[0-3]|at[0-3]|qd[0-3]|ps[0-3]|pat[0-3]|qh[0-3]|PS[0-3]) # Obsolete density locked floppy disk drive n. # d=`expr $dev : '.*\\(.\\)'` # Drive number. m=$d # Minor device number. $e mknod pc$d b 2 $m; m=`expr $m + 4` $e mknod at$d b 2 $m; m=`expr $m + 4` $e mknod qd$d b 2 $m; m=`expr $m + 4` $e mknod ps$d b 2 $m; m=`expr $m + 4` $e mknod pat$d b 2 $m; m=`expr $m + 4` $e mknod qh$d b 2 $m; m=`expr $m + 4` $e mknod PS$d b 2 $m; m=`expr $m + 4` $e chmod 666 pc$d at$d qd$d ps$d pat$d qh$d PS$d ;; fd[0-3]p[0-3]) # Floppy disk partitions. # n=`expr $dev : '\\(.*\\)..'` # Name prefix. d=`expr $dev : '..\\(.\\)'` # Drive number. m=`expr 112 + $d` # Minor of partition 0. alldev= for p in 0 1 2 3 do m=`expr 112 + $d + $p '*' 4` # Minor of partition $p. $e mknod ${n}p${p} b 2 $m # Make e.g. fd0p0 - fd0p3 alldev="$alldev ${n}p${p}" done $e chmod 666 $alldev ;; c[0-3]d[0-7]) # Whole disk devices. d=`expr $dev : '...\\(.\\)'` # Disk number. m=`expr $d '*' 5` # Minor device number. $e mknod $dev b $maj $m $e chmod 600 $dev ;; c[0-3]d[0-7]p[0-3]) # Disk primary partitions. n=`expr $dev : '\\(.*\\).'` # Name prefix. d=`expr $dev : '...\\(.\\)'` # Disk number. alldev= for p in 0 1 2 3 do m=`expr $d '*' 5 + 1 + $p` # Minor device number. $e mknod $n$p b $maj $m alldev="$alldev $n$p" done $e chmod 600 $alldev ;; c[0-3]d[0-7]p[0-3]s[0-3]) # Disk subpartition. n=`expr $dev : '\\(.*\\)...'` # Name prefix. d=`expr $dev : '...\\(.\\)'` # Disk number. alldev= for p in 0 1 2 3 do for s in 0 1 2 3 do m=`expr 128 + $d '*' 16 + $p '*' 4 + $s` # Minor device nr. $e mknod ${n}${p}s${s} b $maj $m alldev="$alldev ${n}${p}s${s}" done done $e chmod 600 $alldev ;; c[0-3]t[0-7]|c[0-3]t[0-7]n) # Tape devices. n=`expr $dev : '\\(....\\)'` # Name prefix. t=`expr $dev : '...\\(.\\)'` # Tape number. m=`expr 64 + $t '*' 2` # Minor device number. $e mknod ${n}n c $maj $m $e mknod ${n} c $maj `expr $m + 1` $e chmod 660 ${n}n ${n} ;; console|lp|tty|log) # Console, line printer, anonymous tty, diagnostics device. # $e mknod console c 4 0 $e chmod 600 console $e chgrp tty console $e mknod tty c 5 0 $e chmod 666 tty $e mknod lp c 6 0 $e chown daemon lp $e chgrp daemon lp $e chmod 200 lp $e mknod log c 4 15 $e chmod 222 log ;; ttyc[1-7]) # Virtual consoles. # m=`expr $dev : '....\\(.*\\)'` # Minor device number. $e mknod $dev c 4 $m $e chgrp tty $dev $e chmod 600 $dev ;; tty0[0-3]) # Serial lines. # n=`expr $dev : '.*\\(.\\)'` $e mknod $dev c 4 `expr $n + 16` $e chmod 666 $dev $e chgrp tty $dev ;; tty[p-s][0-9a-f]|pty[p-s][0-9a-f]) # Pseudo ttys. # dev=`expr $dev : '...\\(..\\)'` g=`expr $dev : '\\(.\\)'` # Which group. g=`echo $g | tr 'pqrs' '0123'` n=`expr $dev : '.\\(.\\)'` # Which pty in the group. case $n in [a-f]) n=1`echo $n | tr 'abcdef' '012345'` esac $e mknod tty$dev c 4 `expr $g '*' 16 + $n + 128` $e mknod pty$dev c 4 `expr $g '*' 16 + $n + 192` $e chgrp tty tty$dev pty$dev $e chmod 666 tty$dev pty$dev ;; eth|ip|tcp|udp|eth0|ip0|tcp0|udp0) # TCP/IP devices. # $e mknod eth0 c 7 1 # Network 0 (Ethernet) $e mknod ip0 c 7 2 $e mknod tcp0 c 7 3 $e mknod udp0 c 7 4 $e chmod 600 eth0 ip0 $e chmod 666 tcp0 udp0 $e ln -f eth0 eth # Default interface $e ln -f ip0 ip $e ln -f tcp0 tcp $e ln -f udp0 udp ;; audio|mixer) # Audio devices. # $e mknod audio c 13 0 $e mknod mixer c 14 0 $e chmod 666 audio mixer ;; *) echo "$0: don't know about $dev" >&2 ex=1 esac done exit $ex ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for cmd/scripts. CFLAGS = -D_MINIX -D_POSIX_SOURCE CCLD = $(CC) -i $(CFLAGS) MAKE = exec make -$(MAKEFLAGS) install all: # Does nothing install: usr root # Commands on the /usr partition. usr: \ /usr/bin/DESCRIBE \ /usr/bin/M \ /usr/bin/U \ /usr/bin/MAKEDEV \ /usr/bin/adduser \ /usr/bin/cd \ /usr/bin/[ \ /usr/bin/command \ /usr/bin/echo \ /usr/bin/expr \ /usr/bin/false \ /usr/bin/getopts \ /usr/bin/read \ /usr/bin/test \ /usr/bin/true \ /usr/bin/umask \ /usr/bin/wait \ /usr/bin/checkhier \ /usr/bin/clear \ /usr/bin/clr \ /usr/bin/makewhatis \ /usr/bin/mkdist \ /usr/bin/setup \ /usr/bin/spell \ /usr/bin/srccrc \ /usr/bin/svclog \ /usr/bin/whatis \ /usr/bin/apropos \ /usr/bin/whereis \ # Commands on the root partition. root: \ /bin/M \ /bin/U \ /bin/cd \ /bin/[ \ /bin/command \ /bin/echo \ /bin/expr \ /bin/false \ /bin/getopts \ /bin/read \ /bin/test \ /bin/true \ /bin/umask \ /bin/wait \ clean: /usr/bin/DESCRIBE: DESCRIBE.sh install -c -o bin $? $@ /usr/bin/M: M.sh install -c -o bin $? $@ /usr/bin/U: /usr/bin/M install -l $? $@ /usr/bin/MAKEDEV: MAKEDEV.sh install -c -o bin $? $@ /usr/bin/adduser: adduser.sh install -c -o bin $? $@ /usr/bin/cd: cd.sh install -c -o bin $? $@ /usr/bin/[ /usr/bin/command /usr/bin/echo /usr/bin/expr /usr/bin/false \ /usr/bin/getopts /usr/bin/read /usr/bin/test /usr/bin/true /usr/bin/umask \ /usr/bin/wait: /usr/bin/cd install -l $? $@ /usr/bin/checkhier: checkhier.sh install -c -o bin $? $@ /usr/bin/clear: clear.sh install -c -o bin $? $@ /usr/bin/clr: /usr/bin/clear install -l $? $@ /usr/bin/makewhatis: makewhatis.sh install -c -o bin $? $@ /usr/bin/mkdist: mkdist.sh install -c -o bin $? $@ /usr/bin/setup: setup.sh install -c -o bin $? $@ /usr/bin/spell: spell.sh install -c -o bin $? $@ /usr/bin/srccrc: srccrc.sh install -c -o bin $? $@ /usr/bin/svclog: svclog.sh install -c -o bin $? $@ /usr/bin/whatis: whatis.sh install -c -o bin $? $@ /usr/bin/apropos: /usr/bin/whatis install -l $? $@ /usr/bin/whereis: whereis.sh install -c -o bin $? $@ /bin/M: /usr/bin/M install -c -o bin $? $@ /bin/U: /bin/M install -l $? $@ /bin/cd: /usr/bin/cd install -lc $? $@ /bin/[ /bin/command /bin/echo /bin/expr /bin/false /bin/getopts \ /bin/read /bin/test /bin/true /bin/umask /bin/wait: /bin/cd install -l $? $@ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # adduser 1.0 - add a new user to the system Author: Kees J. Bot # 16 Jan 1996 # Check arguments. case "$#" in 3) user="$1"; group="$2"; home="$3" ;; *) echo "Usage: adduser user group home-dir" >&2; exit 1 esac # We need to be root. case "`id`" in 'uid=0('*) ;; *) echo "adduser: you must be root to add users" >&2; exit 1 esac # User and group names must be alphanumeric and no longer than 8 characters. len=`expr "$user" : '[a-z][a-z0-9]*$'` if [ "$len" -eq 0 -o "$len" -gt 8 ] then echo >&2 \ "adduser: the user name must be alphanumeric and no longer than 8 characters" exit 1 fi len=`expr "$group" : '[a-z][a-z0-9]*$'` if [ "$len" -eq 0 -o "$len" -gt 8 ] then echo >&2 \ "adduser: the group name must be alphanumeric and no longer than 8 characters" exit 1 fi # The new user name must not exist, but the group must exist. if grep "^$user:" /etc/passwd >/dev/null then echo "adduser: user $user already exists" >&2 exit 1 fi gid=`sed -e "/^$group:/!d" -e 's/^[^:]*:[^:]*:\\([^:]*\\):.*/\\1/' /etc/group` if [ `expr "$gid" : '[0-9]*$'` -eq 0 ] then echo "adduser: group $group does not exist" >&2 exit 1 fi # Find the first free user-id of 10 or higher. uid=10 while grep "^[^:]*:[^:]*:$uid:.*" /etc/passwd >/dev/null do uid=`expr $uid + 1` done # No interruptions. trap '' 1 2 3 15 # Lock the password file. ln /etc/passwd /etc/ptmp || { echo "adduser: password file busy, try again later" exit 1 } # Make the new home directory, it should not exist already. mkdir "$home" || { rm -rf /etc/ptmp exit 1 } # Make the new home directory by copying the honorary home directory of our # fearless leader. echo cpdir /usr/ast "$home" cpdir /usr/ast "$home" || { rm -rf /etc/ptmp "$home" exit 1 } # Change the ownership to the new user. echo chown -R $uid:$gid "$home" chown -R $uid:$group "$home" || { rm -rf /etc/ptmp "$home" exit 1 } # Is there a shadow password file? If so add an entry. if [ -f /etc/shadow ] then echo "echo $user::0:0::: >>/etc/shadow" echo "$user::0:0:::" >>/etc/shadow || { rm -rf /etc/ptmp "$home" exit 1 } pwd="##$user" else pwd= fi # Finish up by adding a password file entry. echo "echo $user:$pwd:$uid:$gid:$user:$home: >>/etc/passwd" echo "$user:$pwd:$uid:$gid:$user:$home:" >>/etc/passwd || { rm -rf /etc/ptmp "$home" exit 1 } # Remove the lock. rm /etc/ptmp || exit echo " The new user $user has been added to the system. Note that the password, full name, and shell may be changed with the commands passwd(1), chfn(1), and chsh(1). The password is now empty, so only console logins are possible." if [ $gid = 0 ] then echo "\ Also note that a new operator needs an executable search path (\$PATH) that does not contain the current directory (an empty field or "." in \$PATH)." fi exit 0 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # checkhier 2.7 - check the directory hierarchy Author: Kees J. Bot # 7 May 1995 case "`id`" in 'uid=0('*) ;; *) echo "$0: must be run by root" >&2 exit 1 esac # List of all interesting top level files and directories, with mode, # owner and group. Only the key files are listed, the rest is owned # by bin, has mode 755 or 644, and is not critical to the operation of # the system. { cat <<'EOF' drwxr-xr-x root operator / drwxr-xr-x bin operator /bin drwxr-xr-x root operator /dev drwxr-xr-x root operator /etc -rw-r--r-- root operator /etc/fstab -rw-r--r-- root operator /etc/group -rw-r--r-- root operator /etc/hostname.file -rw-r--r-- root operator /etc/inet.conf -rw-r--r-- root operator /etc/motd -rw-r--r-- root operator /etc/mtab -rw-r--r-- root operator /etc/passwd -rw-r--r-- root operator /etc/profile -rw-r--r-- root operator /etc/protocols -rw-r--r-- root operator /etc/rc -rw-r--r-- root operator /etc/services -rw------- root operator /etc/shadow -rw-r--r-- root operator /etc/termcap -rw-r--r-- root operator /etc/ttytab -rw-r--r-- root operator /etc/utmp dr-xr-xr-x root operator /fd0 dr-xr-xr-x root operator /fd1 dr-xr-xr-x root operator /mnt dr-xr-xr-x root operator /root drwxrwxrwx root operator /tmp drwxr-xr-x root operator /usr drwxr-xr-x root operator /usr/adm -rw-r--r-- root operator /usr/adm/lastlog -rw-r--r-- root operator /usr/adm/wtmp drwxr-xr-x ast other /usr/ast drwxr-xr-x bin operator /usr/bin drwxr-xr-x root operator /usr/etc drwxr-xr-x bin operator /usr/include drwxr-xr-x bin operator /usr/lib drwxrwxr-x root operator /usr/local drwxrwxr-x bin operator /usr/local/bin drwxrwxr-x bin operator /usr/local/include drwxrwxr-x bin operator /usr/local/lib drwxrwxr-x bin operator /usr/local/man drwxrwxr-x bin operator /usr/local/src drwxr-xr-x bin operator /usr/man drwxr-xr-x bin operator /usr/mdec drwx------ root operator /usr/preserve drwxr-xr-x root operator /usr/run drwxr-xr-x root operator /usr/spool drwx--x--x root operator /usr/spool/at drwx--x--x root operator /usr/spool/at/past drwx------ root operator /usr/spool/crontabs drwxrwxr-x root uucp /usr/spool/locks drwx------ daemon daemon /usr/spool/lpd drwxr-xr-x bin operator /usr/src drwxrwxrwx root operator /usr/tmp -rwsr-xr-x root ? /usr/bin/at -rwsr-xr-x root ? /usr/bin/chfn -rwsr-xr-x root ? /usr/bin/chsh -rwsr-xr-x root ? /usr/bin/df -rwsr-xr-x root ? /usr/bin/elvprsv -rwsr-xr-x root ? /usr/bin/elvrec -rwsr-xr-x root ? /usr/bin/format -rwsr-xr-x root ? /usr/bin/hostaddr -rwsr-xr-x root ? /usr/bin/install -rwsr-xr-x daemon ? /usr/bin/lpd -rwsr-xr-x root ? /usr/bin/mail -rwsr-xr-x root ? /usr/bin/mount -rwsr-xr-x root ? /usr/bin/passwd -rwsr-xr-x root ? /usr/bin/ping -rwxr-sr-x ? kmem /usr/bin/ps -rwsr-xr-- root ? /usr/bin/shutdown -rwsr-xr-x root ? /usr/bin/su -rwxr-sr-x ? uucp /usr/bin/term -rwsr-xr-x root ? /usr/bin/umount -rwxr-sr-x ? tty /usr/bin/write EOF } | { # Check if each file has the proper attributes. Offer a correction # if not. banner="\ # List of commands to fix the top level hierarchy. Do not apply these # commands blindly, but check and repair by hand. " while read mode owner group file do ( # "fix" a memory leak in set... set -$- `ls -ld $file 2>/dev/null` '' '' '' '' curmode=$1 curowner=$3 curgroup=$4 test $owner = '?' && curowner=$owner test $group = '?' && curgroup=$group # File types? if [ x`expr "$mode" : '\\(.\\)'` != \ x`expr "$curmode" : '\\(.\\)'` ] then case $curmode in ?*) echo "${banner}rm -r $file" banner= esac curmode= curowner= curgroup= case $mode in d*) echo "${banner}mkdir $file" ;; -*) echo "${banner}> $file" ;; *) echo "$0: $mode $file: unknown filetype" >&2 exit 1 esac banner= fi # Mode? if [ x$mode != x$curmode ] then octmode= m=$mode for i in u g o do r=0 w=0 x=0 case $m in ?r??*) r=4 esac case $m in ??w?*) w=2 esac case $m in ???[xst]*) x=1 esac octmode=$octmode`expr $r + $w + $x` m=`expr $m : '...\\(.*\\)'` done r=0 w=0 x=0 case $mode in ???[sS=]??????) r=4 esac case $mode in ??????[sS=]???) w=2 esac case $mode in ?????????[tT=]) x=1 esac case $r$w$x in 000) ;; *) octmode=`expr $r + $w + $x`$octmode esac echo "${banner}chmod $octmode $file" banner= fi # Ownership? if [ x$owner != x$curowner -o x$group != x$curgroup ] then echo "${banner}chown $owner:$group $file" banner= fi # The Minix shell forgets processes, so wait explicitly. wait case "$banner" in '') exit 1;; *) exit 0;; esac) || banner= done case "$banner" in '') exit 1 esac exit 0 } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # makewhatis 2.0 - make whatis(5) database. Author: Kees J. Bot. # # Make the whatis database of a man directory from the manual pages. case $1 in -*) set -$- x x esac case $# in 1) ;; *) echo "Usage: $0 <mandir>" >&2 exit 1 esac cd $1 || exit { # First pass, gathering the .SH NAME lines in various forms. # First the man[1-8] directories, the titles are under the .SH NAME # section header. for chap in 1 2 3 4 5 6 7 8 do for page in man$chap/*.$chap do if test -f "$page"; then # (Old sh barfs on 'continue') sed -e 's/ / /g /^\.SH NAME/,/^\.SH /!d /^\.SH /d s/\\f.//g # should not be needed s/\\s[+-].//g s/\\s.//g s/\\// '"s/ - / ($chap) - /" < "$page" fi done done # The Minix "Book style" documents, look for .CD for page in man9/*.9 do if test -f "$page"; then sed -e 's/ / /g /^\.CD /!d s/^[^"]*"// s/"[^"]*$// s/\\(en/-/g s/\\f.//g s/\\s[+-].//g s/\\s.//g s/\\\*(M2/MINIX/g s/\\// '"s/ - / (9) - /" < "$page" fi done # Some people throw extra flat text files into the cat[1-9] # directories. It would be nice if man(1) can find them. trap 'rm -f /tmp/mkw[cmn]$$; exit 1' 1 2 15 for chap in 1 2 3 4 5 6 7 8 9 do ls cat$chap 2>/dev/null >/tmp/mkwc$$ ls man$chap 2>/dev/null >/tmp/mkwm$$ comm -23 /tmp/mkwc$$ /tmp/mkwm$$ >/tmp/mkwn$$ sed -e "/.*\\.$chap\$/!d s/\\.$chap\$/ ($chap) - ???/" < /tmp/mkwn$$ done rm -f /tmp/mkw[cmn]$$ } | { # Second pass, remove empty lines, leading and trailing spaces, # multiple spaces to one space, remove lines without a dash. sed -e 's/ */ /g s/^ // s/ $// /^$/d /-/!d' } | { # Third pass, sort by section. sort -t'(' +1 -o whatis } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # mkdist 3.4 - Make a Minix distribution Author: Kees J. Bot # 20 Dec 1994 PATH=/bin:/usr/bin export PATH # Move out of /usr. case "$0" in /tmp/*) rm -f "$0" ;; *) cp -p "$0" /tmp/mkdist exec /tmp/mkdist esac usrlist=" bin bin/MAKEDEV bin/arch bin/badblocks bin/chmod bin/clone bin/compress bin/cp bin/cpdir bin/df `test -f /usr/bin/mtools || echo bin/dos*` `test -f /usr/bin/mtools && echo bin/mtools` bin/edparams bin/getty bin/grep bin/installboot bin/isodir bin/isoinfo bin/isoread bin/kill bin/ln bin/login bin/ls bin/mined bin/mkdir bin/mkfs bin/mknod bin/mkswap bin/mv bin/od bin/part bin/partition bin/readall bin/repartition bin/rm bin/rmdir bin/sed bin/setup bin/shutdown bin/sleep bin/sort bin/stty bin/sysenv bin/tar bin/uname bin/uncompress bin/update bin/vol bin/zcat etc etc/rc lib lib/keymaps `cd /usr && echo lib/keymaps/*` lib/pwdauth mdec mdec/boot mdec/bootblock mdec/jumpboot mdec/masterboot tmp " # Find the root device, and the real root device. . /etc/fstab realroot=`printroot -r` if [ $realroot = $root ] then rootdir=/ else umount $root >/dev/null 2>&1 mount $root /root || exit rootdir=/root fi echo -n " The installation root and /usr can be put on either one diskette of at least 1.2 Mb, or on two diskettes of at least 720 kb. Do you want to use a single diskette of at least 1.2 Mb? [y] "; read single case $single in ''|[yY]*|sure) single=true ;; *) single= esac echo -n "Which drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "Please type '0' or '1'" >&2; exit 1 esac if [ "$single" ] then echo -n "Insert the root+usr diskette in drive $drive and hit RETURN" else echo -n "Insert the root diskette in drive $drive and hit RETURN" fi read ret umount /dev/fd$drive 2>/dev/null umount /dev/fd${drive}p1 2>/dev/null mkfs -1 -i 272 /dev/fd$drive 480 || exit partition -mf /dev/fd$drive 0 81:960 81:240 81:240 >/dev/null || exit repartition /dev/fd$drive >/dev/null || exit mkfs -1 /dev/fd${drive}p1 || exit mkfs -1 /dev/fd${drive}p2 || exit mount /dev/fd$drive /mnt || exit mount /dev/fd${drive}p1 $rootdir/minix || exit # Hide /minix and /etc mount /dev/fd${drive}p2 $rootdir/etc 2>/dev/null # (complains about /etc/mtab) cpdir -vx $rootdir /mnt || exit install -d -o 0 -g 0 -m 755 /mnt || exit install -d -o 0 -g 0 -m 555 /mnt/root || exit install -d -o 0 -g 0 -m 555 /mnt/mnt || exit install -d -o 0 -g 0 -m 555 /mnt/usr || exit umount /dev/fd${drive}p2 || exit # Unhide /etc umount /dev/fd${drive}p1 || exit # Unhide /minix install -d -o 2 -g 0 -m 755 /mnt/minix || exit install -d -o 2 -g 0 -m 755 /mnt/etc || exit set `ls -t $rootdir/minix` # Install the latest kernel install -c $rootdir/minix/$1 /mnt/minix/`uname -r`.`uname -v` || exit cpdir -v /usr/src/etc /mnt/etc || exit # Install a fresh /etc chown -R 0:0 /mnt/etc # Patch up owner and mode chmod 600 /mnt/etc/shadow # Change /etc/fstab. echo >/mnt/etc/fstab "\ # Poor man's File System Table. root=unknown usr=unknown" # How to install? echo >/mnt/etc/issue "\ Login as root and run 'setup' to install Minix." umount /dev/fd$drive || exit umount $root 2>/dev/null installboot -d /dev/fd$drive /usr/mdec/bootblock boot >/dev/null # Partition the root floppy whether necessary or not. (Two images can be # concatenated, or a combined image can be split later.) partition -mf /dev/fd$drive 0 81:960 0:0 81:1440 81:480 >/dev/null || exit if [ "$single" ] then repartition /dev/fd$drive >/dev/null part=p2 else echo -n "Insert the usr diskette in drive $drive and hit RETURN" read ret part= fi mkfs -1 -i 96 /dev/fd$drive$part 720 || exit mount /dev/fd$drive$part /mnt || exit install -d -o 0 -g 0 -m 755 /mnt || exit (cd /usr && exec tar cfD - $usrlist) | (cd /mnt && exec tar xvfp -) || exit umount /dev/fd$drive$part || exit # Put a "boot the other drive" bootblock on the /usr floppy. installboot -m /dev/fd$drive$part /usr/mdec/masterboot >/dev/null # Guess the size of /usr in compressed form. Assume compression down to 60% # of the original size. Use "disk megabytes" of 1000 kb. set -$- `df | grep "^$usr"` size=`expr \\( $6 \\* 6 / 10 + 999 \\) / 1000` echo -n " You now need enough diskettes to hold /usr in compressed form, close to $size Mb total. " size= while [ -z "$size" ] do if [ "$single" ]; then defsize=1440; else defsize=720; fi echo -n "What is the size of the diskettes? [$defsize] "; read size case $size in '') size=$defsize ;; 360|720|1200|1440) ;; *) echo "Sorry, I don't believe \"$size\", try again." >&2 size= esac done drive= while [ -z "$drive" ] do echo -n "What floppy drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done echo " Enter the floppies in drive $drive when asked to. Mark them with the volume numbers! " sleep 2 if [ `arch` = i86 ]; then bits=13; else bits=16; fi >/tmp/LAST cd /usr && tar cvf - . /tmp/LAST \ | compress -b$bits | vol -w $size /dev/fd$drive && echo Done. ������������������������������������������������������������������������������������������������#!/bin/sh # # setup 4.1 - install a Minix distribution Author: Kees J. Bot # 20 Dec 1994 PATH=/bin:/usr/bin export PATH usage() { cat >&2 <<'EOF' Usage: setup # Install a skeleton system on the hard disk. setup /usr # Install the rest of the system (binaries or sources). # To install from other things then floppies: urlget http://... | setup /usr # Read from a web site. urlget ftp://... | setup /usr # Read from an FTP site. mtools copy c0d0p0:... - | setup /usr # Read from the C: drive. dosread c0d0p0 ... | setup /usr # Likewise if no mtools. EOF exit 1 } # No options. while getopts '' opt; do usage; done shift `expr $OPTIND - 1` # Installing a floppy set? case $# in 0) # No, we're installing a skeleton system on the hard disk. ;; 1) cd "$1" || exit # Annoying message still there? grep "'setup /usr'" /etc/issue >/dev/null 2>&1 && rm -f /etc/issue if [ -t 0 ] then size=bad while [ "$size" = bad ] do echo -n "\ What is the size of the images on the diskettes? [all] "; read size case $size in ''|360|720|1200|1440) ;; *) echo "Sorry, I don't believe \"$size\", try again." >&2 size=bad esac done drive= while [ -z "$drive" ] do echo -n "What floppy drive to use? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done vol -r $size /dev/fd$drive | uncompress | tar xvfp - else # Standard input is where we can get our files from. uncompress | tar xvfp - fi echo Done. exit ;; *) usage esac # Installing Minix on the hard disk. # Must be in / or we can't mount or umount. case "`pwd`" in /?*) echo "Please type 'cd /' first, you are locking up `pwd`" >&2 exit 1 esac case "$0" in /tmp/*) rm -f "$0" ;; *) cp -p "$0" /tmp/setup exec /tmp/setup esac # Find out what we are running from. exec 9<&0 </etc/mtab # Mounted file table. read thisroot rest # Current root (/dev/ram or /dev/fd?) read fdusr rest # USR (/dev/fd? or /dev/fd?p2) exec 0<&9 9<&- # What do we know about ROOT? case $thisroot:$fdusr in /dev/ram:/dev/fd0p2) fdroot=/dev/fd0 # Combined ROOT+USR in drive 0 ;; /dev/ram:/dev/fd1p2) fdroot=/dev/fd1 # Combined ROOT+USR in drive 1 ;; /dev/ram:/dev/fd*) fdroot=unknown # ROOT is some other floppy ;; /dev/fd*:/dev/fd*) fdroot=$thisroot # ROOT is mounted directly ;; *) fdroot=$thisroot # ? echo -n "\ It looks like Minix has been installed on disk already. Are you sure you know what you are doing? [n] " read yn case "$yn" in [yY]*|sure) ;; *) exit esac esac echo -n "\ This is the Minix installation script. Note 1: If the screen blanks suddenly then hit F3 to select \"software scrolling\". Note 2: If things go wrong then hit DEL and start over. Note 3: The installation procedure is described in the manual page usage(8). It will be hard without it. Note 4: Some questions have default answers, like this: [y] Simply hit RETURN (or ENTER) if you want to choose that answer. Note 5: If you see a colon (:) then you should hit RETURN to continue. :" read ret echo " What type of keyboard do you have? You can choose one of: " ls -C /usr/lib/keymaps | sed -e 's/\.map//g' -e 's/^/ /' echo -n " Keyboard type? [us-std] "; read keymap test -n "$keymap" && loadkeys "/usr/lib/keymaps/$keymap.map" echo -n " Minix needs one primary partition of at least 35 Mb. (It fits in 25 Mb, but it needs 35 Mb if fully recompiled. Add more space to taste, but don't overdo it, there are limits to the size of a file system.) If there is no free space on your disk then you have to back up one of the other partitions, shrink, and reinstall. See the appropriate manuals of the the operating systems currently installed. Restart your Minix installation after you have made space. To make this partition you will be put in the editor \"part\". Follow the advice under the '!' key to make a new partition of type MINIX. Do not touch an existing partition unless you know precisely what you are doing! Please note the name of the partition (e.g. c0d0p1, c0d1p3, c1d1p0) you make. (See the devices section in usage(8) on Minix device names.) :" read ret primary= while [ -z "$primary" ] do part || exit echo -n " Please finish the name of the primary partition you have created: (Just type RETURN if you want to rerun \"part\") /dev/" read primary done root=${primary}s0 swap=${primary}s1 usr=${primary}s2 hex2int() { # Translate hexadecimal to integer. local h d i h=$1 i=0 while [ -n "$h" ] do d=$(expr $h : '\(.\)') h=$(expr $h : '.\(.*\)') d=$(expr \( 0123456789ABCDEF : ".*$d" \) - 1) i=$(expr $i \* 16 + $d) done echo $i } # Compute the amount of memory available to Minix. memsize=0 ifs="$IFS" IFS=',' set -- $(sysenv memory) IFS="$ifs" for mem do mem=$(expr $mem : '.*:\(.*\)') memsize=$(expr $memsize + $(hex2int $mem) / 1024) done # Compute an advised swap size. swapadv=0 case `arch` in i86) test $memsize -lt 4096 && swapadv=$(expr 4096 - $memsize) ;; *) test $memsize -lt 6144 && swapadv=$(expr 6144 - $memsize) esac echo -n " How much swap space would you like? Swapspace is only needed if this system is memory starved, like a 16-bit system with less then 2M, or a 32-bit system with less then 4M. Minix swapping isn't very good yet, so there is no need for it otherwise. Size in kilobytes? [$swapadv] " swapsize= read swapsize test -z "$swapsize" && swapsize=$swapadv echo -n " You have created a partition named: /dev/$primary The following subpartitions are about to be created on /dev/$primary: Root subpartition: /dev/$root 1440 kb Swap subpartition: /dev/$swap $swapsize kb /usr subpartition: /dev/$usr rest of $primary Hit return if everything looks fine, or hit DEL to bail out if you want to think it over. The next step will destroy /dev/$primary. :" read ret # Secondary master bootstrap. installboot -m /dev/$primary /usr/mdec/masterboot >/dev/null || exit # Partition the primary. p3=0:0 test "$swapsize" -gt 0 && p3=81:`expr $swapsize \* 2` partition /dev/$primary 1 81:2880* $p3 81:0+ >/dev/null || exit if [ "$swapsize" -gt 0 ] then # We must have that swap, now! mkswap -f /dev/$swap || exit mount -s /dev/$swap || exit else # Forget about swap. swap= fi echo " Migrating from floppy to disk... " mkfs /dev/$usr echo "\ Scanning /dev/$usr for bad blocks. (Hit DEL to stop the scan if are absolutely sure that there can not be any bad blocks. Otherwise just wait.)" trap ': nothing' 2 readall -b /dev/$usr | sh echo "Scan done" sleep 2 trap 2 mount /dev/$usr /mnt || exit # Mount the intended /usr. cpdir -v /usr /mnt || exit # Copy the usr floppy. umount /dev/$usr || exit # Unmount the intended /usr. umount $fdusr # Unmount the /usr floppy. mount /dev/$usr /usr || exit # A new /usr if [ $fdroot = unknown ] then echo " By now the floppy USR has been copied to /dev/$usr, and it is now in use as /usr. Please insert the installation ROOT floppy in a floppy drive." drive= while [ -z "$drive" ] do echo -n "What floppy drive is it in? [0] "; read drive case $drive in '') drive=0 ;; [01]) ;; *) echo "It must be 0 or 1, not \"$drive\"." drive= esac done fdroot=/dev/fd$drive fi echo " Copying $fdroot to /dev/$root " mkfs /dev/$root || exit mount /dev/$root /mnt || exit if [ $thisroot = /dev/ram ] then # Running from the RAM disk, root image is on a floppy. mount $fdroot /root || exit cpdir -v /root /mnt || exit umount $fdroot || exit cpdir -f /dev /mnt/dev # Copy any extra MAKEDEV'd devices else # Running from the floppy itself. cpdir -vx / /mnt || exit chmod 555 /mnt/usr fi # Change /etc/fstab. echo >/mnt/etc/fstab "\ # Poor man's File System Table. root=/dev/$root ${swap:+swap=/dev/$swap} usr=/dev/$usr" # How to install further? echo >/mnt/etc/issue "\ Login as root and run 'setup /usr' to install floppy sets." # National keyboard map. test -n "$keyma!L��#L����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������p" && cp -p "/usr/lib/keymaps/$keymap.map" /mnt/etc/keymap umount /dev/$root || exit # Unmount the new root. # Compute size of the second level file block cache. case `arch` in i86) cache=`expr "0$memsize" - 1024` test $cache -lt 32 && cache=0 test $cache -gt 512 && cache=512 ;; *) cache=`expr "0$memsize" - 2560` test $cache -lt 64 && cache=0 test $cache -gt 1024 && cache=1024 esac echo "Second level file system block cache set to $cache kb." if [ $cache -eq 0 ]; then cache=; else cache="ramsize=$cache"; fi # Make bootable. installboot -d /dev/$root /usr/mdec/bootblock /boot >/dev/null || exit edparams /dev/$root "rootdev=$root; ramimagedev=$root; $cache; save" || exit echo " Please insert the installation ROOT floppy and type 'halt' to exit Minix. You can type 'boot $primary' to try the newly installed Minix system. See \"TESTING\" in the usage manual." ����������������������������������������������������������������������������������������������������������������������#!/bin/sh # # spell 1.1 - show unknown words Author: Kees J. Bot # 28 Apr 1995 dict=words while getopts 'd:' opt do case $opt in d) dict="$OPTARG" ;; ?) echo "Usage: spell [-d dict] [file ...]" >&2; exit 1 esac done shift `expr $OPTIND - 1` case "$dict" in */*) ;; *) dict="/usr/lib/dict/$dict" esac { if [ $# = 0 ] then prep else for file do prep "$file" done fi } | { sort -u | comm -23 - "$dict" } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # srccrc 1.0 - compute CRC checksums of the entire source tree # Author: Kees J. Bot cd /usr || exit { # List the file names of all files in /usr/include and /usr/src. find include src/* -type f } | { # Sort the list to make them comparable. sort } | { # Remove files like *.o, *.bak, etc. sed -e '/\.o$/d /\.a$/d /\.bak$/d /\/a\.out$/d /\/core$/d /\/bin\/[^/]*$/d' } | { # Compute checksums. xargs crc } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # svc=`basename $1 ,S`,S if test \( ! -r $svc \) -a -d "SVC" ; then svc=SVC/$svc ; fi grep '^#\*\*\*SVC' $svc ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # cd 1.3 - equivalents for normally builtin commands. Author: Kees J. Bot case $0 in */*) command="`expr "$0" : '.*/\(.*\)'`" ;; *) command="$0" esac "$command" "$@" ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # whatis/apropos 1.3 - search whatis(5) database for commands # Author: Kees J. Bot # BUGS # whatis file must be as if created by makewhatis(8). # all='exit 0' case "$1" in -a) all="found='exit 0'" shift esac case $#:$0 in 1:*whatis) ;; 1:*apropos) all="found='exit 0'" ;; *) echo "Usage: `basename $0` [-a] <keyword>" >&2 exit 1 esac IFS=":$IFS" MANPATH="${MANPATH-/usr/local/man:/usr/man}" found= for m in $MANPATH do for w in $m/whatis do test -f $w || continue case $0 in *whatis) grep "^($1|[^(]* $1)[ ,][^(]*\\(" $w && eval $all ;; *apropos) grep -i "$1" $w && eval $all esac done done $found echo "`basename $0`: $1: not found" >&2 exit 1 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh : List all system directories containing the argument : Author: Terrence W. Holm if test $# -ne 1; then echo "Usage: whereis name" exit 1 fi path="/bin /lib /etc\ /usr/bin /usr/lib\ /usr/include /usr/include/sys" for dir in $path; do for file in $dir/$1 $dir/$1.*; do if test -f $file; then echo $file elif test -d $file; then echo $file/ fi done done exit 0 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/bin/sh # # clear 1.0 - clear the screen Author: Kees J. Bot # 30 Mar 1996 export PATH=/bin:/usr/bin exec tget -str cl ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .�������������..������������ Makefile������ sh.h���������� sh1.c��������� sh2.c��������� sh3.c��������� sh4.c��������� sh5.c��������� sh6.c���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for sh CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -wa LDFLAGS = -i OBJ = sh1.o sh2.o sh3.o sh4.o sh5.o sh6.o all: sh sh: $(OBJ) cc $(LDFLAGS) -o $@ $(OBJ) install -S 11kw sh install: /usr/bin/msh /usr/bin/msh: sh install -cs -o bin $? $@ #/usr/bin/sh: /usr/bin/msh # install -l $? $@ # #/bin/sh: /usr/bin/msh # install -lcs $? $@ $(OBJ): sh.h clean: rm -f sh *.o *.bak core ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> /* Need a way to have void used for ANSI, nothing for K&R. */ #ifndef _ANSI #undef _VOID #define _VOID #endif /* -------- sh.h -------- */ /* * shell */ #define LINELIM 4096 #define NPUSH 8 /* limit to input nesting */ #define NOFILE 20 /* Number of open files */ #define NUFILE 10 /* Number of user-accessible files */ #define FDBASE 10 /* First file usable by Shell */ /* * values returned by wait */ #define WAITSIG(s) ((s)&0177) #define WAITVAL(s) (((s)>>8)&0377) #define WAITCORE(s) (((s)&0200)!=0) /* * library and system defintions */ #ifdef __STDC__ typedef void xint; /* base type of jmp_buf, for not broken compilers */ #else typedef char * xint; /* base type of jmp_buf, for broken compilers */ #endif /* * shell components */ /* #include "area.h" */ /* #include "word.h" */ /* #include "io.h" */ /* #include "var.h" */ #define QUOTE 0200 #define NOBLOCK ((struct op *)NULL) #define NOWORD ((char *)NULL) #define NOWORDS ((char **)NULL) #define NOPIPE ((int *)NULL) /* * Description of a command or an operation on commands. * Might eventually use a union. */ struct op { int type; /* operation type, see below */ char **words; /* arguments to a command */ struct ioword **ioact; /* IO actions (eg, < > >>) */ struct op *left; struct op *right; char *str; /* identifier for case and for */ }; #define TCOM 1 /* command */ #define TPAREN 2 /* (c-list) */ #define TPIPE 3 /* a | b */ #define TLIST 4 /* a [&;] b */ #define TOR 5 /* || */ #define TAND 6 /* && */ #define TFOR 7 #define TDO 8 #define TCASE 9 #define TIF 10 #define TWHILE 11 #define TUNTIL 12 #define TELIF 13 #define TPAT 14 /* pattern in case */ #define TBRACE 15 /* {c-list} */ #define TASYNC 16 /* c & */ /* * actions determining the environment of a process */ #define BIT(i) (1<<(i)) #define FEXEC BIT(0) /* execute without forking */ /* * flags to control evaluation of words */ #define DOSUB 1 /* interpret $, `, and quotes */ #define DOBLANK 2 /* perform blank interpretation */ #define DOGLOB 4 /* interpret [?* */ #define DOKEY 8 /* move words with `=' to 2nd arg. list */ #define DOTRIM 16 /* trim resulting string */ #define DOALL (DOSUB|DOBLANK|DOGLOB|DOKEY|DOTRIM) Extern char **dolv; Extern int dolc; Extern int exstat; Extern char gflg; Extern int talking; /* interactive (talking-type wireless) */ Extern int execflg; Extern int multiline; /* \n changed to ; */ Extern struct op *outtree; /* result from parser */ Extern xint *failpt; Extern xint *errpt; struct brkcon { jmp_buf brkpt; struct brkcon *nextlev; } ; Extern struct brkcon *brklist; Extern int isbreak; /* * redirection */ struct ioword { short io_unit; /* unit affected */ short io_flag; /* action (below) */ char *io_name; /* file name */ }; #define IOREAD 1 /* < */ #define IOHERE 2 /* << (here file) */ #define IOWRITE 4 /* > */ #define IOCAT 8 /* >> */ #define IOXHERE 16 /* ${}, ` in << */ #define IODUP 32 /* >&digit */ #define IOCLOSE 64 /* >&- */ #define IODEFAULT (-1) /* token for default IO unit */ Extern struct wdblock *wdlist; Extern struct wdblock *iolist; /* * parsing & execution environment */ extern struct env { char *linep; struct io *iobase; struct io *iop; xint *errpt; int iofd; struct env *oenv; } e; /* * flags: * -e: quit on error * -k: look for name=value everywhere on command line * -n: no execution * -t: exit after reading and executing one command * -v: echo as read * -x: trace * -u: unset variables net diagnostic */ extern char *flag; extern char *null; /* null value for variable */ extern int intr; /* interrupt pending */ Extern char *trap[_NSIG+1]; Extern char ourtrap[_NSIG+1]; Extern int trapset; /* trap pending */ extern int heedint; /* heed interrupt signals */ Extern int yynerrs; /* yacc */ Extern char line[LINELIM]; extern char *elinep; /* * other functions */ #ifdef __STDC__ int (*inbuilt(char *s ))(void); #else int (*inbuilt())(); #endif _PROTOTYPE(char *rexecve , (char *c , char **v , char **envp )); _PROTOTYPE(char *space , (int n )); _PROTOTYPE(char *strsave , (char *s , int a )); _PROTOTYPE(char *evalstr , (char *cp , int f )); _PROTOTYPE(char *putn , (int n )); _PROTOTYPE(char *itoa , (unsigned u , int n )); _PROTOTYPE(char *unquote , (char *as )); _PROTOTYPE(struct var *lookup , (char *n )); _PROTOTYPE(int rlookup , (char *n )); _PROTOTYPE(struct wdblock *glob , (char *cp , struct wdblock *wb )); _PROTOTYPE(int subgetc , (int ec , int quoted )); _PROTOTYPE(char **makenv , (void)); _PROTOTYPE(char **eval , (char **ap , int f )); _PROTOTYPE(int setstatus , (int s )); _PROTOTYPE(int waitfor , (int lastpid , int canintr )); _PROTOTYPE(void onintr , (int s )); /* SIGINT handler */ _PROTOTYPE(int newenv , (int f )); _PROTOTYPE(void quitenv , (void)); _PROTOTYPE(void err , (char *s )); _PROTOTYPE(int anys , (char *s1 , char *s2 )); _PROTOTYPE(int any , (int c , char *s )); _PROTOTYPE(void next , (int f )); _PROTOTYPE(void setdash , (void)); _PROTOTYPE(void onecommand , (void)); _PROTOTYPE(void runtrap , (int i )); _PROTOTYPE(void xfree , (char *s )); _PROTOTYPE(int letter , (int c )); _PROTOTYPE(int digit , (int c )); _PROTOTYPE(int letnum , (int c )); _PROTOTYPE(int gmatch , (char *s , char *p )); /* * error handling */ _PROTOTYPE(void leave , (void)); /* abort shell (or fail in subshell) */ _PROTOTYPE(void fail , (void)); /* fail but return to process next command */ _PROTOTYPE(void warn , (char *s )); _PROTOTYPE(void sig , (int i )); /* default signal handler */ /* -------- var.h -------- */ struct var { char *value; char *name; struct var *next; char status; }; #define COPYV 1 /* flag to setval, suggesting copy */ #define RONLY 01 /* variable is read-only */ #define EXPORT 02 /* variable is to be exported */ #define GETCELL 04 /* name & value space was got with getcell */ Extern struct var *vlist; /* dictionary */ Extern struct var *homedir; /* home directory */ Extern struct var *prompt; /* main prompt */ Extern struct var *cprompt; /* continuation prompt */ Extern struct var *path; /* search path for commands */ Extern struct var *shell; /* shell to interpret command files */ Extern struct var *ifs; /* field separators */ _PROTOTYPE(int yyparse , (void)); _PROTOTYPE(struct var *lookup , (char *n )); _PROTOTYPE(void setval , (struct var *vp , char *val )); _PROTOTYPE(void nameval , (struct var *vp , char *val , char *name )); _PROTOTYPE(void export , (struct var *vp )); _PROTOTYPE(void ronly , (struct var *vp )); _PROTOTYPE(int isassign , (char *s )); _PROTOTYPE(int checkname , (char *cp )); _PROTOTYPE(int assign , (char *s , int cf )); _PROTOTYPE(void putvlist , (int f , int out )); _PROTOTYPE(int eqname , (char *n1 , char *n2 )); _PROTOTYPE(int execute , (struct op *t , int *pin , int *pout , int act )); /* -------- io.h -------- */ /* io buffer */ struct iobuf { unsigned id; /* buffer id */ char buf[512]; /* buffer */ char *bufp; /* pointer into buffer */ char *ebufp; /* pointer to end of buffer */ }; /* possible arguments to an IO function */ struct ioarg { char *aword; char **awordlist; int afile; /* file descriptor */ unsigned afid; /* buffer id */ long afpos; /* file position */ struct iobuf *afbuf; /* buffer for this file */ }; Extern struct ioarg ioargstack[NPUSH]; #define AFID_NOBUF (~0) #define AFID_ID 0 /* an input generator's state */ struct io { int (*iofn)(_VOID); struct ioarg *argp; int peekc; char prev; /* previous character read by readc() */ char nlcount; /* for `'s */ char xchar; /* for `'s */ char task; /* reason for pushed IO */ }; Extern struct io iostack[NPUSH]; #define XOTHER 0 /* none of the below */ #define XDOLL 1 /* expanding ${} */ #define XGRAVE 2 /* expanding `'s */ #define XIO 3 /* file IO */ /* in substitution */ #define INSUB() (e.iop->task == XGRAVE || e.iop->task == XDOLL) /* * input generators for IO structure */ _PROTOTYPE(int nlchar , (struct ioarg *ap )); _PROTOTYPE(int strchar , (struct ioarg *ap )); _PROTOTYPE(int qstrchar , (struct ioarg *ap )); _PROTOTYPE(int filechar , (struct ioarg *ap )); _PROTOTYPE(int herechar , (struct ioar4L��6L��7L��8L��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������g *ap )); _PROTOTYPE(int linechar , (struct ioarg *ap )); _PROTOTYPE(int gravechar , (struct ioarg *ap , struct io *iop )); _PROTOTYPE(int qgravechar , (struct ioarg *ap , struct io *iop )); _PROTOTYPE(int dolchar , (struct ioarg *ap )); _PROTOTYPE(int wdchar , (struct ioarg *ap )); _PROTOTYPE(void scraphere , (void)); _PROTOTYPE(void freehere , (int area )); _PROTOTYPE(void gethere , (void)); _PROTOTYPE(void markhere , (char *s , struct ioword *iop )); _PROTOTYPE(int herein , (char *hname , int xdoll )); _PROTOTYPE(int run , (struct ioarg *argp , int (*f)(_VOID))); /* * IO functions */ _PROTOTYPE(int eofc , (void)); _PROTOTYPE(int getc , (int ec )); _PROTOTYPE(int readc , (void)); _PROTOTYPE(void unget , (int c )); _PROTOTYPE(void ioecho , (int c )); _PROTOTYPE(void prs , (char *s )); _PROTOTYPE(void putc , (int c )); _PROTOTYPE(void prn , (unsigned u )); _PROTOTYPE(void closef , (int i )); _PROTOTYPE(void closeall , (void)); /* * IO control */ _PROTOTYPE(void pushio , (struct ioarg *argp , int (*fn)(_VOID))); _PROTOTYPE(int remap , (int fd )); _PROTOTYPE(int openpipe , (int *pv )); _PROTOTYPE(void closepipe , (int *pv )); _PROTOTYPE(struct io *setbase , (struct io *ip )); extern struct ioarg temparg; /* temporary for PUSHIO */ #define PUSHIO(what,arg,gen) ((temparg.what = (arg)),pushio(&temparg,(gen))) #define RUN(what,arg,gen) ((temparg.what = (arg)), run(&temparg,(gen))) /* -------- word.h -------- */ #ifndef WORD_H #define WORD_H 1 struct wdblock { short w_bsize; short w_nword; /* bounds are arbitrary */ char *w_words[1]; }; _PROTOTYPE(struct wdblock *addword , (char *wd , struct wdblock *wb )); _PROTOTYPE(struct wdblock *newword , (int nw )); _PROTOTYPE(char **getwords , (struct wdblock *wb )); #endif /* -------- area.h -------- */ /* * storage allocation */ _PROTOTYPE(char *getcell , (unsigned nbytes )); _PROTOTYPE(void garbage , (void)); _PROTOTYPE(void setarea , (char *cp , int a )); _PROTOTYPE(int getarea , (char *cp )); _PROTOTYPE(void freearea , (int a )); _PROTOTYPE(void freecell , (char *cp )); Extern int areanum; /* current allocation area */ #define NEW(type) (type *)getcell(sizeof(type)) #define DELETE(obj) freecell((char *)obj) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern extern #include <sys/types.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include "sh.h" /* -------- sh.c -------- */ /* * shell */ /* #include "sh.h" */ int intr; int inparse; char flags['z'-'a'+1]; char *flag = flags-'a'; char *elinep = line+sizeof(line)-5; char *null = ""; int heedint =1; struct env e ={line, iostack, iostack-1, (xint *)NULL, FDBASE, (struct env *)NULL}; extern char **environ; /* environment pointer */ /* * default shell, search rules */ char shellname[] = "/bin/sh"; char search[] = ":/bin:/usr/bin"; _PROTOTYPE(void (*qflag), (int)) = SIG_IGN; _PROTOTYPE(int main, (int argc, char **argv )); _PROTOTYPE(int newfile, (char *s )); _PROTOTYPE(static char *findeq, (char *cp )); _PROTOTYPE(static char *cclass, (char *p, int sub )); _PROTOTYPE(void initarea, (void)); int main(argc, argv) int argc; register char **argv; { register int f; register char *s; int cflag; char *name, **ap; int (*iof)(); initarea(); if ((ap = environ) != NULL) { while (*ap) assign(*ap++, !COPYV); for (ap = environ; *ap;) export(lookup(*ap++)); } closeall(); areanum = 1; shell = lookup("SHELL"); if (shell->value == null) setval(shell, shellname); export(shell); homedir = lookup("HOME"); if (homedir->value == null) setval(homedir, "/"); export(homedir); setval(lookup("$"), itoa(getpid(), 5)); path = lookup("PATH"); if (path->value == null) setval(path, search); export(path); ifs = lookup("IFS"); if (ifs->value == null) setval(ifs, " \t\n"); prompt = lookup("PS1"); if (prompt->value == null) #ifndef UNIXSHELL setval(prompt, "$ "); #else setval(prompt, "% "); #endif if (geteuid() == 0) { setval(prompt, "# "); prompt->status &= ~EXPORT; } cprompt = lookup("PS2"); if (cprompt->value == null) setval(cprompt, "> "); iof = filechar; cflag = 0; name = *argv++; if (--argc >= 1) { if(argv[0][0] == '-' && argv[0][1] != '\0') { for (s = argv[0]+1; *s; s++) switch (*s) { case 'c': prompt->status &= ~EXPORT; cprompt->status &= ~EXPORT; setval(prompt, ""); setval(cprompt, ""); cflag = 1; if (--argc > 0) PUSHIO(aword, *++argv, iof = nlchar); break; case 'q': qflag = SIG_DFL; break; case 's': /* standard input */ break; case 't': prompt->status &= ~EXPORT; setval(prompt, ""); iof = linechar; break; case 'i': talking++; default: if (*s>='a' && *s<='z') flag[*s]++; } } else { argv--; argc++; } if (iof == filechar && --argc > 0) { setval(prompt, ""); setval(cprompt, ""); prompt->status &= ~EXPORT; cprompt->status &= ~EXPORT; if (newfile(name = *++argv)) exit(1); } } setdash(); if (e.iop < iostack) { PUSHIO(afile, 0, iof); if (isatty(0) && isatty(1) && !cflag) talking++; } signal(SIGQUIT, qflag); if (name && name[0] == '-') { talking++; if ((f = open(".profile", 0)) >= 0) next(remap(f)); if ((f = open("/etc/profile", 0)) >= 0) next(remap(f)); } if (talking) signal(SIGTERM, sig); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, onintr); dolv = argv; dolc = argc; dolv[0] = name; if (dolc > 1) for (ap = ++argv; --argc > 0;) if (assign(*ap = *argv++, !COPYV)) dolc--; /* keyword */ else ap++; setval(lookup("#"), putn((--dolc < 0) ? (dolc = 0) : dolc)); for (;;) { if (talking && e.iop <= iostack) prs(prompt->value); onecommand(); } } void setdash() { register char *cp, c; char m['z'-'a'+1]; cp = m; for (c='a'; c<='z'; c++) if (flag[c]) *cp++ = c; *cp = 0; setval(lookup("-"), m); } int newfile(s) register char *s; { register f; if (strcmp(s, "-") != 0) { f = open(s, 0); if (f < 0) { prs(s); err(": cannot open"); return(1); } } else f = 0; next(remap(f)); return(0); } void onecommand() { register i; jmp_buf m1; while (e.oenv) quitenv(); areanum = 1; freehere(areanum); freearea(areanum); garbage(); wdlist = 0; iolist = 0; e.errpt = 0; e.linep = line; yynerrs = 0; multiline = 0; inparse = 1; intr = 0; execflg = 0; setjmp(failpt = m1); /* Bruce Evans' fix */ if (setjmp(failpt = m1) || yyparse() || intr) { while (e.oenv) quitenv(); scraphere(); if (!talking && intr) leave(); inparse = 0; intr = 0; return; } inparse = 0; brklist = 0; intr = 0; execflg = 0; if (!flag['n']) execute(outtree, NOPIPE, NOPIPE, 0); if (!talking && intr) { execflg = 0; leave(); } if ((i = trapset) != 0) { trapset = 0; runtrap(i); } } void fail() { longjmp(failpt, 1); /* NOTREACHED */ } void leave() { if (execflg) fail(); scraphere(); freehere(1); runtrap(0); exit(exstat); /* NOTREACHED */ } void warn(s) register char *s; { if(*s) { prs(s); exstat = -1; } prs("\n"); if (flag['e']) leave(); } void err(s) char *s; { warn(s); if (flag['n']) return; if (!talking) leave(); if (e.errpt) longjmp(e.errpt, 1); closeall(); e.iop = e.iobase = iostack; } int newenv(f) int f; { register struct env *ep; if (f) { quitenv(); return(1); } ep = (struct env *) space(sizeof(*ep)); if (ep == NULL) { while (e.oenv) quitenv(); fail(); } *ep = e; e.oenv = ep; e.errpt = errpt; return(0); } void quitenv() { register struct env *ep; register fd; if ((ep = e.oenv) != NULL) { fd = e.iofd; e = *ep; /* should close `'d files */ DELETE(ep); while (--fd >= e.iofd) close(fd); } } /* * Is any character from s1 in s2? */ int anys(s1, s2) register char *s1, *s2; { while (*s1) if (any(*s1++, s2)) return(1); return(0); } /* * Is character c in s? */ int any(c, s) register int c; register char *s; { while (*s) if (*s++ == c) return(1); return(0); } char * putn(n) register int n; { return(itoa(n, -1)); } char * itoa(u, n) register unsigned u; int n; { register char *cp; static char s[20]; int m; m = 0; if (n < 0 && (int) u < 0) { m++; u = -u; } cp = s+sizeof(s); *--cp = 0; do { *--cp = u%10 + '0'; u /= 10; } while (--n > 0 || u); if (m) *--cp = '-'; return(cp); } void next(f) int f; { PUSHIO(afile, f, filechar); } void onintr(s) int s; /* ANSI C requires a parameter */ { signal(SIGINT, onintr); intr = 1; if (talking) { if (inparse) { prs("\n"); fail(); } } else if (heedint) { execflg = 0; leave(); } } int letter(c) register c; { return((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'); } int digit(c) register c; { return(c >= '0' && c <= '9'); } int letnum(c) register c; { return(letter(c) || digit(c)); } char * space(n) int n; { register char *cp; if ((cp = getcell(n)) == 0) err("out of string space"); return(cp); } char * strsave(s, a) register char *s; int a; { register char *cp, *xp; if ((cp = space(strlen(s)+1)) != NULL) { setarea((char *)cp, a); for (xp = cp; (*xp++ = *s++) != '\0';) ; return(cp); } return(""); } void xfree(s) register char *s; { DELETE(s); } /* * trap handling */ void sig(i) register int i; { trapset = i; signal(i, sig); } void runtrap(i) int i; { char *trapstr; if ((trapstr = trap[i]) == NULL) return; if (i == 0) trap[i] = 0; RUN(aword, trapstr, nlchar); } /* -------- var.c -------- */ /* #include "sh.h" */ /* * Find the given name in the dictionary * and return its value. If the name was * not previously there, enter it now and * return a null value. */ struct var * lookup(n) register char *n; { register struct var *vp; register char *cp; register int c; static struct var dummy; if (digit(*n)) { dummy.name = n; for (c = 0; digit(*n) && c < 1000; n++) c = c*10 + *n-'0'; dummy.status = RONLY; dummy.value = c <= dolc? dolv[c]: null; return(&dummy); } for (vp = vlist; vp; vp = vp->next) if (eqname(vp->name, n)) return(vp); cp = findeq(n); vp = (struct var *)space(sizeof(*vp)); if (vp == 0 || (vp->name = space((int)(cp-n)+2)) == 0) { dummy.name = dummy.value = ""; return(&dummy); } for (cp = vp->name; (*cp = *n++) && *cp != '='; cp++) ; if (*cp == 0) *cp = '='; *++cp = 0; setarea((char *)vp, 0); setarea((char *)vp->name, 0); vp-@L��BL��CL��DL��EL��FL��GL��HL����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>value = null; vp->next = vlist; vp->status = GETCELL; vlist = vp; return(vp); } /* * give variable at `vp' the value `val'. */ void setval(vp, val) struct var *vp; char *val; { nameval(vp, val, (char *)NULL); } /* * if name is not NULL, it must be * a prefix of the space `val', * and end with `='. * this is all so that exporting * values is reasonably painless. */ void nameval(vp, val, name) register struct var *vp; char *val, *name; { register char *cp, *xp; char *nv; int fl; if (vp->status & RONLY) { for (xp = vp->name; *xp && *xp != '=';) putc(*xp++); err(" is read-only"); return; } fl = 0; if (name == NULL) { xp = space(strlen(vp->name)+strlen(val)+2); if (xp == 0) return; /* make string: name=value */ setarea((char *)xp, 0); name = xp; for (cp = vp->name; (*xp = *cp++) && *xp!='='; xp++) ; if (*xp++ == 0) xp[-1] = '='; nv = xp; for (cp = val; (*xp++ = *cp++) != '\0';) ; val = nv; fl = GETCELL; } if (vp->status & GETCELL) xfree(vp->name); /* form new string `name=value' */ vp->name = name; vp->value = val; vp->status |= fl; } void export(vp) struct var *vp; { vp->status |= EXPORT; } void ronly(vp) struct var *vp; { if (letter(vp->name[0])) /* not an internal symbol ($# etc) */ vp->status |= RONLY; } int isassign(s) register char *s; { if (!letter((int)*s)) return(0); for (; *s != '='; s++) if (*s == 0 || !letnum(*s)) return(0); return(1); } int assign(s, cf) register char *s; int cf; { register char *cp; struct var *vp; if (!letter(*s)) return(0); for (cp = s; *cp != '='; cp++) if (*cp == 0 || !letnum(*cp)) return(0); vp = lookup(s); nameval(vp, ++cp, cf == COPYV? (char *)NULL: s); if (cf != COPYV) vp->status &= ~GETCELL; return(1); } int checkname(cp) register char *cp; { if (!letter(*cp++)) return(0); while (*cp) if (!letnum(*cp++)) return(0); return(1); } void putvlist(f, out) register int f, out; { register struct var *vp; for (vp = vlist; vp; vp = vp->next) if (vp->status & f && letter(*vp->name)) { if (vp->status & EXPORT) write(out, "export ", 7); if (vp->status & RONLY) write(out, "readonly ", 9); write(out, vp->name, (int)(findeq(vp->name) - vp->name)); write(out, "\n", 1); } } int eqname(n1, n2) register char *n1, *n2; { for (; *n1 != '=' && *n1 != 0; n1++) if (*n2++ != *n1) return(0); return(*n2 == 0 || *n2 == '='); } static char * findeq(cp) register char *cp; { while (*cp != '\0' && *cp != '=') cp++; return(cp); } /* -------- gmatch.c -------- */ /* * int gmatch(string, pattern) * char *string, *pattern; * * Match a pattern as in sh(1). */ #define CMASK 0377 #define QUOTE 0200 #define QMASK (CMASK&~QUOTE) #define NOT '!' /* might use ^ */ int gmatch(s, p) register char *s, *p; { register int sc, pc; if (s == NULL || p == NULL) return(0); while ((pc = *p++ & CMASK) != '\0') { sc = *s++ & QMASK; switch (pc) { case '[': if ((p = cclass(p, sc)) == NULL) return(0); break; case '?': if (sc == 0) return(0); break; case '*': s--; do { if (*p == '\0' || gmatch(s, p)) return(1); } while (*s++ != '\0'); return(0); default: if (sc != (pc&~QUOTE)) return(0); } } return(*s == 0); } static char * cclass(p, sub) register char *p; register int sub; { register int c, d, not, found; if ((not = *p == NOT) != 0) p++; found = not; do { if (*p == '\0') return((char *)NULL); c = *p & CMASK; if (p[1] == '-' && p[2] != ']') { d = p[2] & CMASK; p++; } else d = c; if (c == sub || (c <= sub && sub <= d)) found = !not; } while (*++p != ']'); return(found? p+1: (char *)NULL); } /* -------- area.c -------- */ #define REGSIZE sizeof(struct region) #define GROWBY 256 #undef SHRINKBY 64 #define FREE 32767 #define BUSY 0 #define ALIGN (sizeof(int)-1) /* #include "area.h" */ struct region { struct region *next; int area; }; /* * All memory between (char *)areabot and (char *)(areatop+1) is * exclusively administered by the area management routines. * It is assumed that sbrk() and brk() manipulate the high end. */ static struct region *areabot; /* bottom of area */ static struct region *areatop; /* top of area */ static struct region *areanxt; /* starting point of scan */ void initarea() { while ((int)sbrk(0) & ALIGN) sbrk(1); areabot = (struct region *)sbrk(REGSIZE); areabot->next = areabot; areabot->area = BUSY; areatop = areabot; areanxt = areabot; } char * getcell(nbytes) unsigned nbytes; { register int nregio; register struct region *p, *q; register i; if (nbytes == 0) abort(); /* silly and defeats the algorithm */ /* * round upwards and add administration area */ nregio = (nbytes+(REGSIZE-1))/REGSIZE + 1; for (p = areanxt;;) { if (p->area > areanum) { /* * merge free cells */ while ((q = p->next)->area > areanum && q != areanxt) p->next = q->next; /* * exit loop if cell big enough */ if (q >= p + nregio) goto found; } p = p->next; if (p == areanxt) break; } i = nregio >= GROWBY ? nregio : GROWBY; p = (struct region *)sbrk(i * REGSIZE); if (p == (struct region *)-1) return((char *)NULL); p--; if (p != areatop) abort(); /* allocated areas are contiguous */ q = p + i; p->next = q; p->area = FREE; q->next = areabot; q->area = BUSY; areatop = q; found: /* * we found a FREE area big enough, pointed to by 'p', and up to 'q' */ areanxt = p + nregio; if (areanxt < q) { /* * split into requested area and rest */ if (areanxt+1 > q) abort(); /* insufficient space left for admin */ areanxt->next = q; areanxt->area = FREE; p->next = areanxt; } p->area = areanum; return((char *)(p+1)); } void freecell(cp) char *cp; { register struct region *p; if ((p = (struct region *)cp) != NULL) { p--; if (p < areanxt) areanxt = p; p->area = FREE; } } void freearea(a) register int a; { register struct region *p, *top; top = areatop; for (p = areabot; p != top; p = p->next) if (p->area >= a) p->area = FREE; } void setarea(cp,a) char *cp; int a; { register struct region *p; if ((p = (struct region *)cp) != NULL) (p-1)->area = a; } int getarea(cp) char *cp; { return ((struct region*)cp-1)->area; } void garbage() { register struct region *p, *q, *top; top = areatop; for (p = areabot; p != top; p = p->next) { if (p->area > areanum) { while ((q = p->next)->area > areanum) p->next = q->next; areanxt = p; } } #ifdef SHRINKBY if (areatop >= q + SHRINKBY && q->area > areanum) { brk((char *)(q+1)); q->next = areabot; q->area = BUSY; areatop = q; } #endif } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern extern #include <sys/types.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include "sh.h" /* -------- csyn.c -------- */ /* * shell: syntax (C version) */ typedef union { char *cp; char **wp; int i; struct op *o; } YYSTYPE; #define WORD 256 #define LOGAND 257 #define LOGOR 258 #define BREAK 259 #define IF 260 #define THEN 261 #define ELSE 262 #define ELIF 263 #define FI 264 #define CASE 265 #define ESAC 266 #define FOR 267 #define WHILE 268 #define UNTIL 269 #define DO 270 #define DONE 271 #define IN 272 #define YYERRCODE 300 /* flags to yylex */ #define CONTIN 01 /* skip new lines to complete command */ /* #include "sh.h" */ #define SYNTAXERR zzerr() static int startl; static int peeksym; static int nlseen; static int iounit = IODEFAULT; static YYSTYPE yylval; _PROTOTYPE(static struct op *pipeline, (int cf )); _PROTOTYPE(static struct op *andor, (void)); _PROTOTYPE(static struct op *c_list, (void)); _PROTOTYPE(static int synio, (int cf )); _PROTOTYPE(static void musthave, (int c, int cf )); _PROTOTYPE(static struct op *simple, (void)); _PROTOTYPE(static struct op *nested, (int type, int mark )); _PROTOTYPE(static struct op *command, (int cf )); _PROTOTYPE(static struct op *dogroup, (int onlydone )); _PROTOTYPE(static struct op *thenpart, (void)); _PROTOTYPE(static struct op *elsepart, (void)); _PROTOTYPE(static struct op *caselist, (void)); _PROTOTYPE(static struct op *casepart, (void)); _PROTOTYPE(static char **pattern, (void)); _PROTOTYPE(static char **wordlist, (void)); _PROTOTYPE(static struct op *list, (struct op *t1, struct op *t2 )); _PROTOTYPE(static struct op *block, (int type, struct op *t1, struct op *t2, char **wp )); _PROTOTYPE(static struct op *newtp, (void)); _PROTOTYPE(static struct op *namelist, (struct op *t )); _PROTOTYPE(static char **copyw, (void)); _PROTOTYPE(static void word, (char *cp )); _PROTOTYPE(static struct ioword **copyio, (void)); _PROTOTYPE(static struct ioword *io, (int u, int f, char *cp )); _PROTOTYPE(static void zzerr, (void)); _PROTOTYPE(void yyerror, (char *s )); _PROTOTYPE(static int yylex, (int cf )); _PROTOTYPE(int collect, (int c, int c1 )); _PROTOTYPE(int dual, (int c )); _PROTOTYPE(static void diag, (int ec )); _PROTOTYPE(static char *tree, (unsigned size )); _PROTOTYPE(void printf, (char *s )); int yyparse() { startl = 1; peeksym = 0; yynerrs = 0; outtree = c_list(); musthave('\n', 0); return(yynerrs!=0); } static struct op * pipeline(cf) int cf; { register struct op *t, *p; register int c; t = command(cf); if (t != NULL) { while ((c = yylex(0)) == '|') { if ((p = command(CONTIN)) == NULL) SYNTAXERR; if (t->type != TPAREN && t->type != TCOM) { /* shell statement */ t = block(TPAREN, t, NOBLOCK, NOWORDS); } t = block(TPIPE, t, p, NOWORDS); } peeksym = c; } return(t); } static struct op * andor() { register struct op *t, *p; register int c; t = pipeline(0); if (t != NULL) { while ((c = yylex(0)) == LOGAND || c == LOGOR) { if ((p = pipeline(CONTIN)) == NULL) SYNTAXERR; t = block(c == LOGAND? TAND: TOR, t, p, NOWORDS); } peeksym = c; } return(t); } static struct op * c_list() { register struct op *t, *p; register int c; t = andor(); if (t != NULL) { if((peeksym = yylex(0)) == '&') t = block(TASYNC, t, NOBLOCK, NOWORDS); while ((c = yylex(0)) == ';' || c == '&' || (multiline && c == '\n')) { if ((p = andor()) == NULL) return(t); if((peeksym = yylex(0)) == '&') p = block(TASYNC, p, NOBLOCK, NOWORDS); t = list(t, p); } peeksym = c; } return(t); } static int synio(cf) int cf; { register struct ioword *iop; register int i; register int c; if ((c = yylex(cf)) != '<' && c != '>') { peeksym = c; return(0); } i = yylval.i; musthave(WORD, 0); iop = io(iounit, i, yylval.cp); iounit = IODEFAULT; if (i & IOHERE) markhere(yylval.cp, iop); return(1); } static void musthave(c, cf) int c, cf; { if ((peeksym = yylex(cf)) != c) SYNTAXERR; peeksym = 0; } static struct op * simple() { register struct op *t; t = NULL; for (;;) { switch (peeksym = yylex(0)) { case '<': case '>': (void) synio(0); break; case WORD: if (t == NULL) { t = newtp(); t->type = TCOM; } peeksym = 0; word(yylval.cp); break; default: return(t); } } } static struct op * nested(type, mark) int type, mark; { register struct op *t; multiline++; t = c_list(); musthave(mark, 0); multiline--; return(block(type, t, NOBLOCK, NOWORDS)); } static struct op * command(cf) int cf; { register struct op *t; struct wdblock *iosave; register int c; iosave = iolist; iolist = NULL; if (multiline) cf |= CONTIN; while (synio(cf)) cf = 0; switch (c = yylex(cf)) { default: peeksym = c; if ((t = simple()) == NULL) { if (iolist == NULL) return((struct op *)NULL); t = newtp(); t->type = TCOM; } break; case '(': t = nested(TPAREN, ')'); break; case '{': t = nested(TBRACE, '}'); break; case FOR: t = newtp(); t->type = TFOR; musthave(WORD, 0); startl = 1; t->str = yylval.cp; multiline++; t->words = wordlist(); if ((c = yylex(0)) != '\n' && c != ';') peeksym = c; t->left = dogroup(0); multiline--; break; case WHILE: case UNTIL: multiline++; t = newtp(); t->type = c == WHILE? TWHILE: TUNTIL; t->left = c_list(); t->right = dogroup(1); t->words = NULL; multiline--; break; case CASE: t = newtp(); t->type = TCASE; musthave(WORD, 0); t->str = yylval.cp; startl++; multiline++; musthave(IN, CONTIN); startl++; t->left = caselist(); musthave(ESAC, 0); multiline--; break; case IF: multiline++; t = newtp(); t->type = TIF; t->left = c_list(); t->right = thenpart(); musthave(FI, 0); multiline--; break; } while (synio(0)) ; t = namelist(t); iolist = iosave; return(t); } static struct op * dogroup(onlydone) int onlydone; { register int c; register struct op *list; c = yylex(CONTIN); if (c == DONE && onlydone) return((struct op *)NULL); if (c != DO) SYNTAXERR; list = c_list(); musthave(DONE, 0); return(list); } static struct op * thenpart() { register int c; register struct op *t; if ((c = yylex(0)) != THEN) { peeksym = c; return((struct op *)NULL); } t = newtp(); t->type = 0; t->left = c_list(); if (t->left == NULL) SYNTAXERR; t->right = elsepart(); return(t); } static struct op * elsepart() { register int c; register struct op *t; switch (c = yylex(0)) { case ELSE: if ((t = c_list()) == NULL) SYNTAXERR; return(t); case ELIF: t = newtp(); t->type = TELIF; t->left = c_list(); t->right = thenpart(); return(t); default: peeksym = c; return((struct op *)NULL); } } static struct op * caselist() { register struct op *t; t = NULL; while ((peeksym = yylex(CONTIN)) != ESAC) t = list(t, casepart()); return(t); } static struct op * casepart() { register struct op *t; t = newtp(); t->type = TPAT; t->words = pattern(); musthave(')', 0); t->left = c_list(); if ((peeksym = yylex(CONTIN)) != ESAC) musthave(BREAK, CONTIN); return(t); } static char ** pattern() { register int c, cf; cf = CONTIN; do { musthave(WORD, cf); word(yylval.cp); cf = 0; } while ((c = yylex(0)) == '|'); peeksym = c; word(NOWORD); return(copyw()); } static char ** wordlist() { register int c; if ((c = yylex(0)) != IN) { peeksym = c; return((char **)NULL); } startl = 0; while ((c = yylex(0)) == WORD) word(yylval.cp); word(NOWORD); peeksym = c; return(copyw()); } /* * supporting functions */ static struct op * list(t1, t2) register struct op *t1, *t2; { if (t1 == NULL) return(t2); if (t2 == NULL) return(t1); return(block(TLIST, t1, t2, NOWORDS)); } static struct op * block(type, t1, t2, wp) int type; struct op *t1, *t2; char **wp; { register struct op *t; t = newtp(); t->type = type; t->left = t1; t->right = t2; t->words = wp; return(t); } struct res { char *r_name; int r_val; } restab[] = { "for", FOR, "case", CASE, "esac", ESAC, "while", WHILE, "do", DO, "done", DONE, "if", IF, "in", IN, "then", THEN, "else", ELSPL��RL��SL��TL��UL��VL������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E, "elif", ELIF, "until", UNTIL, "fi", FI, ";;", BREAK, "||", LOGOR, "&&", LOGAND, "{", '{', "}", '}', 0, }; int rlookup(n) register char *n; { register struct res *rp; for (rp = restab; rp->r_name; rp++) if (strcmp(rp->r_name, n) == 0) return(rp->r_val); return(0); } static struct op * newtp() { register struct op *t; t = (struct op *)tree(sizeof(*t)); t->type = 0; t->words = NULL; t->ioact = NULL; t->left = NULL; t->right = NULL; t->str = NULL; return(t); } static struct op * namelist(t) register struct op *t; { if (iolist) { iolist = addword((char *)NULL, iolist); t->ioact = copyio(); } else t->ioact = NULL; if (t->type != TCOM) { if (t->type != TPAREN && t->ioact != NULL) { t = block(TPAREN, t, NOBLOCK, NOWORDS); t->ioact = t->left->ioact; t->left->ioact = NULL; } return(t); } word(NOWORD); t->words = copyw(); return(t); } static char ** copyw() { register char **wd; wd = getwords(wdlist); wdlist = 0; return(wd); } static void word(cp) char *cp; { wdlist = addword(cp, wdlist); } static struct ioword ** copyio() { register struct ioword **iop; iop = (struct ioword **) getwords(iolist); iolist = 0; return(iop); } static struct ioword * io(u, f, cp) int u; int f; char *cp; { register struct ioword *iop; iop = (struct ioword *) tree(sizeof(*iop)); iop->io_unit = u; iop->io_flag = f; iop->io_name = cp; iolist = addword((char *)iop, iolist); return(iop); } static void zzerr() { yyerror("syntax error"); } void yyerror(s) char *s; { yynerrs++; if (talking && e.iop <= iostack) { multiline = 0; while (eofc() == 0 && yylex(0) != '\n') ; } err(s); fail(); } static int yylex(cf) int cf; { register int c, c1; int atstart; if ((c = peeksym) > 0) { peeksym = 0; if (c == '\n') startl = 1; return(c); } nlseen = 0; e.linep = line; atstart = startl; startl = 0; yylval.i = 0; loop: while ((c = getc(0)) == ' ' || c == '\t') ; switch (c) { default: if (any(c, "0123456789")) { unget(c1 = getc(0)); if (c1 == '<' || c1 == '>') { iounit = c - '0'; goto loop; } *e.linep++ = c; c = c1; } break; case '#': while ((c = getc(0)) != 0 && c != '\n') ; unget(c); goto loop; case 0: return(c); case '$': *e.linep++ = c; if ((c = getc(0)) == '{') { if ((c = collect(c, '}')) != '\0') return(c); goto pack; } break; case '`': case '\'': case '"': if ((c = collect(c, c)) != '\0') return(c); goto pack; case '|': case '&': case ';': if ((c1 = dual(c)) != '\0') { startl = 1; return(c1); } startl = 1; return(c); case '^': startl = 1; return('|'); case '>': case '<': diag(c); return(c); case '\n': nlseen++; gethere(); startl = 1; if (multiline || cf & CONTIN) { if (talking && e.iop <= iostack) prs(cprompt->value); if (cf & CONTIN) goto loop; } return(c); case '(': case ')': startl = 1; return(c); } unget(c); pack: while ((c = getc(0)) != 0 && !any(c, "`$ '\"\t;&<>()|^\n")) if (e.linep >= elinep) err("word too long"); else *e.linep++ = c; unget(c); if(any(c, "\"'`$")) goto loop; *e.linep++ = '\0'; if (atstart && (c = rlookup(line))!=0) { startl = 1; return(c); } yylval.cp = strsave(line, areanum); return(WORD); } int collect(c, c1) register c, c1; { char s[2]; *e.linep++ = c; while ((c = getc(c1)) != c1) { if (c == 0) { unget(c); s[0] = c1; s[1] = 0; prs("no closing "); yyerror(s); return(YYERRCODE); } if (talking && c == '\n' && e.iop <= iostack) prs(cprompt->value); *e.linep++ = c; } *e.linep++ = c; return(0); } int dual(c) register c; { char s[3]; register char *cp = s; *cp++ = c; *cp++ = getc(0); *cp = 0; if ((c = rlookup(s)) == 0) unget(*--cp); return(c); } static void diag(ec) register int ec; { register int c; c = getc(0); if (c == '>' || c == '<') { if (c != ec) zzerr(); yylval.i = ec == '>'? IOWRITE|IOCAT: IOHERE; c = getc(0); } else yylval.i = ec == '>'? IOWRITE: IOREAD; if (c != '&' || yylval.i == IOHERE) unget(c); else yylval.i |= IODUP; } static char * tree(size) unsigned size; { register char *t; if ((t = getcell(size)) == NULL) { prs("command line too complicated\n"); fail(); /* NOTREACHED */ } return(t); } /* VARARGS1 */ /* ARGSUSED */ void printf(s) /* yyparse calls it */ char *s; { } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern extern #include <sys/types.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include <stddef.h> #include <time.h> #include <sys/times.h> #include <sys/stat.h> #include <sys/wait.h> #undef NULL #include "sh.h" /* -------- exec.c -------- */ /* #include "sh.h" */ /* * execute tree */ static char *signame[] = { "Signal 0", "Hangup", (char *)NULL, /* interrupt */ "Quit", "Illegal instruction", "Trace/BPT trap", "Abort", "EMT trap", "Floating exception", "Killed", "Bus error", "Memory fault", "Bad system call", (char *)NULL, /* broken pipe */ "Alarm clock", "Terminated", }; #define NSIGNAL (sizeof(signame)/sizeof(signame[0])) _PROTOTYPE(static int forkexec, (struct op *t, int *pin, int *pout, int act, char **wp, int *pforked )); _PROTOTYPE(static int parent, (void)); _PROTOTYPE(int iosetup, (struct ioword *iop, int pipein, int pipeout )); _PROTOTYPE(static void echo, (char **wp )); _PROTOTYPE(static struct op **find1case, (struct op *t, char *w )); _PROTOTYPE(static struct op *findcase, (struct op *t, char *w )); _PROTOTYPE(static void brkset, (struct brkcon *bc )); _PROTOTYPE(int dolabel, (void)); _PROTOTYPE(int dochdir, (struct op *t )); _PROTOTYPE(int doshift, (struct op *t )); _PROTOTYPE(int dologin, (struct op *t )); _PROTOTYPE(int doumask, (struct op *t )); _PROTOTYPE(int doexec, (struct op *t )); _PROTOTYPE(int dodot, (struct op *t )); _PROTOTYPE(int dowait, (struct op *t )); _PROTOTYPE(int doread, (struct op *t )); _PROTOTYPE(int doeval, (struct op *t )); _PROTOTYPE(int dotrap, (struct op *t )); _PROTOTYPE(int getsig, (char *s )); _PROTOTYPE(void setsig, (int n, void (*f)())); _PROTOTYPE(int getn, (char *as )); _PROTOTYPE(int dobreak, (struct op *t )); _PROTOTYPE(int docontinue, (struct op *t )); _PROTOTYPE(static int brkcontin, (char *cp, int val )); _PROTOTYPE(int doexit, (struct op *t )); _PROTOTYPE(int doexport, (struct op *t )); _PROTOTYPE(int doreadonly, (struct op *t )); _PROTOTYPE(static void rdexp, (char **wp, void (*f)(), int key)); _PROTOTYPE(static void badid, (char *s )); _PROTOTYPE(int doset, (struct op *t )); _PROTOTYPE(void varput, (char *s, int out )); _PROTOTYPE(int dotimes, (void)); int execute(t, pin, pout, act) register struct op *t; int *pin, *pout; int act; { register struct op *t1; int i, pv[2], rv, child, a; char *cp, **wp, **wp2; struct var *vp; struct brkcon bc; if (t == NULL) return(0); rv = 0; a = areanum++; wp = (wp2 = t->words) != NULL ? eval(wp2, t->type == TCOM ? DOALL : DOALL & ~DOKEY) : NULL; switch(t->type) { case TPAREN: case TCOM: rv = forkexec(t, pin, pout, act, wp, &child); if (child) { exstat = rv; leave(); } break; case TPIPE: if ((rv = openpipe(pv)) < 0) break; pv[0] = remap(pv[0]); pv[1] = remap(pv[1]); (void) execute(t->left, pin, pv, 0); rv = execute(t->right, pv, pout, 0); break; case TLIST: (void) execute(t->left, pin, pout, 0); rv = execute(t->right, pin, pout, 0); break; case TASYNC: i = parent(); if (i != 0) { if (i != -1) { setval(lookup("!"), putn(i)); if (pin != NULL) closepipe(pin); if (talking) { prs(putn(i)); prs("\n"); } } else rv = -1; setstatus(rv); } else { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); if (talking) signal(SIGTERM, SIG_DFL); talking = 0; if (pin == NULL) { close(0); open("/dev/null", 0); } exit(execute(t->left, pin, pout, FEXEC)); } break; case TOR: case TAND: rv = execute(t->left, pin, pout, 0); if ((t1 = t->right)!=NULL && (rv == 0) == (t->type == TAND)) rv = execute(t1, pin, pout, 0); break; case TFOR: if (wp == NULL) { wp = dolv+1; if ((i = dolc) < 0) i = 0; } else { i = -1; while (*wp++ != NULL) ; } vp = lookup(t->str); while (setjmp(bc.brkpt)) if (isbreak) goto broken; brkset(&bc); for (t1 = t->left; i-- && *wp != NULL;) { setval(vp, *wp++); rv = execute(t1, pin, pout, 0); } brklist = brklist->nextlev; break; case TWHILE: case TUNTIL: while (setjmp(bc.brkpt)) if (isbreak) goto broken; brkset(&bc); t1 = t->left; while ((execute(t1, pin, pout, 0) == 0) == (t->type == TWHILE)) rv = execute(t->right, pin, pout, 0); brklist = brklist->nextlev; break; case TIF: case TELIF: if (t->right != NULL) { rv = !execute(t->left, pin, pout, 0) ? execute(t->right->left, pin, pout, 0): execute(t->right->right, pin, pout, 0); } break; case TCASE: if ((cp = evalstr(t->str, DOSUB|DOTRIM)) == 0) cp = ""; if ((t1 = findcase(t->left, cp)) != NULL) rv = execute(t1, pin, pout, 0); break; case TBRACE: /* if (iopp = t->ioact) while (*iopp) if (iosetup(*iopp++, pin!=NULL, pout!=NULL)) { rv = -1; break; } */ if (rv >= 0 && (t1 = t->left)) rv = execute(t1, pin, pout, 0); break; } broken: t->words = wp2; isbreak = 0; freehere(areanum); freearea(areanum); areanum = a; if (talking && intr) { closeall(); fail(); } if ((i = trapset) != 0) { trapset = 0; runtrap(i); } return(rv); } static int forkexec(t, pin, pout, act, wp, pforked) register struct op *t; int *pin, *pout; int act; char **wp; int *pforked; { int i, rv, (*shcom)(); register int f; char *cp; struct ioword **iopp; int resetsig; char **owp; owp = wp; resetsig = 0; *pforked = 0; shcom = NULL; rv = -1; /* system-detected error */ if (t->type == TCOM) { while ((cp = *wp++) != NULL) ; cp = *wp; /* strip all initial assignments */ /* not correct wrt PATH=yyy command etc */ if (flag['x']) echo (cp ? wp: owp); if (cp == NULL && t->ioact == NULL) { while ((cp = *owp++) != NULL && assign(cp, COPYV)) ; return(setstatus(0)); } else if (cp != NULL) shcom = inbuilt(cp); } t->words = wp; f = act; if (shcom == NULL && (f & FEXEC) == 0) { i = parent(); if (i != 0) { if (i == -1) return(rv); if (pin != NULL) closepipe(pin); return(pout==NULL? setstatus(waitfor(i,0)): 0); } if (talking) { signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); resetsig = 1; } talking = 0; intr = 0; (*pforked)++; brklist = 0; execflg = 0; } if (owp != NULL) while ((cp = *owp++) != NULL && assign(cp, COPYV)) if (shcom == NULL) export(lookup(cp)); #ifdef COMPIPE if ((pin != NULL || pout != NULL) && shcom != NULL && shcom != doexec) { err("piping to/from shell builtins not yet done"); return(-1); } #endif if (pin != NULL) { dup2(pin[0], 0); closepipe(pin); } if (pout != NULL) { dup2(pout[1], 1); closepipe(pout); } if ((iopp = t->ioact) != NULL) { if (shcom != NULL && shcom != doexec) { prs(cp); err(": cannot redirect shell command"); return(-1); } while (*iopp) if (iosetup(*iopp++, pin!=NULL, pout!=NULL)) return(rv); } if (shcom) return(setstatus((*shcom)(t))); /* should use FIOCEXCL */ for (i=FDBASE; i<NOFILE; i++) close(i); if (resetsig) { signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); } if (t->type == TPAREN) exit(execute(t->left, NOPIPE, NOPIPE, FEXEC)); if (wp[0] == NULL) exit(0); cp = rexecve(wp[0], wp, makenv()); prs(wp[0]); prs(": "); warn(cp); if (!execflg) trap[0] = NULL; leave(); /* NOTREACHED */ } /* * common actions when creating a new child */ static int parent() { register int i; i = fork(); if (i != 0) { if (i == -1) warn("try again"); } return(i); } /* * 0< 1> are ignored as required * within pipelines. */ int iosetup(iop, pipein, pipeout) register struct ioword *iop; int pipein, pipeout; { register u; char *cp, *msg; if (iop->io_unit == IODEFAULT) /* take default */ iop->io_unit = iop->io_flag&(IOREAD|IOHERE)? 0: 1; if (pipein && iop->io_unit == 0) return(0); if (pipeout && iop->io_unit == 1) return(0); msg = iop->io_flag&(IOREAD|IOHERE)? "open": "create"; if ((iop->io_flag & IOHERE) == 0) { cp = iop->io_name; if ((cp = evalstr(cp, DOSUB|DOTRIM)) == NULL) return(1); } if (iop->io_flag & IODUP) { if (cp[1] || (!digit(*cp) && *cp != '-')) { prs(cp); err(": illegal >& argument"); return(1); } if (*cp == '-') iop->io_flag = IOCLOSE; ^L��`L��aL��bL��cL��dL��eL��fL��gL��hL��iL��jL��kL�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� iop->io_flag &= ~(IOREAD|IOWRITE); } switch (iop->io_flag) { case IOREAD: u = open(cp, 0); break; case IOHERE: case IOHERE|IOXHERE: u = herein(iop->io_name, iop->io_flag&IOXHERE); cp = "here file "; break; case IOWRITE|IOCAT: if ((u = open(cp, 1)) >= 0) { lseek(u, (long)0, 2); break; } case IOWRITE: u = creat(cp, 0666); break; case IODUP: u = dup2(*cp-'0', iop->io_unit); break; case IOCLOSE: close(iop->io_unit); return(0); } if (u < 0) { int e=errno; prs(cp); if (iop->io_flag&IOHERE) prs(iop->io_name); prs(": cannot "); prs(msg); prs(" ("); prs(strerror(e)); warn(")"); return(1); } else { if (u != iop->io_unit) { dup2(u, iop->io_unit); close(u); } } return(0); } static void echo(wp) register char **wp; { register i; prs("+"); for (i=0; wp[i]; i++) { if (i) prs(" "); prs(wp[i]); } prs("\n"); } static struct op ** find1case(t, w) struct op *t; char *w; { register struct op *t1; struct op **tp; register char **wp, *cp; if (t == NULL) return((struct op **)NULL); if (t->type == TLIST) { if ((tp = find1case(t->left, w)) != NULL) return(tp); t1 = t->right; /* TPAT */ } else t1 = t; for (wp = t1->words; *wp;) if ((cp = evalstr(*wp++, DOSUB)) && gmatch(w, cp)) return(&t1->left); return((struct op **)NULL); } static struct op * findcase(t, w) struct op *t; char *w; { register struct op **tp; return((tp = find1case(t, w)) != NULL? *tp: (struct op *)NULL); } /* * Enter a new loop level (marked for break/continue). */ static void brkset(bc) struct brkcon *bc; { bc->nextlev = brklist; brklist = bc; } /* * Wait for the last process created. * Print a message for each process found * that was killed by a signal. * Ignore interrupt signals while waiting * unless `canintr' is true. */ int waitfor(lastpid, canintr) register int lastpid; int canintr; { register int pid, rv; int s; int oheedint = heedint; heedint = 0; rv = 0; do { pid = wait(&s); if (pid == -1) { if (errno != EINTR || canintr) break; } else { if ((rv = WAITSIG(s)) != 0) { if (rv < NSIGNAL) { if (signame[rv] != NULL) { if (pid != lastpid) { prn(pid); prs(": "); } prs(signame[rv]); } } else { if (pid != lastpid) { prn(pid); prs(": "); } prs("Signal "); prn(rv); prs(" "); } if (WAITCORE(s)) prs(" - core dumped"); if (rv >= NSIGNAL || signame[rv]) prs("\n"); rv = -1; } else rv = WAITVAL(s); } } while (pid != lastpid); heedint = oheedint; if (intr) if (talking) { if (canintr) intr = 0; } else { if (exstat == 0) exstat = rv; onintr(0); } return(rv); } int setstatus(s) register int s; { exstat = s; setval(lookup("?"), putn(s)); return(s); } /* * PATH-searching interface to execve. * If getenv("PATH") were kept up-to-date, * execvp might be used. */ char * rexecve(c, v, envp) char *c, **v, **envp; { register int i; register char *sp, *tp; int eacces = 0, asis = 0; sp = any('/', c)? "": path->value; asis = *sp == '\0'; while (asis || *sp != '\0') { asis = 0; tp = e.linep; for (; *sp != '\0'; tp++) if ((*tp = *sp++) == ':') { asis = *sp == '\0'; break; } if (tp != e.linep) *tp++ = '/'; for (i = 0; (*tp++ = c[i++]) != '\0';) ; execve(e.linep, v, envp); switch (errno) { case ENOEXEC: *v = e.linep; tp = *--v; *v = e.linep; execve("/bin/sh", v, envp); *v = tp; return("no Shell"); case ENOMEM: return("program too big"); case E2BIG: return("argument list too long"); case EACCES: eacces++; break; } } return(errno==ENOENT ? "not found" : "cannot execute"); } /* * Run the command produced by generator `f' * applied to stream `arg'. */ int run(argp, f) struct ioarg *argp; int (*f)(); { struct op *otree; struct wdblock *swdlist; struct wdblock *siolist; jmp_buf ev, rt; xint *ofail; int rv; areanum++; swdlist = wdlist; siolist = iolist; otree = outtree; ofail = failpt; rv = -1; if (newenv(setjmp(errpt = ev)) == 0) { wdlist = 0; iolist = 0; pushio(argp, f); e.iobase = e.iop; yynerrs = 0; if (setjmp(failpt = rt) == 0 && yyparse() == 0) rv = execute(outtree, NOPIPE, NOPIPE, 0); quitenv(); } wdlist = swdlist; iolist = siolist; failpt = ofail; outtree = otree; freearea(areanum--); return(rv); } /* -------- do.c -------- */ /* #include "sh.h" */ /* * built-in commands: doX */ int dolabel() { return(0); } int dochdir(t) register struct op *t; { register char *cp, *er; if ((cp = t->words[1]) == NULL && (cp = homedir->value) == NULL) er = ": no home directory"; else if(chdir(cp) < 0) er = ": bad directory"; else return(0); prs(cp != NULL? cp: "cd"); err(er); return(1); } int doshift(t) register struct op *t; { register n; n = t->words[1]? getn(t->words[1]): 1; if(dolc < n) { err("nothing to shift"); return(1); } dolv[n] = dolv[0]; dolv += n; dolc -= n; setval(lookup("#"), putn(dolc)); return(0); } /* * execute login and newgrp directly */ int dologin(t) struct op *t; { register char *cp; if (talking) { signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); } cp = rexecve(t->words[0], t->words, makenv()); prs(t->words[0]); prs(": "); err(cp); return(1); } int doumask(t) register struct op *t; { register int i, n; register char *cp; if ((cp = t->words[1]) == NULL) { i = umask(0); umask(i); for (n=3*4; (n-=3) >= 0;) putc('0'+((i>>n)&07)); putc('\n'); } else { for (n=0; *cp>='0' && *cp<='9'; cp++) n = n*8 + (*cp-'0'); umask(n); } return(0); } int doexec(t) register struct op *t; { register i; jmp_buf ex; xint *ofail; t->ioact = NULL; for(i = 0; (t->words[i]=t->words[i+1]) != NULL; i++) ; if (i == 0) return(1); execflg = 1; ofail = failpt; if (setjmp(failpt = ex) == 0) execute(t, NOPIPE, NOPIPE, FEXEC); failpt = ofail; execflg = 0; return(1); } int dodot(t) struct op *t; { register i; register char *sp, *tp; char *cp; if ((cp = t->words[1]) == NULL) return(0); sp = any('/', cp)? ":": path->value; while (*sp) { tp = e.linep; while (*sp && (*tp = *sp++) != ':') tp++; if (tp != e.linep) *tp++ = '/'; for (i = 0; (*tp++ = cp[i++]) != '\0';) ; if ((i = open(e.linep, 0)) >= 0) { exstat = 0; next(remap(i)); return(exstat); } } prs(cp); err(": not found"); return(-1); } int dowait(t) struct op *t; { register i; register char *cp; if ((cp = t->words[1]) != NULL) { i = getn(cp); if (i == 0) return(0); } else i = -1; setstatus(waitfor(i, 1)); return(0); } int doread(t) struct op *t; { register char *cp, **wp; register nb; register int nl = 0; if (t->words[1] == NULL) { err("Usage: read name ..."); return(1); } for (wp = t->words+1; *wp; wp++) { for (cp = e.linep; !nl && cp < elinep-1; cp++) if ((nb = read(0, cp, sizeof(*cp))) != sizeof(*cp) || (nl = (*cp == '\n')) || (wp[1] && any(*cp, ifs->value))) break; *cp = 0; if (nb <= 0) break; setval(lookup(*wp), e.linep); } return(nb <= 0); } int doeval(t) register struct op *t; { return(RUN(awordlist, t->words+1, wdchar)); } int dotrap(t) register struct op *t; { register int n, i; register int resetsig; if (t->words[1] == NULL) { for (i=0; i<=_NSIG; i++) if (trap[i]) { prn(i); prs(": "); prs(trap[i]); prs("\n"); } return(0); } resetsig = digit(*t->words[1]); for (i = resetsig ? 1 : 2; t->words[i] != NULL; ++i) { n = getsig(t->words[i]); xfree(trap[n]); trap[n] = 0; if (!resetsig) { if (*t->words[1] != '\0') { trap[n] = strsave(t->words[1], 0); setsig(n, sig); } else setsig(n, SIG_IGN); } else { if (talking) if (n == SIGINT) setsig(n, onintr); else setsig(n, n == SIGQUIT ? SIG_IGN : SIG_DFL); else setsig(n, SIG_DFL); } } return(0); } int getsig(s) char *s; { register int n; if ((n = getn(s)) < 0 || n > _NSIG) { err("trap: bad signal number"); n = 0; } return(n); } void setsig(n, f) register n; _PROTOTYPE(void (*f), (int)); { if (n == 0) return; if (signal(n, SIG_IGN) != SIG_IGN || ourtrap[n]) { ourtrap[n] = 1; signal(n, f); } } int getn(as) char *as; { register char *s; register n, m; s = as; m = 1; if (*s == '-') { m = -1; s++; } for (n = 0; digit(*s); s++) n = (n*10) + (*s-'0'); if (*s) { prs(as); err(": bad number"); } return(n*m); } int dobreak(t) struct op *t; { return(brkcontin(t->words[1], 1)); } int docontinue(t) struct op *t; { return(brkcontin(t->words[1], 0)); } static int brkcontin(cp, val) register char *cp; int val; { register struct brkcon *bc; register nl; nl = cp == NULL? 1: getn(cp); if (nl <= 0) nl = 999; do { if ((bc = brklist) == NULL) break; brklist = bc->nextlev; } while (--nl); if (nl) { err("bad break/continue level"); return(1); } isbreak = val; longjmp(bc->brkpt, 1); /* NOTREACHED */ } int doexit(t) struct op *t; { register char *cp; execflg = 0; if ((cp = t->words[1]) != NULL) setstatus(getn(cp)); leave(); /* NOTREACHED */ } int doexport(t) struct op *t; { rdexp(t->words+1, export, EXPORT); return(0); } int doreadonly(t) struct op *t; { rdexp(t->words+1, ronly, RONLY); return(0); } static void rdexp(wp, f, key) register char **wp; void (*f)(); int key; { if (*wp != NULL) { for (; *wp != NULL; wp++) if (checkname(*wp)) (*f)(lookup(*wp)); else badid(*wp); } else putvlist(key, 1); } static void badid(s) register char *s; { prs(s); err(": bad identifier"); } int doset(t) register struct op *t; { register struct var *vp; register char *cp; register n; if ((cp = t->words[1]) == NULL) { for (vp = vlist; vp; vp = vp->next) varput(vp->name, 1); return(0); } if (*cp == '-') { /* bad: t->words++; */ for(n = 0; (t->words[n]=t->words[n+1]) != NULL; n++) ; if (*++cp == 0) flag['x'] = flag['v'] = 0; else for (; *cp; cp++) switch (*cp) { case 'e': if (!talking) flag['e']++; break; default: if (*cp>='a' && *cp<='z') flag[*cp]++; break; } setdash(); } if (t->words[1]) { t->words[0] = dolv[0]; for (n=1; t->words[n]; n++) setarea((char *)t->words[n], 0); dolc = n-1; dolv = t->words; setval(lookup("#"), putn(dolc)); setarea((char *)(dolv-1), 0); } return(0); } void varput(s, out) register char *s; int out; { if (letnum(*s)) { write(out, s, strlen(s)); write(out, "\n", 1); } } #define SECS 60L #define MINS 3600L int dotimes() { struct tms tbuf; times(&tbuf); prn((int)(tbuf.tms_cutime / MINS)); prs("m"); prn((int)((tbuf.tms_cutime % MINS) / SECS)); prs("s "); prn((int)(tbuf.tms_cstime / MINS)); prs("m"); prn((int)((tbuf.tms_cstime % MINS) / SECS)); prs("s\n"); return(0); } struct builtin { char *command; int (*fn)(); }; static struct builtin builtin[] = { ":", dolabel, "cd", dochdir, "shift", doshift, "exec", doexec, "wait", dowait, "read", doread, "eval", doeval, "trap", dotrap, "break", dobreak, "continue", docontinue, "exit", doexit, "export", doexport, "readonly", doreadonly, "set", doset, ".", dodot, "umask", doumask, "login", dologin, "newgrp", dologin, "times", dotimes, 0, }; int (*inbuilt(s))() register char *s; { register struct builtin *bp; for (bp = builtin; bp->command != NULL; bp++) if (strcmp(bp->command, s) == 0) return(bp->fn); return((int(*)())NULL); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern extern #include <sys/types.h> #include <sys/stat.h> #include <sys/dir.h> #include <limits.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include "sh.h" /* -------- eval.c -------- */ /* #include "sh.h" */ /* #include "word.h" */ /* * ${} * `command` * blank interpretation * quoting * glob */ _PROTOTYPE(static int expand, (char *cp, struct wdblock **wbp, int f )); _PROTOTYPE(static char *blank, (int f )); _PROTOTYPE(static int dollar, (int quoted )); _PROTOTYPE(static int grave, (int quoted )); _PROTOTYPE(void globname, (char *we, char *pp )); _PROTOTYPE(static char *generate, (char *start1, char *end1, char *middle, char *end )); _PROTOTYPE(static int anyspcl, (struct wdblock *wb )); _PROTOTYPE(static int xstrcmp, (char *p1, char *p2 )); _PROTOTYPE(void glob0, (char *a0, unsigned int a1, int a2, int (*a3)(char *, char *))); _PROTOTYPE(void glob1, (char *base, char *lim )); _PROTOTYPE(void glob2, (char *i, char *j )); _PROTOTYPE(void glob3, (char *i, char *j, char *k )); _PROTOTYPE(char *memcopy, (char *ato, char *from, int nb )); char ** eval(ap, f) register char **ap; int f; { struct wdblock *wb; char **wp; char **wf; jmp_buf ev; wp = NULL; wb = NULL; wf = NULL; if (newenv(setjmp(errpt = ev)) == 0) { while (*ap && isassign(*ap)) expand(*ap++, &wb, f & ~DOGLOB); if (flag['k']) { for (wf = ap; *wf; wf++) { if (isassign(*wf)) expand(*wf, &wb, f & ~DOGLOB); } } for (wb = addword((char *)0, wb); *ap; ap++) { if (!flag['k'] || !isassign(*ap)) expand(*ap, &wb, f & ~DOKEY); } wb = addword((char *)0, wb); wp = getwords(wb); quitenv(); } else gflg = 1; return(gflg? (char **)NULL: wp); } /* * Make the exported environment from the exported * names in the dictionary. Keyword assignments * will already have been done. */ char ** makenv() { register struct wdblock *wb; register struct var *vp; wb = NULL; for (vp = vlist; vp; vp = vp->next) if (vp->status & EXPORT) wb = addword(vp->name, wb); wb = addword((char *)0, wb); return(getwords(wb)); } char * evalstr(cp, f) register char *cp; int f; { struct wdblock *wb; wb = NULL; if (expand(cp, &wb, f)) { if (wb == NULL || wb->w_nword == 0 || (cp = wb->w_words[0]) == NULL) cp = ""; DELETE(wb); } else cp = NULL; return(cp); } static int expand(cp, wbp, f) register char *cp; register struct wdblock **wbp; int f; { jmp_buf ev; gflg = 0; if (cp == NULL) return(0); if (!anys("$`'\"", cp) && !anys(ifs->value, cp) && ((f&DOGLOB)==0 || !anys("[*?", cp))) { cp = strsave(cp, areanum); if (f & DOTRIM) unquote(cp); *wbp = addword(cp, *wbp); return(1); } if (newenv(setjmp(errpt = ev)) == 0) { PUSHIO(aword, cp, strchar); e.iobase = e.iop; while ((cp = blank(f)) && gflg == 0) { e.linep = cp; cp = strsave(cp, areanum); if ((f&DOGLOB) == 0) { if (f & DOTRIM) unquote(cp); *wbp = addword(cp, *wbp); } else *wbp = glob(cp, *wbp); } quitenv(); } else gflg = 1; return(gflg == 0); } /* * Blank interpretation and quoting */ static char * blank(f) int f; { register c, c1; register char *sp; int scanequals, foundequals; sp = e.linep; scanequals = f & DOKEY; foundequals = 0; loop: switch (c = subgetc('"', foundequals)) { case 0: if (sp == e.linep) return(0); *e.linep++ = 0; return(sp); default: if (f & DOBLANK && any(c, ifs->value)) goto loop; break; case '"': case '\'': scanequals = 0; if (INSUB()) break; for (c1 = c; (c = subgetc(c1, 1)) != c1;) { if (c == 0) break; if (c == '\'' || !any(c, "$`\"")) c |= QUOTE; *e.linep++ = c; } c = 0; } unget(c); if (!letter(c)) scanequals = 0; for (;;) { c = subgetc('"', foundequals); if (c == 0 || (f & DOBLANK && any(c, ifs->value)) || (!INSUB() && any(c, "\"'"))) { scanequals = 0; unget(c); if (any(c, "\"'")) goto loop; break; } if (scanequals) if (c == '=') { foundequals = 1; scanequals = 0; } else if (!letnum(c)) scanequals = 0; *e.linep++ = c; } *e.linep++ = 0; return(sp); } /* * Get characters, substituting for ` and $ */ int subgetc(ec, quoted) register char ec; int quoted; { register char c; again: c = getc(ec); if (!INSUB() && ec != '\'') { if (c == '`') { if (grave(quoted) == 0) return(0); e.iop->task = XGRAVE; goto again; } if (c == '$' && (c = dollar(quoted)) == 0) { e.iop->task = XDOLL; goto again; } } return(c); } /* * Prepare to generate the string returned by ${} substitution. */ static int dollar(quoted) int quoted; { int otask; struct io *oiop; char *dolp; register char *s, c, *cp; struct var *vp; c = readc(); s = e.linep; if (c != '{') { *e.linep++ = c; if (letter(c)) { while ((c = readc())!=0 && letnum(c)) if (e.linep < elinep) *e.linep++ = c; unget(c); } c = 0; } else { oiop = e.iop; otask = e.iop->task; e.iop->task = XOTHER; while ((c = subgetc('"', 0))!=0 && c!='}' && c!='\n') if (e.linep < elinep) *e.linep++ = c; if (oiop == e.iop) e.iop->task = otask; if (c != '}') { err("unclosed ${"); gflg++; return(c); } } if (e.linep >= elinep) { err("string in ${} too long"); gflg++; e.linep -= 10; } *e.linep = 0; if (*s) for (cp = s+1; *cp; cp++) if (any(*cp, "=-+?")) { c = *cp; *cp++ = 0; break; } if (s[1] == 0 && (*s == '*' || *s == '@')) { if (dolc > 1) { /* currently this does not distinguish $* and $@ */ /* should check dollar */ e.linep = s; PUSHIO(awordlist, dolv+1, dolchar); return(0); } else { /* trap the nasty ${=} */ s[0] = '1'; s[1] = 0; } } e.linep = s; vp = lookup(s); if ((dolp = vp->value) == null) { switch (c) { case '=': if (digit(*s)) { err("cannot use ${...=...} with $n"); gflg++; break; } cp = evalstr(strsave(cp, areanum),DOSUB); setval(vp, cp); dolp = vp->value; break; case '-': dolp = evalstr(strsave(cp, areanum),DOSUB); break; case '?': if (*cp == 0) { prs("missing value for "); err(s); } else err(evalstr(strsave(cp, areanum),DOSUB)); gflg++; break; } } else if (c == '+') { dolp = evalstr(strsave(cp, areanum),DOSUB); } if (flag['u'] && dolp == null) { prs("unset variable: "); err(s); gflg++; } PUSHIO(aword, dolp, quoted ? qstrchar : strchar); return(0); } /* * Run the command in `...` and read its output. */ static int grave(quoted) int quoted; { int otask; struct io *oiop; register char *cp,*s; register int i,c; int pf[2]; c = readc(); s = e.linep; *e.linep++ = c; oiop = e.iop; otask = e.iop->task; e.iop->task = XOTHER; while ((c = subgetc('\'', 0))!=0 && c!='`') if (e.linep < elinep) *e.linep++ = c; if (oiop == e.iop) e.iop->task = otask; if (c != '`') { err("no closing `"); return(0); } if (openpipe(pf) < 0) return(0); if ((i = fork()) == -1) { closepipe(pf); err("try again"); return(0); } if (i != 0) { e.linep = s; close(pf[1]); PUSHIO(afile, remap(pf[0]), quoted? qgravechar: gravechar); return(1); } *e.linep = 0; /* allow trapped signals */ for (i=0; i<=_NSIG; i++) if (ourtrap[i] && signal(i, SIG_IGN) != SIG_IGN) signal(i, SIG_DFL); dup2(pf[1], 1); closepipe(pf); flag['e'] = 0; flag['v'] = 0; flag['n'] = 0; cp = strsave(e.linep = s, 0); areanum = 1; inithere(); freearea(areanum); /* free old space */ e.oenv = NULL; e.iop = (e.iobase = iostack) - 1; unquote(cp); talking = 0; PUSHIO(aword, cp, nlchar); onecommand(); exit(1); } char * unquote(as) register char *as; { register char *s; if ((s = as) != NULL) while (*s) *s++ &= ~QUOTE; return(as); } /* -------- glob.c -------- */ /* #include "sh.h" */ /* * glob */ #define scopy(x) strsave((x), areanum) #define BLKSIZ 512 #define NDENT ((BLKSIZ+sizeof(struct direct)-1)/sizeof(struct direct)) static struct wdblock *cl, *nl; static char spcl[] = "[?*"; struct wdblock * glob(cp, wb) char *cp; struct wdblock *wb; { register i; register char *pp; if (cp == 0) return(wb); i = 0; for (pp = cp; *pp; ppsL��uL��vL��wL��xL��yL��zL��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������++) if (any(*pp, spcl)) i++; else if (!any(*pp & ~QUOTE, spcl)) *pp &= ~QUOTE; if (i != 0) { for (cl = addword(scopy(cp), (struct wdblock *)0); anyspcl(cl); cl = nl) { nl = newword(cl->w_nword*2); for(i=0; i<cl->w_nword; i++) { /* for each argument */ for (pp = cl->w_words[i]; *pp; pp++) if (any(*pp, spcl)) { globname(cl->w_words[i], pp); break; } if (*pp == '\0') nl = addword(scopy(cl->w_words[i]), nl); } for(i=0; i<cl->w_nword; i++) DELETE(cl->w_words[i]); DELETE(cl); } for(i=0; i<cl->w_nword; i++) unquote(cl->w_words[i]); glob0((char *)cl->w_words, cl->w_nword, sizeof(char *), xstrcmp); if (cl->w_nword) { for (i=0; i<cl->w_nword; i++) wb = addword(cl->w_words[i], wb); DELETE(cl); return(wb); } } wb = addword(unquote(cp), wb); return(wb); } void globname(we, pp) char *we; register char *pp; { register char *np, *cp; char *name, *gp, *dp; int dn, j, n, k; struct direct ent[NDENT]; char dname[NAME_MAX+1]; struct stat dbuf; for (np = we; np != pp; pp--) if (pp[-1] == '/') break; for (dp = cp = space((int)(pp-np)+3); np < pp;) *cp++ = *np++; *cp++ = '.'; *cp = '\0'; for (gp = cp = space(strlen(pp)+1); *np && *np != '/';) *cp++ = *np++; *cp = '\0'; dn = open(dp, 0); if (dn < 0) { DELETE(dp); DELETE(gp); return; } dname[NAME_MAX] = '\0'; while ((n = read(dn, (char *)ent, sizeof(ent))) >= sizeof(*ent)) { n /= sizeof(*ent); for (j=0; j<n; j++) { if (ent[j].d_ino == 0) continue; strncpy(dname, ent[j].d_name, NAME_MAX); if (dname[0] == '.') if (*gp != '.') continue; for(k=0; k<NAME_MAX; k++) if (any(dname[k], spcl)) dname[k] |= QUOTE; if (gmatch(dname, gp)) { name = generate(we, pp, dname, np); if (*np && !anys(np, spcl)) { if (stat(name,&dbuf)) { DELETE(name); continue; } } nl = addword(name, nl); } } } close(dn); DELETE(dp); DELETE(gp); } /* * generate a pathname as below. * start..end1 / middle end * the slashes come for free */ static char * generate(start1, end1, middle, end) char *start1; register char *end1; char *middle, *end; { char *p; register char *op, *xp; p = op = space((int)(end1-start1)+strlen(middle)+strlen(end)+2); for (xp = start1; xp != end1;) *op++ = *xp++; for (xp = middle; (*op++ = *xp++) != '\0';) ; op--; for (xp = end; (*op++ = *xp++) != '\0';) ; return(p); } static int anyspcl(wb) register struct wdblock *wb; { register i; register char **wd; wd = wb->w_words; for (i=0; i<wb->w_nword; i++) if (anys(spcl, *wd++)) return(1); return(0); } static int xstrcmp(p1, p2) char *p1, *p2; { return(strcmp(*(char **)p1, *(char **)p2)); } /* -------- word.c -------- */ /* #include "sh.h" */ /* #include "word.h" */ #define NSTART 16 /* default number of words to allow for initially */ struct wdblock * newword(nw) register int nw; { register struct wdblock *wb; wb = (struct wdblock *) space(sizeof(*wb) + nw*sizeof(char *)); wb->w_bsize = nw; wb->w_nword = 0; return(wb); } struct wdblock * addword(wd, wb) char *wd; register struct wdblock *wb; { register struct wdblock *wb2; register nw; if (wb == NULL) wb = newword(NSTART); if ((nw = wb->w_nword) >= wb->w_bsize) { wb2 = newword(nw * 2); memcopy((char *)wb2->w_words, (char *)wb->w_words, nw*sizeof(char *)); wb2->w_nword = nw; DELETE(wb); wb = wb2; } wb->w_words[wb->w_nword++] = wd; return(wb); } char ** getwords(wb) register struct wdblock *wb; { register char **wd; register nb; if (wb == NULL) return((char **)NULL); if (wb->w_nword == 0) { DELETE(wb); return((char **)NULL); } wd = (char **) space(nb = sizeof(*wd) * wb->w_nword); memcopy((char *)wd, (char *)wb->w_words, nb); DELETE(wb); /* perhaps should done by caller */ return(wd); } _PROTOTYPE(int (*func), (char *, char *)); int globv; void glob0(a0, a1, a2, a3) char *a0; unsigned a1; int a2; _PROTOTYPE(int (*a3), (char *, char *)); { func = a3; globv = a2; glob1(a0, a0 + a1 * a2); } void glob1(base, lim) char *base, *lim; { register char *i, *j; int v2; char *lptr, *hptr; int c; unsigned n; v2 = globv; top: if ((n=(int)(lim-base)) <= v2) return; n = v2 * (n / (2*v2)); hptr = lptr = base+n; i = base; j = lim-v2; for(;;) { if (i < lptr) { if ((c = (*func)(i, lptr)) == 0) { glob2(i, lptr -= v2); continue; } if (c < 0) { i += v2; continue; } } begin: if (j > hptr) { if ((c = (*func)(hptr, j)) == 0) { glob2(hptr += v2, j); goto begin; } if (c > 0) { if (i == lptr) { glob3(i, hptr += v2, j); i = lptr += v2; goto begin; } glob2(i, j); j -= v2; i += v2; continue; } j -= v2; goto begin; } if (i == lptr) { if (lptr-base >= lim-hptr) { glob1(hptr+v2, lim); lim = lptr; } else { glob1(base, lptr); base = hptr+v2; } goto top; } glob3(j, lptr -= v2, i); j = hptr -= v2; } } void glob2(i, j) char *i, *j; { register char *index1, *index2, c; int m; m = globv; index1 = i; index2 = j; do { c = *index1; *index1++ = *index2; *index2++ = c; } while(--m); } void glob3(i, j, k) char *i, *j, *k; { register char *index1, *index2, *index3; int c; int m; m = globv; index1 = i; index2 = j; index3 = k; do { c = *index1; *index1++ = *index3; *index3++ = *index2; *index2++ = c; } while(--m); } char * memcopy(ato, from, nb) register char *ato, *from; register int nb; { register char *to; to = ato; while (--nb >= 0) *to++ = *from++; return(ato); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define Extern extern #include <sys/types.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include "sh.h" /* -------- io.c -------- */ /* #include "sh.h" */ /* * shell IO */ static struct iobuf sharedbuf = {AFID_NOBUF}; static struct iobuf mainbuf = {AFID_NOBUF}; static unsigned bufid = AFID_ID; /* buffer id counter */ struct ioarg temparg = {0, 0, 0, AFID_NOBUF, 0}; _PROTOTYPE(static void readhere, (char **name, char *s, int ec )); _PROTOTYPE(void pushio, (struct ioarg *argp, int (*fn)())); _PROTOTYPE(static int xxchar, (struct ioarg *ap )); _PROTOTYPE(void tempname, (char *tname )); int getc(ec) register int ec; { register int c; if(e.linep > elinep) { while((c=readc()) != '\n' && c) ; err("input line too long"); gflg++; return(c); } c = readc(); if (ec != '\'' && e.iop->task != XGRAVE) { if(c == '\\') { c = readc(); if (c == '\n' && ec != '\"') return(getc(ec)); c |= QUOTE; } } return(c); } void unget(c) int c; { if (e.iop >= e.iobase) e.iop->peekc = c; } int eofc() { return e.iop < e.iobase || (e.iop->peekc == 0 && e.iop->prev == 0); } int readc() { register c; for (; e.iop >= e.iobase; e.iop--) if ((c = e.iop->peekc) != '\0') { e.iop->peekc = 0; return(c); } else { if (e.iop->prev != 0) { if ((c = (*e.iop->iofn)(e.iop->argp, e.iop)) != '\0') { if (c == -1) { e.iop++; continue; } if (e.iop == iostack) ioecho(c); return(e.iop->prev = c); } else if (e.iop->task == XIO && e.iop->prev != '\n') { e.iop->prev = 0; if (e.iop == iostack) ioecho('\n'); return '\n'; } } if (e.iop->task == XIO) { if (multiline) return e.iop->prev = 0; if (talking && e.iop == iostack+1) prs(prompt->value); } } if (e.iop >= iostack) return(0); leave(); /* NOTREACHED */ } void ioecho(c) char c; { if (flag['v']) write(2, &c, sizeof c); } void pushio(argp, fn) struct ioarg *argp; int (*fn)(); { if (++e.iop >= &iostack[NPUSH]) { e.iop--; err("Shell input nested too deeply"); gflg++; return; } e.iop->iofn = fn; if (argp->afid != AFID_NOBUF) e.iop->argp = argp; else { e.iop->argp = ioargstack + (e.iop - iostack); *e.iop->argp = *argp; e.iop->argp->afbuf = e.iop == &iostack[0] ? &mainbuf : &sharedbuf; if (isatty(e.iop->argp->afile) == 0 && (e.iop == &iostack[0] || lseek(e.iop->argp->afile, 0L, 1) != -1)) { if (++bufid == AFID_NOBUF) bufid = AFID_ID; e.iop->argp->afid = bufid; } } e.iop->prev = ~'\n'; e.iop->peekc = 0; e.iop->xchar = 0; e.iop->nlcount = 0; if (fn == filechar || fn == linechar) e.iop->task = XIO; else if (fn == gravechar || fn == qgravechar) e.iop->task = XGRAVE; else e.iop->task = XOTHER; } struct io * setbase(ip) struct io *ip; { register struct io *xp; xp = e.iobase; e.iobase = ip; return(xp); } /* * Input generating functions */ /* * Produce the characters of a string, then a newline, then EOF. */ int nlchar(ap) register struct ioarg *ap; { register int c; if (ap->aword == NULL) return(0); if ((c = *ap->aword++) == 0) { ap->aword = NULL; return('\n'); } return(c); } /* * Given a list of words, produce the characters * in them, with a space after each word. */ int wdchar(ap) register struct ioarg *ap; { register char c; register char **wl; if ((wl = ap->awordlist) == NULL) return(0); if (*wl != NULL) { if ((c = *(*wl)++) != 0) return(c & 0177); ap->awordlist++; return(' '); } ap->awordlist = NULL; return('\n'); } /* * Return the characters of a list of words, * producing a space between them. */ int dolchar(ap) register struct ioarg *ap; { register char *wp; if ((wp = *ap->awordlist++) != NULL) { PUSHIO(aword, wp, *ap->awordlist == NULL? strchar: xxchar); return(-1); } return(0); } static int xxchar(ap) register struct ioarg *ap; { register int c; if (ap->aword == NULL) return(0); if ((c = *ap->aword++) == '\0') { ap->aword = NULL; return(' '); } return(c); } /* * Produce the characters from a single word (string). */ int strchar(ap) register struct ioarg *ap; { register int c; if (ap->aword == NULL || (c = *ap->aword++) == 0) return(0); return(c); } /* * Produce quoted characters from a single word (string). */ int qstrchar(ap) register struct ioarg *ap; { register int c; if (ap->aword == NULL || (c = *ap->aword++) == 0) return(0); return(c|QUOTE); } /* * Return the characters from a file. */ int filechar(ap) register struct ioarg *ap; { register int i; char c; struct iobuf *bp = ap->afbuf; if (ap->afid != AFID_NOBUF) { if ((i = ap->afid != bp->id) || bp->bufp == bp->ebufp) { if (i) lseek(ap->afile, ap->afpos, 0); do { i = read(ap->afile, bp->buf, sizeof(bp->buf)); } while (i < 0 && errno == EINTR); if (i <= 0) { closef(ap->afile); return 0; } bp->id = ap->afid; bp->ebufp = (bp->bufp = bp->buf) + i; } ap->afpos++; return *bp->bufp++ & 0177; } do { i = read(ap->afile, &c, sizeof(c)); } while (i < 0 && errno == EINTR); return(i == sizeof(c)? c&0177: (closef(ap->afile), 0)); } /* * Return the characters from a here temp file. */ int herechar(ap) register struct ioarg *ap; { char c; if (read(ap->afile, &c, sizeof(c)) != sizeof(c)) { close(ap->afile); c = 0; } return (c); } /* * Return the characters produced by a process (`...`). * Quote them if required, and remove any trailing newline characters. */ int gravechar(ap, iop) struct ioarg *ap; struct io *iop; { register int c; if ((c = qgravechar(ap, iop)&~QUOTE) == '\n') c = ' '; return(c); } int qgravechar(ap, iop) register struct ioarg *ap; struct io *iop; { register int c; if (iop->xchar) { if (iop->nlcount) { iop->nlcount--; return('\n'|QUOTE); } c = iop->xchar; iop->xchar = 0; } else if ((c = filechar(ap)) == '\n') { iop->nlcount = 1; while ((c = filechar(ap)) == '\n') iop->nlcount++; iop->xchar = c; if (c == 0) return(c); iop->nlcount--; c = '\n'; } return(c!=0? c|QUOTE: 0); } /* * Return a single command (usually the first line) from a file. */ int linechar(ap) register struct ioarg *ap; { register int c; if ((c = filechar(ap)) == '\n') { if (!multiline) { closef(ap->afile); ap->afile = -1; /* illegal value */ } } return(c); } void prs(s) register char *s; { if (*s) write(2, s, strlen(s)); } void putc(c) char c; { write(2, &c, sizeof c); } void prn(u) unsigned u; { prs(itoa(u, 0)); } void closef(i) register int i; { if (i > 2) close(i); } void closeall() { register u; for (u=NUFILE; u<NOFILE;) close(u++); } /* * remap fd into Shell's fd space */ int remap(fd) register int fd; { register int i; int map[NOFILE]; if (fd < e.iofd) { for (i=0; i<NOFILE; i++) map[i] = 0; do { map[fd] = 1; fd = dup(fd); } while (fd >= 0 && fd < e.iofd); for (i=0; i<NOFILE; i++) if (map[i]) close(i); if (fd < 0) err("too many files open in shell"); } return(fd); } int openpipe(pv) register int *pv; { register int i; if ((i = pipe(pv)) < 0) err("can't create pipe - try again"); return(i); } void closepipe(pv) register int *pv; { if (pv != NULL) { close(*pv++); close(*pv); } } /* -------- here.c -------- */ /* #include "sh.h" */ /* * here documents */ struct here { char *h_tag; int h_dosub; struct ioword *h_iop; struct here *h_next; }; static struct here *inhere; /* list of hear docs while parsing */ static struct here *acthere; /* list of active here documents */ void inithere() { inhere=acthere=(struct here*)0; } void markhere(s, iop) register char *s; struct ioword *iop; { register struct here *h, *lh; h = (struct here *) space(sizeof(struct here)); if (h == 0) return; h->h_tag = evalstr(s, DOSUB); if (h->h_tag == 0) return; h->h_iop = iop; iop->io_name = 0; h->h_next = NULL; if (inhere == 0) inhere = h; else for (lh = inhere; lh!=NULL; lh = lh->h_next) if (lh->h_next == 0) { lh->h_next = hL��L��L��L��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������; break; } iop->io_flag |= IOHERE|IOXHERE; for (s = h->h_tag; *s; s++) if (*s & QUOTE) { iop->io_flag &= ~ IOXHERE; *s &= ~ QUOTE; } h->h_dosub = iop->io_flag & IOXHERE; } void gethere() { register struct here *h, *hp; /* Scan here files first leaving inhere list in place */ for (hp = h = inhere; h != NULL; hp = h, h = h->h_next) readhere(&h->h_iop->io_name, h->h_tag, h->h_dosub? 0: '\''); /* Make inhere list active - keep list intact for scraphere */ if (hp != NULL) { hp->h_next = acthere; acthere = inhere; inhere = NULL; } } static void readhere(name, s, ec) char **name; register char *s; int ec; { int tf; char tname[30]; register c; jmp_buf ev; char line [LINELIM+1]; char *next; tempname(tname); *name = strsave(tname, areanum); tf = creat(tname, 0600); if (tf < 0) return; if (newenv(setjmp(errpt = ev)) != 0) unlink(tname); else { pushio(e.iop->argp, e.iop->iofn); e.iobase = e.iop; for (;;) { if (talking && e.iop <= iostack) prs(cprompt->value); next = line; while ((c = readc()) != '\n' && c) { if (next >= &line[LINELIM]) { c = 0; break; } *next++ = c; } *next = 0; if (strcmp(s, line) == 0 || c == 0) break; *next++ = '\n'; write (tf, line, (int)(next-line)); } if (c == 0) { prs("here document `"); prs(s); err("' unclosed"); } quitenv(); } close(tf); } /* * open here temp file. * if unquoted here, expand here temp file into second temp file. */ int herein(hname, xdoll) char *hname; int xdoll; { register hf, tf; if (hname == 0) return(-1); hf = open(hname, 0); if (hf < 0) return (-1); if (xdoll) { char c; char tname[30]; jmp_buf ev; tempname(tname); if ((tf = creat(tname, 0600)) < 0) return (-1); if (newenv(setjmp(errpt = ev)) == 0) { PUSHIO(afile, hf, herechar); setbase(e.iop); while ((c = subgetc(0, 0)) != 0) { char c1 = c&~QUOTE; if (c"E && !any(c1,"`$\\")) write(tf,"\\",1); write(tf, &c1, 1); } quitenv(); } else unlink(tname); close(tf); tf = open(tname, 0); unlink(tname); return (tf); } else return (hf); } void scraphere() { register struct here *h; for (h = inhere; h != NULL; h = h->h_next) { if (h->h_iop && h->h_iop->io_name) unlink(h->h_iop->io_name); } inhere = NULL; } /* unlink here temp files before a freearea(area) */ void freehere(area) int area; { register struct here *h, *hl; hl = NULL; for (h = acthere; h != NULL; h = h->h_next) if (getarea((char *) h) >= area) { if (h->h_iop->io_name != NULL) unlink(h->h_iop->io_name); if (hl == NULL) acthere = h->h_next; else hl->h_next = h->h_next; } else hl = h; } void tempname(tname) char *tname; { static int inc; register char *cp, *lp; for (cp = tname, lp = "/tmp/shtm"; (*cp = *lp++) != '\0'; cp++) ; lp = putn(getpid()*1000 + inc++); for (; (*cp = *lp++) != '\0'; cp++) ; } ���������������������������������������������������������������������������������������������������������������������#define Extern #include <sys/types.h> #include <signal.h> #include <errno.h> #include <setjmp.h> #include "sh.h" ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ add_route.c��� env.c��������� at.c���������� atrun.c������� backup.c������ badblocks.c��� banner.c������ basename.c���� xargs.c������� cal.c��������� calendar.c���� cat.c��������� nonamed.c����� cdiff.c������� cgrep.c������� chmem.c������� chmod.c������� chown.c������� ci.c���������� cksum.c������� sysenv.c������ cmp.c��������� co.c���������� comm.c�������� compress.c���� cp.c���������� crc.c��������� stat.c�������� cut.c��������� date.c�������� dd.c���������� decomp16.c���� df.c���������� dhrystone.c��� diff.c�������� dirname.c����� intr.c�������� cleantmp.c���� du.c���������� printf.c������ mkswap.c������ ed.c���������� eject.c������� expand.c������ factor.c������ fgrep.c������� file.c�������� find.c�������� finger.c������ fix.c��������� fold.c�������� fortune.c����� fsck.c�������� fsck1.c������� getty.c������� gomoku.c������ grep.c�������� head.c�������� host.c�������� hostaddr.c���� id.c����������# Makefile for commands/simple. CFLAGS = -D_MINIX -D_POSIX_SOURCE SYS = ../.. CCLD = $(CC) -i $(CFLAGS) # This Makefile is large, but that is because it lists all actions that must # be taken to compile and install all the simple commands. If there were only # one command then it would look like this: # # ALL = \ # cat \ need the 'cat' executable # # all: $(ALL) default rule, make all binaries # # cat: cat.c 'cat' is made from 'cat.c' # $(CCLD) -o $@ $? compile 'cat.c' ($?) to 'cat' ($@) # install -S 4kw $@ stack size is 8k (8086) or 16k (others) # # install: \ rule to install all binaries # /usr/bin/cat \ one can find 'cat' in /usr/bin # /bin/cat \ important binaries are also in /bin # # /usr/bin/cat: cat # install -cs -o bin $? $@ copy 'cat' to '/usr/bin/cat' (-c), # strip symbol table (-s) # # /bin/cat: /usr/bin/cat # install -lcs $? $@ install '/bin/cat' by linking (if possible) # or copying (otherwise) # # Some of the binaries are installed under more than one name. The extra # names are indented by one extra tab in the install rule. # If you want to add a command then insert it at the appropriate position # in sorted order. Search around for the command just above or below the # the new command and add new rules for the new command near those places. # Observe four key things: # What to make, how to make, what to install, how to install. ALL = \ add_route \ at \ atrun \ backup \ badblocks \ banner \ basename \ cal \ calendar \ cat \ cdiff \ cgrep \ chmem \ chmod \ chown \ ci \ cksum \ cleantmp \ cmp \ co \ comm \ compress \ cp \ crc \ cut \ date \ dd \ decomp16 \ df \ dhrystone \ diff \ dirname \ du \ ed \ eject \ env \ expand \ factor \ fgrep \ file \ find \ finger \ fix \ fold \ fortune \ fsck \ fsck1 \ getty \ gomoku \ grep \ head \ host \ hostaddr \ id \ ifconfig \ ifdef \ in.fingerd \ in.rshd \ installx \ intr \ irdpd \ isoread \ join \ kill \ last \ leave \ life \ login \ look \ lp \ lpd \ ls \ mail \ man \ mesg \ mkdir \ mkfifo \ mkfs \ mknod \ mkproto \ mkswap \ modem \ mount \ mt \ nm \ nonamed \ od \ passwd \ paste \ ping \ pr \ pr_routes \ prep \ printf \ printroot \ proto \ pwd \ pwdauth \ rarpd \ rcp \ readall \ readfs \ remsync \ rlogin \ rmdir \ rsh \ sed \ shar \ size \ sleep \ slip \ sort \ split \ stat \ strings \ strip \ stty \ su \ sum \ swapfs \ sync \ synctree \ sysenv \ tail \ tar \ tcpd \ tcpdp \ tee \ term \ termcap \ tget \ time \ touch \ tr \ tsort \ ttt \ tty \ umount \ uname \ unexpand \ uniq \ update \ uud \ uue \ vol \ wc \ which \ who \ whoami \ write \ xargs \ yes \ # all: $(ALL) add_route: add_route.c $(CCLD) -o $@ add_route.c install -S 4kw $@ at: at.c $(CCLD) -o $@ $? install -S 4kw $@ atrun: atrun.c $(CCLD) -o $@ $? install -S 4kw $@ backup: backup.c $(CCLD) -o $@ $? install -S 4kw $@ badblocks: badblocks.c $(CCLD) -o $@ $? install -S 4kw $@ banner: banner.c $(CCLD) -o $@ $? install -S 4kw $@ basename: basename.c $(CCLD) -o $@ $? install -S 4kw $@ cal: cal.c $(CCLD) -o $@ $? install -S 4kw $@ calendar: calendar.c $(CCLD) -o $@ $? install -S 4kw $@ cat: cat.c $(CCLD) -o $@ $? install -S 4kw $@ cdiff: cdiff.c $(CCLD) -o $@ $? install -S 28kw $@ cgrep: cgrep.c $(CCLD) -o $@ $? install -S 5kw $@ chmem: chmem.c $(CCLD) -o $@ $? install -S 4kw $@ chmod: chmod.c $(CCLD) -o $@ $? install -S 4kw $@ chown: chown.c $(CCLD) -o $@ $? install -S 4kw $@ ci: ci.c $(CCLD) -o $@ $? install -S 4kw $@ cksum: cksum.c $(CCLD) -o $@ $? install -S 8kw $@ cleantmp: cleantmp.c $(CCLD) -o $@ $? install -S 8kw $@ cmp: cmp.c $(CCLD) -o $@ $? install -S 4kw $@ co: co.c $(CCLD) -o $@ $? install -S 4kw $@ comm: comm.c $(CCLD) -o $@ $? install -S 4kw $@ compress: compress.c $(CCLD) -o $@ $? install -S 450k $@ cp: cp.c $(CCLD) -o $@ $? install -S 16kw $@ crc: crc.c $(CCLD) -o $@ $? install -S 8kw $@ cut: cut.c $(CCLD) -o $@ $? install -S 4kw $@ date: date.c $(CCLD) -o $@ $? install -S 4kw $@ dd: dd.c $(CCLD) -o $@ $? install -S 20kw $@ decomp16: decomp16.c $(CCLD) -o $@ $? install -S 4kw $@ df: df.c $(CCLD) -I$(SYS) -o $@ $? install -S 4kw $@ dhrystone: dhrystone.c $(CCLD) -o $@ $? install -S 4kw $@ diff: diff.c $(CCLD) -o $@ $? install -S 40kw $@ dirname: dirname.c $(CCLD) -o $@ $? install -S 4kw $@ du: du.c $(CCLD) -o $@ $? install -S 16kw $@ ed: ed.c $(CCLD) -o $@ $? install -S 32kw $@ eject: eject.c $(CCLD) -o $@ $? install -S 4kw $@ env: env.c $(CCLD) -o $@ $? install -S 4kw $@ expand: expand.c $(CCLD) -o $@ $? install -S 4kw $@ factor: factor.c $(CCLD) -o $@ $? install -S 4kw $@ fgrep: fgrep.c $(CCLD) -o $@ $? install -S 10kw $@ file: file.c $(CCLD) -o $@ $? install -S 25kw $@ find: find.c $(CCLD) -o $@ $? install -S 25kw $@ finger: finger.c $(CCLD) -o $@ finger.c install -S 8kw $@ fix: fix.c $(CCLD) -o $@ fix.c install -S 32kw $@ fold: fold.c $(CCLD) -o $@ $? install -S 4kw $@ fortune: fortune.c $(CCLD) -o $@ $? install -S 4kw $@ fsck: fsck.c $(CCLD) -o $@ $? install -S 384k $@ fsck1: fsck1.c $(CCLD) -o $@ $? install -S 32kw $@ getty: getty.c /usr/include/minix/config.h $(CCLD) -o $@ getty.c install -S 4kw $@ gomoku: gomoku.c $(CCLD) -o $@ $? -lcurses install -S 8kw $@ grep: grep.c $(CCLD) -o $@ $? install -S 32kw $@ head: head.c $(CCLD) -o $@ $? install -S 4kw $@ host: host.c $(CCLD) -wo -o $@ host.c install -S 4kw $@ hostaddr: hostaddr.c $(CCLD) -o $@ hostaddr.c install -S 8kw $@ id: id.c $(CCLD) -o $@ $? install -S 4kw $@ ifconfig: ifconfig.c $(CCLD) -o $@ ifconfig.c install -S 4kw $@ ifdef: ifdef.c $(CCLD) -o $@ $? install -S 4kw $@ in.fingerd: in.fingerd.c $(CCLD) -o $@ in.fingerd.c install -S 4kw $@ in.rshd: in.rshd.c $(CCLD) -o $@ in.rshd.c install -S 4kw $@ installx: install.c # Note: avoided confict with 'install' rule. $(CCLD) -o $@ $? install -S 4kw $@ intr: intr.c $(CCLD) -o $@ intr.c install -S 4kw $@ irdpd: irdpd.c $(CCLD) -o $@ $? install -S 4kw $@ isoread: isoread.c $(CCLD) -o $@ $? install -S 4kw $@ join: join.c $(CCLD) -o $@ $? install -S 4kw $@ kill: kill.c $(CCLD) -o $@ $? install -S 4kw $@ last: last.c $(CCLD) -o $@ $? install -S 5kw $@ leave: leave.c $(CCLD) -o $@ $? install -S 4kw $@ life: life.c $(CCLD) -o $@ $? -lcurses install -S 15kw $@ login: login.c $(CCLD) -o $@ $? install -S 4kw $@ look: look.c $(CCLD) -o $@ $? install -S 4kw $@ lp: lp.c $(CCLD) -o $@ $? install -S 4kw $@ lpd: lpd.c $(CCLD) -o $@ $? install -S 4kw $@ ls: ls.c $(CCLD) -o $@ $? install -S 20kw $@ mail: mail.c $(CCLD) -o $@ $? install -S 4kw $@ man: man.c $(CCLD) -o $@ $? install -S 10kw $@ mesg: mesg.c $(CCLD) -o $@ $? install -S 4kw $@ mkdir: mkdir.c $(CCLD) -o $@ $? install -S 4kw $@ mkfifo: mkfifo.c $(CCLD) -o $@ $? install -S 4kw $@ mkfs: mkfs.c $(CCLD) -o $@ $? install -S 20kw $@ mknod: mknod.c $(CCLD) -o $@ $? install -S 4kw $@ mkproto: mkproto.c $(CCLD) -o $@ $? install -S 20kw $@ mkswap: mkswap.c $(CCLD) -I$(SYS) -o $@ $? install -S 4kw $@ modem: modem.c $(CCLD) -o $@ $? install -S 4kw $@ mount: mount.c $(CCLD) -o $@ $? install -S 4kw $@ mt: mt.c $(CCLD) -o $@ $? install -S 4kw $@ nm: nm.c $(CCLD) -o $@ $? install -S 32kw $@ nonamed: nonamed.c $(CCLD) -o $@ $? install -S 8kw $@ od: od.c $(CCLD) -o $@ $? install -S 4kw $@ passwd: passwd.c $(CCLD) -o $@ $? install -S 4kw $@ paste: paste.c $(CCLD) -o $@ $? install -S 4kw $@ ping: ping.c $(CCLD) -o $@ $? install -S 4kw $@ pr: pr.c $(CCLD) -o $@ $? install -S 16kw $@ pr_routes: pr_routes.c $(CCLD) -o $@ $? install -S 4kw $@ prep: prep.c $(CCLD) -o $@ $? install -S 4kw $@ printf: printf.c $(CCLD) -o $@ $? install -S 4kw $@ printroot: printroot.c $(CCLD) -o $@ $? install -S 4kw $@ proto: proto.c $(CCLD) -o $@ $? install -S 15kw $@ pwd: pwd.c $(CCLD) -o $@ $? install -S 4kw $@ pwdauth: pwdauth.c $(CCLD) -o $@ $? install -S 4kw $@ rarpd: rarpd.c $(CCLD) -o $@ rarpd.c install -S 4kw $@ rcp: rcp.c $(CCLD) -o $L��L��L��L��L��L��L��L��L��L��L��L��L��L��L��L��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@ rcp.c install -S 8kw $@ readall: readall.c $(CCLD) -o $@ $? install -S 4kw $@ readfs: readfs.c $(CCLD) -o $@ $? install -S 25kw $@ remsync: remsync.c $(CCLD) -o $@ $? install -S 256k $@ rlogin: rlogin.c $(CCLD) -o $@ $? install -S 8kw $@ rmdir: rmdir.c $(CCLD) -o $@ $? install -S 15kw $@ rsh: rsh.c $(CCLD) -o $@ rsh.c install -S 8kw $@ sed: sed.c $(CCLD) -o $@ $? install -S 8kw $@ shar: shar.c $(CCLD) -o $@ $? install -S 4kw $@ size: size.c $(CCLD) -o $@ $? install -S 4kw $@ sleep: sleep.c $(CCLD) -o $@ $? install -S 4kw $@ slip: slip.c $(CCLD) -o $@ $? install -S 20k $@ sort: sort.c $(CCLD) -o $@ $? install -S 30kw $@ split: split.c $(CCLD) -o $@ $? install -S 4kw $@ stat: stat.c $(CCLD) -o $@ $? install -S 4kw $@ strings: strings.c $(CCLD) -o $@ $? install -S 8kw $@ strip: strip.c $(CCLD) -o $@ $? install -S 8kw $@ stty: stty.c $(CCLD) -o $@ $? install -S 4kw $@ su: su.c $(CCLD) -o $@ $? install -S 4kw $@ sum: sum.c $(CCLD) -o $@ $? install -S 4kw $@ swapfs: swapfs.c $(CCLD) -o $@ $? install -S 4kw $@ sync: sync.c $(CCLD) -o $@ $? install -S 4kw $@ synctree: synctree.c $(CCLD) -o $@ -wo $? install -S 32kw $@ sysenv: sysenv.c $(CCLD) -o $@ -wo $? install -S 4kw $@ tail: tail.c $(CCLD) -o $@ $? install -S 16kw $@ tar: tar.c $(CCLD) -o $@ $? install -S 30kw $@ tcpd: tcpd.c $(CCLD) -o $@ -DPARANOID=0 tcpd.c install -S 4kw $@ tcpdp: tcpd.c $(CCLD) -o $@ -DPARANOID=1 tcpd.c install -S 8kw $@ tee: tee.c $(CCLD) -o $@ $? install -S 4kw $@ term: term.c $(CCLD) -o $@ $? install -S 4kw $@ termcap: termcap.c $(CCLD) -o $@ $? install -S 4kw $@ tget: tget.c $(CCLD) -o $@ $? install -S 4kw $@ time: time.c $(CCLD) -o $@ $? install -S 4kw $@ touch: touch.c $(CCLD) -o $@ $? install -S 4kw $@ tr: tr.c $(CCLD) -o $@ $? install -S 4kw $@ tsort: tsort.c $(CCLD) -o $@ $? install -S 4kw $@ ttt: ttt.c $(CCLD) -o $@ $? install -S 4kw $@ tty: tty.c $(CCLD) -o $@ $? install -S 4kw $@ umount: umount.c $(CCLD) -o $@ $? install -S 4kw $@ uname: uname.c /usr/include/minix/config.h $(CCLD) -o $@ uname.c install -S 4kw $@ unexpand: unexpand.c $(CCLD) -o $@ $? install -S 4kw $@ uniq: uniq.c $(CCLD) -o $@ $? install -S 4kw $@ update: update.c $(CCLD) -o $@ $? install -S 1kw $@ uud: uud.c $(CCLD) -o $@ $? install -S 4kw $@ uue: uue.c $(CCLD) -o $@ $? install -S 4kw $@ vol: vol.c $(CCLD) -o $@ $? install -S 80k $@ # note: '-S' is upper limit to 'vol -m' wc: wc.c $(CCLD) -o $@ $? install -S 4kw $@ which: which.c $(CCLD) -o $@ $? install -S 4kw $@ who: who.c $(CCLD) -o $@ $? install -S 4kw $@ whoami: whoami.c $(CCLD) -o $@ $? install -S 4kw $@ write: write.c $(CCLD) -o $@ $? xargs: xargs.c $(CCLD) -o $@ $? install -S 16kw $@ yes: yes.c $(CCLD) -o $@ $? install -S 4kw $@ install: \ /usr/bin/add_route \ /usr/bin/del_route \ /usr/bin/at \ /usr/bin/atrun \ /usr/bin/backup \ /usr/bin/restore \ /usr/bin/badblocks \ /usr/bin/banner \ /usr/bin/basename \ /usr/bin/cal \ /usr/bin/calendar \ /usr/bin/cat \ /usr/bin/cdiff \ /usr/bin/cgrep \ /usr/bin/chmem \ /usr/bin/chmod \ /usr/bin/chown \ /usr/bin/chgrp \ /usr/bin/ci \ /usr/bin/cksum \ /usr/bin/cleantmp \ /usr/bin/cmp \ /usr/bin/co \ /usr/bin/comm \ /usr/bin/compress \ /usr/bin/uncompress \ /usr/bin/zcat \ /usr/bin/cp \ /usr/bin/clone \ /usr/bin/cpdir \ /usr/bin/ln \ /usr/bin/mv \ /usr/bin/rm \ /usr/bin/crc \ /usr/bin/cut \ /usr/bin/date \ /usr/bin/dd \ /usr/bin/decomp16 \ /usr/bin/df \ /usr/bin/dhrystone \ /usr/bin/diff \ /usr/bin/dirname \ /usr/bin/du \ /usr/bin/ed \ /usr/bin/eject \ /usr/bin/env \ /usr/bin/expand \ /usr/bin/factor \ /usr/bin/fgrep \ /usr/bin/file \ /usr/bin/find \ /usr/bin/finger \ /usr/bin/fix \ /usr/bin/fold \ /usr/bin/fortune \ /usr/bin/fsck \ /usr/bin/fsck1 \ /usr/bin/getty \ /usr/bin/gomoku \ /usr/bin/grep \ /usr/bin/egrep \ /usr/bin/head \ /usr/bin/host \ /usr/bin/hostaddr \ /usr/bin/id \ /usr/bin/ifconfig \ /usr/bin/ifdef \ /usr/bin/in.fingerd \ /usr/bin/in.rshd \ /usr/bin/install \ /usr/bin/intr \ /usr/bin/irdpd \ /usr/bin/isoread \ /usr/bin/isodir \ /usr/bin/isoinfo \ /usr/bin/join \ /usr/bin/kill \ /usr/bin/last \ /usr/bin/uptime \ /usr/bin/leave \ /usr/bin/life \ /usr/bin/login \ /usr/bin/look \ /usr/bin/lp \ /usr/bin/lpd \ /usr/bin/ls \ /usr/bin/mail \ /usr/bin/man \ /usr/bin/mesg \ /usr/bin/mkdir \ /usr/bin/mkfifo \ /usr/bin/mkfs \ /usr/bin/mknod \ /usr/bin/mkproto \ /usr/bin/mkswap \ /usr/bin/modem \ /usr/bin/mount \ /usr/bin/mt \ /usr/bin/nm \ /usr/bin/nonamed \ /usr/bin/od \ /usr/bin/passwd \ /usr/bin/chfn \ /usr/bin/chsh \ /usr/bin/paste \ /usr/bin/ping \ /usr/bin/pr \ /usr/bin/pr_routes \ /usr/bin/prep \ /usr/bin/printf \ /usr/bin/printroot \ /usr/bin/proto \ /usr/bin/pwd \ /usr/lib/pwdauth \ /usr/bin/rarpd \ /usr/bin/rcp \ /usr/bin/readall \ /usr/bin/readfs \ /usr/bin/remsync \ /usr/bin/rlogin \ /usr/bin/rmdir \ /usr/bin/rsh \ /usr/bin/sed \ /usr/bin/shar \ /usr/bin/size \ /usr/bin/sleep \ /usr/bin/slip \ /usr/bin/sort \ /usr/bin/split \ /usr/bin/stat \ /usr/bin/fstat \ /usr/bin/strings \ /usr/bin/strip \ /usr/bin/stty \ /usr/bin/su \ /usr/bin/sum \ /usr/bin/swapfs \ /usr/bin/sync \ /usr/bin/synctree \ /usr/bin/sysenv \ /usr/bin/tail \ /usr/bin/tar \ /usr/bin/tcpd \ /usr/bin/tcpdp \ /usr/bin/tee \ /usr/bin/term \ /usr/bin/termcap \ /usr/bin/tget \ /usr/bin/time \ /usr/bin/touch \ /usr/bin/tr \ /usr/bin/tsort \ /usr/bin/ttt \ /usr/bin/tty \ /usr/bin/umount \ /usr/bin/uname \ /usr/bin/arch \ /usr/bin/unexpand \ /usr/bin/uniq \ /usr/bin/update \ /usr/bin/uud \ /usr/bin/uudecode \ /usr/bin/uue \ /usr/bin/uuencode \ /usr/bin/vol \ /usr/bin/wc \ /usr/bin/which \ /usr/bin/who \ /usr/bin/whoami \ /usr/bin/write \ /usr/bin/xargs \ /usr/bin/yes \ /bin/cat \ /bin/date \ /bin/fsck \ /bin/intr \ /bin/mount \ /bin/printroot \ /bin/pwd \ /bin/sync \ /bin/umount \ # /usr/bin/add_route: add_route install -cs -o bin $? $@ /usr/bin/del_route: /usr/bin/add_route install -l $? $@ /usr/bin/at: at install -cs -o root -m 4755 $? $@ /usr/bin/atrun: atrun install -cs -o bin $? $@ /usr/bin/backup: backup install -cs -o bin $? $@ /usr/bin/restore: /usr/bin/backup install -l $? $@ /usr/bin/badblocks: badblocks install -cs -o bin $? $@ /usr/bin/banner: banner install -cs -o bin $? $@ /usr/bin/basename: basename install -cs -o bin $? $@ /usr/bin/cal: cal install -cs -o bin $? $@ /usr/bin/calendar: calendar install -cs -o bin $? $@ /usr/bin/cat: cat install -cs -o bin $? $@ /usr/bin/cdiff: cdiff install -cs -o bin $? $@ /usr/bin/cgrep: cgrep install -cs -o bin $? $@ /usr/bin/chmem: chmem install -cs -o bin $? $@ /usr/bin/chmod: chmod install -cs -o bin $? $@ /usr/bin/chown: chown install -cs -o bin $? $@ /usr/bin/chgrp: /usr/bin/chown install -l $? $@ /usr/bin/ci: ci install -cs -o bin $? $@ /usr/bin/cksum: cksum install -cs -o bin $? $@ /usr/bin/cleantmp: cleantmp install -cs -o bin $? $@ /usr/bin/cmp: cmp install -cs -o bin $? $@ /usr/bin/co: co install -cs -o bin $? $@ /usr/bin/comm: comm install -cs -o bin $? $@ /usr/bin/compress: compress install -cs -o bin $? $@ /usr/bin/uncompress /usr/bin/zcat: /usr/bin/compress install -l $? $@ /usr/bin/cp: cp install -cs -o bin $? $@ /usr/bin/clone /usr/bin/cpdir \ /usr/bin/ln /usr/bin/mv /usr/bin/rm: /usr/bin/cp install -l $? $@ /usr/bin/crc: crc install -cs -o bin $? $@ /usr/bin/cut: cut install -cs -o bin $? $@ /usr/bin/date: date install -cs -o bin $? $@ /usr/bin/dd: dd install -cs -o bin $? $@ /usr/bin/decomp16: decomp16 install -cs -o bin $? $@ /usr/bin/df: df install -cs -o root -m 4755 $? $@ /usr/bin/dhrystone: dhrystone install -cs -o bin $? $@ /usr/bin/diff: diff install -cs -o bin $? $@ /usr/bin/dirname: dirname install -cs -o bin $? $@ /usr/bin/du: du install -cs -o bin $? $@ /usr/bin/ed: ed install -cs -o bin $? $@ /usr/bin/eject: eject install -cs -o bin $? $@ /usr/bin/env: env install -cs -o bin $? $@ /usr/bin/expand: expand install -cs -o bin $? $@ /usr/bin/factor: factor install -cs -o bin $? $@ /usr/bin/fgrep: fgrep install -cs -o bin $? $@ /usr/bin/file: file install -cs -o bin $? $@ /usr/bin/find: find install -cs -o bin $? $@ /usr/bin/finger: finger install -cs -o bin $? $@ /usr/bin/fix: fix install -cs -o bin $? $@ /usr/bin/fold: fold install -cs -o bin $? $@ /usr/bin/fortune: fortune install -cs -o bin $? $@ /usr/bin/fsck: fsck install -cs -o bin $? $@ /usr/bin/fsck1: fsck1 install -cs -o bin $? $@ /usr/bin/getty: getty install -cs -o bin $? $@ /usr/bin/gomoku: gomoku install -cs -o bin $? $@ /usr/bin/grep: grep install -cs -o bin $? $@ /usr/bin/egrep: /usr/bin/grep install -l $? $@ /usr/bin/head: head install -cs -o bin $? $@ /usr/bin/host: host install -cs -o bin $? $@ /usr/bin/hostaddr: hostaddr install -cs -o root -m 4755 $? $@ /usr/bin/id: id install -cs -o bin $? $@ /usr/bin/ifconfig: ifconfig install -cs -o root -m 4755 $? $@ /usr/bin/ifdef: ifdef install -cs -o bin $? $@ /usr/bin/in.fingerd: in.fingerd install -cs -o bin $? $@ /usr/bin/in.rshd: in.rshd install -cs -o bin $? $@ /usr/bin/install: installx install -cs -o root -m 4755 $? $@ /usr/bin/intr: intr install -cs -o bin $? $@ /usr/bin/irdpd: irdpd install -cs -o bin $? $@ /usr/bin/isoread: isoread install -cs -o bin $? $@ /usr/bin/isodir /usr/bin/isoinfo: /usr/bin/isoread install -l $? $@ /usr/bin/join: join install -cs -o bin $? $@ /usr/bin/kill: kill install -cs -o bin $? $@ /usr/bin/last: last install -cs -o bin $? $@ /usr/bin/uptime: /usr/bin/last install -l $? $@ /usr/bin/leave: leave install -cs -o bin $? $@ /usr/bin/life: life install -cs -o bin $? $@ /usr/bin/login: login install -cs -o bin $? $@ /usr/bin/look: look install -cs -o bin $? $@ /usr/bin/lp: lp install -cs -o bin $? $@ /usr/bin/lpd: lpd install -cs -o daemon -m 4755 $? $@ /usr/bin/ls: ls install -cs -o bin $? $@ /usr/bin/mail: mail install -cs -o root -m 4755 $? $@ /usr/bin/man: man install -cs -o bin $? $@ /usr/bin/mesg: mesg install -cs -o bin $? $@ /usr/bin/mkdir: mkdir install -cs -o bin $? $@ /usr/bin/mkfifo: mkfifo install -cs -o bin $? $@ /usr/bin/mkfs: mkfs install -cs -o bin $? $@ /usr/bin/mknod: mknod install -cs -o bin $? $@ /usr/bin/mkproto: mkproto install -cs -o bin $? $@ /usr/bin/mkswap: mkswap install -cs -o bin $? $@ /usr/bin/modem: modem install -cs -o bin $? $@ /usr/bin/mount: mount install -cs -o root -m 4755 $? $@ /usr/bin/mt: mt install -cs -o bin $? $@ /usr/bin/nm: nm install -cs -o bin $? $@ /usr/bin/nonamed: nonamed install -cs -o bin $? $@ /usr/bin/od: od install -cs -o bin $? $@ /usr/bin/passwd: passwd install -cs -o root -m 4755 $? $@ /usr/bin/chfn /usr/bin/chsh: /usr/bin/passwd install -l $? $@ /usr/bin/paste: paste install -cs -o bin $? $@ /usr/bin/ping: ping install -cs -o root -m 4755 $? $@ /usr/bin/pr: pr install -cs -o bin $? $@ /usr/bin/pr_routes: pr_routes install -cs -o root -m 4755 $? $@ /usr/bin/prep: prep install -cs -o bin $? $@ /usr/bin/printf: printf install -cs -o bin $? $@ /usr/bin/printroot: printroot install -cs -o bin $? $@ /usr/bin/proto: proto install -cs -o bin $? $@ /usr/bin/pwd: pwd install -cs -o bin $? $@ /usr/lib/pwdauth: pwdauth install -cs -o root -m 4755 $? $@ /usr/bin/rarpd: rarpd install -cs -o bin $? $@ /usr/bin/rcp: rcp install -cs -o bin $? $@ /usr/bin/readall: readall install -cs -o bin $? $@ /usr/bin/readfs: readfs install -cs -o bin $? $@ /usr/bin/remsync: remsync install -cs -o bin $? $@ /usr/bin/rlogin: rlogin install -cs -o bin $? $@ /usr/bin/rmdir: rmdir install -cs -o bin $? $@ /usr/bin/rsh: rsh install -cs -o bin $? $@ /usr/bin/sed: sed install -cs -o bin $? $@ /usr/bin/shar: shar install -cs -o bin $? $@ /usr/bin/size: size install -cs -o bin $? $@ /usr/bin/sleep: sleep install -cs -o bin $? $@ /usr/bin/slip: slip install -cs -o bin $? $@ /usr/bin/sort: sort install -cs -o bin $? $@ /usr/bin/split: split install -cs -o bin $? $@ /usr/bin/stat: stat install -cs -o bin $? $@ /usr/bin/fstat: /usr/bin/stat install -l $? $@ /usr/bin/strings: strings install -cs -o bin $? $@ /usr/bin/strip: strip install -cs -o bin $? $@ /usr/bin/stty: stty install -cs -o bin $? $@ /usr/bin/su: su install -cs -o root -m 4755 $? $@ /usr/bin/sum: sum install -cs -o bin $? $@ /usr/bin/swapfs: swapfs install -cs -o bin $? $@ /usr/bin/sync: sync install -cs -o bin $? $@ /usr/bin/synctree: synctree install -cs -o bin $? $@ /usr/bin/sysenv: sysenv install -cs -o bin $? $@ /usr/bin/tail: tail install -cs -o bin $? $@ /usr/bin/tar: tar install -cs -o bin $? $@ /usr/bin/tcpd: tcpd install -cs -o bin $? $@ /usr/bin/tcpdp: tcpdp install -cs -o bin $? $@ /usr/bin/tee: tee install -cs -o bin $? $@ /usr/bin/term: term install -cs -o bin -g uucp -m 2755 $? $@ /usr/bin/termcap: termcap install -cs -o bin $? $@ /usr/bin/tget: tget install -cs -o bin $? $@ /usr/bin/time: time install -cs -o bin $? $@ /usr/bin/touch: touch install -cs -o bin $? $@ /usr/bin/tr: tr install -cs -o bin $? $@ /usr/bin/tsort: tsort install -cs -o bin $? $@ /usr/bin/ttt: ttt install -cs -o bin $? $@ /usr/bin/tty: tty install -cs -o bin $? $@ /usr/bin/umount: umount install -cs -o root -m 4755 $? $@ /usr/bin/uname: uname install -cs -o bin $? $@ /usr/bin/arch: /usr/bin/uname install -l $? $@ /usr/bin/unexpand: unexpand install -cs -o bin $? $@ /usr/bin/uniq: uniq install -cs -o bin $? $@ /usr/bin/update: update install -cs -o bin $? $@ /usr/bin/uud: uud install -cs -o bin $? $@ /usr/bin/uudecode: /usr/bin/uud install -l $? $@ /usr/bin/uue: uue install -cs -o bin $? $@ /usr/bin/uuencode: /usr/bin/uue install -l $? $@ /usr/bin/vol: vol install -cs -o bin $? $@ /usr/bin/wc: wc install -cs -o bin $? $@ /usr/bin/which: which install -cs -o bin $? $@ /usr/bin/who: who install -cs -o bin $? $@ /usr/bin/whoami: whoami install -cs -o bin $? $@ /usr/bin/write: write install -cs -o bin -g tty -m 2755 $? $@ /usr/bin/xargs: xargs install -cs -o bin $? $@ /usr/bin/yes: yes install -cs -o bin $? $@ /bin/cat: /usr/bin/cat install -lcs $? $@ /bin/date: /usr/bin/date install -lcs $? $@ /bin/fsck: /usr/bin/fsck install -lcs $? $@ /bin/intr: /usr/bin/intr install -lcs $? $@ /bin/mount: /usr/bin/mount install -lcs $? $@ /bin/printroot: /usr/bin/printroot install -lcs $? $@ /bin/pwd: /usr/bin/pwd install -lcs $? $@ /bin/sync: /usr/bin/sync install -lcs $? $@ /bin/umount: /usr/bin/umount install -lcs $? $@ clean: rm -rf $(ALL) a.out core ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* add_route.c Created August 7, 1991 by Philip Homburg */ #define _POSIX_C_SOURCE 2 #include <sys/types.h> #include <sys/ioctl.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/hton.h> #include <net/netlib.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/route.h> #include <net/gen/socket.h> #include <net/gen/ip_io.h> static char *prog_name; static enum { ADD, DEL } action; static void usage(void); static int name_to_ip(char *name, ipaddr_t *addr); static int parse_cidr(char *cidr, ipaddr_t *addr, ipaddr_t *mask); void main(int argc, char *argv[]) { struct netent *netent; ipaddr_t gateway, destination, netmask, defaultmask=0; u8_t high_byte; nwio_route_t route; int ip_fd, itab; int r; int metric; char *check; char *ip_device; char *netmask_str, *metric_str, *destination_str, *gateway_str; int c; char *d_arg, *g_arg, *m_arg, *n_arg, *I_arg; int i_flag, o_flag, D_flag, v_flag; int cidr; prog_name= strrchr(argv[0], '/'); if (prog_name == NULL) prog_name= argv[0]; else prog_name++; if (strcmp(prog_name, "add_route") == 0) action= ADD; else if (strcmp(prog_name, "del_route") == 0) action= DEL; else { fprintf(stderr, "Don't know what to do when named '%s'\n", prog_name); exit(1); } i_flag= 0; o_flag= 0; D_flag= 0; v_flag= 0; g_arg= NULL; d_arg= NULL; m_arg= NULL; n_arg= NULL; I_arg= NULL; while ((c= getopt(argc, argv, "iovDg:d:m:n:I:?")) != -1) { switch(c) { case 'i': if (i_flag) usage(); i_flag= 1; break; case 'o': if (o_flag) usage(); o_flag= 1; break; case 'v': if (v_flag) usage(); v_flag= 1; break; case 'D': if (D_flag) usage(); D_flag= 1; break; case 'g': if (g_arg) usage(); g_arg= optarg; break; case 'd': if (d_arg) usage(); d_arg= optarg; break; case 'm': if (m_arg) usage(); m_arg= optarg; break; case 'n': if (n_arg) usage(); n_arg= optarg; break; case 'I': if (I_arg) usage(); I_arg= optarg; break; case '?': usage(); default: fprintf(stderr, "%s: getopt failed\n", prog_name); exit(1); } } if (optind != argc) usage(); if (i_flag && o_flag) usage(); itab= i_flag; if (i_flag) { if (g_arg == NULL || d_arg == NULL || m_arg == NULL) usage(); } else { if (g_arg == NULL || (d_arg == NULL && n_arg != NULL)) { usage(); } } gateway_str= g_arg; destination_str= d_arg; metric_str= m_arg; netmask_str= n_arg; ip_device= I_arg; if (!name_to_ip(gateway_str, &gateway)) { fprintf(stderr, "%s: unknown host '%s'\n", prog_name, gateway_str); exit(1); } destination= 0; netmask= 0; cidr= 0; if (destination_str) { if (parse_cidr(destination_str, &destination, &netmask)) cidr= 1; else if (inet_aton(destination_str, &destination)) ; else if ((netent= getnetbyname(destination_str)) != NULL) destination= netent->n_net; else if (!name_to_ip(destination_str, &destination)) { fprintf(stderr, "%s: unknown network/host '%s'\n", prog_name, destination_str); exit(1); } high_byte= *(u8_t *)&destination; if (!(high_byte & 0x80)) /* class A or 0 */ { if (destination) defaultmask= HTONL(0xff000000); } else if (!(high_byte & 0x40)) /* class B */ { defaultmask= HTONL(0xffff0000); } else if (!(high_byte & 0x20)) /* class C */ { defaultmask= HTONL(0xffffff00); } else /* class D is multicast ... */ { fprintf(stderr, "%s: Warning: Martian address '%s'\n", prog_name, inet_ntoa(destination)); defaultmask= HTONL(0xffffffff); } if (destination & ~defaultmask) { /* host route */ defaultmask= HTONL(0xffffffff); } if (!cidr) netmask= defaultmask; } if (netmask_str) { if (cidr) usage(); if (inet_aton(netmask_str, &netmask) == 0) { fprintf(stderr, "%s: illegal netmask'%s'\n", prog_name, netmask_str); exit(1); } } if (metric_str) { metric= strtol(metric_str, &check, 0); if (check[0] != '\0' || metric < 1) { fprintf(stderr, "%s: illegal metric %s\n", prog_name, metric_str); } } else metric= 1; if (!ip_device) ip_device= getenv("IP_DEVICE"); if (!ip_device) ip_device= IP_DEVICE; ip_fd= open(ip_device, O_RDWR); if (ip_fd == -1) { fprintf(stderr, "%s: unable to open('%s'): %s\n", prog_name, ip_device, strerror(errno)); exit(1); } if (v_flag) { printf("%s %s route to %s ", action == ADD ? "adding" : "deleting", itab ? "input" : "output", inet_ntoa(destination)); printf("with netmask %s ", inet_ntoa(netmask)); printf("using gateway %s", inet_ntoa(gateway)); if (itab && action == ADD) printf(" at distance %d", metric); printf("\n"); } route.nwr_ent_no= 0; route.nwr_dest= destination; route.nwr_netmask= netmask; route.nwr_gateway= gateway; route.nwr_dist= action == ADD ? metric : 0; route.nwr_flags= (action == DEL && D_flag) ? 0 : NWRF_STATIC; route.nwr_pref= 0; route.nwr_mtu= 0; if (action == ADD) r= ioctl(ip_fd, itab ? NWIOSIPIROUTE : NWIOSIPOROUTE, &route); else r= ioctl(ip_fd, itab ? NWIODIPIROUTE : NWIODIPOROUTE, &route); if (r == -1) { fprintf(stderr, "%s: NWIO%cIP%cROUTE: %s\n", prog_name, action == ADD ? 'S' : 'D', itab ? 'I' : 'O', strerror(errno)); exit(1); } exit(0); } static void usage(void) { fprintf(stderr, "Usage: %s\n" "\t[-o] %s-g gw [-d dst [-n netmask]] %s[-I ipdev] [-v]\n" "\t-i %s-g gw -d dst [-n netmask] %s[-I ipdev] [-v]\n" "Note: <dst> may be in CIDR notation\n", prog_name, action == DEL ? "[-D] " : "", action == ADD ? "[-m metric] " : "", action == DEL ? "[-D] " : "", action == ADD ? "-m metric " : "" ); exit(1); } static int name_to_ip(char *name, ipaddr_t *addr) { /* Translate a name to an IP address. Try first with inet_aton(), then * with gethostbyname(). (The latter can also recognize an IP address, * but only decimals with at least one dot).) */ struct hostent *hostent; if (!inet_aton(name, addr)) { if ((hostent= gethostbyname(name)) == NULL) return 0; if (hostent->h_addrtype != AF_INET) return 0; if (hostent->h_length != sizeof(*addr)) return 0; memcpy(addr, hostent->h_addr, sizeof(*addr)); } return 1; } static int parse_cidr(char *cidr, ipaddr_t *addr, ipaddr_t *mask) { char *slash, *check; ipaddr_t a; int ok; unsigned long len; if ((slash= strchr(cidr, '/')) == NULL) return 0; *slash++= 0; ok= 1; if (!inet_aton(cidr, &a)) ok= 0; len= strtoul(slash, &check, 10); if (check == slash || *check != 0 || len > 32) ok= 0; *--slash= '/'; if (!ok) return 0; *addr= a; *mask= htonl(len == 0 ? 0 : (0xFFFFFFFF << (32-len)) & 0xFFFFFFFF); return 1; } /* * $PchId: add_route.c,v 1.6 2001/04/20 10:45:07 philip Exp $ */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* env 1.0 - Set environment for command Author: Kees J. Bot * 17 Dec 1997 */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> int main(int argc, char **argv) { int i; int iflag= 0; int aflag= 0; extern char **environ; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ if (opt[0] == 0) iflag= 1; /* - */ while (*opt != 0) switch (*opt++) { case 'i': iflag= 1; /* Clear environment. */ break; case 'a': /* Specify arg 0 separately. */ aflag= 1; break; default: fprintf(stderr, "Usage: env [-ia] [name=value] ... [utility [argument ...]]\n"); exit(1); } } /* Clear the environment if -i. */ if (iflag) *environ= nil; /* Set the new environment strings. */ while (i < argc && strchr(argv[i], '=') != nil) { if (putenv(argv[i]) != 0) { fprintf(stderr, "env: Setting '%s' failed: %s\n", argv[i], strerror(errno)); exit(1); } i++; } if (i >= argc) { /* No utility given; print environment. */ char **ep; for (ep= environ; *ep != nil; ep++) { if (puts(*ep) == EOF) { fprintf(stderr, "env: %s\n", strerror(errno)); exit(1); } } return 0; } else { char *util, **args; int err; util= argv[i]; args= argv + i; if (aflag) args++; (void) execvp(util, args); err= errno; fprintf(stderr, "env: Can't execute %s: %s\n", util, strerror(err)); return err == ENOENT ? 127 : 126; } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* at - run a command at a specified time Author: Jan Looyen */ #include <sys/types.h> #include <time.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <stdio.h> #include <limits.h> #include <signal.h> #include <errno.h> #define STARTDAY 0 /* see ctime(3) */ #define LEAPDAY STARTDAY+59 #define MAXDAYNR STARTDAY+365 #define NODAY -2 char CRONPID[] = "/usr/run/cron.pid"; _PROTOTYPE(int main, (int argc, char **argv, char **envp)); _PROTOTYPE(int getltim, (char *t)); _PROTOTYPE(int getlday, (char *m, char *d)); _PROTOTYPE(int digitstring, (char *s)); int main(argc, argv, envp) int argc; char **argv, **envp; { int i, c, mask, ltim, year, lday = NODAY; char buf[64], job[30], pastjob[35], *dp, *sp; struct tm *p; long clk; FILE *fp; char pwd[PATH_MAX+1]; /*-------------------------------------------------------------------------* * check arguments & pipe to "pwd" * *-------------------------------------------------------------------------*/ if (argc < 2 || argc > 5) { fprintf(stderr, "Usage: %s time [month day] [file]\n", argv[0]); exit(1); } if ((ltim = getltim(argv[1])) == -1) { fprintf(stderr, "%s: wrong time specification\n", argv[0]); exit(1); } if ((argc == 4 || argc == 5) && (lday = getlday(argv[2], argv[3])) == -1) { fprintf(stderr, "%s: wrong date specification\n", argv[0]); exit(1); } if ((argc == 3 || argc == 5) && open(argv[argc - 1], O_RDONLY) == -1) { fprintf(stderr, "%s: cannot find: %s\n", argv[0], argv[argc - 1]); exit(1); } if (getcwd(pwd, sizeof(pwd)) == NULL) { fprintf(stderr, "%s: cannot determine current directory: %s\n", argv[0], strerror(errno)); exit(1); } /*-------------------------------------------------------------------------* * determine execution time and create 'at' job file * *-------------------------------------------------------------------------*/ time(&clk); p = localtime(&clk); year = p->tm_year; if (lday == NODAY) { /* no [month day] given */ lday = p->tm_yday; if (ltim <= (p->tm_hour * 100 + p->tm_min)) { lday++; if ((lday == MAXDAYNR && (year % 4)) || lday == MAXDAYNR + 1) { lday = STARTDAY; year++; } } } else switch (year % 4) { case 0: if (lday < p->tm_yday || (lday == p->tm_yday && ltim <= (p->tm_hour * 100 + p->tm_min))) { year++; if (lday > LEAPDAY) lday--; } break; case 1: case 2: if (lday > LEAPDAY) lday--; if (lday < p->tm_yday || (lday == p->tm_yday && ltim <= (p->tm_hour * 100 + p->tm_min))) year++; break; case 3: if (lday < ((lday > LEAPDAY) ? p->tm_yday + 1 : p->tm_yday) || (lday ==((lday > LEAPDAY) ? p->tm_yday + 1 : p->tm_yday) && ltim <= (p->tm_hour * 100 + p->tm_min))) year++; else if (lday > LEAPDAY) lday--; break; } sprintf(job, "/usr/spool/at/%02d.%03d.%04d.%02d", year % 100, lday, ltim, getpid() % 100); sprintf(pastjob, "/usr/spool/at/past/%02d.%03d.%04d.%02d", year % 100, lday, ltim, getpid() % 100); mask= umask(0077); if ((fp = fopen(pastjob, "w")) == NULL) { fprintf(stderr, "%s: cannot create %s: %s\n", argv[0], pastjob, strerror(errno)); exit(1); } /*-------------------------------------------------------------------------* * write environment and command(s) to 'at'job file * *-------------------------------------------------------------------------*/ i = 0; while ((sp= envp[i++]) != NULL) { dp = buf; while ((c= *sp++) != '\0' && c != '=' && dp < buf+sizeof(buf)-1) *dp++ = c; if (c != '=') continue; *dp = '\0'; fprintf(fp, "%s='", buf); while (*sp != 0) { if (*sp == '\'') fprintf(fp, "'\\''"); else fputc(*sp, fp); sp++; } fprintf(fp, "'; export %s\n", buf); } fprintf(fp, "cd '%s'\n", pwd); fprintf(fp, "umask %o\n", mask); if (argc == 3 || argc == 5) fprintf(fp, "%s\n", argv[argc - 1]); else /* read from stdinput */ while ((c = getchar()) != EOF) putc(c, fp); fclose(fp); if (chown(pastjob, getuid(), getgid()) == -1) { fprintf(stderr, "%s: cannot set ownership of %s: %s\n", argv[0], pastjob, strerror(errno)); unlink(pastjob); exit(1); } /* "Arm" the job. */ if (rename(pastjob, job) == -1) { fprintf(stderr, "%s: cannot move %s to %s: %s\n", argv[0], pastjob, job, strerror(errno)); unlink(pastjob); exit(1); } printf("%s: %s created\n", argv[0], job); /* Alert cron to the new situation. */ if ((fp= fopen(CRONPID, "r")) != NULL) { unsigned long pid; pid= 0; while ((c= fgetc(fp)) != EOF && c != '\n') { if ((unsigned) (c - '0') >= 10) { pid= 0; break; } pid= 10*pid + (c - '0'); if (pid >= 30000) { pid= 0; break; } } if (pid > 1) kill((pid_t) pid, SIGHUP); } return(0); } /*-------------------------------------------------------------------------* * getltim() return((time OK) ? daytime : -1) * *-------------------------------------------------------------------------*/ int getltim(t) char *t; { if (t[4] == '\0' && t[3] >= '0' && t[3] <= '9' && t[2] >= '0' && t[2] <= '5' && t[1] >= '0' && t[1] <= '9' && (t[0] == '0' || t[0] == '1' || (t[1] <= '3' && t[0] == '2'))) return(atoi(t)); else return(-1); } /*-------------------------------------------------------------------------* * getlday() return ((date OK) ? yearday : -1) * *-------------------------------------------------------------------------*/ int getlday(m, d) char *m, *d; { int i, day, im; static int cumday[] = {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; static struct date { char *mon; int dcnt; } *pc, kal[] = { { "Jan", 31 }, { "Feb", 29 }, { "Mar", 31 }, { "Apr", 30 }, { "May", 31 }, { "Jun", 30 }, { "Jul", 31 }, { "Aug", 31 }, { "Sep", 30 }, { "Oct", 31 }, { "Nov", 30 }, { "Dec", 31 }, }; pc = kal; im = (digitstring(m)) ? atoi(m) : 0; m[0] &= 0337; for (i = 1; i < 13 && strcmp(m, pc->mon) && im != i; i++, pc++); if (i < 13 && (day = (digitstring(d)) ? atoi(d) : 0) && day <= pc->dcnt) { if (!STARTDAY) day--; return(day + cumday[i]); } else return(-1); } int digitstring(s) char *s; { while (*s >= '0' && *s <= '9') s++; return((*s == '\0') ? 1 : 0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* atrun - perform the work 'at' has squirreled away Author: Jan Looyen */ /*-------------------------------------------------------------------------* * atrun scans directory /usr/spool/at for 'at' jobs to be executed. * * Finished jobs have been moved to directory /usr/spool/at/past. * *-------------------------------------------------------------------------*/ #include <sys/types.h> #include <sys/dir.h> #include <sys/stat.h> #include <fcntl.h> #include <limits.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <dirent.h> _PROTOTYPE(int main, (void)); int main() { char realtime[15], procname[35], procpast[35]; DIR *dir; struct dirent *entry; struct tm *p; struct stat sbuf; time_t clk; /*-------------------------------------------------------------------------* * Compute real time, move 'at' jobs whose filenames < real time to * * /usr/spool/at/past and start a sh for each job. * *-------------------------------------------------------------------------*/ time(&clk); p = localtime(&clk); sprintf(realtime, "%02d.%03d.%02d%02d.00", p->tm_year % 100, p->tm_yday, p->tm_hour, p->tm_min); if ((dir = opendir("/usr/spool/at")) != NULL) while ((entry = readdir(dir)) != NULL) if (entry->d_ino > 0 && entry->d_name[0] != '.' && entry->d_name[0] != 'p' && strncmp(entry->d_name, realtime, (size_t) 11) <= 0) { sprintf(procname, "/usr/spool/at/%s", entry->d_name); sprintf(procpast, "/usr/spool/at/past/%s", entry->d_name); if (fork() == 0) /* code for child */ if (link(procname, procpast) == 0) { /* link ok? */ unlink(procname); stat(procpast, &sbuf); setgid(sbuf.st_gid); setuid(sbuf.st_uid); execl("/bin/sh", "sh", procpast, (char *) 0); fprintf(stderr, "proc %s can't start\n", procpast); exit(1); } } return(0); } �����������������������������������������������������������������������������������������������������������������������������������������������/* backup - backup a directory Author: Andy Tanenbaum */ /* This program recursively backs up a directory. It has two typical uses: * * 1. Backing up a directory to 1 or more diskettes * 2. Backing up RAM disk to a shadow directory on hard disk * * The backup directory or medium may be empty, in which case, the entire * source directory is copied, or it may contain an old backup, in which * case only those files that are new or out of date are copied. In this * respect, 'backup' resembles 'make', except that no 'makefile' is needed. * The backed up copy may optionally be compressed to save space. * * The following flags exist: * * -d At the top level, only back up directories (not loose files) * -j Don't copy junk: *.Z, *.bak, *.log, a.out, and core * -m If ENOSPC encountered, ask for another diskette * -n No directories, only loose files are backed up * -o Don't copy *.o files * -r Restore files (ie. uncompress if necessary) * -s Don't copy *.s files * -t Set creation date of target-file equal to cdate of source-file * -v Verbose (announce what is being done) * -z Compress on backup/uncompress on restore * * Patches: * 30 Mar 91. Added restore option. cwr. * 9 Sep 91. Changed user interface. cwr. * 21 Jan 93. Revised error messages. cwr. * 29 Mar 95. Added -o, NARROW define. cwr. */ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <fcntl.h> #include <utime.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #undef NARROW /* Width of verbose output */ #define COPY_SIZE 4096 #define MAX_ENTRIES 512 #define DIR_ENT_SIZE 16 #define NAME_SIZE 14 #define MAX_PATH 256 #define NONFATAL 0 #define FATAL 1 #define NO_SAVINGS 512 /* compress can return code 2 */ #define OUT_OF_SPACE 2 struct dir_buf { /* list of the src directory */ unsigned short ino; char name[NAME_SIZE]; } dir_buf[MAX_ENTRIES]; struct sorted { int mode; /* file mode */ char *namep; /* pointer to name in dir_buf */ long acctime; /* time of last access */ long modtime; /* time of last modification */ } sorted[MAX_ENTRIES]; char copybuf[COPY_SIZE]; char *pname; int dflag, jflag, mflag, nflag, oflag, rflag, sflag, tflag, vflag, zflag; extern int errno; extern char **environ; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void maketarget, (char *dir2)); _PROTOTYPE(int make_dir, (char *dir)); _PROTOTYPE(int stat_all, (char *dir1, int n)); _PROTOTYPE(void sort_dir, (int m)); _PROTOTYPE(void process, (int m, char *dir1, char *dir2)); _PROTOTYPE(void swap, (struct sorted *sp1, struct sorted *sp2)); _PROTOTYPE(int copy, (char *dir1, struct sorted *sp, char *cbuf2)); _PROTOTYPE(int zcopy, (char *src, char *targ)); _PROTOTYPE(void copydir, (char *dir1, char *dir2, char *namep)); _PROTOTYPE(void newdisk, (char *dir)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void error, (int type, char *s1, char *s2, char *s3)); int main(argc, argv) int argc; char *argv[]; { int ct, n, m, fd; char *dir1, *dir2, *cp, c; struct stat s; (void) sync(); /* Get the flags */ if ((pname = strrchr(argv[0], '/')) == (char *)NULL) pname = argv[0]; else pname++; if (argc < 3 || argc > 4) usage(); if (argc == 4) { cp = argv[1]; if (*cp++ != '-') usage(); while ((c = *cp++) != '\0') { switch (c) { case 'd': dflag++; break; case 'j': jflag++; break; case 'm': mflag++; break; case 'n': nflag++; break; case 'o': oflag++; break; case 's': sflag++; break; case 'r': rflag++; break; case 't': tflag++; break; case 'v': vflag++; break; case 'z': zflag++; break; default: usage(); } } dir1 = argv[2]; dir2 = argv[3]; } else { dir1 = argv[1]; dir2 = argv[2]; } if (!strcmp(pname, "restore") && !rflag) rflag++; /* Check for a valid source */ if (stat(dir1, &s) < 0) error(FATAL, "cannot stat ", dir1, ""); if ((s.st_mode & S_IFMT) != S_IFDIR) error(FATAL, "non-directory ", dir1, ""); /* Read in the source directory */ fd = open(dir1, O_RDONLY); if (fd < 0) error(FATAL, "cannot open ", dir1, ""); ct = read(fd, (char *)&dir_buf[0], MAX_ENTRIES * DIR_ENT_SIZE); close(fd); if (ct == MAX_ENTRIES * DIR_ENT_SIZE) error(FATAL, "directory ", dir1, " is too large"); /* Create the target directory. */ maketarget(dir2); /* Stat all the entries. */ n = ct / DIR_ENT_SIZE; m = stat_all(dir1, n); /* Remove non-entries and sort what's left. */ sort_dir(m); /* Process each of the m entries one at a time. */ process(m, dir1, dir2); return(0); } void maketarget(dir2) char *dir2; { /* The target directory is created if it does not already exist. */ char *p, c, dbuf[MAX_PATH]; if (access(dir2, 6) == 0) return; /* if target exists, we're done */ if (make_dir(dir2) == 0) return; /* we just made it */ /* We have to try creating all the higher level directories. */ strcpy(dbuf, dir2); p = dbuf + 1; while (1) { while (*p != '/' && *p != '\0') p++; c = *p; /* either / or \0 */ *p = 0; make_dir(dbuf); if (c == '\0') return; *p = c; p++; } } int make_dir(dir) char *dir; { /* Create a directory. */ int pid, status; if ((pid = fork()) < 0) error(FATAL, "cannot fork off mkdir to create ", dir, ""); if (pid > 0) { /* Parent process waits for child (mkdir). */ wait(&status); return(status); } else { /* Child process executes mkdir */ close(2); /* don't want mkdir's error messages */ execle("/bin/mkdir", "mkdir", dir, (char *) 0, environ); execle("/usr/bin/mkdir", "mkdir", dir, (char *) 0, environ); error(FATAL, "cannot execute mkdir", "", ""); } return(0); } int stat_all(dir1, n) char *dir1; int n; { /* Stat all the directory entries. By doing this all at once, the disk * head can stay in the inode area. */ int i, j; char cbuf[MAX_PATH]; struct stat s; for (i = 0; i < n; i++) { /* Mark "." and ".." as null entries, as well as unstatable ones. */ if (strcmp(dir_buf[i].name, ".") == 0) dir_buf[i].ino = 0; if (strcmp(dir_buf[i].name, "..") == 0) dir_buf[i].ino = 0; if (dir_buf[i].ino == 0) continue; /* Stat the file. */ strcpy(cbuf, dir1); strncat(cbuf, "/", (size_t)1); strncat(cbuf, dir_buf[i].name, (size_t)NAME_SIZE); if (stat(cbuf, &s) < 0) { error(NONFATAL, "cannot stat ", cbuf, ""); dir_buf[i].ino = 0; /* mark as unusable */ continue; } sorted[i].mode = s.st_mode; sorted[i].acctime = s.st_atime; sorted[i].modtime = s.st_mtime; sorted[i].namep = dir_buf[i].name; } /* Squeeze out all the entries whose ino field is 0. */ j = 0; for (i = 0; i < n; i++) { if (dir_buf[i].ino != 0) { sorted[j] = sorted[i]; j++; } } return(j); } void sort_dir(m) int m; { /* Sort the directory using bubble sort. */ struct sorted *sp1, *sp2; for (sp1 = &sorted[0]; sp1 < &sorted[m - 1]; sp1++) { for (sp2 = sp1 + 1; sp2 < &sorted[m]; sp2++) { if (strncmp(sp1->namep, sp2->namep, (size_t)NAME_SIZE) > 0) swap(sp1, sp2); } } } void process(m, dir1, dir2) int m; char *dir1, *dir2; { /* Process each entry in sorted[]. If it is a regular file, stat the target * file. The the source is newer, copy it. If the entry is a directory, * recursively call the entire program to process the directory. */ int er, fmode, res, namlen; struct sorted *sp; struct stat s; char cbuf[MAX_PATH]; for (sp = &sorted[0]; sp < &sorted[m]; sp++) { fmode = sp->mode & S_IFMT; if (fmode == S_IFREG) { /* Regular file. Construct target name and stat it. */ strcpy(cbuf, dir2); strncat(cbuf, "/", (size_t)1); strncat(cbuf, sp->namep, (size_t)NAME_SIZE); namlen = strlen(sp->namep); if (namlen > NAME_SIZE) namlen = NAME_SIZE; /* no terminating null here */ /* Switch between compressed and uncompressed file names */ if (zflag && !rflag && strncmp((sp->namep + namlen - 2), ".Z", (size_t)2) && (namlen <= (NAME_SIZE - 2))) strncat(cbuf, ".Z", (size_t)2); if (zflag && rflag && !strncmp((sp->namep + namlen - 2), ".Z", (size_t)2)) cbuf[strlen(cbuf) - 2] = '\0'; er = stat(cbuf, &s); if (er < 0 || sp->modtime > s.st_mtime) { res = copy(dir1, sp, cbL��L��L��L��L��L��L��L��L������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������uf); } else { res = NONFATAL; } /* Check status of the copy. */ if (res == OUT_OF_SPACE) { printf("Out of space while copying to %s\n", cbuf); /* We ran out of space copying a regular file. */ if (mflag == 0) error(FATAL, "Quitting, disk full", "", ""); /* If -m, ask for new diskette and continue. */ newdisk(dir2); sp--; continue; } } else if (fmode == S_IFDIR) { /* Directory. Execute this program recursively. */ copydir(dir1, dir2, sp->namep); } else if (fmode == S_IFBLK || fmode == S_IFCHR) { /* Special file. */ strncpy(cbuf, sp->namep, (size_t)NAME_SIZE); printf("%s is special file. Not backed up.\n", cbuf); } } } void swap(sp1, sp2) struct sorted *sp1, *sp2; { /* Swap two directory entries. */ struct sorted d; d = *sp1; *sp1 = *sp2; *sp2 = d; } int copy(dir1, sp, cbuf2) struct sorted *sp; char *dir1, *cbuf2; { /* Copy a regular file. */ int fd1, fd2, nr, nw, res, n; char cbuf1[MAX_PATH], *p; #ifdef NARROW char *msg = (rflag || strcmp(pname, "backup")) ? "Restored" : "Backing up"; #endif /* If the -j or -o or -s flags were given, suppress certain files. */ p = sp->namep; n = strlen(p); if (n > NAME_SIZE) n = NAME_SIZE; if (jflag) { if (strcmp(p, "a.out") == 0) return(0); if (strcmp(p, "core") == 0) return (0); if (strcmp(p + n - 2, ".Z") == 0) return (0); if (strcmp(p + n - 4, ".bak") == 0) return (0); if (strcmp(p + n - 4, ".log") == 0) return (0); } if (oflag) { if (strcmp(p + n - 2, ".o") == 0) return(0); } if (sflag) { if (strcmp(p + n - 2, ".s") == 0) return(0); } res = 0; if (dflag) return(0); /* backup -d means only directories */ strcpy(cbuf1, dir1); strncat(cbuf1, "/", (size_t)1); strncat(cbuf1, sp->namep, (size_t)NAME_SIZE); /* cbuf1 = source file name */ /* At this point, cbuf1 contains the source file name, cbuf2 the target. */ fd1 = open(cbuf1, O_RDONLY); if (fd1 < 0) { error(NONFATAL, "cannot open ", cbuf1, ""); return(res); } fd2 = creat(cbuf2, (sp->mode | S_IWUSR) & 07777); if (fd2 < 0) { if (errno == ENFILE) { close(fd1); return(OUT_OF_SPACE); } error(NONFATAL, "cannot create ", cbuf2, ""); close(fd1); return(res); } /* Both files are now open. Do the copying. */ if (!rflag && strncmp((sp->namep + n - 2), ".Z", (size_t)2) || rflag && !strncmp((sp->namep + n - 2), ".Z", (size_t)2)) { if (zflag && (rflag || (n <= (NAME_SIZE - 2)))) { close(fd1); close(fd2); res = zcopy(cbuf1, cbuf2); if (tflag) utime(cbuf2, (struct utimbuf *) & (sp->acctime)); if (res != 0) unlink(cbuf2); /* if error, get rid of the corpse */ #ifdef NARROW if (vflag && res == 0) printf("%s %s\n", msg, cbuf1); #else if (vflag && res == 0) { printf("%-37.37s -> %-37.37s\n", cbuf1, cbuf2); if (strlen(cbuf1) > 37 || strlen(cbuf2) > 37) printf("%37.37s %37.37s\n", (strlen(cbuf1) > 37) ? (cbuf1 + 37) : "", (strlen(cbuf2) > 37) ? (cbuf2 + 37) : ""); } #endif return(res); } } while (1) { nr = read(fd1, copybuf, COPY_SIZE); if (nr == 0) break; if (nr < 0) { error(NONFATAL, "read error on ", cbuf1, ""); res = EIO; break; } nw = write(fd2, copybuf, nr); if (nw < 0) { if (errno == ENOSPC) { /* Device is full. */ res = OUT_OF_SPACE; break; } /* True write error. */ error(NONFATAL, "write error on ", cbuf2, ""); res = EIO; break; } } if (res == 0) { #ifdef NARROW if (vflag) printf("%s %s\n", msg, cbuf1); #else if (vflag) { printf("%-37.37s -> %-37.37s\n", cbuf1, cbuf2); if (strlen(cbuf1) > 37 || strlen(cbuf2) > 37) printf("%37.37s %37.37s\n", (strlen(cbuf1) > 37) ? (cbuf1 + 37) : "", (strlen(cbuf2) > 37) ? (cbuf2 + 37) : ""); } #endif } else { unlink(cbuf2); } close(fd1); close(fd2); if (tflag) utime(cbuf2, (struct utimbuf *) & (sp->acctime)); return(res); } int zcopy(src, targ) char *src, *targ; { int pid, status, res, s; char fbuf[20]; strcpy(fbuf, "-c"); if (rflag) strcat(fbuf, "d"); else strcat(fbuf, "f"); if ((pid = fork()) < 0) error(FATAL, "cannot fork", "", ""); if (pid > 0) { wait(&status); /* Error codes 0 and 2 are ok, assume others mean disk is full. */ res = (status == 0 || status == NO_SAVINGS ? 0 : OUT_OF_SPACE); return(res); } else { /* Child must execute compress. */ close(1); s = open(targ, O_RDWR); if (s < 0) error(FATAL, "cannot write on ", "targ", ""); execle("/bin/compress", "compress", fbuf, src, (char *)0, environ); execle("/usr/bin/compress", "compress", fbuf, src, (char *)0, environ); error(FATAL, "cannot exec compress", "", ""); } return(0); } void copydir(dir1, dir2, namep) char *dir1, *dir2, *namep; { /* Copy a directory. */ int pid, status; char fbuf[20], d1buf[MAX_PATH], d2buf[MAX_PATH]; if (nflag) return; /* backup -n means no directories */ fbuf[0] = '\0'; /* Handle directory copy by forking off 'backup' ! */ if (jflag || mflag || oflag || rflag || sflag || tflag || vflag || zflag) strcpy(fbuf, "-"); if (jflag) strcat(fbuf, "j"); if (mflag) strcat(fbuf, "m"); if (oflag) strcat(fbuf, "o"); if (rflag) strcat(fbuf, "r"); if (sflag) strcat(fbuf, "s"); if (tflag) strcat(fbuf, "t"); if (vflag) strcat(fbuf, "v"); if (zflag) strcat(fbuf, "z"); strcpy(d1buf, dir1); strcat(d1buf, "/"); strncat(d1buf, namep, (size_t)NAME_SIZE); strcpy(d2buf, dir2); strcat(d2buf, "/"); strncat(d2buf, namep, (size_t)NAME_SIZE); if ((pid = fork()) < 0) error(FATAL, "cannot fork", "", ""); if (pid > 0) { /* Parent waits for child, then returns. */ wait(&status); return; } if (fbuf[0] == '-') { execle(pname, pname, fbuf, d1buf, d2buf, (char *) 0, environ); execle("/bin/backup", "backup", fbuf, d1buf, d2buf, (char *)0,environ); execle("/usr/bin/backup","backup",fbuf,d1buf,d2buf,(char *)0,environ); error(FATAL, "cannot recursively exec backup", "", ""); } else { execle(pname, pname, d1buf, d2buf, (char *) 0, environ); execle("/bin/backup", "backup", d1buf, d2buf, (char *)0,environ); execle("/usr/bin/backup","backup", d1buf, d2buf, (char *)0,environ); error(FATAL, "cannot recursively exec backup", "", ""); } } void newdisk(dir) char *dir; { /* Ask for a new diskette. A big problem is that this program does not * know which device is being used and where it is mounted on. As an * emergency solution, fork off a shell and ask the user to do the work. */ int pid, status; printf("\nDiskette full. Please do the following:\n"); printf(" 1. Unmount the diskette using /etc/umount\n"); printf(" 2. Physically replace the diskette by the next one.\n"); printf(" 3. Mount the new diskette using /etc/mount\n"); printf(" 4. Type CTRL-D to return to the backup/restore program\n"); if ((pid = fork()) < 0) error(FATAL, "cannot fork", "", ""); if (pid > 0) { wait(&status); maketarget(dir); /* make the directory */ } else { execle("/bin/sh", "sh", "-i", (char *) 0, environ); execle("/usr/bin/sh", "sh", "-i", (char *) 0, environ); error(FATAL, "cannot execute shell to ask for new diskette", "", ""); } } void usage() { fprintf(stderr, "Usage: %s [-djmnorstvz] dir1 dir2\n", pname); exit(2); } void error(type, s1, s2, s3) int type; char *s1, *s2, *s3; { fprintf(stderr, "%s: %s%s%s\n", pname, s1, s2, s3); if (type == NONFATAL) return; else exit(type); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* badblocks - collect bad blocks in a file Author: Jacob Bunschoten */ /* Usage "badblocks block_special [Up_to_7_blocks]" */ /* This program is written to handle BADBLOCKS on a hard or floppy disk. * The program asks for block_numbers. These numbers can be obtained with * the program readall, written by A. Tanenbaum. It then creates a * file on the disk containing up to 7 bad blocks. * * BUG: * * When the zone_size > block_size it can happen that * the zone is already allocated. This means some * file is using this zone and may use all the blocks including * the bad one. This can be cured by inspecting the zone_bitmap * (is already done) and change the file if this zone is used. * This means that another zone must be allocated and * the inode wich claims this zone must be found and changed. * */ #include <sys/types.h> #include <sys/stat.h> #include <minix/config.h> #include <minix/type.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include "../../fs/const.h" /* must be included before stdio.h */ #undef printf /* so its define of printf can be undone */ #include "../../fs/type.h" #include <string.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void rw_super, (int flag)); _PROTOTYPE(void get_super, (void)); _PROTOTYPE(void put_super, (void)); _PROTOTYPE(void rw_inode, (struct stat * stat_ptr, int rw_mode)); _PROTOTYPE(void get_inode, (struct stat * stat_ptr)); _PROTOTYPE(void put_inode, (struct stat * stat_ptr)); _PROTOTYPE(long rd_cmdline, (int argc, char *argv[])); _PROTOTYPE(void modify, (int nr_blocks)); _PROTOTYPE(void save_blk, (block_t blk_num)); _PROTOTYPE(void reset_blks, (void)); _PROTOTYPE(void show_blks, (void)); _PROTOTYPE(int blk_is_used, (block_t blk_num)); _PROTOTYPE(int blk_ok, (block_t num)); _PROTOTYPE(void set_bit, (zone_t num)); _PROTOTYPE(long rd_num, (void)); _PROTOTYPE(int ok, (char *str)); _PROTOTYPE(void done, (int nr)); /* Super block table. * * The disk layout is: * * Item # block * boot block 1 * super block 1 * inode map s_imap_blocks * zone map s_zmap_blocks * inodes (s_ninodes + 1 + inodes_per_block - 1)/inodes_per_block * unused * data zones (s_nzones - s_firstdatazone) << s_log_zone_size * */ #define OK 0 #define NOT_OK 1 #define QUIT 2 #define READ 0 #define WRITE 1 #define HARMLESS 0 #define DIR_CREATED 1 #define DEV_MOUNTED 2 #define FILE_EXISTS 3 #define SUCCESS 4 #define BYTE 0377 #define BLOCK_SIZE 1024 #define SIZE_OF_INT (sizeof (int) ) /* Define V_NR_DZONES as the larger of V1_NR_DZONES and V2_NR_DZONES. */ #if (V1_NR_DZONES > V2_NR_DZONES) #define V_NR_DZONES V1_NR_DZONES #define V_SMALLER V2_NR_DZONES #else #define V_NR_DZONES V2_NR_DZONES #define V_SMALLER V1_NR_DZONES #endif struct super_block { ino_t s_ninodes; /* # usable inodes on the minor device */ zone1_t s_nzones; /* total device size, including bit maps etc */ short s_imap_blocks; /* # of blocks used by inode bit map */ short s_zmap_blocks; /* # of blocks used by zone bit map */ zone1_t s_firstdatazone; /* number of first data zone */ short s_log_zone_size; /* log2 of blocks/zone */ off_t s_max_size; /* maximum file size on this device */ short s_magic; /* magic number to recognize super-blocks */ short s_pad; /* try to avoid compiler-dependent padding */ zone_t s_zones; /* number of zones (replaces s_nzones in V2) */ } super_block; /* ====== globals ======= */ char *dev_name; char f_name[] = ".Bad_XXXXXX"; char file_name[50]; char dir_name[] = "/tmpXXXXXX"; block_t block[V_NR_DZONES + 1]; /* last block contains zero */ int interactive; /* 1 if interactive (argc == 2) */ int position = 2; /* next block # is argv[position] */ FILE *f; int fd; int eofseen; /* set if '\n' seen */ struct stat stat_buf; struct super_block *sp; int inodes_per_block; size_t inode_size; int v1fs; /* TRUE for V1 file system, FALSE for V2 */ d1_inode d1inode; /* declare a V1 disk inode */ d1_inode *ip1; d2_inode d2inode; /* declare a V2 disk inode */ d2_inode *ip2; /* ====== super block routines ======= */ void rw_super(flag) int flag; { /* read or write a superblock */ int rwd; lseek(fd, 0L, SEEK_SET); /* rewind */ lseek(fd, (long) BLOCK_SIZE, SEEK_SET); /* seek */ if (flag == READ) rwd = read(fd, (char *) sp, SUPER_SIZE); else rwd = write(fd, (char *) sp, SUPER_SIZE); if (rwd != SUPER_SIZE) { /* ok ? */ printf("Bad %s in get_super() (should be %u is %d)\n", flag == READ ? "read" : "write", (unsigned) SUPER_SIZE, rwd); done(DIR_CREATED); } } void get_super() /* Get super_block. global pointer sp is used */ { rw_super(READ); if (sp->s_magic == SUPER_MAGIC) { /* This is a V1 file system. */ v1fs = 1; /* file system is not V2 */ } else if (sp->s_magic == SUPER_V2) { /* This is a V2 file system. */ v1fs = 0; /* this is a V2 file system */ } else { /* Neither V1 nor V2. */ printf("Bad magic number in super_block (0x%x)\n", (unsigned) sp->s_magic); done(DIR_CREATED); } } void put_super() { rw_super(WRITE); } /* ========== inode routines =========== */ void rw_inode(stat_ptr, rw_mode) struct stat *stat_ptr; int rw_mode; { int rwd; ino_t i_num; block_t blk, offset; i_num = stat_ptr->st_ino; blk = (block_t) (2 + sp->s_imap_blocks + sp->s_zmap_blocks); blk += (block_t) ((i_num - 1) / inodes_per_block); blk *= (block_t) (BLOCK_SIZE);/* this block */ offset = (block_t) ((i_num - 1) % inodes_per_block); offset *= (block_t) (inode_size); /* and this offset */ lseek(fd, (off_t) 0, SEEK_SET); /* rewind */ lseek(fd, (off_t) (blk + offset), SEEK_SET); /* seek */ /* Pointer is at the inode */ if (v1fs) { /* This is a V1 file system. */ if (rw_mode == READ) { /* read it */ rwd = read(fd, (char *) ip1, inode_size); } else { /* write it */ rwd = write(fd, (char *) ip1, inode_size); } } else { /* This is a V2 file system. */ if (rw_mode == READ) { /* read it */ rwd = read(fd, (char *) ip2, inode_size); } else { /* write it */ rwd = write(fd, (char *) ip2, inode_size); } } if (rwd != inode_size) { /* ok ? */ printf("Bad %s in get_inode()\n", (rw_mode == READ) ? "read" : "write"); done(DIR_CREATED); } } void get_inode(stat_ptr) struct stat *stat_ptr; { int cnt; rw_inode(stat_ptr, READ); if (v1fs) { for (cnt = 0; cnt < V1_NR_TZONES; cnt++) ip1->d1_zone[cnt] = 0; /* Just to be safe */ } else { for (cnt = 0; cnt < V2_NR_TZONES; cnt++) ip2->d2_zone[cnt] = 0; /* Just to be safe */ } } void put_inode(stat_ptr) struct stat *stat_ptr; { rw_inode(stat_ptr, WRITE); } /* ============== main program ================= */ int main(argc, argv) int argc; char *argv[]; { int cnt, finished; block_t blk_nr; struct stat dev_stat; FILE *fp; sp = &super_block; ip1 = &d1inode; ip2 = &d2inode; if (argc < 2 || argc > 9) { fprintf(stderr, "Usage: %s block_special [up_to_7_blocks]\n", argv[0]); done(HARMLESS); } interactive = (argc == 2 ? 1 : 0); /* Do some test. */ if (geteuid()) { printf("Sorry, not in superuser mode \n"); printf("Set_uid bit must be on or you must become super_user\n"); done(HARMLESS); } dev_name = argv[1]; mktemp(dir_name); if (mkdir(dir_name, 0777) == -1) { fprintf(stderr, "%s is already used in system\n", dir_name); done(HARMLESS); } /* Mount device. This call may fail. */ mount(dev_name, dir_name, 0); /* Succes. dev was mounted, try to umount */ /* Umount device. Playing with the file system while other processes * have access to this device is asking for trouble */ if (umount(dev_name) == -1) { printf("Could not umount device %s.\n", dev_name); done(HARMLESS); } mktemp(f_name); /* Create "/tmpXXXXpid/.BadXXpid" */ strcat(file_name, dir_name); strcat(file_name, "/"); strcat(file_name, f_name); if (mount(dev_name, dir_name, 0) == -1) { /* this call should work */ fprintf(stderr, "Could not mount device anymore\n"); done(HARMLESS); } if (stat(file_name, &stat_buf) != -1) { printf("File %s already exists\n", file_name); L��L��L��L��L��L��L��L��L������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������done(DEV_MOUNTED); } if ((fp = fopen(file_name, "w")) == NULL) { printf("Cannot create file %s\n", file_name); done(DEV_MOUNTED); } chmod(file_name, 0); /* "useless" file */ if (stat(file_name, &stat_buf) == -1) { printf("What? Second call from stat failed\n"); done(FILE_EXISTS); } /* Stat buf must be safed. We can now calculate the inode on disk */ fclose(fp); /* ===== the badblock file is created ===== */ if (umount(dev_name) == -1) { printf("Can not umount device anymore??? \n"); done(DIR_CREATED); } if ((fd = open(dev_name, O_RDWR)) == -1) { printf("Can not open device %s\n", dev_name); done(DEV_MOUNTED); } if (fstat(fd, &dev_stat) == -1) { printf("fstat on device %s failed\n", dev_name); done(DEV_MOUNTED); } if ((dev_stat.st_mode & S_IFMT) != S_IFBLK) { printf("Device \"%s\" is not a block_special.\n", dev_name); done(DEV_MOUNTED); } get_super(); if (sp->s_log_zone_size) { printf("Block_size != zone_size."); printf("This program can not handle it\n"); done(DIR_CREATED); } /* The number of inodes in a block differs in V1 and V2. */ if (v1fs) { inodes_per_block = V1_INODES_PER_BLOCK; inode_size = V1_INODE_SIZE; } else { inodes_per_block = V2_INODES_PER_BLOCK; inode_size = V2_INODE_SIZE; } get_inode(&stat_buf); for (finished = 0; !finished;) { if (interactive) printf("Give up to %d bad block numbers separated by spaces\n", V_SMALLER); reset_blks(); cnt = 0; /* cnt keep track of the zone's */ while (cnt < V_SMALLER) { int tst; if (interactive) blk_nr = rd_num(); else blk_nr = rd_cmdline(argc, argv); if (blk_nr == -1) break; tst = blk_ok(blk_nr); /* Test if this block is free */ if (tst == OK) { cnt++; save_blk(blk_nr); } else if (tst == QUIT) break; } if (interactive) show_blks(); if (!cnt) done(FILE_EXISTS); if (interactive) { switch (ok("All these blocks ok <y/n/q> (y:Device will change) ")) { case OK: finished = 1; break; case NOT_OK: break; case QUIT: done(FILE_EXISTS); } } else { finished = 1; } } modify(cnt); close(fd); /* free device */ done(SUCCESS); return(0); } long rd_cmdline(argc, argv) int argc; char *argv[]; { if (position == argc) return(-1); return(atol(argv[position++])); } void modify(nr_blocks) int nr_blocks; { int i; if (nr_blocks == 0) return; if (v1fs) { /* This is a V1 file system. */ for (i = 0; i < nr_blocks; i++) { set_bit(block[i]); ip1->d1_zone[i] = block[i]; } } else { /* This is a V2 file system. */ for (i = 0; i < nr_blocks; i++) { set_bit(block[i]); ip2->d2_zone[i] = block[i]; } } if (v1fs) { ip1->d1_size = (long) (BLOCK_SIZE * nr_blocks); /* give file size */ ip1->d1_mtime = 0; /* Who wants a file from 1970? */ } else { ip2->d2_size = (long) (BLOCK_SIZE * nr_blocks); /* give file size */ ip2->d2_atime = ip2->d2_mtime = ip2->d2_ctime = 0; } put_inode(&stat_buf); /* save the inode on disk */ put_super(); /* bit_maps too */ } static blk_cnt = 0; void save_blk(blk_num) block_t blk_num; { block[blk_cnt++] = blk_num; } void reset_blks() { int i; for (i = 0; i <= V_NR_DZONES; i++) block[i] = 0; /* Note: Last block_number is set to zero */ blk_cnt = 0; } void show_blks() { int i; for (i = 0; i < blk_cnt; i++) printf("Block[%d] = %lu\n", i, (unsigned long) block[i]); } int blk_is_used(blk_num) block_t blk_num; { /* return TRUE(1) if used */ int i; for (i = 0; block[i] && block[i] != blk_num; i++); return(block[i] != 0) ? 1 : 0; } /* ===== bitmap handling ====== */ #define BIT_MAP_SHIFT 13 #define INT_BITS (SIZE_OF_INT << 3) int blk_ok(num) /* is this zone free (y/n) */ block_t num; { block_t blk_offset; int rd; int blk, offset, words, bit, tst_word; zone_t z_num; if (blk_is_used(num)) { printf("Duplicate block (%lu) given\n", (unsigned long) num); return NOT_OK; } /* Assumption zone_size == block_size */ z_num = num - (sp->s_firstdatazone - 1); /* account offset */ /* Calculate the word in the bitmap. */ blk = z_num >> BIT_MAP_SHIFT; /* which block */ offset = z_num - (blk << BIT_MAP_SHIFT); /* offset */ words = z_num / INT_BITS; /* which word */ blk_offset = (block_t) (2 + sp->s_imap_blocks); /* zone map */ blk_offset *= (block_t) BLOCK_SIZE; /* of course in block */ blk_offset += (block_t) (words * SIZE_OF_INT); /* offset */ lseek(fd, (off_t) 0, SEEK_SET); /* rewind */ lseek(fd, (off_t) blk_offset, SEEK_SET); /* set pointer at word */ rd = read(fd, (char *) &tst_word, SIZE_OF_INT); if (rd != SIZE_OF_INT) { printf("Read error in bitmap\n"); done(DIR_CREATED); } /* We have the tst_word, check if bit was off */ bit = offset % INT_BITS; if (((tst_word >> bit) & 01) == 0) /* free */ return OK; else { printf("Bad number %lu. ", (unsigned long) num); printf("This zone (block) is marked in bitmap\n"); return NOT_OK; } } void set_bit(num) /* write in the bitmap */ zone_t num; { int rwd; long blk_offset; int blk, offset, words, tst_word, bit; unsigned z_num; z_num = num - (sp->s_firstdatazone - 1); blk = z_num >> BIT_MAP_SHIFT; /* which block */ offset = z_num - (blk << BIT_MAP_SHIFT); /* offset in block */ words = z_num / INT_BITS; /* which word */ blk_offset = (long) (2 + sp->s_imap_blocks); blk_offset *= (long) BLOCK_SIZE; blk_offset += (long) (words * SIZE_OF_INT); lseek(fd, (off_t) 0, SEEK_SET); /* rewind */ lseek(fd, (off_t) blk_offset, SEEK_SET); rwd = read(fd, (char *) &tst_word, SIZE_OF_INT); if (rwd != SIZE_OF_INT) { printf("Read error in bitmap\n"); done(DEV_MOUNTED); } bit = offset % INT_BITS; if (((tst_word >> bit) & 01) == 0) { /* free */ lseek(fd, 0L, SEEK_SET);/* rewind */ lseek(fd, (off_t) blk_offset, SEEK_SET); tst_word |= (1 << bit); /* not free anymore */ rwd = write(fd, (char *) &tst_word, SIZE_OF_INT); if (rwd != SIZE_OF_INT) { printf("Bad write in zone map\n"); printf("Check file system \n"); done(DIR_CREATED); } return; } printf("Bit map indicates that block %lu is in use. Not marked.\n", (unsigned long) num); /* done(DIR_CREATED); */ return; } /* ======= interactive interface ======= */ long rd_num() { /* read a number from stdin */ long num; int c; if (eofseen) return(-1); do { c = getchar(); if (c == EOF || c == '\n') return(-1); } while (c != '-' && (c < '0' || c > '9')); if (c == '-') { printf("Block numbers must be positive\n"); exit(1); } num = 0; while (c >= '0' && c <= '9') { num *= 10; num += c - '0'; c = getchar(); if (c == '\n') eofseen = 1; } return num; } int ok(str) char *str; { int c; for (;;) { printf("%s", str); while ((c = getchar()) != EOF && c != 'y' && c != 'n' && c != 'q') if (c != '\n') printf(" Bad character %c\n", (char) c); switch (c) { case EOF: return QUIT; case 'y': return OK; case 'n': return NOT_OK; case 'q': return QUIT; } printf("\n"); } } void done(nr) int nr; { switch (nr) { case SUCCESS: case FILE_EXISTS: unlink(file_name); case DEV_MOUNTED: umount(dev_name); case DIR_CREATED: rmdir(dir_name); case HARMLESS:; } sync(); exit(nr == SUCCESS ? 0 : 1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* banner - print a banner Author: Brian Wallis */ /***************************************************************** * * SYSVbanner.c * * This is a PD version of the SYS V banner program (at least I think * it is compatible to SYS V) which I wrote to use with the clock * program written by: ** DCF, Inc. ** 14623 North 49th Place ** Scottsdale, AZ 85254 * and published in the net comp.sources.misc newsgroup in early July * since the BSD banner program works quite differently. * * There is no copyright or responsibility accepted for the use * of this software. * * Brian Wallis, brw@jim.odr.oz, 4 July 1988 * *****************************************************************/ #include <string.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); char *glyphs[] = { " @@@ @@ @@ @ @ @@@@@ @@ @@@ ", " @@@ @@ @@ @ @ @ @ @@@ @ @ @ @@@ ", " @@@ @ @ @@@@@@@@ @ @@ @ @@ @ ", " @ @ @ @@@@@ @ @@@ @ ", " @@@@@@@ @ @ @ @ @ @ ", " @@@ @ @ @ @ @ @ @@ @ @ ", " @@@ @ @ @@@@@ @ @@ @@@@ @ ", " @@ @@ @", " @ @ @ @ @ @ ", " @ @ @ @ @ @ ", " @ @ @@@@@@@ @@@@@ @@@ @@@@@ @ ", " @ @ @ @ @ @@@ @ ", " @ @ @ @ @ @ @@@ @ ", " @@ @@ @ @@@ @ ", " @@@ @ @@@@@ @@@@@ @ @@@@@@@ @@@@@ @@@@@@@", " @ @ @@ @ @@ @@ @ @ @ @@ @ ", "@ @ @ @ @ @ @@ @ @ @ @ ", "@ @ @ @ @@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @ ", "@ @ @ @ @ @ @ @@ @ @ ", " @ @ @ @ @ @ @ @ @@ @ @ ", " @@@ @@@@@ @@@@@@@ @@@@@ @ @@@@@ @@@@@ @ ", " @@@@@ @@@@@ @@@ @ @ @@@@@ ", "@ @@ @ @@@ @@@ @ @ @ @", "@ @@ @ @@@ @ @@@@@ @ @", " @@@@@ @@@@@@ @@@ @ @ @@ ", "@ @ @ @@@ @ @@@@@ @ @ ", "@ @@ @ @@@ @ @ @ ", " @@@@@ @@@@@ @@@ @ @ @ @ ", " @@@@@ @ @@@@@@ @@@@@ @@@@@@ @@@@@@@@@@@@@@ @@@@@ ", "@ @ @ @ @ @@ @@ @@ @ @ @", "@ @@@ @ @ @ @ @@ @ @@ @ @ ", "@ @ @ @@ @@@@@@@ @ @ @@@@@@ @@@@@ @ @@@@", "@ @@@@ @@@@@@@@ @@ @ @@ @ @ @", "@ @@ @@ @@ @@ @@ @ @ @", " @@@@@ @ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@ @@@@@ ", "@ @ @*@ @@ @ @ @ @@ @@@@@@@@", "@ @ @ @@ @ @ @@ @@@@ @@ @", "@ @ @ @@ @ @ @ @ @ @@ @ @@ @", "@@@@@@@ @ @@@@ @ @ @ @@ @ @@ @", "@ @ @ @ @@ @ @ @ @@ @ @@ @", "@ @ @ @ @@ @ @ @ @@ @@@ @", "@ @ @@@ @@@@@ @ @ @@@@@@@@ @@ @@@@@@@@", "@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@@@ @@ @@ @", "@ @@ @@ @@ @ @ @ @@ @@ @ @", "@ @@ @@ @@ @ @ @@ @@ @ @", "@@@@@@ @ @@@@@@@ @@@@@ @ @ @@ @@ @ @", "@ @ @ @@ @ @ @ @ @ @ @ @ @ @", "@ @ @ @ @ @ @ @ @ @ @ @ @ @ @", "@ @@@@ @@ @ @@@@@ @ @@@@@ @ @@ @@ ", "@ @@ @@@@@@@@ @@@@@ @ @@@@@ @ ", " @ @ @ @ @ @ @ @ @ @ ", " @ @ @ @ @ @ @ @ @ @ ", " @ @ @ @ @ @ ", " @ @ @ @ @ @ @ ", " @ @ @ @ @ @ @ ", "@ @ @ @@@@@@@ @@@@@ @ @@@@@ @@@@@@@", " @@@ ", " @@@ @@ @@@@@ @@@@ @@@@@ @@@@@@ @@@@@@ @@@@ ", " @ @ @ @ @ @ @ @ @ @ @ @ @", " @ @ @ @@@@@ @ @ @ @@@@@ @@@@@ @ ", " @@@@@@ @ @ @ @ @ @ @ @ @@@", " @ @ @ @ @ @ @ @ @ @ @ @", " @ @ @@@@@ @@@@ @@@@@ @@@@@@ @ @@@@ ", " ", " @ @ @ @ @ @ @ @ @ @ @ @@@@ ", " @ @ @ @ @ @ @ @@ @@ @@ @ @ @", " @@@@@@ @ @ @@@@ @ @ @@ @ @ @ @ @ @", " @ @ @ @ @ @ @ @ @ @ @ @ @ @", " @ @ @ @ @ @ @ @ @ @ @ @@ @ @", " @ @ @ @@@@ @ @ @@@@@@ @ @ @ @ @@@@ ", " ", " @@@@@ @@@@ @@@@@ @@@@ @@@@@ @ @ @ @ @ @", " @ @ @ @ @ @ @ @ @ @ @ @ @ @", " @ @ @ @ @ @ @@@@ @ @ @ @ @ @ @", " @@@@@ @ @ @ @@@@@ @ @ @ @ @ @ @ @@ @", " @ @ @ @ @ @ @ @ @ @ @ @ @@ @@", " @ @@@ @ @ @ @@@@ @ @@@@ @@ @ @", " @@@ @ @@@ @@ @ @ @ @", " @ @ @ @ @@@@@@ @ @ @ @ @ @ @ @ @ ", " @ @ @ @ @ @ @ @ @@ @ @ @ @", " @@ @ @ @@ @@ @ @ @ ", " @@ @ @ @ @ @ @ @ @ @", " @ @ @ @ @ @ @ @ @ @ ", " @ @ @ @@@@@@ @@@ @ @@@ @ @ @ @" }; int main(argc, argv) int argc; char *argv[]; { int a, b, c, len, ind; char line[80]; for (argv++; --argc; argv++) { len = strlen(*argv); if (len > 10) len = 10; for (a = 0; a < 7; a++) { for (b = 0; b < len; b++) { if ((ind = (*argv)[b] - ' ') < 0) ind = 0; for (c = 0; c < 7; c++) { line[b * 8 + c] = glyphs[(ind / 8 * 7) + a][(ind % 8 * 7) + c] == '@' ? ind + ' ' : ' '; } line[b * 8 + 7] = ' '; } for (b = len * 8 - 1; b >= 0; b--) { if (line[b] != ' ') break; line[b] = '\0'; } printf("%s\n", line); } printf("\n"); } return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* basename - print last part of a path Authors: B. Garfolo & P. Nelson */ /* Basename - print the last part of a path. * * For MINIX -- Conforms to POSIX - P1003.2/D10 * Exception -- it ignores the LC environment variables. * * Original MINIX author: Blaine Garfolo * POSIX rewrite author: Philip A. Nelson * * POSIX version - October 20, 1990 * Feb 14, 1991: changed rindex to strrchr. (PAN) * */ #include <string.h> #include <stdlib.h> #include <stdio.h> #define EOS '\0' _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char *argv[]; { char *result_string; /* The pointer into argv[1]. */ char *temp; /* Used to move around in argv[1]. */ int suffix_len; /* Length of the suffix. */ int suffix_start; /* Where the suffix should start. */ /* Check for the correct number of arguments. */ if ((argc < 2) || (argc > 3)) { fprintf(stderr, "Usage: basename string [suffix] \n"); exit(1); } /* Check for all /'s */ for (temp = argv[1]; *temp == '/'; temp++) /* Move to next char. */ ; if (*temp == EOS) { printf("/\n"); exit(0); } /* Build the basename. */ result_string = argv[1]; /* Find the last /'s */ temp = strrchr(result_string, '/'); if (temp != NULL) { /* Remove trailing /'s. */ while ((*(temp + 1) == EOS) && (*temp == '/')) *temp-- = EOS; /* Set result_string to last part of path. */ if (*temp != '/') temp = strrchr(result_string, '/'); if (temp != NULL && *temp == '/') result_string = temp + 1; } /* Remove the suffix, if any. */ if (argc > 2) { suffix_len = strlen(argv[2]); suffix_start = strlen(result_string) - suffix_len; if (suffix_start > 0) if (strcmp(result_string + suffix_start, argv[2]) == EOS) *(result_string + suffix_start) = EOS; } /* Print the resultant string. */ printf("%s\n", result_string); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������/*- * Copyright (c) 1990 The Regents of the University of California. * All rights reserved. * * This code is derived from software contributed to Berkeley by * John B. Roll Jr. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1990 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)xargs.c 5.11 (Berkeley) 6/19/91"; #endif /* not lint */ #include <sys/types.h> #include <sys/wait.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <limits.h> #include <fcntl.h> #include <stdarg.h> #if __minix #define _PATH_ECHO "/bin/echo" typedef unsigned u_int; #else #include "pathnames.h" #endif #ifndef ARG_MAX #define ARG_MAX (sizeof(int) == 2 ? 4096 : 128 * 1024) #endif int exit_status = 0; int tflag; void err(const char *, ...); void run(char **argv); void usage(void); int main(int argc, char **argv) { extern int optind; extern char *optarg; register int ch; register char *p, *bbp, *ebp, **bxp, **exp, **xp; int cnt, indouble, insingle, nargs, nflag, nline, xflag, zflag; char **av, *argp; /* * POSIX.2 limits the exec line length to ARG_MAX - 2K. Running that * caused some E2BIG errors, so it was changed to ARG_MAX - 4K. Given * that the smallest argument is 2 bytes in length, this means that * the number of arguments is limited to: * * (ARG_MAX - 4K - LENGTH(utility + arguments)) / 2. * * We arbitrarily limit the number of arguments to 5000. This is * allowed by POSIX.2 as long as the resulting minimum exec line is * at least LINE_MAX. Realloc'ing as necessary is possible, but * probably not worthwhile. */ #if !__minix || __minix_vmd nargs = 5000; nline = ARG_MAX - 4 * 1024; #else /* Things are more cramped under standard Minix. */ nargs = 100 * sizeof(int); nline = ARG_MAX - 512 * sizeof(int); #endif nflag = xflag = zflag = 0; while ((ch = getopt(argc, argv, "n:s:tx0")) != EOF) switch(ch) { case 'n': nflag = 1; if ((nargs = atoi(optarg)) <= 0) err("illegal argument count"); break; case 's': nline = atoi(optarg); break; case 't': tflag = 1; break; case 'x': xflag = 1; break; case '0': zflag = 1; break; case '?': default: usage(); } argc -= optind; argv += optind; if (xflag && !nflag) usage(); /* * Allocate pointers for the utility name, the utility arguments, * the maximum arguments to be read from stdin and the trailing * NULL. */ if (!(av = bxp = malloc((u_int)(1 + argc + nargs + 1) * sizeof(char **)))) err("%s", strerror(errno)); /* * Use the user's name for the utility as argv[0], just like the * shell. Echo is the default. Set up pointers for the user's * arguments. */ if (!*argv) cnt = strlen(*bxp++ = _PATH_ECHO); else { cnt = 0; do { cnt += strlen(*bxp++ = *argv) + 1; } while (*++argv); } /* * Set up begin/end/traversing pointers into the array. The -n * count doesn't include the trailing NULL pointer, so the malloc * added in an extra slot. */ exp = (xp = bxp) + nargs; /* * Allocate buffer space for the arguments read from stdin and the * trailing NULL. Buffer space is defined as the default or specified * space, minus the length of the utility name and arguments. Set up * begin/end/traversing pointers into the array. The -s count does * include the trailing NULL, so the malloc didn't add in an extra * slot. */ nline -= cnt; if (nline <= 0) err("insufficient space for command"); if (!(bbp = malloc((u_int)nline + 1))) err("%s", strerror(errno)); ebp = (argp = p = bbp) + nline - 1; if (zflag) { /* Read pathnames terminated by null bytes as produced by * find ... -print0. No comments in this code, see further * below. */ for (;;) switch(ch = getchar()) { case EOF: if (p == bbp) exit(exit_status); if (argp == p) { *xp = NULL; run(av); exit(exit_status); } /*FALL THROUGH*/ case '\0': if (argp == p) continue; *p = '\0'; *xp++ = argp; if (xp == exp || p == ebp || ch == EOF) { if (xflag && xp != exp && p == ebp) err( "insufficient space for arguments"); *xp = NULL; run(av); if (ch == EOF) exit(exit_status); p = bbp; xp = bxp; } else ++p; argp = p; break; default: if (p < ebp) { *p++ = ch; break; } if (bxp == xp) err("insufficient space for argument"); if (xflag) err("insufficient space for arguments"); *xp = NULL; run(av); xp = bxp; cnt = ebp - argp; bcopy(argp, bbp, cnt); p = (argp = bbp) + cnt; *p++ = ch; break; } /* NOTREACHED */ } for (insingle = indouble = 0;;) switch(ch = getchar()) { case EOF: /* No arguments since last exec. */ if (p == bbp) exit(exit_status); /* Nothing since end of last argument. */ if (argp == p) { *xp = NULL; run(av); exit(exit_status); } goto arg1; case ' ': case '\t': /* Quotes escape tabs and spaces. */ if (insingle || indouble) goto addch; goto arg2; case '\n': /* Empty lines are skipped. */ if (argp == p) continue; /* Quotes do not escape newlines. */ arg1: if (insingle || indouble) err("unterminated quote"); arg2: *p = '\0'; *xp++ = argp; /* * If max'd out on args or buffer, or reached EOF, * run the command. If xflag and max'd out on buffer * but not on args, object. */ if (xp == exp || p == ebp || ch == EOF) { if (xflag && xp != exp && p == ebp) err("insufficient space for arguments"); *xp = NULL; run(av); if (ch == EOF) exit(exit_status); p = bbp; xp = bxp; } else ++p; argp = p; break; case '\'': if (indouble) goto addch; insingle = !insingle; break; case '"': if (insingle) goto addch; indouble = !indouble; break; case '\\': /* Backslash escapes anything, is escaped by quotes. */ if (!insingle && !indouble && (ch = getchar()) == EOF) err("backslash at EOF"); /* FALLTHROUGH */ default: addch: if (p < ebp) { *p++ = ch; break; } /* If only one argument, not enough buffer space. */ if (bxp == xp) err("insufficient space for argument"); /* Didn't hit argument limit, so if xflag object. */ if (xflag) err("insufficient sL��L��L��L��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pace for arguments"); *xp = NULL; run(av); xp = bxp; cnt = ebp - argp; bcopy(argp, bbp, cnt); p = (argp = bbp) + cnt; *p++ = ch; break; } /* NOTREACHED */ } void run(char **argv) { register char **p; pid_t pid; int noinvoke; int status; int pfd[2]; if (tflag) { (void)fprintf(stderr, "%s", *argv); for (p = argv + 1; *p; ++p) (void)fprintf(stderr, " %s", *p); (void)fprintf(stderr, "\n"); (void)fflush(stderr); } if (pipe(pfd) < 0) err("pipe: %s", strerror(errno)); switch(pid = fork()) { case -1: err("fork: %s", strerror(errno)); case 0: close(pfd[0]); fcntl(pfd[1], F_SETFD, fcntl(pfd[1], F_GETFD) | FD_CLOEXEC); execvp(argv[0], argv); noinvoke = (errno == ENOENT) ? 127 : 126; (void)fprintf(stderr, "xargs: %s: %s.\n", argv[0], strerror(errno)); /* Modern way of returning noinvoke instead of a dirty vfork() * trick: (kjb) */ write(pfd[1], &noinvoke, sizeof(noinvoke)); _exit(-1); } close(pfd[1]); if (read(pfd[0], &noinvoke, sizeof(noinvoke)) < sizeof(noinvoke)) noinvoke = 0; close(pfd[0]); pid = waitpid(pid, &status, 0); if (pid == -1) err("waitpid: %s", strerror(errno)); /* * If we couldn't invoke the utility or the utility didn't exit * properly, quit with 127 or 126 respectively. */ if (noinvoke) exit(noinvoke); /* * According to POSIX, we have to exit if the utility exits with * a 255 status, or is interrupted by a signal. xargs is allowed * to return any exit status between 1 and 125 in these cases, but * we'll use 124 and 125, the same values used by GNU xargs. */ if (WIFEXITED(status)) { if (WEXITSTATUS (status) == 255) { fprintf (stderr, "xargs: %s exited with status 255\n", argv[0]); exit(124); } else if (WEXITSTATUS (status) != 0) { exit_status = 123; } } else if (WIFSTOPPED (status)) { fprintf (stderr, "xargs: %s terminated by signal %d\n", argv[0], WSTOPSIG (status)); exit(125); } else if (WIFSIGNALED (status)) { fprintf (stderr, "xargs: %s terminated by signal %d\n", argv[0], WTERMSIG (status)); exit(125); } } void usage(void) { (void)fprintf(stderr, "usage: xargs [-t0] [[-x] -n number] [-s size] [utility [argument ...]]\n"); exit(1); } void err(const char *fmt, ...) { va_list ap; va_start(ap, fmt); (void)fprintf(stderr, "xargs: "); (void)vfprintf(stderr, fmt, ap); va_end(ap); (void)fprintf(stderr, "\n"); exit(1); /* NOTREACHED */ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cal - print a calendar Author: Maritn Minow */ #include <stdlib.h> #include <string.h> #include <stdio.h> #define do3months domonth #define IO_SUCCESS 0 /* Unix definitions */ #define IO_ERROR 1 #define EOS 0 #define ENTRY_SIZE 3 /* 3 bytes per value */ #define DAYS_PER_WEEK 7 /* Sunday, etc. */ #define WEEKS_PER_MONTH 6 /* Max. weeks in a month */ #define MONTHS_PER_LINE 3 /* Three months across */ #define MONTH_SPACE 3 /* Between each month */ char *badarg = {"Bad argument\n"}; char *how = {"Usage: cal [month] year\n"}; /* Calendar() stuffs data into layout[], * output() copies from layout[] to outline[], (then trims blanks). */ char layout[MONTHS_PER_LINE][WEEKS_PER_MONTH][DAYS_PER_WEEK][ENTRY_SIZE]; char outline[(MONTHS_PER_LINE * DAYS_PER_WEEK * ENTRY_SIZE) + (MONTHS_PER_LINE * MONTH_SPACE) + 1]; char *weekday = " S M Tu W Th F S"; char *monthname[] = { "???", /* No month 0 */ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void doyear, (int year)); _PROTOTYPE(void domonth, (int year, int month)); _PROTOTYPE(void output, (int nmonths)); _PROTOTYPE(void calendar, (int year, int month, int indx)); _PROTOTYPE(void usage, (char *s)); _PROTOTYPE(int date, (int year, int month, int week, int wday)); _PROTOTYPE(void setmonth, (int year, int month)); _PROTOTYPE(int getdate, (int week, int wday)); _PROTOTYPE(static int Jan1, (int year)); int main(argc, argv) int argc; char *argv[]; { register int year; register int arg1val; int arg1len; int arg2val; if (argc <= 1) { usage(how); } else { arg1val = atoi(argv[1]); arg1len = strlen(argv[1]); if (argc == 2) { /* Only one argument, if small, it's a month. If * large, it's a year. Note: cal 0082 Year * 0082 cal 82 Year 0082 */ if (arg1len <= 2 && arg1val <= 12) do3months(year, arg1val); else doyear(arg1val); } else { /* Two arguments, allow 1980 12 or 12 1980 */ arg2val = atoi(argv[2]); if (arg1len > 2) do3months(arg1val, arg2val); else do3months(arg2val, arg1val); } } return(IO_SUCCESS); } void doyear(year) int year; /* Print the calendar for an entire year. */ { register int month; if (year < 1 || year > 9999) usage(badarg); if (year < 100) printf("\n\n\n 00%2d\n\n", year); else printf("\n\n\n%35d\n\n", year); for (month = 1; month <= 12; month += MONTHS_PER_LINE) { printf("%12s%23s%23s\n", monthname[month], monthname[month + 1], monthname[month + 2]); printf("%s %s %s\n", weekday, weekday, weekday); calendar(year, month + 0, 0); calendar(year, month + 1, 1); calendar(year, month + 2, 2); output(3); #if MONTHS_PER_LINE != 3 #error "the above will not work" #endif } printf("\n\n\n"); } void domonth(year, month) int year; int month; /* Do one specific month -- note: no longer used */ { if (year < 1 || year > 9999) usage(badarg); if (month <= 0 || month > 12) usage(badarg); printf("%9s%5d\n\n%s\n", monthname[month], year, weekday); calendar(year, month, 0); output(1); printf("\n\n"); } void output(nmonths) int nmonths; /* Number of months to do */ /* Clean up and output the text. */ { register int week; register int month; register char *outp; int i; char tmpbuf[21], *p; for (week = 0; week < WEEKS_PER_MONTH; week++) { outp = outline; for (month = 0; month < nmonths; month++) { /* The -1 in the following removes the unwanted * leading blank from the entry for Sunday. */ p = &layout[month][week][0][1]; for (i = 0; i < 20; i++) tmpbuf[i] = *p++; tmpbuf[20] = 0; sprintf(outp, "%s ", tmpbuf); outp += (DAYS_PER_WEEK * ENTRY_SIZE) + MONTH_SPACE - 1; } while (outp > outline && outp[-1] == ' ') outp--; *outp = EOS; printf("%s\n", outline); } } void calendar(year, month, indx) int year; int month; int indx; /* Which of the three months */ /* Actually build the calendar for this month. */ { register char *tp; int week; register int wday; register int today; setmonth(year, month); for (week = 0; week < WEEKS_PER_MONTH; week++) { for (wday = 0; wday < DAYS_PER_WEEK; wday++) { tp = &layout[indx][week][wday][0]; *tp++ = ' '; today = getdate(week, wday); if (today <= 0) { *tp++ = ' '; *tp++ = ' '; } else if (today < 10) { *tp++ = ' '; *tp = (today + '0'); } else { *tp++ = (today / 10) + '0'; *tp = (today % 10) + '0'; } } } } void usage(s) char *s; { /* Fatal parameter error. */ fprintf(stderr, "%s", s); exit(IO_ERROR); } /* Calendar routines, intended for eventual porting to TeX * * date(year, month, week, wday) * Returns the date on this week (0 is first, 5 last possible) * and day of the week (Sunday == 0) * Note: January is month 1. * * setmonth(year, month) * Parameters are as above, sets getdate() for this month. * * int * getdate(week, wday) * Parameters are as above, uses the data set by setmonth() */ /* This structure is used to pass data between setmonth() and getdate(). * It needs considerable expansion if the Julian->Gregorian change is * to be extended to other countries. */ static struct { int this_month; /* month number used in 1752 checking */ int feb; /* Days in February for this month */ int sept; /* Days in September for this month */ int days_in_month; /* Number of days in this month */ int dow_first; /* Day of week of the 1st day in month */ } info; static int day_month[] = { /* 30 days hath September... */ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int date(year, month, week, wday) int year; /* Calendar date being computed */ int month; /* January == 1 */ int week; /* Week in the month 0..5 inclusive */ int wday; /* Weekday, Sunday == 0 */ /* Return the date of the month that fell on this week and weekday. * Return zero if it's out of range. */ { setmonth(year, month); return(getdate(week, wday)); } void setmonth(year, month) int year; /* Year to compute */ int month; /* Month, January is month 1 */ /* Setup the parameters needed to compute this month * (stored in the info structure). */ { register int i; if (month < 1 || month > 12) {/* Verify caller's parameters */ info.days_in_month = 0; /* Garbage flag */ return; } info.this_month = month; /* used in 1752 checking */ info.dow_first = Jan1(year); /* Day of January 1st for now */ info.feb = 29; /* Assume leap year */ info.sept = 30; /* Assume normal year */ /* Determine whether it's an ordinary year, a leap year or the * magical calendar switch year of 1752. */ switch ((Jan1(year + 1) + 7 - info.dow_first) % 7) { case 1: /* Not a leap year */ info.feb = 28; case 2: /* Ordinary leap year */ break; default: /* The magical moment arrives */ info.sept = 19; /* 19 days hath September */ break; } info.days_in_month = (month == 2) ? info.feb : (month == 9) ? info.sept : day_month[month]; for (i = 1; i < month; i++) { switch (i) { /* Special months? */ case 2: /* February */ info.dow_first += info.feb; break; case 9: info.dow_first += info.sept; break; default: info.dow_first += day_month[i]; break; } } info.dow_first %= 7; /* Now it's Sunday to Saturday */ } int getdate(week, wday) int week; int wday; { register int today; /* Get a first guess at today's date and make sure it's in range. */ today = (week * 7) + wday - info.dow_first + 1; if (today <= 0 || today > info.days_in_month) return(0); else if (info.sept == 19 && info.this_month == 9 && today >= 3) /* The magical month? */ return(today + 11); /* If so, some dates changed */ else /* Otherwise, */ return(today); /* Return the date */ } static int Jan1(year) int year; /* Return day of the week for Jan 1 of the specified year. */ { register int day; day = year + 4 + ((year + 3) / 4); /* Julian Calendar */ if (year > 1800) { /* If it's recent, do */ day -= ((year - 1701) / 100); /* Clavian correction */ day += ((year - 1601) / L��L����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������400); /* Gregorian correction */ } if (year > 1752) /* Adjust for Gregorian */ day += 3; /* calendar */ return(day % 7); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* calendar - reminder service Authors: S. & K. Hirabayashi */ /* Permission is hereby granted for nonprofit use. */ #include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <regexp.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <termcap.h> #include <unistd.h> #include <utime.h> #include <stdio.h> /* Change these two lines for your system needs. */ #define MAIL1 "/usr/bin/mail" #define MAIL2 "/bin/mail" #define PASSWD "/etc/passwd" /* system password file */ #define MAX_EXP 4 /* see date_exp() function */ char *mail; /* mail command path ("/bin/mail" etc) */ regexp *exp[MAX_EXP]; /* date expressions */ int nexp; /* # of the date expressions */ char calfile[PATH_MAX]; /* calendar file for the user */ int rflg; /* consult aged 'calendar' file and touch */ int mflg; /* mail (multi user) service */ char *cmd; /* the name of this command */ char buf[BUFSIZ]; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void calendar, (void)); _PROTOTYPE(char *getstr, (char *s, int n)); _PROTOTYPE(int newaccess, (char *file)); _PROTOTYPE(void grep, (char *file, char *user)); _PROTOTYPE(int date_exp, (void)); _PROTOTYPE(char *date_pat, (time_t t)); _PROTOTYPE(void regerror, (char *s)); _PROTOTYPE(void error, (char *s, char *t)); int main(argc, argv) int argc; char **argv; { char *s; cmd = *argv; while (--argc > 0 && (*++argv)[0] == '-') { s = argv[0] + 1; if (*s == '\0') mflg++; /* mail service */ else if (strcmp(s, "r") == 0) rflg++, mflg++; } if (mflg) { /* check mailing agent */ if (access(MAIL1, X_OK) == 0) mail = MAIL1; else if (access(MAIL2, X_OK) == 0) mail = MAIL2; else error("cannot find %s", MAIL1); } nexp = date_exp(); calendar(); exit(0); } void calendar() { int i; char *s; FILE *fp; if (!mflg) { grep("calendar", ""); return; } /* Mail sevice */ if ((fp = fopen(PASSWD, "r")) == (FILE *) NULL) error("cannot open %s", PASSWD); while (fgets(buf, BUFSIZ, fp) != (char *) NULL) { for (i = 0, s = buf; *s && *s != '\n'; s++) if (*s == ':') i++; *s = '\0'; if (i != 6) error("illegal '/etc/passwd' format: %s", buf); /* Calendar file = ${HOME}/calendar */ sprintf(calfile, "%s/%s", getstr(buf, 5), "calendar"); if ((access(calfile, R_OK) != 0) || (rflg && !newaccess(calfile))) continue; grep(calfile, getstr(buf, 0)); } fclose(fp); } char *getstr(s, n) char *s; int n; { /* Returns the string value of the n-th field in the record (s) */ int i; char *t; static char str[512]; for (i = 0; i < n && *s; s++) if (*s == ':') i++; /* field separator */ for (i = 0, t = str; *s && *s != ':' && i < 511; i++) *t++ = *s++; *t = '\0'; return str; } int newaccess(file) char *file; /* file name */ { /* Check whether the file has been touched today. */ int r = 0; struct tm *tm; struct stat stbuf; time_t clk; char newdate[8], olddate[8]; time(&clk); tm = localtime(&clk); sprintf(newdate, "%02d%02d%02d", tm->tm_year, tm->tm_mon + 1, tm->tm_mday); if (stat(file, &stbuf) == -1) error("cannot stat %s", file); tm = localtime(&stbuf.st_mtime); sprintf(olddate, "%02d%02d%02d", tm->tm_year, tm->tm_mon + 1, tm->tm_mday); if (strcmp(newdate, olddate) != 0) { utime(file, NULL); /* touch */ r++; } return r; } void grep(file, user) char *file, *user; { /* grep 'exp[]' [| mail user] */ int i; char command[128]; /* mail command */ FILE *ifp, *ofp; if ((ifp = fopen(file, "r")) == (FILE *) NULL) error("cannot open %s", file); if (*user != '\0') { sprintf(command, "%s %s", mail, user); ofp = (FILE *) NULL; } else { ofp = stdout; } while (fgets(buf, BUFSIZ, ifp) != (char *) NULL) { for (i = 0; i < nexp; i++) { if (regexec(exp[i], buf, 1)) { if ((ofp == (FILE *) NULL) && (ofp = popen(command, "w")) == (FILE *) NULL) error("cannot popen %s", mail); fputs(buf, ofp); break; } } } fclose(ifp); if (ofp == stdout) fflush(ofp); else if (ofp != (FILE *) NULL) pclose(ofp); } int date_exp() { /* Set compiled regular expressions into the exp[] array. */ static int n[] = {2, 2, 2, 2, 2, 4, 3}; int i, r, wday; time_t clk; time(&clk); wday = localtime(&clk)->tm_wday; r = n[wday]; if (r > MAX_EXP) error("too many date expressions", ""); for (i = 0; i < r; i++) { exp[i] = regcomp(date_pat(clk)); clk += 60 * 60 * 24L; /* 24 hours */ } return(r); } char *date_pat(t) time_t t; { /* returns date expression for the time (t) */ static char *month[] = { "[Jj]an", "[Ff]eb", "[Mm]ar", "[Aa]pr", "[Mm]ay", "[Jj]un", "[Jj]ul", "[Aa]ug", "[Ss]ep", "[Oo]ct", "[Nn]ov", "[Dd]ec" }; static char str[512]; struct tm *tm; tm = localtime(&t); sprintf(str, "(^|[ \t(,;])(((%s[^ \t]*[ \t])|0*%d/|\\*/)(0*%d|\\*))([^0123456789]|$)", month[tm->tm_mon], tm->tm_mon + 1, tm->tm_mday); return str; } void regerror(s) char *s; { /* regcomp() needs this */ error("REGULAR EXPRESSION ERROR (%s)", s); } void error(s, t) char *s, *t; { fprintf(stderr, "%s: ", cmd); fprintf(stderr, s, t); fprintf(stderr, "\n"); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cat - concatenates files Author: Andy Tanenbaum */ /* 30 March 90 - Slightly modified for efficiency by Norbert Schlenker. */ #include <errno.h> #include <sys/types.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <minix/minlib.h> #include <stdio.h> #define CHUNK_SIZE 4096 static int unbuffered; static char ibuf[CHUNK_SIZE]; static char obuf[CHUNK_SIZE]; static char *op = obuf; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void copyfile, (int ifd, int ofd)); _PROTOTYPE(void flush, (void)); _PROTOTYPE(void fatal, (void)); int excode = 0; int main(argc, argv) int argc; char *argv[]; { int i, fd; i = 1; /* Check for the -u flag -- unbuffered operation. */ if (argc >= 2 && argv[1][0] == '-' && argv[1][1] == 'u' && argv[1][2] == 0) { unbuffered = 1; i = 2; } if (i >= argc) { copyfile(STDIN_FILENO, STDOUT_FILENO); } else { for ( ; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 0) { copyfile(STDIN_FILENO, STDOUT_FILENO); } else { fd = open(argv[i], O_RDONLY); if (fd < 0) { std_err("cat: cannot open "); std_err(argv[i]); std_err(": "); std_err(strerror (errno)); std_err("\n"); excode = 1; } else { copyfile(fd, STDOUT_FILENO); close(fd); } } } } flush(); return(excode); } void copyfile(ifd, ofd) int ifd, ofd; { int n; while (1) { n = read(ifd, ibuf, CHUNK_SIZE); if (n < 0) fatal(); if (n == 0) return; if (unbuffered || (op == obuf && n == CHUNK_SIZE)) { if (write(ofd, ibuf, n) != n) fatal(); } else { int bytes_left; bytes_left = &obuf[CHUNK_SIZE] - op; if (n <= bytes_left) { memcpy(op, ibuf, (size_t)n); op += n; } else { memcpy(op, ibuf, (size_t)bytes_left); if (write(ofd, obuf, CHUNK_SIZE) != CHUNK_SIZE) fatal(); n -= bytes_left; memcpy(obuf, ibuf + bytes_left, (size_t)n); op = obuf + n; } } } } void flush() { if (op != obuf) if (write(STDOUT_FILENO, obuf, (size_t) (op - obuf)) <= 0) fatal(); } void fatal() { perror("cat"); exit(1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nonamed - Not a name daemon, but plays one on TV. * Author: Kees J. Bot * 29 Nov 1994 */ static const char version[] = "2.5"; /* Use the file reading gethostent() family of functions. */ #define sethostent _sethostent #define gethostent _gethostent #define endhostent _endhostent #define nil ((void*)0) #include <sys/types.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <string.h> #include <time.h> #include <limits.h> #include <signal.h> #include <assert.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/nameser.h> #include <net/gen/resolv.h> #include <net/gen/netdb.h> #include <net/gen/socket.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/udp_io.h> #include <net/gen/dhcp.h> #define HTTL 3600L /* Default time to live for /etc/hosts data. */ #define SHORT_TIMEOUT 2 /* If you expect an answer soon. */ #define MEDIUM_TIMEOUT 4 /* Soon, but not that soon. */ #define LONG_TIMEOUT 300 /* For stream connections to a real named. */ #define N_IDS 256 /* Keep track of this many queries. */ #define N_DATAMAX (4096*sizeof(char *)) /* Default response cache size. */ #define N_NAMEDS 8 /* Max # name daemons we can keep track of. */ #define NO_FD (-1) /* No name daemon channel here. */ #define T_NXD ((u16_t) -1) /* A "type" signalling a nonexistent domain. */ /* Can't do async I/O under standard Minix, so forget about TCP. */ #define DO_TCP (__minix_vmd || !__minix) /* Host data, file to store our process id in, our cache, DHCP's cache. */ static char HOSTS[]= "/etc/hosts"; static char PIDFILE[]= "/usr/run/nonamed.pid"; static char NNCACHE[]= "/usr/adm/nonamed.cache"; static char DHCPCACHE[]="/usr/adm/dhcp.cache"; /* Magic string to head the cache file. */ static char MAGIC[4]= "NND\2"; #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define between(a, c, z) ((unsigned) ((c) - (a)) <= (unsigned) ((z) - (a))) /* The start of time and the far future. */ #define IMMEDIATE ((time_t) 0) #define NEVER ((time_t) ((time_t) -1 < 0 ? LONG_MAX : ULONG_MAX)) static unsigned debug; /* Debug level. */ static time_t now; /* Current time. */ static u32_t stale; /* Extension time for stale data. */ static u32_t httl; /* TTL for /etc/hosts data. */ static int reinit, done; /* Reinit config / program is done. */ static int single; /* Run single on a nondefault interface. */ static void report(const char *label) { fprintf(stderr, "nonamed: %s: %s\n", label, strerror(errno)); } static void fatal(const char *label) { report(label); if (debug >= 3) { fflush(nil); abort(); } exit(1); } static void *allocate(void *mem, size_t size) { if ((mem= realloc(mem, size)) == nil) fatal("malloc()"); return mem; } static void deallocate(void *mem) { free(mem); } static char *timegmt(time_t t) /* Simple "time in seconds to GMT time today" converter. */ { unsigned h, m, s; static char asctime[sizeof("00:00:00")]; s= t % 60; t /= 60; m= t % 60; t /= 60; h= t % 24; sprintf(asctime, "%02u:%02u:%02u", h, m, s); return asctime; } static char *nowgmt(void) { return timegmt(now); } #define PC(n) ((void) sizeof(char [sizeof(*(n)) == 1]), (char *) (n)) #define namecpy(n1, n2) strcpy(PC(n1), PC(n2)) #define namecat(n1, n2) strcat(PC(n1), PC(n2)) #define namechr(n, c) ((u8_t *) strchr(PC(n), (c))) #define namecmp(n1, n2) strcasecmp(PC(n1), PC(n2)) #define namencmp(n1, n2, len) strncasecmp(PC(n1), PC(n2), len) typedef struct dns { /* A DNS packet. */ dns_hdr_t hdr; /* DNS header. */ u8_t data[PACKETSZ - sizeof(dns_hdr_t)]; /* DNS data. */ } dns_t; /* Addres of DNS packet to octet address, or vv. */ #define dns2oct(dp) ((u8_t *) (dp)) #define oct2dns(dp) ((dns_t *) (dp)) typedef struct query { /* One cached answer to a query. */ struct query *less; /* Less recently used. */ struct query *more; /* More recently used. */ time_t age; /* Time it was added. */ time_t stale; /* Time it goes stale by TTL. */ u16_t usage; /* Counts of queries answered. */ u8_t flags; /* QF_REFRESH. */ size_t size; /* Size of DNS packet. */ dns_t dns; /* Answer to query as a DNS packet. */ } query_t; #define QF_REFRESH 0x01 /* This stale data must be refreshed. */ #define QU_SHIFT 1 /* To shift usage by when evicting. */ /* Size of new query_t or existing query_t. */ #define query_allocsize(dnssize) (offsetof(query_t, dns) + (dnssize)) #define query_size(qp) query_allocsize((qp)->size) static query_t *mru, *lru; /* Most and least recently used answers. */ static int q_refresh; /* Set when an entry needs refreshing. */ static void pack16(u8_t *buf, u16_t s) /* Pack a 16 bit value into a byte array. */ { buf[0]= ((u8_t *) &s)[0]; buf[1]= ((u8_t *) &s)[1]; } static void pack32(u8_t *buf, u32_t l) /* Pack a 32 bit value into a byte array. */ { buf[0]= ((u8_t *) &l)[0]; buf[1]= ((u8_t *) &l)[1]; buf[2]= ((u8_t *) &l)[2]; buf[3]= ((u8_t *) &l)[3]; } static u16_t upack16(u8_t *buf) /* Unpack a 16 bit value from a byte array. */ { u16_t s; ((u8_t *) &s)[0]= buf[0]; ((u8_t *) &s)[1]= buf[1]; return s; } static u32_t upack32(u8_t *buf) /* Unpack a 32 bit value from a byte array. */ { u32_t l; ((u8_t *) &l)[0]= buf[0]; ((u8_t *) &l)[1]= buf[1]; ((u8_t *) &l)[2]= buf[2]; ((u8_t *) &l)[3]= buf[3]; return l; } /* Encoding of RRs: i(paddr), d(omain), l(ong), c(har), s(tring), (s)h(ort). */ static char *encoding[] = { "c*", /* anything unknown is c* */ "i", /* A */ "d", /* NS */ "d", /* MD */ "d", /* MF */ "d", /* CNAME */ "ddlllll", /* SOA */ "d", /* MB */ "d", /* MG */ "d", /* MR */ "c*", /* NULL */ "icc*", /* WKS */ "d", /* PTR */ "ss", /* HINFO */ "dd", /* MINFO */ "hd", /* MX */ "s*", /* TXT */ }; static char *itoa(char *fmt, u32_t i) { static char output[32 + 3 * sizeof(i)]; sprintf(output, fmt, (unsigned long) i); return output; } static char *classname(unsigned class) /* Class name of a resource record, for debug purposes. */ { static char *classes[] = { "IN", "CS", "CHAOS", "HS" }; if ((class - C_IN) < arraysize(classes)) return classes[class - C_IN]; return itoa("C_%u", class); } static char *typename(unsigned type) /* Type name of a resource record, for debug purposes. */ { static char type_A[][6] = { "A", "NS", "MD", "MF", "CNAME", "SOA", "MB", "MG", "MR", "NULL", "WKS", "PTR", "HINFO", "MINFO", "MX", "TXT", }; static char type_AXFR[][6] = { "AXFR", "MAILB", "MAILA", "ANY", }; if ((type - T_A) < arraysize(type_A)) return type_A[type - T_A]; if ((type - T_AXFR) < arraysize(type_AXFR)) return type_AXFR[type - T_AXFR]; return itoa("T_%u", type); } static int print_qrr(dns_t *dp, size_t size, u8_t *cp0, int q) /* Print a query (q) or resource record (!q) from 'cp0' in a DNS packet for * debug purposes. Return number of bytes skipped or -1 on error. */ { u8_t name[MAXDNAME+1]; u8_t *cp; char *ep; u8_t *dlim, *rlim; u16_t type, class, rdlength; u32_t ttl; int r; cp= cp0; dlim= dns2oct(dp) + size; r= dn_expand(dns2oct(dp), dlim, cp, name, MAXDNAME); if (r == -1) return -1; cp += r; if (cp + 2 * sizeof(u16_t) > dlim) return -1; type= ntohs(upack16(cp)); cp += sizeof(u16_t); class= ntohs(upack16(cp)); cp += sizeof(u16_t); printf("%-25s", (char *) name); if (q) { /* We're just printing a query segment, stop right here. */ printf(" %8s", classname(class)); printf(" %-5s", typename(type)); return cp - cp0; } if (cp + sizeof(u32_t) + sizeof(u16_t) > dlim) return -1; ttl= ntohl(upack32(cp)); cp += sizeof(u32_t); rdlength= ntohs(upack16(cp)); cp += sizeof(u16_t); if (cp + rdlength > dlim) return -1; rlim = cp + rdlength; printf(" %5lu", (unsigned long) ttl); M��M��M��M�� M�� M�� M�� M�� M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M�� M��!M��"M��#M��$M��%M��&M��'M��(M��)M��*M��+M��,M��-M��.M��/M��0M��1M��2M��3M��4M��5M��6M��7M������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������printf(" %s", classname(class)); printf(" %-5s", typename(type)); ep= type < arraysize(encoding) ? encoding[type] : encoding[0]; while (*ep != 0) { switch (*ep++) { case 'i': if (cp + sizeof(u32_t) > rlim) return -1; printf(" %s", inet_ntoa(upack32(cp))); cp += sizeof(u32_t); break; case 'l': if (cp + sizeof(u32_t) > rlim) return -1; printf(" %ld", (long)(i32_t) ntohl(upack32(cp))); cp += sizeof(u32_t); break; case 'd': r= dn_expand(dns2oct(dp), dlim, cp, name, MAXDNAME); if (r == -1) return -1; printf(" %s", (char *) name); cp += r; break; case 'c': if (cp >= rlim) return -1; printf(" %02X", *cp++); break; case 's': r= *cp + 1; if (cp + r > rlim) return -1; printf(" \"%.*s\"", *cp, (char *) (cp + 1)); cp += r; break; case 'h': if (cp + sizeof(u16_t) > rlim) return -1; printf(" %u", ntohs(upack16(cp))); cp += sizeof(u16_t); break; } if (*ep == '*') ep= cp < rlim ? ep-1 : ep+1; } return cp - cp0; } static void dns_tell(int indent, dns_t *dp, size_t size) /* Explain a DNS packet, for debug purposes. */ { u8_t *cp; int r, i; unsigned count[4]; static char label[4][4]= { "QD:", "AN:", "NS:", "AR:" }; static char rcodes[][9] = { "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED" }; if (size < sizeof(dns_hdr_t)) return; printf("%*s", indent, ""); printf("DNS %s:", (dp->hdr.dh_flag1 & DHF_QR) ? "reply" : "query"); r= dp->hdr.dh_flag2 & DHF_RCODE; printf(" %s", r < arraysize(rcodes) ? rcodes[r] : itoa("ERR_%lu", r)); if (dp->hdr.dh_flag1 & DHF_AA) printf(" AA"); if (dp->hdr.dh_flag1 & DHF_TC) printf(" TC"); if (dp->hdr.dh_flag1 & DHF_RD) printf(" RD"); if (dp->hdr.dh_flag2 & DHF_RA) printf(" RA"); if (dp->hdr.dh_flag2 & DHF_PR) printf(" PR"); fputc('\n', stdout); count[0]= ntohs(dp->hdr.dh_qdcount); count[1]= ntohs(dp->hdr.dh_ancount); count[2]= ntohs(dp->hdr.dh_nscount); count[3]= ntohs(dp->hdr.dh_arcount); cp = dp->data; for (i= 0; i < 4; i++) { while (count[i] > 0) { printf("%*s", indent, ""); printf(" %s ", label[i]); r= print_qrr(dp, size, cp, (i == 0)); fputc('\n', stdout); if (r == -1) return; cp += r; count[i]--; } } } static u32_t dns_ttl(dns_t *dp, size_t size, u32_t delta) /* Compute the minimum TTL of all RRs in a DNS packet and subtract delta from * all TTLs. (We are actually only interested in the minimum (delta = 0) or * the subtraction (delta > 0). It was easier to roll this into one routine.) */ { u8_t *cp, *rdp, *dlim; int r, i, hasttl, hassoa; unsigned type, count[4]; u32_t ttl, minimum, minttl; unsigned rcode; u8_t name[MAXDNAME+1]; hasttl= hassoa= 0; minttl= 365*24*3600L; dlim= dns2oct(dp) + size; if (size < sizeof(dns_hdr_t)) return 0; rcode= dp->hdr.dh_flag2 & DHF_RCODE; count[0]= ntohs(dp->hdr.dh_qdcount); count[1]= ntohs(dp->hdr.dh_ancount); count[2]= ntohs(dp->hdr.dh_nscount); count[3]= ntohs(dp->hdr.dh_arcount); cp = dp->data; for (i= 0; i < 4 && cp < dlim; i++) { while (count[i] > 0) { r= dn_expand(dns2oct(dp), dlim, cp, name, MAXDNAME); if (r == -1) break; cp += r + 2 * sizeof(u16_t); if (i != 0) { if (cp + sizeof(u32_t) + sizeof(u16_t) > dlim) break; type= upack16(cp - 2 * sizeof(u16_t)); ttl= ntohl(upack32(cp)); ttl= ttl < delta ? 0 : ttl - delta; if (rcode == NXDOMAIN && i == 2 && type == HTONS(T_SOA)) { rdp= cp + sizeof(u32_t) + sizeof(u16_t); r= dn_expand(dns2oct(dp), dlim, rdp, name, MAXDNAME); if (r == -1) break; rdp += r; r= dn_expand(dns2oct(dp), dlim, rdp, name, MAXDNAME); if (r == -1) break; rdp += r + 4 * sizeof(u32_t); if (rdp + sizeof(u32_t) > dlim) break; minimum= ntohl(upack32(rdp)); if (ttl > minimum) ttl= minimum; hassoa= 1; } if (delta != 0) pack32(cp, htonl(ttl)); if (ttl < minttl) minttl= ttl; hasttl= 1; cp += sizeof(u32_t); cp += sizeof(u16_t) + ntohs(upack16(cp)); } count[i]--; } } return ((rcode == NOERROR && hasttl) || (rcode == NXDOMAIN && hassoa)) ? minttl : 0; } /* Total cached query data. */ static size_t n_datamax= N_DATAMAX; static size_t n_data; static query_t *extract_query(query_t *qp) /* Take a query out of the query cache. */ { assert(qp != nil); *(qp->less != nil ? &qp->less->more : &lru) = qp->more; *(qp->more != nil ? &qp->more->less : &mru) = qp->less; n_data -= query_size(qp); return qp; } static query_t *get_query(u8_t *name, unsigned type) /* Find a query and if so remove it from the cache and return it. */ { query_t *qp, *less; u8_t qname[MAXDNAME+1]; int r; for (qp= mru; qp != nil; qp= less) { less= qp->less; if (qp->stale <= now - stale) { /* This answer has expired. */ deallocate(extract_query(qp)); } else { r= dn_expand(dns2oct(&qp->dns), dns2oct(&qp->dns) + qp->size, qp->dns.data, qname, MAXDNAME); if (r == -1) continue; if (namecmp(qname, name) == 0 && upack16(qp->dns.data+r) == type) { /* Found an answer to the query. */ return extract_query(qp); } } } return nil; } static void insert_query(query_t *qp) /* (Re)insert a query into the cache. */ { *(qp->less != nil ? &qp->less->more : &lru) = qp; *(qp->more != nil ? &qp->more->less : &mru) = qp; n_data += query_size(qp); /* Try to delete the LRU while there is too much memory in use. If * its usage count is too high then it gets a second chance. */ while (n_data > n_datamax && lru != nil) { if ((lru->usage >>= QU_SHIFT) == 0 || lru->stale <= now - stale) { deallocate(extract_query(lru)); } else { lru->less= mru; /* Make list circular. */ mru->more= lru; mru= lru; /* Move one over, making LRU the MRU. */ lru= lru->more; lru->less= nil; /* Break the circle. */ mru->more= nil; } } if (debug >= 2) { unsigned n= 0; for (qp= mru; qp != nil; qp= qp->less) n++; printf("%u cached repl%s, %u bytes, sbrk(0) = %u\n", n, n == 1 ? "y" : "ies", (unsigned) n_data, (unsigned) sbrk(0)); } } static void put_query(query_t *qp) /* Add a new query to the cache as the MRU. */ { qp->less= mru; qp->more= nil; insert_query(qp); } static void cache2file(void) /* Store the cached data into the cache file. */ { FILE *fp; query_t *qp; u8_t data[4+1+2+2]; u16_t usage; char newcache[sizeof(NNCACHE) + sizeof(".new")]; if (single) return; strcpy(newcache, NNCACHE); strcat(newcache, ".new"); if ((fp= fopen(newcache, "w")) == nil) { if ((errno != ENOENT && errno != EROFS) || debug >= 2) report(newcache); return; } if (debug >= 2) printf("Writing %s:\n", newcache); /* Magic number: */ fwrite(MAGIC, 1, sizeof(MAGIC), fp); for (qp= lru; qp != nil; qp= qp->more) { if (qp->stale <= now - stale) continue; if (debug >= 2) { printf("Usage = %u, Age = %ld, Flags = %02X:\n", qp->usage, (long) (now - qp->age), qp->flags); dns_tell(2, &qp->dns, qp->size); } pack32(data+0, htonl(qp->age)); data[4]= qp->flags; pack16(data+5, htons(qp->size)); pack16(data+7, htons(qp->usage)); fwrite(data, 1, sizeof(data), fp); fwrite(&qp->dns, 1, qp->size, fp); if (ferror(fp)) break; } if (ferror(fp) || fclose(fp) == EOF) { report(newcache); (void) unlink(newcache); return; } if (debug >= 2) printf("mv %s %s\n", newcache, NNCACHE); if (rename(newcache, NNCACHE) < 0) { fprintf(stderr, "nonamed: mv %s %s: %s\n", newcache, NNCACHE, strerror(errno)); (void) unlink(newcache); } } static void file2cache(void) /* Read cached data from the cache file. */ { query_t *qp; FILE *fp; u8_t data[4+1+2+2]; size_t dlen; if (single) return; if ((fp= fopen(NNCACHE, "r")) == nil) { if (errno != ENOENT || debug >= 2) report(NNCACHE); return; } if (debug >= 2) printf("Reading %s:\n", NNCACHE); /* Magic number? */ fread(data, 1, sizeof(MAGIC), fp); if (ferror(fp) || memcmp(MAGIC, data, sizeof(MAGIC)) != 0) goto err; for (;;) { fread(data, 1, sizeof(data), fp); if (feof(fp) || ferror(fp)) break; dlen= ntohs(upack16(data+5)); qp= allocate(nil, query_allocsize(dlen)); qp->age= htonl(upack32(data+0)); qp->flags= data[4]; if (qp->flags & QF_REFRESH) q_refresh= 1; qp->size= dlen; qp->usage= htons(upack16(data+7)); fread(&qp->dns, 1, qp->size, fp); if (feof(fp) || ferror(fp)) { deallocate(qp); goto err; } qp->stale= qp->age + dns_ttl(&qp->dns, dlen, 0); if (debug >= 2) { printf("Usage = %u, Age = %ld, Flags = %02X:\n", qp->usage, (long) (now - qp->age), qp->flags); dns_tell(2, &qp->dns, dlen); } put_query(qp); } if (ferror(fp)) { err: /* The cache file did not end at EOF or is otherwise a mess. */ fprintf(stderr, "nonamed: %s: %s\n", NNCACHE, ferror(fp) ? strerror(errno) : "Corrupt"); while (lru != nil) deallocate(extract_query(lru)); } fclose(fp); } typedef int handler_t(void *data, int expired); /* All actions are in the form of "jobs". */ typedef struct job { struct job *next, **prev; /* To make a job queue. */ handler_t *handler; /* Function to handle this job. */ time_t timeout; /* Moment it times out. */ void *data; /* Data associated with the job. */ } job_t; static job_t *queue; /* Main job queue. */ static void newjob(handler_t *handler, time_t timeout, void *data) /* Create a new job with the given handler, timeout time and data. */ { job_t *job, **prev; job= allocate(nil, sizeof(*job)); job->handler= handler; job->timeout= timeout; job->data= data; for (prev= &queue; *prev != nil; prev= &(*prev)->next) { if (job->timeout < (*prev)->timeout) break; } job->next= *prev; job->prev= prev; *prev= job; if (job->next != nil) job->next->prev= &job->next; } static int execjob(job_t *job, int expired) /* Execute a job by calling the handler. Remove the job if it returns true, * indicating that it is done. Expired is set if the job timed out. It is * otherwise called to check for I/O. */ { if ((*job->handler)(job->data, expired)) { *job->prev= job->next; if (job->next != nil) job->next->prev= job->prev; deallocate(job); return 1; } return 0; } static void force_expire(handler_t *handler) /* Force jobs to expire immediately, the named searcher for instance. */ { job_t *job, **prev= &queue; while ((job= *prev) != nil) { if (job->handler == handler && job->timeout != IMMEDIATE) { *prev= job->next; if (job->next != nil) job->next->prev= prev; newjob(job->handler, IMMEDIATE, job->data); deallocate(job); } else { prev= &job->next; } } } static int nxdomain(u8_t *name) /* True iff the two top level components in a name are repeated in the name, * or if in-addr.arpa is found within a name. Such things happen often in a * search for an already fully qualified local name. For instance: * flotsam.cs.vu.nl.cs.vu.nl. (We don't want this at boot time.) */ { u8_t *end, *top, *p; size_t n; end= namechr(name, 0); top= end; while (top > name && *--top != '.') {} while (top > name && *--top != '.') {} n= end - top; p= top; for (;;) { if (p == name) return 0; if (*--p == '.') { if (namencmp(p, top, n) == 0 && p[n] == '.') return 1; if (namencmp(p, ".in-addr.arpa.", 14) == 0) return 1; } } } typedef struct id2id { u16_t id; /* ID of old query. */ u16_t port; /* Reply port. */ ipaddr_t ip; /* Reply address. */ } id2id_t; static id2id_t id2id[N_IDS]; static u16_t id_counter; static u16_t new_id(u16_t in_id, u16_t in_port, ipaddr_t in_ip) /* An incoming UDP query must be relabeled with a new ID before it can be * send on to a real name daemon. */ { id2id_t *idp; u16_t id; id= id_counter++; idp= &id2id[id % N_IDS]; idp->id= in_id; idp->port= in_port; idp->ip= in_ip; return htons(id); } static int old_id(u16_t id, u16_t *out_id, u16_t *out_port, ipaddr_t *out_ip) /* Translate a reply id back to the id, port, and address used in the query. * Return true if the translation is possible. */ { id= ntohs(id); if ((u16_t) (id_counter - id) > N_IDS) { /* Too old. */ return 0; } else { /* We know this one. */ id2id_t *idp= &id2id[id % N_IDS]; if (idp->port == 0) return 0; /* Named is trying to fool us? */ *out_id= idp->id; *out_port= idp->port; *out_ip= idp->ip; idp->port= 0; return 1; } } /* IDs used to mark my own queries to name servers, must be new_id translated * to make them unique "on the wire". */ #define ID_IPSELF HTONL(0) /* "I did it myself" address. */ #define ID_PROBE HTONS(0) /* Name server probe. */ #define ID_REFRESH HTONS(1) /* Query to refresh a cache entry. */ static char *tcp_device, *udp_device; /* TCP and UDP device names. */ static int udp_fd; /* To send or receive UDP packets. */ static asynchio_t asyn; /* For I/O in progress. */ static ipaddr_t my_ip; /* My IP address. */ static u16_t my_port, named_port; /* Port numbers, normally "domain". */ static ipaddr_t named[N_NAMEDS]; /* Addresses of all name servers. */ static unsigned n_nameds; /* Number of configured name daemons. */ static unsigned i_named; /* Index to current name server. */ static int expect; /* Set when we expect an answer. */ static int search_ct= -1; /* Named search count and state. */ static int dirty; /* True when new entry put in cache. */ #define current_named() (+named[i_named]) #define searching() (search_ct > 0) #define start_searching() ((void) (search_ct= -1)) #define stop_searching() ((void) (search_ct= 0)) #define expecting() (+expect) #define start_expecting() ((void) (expect= 1)) #define stop_expecting() ((void) (expect= 0)) static time_t filetime(const char *file) /* Get the modified time of a file. */ { struct stat st; return stat(file, &st) == 0 ? st.st_mtime : 0; } static void init_config(ipaddr_t ifip) /* Read name daemon list and other special stuff from the hosts file. */ { struct hostent *he; u32_t nip, hip; static time_t hosts_time, dhcp_time; time_t ht, dt; /* See if anything really changed. */ if (((ifip ^ HTONL(0x7F000000)) & HTONL(0xFF000000)) == 0) ifip= my_ip; ht= filetime(HOSTS); dt= filetime(DHCPCACHE); if (ifip == my_ip && ht == hosts_time && dt == dhcp_time) return; my_ip= ifip; hosts_time= ht; dhcp_time= dt; if (debug >= 2) { printf("%s: I am nonamed %s at %s:%u\n", nowgmt(), version, inet_ntoa(my_ip), ntohs(my_port)); } httl= HTONL(HTTL); stale= 0; n_nameds= 0; if (!single) { sethostent(0); while ((he= gethostent()) != nil) { memcpy(&nip, he->h_addr, sizeof(u32_t)); hip= ntohl(nip); if (namecmp(he->h_name, "%ttl") == 0) httl= nip; if (namecmp(he->h_name, "%stale") == 0) stale= hip; if (namecmp(he->h_name, "%memory") == 0) n_datamax= hip; if (namecmp(he->h_name, "%nameserver") == 0) { if (nip != my_ip || named_port != my_port) { if (n_nameds < N_NAMEDS) named[n_nameds++]= nip; } } } endhostent(); } if (n_nameds == 0) { /* No name daemons found in the host file. What about DHCP? */ int fd; dhcp_t d; ssize_t r; u8_t *data; size_t len; if ((fd= open(DHCPCACHE, O_RDONLY)) < 0) { if (errno != ENOENT) fatal(DHCPCACHE); } else { while ((r= read(fd, &d, sizeof(d))) == sizeof(d)) { if (d.yiaddr == my_ip) break; } if (r < 0) fatal(DHCPCACHE); close(fd); if (r == sizeof(d) && dhcp_gettag(&d, DHCP_TAG_DNS, &data, &len)) { while (len >= sizeof(nip)) { memcpy(&nip, data, sizeof(nip)); data += sizeof(nip); len -= sizeof(nip); if (nip != my_ip || named_port != my_port) { if (n_nameds < N_NAMEDS) named[n_nameds++]= nip; } } } } } i_named= 0; } static handler_t job_save_cache, job_read_udp, job_find_named, job_expect_named; #if DO_TCP static handler_t job_setup_listen, job_listen, job_setup_connect, job_connect; static handler_t job_read_query, job_write_query; static handler_t job_read_reply, job_write_reply; #endif static int query_hosts(u8_t *qname, unsigned type, dns_t *dp, size_t *pdlen) /* Read the /etc/hosts file to try and answer an A or PTR query. Return * true iff an answer can be found, with the answer copied to *dp. */ { struct hostent *he; int i, r; dns_t dns; u8_t *domain; u8_t *cp; u8_t name[MAXDNAME+1]; u8_t *dnvec[40]; unsigned ancount; struct hostent localhost; static char *noaliases[]= { nil }; static ipaddr_t localaddr= HTONL(0x7F000001L); static char *localaddrlist[]= { (char *) &localaddr, nil }; if (single) return 0; /* Assume we can answer. */ dns.hdr.dh_flag1= DHF_QR | DHF_AA; dns.hdr.dh_flag2= DHF_RA; dns.hdr.dh_qdcount= HTONS(1); ancount= 0; dns.hdr.dh_nscount= HTONS(0); dns.hdr.dh_arcount= HTONS(0); dnvec[0]= dns2oct(&dns); dnvec[1]= nil; cp= dns.data; r= dn_comp(qname, cp, arraysize(dns.data), dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; pack16(cp, type); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); /* Localhost is fixed to 127.0.0.1. */ localhost.h_name= namencmp(qname, "localhost.", 10) == 0 ? (char *) qname : "localhost"; localhost.h_aliases= noaliases; localhost.h_addr_list= localaddrlist; he= &localhost; sethostent(0); do { switch (type) { case HTONS(T_A): if (namecmp(qname, he->h_name) == 0) { addA: r= dn_comp((u8_t *) he->h_name, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; if (cp + 3 * sizeof(u16_t) + 2 * sizeof(u32_t) > arraylimit(dns.data)) return 0; pack16(cp, HTONS(T_A)); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); pack32(cp, httl); cp += sizeof(u32_t); pack16(cp, HTONS(sizeof(u32_t))); cp += sizeof(u16_t); memcpy(cp, he->h_addr, sizeof(u32_t)); cp += sizeof(u32_t); ancount++; break; } /*FALL THROUGH*/ case HTONS(T_CNAME): domain= namechr(he->h_name, '.'); for (i= 0; he->h_aliases[i] != nil; i++) { namecpy(name, he->h_aliases[i]); if (domain != nil && namechr(name, '.') == nil) { namecat(name, domain); } if (namecmp(qname, name) == 0) { r= dn_comp(name, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; if (cp + 3 * sizeof(u16_t) + 1 * sizeof(u32_t) > arraylimit(dns.data)) return 0; pack16(cp, HTONS(T_CNAME)); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); pack32(cp, httl); cp += sizeof(u32_t); /* pack16(cp, htonl(RDLENGTH)) */ cp += sizeof(u16_t); r= dn_comp((u8_t *) he->h_name, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; pack16(cp - sizeof(u16_t), htons(r)); cp += r; ancount++; if (type == HTONS(T_A)) goto addA; /* really wants A */ break; } } break; case HTONS(T_PTR): if (he->h_name[0] == '%') break; sprintf((char *) name, "%d.%d.%d.%d.in-addr.arpa", ((u8_t *) he->h_addr)[3], ((u8_t *) he->h_addr)[2], ((u8_t *) he->h_addr)[1], ((u8_t *) he->h_addr)[0]); if (namecmp(qname, name) == 0) { r= dn_comp(name, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; if (cp + 3 * sizeof(u16_t) + 1 * sizeof(u32_t) > arraylimit(dns.data)) return 0; pack16(cp, HTONS(T_PTR)); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); pack32(cp, httl); cp += sizeof(u32_t); /* pack16(cp, htonl(RDLENGTH)) */ cp += sizeof(u16_t); r= dn_comp((u8_t *) he->h_name, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; pack16(cp - sizeof(u16_t), htons(r)); cp += r; ancount++; } break; } } while ((he= gethostent()) != nil); endhostent(); if (ancount == 0) return 0; dns.hdr.dh_ancount= htons(ancount); memcpy(dp, &dns, *pdlen= cp - dns2oct(&dns)); return 1; } static int query_chaos(u8_t *qname, unsigned type, dns_t *dp, size_t *pdlen) /* Report my version. Can't let BIND take all the credit. :-) */ { int i, n, r; dns_t dns; u8_t *cp; u8_t *dnvec[40]; if (type != HTONS(T_TXT) || namecmp(qname, "version.bind") != 0) return 0; dns.hdr.dh_flag1= DHF_QR | DHF_AA; dns.hdr.dh_flag2= DHF_RA; dns.hdr.dh_qdcount= HTONS(1); dns.hdr.dh_ancount= HTONS(1); dns.hdr.dh_nscount= HTONS(0); dns.hdr.dh_arcount= htons(n_nameds); dnvec[0]= dns2oct(&dns); dnvec[1]= nil; cp= dns.data; r= dn_comp(qname, cp, arraysize(dns.data), dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; pack16(cp, type); cp += sizeof(u16_t); pack16(cp, HTONS(C_CHAOS)); cp += sizeof(u16_t); r= dn_comp(qname, cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; pack16(cp, HTONS(T_TXT)); cp += sizeof(u16_t); pack16(cp, HTONS(C_CHAOS)); cp += sizeof(u16_t); pack32(cp, HTONL(0)); cp += sizeof(u32_t); /* pack16(cp, htonl(RDLENGTH)) */ cp += sizeof(u16_t); sprintf((char *) cp + 1, "nonamed %s at %s:%u", version, inet_ntoa(my_ip), ntohs(my_port)); r= strlen((char *) cp + 1) + 1; pack16(cp - sizeof(u16_t), htons(r)); *cp= r-1; cp += r; for (n= 0, i= i_named; n < n_nameds; n++, i= (i+1) % n_nameds) { r= dn_comp((u8_t *) "%nameserver", cp, arraylimit(dns.data) - cp, dnvec, arraylimit(dnvec)); if (r == -1) return 0; cp += r; if (cp + 3 * sizeof(u16_t) + 2 * sizeof(u32_t) > arraylimit(dns.data)) return 0; pack16(cp, HTONS(T_A)); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); pack32(cp, HTONL(0)); cp += sizeof(u32_t); pack16(cp, HTONS(sizeof(u32_t))); cp += sizeof(u16_t); memcpy(cp, &named[i], sizeof(u32_t)); cp += sizeof(u32_t); } memcpy(dp, &dns, *pdlen= cp - dns2oct(&dns)); return 1; } static void cache_reply(dns_t *dp, size_t dlen) /* Store a DNS packet in the cache. */ { int r; query_t *qp, *less, *more; unsigned usage; u16_t type; u8_t *cp; u8_t name[MAXDNAME]; u32_t minttl; if ((dp->hdr.dh_flag1 & (DHF_RD | DHF_TC)) != DHF_RD) return; if (dp->hdr.dh_qdcount != HTONS(1)) return; cp= dp->data; r= dn_expand(dns2oct(dp), dns2oct(dp) + dlen, cp, name, MAXDNAME); if (r == -1) return; cp += r; type= upack16(cp); cp += sizeof(u16_t); if (upack16(cp) != HTONS(C_IN)) return; /* Delete old cached data, if any. Note where it is in the LRU. */ if ((qp= get_query(name, type)) != nil) { less= qp->less; more= qp->more; usage= qp->usage; deallocate(qp); } else { /* Not yet in the cache. */ less= mru; more= nil; usage= 1; } /* Determine minimum TTL. Discard if zero, never cache zero TTLs. */ if ((minttl= dns_ttl(dp, dlen, 0)) == 0) return; /* Enter new reply in cache. */ qp= allocate(nil, query_allocsize(dlen)); qp->less= less; qp->more= more; qp->age= now; qp->flags= 0; qp->usage= usage; qp->size= dlen; memcpy(&qp->dns, dp, dlen); qp->stale= qp->age + minttl; insert_query(qp); if (debug >= 1) printf("Answer cached\n"); /* Save the cache soon. */ if (!dirty) { dirty= 1; newjob(job_save_cache, now + LONG_TIMEOUT, nil); } } static int job_save_cache(void *data, int expired) /* Some time after the cache is changed it is written back to disk. */ { if (!expired) return 0; cache2file(); dirty= 0; } static int compose_reply(dns_t *dp, size_t *pdlen) /* Try to compose a reply to a request in *dp using the hosts file or * cached data. Return answer in *dp with its size in *pdlen. Return true * iff an answer is given. */ { size_t dlen= *pdlen; int r, rd; query_t *qp; unsigned id, type, class; u8_t *cp; u8_t name[MAXDNAME]; cp= dp->data; r= dn_expand(dns2oct(dp), dns2oct(dp) + dlen, cp, name, MAXDNAME); if (r != -1) { cp += r; if (cp + 2 * sizeof(u16_t) > dns2oct(dp) + dlen) { r= -1; } else { type= upack16(cp); cp += sizeof(u16_t); class= upack16(cp); cp += sizeof(u16_t); } } /* Remember ID and RD. */ id= dp->hdr.dh_id; rd= dp->hdr.dh_flag1 & DHF_RD; if (r == -1) { /* Malformed query, reply "FORMERR". */ dp->hdr.dh_flag1 &= ~(DHF_TC); dp->hdr.dh_flag1 |= DHF_QR | DHF_AA; dp->hdr.dh_flag2 &= ~(DHF_PR | DHF_UNUSED | DHF_RCODE); dp->hdr.dh_flag2 |= DHF_RA | FORMERR; } else if (class == HTONS(C_IN) && query_hosts(name, type, dp, pdlen)) { /* Answer to this query is in the hosts file. */ dlen= *pdlen; } else if (class == HTONS(C_IN) && (qp= get_query(name, type)) != nil) { /* Answer to this query is present in the cache. */ memcpy(dp, &qp->dns, dlen= qp->size); dp->hdr.dh_flag1 &= ~DHF_AA; (void) dns_ttl(dp, dlen, now - qp->age); if (rd) { if (qp->stale <= now) { qp->flags |= QF_REFRESH; q_refresh= 1; } qp->usage++; } put_query(qp); } else if (class == HTONS(C_CHAOS) && query_chaos(name, type, dp, pdlen)) { /* Return our version numbers. */ dlen= *pdlen; } else if (n_nameds == 0 || nxdomain(name)) { /* No real name daemon present, or this name has a repeated top level * domain sequence. Reply "no such domain". */ dp->hdr.dh_flag1 &= ~(DHF_TC); dp->hdr.dh_flag1 |= DHF_QR | DHF_AA; dp->hdr.dh_flag2 &= ~(DHF_PR | DHF_UNUSED | DHF_RCODE); dp->hdr.dh_flag2 |= DHF_RA | NXDOMAIN; } else if (!rd) { /* "Recursion Desired" is off, so don't bother to relay. */ dp->hdr.dh_flag1 &= ~(DHF_TC); dp->hdr.dh_flag1 |= DHF_QR; dp->hdr.dh_flag2 &= ~(DHF_PR | DHF_UNUSED | DHF_RCODE); dp->hdr.dh_flag2 |= DHF_RA | NOERROR; } else { /* Caller needs to consult with a real name daemon. */ return 0; } /* Copy ID and RD back to answer. */ dp->hdr.dh_id= id; dp->hdr.dh_flag1 &= ~DHF_RD; dp->hdr.dh_flag1 |= rd; *pdlen= dlen; return 1; } typedef struct udp_dns { /* One DNS packet over UDP. */ udp_io_hdr_t hdr; /* UDP header (source/destination). */ dns_t dns; /* DNS packet. */ } udp_dns_t; static void refresh_cache(void) /* Find a stale entry in the cache that was used to answer a query, and send * a request to a name server that should refresh this entry. */ { query_t *qp; unsigned type; int r; u8_t *cp; size_t dlen, ulen; u8_t qname[MAXDNAME+1]; u8_t *dnvec[40]; udp_dns_t udp; if (!q_refresh) return; for (qp= lru; qp != nil; qp= qp->more) { if ((qp->flags & QF_REFRESH) && qp->stale > now - stale) break; } if (qp == nil) { q_refresh= 0; return; } /* Found one to refresh. */ qp->flags &= ~QF_REFRESH; r= dn_expand(dns2oct(&qp->dns), dns2oct(&qp->dns) + qp->size, qp->dns.data, qname, MAXDNAME); if (r == -1) return; type= upack16(qp->dns.data+r); dnvec[0]= dns2oct(&udp.dns); dnvec[1]= nil; cp= udp.dns.data; r= dn_comp(qname, cp, arraysize(udp.dns.data), dnvec, arraylimit(dnvec)); if (r == -1) return; cp += r; pack16(cp, type); cp += sizeof(u16_t); pack16(cp, HTONS(C_IN)); cp += sizeof(u16_t); dlen= cp - dns2oct(&udp.dns); udp.dns.hdr.dh_id= new_id(ID_REFRESH, my_port, ID_IPSELF); udp.dns.hdr.dh_flag1= DHF_RD; udp.dns.hdr.dh_flag2= 0; udp.dns.hdr.dh_qdcount= HTONS(1); udp.dns.hdr.dh_ancount= HTONS(0); udp.dns.hdr.dh_nscount= HTONS(0); udp.dns.hdr.dh_arcount= HTONS(0); udp.hdr.uih_dst_addr= current_named(); udp.hdr.uih_dst_port= named_port; udp.hdr.uih_ip_opt_len= 0; udp.hdr.uih_data_len= dlen; if (debug >= 1) { printf("Refresh to %s:%u:\n", inet_ntoa(current_named()), ntohs(named_port)); dns_tell(0, &udp.dns, dlen); } ulen= offsetof(udp_dns_t, dns) + dlen; if (write(udp_fd, &udp, ulen) < 0) fatal(udp_device); } static int job_read_udp(void *data, int expired) /* Read UDP queries and replies. */ { size_t ulen, dlen; static udp_dns_t udp; u16_t id, port; ipaddr_t ip; time_t dtime; assert(!expired); /* Try to read a packet. */ ulen= asyn_read(&asyn, udp_fd, &udp, sizeof(udp)); dlen= ulen - offsetof(udp_dns_t, dns); if (ulen == -1) { if (errno == EINPROGRESS && !expired) return 0; if (errno == EIO) fatal(udp_device); if (debug >= 2) { printf("%s: UDP read: %s\n", nowgmt(), strerror(errno)); } } else { if (debug >= 2) { printf("%s: UDP read, %d bytes\n", nowgmt(), (int) ulen); } } /* Restart this job no matter what. */ newjob(job_read_udp, NEVER, nil); if (ulen < (ssize_t) (sizeof(udp_io_hdr_t) + sizeof(dns_hdr_t))) return 1; if (debug >= 1) { printf("%s:%u UDP ", inet_ntoa(udp.hdr.uih_src_addr), ntohs(udp.hdr.uih_src_port)); dns_tell(0, &udp.dns, dlen); } /* Check, and if necessary reinitialize my configuration. */ init_config(udp.hdr.uih_dst_addr); if (udp.dns.hdr.dh_flag1 & DHF_QR) { /* This is a remote named reply, not a query. */ /* Response to a query previously relayed? */ if (!old_id(udp.dns.hdr.dh_id, &id, &port, &ip)) return 1; if (ip == ID_IPSELF && id == ID_PROBE) { if (searching()) { /* We have found a name server! */ int i; /* In my list? */ for (i= 0; i < n_nameds; i++) { if (named[i] == udp.hdr.uih_src_addr) { i_named= i; if (debug >= 1) { printf("Current named = %s\n", inet_ntoa(current_named())); } stop_searching(); force_expire(job_find_named); } } } } /* We got an answer, so stop worrying. */ if (expecting()) { stop_expecting(); force_expire(job_expect_named); } /* Put the information in the cache. */ cache_reply(&udp.dns, dlen); /* Refresh a cached entry that was used when stale. */ refresh_cache(); /* Discard reply to myself. */ if (ip == ID_IPSELF) return 1; /* Send the reply to the process that asked for it. */ udp.dns.hdr.dh_id= id; udp.hdr.uih_dst_addr= ip; udp.hdr.uih_dst_port= port; if (debug >= 1) printf("To client %s:%u\n", inet_ntoa(ip), ntohs(port)); } else { /* A query. */ if (udp.dns.hdr.dh_qdcount != HTONS(1)) return 1; /* Try to compose a reply from local data. */ if (compose_reply(&udp.dns, &dlen)) { udp.hdr.uih_dst_addr= udp.hdr.uih_src_addr; udp.hdr.uih_dst_port= udp.hdr.uih_src_port; udp.hdr.uih_ip_opt_len= 0; udp.hdr.uih_data_len= dlen; ulen= offsetof(udp_dns_t, dns) + dlen; /* Send an UDP DNS reply. */ if (debug >= 1) { printf("%s:%u UDP ", inet_ntoa(udp.hdr.uih_dst_addr), ntohs(udp.hdr.uih_dst_port)); dns_tell(0, &udp.dns, dlen); } } else { /* Let a real name daemon handle the query. */ udp.dns.hdr.dh_id= new_id(udp.dns.hdr.dh_id, udp.hdr.uih_src_port, udp.hdr.uih_src_addr); udp.hdr.uih_dst_addr= current_named(); udp.hdr.uih_dst_port= named_port; if (!expecting()) { start_expecting(); newjob(job_expect_named, now + MEDIUM_TIMEOUT, nil); } if (debug >= 1) { printf("To named %s:%u\n", inet_ntoa(current_named()), ntohs(named_port)); } } } if (write(udp_fd, &udp, ulen) < 0) fatal(udp_device); return 1; } #if DO_TCP typedef struct data_cl { /* Data for connect or listen jobs. */ int fd; /* Open TCP channel. */ int dn_fd; /* TCP channel to the name daemon. */ int retry; /* Retrying a connect? */ nwio_tcpcl_t tcpcl; /* Flags. */ } data_cl_t; typedef struct data_rw { /* Data for TCP read or write jobs. */ int r_fd; /* Read from this TCP channel. */ int w_fd; /* And write to this TCP channel. */ struct data_rw *rev; /* Optional reverse TCP channel. */ u8_t *buf; /* Buffer for bytes to transfer. */ ssize_t offset; /* Offset in buf to r/w at. */ size_t size; /* Size of buf. */ } data_rw_t; static int job_setup_listen(void *data, int expired) /* Set up a listening channel for TCP DNS queries. */ { data_cl_t *data_cl= data; nwio_tcpconf_t tcpconf; nwio_tcpopt_t tcpopt; int fd; if (!expired) return 0; if (debug >= 2) printf("%s: Setup listen\n", nowgmt()); if (data_cl == nil) { if ((fd= open(tcp_device, O_RDWR)) < 0) { if (errno != EMFILE) report(tcp_device); newjob(job_setup_listen, now + SHORT_TIMEOUT, nil); return 1; } tcpconf.nwtc_flags= NWTC_SHARED | NWTC_LP_SET | NWTC_UNSET_RA | NWTC_UNSET_RP; tcpconf.nwtc_locport= my_port; if (ioctl(fd, NWIOSTCPCONF, &tcpconf) == -1) fatal(tcp_device); tcpopt.nwto_flags= NWTO_DEL_RST; if (ioctl(fd, NWIOSTCPOPT, &tcpopt) == -1) fatal(tcp_device); data_cl= allocate(nil, sizeof(*data_cl)); data_cl->fd= fd; data_cl->tcpcl.nwtcl_flags= 0; } /* And listen. */ newjob(job_listen, NEVER, data_cl); return 1; } static int job_listen(void *data, int expired) /* A connection on the TCP DNS query channel. */ { data_cl_t *data_cl= data; /* Wait for a client. */ if (asyn_ioctl(&asyn, data_cl->fd, NWIOTCPLISTEN, &data_cl->tcpcl) < 0) { if (errno == EINPROGRESS) return 0; report(tcp_device); /* Try again after a short time. */ newjob(job_setup_listen, now + SHORT_TIMEOUT, data_cl); return 1; } if (debug >= 2) printf("%s: Listen\n", nowgmt()); /* Immediately resume listening. */ newjob(job_setup_listen, IMMEDIATE, nil); /* Set up a connect to the real name daemon. */ data_cl->retry= 0; newjob(job_setup_connect, IMMEDIATE, data_cl); return 1; } static void start_relay(int fd, int dn_fd) /* Start one or two read jobs after job_setup_connect() or job_connect(). */ { data_rw_t *query; /* Client to DNS daemon relay. */ data_rw_t *reply; /* DNS daemon to client relay. */ query= allocate(nil, sizeof(*query)); query->r_fd= fd; query->buf= allocate(nil, sizeof(u16_t)); query->offset= 0; query->size= sizeof(u16_t); if (dn_fd == NO_FD) { /* Answer mode. */ query->w_fd= fd; query->rev= nil; } else { /* Relay mode. */ reply= allocate(nil, sizeof(*reply)); reply->r_fd= dn_fd; reply->w_fd= fd; reply->buf= allocate(nil, sizeof(u16_t)); reply->offset= 0; reply->size= sizeof(u16_t); reply->rev= query; query->w_fd= dn_fd; query->rev= reply; newjob(job_read_reply, now + LONG_TIMEOUT, reply); } newjob(job_read_query, now + LONG_TIMEOUT, query); } static void close_relay(data_rw_t *data_rw) /* Close a relay channel. */ { if (data_rw->rev != nil) { /* Other end still active, signal EOF. */ (void) ioctl(data_rw->w_fd, NWIOTCPSHUTDOWN, nil); data_rw->rev->rev= nil; } else { /* Close both ends down. */ asyn_close(&asyn, data_rw->r_fd); close(data_rw->r_fd); if (data_rw->w_fd != data_rw->r_fd) { asyn_close(&asyn, data_rw->w_fd); close(data_rw->w_fd); } } deallocate(data_rw->buf); deallocate(data_rw); } static int job_setup_connect(void *data, int expired) /* Set up a connect for a TCP channel to the real name daemon. */ { nwio_tcpconf_t tcpconf; int dn_fd; data_cl_t *data_cl= data; if (!expired) return 0; if (debug >= 2) printf("%s: Setup connect\n", nowgmt()); if (n_nameds == 0) { /* No name daemons to relay to, answer myself. */ start_relay(data_cl->fd, NO_FD); deallocate(data_cl); return 1; } if ((dn_fd= open(tcp_device, O_RDWR)) < 0) { if (errno != EMFILE) report(tcp_device); if (++data_cl->retry < 5) { /* Retry. */ newjob(job_setup_connect, now + SHORT_TIMEOUT, data_cl); } else { /* Reply myself (bound to fail). */ start_relay(data_cl->fd, NO_FD); deallocate(data_cl); } return 1; } tcpconf.nwtc_flags= NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr= current_named(); tcpconf.nwtc_remport= named_port; if (ioctl(dn_fd, NWIOSTCPCONF, &tcpconf) == -1) fatal(tcp_device); /* And connect. */ data_cl->dn_fd= dn_fd; data_cl->tcpcl.nwtcl_flags= 0; newjob(job_connect, NEVER, data_cl); return 1; } static int job_connect(void *data, int expired) /* Connect to a TCP DNS query channel. */ { data_cl_t *data_cl= data; /* Try to connect. */ if (asyn_ioctl(&asyn, data_cl->dn_fd, NWIOTCPCONN, &data_cl->tcpcl) < 0) { if (errno == EINPROGRESS) return 0; if (errno == EIO) fatal(tcp_device); /* Connection refused. */ if (debug >= 2) printf("%s: Connect: %s\n", nowgmt(), strerror(errno)); asyn_close(&asyn, data_cl->dn_fd); close(data_cl->dn_fd); data_cl->dn_fd= NO_FD; if (++data_cl->retry < 5) { /* Search a new name daemon. */ if (!searching()) { start_searching(); force_expire(job_find_named); } newjob(job_setup_connect, NEVER, data_cl); return 1; } /* Reply with a failure eventually. */ } if (debug >= 2) printf("%s: Connect\n", nowgmt()); /* Read the query from the user, send on to the name daemon, etc. */ start_relay(data_cl->fd, data_cl->dn_fd); deallocate(data_cl); return 1; } static void tcp_dns_tell(int fd, u8_t *buf) /* Tell about a DNS packet on a TCP channel. */ { nwio_tcpconf_t tcpconf; if (ioctl(fd, NWIOGTCPCONF, &tcpconf) < 0) { printf("??\?:?? TCP "); } else { printf("%s:%u TCP ", inet_ntoa(tcpconf.nwtc_remaddr), ntohs(tcpconf.nwtc_remport)); } dns_tell(0, oct2dns(buf + sizeof(u16_t)), ntohs(upack16(buf))); } static int job_read_query(void *data, int expired) /* Read TCP queries from the client. */ { data_rw_t *data_rw= data; ssize_t count; /* Try to read count bytes. */ count= asyn_read(&asyn, data_rw->r_fd, data_rw->buf + data_rw->offset, data_rw->size - data_rw->offset); if (count < 0) { if (errno == EINPROGRESS && !expired) return 0; if (errno == EIO) fatal(tcp_device); /* Remote end is late, or an error occurred. */ if (debug >= 2) { printf("%s: TCP read query: %s\n", nowgmt(), strerror(errno)); } close_relay(data_rw); return 1; } if (debug >= 2) { printf("%s: TCP read query, %d/%u bytes\n", nowgmt(), data_rw->offset + count, data_rw->size); } if (count == 0) { /* EOF. */ close_relay(data_rw); return 1; } data_rw->offset += count; if (data_rw->offset == data_rw->size) { data_rw->size= sizeof(u16_t) + ntohs(upack16(data_rw->buf)); if (data_rw->size < sizeof(u16_t)) { /* Malformed. */ close_relay(data_rw); return 1; } if (data_rw->offset < data_rw->size) { /* Query not complete, read more. */ data_rw->buf= allocate(data_rw->buf, data_rw->size); newjob(job_read_query, now + LONG_TIMEOUT, data_rw); return 1; } } if (data_rw->size < sizeof(u16_t) + sizeof(dns_hdr_t)) { close_relay(data_rw); return 1; } if (debug >= 1) tcp_dns_tell(data_rw->r_fd, data_rw->buf); /* Relay or reply. */ if (data_rw->w_fd != data_rw->r_fd) { /* We have a real name daemon to do the work. */ data_rw->offset= 0; newjob(job_write_query, now + LONG_TIMEOUT, data_rw); } else { /* No real name daemons or none reachable, so use the hosts file. */ dns_t *dp; size_t dlen; if (data_rw->size < sizeof(u16_t) + PACKETSZ) { data_rw->buf= allocate(data_rw->buf, sizeof(u16_t) + PACKETSZ); } /* Build a reply packet. */ dp= oct2dns(data_rw->buf + sizeof(u16_t)); dlen= data_rw->size - sizeof(u16_t); if (!compose_reply(dp, &dlen)) { /* We're told to ask a name daemon, but that won't work. */ close_relay(data_rw); return 1; } /* Start a reply write. */ pack16(data_rw->buf, htons(dlen)); data_rw->size= sizeof(u16_t) + dlen; data_rw->buf= allocate(data_rw->buf, data_rw->size); data_rw->offset= 0; newjob(job_write_reply, now + LONG_TIMEOUT, data_rw); } return 1; } static int job_write_query(void *data, int expired) /* Relay a TCP query to the name daemon. */ { data_rw_t *data_rw= data; ssize_t count; /* Try to write count bytes to the name daemon. */ count= asyn_write(&asyn, data_rw->w_fd, data_rw->buf + data_rw->offset, data_rw->size - data_rw->offset); if (count <= 0) { if (errno == EINPROGRESS && !expired) return 0; if (errno == EIO) fatal(tcp_device); /* A write expired or failed (usually a broken connection.) */ if (debug >= 2) { printf("%s: TCP write query: %s\n", nowgmt(), strerror(errno)); } close_relay(data_rw); return 1; } if (debug >= 2) { printf("%s: TCP write query, %d/%u bytes\n", nowgmt(), data_rw->offset + count, data_rw->size); } data_rw->offset += count; if (data_rw->offset < data_rw->size) { /* Partial write, continue. */ newjob(job_write_query, now + LONG_TIMEOUT, data_rw); return 1; } if (debug >= 1) tcp_dns_tell(data_rw->w_fd, data_rw->buf); /* Query fully send on, go read more queries. */ data_rw->offset= 0; data_rw->size= sizeof(u16_t); newjob(job_read_query, now + LONG_TIMEOUT, data_rw); return 1; } static int job_read_reply(void *data, int expired) /* Read a TCP reply from the real name daemon. */ { data_rw_t *data_rw= data; ssize_t count; /* Try to read count bytes. */ count= asyn_read(&asyn, data_rw->r_fd, data_rw->buf + data_rw->offset, data_rw->size - data_rw->offset); if (count < 0) { if (errno == EINPROGRESS && !expired) return 0; if (errno == EIO) fatal(tcp_device); /* Remote end is late, or an error occurred. */ if (debug >= 2) { printf("%s: TCP read reply: %s\n", nowgmt(), strerror(errno)); } close_relay(data_rw); return 1; } if (debug >= 2) { printf("%s: TCP read reply, %d/%u bytes\n", nowgmt(), data_rw->offset + count, data_rw->size); } if (count == 0) { /* EOF. */ close_relay(data_rw); return 1; } data_rw->offset += count; if (data_rw->offset == data_rw->size) { data_rw->size= sizeof(u16_t) + ntohs(upack16(data_rw->buf)); if (data_rw->size < sizeof(u16_t)) { /* Malformed. */ close_relay(data_rw); return 1; } if (data_rw->offset < data_rw->size) { /* Reply not complete, read more. */ data_rw->buf= allocate(data_rw->buf, data_rw->size); newjob(job_read_reply, now + LONG_TIMEOUT, data_rw); return 1; } } if (debug >= 1) tcp_dns_tell(data_rw->r_fd, data_rw->buf); /* Reply fully read, send it on. */ data_rw->offset= 0; newjob(job_write_reply, now + LONG_TIMEOUT, data_rw); return 1; } static int job_write_reply(void *data, int expired) /* Send a TCP reply to the client. */ { data_rw_t *data_rw= data; ssize_t count; /* Try to write count bytes to the client. */ count= asyn_write(&asyn, data_rw->w_fd, data_rw->buf + data_rw->offset, data_rw->size - data_rw->offset); if (count <= 0) { if (errno == EINPROGRESS && !expired) return 0; if (errno == EIO) fatal(tcp_device); /* A write expired or failed (usually a broken connection.) */ if (debug >= 2) { printf("%s: TCP write reply: %s\n", nowgmt(), strerror(errno)); } close_relay(data_rw); return 1; } if (debug >= 2) { printf("%s: TCP write reply, %d/%u bytes\n", nowgmt(), data_rw->offset + count, data_rw->size); } data_rw->offset += count; if (data_rw->offset < data_rw->size) { /* Partial write, continue. */ newjob(job_write_reply, now + LONG_TIMEOUT, data_rw); return 1; } if (debug >= 1) tcp_dns_tell(data_rw->w_fd, data_rw->buf); /* Reply fully send on, go read more replies (or queries). */ data_rw->offset= 0; data_rw->size= sizeof(u16_t); newjob(data_rw->w_fd != data_rw->r_fd ? job_read_reply : job_read_query, now + LONG_TIMEOUT, data_rw); return 1; } #else /* !DO_TCP */ static int job_dummy(void *data, int expired) { return 1; } #define job_setup_listen job_dummy #define job_setup_connect job_dummy #endif /* !DO_TCP */ static void named_probe(ipaddr_t ip) /* Send a probe to a name daemon, like 'host -r -t ns . <ip>'. */ { udp_dns_t udp; # define dlen (offsetof(dns_t, data) + 5) # define ulen (offsetof(udp_dns_t, dns) + dlen) /* Send a simple DNS query that all name servers can answer easily: * "What are the name servers for the root domain?" */ udp.dns.hdr.dh_id= new_id(ID_PROBE, my_port, ID_IPSELF); udp.dns.hdr.dh_flag1= 0; udp.dns.hdr.dh_flag2= 0; udp.dns.hdr.dh_qdcount= HTONS(1); udp.dns.hdr.dh_ancount= HTONS(0); udp.dns.hdr.dh_nscount= HTONS(0); udp.dns.hdr.dh_arcount= HTONS(0); udp.dns.data[0] = 0; /* Null name. */ pack16(udp.dns.data+1, HTONS(T_NS)); pack16(udp.dns.data+3, HTONS(C_IN)); if (debug >= 1) { printf("PROBE %s ", inet_ntoa(ip)); dns_tell(0, &udp.dns, dlen); } udp.hdr.uih_dst_addr= ip; udp.hdr.uih_dst_port= named_port; udp.hdr.uih_ip_opt_len= 0; udp.hdr.uih_data_len= dlen; if (write(udp_fd, &udp, ulen) < 0) fatal(udp_device); #undef dlen #undef ulen } static int job_find_named(void *data, int expired) /* Look for a real name daemon to answer real DNS queries. */ { if (!expired) return 0; if (debug >= 2) printf("%s: Find named\n", nowgmt()); /* New search? */ if (search_ct < 0) { search_ct= n_nameds; i_named= -1; } if (--search_ct < 0) { /* Forced end of search (named response!), or end of search with * nothing found. Search again after a long time. */ newjob(job_find_named, (stale > 0 || i_named > 0) ? now + LONG_TIMEOUT : NEVER, nil); force_expire(job_setup_connect); return 1; } /* Send a named probe. */ i_named= (i_named+1) % n_nameds; named_probe(current_named()); /* Schedule the next call. */ newjob(job_find_named, now + SHORT_TIMEOUT, nil); return 1; } static int job_expect_named(void *data, int expired) /* The real name server is expected to answer by now. */ { if (!expired) return 0; if (debug >= 2) printf("%s: Expect named\n", nowgmt()); if (expecting() && !searching()) { /* No answer yet, start searching. */ start_searching(); force_expire(job_find_named); } return 1; } static void sig_handler(int sig) /* A signal forces a search for a real name daemon, etc. */ { switch (sig) { case SIGINT: case SIGTERM: done= 1; break; case SIGHUP: reinit= 1; break; case SIGUSR1: debug++; break; case SIGUSR2: debug= 0; break; } } static void usage(void) { fprintf(stderr, "Usage: nonamed [-qs] [-d[level]] [-p port]\n"); exit(1); } int main(int argc, char **argv) { job_t *job; nwio_udpopt_t udpopt; int i; struct servent *servent; struct sigaction sa; FILE *fp; int quit= 0; /* Debug output must be line buffered. */ setvbuf(stdout, nil, _IOLBF, 0); /* DNS service port number? */ if ((servent= getservbyname("domain", nil)) == nil) { fprintf(stderr, "nonamed: \"domain\": unknown service\n"); exit(1); } my_port= servent->s_port; named_port= servent->s_port; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1, *end; if (opt[0] == '-' && opt[1] == 0) break; switch (*opt++) { case 'd': /* Debug level. */ debug= 1; if (between('0', *opt, '9')) debug= strtoul(opt, &opt, 10); break; case 'p': /* Port to listen to (for testing.) */ if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } my_port= htons(strtoul(opt, &end, 0)); if (opt == end || *end != 0) usage(); opt= end; break; case 's': single= 1; break; case 'q': /* Quit after printing cache contents. */ quit= 1; break; default: usage(); } } if (i != argc) usage(); if (quit) { /* Oops, just having a look at the cache. */ debug= 2; now= time(nil); n_datamax= -1; file2cache(); return 0; } /* Don't die on broken pipes, reinitialize on hangup, etc. */ sa.sa_handler= SIG_IGN; sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sigaction(SIGPIPE, &sa, nil); sa.sa_handler= sig_handler; sigaction(SIGINT, &sa, nil); sigaction(SIGHUP, &sa, nil); sigaction(SIGUSR1, &sa, nil); sigaction(SIGUSR2, &sa, nil); sigaction(SIGTERM, &sa, nil); /* TCP and UDP device names. */ if ((tcp_device= getenv("TCP_DEVICE")) == nil) tcp_device= TCP_DEVICE; if ((udp_device= getenv("UDP_DEVICE")) == nil) udp_device= UDP_DEVICE; /* Open an UDP channel for incoming DNS queries. */ if ((udp_fd= open(udp_device, O_RDWR)) < 0) fatal(udp_device); udpopt.nwuo_flags= NWUO_EXCL | NWUO_LP_SET | NWUO_EN_LOC | NWUO_DI_BROAD | NWUO_RP_ANY | NWUO_RA_ANY | NWUO_RWDATALL | NWUO_DI_IPOPT; udpopt.nwuo_locport= my_port; if (ioctl(udp_fd, NWIOSUDPOPT, &udpopt) == -1 || ioctl(udp_fd, NWIOGUDPOPT, &udpopt) == -1 ) { fatal(udp_device); } /* The current time is... */ now= time(nil); /* Read configuration and data cached by the previous nonamed. */ init_config(udpopt.nwuo_locaddr); file2cache(); if (!single) { /* Save process id. */ if ((fp= fopen(PIDFILE, "w")) != nil) { fprintf(fp, "%u\n", (unsigned) getpid()); fclose(fp); } } /* Jobs that start the ball rolling. */ newjob(job_read_udp, NEVER, nil); newjob(job_setup_listen, IMMEDIATE, nil); newjob(job_find_named, IMMEDIATE, nil); while (!done) { /* There is always something in the queue. */ assert(queue != nil); /* Any expired jobs? */ while (queue->timeout <= now) { (void) execjob(queue, 1); assert(queue != nil); } /* Check I/O jobs. */ for (job= queue; job != nil; job= job->next) { if (execjob(job, 0)) break; } if (queue->timeout != IMMEDIATE) { struct timeval tv, *tvp; if (debug >= 2) printf("%s: I/O wait", nowgmt()); if (queue->timeout != NEVER) { tv.tv_sec= queue->timeout; tv.tv_usec= 0; tvp= &tv; if (debug >= 2) printf(" (expires %s)\n", timegmt(tv.tv_sec)); } else { tvp= nil; if (debug >= 2) fputc('\n', stdout); } fflush(stdout); if (asyn_wait(&asyn, 0, tvp) < 0) { if (errno != EINTR && errno != EAGAIN) fatal("fwait()"); } now= time(nil); } if (reinit) { /* A hangup makes us go back to square one. */ reinit= 0; if (ioctl(udp_fd, NWIOGUDPOPT, &udpopt) == -1) fatal(udp_device); init_config(udpopt.nwuo_locaddr); start_searching(); force_expire(job_find_named); } } cache2file(); if (debug >= 2) printf("sbrk(0) = %u\n", (unsigned) sbrk(0)); return 0; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cdiff - context diff Author: Larry Wall */ /* Cdiff - turns a regular diff into a new-style context diff * * Usage: cdiff file1 file2 */ #define PATCHLEVEL 2 #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <ctype.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <limits.h> #include <stdio.h> char buff[512]; FILE *inputfp, *oldfp, *newfp; int oldmin, oldmax, newmin, newmax; int oldbeg, oldend, newbeg, newend; int preoldmax, prenewmax; int preoldbeg, preoldend, prenewbeg, prenewend; int oldwanted, newwanted; char *oldhunk, *newhunk; char *progname; size_t oldsize, oldalloc, newsize, newalloc; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void dumphunk, (void)); _PROTOTYPE(char *getold, (int targ)); _PROTOTYPE(char *getnew, (int targ)); _PROTOTYPE(void *xmalloc, (size_t size)); _PROTOTYPE(void *xrealloc, (void *ptr, size_t size)); #define Nullfp (FILE*)0 #define Nullch (char*)0 #define ENOUGH (NAME_MAX + PATH_MAX + 1) #define CRC_END 12 int main(argc, argv) int argc; char **argv; { FILE *crcfp; char *old, *new; int context = 3; struct stat statbuf; register char *s; char op; char *newmark, *oldmark; char sysbuf1[ENOUGH], sysbuf2[ENOUGH]; int len; char *line; int i; int status; progname = argv[0]; oldalloc = 512; oldhunk = (char *) xmalloc(oldalloc); newalloc = 512; newhunk = (char *) xmalloc(newalloc); for (argc--, argv++; argc; argc--, argv++) { if (argv[0][0] != '-') break; if (argv[0][1] == 'c') context = atoi(argv[0] + 2); } if (argc != 2) { fprintf(stderr, "Usage: cdiff old new\n"); exit(2); } old = argv[0]; new = argv[1]; oldfp = fopen(old, "r"); if (!oldfp) { fprintf(stderr, "Can't open %s\n", old); exit(2); } newfp = fopen(new, "r"); if (!newfp) { fprintf(stderr, "Can't open %s\n", new); exit(2); } /* Compute crcs by popen()ing crc and reading the output. Do this before * popen()ing diff to do the work. popen() attempts to support multiple * clients, but the 1.3-1.6.24b versions don't succeed. */ sprintf(sysbuf1, "crc %s", old); crcfp = popen(sysbuf1, "r"); if (!crcfp) { /* The only advantage of cdiff over diff is that it prints crcs, so * give up easily if crc fails. */ fprintf(stderr, "Can't execute crc %s\n", old); exit(2); } fgets(sysbuf1, sizeof(sysbuf1), crcfp); sysbuf1[CRC_END] = '\0'; status = pclose(crcfp); if (status != 0) { fprintf(stderr, "crc %s returned bad status %d\n", old, status); exit(2); } sprintf(sysbuf2, "crc %s", new); crcfp = popen(sysbuf2, "r"); if (!crcfp) { fprintf(stderr, "Can't execute crc %s\n", new); exit(2); } fgets(sysbuf2, sizeof(sysbuf2), crcfp); sysbuf2[CRC_END] = '\0'; status = pclose(crcfp); if (status != 0) { fprintf(stderr, "crc %s returned bad status %d\n", new, status); exit(2); } sprintf(buff, "diff %s %s 2>/dev/null", old, new); inputfp = popen(buff, "r"); if (!inputfp) { fprintf(stderr, "Can't execute diff %s %s\n", old, new); exit(2); } fstat(fileno(oldfp), &statbuf); printf("*** %s crc=%s\t%s", old, sysbuf1, ctime(&statbuf.st_mtime)); fstat(fileno(newfp), &statbuf); printf("--- %s crc=%s\t%s", new, sysbuf2, ctime(&statbuf.st_mtime)); preoldend = -1000; while (fgets(buff, sizeof buff, inputfp) != Nullch) { if (isdigit(*buff)) { oldmin = atoi(buff); for (s = buff; isdigit(*s); s++); if (*s == ',') { s++; oldmax = atoi(s); for (; isdigit(*s); s++); } else { oldmax = oldmin; } if (*s != 'a' && *s != 'd' && *s != 'c') { fprintf(stderr, "Unparseable input: %s\n", s); exit(2); } op = *s; s++; newmin = atoi(s); for (; isdigit(*s); s++); if (*s == ',') { s++; newmax = atoi(s); for (; isdigit(*s); s++); } else { newmax = newmin; } if (*s != '\n' && *s != ' ') { fprintf(stderr, "Unparseable input: %s\n", s); exit(2); } newmark = oldmark = "! "; if (op == 'a') { oldmin++; newmark = "+ "; } if (op == 'd') { newmin++; oldmark = "- "; } oldbeg = oldmin - context; oldend = oldmax + context; if (oldbeg < 1) oldbeg = 1; newbeg = newmin - context; newend = newmax + context; if (newbeg < 1) newbeg = 1; if (preoldend < oldbeg - 1) { if (preoldend >= 0) { dumphunk(); } preoldbeg = oldbeg; prenewbeg = newbeg; oldwanted = newwanted = 0; oldsize = newsize = 0; } else { /* we want to append to previous hunk */ oldbeg = preoldmax + 1; newbeg = prenewmax + 1; } for (i = oldbeg; i <= oldmax; i++) { line = getold(i); if (!line) { oldend = oldmax = i - 1; break; } len = strlen(line) + 2; if (oldsize + len + 1 >= oldalloc) { oldalloc *= 2; oldhunk = (char *) xrealloc(oldhunk, oldalloc); } if (i >= oldmin) { strcpy(oldhunk + oldsize, oldmark); oldwanted++; } else { strcpy(oldhunk + oldsize, " "); } strcpy(oldhunk + oldsize + 2, line); oldsize += len; } preoldmax = oldmax; preoldend = oldend; for (i = newbeg; i <= newmax; i++) { line = getnew(i); if (!line) { newend = newmax = i - 1; break; } len = strlen(line) + 2; if (newsize + len + 1 >= newalloc) { newalloc *= 2; newhunk = (char *) xrealloc(newhunk, newalloc); } if (i >= newmin) { strcpy(newhunk + newsize, newmark); newwanted++; } else { strcpy(newhunk + newsize, " "); } strcpy(newhunk + newsize + 2, line); newsize += len; } prenewmax = newmax; prenewend = newend; } } if (preoldend >= 0) { dumphunk(); } status = pclose(inputfp); if (!WIFEXITED(status)) exit(2); status = WEXITSTATUS(status); return(status == 0 || status == 1 ? status : 2); } void dumphunk() { int i; char *line; int len; for (i = preoldmax + 1; i <= preoldend; i++) { line = getold(i); if (!line) { preoldend = i - 1; break; } len = strlen(line) + 2; if (oldsize + len + 1 >= oldalloc) { oldalloc *= 2; oldhunk = (char *) xrealloc(oldhunk, oldalloc); } strcpy(oldhunk + oldsize, " "); strcpy(oldhunk + oldsize + 2, line); oldsize += len; } for (i = prenewmax + 1; i <= prenewend; i++) { line = getnew(i); if (!line) { prenewend = i - 1; break; } len = strlen(line) + 2; if (newsize + len + 1 >= newalloc) { newalloc *= 2; newhunk = (char *) xrealloc(newhunk, newalloc); } strcpy(newhunk + newsize, " "); strcpy(newhunk + newsize + 2, line); newsize += len; } printf("***************\n"); if (preoldbeg >= preoldend) { printf("*** %d ****\n", preoldend); } else { printf("*** %d,%d ****\n", preoldbeg, preoldend); } if (oldwanted) { printf("%s", oldhunk); } oldsize = 0; *oldhunk = '\0'; if (prenewbeg >= prenewend) { printf("--- %d ----\n", prenewend); } else { printf("--- %d,%d ----\n", prenewbeg, prenewend); } if (newwanted) { printf("%s", newhunk); } newsize = 0; *newhunk = '\0'; } char *getold(targ) int targ; { static int oldline = 0; while (fgets(buff, sizeof buff, oldfp) != Nullch) { oldline++; if (oldline == targ) return buff; } return Nullch; } char *getnew(targ) int targ; { static int newline = 0; while (fgets(buff, sizeof buff, newfp) != Nullch) { newline++; if (newline == targ) return buff; } return Nullch; } void *xmalloc(size) size_t size; { void *ptr; ptr = malloc(size); if (ptr == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(2); } return(ptr); } void *xrealloc(ptr, size) void *ptr; size_t size; { ptr = realloc(ptr, size); if (ptr == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(2); } return(ptr); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cgrep - grep and display context Author: Mark Mallet */ /* Nov 19 1984 Mark Mallett (mem@zinn.MV.COM) mem 860224 Modified to do r/e (regular expression) parsing on unix mem 860324 Added -f, -n; added code to number lines correctly on output. mem 870325 Added support for regcmp()/regex() style regular expression library; redid some conditionals to provide better mix'n'match. mem 870326 Don't try to print the filename if reading from stdin. Add -w option. Fix a small problem which occasionally allowed the separator to come out between adjacent lines of the file. mem 871119 Fix semantics of call to regcmp(): the NULL terminating the argument list was missing. It worked, but probably only due to some bizarre coincidence. dro 890109 Minor mods to compile under Minix */ #define OS_UNIX /* Define this for unix systems */ /* #define REGEX *//* Define this for re_comp/re_exec library */ #define REGCMP /* Define this to use regcmp/regex */ /* #define OS_CPM *//* Define this for CP/M-80 */ /* Don't touch these */ #define NOREGEXP /* Set this for no regular expression */ #ifdef REGEX #undef NOREGEXP #endif /* REGEX */ #ifdef REGCMP #undef NOREGEXP #endif /* REGCMP */ #ifdef OS_CPM #include "stdio.h" #include "ctype.h" #endif /* OS_CPM */ #ifdef OS_UNIX #include <sys/types.h> #include <sys/dir.h> /* Either here or in sys directory - dro */ #include <ctype.h> #include <limits.h> /* should have this - dro */ #include <regexp.h> /* should have this - dro */ #include <stdlib.h> #include <stdio.h> #endif /* OS_UNIX */ /* Local definitions */ #ifndef NULL #define NULL ((char *)0) #endif /* NULL */ #ifndef NUL #define NUL '\000' #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif /* Internal data declared global */ /* Internal routines */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void dosrch, (char *ifnm)); _PROTOTYPE(void shwlin, (char *fnm, int linnum, char *line)); _PROTOTYPE(int matlin, (char *line)); _PROTOTYPE(void regerror, (char *s)); /* External data */ /* Local data */ static int Debug = {FALSE}; /* Debug enabled flag */ static int Lcur = {0}; /* Current line (in Lines array) */ static char **Lines = {NULL}; /* Lines pointer array */ static int Linlen = {100}; /* Line length */ static int Lone = {0}; /* Line one (in Lines array) */ static int Nmr = {0}; /* Number of matched regions */ static char *Pat = {NULL}; /* Pattern */ static char Shwfile = {TRUE}; /* Show file name... */ static char Shwline = {TRUE}; /* Show line number */ static int Waft = {0}; /* Window after */ static int Wbef = {0}; /* Window before */ static int Wsiz = {0}; /* Window size */ regexp *Re; /* Result from reg compilation */ int main(argc, argv) int argc; /* Argument count */ char **argv; /* Argument values */ { int i; /* Scratch */ int n; /* Scratch again */ int c; /* A character */ char *aptr; /* Argument pointer */ int nf; /* number of files on command line */ nf = 0; /* No files on line */ for (i = 1; i < argc; i++) { /* Look at args */ if (argv[i][0] != '-') {/* If option */ if (Pat == NULL) { /* If no pattern yet given */ Pat = argv[i]; /* point here */ #ifdef REGEX if ((Re = re_comp(Pat)) != NULL) { fprintf(stderr, "cgrep: %s\n", re); exit(1); } #endif /* REGEX */ #ifdef REGCMP if ((Re = regcomp(Pat)) == NULL) { fprintf(stderr, "cgrep: error in regular expression.\n"); exit(1); } #endif /* REGCMP */ } else { /* This must be a file to search */ nf++; /* Count it */ dosrch(argv[i]); /* Search */ } } else { /* Option char */ c = argv[i][1]; /* Get option char */ if (isupper(c)) /* Trap idiot definition of tolower */ c = tolower(c); /* Don't care about case */ n = i; aptr = NULL; /* Find arg, if any */ if (argv[i][2] != NUL) { aptr = &argv[i][2]; n = i; /* Where to set i if we use this arg */ } else if (i < argc - 1) { /* use next.. */ n = i + 1; aptr = argv[n]; } switch (c) { /* Process the option */ case 'a': /* Lines after */ Waft = atoi(aptr); Lines = NULL; i = n; break; case 'b': /* Lines before */ Wbef = atoi(aptr); Lines = NULL; i = n; break; /* Disable debug output case 'd': Debug = TRUE; break; */ case 'f': /* Suppress filename on output */ Shwfile = FALSE; break; case 'l': /* Line length */ Linlen = atoi(aptr); Lines = NULL; i = n; break; case 'n': /* Suppress line number on output */ Shwline = FALSE; break; case 'w': /* Window: lines before and after */ Waft = Wbef = atoi(aptr); Lines = NULL; i = n; break; default: fprintf(stderr, "Invalid option %s\n", argv[i]); exit(1); } } } if (Pat == NULL) { /* If no pattern given */ fprintf(stderr, "Usage: cgrep [-a n] [-b n] [-f] [-l n] [-n] [-w n] pattern [filename... ]\n"); exit(1); } if (nf == 0) /* No files processed ? */ dosrch((char *)NULL); /* Do standard input */ return(0); } /* Dosrch (ifnm) Perform the search * Accepts : * * ifn Input file name * * * Returns : * * */ void dosrch(ifnm) char *ifnm; /* Input filelname */ { FILE *ifp; /* Input fp */ char *lptr; /* Line pointer */ int i; /* Scratch */ int prtaft; /* Print-after count */ int linnum; /* Line number */ int nlb; /* Number of lines buffered */ if (ifnm != NULL) { /* If file name given */ ifp = fopen(ifnm, "r"); /* Open it for read access */ if (ifp == NULL) { fprintf(stderr, "Can not open file %s\n", ifnm); return; } } else ifp = stdin; if (Lines == NULL) { /* If no line table allocated.. */ Wsiz = Wbef + 2; /* Determine total window size */ Lines = (char **) calloc((size_t)Wsiz, sizeof(char *)); /* Allocate pointer table */ for (i = 0; i < Wsiz; i++) /* Allocate line buffers */ Lines[i] = (char *) calloc((size_t)Linlen, sizeof(char)); } Lcur = Lone = 0; /* Setup line pointers */ nlb = 0; /* No lines buffered */ linnum = 0; /* Line number is zero */ prtaft = -(Wbef + 1); /* Make sure separator given first time */ for (;;) { /* Loop through the file */ lptr = Lines[Lcur]; /* Get pointer to current line */ if (++Lcur == Wsiz) /* Bump curr pointer and wrap */ Lcur = 0; /* if hit end */ if (Lone == Lcur) /* If wrapped to beginning of window */ if (++Lone == Wsiz) /* Bump beginning */ Lone = 0; /* and wrap if hit end */ if (fgets(lptr, Linlen, ifp) != lptr) break; /* if end of file */ linnum++; /* Count line number */ if (matlin(lptr)) { /* If matching line */ if (prtaft < (-Wbef)) /* Check for separator needed */ if ((Nmr++ > 0) && ((Wbef > 0) || (Waft > 0))) printf("----------------------------------------------------------------------------\n"); while (Lone != Lcur) { /* Until we close the window */ shwlin(ifnm, linnum - nlb, Lines[Lone]); /* Show the line */ if (++Lone == Wsiz) Lone = 0; nlb--; } nlb = 0; /* No lines buffered */ prtaft = Waft; /* Print n lines after */ } else { /* Didn't match */ if (prtaft-- > 0) { /* If must print lines after */ shwlin(ifnm, linnum, lptr); /* Show the line */ Lone = Lcur; /* Match pointers */ } else if (nlb < Wbef) /* Count lines buffered */ nlb++; } } if (ifnm != NULL) fclose(ifp); } /* Shwlin (fnm, linnum, line) Show a matching line * * Accepts : * * fnm File name * * linnum Line number * * line Line to show * * * Returns : * * */ void shwlin(fnm, linnum, line) char *fnm; /* File name */ int linnum; /* Line number */ char *line; /* Line (with newline at end) to print */ { if (Shwfile && (fnm != NULL)) printf("%s%s", fnm, Shwline ? " " : ":"); if (Shwline) printf("@%05d:", linnum); printf("%s", line); } /* Matlin (line) Perform match against pattern and line * * Accepts : * * line Address of line to match * * * Returns : * * <value> TRUE if match FALSE if not * * */ int matlin(line) char HM��JM��KM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*line; /* Line to match */ { int rtncode; /* Return value from this routine */ #ifdef NOREGEXP char *pptr, *lptr, *tlptr; int c1, c2; #endif /* NOREGEXP */ if (Debug) printf("Matching %s against %s", Pat, line); #ifdef REGEX rtncode = re_exec(line); /* Hand off to r/e evaluator */ #endif /* REGEX */ #ifdef REGCMP rtncode = (regexec(Re, line, TRUE) != 0); #endif /* REGCMP */ #ifdef NOREGEX /* Have to do menial comparison.. */ lptr = line; /* Init line pointer */ for (rtncode = -1; rtncode < 0;) { tlptr = lptr++; /* Get temp ptr to line */ pptr = Pat; /* Get ptr to pattern */ while (TRUE) { if ((c1 = *pptr++) == NUL) { rtncode = 1; /* GOOD return value */ break; } if ((c2 = *tlptr++) == NUL) { rtncode = 0; /* BAD return value */ break; } if (isupper(c1)) c1 = tolower(c1); if (isupper(c2)) c2 = tolower(c2); if (c1 != c2) break; } } #endif /* NOREGEX */ if (Debug) printf("matlin returned %s\n", rtncode ? "TRUE" : "FALSE"); return(rtncode); } void regerror(s) char *s; { printf("%s\n", s); exit(1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* chmem - set total memory size for execution Author: Andy Tanenbaum */ #include <minix/config.h> #include <sys/types.h> #include <a.out.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define MAX_8086 0x10000L /* maximum allocation size for 8086 */ #define MAX_386 0x7FFFFFFFL /* etc */ #define MAX_68K 0x7FFFFFFFL #define MAX_SPARC 0x20000000L /* No more than 512MB on a SparcStation! */ char *progname; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void error, (char *s1, char *s2)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { /* The 8088 architecture does not make it possible to catch stacks that grow * big. The only way to deal with this problem is to let the stack grow down * towards the data segment and the data segment grow up towards the stack. * Normally, a total of 64K is allocated for the two of them, but if the * programmer knows that a smaller amount is sufficient, he can change it * using chmem. * * chmem =4096 prog sets the total space for stack + data growth to 4096 * chmem +200 prog increments the total space for stack + data growth by 200 */ char *p; int fd, separate; size_t s; long lsize, olddynam, newdynam, newtot, overflow; struct exec exec; char cpu; long max; progname = argv[0]; if (argc < 3) usage(); p = argv[1]; if (*p != '=' && *p != '+' && *p != '-') usage(); lsize = atol(p + 1); s = sizeof(struct exec); if (lsize < 0) { error(p + 1, "is negative"); exit(1); } argc -= 1; argv += 1; while (--argc) { ++argv; fd = open(*argv, O_RDWR); if (fd < 0) { error("can't open", *argv); continue; } if (read(fd, (char *) &exec, s) != s) { error("can't read header in", *argv); continue; } if (BADMAG(exec)) { error(*argv, "is not executable"); continue; } separate = (exec.a_flags & A_SEP ? 1 : 0); cpu = exec.a_cpu; #if (CHIP == M68000) if (cpu == A_I8086) cpu = A_M68K; #endif switch (cpu) { case A_I8086: max = MAX_8086; break; case A_I80386: max = MAX_386; break; case A_M68K: max = MAX_68K; break; case A_SPARC: max = MAX_SPARC; break; default: error("bad CPU type in", *argv); continue; } if (lsize > max) { error("size is too large for", *argv); continue; } olddynam = exec.a_total - exec.a_data - exec.a_bss; if (separate == 0) olddynam -= exec.a_text; if (*p == '=') newdynam = lsize; else if (*p == '+') newdynam = olddynam + lsize; else if (*p == '-') newdynam = olddynam - lsize; newtot = exec.a_data + exec.a_bss + newdynam; if (separate == 0) newtot += exec.a_text; overflow = (newtot > max ? newtot - max : 0); newdynam -= overflow; newtot -= overflow; exec.a_total = newtot; lseek(fd, (long) 0, SEEK_SET); if (write(fd, (char *) &exec, s) != s) { error("can't modify", *argv); continue; } printf("%s: Stack+malloc area changed from %ld to %ld bytes.\n", *argv, olddynam, newdynam); close(fd); } return(0); } void error(s1, s2) char *s1; char *s2; { fprintf(stderr, "%s: %s ", progname, s1); if (errno != 0) perror(s2); else fprintf(stderr, "%s\n", s2); errno = 0; } void usage() { fprintf(stderr, "Usage: %s {=+-} amount file\n", progname); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* chmod - Change file modes Author: V. Archer */ /* Copyright 1991 by Vincent Archer * You may freely redistribute this software, in source or binary * form, provided that you do not alter this copyright mention in any * way. */ #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <errno.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> #include <stdio.h> #ifndef S_ISLNK #define S_ISLNK(mode) 0 #define lstat stat #endif #define USR_MODES (S_ISUID|S_IRWXU) #define GRP_MODES (S_ISGID|S_IRWXG) #define EXE_MODES (S_IXUSR|S_IXGRP|S_IXOTH) #ifdef S_ISVTX #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO|S_ISVTX) #else #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO) #endif /* Common variables */ char *symbolic; mode_t new_mode, u_mask; int rflag, errors; struct stat st; char path[PATH_MAX + 1]; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(mode_t parsemode, (char *symbolic, Mode_t oldmode)); _PROTOTYPE(int do_change, (char *name)); _PROTOTYPE(void usage, (void)); /* Parse a P1003.2 4.7.7-conformant symbolic mode. */ mode_t parsemode(symbolic, oldmode) char *symbolic; mode_t oldmode; { mode_t who, mask, newmode, tmpmask; char action; newmode = oldmode & ALL_MODES; while (*symbolic) { who = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'a') { who |= ALL_MODES; continue; } if (*symbolic == 'u') { who |= USR_MODES; continue; } if (*symbolic == 'g') { who |= GRP_MODES; continue; } if (*symbolic == 'o') { who |= S_IRWXO; continue; } break; } if (!*symbolic || *symbolic == ',') usage(); while (*symbolic) { if (*symbolic == ',') break; switch (*symbolic) { default: usage(); case '+': case '-': case '=': action = *symbolic++; } mask = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'u') { tmpmask = newmode & S_IRWXU; mask |= tmpmask | (tmpmask << 3) | (tmpmask << 6); symbolic++; break; } if (*symbolic == 'g') { tmpmask = newmode & S_IRWXG; mask |= tmpmask | (tmpmask >> 3) | (tmpmask << 3); symbolic++; break; } if (*symbolic == 'o') { tmpmask = newmode & S_IRWXO; mask |= tmpmask | (tmpmask >> 3) | (tmpmask >> 6); symbolic++; break; } if (*symbolic == 'r') { mask |= S_IRUSR | S_IRGRP | S_IROTH; continue; } if (*symbolic == 'w') { mask |= S_IWUSR | S_IWGRP | S_IWOTH; continue; } if (*symbolic == 'x') { mask |= EXE_MODES; continue; } if (*symbolic == 's') { mask |= S_ISUID | S_ISGID; continue; } if (*symbolic == 'X') { if (S_ISDIR(oldmode) || (oldmode & EXE_MODES)) mask |= EXE_MODES; continue; } #ifdef S_ISVTX if (*symbolic == 't') { mask |= S_ISVTX; who |= S_ISVTX; continue; } #endif break; } switch (action) { case '=': if (who) newmode &= ~who; else newmode = 0; case '+': if (who) newmode |= who & mask; else newmode |= mask & (~u_mask); break; case '-': if (who) newmode &= ~(who & mask); else newmode &= ~mask | u_mask; } } if (*symbolic) symbolic++; } return(newmode); } /* Main module. The single option possible (-R) does not warrant a call to * the getopt() stuff. */ int main(argc, argv) int argc; char *argv[]; { int ex_code = 0; argc--; argv++; if (argc && strcmp(*argv, "-R") == 0) { argc--; argv++; rflag = 1; } else rflag = 0; if (!argc--) usage(); if (!strcmp(argv[0], "--")) { /* Allow chmod -- -r, as in Draft11 example */ if (!argc--) usage(); argv++; } symbolic = *argv++; if (!argc) usage(); if (*symbolic >= '0' && *symbolic <= '7') { new_mode = 0; while (*symbolic >= '0' && *symbolic <= '7') new_mode = (new_mode << 3) | (*symbolic++ & 07); if (*symbolic) usage(); new_mode &= ALL_MODES; symbolic = (char *) 0; } else u_mask = umask(0); while (argc--) if (do_change(*argv++)) ex_code = 1; return(ex_code); } /* Apply a mode change to a given file system element. */ int do_change(name) char *name; { mode_t m; DIR *dirp; struct dirent *entp; char *namp; if (lstat(name, &st)) { perror(name); return(1); } if (S_ISLNK(st.st_mode) && rflag) return(0); /* Note: violates POSIX. */ if (!symbolic) m = new_mode; else m = parsemode(symbolic, st.st_mode); if (chmod(name, m)) { perror(name); errors = 1; } else errors = 0; if (S_ISDIR(st.st_mode) && rflag) { if (!(dirp = opendir(name))) { perror(name); return(1); } if (name != path) strcpy(path, name); namp = path + strlen(path); *namp++ = '/'; while (entp = readdir(dirp)) if (entp->d_name[0] != '.' || (entp->d_name[1] && (entp->d_name[1] != '.' || entp->d_name[2]))) { strcpy(namp, entp->d_name); errors |= do_change(path); } closedir(dirp); *--namp = '\0'; } return(errors); } /* Display Posix prototype */ void usage() { std_err("Usage: chmod [-R] mode file...\n"); exit(1); } ����������������������������������������������������������������/* chown/chgrp - Change file ownership Author: V. Archer */ /* Copyright 1991 by Vincent Archer * You may freely redistribute this software, in source or binary * form, provided that you do not alter this copyright mention in any * way. */ /* Changed 3 Feb 93 by Kees J. Bot: setuid execution nonsense removed. */ #include <sys/types.h> #include <sys/stat.h> #include <ctype.h> #include <dirent.h> #include <pwd.h> #include <grp.h> #include <string.h> #include <limits.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <minix/minlib.h> #include <stdio.h> #ifndef S_ISLNK #define S_ISLNK(mode) 0 #define lstat stat #endif #define S_IUGID (S_ISUID|S_ISGID) /* Global variables, such as flags and path names */ int gflag, oflag, rflag, error; char *pgmname, path[PATH_MAX + 1]; uid_t nuid; gid_t ngid; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void do_chown, (char *file)); _PROTOTYPE(void usage, (void)); /* Main module. If chown(1) is invoked as chgrp(1), the behaviour is nearly * identical, except that the default when a single name is given as an * argument is to take a group id rather than an user id. This allow the * non-Posix "chgrp user:group file". * The single option switch used by chown/chgrp (-R) does not warrant a * call to the getopt stuff. The two others flags (-g, -u) are set from * the program name and arguments. */ int main(argc, argv) int argc; char *argv[]; { char *id, *id2; struct group *grp; struct passwd *pwp; if (pgmname = strrchr(*argv, '/')) pgmname++; else pgmname = *argv; argc--; argv++; gflag = strcmp(pgmname, "chgrp"); if (argc && **argv == '-' && argv[0][1] == 'R') { argc--; argv++; rflag = 1; } if (argc < 2) usage(); id = *argv++; argc--; if (id2 = strchr(id, ':')) *id2++ = '\0'; if (!id2 && !gflag) { id2 = id; id = 0; } if (id) { if (isdigit(*id)) nuid = atoi(id); else { if (!(pwp = getpwnam(id))) { std_err(id); std_err(": unknown user name\n"); exit(1); } nuid = pwp->pw_uid; } oflag = 1; } else oflag = 0; if (id2) { if (isdigit(*id2)) ngid = atoi(id2); else { if (!(grp = getgrnam(id2))) { std_err(id2); std_err(": unknown group name\n"); exit(1); } ngid = grp->gr_gid; } gflag = 1; } else gflag = 0; error = 0; while (argc--) do_chown(*argv++); return(error); } /* Apply the user/group modification here. */ void do_chown(file) char *file; { DIR *dirp; struct dirent *entp; char *namp; struct stat st; if (lstat(file, &st)) { perror(file); error = 1; return; } if (S_ISLNK(st.st_mode) && rflag) return; /* Note: violates POSIX. */ if (chown(file, oflag ? nuid : st.st_uid, gflag ? ngid : st.st_gid)) { perror(file); error = 1; } if (S_ISDIR(st.st_mode) && rflag) { if (!(dirp = opendir(file))) { perror(file); error = 1; return; } if (path != file) strcpy(path, file); namp = path + strlen(path); *namp++ = '/'; while (entp = readdir(dirp)) if (entp->d_name[0] != '.' || (entp->d_name[1] && (entp->d_name[1] != '.' || entp->d_name[2]))) { strcpy(namp, entp->d_name); do_chown(path); } closedir(dirp); *--namp = '\0'; } } /* Posix prototype of the chown/chgrp function */ void usage() { std_err("Usage: "); std_err(pgmname); std_err(gflag ? " owner[:group]" : " [owner:]group"); std_err(" file...\n"); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ci - check in Author: Peter S. Housel 12/17/87 */ #include <sys/types.h> #include <string.h> #include <sys/stat.h> #include <pwd.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <fcntl.h> #include <sys/wait.h> #include <stdio.h> #define SUFFIX ",S" /* svc indicator */ #define SVCDIR "SVC" /* svc postfix indicator */ #define LINELEN 256 /* maximum line length */ #ifndef PATCH #define FIX "fix $1 Fix.$1 > New.$1; mv New.$1 $1\n" #else #define FIX "patch -n -s $1 < Fix.$1; rm -f $1.orig\n" #endif /* !PATCH */ #ifdef MAXPATHLEN #define PATHLEN MAXPATHLEN #else #define PATHLEN 128 /* buffer length for filenames */ #endif int unlocked = 0; /* leave unlocked after checkin */ int relock = 0; /* lock next revision after checkin */ char file[PATHLEN]; /* file to be checked in */ char svc[PATHLEN]; /* filename for svc file */ char newsvc[PATHLEN]; /* new copy of SVC file */ char line[LINELEN]; /* temporary line buffer */ char *p; /* scratch character pointer */ FILE *svcfp; /* svc file */ FILE *origfp, *newfp; /* "orig" and "new" temp files */ FILE *srcfp; /* source file */ int rev; /* new revision number */ int status; /* wait() buffer */ struct stat stb1, stb2; /* stat buffers for size compare */ char original[] = "/tmp/cioXXXXXX"; /* previous revision */ char diffout[] = "/tmp/cidXXXXXX"; /* diffs */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void rundiff, (void)); _PROTOTYPE(void logmsg, (FILE *fp)); _PROTOTYPE(void fname, (char *src, char *dst)); _PROTOTYPE(void svcname, (char *src, char *dst)); _PROTOTYPE(int lockcheck, (FILE *fp, int rev)); _PROTOTYPE(void onintr, (int dummy)); _PROTOTYPE(void clean, (void)); _PROTOTYPE(char *whoami, (void)); int main(argc, argv) int argc; char **argv; { #ifdef perprintf char errbuf[BUFSIZ]; setbuf(stderr, errbuf); perprintf(stderr); #endif while (++argv, --argc) { if ('-' == (*argv)[0]) { if ('u' == (*argv)[1]) ++unlocked; else if ('l' == (*argv)[1]) ++relock; else { fprintf(stderr, "ci: illegal option -%c\n", (*argv)[1]); exit(1); } } else break; } if (1 != argc) { fprintf(stderr, "ci: bad number of files arguments\n"); exit(1); } fname(*argv, file); svcname(file, svc); fprintf(stderr, "%s -> %s\n", file, svc); signal(SIGHUP, onintr); signal(SIGINT, onintr); signal(SIGTERM, onintr); #ifndef BSD if (NULL == (p = strrchr(file, '/'))) p = file; else ++p; if (strlen(p) > 13) { fprintf(stderr, "ci: filename %s is too long\n", p); exit(1); } #endif /* !BSD */ strcpy(newsvc, svc); *(strrchr(newsvc, ',')) = ';'; /* temporary file will be "file;S" */ if (NULL == (newfp = fopen(newsvc, "w"))) { perror("ci: can't create SVC temporary"); exit(1); } (void) mktemp(original); (void) mktemp(diffout); if (NULL != (svcfp = fopen(svc, "r"))) { /* does svc-file exist? */ fgets(line, LINELEN, svcfp); if (1 != sscanf(line, "# %d", &rev)) { fprintf(stderr, "ci: %s: illegal SVC file header\n", svc); exit(1); } ++rev; if (!lockcheck(svcfp, rev)) { fprintf(stderr, "Revision %d not locked\n", rev); clean(); exit(1); } if (NULL == (origfp = fopen(original, "w"))) { fprintf(stderr, "ci: can't create %s", original); perror(" "); } fgets(line, LINELEN, svcfp); /* skip "cat <<***MAIN-eof***" line */ while (NULL != fgets(line, LINELEN, svcfp) && strcmp(line, "***MAIN-eof***\n")) { fputs(line, origfp); if (ferror(origfp)) { perror("ci: origfile"); exit(1); } } fclose(origfp); rundiff(); if (0 != stat(original, &stb1) || 0 != stat(diffout, &stb2)) { perror("ci: can't stat original or diffout"); clean(); exit(1); } } else { /* no - create one */ rev = 1; } fprintf(newfp, "# %d\n", rev); fprintf(newfp, "cat <<***MAIN-eof*** >$1\n"); if (NULL == (srcfp = fopen(file, "r"))) { perror("ci: can't read source file"); clean(); exit(1); } while (NULL != fgets(line, LINELEN, srcfp)) fputs(line, newfp); fclose(srcfp); fputs("***MAIN-eof***\n", newfp); if (rev > 1) { fprintf(newfp, "if test $2 -ge %d ; then rm -f Fix.$1 ; exit 0 ; fi ; cat <<***%d-eof*** >Fix.$1\n", rev, rev); p = (stb1.st_size <= stb2.st_size) ? original : diffout; if (NULL == (origfp = fopen(p, "r"))) { perror("can't open diff output file"); clean(); exit(1); } while (NULL != fgets(line, LINELEN, origfp)) fputs(line, newfp); fclose(origfp); fprintf(newfp, "***%d-eof***\n", rev); fputs((original == p) ? "mv Fix.$1 $1\n" : FIX, newfp); logmsg(newfp); while (NULL != fgets(line, LINELEN, svcfp) && strncmp(line, "#***SVCLOCK***", (size_t)14)) fputs(line, newfp); } else { logmsg(newfp); fputs("rm -f Fix.$1\n", newfp); } if (relock) { fprintf(stderr, "(relocking into revision %d)\n", rev + 1); fprintf(newfp, "#***SVCLOCK*** %s %d\n", whoami(), rev + 1); } signal(SIGHUP, SIG_IGN); /* disable during critical section */ signal(SIGINT, SIG_IGN); if (ferror(newfp) || fclose(newfp) || ((rev > 1) && unlink(svc)) || link(newsvc, svc)) { fprintf(stderr, "SVC file write/link error - Checkin aborted\n"); clean(); exit(1); } else fprintf(stderr, "Checkin complete.\n"); if (stat(svc, &stb1) < 0 || chmod(svc, stb1.st_mode & 0555) < 0) perror("ci: can't chmod SVC file"); if (unlocked) { if (stat(file, &stb1) < 0 || chmod(file, stb1.st_mode & 0555) < 0) perror("ci: can't chmod source file"); } else if (relock) { if (stat(file, &stb1) < 0 || chmod(file, stb1.st_mode | 0200) < 0) perror("ci: can't chmod source file"); } else unlink(file); clean(); return(0); } void rundiff() { /* do "diff file original > diffout" */ int fd; /* redirected output file */ switch (fork()) { case -1: perror("ci: fork"); /* error */ clean(); exit(1); case 0: /* child */ if ((fd = creat(diffout, 0600)) < 0 || -1 == dup2(fd, 1)) { perror("ci: diffout"); clean(); exit(1); } close(fd); execlp("diff", "diff", file, original, (char *) 0); perror("ci: exec diff failed"); exit(1); default: break; /* parent */ } wait(&status); if (0 != status && 1 << 8 != status) { fprintf(stderr, "ci: bad return status (0x%x) from diff\n", status); clean(); exit(1); } } void logmsg(fp) FILE *fp; { long now; time(&now); fprintf(stderr, "Enter log message for revision %d (end with ^D or '.'):\n", rev); fprintf(fp, "#***SVC*** revision %d %s %s", rev, file, ctime(&now)); while (NULL != gets(line) && strcmp(line, ".")) fprintf(fp, "#***SVC*** %s\n", line); } void fname(src, dst) char *src, *dst; { char *p; strcpy(dst, src); p = &dst[strlen(src) - strlen(SUFFIX)]; if (!strcmp(p, SUFFIX)) *p = '\0'; } void svcname(src, dst) char *src, *dst; { char *p; strcpy(dst, src); strcat(dst, SUFFIX); if (0 != access(dst, 4)) { char dirname[PATHLEN]; if (NULL != (p = strrchr(src, '/'))) strncpy(dirname, src, (size_t)(p - src + 1)); else dirname[0] = '\0'; strcat(dirname, SVCDIR); if (0 == access(dirname, 1)) { strcpy(dst, dirname); if (NULL == p) { strcat(dst, "/"); strcat(dst, src); } else strcat(dst, p); strcat(dst, SUFFIX); } } } int lockcheck(fp, rev) FILE *fp; int rev; { char lock[40], check[40]; long pos; int ret; sprintf(lock, "#***SVCLOCK*** %s %d\n", whoami(), rev); pos = ftell(fp); fseek(fp, -((long) strlen(lock)), 2); fgets(check, 40, fp); ret = (0 == strcmp(lock, check)); fseek(fp, pos, 0); return ret; } void onintr(dummy) int dummy; /* to keep the compiler happy */ { fprintf(stderr, "Interrupt - Aborting checkin, cleaning up\n"); clean(); exit(1); } void clean() { if (strlen(original)) /* if only more programs made this check! */ unlink(original); if (strlen(diffout)) unlink(diffout); if (strlen(newsvc)) unlink(newsvc); } char *whoami() { struct passwd *pw; if (NULL != (pw = getpwuid(getuid()))) return pw->pw_name; else return "nobody"; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cksum.c - Display file checksums and block counts Author: V. Archer */ /* Copyright 1991 by Vincent Archer * You may freely redistribute this software, in source or binary * form, provided that you do not alter this copyright mention in any * way. */ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdio.h> int error; /* Table from P1003.2 (4.9/Fig 4.1). In fact, this table was taken from zmodem * and rewritten to look like the Draft 11 example. */ unsigned long crctab[] = { 0x7fffffff, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void crc, (int fd, char *name)); _PROTOTYPE(unsigned long strncrc, (unsigned char *b, int n, unsigned long s)); static int aux; /* Routine straight out of 4.9.10 */ unsigned long strncrc(b, n, s) register unsigned char *b; /* byte sequence to checksum */ register int n; /* length of sequence */ register unsigned long s; /* initial checksum value */ { register int i; while (n-- > 0) { /* Compute the index to the crc table */ i = (s >> 24) ^ ((unsigned int) (*b++)); if (i == 0) { /* Replace an intermediate zero with the next value * from the sequence */ i = aux++; if (aux >= sizeof(crctab) / sizeof(crctab[0])) aux = 0; } /* New checksum value */ s = (s << 8) ^ crctab[i]; } return(s); } /* Main module. No options switches allowed, none parsed. */ int main(argc, argv) int argc; char *argv[]; { argc--; error = 0; if (!argc) crc(0, (char *) 0); else for (argv++; argc--; argv++) crc(open(*argv, O_RDONLY), *argv); return(error); } /* Compute crc and size of input file descriptor. */ void crc(fd, name) int fd; char *name; { off_t f_size; unsigned long crc; int nb; unsigned char buffer[1024]; if (fd < 0) { perror(name); error = 1; return; } crc = 0; f_size = 0; aux = 0; for (;;) { nb = read(fd, (char *) buffer, sizeof(buffer)); if (nb < 0) { close(fd); perror(name ? name : "stdin"); error = 1; return; } if (!nb) break; f_size += nb; crc = strncrc(buffer, nb, crc); } close(fd); printf("%lu %ld", crc, f_size); if (name) printf(" %s\n", name); else putchar('\n'); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sysenv 1.0 - request system boot parameter Author: Kees J. Bot * 23 Dec 2000 */ #define nil ((void*)0) #include <sys/types.h> #include <sys/svrctl.h> #include <stdarg.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #define NIL ((char*)0) static void tell(int fd, ...) { va_list ap; char *s; va_start(ap, fd); while ((s= va_arg(ap, char *)) != NIL) { (void) write(fd, s, strlen(s)); } va_end(ap); } int main(int argc, char **argv) { struct sysgetenv sysgetenv; int i; int ex= 0; char *e; char val[1024]; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++]+1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ if (*opt != 0) { tell(2, "Usage: sysenv [name ...]\n", NIL); exit(1); } } do { if (i < argc) { sysgetenv.key= argv[i]; sysgetenv.keylen= strlen(sysgetenv.key) + 1; } else { sysgetenv.key= nil; sysgetenv.keylen= 0; } sysgetenv.val= val; sysgetenv.vallen= sizeof(val); if (svrctl(SYSGETENV, &sysgetenv) == -1) { if (errno == ESRCH) { ex |= 2; } else { ex |= 1; tell(2, "sysenv: ", strerror(errno), "\n", NIL); } continue; } e= sysgetenv.val; do { e += strlen(e); *e++ = '\n'; } while (i == argc && *e != 0); if (write(1, sysgetenv.val, e - sysgetenv.val) < 0) { ex |= 1; tell(2, "sysenv: ", strerror(errno), "\n", NIL); } } while (++i < argc); return ex; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cmp - compare two files Author: Kees J. Bot. */ #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <errno.h> _PROTOTYPE(void fatal, (char *label)); _PROTOTYPE(int cmp, (int fd1, int fd2)); _PROTOTYPE(void Usage, (void)); _PROTOTYPE(int main, (int argc, char **argv)); #define BLOCK 4096 static int loud = 0, silent = 0; static char *name1, *name2; int main(argc, argv) int argc; char **argv; { int fd1, fd2; /* Process the '-l' or '-s' option. */ while (argc > 1 && argv[1][0] == '-' && argv[1][1] != 0) { if (argv[1][2] != 0) Usage(); switch (argv[1][1]) { case '-': /* '--': no-op option. */ break; case 'l': loud = 1; break; case 's': silent = 1; break; default: Usage(); } argc--; argv++; } if (argc != 3) Usage(); /* Open the first file, '-' means standard input. */ if (argv[1][0] == '-' && argv[1][1] == 0) { name1 = "stdin"; fd1 = 0; } else { name1 = argv[1]; if ((fd1 = open(name1, 0)) < 0) fatal(name1); } /* Second file likewise. */ if (argv[2][0] == '-' && argv[2][1] == 0) { name2 = "stdin"; fd2 = 0; } else { name2 = argv[2]; if ((fd2 = open(name2, 0)) < 0) fatal(name2); } exit(cmp(fd1, fd2)); } int cmp(fd1, fd2) int fd1, fd2; { static char buf1[BLOCK], buf2[BLOCK]; int n1 = 0, n2 = 0, i1 = 0, i2 = 0, c1, c2; off_t pos = 0, line = 1; int eof = 0, differ = 0; for (;;) { if (i1 == n1) { pos += n1; if ((n1 = read(fd1, buf1, sizeof(buf1))) <= 0) { if (n1 < 0) fatal(name1); eof |= 1; } i1 = 0; } if (i2 == n2) { if ((n2 = read(fd2, buf2, sizeof(buf2))) <= 0) { if (n2 < 0) fatal(name2); eof |= 2; } i2 = 0; } if (eof != 0) break; c1 = buf1[i1++]; c2 = buf2[i2++]; if (c1 != c2) { if (!loud) { if (!silent) { printf("%s %s differ: char %ld, line %ld\n", name1, name2, pos + i1, line); } return(1); } printf("%10ld %3o %3o\n", pos + i1, c1 & 0xFF, c2 & 0xFF); differ = 1; } if (c1 == '\n') line++; } if (eof == (1 | 2)) return(differ); if (!silent) fprintf(stderr, "cmp: EOF on %s\n", eof == 1 ? name1 : name2); return(1); } void fatal(label) char *label; { if (!silent) fprintf(stderr, "cmp: %s: %s\n", label, strerror(errno)); exit(2); } void Usage() { fprintf(stderr, "Usage: cmp [-l | -s] file1 file2\n"); exit(2); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* co - check out Author: Peter S. Housel 12/24/87 */ #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <pwd.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define SUFFIX ",S" /* svc indicator */ #define SVCDIR "SVC" /* svc postfix indicator */ #define LINELEN 256 /* maximum line length */ #ifdef MAXPATHLEN #define PATHLEN MAXPATHLEN #else #define PATHLEN 128 /* buffer length for filenames */ #endif char file[PATHLEN]; /* file to be checked in */ char svc[PATHLEN]; /* filename for svc file */ char newsvc[PATHLEN]; /* new copy of SVC file */ char line[LINELEN]; /* temporary line buffer */ char *p; /* scratch character pointer */ FILE *svcfp; /* svc file */ int rev; /* old revision number */ int lastrev, lockrev; /* latest file revision, lock into */ int status; /* wait() buffer */ int svclock; /* lock the SVC file */ struct stat stb; /* stat() buffer */ char *base; /* basename of file */ char difftemp[PATHLEN]; /* extract() fix/patch input */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void fname, (char *src, char *dst)); _PROTOTYPE(void svcname, (char *src, char *dst)); _PROTOTYPE(void extract, (char *script, char *out, int rev)); _PROTOTYPE(char *basename, (char *name)); _PROTOTYPE(char *whoami, (void)); _PROTOTYPE(int getyn, (void)); int main(argc, argv) int argc; char **argv; { #ifdef perprintf char errbuf[BUFSIZ]; setbuf(stderr, errbuf); perprintf(stderr); #endif while (++argv, --argc) { if ('-' == (*argv)[0]) { if ('r' == (*argv)[1]) { --argc; rev = atoi(*++argv); if (rev < 1) { fprintf(stderr, "Illegal revision number\n"); exit(1); } } else if ('l' == (*argv)[1]) ++svclock; else { fprintf(stderr, "co: illegal option -%c\n", (*argv)[1]); exit(1); } } else break; } if (1 != argc) { fprintf(stderr, "co: bad number of files arguments\n"); exit(1); } fname(*argv, file); svcname(file, svc); fprintf(stderr, "%s -> %s\n", svc, base = basename(file)); if (NULL == (svcfp = fopen(svc, "r"))) { perror("co: can't read SVC file"); exit(1); } if (1 != fscanf(svcfp, "# %d", &lastrev) || lastrev < 1) { fprintf(stderr, "co: illegal SVC file format\n"); exit(1); } fclose(svcfp); if (stat(base, &stb) >= 0 && (stb.st_mode & 0222)) { fprintf(stderr, "Writable %s exists - overwrite (n/y)? ", base); if (!getyn()) { fprintf(stderr, "Checkout aborted\n"); exit(1); } } if (strlen(base)) unlink(base); if (0 == rev) rev = lastrev; fprintf(stderr, "Checking out revision %d", rev); extract(svc, base, rev); if (svclock) { lockrev = lastrev + 1; fprintf(stderr, "; Locking into revision %d\n", lockrev); if (stat(svc, &stb) < 0 || chmod(svc, stb.st_mode | 0200) < 0) perror("co: can't chmod SVC file"); if (stat(base, &stb) < 0 || chmod(base, stb.st_mode | 0200) < 0) perror("co: can't chmod source file"); if (NULL == (svcfp = fopen(svc, "a")) || (fprintf(svcfp, "#***SVCLOCK*** %s %d\n", whoami(), lockrev), ferror(svcfp))) { fprintf(stderr, "co: can't lock %s\n", svc); exit(1); } if (stat(svc, &stb) < 0 || chmod(svc, stb.st_mode & 0555)) perror("co: can't chmod SVC file"); } else { putchar('\n'); if (stat(base, &stb) < 0 || chmod(base, stb.st_mode & 0555)) perror("co: can't chmod source file"); } return(0); } void fname(src, dst) char *src, *dst; { char *p; strcpy(dst, src); p = &dst[strlen(src) - strlen(SUFFIX)]; if (!strcmp(p, SUFFIX)) *p = '\0'; } void svcname(src, dst) char *src, *dst; { char *p; strcpy(dst, src); strcat(dst, SUFFIX); if (0 != access(dst, 4)) { char dirname[PATHLEN]; if (NULL != (p = strrchr(src, '/'))) strncpy(dirname, src, (size_t)(p - src) + 1); else dirname[0] = '\0'; strcat(dirname, SVCDIR); if (0 == access(dirname, 1)) { strcpy(dst, dirname); if (NULL == p) { strcat(dst, "/"); strcat(dst, src); } else strcat(dst, p); strcat(dst, SUFFIX); } } } void extract(script, out, rev) char *script, *out; int rev; { FILE *outfp; int testrev; char buf[80]; sprintf(difftemp, "Fix.%s", out); svcfp = fopen(script, "r"); fgets(line, LINELEN, svcfp); /* skip '# rev' line */ fgets(line, LINELEN, svcfp); /* skip 'cat <***MAIN-eof***' line */ if (NULL == (outfp = fopen(out, "w"))) { perror("co: can't create output file"); return; } while (NULL != fgets(line, LINELEN, svcfp) && strcmp(line, "***MAIN-eof***\n")) fputs(line, outfp); fclose(outfp); while (NULL != fgets(line, LINELEN, svcfp)) { if (!strncmp(line, "if ", (size_t)3)) { sscanf(line, "if test $2 -ge %d", &testrev); if (rev >= testrev) { unlink(difftemp); return; } if (NULL == (outfp = fopen(difftemp, "w"))) { perror("co: can't create output file"); return; } sprintf(buf, "***%d-eof***\n", testrev); while (NULL != fgets(line, LINELEN, svcfp) && strcmp(line, buf)) fputs(line, outfp); fclose(outfp); } else if (!strncmp(line, "mv ", (size_t)3)) { sprintf(buf, "mv Fix.%s %s", out, out); system(buf); } else if (!strncmp(line, "fix ", (size_t)4)) { sprintf(buf, "fix %s Fix.%s > New.%s; mv New.%s %s", out, out, out, out, out); system(buf); } else if (!strncmp(line, "patch ", (size_t)6)) { sprintf(buf, "patch -n -s %s < Fix.%s; rm -f %s.orig", out, out, out); system(buf); } else { /* ignore */ } } unlink(difftemp); return; } char *basename(name) char *name; { char *p; if (NULL == (p = strrchr(name, '/'))) return name; else return p + 1; } char *whoami() { struct passwd *pw; if (NULL != (pw = getpwuid(getuid()))) return pw->pw_name; else return "nobody"; } int getyn() { char ans[10]; return(NULL != fgets(ans, 10, stdin)) && ('y' == ans[0] || 'Y' == ans[0]); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* comm - select lines from two sorted files Author: Martin C. Atkins */ /* * This program was written by: * Martin C. Atkins, * University of York, * Heslington, * York. Y01 5DD * England * and is released into the public domain, on the condition * that this comment is always included without alteration. */ #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> #include <stdio.h> #define BUFFER_SIZE (512) #define LINMAX (600) struct file { char *name; /* the file's name */ int fd; /* the file descripter */ char buf[BUFFER_SIZE]; /* buffer storage */ char *next; /* the next character to read */ char *endp; /* the first invalid character */ int seeneof; /* an end of file has been seen */ } files[2]; char lines[2][LINMAX]; int colflgs[3] = {1, 2, 3}; /* number of tabs + 1: 0 => no column */ static char *umsg = "Usage: comm [-[123]] file1 file2\n"; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void error, (char *s, char *f)); _PROTOTYPE(void eopen, (char *fn, struct file *file)); _PROTOTYPE(int getbuf, (struct file *file)); _PROTOTYPE(int readline, (int fno)); _PROTOTYPE(void comm, (void)); _PROTOTYPE(void putcol, (int col, char *buf)); _PROTOTYPE(void cpycol, (int col)); int main(argc, argv) int argc; char *argv[]; { int cnt; if (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { char *ap; for (ap = &argv[1][1]; *ap; ap++) switch (*ap) { case '1': case '2': case '3': cnt = *ap - '1'; if (colflgs[cnt] == 0) break; colflgs[cnt] = 0; for (cnt++; cnt < 3; cnt++) colflgs[cnt]--; break; default: usage(); } argc--; argv++; } if (argc != 3) usage(); eopen(argv[1], &files[0]); eopen(argv[2], &files[1]); comm(); return(0); } void usage() { std_err(umsg); exit(1); } void error(s, f) char *s, *f; { std_err("comm: "); std_err(s); if (f) std_err(f); std_err("\n"); exit(1); } void eopen(fn, file) char *fn; struct file *file; { file->name = fn; file->next = file->endp = &file->buf[0]; file->seeneof = 0; if (fn[0] == '-' && fn[1] == '\0') file->fd = 0; else if ((file->fd = open(fn, O_RDONLY)) < 0) error("can't open ", fn); } int getbuf(file) struct file *file; { /* Get a buffer-full from the file. Return true if no characters * were obtained because we are at end of file. */ int n; if (file->seeneof) return(1); if ((n = read(file->fd, &file->buf[0], BUFFER_SIZE)) < 0) error("read error on ", file->name); if (n == 0) { file->seeneof++; return 1; } file->next = &file->buf[0]; file->endp = &file->buf[n]; return(0); } int readline(fno) int fno; { /* Read up to the next '\n' character to buf. * Return a complete line, even if end of file occurs within a line. * Return false at end of file/ */ register struct file *file = &files[fno]; char *buf = lines[fno]; if (file->next == file->endp && getbuf(file)) return(0); while ((*buf++ = *file->next++) != '\n') if (file->next == file->endp && getbuf(file)) { *buf++ = '\n'; *buf = '\0'; return(1); } *buf = '\0'; return(1); } void comm() { register int res; if (!readline(0)) { cpycol(1); return; } if (!readline(1)) { putcol(0, lines[0]); cpycol(0); return; } for (;;) { if ((res = strcmp(lines[0], lines[1])) != 0) { res = res > 0; putcol(res, lines[res]); if (!readline(res)) { putcol(!res, lines[!res]); cpycol(!res); return; } } else { putcol(2, lines[0]); /* files[1]lin == f2lin */ if (!readline(0)) { cpycol(1); return; } if (!readline(1)) { putcol(0, lines[0]); cpycol(0); return; } } } /* NOTREACHED */ } void putcol(col, buf) int col; char *buf; { int cnt; if (colflgs[col] == 0) return; for (cnt = 0; cnt < colflgs[col] - 1; cnt++) printf("\t"); printf("%s", buf); } void cpycol(col) int col; { if (colflgs[col]) while (readline(col)) putcol(col, lines[col]); } ������������������������������������������������������������/* compress - Reduce file size using Modified Lempel-Ziv encoding */ /* * compress.c - File compression ala IEEE Computer, June 1984. * * Authors: Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) * Jim McKie (decvax!mcvax!jim) * Steve Davies (decvax!vax135!petsd!peora!srd) * Ken Turkowski (decvax!decwrl!turtlevax!ken) * James A. Woods (decvax!ihnp4!ames!jaw) * Joe Orost (decvax!vax135!petsd!joe) * * Richard Todd Port to MINIX * Andy Tanenbaum Cleanup * * * Algorithm from "A Technique for High Performance Data Compression", * Terry A. Welch, IEEE Computer Vol 17, No 6 (June 1984), pp 8-19. * * Usage: compress [-dfvc] [-b bits] [file ...] * Inputs: * -d: If given, decompression is done instead. * * -c: Write output on stdout. * * -b: Parameter limits the max number of bits/code. * * -f: Forces output file to be generated, even if one already * exists, and even if no space is saved by compressing. * If -f is not used, the user will be prompted if stdin is * a tty, otherwise, the output file will not be overwritten. * * -v: Write compression statistics * * file ...: Files to be compressed. If none specified, stdin * is used. * Outputs: * file.Z: Compressed form of file with same mode, owner, and utimes * or stdout (if stdin used as input) * * Assumptions: * When filenames are given, replaces with the compressed version * (.Z suffix) only if the file decreases in size. * Algorithm: * Modified Lempel-Ziv method (LZW). Basically finds common * substrings and replaces them with a variable size code. This is * deterministic, and can be done on the fly. Thus, the decompression * procedure needs no input table, but tracks the way the table was built. */ #define AZTEC86 1 #define min(a,b) ((a>b) ? b : a) /* * Set USERMEM to the maximum amount of physical user memory available * in bytes. USERMEM is used to determine the maximum BITS that can be used * for compression. * * SACREDMEM is the amount of physical memory saved for others; compress * will hog the rest. */ #ifndef SACREDMEM #define SACREDMEM 0 #endif #ifndef USERMEM # define USERMEM 450000 /* default user memory */ #endif #define REGISTER register #define DOTZ ".Z" #include <limits.h> /* The default for Minix is -b13, but we can do -b16 if the machine can. */ #define DEFAULTBITS 13 #if INT_MAX == 32767 # define BITS 13 #else # define BITS 16 #endif #ifdef USERMEM # if USERMEM >= (433484+SACREDMEM) # define PBITS 16 # else # if USERMEM >= (229600+SACREDMEM) # define PBITS 15 # else # if USERMEM >= (127536+SACREDMEM) # define PBITS 14 # else # if USERMEM >= (73464+SACREDMEM) # define PBITS 13 # else # define PBITS 12 # endif # endif # endif # endif # undef USERMEM #endif /* USERMEM */ #ifdef PBITS /* Preferred BITS for this memory size */ # ifndef BITS # define BITS PBITS # endif #endif /* PBITS */ #if BITS == 16 # define HSIZE 69001 /* 95% occupancy */ #endif #if BITS == 15 # define HSIZE 35023 /* 94% occupancy */ #endif #if BITS == 14 # define HSIZE 18013 /* 91% occupancy */ #endif #if BITS == 13 # define HSIZE 9001 /* 91% occupancy */ #endif #if BITS <= 12 # define HSIZE 5003 /* 80% occupancy */ #endif /* * a code_int must be able to hold 2**BITS values of type int, and also -1 */ #if BITS > 15 typedef long int code_int; #else typedef int code_int; #endif #ifdef SIGNED_COMPARE_SLOW typedef unsigned long int count_int; typedef unsigned short int count_short; #else typedef long int count_int; #endif #ifdef NO_UCHAR typedef char char_type; #else typedef unsigned char char_type; #endif /* UCHAR */ char_type magic_header[] = "\037\235"; /* 1F 9D */ /* Defines for third byte of header */ #define BIT_MASK 0x1f #define BLOCK_MASK 0x80 /* Masks 0x40 and 0x20 are free. I think 0x20 should mean that there is a fourth header byte (for expansion). */ #define INIT_BITS 9 /* initial number of bits/code */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <ctype.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <utime.h> #include <stdio.h> #define ARGVAL() (*++(*argv) || (--argc && *++argv)) int n_bits; /* number of bits/code */ int maxbits = DEFAULTBITS; /* user settable max # bits/code */ code_int maxcode; /* maximum code, given n_bits */ code_int maxmaxcode = 1 << BITS; /* should NEVER generate this code */ #ifdef COMPATIBLE /* But wrong! */ # define MAXCODE(n_bits) (1 << (n_bits) - 1) #else # define MAXCODE(n_bits) ((1 << (n_bits)) - 1) #endif /* COMPATIBLE */ #ifndef AZTEC86 count_int htab [HSIZE]; unsigned short codetab [HSIZE]; #else count_int *htab; unsigned short *codetab; # define HTABSIZE ((size_t)(HSIZE*sizeof(count_int))) # define CODETABSIZE ((size_t)(HSIZE*sizeof(unsigned short))) #define htabof(i) htab[i] #define codetabof(i) codetab[i] #endif /* XENIX_16 */ code_int hsize = HSIZE; /* for dynamic table sizing */ count_int fsize; /* * To save much memory, we overlay the table used by compress() with those * used by decompress(). The tab_prefix table is the same size and type * as the codetab. The tab_suffix table needs 2**BITS characters. We * get this from the beginning of htab. The output stack uses the rest * of htab, and contains characters. There is plenty of room for any * possible stack (stack used to be 8000 characters). */ #define tab_prefixof(i) codetabof(i) #ifdef XENIX_16 # define tab_suffixof(i) ((char_type *)htab[(i)>>15])[(i) & 0x7fff] # define de_stack ((char_type *)(htab2)) #else /* Normal machine */ # define tab_suffixof(i) ((char_type *)(htab))[i] # define de_stack ((char_type *)&tab_suffixof(1<<BITS)) #endif /* XENIX_16 */ code_int free_ent = 0; /* first unused entry */ int exit_stat = 0; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Usage, (void)); _PROTOTYPE(void compress, (void)); _PROTOTYPE(void onintr, (int dummy)); _PROTOTYPE(void oops, (int dummy)); _PROTOTYPE(void output, (code_int code)); _PROTOTYPE(int foreground, (void)); _PROTOTYPE(void decompress, (void)); _PROTOTYPE(code_int getcode, (void)); _PROTOTYPE(void writeerr, (void)); _PROTOTYPE(void copystat, (char *ifname, char *ofname)); _PROTOTYPE(int foreground, (void)); _PROTOTYPE(void cl_block , (void)); _PROTOTYPE(void cl_hash, (count_int hsize)); _PROTOTYPE(void prratio, (FILE *stream, long int num, long int den)); _PROTOTYPE(void version, (void)); void Usage() { #ifdef DEBUG fprintf(stderr,"Usage: compress [-dDVfc] [-b maxbits] [file ...]\n"); } int debug = 0; #else fprintf(stderr,"Usage: compress [-dfvcV] [-b maxbits] [file ...]\n"); } #endif /* DEBUG */ int nomagic = 0; /* Use a 3-byte magic number header, unless old file */ int zcat_flg = 0; /* Write output on stdout, suppress messages */ int quiet = 0; /* don't tell me about compression */ /* * block compression parameters -- after all codes are used up, * and compression rate changes, start over. */ int block_compress = BLOCK_MASK; int clear_flg = 0; long int ratio = 0; #define CHECK_GAP 10000 /* ratio check interval */ count_int checkpoint = CHECK_GAP; /* * the next two codes should not be changed lightly, as they must not * lie within the contiguous general code space. */ #define FIRST 257 /* first free entry */ #define CLEAR 256 /* table clear output code */ int force = 0; char ofname [100]; #ifdef DEBUG int verbose = 0; #endif /* DEBUG */ #ifndef METAWARE #ifdef AZTEC86 void #else int #endif #ifndef __STDC__ (*bgnd_flag)(); #else (*bgnd_flag)(int); #endif #endif int do_decomp = 0; int main(argc, argv) int argc; char **argv; { int overwrite = 0; /* Do not overwrite unless given -f flag */ char tempname[100]; char **filelist, **fileptr; char *cp; struct stat statbuf; #ifndef METAWARE if ( (bgnd_flag = signal ( SIGINT, SIG_IGN )) != SIG_IGN ) { signal ( SIGINT, onintr ); signal ( SIGSEGV, oops ); } #endif #ifdef AZTEC86 #ifdef METAWARE _setmode(NULL,_ALL_FILES_BINARY); _setmode(stdin,_BINARY); _setmode(stdout,_BINARY); _setmode(stderr,_TEXT); #endif if (NULL == ~M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(htab = (count_int *)malloc(HTABSIZE))) { fprintf(stderr,"Can't allocate htab\n"); exit(1); } if (NULL == (codetab = (unsigned short *)malloc(CODETABSIZE))) { fprintf(stderr,"Can't allocate codetab\n"); exit(1); } #endif #ifdef COMPATIBLE nomagic = 1; /* Original didn't have a magic number */ #endif /* COMPATIBLE */ filelist = fileptr = (char **)(malloc((size_t)(argc * sizeof(*argv)))); *filelist = NULL; if((cp = strrchr(argv[0], '/')) != 0) { cp++; } else { cp = argv[0]; } if(strcmp(cp, "uncompress") == 0) { do_decomp = 1; } else if(strcmp(cp, "zcat") == 0) { do_decomp = 1; zcat_flg = 1; } #ifdef BSD4_2 /* 4.2BSD dependent - take it out if not */ setlinebuf( stderr ); #endif /* BSD4_2 */ /* Argument Processing * All flags are optional. * -D => debug * -V => print Version; debug verbose * -d => do_decomp * -v => unquiet * -f => force overwrite of output file * -n => no header: useful to uncompress old files * -b maxbits => maxbits. If -b is specified, then maxbits MUST be * given also. * -c => cat all output to stdout * -C => generate output compatible with compress 2.0. * if a string is left, must be an input filename. */ for (argc--, argv++; argc > 0; argc--, argv++) { if (**argv == '-') { /* A flag argument */ while (*++(*argv)) { /* Process all flags in this arg */ switch (**argv) { #ifdef DEBUG case 'D': debug = 1; break; case 'V': verbose = 1; version(); break; #else case 'V': version(); break; #endif /* DEBUG */ case 'v': quiet = 0; break; case 'd': do_decomp = 1; break; case 'f': case 'F': overwrite = 1; force = 1; break; case 'n': nomagic = 1; break; case 'C': block_compress = 0; break; case 'b': if (!ARGVAL()) { fprintf(stderr, "Missing maxbits\n"); Usage(); exit(1); } maxbits = atoi(*argv); goto nextarg; case 'c': zcat_flg = 1; break; case 'q': quiet = 1; break; default: fprintf(stderr, "Unknown flag: '%c'; ", **argv); Usage(); exit(1); } } } else { /* Input file name */ *fileptr++ = *argv; /* Build input file list */ *fileptr = NULL; /* process nextarg; */ } nextarg: continue; } if(maxbits < INIT_BITS) maxbits = INIT_BITS; if (maxbits > BITS) maxbits = BITS; maxmaxcode = 1 << maxbits; if (*filelist != NULL) { for (fileptr = filelist; *fileptr; fileptr++) { exit_stat = 0; if (do_decomp != 0) { /* DECOMPRESSION */ /* Check for .Z suffix */ #ifndef PCDOS if (strcmp(*fileptr + strlen(*fileptr) - 2, DOTZ) != 0) #else if (strcmp(*fileptr + strlen(*fileptr) - 1, DOTZ) != 0) #endif { /* No .Z: tack one on */ strcpy(tempname, *fileptr); #ifndef PCDOS strcat(tempname, DOTZ); #else /* either tack one on or replace last character */ { char *dot; if (NULL == (dot = strchr(tempname,'.'))) { strcat(tempname,".Z"); } else /* if there is a dot then either tack a z on or replace last character */ { if (strlen(dot) < 4) strcat(tempname,DOTZ); else dot[3] = 'Z'; } } #endif *fileptr = tempname; } /* Open input file */ if ((freopen(*fileptr, "r", stdin)) == NULL) { perror(*fileptr); continue; } /* Check the magic number */ if (nomagic == 0) { unsigned magic1, magic2; if (((magic1 = getc(stdin)) != (magic_header[0] & 0xFF)) || ((magic2 = getc(stdin)) != (magic_header[1] & 0xFF))) { fprintf(stderr, "%s: not in compressed format %x %x\n", *fileptr,magic1,magic2); continue; } maxbits = getc(stdin); /* set -b from file */ block_compress = maxbits & BLOCK_MASK; maxbits &= BIT_MASK; maxmaxcode = 1 << maxbits; if(maxbits > BITS) { fprintf(stderr, "%s: compressed with %d bits, can only handle %d bits\n", *fileptr, maxbits, BITS); continue; } } /* Generate output filename */ strcpy(ofname, *fileptr); #ifndef PCDOS ofname[strlen(*fileptr) - 2] = '\0'; /* Strip off .Z */ #else /* kludge to handle various common three character extension */ { char *dot; char fixup = '\0'; /* first off, map name to upper case */ for (dot = ofname; *dot; dot++) *dot = toupper(*dot); if (NULL == (dot = strchr(ofname,'.'))) { fprintf(stderr,"Bad filename %s\n",ofname); exit(1); } if (strlen(dot) == 4) /* we got three letter extensions */ { if (strcmp(dot,".EXZ") == 0) fixup = 'E'; else if (strcmp(dot,".COZ") == 0) fixup = 'M'; else if (strcmp(dot,".BAZ") == 0) fixup = 'S'; else if (strcmp(dot,".OBZ") == 0) fixup = 'J'; else if (strcmp(dot,".SYZ") == 0) fixup = 'S'; else if (strcmp(dot,".DOZ") == 0) fixup = 'C'; } /* replace the Z */ ofname[strlen(*fileptr) - 1] = fixup; } #endif } else { /* COMPRESSION */ if (strcmp(*fileptr + strlen(*fileptr) - 2, DOTZ) == 0) { fprintf(stderr, "%s: already has .Z suffix -- no change\n", *fileptr); continue; } /* Open input file */ if ((freopen(*fileptr, "r", stdin)) == NULL) { perror(*fileptr); continue; } (void)stat( *fileptr, &statbuf ); fsize = (long) statbuf.st_size; /* * tune hash table size for small files -- ad hoc, * but the sizes match earlier #defines, which * serve as upper bounds on the number of output codes. */ hsize = HSIZE; /*lint -e506 -e712 */ if ( fsize < (1 << 12) ) hsize = min ( 5003, HSIZE ); else if ( fsize < (1 << 13) ) hsize = min ( 9001, HSIZE ); else if ( fsize < (1 << 14) ) hsize = min ( 18013, HSIZE ); else if ( fsize < (1 << 15) ) hsize = min ( 35023, HSIZE ); else if ( fsize < 47000 ) hsize = min ( 50021, HSIZE ); /*lint +e506 +e712 */ /* Generate output filename */ strcpy(ofname, *fileptr); #ifndef BSD4_2 /* Short filenames */ if ((cp=strrchr(ofname,'/')) != NULL) cp++; else cp = ofname; if (strlen(cp) > 12) { fprintf(stderr,"%s: filename too long to tack on .Z\n",cp); continue; } #ifdef PCDOS else { /* either tack one on or replace last character */ char *dot; if (NULL == (dot = strchr(cp,'.'))) { strcat(cp,".Z"); } else /* if there is a dot then either tack a z on or replace last character */ { if (strlen(dot) < 4) strcat(cp,DOTZ); else dot[3] = 'Z'; } } #endif #endif /* BSD4_2 Long filenames allowed */ #ifndef PCDOS /* PCDOS takes care of this above */ strcat(ofname, DOTZ); #endif } /* Check for overwrite of existing file */ if (overwrite == 0 && zcat_flg == 0) { if (stat(ofname, &statbuf) == 0) { char response[2]; int fd; response[0] = 'n'; fprintf(stderr, "%s already exists;", ofname); if (foreground()) { fd = open("/dev/tty", O_RDONLY); fprintf(stderr, " do you wish to overwrite %s (y or n)? ", ofname); fflush(stderr); (void)read(fd, response, 2); while (response[1] != '\n') { if (read(fd, response+1, 1) < 0) { /* Ack! */ perror("stderr"); break; } } close(fd); } if (response[0] != 'y') { fprintf(stderr, "\tnot overwritten\n"); continue; } } } if(zcat_flg == 0) { /* Open output file */ if (freopen(ofname, "w", stdout) == NULL) { perror(ofname); continue; } if(!quiet) fprintf(stderr, "%s: ", *fileptr); } /* Actually do the compression/decompression */ if (do_decomp == 0) compress(); #ifndef DEBUG else decompress(); #else else if (debug == 0) decompress(); else printcodes(); if (verbose) dump_tab(); #endif /* DEBUG */ if(zcat_flg == 0) { copystat(*fileptr, ofname); /* Copy stats */ if((exit_stat == 1) || (!quiet)) putc('\n', stderr); } } } else { /* Standard input */ if (do_decomp == 0) { compress(); #ifdef DEBUG if(verbose) dump_tab(); #endif /* DEBUG */ if(!quiet) putc('\n', stderr); } else { /* Check the magic number */ if (nomagic == 0) { if ((getc(stdin)!=(magic_header[0] & 0xFF)) || (getc(stdin)!=(magic_header[1] & 0xFF))) { fprintf(stderr, "stdin: not in compressed format\n"); exit(1); } maxbits = getc(stdin); /* set -b from file */ block_compress = maxbits & BLOCK_MASK; maxbits &= BIT_MASK; maxmaxcode = 1 << maxbits; fsize = 100000; /* assume stdin large for USERMEM */ if(maxbits > BITS) { fprintf(stderr, "stdin: compressed with %d bits, can only handle %d bits\n", maxbits, BITS); exit(1); } } #ifndef DEBUG decompress(); #else if (debug == 0) decompress(); else printcodes(); if (verbose) dump_tab(); #endif /* DEBUG */ } } return(exit_stat); } static int offset; long int in_count = 1; /* length of input */ long int bytes_out; /* length of compressed output */ long int out_count = 0; /* # of codes output (for debugging) */ /* * compress stdin to stdout * * Algorithm: use open addressing double hashing (no chaining) on the * prefix code / next character combination. We do a variant of Knuth's * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime * secondary probe. Here, the modular division first probe is gives way * to a faster exclusive-or manipulation. Also do block compression with * an adaptive reset, whereby the code table is cleared when the compression * ratio decreases, but after the table fills. The variable-length output * codes are re-sized at this point, and a special CLEAR code is generated * for the decompressor. Late addition: construct the table according to * file size for noticeable speed improvement on small files. Please direct * questions about this implementation to ames!jaw. */ void compress() { REGISTER long fcode; REGISTER code_int i = 0; REGISTER int c; REGISTER code_int ent; #ifdef XENIX_16 REGISTER code_int disp; #else /* Normal machine */ REGISTER int disp; #endif REGISTER code_int hsize_reg; REGISTER int hshift; #ifndef COMPATIBLE if (nomagic == 0) { putc(magic_header[0],stdout); putc(magic_header[1],stdout); putc((char)(maxbits | block_compress),stdout); if(ferror(stdout)) writeerr(); } #endif /* COMPATIBLE */ offset = 0; bytes_out = 3; /* includes 3-byte header mojo */ out_count = 0; clear_flg = 0; ratio = 0; in_count = 1; checkpoint = CHECK_GAP; maxcode = MAXCODE(n_bits = INIT_BITS); free_ent = ((block_compress) ? FIRST : 256 ); ent = getc(stdin); hshift = 0; for ( fcode = (long) hsize; fcode < 65536L; fcode *= 2L ) hshift++; hshift = 8 - hshift; /* set hash code range bound */ hsize_reg = hsize; cl_hash( (count_int) hsize_reg); /* clear hash table */ #ifdef SIGNED_COMPARE_SLOW while ( (c = getc(stdin)) != (unsigned) EOF ) #else while ( (c = getc(stdin)) != EOF ) #endif { in_count++; fcode = (long) (((long) c << maxbits) + ent); i = ((c << hshift) ^ ent); /* xor hashing */ if ( htabof (i) == fcode ) { ent = codetabof (i); continue; } else if ( (long)htabof (i) < 0 ) /* empty slot */ goto nomatch; disp = hsize_reg - i; /* secondary hash (after G. Knott) */ if ( i == 0 ) disp = 1; probe: if ( (i -= disp) < 0 ) i += hsize_reg; if ( htabof (i) == fcode ) { ent = codetabof (i); continue; } if ( (long)htabof (i) > 0 ) goto probe; nomatch: output ( (code_int) ent ); out_count++; ent = c; #ifdef SIGNED_COMPARE_SLOW if ( (unsigned) free_ent < (unsigned) maxmaxcode) #else if ( free_ent < maxmaxcode ) #endif { codetabof (i) = free_ent++; /* code -> hashtable */ htabof (i) = fcode; } else if ( (count_int)in_count >= checkpoint && block_compress ) cl_block (); } /* * Put out the final code. */ output( (code_int)ent ); out_count++; output( (code_int)-1 ); /* * Print out stats on stderr */ if(zcat_flg == 0 && !quiet) { #ifdef DEBUG fprintf( stderr, "%ld chars in, %ld codes (%ld bytes) out, compression factor: ", in_count, out_count, bytes_out ); prratio( stderr, in_count, bytes_out ); fprintf( stderr, "\n"); fprintf( stderr, "\tCompression as in compact: " ); prratio( stderr, in_count-bytes_out, in_count ); fprintf( stderr, "\n"); fprintf( stderr, "\tLargest code (of last block) was %d (%d bits)\n", free_ent - 1, n_bits ); #else /* !DEBUG */ fprintf( stderr, "Compression: " ); prratio( stderr, in_count-bytes_out, in_count ); #endif /* DEBUG */ } if(bytes_out > in_count) /* exit(2) if no savings */ exit_stat = 2; return; } /***************************************************************** * TAG( output ) * * Output the given code. * Inputs: * code: A n_bits-bit integer. If == -1, then EOF. This assumes * that n_bits =< (long)wordsize - 1. * Outputs: * Outputs code to the file. * Assumptions: * Chars are 8 bits long. * Algorithm: * Maintain a BITS character long buffer (so that 8 codes will * fit in it exactly). Use the VAX insv instruction to insert each * code in turn. When the buffer fills up empty it and start over. */ static char buf[BITS]; #ifndef vax char_type lmask[9] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00}; char_type rmask[9] = {0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff}; #endif /* vax */ void output( code ) code_int code; { #ifdef DEBUG static int col = 0; #endif /* DEBUG */ /* * On the VAX, it is important to have the REGISTER declarations * in exactly the order given, or the asm will break. */ REGISTER int r_off = offset, bits= n_bits; REGISTER char * bp = buf; #ifndef BREAKHIGHC #ifdef METAWARE int temp; #endif #endif #ifdef DEBUG if ( verbose ) fprintf( stderr, "%5d%c", code, (col+=6) >= 74 ? (col = 0, '\n') : ' ' ); #endif /* DEBUG */ if ( code >= 0 ) { #ifdef vax /* VAX DEPENDENT!! Implementation on other machines is below. * * Translation: Insert BITS bits from the argument starting at * offset bits from the beginning of buf. */ 0; /* Work around for pcc -O bug with asm and if stmt */ asm( "insv 4(ap),r11,r10,(r9)" ); #else /* not a vax */ /* * byte/bit numbering on the VAX is simulated by the following code */ /* * Get to the first byte. */ bp += (r_off >> 3); r_off &= 7; /* * Since code is always >= 8 bits, only need to mask the first * hunk on the left. */ #ifndef BREAKHIGHC #ifdef METAWARE *bp &= rmask[r_off]; temp = (code << r_off) & lmask[r_off]; *bp |= temp; #else *bp = (*bp & rmask[r_off]) | ((code << r_off) & lmask[r_off]); #endif #else *bp = (*bp & rmask[r_off]) | ((code << r_off) & lmask[r_off]); #endif bp++; bits -= (8 - r_off); code >>= (8 - r_off); /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */ if ( bits >= 8 ) { *bp++ = code; code >>= 8; bits -= 8; } /* Last bits. */ if(bits) *bp = code; #endif /* vax */ offset += n_bits; if ( offset == (n_bits << 3) ) { bp = buf; bits = n_bits; bytes_out += bits; do putc(*bp++,stdout); while(--bits); offset = 0; } /* * If the next entry is going to be too big for the code size, * then increase it, if possible. */ if ( free_ent > maxcode || (clear_flg > 0)) { /* * Write the whole buffer, because the input side won't * discover the size increase until after it has read it. */ if ( offset > 0 ) { if( fwrite( buf, (size_t)1, (size_t)n_bits, stdout ) != n_bits) writeerr(); bytes_out += n_bits; } offset = 0; if ( clear_flg ) { maxcode = MAXCODE (n_bits = INIT_BITS); clear_flg = 0; } else { n_bits++; if ( n_bits == maxbits ) maxcode = maxmaxcode; else maxcode = MAXCODE(n_bits); } #ifdef DEBUG if ( debug ) { fprintf( stderr, "\nChange to %d bits\n", n_bits ); col = 0; } #endif /* DEBUG */ } } else { /* * At EOF, write the rest of the buffer. */ if ( offset > 0 ) fwrite( buf, (size_t)1, (size_t)(offset + 7) / 8, stdout ); bytes_out += (offset + 7) / 8; offset = 0; fflush( stdout ); #ifdef DEBUG if ( verbose ) fprintf( stderr, "\n" ); #endif /* DEBUG */ if( ferror( stdout ) ) writeerr(); } } /* * Decompress stdin to stdout. This routine adapts to the codes in the * file building the "string" table on-the-fly; requiring no table to * be stored in the compressed file. The tables used herein are shared * with those of the compress() routine. See the definitions above. */ void decompress() { REGISTER char_type *stackp; REGISTER int finchar; REGISTER code_int code, oldcode, incode; /* * As above, initialize the first 256 entries in the table. */ maxcode = MAXCODE(n_bits = INIT_BITS); for ( code = 255; code >= 0; code-- ) { tab_prefixof(code) = 0; tab_suffixof(code) = (char_type)code; } free_ent = ((block_compress) ? FIRST : 256 ); finchar = oldcode = getcode(); if(oldcode == -1) /* EOF already? */ return; /* Get out of here */ putc( (char)finchar,stdout ); /* first code must be 8 bits = char */ if(ferror(stdout)) /* Crash if can't write */ writeerr(); stackp = de_stack; while ( (code = getcode()) > -1 ) { if ( (code == CLEAR) && block_compress ) { for ( code = 255; code >= 0; code-- ) tab_prefixof(code) = 0; clear_flg = 1; free_ent = FIRST - 1; if ( (code = getcode ()) == -1 ) /* O, untimely death! */ break; } incode = code; /* * Special case for KwKwK string. */ if ( code >= free_ent ) { *stackp++ = finchar; code = oldcode; } /* * Generate output characters in reverse order */ #ifdef SIGNED_COMPARE_SLOW while ( ((unsigned long)code) >= ((unsigned long)256) ) { #else while ( code >= 256 ) { #endif *stackp++ = tab_suffixof(code); code = tab_prefixof(code); } *stackp++ = finchar = tab_suffixof(code); /* * And put them out in forward order */ do putc ( *--stackp ,stdout); while ( stackp > de_stack ); /* * Generate the new entry. */ if ( (code=free_ent) < maxmaxcode ) { tab_prefixof(code) = (unsigned short)oldcode; tab_suffixof(code) = finchar; free_ent = code+1; } /* * Remember previous code. */ oldcode = incode; } fflush( stdout ); if(ferror(stdout)) writeerr(); } /***************************************************************** * TAG( getcode ) * * Read one code from the standard input. If EOF, return -1. * Inputs: * stdin * Outputs: * code or -1 is returned. */ code_int getcode() { /* * On the VAX, it is important to have the REGISTER declarations * in exactly the order given, or the asm will break. */ REGISTER code_int code; static int offset = 0, size = 0; static char_type buf[BITS]; REGISTER int r_off, bits; REGISTER char_type *bp = buf; if ( clear_flg > 0 || offset >= size || free_ent > maxcode ) { /* * If the next entry will be too big for the current code * size, then we must increase the size. This implies reading * a new buffer full, too. */ if ( free_ent > maxcode ) { n_bits++; if ( n_bits == maxbits ) maxcode = maxmaxcode; /* won't get any bigger now */ else maxcode = MAXCODE(n_bits); } if ( clear_flg > 0) { maxcode = MAXCODE (n_bits = INIT_BITS); clear_flg = 0; } size = fread( buf, (size_t)1, (size_t)n_bits, stdin ); if ( size <= 0 ) return -1; /* end of file */ offset = 0; /* Round size down to integral number of codes */ size = (size << 3) - (n_bits - 1); } r_off = offset; bits = n_bits; #ifdef vax asm( "extzv r10,r9,(r8),r11" ); #else /* not a vax */ /* * Get to the first byte. */ bp += (r_off >> 3); r_off &= 7; /* Get first part (low order bits) */ #ifdef NO_UCHAR code = ((*bp++ >> r_off) & rmask[8 - r_off]) & 0xff; #else code = (*bp++ >> r_off); #endif /* NO_UCHAR */ bits -= (8 - r_off); r_off = 8 - r_off; /* now, offset into code word */ /* Get any 8 bit parts in the middle (<=1 for up to 16 bits). */ if ( bits >= 8 ) { #ifdef NO_UCHAR code |= (*bp++ & 0xff) << r_off; #else code |= *bp++ << r_off; #endif /* NO_UCHAR */ r_off += 8; bits -= 8; } /* high order bits. */ code |= (*bp & rmask[bits]) << r_off; #endif /* vax */ offset += n_bits; return code; } #ifndef AZTEC86 char * strrchr(s, c) /* For those who don't have it in libc.a */ REGISTER char *s, c; { char *p; for (p = NULL; *s; s++) if (*s == c) p = s; return(p); } #endif #ifndef METAWARE #ifdef DEBUG printcodes() { /* * Just print out codes from input file. For debugging. */ code_int code; int col = 0, bits; bits = n_bits = INIT_BITS; maxcode = MAXCODE(n_bits); free_ent = ((block_compress) ? FIRST : 256 ); while ( ( code = getcode() ) >= 0 ) { if ( (code == CLEAR) && block_compress ) { free_ent = FIRST - 1; clear_flg = 1; } else if ( free_ent < maxmaxcode ) free_ent++; if ( bits != n_bits ) { fprintf(stderr, "\nChange to %d bits\n", n_bits ); bits = n_bits; col = 0; } fprintf(stderr, "%5d%c", code, (col+=6) >= 74 ? (col = 0, '\n') : ' ' ); } putc( '\n', stderr ); exit( 0 ); } #ifdef DEBUG2 code_int sorttab[1<<BITS]; /* sorted pointers into htab */ #define STACK_SIZE 500 static char stack[STACK_SIZE]; /* dumptab doesn't use main stack now -prevents distressing crashes */ dump_tab() /* dump string table */ { REGISTER int i, first; REGISTER ent; int stack_top = STACK_SIZE; REGISTER c; if(do_decomp == 0) { /* compressing */ REGISTER int flag = 1; for(i=0; i<hsize; i++) { /* build sort pointers */ if((long)htabof(i) >= 0) { sorttab[codetabof(i)] = i; } } first = block_compress ? FIRST : 256; for(i = first; i < free_ent; i++) { fprintf(stderr, "%5d: \"", i); stack[--stack_top] = '\n'; stack[--stack_top] = '"'; /* " */ stack_top = in_stack((int)(htabof(sorttab[i])>>maxbits)&0xff, stack_top); for(ent=htabof(sorttab[i]) & ((1<<maxbits)-1); ent > 256; ent=htabof(sorttab[ent]) & ((1<<maxbits)-1)) { stack_top = in_stack((int)(htabof(sorttab[ent]) >> maxbits), stack_top); } stack_top = in_stack(ent, stack_top); fwrite( &stack[stack_top], (size_t)1, (size_t)(STACK_SIZE-stack_top), stderr); stack_top = STACK_SIZE; } } else if(!debug) { /* decompressing */ for ( i = 0; i < free_ent; i++ ) { ent = i; c = tab_suffixof(ent); if ( isascii(c) && isprint(c) ) fprintf( stderr, "%5d: %5d/'%c' \"", ent, tab_prefixof(ent), c ); else fprintf( stderr, "%5d: %5d/\\%03o \"", ent, tab_prefixof(ent), c ); stack[--stack_top] = '\n'; stack[--stack_top] = '"'; /* " */ for ( ; ent != NULL; ent = (ent >= FIRST ? tab_prefixof(ent) : NULL) ) { stack_top = in_stack(tab_suffixof(ent), stack_top); } fwrite( &stack[stack_top], (size_t)1, (size_t)(STACK_SIZE - stack_top), stderr ); stack_top = STACK_SIZE; } } } int in_stack(c, stack_top) REGISTER int c, stack_top; { if ( (isascii(c) && isprint(c) && c != '\\') || c == ' ' ) { stack[--stack_top] = c; } else { switch( c ) { case '\n': stack[--stack_top] = 'n'; break; case '\t': stack[--stack_top] = 't'; break; case '\b': stack[--stack_top] = 'b'; break; case '\f': stack[--stack_top] = 'f'; break; case '\r': stack[--stack_top] = 'r'; break; case '\\': stack[--stack_top] = '\\'; break; default: stack[--stack_top] = '0' + c % 8; stack[--stack_top] = '0' + (c / 8) % 8; stack[--stack_top] = '0' + c / 64; break; } stack[--stack_top] = '\\'; } if (stack_top<0) { fprintf(stderr,"dump_tab stack overflow!!!\n"); exit(1); } return stack_top; } #else dump_tab() {} #endif /* DEBUG2 */ #endif /* DEBUG */ #endif /* METAWARE */ void writeerr() { perror ( ofname ); unlink ( ofname ); exit ( 1 ); } void copystat(ifname, ofname) char *ifname, *ofname; { struct stat statbuf; int mode; #ifndef AZTEC86 time_t timep[2]; #else unsigned long timep[2]; #endif fflush(stdout); close(fileno(stdout)); if (stat(ifname, &statbuf)) { /* Get stat on input file */ perror(ifname); return; } #ifndef PCDOS /* meddling with UNIX-style file modes */ if ((statbuf.st_mode & S_IFMT/*0170000*/) != S_IFREG/*0100000*/) { if(quiet) fprintf(stderr, "%s: ", ifname); fprintf(stderr, " -- not a regular file: unchanged"); exit_stat = 1; } else if (statbuf.st_nlink > 1) { if(quiet) fprintf(stderr, "%s: ", ifname); fprintf(stderr, " -- has %d other links: unchanged", statbuf.st_nlink - 1); exit_stat = 1; } else #endif if (exit_stat == 2 && (!force)) { /* No compression: remove file.Z */ if(!quiet) fprintf(stderr, " -- file unchanged"); } else { /* ***** Successful Compression ***** */ exit_stat = 0; #ifndef PCDOS mode = statbuf.st_mode & 07777; #else mode = statbuf.st_attr & 07777; #endif if (chmod(ofname, mode)) /* Copy modes */ perror(ofname); #ifndef PCDOS chown(ofname, statbuf.st_uid, statbuf.st_gid); /* Copy ownership */ timep[0] = statbuf.st_atime; timep[1] = statbuf.st_mtime; #else timep[0] = statbuf.st_mtime; timep[1] = statbuf.st_mtime; #endif utime(ofname, (struct utimbuf *)timep); /* Update last accessed and modified times */ /* if (unlink(ifname)) perror(ifname); */ if(!quiet) if(do_decomp == 0) fprintf(stderr, " -- compressed to %s", ofname); else fprintf(stderr, " -- decompressed to %s", ofname); return; /* Successful return */ } /* Unsuccessful return -- one of the tests failed */ if (unlink(ofname)) perror(ofname); } /* * This routine returns 1 if we are running in the foreground and stderr * is a tty. */ int foreground() { #ifndef METAWARE if(bgnd_flag) { /* background? */ return(0); } else { /* foreground */ #endif if(isatty(2)) { /* and stderr is a tty */ return(1); } else { return(0); } #ifndef METAWARE } #endif } #ifndef METAWARE void onintr (dummy) int dummy; /* to keep the compiler happy */ { (void)signal(SIGINT,SIG_IGN); unlink ( ofname ); exit ( 1 ); } void oops (dummy) /* wild pointer -- assume bad input */ int dummy; /* to keep the compiler happy */ { (void)signal(SIGSEGV,SIG_IGN); if ( do_decomp == 1 ) fprintf ( stderr, "uncompress: corrupt input\n" ); unlink ( ofname ); exit ( 1 ); } #endif void cl_block () /* table clear for block compress */ { REGISTER long int rat; checkpoint = in_count + CHECK_GAP; #ifdef DEBUG if ( debug ) { fprintf ( stderr, "count: %ld, ratio: ", in_count ); prratio ( stderr, in_count, bytes_out ); fprintf ( stderr, "\n"); } #endif /* DEBUG */ if(in_count > 0x007fffff) { /* shift will overflow */ rat = bytes_out >> 8; if(rat == 0) { /* Don't divide by zero */ rat = 0x7fffffff; } else { rat = in_count / rat; } } else { rat = (in_count << 8) / bytes_out; /* 8 fractional bits */ } if ( rat > ratio ) { ratio = rat; } else { ratio = 0; #ifdef DEBUG if(verbose) dump_tab(); /* dump string table */ #endif cl_hash ( (count_int) hsize ); free_ent = FIRST; clear_flg = 1; output ( (code_int) CLEAR ); #ifdef DEBUG if(debug) fprintf ( stderr, "clear\n" ); #endif /* DEBUG */ } } void cl_hash(hsize) /* reset code table */ REGISTER count_int hsize; { #ifdef AZTEC86 #ifdef PCDOS /* This function only in PC-DOS lib, not in MINIX lib */ memset(htab,-1, hsize * sizeof(count_int)); #else /* MINIX and all non-PC machines do it this way */ #ifndef XENIX_16 /* Normal machine */ REGISTER count_int *htab_p = htab+hsize; #else REGISTER j; REGISTER long k = hsize; REGISTER count_int *htab_p; #endif REGISTER long i; REGISTER long m1 = -1; #ifdef XENIX_16 for(j=0; j<=8 && k>=0; j++,k-=8192) { i = 8192; if(k < 8192) { i = k; } htab_p = &(htab[j][i]); i -= 16; if(i > 0) { #else i = hsize - 16; #endif do { /* might use Sys V memset(3) here */ *(htab_p-16) = m1; *(htab_p-15) = m1; *(htab_p-14) = m1; *(htab_p-13) = m1; *(htab_p-12) = m1; *(htab_p-11) = m1; *(htab_p-10) = m1; *(htab_p-9) = m1; *(htab_p-8) = m1; *(htab_p-7) = m1; *(htab_p-6) = m1; *(htab_p-5) = m1; *(htab_p-4) = m1; *(htab_p-3) = m1; *(htab_p-2) = m1; *(htab_p-1) = m1; htab_p -= 16; } while ((i -= 16) >= 0); #ifdef XENIX_16 } } #endif for ( i += 16; i > 0; i-- ) *--htab_p = m1; #endif #endif } void prratio(stream, num, den) FILE *stream; long int num; long int den; { REGISTER int q; /* Doesn't need to be long */ if(num > 214748L) { /* 2147483647/10000 */ q = (int)(num / (den / 10000L)); } else { q = (int)(10000L * num / den); /* Long calculations, though */ } if (q < 0) { putc('-', stream); q = -q; } fprintf(stream, "%d.%02d%c", q / 100, q % 100, '%'); } void version() { fprintf(stderr, "compress 4.1\n"); fprintf(stderr, "Options: "); #ifdef vax fprintf(stderr, "vax, "); #endif #ifdef _MINIX fprintf(stderr, "MINIX, "); #endif #ifdef NO_UCHAR fprintf(stderr, "NO_UCHAR, "); #endif #ifdef SIGNED_COMPARE_SLOW fprintf(stderr, "SIGNED_COMPARE_SLOW, "); #endif #ifdef XENIX_16 fprintf(stderr, "XENIX_16, "); #endif #ifdef COMPATIBLE fprintf(stderr, "COMPATIBLE, "); #endif #ifdef DEBUG fprintf(stderr, "DEBUG, "); #endif #ifdef BSD4_2 fprintf(stderr, "BSD4_2, "); #endif fprintf(stderr, "BITS = %d\n", BITS); } /* End of text from uok.UUCP:net.sources */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cp 1.11 - copy files Author: Kees J. Bot * mv - move files 20 Jul 1993 * rm - remove files * ln - make a link * cpdir - copy a directory tree (cp -psmr) * clone - make a link farm (ln -fmr) */ #define nil 0 #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <stddef.h> #include <unistd.h> #include <fcntl.h> #include <time.h> #include <sys/stat.h> #include <utime.h> #include <dirent.h> #include <errno.h> #ifndef DEBUG #define DEBUG 0 #define NDEBUG 1 #endif #include <assert.h> /* Copy files in this size chunks: */ #if __minix && !__minix_vmd #define CHUNK (8192 * sizeof(char *)) #else #define CHUNK (1024 << (sizeof(int) + sizeof(char *))) #endif #ifndef CONFORMING #define CONFORMING 1 /* Precisely POSIX conforming. */ #endif #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) char *prog_name; /* Call name of this program. */ int ex_code= 0; /* Final exit code. */ typedef enum identity { CP, MV, RM, LN, CPDIR, CLONE } identity_t; typedef enum action { COPY, MOVE, REMOVE, LINK } action_t; identity_t identity; /* How did the user call me? */ action_t action; /* Copying, moving, or linking. */ int pflag= 0; /* -p/-s: Make orginal and copy the same. */ int iflag= 0; /* -i: Interactive overwriting/deleting. */ int fflag= 0; /* -f: Force. */ int sflag= 0; /* -s: Make a symbolic link (ln/clone). */ int Sflag= 0; /* -S: Make a symlink if across devices. */ int mflag= 0; /* -m: Merge trees, no target dir trickery. */ int rflag= 0; /* -r/-R: Recursively copy a tree. */ int vflag= 0; /* -v: Verbose. */ int xflag= 0; /* -x: Don't traverse past mount points. */ int xdev= 0; /* Set when moving or linking cross-device. */ int expand= 0; /* Expand symlinks, ignore links. */ int conforming= CONFORMING; /* Sometimes standards are a pain. */ int fc_mask; /* File creation mask. */ int uid, gid; /* Effective uid & gid. */ int istty; /* Can have terminal input. */ #ifndef S_ISLNK /* There were no symlinks in medieval times. */ #define S_ISLNK(mode) (0) #define lstat stat #define symlink(path1, path2) (errno= ENOSYS, -1) #define readlink(path, buf, len) (errno= ENOSYS, -1) #endif void report(const char *label) { if (action == REMOVE && fflag) return; fprintf(stderr, "%s: %s: %s\n", prog_name, label, strerror(errno)); ex_code= 1; } void fatal(const char *label) { report(label); exit(1); } void report2(const char *src, const char *dst) { fprintf(stderr, "%s %s %s: %s\n", prog_name, src, dst, strerror(errno)); ex_code= 1; } #if DEBUG size_t nchunks= 0; /* Number of allocated cells. */ #endif void *allocate(void *mem, size_t size) /* Like realloc, but with checking of the return value. */ { #if DEBUG if (mem == nil) nchunks++; #endif if ((mem= mem == nil ? malloc(size) : realloc(mem, size)) == nil) fatal("malloc()"); return mem; } void deallocate(void *mem) /* Release a chunk of memory. */ { if (mem != nil) { #if DEBUG nchunks--; #endif free(mem); } } typedef struct pathname { char *path; /* The actual pathname. */ size_t idx; /* Index for the terminating null byte. */ size_t lim; /* Actual length of the path array. */ } pathname_t; void path_init(pathname_t *pp) /* Initialize a pathname to the null string. */ { pp->path= allocate(nil, pp->lim= 16); pp->path[pp->idx= 0]= 0; } void path_add(pathname_t *pp, const char *name) /* Add a component to a pathname. */ { size_t lim; char *p; lim= pp->idx + strlen(name) + 2; if (lim > pp->lim) { pp->lim= lim += lim/2; /* add an extra 50% growing space. */ pp->path= allocate(pp->path, lim); } p= pp->path + pp->idx; if (p > pp->path && p[-1] != '/') *p++ = '/'; while (*name != 0) { if (*name != '/' || p == pp->path || p[-1] != '/') *p++ = *name; name++; } *p = 0; pp->idx= p - pp->path; } void path_trunc(pathname_t *pp, size_t didx) /* Delete part of a pathname to a remembered length. */ { pp->path[pp->idx= didx]= 0; } #if DEBUG const char *path_name(const pathname_t *pp) /* Return the actual name as a C string. */ { return pp->path; } size_t path_length(const pathname_t *pp) /* The length of the pathname. */ { return pp->idx; } void path_drop(pathname_t *pp) /* Release the storage occupied by the pathname. */ { deallocate(pp->path); } #else /* !DEBUG */ #define path_name(pp) ((const char *) (pp)->path) #define path_length(pp) ((pp)->idx) #define path_drop(pp) deallocate((void *) (pp)->path) #endif /* !DEBUG */ char *basename(const char *path) /* Return the last component of a pathname. (Note: declassifies a const * char * just like strchr. */ { const char *p= path; for (;;) { while (*p == '/') p++; /* Trailing slashes? */ if (*p == 0) break; path= p; while (*p != 0 && *p != '/') p++; /* Skip component. */ } return (char *) path; } int affirmative(void) /* Get a yes/no answer from the suspecting user. */ { int c; int ok; fflush(stdout); fflush(stderr); while ((c= getchar()) == ' ') {} ok= (c == 'y' || c == 'Y'); while (c != EOF && c != '\n') c= getchar(); return ok; } int writable(const struct stat *stp) /* True iff the file with the given attributes allows writing. (And we have * a terminal to ask if ok to overwrite.) */ { if (!istty || uid == 0) return 1; if (stp->st_uid == uid) return stp->st_mode & S_IWUSR; if (stp->st_gid == gid) return stp->st_mode & S_IWGRP; return stp->st_mode & S_IWOTH; } #ifndef PATH_MAX #define PATH_MAX 1024 #endif static char *link_islink(struct stat *stp, const char *file) { /* Tell if a file, which stat(2) information in '*stp', has been seen * earlier by this function under a different name. If not return a * null pointer with errno set to ENOENT, otherwise return the name of * the link. Return a null pointer with an error code in errno for any * error, using E2BIG for a too long file name. * * Use link_islink(nil, nil) to reset all bookkeeping. * * Call for a file twice to delete it from the store. */ typedef struct link { /* In-memory link store. */ struct link *next; /* Hash chain on inode number. */ ino_t ino; /* File's inode number. */ off_t off; /* Offset to more info in temp file. */ } link_t; typedef struct dlink { /* On-disk link store. */ dev_t dev; /* Device number. */ char file[PATH_MAX]; /* Name of earlier seen link. */ } dlink_t; static link_t *links[256]; /* Hash list of known links. */ static int tfd= -1; /* Temp file for file name storage. */ static dlink_t dlink; link_t *lp, **plp; size_t len; off_t off; if (file == nil) { /* Reset everything. */ for (plp= links; plp < arraylimit(links); plp++) { while ((lp= *plp) != nil) { *plp= lp->next; free(lp); } } if (tfd != -1) close(tfd); tfd= -1; return nil; } /* The file must be a non-directory with more than one link. */ if (S_ISDIR(stp->st_mode) || stp->st_nlink <= 1) { errno= ENOENT; return nil; } plp= &links[stp->st_ino % arraysize(links)]; while ((lp= *plp) != nil) { if (lp->ino == stp->st_ino) { /* May have seen this link before. Get it and check. */ if (lseek(tfd, lp->off, SEEK_SET) == -1) return nil; if (read(tfd, &dlink, sizeof(dlink)) < 0) return nil; /* Only need to check the device number. */ if (dlink.dev == stp->st_dev) { if (strcmp(file, dlink.file) == 0) { /* Called twice. Forget about this link. */ *plp= lp->next; free(lp); errno= ENOENT; return nil; } /* Return the name of the earlier link. */ return dlink.file; } } plp= &lp->next; } /* First time I see this link. Add it to the store. */ if (tfd == -1) { for (;;) { char *tmp; tmp= tmpnam(nil); tfd= open(tmp, O_RDWR|O_CREAT|O_EXCL, 0600); if (tfd < 0) { if (errno != EEXIST) return nil; } else { (void) unlink(tmp); break; } } } if ((len= strlen(file)) >= PATH_MAX) { errno= E2BIG; return nil; } dlink.dev= stp->st_dev; strcpy(dlink.file, file); len += offsetof(dlink_t, file) + 1; ifM��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M��M���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ((off= lseek(tfd, 0, SEEK_END)) == -1) return nil; if (write(tfd, &dlink, len) != len) return nil; if ((lp= malloc(sizeof(*lp))) == nil) return nil; lp->next= nil; lp->ino= stp->st_ino; lp->off= off; *plp= lp; errno= ENOENT; return nil; } int trylink(const char *src, const char *dst, struct stat *srcst, struct stat *dstst) /* Keep the link structure intact if src has been seen before. */ { char *olddst; int linked; if (action == COPY && expand) return 0; if ((olddst= link_islink(srcst, dst)) == nil) { /* if (errno != ENOENT) ... */ return 0; } /* Try to link the file copied earlier to the new file. */ if (dstst->st_ino != 0) (void) unlink(dst); if ((linked= (link(olddst, dst) == 0)) && vflag) printf("ln %s %s\n", olddst, dst); return linked; } int copy(const char *src, const char *dst, struct stat *srcst, struct stat *dstst) /* Copy one file to another and copy (some of) the attributes. */ { char buf[CHUNK]; int srcfd, dstfd; ssize_t n; assert(srcst->st_ino != 0); if (dstst->st_ino == 0) { /* The file doesn't exist yet. */ if (!S_ISREG(srcst->st_mode)) { /* Making a new mode 666 regular file. */ srcst->st_mode= (S_IFREG | 0666) & fc_mask; } else if (!pflag && conforming) { /* Making a new file copying mode with umask applied. */ srcst->st_mode &= fc_mask; } } else { /* File exists, ask if ok to overwrite if '-i'. */ if (iflag || (action == MOVE && !fflag && !writable(dstst))) { fprintf(stderr, "Overwrite %s? (mode = %03o) ", dst, dstst->st_mode & 07777); if (!affirmative()) return 0; } if (action == MOVE) { /* Don't overwrite, remove first. */ if (unlink(dst) < 0 && errno != ENOENT) { report(dst); return 0; } } else { /* Overwrite. */ if (!pflag) { /* Keep the existing mode and ownership. */ srcst->st_mode= dstst->st_mode; srcst->st_uid= dstst->st_uid; srcst->st_gid= dstst->st_gid; } } } /* Keep the link structure if possible. */ if (trylink(src, dst, srcst, dstst)) return 1; if ((srcfd= open(src, O_RDONLY)) < 0) { report(src); return 0; } dstfd= open(dst, O_WRONLY|O_CREAT|O_TRUNC, srcst->st_mode & 0777); if (dstfd < 0 && fflag && errno == EACCES) { /* Retry adding a "w" bit. */ (void) chmod(dst, dstst->st_mode | S_IWUSR); dstfd= open(dst, O_WRONLY|O_CREAT|O_TRUNC, 0); } if (dstfd < 0 && fflag && errno == EACCES) { /* Retry after trying to delete. */ (void) unlink(dst); dstfd= open(dst, O_WRONLY|O_CREAT|O_TRUNC, 0); } if (dstfd < 0) { report(dst); close(srcfd); return 0; } /* Get current parameters. */ if (fstat(dstfd, dstst) < 0) { report(dst); close(srcfd); close(dstfd); return 0; } /* Copy the little bytes themselves. */ while ((n= read(srcfd, buf, sizeof(buf))) > 0) { char *bp = buf; ssize_t r; while (n > 0 && (r= write(dstfd, bp, n)) > 0) { bp += r; n -= r; } if (r <= 0) { if (r == 0) { fprintf(stderr, "%s: Warning: EOF writing to %s\n", prog_name, dst); break; } fatal(dst); } } if (n < 0) { report(src); close(srcfd); close(dstfd); return 0; } close(srcfd); close(dstfd); /* Copy the ownership. */ if ((pflag || !conforming) && S_ISREG(dstst->st_mode) && (dstst->st_uid != srcst->st_uid || dstst->st_gid != srcst->st_gid) ) { if (chmod(dst, 0) == 0) dstst->st_mode&= ~07777; if (chown(dst, srcst->st_uid, srcst->st_gid) < 0) { if (errno != EPERM) { report(dst); return 0; } } else { dstst->st_uid= srcst->st_uid; dstst->st_gid= srcst->st_gid; } } if (conforming && S_ISREG(dstst->st_mode) && (dstst->st_uid != srcst->st_uid || dstst->st_gid != srcst->st_gid) ) { /* Suid bits must be cleared in the holy name of * security (and the assumed user stupidity). */ srcst->st_mode&= ~06000; } /* Copy the mode. */ if (S_ISREG(dstst->st_mode) && dstst->st_mode != srcst->st_mode) { if (chmod(dst, srcst->st_mode) < 0) { if (errno != EPERM) { report(dst); return 0; } fprintf(stderr, "%s: Can't change the mode of %s\n", prog_name, dst); } } /* Copy the file modification time. */ if ((pflag || !conforming) && S_ISREG(dstst->st_mode)) { struct utimbuf ut; ut.actime= action == MOVE ? srcst->st_atime : time(nil); ut.modtime= srcst->st_mtime; if (utime(dst, &ut) < 0) { if (errno != EPERM) { report(dst); return 0; } if (pflag) { fprintf(stderr, "%s: Can't set the time of %s\n", prog_name, dst); } } } if (vflag) { printf(action == COPY ? "cp %s %s\n" : "mv %s %s\n", src, dst); } return 1; } void copy1(const char *src, const char *dst, struct stat *srcst, struct stat *dstst) /* Inspect the source file and then copy it. Treatment of symlinks and * special files is a bit complicated. The filetype and link-structure are * ignored if (expand && !rflag), symlinks and link-structure are ignored * if (expand && rflag), everything is copied precisely if !expand. */ { int r, linked; assert(srcst->st_ino != 0); if (srcst->st_ino == dstst->st_ino && srcst->st_dev == dstst->st_dev) { fprintf(stderr, "%s: can't copy %s onto itself\n", prog_name, src); ex_code= 1; return; } /* You can forget it if the destination is a directory. */ if (dstst->st_ino != 0 && S_ISDIR(dstst->st_mode)) { errno= EISDIR; report(dst); return; } if (S_ISREG(srcst->st_mode) || (expand && !rflag)) { if (!copy(src, dst, srcst, dstst)) return; if (action == MOVE && unlink(src) < 0) { report(src); return; } return; } if (dstst->st_ino != 0) { if (iflag || (action == MOVE && !fflag && !writable(dstst))) { fprintf(stderr, "Replace %s? (mode = %03o) ", dst, dstst->st_mode & 07777); if (!affirmative()) return; } if (unlink(dst) < 0) { report(dst); return; } dstst->st_ino= 0; } /* Apply the file creation mask if so required. */ if (!pflag && conforming) srcst->st_mode &= fc_mask; linked= 0; if (S_ISLNK(srcst->st_mode)) { char buf[1024+1]; if ((r= readlink(src, buf, sizeof(buf)-1)) < 0) { report(src); return; } buf[r]= 0; r= symlink(buf, dst); if (vflag && r == 0) printf("ln -s %s %s\n", buf, dst); } else if (trylink(src, dst, srcst, dstst)) { linked= 1; r= 0; } else if (S_ISFIFO(srcst->st_mode)) { r= mkfifo(dst, srcst->st_mode); if (vflag && r == 0) printf("mkfifo %s\n", dst); } else if (S_ISBLK(srcst->st_mode) || S_ISCHR(srcst->st_mode)) { r= mknod(dst, srcst->st_mode, srcst->st_rdev); if (vflag && r == 0) { printf("mknod %s %c %d %d\n", dst, S_ISBLK(srcst->st_mode) ? 'b' : 'c', (srcst->st_rdev >> 8) & 0xFF, (srcst->st_rdev >> 0) & 0xFF); } } else { fprintf(stderr, "%s: %s: odd filetype %5o (not copied)\n", prog_name, src, srcst->st_mode); ex_code= 1; return; } if (r < 0 || lstat(dst, dstst) < 0) { report(dst); return; } if (action == MOVE && unlink(src) < 0) { report(src); (void) unlink(dst); /* Don't want it twice. */ return; } if (linked) return; if (S_ISLNK(srcst->st_mode)) return; /* Copy the ownership. */ if ((pflag || !conforming) && (dstst->st_uid != srcst->st_uid || dstst->st_gid != srcst->st_gid) ) { if (chown(dst, srcst->st_uid, srcst->st_gid) < 0) { if (errno != EPERM) { report(dst); return; } } } /* Copy the file modification time. */ if (pflag || !conforming) { struct utimbuf ut; ut.actime= action == MOVE ? srcst->st_atime : time(nil); ut.modtime= srcst->st_mtime; if (utime(dst, &ut) < 0) { if (errno != EPERM) { report(dst); return; } fprintf(stderr, "%s: Can't set the time of %s\n", prog_name, dst); } } } void remove1(const char *src, struct stat *srcst) { if (iflag || (!fflag && !writable(srcst))) { fprintf(stderr, "Remove %s? (mode = %03o) ", src, srcst->st_mode & 07777); if (!affirmative()) return; } if (unlink(src) < 0) { report(src); } else { if (vflag) printf("rm %s\n", src); } } void link1(const char *src, const char *dst, struct stat *srcst, struct stat *dstst) { pathname_t sym; const char *p; if (dstst->st_ino != 0 && (iflag || fflag)) { if (srcst->st_ino == dstst->st_ino) { if (fflag) return; fprintf(stderr, "%s: Can't link %s onto itself\n", prog_name, src); ex_code= 1; return; } if (iflag) { fprintf(stderr, "Remove %s? ", dst); if (!affirmative()) return; } errno= EISDIR; if (S_ISDIR(dstst->st_mode) || unlink(dst) < 0) { report(dst); return; } } if (!sflag && !(rflag && S_ISLNK(srcst->st_mode)) && !(Sflag && xdev)) { /* A normal link. */ if (link(src, dst) < 0) { if (!Sflag || errno != EXDEV) { report2(src, dst); return; } /* Can't do a cross-device link, we have to symlink. */ xdev= 1; } else { if (vflag) printf("ln %s %s\n", src, dst); return; } } /* Do a symlink. */ if (!rflag && !Sflag) { /* We can get away with a "don't care if it works" symlink. */ if (symlink(src, dst) < 0) { report(dst); return; } if (vflag) printf("ln -s %s %s\n", src, dst); return; } /* If the source is a symlink then it is simply copied. */ if (S_ISLNK(srcst->st_mode)) { int r; char buf[1024+1]; if ((r= readlink(src, buf, sizeof(buf)-1)) < 0) { report(src); return; } buf[r]= 0; if (symlink(buf, dst) < 0) { report(dst); return; } if (vflag) printf("ln -s %s %s\n", buf, dst); return; } /* Make a symlink that has to work, i.e. we must be able to access the * source now, and the link must work. */ if (dst[0] == '/' && src[0] != '/') { /* ln -[rsS] relative/path /full/path. */ fprintf(stderr, "%s: Symlinking %s to %s can't be made to work, too difficult\n", prog_name, src, dst); exit(1); } /* Count the number of subdirectories in the destination file and * add one '..' for each. */ path_init(&sym); if (src[0] != '/') { p= dst; while (*p != 0) { while (*p != 0 && *p != '/') p++; while (*p == '/') p++; if (*p == 0) break; path_add(&sym, ".."); } } path_add(&sym, src); if (symlink(path_name(&sym), dst) < 0) { report(dst); } else { if (vflag) printf("ln -s %s %s\n", path_name(&sym), dst); } path_drop(&sym); } typedef struct entrylist { struct entrylist *next; char *name; } entrylist_t; int eat_dir(const char *dir, entrylist_t **dlist) /* Make a linked list of all the names in a directory. */ { DIR *dp; struct dirent *entry; if ((dp= opendir(dir)) == nil) return 0; while ((entry= readdir(dp)) != nil) { if (strcmp(entry->d_name, ".") == 0) continue; if (strcmp(entry->d_name, "..") == 0) continue; *dlist= allocate(nil, sizeof(**dlist)); (*dlist)->name= allocate(nil, strlen(entry->d_name)+1); strcpy((*dlist)->name, entry->d_name); dlist= &(*dlist)->next; } closedir(dp); *dlist= nil; return 1; } void chop_dlist(entrylist_t **dlist) /* Chop an entry of a name list. */ { entrylist_t *junk= *dlist; *dlist= junk->next; deallocate(junk->name); deallocate(junk); } void drop_dlist(entrylist_t *dlist) /* Get rid of a whole list. */ { while (dlist != nil) chop_dlist(&dlist); } void do1(pathname_t *src, pathname_t *dst, int depth) /* Perform the appropriate action on a source and destination file. */ { size_t slashsrc, slashdst; struct stat srcst, dstst; entrylist_t *dlist; static ino_t topdst_ino; static dev_t topdst_dev; static dev_t topsrc_dev; #if DEBUG if (vflag && depth == 0) { char flags[100], *pf= flags; if (pflag) *pf++= 'p'; if (iflag) *pf++= 'i'; if (fflag) *pf++= 'f'; if (sflag) *pf++= 's'; if (Sflag) *pf++= 'S'; if (mflag) *pf++= 'm'; if (rflag) *pf++= 'r'; if (vflag) *pf++= 'v'; if (xflag) *pf++= 'x'; if (expand) *pf++= 'L'; if (conforming) *pf++= 'C'; *pf= 0; printf(": %s -%s %s %s\n", prog_name, flags, path_name(src), path_name(dst)); } #endif /* st_ino == 0 if not stat()'ed yet, or nonexistent. */ srcst.st_ino= 0; dstst.st_ino= 0; if (action != LINK || !sflag || rflag) { /* Source must exist unless symlinking. */ if ((expand ? stat : lstat)(path_name(src), &srcst) < 0) { report(path_name(src)); return; } } if (depth == 0) { /* First call: Not cross-device yet, first dst not seen yet, * remember top device number. */ xdev= 0; topdst_ino= 0; topsrc_dev= srcst.st_dev; } /* Inspect the intended destination unless removing. */ if (action != REMOVE) { if ((expand ? stat : lstat)(path_name(dst), &dstst) < 0) { if (errno != ENOENT) { report(path_name(dst)); return; } } } if (action == MOVE && !xdev) { if (dstst.st_ino != 0 && srcst.st_dev != dstst.st_dev) { /* It's a cross-device rename, i.e. copy and remove. */ xdev= 1; } else if (!mflag || dstst.st_ino == 0 || !S_ISDIR(dstst.st_mode)) { /* Try to simply rename the file (not merging trees). */ if (srcst.st_ino == dstst.st_ino) { fprintf(stderr, "%s: Can't move %s onto itself\n", prog_name, path_name(src)); ex_code= 1; return; } if (dstst.st_ino != 0) { if (iflag || (!fflag && !writable(&dstst))) { fprintf(stderr, "Replace %s? (mode = %03o) ", path_name(dst), dstst.st_mode & 07777); if (!affirmative()) return; } if (!S_ISDIR(dstst.st_mode)) (void) unlink(path_name(dst)); } if (rename(path_name(src), path_name(dst)) == 0) { /* Success. */ if (vflag) { printf("mv %s %s\n", path_name(src), path_name(dst)); } return; } if (errno == EXDEV) { xdev= 1; } else { report2(path_name(src), path_name(dst)); return; } } } if (srcst.st_ino == 0 || !S_ISDIR(srcst.st_mode)) { /* Copy/move/remove/link a single file. */ switch (action) { case COPY: case MOVE: copy1(path_name(src), path_name(dst), &srcst, &dstst); break; case REMOVE: remove1(path_name(src), &srcst); break; case LINK: link1(path_name(src), path_name(dst), &srcst, &dstst); break; } return; } /* Recursively copy/move/remove/link a directory if -r or -R. */ if (!rflag) { errno= EISDIR; report(path_name(src)); return; } /* Ok to remove contents of dir? */ if (action == REMOVE) { if (xflag && topsrc_dev != srcst.st_dev) { /* Don't recurse past a mount point. */ return; } if (iflag) { fprintf(stderr, "Remove contents of %s? ", path_name(src)); if (!affirmative()) return; } } /* Gather the names in the source directory. */ if (!eat_dir(path_name(src), &dlist)) { report(path_name(src)); return; } /* Check/create the target directory. */ if (action != REMOVE && dstst.st_ino != 0 && !S_ISDIR(dstst.st_mode)) { if (action != MOVE && !fflag) { errno= ENOTDIR; report(path_name(dst)); return; } if (iflag) { fprintf(stderr, "Replace %s? ", path_name(dst)); if (!affirmative()) { drop_dlist(dlist); return; } } if (unlink(path_name(dst)) < 0) { report(path_name(dst)); drop_dlist(dlist); return; } dstst.st_ino= 0; } if (action != REMOVE) { if (dstst.st_ino == 0) { /* Create a new target directory. */ if (!pflag && conforming) srcst.st_mode&= fc_mask; if (mkdir(path_name(dst), srcst.st_mode | S_IRWXU) < 0 || stat(path_name(dst), &dstst) < 0) { report(path_name(dst)); drop_dlist(dlist); return; } if (vflag) printf("mkdir %s\n", path_name(dst)); } else { /* Target directory already exists. */ if (action == MOVE && !mflag) { errno= EEXIST; report(path_name(dst)); drop_dlist(dlist); return; } if (!pflag) { /* Keep the existing attributes. */ srcst.st_mode= dstst.st_mode; srcst.st_uid= dstst.st_uid; srcst.st_gid= dstst.st_gid; srcst.st_mtime= dstst.st_mtime; } } if (topdst_ino == 0) { /* Remember the top destination. */ topdst_dev= dstst.st_dev; topdst_ino= dstst.st_ino; } if (srcst.st_ino == topdst_ino && srcst.st_dev == topdst_dev) { /* E.g. cp -r /shallow /shallow/deep. */ fprintf(stderr, "%s%s %s/ %s/: infinite recursion avoided\n", prog_name, action != MOVE ? " -r" : "", path_name(src), path_name(dst)); drop_dlist(dlist); return; } if (xflag && topsrc_dev != srcst.st_dev) { /* Don't recurse past a mount point. */ drop_dlist(dlist); return; } } /* Go down. */ slashsrc= path_length(src); slashdst= path_length(dst); while (dlist != nil) { path_add(src, dlist->name); if (action != REMOVE) path_add(dst, dlist->name); do1(src, dst, depth+1); path_trunc(src, slashsrc); path_trunc(dst, slashdst); chop_dlist(&dlist); } if (action == MOVE || action == REMOVE) { /* The contents of the source directory should have * been (re)moved above. Get rid of the empty dir. */ if (action == REMOVE && iflag) { fprintf(stderr, "Remove directory %s? ", path_name(src)); if (!affirmative()) return; } if (rmdir(path_name(src)) < 0) { if (errno != ENOTEMPTY) report(path_name(src)); return; } if (vflag) printf("rmdir %s\n", path_name(src)); } if (action != REMOVE) { /* Set the attributes of a new directory. */ struct utimbuf ut; /* Copy the ownership. */ if ((pflag || !conforming) && (dstst.st_uid != srcst.st_uid || dstst.st_gid != srcst.st_gid) ) { if (chown(path_name(dst), srcst.st_uid, srcst.st_gid) < 0) { if (errno != EPERM) { report(path_name(dst)); return; } } } /* Copy the mode. */ if (dstst.st_mode != srcst.st_mode) { if (chmod(path_name(dst), srcst.st_mode) < 0) { report(path_name(dst)); return; } } /* Copy the file modification time. */ if (dstst.st_mtime != srcst.st_mtime) { ut.actime= action == MOVE ? srcst.st_atime : time(nil); ut.modtime= srcst.st_mtime; if (utime(path_name(dst), &ut) < 0) { if (errno != EPERM) { report(path_name(dst)); return; } fprintf(stderr, "%s: Can't set the time of %s\n", prog_name, path_name(dst)); } } } } void usage(void) { char *flags1, *flags2; switch (identity) { case CP: flags1= "pifsmrRvx"; flags2= "pifsrRvx"; break; case MV: flags1= "ifsmvx"; flags2= "ifsvx"; break; case RM: fprintf(stderr, "Usage: rm [-ifrRvx] file ...\n"); exit(1); case LN: flags1= "ifsSmrRvx"; flags2= "ifsSrRvx"; break; case CPDIR: flags1= "ifvx"; flags2= nil; break; case CLONE: flags1= "ifsSvx"; flags2= nil; break; } fprintf(stderr, "Usage: %s [-%s] file1 file2\n", prog_name, flags1); if (flags2 != nil) fprintf(stderr, " %s [-%s] file ... dir\n", prog_name, flags2); exit(1); } void main(int argc, char **argv) { int i; char *flags; struct stat st; pathname_t src, dst; size_t slash; #if DEBUG >= 3 /* The first argument is the call name while debugging. */ if (argc < 2) exit(-1); argv++; argc--; #endif #if DEBUG vflag= isatty(1); #endif /* Call name of this program. */ prog_name= basename(argv[0]); /* Required action. */ if (strcmp(prog_name, "cp") == 0) { identity= CP; action= COPY; flags= "pifsmrRvx"; expand= 1; } else if (strcmp(prog_name, "mv") == 0) { identity= MV; action= MOVE; flags= "ifsmvx"; rflag= pflag= 1; } else if (strcmp(prog_name, "rm") == 0) { identity= RM; action= REMOVE; flags= "ifrRvx"; } else if (strcmp(prog_name, "ln") == 0) { identity= LN; action= LINK; flags= "ifsSmrRvx"; } else if (strcmp(prog_name, "cpdir") == 0) { identity= CPDIR; action= COPY; flags= "pifsmrRvx"; rflag= mflag= pflag= 1; conforming= 0; } else if (strcmp(prog_name, "clone") == 0) { identity= CLONE; action= LINK; flags= "ifsSmrRvx"; rflag= mflag= fflag= 1; } else { fprintf(stderr, "%s: Identity crisis, not called cp, mv, rm, ln, cpdir, or clone\n", prog_name); exit(1); } /* Who am I?, where am I?, how protective am I? */ uid= geteuid(); gid= getegid(); istty= isatty(0); fc_mask= ~umask(0); /* Gather flags. */ i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) { /* Flag supported? */ if (strchr(flags, *opt) == nil) usage(); switch (*opt++) { case 'p': pflag= 1; break; case 'i': iflag= 1; if (action == MOVE) fflag= 0; break; case 'f': fflag= 1; if (action == MOVE) iflag= 0; break; case 's': if (action == LINK) { sflag= 1; } else { /* Forget about POSIX, do it right. */ conforming= 0; } break; case 'S': Sflag= 1; break; case 'm': mflag= 1; break; case 'r': expand= 0; /*FALL THROUGH*/ case 'R': rflag= 1; break; case 'v': vflag= 1; break; case 'x': xflag= 1; break; default: assert(0); } } } switch (action) { case REMOVE: if (i == argc) usage(); break; case LINK: /* 'ln dir/file' is to be read as 'ln dir/file .'. */ if ((argc - i) == 1 && action == LINK) argv[argc++]= "."; /*FALL THROUGH*/ default: if ((argc - i) < 2) usage(); } path_init(&src); path_init(&dst); if (action != REMOVE && !mflag && stat(argv[argc-1], &st) >= 0 && S_ISDIR(st.st_mode)) { /* The last argument is a directory, this means we have to * throw the whole lot into this directory. This is the * Right Thing unless you use -r. */ path_add(&dst, argv[argc-1]); slash= path_length(&dst); do { path_add(&src, argv[i]); path_add(&dst, basename(argv[i])); do1(&src, &dst, 0); path_trunc(&src, 0); path_trunc(&dst, slash); } while (++i < argc-1); } else if (action == REMOVE || (argc - i) == 2) { /* Just two files (or many files for rm). */ do { path_add(&src, argv[i]); if (action != REMOVE) path_add(&dst, argv[i+1]); do1(&src, &dst, 0); path_trunc(&src, 0); } while (action == REMOVE && ++i < argc); } else { usage(); } path_drop(&src); path_drop(&dst); #if DEBUG if (nchunks != 0) { fprintf(stderr, "(%ld chunks of memory not freed)\n", (long) nchunks); } #endif exit(ex_code); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Compute checksum Author: Johan W. Stevenson */ /* Copyright 1988 by Johan W. Stevenson */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <string.h> #include <errno.h> int errs; #if __STDC__ int main(int argc, char **argv); void crc(char *fname); #else void crc(); #endif int main(argc, argv) int argc; char **argv; { char line[256]; if (argc <= 1) crc((char *) 0); else if (argc == 2 && strcmp(argv[1], "-") == 0) while (fgets(line, sizeof line, stdin) != NULL) { if (line[strlen(line) - 1] == '\n') line[strlen(line) - 1] = '\0'; crc(line); } else do { crc(argv[1]); argv++; argc--; } while (argc > 1); return(errs != 0); } /* Crctab calculated by Mark G. Mendel, Network Systems Corporation */ static unsigned short crctab[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; /* Updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. * NOTE: First argument must be in range 0 to 255. * Second argument is referenced twice. * * Programmers may incorporate any or all code into their programs, * giving proper credit within the source. Publication of the * source routines is permitted so long as proper credit is given * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, * Omen Technology. */ #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) void crc(fname) char *fname; { register int c; register long len = 0; register unsigned short crc = 0; register FILE *fp; if (fname == NULL) fp = stdin; else if ((fp = fopen(fname, "r")) == NULL) { fprintf(stderr, "crc: Can't open %s: %s\n", fname, strerror(errno)); errs++; return; } while ((c = getc(fp)) != EOF) { len++; crc = updcrc(c, crc); } printf("%05u %6ld", crc, len); if (fname) { printf(" %s", fname); fclose(fp); } printf("\n"); } �����������/* stat.c Feb 1987 - main, printit, statit * * stat - a program to perform what the stat(2) call does. * * usage: stat [-] [-all] -<field> [-<field> ...] [file1 file2 file3 ...] * * where <field> is one of the struct stat fields without the leading "st_". * The three times can be printed out as human times by requesting * -Ctime instead of -ctime (upper case 1st letter). * - means take the file names from stdin. * -0.. means fd0.. * no files means all fds. * * output: if only one field is specified, that fields' contents are printed. * if more than one field is specified, the output is * file filed1: f1val, field2: f2val, etc * * written: Larry McVoy, (mcvoy@rsch.wisc.edu) */ # define ALLDEF /* Make -all default. (kjb) */ # include <sys/types.h> # include <errno.h> # include <limits.h> # include <stdio.h> # include <stdlib.h> # include <string.h> # include <time.h> # include <sys/stat.h> # define addr(x) ((void*) &sbuf.x) # define size(x) sizeof(sbuf.x) # define equal(s, t) (strcmp(s, t) == 0) # ifndef PATH_MAX # define PATH_MAX 1024 # endif # undef LS_ADDS_SPACE /* AT&T Unix PC, ls prints "file[* /]" */ /* This makes stat fail. */ # ifndef _MINIX /* All but Minix have u_* and st_blocks */ # define BSD # endif # ifndef BSD typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; # endif # ifndef S_IREAD # define S_IREAD S_IRUSR # define S_IWRITE S_IWUSR # define S_IEXEC S_IXUSR # endif char * arg0; struct stat sbuf; extern int errno; int first_file= 1; #ifndef S_IFLNK #define lstat stat #endif struct field { char* f_name; /* field name in stat */ u_char* f_addr; /* address of the field in sbuf */ u_short f_size; /* size of the object, needed for pointer arith */ u_short f_print; /* show this field? */ } fields[] = { { "dev", addr(st_dev), size(st_dev), 0 }, { "ino", addr(st_ino), size(st_ino), 0 }, { "mode", addr(st_mode), size(st_mode), 0 }, { "nlink", addr(st_nlink), size(st_nlink), 0 }, { "uid", addr(st_uid), size(st_uid), 0 }, { "gid", addr(st_gid), size(st_gid), 0 }, { "rdev", addr(st_rdev), size(st_rdev), 0 }, { "size", addr(st_size), size(st_size), 0 }, { "Atime", addr(st_atime), size(st_atime), 0 }, { "atime", addr(st_atime), size(st_atime), 0 }, { "Mtime", addr(st_mtime), size(st_mtime), 0 }, { "mtime", addr(st_mtime), size(st_mtime), 0 }, { "Ctime", addr(st_ctime), size(st_ctime), 0 }, { "ctime", addr(st_ctime), size(st_ctime), 0 }, # ifdef BSD { "blksize", addr(st_blksize), size(st_blksize), 0 }, { "blocks", addr(st_blocks), size(st_blocks), 0 }, # endif { NULL, 0, 0, 0 }, }; void printstat(struct stat *sbuf, int nprint); void printit(struct stat* sb, struct field* f, int n); void rwx(mode_t mode, char *bit); void usage(void); int main(int ac, char** av) { int i, j, nprint = 0, files = 0; char buf[PATH_MAX], *check; int sym=0, ret=0, from_stdin = 0; int err; u_long fd; if ((arg0 = strrchr(av[0], '/')) == NULL) arg0 = av[0]; else arg0++; #ifdef S_IFLNK if (equal(arg0, "lstat")) sym = 1; #endif if (ac > 1 && equal(av[i = 1], "-")) i++, from_stdin++; for (i= 1; i<ac; i++) { if (av[i][0] == '-') { if (equal(av[i], "-")) { from_stdin= 1; files++; continue; } if (equal("-all", av[i])) { for (j=0; fields[j].f_name; j++) nprint++, fields[j].f_print++; continue; } if (equal("-s", av[i])) { #ifdef S_IFLNK sym=1; #endif continue; } fd = strtoul(av[i]+1, &check, 0); if (check != av[i]+1 && *check == '\0') { files++; continue; } for (j=0; fields[j].f_name; j++) if (equal(fields[j].f_name, &av[i][1])) { nprint++, fields[j].f_print++; break; } if (!fields[j].f_name) { if (!equal("-?", av[i])) { fprintf(stderr, "stat: %s: bad field\n", av[i]); } usage(); } } else files++; } if (!nprint) { # ifndef ALLDEF usage(); # else for (j=0; fields[j].f_name; j++) nprint++, fields[j].f_print++; # endif } if (from_stdin) files++; /* We don't know how many files come from stdin. */ if (files == 0) { /* Stat all file descriptors. */ for (i= 0; i<OPEN_MAX; i++) { err= fstat(i, &sbuf); if (err == -1 && errno == EBADF) continue; if (err == 0) { if (!first_file) fputc('\n', stdout); printf("fd %d:\n", i); printstat(&sbuf, nprint); } else { fprintf(stderr, "%s: fd %d: %s\n", arg0, i, strerror(errno)); ret= 1; } } exit(ret); } for (i=1; i<ac; i++) { if (equal(av[i], "-")) { while (fgets(buf, sizeof(buf), stdin)) { char *p= strchr(buf, '\n'); if (p) *p= 0; if (!sym) err= stat(av[i], &sbuf); if (sym || (err != 0 && errno == ENOENT)) { err= lstat(av[i], &sbuf); } if (err == -1) { fprintf(stderr, "%s: %s: %s\n", arg0, av[i], strerror(errno)); ret= 1; } else { if (!first_file) fputc('\n', stdout); printf("%s:\n", buf); printstat(&sbuf, nprint); } } continue; } if (av[i][0] == '-') { fd= strtoul(av[i]+1, &check, 10); if (check == av[i]+1 || *check != '\0') continue; if (fd >= INT_MAX) { err= -1; errno= EBADF; } else { err= fstat((int) fd, &sbuf); } if (err != -1) { if (!first_file) fputc('\n', stdout); if (files != 1) printf("fd %lu:\n", fd); printstat(&sbuf, nprint); } else { fprintf(stderr, "fd %lu: %s\n", fd, strerror(errno)); ret= 1; } continue; } if (!sym) err= stat(av[i], &sbuf); if (sym || (err != 0 && errno == ENOENT)) err= lstat(av[i], &sbuf); if (err != -1) { if (!first_file) fputc('\n', stdout); if (files != 1) printf("%s:\n", av[i]); printstat(&sbuf, nprint); } else { fprintf(stderr, "%s: %s: %s\n", arg0, av[i], strerror(errno)); ret= 1; } } exit(ret); } /*------------------------------------------------------------------30/Jan/87-* * printstat(file, nprint) - do the work *----------------------------------------------------------------larry mcvoy-*/ void printstat(struct stat *sbuf, int nprint) { int j; int first_field= 1; for (j=0; fields[j].f_name; j++) { if (fields[j].f_print) { if (!first_field) fputc('\n', stdout); printit(sbuf, &fields[j], nprint); first_field= 0; } } fputc('\n', stdout); first_file= 0; } /*------------------------------------------------------------------30/Jan/87-* * printit(sb, f, n) - print the field * * Inputs -> (struct stat*), (struct field*), (int) * * Results -> Displays the field, with special handling of weird fields like * mode and mtime. The mode field is dumped in octal, followed * by one or more of the S_IF<X> and/or S_I<X> values. *----------------------------------------------------------------larry mcvoy-*/ void printit(struct stat* sb, struct field* f, int n) { if (n > 1) printf("%s: ", f->f_name); if (equal(f->f_name, "mode")) { /* This lot changed to my personal liking. (kjb) */ char bit[11]; printf("%07lo, ", (u_long) sb->st_mode); strcpy(bit, "----------"); switch (sb->st_mode&S_IFMT) { case S_IFDIR: bit[0]='d'; break; # ifdef S_IFFIFO case S_IFFIFO: bit[0]='p'; break; # endif case S_IFCHR: bit[0]='c'; break; case S_IFBLK: bit[0]='b'; break; # ifdef S_IFSOCK case S_IFSOCK: bit[0]='S'; break; # endif # ifdef S_IFMPC case S_IFMPC: bit[0]='C'; break; # endif # ifdef S_IFMPB case S_IFMPB: bit[0]='B'; break; # endif # ifdef S_IFLNK case S_IFLNK: bit[0]='l'; break; # endif } rwx(sb->st_mode, bit+1); rwx(sb->st_mode<<3, bit+4); rwx(sb->st_mode<<6, bit+7); if (sb->st_mode&S_ISUID) bit[3]='s'; if (sb->st_mode&S_ISGID) bit[6]='s'; if (sb->st_mode&S_ISVTX) bit[9]='t'; printf("\"%s\"", bit); } /* times in human form, uppercase first letter */ else if (equal("Ctime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_ctime), (u_long) sb->st_ctime); f[1].f_print= 0; M��M��M������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ } else if (equal("Mtime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_mtime), (u_long) sb->st_mtime); f[1].f_print= 0; } else if (equal("Atime", f->f_name)) { printf("%.24s (%lu)", ctime(&sb->st_atime), (u_long) sb->st_atime); f[1].f_print= 0; } else if (equal("ctime", f->f_name)) { printf("%lu", (u_long) sb->st_ctime); } else if (equal("mtime", f->f_name)) { printf("%lu", (u_long) sb->st_mtime); } else if (equal("atime", f->f_name)) { printf("%lu", (u_long) sb->st_atime); } else { switch (f->f_size) { case sizeof(char): printf("%d", * (u_char *) f->f_addr); break; case sizeof(short): printf("%u", (u_int) * (u_short *) f->f_addr); break; #if INT_MAX != SHRT_MAX case sizeof(int): printf("%u", * (u_int *) f->f_addr); break; #endif #if LONG_MAX != INT_MAX && LONG_MAX != SHRT_MAX case sizeof(long): printf("%lu", * (u_long *) f->f_addr); break; #endif default: fprintf(stderr, "\nProgram error: bad '%s' field size %d\n", f->f_name, f->f_size); break; } } } void rwx(mode_t mode, char *bit) { if (mode&S_IREAD) bit[0]='r'; if (mode&S_IWRITE) bit[1]='w'; if (mode&S_IEXEC) bit[2]='x'; } void usage(void) { fprintf(stderr, "Usage: %s [-] [-fd] [-all] [-s] [-field ...] [file1 ...]\n", arg0); exit(1); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cut - extract columns from a file or stdin. Author: Michael J. Holme * * Copyright 1989, Michael John Holme, All rights reserved. * This code may be freely distributed, provided that this notice * remains intact. * * V1.1: 6th September 1989 * * Bugs, criticisms, etc, * c/o Mark Powell * JANET sq79@uk.ac.liv * ARPA sq79%liv.ac.uk@nsfnet-relay.ac.uk * UUCP ...!mcvax!ukc!liv.ac.uk!sq79 *------------------------------------------------------------------------- * Changed for POSIX1003.2/Draft10 conformance * Thomas Brupbacher (tobr@mw.lpc.ethz.ch), September 1990. * Changes: * - separation of error messages ( stderr) and output (stdout). * - support for -b and -n (no effect, -b acts as -c) * - support for -s *------------------------------------------------------------------------- */ #include <sys/types.h> #include <ctype.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #define MAX_FIELD 80 /* Pointers to the beginning of each field * are stored in columns[], if a line holds * more than MAX_FIELD columns the array * boundary is exceed. But unlikely at 80 */ #define MAX_ARGS 32 /* Maximum number of fields following -f or * -c switches */ int args[MAX_ARGS * 2]; int num_args; /* Lots of new defines, should easen maintainance... */ #define DUMP_STDIN 0 /* define for mode: no options */ #define OPTIONF 1 /* define for mode: option -f */ #define OPTIONC 2 /* define for mode: option -c */ #define OPTIONB 3 /* define for mode: option -b */ #define NOTSET 0 /* option not selected */ #define SET 1 /* option selected */ /* Defines for the warnings */ #define DELIMITER_NOT_APPLICABLE 0 #define OVERRIDING_PREVIOUS_MODE 1 #define OPTION_NOT_APPLICABLE 2 #define UNKNOWN_OPTION 3 #define FILE_NOT_READABLE 4 /* Defines for the fatal errors */ #define SYNTAX_ERROR 101 #define POSITION_ERROR 102 #define USAGE 103 #define LINE_TO_LONG_ERROR 104 #define RANGE_ERROR 105 #define MAX_FIELDS_EXEEDED_ERROR 106 #define MAX_ARGS_EXEEDED_ERROR 107 int mode; /* 0 = dump stdin to stdout, 1=-f, 2=-c */ int flag_i; /* SET = -i set on command line */ int flag_s; /* SET = -s set on command line */ char delim = '\t'; /* default delimiting character */ FILE *fd; char *name; char line[BUFSIZ]; int exit_status; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void warn, (int warn_number, char *option)); _PROTOTYPE(void cuterror, (int err)); _PROTOTYPE(void get_args, (void)); _PROTOTYPE(void cut, (void)); void warn(warn_number, option) int warn_number; char *option; { static char *warn_msg[] = { "%s: Option -d allowed only with -f\n", "%s: -%s overrides earlier option\n", "%s: -%s not allowed in current mode\n", "%s: Cannot open %s\n" }; fprintf(stderr, warn_msg[warn_number], name, option); exit_status = warn_number + 1; } void cuterror(err) int err; { static char *err_mes[] = { "%s: syntax error\n", "%s: position must be >0\n", "%s: usage: cut [-f args [-i] [-d x]]|[-c args] [filename [...]]\n", "%s: line longer than BUFSIZ\n", "%s: range must not decrease from left to right\n", "%s: MAX_FIELD exceeded\n", "%s: MAX_ARGS exceeded\n" }; fprintf(stderr, err_mes[err - 101], name); exit(err); } void get_args() { int i = 0; int arg_ptr = 0; int flag; num_args = 0; do { if (num_args == MAX_ARGS) cuterror(MAX_ARGS_EXEEDED_ERROR); if (!isdigit(line[i]) && line[i] != '-') cuterror(SYNTAX_ERROR); args[arg_ptr] = 1; args[arg_ptr + 1] = BUFSIZ; flag = 1; while (line[i] != ',' && line[i] != 0) { if (isdigit(line[i])) { args[arg_ptr] = 0; while (isdigit(line[i])) args[arg_ptr] = 10 * args[arg_ptr] + line[i++] - '0'; if (!args[arg_ptr]) cuterror(POSITION_ERROR); arg_ptr++; } if (line[i] == '-') { arg_ptr |= 1; i++; flag = 0; } } if (flag && arg_ptr & 1) args[arg_ptr] = args[arg_ptr - 1]; if (args[num_args * 2] > args[num_args * 2 + 1]) cuterror(RANGE_ERROR); num_args++; arg_ptr = num_args * 2; } while (line[i++]); } void cut() { int i, j, length, maxcol; char *columns[MAX_FIELD]; while (fgets(line, BUFSIZ, fd)) { length = strlen(line) - 1; *(line + length) = 0; switch (mode) { case DUMP_STDIN: printf("%s", line); break; case OPTIONF: maxcol = 0; columns[maxcol++] = line; for (i = 0; i < length; i++) { if (*(line + i) == delim) { *(line + i) = 0; if (maxcol == MAX_FIELD) cuterror(MAX_FIELDS_EXEEDED_ERROR); columns[maxcol] = line + i + 1; while (*(line + i + 1) == delim && flag_i) { columns[maxcol]++; i++; } maxcol++; } } if (maxcol == 1) { if (flag_s != SET) printf("%s", line); } else { for (i = 0; i < num_args; i++) { for (j = args[i * 2]; j <= args[i * 2 + 1]; j++) if (j <= maxcol) { printf("%s", columns[j - 1]); if (i != num_args - 1 || j != args[i * 2 + 1]) putchar(delim); } } } break; case OPTIONC: for (i = 0; i < num_args; i++) { for (j = args[i * 2]; j <= (args[i * 2 + 1] > length ? length : args[i * 2 + 1]); j++) putchar(*(line + j - 1)); } } if (maxcol == 1 && flag_s == SET); else putchar('\n'); } } int main(argc, argv) int argc; char *argv[]; { int i = 1; int numberFilenames = 0; name = argv[0]; if (argc == 1) cuterror(USAGE); while (i < argc) { if (argv[i][0] == '-') { switch (argv[i++][1]) { case 'd': if (mode == OPTIONC || mode == OPTIONB) warn(DELIMITER_NOT_APPLICABLE, "d"); delim = argv[i++][0]; break; case 'f': sprintf(line, "%s", argv[i++]); if (mode == OPTIONC || mode == OPTIONB) warn(OVERRIDING_PREVIOUS_MODE, "f"); mode = OPTIONF; break; case 'b': sprintf(line, "%s", argv[i++]); if (mode == OPTIONF || mode == OPTIONC) warn(OVERRIDING_PREVIOUS_MODE, "b"); mode = OPTIONB; break; case 'c': sprintf(line, "%s", argv[i++]); if (mode == OPTIONF || mode == OPTIONB) warn(OVERRIDING_PREVIOUS_MODE, "c"); mode = OPTIONC; break; case 'i': flag_i = SET; break; case 's': flag_s = SET; break; case '\0': /* - means: read from stdin */ numberFilenames++; break; case 'n': /* needed for Posix, but no effect here */ if (mode != OPTIONB) warn(OPTION_NOT_APPLICABLE, "n"); break; default: warn(UNKNOWN_OPTION, &(argv[i - 1][1])); } } else { i++; numberFilenames++; } } /* Here follow the checks, if the selected options are reasonable. */ if (mode == OPTIONB) /* since in Minix char := byte */ mode = OPTIONC; /* Flag -s is only allowed with -f, otherwise warn and reset flag_s */ if (flag_s == SET && (mode == OPTIONB || mode == OPTIONC)) { warn(OPTION_NOT_APPLICABLE, "s"); flag_s = NOTSET; } /* Flag -i is only allowed with -f, otherwise warn and reset flag_i */ if (flag_i == SET && mode == OPTIONF) { warn(OPTION_NOT_APPLICABLE, "s"); flag_i = NOTSET; } get_args(); if (numberFilenames != 0) { i = 1; while (i < argc) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 'f': case 'c': case 'b': case 'd': i += 2; break; case 'n': case 'i': case 's': i++; break; case '\0': fd = stdin; i++; cut(); break; default: i++; } } else { if ((fd = fopen(argv[i++], "r")) == NULL) { warn(FILE_NOT_READABLE, argv[i - 1]); } else { cut(); fclose(fd); } } } } else { fd = stdin; cut(); } return(exit_status); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* date - Display (or set) the date and time Author: V. Archer */ #include <sys/types.h> #include <ctype.h> #include <stddef.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <unistd.h> #define MIN 60L /* # seconds in a minute */ #define HOUR (60 * MIN) /* # seconds in an hour */ #define DAY (24 * HOUR) /* # seconds in a day */ #define YEAR (365 * DAY) /* # seconds in a (non-leap) year */ int qflag, uflag, sflag, Sflag; /* Default output file descriptor. */ int outfd = 1; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void putchar, (int c)); _PROTOTYPE(void pstring, (char *s, int len)); _PROTOTYPE(void pldecimal, (unsigned long d, int digits)); _PROTOTYPE(void pdecimal, (int d, int digits)); _PROTOTYPE(void fmtdate, (char *format, time_t t, struct tm *p)); _PROTOTYPE(time_t make_time, (char *t)); _PROTOTYPE(struct tm *september, (time_t *tp)); _PROTOTYPE(void usage, (void)); /* Main module. Handles P1003.2 date and system administrator's date. The * date entered should be given GMT, regardless of the system's TZ! */ int main(argc, argv) int argc; char **argv; { time_t t; struct tm *tm; char *format; char time_buf[40]; int n; int i; time(&t); i = 1; while (i < argc && argv[i][0] == '-') { char *opt = argv[i++] + 1, *end; if (opt[0] == '-' && opt[1] == 0) break; while (*opt != 0) switch (*opt++) { case 'q': qflag = 1; break; case 's': sflag = 1; break; case 'u': uflag = 1; break; case 'S': Sflag = 1; break; case 't': /* (obsolete, now -r) */ case 'r': if (*opt == 0) { if (i == argc) usage(); opt = argv[i++]; } t = strtoul(opt, &end, 10); if (*end != 0) usage(); opt = ""; break; default: usage(); } } if (!qflag && i < argc && ('0' <= argv[i][0] && argv[i][0] <= '9')) { t = make_time(argv[i++]); sflag = 1; } format = "%c"; if (i < argc && argv[i][0] == '+') format = argv[i++] + 1; if (i != argc) usage(); if (qflag) { pstring("\nPlease enter date: MMDDYYhhmmss. Then hit the RETURN key.\n", -1); n = read(0, time_buf, sizeof(time_buf)); if (n > 0 && time_buf[n-1] == '\n') n--; if (n >= 0) time_buf[n] = 0; t = make_time(time_buf); sflag = 1; } if (sflag && stime(&t) != 0) { outfd = 2; pstring("No permission to set time\n", -1); return(1); } tm = Sflag ? september(&t) : uflag ? gmtime(&t) : localtime(&t); fmtdate(format, t, tm); putchar('\n'); return(0); } /* Replacement for stdio putchar(). */ void putchar(c) int c; { static char buf[1024]; static char *bp = buf; if (c != 0) *bp++ = c; if (c == 0 || c == '\n' || bp == buf + sizeof(buf)) { write(outfd, buf, bp - buf); bp = buf; } } /* Internal function that prints a n-digits number. Replaces stdio in our * specific case. */ void pldecimal(d, digits) unsigned long d; int digits; { digits--; if (d > 9 || digits > 0) pldecimal(d / 10, digits); putchar('0' + (d % 10)); } void pdecimal(d, digits) int d, digits; { pldecimal((unsigned long) d, digits); } /* Internal function that prints a fixed-size string. Replaces stdio in our * specific case. */ void pstring(s, len) char *s; int len; { while (*s) if (len--) putchar(*s++); else break; } /* Format the date, using the given locale string. A special case is the * TZ which might be a sign followed by four digits (New format time zone). */ void fmtdate(format, t, p) char *format; time_t t; struct tm *p; { int i; char *s; static char *wday[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; static char *month[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; while (*format) if (*format == '%') { switch (*++format) { case 'A': pstring(wday[p->tm_wday], -1); break; case 'B': pstring(month[p->tm_mon], -1); break; case 'D': pdecimal(p->tm_mon + 1, 2); putchar('/'); pdecimal(p->tm_mday, 2); putchar('/'); case 'y': pdecimal(p->tm_year % 100, 2); break; case 'H': pdecimal(p->tm_hour, 2); break; case 'I': i = p->tm_hour % 12; pdecimal(i ? i : 12, 2); break; case 'M': pdecimal(p->tm_min, 2); break; case 'X': case 'T': pdecimal(p->tm_hour, 2); putchar(':'); pdecimal(p->tm_min, 2); putchar(':'); case 'S': pdecimal(p->tm_sec, 2); break; case 'U': pdecimal((p->tm_yday - p->tm_wday + 13) / 7, 2); break; case 'W': if (--(p->tm_wday) < 0) p->tm_wday = 6; pdecimal((p->tm_yday - p->tm_wday + 13) / 7, 2); if (++(p->tm_wday) > 6) p->tm_wday = 0; break; case 'Y': pdecimal(p->tm_year + 1900, 4); break; case 'Z': if (uflag) { s = "GMT"; } else { s = (p->tm_isdst == 1) ? tzname[1] : tzname[0]; } pstring(s, strlen(s)); break; case 'a': pstring(wday[p->tm_wday], 3); break; case 'b': case 'h': pstring(month[p->tm_mon], 3); break; case 'c': if (!(s = getenv("LC_TIME"))) s = "%a %b %e %T %Z %Y"; fmtdate(s, t, p); break; case 'd': pdecimal(p->tm_mday, 2); break; case 'e': if (p->tm_mday < 10) putchar(' '); pdecimal(p->tm_mday, 1); break; case 'j': pdecimal(p->tm_yday + 1, 3); break; case 'm': pdecimal(p->tm_mon + 1, 2); break; case 'n': putchar('\n'); break; case 'p': if (p->tm_hour < 12) putchar('A'); else putchar('P'); putchar('M'); break; case 'r': fmtdate("%I:%M:%S %p", t, p); break; case 's': pldecimal((unsigned long) t, 0); break; case 't': putchar('\t'); break; case 'w': putchar('0' + p->tm_wday); break; case 'x': fmtdate("%B %e %Y", t, p); break; case '%': putchar('%'); break; case '\0': format--; } format++; } else putchar(*format++); } /* Convert a local date string into GMT time in seconds. */ time_t make_time(t) char *t; { struct tm tm; /* user specified time */ time_t now; /* current time */ int leap; /* current year is leap year */ int i; /* general index */ int fld; /* number of fields */ int f[6]; /* time fields */ static int days_per_month[2][12] = { { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }}; /* Get current time just in case */ now = time((time_t *) 0); tm = *localtime(&now); tm.tm_sec = 0; tm.tm_mon++; tm.tm_year %= 100; /* Parse the time */ #if '0'+1 != '1' || '1'+1 != '2' || '2'+1 != '3' || '3'+1 != '4' || \ '4'+1 != '5' || '5'+1 != '6' || '6'+1 != '7' || '7'+1 != '8' || '8'+1 != '9' << Code unsuitable for character collating sequence >> #endif for (fld = 0; fld < sizeof(f)/sizeof(f[0]); fld++) { if (*t == 0) break; f[fld] = 0; for (i = 0; i < 2; i++, t++) { if (*t < '0' || *t > '9') usage(); f[fld] = f[fld] * 10 + *t - '0'; } } switch (fld) { case 2: tm.tm_hour = f[0]; tm.tm_min = f[1]; break; case 3: tm.tm_hour = f[0]; tm.tm_min = f[1]; tm.tm_sec = f[2]; break; case 5: tm.tm_mon = f[0]; tm.tm_mday = f[1]; tm.tm_year = f[2]; tm.tm_hour = f[3]; tm.tm_min = f[4]; break; case 6: tm.tm_mon = f[0]; tm.tm_mday = f[1]; tm.tm_year = f[2]; tm.tm_hour = f[3]; tm.tm_min = f[4]; tm.tm_sec = f[5]; break; default: usage(); } /* Convert the time into seconds since 1 January 1970 */ if (tm.tm_year < 70) tm.tm_year += 100; leap = (tm.tm_year % 4 == 0 && tm.tm_year % 400 != 0); if (tm.tm_mon < 1 || tm.tm_mon > 12 || tm.tm_mday < 1 || tm.tm_mday > days_per_month[leap][tm.tm_mon-1] || tm.tm_hour > 23 || tm.tm_min > 59) { outfd = 2; pstring("Illegal date format\n", -1); exit(1); } /* Convert the time into Minix time - zone independent code */ { time_t utctime; /* guess at unix time */ time_t nextbit; /* next bit to try */ int rv; /* result of try */ struct tm *tmp; /* local time conversion */ #define COMPARE(a,b) ((a) != (b)) ? ((a) - (b)) : utctime = 1; do { nextbit = utctime; utctime = nextbiM��M��M������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t << 1; } while (utctime >= 1); for (utctime = 0; ; nextbit >>= 1) { utctime |= nextbit; tmp = localtime(&utctime); if (tmp == 0) continue; rv = COMPARE(tmp->tm_year, tm.tm_year) COMPARE(tmp->tm_mon + 1, tm.tm_mon) COMPARE(tmp->tm_mday, tm.tm_mday) COMPARE(tmp->tm_hour, tm.tm_hour) COMPARE(tmp->tm_min, tm.tm_min) COMPARE(tmp->tm_sec, tm.tm_sec) 0; if (rv > 0) utctime &= ~nextbit; else if (rv == 0) break; if (nextbit == 0) { uflag = 1; outfd = 2; pstring("Inexact conversion to UTC from ", -1); fmtdate("%c\n", utctime, localtime(&utctime) ); exit(1); } } return utctime; } } /* Correct the time to the reckoning of Eternal September. */ struct tm *september(tp) time_t *tp; { time_t t; int days; struct tm *tm; tm = localtime(tp); t = *tp - (tm->tm_hour - 12) * 3600L; /* No zone troubles around noon. */ days = 0; while (tm->tm_year > 93 || (tm->tm_year == 93 && tm->tm_mon >= 8)) { /* Step back a year or a month. */ days += tm->tm_year > 93 ? tm->tm_yday+1 : tm->tm_mday; t = *tp - days * 24 * 3600L; tm = localtime(&t); } if (days > 0) { tm = localtime(tp); tm->tm_mday = days; tm->tm_year = 93; tm->tm_mon = 8; #if SANITY t = mktime(tm); tm = localtime(&t); #endif } return tm; } /* (Extended) Posix prototype of date. */ void usage() { outfd = 2; pstring("Usage: date [-qsuS] [-r seconds] [[MMDDYY]hhmm[ss]] [+format]\n", -1); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dd - disk dumper */ #include <sys/types.h> #include <sys/stat.h> #include <signal.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <errno.h> #define EOS '\0' #define BOOLEAN int #define TRUE 1 #define FALSE 0 char *pch, *errorp; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(BOOLEAN is, (char *pc)); _PROTOTYPE(int num, (void)); _PROTOTYPE(void puto, (void)); _PROTOTYPE(void statistics, (void)); _PROTOTYPE(int ulcase, (int c)); _PROTOTYPE(void cnull, (int c)); _PROTOTYPE(void null, (int c)); _PROTOTYPE(void extra, (void)); _PROTOTYPE(void over, (int dummy)); BOOLEAN is(pc) char *pc; { register char *ps = pch; while (*ps++ == *pc++) if (*pc == EOS) { pch = ps; return(TRUE); } return(FALSE); } #define BIGNUM 2147483647 int num() { long ans; register char *pc; pc = pch; ans = 0L; while ((*pc >= '0') && (*pc <= '9')) ans = (long) ((*pc++ - '0') + (ans * 10)); while (TRUE) switch (*pc++) { case 'w': ans *= 2L; continue; case 'b': ans *= 512L; continue; case 'k': ans *= 1024L; continue; case 'x': pch = pc; ans *= (long) num(); case EOS: if ((ans >= BIGNUM) || (ans < 0)) { fprintf(stderr, "dd: argument %s out of range\n", errorp); exit(1); } return((int) ans); } } #define SWAB 0x0001 #define LCASE 0x0002 #define UCASE 0x0004 #define NOERROR 0x0008 #define SYNC 0x0010 #define SILENT 0x0020 #define BLANK ' ' #define DEFAULT 512 unsigned cbs, bs, skip, nseek, count; int seekseen = FALSE; unsigned ibs = DEFAULT; unsigned obs = DEFAULT; unsigned files = 1; char *ifilename = NULL; char *ofilename = NULL; int convflag = 0; int flag = 0; int ifd, ofd, ibc; char *ibuf, *obuf, *op; unsigned nifull, nipartial, nofull, nopartial; int cbc; unsigned ntr, obc; int ns; char mlen[] = {64, 45, 82, 45, 83, 96, 109, 100, 109, 97, 96, 116, 108, 9}; void puto() { int n; if (obc == 0) return; if (obc == obs) nofull++; else nopartial++; if ((n = write(ofd, obuf, obc)) != obc) { if (n == -1) { fprintf(stderr, "dd: Write error: %s\n", strerror(errno)); } else { fprintf(stderr, "dd: Short write, %d instead of %d\n", n, obc); } exit(1); } obc = 0; } void statistics() { if (convflag & SILENT) return; fprintf(stderr, "%u+%u records in\n", nifull, nipartial); fprintf(stderr, "%u+%u records out\n", nofull, nopartial); if (ntr) fprintf(stderr, "%d truncated records\n", ntr); } int main(argc, argv) int argc; char *argv[]; { #ifdef __STDC__ void (*convert) (int); #else void (*convert) (); #endif char *iptr; int i, j; convert = null; argc--; argv++; while (argc-- > 0) { pch = *(argv++); if (is("ibs=")) { errorp = pch; ibs = num(); continue; } if (is("obs=")) { errorp = pch; obs = num(); continue; } if (is("bs=")) { errorp = pch; bs = num(); continue; } if (is("if=")) { ifilename = pch; continue; } if (is("of=")) { ofilename = pch; continue; } if (is("skip=")) { errorp = pch; skip = num(); continue; } if (is("seek=")) { errorp = pch; nseek = num(); seekseen = TRUE; continue; } if (is("count=")) { errorp = pch; count = num(); continue; } if (is("files=")) { errorp = pch; files = num(); continue; } if (is("length=")) { errorp = pch; for (j = 0; j < 13; j++) mlen[j]++; write(2, mlen, 14); continue; } if (is("conv=")) { while (*pch != EOS) { if (is("lcase")) { convflag |= LCASE; continue; } if (is("ucase")) { convflag |= UCASE; continue; } if (is("noerror")) { convflag |= NOERROR; continue; } if (is("sync")) { convflag |= SYNC; continue; } if (is("swab")) { convflag |= SWAB; continue; } if (is("silent")) { convflag |= SILENT; continue; } if (is(",")) continue; fprintf(stderr, "dd: bad argument: %s\n", pch); exit(1); } if (*pch == EOS) continue; } fprintf(stderr, "dd: bad argument: %s\n", pch); exit(1); } if ((convert == null) && (convflag & (UCASE | LCASE))) convert = cnull; if ((ifd = ((ifilename) ? open(ifilename, O_RDONLY) : dup(0))) < 0) { fprintf(stderr, "dd: Can't open %s: %s\n", (ifilename) ? ifilename : "stdin", strerror(errno)); exit(1); } if ((ofd = ((ofilename) ? open(ofilename, seekseen ? O_WRONLY | O_CREAT : O_WRONLY | O_CREAT | O_TRUNC, 0666) : dup(1))) < 0) { fprintf(stderr, "dd: Can't open %s: %s\n", (ofilename) ? ofilename : "stdout", strerror(errno)); exit(1); } if (bs) { ibs = obs = bs; if (convert == null) flag++; } if (ibs == 0) { fprintf(stderr, "dd: ibs cannot be zero\n"); exit(1); } if (obs == 0) { fprintf(stderr, "dd: obs cannot be zero\n"); exit(1); } if ((ibuf = sbrk(ibs)) == (char *) -1) { fprintf(stderr, "dd: not enough memory\n"); exit(1); } if ((obuf = (flag) ? ibuf : sbrk(obs)) == (char *) -1) { fprintf(stderr, "dd: not enough memory\n"); exit(1); } ibc = obc = cbc = 0; op = obuf; if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, over); if (skip != 0) { struct stat st; if (fstat(ifd,&st) < 0 || !(S_ISREG(st.st_mode) || S_ISBLK(st.st_mode)) || lseek(ifd, (off_t) ibs * (off_t) skip, SEEK_SET) == (off_t) -1) { do { if (read(ifd, ibuf, ibs) == -1) { fprintf(stderr, "dd: Error skipping input: %s\n", strerror(errno)); exit(1); } } while (--skip != 0); } } if (nseek != 0) { if (lseek(ofd, (off_t) obs * (off_t) nseek, SEEK_SET) == (off_t) -1) { fprintf(stderr, "dd: Seeking on output failed: %s\n", strerror(errno)); exit(1); } } outputall: if (ibc-- == 0) { ibc = 0; if ((count == 0) || ((nifull + nipartial) != count)) { if (convflag & (NOERROR | SYNC)) for (iptr = ibuf + ibs; iptr > ibuf;) *--iptr = 0; ibc = read(ifd, ibuf, ibs); } if (ibc == -1) { fprintf(stderr, "dd: Read error: %s\n", strerror(errno)); if ((convflag & NOERROR) == 0) { puto(); over(0); } ibc = 0; for (i = 0; i < ibs; i++) if (ibuf[i] != 0) ibc = i; statistics(); } if ((ibc == 0) && (--files <= 0)) { puto(); over(0); } if (ibc != ibs) { nipartial++; if (convflag & SYNC) ibc = ibs; } else nifull++; iptr = ibuf; i = ibc >> 1; if ((convflag & SWAB) && i) do { int temp; temp = *iptr++; iptr[-1] = *iptr; *iptr++ = temp; } while (--i); iptr = ibuf; if (flag) { obc = ibc; puto(); ibc = 0; } goto outputall; } i = *iptr++ & 0377; (*convert) (i); goto outputall; } int ulcase(c) int c; { int ans = c; if ((convflag & UCASE) && (c >= 'a') && (c <= 'z')) ans += 'A' - 'a'; if ((convflag & LCASE) && (c >= 'A') && (c <= 'Z')) ans += 'a' - 'A'; return(ans); } void cnull(c) int c; { c = ulcase(c); null(c); } void null(c) int c; { *op++ = c; if (++obc >= obs) { puto(); op = obuf; } } void extra() { if (++cbc >= cbs) { null('\n'); cbc = 0; ns = 0; } } void over(sig) int sig; { statistics(); if (sig != 0) { signal(sig, SIG_DFL); raise(sig); } exit(0); } �����������������������������������������������������������������������������/* decomp16: decompress 16bit compressed files on a 16bit Intel processor * * Version 1.3 of 25 Mar 92. * * This was written by John N. White on 6/30/91 and is Public Domain. * Patched to run under news by Will Rose, Feb 92. * J N White's (earlier) patches added by Will Rose, 20 Feb 92. * Unsigned int increment/wrap bug fixed by Will Rose, 24 Mar 92. * Argument bug fixed, stdio generalised by Will Rose, 25 Mar 92. * * decomp16 can use as as little as 512 bytes of stack; since it forks * four additional copies, it's probably worth using minimum stack rather * than the 8192 byte Minix default. To reduce memory still further, * change BUFSZ below to 256; it is currently set to 1024 for speed. The * minimal decomp16 needs about 280k to run in pipe mode (56k per copy). * * This program acts as a filter: * decomp16 < compressed_file > decompressed_file * The arguments -0 to -4 run only the corresponding pass. * Thus: * decomp16 -4 < compressed_file > 3; * decomp16 -3 < 3 > 2; * decomp16 -2 < 2 > 1; * decomp16 -1 < 1 > 0; * decomp16 -0 < 0 > decompressed_file * will also work, as will connecting the passes by explicit pipes if * there is enough memory to do so. File name arguments can also be * given directly on the command line. * * Compress uses a modified LZW compression algorithm. A compressed file * is a set of indices into a dictionary of strings. The number of bits * used to store each index depends on the number of entries currently * in the dictionary. If there are between 257 and 512 entries, 9 bits * are used. With 513 entries, 10 bits are used, etc. The initial dictionary * consists of 0-255 (which are the corresponding chars) and 256 (which * is a special CLEAR code). As each index in the compressed file is read, * a new entry is added to the dictionary consisting of the current string * with the first char of the next string appended. When the dictionary * is full, no further entries are added. If a CLEAR code is received, * the dictionary will be completely reset. The first two bytes of the * compressed file are a magic number, and the third byte indicates the * maximum number of bits, and whether the CLEAR code is used (older versions * of compress didn't have CLEAR). * * This program works by forking four more copies of itself. The five * programs form a pipeline. Copy 0 writes to stdout, and forks copy 1 * to supply its input, which in turn forks and reads from copy 2, etc. * This sequence is used so that when the program exits, all writes * are completed and a program that has exec'd uncompress (such as news) * can immediately use the uncompressed data when the wait() call returns. * * If given a switch -#, where # is a digit from 0 to 4 (example: -2), the * program will run as that copy, reading from stdin and writing to stdout. * This allows decompressing with very limited RAM because only one of the * five passes is in memory at a time. * * The compressed data is a series of string indices (and a header at * the beginning and an occasional CLEAR code). As these indices flow * through the pipes, each program decodes the ones it can. The result * of each decoding will be indices that the following programs can handle. * * Each of the 65536 strings in the dictionary is an earlier string with * some character added to the end (except for the the 256 predefined * single char strings). When new entries are made to the dictionary, * the string index part will just be the last index to pass through. * But the char part is the first char of the next string, which isn't * known yet. So the string can be stored as a pair of indices. When * this string is specified, it is converted to this pair of indices, * which are flagged so that the first will be decoded in full while * the second will be decoded to its first char. The dictionary takes * 256k to store (64k strings of 2 indices of 2 bytes each). This is * too big for a 64k data segment, so it is divided into 5 equal parts. * Copy 4 of the program maintains the high part and copy 0 holds the * low part. */ #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #define BUFSZ 1024 /* size of i/o buffers */ #define BUFSZ_2 (BUFSZ/2) /* # of unsigned shorts in i/o bufs */ #define DICTSZ (unsigned)13056 /* # of local dictionary entries */ #define EOF_INDEX (unsigned short)0xFFFF /* EOF flag for pipeline */ #define FALSE 0 #define TRUE ~FALSE int fdin, fdout, fderr; /* input, output, and error file descriptors */ int ibufstart, obufind, ibufend;/* i/o buffer indices */ int ipbufind = BUFSZ_2; /* pipe buffer indices */ int opbufind = 0; int pnum = -1; /* ID of this copy */ unsigned short ipbuf[BUFSZ_2]; /* for buffering input */ unsigned short opbuf[BUFSZ_2]; /* for buffering output */ unsigned char *ibuf = (unsigned char *) ipbuf; unsigned char *obuf = (unsigned char *) opbuf; unsigned short dindex[DICTSZ]; /* dictionary: index to substring */ unsigned short dchar[DICTSZ]; /* dictionary: last char of string */ unsigned iindex, tindex, tindex2; /* holds index being processed */ unsigned base; /* where in global dict local dict starts */ unsigned tbase; unsigned locend; /* where in global dict local dict ends */ unsigned curend = 256; /* current end of global dict */ unsigned maxend; /* max end of global dict */ int dcharp; /* ptr to dchar that needs next index entry */ int curbits; /* number of bits for getbits() to read */ int maxbits; /* limit on number of bits */ int clearflg; /* if set, allow CLEAR */ int inmod; /* mod 8 for getbits() */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void ffork, (void)); _PROTOTYPE(void die, (char *s)); _PROTOTYPE(void myputc, (unsigned c)); _PROTOTYPE(unsigned mygetc, (void)); _PROTOTYPE(void getbits, (void)); _PROTOTYPE(void getpipe, (void)); _PROTOTYPE(void putpipe, (unsigned u, int flag)); int main(argc, argv) int argc; char **argv; { char c, *cp; int j, k, fdtmp; unsigned int len; /* Find the program name */ j = 0; while (argv[0][j] != '\0') j++; len = (unsigned int) j; while (j--) if (argv[0][j] == '/') break; if (argv[0][j] == '/') j++; cp = argv[0] + j; len -= j; /* Sort out the flags */ for (k = 1; k < argc; k++) { if (argv[k][0] == '-') { c = argv[k][1]; switch (c) { case '0': /* pass numbers */ case '1': case '2': case '3': case '4': pnum = c - '0'; break; case 'd': /* used by news */ break; default: (void) write(1, "Usage: ", 7); (void) write(1, cp, len); (void) write(1, " [-#] [in] [out]\n", 17); exit(0); break; } /* Once it's checked, lose it anyway */ for (j = k; j < argc; j++) argv[j] = argv[j + 1]; argc--; k--; } } /* Default i/o settings */ fdin = 0; fdout = 1; fderr = 2; /* Try to open specific files and connect them to stdin/stdout */ if (argc > 1) { if ((fdtmp = open(argv[1], 0)) == -1) die("input open failed"); (void) close(0); if ((fdin = dup(fdtmp)) == -1) die("input dup failed\n"); (void) close(fdtmp); } if (argc > 2) { (void) unlink(argv[2]); if ((fdtmp = creat(argv[2], 0666)) == -1) die("output creat failed"); (void) close(1); if ((fdout = dup(fdtmp)) == -1) die("output dup failed\n"); (void) close(fdtmp); } /* Sort out type of compression */ if (pnum == -1 || pnum == 4) {/* if this is pass 4 */ /* Check header of compressed file */ if (mygetc() != 0x1F || mygetc() != 0x9D) /* check magic number */ die("not a compressed file\n"); iindex = mygetc(); /* get compression style */ } else getpipe(); /* get compression style */ maxbits = iindex & 0x1F; clearflg = ((iindex & 0x80) != 0) ? TRUE : FALSE; if (maxbits < 9 || maxbits > 16) /* check for valid maxbits */ die("can't decompress\n"); if (pnum != -1 && pnum != 0) putpipe(iindex, 0); /* pass style to next copy */ /* Fork off an ancestor if necessary - ffork() increments pnum */ if (pnum == -1) { pnum = 0; if (pnum == 0) ffork(); if (pnum == 1) ffork(); if (pnum == 2) ffork(); if (pnum == 3) ffork(); } /* Preliminary inits. Note: end/maxenM��M��M��M��M��M��M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d/curend are highest, not * highest + 1 */ base = DICTSZ * pnum + 256; locend = base + DICTSZ - 1; maxend = (1 << maxbits) - 1; if (maxend > locend) maxend = locend; while (TRUE) { curend = 255 + (clearflg ? 1 : 0); /* init dictionary */ dcharp = DICTSZ; /* flag for none needed */ curbits = 9; /* init curbits (for copy 0) */ while (TRUE) { /* for each index in input */ if (pnum == 4) {/* get index using getbits() */ if (curbits < maxbits && (1 << curbits) <= curend) { /* Curbits needs to be increased */ /* Due to uglyness in compress, these * indices in the compressed file are * wasted */ while (inmod) getbits(); curbits++; } getbits(); } else getpipe(); /* get next index */ if (iindex == 256 && clearflg) { if (pnum > 0) putpipe(iindex, 0); /* Due to uglyness in compress, these indices * in the compressed file are wasted */ while (inmod) getbits(); break; } tindex = iindex; /* Convert the index part, ignoring spawned chars */ while (tindex >= base) tindex = dindex[tindex - base]; /* Pass on the index */ putpipe(tindex, 0); /* Save the char of the last added entry, if any */ if (dcharp < DICTSZ) dchar[dcharp++] = tindex; if (curend < maxend && ++curend > (base - 1)) dindex[dcharp = (curend - base)] = iindex; /* Do spawned chars. They are naturally produced in * the wrong order. To get them in the right order * without using memory, a series of passes, * progressively less deep, are used */ tbase = base; while ((tindex = iindex) >= tbase) {/* for each char to spawn*/ while ((tindex2 = dindex[tindex - base]) >= tbase) tindex = tindex2; /* scan to desired char */ putpipe(dchar[tindex-base], 1); /* put it to the pipe*/ tbase = tindex + 1; if (tbase == 0) break; /* it's a wrap */ } } } } /* F f o r k * * Fork off the previous pass - the parent reads from the child. */ void ffork() { int j, pfd[2]; if (pipe(pfd) == -1) die("pipe() error\n"); if ((j = fork()) == -1) die("fork() error\n"); if (j == 0) { /* this is the child */ if (close(1) == -1) die("close(1) error\n"); if (dup(pfd[1]) != 1) die("dup(1) error\n"); (void) close(pfd[0]); pnum++; } else { /* this is the parent */ if (close(0) == -1) die("close(0) error\n"); if (dup(pfd[0]) != 0) die("dup(0) error\n"); (void) close(pfd[1]); } } /* D i e * * If s is a message, write it to stderr. Flush buffers if needed. Then exit. */ void die(s) char *s; { /* Flush stdout buffer if needed */ if (obufind != 0) { if (write(fdout, (char *) obuf, (unsigned) obufind) != obufind) s = "bad stdout write\n"; obufind = 0; } /* Flush pipe if needed */ do putpipe(EOF_INDEX, 0); while (opbufind); /* Write any error message */ if (s != (char *) NULL) { while (*s) (void) write(fderr, s++, 1); } exit((s == (char *) NULL) ? 0 : 1); } /* M p u t c * * Put a char to stdout. */ void myputc(c) unsigned c; { obuf[obufind++] = c; if (obufind >= BUFSZ) { /* if stdout buffer full */ if (write(fdout, (char *) obuf, BUFSZ) != BUFSZ) /* flush to stdout */ die("bad stdout write\n"); obufind = 0; } } /* M y g e t c * * Get a char from stdin. If EOF, then die() and exit. */ unsigned mygetc() { if (ibufstart >= ibufend) { /* if stdin buffer empty */ if ((ibufend = read(fdin, (char *) ibuf, BUFSZ)) <= 0) die((char *) NULL); /* if EOF, do normal exit */ ibufstart = 0; } return(ibuf[ibufstart++] & 0xff); } /* G e t b i t s * * Put curbits bits into index from stdin. Note: only copy 4 uses this. * The bits within a byte are in the correct order. But when the bits * cross a byte boundry, the lowest bits will be in the higher part of * the current byte, and the higher bits will be in the lower part of * the next byte. */ void getbits() { int have; static unsigned curbyte; /* byte having bits extracted from it */ static int left; /* how many bits are left in curbyte */ inmod = (inmod + 1) & 7; /* count input mod 8 */ iindex = curbyte; have = left; if (curbits - have > 8) { iindex |= mygetc() << have; have += 8; } iindex |= ((curbyte = mygetc()) << have) & ~((unsigned) 0xFFFF << curbits); curbyte >>= curbits - have; left = 8 - (curbits - have); } /* G e t p i p e * * Get an index from the pipeline. If flagged firstonly, handle it here. */ void getpipe() { static short flags; static int n = 0; /* number of flags in flags */ while (TRUE) { /* while index with firstonly flag set */ if (n <= 0) { if (ipbufind >= BUFSZ_2) { /* if pipe input buffer * empty */ if (read(fdin, (char *) ipbuf, BUFSZ) != BUFSZ) die("bad pipe read\n"); ipbufind = 0; } flags = ipbuf[ipbufind++]; n = 15; } iindex = ipbuf[ipbufind++]; if (iindex > curend) die((iindex == EOF_INDEX) ? (char *) NULL : "invalid data\n"); flags <<= 1; n--; /* Assume flags < 0 if highest remaining flag is set */ if (flags < 0) { /* if firstonly flag for index is not set */ while (iindex >= base) iindex = dindex[iindex - base]; putpipe(iindex, 1); } else return; /* return with valid non-firstonly index */ } } /* P u t p i p e * * put an index into the pipeline. */ void putpipe(u, flag) unsigned u; int flag; { static unsigned short flags, *flagp; static int n = 0; /* number of flags in flags */ if (pnum == 0) { /* if we should write to stdout */ myputc(u); /* index will be the char value */ return; } if (n == 0) { /* if we need to reserve a flag entry */ flags = 0; flagp = opbuf + opbufind; opbufind++; } opbuf[opbufind++] = u; /* add index to buffer */ flags = (flags << 1) | flag; /* add firstonly flag */ if (++n >= 15) { /* if block of 15 indices */ n = 0; *flagp = flags; /* insert flags entry */ if (opbufind >= BUFSZ_2) { /* if pipe out buffer full */ opbufind = 0; if (write(fdout, (char *) opbuf, BUFSZ) != BUFSZ) die("bad pipe write\n"); } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* df - disk free block printout Author: Andy Tanenbaum * * 91/04/30 Kees J. Bot (kjb@cs.vu.nl) * Map filename arguments to the devices they live on. * Changed output to show percentages. * * 92/12/12 Kees J. Bot * Posixized. (Almost, the normal output is in kilobytes, it should * be 512-byte units. 'df -P' and 'df -kP' are as it should be.) */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <fcntl.h> #include <errno.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> #if __minix_vmd #include <sys/mnttab.h> #else #include <minix/minlib.h> #endif #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include <fs/const.h> #include <fs/type.h> #include <fs/super.h> #undef printf #if !__minix_vmd /* Map Minix-vmd names to Minix names. */ #define v12_super_block super_block #define SUPER_V1 SUPER_MAGIC /* Only setuid() and setgid(). */ #define seteuid(uid) setuid(uid) #define setegid(gid) setgid(gid) #endif #define ISDISK(mode) S_ISBLK(mode) /* || S_ISCHR for raw device??? */ extern int errno; char MTAB[] = "/etc/mtab"; struct mtab { /* List of mounted devices from /etc/mtab. */ struct mtab *next; dev_t device; char *devname; char *mountpoint; } *mtab= NULL; struct mtab *searchtab(char *name); void readmtab(char *type); int df(const struct mtab *mt); bit_t bit_count(unsigned blocks, bit_t bits, int fd); int iflag= 0; /* Focus on inodes instead of blocks. */ int Pflag= 0; /* Posix standard output. */ int kflag= 0; /* Output in kilobytes instead of 512 byte units for -P. */ int istty; /* isatty(1) */ uid_t ruid, euid; /* To sometimes change identities. */ gid_t rgid, egid; void usage(void) { fprintf(stderr, "Usage: df [-ikP] [-t type] [device]...\n"); exit(1); } int main(int argc, char *argv[]) { int i; struct mtab *mt; char *type= "dev"; int ex= 0; while (argc > 1 && argv[1][0] == '-') { char *opt= argv[1]+1; while (*opt != 0) { switch (*opt++) { case 'i': iflag= 1; break; case 'k': kflag= 1; break; case 'P': Pflag= 1; break; case 't': if (argc < 3) usage(); type= argv[2]; argv++; argc--; break; default: usage(); } } argc--; argv++; } istty= isatty(1); ruid= getuid(); euid= geteuid(); rgid= getgid(); egid= getegid(); readmtab(type); if (Pflag) { printf(!iflag ? "\ Filesystem %4d-blocks Used Available Capacity Mounted on\n" : "\ Filesystem Inodes IUsed IFree %%IUsed Mounted on\n", kflag ? 1024 : 512); } else { printf("%s\n", !iflag ? "\ Filesystem 1k-Blocks free used % FUsed% Mounted on" : "\ Filesystem Files free used % BUsed% Mounted on" ); } if (argc == 1) { for (mt= mtab; mt != NULL; mt= mt->next) ex |= df(mt); } else { for (i = 1; i < argc; i++) ex |= df(searchtab(argv[i])); } exit(ex); } void readmtab(char *type) /* Turn the mounted file table into a list. */ { struct mtab **amt= &mtab, *new; struct stat st; #if __minix_vmd char *devname, *mountpoint; FILE *mtf; struct mnttab mte, look; if ((mtf= fopen(MTAB, "r")) == NULL) { fprintf(stderr, "df: can't open %s\n", MTAB); return; } look.mnt_special= NULL; look.mnt_mountp= NULL; look.mnt_fstype= type; look.mnt_mntopts= NULL; while (getmntany(mtf, &mte, &look) >= 0) { devname= mte.mnt_special; mountpoint= mte.mnt_mountp; /* Skip bad entries, can't complain about everything. */ if (stat(devname, &st) < 0 || !ISDISK(st.st_mode)) continue; /* Make new list cell. */ if ((new= (struct mtab *) malloc(sizeof(*new))) == NULL || (new->devname= (char *) malloc(strlen(devname) + 1)) == NULL || (new->mountpoint= (char *) malloc(strlen(mountpoint) + 1)) == NULL ) break; new->device= st.st_rdev; strcpy(new->devname, devname); strcpy(new->mountpoint, mountpoint); *amt= new; /* Add the cell to the end. */ amt= &new->next; *amt= NULL; } fclose(mtf); #else /* __minix */ char devname[128], mountpoint[128], version[10], rw_flag[10]; if (load_mtab("df") < 0) exit(1); while (get_mtab_entry(devname, mountpoint, version, rw_flag), devname[0] != 0) { if (strcmp(type, "dev") == 0) { if (strcmp(version, "1") != 0 && strcmp(version, "2") != 0) continue; } else { if (strcmp(type, version) != 0) continue; } /* Skip bad entries, can't complain about everything. */ if (stat(devname, &st) < 0 || !ISDISK(st.st_mode)) continue; /* Make new list cell. */ if ((new= (struct mtab *) malloc(sizeof(*new))) == NULL || (new->devname= (char *) malloc(strlen(devname) + 1)) == NULL || (new->mountpoint= (char *) malloc(strlen(mountpoint) + 1)) == NULL ) break; new->device= st.st_rdev; strcpy(new->devname, devname); strcpy(new->mountpoint, mountpoint); *amt= new; /* Add the cell to the end. */ amt= &new->next; *amt= NULL; } #endif } struct mtab *searchtab(char *name) /* See what we can do with a user supplied name, there are five possibilities: * 1. It's a device and it is in the mtab: Return mtab entry. * 2. It's a device and it is not in the mtab: Return device mounted on "". * 3. It's a file and lives on a device in the mtab: Return mtab entry. * 4. It's a file and it's not on an mtab device: Search /dev for the device * and return this device as mounted on "???". * 5. It's junk: Return something df() will choke on. */ { static struct mtab unknown; static char devname[5 + NAME_MAX + 1]= "/dev/"; struct mtab *mt; struct stat st; DIR *dp; struct dirent *ent; unknown.devname= name; unknown.mountpoint= ""; if (stat(name, &st) < 0) return &unknown; /* Case 5. */ unknown.device= ISDISK(st.st_mode) ? st.st_rdev : st.st_dev; for (mt= mtab; mt != NULL; mt= mt->next) { if (unknown.device == mt->device) return mt; /* Case 1 & 3. */ } if (ISDISK(st.st_mode)) { return &unknown; /* Case 2. */ } if ((dp= opendir("/dev")) == NULL) return &unknown; /* Disaster. */ while ((ent= readdir(dp)) != NULL) { if (ent->d_name[0] == '.') continue; strcpy(devname + 5, ent->d_name); if (stat(devname, &st) >= 0 && ISDISK(st.st_mode) && unknown.device == st.st_rdev ) { unknown.devname= devname; unknown.mountpoint= "???"; break; } } closedir(dp); return &unknown; /* Case 4. */ } /* (num / tot) in percentages rounded up. */ #define percent(num, tot) ((int) ((100L * (num) + ((tot) - 1)) / (tot))) /* One must be careful printing all these _t types. */ #define L(n) ((long) (n)) int df(const struct mtab *mt) { int fd; bit_t i_count, z_count; block_t totblocks, busyblocks; int n; struct v12_super_block super, *sp; /* Don't allow Joe User to df just any device. */ seteuid(*mt->mountpoint == 0 ? ruid : euid); setegid(*mt->mountpoint == 0 ? rgid : egid); if ((fd = open(mt->devname, O_RDONLY)) < 0) { fprintf(stderr, "df: %s: %s\n", mt->devname, strerror(errno)); return(1); } lseek(fd, (off_t) BLOCK_SIZE, SEEK_SET); /* skip boot block */ if (read(fd, (char *) &super, sizeof(super)) != (int) sizeof(super)) { fprintf(stderr, "df: Can't read super block of %s\n", mt->devname); close(fd); return(1); } lseek(fd, (off_t) BLOCK_SIZE * 2L, SEEK_SET); /* skip rest of super block */ sp = &super; if (sp->s_magic != SUPER_V1 && sp->s_magic != SUPER_V2) { fprintf(stderr, "df: %s: Not a valid file system\n", mt->devname); close(fd); return(1); } if (sp->s_magic == SUPER_V1) sp->s_zones= sp->s_nzones; i_count = bit_count(sp->s_imap_blocks, (bit_t) (sp->s_ninodes+1), fd); if (i_count == -1) { fprintf(stderr, "df: Can't find bit maps of %s\n", mt->devname); close(fd); return(1); } i_count--; /* There is no inode 0. */ /* The first bit in the zone map corresponds with zone s_firstdatazone - 1 * This means that there are s_zones - (s_firstdatazone - 1) bits in the map */ z_count = bit_count(sp->s_zmap_blocks, (bit_t) (sp->s_zones - (sp->s_firstdatazone - 1)), fd); if (z_count == -1) { fprintf(stderr, "df: Can't find bit maps of %s\n", mt->devname); close(fd); return(1); } /* Don't forget those zones before sp->sM���N��N��N��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������_firstdatazone - 1 */ z_count += sp->s_firstdatazone - 1; #ifdef __minix_vmd totblocks = sp->s_zones; busyblocks = z_count; #else totblocks = (block_t) sp->s_zones << sp->s_log_zone_size; busyblocks = (block_t) z_count << sp->s_log_zone_size; #endif /* Print results. */ printf("%s", mt->devname); n= strlen(mt->devname); if (n > 15 && istty) { putchar('\n'); n= 0; } while (n < 15) { putchar(' '); n++; } if (!Pflag && !iflag) { printf(" %7ld %7ld %7ld %3d%% %3d%% %s\n", L(totblocks), /* Blocks */ L(totblocks - busyblocks), /* free */ L(busyblocks), /* used */ percent(busyblocks, totblocks), /* % */ percent(i_count, sp->s_ninodes), /* FUsed% */ mt->mountpoint /* Mounted on */ ); } if (!Pflag && iflag) { printf(" %7ld %7ld %7ld %3d%% %3d%% %s\n", L(sp->s_ninodes), /* Files */ L(sp->s_ninodes - i_count), /* free */ L(i_count), /* used */ percent(i_count, sp->s_ninodes), /* % */ percent(busyblocks, totblocks), /* BUsed% */ mt->mountpoint /* Mounted on */ ); } if (Pflag && !iflag) { if (!kflag) { /* 512-byte units please. */ totblocks *= 2; busyblocks *= 2; } printf(" %7ld %7ld %7ld %4d%% %s\n", L(totblocks), /* Blocks */ L(busyblocks), /* Used */ totblocks - busyblocks, /* Available */ percent(busyblocks, totblocks), /* Capacity */ mt->mountpoint /* Mounted on */ ); } if (Pflag && iflag) { printf(" %7ld %7ld %7ld %4d%% %s\n", L(sp->s_ninodes), /* Inodes */ L(i_count), /* IUsed */ L(sp->s_ninodes - i_count), /* IAvail */ percent(i_count, sp->s_ninodes), /* Capacity */ mt->mountpoint /* Mounted on */ ); } close(fd); return(0); } bit_t bit_count(unsigned blocks, bit_t bits, int fd) { char *wptr; int i, b; bit_t busy; char *wlim; static char buf[BLOCK_SIZE]; static char bits_in_char[1 << CHAR_BIT]; /* Precalculate bitcount for each char. */ if (bits_in_char[1] != 1) { for (b = (1 << 0); b < (1 << CHAR_BIT); b <<= 1) for (i = 0; i < (1 << CHAR_BIT); i++) if (i & b) bits_in_char[i]++; } /* Loop on blocks, reading one at a time and counting bits. */ busy = 0; for (i = 0; i < blocks && bits != 0; i++) { if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) return(-1); wptr = &buf[0]; if (bits >= CHAR_BIT * BLOCK_SIZE) { wlim = &buf[BLOCK_SIZE]; bits -= CHAR_BIT * BLOCK_SIZE; } else { b = bits / CHAR_BIT; /* whole chars in map */ wlim = &buf[b]; bits -= b * CHAR_BIT; /* bits in last char, if any */ b = *wlim & ((1 << bits) - 1); /* bit pattern from last ch */ busy += bits_in_char[b]; bits = 0; } /* Loop on the chars of a block. */ while (wptr != wlim) busy += bits_in_char[*wptr++ & ((1 << CHAR_BIT) - 1)]; } return(busy); } /* * $PchId: df.c,v 1.7 1998/07/27 18:42:17 philip Exp $ */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dhrystone - benchmark program */ #define REGISTER /* * * "DHRYSTONE" Benchmark Program * * Version: C/1.1, 12/01/84 * * Date: PROGRAM updated 01/06/86, COMMENTS changed 01/31/87 * * Author: Reinhold P. Weicker, CACM Vol 27, No 10, 10/84 pg.1013 * Translated from ADA by Rick Richardson * Every method to preserve ADA-likeness has been used, * at the expense of C-ness. * * Compile: cc -O dry.c -o drynr : No registers * cc -O -DREG=register dry.c -o dryr : Registers * * Defines: Defines are provided for old C compiler's * which don't have enums, and can't assign structures. * The time(2) function is library dependant; Most * return the time in seconds, but beware of some, like * Aztec C, which return other units. * The LOOPS define is initially set for 50000 loops. * If you have a machine with large integers and is * very fast, please change this number to 500000 to * get better accuracy. Please select the way to * measure the execution time using the TIME define. * For single user machines, time(2) is adequate. For * multi-user machines where you cannot get single-user * access, use the times(2) function. Be careful to * adjust the HZ parameter below for the units which * are returned by your times(2) function. You can * sometimes find this in <sys/param.h>. If you have * neither time(2) nor times(2), use a stopwatch in * the dead of the night. * Use a "printf" at the point marked "start timer" * to begin your timings. DO NOT use the UNIX "time(1)" * command, as this will measure the total time to * run this program, which will (erroneously) include * the time to malloc(3) storage and to compute the * time it takes to do nothing. * * Run: drynr; dryr * * Results: If you get any new machine/OS results, please send to: * * ihnp4!castor!pcrat!rick * * and thanks to all that do. * * Note: I order the list in increasing performance of the * "with registers" benchmark. If the compiler doesn't * provide register variables, then the benchmark * is the same for both REG and NOREG. * * PLEASE: Send complete information about the machine type, * clock speed, OS and C manufacturer/version. If * the machine is modified, tell me what was done. * On UNIX, execute uname -a and cc -V to get this info. * * 80x8x NOTE: 80x8x benchers: please try to do all memory models * for a particular compiler. * * * The following program contains statements of a high-level programming * language (C) in a distribution considered representative: * * assignments 53% * control statements 32% * procedure, function calls 15% * * 100 statements are dynamically executed. The program is balanced with * respect to the three aspects: * - statement type * - operand type (for simple data types) * - operand access * operand global, local, parameter, or constant. * * The combination of these three aspects is balanced only approximately. * * The program does not compute anything meaningfull, but it is * syntactically and semantically correct. * */ #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <stdio.h> #include <signal.h> #include <unistd.h> /* Accuracy of timings and human fatigue controlled by next two lines */ /*#define LOOPS 50000 */ /* Use this for slow or 16 bit machines */ /*#define LOOPS 500000 */ /* Use this for faster machines */ /*#define LOOPS (sizeof(int) == 2 ? 50000 : 1000000)*/ /* Seconds to run */ #define SECONDS 15 /* Compiler dependent options */ #define NOENUM /* Define if compiler has no enum's */ /* #define NOSTRUCTASSIGN */ /* Define if compiler can't assign structures*/ /* Define only one of the next two defines */ #define TIMES /* Use times(2) time function */ /*#define TIME */ /* Use time(2) time function */ #ifdef TIME /* Ganularity of time(2) is of course 1 second */ #define HZ 1 #endif #ifdef TIMES /* Define the granularity of your times(2) function */ /*#define HZ 50 */ /* times(2) returns 1/50 second (europe?) */ /*#define HZ 60 */ /* times(2) returns 1/60 second (most) */ /*#define HZ 100 */ /* times(2) returns 1/100 second (WECo) */ #endif /* For compatibility with goofed up version */ /*#undef GOOF */ /* Define if you want the goofed up version */ #ifdef GOOF char Version[] = "1.0"; #else char Version[] = "1.1"; #endif #ifdef NOSTRUCTASSIGN #define structassign(d, s) memcpy(&(d), &(s), sizeof(d)) #else #define structassign(d, s) d = s #endif #ifdef NOENUM #define Ident1 1 #define Ident2 2 #define Ident3 3 #define Ident4 4 #define Ident5 5 typedef int Enumeration; #else typedef enum { Ident1, Ident2, Ident3, Ident4, Ident5 } Enumeration; #endif typedef int OneToThirty; typedef int OneToFifty; typedef char CapitalLetter; typedef char String30[31]; typedef int Array1Dim[51]; typedef int Array2Dim[51][51]; struct Record { struct Record *PtrComp; Enumeration Discr; Enumeration EnumComp; OneToFifty IntComp; String30 StringComp; }; typedef struct Record RecordType; typedef RecordType *RecordPtr; typedef int boolean; #ifdef NULL #undef NULL #endif #define NULL 0 #define TRUE 1 #define FALSE 0 #ifndef REG #define REG #endif #ifdef TIMES #include <sys/times.h> #endif #ifndef _PROTOTYPE #define _PROTOTYPE(fun, args) fun args #endif _PROTOTYPE(int main, (void)); _PROTOTYPE(void prep_timer, (void)); _PROTOTYPE(void timeout, (int sig)); _PROTOTYPE(void Proc0, (void)); _PROTOTYPE(void Proc1, (RecordPtr PtrParIn)); _PROTOTYPE(void Proc2, (OneToFifty *IntParIO)); _PROTOTYPE(void Proc3, (RecordPtr *PtrParOut)); _PROTOTYPE(void Proc4, (void)); _PROTOTYPE(void Proc5, (void)); _PROTOTYPE(void Proc6, (Enumeration EnumParIn, Enumeration *EnumParOut)); _PROTOTYPE(void Proc7, (OneToFifty IntParI1, OneToFifty IntParI2, OneToFifty *IntParOut)); _PROTOTYPE(void Proc8, (Array1Dim Array1Par, Array2Dim Array2Par, OneToFifty IntParI1, OneToFifty IntParI2)); /*_PROTOTYPE(Enumeration Func1,(CapitalLetter CharPar1, CapitalLetter CharPar2));*/ _PROTOTYPE(boolean Func2, (String30 StrParI1, String30 StrParI2)); _PROTOTYPE(boolean Func3, (Enumeration EnumParIn)); _PROTOTYPE(Enumeration Func1, (int CharPar1, int CharPar2)); int main() { Proc0(); return(0); } #if __STDC__ volatile int done; #else int done; #endif void prep_timer() { signal(SIGALRM, timeout); done = 0; } void timeout(sig) int sig; { done = 1; } /* Package 1 */ int IntGlob; boolean BoolGlob; char Char1Glob; char Char2Glob; Array1Dim Array1Glob; Array2Dim Array2Glob; RecordPtr PtrGlb; RecordPtr PtrGlbNext; void Proc0() { OneToFifty IntLoc1; REG OneToFifty IntLoc2; OneToFifty IntLoc3; REG char CharIndex; Enumeration EnumLoc; String30 String1Loc; String30 String2Loc; register unsigned long i; unsigned long starttime; unsigned long benchtime; unsigned long nulltime; unsigned long nullloops; unsigned long benchloops; unsigned long ticks_per_sec; #ifdef TIMES struct tms tms; #endif #ifdef HZ #define ticks_per_sec HZ #else ticks_per_sec = sysconf(_SC_CLK_TCK); #endif i = 0; prep_timer(); #ifdef TIME starttime = time((long *) 0); #endif #ifdef TIMES times(&tms); starttime = tms.tms_utime; #endif alarm(1); while (!done) i++; #ifdef TIME nulltime = time((long *) 0) - starttime; /* Computes o'head of loop */ #endif #ifdef TIMES times(&tms); nulltime = tms.tms_utime - starttime; /* Computes overhead of looping */ #endif nullloops = i; PtrGlbNext = (RecordPtr) malloc(sizeof(RecordType)); PtrGlb = (RecordPtr) malloc(sizeof(RecordType)); PtrGlb->PtrComp = PtrGlbNext; PtrGlb->Discr = Ident1; PtrGlb->EnumComp = Ident3; PtrGlb->IntComp = 40; strcpy(PtrGlb->StringComp, "DHRYSTONE PROGRAM, SOME STRING"); #ifndef GOOF strcpy(String1Loc, "DHRYSTONE PROGRAM, 1'ST STRING"); /* GOOF */ #endif Array2Glob[8][7] = 10; /* Was missing in published program */ /***************** -- Start Timer -- *****************/ i = 0; prep_timer(); #ifdef TIME starttime = time((long *) 0); #endif #ifdef TIMES times(&tms); starttime = tms.tms_utime; #endif alarm(SECONDS); N�� N�� N��N��N��N������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ while (!done) { i++; Proc5(); Proc4(); IntLoc1 = 2; IntLoc2 = 3; strcpy(String2Loc, "DHRYSTONE PROGRAM, 2'ND STRING"); EnumLoc = Ident2; BoolGlob = !Func2(String1Loc, String2Loc); while (IntLoc1 < IntLoc2) { IntLoc3 = 5 * IntLoc1 - IntLoc2; Proc7(IntLoc1, IntLoc2, &IntLoc3); ++IntLoc1; } Proc8(Array1Glob, Array2Glob, IntLoc1, IntLoc3); Proc1(PtrGlb); for (CharIndex = 'A'; CharIndex <= Char2Glob; ++CharIndex) if (EnumLoc == Func1(CharIndex, 'C')) Proc6(Ident1, &EnumLoc); IntLoc3 = IntLoc2 * IntLoc1; IntLoc2 = IntLoc3 / IntLoc1; IntLoc2 = 7 * (IntLoc3 - IntLoc2) - IntLoc1; Proc2(&IntLoc1); } /***************** -- Stop Timer -- *****************/ #ifdef TIME benchtime = time((long *) 0) - starttime; #endif #ifdef TIMES times(&tms); benchtime = tms.tms_utime - starttime; #endif benchloops = i; /* Approximately correct benchtime to the nulltime. */ benchtime -= nulltime / (nullloops / benchloops); printf("Dhrystone(%s) time for %lu passes = %lu.%02lu\n", Version, benchloops, benchtime / ticks_per_sec, benchtime % ticks_per_sec * 100 / ticks_per_sec); printf("This machine benchmarks at %lu dhrystones/second\n", benchloops * ticks_per_sec / benchtime); } void Proc1(PtrParIn) REG RecordPtr PtrParIn; { #define NextRecord (*(PtrParIn->PtrComp)) structassign(NextRecord, *PtrGlb); PtrParIn->IntComp = 5; NextRecord.IntComp = PtrParIn->IntComp; NextRecord.PtrComp = PtrParIn->PtrComp; Proc3((RecordPtr *)NextRecord.PtrComp); if (NextRecord.Discr == Ident1) { NextRecord.IntComp = 6; Proc6(PtrParIn->EnumComp, &NextRecord.EnumComp); NextRecord.PtrComp = PtrGlb->PtrComp; Proc7(NextRecord.IntComp, 10, &NextRecord.IntComp); } else structassign(*PtrParIn, NextRecord); #undef NextRecord } void Proc2(IntParIO) OneToFifty *IntParIO; { REG OneToFifty IntLoc; REG Enumeration EnumLoc; IntLoc = *IntParIO + 10; for (;;) { if (Char1Glob == 'A') { --IntLoc; *IntParIO = IntLoc - IntGlob; EnumLoc = Ident1; } if (EnumLoc == Ident1) break; } } void Proc3(PtrParOut) RecordPtr *PtrParOut; { if (PtrGlb != NULL) *PtrParOut = PtrGlb->PtrComp; else IntGlob = 100; Proc7(10, IntGlob, &PtrGlb->IntComp); } void Proc4() { REG boolean BoolLoc; BoolLoc = Char1Glob == 'A'; BoolLoc |= BoolGlob; Char2Glob = 'B'; } void Proc5() { Char1Glob = 'A'; BoolGlob = FALSE; } void Proc6(EnumParIn, EnumParOut) REG Enumeration EnumParIn; REG Enumeration *EnumParOut; { *EnumParOut = EnumParIn; if (!Func3(EnumParIn)) *EnumParOut = Ident4; switch (EnumParIn) { case Ident1: *EnumParOut = Ident1; break; case Ident2: if (IntGlob > 100) *EnumParOut = Ident1; else *EnumParOut = Ident4; break; case Ident3: *EnumParOut = Ident2; break; case Ident4: break; case Ident5: *EnumParOut = Ident3; } } void Proc7(IntParI1, IntParI2, IntParOut) OneToFifty IntParI1; OneToFifty IntParI2; OneToFifty *IntParOut; { REG OneToFifty IntLoc; IntLoc = IntParI1 + 2; *IntParOut = IntParI2 + IntLoc; } void Proc8(Array1Par, Array2Par, IntParI1, IntParI2) Array1Dim Array1Par; Array2Dim Array2Par; OneToFifty IntParI1; OneToFifty IntParI2; { REG OneToFifty IntLoc; REG OneToFifty IntIndex; IntLoc = IntParI1 + 5; Array1Par[IntLoc] = IntParI2; Array1Par[IntLoc + 1] = Array1Par[IntLoc]; Array1Par[IntLoc + 30] = IntLoc; for (IntIndex = IntLoc; IntIndex <= (IntLoc + 1); ++IntIndex) Array2Par[IntLoc][IntIndex] = IntLoc; ++Array2Par[IntLoc][IntLoc - 1]; Array2Par[IntLoc + 20][IntLoc] = Array1Par[IntLoc]; IntGlob = 5; } Enumeration Func1(CharPar1, CharPar2) CapitalLetter CharPar1; CapitalLetter CharPar2; { REG CapitalLetter CharLoc1; REG CapitalLetter CharLoc2; CharLoc1 = CharPar1; CharLoc2 = CharLoc1; if (CharLoc2 != CharPar2) return(Ident1); else return(Ident2); } boolean Func2(StrParI1, StrParI2) String30 StrParI1; String30 StrParI2; { REG OneToThirty IntLoc; REG CapitalLetter CharLoc; IntLoc = 1; while (IntLoc <= 1) if (Func1(StrParI1[IntLoc], StrParI2[IntLoc + 1]) == Ident1) { CharLoc = 'A'; ++IntLoc; } if (CharLoc >= 'W' && CharLoc <= 'Z') IntLoc = 7; if (CharLoc == 'X') return(TRUE); else { if (strcmp(StrParI1, StrParI2) > 0) { IntLoc += 7; return(TRUE); } else return(FALSE); } } boolean Func3(EnumParIn) REG Enumeration EnumParIn; { REG Enumeration EnumLoc; EnumLoc = EnumParIn; if (EnumLoc == Ident3) return(TRUE); return(FALSE); } #ifdef NOSTRUCTASSIGN memcpy(d, s, l) register char *d; register char *s; register int l; { while (l--) *d++ = *s++; } #endif �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* diff - print differences between 2 files Author: Erik Baalbergen */ /* Poor man's implementation of diff(1) - no options available * - may give more output than other diffs, * due to the straight-forward algorithm * - runs out of memory if the differing chunks become too large * - input line length should not exceed LINELEN; longer lines are * truncated, while only the first LINELEN characters are compared * * - Bug fixes by Rick Thomas Sept. 1989 * * Please report bugs and suggestions to erikb@cs.vu.nl *------------------------------------------------------------------------------ * Changed diff to conform to POSIX 1003.2 ( Draft 11) by Thomas Brupbacher * ( tobr@mw.lpc.ethz.ch). * * To incorporate the context diff option -c in the program, the source code * for the program cdiff has been copied to the end of this program. Only * slight modifications for the cdiff code to work within the program diff * were made( e.g. main() -> context_diff()). * * New options: * -c, -C n where n=0,1,...: * produces a context diff as the program cdiff. The default is to * print 3 lines of context, this value can be changed with -C * ( e.g. -C 5 prints five lines of context.) * -e : Prints an ed script, so you can convert <file1> to <file2> with * the command ed <file1> < `diff -e <file1> <file2>`. * -b : Causes trailing blanks to be ignored and spaces of multiple blanks * to be reduced to one blank before comparison. *----------------------------------------------------------------------------- */ #include <stdlib.h> #include <limits.h> /* NAME_MAX for maximal filename length */ #include <string.h> /* string manipulation */ #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <ctype.h> #include <time.h> #include <dirent.h> #include <unistd.h> #include <stdio.h> /* These definitions are needed only to suppress warning messages. */ #define Nullfp ((FILE*)0) #define Nullch ((char*)0) #define NullStructLine ((struct line *)0) #define LINELEN 128 /* max line length included in diff */ #define NOT_SET 0 /* Defines to characterise if a flag */ #define SET 1 /* is set */ /* Indexes of the warning-message array */ #define EXCLUSIVE_OPTIONS 0 #define CANNOT_OPEN_FILE 1 /* Used to define the mode */ typedef enum { undefined, context, ed_mode } MODE; /* Global variables for the 'normal' diff part */ char *progname; /* program name (on command line) */ int diffs = 0; /* number of differences */ MODE mode; /* which mode is used */ int severe_error; /* nonzero after severe, non-fatal error */ /* The following global variables are used with the -r option: * for every pair of files that are different, a "command line" of the * form "diff <options> <oldfile> <newfile>" is printed before the real * output starts. */ int firstoutput = 1; /* flag to print one time */ char options_string[10]; /* string to hold command line options */ char oldfile[PATH_MAX]; /* first file */ char newfile[PATH_MAX]; /* second file */ /* Global variables for the command-line options */ int trim_blanks = NOT_SET; /* SET if -b specified */ int recursive_dir = NOT_SET; /* SET if -r specified */ int context_lines = 3; /* numbers of lines in a context */ static int offset; /* offset of the actual line number for -e */ /* Function prototypes for the functions in this file */ struct f; _PROTOTYPE(int main, (int argc, char **argv )); _PROTOTYPE(void process_command_line, (int argc, char **argv )); _PROTOTYPE(void analyse_input_files, (char *arg1, char *arg2, char *input1, char *input2 )); _PROTOTYPE(void diff, (char *filename1, char *filename2 )); _PROTOTYPE(FILE *check_file, (char *name )); _PROTOTYPE(void build_option_string, (void )); _PROTOTYPE(void fatal_error, (char *fmt, char *s )); _PROTOTYPE(void warn, (int number, char *string )); _PROTOTYPE(void trimming_blanks, (char *l_text )); _PROTOTYPE(char *filename, (char *path_string)); _PROTOTYPE(struct line *new_line, (int size )); _PROTOTYPE(void free_line, (struct line *l )); _PROTOTYPE(int equal_line, (struct line *l1, struct line *l2 )); _PROTOTYPE(int equal_3, (struct line *l1, struct line *l2 )); _PROTOTYPE(struct line *read_line, (FILE *fp )); _PROTOTYPE(void advance, (struct f *f )); _PROTOTYPE(void aside, (struct f *f, struct line *l )); _PROTOTYPE(struct line *next, (struct f *f )); _PROTOTYPE(void init_f, (struct f *f, FILE *fp )); _PROTOTYPE(void update, (struct f *f, char *s )); _PROTOTYPE(void __diff, (FILE *fp1, FILE *fp2 )); _PROTOTYPE(void differ, (struct f *f1, struct f *f2 )); _PROTOTYPE(int wlen, (struct f *f )); _PROTOTYPE(void range, (int a, int b )); _PROTOTYPE(void cdiff, (char *old, char *new, FILE *file1, FILE *file2 )); _PROTOTYPE(void dumphunk, (void )); _PROTOTYPE(char *getold, (int targ )); _PROTOTYPE(char *getnew, (int targ )); _PROTOTYPE(int isdir, (char *path )); _PROTOTYPE(void diff_recursive, (char *dir1, char *dir2 )); _PROTOTYPE(void file_type_error, (char *filename1, char *filename2, struct stat *statbuf1, struct stat *statbuf2 )); _PROTOTYPE(void *xmalloc, (size_t size)); _PROTOTYPE(void *xrealloc, (void *ptr, size_t size)); int main(argc, argv) int argc; char **argv; { char file1[PATH_MAX], file2[PATH_MAX]; extern int optind; /* index of the current string in argv */ progname = argv[0]; process_command_line(argc, argv); analyse_input_files(argv[optind], argv[optind + 1], file1, file2); optind++; if (recursive_dir == SET) { build_option_string(); diff_recursive(file1, file2); } else { diff(file1, file2); } return(severe_error ? 2 : diffs > 0 ? 1 : 0); } /* Process the command line and set the flags for the different * options. the processing of the command line is done with the * getopt() library function. a minimal error processing is done * for the number of command line arguments. */ void process_command_line(argc, argv) int argc; /* number of arguments on command line */ char **argv; /* ** to arguments on command line */ { int c; extern char *optarg; /* points to string with options */ extern int optind; /* index of the current string in argv */ /* Are there enough arguments? */ if (argc < 3) { fatal_error("Usage: %s [-c|-e|-C n][-br] file1 file2\n", progname); } /* Process all options using getopt() */ while ((c = getopt(argc, argv, "ceC:br")) != -1) { switch (c) { case 'c': if (mode != undefined) warn(EXCLUSIVE_OPTIONS, "c"); mode = context; context_lines = 3; break; case 'e': if (mode != undefined) warn(EXCLUSIVE_OPTIONS, "e"); mode = ed_mode; break; case 'C': if (mode != undefined) warn(EXCLUSIVE_OPTIONS, "C"); mode = context; context_lines = atoi(optarg); break; case 'b': trim_blanks = SET; break; case 'r': recursive_dir = SET; break; case '?': exit(2); } } /* We should have two arguments left */ if ((argc - optind) != 2) fatal_error("Need exactly two input file-names!\n", ""); } /* Analyse_input_files takes the two input files on the command line * and decides what to do. returns the (corrected) filenames that * can be used to call diff(). * if two directories are given, then a recursive diff is done. * one directory and one filename compares the file with <filename> * in the directory <directory> with <filename>. * if two filenames are specified, no special action takes place. */ void analyse_input_files(arg1, arg2, input1, input2) char *arg1, *arg2; /* filenames on the command line */ char *input1, *input2; /* filenames to be used with diff() */ { int stat1 = 0, stat2 = 0; if (strcmp(arg1, "-") != 0) stat1 = isdir(arg1); /* != 0 <-> arg1 is directory */ if (strcmp(arg2, "-") != 0) stat2 = isdir(arg2); #ifdef DEBUG fprintf(stderr, "%s, stat = %d\n", arg1, stat1); fprintf(stderr, "%s, stat = %d\n", arg2, stat2); #endif if (stat1 && stat2) { /* both arg1 and arg2 are directories */ recursive_dir = SET; strcpy(input1, arg1); strcpy(input2, arg2); return; } if (stat1 != 0) { /* arg1 is a dir, arg2 not */ if (strcmp(arg2, "-") != 0) { /* arg2 != stdin */ strcpy(input1, arg1); N��N��N��N��N��N��N�� N��!N��"N��#N��$N��%N��&N��'N��(N��)N��*N��+N��,N��-N��.N��/N��0N������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ strcat(input1, "/"); strcat(input1, arg2); strcpy(input2, arg2); return; } else { fatal_error("cannot compare stdin (-) with a directory!", ""); } } if (stat2 != 0) { /* arg2 is a dir, arg1 not */ if (strcmp(arg1, "-") != 0) { /* arg1 != stdin */ strcpy(input1, arg1); strcpy(input2, arg2); strcat(input2, "/"); strcat(input2, arg1); return; } else { /* arg1 == stdin */ fatal_error("cannot compare stdin (-) with a directory!", ""); } } /* Both arg1 and arg2 are normal files */ strcpy(input1, arg1); strcpy(input2, arg2); } /* Diff() is the front end for all modes of the program diff, execpt * the recursive_dir option. * diff() expects the filenames of the two files to be compared as * arguments. the mode is determined from the global variable mode. */ void diff(filename1, filename2) char *filename1, *filename2; { FILE *file1 = check_file(filename1); FILE *file2 = check_file(filename2); struct stat statbuf1, statbuf2; if ((file1 != Nullfp) && (file2 != Nullfp)) { /* If we do a recursive diff, then we don't compare block * special, character special or FIFO special files to any * file. */ fstat(fileno(file1), &statbuf1); fstat(fileno(file2), &statbuf2); if ((((statbuf1.st_mode & S_IFREG) != S_IFREG) || ((statbuf2.st_mode & S_IFREG) != S_IFREG)) && (recursive_dir == SET)) { file_type_error(filename1, filename2, &statbuf1, &statbuf2); } else { switch (mode) { case context: cdiff(filename1, filename2, file1, file2); break; case ed_mode: case undefined: __diff(file1, file2); if (mode == ed_mode) printf("w\n"); break; } } } else severe_error = 1; if (file1 != Nullfp) fclose(file1); if (file2 != Nullfp) fclose(file2); } /* Check_file() opens the fileptr with name <filename>. if <filename> * equals "-" stdin is associated with the return value. */ FILE *check_file(name) char *name; { FILE *temp; if (strcmp(name, "-") == 0) { return(stdin); } else { temp = fopen(name, "r"); if (temp == Nullfp) warn(CANNOT_OPEN_FILE, name); return(temp); } } /* Build_option_string() is called before recursive_dir() is called * from the main() function. its purpose is to build the string that * is used on the command line to get the current operation mode. * e.g. "-C 6 -b". */ void build_option_string() { switch (mode) { case ed_mode:sprintf(options_string, "-e"); break; case context: if (context_lines == 3) sprintf(options_string, "-c"); else sprintf(options_string, "-C %d", context_lines); break; } } /* The fatal error handler. * Expects a format string and a string as arguments. The arguments * are printed to stderr and the program exits with an error code 2. */ void fatal_error(fmt, s) char *fmt; /* the format sttring to be printed */ char *s; /* string to be inserted into the format * string */ { fprintf(stderr, "%s: ", progname); fprintf(stderr, fmt, s); fprintf(stderr, "\n"); exit(2); } /* This function prints non fatal error messages to stderr. * Expects the index of the message to be printed and a pointer * to the (optional) string to be printed. * Returns no value. */ void warn(number, string) int number; /* index of the warning */ char *string; /* string to be inserted to the warning */ { static char *warning[] = { "%s: The options -c, -e, -C n are mutually exclusive! Assuming -%c\n", "%s: cannot open file %s for reading\n", }; fprintf(stderr, warning[number], progname, string); } /* Function used with the optione -b, trims the blanks in a input line: * - blanks between words are reduced to one * - trailing blanks are eliminated. */ void trimming_blanks(l_text) char *l_text; /* begin of the char array */ { char *line = l_text; char *copy_to, *copy_from; do { if (*line == ' ') { copy_from = line; copy_to = line; while (*(++copy_from) == ' '); if (*copy_from != '\n') copy_to++; while (*copy_from != '\0') *(copy_to++) = *(copy_from++); *copy_to = '\0'; } } while (*(++line) != '\0'); } /* Filename separates the filename and the relative path in path_string. * Returns the filename with a leading / */ char *filename(path_string) char *path_string; { char name[NAME_MAX + 2]; /* filename plus / */ char *ptr; name[0] = '/'; ptr = strrchr(path_string, '/'); if (ptr == 0) { /* no / in path_string, only a filename */ strcat(name, path_string); } else { strcat(name, ptr); } return(name); } /* The line module: one member in a linked list of lines. */ struct line { struct line *l_next; /* pointer to the next line */ char l_eof; /* == 0 if last line in file */ char *l_text; /* array with the text */ }; struct line *freelist = 0; #define stepup(ll) ( ((ll) && ((ll)->l_eof==0)) ? (ll)->l_next : (ll) ) /* Function to allocate space for a new line containing SIZE chars */ struct line *new_line(size) int size; { register struct line *l; if ((l = freelist) != NullStructLine) freelist = freelist->l_next; else { l = (struct line *) xmalloc(3 * sizeof(void *)); l->l_text = (char *) xmalloc((size + 2) * sizeof(char)); if ((l == 0) || (l->l_text == 0)) fatal_error("Out of memory", ""); } return l; } /* Free_line() releases storage allocated for <l>. */ void free_line(l) register struct line *l; { l->l_next = freelist; freelist = l; } /* Equal_line() compares two lines, <l1> and <l2>. * the returned value is the result of the strcmp() function. */ int equal_line(l1, l2) struct line *l1, *l2; { if (l1 == 0 || l2 == 0) return(0); else if (l1->l_eof || l2->l_eof) return(l1->l_eof == l2->l_eof); else return(strcmp(l1->l_text, l2->l_text) == 0); } int equal_3(l1, l2) struct line *l1, *l2; { register int i, ansr; ansr = 1; #ifdef DEBUG if (l1 == 0) fprintf(stderr, "\t(null)\n"); else if (l1->l_eof) fprintf(stderr, "\t(eof)\n"); else fprintf(stderr, "\t%s", l1->l_text); if (l2 == 0) fprintf(stderr, "\t(null)\n"); else if (l2->l_eof) fprintf(stderr, "\t(eof)\n"); else fprintf(stderr, "\t%s", l2->l_text); #endif for (i = 0; i < 3; ++i) { if (!equal_line(l1, l2)) { ansr = 0; break; } l1 = stepup(l1); l2 = stepup(l2); } #ifdef DEBUG fprintf(stderr, "\t%d\n", ansr); #endif return(ansr); } struct line * read_line(fp) FILE *fp; { register struct line *l = new_line(LINELEN); register char *p; register int c; (p = &(l->l_text[LINELEN]))[1] = '\377'; l->l_eof = 0; if (fgets(l->l_text, LINELEN + 2, fp) == 0) { l->l_eof = 1; l->l_text[0] = 0; } else if ((p[1] & 0377) != 0377 && *p != '\n') { while ((c = fgetc(fp)) != '\n' && c != EOF) { } *p++ = '\n'; *p = '\0'; } l->l_next = 0; if (trim_blanks == SET) { #ifdef DEBUG printf("xxx %s xxx\n", l->l_text); #endif trimming_blanks(l->l_text); #ifdef DEBUG printf("xxx %s xxx\n", l->l_text); #endif } return l; } /* File window handler */ struct f { struct line *f_bwin, *f_ewin; struct line *f_aside; int f_linecnt; /* line number in file of last advanced line */ FILE *f_fp; }; void advance(f) register struct f *f; { register struct line *l; if ((l = f->f_bwin) != NullStructLine) { if (f->f_ewin == l) f->f_bwin = f->f_ewin = 0; else f->f_bwin = l->l_next; free_line(l); (f->f_linecnt)++; } } void aside(f, l) struct f *f; struct line *l; { register struct line *ll; if (l == 0) return; if ((ll = l->l_next) != NullStructLine) { while (ll->l_next) ll = ll->l_next; ll->l_next = f->f_aside; f->f_aside = l->l_next; l->l_next = 0; f->f_ewin = l; } } struct line *next(f) register struct f *f; { register struct line *l; if ((l = f->f_aside) != NullStructLine) { f->f_aside = l->l_next; l->l_next = 0; } else l = read_line(f->f_fp); if (l) { if (f->f_bwin == 0) f->f_bwin = f->f_ewin = l; else { if (f->f_ewin->l_eof && l->l_eof) { free_line(l); return(f->f_ewin); } f->f_ewin->l_next = l; f->f_ewin = l; } } return l; } /* Init_f() initialises a window structure (struct f). <fp> is the * file associated with <f>. */ void init_f(f, fp) register struct f *f; FILE *fp; { f->f_bwin = f->f_ewin = f->f_aside = 0; f->f_linecnt = 0; f->f_fp = fp; } /* Update() prints a window. <f> is a pointer to the window, <s> is the * string containing the "prefix" to the printout( either "<" or ">"). * after completion of update(), the window is empty. */ void update(f, s) register struct f *f; char *s; { char *help; int only_dot = 0; if (firstoutput && (recursive_dir == SET)) { printf("diff %s %s %s\n", options_string, oldfile, newfile); firstoutput = 0; } while (f->f_bwin && f->f_bwin != f->f_ewin) { if (mode != ed_mode) { printf("%s%s", s, f->f_bwin->l_text); } else { #ifdef DEBUG printf("ed_mode: test for only dot"); printf("%s", f->f_bwin->l_text); #endif help = f->f_bwin->l_text; while ((*help == ' ') || (*help == '.') || (*help == '\t')) { if (*(help++) == '.') only_dot++; if (only_dot > 1) break; } /* If only_dot is equal 1, there is only one dot on * the line, so we have to take special actions. * f the line with only one dot is found, we output * two dots (".."), terminate the append modus and * substitute "." for "..". Afterwards we restart * with the append command. */ if (*help == '\n' && only_dot == 1) { help = f->f_bwin->l_text; while (*help != '\0') { if (*help == '.') printf("."); putchar((int) *(help++)); } printf(".\n"); printf(".s/\\.\\././\n"); printf("a\n"); } else { printf("%s%s", s, f->f_bwin->l_text); } } advance(f); } } /* __Diff(), performs the "core operation" of the program. * Expects two file-pointers as arguments. This functions does * *not* check if the file-pointers are valid. */ void __diff(fp1, fp2) FILE *fp1, *fp2; { struct f f1, f2; struct line *l1, *s1, *b1, *l2, *s2, *b2; register struct line *ll; init_f(&f1, fp1); init_f(&f2, fp2); l1 = next(&f1); l2 = next(&f2); while ((l1->l_eof == 0) || (l2->l_eof == 0)) { if (equal_line(l1, l2)) { equal: advance(&f1); advance(&f2); l1 = next(&f1); l2 = next(&f2); continue; } s1 = b1 = l1; s2 = b2 = l2; /* Read several more lines */ next(&f1); next(&f1); next(&f2); next(&f2); /* Start searching */ search: next(&f2); ll = s1; do { if (equal_3(ll, b2)) { l1 = ll; l2 = b2; aside(&f1, ll); aside(&f2, b2); differ(&f1, &f2); goto equal; } if (ll->l_eof) break; ll = stepup(ll); } while (ll); b2 = stepup(b2); next(&f1); ll = s2; do { if (equal_3(b1, ll)) { l1 = b1; l2 = ll; aside(&f2, ll); aside(&f1, b1); differ(&f1, &f2); goto equal; } if (ll->l_eof != 0) break; ll = stepup(ll); } while (ll); b1 = stepup(b1); goto search; } /* Both of the files reached EOF */ } /* Differ() prints the differences between files. the arguments <f1> and * <f2> are pointers to the two windows, where the differences are. */ void differ(f1, f2) register struct f *f1, *f2; { int cnt1 = f1->f_linecnt, len1 = wlen(f1); int cnt2 = f2->f_linecnt, len2 = wlen(f2); if ((len1 != 0) || (len2 != 0)) { if (len1 == 0) { if (mode == ed_mode) { cnt1 += offset; printf("%d a\n", cnt1); update(f2, ""); printf(".\n"); offset += len2; } else { printf("%da", cnt1); range(cnt2 + 1, cnt2 + len2); } } else if (len2 == 0) { if (mode == ed_mode) { cnt1 += offset; range(cnt1 + 1, cnt1 + len1); printf("d\n"); offset -= len1; while (f1->f_bwin && f1->f_bwin != f1->f_ewin) advance(f1); } else { range(cnt1 + 1, cnt1 + len1); printf("d%d", cnt2); } } else { if (mode != ed_mode) { range(cnt1 + 1, cnt1 + len1); putchar('c'); range(cnt2 + 1, cnt2 + len2); } else { cnt1 += offset; if (len1 == len2) { range(cnt1 + 1, cnt1 + len1); printf("c\n"); update(f2, ""); printf(".\n"); } else { range(cnt1 + 1, cnt1 + len1); printf("d\n"); printf("%d a\n", cnt1); update(f2, ""); printf(".\n"); offset -= len1 - len2; } while (f1->f_bwin && f1->f_bwin != f1->f_ewin) advance(f1); } } if (mode != ed_mode) { putchar('\n'); if (len1 != 0) update(f1, "< "); if ((len1 != 0) && (len2 != 0)) printf("---\n"); if (len2 != 0) update(f2, "> "); } diffs++; } } /* Function wlen() calculates the number of lines in a window. */ int wlen(f) struct f *f; { register cnt = 0; register struct line *l = f->f_bwin, *e = f->f_ewin; while (l && l != e) { cnt++; l = l->l_next; } return cnt; } /* Range() prints the line numbers of a range. the arguments <a> and <b> * are the beginning and the ending line number of the range. if * <a> == <b>, only one line number is printed. otherwise <a> and <b> are * separated by a ",". */ void range(a, b) int a, b; { printf(((a == b) ? "%d" : "%d,%d"), a, b); } /* Here follows the code for option -c. * This code is from the cdiff program by Larry Wall. I changed it only * slightly to reflect the POSIX standard and to call the main routine * as function context_diff(). */ /* Cdiff - context diff Author: Larry Wall */ /* These global variables are still here from the original cdiff program... * I was to lazy just to sort them out... */ char buff[512]; FILE *oldfp, *newfp; int oldmin, oldmax, newmin, newmax; int oldbeg, oldend, newbeg, newend; int preoldmax, prenewmax; int preoldbeg, preoldend, prenewbeg, prenewend; int oldwanted, newwanted; char *oldhunk, *newhunk; size_t oldsize, oldalloc, newsize, newalloc; void cdiff(old, new, file1, file2) char *old, *new; /* The names of the two files to be compared */ FILE *file1, *file2; /* The corresponding file-pointers */ { FILE *inputfp; struct stat statbuf; register char *s; char op; char *newmark, *oldmark; int len; char *line; int i, status; oldfp = file1; newfp = file2; oldalloc = 512; oldhunk = (char *) xmalloc(oldalloc); newalloc = 512; newhunk = (char *) xmalloc(newalloc); /* The context diff spawns a new process that executes a normal diff * and parses the output. */ if (trim_blanks == SET) sprintf(buff, "diff -b %s %s", old, new); else sprintf(buff, "diff %s %s", old, new); inputfp = popen(buff, "r"); if (!inputfp) { fprintf(stderr, "Can't execute diff %s %s\n", old, new); exit(2); } preoldend = -1000; firstoutput = 1; while (fgets(buff, sizeof buff, inputfp) != Nullch) { if (firstoutput) { if (recursive_dir == SET) { printf("diff %s %s %s\n", options_string, oldfile, newfile); } fstat(fileno(oldfp), &statbuf); printf("*** %s %s", old, ctime(&statbuf.st_mtime)); fstat(fileno(newfp), &statbuf); printf("--- %s %s", new, ctime(&statbuf.st_mtime)); firstoutput = 0; } if (isdigit(*buff)) { oldmin = atoi(buff); for (s = buff; isdigit(*s); s++); if (*s == ',') { s++; oldmax = atoi(s); for (; isdigit(*s); s++); } else { oldmax = oldmin; } if (*s != 'a' && *s != 'd' && *s != 'c') { fprintf(stderr, "Unparseable input: %s", s); exit(2); } op = *s; s++; newmin = atoi(s); for (; isdigit(*s); s++); if (*s == ',') { s++; newmax = atoi(s); for (; isdigit(*s); s++); } else { newmax = newmin; } if (*s != '\n' && *s != ' ') { fprintf(stderr, "Unparseable input: %s", s); exit(2); } newmark = oldmark = "! "; if (op == 'a') { oldmin++; newmark = "+ "; } if (op == 'd') { newmin++; oldmark = "- "; } oldbeg = oldmin - context_lines; oldend = oldmax + context_lines; if (oldbeg < 1) oldbeg = 1; newbeg = newmin - context_lines; newend = newmax + context_lines; if (newbeg < 1) newbeg = 1; if (preoldend < oldbeg - 1) { if (preoldend >= 0) { dumphunk(); } preoldbeg = oldbeg; prenewbeg = newbeg; oldwanted = newwanted = 0; oldsize = newsize = 0; } else { /* we want to append to previous hunk */ oldbeg = preoldmax + 1; newbeg = prenewmax + 1; } for (i = oldbeg; i <= oldmax; i++) { line = getold(i); if (!line) { oldend = oldmax = i - 1; break; } len = strlen(line) + 2; if (oldsize + len + 1 >= oldalloc) { oldalloc *= 2; oldhunk = (char *) xrealloc(oldhunk, oldalloc); } if (i >= oldmin) { strcpy(oldhunk + oldsize, oldmark); oldwanted++; } else { strcpy(oldhunk + oldsize, " "); } strcpy(oldhunk + oldsize + 2, line); oldsize += len; } preoldmax = oldmax; preoldend = oldend; for (i = newbeg; i <= newmax; i++) { line = getnew(i); if (!line) { newend = newmax = i - 1; break; } len = strlen(line) + 2; if (newsize + len + 1 >= newalloc) { newalloc *= 2; newhunk = (char *) xrealloc(newhunk, newalloc); } if (i >= newmin) { strcpy(newhunk + newsize, newmark); newwanted++; } else { strcpy(newhunk + newsize, " "); } strcpy(newhunk + newsize + 2, line); newsize += len; } prenewmax = newmax; prenewend = newend; } } status = pclose(inputfp); if (status != 0) diffs++; if (!WIFEXITED(status) || WEXITSTATUS(status) > 1) severe_error = 1; if (preoldend >= 0) { dumphunk(); } } void dumphunk() { int i; char *line; int len; for (i = preoldmax + 1; i <= preoldend; i++) { line = getold(i); if (!line) { preoldend = i - 1; break; } len = strlen(line) + 2; if (oldsize + len + 1 >= oldalloc) { oldalloc *= 2; oldhunk = (char *) xrealloc(oldhunk, oldalloc); } strcpy(oldhunk + oldsize, " "); strcpy(oldhunk + oldsize + 2, line); oldsize += len; } for (i = prenewmax + 1; i <= prenewend; i++) { line = getnew(i); if (!line) { prenewend = i - 1; break; } len = strlen(line) + 2; if (newsize + len + 1 >= newalloc) { newalloc *= 2; newhunk = (char *) xrealloc(newhunk, newalloc); } strcpy(newhunk + newsize, " "); strcpy(newhunk + newsize + 2, line); newsize += len; } fputs("***************\n", stdout); if (preoldbeg >= preoldend) { printf("*** %d ****\n", preoldend); } else { printf("*** %d,%d ****\n", preoldbeg, preoldend); } if (oldwanted) { fputs(oldhunk, stdout); } oldsize = 0; *oldhunk = '\0'; if (prenewbeg >= prenewend) { printf("--- %d ----\n", prenewend); } else { printf("--- %d,%d ----\n", prenewbeg, prenewend); } if (newwanted) { fputs(newhunk, stdout); } newsize = 0; *newhunk = '\0'; } char *getold(targ) int targ; { static int oldline = 0; while (fgets(buff, sizeof buff, oldfp) != Nullch) { oldline++; if (oldline == targ) return buff; } return Nullch; } char *getnew(targ) int targ; { static int newline = 0; while (fgets(buff, sizeof buff, newfp) != Nullch) { newline++; if (newline == targ) return buff; } return Nullch; } /* Isdir() checks, if <path> is the name of a directory. a return value * is 0, <path> is a normal file. otherwise the <path> is a directory. */ int isdir(path) char *path; { struct stat buf; stat(path, &buf); if (buf.st_mode & S_IFDIR) { /* path is a directory */ return(~0); } else { return(0); } } /* This is the "main" function if a diff of two directories has to be * done. diff_recursive() expects the names of the two directories to * be compared. */ void diff_recursive(dir1, dir2) char *dir1, *dir2; { FILE *ls1, *ls2; char file1[PATH_MAX], file2[PATH_MAX]; char jointfile1[PATH_MAX], jointfile2[PATH_MAX]; char command[PATH_MAX]; int difference, eof1, eof2; sprintf(command, "ls %s", dir1); ls1 = popen(command, "r"); sprintf(command, "ls %s", dir2); ls2 = popen(command, "r"); if ((ls1 == NULL) || (ls2 == NULL)) fatal_error("cannot execute ls!", ""); file1[0] = '\0'; eof1 = fscanf(ls1, "%s\n", file1); file2[0] = '\0'; eof2 = fscanf(ls2, "%s\n", file2); while ((file1[0] != '\0') && (file2[0] != '\0')) { difference = strcmp(file1, file2); while (difference != 0) { if (difference < 0) { printf("Only in %s: %s\n", dir1, file1); file1[0] = '\0'; eof1 = fscanf(ls1, "%s\n", file1); if (file1[0] == '\0') break; } else { printf("Only in %s: %s\n", dir2, file2); file2[0] = '\0'; eof2 = fscanf(ls2, "%s\n", file2); if (file2[0] == '\0') break; } difference = strcmp(file1, file2); } if (eof1 != EOF && eof2 != EOF) { strcpy(jointfile1, dir1); strcat(jointfile1, "/"); strcat(jointfile1, file1); strcpy(jointfile2, dir2); strcat(jointfile2, "/"); strcat(jointfile2, file2); if ((isdir(jointfile1) != 0) && (isdir(jointfile2) != 0)) { printf("Common subdirectories: %s and %s\n", jointfile1, jointfile2); diff_recursive(jointfile1, jointfile2); } else { firstoutput = 1; strcpy(oldfile, jointfile1); strcpy(newfile, jointfile2); diff(jointfile1, jointfile2); } file1[0] = '\0'; eof1 = fscanf(ls1, "%s\n", file1); file2[0] = '\0'; eof2 = fscanf(ls2, "%s\n", file2); } } if (file1[0] != '\0') { /* first arg still has files */ do { printf("Only in %s: %s\n", dir1, file1); eof1 = fscanf(ls1, " %s\n", file1); } while (eof1 != EOF); } if (file2[0] != '\0') { do { printf("Only in %s: %s\n", dir2, file2); eof2 = fscanf(ls2, " %s\n", file2); } while (eof2 != EOF); } if (pclose(ls1) != 0) severe_error = 1; if (pclose(ls2) != 0) severe_error = 1; } /* File_type_error is called, if in a recursive diff ( -r) one of the two * files a block special, a character special or a FIFO special file is. * The corresponding error message is printed here. */ void file_type_error(filename1, filename2, statbuf1, statbuf2) char *filename1, *filename2; struct stat *statbuf1, *statbuf2; { char type1[25], type2[25]; switch (statbuf1->st_mode & S_IFMT) { /* select only file mode */ case S_IFREG: sprintf(type1, "regular file "); break; case S_IFBLK: sprintf(type1, "block special file "); break; case S_IFDIR: sprintf(type1, "directory "); break; case S_IFCHR: sprintf(type1, "character special file "); break; case S_IFIFO: sprintf(type1, "FIFO special file "); break; } switch (statbuf2->st_mode & S_IFMT) { /* select only file mode */ case S_IFREG: sprintf(type2, "regular file "); break; case S_IFBLK: sprintf(type2, "block special file "); break; case S_IFDIR: sprintf(type2, "directory "); break; case S_IFCHR: sprintf(type2, "character special file "); break; case S_IFIFO: sprintf(type2, "FIFO special file "); break; } printf("File %s is a %s while file %s is a %s\n", filename1, type1, filename2, type2); } void *xmalloc(size) size_t size; { void *ptr; ptr = malloc(size); if (ptr == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(2); } return(ptr); } void *xrealloc(ptr, size) void *ptr; size_t size; { ptr = realloc(ptr, size); if (ptr == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(2); } return(ptr); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* dirname - extract the directory name from a path Author: Peter Holzer */ /* Dirname -- extract directory part from a path name * * Peter Holzer (hp@vmars.tuwien.ac.at) * * $Log: dirname.c,v $ * Revision 1.1 1994/02/12 16:15:02 hjp * Initial revision * */ #include <string.h> #include <stdio.h> int main(int argc, char **argv) { char *p; char *path; if (argc != 2) { fprintf(stderr, "Usage: %s path\n", argv[0]); return(1); } path = argv[1]; p = path + strlen(path); while (p > path && p[-1] == '/') p--; /* trailing slashes */ while (p > path && p[-1] != '/') p--; /* last component */ while (p > path && p[-1] == '/') p--; /* trailing slashes */ if (p == path) { printf(path[0] == '/' ? "/\n" : ".\n"); } else { printf("%.*s\n", (int) (p - path), path); } return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* intr 1.4 - run a command with interrupts enabled * Author: Kees J. Bot * 17 Dec 1992 */ #define nil 0 #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #if __minix static char DEV_LOG[]= "/dev/log"; #else static char DEV_LOG[]= "/dev/console"; #endif static void say(const char *s) { write(2, s, strlen(s)); } static void fatal(const char *label) { int err= errno; say("intr: "); say(label); say(": "); say(strerror(err)); say("\n"); exit(1); } static void usage(void) { say("Usage: intr [-d] [-t seconds] command [arg ...]\n"); exit(1); } int main(int argc, char **argv) { int fd; unsigned n= 0; int daemonize= 0; int i; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++]+1, *end; unsigned long sec; if (opt[0] == '-' && opt[1] == 0) break; while (*opt != 0) switch (*opt++) { case 'd': /* -d */ daemonize= 1; break; case 't': /* -t n: alarm in n seconds. */ if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } sec= strtoul(opt, &end, 10); if (end == opt || *end != 0 || (n= sec) != sec) usage(); opt= ""; break; default: usage(); } } if ((argc - i) < 1) usage(); /* Try to open the controlling tty. */ if ((fd= open("/dev/tty", O_RDWR)) < 0) { if (errno != ENXIO) fatal("/dev/tty"); } if (!daemonize) { /* Bring to the foreground. If we already have a controlling * tty then use it. Otherwise try to allocate the console as * controlling tty and begin a process group. */ if (fd < 0) { if (setsid() < 0) fatal("setsid()"); fd= open("/dev/console", O_RDWR); } if (fd >= 0) { if (fd != 0) { dup2(fd, 0); close(fd); } dup2(0, 1); dup2(0, 2); } /* Set the usual signals back to the default. */ signal(SIGHUP, SIG_DFL); signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); } else { /* Send to the background. Redirect input to /dev/null, and * output to the log device. Detach from the process group. */ if (fd >= 0) { close(fd); if (setsid() < 0) fatal("setsid()"); } if ((fd= open("/dev/null", O_RDWR)) < 0) fatal("/dev/null"); if (fd != 0) { dup2(fd, 0); close(fd); } if ((fd= open(DEV_LOG, O_WRONLY)) < 0) fatal(DEV_LOG); if (fd != 1) { dup2(fd, 1); close(fd); } dup2(1, 2); /* Move to the root directory. */ (void) chdir("/"); } /* Schedule the alarm. (It is inherited over execve.) */ if (n != 0) alarm(n); /* Call program. */ execvp(argv[i], argv + i); /* Complain. */ fatal(argv[i]); return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* cleantmp 1.4 - clean out a tmp dir. Author: Kees J. Bot * 11 Apr 1991 */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> #include <time.h> #include <dirent.h> #include <errno.h> #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #ifndef S_ISLNK /* There were no symlinks in medieval times. */ #define lstat stat #endif #ifndef DEBUG #define NDEBUG #endif #include <assert.h> #define SEC_DAY (24 * 3600L) /* A full day in seconds */ #define DOTDAYS 14 /* Don't remove tmp/.* in at least 14 days. */ void report(const char *label) { fprintf(stderr, "cleantmp: %s: %s\n", label, strerror(errno)); } void fatal(const char *label) { report(label); exit(1); } void *alloc(size_t s) { void *mem; if ((mem= (void *) malloc(s)) == nil) fatal(""); return mem; } int force= 0; /* Force remove all. */ int debug= 0; /* Debug level. */ void days2time(unsigned long days, time_t *retired, time_t *dotretired) { struct tm *tm; time_t t; time(&t); tm= localtime(&t); tm->tm_hour= 0; tm->tm_min= 0; tm->tm_sec= 0; /* Step back to midnight of this day. */ t= mktime(tm); if (t < (days - 1) * SEC_DAY) { *retired= *dotretired= 0; } else { *retired= t - (days - 1) * SEC_DAY; *dotretired= t - (DOTDAYS - 1) * SEC_DAY; if (*dotretired > *retired) *dotretired= *retired; } if (debug >= 2) fprintf(stderr, "Retired: %s", ctime(retired)); if (debug >= 2) fprintf(stderr, "Dotretired: %s", ctime(dotretired)); } /* Path name construction, addpath adds a component, delpath removes it. * The string 'path' is used throughout the program as the file under * examination. */ char *path; /* Path name constructed in path[]. */ int plen= 0, pidx= 0; /* Lenght/index for path[]. */ void addpath(int *didx, char *name) /* Add a component to path. (name may also be a full path at the first call) * The index where the current path ends is stored in *pdi. */ { if (plen == 0) path= (char *) alloc((plen= 32) * sizeof(path[0])); *didx= pidx; /* Record point to go back to for delpath. */ if (pidx > 0 && path[pidx-1] != '/') path[pidx++]= '/'; do { if (*name != '/' || pidx == 0 || path[pidx-1] != '/') { if (pidx == plen && (path= (char *) realloc((void *) path, (plen*= 2) * sizeof(path[0]))) == nil ) fatal(""); path[pidx++]= *name; } } while (*name++ != 0); --pidx; /* Put pidx back at the null. The path[pidx++]= '/' * statement will overwrite it at the next call. */ assert(pidx < plen); } void delpath(int didx) { assert(0 <= didx); assert(didx <= pidx); path[pidx= didx]= 0; } struct file { struct file *next; char *name; }; struct file *listdir(void) { DIR *dp; struct dirent *entry; struct file *first, **last= &first; if ((dp= opendir(path)) == nil) { report(path); return nil; } while ((entry= readdir(dp)) != nil) { struct file *new; if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; new= (struct file *) alloc(sizeof(*new)); new->name= (char *) alloc((size_t) strlen(entry->d_name) + 1); strcpy(new->name, entry->d_name); *last= new; last= &new->next; } closedir(dp); *last= nil; return first; } struct file *shorten(struct file *list) { struct file *junk; assert(list != nil); junk= list; list= list->next; free((void *) junk->name); free((void *) junk); return list; } /* Hash list of files to ignore. */ struct file *ignore_list[1024]; size_t n_ignored= 0; unsigned ihash(char *name) /* A simple hashing function on a file name. */ { unsigned h= 0; while (*name != 0) h= (h * 0x1111) + *name++; return h & (arraysize(ignore_list) - 1); } void do_ignore(int add, char *name) /* Add or remove a file to/from the list of files to ignore. */ { struct file **ipp, *ip; ipp= &ignore_list[ihash(name)]; while ((ip= *ipp) != nil) { if (strcmp(name, ip->name) <= 0) break; ipp= &ip->next; } if (add) { ip= alloc(sizeof(*ip)); ip->name= alloc((strlen(name) + 1) * sizeof(ip->name[0])); strcpy(ip->name, name); ip->next= *ipp; *ipp= ip; n_ignored++; } else { assert(ip != nil); *ipp= ip->next; free(ip->name); free(ip); n_ignored--; } } int is_ignored(char *name) /* Is a file in the list of ignored files? */ { struct file *ip; int r; ip= ignore_list[ihash(name)]; while (ip != nil) { if ((r = strcmp(name, ip->name)) <= 0) return (r == 0); ip= ip->next; } return 0; } #define is_ignored(name) (n_ignored > 0 && (is_ignored)(name)) time_t retired, dotretired; enum level { TOP, DOWN }; void cleandir(enum level level, time_t retired) { struct file *list; struct stat st; time_t ret; if (debug >= 2) fprintf(stderr, "Cleaning %s\n", path); list= listdir(); while (list != nil) { int didx; ret= (level == TOP && list->name[0] == '.') ? dotretired : retired; /* don't rm tmp/.* too soon. */ addpath(&didx, list->name); if (is_ignored(path)) { if (debug >= 1) fprintf(stderr, "ignoring %s\n", path); do_ignore(0, path); } else if (is_ignored(list->name)) { if (debug >= 1) fprintf(stderr, "ignoring %s\n", path); } else if (lstat(path, &st) < 0) { report(path); } else if (S_ISDIR(st.st_mode)) { cleandir(DOWN, ret); if (st.st_mtime < ret || force) { if (debug < 3 && rmdir(path) < 0) { if (errno != ENOTEMPTY && errno != EEXIST) { report(path); } } else { if (debug >= 1) { fprintf(stderr, "rmdir %s\n", path); } } } } else { if (st.st_atime < ret || force) { if (debug < 3 && unlink(path) < 0) { if (errno != ENOENT) { report(path); } } else { if (debug >= 1) { fprintf(stderr, "rm %s\n", path); } } } } delpath(didx); list= shorten(list); } } void usage(void) { fprintf(stderr, "Usage: cleantmp [-d[level]] [-i file ] ... -days|-f directory ...\n"); exit(1); } int main(int argc, char **argv) { int i; unsigned long days; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; if (opt[0] == 'd') { debug= 1; if (opt[1] != 0) debug= atoi(opt + 1); } else if (opt[0] == 'i') { if (*++opt == 0) { if (i == argc) usage(); opt= argv[i++]; } do_ignore(1, opt); } else if (opt[0] == 'f' && opt[1] == 0) { force= 1; days= 1; } else { char *end; days= strtoul(opt, &end, 10); if (*opt == 0 || *end != 0 || days == 0 || ((time_t) (days * SEC_DAY)) / SEC_DAY != days ) { fprintf(stderr, "cleantmp: %s is not a valid number of days\n", opt); exit(1); } } } if (days == 0) usage(); days2time(days, &retired, &dotretired); while (i < argc) { int didx; if (argv[i][0] == 0) { fprintf(stderr, "cleantmp: empty pathname!\n"); exit(1); } addpath(&didx, argv[i]); cleandir(TOP, retired); delpath(didx); assert(path[0] == 0); i++; } exit(0); } ���������������������������������������������������������������������������������������/* du - report on disk usage Author: Alistair G. Crooks */ /* * du.c 1.1 27/5/87 agc Joypace Ltd. * 1.2 24 Mar 89 nick@nswitgould.oz * 1.3 31 Mar 89 nick@nswitgould.oz * 1.4 22 Feb 90 meulenbr@cst.prl.philips.nl * 1.5 09 Jul 91 hp@vmars.tuwien.ac.at * 1.6 01 Oct 92 kjb@cs.vu.nl * 1.7 04 Jan 93 bde * 1.8 19 Sep 94 kjb * 1.9 28 Oct 99 kjb * * Copyright 1987, Joypace Ltd., London UK. All rights reserved. * This code may be freely distributed, provided that this notice * remains attached. * * du - a public domain interpretation of du(1). * * 1.2: Fixed bug involving 14 character long filenames * 1.3: Add [-l levels] option to restrict printing. * 1.4: Added processing of multiple arguments * 1.5: Fixed processing of multiple arguments. General cleanup. * 1.6: Use readdir * 1.7: Merged 1.5 and 1.6. * Print totals even for non-dirs at top level. * Count blocks for each dir before printing total for the dir. * Count blocks for all non-special files. * Don't clutter link buffer with directories. * 1.8: Remember all links. * 1.9: Added -x flag to not cross device boundaries. Type fixes. */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <dirent.h> #define BLOCK_SIZE 1024 extern char *optarg; extern int optind; #define LINELEN 256 #define NR_ALREADY 512 #ifdef S_IFLNK #define LSTAT lstat #else #define LSTAT stat #endif typedef struct already { struct already *al_next; int al_dev; ino_t al_inum; nlink_t al_nlink; } ALREADY; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(int makedname, (char *d, char *f, char *out, int outlen)); _PROTOTYPE(int done, (Dev_t dev, Ino_t inum, Nlink_t nlink)); _PROTOTYPE(long dodir, (char *d, int thislev, Dev_t dev)); char *prog; /* program name */ char *optstr = "asxdl:"; /* options */ int silent = 0; /* silent mode */ int all = 0; /* all directory entries mode */ int crosschk = 0; /* do not cross device boundaries mode */ char *startdir = "."; /* starting from here */ int levels = 20000; /* # of directory levels to print */ ALREADY *already[NR_ALREADY]; int alc; /* * makedname - make the pathname from the directory name, and the * directory entry, placing it in out. If this would overflow, * return 0, otherwise 1. */ int makedname(d, f, out, outlen) char *d; char *f; char *out; int outlen; { char *cp; int length; length = strlen(f); if (strlen(d) + length + 2 > outlen) return(0); for (cp = out; *d; *cp++ = *d++); if (*(cp - 1) != '/') *cp++ = '/'; while (length--) *cp++ = *f++; *cp = '\0'; return(1); } /* * done - have we encountered (dev, inum) before? Returns 1 for yes, * 0 for no, and remembers (dev, inum, nlink). */ int done(dev, inum, nlink) dev_t dev; ino_t inum; nlink_t nlink; { register ALREADY **pap, *ap; pap = &already[(unsigned) inum % NR_ALREADY]; while ((ap = *pap) != NULL) { if (ap->al_inum == inum && ap->al_dev == dev) { if (--ap->al_nlink == 0) { *pap = ap->al_next; free(ap); } return(1); } pap = &ap->al_next; } if ((ap = malloc(sizeof(*ap))) == NULL) { fprintf(stderr, "du: Out of memory\n"); exit(1); } ap->al_next = NULL; ap->al_inum = inum; ap->al_dev = dev; ap->al_nlink = nlink - 1; *pap = ap; return(0); } /* * dodir - process the directory d. Return the long size (in blocks) * of d and its descendants. */ long dodir(d, thislev, dev) char *d; int thislev; dev_t dev; { int maybe_print; struct stat s; long total; char dent[LINELEN]; DIR *dp; struct dirent *entry; if (LSTAT(d, &s) < 0) { fprintf(stderr, "%s: %s: %s\n", prog, d, strerror(errno)); return 0L; } if (s.st_dev != dev && dev != 0 && crosschk) return 0; total = (s.st_size + (BLOCK_SIZE - 1)) / BLOCK_SIZE; switch (s.st_mode & S_IFMT) { case S_IFDIR: /* Directories should not be linked except to "." and "..", so this * directory should not already have been done. */ maybe_print = !silent; if ((dp = opendir(d)) == NULL) break; while ((entry = readdir(dp)) != NULL) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; if (!makedname(d, entry->d_name, dent, sizeof(dent))) continue; total += dodir(dent, thislev - 1, s.st_dev); } closedir(dp); break; case S_IFBLK: case S_IFCHR: /* st_size for special files is not related to blocks used. */ total = 0; /* Fall through. */ default: if (s.st_nlink > 1 && done(s.st_dev, s.st_ino, s.st_nlink)) return 0L; maybe_print = all; break; } if (thislev >= levels || (maybe_print && thislev >= 0)) printf("%ld\t%s\n", total, d); return(total); } int main(argc, argv) int argc; char **argv; { int c; prog = argv[0]; while ((c = getopt(argc, argv, optstr)) != EOF) switch (c) { case 'a': all = 1; break; case 's': silent = 1; break; case 'x': case 'd': crosschk = 1; break; case 'l': levels = atoi(optarg); break; default: fprintf(stderr, "Usage: %s [-asx] [-l levels] [startdir]\n", prog); exit(1); } do { if (optind < argc) startdir = argv[optind++]; alc = 0; (void) dodir(startdir, levels, 0); } while (optind < argc); return(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#if ever static char sccsid[] = "@(#)printf.c (U of Maryland) FLB 6-Jan-1987"; static char RCSid[] = "@(#)$Header: printf.c,v 1.4 87/01/29 20:52:30 fred Exp $"; #endif /* * Printf - Duplicate the C library routine of the same name, but from * the shell command level. * * Fred Blonder <fred@Mimsy.umd.edu> * * To Compile: % cc -s -O printf.c -o printf * * $Log: printf.c,v $ * Revision 1.4 87/01/29 20:52:30 fred * Re-installed backslash-notation conversion for string & char arguments. * * Revision 1.3 87/01/29 20:44:23 fred * Converted to portable algorithm. * Added Roman format for integers. * 29-Jan-87 FLB * * Revision 1.2 87/01/09 19:10:57 fred * Fixed bug in argument-count error-checking. * Changed backslash escapes within strings to correspond to ANSII C * draft standard. (9-Jan-87 FLB) * */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define EX_OK 0 #define EX_USAGE 1 int ctrl(char *s); #define atoi(a) strtoul((a), NULL, 0) /****************************************************************************/ int main(int argc, char *argv[]) { register char *cp, *conv_spec, **argp, **ep; char *ctor(int x); if (argc < 2) { fprintf(stderr, "printf: Usage: printf <format-string> [ arg1 . . . ]\n"); exit(EX_USAGE); } argp = &argv[2]; /* Point at first arg (if any) beyond format string. */ ep = &argv[argc]; /* Point beyond last arg. */ ctrl(argv[1]); /* Change backslash notation to control chars in fmt string. */ /* Scan format string for conversion specifications, and do appropriate conversion on the corresponding argument. */ for (cp = argv[1]; *cp; cp++) { register int dynamic_count; /* Look for next conversion spec. */ while (*cp && *cp != '%') { putchar(*cp++); } if (!*cp) /* End of format string */ break; dynamic_count = 0; /* Begin counting dynamic field width specs. */ conv_spec = cp++; /* Remember where this conversion begins. */ for (;*cp; cp++) { /* Scan until conversion character. */ char conv_buf[BUFSIZ]; /* Save conversion string here. */ register int conv_len; /* Length of ``conv_buf''. */ switch (*cp) { /* Field-width spec.: Keep scanning. */ case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': continue; case '*': /* Dynamic field-width spec */ dynamic_count++; continue; case 's': /* String */ if (&argp[dynamic_count] >= ep) { fprintf(stderr, "printf: Not enough args for format.\n" ); exit(EX_USAGE); } (void) strncpy(conv_buf, conv_spec, conv_len = cp - conv_spec + 1); conv_buf[conv_len] = '\0'; switch (dynamic_count) { case 0: ctrl(*argp); printf(conv_buf, *argp++); break; case 1: { register int a1; a1 = atoi(*argp++); ctrl(*argp); printf(conv_buf, a1, *argp++); } break; case 2: { register int a1, a2; a1 = atoi(*argp++); a2 = atoi(*argp++); ctrl(*argp); printf(conv_buf, a1, a2, *argp++); } break; } goto out; case 'c': /* Char */ if (&argp[dynamic_count] >= ep) { fprintf(stderr, "printf: Not enough args for format.\n" ); exit(EX_USAGE); } (void) strncpy(conv_buf, conv_spec, conv_len = cp - conv_spec + 1); conv_buf[conv_len] = '\0'; switch (dynamic_count) { case 0: ctrl(*argp); printf(conv_buf, **argp++); break; case 1: { register int a1; a1 = atoi(*argp++); ctrl(*argp); printf(conv_buf, a1, **argp++); } break; case 2: { register int a1, a2; a1 = atoi(*argp++); a2 = atoi(*argp++); ctrl(*argp); printf(conv_buf, a1, a2, **argp++); } break; } goto out; case 'd': /* Integer */ case 'o': case 'x': case 'X': case 'u': if (&argp[dynamic_count] >= ep) { fprintf(stderr, "printf: Not enough args for format.\n" ); exit(EX_USAGE); } (void) strncpy(conv_buf, conv_spec, conv_len = cp - conv_spec + 1); conv_buf[conv_len] = '\0'; switch (dynamic_count) { case 0: printf(conv_buf, atoi(*argp++)); break; case 1: { register int a1; a1 = atoi(*argp++); printf(conv_buf, a1, atoi(*argp++)); } break; case 2: { register int a1, a2; a1 = atoi(*argp++); a2 = atoi(*argp++); printf(conv_buf, a1, a2, atoi(*argp++)); } break; } goto out; case 'f': /* Real */ case 'e': case 'g': if (&argp[dynamic_count] >= ep) { fprintf(stderr, "printf: Not enough args for format.\n" ); exit(EX_USAGE); } (void) strncpy(conv_buf, conv_spec, conv_len = cp - conv_spec + 1); conv_buf[conv_len] = '\0'; switch (dynamic_count) { case 0: printf(conv_buf, atof(*argp++)); break; case 1: { register int a1; a1 = atoi(*argp++); printf(conv_buf, a1, atof(*argp++)); } break; case 2: { register int a1, a2; a1 = atoi(*argp++); a2 = atoi(*argp++); printf(conv_buf, a1, a2, atof(*argp++)); } break; } goto out; case 'r': /* Roman (Well, why not?) */ if (&argp[dynamic_count] >= ep) { fprintf(stderr, "printf: Not enough args for format.\n" ); exit(EX_USAGE); } (void) strncpy(conv_buf, conv_spec, conv_len = cp - conv_spec + 1); conv_buf[conv_len] = '\0'; conv_buf[conv_len - 1] = 's'; switch (dynamic_count) { case 0: printf(conv_buf, ctor(atoi(*argp++))); break; case 1: { register int a1; a1 = atoi(*argp++); printf(conv_buf, a1, ctor(atoi(*argp++))); } break; case 2: { register int a1, a2; a1 = atoi(*argp++); a2 = atoi(*argp++); printf(conv_buf, a1, a2, ctor(atoi(*argp++))); } break; } goto out; case '%': /* Boring */ putchar('%'); break; default: /* Probably an error, but let user have his way. */ continue; } } out: ; } exit(EX_OK); } /****************************************************************************/ /* Convert backslash notation to control characters, in place. */ int ctrl(char *s) { register char *op; static int val; for (op = s; *s; s++) if (*s == '\\') switch (*++s) { case '\0': /* End-of-string: user goofed */ goto out; case '\\': /* Backslash */ *op++ = '\\'; break; case 'n': /* newline */ *op++ = '\n'; break; case 't': /* horizontal tab */ *op++ = '\t'; break; case 'r': /* carriage-return */ *op++ = '\r'; break; case 'f': /* form-feed */ *op++ = '\f'; break; case 'b': /* backspace */ *op++ = '\b'; break; case 'v': /* vertical tab */ *op++ = '\13'; break; case 'a': /* WARNING! DANGER! DANGER! DANGER! */ *op++ = '\7'; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': { /* octal constant */ register int digits; val = 0; (void) sscanf(s, "%3o", &val); *op++ = val; for (digits = 3; s[1] && strchr("01234567", s[1]) && --digits > 0; s++); } break; case 'x': /* hex constant */ case 'X': s++; { register int digits; val = 0; (void) sscanf(s, "%3x", &val); *op++ = val; for (digits = 3; *s && s[1] && strchr("0123456789abcdefABCDEF", s[1]) && --digits > 0; s++); } break; } else *op++ = *s; out: *op = '\0'; } /****************************************************************************/ /* Convert integer to Roman Numerals. (Have have you survived without it?) */ struct roman { unsigned r_mag; char r_units, r_fives; } roman[] = { { 1000, 'M', '\0', }, { 100, 'C', 'D', }, { 10, 'X', 'L', }, { 1, 'I', 'V', }, }; char *ctor(int x) { register struct roman *mp; statIN��KN����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ic char buf[BUFSIZ]; register char *cp = buf; /* I've never actually seen a roman numeral with a minus-sign. Probably ought to print out some appropriate latin phrase instead. */ if (x < 0) { *cp++ = '-'; x = -x; } for (mp = roman; x; mp++) { register unsigned units; units = x / mp->r_mag; x = x % mp->r_mag; if (cp > &buf[BUFSIZ-2]) return "???"; if (units == 9 && mp > roman) { /* Do inverse notation: Eg: ``IX''. */ *cp++ = mp->r_units; *cp++ = mp[-1].r_units; } else if (units == 4 && mp->r_fives) { /* Inverse notation for half-decades: Eg: ``IV'' */ *cp++ = mp->r_units; *cp++ = mp->r_fives; } else { /* Additive notation */ if (units >= 5 && mp->r_fives) { *cp++ = mp->r_fives; units -= 5; } while (units--) { *cp++ = mp->r_units; if (cp > &buf[BUFSIZ-5]) return "???"; } } } *cp = '\0'; return buf; } /****************************************************************************/ ���������������������������������������������������������������������/* mkswap 1.0 - Initialize a swap partition or file * Author: Kees J. Bot * 6 Jan 2001 */ #define nil ((void*)0) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ioctl.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include <minix/u64.h> #include <minix/partition.h> #include <minix/swap.h> #include <fs/const.h> #include <fs/type.h> #include <fs/super.h> static void usage(void) { fprintf(stderr, "Usage: mkswap [-f] device-or-file [size[km]]\n"); exit(1); } int main(int argc, char **argv) { int first; int i; char *file; unsigned long offset, size, devsize; int fd; struct stat st; ssize_t r; struct super_block super; swap_hdr_t swap_hdr; u8_t block[BLOCK_SIZE]; first= 0; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++]+1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'f': first= 1; break; default: usage(); } } if (i == argc) usage(); file= argv[i++]; size= 0; if (i < argc) { char *end; unsigned long m; size= strtoul(argv[i], &end, 10); if (end == argv[i]) usage(); m= 1024; if (*end != 0) { switch (*end) { case 'm': case 'M': m *= 1024; /*FALL THROUGH*/ case 'k': case 'K': end++; break; } } if (*end != 0 || size == -1 || (size * m) / m != size || (size *= m) <= SWAP_OFFSET ) { fprintf(stderr, "mkswap: %s: Bad size\n", argv[i]); exit(1); } i++; } if (i != argc) usage(); /* Open the device or file. */ if ((fd= open(file, O_RDWR | O_CREAT | O_TRUNC, 0600)) < 0) { fprintf(stderr, "mkswap: Can't open %s: %s\n", file, strerror(errno)); exit(1); } /* File or device? */ (void) fstat(fd, &st); if (S_ISBLK(st.st_mode) || S_ISCHR(st.st_mode)) { struct partition part; /* How big is the partition? */ if (ioctl(fd, DIOCGETP, &part) < 0) { fprintf(stderr, "mkswap: Can't determine the size of %s: %s\n", file, strerror(errno)); exit(1); } devsize= cv64ul(part.size); offset= 0; if (!first) { /* Is there a file system? */ r= -1; if (lseek(fd, SUPER_BLOCK * BLOCK_SIZE, SEEK_SET) == -1 || (r= read(fd, block, BLOCK_SIZE)) < BLOCK_SIZE ) { fprintf(stderr, "mkswap: %s: %s\n", file, r >= 0 ? "End of file" : strerror(errno)); exit(1); } memcpy(&super, block, sizeof(super)); if (super.s_magic == SUPER_MAGIC) { offset= (unsigned long) super.s_nzones * BLOCK_SIZE; } else if (super.s_magic == SUPER_V2) { offset= (unsigned long) super.s_zones * BLOCK_SIZE; } else { first= 1; } } if (size == 0) size= devsize - offset; if (size == 0 || offset + size > devsize) { fprintf(stderr, "mkswap: There is no room on %s for ", file); if (size > 0) fprintf(stderr, "%lu kilobytes of ", size/1024); fprintf(stderr, "swapspace\n"); if (offset > 0) { fprintf(stderr, "(Use the -f flag to wipe the file system)\n"); } exit(1); } } else if (S_ISREG(st.st_mode)) { /* Write to the swap file to guarantee space for MM. */ unsigned long n; if (size == 0) { fprintf(stderr, "mkswap: No size specified for %s\n", file); usage(); } memset(block, 0, sizeof(block)); for (n= 0; n < size; n += r) { r= size > sizeof(block) ? sizeof(block) : size; if ((r= write(fd, block, r)) <= 0) { fprintf(stderr, "mkswap: %s: %s\n", file, r == 0 ? "End of file" : strerror(errno)); exit(1); } } first= 1; } else { fprintf(stderr, "mkswap: %s is not a device or a file\n", file); exit(1); } if (offset < SWAP_OFFSET) { offset += SWAP_OFFSET; if (size < SWAP_OFFSET) size= 0; else size -= SWAP_OFFSET; } swap_hdr.sh_magic[0]= SWAP_MAGIC0; swap_hdr.sh_magic[1]= SWAP_MAGIC1; swap_hdr.sh_magic[2]= SWAP_MAGIC2; swap_hdr.sh_magic[3]= SWAP_MAGIC3; swap_hdr.sh_version= SH_VERSION; swap_hdr.sh_priority= 0; swap_hdr.sh_offset= offset; swap_hdr.sh_swapsize= size; r= -1; if (lseek(fd, SWAP_BOOTOFF, SEEK_SET) == -1 || (r= read(fd, block, sizeof(block))) < BLOCK_SIZE ) { fprintf(stderr, "mkswap: %s: %s\n", file, file, r >= 0 ? "End of file" : strerror(errno)); exit(1); } r= (first ? SWAP_BOOTOFF : OPTSWAP_BOOTOFF) - SWAP_BOOTOFF; memcpy(block + r, &swap_hdr, sizeof(swap_hdr)); r= -1; if (lseek(fd, SWAP_BOOTOFF, SEEK_SET) == -1 || (r= write(fd, block, sizeof(block))) < BLOCK_SIZE ) { fprintf(stderr, "mkswap: %s: %s\n", file, file, r >= 0 ? "End of file" : strerror(errno)); exit(1); } printf("%s: swapspace at offset %lu, size %lu kilobytes\n", file, offset / 1024, size / 1024); return 0; } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright 1987 Brian Beattie Rights Reserved. * * Permission to copy and/or distribute granted under the * following conditions: * * 1). No charge may be made other than resonable charges * for reproduction. * * 2). This notice must remain intact. * * 3). No further restrictions may be added. * */ /* This program used to be in many little pieces, with this makefile: .SUFFIXES: .c .s CFLAGS = -F OBJS = append.s catsub.s ckglob.s deflt.s del.s docmd.s doglob.s\ doprnt.s doread.s dowrite.s ed.s egets.s find.s getfn.s getlst.s\ getnum.s getone.s getptr.s getrhs.s gettxt.s ins.s join.s maksub.s\ move.s optpat.s set.s setbuf.s subst.s getpat.s matchs.s amatch.s\ unmkpat.s omatch.s makepat.s bitmap.s dodash.s esc.s System.s ed: $(OBJS) cc -T. -i -o ed $(OBJS) */ #include <sys/types.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> /****************************/ /* tools.h */ /* * #defines for non-printing ASCII characters */ #define NUL 0x00 /* ^@ */ #define EOS 0x00 /* end of string */ #define SOH 0x01 /* ^A */ #define STX 0x02 /* ^B */ #define ETX 0x03 /* ^C */ #define EOT 0x04 /* ^D */ #define ENQ 0x05 /* ^E */ #define ACK 0x06 /* ^F */ #define BEL 0x07 /* ^G */ #define BS 0x08 /* ^H */ #define HT 0x09 /* ^I */ #define LF 0x0a /* ^J */ #define NL '\n' #define VT 0x0b /* ^K */ #define FF 0x0c /* ^L */ #define CR 0x0d /* ^M */ #define SO 0x0e /* ^N */ #define SI 0x0f /* ^O */ #define DLE 0x10 /* ^P */ #define DC1 0x11 /* ^Q */ #define DC2 0x12 /* ^R */ #define DC3 0x13 /* ^S */ #define DC4 0x14 /* ^T */ #define NAK 0x15 /* ^U */ #define SYN 0x16 /* ^V */ #define ETB 0x17 /* ^W */ #define CAN 0x18 /* ^X */ #define EM 0x19 /* ^Y */ #define SUB 0x1a /* ^Z */ #define ESC 0x1b /* ^[ */ #define FS 0x1c /* ^\ */ #define GS 0x1d /* ^] */ #define RS 0x1e /* ^^ */ #define US 0x1f /* ^_ */ #define SP 0x20 /* space */ #define DEL 0x7f /* DEL */ #define TRUE 1 #define FALSE 0 #define ERR -2 /* Definitions of meta-characters used in pattern matching * routines. LITCHAR & NCCL are only used as token identifiers; * all the others are also both token identifier and actual symbol * used in the regular expression. */ #define BOL '^' #define EOL '$' #define ANY '.' #define LITCHAR 'L' #define ESCAPE '\\' #define CCL '[' /* Character class: [...] */ #define CCLEND ']' #define NEGATE '^' #define NCCL '!' /* Negative character class [^...] */ #define CLOSURE '*' #define OR_SYM '|' #define DITTO '&' #define OPEN '(' #define CLOSE ')' /* Largest permitted size for an expanded character class. (i.e. the class * [a-z] will expand into 26 symbols; [a-z0-9] will expand into 36.) */ #define CLS_SIZE 128 /* * Tokens are used to hold pattern templates. (see makepat()) */ typedef char BITMAP; typedef struct token { char tok; char lchar; BITMAP *bitmap; struct token *next; } TOKEN; #define TOKSIZE sizeof (TOKEN) /* * An absolute maximun for strings. */ #define MAXSTR 132 /* Maximum numbers of characters in a line */ /* Macros */ #define max(a,b) ((a>b)?a:b) #define min(a,b) ((a<b)?a:b) #define toupper(c) (c>='a'&&c<='z'?c-32:c) /* ed.h */ #define FATAL (ERR-1) struct line { int l_stat; /* empty, mark */ struct line *l_prev; struct line *l_next; char l_buff[1]; }; typedef struct line LINE; #define LINFREE 1 /* entry not in use */ #define LGLOB 2 /* line marked global */ /* max number of chars per line */ #define MAXLINE (sizeof(int) == 2 ? 256 : 8192) #define MAXPAT 256 /* max number of chars per replacement * pattern */ /* max file name size */ #define MAXFNAME (sizeof(int) == 2 ? 256 : 1024) extern LINE line0; extern int curln, lastln, line1, line2, nlines; extern int nflg; /* print line number flag */ extern int lflg; /* print line in verbose mode */ extern char *inptr; /* tty input buffer */ extern char linbuf[], *linptr; /* current line */ extern int truncflg; /* truncate long line flag */ extern int eightbit; /* save eighth bit */ extern int nonascii; /* count of non-ascii chars read */ extern int nullchar; /* count of null chars read */ extern int truncated; /* count of lines truncated */ extern int fchanged; /* file changed */ #define nextln(l) ((l)+1 > lastln ? 0 : (l)+1) #define prevln(l) ((l)-1 < 0 ? lastln : (l)-1) /* amatch.c */ /* #include <stdio.h> */ /* #include "tools.h" */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(static char *match, (char *lin, TOKEN *pat, char *boln)); _PROTOTYPE(char *amatch, (char *lin, TOKEN *pat, char *boln)); _PROTOTYPE(int append, (int line, int glob)); _PROTOTYPE(BITMAP *makebitmap, (unsigned size)); _PROTOTYPE(int setbit, (unsigned c, char *map, unsigned val)); _PROTOTYPE(int testbit, (unsigned c, char *map)); _PROTOTYPE(char *catsub, (char *from, char *to, char *sub, char *new, char *newend)); _PROTOTYPE(int ckglob, (void)); _PROTOTYPE(int deflt, (int def1, int def2)); _PROTOTYPE(int del, (int from, int to)); _PROTOTYPE(int docmd, (int glob)); _PROTOTYPE(int dolst, (int line1, int line2)); _PROTOTYPE(char *dodash, (int delim, char *src, char *map)); _PROTOTYPE(int doglob, (void)); _PROTOTYPE(int doprnt, (int from, int to)); _PROTOTYPE(void prntln, (char *str, int vflg, int lin)); _PROTOTYPE(void putcntl, (int c, FILE *stream)); _PROTOTYPE(int doread, (int lin, char *fname)); _PROTOTYPE(int dowrite, (int from, int to, char *fname, int apflg)); _PROTOTYPE(void intr, (int sig)); _PROTOTYPE(int egets, (char *str, int size, FILE *stream)); _PROTOTYPE(int esc, (char **s)); _PROTOTYPE(int find, (TOKEN *pat, int dir)); _PROTOTYPE(char *getfn, (void)); _PROTOTYPE(int getlst, (void)); _PROTOTYPE(int getnum, (int first)); _PROTOTYPE(int getone, (void)); _PROTOTYPE(TOKEN *getpat, (char *arg)); _PROTOTYPE(LINE *getptr, (int num)); _PROTOTYPE(int getrhs, (char *sub)); _PROTOTYPE(char *gettxt, (int num)); _PROTOTYPE(int ins, (char *str)); _PROTOTYPE(int System, (char *c)); _PROTOTYPE(int join, (int first, int last)); _PROTOTYPE(TOKEN *makepat, (char *arg, int delim)); _PROTOTYPE(char *maksub, (char *sub, int subsz)); _PROTOTYPE(char *matchs, (char *line, TOKEN *pat, int ret_endp)); _PROTOTYPE(int move, (int num)); _PROTOTYPE(int transfer, (int num)); _PROTOTYPE(int omatch, (char **linp, TOKEN *pat, char *boln)); _PROTOTYPE(TOKEN *optpat, (void)); _PROTOTYPE(int set, (void)); _PROTOTYPE(int show, (void)); _PROTOTYPE(void relink, (LINE *a, LINE *x, LINE *y, LINE *b)); _PROTOTYPE(void clrbuf, (void)); _PROTOTYPE(void set_buf, (void)); _PROTOTYPE(int subst, (TOKEN *pat, char *sub, int gflg, int pflag)); _PROTOTYPE(void unmakepat, (TOKEN *head)); /* Scans throught the pattern template looking for a match * with lin. Each element of lin is compared with the template * until either a mis-match is found or the end of the template * is reached. In the former case a 0 is returned; in the latter, * a pointer into lin (pointing to the character following the * matched pattern) is returned. * * "lin" is a pointer to the line being searched. * "pat" is a pointer to a template made by makepat(). * "boln" is a pointer into "lin" which points at the * character at the beginning of the line. */ char *paropen[9], *parclose[9]; int between, parnum; char *amatch(lin, pat, boln) char *lin; TOKEN *pat; char *boln; { between = 0; parnum = 0; lin = match(lin, pat, boln); if (between) return 0; while (parnum < 9) { paropen[parnum] = parclose[parnum] = ""; parnum++; } return lin; } static char *match(lin, pat, boln) char *lin; TOKEN *pat; char *boln; { register char *bocl, *rval, *strstart; if (pat == 0) return 0; strstart = lin; while (pat) { if (pat->tok == CLOSURE && pat->next) { /* Process a closure: first skip over the closure * token to the object to be repeated. This object * can be a character class. */ pat = pat->next; /* Now match as many occurrences of the closure * pattern as possible. */ bocl = lin; while (*lin && omatch(&lin, pat, boln)); /* 'Lin' now points to the character that made made * us fail. Now go on to process the rest of the *XN��ZN��[N��\N��]N��^N��_N��`N��aN��bN��cN��dN��eN��fN��gN��hN��iN��jN��kN��lN��mN��nN��oN��pN��qN��rN��sN��tN��uN��vN��wN��xN��yN��zN��{N��|N������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ string. A problem here is a character following * the closure which could have been in the closure. * For example, in the pattern "[a-z]*t" (which * matches any lower-case word ending in a t), the * final 't' will be sucked up in the while loop. * So, if the match fails, we back up a notch and try * to match the rest of the string again, repeating * this process recursively until we get back to the * beginning of the closure. The recursion goes, at * most two levels deep. */ if (pat = pat->next) { int savbtwn = between; int savprnm = parnum; while (bocl <= lin) { if (rval = match(lin, pat, boln)) { /* Success */ return(rval); } else { --lin; between = savbtwn; parnum = savprnm; } } return(0); /* match failed */ } } else if (pat->tok == OPEN) { if (between || parnum >= 9) return 0; paropen[parnum] = lin; between = 1; pat = pat->next; } else if (pat->tok == CLOSE) { if (!between) return 0; parclose[parnum++] = lin; between = 0; pat = pat->next; } else if (omatch(&lin, pat, boln)) { pat = pat->next; } else { return(0); } } /* Note that omatch() advances lin to point at the next character to * be matched. Consequently, when we reach the end of the template, * lin will be pointing at the character following the last character * matched. The exceptions are templates containing only a BOLN or * EOLN token. In these cases omatch doesn't advance. * * A philosophical point should be mentioned here. Is $ a position or a * character? (i.e. does $ mean the EOL character itself or does it * mean the character at the end of the line.) I decided here to * make it mean the former, in order to make the behavior of match() * consistent. If you give match the pattern ^$ (match all lines * consisting only of an end of line) then, since something has to be * returned, a pointer to the end of line character itself is * returned. */ return((char *) max(strstart, lin)); } /* append.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int append(line, glob) int line, glob; { int stat; char lin[MAXLINE]; if (glob) return(ERR); curln = line; while (1) { if (nflg) printf("%6d. ", curln + 1); if (fgets(lin, MAXLINE, stdin) == NULL) return(EOF); if (lin[0] == '.' && lin[1] == '\n') return (0); stat = ins(lin); if (stat < 0) return(ERR); } } /* bitmap.c */ /* * BITMAP.C - makebitmap, setbit, testbit * bit-map manipulation routines. * * Copyright (c) Allen I. Holub, all rights reserved. This program may * for copied for personal, non-profit use only. * */ #ifdef DEBUG /* #include <stdio.h> */ #endif /* #include "tools.h" */ BITMAP *makebitmap(size) unsigned size; { /* Make a bit map with "size" bits. The first entry in the map is an * "unsigned int" representing the maximum bit. The map itself is * concatenated to this integer. Return a pointer to a map on * success, 0 if there's not enough memory. */ unsigned *map, numbytes; numbytes = (size >> 3) + ((size & 0x07) ? 1 : 0); #ifdef DEBUG printf("Making a %d bit map (%d bytes required)\n", size, numbytes); #endif if (map = (unsigned *) malloc(numbytes + sizeof(unsigned))) { *map = size; memset(map + 1, 0, numbytes); } return((BITMAP *) map); } int setbit(c, map, val) unsigned c, val; char *map; { /* Set bit c in the map to val. If c > map-size, 0 is returned, else * 1 is returned. */ if (c >= *(unsigned *) map) /* if c >= map size */ return 0; map += sizeof(unsigned); /* skip past size */ if (val) map[c >> 3] |= 1 << (c & 0x07); else map[c >> 3] &= ~(1 << (c & 0x07)); return 1; } int testbit(c, map) unsigned c; char *map; { /* Return 1 if the bit corresponding to c in map is set. 0 if it is not. */ if (c >= *(unsigned *) map) return 0; map += sizeof(unsigned); return(map[c >> 3] & (1 << (c & 0x07))); } /* catsub.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ extern char *paropen[9], *parclose[9]; char *catsub(from, to, sub, new, newend) char *from, *to, *sub, *new, *newend; { char *cp, *cp2; for (cp = new; *sub != EOS && cp < newend;) { if (*sub == DITTO) for (cp2 = from; cp2 < to;) { *cp++ = *cp2++; if (cp >= newend) break; } else if (*sub == ESCAPE) { sub++; if ('1' <= *sub && *sub <= '9') { char *parcl = parclose[*sub - '1']; for (cp2 = paropen[*sub - '1']; cp2 < parcl;) { *cp++ = *cp2++; if (cp >= newend) break; } } else *cp++ = *sub; } else *cp++ = *sub; sub++; } return(cp); } /* ckglob.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int ckglob() { TOKEN *glbpat; char c, delim; char lin[MAXLINE]; int num; LINE *ptr; c = *inptr; if (c != 'g' && c != 'v') return(0); if (deflt(1, lastln) < 0) return(ERR); delim = *++inptr; if (delim <= ' ') return(ERR); glbpat = optpat(); if (*inptr == delim) inptr++; ptr = getptr(1); for (num = 1; num <= lastln; num++) { ptr->l_stat &= ~LGLOB; if (line1 <= num && num <= line2) { strcpy(lin, ptr->l_buff); strcat(lin, "\n"); if (matchs(lin, glbpat, 0)) { if (c == 'g') ptr->l_stat |= LGLOB; } else { if (c == 'v') ptr->l_stat |= LGLOB; } } ptr = ptr->l_next; } return(1); } /* deflt.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int deflt(def1, def2) int def1, def2; { if (nlines == 0) { line1 = def1; line2 = def2; } if (line1 > line2 || line1 <= 0) return(ERR); return(0); } /* del.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int del(from, to) int from, to; { LINE *first, *last, *next, *tmp; if (from < 1) from = 1; first = getptr(prevln(from)); last = getptr(nextln(to)); next = first->l_next; while (next != last && next != &line0) { tmp = next->l_next; free((char *) next); next = tmp; } relink(first, last, first, last); lastln -= (to - from) + 1; curln = prevln(from); return(0); } /* docmd.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ char fname[MAXFNAME]; int fchanged; extern int nofname; extern int mark[]; int docmd(glob) int glob; { static char rhs[MAXPAT]; TOKEN *subpat; int c, err, line3; int apflg, pflag, gflag; int nchng; char *fptr; pflag = FALSE; while (*inptr == SP && *inptr == HT) inptr++; c = *inptr++; switch (c) { case NL: if (nlines == 0) { if ((line2 = nextln(curln)) == 0) return(ERR); } curln = line2; return(1); break; case '=': printf("%d\n", line2); break; case 'a': if (*inptr != NL || nlines > 1) return(ERR); if (append(line1, glob) < 0) return(ERR);; fchanged = TRUE; break; case 'c': if (*inptr != NL) return(ERR); if (deflt(curln, curln) < 0) return(ERR); if (del(line1, line2) < 0) return(ERR); if (append(curln, glob) < 0) return (ERR); fchanged = TRUE; break; case 'd': if (*inptr != NL) return(ERR); if (deflt(curln, curln) < 0) return(ERR); if (del(line1, line2) < 0) return(ERR); if (nextln(curln) != 0) curln = nextln(curln); fchanged = TRUE; break; case 'e': if (nlines > 0) return(ERR); if (fchanged) { fchanged = FALSE; return(ERR); } /* FALL THROUGH */ case 'E': if (nlines > 0) return(ERR); if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); if ((fptr = getfn()) == NULL) return(ERR); clrbuf(); if ((err = doread(0, fptr)) < 0) return(err); strcpy(fname, fptr); fchanged = FALSE; break; case 'f': if (nlines > 0) return(ERR); if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); if ((fptr = getfn()) == NULL) return(ERR); if (nofname) printf("%s\n", fname); else strcpy(fname, fptr); break; case 'i': if (*inptr != NL || nlines > 1) return(ERR); if (append(prevln(line1), glob) < 0) return(ERR); fchanged = TRUE; break; case 'j': if (*inptr != NL || deflt(curln, curln + 1) < 0) return(ERR); if (join(line1, line2) < 0) return(ERR); break; case 'k': while (*inptr == ' ' || *inptr == HT) inptr++; if (*inptr < 'a' || *inptr > 'z') return ERR; c = *inptr++; if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); mark[c - 'a'] = line1; break; case 'l': if (*inptr != NL) return(ERR); if (deflt(curln, curln) < 0) return (ERR); if (dolst(line1, line2) < 0) return (ERR); break; case 'm': if ((line3 = getone()) < 0) return(ERR); if (deflt(curln, curln) < 0) return (ERR); if (move(line3) < 0) return (ERR); fchanged = TRUE; break; case 'P': case 'p': if (*inptr != NL) return(ERR); if (deflt(curln, curln) < 0) return (ERR); if (doprnt(line1, line2) < 0) return (ERR); break; case 'q': if (fchanged) { fchanged = FALSE; return(ERR); } /* FALL THROUGH */ case 'Q': if (*inptr == NL && nlines == 0 && !glob) return(EOF); else return(ERR); case 'r': if (nlines > 1) return(ERR); if (nlines == 0) line2 = lastln; if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); if ((fptr = getfn()) == NULL) return(ERR); if ((err = doread(line2, fptr)) < 0) return(err); fchanged = TRUE; break; case 's': if (*inptr == 'e') return(set()); while (*inptr == SP || *inptr == HT) inptr++; if ((subpat = optpat()) == NULL) return (ERR); if ((gflag = getrhs(rhs)) < 0) return (ERR); if (*inptr == 'p') pflag++; if (deflt(curln, curln) < 0) return (ERR); if ((nchng = subst(subpat, rhs, gflag, pflag)) < 0) return (ERR); if (nchng) fchanged = TRUE; break; case 't': if ((line3 = getone()) < 0) return(ERR); if (deflt(curln, curln) < 0) return (ERR); if (transfer(line3) < 0) return (ERR); fchanged = TRUE; break; case 'W': case 'w': apflg = (c == 'W'); if (*inptr != ' ' && *inptr != HT && *inptr != NL) return(ERR); if ((fptr = getfn()) == NULL) return(ERR); if (deflt(1, lastln) < 0) return(ERR); if (dowrite(line1, line2, fptr, apflg) < 0) return (ERR); fchanged = FALSE; break; case 'x': if (*inptr == NL && nlines == 0 && !glob) { if ((fptr = getfn()) == NULL) return(ERR); if (dowrite(1, lastln, fptr, 0) >= 0) return (EOF); } return(ERR); case 'z': if (deflt(curln, curln) < 0) return(ERR); switch (*inptr) { case '-': if (doprnt(line1 - 21, line1) < 0) return(ERR); break; case '.': if (doprnt(line1 - 11, line1 + 10) < 0) return(ERR); break; case '+': case '\n': if (doprnt(line1, line1 + 21) < 0) return(ERR); break; } break; default: return(ERR); } return(0); } int dolst(line1, line2) int line1, line2; { int oldlflg = lflg, p; lflg = 1; p = doprnt(line1, line2); lflg = oldlflg; return p; } /* dodash.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Expand the set pointed to by *src into dest. * Stop at delim. Return 0 on error or size of * character class on success. Update *src to * point at delim. A set can have one element * {x} or several elements ( {abcdefghijklmnopqrstuvwxyz} * and {a-z} are equivalent ). Note that the dash * notation is expanded as sequential numbers. * This means (since we are using the ASCII character * set) that a-Z will contain the entire alphabet * plus the symbols: [\]^_`. The maximum number of * characters in a character class is defined by maxccl. */ char *dodash(delim, src, map) int delim; char *src, *map; { register int first, last; char *start; start = src; while (*src && *src != delim) { if (*src != '-') setbit(esc(&src), map, 1); else if (src == start || *(src + 1) == delim) setbit('-', map, 1); else { src++; if (*src < *(src - 2)) { first = *src; last = *(src - 2); } else { first = *(src - 2); last = *src; } while (++first <= last) setbit(first, map, 1); } src++; } return(src); } /* doglob.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int doglob() { int lin, stat; char *cmd; LINE *ptr; cmd = inptr; while (1) { ptr = getptr(1); for (lin = 1; lin <= lastln; lin++) { if (ptr->l_stat & LGLOB) break; ptr = ptr->l_next; } if (lin > lastln) break; ptr->l_stat &= ~LGLOB; curln = lin; inptr = cmd; if ((stat = getlst()) < 0) return(stat); if ((stat = docmd(1)) < 0) return (stat); } return(curln); } /* doprnt.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int doprnt(from, to) int from, to; { int i; LINE *lptr; from = from < 1 ? 1 : from; to = to > lastln ? lastln : to; if (to != 0) { lptr = getptr(from); for (i = from; i <= to; i++) { prntln(lptr->l_buff, lflg, (nflg ? i : 0)); lptr = lptr->l_next; } curln = to; } return(0); } void prntln(str, vflg, lin) char *str; int vflg, lin; { if (lin) printf("%7d ", lin); while (*str && *str != NL) { if (*str < ' ' || *str >= 0x7f) { switch (*str) { case '\t': if (vflg) putcntl(*str, stdout); else putc(*str, stdout); break; case DEL: putc('^', stdout); putc('?', stdout); break; default: putcntl(*str, stdout); break; } } else putc(*str, stdout); str++; } if (vflg) putc('$', stdout); putc('\n', stdout); } void putcntl(c, stream) char c; FILE *stream; { putc('^', stream); putc((c & 31) | '@', stream); } /* doread.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ extern int diag; int doread(lin, fname) int lin; char *fname; { FILE *fp; int err; long bytes; int lines; static char str[MAXLINE]; err = 0; nonascii = nullchar = truncated = 0; if (diag) printf("\"%s\" ", fname); if ((fp = fopen(fname, "r")) == NULL) { printf("file open err\n"); return(ERR); } curln = lin; for (lines = 0, bytes = 0; (err = egets(str, MAXLINE, fp)) > 0;) { bytes += strlen(str); if (ins(str) < 0) { printf("file insert error\n"); err++; break; } lines++; } fclose(fp); if (err < 0) return(err); if (diag) { printf("%d lines %ld bytes", lines, bytes); if (nonascii) printf(" [%d non-ascii]", nonascii); if (nullchar) printf(" [%d nul]", nullchar); if (truncated) printf(" [%d lines truncated]", truncated); printf("\n"); } return(err); } /* dowrite.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int dowrite(from, to, fname, apflg) int from, to; char *fname; int apflg; { FILE *fp; int lin, err; int lines; long bytes; char *str; LINE *lptr; err = 0; lines = bytes = 0; if (diag) printf("\"%s\" ", fname); if ((fp = fopen(fname, (apflg ? "a" : "w"))) == NULL) { printf("file open error\n"); return(ERR); } lptr = getptr(from); for (lin = from; lin <= to; lin++) { str = lptr->l_buff; lines++; bytes += strlen(str) + 1; if (fputs(str, fp) == EOF) { printf("file write error\n"); err++; break; } fputc('\n', fp); lptr = lptr->l_next; } if (diag) printf("%d lines %ld bytes\n", lines, bytes); fclose(fp); return(err); } /* ed.c */ /* Copyright 1987 Brian Beattie Rights Reserved. * * Permission to copy and/or distribute granted under the * following conditions: * * 1). No charge may be made other than resonable charges * for reproduction. * * 2). This notice must remain intact. * * 3). No further restrictions may be added. * */ /* #include <stdio.h> */ /* #include <signal.h> */ /* #include "tools.h" */ /* #include "ed.h" */ #include <setjmp.h> jmp_buf env; LINE line0; int curln = 0; int lastln = 0; char *inptr; static char inlin[MAXLINE]; int nflg, lflg; int line1, line2, nlines; extern char fname[]; int version = 1; int diag = 1; void intr(sig) int sig; { printf("?\n"); longjmp(env, 1); } int main(argc, argv) int argc; char **argv; { int stat, i, doflush; set_buf(); doflush = isatty(1); if (argc > 1 && (strcmp(argv[1], "-") == 0 || strcmp(argv[1], "-s") == 0)) { diag = 0; argc--; argv++; } if (argc > 1) { for (i = 1; i < argc; i++) { if (doread(0, argv[i]) == 0) { curln = 1; strcpy(fname, argv[i]); break; } } } while (1) { setjmp(env); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, intr); if (doflush) fflush(stdout); if (fgets(inlin, sizeof(inlin), stdin) == NULL) { break; } for (;;) { inptr = strchr(inlin, EOS); if (inptr >= inlin+2 && inptr[-2] == '\\' && inptr[-1] == NL) { inptr[-1] = 'n'; if (fgets(inptr, sizeof(inlin) - (inptr - inlin), stdin) == NULL) break; } else { break; } } if (*inlin == '!') { if ((inptr = strchr(inlin, NL)) != NULL) *inptr = EOS; System(inlin + 1); continue; } inptr = inlin; if (getlst() >= 0) if ((stat = ckglob()) != 0) { if (stat >= 0 && (stat = doglob()) >= 0) { curln = stat; continue; } } else { if ((stat = docmd(0)) >= 0) { if (stat == 1) doprnt(curln, curln); continue; } } if (stat == EOF) { exit(0); } if (stat == FATAL) { fputs("FATAL ERROR\n", stderr); exit(1); } printf("?\n"); } return(0); } /* egets.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int eightbit = 1; /* save eight bit */ int nonascii, nullchar, truncated; int egets(str, size, stream) char *str; int size; FILE *stream; { int c, count; char *cp; for (count = 0, cp = str; size > count;) { c = getc(stream); if (c == EOF) { *cp++ = '\n'; *cp = EOS; if (count) { printf("[Incomplete last line]\n"); } return(count); } if (c == NL) { *cp++ = c; *cp = EOS; return(++count); } if (c > 127) { if (!eightbit) /* if not saving eighth bit */ c = c & 127; /* strip eigth bit */ nonascii++; /* count it */ } if (c) { *cp++ = c; /* not null, keep it */ count++; } else nullchar++; /* count nulls */ } str[count - 1] = EOS; if (c != NL) { printf("truncating line\n"); truncated++; while ((c = getc(stream)) != EOF) if (c == NL) break; } return(count); } /* esc.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Map escape sequences into their equivalent symbols. Returns the * correct ASCII character. If no escape prefix is present then s * is untouched and *s is returned, otherwise **s is advanced to point * at the escaped character and the translated character is returned. */ int esc(s) char **s; { register int rval; if (**s != ESCAPE) { rval = **s; } else { (*s)++; switch (toupper(**s)) { case '\000': rval = ESCAPE; break; case 'S': rval = ' '; break; case 'N': rval = '\n'; break; case 'T': rval = '\t'; break; case 'B': rval = '\b'; break; case 'R': rval = '\r'; break; default: rval = **s; break; } } return(rval); } /* find.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int find(pat, dir) TOKEN *pat; int dir; { int i, num; char lin[MAXLINE]; LINE *ptr; num = curln; ptr = getptr(curln); num = (dir ? nextln(num) : prevln(num)); ptr = (dir ? ptr->l_next : ptr->l_prev); for (i = 0; i < lastln; i++) { if (num == 0) { num = (dir ? nextln(num) : prevln(num)); ptr = (dir ? ptr->l_next : ptr->l_prev); } strcpy(lin, ptr->l_buff); strcat(lin, "\n"); if (matchs(lin, pat, 0)) { return(num); } num = (dir ? nextln(num) : prevln(num)); ptr = (dir ? ptr->l_next : ptr->l_prev); } return(ERR); } /* getfn.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ extern char fname[MAXFNAME]; int nofname; char *getfn() { static char file[256]; char *cp; if (*inptr == NL) { nofname = TRUE; strcpy(file, fname); } else { nofname = FALSE; while (*inptr == SP || *inptr == HT) inptr++; cp = file; while (*inptr && *inptr != NL && *inptr != SP && *inptr != HT) { *cp++ = *inptr++; } *cp = '\0'; if (strlen(file) == 0) { printf("bad file name\n"); return(NULL); } } if (strlen(file) == 0) { printf("no file name\n"); return(NULL); } return(file); } /* getlst.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int getlst() { int num; line2 = 0; for (nlines = 0; (num = getone()) >= 0;) { line1 = line2; line2 = num; nlines++; if (*inptr != ',' && *inptr != ';') break; if (*inptr == ';') curln = num; inptr++; } nlines = min(nlines, 2); if (nlines == 0) line2 = curln; if (nlines <= 1) line1 = line2; if (num == ERR) return(num); else return(nlines); } /* getnum.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int mark['z' - 'a' + 1]; int getnum(first) int first; { TOKEN *srchpat; int num; char c; while (*inptr == SP || *inptr == HT) inptr++; if (*inptr >= '0' && *inptr <= '9') { /* line number */ for (num = 0; *inptr >= '0' && *inptr <= '9';) { num = (num * 10) + *inptr - '0'; inptr++; } return num; } switch (c = *inptr) { case '.': inptr++; return(curln); case '$': inptr++; return(lastln); case '/': case '?': srchpat = optpat(); if (*inptr == c) inptr++; return(find(srchpat, c == '/' ? 1 : 0)); case '-': case '+': return(first ? curln : 1); case '\'': inptr++; if (*inptr < 'a' || *inptr > 'z') return(EOF); return mark[*inptr++ - 'a']; default: return(first ? EOF : 1);/* unknown address */ } } /* getone.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ #define FIRST 1 #define NOTFIRST 0 int getone() { int c, i, num; if ((num = getnum(FIRST)) >= 0) { while (1) { while (*inptr == SP || *inptr == HT) inptr++; if (*inptr != '+' && *inptr != '-') break; c = *inptr++; if ((i = getnum(NOTFIRST)) < 0) return(i); if (c == '+') { num += i; } else { num -= i; } } } return(num > lastln ? ERR : num); } /* getpat.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Translate arg into a TOKEN string */ TOKEN * getpat(arg) char *arg; { return(makepat(arg, '\000')); } /* getptr.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ LINE * getptr(num) int num; { LINE *ptr; int j; if (2 * num > lastln && num <= lastln) { /* high line numbers */ ptr = line0.l_prev; for (j = lastln; j > num; j--) ptr = ptr->l_prev; } else { /* low line numbers */ ptr = &line0; for (j = 0; j < num; j++) ptr = ptr->l_next; } return(ptr); } /* getrhs.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int getrhs(sub) char *sub; { if (inptr[0] == NL || inptr[1] == NL) /* check for eol */ return(ERR); if (maksub(sub, MAXPAT) == NULL) return(ERR); inptr++; /* skip over delimter */ while (*inptr == SP || *inptr == HT) inptr++; if (*inptr == 'g') { inptr++; return(1); } return(0); } /* gettxt.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ char * gettxt(num) int num; { LINE *lin; static char txtbuf[MAXLINE]; lin = getptr(num); strcpy(txtbuf, lin->l_buff); strcat(txtbuf, "\n"); return(txtbuf); } /* ins.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int ins(str) char *str; { char buf[MAXLINE], *cp; LINE *new, *cur, *nxt; cp = buf; while (1) { if ((*cp = *str++) == NL) *cp = EOS; if (*cp) { cp++; continue; } if ((new = (LINE *) malloc(sizeof(LINE) + strlen(buf))) == NULL) return(ERR); /* no memory */ new->l_stat = 0; strcpy(new->l_buff, buf); /* build new line */ cur = getptr(curln); /* get current line */ nxt = cur->l_next; /* get next line */ relink(cur, new, new, nxt); /* add to linked list */ relink(new, nxt, cur, new); lastln++; curln++; if (*str == EOS) /* end of line ? */ return(1); cp = buf; } } /* join.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ extern int fchanged; int join(first, last) int first, last; { char buf[MAXLINE]; char *cp = buf, *str; int num; if (first <= 0 || first > last || last > lastln) return(ERR); if (first == last) { curln = first; return 0; } for (num = first; num <= last; num++) { str = gettxt(num); while (*str != NL && cp < buf + MAXLINE - 1) *cp++ = *str++; if (cp == buf + MAXLINE - 1) { printf("line too long\n"); return(ERR); } } *cp++ = NL; *cp = EOS; del(first, last); curln = first - 1; ins(buf); fchanged = TRUE; return 0; } /* makepat.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Make a pattern template from the strinng pointed to by arg. Stop * when delim or '\000' or '\n' is found in arg. Return a pointer to * the pattern template. * * The pattern template used here are somewhat different than those * used in the "Software Tools" book; each token is a structure of * the form TOKEN (see tools.h). A token consists of an identifier, * a pointer to a string, a literal character and a pointer to another * token. This last is 0 if there is no subsequent token. * * The one strangeness here is caused (again) by CLOSURE which has * to be put in front of the previous token. To make this insertion a * little easier, the 'next' field of the last to point at the chain * (the one pointed to by 'tail) is made to point at the previous node. * When we are finished, tail->next is set to 0. */ TOKEN * makepat(arg, delim) char *arg; int delim; { TOKEN *head, *tail, *ntok; int error; /* Check for characters that aren't legal at the beginning of a template. */ if (*arg == '\0' || *arg == delim || *arg == '\n' || *arg == CLOSURE) return(0); error = 0; tail = head = NULL; while (*arg && *arg != delim && *arg != '\n' && !error) { ntok = (TOKEN *) malloc(TOKSIZE); ntok->lchar = '\000'; ntok->next = 0; switch (*arg) { case ANY: ntok->tok = ANY; break; case BOL: if (head == 0) /* then this is the first symbol */ ntok->tok = BOL; else ntok->tok = LITCHAR; ntok->lchar = BOL; break; case EOL: if (*(arg + 1) == delim || *(arg + 1) == '\000' || *(arg + 1) == '\n') { ntok->tok = EOL; } else { ntok->tok = LITCHAR; ntok->lchar = EOL; } break; case CLOSURE: if (head != 0) { switch (tail->tok) { case BOL: case EOL: case CLOSURE: return(0); default: ntok->tok = CLOSURE; } } break; case CCL: if (*(arg + 1) == NEGATE) { ntok->tok = NCCL; arg += 2; } else { ntok->tok = CCL; arg++; } if (ntok->bitmap = makebitmap(CLS_SIZE)) arg = dodash(CCLEND, arg, ntok->bitmap); else { fprintf(stderr, "Not enough memory for pat\n"); error = 1; } break; default: if (*arg == ESCAPE && *(arg + 1) == OPEN) { ntok->tok = OPEN; arg++; } else if (*arg == ESCAPE && *(arg + 1) == CLOSE) { ntok->tok = CLOSE; arg++; } else { ntok->tok = LITCHAR; ntok->lchar = esc(&arg); } } if (error || ntok == 0) { unmakepat(head); return(0); } else if (head == 0) { /* This is the first node in the chain. */ ntok->next = 0; head = tail = ntok; } else if (ntok->tok != CLOSURE) { /* Insert at end of list (after tail) */ tail->next = ntok; ntok->next = tail; tail = ntok; } else if (head != tail) { /* More than one node in the chain. Insert the * CLOSURE node immediately in front of tail. */ (tail->next)->next = ntok; ntok->next = tail; } else { /* Only one node in the chain, Insert the CLOSURE * node at the head of the linked list. */ ntok->next = head; tail->next = ntok; head = ntok; } arg++; } tail->next = 0; return(head); } /* maksub.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ char * maksub(sub, subsz) char *sub; int subsz; { int size; char delim, *cp; size = 0; cp = sub; delim = *inptr++; for (size = 0; *inptr != delim && *inptr != NL && size < subsz; size++) { if (*inptr == '&') { *cp++ = DITTO; inptr++; } else if ((*cp++ = *inptr++) == ESCAPE) { if (size >= subsz) return(NULL); switch (toupper(*inptr)) { case NL: *cp++ = ESCAPE; break; break; case 'S': *cp++ = SP; inptr++; break; case 'N': *cp++ = NL; inptr++; break; case 'T': *cp++ = HT; inptr++; break; case 'B': *cp++ = BS; inptr++; break; case 'R': *cp++ = CR; inptr++; break; case '0':{ int i = 3; *cp = 0; do { if (*++inptr < '0' || *inptr > '7') break; *cp = (*cp << 3) | (*inptr - '0'); } while (--i != 0); cp++; } break; default: *cp++ = *inptr++; break; } } } if (size >= subsz) return(NULL); *cp = EOS; return(sub); } /* matchs.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Compares line and pattern. Line is a character string while pat * is a pattern template made by getpat(). * Returns: * 1. A zero if no match was found. * * 2. A pointer to the last character satisfing the match * if ret_endp is non-zero. * * 3. A pointer to the beginning of the matched string if * ret_endp is zero. * * e.g.: * * matchs ("1234567890", getpat("4[0-9]*7), 0); * will return a pointer to the '4', while: * * matchs ("1234567890", getpat("4[0-9]*7), 1); * will return a pointer to the '7'. */ char * matchs(line, pat, ret_endp) char *line; TOKEN *pat; int ret_endp; { char *rval, *bptr; char *line2; TOKEN *pat2; char c; short ok; bptr = line; while (*line) { if (pat && pat->tok == LITCHAR) { while (*line) { pat2 = pat; line2 = line; if (*line2 != pat2->lchar) { c = pat2->lchar; while (*line2 && *line2 != c) ++line2; line = line2; if (*line2 == '\0') break; } ok = 1; ++line2; pat2 = pat2->next; while (pat2 && pat2->tok == LITCHAR) { if (*line2 != pat2->lchar) { ok = 0; break; } ++line2; pat2 = pat2->next; } if (!pat2) { if (ret_endp) return(--line2); else return(line); } else if (ok) break; ++line; } if (*line == '\0') return(0); } else { line2 = line; pat2 = pat; } if ((rval = amatch(line2, pat2, bptr)) == 0) { if (pat && pat->tok == BOL) break; line++; } else { if (rval > bptr && rval > line) rval--; /* point to last char matched */ rval = ret_endp ? rval : line; break; } } return(rval); } /* move.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int move(num) int num; { LINE *k0, *k1, *k2, *k3; if (line1 <= 0 || line2 < line1 || (line1 <= num && num <= line2)) return(ERR); k0 = getptr(prevln(line1)); k1 = getptr(line1); k2 = getptr(line2); k3 = getptr(nextln(line2)); relink(k0, k3, k0, k3); lastln -= line2 - line1 + 1; if (num > line1) num -= line2 - line1 + 1; curln = num + (line2 - line1 + 1); k0 = getptr(num); k3 = getptr(nextln(num)); relink(k0, k1, k2, k3); relink(k2, k3, k0, k1); lastln += line2 - line1 + 1; return(1); } int transfer(num) int num; { int mid, lin, ntrans; if (line1 <= 0 || line1 > line2) return(ERR); mid = num < line2 ? num : line2; curln = num; ntrans = 0; for (lin = line1; lin <= mid; lin++) { ins(gettxt(lin)); ntrans++; } lin += ntrans; line2 += ntrans; for (; lin <= line2; lin += 2) { ins(gettxt(lin)); line2++; } return(1); } /* omatch.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Match one pattern element, pointed at by pat, with the character at * **linp. Return non-zero on match. Otherwise, return 0. *Linp is * advanced to skip over the matched character; it is not advanced on * failure. The amount of advance is 0 for patterns that match null * strings, 1 otherwise. "boln" should point at the position that will * match a BOL token. */ int omatch(linp, pat, boln) char **linp; TOKEN *pat; char *boln; { register int advance; advance = -1; if (**linp) { switch (pat->tok) { case LITCHAR: if (**linp == pat->lchar) advance = 1; break; case BOL: if (*linp == boln) advance = 0; break; case ANY: if (**linp != '\n') advance = 1; break; case EOL: if (**linp == '\n') advance = 0; break; case CCL: if (testbit(**linp, pat->bitmap)) advance = 1; break; case NCCL: if (!testbit(**linp, pat->bitmap)) advance = 1; break; } } if (advance >= 0) *linp += advance; return(++advance); } /* optpat.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ TOKEN *oldpat; TOKEN * optpat() { char delim, str[MAXPAT], *cp; delim = *inptr++; cp = str; while (*inptr != delim && *inptr != NL) { if (*inptr == ESCAPE && inptr[1] != NL) *cp++ = *inptr++; *cp++ = *inptr++; } *cp = EOS; if (*str == EOS) return(oldpat); if (oldpat) unmakepat(oldpat); oldpat = getpat(str); return(oldpat); } /* set.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ struct tbl { char *t_str; int *t_ptr; int t_val; } *t, tbl[] = { "number", &nflg, TRUE, "nonumber", &nflg, FALSE, "list", &lflg, TRUE, "nolist", &lflg, FALSE, "eightbit", &eightbit, TRUE, "noeightbit", &eightbit, FALSE, 0 }; int set() { char word[16]; int i; inptr++; if (*inptr != 't') { if (*inptr != SP && *inptr != HT && *inptr != NL) return(ERR); } else inptr++; if (*inptr == NL) return(show()); /* Skip white space */ while (*inptr == SP || *inptr == HT) inptr++; for (i = 0; *inptr != SP && *inptr != HT && *inptr != NL;) word[i++] = *inptr++; word[i] = EOS; for (t = tbl; t->t_str; t++) { if (strcmp(word, t->t_str) == 0) { *t->t_ptr = t->t_val; return(0); } } return(0); } int show() { extern int version; printf("ed version %d.%d\n", version / 100, version % 100); printf("number %s, list %s\n", nflg ? "ON" : "OFF", lflg ? "ON" : "OFF"); return(0); } /* setbuf.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ void relink(a, x, y, b) LINE *a, *x, *y, *b; { x->l_prev = a; y->l_next = b; } void clrbuf() { del(1, lastln); } void set_buf() { relink(&line0, &line0, &line0, &line0); curln = lastln = 0; } /* subst.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* #include "ed.h" */ int subst(pat, sub, gflg, pflag) TOKEN *pat; char *sub; int gflg, pflag; { int lin, chngd, nchngd; char *txtptr, *txt; char *lastm, *m, *new, buf[MAXLINE]; if (line1 <= 0) return(ERR); nchngd = 0; /* reset count of lines changed */ for (lin = line1; lin <= line2; lin++) { txt = txtptr = gettxt(lin); new = buf; chngd = 0; lastm = NULL; while (*txtptr) { if (gflg || !chngd) m = amatch(txtptr, pat, txt); else m = NULL; if (m != NULL && lastm != m) { chngd++; new = catsub(txtptr, m, sub, new, buf + MAXLINE); lastm = m; } if (m == NULL || m == txtptr) { *new++ = *txtptr++; } else { txtptr = m; } } if (chngd) { if (new >= buf + MAXLINE) return(ERR); *new++ = EOS; del(lin, lin); ins(buf); nchngd++; if (pflag) doprnt(curln, curln); } } if (nchngd == 0 && !gflg) { return(ERR); } return(nchngd); } /* System.c */ #define SHELL "/bin/sh" #define SHELL2 "/usr/bin/sh" int System(c) char *c; { int pid, status; switch (pid = fork()) { case -1: return -1; case 0: execl(SHELL, "sh", "-c", c, (char *) 0); execl(SHELL2, "sh", "-c", c, (char *) 0); exit(-1); default: while (wait(&status) != pid); } return status; } /* unmkpat.c */ /* #include <stdio.h> */ /* #include "tools.h" */ /* Free up the memory usde for token string */ void unmakepat(head) TOKEN *head; { register TOKEN *old_head; while (head) { switch (head->tok) { case CCL: case NCCL: free(head->bitmap); /* Fall through to default */ default: old_head = head; head = head->next; free((char *) old_head); break; } } } ��������������������������������������������/* eject 1.3 - Eject removable media Author: Kees J. Bot * 11 Dec 1993 */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <fcntl.h> #include <string.h> #include <sys/ioctl.h> void fatal(char *label) { fprintf(stderr, "eject: %s: %s\n", label, strerror(errno)); exit(1); } void main(int argc, char **argv) { char *device; int fd; if (argc != 2) { fprintf(stderr, "Usage: eject <device>\n"); exit(1); } device= argv[1]; /* Try to open it in whatever mode. */ fd= open(device, O_RDONLY); if (fd < 0 && errno == EACCES) fd= open(device, O_WRONLY); if (fd < 0) fatal(device); /* Tell it to eject. */ if (ioctl(fd, DIOCEJECT, nil) < 0) fatal(device); exit(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* expand - expand tabs to spaces Author: Terrence W. Holm */ /* Usage: expand [ -tab1,tab2,tab3,... ] [ file ... ] */ #include <stddef.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #define MAX_TABS 32 int column = 0; /* Current column, retained between files */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Expand, (FILE *f, int tab_index, int tabs [])); int main(argc, argv) int argc; char *argv[]; { int tabs[MAX_TABS]; int tab_index = 0; /* Default one tab */ int i; FILE *f; tabs[0] = 8; /* Default tab stop */ if (argc > 1 && argv[1][0] == '-') { char *p = argv[1]; int last_tab_stop = 0; for (tab_index = 0; tab_index < MAX_TABS; ++tab_index) { if ((tabs[tab_index] = atoi(p + 1)) <= last_tab_stop) { fprintf(stderr, "Bad tab stop spec\n"); exit(1); } last_tab_stop = tabs[tab_index]; if ((p = strchr(p + 1, ',')) == NULL) break; } --argc; ++argv; } if (argc == 1) Expand(stdin, tab_index, tabs); else for (i = 1; i < argc; ++i) { if ((f = fopen(argv[i], "r")) == NULL) { perror(argv[i]); exit(1); } Expand(f, tab_index, tabs); fclose(f); } return(0); } void Expand(f, tab_index, tabs) FILE *f; int tab_index; int tabs[]; { int next; int c; int i; while ((c = getc(f)) != EOF) { if (c == '\t') { if (tab_index == 0) next = (column / tabs[0] + 1) * tabs[0]; else { for (i = 0; i <= tab_index && tabs[i] <= column; ++i); if (i > tab_index) next = column + 1; else next = tabs[i]; } do { ++column; putchar(' '); } while (column < next); continue; } if (c == '\b') column = column > 0 ? column - 1 : 0; else if (c == '\n' || c == '\r') column = 0; else ++column; putchar(c); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* factor - print the prime factors of a number Author: Andy Tanenbaum */ #include <stdlib.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(long first, (long k)); int main(argc, argv) int argc; char *argv[]; { /* Factor a number */ long i, n, flag = 0; if (argc != 2 || (n = atol(argv[1])) < 2) { printf("Usage: factor n (2 <= n < 2**31)\n"); exit(1); } if (n == 2) { printf("2 is a prime\n"); exit(0); } while (1) { i = first(n); if (i == 0) { if (flag == 0) printf("%ld is a prime\n", n); else printf("%ld\n", n); exit(0); } printf("%ld ", i); n = n / i; flag = 1; } } long first(k) long k; { /* Return the first factor of k. If it is a prime, return 0; */ long i; if (k == 2) return(0); if (k % 2 == 0) return (2); for (i = 3; i <= k / 3; i += 2) if (k % i == 0) return(i); return(0); } �������������������������������������������������������������������������������������������������������������������������������������������/* fgrep - fast grep Author: Bert Gijsbers */ /* Copyright (c) 1991 by Bert Gijsbers. All rights reserved. * Permission to use and redistribute this software is hereby granted provided * that this copyright notice remains intact and that any modifications are * clearly marked as such. * * syntax: * fgrep -chlnsv <[-e string] ... [-f file] ... | string> [file] ... * options: * -c : print the number of matching lines * -h : don't print file name headers if more than one file * -l : print only the file names of the files containing a match * -n : print line numbers * -s : don't print, return status only * -v : reverse, lines not containing one of the strings match * -e string : search for this string * -f file : file contains strings to search for * notes: * Options are processed by getopt(3). * Multiple strings per command line are supported, eg. * fgrep -e str1 -e str2 *.c * Instead of a filename - is allowed, meaning standard input. */ /* #include <ansi.h> */ #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define MAX_STR_LEN 256 /* maximum length of strings to search for */ #define BYTE 0xFF /* convert from char to int */ #define READ_SIZE 4096 /* read() request size */ #define BUF_SIZE (2*READ_SIZE) /* size of buffer */ typedef struct test_str { struct test_str *next; /* linked list */ char *str; /* string to be found */ char *str_end; /* points to last character */ int len; /* string length */ char *bufp; /* pointer into input buffer */ unsigned char table[256]; /* table for Boyer-Moore algorithm */ } test_str; test_str *strings; char *prog_name; int cflag, hflag, lflag, nflag, sflag, vflag; unsigned line_num; /* line number in current file */ int fd_in, eof_seen; /* file descriptor for input and eof status */ char input_buffer[BUF_SIZE + 2];/* buffer + sentinel margin */ #define buffer (&input_buffer[2]) /* Pointers into the input buffer */ char *input; /* points to current input char */ char *max_input; /* points to first invalid char */ char *buf_end; /* points to first char not read */ /* Error messages */ char no_mem[] = "not enough memory"; char no_arg[] = "argument missing"; extern char *optarg; extern int optind; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char *search_str, (test_str * ts)); _PROTOTYPE(int fill_buffer, (void)); _PROTOTYPE(void failure, (char *mesg)); _PROTOTYPE(void file_open, (void)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(char *get_line, (void)); _PROTOTYPE(void string_file, (void)); _PROTOTYPE(void add_string, (char *str)); _PROTOTYPE(int getopt, (int argc, char **argv, char *optstring)); int main(argc, argv) int argc; char **argv; { char *line; int c; unsigned count; /* number of matching lines in current file */ unsigned found_one = 0; /* was there any match in any file at all ? */ #ifdef noperprintf noperprintf(stdout); #else static char outbuf[BUFSIZ]; setvbuf(stdout, outbuf, _IOFBF, sizeof outbuf); #endif prog_name = argv[0]; if (argc == 1) usage(); while ((c = getopt(argc, argv, "ce:f:hlnsv")) != EOF) { switch (c) { case 'c': cflag++; break; case 'e': add_string(optarg); break; case 'f': string_file(); break; case 'h': hflag++; break; case 'l': lflag++; break; case 'n': nflag++; break; case 's': sflag++; break; case 'v': vflag++; break; default: usage(); break; } } /* If no -e or -f option is used take a string from the command line. */ if (strings == (test_str *) NULL) { if (optind == argc) failure(no_arg); add_string(argv[optind++]); } if (argc - optind < 2) hflag++; /* don't print filenames if less than two * files */ /* Handle every matching line according to the flags. */ do { optarg = argv[optind]; file_open(); count = 0; while ((line = get_line()) != (char *) NULL) { count++; if (sflag) return 0; if (lflag) { printf("%s\n", optarg); fflush(stdout); break; } if (cflag) continue; if (hflag == 0) printf("%s:", optarg); if (nflag) printf("%u:", line_num); do { putchar(*line); } while (++line < input); fflush(stdout); } found_one |= count; if (cflag) { if (hflag == 0) printf("%s: ", optarg); printf("%u\n", count); fflush(stdout); } close(fd_in); } while (++optind < argc); /* Exit nonzero if no match is found. */ return found_one ? 0 : 1; } void usage() { fprintf(stderr, "Usage: %s -chlnsv <[-e string] ... [-f file] ... | string> [file] ...\n", prog_name); exit(2); } void failure(mesg) char *mesg; { fprintf(stderr, "%s: %s\n", prog_name, mesg); exit(1); } /* Add a string to search for to the global linked list `strings'. */ void add_string(str) char *str; { test_str *ts; int len; if (str == (char *) NULL || (len = strlen(str)) == 0) return; if (len > MAX_STR_LEN) failure("string too long"); if ((ts = (test_str *) malloc(sizeof(*ts))) == (test_str *) NULL) failure(no_mem); /* Initialize Boyer-Moore table. */ memset(ts->table, len, sizeof(ts->table)); ts->len = len; ts->str = str; ts->str_end = str + len - 1; for (; --len >= 0; str++) ts->table[*str & BYTE] = len; /* Put it on the list */ ts->next = strings; strings = ts; } /* Open a file for reading. Initialize input buffer pointers. */ void file_open() { /* Use stdin if no file arguments are given on the command line. */ if (optarg == (char *) NULL || strcmp(optarg, "-") == 0) { fd_in = 0; optarg = "stdin"; } else if ((fd_in = open(optarg, O_RDONLY)) == -1) { fprintf(stderr, "%s: can't open %s\n", prog_name, optarg); exit(1); } input = max_input = buf_end = buffer; buffer[-1] = '\n'; /* sentinel */ eof_seen = 0; line_num = 0; } /* Move any leftover characters to the head of the buffer. * Read characters into the rest of the buffer. * Round off the available input to whole lines. * Return the number of valid input characters. */ int fill_buffer() { char *bufp; int size; if (eof_seen) return 0; size = buf_end - max_input; memmove(buffer, max_input, size); bufp = &buffer[size]; do { if ((size = read(fd_in, bufp, READ_SIZE)) <= 0) { if (size != 0) failure("read error"); eof_seen++; if (bufp == buffer) /* no input left */ return 0; /* Make sure the last char of a file is '\n'. */ *bufp++ = '\n'; break; } bufp += size; } while (bufp - buffer < READ_SIZE && bufp[-1] != '\n'); buf_end = bufp; while (*--bufp != '\n'); if (++bufp == buffer) { /* Line too long. */ *buf_end++ = '\n'; bufp = buf_end; } max_input = bufp; input = buffer; return max_input - buffer; } /* Read strings from a file. Give duplicates to add_string(). */ void string_file() { char *str, *p; file_open(); while (input < max_input || fill_buffer() > 0) { p = (char *) memchr(input, '\n', BUF_SIZE); *p++ = '\0'; if ((str = (char *) malloc(p - input)) == (char *) NULL) failure(no_mem); memcpy(str, input, p - input); add_string(str); input = p; } close(fd_in); } /* Scan the rest of the available input for a string using Boyer-Moore. * Return a pointer to the match or a pointer beyond end of input if no match. * Record how far the input is scanned. */ char *search_str(ts) test_str *ts; { char *bufp, *prevbufp, *s; bufp = input + ts->len - 1; while (bufp < max_input) { prevbufp = bufp; bufp += ts->table[*bufp & BYTE]; if (bufp > prevbufp) continue; s = ts->str_end; do { if (s == ts->str) { /* match found */ ts->bufp = bufp; return bufp; } } while (*--bufp == *--s); bufp = prevbufp + 1; } ts->bufp = bufp; return bufp; } /* Return the next line in which one of the strings occurs. * Or, if the -v option is used, the next line without a match. * Or NULL on EOF. */ char *get_line() { test_str *ts; char *match, *line; /* Loop until a line is found. */ while (1) { if (input >= max_input && fill_buffer() == 0) { /* EOF */ line = (char *) NULL; break; } /* If match is still equal to max_input after the next loop * then no match is found. */ match = max_input; ts = strings; do { if (input == buffer) {N��N���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� if (search_str(ts) < match) match = ts->bufp; } else if (ts->bufp < match) { if (ts->bufp >= input || search_str(ts) < match) match = ts->bufp; } } while ((ts = ts->next) != (test_str *) NULL); /* Determine if and in what line a match is found. Only do * line number counting if it is necessary or very easy. */ if (vflag) { line_num++; line = input; input = 1 + (char *) memchr(line, '\n', BUF_SIZE); if (input <= match) break; /* no match in current line */ } else if (nflag) { do { line_num++; line = input; input = 1 + (char *) memchr(line, '\n', BUF_SIZE); } while (input < match || (input == match && match < max_input)); if (match < max_input) break; /* match found */ } else if (match < max_input) { /* Match found. */ for (line = match; *--line != '\n';); line++; input = 1 + (char *) memchr(match, '\n', BUF_SIZE); break; } else input = max_input; } return line; } ���������������������������������������������������������������������������������/* file - report on file type. Author: Andy Tanenbaum */ /* Magic number detection changed to look-up table 08-Jan-91 - ajm */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define BLOCK_SIZE 1024 #define XBITS 00111 /* rwXrwXrwX (x bits in the mode) */ #define ENGLISH 25 /* cutoff for determining if text is Eng. */ unsigned char buf[BLOCK_SIZE]; struct info { int execflag; /* 1 == ack executable, 2 == gnu executable, * 3 == core */ unsigned char magic[4]; /* First four bytes of the magic number */ unsigned char mask[4]; /* Mask to apply when matching */ char *description; /* What it means */ } table[] = { 0x00, 0x1f, 0x9d, 0x8d, 0x00, 0xff, 0xff, 0xff, 0x00, "13-bit compressed file", 0x00, 0x1f, 0x9d, 0x90, 0x00, 0xff, 0xff, 0xff, 0x00, "16-bit compressed file", 0x00, 0x65, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, "MINIX-PC bcc archive", 0x00, 0x2c, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, "ACK object archive", 0x00, 0x65, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, "MINIX-PC ack archive", 0x00, 0x47, 0x6e, 0x75, 0x20, 0xff, 0xff, 0xff, 0xff, "MINIX-68k gnu archive", 0x00, 0x21, 0x3c, 0x61, 0x72, 0xff, 0xff, 0xff, 0xff, "MINIX-PC gnu archive", 0x00, 0x01, 0x02, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, "ACK object file", 0x00, 0xa3, 0x86, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, "MINIX-PC bcc object file", 0x00, 0x00, 0x00, 0x01, 0x07, 0xff, 0xff, 0xff, 0xff, "MINIX-68k gnu object file", 0x00, 0x07, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, "MINIX-PC gnu object file", 0x01, 0x01, 0x03, 0x00, 0x04, 0xff, 0xff, 0x00, 0xff, "MINIX-PC 16-bit executable", 0x01, 0x01, 0x03, 0x00, 0x10, 0xff, 0xff, 0x00, 0xff, "MINIX-PC 32-bit executable", 0x01, 0x04, 0x10, 0x03, 0x01, 0xff, 0xff, 0xff, 0xff, "MINIX-68k old style executable", 0x01, 0x01, 0x03, 0x10, 0x0b, 0xff, 0xff, 0xff, 0xff, "MINIX-68k new style executable", 0x02, 0x0b, 0x01, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, "MINIX-PC 32-bit gnu executable combined I & D space", 0x02, 0x00, 0x00, 0x0b, 0x01, 0xff, 0xff, 0xff, 0xff, "MINIX-68k gnu executable", 0x03, 0x82, 0x12, 0xC4, 0xC0, 0xff, 0xff, 0xff, 0xff, "core file", }; int tabsize = sizeof(table) / sizeof(struct info); int L_flag; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void file, (char *name)); _PROTOTYPE(void do_strip, (int type)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { /* This program uses some heuristics to try to guess about a file type by * looking at its contents. */ int c, i; L_flag= 0; while ((c= getopt(argc, argv, "L?")) != -1) { switch(c) { case 'L': L_flag= 1; break; case '?': usage(); default: fprintf(stderr, "file: panic getopt failed\n"); exit(1); } } if (optind >= argc) usage(); for (i = optind; i < argc; i++) file(argv[i]); return(0); } void file(name) char *name; { int i, fd, n, mode, nonascii, special, funnypct, etaoins; int j; long engpct; int c; struct stat st_buf; printf("%s: ", name); #ifdef S_IFLNK if (!L_flag) n = lstat(name, &st_buf); else n = stat(name, &st_buf); #else n = stat(name, &st_buf); #endif if (n < 0) { printf("cannot stat\n"); return; } mode = st_buf.st_mode; /* Check for directories and special files. */ if (S_ISDIR(mode)) { printf("directory\n"); return; } if (S_ISCHR(mode)) { printf("character special file\n"); return; } if (S_ISBLK(mode)) { printf("block special file\n"); return; } if (S_ISFIFO(mode)) { printf("named pipe\n"); return; } #ifdef S_IFLNK if (S_ISLNK(mode)) { n= readlink(name, (char *)buf, BLOCK_SIZE); if (n == -1) printf("cannot readlink\n"); else printf("symbolic link to %.*s\n", n, buf); return; } #endif if (!S_ISREG(mode)) { printf("strange file type %5o\n", mode); return; } /* Open the file, stat it, and read in 1 block. */ fd = open(name, O_RDONLY); if (fd < 0) { printf("cannot open\n"); return; } n = read(fd, (char *)buf, BLOCK_SIZE); if (n < 0) { printf("cannot read\n"); close(fd); return; } if (n == 0) { /* must check this, for loop will fail otherwise !! */ printf("empty file\n"); close(fd); return; } for (i = 0; i < tabsize; i++) { for (j = 0; j < 4; j++) if ((buf[j] & table[i].mask[j]) != table[i].magic[j]) break; if (j == 4) { printf("%s", table[i].description); do_strip(table[i].execflag); close(fd); return; } } /* Check to see if file is a shell script. */ if (mode & XBITS) { /* Not a binary, but executable. Probably a shell script. */ printf("shell script\n"); close(fd); return; } /* Check for ASCII data and certain punctuation. */ nonascii = 0; special = 0; etaoins = 0; for (i = 0; i < n; i++) { c = buf[i]; if (c & 0200) nonascii++; if (c == ';' || c == '{' || c == '}' || c == '#') special++; if (c == '*' || c == '<' || c == '>' || c == '/') special++; if (c >= 'A' && c <= 'Z') c = c - 'A' + 'a'; if (c == 'e' || c == 't' || c == 'a' || c == 'o') etaoins++; if (c == 'i' || c == 'n' || c == 's') etaoins++; } if (nonascii == 0) { /* File only contains ASCII characters. Continue processing. */ funnypct = 100 * special / n; engpct = 100L * (long) etaoins / n; if (funnypct > 1) { printf("C program\n"); } else { if (engpct > (long) ENGLISH) printf("English text\n"); else printf("ASCII text\n"); } close(fd); return; } /* Give up. Call it data. */ printf("data\n"); close(fd); return; } void do_strip(type) int type; { if (type == 1) { /* Non-GNU executable */ if (buf[2] & 1) printf(", UZP"); if (buf[2] & 2) printf(", PAL"); if (buf[2] & 4) printf(", NSYM"); if (buf[2] & 0x20) printf(", sep I&D"); else printf(", comm I&D"); if (( buf[28] | buf[29] | buf[30] | buf[31]) != 0) printf(" not stripped\n"); else printf(" stripped\n"); return; } if (type == 2) { /* GNU format executable */ if ((buf[16] | buf[17] | buf[18] | buf[19]) != 0) printf(" not stripped\n"); else printf(" stripped\n"); return; } if (type == 3) { /* Core file in <sys/core.h> format */ switch(buf[36] & 0xff) { case 1: printf(" of i86 executable"); break; case 2: printf(" of i386 executable"); break; default:printf(" of unknown executable"); break; } printf(" '%.32s'\n", buf+4); return; } printf("\n"); /* Not an executable file */ } void usage() { printf("Usage: file [-L] name ...\n"); exit(1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* find - look for files satisfying a predicate Author: E. Baalbergen */ /* Original author: Erik Baalbergen; POSIX compliant version: Bert Laverman */ #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> #include <pwd.h> #include <grp.h> #include <dirent.h> #include <limits.h> #include <stdio.h> /*######################## DEFINITIONS ##############################*/ #ifdef S_IFLNK #define LSTAT lstat #else #define LSTAT stat #endif #define SHELL "/bin/sh" #define MAXARG 256 /* maximum length for an argv for -exec */ #define BSIZE 512 /* POSIX wants 512 byte blocks */ #define SECS_PER_DAY (24L*60L*60L) /* check your planet */ #define OP_NAME 1 /* match name */ #define OP_PERM 2 /* check file permission bits */ #define OP_TYPE 3 /* check file type bits */ #define OP_LINKS 4 /* check link count */ #define OP_USER 5 /* check owner */ #define OP_GROUP 6 /* check group ownership */ #define OP_SIZE 7 /* check size, blocks or bytes */ #define OP_SIZEC 8 /* this is a fake for -size with 'c' */ #define OP_INUM 9 /* compare inode number */ #define OP_ATIME 10 /* check last access time */ #define OP_CTIME 11 /* check creation time */ #define OP_MTIME 12 /* check last modification time */ #define OP_EXEC 13 /* execute command */ #define OP_OK 14 /* execute with confirmation */ #define OP_PRINT 15 /* print name */ #define OP_PRINT0 16 /* print name null terminated */ #define OP_NEWER 17 /* compare modification times */ #define OP_AND 18 /* logical and (short circuit) */ #define OP_OR 19 /* logical or (short circuit) */ #define OP_XDEV 20 /* do not cross file-system boundaries */ #define OP_DEPTH 21 /* descend directory before testing */ #define OP_PRUNE 22 /* don't descend into current directory */ #define OP_NOUSER 23 /* check validity of user id */ #define OP_NOGROUP 24 /* check validity of group id */ #define LPAR 25 /* left parenthesis */ #define RPAR 26 /* right parenthesis */ #define NOT 27 /* logical not */ /* Some return values: */ #define EOI -1 /* end of expression */ #define NONE 0 /* not a valid predicate */ /* For -perm with symbolic modes: */ #define ISWHO(c) ((c == 'u') || (c == 'g') || (c == 'o') || (c == 'a')) #define ISOPER(c) ((c == '-') || (c == '=') || (c == '+')) #define ISMODE(c) ((c == 'r') || (c == 'w') || (c == 'x') || \ (c == 's') || (c == 't')) #define MUSER 1 #define MGROUP 2 #define MOTHERS 4 struct exec { int e_cnt; char *e_vec[MAXARG]; }; struct node { int n_type; /* any OP_ or NOT */ union { char *n_str; struct { long n_val; int n_sign; } n_int; struct exec *n_exec; struct { struct node *n_left, *n_right; } n_opnd; } n_info; }; struct oper { char *op_str; int op_val; } ops[] = { { "name", OP_NAME }, { "perm", OP_PERM }, { "type", OP_TYPE }, { "links", OP_LINKS }, { "user", OP_USER }, { "group", OP_GROUP }, { "size", OP_SIZE }, { "inum", OP_INUM }, { "atime", OP_ATIME }, { "ctime", OP_CTIME }, { "mtime", OP_MTIME }, { "exec", OP_EXEC }, { "ok", OP_OK }, { "print", OP_PRINT }, { "print0", OP_PRINT0 }, { "newer", OP_NEWER }, { "a", OP_AND }, { "o", OP_OR }, { "xdev", OP_XDEV }, { "depth", OP_DEPTH }, { "prune", OP_PRUNE }, { "nouser", OP_NOUSER }, { "nogroup", OP_NOGROUP }, { 0, 0 } }; char **ipp; /* pointer to next argument during parsing */ char *prog; /* program name (== argv [0]) */ char *epath; /* value of PATH environment string */ long current_time; /* for computing age */ int tty; /* fd for /dev/tty when using -ok */ int xdev_flag = 0; /* cross device boundaries? */ int devnr; /* device nr of first inode */ int depth_flag = 0; /* descend before check? */ int prune_here; /* This is Baaaad! Don't ever do this again! */ int um; /* current umask() */ int needprint = 1; /* implicit -print needed? */ /* The prototypes: */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char *Malloc, (int n)); _PROTOTYPE(char *Salloc, (char *s)); _PROTOTYPE(void find, (char *path, struct node * pred, char *last)); _PROTOTYPE(int check, (char *path, struct stat * st, struct node * n, char *last)); _PROTOTYPE(int ichk, (long val, struct node * n)); _PROTOTYPE(int lex, (char *str)); _PROTOTYPE(struct node * newnode, (int t)); _PROTOTYPE(int isnumber, (char *str, int base, int sign)); _PROTOTYPE(void number, (char *str, int base, long *pl, int *ps)); _PROTOTYPE(void fmode, (char *str, long *pl, int *ps)); _PROTOTYPE(struct node * expr, (int t)); _PROTOTYPE(struct node * primary, (int t)); _PROTOTYPE(struct node * secondary, (int t)); _PROTOTYPE(void checkarg, (char *arg)); _PROTOTYPE(struct node * simple, (int t)); _PROTOTYPE(void nonfatal, (char *s1, char *s2)); _PROTOTYPE(void fatal, (char *s1, char *s2)); _PROTOTYPE(int smatch, (char *s, char *t)); _PROTOTYPE(char *find_bin, (char *s)); _PROTOTYPE(int execute, (int op, struct exec * e, char *path)); _PROTOTYPE(void domode, (int op, int *mode, int bits)); /* Malloc: a certified malloc */ char *Malloc(n) int n; { char *m; if ((m = (char *) malloc(n)) == (char *) NULL) fatal("out of memory", ""); return m; } /* Salloc: allocate space for a string */ char *Salloc(s) char *s; { return strcpy(Malloc(strlen(s) + 1), s); } /* Main: the main body */ int main(argc, argv) int argc; char *argv[]; { char **pathlist, *path, *last; int pathcnt = 0, i; struct node *pred; prog = *argv++; /* set program name (for diagnostics) */ if ((epath = getenv("PATH")) == (char *) NULL) fatal("Can't get path from environment", ""); (void) umask(um = umask(0)); /* non-destructive get-umask :-) */ time(¤t_time); /* get current time */ pathlist= argv; while (--argc > 0 && lex(*argv) == NONE) { /* find paths */ pathcnt++; argv++; } if (pathcnt == 0) /* there must be at least one path */ fatal("Usage: path-list [predicate-list]", ""); ipp = argv; /* prepare for parsing */ if (argc != 0) { /* If there is anything to parse, */ pred = expr(lex(*ipp)); /* then do so */ if (lex(*++ipp) != EOI) /* Make sure there's nothing left */ fatal("syntax error: garbage at end of predicate", ""); } else /* No predicate list */ pred = (struct node *) NULL; for (i = 0; i < pathcnt; i++) { if (xdev_flag) xdev_flag = 2; path = pathlist[i]; if ((last = strrchr(path, '/')) == NULL) last = path; else last++; find(path, pred, last); } return 0; } void find(path, pred, last) char *path, *last; struct node *pred; { char spath[PATH_MAX]; register char *send = spath, *p; struct stat st; DIR *dp; struct dirent *de; if (path[1] == '\0' && *path == '/') { *send++ = '/'; *send = '\0'; } else while (*send++ = *path++) { } if (LSTAT(spath, &st) == -1) nonfatal("can't get status of ", spath); else { switch (xdev_flag) { case 0: break; case 1: if (st.st_dev != devnr) return; break; case 2: /* set current device number */ xdev_flag = 1; devnr = st.sN��N��N��N��N��N��N��N��N��N��N��N��N��N����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������t_dev; break; } prune_here = 0; if (!depth_flag && check(spath, &st, pred, last) && needprint) printf("%s\n", spath); if (!prune_here && (st.st_mode & S_IFMT) == S_IFDIR) { if ((dp = opendir(spath)) == NULL) { nonfatal("can't read directory ", spath); return; } send[-1] = '/'; while ((de = readdir(dp)) != NULL) { p = de->d_name; if ((de->d_name[0] != '.') || ((de->d_name[1]) && ((de->d_name[1] != '.') || (de->d_name[2])))) { strcpy(send, de->d_name); find(spath, pred, send); } } closedir(dp); } if (depth_flag) { send[-1] = '\0'; if (check(spath, &st, pred, last) && needprint) printf("%s\n", spath); } } } int check(path, st, n, last) char *path, *last; register struct stat *st; register struct node *n; { if (n == (struct node *) NULL) return 1; switch (n->n_type) { case OP_AND: return check(path, st, n->n_info.n_opnd.n_left, last) && check(path, st, n->n_info.n_opnd.n_right, last); case OP_OR: return check(path, st, n->n_info.n_opnd.n_left, last) || check(path, st, n->n_info.n_opnd.n_right, last); case NOT: return !check(path, st, n->n_info.n_opnd.n_left, last); case OP_NAME: return smatch(last, n->n_info.n_str); case OP_PERM: if (n->n_info.n_int.n_sign < 0) return(st->st_mode & (int) n->n_info.n_int.n_val) == (int) n->n_info.n_int.n_val; return(st->st_mode & 07777) == (int) n->n_info.n_int.n_val; case OP_NEWER: return st->st_mtime > n->n_info.n_int.n_val; case OP_TYPE: return(st->st_mode & S_IFMT) == (mode_t) n->n_info.n_int.n_val; case OP_LINKS: return ichk((long) (st->st_nlink), n); case OP_USER: return st->st_uid == n->n_info.n_int.n_val; case OP_GROUP: return st->st_gid == n->n_info.n_int.n_val; case OP_SIZE: return ichk((st->st_size == 0) ? 0L : (long) ((st->st_size - 1) / BSIZE + 1), n); case OP_SIZEC: return ichk((long) st->st_size, n); case OP_INUM: return ichk((long) (st->st_ino), n); case OP_ATIME: return ichk(st->st_atime, n); case OP_CTIME: return ichk(st->st_ctime, n); case OP_MTIME: return ichk(st->st_mtime, n); case OP_EXEC: case OP_OK: return execute(n->n_type, n->n_info.n_exec, path); case OP_PRINT: printf("%s\n", path); return 1; case OP_PRINT0: printf("%s", path); putchar(0); return 1; case OP_XDEV: case OP_DEPTH: return 1; case OP_PRUNE: prune_here = 1; return 1; case OP_NOUSER: return(getpwuid(st->st_uid) == (struct passwd *) NULL); case OP_NOGROUP: return(getgrgid(st->st_gid) == (struct group *) NULL); } fatal("ILLEGAL NODE", ""); return 0; /* Never reached */ } int ichk(val, n) long val; struct node *n; { switch (n->n_info.n_int.n_sign) { case 0: return val == n->n_info.n_int.n_val; case 1: return val > n->n_info.n_int.n_val; case -1: return val < n->n_info.n_int.n_val; } fatal("internal: bad n_sign", ""); return 0; /* Never reached */ } int lex(str) char *str; { if (str == (char *) NULL) return EOI; if (*str == '-') { register struct oper *op; str++; for (op = ops; op->op_str; op++) if (strcmp(str, op->op_str) == 0) break; return op->op_val; } if (str[1] == 0) { switch (*str) { case '(': return LPAR; case ')': return RPAR; case '!': return NOT; } } return NONE; } struct node * newnode(t) int t; { struct node *n = (struct node *) Malloc(sizeof(struct node)); n->n_type = t; return n; } /*########################### PARSER ###################################*/ /* Grammar: * expr : primary | primary OR expr; * primary : secondary | secondary AND primary | secondary primary; * secondary : NOT secondary | LPAR expr RPAR | simple; * simple : -OP args... */ /* Isnumber checks correct number syntax. A sign is allowed, but the '+' * only if the number is to be in decimal. */ int isnumber(str, base, sign) register char *str; int base; int sign; { if (sign && ((*str == '-') || ((base == 8) && (*str == '+')))) str++; while ((*str >= '0') && (*str < ('0' + base))) str++; return(*str == '\0' ? 1 : 0); } /* Convert a string to an integer, storing sign info in *ps. */ void number(str, base, pl, ps) char *str; int base; long *pl; int *ps; { int up = '0' + base - 1; long val = 0; *ps = ((*str == '-' || *str == '+') ? ((*str++ == '-') ? -1 : 1) : 0); while (*str >= '0' && *str <= up) val = base * val + *str++ - '0'; if (*str) fatal("syntax error: illegal numeric value", ""); *pl = val; } void domode(op, mode, bits) int op; int *mode; int bits; { switch (op) { case '-': *mode &= ~bits; break; /* clear bits */ case '=': *mode |= bits; break; /* set bits */ case '+': *mode |= (bits & ~um); /* set, but take umask in account */ } } void fmode(str, pl, ps) char *str; long *pl; int *ps; { int m = 0, w, op; char *p = str; if (*p == '-') { *ps = -1; p++; } else *ps = 0; while (*p) { w = 0; if (ISOPER(*p)) w = MUSER | MGROUP | MOTHERS; else if (!ISWHO(*p)) fatal("u, g, o, or a expected: ", p); else { while (ISWHO(*p)) { switch (*p) { case 'u': w |= MUSER; break; case 'g': w |= MGROUP; break; case 'o': w |= MOTHERS; break; case 'a': w = MUSER | MGROUP | MOTHERS; } p++; } if (!ISOPER(*p)) fatal("-, + or = expected: ", p); } op = *p++; while (ISMODE(*p)) { switch (*p) { case 'r': if (w & MUSER) domode(op, &m, S_IRUSR); if (w & MGROUP) domode(op, &m, S_IRGRP); if (w & MOTHERS) domode(op, &m, S_IROTH); break; case 'w': if (w & MUSER) domode(op, &m, S_IWUSR); if (w & MGROUP) domode(op, &m, S_IWGRP); if (w & MOTHERS) domode(op, &m, S_IWOTH); break; case 'x': if (w & MUSER) domode(op, &m, S_IXUSR); if (w & MGROUP) domode(op, &m, S_IXGRP); if (w & MOTHERS) domode(op, &m, S_IXOTH); break; case 's': if (w & MUSER) domode(op, &m, S_ISUID); if (w & MGROUP) domode(op, &m, S_ISGID); break; case 't': domode(op, &m, S_ISVTX); } p++; } if (*p) { if (*p == ',') p++; else fatal("garbage at end of mode string: ", p); } } *pl = m; } struct node * expr(t) int t; { struct node *nd, *p, *nd2; nd = primary(t); if ((t = lex(*++ipp)) == OP_OR) { nd2 = expr(lex(*++ipp)); p = newnode(OP_OR); p->n_info.n_opnd.n_left = nd; p->n_info.n_opnd.n_right = nd2; return p; } ipp--; return nd; } struct node * primary(t) int t; { struct node *nd, *p, *nd2; nd = secondary(t); if ((t = lex(*++ipp)) != OP_AND) { ipp--; if (t == EOI || t == RPAR || t == OP_OR) return nd; } nd2 = primary(lex(*++ipp)); p = newnode(OP_AND); p->n_info.n_opnd.n_left = nd; p->n_info.n_opnd.n_right = nd2; return p; } struct node * secondary(t) int t; { struct node *n, *p; if (t == LPAR) { n = expr(lex(*++ipp)); if (lex(*++ipp) != RPAR) fatal("syntax error, ) expected", ""); return n; } if (t == NOT) { n = secondary(lex(*++ipp)); p = newnode(NOT); p->n_info.n_opnd.n_left = n; return p; } return simple(t); } void checkarg(arg) char *arg; { if (arg == 0) fatal("syntax error, argument expected", ""); } struct node * simple(t) int t; { struct node *p = newnode(t); struct exec *e; struct stat est; struct passwd *pw; struct group *gr; long l; int i; switch (t) { case OP_TYPE: checkarg(*++ipp); switch (**ipp) { case 'b': p->n_info.n_int.n_val = S_IFBLK; break; case 'c': p->n_info.n_int.n_val = S_IFCHR; break; case 'd': p->n_info.n_int.n_val = S_IFDIR; break; case 'f': p->n_info.n_int.n_val = S_IFREG; break; case 'l': #ifdef S_IFLNK p->n_info.n_int.n_val = S_IFLNK; #else p->n_info.n_int.n_val = ~0; /* Always unequal. */ #endif break; default: fatal("-type needs b, c, d, f or l", ""); } break; case OP_USER: checkarg(*++ipp); if (((pw = getpwnam(*ipp)) == NULL) && isnumber(*ipp, 10, 0)) number(*ipp, 10, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); else { if (pw == NULL) fatal("unknown user: ", *ipp); p->n_info.n_int.n_val = pw->pw_uid; p->n_info.n_int.n_sign = 0; } break; case OP_GROUP: checkarg(*++ipp); if (((gr = getgrnam(*ipp)) == NULL) && isnumber(*ipp, 10, 0)) number(*ipp, 10, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); else { if (gr == NULL) fatal("unknown group: ", *ipp); p->n_info.n_int.n_val = gr->gr_gid; p->n_info.n_int.n_sign = 0; } break; case OP_SIZE: checkarg(*++ipp); i = strlen(*ipp) - 1; if ((*ipp)[i] == 'c') { p->n_type = OP_SIZEC; /* Count in bytes i.s.o. blocks */ (*ipp)[i] = '\0'; } number(*ipp, 10, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); break; case OP_LINKS: case OP_INUM: checkarg(*++ipp); number(*ipp, 10, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); break; case OP_PERM: checkarg(*++ipp); if (isnumber(*ipp, 8, 1)) number(*ipp, 8, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); else fmode(*ipp, &(p->n_info.n_int.n_val), &(p->n_info.n_int.n_sign)); break; case OP_ATIME: case OP_CTIME: case OP_MTIME: checkarg(*++ipp); number(*ipp, 10, &l, &(p->n_info.n_int.n_sign)); p->n_info.n_int.n_val = current_time - l * SECS_PER_DAY; /* More than n days old means less than the absolute time */ p->n_info.n_int.n_sign *= -1; break; case OP_EXEC: case OP_OK: checkarg(*++ipp); e = (struct exec *) Malloc(sizeof(struct exec)); e->e_cnt = 2; e->e_vec[0] = SHELL; p->n_info.n_exec = e; while (*ipp) { if (**ipp == ';' && (*ipp)[1] == '\0') { e->e_vec[e->e_cnt] = 0; break; } e->e_vec[(e->e_cnt)++] = (**ipp == '{' && (*ipp)[1] == '}' && (*ipp)[2] == '\0') ? (char *) (-1) : *ipp; ipp++; } if (*ipp == 0) fatal("-exec/-ok: ; missing", ""); if ((e->e_vec[1] = find_bin(e->e_vec[2])) == 0) fatal("can't find program ", e->e_vec[2]); if (t == OP_OK) if ((tty = open("/dev/tty", O_RDWR)) < 0) fatal("can't open /dev/tty", ""); break; case OP_NEWER: checkarg(*++ipp); if (LSTAT(*ipp, &est) == -1) fatal("-newer: can't get status of ", *ipp); p->n_info.n_int.n_val = est.st_mtime; break; case OP_NAME: checkarg(*++ipp); p->n_info.n_str = *ipp; break; case OP_XDEV: xdev_flag = 1; break; case OP_DEPTH: depth_flag = 1; break; case OP_PRUNE: case OP_PRINT: case OP_PRINT0: case OP_NOUSER: case OP_NOGROUP: break; default: fatal("syntax error, operator expected", ""); } if ((t == OP_PRINT) || (t == OP_PRINT0) || (t == OP_EXEC) || (t == OP_OK)) needprint = 0; return p; } /*######################## DIAGNOSTICS ##############################*/ void nonfatal(s1, s2) char *s1, *s2; { fprintf(stderr, "%s: %s%s\n", prog, s1, s2); } void fatal(s1, s2) char *s1, *s2; { nonfatal(s1, s2); exit(1); } /*################### SMATCH #########################*/ /* Don't try to understand the following one... */ int smatch(s, t) /* shell-like matching */ char *s, *t; { register n; if (*t == '\0') return *s == '\0'; if (*t == '*') { ++t; do if (smatch(s, t)) return 1; while (*s++ != '\0'); return 0; } if (*s == '\0') return 0; if (*t == '\\') return (*s == *++t) ? smatch(++s, ++t) : 0; if (*t == '?') return smatch(++s, ++t); if (*t == '[') { while (*++t != ']') { if (*t == '\\') ++t; if (*(t + 1) != '-') if (*t == *s) { while (*++t != ']') if (*t == '\\') ++t; return smatch(++s, ++t); } else continue; if (*(t + 2) == ']') return(*s == *t || *s == '-'); n = (*(t + 2) == '\\') ? 3 : 2; if (*s >= *t && *s <= *(t + n)) { while (*++t != ']') if (*t == '\\') ++t; return smatch(++s, ++t); } t += n; } return 0; } return(*s == *t) ? smatch(++s, ++t) : 0; } /*####################### EXECUTE ###########################*/ /* Do -exec or -ok */ char * find_bin(s) char *s; { char *f, *l, buf[PATH_MAX]; if (*s == '/') /* absolute path name */ return(access(s, 1) == 0) ? s : 0; l = f = epath; for (;;) { if (*l == ':' || *l == 0) { if (l == f) { if (access(s, 1) == 0) return Salloc(s); f++; } else { register char *p = buf, *q = s; while (f != l) *p++ = *f++; f++; *p++ = '/'; while (*p++ = *q++) { } if (access(buf, 1) == 0) return Salloc(buf); } if (*l == 0) break; } l++; } return 0; } int execute(op, e, path) int op; struct exec *e; char *path; { int s, pid; char *argv[MAXARG]; register char **p, **q; for (p = e->e_vec, q = argv; *p;) /* replace the {}s */ if ((*q++ = *p++) == (char *) -1) q[-1] = path; *q = '\0'; if (op == OP_OK) { char answer[10]; for (p = &argv[2]; *p; p++) { write(tty, *p, strlen(*p)); write(tty, " ", 1); } write(tty, "? ", 2); if (read(tty, answer, 10) < 2 || *answer != 'y') return 0; } if ((pid = fork()) == -1) fatal("can't fork", ""); if (pid == 0) { register i = 3; while (close(i++) == 0) { } /* wow!!! */ execv(argv[1], &argv[2]); /* binary itself? */ execv(argv[0], &argv[1]); /* shell command? */ fatal("exec failure: ", argv[1]); /* none of them! */ exit(127); } return wait(&s) == pid && s == 0; } ��������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 1980 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #ifndef lint static char sccsid[] = "@(#)finger.c 1.1 87/12/21 SMI"; /* from 5.8 3/13/86 */ #endif /* not lint */ /* * This is a finger program. It prints out useful information about users * by digging it up from various system files. * * There are three output formats, all of which give login name, teletype * line number, and login time. The short output format is reminiscent * of finger on ITS, and gives one line of information per user containing * in addition to the minimum basic requirements (MBR), the full name of * the user, his idle time and location. The * quick style output is UNIX who-like, giving only name, teletype and * login time. Finally, the long style output give the same information * as the short (in more legible format), the home directory and shell * of the user, and, if it exits, a copy of the file .plan in the users * home directory. Finger may be called with or without a list of people * to finger -- if no list is given, all the people currently logged in * are fingered. * * The program is validly called by one of the following: * * finger {short form list of users} * finger -l {long form list of users} * finger -b {briefer long form list of users} * finger -q {quick list of users} * finger -i {quick list of users with idle times} * finger namelist {long format list of specified users} * finger -s namelist {short format list of specified users} * finger -w namelist {narrow short format list of specified users} * * where 'namelist' is a list of users login names. * The other options can all be given after one '-', or each can have its * own '-'. The -f option disables the printing of headers for short and * quick outputs. The -b option briefens long format outputs. The -p * option turns off plans for long format outputs. */ #include <sys/types.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <utmp.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/socket.h> #include <net/gen/tcp.h> #include <net/gen/tcp_hdr.h> #include <net/gen/tcp_io.h> #include <net/hton.h> #include <net/netlib.h> #define NONOTHING 1 /* don't say "No plan", or "No mail" */ #define NONET 0 #define ASTERISK '*' /* ignore this in real name */ #define COMMA ',' /* separator in pw_gecos field */ #define COMMAND '-' /* command line flag char */ #define SAMENAME '&' /* repeat login name in real name */ #define TALKABLE 0220 /* tty is writable if this mode */ struct utmp user; #define NMAX sizeof(user.ut_name) #define LMAX sizeof(user.ut_line) #define HMAX sizeof(user.ut_host) struct person { /* one for each person fingered */ char *name; /* name */ char tty[LMAX+1]; /* null terminated tty line */ char host[HMAX+1]; /* null terminated remote host name */ long loginat; /* time of (last) login */ long idletime; /* how long idle (if logged in) */ char *realname; /* pointer to full name */ struct passwd *pwd; /* structure of /etc/passwd stuff */ char loggedin; /* person is logged in */ char writable; /* tty is writable */ char original; /* this is not a duplicate entry */ struct person *link; /* link to next person */ char *where; /* terminal location */ char hostt[HMAX+1]; /* login host */ }; char LASTLOG[] = "/usr/adm/lastlog"; /* last login info */ char USERLOG[] = "/etc/utmp"; /* who is logged in */ char PLAN[] = "/.plan"; /* what plan file is */ char PROJ[] = "/.project"; /* what project file */ int unbrief = 1; /* -b option default */ int header = 1; /* -f option default */ int hack = 1; /* -h option default */ int idle = 0; /* -i option default */ int large = 0; /* -l option default */ int match = 1; /* -m option default */ int plan = 1; /* -p option default */ int unquick = 1; /* -q option default */ int small = 0; /* -s option default */ int wide = 1; /* -w option default */ int unshort; int lf; /* LASTLOG file descriptor */ struct person *person1; /* list of people */ long tloc; /* current time */ #if !_MINIX char *strcpy(); char *ctime(); #endif char *prog_name; int main (int argc, char *argv[]); static void doall(void); static void donames(char **args); static void print(void); static void fwopen(void); static void decode(struct person *pers); static void fwclose(void); static int netfinger (char *name); static int matchcmp (char *gname, char *login, char *given); static void quickprint (struct person *pers); static void shortprint (struct person *pers); static void personprint (struct person *pers); static int AlreadyPrinted(int uid); static int AnyMail (char *name); static struct passwd *pwdcopy(struct passwd *pfrom); static void findidle (struct person *pers); static int ltimeprint (char *dt, long *before, char *after); static void stimeprint (long *dt); static void findwhen (struct person *pers); static int namecmp (char *name1, char *name2); main(argc, argv) int argc; register char **argv; { FILE *fp; register char *s; prog_name= argv[0]; /* parse command line for (optional) arguments */ while (*++argv && **argv == COMMAND) for (s = *argv + 1; *s; s++) switch (*s) { case 'b': unbrief = 0; break; case 'f': header = 0; break; case 'h': hack = 0; break; case 'i': idle = 1; unquick = 0; break; case 'l': large = 1; break; case 'm': match = 0; break; case 'p': plan = 0; break; case 'q': unquick = 0; break; case 's': small = 1; break; case 'w': wide = 0; break; default: fprintf(stderr, "Usage: finger [-bfhilmpqsw] [login1 [login2 ...] ]\n"); exit(1); } if (unquick || idle) time(&tloc); /* * *argv == 0 means no names given */ if (*argv == 0) doall(); else donames(argv); if (person1) print(); exit(0); } static void doall() { register struct person *p; register struct passwd *pw; int uf; char name[NMAX + 1]; unshort = large; if ((uf = open(USERLOG, 0)) < 0) { fprintf(stderr, "finger: error opening %s\n", USERLOG); exit(2); } if (unquick) { setpwent(); fwopen(); } while (read(uf, (char *)&user, sizeof user) == sizeof user) { if (user.ut_name[0] == 0) continue; if (person1 == 0) p = person1 = (struct person *) malloc(sizeof *p); else { p->link = (struct person *) malloc(sizeof *p); p = p->link; } bcopy(user.ut_name, name, NMAX); name[NMAX] = 0; bcopy(user.ut_line, p->tty, LMAX); p->tty[LMAX] = 0; bcopy(user.ut_host, p->host, HMAX); p->host[HMAX] = 0; p->loginat = user.ut_time; p->pwd = 0; p->loggedin = 1; p->where = NULL; if (unquick && (pw = getpwnam(name))) { p->pwd = pwdcopy(pw); decode(p); p->name = p->pwd->pw_name; } else p->name = strcpy(malloc(strlen(name) + 1), name); } if (unquick) { fwclose(); endpwent(); } close(uf); if (person1 == 0) { printf("No one logged on\n"); return; } p->link = 0; } static void donames(argv) char **argv; { register struct person *p; register struct passwd *pw; int uf; /* * get names from command line and check to see if they're * logged in */ unshort = !small; for (; *argv != 0; argv++) { if (netfinger(*argv)) continue; if (person1 == 0) p = person1 = (struct person *) malloc(sizeof *p); else { p->link = (struct person *) malloc(sizeof *p); p = p->link; } p->name = *argv; p->loggedin = 0; p->original = 1; p->pwd = 0; } if (person1 == 0) return; p->link = 0; /* * if we are doing it, read /etc/passwd for the useful info */ if (unquick) { setpwent(); if (!match) { for (p = person1; p != 0; p = p->link) if (pw = getpwnam(p->name)) p->pwd = pwdcopy(pw); } else while ((pw = getpwent()) != 0) { for (p = person1; p != 0; p = p->link) { if (!pN��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������->original) continue; if (strcmp(p->name, pw->pw_name) != 0 && !matchcmp(pw->pw_gecos, pw->pw_name, p->name)) continue; if (p->pwd == 0) p->pwd = pwdcopy(pw); else { struct person *new; /* * handle multiple login names, insert * new "duplicate" entry behind */ new = (struct person *) malloc(sizeof *new); new->pwd = pwdcopy(pw); new->name = p->name; new->original = 1; new->loggedin = 0; new->link = p->link; p->original = 0; p->link = new; p = new; } } } endpwent(); } /* Now get login information */ if ((uf = open(USERLOG, 0)) < 0) { fprintf(stderr, "finger: error opening %s\n", USERLOG); exit(2); } while (read(uf, (char *)&user, sizeof user) == sizeof user) { if (*user.ut_name == 0) continue; for (p = person1; p != 0; p = p->link) { if (p->loggedin == 2) continue; if (strncmp(p->pwd ? p->pwd->pw_name : p->name, user.ut_name, NMAX) != 0) continue; if (p->loggedin == 0) { bcopy(user.ut_line, p->tty, LMAX); p->tty[LMAX] = 0; bcopy(user.ut_host, p->host, HMAX); p->host[HMAX] = 0; p->loginat = user.ut_time; p->loggedin = 1; } else { /* p->loggedin == 1 */ struct person *new; new = (struct person *) malloc(sizeof *new); new->name = p->name; bcopy(user.ut_line, new->tty, LMAX); new->tty[LMAX] = 0; bcopy(user.ut_host, new->host, HMAX); new->host[HMAX] = 0; new->loginat = user.ut_time; new->pwd = p->pwd; new->loggedin = 1; new->original = 0; new->link = p->link; p->loggedin = 2; p->link = new; p = new; } } } close(uf); if (unquick) { fwopen(); for (p = person1; p != 0; p = p->link) decode(p); fwclose(); } } static void print() { register FILE *fp; register struct person *p; register char *s; register c; /* * print out what we got */ if (header) { if (unquick) { if (!unshort) if (wide) printf("Login Name TTY Idle When Where\n"); else printf("Login TTY Idle When Where\n"); } else { printf("Login TTY When"); if (idle) printf(" Idle"); putchar('\n'); } } for (p = person1; p != 0; p = p->link) { if (!unquick) { quickprint(p); continue; } if (!unshort) { shortprint(p); continue; } personprint(p); if (p->pwd != 0 && !AlreadyPrinted(p->pwd->pw_uid)) { AnyMail(p->pwd->pw_name); if (hack) { s = malloc(strlen(p->pwd->pw_dir) + sizeof PROJ); strcpy(s, p->pwd->pw_dir); strcat(s, PROJ); if ((fp = fopen(s, "r")) != 0) { printf("Project: "); while ((c = getc(fp)) != EOF) { if (c == '\n') break; if (isprint(c) || isspace(c)) putchar(c); else putchar(c ^ 100); } fclose(fp); putchar('\n'); } free(s); } if (plan) { s = malloc(strlen(p->pwd->pw_dir) + sizeof PLAN); strcpy(s, p->pwd->pw_dir); strcat(s, PLAN); if ((fp = fopen(s, "r")) == 0) { if (!NONOTHING) printf("No Plan.\n"); } else { printf("Plan:\n"); while ((c = getc(fp)) != EOF) if (isprint(c) || isspace(c)) putchar(c); else putchar(c ^ 100); fclose(fp); } free(s); } } if (p->link != 0) putchar('\n'); } } /* * Duplicate a pwd entry. * Note: Only the useful things (what the program currently uses) are copied. */ static struct passwd * pwdcopy(pfrom) register struct passwd *pfrom; { register struct passwd *pto; pto = (struct passwd *) malloc(sizeof *pto); #define savestr(s) strcpy(malloc(strlen(s) + 1), s) pto->pw_name = savestr(pfrom->pw_name); pto->pw_uid = pfrom->pw_uid; pto->pw_gecos = savestr(pfrom->pw_gecos); pto->pw_dir = savestr(pfrom->pw_dir); pto->pw_shell = savestr(pfrom->pw_shell); #undef savestr return pto; } /* * print out information on quick format giving just name, tty, login time * and idle time if idle is set. */ static void quickprint(pers) register struct person *pers; { printf("%-*.*s ", NMAX, NMAX, pers->name); if (pers->loggedin) { if (idle) { findidle(pers); printf("%c%-*s %-16.16s", pers->writable ? ' ' : '*', LMAX, pers->tty, ctime(&pers->loginat)); ltimeprint(" ", &pers->idletime, ""); } else printf(" %-*s %-16.16s", LMAX, pers->tty, ctime(&pers->loginat)); putchar('\n'); } else printf(" Not Logged In\n"); } /* * print out information in short format, giving login name, full name, * tty, idle time, login time, and host. */ static void shortprint(pers) register struct person *pers; { char *p; char dialup; if (pers->pwd == 0) { printf("%-15s ???\n", pers->name); return; } printf("%-*s", NMAX, pers->pwd->pw_name); dialup = 0; if (wide) { if (pers->realname) printf(" %-20.20s", pers->realname); else printf(" ??? "); } putchar(' '); if (pers->loggedin && !pers->writable) putchar('*'); else putchar(' '); if (*pers->tty) { if (pers->tty[0] == 't' && pers->tty[1] == 't' && pers->tty[2] == 'y') { if (pers->tty[3] == 'd' && pers->loggedin) dialup = 1; printf("%-2.2s ", pers->tty + 3); } else printf("%-2.2s ", pers->tty); } else printf(" "); p = ctime(&pers->loginat); if (pers->loggedin) { stimeprint(&pers->idletime); printf(" %3.3s %-5.5s ", p, p + 11); } else if (pers->loginat == 0) printf(" < . . . . >"); else if (tloc - pers->loginat >= 180L * 24 * 60 * 60) printf(" <%-6.6s, %-4.4s>", p + 4, p + 20); else printf(" <%-12.12s>", p + 4); if (pers->host[0]) printf(" %-20.20s", pers->host); putchar('\n'); } /* * print out a person in long format giving all possible information. * directory and shell are inhibited if unbrief is clear. */ static void personprint(pers) register struct person *pers; { if (pers->pwd == 0) { printf("Login name: %-10s\t\t\tIn real life: ???\n", pers->name); return; } printf("Login name: %-10s", pers->pwd->pw_name); if (pers->loggedin && !pers->writable) printf(" (messages off) "); else printf(" "); if (pers->realname) printf("In real life: %s", pers->realname); if (unbrief) { printf("\nDirectory: %-25s", pers->pwd->pw_dir); if (*pers->pwd->pw_shell) printf("\tShell: %-s", pers->pwd->pw_shell); } if (pers->loggedin) { register char *ep = ctime(&pers->loginat); if (*pers->host) { printf("\nOn since %15.15s on %s from %s", &ep[4], pers->tty, pers->host); ltimeprint("\n", &pers->idletime, " Idle Time"); } else { printf("\nOn since %15.15s on %-*s", &ep[4], LMAX, pers->tty); ltimeprint("\t", &pers->idletime, " Idle Time"); } } else if (pers->loginat == 0) { if (lf >= 0) printf("\nNever logged in."); } else if (tloc - pers->loginat > 180L * 24 * 60 * 60) { register char *ep = ctime(&pers->loginat); printf("\nLast login %10.10s, %4.4s on %s", ep, ep+20, pers->tty); if (*pers->host) printf(" from %s", pers->host); } else { register char *ep = ctime(&pers->loginat); printf("\nLast login %16.16s on %s", ep, pers->tty); if (*pers->host) printf(" from %s", pers->host); } putchar('\n'); } /* * decode the information in the gecos field of /etc/passwd */ static void decode(pers) register struct person *pers; { char buffer[256]; register char *bp, *gp, *lp; int alldigits; int hasspace; int len; pers->realname = 0; if (pers->pwd == 0) return; gp = pers->pwd->pw_gecos; bp = buffer; if (*gp == ASTERISK) gp++; while (*gp && *gp != COMMA) /* name */ if (*gp == SAMENAME) { lp = pers->pwd->pw_name; if (islower(*lp)) *bp++ = toupper(*lp++); while (*bp++ = *lp++) ; bp--; gp++; } else *bp++ = *gp++; *bp++ = 0; if ((len = bp - buffer) > 1) pers->realname = strcpy(malloc(len), buffer); if (pers->loggedin) findidle(pers); else findwhen(pers); } /* * find the last log in of a user by checking the LASTLOG file. * the entry is indexed by the uid, so this can only be done if * the uid is known (which it isn't in quick mode) */ static void fwopen() { if ((lf = open(LASTLOG, 0)) < 0) { if (errno == ENOENT) return; fprintf(stderr, "finger: %s open error\n", LASTLOG); } } static void findwhen(pers) register struct person *pers; { struct utmp ll; #define ll_line ut_line #define ll_host ut_host #define ll_time ut_time int i; if (lf >= 0) { lseek(lf, (long)pers->pwd->pw_uid * sizeof ll, 0); if ((i = read(lf, (char *)&ll, sizeof ll)) == sizeof ll) { bcopy(ll.ll_line, pers->tty, LMAX); pers->tty[LMAX] = 0; bcopy(ll.ll_host, pers->host, HMAX); pers->host[HMAX] = 0; pers->loginat = ll.ll_time; } else { if (i != 0) fprintf(stderr, "finger: %s read error\n", LASTLOG); pers->tty[0] = 0; pers->host[0] = 0; pers->loginat = 0L; } } else { pers->tty[0] = 0; pers->host[0] = 0; pers->loginat = 0L; } } static void fwclose() { if (lf >= 0) close(lf); } /* * find the idle time of a user by doing a stat on /dev/tty??, * where tty?? has been gotten from USERLOG, supposedly. */ static void findidle(pers) register struct person *pers; { struct stat ttystatus; static char buffer[20] = "/dev/"; long t; #define TTYLEN 5 strcpy(buffer + TTYLEN, pers->tty); buffer[TTYLEN+LMAX] = 0; if (stat(buffer, &ttystatus) < 0) { fprintf(stderr, "finger: Can't stat %s\n", buffer); exit(4); } time(&t); if (t < ttystatus.st_atime) pers->idletime = 0L; else pers->idletime = t - ttystatus.st_atime; pers->writable = (ttystatus.st_mode & TALKABLE) == TALKABLE; } /* * print idle time in short format; this program always prints 4 characters; * if the idle time is zero, it prints 4 blanks. */ static void stimeprint(dt) long *dt; { register struct tm *delta; delta = gmtime(dt); if (delta->tm_yday == 0) if (delta->tm_hour == 0) if (delta->tm_min == 0) printf(" "); else printf(" %2d", delta->tm_min); else if (delta->tm_hour >= 10) printf("%3d:", delta->tm_hour); else printf("%1d:%02d", delta->tm_hour, delta->tm_min); else printf("%3dd", delta->tm_yday); } /* * print idle time in long format with care being taken not to pluralize * 1 minutes or 1 hours or 1 days. * print "prefix" first. */ static int ltimeprint(before, dt, after) long *dt; char *before, *after; { register struct tm *delta; delta = gmtime(dt); if (delta->tm_yday == 0 && delta->tm_hour == 0 && delta->tm_min == 0 && delta->tm_sec <= 10) return (0); printf("%s", before); if (delta->tm_yday >= 10) printf("%d days", delta->tm_yday); else if (delta->tm_yday > 0) printf("%d day%s %d hour%s", delta->tm_yday, delta->tm_yday == 1 ? "" : "s", delta->tm_hour, delta->tm_hour == 1 ? "" : "s"); else if (delta->tm_hour >= 10) printf("%d hours", delta->tm_hour); else if (delta->tm_hour > 0) printf("%d hour%s %d minute%s", delta->tm_hour, delta->tm_hour == 1 ? "" : "s", delta->tm_min, delta->tm_min == 1 ? "" : "s"); else if (delta->tm_min >= 10) printf("%2d minutes", delta->tm_min); else if (delta->tm_min == 0) printf("%2d seconds", delta->tm_sec); else printf("%d minute%s %d second%s", delta->tm_min, delta->tm_min == 1 ? "" : "s", delta->tm_sec, delta->tm_sec == 1 ? "" : "s"); printf("%s", after); } static int matchcmp(gname, login, given) register char *gname; char *login; char *given; { char buffer[100]; register char *bp, *lp; register c; if (*gname == ASTERISK) gname++; lp = 0; bp = buffer; for (;;) switch (c = *gname++) { case SAMENAME: for (lp = login; bp < buffer + sizeof buffer && (*bp++ = *lp++);) ; bp--; break; case ' ': case COMMA: case '\0': *bp = 0; if (namecmp(buffer, given)) return (1); if (c == COMMA || c == 0) return (0); bp = buffer; break; default: if (bp < buffer + sizeof buffer) *bp++ = c; } /*NOTREACHED*/ } static int namecmp(name1, name2) register char *name1, *name2; { register c1, c2; for (;;) { c1 = *name1++; if (islower(c1)) c1 = toupper(c1); c2 = *name2++; if (islower(c2)) c2 = toupper(c2); if (c1 != c2) break; if (c1 == 0) return (1); } if (!c1) { for (name2--; isdigit(*name2); name2++) ; if (*name2 == 0) return (1); } else if (!c2) { for (name1--; isdigit(*name1); name1++) ; if (*name2 == 0) return (1); } return (0); } #if NONET static int netfinger(name) char *name; { return 0; } #else static int netfinger(name) char *name; { char *host; char fname[100]; struct hostent *hp; struct servent *sp; int s, result; #if !_MINIX char *rindex(); #endif register FILE *f; register int c; register int lastc; nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpconnopt; char *tcp_device; if (name == NULL) return (0); host = rindex(name, '@'); if (host == NULL) return (0); *host++ = 0; hp = gethostbyname(host); if (hp == NULL) { static struct hostent def; static ipaddr_t defaddr; static char namebuf[128]; defaddr = inet_addr(host); if (defaddr == -1) { printf("unknown host: %s\n", host); return (1); } strcpy(namebuf, host); def.h_name = namebuf; def.h_addr = (char *)&defaddr; def.h_length = sizeof (ipaddr_t); def.h_addrtype = AF_INET; def.h_aliases = 0; hp = &def; } printf("[%s] ", hp->h_name); fflush(stdout); tcp_device= getenv("TCP_DEVICE"); if (tcp_device == NULL) tcp_device= TCP_DEVICE; s= open (tcp_device, O_RDWR); if (s == -1) { fprintf(stderr, "%s: unable to open %s (%s)\n", prog_name, tcp_device, strerror(errno)); exit(1); } tcpconf.nwtc_flags= NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr= *(ipaddr_t *)hp->h_addr; tcpconf.nwtc_remport= htons(TCPPORT_FINGER); result= ioctl (s, NWIOSTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "%s\n", strerror(errno)); exit(1); } tcpconnopt.nwtcl_flags= 0; do { result= ioctl (s, NWIOTCPCONN, &tcpconnopt); if (result<0 && errno== EAGAIN) { fprintf(stderr, "got EAGAIN error, sleeping 2s\n"); sleep(2); } } while (result<0 && errno == EAGAIN); if (result<0) { fprintf(stderr, "%s\n", strerror(errno)); exit(1); } printf("\r\n"); if (large) write(s, "/W ", 3); write(s, name, strlen(name)); write(s, "\r\n", 2); f = fdopen(s, "r"); while ((c = getc(f)) != EOF) { /* switch(c) { case 0210: case 0211: case 0212: case 0214: c -= 0200; break; case 0215: c = '\n'; break; } */ c &= ~0200; if (c == '\r') { c= getc(f) & ~0200; if (c == '\012') { lastc= c; putchar('\n'); continue; } else putchar('\r'); } lastc = c; if (isprint(c) || isspace(c)) putchar(c); else putchar(c ^ 100); } if (lastc != '\n') putchar('\n'); (void)fclose(f); return (1); } #endif /* * AnyMail - takes a username (string pointer thereto), and * prints on standard output whether there is any unread mail, * and if so, how old it is. (JCM@Shasta 15 March 80) */ #define preamble "/usr/spool/mail/" /* mailboxes are there */ static int AnyMail(name) char *name; { struct stat buf; /* space for file status buffer */ char *mbxdir = preamble; /* string with path preamble */ char *mbxpath; /* space for entire pathname */ #if !_MINIX char *ctime(); /* convert longword time to ascii */ #endif char *timestr; mbxpath = malloc(strlen(name) + strlen(preamble) + 1); strcpy(mbxpath, mbxdir); /* copy preamble into path name */ strcat(mbxpath, name); /* concatenate user name to path */ if (stat(mbxpath, &buf) == -1 || buf.st_size == 0) { /* Mailbox is empty or nonexistent */ if (!NONOTHING) printf("No unread mail\n"); } else { if (buf.st_mtime == buf.st_atime) { /* There is something in the mailbox, but we can't really * be sure whether it is mail held there by the user * or a (single) new message that was placed in a newly * recreated mailbox, so we punt and call it "unread mail." */ printf("Unread mail since "); printf(ctime(&buf.st_mtime)); } else { /* New mail has definitely arrived since the last time * mail was read. mtime is the time the most recent * message arrived; atime is either the time the oldest * unread message arrived, or the last time the mail * was read. */ printf("New mail received "); timestr = ctime(&buf.st_mtime); /* time last modified */ timestr[24] = '\0'; /* suppress newline (ugh) */ printf(timestr); printf(";\n unread since "); printf(ctime(&buf.st_atime)); /* time last accessed */ } } free(mbxpath); } /* * return true iff we've already printed project/plan for this uid; * if not, enter this uid into table (so this function has a side-effect.) */ #define PPMAX 200 /* assume no more than 200 logged-in users */ int PlanPrinted[PPMAX+1]; int PPIndex = 0; /* index of next unused table entry */ static int AlreadyPrinted(uid) int uid; { int i = 0; while (i++ < PPIndex) { if (PlanPrinted[i] == uid) return(1); } if (i < PPMAX) { PlanPrinted[i] = uid; PPIndex++; } return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* fix file difflist - update file from difflist Author: Erik Baalbergen */ /* Notes: files old and old.patch are equal after the following commands diff old new > difflist patch old difflist > old.patch * the diff output is assumed to be produced by my diff program. * the difflist has the following form: difflist ::= chunk* chunk ::= append | delete | change ; append ::= n1 'a' n2 [',' n3]? '\n' ['> ' line '\n'](n3 - n2 + 1) delete ::= n1 [',' n2]? 'd' n3 '\n' ['< ' line '\n'](n2 - n1 + 1) change ::= n1 [',' n2]? 'c' n3 [',' n4]? '\n' ['< ' line '\n'](n2 - n1 + 1) '---\n' ['> ' line '\n'](n4 - n3 + 1) where - n[1234] is an unsigned integer - "[pat](expr)" means "(expr) occurences of pat" - "[pat]?" means "either pat or nothing" * the information in the diff listing is checked against the file to which it is applied; an error is printed if there is a conflict */ #include <ctype.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define IGNORE_WHITE_SPACE /* This makes it white space insensitive */ #ifdef IGNORE_WHITE_SPACE #define strcmp strwcmp #endif #define LINELEN 1024 char *prog = 0, *processing = 0; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char *getline, (FILE *fp, char *b)); _PROTOTYPE(char *range, (char *s, int *p1, int *p2)); _PROTOTYPE(int getcommand, (FILE *fp, int *o1, int *o2, char *pcmd, int *n1, int *n2)); _PROTOTYPE(void fatal, (char *s, ...)); _PROTOTYPE(int strwcmp, (char *s1, char *s2)); _PROTOTYPE(int whitespace, (int ch)); char * getline(fp, b) FILE *fp; char *b; { if (fgets(b, LINELEN, fp) == NULL) fatal("unexpected eof"); return b; } #define copy(str) printf("%s", str) int main(argc, argv) int argc; char **argv; { char cmd, *fl, *fd, obuf[LINELEN], nbuf[LINELEN]; int o1, o2, n1, n2, here; FILE *fpf, *fpd; prog = argv[0]; processing = argv[1]; if (argc != 3) fatal("use: %s original-file diff-list-file", prog); if ((fpf = fopen(argv[1], "r")) == NULL) fatal("can't read %s", argv[1]); if ((fpd = fopen(argv[2], "r")) == NULL) fatal("can't read %s", argv[2]); here = 0; while (getcommand(fpd, &o1, &o2, &cmd, &n1, &n2)) { while (here < o1 - 1) { here++; copy(getline(fpf, obuf)); } switch (cmd) { case 'c': case 'd': if (cmd == 'd' && n1 != n2) fatal("delete count conflict"); while (o1 <= o2) { fl = getline(fpf, obuf); here++; fd = getline(fpd, nbuf); if (strncmp(fd, "<", (size_t)1)) fatal("illegal delete line"); if (strcmp(fl, fd + 2)) fatal("delete line conflict"); o1++; } if (cmd == 'd') break; if (strcmp(getline(fpd, nbuf), "---\n")) fatal("illegal separator in chunk"); /* FALLTHROUGH */ case 'a': if (cmd == 'a') { if (o1 != o2) fatal("append count conflict"); copy(getline(fpf, obuf)); here++; } while (n1 <= n2) { if (strncmp(getline(fpd, nbuf), ">", (size_t)1)) fatal("illegal append line"); copy(nbuf + 2); n1++; } break; } } while (fgets(obuf, LINELEN, fpf) != NULL) copy(obuf); return(0); } char * range(s, p1, p2) char *s; int *p1, *p2; { register int v1 = 0, v2; while (isdigit(*s)) v1 = 10 * v1 + *s++ - '0'; v2 = v1; if (*s == ',') { s++; v2 = 0; while (isdigit(*s)) v2 = 10 * v2 + *s++ - '0'; } if (v1 > v2) fatal("illegal range"); *p1 = v1; *p2 = v2; return s; } int getcommand(fp, o1, o2, pcmd, n1, n2) FILE *fp; int *o1, *o2, *n1, *n2; char *pcmd; { char buf[LINELEN]; register char *s; char cmd; if ((s = fgets(buf, LINELEN, fp)) == NULL) return 0; s = range(s, o1, o2); if ((cmd = *s++) != 'a' && cmd != 'c' && cmd != 'd') fatal("illegal command"); s = range(s, n1, n2); if (*s != '\n' && s[1] != '\0') fatal("extra characters at end of command: %s", s); *pcmd = cmd; return 1; } #ifdef __STDC__ void fatal(char *s, ...) { va_list args; va_start (args, s); fprintf(stderr, "%s: processing: %s fatal: ", prog, processing); vfprintf(stderr, s, args); fprintf(stderr, "\n"); va_end(args); exit(1); } #else /* the K&R lib does not have vfprintf */ void fatal(s, a) char *s, *a; { fprintf(stderr, "%s: processing: %s fatal: ", prog, processing); fprintf(stderr, s, a); fprintf(stderr, "\n"); exit(1); } #endif #ifdef IGNORE_WHITE_SPACE /* This routine is a white space insensitive version of strcmp. It is needed for testing things which might have undergone tab conversion or trailing space removal Bret Mckee June, 1988 */ int strwcmp(s1, s2) char *s1, *s2; { char *x1 = s1, *x2 = s2; /* Remove leading white space */ while (whitespace(*s1)) s1++; while (whitespace(*s2)) s2++; do { while ((*s1 == *s2) && *s1 && *s2) { s1++; s2++; } ; /* consume identical characters */ while (whitespace(*s1)) s1++; while (whitespace(*s2)) s2++; } while (*s1 && *s2 && (*s1 == *s2)); if (*s1 - *s2) fprintf(stderr, "Failing for (%x)[%s]\n (%x)[%s]\n", (int) *s1, x1, (int) *s2, x2); return(*s1 - *s2); } int whitespace(ch) char ch; { switch (ch) { case ' ': case '\n': case 0x0D: case '\t': return(1); default: return(0); } } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* fold - folds long lines Author: Terrence W. Holm */ /* Usage: fold [ -width ] [ file ... ] */ #include <stdlib.h> #include <stdio.h> #define TAB 8 #define DEFAULT_WIDTH 80 int column = 0; /* Current column, retained between files */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Fold, (FILE *f, int width)); int main(argc, argv) int argc; char *argv[]; { int width = DEFAULT_WIDTH; int i; FILE *f; if (argc > 1 && argv[1][0] == '-') { if ((width = atoi(&argv[1][1])) <= 0) { fprintf(stderr, "Bad number for fold\n"); exit(1); } --argc; ++argv; } if (argc == 1) Fold(stdin, width); else { for (i = 1; i < argc; ++i) { if ((f = fopen(argv[i], "r")) == NULL) { perror(argv[i]); exit(1); } Fold(f, width); fclose(f); } } return(0); } void Fold(f, width) FILE *f; int width; { int c; while ((c = getc(f)) != EOF) { if (c == '\t') column = (column / TAB + 1) * TAB; else if (c == '\b') column = column > 0 ? column - 1 : 0; else if (c == '\n' || c == '\r') column = 0; else ++column; if (column > width) { putchar('\n'); column = c == '\t' ? TAB : 1; } putchar(c); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* fortune - hand out Chinese fortune cookies Author: Bert Reuling */ #include <sys/types.h> #include <sys/stat.h> #include <time.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define COOKIEJAR "/usr/lib/fortune.dat" static char *Copyright = "\0Copyright (c) 1990 Bert Reuling"; static unsigned long seed; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(unsigned long magic, (unsigned long range)); int main(argc, argv) int argc; char *argv[]; { int c1, c2, c3; struct stat cookie_stat; FILE *cookie; if ((cookie = fopen(COOKIEJAR, "r")) == NULL) { printf("\nSome things better stay closed.\n - %s\n", argv[0]); exit (-1); } /* Create seed from : date, time, user-id and process-id. we can't get * the position of the moon, unfortunately. */ seed = time( (time_t *) 0) ^ (long) getuid() ^ (long) getpid(); if (stat(COOKIEJAR, &cookie_stat) != 0) { printf("\nIt furthers one to see the super guru.\n - %s\n", argv[0]); exit (-1); } fseek(cookie, magic((unsigned long) cookie_stat.st_size), 0); /* m ove bu magic... */ c2 = c3 = '\n'; while (((c1 = getc(cookie)) != EOF) && ((c1 != '%') || (c2 != '%') || (c3 != '\n'))) { c3 = c2; c2 = c1; } if (c1 == EOF) { printf("\nSomething unexpected has happened.\n - %s", argv[0]); exit (-1); } c2 = c3 = '\n'; while (((c1 = getc(cookie)) != '%') || (c2 != '%') || (c3 != '\n')) { if (c1 == EOF) { rewind(cookie); continue; } putc(c2, stdout); c3 = c2; c2 = c1; } putc('\n', stdout); fclose(cookie); return (0); } /* magic - please study carefull: there is more than meets the eye */ unsigned long magic(range) unsigned long range; { seed = 9065531L * (seed % 9065533L) - 2 * (seed / 9065531L) + 1L; return (seed % range); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Hacks for version 1.6 */ #define INODES_PER_BLOCK V2_INODES_PER_BLOCK #define INODE_SIZE ((int) V2_INODE_SIZE) #define WORDS_PER_BLOCK (BLOCK_SIZE / (int) sizeof(bitchunk_t)) #define MAX_ZONES (V2_NR_DZONES+V2_INDIRECTS+(long)V2_INDIRECTS*V2_INDIRECTS) #define NR_DZONE_NUM V2_NR_DZONES #define NR_INDIRECTS V2_INDIRECTS #define NR_ZONE_NUMS V2_NR_TZONES #define ZONE_NUM_SIZE V2_ZONE_NUM_SIZE #define bit_nr bit_t #define block_nr block_t #define d_inode d2_inode #define d_inum d_ino #define dir_struct struct direct #define i_mode d2_mode #define i_nlinks d2_nlinks #define i_size d2_size #define i_zone d2_zone #define zone_nr zone_t /* fsck - file system checker Author: Robbert van Renesse */ /* Modified by Norbert Schlenker * Removed vestiges of standalone/DOS versions: * - various unused variables and buffers removed * - now uses library functions rather than private internal routines * - bytewise structure copies replaced by structure assignment * - fixed one bug with 14 character file names * - other small tweaks for speed * * Modified by Lars Fredriksen at the request of Andy Tanenbaum, 90-03-10. * Removed -m option, by which fsck could be told to make a file * system on a 360K floppy. The code had limited utility, was buggy, * and failed due to a bug in the ACK C compiler. Use mkfs instead! */ #include <sys/types.h> #include <sys/dir.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include "../../fs/const.h" #include "../../fs/inode.h" #include "../../fs/type.h" #include <minix/fslib.h> #include <stdio.h> #define BITSHIFT 4 /* = log2(#bits(int)) */ #define MAXPRINT 8 /* max. number of error lines in chkmap */ #define CINDIR 128 /* number of indirect zno's read at a time */ #define CDIRECT 16 /* number of dir entries read at a time */ /* Macros for handling bitmaps. Now bit_t is long, these are bulky and the * type demotions produce a lot of lint. The explicit demotion in POWEROFBIT * is for efficiency and assumes 2's complement ints. Lint should be clever * enough not to warn about it since BITMASK is small, but isn't. (It would * be easier to get right if bit_t was was unsigned (long) since then there * would be no danger from wierd sign representations. Lint doesn't know * we only use non-negative bit numbers.) There will usually be an implicit * demotion when WORDOFBIT is used as an array index. This should be safe * since memory for bitmaps will run out first. */ #define BITMASK ((1 << BITSHIFT) - 1) #define WORDOFBIT(b) ((b) >> BITSHIFT) #define POWEROFBIT(b) (1 << ((int) (b) & BITMASK)) #define setbit(w, b) (w[WORDOFBIT(b)] |= POWEROFBIT(b)) #define clrbit(w, b) (w[WORDOFBIT(b)] &= ~POWEROFBIT(b)) #define bitset(w, b) (w[WORDOFBIT(b)] & POWEROFBIT(b)) #define ZONE_CT 360 /* default zones (when making file system) */ #define INODE_CT 95 /* default inodes (when making file system) */ #include "../../fs/super.h" struct super_block sb; #define STICKY_BIT 01000 /* not defined anywhere else */ /* Ztob gives the block address of a zone * btoa gives the byte address of a block */ #define ztob(z) ((block_nr) (z) << sb.s_log_zone_size) #define btoa(b) ((long) (b) * BLOCK_SIZE) #define SCALE ((int) ztob(1)) /* # blocks in a zone */ #define FIRST ((zone_nr) sb.s_firstdatazone) /* as the name says */ /* # blocks of each type */ #define N_SUPER 1 #define N_IMAP (sb.s_imap_blocks) #define N_ZMAP (sb.s_zmap_blocks) #define N_ILIST ((sb.s_ninodes+INODES_PER_BLOCK-1) / INODES_PER_BLOCK) #define N_DATA (sb.s_zones - FIRST) /* Block address of each type */ #define BLK_SUPER (SUPER_BLOCK) #define BLK_IMAP (BLK_SUPER + N_SUPER) #define BLK_ZMAP (BLK_IMAP + N_IMAP) #define BLK_ILIST (BLK_ZMAP + N_ZMAP) #define BLK_FIRST ztob(FIRST) #define ZONE_SIZE ((int) ztob(BLOCK_SIZE)) #define NLEVEL (NR_ZONE_NUMS - NR_DZONE_NUM + 1) /* Byte address of a zone/of an inode */ #define zaddr(z) btoa(ztob(z)) #define inoaddr(i) ((long) (i - 1) * INODE_SIZE + (long) btoa(BLK_ILIST)) #define INDCHUNK ((int) (CINDIR * ZONE_NUM_SIZE)) #define DIRCHUNK ((int) (CDIRECT * DIR_ENTRY_SIZE)) char *prog, *device; /* program name (fsck), device name */ int firstcnterr; /* is this the first inode ref cnt error? */ bitchunk_t *imap, *spec_imap; /* inode bit maps */ bitchunk_t *zmap, *spec_zmap; /* zone bit maps */ bitchunk_t *dirmap; /* directory (inode) bit map */ char rwbuf[BLOCK_SIZE]; /* one block buffer cache */ block_nr thisblk; /* block in buffer cache */ char nullbuf[BLOCK_SIZE]; /* null buffer */ nlink_t *count; /* inode count */ int changed; /* has the diskette been written to? */ struct stack { dir_struct *st_dir; struct stack *st_next; char st_presence; } *ftop; int dev; /* file descriptor of the device */ #define DOT 1 #define DOTDOT 2 /* Counters for each type of inode/zone. */ int nfreeinode, nregular, ndirectory, nblkspec, ncharspec, nbadinode; int npipe, nsyml, ztype[NLEVEL]; long nfreezone; int repair, automatic, listing, listsuper; /* flags */ int firstlist; /* has the listing header been printed? */ unsigned part_offset; /* sector offset for this partition */ char answer[] = "Answer questions with y or n. Then hit RETURN"; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void initvars, (void)); _PROTOTYPE(void fatal, (char *s)); _PROTOTYPE(int eoln, (int c)); _PROTOTYPE(int yes, (char *question)); _PROTOTYPE(int atoo, (char *s)); _PROTOTYPE(int input, (char *buf, int size)); _PROTOTYPE(char *alloc, (unsigned nelem, unsigned elsize)); _PROTOTYPE(void printname, (char *s)); _PROTOTYPE(void printrec, (struct stack *sp)); _PROTOTYPE(void printpath, (int mode, int nlcr)); _PROTOTYPE(void devopen, (void)); _PROTOTYPE(void devclose, (void)); _PROTOTYPE(void devio, (block_nr bno, int dir)); _PROTOTYPE(void devread, (long offset, char *buf, int size)); _PROTOTYPE(void devwrite, (long offset, char *buf, int size)); _PROTOTYPE(void pr, (char *fmt, int cnt, char *s, char *p)); _PROTOTYPE(void lpr, (char *fmt, long cnt, char *s, char *p)); _PROTOTYPE(bit_nr getnumber, (char *s)); _PROTOTYPE(char **getlist, (char ***argv, char *type)); _PROTOTYPE(void lsuper, (void)); _PROTOTYPE(void getsuper, (void)); _PROTOTYPE(void chksuper, (void)); _PROTOTYPE(void lsi, (char **clist)); _PROTOTYPE(bitchunk_t *allocbitmap, (int nblk)); _PROTOTYPE(void loadbitmap, (bitchunk_t *bitmap, block_nr bno, int nblk)); _PROTOTYPE(void dumpbitmap, (bitchunk_t *bitmap, block_nr bno, int nblk)); _PROTOTYPE(void fillbitmap, (bitchunk_t *bitmap, bit_nr lwb, bit_nr upb, char **list)); _PROTOTYPE(void freebitmap, (bitchunk_t *p)); _PROTOTYPE(void getbitmaps, (void)); _PROTOTYPE(void putbitmaps, (void)); _PROTOTYPE(void chkword, (unsigned w1, unsigned w2, bit_nr bit, char *type, int *n, int *report)); _PROTOTYPE(void chkmap, (bitchunk_t *cmap, bitchunk_t *dmap, bit_nr bit, block_nr blkno, int nblk, char *type)); _PROTOTYPE(void chkilist, (void)); _PROTOTYPE(void getcount, (void)); _PROTOTYPE(void counterror, (Ino_t ino)); _PROTOTYPE(void chkcount, (void)); _PROTOTYPE(void freecount, (void)); _PROTOTYPE(void printperm, (Mode_t mode, int shift, int special, int overlay)); _PROTOTYPE(void list, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int Remove, (dir_struct *dp)); _PROTOTYPE(void make_printable_name, (char *dst, char *src, int n)); _PROTOTYPE(int chkdots, (Ino_t ino, off_t pos, dir_struct *dp, Ino_t exp)); _PROTOTYPE(int chkname, (Ino_t ino, dir_struct *dp)); _PROTOTYPE(int chkentry, (Ino_t ino, off_t pos, dir_struct *dp)); _PROTOTYPE(int chkdirzone, (Ino_t ino, d_inode *ip, off_t pos, zone_nr zno)); _PROTOTYPE(void errzone, (char *mess, zone_nr zno, int level, off_t pos)); _PROTOTYPE(int markzone, (zone_nr zno, int level, off_t pos)); _PROTOTYPE(int chkindzone, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr zno, int level)); _PROTOTYPE(off_t jump, (int level)); _PROTOTYPE(int zonechk, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr zno, int level)); _PROTOTYPE(int chkzones, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr *zlistN��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N��N����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������, int len, int level)); _PROTOTYPE(int chkfile, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkdirectory, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chklink, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkspecial, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkmode, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkinode, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int descendtree, (dir_struct *dp)); _PROTOTYPE(void chktree, (void)); _PROTOTYPE(void printtotal, (void)); _PROTOTYPE(void chkdev, (char *f, char **clist, char **ilist, char **zlist)); /* Initialize the variables used by this program. */ void initvars() { register level; nregular = ndirectory = nblkspec = ncharspec = nbadinode = npipe = nsyml = 0; for (level = 0; level < NLEVEL; level++) ztype[level] = 0; changed = 0; thisblk = NO_BLOCK; firstlist = 1; firstcnterr = 1; } /* Print the string `s' and exit. */ void fatal(s) char *s; { printf("%s\nfatal\n", s); exit(-1); } /* Test for end of line. */ int eoln(c) int c; { return(c == EOF || c == '\n' || c == '\r'); } /* Ask a question and get the answer unless automatic is set. */ int yes(question) char *question; { register int c, answerchar; if (!repair) { printf("\n"); return(0); } printf("%s? ", question); if (automatic) { printf("yes\n"); return(1); } fflush(stdout); if ((c = answerchar = getchar()) == 'q' || c == 'Q') exit(1); while (!eoln(c)) c = getchar(); return !(answerchar == 'n' || answerchar == 'N'); } /* Convert string to integer. Representation is octal. */ int atoo(s) register char *s; { register int n = 0; while ('0' <= *s && *s < '8') { n <<= 3; n += *s++ - '0'; } return n; } /* If repairing the file system, print a prompt and get a string from user. */ int input(buf, size) char *buf; int size; { register char *p = buf; printf("\n"); if (repair) { printf("--> "); fflush(stdout); while (--size) { *p = getchar(); if (eoln(*p)) { *p = 0; return(p > buf); } p++; } *p = 0; while (!eoln(getchar())); return(1); } return(0); } /* Allocate some memory and zero it. */ char *alloc(nelem, elsize) unsigned nelem, elsize; { char *p; if ((p = (char *)malloc((size_t)nelem * elsize)) == 0)fatal("out of memory"); memset((void *) p, 0, (size_t)nelem * elsize); return(p); } /* Print the name in a directory entry. */ void printname(s) char *s; { register n = NAME_MAX; int c; do { if ((c = *s) == 0) break; if (!isprint(c)) c = '?'; putchar(c); s++; } while (--n); } /* Print the pathname given by a linked list pointed to by `sp'. The * names are in reverse order. */ void printrec(sp) struct stack *sp; { if (sp->st_next != 0) { printrec(sp->st_next); putchar('/'); printname(sp->st_dir->d_name); } } /* Print the current pathname. */ void printpath(mode, nlcr) int mode; int nlcr; { if (ftop->st_next == 0) putchar('/'); else printrec(ftop); switch (mode) { case 1: printf(" (ino = %u, ", ftop->st_dir->d_inum); break; case 2: printf(" (ino = %u)", ftop->st_dir->d_inum); break; } if (nlcr) printf("\n"); } /* Open the device. */ void devopen() { if ((dev = open(device, repair ? O_RDWR : O_RDONLY)) < 0) { perror(device); fatal(""); } } /* Close the device. */ void devclose() { if (close(dev) != 0) { perror("close"); fatal(""); } } /* Read or write a block. */ void devio(bno, dir) block_nr bno; int dir; { if (dir == READING && bno == thisblk) return; thisblk = bno; #if 0 printf("%s at block %5d\n", dir == READING ? "reading " : "writing", bno); #endif lseek(dev, (off_t) btoa(bno), SEEK_SET); if (dir == READING) { if (read(dev, rwbuf, BLOCK_SIZE) == BLOCK_SIZE) return; } else { if (write(dev, rwbuf, BLOCK_SIZE) == BLOCK_SIZE) return; } printf("%s: can't %s block %ld (error = 0x%x)\n", prog, dir == READING ? "read" : "write", (long) bno, errno); if (dir == READING) { printf("Continuing with a zero-filled block.\n"); memset(rwbuf, 0, BLOCK_SIZE); return; } fatal(""); } /* Read `size' bytes from the disk starting at byte `offset'. */ void devread(offset, buf, size) long offset; char *buf; int size; { devio((block_nr) (offset / BLOCK_SIZE), READING); memmove(buf, &rwbuf[(int) (offset % BLOCK_SIZE)], (size_t)size); /* lint but OK */ } /* Write `size' bytes to the disk starting at byte `offset'. */ void devwrite(offset, buf, size) long offset; char *buf; int size; { if (!repair) fatal("internal error (devwrite)"); if (size != BLOCK_SIZE) devio((block_nr) (offset / BLOCK_SIZE), READING); memmove(&rwbuf[(int) (offset % BLOCK_SIZE)], buf, (size_t)size); /* lint but OK */ devio((block_nr) (offset / BLOCK_SIZE), WRITING); changed = 1; } /* Print a string with either a singular or a plural pronoun. */ void pr(fmt, cnt, s, p) char *fmt, *s, *p; int cnt; { printf(fmt, cnt, cnt == 1 ? s : p); } /* Same as above, but with a long argument */ void lpr(fmt, cnt, s, p) char *fmt, *s, *p; long cnt; { printf(fmt, cnt, cnt == 1 ? s : p); } /* Convert string to number. */ bit_nr getnumber(s) register char *s; { register bit_nr n = 0; if (s == NULL) return NO_BIT; while (isdigit(*s)) n = (n << 1) + (n << 3) + *s++ - '0'; return (*s == '\0') ? n : NO_BIT; } /* See if the list pointed to by `argv' contains numbers. */ char **getlist(argv, type) char ***argv, *type; { register char **list = *argv; register empty = 1; while (getnumber(**argv) != NO_BIT) { (*argv)++; empty = 0; } if (empty) { printf("warning: no %s numbers given\n", type); return(NULL); } return(list); } /* Make a listing of the super block. If `repair' is set, ask the user * for changes. */ void lsuper() { char buf[80]; do { /* Most of the following atol's enrage lint, for good reason. */ printf("ninodes = %u", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); printf("nzones = %ld", sb.s_zones); if (input(buf, 80)) sb.s_zones = atol(buf); printf("imap_blocks = %u", sb.s_imap_blocks); if (input(buf, 80)) sb.s_imap_blocks = atol(buf); printf("zmap_blocks = %u", sb.s_zmap_blocks); if (input(buf, 80)) sb.s_zmap_blocks = atol(buf); printf("firstdatazone = %u", sb.s_firstdatazone); if (input(buf, 80)) sb.s_firstdatazone = atol(buf); printf("log_zone_size = %u", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); printf("maxsize = %ld", sb.s_max_size); if (input(buf, 80)) sb.s_max_size = atol(buf); if (yes("ok now")) { devwrite(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); return; } } while (yes("Do you want to try again")); if (repair) exit(0); } /* Get the super block from either disk or user. Do some initial checks. */ void getsuper() { devread(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); if (listsuper) lsuper(); if (sb.s_magic == SUPER_MAGIC) fatal("Cannot handle V1 file systems"); if (sb.s_magic != SUPER_V2) fatal("bad magic number in super block"); if (sb.s_ninodes <= 0) fatal("no inodes"); if (sb.s_zones <= 0) fatal("no zones"); if (sb.s_imap_blocks <= 0) fatal("no imap"); if (sb.s_zmap_blocks <= 0) fatal("no zmap"); if (sb.s_firstdatazone <= 4) fatal("first data zone too small"); if (sb.s_log_zone_size < 0) fatal("zone size < block size"); if (sb.s_max_size <= 0) fatal("max. file size <= 0"); } /* Check the super block for reasonable contents. */ void chksuper() { register n; register off_t maxsize; n = bitmapsize((bit_t) sb.s_ninodes + 1); if (sb.s_magic != SUPER_V2) fatal("bad magic number in super block"); if (sb.s_imap_blocks < n) fatal("too few imap blocks"); if (sb.s_imap_blocks != n) { pr("warning: expected %d imap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_imap_blocks); } n = bitmapsize((bit_t) sb.s_zones); if (sb.s_zmap_blocks < n) fatal("too few zmap blocks"); if (sb.s_zmap_blocks != n) { pr("warning: expected %d zmap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_zmap_blocks); } if (sb.s_firstdatazone >= sb.s_zones) fatal("first data zone too large"); if (sb.s_log_zone_size >= 8 * sizeof(block_nr)) fatal("log_zone_size too large"); if (sb.s_log_zone_size > 8) printf("warning: large log_zone_size (%d)\n", sb.s_log_zone_size); n = (BLK_ILIST + N_ILIST + SCALE - 1) >> sb.s_log_zone_size; if (sb.s_firstdatazone < n) fatal("first data zone too small"); if (sb.s_firstdatazone != n) { printf("warning: expected first data zone to be %d ", n); printf("instead of %u\n", sb.s_firstdatazone); } maxsize = MAX_FILE_POS; if (((maxsize - 1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) maxsize = ((long) MAX_ZONES * BLOCK_SIZE) << sb.s_log_zone_size; if (sb.s_max_size != maxsize) { printf("warning: expected max size to be %ld ", maxsize); printf("instead of %ld\n", sb.s_max_size); } } /* Make a listing of the inodes given by `clist'. If `repair' is set, ask * the user for changes. */ void lsi(clist) char **clist; { register bit_nr bit; register ino_t ino; d_inode inode, *ip = &inode; char buf[80]; if (clist == 0) return; while ((bit = getnumber(*clist++)) != NO_BIT) { setbit(spec_imap, bit); ino = bit; do { devread(inoaddr(ino), (char *) ip, INODE_SIZE); printf("inode %u:\n", ino); printf(" mode = %6o", ip->i_mode); if (input(buf, 80)) ip->i_mode = atoo(buf); printf(" nlinks = %6u", ip->i_nlinks); if (input(buf, 80)) ip->i_nlinks = atol(buf); printf(" size = %6ld", ip->i_size); if (input(buf, 80)) ip->i_size = atol(buf); if (yes("Write this back")) { devwrite(inoaddr(ino), (char *) ip, INODE_SIZE); break; } } while (yes("Do you want to change it again")); } } /* Allocate `nblk' blocks worth of bitmap. */ bitchunk_t *allocbitmap(nblk) int nblk; { register bitchunk_t *bitmap; bitmap = (bitchunk_t *) alloc((unsigned) nblk, BLOCK_SIZE); *bitmap |= 1; return(bitmap); } /* Load the bitmap starting at block `bno' from disk. */ void loadbitmap(bitmap, bno, nblk) bitchunk_t *bitmap; block_nr bno; int nblk; { register i; register bitchunk_t *p; p = bitmap; for (i = 0; i < nblk; i++, bno++, p += WORDS_PER_BLOCK) devread(btoa(bno), (char *) p, BLOCK_SIZE); *bitmap |= 1; } /* Write the bitmap starting at block `bno' to disk. */ void dumpbitmap(bitmap, bno, nblk) bitchunk_t *bitmap; block_nr bno; int nblk; { register i; register bitchunk_t *p = bitmap; for (i = 0; i < nblk; i++, bno++, p += WORDS_PER_BLOCK) devwrite(btoa(bno), (char *) p, BLOCK_SIZE); } /* Set the bits given by `list' in the bitmap. */ void fillbitmap(bitmap, lwb, upb, list) bitchunk_t *bitmap; bit_nr lwb, upb; char **list; { register bit_nr bit; if (list == 0) return; while ((bit = getnumber(*list++)) != NO_BIT) if (bit < lwb || bit >= upb) { if (bitmap == spec_imap) printf("inode number %ld ", bit); else printf("zone number %ld ", bit); printf("out of range (ignored)\n"); } else setbit(bitmap, bit - lwb + 1); } /* Deallocate the bitmap `p'. */ void freebitmap(p) bitchunk_t *p; { free((char *) p); } /* Get all the bitmaps used by this program. */ void getbitmaps() { imap = allocbitmap(N_IMAP); zmap = allocbitmap(N_ZMAP); spec_imap = allocbitmap(N_IMAP); spec_zmap = allocbitmap(N_ZMAP); dirmap = allocbitmap(N_IMAP); } /* Release all the space taken by the bitmaps. */ void putbitmaps() { freebitmap(imap); freebitmap(zmap); freebitmap(spec_imap); freebitmap(spec_zmap); freebitmap(dirmap); } /* `w1' and `w2' are differing words from two bitmaps that should be * identical. Print what's the matter with them. */ void chkword(w1, w2, bit, type, n, report) unsigned w1, w2; char *type; bit_nr bit; int *n, *report; { for (; (w1 | w2); w1 >>= 1, w2 >>= 1, bit++) if ((w1 ^ w2) & 1 && ++(*n) % MAXPRINT == 0 && *report && (!repair || automatic || yes("stop this listing"))) *report = 0; else if (*report) if ((w1 & 1) && !(w2 & 1)) printf("%s %ld is missing\n", type, bit); else if (!(w1 & 1) && (w2 & 1)) printf("%s %ld is not free\n", type, bit); } /* Check if the given (correct) bitmap is identical with the one that is * on the disk. If not, ask if the disk should be repaired. */ void chkmap(cmap, dmap, bit, blkno, nblk, type) bitchunk_t *cmap, *dmap; bit_nr bit; block_nr blkno; int nblk; char *type; { register bitchunk_t *p = dmap, *q = cmap; int report = 1, nerr = 0; int w = nblk * WORDS_PER_BLOCK; printf("Checking %s map\n", type); loadbitmap(dmap, blkno, nblk); do { if (*p != *q) chkword(*p, *q, bit, type, &nerr, &report); p++; q++; bit += 8 * sizeof(bitchunk_t); } while (--w > 0); if ((!repair || automatic) && !report) printf("etc. "); if (nerr > MAXPRINT || nerr > 10) printf("%d errors found. ", nerr); if (nerr != 0 && yes("install a new map")) dumpbitmap(cmap, blkno, nblk); if (nerr > 0) printf("\n"); } /* See if the inodes that aren't allocated are cleared. */ void chkilist() { register ino_t ino = 1; mode_t mode; printf("Checking inode list\n"); do if (!bitset(imap, (bit_nr) ino)) { devread(inoaddr(ino), (char *) &mode, sizeof(mode)); if (mode != I_NOT_ALLOC) { printf("mode inode %u not cleared", ino); if (yes(". clear")) devwrite(inoaddr(ino), nullbuf, INODE_SIZE); } } while (++ino <= sb.s_ninodes && ino != 0); printf("\n"); } /* Allocate an array to maintain the inode reference counts in. */ void getcount() { count = (nlink_t *) alloc((unsigned) (sb.s_ninodes + 1), sizeof(nlink_t)); } /* The reference count for inode `ino' is wrong. Ask if it should be adjusted. */ void counterror(ino) ino_t ino; { d_inode inode; if (firstcnterr) { printf("INODE NLINK COUNT\n"); firstcnterr = 0; } devread(inoaddr(ino), (char *) &inode, INODE_SIZE); count[ino] += inode.i_nlinks; /* it was already subtracted; add it back */ printf("%5u %5u %5u", ino, (unsigned) inode.i_nlinks, count[ino]); if (yes(" adjust")) { if ((inode.i_nlinks = count[ino]) == 0) { fatal("internal error (counterror)"); inode.i_mode = I_NOT_ALLOC; clrbit(imap, (bit_nr) ino); } devwrite(inoaddr(ino), (char *) &inode, INODE_SIZE); } } /* Check if the reference count of the inodes are correct. The array `count' * is maintained as follows: an entry indexed by the inode number is * incremented each time a link is found; when the inode is read the link * count in there is substracted from the corresponding entry in `count'. * Thus, when the whole file system has been traversed, all the entries * should be zero. */ void chkcount() { register ino_t ino; for (ino = 1; ino <= sb.s_ninodes && ino != 0; ino++) if (count[ino] != 0) counterror(ino); if (!firstcnterr) printf("\n"); } /* Deallocate the `count' array. */ void freecount() { free((char *) count); } /* Print the inode permission bits given by mode and shift. */ void printperm(mode, shift, special, overlay) mode_t mode; int shift; int special; int overlay; { if (mode >> shift & R_BIT) putchar('r'); else putchar('-'); if (mode >> shift & W_BIT) putchar('w'); else putchar('-'); if (mode & special) putchar(overlay); else if (mode >> shift & X_BIT) putchar('x'); else putchar('-'); } /* List the given inode. */ void list(ino, ip) ino_t ino; d_inode *ip; { if (firstlist) { firstlist = 0; printf(" inode permission link size name\n"); } printf("%6u ", ino); switch (ip->i_mode & I_TYPE) { case I_REGULAR: putchar('-'); break; case I_DIRECTORY: putchar('d'); break; case I_CHAR_SPECIAL: putchar('c'); break; case I_BLOCK_SPECIAL: putchar('b'); break; case I_NAMED_PIPE: putchar('p'); break; #ifdef I_SYMBOLIC_LINK case I_SYMBOLIC_LINK: putchar('l'); break; #endif default: putchar('?'); } printperm(ip->i_mode, 6, I_SET_UID_BIT, 's'); printperm(ip->i_mode, 3, I_SET_GID_BIT, 's'); printperm(ip->i_mode, 0, STICKY_BIT, 't'); printf(" %3u ", ip->i_nlinks); switch (ip->i_mode & I_TYPE) { case I_CHAR_SPECIAL: case I_BLOCK_SPECIAL: printf(" %2x,%2x ", (dev_t) ip->i_zone[0] >> MAJOR & 0xFF, (dev_t) ip->i_zone[0] >> MINOR & 0xFF); break; default: printf("%7ld ", ip->i_size); } printpath(0, 1); } /* Remove an entry from a directory if ok with the user. * Don't name the function remove() - that is owned by ANSI, and chaos results * when it is a macro. */ int Remove(dp) dir_struct *dp; { setbit(spec_imap, (bit_nr) dp->d_inum); if (yes(". remove entry")) { count[dp->d_inum]--; memset((void *) dp, 0, sizeof(dir_struct)); return(1); } return(0); } /* Convert string so that embedded control characters are printable. */ void make_printable_name(dst, src, n) register char *dst; register char *src; register int n; { register int c; while (--n >= 0 && (c = *src++) != '\0') { if (isprint(c) && c != '\\') *dst++ = c; else { *dst++ = '\\'; switch (c) { case '\\': *dst++ = '\\'; break; case '\b': *dst++ = 'b'; break; case '\f': *dst++ = 'f'; break; case '\n': *dst++ = 'n'; break; case '\r': *dst++ = 'r'; break; case '\t': *dst++ = 't'; break; default: *dst++ = '0' + ((c >> 6) & 03); *dst++ = '0' + ((c >> 3) & 07); *dst++ = '0' + (c & 07); } } } *dst = '\0'; } /* See if the `.' or `..' entry is as expected. */ int chkdots(ino, pos, dp, exp) ino_t ino, exp; off_t pos; dir_struct *dp; { char printable_name[4 * NAME_MAX + 1]; if (dp->d_inum != exp) { make_printable_name(printable_name, dp->d_name, sizeof(dp->d_name)); printf("bad %s in ", printable_name); printpath(1, 0); printf("%s is linked to %u ", printable_name, dp->d_inum); printf("instead of %u)", exp); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); if (yes(". repair")) { count[dp->d_inum]--; dp->d_inum = exp; count[exp]++; return(0); } } else if (pos != (dp->d_name[1] ? DIR_ENTRY_SIZE : 0)) { make_printable_name(printable_name, dp->d_name, sizeof(dp->d_name)); printf("warning: %s has offset %ld in ", printable_name, pos); printpath(1, 0); printf("%s is linked to %u)\n", printable_name, dp->d_inum); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); } return(1); } /* Check the name in a directory entry. */ int chkname(ino, dp) ino_t ino; dir_struct *dp; { register n = NAME_MAX + 1; register char *p = dp->d_name; if (*p == '\0') { printf("null name found in "); printpath(0, 0); setbit(spec_imap, (bit_nr) ino); if (Remove(dp)) return(0); } while (*p != '\0' && --n != 0) if (*p++ == '/') { printf("found a '/' in entry of directory "); printpath(1, 0); setbit(spec_imap, (bit_nr) ino); printf("entry = '"); printname(dp->d_name); printf("')"); if (Remove(dp)) return(0); break; } return(1); } /* Check a directory entry. Here the routine `descendtree' is called * recursively to check the file or directory pointed to by the entry. */ int chkentry(ino, pos, dp) ino_t ino; off_t pos; dir_struct *dp; { if (dp->d_inum < ROOT_INODE || dp->d_inum > sb.s_ninodes) { printf("bad inode found in directory "); printpath(1, 0); printf("ino found = %u, ", dp->d_inum); printf("name = '"); printname(dp->d_name); printf("')"); if (yes(". remove entry")) { memset((void *) dp, 0, sizeof(dir_struct)); return(0); } return(1); } if ((unsigned) count[dp->d_inum] == LINK_MAX) { printf("too many links to ino %u\n", dp->d_inum); printf("discovered at entry '"); printname(dp->d_name); printf("' in directory "); printpath(0, 1); if (Remove(dp)) return(0); } count[dp->d_inum]++; if (strcmp(dp->d_name, ".") == 0) { ftop->st_presence |= DOT; return(chkdots(ino, pos, dp, ino)); } if (strcmp(dp->d_name, "..") == 0) { ftop->st_presence |= DOTDOT; return(chkdots(ino, pos, dp, ino == ROOT_INODE ? ino : ftop->st_next->st_dir->d_inum)); } if (!chkname(ino, dp)) return(0); if (bitset(dirmap, (bit_nr) dp->d_inum)) { printf("link to directory discovered in "); printpath(1, 0); printf("name = '"); printname(dp->d_name); printf("', dir ino = %u)", dp->d_inum); return !Remove(dp); } return(descendtree(dp)); } /* Check a zone of a directory by checking all the entries in the zone. * The zone is split up into chunks to not allocate too much stack. */ int chkdirzone(ino, ip, pos, zno) ino_t ino; d_inode *ip; off_t pos; zone_nr zno; { dir_struct dirblk[CDIRECT]; register dir_struct *dp; register n = SCALE * (NR_DIR_ENTRIES / CDIRECT), dirty; register long offset = zaddr(zno); register off_t size = 0; do { devread(offset, (char *) dirblk, DIRCHUNK); dirty = 0; for (dp = dirblk; dp < &dirblk[CDIRECT]; dp++) { if (dp->d_inum != NO_ENTRY && !chkentry(ino, pos, dp)) dirty = 1; pos += DIR_ENTRY_SIZE; if (dp->d_inum != NO_ENTRY) size = pos; } if (dirty) devwrite(offset, (char *) dirblk, DIRCHUNK); offset += DIRCHUNK; } while (--n); if (size > ip->i_size) { printf("size not updated of directory "); printpath(2, 0); if (yes(". extend")) { setbit(spec_imap, (bit_nr) ino); ip->i_size = size; devwrite(inoaddr(ino), (char *) ip, INODE_SIZE); } } return(1); } /* There is something wrong with the given zone. Print some details. */ void errzone(mess, zno, level, pos) char *mess; zone_nr zno; int level; off_t pos; { printf("%s zone in ", mess); printpath(1, 0); printf("zno = %ld, type = ", zno); switch (level) { case 0: printf("DATA"); break; case 1: printf("SINGLE INDIRECT"); break; case 2: printf("DOUBLE INDIRECT"); break; default: printf("VERY INDIRECT"); } printf(", pos = %ld)\n", pos); } /* Found the given zone in the given inode. Check it, and if ok, mark it * in the zone bitmap. */ int markzone(zno, level, pos) zone_nr zno; int level; off_t pos; { register bit_nr bit = (bit_nr) zno - FIRST + 1; ztype[level]++; if (zno < FIRST || zno >= sb.s_zones) { errzone("out-of-range", zno, level, pos); return(0); } if (bitset(zmap, bit)) { setbit(spec_zmap, bit); errzone("duplicate", zno, level, pos); return(0); } nfreezone--; if (bitset(spec_zmap, bit)) errzone("found", zno, level, pos); setbit(zmap, bit); return(1); } /* Check an indirect zone by checking all of its entries. * The zone is split up into chunks to not allocate too much stack. */ int chkindzone(ino, ip, pos, zno, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr zno; int level; { zone_nr indirect[CINDIR]; register n = NR_INDIRECTS / CINDIR; register long offset = zaddr(zno); do { devread(offset, (char *) indirect, INDCHUNK); if (!chkzones(ino, ip, pos, indirect, CINDIR, level - 1)) return(0); offset += INDCHUNK; } while (--n && *pos < ip->i_size); return(1); } /* Return the size of a gap in the file, represented by a null zone number * at some level of indirection. */ off_t jump(level) int level; { off_t power = ZONE_SIZE; if (level != 0) do power *= NR_INDIRECTS; while (--level); return(power); } /* Check a zone, which may be either a normal data zone, a directory zone, * or an indirect zone. */ int zonechk(ino, ip, pos, zno, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr zno; int level; { if (level == 0) { if ((ip->i_mode & I_TYPE) == I_DIRECTORY && !chkdirzone(ino, ip, *pos, zno)) return(0); *pos += ZONE_SIZE; return(1); } else return chkindzone(ino, ip, pos, zno, level); } /* Check a list of zones given by `zlist'. */ int chkzones(ino, ip, pos, zlist, len, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr *zlist; int len; int level; { register ok = 1, i; /* The check on the position in the next loop is commented out, since FS * now requires valid zone numbers in each level that is necessary and FS * always deleted all the zones in the double indirect block. */ for (i = 0; i < len /* && *pos < ip->i_size */ ; i++) if (zlist[i] == NO_ZONE) *pos += jump(level); else if (!markzone(zlist[i], level, *pos)) { *pos += jump(level); ok = 0; } else if (!zonechk(ino, ip, pos, zlist[i], level)) ok = 0; return(ok); } /* Check a file or a directory. */ int chkfile(ino, ip) ino_t ino; d_inode *ip; { register ok, i, level; off_t pos = 0; ok = chkzones(ino, ip, &pos, &ip->i_zone[0], NR_DZONE_NUM, 0); for (i = NR_DZONE_NUM, level = 1; i < NR_ZONE_NUMS; i++, level++) ok &= chkzones(ino, ip, &pos, &ip->i_zone[i], 1, level); return(ok); } /* Check a directory by checking the contents. Check if . and .. are present. */ int chkdirectory(ino, ip) ino_t ino; d_inode *ip; { register ok; setbit(dirmap, (bit_nr) ino); ok = chkfile(ino, ip); if (!(ftop->st_presence & DOT)) { printf(". missing in "); printpath(2, 1); ok = 0; } if (!(ftop->st_presence & DOTDOT)) { printf(".. missing in "); printpath(2, 1); ok = 0; } return(ok); } #ifdef I_SYMBOLIC_LINK /* Check the validity of a symbolic link. */ int chklink(ino, ip) ino_t ino; d_inode *ip; { int ok; ok = chkfile(ino, ip); if (ip->i_size <= 0 || ip->i_size > BLOCK_SIZE) { if (ip->i_size == 0) printf("empty symbolic link "); else printf("symbolic link too large (size %ld) ", ip->i_size); printpath(2, 1); ok = 0; } return(ok); } #endif /* Check the validity of a special file. */ int chkspecial(ino, ip) ino_t ino; d_inode *ip; { int i, ok; ok = 1; if ((dev_t) ip->i_zone[0] == NO_DEV) { printf("illegal device number %ld for special file ", ip->i_zone[0]); printpath(2, 1); ok = 0; } /* FS will not use the remaining "zone numbers" but 1.6.11++ will panic if * they are nonzero, since this should not happen. */ for (i = 1; i < NR_ZONE_NUMS; i++) if (ip->i_zone[i] != NO_ZONE) { printf("nonzero zone number %ld for special file ", ip->i_zone[i]); printpath(2, 1); ok = 0; } return(ok); } /* Check the mode and contents of an inode. */ int chkmode(ino, ip) ino_t ino; d_inode *ip; { switch (ip->i_mode & I_TYPE) { case I_REGULAR: nregular++; return chkfile(ino, ip); case I_DIRECTORY: ndirectory++; return chkdirectory(ino, ip); case I_BLOCK_SPECIAL: nblkspec++; return chkspecial(ino, ip); case I_CHAR_SPECIAL: ncharspec++; return chkspecial(ino, ip); case I_NAMED_PIPE: npipe++; return chkfile(ino, ip); #ifdef I_SYMBOLIC_LINK case I_SYMBOLIC_LINK: nsyml++; return chklink(ino, ip); #endif default: nbadinode++; printf("bad mode of "); printpath(1, 0); printf("mode = %o)", ip->i_mode); return(0); } } /* Check an inode. */ int chkinode(ino, ip) ino_t ino; d_inode *ip; { if (ino == ROOT_INODE && (ip->i_mode & I_TYPE) != I_DIRECTORY) { printf("root inode is not a directory "); printf("(ino = %u, mode = %o)\n", ino, ip->i_mode); fatal(""); } if (ip->i_nlinks == 0) { printf("link count zero of "); printpath(2, 0); return(0); } nfreeinode--; setbit(imap, (bit_nr) ino); if ((unsigned) ip->i_nlinks > LINK_MAX) { printf("link count too big in "); printpath(1, 0); printf("cnt = %u)\n", (unsigned) ip->i_nlinks); count[ino] -= LINK_MAX; setbit(spec_imap, (bit_nr) ino); } else { count[ino] -= (unsigned) ip->i_nlinks; } return chkmode(ino, ip); } /* Check the directory entry pointed to by dp, by checking the inode. */ int descendtree(dp) dir_struct *dp; { d_inode inode; register ino_t ino = dp->d_inum; register visited; struct stack stk; stk.st_dir = dp; stk.st_next = ftop; ftop = &stk; if (bitset(spec_imap, (bit_nr) ino)) { printf("found inode %u: ", ino); printpath(0, 1); } visited = bitset(imap, (bit_nr) ino); if (!visited || listing) { devread(inoaddr(ino), (char *) &inode, INODE_SIZE); if (listing) list(ino, &inode); if (!visited && !chkinode(ino, &inode)) { setbit(spec_imap, (bit_nr) ino); if (yes("remove")) { count[ino] += inode.i_nlinks - 1; clrbit(imap, (bit_nr) ino); devwrite(inoaddr(ino), nullbuf, INODE_SIZE); memset((void *) dp, 0, sizeof(dir_struct)); ftop = ftop->st_next; return(0); } } } ftop = ftop->st_next; return(1); } /* Check the file system tree. */ void chktree() { dir_struct dir; nfreeinode = sb.s_ninodes; nfreezone = N_DATA; dir.d_inum = ROOT_INODE; dir.d_name[0] = 0; if (!descendtree(&dir)) fatal("bad root inode"); putchar('\n'); } /* Print the totals of all the objects found. */ void printtotal() { printf("blocksize = %5d ", BLOCK_SIZE); printf("zonesize = %5d\n", ZONE_SIZE); printf("\n"); pr("%6u Regular file%s\n", nregular, "", "s"); pr("%6u Director%s\n", ndirectory, "y", "ies"); pr("%6u Block special file%s\n", nblkspec, "", "s"); pr("%6u Character special file%s\n", ncharspec, "", "s"); if (nbadinode != 0) pr("%6u Bad inode%s\n", nbadinode, "", "s"); pr("%6u Free inode%s\n", nfreeinode, "", "s"); pr("%6u Named pipe%s\n", npipe, "", "s"); pr("%6u Symbolic link%s\n", nsyml, "", "s"); /* Don't print some fields. printf("\n"); pr("%6u Data zone%s\n", ztype[0], "", "s"); pr("%6u Single indirect zone%s\n", ztype[1], "", "s"); pr("%6u Double indirect zone%s\n", ztype[2], "", "s"); */ lpr("%6ld Free zone%s\n", nfreezone, "", "s"); } /* Check the device which name is given by `f'. The inodes listed by `clist' * should be listed separately, and the inodes listed by `ilist' and the zones * listed by `zlist' should be watched for while checking the file system. */ void chkdev(f, clist, ilist, zlist) char *f, **clist, **ilist, **zlist; { if (automatic) repair = 1; device = f; initvars(); devopen(); getsuper(); chksuper(); lsi(clist); getbitmaps(); fillbitmap(spec_imap, (bit_nr) 1, (bit_nr) sb.s_ninodes + 1, ilist); fillbitmap(spec_zmap, (bit_nr) FIRST, (bit_nr) sb.s_zones, zlist); getcount(); chktree(); chkmap(zmap, spec_zmap, (bit_nr) FIRST - 1, BLK_ZMAP, N_ZMAP, "zone"); chkcount(); chkmap(imap, spec_imap, (bit_nr) 0, BLK_IMAP, N_IMAP, "inode"); chkilist(); printtotal(); putbitmaps(); freecount(); devclose(); if (changed) printf("----- FILE SYSTEM HAS BEEN MODIFIED -----\n\n"); } int main(argc, argv) int argc; char **argv; { register char **clist = 0, **ilist = 0, **zlist = 0; register devgiven = 0; register char *arg; if ((1 << BITSHIFT) != 8 * sizeof(bitchunk_t)) { printf("Fsck was compiled with the wrong BITSHIFT!\n"); exit(1); } sync(); prog = *argv++; while ((arg = *argv++) != 0) if (arg[0] == '-' && arg[1] != 0 && arg[2] == 0) switch (arg[1]) { case 'a': automatic ^= 1; break; case 'c': clist = getlist(&argv, "inode"); break; case 'i': ilist = getlist(&argv, "inode"); break; case 'z': zlist = getlist(&argv, "zone"); break; case 'r': repair ^= 1; break; case 'l': listing ^= 1; break; case 's': listsuper ^= 1; break; default: printf("%s: unknown flag '%s'\n", prog, arg); } else { chkdev(arg, clist, ilist, zlist); clist = 0; ilist = 0; zlist = 0; devgiven = 1; } if (!devgiven) { printf("Usage: fsck [-acilrsz] file\n"); exit(1); } return(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Hacks for version 1.6 */ #define INODES_PER_BLOCK V1_INODES_PER_BLOCK #define INODE_SIZE V1_INODE_SIZE #define WORDS_PER_BLOCK (BLOCK_SIZE / (int) sizeof(bitchunk_t)) #define MAX_ZONES (V1_NR_DZONES+V1_INDIRECTS+(long)V1_INDIRECTS*V1_INDIRECTS) #define NR_DZONE_NUM V1_NR_DZONES #define NR_INDIRECTS V1_INDIRECTS #define NR_ZONE_NUMS V1_NR_TZONES #define ZONE_NUM_SIZE V1_ZONE_NUM_SIZE #define bit_nr u16_t /* perhaps bit_t should be used, although slower */ #define Bit_nr U16_t #define block_nr block_t #define d_inode d1_inode #define d_inum d_ino #define dir_struct struct direct #define i_mode d1_mode #define i_nlinks d1_nlinks #define i_size d1_size #define i_zone d1_zone #define zone_nr zone1_t #define Zone_nr Zone1_t /* fsck - file system checker Author: Robbert van Renesse */ /* Modified by Norbert Schlenker * Removed vestiges of standalone/DOS versions: * - various unused variables and buffers removed * - now uses library functions rather than private internal routines * - bytewise structure copies replaced by structure assignment * - fixed one bug with 14 character file names * - other small tweaks for speed * * Modified by Lars Fredriksen at the request of Andy Tanenbaum, 90-03-10. * Removed -m option, by which fsck could be told to make a file * system on a 360K floppy. The code had limited utility, was buggy, * and failed due to a bug in the ACK C compiler. Use mkfs instead! */ #include <sys/types.h> #include <sys/dir.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include "../../fs/const.h" #include "../../fs/inode.h" #include "../../fs/type.h" #include <minix/fslib.h> #include <stdio.h> #define BITSHIFT 4 /* = log2(#bits(int)) */ #define MAXPRINT 8 /* max. number of error lines in chkmap */ #define CINDIR 128 /* number of indirect zno's read at a time */ #define CDIRECT 16 /* number of dir entries read at a time */ #define BITMASK ((1 << BITSHIFT) - 1) #define setbit(w, b) (w[(b) >> BITSHIFT] |= 1 << ((b) & BITMASK)) #define clrbit(w, b) (w[(b) >> BITSHIFT] &= ~(1 << ((b) & BITMASK))) #define bitset(w, b) (w[(b) >> BITSHIFT] & (1 << ((b) & BITMASK))) #define ZONE_CT 360 /* default zones (when making file system) */ #define INODE_CT 95 /* default inodes (when making file system) */ #include "../../fs/super.h" struct super_block sb; #define STICKY_BIT 01000 /* not defined anywhere else */ /* Ztob gives the block address of a zone * btoa gives the byte address of a block */ #define ztob(z) ((block_nr) (z) << sb.s_log_zone_size) #define btoa(b) ((long) (b) * BLOCK_SIZE) #define SCALE ((int) ztob(1)) /* # blocks in a zone */ #define FIRST ((zone_nr) sb.s_firstdatazone) /* as the name says */ /* # blocks of each type */ #define N_SUPER 1 #define N_IMAP (sb.s_imap_blocks) #define N_ZMAP (sb.s_zmap_blocks) #define N_ILIST ((sb.s_ninodes+INODES_PER_BLOCK-1) / INODES_PER_BLOCK) #define N_DATA (sb.s_nzones - FIRST) /* Block address of each type */ #define BLK_SUPER (SUPER_BLOCK) #define BLK_IMAP (BLK_SUPER + N_SUPER) #define BLK_ZMAP (BLK_IMAP + N_IMAP) #define BLK_ILIST (BLK_ZMAP + N_ZMAP) #define BLK_FIRST ztob(FIRST) #define ZONE_SIZE ((int) ztob(BLOCK_SIZE)) #define NLEVEL (NR_ZONE_NUMS - NR_DZONE_NUM + 1) /* Byte address of a zone/of an inode */ #define zaddr(z) btoa(ztob(z)) #define inoaddr(i) ((long) (i - 1) * INODE_SIZE + btoa(BLK_ILIST)) #define INDCHUNK (CINDIR * ZONE_NUM_SIZE) #define DIRCHUNK (CDIRECT * DIR_ENTRY_SIZE) char *prog, *device; /* program name (fsck), device name */ int firstcnterr; /* is this the first inode ref cnt error? */ bitchunk_t *imap, *spec_imap; /* inode bit maps */ bitchunk_t *zmap, *spec_zmap; /* zone bit maps */ bitchunk_t *dirmap; /* directory (inode) bit map */ char rwbuf[BLOCK_SIZE]; /* one block buffer cache */ block_nr thisblk; /* block in buffer cache */ char nullbuf[BLOCK_SIZE]; /* null buffer */ nlink_t *count; /* inode count */ int changed; /* has the diskette been written to? */ struct stack { dir_struct *st_dir; struct stack *st_next; char st_presence; } *ftop; int dev; /* file descriptor of the device */ #define DOT 1 #define DOTDOT 2 /* Counters for each type of inode/zone. */ int nfreeinode, nregular, ndirectory, nblkspec, ncharspec, nbadinode; int npipe, nsyml, nfreezone, ztype[NLEVEL]; int repair, automatic, listing, listsuper; /* flags */ int firstlist; /* has the listing header been printed? */ unsigned part_offset; /* sector offset for this partition */ char answer[] = "Answer questions with y or n. Then hit RETURN"; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void initvars, (void)); _PROTOTYPE(void fatal, (char *s)); _PROTOTYPE(int eoln, (int c)); _PROTOTYPE(int yes, (char *question)); _PROTOTYPE(int atoo, (char *s)); _PROTOTYPE(int input, (char *buf, int size)); _PROTOTYPE(char *alloc, (unsigned nelem, unsigned elsize)); _PROTOTYPE(void printname, (char *s)); _PROTOTYPE(void printrec, (struct stack *sp)); _PROTOTYPE(void printpath, (int mode, int nlcr)); _PROTOTYPE(void devopen, (void)); _PROTOTYPE(void devclose, (void)); _PROTOTYPE(void devio, (block_nr bno, int dir)); _PROTOTYPE(void devread, (long offset, char *buf, int size)); _PROTOTYPE(void devwrite, (long offset, char *buf, int size)); _PROTOTYPE(void pr, (char *fmt, int cnt, char *s, char *p)); _PROTOTYPE(bit_nr getnumber, (char *s)); _PROTOTYPE(char **getlist, (char ***argv, char *type)); _PROTOTYPE(void lsuper, (void)); _PROTOTYPE(void getsuper, (void)); _PROTOTYPE(void chksuper, (void)); _PROTOTYPE(void lsi, (char **clist)); _PROTOTYPE(bitchunk_t *allocbitmap, (int nblk)); _PROTOTYPE(void loadbitmap, (bitchunk_t *bitmap, block_nr bno, int nblk)); _PROTOTYPE(void dumpbitmap, (bitchunk_t *bitmap, block_nr bno, int nblk)); _PROTOTYPE(void fillbitmap, (bitchunk_t *bitmap, Bit_nr lwb, Bit_nr upb, char **list)); _PROTOTYPE(void freebitmap, (bitchunk_t *p)); _PROTOTYPE(void getbitmaps, (void)); _PROTOTYPE(void putbitmaps, (void)); _PROTOTYPE(void chkword, (unsigned w1, unsigned w2, Bit_nr bit, char *type, int *n, int *report)); _PROTOTYPE(void chkmap, (bitchunk_t *cmap, bitchunk_t *dmap, Bit_nr bit, block_nr blkno, int nblk, char *type)); _PROTOTYPE(void chkilist, (void)); _PROTOTYPE(void getcount, (void)); _PROTOTYPE(void counterror, (Ino_t ino)); _PROTOTYPE(void chkcount, (void)); _PROTOTYPE(void freecount, (void)); _PROTOTYPE(void printperm, (Mode_t mode, int shift, int special, int overlay)); _PROTOTYPE(void list, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int Remove, (dir_struct *dp)); _PROTOTYPE(void make_printable_name, (char *dst, char *src, int n)); _PROTOTYPE(int chkdots, (Ino_t ino, off_t pos, dir_struct *dp, Ino_t exp)); _PROTOTYPE(int chkname, (Ino_t ino, dir_struct *dp)); _PROTOTYPE(int chkentry, (Ino_t ino, off_t pos, dir_struct *dp)); _PROTOTYPE(int chkdirzone, (Ino_t ino, d_inode *ip, off_t pos, Zone_nr zno)); _PROTOTYPE(void errzone, (char *mess, Zone_nr zno, int level, off_t pos)); _PROTOTYPE(int markzone, (Ino_t ino, Zone_nr zno, int level, off_t pos)); _PROTOTYPE(int chkindzone, (Ino_t ino, d_inode *ip, off_t *pos, Zone_nr zno, int level)); _PROTOTYPE(off_t jump, (int level)); _PROTOTYPE(int zonechk, (Ino_t ino, d_inode *ip, off_t *pos, Zone_nr zno, int level)); _PROTOTYPE(int chkzones, (Ino_t ino, d_inode *ip, off_t *pos, zone_nr *zlist, int len, int level)); _PROTOTYPE(int chkfile, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkdirectory, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chklink, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkmode, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkinode, (Ino_t ino, d_inode *ip)); _PROTOTYPE(int chkspecial, (Ino_t ino, d_inode *ip) ); _PROTOTYPE(int descendtree, (dir_struct *dp)); _PROTOTYPE(void chktree, (void)); _PROTOTYPE(void printtotal, (void)); _PROTOTYPE(void chkdev, (char *f, char **clist, char **ilist, char **zlist)); /* Initialize the variables used by this program. */ void initvars() { register level; nregular = ndirectory = nblkspec = ncharspec = nbadinode = npipe = nsyml = 0; N��N��N��N���O��O��O��O��O��O��O��O��O�� O�� O�� O�� O�� O��O��O��O��O��O��O��O��O��O��O��O��O��O�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� for (level = 0; level < NLEVEL; level++) ztype[level] = 0; changed = 0; thisblk = NO_BLOCK; firstlist = 1; firstcnterr = 1; } /* Print the string `s' and exit. */ void fatal(s) char *s; { printf("%s\nfatal\n", s); exit(-1); } /* Test for end of line. */ int eoln(c) int c; { return(c == EOF || c == '\n' || c == '\r'); } /* Ask a question and get the answer unless automatic is set. */ int yes(question) char *question; { register c, answer; if (!repair) { printf("\n"); return(0); } printf("%s? ", question); if (automatic) { printf("yes\n"); return(1); } fflush(stdout); if ((c = answer = getchar()) == 'q' || c == 'Q') exit(1); while (!eoln(c)) c = getchar(); return !(answer == 'n' || answer == 'N'); } /* Convert string to integer. Representation is octal. */ int atoo(s) register char *s; { register int n = 0; while ('0' <= *s && *s < '8') { n <<= 3; n += *s++ - '0'; } return n; } /* If repairing the file system, print a prompt and get a string from user. */ int input(buf, size) char *buf; int size; { register char *p = buf; printf("\n"); if (repair) { printf("--> "); fflush(stdout); while (--size) { *p = getchar(); if (eoln(*p)) { *p = 0; return(p > buf); } p++; } *p = 0; while (!eoln(getchar())); return(1); } return(0); } /* Allocate some memory and zero it. */ char *alloc(nelem, elsize) unsigned nelem, elsize; { char *p; if ((p = (char *) malloc((size_t)nelem * elsize)) == 0) fatal("out of memory"); memset(p, 0, (size_t)nelem * elsize); return(p); } /* Print the name in a directory entry. */ void printname(s) char *s; { register n = NAME_MAX; int c; do { if ((c = *s) == 0) break; if (!isprint(c)) c = '?'; putchar(c); s++; } while (--n); } /* Print the pathname given by a linked list pointed to by `sp'. The * names are in reverse order. */ void printrec(sp) struct stack *sp; { if (sp->st_next != 0) { printrec(sp->st_next); putchar('/'); printname(sp->st_dir->d_name); } } /* Print the current pathname. */ void printpath(mode, nlcr) int mode; int nlcr; { if (ftop->st_next == 0) putchar('/'); else printrec(ftop); switch (mode) { case 1: printf(" (ino = %u, ", ftop->st_dir->d_inum); break; case 2: printf(" (ino = %u)", ftop->st_dir->d_inum); break; } if (nlcr) printf("\n"); } /* Open the device. */ void devopen() { if ((dev = open(device, repair ? O_RDWR : O_RDONLY)) < 0) { perror(device); fatal(""); } } /* Close the device. */ void devclose() { if (close(dev) != 0) { perror("close"); fatal(""); } } /* Read or write a block. */ void devio(bno, dir) block_nr bno; int dir; { if (dir == READING && bno == thisblk) return; thisblk = bno; lseek(dev, (off_t) btoa(bno), SEEK_SET); if (dir == READING) { if (read(dev, rwbuf, BLOCK_SIZE) == BLOCK_SIZE) return; } else { if (write(dev, rwbuf, BLOCK_SIZE) == BLOCK_SIZE) return; } printf("%s: can't %s block %ld (error = 0x%x)\n", prog, dir == READING ? "read" : "write", (long) bno, errno); if (dir == READING) { printf("Continuing with a zero-filled block.\n"); memset(rwbuf, 0, BLOCK_SIZE); return; } fatal(""); } /* Read `size' bytes from the disk starting at byte `offset'. */ void devread(offset, buf, size) long offset; char *buf; int size; { devio((block_nr) (offset / BLOCK_SIZE), READING); memmove(buf, &rwbuf[(int) (offset % BLOCK_SIZE)], (size_t)size); } /* Write `size' bytes to the disk starting at byte `offset'. */ void devwrite(offset, buf, size) long offset; char *buf; int size; { if (!repair) fatal("internal error (devwrite)"); if (size != BLOCK_SIZE) devio((block_nr) (offset / BLOCK_SIZE), READING); memmove(&rwbuf[(int) (offset % BLOCK_SIZE)], buf, (size_t)size); devio((block_nr) (offset / BLOCK_SIZE), WRITING); changed = 1; } /* Print a string with either a singular or a plural pronoun. */ void pr(fmt, cnt, s, p) char *fmt, *s, *p; int cnt; { printf(fmt, cnt, cnt == 1 ? s : p); } /* Convert string to number. */ bit_nr getnumber(s) register char *s; { register bit_nr n = 0; if (s == NULL) return NO_BIT; while (isdigit(*s)) n = (n << 1) + (n << 3) + *s++ - '0'; return (*s == '\0') ? n : NO_BIT; } /* See if the list pointed to by `argv' contains numbers. */ char **getlist(argv, type) char ***argv, *type; { register char **list = *argv; register empty = 1; while (getnumber(**argv) != NO_BIT) { (*argv)++; empty = 0; } if (empty) { printf("warning: no %s numbers given\n", type); return(NULL); } return(list); } /* Make a listing of the super block. If `repair' is set, ask the user * for changes. */ void lsuper() { char buf[80]; do { printf("ninodes = %u", sb.s_ninodes); if (input(buf, 80)) sb.s_ninodes = atol(buf); printf("nzones = %u", sb.s_nzones); if (input(buf, 80)) sb.s_nzones = atol(buf); printf("imap_blocks = %u", sb.s_imap_blocks); if (input(buf, 80)) sb.s_imap_blocks = atol(buf); printf("zmap_blocks = %u", sb.s_zmap_blocks); if (input(buf, 80)) sb.s_zmap_blocks = atol(buf); printf("firstdatazone = %u", sb.s_firstdatazone); if (input(buf, 80)) sb.s_firstdatazone = atol(buf); printf("log_zone_size = %u", sb.s_log_zone_size); if (input(buf, 80)) sb.s_log_zone_size = atol(buf); printf("maxsize = %lu", sb.s_max_size); if (input(buf, 80)) sb.s_max_size = atol(buf); if (yes("ok now")) { devwrite(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); return; } } while (yes("Do you want to try again")); if (repair) exit(0); } /* Get the super block from either disk or user. Do some initial checks. */ void getsuper() { devread(btoa(BLK_SUPER), (char *) &sb, sizeof(sb)); if (listsuper) lsuper(); if (sb.s_magic == SUPER_V2) fatal("Cannot handle V2 file systems"); if (sb.s_magic != SUPER_MAGIC) fatal("bad magic number in super block"); if ((short) sb.s_ninodes <= 0) fatal("no inodes"); if (sb.s_nzones <= 2) fatal("no zones"); if ((short) sb.s_imap_blocks <= 0) fatal("no imap"); if ((short) sb.s_zmap_blocks <= 0) fatal("no zmap"); if ((short) sb.s_firstdatazone <= 1) fatal("first data zone too small"); if ((short) sb.s_log_zone_size < 0) fatal("zone size < block size"); if (sb.s_max_size <= 0) fatal("max. file size <= 0"); } /* Check the super block for reasonable contents. */ void chksuper() { register n; register off_t maxsize; n = bitmapsize((bit_t) sb.s_ninodes + 1); if (sb.s_magic != SUPER_MAGIC) fatal("bad magic number in super block"); if ((short) sb.s_imap_blocks < n) fatal("too few imap blocks"); if (sb.s_imap_blocks != n) { pr("warning: expected %d imap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_imap_blocks); } n = bitmapsize((bit_t) sb.s_nzones); if ((short) sb.s_zmap_blocks < n) fatal("too few zmap blocks"); if (sb.s_zmap_blocks != n) { pr("warning: expected %d zmap_block%s", n, "", "s"); printf(" instead of %d\n", sb.s_zmap_blocks); } if (sb.s_firstdatazone >= sb.s_nzones) fatal("first data zone too large"); if ((unsigned short) sb.s_log_zone_size >= 8 * sizeof(block_nr)) fatal("log_zone_size too large"); if (sb.s_log_zone_size > 8) printf("warning: large log_zone_size (%d)\n", sb.s_log_zone_size); n = (BLK_ILIST + N_ILIST + SCALE - 1) >> sb.s_log_zone_size; if ((short) sb.s_firstdatazone < n) fatal("first data zone too small"); if (sb.s_firstdatazone != n) { printf("warning: expected first data zone to be %d ", n); printf("instead of %u\n", sb.s_firstdatazone); } maxsize = MAX_FILE_POS; if (((maxsize - 1) >> sb.s_log_zone_size) / BLOCK_SIZE >= MAX_ZONES) maxsize = ((long) MAX_ZONES * BLOCK_SIZE) << sb.s_log_zone_size; if (sb.s_max_size != maxsize) { printf("warning: expected max size to be %ld ", maxsize); printf("instead of %ld\n", sb.s_max_size); } } /* Make a listing of the inodes given by `clist'. If `repair' is set, ask * the user for changes. */ void lsi(clist) char **clist; { register bit_nr bit; register ino_t ino; d_inode inode, *ip = &inode; char buf[80]; if (clist == 0) return; while ((bit = getnumber(*clist++)) != NO_BIT) { setbit(spec_imap, bit); ino = bit; do { devread(inoaddr(ino), (char *) ip, INODE_SIZE); printf("inode %u:\n", ino); printf(" mode = %06o", ip->i_mode); if (input(buf, 80)) ip->i_mode = atoo(buf); printf(" nlinks = %6u", ip->i_nlinks); if (input(buf, 80)) ip->i_nlinks = atol(buf); printf(" size = %6ld", ip->i_size); if (input(buf, 80)) ip->i_size = atol(buf); if (yes("Write this back")) { devwrite(inoaddr(ino), (char *) ip, INODE_SIZE); break; } } while (yes("Do you want to change it again")); } } /* Allocate `nblk' blocks worth of bitmap. */ bitchunk_t *allocbitmap(nblk) int nblk; { register bitchunk_t *bitmap; bitmap = (bitchunk_t *) alloc(nblk, BLOCK_SIZE); *bitmap |= 1; return(bitmap); } /* Load the bitmap starting at block `bno' from disk. */ void loadbitmap(bitmap, bno, nblk) bitchunk_t *bitmap; block_nr bno; int nblk; { register i; register bitchunk_t *p; p = bitmap; for (i = 0; i < nblk; i++, bno++, p += WORDS_PER_BLOCK) devread(btoa(bno), (char *) p, BLOCK_SIZE); *bitmap |= 1; } /* Write the bitmap starting at block `bno' to disk. */ void dumpbitmap(bitmap, bno, nblk) bitchunk_t *bitmap; block_nr bno; int nblk; { register i; register bitchunk_t *p = bitmap; for (i = 0; i < nblk; i++, bno++, p += WORDS_PER_BLOCK) devwrite(btoa(bno), (char *) p, BLOCK_SIZE); } /* Set the bits given by `list' in the bitmap. */ void fillbitmap(bitmap, lwb, upb, list) bitchunk_t *bitmap; bit_nr lwb, upb; char **list; { register bit_nr bit; if (list == 0) return; while ((bit = getnumber(*list++)) != NO_BIT) if (bit < lwb || bit >= upb) { if (bitmap == spec_imap) printf("inode number %u ", bit); else printf("zone number %u ", bit); printf("out of range (ignored)\n"); } else setbit(bitmap, bit - lwb + 1); } /* Deallocate the bitmap `p'. */ void freebitmap(p) bitchunk_t *p; { free((char *) p); } /* Get all the bitmaps used by this program. */ void getbitmaps() { imap = allocbitmap(N_IMAP); zmap = allocbitmap(N_ZMAP); spec_imap = allocbitmap(N_IMAP); spec_zmap = allocbitmap(N_ZMAP); dirmap = allocbitmap(N_IMAP); } /* Release all the space taken by the bitmaps. */ void putbitmaps() { freebitmap(imap); freebitmap(zmap); freebitmap(spec_imap); freebitmap(spec_zmap); freebitmap(dirmap); } /* `w1' and `w2' are differing words from two bitmaps that should be * identical. Print what's the matter with them. */ void chkword(w1, w2, bit, type, n, report) unsigned w1, w2; char *type; bit_nr bit; int *n, *report; { for (; (w1 | w2); w1 >>= 1, w2 >>= 1, bit++) if ((w1 ^ w2) & 1 && ++(*n) % MAXPRINT == 0 && *report && (!repair || automatic || yes("stop this listing"))) *report = 0; else if (*report) if ((w1 & 1) && !(w2 & 1)) printf("%s %u is missing\n", type, bit); else if (!(w1 & 1) && (w2 & 1)) printf("%s %u is not free\n", type, bit); } /* Check if the given (correct) bitmap is identical with the one that is * on the disk. If not, ask if the disk should be repaired. */ void chkmap(cmap, dmap, bit, blkno, nblk, type) bitchunk_t *cmap, *dmap; bit_nr bit; block_nr blkno; int nblk; char *type; { register bitchunk_t *p = dmap, *q = cmap; int report = 1, nerr = 0; int w = nblk * WORDS_PER_BLOCK; printf("Checking %s map\n", type); loadbitmap(dmap, blkno, nblk); do { if (*p != *q) chkword(*p, *q, bit, type, &nerr, &report); p++; q++; bit += 8 * sizeof(bitchunk_t); } while (--w > 0); if ((!repair || automatic) && !report) printf("etc. "); if (nerr > MAXPRINT || nerr > 10) printf("%d errors found. ", nerr); if (nerr != 0 && yes("install a new map")) dumpbitmap(cmap, blkno, nblk); if (nerr > 0) printf("\n"); } /* See if the inodes that aren't allocated are cleared. */ void chkilist() { register ino_t ino = 1; mode_t mode; printf("Checking inode list\n"); do if (!bitset(imap, (bit_nr) ino)) { devread(inoaddr(ino), (char *) &mode, sizeof(mode)); if (mode != I_NOT_ALLOC) { printf("mode inode %u not cleared", ino); if (yes(". clear")) devwrite(inoaddr(ino), nullbuf, INODE_SIZE); } } while (++ino <= sb.s_ninodes); printf("\n"); } /* Allocate an array to maintain the inode reference counts in. */ void getcount() { count = (nlink_t *) alloc(sb.s_ninodes + 1, sizeof(nlink_t)); } /* The reference count for inode `ino' is wrong. Ask if it should be adjusted. */ void counterror(ino) ino_t ino; { d_inode inode; if (firstcnterr) { printf("INODE NLINK COUNT\n"); firstcnterr = 0; } devread(inoaddr(ino), (char *) &inode, INODE_SIZE); count[ino] += inode.i_nlinks; printf("%5u %5u %5u", ino, (unsigned) inode.i_nlinks, count[ino]); if (yes(" adjust")) { if ((inode.i_nlinks = count[ino]) == 0) { fatal("internal error (counterror)"); /* This would be a patch inode.i_mode = I_NOT_ALLOC; clrbit(imap, (bit_nr) ino); */ } devwrite(inoaddr(ino), (char *) &inode, INODE_SIZE); } } /* Check if the reference count of the inodes are correct. The array `count' * is maintained as follows: an entry indexed by the inode number is * incremented each time a link is found; when the inode is read the link * count in there is substracted from the corresponding entry in `count'. * Thus, when the whole file system has been traversed, all the entries * should be zero. */ void chkcount() { register ino_t ino; for (ino = 1; ino <= sb.s_ninodes; ino++) if (count[ino] != 0) counterror(ino); if (!firstcnterr) printf("\n"); } /* Deallocate the `count' array. */ void freecount() { free((char *) count); } /* Print the inode permission bits given by mode and shift. */ void printperm(mode, shift, special, overlay) mode_t mode; int shift; int special; int overlay; { if (mode >> shift & R_BIT) putchar('r'); else putchar('-'); if (mode >> shift & W_BIT) putchar('w'); else putchar('-'); if (mode & special) putchar(overlay); else if (mode >> shift & X_BIT) putchar('x'); else putchar('-'); } /* List the given inode. */ void list(ino, ip) ino_t ino; d_inode *ip; { if (firstlist) { firstlist = 0; printf(" inode permission link size name\n"); } printf("%6u ", ino); switch (ip->i_mode & I_TYPE) { case I_REGULAR: putchar('-'); break; case I_DIRECTORY: putchar('d'); break; case I_CHAR_SPECIAL: putchar('c'); break; case I_BLOCK_SPECIAL: putchar('b'); break; case I_NAMED_PIPE: putchar('p'); break; #ifdef I_SYMBOLIC_LINK case I_SYMBOLIC_LINK: putchar('l'); break; #endif default: putchar('?'); } printperm(ip->i_mode, 6, I_SET_UID_BIT, 's'); printperm(ip->i_mode, 3, I_SET_GID_BIT, 's'); printperm(ip->i_mode, 0, STICKY_BIT, 't'); printf(" %3u ", ip->i_nlinks); switch (ip->i_mode & I_TYPE) { case I_CHAR_SPECIAL: case I_BLOCK_SPECIAL: printf(" %2x,%2x ", (dev_t) ip->i_zone[0] >> MAJOR & 0xFF, (dev_t) ip->i_zone[0] >> MINOR & 0xFF); break; default: printf("%7ld ", ip->i_size); } printpath(0, 1); } /* Remove an entry from a directory if ok with the user. * Don't name the function remove() - that is owned by ANSI, and chaos results * when it is a macro. */ int Remove(dp) dir_struct *dp; { setbit(spec_imap, (bit_nr) dp->d_inum); if (yes(". remove entry")) { count[dp->d_inum]--; memset((void *) dp, 0, sizeof(dir_struct)); return(1); } return(0); } /* Convert string so that embedded control characters are printable. */ void make_printable_name(dst, src, n) register char *dst; register char *src; register int n; { register int c; while (--n >= 0 && (c = *src++) != '\0') { if (isprint(c) && c != '\\') *dst++ = c; else { *dst++ = '\\'; switch (c) { case '\\': *dst++ = '\\'; break; case '\b': *dst++ = 'b'; break; case '\f': *dst++ = 'f'; break; case '\n': *dst++ = 'n'; break; case '\r': *dst++ = 'r'; break; case '\t': *dst++ = 't'; break; default: *dst++ = '0' + ((c >> 6) & 03); *dst++ = '0' + ((c >> 3) & 07); *dst++ = '0' + (c & 07); } } } *dst = '\0'; } /* See if the `.' or `..' entry is as expected. */ int chkdots(ino, pos, dp, exp) ino_t ino, exp; off_t pos; dir_struct *dp; { char printable_name[4 * NAME_MAX + 1]; if (dp->d_inum != exp) { make_printable_name(printable_name, dp->d_name, sizeof(dp->d_name)); printf("bad %s in ", printable_name); printpath(1, 0); printf("%s is linked to %u ", printable_name, dp->d_inum); printf("instead of %u)", exp); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); if (yes(". repair")) { count[dp->d_inum]--; dp->d_inum = exp; count[exp]++; return(0); } } else if (pos != (dp->d_name[1] ? DIR_ENTRY_SIZE : 0)) { make_printable_name(printable_name, dp->d_name, sizeof(dp->d_name)); printf("warning: %s has offset %ld in ", printable_name, pos); printpath(1, 0); printf("%s is linked to %u)\n", printable_name, dp->d_inum); setbit(spec_imap, (bit_nr) ino); setbit(spec_imap, (bit_nr) dp->d_inum); setbit(spec_imap, (bit_nr) exp); } return(1); } /* Check the name in a directory entry. */ int chkname(ino, dp) ino_t ino; dir_struct *dp; { register n = NAME_MAX + 1; register char *p = dp->d_name; if (*p == '\0') { printf("null name found in "); printpath(0, 0); setbit(spec_imap, (bit_nr) ino); if (Remove(dp)) return(0); } while (*p != '\0' && --n != 0) if (*p++ == '/') { printf("found a '/' in entry of directory "); printpath(1, 0); setbit(spec_imap, (bit_nr) ino); printf("entry = '"); printname(dp->d_name); printf("')"); if (Remove(dp)) return(0); break; } return(1); } /* Check a directory entry. Here the routine `descendtree' is called * recursively to check the file or directory pointed to by the entry. */ int chkentry(ino, pos, dp) ino_t ino; off_t pos; dir_struct *dp; { if (dp->d_inum < ROOT_INODE || dp->d_inum > sb.s_ninodes) { printf("bad inode found in directory "); printpath(1, 0); printf("ino found = %u, ", dp->d_inum); printf("name = '"); printname(dp->d_name); printf("')"); if (yes(". remove entry")) { memset((void *) dp, 0, sizeof(dir_struct)); return(0); } return(1); } if ((unsigned) count[dp->d_inum] == LINK_MAX) { printf("too many links to ino %u\n", dp->d_inum); printf("discovered at entry '"); printname(dp->d_name); printf("' in directory "); printpath(0, 1); if (Remove(dp)) return(0); } count[dp->d_inum]++; if (strcmp(dp->d_name, ".") == 0) { ftop->st_presence |= DOT; return(chkdots(ino, pos, dp, ino)); } if (strcmp(dp->d_name, "..") == 0) { ftop->st_presence |= DOTDOT; return(chkdots(ino, pos, dp, ino == ROOT_INODE ? ino : ftop->st_next->st_dir->d_inum)); } if (!chkname(ino, dp)) return(0); if (bitset(dirmap, (bit_nr) dp->d_inum)) { printf("link to directory discovered in "); printpath(1, 0); printf("name = '"); printname(dp->d_name); printf("', dir ino = %u)", dp->d_inum); return !Remove(dp); } return(descendtree(dp)); } /* Check a zone of a directory by checking all the entries in the zone. * The zone is split up into chunks to not allocate too much stack. */ int chkdirzone(ino, ip, pos, zno) ino_t ino; d_inode *ip; off_t pos; zone_nr zno; { dir_struct dirblk[CDIRECT]; register dir_struct *dp; register n = SCALE * (NR_DIR_ENTRIES / CDIRECT), dirty; register long offset = zaddr(zno); register off_t size = 0; do { devread(offset, (char *) dirblk, DIRCHUNK); dirty = 0; for (dp = dirblk; dp < &dirblk[CDIRECT]; dp++) { if (dp->d_inum != NO_ENTRY && !chkentry(ino, pos, dp)) dirty = 1; pos += DIR_ENTRY_SIZE; if (dp->d_inum != NO_ENTRY) size = pos; } if (dirty) devwrite(offset, (char *) dirblk, DIRCHUNK); offset += DIRCHUNK; } while (--n); if (size > ip->i_size) { printf("size not updated of directory "); printpath(2, 0); if (yes(". extend")) { setbit(spec_imap, (bit_nr) ino); ip->i_size = size; devwrite(inoaddr(ino), (char *) ip, INODE_SIZE); } } return(1); } /* There is something wrong with the given zone. Print some details. */ void errzone(mess, zno, level, pos) char *mess; zone_nr zno; int level; off_t pos; { printf("%s zone in ", mess); printpath(1, 0); printf("zno = %u, type = ", zno); switch (level) { case 0: printf("DATA"); break; case 1: printf("SINGLE INDIRECT"); break; case 2: printf("DOUBLE INDIRECT"); break; default: printf("VERY INDIRECT"); } printf(", pos = %ld)\n", pos); } /* Found the given zone in the given inode. Check it, and if ok, mark it * in the zone bitmap. */ int markzone(ino, zno, level, pos) ino_t ino; zone_nr zno; int level; off_t pos; { register bit_nr bit = (bit_nr) zno - FIRST + 1; ztype[level]++; if (zno < FIRST || zno >= sb.s_nzones) { errzone("out-of-range", zno, level, pos); return(0); } if (bitset(zmap, bit)) { setbit(spec_zmap, bit); errzone("duplicate", zno, level, pos); return(0); } nfreezone--; if (bitset(spec_zmap, bit)) errzone("found", zno, level, pos); setbit(zmap, bit); return(1); } /* Check an indirect zone by checking all of its entries. * The zone is split up into chunks to not allocate too much stack. */ int chkindzone(ino, ip, pos, zno, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr zno; int level; { zone_nr indirect[CINDIR]; register n = NR_INDIRECTS / CINDIR; register long offset = zaddr(zno); do { devread(offset, (char *) indirect, INDCHUNK); if (!chkzones(ino, ip, pos, indirect, CINDIR, level - 1)) return(0); offset += INDCHUNK; } while (--n && *pos < ip->i_size); return(1); } /* Return the size of a gap in the file, represented by a null zone number * at some level of indirection. */ off_t jump(level) int level; { off_t power = ZONE_SIZE; if (level != 0) do power *= NR_INDIRECTS; while (--level); return(power); } /* Check a zone, which may be either a normal data zone, a directory zone, * or an indirect zone. */ int zonechk(ino, ip, pos, zno, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr zno; int level; { if (level == 0) { if ((ip->i_mode & I_TYPE) == I_DIRECTORY && !chkdirzone(ino, ip, *pos, zno)) return(0); *pos += ZONE_SIZE; return(1); } else return chkindzone(ino, ip, pos, zno, level); } /* Check a list of zones given by `zlist'. */ int chkzones(ino, ip, pos, zlist, len, level) ino_t ino; d_inode *ip; off_t *pos; zone_nr *zlist; int len; int level; { register ok = 1, i; /* The check on the position in the next loop is commented out, since FS * now requires valid zone numbers in each level that is necessary and FS * always deleted all the zones in the double indirect block. */ for (i = 0; i < len /* && *pos < ip->i_size */ ; i++) if (zlist[i] == NO_ZONE) *pos += jump(level); else if (!markzone(ino, zlist[i], level, *pos)) { *pos += jump(level); ok = 0; } else if (!zonechk(ino, ip, pos, zlist[i], level)) ok = 0; return(ok); } /* Check a file or a directory. */ int chkfile(ino, ip) ino_t ino; d_inode *ip; { register ok, i, level; off_t pos = 0; ok = chkzones(ino, ip, &pos, (zone_nr *)&ip->i_zone[0], NR_DZONE_NUM, 0); for (i = NR_DZONE_NUM, level = 1; i < NR_ZONE_NUMS; i++, level++) ok &= chkzones(ino, ip, &pos, (zone_nr *)&ip->i_zone[i], 1, level); return(ok); } /* Check a directory by checking the contents. Check if . and .. are present. */ int chkdirectory(ino, ip) ino_t ino; d_inode *ip; { register ok; setbit(dirmap, (bit_nr) ino); ok = chkfile(ino, ip); if (!(ftop->st_presence & DOT)) { printf(". missing in "); printpath(2, 1); ok = 0; } if (!(ftop->st_presence & DOTDOT)) { printf(".. missing in "); printpath(2, 1); ok = 0; } return(ok); } #ifdef I_SYMBOLIC_LINK /* Check the validity of a symbolic link. */ int chklink(ino, ip) ino_t ino; d_inode *ip; { int ok; ok = chkfile(ino, ip); if (ip->i_size <= 0 || ip->i_size > BLOCK_SIZE) { if (ip->i_size == 0) printf("empty symbolic link "); else printf("symbolic link too large (size %ld) ", ip->i_size); printpath(2, 1); ok = 0; } return(ok); } #endif /* Check the validity of a special file. */ int chkspecial(ino, ip) ino_t ino; d_inode *ip; { int i, ok; ok = 1; if ((dev_t) ip->i_zone[0] == NO_DEV) { printf("illegal device number %u for special file ", ip->i_zone[0]); printpath(2, 1); ok = 0; } /* FS will not use the remaining "zone numbers" but 1.6.11++ will panic if * they are nonzero, since this should not happen. */ for (i = 1; i < NR_ZONE_NUMS; i++) if (ip->i_zone[i] != NO_ZONE) { printf("nonzero zone number %u for special file ", ip->i_zone[i]); printpath(2, 1); ok = 0; } return(ok); } /* Check the mode and contents of an inode. */ int chkmode(ino, ip) ino_t ino; d_inode *ip; { switch (ip->i_mode & I_TYPE) { case I_REGULAR: nregular++; return chkfile(ino, ip); case I_DIRECTORY: ndirectory++; return chkdirectory(ino, ip); case I_BLOCK_SPECIAL: nblkspec++; return chkspecial(ino, ip); case I_CHAR_SPECIAL: ncharspec++; return chkspecial(ino, ip); case I_NAMED_PIPE: npipe++; return chkfile(ino, ip); #ifdef I_SYMBOLIC_LINK case I_SYMBOLIC_LINK: nsyml++; return chklink(ino, ip); #endif default: nbadinode++; printf("bad mode of "); printpath(1, 0); printf("mode = %o)", ip->i_mode); return(0); } } /* Check an inode. */ int chkinode(ino, ip) ino_t ino; d_inode *ip; { if (ino == ROOT_INODE && (ip->i_mode & I_TYPE) != I_DIRECTORY) { printf("root inode is not a directory "); printf("(ino = %u, mode = %o)\n", ino, ip->i_mode); fatal(""); } if (ip->i_nlinks == 0) { printf("link count zero of "); printpath(2, 0); return(0); } nfreeinode--; setbit(imap, (bit_nr) ino); if ((unsigned) ip->i_nlinks > LINK_MAX) { printf("link count too big in "); printpath(1, 0); printf("cnt = %u)\n", (unsigned) ip->i_nlinks); count[ino] -= LINK_MAX; setbit(spec_imap, (bit_nr) ino); } else count[ino] -= (unsigned) ip->i_nlinks; return chkmode(ino, ip); } /* Check the directory entry pointed to by dp, by checking the inode. */ int descendtree(dp) dir_struct *dp; { d_inode inode; register ino_t ino = dp->d_inum; register visited; struct stack stk; stk.st_dir = dp; stk.st_next = ftop; ftop = &stk; if (bitset(spec_imap, (bit_nr) ino)) { printf("found inode %u: ", ino); printpath(0, 1); } visited = bitset(imap, (bit_nr) ino); if (!visited || listing) { devread(inoaddr(ino), (char *) &inode, INODE_SIZE); if (listing) list(ino, &inode); if (!visited && !chkinode(ino, &inode)) { setbit(spec_imap, (bit_nr) ino); if (yes("remove")) { count[ino] += inode.i_nlinks - 1; clrbit(imap, (bit_nr) ino); devwrite(inoaddr(ino), nullbuf, INODE_SIZE); memset((void *) dp, 0, sizeof(dir_struct)); ftop = ftop->st_next; return(0); } } } ftop = ftop->st_next; return(1); } /* Check the file system tree. */ void chktree() { dir_struct dir; nfreeinode = sb.s_ninodes; nfreezone = N_DATA; dir.d_inum = ROOT_INODE; dir.d_name[0] = 0; if (!descendtree(&dir)) fatal("bad root inode"); putchar('\n'); } /* Print the totals of all the objects found. */ void printtotal() { printf("blocksize = %5d ", BLOCK_SIZE); printf("zonesize = %5d\n", ZONE_SIZE); printf("\n"); pr("%6u Regular file%s\n", nregular, "", "s"); pr("%6u Director%s\n", ndirectory, "y", "ies"); pr("%6u Block special file%s\n", nblkspec, "", "s"); pr("%6u Character special file%s\n", ncharspec, "", "s"); if (nbadinode != 0) pr("%6u Bad inode%s\n", nbadinode, "", "s"); pr("%6u Free inode%s\n", nfreeinode, "", "s"); pr("%6u Named pipe%s\n", npipe, "", "s"); pr("%6u Symbolic link%s\n", nsyml, "", "s"); /* Don't print some fields. printf("\n"); pr("%6u Data zone%s\n", ztype[0], "", "s"); pr("%6u Single indirect zone%s\n", ztype[1], "", "s"); pr("%6u Double indirect zone%s\n", ztype[2], "", "s"); */ pr("%6u Free zone%s\n", nfreezone, "", "s"); } /* Check the device which name is given by `f'. The inodes listed by `clist' * should be listed separately, and the inodes listed by `ilist' and the zones * listed by `zlist' should be watched for while checking the file system. */ void chkdev(f, clist, ilist, zlist) char *f, **clist, **ilist, **zlist; { if (automatic) repair = 1; device = f; initvars(); devopen(); getsuper(); chksuper(); lsi(clist); getbitmaps(); fillbitmap(spec_imap, (bit_nr) 1, (bit_nr) sb.s_ninodes + 1, ilist); fillbitmap(spec_zmap, (bit_nr) FIRST, (bit_nr) sb.s_nzones, zlist); getcount(); chktree(); chkmap(zmap, spec_zmap, (bit_nr) FIRST - 1, BLK_ZMAP, N_ZMAP, "zone"); chkcount(); chkmap(imap, spec_imap, (bit_nr) 0, BLK_IMAP, N_IMAP, "inode"); chkilist(); printtotal(); putbitmaps(); freecount(); devclose(); if (changed) printf("----- FILE SYSTEM HAS BEEN MODIFIED -----\n\n"); } int main(argc, argv) int argc; char **argv; { register char **clist = 0, **ilist = 0, **zlist = 0; register devgiven = 0; register char *arg; if ((1 << BITSHIFT) != 8 * sizeof(bitchunk_t)) { printf("Fsck was compiled with the wrong BITSHIFT!\n"); exit(1); } sync(); prog = *argv++; while ((arg = *argv++) != 0) if (arg[0] == '-' && arg[1] != 0 && arg[2] == 0) switch (arg[1]) { case 'a': automatic ^= 1; break; case 'c': clist = getlist(&argv, "inode"); break; case 'i': ilist = getlist(&argv, "inode"); break; case 'z': zlist = getlist(&argv, "zone"); break; case 'r': repair ^= 1; break; case 'l': listing ^= 1; break; case 's': listsuper ^= 1; break; default: printf("%s: unknown flag '%s'\n", prog, arg); } else { chkdev(arg, clist, ilist, zlist); clist = 0; ilist = 0; zlist = 0; devgiven = 1; } if (!devgiven) { printf("Usage: fsck1 [-acilrsz] file\n"); exit(1); } return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* getty - get tty speed Author: Fred van Kempen */ /* * GETTY - Initialize and serve a login-terminal for INIT. * Also, select the correct speed. The STTY() code * was taken from stty(1).c; which was written by * Andrew S. Tanenbaum. * * Usage: getty [-c filename] [-h] [-k] [-t] line [speed] * * Version: 3.4 02/17/90 * * Author: F. van Kempen, MicroWalt Corporation * * Modifications: * All the good stuff removed to get a minimal getty, because * many modems don't like all that fancy speed detection stuff. * 03/03/91 Kees J. Bot (kjb@cs.vu.nl) * * Uname(), termios. More nonsense removed. (The result has * only 10% of the original functionality, but a 10x chance of * working.) * 12/12/92 Kees J. Bot * * Customizable login banner. * 11/13/95 Kees J. Bot */ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <errno.h> #include <sys/utsname.h> char LOGIN[] = "/usr/bin/login"; char SHELL[] = "/bin/sh"; #define ST_IDLE 44 /* the getty is idle */ #define ST_RUNNING 55 /* getty is now RUNNING */ #define ST_SUSPEND 66 /* getty was SUSPENDed for dialout */ int state = ST_IDLE; /* the IDLE/SUSPEND/RUNNING state flag */ char *tty_name; /* name of the line */ /* Crude indication of a tty being physically secure: */ #define securetty(dev) ((unsigned) ((dev) - 0x0400) < (unsigned) 8) void sigcatch(int sig) { /* Catch the signals that want to catch. */ switch(sig) { case SIGUSR1: /* SIGUSR1 means SUSPEND */ if (state == ST_IDLE) state = ST_SUSPEND; break; case SIGUSR2: /* SIGUSR2 means RESTART */ if (state == ST_SUSPEND) state = ST_RUNNING; break; } } void std_out(char *s) { write(1, s, strlen(s)); } /* Read one character from stdin. */ int areadch(void) { int st; char ch1; /* read character from TTY */ st = read(0, &ch1, 1); if (st == 0) { std_out("\n"); exit(0); } if (st < 0) { if (errno == EINTR) return(-1); /* SIGNAL received! */ if (errno != EINTR) { std_out("getty: "); std_out(tty_name); std_out(": read error\n"); pause(); exit(1); } } return(ch1 & 0xFF); } /* Handle the process of a GETTY. */ void do_getty(char *name, size_t len, char **args) { register char *np, *s, *s0; int ch; struct utsname utsname; char **banner; static char *def_banner[] = { "%s Release %r Version %v\n\n%n login: ", 0 }; /* Default banner? */ if (args[0] == NULL) args = def_banner; /* Display prompt. */ ch = ' '; *name = '\0'; while (ch != '\n') { /* Get data about this machine. */ uname(&utsname); /* Print the banner. */ for (banner = args; *banner != NULL; banner++) { std_out(banner == args ? "\n" : " "); s0 = *banner; for (s = *banner; *s != 0; s++) { if (*s == '\\') { write(1, s0, s-s0); s0 = s+2; switch (*++s) { case 'n': std_out("\n"); break; case 's': std_out(" "); break; case 't': std_out("\t"); break; case 0: goto leave; default: s0 = s; } } else if (*s == '%') { write(1, s0, s-s0); s0 = s+2; switch (*++s) { case 's': std_out(utsname.sysname); break; case 'n': std_out(utsname.nodename); break; case 'r': std_out(utsname.release); break; case 'v': std_out(utsname.version); break; case 'm': std_out(utsname.machine); break; case 'p': std_out(utsname.arch); break; #if __minix_vmd case 'k': std_out(utsname.kernel); break; case 'h': std_out(utsname.hostname); break; case 'b': std_out(utsname.bus); break; #endif case 0: goto leave; default: s0 = s-1; } } } leave: write(1, s0, s-s0); } np = name; while (ch != '\n') { ch = areadch(); /* adaptive READ */ switch (ch) { case -1: /* signalled! */ if (state == ST_SUSPEND) { while (state != ST_IDLE) { pause(); if (state == ST_RUNNING) state = ST_IDLE; } } ch = ' '; continue; case '\n': *np = '\0'; break; default: if (np < name + len) *np++ = ch; } } if (*name == '\0') ch = ' '; /* blank line typed! */ } } /* Execute the login(1) command with the current * username as its argument. It will reply to the * calling user by typing "Password: "... */ void do_login(char *name) { struct stat st; execl(LOGIN, LOGIN, name, (char *) NULL); /* Failed to exec login. Impossible, but true. Try a shell, but only if * the terminal is more or less secure, because it will be a root shell. */ std_out("getty: can't exec "); std_out(LOGIN); std_out("\n"); if (fstat(0, &st) == 0 && S_ISCHR(st.st_mode) && securetty(st.st_rdev)) { execl(SHELL, SHELL, (char *) NULL); } } int main(int argc, char **argv) { register char *s; char name[30]; struct sigaction sa; /* Don't let QUIT dump core. */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = exit; sigaction(SIGQUIT, &sa, NULL); tty_name = ttyname(0); if (tty_name == NULL) { std_out("getty: tty name unknown\n"); pause(); return(1); } chown(tty_name, 0, 0); /* set owner of TTY to root */ chmod(tty_name, 0600); /* mode to max secure */ /* Catch some of the available signals. */ sa.sa_handler = sigcatch; sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR2, &sa, NULL); do_getty(name, sizeof(name), argv+1); /* handle getty() */ name[29] = '\0'; /* make sure the name fits! */ do_login(name); /* and call login(1) if OK */ return(1); /* never executed */ } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* gomoku - 5 in a row game Author: ? */ /* This program plays a very old Japanese game called GO-MOKU, perhaps better known as 5-in-line. The game is played on a board with 19 x 19 squares, and the object of the game is to get 5 stones in a row. */ #include <sys/types.h> #include <curses.h> #include <ctype.h> #include <stdlib.h> #include <unistd.h> /* Size of the board */ #define SIZE 19 /* Importance of attack (1..16) */ #define AttackFactor 4 /* Value of having 0, 1,2,3,4 or 5 pieces in line */ int Weight[7] = {0, 0, 4, 20, 100, 500, 0}; #define Null 0 #define Horiz 1 #define DownLeft 2 #define DownRight 3 #define Vert 4 /* The two players */ #define Empty 0 #define Cross 1 #define Nought 2 char PieceChar[Nought + 1] = {' ', 'X', '0'}; int Board[SIZE + 1][SIZE + 1];/* The board */ int Player; /* The player whose move is next */ int TotalLines; /* The number of Empty lines left */ int GameWon; /* Set if one of the players has won */ int Line[4][SIZE + 1][SIZE + 1][Nought + 1]; /* Value of each square for each player */ int Value[SIZE + 1][SIZE + 1][Nought + 1]; int X, Y; /* Move coordinates */ char Command; /* Command from keyboard */ int AutoPlay = FALSE; /* The program plays against itself */ _PROTOTYPE(void Initialize, (void)); _PROTOTYPE(int Abort, (char *s)); _PROTOTYPE(void WriteLetters, (void)); _PROTOTYPE(void WriteLine, (int j, int *s)); _PROTOTYPE(void WriteBoard, (int N, int *Top, int *Middle, int *Bottom)); _PROTOTYPE(void SetUpScreen, (void)); _PROTOTYPE(void GotoSquare, (int x, int y)); _PROTOTYPE(void PrintMove, (int Piece, int X, int Y)); _PROTOTYPE(void ClearMove, (void)); _PROTOTYPE(void PrintMsg, (char *Str)); _PROTOTYPE(void ClearMsg, (void)); _PROTOTYPE(void WriteCommand, (char *S)); _PROTOTYPE(void ResetGame, (int FirstGame)); _PROTOTYPE(int OpponentColor, (int Player)); _PROTOTYPE(void BlinkRow, (int X, int Y, int Dx, int Dy, int Piece)); _PROTOTYPE(void BlinkWinner, (int Piece, int X, int Y, int WinningLine)); _PROTOTYPE(int Random, (int x)); _PROTOTYPE(void Add, (int *Num)); _PROTOTYPE(void Update, (int Lin[], int Valu[], int Opponent)); _PROTOTYPE(void MakeMove, (int X, int Y)); _PROTOTYPE(int GameOver, (void)); _PROTOTYPE(void FindMove, (int *X, int *Y)); _PROTOTYPE(char GetChar, (void)); _PROTOTYPE(void ReadCommand, (int X, int Y, char *Command)); _PROTOTYPE(void InterpretCommand, (int Command)); _PROTOTYPE(void PlayerMove, (void)); _PROTOTYPE(void ProgramMove, (void)); _PROTOTYPE(int main, (void)); /* Set terminal to raw mode. */ void Initialize() { srand(getpid() + 13); /* Initialize the random seed with our pid */ initscr(); raw(); noecho(); clear(); } /* Reset terminal and exit from the program. */ int Abort(s) char *s; { move(LINES - 1, 0); refresh(); endwin(); exit(0); } /* Set up the screen ----------------------------------------------- */ /* Write the letters */ void WriteLetters() { int i; addch(' '); addch(' '); for (i = 1; i <= SIZE; i++) printw(" %c", 'A' + i - 1); addch('\n'); } /* Write one line of the board */ void WriteLine(j, s) int j; int *s; { int i; printw("%2d ", j); addch(s[0]); for (i = 2; i <= SIZE - 1; i++) { addch(s[1]); addch(s[2]); } addch(s[1]); addch(s[3]); printw(" %-2d\n", j); } /* Print the Empty board and the border */ void WriteBoard(N, Top, Middle, Bottom) int N; int *Top, *Middle, *Bottom; { int j; move(1, 0); WriteLetters(); WriteLine(N, Top); for (j = N - 1; j >= 2; j--) WriteLine(j, Middle); WriteLine(1, Bottom); WriteLetters(); } /* Sets up the screen with an Empty board */ void SetUpScreen() { int top[4], middle[4], bottom[4]; top[0] = ACS_ULCORNER; top[1] = ACS_HLINE; top[2] = ACS_TTEE; top[3] = ACS_URCORNER; middle[0] = ACS_LTEE; middle[1] = ACS_HLINE; middle[2] = ACS_PLUS; middle[3] = ACS_RTEE; bottom[0] = ACS_LLCORNER; bottom[1] = ACS_HLINE; bottom[2] = ACS_BTEE; bottom[3] = ACS_LRCORNER; WriteBoard(SIZE, top, middle, bottom); } /* Show moves ----------------------------------------------- */ void GotoSquare(x, y) int x, y; { move(SIZE + 2 - y, 1 + x * 2); } /* Prints a move */ void PrintMove(Piece, X, Y) int Piece; int X, Y; { move(22, 49); printw("%c %c %d", PieceChar[Piece], 'A' + X - 1, Y); clrtoeol(); GotoSquare(X, Y); addch(PieceChar[Piece]); GotoSquare(X, Y); refresh(); } /* Clears the line where a move is displayed */ void ClearMove() { move(22, 49); clrtoeol(); } /* Message handling ---------------------------------------------- */ /* Prints a message */ void PrintMsg(Str) char *Str; { mvprintw(23, 1, "%s", Str); } /* Clears the message about the winner */ void ClearMsg() { move(23, 1); clrtoeol(); } /* Highlights the first letter of S */ void WriteCommand(S) char *S; { standout(); addch(*S); standend(); printw("%s", S + 1); } /* Display the board ----------------------------------------------- */ /* Resets global variables to start a new game */ void ResetGame(FirstGame) int FirstGame; { int I, J; int C, D; SetUpScreen(); if (FirstGame) { move(1, 49); addstr("G O M O K U"); move(3, 49); WriteCommand("Newgame "); WriteCommand("Quit "); move(5, 49); WriteCommand("Auto"); move(7, 49); WriteCommand("Play"); move(9, 49); WriteCommand("Hint"); move(14, 60); WriteCommand("Left, "); WriteCommand("Right, "); move(16, 60); WriteCommand("Up, "); WriteCommand("Down"); move(18, 60); standout(); addstr("SPACE"); move(20, 49); WriteCommand(" NOTE: Use Num Lock & arrows"); standend(); mvaddstr(14, 49, "7 8 9"); mvaddch(15, 52, ACS_UARROW); mvaddch(16, 49, '4'); addch(ACS_LARROW); mvaddch(16, 54, ACS_RARROW); addch('6'); mvaddch(17, 52, ACS_DARROW); mvaddstr(18, 49, "1 2 3"); FirstGame = FALSE; } else { ClearMsg(); ClearMove(); } /* Clear tables */ for (I = 1; I <= SIZE; I++) for (J = 1; J <= SIZE; J++) { Board[I][J] = Empty; for (C = Cross; C <= Nought; C++) { Value[I][J][C] = 0; for (D = 0; D <= 3; D++) Line[D][I][J][C] = 0; } } /* Cross starts */ Player = Cross; /* Total number of lines */ TotalLines = 2 * 2 * (SIZE * (SIZE - 4) + (SIZE - 4) * (SIZE - 4)); GameWon = FALSE; } int OpponentColor(Player) int Player; { if (Player == Cross) return Nought; else return Cross; } /* Blink the row of 5 stones */ void BlinkRow(X, Y, Dx, Dy, Piece) int X, Y, Dx, Dy, Piece; { int I; attron(A_BLINK); for (I = 1; I <= 5; I++) { GotoSquare(X, Y); addch(PieceChar[Piece]); X = X - Dx; Y = Y - Dy; } attroff(A_BLINK); } /* Prints the 5 winning stones in blinking color */ void BlinkWinner(Piece, X, Y, WinningLine) int Piece, X, Y, WinningLine; { /* Used to store the position of the winning move */ int XHold, YHold; /* Change in X and Y */ int Dx, Dy; /* Display winning move */ PrintMove(Piece, X, Y); /* Preserve winning position */ XHold = X; YHold = Y; switch (WinningLine) { case Horiz: { Dx = 1; Dy = 0; break; } case DownLeft: { Dx = 1; Dy = 1; break; } case Vert: { Dx = 0; Dy = 1; break; } case DownRight: { Dx = -1; Dy = 1; break; } } /* Go to topmost, leftmost */ while (Board[X + Dx][Y + Dy] != Empty && Board[X + Dx][Y + Dy] == Piece) { X = X + Dx; Y = Y + Dy; } BlinkRow(X, Y, Dx, Dy, Piece); /* Restore winning position */ X = XHold; Y = YHold; /* Go back to winning square */ GotoSquare(X, Y); } /* Functions for playing a game -------------------------------- */ int Random(x) int x; { return((rand() / 19) % x); } /* Adds one to the number of pieces in a line */ void Add(Num) int *Num; { /* Adds one to the number. */ *Num = *Num + 1; /* If it is the first piece in the line, then the opponent cannot use * it any more. */ if (*Num == 1) TotalLines = TotalLines - 1; /* The game is won if there are 5 in line. */ if (*Num == 5) GameWon = TRUE; } /* Updates the value of a square for each player, taking into account that player has placed an extra piece in the square. The value of a square in a usable line is Weight[Lin[Player]+1] where Lin[Player] is the number of piec(O��*O��+O��,O��-O��.O��/O��0O��1O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������es already placed in the line */ void Update(Lin, Valu, Opponent) int Lin[]; int Valu[]; int Opponent; { /* If the opponent has no pieces in the line, then simply update the * value for player */ if (Lin[Opponent] == 0) Valu[Player] += Weight[Lin[Player] + 1] - Weight[Lin[Player]]; else /* If it is the first piece in the line, then the line is * spoiled for the opponent */ if (Lin[Player] == 1) Valu[Opponent] -= Weight[Lin[Opponent] + 1]; } /* Performs the move X,Y for player, and updates the global variables (Board, Line, Value, Player, GameWon, TotalLines and the screen) */ void MakeMove(X, Y) int X, Y; { int Opponent; int X1, Y1; int K, L, WinningLine; WinningLine = Null; Opponent = OpponentColor(Player); GameWon = FALSE; /* Each square of the board is part of 20 different lines. The adds * one to the number of pieces in each of these lines. Then it * updates the value for each of the 5 squares in each of the 20 * lines. Finally Board is updated, and the move is printed on the * screen. */ /* Horizontal lines, from left to right */ for (K = 0; K <= 4; K++) { X1 = X - K; /* Calculate starting point */ Y1 = Y; if ((1 <= X1) && (X1 <= SIZE - 4)) { /* Check starting point */ Add(&Line[0][X1][Y1][Player]); /* Add one to line */ if (GameWon && (WinningLine == Null)) /* Save winning line */ WinningLine = Horiz; for (L = 0; L <= 4; L++) /* Update value for the * 5 squares in the line */ Update(Line[0][X1][Y1], Value[X1 + L][Y1], Opponent); } } for (K = 0; K <= 4; K++) { /* Diagonal lines, from lower left to * upper right */ X1 = X - K; Y1 = Y - K; if ((1 <= X1) && (X1 <= SIZE - 4) && (1 <= Y1) && (Y1 <= SIZE - 4)) { Add(&Line[1][X1][Y1][Player]); if (GameWon && (WinningLine == Null)) /* Save winning line */ WinningLine = DownLeft; for (L = 0; L <= 4; L++) Update(Line[1][X1][Y1], Value[X1 + L][Y1 + L], Opponent); } } /* for */ for (K = 0; K <= 4; K++) { /* Diagonal lines, down right to upper left */ X1 = X + K; Y1 = Y - K; if ((5 <= X1) && (X1 <= SIZE) && (1 <= Y1) && (Y1 <= SIZE - 4)) { Add(&Line[3][X1][Y1][Player]); if (GameWon && (WinningLine == Null)) /* Save winning line */ WinningLine = DownRight; for (L = 0; L <= 4; L++) Update(Line[3][X1][Y1], Value[X1 - L][Y1 + L], Opponent); } } /* for */ for (K = 0; K <= 4; K++) { /* Vertical lines, from down to up */ X1 = X; Y1 = Y - K; if ((1 <= Y1) && (Y1 <= SIZE - 4)) { Add(&Line[2][X1][Y1][Player]); if (GameWon && (WinningLine == Null)) /* Save winning line */ WinningLine = Vert; for (L = 0; L <= 4; L++) Update(Line[2][X1][Y1], Value[X1][Y1 + L], Opponent); } } Board[X][Y] = Player; /* Place piece in board */ if (GameWon) BlinkWinner(Player, X, Y, WinningLine); else PrintMove(Player, X, Y);/* Print move on screen */ Player = Opponent; /* The opponent is next to move */ } int GameOver() /* A game is over if one of the players have won, or if there are no more Empty lines */ { return(GameWon || (TotalLines <= 0)); } /* Finds a move X,Y for player, simply by picking the one with the highest value */ void FindMove(X, Y) int *X, *Y; { int Opponent; int I, J; int Max, Valu; Opponent = OpponentColor(Player); Max = -10000; /* If no square has a high value then pick the one in the middle */ *X = (SIZE + 1) / 2; *Y = (SIZE + 1) / 2; if (Board[*X][*Y] == Empty) Max = 4; /* The evaluation for a square is simply the value of the square for * the player (attack points) plus the value for the opponent * (defense points). Attack is more important than defense, since it * is better to get 5 in line yourself than to prevent the op- ponent * from getting it. */ /* For all Empty squares */ for (I = 1; I <= SIZE; I++) for (J = 1; J <= SIZE; J++) if (Board[I][J] == Empty) { /* Calculate evaluation */ Valu = Value[I][J][Player] * (16 + AttackFactor) / 16 + Value[I][J][Opponent] + Random(4); /* Pick move with highest value */ if (Valu > Max) { *X = I; *Y = J; Max = Valu; } } } char GetChar() /* Get a character from the keyboard */ { int c; c = getch(); if (c < 0) abort(); if (c == '\033') { /* arrow key */ if ((c = getch()) == '[') { c = getch(); switch (c) { case 'A': c = 'U'; break; case 'B': c = 'D'; break; case 'C': c = 'R'; break; case 'D': c = 'L'; break; default: c = '?'; break; } } else c = '?'; } if (islower(c)) return toupper(c); else return c; } /* Reads in a valid command character */ void ReadCommand(X, Y, Command) int X, Y; char *Command; { int ValidCommand; do { ValidCommand = TRUE; GotoSquare(X, Y); /* Goto square */ refresh(); *Command = GetChar(); /* Read from keyboard */ switch (*Command) { case '\n': /* '\n', '\r' or space means place a */ case '\r': case ' ': *Command = 'E'; break; /* stone at the cursor position */ case 'L': case 'R': case 'U': case 'D': case '7': case '9': case '1': case '3': case 'N': case 'Q': case 'A': case 'P': case 'H': break; case '8': *Command = 'U'; break; case '2': *Command = 'D'; break; case '4': *Command = 'L'; break; case '6': *Command = 'R'; break; default: { if (GameOver()) *Command = 'P'; else ValidCommand = FALSE; break; } } } while (!ValidCommand); } void InterpretCommand(Command) char Command; { int Temp; switch (Command) { case 'N':{ /* Start new game */ ResetGame(FALSE); /* ResetGame but only redraw * the board */ X = (SIZE + 1) / 2; Y = X; break; } case 'H': FindMove(&X, &Y); break; /* Give the user a hint */ case 'L': X = (X + SIZE - 2) % SIZE + 1; break; /* Left */ case 'R': X = X % SIZE + 1; break; /* Right */ case 'D': Y = (Y + SIZE - 2) % SIZE + 1; break; /* Down */ case 'U': Y = Y % SIZE + 1; break; /* Up */ case '7':{ if ((X == 1) || (Y == SIZE)) { /* Move diagonally *//* t * owards upper left */ Temp = X; X = Y; Y = Temp; } else { X = X - 1; Y = Y + 1; } break; } case '9':{ /* Move diagonally */ if (X == SIZE) {/* toward upper right */ X = (SIZE - Y) + 1; Y = 1; } else if (Y == SIZE) { Y = (SIZE - X) + 1; X = 1; } else { X = X + 1; Y = Y + 1; } break; } case '1':{ /* Move diagonally */ if (Y == 1) { /* toward lower left */ Y = (SIZE - X) + 1; X = SIZE; } else if (X == 1) { X = (SIZE - Y) + 1; Y = SIZE; } else { X = X - 1; Y = Y - 1; } break; } case '3':{ /* Move diagonally */ if ((X == SIZE) || (Y == 1)) { /* toward lower right */ Temp = X; X = Y; Y = Temp; } else { X = X + 1; Y = Y - 1; } break; } case 'A': AutoPlay = TRUE; break; /* Auto play mode */ } /* case */ } /* InterpretCommand */ void PlayerMove() /* Enter and make a move */ { if (Board[X][Y] == Empty) { MakeMove(X, Y); if (GameWon) PrintMsg("Congratulations, You won!"); Command = 'P'; } refresh(); } /* PlayerMove */ void ProgramMove() /* Find and perform programs move */ { do { if (GameOver()) { AutoPlay = FALSE; if ((Command != 'Q') && (!GameWon)) PrintMsg("Tie game!"); } else { FindMove(&X, &Y); MakeMove(X, Y); if (GameWon) PrintMsg("I won!"); } refresh(); } while (AutoPlay); } int main() { Initialize(); ResetGame(TRUE); /* ResetGame and draw the entire screen */ refresh(); X = (SIZE + 1) / 2; /* Set starting position to */ Y = X; /* the middle of the board */ do { ReadCommand(X, Y, &Command); if (GameOver()) if (Command != 'Q') Command = 'N'; InterpretCommand(Command); if (Command == 'E') PlayerMove(); if (Command == 'P' || Command == 'A') ProgramMove(); } while (Command != 'Q'); Abort("Good bye!"); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* grep - search a file for a pattern Author: Norbert Schlenker */ /* Norbert Schlenker (nfs@princeton.edu) 1990-02-08 * Released into the public domain. * * Grep searches files for lines containing a pattern, as specified by * a regular expression, and prints those lines. It is invoked by: * grep [flags] [pattern] [file ...] * * Flags: * -e pattern useful when pattern begins with '-' * -c print a count of lines matched * -i ignore case * -l prints just file names, no lines (quietly overrides -n) * -n printed lines are preceded by relative line numbers * -s prints errors only (quietly overrides -l and -n) * -v prints lines which don't contain the pattern * * Semantic note: * If both -l and -v are specified, grep prints the names of those * files which do not contain the pattern *anywhere*. * * Exit: * Grep sets an exit status which can be tested by the caller. * Note that these settings are not necessarily compatible with * any other version of grep, especially when -v is specified. * Possible status values are: * 0 if any matches are found * 1 if no matches are found * 2 if syntax errors are detected or any file cannot be opened */ /* External interfaces */ #include <sys/types.h> #include <regexp.h> /* Thanks to Henry Spencer */ #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> /* Internal constants */ #define MATCH 0 /* exit code: some match somewhere */ #define NO_MATCH 1 /* exit code: no match on any line */ #define FAILURE 2 /* exit code: syntax error or bad file name */ /* Macros */ #define SET_FLAG(c) (flags[(c)-'a'] = 1) #define FLAG(c) (flags[(c)-'a'] != 0) #define uppercase(c) (((unsigned) ((c) - 'A')) <= ('Z' - 'A')) #define downcase(c) ((c) - 'A' + 'a') /* Private storage */ static char *program; /* program name */ static char flags[26]; /* invocation flags */ static regexp *expression; /* compiled search pattern */ static char *rerr; /* error message */ /* External variables. */ extern int optind; extern char *optarg; /* Internal interfaces */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(static int match, (FILE *input, char *label, char *filename)); _PROTOTYPE(static char *get_line, (FILE *input)); _PROTOTYPE(static char *map_nocase, (char *line)); _PROTOTYPE(void regerror , (char *s ) ); _PROTOTYPE(static void tov8, (char *v8pattern, char *pattern)); int main(argc, argv) int argc; char *argv[]; { int opt; /* option letter from getopt() */ int egrep=0; /* using extended regexp operators */ char *pattern; /* search pattern */ char *v8pattern; /* v8 regexp search pattern */ int exit_status = NO_MATCH; /* exit status for our caller */ int file_status; /* status of search in one file */ FILE *input; /* input file (if not stdin) */ program = argv[0]; if (strlen(program)>=5 && strcmp(program+strlen(program)-5,"egrep")==0) egrep=1; memset(flags, 0, sizeof(flags)); pattern = NULL; /* Process any command line flags. */ while ((opt = getopt(argc, argv, "e:cilnsv")) != EOF) { if (opt == '?') exit_status = FAILURE; else if (opt == 'e') pattern = optarg; else SET_FLAG(opt); } /* Detect a few problems. */ if ((exit_status == FAILURE) || (optind == argc && pattern == NULL)) { fprintf(stderr,"Usage: %s [-cilnsv] [-e] expression [file ...]\n",program); exit(FAILURE); } /* Ensure we have a usable pattern. */ if (pattern == NULL) pattern = argv[optind++]; /* Map pattern to lowercase if -i given. */ if (FLAG('i')) { char *p; for (p = pattern; *p != '\0'; p++) { if (uppercase(*p)) *p = downcase(*p); } } if (!egrep) { if ((v8pattern=malloc(2*strlen(pattern)))==(char*)0) { fprintf(stderr,"%s: out of memory\n"); exit(FAILURE); } tov8(v8pattern,pattern); } else v8pattern=pattern; rerr=(char*)0; if ((expression = regcomp(v8pattern)) == NULL) { fprintf(stderr,"%s: bad regular expression",program); if (rerr) fprintf(stderr," (%s)",rerr); fprintf(stderr,"\n"); exit(FAILURE); } /* Process the files appropriately. */ if (optind == argc) { /* no file names - find pattern in stdin */ exit_status = match(stdin, (char *) NULL, "<stdin>"); } else if (optind + 1 == argc) { /* one file name - find pattern in it */ if (strcmp(argv[optind], "-") == 0) { exit_status = match(stdin, (char *) NULL, "-"); } else { if ((input = fopen(argv[optind], "r")) == NULL) { fprintf(stderr, "%s: couldn't open %s\n", program, argv[optind]); exit_status = FAILURE; } else { exit_status = match(input, (char *) NULL, argv[optind]); } } } else while (optind < argc) { /* lots of file names - find pattern in all */ if (strcmp(argv[optind], "-") == 0) { file_status = match(stdin, "-", "-"); } else { if ((input = fopen(argv[optind], "r")) == NULL) { fprintf(stderr, "%s: couldn't open %s\n", program, argv[optind]); exit_status = FAILURE; } else { file_status = match(input, argv[optind], argv[optind]); fclose(input); } } if (exit_status != FAILURE) exit_status &= file_status; ++optind; } return(exit_status); } /* match - matches the lines of a file with the regular expression. * To improve performance when either -s or -l is specified, this * function handles those cases specially. */ static int match(input, label, filename) FILE *input; char *label; char *filename; { char *line, *testline; /* pointers to input line */ long int lineno = 0; /* line number */ long int matchcount = 0; /* lines matched */ int status = NO_MATCH; /* summary of what was found in this file */ if (FLAG('s') || FLAG('l')) { while ((line = get_line(input)) != NULL) { testline = FLAG('i') ? map_nocase(line) : line; if (regexec(expression, testline, 1)) { status = MATCH; break; } } if (FLAG('l')) if ((!FLAG('v') && status == MATCH) || ( FLAG('v') && status == NO_MATCH)) puts(filename); return status; } while ((line = get_line(input)) != NULL) { ++lineno; testline = FLAG('i') ? map_nocase(line) : line; if (regexec(expression, testline, 1)) { status = MATCH; if (!FLAG('v')) { if (label != NULL) printf("%s:", label); if (FLAG('n')) printf("%ld:", lineno); if (!FLAG('c')) puts(line); matchcount++; } } else { if (FLAG('v')) { if (label != NULL) printf("%s:", label); if (FLAG('n')) printf("%ld:", lineno); if (!FLAG('c')) puts(line); matchcount++; } } } if (FLAG('c')) printf("%ld\n", matchcount); return status; } /* get_line - fetch a line from the input file * This function reads a line from the input file into a dynamically * allocated buffer. If the line is too long for the current buffer, * attempts will be made to increase its size to accomodate the line. * The trailing newline is stripped before returning to the caller. */ #define FIRST_BUFFER (size_t)256 /* first buffer size */ static char *buf = NULL; /* input buffer */ static size_t buf_size = 0; /* input buffer size */ static char *get_line(input) FILE *input; { int n; register char *bp; register int c; char *new_buf; size_t new_size; if (buf_size == 0) { if ((buf = (char *) malloc(FIRST_BUFFER)) == NULL) { fprintf(stderr,"%s: not enough memory\n",program); exit(FAILURE); } buf_size = FIRST_BUFFER; } bp = buf; n = buf_size; while (1) { while (--n > 0 && (c = getc(input)) != EOF) { if (c == '\n') { *bp = '\0'; return buf; } *bp++ = c; } if (c == EOF) return (ferror(input) || bp == buf) ? NULL : buf; new_size = buf_size << 1; if ((new_buf = (char *) realloc(buf, new_size)) == NULL) { fprintf(stderr, "%s: line too long - truncated\n", program); while ((c = getc(input)) != EOF && c != '\n') ; *bp = '\0'; return buf; } else { bp = new_buf + (buf_size - 1); n = buf_size + 1; buf = new_buf; buf_size = new_size; } } } /* map_nocase - map a line down to lowercase letters only. * bad points: assumes line gotten from get_line. * there is more than A-Z you say? */ static char *map_nocase(line) char *line; { static char *mapped=(char*)0; static size_t map_size = 0; char *mp; if (map_9O��;O��<O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������size < buf_size) { if ((mapped=realloc(mapped,map_size=buf_size)) == NULL) { fprintf(stderr,"%s: not enough memory\n",program); exit(FAILURE); } } mp = mapped; do { *mp++ = uppercase(*line) ? downcase(*line) : *line; } while (*line++ != '\0'); return mapped; } /* In basic regular expressions, the characters ?, +, |, (, and ) are taken literally; use the backslashed versions for RE operators. In v8 regular expressions, things are the other way round, so we have to swap those characters and their backslashed versions. */ static void tov8(char *v8, char *basic) { while (*basic) switch (*basic) { case '?': case '+': case '|': case '(': case ')': { *v8++='\\'; *v8++=*basic++; break; } case '\\': { switch (*(basic+1)) { case '?': case '+': case '|': case '(': case ')': { *v8++=*++basic; ++basic; break; } case '\0': { *v8++=*basic++; break; } default: { *v8++=*basic++; *v8++=*basic++; } } break; } default: { *v8++=*basic++; } } *v8++='\0'; } /* Regular expression code calls this routine to print errors. */ void regerror(s) char *s; { rerr=s; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* head - print the first few lines of a file Author: Andy Tanenbaum */ #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define DEFAULT 10 _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void do_file, (int n, FILE *f)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { FILE *f; int n, k, nfiles; char *ptr; /* Check for flag. Only flag is -n, to say how many lines to print. */ k = 1; ptr = argv[1]; n = DEFAULT; if (argc > 1 && *ptr++ == '-') { k++; n = atoi(ptr); if (n <= 0) usage(); } nfiles = argc - k; if (nfiles == 0) { /* Print standard input only. */ do_file(n, stdin); exit(0); } /* One or more files have been listed explicitly. */ while (k < argc) { if (nfiles > 1) printf("==> %s <==\n", argv[k]); if ((f = fopen(argv[k], "r")) == NULL) fprintf(stderr, "%s: cannot open %s: %s\n", argv[0], argv[k], strerror(errno)); else { do_file(n, f); fclose(f); } k++; if (k < argc) printf("\n"); } return(0); } void do_file(n, f) int n; FILE *f; { int c; /* Print the first 'n' lines of a file. */ while (n) switch (c = getc(f)) { case EOF: return; case '\n': --n; default: putc((char) c, stdout); } } void usage() { fprintf(stderr, "Usage: head [-n] [file ...]\n"); exit(1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 1986 Regents of the University of California * All Rights Reserved * * Redistribution and use in source and binary forms are permitted * provided that this notice is preserved and that due credit is given * to the University of California at Berkeley. The name of the University * may not be used to endorse or promote products derived from this * software without specific prior written permission. This software * is provided ``as is'' without express or implied warranty. */ /* * Actually, this program is from Rutgers University, however it is * based on nslookup and other pieces of named tools, so it needs * that copyright notice. */ #if _MINIX #include <sys/types.h> #include <sys/ioctl.h> #include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/hton.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/nameser.h> #include <net/gen/resolv.h> #include <net/gen/socket.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> typedef u8_t u_char; typedef u16_t u_short; typedef u32_t u_long; #undef ERROR #else #include <stdio.h> #include <sys/types.h> #include <arpa/nameser.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <resolv.h> #include <sys/param.h> #include <strings.h> #include <ctype.h> #endif extern int h_errno; #define NUMMX 50 #define SUCCESS 0 #define TIME_OUT -1 #define NO_INFO -2 #define ERROR -3 #define NONAUTH -4 #define NAME_LEN 256 #ifndef T_TXT #define T_TXT 16 #endif #ifndef NO_DATA #define NO_DATA NO_ADDRESS #endif #ifndef C_HS #define C_HS 4 #endif FILE *filePtr; struct state orig; extern struct state _res; static u8_t *cname = NULL; int getclass = C_IN; int gettype, getdeftype = T_A; int verbose = 0; int list = 0; int server_specified = 0; union querybuf; int main _ARGS(( int c, char *v[] )); static int parsetype _ARGS(( char *s )); static int parseclass _ARGS(( char *s )); static void hperror _ARGS(( int errno )); static void printanswer _ARGS(( struct hostent *hp )); static int ListHosts _ARGS(( char *namePtr, int queryType )); static int gethostinfo _ARGS(( char *name )); static int getdomaininfo _ARGS(( char *name, char *domain )); static int getinfo _ARGS(( char *name, char *domain, int type )); static int printinfo _ARGS(( union querybuf *answer, u8_t *eom, int filter, int isls )); static char *DecodeError _ARGS(( int result )); static u8_t *pr_rr _ARGS(( u8_t *cp, u8_t *msg, FILE *file, int filter )); static u8_t * pr_cdname _ARGS(( u8_t *cp, u8_t *msg, u8_t *name, int namelen )); static char *pr_class _ARGS(( int class )); static char *pr_type _ARGS(( int type )); static int tcpip_writeall _ARGS(( int fd, char *buf, unsigned siz )); int main(c, v) char **v; { char *domain; ipaddr_t addr; register struct hostent *hp; register char *s, *p; register inverse = 0; register waitmode = 0; u8_t *oldcname; int ncnames; int isaddr; res_init(); _res.retrans = 5; if (c < 2) { fprintf(stderr, "Usage: host [-w] [-v] [-r] [-d] [-V] [-t querytype] [-c class] [-a] host [server]\n -w to wait forever until reply\n -v for verbose output\n -r to disable recursive processing\n -d to turn on debugging output\n -t querytype to look for a specific type of information\n -c class to look for non-Internet data\n -a is equivalent to '-v -t *'\n -V to always use a virtual circuit\n"); exit(1); } while (c > 2 && v[1][0] == '-') { if (strcmp (v[1], "-w") == 0) { _res.retry = 1; _res.retrans = 15; waitmode = 1; v++; c--; } else if (strcmp (v[1], "-r") == 0) { _res.options &= ~RES_RECURSE; v++; c--; } else if (strcmp (v[1], "-d") == 0) { _res.options |= RES_DEBUG; v++; c--; } else if (strcmp (v[1], "-v") == 0) { verbose = 1; v++; c--; } else if (strcmp (v[1], "-l") == 0) { list = 1; v++; c--; } else if (strncmp (v[1], "-t", 2) == 0) { v++; c--; gettype = parsetype(v[1]); v++; c--; } else if (strncmp (v[1], "-c", 2) == 0) { v++; c--; getclass = parseclass(v[1]); v++; c--; } else if (strcmp (v[1], "-a") == 0) { verbose = 1; gettype = T_ANY; v++; c--; } else if (strcmp (v[1], "-V") == 0) { _res.options |= RES_USEVC; v++; c--; } } if (c > 2) { s = v[2]; server_specified++; if ((p = strchr(s, ':')) != NULL) *p++ = 0; isaddr = inet_aton(s, &addr); if (p != NULL) p[-1] = ':'; if (!isaddr) { hp = gethostbyname(s); if (hp == NULL) { fprintf(stderr,"Error in looking up server name:\n"); hperror(h_errno); exit(1); } _res.nsaddr= *(ipaddr_t *)hp->h_addr; printf("Using domain server:\n"); printanswer(hp); } else { _res.nsaddr_list[0]= addr; _res.nsport_list[0]= htons(NAMESERVER_PORT); printf("Using domain server %s", inet_ntoa(_res.nsaddr)); if (p != NULL) { printf(" on port %d", atoi(p)); _res.nsport_list[0]= htons(atoi(p)); } printf(":\n"); } } domain = v[1]; if (strcmp (domain, ".") != 0 && inet_aton(domain, &addr)) { static char ipname[sizeof("255.255.255.255.in-addr.arpa.")]; sprintf(ipname, "%d.%d.%d.%d.in-addr.arpa.", ((unsigned char *) &addr)[3], ((unsigned char *) &addr)[2], ((unsigned char *) &addr)[1], ((unsigned char *) &addr)[0]); domain = ipname; getdeftype = T_PTR; } hp = NULL; h_errno = TRY_AGAIN; /* * we handle default domains ourselves, thank you */ _res.options &= ~RES_DEFNAMES; if (list) exit(ListHosts(domain, gettype ? gettype : getdeftype)); oldcname = NULL; ncnames = 5; while (hp == NULL && h_errno == TRY_AGAIN) { cname = NULL; if (oldcname == NULL) hp = (struct hostent *)gethostinfo(domain); else hp = (struct hostent *)gethostinfo((char *)oldcname); if (cname) { if (ncnames-- == 0) { printf("Too many cnames. Possible loop.\n"); exit(1); } oldcname = cname; hp = NULL; h_errno = TRY_AGAIN; continue; } if (!waitmode) break; } if (hp == NULL) { hperror(h_errno); exit(1); } exit(0); } static int parsetype(s) char *s; { if (strcmp(s,"a") == 0) return(1); if (strcmp(s,"ns") == 0) return(2); if (strcmp(s,"md") == 0) return(3); if (strcmp(s,"mf") == 0) return(4); if (strcmp(s,"cname") == 0) return(5); if (strcmp(s,"soa") == 0) return(6); if (strcmp(s,"mb") == 0) return(7); if (strcmp(s,"mg") == 0) return(8); if (strcmp(s,"mr") == 0) return(9); if (strcmp(s,"null") == 0) return(10); if (strcmp(s,"wks") == 0) return(11); if (strcmp(s,"ptr") == 0) return(12); if (strcmp(s,"hinfo") == 0) return(13); if (strcmp(s,"minfo") == 0) return(14); if (strcmp(s,"mx") == 0) return(15); if (strcmp(s,"txt") == 0) /* Roy */ return(T_TXT); /* Roy */ if (strcmp(s,"uinfo") == 0) return(100); if (strcmp(s,"uid") == 0) return(101); if (strcmp(s,"gid") == 0) return(102); if (strcmp(s,"unspec") == 0) return(103); if (strcmp(s,"any") == 0) return(255); if (strcmp(s,"*") == 0) return(255); if (atoi(s)) return(atoi(s)); fprintf(stderr, "Invalid query type: %s\n", s); exit(2); } static int parseclass(s) char *s; { if (strcmp(s,"in") == 0) return(C_IN); if (strcmp(s,"chaos") == 0) return(C_CHAOS); if (strcmp(s,"hs") == 0) return(C_HS); if (strcmp(s,"any") == 0) return(C_ANY); if (atoi(s)) return(atoi(s)); fprintf(stderr, "Invalid query class: %s\n", s); exit(2); } static void printanswer(hp) register struct hostent *hp; { register char **cp; register ipaddr_t **hptr; printf("Name: %s\n", hp->h_name); printf("Address:"); for (hptr = (ipaddr_t **)hp->h_addr_list; *hptr; hptr++) printf(" %s", inet_ntoa(*(ipaddr_t *)*hptr)); printf("\nAliases:"); for (cp = hp->h_aliases; cp && *cp && **cp; cp++) printf(" %s", *cp); printf("\n\n"); } static void hperror(errno) int errno; { switch(errno) { case HOST_NOT_FOUND: fprintf(stderr,"Host not found.\n"); break; case TRY_AGAIN: fprintf(stderr,"Host not found, try agaFO��HO��IO��JO��KO��LO��MO��NO��OO��PO��QO��RO��SO��TO��UO��VO��WO��XO��YO��ZO��[O��\O��]O��^O��_O��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������in.\n"); break; case NO_RECOVERY: fprintf(stderr,"No recovery, Host not found.\n"); break; case NO_ADDRESS: fprintf(stderr,"There is an entry for this host, but it doesn't have what you requested.\n"); break; } } typedef union querybuf { dns_hdr_t qb1; u8_t qb2[PACKETSZ]; } querybuf_t; static u8_t hostbuf[BUFSIZ+1]; static int gethostinfo(name) char *name; { register char *cp, **domain; int n; int hp; int nDomain; if (strcmp(name, ".") == 0) return(getdomaininfo(name, NULL)); for (cp = name, n = 0; *cp; cp++) if (*cp == '.') n++; if (n && cp[-1] == '.') { if (cp[-1] == '.') cp[-1] = 0; hp = getdomaininfo(name, (char *)NULL); if (cp[-1] == 0) cp[-1] = '.'; return (hp); } if (n == 0 && (cp = __hostalias(name))) { if (verbose) printf("Aliased to \"%s\"\n", cp); _res.options |= RES_DEFNAMES; return (getdomaininfo(cp, (char *)NULL)); } #ifdef MAXDS for (nDomain = 0; _res.defdname_list[nDomain][0] != 0; nDomain++) { for (domain = _res.dnsrch_list[nDomain]; *domain; domain++) { if (verbose) printf("Trying domain \"%s\"\n", *domain); hp = getdomaininfo(name, *domain); if (hp) return (hp); } } #else for (domain = _res.dnsrch; *domain; domain++) { if (verbose) printf("Trying domain \"%s\"\n", *domain); hp = getdomaininfo(name, *domain); if (hp) return (hp); } #endif if (h_errno != HOST_NOT_FOUND || (_res.options & RES_DNSRCH) == 0) return (0); if (verbose) printf("Trying null domain\n"); return (getdomaininfo(name, (char *)NULL)); } static int getdomaininfo(name, domain) char *name, *domain; { int val1, val2; if (gettype) return getinfo(name, domain, gettype); else { val1 = getinfo(name, domain, getdeftype); if (cname || verbose || getdeftype != T_A) return val1; val2 = getinfo(name, domain, T_MX); return val1 || val2; } } static int getinfo(name, domain, type) char *name, *domain; { dns_hdr_t *hp; u8_t *eom, *bp, *cp; querybuf_t buf, answer; int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen; u_short pref, class; char host[2*MAXDNAME+2]; if (domain == NULL) (void)sprintf(host, "%.*s", MAXDNAME, name); else (void)sprintf(host, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain); n = res_mkquery(QUERY, host, getclass, type, (char *)NULL, 0, NULL, (char *)&buf, sizeof(buf)); if (n < 0) { if (_res.options & RES_DEBUG) printf("res_mkquery failed\n"); h_errno = NO_RECOVERY; return(0); } n = res_send((char *)&buf, n, (char *)&answer, sizeof(answer)); if (n < 0) { if (_res.options & RES_DEBUG) printf("res_send failed\n"); h_errno = TRY_AGAIN; return (0); } eom = (u8_t *)&answer + n; return(printinfo(&answer, eom, T_ANY, 0)); } static int printinfo(answer, eom, filter, isls) querybuf_t *answer; u8_t *eom; int filter; int isls; { dns_hdr_t *hp; u8_t *bp, *cp; int n, n1, i, j, nmx, ancount, nscount, arcount, qdcount, buflen; u_short pref, class; /* * find first satisfactory answer */ hp = (dns_hdr_t *) answer; ancount = ntohs(hp->dh_ancount); qdcount = ntohs(hp->dh_qdcount); nscount = ntohs(hp->dh_nscount); arcount = ntohs(hp->dh_arcount); if (_res.options & RES_DEBUG || (verbose && isls == 0)) printf("rcode = %d (%s), ancount=%d\n", hp->dh_flag2 & DHF_RCODE, DecodeError(hp->dh_flag2 & DHF_RCODE), ancount); if (hp->dh_flag2 & DHF_RCODE != NOERROR || (ancount+nscount+arcount) == 0) { switch (hp->dh_flag2 & DHF_RCODE) { case NXDOMAIN: /* Check if it's an authoritive answer */ if (hp->dh_flag1 & DHF_AA) { h_errno = HOST_NOT_FOUND; return(0); } else { h_errno = TRY_AGAIN; return(0); } case SERVFAIL: h_errno = TRY_AGAIN; return(0); #ifdef OLDJEEVES /* * Jeeves (TOPS-20 server) still does not * support MX records. For the time being, * we must accept FORMERRs as the same as * NOERROR. */ case FORMERR: #endif /* OLDJEEVES */ case NOERROR: /* TpB - set a return error for this case. NO_DATA */ h_errno = NO_DATA; return(0); /* was 1,but now indicates exception */ #ifndef OLDJEEVES case FORMERR: #endif /* OLDJEEVES */ case NOTIMP: case REFUSED: h_errno = NO_RECOVERY; return(0); } return (0); } bp = hostbuf; nmx = 0; buflen = sizeof(hostbuf); cp = (u8_t *)answer + sizeof(dns_hdr_t); if (qdcount) { cp += dn_skipname((u8_t *)cp,(u8_t *)eom) + QFIXEDSZ; while (--qdcount > 0) cp += dn_skipname((u8_t *)cp,(u8_t *)eom) + QFIXEDSZ; } if (ancount) { if (!(hp->dh_flag1 & DHF_AA)) if (verbose && isls == 0) printf("The following answer is not authoritative:\n"); while (--ancount >= 0 && cp && cp < eom) { cp = pr_rr(cp, (u8_t *)answer, stdout, filter); /* * When we ask for address and there is a CNAME, it seems to return * both the CNAME and the address. Since we trace down the CNAME * chain ourselves, we don't really want to print the address at * this point. */ if (cname && ! verbose) return (1); } } if (! verbose) return (1); if (nscount) { printf("For authoritative answers, see:\n"); while (--nscount >= 0 && cp && cp < eom) { cp = pr_rr(cp, (u8_t *)answer, stdout, filter); } } if (arcount) { printf("Additional information:\n"); while (--arcount >= 0 && cp && cp < eom) { cp = pr_rr(cp, (u8_t *)answer, stdout, filter); } } return(1); } static u8_t cnamebuf[MAXDNAME]; /* * Print resource record fields in human readable form. */ static u8_t * pr_rr(cp, msg, file, filter) u8_t *cp, *msg; FILE *file; int filter; { int type, class, dlen, n, c, proto, ttl; ipaddr_t inaddr; u8_t *cp1; struct protoent *protop; struct servent *servp; char punc; int doprint; u8_t name[MAXDNAME]; if ((cp = pr_cdname(cp, msg, name, sizeof(name))) == NULL) return (NULL); /* compression error */ type = _getshort(cp); cp += sizeof(u_short); class = _getshort(cp); cp += sizeof(u_short); ttl = _getlong(cp); cp += sizeof(u_long); if (filter == type || filter == T_ANY || (filter == T_A && (type == T_PTR || type == T_NS))) doprint = 1; else doprint = 0; if (doprint) if (verbose) fprintf(file,"%s\t%d%s\t%s", name, ttl, pr_class(class), pr_type(type)); else fprintf(file,"%s%s %s",name, pr_class(class), pr_type(type)); if (verbose) punc = '\t'; else punc = ' '; dlen = _getshort(cp); cp += sizeof(u_short); cp1 = cp; /* * Print type specific data, if appropriate */ switch (type) { case T_A: switch (class) { case C_IN: bcopy((char *)cp, (char *)&inaddr, sizeof(inaddr)); if (dlen == 4) { if (doprint) fprintf(file,"%c%s", punc, inet_ntoa(inaddr)); cp += dlen; } else if (dlen == 7) { if (doprint) { fprintf(file,"%c%s", punc, inet_ntoa(inaddr)); fprintf(file,", protocol = %d", cp[4]); fprintf(file,", port = %d", (cp[5] << 8) + cp[6]); } cp += dlen; } break; } break; case T_CNAME: if (dn_expand(msg, msg + 512, cp, cnamebuf, sizeof(cnamebuf)-1) >= 0) { strcat((char *) cnamebuf, "."); if (gettype != T_CNAME && gettype != T_ANY) cname = cnamebuf; } case T_MB: #ifdef OLDRR case T_MD: case T_MF: #endif /* OLDRR */ case T_MG: case T_MR: case T_NS: case T_PTR: cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file,"%c%s",punc, name); break; case T_HINFO: if (n = *cp++) { if (doprint) fprintf(file,"%c%.*s", punc, n, cp); cp += n; } if (n = *cp++) { if (doprint) fprintf(file,"%c%.*s", punc, n, cp); cp += n; } break; case T_SOA: cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file,"\t%s", name); cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file," %s", name); if (doprint) fprintf(file,"(\n\t\t\t%ld\t;serial (version)", _getlong(cp)); cp += sizeof(u_long); if (doprint) fprintf(file,"\n\t\t\t%ld\t;refresh period", _getlong(cp)); cp += sizeof(u_long); if (doprint) fprintf(file,"\n\t\t\t%ld\t;retry refresh this often", _getlong(cp)); cp += sizeof(u_long); if (doprint) fprintf(file,"\n\t\t\t%ld\t;expiration period", _getlong(cp)); cp += sizeof(u_long); if (doprint) fprintf(file,"\n\t\t\t%ld\t;minimum TTL\n\t\t\t)", _getlong(cp)); cp += sizeof(u_long); break; case T_MX: if (doprint) if (verbose) fprintf(file,"\t%d ",_getshort(cp)); else fprintf(file," (pri=%d) by ",_getshort(cp)); cp += sizeof(u_short); cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file, "%s", name); break; case T_MINFO: cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file,"%c%s",punc, name); cp = pr_cdname(cp, msg, name, sizeof(name)); if (doprint) fprintf(file," %s", name); break; /* Roy start */ case T_TXT: if (n = *cp++) { if (doprint) fprintf(file,"%c%.*s", punc, n, cp); cp += n; } break; /* Roy end */ case T_UINFO: if (doprint) fprintf(file,"%c%s", punc, cp); cp += dlen; break; case T_UID: case T_GID: if (dlen == 4) { if (doprint) fprintf(file,"%c%ld", punc, _getlong(cp)); cp += sizeof(int); } break; case T_WKS: if (dlen < sizeof(u_long) + 1) break; bcopy((char *)cp, (char *)&inaddr, sizeof(inaddr)); cp += sizeof(u_long); proto = *cp++; protop = getprotobynumber(proto); if (doprint) if (protop) fprintf(file,"%c%s %s", punc, inet_ntoa(inaddr), protop->p_name); else fprintf(file,"%c%s %d", punc, inet_ntoa(inaddr), proto); n = 0; while (cp < cp1 + dlen) { c = *cp++; do { if (c & 0200) { servp = NULL; if (protop) servp = getservbyport (htons(n), protop->p_name); if (doprint) if (servp) fprintf(file, " %s", servp->s_name); else fprintf(file, " %d", n); } c <<= 1; } while (++n & 07); } break; default: if (doprint) fprintf(file,"%c???", punc); cp += dlen; } if (cp != cp1 + dlen) fprintf(file,"packet size error (%#x != %#x)\n", cp, cp1+dlen); if (doprint) fprintf(file,"\n"); return (cp); } static char nbuf[20]; /* * Return a string for the type */ static char * pr_type(type) int type; { switch (type) { case T_A: return(verbose? "A" : "has address"); case T_NS: /* authoritative server */ return("NS"); #ifdef OLDRR case T_MD: /* mail destination */ return("MD"); case T_MF: /* mail forwarder */ return("MF"); #endif /* OLDRR */ case T_CNAME: /* connonical name */ return(verbose? "CNAME" : "is a nickname for"); case T_SOA: /* start of authority zone */ return("SOA"); case T_MB: /* mailbox domain name */ return("MB"); case T_MG: /* mail group member */ return("MG"); case T_MX: /* mail routing info */ return(verbose? "MX" : "mail is handled"); /* Roy start */ case T_TXT: /* TXT - descriptive info */ return(verbose? "TXT" : "descriptive text"); /* Roy end */ case T_MR: /* mail rename name */ return("MR"); case T_NULL: /* null resource record */ return("NULL"); case T_WKS: /* well known service */ return("WKS"); case T_PTR: /* domain name pointer */ return("PTR"); case T_HINFO: /* host information */ return("HINFO"); case T_MINFO: /* mailbox information */ return("MINFO"); case T_AXFR: /* zone transfer */ return("AXFR"); case T_MAILB: /* mail box */ return("MAILB"); case T_MAILA: /* mail address */ return("MAILA"); case T_ANY: /* matches any type */ return("ANY"); case T_UINFO: return("UINFO"); case T_UID: return("UID"); case T_GID: return("GID"); default: return (sprintf(nbuf, "%d", type) == EOF ? NULL : nbuf); } } /* * Return a mnemonic for class */ static char * pr_class(class) int class; { switch (class) { case C_IN: /* internet class */ return(verbose? " IN" : ""); case C_CHAOS: /* chaos class */ return(verbose? " CHAOS" : ""); case C_HS: /* Hesiod class */ return(verbose? " HS" : ""); case C_ANY: /* matches any class */ return(" ANY"); default: return (sprintf(nbuf," %d", class) == EOF ? NULL : nbuf); } } static u8_t * pr_cdname(cp, msg, name, namelen) u8_t *cp, *msg; u8_t *name; int namelen; { int n; if ((n = dn_expand(msg, msg + 512, cp, name, namelen - 2)) < 0) return (NULL); if (name[0] == '\0') { name[0] = '.'; name[1] = '\0'; } return (cp + n); } char *resultcodes[] = { "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED", "6", "7", "8", "9", "10", "11", "12", "13", "14", "NOCHANGE", }; /* ****************************************************************************** * * ListHosts -- * * Requests the name server to do a zone transfer so we * find out what hosts it knows about. * * Results: * SUCCESS the listing was successful. * ERROR the server could not be contacted because * a socket could not be obtained or an error * occured while receiving, or the output file * could not be opened. * ****************************************************************************** */ static int ListHosts(namePtr, queryType) char *namePtr; int queryType; /* e.g. T_A */ { querybuf_t buf, answer; dns_hdr_t *headerPtr; int msglen; int amtToRead; int numRead; int i; int numAnswers = 0; int result; int soacnt = 0; u_short len; int dlen; int type; int nscount; u8_t *cp, *nmp; u8_t name[NAME_LEN]; char dname[2][NAME_LEN]; u8_t domain[NAME_LEN]; /* names and addresses of name servers to try */ #define NUMNS 8 char nsname[NUMNS][NAME_LEN]; int nshaveaddr[NUMNS]; #define IPADDRSIZE 4 #define NUMNSADDR 16 char nsipaddr[NUMNSADDR][IPADDRSIZE]; int numns; int numnsaddr; int thisns; struct hostent *hp; enum { NO_ERRORS, ERR_READING_LEN, ERR_READING_MSG, ERR_PRINTING } error = NO_ERRORS; char *tcp_serv_name; int tcp_fd; nwio_tcpconf_t tcpconf; nwio_tcpcl_t clopt; int terrno; /* * normalize to not have trailing dot. We do string compares below * of info from name server, and it won't have trailing dots. */ i = strlen(namePtr); if (namePtr[i-1] == '.') namePtr[i-1] = 0; if (server_specified) { bcopy((char *)&_res.nsaddr, nsipaddr[0], IPADDRSIZE); numnsaddr = 1; } else { /* * First we have to find out where to look. This needs a NS query, * possibly followed by looking up addresses for some of the names. */ msglen = res_mkquery(QUERY, namePtr, C_IN, T_NS, (char *)0, 0, (struct rrec *)0, (char *)&buf, sizeof(buf)); if (msglen < 0) { printf("res_mkquery failed\n"); return (ERROR); } msglen = res_send((char *)&buf,msglen,(char *)&answer, sizeof(answer)); if (msglen < 0) { printf("Unable to get to nameserver -- try again later\n"); return (ERROR); } if (_res.options & RES_DEBUG || verbose) printf("rcode = %d (%s), ancount=%d\n", answer.qb1.dh_flag2 & DHF_RCODE, DecodeError(answer.qb1.dh_flag2 & DHF_RCODE), ntohs(answer.qb1.dh_ancount)); /* * Analyze response to our NS lookup */ nscount = ntohs(answer.qb1.dh_ancount) + ntohs(answer.qb1.dh_nscount) + ntohs(answer.qb1.dh_arcount); if (answer.qb1.dh_flag2 & DHF_RCODE != NOERROR || nscount == 0) { switch (answer.qb1.dh_flag2 & DHF_RCODE) { case NXDOMAIN: /* Check if it's an authoritive answer */ if (answer.qb1.dh_flag1 & DHF_AA) { printf("No such domain\n"); } else { printf("Unable to get information about domain -- try again later.\n"); } break; case SERVFAIL: printf("Unable to get information about that domain -- try again later.\n"); break; case NOERROR: printf("That domain exists, but seems to be a leaf node.\n"); break; case FORMERR: case NOTIMP: case REFUSED: printf("Unrecoverable error looking up domain name.\n"); break; } return (0); } cp = answer.qb2 + sizeof(dns_hdr_t); if (ntohs(answer.qb1.dh_qdcount) > 0) cp += dn_skipname(cp, answer.qb2 + msglen) + QFIXEDSZ; numns = 0; numnsaddr = 0; /* * Look at response from NS lookup for NS and A records. */ for (;nscount; nscount--) { cp += dn_expand(answer.qb2, answer.qb2 + msglen, cp, domain, sizeof(domain)); type = _getshort(cp); cp += sizeof(u_short) + sizeof(u_short) + sizeof(u_long); dlen = _getshort(cp); cp += sizeof(u_short); if (type == T_NS) { if (dn_expand(answer.qb2, answer.qb2 + msglen, cp, name, sizeof(name)) >= 0) { if (numns < NUMNS && strcasecmp((char *)domain, namePtr) == 0) { for (i = 0; i < numns; i++) if (strcasecmp(nsname[i], (char *)name) == 0) break; /* duplicate */ if (i >= numns) { strncpy(nsname[numns], (char *)name, sizeof(name)); nshaveaddr[numns] = 0; numns++; } } } } else if (type == T_A) { if (numnsaddr < NUMNSADDR) for (i = 0; i < numns; i++) { if (strcasecmp(nsname[i], (char *)domain) == 0) { nshaveaddr[i]++; bcopy((char *)cp, nsipaddr[numnsaddr],IPADDRSIZE); numnsaddr++; break; } } } cp += dlen; } /* * Usually we'll get addresses for all the servers in the additional * info section. But in case we don't, look up their addresses. */ for (i = 0; i < numns; i++) { if (! nshaveaddr[i]) { register long **hptr; int numaddrs = 0; hp = gethostbyname(nsname[i]); if (hp) { for (hptr = (long **)hp->h_addr_list; *hptr; hptr++) if (numnsaddr < NUMNSADDR) { bcopy((char *)*hptr, nsipaddr[numnsaddr],IPADDRSIZE); numnsaddr++; numaddrs++; } } if (_res.options & RES_DEBUG || verbose) printf("Found %d addresses for %s by extra query\n", numaddrs, nsname[i]); } else if (_res.options & RES_DEBUG || verbose) printf("Found %d addresses for %s\n", nshaveaddr[i], nsname[i]); } } /* * Now nsipaddr has numnsaddr addresses for name servers that * serve the requested domain. Now try to find one that will * accept a zone transfer. */ thisns = 0; again: numAnswers = 0; soacnt = 0; /* * Create a query packet for the requested domain name. * */ msglen = res_mkquery(QUERY, namePtr, getclass, T_AXFR, (char *)0, 0, (struct rrec *)0, (char *) &buf, sizeof(buf)); if (msglen < 0) { if (_res.options & RES_DEBUG) { fprintf(stderr, "ListHosts: Res_mkquery failed\n"); } return (ERROR); } /* * Set up a virtual circuit to the server. */ tcp_serv_name= getenv("TCP_DEVICE"); if (!tcp_serv_name) tcp_serv_name= TCP_DEVICE; for (;thisns < numnsaddr; thisns++) { tcp_fd= open(tcp_serv_name, O_RDWR); if (tcp_fd == -1) { fprintf(stderr, "unable to open '%s': %s\n", tcp_serv_name, strerror(errno)); return ERROR; } tcpconf.nwtc_flags= NWTC_EXCL | NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr= *(ipaddr_t *)nsipaddr[thisns]; tcpconf.nwtc_remport= _res.nsport_list[0]; result= ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf); if (result == -1) { fprintf(stderr, "tcp_ioc_setconf failed: %s\n", strerror(errno)); close(tcp_fd); return ERROR; } if (_res.options & RES_DEBUG || verbose) printf("Trying %s\n", inet_ntoa(tcpconf.nwtc_remaddr)); clopt.nwtcl_flags= 0; result= ioctl(tcp_fd, NWIOTCPCONN, &clopt); if (result == 0) break; terrno= errno; if (verbose) fprintf(stderr, "Connection failed, trying next server: %s\n", strerror(errno)); close(tcp_fd); } if (thisns >= numnsaddr) { printf("No server for that domain responded\n"); if (!verbose) fprintf(stderr, "Error from the last server was: %s\n", strerror(terrno)); return(ERROR); } /* * Send length & message for zone transfer */ len = htons(msglen); result= tcpip_writeall(tcp_fd, (char *)&len, sizeof(len)); if (result != sizeof(len)) { fprintf(stderr, "write failed: %s\n", strerror(errno)); close(tcp_fd); return ERROR; } result= tcpip_writeall(tcp_fd, (char *)&buf, msglen); if (result != msglen) { fprintf(stderr, "write failed: %s\n", strerror(errno)); close(tcp_fd); return ERROR; } filePtr = stdout; while (1) { /* * Read the length of the response. */ cp = (u8_t *) &buf; amtToRead = sizeof(u_short); while(amtToRead > 0) { result = read(tcp_fd, (char *)cp, amtToRead); if (result <= 0) break; cp += result; amtToRead -= result; } if (amtToRead) { error = ERR_READING_LEN; break; } if ((len = htons(*(u_short *)&buf)) == 0) { break; /* nothing left to read */ } /* * Read the response. */ amtToRead = len; cp = (u8_t *) &buf; while(amtToRead > 0) { result = read(tcp_fd, (char *)cp, amtToRead); if (result<= 0) break; cp += result; amtToRead -= result; } if (amtToRead) { error = ERR_READING_MSG; break; } i = buf.qb1.dh_flag2 & DHF_RCODE; if (i != NOERROR || ntohs(buf.qb1.dh_ancount) == 0) { if ((thisns+1) < numnsaddr && (i == SERVFAIL || i == NOTIMP || i == REFUSED)) { if (_res.options & RES_DEBUG || verbose) printf("Server failed, trying next server: %s\n", i != NOERROR ? DecodeError(i) : "Premature end of data"); close(tcp_fd); thisns++; goto again; } printf("Server failed: %s\n", i != NOERROR ? DecodeError(i) : "Premature end of data"); break; } result = printinfo(&buf, cp, queryType, 1); if (! result) { error = ERR_PRINTING; break; } numAnswers++; cp = buf.qb2 + sizeof(dns_hdr_t); if (ntohs(buf.qb1.dh_qdcount) > 0) cp += dn_skipname(cp, buf.qb2 + len) + QFIXEDSZ; nmp = cp; cp += dn_skipname(cp, (u_char *)&buf + len); if ((_getshort(cp) == T_SOA)) { dn_expand(buf.qb2, buf.qb2 + len, nmp, (u8_t *)dname[soacnt], sizeof(dname[0])); if (soacnt) { if (strcmp(dname[0], dname[1]) == 0) break; } else soacnt++; } } close(tcp_fd); switch (error) { case NO_ERRORS: return (SUCCESS); case ERR_READING_LEN: return(ERROR); case ERR_PRINTING: fprintf(stderr,"*** Error during listing of %s: %s\n", namePtr, DecodeError(result)); return(result); case ERR_READING_MSG: headerPtr = (dns_hdr_t *) &buf; fprintf(stderr,"ListHosts: error receiving zone transfer:\n"); fprintf(stderr, " result: %s, answers = %d, authority = %d, additional = %d\n", resultcodes[headerPtr->dh_flag2 & DHF_RCODE], ntohs(headerPtr->dh_ancount), ntohs(headerPtr->dh_nscount), ntohs(headerPtr->dh_arcount)); return(ERROR); default: return(ERROR); } } static char * DecodeError(result) int result; { switch(result) { case NOERROR: return("Success"); break; case FORMERR: return("Format error"); break; case SERVFAIL: return("Server failed"); break; case NXDOMAIN: return("Non-existent domain"); break; case NOTIMP: return("Not implemented"); break; case REFUSED: return("Query refused"); break; case NOCHANGE: return("No change"); break; case NO_INFO: return("No information"); break; case ERROR: return("Unspecified error"); break; case TIME_OUT: return("Timed out"); break; case NONAUTH: return("Non-authoritative answer"); break; default: break; } return("BAD ERROR VALUE"); } static int tcpip_writeall(fd, buf, siz) int fd; char *buf; unsigned siz; { unsigned siz_org; int nbytes; siz_org= siz; while (siz) { nbytes= write(fd, buf, siz); if (nbytes == -1) return nbytes; assert(siz >= nbytes); buf += nbytes; siz -= nbytes; } return siz_org; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* hostaddr.c Fetch an ip and/or ethernet address and print it on one line. Created: Jan 27, 1992 by Philip Homburg */ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/utsname.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/ether.h> #include <net/gen/eth_io.h> #include <net/gen/if_ether.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/ip_io.h> #include <net/gen/netdb.h> #include <net/gen/socket.h> #include <net/gen/nameser.h> #include <net/gen/resolv.h> #include <net/gen/dhcp.h> char *prog_name; char DHCPCACHE[]="/usr/adm/dhcp.cache"; void main _ARGS(( int argc, char *argv[] )); void usage _ARGS(( void )); void main(argc, argv) int argc; char *argv[]; { int c; int first_print; int a_flag, e_flag, i_flag, h_flag; char *E_arg, *I_arg; int do_ether, do_ip, do_asc_ip, do_hostname; char *eth_device, *ip_device; int eth_fd, ip_fd; int result; nwio_ethstat_t nwio_ethstat; nwio_ipconf_t nwio_ipconf; struct hostent *hostent; char *hostname, *domain; char nodename[2*256]; dhcp_t dhcp; first_print= 1; prog_name= argv[0]; a_flag= e_flag= i_flag= 0; E_arg= I_arg= NULL; while((c= getopt(argc, argv, "?aheE:iI:")) != -1) { switch(c) { case '?': usage(); case 'a': if (a_flag) usage(); a_flag= 1; break; case 'h': if (h_flag) usage(); h_flag= 1; break; case 'e': if (e_flag) usage(); e_flag= 1; break; case 'E': if (E_arg) usage(); E_arg= optarg; break; case 'i': if (i_flag) usage(); i_flag= 1; break; case 'I': if (I_arg) usage(); I_arg= optarg; break; default: usage(); } } if(optind != argc) usage(); do_ether= e_flag; if (E_arg) eth_device= E_arg; else { eth_device= getenv("ETH_DEVICE"); if (!eth_device) eth_device= ETH_DEVICE; } do_ip= i_flag; do_asc_ip= a_flag; do_hostname= h_flag; if (I_arg) ip_device= I_arg; else { ip_device= getenv("IP_DEVICE"); if (!ip_device) ip_device= IP_DEVICE; } if (!do_ether && !do_ip && !do_asc_ip && !do_hostname) do_ether= do_ip= do_asc_ip= 1; if (do_ether) { eth_fd= open(eth_device, O_RDWR); if (eth_fd == -1) { fprintf(stderr, "%s: Unable to open '%s': %s\n", prog_name, eth_device, strerror(errno)); exit(1); } result= ioctl(eth_fd, NWIOGETHSTAT, &nwio_ethstat); if (result == -1) { fprintf(stderr, "%s: Unable to fetch ethernet address: %s\n", prog_name, strerror(errno)); exit(1); } printf("%s%s", first_print ? "" : " ", ether_ntoa(&nwio_ethstat.nwes_addr)); first_print= 0; } if (do_ip || do_asc_ip || do_hostname) { ip_fd= open(ip_device, O_RDWR); if (ip_fd == -1) { fprintf(stderr, "%s: Unable to open '%s': %s\n", prog_name, ip_device, strerror(errno)); exit(1); } result= ioctl(ip_fd, NWIOGIPCONF, &nwio_ipconf); if (result == -1) { fprintf(stderr, "%s: Unable to fetch IP address: %s\n", prog_name, strerror(errno)); exit(1); } } setuid(getuid()); if (do_ip) { printf("%s%s", first_print ? "" : " ", inet_ntoa(nwio_ipconf.nwic_ipaddr)); first_print= 0; } if (do_asc_ip || do_hostname) { int fd; int r; dhcp_t d; u8_t *data; size_t hlen, dlen; hostname= NULL; domain= NULL; /* Use a reverse DNS lookup to get the host name. This is * the preferred method, but often fails due to lazy admins. */ hostent= gethostbyaddr((char *)&nwio_ipconf.nwic_ipaddr, sizeof(nwio_ipconf.nwic_ipaddr), AF_INET); if (hostent != NULL) hostname= hostent->h_name; if (hostname != NULL) { /* Reverse DNS works. */ } else if ((fd= open(DHCPCACHE, O_RDONLY)) == -1) { if (errno != ENOENT) { fprintf(stderr, "%s: %s: %s\n", prog_name, DHCPCACHE, strerror(errno)); exit(1); } } else { /* Try to get the hostname from the DHCP data. */ while ((r= read(fd, &d, sizeof(d))) == sizeof(d)) { if (d.yiaddr == nwio_ipconf.nwic_ipaddr) break; } if (r < 0) { fprintf(stderr, "%s: %s: %s\n", prog_name, DHCPCACHE, strerror(errno)); exit(1); } close(fd); if (r == sizeof(d)) { if (dhcp_gettag(&d, DHCP_TAG_HOSTNAME, &data, &hlen)) hostname= (char *) data; if (dhcp_gettag(&d, DHCP_TAG_DOMAIN, &data, &dlen)) domain= (char *) data; if (hostname != NULL) hostname[hlen] = 0; if (domain != NULL) domain[dlen] = 0; } } if (hostname != NULL) { if (strchr(hostname, '.') != NULL) { domain= strchr(hostname, '.'); *domain++ = 0; } } else { /* No host name anywhere. Use the IP address. */ hostname= inet_ntoa(nwio_ipconf.nwic_ipaddr); domain= NULL; } strcpy(nodename, hostname); if (domain != NULL) { strcat(nodename, "."); strcat(nodename, domain); } } if (do_asc_ip) { printf("%s%s", first_print ? "" : " ", nodename); first_print= 0; } if (do_hostname) { #if __minix_vmd if (sysuname(_UTS_SET, _UTS_NODENAME, nodename, strlen(nodename)+1) == -1) { fprintf(stderr, "%s: Unable to set nodename: %s\n", prog_name, strerror(errno)); exit(1); } if (sysuname(_UTS_SET, _UTS_HOSTNAME, hostname, strlen(hostname)+1) == -1) { fprintf(stderr, "%s: Unable to set hostname: %s\n", prog_name, strerror(errno)); exit(1); } #else FILE *fp; if ((fp= fopen("/etc/hostname.file", "w")) == NULL || fprintf(fp, "%s\n", nodename) == EOF || fclose(fp) == EOF) { fprintf(stderr, "%s: /etc/hostname.file: %s\n", prog_name, strerror(errno)); exit(1); } #endif } if (!first_print) printf("\n"); exit(0); } void usage() { fprintf(stderr, "Usage: %s -[eiah] [-E <eth-device>] [-I <ip-device>]\n", prog_name); exit(1); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* id - return uid and gid Author: John J. Marco */ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/ /* ----- id.c ----- */ /* Id - get real and effective user id and group id */ /* Author: John J. Marco */ /* pa1343@sdcc15.ucsd.edu */ /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ #include <sys/types.h> #include <pwd.h> #include <grp.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (void)); int main() { struct passwd *pwd; struct group *grp; int uid, gid, euid, egid; uid = getuid(); gid = getgid(); euid = geteuid(); egid = getegid(); if ((pwd = getpwuid(uid)) == NULL) printf("%s%d%s", "uid=", uid, " "); else printf("%s%d%s%s%s", "uid=", uid, "(", pwd->pw_name, ") "); if ((grp = getgrgid(gid)) == NULL) printf("%s%d%s", "gid=", gid, " "); else printf("%s%d%s%s%s", "gid=", gid, "(", grp->gr_name, ") "); if (uid != euid) if ((pwd = getpwuid(euid)) != NULL) printf("%s%d%s%s%s", "euid=", euid, "(", pwd->pw_name, ") "); else printf("%s%d%s", "euid=", euid, " "); if (gid != egid) if ((grp = getgrgid(egid)) != NULL) printf("%s%d%s%s%s", "egid=", egid, "(", grp->gr_name, ") "); else printf("%s%d%s", "egid=", egid, " "); printf("\n"); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ifconfig.c���� ifdef.c������� in.fingerd.c�� in.rshd.c����� install.c����� irdpd.c������� isoread.c����� join.c�������� kill.c�������� last.c�������� leave.c�������� life.c�������� login.c������� look.c�������� lp.c���������� lpd.c��������� ls.c���������� mail.c�������� man.c��������� mesg.c�������� mkdir.c������� mkfifo.c������ mkfs.c�������� mknod.c������� mkproto.c����� modem.c������� mount.c������� mt.c���������� nm.c���������� od.c���������� passwd.c������ paste.c������� ping.c�������� pr.c���������� pr_routes.c��� prep.c�������� printroot.c��� proto.c������� pwd.c��������� pwdauth.c����� rarpd.c������� rcp.c��������� readall.c����� readfs.c������! remsync.c�����" rlogin.c������# rmdir.c�������$ rsh.c���������% sed.c���������& shar.c��������' size.c��������( sleep.c�������) slip.c��������* sort.c��������+ split.c�������, strings.c�����- strip.c�������. stty.c��������/ su.c����������0 sum.c���������1 swapfs.c������2 sync.c��������3 synctree.c����4 tail.c��������/* ifconfig.c */ #define _POSIX_C_SOURCE 2 #include <sys/types.h> #include <assert.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/ip_io.h> #include <net/gen/inet.h> #if __STDC__ #define PROTO(x,y) x y #else #define PROTO(x,y) x() #endif static PROTO (void usage, (void) ); static PROTO (void set_hostaddr, (int ip_fd, char *host_s, int ins) ); static PROTO (void set_netmask, (int ip_fd, char *net_s, int ins) ); static PROTO (void set_mtu, (int ip_fd, char *mtu_s) ); static PROTO (int check_ipaddrset, (int ip_fd) ); static PROTO (int check_netmaskset, (int ip_fd) ); static PROTO (int get_ipconf, (int ip_fd, struct nwio_ipconf *ref_ipconf) ); PROTO (int main, (int argc, char *argv[]) ); char *prog_name; main(argc, argv) int argc; char *argv[]; { char *device_s, *hostaddr_s, *mtu_s, *netmask_s, **arg_s; int ins; int c, ip_fd, ifno; struct nwio_ipconf ipconf; int i_flag, v_flag, a_flag, modify; char *d_arg, *h_arg, *m_arg, *n_arg; prog_name= argv[0]; d_arg= NULL; h_arg= NULL; m_arg= NULL; n_arg= NULL; i_flag= 0; v_flag= 0; a_flag= 0; while ((c= getopt(argc, argv, "?I:h:m:n:iva")) != -1) { switch(c) { case '?': usage(); case 'I': if (d_arg) usage(); d_arg= optarg; break; case 'h': if (h_arg) usage(); h_arg= optarg; break; case 'm': if (m_arg) usage(); m_arg= optarg; break; case 'n': if (n_arg) usage(); n_arg= optarg; break; case 'i': if (i_flag) usage(); i_flag= 1; break; case 'v': if (v_flag) usage(); v_flag= 1; break; case 'a': if (a_flag) usage(); a_flag= 1; break; default: fprintf(stderr, "%s: getopt failed: '%c'\n", prog_name, c); exit(1); } } modify = (h_arg != NULL || n_arg != NULL || m_arg != NULL); if (a_flag && modify) usage(); if (!modify) v_flag= 1; if (modify) setuid(getuid()); if (optind != argc) usage(); hostaddr_s= h_arg; mtu_s= m_arg; netmask_s= n_arg; ins= i_flag; ifno= 0; do { if (!a_flag) { device_s= d_arg; if (device_s == NULL) device_s= getenv("IP_DEVICE"); if (device_s == NULL) device_s= IP_DEVICE; } else { static char device[sizeof("/dev/ip99")]; sprintf(device, "/dev/ip%d", ifno); device_s= device; } ip_fd= open (device_s, O_RDWR); if (ip_fd<0) { if (a_flag && (errno == ENOENT || errno == ENXIO)) continue; fprintf(stderr, "%s: Unable to open '%s': %s\n", prog_name, device_s, strerror(errno)); exit(1); } if (hostaddr_s) set_hostaddr(ip_fd, hostaddr_s, ins); if (netmask_s) set_netmask(ip_fd, netmask_s, ins); if (mtu_s) set_mtu(ip_fd, mtu_s); if (v_flag) { if (!get_ipconf(ip_fd, &ipconf)) { if (!a_flag) { fprintf(stderr, "%s: %s: Host address not set\n", prog_name, device_s); exit(1); } } else { printf("%s: address %s", device_s, inet_ntoa(ipconf.nwic_ipaddr)); if (ipconf.nwic_flags & NWIC_NETMASK_SET) { printf(" netmask %s", inet_ntoa(ipconf.nwic_netmask)); } #ifdef NWIC_MTU_SET if (ipconf.nwic_mtu) printf(" mtu %u", ipconf.nwic_mtu); #endif fputc('\n', stdout); } } close(ip_fd); } while (a_flag && ++ifno < 16); exit(0); } static void set_hostaddr (ip_fd, hostaddr_s, ins) int ip_fd; char *hostaddr_s; int ins; { ipaddr_t ipaddr; struct nwio_ipconf ipconf; int result; ipaddr= inet_addr (hostaddr_s); if (ipaddr == (ipaddr_t)(-1)) { fprintf(stderr, "%s: Invalid host address (%s)\n", prog_name, hostaddr_s); exit(1); } if (ins && check_ipaddrset(ip_fd)) return; ipconf.nwic_flags= NWIC_IPADDR_SET; ipconf.nwic_ipaddr= ipaddr; result= ioctl(ip_fd, NWIOSIPCONF, &ipconf); if (result<0) { fprintf(stderr, "%s: Unable to set IP configuration: %s\n", prog_name, strerror(errno)); exit(1); } } static int check_ipaddrset (ip_fd) int ip_fd; { struct nwio_ipconf ipconf; if (!get_ipconf(ip_fd, &ipconf)) return 0; assert (ipconf.nwic_flags & NWIC_IPADDR_SET); return 1; } static int get_ipconf (ip_fd, ref_ipaddr) int ip_fd; struct nwio_ipconf *ref_ipaddr; { int flags; int error, result; nwio_ipconf_t ipconf; flags= fcntl(ip_fd, F_GETFL); fcntl(ip_fd, F_SETFL, flags | O_NONBLOCK); result= ioctl (ip_fd, NWIOGIPCONF, &ipconf); error= errno; fcntl(ip_fd, F_SETFL, flags); if (result <0 && error != EAGAIN) { errno= error; fprintf(stderr, "%s: Unable to get IP configuration: %s\n", prog_name, strerror(errno)); exit(1); } if (result == 0) { *ref_ipaddr = ipconf; } return result>=0; } static void usage() { fprintf(stderr, "Usage: %s [-I ip-device] [-h ipaddr] [-n netmask] [-m mtu] [-iva]\n", prog_name); exit(1); } static void set_netmask (ip_fd, netmask_s, ins) int ip_fd; char *netmask_s; int ins; { ipaddr_t netmask; struct nwio_ipconf ipconf; int result; netmask= inet_addr (netmask_s); if (netmask == (ipaddr_t)(-1)) { fprintf(stderr, "%s: Invalid netmask (%s)\n", prog_name, netmask_s); exit(1); } if (ins && check_netmaskset(ip_fd)) return; ipconf.nwic_flags= NWIC_NETMASK_SET; ipconf.nwic_netmask= netmask; result= ioctl(ip_fd, NWIOSIPCONF, &ipconf); if (result<0) { fprintf(stderr, "%s: Unable to set IP configuration: %s\n", prog_name, strerror(errno)); exit(1); } } static void set_mtu (ip_fd, mtu_s) int ip_fd; char *mtu_s; { ipaddr_t netmask; int result; long mtu; char *check; struct nwio_ipconf ipconf; mtu= strtol (mtu_s, &check, 0); if (check[0] != '\0') { fprintf(stderr, "%s: Invalid mtu (%s)\n", prog_name, mtu_s); exit(1); } #ifdef NWIC_MTU_SET ipconf.nwic_flags= NWIC_MTU_SET; ipconf.nwic_mtu= mtu; result= ioctl(ip_fd, NWIOSIPCONF, &ipconf); if (result<0) { fprintf(stderr, "%s: Unable to set IP configuration: %s\n", prog_name, strerror(errno)); exit(1); } #endif } static int check_netmaskset (ip_fd) int ip_fd; { struct nwio_ipconf ipconf; if (!get_ipconf(ip_fd, &ipconf)) { fprintf(stderr, "%s: Unable to determine if netmask is set, please set IP address first\n", prog_name); exit(1); } return (ipconf.nwic_flags & NWIC_NETMASK_SET); } /* * $PchId: ifconfig.c,v 1.7 2001/02/21 09:19:52 philip Exp $ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ifdef - remove #ifdefs Author: Warren Toomey */ /* Copyright 1989 by Warren Toomey wkt@cs.adfa.oz.au[@uunet.uu.net] * * You may freely copy or distribute this code as long as this notice * remains intact. * * You may modify this code, as long as this notice remains intact, and * you add another notice indicating that the code has been modified. * * You may NOT sell this code or in any way profit from this code without * prior agreement from the author. */ #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> /* Definition of structures and constants used in ifdef.c */ /* Types of symbols */ #define DEF 1 /* Symbol is defined */ #define UNDEF 2 /* Symbol isn't defined */ #define IGN 3 /* Ignore this symbol unless defined */ /* Redef mode values */ #define MUTABLE 1 /* Symbol can change defined <-> undefined */ #define IMMUTABLE 2 /* Symbol can't change as above */ /* Processing modes */ #define NO 0 /* Don't process */ #define YES 1 /* Process */ /* Ignore (IGN), ignore but process */ struct DEFINE { char *symbol; /* SLL of defined symbols. The redef */ char type; /* field indicates if this symbol can */ char redef; /* change from defined <-> undefined. */ struct DEFINE *next; /* Type is DEF or UNDEF. */ }; /* Global variables & structures */ FILE *zin; /* Input file for processing */ struct DEFINE *defptr; /* Defined symbols SLL */ struct DEFINE *defend; /* Ptr to last node in defptr */ struct DEFINE *deftemp; /* Ptr to last found node */ int line = 1; /* Current line number */ int table = 0; /* Don't normally want a table */ extern int optind; extern char *optarg; /* Prototypes. */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char fgetarg, (FILE *stream, char *cbuf)); _PROTOTYPE(int find, (char *symd)); _PROTOTYPE(void defit, (char *sym, int redef, int typed)); _PROTOTYPE(void stop, (void)); _PROTOTYPE(void gotoeoln, (void)); _PROTOTYPE(void prteoln, (void)); _PROTOTYPE(void printtable, (void)); _PROTOTYPE(char getendif, (void)); _PROTOTYPE(void gettable, (void)); _PROTOTYPE(void parse, (void)); _PROTOTYPE(void usage, (void)); #ifdef __STDC__ char fgetarg ( FILE *stream , char *cbuf ) #else char fgetarg(stream, cbuf) /* Get next arg from file into cbuf, */ FILE *stream; /* returning the character that */ char *cbuf; /* terminated it. Cbuf returns 0 */ #endif { /* if no arg. EOF is returned if no */ int ch; /* args left in file. */ int i; i = 0; cbuf[i] = 0; while (((ch = fgetc(stream)) == ' ') || (ch == '\t') || (ch == '\n')) if (ch == '\n') return(ch); /* Bypass leading */ /* Whitespace */ if (feof(stream)) return(EOF); cbuf[i++] = ch; while (((ch = fgetc(stream)) != ' ') && (ch != '\t') && (ch != '\n')) cbuf[i++] = ch; /* Get the argument */ cbuf[i] = 0; return(ch); } #ifdef __STDC__ int find ( char *sym ) #else int find(sym) char *sym; #endif { /* Return DEF if defined else UNDEF */ deftemp = defptr; while (deftemp) { /* Search for the symbol */ if (!strcmp(deftemp->symbol, sym)) return(deftemp->type); /* Setting up the type */ deftemp = deftemp->next; } return(0); } #define Define(x,y) defit(x,y,DEF) #define Undefine(x,y) defit(x,y,UNDEF) #define Ignore(x,y) defit(x,y,IGN) #ifdef __STDC__ void defit ( char *sym , int redef , int type ) #else void defit(sym, redef, type) /* Add symbol to the define list */ char *sym; char redef; /* Mode: MUTABLE etc */ char type; /* Type: DEF, UNDEF, IGN */ #endif { struct DEFINE *temp; char c; c = find(sym); /* First try finding the symbol */ if (type == c) return; /* Return if already declared */ if (c) { /* We have to move if from DEF <-> UNDEF */ if (deftemp->redef == IMMUTABLE) return; else { deftemp->type = type; deftemp->redef = redef; } } else { /* We must create a struct & add it */ /* Malloc room for the struct */ if ((temp = (struct DEFINE *)malloc(sizeof(struct DEFINE))) == NULL) { (void)fprintf(stderr, "ifdef: could not malloc\n"); exit(1); } /* Malloc room for symbol */ if ((temp->symbol = (char *)malloc(strlen(sym) + 1)) == NULL) { (void)fprintf(stderr, "ifdef: could not malloc\n"); exit(1); } (void)strcpy(temp->symbol, sym); /* Copy symbol into struct */ temp->redef = redef; /* and set its redef mode too */ temp->type = type; /* as well as making it defined */ /* Now add to the SLL */ if (defptr == NULL) /* If first node set */ defptr = temp; /* the pointers to it */ else defend->next = temp; /* else add it to the */ defend = temp; /* end of the list. */ } } #ifdef __STDC__ void stop ( void ) #else void stop() #endif { /* Stop: Tidy up at EOF */ if (table) printtable(); (void)fclose(zin); exit(0); } #define Goto { line++; if (ch!='\n') gotoeoln(); } #define Print { line++; if (ch!='\n') prteoln(); } #ifdef __STDC__ void gotoeoln ( void ) #else void gotoeoln() /* Go to the end of the line */ #endif { int ch; while ((ch = fgetc(zin)) != '\n') if (ch == EOF) stop(); } #ifdef __STDC__ void prteoln ( void ) #else void prteoln() /* Print to the end of the line */ #endif { int ch; while ((ch = fgetc(zin)) != '\n') if (ch == EOF) stop(); else (void)putchar(ch); (void)putchar('\n'); } #ifdef __STDC__ void printtable ( void ) #else void printtable() /* Print the defines in the SLL */ #endif { struct DEFINE *temp; (void)printf("Defined\n\n"); temp = defptr; while (temp) { if (temp->type == DEF) (void)printf("%s\n", temp->symbol); temp = temp->next; } (void)printf("\n\nUndefined\n\n"); temp = defptr; while (temp) { if (temp->type == UNDEF) (void)printf("%s\n", temp->symbol); temp = temp->next; } } #ifdef __STDC__ char getendif ( void ) #else char getendif() #endif { /* Find matching endif when ignoring */ char word[80]; /* Buffer for symbols */ int ch; int skip; /* Number of skipped #ifdefs */ skip = 1; while (1) { /* Scan through the file looking for starting lines */ if ((ch = fgetc(zin)) == EOF) stop(); /* Get first char on the line */ if (ch != '#') { /* If not a # ignore line */ (void)putchar(ch); Print; continue; } ch = fgetarg(zin, word); /* Get the word after the # */ if (!strcmp(word, "ifdef") || !strcmp(word, "ifndef")) skip++; /* Keep track of ifdefs & */ if (!strcmp(word, "endif")) skip--; /* endifs */ (void)printf("#%s%c", word, ch); /* Print the line out */ Print; if (!skip) return('\n'); /* If matching endif, return */ } } #ifdef __STDC__ void gettable ( void ) #else void gettable() /* Get & print a table of defines etc. */ #endif { char word[80]; /* Buffer for symbols */ int ch; while (1) { /* Scan through the file looking for starting lines */ if ((ch = fgetc(zin)) == EOF) stop(); /* Get first char on the line */ if (ch != '#') { /* If not a # ignore line */ Goto; continue; } ch = fgetarg(zin, word); /* Get the word after the # */ if (!strcmp(word, "define")) { /* Define: Define the */ ch = fgetarg(zin, word); /* symbol, and goto */ Define(word, MUTABLE); /* the end of line */ Goto; continue; } if (!strcmp(word, "undef")) { /* Undef: Undefine the */ ch = fgetarg(zin, word); /* symbol, and goto */ Undefine(word, MUTABLE); /* the end of line */ Goto; continue; } /* Ifdef: */ if (!strcmp(word, "ifdef") || !strcmp(word, "ifndef")) { ch = fgetarg(zin, word); /* Get the symbol */ if (find(word) != DEF) Undefine(word, MUTABLE); /* undefine it */ Goto; continue; } Goto; /* else ignore the line */ } } #ifdef __STDC__ void parse ( void ) #else void parse() #endif { /* Parse & remove ifdefs from C source */ char word[80]; /* Buffer for symbols */ int ch; int proc; /* Should we be processing this bit? */ int skip; /* Number of skipped #ifdefs */ proc = 1; skip = 0; while (1) { /* Scan through the file looking for starting lines */ if ((ch = fgetc(zin)) == EOF) stop(); /* Get firwO��yO��zO��{O��|O����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������st char on the line */ if (ch != '#') if (proc) { /* If not # and we're processing */ (void)putchar(ch); /* then print the line */ Print; continue; } else { Goto; /* else just skip the line */ continue; } ch = fgetarg(zin, word); /* Get the word after the # */ if (!strcmp(word, "define") && proc) { /* Define: Define the */ ch = fgetarg(zin, word); /* symbol, and goto */ Define(word, MUTABLE); /* the end of line */ (void)printf("#define %s%c", word, ch); Print; continue; } if (!strcmp(word, "undef") && proc) { /* Undef: Undefine the */ ch = fgetarg(zin, word); /* symbol, and goto */ Undefine(word, MUTABLE); /* the end of line */ (void)printf("#undef %s%c", word, ch); Print; continue; } if (!strcmp(word, "if")) { /* If: we cannot handle these */ if (!proc) /* at the moment, so just */ skip++; /* treat them as an ignored */ else { /* definition */ (void)printf("#%s%c",word,ch); Print; ch = getendif(); /* Get matching endif */ continue; } } if (!strcmp(word, "ifdef")) { /* Ifdef: */ if (!proc) /* If not processing */ skip++; /* skip it */ else { ch = fgetarg(zin, word); /* Get the symbol */ switch (find(word)) { case DEF: break; case IGN: (void)printf("#ifdef %s%c", word, ch); Print; ch = getendif(); /* Get matching endif */ break; /* If symbol undefined */ default: Undefine(word, MUTABLE); /* undefine it */ proc = 0; /* & stop processing */ } } Goto; continue; } if (!strcmp(word, "ifndef")) { /* Ifndef: */ if (!proc) /* If not processing */ skip++; /* skip the line */ else { ch = fgetarg(zin, word); /* Get the symbol */ switch (find(word)) { /* If defined, stop */ case DEF: proc = 0; /* processing */ break; case IGN: (void)printf("#ifdef %s%c", word, ch); Print; ch = getendif(); /* Get matching endif */ break; } } Goto; continue; } if (!strcmp(word, "else") && !skip) { /* Else: Flip processing */ proc = !proc; Goto; continue; } if (!strcmp(word, "endif")) { /* Endif: If no skipped */ /* ifdefs turn processing */ if (!skip) /* on, else decrement the */ proc = 1; /* number of skips */ else skip--; Goto; continue; } /* The word fails all of the above tests, so if we're */ /* processing, print the line. */ if (proc) { (void)printf("#%s%c", word, ch); Print; } else Goto; } } #ifdef __STDC__ void usage ( void ) #else void usage() #endif { (void)fprintf(stderr, "Usage: ifdef [-t] [-Dsymbol] [-dsymbol] [-Usymbol] [-Isymbol] <file>\n"); exit(0); } #ifdef __STDC__ int main(int argc , char *argv []) #else int main(argc, argv) int argc; char *argv[]; #endif { char sym[80]; /* Temp symbol storage */ int c; if (argc == 1) usage(); /* Catch the curious user */ while ((c = getopt(argc, argv, "tD:d:U:I:")) != EOF) { switch (c) { case 't': table = 1; /* Get the various options */ break; case 'd': (void)strcpy(sym, optarg); Define(sym, MUTABLE); break; case 'D': (void)strcpy(sym, optarg); Define(sym, IMMUTABLE); break; case 'U': (void)strcpy(sym, optarg); Undefine(sym, IMMUTABLE); break; case 'I': (void)strcpy(sym, optarg); Ignore(sym, IMMUTABLE); break; default: usage(); } } zin = stdin; /* If a C file is named */ /* Open stdin with it */ if (*argv[argc - 1] != '-') { (void)fclose(zin); if ((zin = fopen(argv[argc - 1], "r")) == NULL) { perror("ifdef"); exit(1); } } if (table) gettable(); /* Either generate a table or */ else parse(); /* parse & replace with the file */ return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #ifndef lint static char sccsid[] = "@(#)in.fingerd.c 1.1 87/12/21 SMI"; /* from UCB 5.1 6/6/85 */ #endif /* not lint */ /* * Finger server. */ #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <ctype.h> #include <unistd.h> #include <stdlib.h> #include <string.h> int main _ARGS(( int argc, char *argv[] )); void fatal _ARGS(( char *prog, char *s )); int main(argc, argv) char *argv[]; { register char *sp; char line[512]; int i, p[2], pid, status; FILE *fp; char *av[4]; line[0] = '\0'; fgets(line, sizeof(line), stdin); sp = line + strlen(line); if (sp > line && *--sp == '\n') *sp = '\0'; sp = line; av[0] = "finger"; i = 1; while (1) { while (isspace(*sp)) sp++; if (!*sp) break; if (*sp == '/' && (sp[1] == 'W' || sp[1] == 'w')) { sp += 2; av[i++] = "-l"; } if (*sp && !isspace(*sp)) { av[i++] = sp; while (*sp && !isspace(*sp)) sp++; *sp = '\0'; } } av[i] = 0; if (pipe(p) < 0) fatal(argv[0], "pipe"); if ((pid = fork()) == 0) { close(p[0]); if (p[1] != 1) { dup2(p[1], 1); close(p[1]); } execv("/usr/bin/finger", av); printf("No finger program found\n"); fflush(stdout); _exit(1); } if (pid == -1) fatal(argv[0], "fork"); close(p[1]); if ((fp = fdopen(p[0], "r")) == NULL) fatal(argv[0], "fdopen"); while ((i = getc(fp)) != EOF) { if (i == '\n') putchar('\r'); putchar(i); } fclose(fp); while ((i = wait(&status)) != pid && i != -1) ; return(0); } void fatal(prog, s) char *prog, *s; { fprintf(stderr, "%s: ", prog); perror(s); exit(1); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* in.rshd.c */ /* main channel: back channel\0 remuser\0 locuser\0 command\0 data back channel: signal\0 */ #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <pwd.h> #include <grp.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/socket.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/hton.h> #include <net/netlib.h> #define DEBUG 0 #if DEBUG #define where() fprintf(stderr, "%s, %d: ", __FILE__, __LINE__) #endif char cmdbuf[_POSIX_ARG_MAX+1], locuser[16], remuser[16]; extern char **environ; char username[20]="USER="; char homedir[64]="HOME="; char shell[64]="SHELL="; char tz[1024]="TZ="; char *envinit[]= {homedir, shell, username, tz, "PATH=:/bin:/usr/bin", 0}; char *prog_name; char buffer[PIPE_BUF]; #if __STDC__ #define PROTO(func, args) func args #else #define PROTO(func, args) func () #endif PROTO (int main, (int argc, char *argv[])); PROTO (void getstr, (char*buf, int cnt, char *err)); PROTO (void close_on_exec, (int fd)); int main(argc, argv) int argc; char *argv[]; { int result, result1; nwio_tcpconf_t tcpconf, err_tcpconf; nwio_tcpcl_t tcpconnopt; nwio_tcpatt_t tcpattachopt; tcpport_t tcpport; tcpport_t err_port; int err_fd, pds[2]; pid_t pid, pid1, new_pg; #if USEATTACH int err2_fd; #endif struct hostent *hostent; struct passwd *pwent; char *cp, *buff_ptr, *TZ; char sig; prog_name= argv[0]; if (argc != 1) { fprintf(stderr, "%s: wrong number of arguments (%d)\n", prog_name, argc); exit(1); } signal(SIGINT, SIG_DFL); signal(SIGQUIT, SIG_DFL); signal(SIGTERM, SIG_DFL); #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (0, NWIOGTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "%s: ioctl(NWIOGTCPCONF)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } #if DEBUG { where(); fprintf(stderr, "\n"); } #endif tcpport= ntohs(tcpconf.nwtc_remport); if (tcpport >= TCPPORT_RESERVED || tcpport < TCPPORT_RESERVED/2) { printf("\1%s: unprotected port (%d)\n", prog_name, tcpport); exit(1); } alarm(60); err_port= 0; for (;;) { char c; result= read(0, &c, 1); if (result <0) { fprintf(stderr, "%s: read= %d : %s\n", prog_name, errno, strerror(errno)); } if (result<1) exit(1); if (c == 0) break; err_port= err_port*10 + c - '0'; } alarm(0); if (err_port != 0) { int n, pid, lport; pid= getpid(); lport= 1; do { lport= (lport << 1) | (pid & 1); pid >>= 1; } while (lport < TCPPORT_RESERVED/2); n= TCPPORT_RESERVED/2; do { if (--lport < TCPPORT_RESERVED/2) lport= TCPPORT_RESERVED-1; err_fd= open ("/dev/tcp", O_RDWR); if (err_fd<0) { fprintf(stderr, "%s: open= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } close_on_exec(err_fd); err_tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP | NWTC_EXCL; err_tcpconf.nwtc_locport= htons(lport); err_tcpconf.nwtc_remport= htons(err_port); err_tcpconf.nwtc_remaddr= tcpconf.nwtc_remaddr; #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (err_fd, NWIOSTCPCONF, &err_tcpconf); if (result == 0) break; if (errno != EADDRINUSE) { fprintf(stderr, "%s: ioctl(NWIOSTCPCONF)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } close(err_fd); } while (--n > 0); if (n == 0) { printf("\1can't get stderr port\n"); exit(1); } err_tcpconf.nwtc_flags= NWTC_SHARED; #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (err_fd, NWIOSTCPCONF, &err_tcpconf); if (result<0) { fprintf(stderr, "%s: ioctl(NWIOSTCPCONF)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } #if DEBUG { where(); fprintf(stderr, "\n"); } #endif tcpconnopt.nwtcl_flags= 0; n= 20; for (;;) { #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (err_fd, NWIOTCPCONN, &tcpconnopt); if (result == 0) break; if (errno != EAGAIN && errno != ECONNREFUSED) { fprintf(stderr, "%s: ioctl(NWIOTCPCONN)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } if (--n == 0) break; sleep(1); #if DEBUG { where(); fprintf(stderr, "\n"); } #endif } #if USEATTACH err2_fd= open ("/dev/tcp", O_RDWR); close_on_exec(err2_fd); if (err2_fd<0) { fprintf(stderr, "%s: open= %d : %s\n", errno, prog_name, strerror(errno)); exit(1); } #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (err2_fd, NWIOSTCPCONF, &err_tcpconf); if (result<0) { fprintf(stderr, "%s: ioctl(NWIOSTCPCONF)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } #if DEBUG { where(); fprintf(stderr, "\n"); } #endif tcpattachopt.nwta_flags= 0; #if DEBUG { where(); fprintf(stderr, "\n"); } #endif result= ioctl (err2_fd, NWIOTCPATTACH, &tcpattachopt); if (result<0) { fprintf(stderr, "%s: ioctl(NWIOTCPATTACH)= %d : %s\n", prog_name, errno, strerror(errno)); exit(1); } #if DEBUG { where(); fprintf(stderr, "\n"); } #endif #endif } hostent= gethostbyaddr((char *)&tcpconf.nwtc_remaddr, sizeof(tcpconf.nwtc_remaddr), AF_INET); if (!hostent) { printf("\1Host name for your adress (%s) unknown\n", inet_ntoa(tcpconf.nwtc_remaddr)); exit(1); } getstr(remuser, sizeof(remuser), "remuser"); getstr(locuser, sizeof(locuser), "locuser"); getstr(cmdbuf, sizeof(cmdbuf), "cmdbuf"); setpwent(); pwent= getpwnam(locuser); if (!pwent) { printf("\1Login incorrect.\n"); exit(1); } endpwent(); if (chdir(pwent->pw_dir) < 0) { chdir("/"); } #if DEBUG { where(); fprintf(stderr, "calling ruserok(%s, %d, %s, %s)\n", hostent->h_name, 0, remuser, locuser); } #endif if (ruserok(hostent->h_name, 0, remuser, locuser) < 0) { printf("\1Permission denied.\n"); exit(1); } if (err_port) { /* Let's go to a different process group. */ new_pg= setsid(); pid= fork(); if (pid<0) { if (errno != EAGAIN) { fprintf(stderr, "%s: fork()= %d : %s\n", prog_name, errno, strerror(errno)); } printf("\1Try again.\n"); exit(1); } if (pid) { close(0); /* stdin */ close(1); /* stdout */ #if USEATTACH close(err_fd); /* stderr for shell */ #endif dup2(2,0); dup2(2,1); for (;;) { #if !USEATTACH if (read(err_fd, &sig, 1) <= 0) #else if (read(err2_fd, &sig, 1) <= 0) #endif { #if 0 printf("read failed: %d\n", errno); #endif exit(0); } pid= 0; #if 0 printf("killing %d with %d\n", -new_pg, sig); #endif kill(-new_pg, sig); } } #if USEATTACH close(err2_fd); /* signal channel for parent */ #endif result= pipe(pds); if (result<0) { printf("\1Can't make pipe\n"); kill(getppid(), SIGTERM); exit(1); } pid1= fork(); if (pid1<0) { if (errno != EAGAIN) { fprintf(stderr, "%s: fork()= %d : %s\n", prog_name, errno, strerror(errno)); } printf("\1Try again.\n"); kill(-new_pg, SIGTERM); exit(1); } if (pid1) { close(pds[1]); /* write side of pipe */ for (;;) { result= read(pds[0], buffer, sizeof(buffer)); if (result<=0) { kill(pid, SIGTERM); exit(0); } buff_ptr= buffer; while (result>0) { result1= write (err_fd, buff_ptr, result); if (result1 <= 0) { fprintf(stderr, "%s: write()= %d : %s\n", prog_name, errno, strerror(errno)); kill(-new_pg, SIGTERM); exit(1); } result -= result1; } } } close(err_fd); /* file descriptor for error channel */ close (pds[0]); /* read side of pipe */ dup2(pds[1], 2); close (pds[1]); /* write side of pipe */ } if (*pwent->pw_shell == '\0') pwent->pw_shell= "/bin/sh"; #if __minix_vmd initgroups(pwent->pw_name, pwent->pw_gid); #endif setgid(pwent->pw_gid); setuid(pwent->pw_uid); TZ=getenv("TZ"); environ= envinit; strncat(homedir, pwent->pw_dir, sizeof(homedir)-6); strncat(shell, pwent->pw_shell, sizeof(shell)-7); strncat(username, O��O����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pwent->pw_name, sizeof(username)-6); if (TZ) strncat(tz, TZ, sizeof(tz)-4); else envinit[3]= NULL; cp= strrchr(pwent->pw_shell, '/'); if (cp) cp++; else cp= pwent->pw_shell; if (!err_port) dup2(1, 2); write(1, "\0", 1); execl(pwent->pw_shell, cp, "-c", cmdbuf, 0); close(2); open("/dev/tty", O_RDWR); fprintf(stderr, "%s: execl(%s, %s, .., %s)= %d : %s\n", prog_name, pwent->pw_shell, cp, cmdbuf, errno, strerror(errno)); kill(getppid(), SIGTERM); exit(1); } void getstr(buf, cnt, err) char *buf; int cnt; char *err; { char c; do { if (read(0, &c, 1) != 1) exit(1); *buf++ = c; if (--cnt == 0) { printf("\1%s too long", err); exit(1); } } while (c != 0); } void close_on_exec(fd) int fd; { (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* install 1.11 - install files. Author: Kees J. Bot * 21 Feb 1993 */ #define nil 0 #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <a.out.h> #include <limits.h> #include <pwd.h> #include <grp.h> #include <utime.h> #include <signal.h> /* First line used on a self-decompressing executable. */ char ZCAT[]= "#!/usr/bin/zexec /usr/bin/zcat\n"; char GZCAT[]= "#!/usr/bin/zexec /usr/bin/gzcat\n"; /* Compression filters. */ char *COMPRESS[]= { "compress", nil }; char *GZIP[]= { "gzip", "-#", nil }; int excode= 0; /* Exit code. */ void report(char *label) { if (label == nil || label[0] == 0) fprintf(stderr, "install: %s\n", strerror(errno)); else fprintf(stderr, "install: %s: %s\n", label, strerror(errno)); excode= 1; } void fatal(char *label) { report(label); exit(1); } void *allocate(void *mem, size_t size) /* Safe malloc/realloc. */ { mem= mem == nil ? malloc(size) : realloc(mem, size); if (mem == nil) fatal(nil); return mem; } void deallocate(void *mem) { if (mem != nil) free(mem); } int lflag= 0; /* Make a hard link if possible. */ int cflag= 0; /* Copy if you can't link, otherwise symlink. */ int dflag= 0; /* Create a directory. */ int strip= 0; /* Strip the copy. */ char **compress= nil; /* Compress utility to make a compressed executable. */ char *zcat= nil; /* Line one to decompress. */ long stack= -1; /* Amount of heap + stack. */ int wordpow= 1; /* Must be multiplied with wordsize ** wordpow */ /* So 8kb for an 8086 and 16kb for the rest. */ pid_t filter(int fd, char **command) /* Let a command filter the output to fd. */ { pid_t pid; int pfd[2]; if (pipe(pfd) < 0) { report("pipe()"); return -1; } switch ((pid= fork())) { case -1: report("fork()"); return -1; case 0: /* Run the filter. */ dup2(pfd[0], 0); dup2(fd, 1); close(pfd[0]); close(pfd[1]); close(fd); signal(SIGPIPE, SIG_DFL); execvp(command[0], command); fatal(command[0]); } /* Connect fd to the pipe. */ dup2(pfd[1], fd); close(pfd[0]); close(pfd[1]); return pid; } int mkdirp(char *dir, int mode, int owner, int group) /* mkdir -p dir */ { int keep; char *sep, *pref; sep= dir; while (*sep == '/') sep++; if (*sep == 0) { errno= EINVAL; return -1; } do { while (*sep != '/' && *sep != 0) sep++; pref= sep; while (*sep == '/') sep++; keep= *pref; *pref= 0; if (strcmp(dir, ".") == 0 || strcmp(dir, "..") == 0) continue; if (mkdir(dir, mode) < 0) { if (errno != EEXIST || *sep == 0) { /* On purpose not doing: *pref= keep; */ return -1; } } else { if (chown(dir, owner, group) < 0 && errno != EPERM) return -1; } } while (*pref= keep, *sep != 0); return 0; } void makedir(char *dir, int mode, int owner, int group) /* Install a directory, and set it's modes. */ { struct stat st; if (stat(dir, &st) < 0) { if (errno != ENOENT) { report(dir); return; } /* The target doesn't exist, make it. */ if (mode == -1) mode= 0755; if (owner == -1) owner= getuid(); if (group == -1) group= getgid(); if (mkdirp(dir, mode, owner, group) < 0) { report(dir); return; } } else { /* The target does exist, change mode and ownership. */ if (mode == -1) mode= (st.st_mode & 07777) | 0555; if ((st.st_mode & 07777) != mode) { if (chmod(dir, mode) < 0) { report(dir); return; } } if (owner == -1) owner= st.st_uid; if (group == -1) group= st.st_gid; if (st.st_uid != owner || st.st_gid != group) { if (chown(dir, owner, group) < 0 && errno != EPERM) { report(dir); return; } /* Set the mode again, chown may have wrecked it. */ (void) chmod(dir, mode); } } } int setstack(struct exec *hdr) /* Set the stack size in a header. Return true if something changed. */ { long total; total= stack; while (wordpow > 0) { total *= hdr->a_cpu == A_I8086 ? 2 : 4; wordpow--; } total+= hdr->a_data + hdr->a_bss; if (!(hdr->a_flags & A_SEP)) { total+= hdr->a_text; #ifdef A_PAL if (hdr->a_flags & A_PAL) total+= hdr->a_hdrlen; #endif } if (hdr->a_cpu == A_I8086 && total > 0x10000L) total= 0x10000L; if (hdr->a_total != total) { /* Need to change stack allocation. */ hdr->a_total= total; return 1; } return 0; } void copylink(char *source, char *dest, int mode, int owner, int group) { struct stat sst, dst; int sfd, dfd, n; int r, same= 0, change= 0, docopy= 1; char buf[4096]; # define hdr ((struct exec *) buf) pid_t pid; int status; /* Source must exist as a plain file, dest may exist as a plain file. */ if (stat(source, &sst) < 0) { report(source); return; } if (mode == -1) { mode= sst.st_mode & 07777; if (!lflag || cflag) { mode|= 0444; if (mode & 0111) mode|= 0111; } } if (owner == -1) owner= sst.st_uid; if (group == -1) group= sst.st_gid; if (!S_ISREG(sst.st_mode)) { fprintf(stderr, "install: %s is not a regular file\n", source); excode= 1; return; } r= stat(dest, &dst); if (r < 0) { if (errno != ENOENT) { report(dest); return; } } else { if (!S_ISREG(dst.st_mode)) { fprintf(stderr, "install: %s is not a regular file\n", dest); excode= 1; return; } /* Are the files the same? */ if (sst.st_dev == dst.st_dev && sst.st_ino == dst.st_ino) { if (!lflag && cflag) { fprintf(stderr, "install: %s and %s are the same, can't copy\n", source, dest); excode= 1; return; } same= 1; } } if (lflag && !same) { /* Try to link the files. */ if (r >= 0 && unlink(dest) < 0) { report(dest); return; } if (link(source, dest) >= 0) { docopy= 0; } else { if (!cflag || errno != EXDEV) { fprintf(stderr, "install: can't link %s to %s: %s\n", source, dest, strerror(errno)); excode= 1; return; } } } if (docopy && !same) { /* Copy the files, stripping if necessary. */ long count= LONG_MAX; int first= 1; if ((sfd= open(source, O_RDONLY)) < 0) { report(source); return; } /* Open for write is less simple, its mode may be 444. */ dfd= open(dest, O_WRONLY|O_CREAT|O_TRUNC, mode | 0600); if (dfd < 0 && errno == EACCES) { (void) chmod(dest, mode | 0600); dfd= open(dest, O_WRONLY|O_TRUNC); } if (dfd < 0) { report(dest); close(sfd); return; } pid= 0; while (count > 0 && (n= read(sfd, buf, sizeof(buf))) > 0) { if (first && n >= A_MINHDR && !BADMAG(*hdr)) { if (strip) { count= hdr->a_hdrlen + hdr->a_text + hdr->a_data; #ifdef A_NSYM hdr->a_flags &= ~A_NSYM; #endif hdr->a_syms= 0; } if (stack != -1 && setstack(hdr)) change= 1; if (compress != nil) { /* Write first #! line. */ (void) write(dfd, zcat, strlen(zcat)); /* Put a compressor in between. */ if ((pid= filter(dfd, compress)) < 0) { close(sfd); close(dfd); return; } change= 1; } } if (count < n) n= count; if (write(dfd, buf, n) < 0) { report(dest); close(sfd); close(dfd); if (pid != 0) (void) waitpid(pid, nil, 0); return; } count-= n; first= 0; } if (n < 0) report(source); close(sfd); close(dfd); if (pid != 0 && waitpid(pid, &status, 0) < 0 || status != 0) { excode= 1; return; } if (n < 0) return; } else { if (stack != -1) { /* The file has been linked into place. Set the * stack size. */ if ((dfd= open(dest, O_RDWR)) < 0) { report(dest); return; } if ((n= read(dfd, buf, sizeof(*hdr))) < 0) { report(dest); return; } if (n >= A_MINHDR && !BADMAG(*hdr) && setstack(hdr)) { if (lseek(dfd, (off_t) 0, SEEK_SET) == -1 || write(dfd, buf, n) < 0 ) { report(dest); close(dfd); return; } change= 1; } close(dfd); } } if (stat(dest, &dst) < 0) { report(dest); return; } if ((dst.st_mode & 07777) != mode) { if (chmod(dest, mode) < 0) { report(dest); return; } } if (dst.st_uid != owner || dst.st_gid != group) { if (chown(dest, owner, group) < 0 && errno != EPERM) { report(dest); return; } /* Set the mode again, chown may haveO��O��O��O��O��O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ wrecked it. */ (void) chmod(dest, mode); } if (!change) { struct utimbuf ubuf; ubuf.actime= dst.st_atime; ubuf.modtime= sst.st_mtime; if (utime(dest, &ubuf) < 0 && errno != EPERM) { report(dest); return; } } } void usage(void) { fprintf(stderr, "\ Usage:\n\ install [-lcsz#] [-o owner] [-g group] [-m mode] [-S stack] [file1] file2\n\ install [-lcsz#] [-o owner] [-g group] [-m mode] [-S stack] file ... dir\n\ install -d [-o owner] [-g group] [-m mode] directory\n"); exit(1); } void main(int argc, char **argv) { int i= 1; int mode= -1; /* Mode of target. */ int owner= -1; /* Owner. */ int group= -1; /* Group. */ int super = 0; #if NGROUPS_MAX > 0 gid_t groups[NGROUPS_MAX]; int ngroups; int g; #endif /* Only those in group 0 are allowed to set owner and group. */ if (getgid() == 0) super = 1; #if NGROUPS_MAX > 0 ngroups= getgroups(NGROUPS_MAX, groups); for (g= 0; g < ngroups; g++) if (groups[g] == 0) super= 1; #endif if (!super) { setgid(getgid()); setuid(getuid()); } /* May use a filter. */ signal(SIGPIPE, SIG_IGN); while (i < argc && argv[i][0] == '-') { char *p= argv[i++]+1; char *end; unsigned long num; int wp; struct passwd *pw; struct group *gr; if (strcmp(p, "-") == 0) break; while (*p != 0) { switch (*p++) { case 'l': lflag= 1; break; case 'c': cflag= 1; break; case 's': strip= 1; break; case 'd': dflag= 1; break; case 'z': if (compress == nil) { compress= COMPRESS; zcat= ZCAT; } break; case 'o': if (*p == 0) { if (i == argc) usage(); p= argv[i++]; if (*p == 0) usage(); } num= strtoul(p, &end, 10); if (*end == 0) { if ((uid_t) num != num) usage(); owner= num; } else { if ((pw= getpwnam(p)) == nil) { fprintf(stderr, "install: %s: unknown user\n", p); exit(1); } owner= pw->pw_uid; } p= ""; break; case 'g': if (*p == 0) { if (i == argc) usage(); p= argv[i++]; if (*p == 0) usage(); } num= strtoul(p, &end, 10); if (*end == 0) { if ((gid_t) num != num) usage(); group= num; } else { if ((gr= getgrnam(p)) == nil) { fprintf(stderr, "install: %s: unknown user\n", p); exit(1); } group= gr->gr_gid; } p= ""; break; case 'm': if (*p == 0) { if (i == argc) usage(); p= argv[i++]; if (*p == 0) usage(); } num= strtoul(p, &end, 010); if (*end != 0 || (num & 07777) != num) usage(); mode= num; if ((mode & S_ISUID) && super && owner == -1) { /* Setuid what? Root most likely. */ owner= 0; } if ((mode & S_ISGID) && super && group == -1) { group= 0; } p= ""; break; case 'S': if (*p == 0) { if (i == argc) usage(); p= argv[i++]; if (*p == 0) usage(); } stack= strtol(p, &end, 0); wp= 0; if (end == p || stack < 0) usage(); p= end; while (*p != 0) { switch (*p++) { case 'm': case 'M': num= 1024 * 1024L; break; case 'k': case 'K': num= 1024; break; case 'w': case 'W': num= 4; wp++; break; case 'b': case 'B': num= 1; break; default: usage(); } if (stack > LONG_MAX / num) usage(); stack*= num; } wordpow= 0; while (wp > 0) { stack /= 4; wordpow++; wp--; } break; default: if ((unsigned) (p[-1] - '1') <= ('9' - '1')) { compress= GZIP; GZIP[1][1]= p[-1]; zcat= GZCAT; break; } usage(); } } } /* Some options don't mix. */ if (dflag && (cflag || lflag || strip)) usage(); /* Don't let the user umask interfere. */ umask(000); if (dflag) { /* install directory */ if ((argc - i) != 1) usage(); makedir(argv[i], mode, owner, group); } else { struct stat st; if ((argc - i) < 1) usage(); if ((lflag || cflag) && (argc - i) == 1) usage(); if (stat(argv[argc-1], &st) >= 0 && S_ISDIR(st.st_mode)) { /* install file ... dir */ char *target= nil; char *base; if ((argc - i) == 1) usage(); while (i < argc-1) { if ((base= strrchr(argv[i], '/')) == nil) base= argv[i]; else base++; target= allocate(target, strlen(argv[argc-1]) + 1 + strlen(base) + 1); strcpy(target, argv[argc-1]); strcat(target, "/"); strcat(target, base); copylink(argv[i++], target, mode, owner, group); } } else { /* install [file1] file2 */ copylink(argv[i], argv[argc-1], mode, owner, group); } } exit(excode); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* irdpd 1.10 - Internet router discovery protocol daemon. * Author: Kees J. Bot * 28 May 1994 * Activily solicitate or passively look for routers. * Based heavily on its forerunners, the irdp_sol and rip2icmp daemons by * Philip Homburg. */ #define nil 0 #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <stddef.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <limits.h> #include <unistd.h> #include <signal.h> #include <sys/ioctl.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/ip_hdr.h> #include <net/gen/icmp.h> #include <net/gen/icmp_hdr.h> #include <net/gen/ip_io.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/oneCsum.h> #include <net/gen/socket.h> #include <net/gen/udp.h> #include <net/gen/udp_hdr.h> #include <net/gen/udp_io.h> #define MAX_SOLICITATIONS 3 /* # router solicitations. */ #define SOLICITATION_INTERVAL 3 /* Secs between solicitate retries. */ #define DEST_TO (10*60) /* 10 minutes */ #define NEW_ROUTE (5*60) /* 5 minutes */ #define DANGER (2*60) /* Nearing a advert timeout? */ #define DEAD_TO (24L*60*60) /* 24 hours */ #define DEAD_PREF 0x80000000L /* From RFC 1256 */ #define MaxAdvertisementInterval (DEST_TO/2) /* Chosen to jive with RIP */ #define AdvertisementLifetime DEST_TO #define PRIO_OFF_DEF -1024 #define RIP_REPLY 2 /* It's now or never. */ #define IMMEDIATELY ((time_t) ((time_t) -1 < 0 ? LONG_MIN : 0)) #define NEVER ((time_t) ((time_t) -1 < 0 ? LONG_MAX : ULONG_MAX)) #if !__minix_vmd /* Standard Minix needs to choose between router discovery and RIP info. */ int do_rdisc= 1; int do_rip= 0; #else /* VMD Minix can do both at once. */ #define do_rdisc 1 #define do_rip 1 #endif int rip_fd; /* For incoming RIP packet. */ int irdp_fd; /* Receive or transmit IRDP packets. */ char *udp_device; /* UDP device to use. */ char *ip_device; /* IP device to use. */ int priority_offset; /* Offset to make my routes less preferred. */ int bcast= 0; /* Broadcast adverts to all. */ int debug= 0; char rip_buf[8192]; /* Incoming RIP packet buffer. */ char irdp_buf[1024]; /* IRDP buffer. */ typedef struct routeinfo { u8_t command; u8_t version; u16_t zero1; struct routedata { u16_t family; u16_t zero2; u32_t ip_addr; u32_t zero3, zero4; u32_t metric; } data[1]; } routeinfo_t; typedef struct table { ipaddr_t tab_gw; i32_t tab_pref; time_t tab_time; } table_t; table_t *table; /* Collected table of routing info. */ size_t table_size; int sol_retries= MAX_SOLICITATIONS; time_t next_sol= IMMEDIATELY; time_t next_advert= NEVER; time_t router_advert_valid= IMMEDIATELY; time_t now; void report(const char *label) /* irdpd: /dev/hd0: Device went up in flames */ { fprintf(stderr, "irdpd: %s: %s\n", label, strerror(errno)); } void fatal(const char *label) /* irdpd: /dev/house: Taking this with it */ { report(label); exit(1); } #if DEBUG char *addr2name(ipaddr_t host) /* Translate an IP address to a printable name. */ { struct hostent *hostent; hostent= gethostbyaddr((char *) &host, sizeof(host), AF_INET); return hostent == nil ? inet_ntoa(host) : hostent->h_name; } #else #define addr2name(host) inet_ntoa(host) #endif void print_table(void) /* Show the collected routing table. */ { int i; table_t *ptab; struct tm *tm; for (i= 0, ptab= table; i < table_size; i++, ptab++) { if (ptab->tab_time < now - DEAD_TO) continue; tm= localtime(&ptab->tab_time); printf("%-40s %6ld %02d:%02d:%02d\n", addr2name(ptab->tab_gw), (long) ptab->tab_pref, tm->tm_hour, tm->tm_min, tm->tm_sec); } } void advertize(ipaddr_t host) /* Send a router advert to a host. */ { char *buf, *data; ip_hdr_t *ip_hdr; icmp_hdr_t *icmp_hdr; int i; table_t *ptab; buf= malloc(sizeof(*ip_hdr) + offsetof(icmp_hdr_t, ih_dun.uhd_data) + table_size * (sizeof(ipaddr_t) + sizeof(u32_t))); if (buf == nil) fatal("heap error"); ip_hdr= (ip_hdr_t *) buf; icmp_hdr= (icmp_hdr_t *) (ip_hdr + 1); ip_hdr->ih_vers_ihl= 0x45; ip_hdr->ih_dst= host; icmp_hdr->ih_type= ICMP_TYPE_ROUTER_ADVER; icmp_hdr->ih_code= 0; icmp_hdr->ih_hun.ihh_ram.iram_na= 0; icmp_hdr->ih_hun.ihh_ram.iram_aes= 2; icmp_hdr->ih_hun.ihh_ram.iram_lt= htons(AdvertisementLifetime); data= (char *) icmp_hdr->ih_dun.uhd_data; /* Collect gateway entries from the table. */ for (i= 0, ptab= table; i < table_size; i++, ptab++) { if (ptab->tab_time < now - DEAD_TO) continue; icmp_hdr->ih_hun.ihh_ram.iram_na++; if (ptab->tab_time < now - DEST_TO) ptab->tab_pref= DEAD_PREF; * (ipaddr_t *) data= ptab->tab_gw; data+= sizeof(ipaddr_t); * (i32_t *) data= htonl(ptab->tab_pref); data+= sizeof(i32_t); } icmp_hdr->ih_chksum= 0; icmp_hdr->ih_chksum= ~oneC_sum(0, icmp_hdr, data - (char *) icmp_hdr); if (icmp_hdr->ih_hun.ihh_ram.iram_na > 0) { /* Send routing info. */ if (debug) { printf("Routing table send to %s:\n", addr2name(host)); print_table(); } if (write(irdp_fd, buf, data - buf) < 0) { (errno == EIO ? fatal : report)(ip_device); } } free(buf); } void time_functions(void) /* Perform time dependend functions: router solicitation, router advert. */ { if (now >= next_sol) { char buf[sizeof(ip_hdr_t) + 8]; ip_hdr_t *ip_hdr; icmp_hdr_t *icmp_hdr; if (sol_retries == 0) { /* Stop soliciting. */ next_sol= NEVER; #if !__minix_vmd /* Switch to RIP if no router responded. */ if (table_size == 0) { do_rip= 1; do_rdisc= 0; } #endif return; } /* Broadcast a router solicitation to find a router. */ ip_hdr= (ip_hdr_t *) buf; icmp_hdr= (icmp_hdr_t *) (ip_hdr + 1); ip_hdr->ih_vers_ihl= 0x45; ip_hdr->ih_dst= HTONL(0xFFFFFFFFL); icmp_hdr->ih_type= ICMP_TYPE_ROUTE_SOL; icmp_hdr->ih_code= 0; icmp_hdr->ih_chksum= 0; icmp_hdr->ih_hun.ihh_unused= 0; icmp_hdr->ih_chksum= ~oneC_sum(0, icmp_hdr, 8); if (debug) printf("Broadcasting router solicitation\n"); if (write(irdp_fd, buf, sizeof(buf)) < 0) fatal("sending router solicitation failed"); /* Schedule the next packet. */ next_sol= now + SOLICITATION_INTERVAL; sol_retries--; } if (now >= next_advert) { /* Advertize routes to the local host (normally), or * broadcast them (to keep bad hosts up.) */ advertize(bcast ? HTONL(0xFFFFFFFFL) : HTONL(0x7F000001L)); next_advert= now + MaxAdvertisementInterval; #if !__minix_vmd /* Make sure we are listening to RIP now. */ do_rip= 1; do_rdisc= 0; #endif } } void add_gateway(ipaddr_t host, i32_t pref) /* Add a router with given address and preference to the routing table. */ { table_t *oldest, *ptab; int i; /* Look for the host, or select the oldest entry. */ oldest= nil; for (i= 0, ptab= table; i < table_size; i++, ptab++) { if (ptab->tab_gw == host) break; if (oldest == nil || ptab->tab_time < oldest->tab_time) oldest= ptab; } /* Don't evict the oldest if it is still valid. */ if (oldest != nil && oldest->tab_time >= now - DEST_TO) oldest= nil; /* Expand the table? */ if (i == table_size && oldest == nil) { table_size++; table= realloc(table, table_size * sizeof(*table)); if (table == nil) fatal("heap error"); oldest= &table[table_size - 1]; } if (oldest != nil) { ptab= oldest; ptab->tab_gw= host; ptab->tab_pref= DEAD_PREF; } /* Replace an entry if the new one looks more promising. */ if (pref >= ptab->tab_pref || ptab->tab_time <= now - NEW_ROUTE) { ptab->tab_pref= pref; ptab->tab_time= now; } } void rip_incoming(ssize_t n) /* Use a RIP packet to add to the router table. (RIP packets are really for * between routers, but often it is the only information around.) */ { udp_io_hdr_t *udp_io_hdr; u32_t default_dist; i32_t pref; routeinfo_t *routeinfo; struct routedata *data, *end; /* We don't care about RIP packets when there are router adverts. */ if (now + MaxAdvertisementInterval < router_advert_valid) return; udp_io_hdr= (udp_io_hdr_t *) rip_buf; if (udp_io_hdr->uih_data_len != n - sizeof(*udp_io_hdr)) { if (debug) printf("Bad sized route packet (discarded)\n"); O��O��O��O��O��O��O��O��O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ return; } routeinfo= (routeinfo_t *) (rip_buf + sizeof(*udp_io_hdr) + udp_io_hdr->uih_ip_opt_len); if (routeinfo->command != RIP_REPLY) { if (debug) { printf("RIP-%d packet command %d ignored\n", routeinfo->version, routeinfo->command); } return; } /* Look for a default route, the route to the gateway. */ end= (struct routedata *) (rip_buf + n); default_dist= (u32_t) -1; for (data= routeinfo->data; data < end; data++) { if (ntohs(data->family) != AF_INET || data->ip_addr != 0) continue; default_dist= ntohl(data->metric); if (default_dist >= 256) { if (debug) { printf("Strange metric %lu\n", (unsigned long) default_dist); } } } pref= default_dist >= 256 ? 1 : 512 - default_dist; pref+= priority_offset; /* Add the gateway to the table with the calculated preference. */ add_gateway(udp_io_hdr->uih_src_addr, pref); if (debug) { printf("Routing table after RIP-%d packet from %s:\n", routeinfo->version, addr2name(udp_io_hdr->uih_src_addr)); print_table(); } /* Start advertizing. */ if (next_advert == NEVER) next_advert= IMMEDIATELY; } void irdp_incoming(ssize_t n) /* Look for router solicitations and router advertisements. The solicitations * are probably from other irdpd daemons, we answer them if we do not expect * a real router to answer. The advertisements cause this daemon to shut up. */ { ip_hdr_t *ip_hdr; icmp_hdr_t *icmp_hdr; int ip_hdr_len; char *data; int i; int router; ipaddr_t addr; i32_t pref; time_t valid; ip_hdr= (ip_hdr_t *) irdp_buf; ip_hdr_len= (ip_hdr->ih_vers_ihl & IH_IHL_MASK) << 2; if (n < ip_hdr_len + 8) { if (debug) printf("Bad sized ICMP (discarded)\n"); return; } icmp_hdr= (icmp_hdr_t *)(irdp_buf + ip_hdr_len); /* Did I send this myself? */ if (ip_hdr->ih_src == ip_hdr->ih_dst) return; if ((htonl(ip_hdr->ih_src) & 0xFF000000L) == 0x7F000000L) return; if (icmp_hdr->ih_type != ICMP_TYPE_ROUTER_ADVER) return; /* Incoming router advertisement, the kind of packet the TCP/IP task * is very happy with. No need to solicit further. */ sol_retries= 0; /* Add router info to our table. Also see if the packet really came * from a router. If so then we can go dormant for the lifetime of * the ICMP. */ router= 0; data= (char *) icmp_hdr->ih_dun.uhd_data; for (i= 0; i < icmp_hdr->ih_hun.ihh_ram.iram_na; i++) { addr= * (ipaddr_t *) data; data+= sizeof(ipaddr_t); pref= htonl(* (i32_t *) data); data+= sizeof(i32_t); if (addr == ip_hdr->ih_src) { /* The sender is in the routing table! */ router= 1; } add_gateway(addr, pref); } valid= now + ntohs(icmp_hdr->ih_hun.ihh_ram.iram_lt); if (router) router_advert_valid= valid; /* Restart advertizing close to the timeout of the advert. (No more * irdpd adverts if the router stays alive.) */ if (router || next_advert > valid - DANGER) next_advert= valid - DANGER; if (debug) { printf("Routing table after advert received from %s:\n", addr2name(ip_hdr->ih_src)); print_table(); if (router) { struct tm *tm= localtime(&router_advert_valid); printf( "This router advert is valid until %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec); } } } void sig_handler(int sig) /* A signal changes the debug level. */ { switch (sig) { case SIGUSR1: debug++; break; case SIGUSR2: debug= 0; break; } } void usage(void) { fprintf(stderr, "Usage: irdpd [-bd] [-U udp-device] [-I ip-device] [-o priority-offset]\n"); exit(1); } int main(int argc, char **argv) { int i; struct servent *service; udpport_t route_port; nwio_udpopt_t udpopt; nwio_ipopt_t ipopt; asynchio_t asyn; time_t timeout; struct timeval tv; struct sigaction sa; char *offset_arg, *offset_end; long arg; udp_device= ip_device= nil; offset_arg= nil; for (i = 1; i < argc && argv[i][0] == '-'; i++) { char *p= argv[i] + 1; if (p[0] == '-' && p[1] == 0) { i++; break; } while (*p != 0) { switch (*p++) { case 'U': if (udp_device != nil) usage(); if (*p == 0) { if (++i == argc) usage(); p= argv[i]; } udp_device= p; p= ""; break; case 'I': if (ip_device != nil) usage(); if (*p == 0) { if (++i == argc) usage(); p= argv[i]; } ip_device= p; p= ""; break; case 'o': if (offset_arg != nil) usage(); if (*p == 0) { if (++i == argc) usage(); p= argv[i]; } offset_arg= p; p= ""; break; case 'b': bcast= 1; break; case 's': /*obsolete*/ break; case 'd': debug= 1; break; default: usage(); } } } if (i != argc) usage(); /* Debug level signals. */ sa.sa_handler= sig_handler; sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sigaction(SIGUSR1, &sa, nil); sigaction(SIGUSR2, &sa, nil); if (udp_device == nil && (udp_device= getenv("UDP_DEVICE")) == nil) udp_device= UDP_DEVICE; if (ip_device == nil && (ip_device= getenv("IP_DEVICE")) == nil) ip_device= IP_DEVICE; if (offset_arg == nil) { priority_offset= PRIO_OFF_DEF; } else { arg= strtol(offset_arg, &offset_end, 0); if (*offset_end != 0 || (priority_offset= arg) != arg) usage(); } if ((service= getservbyname("route", "udp")) == nil) { fprintf(stderr, "irdpd: unable to look up the port number for the 'route' service\n"); exit(1); } route_port= (udpport_t) service->s_port; if ((rip_fd= open(udp_device, O_RDWR)) < 0) fatal(udp_device); udpopt.nwuo_flags= NWUO_COPY | NWUO_LP_SET | NWUO_DI_LOC | NWUO_EN_BROAD | NWUO_RP_SET | NWUO_RA_ANY | NWUO_RWDATALL | NWUO_DI_IPOPT; udpopt.nwuo_locport= route_port; udpopt.nwuo_remport= route_port; if (ioctl(rip_fd, NWIOSUDPOPT, &udpopt) < 0) fatal("setting UDP options failed"); if ((irdp_fd= open(ip_device, O_RDWR)) < 0) fatal(ip_device); ipopt.nwio_flags= NWIO_COPY | NWIO_EN_LOC | NWIO_EN_BROAD | NWIO_REMANY | NWIO_PROTOSPEC | NWIO_HDR_O_SPEC | NWIO_RWDATALL; ipopt.nwio_tos= 0; ipopt.nwio_ttl= 1; ipopt.nwio_df= 0; ipopt.nwio_hdropt.iho_opt_siz= 0; ipopt.nwio_rem= HTONL(0xFFFFFFFFL); ipopt.nwio_proto= IPPROTO_ICMP; if (ioctl(irdp_fd, NWIOSIPOPT, &ipopt) < 0) fatal("can't configure ICMP channel"); asyn_init(&asyn); while (1) { ssize_t r; if (do_rip) { /* Try a RIP read. */ r= asyn_read(&asyn, rip_fd, rip_buf, sizeof(rip_buf)); if (r < 0) { if (errno == EIO) fatal(udp_device); if (errno != EINPROGRESS) report(udp_device); } else { now= time(nil); rip_incoming(r); } } if (do_rdisc) { /* Try an IRDP read. */ r= asyn_read(&asyn, irdp_fd, irdp_buf, sizeof(irdp_buf)); if (r < 0) { if (errno == EIO) fatal(ip_device); if (errno != EINPROGRESS) report(ip_device); } else { now= time(nil); irdp_incoming(r); } } fflush(stdout); /* Compute the next wakeup call. */ timeout= next_sol < next_advert ? next_sol : next_advert; /* Wait for a RIP or IRDP packet or a timeout. */ tv.tv_sec= timeout; tv.tv_usec= 0; if (asyn_wait(&asyn, 0, timeout == NEVER ? nil : &tv) < 0) { /* Timeout? */ if (errno != EINTR && errno != EAGAIN) fatal("asyn_wait()"); now= time(nil); time_functions(); } } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * isoread.c * * isoread reads a file system in ISO9660 or HIGH SIERRA format from * a given device. * * Apr 5 1995 Michel R. Prevenier * Nov 16 1996 Kees J. Bot -- bug fix: isoread filename matching * Dec 7 1997 Albert S. Woodhull -- bug fix: return values * " " : isodir filename handling * -- added : isoread -a option * Mar 21 2000 Michael A. Temari -- bug fix: look_up only searched first * : block of directory * : stack overflow in recurse_dir * : and various other bugs */ #include <ctype.h> #include <errno.h> #include <limits.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <sys/times.h> #include <unistd.h> /* * definitions used by the ISO9660 and HIGH SIERRA file system */ #define ISO9660_ID "CD001" #define HIGH_SIERRA_ID "CDROM" #define BLOCK_SIZE 2048 #define BLOCK_SHIFT 11 /* Fields in a ISO9660 volume descriptor */ struct iso9660_descriptor { char type[1]; char id[5]; char version[1]; char reserved1[1]; char system_id[32]; char volume_id[32]; char reserved2[8]; char volume_size[8]; char reserved3[32]; char volume_set_size[4]; char volume_seq_nr[4]; char block_size[4]; char path_table_size[8]; char type_l_path_table[4]; char opt_type_l_path_table[4]; char type_m_path_table[4]; char opt_type_m_path_table[4]; char root_dir_entry[34]; char vol_set_id[128]; char publ_id[128]; char prep_id[128]; char appl_id[128]; char copyright_file_id[37]; char abstract_file_id[37]; char bibl_file_id[37]; char creation_date[17]; char mod_date[17]; char exp_date[17]; char eff_date[17]; char file_struc_version[1]; char reserved4[1]; char appl_data[512]; char reserved5[653]; }; /* Fields in a High Sierra volume descriptor */ struct high_sierra_descriptor { char reserved1[8]; char type[1]; char id[5]; char version[1]; char reserved2[1]; char system_id[32]; char volume_id[32]; char reserved3[8]; char volume_size[8]; char reserved4[32]; char vol_set_size[4]; char volume_seq_nr[4]; char block_size[4]; char path_table_size[8]; char type_l_path_table[4]; char reserved5[28]; char root_dir_entry[34]; }; /* Fields in a directory entry */ struct dir_entry { char length[1]; char ext_attr_length[1]; char first_block[8]; char size[8]; char date[7]; char flags[1]; char file_unit_size[1]; char interleave[1]; char volume_seq_nr[4]; char name_length[1]; char name[1]; }; #define STDOUT stdout #define STDERR stderr #define NULL_DIR (struct dir_entry *) 0 #define MAX_NAME_LENGTH 255 #define MAX_PATH_LENGTH 1024 #define NR_OF_CHARS 13 #define NR_OF_BLANKS 2 #define NR_OF_COLS (80 / (NR_OF_CHARS + NR_OF_BLANKS)) /* This macro always returns a lower case character */ #define LOWER_CASE(CHR) (CHR >= 'A' && CHR <= 'Z' ? CHR | 0x20 : CHR) /* Macro's for determining . , .. and normal directory entries */ #define IS_DOT(PTR) (PTR->name_length[0] == 1 && PTR->name[0] == 0 ? 1 : 0) #define IS_DOT_DOT(PTR) (PTR->name_length[0] == 1 && PTR->name[0] == 1 ? 1 : 0) #define IS_DIR(PTR) (PTR->flags[-High_Sierra] & 2 ? 1 : 0) _PROTOTYPE (int main, (int argc, char **argv)); _PROTOTYPE (int iso_cmp, (char *name, struct dir_entry *dir_ptr, int dir_flag)); _PROTOTYPE (void list_dir, (struct dir_entry *dir_ptr)); _PROTOTYPE (void list_file, (struct dir_entry *dir_ptr)); _PROTOTYPE (struct dir_entry *look_up, (char *name)); _PROTOTYPE (void recurse_dir, (char *path, struct dir_entry *dir_ptr)); _PROTOTYPE (void read_device, (long offset, int nr_of_bytes, char *buffer)); _PROTOTYPE (int valid_fs, (void) ); _PROTOTYPE (void usage, (void) ); _PROTOTYPE (void print_date, (char *date)); _PROTOTYPE (void print_dir_date, (char *date)); _PROTOTYPE (void iso_info, (struct iso9660_descriptor *vol_desc)); _PROTOTYPE (void hs_info, (struct high_sierra_descriptor *vol_desc)); _PROTOTYPE (int iso_711, (char *c)); _PROTOTYPE (int iso_712, (char *c)); _PROTOTYPE (int iso_721, (char *c)); _PROTOTYPE (int iso_722, (char *c)); _PROTOTYPE (int iso_723, (char *c)); _PROTOTYPE (long iso_731, (char *c)); _PROTOTYPE (long iso_732, (char *c)); _PROTOTYPE (long iso_733, (char *c)); char Buffer[BLOCK_SIZE]; /* buffer to hold read data */ int Device; /* global file descriptor */ struct iso9660_descriptor *Iso_Vol_Desc; /* iso9660 volume descriptor */ struct high_sierra_descriptor *Hs_Vol_Desc; /* high sierra volume descriptor */ int High_Sierra = 0; /* 1 = high sierra format */ int Iso9660 = 0; /* 1 = iso9660 format */ /* This comes in handy when printing the date */ char months[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; /* Flags displaying what to do */ int Read_File = 0; /* 1 = Read file */ int Read_Dir = 0; /* 1 = Read directory entry */ int Read_Info = 0; /* 1 = Read volume descriptor */ int Recurse = 0; /* 1 = Recursively descend directories */ int Verbose = 0; /* 1 = Print all info on directories */ int Aflag = 0; /* 1 = Suppress output of \r */ int iso_cmp(name, dir_ptr, dir_flag) char *name; struct dir_entry *dir_ptr; int dir_flag; { /* Compare name with directory entries, looking for match with a dirname. * An iso9660 filename is terminated by ";n", where n will probably * be 1. A directory name is not terminated by anything special, it may be * followed by a \0 if padding is needed to put the following directory * entry on an even address. */ int i; int len; /* First match the filename */ len = strlen(name); if (len > iso_711(dir_ptr->name_length)) return 1; for (i = 0; i < len; i++) { if (dir_ptr->name[i] == ';') return 1; /* found end of a filename */ if (name[i] != LOWER_CASE(dir_ptr->name[i])) return 1; /* match failed */ } if (dir_ptr->name[i] != ';' && i != len) return 1; /* incomplete match */ /* The filename is ok, now look at the file type */ if (dir_flag && !IS_DIR(dir_ptr)) return 1; /* File type not correct */ return 0; } void usage() { if (Read_Dir) fprintf (STDERR, "Usage: isodir [-lr] inputfile [dir]\n"); else if (Read_Info) fprintf (STDERR, "Usage: isoinfo inputfile\n"); else fprintf (STDERR, "Usage: isoread [-a] inputfile file\n"); exit(1); } int main(argc, argv) int argc; char **argv; { struct dir_entry *entry; char path[MAX_PATH_LENGTH]; char *input_file; char *basename; char *file_name; int i,j; /* Read arguments */ basename = argv[0]; while (*argv[0] != '\0') if (*argv[0]++ == '/') basename = argv[0]; if (strcmp(basename,"isodir") == 0) Read_Dir = 1; else if (strcmp(basename,"isoinfo") == 0) Read_Info = 1; else Read_File = 1; if ((argc > 5 && Read_Dir) || (argc != 2 && Read_Info) || (argc > 4 && Read_File)) usage(); i = 1; while (i < argc && argv[i][0] == '-') { char *opt = argv[i++] + 1; if (opt[0] == '-' && opt[1] == '\0') break; while (*opt != '\0') { if (Read_Info) usage(); if (Read_Dir) switch (*opt++) { case 'r': Recurse = 1; break; case 'l': Verbose = 1; break; default: usage(); } if (Read_File) switch (*opt++) { case 'a': Aflag = 1; break; default: usage(); } } } if (i >= argc) usage(); input_file = argv[i++]; if (Read_File) { if (i >= argc) usage(); file_name = argv[i++]; } if (Read_Dir) { file_name = "/"; if (i < argc) { file_name = argv[i++]; } } if (i < argc) usage(); if (Read_File || Read_Dir) { for (i=0; file_name[i] != '\0'; i++) path[i] = LOWER_CASE(file_name[i]); path[i] = '\0'; } /* Open file system (file or device) */ if ((Device = open(input_file, O_RDONLY)) < 0) { fprintf (STDERR, "cannotO��O��O��O��O��O��O��O��O��O��O��O��O��O���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� open %s\n", input_file); exit(-1); } if (!valid_fs()) { fprintf (STDERR, "File system not in ISO9660 or HIGH SIERRA format \n"); exit(-1); } if (Read_Info) { if (Iso9660) iso_info(Iso_Vol_Desc); else hs_info(Hs_Vol_Desc); exit(0); } /* Lookup file */ if ((entry = look_up(path)) != NULL_DIR) { if (Read_Dir) if (Recurse) recurse_dir(path,entry); else list_dir(entry); else list_file(entry); } else { if (Read_Dir) fprintf (STDERR, "Directory"); else fprintf (STDERR, "File"); fprintf (STDERR, " %s not found\n", path); exit(-1); } return 0; } struct dir_entry *look_up(path) char *path; { /* Lookup a file name */ struct dir_entry *dir_ptr; long block; int nr_of_blocks; int offset; char name[MAX_NAME_LENGTH + 1]; int name_index = 0; int last_in_path = 0; int found; int i,j; /* Get the right dir entry structure */ if (Iso9660) dir_ptr = (struct dir_entry *) Iso_Vol_Desc->root_dir_entry; else dir_ptr = (struct dir_entry *) Hs_Vol_Desc->root_dir_entry; /* If we look for the root we already have the right entry */ if (path[0] == '/') if (strlen(path) == 1) return dir_ptr; else name_index = 1; /* first name in path */ /* Keep searching for the path elements until all are found */ while (!last_in_path) { /* Get next name in path */ for (i = name_index; i < strlen(path); i++) { if (path[i] == '/') break; name[i - name_index] = path[i]; } last_in_path = (i == strlen(path) || (i == strlen(path) - 1 && path[i] == '/')); name[i-name_index] = '\0'; name_index = i + 1; /* Get block of next directory */ block = iso_733(dir_ptr->first_block) + iso_711(dir_ptr->ext_attr_length); nr_of_blocks = (int) (iso_733(dir_ptr->size) >> BLOCK_SHIFT); /* Search for file in dir entry */ found = 0; for (j=0; j < nr_of_blocks && !found; j++) { /* Read a directory block */ read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); block++; dir_ptr = (struct dir_entry *) Buffer; offset = 0; /* Compare with all entries in this block */ while (iso_711(dir_ptr->length) > 0 && offset < BLOCK_SIZE) { if (iso_cmp(name, dir_ptr, (Read_Dir || (!Read_Dir && !last_in_path))) == 0) { found = 1; break; } /* Next entry */ offset += iso_711(dir_ptr->length); dir_ptr = (struct dir_entry *) (Buffer + offset); } } if (!found) return NULL_DIR; /* path element not found */ } return dir_ptr; } void recurse_dir(path, dir_ptr) char *path; struct dir_entry *dir_ptr; { /* Recursively descend all directories starting with dir_ptr */ char tmp_path[MAX_PATH_LENGTH]; int i,j, path_length; long block, saveblock; int nr_of_blocks; int offset = 0; /* Save block number and nr of blocks of current dir entry because * list_dir changes dir_ptr */ block = iso_733(dir_ptr->first_block) + iso_711(dir_ptr->ext_attr_length); nr_of_blocks = (int) (iso_733(dir_ptr->size) >> BLOCK_SHIFT); /* Add a trailing / to path if necessary */ path_length = strlen(path); if (path[path_length-1] != '/') { path[path_length++] = '/'; path[path_length] = '\0'; } /* Print current path of directory, and list contents of directory */ fprintf(STDOUT,"directory %s:\n\n", path); list_dir(dir_ptr); fprintf(STDOUT,"\n\n"); for (j=0; j < nr_of_blocks; j++) { read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); saveblock = block++; /* Save buffer, because the next recursive call destroys * the global Buffer */ dir_ptr = (struct dir_entry *) Buffer; /* Search this dir entry for directories */ offset = 0; while (iso_711(dir_ptr->length) != 0 && offset < BLOCK_SIZE) { /* Is current file a directory and not the . or .. entries */ if (IS_DIR(dir_ptr) && !IS_DOT(dir_ptr) && !IS_DOT_DOT(dir_ptr)) { /* setup path for next recursive call */ for (i=0; i<path_length; i++) tmp_path[i] = path[i]; for (i=0;i<iso_711(dir_ptr->name_length) && dir_ptr->name[i] != ';';i++) tmp_path[i+path_length] = LOWER_CASE(dir_ptr->name[i]); tmp_path[i+path_length] = '/'; tmp_path[i+1+path_length] = '\0'; /* Read block of directory we found */ block = iso_733(dir_ptr->first_block); read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); /* And start all over again with this entry */ recurse_dir(tmp_path, (struct dir_entry *) Buffer); /* get the block we were looking at */ read_device(saveblock*BLOCK_SIZE, BLOCK_SIZE, Buffer); } /* Go to the next file in this directory */ offset += iso_711(dir_ptr->length); dir_ptr = (struct dir_entry *) (Buffer + offset); } } } void list_dir(dir_ptr) struct dir_entry *dir_ptr; { /* List all entries in a directory */ long block; int nr_of_blocks; int i,j; int offset = 0; char name[NR_OF_CHARS+NR_OF_BLANKS+1]; int name_len; int column = 0; int skip = 0; /* Get first block of directory */ block = iso_733(dir_ptr->first_block) + iso_711(dir_ptr->ext_attr_length); nr_of_blocks = (int) (iso_733(dir_ptr->size) >> BLOCK_SHIFT); /* Read all directory blocks and display their contents */ for (j=0; j < nr_of_blocks; j++) { read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); block++; dir_ptr = (struct dir_entry *) (Buffer); offset = 0; while (iso_711(dir_ptr->length) != 0 && offset < BLOCK_SIZE) { name_len = 0; if (IS_DOT(dir_ptr)) { name[name_len++] = '.'; if (!Verbose) skip = 1; } else { if (IS_DOT_DOT(dir_ptr)) { name[name_len++] = '.'; name[name_len++] = '.'; if (!Verbose) skip = 1; } else { for (i=0; i<iso_711(dir_ptr->name_length) && i<NR_OF_CHARS; i++) { if (dir_ptr->name[i] == ';') break; name[name_len++] = LOWER_CASE(dir_ptr->name[i]); } if (IS_DIR(dir_ptr)) name[name_len++] = '/'; } } if (!skip) { if (Verbose) { fprintf (STDOUT, "%8ld ", iso_733(dir_ptr->size)); print_dir_date(dir_ptr->date); fprintf (STDOUT, " "); } for(i=name_len; i<(NR_OF_CHARS+NR_OF_BLANKS); i++) name[i] = ' '; name[NR_OF_CHARS+NR_OF_BLANKS] = '\0'; fprintf(STDOUT, "%s", name); if (!Verbose) { column++; if (column >= NR_OF_COLS) { column = 0; fprintf(STDOUT,"\n"); } } else fprintf(STDOUT,"\n"); } skip = 0; offset += iso_711(dir_ptr->length); dir_ptr = (struct dir_entry *) (Buffer+offset); } } if (!Verbose && column) fprintf(STDOUT,"\n"); } void print_dir_date(date) char *date; { /* Print date in a directory entry */ int m; m = iso_711(&date[1]) - 1; if(m < 0 || m > 11) fprintf(STDOUT, " "); else fprintf(STDOUT,"%.3s",&months[m*3]); fprintf (STDOUT, " %02d 19%02d %02d:%02d:%02d", date[2], date[0], date[3], date[4], date[5]); } void list_file(dir_ptr) struct dir_entry *dir_ptr; { /* List contents of a file */ int i; long block; long size; char c; block = iso_733(dir_ptr->first_block); size = iso_733(dir_ptr->size); while (size > 0) if (Aflag == 1) { read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); for (i=0; ((i < size) && (i < BLOCK_SIZE)); i++) if (Buffer[i] != '\r') fprintf(STDOUT, "%c", Buffer[i]); size-= BLOCK_SIZE; block++; } else { read_device(block*BLOCK_SIZE, BLOCK_SIZE, Buffer); for (i=0; ((i < size) && (i < BLOCK_SIZE)); i++) fprintf(STDOUT, "%c", Buffer[i]); size-= BLOCK_SIZE; block++; } } void print_date(date) char *date; { /* Print the date in a volume descriptor */ fprintf (STDOUT, "%c%c-%c%c-%c%c%c%c %c%c:%c%c:%c%c", date[4], date[5], date[6], date[7], date[0], date[1], date[2], date[3], date[8], date[9], date[10], date[11], date[12], date[13]); } void iso_info(vol_desc) struct iso9660_descriptor *vol_desc; { int i; fprintf (STDOUT, "Format: ISO9660 \n"); fprintf (STDOUT, "System id: "); for (i=0; i< sizeof(vol_desc->system_id); i++) fprintf(STDOUT, "%c", vol_desc->system_id[i]); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Volume id: "); for (i=0; i< sizeof(vol_desc->volume_id); i++) fprintf(STDOUT, "%c", vol_desc->volume_id[i]); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Volume size: %ld Kb\n", iso_733(vol_desc->volume_size)*2); fprintf (STDOUT, "Block size: %d bytes \n", iso_723(vol_desc->block_size)); fprintf (STDOUT, "Creation date: "); print_date(vol_desc->creation_date); fprintf(STDOUT, "\n"); fprintf (STDOUT, "Modification date: "); print_date(vol_desc->mod_date); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Expiration date: "); print_date(vol_desc->exp_date); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Effective date: "); print_date(vol_desc->eff_date); fprintf (STDOUT, "\n"); } void hs_info(vol_desc) struct high_sierra_descriptor *vol_desc; { int i; fprintf (STDOUT, "Format: HIGH SIERRA \n"); fprintf (STDOUT, "System id: "); for (i=0; i< sizeof(vol_desc->system_id); i++) fprintf(STDOUT, "%c", vol_desc->system_id[i]); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Volume id: "); for (i=0; i< sizeof(vol_desc->volume_id); i++) fprintf(STDOUT, "%c", vol_desc->volume_id[i]); fprintf (STDOUT, "\n"); fprintf (STDOUT, "Volume size: %ld Kb\n", (iso_733(vol_desc->volume_size)*2)); fprintf (STDOUT, "Block size: %d bytes \n", iso_723(vol_desc->block_size)); } int valid_fs() { int i; /* search for a volume descriptor */ for (i=16; i<100; i++) { read_device((long)(i)*BLOCK_SIZE, BLOCK_SIZE, Buffer); Iso_Vol_Desc = (struct iso9660_descriptor *) Buffer; Hs_Vol_Desc = (struct high_sierra_descriptor *) Buffer; if (strncmp(Iso_Vol_Desc->id, ISO9660_ID, sizeof Iso_Vol_Desc->id) == 0) { /* iso_info(Iso_Vol_Desc); */ Iso9660 = 1; break; } if (strncmp(Hs_Vol_Desc->id, HIGH_SIERRA_ID, sizeof Hs_Vol_Desc->id) == 0) { /* hs_info(Hs_Vol_Desc); */ High_Sierra = 1; break; } } if (i >= 100) return 0; return 1; } void read_device(offset, nr_of_bytes, buffer) long offset; int nr_of_bytes; char *buffer; { int bytes_read; if (lseek(Device, offset, SEEK_SET) < 0L) { fflush (stdout); fprintf (STDERR, "seek error\n"); exit(1); } bytes_read = read(Device, buffer, nr_of_bytes); if (bytes_read != nr_of_bytes) { fprintf (STDERR, "read error\n"); exit (1); } } /* The ISO9660 functions */ int iso_711 (c) char *c; { return (*c & 0xff); } int iso_712 (c) char *c; { int n; n = *c; if (n & 0x80) n |= 0xffffff00; return n; } int iso_721 (c) char *c; { return ((c[0] & 0xff) | ((c[1] & 0xff) << 8)); } int iso_722 (c) char *c; { return (((c[0] & 0xff) << 8) | (c[1] & 0xff)); } int iso_723 (c) char *c; { if (c[0] != c[3] || c[1] != c[2]) { fprintf (STDERR, "Invalid ISO 7.2.3 number\n"); exit (1); } return (iso_721 (c)); } long iso_731 (c) char *c; { return ((long)(c[0] & 0xff) | ((long)(c[1] & 0xff) << 8) | ((long)(c[2] & 0xff) << 16) | ((long)(c[3] & 0xff) << 24)); } long iso_732 (c) char *c; { return (((long)(c[0] & 0xff) << 24) | (((long)c[1] & 0xff) << 16) | (((long)c[2] & 0xff) << 8) | ((long)c[3] & 0xff)); } long iso_733 (c) char *c; { int i; for (i = 0; i < 4; i++) { if (c[i] != c[7-i]) { fprintf (STDERR, "Invalid ISO 7.3.3 number\n"); exit (1); } } return (iso_731(c)); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* join - relation data base operator Author: Saeko Hirabayashi */ /* Written by Saeko Hirabayashi, 1989. * 1992-01-28 Modified by Kouichi Hirabayashi to add some POSIX1003.2 options. * * This a free program. */ #include <string.h> #include <stdio.h> #define MAXFLD 200 /* maximum # of fields to accept */ _PROTOTYPE(void main, (int argc, char **argv)); _PROTOTYPE(void error, (char *s, char *t)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void match, (void)); _PROTOTYPE(void f1_only, (void)); _PROTOTYPE(void f2_only, (void)); _PROTOTYPE(void output, (int flag)); _PROTOTYPE(void outfld, (int file)); _PROTOTYPE(void outputf, (int flag)); _PROTOTYPE(int compare, (void)); _PROTOTYPE(int get1, (void)); _PROTOTYPE(int get2, (int back)); _PROTOTYPE(int getrec, (int file)); _PROTOTYPE(int split, (int file)); _PROTOTYPE(int atoi, (char *str)); _PROTOTYPE(int exit, (int val)); _PROTOTYPE(FILE * efopen, (char *file, char *mode)); _PROTOTYPE(void (*outfun), (int file)); /* output func: output() or outputf()*/ #define F1 1 #define F2 2 #define SEP (sep ? sep : ' ') FILE *fp[2]; /* file pointer for file1 and file2 */ long head; /* head of the current (same)key group of the * file2 */ char buf[2][BUFSIZ]; /* input buffer for file1 and file2 */ char *fld[2][MAXFLD]; /* field vector for file1 and file2 */ int nfld[2]; /* # of fields for file1 and file2 */ int kpos[2]; /* key field position for file1 and file2 * (from 0) */ char oldkey[BUFSIZ]; /* previous key of the file1 */ struct { /* output list by -o option */ int o_file; /* file #: 0 or 1 */ int o_field; /* field #: 0, 1, 2, .. */ } olist[MAXFLD]; int nout; /* # of output filed */ int aflag; /* n for '-an': F1 or F2 or both */ int vflag; /* n for '-vn': F1 or F2 or both */ char *es; /* s for '-e s' */ char sep; /* c for -tc: filed separator */ char *cmd; /* name of this program */ void main(argc, argv) int argc; char **argv; { register char *s; int c, i, j; cmd = argv[0]; outfun = output; /* default output form */ while (--argc > 0 && (*++argv)[0] == '-' && (*argv)[1]) { /* "-" is a file name (stdin) */ s = argv[0] + 1; if ((c = *s) == '-' && !s[1]) { ++argv; --argc; break; /* -- */ } if (*++s == '\0') { s = *++argv; --argc; } switch (c) { case 'a': /* add unpairable line to output */ vflag = 0; switch (*s) { case '1': aflag |= F1; break; case '2': aflag |= F2; break; default: aflag |= (F1 | F2); break; } break; case 'e': /* replace empty field by es */ es = s; break; case 'j': /* key field (obsolute) */ c = *s++; if (*s == '\0') { s = *++argv; --argc; } case '1': /* key field of file1 */ case '2': /* key field of file2 */ i = atoi(s) - 1; switch (c) { case '1': kpos[0] = i; break; case '2': kpos[1] = i; break; default: kpos[0] = kpos[1] = i; break; } break; case 'o': /* specify output format */ do { i = j = 0; sscanf(s, "%d.%d", &i, &j); if (i < 1 || j < 1 || i > 2) usage(); olist[nout].o_file = i - 1; olist[nout].o_field = j - 1; nout++; if ((s = strchr(s, ',')) != (char *) 0) s++; else { s = *++argv; --argc; } } while (argc > 2 && *s != '-'); ++argc; --argv; /* compensation */ outfun = outputf; break; case 't': /* tab char */ sep = *s; break; case 'v': /* output unpairable line only */ aflag = 0; switch (*s) { case '1': vflag |= F1; break; case '2': vflag |= F2; break; default: vflag |= (F1 | F2); break; } break; default: usage(); } } if (argc != 2) usage(); fp[0] = strcmp(argv[0], "-") ? efopen(argv[0], "r") : stdin; fp[1] = efopen(argv[1], "r"); nfld[0] = get1(); /* read file1 */ nfld[1] = get2(0); /* read file2 */ while (nfld[0] || nfld[1]) { if ((i = compare()) == 0) match(); else if (i < 0) f1_only(); else f2_only(); } fflush(stdout); exit(0); } void usage() { fprintf(stderr, "Usage: %s [-an|-vn] [-e str] [-o list] [-tc] [-1 f] [-2 f] file1 file2\n", cmd); exit(1); } int compare() { /* compare key field */ register int r; if (nfld[1] == 0) /* file2 EOF */ r = -1; else if (nfld[0] == 0) /* file1 EOF */ r = 1; else { if (nfld[0] <= kpos[0]) error("missing key field in file1", (char *) 0); if (nfld[1] <= kpos[1]) error("missing key field in file2", (char *) 0); r = strcmp(fld[0][kpos[0]], fld[1][kpos[1]]); } return r; } void match() { long p; if (!vflag) (*outfun) (F1 | F2); p = ftell(fp[1]); nfld[1] = get2(0); /* check key order */ if (nfld[1] == 0 || strcmp(fld[0][kpos[0]], fld[1][kpos[1]])) { nfld[0] = get1(); if (strcmp(fld[0][kpos[0]], oldkey) == 0) { fseek(fp[1], head, 0); /* re-do from head */ nfld[1] = get2(1); /* don't check key order */ } else head = p; /* mark here */ } } void f1_only() { if ((aflag & F1) || (vflag & F1)) (*outfun) (F1); nfld[0] = get1(); } void f2_only() { if ((aflag & F2) || (vflag & F2)) (*outfun) (F2); head = ftell(fp[1]); /* mark */ nfld[1] = get2(0); /* check key order */ } void output(f) { /* default output form */ if (f & F1) fputs(fld[0][kpos[0]], stdout); else fputs(fld[1][kpos[1]], stdout); if (f & F1) outfld(0); if (f & F2) outfld(1); fputc('\n', stdout); } void outfld(file) { /* output all fields except key_field */ register int i; int k, n; k = kpos[file]; n = nfld[file]; for (i = 0; i < n; i++) if (i != k) { fputc(SEP, stdout); fputs(fld[file][i], stdout); } } void outputf(f) { /* output by '-o list' */ int i, j, k; register char *s; for (i = k = 0; i < nout; i++) { j = olist[i].o_file; if ((f & (j + 1)) && (olist[i].o_field < nfld[j])) s = fld[j][olist[i].o_field]; else s = es; if (s) { if (k++) fputc(SEP, stdout); fputs(s, stdout); } } fputc('\n', stdout); } int get1() { /* read file1 */ int r; static char oldkey1[BUFSIZ]; if (fld[0][kpos[0]]) { strcpy(oldkey, fld[0][kpos[0]]); /* save previous key for control */ } r = getrec(0); if (r) { if (strcmp(oldkey1, fld[0][kpos[0]]) > 0) error("file1 is not sorted", (char *) 0); strcpy(oldkey1, fld[0][kpos[0]]); /* save prev key for sort check */ } return r; } int get2(back) { /* read file2 */ static char oldkey2[BUFSIZ]; int r; r = getrec(1); if (r) { if (!back && strcmp(oldkey2, fld[1][kpos[1]]) > 0) error("file2 is not sorted", (char *) 0); strcpy(oldkey2, fld[1][kpos[1]]); /* save prev key for sort check */ } return r; } int getrec(file) { /* read one line to split it */ if (fgets(buf[file], BUFSIZ, fp[file]) == (char *) 0) *buf[file] = '\0'; else if (*buf[file] == '\n' || *buf[file] == '\r') error("null line in file%s", file ? "1" : "0"); return split(file); } int split(file) { /* setup fields */ register int n; register char *s, *t; for (n = 0, s = buf[file]; *s && *s != '\n' && *s != '\r';) { if (sep) { for (t = s; *s && *s != sep && *s != '\n' && *s != '\r'; s++); } else { while (*s == ' ' || *s == '\t') s++; /* skip leading white space */ for (t = s; *s && *s != ' ' && *s != '\t' && *s != '\n' && *s != '\r'; s++); /* We will treat trailing white space as NULL field */ } if (*s) *s++ = '\0'; fld[file][n++] = t; if (n == MAXFLD) error("too many filed in file%s", file ? "1" : "0"); } fld[file][n] = (char *) 0; return n; } FILE *efopen(file, mode) char *file, *mode; { FILE *fp; if ((fp = fopen(file, mode)) == (FILE *) 0) error("can't open %s", file); return fp; } void error(s, t) char *s, *t; { fprintf(stderr, "%s: ", cmd); fprintf(stderr, s, t); fprintf(stderr, "\n"); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* kill - send a signal to a process Author: Adri Koppes */ #include <sys/types.h> #include <errno.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void usage, (void)); /* Table of signal names. */ struct signames { char *name; int sig; } signames[] = { { "HUP", SIGHUP }, { "INT", SIGINT }, { "QUIT", SIGQUIT }, { "ILL", SIGILL }, { "TRAP", SIGTRAP }, { "ABRT", SIGABRT }, { "IOT", SIGIOT }, { "FPE", SIGFPE }, { "KILL", SIGKILL }, { "USR1", SIGUSR1 }, { "SEGV", SIGSEGV }, { "USR2", SIGUSR2 }, { "PIPE", SIGPIPE }, { "ALRM", SIGALRM }, { "TERM", SIGTERM }, { "EMT", SIGEMT }, { "BUS", SIGBUS }, { "CHLD", SIGCHLD }, { "CONT", SIGCONT }, { "STOP", SIGSTOP }, { "TSTP", SIGTSTP }, { "TTIN", SIGTTIN }, { "TTOU", SIGTTOU }, #ifdef SIGWINCH { "WINCH", SIGWINCH }, #endif { NULL, 0 } }; int main(argc, argv) int argc; char **argv; { pid_t proc; int ex = 0, sig = SIGTERM; char *end; long l; unsigned long ul; struct sigaction sa; int i, doit; struct signames *snp; if (argc > 1 && argv[1][0] == '-') { sig = -1; for (snp = signames; snp->name != NULL; snp++) { /* symbolic? */ if (strcmp(snp->name, argv[1] + 1) == 0) { sig = snp->sig; break; } } if (sig < 0) { /* numeric? */ ul = strtoul(argv[1] + 1, &end, 10); if (end == argv[1] + 1 || *end != 0 || ul > _NSIG) usage(); sig = ul; } argv++; argc--; } sa.sa_flags = 0; sigemptyset(&sa.sa_mask); sa.sa_handler = SIG_IGN; /* try not to kill yourself */ (void) sigaction(sig, &sa, (struct sigaction *) NULL); for (doit = 0; doit <= 1; doit++) { for (i = 1; i < argc; i++) { l = strtoul(argv[i], &end, 10); if (end == argv[i] || *end != 0 || (pid_t) l != l) usage(); proc = l; if (doit && kill(proc, sig) < 0) { fprintf(stderr, "kill: %d: %s\n", proc, strerror(errno)); ex = 1; } } } return(ex); } void usage() { fprintf(stderr, "Usage: kill [-sig] pid\n"); exit(1); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* last - display login history Author: Terrence W. Holm */ /* last- Display the user log-in history. * Last(1) searches backwards through the file of log-in * records (/usr/adm/wtmp), displaying the length of * log-in sessions as requested by the options: * * Usage: last [-r] [-count] [-f file] [name] [tty] ... * * -r Search backwards only until the last reboot * record. * * -count Only print out <count> records. Last(1) stops * when either -r or -count is satisfied, or at * the end of the file if neither is given. * * -f file Use "file" instead of "/usr/adm/wtmp". * * name Print records for the user "name". * * tty Print records for the terminal "tty". Actually, * a list of names may be given and all records * that match either the user or tty name are * printed. If no names are given then all records * are displayed. * * A sigquit (^\) causes last(1) to display how far it * has gone back in the log-in record file, it then * continues. This is used to check on the progress of * long running searches. A sigint will stop last(1). * * Author: Terrence W. Holm May 1988 * * Revision: * Fred van Kempen, October 1989 * -Adapted to MSS. * -Adapted to new utmp database. * * Fred van Kempen, December 1989 * -Adapted to POSIX (MINIX 1.5) * * Fred van Kempen, January 1990 * -Final edit for 1.5 * * Philip Homburg, March 1992 * -Include host in output * * Kees J. Bot, July 1997 * -Approximate system uptime from last reboot record */ #include <sys/types.h> #include <signal.h> #include <string.h> #include <utmp.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> #define FALSE 0 #define TRUE 1 #define RLOGIN 1 #define BUFFER_SIZE 4096 /* Room for wtmp records */ #define MAX_WTMP_COUNT ( BUFFER_SIZE / sizeof(struct utmp) ) #define min( a, b ) ( (a < b) ? a : b ) #define max( a, b ) ( (a > b) ? a : b ) typedef struct logout { /* A logout time record */ char line[12]; /* The terminal name */ long time; /* The logout time */ struct logout *next; /* Next in linked list */ } logout; static char *Version = "@(#) LAST 1.7 (10/24/92)"; /* command-line option flags */ char boot_limit = FALSE; /* stop on latest reboot */ char count_limit = FALSE; /* stop after print_count */ char tell_uptime = FALSE; /* tell uptime since last reboot */ int print_count; char *prog; /* name of this program */ int arg_count; /* used to select specific */ char **args; /* users and ttys */ /* global variables */ long boot_time = 0; /* Zero means no reboot yet */ char *boot_down; /* "crash" or "down " flag */ logout *first_link = NULL; /* List of logout times */ int interrupt = FALSE; /* If sigint or sigquit occurs */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Sigint, (int sig)); _PROTOTYPE(void Sigquit, (int sig)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void Process, (struct utmp *wtmp)); _PROTOTYPE(int Print_Record, (struct utmp *wtmp)); _PROTOTYPE(void Print_Duration, (long from, long to)); _PROTOTYPE(void Print_Uptime, (void)); _PROTOTYPE(void Record_Logout_Time, (struct utmp *wtmp)); /* Sigint() and Sigquit() Flag occurrence of an interrupt. */ void Sigint(sig) int sig; { interrupt = SIGINT; } void Sigquit(sig) int sig; { interrupt = SIGQUIT; } void usage() { fprintf(stderr, "Usage: last [-r] [-u] [-count] [-f file] [name] [tty] ...\n"); exit(-1); } /* A log-in record format file contains four types of records. * * [1] generated on a system reboot: * * line="~", name="reboot", host="", time=date() * * * [2] generated after a shutdown: * * line="~", name="shutdown", host="", time=date() * * * [3] generated on a successful login(1) * * line=ttyname(), name=cuserid(), host=, time=date() * * * [4] generated by init(8) on a logout * * line=ttyname(), name="", host="", time=date() * * * Note: This version of last(1) does not recognize the '|' and '}' time * change records. Last(1) pairs up line login's and logout's to * generate four types of output lines: * * [1] a system reboot or shutdown * * reboot ~ Mon May 16 14:16 * shutdown ~ Mon May 16 14:15 * * [2] a login with a matching logout * * edwin tty1 Thu May 26 20:05 - 20:32 (00:27) * * [3] a login followed by a reboot or shutdown * * root tty0 Mon May 16 13:57 - crash (00:19) * root tty1 Mon May 16 13:45 - down (00:30) * * [4] a login not followed by a logout or reboot * * terry tty0 Thu May 26 21:19 still logged in */ void Process(wtmp) struct utmp *wtmp; { logout *link; logout *next_link; char is_reboot; /* suppress the job number on an "ftp" line */ if (!strncmp(wtmp->ut_line, "ftp", (size_t)3)) strncpy(wtmp->ut_line, "ftp", (size_t)8); if (!strcmp(wtmp->ut_line, "~")) { /* A reboot or shutdown record */ if (boot_limit) exit(0); if (Print_Record(wtmp)) putchar('\n'); boot_time = wtmp->ut_time; is_reboot = !strcmp(wtmp->ut_name, "reboot"); if (is_reboot) boot_down = "crash"; else boot_down = "down "; if (tell_uptime) { if (!is_reboot) { fprintf(stderr, "%s: no reboot record added to wtmp file on system boot!\n", prog); exit(1); } Print_Uptime(); exit(0); } /* remove any logout records */ for (link = first_link; link != NULL; link = next_link) { next_link = link->next; free(link); } first_link = NULL; } else if (wtmp->ut_name[0] == '\0') { /* A logout record */ Record_Logout_Time(wtmp); } else { /* A login record */ for (link = first_link; link != NULL; link = link->next) if (!strncmp(link->line, wtmp->ut_line, (size_t)8)) { /* found corresponding logout record */ if (Print_Record(wtmp)) { printf("- %.5s ", ctime(&link->time) + 11); Print_Duration(wtmp->ut_time, link->time); } /* record login time */ link->time = wtmp->ut_time; return; } /* could not find a logout record for this login tty */ if (Print_Record(wtmp)) if (boot_time == 0) /* still on */ printf(" still logged in\n"); else { /* system crashed while on */ printf("- %s ", boot_down); Print_Duration(wtmp->ut_time, boot_time); } Record_Logout_Time(wtmp); /* Needed in case of 2 * consecutive logins */ } } /* Print_Record(wtmp) If the record was requested, then print out * the user name, terminal, host and time. */ int Print_Record(wtmp) struct utmp *wtmp; { int i; char print_flag = FALSE; /* just interested in the uptime? */ if (tell_uptime) return(FALSE); /* check if we have already printed the requested number of records */ if (count_limit && print_count == 0) exit(0); for (i = 0; i < arg_count; ++i) if (!strncmp(args[i], wtmp->ut_name, sizeof(wtmp->ut_name)) || !strncmp(args[i], wtmp->ut_line, sizeof(wtmp->ut_line))) print_flag = TRUE; if (arg_count == 0 || print_flag) { #ifdef RLOGIN printf("%-8.8s %-8.8s %-16.16s %.16s ", wtmp->ut_name, wtmp->ut_line, wtmp->ut_host, ctime(&wtmp->ut_time)); #else printf("%-8.8s %-8.8s %.16s ", wtmp->ut_name, wtmp->ut_line, ctime(&wtmp->ut_time)); #endif --print_count; return(TRUE); } return(FALSE); } /* Print_Duration(from, to) Calculate and print the days and hh:mm between * the log-in and the log-out. */ void Print_Duration(from, to) long from; long to; { long delta, days, hours, minutes; delta = max(to - from, 0); days = delta / (24L * 60L * 60L); delta = delta % (24L * 60L * 60L); hours = delta / (60L * 60L); delta = delta % (60L * 60L); minutes = delta / 60L; if (days > 0) printf("(%ld+", days); else printf(" ("); printf("%02ld:%02ld)\n", hours, minutes); } /* Print_Uptime() Calculate and print the "uptime" between the last recorded * boot and the current time. */ void Print_Uptime() { char *utmp_file = "/etc/utmp"; unsigned nusers; struct utmp ut; FILE *uf; time_t now; struct tm *tm; unsigned long up; /* Count the number of active users in the utmp file. */ if ((uf = fopen(utmp_file, "r")) == NULL) { fprintf(stderr, "%s: %s: %s\n", prog, utmp_file, strerror(eO��O��O��O��O����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������rrno)); exit(1); } nusers = 0; while (fread(&ut, sizeof(ut), 1, uf) == 1) { #ifdef USER_PROCESS if (ut.ut_type == USER_PROCESS) nusers++; #else if (ut.ut_name[0] != 0 && ut.ut_line[0] != 0) nusers++; #endif } fclose(uf); /* Current time. */ now = time((time_t *) NULL); tm = localtime(&now); /* Uptime. */ up = now - boot_time; printf(" %d:%02d up", tm->tm_hour, tm->tm_min); if (up >= 24 * 3600L) { unsigned long days = up / (24 * 3600L); printf(" %lu day%s,", days, days == 1 ? "" : "s"); } printf(" %lu:%02lu,", (up % (24 * 3600L)) / 3600, (up % 3600) / 60); printf(" %u user%s\n", nusers, nusers == 1 ? "" : "s"); } /* Record_Logout_Time(wtmp) A linked list of "last logout time" is kept. * Each element of the list is for one terminal. */ void Record_Logout_Time(wtmp) struct utmp *wtmp; { logout *link; /* see if the terminal is already in the list */ for (link = first_link; link != NULL; link = link->next) if (!strncmp(link->line, wtmp->ut_line, (size_t)8)) { link->time = wtmp->ut_time; return; } /* allocate a new logout record, for a tty not previously encountered */ link = (logout *) malloc(sizeof(logout)); if (link == NULL) { fprintf(stderr, "%s: malloc failure\n", prog); exit(1); } strncpy(link->line, wtmp->ut_line, (size_t)8); link->time = wtmp->ut_time; link->next = first_link; first_link = link; } int main(argc, argv) int argc; char *argv[]; { char *wtmp_file = "/usr/adm/wtmp"; FILE *f; long size; /* Number of wtmp records in the file */ int wtmp_count; /* How many to read into wtmp_buffer */ struct utmp wtmp_buffer[MAX_WTMP_COUNT]; if ((prog = strrchr(argv[0], '/')) == NULL) prog = argv[0]; else prog++; --argc; ++argv; while (argc > 0 && *argv[0] == '-') { if (!strcmp(argv[0], "-r")) boot_limit = TRUE; else if (!strcmp(argv[0], "-u")) tell_uptime = TRUE; else if (argc > 1 && !strcmp(argv[0], "-f")) { wtmp_file = argv[1]; --argc; ++argv; } else if ((print_count = atoi(argv[0] + 1)) > 0) count_limit = TRUE; else usage(); --argc; ++argv; } arg_count = argc; args = argv; if (!strcmp(prog, "uptime")) tell_uptime = TRUE; if ((f = fopen(wtmp_file, "r")) == NULL) { perror(wtmp_file); exit(1); } if (fseek(f, 0L, 2) != 0 || (size = ftell(f)) % sizeof(struct utmp) != 0) { fprintf(stderr, "%s: invalid wtmp file\n", prog); exit(1); } if (signal(SIGINT, SIG_IGN) != SIG_IGN) { signal(SIGINT, Sigint); signal(SIGQUIT, Sigquit); } size /= sizeof(struct utmp); /* Number of records in wtmp */ if (size == 0) wtmp_buffer[0].ut_time = time((time_t *)0); while (size > 0) { wtmp_count = (int) min(size, MAX_WTMP_COUNT); size -= (long) wtmp_count; fseek(f, size * sizeof(struct utmp), 0); if (fread(&wtmp_buffer[0], sizeof(struct utmp), (size_t)wtmp_count, f) != wtmp_count) { fprintf(stderr, "%s: read error on wtmp file\n", prog); exit(1); } while (--wtmp_count >= 0) { Process(&wtmp_buffer[wtmp_count]); if (interrupt) { printf("\ninterrupted %.16s \n", ctime(&wtmp_buffer[wtmp_count].ut_time)); if (interrupt == SIGINT) exit(2); interrupt = FALSE; signal(SIGQUIT, Sigquit); } } } /* end while(size > 0) */ if (tell_uptime) { fprintf(stderr, "%s: no reboot record in wtmp file to compute uptime from\n", prog); return(1); } printf("\nwtmp begins %.16s \n", ctime(&wtmp_buffer[0].ut_time)); return(0); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Usage: leave [ [+] hh[:]mm ] * * Author: Terrence W. Holm * * Revision: * Fred van Kempen, MINIX User Group Holland * -adapted to MSS * -adapted to new utmp database * -adapted to POSIX (MINIX 1.5) * Michael Temari, <temari@ix.netcom.com> * -use localtime/mktime to fix bug with DST */ #include <sys/types.h> #include <signal.h> #include <time.h> #include <utmp.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> #define Min(a,b) ((a<b) ? a : b) #define STRING 80 /* lots of room for an argument */ #define MIN 60L /* seconds per minute */ #define HOUR (60L*60L) /* seconds per hour */ /* Set the following to your personal preferences for the * time and contents of warnings. */ #define INTERVALS 13 /* size of intervals[] */ #define WARNINGS 4 /* size of warnings[] */ static char *Version = "@(#) LEAVE 1.4 (01/09/90)"; static int intervals[INTERVALS] = { -5 * MIN, -1 * MIN, 0, MIN, 2 * MIN, 3 * MIN, 4 * MIN, 5 * MIN, 6 * MIN, 7 * MIN, 8 * MIN, 9 * MIN, 10 * MIN }; static char *warnings[WARNINGS] = { "You have to leave within 5 minutes", "Just one more minute!", "Time to leave!", "You're going to be late!" /* for all subsequent warnings */ }; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Usage, (void)); _PROTOTYPE(void Get_Hour_Min, (char *when, int *hour, int *min)); _PROTOTYPE(int Still_Logged_On, (char *user, char *tty)); void Usage() { fprintf(stderr, "Usage: leave [[+]hh[:]mm]\n"); exit(1); } void Get_Hour_Min(when, hour, min) char *when; int *hour; int *min; { int hour_min; int just_min = 0; switch (sscanf(when, "%d:%d", &hour_min, &just_min)) { case 1: *hour = hour_min / 100; *min = hour_min % 100; break; case 2: *hour = hour_min; *min = just_min; break; default: Usage(); } if (hour_min < 0 || just_min < 0 || *min > 59) Usage(); } int Still_Logged_On(user, tty) char *user; char *tty; { FILE *f; struct utmp login; if ((f = fopen(UTMP, "r")) == NULL) /* no login/logout records kept */ return(1); while (fread(&login, sizeof(struct utmp), (size_t)1, f) == 1) { if (!strncmp(login.ut_line, tty, (size_t)8)) if (!strncmp(login.ut_name, user, (size_t)8)) { fclose(f); return(1); } else { fclose(f); return(0); } } fclose(f); return(0); } int main(argc, argv) int argc; char *argv[]; { char when[STRING]; time_t now = time((time_t *)0); time_t leave, delta; struct tm *tm; int hour, min; int pid, i; char *user = cuserid( (char *)NULL); char *tty = ttyname(0) + 5; /* get the argument string "when" either from stdin, or argv */ if (argc <= 1) { printf("When do you have to leave? "); fflush(stdout); if (fgets(when, STRING, stdin) == NULL || when[0] == '\n') exit(0); } else { strcpy(when, argv[1]); if (argc > 2) strcat(when, argv[2]); } /* determine the leave time from the current time and "when" */ tm = localtime(&now); if (when[0] == '+') { Get_Hour_Min(&when[1], &hour, &min); tm->tm_hour += hour; tm->tm_min += min; leave = mktime(tm); } else { /* user entered an absolute time */ Get_Hour_Min(&when[0], &hour, &min); tm->tm_hour = hour; tm->tm_min = min; leave = mktime(tm); if (leave < now) { printf("That time has already passed!\n"); exit(1); } } printf("Alarm set for %s", ctime(&leave)); if ((pid = fork()) == -1) { fprintf(stderr, "leave: can not fork\n"); exit(1); } if (pid != 0) exit(0); /* only the child continues on */ if (user == NULL || tty == NULL) { fprintf(stderr, "leave: Can not determine user and terminal name\n"); exit(1); } signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); for (;;) { if (!Still_Logged_On(user, tty)) exit(0); /* how much longer until the leave time? */ /* XXX - use difftime all over. */ delta = leave - time((time_t *)0); /* which interval are we currently in? */ for (i = 0; i < INTERVALS; ++i) if (delta + intervals[i] > 0) break; /* if we are within intervals[0] then print a warning If * there are more intervals than messages, then use/ * warnings[WARNINGS-1] for all subsequent messages. */ if (i > 0) printf("\007\r%s\r\n", warnings[i > WARNINGS ? WARNINGS - 1 : i - 1]); if (i == INTERVALS) { printf("That was the last time I'll tell you. Bye.\r\n"); exit(0); } /* Sleep until the next interval. For long periods, wake up * every hour to check if the user is still on (also required * because 16 bit ints don't allow long waits). */ sleep((unsigned) Min(delta + intervals[i], HOUR)); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* life - Conway's game of life Author: Jim King */ /* clife.c - curses life simulator. Translated from Pascal to C implementing * curses Oct 1988 by pulsar@lsrhs, not jek5036@ritvax.isc.rit.edu * life needs about 18kb stack space on MINIX. * * Flags: -d draw your own screen using arrows and space bar * -p print statistics on the bottom line during the game */ #include <sys/types.h> #include <signal.h> #include <time.h> #include <curses.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #if __minix_vmd /* Use a more random rand(). */ #define srand(seed) srandom(seed) #define rand() random() #endif /* A value of -1 will make it go forever */ /* A value of 0 will make it exit immediately */ #define REPSTOP -1 /* number of repetitions before stop */ int present[23][80]; /* screen 1 cycle ago */ int past[23][80]; /* screen this cycle */ int total; /* total # of changes */ int icnt; /* counter to check for repetition */ int maxrow = 22; /* some defines to represent the screen */ int maxcol = 79; int minrow = 0; int mincol = 0; int pri = 0; /* flag for printing stats on bottom line */ int draw = 0; /* flag for drawing your own screen */ int i, j, k; /* loop counters */ int cycle; /* current cycle # */ int changes; /* # of changes this cycle (live + die) */ int die; /* number of deaths this cycle */ int live; /* number of births this cycle */ WINDOW *mns; /* Main Screen */ WINDOW *info; /* Bottom line */ _PROTOTYPE(void cleanup, (int s)); _PROTOTYPE(void initialize, (void)); _PROTOTYPE(void makscr, (void)); _PROTOTYPE(void update, (void)); _PROTOTYPE(void print, (void)); _PROTOTYPE(int main, (int ac, char *av[])); /* Cleanup - cleanup then exit */ void cleanup(s) int s; { move(23, 0); /* go to bottom of screen */ refresh(); /* update cursor */ endwin(); /* shutdown curses */ exit(1); /* exit */ } /* Initialize - init windows, variables, and signals */ void initialize() { srand(getpid()); /* init random seed */ initscr(); /* init curses */ noecho(); curs_set(0); signal(SIGINT, cleanup); /* catch ^C */ mns = newwin(maxrow, maxcol, 0, 0); /* new window */ scrollok(mns, FALSE); info = newwin(1, 80, 23, 0); scrollok(info, FALSE); wclear(mns); wclear(info); wmove(info, 0, 0); wrefresh(info); if (!draw) { /* if no draw, make random pattern */ for (j = 0; j < maxrow; j++) { for (k = 0; k < maxcol; k++) { present[j][k] = rand() % 2; if (present[j][k] == 1) changes++, live++; } } } } /* Makscr - make your own screen using arrow keys and space bar */ void makscr() { int curx, cury; /* current point on screen */ char c; /* input char */ wclear(info); wmove(info, 0, 0); wprintw(info, "Use arrow keys to move, space to place / erase, ^D to start", NULL); wrefresh(info); curx = cury = 1; wmove(mns, cury - 1, curx - 1); wrefresh(mns); noecho(); for (;;) { c = wgetch(mns); if (c == '\004') break; else if (c == ' ') { if (present[cury][curx]) { --present[cury][curx]; changes++; die++; mvwaddch(mns, cury, curx, ' '); } else { ++present[cury][curx]; changes++; live++; mvwaddch(mns, cury, curx, '*'); } } else if (c == '\033') { wgetch(mns); switch (wgetch(mns)) { case 'A': --cury; break; case 'B': ++cury; break; case 'C': ++curx; break; case 'D': --curx; break; default: break; } } if (cury > maxrow) cury = minrow; if (cury < minrow) cury = maxrow; if (curx > maxcol) curx = mincol; if (curx < mincol) curx = maxcol; wmove(mns, cury, curx); wrefresh(mns); } wclear(info); } /* Update rules: 2 or 3 adjacent alive --- stay alive * 3 adjacent alive -- dead to live * all else die or stay dead */ void update() { /* Does all mathmatical calculations */ int howmany, w, x, y, z; changes = die = live = 0; for (j = 0; j < maxrow; j++) { for (k = 0; k < maxcol; k++) { w = j - 1; x = j + 1; y = k - 1; z = k + 1; howmany = (past[w][y] + past[w][k] + past[w][z] + past[j][y] + past[j][z] + past[x][y] + past[x][k] + past[x][z]); switch (howmany) { case 0: case 1: case 4: case 5: case 6: case 7: case 8: present[j][k] = 0; if (past[j][k]) changes++, die++; break; case 3: present[j][k] = 1; if (!past[j][k]) changes++, live++; break; default: break; } } } if (live == die) ++icnt; else icnt = 0; if (icnt == REPSTOP) cleanup(0); } /* Print - updates the screen according to changes from past to present */ void print() { /* Updates the screen, greatly improved using curses */ if (pri) { wmove(info, 0, 0); total += changes; cycle++; wprintw(info, "Cycle %5d | %5d changes: %5d died + %5d born = %5u total changes", (char *) cycle, changes, die, live, total); wclrtoeol(info); } for (j = 1; j < maxrow; j++) { for (k = 1; k < maxcol; k++) { if (present[j][k] != past[j][k] && present[j][k] == 1) { wmove(mns, j, k); wprintw(mns, "*", NULL); } else if (present[j][k] != past[j][k] && present[j][k] == 0) { wmove(mns, j, k); wprintw(mns, " ", NULL); } } } if (pri) wrefresh(info); wrefresh(mns); } /* Main - main procedure */ int main(ac, av) int ac; char *av[]; { if (ac > 1) { for (j = 1; j < ac; j++) { switch (av[j][1]) { case 'd': ++draw; break; case 'p': ++pri; break; default: fprintf(stderr, "%s: usage: %s [-d] [-p]\n", av[0], av[0]); exit(1); } } } initialize(); if (draw) makscr(); for (;;) { print(); for (j = 0; j < maxrow; j++) { for (k = 0; k < maxcol; k++) past[j][k] = present[j][k]; } update(); } } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* login - log into the system Author: Patrick van Kleef */ /* Original version by Patrick van Kleef. History of modifications: * * Peter S. Housel Jan. 1988 * - Set up $USER, $HOME and $TERM. * - Set signals to SIG_DFL. * * Terrence W. Holm June 1988 * - Allow a username as an optional argument. * - Time out if a password is not typed within 60 seconds. * - Perform a dummy delay after a bad username is entered. * - Don't allow a login if "/etc/nologin" exists. * - Cause a failure on bad "pw_shell" fields. * - Record the login in "/usr/adm/wtmp". * * Peter S. Housel Dec. 1988 * - Record the login in "/etc/utmp" also. * * F. van Kempen June 1989 * - various patches for Minix V1.4a. * * F. van Kempen September 1989 * - added login-failure administration (new utmp.h needed!). * - support arguments in pw_shell field * - adapted source text to MINIX Style Sheet * * F. van Kempen October 1989 * - adapted to new utmp database. * F. van Kempen, December 1989 * - fixed 'slot' assumption in wtmp() * - fixed all MSS-stuff * - adapted to POSIX (MINIX 1.5) * F. van Kempen, January 1990 * - made all 'bad login accounting' optional by "#ifdef BADLOG". * F. van Kempen, Februari 1990 * - fixed 'first argument' bug and added some casts. * * Andy Tanenbaum April 1990 * - if /bin/sh cannot be located, try /usr/bin/sh * * Michael A. Temari October 1990 * - handle more than single digit tty devices * * Philip Homburg - Feb 28 1992 * - use ttyname to get the name of a tty. * * Kees J. Bot - Feb 13 1993 * - putting out garbage. * - added lastlog. * * Kees J. Bot - Feb 13 1993 * - supplementary groups. * * Kees J. Bot - Jan 3 1996 * - ported back to standard Minix. */ #include <sys/types.h> #include <sys/stat.h> #include <ttyent.h> #include <errno.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <utmp.h> #include <time.h> #include <minix/minlib.h> char PATH_UTMP[] = "/etc/utmp"; /* current logins */ char PATH_WTMP[] = "/usr/adm/wtmp"; /* login/logout history */ char PATH_LASTLOG[] = "/usr/adm/lastlog"; /* last login history */ char PATH_MOTD[] = "/etc/motd"; /* message of the day */ #define TTY_GID 4 /* group ID of ttys */ #define EXTRA_ENV 6 /* Crude indication of a tty being physically secure: */ #define securetty(dev) ((unsigned) ((dev) - 0x0400) < (unsigned) 8) int time_out; char *hostname; char user[32]; char logname[35]; char home[128]; char shell[128]; char term[128]; char **env; extern char **environ; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void wtmp, (char *user, int uid)); _PROTOTYPE(void show_file, (char *nam)); _PROTOTYPE(void Time_out, (int dummy)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void add2env, (char **env, char *entry, int replace)); void wtmp(user, uid) char *user; /* user name */ int uid; /* user id */ { /* Make entries in /usr/adm/wtmp and /etc/utmp. */ struct utmp entry; register int fd= -1; int lineno; int err = 0; char *what; /* First, read the current UTMP entry. we need some of its * parameters! (like PID, ID etc...). */ what= "ttyslot()"; lineno= ttyslot(); if (lineno == 0) err= errno; /* ttyslot failed */ if (err == 0 && (fd = open(what = PATH_UTMP, O_RDONLY)) < 0) { if (errno == ENOENT) return; err= errno; } if (err == 0 && lseek(fd, (off_t) lineno * sizeof(entry), SEEK_SET) < 0) err= errno; if (err == 0 && read(fd, (char *) &entry, sizeof(entry)) != sizeof(entry)) err= errno; if (fd >= 0) close(fd); /* Enter new fields. */ strncpy(entry.ut_user, user, sizeof(entry.ut_user)); if (hostname) strncpy(entry.ut_host, hostname, sizeof(entry.ut_host)); if (entry.ut_pid == 0) entry.ut_pid = getpid(); entry.ut_type = USER_PROCESS; /* we are past login... */ time(&entry.ut_time); /* Write a WTMP record. */ if (err == 0) { if ((fd = open(what = PATH_WTMP, O_WRONLY|O_APPEND)) < 0) { if (errno != ENOENT) err= errno; } else { if (write(fd, (char *) &entry, sizeof(entry)) < 0) err= errno; close(fd); } } /* Rewrite the UTMP entry. */ if (err == 0 && (fd = open(what = PATH_UTMP, O_WRONLY)) < 0) err= errno; if (err == 0 && lseek(fd, (off_t) lineno * sizeof(entry), SEEK_SET) < 0) err= errno; if (err == 0 && write(fd, (char *) &entry, sizeof(entry)) < 0) err= errno; if (fd >= 0) close(fd); /* Write the LASTLOG entry. */ if (err == 0 && (fd = open(what = PATH_LASTLOG, O_WRONLY)) < 0) { if (errno == ENOENT) return; err= errno; } if (err == 0 && lseek(fd, (off_t) uid * sizeof(entry), SEEK_SET) < 0) err= errno; if (err == 0 && write(fd, (char *) &entry, sizeof(entry)) < 0) err= errno; if (fd >= 0) close(fd); if (err != 0) { fprintf(stderr, "login: %s: %s\n", what, strerror(err)); return; } } void show_file(nam) char *nam; { /* Read a textfile and show it on the desired terminal. */ register int fd, len; char buf[80]; if ((fd = open(nam, O_RDONLY)) > 0) { len = 1; while (len > 0) { len = read(fd, buf, 80); write(1, buf, len); } close(fd); } } int main(argc, argv) int argc; char *argv[]; { char name[30]; char *password, *cryptedpwd; char *tty_name; int n, ap, check_pw, bad, secure, i, envsiz; struct passwd *pwd; char *bp, *argx[8], **ep; /* pw_shell arguments */ char argx0[64]; /* argv[0] of the shell */ char *sh = "/bin/sh"; /* sh/pw_shell field value */ char *initialname; int c, f_flag, p_flag; char *h_arg; int authorized, preserv_env; struct ttyent *ttyp; struct stat ttystat; struct sigaction sa; /* Don't let QUIT dump core. */ sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = exit; sigaction(SIGQUIT, &sa, NULL); /* Parse options. */ f_flag= 0; p_flag= 0; h_arg= NULL; while ((c= getopt(argc, argv, "?fh:p")) != -1) { switch(c) { case 'f': if (f_flag) usage(); f_flag= 1; break; case 'h': if (h_arg) usage(); if (getuid() == 0) h_arg= optarg; break; case 'p': if (p_flag) usage(); p_flag= 1; break; case '?': usage(); default: fprintf(stderr, "login: getopt failed: '%c'\n", c); exit(1); } } if (optind < argc) initialname= argv[optind++]; else initialname= NULL; if (optind != argc) usage(); authorized= f_flag; hostname= h_arg; preserv_env= p_flag; /* Look up /dev/tty number. */ tty_name= ttyname(0); if (tty_name == NULL) { write(1, "Unable to lookup tty name\n", 26); exit(1); } /* Get login name and passwd. */ for (;;initialname= NULL) { if (initialname) strcpy(name, initialname); else { do { write(1, "login: ", 7); n = read(0, name, 30); if (n == 0) exit(1); if (n < 0) { if (errno != EINTR) fprintf(stderr, "login: read failed: %s\n", strerror(errno)); exit(1); } } while (n < 2); name[n - 1] = 0; } /* Start timer running. */ time_out = 0; sa.sa_handler = Time_out; sigaction(SIGALRM, &sa, NULL); alarm(60); /* Look up login/passwd. */ pwd = getpwnam(name); check_pw = 1; /* default is check password. */ /* For now, only console is secure. */ secure = fstat(0, &ttystat) == 0 && securetty(ttystat.st_rdev); if (pwd && authorized && initialname && (pwd->pw_uid == getuid() || getuid() == 0)) { check_pw= 0; /* Don't ask a password for * pre-authorized users. */ } else if (pwd && secure && strcmp(crypt("", pwd->pw_passwd), pwd->pw_passwd) == 0) { check_pw= 0; /* empty password */ } if (check_pw) { password = getpass("Password:"); if (time_out) exit(1); bad = 0; if (!pwd) bad = 1; if (!password) { password = ""; bad = 1; } if (!secure && pwd && strcmp(crypt("", pwd->pw_passwd), pwd->pw_passwd) == 0) bad = 1; cryptedpwd = bad ? "*" : pwd->pw_passwd; if (strcmp(crypt(password, cryptedpwd), cryptedpwd) != 0) { write(1, "Login incorrect\n", 16); continue; } } /* Check if the system is going down */ if (access("/etc/nologin", 0) == 0 && strcmp(name, "root") != 0) { write(1, "SysteO��O��O��O��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������m going down\n\n", 19); continue; } /* Stop timer. */ alarm(0); /* Write login record to /usr/adm/wtmp and /etc/utmp */ wtmp(name, pwd->pw_uid); /* Create the argv[] array from the pw_shell field. */ ap = 0; argx[ap++] = argx0; /* "-sh" most likely */ if (pwd->pw_shell[0]) { sh = pwd->pw_shell; bp = sh; while (*bp) { while (*bp && *bp != ' ' && *bp != '\t') bp++; if (*bp == ' ' || *bp == '\t') { *bp++ = '\0'; /* mark end of string */ argx[ap++] = bp; } } } else argx[ap] = NULL; strcpy(argx0, "-"); /* most shells need it for their .profile */ if ((bp= strrchr(sh, '/')) == NULL) bp = sh; else bp++; strncat(argx0, bp, sizeof(argx0) - 2); /* Set the environment */ if (p_flag) { for (ep= environ; *ep; ep++) ; } else ep= environ; envsiz= ep-environ; env= calloc(envsiz + EXTRA_ENV, sizeof(*env)); if (env == NULL) { fprintf(stderr, "login: out of memory\n"); exit(1); } for (i= 0; i<envsiz; i++) env[i]= environ[i]; strcpy(user, "USER="); strcat(user, name); add2env(env, user, 1); strcpy(logname, "LOGNAME="); strcat(logname, name); add2env(env, logname, 1); strcpy(home, "HOME="); strcat(home, pwd->pw_dir); add2env(env, home, 1); strcpy(shell, "SHELL="); strcat(shell, sh); add2env(env, shell, 1); if ((ttyp = getttynam(tty_name + 5)) != NULL) { strcpy(term, "TERM="); strcat(term, ttyp->ty_type); add2env(env, term, 0); } /* Show the message-of-the-day. */ show_file(PATH_MOTD); /* Assign the terminal to this user. */ chown(tty_name, pwd->pw_uid, TTY_GID); chmod(tty_name, 0620); /* Change id. */ #if __minix_vmd initgroups(pwd->pw_name, pwd->pw_gid); #endif setgid(pwd->pw_gid); setuid(pwd->pw_uid); /* cd $HOME */ chdir(pwd->pw_dir); /* Reset signals to default values. */ sa.sa_handler = SIG_DFL; for (n = 1; n <= _NSIG; ++n) sigaction(n, &sa, NULL); /* Execute the user's shell. */ execve(sh, argx, env); if (pwd->pw_gid == 0) { /* Privileged user gets /bin/sh in times of crisis. */ sh= "/bin/sh"; argx[0]= "-sh"; strcpy(shell, "SHELL="); strcat(shell, sh); execve(sh, argx, env); } fprintf(stderr, "login: can't execute %s: %s\n", sh, strerror(errno)); exit(1); } return(0); } void Time_out(dummy) int dummy; /* to keep the compiler happy */ { write(2, "\r\nLogin timed out after 60 seconds\r\n", 36); time_out = 1; } void usage() { fprintf(stderr, "Usage: login [-h hostname] [-f] [-p] [username]\n"); exit(1); } void add2env(env, entry, replace) char **env; char *entry; int replace; { /* Replace an environment variable with entry or add entry if the environment * variable doesn't exit yet. */ char *cp; int keylen; cp= strchr(entry, '='); keylen= cp-entry+1; for(; *env; env++) { if (strncmp(*env, entry, keylen) == 0) { if (!replace) return; /* Don't replace */ break; } } *env= entry; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* look - look up words in the dictionary Author: Terrence W. Holm */ /* look [ -f ] prefix[/suffix] [ dictionary ] * * Looks for all words in the on-line dictionary * beginning with the specified <prefix> and ending * with <suffix>. * * Fold to lower case if "-f" given. Use the file * "dictionary" or /usr/lib/dict/words. * ****************************************************** * * This command was written for MINIX, and is slightly * different than the UNIX look(1). First of all, the * list of words is in a different place. Second, these * words are not sorted by -df. And finally, the * ``suffix'' option was added to limit the output of * the multiple variations of each word as contained * in the MINIX dictionary. */ #include <ctype.h> #include <sys/types.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #ifdef UNIX #define WORDS "/usr/dict/words" #else #define WORDS "/usr/lib/dict/words" #endif #define MAX_WORD_LENGTH 80 /* including '\0' */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Fold, (char *str)); _PROTOTYPE(void File_Error, (char *word_file)); int main(argc, argv) int argc; char *argv[]; { int fold = 0; char *prefix; char *suffix; char *word_file = WORDS; FILE *words; long head = 0; long tail; long mid_point; char word[MAX_WORD_LENGTH]; char unfolded_word[MAX_WORD_LENGTH]; int cmp; /* Check the arguments: fold, prefix, suffix and word_file. */ if (argc > 1 && strcmp(argv[1], "-f") == 0) { fold = 1; --argc; ++argv; } if (argc < 2 || argc > 3) { fprintf(stderr, "Usage: %s [-f] prefix[/suffix] [dictionary]\n", argv[0]); exit(1); } prefix = argv[1]; if ((suffix = strchr(prefix, '/')) == NULL) suffix = ""; else *suffix++ = '\0'; if (fold) { Fold(prefix); Fold(suffix); } if (argc == 3) word_file = argv[2]; /* Open the word file, and find how big it is. */ if ((words = fopen(word_file, "r")) == NULL) File_Error(word_file); if (fseek(words, 0L, SEEK_END) != 0) File_Error(word_file); tail = ftell(words); /* Use a binary search on the word file to find a 512 byte */ /* Window containing the first word starting with "prefix". */ while (head + 512 < tail) { mid_point = (head + tail) / 2; if (fseek(words, mid_point, SEEK_SET) != 0) File_Error(word_file); /* Skip the partial word we seeked into. */ fgets(word, MAX_WORD_LENGTH, words); if (fgets(word, MAX_WORD_LENGTH, words) == NULL) File_Error(word_file); word[strlen(word) - 1] = '\0'; /* remove \n */ strcpy(unfolded_word, word); if (fold) Fold(word); cmp = strcmp(prefix, word); if (cmp == 0) { printf("%s\n", unfolded_word); head = ftell(words); break; } if (cmp < 0) tail = mid_point; else head = ftell(words); } fseek(words, head, SEEK_SET); { /* Print out all the words starting with "prefix". */ size_t prefix_length = strlen(prefix); int suffix_length = strlen(suffix); int word_length; while (fgets(word, MAX_WORD_LENGTH, words) != NULL) { word_length = strlen(word) - 1; word[word_length] = '\0'; /* remove \n */ strcpy(unfolded_word, word); if (fold) Fold(word); cmp = strncmp(prefix, word, prefix_length); if (cmp < 0) break; if (cmp == 0) if (suffix_length == 0 || (word_length >= suffix_length && strcmp(suffix, word + word_length - suffix_length) == 0)) printf("%s\n", unfolded_word); } } fclose(words); return(0); } void Fold(str) char *str; { while (*str) { if (isupper(*str)) *str = *str - 'A' + 'a'; str++; } } void File_Error(word_file) char *word_file; { perror(word_file); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* lp 1.4 - Send file to the lineprinter Author: Kees J. Bot * 3 Dec 1989 */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <limits.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sys/wait.h> char LPD1[] = "/usr/sbin/lpd"; /* Proper place of lpd */ char LPD2[] = "/usr/bin/lpd"; /* Minix has no sbin directories. */ void report(char *mess) { fprintf(stderr, "lp: %s: %s\n", mess, strerror(errno)); } void fatal(char *mess) { report(mess); exit(1); } void lp(char *file) /* Start the lpd daemon giving it the file to spool and print. */ { int pid, status; if (file[0] != '/' || (pid= fork()) == 0) { execl(LPD1, LPD1, file, (char *) nil); if (errno != ENOENT) fatal(LPD1); execl(LPD2, LPD2, file, (char *) nil); fatal(LPD2); } if (pid < 0) fatal("can't fork"); if (waitpid(pid, &status, 0) < 0) fatal("wait"); if (status != 0) exit(1); } char path[PATH_MAX+1]; int cwdsize; int main(int argc, char **argp) { int e=0; char *file; if (argc <= 1) lp("stdin"); /* Lpd requires full path names, so find out where we are. */ if (getcwd(path, sizeof(path)) == nil) fatal("Can't determine current directory"); cwdsize= strlen(path); /* Hand each file to lpd. */ while ((file= *++argp) != nil) { close(0); if (open(file, O_RDONLY) != 0) { report(file); e=1; continue; } if (file[0] == '/') { lp(file); continue; } if (cwdsize + 1 + strlen(file) + 1 > sizeof(path)) { fprintf(stderr, "lp: full pathname of %s is too long\n", file); e=1; continue; } path[cwdsize] = '/'; strcpy(path + cwdsize + 1, file); lp(path); } exit(e); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* lpd 1.5 - Printer daemon Author: Kees J. Bot * 3 Dec 1989 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> #include <fcntl.h> #include <unistd.h> #include <termcap.h> char PRINTER[] = "/dev/lp"; char SPOOL[] = "/usr/spool/lpd"; char LOG[] = "/dev/log"; void report(char *mess) { fprintf(stderr, "lpd: %s: %s\n", mess, strerror(errno)); } void fatal(char *mess) { report(mess); exit(1); } char jobX[] = "jobXXXXXX"; char tmpX[] = "tmpXXXXXX"; void spoolerr(char *file) { int e= errno; unlink(jobX); unlink(tmpX); fatal(file); } void spool(char *path) /* Place a file into the spool directory, either by copying it, or by leaving * a reference. */ { char *file; int j, u; mktemp(jobX); file= mktemp(tmpX); if (path[0] == '/') { int f; if ((f= open(path, O_RDONLY)) >= 0) { close(f); file= path; } } if (file != path) { int c; FILE *t; if ((t= fopen(tmpX, "w")) == nil) spoolerr(tmpX); while ((c= getchar()) != EOF && putc(c, t) != EOF) {} if (ferror(stdin)) spoolerr(path); if (ferror(t) || fclose(t) == EOF) spoolerr(tmpX); fclose(stdin); } if ((j= open(jobX, O_WRONLY|O_CREAT|O_EXCL, 0000)) < 0) spoolerr(jobX); u= getuid(); if (write(j, file, strlen(file)+1) < 0 || write(j, &u, sizeof(u)) < 0 || write(j, path, strlen(path)+1) < 0 || close(j) < 0 || chmod(jobX, 0600) < 0 ) spoolerr(jobX); } struct job { struct job *next; time_t age; char name[sizeof(jobX)]; } *jobs = nil; int job(void) /* Look for print jobs in the spool directory. Make a list of them sorted * by age. Return true iff the list is nonempty. */ { DIR *spool; struct dirent *entry; struct job *newjob, **ajob; struct stat st; if (jobs != nil) return 1; if ((spool= opendir(".")) == nil) fatal(SPOOL); while ((entry= readdir(spool)) != nil) { if (strncmp(entry->d_name, "job", 3) != 0) continue; if (stat(entry->d_name, &st) < 0 || (st.st_mode & 0777) == 0000) continue; if ((newjob= malloc(sizeof(*newjob))) == nil) fatal("malloc()"); newjob->age = st.st_mtime; strcpy(newjob->name, entry->d_name); ajob= &jobs; while (*ajob != nil && (*ajob)->age < newjob->age) ajob= &(*ajob)->next; newjob->next= *ajob; *ajob= newjob; } closedir(spool); return jobs != nil; } /* What to do with control-X: * 0 ignore, * 1 give up on controlling the printer, assume user knows how printer works, * 2 print. */ char control[] = { 0, 1, 1, 1, 1, 1, 1, 0, /* \0, ^G don't show. */ 1, 2, 2, 1, 2, 2, 1, 1, /* \t, \n, \f, \r */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int lp; char buf[BUFSIZ]; int count, column, line, ncols = 80, nlines = 66; int flush(void) /* Copy the characters in the output buffer to the printer, with retries if * out of paper. */ { char *bp= buf; while (count > 0) { int retry = 0, complain = 0; int r; while ((r= write(lp, bp, count)) < 0) { if (errno != EAGAIN) fatal(PRINTER); if (retry == complain) { fprintf(stderr, "lpd: %s: Printer out of paper\n", PRINTER); complain= retry + 60; } sleep(1); retry++; } bp+= r; count-= r; } count = 0; } int put(int c) /* Send characters to the output buffer to be printed and do so if the buffer * is full. Track the position of the write-head in `column' and `line'. */ { buf[count++] = c; if (c == '\f') { column = 0; line = 0; } else if (c == '\r') { column = 0; } else if (c == '\n') { line++; } else { if (++column > ncols) { line++; column= 1; } } if (line == nlines) line= 0; if (count == BUFSIZ) { flush(); } } void print(FILE *f) /* Send the contents of an open file to the printer. Expand tabs and change * linefeed to a carriage-return linefeed sequence. Print a formfeed at the * end if needed to reach the top of the next page. If a control character * is printed that we do not know about, then the user is assumed to know * what they are doing, so output processing is disabled. */ { int c; count= column= line= 0; while ((c= getc(f)) != EOF) { if (c < ' ') { switch (control[c]) { case 0: continue; /* Ignore this one. */ case 1: /* Can't handle this junk, assume smart user. */ do { buf[count++] = c; if (count == BUFSIZ) flush(); } while ((c= getc(f)) != EOF); flush(); return; } } if (c == '\n') { put('\r'); put('\n'); } else if (c == '\t') { do { put(' '); } while (column & 07); } else put(c); } if (column > 0) { put('\r'); put('\n'); } if (line > 0) put('\f'); flush(); return; } void joberr(char *job) { fprintf(stderr, "lpd: something is wrong with %s\n", job); if (unlink(job) < 0) fatal("can't remove it"); } void work(void) /* Print all the jobs in the job list. */ { FILE *j, *f; char file[PATH_MAX+1], *pf=file; int c; struct job *job; job= jobs; jobs= jobs->next; if ((j= fopen(job->name, "r")) == nil) { joberr(job->name); return; } do { if (pf == file + sizeof(file) || (c= getc(j)) == EOF) { fclose(j); joberr(job->name); return; } *pf++ = c; } while (c != 0); fclose(j); if ((f= fopen(file, "r")) == nil) fprintf(stderr, "lpd: can't read %s\n", file); else { print(f); fclose(f); } if (file[0] != '/' && unlink(file) < 0) report(file); if (unlink(job->name) < 0) fatal(job->name); free(job); } void getcap(void) /* Find the line printer dimensions in the termcap database under "lp". */ { char printcap[1024]; int n; if (tgetent(printcap, "lp") == 1) { if ((n= tgetnum("co")) > 0) ncols= n; if ((n= tgetnum("li")) > 0) nlines= n; } } void haunt(void) /* Become a daemon, print jobs while there are any, exit. */ { int fd; if ((fd= open("/dev/tty", O_RDONLY)) != -1) { /* We have a controlling tty! Disconnect. */ close(fd); switch(fork()) { case -1: fatal("can't fork"); case 0: break; default: exit(0); } if ((fd= open("/dev/null", O_RDONLY)) < 0) fatal("/dev/null"); dup2(fd, 0); close(fd); if ((fd= open(LOG, O_WRONLY)) < 0) fatal(LOG); dup2(fd, 1); dup2(fd, 2); close(fd); setsid(); } getcap(); do { if ((lp= open(PRINTER, O_WRONLY)) < 0) { /* Another lpd? */ if (errno == EBUSY) exit(0); fatal(PRINTER); } while (job()) work(); close(lp); } while (job()); } int main(int argc, char **argv) { if (argc > 2) { fprintf(stderr, "Usage: %s [path | stdin < path]\n", argv[0]); exit(1); } umask(0077); if (chdir(SPOOL) < 0) fatal(SPOOL); if (argc == 2) spool(argv[1]); haunt(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ls 5.2 - List files. Author: Kees J. Bot * 25 Apr 1989 * * About the amount of bytes for heap + stack under Minix: * Ls needs a average amount of 42 bytes per unserviced directory entry, so * scanning 10 directory levels deep in an ls -R with 100 entries per directory * takes 42000 bytes of heap. So giving ls 10000 bytes is tight, 20000 is * usually enough, 40000 is pessimistic. */ /* The array l_ifmt[] is used in an 'ls -l' to map the type of a file to a * letter. This is done so that ls can list any future file or device type * other than symlinks, without recompilation. (Yes it's dirty.) */ char l_ifmt[] = "0pcCd?bB-?l?s???"; #define ifmt(mode) l_ifmt[((mode) >> 12) & 0xF] #define nil 0 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <stddef.h> #include <stdlib.h> #include <unistd.h> #include <dirent.h> #include <time.h> #include <pwd.h> #include <grp.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <termios.h> #include <sys/ioctl.h> #ifndef major #define major(dev) ((int) (((dev) >> 8) & 0xFF)) #define minor(dev) ((int) (((dev) >> 0) & 0xFF)) #endif #if !__minix #define SUPER_ID uid /* Let -A flag be default for SUPER_ID == 0. */ #else #define SUPER_ID gid #endif #ifdef S_IFLNK int (*status)(const char *file, struct stat *stp); #else #define status stat #endif /* Basic disk block size is 512 except for one niche O.S. */ #if __minix #define BLOCK 1024 #else #define BLOCK 512 #endif /* Assume other systems have st_blocks. */ #if !__minix #define ST_BLOCKS 1 #endif /* Some terminals ignore more than 80 characters on a line. Dumb ones wrap * when the cursor hits the side. Nice terminals don't wrap until they have * to print the 81st character. Whether we like it or not, no column 80. */ int ncols= 79; #define NSEP 3 /* # spaces between columns. */ #define MAXCOLS 128 /* Max # of files per line. */ char *arg0; /* Last component of argv[0]. */ int uid, gid; /* callers id. */ int ex= 0; /* Exit status to be. */ int istty; /* Output is on a terminal. */ /* Safer versions of malloc and realloc: */ void heaperr(void) { fprintf(stderr, "%s: Out of memory\n", arg0); exit(-1); } void *allocate(size_t n) /* Deliver or die. */ { void *a; if ((a= malloc(n)) == nil) heaperr(); return a; } void *reallocate(void *a, size_t n) { if ((a= realloc(a, n)) == nil) heaperr(); return a; } char allowed[] = "acdfgilnpqrstu1ACDFLMRTX"; char flags[sizeof(allowed)]; char arg0flag[] = "cdfmrtx"; /* These in argv[0] go to upper case. */ void setflags(char *flgs) { int c; while ((c= *flgs++) != 0) { if (strchr(allowed, c) == nil) { fprintf(stderr, "Usage: %s [-%s] [file ...]\n", arg0, allowed); exit(1); } else if (strchr(flags, c) == nil) { flags[strlen(flags)] = c; } } } int present(int f) { return f == 0 || strchr(flags, f) != nil; } void report(char *f) /* Like perror(3), but in the style: "ls: junk: No such file or directory. */ { fprintf(stderr, "%s: %s: %s\n", arg0, f, strerror(errno)); ex= 1; } /* Two functions, uidname and gidname, translate id's to readable names. * All names are remembered to avoid searching the password file. */ #define NNAMES (1 << (sizeof(int) + sizeof(char *))) enum whatmap { PASSWD, GROUP }; struct idname { /* Hash list of names. */ struct idname *next; char *name; uid_t id; } *uids[NNAMES], *gids[NNAMES]; char *idname(unsigned id, enum whatmap map) /* Return name for a given user/group id. */ { struct idname *i; struct idname **ids= &(map == PASSWD ? uids : gids)[id % NNAMES]; while ((i= *ids) != nil && id < i->id) ids= &i->next; if (i == nil || id != i->id) { /* Not found, go look in the password or group map. */ char *name= nil; char noname[3 * sizeof(uid_t)]; if (!present('n')) { if (map == PASSWD) { struct passwd *pw= getpwuid(id); if (pw != nil) name= pw->pw_name; } else { struct group *gr= getgrgid(id); if (gr != nil) name= gr->gr_name; } } if (name == nil) { /* Can't find it, weird. Use numerical "name." */ sprintf(noname, "%u", id); name= noname; } /* Add a new id-to-name cell. */ i= allocate(sizeof(*i)); i->id= id; i->name= allocate(strlen(name) + 1); strcpy(i->name, name); i->next= *ids; *ids= i; } return i->name; } #define uidname(uid) idname((uid), PASSWD) #define gidname(gid) idname((gid), GROUP) /* Path name construction, addpath adds a component, delpath removes it. * The string path is used throughout the program as the file under examination. */ char *path; /* Path name constructed in path[]. */ int plen= 0, pidx= 0; /* Lenght/index for path[]. */ void addpath(int *didx, char *name) /* Add a component to path. (name may also be a full path at the first call) * The index where the current path ends is stored in *pdi. */ { if (plen == 0) path= (char *) allocate((plen= 32) * sizeof(path[0])); if (pidx == 1 && path[0] == '.') pidx= 0; /* Remove "." */ *didx= pidx; /* Record point to go back to for delpath. */ if (pidx > 0 && path[pidx-1] != '/') path[pidx++]= '/'; do { if (*name != '/' || pidx == 0 || path[pidx-1] != '/') { if (pidx == plen) { path= (char *) reallocate((void *) path, (plen*= 2) * sizeof(path[0])); } path[pidx++]= *name; } } while (*name++ != 0); --pidx; /* Put pidx back at the null. The path[pidx++]= '/' * statement will overwrite it at the next call. */ } #define delpath(didx) (path[pidx= didx]= 0) /* Remove component. */ int field = 0; /* (used to be) Fields that must be printed. */ /* (now) Effects triggered by certain flags. */ #define L_INODE 0x0001 /* -i */ #define L_BLOCKS 0x0002 /* -s */ #define L_EXTRA 0x0004 /* -X */ #define L_MODE 0x0008 /* -lMX */ #define L_LONG 0x0010 /* -l */ #define L_GROUP 0x0020 /* -g */ #define L_BYTIME 0x0040 /* -tuc */ #define L_ATIME 0x0080 /* -u */ #define L_CTIME 0x0100 /* -c */ #define L_MARK 0x0200 /* -F */ #define L_MARKDIR 0x0400 /* -p */ #define L_TYPE 0x0800 /* -D */ #define L_LONGTIME 0x1000 /* -T */ #define L_DIR 0x2000 /* -d */ struct file { /* A file plus stat(2) information. */ struct file *next; /* Lists are made of them. */ char *name; /* Null terminated name. */ ino_t ino; mode_t mode; uid_t uid; gid_t gid; nlink_t nlink; dev_t rdev; off_t size; time_t mtime; time_t atime; time_t ctime; #if ST_BLOCKS long blocks; #endif }; void setstat(struct file *f, struct stat *stp) { f->ino= stp->st_ino; f->mode= stp->st_mode; f->nlink= stp->st_nlink; f->uid= stp->st_uid; f->gid= stp->st_gid; f->rdev= stp->st_rdev; f->size= stp->st_size; f->mtime= stp->st_mtime; f->atime= stp->st_atime; f->ctime= stp->st_ctime; #if ST_BLOCKS f->blocks= stp->st_blocks; #endif } #define PAST (26*7*24*3600L) /* Half a year ago. */ /* Between PAST and FUTURE from now a time is printed, otherwise a year. */ #define FUTURE ( 1*7*24*3600L) /* One week. */ static char *timestamp(struct file *f) /* Transform the right time field into something readable. */ { struct tm *tm; time_t t; static time_t now; static int drift= 0; static char date[] = "Jan 19 03:14:07 2038"; static char month[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; t= f->mtime; if (field & L_ATIME) t= f->atime; if (field & L_CTIME) t= f->ctime; tm= localtime(&t); if (--drift < 0) { time(&now); drift= 50; } /* limit time() calls */ if (field & L_LONGTIME) { sprintf(date, "%.3s %2d %02d:%02d:%02d %d", month + 3*tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, 1900 + tm->tm_year); } else if (t < now - PAST || t > now + FUTURE) { sprintf(date, "%.3s %2d %d", month + 3*tm->tm_mon, tm->tm_mday, 1900 + tm->tm_year); } else { sprintf(date, "%.3s %2d %02d:%02d", month + 3*tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min); } return date; } char *permissions(struct file *f) /* Compute long or short rwx bits. */ { static char rwx[] = "drwxr-x--x"; rwx[0] = ifmt(f->mode); /* Note that rwx[0] is a guess for the more alien file types. It is * correct for BSD4.3 and derived systems. I just don't know how * "standardiP��P��P��P��P��P�� P�� P�� P�� P�� P��P��P��P��P��P��P��P��P��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������zed" these numbers are. */ if (field & L_EXTRA) { /* Short style */ int mode = f->mode, ucase= 0; if (uid == f->uid) { /* What group of bits to use. */ /* mode<<= 0, */ ucase= (mode<<3) | (mode<<6); /* Remember if group or others have permissions. */ } else if (gid == f->gid) { mode<<= 3; } else { mode<<= 6; } rwx[1]= mode&S_IRUSR ? (ucase&S_IRUSR ? 'R' : 'r') : '-'; rwx[2]= mode&S_IWUSR ? (ucase&S_IWUSR ? 'W' : 'w') : '-'; if (mode&S_IXUSR) { static char sbit[]= { 'x', 'g', 'u', 's' }; rwx[3]= sbit[(f->mode&(S_ISUID|S_ISGID))>>10]; if (ucase&S_IXUSR) rwx[3] += 'A'-'a'; } else { rwx[3]= f->mode&(S_ISUID|S_ISGID) ? '=' : '-'; } rwx[4]= 0; } else { /* Long form. */ char *p= rwx+1; int mode= f->mode; do { p[0] = (mode & S_IRUSR) ? 'r' : '-'; p[1] = (mode & S_IWUSR) ? 'w' : '-'; p[2] = (mode & S_IXUSR) ? 'x' : '-'; mode<<= 3; } while ((p+=3) <= rwx+7); if (f->mode&S_ISUID) rwx[3]= f->mode&(S_IXUSR>>0) ? 's' : '='; if (f->mode&S_ISGID) rwx[6]= f->mode&(S_IXUSR>>3) ? 's' : '='; if (f->mode&S_ISVTX) rwx[9]= f->mode&(S_IXUSR>>6) ? 't' : '='; } return rwx; } void numeral(int i, char **pp) { char itoa[3*sizeof(int)], *a=itoa; do *a++ = i%10 + '0'; while ((i/=10) > 0); do *(*pp)++ = *--a; while (a>itoa); } #define K 1024L /* A kilobyte counts in multiples of K */ #define T 1000L /* A megabyte in T*K, a gigabyte in T*T*K */ char *cxsize(struct file *f) /* Try and fail to turn a 32 bit size into 4 readable characters. */ { static char siz[] = "1.2m"; char *p= siz; off_t z; siz[1]= siz[2]= siz[3]= 0; if (f->size <= 5*K) { /* <= 5K prints as is. */ numeral((int) f->size, &p); return siz; } z= (f->size + K-1) / K; if (z <= 999) { /* Print as 123k. */ numeral((int) z, &p); *p = 'k'; /* Can't use 'K', looks bad */ } else if (z*10 <= 99*T) { /* 1.2m (Try ls -X /dev/at0) */ z= (z*10 + T-1) / T; /* Force roundup */ numeral((int) z / 10, &p); *p++ = '.'; numeral((int) z % 10, &p); *p = 'm'; } else if (z <= 999*T) { /* 123m */ numeral((int) ((z + T-1) / T), &p); *p = 'm'; } else { /* 1.2g */ z= (z*10 + T*T-1) / (T*T); numeral((int) z / 10, &p); *p++ = '.'; numeral((int) z % 10, &p); *p = 'g'; } return siz; } /* Transform size of file to number of blocks. This was once a function that * guessed the number of indirect blocks, but that nonsense has been removed. */ #if ST_BLOCKS #define nblocks(f) ((f)->blocks) #else #define nblocks(f) (((f)->size + BLOCK-1) / BLOCK) #endif /* From number of blocks to kilobytes. */ #if BLOCK < 1024 #define nblk2k(nb) (((nb) + (1024 / BLOCK - 1)) / (1024 / BLOCK)) #else #define nblk2k(nb) ((nb) * (BLOCK / 1024)) #endif static int (*CMP)(struct file *f1, struct file *f2); static int (*rCMP)(struct file *f1, struct file *f2); static void mergesort(struct file **al) /* This is either a stable mergesort, or thermal noise, I'm no longer sure. * It must be called like this: if (L != nil && L->next != nil) mergesort(&L); */ { /* static */ struct file *l1, **mid; /* Need not be local */ struct file *l2; l1= *(mid= &(*al)->next); do { if ((l1= l1->next) == nil) break; mid= &(*mid)->next; } while ((l1= l1->next) != nil); l2= *mid; *mid= nil; if ((*al)->next != nil) mergesort(al); if (l2->next != nil) mergesort(&l2); l1= *al; for (;;) { if ((*CMP)(l1, l2) <= 0) { if ((l1= *(al= &l1->next)) == nil) { *al= l2; break; } } else { *al= l2; l2= *(al= &l2->next); *al= l1; if (l2 == nil) break; } } } int namecmp(struct file *f1, struct file *f2) { return strcmp(f1->name, f2->name); } int mtimecmp(struct file *f1, struct file *f2) { return f1->mtime == f2->mtime ? 0 : f1->mtime > f2->mtime ? -1 : 1; } int atimecmp(struct file *f1, struct file *f2) { return f1->atime == f2->atime ? 0 : f1->atime > f2->atime ? -1 : 1; } int ctimecmp(struct file *f1, struct file *f2) { return f1->ctime == f2->ctime ? 0 : f1->ctime > f2->ctime ? -1 : 1; } int typecmp(struct file *f1, struct file *f2) { return ifmt(f1->mode) - ifmt(f2->mode); } int revcmp(struct file *f1, struct file *f2) { return (*rCMP)(f2, f1); } static void sort(struct file **al) /* Sort the files according to the flags. */ { if (!present('f') && *al != nil && (*al)->next != nil) { CMP= namecmp; if (!(field & L_BYTIME)) { /* Sort on name */ if (present('r')) { rCMP= CMP; CMP= revcmp; } mergesort(al); } else { /* Sort on name first, then sort on time. */ mergesort(al); if (field & L_CTIME) { CMP= ctimecmp; } else if (field & L_ATIME) { CMP= atimecmp; } else { CMP= mtimecmp; } if (present('r')) { rCMP= CMP; CMP= revcmp; } mergesort(al); } /* Separate by file type if so desired. */ if (field & L_TYPE) { CMP= typecmp; mergesort(al); } } } struct file *newfile(char *name) /* Create file structure for given name. */ { struct file *new; new= (struct file *) allocate(sizeof(*new)); new->name= strcpy((char *) allocate(strlen(name)+1), name); return new; } void pushfile(struct file **flist, struct file *new) /* Add file to the head of a list. */ { new->next= *flist; *flist= new; } void delfile(struct file *old) /* Release old file structure. */ { free((void *) old->name); free((void *) old); } struct file *popfile(struct file **flist) /* Pop file off top of file list. */ { struct file *f; f= *flist; *flist= f->next; return f; } int dotflag(char *name) /* Return flag that would make ls list this name: -a or -A. */ { if (*name++ != '.') return 0; switch (*name++) { case 0: return 'a'; /* "." */ case '.': if (*name == 0) return 'a'; /* ".." */ default: return 'A'; /* ".*" */ } } int adddir(struct file **aflist, char *name) /* Add directory entries of directory name to a file list. */ { DIR *d; struct dirent *e; if (access(name, 0) < 0) { report(name); return 0; } if ((d= opendir(name)) == nil) { report(name); return 0; } while ((e= readdir(d)) != nil) { if (e->d_ino != 0 && present(dotflag(e->d_name))) { pushfile(aflist, newfile(e->d_name)); aflist= &(*aflist)->next; } } closedir(d); return 1; } off_t countblocks(struct file *flist) /* Compute total block count for a list of files. */ { off_t cb = 0; while (flist != nil) { switch (flist->mode & S_IFMT) { case S_IFDIR: case S_IFREG: #ifdef S_IFLNK case S_IFLNK: #endif cb += nblocks(flist); } flist= flist->next; } return cb; } void printname(char *name) /* Print a name with control characters as '?' (unless -q). The terminal is * assumed to be eight bit clean. */ { int c, q= present('q'); while ((c= (unsigned char) *name++) != 0) { if (q && (c <= ' ' || c == 0177)) c= '?'; putchar(c); } } int mark(struct file *f, int doit) { int c; c= 0; if (field & L_MARK) { switch (f->mode & S_IFMT) { case S_IFDIR: c= '/'; break; #ifdef S_IFIFO case S_IFIFO: c= '|'; break; #endif #ifdef S_IFLNK case S_IFLNK: c= '@'; break; #endif #ifdef S_IFSOCK case S_IFSOCK: c= '='; break; #endif case S_IFREG: if (f->mode & (S_IXUSR | S_IXGRP | S_IXOTH)) c= '*'; break; } } else if (field & L_MARKDIR) { if (S_ISDIR(f->mode)) c= '/'; } if (doit && c != 0) putchar(c); return c; } /* Width of entire column, and of several fields. */ enum { W_COL, W_INO, W_BLK, W_NLINK, W_UID, W_GID, W_SIZE, W_NAME, MAXFLDS }; unsigned char fieldwidth[MAXCOLS][MAXFLDS]; void maxise(unsigned char *aw, int w) /* Set *aw to the larger of it and w. */ { if (w > *aw) { if (w > UCHAR_MAX) w= UCHAR_MAX; *aw= w; } } int numwidth(unsigned long n) /* Compute width of 'n' when printed. */ { int width= 0; do { width++; } while ((n /= 10) > 0); return width; } #if !__minix int numxwidth(unsigned long n) /* Compute width of 'n' when printed in hex. */ { int width= 0; do { width++; } while ((n /= 16) > 0); return width; } #endif static int nsp= 0; /* This many spaces have not been printed yet. */ #define spaces(n) (nsp= (n)) #define terpri() (nsp= 0, putchar('\n')) /* No trailing spaces */ void print1(struct file *f, int col, int doit) /* Either compute the number of spaces needed to print file f (doit == 0) or * really print it (doit == 1). */ { int width= 0, n; char *p; unsigned char *f1width = fieldwidth[col]; while (nsp>0) { putchar(' '); nsp--; }/* Fill gap between two columns */ if (field & L_INODE) { if (doit) { printf("%*d ", f1width[W_INO], f->ino); } else { maxise(&f1width[W_INO], numwidth(f->ino)); width++; } } if (field & L_BLOCKS) { unsigned long nb= nblk2k(nblocks(f)); if (doit) { printf("%*lu ", f1width[W_BLK], nb); } else { maxise(&f1width[W_BLK], numwidth(nb)); width++; } } if (field & L_MODE) { if (doit) { printf("%s ", permissions(f)); } else { width+= (field & L_EXTRA) ? 5 : 11; } } if (field & L_EXTRA) { p= cxsize(f); n= strlen(p)+1; if (doit) { n= f1width[W_SIZE] - n; while (n > 0) { putchar(' '); --n; } printf("%s ", p); } else { maxise(&f1width[W_SIZE], n); } } if (field & L_LONG) { if (doit) { printf("%*u ", f1width[W_NLINK], (unsigned) f->nlink); } else { maxise(&f1width[W_NLINK], numwidth(f->nlink)); width++; } if (!(field & L_GROUP)) { if (doit) { printf("%-*s ", f1width[W_UID], uidname(f->uid)); } else { maxise(&f1width[W_UID], strlen(uidname(f->uid))); width+= 2; } } if (doit) { printf("%-*s ", f1width[W_GID], gidname(f->gid)); } else { maxise(&f1width[W_GID], strlen(gidname(f->gid))); width+= 2; } switch (f->mode & S_IFMT) { case S_IFBLK: case S_IFCHR: #ifdef S_IFMPB case S_IFMPB: #endif #ifdef S_IFMPC case S_IFMPC: #endif #if __minix if (doit) { printf("%*d, %3d ", f1width[W_SIZE] - 5, major(f->rdev), minor(f->rdev)); } else { maxise(&f1width[W_SIZE], numwidth(major(f->rdev)) + 5); width++; } #else /* !__minix */ if (doit) { printf("%*lX ", f1width[W_SIZE], (unsigned long) f->rdev); } else { maxise(&f1width[W_SIZE], numwidth(f->rdev)); width++; } #endif /* !__minix */ break; default: if (doit) { printf("%*lu ", f1width[W_SIZE], (unsigned long) f->size); } else { maxise(&f1width[W_SIZE], numwidth(f->size)); width++; } } if (doit) { printf("%s ", timestamp(f)); } else { width+= (field & L_LONGTIME) ? 21 : 13; } } n= strlen(f->name); if (doit) { printname(f->name); if (mark(f, 1) != 0) n++; #ifdef S_IFLNK if ((field & L_LONG) && (f->mode & S_IFMT) == S_IFLNK) { char *buf; int r, didx; buf= (char *) allocate(((size_t) f->size + 1) * sizeof(buf[0])); addpath(&didx, f->name); r= readlink(path, buf, (int) f->size); delpath(didx); if (r > 0) buf[r] = 0; else r=1, strcpy(buf, "?"); printf(" -> "); printname(buf); free((void *) buf); n+= 4 + r; } #endif spaces(f1width[W_NAME] - n); } else { if (mark(f, 0) != 0) n++; #ifdef S_IFLNK if ((field & L_LONG) && (f->mode & S_IFMT) == S_IFLNK) { n+= 4 + (int) f->size; } #endif maxise(&f1width[W_NAME], n + NSEP); for (n= 1; n < MAXFLDS; n++) width+= f1width[n]; maxise(&f1width[W_COL], width); } } int countfiles(struct file *flist) /* Return number of files in the list. */ { int n= 0; while (flist != nil) { n++; flist= flist->next; } return n; } struct file *filecol[MAXCOLS]; /* filecol[i] is list of files for column i. */ int nfiles, nlines; /* # files to print, # of lines needed. */ void columnise(struct file *flist, int nplin) /* Chop list of files up in columns. Note that 3 columns are used for 5 files * even though nplin may be 4, filecol[3] will simply be nil. */ { int i, j; nlines= (nfiles + nplin - 1) / nplin; /* nlines needed for nfiles */ filecol[0]= flist; for (i=1; i<nplin; i++) { /* Give nlines files to each column. */ for (j=0; j<nlines && flist != nil; j++) flist= flist->next; filecol[i]= flist; } } int print(struct file *flist, int nplin, int doit) /* Try (doit == 0), or really print the list of files over nplin columns. * Return true if it can be done in nplin columns or if nplin == 1. */ { register struct file *f; register int col, fld, totlen; columnise(flist, nplin); if (!doit) { for (col= 0; col < nplin; col++) { for (fld= 0; fld < MAXFLDS; fld++) { fieldwidth[col][fld]= 0; } } } while (--nlines >= 0) { totlen= 0; for (col= 0; col < nplin; col++) { if ((f= filecol[col]) != nil) { filecol[col]= f->next; print1(f, col, doit); } if (!doit && nplin > 1) { /* See if this line is not too long. */ if (fieldwidth[col][W_COL] == UCHAR_MAX) { return 0; } totlen+= fieldwidth[col][W_COL]; if (totlen > ncols+NSEP) return 0; } } if (doit) terpri(); } return 1; } enum depth { SURFACE, SURFACE1, SUBMERGED }; enum state { BOTTOM, SINKING, FLOATING }; void listfiles(struct file *flist, enum depth depth, enum state state) /* Main workhorse of ls, it sorts and prints the list of files. Flags: * depth: working with the command line / just one file / listing dir. * state: How "recursive" do we have to be. */ { struct file *dlist= nil, **afl= &flist, **adl= &dlist; int nplin; static int white = 1; /* Nothing printed yet. */ /* Flush everything previously printed, so new error output will * not intermix with files listed earlier. */ fflush(stdout); if (field != 0 || state != BOTTOM) { /* Need stat(2) info. */ while (*afl != nil) { static struct stat st; int r, didx; addpath(&didx, (*afl)->name); if ((r= status(path, &st)) < 0 #ifdef S_IFLNK && (status == lstat || lstat(path, &st) < 0) #endif ) { if (depth != SUBMERGED || errno != ENOENT) report((*afl)->name); delfile(popfile(afl)); } else { setstat(*afl, &st); afl= &(*afl)->next; } delpath(didx); } } sort(&flist); if (depth == SUBMERGED && (field & (L_BLOCKS | L_LONG))) { printf("total %ld\n", nblk2k(countblocks(flist))); } if (state == SINKING || depth == SURFACE1) { /* Don't list directories themselves, list their contents later. */ afl= &flist; while (*afl != nil) { if (((*afl)->mode & S_IFMT) == S_IFDIR) { pushfile(adl, popfile(afl)); adl= &(*adl)->next; } else { afl= &(*afl)->next; } } } if ((nfiles= countfiles(flist)) > 0) { /* Print files in how many columns? */ nplin= !present('C') ? 1 : nfiles < MAXCOLS ? nfiles : MAXCOLS; while (!print(flist, nplin, 0)) nplin--; /* Try first */ print(flist, nplin, 1); /* Then do it! */ white = 0; } while (flist != nil) { /* Destroy file list */ if (state == FLOATING && (flist->mode & S_IFMT) == S_IFDIR) { /* But keep these directories for ls -R. */ pushfile(adl, popfile(&flist)); adl= &(*adl)->next; } else { delfile(popfile(&flist)); } } while (dlist != nil) { /* List directories */ if (dotflag(dlist->name) != 'a' || depth != SUBMERGED) { int didx; addpath(&didx, dlist->name); flist= nil; if (adddir(&flist, path)) { if (depth != SURFACE1) { if (!white) putchar('\n'); printf("%s:\n", path); white = 0; } listfiles(flist, SUBMERGED, state == FLOATING ? FLOATING : BOTTOM); } delpath(didx); } delfile(popfile(&dlist)); } } int main(int argc, char **argv) { struct file *flist= nil, **aflist= &flist; enum depth depth; char *lsflags; struct winsize ws; uid= geteuid(); gid= getegid(); if ((arg0= strrchr(argv[0], '/')) == nil) arg0= argv[0]; else arg0++; argv++; if (strcmp(arg0, "ls") != 0) { char *p= arg0+1; while (*p != 0) { if (strchr(arg0flag, *p) != nil) *p += 'A' - 'a'; p++; } setflags(arg0+1); } while (*argv != nil && (*argv)[0] == '-') { if ((*argv)[1] == '-' && (*argv)[2] == 0) { argv++; break; } setflags(*argv++ + 1); } istty= isatty(1); if (istty && (lsflags= getenv("LSOPTS")) != nil) { if (*lsflags == '-') lsflags++; setflags(lsflags); } if (!present('1') && !present('C') && !present('l') && (istty || present('M') || present('X') || present('F')) ) setflags("C"); if (istty) setflags("q"); if (SUPER_ID == 0 || present('a')) setflags("A"); if (present('i')) field|= L_INODE; if (present('s')) field|= L_BLOCKS; if (present('M')) field|= L_MODE; if (present('X')) field|= L_EXTRA | L_MODE; if (present('t')) field|= L_BYTIME; if (present('u')) field|= L_ATIME; if (present('c')) field|= L_CTIME; if (present('l')) field|= L_MODE | L_LONG; if (present('g')) field|= L_MODE | L_LONG | L_GROUP; if (present('F')) field|= L_MARK; if (present('p')) field|= L_MARKDIR; if (present('D')) field|= L_TYPE; if (present('T')) field|= L_MODE | L_LONG | L_LONGTIME; if (present('d')) field|= L_DIR; if (field & L_LONG) field&= ~L_EXTRA; #ifdef S_IFLNK status= present('L') ? stat : lstat; #endif if (present('C')) { int t= istty ? 1 : open("/dev/tty", O_WRONLY); if (t >= 0 && ioctl(t, TIOCGWINSZ, &ws) == 0 && ws.ws_col > 0) ncols= ws.ws_col - 1; if (t != 1 && t != -1) close(t); } depth= SURFACE; if (*argv == nil) { if (!(field & L_DIR)) depth= SURFACE1; pushfile(aflist, newfile(".")); } else { if (argv[1] == nil && !(field & L_DIR)) depth= SURFACE1; do { pushfile(aflist, newfile(*argv++)); aflist= &(*aflist)->next; } while (*argv!=nil); } listfiles(flist, depth, (field & L_DIR) ? BOTTOM : present('R') ? FLOATING : SINKING); return ex; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mail - send/receive mail Author: Peter S. Housel */ /* Version 0.2 of September 1990: added -e, -t, * options - cwr */ #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #undef EOF /* temporary hack */ #include <signal.h> #include <pwd.h> #include <time.h> #include <setjmp.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/wait.h> #include <stdio.h> #ifdef DEBUG #define D(Q) (Q) #else #define D(Q) #endif #define SHELL "/bin/sh" #define DROPNAME "/usr/spool/mail/%s" #define LOCKNAME "/usr/spool/mail/%s.lock" #define LOCKWAIT 5 /* seconds to wait after collision */ #define LOCKTRIES 4 /* maximum number of collisions */ #define MBOX "mbox" #define HELPFILE "/usr/lib/mail.help" #define PROMPT "? " #define PATHLEN 80 #define MAXRCPT 100 /* maximum number of recipients */ #define LINELEN 512 /* #define MAILER "/usr/bin/smail" */ /* smart mailer */ #define MAILERARGS /* (unused) */ #define UNREAD 1 /* 'not read yet' status */ #define DELETED 2 /* 'deleted' status */ #define READ 3 /* 'has been read' status */ struct letter { struct letter *prev, *next; /* linked letter list */ int status; /* letter status */ off_t location; /* location within mailbox file */ }; struct letter *firstlet, *lastlet; int usemailer = 1; /* use MAILER to deliver (if any) */ int printmode = 0; /* print-and-exit mode */ int quitmode = 0; /* take interrupts */ int reversemode = 0; /* print mailbox in reverse order */ int usedrop = 1; /* read the maildrop (no -f given) */ int verbose = 0; /* pass "-v" flag on to mailer */ int needupdate = 0; /* need to update mailbox */ int msgstatus = 0; /* return the mail status */ int distlist = 0; /* include distribution list */ char mailbox[PATHLEN]; /* user's mailbox/maildrop */ char tempname[PATHLEN] = "/tmp/mailXXXXXX"; /* temporary file */ FILE *boxfp = NULL; /* mailbox file */ jmp_buf printjump; /* for quitting out of letters */ unsigned oldmask; /* saved umask() */ extern int optind; extern char *optarg; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(int deliver, (int count, char *vec [])); _PROTOTYPE(FILE *makerewindable, (void)); _PROTOTYPE(int copy, (FILE *fromfp, FILE *tofp)); _PROTOTYPE(void readbox, (void)); _PROTOTYPE(void printall, (void)); _PROTOTYPE(void interact, (void)); _PROTOTYPE(void onint, (int dummy)); _PROTOTYPE(void savelet, (struct letter *let, char *savefile)); _PROTOTYPE(void updatebox, (void)); _PROTOTYPE(void printlet, (struct letter *let, FILE *tofp)); _PROTOTYPE(void doshell, (char *command)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(char *basename, (char *name)); _PROTOTYPE(char *whoami, (void)); _PROTOTYPE(void dohelp, (void)); _PROTOTYPE(int filesize, (char *name)); int main(argc, argv) int argc; char *argv[]; { int c; if ('l' == (basename(argv[0]))[0]) /* 'lmail' link? */ usemailer = 0; /* yes, let's deliver it */ (void) mktemp(tempname); /* name the temp file */ oldmask = umask(022); /* change umask for security */ while (EOF != (c = getopt(argc, argv, "epqrf:tdv"))) switch (c) { case 'e': ++msgstatus; break; case 't': ++distlist; break; case 'p': ++printmode; break; case 'q': ++quitmode; break; case 'r': ++reversemode; break; case 'f': setuid(getuid()); /* won't need to lock */ usedrop = 0; strncpy(mailbox, optarg, (size_t)(PATHLEN - 1)); break; case 'd': usemailer = 0; break; case 'v': ++verbose; break; default: usage(); exit(1); } if (optind < argc) { if (deliver(argc - optind, argv + optind) < 0) exit(1); else exit(0); } if (usedrop) sprintf(mailbox, DROPNAME, whoami()); D(printf("mailbox=%s\n", mailbox)); if (msgstatus) { if (filesize(mailbox)) exit(0); else exit(1); } readbox(); if (printmode) printall(); else interact(); if (needupdate) updatebox(); return(0); } int deliver(count, vec) int count; char *vec[]; { int i, j; int errs = 0; /* count of errors */ int dropfd; /* file descriptor for user's drop */ int created = 0; /* true if we created the maildrop */ FILE *mailfp; /* fp for mail */ struct stat stb; /* for checking drop modes, owners */ #ifdef __STDC__ void (*sigint)(int), (*sighup)(int), (*sigquit)(int);/* saving signal state */ #else void (*sigint) (), (*sighup) (), (*sigquit) (); /* saving signal state */ #endif time_t now; /* for datestamping the postmark */ char sender[32]; /* sender's login name */ char lockname[PATHLEN]; /* maildrop lock */ int locktries; /* tries when box is locked */ struct passwd *pw; /* sender and recipent */ int to_console; /* deliver to console if everything fails */ if (count > MAXRCPT) { fprintf(stderr, "mail: too many recipients\n"); return -1; } #ifdef MAILER if (usemailer) { char *argvec[MAXRCPT + 3]; char **argp; setuid(getuid()); argp = argvec; *argp++ = "send-mail"; if (verbose) *argp++ = "-v"; for (i = 0; i < count; ++i) *argp++ = vec[i]; *argp = NULL; execv(MAILER, argvec); fprintf(stderr, "mail: couldn't exec %s\n", MAILER); return -1; } #endif /* MAILER */ if (NULL == (pw = getpwuid(getuid()))) { fprintf(stderr, "mail: unknown sender\n"); return -1; } strcpy(sender, pw->pw_name); /* If we need to rewind stdin and it isn't rewindable, make a copy */ if (isatty(0) || (count > 1 && lseek(0, 0L, 0) == (off_t) -1)) { mailfp = makerewindable(); } else mailfp = stdin; /* Shut off signals during the delivery */ sigint = signal(SIGINT, SIG_IGN); sighup = signal(SIGHUP, SIG_IGN); sigquit = signal(SIGQUIT, SIG_IGN); for (i = 0; i < count; ++i) { if (count > 1) rewind(mailfp); D(printf("deliver to %s\n", vec[i])); if (NULL == (pw = getpwnam(vec[i]))) { fprintf(stderr, "mail: user %s not known\n", vec[i]); ++errs; continue; } sprintf(mailbox, DROPNAME, pw->pw_name); sprintf(lockname, LOCKNAME, pw->pw_name); D(printf("maildrop='%s', lock='%s'\n", mailbox, lockname)); /* Lock the maildrop while we're messing with it. Races are * possible (though not very likely) when we have to create * the maildrop, but not otherwise. If the box is already * locked, wait awhile and try again. */ locktries = created = to_console = 0; trylock: if (link(mailbox, lockname) != 0) { if (ENOENT == errno) { /* user doesn't have a drop yet */ dropfd = creat(mailbox, 0600); if (dropfd < 0 && errno == ENOENT) { /* Probably missing spool dir; to console. */ boxfp = fopen("/dev/console", "w"); if (boxfp != NULL) { to_console = 1; goto nobox; } } if (dropfd < 0) { fprintf(stderr, "mail: couln't create a maildrop for user %s\n", vec[i]); ++errs; continue; } ++created; goto trylock; } else { /* somebody else has it locked, it seems - * wait */ if (++locktries >= LOCKTRIES) { fprintf(stderr, "mail: couldn't lock maildrop for user %s\n", vec[i]); ++errs; continue; } sleep(LOCKWAIT); goto trylock; } } if (created) { (void) chown(mailbox, pw->pw_uid, pw->pw_gid); boxfp = fdopen(dropfd, "a"); } else boxfp = fopen(mailbox, "a"); if (NULL == boxfp || stat(mailbox, &stb) < 0) { fprintf(stderr, "mail: serious maildrop problems for %s\n", vec[i]); unlink(lockname); ++errs; continue; } if (stb.st_uid != pw->pw_uid || (stb.st_mode & S_IFMT) != S_IFREG) { fprintf(stderr, "mail: mailbox for user %s is illegal\n", vec[i]); unlink(lockname); ++errs; continue; } nobox: if (to_console) { fprintf(boxfp, "-------------\n| Mail from %s to %s\n-------------\n", sender, vec[i]); } else { (void) time(&now); fprintf(boxfp, "From %s %24.24s\n", sender, ctime(&now)); } if (distlist) { fprintf(boxfp, "Dist: "); for (j = 0; j < count; ++j) if (getpwnam(vec[j]) != NULL && j != i) fprintf(boxfp, "%s ", vec[j]) ; fprintf(boxfp, "\n\n"); } if ((copy(mailfp, boxfp) < 0) || (fclose(boxfp) != 0)) { fprintf(stderr, "mail: error delivering to user %s", vec[i]); perror(" "); ++errs; } unlink(lockname); } fclose(mailfp); /* Put signals back the way they were */ signal(SP��P�� P��!P��"P��#P��$P��%P��&P��'P��(P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IGINT, sigint); signal(SIGHUP, sighup); signal(SIGQUIT, sigquit); return(0 == errs) ? 0 : -1; } /* 'stdin' isn't rewindable. Make a temp file that is. * Note that if one wanted to catch SIGINT and write a '~/dead.letter' * for interactive mails, this might be the place to do it (though the * case where a MAILER is being used would also need to be handled). */ FILE *makerewindable() { FILE *tempfp; /* temp file used for copy */ int c; /* character being copied */ int state; /* ".\n" detection state */ if (NULL == (tempfp = fopen(tempname, "w"))) { fprintf(stderr, "mail: can't create temporary file\n"); return NULL; } /* Here we copy until we reach the end of the letter (end of file or * a line containing only a '.'), painstakingly avoiding setting a * line length limit. */ state = '\n'; while (EOF != (c = getc(stdin))) switch (state) { case '\n': if ('.' == c) state = '.'; else { if ('\n' != c) state = '\0'; putc(c, tempfp); } break; case '.': if ('\n' == c) goto done; state = '\0'; putc('.', tempfp); putc(c, tempfp); break; default: state = ('\n' == c) ? '\n' : '\0'; putc(c, tempfp); } done: if (ferror(tempfp) || fclose(tempfp)) { fprintf(stderr, "mail: couldn't copy letter to temporary file\n"); return NULL; } tempfp = freopen(tempname, "r", stdin); unlink(tempname); /* unlink name; file lingers on in limbo */ return tempfp; } int copy(fromfp, tofp) FILE *fromfp, *tofp; { int c; /* character being copied */ int state; /* ".\n" and postmark detection state */ int blankline = 0; /* was most recent line completely blank? */ static char postmark[] = "From "; char *p, *q; /* Here we copy until we reach the end of the letter (end of file or * a line containing only a '.'). Postmarks (lines beginning with * "From ") are copied with a ">" prepended. Here we also complicate * things by not setting a line limit. */ state = '\n'; p = postmark; while (EOF != (c = getc(fromfp))) { switch (state) { case '\n': if ('.' == c) /* '.' at BOL */ state = '.'; else if (*p == c) { /* start of postmark */ ++p; state = 'P'; } else { /* anything else */ if ('\n' == c) blankline = 1; else { state = '\0'; blankline = 0; } putc(c, tofp); } break; case '.': if ('\n' == c) goto done; state = '\0'; putc('.', tofp); putc(c, tofp); break; case 'P': if (*p == c) { if (*++p == '\0') { /* successfully reached end */ p = postmark; putc('>', tofp); fputs(postmark, tofp); state = '\0'; break; } break; /* not there yet */ } state = ('\n' == c) ? '\n' : '\0'; for (q = postmark; q < p; ++q) putc(*q, tofp); putc(c, tofp); blankline = 0; p = postmark; break; default: state = ('\n' == c) ? '\n' : '\0'; putc(c, tofp); } } if ('\n' != state) putc('\n', tofp); done: if (!blankline) putc('\n', tofp); if (ferror(tofp)) return -1; return 0; } void readbox() { char linebuf[512]; struct letter *let; off_t current; firstlet = lastlet = NULL; if (access(mailbox, 4) < 0 || NULL == (boxfp = fopen(mailbox, "r"))) { if (usedrop && ENOENT == errno) return; fprintf(stderr, "can't access mailbox "); perror(mailbox); exit(1); } current = 0L; while (1) { if (NULL == fgets(linebuf, sizeof linebuf, boxfp)) break; if (!strncmp(linebuf, "From ", (size_t)5)) { if (NULL == (let = (struct letter *) malloc(sizeof(struct letter)))) { fprintf(stderr, "Out of memory.\n"); exit(1); } if (NULL == lastlet) { firstlet = let; let->prev = NULL; } else { let->prev = lastlet; lastlet->next = let; } lastlet = let; let->next = NULL; let->status = UNREAD; let->location = current; D(printf("letter at %ld\n", current)); } current += strlen(linebuf); } } void printall() { struct letter *let; let = reversemode ? firstlet : lastlet; if (NULL == let) { printf("No mail.\n"); return; } while (NULL != let) { printlet(let, stdout); let = reversemode ? let->next : let->prev; } } void interact() { char linebuf[512]; /* user input line */ struct letter *let, *next; /* current and next letter */ int interrupted = 0; /* SIGINT hit during letter print */ int needprint = 1; /* need to print this letter */ char *savefile; /* filename to save into */ if (NULL == firstlet) { printf("No mail.\n"); return; } let = reversemode ? firstlet : lastlet; while (1) { next = reversemode ? let->next : let->prev; if (NULL == next) next = let; if (!quitmode) { interrupted = setjmp(printjump); signal(SIGINT, onint); } if (!interrupted && needprint) { if (DELETED != let->status) let->status = READ; printlet(let, stdout); } if (interrupted) putchar('\n'); needprint = 0; fputs(PROMPT, stdout); fflush(stdout); if (fgets(linebuf, sizeof linebuf, stdin) == NULL) break; if (!quitmode) signal(SIGINT, SIG_IGN); switch (linebuf[0]) { case '\n': let = next; needprint = 1; continue; case 'd': let->status = DELETED; if (next != let)/* look into this */ needprint = 1; needupdate = 1; let = next; continue; case 'p': needprint = 1; continue; case '-': next = reversemode ? let->prev : let->next; if (NULL == next) next = let; let = next; needprint = 1; continue; case 's': for (savefile = strtok(linebuf + 1, " \t\n"); savefile != NULL; savefile = strtok((char *) NULL, " \t\n")) { savelet(let, savefile); } continue; case '!': doshell(linebuf + 1); continue; case '*': dohelp(); continue; case 'q': return; case 'x': exit(0); default: fprintf(stderr, "Illegal command\n"); continue; } } } void onint(dummy) int dummy; /* to satisfy ANSI compilers */ { longjmp(printjump, 1); } void savelet(let, savefile) struct letter *let; char *savefile; { int waitstat, pid; FILE *savefp; if ((pid = fork()) < 0) { perror("mail: couldn't fork"); return; } else if (pid != 0) { /* parent */ wait(&waitstat); return; } /* Child */ setgid(getgid()); setuid(getuid()); if ((savefp = fopen(savefile, "a")) == NULL) { perror(savefile); exit(0); } printlet(let, savefp); if ((ferror(savefp) != 0) | (fclose(savefp) != 0)) { fprintf(stderr, "savefile write error:"); perror(savefile); } exit(0); } void updatebox() { FILE *tempfp; /* fp for tempfile */ char lockname[PATHLEN]; /* maildrop lock */ int locktries = 0; /* tries when box is locked */ struct letter *let; /* current letter */ int c; sprintf(lockname, LOCKNAME, whoami()); if (NULL == (tempfp = fopen(tempname, "w"))) { perror("mail: can't create temporary file"); return; } for (let = firstlet; let != NULL; let = let->next) { if (let->status != DELETED) { printlet(let, tempfp); D(printf("printed letter at %ld\n", let->location)); } } if (ferror(tempfp) || NULL == (tempfp = freopen(tempname, "r", tempfp))) { perror("mail: temporary file write error"); unlink(tempname); return; } /* Shut off signals during the update */ signal(SIGINT, SIG_IGN); signal(SIGHUP, SIG_IGN); signal(SIGQUIT, SIG_IGN); if (usedrop) while (link(mailbox, lockname) != 0) { if (++locktries >= LOCKTRIES) { fprintf(stderr, "mail: couldn't lock maildrop for update\n"); return; } sleep(LOCKWAIT); } if (NULL == (boxfp = freopen(mailbox, "w", boxfp))) { perror("mail: couldn't reopen maildrop"); fprintf(stderr, "mail may have been lost; look in %s\n", tempname); if (usedrop) unlink(lockname); return; } unlink(tempname); while ((c = getc(tempfp)) != EOF) putc(c, boxfp); fclose(boxfp); if (usedrop) unlink(lockname); } void printlet(let, tofp) struct letter *let; FILE *tofp; { off_t current, limit; int c; fseek(boxfp, (current = let->location), 0); limit = (NULL != let->next) ? let->next->location : -1; while (current != limit && (c = getc(boxfp)) != EOF) { putc(c, tofp); ++current; } } void doshell(command) char *command; { int waitstat, pid; char *shell; if (NULL == (shell = getenv("SHELL"))) shell = SHELL; if ((pid = fork()) < 0) { perror("mail: couldn't fork"); return; } else if (pid != 0) { /* parent */ wait(&waitstat); return; } /* Child */ setgid(getgid()); setuid(getuid()); umask(oldmask); execl(shell, shell, "-c", command, (char *) NULL); fprintf(stderr, "can't exec shell\n"); exit(127); } void usage() { fprintf(stderr, "usage: mail [-v] user [...]\n"); fprintf(stderr, " mail [-epqr] [-f file] [-t arg]\n"); } char *basename(name) char *name; { char *p; if (NULL == (p = rindex(name, '/'))) return name; else return p + 1; } char *whoami() { struct passwd *pw; if (NULL != (pw = getpwuid(getuid()))) return pw->pw_name; else return "nobody"; } void dohelp() { FILE *fp; char buffer[80]; if ( (fp = fopen(HELPFILE, "r")) == NULL) fprintf(stdout, "can't open helpfile %s\n", HELPFILE); else while (fgets(buffer, 80, fp)) fputs(buffer, stdout); } int filesize(name) char *name ; { struct stat buf; if (stat(name, &buf) == -1) buf.st_size = 0L; return (buf.st_size ? 1 : 0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* man 2.2 - display online manual pages Author: Kees J. Bot * 17 Mar 1993 */ #define nil NULL #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <stdarg.h> #include <fcntl.h> #include <signal.h> #include <sys/stat.h> #include <sys/wait.h> /* Defaults: */ char MANPATH[]= "/usr/local/man:/usr/man"; char PAGER[]= "more"; /* Comment at the start to let tbl(1) be run before n/troff. */ char TBL_MAGIC[] = ".\\\"t\n"; #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #define between(a, c, z) ((unsigned) ((c) - (a)) <= (unsigned) ((z) - (a))) int searchwhatis(FILE *wf, char *title, char **ppage, char **psection) /* Search a whatis file for the next occurence of "title". Return the basename * of the page to read and the section it is in. Return 0 on failure, 1 on * success, -1 on EOF or error. */ { static char page[256], section[32]; char alias[256]; int found= 0; int c; /* Each whatis line should have the format: * page, title, title (section) - descriptive text */ /* Search the file for a line with the title. */ do { int first= 1; char *pc= section; c= fgetc(wf); /* Search the line for the title. */ do { char *pa= alias; while (c == ' ' || c == '\t' || c == ',') c= fgetc(wf); while (c != ' ' && c != '\t' && c != ',' && c != '(' && c != '\n' && c != EOF) { if (pa < arraylimit(alias)-1) *pa++= c; c= getc(wf); } *pa= 0; if (first) { strcpy(page, alias); first= 0; } if (strcmp(alias, title) == 0) found= 1; } while (c != '(' && c != '\n' && c != EOF); if (c != '(') { found= 0; } else { while ((c= fgetc(wf)) != ')' && c != '\n' && c != EOF) { if ('A' <= c && c <= 'Z') c= c - 'A' + 'a'; if (pc < arraylimit(section)-1) *pc++= c; } *pc= 0; if (c != ')' || pc == section) found= 0; } while (c != EOF && c != '\n') c= getc(wf); } while (!found && c != EOF); if (found) { *ppage= page; *psection= section; } return c == EOF ? -1 : found; } int searchwindex(FILE *wf, char *title, char **ppage, char **psection) /* Search a windex file for the next occurence of "title". Return the basename * of the page to read and the section it is in. Return 0 on failure, 1 on * success, -1 on EOF or error. */ { static char page[256], section[32]; static long low, high; long mid0, mid1; int c; unsigned char *pt; char *pc; /* Each windex line should have the format: * title page (section) - descriptive text * The file is sorted. */ if (ftell(wf) == 0) { /* First read of this file, initialize. */ low= 0; fseek(wf, (off_t) 0, SEEK_END); high= ftell(wf); } /* Binary search for the title. */ while (low <= high) { pt= (unsigned char *) title; mid0= mid1= (low + high) >> 1; if (mid0 == 0) { if (fseek(wf, (off_t) 0, SEEK_SET) != 0) return -1; } else { if (fseek(wf, (off_t) mid0 - 1, SEEK_SET) != 0) return -1; /* Find the start of a line. */ while ((c= getc(wf)) != EOF && c != '\n') mid1++; if (ferror(wf)) return -1; } /* See if the line has the title we seek. */ for (;;) { if ((c= getc(wf)) == ' ' || c == '\t') c= 0; if (c == 0 || c != *pt) break; pt++; } /* Halve the search range. */ if (c == EOF || *pt <= c) { high= mid0 - 1; } else { low= mid1 + 1; } } /* Look for the title from 'low' onwards. */ if (fseek(wf, (off_t) low, SEEK_SET) != 0) return -1; do { if (low != 0) { /* Find the start of a line. */ while ((c= getc(wf)) != EOF && c != '\n') low++; if (ferror(wf)) return -1; } /* See if the line has the title we seek. */ pt= (unsigned char *) title; for (;;) { if ((c= getc(wf)) == EOF) return 0; low++; if (c == ' ' || c == '\t') c= 0; if (c == 0 || c != *pt) break; pt++; } } while (c < *pt); if (*pt != c) return 0; /* Not found. */ /* Get page and section. */ while ((c= fgetc(wf)) == ' ' || c == '\t') {} pc= page; while (c != ' ' && c != '\t' && c != '(' && c != '\n' && c != EOF) { if (pc < arraylimit(page)-1) *pc++= c; c= getc(wf); } if (pc == page) return 0; *pc= 0; while (c == ' ' || c == '\t') c= fgetc(wf); if (c != '(') return 0; pc= section; while ((c= fgetc(wf)) != ')' && c != '\n' && c != EOF) { if ('A' <= c && c <= 'Z') c= c - 'A' + 'a'; if (pc < arraylimit(section)-1) *pc++= c; } *pc= 0; if (c != ')' || pc == section) return 0; while (c != EOF && c != '\n') c= getc(wf); if (c != '\n') return 0; *ppage= page; *psection= section; return 1; } char ALL[]= ""; /* Magic sequence of all sections. */ int all= 0; /* Show all pages with a given title. */ int whatis= 0; /* man -f word == whatis word. */ int apropos= 0; /* man -k word == apropos word. */ int quiet= 0; /* man -q == quietly check. */ enum ROFF { NROFF, TROFF } rofftype= NROFF; char *roff[] = { "nroff", "troff" }; int shown; /* True if something has been shown. */ int tty; /* True if displaying on a terminal. */ char *manpath; /* The manual directory path. */ char *pager; /* The pager to use. */ char *pipeline[8][8]; /* An 8 command pipeline of 7 arguments each. */ char *(*plast)[8] = pipeline; void putinline(char *arg1, ...) /* Add a command to the pipeline. */ { va_list ap; char **argv; argv= *plast++; *argv++= arg1; va_start(ap, arg1); while ((*argv++= va_arg(ap, char *)) != nil) {} va_end(ap); } void execute(int set_mp, char *file) /* Execute the pipeline build with putinline(). (This is a lot of work to * avoid a call to system(), but it so much fun to do it right!) */ { char *(*plp)[8], **argv; char *mp; int fd0, pfd[2], err[2]; pid_t pid; int r, status; int last; void (*isav)(int sig), (*qsav)(int sig), (*tsav)(int sig); if (tty) { /* Must run this through a pager. */ putinline(pager, (char *) nil); } if (plast == pipeline) { /* No commands at all? */ putinline("cat", (char *) nil); } /* Add the file as argument to the first command. */ argv= pipeline[0]; while (*argv != nil) argv++; *argv++= file; *argv= nil; /* Start the commands. */ fd0= 0; for (plp= pipeline; plp < plast; plp++) { argv= *plp; last= (plp+1 == plast); /* Create an error pipe and pipe between this command and the * next. */ if (pipe(err) < 0 || (!last && pipe(pfd) < 0)) { fprintf(stderr, "man: can't create a pipe: %s\n", strerror(errno)); exit(1); } (void) fcntl(err[1], F_SETFD, fcntl(err[1], F_GETFD) | FD_CLOEXEC); if ((pid = fork()) < 0) { fprintf(stderr, "man: cannot fork: %s\n", strerror(errno)); exit(1); } if (pid == 0) { /* Child. */ if (set_mp) { mp= malloc((8 + strlen(manpath) + 1) * sizeof(*mp)); if (mp != nil) { strcpy(mp, "MANPATH="); strcat(mp, manpath); (void) putenv(mp); } } if (fd0 != 0) { dup2(fd0, 0); close(fd0); } if (!last) { close(pfd[0]); if (pfd[1] != 1) { dup2(pfd[1], 1); close(pfd[1]); } } close(err[0]); execvp(argv[0], argv); (void) write(err[1], &errno, sizeof(errno)); _exit(1); } close(err[1]); if (read(err[0], &errno, sizeof(errno)) != 0) { fprintf(stderr, "man: %s: %s\n", argv[0], strerror(errno)); exit(1); } close(err[0]); if (!last) { close(pfd[1]); fd0= pfd[0]; } set_mp= 0; } /* Wait for the last command to finish. */ isav= signal(SIGINT, SIG_IGN); qsav= signal(SIGQUIT, SIG_IGN); tsav= signal(SIGTERM, SIG_IGN); while ((r= wait(&status)) != pid) { if (r < 0) { fprintf(stderr, "man: wait(): %s\n", strerror(errno)); exit(1); } } (void) signal(SIGINT, isav); (void) signal(SIGQUIT, qsav); (void) signal(SIGTERM, tsav); if (status != 0) exit(1); plast= pipeline; } void keyword(char *keyword) /* Make an apropos(1) or whatis(1) call. */ { putinline(apropos ? "apropos" : "whatis", all ? "-a" : (char *) nil, (char *) nil); if (tty) { printf("Looking for keyword '%s'\n", keyword); fflush(stdout); } execute(1, keyword); } enum pagetype { CAT, CATZ, MAN, MANZ }; int showpage(char *page, enum p0P��2P��3P��4P��5P��6P��7P��8P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������agetype ptype, char *macros) /* Show a manual page if it exists using the proper decompression and * formatting tools. */ { struct stat st; /* We want a normal file without X bits if not a full path. */ if (stat(page, &st) < 0) return 0; if (!S_ISREG(st.st_mode)) return 0; if ((st.st_mode & 0111) && page[0] != '/') return 0; /* Do we only care if it exists? */ if (quiet) { shown= 1; return 1; } if (ptype == CATZ || ptype == MANZ) { putinline("zcat", (char *) nil); } if (ptype == MAN) { /* Do we need tbl? */ FILE *fp; int c; char *tp = TBL_MAGIC; if ((fp = fopen(page, "r")) == nil) { fprintf(stderr, "man: %s: %s\n", page, strerror(errno)); exit(1); } c= fgetc(fp); for (;;) { if (c == *tp || (c == '\'' && *tp == '.')) { if (*++tp == 0) { /* A match, add tbl. */ putinline("tbl", (char *) nil); break; } } else { /* No match. */ break; } while ((c = fgetc(fp)) == ' ' || c == '\t') {} } fclose(fp); } if (ptype == MAN || ptype == MANZ) { putinline(roff[rofftype], macros, (char *) nil); } if (tty) { printf("%s %s\n", ptype >= MAN ? "Formatting" : "Showing", page); fflush(stdout); } execute(0, page); shown= 1; return 1; } int member(char *word, char *list) /* True if word is a member of a comma separated list. */ { size_t len= strlen(word); if (list == ALL) return 1; while (*list != 0) { if (strncmp(word, list, len) == 0 && (list[len] == 0 || list[len] == ',')) return 1; while (*list != 0 && *list != ',') list++; if (*list == ',') list++; } return 0; } int trymandir(char *mandir, char *title, char *section) /* Search the whatis file of the manual directory for a page of the given * section and display it. */ { FILE *wf; char whatis[1024], pagename[1024], *wpage, *wsection; int rsw, rsp; int ntries; int (*searchidx)(FILE *, char *, char **, char **); struct searchnames { enum pagetype ptype; char *pathfmt; } *sp; static struct searchnames searchN[] = { { CAT, "%s/cat%s/%s.%s" }, /* SysV */ { CATZ, "%s/cat%s/%s.%s.Z" }, { MAN, "%s/man%s/%s.%s" }, { MANZ, "%s/man%s/%s.%s.Z" }, { CAT, "%s/cat%.1s/%s.%s" }, /* BSD */ { CATZ, "%s/cat%.1s/%s.%s.Z" }, { MAN, "%s/man%.1s/%s.%s" }, { MANZ, "%s/man%.1s/%s.%s.Z" }, }; if (strlen(mandir) + 1 + 6 + 1 > arraysize(whatis)) return 0; /* Prefer a fast windex database if available. */ sprintf(whatis, "%s/windex", mandir); if ((wf= fopen(whatis, "r")) != nil) { searchidx= searchwindex; } else { /* Use a classic whatis database. */ sprintf(whatis, "%s/whatis", mandir); if ((wf= fopen(whatis, "r")) == nil) return 0; searchidx= searchwhatis; } rsp= 0; while (!rsp && (rsw= (*searchidx)(wf, title, &wpage, &wsection)) == 1) { if (!member(wsection, section)) continue; /* When looking for getc(1S) we try: * cat1s/getc.1s * cat1s/getc.1s.Z * man1s/getc.1s * man1s/getc.1s.Z * cat1/getc.1s * cat1/getc.1s.Z * man1/getc.1s * man1/getc.1s.Z */ if (strlen(mandir) + 2 * strlen(wsection) + strlen(wpage) + 10 > arraysize(pagename)) continue; sp= searchN; ntries= arraysize(searchN); do { if (sp->ptype <= CATZ && rofftype != NROFF) continue; sprintf(pagename, sp->pathfmt, mandir, wsection, wpage, wsection); rsp= showpage(pagename, sp->ptype, strcmp(wsection, "9") == 0 ? "-mnx" : "-man"); } while (sp++, !rsp && --ntries != 0); if (all) rsp= 0; } if (rsw < 0 && ferror(wf)) { fprintf(stderr, "man: %s: %s\n", whatis, strerror(errno)); exit(1); } fclose(wf); return rsp; } int trysubmandir(char *mandir, char *title, char *section) /* Search the subdirectories of this manual directory for whatis files, they * may have manual pages that override the ones in the major directory. */ { char submandir[1024]; DIR *md; struct dirent *entry; if ((md= opendir(mandir)) == nil) return 0; while ((entry= readdir(md)) != nil) { if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) continue; if ((strncmp(entry->d_name, "man", 3) == 0 || strncmp(entry->d_name, "cat", 3) == 0) && between('0', entry->d_name[3], '9')) continue; if (strlen(mandir) + 1 + strlen(entry->d_name) + 1 > arraysize(submandir)) continue; sprintf(submandir, "%s/%s", mandir, entry->d_name); if (trymandir(submandir, title, section) && !all) { closedir(md); return 1; } } closedir(md); return 0; } void searchmanpath(char *title, char *section) /* Search the manual path for a manual page describing "title." */ { char mandir[1024]; char *pp= manpath, *pd; for (;;) { while (*pp != 0 && *pp == ':') pp++; if (*pp == 0) break; pd= mandir; while (*pp != 0 && *pp != ':') { if (pd < arraylimit(mandir)) *pd++= *pp; pp++; } if (pd == arraylimit(mandir)) continue; /* forget it */ *pd= 0; if (trysubmandir(mandir, title, section) && !all) break; if (trymandir(mandir, title, section) && !all) break; } } void usage(void) { fprintf(stderr, "Usage: man -[antfkq] [-M path] [-s section] title ...\n"); exit(1); } int main(int argc, char **argv) { char *title, *section= ALL; int i; int nomoreopt= 0; char *opt; if ((pager= getenv("PAGER")) == nil) pager= PAGER; if ((manpath= getenv("MANPATH")) == nil) manpath= MANPATH; tty= isatty(1); i= 1; do { while (i < argc && argv[i][0] == '-' && !nomoreopt) { opt= argv[i++]+1; if (opt[0] == '-' && opt[1] == 0) { nomoreopt= 1; break; } while (*opt != 0) { switch (*opt++) { case 'a': all= 1; break; case 'f': whatis= 1; break; case 'k': apropos= 1; break; case 'q': quiet= 1; break; case 'n': rofftype= NROFF; apropos= whatis= 0; break; case 't': rofftype= TROFF; apropos= whatis= 0; break; case 's': if (*opt == 0) { if (i == argc) usage(); section= argv[i++]; } else { section= opt; opt= ""; } break; case 'M': if (*opt == 0) { if (i == argc) usage(); manpath= argv[i++]; } else { manpath= opt; opt= ""; } break; default: usage(); } } } if (i >= argc) usage(); if (between('0', argv[i][0], '9') && argv[i][1] == 0) { /* Allow single digit section designations. */ section= argv[i++]; } if (i == argc) usage(); title= argv[i++]; if (whatis || apropos) { keyword(title); } else { shown= 0; searchmanpath(title, section); if (!shown) (void) showpage(title, MAN, "-man"); if (!shown) { if (!quiet) { fprintf(stderr, "man: no manual on %s\n", title); } exit(1); } } } while (i < argc); exit(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mesg - enable or disable communications. Author: John J. Ribera */ /* * mesg - enable or disable communications. * * Usage: mesg [ y | n ] * * 'mesg n' will turn off group and world permissions of the * user's terminal. * 'mesg y' will enable group and world to write to the user's * tty. * mesg with no parameters will put the writeable status * onto stdout. * * Author: John J. Ribera, Jr. 09/09/90 */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> _PROTOTYPE( int main, (int argc, char *argv []) ); int main(argc, argv) int argc; char *argv[]; { struct stat statb; char *tty_name; if ((tty_name = ttyname(0)) == NULL) exit(2); if (stat(tty_name, &statb) == -1) exit(2); if (--argc) { if (*argv[1] == 'n') statb.st_mode = 0600; else if (*argv[1] == 'y') statb.st_mode = 0620; else { fprintf(stderr, "mesg: usage: mesg [n|y]\n"); exit(2); } if (chmod(tty_name, statb.st_mode) == -1) exit(2); } else printf((statb.st_mode & 020) ? "is y\n" : "is n\n"); if (statb.st_mode & 020) exit(0); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mkdir - Make directories Author: V. Archer */ /* Copyright 1991 by Vincent Archer * You may freely redistribute this software, in source or binary * form, provided that you do not alter this copyright mention in any * way. */ #include <sys/types.h> #include <sys/stat.h> #include <minix/minlib.h> #include <limits.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> extern int optind, opterr; extern char *optarg; #define USR_MODES (S_ISUID|S_IRWXU) #define GRP_MODES (S_ISGID|S_IRWXG) #define EXE_MODES (S_IXUSR|S_IXGRP|S_IXOTH) #ifdef S_ISVTX #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO|S_ISVTX) #else #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO) #endif #define DEFAULT_MODE (S_IRWXU|S_IRWXG|S_IRWXO) #define USER_WX (S_IWUSR|S_IXUSR) /* Global variables */ int pflag; char *symbolic; mode_t u_mask; struct stat st; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(mode_t parsemode, (char *symbolic, Mode_t oldmode)); _PROTOTYPE(int makepath, (char *fordir)); _PROTOTYPE(int makedir, (char *dirname)); _PROTOTYPE(void usage, (void)); /* Parse a P1003.2 4.7.7-conformant symbolic mode. */ mode_t parsemode(symbolic, oldmode) char *symbolic; mode_t oldmode; { mode_t who, mask, newmode, tmpmask; char action; char *end; unsigned long octalmode; octalmode = strtoul(symbolic, &end, 010); if (octalmode < ALL_MODES && *end == 0 && end != symbolic) return octalmode; newmode = oldmode & ALL_MODES; while (*symbolic) { who = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'a') { who |= ALL_MODES; continue; } if (*symbolic == 'u') { who |= USR_MODES; continue; } if (*symbolic == 'g') { who |= GRP_MODES; continue; } if (*symbolic == 'o') { who |= S_IRWXO; continue; } break; } if (!*symbolic || *symbolic == ',') usage(); while (*symbolic) { if (*symbolic == ',') break; switch (*symbolic) { default: usage(); case '+': case '-': case '=': action = *symbolic++; } mask = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'u') { tmpmask = newmode & S_IRWXU; mask |= tmpmask | (tmpmask << 3) | (tmpmask << 6); symbolic++; break; } if (*symbolic == 'g') { tmpmask = newmode & S_IRWXG; mask |= tmpmask | (tmpmask >> 3) | (tmpmask << 3); symbolic++; break; } if (*symbolic == 'o') { tmpmask = newmode & S_IRWXO; mask |= tmpmask | (tmpmask >> 3) | (tmpmask >> 6); symbolic++; break; } if (*symbolic == 'r') { mask |= S_IRUSR | S_IRGRP | S_IROTH; continue; } if (*symbolic == 'w') { mask |= S_IWUSR | S_IWGRP | S_IWOTH; continue; } if (*symbolic == 'x') { mask |= EXE_MODES; continue; } if (*symbolic == 's') { mask |= S_ISUID | S_ISGID; continue; } if (*symbolic == 'X') { if (S_ISDIR(oldmode) || (oldmode & EXE_MODES)) mask |= EXE_MODES; continue; } #ifdef S_ISVTX if (*symbolic == 't') { mask |= S_ISVTX; who |= S_ISVTX; continue; } #endif break; } switch (action) { case '=': if (who) newmode &= ~who; else newmode = 0; case '+': if (who) newmode |= who & mask; else newmode |= mask & (~u_mask); break; case '-': if (who) newmode &= ~(who & mask); else newmode &= ~mask | u_mask; } } if (*symbolic) symbolic++; } return(newmode); } /* Main module. */ int main(argc, argv) int argc; char **argv; { int error, c; opterr = 0; pflag = 0; symbolic = (char *) 0; u_mask = umask(0); umask(u_mask); while ((c = getopt(argc, argv, "m:p")) != EOF) switch (c) { case 'm': symbolic = optarg; break; case 'p': pflag = 1; break; default: usage(); } if (optind >= argc) usage(); error = 0; while (optind < argc) error |= makedir(argv[optind++]); return(error); } /* P1003.2 requires that missing intermediate pathname components should be * created if the -p option is specified (4.40.3). */ int makepath(fordir) char *fordir; { char parent[PATH_MAX + 1], *end; strcpy(parent, fordir); if (!(end = strrchr(parent, '/'))) return(0); *end = '\0'; if (!parent[0]) return(0); if (!stat(parent, &st)) { if (S_ISDIR(st.st_mode)) return(0); errno = ENOTDIR; perror(parent); return(1); } if (mkdir(parent, DEFAULT_MODE)) { if (makepath(parent)) return(1); if (mkdir(parent, DEFAULT_MODE)) { perror(parent); return(1); } } /* P1003.2 states that, regardless of umask() value, intermediate paths * should have at least write and search (x) permissions (4.40.10). */ if ((u_mask & USER_WX) && chmod(parent, ((~u_mask) | USER_WX)) & DEFAULT_MODE) { perror(parent); return(1); } return(0); } /* Actual directory creation, using a mkdir() system call. */ int makedir(dirname) char *dirname; { if (mkdir(dirname, DEFAULT_MODE)) { if (!pflag) { perror(dirname); return(1); } if (!stat(dirname, &st)) { if (S_ISDIR(st.st_mode)) return(0); errno = ENOTDIR; perror(dirname); return(1); } if (makepath(dirname)) return(1); if (mkdir(dirname, DEFAULT_MODE)) { perror(dirname); return(1); } } if (symbolic && (stat(dirname, &st) || chmod(dirname, parsemode(symbolic, st.st_mode)))) { perror(dirname); return(1); } return(0); } /* Posix command prototype. */ void usage() { std_err("Usage: mkdir [-p] [-m mode] dir...\n"); exit(1); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mkfifo - Make FIFO special files Author: V. Archer */ /* Copyright 1991 by Vincent Archer * You may freely redistribute this software, in source or binary * form, provided that you do not alter this copyright mention in any * way. */ #include <sys/types.h> #include <stdlib.h> #include <sys/stat.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> #include <stdio.h> #define USR_MODES (S_ISUID|S_IRWXU) #define GRP_MODES (S_ISGID|S_IRWXG) #define EXE_MODES (S_IXUSR|S_IXGRP|S_IXOTH) #ifdef S_ISVTX #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO|S_ISVTX) #else #define ALL_MODES (USR_MODES|GRP_MODES|S_IRWXO) #endif #define DEFAULT_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* Global u_mask needed in changemode.h */ mode_t u_mask; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(mode_t parsemode, (char *symbolic, Mode_t oldmode)); _PROTOTYPE(void usage, (void)); /* Parse a P1003.2 4.7.7-conformant symbolic mode. */ mode_t parsemode(symbolic, oldmode) char *symbolic; mode_t oldmode; { mode_t who, mask, newmode, tmpmask; char action; newmode = oldmode & ALL_MODES; while (*symbolic) { who = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'a') { who |= ALL_MODES; continue; } if (*symbolic == 'u') { who |= USR_MODES; continue; } if (*symbolic == 'g') { who |= GRP_MODES; continue; } if (*symbolic == 'o') { who |= S_IRWXO; continue; } break; } if (!*symbolic || *symbolic == ',') usage(); while (*symbolic) { if (*symbolic == ',') break; switch (*symbolic) { default: usage(); case '+': case '-': case '=': action = *symbolic++; } mask = 0; for (; *symbolic; symbolic++) { if (*symbolic == 'u') { tmpmask = newmode & S_IRWXU; mask |= tmpmask | (tmpmask << 3) | (tmpmask << 6); symbolic++; break; } if (*symbolic == 'g') { tmpmask = newmode & S_IRWXG; mask |= tmpmask | (tmpmask >> 3) | (tmpmask << 3); symbolic++; break; } if (*symbolic == 'o') { tmpmask = newmode & S_IRWXO; mask |= tmpmask | (tmpmask >> 3) | (tmpmask >> 6); symbolic++; break; } if (*symbolic == 'r') { mask |= S_IRUSR | S_IRGRP | S_IROTH; continue; } if (*symbolic == 'w') { mask |= S_IWUSR | S_IWGRP | S_IWOTH; continue; } if (*symbolic == 'x') { mask |= EXE_MODES; continue; } if (*symbolic == 's') { mask |= S_ISUID | S_ISGID; continue; } if (*symbolic == 'X') { if (S_ISDIR(oldmode) || (oldmode & EXE_MODES)) mask |= EXE_MODES; continue; } #ifdef S_ISVTX if (*symbolic == 't') { mask |= S_ISVTX; who |= S_ISVTX; continue; } #endif break; } switch (action) { case '=': if (who) newmode &= ~who; else newmode = 0; case '+': if (who) newmode |= who & mask; else newmode |= mask & (~u_mask); break; case '-': if (who) newmode &= ~(who & mask); else newmode &= ~mask | u_mask; } } if (*symbolic) symbolic++; } return(newmode); } /* Main module. Since only one option (-m mode) is allowed, there's no need * to include the whole getopt() stuff. */ int main(argc, argv) int argc; char *argv[]; { int errors = 0; char *symbolic; if (argc > 2 && *argv[1] == '-' && strcmp(argv[1], "-m") != 0) usage(); argc--; argv++; if (argc && strncmp(*argv, "-m", (size_t) 2) == 0) { argc--; if ((argv[0])[2]) symbolic = (*argv++) + 2; else { if (!argc--) usage(); argv++; symbolic = *argv++; } u_mask = umask(0); umask(u_mask); } else symbolic = (char *) 0; if (!argc) usage(); for (; argc--; argv++) if (mkfifo(*argv, DEFAULT_MODE)) { perror(*argv); errors = 1; } else if (symbolic && chmod(*argv, parsemode(symbolic, DEFAULT_MODE))) { unlink(*argv); perror(*argv); errors = 1; } return(errors); } /* Posix command prototype. */ void usage() { std_err("Usage: mkfifo [-m mode] file...\n"); exit(1); } ����������������������������������������������������������������������������������������/* mkfs - make the MINIX filesystem Authors: Tanenbaum et al. */ /* Authors: Andy Tanenbaum, Paul Ogilvie, Frans Meulenbroeks, Bruce Evans * * This program can make both version 1 and version 2 file systems, as follows: * mkfs /dev/fd0 1200 # Version 2 (default) * mkfs -1 /dev/fd0 360 # Version 1 * */ #include <sys/types.h> #include <sys/dir.h> #include <sys/stat.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <unistd.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include <minix/minlib.h> #include "../../fs/const.h" #if (MACHINE == IBM_PC) #include <minix/partition.h> #include <minix/u64.h> #include <sys/ioctl.h> #endif #undef EXTERN #define EXTERN /* get rid of EXTERN by making it null */ #include "../../fs/type.h" #include "../../fs/super.h" #include <minix/fslib.h> #ifndef DOS #ifndef UNIX #define UNIX #endif #endif #define INODE_MAP 2 #define MAX_TOKENS 10 #define LINE_LEN 200 #define BIN 2 #define BINGRP 2 #define BIT_MAP_SHIFT 13 #define N_BLOCKS (1024L * 1024) #define N_BLOCKS16 (128L * 1024) #define INODE_MAX ((unsigned) 65535) /* You can make a really large file system on a 16-bit system, but the array * of bits that get_block()/putblock() needs gets a bit big, so we can only * prefill MAX_INIT blocks. (16-bit fsck can't check a file system larger * than N_BLOCKS16 anyway.) */ #define MAX_INIT (sizeof(char *) == 2 ? N_BLOCKS16 : N_BLOCKS) #ifdef DOS maybedefine O_RDONLY 4 /* O_RDONLY | BINARY_BIT */ maybedefine BWRITE 5 /* O_WRONLY | BINARY_BIT */ #endif #if (MACHINE == ATARI) int isdev; #endif extern char *optarg; extern int optind; int next_zone, next_inode, zone_size, zone_shift = 0, zoff; block_t nrblocks; int inode_offset, lct = 0, disk, fd, print = 0, file = 0; unsigned int nrinodes; int override = 0, simple = 0, dflag; int donttest; /* skip test if it fits on medium */ char *progname; long current_time, bin_time; char zero[BLOCK_SIZE], *lastp; char umap[MAX_INIT / 8]; /* bit map tells if block read yet */ block_t zone_map; /* where is zone map? (depends on # inodes) */ int inodes_per_block; int fs_version; block_t max_nrblocks; FILE *proto; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(block_t sizeup, (char *device)); _PROTOTYPE(void super, (zone_t zones, Ino_t inodes)); _PROTOTYPE(void rootdir, (Ino_t inode)); _PROTOTYPE(void eat_dir, (Ino_t parent)); _PROTOTYPE(void eat_file, (Ino_t inode, int f)); _PROTOTYPE(void enter_dir, (Ino_t parent, char *name, Ino_t child)); _PROTOTYPE(void incr_size, (Ino_t n, long count)); _PROTOTYPE(PRIVATE ino_t alloc_inode, (int mode, int usrid, int grpid)); _PROTOTYPE(PRIVATE zone_t alloc_zone, (void)); _PROTOTYPE(void add_zone, (Ino_t n, zone_t z, long bytes, long cur_time)); _PROTOTYPE(void add_z_1, (Ino_t n, zone_t z, long bytes, long cur_time)); _PROTOTYPE(void add_z_2, (Ino_t n, zone_t z, long bytes, long cur_time)); _PROTOTYPE(void incr_link, (Ino_t n)); _PROTOTYPE(void insert_bit, (block_t block, int bit)); _PROTOTYPE(int mode_con, (char *p)); _PROTOTYPE(void getline, (char line[LINE_LEN], char *parse[MAX_TOKENS])); _PROTOTYPE(void check_mtab, (char *devname)); _PROTOTYPE(long file_time, (int f)); _PROTOTYPE(void pexit, (char *s)); _PROTOTYPE(void copy, (char *from, char *to, int count)); _PROTOTYPE(void print_fs, (void)); _PROTOTYPE(int read_and_set, (block_t n)); _PROTOTYPE(void special, (char *string)); _PROTOTYPE(void get_block, (block_t n, char buf[BLOCK_SIZE])); _PROTOTYPE(void put_block, (block_t n, char buf[BLOCK_SIZE])); _PROTOTYPE(void cache_init, (void)); _PROTOTYPE(void flush, (void)); _PROTOTYPE(void mx_read, (int blocknr, char buf[BLOCK_SIZE])); _PROTOTYPE(void mx_write, (int blocknr, char buf[BLOCK_SIZE])); _PROTOTYPE(void dexit, (char *s, int sectnum, int err)); _PROTOTYPE(void usage, (void)); /*================================================================ * mkfs - make filesystem *===============================================================*/ int main(argc, argv) int argc; char *argv[]; { int nread, mode, usrid, grpid, ch; block_t blocks; block_t i; ino_t root_inum; ino_t inodes; zone_t zones; char *token[MAX_TOKENS], line[LINE_LEN]; struct stat statbuf; /* Get two times, the current time and the mod time of the binary of * mkfs itself. When the -d flag is used, the later time is put into * the i_mtimes of all the files. This feature is useful when * producing a set of file systems, and one wants all the times to be * identical. First you set the time of the mkfs binary to what you * want, then go. */ current_time = time((time_t *) 0); /* time mkfs is being run */ stat(argv[0], &statbuf); bin_time = statbuf.st_mtime; /* time when mkfs binary was last modified */ /* Process switches. */ progname = argv[0]; blocks = 0; i = 0; fs_version = 2; inodes_per_block = V2_INODES_PER_BLOCK; max_nrblocks = N_BLOCKS; while ((ch = getopt(argc, argv, "1b:di:lot")) != EOF) switch (ch) { case '1': fs_version = 1; inodes_per_block = V1_INODES_PER_BLOCK; max_nrblocks = 0xFFFF; break; case 'b': blocks = strtoul(optarg, (char **) NULL, 0); break; case 'd': dflag = 1; current_time = bin_time; break; case 'i': i = strtoul(optarg, (char **) NULL, 0); break; case 'l': print = 1; break; case 'o': override = 1; break; case 't': donttest = 1; break; default: usage(); } /* Determine the size of the device if not specified as -b or proto. */ if (argc - optind == 1 && blocks == 0) blocks = sizeup(argv[optind]); /* The remaining args must be 'special proto', or just 'special' if the * block size has already been specified. */ if (argc - optind != 2 && (argc - optind != 1 || blocks == 0)) usage(); /* Check special. */ check_mtab(argv[optind]); /* Check and start processing proto. */ optarg = argv[++optind]; if (optind < argc && (proto = fopen(optarg, "r")) != NULL) { /* Prototype file is readable. */ lct = 1; getline(line, token); /* skip boot block info */ /* Read the line with the block and inode counts. */ getline(line, token); blocks = atol(token[0]); if (blocks > max_nrblocks) pexit("Block count too large"); if (sizeof(char *) == 2 && blocks > N_BLOCKS16) { fprintf(stderr, "%s: warning: FS is larger than the %dM that fsck can check!\n", progname, (int) (N_BLOCKS16 / (1024L * 1024))); } inodes = atoi(token[1]); /* Process mode line for root directory. */ getline(line, token); mode = mode_con(token[0]); usrid = atoi(token[1]); grpid = atoi(token[2]); } else { lct = 0; if (optind < argc) { /* Maybe the prototype file is just a size. Check. */ blocks = strtoul(optarg, (char **) NULL, 0); if (blocks == 0) pexit("Can't open prototype file"); } if (i == 0) { /* The default for inodes is 3 blocks per inode, rounded up * to fill an inode block. Above 20M, the average files are * sure to be larger because it is hard to fill up 20M with * tiny files, so reduce the default number of inodes. This * default can always be overridden by using the -i option. */ i = blocks / 3; if (blocks >= 20000) i = blocks / 4; if (blocks >= 40000) i = blocks / 5; if (blocks >= 60000) i = blocks / 6; if (blocks >= 80000) i = blocks / 7; if (blocks >= 100000) i = blocks / 8; i += inodes_per_block - 1; i = i / inodes_per_block * inodes_per_block; if (i > INODE_MAX) i = INODE_MAX; } if (blocks < 5) pexit("Block count too small"); if (blocks > max_nrblocks) pexit("Block count too large"); if (i < 1) pexit("Inode count too small"); if (i > INODE_MAX) pexit("Inode count too large"); inodes = (ino_t) i; /* Make simple file system of the given size, using defaults. */ mode = 040777; usrid = BIN; grpid = BINGRP; simple = 1; } nrblocks = blocks; nrinodes = inodes; /* Open special. */ special(argv[--optind]); #ifdef UNIX if (!donttest) { static short testb[BLOCK_SIZE / sizeof(short)]; /* Try writiLP��NP��OP��PP��QP��RP��SP��TP��UP��VP��WP��XP��YP��ZP��[P��\P��]P��^P��_P��`P��aP��bP��cP��dP��eP��fP��gP������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ng the last block of partition or diskette. */ lseek(fd, (off_t) (blocks - 1) * BLOCK_SIZE, SEEK_SET); testb[0] = 0x3245; testb[1] = 0x11FF; if (write(fd, (char *) testb, BLOCK_SIZE) != BLOCK_SIZE) pexit("File system is too big for minor device"); sync(); /* flush write, so if error next read fails */ lseek(fd, (off_t) (blocks - 1) * BLOCK_SIZE, SEEK_SET); testb[0] = 0; testb[1] = 0; nread = read(fd, (char *) testb, BLOCK_SIZE); if (nread != BLOCK_SIZE || testb[0] != 0x3245 || testb[1] != 0x11FF) pexit("File system is too big for minor device"); lseek(fd, (off_t) (blocks - 1) * BLOCK_SIZE, SEEK_SET); testb[0] = 0; testb[1] = 0; if (write(fd, (char *) testb, BLOCK_SIZE) != BLOCK_SIZE) pexit("File system is too big for minor device"); lseek(fd, 0L, SEEK_SET); } #endif /* Make the file-system */ cache_init(); #if (MACHINE == ATARI) if (isdev) { char block0[BLOCK_SIZE]; get_block((block_t) 0, block0); /* Need to read twice; first time gets an empty block */ get_block((block_t) 0, block0); /* Zero parts of the boot block so the disk won't be * recognized as a tos disk any more. */ block0[0] = block0[1] = 0; /* branch code to boot code */ strncpy(&block0[2], "MINIX ", (size_t) 6); block0[16] = 0; /* number of FATS */ block0[17] = block0[18] = 0; /* number of dir entries */ block0[22] = block0[23] = 0; /* sectors/FAT */ bzero(&block0[30], 480);/* boot code */ put_block((block_t) 0, block0); } else #endif put_block((block_t) 0, zero); /* Write a null boot block. */ zone_shift = 0; /* for future use */ zones = nrblocks >> zone_shift; super(zones, inodes); root_inum = alloc_inode(mode, usrid, grpid); rootdir(root_inum); if (simple == 0) eat_dir(root_inum); if (print) print_fs(); flush(); return(0); /* NOTREACHED */ } /* end main */ /*================================================================ * sizeup - determine device size *===============================================================*/ block_t sizeup(device) char *device; { int fd; struct partition entry; if ((fd = open(device, O_RDONLY)) == -1) return 0; if (ioctl(fd, DIOCGETP, &entry) == -1) entry.size = cvu64(0); close(fd); return div64u(entry.size, BLOCK_SIZE); } /*================================================================ * super - construct a superblock *===============================================================*/ void super(zones, inodes) zone_t zones; ino_t inodes; { unsigned int i; int inodeblks; int initblks; zone_t initzones, nrzones, v1sq, v2sq; zone_t zo; struct super_block *sup; char buf[BLOCK_SIZE], *cp; for (cp = buf; cp < &buf[BLOCK_SIZE]; cp++) *cp = 0; sup = (struct super_block *) buf; /* lint - might use a union */ sup->s_ninodes = inodes; if (fs_version == 1) { sup->s_nzones = zones; } else { sup->s_nzones = 0; /* not used in V2 - 0 forces errors early */ sup->s_zones = zones; } sup->s_imap_blocks = bitmapsize((bit_t) (1 + inodes)); sup->s_zmap_blocks = bitmapsize((bit_t) zones); inode_offset = sup->s_imap_blocks + sup->s_zmap_blocks + 2; inodeblks = (inodes + inodes_per_block - 1) / inodes_per_block; initblks = inode_offset + inodeblks; initzones = (initblks + (1 << zone_shift) - 1) >> zone_shift; nrzones = nrblocks >> zone_shift; sup->s_firstdatazone = (initblks + (1 << zone_shift) - 1) >> zone_shift; zoff = sup->s_firstdatazone - 1; sup->s_log_zone_size = zone_shift; if (fs_version == 1) { sup->s_magic = SUPER_MAGIC; /* identify super blocks */ v1sq = (zone_t) V1_INDIRECTS * V1_INDIRECTS; zo = V1_NR_DZONES + (long) V1_INDIRECTS + v1sq; } else { sup->s_magic = SUPER_V2;/* identify super blocks */ v2sq = (zone_t) V2_INDIRECTS * V2_INDIRECTS; zo = V2_NR_DZONES + (zone_t) V2_INDIRECTS + v2sq; } sup->s_max_size = zo * BLOCK_SIZE; zone_size = 1 << zone_shift; /* nr of blocks per zone */ put_block((block_t) 1, buf); /* Clear maps and inodes. */ for (i = 2; i < initblks; i++) put_block((block_t) i, zero); next_zone = sup->s_firstdatazone; next_inode = 1; zone_map = INODE_MAP + sup->s_imap_blocks; insert_bit(zone_map, 0); /* bit zero must always be allocated */ insert_bit((block_t) INODE_MAP, 0); /* inode zero not used but * must be allocated */ } /*================================================================ * rootdir - install the root directory *===============================================================*/ void rootdir(inode) ino_t inode; { zone_t z; z = alloc_zone(); add_zone(inode, z, 32L, current_time); enter_dir(inode, ".", inode); enter_dir(inode, "..", inode); incr_link(inode); incr_link(inode); } /*================================================================ * eat_dir - recursively install directory *===============================================================*/ void eat_dir(parent) ino_t parent; { /* Read prototype lines and set up directory. Recurse if need be. */ char *token[MAX_TOKENS], *p; char line[LINE_LEN]; int mode, usrid, grpid, maj, min, f; ino_t n; zone_t z; long size; while (1) { getline(line, token); p = token[0]; if (*p == '$') return; p = token[1]; mode = mode_con(p); usrid = atoi(token[2]); grpid = atoi(token[3]); if (grpid & 0200) fprintf(stderr, "A.S.Tanenbaum\n"); n = alloc_inode(mode, usrid, grpid); /* Enter name in directory and update directory's size. */ enter_dir(parent, token[0], n); incr_size(parent, 16L); /* Check to see if file is directory or special. */ incr_link(n); if (*p == 'd') { /* This is a directory. */ z = alloc_zone(); /* zone for new directory */ add_zone(n, z, 32L, current_time); enter_dir(n, ".", n); enter_dir(n, "..", parent); incr_link(parent); incr_link(n); eat_dir(n); } else if (*p == 'b' || *p == 'c') { /* Special file. */ maj = atoi(token[4]); min = atoi(token[5]); size = 0; if (token[6]) size = atoi(token[6]); size = BLOCK_SIZE * size; add_zone(n, (zone_t) ((maj << 8) | min), size, current_time); } else { /* Regular file. Go read it. */ if ((f = open(token[4], O_RDONLY)) < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", progname, token[4], strerror(errno)); } else eat_file(n, f); } } } /*================================================================ * eat_file - copy file to MINIX *===============================================================*/ /* Zonesize >= blocksize */ void eat_file(inode, f) ino_t inode; int f; { int ct, i, j, k; zone_t z; char buf[BLOCK_SIZE]; long timeval; do { for (i = 0, j = 0; i < zone_size; i++, j += ct) { for (k = 0; k < BLOCK_SIZE; k++) buf[k] = 0; if ((ct = read(f, buf, BLOCK_SIZE)) > 0) { if (i == 0) z = alloc_zone(); put_block((z << zone_shift) + i, buf); } } timeval = (dflag ? current_time : file_time(f)); if (ct) add_zone(inode, z, (long) j, timeval); } while (ct == BLOCK_SIZE); close(f); } /*================================================================ * directory & inode management assist group *===============================================================*/ void enter_dir(parent, name, child) ino_t parent, child; char *name; { /* Enter child in parent directory */ /* Works for dir > 1 block and zone > block */ int i, j, k, l, off; block_t b; zone_t z; char *p1, *p2; struct direct dir_entry[NR_DIR_ENTRIES]; d1_inode ino1[V1_INODES_PER_BLOCK]; d2_inode ino2[V2_INODES_PER_BLOCK]; int nr_dzones; b = ((parent - 1) / inodes_per_block) + inode_offset; off = (parent - 1) % inodes_per_block; if (fs_version == 1) { get_block(b, (char *) ino1); nr_dzones = V1_NR_DZONES; } else { get_block(b, (char *) ino2); nr_dzones = V2_NR_DZONES; } for (k = 0; k < nr_dzones; k++) { if (fs_version == 1) { z = ino1[off].d1_zone[k]; if (z == 0) { z = alloc_zone(); ino1[off].d1_zone[k] = z; } } else { z = ino2[off].d2_zone[k]; if (z == 0) { z = alloc_zone(); ino2[off].d2_zone[k] = z; } } for (l = 0; l < zone_size; l++) { get_block((z << zone_shift) + l, (char *) dir_entry); for (i = 0; i < NR_DIR_ENTRIES; i++) { if (dir_entry[i].d_ino == 0) { dir_entry[i].d_ino = child; p1 = name; p2 = dir_entry[i].d_name; j = 14; while (j--) { *p2++ = *p1; if (*p1 != 0) p1++; } put_block((z << zone_shift) + l, (char *) dir_entry); if (fs_version == 1) { put_block(b, (char *) ino1); } else { put_block(b, (char *) ino2); } return; } } } } printf("Directory-inode %d beyond direct blocks. Could not enter %s\n", parent, name); pexit("Halt"); } void add_zone(n, z, bytes, cur_time) ino_t n; zone_t z; long bytes, cur_time; { if (fs_version == 1) { add_z_1(n, z, bytes, cur_time); } else { add_z_2(n, z, bytes, cur_time); } } void add_z_1(n, z, bytes, cur_time) ino_t n; zone_t z; long bytes, cur_time; { /* Add zone z to inode n. The file has grown by 'bytes' bytes. */ int off, i; block_t b; zone_t indir; zone1_t blk[V1_INDIRECTS]; d1_inode *p; d1_inode inode[V1_INODES_PER_BLOCK]; b = ((n - 1) / V1_INODES_PER_BLOCK) + inode_offset; off = (n - 1) % V1_INODES_PER_BLOCK; get_block(b, (char *) inode); p = &inode[off]; p->d1_size += bytes; p->d1_mtime = cur_time; for (i = 0; i < V1_NR_DZONES; i++) if (p->d1_zone[i] == 0) { p->d1_zone[i] = (zone1_t) z; put_block(b, (char *) inode); return; } put_block(b, (char *) inode); /* File has grown beyond a small file. */ if (p->d1_zone[V1_NR_DZONES] == 0) p->d1_zone[V1_NR_DZONES] = (zone1_t) alloc_zone(); indir = p->d1_zone[V1_NR_DZONES]; put_block(b, (char *) inode); b = indir << zone_shift; get_block(b, (char *) blk); for (i = 0; i < V1_INDIRECTS; i++) if (blk[i] == 0) { blk[i] = (zone1_t) z; put_block(b, (char *) blk); return; } pexit("File has grown beyond single indirect"); } void add_z_2(n, z, bytes, cur_time) ino_t n; zone_t z; long bytes, cur_time; { /* Add zone z to inode n. The file has grown by 'bytes' bytes. */ int off, i; block_t b; zone_t indir; zone_t blk[V2_INDIRECTS]; d2_inode *p; d2_inode inode[V2_INODES_PER_BLOCK]; b = ((n - 1) / V2_INODES_PER_BLOCK) + inode_offset; off = (n - 1) % V2_INODES_PER_BLOCK; get_block(b, (char *) inode); p = &inode[off]; p->d2_size += bytes; p->d2_mtime = cur_time; for (i = 0; i < V2_NR_DZONES; i++) if (p->d2_zone[i] == 0) { p->d2_zone[i] = z; put_block(b, (char *) inode); return; } put_block(b, (char *) inode); /* File has grown beyond a small file. */ if (p->d2_zone[V2_NR_DZONES] == 0) p->d2_zone[V2_NR_DZONES] = alloc_zone(); indir = p->d2_zone[V2_NR_DZONES]; put_block(b, (char *) inode); b = indir << zone_shift; get_block(b, (char *) blk); for (i = 0; i < V2_INDIRECTS; i++) if (blk[i] == 0) { blk[i] = z; put_block(b, (char *) blk); return; } pexit("File has grown beyond single indirect"); } void incr_link(n) ino_t n; { /* Increment the link count to inode n */ int off; block_t b; b = ((n - 1) / inodes_per_block) + inode_offset; off = (n - 1) % inodes_per_block; if (fs_version == 1) { d1_inode inode1[V1_INODES_PER_BLOCK]; get_block(b, (char *) inode1); inode1[off].d1_nlinks++; put_block(b, (char *) inode1); } else { d2_inode inode2[V2_INODES_PER_BLOCK]; get_block(b, (char *) inode2); inode2[off].d2_nlinks++; put_block(b, (char *) inode2); } } void incr_size(n, count) ino_t n; long count; { /* Increment the file-size in inode n */ block_t b; int off; b = ((n - 1) / inodes_per_block) + inode_offset; off = (n - 1) % inodes_per_block; if (fs_version == 1) { d1_inode inode1[V1_INODES_PER_BLOCK]; get_block(b, (char *) inode1); inode1[off].d1_size += count; put_block(b, (char *) inode1); } else { d2_inode inode2[V2_INODES_PER_BLOCK]; get_block(b, (char *) inode2); inode2[off].d2_size += count; put_block(b, (char *) inode2); } } /*================================================================ * allocation assist group *===============================================================*/ PRIVATE ino_t alloc_inode(mode, usrid, grpid) int mode, usrid, grpid; { ino_t num; int off; block_t b; num = next_inode++; if (num > nrinodes) pexit("File system does not have enough inodes"); b = ((num - 1) / inodes_per_block) + inode_offset; off = (num - 1) % inodes_per_block; if (fs_version == 1) { d1_inode inode1[V1_INODES_PER_BLOCK]; get_block(b, (char *) inode1); inode1[off].d1_mode = mode; inode1[off].d1_uid = usrid; inode1[off].d1_gid = grpid; put_block(b, (char *) inode1); } else { d2_inode inode2[V2_INODES_PER_BLOCK]; get_block(b, (char *) inode2); inode2[off].d2_mode = mode; inode2[off].d2_uid = usrid; inode2[off].d2_gid = grpid; put_block(b, (char *) inode2); } /* Set the bit in the bit map. */ /* DEBUG FIXME. This assumes the bit is in the first inode map block. */ insert_bit((block_t) INODE_MAP, (int) num); return(num); } PRIVATE zone_t alloc_zone() { /* Allocate a new zone */ /* Works for zone > block */ block_t b; int i; zone_t z; z = next_zone++; b = z << zone_shift; if ((b + zone_size) > nrblocks) pexit("File system not big enough for all the files"); for (i = 0; i < zone_size; i++) put_block(b + i, zero); /* give an empty zone */ /* DEBUG FIXME. This assumes the bit is in the first zone map block. */ insert_bit(zone_map, (int) (z - zoff)); /* lint, NOT OK because * z hasn't been broken * up into block + * offset yet. */ return(z); } void insert_bit(block, bit) block_t block; int bit; { /* Insert 'count' bits in the bitmap */ int w, s; short buf[BLOCK_SIZE / sizeof(short)]; if (block < 0) pexit("insert_bit called with negative argument"); get_block(block, (char *) buf); w = bit / (8 * sizeof(short)); s = bit % (8 * sizeof(short)); buf[w] |= (1 << s); put_block(block, (char *) buf); } /*================================================================ * proto-file processing assist group *===============================================================*/ int mode_con(p) char *p; { /* Convert string to mode */ int o1, o2, o3, mode; char c1, c2, c3; c1 = *p++; c2 = *p++; c3 = *p++; o1 = *p++ - '0'; o2 = *p++ - '0'; o3 = *p++ - '0'; mode = (o1 << 6) | (o2 << 3) | o3; if (c1 == 'd') mode += I_DIRECTORY; if (c1 == 'b') mode += I_BLOCK_SPECIAL; if (c1 == 'c') mode += I_CHAR_SPECIAL; if (c1 == '-') mode += I_REGULAR; if (c2 == 'u') mode += I_SET_UID_BIT; if (c3 == 'g') mode += I_SET_GID_BIT; return(mode); } void getline(line, parse) char *parse[MAX_TOKENS]; char line[LINE_LEN]; { /* Read a line and break it up in tokens */ int k; char c, *p; int d; for (k = 0; k < MAX_TOKENS; k++) parse[k] = 0; for (k = 0; k < LINE_LEN; k++) line[k] = 0; k = 0; parse[0] = 0; p = line; while (1) { if (++k > LINE_LEN) pexit("Line too long"); d = fgetc(proto); if (d == EOF) pexit("Unexpected end-of-file"); *p = d; if (*p == '\n') lct++; if (*p == ' ' || *p == '\t') *p = 0; if (*p == '\n') { *p++ = 0; *p = '\n'; break; } p++; } k = 0; p = line; lastp = line; while (1) { c = *p++; if (c == '\n') return; if (c == 0) continue; parse[k++] = p - 1; do { c = *p++; } while (c != 0 && c != '\n'); } } /*================================================================ * other stuff *===============================================================*/ void check_mtab(devname) char *devname; /* /dev/hd1 or whatever */ { /* Check to see if the special file named in s is mounted. */ int n; char special[PATH_MAX + 1], mounted_on[PATH_MAX + 1], version[10], rw_flag[10]; if (load_mtab("mkfs") < 0) return; while (1) { n = get_mtab_entry(special, mounted_on, version, rw_flag); if (n < 0) return; if (strcmp(devname, special) == 0) { /* Can't mkfs on top of a mounted file system. */ fprintf(stderr, "%s: %s is mounted on %s\n", progname, devname, mounted_on); exit(1); } } } long file_time(f) int f; { #ifdef UNIX struct stat statbuf; fstat(f, &statbuf); return(statbuf.st_mtime); #else /* fstat not supported by DOS */ return(0L); #endif } void pexit(s) char *s; { fprintf(stderr, "%s: %s\n", progname, s); if (lct != 0) fprintf(stderr, "Line %d being processed when error detected.\n", lct); flush(); exit(2); } void copy(from, to, count) char *from, *to; int count; { while (count--) *to++ = *from++; } void print_fs() { int i, j; ino_t k; d1_inode inode1[V1_INODES_PER_BLOCK]; d2_inode inode2[V2_INODES_PER_BLOCK]; unsigned short usbuf[BLOCK_SIZE / sizeof(unsigned short)]; block_t b, inode_limit; struct direct dir[NR_DIR_ENTRIES]; get_block((block_t) 1, (char *) usbuf); printf("\nSuperblock: "); for (i = 0; i < 8; i++) printf("%06o ", usbuf[i]); get_block((block_t) 2, (char *) usbuf); printf("...\nInode map: "); for (i = 0; i < 9; i++) printf("%06o ", usbuf[i]); get_block((block_t) 3, (char *) usbuf); printf("...\nZone map: "); for (i = 0; i < 9; i++) printf("%06o ", usbuf[i]); printf("...\n"); k = 0; for (b = inode_offset; k < nrinodes; b++) { if (fs_version == 1) { get_block(b, (char *) inode1); } else { get_block(b, (char *) inode2); } for (i = 0; i < inodes_per_block; i++) { k = inodes_per_block * (int) (b - inode_offset) + i + 1; /* Lint but OK */ if (k > nrinodes) break; if (fs_version == 1) { if (inode1[i].d1_mode != 0) { printf("Inode %2d: mode=", k); printf("%06o", inode1[i].d1_mode); printf(" uid=%2d gid=%2d size=", inode1[i].d1_uid, inode1[i].d1_gid); printf("%6ld", inode1[i].d1_size); printf(" zone[0]=%d\n", inode1[i].d1_zone[0]); } if ((inode1[i].d1_mode & I_TYPE) == I_DIRECTORY) { /* This is a directory */ get_block(inode1[i].d1_zone[0], (char *) dir); for (j = 0; j < NR_DIR_ENTRIES; j++) if (dir[j].d_ino) printf("\tInode %2d: %s\n", dir[j].d_ino, dir[j].d_name); } } else { if (inode2[i].d2_mode != 0) { printf("Inode %2d: mode=", k); printf("%06o", inode2[i].d2_mode); printf(" uid=%2d gid=%2d size=", inode2[i].d2_uid, inode2[i].d2_gid); printf("%6ld", inode2[i].d2_size); printf(" zone[0]=%ld\n", inode2[i].d2_zone[0]); } if ((inode2[i].d2_mode & I_TYPE) == I_DIRECTORY) { /* This is a directory */ get_block(inode2[i].d2_zone[0], (char *) dir); for (j = 0; j < NR_DIR_ENTRIES; j++) if (dir[j].d_ino) printf("\tInode %2d: %s\n", dir[j].d_ino, dir[j].d_name); } } } } printf("%d inodes used. %d zones used.\n", next_inode - 1, next_zone); } int read_and_set(n) block_t n; { /* The first time a block is read, it returns all 0s, unless there has * been a write. This routine checks to see if a block has been accessed. */ int w, s, mask, r; if (sizeof(char *) == 2 && n >= MAX_INIT) pexit("can't initialize past 128M"); w = n / 8; s = n % 8; mask = 1 << s; r = (umap[w] & mask ? 1 : 0); umap[w] |= mask; return(r); } void usage() { fprintf(stderr, "Usage: %s [-1dlot] [-b blocks] [-i inodes] special [proto]\n", progname); exit(1); } /*================================================================ * get_block & put_block for MS-DOS *===============================================================*/ #ifdef DOS /* * These are the get_block and put_block routines * when compiling & running mkfs.c under MS-DOS. * * It requires the (asembler) routines absread & abswrite * from the file diskio.asm. Since these routines just do * as they are told (read & write the sector specified), * a local cache is used to minimize the i/o-overhead for * frequently used blocks. * * The global variable "file" determines whether the output * is to a disk-device or to a binary file. */ #define PH_SECTSIZE 512 /* size of a physical disk-sector */ char *derrtab[14] = { "no error", "disk is read-only", "unknown unit", "device not ready", "bad command", "data error", "internal error: bad request structure length", "seek error", "unknown media type", "sector not found", "printer out of paper (?)", "write fault", "read error", "general error" }; #define CACHE_SIZE 20 /* 20 block-buffers */ struct cache { char blockbuf[BLOCK_SIZE]; block_t blocknum; int dirty; int usecnt; } cache[CACHE_SIZE]; void special(string) char *string; { if (string[1] == ':' && string[2] == 0) { /* Format: d: or d:fname */ disk = (string[0] & ~32) - 'A'; if (disk > 1 && !override) /* safety precaution */ pexit("Bad drive specifier for special"); } else { file = 1; if ((fd = creat(string, BWRITE)) == 0) pexit("Can't open special file"); } } void get_block(n, buf) block_t n; char buf[BLOCK_SIZE]; { /* Get a block to the user */ struct cache *bp, *fp; /* First access returns a zero block */ if (read_and_set(n) == 0) { copy(zero, buf, BLOCK_SIZE); return; } /* Look for block in cache */ fp = 0; for (bp = cache; bp < &cache[CACHE_SIZE]; bp++) { if (bp->blocknum == n) { copy(bp, buf, BLOCK_SIZE); bp->usecnt++; return; } /* Remember clean block */ if (bp->dirty == 0) if (fp) { if (fp->usecnt > bp->usecnt) fp = bp; } else fp = bp; } /* Block not in cache, get it */ if (!fp) { /* No clean buf, flush one */ for (bp = cache, fp = cache; bp < &cache[CACHE_SIZE]; bp++) if (fp->usecnt > bp->usecnt) fp = bp; mx_write(fp->blocknum, fp); } mx_read(n, fp); fp->dirty = 0; fp->usecnt = 0; fp->blocknum = n; copy(fp, buf, BLOCK_SIZE); } void put_block(n, buf) block_t n; char buf[BLOCK_SIZE]; { /* Accept block from user */ struct cache *fp, *bp; (void) read_and_set(n); /* Look for block in cache */ fp = 0; for (bp = cache; bp < &cache[CACHE_SIZE]; bp++) { if (bp->blocknum == n) { copy(buf, bp, BLOCK_SIZE); bp->dirty = 1; return; } /* Remember clean block */ if (bp->dirty == 0) if (fp) { if (fp->usecnt > bp->usecnt) fp = bp; } else fp = bp; } /* Block not in cache */ if (!fp) { /* No clean buf, flush one */ for (bp = cache, fp = cache; bp < &cache[CACHE_SIZE]; bp++) if (fp->usecnt > bp->usecnt) fp = bp; mx_write(fp->blocknum, fp); } fp->dirty = 1; fp->usecnt = 1; fp->blocknum = n; copy(buf, fp, BLOCK_SIZE); } void cache_init() { struct cache *bp; for (bp = cache; bp < &cache[CACHE_SIZE]; bp++) bp->blocknum = -1; } void flush() { /* Flush all dirty blocks to disk */ struct cache *bp; for (bp = cache; bp < &cache[CACHE_SIZE]; bp++) if (bp->dirty) { mx_write(bp->blocknum, bp); bp->dirty = 0; } } /*================================================================== * hard read & write etc. *=================================================================*/ #define MAX_RETRIES 5 void mx_read(blocknr, buf) int blocknr; char buf[BLOCK_SIZE]; { /* Read the requested MINIX-block in core */ char (*bp)[PH_SECTSIZE]; int sectnum, retries, err; if (file) { lseek(fd, (off_t) blocknr * BLOCK_SIZE, 0); if (read(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) pexit("mx_read: error reading file"); } else { sectnum = blocknr * (BLOCK_SIZE / PH_SECTSIZE); for (bp = buf; bp < &buf[BLOCK_SIZE]; bp++) { retries = MAX_RETRIES; do err = absread(disk, sectnum, bp); while (err && --retries); if (retries) { sectnum++; } else { dexit("mx_read", sectnum, err); } } } } void mx_write(blocknr, buf) int blocknr; char buf[BLOCK_SIZE]; { /* Write the MINIX-block to disk */ char (*bp)[PH_SECTSIZE]; int retries, sectnum, err; if (file) { lseek(fd, blocknr * BLOCK_SIZE, 0); if (write(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) { pexit("mx_write: error writing file"); } } else { sectnum = blocknr * (BLOCK_SIZE / PH_SECTSIZE); for (bp = buf; bp < &buf[BLOCK_SIZE]; bp++) { retries = MAX_RETRIES; do { err = abswrite(disk, sectnum, bp); } while (err && --retries); if (retries) { sectnum++; } else { dexit("mx_write", sectnum, err); } } } } void dexit(s, sectnum, err) int sectnum, err; char *s; { printf("Error: %s, sector: %d, code: %d, meaning: %s\n", s, sectnum, err, derrtab[err]); exit(2); } #endif /*================================================================ * get_block & put_block for UNIX *===============================================================*/ #ifdef UNIX void special(string) char *string; { fd = creat(string, 0777); close(fd); fd = open(string, O_RDWR); if (fd < 0) pexit("Can't open special file"); #if (MACHINE == ATARI) { struct stat statbuf; if (fstat(fd, &statbuf) < 0) return; isdev = (statbuf.st_mode & S_IFMT) == S_IFCHR || (statbuf.st_mode & S_IFMT) == S_IFBLK ; } #endif } void get_block(n, buf) block_t n; char buf[BLOCK_SIZE]; { /* Read a block. */ int k; /* First access returns a zero block */ if (read_and_set(n) == 0) { copy(zero, buf, BLOCK_SIZE); return; } lseek(fd, (off_t) n * BLOCK_SIZE, SEEK_SET); k = read(fd, buf, BLOCK_SIZE); if (k != BLOCK_SIZE) { pexit("get_block couldn't read"); } } void put_block(n, buf) block_t n; char buf[BLOCK_SIZE]; { /* Write a block. */ (void) read_and_set(n); /* XXX - check other lseeks too. */ if (lseek(fd, (off_t) n * BLOCK_SIZE, SEEK_SET) == (off_t) -1) { pexit("put_block couldn't seek"); } if (write(fd, buf, BLOCK_SIZE) != BLOCK_SIZE) { pexit("put_block couldn't write"); } } /* Dummy routines to keep source file clean from #ifdefs */ void flush() { return; } void cache_init() { return; } #endif ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mknod - build a special file Author: Andy Tanenbaum */ #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <minix/minlib.h> #include <errno.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char *argv [])); _PROTOTYPE(void badcomm, (void)); _PROTOTYPE(void badfifo, (void)); _PROTOTYPE(void badchar, (void)); _PROTOTYPE(void badblock, (void)); int main(argc, argv) int argc; char *argv[]; { /* Mknod name b/c major minor makes a node. */ int mode, major, minor, dev; if (argc < 3) badcomm(); if (*argv[2] != 'b' && *argv[2] != 'c' && *argv[2] != 'p') badcomm(); if (*argv[2] == 'p' && argc != 3) badfifo(); if (*argv[2] == 'c' && argc != 5) badchar(); if (*argv[2] == 'b' && argc != 5) badblock(); if (*argv[2] == 'p') { mode = 010666; dev = 0; } else { mode = (*argv[2] == 'b' ? 060666 : 020666); major = atoi(argv[3]); minor = atoi(argv[4]); if (major - 1 > 0xFE || minor > 0xFF) badcomm(); dev = (major << 8) | minor; } if (mknod(argv[1], mode, dev) < 0) { int err = errno; std_err("mknod: "); errno = err; perror(argv[1]); } return(0); } void badcomm() { std_err("Usage: mknod name b/c/p [major minor]\n"); exit(1); } void badfifo() { std_err("Usage: mknod name p\n"); exit(1); } void badchar() { std_err("Usage: mknod name c major minor\n"); exit(1); } void badblock() { std_err("Usage: mknod name b major minor\n"); exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mkproto - make an mkfs prototype Author: Andrew Cagney */ /* Submitted by: cagney@chook.ua.oz (Andrew Cagney - aka Noid) */ #include <sys/types.h> #include <sys/stat.h> #include <limits.h> #include <dirent.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <unistd.h> /* The default values for the prototype file */ #define DEF_UID 2 /* bin */ #define DEF_GID 1 /* daemon group */ #define DEF_PROT 0555 /* a=re */ #define DEF_BLOCKS 360 #define DEF_INODES 63 #define DEF_INDENTSTR "\t" #define major(x) ( (x>>8) & 0377) #define minor(x) (x & 0377) /* Globals. */ int count, origlen, tabs; int gid, uid, prot, same_uid, same_gid, same_prot, blocks, inodes; int block_given, inode_given, dprot; char *indentstr; char *proto_file, *top; FILE *outfile; extern int optind; extern char *optarg; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void descend, (char *dirname)); _PROTOTYPE(void display_attrib, (char *name, struct stat *st)); _PROTOTYPE(void usage, (char *binname)); _PROTOTYPE(void open_outfile, (void)); int main(argc, argv) int argc; char *argv[]; { char *dir; struct stat st; int op; gid = DEF_GID; uid = DEF_UID; prot = DEF_PROT; blocks = DEF_BLOCKS; inodes = DEF_INODES; indentstr = DEF_INDENTSTR; inode_given = 0; block_given = 0; top = 0; same_uid = 0; same_gid = 0; same_prot = 0; while ((op = getopt(argc, argv, "b:g:i:p:t:u:d:s")) != EOF) { switch (op) { case 'b': blocks = atoi(optarg); block_given = 1; break; case 'g': gid = atoi(optarg); if (gid == 0) usage(argv[0]); same_gid = 0; break; case 'i': inodes = atoi(optarg); inode_given = 1; break; case 'p': sscanf(optarg, "%o", &prot); if (prot == 0) usage(argv[0]); same_prot = 0; break; case 's': same_prot = 1; same_uid = 1; same_gid = 1; break; case 't': top = optarg; break; case 'u': uid = atoi(optarg); if (uid == 0) usage(argv[0]); same_uid = 0; break; case 'd': indentstr = optarg; break; default: /* Illegal options */ usage(argv[0]); } } if (optind >= argc) { usage(argv[0]); } else { dir = argv[optind]; optind++; proto_file = argv[optind]; } if (!top) top = dir; open_outfile(); if (block_given && !inode_given) inodes = (blocks / 3) + 8; if (!block_given && inode_given) usage(argv[0]); count = 1; tabs = 0; origlen = strlen(dir); /* Check that it really is a directory */ stat(dir, &st); if ((st.st_mode & S_IFMT) != S_IFDIR) { fprintf(stderr, "mkproto: %s must be a directory\n", dir); usage(argv[0]); } fprintf(outfile, "boot\n%d %d\n", blocks, inodes); display_attrib("", &st); fprintf(outfile, "\n"); descend(dir); fprintf(outfile, "$\n"); return(0); } /* Output the prototype spec for this directory. */ void descend(dirname) char *dirname; { struct dirent *dp; DIR *dirp; char *name, *temp, *tempend; int i; struct stat st; mode_t mode; dirp = opendir(dirname); if (dirp == NULL) { fprintf(stderr, "unable to open directory %s\n", dirname); return; } tabs++; temp = (char *) malloc(sizeof(char) * strlen(dirname) +1 + PATH_MAX); strcpy(temp, dirname); strcat(temp, "/"); tempend = &temp[strlen(temp)]; for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) { name = dp->d_name; count++; strcpy(tempend, name); if (stat(temp, &st) == -1) { fprintf(stderr, "cant get status of '%s' \n", temp); continue; } if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) continue; display_attrib(name, &st); mode = st.st_mode & S_IFMT; if (mode == S_IFDIR) { fprintf(outfile, "\n"); descend(temp); for (i = 0; i < tabs; i++) { fprintf(outfile, indentstr); } fprintf(outfile, "$\n"); continue; } if (mode == S_IFBLK || mode == S_IFCHR) { fprintf(outfile, " %d %d\n", major(st.st_rdev), minor(st.st_rdev)); continue; } if (mode == S_IFREG) { i = origlen; fprintf(outfile, "%s%s", indentstr, top); while (temp[i] != '\0') { fputc(temp[i], outfile); i++; } fprintf(outfile, "\n"); continue; } fprintf(outfile, " /dev/null"); fprintf(stderr,"File\n\t%s\n has an invalid mode, made empty.\n",temp); } closedir(dirp); free(temp); tabs--; } void display_attrib(name, st) char *name; struct stat *st; { /* Output the specification for a single file */ int i; if (same_uid) uid = st->st_uid; if (same_gid) gid = st->st_gid; if (same_prot) prot = st->st_mode & 0777; /***** This one is a bit shady *****/ for (i = 0; i < tabs; i++) fprintf(outfile, indentstr); fprintf(outfile, "%s%s%c%c%c%3o %d %d", name, *name == '\0' ? "" : indentstr, /* stop the tab for a null name */ (st->st_mode & S_IFMT) == S_IFDIR ? 'd' : (st->st_mode & S_IFMT) == S_IFCHR ? 'c' : (st->st_mode & S_IFMT) == S_IFBLK ? 'b' : '-', /* file type */ (st->st_mode & S_ISUID) ? 'u' : '-', /* set uid */ (st->st_mode & S_ISGID) ? 'g' : '-', /* set gid */ prot, uid, gid); } void usage(binname) char *binname; { fprintf(stderr, "Usage: %s [options] source_directory [prototype_file]\n", binname); fprintf(stderr, "options:\n"); fprintf(stderr, " -b n\t\t file system size is n blocks (default %d)\n", DEF_BLOCKS); fprintf(stderr, " -d STRING\t define the indentation characters (default %s)\n", "(none)"); fprintf(stderr, " -g n\t\t use n as the gid on all files (default %d)\n", DEF_GID); fprintf(stderr, " -i n\t\t file system gets n i-nodes (default %d)\n", DEF_INODES); fprintf(stderr, " -p nnn\t use nnn (octal) as mode on all files (default %o)\n", DEF_PROT); fprintf(stderr, " -s \t\t use the same uid, gid and mode as originals have\n"); fprintf(stderr, " -t ROOT\t inital path prefix for each entry\n"); fprintf(stderr, " -u n\t\t use nnn as the uid on all files (default %d)\n", DEF_UID); exit(1); } void open_outfile() { if (proto_file == NULL) outfile = stdout; else if ((outfile = fopen(proto_file, "w")) == NULL) fprintf(stderr, "Cannot create %s\n ", proto_file); } ��������������������������������������������������������������������������������������������������/* modem - Put modem into DIALIN or DIALOUT mode. Author: F. van Kempen */ /* Exit: 0 OK, suspended/restarted GETTY * 1 UNIX error * 2 Process busy * Version: 1.3 12/30/89 * * Author: F. van Kempen, MicroWalt Corporation * * All fancy stuff removed, see getty.c. Kees J. Bot. * */ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <signal.h> #include <string.h> #include <unistd.h> #include <utmp.h> #include <errno.h> char PATH_UTMP[] = "/etc/utmp"; /* current logins */ _PROTOTYPE(void usage , (void)); _PROTOTYPE(int main , (int argc , char *argv [])); _PROTOTYPE(void sendcodes , (char *tty, char *codes)); void usage() { fprintf(stderr, "Usage: modem [-sio] [-I in-codes] [-O out-codes] line [command args ...]\n"); exit(1); } main(argc, argv) int argc; char *argv[]; { struct utmp entry; char devtty[1024], *tty; char **command; int ex_code = 0; int fd, i, slot, getty; struct stat st; enum { TOGGLE, DIALIN, DIALOUT } mode= TOGGLE; int silent = 0; _PROTOTYPE(void (*hsig), (int)); _PROTOTYPE(void (*isig), (int)); _PROTOTYPE(void (*qsig), (int)); _PROTOTYPE(void (*tsig), (int)); pid_t pid; int r, status; uid_t uid = getuid(); gid_t gid = getgid(); char *in_codes, *out_codes; i = 1; while (i < argc && argv[i][0] == '-') { char *opt = argv[i++] + 1; if (opt[0] == '-' && opt[1] == 0) break; while (*opt != 0) { switch (*opt++) { case 's': /* silent mode */ silent = 1; break; case 'i': /* DIAL-IN mode: suspend GETTY */ mode = DIALIN; break; case 'o': /* DIAL-OUT mode: restart GETTY */ mode = DIALOUT; break; case 'I': /* code to switch modem to dial-in */ if (*opt == 0) { if (i == argc) usage(); opt = argv[i++]; } in_codes = opt; opt = ""; break; case 'O': /* code to switch modem to dial-out */ if (*opt == 0) { if (i == argc) usage(); opt = argv[i++]; } out_codes = opt; opt = ""; break; default: usage(); } } } if (i == argc) usage(); tty = argv[i++]; /* Modem line */ if (mode != TOGGLE && i != argc) usage(); command = argv + i; /* Command to execute (if any). */ if (strchr(tty, '/') == NULL) { strcpy(devtty, "/dev/"); strncat(devtty, tty, 1024 - 6); tty = devtty; } if (stat(tty, &st) < 0) { fprintf(stderr, "modem: %s: %s\n", tty, strerror(errno)); exit(1); } if (!S_ISCHR(st.st_mode)) { fprintf(stderr, "%s is not a tty\n", tty); exit(1); } /* Find the utmp slot number for the line. */ if ((fd= open(tty, O_RDONLY)) < 0 || (slot= fttyslot(fd)) == 0) { fprintf(stderr, "modem: %s: %s\n", tty, strerror(errno)); exit(1); } close(fd); /* Read the UTMP file to find out the PID and STATUS of the GETTY. */ entry.ut_type= 0; if ((fd = open(PATH_UTMP, O_RDONLY)) < 0 || lseek(fd, (off_t) slot * sizeof(entry), SEEK_SET) < 0 || read(fd, &entry, sizeof(entry)) < 0 ) { fprintf(stderr, "modem: cannot read UTMP !\n"); exit(1); } close(fd); hsig= signal(SIGHUP, SIG_IGN); isig= signal(SIGINT, SIG_IGN); qsig= signal(SIGQUIT, SIG_IGN); tsig= signal(SIGTERM, SIG_IGN); /* Process the terminal entry if we got one. */ switch (entry.ut_type) { case LOGIN_PROCESS: /* getty waiting for a call */ getty = 1; break; case USER_PROCESS: /* login or user-shell */ if (!silent) fprintf(stderr, "modem: line is busy.\n"); exit(2); break; default: getty = 0; } for (i = (mode == TOGGLE) ? 0 : 1; i < 2; i++) { /* Now perform the desired action (DIALIN or DIALOUT). */ switch (mode) { case DIALOUT: case TOGGLE: if (getty) kill(entry.ut_pid, SIGUSR1); /* suspend getty */ chown(tty, uid, st.st_gid); /* give line to user */ chmod(tty, 0600); if (out_codes != NULL) sendcodes(tty, out_codes); if (!silent) printf("modem on %s set for dialout.\n", tty); break; case DIALIN: if (in_codes != NULL) sendcodes(tty, in_codes); chown(tty, 0, st.st_gid); /* revoke access */ chmod(tty, 0600); if (getty) kill(entry.ut_pid, SIGUSR2); /* restart getty */ if (!silent) printf("modem on %s set for dialin.\n", tty); } if (mode == TOGGLE) { /* Start the command to run */ pid_t pid; int status; switch ((pid = fork())) { case -1: fprintf(stderr, "modem: fork(): %s\n", strerror(errno)); ex_code= 1; break; case 0: setgid(gid); setuid(uid); (void) signal(SIGHUP, hsig); (void) signal(SIGINT, isig); (void) signal(SIGQUIT, qsig); (void) signal(SIGTERM, tsig); execvp(command[0], command); fprintf(stderr, "modem: %s: %s\n", command[0], strerror(errno)); _exit(127); default: while ((r= wait(&status)) != pid) { if (r == -1 && errno != EINTR) break; } if (r == -1 || status != 0) ex_code = 1; } mode = DIALIN; } } exit(ex_code); } void sendcodes(tty, codes) char *tty, *codes; { int fd; int c; char buf[1024], *bp = buf; if ((fd = open(tty, O_RDWR|O_NONBLOCK)) < 0) { fprintf(stderr, "modem: can't send codes to %s: %s\n", tty, strerror(errno)); return; } while ((c = *codes++) != 0) { fprintf(stderr, "%d\n", __LINE__); if (c == '\\') { if ((c = *codes++) == 0) break; if (c == 'r') c= '\r'; if (c == 'n') c= '\n'; } *bp++ = c; if (bp == buf + sizeof(buf) || c == '\r' || c == '\n') { fprintf(stderr, "%d\n", __LINE__); write(fd, buf, bp - buf); fprintf(stderr, "%d\n", __LINE__); do {sleep(1); fprintf(stderr, "%d\n", __LINE__); fprintf(stderr, "%d\n", read(fd, buf, sizeof(buf))); }while (read(fd, buf, sizeof(buf)) > 0); fprintf(stderr, "%d\n", __LINE__); bp = buf; } } if (bp > buf) { fprintf(stderr, "%d\n", __LINE__); write(fd, buf, bp - buf); fprintf(stderr, "%d\n", __LINE__); do sleep(1); while (read(fd, buf, sizeof(buf)) > 0); fprintf(stderr, "%d\n", __LINE__); } close(fd); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mount - mount a file system Author: Andy Tanenbaum */ #include <errno.h> #include <sys/types.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <minix/config.h> #include <minix/const.h> #include <minix/minlib.h> #include <minix/swap.h> #include <sys/svrctl.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void list, (void)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void tell, (char *this)); _PROTOTYPE(void swapon, (char *file)); static u8_t MAGIC[] = { SWAP_MAGIC0, SWAP_MAGIC1, SWAP_MAGIC2, SWAP_MAGIC3 }; int main(argc, argv) int argc; char *argv[]; { int i, ro, swap, n, v; char **ap, *vs, *opt, *err; char special[PATH_MAX+1], mounted_on[PATH_MAX+1], version[10], rw_flag[10]; if (argc == 1) list(); /* just list /etc/mtab */ ro = 0; swap = 0; ap = argv+1; for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { opt = argv[i]+1; while (*opt != 0) switch (*opt++) { case 'r': ro = 1; break; case 's': swap = 1; break; default: usage(); } } else { *ap++ = argv[i]; } } *ap = NULL; argc = (ap - argv); if (ro && swap) usage(); if (swap) { if (argc != 2) usage(); swapon(argv[1]); tell(argv[1]); tell(" is swapspace\n"); } else { if (argc != 3) usage(); if (mount(argv[1], argv[2], ro) < 0) { err = strerror(errno); std_err("mount: Can't mount "); std_err(argv[1]); std_err(" on "); std_err(argv[2]); std_err(": "); std_err(err); std_err("\n"); exit(1); } /* The mount has completed successfully. Tell the user. */ tell(argv[1]); tell(" is read-"); tell(ro ? "only" : "write"); tell(" mounted on "); tell(argv[2]); tell("\n"); } /* Update /etc/mtab. */ n = load_mtab("mount"); if (n < 0) exit(1); /* something is wrong. */ /* Loop on all the /etc/mtab entries, copying each one to the output buf. */ while (1) { n = get_mtab_entry(special, mounted_on, version, rw_flag); if (n < 0) break; n = put_mtab_entry(special, mounted_on, version, rw_flag); if (n < 0) { std_err("mount: /etc/mtab has grown too large\n"); exit(1); } } if (swap) { vs = "swap"; } else { v = fsversion(argv[1], "mount"); if (v == 1) vs = "1"; else if (v == 2) vs = "2"; else vs = "0"; } n = put_mtab_entry(argv[1], swap ? "swap" : argv[2], vs, (ro ? "ro" : "rw") ); if (n < 0) { std_err("mount: /etc/mtab has grown too large\n"); exit(1); } n = rewrite_mtab("mount"); return(0); } void list() { int n; char special[PATH_MAX+1], mounted_on[PATH_MAX+1], version[10], rw_flag[10]; /* Read and print /etc/mtab. */ n = load_mtab("mount"); if (n < 0) exit(1); while (1) { n = get_mtab_entry(special, mounted_on, version, rw_flag); if (n < 0) break; write(1, special, strlen(special)); if (strcmp(version, "swap") == 0) { tell(" is swapspace\n"); } else { tell(" is read-"); tell(strcmp(rw_flag, "rw") == 0 ? "write" : "only"); tell(" mounted on "); tell(mounted_on); tell("\n"); } } exit(0); } void usage() { std_err("Usage: mount [-r] special name\n mount -s special\n"); exit(1); } void tell(this) char *this; { write(1, this, strlen(this)); } void swapon(file) char *file; { u32_t super[2][BLOCK_SIZE / 2 / sizeof(u32_t)]; swap_hdr_t *sp; struct mmswapon mmswapon; int fd, r; char *err; if ((fd = open(file, O_RDWR)) < 0 || lseek(fd, BLOCK_SIZE, SEEK_SET) == -1 || (r = read(fd, super, BLOCK_SIZE)) < 0 ) { err = strerror(errno); std_err("mount: "); std_err(file); std_err(": "); std_err(err); std_err("\n"); exit(1); } sp = (swap_hdr_t *) &super[0]; if (memcmp(sp->sh_magic, MAGIC, sizeof(MAGIC)) != 0) sp = (swap_hdr_t *) &super[1]; if (r == BLOCK_SIZE && memcmp(sp->sh_magic, MAGIC, sizeof(MAGIC)) != 0 || sp->sh_version > SH_VERSION) { std_err("mount: "); std_err(file); std_err(" is not swapspace\n"); exit(1); } close(fd); mmswapon.offset = sp->sh_offset; mmswapon.size = sp->sh_swapsize; strncpy(mmswapon.file, file, sizeof(mmswapon.file)); mmswapon.file[sizeof(mmswapon.file)-1] = 0; if (svrctl(MMSWAPON, &mmswapon) < 0) { err = strerror(errno); std_err("mount: "); std_err(file); std_err(": "); std_err(err); std_err("\n"); exit(1); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* mt 1.3 - magnetic tape control Author: Kees J. Bot * 4 Apr 1993 */ #define nil NULL #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mtio.h> /* Device status. */ #define DS_OK 0 #define DS_ERR 1 #define DS_EOF 2 /* SCSI Sense key bits. */ #define SENSE_KEY 0x0F /* The key part. */ #define SENSE_ILI 0x20 /* Illegal block size. */ #define SENSE_EOM 0x40 /* End-of-media. */ #define SENSE_EOF 0x80 /* Filemark reached. */ /* Supported operations: */ typedef struct tape_operation { int op; /* Opcode for MTIOCTOP ioctl (if any). */ char *cmd; /* Command name. */ int lim; /* Limits on count. */ } tape_operation_t; #define SELF -1 /* Not a simple command, have to interpret. */ #define IGN -1 /* Ignore count field (or accept anything.) */ #define NNG 0 /* Nonnegative count field. */ #define POS 1 /* Positive count field. */ tape_operation_t tapeops[] = { { MTWEOF, "eof", POS }, /* Write EOF mark */ { MTWEOF, "weof", POS }, /* Same */ { MTFSF, "fsf", POS }, /* Forward Space File */ { MTFSR, "fsr", POS }, /* Forward Space Record */ { MTBSF, "bsf", NNG }, /* Backward Space File */ { MTBSR, "bsr", POS }, /* Backward Space Record */ { MTEOM, "eom", IGN }, /* To End-Of-Media */ { MTREW, "rewind", IGN }, /* Rewind */ { MTOFFL, "offline", IGN }, /* Rewind and take offline */ { MTOFFL, "rewoffl", IGN }, /* Same */ { SELF, "status", IGN }, /* Tape Status */ { MTRETEN, "retension",IGN }, /* Retension the tape */ { MTERASE, "erase", IGN }, /* Erase the tape */ { MTMODE, "density", NNG }, /* Select density */ { MTBLKZ, "blksize", NNG }, /* Select block size */ { MTBLKZ, "blocksize",NNG }, /* Same */ }; #define arraysize(a) (sizeof(a)/sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) /* From aha_scsi.c: */ char *dev_state[] = { "OK", "ERR", "EOF" }; char *scsi_sense[] = { "NO SENSE INFO", "RECOVERED ERROR", "NOT READY", "MEDIUM ERROR", "HARDWARE ERROR", "ILLEGAL REQUEST", "UNIT ATTENTION", "DATA PROTECT", "BLANK CHECK", "VENDOR UNIQUE ERROR", "COPY ABORTED", "ABORTED COMMAND", "EQUAL", "VOLUME OVERFLOW", "MISCOMPARE", "SENSE RESERVED" }; void usage(void) { fprintf(stderr, "Usage: mt [-f device] command [count]\n"); exit(1); } int main(int argc, char **argv) { char *tape; char *cmd; int count= 1; int fd, r; tape_operation_t *op, *found; struct mtop mtop; struct mtget mtget; tape= getenv("TAPE"); /* -f tape? */ if (argc > 1 && argv[1][0] == '-' && argv[1][1] == 'f') { tape= argv[1] + 2; if (*tape == 0) { if (--argc < 2) usage(); argv++; tape= argv[1]; } argc--; argv++; } if (argc != 2 && argc != 3) usage(); if (argc == 3) { /* Check and convert the 'count' argument. */ char *end; errno= 0; count= strtol(argv[2], &end, 0); if (*end != 0) usage(); if (errno == ERANGE || (mtop.mt_count= count) != count) { fprintf(stderr, "mt: %s: count too large, overflow\n", argv[2]); exit(1); } } if (tape == nil) { fprintf(stderr, "mt: tape device not specified by -f or $TAPE\n"); exit(1); } cmd= argv[1]; if (strcmp(cmd, "rew") == 0) cmd= "rewind"; /* aha! */ found= nil; /* Search for an operation that is unambiguously named. */ for (op= tapeops; op < arraylimit(tapeops); op++) { if (strncmp(op->cmd, cmd, strlen(cmd)) == 0) { if (found != nil) { fprintf(stderr, "mt: %s: ambiguous\n", cmd); exit(1); } found= op; } } if ((op= found) == nil) { fprintf(stderr, "mt: unknown command '%s'\n", cmd); exit(1); } /* Check count. */ switch (op->lim) { case NNG: if (count < 0) { fprintf(stderr, "mt %s: count may not be negative\n", op->cmd); exit(1); } break; case POS: if (count <= 0) { fprintf(stderr, "mt %s: count must be greater than zero\n", op->cmd); exit(1); } break; } if (strcmp(tape, "-") == 0) { fd= 0; } else if ((fd= open(tape, O_RDONLY)) < 0) { fprintf(stderr, "mt: %s: %s\n", tape, strerror(errno)); exit(1); } if (op->op != SELF) { /* A simple tape operation. */ mtop.mt_op= op->op; mtop.mt_count= count; r= ioctl(fd, MTIOCTOP, &mtop); } else if (strcmp(op->cmd, "status") == 0) { /* Get status information. */ if ((r= ioctl(fd, MTIOCGET, &mtget)) == 0) { printf("\ SCSI tape drive %s:\n\ drive status = 0x%02x (%s), sense key = 0x%02x (%s%s%s%s)\n\ file no = %ld, block no = %ld, residual = %ld, block size = ", tape, mtget.mt_dsreg, mtget.mt_dsreg > 2 ? "?" : dev_state[mtget.mt_dsreg], mtget.mt_erreg, mtget.mt_erreg & SENSE_EOF ? "EOF + " : "", mtget.mt_erreg & SENSE_EOM ? "EOM + " : "", mtget.mt_erreg & SENSE_ILI ? "ILI + " : "", scsi_sense[mtget.mt_erreg & SENSE_KEY], (long) mtget.mt_fileno, (long) mtget.mt_blkno, (long) mtget.mt_resid); printf(mtget.mt_blksize == 0 ? "variable\n" : "%ld\n", mtget.mt_blksize); } } if (r < 0) { if (errno == ENOTTY) { fprintf(stderr, "mt: %s: command '%s' not supported\n", tape, op->cmd); exit(2); } fprintf(stderr, "mt: %s: %s\n", tape, strerror(errno)); exit(1); } exit(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nm - print name list. Author: Dick van Veen */ /* Dick van Veen: veench@cs.vu.nl */ #include <sys/types.h> #include <a.out.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> /* Read the name list in memory, sort it, and print it. */ /* Nm [-gnopru] [file] ... * * flags: * -d address in decimal * -g print only external symbols. * -n sort numerically rather than alphabetically. * -o prepend file name to each line rather than only once. * -p don't sort, pint n symbol-table order. * -r sort in reverse order. * -u print only undefined symbols. * * - when no file name is present, a.out is assumed. * * NOTE: no archives are supported because assembly files don't * have symbol tables. * */ #define A_OUT "a.out" int d_flag; int g_flag; int n_flag; int o_flag; int p_flag; int r_flag; int u_flag; char io_buf[BUFSIZ]; /* io buffer */ struct exec header; /* header of a.out file */ int stbl_elems; /* #elements in symbol table */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(int nm_sort, (const void *tmp_stbl1, const void *tmp_stbl2)); _PROTOTYPE(void nm, (char *file)); _PROTOTYPE(int read_header, (int fd)); _PROTOTYPE(void nm_print, (char *file, struct nlist *stbl)); int main(argc, argv) int argc; char **argv; { argv++; while (*argv != 0 && **argv == '-') { *argv += 1; while (**argv != '\0') { switch (**argv) { case 'd': d_flag = 1; break; case 'g': g_flag = 1; break; case 'n': n_flag = 1; break; case 'o': o_flag = 1; break; case 'p': p_flag = 1; break; case 'r': r_flag = 1; break; case 'u': u_flag = 1; break; default: fprintf(stderr, "illegal flag: -%c\n", **argv); exit(-1); } *argv += 1; } argv++; } setbuf(stdin, io_buf); if (*argv == 0) nm(A_OUT); else while (*argv != 0) { nm(*argv); argv++; } return(0); } int nm_sort(tmp_stbl1, tmp_stbl2) _CONST void *tmp_stbl1, *tmp_stbl2; { struct nlist *stbl1 = (struct nlist *)tmp_stbl1; struct nlist *stbl2 = (struct nlist *)tmp_stbl2; int cmp; if (n_flag) { /* sort numerically */ if ((stbl1->n_sclass & N_SECT) < (stbl2->n_sclass & N_SECT)) cmp = -1; else if ((stbl1->n_sclass & N_SECT) > (stbl2->n_sclass & N_SECT)) cmp = 1; else if (stbl1->n_value < stbl2->n_value) cmp = -1; else if (stbl1->n_value > stbl2->n_value) cmp = 1; else cmp = strncmp(stbl1->n_name, stbl2->n_name, (size_t)8); } else { cmp = strncmp(stbl1->n_name, stbl2->n_name, (size_t)8); if (cmp == 0) { if (stbl1->n_value < stbl2->n_value) cmp = -1; else if (stbl1->n_value > stbl2->n_value) cmp = 1; } } if (r_flag) cmp = -cmp; /* reverse sort */ return(cmp); } void nm(file) char *file; { struct nlist *stbl; int fd; fd = open(file, O_RDONLY); if (fd == -1) { fprintf(stderr, "can't open %s\n", file); return; } if (read_header(fd)) { fprintf(stderr, "%s: no executable file\n", file); close(fd); return; } if (header.a_syms == 0) { close(fd); return; } if ((size_t) header.a_syms != header.a_syms) { fprintf(stderr, "%s: symbol table too large to allocate\n", file); close(fd); return; } if ((int) header.a_syms != header.a_syms) { /* This is necessary because we are too lazy to iterate the read. */ fprintf(stderr, "%s: symbol table too large to read\n", file); close(fd); return; } stbl = (struct nlist *) malloc((size_t) header.a_syms); if (stbl == NULL) { fprintf(stderr, "%s: can't allocate symbol table\n", file); close(fd); return; } if (read(fd, (char *) stbl, (unsigned) header.a_syms) != header.a_syms) { fprintf(stderr, "%s: can't read symbol table\n", file); free(stbl); close(fd); return; } stbl_elems = (int) header.a_syms / sizeof(struct nlist); if (!p_flag) qsort(stbl, (size_t)stbl_elems, sizeof(struct nlist), nm_sort); nm_print(file, stbl); free(stbl); close(fd); } int read_header(fd) int fd; { if (read(fd, (char *) &header, sizeof(struct exec)) != sizeof(struct exec)) return(1); if (BADMAG(header)) return(1); lseek(fd, A_SYMPOS(header), SEEK_SET); return(0); } void nm_print(file, stbl) char *file; register struct nlist *stbl; { struct nlist *last; char name[9]; int n_sclass; char type; name[8] = '\0'; if (!o_flag) printf("%s:\n", file); for (last = &stbl[stbl_elems]; stbl != last; stbl++) { if (g_flag && (stbl->n_sclass & N_CLASS) != C_EXT) continue; if (u_flag && (stbl->n_sclass & N_SECT) != N_UNDF) continue; n_sclass = stbl->n_sclass & N_SECT; if (n_sclass == N_ABS) type = 'a'; else if (n_sclass == N_TEXT) type = 't'; else if (n_sclass == N_DATA) type = 'd'; else if (n_sclass == N_BSS) type = 'b'; else type = 'u'; if ((stbl->n_sclass & N_CLASS) == C_EXT) type += 'A' - 'a'; strncpy(name, stbl->n_name, (size_t)8); if (d_flag) { /* Offsets in decimal. */ if (o_flag) printf("%s:%08ld %c %s\n",file,stbl->n_value,type,name); else printf("%08ld %c %s\n", stbl->n_value, type, name); } else { /* Offsets in hex. */ if (o_flag) printf("%s:%08lx %c %s\n",file,stbl->n_value,type,name); else printf("%08lx %c %s\n", stbl->n_value, type, name); } } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* od - octal dump Author: Andy Tanenbaum */ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> int bflag, cflag, dflag, oflag, xflag, hflag, vflag; int linenr, width, state, ever; int prevwds[8]; long off; char buf[512], buffer[BUFSIZ]; int next; int bytespresent; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(long offset, (int argc, char *argv [], int k)); _PROTOTYPE(void dumpfile, (void)); _PROTOTYPE(void wdump, (short *words, int k, int radix)); _PROTOTYPE(void bdump, (char bytes [16 ], int k, int c)); _PROTOTYPE(void byte, (int val, int c)); _PROTOTYPE(int getwords, (short **words)); _PROTOTYPE(int same, (short *w1, int *w2)); _PROTOTYPE(void outword, (int val, int radix)); _PROTOTYPE(void outnum, (int num, int radix)); _PROTOTYPE(void addrout, (long l)); _PROTOTYPE(char hexit, (int k)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { int k, flags; char *p; /* Process flags */ setbuf(stdout, buffer); flags = 0; p = argv[1]; if (argc > 1 && *p == '-') { /* Flags present. */ flags++; p++; while (*p) { switch (*p) { case 'b': bflag++; break; case 'c': cflag++; break; case 'd': dflag++; break; case 'h': hflag++; break; case 'o': oflag++; break; case 'v': vflag++; break; case 'x': xflag++; break; default: usage(); } p++; } } else { oflag = 1; } if ((bflag | cflag | dflag | oflag | xflag) == 0) oflag = 1; k = (flags ? 2 : 1); if (bflag | cflag) { width = 8; } else if (oflag) { width = 7; } else if (dflag) { width = 6; } else { width = 5; } /* Process file name, if any. */ p = argv[k]; if (k < argc && *p != '+') { /* Explicit file name given. */ close(0); if (open(argv[k], O_RDONLY) != 0) { fprintf(stderr, "od: cannot open %s\n", argv[k]); exit(1); } k++; } /* Process offset, if any. */ if (k < argc) { /* Offset present. */ off = offset(argc, argv, k); off = (off / 16L) * 16L; lseek(0, off, SEEK_SET); } dumpfile(); addrout(off); printf("\n"); return(0); } long offset(argc, argv, k) int argc; char *argv[]; int k; { int dot, radix; char *p, c; long val; /* See if the offset is decimal. */ dot = 0; p = argv[k]; while (*p) if (*p++ == '.') dot = 1; /* Convert offset to binary. */ radix = (dot ? 10 : 8); val = 0; p = argv[k]; if (*p == '+') p++; while (*p != 0 && *p != '.') { c = *p++; if (c < '0' || c > '9') { printf("Bad character in offset: %c\n", c); exit(1); } val = radix * val + c - '0'; } p = argv[k + 1]; if (k + 1 == argc - 1 && *p == 'b') val = 512L * val; return(val); } void dumpfile() { int k; short *words; while ((k = getwords(&words))) { /* 'k' is # bytes read */ if (!vflag) { /* ensure 'lazy' evaluation */ if (k == 16 && ever == 1 && same(words, prevwds)) { if (state == 0) { printf("*\n"); state = 1; off += 16; continue; } else if (state == 1) { off += 16; continue; } } } addrout(off); off += k; state = 0; ever = 1; linenr = 1; if (oflag) wdump(words, k, 8); if (dflag) wdump(words, k, 10); if (xflag) wdump(words, k, 16); if (cflag) bdump((char *)words, k, (int)'c'); if (bflag) bdump((char *)words, k, (int)'b'); for (k = 0; k < 8; k++) prevwds[k] = words[k]; for (k = 0; k < 8; k++) words[k] = 0; } } void wdump(words, k, radix) short *words; int k, radix; { int i; if (linenr++ != 1) printf(" "); for (i = 0; i < (k + 1) / 2; i++) outword(words[i] & 0xFFFF, radix); printf("\n"); } void bdump(bytes, k, c) char bytes[16]; int k; char c; { int i; if (linenr++ != 1) printf(" "); for (i = 0; i < k; i++) byte(bytes[i] & 0377, c); printf("\n"); } void byte(val, c) int val; char c; { if (c == 'b') { printf(" "); outnum(val, 7); return; } if (val == 0) printf(" \\0"); else if (val == '\b') printf(" \\b"); else if (val == '\f') printf(" \\f"); else if (val == '\n') printf(" \\n"); else if (val == '\r') printf(" \\r"); else if (val == '\t') printf(" \\t"); else if (val >= ' ' && val < 0177) printf(" %c", val); else { printf(" "); outnum(val, 7); } } int getwords(words) short **words; { int count; if (next >= bytespresent) { bytespresent = read(0, buf, 512); next = 0; } if (next >= bytespresent) return(0); *words = (short *) &buf[next]; if (next + 16 <= bytespresent) count = 16; else count = bytespresent - next; next += count; return(count); } int same(w1, w2) short *w1; int *w2; { int i; i = 8; while (i--) if (*w1++ != *w2++) return(0); return(1); } void outword(val, radix) int val, radix; { /* Output 'val' in 'radix' in a field of total size 'width'. */ int i; if (radix == 16) i = width - 4; if (radix == 10) i = width - 5; if (radix == 8) i = width - 6; if (i == 1) printf(" "); else if (i == 2) printf(" "); else if (i == 3) printf(" "); else if (i == 4) printf(" "); outnum(val, radix); } void outnum(num, radix) int num, radix; { /* Output a number with all leading 0s present. Octal is 6 places, * decimal is 5 places, hex is 4 places. */ unsigned val; val = (unsigned) num; if (radix == 8) printf ("%06o", val); else if (radix == 10) printf ("%05u", val); else if (radix == 16) printf ("%04x", val); else if (radix == 7) { /* special case */ printf ("%03o", val); } } void addrout(l) long l; { if (hflag == 0) { printf("%07lo", l); } else { printf("%07lx", l); } } void usage() { fprintf(stderr, "Usage: od [-bcdhovx] [file] [ [+] offset [.] [b] ]\n"); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* passwd - change a passwd Author: Adri Koppes */ /* chfn, chsh - change full name, shell Added by: Kees J. Bot */ #include <sys/types.h> #include <fcntl.h> #include <string.h> #include <signal.h> #include <pwd.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/stat.h> #include <minix/minlib.h> #include <stdio.h> _PROTOTYPE(void report, (char *label)); _PROTOTYPE(void quit, (int ex_stat)); _PROTOTYPE(void fatal, (char *label)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(int goodchars, (char *s)); _PROTOTYPE(int main, (int argc, char **argv)); char pw_file[] = "/etc/passwd"; char sh_file[] = "/etc/shadow"; char pw_tmp[] = "/etc/ptmp"; char bad[] = "Permission denied\n"; char buf[1024]; enum action { PASSWD, CHFN, CHSH } action = PASSWD; char *arg0; void report(label) char *label; { int e = errno; fprintf(stderr, "%s: ", arg0); fflush(stderr); errno = e; perror(label); } void quit(ex_stat) int ex_stat; { if (unlink(pw_tmp) < 0 && errno != ENOENT) { report(pw_tmp); ex_stat = 1; } exit(ex_stat); } void fatal(label) char *label; { report(label); quit(1); } void usage() { static char *usages[] = { "passwd [user]\n", "chfn [user] fullname\n", "chsh [user] shell\n" }; std_err(usages[(int) action]); exit(1); } int goodchars(s) char *s; { int c; while ((c = *s++) != 0) { if (c == ':' || c < ' ' || c >= 127) return(0); } return(1); } int main(argc, argv) int argc; char *argv[]; { int uid, cn, n; int fd_pwd, fd_tmp; FILE *fp_tmp; time_t salt; struct passwd *pwd; char *name, pwname[9], oldpwd[9], newpwd[9], newcrypted[14], sl[2]; char *argn; int shadow = 0; if ((arg0 = strrchr(argv[0], '/')) != 0) arg0++; else arg0 = argv[0]; if (strcmp(arg0, "chfn") == 0) action = CHFN; else if (strcmp(arg0, "chsh") == 0) action = CHSH; uid = getuid(); n = action == PASSWD ? 1 : 2; if (argc != n && argc != n + 1) usage(); if (argc == n) { pwd = getpwuid(uid); strcpy(pwname, pwd->pw_name); name = pwname; } else { name = argv[1]; pwd = getpwnam(name); } if (pwd == NULL || ((uid != pwd->pw_uid) && uid != 0)) { std_err(bad); exit(1); } switch (action) { case PASSWD: if (pwd->pw_passwd[0] == '#' && pwd->pw_passwd[1] == '#') { /* The password is found in the shadow password file. */ shadow = 1; strncpy(pwname, pwd->pw_passwd + 2, 8); pwname[8] = 0; name = pwname; setpwfile(sh_file); if ((pwd= getpwnam(name)) == NULL) { std_err(bad); exit(1); } printf("Changing the shadow password of %s\n", name); } else { printf("Changing the password of %s\n", name); } oldpwd[0] = 0; if (pwd->pw_passwd[0] != '\0' && uid != 0) { strcpy(oldpwd, getpass("Old password:")); if (strcmp(pwd->pw_passwd, crypt(oldpwd, pwd->pw_passwd)) != 0) { std_err(bad); exit(1); } } for (;;) { strcpy(newpwd, getpass("New password:")); if (newpwd[0] == '\0') std_err("Password cannot be null"); else if (strcmp(newpwd, getpass("Retype password:")) != 0) std_err("Passwords don't match"); else break; std_err(", try again\n"); } time(&salt); sl[0] = (salt & 077) + '.'; sl[1] = ((salt >> 6) & 077) + '.'; for (cn = 0; cn < 2; cn++) { if (sl[cn] > '9') sl[cn] += 7; if (sl[cn] > 'Z') sl[cn] += 6; } strcpy(newcrypted, crypt(newpwd, sl)); break; case CHFN: case CHSH: argn = argv[argc - 1]; if (strlen(argn) > (action == CHFN ? 80 : 60) || !goodchars(argn)) { std_err(bad); exit(1); } } signal(SIGHUP, SIG_IGN); signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); signal(SIGTERM, SIG_IGN); umask(0); n = 10; while ((fd_tmp = open(pw_tmp, O_RDWR | O_CREAT | O_EXCL, 0400)) < 0) { if (errno != EEXIST) fatal("Can't create temporary file"); if (n-- > 0) { sleep(2); } else { fprintf(stderr, "Password file busy, try again later.\n"); exit(1); } } if ((fp_tmp = fdopen(fd_tmp, "w+")) == NULL) fatal(pw_tmp); setpwent(); while ((pwd = getpwent()) != 0) { if (strcmp(name, pwd->pw_name) == 0) { switch (action) { case PASSWD: pwd->pw_passwd = newcrypted; break; case CHFN: pwd->pw_gecos = argn; break; case CHSH: pwd->pw_shell = argn; break; } } if (strcmp(pwd->pw_shell, "/bin/sh") == 0 || strcmp(pwd->pw_shell, "/usr/bin/sh") == 0 ) pwd->pw_shell = ""; fprintf(fp_tmp, "%s:%s:%s:", pwd->pw_name, pwd->pw_passwd, itoa(pwd->pw_uid) ); if (ferror(fp_tmp)) fatal(pw_tmp); fprintf(fp_tmp, "%s:%s:%s:%s\n", itoa(pwd->pw_gid), pwd->pw_gecos, pwd->pw_dir, pwd->pw_shell ); if (ferror(fp_tmp)) fatal(pw_tmp); } endpwent(); if (fflush(fp_tmp) == EOF) fatal(pw_tmp); if (lseek(fd_tmp, (off_t) 0, SEEK_SET) != 0) fatal("Can't reread temp file"); if ((fd_pwd = open(shadow ? sh_file : pw_file, O_WRONLY | O_TRUNC)) < 0) fatal("Can't recreate password file"); while ((n = read(fd_tmp, buf, sizeof(buf))) != 0) { if (n < 0 || write(fd_pwd, buf, n) != n) { report("Error rewriting password file, tell root!"); exit(1); } } close(fd_tmp); close(fd_pwd); quit(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* paste - laminate files Author: David Ihnat */ /* Paste - a recreation of the Unix(Tm) paste(1) command. * * syntax: paste file1 file2 ... paste -dLIST file1 file2 ... paste -s [-dLIST] * file1 file2 ... * * Copyright (C) 1984 by David M. Ihnat * * This program is a total rewrite of the Bell Laboratories Unix(Tm) command of * the same name, as of System V. It contains no proprietary code, and * therefore may be used without violation of any proprietary agreements * whatsoever. However, you will notice that the program is copyrighted by * me. This is to assure the program does *not* fall into the public domain. * Thus, I may specify just what I am now: This program may be freely copied * and distributed, provided this notice remains; it may not be sold for * profit without express written consent of the author. Please note that I * recreated the behavior of the Unix(Tm) 'paste' command as faithfully as * possible, with minor exceptions (noted below); however, I haven't run a * full set of regression * tests. Thus, the user of this program accepts * full responsibility for any effects or loss; in particular, the author is * not responsible for any losses, explicit or incidental, that may be * incurred through use of this program. * * The changes to the program, with one exception, are transparent to a user * familiar with the Unix command of the same name. These changes are: * * 1) The '-s' option had a bug in the Unix version when used with multiple * files. (It would repeat each file in a list, i.e., for * * paste -s file1 file2 file3 * * it would list * * <file1\n><file1\n><file2\n><file1\n><file2\n><file3\n> * * I fixed this, and reported the bug to the providers of the command in Unix. * * 2) The list of valid escape sequences has been expanded to include \b,\f, * and \r. (Just because *I* can't imagine why you'd want to use them * doesn't mean I should keep them from you.) * * 3) There is no longer any restriction on line length. * * I ask that any bugs (and, if possible, fixes) be reported to me when * possible. -David Ihnat (312) 784-4544 ihuxx!ignatz */ /* Modified to run under MINIX 1.1 by David O. Tinker (416) 978-3636 * (utgpu!dtinker) Sept. 19, 1987 */ /* Modified to conform to POSIX 1003.2/Draft10 standard 23rd Sept. 1990 * Changes: * - the arguments can be in any order * - removed the ToUpper function * by Thomas Brupbacher (tobr@mw.lpc.ethz.ch) */ #include <errno.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <stdio.h> /* I'd love to use enums, but not everyone has them. Portability, y'know. */ #define NODELIM 1 #define USAGE 2 #define BADFILE 3 #define TOOMANY 4 #define TAB '\t' #define NL '\n' #define BS '\b' #define FF '\f' #define CR '\r' #define DEL '\177' #define SPACE ' ' #define BACKSLASH '\\' #define _MAXSZ 512 #define _MAXFILES 12 #define CLOSED ((FILE *)-1) #define ENDLIST ((FILE *)-2) char *cmdnam; short int sflag; static char default_delims[] = {TAB}; /* default delimiter string */ char *delims; /* the pointer to the delimiters */ int number_of_delims = 1; /* number of delimiters to use */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void docol, (int nfiles, char **fnamptr)); _PROTOTYPE(void doserial, (int nfiles, char **fnamptr)); _PROTOTYPE(void delimbuild, (char *strptr)); _PROTOTYPE(void prerr, (int etype, char *estring)); int main(argc, argv) int argc; char **argv; { char **arg_ptr; /* used to save argv, needed for docol() etc */ int num_files = 0; /* Number of filenames specified on cmd line */ sflag = 0; delims = default_delims; /* use default delimiters */ cmdnam = *argv; if (argc >= 2) { /* Skip invocation name */ argv++; argc--; /* Save argv */ arg_ptr = argv; /* First, parse input options */ while (argc-- > 0) { if (argv[0][0] == '-' && argv[0][1] != '\0') { switch (argv[0][1]) { case 'd': /* Delimiter character(s) */ if (*(++argv) == '\0') prerr(NODELIM, ""); else delimbuild(*(argv)); argc--; break; case 's': sflag++; break; default: prerr(USAGE, ""); } argv++; } else { num_files++; argv++; } } /* If there are more than MAX_FILES files on the command * line, exit with error message. */ if (num_files > _MAXFILES) prerr(TOOMANY, ""); /* If no files specified, simply exit. Otherwise, if not the * old '-s' option, process all files. If '-s', then process * files one-at-a-time. */ if (!sflag) docol(num_files, arg_ptr); /* Column paste */ else doserial(num_files, arg_ptr); /* Serial paste */ exit(0); } else prerr(USAGE, ""); return(0); } void docol(nfiles, fnamptr) int nfiles; char **fnamptr; { char iobuff[_MAXSZ]; /* i/o buffer for the fgets */ short int somedone; /* flag for blank field handling */ /* There is a strange case where all files are just ready to be * closed, or will on this round. In that case, the string of * delimiters must be preserved. delbuf[1] ->delbuf[MAXFILES+1] * provides intermediate storage for closed files, if needed; * delbuf[0] is the current index. */ char delbuf[_MAXFILES + 2]; FILE *fileptr[_MAXFILES + 1]; int filecnt; /* Set to number of files to process */ register char *delimptr; /* Cycling delimiter pointer */ int index; /* Working variable */ int strend; /* End of string in buffer */ /* Perform column paste. First, attempt to open all files. (This * could be expanded to an infinite number of files, but at the * (considerable) expense of remembering the file and its current * offset, then opening/reading/closing. The commands' utility * doesn't warrant the effort; at least, to me...) */ for (filecnt = 0; (nfiles > 0); fnamptr++) { if ((fnamptr[0][0] == '-') && (fnamptr[0][1] != '\0')) { if (fnamptr[0][1] == 'd') fnamptr++; } else { nfiles--; if (fnamptr[0][0] == '-') { fileptr[filecnt++] = stdin; } else { fileptr[filecnt] = fopen(fnamptr[0], "r"); if (fileptr[filecnt++] == NULL) prerr(BADFILE, *fnamptr); } } } fileptr[filecnt] = ENDLIST; /* End of list. */ /* Have all files. Now, read a line from each file, and output to * stdout. Notice that the old 511 character limitation on the line * length no longer applies, since this program doesn't do the * buffering. Do this until you go through the loop and don't * successfully read from any of the files. */ for (; filecnt;) { somedone = 0; /* Blank field handling flag */ delimptr = delims; /* Start at beginning of delim list */ delbuf[0] = 0; /* No squirreled delims */ for (index = 0; (fileptr[index] != ENDLIST) && filecnt; index++) { /* Read a line and immediately output. If it's too * big for the buffer, then dump what was read and go * back for more. * * Otherwise, if it is from the last file, then leave * the carriage return in place; if not, replace with * a delimiter (if any) */ strend = 0; /* Set so can easily detect EOF */ if (fileptr[index] != CLOSED) while (fgets(iobuff, (_MAXSZ - 1), fileptr[index]) != NULL) { strend = strlen(iobuff);/* Did the buf fill? */ if (strend == (_MAXSZ - 1)) { /* Gosh, what a long line. */ fputs(iobuff, stdout); strend = 0; continue; } /* Ok got whole line in buffer. */ break; /* Out of loop for this file */ } /* Ended either on an EOF (well, actually NULL * return-- it *could* be some sort of file error, * but but if the file was opened successfully, this * is unlikely. Besides, error checking on streams * doesn't allow us to decide exactly what went * wrong, so I'm going to be very Unix-like and * ignore it!), or a closed file, or a received line. * If an EOF, close the file and mark it in the list. * In any case, output the delimiter of choice. */ if (!strend) { if (fileptr[index] != CLOSED) { fclose(fileptr[index]); fileptr[index] = CLOSED; filecnt--; } /* Is this the end of the whole thing? */ if ((fileptr[index + 1] P��P��P��P��P��P������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������== ENDLIST) && !somedone) continue; /* EXITS */ /* Ok, some files not closed this line. Last file? */ if (fileptr[index + 1] == ENDLIST) { if (delbuf[0]) { fputs(&delbuf[1], stdout); delbuf[0] = 0; } putc((int) NL, stdout); continue; /* Next read of files */ } else { /* Closed file; setup delim */ if (*delimptr != DEL) { delbuf[0]++; delbuf[delbuf[0]] = *delimptr++; delbuf[delbuf[0] + 1] = '\0'; } else delimptr++; } /* Reset end of delimiter string if necessary */ if (*delimptr == '\0') delimptr = delims; } else { /* Some data read. */ somedone++; /* Any saved delims? */ if (delbuf[0]) { fputs(&delbuf[1], stdout); delbuf[0] = 0; } /* If last file, last char will be NL. */ if (fileptr[index + 1] != ENDLIST) { if (*delimptr == DEL) { delimptr++; iobuff[strend - 1] = '\0';/* No delim*/ } else iobuff[strend - 1] = *delimptr++; } if (*delimptr == '\0') delimptr = delims; /* Now dump the buffer */ fputs(iobuff, stdout); fflush(stdout); } } } } void doserial(nfiles, fnamptr) int nfiles; char **fnamptr; { /* Do serial paste. Simply scarf characters, performing * one-character buffering to facilitate delim processing. */ register int charnew, charold; register char *delimptr; register FILE *fileptr; for (; nfiles != 0; fnamptr++) { if ((fnamptr[0][0] == '-') && (fnamptr[0][1] != '\0')) { if (fnamptr[0][1] == 'd') fnamptr++; } else { if (fnamptr[0][0] == '-') { fileptr = stdin; } else { fileptr = fopen(*fnamptr, "r"); if (fileptr == NULL) prerr(BADFILE, *fnamptr); } /* The file is open; just keep taking characters, * stashing them in charnew; output charold, * converting to the appropriate delimiter character * if needful. After the EOF, simply output * 'charold' if it's a newline; otherwise, output it * and then a newline. */ delimptr = delims; /* Set up for delimiter string */ if ((charold = getc(fileptr)) == EOF) { /* Empty file! */ putc(NL, stdout); fflush(stdout); continue; /* Go on to the next file */ } /* Ok, 'charold' is set up. Hit it! */ while ((charnew = getc(fileptr)) != EOF) { /* Ok, process the old character */ if (charold == NL) { if (*delimptr != DEL) putc((int) *delimptr++, stdout); /* Reset pointer at end of delimiter string */ if (*delimptr == '\0') delimptr = delims; } else putc(charold, stdout); charold = charnew; } /* Ok, hit EOF. Process that last character */ putc(charold, stdout); if ((char) charold != NL) putc(NL, stdout); fflush(stdout); nfiles--; } } } void delimbuild(strptr) char *strptr; { /* Process the delimiter string into something that can be used by * the routines. This involves, primarily, collapsing the backslash * representations of special characters into their actual values, * and terminating the string in a manner that the routines can * recognize. The set of possible backslash characters has been * expanded beyond that recognized by the vanilla Unix(Tm) version. */ register char *strout; delims = strptr; /* delims now points to argv[...] */ strout = strptr; /* Start at the same place, anyway */ while (*strptr) { if (*strptr != '\\') /* Is it an escape character? */ *strout++ = *strptr++; /* No, just transfer it */ else { strptr++; /* Get past escape character */ switch (*strptr) { case '0': *strout++ = DEL; break; case 't': *strout++ = TAB; break; case 'n': *strout++ = NL; break; case 'b': *strout++ = BS; break; case 'f': *strout++ = FF; break; case 'r': *strout++ = CR; break; case '\\': *strout++ = BACKSLASH; break; default: *strout++ = *strptr; } strptr++; } } *strout = '\0'; /* Heaven forfend that we forget this! */ } void prerr(etype, estring) int etype; char *estring; { switch (etype) { case USAGE: fprintf(stderr, "%s : Usage: %s [-s] [-d <delimiters>] file1 file2 ...\n", cmdnam, cmdnam); break; case NODELIM: fprintf(stderr, "%s : no delimiters\n", cmdnam); break; case BADFILE: fprintf(stderr, "%s : %s : cannot open\n", cmdnam, estring); break; case TOOMANY: fprintf(stderr, "%s : too many files\n", cmdnam); break; } exit(1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ping.c */ #define DEBUG 1 #include <sys/types.h> #include <errno.h> #include <signal.h> #include <net/gen/netdb.h> #include <sys/ioctl.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <net/gen/oneCsum.h> #include <fcntl.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/ip_hdr.h> #include <net/gen/icmp_hdr.h> #include <net/gen/ip_io.h> #define WRITE_SIZE 30 char buffer[16*1024]; int main(int argc, char *argv[]); #if DEBUG #define where() fprintf(stderr, "%s %d:", __FILE__, __LINE__); #endif #if __STDC__ #define PROTO(x,y) x y #else #define PROTO(x,y) X () #endif PROTO (int main, (int argc, char *argv[]) ); static PROTO (void sig_hand, (int signal) ); main(argc, argv) int argc; char *argv[]; { int fd, i; int result, result1; nwio_ipopt_t ipopt; ip_hdr_t *ip_hdr; int ihl; icmp_hdr_t *icmp_hdr; ipaddr_t dst_addr; struct hostent *hostent; int length; if (argc<2 || argc>3) { fprintf(stderr, "Usage: %s hostname [-l length] [-t timeout]\n", argv[0]); exit(1); } hostent= gethostbyname(argv[1]); if (!hostent) { dst_addr= inet_addr(argv[1]); if (dst_addr == -1) { fprintf(stderr, "%s: unknown host (%s)\n", argv[0], argv[1]); exit(1); } } else dst_addr= *(ipaddr_t *)(hostent->h_addr); if (argc == 3) { length= strtol (argv[2], (char **)0, 0); if (length< sizeof(icmp_hdr_t) + IP_MIN_HDR_SIZE) { fprintf(stderr, "%s: length too small (%s)\n", argv[0], argv[2]); exit(1); } } else length= WRITE_SIZE; fd= open ("/dev/ip", O_RDWR); if (fd<0) perror("open"), exit(1); ipopt.nwio_flags= NWIO_COPY | NWIO_PROTOSPEC; ipopt.nwio_proto= 1; result= ioctl (fd, NWIOSIPOPT, &ipopt); if (result<0) perror("ioctl (NWIOSIPOPT)"), exit(1); result= ioctl (fd, NWIOGIPOPT, &ipopt); if (result<0) perror("ioctl (NWIOGIPOPT)"), exit(1); for (i= 0; i< 20; i++) { ip_hdr= (ip_hdr_t *)buffer; ip_hdr->ih_dst= dst_addr; icmp_hdr= (icmp_hdr_t *)(buffer+20); icmp_hdr->ih_type= 8; icmp_hdr->ih_code= 0; icmp_hdr->ih_chksum= 0; icmp_hdr->ih_chksum= ~oneC_sum(0, (u16_t *)icmp_hdr, WRITE_SIZE-20); result= write(fd, buffer, length); if (result<0) { perror("write"); exit(1); } if (result != length) { where(); fprintf(stderr, "result= %d\n", result); exit(1); } alarm(0); signal (SIGALRM, sig_hand); alarm(1); result= read(fd, buffer, sizeof(buffer)); if (result>= 0 || errno != EINTR) break; } if (i >= 20) { printf("no answer from %s\n", argv[1]); exit(1); } if (result<0) { perror ("read"); exit(1); } printf("%s is alive\n", argv[1]); exit(0); } static void sig_hand(signal) int signal; { } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* pr - print files Author: Michiel Huisjes */ /* Pr - print files * * Author: Michiel Huisjes. * Modified: Jacob P. Bunschoten. (30 nov 87) * When "columns" is not given and numbering is on: * line numbers are correlated with input lines. * (try pr [-1] -n file ) * tabs are accounted for. * When numbering is turned on, width know this. * automatic line-folding. -f to get the original program. * backspaces are accounted for. -b to disable this. * multi-column mode changed. * header can be given and used. * format changed may occur between printing of several files: * pr -l30 file1 -w75 file2 * * Modified: Rick Thomas. (Sept 12, 1988) * added "-M" option to cover functionality of old "-n" option, * and made "-n" option behavior compatible with system V. * * Usage: pr [+page] [-columns] [-h header] [-wwidth] [-llength] [-ntm] [files] * -t : Do not print the 5 line header and trailer at the page. * -n : Turn on line numbering. * -M : Use "Minix" style line numbering -- Each page begins at * a line number that is an even multiple of the page length. * Like the listings in Appendix E of the book. * +page : Start printing at page n. * -columns : Print files in n-columns. * -l length: Take the length of the page to be n instead of 66 * -h header: Take next argument as page header. * -w width : Take the width of the page to be n instead of default 79 * -f : do not fold lines. * * Modified: Lars Fredriksen (Jan 19, 1990) * fixed the program so that * pr -n *.c * would work. The clobal variable 'width' was decremented * by NUM_WIDTH, for each file, resulting in width finally * being so small that nothing was printed. Used the local * variable 'w' for the width adjustment (in print()) * * Modified: Kenneth J. Hendrickson (10 April 1991) * date in header should be last modification date for files, * and the current time for stdin. * * Modified: Kees J. Bot (5 October 1992) * Use localtime(3) to get the date, it knows TZ. */ #include <sys/types.h> #include <sys/stat.h> #include <string.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #define DEF_LENGTH 66 #define DEF_WIDTH 79 #define NUM_WIDTH 8 #define TAB_WIDTH 8 /* fixed tab_width */ /* Used to compute next (fixed) tabstop */ #define TO_TAB(x) (( (x) + TAB_WIDTH ) & ~07 ) typedef char BOOL; #define FALSE 0 #define TRUE 1 /* EAT: eat rest of input line */ #define EAT(fp) while((c=getc(fp))!='\n' && c!=EOF) /* L_BUF: calculate address of pointer to char (string) used in format */ #define L_BUF(i,j) * (char **) (line_buf + (i + j*length)*sizeof(char *)) char *header; BOOL no_header; BOOL number = FALSE; BOOL minix_number = FALSE; BOOL ext_header_set = FALSE; /* external header given */ BOOL back_space = TRUE; /* back space correction in line width */ BOOL dont_fold = FALSE; /* original. If the line does not fit eat it. */ short columns; short cwidth; short start_page = 1; short width = DEF_WIDTH; short length = DEF_LENGTH; short linenr; char *line_buf; /* used in format for multi-column output */ char output[1024]; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(static char *myalloc, (size_t size)); _PROTOTYPE(char skip_page, (int lines, int width, FILE * filep)); _PROTOTYPE(void format, (FILE * filep)); _PROTOTYPE(void print_page, (int pagenr, int maxcol)); _PROTOTYPE(void print, (FILE * filep)); _PROTOTYPE(void out_header, (int page)); _PROTOTYPE(void print_time, (time_t t)); int main(argc, argv) int argc; char *argv[]; { FILE *file; char *ptr; int index = 1; /* index is one ahead of argc */ int line, col; setbuf(stdout, output); do { if (argc == index) /* No arguments (left) */ goto pr_files; ptr = argv[index++]; if (*ptr == '+') { start_page = atoi(++ptr); continue; } if (*ptr != '-') { /* no flags */ index--; goto pr_files; } if (*++ptr >= '0' && *ptr <= '9') { columns = atoi(ptr); if (columns <= 0) columns = 1; continue; /* Fetch next flag */ } while (*ptr) switch (*ptr++) { case 't': no_header = TRUE; break; case 'n': number = TRUE; minix_number = FALSE; break; case 'M': number = TRUE; minix_number = TRUE; break; case 'h': header = argv[index++]; ext_header_set = TRUE; break; case 'w': if ((width = atoi(ptr)) <= 0) width = DEF_WIDTH; *ptr = '\0'; break; case 'l': if ((length = atoi(ptr)) <= 0) length = DEF_LENGTH; *ptr = '\0'; break; case 'b': /* back_space correction off */ back_space = FALSE; break; case 'f': /* do not fold lines */ dont_fold = TRUE; break; default: fprintf(stderr, "Usage: %s [+page] [-columns] [-h header] [-w<width>] [-l<length>] [-nMt] [files]\n", argv[0]); exit(1); } continue; /* Scan for next flags */ /* ============== flags are read. Print the file(s) ========= */ pr_files: if (!no_header) length -= 10; if (columns) { cwidth = width / columns + 1; if (columns > width) { fprintf(stderr, "Too many columns for page width.\n"); exit(1); } /* Allocate piece of mem to hold some pointers */ line_buf = myalloc(length * columns * sizeof(char *)); } for (line = 0; line < length; line++) for (col = 0; col < columns; col++) L_BUF(line, col) = NULL; if (length <= 0) { fprintf(stderr, "Minimal length should be %d\n", no_header ? 1 : 11); exit(1); } while (index <= argc) { /* print all files, including stdin */ if (index < argc && (*argv[index] == '-' || *argv[index] == '+')) break; /* Format change */ if (argc == index) { /* no file specified, so stdin */ if (!ext_header_set) header = ""; file = stdin; } else { if ((file = fopen(argv[index], "r")) == (FILE *) 0) { fprintf(stderr, "Cannot open %s\n", argv[index++]); continue; } if (!ext_header_set) header = argv[index]; } if (columns) format(file); else print(file); fclose(file); if (++index >= argc) break; /* all files (including stdin) done */ } if (index >= argc) break; /* When control comes here. format changes are to be done. * reinitialize some variables */ if (!no_header) length += 10; start_page = 1; ext_header_set = FALSE; if (columns) free(line_buf); } while (index <= argc); /* "pr -l60" should work too */ (void) fflush(stdout); return(0); } char skip_page(lines, width, filep) int lines, width; FILE *filep; { short c; int char_cnt; int w; do { w = width; if (number) /* first lines are shorter */ if (!columns || /* called from print(file) */ !(lines % columns)) /* called from format(file) */ w -= NUM_WIDTH; char_cnt = 0; while ((c = getc(filep)) != '\n' && c != EOF && char_cnt < w) { /* Calculate if this line is longer than "width (w)" * characters */ if (c == '\b' && back_space) { if (--char_cnt < 0) char_cnt = 0; } else if (c == '\t') char_cnt = TO_TAB(char_cnt); else char_cnt++; } if (dont_fold && c != '\n' && c != EOF) EAT(filep); lines--; if (c == '\n') linenr++; } while (lines > 0 && c != EOF); return c; /* last char read */ } void format(filep) FILE *filep; { char buf[512]; short c = '\0'; short index, lines, i; short page_number = 0; short maxcol = columns; short wdth; short line, col; do { /* Check printing of page */ page_number++; if (page_number < start_page && c != EOF) { c = (char) skip_page(columns * length, cwidth, filep); continue; } if (c == EOF) return; lines = columns * length; for (line = 0; line < length; line++) for (col = 0; col < columns; col++) { if (L_BUF(line, col) != NULL) free(L_BUF(line, col)); L_BUF(line, col) = (char *) NULL; } line = 0; col = 0; do { index = 0; wdth = cwidth - 1; if (number && !col) /* need room for numbers */ wdth -= NUM_WIDTH; /* Intermidiate colums are shortened by 1 char */ /* Last column not */ if (col + 1 == columns) wdth++; for (i = 0; i < wdth - 1; i++) { c = getc(filep); if (c == '\n' || c == EOF) break; if (c == '\b' && back_space) { buf[index++] = '\b'; if (--i < 0) { /* just P��P��P��P��P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������in case ... */ i = 0; index = 0; } } else if (c == '\t') { int cnt, max; max = TO_TAB(i); for (cnt = i; cnt < max; cnt++) buf[index++] = ' '; i = max - 1; } else buf[index++] = (char) c; } buf[index++] = '\0'; /* Collected enough chars (or eoln, or EOF) */ /* First char is EOF */ if (i == 0 && lines == columns * length && c == EOF) return; /* Alloc mem to hold this (sub) string */ L_BUF(line, col) = myalloc(index * sizeof(char)); strcpy(L_BUF(line, col), buf); line++; line %= length; if (line == 0) { col++; col %= columns; } if (dont_fold && c != '\n' && c != EOF) EAT(filep); lines--; /* line ready for output */ if (c == EOF) { maxcol = columns - lines / length; } } while (c != EOF && lines); print_page(page_number, maxcol); } while (c != EOF); } void print_page(pagenr, maxcol) short pagenr, maxcol; { short pad, i, j; short width; char *p; if (minix_number) linenr = (pagenr - 1) * length + 1; else linenr = 1; if (!no_header) out_header(pagenr); for (i = 0; i < length; i++) { for (j = 0; j < maxcol; j++) { width = cwidth; if (number && j == 0) { /* first columns */ printf("%7.7d ", linenr++); /* 7 == NUM_WIDTH-1 */ width -= NUM_WIDTH; } pad = 0; if (p = (char *) L_BUF(i, j)) for (; pad < width - 1 && *p; pad++) putchar(*p++); if (j < maxcol - 1) while (pad++ < width - 1) putchar(' '); } putchar('\n'); } if (!no_header) printf("\n\n\n\n\n"); } void print(filep) FILE *filep; { short c = '\0'; short page_number = 0; short lines; short cnt; short w = width; BOOL pr_number = TRUE; /* only real lines are numbered, not folded * parts */ linenr = 1; if (number) w -= NUM_WIDTH; do { /* Check printing of page */ page_number++; if (page_number < start_page && c != EOF) { pr_number = FALSE; c = skip_page(length, w, filep); if (c == '\n') pr_number = TRUE; continue; } if (c == EOF) return; if (minix_number) linenr = (page_number - 1) * length + 1; if (page_number == start_page) c = getc(filep); /* Print the page */ lines = length; while (lines && c != EOF) { if (lines == length && !no_header) out_header(page_number); if (number) if (pr_number) printf("%7.7d ", linenr++); /* 7 == NUM_WIDTH-1 */ else printf("%7c ", ' '); /* 7 == NUM_WIDTH-1 */ pr_number = FALSE; cnt = 0; while (c != '\n' && c != EOF && cnt < w) { if (c == '\t') { int i, max; max = TO_TAB(cnt); for (i = cnt; i < max; i++) putchar(' '); cnt = max - 1; } else if (c == '\b' && back_space) { putchar('\b'); cnt--; } else putchar(c); c = getc(filep); cnt++; } putchar('\n'); if (dont_fold && c != '\n' && c != EOF) EAT(filep); lines--; if (c == '\n') { c = getc(filep); pr_number = TRUE; } } if (lines == length) /* We never printed anything on this * page -- */ return; /* even the header, so dont try to fill it up */ if (!no_header) /* print the trailer -- 5 blank lines */ printf("\n\n\n\n\n"); } while (c != EOF); /* Fill last page */ if (page_number >= start_page) { while (lines--) putchar('\n'); } } static char *myalloc(size) size_t size; /* How many bytes */ { void *ptr; ptr = malloc(size); if (ptr == NULL) { fprintf(stderr, "malloc returned NULL\n"); exit(1); } return(char *) ptr; } void out_header(page) short page; { time_t t; struct stat buf; if (strlen(header)) { stat(header, &buf); /* use last modify time for file */ t = buf.st_mtime; } else (void) time(&t); /* use current time for stdin */ print_time(t); printf(" %s Page %d\n\n\n", header, page); } char *moname[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; /* Print the date. */ void print_time(t) time_t t; { struct tm *tm; tm = localtime(&t); printf("\n\n%s %2d %2d:%02d %d", moname[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, 1900 + tm->tm_year ); } ���������������������������/* vmd/cmd/simple/pr_routes.c */ #define _POSIX_C_SOURCE 2 #include <sys/types.h> #include <sys/ioctl.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/ip_io.h> #include <net/gen/route.h> #include <net/gen/netdb.h> #include <net/gen/inet.h> char *prog_name; int all_devices; static void print_header(void); static void print_route(nwio_route_t *route); static void usage(void); int main(int argc, char *argv[]) { int nr_routes, i; nwio_route_t route; nwio_ipconf_t ip_conf; unsigned long ioctl_cmd; int ip_fd; int result; int c; char *ip_device; int a_flag, i_flag, o_flag; char *I_arg; prog_name= argv[0]; a_flag= 0; i_flag= 0; o_flag= 0; I_arg= NULL; while ((c =getopt(argc, argv, "?aI:io")) != -1) { switch(c) { case '?': usage(); case 'a': if (a_flag) usage(); a_flag= 1; break; case 'I': if (I_arg) usage(); I_arg= optarg; break; case 'i': if (i_flag || o_flag) usage(); i_flag= 1; break; case 'o': if (i_flag || o_flag) usage(); o_flag= 1; break; default: fprintf(stderr, "%s: getopt failed: '%c'\n", prog_name, c); exit(1); } } if (optind != argc) usage(); ip_device= I_arg; all_devices= a_flag; if (i_flag) ioctl_cmd= NWIOGIPIROUTE; else ioctl_cmd= NWIOGIPOROUTE; if (ip_device == NULL) ip_device= getenv("IP_DEVICE"); if (ip_device == NULL) ip_device= IP_DEVICE; ip_fd= open(ip_device, O_RDONLY); if (ip_fd == -1) { fprintf(stderr, "%s: unable to open %s: %s\n", prog_name, ip_device, strerror(errno)); exit(1); } result= ioctl(ip_fd, NWIOGIPCONF, &ip_conf); if (result == -1) { fprintf(stderr, "%s: unable to NWIOIPGCONF: %s\n", prog_name, strerror(errno)); exit(1); } route.nwr_ent_no= 0; result= ioctl(ip_fd, ioctl_cmd, &route); if (result == -1) { fprintf(stderr, "%s: unable to NWIOGIPxROUTE: %s\n", prog_name, strerror(errno)); exit(1); } print_header(); nr_routes= route.nwr_ent_count; for (i= 0; i<nr_routes; i++) { route.nwr_ent_no= i; result= ioctl(ip_fd, ioctl_cmd, &route); if (result == -1) { fprintf(stderr, "%s: unable to NWIOGIPxROUTE: %s\n", prog_name, strerror(errno)); exit(1); } if (all_devices || route.nwr_ifaddr == ip_conf.nwic_ipaddr) print_route(&route); } exit(0); } int ent_width= 5; int if_width= 15; int dest_width= 18; int gateway_width= 15; int dist_width= 4; int pref_width= 5; int mtu_width= 4; static void print_header(void) { printf("%*s ", ent_width, "ent #"); printf("%*s ", if_width, "if"); printf("%*s ", dest_width, "dest"); printf("%*s ", gateway_width, "gateway"); printf("%*s ", dist_width, "dist"); printf("%*s ", pref_width, "pref"); printf("%*s ", mtu_width, "mtu"); printf("%s", "flags"); printf("\n"); } static char *cidr2a(ipaddr_t addr, ipaddr_t mask) { ipaddr_t testmask= 0xFFFFFFFF; int n; static char result[sizeof("255.255.255.255/255.255.255.255")]; for (n= 32; n >= 0; n--) { if (mask == htonl(testmask)) break; testmask= (testmask << 1) & 0xFFFFFFFF; } sprintf(result, "%s/%-2d", inet_ntoa(addr), n); if (n == -1) strcpy(strchr(result, '/')+1, inet_ntoa(mask)); return result; } static void print_route(nwio_route_t *route) { if (!(route->nwr_flags & NWRF_INUSE)) return; printf("%*lu ", ent_width, (unsigned long) route->nwr_ent_no); printf("%*s ", if_width, inet_ntoa(route->nwr_ifaddr)); printf("%*s ", dest_width, cidr2a(route->nwr_dest, route->nwr_netmask)); printf("%*s ", gateway_width, inet_ntoa(route->nwr_gateway)); printf("%*lu ", dist_width, (unsigned long) route->nwr_dist); printf("%*ld", pref_width, (long) route->nwr_pref); printf("%*lu", mtu_width, (long) route->nwr_mtu); if (route->nwr_flags & NWRF_STATIC) printf(" static"); if (route->nwr_flags & NWRF_UNREACHABLE) printf(" dead"); printf("\n"); } static void usage(void) { fprintf(stderr, "Usage: %s [-i|-o] [ -a ] [ -I <ip-device> ]\n", prog_name); exit(1); } /* * $PchId: pr_routes.c,v 1.7 2001/04/20 10:44:27 philip Exp $ */ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* prep - prepare file for statistics Author: Andy Tanenbaum */ #include <ctype.h> #include <stdlib.h> #include <stdio.h> #define TROFF_CHAR '.' /* troff commands begin with this char */ #define EOL '\n' /* end of line char */ #define APOSTROPHE 047 /* single quote */ #define BACKSLASH '\\' /* troff code */ int lfread; /* set when last char read was lf */ int lfwritten = 1; /* set when last char written was lf */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void skipline, (void)); _PROTOTYPE(int backslash, (void)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { int c; if (argc > 2) usage(); if (argc == 2) { if (freopen(argv[1], "r", stdin) == NULL) { printf("prep: cannot open %s\n", argv[1]); exit(1); } } while ((c = getchar()) != EOF) { /* Lines beginning with "." are troff commands -- skip them. */ if (lfread && c == TROFF_CHAR) { skipline(); continue; } while (c == BACKSLASH) c = backslash(); /* eat troff stuff */ if (isupper(c)) { putchar(tolower(c)); lfwritten = 0; lfread = 0; continue; } if (islower(c)) { putchar(c); lfwritten = 0; lfread = 0; continue; } if (c == APOSTROPHE) { putchar(c); lfwritten = 0; lfread = 0; continue; } lfread = (c == EOL ? 1 : 0); if (lfwritten) continue; putchar(EOL); lfwritten = 1; } return(0); } void skipline() { char c; while ((c = getchar()) != EOL); } int backslash() { /* A backslash has been seen. Eat troff stuff. */ int c, c1, c2; c = getchar(); switch (c) { case 'f': c = getchar(); c = getchar(); return(c); case 's': /* \s7 or \s14 */ c = getchar(); c = getchar(); if (isdigit(c)) c = getchar(); return(c); case 'n': /* \na or \n(xx */ c = getchar(); if (c == '(') { c = getchar(); c = getchar(); } c = getchar(); return(c); case '*': /* / * (XX */ c = getchar(); if (c == '(') { c = getchar(); c = getchar(); c = getchar(); return(c); } case '(': /* troff 4-character escape sequence */ c1 = getchar(); c2 = getchar(); if (c1 == 'e' && c2 == 'm') return(' '); if (c1 == 'e' && c2 == 'n') return(' '); c = getchar(); return(c); case '%': /* soft hyphen: \% */ c = getchar(); return(c); default: return(c); } } void usage() { printf("Usage: prep [file]\n"); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* printroot - print root device on stdout Author: Bruce Evans */ /* This program figures out what the root device is by doing a stat on it, and * then searching /dev until it finds an entry with the same device number. * A typical use (probably the only use) is in /etc/rc for initializing * /etc/mtab, as follows: * * /usr/bin/printroot >/etc/mtab * * 9 Dec 1989 - clean up for 1.5 - full prototypes (BDE) * 15 Oct 1989 - avoid ACK cc bugs (BDE): * - sizeof "foo" is 2 (from wrong type char *) instead of 4 * - char foo[10] = "bar"; allocates 4 bytes instead of 10 * 1 Oct 1989 - Minor changes by Andy Tanenbaum * 5 Oct 1992 - Use readdir (kjb) * 26 Nov 1994 - Flag -r: print just the root device (kjb) */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> #include <dirent.h> static char DEV_PATH[] = "/dev/"; /* #define would step on sizeof bug */ static char MESSAGE[] = " / "; /* ditto */ #define UNKNOWN_DEV "/dev/unknown" #define ROOT "/" int rflag; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void done, (char *name, int status)); int main(argc, argv) int argc; char **argv; { DIR *dp; struct dirent *entry; struct stat filestat, rootstat; static char namebuf[sizeof DEV_PATH + NAME_MAX]; rflag = (argc > 1 && strcmp(argv[1], "-r") == 0); if (stat(ROOT, &rootstat) == 0 && (dp = opendir(DEV_PATH)) != (DIR *) NULL) { while ((entry = readdir(dp)) != (struct dirent *) NULL) { strcpy(namebuf, DEV_PATH); strcat(namebuf, entry->d_name); if (stat(namebuf, &filestat) != 0) continue; if ((filestat.st_mode & S_IFMT) != S_IFBLK) continue; if (filestat.st_rdev != rootstat.st_dev) continue; done(namebuf, 0); } } done(UNKNOWN_DEV, 1); return(0); /* not reached */ } void done(name, status) char *name; int status; { int v; write(1, name, strlen(name)); if (rflag) { write(1, "\n", 1); exit(status); } write(1, MESSAGE, sizeof MESSAGE - 1); v = fsversion(name, "printroot"); /* determine file system version */ if (v == 1) write(1, "1 rw\n", 5); else if (v == 2) write(1, "2 rw\n", 5); else write(1, "0 rw\n", 5); exit(status); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* proto - Generate ANSI C prototypes. Author: Eric R. Smith */ /* Program to extract function declarations from C source code * Written by Eric R. Smith and placed in the public domain * Thanks are due to Jwahar R. Bammi for fixing several bugs * And providing the Unix makefiles. */ #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #include <string.h> #include <ctype.h> #include <stdlib.h> #include <stdio.h> #define ISCSYM(x) ((x) > 0 && (isalnum(x) || (x) == '_' )) #define ABORTED ( (Word *) -1 ) #define MAXPARAM 20 /* max. number of parameters to a function */ typedef struct word { struct word *next; char string[1]; } Word; int inquote = 0; /* in a quote? */ int newline_seen = 1; /* are we at the start of a line */ long linenum = 1L; /* line number in current file */ long endline = 0L; /* the last line before the { of a f'n */ long symline = 0L; /* Line that symbol was on, set by getsym() */ int dostatic = 0; /* do static functions? */ int donum = 0; /* print line numbers? */ int dohead = 1; /* do file headers? */ int docond = 1; /* conditionalize for non-ANSI compilers? */ int dodiff = 0; /* Output a diff file to prototype original */ int doold = 0; /* do old style: P() */ int glastc = ' '; /* last char. seen by getsym() */ Word *endlist; /* Parentheses after the parameters */ char *progname; /* name of program (for error messages) */ _PROTOTYPE(Word * word_alloc, (char *s)); _PROTOTYPE(void word_free, (Word * w)); _PROTOTYPE(int List_len, (Word * w)); _PROTOTYPE(Word * word_append, (Word * w1, Word * w2)); _PROTOTYPE(int foundin, (Word * w1, Word * w2)); _PROTOTYPE(void addword, (Word * w, char *s)); _PROTOTYPE(void printlist, (Word * p)); _PROTOTYPE(Word * typelist, (Word * p)); _PROTOTYPE(void typefixhack, (Word * w)); _PROTOTYPE(int ngetc, (FILE * f)); _PROTOTYPE(int fnextch, (FILE * f)); _PROTOTYPE(int nextch, (FILE * f)); _PROTOTYPE(int getsym, (char *buf, FILE * f)); _PROTOTYPE(int skipit, (char *buf, FILE * f)); _PROTOTYPE(Word * getparamlist, (FILE * f)); _PROTOTYPE(void emit, (Word * wlist, Word * plist, long startline)); _PROTOTYPE(void getdecl, (FILE * f)); _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Usage, (void)); /* Routines for manipulating lists of words. */ Word *word_alloc(s) char *s; { Word *w; w = (Word *) malloc(sizeof(Word) + strlen(s) + 1); if (w == NULL) { fprintf(stderr, "%s: out of memory\n", progname); exit(1); } (void) strcpy(w->string, s); w->next = NULL; return w; } void word_free(w) Word *w; { Word *oldw; while (w) { oldw = w; w = w->next; free((char *) oldw); } } /* Return the length of a list; empty words are not counted */ int List_len(w) Word *w; { int count = 0; while (w) { if (*w->string) count++; w = w->next; } return count; } /* Append two lists, and return the result */ Word *word_append(w1, w2) Word *w1, *w2; { Word *r, *w; r = w = word_alloc(""); while (w1) { w->next = word_alloc(w1->string); w = w->next; w1 = w1->next; } while (w2) { w->next = word_alloc(w2->string); w = w->next; w2 = w2->next; } return r; } /* See if the last entry in w2 is in w1 */ int foundin(w1, w2) Word *w1, *w2; { while (w2->next) w2 = w2->next; while (w1) { if (!strcmp(w1->string, w2->string)) return 1; w1 = w1->next; } return 0; } /* Add the string s to the given list of words */ void addword(w, s) Word *w; char *s; { while (w->next) w = w->next; w->next = word_alloc(s); } /* Printlist: print out a list */ void printlist(p) Word *p; { Word *w; int i = 0; for (w = p; w; w = w->next) { printf("%s", w->string); if (ISCSYM(w->string[0]) && i > 0 && w->next && w->next->string[0] != ',') printf(" "); i++; } } /* Given a list representing a type and a variable name, extract just * the base type, e.g. "struct word *x" would yield "struct word". * Similarly, "unsigned char x[]" would yield "unsigned char". */ Word *typelist(p) Word *p; { Word *w, *r, *last; last = r = w = word_alloc(""); while (p && p->next) { if (p->string[0] == '[') { word_free(w); last->next = NULL; break; } if (p->string[0] && !ISCSYM(p->string[0])) break; w->next = word_alloc(p->string); last = w; w = w->next; p = p->next; } return r; } /* Typefixhack: promote formal parameters of type "char", "unsigned char", * "short", or "unsigned short" to "int". */ void typefixhack(w) Word *w; { Word *oldw = 0; while (w) { if (*w->string) { if ((!strcmp(w->string, "char") || !strcmp(w->string, "short")) && (List_len(w->next) < 2)) { if (oldw && !strcmp(oldw->string, "unsigned")) { oldw->next = w->next; free((char *) w); w = oldw; } (void) strcpy(w->string, "int"); } } w = w->next; } } /* Read a character: if it's a newline, increment the line count */ int ngetc(f) FILE *f; { int c; c = getc(f); if (c == '\n') linenum++; return c; } /* Read the next character from the file. If the character is '\' then * read and skip the next character. Any comment sequence is converted * to a blank. */ int fnextch(f) FILE *f; { int c, lastc, incomment; c = ngetc(f); while (c == '\\') { c = ngetc(f); /* skip a character */ c = ngetc(f); } if (c == '/' && !inquote) { c = ngetc(f); if (c == '*') { incomment = 1; c = ' '; while (incomment) { lastc = c; c = ngetc(f); if (lastc == '*' && c == '/') incomment = 0; else if (c < 0) return c; } return fnextch(f); } else { if (c == '\n') linenum--; (void) ungetc(c, f); return '/'; } } return c; } /* Get the next "interesting" character. Comments are skipped, and strings * are converted to "0". Also, if a line starts with "#" it is skipped. */ int nextch(f) FILE *f; { int c; c = fnextch(f); if (newline_seen && c == '#') { do { c = fnextch(f); } while (c >= 0 && c != '\n'); if (c < 0) return c; } newline_seen = (c == '\n'); if (c == '\'' || c == '\"') { inquote = c; while ((c = fnextch(f)) >= 0) { if (c == inquote) { inquote = 0; return '0'; } } } return c; } /* Get the next symbol from the file, skipping blanks. * Return 0 if OK, -1 for EOF. * Also collapses everything between { and } */ int getsym(buf, f) char *buf; FILE *f; { register int c; int inbrack = 0; c = glastc; while ((c > 0) && isspace(c)) c = nextch(f); if (c < 0) return -1; if (c == '{') { inbrack = 1; endline = linenum; while (inbrack) { c = nextch(f); if (c < 0) { glastc = c; return c; } if (c == '{') inbrack++; else if (c == '}') inbrack--; } (void) strcpy(buf, "{}"); glastc = nextch(f); return 0; } if (!ISCSYM(c)) { *buf++ = c; glastc = nextch(f); if (c == '(' && glastc == '*') { /* Look for a 'f'n pointer */ *buf++ = glastc; glastc = nextch(f); } *buf = 0; return 0; } symline = linenum; while (ISCSYM(c)) { *buf++ = c; c = nextch(f); } *buf = 0; glastc = c; return 0; } /* Skipit: skip until a ";" or the end of a function declaration is seen */ int skipit(buf, f) char *buf; FILE *f; { int i; do { i = getsym(buf, f); if (i < 0) return i; } while (*buf != ';' && *buf != '{'); return 0; } /* Get a parameter list; when this is called the next symbol in line * should be the first thing in the list. */ Word *getparamlist(f) FILE *f; { static Word *pname[MAXPARAM]; /* parameter names */ Word *tlist, /* type name */ *plist; /* temporary */ int np = 0; /* number of parameters */ int typed[MAXPARAM]; /* parameter has been given a type */ int tlistdone; /* finished finding the type name */ int sawsomething; int i; int inparen = 0; char buf[80]; for (i = 0; i < MAXPARAM; i++) typed[i] = 0; plist = word_alloc(""); endlist = word_alloc(""); /* First, get the stuff inside brackets (if anything) */ sawsomething = 0; /* gets set nonzero when we see an arg */ for (;;) { if (getsym(buf, f) < 0) return(NULL); if (*buf == ')' && (--inparen < 0)) { if (sawsomething) { /* if we've seen an arg */ pname[np] = plist; plist = word_alloc(""); np++; } break; } if (*buf == ';') { /* something weird */ return ABOP��P��P��P��P��P��P��P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������RTED; } sawsomething = 1; /* there's something in the arg. list */ if (*buf == ',' && inparen == 0) { pname[np] = plist; plist = word_alloc(""); np++; } else { addword(plist, buf); if (*buf == '(') inparen++; } } /* Next, get the declarations after the function header */ inparen = 0; tlist = word_alloc(""); plist = word_alloc(""); tlistdone = 0; sawsomething = 0; for (;;) { if (getsym(buf, f) < 0) return(NULL); /* Handle parentheses, which should indicate func pointer rtn values */ if (*buf == '(') { addword(endlist, buf); addword(endlist, " void "); inparen++; } else if (*buf == ')') { if (symline == linenum) { addword(endlist, buf); addword(endlist, buf); } inparen--; } else if (*buf == ',' && !inparen) { /* Handle a list like "int x,y,z" */ if (!sawsomething) return(NULL); for (i = 0; i < np; i++) { if (!typed[i] && foundin(plist, pname[i])) { typed[i] = 1; word_free(pname[i]); pname[i] = word_append(tlist, plist); /* Promote types */ typefixhack(pname[i]); break; } } if (!tlistdone) { tlist = typelist(plist); tlistdone = 1; } word_free(plist); plist = word_alloc(""); } else if (*buf == ';') { /* Handle the end of a list */ if (!sawsomething) return ABORTED; for (i = 0; i < np; i++) { if (!typed[i] && foundin(plist, pname[i])) { typed[i] = 1; word_free(pname[i]); pname[i] = word_append(tlist, plist); typefixhack(pname[i]); break; } } tlistdone = 0; word_free(tlist); word_free(plist); tlist = word_alloc(""); plist = word_alloc(""); } else if (!strcmp(buf, "{}")) break; /* Handle the beginning of the function */ /* Otherwise, throw word into list (except for "register") */ else if (strcmp(buf, "register")) { sawsomething = 1; addword(plist, buf); if (*buf == '(') inparen++; if (*buf == ')') inparen--; } } /* Now take the info we have and build a prototype list */ /* Empty parameter list means "void" */ if (np == 0) return word_alloc("void"); plist = tlist = word_alloc(""); for (i = 0; i < np; i++) { /* If no type provided, make it an "int" */ if (!(pname[i]->next) || (!(pname[i]->next->next)&&strcmp(pname[i]->next->string,"void"))) { addword(tlist, "int"); } while (tlist->next) tlist = tlist->next; tlist->next = pname[i]; if (i < np - 1) addword(tlist, ", "); } return plist; } /* Emit a function declaration. The attributes and name of the function * are in wlist; the parameters are in plist. */ void emit(wlist, plist, startline) Word *wlist, *plist; long startline; { Word *w; int count = 0; if (doold == 0) printf("_PROTOTYPE( "); if (dodiff) { printf("%lda%ld,%ld\n", startline - 1, startline, startline +2); printf("> #ifdef __STDC__\n> "); } if (donum) printf("/*%8ld */ ", startline); for (w = wlist; w; w = w->next) { if (w->string[0]) count++; } if (count < 2) printf("int "); printlist(wlist); if (docond) { if (doold) printf(" P(("); else printf(", ("); } else { printf("("); } printlist(plist); printlist(endlist); if (docond) { if (doold) printf("))"); else printf(") )"); } else { printf(")"); } if (!dodiff) printf(";\n"); else printf("\n"); if (dodiff) { printf("> #else\n"); printf("%lda%ld\n", endline - 1, endline); printf("> #endif\n"); } } /* Get all the function declarations */ void getdecl(f) FILE *f; { Word *plist, *wlist = NULL; char buf[80]; int sawsomething; long startline = 0L; /* line where declaration started */ int oktoprint; again: /* SHAME SHAME */ word_free(wlist); wlist = word_alloc(""); sawsomething = 0; oktoprint = 1; for (;;) { if (getsym(buf, f) < 0) return; /* Guess when a declaration is not an external function definition */ if (!strcmp(buf, ",") || !strcmp(buf, "{}") || !strcmp(buf, "=") || !strcmp(buf, "typedef") || !strcmp(buf, "extern")) { (void) skipit(buf, f); goto again; } if (!dostatic && !strcmp(buf, "static")) oktoprint = 0; /* For the benefit of compilers that allow "inline" declarations */ if (!strcmp(buf, "inline") && !sawsomething) continue; if (!strcmp(buf, ";")) goto again; /* A left parenthesis *might* indicate a function definition */ if (!strcmp(buf, "(")) { if (!sawsomething || !(plist = getparamlist(f))) { (void) skipit(buf, f); goto again; } if (plist == ABORTED) goto again; /* It seems to have been what we wanted */ if (oktoprint) emit(wlist, plist, startline); word_free(plist); goto again; } addword(wlist, buf); if (!sawsomething) startline = symline; sawsomething = 1; } } int main(argc, argv) int argc; char **argv; { FILE *f, *g; char *t; char newname[40]; progname = argv[0]; argv++; argc--; g = stdout; while (*argv && **argv == '-') { t = *argv++; --argc; t++; while (*t) { if (*t == 's') dostatic = 1; else if (*t == 'n') donum = 1; else if (*t == 'p') docond = 0; else if (*t == 'P') doold =1; else if (*t == 'd') { dodiff = 1; doold = 1; docond = 0; donum = 0; dostatic = 1; } else Usage(); t++; } } if (docond && doold) { printf("#ifdef __STDC__\n"); printf("# define P(args)\targs\n"); printf("#else\n"); printf("# define P(args)\t()\n"); printf("#endif\n\n"); } if (argc == 0) getdecl(stdin); else while (argc > 0 && *argv) { if (!(f = fopen(*argv, "r"))) { perror(*argv); exit(EXIT_FAILURE); } #if 0 if (dodiff) { (void) sprintf(newname, "%sdif", *argv); (void) fclose(g); if (!(g = fopen(newname, "w"))) { perror(newname); exit(EXIT_FAILURE); } } #endif if (doold && dohead && !dodiff) printf("\n/* %s */\n", *argv); linenum = 1; newline_seen = 1; glastc = ' '; getdecl(f); argc--; argv++; (void) fclose(f); } if (docond && doold) printf("\n#undef P\n"); /* clean up namespace */ (void) fclose(g); return(EXIT_SUCCESS); } void Usage() { fputs("Usage: ", stderr); fputs(progname, stderr); fputs(" [-d][-n][-p][-s] [files ...]\n", stderr); fputs(" -P: use P() style instead of _PROTOTYPE\n", stderr); fputs(" -d: produce a diff file to prototype original source\n", stderr); fputs(" -n: put line numbers of declarations as comments\n", stderr); fputs(" -p: don't make header files readable by K&R compilers\n", stderr); fputs(" -s: include declarations for static functions\n", stderr); exit(EXIT_FAILURE); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* pwd - print working directory Author: Norbert Schlenker */ /* * pwd - print working directory * Syntax: pwd * Flags: None. * Author: Norbert Schlenker * Copyright: None. Released to the public domain. * Reference: IEEE P1003.2 Section 4.50 (draft 10) * Bugs: No internationalization support; all messages are in English. */ /* Force visible Posix names */ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif /* External interfaces */ #include <sys/types.h> #include <limits.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> /* Magic numbers suggested or required by Posix specification */ #define SUCCESS 0 /* exit code in case of success */ #define FAILURE 1 /* or failure */ _PROTOTYPE(int main, (void)); static char dir[PATH_MAX + 1]; static char *errmsg = "pwd: cannot search some directory on the path\n"; int main() { char *p; size_t n; p = getcwd(dir, PATH_MAX); if (p == NULL) { write(STDERR_FILENO, errmsg, strlen(errmsg)); exit(FAILURE); } n = strlen(p); p[n] = '\n'; if (write(STDOUT_FILENO, p, n + 1) != n + 1) exit(FAILURE); return(SUCCESS); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* pwdauth 2.0 - check a shadow password Author: Kees J. Bot * 7 Feb 1994 * * This program gets as input the key and salt arguments of the crypt(3) * function as two null terminated strings. The crypt result is output as * one null terminated string. Input and output must be <= 1024 characters. * The exit code will be 1 on any error. * * If the key has the form '##name' then the key will be encrypted and the * result checked to be equal to the encrypted password in the shadow password * file. If equal than '##name' will be returned, otherwise exit code 2. * * Otherwise the key will be encrypted normally and the result returned. * * As a special case, anything matches a null encrypted password to allow * a no-password login. */ #define nil 0 #define crypt CRYPT /* The true crypt is included here. */ #include <sys/types.h> #include <pwd.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #define LEN 1024 char SHADOW[] = "/etc/shadow"; int main(int argc, char **argv) { char key[LEN]; char *salt; struct passwd *pw; int n; /* Read input data. Check if there are exactly two null terminated * strings. */ n= read(0, key, LEN); if (n < 0) return 1; salt = key + n; n = 0; while (salt > key) if (*--salt == 0) n++; if (n != 2) return 1; salt = key + strlen(key) + 1; if (salt[0] == '#' && salt[1] == '#') { /* Get the encrypted password from the shadow password file, * encrypt key and compare. */ setpwfile(SHADOW); if ((pw= getpwnam(salt + 2)) == nil) return 2; /* A null encrypted password matches a null key, otherwise * do the normal crypt(3) authentication check. */ if (*pw->pw_passwd == 0 && *key == 0) { /* fine */ } else if (strcmp(crypt(key, pw->pw_passwd), pw->pw_passwd) != 0) { return 2; } } else { /* Normal encryption. */ if (*salt == 0 && *key == 0) { /* fine */ } else { salt= crypt(key, salt); } } /* Return the (possibly new) salt to the caller. */ if (write(1, salt, strlen(salt) + 1) < 0) return 1; return 0; } /* The one and only crypt(3) function. */ /* From Andy Tanenbaum's book "Computer Networks", rewritten in C */ struct block { unsigned char b_data[64]; }; struct ordering { unsigned char o_data[64]; }; static struct block key; static struct ordering InitialTr = { 58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4, 62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8, 57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3, 61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7, }; static struct ordering FinalTr = { 40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31, 38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29, 36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27, 34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25, }; static struct ordering swap = { 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, }; static struct ordering KeyTr1 = { 57,49,41,33,25,17, 9, 1,58,50,42,34,26,18, 10, 2,59,51,43,35,27,19,11, 3,60,52,44,36, 63,55,47,39,31,23,15, 7,62,54,46,38,30,22, 14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4, }; static struct ordering KeyTr2 = { 14,17,11,24, 1, 5, 3,28,15, 6,21,10, 23,19,12, 4,26, 8,16, 7,27,20,13, 2, 41,52,31,37,47,55,30,40,51,45,33,48, 44,49,39,56,34,53,46,42,50,36,29,32, }; static struct ordering etr = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9,10,11,12,13,12,13,14,15,16,17, 16,17,18,19,20,21,20,21,22,23,24,25, 24,25,26,27,28,29,28,29,30,31,32, 1, }; static struct ordering ptr = { 16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10, 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25, }; static unsigned char s_boxes[8][64] = { { 14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7, 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8, 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13, }, { 15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10, 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5, 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15, 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9, }, { 10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1, 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7, 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12, }, { 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15, 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9, 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4, 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14, }, { 2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9, 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6, 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14, 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3, }, { 12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11, 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8, 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6, 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13, }, { 4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1, 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6, 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2, 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12, }, { 13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7, 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2, 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8, 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11, }, }; static int rots[] = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1, }; static void transpose(struct block *data, struct ordering *t, int n) { struct block x; x = *data; while (n-- > 0) { data->b_data[n] = x.b_data[t->o_data[n] - 1]; } } static void rotate(struct block *key) { unsigned char *p = key->b_data; unsigned char *ep = &(key->b_data[55]); int data0 = key->b_data[0], data28 = key->b_data[28]; while (p++ < ep) *(p-1) = *p; key->b_data[27] = data0; key->b_data[55] = data28; } static struct ordering *EP = &etr; static void f(int i, struct block *key, struct block *a, struct block *x) { struct block e, ikey, y; int k; unsigned char *p, *q, *r; e = *a; transpose(&e, EP, 48); for (k = rots[i]; k; k--) rotate(key); ikey = *key; transpose(&ikey, &KeyTr2, 48); p = &(y.b_data[48]); q = &(e.b_data[48]); r = &(ikey.b_data[48]); while (p > y.b_data) { *--p = *--q ^ *--r; } q = x->b_data; for (k = 0; k < 8; k++) { int xb, r; r = *p++ << 5; r += *p++ << 3; r += *p++ << 2; r += *p++ << 1; r += *p++; r += *p++ << 4; xb = s_boxes[k][r]; *q++ = (xb >> 3) & 1; *q++ = (xb>>2) & 1; *q++ = (xb>>1) & 1; *q++ = (xb & 1); } transpose(x, &ptr, 32); } static void setkey(char *k) { key = *((struct block *) k); transpose(&key, &KeyTr1, 56); } static void encrypt(char *blck, int edflag) { struct block *p = (struct block *) blck; int i; transpose(p, &InitialTr, 64); for (i = 15; i>= 0; i--) { int j = edflag ? i : 15 - i; int k; struct block b, x; b = *p; for (k = 31; k >= 0; k--) { p->b_data[k] = b.b_data[k + 32]; } f(j, &key, p, &x); for (k = 31; k >= 0; k--) { p->b_data[k+32] = b.b_data[k] ^ x.b_data[k]; } } transpose(p, &swap, 64); transpose(p, &FinalTr, 64); } char *crypt(const char *pw, const char *salt) { char pwb[66]; char *cp; static char result[16]; char *p = pwb; struct ordering new_etr; int i; while (*pw && p < &pwb[64]) { int j = 7; while (j--) { *p++ = (*pw >> j) & 01; } pw++; *p++ = 0; } while (p < &pwb[64]) *p++ = 0; setkey(p = pwb); while (p < &pwb[66]) *p++ = 0; new_etr = etr; EP = &new_etr; if (salt[0] == 0 || salt[1] == 0) salt = "**"; for (i = 0; i < 2; i++) { char c = *salt++; int j; result[i] = c; if ( c > 'Z') c -= 6 + 7 + '.'; /* c was a lower case letter */ else if ( c > '9') c -= 7 + '.';/* c was upper case letter */ else c -= '.'; /* c was digit, '.' or '/'. */ /* now, 0 <= c <= 63 */ for (j = 0; j < 6; j++) { if ((c >> j) & 01) { int t = 6*i + j; int temp = new_etr.o_data[t]; new_etr.o_data[t] = new_etr.o_data[t+24]; new_etr.o_data[t+24] = temp; } } } if (result[1] == 0) result[1] = result[0]; for (i = 0; i < 25; i++) encrypt(pwP��P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b,0); EP = &etr; p = pwb; cp = result+2; while (p < &pwb[66]) { int c = 0; int j = 6; while (j--) { c <<= 1; c |= *p++; } c += '.'; /* becomes >= '.' */ if (c > '9') c += 7; /* not in [./0-9], becomes upper */ if (c > 'Z') c += 6; /* not in [A-Z], becomes lower */ *cp++ = c; } *cp = 0; return result; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* rarpd.c Created: Nov 12, 1992 by Philip Homburg Changed: May 13, 1995 by Kees J. Bot Rewrite to handle multiple ethernets. Changed: Jul 18, 1995 by Kees J. Bot Do RARP requests (formerly inet's job) Changed: Dec 14, 1996 by Kees J. Bot Query the netmask Changed: Dec 11, 2000 by Kees J. Bot Dressed down to be only a RARP server, giving the floor to DHCP */ #include <sys/types.h> #include <sys/ioctl.h> #include <errno.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <string.h> #include <unistd.h> #include <sys/asynchio.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/ether.h> #include <net/gen/eth_io.h> #include <net/gen/if_ether.h> #include <net/gen/ip_io.h> #include <net/gen/nameser.h> #define MAX_RARP_RETRIES 5 #define RARP_TIMEOUT 5 typedef struct rarp46 { ether_addr_t a46_dstaddr; ether_addr_t a46_srcaddr; ether_type_t a46_ethtype; u16_t a46_hdr, a46_pro; u8_t a46_hln, a46_pln; u16_t a46_op; ether_addr_t a46_sha; u8_t a46_spa[4]; ether_addr_t a46_tha; u8_t a46_tpa[4]; char a46_padding[ETH_MIN_PACK_SIZE - (4*6 + 2*4 + 4*2 + 2*1)]; } rarp46_t; #define RARP_ETHERNET 1 #define RARP_REQUEST 3 #define RARP_REPLY 4 static char *program; static unsigned debug; #define between(a, c, z) ((unsigned) (c) - (a) <= (unsigned) (z) - (a)) static void report(const char *label) { fprintf(stderr, "%s: %s: %s\n", program, label, strerror(errno)); } static void fatal(const char *label) { report(label); exit(1); } static void *allocate(size_t size) { void *mem; if ((mem= malloc(size)) == NULL) fatal("Can't allocate memory"); return mem; } static char *ethdev(int n) { static char an_ethdev[]= "/dev/ethNNN"; sprintf(an_ethdev + sizeof(an_ethdev)-4, "%d", n); return an_ethdev; } static char *ipdev(int n) { static char an_ipdev[]= "/dev/ipNNN"; sprintf(an_ipdev + sizeof(an_ipdev)-4, "%d", n); return an_ipdev; } typedef struct ethernet { int n; /* Network number. */ int eth_fd; /* Open low level ethernet device. */ ether_addr_t eth_addr; /* Ethernet address of this net. */ char packet[ETH_MAX_PACK_SIZE]; /* Incoming packet. */ ipaddr_t ip_addr; /* IP address of this net. */ ipaddr_t ip_mask; /* Associated netmask. */ } ethernet_t; static ethernet_t *ethernets; static void onsig(int sig) { switch (sig) { case SIGUSR1: debug++; break; case SIGUSR2: debug= 0; break; } } static void rarp_reply(ethernet_t *ep, char *hostname, ipaddr_t ip_addr, ether_addr_t eth_addr) { rarp46_t rarp46; /* Construct a RARP reply packet and send it. */ rarp46.a46_dstaddr= eth_addr; rarp46.a46_hdr= HTONS(RARP_ETHERNET); rarp46.a46_pro= HTONS(ETH_IP_PROTO); rarp46.a46_hln= 6; rarp46.a46_pln= 4; rarp46.a46_op= HTONS(RARP_REPLY); rarp46.a46_sha= ep->eth_addr; memcpy(rarp46.a46_spa, &ep->ip_addr, sizeof(ipaddr_t)); rarp46.a46_tha= eth_addr; memcpy(rarp46.a46_tpa, &ip_addr, sizeof(ipaddr_t)); if (debug >= 1) { printf("%s: Replying %s (%s) to %s\n", ethdev(ep->n), inet_ntoa(ip_addr), hostname, ether_ntoa(ð_addr)); } (void) write(ep->eth_fd, &rarp46, sizeof(rarp46)); } static int addhostname(char *addname, char *hostname, int n) { /* Create an additional hostname for a given hostname by adding "-n" to * the first part. E.g. given "wombat.cs.vu.nl" and n=2 return * "wombat-2.cs.vu.nl". This is useful for VU practical work where * people get a few extra ethernet addresses on a machine and are asked * to build a TCP/IP stack on it. */ char *dot; if (strlen(hostname) + 4 >= 1024) return 0; if ((dot= strchr(hostname, '.')) == NULL) dot= strchr(hostname, 0); sprintf(addname, "%.*s-%d%s", (dot - hostname), hostname, n, dot); return 1; } static void usage(void) { fprintf(stderr, "Usage: %s [-d[level]] network-name ...\n", program); exit(1); } static int ifname2n(const char *name) { /* Translate an interface name, ip0, ip1, etc, to a number. */ const char *np; char *end; unsigned long n; np= name; if (*np++ != 'i' || *np++ != 'p') usage(); n= strtoul(np, &end, 10); if (end == np || *end != 0) usage(); if (n >= 1000) { fprintf(stderr, "%s: Network number of \"%s\" is a bit large\n", program, name); exit(1); } return n; } int main(int argc, char **argv) { int i; ethernet_t *ep; nwio_ethopt_t ethopt; nwio_ethstat_t ethstat; char hostname[1024]; struct hostent *hostent; struct sigaction sa; nwio_ipconf_t ipconf; asynchio_t asyn; ssize_t n; ipaddr_t ip_addr; rarp46_t rarp46; int fd; int n_eths; program= argv[0]; asyn_init(&asyn); debug= 0; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++]+1; if (opt[0] == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'd': debug= 1; if (between('0', *opt, '9')) debug= strtoul(opt, &opt, 10); break; default: usage(); } } if ((n_eths= (argc - i)) == 0) usage(); #if __minix_vmd /* Minix-vmd can handle all nets at once using async I/O. */ ethernets= allocate(n_eths * sizeof(ethernets[0])); for (i= 0; i < n_eths; i++) { ethernets[i].n= ifname2n(argv[argc - n_eths + i]); } #else /* Minix forks n-1 times to handle each net in a process each. */ for (i= 0; i < n_eths; i++) { if (i+1 < n_eths) { switch (fork()) { case -1: fatal("fork()"); case 0: break; default: continue; } } ethernets= allocate(1 * sizeof(ethernets[0])); ethernets[0].n= ifname2n(argv[argc - n_eths + i]); } n_eths= 1; #endif sa.sa_handler= onsig; sigemptyset(&sa.sa_mask); sa.sa_flags= 0; sigaction(SIGUSR1, &sa, NULL); sigaction(SIGUSR2, &sa, NULL); for (i= 0; i < n_eths; i++) { ep= ðernets[i]; if ((ep->eth_fd= open(ethdev(ep->n), O_RDWR)) < 0) fatal(ethdev(ep->n)); if (ioctl(ep->eth_fd, NWIOGETHSTAT, ðstat) < 0) { fprintf(stderr, "%s: %s: Unable to get eth statistics: %s\n", program, ethdev(ep->n), strerror(errno)); exit(1); } ep->eth_addr= ethstat.nwes_addr; if (debug >= 1) { printf("%s: Ethernet address is %s\n", ethdev(ep->n), ether_ntoa(&ep->eth_addr)); } ethopt.nweo_flags= NWEO_COPY | NWEO_EN_LOC | NWEO_EN_BROAD | NWEO_TYPESPEC; ethopt.nweo_type= HTONS(ETH_RARP_PROTO); if (ioctl(ep->eth_fd, NWIOSETHOPT, ðopt) < 0) { fprintf(stderr, "%s: %s: Unable to set eth options: %s\n", program, ethdev(ep->n), strerror(errno)); exit(1); } /* What are my address and netmask? */ if ((fd= open(ipdev(ep->n), O_RDWR)) < 0) fatal(ipdev(ep->n)); if (ioctl(fd, NWIOGIPCONF, &ipconf) < 0) fatal(ipdev(ep->n)); ep->ip_addr= ipconf.nwic_ipaddr; ep->ip_mask= ipconf.nwic_netmask; close(fd); if (debug >= 1) { printf("%s: IP address is %s / ", ipdev(ep->n), inet_ntoa(ep->ip_addr)); printf("%s\n", inet_ntoa(ep->ip_mask)); } } /* Wait for RARP requests, reply, repeat. */ for(;;) { fflush(NULL); /* Wait for a RARP request. */ for (i= 0; i < n_eths; i++) { ep= ðernets[i]; n= asyn_read(&asyn, ep->eth_fd, ep->packet, sizeof(ep->packet)); if (n != -1) break; if (errno != EINPROGRESS) { report(ethdev(ep->n)); sleep(10); } } /* RARP request? */ if (i < n_eths && n >= sizeof(rarp46) && (memcpy(&rarp46, ep->packet, sizeof(rarp46)), 1) && rarp46.a46_hdr == HTONS(RARP_ETHERNET) && rarp46.a46_pro == HTONS(ETH_IP_PROTO) && rarp46.a46_hln == 6 && rarp46.a46_pln == 4 && rarp46.a46_op == HTONS(RARP_REQUEST) ) { if ((ether_ntohost(hostname, &rarp46.a46_tha) == 0 || (rarp46.a46_tha.ea_addr[0] == 'v' && (memcpy(&ip_addr, rarp46.a46_tha.ea_addr+2, 4), 1) && (hostent= gethostbyaddr((char*) &ip_addr, 4, AF_INET)) != NULL && addhostname(hostname, hostent->h_name, rarp46.a46_tha.ea_addr[1]))) && (hostent= gethostbyname(hostname)) != NULL && hostent->h_addrtype == AP��P����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F_INET ) { /* Host is found in the ethers file and the DNS, or the * ethernet address denotes a special additional address * used for implementing a TCP/IP stack in user space. */ for (i= 0; hostent->h_addr_list[i] != NULL; i++) { memcpy(&ip_addr, hostent->h_addr_list[i], sizeof(ipaddr_t)); /* Check if the address is on this network. */ if (((ip_addr ^ ep->ip_addr) & ep->ip_mask) == 0) break; } if (hostent->h_addr_list[i] != NULL) { rarp_reply(ep, hostname, ip_addr, rarp46.a46_tha); } else { if (debug >= 2) { printf("%s: Host '%s' (%s) is on the wrong net\n", ethdev(ep->n), hostname, ether_ntoa(&rarp46.a46_tha)); } } } else { if (debug >= 2) { printf("%s: RARP request from unknown host '%s'\n", ethdev(ep->n), ether_ntoa(&rarp46.a46_tha)); } } } /* Wait for another request. */ if (asyn_wait(&asyn, 0, NULL) < 0) { report("asyn_wait()"); sleep(10); } } } �������������������������������������/* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1983 Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)rcp.c 1.1 87/12/21 SMI"; /* from UCB 5.3 6/8/85"*/ #endif /* not lint */ /* * rcp */ #undef _MINIX #define NAMESERVER #include <ctype.h> #include <errno.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <utime.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/wait.h> #include <dirent.h> #include <fcntl.h> #include <pwd.h> #include <signal.h> #include <unistd.h> #include <net/gen/netdb.h> #include <net/netlib.h> #if __STDC__ #define PROTO(func, args) func args #else #define PROTO(func, args) func () #endif /* __STDC__ */ PROTO (int main, (int argc, char *argv[])); PROTO (void lostconn, (int sig)); PROTO (void error, (char *fmt, ...) ); PROTO (int response, (void) ); PROTO (void source, (int argc, char *argv[]) ); PROTO (void sink, (int argc, char *argv[]) ); PROTO (void usage, (void) ); PROTO (char *colon, (char *cp) ); PROTO (int okname, (char *cp0) ); PROTO (int susystem, (char *s) ); PROTO (void verifydir, (char *cp) ); PROTO (void rsource, (char *name, struct stat *statp) ); PROTO (struct buffer *allocbuf, (struct buffer *bp, int fd, int blksize) ); #define vfork fork int rem; int errs; int errno; int iamremote, targetshouldbedirectory; int iamrecursive; int myuid; /* uid of invoker */ int pflag; struct passwd *pwd; int userid; int port; struct buffer { int cnt; char *buf; }; #define ga() (void) write(rem, "", 1) main(argc, argv) int argc; char **argv; { char *targ, *host, *src; #ifndef NAMESERVER char *suser, *tuser; #else /* NAMESERVER */ char *suser, *tuser, *thost; #endif /* NAMESERVER */ int i; char buf[BUFSIZ], cmd[16]; struct servent *sp; sp = getservbyname("shell", "tcp"); if (sp == NULL) { fprintf(stderr, "rcp: shell/tcp: unknown service\n"); exit(1); } port = sp->s_port; pwd = getpwuid(userid = getuid()); if (pwd == 0) { fprintf(stderr, "who are you?\n"); exit(1); } #ifdef NOT_DEF /* * This is a kludge to allow seteuid to user before touching * files and seteuid root before doing rcmd so we can open * the socket. */ myuid = getuid(); if (setruid(0) < 0) { perror("setruid root"); exit(1); } seteuid(myuid); #endif for (argc--, argv++; argc > 0 && **argv == '-'; argc--, argv++) { (*argv)++; while (**argv) switch (*(*argv)++) { case 'r': iamrecursive++; break; case 'p': /* preserve mtimes and atimes */ pflag++; break; /* The rest of these are not for users. */ case 'd': targetshouldbedirectory = 1; break; case 'f': /* "from" */ iamremote = 1; (void) response(); source(--argc, ++argv); exit(errs); case 't': /* "to" */ iamremote = 1; sink(--argc, ++argv); exit(errs); default: usage(); exit(1); } } if (iamremote) { close(2); open("/dev/tty", 2); } if (argc < 2) { usage(); exit(1); } rem = -1; if (argc > 2) targetshouldbedirectory = 1; (void) sprintf(cmd, "rcp%s%s%s", iamrecursive ? " -r" : "", pflag ? " -p" : "", targetshouldbedirectory ? " -d" : ""); (void) signal(SIGPIPE, lostconn); targ = colon(argv[argc - 1]); if (targ) { /* ... to remote */ *targ++ = 0; if (*targ == 0) targ = "."; #ifndef NAMESERVER tuser = strrchr(argv[argc - 1], '.'); if (tuser) { *tuser++ = 0; if (!okname(tuser)) exit(1); } else tuser = pwd->pw_name; #else /* NAMESERVER */ thost = strchr(argv[argc - 1], '@'); if (thost) { *thost++ = 0; tuser = argv[argc - 1]; if (*tuser == '\0') tuser = pwd->pw_name; else if (!okname(tuser)) exit(1); } else { thost = argv[argc - 1]; tuser = pwd->pw_name; } #endif /* NAMESERVER */ for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src) { /* remote to remote */ *src++ = 0; if (*src == 0) src = "."; #ifndef NAMESERVER suser = strrchr(argv[i], '.'); if (suser) { *suser++ = 0; if (!okname(suser)) #else /* NAMESERVER */ host = strchr(argv[i], '@'); if (host) { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) #endif /* NAMESERVER */ continue; #ifndef NAMESERVER (void) sprintf(buf, "rsh %s -l %s -n %s %s '%s.%s:%s'", argv[i], suser, cmd, src, argv[argc - 1], tuser, targ); } else (void) sprintf(buf, "rsh %s -n %s %s '%s.%s:%s'", argv[i], cmd, src, argv[argc - 1], tuser, targ); #else /* NAMESERVER */ (void) sprintf(buf, "rsh %s -l %s -n %s %s '%s@%s:%s'", host, suser, cmd, src, tuser, thost, targ); } else (void) sprintf(buf, "rsh %s -n %s %s '%s@%s:%s'", argv[i], cmd, src, tuser, thost, targ); #endif /* NAMESERVER */ (void) susystem(buf); } else { /* local to remote */ if (rem == -1) { (void) sprintf(buf, "%s -t %s", cmd, targ); #ifndef NAMESERVER host = argv[argc - 1]; #else /* NAMESERVER */ host = thost; #endif /* NAMESERVER */ #ifdef NOT_DEF if (seteuid(0) < 0) { perror("seteuid root"); exit(1); } #endif rem = rcmd(&host, port, pwd->pw_name, tuser, buf, 0); #ifdef NO_DEF seteuid(myuid); #endif if (rem < 0) exit(1); if (response() < 0) exit(1); } source(1, argv+i); } } } else { /* ... to local */ if (targetshouldbedirectory) verifydir(argv[argc - 1]); for (i = 0; i < argc - 1; i++) { src = colon(argv[i]); if (src == 0) { /* local to local */ (void) sprintf(buf, "cp%s%s %s %s", iamrecursive ? " -r" : "", pflag ? " -p" : "", argv[i], argv[argc - 1]); (void) susystem(buf); } else { /* remote to local */ *src++ = 0; if (*src == 0) src = "."; #ifndef NAMESERVER suser = strrchr(argv[i], '.'); if (suser) { *suser++ = 0; if (!okname(suser)) #else /* NAMESERVER */ host = strchr(argv[i], '@'); if (host) { *host++ = 0; suser = argv[i]; if (*suser == '\0') suser = pwd->pw_name; else if (!okname(suser)) #endif /* NAMESERVER */ continue; #ifndef NAMESERVER } else #else /* NAMESERVER */ } else { host = argv[i]; #endif /* NAMESERVER */ suser = pwd->pw_name; #ifdef NAMESERVER } #endif /* NAMESERVER */ (void) sprintf(buf, "%s -f %s", cmd, src); #ifndef NAMESERVER host = argv[i]; #endif /* NAMESERVER */ #ifdef NOT_DEF if (seteuid(0) < 0) { perror("seteuid root"); exit(1); } #endif rem = rcmd(&host, port, pwd->pw_name, suser, buf, 0); #ifdef NOT_DEF seteuid(myuid); #endif if (rem < 0) { errs++; continue; } sink(1, argv+argc-1); (void) close(rem); rem = -1; } } } exit(errs); } void verifydir(cp) char *cp; { struct stat stb; if (stat(cp, &stb) >= 0) { if ((stb.st_mode & S_IFMT) == S_IFDIR) return; errno = ENOTDIR; } error("rcp: %s: %s.\n", cp, strerror(errno)); exit(1); } char * colon(cp) char *cp; { while (*cp) { if (*cp == ':') return (cp); if (*cp == '/') return (0); cp++; } return (0); } int okname(cp0) char *cp0; { register char *cp = cp0; register int c; do { c = *cp; if (c & 0200) goto bad; if (!isalpha(c) && !isdigit(c) && c != '_' && c != '-') goto bad; cp++; } while (*cp); return (1); bad: fprintf(stderr, "rcp: invalid user name %s\n", cp0); return (0); } int susystem(s) char *s; { int status, pid, w; register void PROTO ((*istat), (int) ), PROTO ((*qstat), (int) ); if ((pid = vfork()) == 0) { #ifdef NOT_DEF (void) setruid(myuid); #endif execl("/bin/sh", "sh", "-c", s, (char *)0); _exit(127); } istat = signal(SIGINT, SIG_IGN); qstat = signal(SIGQUIT, SIG_IGN); while ((w = wait(&status)) != pid && w != -1) ; if (w =P��P��P��P��P��P��P��P��P��P��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������= -1) status = -1; (void) signal(SIGINT, istat); (void) signal(SIGQUIT, qstat); return (status); } void source(argc, argv) int argc; char **argv; { char *last, *name; struct stat stb; static struct buffer buffer; struct buffer *bp; int x, sizerr, f, amt; off_t i; char buf[BUFSIZ]; for (x = 0; x < argc; x++) { name = argv[x]; if ((f = open(name, 0)) < 0) { error("rcp: %s: %s\n", name, strerror(errno)); continue; } if (fstat(f, &stb) < 0) goto notreg; switch (stb.st_mode&S_IFMT) { case S_IFREG: break; case S_IFDIR: if (iamrecursive) { (void) close(f); rsource(name, &stb); continue; } /* fall into ... */ default: notreg: (void) close(f); error("rcp: %s: not a plain file\n", name); continue; } last = strrchr(name, '/'); if (last == 0) last = name; else last++; if (pflag) { /* * Make it compatible with possible future * versions expecting microseconds. */ (void) sprintf(buf, "T%ld 0 %ld 0\n", stb.st_mtime, stb.st_atime); (void) write(rem, buf, strlen(buf)); if (response() < 0) { (void) close(f); continue; } } (void) sprintf(buf, "C%04o %ld %s\n", stb.st_mode&07777, stb.st_size, last); (void) write(rem, buf, strlen(buf)); if (response() < 0) { (void) close(f); continue; } if ((bp = allocbuf(&buffer, f, BUFSIZ)) == 0) { (void) close(f); continue; } sizerr = 0; for (i = 0; i < stb.st_size; i += bp->cnt) { amt = bp->cnt; if (i + amt > stb.st_size) amt = stb.st_size - i; if (sizerr == 0 && read(f, bp->buf, amt) != amt) sizerr = 1; (void) write(rem, bp->buf, amt); } (void) close(f); if (sizerr == 0) ga(); else error("rcp: %s: file changed size\n", name); (void) response(); } } void rsource(name, statp) char *name; struct stat *statp; { DIR *d = opendir(name); char *last; struct dirent *dp; char buf[BUFSIZ]; char *bufv[1]; if (d == 0) { error("rcp: %s: %s\n", name, strerror(errno)); return; } last = strrchr(name, '/'); if (last == 0) last = name; else last++; if (pflag) { (void) sprintf(buf, "T%ld 0 %ld 0\n", statp->st_mtime, statp->st_atime); (void) write(rem, buf, strlen(buf)); if (response() < 0) { closedir(d); return; } } (void) sprintf(buf, "D%04o %d %s\n", statp->st_mode&07777, 0, last); (void) write(rem, buf, strlen(buf)); if (response() < 0) { closedir(d); return; } while (dp = readdir(d)) { if (dp->d_ino == 0) continue; if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) continue; if (strlen(name) + 1 + strlen(dp->d_name) >= BUFSIZ - 1) { error("%s/%s: Name too long.\n", name, dp->d_name); continue; } (void) sprintf(buf, "%s/%s", name, dp->d_name); bufv[0] = buf; source(1, bufv); } closedir(d); (void) write(rem, "E\n", 2); (void) response(); } int response() { char resp, c, rbuf[BUFSIZ], *cp = rbuf; if (read(rem, &resp, 1) != 1) lostconn(0); switch (resp) { case 0: /* ok */ return (0); default: *cp++ = resp; /* fall into... */ case 1: /* error, followed by err msg */ case 2: /* fatal error, "" */ do { if (read(rem, &c, 1) != 1) lostconn(0); *cp++ = c; } while (cp < &rbuf[BUFSIZ] && c != '\n'); if (iamremote == 0) (void) write(2, rbuf, cp - rbuf); errs++; if (resp == 1) return (-1); exit(1); } /*NOTREACHED*/ } void lostconn(sig) int sig; { if (iamremote == 0) fprintf(stderr, "rcp: lost connection\n"); exit(1); } void sink(argc, argv) int argc; char **argv; { off_t i, j, size; char *targ, *whopp, *cp; int of, mode, wrerr, exists, first, count, amt; struct buffer *bp; static struct buffer buffer; struct stat stb; int targisdir = 0; int mask = umask(0); char *myargv[1]; char cmdbuf[BUFSIZ], nambuf[BUFSIZ]; int setimes = 0; struct utimbuf utimbuf; #define atime utimbuf.actime #define mtime utimbuf.modtime time_t dummy; #define SCREWUP(str) { whopp = str; goto screwup; } #ifdef NOT_DEF seteuid(pwd->pw_uid); #endif if (!pflag) (void) umask(mask); if (argc != 1) { error("rcp: ambiguous target\n"); exit(1); } targ = *argv; if (targetshouldbedirectory) verifydir(targ); ga(); if (stat(targ, &stb) == 0 && (stb.st_mode & S_IFMT) == S_IFDIR) targisdir = 1; for (first = 1; ; first = 0) { cp = cmdbuf; if (read(rem, cp, 1) <= 0) return; if (*cp++ == '\n') SCREWUP("unexpected '\\n'"); do { if (read(rem, cp, 1) != 1) SCREWUP("lost connection"); } while (*cp++ != '\n'); *cp = 0; if (cmdbuf[0] == '\01' || cmdbuf[0] == '\02') { if (iamremote == 0) (void) write(2, cmdbuf+1, strlen(cmdbuf+1)); if (cmdbuf[0] == '\02') exit(1); errs++; continue; } *--cp = 0; cp = cmdbuf; if (*cp == 'E') { ga(); return; } #define getnum(t) (t) = 0; while (isdigit(*cp)) (t) = (t) * 10 + (*cp++ - '0'); if (*cp == 'T') { setimes++; cp++; getnum(mtime); if (*cp++ != ' ') SCREWUP("mtime.sec not delimited"); getnum(dummy); if (*cp++ != ' ') SCREWUP("mtime.usec not delimited"); getnum(atime); if (*cp++ != ' ') SCREWUP("atime.sec not delimited"); getnum(dummy); if (*cp++ != '\0') SCREWUP("atime.usec not delimited"); ga(); continue; } if (*cp != 'C' && *cp != 'D') { /* * Check for the case "rcp remote:foo\* local:bar". * In this case, the line "No match." can be returned * by the shell before the rcp command on the remote is * executed so the ^Aerror_message convention isn't * followed. */ if (first) { error("%s\n", cp); exit(1); } SCREWUP("expected control record"); } cp++; mode = 0; for (; cp < cmdbuf+5; cp++) { if (*cp < '0' || *cp > '7') SCREWUP("bad mode"); mode = (mode << 3) | (*cp - '0'); } if (*cp++ != ' ') SCREWUP("mode not delimited"); size = 0; while (isdigit(*cp)) size = size * 10 + (*cp++ - '0'); if (*cp++ != ' ') SCREWUP("size not delimited"); if (targisdir) (void) sprintf(nambuf, "%s%s%s", targ, *targ ? "/" : "", cp); else (void) strcpy(nambuf, targ); exists = stat(nambuf, &stb) == 0; if (cmdbuf[0] == 'D') { if (exists) { if ((stb.st_mode&S_IFMT) != S_IFDIR) { errno = ENOTDIR; goto bad; } if (pflag) (void) chmod(nambuf, mode); } else if (mkdir(nambuf, mode) < 0) goto bad; myargv[0] = nambuf; sink(1, myargv); if (setimes) { setimes = 0; if (utime(nambuf, &utimbuf) < 0) error("rcp: can't set times on %s: %s\n", nambuf, strerror(errno)); } continue; } if ((of = creat(nambuf, mode)) < 0) { bad: error("rcp: %s: %s\n", nambuf, strerror(errno)); continue; } if (exists && pflag) (void) chmod(nambuf, mode); ga(); if ((bp = allocbuf(&buffer, of, BUFSIZ)) == 0) { (void) close(of); continue; } cp = bp->buf; count = 0; wrerr = 0; for (i = 0; i < size; i += BUFSIZ) { amt = BUFSIZ; if (i + amt > size) amt = size - i; count += amt; do { j = read(rem, cp, amt); if (j <= 0) exit(1); amt -= j; cp += j; } while (amt > 0); if (count == bp->cnt) { if (wrerr == 0 && write(of, bp->buf, count) != count) wrerr++; count = 0; cp = bp->buf; } } if (count != 0 && wrerr == 0 && write(of, bp->buf, count) != count) wrerr++; (void) close(of); (void) response(); if (setimes) { setimes = 0; if (utime(nambuf, &utimbuf) < 0) error("rcp: can't set times on %s: %s\n", nambuf, strerror(errno)); } if (wrerr) error("rcp: %s: %s\n", nambuf, strerror(errno)); else ga(); } screwup: error("rcp: protocol screwup: %s\n", whopp); exit(1); } struct buffer * allocbuf(bp, fd, blksize) struct buffer *bp; int fd, blksize; { struct stat stb; int size; if (fstat(fd, &stb) < 0) { error("rcp: fstat: %s\n", strerror(errno)); return ((struct buffer *)0); } size= 0; #if NOT_DEF size = roundup(stb.st_blksize, blksize); #endif if (size == 0) size = blksize; if (bp->cnt < size) { if (bp->buf != 0) free(bp->buf); bp->buf = (char *)malloc((unsigned) size); if (bp->buf == 0) { error("rcp: malloc: out of memory\n"); return ((struct buffer *)0); } } bp->cnt = size; return (bp); } /*VARARGS1*/ #if __STDC__ void error (char *fmt, ...) #else error(fmt) char *fmt; #endif { char buf[BUFSIZ], *cp = buf; va_list ap; va_start(ap, fmt); errs++; *cp++ = 1; (void) vsprintf(cp, fmt, ap); va_end(ap); (void) write(rem, buf, strlen(buf)); if (iamremote == 0) (void) write(2, buf+1, strlen(buf+1)); } void usage() { fprintf(stderr, "Usage: rcp [-p] f1 f2; or: rcp [-rp] f1 ... fn d2\n"); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* readall - read a whole device fast Author: Andy Tanenbaum */ /* Readall reads all the blocks on a device as fast as it can. If it hits * an error, it stops reading in large units and reads one block at a time. * It reports on all errors it finds. * * If the -b flag is given, the output is a shell script that can be run * to mark all the bad blocks. * * If the -t flag is given, only the total numbers of blocks is reported. * * Examples of usage: * readall /dev/hd1 # read /dev/hd1 * readall -b /dev/hd2 # prepare bad block list on stdout * readall -t /dev/ram # report size of ram disk */ #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define CHUNK 25 /* max number of blocks read at once */ #define BLOCK_SIZE 1024 /* size of a block */ #define RESUME 200 /* # good reads before going back to CHUNK */ #define DIVISOR 50 /* how often to print statistics */ #define STORE 4096 /* save this many bad blocks for summary */ int chunk = CHUNK; /* current number of blocks being read */ long goodies; /* incremented on good reads */ long errors; /* number of errors so far */ int normal = 1; /* set unless -b flag is given */ int total = 0; /* unset unless -t flag is given */ char *name; /* name of special file being read */ char a[CHUNK * BLOCK_SIZE]; /* read buffer */ long rotten[STORE]; /* list of bad blocks */ _PROTOTYPE(int main, (int argc, char **argv)); static _PROTOTYPE(void output, (long blocks_read)); int main(argc, argv) int argc; char *argv[]; { int fd, s, i, badprinted; long b = 0; char *p; if (argc != 2 && argc != 3) { fprintf(stderr, "Usage: readall [-b | -t] file\n"); exit(1); } i = 1; p = argv[1]; if (*p == '-' && *(p + 1) == 'b' && *(p + 2) == '\0') { normal = 0; i++; name = argv[i]; } if (*p == '-' && *(p + 1) == 't' && *(p + 2) == '\0') { normal = 0; total = 1; i++; name = argv[i]; } fd = open(argv[i], O_RDONLY); if (fd < 0) { fprintf(stderr, "%s is not readable\n", argv[i]); exit(1); } /* Read the entire file. Try it in large chunks, but if an error * occurs, go to single reads for a while. */ while (1) { lseek(fd, BLOCK_SIZE * b, SEEK_SET); s = read(fd, a, BLOCK_SIZE * chunk); if (s == BLOCK_SIZE * chunk) { /* Normal read, no errors. */ b += chunk; goodies++; if (chunk == 1) { if (goodies >= RESUME && b % DIVISOR == 0) chunk = CHUNK; } } else if (s < 0) { /* I/O error. */ if (chunk != 1) { chunk = 1; /* regress to single block mode */ continue; } if (errors == STORE) { fprintf(stderr, "\n%ld Bad blocks is too many. Exiting\n", errors); exit(1); } rotten[(int) errors] = b; /* log the error */ b += chunk; errors++; } else { /* End of file. */ b += s / BLOCK_SIZE; if (normal) { output(b); fprintf(stderr, "\n"); } if (total) printf("%8ld\n", b); if ((errors == 0) || total) exit(0); badprinted = 0; if (normal) printf("Summary of bad blocks\n"); /* Print summary of bad blocks, possibly as shell script. */ for (i = 0; i < errors; i++) { if (normal == 0 && badprinted == 0) { printf("badblocks %s ", name); badprinted = 1; } printf("%6ld ", rotten[i]); if ((i + 1) % 7 == 0) { printf("\n"); badprinted = 0; } } printf("\n"); exit(0); } if (normal && b % DIVISOR == 0) output(b); } } static void output(blocks_read) long blocks_read; { fprintf(stderr, "%8ld blocks read, %5ld errors\r", blocks_read, errors); fflush(stderr); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* readfs - read a MINIX file system Author: Paul Polderman */ /* Command: readfs - read and extract a MINIX filesystem. * * Syntax: readfs [-li] block-special [directory] * * Flags: -l: Extract files and dirs and produce a mkfs-listing on stdout * -i: Information only: give the listing, but do not extract files. * -d: Don't extract regular files, just the skeleton please. * * Examples: readfs /dev/fd1 # extract all files from /dev/fd1. * readfs -i /dev/hd2 # see what's on /dev/hd2. * readfs -l /dev/at0 rootfs # extract and list the filesystem * # of /dev/at0 and put the tree * # in the directory `rootfs'. * * Readfs reads a MINIX filesystem and extracts recursively all directories * and files, and (optionally) produces a mkfs-listing of them on stdout. * The root directory contents are placed in the current directory, unless * a directory is given as argument, in which case the contents are put there. * Readfs tries to restore the attributes (mode/uid/gid/time) of the files * extracted to those of the original files. * Special files are created as ordinary files, but the mkfs-listing * enables mkfs to restore them to original. */ #include <sys/types.h> #include <sys/dir.h> #include <sys/stat.h> #include <sys/wait.h> #include <fcntl.h> #include <limits.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <utime.h> #include <minix/config.h> #include <minix/const.h> #include <minix/type.h> #include "../../fs/const.h" #include "../../fs/type.h" #include "../../fs/buf.h" #include "../../fs/super.h" #undef printf /* Definition used only in the kernel */ #include <stdio.h> /* Compile with -I/user0/ast/minix * (i.e. the directory containing the MINIX system sources) * * Author: Paul Polderman (polder@cs.vu.nl) April 1987 */ char verbose = 0; /* give a mkfs-listing of the filesystem */ /* And extracts its contents. */ char noaction = 0; /* just give a mkfs-listing, do not extract * files. */ char nofiles = 0; /* only extract the skeleton FS structure */ struct super_block sb; char pathname[1024]; int inodes_per_block; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void get_flags, (char *flags)); _PROTOTYPE(void readfs, (char *special_file, char *directory)); _PROTOTYPE(int get_inode, (int fd, Ino_t inum, d1_inode * ip)); _PROTOTYPE(void dump_dir, (int special, d1_inode * ip, char *directory)); _PROTOTYPE(int dump_file, (int special, d1_inode * ip, char *filename)); _PROTOTYPE(int get_fileblock, (int special, d1_inode * ip, block_t b, struct buf * bp)); _PROTOTYPE(int get_block, (int fd, block_t block, struct buf * bp, int type)); _PROTOTYPE(int get_rawblock, (int special, block_t blockno, char *bufp)); _PROTOTYPE(void restore, (char *name, d1_inode * ip)); _PROTOTYPE(void show_info, (char *name, d1_inode * ip, char *path)); _PROTOTYPE(void do_indent, (int i)); _PROTOTYPE(int Mkdir, (char *directory)); int main(argc, argv) int argc; char **argv; { switch (argc) { case 2: pathname[0] = '\0'; readfs(argv[1], pathname); break; case 3: if (argv[1][0] == '-') { get_flags(&argv[1][1]); pathname[0] = '\0'; readfs(argv[2], pathname); } else { strcpy(pathname, argv[2]); readfs(argv[1], pathname); } break; case 4: if (argv[1][0] == '-') { get_flags(&argv[1][1]); strcpy(pathname, argv[3]); readfs(argv[2], pathname); break; } /* else fall through .. */ default: fprintf(stderr, "Usage: %s [-li] <special> [dirname]\n", argv[0]); exit(1); } return(0); } void get_flags(flags) register char *flags; { while (*flags) { switch (*flags) { case 'L': case 'l': verbose = 1; break; case 'I': case 'i': noaction = 1; verbose = 1; break; case 'D': case 'd': nofiles = 1; break; default: fprintf(stderr, "Bad flag: %c\n", *flags); break; } flags++; } } #define zone_shift (sb.s_log_zone_size) /* zone to block ratio */ void readfs(special_file, directory) char *special_file, *directory; /* Readfs: opens the given special file (with MINIX filesystem), * and extracts its contents into the given directory. */ { d1_inode root_inode; int special, magic; off_t super_b; umask(0); /* Open the special file */ if ((special = open(special_file, O_RDONLY)) < 0) { fprintf(stderr, "cannot open %s\n", special_file); return; } /* Read the superblock */ super_b = (off_t) SUPER_BLOCK *(off_t) BLOCK_SIZE; if (lseek(special, super_b, SEEK_SET) != super_b) { fprintf(stderr, "cannot seek to superblock\n"); return; } if (read(special, (char *) &sb, sizeof(struct super_block)) != sizeof(struct super_block)) { fprintf(stderr, "cannot read superblock\n"); return; } /* The number of inodes in a block differs in V1 and V2. */ magic = sb.s_magic; if (magic == SUPER_MAGIC || magic == SUPER_REV) { inodes_per_block = V1_INODES_PER_BLOCK; } else { inodes_per_block = V2_INODES_PER_BLOCK; } /* Is it really a MINIX filesystem ? */ if (magic != SUPER_MAGIC && magic != SUPER_V2) { fprintf(stderr, "%s is not a valid MINIX filesystem\n", special_file); return; } /* Fetch the inode of the root directory */ if (get_inode(special, (ino_t) ROOT_INODE, &root_inode) < 0) { fprintf(stderr, "cannot get inode of root directory\n"); return; } /* Print number of blocks and inodes */ if (verbose) printf("boot\n%ld %d\n", (block_t) sb.s_nzones << zone_shift, sb.s_ninodes); /* Extract (recursively) the root directory */ dump_dir(special, &root_inode, directory); } /* Different type of blocks: (used in routine get_block for caching) */ #define B_INODE 0 /* Cache #0 is the inode cache */ #define B_INDIRECT 1 /* Cache #1 is the (dbl) indirect block cache */ #define B_DATA 2 /* No cache for data blocks (only read once) */ int get_inode(fd, inum, ip) int fd; ino_t inum; d1_inode *ip; /* Get inode `inum' from the MINIX filesystem. (Uses the inode-cache) */ { struct buf bp; block_t block; block_t ino_block; unsigned short ino_offset; /* Calculate start of i-list */ block = SUPER_BLOCK + 1 + sb.s_imap_blocks + sb.s_zmap_blocks; /* Calculate block with inode inum */ ino_block = ((inum - 1) / inodes_per_block); ino_offset = ((inum - 1) % inodes_per_block); block += ino_block; /* Fetch the block */ if (get_block(fd, block, &bp, B_INODE) == 0) { memcpy((void *) ip, (void *) &bp.b_v1_ino[ino_offset], sizeof(d1_inode)); return(0); } /* Oeps, foutje .. */ fprintf(stderr, "cannot find inode %d\n", inum); return(-1); } static int indent = 0; /* current indent (used for mkfs-listing) */ void dump_dir(special, ip, directory) int special; d1_inode *ip; char *directory; /* Make the given directory (if non-NULL), * and recursively extract its contents. */ { register struct direct *dp; register int n_entries; register char *name; block_t b = 0; d1_inode dip; struct buf bp; if (verbose) { show_info(directory, ip, ""); indent++; } if (!noaction && *directory) { /* Try to make the directory if not already there */ if (Mkdir(directory) != 0 || chdir(directory) < 0) { fprintf(stderr, "Mkdir %s failed\n", directory); return; } } for (name = directory; *name; name++) /* Find end of pathname */ ; *name++ = '/'; /* Add trailing slash */ n_entries = (int) (ip->d1_size / (off_t) sizeof(struct direct)); while (n_entries > 0) { /* Read next block of the directory */ if (get_fileblock(special, ip, b, &bp) < 0) return; dp = &bp.b_dir[0]; if (b++ == (block_t) 0) { dp += 2; /* Skip "." and ".." */ n_entries -= 2; } /* Extract the files/directories listed in the block */ while (n_entries-- > 0 && dp < &bp.b_dir[NR_DIR_ENTRIES]) { if (dp->d_ino != (ino_t) 0) { if (get_inode(special, dp->d_ino, &dip) < 0) { /* Bad luck */ dp++; continue; } /* Add new pathname-component to `pathname'. */ strncpy(name, dp->d_name, (size_t) NAME_MAX); name[NAME_MAX] = '\0'; /* Call the right routine */ if ((dip.d1_mode & I_TYPE) == I_DIRECTORY) dump_dir(special, &dip, name); else dump_file(special, &dip, name); } dp++; /* Next entP��Q��Q��Q��Q��Q��Q��Q��Q������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ry, please. */ } } *--name = '\0'; /* Restore `pathname' to what it was. */ if (!noaction && *directory) { chdir(".."); /* Go back up. */ restore(directory, ip); /* Restore mode/owner/accesstime */ } if (verbose) { do_indent(--indent); /* Let mkfs know we are done */ printf("$\n"); /* with this directory. */ } } int dump_file(special, ip, filename) int special; d1_inode *ip; char *filename; /* Extract given filename from the MINIX-filesystem, * and store it on the local filesystem. */ { int file; block_t b = 0; struct buf bp; off_t size; if (nofiles && (ip->d1_mode & I_TYPE) == I_REGULAR) return(0); if (verbose) show_info(filename, ip, pathname); if (noaction) return(0); if (access(filename, 0) == 0) { /* Should not happen, but just in case .. */ fprintf(stderr, "Will not create %s: file exists\n", filename); return(-1); } if ((file = creat(filename, (ip->d1_mode & ALL_MODES))) < 0) { fprintf(stderr, "cannot create %s\n", filename); return(-1); } /* Don't try to extract /dev/hd0 */ if ((ip->d1_mode & I_TYPE) == I_REGULAR) { size = ip->d1_size; while (size > (off_t) 0) { /* Get next block of file */ if (get_fileblock(special, ip, b++, &bp) < 0) { close(file); return(-1); } /* Write it to the file */ if (size > (off_t) BLOCK_SIZE) write(file, bp.b_data, BLOCK_SIZE); else write(file, bp.b_data, (int) size); size -= (off_t) BLOCK_SIZE; } } close(file); restore(filename, ip); /* Restore mode/owner/filetimes */ return(0); } int get_fileblock(special, ip, b, bp) int special; d1_inode *ip; block_t b; struct buf *bp; /* Read the `b'-th block from the file whose inode is `ip'. */ { zone_t zone, ind_zone; block_t z, zone_index; int r; /* Calculate zone in which the datablock number is contained */ zone = (zone_t) (b >> zone_shift); /* Calculate index of the block number in the zone */ zone_index = b - ((block_t) zone << zone_shift); /* Go get the zone */ if (zone < (zone_t) V1_NR_DZONES) { /* direct block */ zone = ip->d1_zone[(int) zone]; z = ((block_t) zone << zone_shift) + zone_index; r = get_block(special, z, bp, B_DATA); return(r); } /* The zone is not a direct one */ zone -= (zone_t) V1_NR_DZONES; /* Is it single indirect ? */ if (zone < (zone_t) V1_INDIRECTS) { /* single indirect block */ ind_zone = ip->d1_zone[V1_NR_DZONES]; } else { /* double indirect block */ /* Fetch the double indirect block */ ind_zone = ip->d1_zone[V1_NR_DZONES + 1]; z = (block_t) ind_zone << zone_shift; r = get_block(special, z, bp, B_INDIRECT); if (r < 0) return(r); /* Extract the indirect zone number from it */ zone -= (zone_t) V1_INDIRECTS; /* The next line assumes a V1 file system only! */ ind_zone = bp->b_v1_ind[(int) (zone / V1_INDIRECTS)]; zone %= (zone_t) V1_INDIRECTS; } /* Extract the datablock number from the indirect zone */ z = (block_t) ind_zone << zone_shift; r = get_block(special, z, bp, B_INDIRECT); if (r < 0) return(r); /* The next line assumes a V1 file system only! */ zone = bp->b_v1_ind[(int) zone]; /* Calculate datablock number to be fetched */ z = ((block_t) zone << zone_shift) + zone_index; r = get_block(special, z, bp, B_DATA); return(r); } /* The following routines simulate a LRU block cache. * * Definition of a cache block: */ struct cache_block { block_t b_block; /* block number of block */ long b_access; /* counter value of last access */ char b_buf[BLOCK_SIZE]; /* buffer for block */ }; #define NR_CACHES 2 /* total number of caches */ #define NR_CBLOCKS 5 /* number of blocks in a cache */ static struct cache_block cache[NR_CACHES][NR_CBLOCKS]; static long counter = 0L; /* Counter used as a sense of time. */ /* Incremented after each cache operation. */ int get_block(fd, block, bp, type) int fd; block_t block; struct buf *bp; int type; /* Get the requested block from the device with filedescriptor fd. * If it is in the cache, no (floppy-) disk access is needed, * if not, allocate a cache block and read the block into it. */ { register int i; register struct cache_block *cache_p, *cp; if (block == (block_t) NO_ZONE) { /* Should never happen in a good filesystem. */ fprintf(stderr, "get_block: NO_ZONE requested !\n"); return(-1); } if (type < 0 || type >= NR_CACHES) /* No cache for this type */ return(get_rawblock(fd, block, (char *) bp)); cache_p = cache[type]; cp = (struct cache_block *) 0; /* First find out if block requested is in the cache */ for (i = 0; i < NR_CBLOCKS; i++) { if (cache_p[i].b_block == block) { /* found right block */ cp = &cache_p[i]; break; } } if (cp == (struct cache_block *) 0) { /* block is not in cache */ cp = cache_p; /* go find oldest buffer */ for (i = 0; i < NR_CBLOCKS; i++) { if (cache_p[i].b_access < cp->b_access) cp = &cache_p[i]; } /* Fill the buffer with the right block */ if (get_rawblock(fd, block, cp->b_buf) < 0) return(-1); } /* Update/store last access counter */ cp->b_access = ++counter; cp->b_block = block; memcpy((void *) bp, (void *) cp->b_buf, BLOCK_SIZE); return(0); } int get_rawblock(special, blockno, bufp) int special; block_t blockno; char *bufp; /* Read a block from the disk. */ { off_t pos; /* Calculate the position of the block on the disk */ pos = (off_t) blockno *(off_t) BLOCK_SIZE; /* Read the block from the disk */ if (lseek(special, pos, SEEK_SET) == pos && read(special, bufp, BLOCK_SIZE) == BLOCK_SIZE) return(0); /* Should never get here .. */ fprintf(stderr, "read block %d failed\n", blockno); return(-1); } void restore(name, ip) char *name; d1_inode *ip; /* Restores given file's attributes. * `ip' contains the attributes of the file on the MINIX filesystem, * `name' is the filename of the extracted file on the local filesystem. */ { long ttime[2]; chown(name, ip->d1_uid, ip->d1_gid); /* Fails if not superuser */ chmod(name, (ip->d1_mode & ALL_MODES)); ttime[0] = ttime[1] = ip->d1_mtime; utime(name, (struct utimbuf *) ttime); } /* Characters to use as prefix to `mkfs' mode field */ static char special_chars[] = { '-', /* I_REGULAR */ 'c', /* I_CHAR_SPECIAL */ 'd', /* I_DIRECTORY */ 'b' /* I_BLOCK_SPECIAL */ }; void show_info(name, ip, path) char *name; d1_inode *ip; char *path; /* Show information about the given file/dir in `mkfs'-format */ { char c1, c2, c3; c1 = special_chars[(ip->d1_mode >> 13) & 03]; c2 = ((ip->d1_mode & ALL_MODES & ~RWX_MODES) == I_SET_UID_BIT) ? 'u' : '-'; c3 = ((ip->d1_mode & ALL_MODES & ~RWX_MODES) == I_SET_GID_BIT) ? 'g' : '-'; if (*name) { do_indent(indent); printf("%-14s ", name); } printf("%c%c%c%03o %d %d", c1, c2, c3, (ip->d1_mode & RWX_MODES), ip->d1_uid, ip->d1_gid); switch (ip->d1_mode & I_TYPE) { case I_DIRECTORY: break; case I_CHAR_SPECIAL: /* Print major and minor dev numbers */ printf(" %d %d", (ip->d1_zone[0] >> MAJOR) & 0377, (ip->d1_zone[0] >> MINOR) & 0377); break; case I_BLOCK_SPECIAL: /* Print major and minor dev numbers */ printf(" %d %d", (ip->d1_zone[0] >> MAJOR) & 0377, (ip->d1_zone[0] >> MINOR) & 0377); /* Also print the number of blocks on the device */ printf(" %ld", (ip->d1_size / (off_t) BLOCK_SIZE)); break; default: /* Just print the pathname */ printf(" %s", path); break; } putchar('\n'); } #define INDENT_SIZE 4 void do_indent(i) int i; { i *= INDENT_SIZE; while (i-- > 0) putchar(' '); } int Mkdir(directory) char *directory; /* Make a directory, return exit status. * This routine is not necessary on systems that * have a system call to make directories. */ { int pid, status; if ((pid = fork()) == 0) { execl("/bin/Mkdir", "Mkdir", directory, (char *) 0); execl("/usr/bin/Mkdir", "Mkdir", directory, (char *) 0); exit(1); } else if (pid < 0) return(-1); while (wait(&status) != pid); return(status); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* remsync 1.5 - remotely synchronize file trees Author: Kees J. Bot * 10 Jun 1994 */ #define nil 0 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h> #include <dirent.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <limits.h> #include <time.h> #include <utime.h> #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) #ifndef major #define major(dev) ((int) ((dev) >> 8)) #define minor(dev) ((int) ((dev) & 0xFF)) #endif #ifndef S_ISLNK /* There were no symlinks in medieval times. */ #define S_ISLNK(mode) (0) #define lstat stat #define symlink(path1, path2) (errno= ENOSYS, -1) #define readlink(path, buf, len) (errno= ENOSYS, -1) #endif int sflag; /* Make state file. */ int dflag; /* Make list of differences. */ int uflag; /* Only update files with newer versions. */ int xflag; /* Do not cross device boundaries. */ int Dflag; /* Debug: Readable differences, no file contents. */ int vflag; /* Verbose. */ #define NO_DEVICE (-1) dev_t xdev= NO_DEVICE; /* The device that you should stay within. */ int excode= 0; /* Exit(excode); */ #define BASE_INDENT 2 /* State file basic indent. */ void report(const char *label) { fprintf(stderr, "remsync: %s: %s\n", label, strerror(errno)); excode= 1; } void fatal(const char *label) { report(label); exit(1); } void *allocate(void *mem, size_t size) { if ((mem= mem == nil ? malloc(size) : realloc(mem, size)) == nil) { fprintf(stderr, "remsync: Out of memory: %s\n", strerror(errno)); exit(1); } return mem; } void deallocate(void *mem) { if (mem != nil) free(mem); } /* One needs to slowly forget two sets of objects: for the code that reads * the state file, and for the code that traverses trees. */ int keep; #define KEEP_STATE 0 #define KEEP_TRAVERSE 1 void forget(void *mem) /* Some objects must be deleted in time, but not just yet. */ { static void *death_row[2][50]; static void **dp[2]= { death_row[0], death_row[1] }; deallocate(*dp[keep]); *dp[keep]++= mem; if (dp[keep] == arraylimit(death_row[keep])) dp[keep]= death_row[keep]; } char *copystr(const char *s) { char *c= allocate(nil, (strlen(s) + 1) * sizeof(c[0])); strcpy(c, s); return c; } typedef struct pathname { char *path; /* The actual pathname. */ size_t idx; /* Index for the terminating null byte. */ size_t lim; /* Actual length of the path array. */ } pathname_t; void path_init(pathname_t *pp) /* Initialize a pathname to the null string. */ { pp->path= allocate(nil, (pp->lim= 16) * sizeof(pp->path[0])); pp->path[pp->idx= 0]= 0; } void path_add(pathname_t *pp, const char *name) /* Add a component to a pathname. */ { size_t lim; char *p; int slash; lim= pp->idx + strlen(name) + 2; if (lim > pp->lim) { pp->lim= lim + lim/2; /* add an extra 50% growing space. */ pp->path= allocate(pp->path, pp->lim * sizeof(pp->path[0])); } p= pp->path + pp->idx; slash= (pp->idx > 0); if (pp->idx == 1 && p[-1] == '/') p--; while (*name != 0) { if (*name == '/') { slash= 1; } else { if (slash) { *p++ = '/'; slash= 0; } *p++= *name; } name++; } if (slash && p == pp->path) *p++= '/'; *p = 0; pp->idx= p - pp->path; } void path_trunc(pathname_t *pp, size_t didx) /* Delete part of a pathname to a remembered length. */ { pp->path[pp->idx= didx]= 0; } #if kept_for_comments_only const char *path_name(const pathname_t *pp) /* Return the actual name as a char array. */ { return pp->path; } size_t path_length(const pathname_t *pp) /* The length of the pathname. */ { return pp->idx; } void path_drop(pathname_t *pp) /* Release the storage occupied by the pathname. */ { free(pp->path); } #endif #define path_name(pp) ((const char *) (pp)->path) #define path_length(pp) ((pp)->idx) #define path_drop(pp) free((void *) (pp)->path) typedef struct namelist { /* Obviously a list of names. */ struct namelist *next; char *name; } namelist_t; char *rdlink(const char *link, off_t size) /* Look where "link" points. */ { static char *path= nil; static size_t len= 0; size_t n; if (len <= size) { path= allocate(path, (len= size * 2) * sizeof(path[0])); } if ((n= readlink(link, path, len)) == -1) return nil; path[n]= 0; return path; } void sort(namelist_t **anl) /* A stable mergesort disguised as line noise. Must be called like this: * if (L!=nil && L->next!=nil) sort(&L); */ { /* static */ namelist_t *nl1, **mid; /* Need not be local */ namelist_t *nl2; nl1= *(mid= &(*anl)->next); do { if ((nl1= nl1->next) == nil) break; mid= &(*mid)->next; } while ((nl1= nl1->next) != nil); nl2= *mid; *mid= nil; if ((*anl)->next != nil) sort(anl); if (nl2->next != nil) sort(&nl2); nl1= *anl; for (;;) { if (strcmp(nl1->name, nl2->name)<=0) { if ((nl1= *(anl= &nl1->next)) == nil) { *anl= nl2; break; } } else { *anl= nl2; nl2= *(anl= &nl2->next); *anl= nl1; if (nl2 == nil) break; } } } namelist_t *collect(const char *dir) /* Return a sorted list of directory entries. Returns null with errno != 0 * on error. */ { namelist_t *names, **pn= &names; DIR *dp; struct dirent *entry; if ((dp= opendir(dir)) == nil) return nil; while ((entry= readdir(dp)) != nil) { if (entry->d_name[0] == '.' && (entry->d_name[1] == 0 || (entry->d_name[1] == '.' && entry->d_name[2] == 0))) { continue; } *pn= allocate(nil, sizeof(**pn)); (*pn)->name= copystr(entry->d_name); pn= &(*pn)->next; } closedir(dp); *pn= nil; errno= 0; if (names != nil && names->next != nil) sort(&names); return names; } char *pop_name(namelist_t **names) /* Return one name of a name list. */ { char *name; namelist_t *junk; junk= *names; *names= junk->next; name= junk->name; deallocate(junk); forget(name); return name; } typedef enum filetype { /* The files we know about. */ F_DIR, F_FILE, F_BLK, F_CHR, F_PIPE, F_LINK } filetype_t; typedef struct entry { /* One file. */ int depth; /* Depth in directory tree. */ const char *name; /* Name of entry. */ const char *path; /* Path name. */ int ignore; /* Ignore this entry (errno number.) */ unsigned long fake_ino; /* Fake inode number for hard links. */ int linked; /* Is the file hard linked? */ int lastlink; /* Is it the last link? */ char *link; /* Where a (sym)link points to. */ filetype_t type; mode_t mode; /* Not unlike those in struct stat. */ uid_t uid; gid_t gid; off_t size; time_t mtime; dev_t rdev; } entry_t; void linked(entry_t *entry, struct stat *stp) /* Return an "inode number" if a file could have links (link count > 1). * Also return a path to the first link if you see the file again. */ { static unsigned long new_fake_ino= 0; static struct links { struct links *next; char *path; ino_t ino; dev_t dev; nlink_t nlink; unsigned long fake_ino; } *links[1024]; struct links **plp, *lp; entry->linked= entry->lastlink= 0; entry->fake_ino= 0; entry->link= nil; if (S_ISDIR(stp->st_mode) || stp->st_nlink < 2) return; plp= &links[stp->st_ino % arraysize(links)]; while ((lp= *plp) != nil && (lp->ino != stp->st_ino || lp->dev != stp->st_dev)) plp= &lp->next; if (lp == nil) { /* New file, store it with a new fake inode number. */ *plp= lp= allocate(nil, sizeof(*lp)); lp->next= nil; lp->path= copystr(entry->path); lp->ino= stp->st_ino; lp->dev= stp->st_dev; lp->nlink= stp->st_nlink; lp->fake_ino= ++new_fake_ino; } else { entry->link= lp->path; entry->linked= 1; } entry->fake_ino= lp->fake_ino; if (--lp->nlink == 0) { /* No need to remember this one, no more links coming. */ *plp= lp->next; forget(lp->path); deallocate(lp); entry->lastlink= 1; } } char *tree; /* Tree to work on. */ FILE *statefp; /* State file. */ char *state_file; FILE *difffp; /* File of differences. */ char *diff_file; entry_t *traverse(void) /* Get one name from the directory tree. */ { static int depth; static pathname_t path; static entry_t entry; static namelist_t **entries; static size_t *trunc; static size_t deep; static namelist_t *newentries; structQ��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q�� Q��!Q��"Q��#Q��$Q��%Q��&Q��'Q��(Q��)Q��*Q��+Q������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ stat st; recurse: keep= KEEP_TRAVERSE; if (deep == 0) { /* Initialize for the root of the tree. */ path_init(&path); path_add(&path, tree); entries= allocate(nil, 1 * sizeof(entries[0])); entries[0]= allocate(nil, sizeof(*entries[0])); entries[0]->next= nil; entries[0]->name= copystr("/"); trunc= allocate(nil, 1 * sizeof(trunc[0])); trunc[0]= path_length(&path); deep= 1; } else if (newentries != nil) { /* Last entry was a directory, need to go down. */ if (entry.ignore) { /* Ouch, it is to be ignored! */ while (newentries != nil) (void) pop_name(&newentries); goto recurse; } if (++depth == deep) { deep++; entries= allocate(entries, deep * sizeof(entries[0])); trunc= allocate(trunc, deep * sizeof(trunc[0])); } entries[depth]= newentries; newentries= nil; trunc[depth]= path_length(&path); } else { /* Pop up out of emptied directories. */ while (entries[depth] == nil) { if (depth == 0) return nil; /* Back at the root. */ /* Go up one level. */ depth--; } } entry.name= pop_name(&entries[depth]); path_trunc(&path, trunc[depth]); path_add(&path, entry.name); if (depth == 0) { entry.path= "/"; } else { entry.path= path_name(&path) + trunc[0]; if (entry.path[0] == '/') entry.path++; } entry.depth= depth; entry.ignore= 0; if (lstat(path_name(&path), &st) < 0) { if (depth == 0 || errno != ENOENT) { /* Something wrong with this entry, complain about * it and ignore it further. */ entry.ignore= errno; report(path_name(&path)); return &entry; } else { /* Entry strangely nonexistent; simply continue. */ goto recurse; } } /* Don't cross mountpoints if -x is set. */ if (xflag) { if (xdev == NO_DEVICE) xdev= st.st_dev; if (st.st_dev != xdev) { /* Ignore the mountpoint. */ entry.ignore= EXDEV; return &entry; } } entry.mode= st.st_mode & 07777; entry.uid= st.st_uid; entry.gid= st.st_gid; entry.size= st.st_size; entry.mtime= st.st_mtime; entry.rdev= st.st_rdev; linked(&entry, &st); if (S_ISDIR(st.st_mode)) { /* A directory. */ entry.type= F_DIR; /* Gather directory entries for the next traverse. */ if ((newentries= collect(path_name(&path))) == nil && errno != 0) { entry.ignore= errno; report(path_name(&path)); } } else if (S_ISREG(st.st_mode)) { /* A plain file. */ entry.type= F_FILE; } else if (S_ISBLK(st.st_mode)) { /* A block special file. */ entry.type= F_BLK; } else if (S_ISCHR(st.st_mode)) { /* A character special file. */ entry.type= F_CHR; } else if (S_ISFIFO(st.st_mode)) { /* A named pipe. */ entry.type= F_PIPE; } else if (S_ISLNK(st.st_mode)) { /* A symbolic link. */ entry.type= F_LINK; if ((entry.link= rdlink(path_name(&path), st.st_size)) == nil) { entry.ignore= errno; report(path_name(&path)); } } else { /* Unknown type of file. */ entry.ignore= EINVAL; } return &entry; } void checkstate(void) { if (ferror(statefp)) fatal(state_file); } void indent(int depth) /* Provide indentation to show directory depth. */ { int n= BASE_INDENT * (depth - 1); while (n >= 8) { if (putc('\t', statefp) == EOF) checkstate(); n-= 8; } while (n > 0) { if (putc(' ', statefp) == EOF) checkstate(); n--; } } int print_name(FILE *fp, const char *name) /* Encode a name. */ { const char *p; int c; for (p= name; (c= (unsigned char) *p) != 0; p++) { if (c <= ' ' || c == '\\') { fprintf(fp, "\\%03o", c); if (ferror(fp)) return 0; } else { if (putc(c, fp) == EOF) return 0; } } return 1; } void mkstatefile(void) /* Make a state file out of the directory tree. */ { entry_t *entry; while ((entry= traverse()) != nil) { indent(entry->depth); if (!print_name(statefp, entry->name)) checkstate(); if (entry->ignore) { fprintf(statefp, "\tignore (%s)\n", strerror(entry->ignore)); checkstate(); continue; } switch (entry->type) { case F_DIR: fprintf(statefp, "\td%03o %u %u", (unsigned) entry->mode, (unsigned) entry->uid, (unsigned) entry->gid); break; case F_FILE: fprintf(statefp, "\t%03o %u %u %lu %lu", (unsigned) entry->mode, (unsigned) entry->uid, (unsigned) entry->gid, (unsigned long) entry->size, (unsigned long) entry->mtime); break; case F_BLK: case F_CHR: fprintf(statefp, "\t%c%03o %u %u %x", entry->type == F_BLK ? 'b' : 'c', (unsigned) entry->mode, (unsigned) entry->uid, (unsigned) entry->gid, (unsigned) entry->rdev); break; case F_PIPE: fprintf(statefp, "\tp%03o %u %u", (unsigned) entry->mode, (unsigned) entry->uid, (unsigned) entry->gid); break; case F_LINK: fprintf(statefp, "\t-> "); checkstate(); (void) print_name(statefp, entry->link); break; } checkstate(); if (entry->fake_ino != 0) fprintf(statefp, " %lu", entry->fake_ino); if (entry->lastlink) fprintf(statefp, " last"); if (fputc('\n', statefp) == EOF) checkstate(); } fflush(statefp); checkstate(); } char *read1line(FILE *fp) /* Read one line from a file. Return null on EOF or error. */ { static char *line; static size_t len; size_t idx; int c; if (len == 0) line= allocate(nil, (len= 16) * sizeof(line[0])); idx= 0; while ((c= getc(fp)) != EOF && c != '\n') { if (c < '\t') { /* Control characters are not possible. */ fprintf(stderr, "remsync: control character in data file!\n"); exit(1); } line[idx++]= c; if (idx == len) { line= allocate(line, (len*= 2) * sizeof(line[0])); } } if (c == EOF) { if (ferror(fp)) return nil; if (idx == 0) return nil; } line[idx]= 0; return line; } void getword(char **pline, char **parg, size_t *plen) /* Get one word from a line, interpret octal escapes. */ { char *line= *pline; char *arg= *parg; size_t len= *plen; int i; int c; size_t idx; idx= 0; while ((c= *line) != 0 && c != ' ' && c != '\t') { line++; if (c == '\\') { c= 0; for (i= 0; i < 3; i++) { if ((unsigned) (*line - '0') >= 010) break; c= (c << 3) | (*line - '0'); line++; } } arg[idx++]= c; if (idx == len) arg= allocate(arg, (len*= 2) * sizeof(arg[0])); } arg[idx]= 0; *pline= line; *parg= arg; *plen= len; } void splitline(char *line, char ***pargv, size_t *pargc) /* Split a line into an array of words. */ { static char **argv; static size_t *lenv; static size_t len; size_t idx; idx= 0; for (;;) { while (*line == ' ' || *line == '\t') line++; if (*line == 0) break; if (idx == len) { len++; argv= allocate(argv, len * sizeof(argv[0])); lenv= allocate(lenv, len * sizeof(lenv[0])); argv[idx]= allocate(nil, 16 * sizeof(argv[idx][0])); lenv[idx]= 16; } getword(&line, &argv[idx], &lenv[idx]); idx++; } *pargv= argv; *pargc= idx; } int getattributes(entry_t *entry, int argc, char **argv) /* Convert state or difference file info into file attributes. */ { int i; int attr; #define A_MODE1 0x01 /* Some of these attributes follow the name */ #define A_MODE 0x02 #define A_OWNER 0x04 #define A_SIZETIME 0x08 #define A_DEV 0x10 #define A_LINK 0x20 switch (argv[0][0]) { case 'd': /* Directory. */ entry->type= F_DIR; attr= A_MODE1 | A_OWNER; break; case 'b': /* Block device. */ entry->type= F_BLK; attr= A_MODE1 | A_OWNER | A_DEV; break; case 'c': /* Character device. */ entry->type= F_CHR; attr= A_MODE1 | A_OWNER | A_DEV; break; case 'p': /* Named pipe. */ entry->type= F_PIPE; attr= A_MODE1 | A_OWNER; break; case '-': /* Symlink. */ entry->type= F_LINK; attr= A_LINK; break; default: /* Normal file. */ entry->type= F_FILE; attr= A_MODE | A_OWNER | A_SIZETIME; } if (attr & (A_MODE | A_MODE1)) { entry->mode= strtoul(argv[0] + (attr & A_MODE1), nil, 010); } i= 1; if (attr & A_OWNER) { if (i + 2 > argc) return 0; entry->uid= strtoul(argv[i++], nil, 10); entry->gid= strtoul(argv[i++], nil, 10); } if (attr & A_SIZETIME) { if (i + 2 > argc) return 0; entry->size= strtoul(argv[i++], nil, 10); entry->mtime= strtoul(argv[i++], nil, 10); } if (attr & A_DEV) { if (i + 1 > argc) return 0; entry->rdev= strtoul(argv[i++], nil, 0x10); } if (attr & A_LINK) { if (i + 1 > argc) return 0; entry->link= argv[i++]; } entry->linked= entry->lastlink= 0; if (i < argc) { /* It has a fake inode number, so it is a hard link. */ static struct links { /* List of hard links. */ struct links *next; unsigned long fake_ino; char *path; } *links[1024]; struct links **plp, *lp; unsigned long fake_ino; fake_ino= strtoul(argv[i++], nil, 10); plp= &links[fake_ino % arraysize(links)]; while ((lp= *plp) != nil && lp->fake_ino != fake_ino) plp= &lp->next; if (lp == nil) { /* New link. */ *plp= lp= allocate(nil, sizeof(*lp)); lp->next= nil; lp->fake_ino= fake_ino; lp->path= copystr(entry->path); } else { /* Linked to. */ entry->link= lp->path; entry->linked= 1; } if (i < argc) { if (strcmp(argv[i++], "last") != 0) return 0; /* Last hard link of a file. */ forget(lp->path); *plp= lp->next; deallocate(lp); entry->lastlink= 1; } } if (i != argc) return 0; return 1; } void state_syntax(off_t line) { fprintf(stderr, "remsync: %s: syntax error on line %lu\n", state_file, (unsigned long) line); exit(1); } entry_t *readstate(void) /* Read one entry from the state file. */ { static entry_t entry; static pathname_t path; static size_t *trunc; static size_t trunc_len; static base_indent; char *line; char **argv; size_t argc; static off_t lineno; int indent, depth; recurse: keep= KEEP_STATE; if (feof(statefp) || (line= read1line(statefp)) == nil) { checkstate(); return nil; } lineno++; /* How far is this entry indented? */ indent= 0; while (*line != 0) { if (*line == ' ') indent++; else if (*line == '\t') indent= (indent + 8) & ~7; else break; line++; } if (indent > 0 && base_indent == 0) base_indent= indent; depth= (base_indent == 0 ? 0 : indent / base_indent) + 1; if (entry.ignore && depth > entry.depth) { /* If the old directory is ignored, then so are its entries. */ goto recurse; } entry.depth= depth; splitline(line, &argv, &argc); if (argc < 2) state_syntax(lineno); if (trunc == nil) { /* The root of the tree, initialize path. */ if (argv[0][0] != '/') state_syntax(lineno); path_init(&path); path_add(&path, "/"); trunc= allocate(nil, (trunc_len= 16) * sizeof(trunc[0])); /* The root has depth 0. */ entry.depth= 0; trunc[0]= 0; } else { if (entry.depth > trunc_len) { trunc= allocate(trunc, (trunc_len*= 2) * sizeof(trunc[0])); } path_trunc(&path, trunc[entry.depth - 1]); path_add(&path, argv[0]); trunc[entry.depth]= path_length(&path); } entry.path= path_name(&path); entry.name= argv[0]; entry.link= nil; if ((entry.ignore= strcmp(argv[1], "ignore") == 0)) { return &entry; } if (!getattributes(&entry, argc - 1, argv + 1)) state_syntax(lineno); return &entry; } void checkdiff(void) { if (ferror(difffp)) fatal(diff_file); } enum { DELETE, REPLACE, COPY, SIMILAR, EQUAL, ADD } compare(entry_t *remote, entry_t *local) /* Compare the local and remote entries and tell what need to be done. */ { int cmp; /* Surplus entries? */ if (local == nil) return DELETE; if (remote == nil) return ADD; /* Extra directory entries? */ if (remote->depth > local->depth) return DELETE; if (local->depth > remote->depth) return ADD; /* Compare names. */ cmp= strcmp(remote->name, local->name); if (cmp < 0) return DELETE; if (cmp > 0) return ADD; /* The files have the same name. Ignore one, ignore the other. */ if (remote->ignore || local->ignore) { remote->ignore= local->ignore= 1; return EQUAL; } /* Reasons for replacement? */ if (remote->type != local->type) return REPLACE; /* Should be hard linked to the same file. */ if (remote->linked || local->linked) { if (!remote->linked || !local->linked) return REPLACE; if (strcmp(remote->link, local->link) != 0) return REPLACE; } switch (remote->type) { case F_FILE: if (uflag) { if (remote->mtime < local->mtime) return COPY; } else { if (remote->size != local->size || remote->mtime != local->mtime) return COPY; } goto check_modes; case F_BLK: case F_CHR: if (remote->rdev != local->rdev) return REPLACE; goto check_modes; case F_DIR: case F_PIPE: check_modes: if (remote->mode != local->mode || remote->uid != local->uid || remote->gid != local->gid) return SIMILAR; break; case F_LINK: if (strcmp(remote->link, local->link) != 0) return REPLACE; break; } return EQUAL; } void delete(entry_t *old) /* Emit an instruction to remove an entry. */ { if (old->ignore) return; if (uflag) return; fprintf(difffp, "rm "); checkdiff(); if (!print_name(difffp, old->path)) checkdiff(); if (putc('\n', difffp) == EOF) checkdiff(); if (vflag) fprintf(stderr, "rm %s\n", old->path); } void change_modes(entry_t *old, entry_t *new) /* Emit an instruction to change the attributes of an entry. */ { if (new->ignore) return; fprintf(difffp, "chmod "); checkdiff(); if (!print_name(difffp, new->path)) checkdiff(); fprintf(difffp, " %03o %u %u\n", (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid); checkdiff(); if (vflag && old->mode != new->mode) { fprintf(stderr, "chmod %s %03o %u %u\n", new->path, (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid); } } int cat(int f, off_t size) /* Include the contents of a file in the differences file. */ { ssize_t n; unsigned char buf[1024 << sizeof(int)]; unsigned char *p; int c; if (Dflag) return 1; /* Debug: Don't need the file contents. */ while ((n= read(f, buf, sizeof(buf))) > 0) { p= buf; do { if (size == 0) { /* File suddenly larger. */ errno= EINVAL; return 0; } c= *p++; if (putc(c, difffp) == EOF) checkdiff(); size--; } while (--n != 0); } if (size > 0) { int err= errno; /* File somehow shrunk, pad it out. */ do { if (putc(0, difffp) == EOF) checkdiff(); } while (--size != 0); errno= n == 0 ? EINVAL : err; n= -1; } return n == 0; } void add(entry_t *old, entry_t *new) /* Emit an instruction to add an entry. */ { pathname_t file; int f; if (new->ignore) return; if (new->linked) { /* This file is to be a hard link to an existing file. */ fprintf(difffp, "ln "); checkdiff(); if (!print_name(difffp, new->link)) checkdiff(); if (fputc(' ', difffp) == EOF) checkdiff(); if (!print_name(difffp, new->path)) checkdiff(); if (fputc('\n', difffp) == EOF) checkdiff(); if (vflag) { fprintf(stderr, "ln %s %s\n", new->link, new->path); } return; } /* Add some other type of file. */ fprintf(difffp, "add "); checkdiff(); if (!print_name(difffp, new->path)) checkdiff(); switch (new->type) { case F_DIR: fprintf(difffp, " d%03o %u %u\n", (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid); if (vflag) fprintf(stderr, "mkdir %s\n", new->path); break; case F_FILE: path_init(&file); path_add(&file, tree); path_add(&file, new->path); if ((f= open(path_name(&file), O_RDONLY)) < 0) { report(path_name(&file)); path_drop(&file); fprintf(difffp, " ignore\n"); break; } fprintf(difffp, " %03o %u %u %lu %lu\n", (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid, (unsigned long) new->size, (unsigned long) new->mtime); checkdiff(); if (!cat(f, new->size)) { int err= errno; report(path_name(&file)); fprintf(difffp, "old "); checkdiff(); print_name(difffp, err == EINVAL ? "File changed when copied" : strerror(err)); fputc('\n', difffp); checkdiff(); } else { if (vflag) { fprintf(stderr, "%s %s\n", old == nil ? "add" : old->mtime > new->mtime ? "restore" : "update", new->path); } } close(f); path_drop(&file); break; case F_BLK: case F_CHR: fprintf(difffp, " %c%03o %u %u %lx\n", new->type == F_BLK ? 'b' : 'c', (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid, (unsigned long) new->rdev); if (vflag) fprintf(stderr, "mknod %s\n", new->path); break; case F_PIPE: fprintf(difffp, " p%03o %u %u\n", (unsigned) new->mode, (unsigned) new->uid, (unsigned) new->gid); if (vflag) fprintf(stderr, "mkfifo %s\n", new->path); break; case F_LINK: fprintf(difffp, " -> "); checkdiff(); (void) print_name(difffp, new->link); checkdiff(); fputc('\n', difffp); if (vflag) { fprintf(stderr, "ln -s %s %s\n", new->link, new->path); } break; } checkdiff(); } void mkdifferences(void) { entry_t *remote; entry_t *local; remote= readstate(); local= traverse(); while (remote != nil || local != nil) { switch (compare(remote, local)) { case DELETE: /* Remove the remote file. */ delete(remote); remote->ignore= 1; remote= readstate(); break; case REPLACE: /* Replace the remote file with the local one. */ if (remote->type == F_FILE && local->type == F_FILE && !local->linked) { /* Don't overwrite, remove first. */ delete(remote); } /*FALL THROUGH*/ case COPY: /* Overwrite the remote file with the local one. */ add(remote, local); remote->ignore= 1; goto skip2; case SIMILAR: /* About the same, but the attributes need changing. */ change_modes(remote, local); goto skip2; case EQUAL: skip2: /* Skip two files. */ remote= readstate(); local= traverse(); break; case ADD: /* Add the local file. */ add(nil, local); local= traverse(); break; } } fprintf(difffp, "end\n"); fflush(difffp); checkdiff(); } void apply_remove(pathname_t *pp) /* Remove an obsolete file. */ { struct stat st; if (lstat(path_name(pp), &st) < 0) { if (errno != ENOENT) report(path_name(pp)); return; } if (S_ISDIR(st.st_mode)) { /* Recursively delete directories. */ size_t len; namelist_t *entries; if ((entries= collect(path_name(pp))) == nil && errno != 0) { report(path_name(pp)); return; } len= path_length(pp); while (entries != nil) { path_add(pp, pop_name(&entries)); apply_remove(pp); path_trunc(pp, len); } if (rmdir(path_name(pp)) < 0) { report(path_name(pp)); return; } if (vflag) fprintf(stderr, "rmdir %s\n", path_name(pp)); } else { /* Some other type of file. */ if (unlink(path_name(pp)) < 0) { report(path_name(pp)); return; } if (vflag) fprintf(stderr, "rm %s\n", path_name(pp)); } } void apply_mkold(const char *file, const char *err) /* Make a file very old. (An error occurred when it was added.) */ { struct utimbuf utb; utb.actime= utb.modtime= 0; if (utime(file, &utb) < 0) { report(file); return; } fprintf(stderr, "made %s look old", file); fprintf(stderr, err == nil ? "\n" : " due to a remote problem: %s\n", err); } void apply_chmod(const char *file, mode_t mode, uid_t uid, gid_t gid, int talk) /* Change mode and ownership. */ { struct stat st; if (lstat(file, &st) < 0) { report(file); return; } if ((st.st_mode & 07777) != mode) { if (chmod(file, mode) < 0) { report(file); return; } if (vflag && talk) { fprintf(stderr, "chmod %03o %s\n", (unsigned) mode, file); } } if (st.st_uid != uid || st.st_gid != gid) { if (chown(file, uid, gid) < 0) { if (errno != EPERM) report(file); return; } if (vflag && talk) { fprintf(stderr, "chown %u:%u %s\n", (unsigned) uid, (unsigned) gid, file); } } } void apply_add(pathname_t *pp, entry_t *entry) /* Add or replace a file. */ { const char *file; off_t size; int f; unsigned char buf[1024 << sizeof(int)]; unsigned char *p; int c; int dirty; struct stat st; struct utimbuf utb; if (entry->ignore) return; if (lstat(path_name(pp), &st) >= 0 && (entry->type != F_FILE || !S_ISREG(st.st_mode))) { apply_remove(pp); } file= path_name(pp); switch (entry->type) { case F_DIR: if (mkdir(file, entry->mode) < 0) { report(file); return; } if (vflag) fprintf(stderr, "mkdir %s\n", file); break; case F_FILE: size= entry->size; f= -1; st.st_mode= 0; if (lstat(file, &st) < 0 || S_ISREG(st.st_mode)) { f= open(file, O_WRONLY | O_CREAT | O_TRUNC, entry->mode); if (f < 0) { (void) chmod(file, entry->mode | 0200); f= open(file, O_WRONLY | O_CREAT | O_TRUNC, entry->mode); } if (f < 0) { (void) unlink(file); f= open(file, O_WRONLY | O_CREAT | O_TRUNC, entry->mode); } if (f < 0) report(file); } dirty= (f >= 0); p= buf; while (size > 0 && (c= getc(difffp)) != EOF) { size--; *p++= c; if (p == arraylimit(buf) || size == 0) { if (f >= 0 && write(f, buf, p - buf) < 0) { report(file); close(f); f= -1; } p= buf; } } if (size > 0) { if (ferror(difffp)) report(diff_file); if (feof(difffp)) { fprintf(stderr, "remspec: %s: premature EOF\n", diff_file); } if (dirty) apply_mkold(file, nil); exit(1); } if (f < 0) { if (dirty) apply_mkold(file, nil); return; } close(f); if (vflag) { fprintf(stderr, st.st_mode == 0 ? "add %s\n" : entry->mtime >= st.st_mtime ? "update %s\n" : "restore %s\n", file); } utb.actime= time(nil); utb.modtime= entry->mtime; if (utime(file, &utb) < 0) report(file); break; case F_BLK: if (mknod(file, S_IFBLK | entry->mode, entry->rdev) < 0) { report(file); return; } if (vflag) { fprintf(stderr, "mknod %s b %d %d\n", file, major(entry->rdev), minor(entry->rdev)); } break; case F_CHR: if (mknod(file, S_IFCHR | entry->mode, entry->rdev) < 0) { report(file); return; } if (vflag) { fprintf(stderr, "mknod %s c %d %d\n", file, major(entry->rdev), minor(entry->rdev)); } break; case F_PIPE: if (mknod(file, S_IFIFO | entry->mode, 0) < 0) { report(file); return; } if (vflag) fprintf(stderr, "mknod %s p\n", file); break; case F_LINK: if (symlink(entry->link, file) < 0) { report(file); return; } if (vflag) fprintf(stderr, "ln -s %s %s\n", entry->link, file); return; } apply_chmod(file, entry->mode, entry->uid, entry->gid, 0); } void apply_link(const char *file, pathname_t *pp) /* Hard link *pp to file. */ { struct stat st1, st2; if (lstat(file, &st1) < 0) { report(file); return; } if (lstat(path_name(pp), &st2) >= 0) { if (st1.st_ino == st2.st_ino && st1.st_dev == st2.st_dev) return; apply_remove(pp); if (lstat(path_name(pp), &st2) >= 0) return; } if (link(file, path_name(pp)) < 0) { fprintf(stderr, "remsync: ln %s %s: %s\n", file, path_name(pp), strerror(errno)); excode= 1; return; } if (vflag) fprintf(stderr, "ln %s %s\n", file, path_name(pp)); } void diff_syntax(const char *line) { fprintf(stderr, "remsync: %s: syntax error on this line: %s\n", diff_file, line); exit(1); } void apply_differences(void) /* Update a tree to a list of differences derived from a remote tree. */ { char *line; char **argv; size_t argc; pathname_t path, link; size_t trunc; path_init(&path); path_init(&link); path_add(&path, tree); path_add(&link, tree); trunc= path_length(&path); while (!feof(difffp) && (line= read1line(difffp)) != nil) { splitline(line, &argv, &argc); if (argc == 0) diff_syntax(line); path_trunc(&path, trunc); if (strcmp(argv[0], "add") == 0) { entry_t entry; if (argc < 3) diff_syntax(line); path_add(&path, argv[1]); entry.ignore= (strcmp(argv[2], "ignore") == 0); if (!entry.ignore && !getattributes(&entry, argc - 2, argv + 2)) diff_syntax(line); apply_add(&path, &entry); } else if (strcmp(argv[0], "rm") == 0) { if (argc != 2) diff_syntax(line); path_add(&path, argv[1]); apply_remove(&path); } else if (strcmp(argv[0], "ln") == 0) { if (argc != 3) diff_syntax(line); path_trunc(&link, trunc); path_add(&link, argv[1]); path_add(&path, argv[2]); apply_link(path_name(&link), &path); } else if (strcmp(argv[0], "chmod") == 0) { if (argc != 5) diff_syntax(line); path_add(&path, argv[1]); apply_chmod(path_name(&path), strtoul(argv[2], nil, 010), strtoul(argv[3], nil, 10), strtoul(argv[4], nil, 10), 1); } else if (strcmp(argv[0], "old") == 0) { if (argc != 3) diff_syntax(line); path_add(&path, argv[1]); apply_mkold(path_name(&path), argv[2]); } else if (strcmp(argv[0], "end") == 0) { if (argc != 1) diff_syntax(line); break; } else { diff_syntax(line); } } checkdiff(); } void usage(void) { fprintf(stderr, "Usage: remsync -sxv tree [state-file]\n"); fprintf(stderr, " remsync -duxvD tree [state-file [diff-file]]\n"); fprintf(stderr, " remsync [-xv] tree [diff-file]\n"); exit(1); } int main(int argc, char **argv) { int i; for (i= 1; i < argc && argv[i][0] == '-'; i++) { char *p= argv[i] + 1; if (p[0] == '-' && p[1] == 0) { i++; break; } while (*p != 0) { switch (*p++) { case 's': sflag= 1; break; case 'd': dflag= 1; break; case 'u': uflag= 1; break; case 'x': xflag= 1; break; case 'D': Dflag= 1; break; case 'v': vflag= 1; break; default: usage(); } } } if (sflag && dflag) usage(); if (sflag && uflag) usage(); if (!sflag && !dflag && uflag) usage(); if (!dflag && Dflag) usage(); if (i == argc) usage(); tree= argv[i++]; if (sflag) { /* Make a state file. */ state_file= i < argc ? argv[i++] : "-"; if (i != argc) usage(); statefp= stdout; if (strcmp(state_file, "-") != 0) { if ((statefp= fopen(state_file, "w")) == nil) fatal(state_file); } mkstatefile(); } else if (dflag) { /* Make a file of differences. */ state_file= i < argc ? argv[i++] : "-"; diff_file= i < argc ? argv[i++] : "-"; if (i != argc) usage(); statefp= stdin; if (strcmp(state_file, "-") != 0) { if ((statefp= fopen(state_file, "r")) == nil) fatal(state_file); } difffp= stdout; if (strcmp(diff_file, "-") != 0) { if ((difffp= fopen(diff_file, "w")) == nil) fatal(diff_file); } mkdifferences(); } else { /* Apply a file of differences. */ diff_file= i < argc ? argv[i++] : "-"; if (i != argc) usage(); difffp= stdin; if (strcmp(diff_file, "-") != 0) { if ((difffp= fopen(diff_file, "r")) == nil) fatal(diff_file); } apply_differences(); } exit(excode); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Copyright (c) 1983, 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1983, 1990 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint #ifdef ID static char sccsid[] = "@(#)rlogin.c 5.33 (Berkeley) 3/1/91"; #endif #endif /* not lint */ /* * $Source: mit/rlogin/RCS/rlogin.c,v $ * $Header: mit/rlogin/RCS/rlogin.c,v 5.2 89/07/26 12:11:21 kfall * Exp Locker: kfall $ */ /* * rlogin - remote login */ #include <sys/ioctl.h> #include <sys/types.h> #include <sys/wait.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/netdb.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <termios.h> #include <setjmp.h> #include <errno.h> #include <pwd.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <assert.h> #include <ctype.h> #include <fcntl.h> #include <signal.h> #include <stdlib.h> #if __minix typedef unsigned char u_char; #endif #ifdef KERBEROS #include <kerberosIV/des.h> #include <kerberosIV/krb.h> CREDENTIALS cred; Key_schedule schedule; int use_kerberos = 1, doencrypt; char dst_realm_buf[REALM_SZ], *dest_realm = NULL; extern char *krb_realmofhost(); #endif #ifndef TIOCPKT_WINDOW #define TIOCPKT_WINDOW 0x80 #endif /* concession to Sun */ #ifndef SIGUSR1 #define SIGUSR1 30 #endif /* Standard Minix' SIGCHLD doesn't seem to work properly yet. */ #if __minix && !__minix_vmd #define BUGCHLD #undef SIGCHLD #define SIGCHLD SIGTERM #endif extern int errno; int eight, litout, rem; int noescape; u_char escapechar = '~'; struct speed { speed_t speed; char *name; } speeds[] = { { B0, "0" }, { B50, "50" }, { B75, "75" }, { B110, "110" }, { B134, "134" }, { B150, "150" }, { B200, "200" }, { B300, "300" }, { B600, "600" }, { B1200, "1200" }, { B1800, "1800" }, { B2400, "2400" }, { B4800, "4800" }, { B9600, "9600" }, { B19200, "19200" }, { B38400, "38400" }, { B57600, "57600" }, { B115200, "115200" }, { -1, NULL }, }; #if __minix_vmd /* flow control variables */ int more2read_0; int inprogress_0; int more2write_1; int inprogress_1; int more2read_rem; int inprogress_rd_rem; int more2write_rem; int inprogress_wr_rem; /* write to remote */ size_t wr_rem_size; size_t wr_rem_offset; size_t extra_wr_rem_size; size_t extra_wr_rem_offset; char *extra_wr_rem; size_t extra_wr_rem_new_size; char *extra_wr_rem_new; #endif /* __minix_vmd */ struct winsize winsize; #define get_window_size(fd, wp) ioctl(fd, TIOCGWINSZ, wp) extern int main _ARGS(( int argc, char **argv )); static void usage _ARGS(( void )); static u_char getescape _ARGS(( char *p )); static char *speeds2str _ARGS(( speed_t speed )); static void lostpeer _ARGS(( int sig )); static void doit _ARGS(( void )); static void setsignal _ARGS(( int sig, void (*act)(int sig) )); static void msg _ARGS(( char *str )); static void done _ARGS(( int status )); #if !__minix_vmd static int reader _ARGS(( void )); #endif static void mode _ARGS(( int f )); #if __minix_vmd static void mark_async _ARGS(( int fd )); static void init_0 _ARGS(( void )); static void init_1 _ARGS(( void )); static void init_rd_rem _ARGS(( void )); static void init_wr_rem _ARGS(( void )); static void restart_0 _ARGS(( void )); static void restart_1 _ARGS(( void )); static void restart_rd_rem _ARGS(( void )); static void restart_wr_rem _ARGS(( void )); static void completed_0 _ARGS(( int result, int error )); static void completed_1 _ARGS(( int result, int error )); static void completed_rd_rem _ARGS(( int result, int error )); static void completed_wr_rem _ARGS(( int result, int error )); static void do_urg _ARGS(( int urg_byte )); #endif #if !__minix_vmd static void catch_child _ARGS(( int sig )); static void writer _ARGS(( void )); #endif static void echo _ARGS(( int c )); #if __minix_vmd static void finish _ARGS(( void )); static void sendwindow _ARGS(( void )); static void sigwinch _ARGS(( int sig )); static void subshell _ARGS(( void )); #endif int main(argc, argv) int argc; char **argv; { extern char *optarg; extern int optind; struct passwd *pw; struct servent *sp; struct termios ttyb; nwio_tcpopt_t tcpopt; int error; int argoff, ch, dflag, one, uid; char *host, *p, *user, term[1024]; argoff = dflag = 0; one = 1; host = user = NULL; if (p = rindex(argv[0], '/')) ++p; else p = argv[0]; if (strcmp(p, "rlogin")) host = p; /* handle "rlogin host flags" */ if (!host && argc > 2 && argv[1][0] != '-') { host = argv[1]; argoff = 1; } #ifdef KERBEROS #define OPTIONS "8EKLde:k:l:x" #else #define OPTIONS "8EKLde:l:" #endif while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != EOF) switch(ch) { case '8': eight = 1; break; case 'E': noescape = 1; break; case 'K': #ifdef KERBEROS use_kerberos = 0; #endif break; case 'L': litout = 1; break; case 'd': dflag = 1; break; case 'e': escapechar = getescape(optarg); break; #ifdef KERBEROS case 'k': dest_realm = dst_realm_buf; (void)strncpy(dest_realm, optarg, REALM_SZ); break; #endif case 'l': user = optarg; break; #ifdef CRYPT #ifdef KERBEROS case 'x': doencrypt = 1; des_set_key(cred.session, schedule); break; #endif #endif case '?': default: usage(); } optind += argoff; argc -= optind; argv += optind; /* if haven't gotten a host yet, do so */ if (!host && !(host = *argv++)) usage(); if (*argv) usage(); if (!(pw = getpwuid(uid = getuid()))) { (void)fprintf(stderr, "rlogin: unknown user id.\n"); exit(1); } if (!user) user = pw->pw_name; sp = NULL; #ifdef KERBEROS if (use_kerberos) { sp = getservbyname((doencrypt ? "eklogin" : "klogin"), "tcp"); if (sp == NULL) { use_kerberos = 0; warning("can't get entry for %s/tcp service", doencrypt ? "eklogin" : "klogin"); } } #endif if (sp == NULL) sp = getservbyname("login", "tcp"); if (sp == NULL) { (void)fprintf(stderr, "rlogin: login/tcp: unknown service.\n"); exit(1); } (void)strncpy(term, (p = getenv("TERM")) ? p : "network", sizeof(term)); term[sizeof(term)-1]= 0; if (tcgetattr(0, &ttyb) == 0) { (void)strcat(term, "/"); (void)strcat(term, speeds2str(cfgetospeed(&ttyb))); } (void)get_window_size(0, &winsize); (void)signal(SIGPIPE, lostpeer); #ifdef KERBEROS try_connect: if (use_kerberos) { rem = KSUCCESS; errno = 0; if (dest_realm3Q��5Q��6Q��7Q��8Q��9Q��:Q��;Q��<Q��=Q��>Q��?Q��@Q��AQ��BQ��CQ��DQ��EQ��FQ��GQ��HQ��IQ��JQ��KQ��LQ��MQ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� == NULL) dest_realm = krb_realmofhost(host); #ifdef CRYPT if (doencrypt) rem = krcmd_mutual(&host, sp->s_port, user, term, 0, dest_realm, &cred, schedule); else #endif /* CRYPT */ rem = krcmd(&host, sp->s_port, user, term, 0, dest_realm); if (rem < 0) { use_kerberos = 0; sp = getservbyname("login", "tcp"); if (sp == NULL) { (void)fprintf(stderr, "rlogin: unknown service login/tcp.\n"); exit(1); } if (errno == ECONNREFUSED) warning("remote host doesn't support Kerberos"); if (errno == ENOENT) warning("can't provide Kerberos auth data"); goto try_connect; } } else { #ifdef CRYPT if (doencrypt) { (void)fprintf(stderr, "rlogin: the -x flag requires Kerberos authentication.\n"); exit(1); } #endif /* CRYPT */ rem = rcmd(&host, sp->s_port, pw->pw_name, user, term, 0); } #else rem = rcmd(&host, sp->s_port, pw->pw_name, user, term, 0); #endif /* KERBEROS */ if (rem < 0) exit(1); /* Enable BSD compatibility for urgent data. */ tcpopt.nwto_flags= NWTO_BSD_URG; error= ioctl(rem, NWIOSTCPOPT, &tcpopt); if (error == -1) { fprintf(stderr, "rlogin: NWIOSTCPOPT failed: %s\n", strerror(errno)); } (void)setuid(uid); doit(); /*NOTREACHED*/ } struct termios defattr, rawattr; #if __minix_vmd int mustsendwindow; #else int child; #endif static void doit() { struct termios sb; #if !__minix_vmd int r; #else asio_fd_set_t fd_set; struct fwait fw; int result; #endif (void)tcgetattr(0, &sb); defattr = sb; rawattr = sb; rawattr.c_iflag &= ~(ICRNL | IGNCR | INLCR | ISTRIP | IXOFF | IXON | PARMRK | IXANY); rawattr.c_oflag &= ~(OPOST); rawattr.c_lflag &= ~(ECHONL | ECHO | ICANON | IEXTEN | ISIG); (void)signal(SIGINT, SIG_IGN); setsignal(SIGHUP, exit); setsignal(SIGQUIT, exit); #if !__minix_vmd child = fork(); if (child == -1) { (void)fprintf(stderr, "rlogin: fork: %s.\n", strerror(errno)); done(1); } if (child == 0) { mode(1); r = reader(); if (r == 0) { msg("connection closed."); #ifdef BUGCHLD kill(getppid(), SIGCHLD); #endif exit(0); } sleep(1); msg("\007connection closed."); #ifdef BUGCHLD kill(getppid(), SIGCHLD); #endif exit(1); } (void)signal(SIGCHLD, catch_child); writer(); #else /* __minix_vmd */ mode(1); /* mark the file descriptors 0, 1, and rem as asynchronous. */ mark_async(0); mark_async(1); mark_async(rem); init_0(); init_1(); init_rd_rem(); init_wr_rem(); for (;;) { ASIO_FD_ZERO(&fd_set); fw.fw_flags= 0; fw.fw_bits= fd_set.afds_bits; fw.fw_maxfd= ASIO_FD_SETSIZE; if (more2read_0 && !inprogress_0) { restart_0(); fw.fw_flags |= FWF_NONBLOCK; } if (more2write_1 && !inprogress_1) { restart_1(); fw.fw_flags |= FWF_NONBLOCK; } if (more2read_rem && !inprogress_rd_rem) { restart_rd_rem(); fw.fw_flags |= FWF_NONBLOCK; } if (more2write_rem && !inprogress_wr_rem) { restart_wr_rem(); fw.fw_flags |= FWF_NONBLOCK; } if (more2read_0 && inprogress_0) ASIO_FD_SET(0, ASIO_READ, &fd_set); if (more2write_1 && inprogress_1) ASIO_FD_SET(1, ASIO_WRITE, &fd_set); if (more2read_rem && inprogress_rd_rem) ASIO_FD_SET(rem, ASIO_READ, &fd_set); if (more2write_rem && inprogress_wr_rem) ASIO_FD_SET(rem, ASIO_WRITE, &fd_set); for (;;) { result= fwait(&fw); if (result == -1 && (errno == EAGAIN || errno == EINTR)) { break; } if (result == -1) { fprintf(stderr, "fwait failed (%s)\n", strerror(errno)); exit(1); } assert(result == 0); #if 0 printf("fwait: fw_fw= %d, fw_operation= %d, fw_result= %d, fw.fw_errno= %d\n", fw.fw_fd, fw.fw_operation, fw.fw_result, fw.fw_errno); #endif if (fw.fw_fd == 0 && fw.fw_operation == ASIO_READ) { completed_0(fw.fw_result, fw.fw_errno); } else if (fw.fw_fd == 1 && fw.fw_operation == ASIO_WRITE) { completed_1(fw.fw_result, fw.fw_errno); } else if (fw.fw_fd == rem && fw.fw_operation == ASIO_READ) { completed_rd_rem(fw.fw_result, fw.fw_errno); } else if (fw.fw_fd == rem && fw.fw_operation == ASIO_WRITE) { completed_wr_rem(fw.fw_result, fw.fw_errno); } else { fprintf(stderr, "strange result from fwait: fd= %d, operation= %d\n", fw.fw_fd, fw.fw_operation); exit(1); } if (!(fw.fw_flags & FWF_MORE)) break; } if (mustsendwindow) { mustsendwindow= 0; sendwindow(); } } #endif /* __minix_vmd */ msg("connection closed."); done(0); } /* trap a signal, unless it is being ignored. */ static void setsignal(sig, act) int sig; void (*act) _ARGS(( int sig )); { if (signal(sig, act) == SIG_IGN) (void)signal(sig, SIG_IGN); } static void done(status) int status; { int w, wstatus; mode(0); #if !__minix_vmd if (child > 0) { /* make sure catch_child does not snap it up */ (void)signal(SIGCHLD, SIG_DFL); if (kill(child, SIGKILL) >= 0) while ((w = wait(&wstatus)) > 0 && w != child); } #endif exit(status); } int dosigwinch; #if !__minix void sigwinch(); #endif #if !__minix_vmd static void catch_child(sig) int sig; { int status; int pid; for (;;) { pid = waitpid(-1, &status, WNOHANG|WUNTRACED); if (pid == 0) return; /* if the child (reader) dies, just quit */ if (pid < 0 || pid == child && !WIFSTOPPED(status)) done(WTERMSIG(status) | WEXITSTATUS(status)); } /* NOTREACHED */ } #endif #if !__minix_vmd /* * writer: write to remote: 0 -> line. * ~. terminate * ~^Z suspend rlogin process. * ~<delayed-suspend char> suspend rlogin process, but leave reader alone. */ static void writer() { register int bol, local, n; u_char ch; int c; bol = 1; /* beginning of line */ local = 0; for (;;) { n = read(STDIN_FILENO, &ch, 1); if (n <= 0) { if (n < 0 && errno == EINTR) continue; break; } c = ch; /* * If we're at the beginning of the line and recognize a * command character, then we echo locally. Otherwise, * characters are echo'd remotely. If the command character * is doubled, this acts as a force and local echo is * suppressed. */ if (bol) { bol = 0; if (!noescape && c == escapechar) { local = 1; continue; } } else if (local) { local = 0; if (c == '.' || c == defattr.c_cc[VEOF]) { echo(c); break; } #if !__minix if (c == defattr.c_cc[VSUSP]) { bol = 1; echo(c); stop(c); continue; } #endif if (c != escapechar) #ifdef CRYPT #ifdef KERBEROS if (doencrypt) (void)des_write(rem, &escapechar, 1); else #endif #endif (void)write(rem, &escapechar, 1); } ch = c; #ifdef CRYPT #ifdef KERBEROS if (doencrypt) { if (des_write(rem, &ch, 1) == 0) { msg("line gone"); break; } } else #endif #endif if (write(rem, &ch, 1) == 0) { msg("line gone"); break; } bol = c == defattr.c_cc[VKILL] || c == defattr.c_cc[VEOF] || c == defattr.c_cc[VINTR] || c == defattr.c_cc[VSUSP] || c == '\r' || c == '\n'; } } #endif #if !__minix_vmd static void echo(c) int c; { register char *p; char buf[8]; p = buf; c &= 0177; *p++ = escapechar; if (c < ' ') { *p++ = '^'; *p++ = c + '@'; } else if (c == 0177) { *p++ = '^'; *p++ = '?'; } else *p++ = c; *p++ = '\r'; *p++ = '\n'; (void)write(STDOUT_FILENO, buf, p - buf); } #endif #if !__minix stop(cmdc) char cmdc; { mode(0); (void)signal(SIGCHLD, SIG_IGN); (void)kill(cmdc == defltc.t_suspc ? 0 : getpid(), SIGTSTP); (void)signal(SIGCHLD, catch_child); mode(1); sigwinch(); /* check for size changes */ } #endif #ifdef SIGWINCH static void sigwinch(sig) int sig; { struct winsize ws; #if __minix signal(SIGWINCH, sigwinch); #endif if (dosigwinch && get_window_size(0, &ws) == 0 && memcmp(&ws, &winsize, sizeof(ws))) { winsize = ws; mustsendwindow= 1; } } /* * Send the window size to the server via the magic escape */ static void sendwindow() { struct winsize *wp; char *obuf, *new_buf; new_buf= realloc(extra_wr_rem_new, extra_wr_rem_new_size+4+sizeof(*wp)); if (new_buf == 0) return; extra_wr_rem_new= new_buf; obuf= new_buf+extra_wr_rem_new_size; extra_wr_rem_new_size += 4+sizeof(*wp); more2read_0= 0; more2write_rem= 1; wp = (struct winsize *)(obuf+4); obuf[0] = 0377; obuf[1] = 0377; obuf[2] = 's'; obuf[3] = 's'; wp->ws_row = htons(winsize.ws_row); wp->ws_col = htons(winsize.ws_col); wp->ws_xpixel = htons(winsize.ws_xpixel); wp->ws_ypixel = htons(winsize.ws_ypixel); } #endif /* SIGWINCH */ #if !__minix_vmd /* * reader: read from remote: line -> 1 */ #define READING 1 #define WRITING 2 int rcvcnt, rcvstate; char rcvbuf[8 * 1024]; static int reader() { int pid = -getpid(); int n, remaining; char *bufp = rcvbuf; for (;;) { while ((remaining = rcvcnt - (bufp - rcvbuf)) > 0) { rcvstate = WRITING; n = write(STDOUT_FILENO, bufp, remaining); if (n < 0) { if (errno != EINTR) return(-1); continue; } bufp += n; } bufp = rcvbuf; rcvcnt = 0; rcvstate = READING; #ifdef CRYPT #ifdef KERBEROS if (doencrypt) rcvcnt = des_read(rem, rcvbuf, sizeof(rcvbuf)); else #endif #endif rcvcnt = read(rem, rcvbuf, sizeof (rcvbuf)); if (rcvcnt == 0) return (0); if (rcvcnt < 0) { if (errno == EINTR) continue; if (errno == EURG) { nwio_tcpopt_t tcpopt; #if DEBUG fprintf(stderr, "\n\rEURG\n\r"); #endif tcpopt.nwto_flags= NWTO_RCV_URG; if (ioctl(rem, NWIOSTCPOPT, &tcpopt) == -1) { fprintf(stderr, "rlogin: trouble with urgent data: %s\n", strerror(errno)); return(-1); } continue; } if (errno == ENOURG) { nwio_tcpopt_t tcpopt; #if DEBUG fprintf(stderr, "\n\rENOURG\n\r"); #endif tcpopt.nwto_flags= NWTO_RCV_NOTURG; if (ioctl(rem, NWIOSTCPOPT, &tcpopt) == -1) { fprintf(stderr, "rlogin: trouble with not-urgent data: %s\n", strerror(errno)); return(-1); } continue; } (void)fprintf(stderr, "rlogin: read: %s\n", strerror(errno)); return(-1); } } } #endif /* !__minix_vmd */ static void mode(f) int f; { struct termios *sb; switch(f) { case 0: sb= &defattr; break; case 1: sb= &rawattr; break; default: return; } (void)tcsetattr(0, TCSAFLUSH, sb); } static void lostpeer(sig) int sig; { (void)signal(SIGPIPE, SIG_IGN); msg("\007connection closed."); done(1); } static void msg(str) char *str; { (void)fprintf(stderr, "rlogin: %s\r\n", str); } #ifdef KERBEROS /* VARARGS */ warning(va_alist) va_dcl { va_list ap; char *fmt; (void)fprintf(stderr, "rlogin: warning, using standard rlogin: "); va_start(ap); fmt = va_arg(ap, char *); vfprintf(stderr, fmt, ap); va_end(ap); (void)fprintf(stderr, ".\n"); } #endif static void usage() { (void)fprintf(stderr, "Usage: rlogin [-%s]%s[-e char] [-l username] host\n", #ifdef KERBEROS #ifdef CRYPT "8ELx", " [-k realm] "); #else "8EL", " [-k realm] "); #endif #else "8EL", " "); #endif exit(1); } /* * The following routine provides compatibility (such as it is) between 4.2BSD * Suns and others. Suns have only a `ttysize', so we convert it to a winsize. */ #ifdef sun get_window_size(fd, wp) int fd; struct winsize *wp; { struct ttysize ts; int error; if ((error = ioctl(0, TIOCGSIZE, &ts)) != 0) return(error); wp->ws_row = ts.ts_lines; wp->ws_col = ts.ts_cols; wp->ws_xpixel = 0; wp->ws_ypixel = 0; return(0); } #endif static u_char getescape(p) register char *p; { long val; int len; if ((len = strlen(p)) == 1) /* use any single char, including '\' */ return((u_char)*p); /* otherwise, \nnn */ if (*p == '\\' && len >= 2 && len <= 4) { val = strtol(++p, (char **)NULL, 8); for (;;) { if (!*++p) return((u_char)val); if (*p < '0' || *p > '8') break; } } msg("illegal option value -- e"); usage(); /* NOTREACHED */ } static char * speeds2str(speed) speed_t speed; { int i; for (i= 0; speeds[i].name != NULL && speeds[i].speed != speed; i++) { if (speeds[i].speed == speed) return speeds[i].name; } return "unknown"; } #if __minix_vmd static void mark_async(fd) int fd; { int result; int v; result= fcntl(fd, F_GETFD); if (result == -1) { fprintf(stderr, "rlogin: mark_async: fcntl(%d, GETFD) failed (%s)\n", fd, strerror(errno)); exit(1); } v= result | FD_ASYNCHIO; result= fcntl(fd, F_SETFD, v); if (result == -1) { fprintf(stderr, "rlogin: mark_async: fcntl(%d, SETFD, %d) failed (%s)\n", fd, v, strerror(errno)); exit(1); } } #define RD_0_BUFSIZE 256 char rd_0_buf[RD_0_BUFSIZE]; size_t rd_0_offset; static void init_0() { more2read_0= 1; inprogress_0= 0; rd_0_offset= 0; } size_t wr_1_size; size_t wr_1_offset; char *urg_1; size_t urg_1_size; char *extra_1; size_t extra_1_size; size_t extra_1_offset; char *extra_1_new; size_t extra_1_new_size; #define MAX_EXTRA_1_NEW_SIZE (16*1024) static void init_1() { more2write_1= 0; inprogress_1= 0; wr_1_size= 0; wr_1_offset= 0; urg_1= NULL; urg_1_size= 0; extra_1= NULL; extra_1_size= 0; extra_1_offset= 0; extra_1_new= NULL; extra_1_new_size= 0; } #define RD_REM_BUFSIZE (8*1024) char rd_rem_buf[RD_REM_BUFSIZE]; size_t rd_rem_offset; int rd_rem_urg; static void init_rd_rem() { more2read_rem= 1; inprogress_rd_rem= 0; rd_rem_offset= 0; rd_rem_urg= 0; } static void init_wr_rem() { more2write_rem= 0; inprogress_wr_rem= 0; wr_rem_size= 0; wr_rem_offset= 0; extra_wr_rem_size= 0; extra_wr_rem_offset= 0; extra_wr_rem= NULL; extra_wr_rem_new_size= 0; extra_wr_rem_new= NULL; } static void restart_0() { size_t offset; int result, error; assert(!inprogress_0); rd_0_offset= 1; offset= 0; while (offset < RD_0_BUFSIZE) { result= read(0, rd_0_buf+rd_0_offset+offset, RD_0_BUFSIZE-rd_0_offset-offset); if (result > 0) { offset += result; assert(rd_0_offset+offset <= RD_0_BUFSIZE); continue; } error= errno; if (offset != 0) completed_0(offset, 0); rd_0_offset += offset; if (result == -1 && error == EINPROGRESS) { inprogress_0= 1; return; } completed_0(result, error); return; } completed_0(offset, 0); } static void restart_1() { size_t offset; int result, error; assert(!inprogress_1); while (extra_1 != NULL || extra_1_new != NULL) { if (extra_1 == NULL) { extra_1= extra_1_new; extra_1_new= NULL; extra_1_size= extra_1_new_size; extra_1_new_size= 0; extra_1_offset= 0; } offset= 0; #if DEBUG if (extra_1_size == 0) fprintf(stderr, "restart_1: extra_1_size= 0\n"); #endif while (offset < extra_1_size) { result= write(1, extra_1+extra_1_offset+offset, extra_1_size-offset); if (result > 0) { assert (result <= extra_1_size-offset); offset += result; continue; } error= errno; if (offset != 0) completed_1(offset, 0); if (result == -1 && errno == EINPROGRESS) { inprogress_1= 1; return; } completed_1(result, errno); return; } completed_1(offset, 0); } offset= 0; if (wr_1_size == 0) { more2write_1= 0; more2read_rem= 1; return; } while (offset < wr_1_size) { result= write(1, rd_rem_buf+wr_1_offset+offset, wr_1_size-offset); if (result > 0) { assert (result <= wr_1_size-offset); offset += result; continue; } error= errno; if (offset != 0) completed_1(offset, 0); if (result == -1 && errno == EINPROGRESS) { inprogress_1= 1; return; } completed_1(result, errno); return; } completed_1(offset, 0); } static void restart_rd_rem() { size_t offset; int result, error; assert(!inprogress_rd_rem); rd_rem_offset= 0; offset= 0; while (offset < RD_REM_BUFSIZE) { result= read(rem, rd_rem_buf+offset, RD_REM_BUFSIZE-offset); if (result > 0) { offset += result; assert(offset <= RD_REM_BUFSIZE); continue; } error= errno; if (offset != 0) completed_rd_rem(offset, 0); rd_rem_offset= offset; if (result == -1 && error == EINPROGRESS) { inprogress_rd_rem= 1; return; } completed_rd_rem(result, error); return; } completed_rd_rem(offset, 0); } static void restart_wr_rem() { size_t offset; int result, error; assert(!inprogress_wr_rem); if (extra_wr_rem_new != NULL && extra_wr_rem == NULL) { extra_wr_rem= extra_wr_rem_new; extra_wr_rem_size= extra_wr_rem_new_size; extra_wr_rem_offset= 0; extra_wr_rem_new= NULL; extra_wr_rem_new_size= 0; } if (extra_wr_rem != NULL) { offset= 0; while (offset < extra_wr_rem_size) { result= write(rem, extra_wr_rem+extra_wr_rem_offset+offset, extra_wr_rem_size-offset); if (result > 0) { assert (result <= extra_wr_rem_size-offset); offset += result; continue; } error= errno; if (offset != 0) completed_wr_rem(offset, 0); if (result == -1 && errno == EINPROGRESS) { inprogress_wr_rem= 1; return; } completed_wr_rem(result, errno); return; } completed_wr_rem(offset, 0); } if (wr_rem_size == 0) return; offset= 0; while (offset < wr_rem_size) { result= write(rem, rd_0_buf+wr_rem_offset+offset, wr_rem_size-offset); if (result > 0) { assert (result <= wr_rem_size-offset); offset += result; continue; } error= errno; if (offset != 0) completed_wr_rem(offset, 0); if (result == -1 && errno == EINPROGRESS) { inprogress_wr_rem= 1; return; } completed_wr_rem(result, errno); return; } completed_wr_rem(offset, 0); } static void completed_0(result, error) int result; int error; { static int bol= 0, local= 0; char *iptr, *optr; int i; u_char c; inprogress_0= 0; if (result > 0) { assert(rd_0_offset > 0); wr_rem_offset= 1; iptr= rd_0_buf+rd_0_offset; optr= rd_0_buf+wr_rem_offset; for (i= 0; i<result; iptr++, i++) { c= *iptr; if (bol) { bol= 0; if (!noescape && c == escapechar) { local= 1; continue; } } else if (local) { local= 0; if (c == '.' || (c != _POSIX_VDISABLE && c == defattr.c_cc[VEOF])) { echo(c); finish(); /* NOTREACHED */ } if (c == '!') { subshell(); continue; } if (c != escapechar) { if (optr < iptr) { *(optr++)= escapechar; } else { assert(optr == iptr); assert(iptr == rd_0_buf+ rd_0_offset); assert(rd_0_offset > 0); wr_rem_offset--; optr[-1]= escapechar; } } } *(optr++)= c; bol= (c != _POSIX_VDISABLE) && (c == defattr.c_cc[VKILL] || c == defattr.c_cc[VEOF] || c == defattr.c_cc[VINTR] || c == defattr.c_cc[VSUSP] || c == '\r' || c == '\n'); } wr_rem_size += optr-rd_0_buf-wr_rem_offset; if (wr_rem_size != 0) { more2read_0= 0; more2write_rem= 1; } return; } else if (result < 0) { fprintf(stderr, "rlogin: %s\n", strerror(error)); } done(1); } static void completed_1(result, error) int result; int error; { inprogress_1= 0; if (result > 0) { if (extra_1 != NULL) { assert (result <= extra_1_size); extra_1_size -= result; extra_1_offset += result; if (extra_1_size == 0) { more2write_1= 0; more2read_rem= 1; free(extra_1); extra_1= NULL; } return; } assert (result <= wr_1_size); wr_1_size -= result; wr_1_offset += result; if (wr_1_size == 0) { more2write_1= 0; more2read_rem= 1; } return; } else if (result < 0) { fprintf(stderr, "rlogin: %s\n", strerror(error)); } done(1); } static void completed_rd_rem(result, error) int result; int error; { nwio_tcpopt_t tcpopt; char *new_buf; size_t keep_size; u_char urg_byte; int i; inprogress_rd_rem= 0; if (result > 0) { if (rd_rem_urg) { #if DEBUG fprintf(stderr, "\n\r%d urg bytes\n\r", result); #endif if (urg_1_size > MAX_EXTRA_1_NEW_SIZE) { keep_size= MAX_EXTRA_1_NEW_SIZE/2; memmove(urg_1, urg_1+urg_1_size-keep_size, keep_size); urg_1_size= keep_size; } new_buf= realloc(urg_1, urg_1_size+result); if (new_buf == NULL) { fprintf(stderr, "rlogin: warning realloc %d failed\n", urg_1_size+result); return; } memcpy(new_buf+urg_1_size, rd_rem_buf+rd_rem_offset, result); urg_1= new_buf; urg_1_size += result; return; } more2read_rem= 0; more2write_1= 1; wr_1_size= result; wr_1_offset= rd_rem_offset; return; } if (result == -1 && error == EURG) { #if DEBUG fprintf(stderr, "\n\rEURG\n\r"); #endif rd_rem_urg= 1; tcpopt.nwto_flags= NWTO_RCV_URG; result= ioctl(rem, NWIOSTCPOPT, &tcpopt); if (result == -1) { fprintf(stderr, "rlogin: NWIOSTCPOPT on %d failed (%s)\n", rem, strerror(errno)); exit(1); } return; } if (result == -1 && error == ENOURG) { #if DEBUG fprintf(stderr, "\n\rENOURG\n\r"); #endif rd_rem_urg= 0; tcpopt.nwto_flags= NWTO_RCV_NOTURG; result= ioctl(rem, NWIOSTCPOPT, &tcpopt); if (result == -1) { fprintf(stderr, "rlogin: NWIOSTCPOPT on %d failed (%s)\n", rem, strerror(errno)); exit(1); } if (urg_1_size != 0) { urg_byte= urg_1[urg_1_size-1]; urg_1_size--; do_urg(urg_byte); if (urg_1_size == 0) return; if (extra_1_new_size + urg_1_size > MAX_EXTRA_1_NEW_SIZE) { extra_1_new_size= 0; free(extra_1_new); extra_1_new= NULL; } if (extra_1_new_size != 0) { new_buf= realloc(extra_1_new, extra_1_new_size+urg_1_size); if (new_buf == 0) { extra_1_new_size= 0; free(extra_1_new); extra_1_new= NULL; } else { extra_1_new= new_buf; memcpy(extra_1_new+extra_1_new_size, urg_1, urg_1_size); extra_1_new_size += urg_1_size; urg_1_size= 0; free(urg_1); urg_1= NULL; } } if (extra_1_new_size == 0) { extra_1_new_size= urg_1_size; extra_1_new= urg_1; urg_1_size= 0; urg_1= NULL; } more2read_rem= 0; more2write_1= 1; } return; } if (result == -1 && error == EINTR) { /* Never mind. */ return; } if (result == 0) { msg("connection closed."); done(0); } if (result < 0) { fprintf(stderr, "rlogin: %s\n", strerror(error)); } done(1); } static void completed_wr_rem(result, error) int result; int error; { inprogress_wr_rem= 0; if (result > 0) { if (extra_wr_rem != NULL) { assert (result <= extra_wr_rem_size); extra_wr_rem_size -= result; extra_wr_rem_offset += result; if (extra_wr_rem_size == 0) { free(extra_wr_rem); extra_wr_rem= NULL; if (wr_rem_size == 0) { more2write_rem= 0; more2read_0= 1; } } return; } assert (result <= wr_rem_size); wr_rem_size -= result; wr_rem_offset += result; if (wr_rem_size == 0) { more2write_rem= 0; more2read_0= 1; } return; } if (result < 0) { fprintf(stderr, "rlogin: %s\n", strerror(error)); } done(1); } static void do_urg(urg_byte) int urg_byte; { #if DEBUG fprintf(stderr, "rlogin: warning got urg_byte 0x%x\r\n", urg_byte); #endif if (urg_byte & TIOCPKT_WINDOW) { if (dosigwinch == 0) { sendwindow(); signal(SIGWINCH, sigwinch); } dosigwinch= 1; } } static void echo(c) int c; { u_char c1; char *new_buf; new_buf= realloc(extra_1_new, extra_1_new_size+6); if (new_buf == NULL) return; extra_1_new= new_buf; new_buf= extra_1_new+extra_1_new_size; c1= escapechar; if (c1 < ' ') { *new_buf++= '^'; *new_buf++= c1 + '@'; } else if (c1 == 0x7f) { *new_buf++= '^'; *new_buf++= '?'; } else *new_buf++= c1; if (c < ' ') { *new_buf++= '^'; *new_buf++= c + '@'; } else if (c == 0x7f) { *new_buf++= '^'; *new_buf++= '?'; } else *new_buf++= c; *new_buf++= '\r'; *new_buf++= '\n'; extra_1_new_size= new_buf-extra_1_new; more2write_1= 1; } static void finish() { done(0); } static char cmdbuf[256]; static void subshell() { /* Start a subshell. Based on the first character of the command, * the tcp connection will be present at fd 3 ('+'), or at * fd 0 and fd 1 ('=') */ int r, pid, stat, len; char *shell, *cmd; /* cancel the reads and writes that are in progress. */ if (inprogress_0) { r= fcancel(0, ASIO_READ); if (r != 0) abort(); } if (inprogress_1) { r= fcancel(1, ASIO_WRITE); if (r != 0) abort(); } if (inprogress_rd_rem) { r= fcancel(rem, ASIO_READ); if (r != 0) abort(); } if (inprogress_wr_rem) { r= fcancel(rem, ASIO_WRITE); if (r != 0) abort(); } mode(0); pid= fork(); if (pid == -1) abort(); if (pid != 0) { r= waitpid(pid, &stat, 0); if (r != pid) abort(); #if DEBUG fprintf(stderr, "stat: 0x%x\n", stat); #endif mode(1); return; } (void)signal(SIGINT, SIG_DFL); shell= getenv("SHELL"); if (shell == NULL) shell= "/bin/sh"; printf("~!\ncommand [%s]: ", shell); cmd= fgets(cmdbuf, sizeof(cmdbuf), stdin); if (cmd == NULL) exit(0); #if DEBUG printf("got command '%s'\n", cmd); #endif /* Strip the trailing newline */ len= strlen(cmd); if (len > 0 && cmd[len-1] == '\n') cmd[len-1]= '\0'; else printf("\n"); /* Skip leading white space */ while (*cmd != '\0' && isspace(*cmd)) cmd++; if (*cmd == '+') { if (rem != 3) { dup2(rem, 3); close(rem); } cmd++; } else if (*cmd == '=') { dup2(rem, 0); dup2(rem, 1); close(rem); cmd++; } else close(rem); if (*cmd == '\0') { r= execl(shell, shell, NULL); } else { r= execl("/bin/sh", "sh", "-c", cmd, NULL); } printf("exec failed: %d, %d\n", r, errno); exit(0); } #endif /* __minix_vmd */ ����������������������������������������������������������������/* rmdir - remove a directory Author: Bruce Evans */ #include <minix/minlib.h> #include <sys/types.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char **argv; { int error; char *prog_name; int save_errno; prog_name = argv[0]; if (argc < 2) { std_err("Usage: "); std_err(prog_name); std_err(" dir...\n"); exit(1); } error = 0; while (--argc != 0) { if (rmdir(*++argv) != 0) { save_errno = errno; std_err(prog_name); std_err(": "); errno = save_errno; perror(*argv); error = 1; } } return(error); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*- * Copyright (c) 1983, 1990 The Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint char copyright[] = "@(#) Copyright (c) 1983, 1990 The Regents of the University of California.\n\ All rights reserved.\n"; #endif /* not lint */ #ifndef lint static char sccsid[] = "@(#)rsh.c 5.24 (Berkeley) 7/1/91"; #endif /* not lint */ /* * $Source: mit/rsh/RCS/rsh.c,v $ * $Header: mit/rsh/RCS/rsh.c,v 5.1 89/07/31 19:28:59 kfall Exp Locker: kfall $ */ #if _MINIX #include <sys/types.h> #include <sys/ioctl.h> #include <errno.h> #include <pwd.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/netlib.h> #include <net/gen/netdb.h> void main _ARGS(( int argc, char *argv[] )); void usage _ARGS(( void )); char *copyargs _ARGS(( char **argv )); void sendsig _ARGS(( int signo )); void talk _ARGS(( int nflag, long omask, int pid, int rem )); #define _PATH_RLOGIN "/usr/bin/rlogin" typedef unsigned u_int; #else #include <sys/types.h> #include <sys/signal.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/file.h> #include <netinet/in.h> #include <netdb.h> #include <pwd.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <varargs.h> #include "pathnames.h" #endif #ifdef KERBEROS #include <kerberosIV/des.h> #include <kerberosIV/krb.h> CREDENTIALS cred; Key_schedule schedule; int use_kerberos = 1, doencrypt; char dst_realm_buf[REALM_SZ], *dest_realm; extern char *krb_realmofhost(); #endif /* * rsh - remote shell */ extern int errno; int rfd2; void main(argc, argv) int argc; char **argv; { extern char *optarg; extern int optind; struct passwd *pw; struct servent *sp; long omask; int argoff, asrsh, ch, dflag, nflag, one, pid, rem, uid; register char *p; char *args, *host, *user; #if !_MINIX char *copyargs(); void sendsig(); #endif argoff = asrsh = dflag = nflag = 0; one = 1; host = user = NULL; /* if called as something other than "rsh", use it as the host name */ if (p = rindex(argv[0], '/')) ++p; else p = argv[0]; if (strcmp(p, "rsh")) host = p; else asrsh = 1; /* handle "rsh host flags" */ if (!host && argc > 2 && argv[1][0] != '-') { host = argv[1]; argoff = 1; } #ifdef KERBEROS #ifdef CRYPT #define OPTIONS "8KLdek:l:nwx" #else #define OPTIONS "8KLdek:l:nw" #endif #else #define OPTIONS "8KLdel:nw" #endif while ((ch = getopt(argc - argoff, argv + argoff, OPTIONS)) != EOF) switch(ch) { case 'K': #ifdef KERBEROS use_kerberos = 0; #endif break; case 'L': /* -8Lew are ignored to allow rlogin aliases */ case 'e': case 'w': case '8': break; case 'd': dflag = 1; break; case 'l': user = optarg; break; #ifdef KERBEROS case 'k': dest_realm = dst_realm_buf; strncpy(dest_realm, optarg, REALM_SZ); break; #endif case 'n': nflag = 1; break; #ifdef KERBEROS #ifdef CRYPT case 'x': doencrypt = 1; des_set_key(cred.session, schedule); break; #endif #endif case '?': default: usage(); } optind += argoff; /* if haven't gotten a host yet, do so */ if (!host && !(host = argv[optind++])) usage(); /* if no further arguments, must have been called as rlogin. */ if (!argv[optind]) { if (asrsh) *argv = "rlogin"; execv(_PATH_RLOGIN, argv); (void)fprintf(stderr, "rsh: can't exec %s.\n", _PATH_RLOGIN); exit(1); } argc -= optind; argv += optind; if (!(pw = getpwuid(uid = getuid()))) { (void)fprintf(stderr, "rsh: unknown user id.\n"); exit(1); } if (!user) user = pw->pw_name; #ifdef KERBEROS #ifdef CRYPT /* -x turns off -n */ if (doencrypt) nflag = 0; #endif #endif args = copyargs(argv); sp = NULL; #ifdef KERBEROS if (use_kerberos) { sp = getservbyname((doencrypt ? "ekshell" : "kshell"), "tcp"); if (sp == NULL) { use_kerberos = 0; warning("can't get entry for %s/tcp service", doencrypt ? "ekshell" : "kshell"); } } #endif if (sp == NULL) sp = getservbyname("shell", "tcp"); if (sp == NULL) { (void)fprintf(stderr, "rsh: shell/tcp: unknown service.\n"); exit(1); } #ifdef KERBEROS try_connect: if (use_kerberos) { rem = KSUCCESS; errno = 0; if (dest_realm == NULL) dest_realm = krb_realmofhost(host); #ifdef CRYPT if (doencrypt) rem = krcmd_mutual(&host, sp->s_port, user, args, &rfd2, dest_realm, &cred, schedule); else #endif rem = krcmd(&host, sp->s_port, user, args, &rfd2, dest_realm); if (rem < 0) { use_kerberos = 0; sp = getservbyname("shell", "tcp"); if (sp == NULL) { (void)fprintf(stderr, "rsh: unknown service shell/tcp.\n"); exit(1); } if (errno == ECONNREFUSED) warning("remote host doesn't support Kerberos"); if (errno == ENOENT) warning("can't provide Kerberos auth data"); goto try_connect; } } else { if (doencrypt) { (void)fprintf(stderr, "rsh: the -x flag requires Kerberos authentication.\n"); exit(1); } rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, &rfd2); } #else rem = rcmd(&host, sp->s_port, pw->pw_name, user, args, &rfd2); #endif if (rem < 0) exit(1); if (rfd2 < 0) { (void)fprintf(stderr, "rsh: can't establish stderr.\n"); exit(1); } #if !_MINIX if (dflag) { if (setsockopt(rem, SOL_SOCKET, SO_DEBUG, &one, sizeof(one)) < 0) (void)fprintf(stderr, "rsh: setsockopt: %s.\n", strerror(errno)); if (setsockopt(rfd2, SOL_SOCKET, SO_DEBUG, &one, sizeof(one)) < 0) (void)fprintf(stderr, "rsh: setsockopt: %s.\n", strerror(errno)); } #endif (void)setuid(uid); #if !_MINIX omask = sigblock(sigmask(SIGINT)|sigmask(SIGQUIT)|sigmask(SIGTERM)); #endif if (signal(SIGINT, SIG_IGN) != SIG_IGN) (void)signal(SIGINT, sendsig); if (signal(SIGQUIT, SIG_IGN) != SIG_IGN) (void)signal(SIGQUIT, sendsig); if (signal(SIGTERM, SIG_IGN) != SIG_IGN) (void)signal(SIGTERM, sendsig); if (!nflag) { pid = fork(); if (pid < 0) { (void)fprintf(stderr, "rsh: fork: %s.\n", strerror(errno)); exit(1); } } #ifdef KERBEROS #ifdef CRYPT if (!doencrypt) #endif #endif { #if _MINIX ; #else (void)ioctl(rfd2, FIONBIO, &one); (void)ioctl(rem, FIONBIO, &one); #endif } talk(nflag, omask, pid, rem); if (!nflag && pid) { /* printf("killing %d with %d\n", pid, SIGKILL); */ (void)kill(pid, SIGKILL); } exit(0); } void talk(nflag, omask, pid, rem) int nflag, pid; long omask; register int rem; { register int cc, wc;VQ��XQ��YQ��ZQ��[Q���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� register char *bp; int readfrom, ready, rembits; char buf[BUFSIZ]; #if _MINIX int pid1; #endif if (!nflag && pid == 0) { (void)close(rfd2); reread: errno = 0; if ((cc = read(0, buf, sizeof buf)) <= 0) goto done; bp = buf; rewrite: #if !_MINIX rembits = 1 << rem; if (select(16, 0, &rembits, 0, 0) < 0) { if (errno != EINTR) { (void)fprintf(stderr, "rsh: select: %s.\n", strerror(errno)); exit(1); } goto rewrite; } if ((rembits & (1 << rem)) == 0) goto rewrite; #endif #ifdef KERBEROS #ifdef CRYPT if (doencrypt) wc = des_write(rem, bp, cc); else #endif #endif wc = write(rem, bp, cc); if (wc < 0) { #if !_MINIX if (errno == EWOULDBLOCK) goto rewrite; #endif goto done; } bp += wc; cc -= wc; if (cc == 0) goto reread; goto rewrite; done: #if _MINIX ioctl(rem, NWIOTCPSHUTDOWN, NULL); #else (void)shutdown(rem, 1); #endif exit(0); } #if _MINIX pid1= fork(); if (pid1 == -1) { (void)fprintf(stderr, "rsh: fork: %s.\n", strerror(errno)); exit(1); } close (pid1 ? rfd2 : rem); for(;;) { errno = 0; cc = read(pid1 ? rem : rfd2, buf, sizeof buf); if (cc <= 0) { if (pid1) { /* printf("killing %d with %d\n", pid1, SIGKILL); */ kill(pid1, SIGKILL); return; } exit(0); } (void)write(pid1 ? 1 : 2, buf, cc); } #else (void)sigsetmask(omask); readfrom = (1 << rfd2) | (1 << rem); do { ready = readfrom; if (select(16, &ready, 0, 0, 0) < 0) { if (errno != EINTR) { (void)fprintf(stderr, "rsh: select: %s.\n", strerror(errno)); exit(1); } continue; } if (ready & (1 << rfd2)) { errno = 0; #ifdef KERBEROS #ifdef CRYPT if (doencrypt) cc = des_read(rfd2, buf, sizeof buf); else #endif #endif cc = read(rfd2, buf, sizeof buf); if (cc <= 0) { if (errno != EWOULDBLOCK) readfrom &= ~(1 << rfd2); } else (void)write(2, buf, cc); } if (ready & (1 << rem)) { errno = 0; #ifdef KERBEROS #ifdef CRYPT if (doencrypt) cc = des_read(rem, buf, sizeof buf); else #endif #endif cc = read(rem, buf, sizeof buf); if (cc <= 0) { if (errno != EWOULDBLOCK) readfrom &= ~(1 << rem); } else (void)write(1, buf, cc); } } while (readfrom); #endif } void sendsig(signo) char signo; { #ifdef KERBEROS #ifdef CRYPT if (doencrypt) (void)des_write(rfd2, &signo, 1); else #endif #endif (void)write(rfd2, &signo, 1); } #ifdef KERBEROS /* VARARGS */ warning(va_alist) va_dcl { va_list ap; char *fmt; (void)fprintf(stderr, "rsh: warning, using standard rsh: "); va_start(ap); fmt = va_arg(ap, char *); vfprintf(stderr, fmt, ap); va_end(ap); (void)fprintf(stderr, ".\n"); } #endif char * copyargs(argv) char **argv; { register int cc; register char **ap, *p; char *args; #if !_MINIX char *malloc(); #endif cc = 0; for (ap = argv; *ap; ++ap) cc += strlen(*ap) + 1; if (!(args = malloc((u_int)cc))) { (void)fprintf(stderr, "rsh: %s.\n", strerror(ENOMEM)); exit(1); } for (p = args, ap = argv; *ap; ++ap) { (void)strcpy(p, *ap); for (p = strcpy(p, *ap); *p; ++p); if (ap[1]) *p++ = ' '; } return(args); } void usage() { (void)fprintf(stderr, "usage: rsh [-nd%s]%s[-l login] host [command]\n", #ifdef KERBEROS #ifdef CRYPT "x", " [-k realm] "); #else "", " [-k realm] "); #endif #else "", " "); #endif exit(1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sed - stream editor Author: Eric S. Raymond */ /* This used to be three different files with the following makefile: * (Note the chmem). CFLAGS= -F -T. OBJS= sedcomp.s sedexec.s sed: $(OBJS) cc -T. -o sed $(OBJS) @chmem =13312 sed $(OBJS): sed.h * If you want longer lines: increase MAXBUF. * If you want scripts with more text: increase POOLSIZE. * If you want more commands per script: increase MAXCMDS. */ #include <ctype.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> /*+++++++++++++++*/ /* Sed.h -- types and constants for the stream editor */ /* Data area sizes used by both modules */ #define MAXBUF 4000 /* current line buffer size */ #define MAXAPPENDS 20 /* maximum number of appends */ #define MAXTAGS 9 /* tagged patterns are \1 to \9 */ /* Constants for compiled-command representation */ #define EQCMD 0x01 /* = -- print current line number */ #define ACMD 0x02 /* a -- append text after current line */ #define BCMD 0x03 /* b -- branch to label */ #define CCMD 0x04 /* c -- change current line */ #define DCMD 0x05 /* d -- delete all of pattern space */ #define CDCMD 0x06 /* D -- delete first line of pattern space */ #define GCMD 0x07 /* g -- copy hold space to pattern space */ #define CGCMD 0x08 /* G -- append hold space to pattern space */ #define HCMD 0x09 /* h -- copy pattern space to hold space */ #define CHCMD 0x0A /* H -- append pattern space to hold space */ #define ICMD 0x0B /* i -- insert text before current line */ #define LCMD 0x0C /* l -- print pattern space in escaped form */ #define NCMD 0x0D /* n -- get next line into pattern space */ #define CNCMD 0x0E /* N -- append next line to pattern space */ #define PCMD 0x0F /* p -- print pattern space to output */ #define CPCMD 0x10 /* P -- print first line of pattern space */ #define QCMD 0x11 /* q -- exit the stream editor */ #define RCMD 0x12 /* r -- read in a file after current line */ #define SCMD 0x13 /* s -- regular-expression substitute */ #define TCMD 0x14 /* t -- branch on any substitute successful */ #define CTCMD 0x15 /* T -- branch on any substitute failed */ #define WCMD 0x16 /* w -- write pattern space to file */ #define CWCMD 0x17 /* W -- write first line of pattern space */ #define XCMD 0x18 /* x -- exhange pattern and hold spaces */ #define YCMD 0x19 /* y -- transliterate text */ struct cmd_t { /* compiled-command representation */ char *addr1; /* first address for command */ char *addr2; /* second address for command */ union { char *lhs; /* s command lhs */ struct cmd_t *link; /* label link */ } u; char command; /* command code */ char *rhs; /* s command replacement string */ FILE *fout; /* associated output file descriptor */ struct { char allbut; /* was negation specified? */ char global; /* was g postfix specified? */ char print; /* was p postfix specified? */ char inrange; /* in an address range? */ } flags; }; typedef struct cmd_t sedcmd; /* use this name for declarations */ #define BAD ((char *) -1) /* guaranteed not a string ptr */ /* Address and regular expression compiled-form markers */ #define STAR 1 /* marker for Kleene star */ #define CCHR 2 /* non-newline character to be matched * follows */ #define CDOT 4 /* dot wild-card marker */ #define CCL 6 /* character class follows */ #define CNL 8 /* match line start */ #define CDOL 10 /* match line end */ #define CBRA 12 /* tagged pattern start marker */ #define CKET 14 /* tagged pattern end marker */ #define CBACK 16 /* backslash-digit pair marker */ #define CLNUM 18 /* numeric-address index follows */ #define CEND 20 /* symbol for end-of-source */ #define CEOF 22 /* end-of-field mark */ /* Sed.h ends here */ #ifndef CMASK #define CMASK 0xFF /* some char type should have been unsigned * char? */ #endif /*+++++++++++++++*/ /* Sed - stream editor Author: Eric S. Raymond */ /* The stream editor compiles its command input (from files or -e options) into an internal form using compile() then executes the compiled form using execute(). Main() just initializes data structures, interprets command line options, and calls compile() and execute() in appropriate sequence. The data structure produced by compile() is an array of compiled-command structures (type sedcmd). These contain several pointers into pool[], the regular-expression and text-data pool, plus a command code and g & p flags. In the special case that the command is a label the struct will hold a ptr into the labels array labels[] during most of the compile, until resolve() resolves references at the end. The operation of execute() is described in its source module. */ /* #include <stdio.h> */ /* #include "sed.h" */ /* Imported functions */ /***** public stuff ******/ #define MAXCMDS 500 /* maximum number of compiled commands */ #define MAXLINES 256 /* max # numeric addresses to compile */ /* Main data areas */ char linebuf[MAXBUF + 1]; /* current-line buffer */ sedcmd cmds[MAXCMDS + 1]; /* hold compiled commands */ long linenum[MAXLINES]; /* numeric-addresses table */ /* Miscellaneous shared variables */ int nflag; /* -n option flag */ int eargc; /* scratch copy of argument count */ char **eargv; /* scratch copy of argument list */ char bits[] = {1, 2, 4, 8, 16, 32, 64, 128}; /***** module common stuff *****/ #define POOLSIZE 20000 /* size of string-pool space */ #define WFILES 10 /* max # w output files that can be compiled */ #define RELIMIT 256 /* max chars in compiled RE */ #define MAXDEPTH 20 /* maximum {}-nesting level */ #define MAXLABS 50 /* max # of labels that can be handled */ #define SKIPWS(pc) while ((*pc==' ') || (*pc=='\t')) pc++ #define ABORT(msg) (fprintf(stderr, msg, linebuf), quit(2)) #define IFEQ(x, v) if (*x == v) x++ , /* do expression */ /* Error messages */ static char AGMSG[] = "sed: garbled address %s\n"; static char CGMSG[] = "sed: garbled command %s\n"; static char TMTXT[] = "sed: too much text: %s\n"; static char AD1NG[] = "sed: no addresses allowed for %s\n"; static char AD2NG[] = "sed: only one address allowed for %s\n"; static char TMCDS[] = "sed: too many commands, last was %s\n"; static char COCFI[] = "sed: cannot open command-file %s\n"; static char UFLAG[] = "sed: unknown flag %c\n"; static char CCOFI[] = "sed: cannot create %s\n"; static char ULABL[] = "sed: undefined label %s\n"; static char TMLBR[] = "sed: too many {'s\n"; static char FRENL[] = "sed: first RE must be non-null\n"; static char NSCAX[] = "sed: no such command as %s\n"; static char TMRBR[] = "sed: too many }'s\n"; static char DLABL[] = "sed: duplicate label %s\n"; static char TMLAB[] = "sed: too many labels: %s\n"; static char TMWFI[] = "sed: too many w files\n"; static char REITL[] = "sed: RE too long: %s\n"; static char TMLNR[] = "sed: too many line numbers\n"; static char TRAIL[] = "sed: command \"%s\" has trailing garbage\n"; typedef struct { /* represent a command label */ char *name; /* the label name */ sedcmd *last; /* it's on the label search list */ sedcmd *address; /* pointer to the cmd it labels */ } label; /* Label handling */ static label labels[MAXLABS]; /* here's the label table */ static label *lab = labels + 1; /* pointer to current label */ static label *lablst = labels; /* header for search list */ /* String pool for regular expressions, append text, etc. etc. */ static char pool[POOLSIZE]; /* the pool */ static char *fp = pool; /* current pool pointer */ static char *poolend = pool + POOLSIZE; /* pointer past pool end */ /* Compilation state */ static FILE *cmdf = NULL; /* current command source */ static char *cp = linebuf; /* compile pointer */ static sedcmd *cmdp = cmds; /* current compiled-cmd ptr */ static char *lastre = NULL; /* old RE pointer */ static int bdepth = 0; /* current {}-nesting level */ static int bcount = 0; /* # tagged patterns in current RE */ /* Compilation flags */ static int eflag; /* -e option flag */ static int gflag; /* -g option flag */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(static void compcQ��eQ��fQ��gQ��hQ��iQ��jQ��kQ��lQ��mQ��nQ��oQ��pQ��qQ��rQ��sQ��tQ��uQ��vQ��wQ��xQ��yQ��zQ��{Q��|Q��}Q��~Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ile, (void)); _PROTOTYPE(static int cmdcomp, (int cchar)); _PROTOTYPE(static char *rhscomp, (char *rhsp, int delim)); _PROTOTYPE(static char *recomp, (char *expbuf, int redelim)); _PROTOTYPE(static int cmdline, (char *cbuf)); _PROTOTYPE(static char *address, (char *expbuf)); _PROTOTYPE(static char *gettext, (char *txp)); _PROTOTYPE(static label *search, (label *ptr)); _PROTOTYPE(static void resolve, (void)); _PROTOTYPE(static char *ycomp, (char *ep, int delim)); _PROTOTYPE(void quit, (int n)); _PROTOTYPE(void execute, (void)); _PROTOTYPE(static int selected, (sedcmd *ipc)); _PROTOTYPE(static int match, (char *expbuf, int gf)); _PROTOTYPE(static int advance, (char *lp, char *ep)); _PROTOTYPE(static int substitute, (sedcmd *ipc)); _PROTOTYPE(static void dosub, (char *rhsbuf)); _PROTOTYPE(static char *place, (char *asp, char *al1, char *al2)); _PROTOTYPE(static void listto, (char *p1, FILE *fp)); _PROTOTYPE(static void truncated, (int h)); _PROTOTYPE(static void command, (sedcmd *ipc)); _PROTOTYPE(static void openfile, (char *file)); _PROTOTYPE(static void get, (void)); _PROTOTYPE(static void initget, (void)); _PROTOTYPE(static char *getline, (char *buf)); _PROTOTYPE(static int Memcmp, (char *a, char *b, int count)); _PROTOTYPE(static void readout, (void)); int main(argc, argv) /* Main sequence of the stream editor */ int argc; char *argv[]; { eargc = argc; /* set local copy of argument count */ eargv = argv; /* set local copy of argument list */ cmdp->addr1 = pool; /* 1st addr expand will be at pool start */ if (eargc == 1) quit(0); /* exit immediately if no arguments */ /* Scan through the arguments, interpreting each one */ while ((--eargc > 0) && (**++eargv == '-')) switch (eargv[0][1]) { case 'e': eflag++; compile(); /* compile with e flag on */ eflag = 0; continue; /* get another argument */ case 'f': if (eargc-- <= 0) /* barf if no -f file */ quit(2); if ((cmdf = fopen(*++eargv, "r")) == NULL) { fprintf(stderr, COCFI, *eargv); quit(2); } compile(); /* file is O.K., compile it */ fclose(cmdf); continue; /* go back for another argument */ case 'g': gflag++; /* set global flag on all s cmds */ continue; case 'n': nflag++; /* no print except on p flag or w */ continue; default: fprintf(stdout, UFLAG, eargv[0][1]); continue; } if (cmdp == cmds) { /* no commands have been compiled */ eargv--; eargc++; eflag++; compile(); eflag = 0; eargv++; eargc--; } if (bdepth) /* we have unbalanced squigglies */ ABORT(TMLBR); lablst->address = cmdp; /* set up header of label linked list */ resolve(); /* resolve label table indirections */ execute(); /* execute commands */ quit(0); /* everything was O.K. if we got here */ return(0); } #define H 0x80 /* 128 bit, on if there's really code for * command */ #define LOWCMD 56 /* = '8', lowest char indexed in cmdmask */ /* Indirect through this to get command internal code, if it exists */ static char cmdmask[] = { 0, 0, H, 0, 0, H + EQCMD, 0, 0, 0, 0, 0, 0, H + CDCMD, 0, 0, CGCMD, CHCMD, 0, 0, 0, 0, 0, CNCMD, 0, CPCMD, 0, 0, 0, H + CTCMD, 0, 0, H + CWCMD, 0, 0, 0, 0, 0, 0, 0, 0, 0, H + ACMD, H + BCMD, H + CCMD, DCMD, 0, 0, GCMD, HCMD, H + ICMD, 0, 0, H + LCMD, 0, NCMD, 0, PCMD, H + QCMD, H + RCMD, H + SCMD, H + TCMD, 0, 0, H + WCMD, XCMD, H + YCMD, 0, H + BCMD, 0, H, 0, 0, }; static void compile() /* Precompile sed commands out of a file */ { char ccode; for (;;) { /* main compilation loop */ if (*cp == '\0') { /* get a new command line */ *linebuf = '\0'; /* K.H */ if (cmdline(cp = linebuf) < 0) break; } SKIPWS(cp); if (*cp == '\0') /* empty */ continue; if (*cp == '#') { /* comment */ while (*cp) ++cp; continue; } if (*cp == ';') { /* ; separates cmds */ cp++; continue; } /* Compile first address */ if (fp > poolend) ABORT(TMTXT); else if ((fp = address(cmdp->addr1 = fp)) == BAD) ABORT(AGMSG); if (fp == cmdp->addr1) {/* if empty RE was found */ if (lastre) /* if there was previous RE */ cmdp->addr1 = lastre; /* use it */ else ABORT(FRENL); } else if (fp == NULL) {/* if fp was NULL */ fp = cmdp->addr1; /* use current pool location */ cmdp->addr1 = NULL; } else { lastre = cmdp->addr1; if (*cp == ',' || *cp == ';') { /* there's 2nd addr */ cp++; if (fp > poolend) ABORT(TMTXT); fp = address(cmdp->addr2 = fp); if (fp == BAD || fp == NULL) ABORT(AGMSG); if (fp == cmdp->addr2) cmdp->addr2 = lastre; else lastre = cmdp->addr2; } else cmdp->addr2 = NULL; /* no 2nd address */ } if (fp > poolend) ABORT(TMTXT); SKIPWS(cp); /* discard whitespace after address */ IFEQ(cp, '!') cmdp->flags.allbut = 1; SKIPWS(cp); /* get cmd char, range-check it */ if ((*cp < LOWCMD) || (*cp > '~') || ((ccode = cmdmask[*cp - LOWCMD]) == 0)) ABORT(NSCAX); cmdp->command = ccode & ~H; /* fill in command value */ if ((ccode & H) == 0) /* if no compile-time code */ cp++; /* discard command char */ else if (cmdcomp(*cp++))/* execute it; if ret = 1 */ continue; /* skip next line read */ if (++cmdp >= cmds + MAXCMDS) ABORT(TMCDS); SKIPWS(cp); /* look for trailing stuff */ if (*cp != '\0' && *cp != ';' && *cp != '#') ABORT(TRAIL); } } static int cmdcomp(cchar) /* Compile a single command */ register char cchar; /* character name of command */ { static sedcmd **cmpstk[MAXDEPTH]; /* current cmd stack for {} */ static char *fname[WFILES]; /* w file name pointers */ static FILE *fout[WFILES]; /* w file file ptrs */ static int nwfiles = 1; /* count of open w files */ int i; /* indexing dummy used in w */ sedcmd *sp1, *sp2; /* temps for label searches */ label *lpt; char redelim; /* current RE delimiter */ fout[0] = stdout; switch (cchar) { case '{': /* start command group */ cmdp->flags.allbut = !cmdp->flags.allbut; cmpstk[bdepth++] = &(cmdp->u.link); if (++cmdp >= cmds + MAXCMDS) ABORT(TMCDS); return(1); case '}': /* end command group */ if (cmdp->addr1) ABORT(AD1NG); /* no addresses allowed */ if (--bdepth < 0) ABORT(TMRBR); /* too many right braces */ *cmpstk[bdepth] = cmdp; /* set the jump address */ return(1); case '=': /* print current source line number */ case 'q': /* exit the stream editor */ if (cmdp->addr2) ABORT(AD2NG); break; case ':': /* label declaration */ if (cmdp->addr1) ABORT(AD1NG); /* no addresses allowed */ fp = gettext(lab->name = fp); /* get the label name */ if (lpt = search(lab)) {/* does it have a double? */ if (lpt->address) ABORT(DLABL); /* yes, abort */ } else { /* check that it doesn't overflow label table */ lab->last = NULL; lpt = lab; if (++lab >= labels + MAXLABS) ABORT(TMLAB); } lpt->address = cmdp; return(1); case 'b': /* branch command */ case 't': /* branch-on-succeed command */ case 'T': /* branch-on-fail command */ SKIPWS(cp); if (*cp == '\0') { /* if branch is to start of cmds... */ /* Add current command to end of label last */ if (sp1 = lablst->last) { while (sp2 = sp1->u.link) sp1 = sp2; sp1->u.link = cmdp; } else /* lablst->last == NULL */ lablst->last = cmdp; break; } fp = gettext(lab->name = fp); /* else get label into pool */ if (lpt = search(lab)) {/* enter branch to it */ if (lpt->address) cmdp->u.link = lpt->address; else { sp1 = lpt->last; while (sp2 = sp1->u.link) sp1 = sp2; sp1->u.link = cmdp; } } else { /* matching named label not found */ lab->last = cmdp; /* add the new label */ lab->address = NULL; /* it's forward of here */ if (++lab >= labels + MAXLABS) /* overflow if last */ ABORT(TMLAB); } break; case 'a': /* append text */ case 'i': /* insert text */ case 'r': /* read file into stream */ if (cmdp->addr2) ABORT(AD2NG); case 'c': /* change text */ if ((*cp == '\\') && (*++cp == '\n')) cp++; fp = gettext(cmdp->u.lhs = fp); break; case 'D': /* delete current line in hold space */ cmdp->u.link = cmds; break; case 's': /* substitute regular expression */ redelim = *cp++; /* get delimiter from 1st ch */ if ((fp = recomp(cmdp->u.lhs = fp, redelim)) == BAD) ABORT(CGMSG); if (fp == cmdp->u.lhs) /* if compiled RE zero len */ cmdp->u.lhs = lastre; /* use the previous one */ else /* otherwise */ lastre = cmdp->u.lhs; /* save the one just found */ if ((cmdp->rhs = fp) > poolend) ABORT(TMTXT); if ((fp = rhscomp(cmdp->rhs, redelim)) == BAD) ABORT(CGMSG); if (gflag) cmdp->flags.global ++; while (*cp == 'g' || *cp == 'p' || *cp == 'P') { IFEQ(cp, 'g') cmdp->flags.global ++; IFEQ(cp, 'p') cmdp->flags.print = 1; IFEQ(cp, 'P') cmdp->flags.print = 2; } case 'l': /* list pattern space */ if (*cp == 'w') cp++; /* and execute a w command! */ else break; /* s or l is done */ case 'w': /* write-pattern-space command */ case 'W': /* write-first-line command */ if (nwfiles >= WFILES) ABORT(TMWFI); fp = gettext(fname[nwfiles] = fp); /* filename will be in pool */ for (i = nwfiles - 1; i >= 0; i--) /* match it in table */ if ((fname[i] != NULL) && (strcmp(fname[nwfiles], fname[i]) == 0)) { cmdp->fout = fout[i]; return(0); } /* If didn't find one, open new out file */ if ((cmdp->fout = fopen(fname[nwfiles], "w")) == NULL) { fprintf(stderr, CCOFI, fname[nwfiles]); quit(2); } fout[nwfiles++] = cmdp->fout; break; case 'y': /* transliterate text */ fp = ycomp(cmdp->u.lhs = fp, *cp++); /* compile translit */ if (fp == BAD) ABORT(CGMSG); /* fail on bad form */ if (fp > poolend) ABORT(TMTXT); /* fail on overflow */ break; } return(0); /* succeeded in interpreting one command */ } static char *rhscomp(rhsp, delim) /* uses bcount */ /* Generate replacement string for substitute command right hand side */ register char *rhsp; /* place to compile expression to */ register char delim; /* regular-expression end-mark to look for */ { register char *p = cp; /* strictly for speed */ for (;;) if ((*rhsp = *p++) == '\\') { /* copy; if it's a \, */ *rhsp = *p++; /* copy escaped char */ /* Check validity of pattern tag */ if (*rhsp > bcount + '0' && *rhsp <= '9') return(BAD); *rhsp++ |= 0x80;/* mark the good ones */ continue; } else if (*rhsp == delim) { /* found RE end, hooray... */ *rhsp++ = '\0'; /* cap the expression string */ cp = p; return(rhsp); /* pt at 1 past the RE */ } else if (*rhsp++ == '\0') /* last ch not RE end, help! */ return(BAD); } static char *recomp(expbuf, redelim) /* uses cp, bcount */ /* Compile a regular expression to internal form */ char *expbuf; /* place to compile it to */ char redelim; /* RE end-marker to look for */ { register char *ep = expbuf; /* current-compiled-char pointer */ register char *sp = cp; /* source-character ptr */ register int c; /* current-character pointer */ char negclass; /* all-but flag */ char *lastep; /* ptr to last expr compiled */ char *svclass; /* start of current char class */ char brnest[MAXTAGS]; /* bracket-nesting array */ char *brnestp; /* ptr to current bracket-nest */ int classct; /* class element count */ int tags; /* # of closed tags */ if (*cp == redelim) /* if first char is RE endmarker */ return(cp++, expbuf); /* leave existing RE unchanged */ lastep = NULL; /* there's no previous RE */ brnestp = brnest; /* initialize ptr to brnest array */ tags = bcount = 0; /* initialize counters */ if (*ep++ = (*sp == '^')) /* check for start-of-line syntax */ sp++; for (;;) { if (ep >= expbuf + RELIMIT) /* match is too large */ return(cp = sp, BAD); if ((c = *sp++) == redelim) { /* found the end of the RE */ cp = sp; if (brnestp != brnest) /* \(, \) unbalanced */ return(BAD); *ep++ = CEOF; /* write end-of-pattern mark */ return(ep); /* return ptr to compiled RE */ } if (c != '*') /* if we're a postfix op */ lastep = ep; /* get ready to match last */ switch (c) { case '\\': if ((c = *sp++) == '(') { /* start tagged section */ if (bcount >= MAXTAGS) return(cp = sp, BAD); *brnestp++ = bcount; /* update tag stack */ *ep++ = CBRA; /* enter tag-start */ *ep++ = bcount++; /* bump tag count */ continue; } else if (c == ')') { /* end tagged section */ if (brnestp <= brnest) /* extra \) */ return(cp = sp, BAD); *ep++ = CKET; /* enter end-of-tag */ *ep++ = *--brnestp; /* pop tag stack */ tags++; /* count closed tags */ continue; } else if (c >= '1' && c <= '9') { /* tag use */ if ((c -= '1') >= tags) /* too few */ return(BAD); *ep++ = CBACK; /* enter tag mark */ *ep++ = c; /* and the number */ continue; } else if (c == '\n') /* escaped newline no good */ return(cp = sp, BAD); else if (c == 'n') /* match a newline */ c = '\n'; else if (c == 't') /* match a tab */ c = '\t'; else if (c == 'r') /* match a return */ c = '\r'; goto defchar; case '\0': /* ignore nuls */ continue; case '\n': /* trailing pattern delimiter is missing */ return(cp = sp, BAD); case '.': /* match any char except newline */ *ep++ = CDOT; continue; case '*': /* 0..n repeats of previous pattern */ if (lastep == NULL) /* if * isn't first on line */ goto defchar; /* match a literal * */ if (*lastep == CKET) /* can't iterate a tag */ return(cp = sp, BAD); *lastep |= STAR;/* flag previous pattern */ continue; case '$': /* match only end-of-line */ if (*sp != redelim) /* if we're not at end of RE */ goto defchar; /* match a literal $ */ *ep++ = CDOL; /* insert end-symbol mark */ continue; case '[': /* begin character set pattern */ if (ep + 17 >= expbuf + RELIMIT) ABORT(REITL); *ep++ = CCL; /* insert class mark */ if (negclass = ((c = *sp++) == '^')) c = *sp++; svclass = sp; /* save ptr to class start */ do { if (c == '\0') ABORT(CGMSG); /* Handle character ranges */ if (c == '-' && sp > svclass && *sp != ']') for (c = sp[-2]; c < *sp; c++) ep[c >> 3] |= bits[c & 7]; /* Handle escape sequences in sets */ if (c == '\\') if ((c = *sp++) == 'n') c = '\n'; else if (c == 't') c = '\t'; else if (c == 'r') c = '\r'; /* Enter (possibly translated) char in set */ ep[c >> 3] |= bits[c & 7]; } while ((c = *sp++) != ']'); /* Invert the bitmask if all-but was specified */ if (negclass) for (classct = 0; classct < 16; classct++) ep[classct] ^= 0xFF; ep[0] &= 0xFE; /* never match ASCII 0 */ ep += 16; /* advance ep past set mask */ continue; defchar: /* match literal character */ default: /* which is what we'd do by default */ *ep++ = CCHR; /* insert character mark */ *ep++ = c; } } } static int cmdline(cbuf) /* uses eflag, eargc, cmdf */ /* Read next command from -e argument or command file */ register char *cbuf; { register int inc; /* not char because must hold EOF */ *cbuf-- = 0; /* so pre-increment points us at cbuf */ /* E command flag is on */ if (eflag) { register char *p; /* ptr to current -e argument */ static char *savep; /* saves previous value of p */ if (eflag > 0) { /* there are pending -e arguments */ eflag = -1; if (eargc-- <= 0) quit(2); /* if no arguments, barf */ /* Else transcribe next e argument into cbuf */ p = *++eargv; while (*++cbuf = *p++) if (*cbuf == '\\') { if ((*++cbuf = *p++) == '\0') return(savep = NULL, -1); else continue; } else if (*cbuf == '\n') { /* end of 1 cmd line */ *cbuf = '\0'; return(savep = p, 1); /* We'll be back for the rest... */ } /* Found end-of-string; can advance to next argument */ return(savep = NULL, 1); } if ((p = savep) == NULL) return(-1); while (*++cbuf = *p++) if (*cbuf == '\\') { if ((*++cbuf = *p++) == '0') return(savep = NULL, -1); else continue; } else if (*cbuf == '\n') { *cbuf = '\0'; return(savep = p, 1); } return(savep = NULL, 1); } /* If no -e flag read from command file descriptor */ while ((inc = getc(cmdf)) != EOF) /* get next char */ if ((*++cbuf = inc) == '\\') /* if it's escape */ *++cbuf = inc = getc(cmdf); /* get next char */ else if (*cbuf == '\n') /* end on newline */ return(*cbuf = '\0', 1); /* cap the string */ return(*++cbuf = '\0', -1); /* end-of-file, no more chars */ } static char *address(expbuf) /* uses cp, linenum */ /* Expand an address at *cp... into expbuf, return ptr at following char */ register char *expbuf; { static int numl = 0; /* current ind in addr-number table */ register char *rcp; /* temp compile ptr for forwd look */ long lno; /* computed value of numeric address */ if (*cp == '$') { /* end-of-source address */ *expbuf++ = CEND; /* write symbolic end address */ *expbuf++ = CEOF; /* and the end-of-address mark (!) */ cp++; /* go to next source character */ return(expbuf); /* we're done */ } if (*cp == '/' || *cp == '\\') { /* start of regular-expression match */ if (*cp == '\\') cp++; return(recomp(expbuf, *cp++)); /* compile the RE */ } rcp = cp; lno = 0; /* now handle a numeric address */ while (*rcp >= '0' && *rcp <= '9') /* collect digits */ lno = lno * 10 + *rcp++ - '0'; /* compute their value */ if (rcp > cp) { /* if we caught a number... */ *expbuf++ = CLNUM; /* put a numeric-address marker */ *expbuf++ = numl; /* and the address table index */ linenum[numl++] = lno; /* and set the table entry */ if (numl >= MAXLINES) /* oh-oh, address table overflow */ ABORT(TMLNR); /* abort with error message */ *expbuf++ = CEOF; /* write the end-of-address marker */ cp = rcp; /* point compile past the address */ return(expbuf); /* we're done */ } return(NULL); /* no legal address was found */ } static char *gettext(txp) /* uses global cp */ /* Accept multiline input from *cp..., discarding leading whitespace */ register char *txp; /* where to put the text */ { register char *p = cp; /* this is for speed */ SKIPWS(p); /* discard whitespace */ do { if ((*txp = *p++) == '\\') /* handle escapes */ *txp = *p++; if (*txp == '\0') /* we're at end of input */ return(cp = --p, ++txp); else if (*txp == '\n') /* also SKIPWS after newline */ SKIPWS(p); } while (txp++); /* keep going till we find that nul */ return(txp); } static label *search(ptr) /* uses global lablst */ /* Find the label matching *ptr, return NULL if none */ register label *ptr; { register label *rp; for (rp = lablst; rp < ptr; rp++) if ((rp->name != NULL) && (strcmp(rp->name, ptr->name) == 0)) return(rp); return(NULL); } static void resolve() { /* uses global lablst */ /* Write label links into the compiled-command space */ register label *lptr; register sedcmd *rptr, *trptr; /* Loop through the label table */ for (lptr = lablst; lptr < lab; lptr++) if (lptr->address == NULL) { /* barf if not defined */ fprintf(stderr, ULABL, lptr->name); quit(2); } else if (lptr->last) {/* if last is non-null */ rptr = lptr->last; /* chase it */ while (trptr = rptr->u.link) { /* resolve refs */ rptr->u.link = lptr->address; rptr = trptr; } rptr->u.link = lptr->address; } } static char *ycomp(ep, delim) /* Compile a y (transliterate) command */ register char *ep; /* where to compile to */ char delim; /* end delimiter to look for */ { register char *tp, *sp; register int c; /* Scan the 'from' section for invalid chars */ for (sp = tp = cp; *tp != delim; tp++) { if (*tp == '\\') tp++; if ((*tp == '\n') || (*tp == '\0')) return (BAD); } tp++; /* tp now points at first char of 'to' * section */ /* Now rescan the 'from' section */ while ((c = *sp++ & 0x7F) != delim) { if (c == '\\' && *sp == 'n') { sp++; c = '\n'; } if ((ep[c] = *tp++) == '\\' && *tp == 'n') { ep[c] = '\n'; tp++; } if ((ep[c] == delim) || (ep[c] == '\0')) return(BAD); } if (*tp != delim) /* 'to', 'from' parts have unequal lengths */ return(BAD); cp = ++tp; /* point compile ptr past translit */ for (c = 0; c < 128; c++) /* fill in self-map entries in table */ if (ep[c] == 0) ep[c] = c; return(ep + 0x80); /* return first free location past table end */ } void quit(n) int n; { /* Flush buffers and exit. Now a historical relic. Rely on exit to flush * the buffers. */ exit(n); } /*+++++++++++++++*/ /* sedexec.c -- execute compiled form of stream editor commands The single entry point of this module is the function execute(). It may take a string argument (the name of a file to be used as text) or the argument NULL which tells it to filter standard input. It executes the compiled commands in cmds[] on each line in turn. The function command() does most of the work. Match() and advance() are used for matching text against precompiled regular expressions and dosub() does right-hand-side substitution. Getline() does text input; readout() and Memcmp() are output and string-comparison utilities. */ /* #include <stdio.h> */ /* #include <ctype.h> */ /* #include "sed.h" */ /***** shared variables imported from the main ******/ /* Main data areas */ extern char linebuf[]; /* current-line buffer */ extern sedcmd cmds[]; /* hold compiled commands */ extern long linenum[]; /* numeric-addresses table */ /* Miscellaneous shared variables */ extern int nflag; /* -n option flag */ extern int eargc; /* scratch copy of argument count */ extern char **eargv; /* scratch copy of argument list */ extern char bits[]; /* the bits table */ /***** end of imported stuff *****/ #define MAXHOLD MAXBUF /* size of the hold space */ #define GENSIZ MAXBUF /* maximum genbuf size */ #define TRUE 1 #define FALSE 0 static char LTLMSG[] = "sed: line too long\n"; static char *spend; /* current end-of-line-buffer pointer */ static long lnum = 0L; /* current source line number */ /* Append buffer maintenance */ static sedcmd *appends[MAXAPPENDS]; /* array of ptrs to a,i,c commands */ static sedcmd **aptr = appends; /* ptr to current append */ /* Genbuf and its pointers */ static char genbuf[GENSIZ]; static char *loc1; static char *loc2; static char *locs; /* Command-logic flags */ static int lastline; /* do-line flag */ static int jump; /* jump to cmd's link address if set */ static int delete; /* delete command flag */ /* Tagged-pattern tracking */ static char *bracend[MAXTAGS]; /* tagged pattern start pointers */ static char *brastart[MAXTAGS]; /* tagged pattern end pointers */ static int anysub; /* true if any s on current line succeeded */ void execute() /* Execute the compiled commands in cmds[] */ { register char *p1; /* dummy copy ptrs */ register sedcmd *ipc; /* ptr to current command */ char *execp; /* ptr to source */ initget(); /* Here's the main command-execution loop */ for (;;) { /* Get next line to filter */ if ((execp = getline(linebuf)) == BAD) return; spend = execp; anysub = FALSE; /* Loop through compiled commands, executing them */ for (ipc = cmds; ipc->command;) { if (!selected(ipc)) { ipc++; continue; } command(ipc); /* execute the command pointed at */ if (delete) /* if delete flag is set */ break; /* don't exec rest of compiled cmds */ if (jump) { /* if jump set, follow cmd's link */ jump = FALSE; if ((ipc = ipc->u.link) == 0) { ipc = cmds; break; } } else /* normal goto next command */ ipc++; } /* We've now done all modification commands on the line */ /* Here's where the transformed line is output */ if (!nflag && !delete) { for (p1 = linebuf; p1 < spend; p1++) putc(*p1, stdout); putc('\n', stdout); } /* If we've been set up for append, emit the text from it */ if (aptr > appends) readout(); delete = FALSE; /* clear delete flag; about to get next cmd */ } } static int selected(ipc) /* Is current command selected */ sedcmd *ipc; { register char *p1 = ipc->addr1; /* point p1 at first address */ register char *p2 = ipc->addr2; /* and p2 at second */ int c; int sel = TRUE; /* select by default */ if (!p1) /* No addresses: always selected */ ; else if (ipc->flags.inrange) { if (*p2 == CEND); else if (*p2 == CLNUM) { c = p2[1] & CMASK; if (lnum >= linenum[c]) { ipc->flags.inrange = FALSE; if (lnum > linenum[c]) sel = FALSE; } } else if (match(p2, 0)) ipc->flags.inrange = FALSE; } else if (*p1 == CEND) { if (!lastline) sel = FALSE; } else if (*p1 == CLNUM) { c = p1[1] & CMASK; if (lnum != linenum[c]) sel = FALSE; else if (p2) ipc->flags.inrange = TRUE; } else if (match(p1, 0)) { if (p2) ipc->flags.inrange = TRUE; } else sel = FALSE; return ipc->flags.allbut ? !sel : sel; } static int match(expbuf, gf) /* uses genbuf */ /* Match RE at expbuf against linebuf; if gf set, copy linebuf from genbuf */ char *expbuf; int gf; { register char *p1, *p2, c; if (gf) { if (*expbuf) return(FALSE); p1 = linebuf; p2 = genbuf; while (*p1++ = *p2++); locs = p1 = loc2; } else { p1 = linebuf; locs = FALSE; } p2 = expbuf; if (*p2++) { loc1 = p1; if (*p2 == CCHR && p2[1] != *p1) /* 1st char is wrong */ return(FALSE); /* so fail */ return(advance(p1, p2));/* else try to match rest */ } /* Quick check for 1st character if it's literal */ if (*p2 == CCHR) { c = p2[1]; /* pull out character to search for */ do { if (*p1 != c) continue; /* scan the source string */ if (advance(p1, p2)) /* found it, match the rest */ return(loc1 = p1, 1); } while (*p1++); return(FALSE); /* didn't find that first char */ } /* Else try for unanchored match of the pattern */ do { if (advance(p1, p2)) return(loc1 = p1, 1); } while (*p1++); /* If got here, didn't match either way */ return(FALSE); } static int advance(lp, ep) /* Attempt to advance match pointer by one pattern element */ register char *lp; /* source (linebuf) ptr */ register char *ep; /* regular expression element ptr */ { register char *curlp; /* save ptr for closures */ char c; /* scratch character holder */ char *bbeg; int ct; for (;;) switch (*ep++) { case CCHR: /* literal character */ if (*ep++ == *lp++) /* if chars are equal */ continue; /* matched */ return(FALSE); /* else return false */ case CDOT: /* anything but newline */ if (*lp++) /* first NUL is at EOL */ continue; /* keep going if didn't find */ return(FALSE); /* else return false */ case CNL: /* start-of-line */ case CDOL: /* end-of-line */ if (*lp == 0) /* found that first NUL? */ continue; /* yes, keep going */ return(FALSE); /* else return false */ case CEOF: /* end-of-address mark */ loc2 = lp; /* set second loc */ return(TRUE); /* return true */ case CCL: /* a closure */ c = *lp++ & 0177; if (ep[c >> 3] & bits[c & 07]) { /* is char in set? */ ep += 16; /* then skip rest of bitmask */ continue; /* and keep going */ } return(FALSE); /* else return false */ case CBRA: /* start of tagged pattern */ brastart[*ep++] = lp; /* mark it */ continue; /* and go */ case CKET: /* end of tagged pattern */ bracend[*ep++] = lp; /* mark it */ continue; /* and go */ case CBACK: bbeg = brastart[*ep]; ct = bracend[*ep++] - bbeg; if (Memcmp(bbeg, lp, ct)) { lp += ct; continue; } return(FALSE); case CBACK | STAR: bbeg = brastart[*ep]; ct = bracend[*ep++] - bbeg; curlp = lp; while (Memcmp(bbeg, lp, ct)) lp += ct; while (lp >= curlp) { if (advance(lp, ep)) return(TRUE); lp -= ct; } return(FALSE); case CDOT | STAR: /* match .* */ curlp = lp; /* save closure start loc */ while (*lp++); /* match anything */ goto star; /* now look for followers */ case CCHR | STAR: /* match <literal char>* */ curlp = lp; /* save closure start loc */ while (*lp++ == *ep); /* match many of that char */ ep++; /* to start of next element */ goto star; /* match it and followers */ case CCL | STAR: /* match [...]* */ curlp = lp; /* save closure start loc */ do { c = *lp++ & 0x7F; /* match any in set */ } while (ep[c >> 3] & bits[c & 07]); ep += 16; /* skip past the set */ goto star; /* match followers */ star: /* the recursion part of a * or + match */ if (--lp == curlp) /* 0 matches */ continue; if (*ep == CCHR) { c = ep[1]; do { if (*lp != c) continue; if (advance(lp, ep)) return (TRUE); } while (lp-- > curlp); return(FALSE); } if (*ep == CBACK) { c = *(brastart[ep[1]]); do { if (*lp != c) continue; if (advance(lp, ep)) return (TRUE); } while (lp-- > curlp); return(FALSE); } do { if (lp == locs) break; if (advance(lp, ep)) return (TRUE); } while (lp-- > curlp); return(FALSE); default: fprintf(stderr, "sed: RE error, %o\n", *--ep); quit(2); } } static int substitute(ipc) /* Perform s command */ sedcmd *ipc; /* ptr to s command struct */ { int nullmatch; if (match(ipc->u.lhs, 0)) { /* if no match */ nullmatch = (loc1 == loc2); dosub(ipc->rhs); /* perform it once */ } else return(FALSE); /* command fails */ if (ipc->flags.global) /* if global flag enabled */ while (*loc2) { /* cycle through possibles */ if (nullmatch) loc2++; if (match(ipc->u.lhs, 1)) { /* found another */ nullmatch = (loc1 == loc2); dosub(ipc->rhs); /* so substitute */ } else /* otherwise, */ break; /* we're done */ } return(TRUE); /* we succeeded */ } static void dosub(rhsbuf) /* uses linebuf, genbuf, spend */ /* Generate substituted right-hand side (of s command) */ char *rhsbuf; /* where to put the result */ { register char *lp, *sp, *rp; int c; /* Copy linebuf to genbuf up to location 1 */ lp = linebuf; sp = genbuf; while (lp < loc1) *sp++ = *lp++; for (rp = rhsbuf; c = *rp++;) { if (c == '&') { sp = place(sp, loc1, loc2); continue; } else if (c & 0200 && (c &= 0177) >= '1' && c < MAXTAGS + '1') { sp = place(sp, brastart[c - '1'], bracend[c - '1']); continue; } *sp++ = c & 0177; if (sp >= genbuf + MAXBUF) fprintf(stderr, LTLMSG); } lp = loc2; loc2 = sp - genbuf + linebuf; while (*sp++ = *lp++) if (sp >= genbuf + MAXBUF) fprintf(stderr, LTLMSG); lp = linebuf; sp = genbuf; while (*lp++ = *sp++); spend = lp - 1; } static char *place(asp, al1, al2) /* uses genbuf */ /* Place chars at *al1...*(al1 - 1) at asp... in genbuf[] */ register char *asp, *al1, *al2; { while (al1 < al2) { *asp++ = *al1++; if (asp >= genbuf + MAXBUF) fprintf(stderr, LTLMSG); } return(asp); } static void listto(p1, fp) /* Write a hex dump expansion of *p1... to fp */ register char *p1; /* the source */ FILE *fp; /* output stream to write to */ { p1--; while (*p1++) if (isprint(*p1)) putc(*p1, fp); /* pass it through */ else { putc('\\', fp); /* emit a backslash */ switch (*p1) { case '\b': putc('b', fp); break; /* BS */ case '\t': putc('t', fp); break; /* TAB */ case '\n': putc('n', fp); break; /* NL */ case '\r': putc('r', fp); break; /* CR */ case '\33': putc('e', fp); break; /* ESC */ default: fprintf(fp, "%02x", *p1 & 0xFF); } } putc('\n', fp); } static void truncated(h) int h; { static long last = 0L; if (lnum == last) return; last = lnum; fprintf(stderr, "sed: "); fprintf(stderr, h ? "hold space" : "line %ld", lnum); fprintf(stderr, " truncated to %d characters\n", MAXBUF); } static void command(ipc) /* Execute compiled command pointed at by ipc */ sedcmd *ipc; { static char holdsp[MAXHOLD + 1]; /* the hold space */ static char *hspend = holdsp; /* hold space end pointer */ register char *p1, *p2; char *execp; int didsub; /* true if last s succeeded */ switch (ipc->command) { case ACMD: /* append */ *aptr++ = ipc; if (aptr >= appends + MAXAPPENDS) fprintf(stderr, "sed: too many appends after line %ld\n", lnum); *aptr = 0; break; case CCMD: /* change pattern space */ delete = TRUE; if (!ipc->flags.inrange || lastline) printf("%s\n", ipc->u.lhs); break; case DCMD: /* delete pattern space */ delete++; break; case CDCMD: /* delete a line in hold space */ p1 = p2 = linebuf; while (*p1 != '\n') if (delete = (*p1++ == 0)) return; p1++; while (*p2++ = *p1++) continue; spend = p2 - 1; jump++; break; case EQCMD: /* show current line number */ fprintf(stdout, "%ld\n", lnum); break; case GCMD: /* copy hold space to pattern space */ p1 = linebuf; p2 = holdsp; while (*p1++ = *p2++); spend = p1 - 1; break; case CGCMD: /* append hold space to pattern space */ *spend++ = '\n'; p1 = spend; p2 = holdsp; do if (p1 > linebuf + MAXBUF) { truncated(0); p1[-1] = 0; break; } while (*p1++ = *p2++); spend = p1 - 1; break; case HCMD: /* copy pattern space to hold space */ p1 = holdsp; p2 = linebuf; while (*p1++ = *p2++); hspend = p1 - 1; break; case CHCMD: /* append pattern space to hold space */ *hspend++ = '\n'; p1 = hspend; p2 = linebuf; do if (p1 > holdsp + MAXBUF) { truncated(1); p1[-1] = 0; break; } while (*p1++ = *p2++); hspend = p1 - 1; break; case ICMD: /* insert text */ printf("%s\n", ipc->u.lhs); break; case BCMD: /* branch to label */ jump = TRUE; break; case LCMD: /* list text */ listto(linebuf, (ipc->fout != NULL) ? ipc->fout : stdout); break; case NCMD: /* read next line into pattern space */ if (!nflag) puts(linebuf); /* flush out the current line */ if (aptr > appends) readout(); /* do pending a, r commands */ if ((execp = getline(linebuf)) == BAD) { delete = TRUE; break; } spend = execp; anysub = FALSE; break; case CNCMD: /* append next line to pattern space */ if (aptr > appends) readout(); *spend++ = '\n'; if ((execp = getline(spend)) == BAD) { *--spend = 0; break; } spend = execp; anysub = FALSE; break; case PCMD: /* print pattern space */ puts(linebuf); break; case CPCMD: /* print one line from pattern space */ cpcom: /* so s command can jump here */ for (p1 = linebuf; *p1 != '\n' && *p1 != '\0';) putc(*p1++, stdout); putc('\n', stdout); break; case QCMD: /* quit the stream editor */ if (!nflag) puts(linebuf); /* flush out the current line */ if (aptr > appends) readout(); /* do any pending a and r commands */ quit(0); case RCMD: /* read a file into the stream */ *aptr++ = ipc; if (aptr >= appends + MAXAPPENDS) fprintf(stderr, "sed: too many reads after line %ld\n", lnum); *aptr = 0; break; case SCMD: /* substitute RE */ didsub = substitute(ipc); if (didsub) anysub = TRUE; if (ipc->flags.print && didsub) if (ipc->flags.print == TRUE) puts(linebuf); else goto cpcom; if (didsub && ipc->fout) fprintf(ipc->fout, "%s\n", linebuf); break; case TCMD: /* branch on any s successful */ case CTCMD: /* branch on any s failed */ if (anysub == (ipc->command == CTCMD)) break; /* no branch if any s failed, else */ anysub = FALSE; jump = TRUE; /* set up to jump to assoc'd label */ break; case CWCMD: /* write one line from pattern space */ for (p1 = linebuf; *p1 != '\n' && *p1 != '\0';) putc(*p1++, ipc->fout); putc('\n', ipc->fout); break; case WCMD: /* write pattern space to file */ fprintf(ipc->fout, "%s\n", linebuf); break; case XCMD: /* exchange pattern and hold spaces */ p1 = linebuf; p2 = genbuf; while (*p2++ = *p1++) continue; p1 = holdsp; p2 = linebuf; while (*p2++ = *p1++) continue; spend = p2 - 1; p1 = genbuf; p2 = holdsp; while (*p2++ = *p1++) continue; hspend = p2 - 1; break; case YCMD: p1 = linebuf; p2 = ipc->u.lhs; while (*p1 = p2[*p1]) p1++; break; } } static void openfile(file) char *file; /* Replace stdin by given file */ { if (freopen(file, "r", stdin) == NULL) { fprintf(stderr, "sed: can't open %s\n", file); quit(1); } } static int c; /* Will be the next char to read, a kind of * lookahead */ static void get() /* Read next character into c treating all argument files as run through cat */ { while ((c = getchar()) == EOF && --eargc >= 0) openfile(*eargv++); } static void initget() /* Initialise character input */ { if (--eargc >= 0) openfile(*eargv++); /* else input == stdin */ get(); } static char *getline(buf) /* Get next line of text to be edited, return pointer to end */ register char *buf; /* where to send the input */ { if (c == EOF) return BAD; lnum++; /* we can read a new line */ do { if (c == '\n') { get(); break; } if (buf <= linebuf + MAXBUF) *buf++ = c; get(); } while (c != EOF); if (c == EOF) lastline = TRUE; if (buf > linebuf + MAXBUF) { truncated(0); --buf; } *buf = 0; return buf; } static int Memcmp(a, b, count) /* Return TRUE if *a... == *b... for count chars, FALSE otherwise */ register char *a, *b; int count; { while (count--) /* look at count characters */ if (*a++ != *b++) /* if any are nonequal */ return(FALSE); /* return FALSE for false */ return(TRUE); /* compare succeeded */ } static void readout() /* Write file indicated by r command to output */ { register int t; /* hold input char or EOF */ FILE *fi; /* ptr to file to be read */ aptr = appends - 1; /* arrange for pre-increment to work right */ while (*++aptr) if ((*aptr)->command == ACMD) /* process "a" cmd */ printf("%s\n", (*aptr)->u.lhs); else { /* process "r" cmd */ if ((fi = fopen((*aptr)->u.lhs, "r")) == NULL) { fprintf(stderr, "sed: can't open %s\n", (*aptr)->u.lhs); continue; } while ((t = getc(fi)) != EOF) putc((char) t, stdout); fclose(fi); } aptr = appends; /* reset the append ptr */ *aptr = 0; } /* Sedexec.c ends here */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* shar - make a shell archive Author: Michiel Husijes */ #include <stdlib.h> /* for the nonstd :-( _PROTOTYPE */ #include <stdio.h> static _PROTOTYPE( void error, (char *progname, char *operation, char *filename) ); _PROTOTYPE( int main, (int argc, char **argv) ); int main(argc, argv) int argc; char *argv[]; { int argn; register int ch; register FILE *fp; int exitstatus; char *filename; exitstatus = 0; for (argn = 1; argn < argc; argn++) { filename = argv[argn]; if ((fp = fopen(filename, "r")) == NULL) { error(argv[0], "opening ", filename); exitstatus = 1; } else { fputs("echo x - ", stdout); fputs(filename, stdout); fputs("\nsed '/^X/s///' > ", stdout); fputs(filename, stdout); fputs(" << '/'\n", stdout); while ((ch = getc(fp)) != EOF) { putchar('X'); putchar(ch); while (ch != '\n') { ch = getc(fp); if (ch == EOF) break; putchar(ch); } if (ch == EOF) break; } fputs("/\n", stdout); if (ferror(fp)) { error(argv[0], "reading ", filename); exitstatus = 1; } if (fclose(fp) != 0) { error(argv[0], "closing ", filename); exitstatus = 1; } if (ferror(stdout)) break; /* lost already */ } } fflush(stdout); if (ferror(stdout)) { error(argv[0], "writing ", "stdout"); exitstatus = 1; } return(exitstatus); } static void error(progname, operation, filename) char *progname; char *operation; char *filename; { fputs(progname, stderr); fputs(": error ", stderr); fputs(operation, stderr); perror(filename); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* size - tell size of an object file Author: Andy Tanenbaum */ #include <sys/types.h> #include <fcntl.h> #include <a.out.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> int heading; /* set when heading printed */ int error; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void size, (char *name)); int main(argc, argv) int argc; char *argv[]; { int i; if (argc == 1) { size("a.out"); exit(error); } for (i = 1; i < argc; i++) size(argv[i]); return(error); } void size(name) char *name; { int fd, separate; long dynam, allmem; struct exec exec; if ((fd = open(name, O_RDONLY)) < 0) { fprintf(stderr, "size: can't open %s\n", name); error = 1; return; } if (read(fd, (char *)&exec, sizeof(struct exec)) != sizeof(struct exec)) { fprintf(stderr, "size: %s: header too short\n", name); error = 1; close(fd); return; } if (BADMAG(exec)) { fprintf(stderr, "size: %s not an object file\n", name); error = 1; close(fd); return; } separate = (exec.a_flags & A_SEP ? 1 : 0); dynam = exec.a_total - exec.a_text - exec.a_data - exec.a_bss; if (separate) dynam += exec.a_text; allmem = (separate ? exec.a_total + exec.a_text : exec.a_total); if (heading++ == 0) printf(" text data bss stack memory\n"); printf("%7ld %7ld %7ld %8ld %8ld %s\n", exec.a_text, exec.a_data, exec.a_bss, dynam, allmem, name); close(fd); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sleep - suspend a process for x sec Author: Andy Tanenbaum */ #include <sys/types.h> #include <stdlib.h> #include <unistd.h> #include <minix/minlib.h> _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char *argv[]; { register seconds; register char c; seconds = 0; if (argc != 2) { std_err("Usage: sleep time\n"); exit(1); } while (c = *(argv[1])++) { if (c < '0' || c > '9') { std_err("sleep: bad arg\n"); exit(1); } seconds = 10 * seconds + (c - '0'); } /* Now sleep. */ sleep(seconds); return(0); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* slip 1.0 - Serial line IP Author: Kees J. Bot * 19 Jul 1997 */ #define nil 0 #include <sys/types.h> #include <stdarg.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <errno.h> #include <sys/asynchio.h> #if __minix && !__minix_vmd #define HAS_ASYN 0 /* Standard Minix doesn't have async I/O. */ #else #define HAS_ASYN 1 /* Everyone else does in some way. */ #endif #if !HAS_ASYN #include <signal.h> #endif #define END 0300 /* End of packet. */ #define ESC 0333 /* Byte stuffing escape. */ #define ESC_END 0334 /* END -> ESC ESC_END -> END. */ #define ESC_ESC 0335 /* ESC -> ESC ESC_ESC -> ESC. */ #define PACKLEN 2048 /* Max datagram size. */ #define SLIPLEN (1 + 2*PACKLEN + 1) /* Max serial size when all escaped. */ /* Pathetic fprintf() clone to avoid dragging in the stdio library. */ static int fprintf(int fd, const char *format, ...); #define stderr 2 int main(int argc, char **argv) { char *ps_device; int ps_fd; int doing[2], discard; ssize_t r; #if !HAS_ASYN pid_t other_pid; #endif size_t ps_len[2], sl_len[2]; unsigned char *sl_end; unsigned char ps_buf[2][PACKLEN]; unsigned char sl_buf[2][SLIPLEN]; asynchio_t asyn; if (argc != 2) { fprintf(stderr, "Usage: slip psip-device\n"); exit(1); } ps_device= argv[1]; if ((ps_fd= open(ps_device, O_RDWR)) < 0) { fprintf(stderr, "slip: can't open %s: %s\n", ps_device, strerror(errno)); exit(1); } fprintf(stderr, "slip: Connecting input/output to %s\n", ps_device); doing[0]= 1; /* We're doing serial -> psip. */ discard= 0; /* No input error. */ sl_len[0]= 0; /* Nothing read from serial line yet. */ sl_end= nil; /* No END marker seen. */ ps_len[0]= 0; /* Nothing to write to pseudo IP device. */ doing[1]= 1; /* We're doing psip -> serial. */ sl_len[1]= 0; /* Nothing read from pseudo IP device yet. */ ps_len[1]= 0; /* Nothing to write to serial line. */ #if !HAS_ASYN /* Oops, standard Minix can't do asynchronous I/O. Fork and let the parent * do serial -> psip, and the child do psip -> serial. (Note that we have * to make sure that we're not reading and writing at the same time even * for standard Minix. For Minix-vmd we do fill an input buffer while an * output buffer is waiting to be drained to improve performance a bit.) */ switch ((other_pid= fork())) { case -1: fprintf(stderr, "slip: can't fork: %s\n", strerror(errno)); exit(1); case 0: /* Child. */ doing[0]= 0; /* *Not* doing serial -> psip. */ other_pid= getppid(); break; default: /* Parent. */ doing[1]= 0; /* *Not* doing psip -> serial. */ } #endif asyn_init(&asyn); for (;;) { if (doing[0]) { /* If there is an END marker in the serial input then create * an IP packet to be send to the TCP/IP task. */ while (sl_end != nil && ps_len[0] == 0) { unsigned char *sp= sl_buf[0]; unsigned char *pp= ps_buf[0]; while (sp < sl_end) { int c= *sp++; if (c == ESC) { switch (*sp++) { case ESC_ESC: /* ESC ESC_ESC -> ESC. */ c= ESC; break; case ESC_END: /* ESC ESC_END -> END. */ c= END; break; default: /* Protocol error. */ discard= 1; } } if (pp < ps_buf[0] + PACKLEN) { *pp++ = c; } else { /* Packet too big, discard. */ discard= 1; } } if (discard) { discard= 0; } else { /* A new packet can be send to the TCP/IP server. */ ps_len[0]= (pp - ps_buf[0]); } /* Move what's beyond END to the front. */ sl_end++; sl_len[0] -= (sl_end - sl_buf[0]); memmove(sl_buf[0], sl_end, sl_len[0]); sl_end= memchr(sl_buf[0], END, sl_len[0]); } /* Reading from serial input. */ if (sl_end == nil && (HAS_ASYN || ps_len[0] == 0)) { r= asyn_read(&asyn, 0, sl_buf[0] + sl_len[0], SLIPLEN - sl_len[0]); if (r > 0) { sl_end= memchr(sl_buf[0] + sl_len[0], END, r); sl_len[0]+= r; if (sl_end == nil && sl_len[0] == SLIPLEN) { /* Packet is idiotically big and no END in sight. */ sl_len[0]= 0; discard= 1; } } else if (r == 0) { fprintf(stderr, "slip: EOF on serial input\n"); break; } else if (errno != ASYN_INPROGRESS) { fprintf(stderr, "slip: serial input error: %s\n", strerror(errno)); break; } } /* Writing to the psip device. */ if (ps_len[0] > 0) { r= asyn_write(&asyn, ps_fd, ps_buf[0], ps_len[0]); if (r == ps_len[0]) { /* Packet written. */ ps_len[0]= 0; } else if (r >= 0) { fprintf(stderr, "slip: odd write to %s, tried %u, wrote %d\n", ps_device, (unsigned) ps_len[0], (int) r); break; } else if (errno != ASYN_INPROGRESS) { fprintf(stderr, "slip: error writing %s: %s\n", ps_device, strerror(errno)); break; } } } if (doing[1]) { /* Transform an IP packet to a "byte stuffed" serial packet. */ if (ps_len[1] > 0 && sl_len[1] == 0) { unsigned char *pp= ps_buf[1]; unsigned char *sp= sl_buf[1]; *sp++ = END; while (ps_len[1] > 0) { int c= *pp++; ps_len[1]--; switch (c) { case ESC: /* ESC -> ESC ESC_ESC. */ *sp++ = ESC; c= ESC_ESC; break; case END: /* END -> ESC ESC_END. */ *sp++ = ESC; c= ESC_END; break; } *sp++ = c; } *sp++ = END; sl_len[1]= (sp - sl_buf[1]); } /* Reading from the psip device. */ if (ps_len[1] == 0 && (HAS_ASYN || sl_len[1] == 0)) { r= asyn_read(&asyn, ps_fd, ps_buf[1], PACKLEN); if (r > 0) { /* One packet read. */ ps_len[1]= r; } else if (r == 0) { fprintf(stderr, "slip: EOF on %s\n", ps_device); break; } else if (errno != ASYN_INPROGRESS) { fprintf(stderr, "slip: error reading %s: %s\n", ps_device, strerror(errno)); break; } } /* Writing to serial output. */ if (sl_len[1] > 0) { r= asyn_write(&asyn, 1, sl_buf[1], sl_len[1]); if (r > 0) { if ((sl_len[1]-= r) > 0) { memmove(sl_buf[1], sl_buf[1] + r, sl_len[1]); } } else if (r == 0) { fprintf(stderr, "slip: EOF on serial output\n"); break; } else if (errno != ASYN_INPROGRESS) { fprintf(stderr, "slip: serial output error: %s\n", strerror(errno)); break; } } } /* Wait for something to happen. */ if (asyn_wait(&asyn, 0, nil) < 0) { fprintf(stderr, "slip: error while waiting for I/O to happen: %s\n", strerror(errno)); break; } } #if !HAS_ASYN /* Tell my alter ego that the game is over. */ kill(other_pid, SIGKILL); #endif return 1; } static int fprintf(int fd, const char *format, ...) /* Simple fprintf() to save a few bytes by not using the stdio library. */ { int len; ssize_t r; const char *fp0, *fp; va_list ap; len= 0; fp= fp0= format; va_start(ap, format); while (*fp != 0) { if (*fp == '%' && memchr("sdu", fp[1], 3) != nil) { if (fp > fp0) { if ((r= write(fd, fp0, (fp - fp0))) < 0) return -1; len+= r; } fp++; fp0= fp+1; if (*fp == 's') { char *s= va_arg(ap, char *); if ((r= write(fd, s, strlen(s))) < 0) return -1; len+= r; } else { int d; unsigned u; char a[3 * sizeof(u) + 2]; char *p; if (*fp == 'd') { u= d= va_arg(ap, int); if (d < 0) u= -u; } else { u= va_arg(ap, unsigned); d= 0; } p= a + sizeof(a); *--p= 0; do *--p= '0' + (u % 10); while ((u /= 10) > 0); if (d < 0) *--p= '-'; if ((r= write(fd, p, (a + sizeof(a)) - p)) < 0) return -1; len+= r; } } fp++; } if (fp > fp0) { if ((r= write(fd, fp0, (fp - fp0))) < 0) return -1; len+= r; } va_end(ap); return len; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Q��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sort - sort a file of lines Author: Michiel Huisjes */ /* SYNOPSIS: * sort [-funbirdcmt'x'] [+beg_pos[opts] [-end_pos]] [-o outfile] [file].. * * [opts] can be any of * -f : Fold upper case to lower. * -n : Sort to numeric value (optional decimal point) implies -b * -b : Skip leading blanks * -i : Ignore chars outside ASCII range (040 - 0176) * -r : Reverse the sense of comparisons. * -d : Sort to dictionary order. Only letters, digits, comma's and points * are compared. * If any of these flags are used in [opts], then they override all global * ordering for this field. * * I/O control flags are: * -u : Print uniq lines only once. * -c : Check if files are sorted in order. * -m : Merge already sorted files. * -o outfile : Name of output file. (Can be one of the input files). * Default is stdout. * - : Take stdin as input. * * Fields: * -t'x' : Field separating character is 'x' * +a.b : Start comparing at field 'a' with offset 'b'. A missing 'b' is * taken to be 0. * -a.b : Stop comparing at field 'a' with offset 'b'. A missing 'b' is * taken to be 0. * A missing -a.b means the rest of the line. */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #include <limits.h> #define OPEN_FILES (OPEN_MAX-4) /* Nr of open files per process */ #if __minix_vmd #define MEMORY_SIZE (1024 * 1024) #else #define MEMORY_SIZE ((10 * sizeof(int)) * 1024) #endif /* Total mem_size */ #define LINE_SIZE (1024 >> 1) /* Max length of a line */ #define IO_SIZE (2 * 1024) /* Size of buffered output */ #define STD_OUT 1 /* Fd of terminal */ /* Return status of functions */ #define OK 0 #define ERROR -1 #define NIL_PTR ((char *) 0) /* Compare return values */ #define LOWER -1 #define SAME 0 #define HIGHER 1 /* Table definitions. */ #define DICT 0x001 /* Alpha, numeric, letters and . */ #define ASCII 0x002 /* All between ' ' and '~' */ #define BLANK 0x004 /* ' ' and '\t' */ #define DIGIT 0x008 /* 0-9 */ #define UPPER 0x010 /* A-Z */ typedef int BOOL; #define FALSE 0 #define TRUE 1 typedef struct { int fd; /* Fd of file */ char *buffer; /* Buffer for reads */ int read_chars; /* Nr of chars actually read in buffer */ int cnt; /* Nr of chars taken out of buffer */ char *line; /* Contains line currently used */ } MERGE; #define NIL_MERGE ((MERGE *) 0) MERGE merge_f[OPEN_FILES]; /* Merge structs */ int buf_size; /* Size of core available for each struct */ #define FIELDS_LIMIT 10 /* 1 global + 9 user */ #define GLOBAL 0 typedef struct { int beg_field, beg_pos; /* Begin field + offset */ int end_field, end_pos; /* End field + offset. ERROR == EOLN */ BOOL reverse; /* TRUE if rev. flag set on this field */ BOOL blanks; BOOL dictionary; BOOL fold_case; BOOL ascii; BOOL numeric; } FIELD; /* Field declarations. A total of FILEDS_LIMIT is allowed */ FIELD fields[FIELDS_LIMIT]; int field_cnt; /* Nr of field actually assigned */ /* Various output control flags */ BOOL check = FALSE; BOOL only_merge = FALSE; BOOL uniq = FALSE; char *mem_top; /* Mem_top points to lowest pos of memory. */ char *cur_pos; /* First free position in mem */ char **line_table; /* Pointer to the internal line table */ BOOL in_core = TRUE; /* Set if input cannot all be sorted in core */ /* Place where temp_files should be made */ char temp_files[] = "/tmp/sort.XXXXX.XX"; char *output_file; /* Name of output file */ int out_fd; /* Fd to output file (could be STD_OUT) */ char out_buffer[IO_SIZE]; /* For buffered output */ char **argptr; /* Pointer to argv structure */ int args_offset; /* Nr of args spilled on options */ int args_limit; /* Nr of args given */ char separator; /* Char that separates fields */ int nr_of_files = 0; /* Nr_of_files to be merged */ int disabled; /* Nr of files done */ char USAGE[] = "Usage: sort [-funbirdcmt'x'] [+beg_pos [-end_pos]] [-o outfile] [file] .."; /* Forward declarations */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void get_opts, (char *ptr, FIELD * field)); _PROTOTYPE(void new_field, (FIELD * field, int *offset, BOOL beg_fl)); _PROTOTYPE(void adjust_options, (FIELD * field)); _PROTOTYPE(void error, (BOOL quit, char *message, char *arg)); _PROTOTYPE(void open_outfile, (void)); _PROTOTYPE(void get_file, (int fd, off_t size)); _PROTOTYPE(int last_line, (void)); _PROTOTYPE(void print_table, (int fd)); _PROTOTYPE(char *file_name, (int nr)); _PROTOTYPE(void mread, (int fd, char *address, int bytes)); _PROTOTYPE(void mwrite, (int fd, char *address, int bytes)); _PROTOTYPE(void sort, (void)); _PROTOTYPE(void sort_table, (int nel)); _PROTOTYPE(void incr, (int si, int ei)); _PROTOTYPE(int cmp_fields, (char *el1, char *el2)); _PROTOTYPE(void build_field, (char *dest, FIELD * field, char *src)); _PROTOTYPE(char *skip_fields, (char *str, int nf)); _PROTOTYPE(int compare, (char *el1, char *el2)); _PROTOTYPE(int cmp, (unsigned char *el1, unsigned char *el2, FIELD * field)); _PROTOTYPE(int digits, (char *str1, char *str2, BOOL check_sign)); _PROTOTYPE(void files_merge, (int file_cnt)); _PROTOTYPE(void merge, (int start_file, int limit_file)); _PROTOTYPE(void put_line, (char *line)); _PROTOTYPE(MERGE * print, (MERGE * merg, int file_cnt)); _PROTOTYPE(int read_line, (MERGE * merg)); _PROTOTYPE(MERGE * skip_lines, (MERGE * smallest, int file_cnt)); _PROTOTYPE(void uniq_lines, (MERGE * merg)); _PROTOTYPE(void check_file, (int fd, char *file)); _PROTOTYPE(int length, (char *line)); _PROTOTYPE(void copy, (char *dest, char *src)); _PROTOTYPE(char *msbrk, (int size)); _PROTOTYPE(void mbrk, (char *address)); _PROTOTYPE(void catch, (int dummy)); /* Table of all chars. 0 means no special meaning. */ char table[256] = { /* '^@' to space */ 0, 0, 0, 0, 0, 0, 0, 0, 0, BLANK | DICT, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* Space to '0' */ BLANK | DICT | ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* '0' until '9' */ DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, DIGIT | DICT | ASCII, /* ASCII from ':' to '@' */ ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* Upper case letters 'A' to 'Z' */ UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, UPPER | DICT | ASCII, /* ASCII from '[' to '`' */ ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* Lower case letters from 'a' to 'z' */ DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, DICT | ASCII, /* ASCII from '{' to '~' */ ASCII, ASCII, ASCII, ASCII, /* Stuff from -1 to -177 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * Get_opts () assigns the options into the field structure as described in ptr. * This field structure could be the GLOBAL one. */ Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������void get_opts(ptr, field) register char *ptr; register FIELD *field; { switch (*ptr) { case 'b': /* Skip leading blanks */ field->blanks = TRUE; break; case 'd': /* Dictionary order */ field->dictionary = TRUE; break; case 'f': /* Fold upper case to lower */ field->fold_case = TRUE; break; case 'i': /* Skip chars outside ' ' '~' */ field->ascii = TRUE; break; case 'n': /* Sort on numeric */ field->numeric = TRUE; field->blanks = TRUE; break; case 'r': /* Reverse comparisons */ field->reverse = TRUE; break; default: /* Illegal options */ error(TRUE, USAGE, NIL_PTR); } } /* New_field () assigns a new field as described by the arguments. * A field description is of the form: +a.b[opts] -c.d, where b and d, as well * as -c.d and [opts] are optional. Nr before digit is field nr. Nr after digit * is offset from field. */ void new_field(field, offset, beg_fl) register FIELD *field; /* Field to assign */ int *offset; /* Offset in argv structure */ BOOL beg_fl; /* Assign beg or end of field */ { register char *ptr; ptr = argptr[*offset]; *offset += 1; /* Incr offset to next arg */ ptr++; if (beg_fl) field->beg_field = atoi(ptr); /* Assign int of first field */ else field->end_field = atoi(ptr); while (table[*ptr] & DIGIT) /* Skip all digits */ ptr++; if (*ptr == '.') { /* Check for offset */ ptr++; if (beg_fl) field->beg_pos = atoi(ptr); else field->end_pos = atoi(ptr); while (table[*ptr] & DIGIT) /* Skip digits */ ptr++; } if (beg_fl) { while (*ptr != '\0') /* Check options after field */ get_opts(ptr++, field); } if (beg_fl) { /* Check for end pos */ ptr = argptr[*offset]; if (ptr && *ptr == '-' && ((table[*(ptr + 1)] & DIGIT) || *(ptr + 1) == '.')) { new_field(field, offset, FALSE); if (field->beg_field > field->end_field) error(TRUE, "End field is before start field!", NIL_PTR); } else /* No end pos. */ field->end_field = ERROR; } } int main(argc, argv) int argc; char *argv[]; { int arg_count = 1; /* Offset in argv */ struct stat st; register char *ptr; /* Ptr to *argv in use */ register int fd; int pid, pow; argptr = argv; cur_pos = mem_top = msbrk(MEMORY_SIZE); /* Find lowest mem. location */ while (arg_count < argc && ((ptr = argv[arg_count])[0] == '-' || *ptr == '+')) { if (*ptr == '-' && *(ptr + 1) == '\0') /* "-" means stdin */ break; if (*ptr == '+') { /* Assign field. */ if (++field_cnt == FIELDS_LIMIT) error(TRUE, "Too many fields", NIL_PTR); new_field(&fields[field_cnt], &arg_count, TRUE); } else { /* Get output options */ while (*++ptr) { switch (*ptr) { case 'c': /* Only check file */ check = TRUE; break; case 'm': /* Merge (sorted) files */ only_merge = TRUE; break; case 'u': /* Only give uniq lines */ uniq = TRUE; break; case 'o': /* Name of output file */ output_file = argv[++arg_count]; break; case 't': /* Field separator */ ptr++; separator = *ptr; break; default: /* Sort options */ get_opts(ptr, &fields[GLOBAL]); } } arg_count++; } } for (fd = 1; fd <= field_cnt; fd++) adjust_options(&fields[fd]); /* Create name of tem_files 'sort.pid.aa' */ ptr = &temp_files[10]; pid = getpid(); pow = 10000; while (pow != 0) { *ptr++ = pid / pow + '0'; pid %= pow; pow /= 10; } signal(SIGINT, catch); /* Only merge files. Set up */ if (only_merge) { args_limit = args_offset = arg_count; while (argv[args_limit] != NIL_PTR) args_limit++; /* Find nr of args */ files_merge(args_limit - arg_count); exit(0); } if (arg_count == argc) { /* No args left. Use stdin */ if (check) check_file(0, NIL_PTR); else get_file(0, (off_t) 0); } else while (arg_count < argc) { /* Sort or check args */ if (strcmp(argv[arg_count], "-") == 0) fd = 0; else if (stat(argv[arg_count], &st) < 0) { error(FALSE, "Cannot find ", argv[arg_count++]); continue; } /* Open files */ else if ((fd = open(argv[arg_count], O_RDONLY)) < 0) { error(FALSE, "Cannot open ", argv[arg_count++]); continue; } if (check) check_file(fd, argv[arg_count]); else /* Get_file reads whole file */ get_file(fd, st.st_size); arg_count++; } if (check) exit(0); sort(); /* Sort whatever is left */ if (nr_of_files == 1) /* Only one file sorted -> don't merge */ exit(0); files_merge(nr_of_files); return(0); } /* Adjust_options() assigns all global variables set also in the fields * assigned. */ void adjust_options(field) register FIELD *field; { register FIELD *gfield = &fields[GLOBAL]; if (gfield->reverse) field->reverse = TRUE; if (gfield->blanks) field->blanks = TRUE; if (gfield->dictionary) field->dictionary = TRUE; if (gfield->fold_case) field->fold_case = TRUE; if (gfield->ascii) field->ascii = TRUE; if (gfield->numeric) field->numeric = TRUE; } /* Error () prints the error message on stderr and exits if quit == TRUE. */ void error(quit, message, arg) register BOOL quit; register char *message, *arg; { write(2, message, strlen(message)); if (arg != NIL_PTR) write(2, arg, strlen(arg)); perror(" "); if (quit) exit(1); } /* Open_outfile () assigns to out_fd the fd where the output must go when all * the sorting is done. */ void open_outfile() { if (output_file == NIL_PTR) out_fd = STD_OUT; else if ((out_fd = creat(output_file, 0644)) < 0) error(TRUE, "Cannot creat ", output_file); } /* Get_file reads the whole file of filedescriptor fd. If the file is too big * to keep in core, a partial sort is done, and the output is stashed somewhere. */ void get_file(fd, size) int fd; /* Fd of file to read */ register off_t size; /* Size of file */ { register int i; int rest; /* Rest in memory */ char save_ch; /* Used in stdin readings */ rest = MEMORY_SIZE - (cur_pos - mem_top); if (fd == 0) { /* We're reding stdin */ while ((i = read(0, cur_pos, rest)) > 0) { if ((cur_pos - mem_top) + i == MEMORY_SIZE) { in_core = FALSE; i = last_line(); /* End of last line */ save_ch = mem_top[i]; mem_top[i] = '\0'; sort(); /* Sort core */ mem_top[i] = save_ch; /* Restore erased char */ /* Restore last (half read) line */ for (rest = 0; i + rest != MEMORY_SIZE; rest++) mem_top[rest] = mem_top[i + rest]; /* Assign current pos. in memory */ cur_pos = &mem_top[rest]; } else { /* Fits, just assign position in mem. */ cur_pos = cur_pos + i; *cur_pos = '\0'; } /* Calculate rest of mem */ rest = MEMORY_SIZE - (cur_pos - mem_top); } } /* Reading file. Check size */ else if (size > rest) { /* Won't fit */ mread(fd, cur_pos, rest); in_core = FALSE; i = last_line(); /* Get pos. of last line */ mem_top[i] = '\0'; /* Truncate */ (void) lseek(fd, (off_t) (i - MEMORY_SIZE), SEEK_CUR); /* Do this next time */ size = size - rest - i + MEMORY_SIZE; /* Calculate rest */ cur_pos = mem_top; /* Reset mem */ sort(); /* Sort core */ get_file(fd, size); /* Get rest of file */ } else { /* Fits. Just read in */ rest = size; mread(fd, cur_pos, rest); cur_pos = cur_pos + rest; /* Reassign cur_pos */ *cur_pos = '\0'; (void) close(fd); /* File completed */ } } /* Last_line () find the last line in core and retuns the offset from the top * of the memory. */ int last_line() { register int i; for (i = MEMORY_SIZE - 2; i > 0; i--) if (mem_top[i] == '\n') break; return i + 1; } /* Print_table prints the line table in the given file_descriptor. If the fd * equals ERROR, it opens a temp_file itself. */ void print_table(fd) int fd; { register char **line_ptr; /* Ptr in line_table */ register char *ptr; /* Ptr to line */ int index = 0; /* Index in output buffer */ if (fd == ERROR) { if ((fd = creat(file_name(nr_of_files), 0644)) < 0) error(TRUE, "Cannot creat ", file_name(nr_of_files)); } for (line_ptr = line_table; *line_ptr != NIL_PTR; line_ptr++) { ptr = *line_ptr; /* Skip all same lines if uniq is set */ if (uniq && *(line_ptr + 1) != NIL_PTR) { if (compare(ptr, *(line_ptr + 1)) == SAME) continue; } do { /* Print line in a buffered way */ out_buffer[index++] = *ptr; if (index == IO_SIZE) { mwrite(fd, out_buffer, IO_SIZE); index = 0; } } while (*ptr++ != '\n'); } mwrite(fd, out_buffer, index);/* Flush buffer */ (void) close(fd); /* Close file */ nr_of_files++; /* Increment nr_of_files to merge */ } /* File_name () returns the nr argument from the argument list, or a uniq * filename if the nr is too high, or the arguments were not merge files. */ char *file_name(nr) register int nr; { if (only_merge) { if (args_offset + nr < args_limit) return argptr[args_offset + nr]; } temp_files[16] = nr / 26 + 'a'; temp_files[17] = nr % 26 + 'a'; return temp_files; } /* Mread () performs a normal read (), but checks the return value. */ void mread(fd, address, bytes) int fd; char *address; register int bytes; { if (read(fd, address, bytes) < 0 && bytes != 0) error(TRUE, "Read error", NIL_PTR); } /* Mwrite () performs a normal write (), but checks the return value. */ void mwrite(fd, address, bytes) int fd; char *address; register int bytes; { if (write(fd, address, bytes) != bytes && bytes != 0) error(TRUE, "Write error", NIL_PTR); } /* Sort () sorts the input in memory starting at mem_top. */ void sort() { register char *ptr = mem_top; register int count = 0; /* Count number of lines in memory */ while (*ptr) { if (*ptr++ == '\n') count++; } /* Set up the line table */ line_table = (char **) msbrk(count * sizeof(char *) + sizeof(char *)); count = 1; ptr = line_table[0] = mem_top; while (*ptr) { if (*ptr++ == '\n') line_table[count++] = ptr; } line_table[count - 1] = NIL_PTR; /* Sort the line table */ sort_table(count - 1); /* Stash output somewhere */ if (in_core) { open_outfile(); print_table(out_fd); } else print_table(ERROR); /* Free line table */ mbrk((char *) line_table); } /* Sort_table () sorts the line table consisting of nel elements. */ void sort_table(nel) register int nel; { char *tmp; register int i; /* Make heap */ for (i = (nel >> 1); i >= 1; i--) incr(i, nel); /* Sort from heap */ for (i = nel; i > 1; i--) { tmp = line_table[0]; line_table[0] = line_table[i - 1]; line_table[i - 1] = tmp; incr(1, i - 1); } } /* Incr () increments the heap. */ void incr(si, ei) register int si, ei; { char *tmp; while (si <= (ei >> 1)) { si <<= 1; if (si + 1 <= ei && compare(line_table[si - 1], line_table[si]) <= 0) si++; if (compare(line_table[(si >> 1) - 1], line_table[si - 1]) >= 0) return; tmp = line_table[(si >> 1) - 1]; line_table[(si >> 1) - 1] = line_table[si - 1]; line_table[si - 1] = tmp; } } /* Cmp_fields builds new lines out of the lines pointed to by el1 and el2 and * puts it into the line1 and line2 arrays. It then calls the cmp () routine * with the field describing the arguments. */ int cmp_fields(el1, el2) register char *el1, *el2; { int i, ret; char line1[LINE_SIZE], line2[LINE_SIZE]; for (i = 0; i < field_cnt; i++) { /* Setup line parts */ build_field(line1, &fields[i + 1], el1); build_field(line2, &fields[i + 1], el2); if ((ret = cmp((unsigned char *) line1, (unsigned char *) line2, &fields[i + 1])) != SAME) break; /* If equal, try next field */ } /* Check for reverse flag */ if (i != field_cnt && fields[i + 1].reverse) return -ret; /* Else return the last return value of cmp () */ return ret; } /* Build_field builds a new line from the src as described by the field. * The result is put in dest. */ void build_field(dest, field, src) char *dest; /* Holds result */ register FIELD *field; /* Field description */ register char *src; /* Source line */ { char *begin = src; /* Remember start location */ char *last; /* Pointer to end location */ int i; /* Skip begin fields */ src = skip_fields(src, field->beg_field); /* Skip begin positions */ for (i = 0; i < field->beg_pos && *src != '\n'; i++) src++; /* Copy whatever is left */ copy(dest, src); /* If end field is assigned truncate (perhaps) the part copied */ if (field->end_field != ERROR) { /* Find last field */ last = skip_fields(begin, field->end_field); /* Skip positions as given by end fields description */ for (i = 0; i < field->end_pos && *last != '\n'; i++) last++; dest[last - src] = '\n';/* Truncate line */ } } /* Skip_fields () skips nf fields of the line pointed to by str. */ char *skip_fields(str, nf) register char *str; int nf; { while (nf-- > 0) { if (separator == '\0') {/* Means ' ' or '\t' */ while (*str != ' ' && *str != '\t' && *str != '\n') str++; while (table[*str] & BLANK) str++; } else { while (*str != separator && *str != '\n') str++; if (*str == separator) str++; } } return str; /* Return pointer to indicated field */ } /* Compare is called by all sorting routines. It checks if fields assignments * has been made. if so, it calls cmp_fields (). If not, it calls cmp () and * reversed the return value if the (global) reverse flag is set. */ int compare(el1, el2) register char *el1, *el2; { int ret; if (field_cnt > GLOBAL) return cmp_fields(el1, el2); ret = cmp((unsigned char *) el1, (unsigned char *) el2, &fields[GLOBAL]); return(fields[GLOBAL].reverse) ? -ret : ret; } /* Cmp () is the actual compare routine. It compares according to the * description given in the field pointer. */ int cmp(el1, el2, field) register unsigned char *el1, *el2; FIELD *field; { int c1, c2; if (field->blanks) { /* Skip leading blanks */ while (table[*el1] & BLANK) el1++; while (table[*el2] & BLANK) el2++; } if (field->numeric) /* Compare numeric */ return digits((char *) el1, (char *) el2, TRUE); for (;;) { while (*el1 == *el2) { if (*el1++ == '\n') /* EOLN on both strings */ return SAME; el2++; } if (*el1 == '\n') /* EOLN on string one */ return LOWER; if (*el2 == '\n') return HIGHER; if (field->ascii) { /* Skip chars outside 040 - 0177 */ if ((table[*el1] & ASCII) == 0) { do { el1++; } while ((table[*el1] & ASCII) == 0); continue; } if ((table[*el2] & ASCII) == 0) { do { el2++; } while ((table[*el2] & ASCII) == 0); continue; } } if (field->dictionary) {/* Skip non-dict chars */ if ((table[*el1] & DICT) == 0) { do { el1++; } while ((table[*el1] & DICT) == 0); continue; } if ((table[*el2] & DICT) == 0) { do { el2++; } while ((table[*el2] & DICT) == 0); continue; } } if (field->fold_case) { /* Fold upper case to lower */ if (table[c1 = *el1++] & UPPER) c1 += 'a' - 'A'; if (table[c2 = *el2++] & UPPER) c2 += 'a' - 'A'; if (c1 == c2) continue; return c1 - c2; } return *el1 - *el2; } /* NOTREACHED */ } /* * Digits compares () the two strings that point to a number of digits followed * by an optional decimal point. */ int digits(str1, str2, check_sign) register char *str1, *str2; BOOL check_sign; /* True if sign must be checked */ { BOOL negative = FALSE; /* True if negative numbers */ int diff, pow, ret; /* Check for optional minus or plus sign */ if (check_sign) { if (*str1 == '-') { negative = TRUE; str1++; } else if (*str1 == '+') str1++; if (*str2 == '-') { if (negative == FALSE) return HIGHER; str2++; } else if (negative) return LOWER; else if (*str2 == '+') str2++; } /* Keep incrementing as long as digits are available and equal */ while ((table[*str1] & DIGIT) && table[*str2] & DIGIT) { if (*str1 != *str2) break; str1++; str2++; } /* First check for the decimal point. */ if (*str1 == '.' || *str2 == '.') { if (*str1 == '.') { if (*str2 == '.') /* Both. Check decimal part */ ret = digits(str1 + 1, str2 + 1, FALSE); else ret = (table[*str2] & DIGIT) ? LOWER : HIGHER; } else ret = (table[*str1] & DIGIT) ? HIGHER : LOWER; } /* Now either two digits differ, or unknown char is seen (e.g. end of string) */ else if ((table[*str1] & DIGIT) && (table[*str2] & DIGIT)) { diff = *str1 - *str2; /* Basic difference */ pow = 0; /* Check power of numbers */ while (table[*str1++] & DIGIT) pow++; while (table[*str2++] & DIGIT) pow--; ret = (pow == 0) ? diff : pow; } /* Unknown char. Check on which string it occurred */ else { if ((table[*str1] & DIGIT) == 0) ret = (table[*str2] & DIGIT) ? LOWER : SAME; else ret = HIGHER; } /* Reverse sense of comparisons if negative is true. (-1000 < -1) */ return(negative) ? -ret : ret; } /* Files_merge () merges all files as indicated by nr_of_files. Merging goes * in numbers of files that can be opened at the same time. (OPEN_FILES) */ void files_merge(file_cnt) register int file_cnt; /* Nr_of_files to merge */ { register int i; int limit; for (i = 0; i < file_cnt; i += OPEN_FILES) { /* Merge last files and store in output file */ if ((limit = i + OPEN_FILES) >= file_cnt) { open_outfile(); limit = file_cnt; } else { /* Merge OPEN_FILES files and store in temp * file */ temp_files[16] = file_cnt / 26 + 'a'; temp_files[17] = file_cnt % 26 + 'a'; if ((out_fd = creat(temp_files, 0644)) < 0) error(TRUE, "Cannot creat ", temp_files); file_cnt++; } merge(i, limit); } /* Cleanup mess */ i = (only_merge) ? args_limit - args_offset : 0; while (i < file_cnt) (void) unlink(file_name(i++)); } /* Merge () merges the files between start_file and limit_file. */ void merge(start_file, limit_file) int start_file, limit_file; { register MERGE *smallest; /* Keeps track of smallest line */ register int i; int file_cnt = limit_file - start_file; /* Nr of files to merge */ /* Calculate size in core available for file_cnt merge structs */ buf_size = MEMORY_SIZE / file_cnt - LINE_SIZE; mbrk(mem_top); /* First reset mem to lowest loc. */ disabled = 0; /* All files not done yet */ /* Set up merge structures. */ for (i = start_file; i < limit_file; i++) { smallest = &merge_f[i - start_file]; if (!strcmp(file_name(i), "-")) /* File is stdin */ smallest->fd = 0; else if ((smallest->fd = open(file_name(i), O_RDONLY)) < 0) { smallest->fd = ERROR; error(FALSE, "Cannot open ", file_name(i)); disabled++; /* Done this file */ continue; } smallest->buffer = msbrk(buf_size); smallest->line = msbrk(LINE_SIZE); smallest->cnt = smallest->read_chars = 0; (void) read_line(smallest); /* Read first line */ } if (disabled == file_cnt) { /* Couldn't open files */ (void) close(out_fd); return; } /* Find a merg struct to assign smallest. */ for (i = 0; i < file_cnt; i++) { if (merge_f[i].fd != ERROR) { smallest = &merge_f[i]; break; } } /* Loop until all files minus one are done */ while (disabled < file_cnt - 1) { if (uniq) /* Skip all same lines */ smallest = skip_lines(smallest, file_cnt); else { /* Find smallest line */ for (i = 0; i < file_cnt; i++) { if (merge_f[i].fd == ERROR) continue; /* We've had this one */ if (compare(merge_f[i].line, smallest->line) < 0) smallest = &merge_f[i]; } } /* Print line and read next */ smallest = print(smallest, file_cnt); } if (only_merge && uniq) uniq_lines(smallest); /* Print only uniq lines */ else /* Print rest of file */ while (print(smallest, file_cnt) != NIL_MERGE); put_line(NIL_PTR); /* Flush output buffer */ } /* Put_line () prints the line into the out_fd filedescriptor. If line equals * NIL_PTR, the out_fd is flushed and closed. */ void put_line(line) register char *line; { static int index = 0; /* Index in out_buffer */ if (line == NIL_PTR) { /* Flush and close */ mwrite(out_fd, out_buffer, index); index = 0; (void) close(out_fd); return; } do { /* Fill out_buffer with line */ out_buffer[index++] = *line; if (index == IO_SIZE) { mwrite(out_fd, out_buffer, IO_SIZE); index = 0; } } while (*line++ != '\n'); } /* * Print () prints the line of the merg structure and tries to read another one. * If this fails, it returns the next merg structure which file_descriptor is * still open. If none could be found, a NIL structure is returned. */ MERGE *print(merg, file_cnt) register MERGE *merg; int file_cnt; /* Nr of files that are being merged */ { register int i; put_line(merg->line); /* Print the line */ if (read_line(merg) == ERROR) { /* Read next line */ for (i = 0; i < file_cnt; i++) { if (merge_f[i].fd != ERROR) { merg = &merge_f[i]; break; } } if (i == file_cnt) /* No more files left */ return NIL_MERGE; } return merg; } /* Read_line () reads a line from the fd from the merg struct. If the read * failed, disabled is incremented and the file is closed. Readings are * done in buf_size bytes. * Lines longer than LINE_SIZE are silently truncated. */ int read_line(merg) register MERGE *merg; { register char *ptr = merg->line - 1; /* Ptr buf that will hold line */ do { ptr++; if (merg->cnt == merg->read_chars) { /* Read new buffer */ if ((merg->read_chars = read(merg->fd, merg->buffer, buf_size)) <= 0) { (void) close(merg->fd); /* OOPS */ merg->fd = ERROR; disabled++; return ERROR; } merg->cnt = 0; } *ptr = merg->buffer[merg->cnt++]; /* Assign next char of line */ if (ptr - merg->line == LINE_SIZE - 1) *ptr = '\n'; /* Truncate very long lines */ } while (*ptr != '\n' && *ptr != '\0'); if (*ptr == '\0') /* Add '\n' to last line */ *ptr = '\n'; *++ptr = '\0'; /* Add '\0' */ return OK; } /* Skip_lines () skips all same lines in all the files currently being merged. * It returns a pointer to the merge struct containing the smallest line. */ MERGE *skip_lines(smallest, file_cnt) register MERGE *smallest; int file_cnt; { register int i; int ret; if (disabled == file_cnt - 1) /* We've had all */ return smallest; for (i = 0; i < file_cnt; i++) { if (merge_f[i].fd == ERROR || smallest == &merge_f[i]) continue; /* Don't check same file */ while ((ret = compare(merge_f[i].line, smallest->line)) == 0) { if (read_line(&merge_f[i]) == ERROR) break; /* EOF */ } if (ret < 0) /* Line wasn't smallest. Try again */ return skip_lines(&merge_f[i], file_cnt); } return smallest; } /* Uniq_lines () prints only the uniq lines out of the fd of the merg struct. */ void uniq_lines(merg) register MERGE *merg; { char lastline[LINE_SIZE]; /* Buffer to hold last line */ for (;;) { put_line(merg->line); /* Print this line */ copy(lastline, merg->line); /* and save it */ if (read_line(merg) == ERROR) /* Read the next */ return; /* Keep reading until lines duffer */ while (compare(lastline, merg->line) == SAME) if (read_line(merg) == ERROR) return; } /* NOTREACHED */ } /* * Check_file () checks if a file is sorted in order according to the arguments * given in main (). */ void check_file(fd, file) int fd; char *file; { register MERGE *merg; /* 1 file only */ char lastline[LINE_SIZE]; /* Save last line */ register int ret; /* ret status of compare */ if (fd == 0) file = "stdin"; merg = (MERGE *) mem_top; /* Assign MERGE structure */ merg->buffer = mem_top + sizeof(MERGE); merg->line = msbrk(LINE_SIZE); merg->cnt = merg->read_chars = 0; merg->fd = fd; buf_size = MEMORY_SIZE - sizeof(MERGE); if (read_line(merg) == ERROR) /* Read first line */ return; copy(lastline, merg->line); /* and save it */ for (;;) { if (read_line(merg) == ERROR) /* EOF reached */ break; if ((ret = compare(lastline, merg->line)) > 0) { error(FALSE, "Disorder in file ", file); write(2, merg->line, length(merg->line)); break; } else if (ret < 0) /* Copy if lines not equal */ copy(lastline, merg->line); else if (uniq) { error(FALSE, "Non uniq line in file ", file); write(2, merg->line, length(merg->line)); break; } } mbrk(mem_top); /* Reset mem */ } /* Length () returns the length of the argument line including the linefeed. */ int length(line) register char *line; { register int i = 1; /* Add linefeed */ while (*line++ != '\n') i++; return i; } /* Copy () copies the src line into the dest line including linefeed. */ void copy(dest, src) register char *dest, *src; { while ((*dest++ = *src++) != '\n'); } /* Msbrk() does a sbrk() and checks the return value. */ char *msbrk(size) register int size; { register char *address; if ((address = sbrk(size)) == (char *) -1) error(TRUE, "Not enough memory. Use chmem to allocate more", NIL_PTR); return address; } /* Mbrk() does a brk() and checks the return value. */ void mbrk(address) char *address; { if (brk(address) == -1) error(TRUE, "Cannot reset memory", NIL_PTR); } void catch(dummy) int dummy; /* to satisfy the prototype */ { register int i; signal(SIGINT, SIG_IGN); only_merge = FALSE; for (i = 0; i < 26; i++) (void) unlink(file_name(i)); exit(2); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* split - split a file Author: Michiel Huisjes */ #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> #define CHUNK_SIZE 1024 int cut_line = 1000; int infile; char out_file[100]; char *suffix; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void split, (void)); _PROTOTYPE(int newfile, (void)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void quit, (void)); int main(argc, argv) int argc; char **argv; { unsigned short i; out_file[0] = 'x'; infile = -1; if (argc > 4) usage(); for (i = 1; i < argc; i++) { if (argv[i][0] == '-') { if (argv[i][1] >= '0' && argv[i][1] <= '9' && cut_line == 1000) cut_line = atoi(argv[i]); else if (argv[i][1] == '\0' && infile == -1) infile = 0; else usage(); } else if (infile == -1) { if ((infile = open(argv[i], O_RDONLY)) < 0) { std_err("Cannot open input file.\n"); exit(1); } } else strcpy(out_file, argv[i]); } if (infile == -1) infile = 0; strcat(out_file, "aa"); for (suffix = out_file; *suffix; suffix++); suffix--; /* Appendix now points to last `a' of "aa". We have to decrement it by one */ *suffix = 'a' - 1; split(); return(0); } void split() { char buf[CHUNK_SIZE]; register char *index, *base; register int n; int fd; long lines = 0L; fd = -1; while ((n = read(infile, buf, CHUNK_SIZE)) > 0) { base = index = buf; while (--n >= 0) { if (*index++ == '\n') if (++lines % cut_line == 0) { if (fd == -1) fd = newfile(); if (write(fd, base, (int) (index - base)) != (int) (index - base)) quit(); base = index; close(fd); fd = -1; } } if (index == base) continue; if (fd == -1) fd = newfile(); if (write(fd, base, (int) (index - base)) != (int) (index - base)) quit(); } } int newfile() { int fd; if (++*suffix > 'z') { /* Increment letter */ *suffix = 'a'; /* Reset last letter */ ++*(suffix - 1); /* Previous letter must be incremented */ /* E.g. was `filename.az' */ /* Now `filename.ba' */ } if ((fd = creat(out_file, 0644)) < 0) { std_err("Cannot create new file.\n"); exit(2); } return fd; } void usage() { std_err("Usage: split [-n] [file [name]].\n"); exit(1); } void quit() { std_err("split: write error\n"); exit(1); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* strings - print ASCII strings in a file Author: Peter S. Housel */ /* This is a version of the BSD "strings" program for Minix. It is used to search a file for printable strings. To install, cc -o strings strings.c chmem =8000 strings Command: strings - search file for printable strings Syntax: strings [-] [-o] [-len] file ... Flags: - Search the entire file. If this option is not given, only the initialized data segment of files that appear to be "a.out" format is searched. -o Print the offset (in octal) with each string. -len Use "len" as the minimum string length. The default is 4. Examples: strings core strings -o a.out > str Strings searches the specified file(s) for printable ASCII strings (four or more printable characters followed by a newline or a null) and writes them to the standard output. This can be used to find out, for example, to find out what program a "core" file came from, what kinds of error messages are in an executable, or to see ASCII data hidden in a "binary" data file. P.S. The program doesn't use the "a.out.h" file posted last week by Dick van Veen, both because it was written before then, and because not everybody has a.out.h yet. Future revisions probably ought to, though. */ #include <ctype.h> #include <stdlib.h> #include <string.h> #include <stdio.h> /* Minix (8086 version) dependant definitions */ #define SMALLMAGIC 0x04100301L /* small model a.out magic number */ #define SEPARATEMAGIC 0x04200301L /* separate instruction/data a.out */ #define HDR_MAGIC 0 /* 0'th long magic number */ #define HDR_HSIZE 1 /* 1'st long size of header */ #define HDR_TSIZE 2 /* 2'nd long size of text */ #define HDR_DSIZE 3 /* 3'rd long size of init'ed data */ #define HDR_BSIZE 4 /* 4'th long size of bss */ #define HDR_TOTMEM 6 /* 6'th long total memory */ #define HDR_LEN 8 /* total length of header */ /* Miscellaneous definitions */ #define STRLEN 4 /* default minimum string length */ #define STRBUF 512 /* buffer length for strings */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void strings, (char *filename)); _PROTOTYPE(void usage, (void)); int strmin = STRLEN; /* minimum string length */ int printoff = 0; /* print octal offset of each str */ int objall = 0; /* search entire a.out file, not */ /* Just initialized data segment */ int main(argc, argv) int argc; char *argv[]; { while ((++argv, --argc) && '-' == (*argv)[0]) { if (!strcmp(*argv, "-")) ++objall; else if (!strcmp(*argv, "-o")) ++printoff; else if (isdigit((*argv)[1])) strmin = atoi(&(*argv)[1]); else usage(); } if (0 == argc) usage(); while (argc--) strings(*argv++); return(0); } void strings(filename) char *filename; { char buf[STRBUF]; /* the strings buffer */ char *bufptr; /* pointer into the strings buffer */ FILE *input; /* input file */ long header[HDR_LEN]; /* buffer for reading the header */ long offset; /* file offset */ long limit; /* limit, if doing data segment only */ int c; /* input character */ if (NULL == (input = fopen(filename, "r"))) { fprintf(stderr, "strings: "); perror(filename); exit(1); } if (HDR_LEN == fread(header, sizeof(long), (size_t)HDR_LEN, input) && (SMALLMAGIC == header[HDR_MAGIC] ||SEPARATEMAGIC == header[HDR_MAGIC]) && !objall) { offset = header[HDR_HSIZE] + header[HDR_TSIZE]; /* object file */ limit = offset + header[HDR_DSIZE]; } else { offset = 0L; limit = 0L; } fseek(input, offset, 0); bufptr = buf; while (!limit || offset < limit) { if (EOF == (c = getc(input))) break; if ((('\0' == c || '\n' == c) && bufptr - buf >= strmin) || (bufptr - buf == STRBUF - 1)) { *bufptr = '\0'; if (printoff) printf("%lo:", offset - (bufptr - buf)); puts(buf); bufptr = buf; } else if ((' ' <= c && c < 0177) || '\t' == c) *bufptr++ = c; else bufptr = buf; ++offset; } fclose(input); } void usage() { fprintf(stderr, "usage: strings [-] [-o] [-num] file ...\n"); exit(1); } ������������������������������������������������������������������/* strip - remove symbols. Author: Dick van Veen */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <a.out.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h> /* Strip [file] ... * * - when no file is present, a.out is assumed. * */ #define A_OUT "a.out" #define NAME_LENGTH 128 /* max file path name */ char buffer[BUFSIZ]; /* used to copy executable */ char new_file[NAME_LENGTH]; /* contains name of temporary */ struct exec header; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void strip, (char *file)); _PROTOTYPE(int read_header, (int fd)); _PROTOTYPE(int write_header, (int fd)); _PROTOTYPE(int make_tmp, (char *new_name, char *name)); _PROTOTYPE(int copy_file, (int fd1, int fd2, long size)); int main(argc, argv) int argc; char **argv; { argv++; if (*argv == NULL) strip(A_OUT); else while (*argv != NULL) { strip(*argv); argv++; } return(0); } void strip(file) char *file; { int fd, new_fd; struct stat buf; long symb_size, relo_size; fd = open(file, O_RDONLY); if (fd == -1) { fprintf(stderr, "can't open %s\n", file); close(fd); return; } if (read_header(fd)) { fprintf(stderr, "%s: not an executable file\n", file); close(fd); return; } if (header.a_syms == 0L) { close(fd); /* no symbol table present */ return; } symb_size = header.a_syms; header.a_syms = 0L; /* remove table size */ fstat(fd, &buf); relo_size = buf.st_size - (A_MINHDR + header.a_text + header.a_data + symb_size); new_fd = make_tmp(new_file, file); if (new_fd == -1) { fprintf(stderr, "can't create temporary file\n"); close(fd); return; } if (write_header(new_fd)) { fprintf(stderr, "can't write temporary file\n"); unlink(new_file); close(fd); close(new_fd); return; } if (copy_file(fd, new_fd, header.a_text + header.a_data)) { fprintf(stderr, "can't copy %s\n", file); unlink(new_file); close(fd); close(new_fd); return; } if (relo_size != 0) { lseek(fd, symb_size, 1); if (copy_file(fd, new_fd, relo_size)) { fprintf(stderr, "can't copy %s\n", file); unlink(new_file); close(fd); close(new_fd); return; } } close(fd); close(new_fd); if (unlink(file) == -1) { fprintf(stderr, "can't unlink %s\n", file); unlink(new_file); return; } link(new_file, file); unlink(new_file); chmod(file, buf.st_mode); } int read_header(fd) int fd; { if (read(fd, (char *) &header, A_MINHDR) != A_MINHDR) return(1); if (BADMAG(header)) return (1); if (header.a_hdrlen > sizeof(struct exec)) return (1); lseek(fd, 0L, SEEK_SET); /* variable size header */ if (read(fd, (char *)&header, (int)header.a_hdrlen) != (int) header.a_hdrlen) return(1); return(0); } int write_header(fd) int fd; { lseek(fd, 0L, SEEK_SET); if (write(fd, (char *)&header, (int)header.a_hdrlen) != (int)header.a_hdrlen) return(1); return(0); } int make_tmp(new_name, name) char *new_name, *name; { int len; char *nameptr; len = strlen(name); if (len + 1 > NAME_LENGTH) return(-1); strcpy(new_name, name); nameptr = strrchr(new_name, '/'); if (nameptr == NULL) nameptr = new_name - 1; if (nameptr - new_name + 6 + 1 > NAME_LENGTH) return (-1); strcpy(nameptr + 1, "XXXXXX"); mktemp(new_name); return(creat(new_name, 0777)); } int copy_file(fd1, fd2, size) int fd1, fd2; long size; { int length; while (size > 0) { if (size < sizeof(buffer)) length = size; else length = sizeof(buffer); if (read(fd1, buffer, length) != length) return(1); if (write(fd2, buffer, length) != length) return (1); size -= length; } return(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* stty - set terminal mode Author: Andy Tanenbaum */ /* Adapted to POSIX 1003.2 by Philip Homburg. */ #ifdef __minix_vmd #define _MINIX_SOURCE #endif #include <assert.h> #include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #ifdef __minix #include <sys/types.h> #include <sys/ioctl.h> #endif /* Default settings, the Minix ones are defined in <termios.h> */ #ifndef TCTRL_DEF #define TCTRL_DEF (PARENB | CREAD | CS7) #endif #ifndef TSPEED_DEF #define TSPEED_DEF B1200 #endif #ifndef TINPUT_DEF #define TINPUT_DEF (BRKINT | IGNPAR | ISTRIP | ICRNL) #endif #ifndef TOUTPUT_DEF #define TOUTPUT_DEF OPOST #endif #ifndef TLOCAL_DEF #define TLOCAL_DEF (ISIG | IEXTEN | ICANON | ECHO | ECHOE) #endif #ifndef TEOF_DEF #define TEOF_DEF '\4' /* ^D */ #endif #ifndef TEOL_DEF #ifdef _POSIX_VDISABLE #define TEOL_DEF _POSIX_VDISABLE #else #define TEOL_DEF '\n' #endif #endif #ifndef TERASE_DEF #define TERASE_DEF '\10' /* ^H */ #endif #ifndef TINTR_DEF #define TINTR_DEF '\177' /* ^? */ #endif #ifndef TKILL_DEF #define TKILL_DEF '\25' /* ^U */ #endif #ifndef TQUIT_DEF #define TQUIT_DEF '\34' /* ^\ */ #endif #ifndef TSUSP_DEF #define TSUSP_DEF '\32' /* ^Z */ #endif #ifndef TSTART_DEF #define TSTART_DEF '\21' /* ^Q */ #endif #ifndef TSTOP_DEF #define TSTOP_DEF '\23' /* ^S */ #endif #ifndef TMIN_DEF #define TMIN_DEF 1 #endif #ifndef TTIME_DEF #define TTIME_DEF 0 #endif char *prog_name; struct termios termios; int column= 0, max_column=80; /* Assume 80 character terminals. */ #ifdef __minix struct winsize winsize; #endif #if __minix #define PROTO(a) _ARGS(a) #else #define PROTO(a) () #endif void main PROTO(( int argc, char **argv )); void report PROTO(( int flags )); int option PROTO(( char *opt, char *next )); int match PROTO(( char *s1, char *s2 )); void prctl PROTO(( int c )); speed_t long2speed PROTO(( long num )); long speed2long PROTO(( unsigned long speed )); void print_flags PROTO(( unsigned long flags, unsigned long flag, unsigned long def, char *string, int all )); void output PROTO(( char *s )); void do_print_char PROTO(( unsigned chr, unsigned def, char *name, int all )); void do_print_num PROTO(( unsigned num, unsigned def, char *name, int all )); void set_saved_settings PROTO(( char *opt )); void set_control PROTO(( int option, char *value )); void set_min_tim PROTO(( int option, char *value )); #define print_char(c,d,n,a) (do_print_char((unsigned)(c),(unsigned)(d),(n),(a))) #define print_num(m,d,n,a) (do_print_num((unsigned)(m),(unsigned)(d),(n),(a))) void main(argc, argv) int argc; char *argv[]; { int flags, k; prog_name= argv[0]; flags= 0; /* Stty with no arguments just reports on current status. */ if (tcgetattr(0, &termios) == -1) { fprintf(stderr, "%s: can't read ioctl parameters from stdin: %s\n", prog_name, strerror(errno)); exit(1); } #ifdef __minix if (ioctl(0, TIOCGWINSZ, &winsize) == -1) { fprintf(stderr, "%s: can't get screen size from stdin: %s\n", prog_name, strerror(errno)); exit(1); } if (winsize.ws_col != 0) max_column= winsize.ws_col; #endif if (argc == 2) { if (!strcmp(argv[1], "-a")) flags |= 1; else if (!strcmp(argv[1], "-g")) flags |= 2; } if (argc == 1 || flags) { report(flags); exit(0); } /* Process the options specified. */ for (k= 1; k < argc; k++) k += option(argv[k], k+1 < argc ? argv[k+1] : ""); #ifdef __minix if (ioctl(0, TIOCSWINSZ, &winsize) == -1) { fprintf(stderr, "%s: can't set screen size to stdin: %s\n", prog_name, strerror(errno)); exit(1); } #endif if (tcsetattr(0, TCSANOW, &termios) == -1) { fprintf(stderr, "%s: can't set terminal parameters to stdin: %s\n", prog_name, strerror(errno)); exit(1); } exit(0); } void report(flags) int flags; { int i, all; tcflag_t c_cflag, c_iflag, c_oflag, c_lflag; char line[80]; speed_t ispeed, ospeed; if (flags & 2) { /* We have to write the termios structure in a encoded form * to stdout. */ printf(":%x:%x:%x:%x:%x:%x", termios.c_iflag, termios.c_oflag, termios.c_cflag, termios.c_lflag, cfgetispeed(&termios), cfgetospeed(&termios)); for (i= 0; i<NCCS; i++) printf(":%x", termios.c_cc[i]); printf(":\n"); return; } all= !!flags; /* Start with the baud rate. */ ispeed= cfgetispeed(&termios); ospeed= cfgetospeed(&termios); if (ispeed != ospeed) { sprintf(line, "ispeed %lu baud; ospeed %lu baud;", speed2long(ispeed), speed2long(ospeed)); output(line); } else if (all || ospeed != TSPEED_DEF) { sprintf(line, "speed %lu baud;", speed2long(ospeed)); output(line); } /* The control modes. */ c_cflag= termios.c_cflag; if (all || (c_cflag & CSIZE) != (TCTRL_DEF & CSIZE)) { switch (c_cflag & CSIZE) { case CS5: output("cs5"); break; case CS6: output("cs6"); break; case CS7: output("cs7"); break; case CS8: output("cs8"); break; default: output("cs??"); break; } } print_flags(c_cflag, PARENB, TCTRL_DEF, "-parenb", all); print_flags(c_cflag, PARODD, TCTRL_DEF, "-parodd", all); print_flags(c_cflag, HUPCL, TCTRL_DEF, "-hupcl", all); print_flags(c_cflag, CSTOPB, TCTRL_DEF, "-cstopb", all); print_flags(c_cflag, CREAD, TCTRL_DEF, "-cread", all); print_flags(c_cflag, CLOCAL, TCTRL_DEF, "-clocal", all); if (all) { printf("\n"); column= 0; } /* The input flags. */ c_iflag= termios.c_iflag; print_flags(c_iflag, IGNBRK, TINPUT_DEF, "-ignbrk", all); print_flags(c_iflag, BRKINT, TINPUT_DEF, "-brkint", all); print_flags(c_iflag, IGNPAR, TINPUT_DEF, "-ignpar", all); print_flags(c_iflag, PARMRK, TINPUT_DEF, "-parmrk", all); print_flags(c_iflag, INPCK, TINPUT_DEF, "-inpck", all); print_flags(c_iflag, ISTRIP, TINPUT_DEF, "-istrip", all); print_flags(c_iflag, INLCR, TINPUT_DEF, "-inlcr", all); print_flags(c_iflag, IGNCR, TINPUT_DEF, "-igncr", all); print_flags(c_iflag, ICRNL, TINPUT_DEF, "-icrnl", all); print_flags(c_iflag, IXON, TINPUT_DEF, "-ixon", all); print_flags(c_iflag, IXOFF, TINPUT_DEF, "-ixoff", all); print_flags(c_iflag, IXANY, TINPUT_DEF, "-ixany", all); if (all) { printf("\n"); column= 0; } /* The output flags. */ c_oflag= termios.c_oflag; print_flags(c_oflag, OPOST, TOUTPUT_DEF, "-opost", all); #ifdef __minix print_flags(c_oflag, ONLCR, TOUTPUT_DEF, "-onlcr", all); print_flags(c_oflag, XTABS, TOUTPUT_DEF, "-xtabs", all); print_flags(c_oflag, ONOEOT, TOUTPUT_DEF, "-onoeot", all); #endif if (all) { printf("\n"); column= 0; } /* The local flags. */ c_lflag= termios.c_lflag; print_flags(c_lflag, ISIG, TLOCAL_DEF, "-isig", all); print_flags(c_lflag, ICANON, TLOCAL_DEF, "-icanon", all); print_flags(c_lflag, IEXTEN, TLOCAL_DEF, "-iexten", all); print_flags(c_lflag, ECHO, TLOCAL_DEF, "-echo", all); print_flags(c_lflag, ECHOE, TLOCAL_DEF, "-echoe", all); print_flags(c_lflag, ECHOK, TLOCAL_DEF, "-echok", all); print_flags(c_lflag, ECHONL, TLOCAL_DEF, "-echonl", all); print_flags(c_lflag, NOFLSH, TLOCAL_DEF, "-noflsh", all); #ifdef __minix print_flags(c_lflag, LFLUSHO, TLOCAL_DEF, "-lflusho", all); #endif if (all) { printf("\n"); column= 0; } /* The special control characters. */ print_char(termios.c_cc[VEOF], TEOF_DEF, "eof", all); print_char(termios.c_cc[VEOL], TEOL_DEF, "eol", all); print_char(termios.c_cc[VERASE], TERASE_DEF, "erase", all); print_char(termios.c_cc[VINTR], TINTR_DEF, "intr", all); print_char(termios.c_cc[VKILL], TKILL_DEF, "kill", all); print_char(termios.c_cc[VQUIT], TQUIT_DEF, "quit", all); print_char(termios.c_cc[VSUSP], TSUSP_DEF, "susp", all); print_char(termios.c_cc[VSTART], TSTART_DEF, "start", all); print_char(termios.c_cc[VSTOP], TSTOP_DEF, "stop", all); #ifdef __minix print_char(termios.c_cc[VREPRINT], TREPRINT_DEF, "rprnt", all); print_char(termios.c_cc[VLNEXT], TLNEXT_DEF, "lnext", all); print_char(termios.c_cc[VDISCARD], TDISCARD_DEF, "flush", all); #endif print_num(termios.c_cc[VMIN], TMIN_DEF, "min", all); print_num(termios.c_cc[VTIME], TTIME_DEF, "time", all); if (all) { printf("\n"); column= 0; } #ifdef __minix /* Screen size */ if (all || winsize.ws_row != 0 || winsize.ws_col != 0) { sprintf(line, "%d rows %d columns",Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� winsize.ws_row, winsize.ws_col); output(line); } if (all || winsize.ws_ypixel != 0 || winsize.ws_xpixel != 0) { sprintf(line, "%d ypixels %d xpixels", winsize.ws_ypixel, winsize.ws_xpixel); output(line); } if (all) { printf("\n"); column= 0; } #endif if (column != 0) { printf("\n"); column= 0; } } int option(opt, next) char *opt, *next; { char *check; speed_t speed; long num; /* The control options. */ if (match(opt, "clocal")) { termios.c_cflag |= CLOCAL; return 0; } if (match(opt, "-clocal")) { termios.c_cflag &= ~CLOCAL; return 0; } if (match(opt, "cread")) { termios.c_cflag |= CREAD; return 0; } if (match(opt, "-cread")) { termios.c_cflag &= ~CREAD; return 0; } if (match(opt, "cs5")) { termios.c_cflag &= ~CSIZE; termios.c_cflag |= CS5; return 0; } if (match(opt, "cs6")) { termios.c_cflag &= ~CSIZE; termios.c_cflag |= CS6; return 0; } if (match(opt, "cs7")) { termios.c_cflag &= ~CSIZE; termios.c_cflag |= CS7; return 0; } if (match(opt, "cs8")) { termios.c_cflag &= ~CSIZE; termios.c_cflag |= CS8; return 0; } if (match(opt, "cstopb")) { termios.c_cflag |= CSTOPB; return 0; } if (match(opt, "-cstopb")) { termios.c_cflag &= ~CSTOPB; return 0; } if (match(opt, "hupcl") || match(opt, "hup")) { termios.c_cflag |= HUPCL; return 0; } if (match(opt, "-hupcl") || match(opt, "-hup")) { termios.c_cflag &= ~HUPCL; return 0; } if (match(opt, "parenb")) { termios.c_cflag |= PARENB; return 0; } if (match(opt, "-parenb")) { termios.c_cflag &= ~PARENB; return 0; } if (match(opt, "parodd")) { termios.c_cflag |= PARODD; return 0; } if (match(opt, "-parodd")) { termios.c_cflag &= ~PARODD; return 0; } num= strtol(opt, &check, 10); if (check[0] == '\0') { speed= long2speed(num); if (speed == (speed_t)-1) { fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name, opt); return 0; } /* Speed OK */ cfsetispeed(&termios, speed); cfsetospeed(&termios, speed); return 0; } if (match(opt, "ispeed")) { num= strtol(next, &check, 10); if (check != '\0') { speed= long2speed(num); if (speed == (speed_t)-1) { fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name, opt); return 1; } cfsetispeed(&termios, speed); return 1; } else { fprintf(stderr, "%s: invalid argument to ispeed: '%s'\n", prog_name, next); return 1; } } if (match(opt, "ospeed")) { num= strtol(next, &check, 10); if (check != '\0') { speed= long2speed(num); if (speed == (speed_t)-1) { fprintf(stderr, "%s: illegal speed: '%s'\n", prog_name, opt); return 1; } cfsetospeed(&termios, speed); return 1; } else { fprintf(stderr, "%s: invalid argument to ospeed: %s\n", prog_name, next); return 1; } } /* Input modes. */ if (match(opt, "brkint")) { termios.c_iflag |= BRKINT; return 0; } if (match(opt, "-brkint")) { termios.c_iflag &= ~BRKINT; return 0; } if (match(opt, "icrnl")) { termios.c_iflag |= ICRNL; return 0; } if (match(opt, "-icrnl")) { termios.c_iflag &= ~ICRNL; return 0; } if (match(opt, "ignbrk")) { termios.c_iflag |= IGNBRK; return 0; } if (match(opt, "-ignbrk")) { termios.c_iflag &= ~IGNBRK; return 0; } if (match(opt, "igncr")) { termios.c_iflag |= IGNCR; return 0; } if (match(opt, "-igncr")) { termios.c_iflag &= ~IGNCR; return 0; } if (match(opt, "ignpar")) { termios.c_iflag |= IGNPAR; return 0; } if (match(opt, "-ignpar")) { termios.c_iflag &= ~IGNPAR; return 0; } if (match(opt, "inlcr")) { termios.c_iflag |= INLCR; return 0; } if (match(opt, "-inlcr")) { termios.c_iflag &= ~INLCR; return 0; } if (match(opt, "inpck")) { termios.c_iflag |= INPCK; return 0; } if (match(opt, "-inpck")) { termios.c_iflag &= ~INPCK; return 0; } if (match(opt, "istrip")) { termios.c_iflag |= ISTRIP; return 0; } if (match(opt, "-istrip")) { termios.c_iflag &= ~ISTRIP; return 0; } if (match(opt, "ixoff")) { termios.c_iflag |= IXOFF; return 0; } if (match(opt, "-ixoff")) { termios.c_iflag &= ~IXOFF; return 0; } if (match(opt, "ixon")) { termios.c_iflag |= IXON; return 0; } if (match(opt, "-ixon")) { termios.c_iflag &= ~IXON; return 0; } if (match(opt, "parmrk")) { termios.c_iflag |= PARMRK; return 0; } if (match(opt, "-parmrk")) { termios.c_iflag &= ~PARMRK; return 0; } if (match(opt, "ixany")) { termios.c_iflag |= IXANY; return 0; } if (match(opt, "-ixany")) { termios.c_iflag &= ~IXANY; return 0; } /* Output modes. */ if (match(opt, "opost")) { termios.c_oflag |= OPOST; return 0; } if (match(opt, "-opost")) { termios.c_oflag &= ~OPOST; return 0; } #ifdef __minix if (match(opt, "onlcr")) { termios.c_oflag |= ONLCR; return 0; } if (match(opt, "-onlcr")) { termios.c_oflag &= ~ONLCR; return 0; } if (match(opt, "xtabs")) { termios.c_oflag |= XTABS; return 0; } if (match(opt, "-xtabs")) { termios.c_oflag &= ~XTABS; return 0; } if (match(opt, "onoeot")) { termios.c_oflag |= ONOEOT; return 0; } if (match(opt, "-onoeot")) { termios.c_oflag &= ~ONOEOT; return 0; } #endif /* Local modes. */ if (match(opt, "echo")) { termios.c_lflag |= ECHO; return 0; } if (match(opt, "-echo")) { termios.c_lflag &= ~ECHO; return 0; } if (match(opt, "echoe")) { termios.c_lflag |= ECHOE; return 0; } if (match(opt, "-echoe")) { termios.c_lflag &= ~ECHOE; return 0; } if (match(opt, "echok")) { termios.c_lflag |= ECHOK; return 0; } if (match(opt, "-echok")) { termios.c_lflag &= ~ECHOK; return 0; } if (match(opt, "echonl")) { termios.c_lflag |= ECHONL; return 0; } if (match(opt, "-echonl")) { termios.c_lflag &= ~ECHONL; return 0; } if (match(opt, "icanon")) { termios.c_lflag |= ICANON; return 0; } if (match(opt, "-icanon")) { termios.c_lflag &= ~ICANON; return 0; } if (match(opt, "iexten")) { termios.c_lflag |= IEXTEN; return 0; } if (match(opt, "-iexten")) { termios.c_lflag &= ~IEXTEN; return 0; } if (match(opt, "isig")) { termios.c_lflag |= ISIG; return 0; } if (match(opt, "-isig")) { termios.c_lflag &= ~ISIG; return 0; } if (match(opt, "noflsh")) { termios.c_lflag |= NOFLSH; return 0; } if (match(opt, "-noflsh")) { termios.c_lflag &= ~NOFLSH; return 0; } if (match(opt, "tostop")) { termios.c_lflag |= TOSTOP; return 0; } if (match(opt, "-tostop")) { termios.c_lflag &= ~TOSTOP; return 0; } #ifdef __minix if (match(opt, "lflusho")) { termios.c_lflag |= LFLUSHO; return 0; } if (match(opt, "-lflusho")) { termios.c_lflag &= ~LFLUSHO; return 0; } #endif /* The special control characters. */ if (match(opt, "eof")) { set_control(VEOF, next); return 1; } if (match(opt, "eol")) { set_control(VEOL, next); return 1; } if (match(opt, "erase")) { set_control(VERASE, next); return 1; } if (match(opt, "intr")) { set_control(VINTR, next); return 1; } if (match(opt, "kill")) { set_control(VKILL, next); return 1; } if (match(opt, "quit")) { set_control(VQUIT, next); return 1; } if (match(opt, "susp")) { set_control(VSUSP, next); return 1; } if (match(opt, "start")) { set_control(VSTART, next); return 1; } if (match(opt, "stop")) { set_control(VSTOP, next); return 1; } #ifdef __minix if (match(opt, "rprnt")) { set_control(VREPRINT, next); return 1; } if (match(opt, "lnext")) { set_control(VLNEXT, next); return 1; } if (match(opt, "flush")) { set_control(VDISCARD, next); return 1; } #endif if (match(opt, "min")) { set_min_tim(VMIN, next); return 1; } if (match(opt, "time")) { set_min_tim(VTIME, next); return 1; } /* Special modes. */ if (opt[0] == ':') { set_saved_settings(opt); return 0; } if (match(opt, "cooked") || match(opt, "raw")) { int x = opt[0] == 'c' ? 1 : 0; option(x + "-icrnl", ""); /* off in raw mode, on in cooked mode */ option(x + "-ixon", ""); option(x + "-opost", ""); option(x + "-onlcr", ""); option(x + "-isig", ""); option(x + "-icanon", ""); option(x + "-iexten", ""); option(x + "-echo", ""); return 0; } if (match(opt, "evenp") || match(opt, "parity")) { option("parenb", ""); option("cs7", ""); option("-parodd", ""); return 0; } if (match(opt, "oddp")) { option("parenb", ""); option("cs7", ""); option("parodd", ""); return 0; } if (match(opt, "-parity") || match(opt, "-evenp") || match(opt, "-oddp")) { option("-parenb", ""); option("cs8", ""); return 0; } if (match(opt, "nl")) { option("icrnl", ""); return 0; } if (match(opt, "-nl")) { option("-icrnl", ""); option("-inlcr", ""); option("-igncr", ""); return 0; } if (match(opt, "ek")) { termios.c_cc[VERASE]= TERASE_DEF;; termios.c_cc[VKILL]= TKILL_DEF;; return 0; } if (match(opt, "sane")) { /* Reset all terminal attributes to a sane state, except things like * line speed and parity, because it can't be known what their sane * values are. */ termios.c_iflag= (TINPUT_DEF & ~(IGNPAR|ISTRIP|INPCK)) | (termios.c_iflag & (IGNPAR|ISTRIP|INPCK)); termios.c_oflag= (TOUTPUT_DEF & ~(XTABS)) | (termios.c_oflag & (XTABS)); termios.c_cflag= (TCTRL_DEF & ~(CLOCAL|CSIZE|CSTOPB|PARENB|PARODD)) | (termios.c_cflag & (CLOCAL|CSIZE|CSTOPB|PARENB|PARODD)); termios.c_lflag= (TLOCAL_DEF & ~(ECHOE|ECHOK)) | (termios.c_lflag & (ECHOE|ECHOK)); if (termios.c_lflag & ICANON) { termios.c_cc[VMIN]= TMIN_DEF; termios.c_cc[VTIME]= TTIME_DEF; } termios.c_cc[VEOF]= TEOF_DEF; termios.c_cc[VEOL]= TEOL_DEF; termios.c_cc[VERASE]= TERASE_DEF; termios.c_cc[VINTR]= TINTR_DEF; termios.c_cc[VKILL]= TKILL_DEF; termios.c_cc[VQUIT]= TQUIT_DEF; termios.c_cc[VSUSP]= TSUSP_DEF; #ifdef __minix termios.c_cc[VREPRINT]= TREPRINT_DEF; termios.c_cc[VLNEXT]= TLNEXT_DEF; termios.c_cc[VDISCARD]= TDISCARD_DEF; #endif termios.c_cc[VSTART]= TSTART_DEF; termios.c_cc[VSTOP]= TSTOP_DEF; if (!(termios.c_lflag & ICANON)) { termios.c_cc[VMIN]= TMIN_DEF; termios.c_cc[VTIME]= TTIME_DEF; } return 0; } #ifdef __minix if (match(opt, "cols")) { num= strtol(next, &check, 0); if (check[0] != '\0') { fprintf(stderr, "%s: illegal parameter to cols: '%s'\n", prog_name, next); return 1; } winsize.ws_col= num; return 1; } if (match(opt, "rows")) { num= strtol(next, &check, 0); if (check[0] != '\0') { fprintf(stderr, "%s: illegal parameter to rows: '%s'\n", prog_name, next); return 1; } winsize.ws_row= num; return 1; } if (match(opt, "xpixels")) { num= strtol(next, &check, 0); if (check[0] != '\0') { fprintf(stderr, "%s: illegal parameter to xpixels: '%s'\n", prog_name, next); return 1; } winsize.ws_xpixel= num; return 1; } if (match(opt, "ypixels")) { num= strtol(next, &check, 0); if (check[0] != '\0') { fprintf(stderr, "%s: illegal parameter to ypixels: '%s'\n", prog_name, next); return 1; } winsize.ws_ypixel= num; return 1; } #endif /* __minix */ fprintf(stderr, "%s: unknown mode: %s\n", prog_name, opt); return 0; } int match(s1, s2) char *s1, *s2; { while (1) { if (*s1 == 0 && *s2 == 0) return(1); if (*s1 == 0 || *s2 == 0) return (0); if (*s1 != *s2) return (0); s1++; s2++; } } void prctl(c) char c; { if (c < ' ') printf("^%c", 'A' + c - 1); else if (c == 0177) printf("^?"); else printf("%c", c); } struct s2s { speed_t ts; long ns; } s2s[] = { { B0, 0 }, { B50, 50 }, { B75, 75 }, { B110, 110 }, { B134, 134 }, { B150, 150 }, { B200, 200 }, { B300, 300 }, { B600, 600 }, { B1200, 1200 }, { B1800, 1800 }, { B2400, 2400 }, { B4800, 4800 }, { B9600, 9600 }, { B19200, 19200 }, { B38400, 38400 }, #ifdef __minix { B57600, 57600 }, { B115200, 115200 }, #endif }; speed_t long2speed(num) long num; { struct s2s *sp; for (sp = s2s; sp < s2s + (sizeof(s2s) / sizeof(s2s[0])); sp++) { if (sp->ns == num) return sp->ts; } return -1; } long speed2long(speed) unsigned long speed; { struct s2s *sp; for (sp = s2s; sp < s2s + (sizeof(s2s) / sizeof(s2s[0])); sp++) { if (sp->ts == speed) return sp->ns; } return -1; } void print_flags(flags, flag, def, string, all) unsigned long flags; unsigned long flag; unsigned long def; char *string; int all; { if (!(flags & flag)) { if (all || (def & flag)) output(string); return; } string++; if (all || !(def & flag)) output(string); } void output(s) char *s; { int len; len= strlen(s); if (column + len + 3 >= max_column) { printf("\n"); column= 0; } if (column) { putchar(' '); column++; } fputs(s, stdout); column += len; } void do_print_char(chr, def, name, all) unsigned chr; unsigned def; char *name; int all; { char line[20]; if (!all && chr == def) return; #ifdef _POSIX_VDISABLE if (chr == _POSIX_VDISABLE) sprintf(line, "%s = <undef>", name); else #endif if (chr < ' ') sprintf(line, "%s = ^%c", name, chr + '@'); else if (chr == 127) sprintf(line, "%s = ^?", name); else sprintf(line, "%s = %c", name, chr); output(line); } void do_print_num(num, def, name, all) unsigned num; unsigned def; char *name; int all; { char line[20]; if (!all && num == def) return; sprintf(line, "%s = %u", name, num); output(line); } void set_saved_settings(opt) char *opt; { long num; char *check; tcflag_t c_oflag, c_cflag, c_lflag, c_iflag; cc_t c_cc[NCCS]; speed_t ispeed, ospeed; int i; check= opt; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } c_iflag= num; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } c_oflag= num; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } c_cflag= num; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } c_lflag= num; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } ispeed= num; num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } ospeed= num; for(i=0; i<NCCS; i++) { num= strtol(check+1, &check, 16); if (check[0] != ':') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } c_cc[i]= num; } if (check[1] != '\0') { fprintf(stderr, "error in saved settings '%s'\n", opt); return; } termios.c_iflag= c_iflag; termios.c_oflag= c_oflag; termios.c_cflag= c_cflag; termios.c_lflag= c_lflag; cfsetispeed(&termios, ispeed); cfsetospeed(&termios, ospeed); for(i=0; i<NCCS; i++) termios.c_cc[i]= c_cc[i]; } void set_control(option, value) int option; char *value; { int chr; if (match(value, "undef") || match(value, "^-")) { #ifdef _POSIX_VDISABLE chr= _POSIX_VDISABLE; #else fprintf(stderr, "stty: unable to set option to _POSIX_VDISABLE\n"); return; #endif } else if (match(value, "^?")) chr= '\177'; else if (strlen(value) == 2 && value[0] == '^') { chr= toupper(value[1]) - '@'; if (chr < 0 || chr >= 32) { fprintf(stderr, "stty: illegal option value: '%s'\n", value); return; } } else if (strlen(value) == 1) chr= value[0]; else { fprintf(stderr, "stty: illegal option value: '%s'\n", value); return; } assert(option >= 0 && option < NCCS); termios.c_cc[option]= chr; } void set_min_tim(option, value) int option; char *value; { long num; char *check; num= strtol(value, &check, 0); if (check[0] != '\0') { fprintf(stderr, "stty: illegal option value: '%s'\n", value); return; } if ((cc_t)num != num) { fprintf(stderr, "stty: illegal option value: '%s'\n", value); return; } assert(option >= 0 && option < NCCS); termios.c_cc[option]= num; } /* * $PchHeader: /mount/hd2/minix/cmd/simple/RCS/stty.c,v 1.4 1995/05/23 08:23:16 philip Exp $ */ ����������������������������������������������������������������������������������������������������������������/* su - become super-user Author: Patrick van Kleef */ #include <sys/types.h> #include <pwd.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <minix/minlib.h> /* True iff the invoker need not give a password. */ #define privileged() (getgid() == 0) _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char *argv[]; { register char *name, *password; char *shell; char arg0[20]; static char shell1[] = "/bin/sh"; static char shell2[] = "/usr/bin/sh"; int nr, login_shell = 0; register struct passwd *pwd; static char USER[20], LOGNAME[25], HOME[100], SHELL[100]; if (argc > 1 && strcmp(argv[1], "-") == 0) { login_shell = 1; /* Read .profile */ argv[1] = argv[0]; argv++; argc--; } if (argc > 1) { if (argv[1][0] == '-') { std_err("Usage: su [-[e]] [user [shell-arguments ...]]\n"); exit(1); } name = argv[1]; argv[1] = argv[0]; argv++; } else { name = "root"; } if ((pwd = getpwnam(name)) == 0) { std_err("Unknown id: "); std_err(name); std_err("\n"); exit(1); } if (!privileged() && strcmp(pwd->pw_passwd, crypt("", pwd->pw_passwd)) != 0) { password = getpass("Password:"); if (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd))) { std_err("Sorry\n"); exit(2); } } if (login_shell) { if ((shell = pwd->pw_shell)[0] == 0) shell = shell1; } else { if ((shell = getenv("SHELL")) == NULL) shell = shell1; } if (access(shell, 0) < 0) shell = shell2; if ((argv[0] = strrchr(shell, '/')) == NULL) argv[0] = shell; else argv[0]++; if (login_shell) { arg0[0] = '-'; strncpy(arg0+1, argv[0], sizeof(arg0)-2); arg0[sizeof(arg0)-1] = 0; argv[0] = arg0; strcpy(USER, "USER="); strcpy(USER + 5, name); putenv(USER); strcpy(LOGNAME, "LOGNAME="); strcpy(LOGNAME + 8, name); putenv(LOGNAME); strcpy(SHELL, "SHELL="); strcpy(SHELL + 6, shell); putenv(SHELL); strcpy(HOME, "HOME="); strcpy(HOME + 5, pwd->pw_dir); putenv(HOME); (void) chdir(pwd->pw_dir); } setgid(pwd->pw_gid); setuid(pwd->pw_uid); execv(shell, argv); std_err("No shell\n"); return(3); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* sum - checksum a file Author: Martin C. Atkins */ /* * This program was written by: * Martin C. Atkins, * University of York, * Heslington, * York. Y01 5DD * England * and is released into the public domain, on the condition * that this comment is always included without alteration. */ #include <sys/types.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <minix/minlib.h> #include <stdio.h> #define BUFFER_SIZE (512) int rc = 0; char *defargv[] = {"-", 0}; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void error, (char *s, char *f)); _PROTOTYPE(void sum, (int fd, char *fname)); _PROTOTYPE(void putd, (int number, int fw, int zeros)); int main(argc, argv) int argc; char *argv[]; { register int fd; if (*++argv == 0) argv = defargv; for (; *argv; argv++) { if (argv[0][0] == '-' && argv[0][1] == '\0') fd = 0; else fd = open(*argv, O_RDONLY); if (fd == -1) { error("can't open ", *argv); rc = 1; continue; } sum(fd, (argc > 2) ? *argv : (char *) 0); if (fd != 0) close(fd); } return(rc); } void error(s, f) char *s, *f; { std_err("sum: "); std_err(s); if (f) std_err(f); std_err("\n"); } void sum(fd, fname) int fd; char *fname; { char buf[BUFFER_SIZE]; register int i, n; long size = 0; unsigned crc = 0; unsigned tmp, blks; while ((n = read(fd, buf, BUFFER_SIZE)) > 0) { for (i = 0; i < n; i++) { crc = (crc >> 1) + ((crc & 1) ? 0x8000 : 0); tmp = buf[i] & 0377; crc += tmp; crc &= 0xffff; size++; } } if (n < 0) { if (fname) error("read error on ", fname); else error("read error", (char *) 0); rc = 1; return; } putd(crc, 5, 1); blks = (size + (long) BUFFER_SIZE - 1L) / (long) BUFFER_SIZE; putd(blks, 6, 0); if (fname) printf(" %s", fname); printf("\n"); } void putd(number, fw, zeros) int number, fw, zeros; { /* Put a decimal number, in a field width, to stdout. */ char buf[10]; int n; unsigned num; num = (unsigned) number; for (n = 0; n < fw; n++) { if (num || n == 0) { buf[fw - n - 1] = '0' + num % 10; num /= 10; } else buf[fw - n - 1] = zeros ? '0' : ' '; } buf[fw] = 0; printf("%s", buf); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* swapfs - swap a Minix file system Author: Niels C. Willems */ /* $Id: swapfs.c,v 1.10 1992/04/15 10:51:46 ncwille Exp $ */ /* Swapfs, a program to convert V1 or V2 Minix file systems from big endian byte order to little endian and vv. Some examples: swapfs -v disk.01 ! only show verbose information. swapfs /dev/fd0 | compress > fd0r.Z ! convert and compress filesystem. swapfs -v fileA fileA ! read, convert and write the same filesystem. This program uses one byte of heap memory for each data block (1Kbytes) in the file system, so with Minix-PC 16-bit you can't swap file systems bigger than about 32 Mbytes Be careful with 'swapfs fileA fileA'. If the program aborts e.g. by user interrupt, power failure or an inconsistent file system, you better have a backup of fileA This program only converts directories and indirect blocks of files that are in use. Converting indirect blocks or directories of deleted files is hard and not yet done. If you have a (1.6.xx, xx < 18) version of Minix that supports the mounting of reversed file systems always mount them read-only and avoid any attemp to modify them (mkdir, open, creat) too! These problems have been fixed in Minix 1.6.18. In this version you can get some more information about the file system with the -d (debug) flag. Please send your bug reports or ideas to ncwille@cs.vu.nl */ #define _POSIX_SOURCE 1 #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <stdio.h> #include <assert.h> #if __STDC__ == 1 #define _PROTOTYPE(function, params) function params #else #define _PROTOTYPE(function, params) function() #endif #define BLOCK_SIZE 1024 #define BOOT_BLOCK_OFF (blockn_t) 0 #define SUPER_BLOCK_OFF (blockn_t) 1 #define V1_MAGIC 0x137F #define V2_MAGIC 0x2468 #define NINODES_OFFSET 0 #define V1_ZONES_OFFSET 2 #define IMAP_BLOCKS_OFFSET 4 #define ZMAP_BLOCKS_OFFSET 6 #define FIRSTDATAZONE_OFFSET 8 #define LOG_ZONE_SIZE_OFFSET 10 #define MAGIC_OFFSET 16 #define V2_ZONES_OFFSET 20 #define NR_DIRECT_ZONES 7 #define V1_NR_TZONES 9 #define V2_NR_TZONES 10 #define V1_INODE_SIZE 32 #define V2_INODE_SIZE 64 #define INODE1_MODE_OFF 0 #define INODE1_SIZE_OFF 4 #define INODE1_DIRECT_OFF 14 #define INODE1_IND1_OFF 28 #define INODE1_IND2_OFF 30 #define INODE2_MODE_OFF 0 #define INODE2_SIZE_OFF 8 #define INODE2_DIRECT_OFF 24 #define INODE2_IND1_OFF 52 #define INODE2_IND2_OFF 56 #define INODE2_IND3_OFF 60 #define INODE_MODE_MASK 0xf000 /* file type mask */ #define INODE_DIR_MODE 0x4000 /* directory */ #define INODE_BLK_SPECIAL_MODE 0x6000 /* block special */ #define INODE_CHR_SPECIAL_MODE 0x2000 /* character special */ #define T_MASK 0x1c #define T_UNKNOWN 0x00 #define T_MAYBE_OLD_DIR 0x04 #define T_OLD_NON_DIR 0x08 #define T_DIR 0x0c #define T_NON_DIR 0x10 #define INDIRECT_MASK 0x03 #define IND_PROCESSED_BIT 0x20 /* set when all blocks in ind block are * marked */ #define IND_CONFLICT_BIT 0x40 #define TYPE_CONFLICT_BIT 0x80 #define DIR_ENTRY_SIZE 16 typedef enum { Unused_zone, Old_zone, In_use_zone } class_t; typedef unsigned long blockn_t; typedef unsigned int inodesn_t; typedef struct { inodesn_t ninodes; /* # usable inodes on the minor device */ blockn_t imap_blocks; /* # of blocks used by inode bit map */ blockn_t zmap_blocks; /* # of blocks used by zone bit map */ blockn_t firstdatazone; /* number of first data zone */ int log_zone_size; /* log2 of blocks/zone */ blockn_t zones; /* number of zones */ int version; /* file system version */ inodesn_t inodes_per_block; blockn_t first_imap_block; blockn_t first_zmap_block; blockn_t first_inode_block; /* number of first block with inodes */ size_t dzmap_size; /* # of data zone blocks */ } super_t; typedef struct { /* summary of inode */ long size; /* current file size in bytes */ blockn_t direct[NR_DIRECT_ZONES]; /* block numbers for direct, * ind, ... */ blockn_t ind1; /* single indirect block number */ blockn_t ind2; /* double indirect block number */ blockn_t ind3; /* triple indirect block number */ int ztype; /* type of zones that belong to this inode */ } inode_t; static char rcsid[] = "$Id: swapfs.c,v 1.10 1992/04/15 10:51:46 ncwille Exp $"; static int super_format[] = {2, 2, 2, 2, 2, 2, 4, 2, 2, 4, 0}; static int inode1_format[] = {2, 2, 4, 4, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0}; static int inode2_format[] = {2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0}; static char *ind_str[4] = {"direct", "single indirect", "double indirect", "triple indirect"}; static int big_endian_fs; /* set in init_super(), 1 iff file system has * big endian byte order */ static int verbose_flag; static int debug_flag; static int test_flag; typedef unsigned char *dzmap_t; int _PROTOTYPE(main, (int argc, char *argv[])); static void _PROTOTYPE(parse_args_init_io, (int argc, char *argv[])); static void _PROTOTYPE(rw_boot, (void)); static void _PROTOTYPE(rw_init_super, (super_t * sp)); static void _PROTOTYPE(init_dzmap, (dzmap_t * dzmap_ptr, size_t dzmap_size)); static void _PROTOTYPE(rw_ibmap, (super_t super)); static void _PROTOTYPE(rw_zbmap, (super_t super)); static void _PROTOTYPE(print_stat, (dzmap_t dzmap, super_t super)); static void _PROTOTYPE(p1_rw_inodes, (dzmap_t dzmap, super_t super)); static void _PROTOTYPE(rd_indirects, (dzmap_t dzmap, super_t super, int ind, class_t required_class)); static void _PROTOTYPE(rw_data_zones, (dzmap_t dzmap, super_t super)); static int _PROTOTYPE(read_block, (char *buf, blockn_t offset)); static void _PROTOTYPE(write_block, (char *buf)); static int _PROTOTYPE(convcpy, (char *dst, char *src, int *format)); static void _PROTOTYPE(conv2_blkcpy, (char *dst, char *src)); static void _PROTOTYPE(conv4_blkcpy, (char *dst, char *src)); static void _PROTOTYPE(conv2cpy, (char *dst, char *src)); static int _PROTOTYPE(inode_size, (int version)); static void _PROTOTYPE(init_super, (super_t * sp, char *buf)); static void _PROTOTYPE(get_inode, (inode_t * ip, char *buf, int version)); static int _PROTOTYPE(check_inode, (inode_t inode, super_t super)); static int _PROTOTYPE(was_blk_special, (inode_t inode)); static int _PROTOTYPE(check_blk_number, (blockn_t num, super_t super)); static void _PROTOTYPE(cw_inode_block, (char *buf, inodesn_t ninodes, int version)); static void _PROTOTYPE(proc_ind, (dzmap_t dzmap, size_t curr_ind, char *buf, super_t super)); static void _PROTOTYPE(cw_dir_block, (char *buf)); static void _PROTOTYPE(dzmap_add_inode, (dzmap_t dzmap, inode_t inode, super_t super)); static void _PROTOTYPE(dz_update, (dzmap_t dzmap, blockn_t blknum, int new_indnum, int new_ztype, super_t super)); static class_t _PROTOTYPE(ztype_class, (int ztype)); static unsigned int _PROTOTYPE(two_bytes, (char buf[2])); static long _PROTOTYPE(four_bytes, (char buf[4])); static void _PROTOTYPE(fail, (char *string)); static void _PROTOTYPE(usage, (char *arg0)); int main(argc, argv) int argc; char *argv[]; { super_t super; dzmap_t dzmap; parse_args_init_io(argc, argv); rw_boot(); rw_init_super(&super); init_dzmap(&dzmap, super.dzmap_size); rw_ibmap(super); rw_zbmap(super); p1_rw_inodes(dzmap, super); rd_indirects(dzmap, super, 3, In_use_zone); rd_indirects(dzmap, super, 2, In_use_zone); rd_indirects(dzmap, super, 1, In_use_zone); if (verbose_flag) putc('\n', stderr); print_stat(dzmap, super); rw_data_zones(dzmap, super); return 0; } static void parse_args_init_io(argc, argv) int argc; char *argv[]; { char *str; struct stat buf; ino_t src_ino; int i; debug_flag = 0; verbose_flag = 0; test_flag = 0; for (i = 1; i < argc; i++) { str = argv[i]; if (*str != '-') break; switch (*++str) { case 'v': verbose_flag = 1; break; case 'd': debug_flag = 1; verbose_flag = 1; break; case 't': test_flag = 1; break; default: usage(argv[0]); } } if ((argc - i == 0 && isatty(0)) || (argc - i) > 2) usage(argQ��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q��Q������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������v[0]); if (argc - i > 0) { (void) close(0); if (open(argv[i], O_RDONLY) != 0) { fprintf(stderr, "Can't open input file %s", argv[i]); fail(""); } } if (isatty(1) || argc - i == 2) { if (argc - i < 2) test_flag = 1; else { i++; (void) close(1); (void) fstat(0, &buf); src_ino = buf.st_ino; if (stat(argv[i], &buf) == 0 && src_ino == buf.st_ino) { /* Src and dest are the same */ if (open(argv[i], O_WRONLY) != 1) { fprintf(stderr, "Can't open output file %s", argv[i]); fail(""); } } else if (creat(argv[i], 0644) != 1) { fprintf(stderr, "Can't creat output file %s", argv[i]); fail(""); } } } } static void rw_boot() { char buf[BLOCK_SIZE]; if (read_block(buf, BOOT_BLOCK_OFF) != BLOCK_SIZE) fail("Can't read bootblock"); write_block(buf); } static void rw_init_super(sp) super_t *sp; { char ibuf[BLOCK_SIZE], obuf[BLOCK_SIZE]; if (read_block(ibuf, SUPER_BLOCK_OFF) != BLOCK_SIZE) fail("Can't read superblock"); init_super(sp, ibuf); memcpy(obuf, ibuf, (size_t) BLOCK_SIZE); /* preserve 'unused' data */ (void) convcpy(obuf, ibuf, super_format); write_block(obuf); } static void init_dzmap(dzmap_ptr, dzmap_size) dzmap_t *dzmap_ptr; size_t dzmap_size; { if ((*dzmap_ptr = (dzmap_t) malloc(dzmap_size)) == (dzmap_t) NULL) fail("Not enough space for data zone map"); memset(*dzmap_ptr, '\0', (size_t) dzmap_size); } static void rw_ibmap(super) super_t super; { char ibuf[BLOCK_SIZE], obuf[BLOCK_SIZE]; blockn_t i; for (i = 0; i < super.imap_blocks; i++) { if (read_block(ibuf, super.first_imap_block + i) != BLOCK_SIZE) fail("Can't read inode bit map"); conv2_blkcpy(obuf, ibuf); write_block(obuf); } } static void rw_zbmap(super) super_t super; { char ibuf[BLOCK_SIZE], obuf[BLOCK_SIZE]; blockn_t i; for (i = 0; i < super.zmap_blocks; i++) { if (read_block(ibuf, super.first_zmap_block + i) != BLOCK_SIZE) fail("Can't read zone bit map"); conv2_blkcpy(obuf, ibuf); write_block(obuf); } } static void p1_rw_inodes(dzmap, super) dzmap_t dzmap; super_t super; { char buf[BLOCK_SIZE], *buf_ptr; inodesn_t i, num_inodes; blockn_t next_block; inode_t inode; next_block = super.first_inode_block; for (i = 1; i <= super.ninodes; i++) { if ((i - 1) % super.inodes_per_block == 0) { if (read_block(buf, next_block) != BLOCK_SIZE) fail("read failed in inode block"); buf_ptr = buf; next_block++; num_inodes = super.ninodes + 1 - i; if (num_inodes > super.inodes_per_block) num_inodes = super.inodes_per_block; cw_inode_block(buf, num_inodes, super.version); } get_inode(&inode, buf_ptr, super.version); dzmap_add_inode(dzmap, inode, super); buf_ptr += inode_size(super.version); } } static void print_stat(dzmap, super) dzmap_t dzmap; super_t super; { size_t i; register unsigned char dz; int both_conflict = 0, ind_conflict = 0, type_conflict = 0, unreferenced = 0; int not_in_use = 0; if (!verbose_flag) return; for (i = 0; i < super.dzmap_size; i++) { dz = dzmap[i]; if (dz & IND_CONFLICT_BIT && dz & TYPE_CONFLICT_BIT) both_conflict++; else if (dz & IND_CONFLICT_BIT) ind_conflict++; else if (dz & TYPE_CONFLICT_BIT) type_conflict++; if (dz == 0) unreferenced++; if (ztype_class(dz & T_MASK) < In_use_zone) not_in_use++; } if (debug_flag) { fprintf(stderr, "%5d zone blocks with conflicting indir.\n", ind_conflict); fprintf(stderr, "%5d zone blocks with conflicting types.\n", type_conflict); fprintf(stderr, "%5d zone blocks with conflicting types and indir.\n", both_conflict); fprintf(stderr, "%5d zone blocks never referenced.\n", unreferenced); } fprintf(stderr, "%5d zone blocks not in use.\n", not_in_use); putc('\n', stderr); } static void rd_indirects(dzmap, super, ind, required_class) dzmap_t dzmap; super_t super; int ind; class_t required_class; { size_t i; int ind_cnt; off_t dz_offset; char buf[BLOCK_SIZE]; dz_offset = super.firstdatazone; ind_cnt = 0; for (i = 0; i < super.dzmap_size; i++) { if (ztype_class(dzmap[i] & T_MASK) != required_class || (dzmap[i] & INDIRECT_MASK) != ind || (dzmap[i] & IND_PROCESSED_BIT)) continue; ind_cnt++; if (read_block(buf, dz_offset + i) != BLOCK_SIZE) { fprintf(stderr, "Can't read %s block", ind_str[ind]); fail(""); } proc_ind(dzmap, i, buf, super); } if ((verbose_flag && ind_cnt > 0) || debug_flag) fprintf(stderr, "%5d %s zone blocks.\n", ind_cnt, ind_str[ind]); } static void rw_data_zones(dzmap, super) dzmap_t dzmap; super_t super; { char ibuf[BLOCK_SIZE], obuf[BLOCK_SIZE]; size_t i; int ztype, ind, last_read; off_t dz_offset; dz_offset = super.firstdatazone; for (i = 0; i < super.dzmap_size; i++) { last_read = read_block(ibuf, dz_offset + i); if (last_read != BLOCK_SIZE) break; ind = dzmap[i] & INDIRECT_MASK; if (ind == 0) { ztype = dzmap[i] & T_MASK; if (ztype == T_DIR) cw_dir_block(ibuf); else write_block(ibuf); } else { if (super.version == 1) conv2_blkcpy(obuf, ibuf); else conv4_blkcpy(obuf, ibuf); write_block(obuf); } if (verbose_flag && i && i % 1024 == 0) { fprintf(stderr, "."); fflush(stderr); } } if (verbose_flag && i > 1024) putc('\n', stderr); if (last_read != BLOCK_SIZE) for (; i < super.dzmap_size; i++) if (ztype_class(dzmap[i] & T_MASK) == In_use_zone) fail("Can't read data zone"); } static int read_block(buf, offset) char *buf; blockn_t offset; { static blockn_t curr_offset = 0; int bytes; if (offset != curr_offset) { if (lseek(0, (off_t) offset * BLOCK_SIZE, 0) == -1) fail("lseek failed on input file"); curr_offset = offset; } bytes = read(0, buf, BLOCK_SIZE); if (bytes < 0) fail("read failed on input file"); curr_offset += bytes; return bytes; } static void write_block(buf) char *buf; { if (test_flag) return; if (write(1, buf, BLOCK_SIZE) != BLOCK_SIZE) fail("write failed on output file"); } static int convcpy(dst, src, format) char *dst; char *src; int *format; { char *old_src = src; register char tmp; int i; for (i = 0; format[i] > 0; i++) { switch (format[i]) { case 1: *dst++ = *src++; break; case 2: tmp = *src++; *dst++ = *src++; *dst++ = tmp; break; case 4: tmp = src[0]; dst[0] = src[3]; dst[3] = tmp; tmp = src[1]; dst[1] = src[2]; dst[2] = tmp; src += 4; dst += 4; break; default: fail("wrong format array for convcpy"); } } return(src - old_src); } static void conv2_blkcpy(dst, src) char *dst; char *src; { int i; register char tmp; for (i = 0; i < BLOCK_SIZE; i += 2) { tmp = *src++; *dst++ = *src++; *dst++ = tmp; } } static void conv4_blkcpy(dst, src) char *dst; char *src; { int i; register char tmp; for (i = 0; i < BLOCK_SIZE; i += 4) { tmp = src[0]; dst[0] = src[3]; dst[3] = tmp; tmp = src[1]; dst[1] = src[2]; dst[2] = tmp; src += 4; dst += 4; } } static void conv2cpy(dst, src) char *dst; char *src; { register char tmp; tmp = *src++; *dst++ = *src++; *dst++ = tmp; } static int inode_size(version) int version; { return(version == 1) ? V1_INODE_SIZE : V2_INODE_SIZE; } static void init_super(sp, buf) super_t *sp; char *buf; { int magic; long imapblks, zmapblks; big_endian_fs = 0; /* guess the file system is little endian */ magic = two_bytes(buf + MAGIC_OFFSET); if (magic != V1_MAGIC && magic != V2_MAGIC) { big_endian_fs = 1; magic = two_bytes(buf + MAGIC_OFFSET); } switch (magic) { case V1_MAGIC: sp->version = 1; break; case V2_MAGIC: sp->version = 2; break; default: fail("Not a Minix file system"); } if (verbose_flag) fprintf(stderr, "\nVersion = V%d, %s endian.\n", sp->version, big_endian_fs ? "big" : "little"); sp->ninodes = two_bytes(buf + NINODES_OFFSET); imapblks = two_bytes(buf + IMAP_BLOCKS_OFFSET); sp->imap_blocks = imapblks; zmapblks = two_bytes(buf + ZMAP_BLOCKS_OFFSET); sp->zmap_blocks = zmapblks; sp->firstdatazone = two_bytes(buf + FIRSTDATAZONE_OFFSET); sp->log_zone_size = two_bytes(buf + LOG_ZONE_SIZE_OFFSET); if (sp->version == 1) sp->zones = two_bytes(buf + V1_ZONES_OFFSET); else sp->zones = four_bytes(buf + V2_ZONES_OFFSET); sp->inodes_per_block = BLOCK_SIZE / inode_size(sp->version); if (imapblks < 0 || zmapblks < 0 || sp->ninodes < 1 || sp->zones < 1) fail("Bad superblock"); if (sp->log_zone_size != 0) fail("Can't swap file systems with different zone and block sizes"); sp->first_imap_block = SUPER_BLOCK_OFF + 1; sp->first_zmap_block = sp->first_imap_block + sp->imap_blocks; sp->first_inode_block = sp->first_zmap_block + sp->zmap_blocks; sp->dzmap_size = sp->zones - sp->firstdatazone; if (verbose_flag) { fprintf(stderr, "nzones = %ld, ", sp->zones); fprintf(stderr, "ninodes = %u, ", sp->ninodes); fprintf(stderr, "first data zone = %ld.\n\n", sp->firstdatazone); } } static void get_inode(ip, buf, version) inode_t *ip; char *buf; int version; { int i; int mode; if (version == 1) { mode = two_bytes(buf + INODE1_MODE_OFF); ip->size = four_bytes(buf + INODE1_SIZE_OFF); ip->ind1 = two_bytes(buf + INODE1_IND1_OFF); ip->ind2 = two_bytes(buf + INODE1_IND2_OFF); ip->ind3 = 0; for (i = 0; i < NR_DIRECT_ZONES; i++) ip->direct[i] = two_bytes(buf + INODE1_DIRECT_OFF + 2 * i); } else { mode = two_bytes(buf + INODE2_MODE_OFF); ip->size = four_bytes(buf + INODE2_SIZE_OFF); ip->ind1 = four_bytes(buf + INODE2_IND1_OFF); ip->ind2 = four_bytes(buf + INODE2_IND2_OFF); ip->ind3 = four_bytes(buf + INODE2_IND3_OFF); for (i = 0; i < NR_DIRECT_ZONES; i++) ip->direct[i] = four_bytes(buf + INODE2_DIRECT_OFF + 4 * i); } if (mode == 0) { if (ip->size % DIR_ENTRY_SIZE == 0) ip->ztype = T_MAYBE_OLD_DIR; else ip->ztype = T_OLD_NON_DIR; if (was_blk_special(*ip)) ip->size = 0; } else { mode = mode & INODE_MODE_MASK; if (mode == INODE_BLK_SPECIAL_MODE || mode == INODE_CHR_SPECIAL_MODE) ip->size = 0; /* prevent the use of the block numbers. */ ip->ztype = (mode == INODE_DIR_MODE) ? T_DIR : T_NON_DIR; } } static int check_inode(inode, super) inode_t inode; super_t super; { int i; for (i = 0; i < NR_DIRECT_ZONES; i++) if (!check_blk_number(inode.direct[i], super)) return 0; return(check_blk_number(inode.ind1, super) && check_blk_number(inode.ind2, super) && check_blk_number(inode.ind3, super)); } static int check_blk_number(num, super) blockn_t num; super_t super; { if (num == 0 || (num >= super.firstdatazone && num < super.zones)) return 1; fprintf(stderr, "warning bad block number %ld in inode.\n", num); return 0; } static int was_blk_special(inode) inode_t inode; { int i, result; blockn_t block_size; if (inode.size % BLOCK_SIZE || inode.ind1) return 0; block_size = inode.size / BLOCK_SIZE; for (i = NR_DIRECT_ZONES - 1; i >= 0; i--) if (inode.direct[i] != 0) break; result = (i < 1 && block_size > i + 1); if (debug_flag && result) { fprintf(stderr, "old block special file detected (slot = %d).\n", i); } return result; } static void cw_inode_block(buf, ninodes, version) char *buf; inodesn_t ninodes; int version; { char output_buf[BLOCK_SIZE]; char *src, *dst; inodesn_t i; int cnt, free_bytes; int *format; src = buf; dst = output_buf; format = (version == 1) ? inode1_format : inode2_format; for (i = 0; i < ninodes; i++) { cnt = convcpy(dst, src, format); src += cnt; dst += cnt; } assert(cnt == inode_size(version)); free_bytes = BLOCK_SIZE - (src - buf); assert(free_bytes >= 0); if (verbose_flag && free_bytes > 0) { /* There is a small change that the last free inode has no * matching bit in the last inode bit map block: e.g. if * sp->ninodes == 8191. */ fprintf(stderr, "%5d bytes (%d inodes) free in last inode block.\n", free_bytes, free_bytes / inode_size(version)); memcpy(dst, src, (size_t) free_bytes); } write_block(output_buf); } static void proc_ind(dzmap, curr_ind, buf, super) dzmap_t dzmap; size_t curr_ind; char *buf; super_t super; { int indnum, i, ztype; int word_size; /* size of zone block number in ind. block in * bytes */ unsigned char dz, tmp_dz; blockn_t blk, ind_blk; int bad_range = 0, hidden_zero = 0, zero_flag = 0, expired = 0; size_t blk_index; dz = dzmap[curr_ind]; indnum = dz & INDIRECT_MASK; ztype = dz & T_MASK; ind_blk = curr_ind + super.firstdatazone; word_size = (super.version == 1) ? 2 : 4; assert(indnum > 0); for (i = 0; i < BLOCK_SIZE; i += word_size) { if (word_size == 2) blk = two_bytes(buf + i); else blk = four_bytes(buf + i); if (blk == 0) zero_flag = 1; else if (blk < super.firstdatazone || blk >= super.zones) bad_range = 1; else { if (zero_flag) hidden_zero = 1; blk_index = blk - super.firstdatazone; tmp_dz = dzmap[blk_index]; if (ztype_class(tmp_dz & T_MASK) == In_use_zone) expired = 1; } } if (ztype_class(ztype) == In_use_zone) { if (bad_range) { fprintf(stderr, "%s zone block contains ", ind_str[indnum]); fail("illegal value"); } if ((ztype == T_DIR || indnum > 1) && hidden_zero) { fprintf(stderr, "WARNING: %s zone block %ld contains ", ind_str[indnum], ind_blk); fprintf(stderr, "unexpected zero block numbers\n"); } } else { if (expired) { dzmap[curr_ind] &= ~(INDIRECT_MASK & IND_CONFLICT_BIT); return; } /* Not yet implemented. :-( if (bad_range || (indnum > 1 && * hidden_zero) || equal_values(buf, super.version ) { } */ } for (i = 0; i < BLOCK_SIZE; i += word_size) { if (word_size == 2) blk = two_bytes(buf + i); else blk = four_bytes(buf + i); if (blk == 0) continue; blk_index = blk - super.firstdatazone; tmp_dz = dzmap[blk_index]; if (ztype_class(tmp_dz & T_MASK) == In_use_zone) { /* trouble */ if ((tmp_dz & INDIRECT_MASK) == indnum - 1 && (tmp_dz & T_MASK) == ztype) fprintf(stderr, "WARNING: %s zone block %ld used more \ than once\n", ind_str[indnum - 1], blk); else { fprintf(stderr, "Block %ld used more than ", blk); fail("once with different types"); } } dzmap[blk_index] = (dz & ~INDIRECT_MASK) | (indnum - 1); } dzmap[curr_ind] |= IND_PROCESSED_BIT; } static void cw_dir_block(buf) char *buf; { char output_buf[BLOCK_SIZE]; int ino, i, old_ino_offset; memcpy(output_buf, buf, BLOCK_SIZE); for (i = 0; i < BLOCK_SIZE; i += DIR_ENTRY_SIZE) { ino = two_bytes(buf + i); if (ino == 0) { old_ino_offset = i + DIR_ENTRY_SIZE - 2; conv2cpy(output_buf + old_ino_offset, buf + old_ino_offset); } else conv2cpy(output_buf + i, buf + i); } write_block(output_buf); } static void dzmap_add_inode(dzmap, inode, super) dzmap_t dzmap; inode_t inode; super_t super; { int i; if (inode.size == 0 || !check_inode(inode, super)) return; for (i = 0; i < NR_DIRECT_ZONES; i++) dz_update(dzmap, inode.direct[i], 0, inode.ztype, super); dz_update(dzmap, inode.ind1, 1, inode.ztype, super); dz_update(dzmap, inode.ind2, 2, inode.ztype, super); dz_update(dzmap, inode.ind3, 3, inode.ztype, super); } static void dz_update(dzmap, blknum, new_indnum, new_ztype, super) dzmap_t dzmap; blockn_t blknum; int new_indnum; int new_ztype; super_t super; { size_t dznum; int old_indnum; int old_ztype; unsigned char *dz; char new_dz; if (blknum == 0) return; dznum = (size_t) (blknum - super.firstdatazone); dz = &dzmap[dznum]; old_indnum = *dz & INDIRECT_MASK; old_ztype = *dz & T_MASK; new_dz = new_ztype | new_indnum; if (ztype_class(new_ztype) > ztype_class(old_ztype)) { *dz = new_dz; return; } else if (ztype_class(new_ztype) < ztype_class(old_ztype)) return; /* Collision: old and new have the same class */ if (ztype_class(old_ztype) == In_use_zone) { /* trouble */ if (new_indnum == old_indnum && new_ztype == old_ztype) { fprintf(stderr, "WARNING: file system corrupt, zone block %ld \ is used more than once.\n", blknum); return; } fprintf(stderr, "ERROR: file system corrupt, zone block %ld is used \ more than once.\n", blknum); fail("Can't determine its type"); } assert(ztype_class(old_ztype) == Old_zone); if (new_indnum != old_indnum) { *dz |= IND_CONFLICT_BIT; if (new_indnum > old_indnum) { *dz &= ~INDIRECT_MASK; *dz |= new_indnum; } } if (new_ztype == T_MAYBE_OLD_DIR || old_ztype == T_MAYBE_OLD_DIR) { *dz |= TYPE_CONFLICT_BIT; *dz &= ~T_MASK; *dz |= T_MAYBE_OLD_DIR; } } static class_t ztype_class(ztype) int ztype; { class_t class; if (ztype == T_MAYBE_OLD_DIR || ztype == T_OLD_NON_DIR) class = Old_zone; else if (ztype == T_DIR || ztype == T_NON_DIR) class = In_use_zone; else class = Unused_zone; return class; } static void fail(str) char *str; { fprintf(stderr, "%s\n", str); exit(1); } static unsigned int two_bytes(buf) char buf[2]; { unsigned char *ubuf = (unsigned char *) buf; if (big_endian_fs) return(ubuf[0] << 8) | ubuf[1]; else return(ubuf[1] << 8) | ubuf[0]; } static long four_bytes(buf) char buf[4]; { unsigned char *ubuf = (unsigned char *) buf; register int r1, r2; if (big_endian_fs) { r1 = (ubuf[0] << 8) | ubuf[1]; r2 = (ubuf[2] << 8) | ubuf[3]; } else { r2 = (ubuf[1] << 8) | ubuf[0]; r1 = (ubuf[3] << 8) | ubuf[2]; } return((long) r1 << 16) | r2; } static void usage(arg0) char *arg0; { fprintf(stderr, "usage: %s [-v] srcfs [destfs]\n", arg0); exit(2); } �������������������������������������/* sync - flush the file system buffers. Author: Andy Tanenbaum */ #include <sys/types.h> #include <unistd.h> _PROTOTYPE(int main, (void)); int main() { /* First prize in shortest useful program contest. */ /* Highest comment/code ratio */ sync(); return(0); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* synctree 4.16 - Synchronise file tree. Author: Kees J. Bot * 5 Apr 1989 * SYNOPSYS * synctree [-iuf] [[user1@machine1:]dir1 [[user2@]machine2:]dir2 * * Dir2 will then be synchronized to dir1 with respect to the flags. * The flags mean: * -i Be interactive on files other than directories too. * -u Only install files that are newer, i.e. that need an update. * -f Force. Don't ask for confirmation, all answers are 'yes'. * * Hitting return lets synctree use its proposed answer. Hitting CTRL-D is * like typing return to all questions that follow. * * If either of the directories to be synchronized contains the file ".backup" * then it is a backup directory. The file ".backup" in this directory is * an array of mode information indexed on inode number. * * 89/04/05, Kees J. Bot - Birth of tree synchronizing program. * 92/02/02 - General overhaul, rcp(1) like syntax. */ #define nil 0 #include <sys/types.h> #include <stddef.h> #include <stdio.h> #include <sys/stat.h> #include <utime.h> #include <string.h> #include <signal.h> #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #include <sys/wait.h> #if _MINIX #include "limits.h" #include "minix/config.h" #define BLOCK_SIZE 1024 #define LITTLE_ENDIAN (CHIP == INTEL) #define USE_SHADOWING (CHIP == M68000) #else #define LITTLE_ENDIAN 0 #define USE_SHADOWING 0 #endif #ifndef PATH_MAX #define PATH_MAX 1024 #endif #ifndef S_ISLNK /* There were no symlinks in medieval times. */ #define S_ISLNK(mode) (0) #define lstat stat #define symlink(path1, path2) (errno= ENOSYS, -1) #define readlink(path, buf, len) (errno= ENOSYS, -1) #endif #define NUMBYTES 4 /* Any number fits in this many bytes. */ #define CHUNK 4096 /* Transfer files in this size chunks. */ static int install= 0; /* Install files, do not delete, update if newer. */ static int interact= 0; /* Ask permission to install too. */ static int force= 0; /* Force trees to be completely equal. */ static int backup= 0; /* This tree is for backup. */ static char SYNCNAME[] = "synctree"; static char SLAVENAME[] = "==SLAVE=="; static char MASTERNAME[]= "==MASTER=="; static char BACKUP[] = ".backup"; /* Backup filemodes. */ static int filemodes; /* Filemodes fildes. */ static int chan[2]= { 0, 1 }; /* In and output channel to opposite side. */ #define BUCKSIZE (1+NUMBYTES+CHUNK) static char bucket[BUCKSIZE]; /* Put a lot of things here before sending. */ static char *buckp= bucket; /* Fill pointer. */ static int buckn= 0; /* # bytes in bucket. */ enum orders { /* What back breaking labour should the slave perform? */ ENTER= 128, /* Make ready to process contents of directory. */ ADVANCE, /* Determine next pathname and report it back. */ CAT, /* Send contents of file. */ MORE, /* Send more file contents. */ CANCEL, /* Current pathname is not installed, remove as link. */ DIE, /* Die with exit(0); */ DIE_BAD, /* exit(1); */ POSITIVE, /* Ask a yes/no question expecting yes. */ NEGATIVE, /* Same expecting no. */ PASS_YES, /* Pass this to the master will you. */ PASS_NO /* Same here. */ }; #ifdef DEBUG char *ORDERS[]= { "ENTER", "ADVANCE", "CAT", "MORE", "CANCEL", "DIE", "DIE_BAD", "POSITIVE", "NEGATIVE", "PASS_YES", "PASS_NO" }; #endif enum answers { PATH= 128, /* Report pathname, and stat(2) info. */ LINK, /* Report linkname, pathname, and stat(2) info. */ DATA, /* Contents of file follow. */ NODATA, /* Can't read file. */ DONE, /* Nothing more to advance to. */ SYMLINK, /* Report symlinkname, pathname, and stat(2) info. */ YES, NO /* Result of an ASK. */ }; #ifdef DEBUG char *ANSWERS[]= { "PATH", "LINK", "DATA", "NODATA", "DONE", "SYMLINK", "YES", "NO" }; #define DPRINTF(format, arg) fprintf(stderr, format, arg0, arg) #else #define DPRINTF(format, arg) #endif struct mode { unsigned short md_mode; unsigned short md_uid; unsigned short md_gid; unsigned short md_rdev; unsigned short md_devsiz; }; static char *arg0; /* basename(argv[0]) */ static int ex= 0; /* exit status. */ static void because() { fprintf(stderr, ": %s\n", strerror(errno)); ex= 1; } static void perr(label) char *label; { fprintf(stderr, "%s: %s: %s\n", arg0, label, strerror(errno)); ex= 1; } static void perrx(label) char *label; { perr(label); exit(1); } #if S_HIDDEN /* Support for per achitecture hidden files. */ static int transparent= 0; static void isvisible(name) char *name; { char *p= name + strlen(name); while (p > name && *--p == '/') {} if (p > name && *p == '@' && p[-1] != '/') transparent= 1; } #else #define transparent 0 #define isvisible(name) ((void) 0) #endif static void isbackup(slave) int slave; { if ((filemodes= open(BACKUP, slave ? O_RDONLY : O_RDWR)) >= 0) backup= 1; else { if (errno != ENOENT) perrx(BACKUP); } } static char path[PATH_MAX+1]; /* Holds pathname of file being worked on. */ static char lnkpth[PATH_MAX+1]; /* (Sym)link to path. */ static char *linkpath; /* What path is, or should be linked to. */ static struct stat st; /* Corresponding stat(2) info. */ static char Spath[PATH_MAX+1]; /* Slave is looking at this. */ static char Slnkpth[PATH_MAX+1];/* (Sym)link to Spath. */ static char *Slinkpath=nil; /* Either nil or Slnkpth. */ static struct stat Sst; /* Slave's stat(2). */ static char *addpath(p, n) char *p, *n; /* Add a name to the path, return pointer to end. */ { if (p - path + 1 + strlen(n) > PATH_MAX) { *p= 0; fprintf(stderr, "%s: %s/%s is too long.\n", arg0, path, n); fprintf(stderr, "%s: Unable to continue.\n", arg0); exit(1); } if (p == path+1 && path[0] == '.') p= path; if (p > path) *p++ = '/'; while (*n != 0) *p++ = *n++; *p= 0; return p; } struct entry { /* A directory entry. */ struct entry *next; /* Next entry in same directory */ struct entry *dir; /* It is part of this directory */ struct entry *con; /* If a dir, its contents */ char *name; /* Name of this dir entry */ }; static struct entry *E= nil; /* File being processed. */ static void setpath(e) struct entry *e; /* Set path leading to e. */ { static char *pend; if (e == nil) pend= path; else { setpath(e->dir); pend= addpath(pend, e->name); } } static void sort(ae) struct entry **ae; /* This is either a stable mergesort, or thermal noise, I'm no longer sure. * It must be called like this: if (L!=nil && L->next!=nil) sort(&L); */ { /* static */ struct entry *e1, **mid; /* Need not be local */ struct entry *e2; e1= *(mid= &(*ae)->next); do { if ((e1= e1->next) == nil) break; mid= &(*mid)->next; } while ((e1= e1->next) != nil); e2= *mid; *mid= nil; if ((*ae)->next != nil) sort(ae); if (e2->next != nil) sort(&e2); e1= *ae; for (;;) { if (strcmp(e1->name, e2->name)<=0) { if ((e1= *(ae= &e1->next)) == nil) { *ae= e2; break; } } else { *ae= e2; e2= *(ae= &e2->next); *ae= e1; if (e2 == nil) break; } } } static void enter() /* Collect directory entries of E. */ { struct entry **last= &E->con, *new; struct dirent *e; DIR *d; if ((d= opendir(path)) == nil) { fprintf(stderr, "%s: Can't read dir %s\n", arg0, path); return; } while ((e= readdir(d)) != nil) { if (e->d_name[0] == '.' && (e->d_name[1] == 0 || (e->d_name[1] == '.' && e->d_name[2] == 0) )) continue; new= (struct entry *) malloc(sizeof(*new)); new->next= nil; new->dir= E; new->con= nil; new->name= (char *) malloc(strlen(e->d_name) + 1); strcpy(new->name, e->d_name); *last= new; last= &new->next; } closedir(d); if (E->con != nil && E->con->next != nil) sort(&E->con); } #define arraysize(a) (sizeof(a) / sizeof((a)[0])) #define arraylimit(a) ((a) + arraysize(a)) static char *link_islink(struct stat *stp, const char *file) { /* Tell if a file, which stat(2) information in '*stp', has been seen * earlier by this function under a different name. If not return a * null pointer with errno set to ENOENT, otherwise return the name of * the link. Return a null pointer with an error code in errno for any * error, using E2BIG for a too long file name. * * Use link_islink(nil, nil) to resetR�� R�� R�� R�� R�� R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R��R�� R��!R���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� all bookkeeping. * * Call for a file twice to delete it from the store. */ typedef struct link { /* In-memory link store. */ struct link *next; /* Hash chain on inode number. */ ino_t ino; /* File's inode number. */ off_t off; /* Offset to more info in temp file. */ } link_t; typedef struct dlink { /* On-disk link store. */ dev_t dev; /* Device number. */ char file[PATH_MAX]; /* Name of earlier seen link. */ } dlink_t; static link_t *links[256]; /* Hash list of known links. */ static int tfd= -1; /* Temp file for file name storage. */ static dlink_t dlink; link_t *lp, **plp; size_t len; off_t off; if (file == nil) { /* Reset everything. */ for (plp= links; plp < arraylimit(links); plp++) { while ((lp= *plp) != nil) { *plp= lp->next; free(lp); } } if (tfd != -1) close(tfd); tfd= -1; return nil; } /* The file must be a non-directory with more than one link. */ if (S_ISDIR(stp->st_mode) || stp->st_nlink <= 1) { errno= ENOENT; return nil; } plp= &links[stp->st_ino % arraysize(links)]; while ((lp= *plp) != nil) { if (lp->ino == stp->st_ino) { /* May have seen this link before. Get it and check. */ if (lseek(tfd, lp->off, SEEK_SET) == -1) return nil; if (read(tfd, &dlink, sizeof(dlink)) < 0) return nil; /* Only need to check the device number. */ if (dlink.dev == stp->st_dev) { if (strcmp(file, dlink.file) == 0) { /* Called twice. Forget about this link. */ *plp= lp->next; free(lp); errno= ENOENT; return nil; } /* Return the name of the earlier link. */ return dlink.file; } } plp= &lp->next; } /* First time I see this link. Add it to the store. */ if (tfd == -1) { for (;;) { char *tmp; tmp= tmpnam(nil); tfd= open(tmp, O_RDWR|O_CREAT|O_EXCL, 0600); if (tfd < 0) { if (errno != EEXIST) return nil; } else { (void) unlink(tmp); break; } } } if ((len= strlen(file)) >= PATH_MAX) { errno= E2BIG; return nil; } dlink.dev= stp->st_dev; strcpy(dlink.file, file); len += offsetof(dlink_t, file) + 1; if ((off= lseek(tfd, 0, SEEK_END)) == -1) return nil; if (write(tfd, &dlink, len) != len) return nil; if ((lp= malloc(sizeof(*lp))) == nil) return nil; lp->next= nil; lp->ino= stp->st_ino; lp->off= off; *plp= lp; errno= ENOENT; return nil; } #define cancellink() ((void) islink()) static char *islink() /* Returns the name of the file path is linked to. If no such link can be * found, then path is added to the list and nil is returned. If all the * links of a file have been seen, then it is removed from the list. * Directories are not seen as linkable. */ { char *name; name= link_islink(&st, path); if (name == nil && errno != ENOENT) perrx(path); return name; } static void setstat(ino, stp) ino_t ino; struct stat *stp; /* Set backup status info, we know that backup is true. */ { struct mode md; md.md_mode = stp->st_mode; md.md_uid = stp->st_uid; md.md_gid = stp->st_gid; md.md_rdev = stp->st_rdev; md.md_devsiz = stp->st_size / 1024; if (lseek(filemodes, (off_t) sizeof(md) * (off_t) ino, 0) == -1 || write(filemodes, (char *) &md, sizeof(md)) != sizeof(md) ) perrx(BACKUP); } static int getstat(name, stp) char *name; struct stat *stp; /* Get status information of file name, skipping some files. Backup info * is inserted as needed. */ { errno= 0; if (strcmp(name, BACKUP) == 0) return -1; if (lstat(name, stp) < 0) return -1; if (stp->st_mode == S_IFREG && stp->st_mtime == 0) return -1; if (backup) { struct mode md; if (lseek(filemodes, (off_t) sizeof(md) * (off_t) stp->st_ino, 0) == -1 || read(filemodes, (char *) &md, sizeof(md)) != sizeof(md) || md.md_mode == 0 ) { errno= 0; setstat(stp->st_ino, stp); } else { stp->st_mode = md.md_mode; stp->st_uid = md.md_uid; stp->st_gid = md.md_gid; stp->st_rdev = md.md_rdev; if (S_ISBLK(stp->st_mode)) stp->st_size= (off_t) md.md_devsiz * 1024; } } return 0; } static int advance() /* Determine next pathname, return true on success. */ { for (;;) { if (E==nil) { /* First call, enter root dir. */ E= (struct entry *) malloc(sizeof(*E)); E->dir= nil; E->con= nil; E->next= nil; E->name= (char *) malloc(3); strcpy(E->name, transparent ? ".@" : "."); } else if (E->con != nil) /* Dir's files must be processed. */ E= E->con; else { for (;;) { /* Remove E from it's parents list, then * try next entry, if none, go to parent dir. */ struct entry *junk= E, *parent= E->dir; if (parent != nil) parent->con= E->next; E= E->next; free(junk->name); free(junk); if (E != nil) break; if ((E= parent) == nil) return 0; } } setpath(E); if (getstat(path, &st) == 0) { if (S_ISLNK(st.st_mode)) { int n; if ((n= readlink(path, lnkpth, PATH_MAX)) >= 0) { lnkpth[n]= 0; break; } } else { break; } } if (errno != 0 && errno != ENOENT) perr(path); } linkpath= islink(); DPRINTF("%s: path = %s\n", path); return 1; } static enum orders request() /* Slave reads command sent by master. */ { static char buf[64], *bp; static int n= 0; int req; for (;;) { if (n == 0) { if ((n= read(chan[0], buf, (int) sizeof(buf))) <= 0) { if (n < 0) perrx("request()"); /* Master died, try to report it then follow. */ fprintf(stderr, "%s: Master died prematurely.\n", arg0); exit(1); } bp= buf; } req= *bp++ & 0xFF; n--; if (req >= (int) ENTER) break; /* Master using slave to print to stdout: */ putchar(req); } DPRINTF("%s: request() == %s\n", ORDERS[req - (int) ENTER]); return (enum orders) req; } static void report() { int r; DPRINTF("%s: reporting now!\n", 0); buckp= bucket; while (buckn > 0) { r = buckn; if (r > (512 << sizeof(char*))) r= (512 << sizeof(char*)); if ((r= write(chan[1], buckp, r)) < 0) perrx("report()"); buckp += r; buckn -= r; } buckp= bucket; buckn= 0; } static void inform(a) enum answers a; /* Slave replies to master. */ { DPRINTF("%s: inform(%s)\n", ANSWERS[(int) a - (int) PATH]); *buckp++ = (int) a; buckn++; } #define wwrite(buf, n) (memcpy(buckp, (buf), (n)), buckp+= (n), buckn+= (n)) static void sendnum(n) long n; /* Send number from least to most significant byte. */ { #if LITTLE_ENDIAN wwrite((char *) &n, sizeof(n)); #else char buf[NUMBYTES]; buf[0]= (char) (n >> 0); buf[1]= (char) (n >> 8); buf[2]= (char) (n >> 16); buf[3]= (char) (n >> 24); wwrite(buf, sizeof(buf)); #endif } static void send(buf, n) char *buf; int n; /* Slave sends size and contents of buf. */ { sendnum((long) n); if (n > 0) wwrite(buf, (size_t) n); } static void sendstat(stp) struct stat *stp; { sendnum((long) stp->st_mode); sendnum((long) stp->st_uid); sendnum((long) stp->st_gid); sendnum((long) stp->st_rdev); sendnum((long) stp->st_size); sendnum((long) stp->st_mtime); } static int ask(); static void slave() /* Carry out orders from the master, such as transmitting path names. * Note that the slave uses path, not Spath, the master uses Spath. */ { int f, n; char buf[CHUNK]; enum { run, done, die } state= run; do { switch (request()) { case ENTER: enter(); break; case ADVANCE: if (!advance() || state == done) { inform(DONE); state= done; } else { if (linkpath!=nil) { inform(LINK); send(linkpath, strlen(linkpath) + 1); } else if (S_ISLNK(st.st_mode)) { inform(SYMLINK); send(lnkpth, strlen(lnkpth) + 1); } else { inform(PATH); } send(path, strlen(path) + 1); sendstat(&st); } break; case CAT: if ((f= open(path, O_RDONLY))<0) { fprintf(stderr, "%s: Can't open %s", arg0, path); because(); inform(NODATA); break; } inform(DATA); do { n= read(f, buf, sizeof(buf)); if (n < 0) perr(path); send(buf, n); if (n > 0) report(); } while (n > 0); close(f); break; case CANCEL: cancellink(); break; case DIE_BAD: ex= 1; /*FALL THROUGH*/ case DIE: state= die; break; case POSITIVE: inform(ask('y') ? YES : NO); break; case NEGATIVE: inform(ask('n') ? YES : NO); break; case PASS_YES: inform(YES); break; case PASS_NO: inform(NO); break; default: fprintf(stderr, "%s: strange request\n", arg0); exit(1); } report(); } while (state != die); } static int execute(argv) char **argv; /* Execute a command and return its success or failure. */ { int pid, r, status; if ((pid= fork())<0) { perr("fork()"); return 0; } if (pid == 0) { execvp(argv[0], argv); perrx(argv[0]); } while ((r= wait(&status)) != pid) { if (r < 0) { perr(argv[0]); return 0; } } return status == 0; } static int removedir(dir) char *dir; /* Remove a directory and its contents. */ { static char *argv[] = { "rm", "-r", nil, nil }; printf("(rm -r %s)\n", dir); argv[2]= dir; return execute(argv); } static void order(o) enum orders o; /* Master tells slave what to do. */ { char c= (char) o; DPRINTF("%s: order(%s)\n", ORDERS[o - (int) ENTER]); if (write(chan[1], &c, 1) != 1) perrx("order()"); } static void rread(buf, n) char *buf; int n; /* Master gets buf of size n from slave, doing multiple reads if needed. */ { int r; while (n > 0) { if (buckn == 0) { switch (buckn= read(chan[0], bucket, BUCKSIZE)) { case -1: perrx("reply channel from slave"); case 0: fprintf(stderr, "%s: slave died prematurely.\n", arg0); exit(1); } buckp= bucket; } r= n < buckn ? n : buckn; memcpy(buf, buckp, r); buckp+= r; buckn-= r; buf+= r; n-= r; } } static enum answers answer() /* Master reads slave's reply. */ { char c; int a; rread(&c, 1); a= c & 0xFF; DPRINTF("%s: answer() == %s\n", ANSWERS[a - (int) PATH]); return (enum answers) a; } static long recnum() /* Read number as pack of bytes from least to most significant. The data * is on the wire in little-endian format. (Mostly run on PC's). */ { #if LITTLE_ENDIAN long n; rread((char *) &n, (int) sizeof(n)); return n; #else unsigned char buf[NUMBYTES]; rread(buf, sizeof(buf)); return buf[0] | ((unsigned) buf[1] << 8) | ((unsigned long) buf[2] << 16) | ((unsigned long) buf[3] << 24); #endif } static int receive(buf, max) char *buf; int max; /* Master get's data from slave, by first reading size, then data. */ { int n; n= recnum(); if (n > max) { fprintf(stderr, "%s: panic: Can't read %d bytes\n", arg0, n); exit(1); } if (n > 0) rread(buf, n); return n; } static void recstat(stp) struct stat *stp; { stp->st_mode= recnum(); stp->st_uid= recnum(); stp->st_gid= recnum(); stp->st_rdev= recnum(); stp->st_size= recnum(); stp->st_mtime= recnum(); } static int key() { int c; static int tty= -1; if (tty < 0) tty= isatty(0); if (feof(stdin) || (c= getchar()) == EOF) { c= '\n'; if (tty) putchar('\n'); } if (!tty) putchar(c); return c; } static int ask(def) int def; /* Ask for a yes or no, anything else means choose def. */ { int y, c; if (chan[0] == 0) { /* I'm running remote, tell the slave to ask. */ fflush(stdout); order(def == 'y' ? POSITIVE : NEGATIVE); return answer() == YES; } printf("? (%c) ", def); fflush(stdout); do c= key(); while (c == ' ' || c == '\t'); y= c; while (c != '\n') c= key(); if (y != 'y' && y != 'Y' && y != 'n' && y != 'N') y= def; return y == 'y' || y == 'Y'; } static void setmodes(silent) int silent; { struct stat st; int change= 0; struct utimbuf tms; errno= 0; getstat(Spath, &st); if (backup && silent) { setstat(st.st_ino, &Sst); getstat(Spath, &st); } if (S_ISLNK(st.st_mode)) return; if (errno == 0 && st.st_mode != Sst.st_mode) { if (!backup) chmod(Spath, Sst.st_mode & 07777); change= 1; } if (errno == 0 && (st.st_uid != Sst.st_uid || st.st_gid != Sst.st_gid) && (backup || geteuid() == 0) ) { errno= 0; if (!backup) chown(Spath, Sst.st_uid, Sst.st_gid); change= 1; } if (backup && !silent) setstat(st.st_ino, &Sst); if (errno == 0 && S_ISREG(Sst.st_mode) && st.st_mtime != Sst.st_mtime) { time(&tms.actime); tms.modtime= Sst.st_mtime; errno= 0; utime(Spath, &tms); change= 1; } if (errno != 0) { fprintf(stderr, "%s: Can't set modes of %s", arg0, Spath); because(); } else if (change && !silent) { printf("Mode changed of %s\n", Spath); } } static void makeold() { static struct utimbuf tms= { 0, 0 }; if (utime(Spath, &tms) < 0) { if (errno != ENOENT) { fprintf(stderr, "%s: can't make %s look old", arg0, Spath); because(); } } else { fprintf(stderr, "%s: made %s look old.\n", arg0, Spath); } } static int busy= 0; static void bail_out(sig) int sig; { signal(sig, SIG_IGN); fprintf(stderr, "%s: Exiting after signal %d\n", arg0, sig); if (busy) { fprintf(stderr, "%s: was installing %s\n", arg0, Spath); makeold(); } order(DIE_BAD); exit(sig); } static int makenode(name, mode, addr, size) char *name; int mode; dev_t addr; off_t size; { int r; if (!backup) { r= mknod(name, mode, addr); } else { if ((r= creat(name, 0644)) >= 0) close(r); } return r; } static void add(update) int update; /* Add Spath to the filesystem. */ { int f, n; char buf[CHUNK]; int forced_update= force && update; if (Slinkpath != nil && !S_ISLNK(Sst.st_mode)) { if (interact && !update) { printf("Link %s to %s", Spath, Slinkpath); if (!ask('n')) return; } if (link(Slinkpath, Spath) >= 0) { printf("Linked %s to %s\n", Spath, Slinkpath); return; } else { fprintf(stderr, "%s: Can't link %s to %s", arg0, Slinkpath, Spath); because(); /* Try to install instead. */ } } switch (Sst.st_mode & S_IFMT) { case S_IFDIR: if (!force) { printf("Add dir %s", Spath); if (!ask('n')) return; } if (mkdir(Spath, backup ? 0755 : Sst.st_mode) < 0) { perr(Spath); return; } printf("Directory %s created.\n", Spath); order(ENTER); break; case S_IFBLK: case S_IFCHR: case S_IFIFO: if (interact && !update) { printf("Create special file %s", Spath); if (!ask('n')) { order(CANCEL); return; } } if (makenode(Spath, Sst.st_mode, Sst.st_rdev, Sst.st_size)<0) { fprintf(stderr, "%s: Can't create special file %s", arg0, Spath); because(); return; } printf("Special file %s created\n", Spath); break; #ifdef S_IFLNK case S_IFLNK: if (interact && !update) { printf("Install %s -> %s", Spath, Slnkpth); if (!ask('n')) { order(CANCEL); return; } } if (symlink(Slnkpth, Spath) < 0) { fprintf(stderr, "%s: Can't create symlink %s", arg0, Spath); because(); return; } printf("%s %s -> %s\n", forced_update ? "Updated: " : "Installed:", Spath, Slnkpth); break; #endif case S_IFREG: if (interact && !update) { printf("Install %s", Spath); if (!ask('n')) { order(CANCEL); return; } } order(CAT); if (answer() != DATA) return; busy= 1; if ((f= creat(Spath, backup ? 0644 : Sst.st_mode&07777)) < 0) { busy= 0; fprintf(stderr, "%s: Can't create %s", arg0, Spath); because(); } while ((n= receive(buf, sizeof(buf)))>0) { if (f >= 0 && write(f, buf, n) != n) { fprintf(stderr, "%s: Write error on %s", arg0, Spath); because(); close(f); f= -1; } } if (n < 0) { fprintf(stderr, "%s: Slave read err on %s\n", arg0, Spath); } if (f >= 0) close(f); if (n < 0 || f < 0) { makeold(); busy= 0; return; } busy= 0; printf("%s %s\n", forced_update ? Sst.st_mtime < st.st_mtime ? "Restored: " : "Updated: " : "Installed:", Spath ); break; default: fprintf(stderr, "%s: Won't add file with strange mode %05o: %s\n", arg0, Sst.st_mode, Spath); order(CANCEL); return; } setmodes(1); } static int delete(update) int update; /* Delete path. */ { int forced_update= force && update; if (S_ISDIR(st.st_mode)) { if (install) return 0; if (!force) { printf("Delete dir %s", path); if (!ask('n')) return 0; } if (!removedir(path)) { ex= 1; return 0; } if (!forced_update) printf("Directory %s deleted.\n", path); return 1; } if (install && !update) return 0; if (!force) { printf("Delete %s", path); if (!ask((interact && !update) ? 'n' : 'y')) return 0; } if (unlink(path)<0) { fprintf(stderr, "Can't delete %s", path); because(); return 0; } cancellink(); if (!forced_update) printf("Deleted: %s\n", path); return 1; } static int different() /* Return true iff path and Spath are different. */ { if (! ( (linkpath == nil && Slinkpath == nil) || (linkpath != nil && Slinkpath != nil && strcmp(linkpath, Slinkpath) == 0) )) { linkpath= Slinkpath; return 1; } if ((st.st_mode & S_IFMT) != (Sst.st_mode & S_IFMT)) return 1; switch (st.st_mode & S_IFMT) { case S_IFDIR: return 0; case S_IFBLK: case S_IFCHR: return st.st_rdev != Sst.st_rdev; case S_IFREG: if (install) return Sst.st_mtime > st.st_mtime; return st.st_size != Sst.st_size || st.st_mtime != Sst.st_mtime; case S_IFIFO: return 0; #ifdef S_IFLNK case S_IFLNK: return strcmp(lnkpth, Slnkpth) != 0; #endif default: return 1; } } static void compare() /* See if path and Spath are same. */ { if (different()) { if (!force) { printf("%sing %s (delete + add)\n", Sst.st_mtime < st.st_mtime ? "Restor" : "Updat", path); } if (delete(1)) add(1); } else { if (!install) setmodes(0); if (S_ISDIR(st.st_mode)) { order(ENTER); enter(); } } } static int done= 0, Sdone= 0; static enum action { ADD, COMPARE, DELETE } action() /* Look at path's of master and slave, compare them alphabetically to see * who is ahead of who, then tell what is to be done. */ { int c; char *Sp, *p; if (done) return ADD; /* Slave still has names. */ if (Sdone) return DELETE; /* Master has too many names. */ /* Compare paths. Let "a/a" come before "a.a". */ Sp= Spath; p= path; while (*Sp == *p && *Sp != 0) { Sp++; p++; } if (*Sp == '/') return ADD; if (*p == '/') return DELETE; return (c= strcmp(Sp, p)) == 0 ? COMPARE : c < 0 ? ADD : DELETE; } static void master() /* Synchronise file tree to that of its slave. */ { enum action a= COMPARE; /* Trick first advances. */ umask(backup ? 0022 : 0000); signal(SIGPIPE, SIG_IGN); signal(SIGHUP, bail_out); signal(SIGINT, bail_out); signal(SIGTERM, bail_out); while (!done || !Sdone) { if (!Sdone && (a == ADD || a == COMPARE)) { /* Slave advances. */ order(ADVANCE); switch (answer()) { case PATH: Slinkpath= nil; receive(Spath, sizeof(Spath)); recstat(&Sst); break; case LINK: receive(Slnkpth, sizeof(Slnkpth)); Slinkpath= Slnkpth; receive(Spath, sizeof(Spath)); recstat(&Sst); break; case SYMLINK: Slinkpath= nil; receive(Slnkpth, sizeof(Slnkpth)); receive(Spath, sizeof(Spath)); recstat(&Sst); break; case DONE: Sdone= 1; break; default: fprintf(stderr, "%s: Strange answer from slave.\n", arg0); exit(1); } } if (!done && (a == COMPARE || a == DELETE)) { /* Master advances. */ if (!advance()) done= 1; } if (done && Sdone) break; switch (a= action()) { case ADD: /* Spath exists, path doesn't, add? */ add(0); break; case COMPARE: /* They both exist, are they the same? */ compare(); break; case DELETE: /* path exists, Spath doesn't, delete? */ delete(0); } fflush(stdout); /* Don't keep user in suspense. */ } order(ex == 0 ? DIE : DIE_BAD); } static void mediator() /* Sits at the local machine and passes orders from master to slave, both * on remote machines. Only diagnostics and questions are handled. */ { enum orders req; for (;;) { switch (req= request()) { case DIE_BAD: ex= 1; /*FALL THROUGH*/ case DIE: order(DIE); return; case POSITIVE: order(ask('y') ? PASS_YES : PASS_NO); break; case NEGATIVE: order(ask('n') ? PASS_YES : PASS_NO); break; default: order(req); } } } #define P_EXIT 1 /* Make sure process doesn't return. */ #define P_SHADOW 2 /* Always use exec on 68000. */ static void startprocess(proc, machine, path, p_flags) void (*proc)(); char *machine, *path; int p_flags; { char *argv[10], **argp= argv; char flags[10], *pfl= flags; if (machine != nil) { char *u= machine, *m; *argp++ = "rsh"; if ((m= strchr(machine, '@')) != nil) { *m++ = 0; *argp++ = "-l"; *argp++ = u; machine= m; } *argp++ = machine; } else /* Without this check it would run like a pig on an non MMU 68000: */ if (!(USE_SHADOWING && p_flags & P_SHADOW)) { if (chdir(path) < 0) { if (proc != master || errno != ENOENT || mkdir(path, 0700) < 0) perrx(path); if (chdir(path) < 0) perrx(path); printf("Destination directory %s created\n", path); } isvisible(path); isbackup(proc == slave); (*proc)(); if (p_flags & P_EXIT) exit(ex); return; } *argp++ = SYNCNAME; *pfl++ = '-'; if (interact) *pfl++ = 'i'; if (install) *pfl++ = 'u'; if (force) *pfl++ = 'f'; *pfl= 0; *argp++ = flags; *argp++ = proc == slave ? SLAVENAME : MASTERNAME; *argp++ = path; *argp++ = nil; #ifdef DEBUG fprintf(stderr, "execlp("); for (argp= argv; *argp != nil; argp++) fprintf(stderr, "%s, ", *argp); fprintf(stderr, "nil);\n"); #endif execvp(argv[0], argv); perrx(argv[0]); } void splitcolon(path, amach, adir) char *path, **amach, **adir; { char *dir= path; for (;;) { if (*dir == ':') { *dir++ = 0; *amach= path; *adir= dir; break; } if (*dir == 0 || *dir == '/') { *amach= nil; *adir= path; break; } dir++; } } static void Usage() { fprintf(stderr, "Usage: %s [-iuf] [[user@]machine:]dir1 [[user@]machine:]dir2\n", arg0); exit(1); } main(argc, argv) int argc; char **argv; { char *s_mach, *s_dir; char *m_mach, *m_dir; int m2s[2], s2m[2], m2m[2]; int s_pid= 0, m_pid= 0; int r; if ((arg0= strrchr(argv[0], '/')) == nil) arg0= argv[0]; else arg0++; while (argc>1 && argv[1][0] == '-') { char *f= argv[1]+1; while (*f != 0) { switch (*f++) { case 'i': interact= 1; break; case 'u': install= 1; break; case 'f': force= 1; break; default: Usage(); } } argc--; argv++; } if (argc != 3) Usage(); if (strcmp(argv[1], SLAVENAME) == 0) { arg0= "Slave"; splitcolon(argv[2], &s_mach, &s_dir); startprocess(slave, s_mach, s_dir, P_EXIT); } else if (strcmp(argv[1], MASTERNAME) == 0) { arg0= "Master"; splitcolon(argv[2], &m_mach, &m_dir); startprocess(master, m_mach, m_dir, P_EXIT); } splitcolon(argv[1], &s_mach, &s_dir); splitcolon(argv[2], &m_mach, &m_dir); /* How difficult can plumbing be? */ if (pipe(m2s) < 0 || pipe(s2m) < 0) perrx("pipe()"); if (m_mach == nil) { /* synctree [machine:]dir1 dir2 */ switch (s_pid= fork()) { case -1: perrx("fork()"); case 0: dup2(m2s[0], 0); close(m2s[0]); close(m2s[1]); dup2(s2m[1], 1); close(s2m[0]); close(s2m[1]); arg0= "Slave"; startprocess(slave, s_mach, s_dir, P_EXIT|P_SHADOW); } chan[0]= s2m[0]; close(s2m[1]); chan[1]= m2s[1]; close(m2s[0]); startprocess(master, m_mach, m_dir, 0); } else if (s_mach == nil) { /* synctree dir1 machine:dir2 */ switch (m_pid= fork()) { case -1: perrx("fork()"); case 0: dup2(s2m[0], 0); close(s2m[0]); close(s2m[1]); dup2(m2s[1], 1); close(m2s[0]); close(m2s[1]); arg0= "Master"; startprocess(master, m_mach, m_dir, P_EXIT|P_SHADOW); } chan[0]= m2s[0]; close(m2s[1]); chan[1]= s2m[1]; close(s2m[0]); startprocess(slave, s_mach, s_dir, 0); } else { /* synctree machine1:dir1 machine2:dir2 */ if (pipe(m2m) < 0) perrx(pipe); switch (s_pid= fork()) { case -1: perrx("fork()"); case 0: dup2(m2s[0], 0); close(m2s[0]); close(m2s[1]); dup2(s2m[1], 1); close(s2m[0]); close(s2m[1]); close(m2m[0]); close(m2m[1]); arg0= "Slave"; startprocess(slave, s_mach, s_dir, P_EXIT|P_SHADOW); } switch (m_pid= fork()) { case -1: perrx("fork()"); case 0: dup2(s2m[0], 0); close(s2m[0]); close(s2m[1]); close(m2s[0]); close(m2s[1]); dup2(m2m[1], 1); close(m2m[0]); close(m2m[1]); arg0= "Master"; startprocess(master, m_mach, m_dir, P_EXIT|P_SHADOW); } close(s2m[0]); close(s2m[1]); chan[0]= m2m[0]; close(m2m[1]); chan[1]= m2s[1]; close(m2s[0]); mediator(); } close(chan[0]); close(chan[1]); alarm(15); /* Don't wait(2) forever. */ while (s_pid != 0 || m_pid != 0) { if ((r= wait((int *) nil)) < 0) perrx("wait()"); if (r == s_pid) s_pid= 0; if (r == m_pid) m_pid= 0; } exit(ex); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tail - copy the end of a file Author: Norbert Schlenker */ /* Syntax: tail [-f] [-c number | -n number] [file] * tail -[number][c|l][f] [file] (obsolescent) * tail +[number][c|l][f] [file] (obsolescent) * Flags: * -c number Measure starting point in bytes. If number begins * with '+', the starting point is relative to the * the file's beginning. If number begins with '-' * or has no sign, the starting point is relative to * the end of the file. * -f Keep trying to read after EOF on files and FIFOs. * -n number Measure starting point in lines. The number * following the flag has significance similar to * that described for the -c flag. * * If neither -c nor -n are specified, the default is tail -n 10. * * In the obsolescent syntax, an argument with a 'c' following the * (optional) number is equivalent to "-c number" in the standard * syntax, with number including the leading sign ('+' or '-') of the * argument. An argument with 'l' following the number is equivalent * to "-n number" in the standard syntax. If the number is not * specified, 10 is used as the default. If neither 'c' nor 'l' are * specified, 'l' is assumed. The character 'f' may be suffixed to * the argument and is equivalent to specifying "-f" in the standard * syntax. Look for lines marked "OBSOLESCENT". * * If no file is specified, standard input is assumed. * * P1003.2 does not specify tail's behavior when a count of 0 is given. * It also does not specify clearly whether the first byte (line) of a * file should be numbered 0 or 1. Historical behavior is that the * first byte is actually number 1 (contrary to all Unix standards). * Historically, a count of 0 (or -0) results in no output whatsoever, * while a count of +0 results in the entire file being copied (just like * +1). The implementor does not agree with these behaviors, but has * copied them slavishly. Look for lines marked "HISTORICAL". * * Author: Norbert Schlenker * Copyright: None. Released to the public domain. * Reference: P1003.2 section 4.59 (draft 10) * Notes: Under Minix, this program requires chmem =30000. * Bugs: No internationalization support; all messages are in English. */ /* Force visible Posix names */ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif /* External interfaces */ #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <ctype.h> #include <stdlib.h> #include <stdio.h> /* External interfaces that should have been standardized into <getopt.h> */ extern char *optarg; extern int optind; /* We expect this constant to be defined in <limits.h> in a Posix program, * but we'll specify it here just in case it's been left out. */ #ifndef LINE_MAX #define LINE_MAX 2048 /* minimum acceptable lower bound */ #endif /* Magic numbers suggested or required by Posix specification */ #define SUCCESS 0 /* exit code in case of success */ #define FAILURE 1 /* or failure */ #define DEFAULT_COUNT 10 /* default number of lines or bytes */ #define MIN_BUFSIZE (LINE_MAX * DEFAULT_COUNT) #define SLEEP_INTERVAL 1 /* sleep for one second intervals with -f */ #define FALSE 0 #define TRUE 1 /* Internal functions - prototyped under Minix */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(int tail, (int count, int bytes, int read_until_killed)); _PROTOTYPE(int keep_reading, (void)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { int cflag = FALSE; int nflag = FALSE; int fflag = FALSE; int number = -DEFAULT_COUNT; char *suffix; int opt; struct stat stat_buf; /* Determining whether this invocation is via the standard syntax or * via an obsolescent one is a nasty kludge. Here it is, but there is * no pretense at elegance. */ if (argc == 1) { /* simple: default read of a pipe */ exit(tail(-DEFAULT_COUNT, 0, fflag)); } if ((argv[1][0] == '+') || /* OBSOLESCENT */ (argv[1][0] == '-' && ((isdigit(argv[1][1])) || (argv[1][1] == 'l') || (argv[1][1] == 'c' && argv[1][2] == 'f')))) { --argc; ++argv; if (isdigit(argv[0][1])) { number = (int)strtol(argv[0], &suffix, 10); if (number == 0) { /* HISTORICAL */ if (argv[0][0] == '+') number = 1; else exit(SUCCESS); } } else { number = (argv[0][0] == '+') ? DEFAULT_COUNT : -DEFAULT_COUNT; suffix = &(argv[0][1]); } if (*suffix != '\0') { if (*suffix == 'c') { cflag = TRUE; ++suffix; } else if (*suffix == 'l') { nflag = TRUE; ++suffix; } } if (*suffix != '\0') { if (*suffix == 'f') { fflag = TRUE; ++suffix; } } if (*suffix != '\0') { /* bad form: assume to be a file name */ number = -DEFAULT_COUNT; cflag = nflag = FALSE; fflag = FALSE; } else { --argc; ++argv; } } else { /* new standard syntax */ while ((opt = getopt(argc, argv, "c:fn:")) != EOF) { switch (opt) { case 'c': cflag = TRUE; if (*optarg == '+' || *optarg == '-') number = atoi(optarg); else if (isdigit(*optarg)) number = -atoi(optarg); else usage(); if (number == 0) { /* HISTORICAL */ if (*optarg == '+') number = 1; else exit(SUCCESS); } break; case 'f': fflag = TRUE; break; case 'n': nflag = TRUE; if (*optarg == '+' || *optarg == '-') number = atoi(optarg); else if (isdigit(*optarg)) number = -atoi(optarg); else usage(); if (number == 0) { /* HISTORICAL */ if (*optarg == '+') number = 1; else exit(SUCCESS); } break; default: usage(); /* NOTREACHED */ } } argc -= optind; argv += optind; } if (argc > 1 || /* too many arguments */ (cflag && nflag)) { /* both bytes and lines specified */ usage(); } if (argc > 0) { /* an actual file */ if (freopen(argv[0], "r", stdin) != stdin) { fputs("tail: could not open ", stderr); fputs(argv[0], stderr); fputs("\n", stderr); exit(FAILURE); } /* There is an optimization possibility here. If a file is being * read, we need not look at the front of it. If we seek backwards * from the end, we can (potentially) avoid looking at most of the * file. Some systems fail when asked to seek backwards to a point * before the start of the file, so we avoid that possibility. */ if (number < 0 && fstat(fileno(stdin), &stat_buf) == 0) { long offset = cflag ? (long)number : (long)number * LINE_MAX; if (-offset < stat_buf.st_size) fseek(stdin, offset, SEEK_END); } } else { fflag = FALSE; /* force -f off when reading a pipe */ } exit(tail(number, cflag, fflag)); /* NOTREACHED */ } int tail(count, bytes, read_until_killed) int count; /* lines or bytes desired */ int bytes; /* TRUE if we want bytes */ int read_until_killed; /* keep reading at EOF */ { int c; char *buf; /* pointer to input buffer */ char *buf_end; /* and one past its end */ char *start; /* pointer to first desired character in buf */ char *finish; /* pointer past last desired character */ int wrapped_once = FALSE; /* TRUE after buf has been filled once */ /* This is magic. If count is positive, it means start at the count'th * line or byte, with the first line or byte considered number 1. Thus, * we want to SKIP one less line or byte than the number specified. In * the negative case, we look backward from the end of the file for the * (count + 1)'th newline or byte, so we really want the count to be one * LARGER than was specified (in absolute value). In either case, the * right thing to do is: */ --count; /* Count is positive: skip the desired lines or bytes and then copy. */ if (count >= 0) { while (count > 0 && (c = getchar()) != EOF) { if (bytes || c == '\n') --count; } while ((c = getchar()) != EOF) { if (putchar(c) == EOF) return FAILURE; } if (read_until_killed) return keep_reading(); return ferror(stdin) ? FAILURE : SUCCESS; } /* Count is negative: allocate a reasonably large buffer. */ if ((buf = (char *)malloc(MIN_BUFSIZE + 1)) == (char *)NULL) { fputs("tail: out of memory\n", stderr); return)R��+R��,R��-R�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� FAILURE; } buf_end = buf + (MIN_BUFSIZE + 1); /* Read the entire file into the buffer. */ finish = buf; while ((c = getchar()) != EOF) { *finish++ = c; if (finish == buf_end) { finish = buf; wrapped_once = TRUE; } } if (ferror(stdin)) return FAILURE; /* Back up inside the buffer. The count has already been adjusted to * back up exactly one character too far, so we will bump the buffer * pointer once after we're done. * * BUG: For large line counts, the buffer may not be large enough to * hold all the lines. The specification allows the program to * fail in such a case - this program will simply dump the entire * buffer's contents as its best attempt at the desired behavior. */ if (finish != buf || wrapped_once) { /* file was not empty */ start = (finish == buf) ? buf_end - 1 : finish - 1; while (start != finish) { if ((bytes || *start == '\n') && ++count == 0) break; if (start == buf) { start = buf_end - 1; if (!wrapped_once) /* never wrapped: stop now */ break; } else { --start; } } if (++start == buf_end) { /* bump after going too far */ start = buf; } if (finish > start) { fwrite(start, 1, finish - start, stdout); } else { fwrite(start, 1, buf_end - start, stdout); fwrite(buf, 1, finish - buf, stdout); } } if (read_until_killed) return keep_reading(); return ferror(stdout) ? FAILURE : SUCCESS; } /* Wake at intervals to reread standard input. Copy anything read to * standard output and then go to sleep again. */ int keep_reading() { char buf[1024]; int n; int i; off_t pos; struct stat st; pos = lseek(0, (off_t) 0, SEEK_CUR); for (;;) { for (i = 0; i < 60; i++) { while ((n = read(0, buf, sizeof(buf))) > 0) { if (write(1, buf, n) < 0) return FAILURE; } if (n < 0) return FAILURE; sleep(SLEEP_INTERVAL); } /* Rewind if suddenly truncated. */ if (pos != -1) { if (fstat(0, &st) == -1) { pos = -1; } else if (st.st_size < pos) { pos = lseek(0, (off_t) 0, SEEK_SET); } else { pos = st.st_size; } } } } /* Tell the user the standard syntax. */ void usage() { fputs("Usage: tail [-f] [-c number | -n number] [file]\n", stderr); exit(FAILURE); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5 tar.c���������6 tcpd.c��������7 tee.c���������8 term.c��������9 termcap.c�����: tget.c��������; time.c��������< touch.c�������= tr.c����������> tsort.c�������? ttt.c���������@ tty.c���������A umount.c������B uname.c�������C unexpand.c����D uniq.c��������E update.c������F uud.c���������G uue.c���������H vol.c���������I wc.c����������J which.c�������K who.c���������L whoami.c������M write.c�������N yes.c�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tar - tape archiver Author: Michiel Huisjes */ /* Usage: tar [cxt][vo][F][f] tapefile [files] * * attempt to make tar to conform to POSIX 1003.1 * disclaimer: based on an old (1986) POSIX draft. * Klamer Schutte, 20/9/89 * * Changes: * Changed to handle the original minix-tar format. KS 22/9/89 * Changed to handle BSD4.3 tar format. KS 22/9/89 * Conform to current umask if not super-user. KS 22/9/89 * Update usage message to show f option KS 22/9/89 * * * 1) tar will back itself up, should check archive inode num(&dev) and then check the target inode number. In verbose mode, issue warning, in all cases ignore target. marks@mgse Mon Sep 25 10:38:58 CDT 1989 added global varaibles, made changes to main() and add_file(); maks@mgse Mon Sep 25 12:09:20 CDT 1989 2) tar will not notice that a file has changed size while it was being backed up. should issue warning. marks@mgse Mon Sep 25 10:38:58 CDT 1989 3) the 'f' option was not documented in usage[]. marks@mgse Mon Sep 25 12:03:20 CDT 1989 changed both usage[] defines. Why are there two (one is commented out)? ( deleted by me (was done twice) -- KS, 2/10/89 ) * * changed stat on tar_fd to an fstat KS 2/10/89 * deleted mkfifo() code -- belongs in libc.a KS 2/10/89 * made ar_dev default to -1 : an illegal device KS 2/10/89 * made impossible to chown if normal user KS 2/10/89 * if names in owner fields not known use numirical values KS 2/10/89 * creat with mask 666 -- use umask if to liberal KS 2/10/89 * allow to make directories as ../directory KS 2/10/89 * allow tmagic field to end with a space (instead of \0) KS 2/10/89 * correct usage of tmagic field KS 3/10/89 * made mkdir() to return a value if directory == "." KS 3/10/89 * made lint complains less (On a BSD 4.3 system) KS 3/10/89 * use of directory(3) routines KS 3/10/89 * deleted use of d_namlen selector of struct dirent KS 18/10/89 * support mknod4(2) EC 7/7/90 * forget inodes when link count expires EC 6/4/91 * don't remember directories *twice*! * added 'p' flag to ignore umask for normal user KJB 6/10/92 * mknod4(2) out KJB 30/10/94 * added 'D' flag to not recurse into directories KJB 19/12/94 * status output to stdout unless 'tar cvf -' KJB 3/5/97 * * Bugs: * verbose mode is not reporting consistent * code needs cleanup * prefix field is not used * timestamp of a directory will not be correct if there are files to be * unpacked in the directory * (add you favorite bug here (or two (or three (or ...)))) */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pwd.h> #include <grp.h> #include <tar.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <utime.h> #include <sys/wait.h> #include <stdio.h> /* need NULL */ #include <errno.h> #define POSIX_COMP /* POSIX compatible */ #define DIRECT_3 /* use directory(3) routines */ #ifdef DIRECT_3 #ifndef BSD /* To all minix users: i am sorry, developed this piece of code on a * BSD system. KS 18/10/89 */ #include <dirent.h> #define direct dirent /* stupid BSD non-POSIX compatible name! */ #else /* BSD */ #include <sys/dir.h> #include <dir.h> #endif /* BSD */ #endif /* DIRECT_3 */ #ifdef S_IFIFO #define HAVE_FIFO /* have incorporated Simon Pooles' changes */ #endif #ifdef S_IFLNK #define HAVE_SYMLINK #endif typedef char BOOL; #define TRUE 1 #define FALSE 0 #define STRING_SIZE 256 /* string buffer size */ #define HEADER_SIZE TBLOCK #define NAME_SIZE NAMSIZ /* #define BLOCK_BOUNDARY 20 -- not in POSIX ! */ typedef union hblock HEADER; /* Make the MINIX member names overlap to the POSIX names */ #define m_name name #define m_mode mode #define m_uid uid #define m_gid gid #define m_size size #define m_time mtime #define m_checksum chksum #define m_linked typeflag #define m_link linkname #define hdr_block dummy #define m header #define member dbuf #if 0 /* original structure -- see tar.h for new * structure */ typedef union { char hdr_block[HEADER_SIZE]; struct m { char m_name[NAME_SIZE]; char m_mode[8]; char m_uid[8]; char m_gid[8]; char m_size[12]; char m_time[12]; char m_checksum[8]; char m_linked; char m_link[NAME_SIZE]; } member; } HEADER; #endif /* Structure used to note links */ struct link { ino_t ino; dev_t dev; nlink_t nlink; struct link *next; char name[1]; } *link_top = NULL; HEADER header; #define INT_TYPE (sizeof(header.member.m_uid)) #define LONG_TYPE (sizeof(header.member.m_size)) #define NIL_HEADER ((HEADER *) 0) #define NIL_PTR ((char *) 0) #define TBLOCK_SIZE TBLOCK #define flush() print(NIL_PTR) BOOL show_fl, creat_fl, ext_fl; int tar_fd; /* Char usage[] = "Usage: tar [cxt] tarfile [files]."; */ char usage[] = "Usage: tar [cxt][vo][F][f] tarfile [files]."; char io_buffer[TBLOCK_SIZE]; char path[NAME_SIZE]; char pathname[NAME_SIZE]; int force_flag = 0; #ifdef ORIGINAL_DEFAULTS int chown_flag = 1; int verbose_flag = 1; #else int chown_flag = 0; int verbose_flag = 0; #endif int norec_flag = 0; /* Make sure we don't tar ourselves. marks@mgse Mon Sep 25 12:06:28 CDT 1989 */ ino_t ar_inode; /* archive inode number */ dev_t ar_dev; /* archive device number */ int total_blocks; int u_mask; /* one's complement of current umask */ #define block_size() (int) ((convert(header.member.m_size, LONG_TYPE) \ + (long) TBLOCK_SIZE - 1) / (long) TBLOCK_SIZE) _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void error, (char *s1, char *s2)); _PROTOTYPE(BOOL get_header, (void)); _PROTOTYPE(void tarfile, (void)); _PROTOTYPE(void skip_entry, (void)); _PROTOTYPE(void extract, (char *file)); _PROTOTYPE(void delete, (char *file)); _PROTOTYPE(void do_chown, (char *file)); _PROTOTYPE(void timestamp, (char *file)); _PROTOTYPE(void copy, (char *file, int from, int to, long bytes)); _PROTOTYPE(long convert, (char str[], int type)); _PROTOTYPE(int checksum, (void)); _PROTOTYPE(int is_dir, (char *file)); _PROTOTYPE(char *path_name, (char *file)); _PROTOTYPE(void add_path, (char *name)); _PROTOTYPE(void add_file, (char *file)); _PROTOTYPE(void verb_print, (char *s1, char *s2)); _PROTOTYPE(void add_close, (int fd)); _PROTOTYPE(int add_open, (char *file, struct stat * st)); _PROTOTYPE(void make_header, (char *file, struct stat * st)); _PROTOTYPE(void is_added, (struct stat * st, char *file)); _PROTOTYPE(void is_deleted, (struct stat * st)); _PROTOTYPE(char *is_linked, (struct stat * st)); _PROTOTYPE(void clear_header, (void)); _PROTOTYPE(void adjust_boundary, (void)); _PROTOTYPE(void mread, (int fd, char *address, int bytes)); _PROTOTYPE(void mwrite, (int fd, char *address, int bytes)); _PROTOTYPE(int bread, (int fd, char *address, int bytes)); _PROTOTYPE(int bwrite, (int fd, char *address, int bytes)); _PROTOTYPE(void print, (char *str)); _PROTOTYPE(char *num_out, (long number)); _PROTOTYPE(void string_print, (char *buffer, char *fmt,...)); void error(s1, s2) char *s1, *s2; { string_print(NIL_PTR, "%s %s\n", s1, s2 ? s2 : ""); flush(); exit(1); } int main(argc, argv) int argc; register char *argv[]; { register char *mem_name; register char *ptr; struct stat st; int i; if (argc < 3) error(usage, NIL_PTR); for (ptr = argv[1]; *ptr; ptr++) { switch (*ptr) { case 'c': creat_fl = TRUE; break; case 'x': ext_fl = TRUE; break; case 't': show_fl = TRUE; break; case 'v': /* verbose output -Dal */ verbose_flag = !verbose_flag; break; case 'o': /* chown/chgrp files -Dal */ chown_flag = TRUE; break; case 'F': /* IGNORE ERRORS -Dal */ force_flag = TRUE; break; case 'f': /* standard U*IX usage -KS */ break; case 'p': /* restore file modes right, ignore umask. */ (void) umask(0); break; case 'D': /* do not recursively add directories. */ norec_flag = TRUE; break; default: error(usage, NIL_PTR); } } if (creat_fl + ext_fl + show_fl != 1) error(usage, NIL_PTR); if (strcmp(argv[2], "-") == 0)/* only - means stdin/stdout - KS */ tar_fd = creat_fl ? 1 : 0; /* '-' means used * stdin/stdout -Dal */ else tar_fd = 6R��8R��9R��:R��;R��<R��=R��>R��?R��@R��AR��BR��CR��DR��ER��FR��GR��HR��IR��JR��KR������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������creat_fl ? creat(argv[2], 0666) : open(argv[2], O_RDONLY); if (tar_fd < 0) error("Cannot open ", argv[2]); if (geteuid()) { /* check if super-user */ int save_umask; save_umask = umask(0); u_mask = ~save_umask; umask(save_umask); chown_flag = TRUE; /* normal user can't chown */ } else u_mask = ~0; /* don't restrict if 'privileged utility' */ ar_dev = -1; /* impossible device nr */ if (creat_fl) { if (tar_fd > 1 && fstat(tar_fd, &st) < 0) error("Can't stat ", argv[2]); /* will never be here, * right? */ else { /* get archive inode & device */ ar_inode = st.st_ino; /* save files inode */ ar_dev = st.st_dev; /* save files device */ } /* marks@mgse Mon Sep 25 11:30:45 CDT 1989 */ for (i = 3; i < argc; i++) { add_file(argv[i]); path[0] = '\0'; } adjust_boundary(); } else if (ext_fl) { /* Extraction code moved here from tarfile() MSP */ while (get_header()) { mem_name = header.member.m_name; if (is_dir(mem_name)) { for (ptr = mem_name; *ptr; ptr++); *(ptr - 1) = '\0'; header.dbuf.typeflag = '5'; } for (i = 3; i < argc; i++) if (!strncmp(argv[i], mem_name, strlen(argv[i]))) break; if (argc == 3 || (i < argc)) { extract(mem_name); } else if (header.dbuf.typeflag == '0' || header.dbuf.typeflag == 0 || header.dbuf.typeflag == ' ') skip_entry(); flush(); } } else tarfile(); /* tarfile() justs prints info. now MSP */ flush(); return(0); } BOOL get_header() { register int check; mread(tar_fd, (char *) &header, sizeof(header)); if (header.member.m_name[0] == '\0') return FALSE; if (force_flag) /* skip checksum verification -Dal */ return TRUE; check = (int) convert(header.member.m_checksum, INT_TYPE); if (check != checksum()) error("Tar: header checksum error.", NIL_PTR); return TRUE; } /* Tarfile() just lists info about archive now; as of the t flag. */ /* Extraction has been moved into main() as that needs access to argv[] */ void tarfile() { register char *mem_name; while (get_header()) { mem_name = header.member.m_name; string_print(NIL_PTR, "%s%s", mem_name, (verbose_flag ? " " : "\n")); switch (header.dbuf.typeflag) { case '1': verb_print("linked to", header.dbuf.linkname); break; case '2': verb_print("symbolic link to", header.dbuf.linkname); break; case '6': verb_print("", "fifo"); break; case '3': case '4': if (verbose_flag) { char sizebuf[TSIZLEN + 1]; strncpy(sizebuf, header.dbuf.size, (size_t) TSIZLEN); sizebuf[TSIZLEN] = 0; string_print(NIL_PTR, "%s special file major %s minor %s\n", (header.dbuf.typeflag == '3' ? "character" : "block"), header.dbuf.devmajor, header.dbuf.devminor, sizebuf); } break; case '0': /* official POSIX */ case 0: /* also mentioned in POSIX */ case ' ': /* ofetn used */ if (!is_dir(mem_name)) { if (verbose_flag) string_print(NIL_PTR, "%d tape blocks\n", block_size()); skip_entry(); break; } else /* FALL TROUGH */ case '5': verb_print("", "directory"); break; default: string_print(NIL_PTR, "not recogised item %d\n", header.dbuf.typeflag); } flush(); } } void skip_entry() { register int blocks = block_size(); while (blocks--) (void) bread(tar_fd, io_buffer, TBLOCK_SIZE); } void extract(file) register char *file; { register int fd, r; char *pd1, *pd2; /* walk thru failed directory path */ switch (header.dbuf.typeflag) { case '1': /* Link */ delete(file); if (link(header.member.m_link, file) < 0) string_print(NIL_PTR, "Cannot link %s to %s: %s\n", header.member.m_link, file, strerror(errno)); else if (verbose_flag) string_print(NIL_PTR, "Linked %s to %s\n", header.member.m_link, file); return; case '5': /* directory */ if (!(file[0] == '.' && file[1] == '\0')) delete(file); if ((file[0] == '.' && file[1] == '\0') || mkdir(file, 0700) == 0) { do_chown(file); verb_print("created directory", file); } else { string_print(NIL_PTR, "Can't make directory %s: %s\n", file, strerror(errno)); } return; case '3': /* character special */ case '4': /* block special */ { int dmajor, dminor, mode; dmajor = (int) convert(header.dbuf.devmajor, INT_TYPE); dminor = (int) convert(header.dbuf.devminor, INT_TYPE); mode = (header.dbuf.typeflag == '3' ? S_IFCHR : S_IFBLK); delete(file); if (mknod(file, mode, (dmajor << 8 | dminor)) == 0) { if (verbose_flag) string_print(NIL_PTR, "made %s special file major %s minor %s\n", (header.dbuf.typeflag == '3' ? "character" : "block"), header.dbuf.devmajor, header.dbuf.devminor); do_chown(file); } else { string_print(NIL_PTR, "cannot make %s special file major %s minor %s: %s\n", (header.dbuf.typeflag == '3' ? "character" : "block"), header.dbuf.devmajor, header.dbuf.devminor, strerror(errno)); } return; } case '2': /* symbolic link */ #ifdef HAVE_SYMLINK delete(file); if (symlink(header.member.m_link, file) < 0) string_print(NIL_PTR, "Cannot make symbolic link %s to %s: %s\n", header.member.m_link, file, strerror(errno)); else if (verbose_flag) string_print(NIL_PTR, "Symbolic link %s to %s\n", header.member.m_link, file); return; #endif case '7': /* contiguous file -- what is this (KS) */ print("Not implemented file type\n"); return; /* not implemented, but break out */ #ifdef HAVE_FIFO case '6': /* fifo */ delete(file); if (mkfifo(file, 0) == 0) { /* is chmod'ed in do_chown */ do_chown(file); verb_print("made fifo", file); } else string_print(NIL_PTR, "Can't make fifo %s: %s\n", file, strerror(errno)); return; #endif } /* Create regular file. If failure, try to make missing directories. */ if ((fd = creat(file, 0600)) < 0) { pd1 = file; while ((pd2 = index(pd1, '/')) > (char *) 0) { *pd2 = '\0'; if (access(file, 1) < 0) if (mkdir(file, 0777) < 0) { string_print(NIL_PTR, "Cannot mkdir %s: %s\n", file, strerror(errno)); return; } else string_print(NIL_PTR, "Made directory %s\n", file); *pd2 = '/'; pd1 = ++pd2; } if ((fd = creat(file, 0600)) < 0) { string_print(NIL_PTR, "Cannot create %s: %s\n", file, strerror(errno)); return; } } copy(file, tar_fd, fd, convert(header.member.m_size, LONG_TYPE)); (void) close(fd); do_chown(file); } void delete(file) char *file; { /* remove a file or an empty directory */ struct stat stbuf; if (stat(file, &stbuf) < 0) return; if (S_ISDIR(stbuf.st_mode)) (void) rmdir(file); else (void) unlink(file); /* leave error reporting to the create following soon. */ } void do_chown(file) char *file; { int uid = -1, gid = -1; /* these are illegal ??? -- KS */ if (!chown_flag) { /* set correct owner and group -Dal */ if (header.dbuf.magic[TMAGLEN] == ' ') header.dbuf.magic[TMAGLEN] = '\0'; /* some tars out there * ... */ if (strncmp(TMAGIC, header.dbuf.magic, (size_t) TMAGLEN)) { struct passwd *pwd; struct group *grp; pwd = getpwnam(header.dbuf.uname); if (pwd != NULL) uid = pwd->pw_uid; grp = getgrnam(header.dbuf.gname); if (grp != NULL) gid = grp->gr_gid; } if (uid == -1) uid = (int) convert(header.member.m_uid, INT_TYPE); if (gid == -1) gid = (int) convert(header.member.m_gid, INT_TYPE); chown(file, uid, gid); } chmod(file, u_mask & (int) convert(header.member.m_mode, INT_TYPE)); /* Should there be a timestamp if the chown failes? -- KS */ timestamp(file); } void timestamp(file) char *file; { struct utimbuf buf; buf.modtime = buf.actime = convert(header.dbuf.mtime, LONG_TYPE); utime(file, &buf); } void copy(file, from, to, bytes) char *file; int from, to; register long bytes; { register int rest; int blocks = (int) ((bytes + (long) TBLOCK_SIZE - 1) / (long) TBLOCK_SIZE); if (verbose_flag) string_print(NIL_PTR, "%s, %d tape blocks\n", file, blocks); while (blocks--) { (void) bread(from, io_buffer, TBLOCK_SIZE); rest = (bytes > (long) TBLOCK_SIZE) ? TBLOCK_SIZE : (int) bytes; mwrite(to, io_buffer, (to == tar_fd) ? TBLOCK_SIZE : rest); bytes -= (long) rest; } } long convert(str, type) char str[]; int type; { register long ac = 0L; register int i; for (i = 0; i < type; i++) { if (str[i] >= '0' && str[i] <= '7') { ac <<= 3; ac += (long) (str[i] - '0'); } } return ac; } int checksum() { register char *ptr = header.member.m_checksum; register int ac = 0; while (ptr < &header.member.m_checksum[INT_TYPE]) *ptr++ = ' '; ptr = header.hdr_block; while (ptr < &header.hdr_block[TBLOCK_SIZE]) ac += *ptr++; return ac; } int is_dir(file) register char *file; { while (*file++ != '\0'); return(*(file - 2) == '/'); } char *path_name(file) register char *file; { string_print(pathname, "%s%s", path, file); return pathname; } void add_path(name) register char *name; { register char *path_ptr = path; while (*path_ptr) path_ptr++; if (name == NIL_PTR) { while (*path_ptr-- != '/'); while (*path_ptr != '/' && path_ptr != path) path_ptr--; if (*path_ptr == '/') path_ptr++; *path_ptr = '\0'; } else { while (*name) { if (path_ptr == &path[NAME_SIZE]) error("Pathname too long", NIL_PTR); *path_ptr++ = *name++; } *path_ptr++ = '/'; *path_ptr = '\0'; } } /* * add a file to the archive */ void add_file(file) register char *file; { struct stat st; char *linkname; register int fd = -1; char namebuf[16]; /* -Dal */ char cwd[129]; /* -KS */ #ifdef HAVE_SYMLINK if (lstat(file, &st) < 0) { #else if (stat(file, &st) < 0) { #endif string_print(NIL_PTR, "%s: %s\n", file, strerror(errno)); return; } if (st.st_dev == ar_dev && st.st_ino == ar_inode) { string_print(NIL_PTR, "Cannot tar current archive file (%s)\n", file); return; } /* marks@mgse Mon Sep 25 12:06:28 CDT 1989 */ if ((fd = add_open(file, &st)) < 0) { string_print(NIL_PTR, "Cannot open %s\n", file); return; } make_header(path_name(file), &st); if ((linkname = is_linked(&st)) != NULL) { strncpy(header.dbuf.linkname, linkname, (size_t) NAMSIZ); header.dbuf.typeflag = '1'; if (verbose_flag) string_print(NIL_PTR, "linked %s to %s\n", header.dbuf.linkname, file); string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); } else { is_added(&st, file); switch (st.st_mode & S_IFMT) { case S_IFREG: header.dbuf.typeflag = '0'; string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); copy(path_name(file), fd, tar_fd, (long) st.st_size); break; case S_IFDIR: header.dbuf.typeflag = '5'; string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); verb_print("read directory", file); if (norec_flag) break; if (NULL == getcwd(cwd, (int) sizeof cwd)) string_print(NIL_PTR, "Error: cannot getcwd()\n"); else if (chdir(file) < 0) string_print(NIL_PTR, "Cannot chdir to %s: %s\n", file, strerror(errno)); else { add_path(file); #ifdef DIRECT_3 { DIR *dirp; struct direct *dp; struct stat dst; add_close(fd); fd= 0; dirp = opendir("."); while (NULL != (dp = readdir(dirp))) if (strcmp(dp->d_name, ".") == 0) is_linked(&st); else if (strcmp(dp->d_name, "..") == 0) { if (stat("..", &dst) == 0) is_linked(&dst); } else { strcpy(namebuf, dp->d_name); add_file(namebuf); } closedir(dirp); } #else { int i; struct direct dir; struct stat dst; for (i = 0; i < 2; i++) { /* . and .. */ mread(fd, &dir, sizeof(dir)); if (strcmp(dir.d_name, ".") == 0) is_linked(&st); else if (strcmp(dir.d_name, "..") == 0) { if (stat("..", &dst) == 0) is_linked(&dst); } else break; } while (bread(fd, &dir, sizeof(dir)) == sizeof(dir)) if (dir.d_ino) { strncpy(namebuf, dir.d_name, (size_t) DIRSIZ); namebuf[DIRSIZ] = '\0'; add_file(namebuf); } } #endif chdir(cwd); add_path(NIL_PTR); *file = 0; } break; #ifdef HAVE_SYMLINK case S_IFLNK: { int i; header.dbuf.typeflag = '2'; verb_print("read symlink", file); i = readlink(file, header.dbuf.linkname, sizeof(header.dbuf.linkname) - 1); if (i < 0) { string_print(NIL_PTR, "Cannot read symbolic link %s: %s\n", file, strerror(errno)); return; } header.dbuf.linkname[i] = 0; string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); break; } #endif #ifdef HAVE_FIFO case S_IFIFO: header.dbuf.typeflag = '6'; verb_print("read fifo", file); string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); break; #endif case S_IFBLK: header.dbuf.typeflag = '4'; if (verbose_flag) { char sizebuf[TSIZLEN + 1]; strncpy(sizebuf, header.dbuf.size, (size_t) TSIZLEN); sizebuf[TSIZLEN] = 0; string_print(NIL_PTR, "read block device %s major %s minor %s\n", file, header.dbuf.devmajor, header.dbuf.devminor, sizebuf); } string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); break; case S_IFCHR: header.dbuf.typeflag = '3'; if (verbose_flag) string_print(NIL_PTR, "read character device %s major %s minor %s\n", file, header.dbuf.devmajor, header.dbuf.devminor); string_print(header.member.m_checksum, "%I ", checksum()); mwrite(tar_fd, (char *) &header, sizeof(header)); break; default: is_deleted(&st); string_print(NIL_PTR, "Tar: %s unknown file type. Not added.\n", file); *file = 0; } } flush(); add_close(fd); } void verb_print(s1, s2) char *s1, *s2; { if (verbose_flag) string_print(NIL_PTR, "%s: %s\n", s1, s2); } void add_close(fd) int fd; { if (fd != 0) close(fd); } /* * open file 'file' to be added to archive, return file descriptor */ int add_open(file, st) char *file; struct stat *st; { int fd; if (((st->st_mode & S_IFMT) != S_IFREG) && ((st->st_mode & S_IFMT) != S_IFDIR)) return 0; fd = open(file, O_RDONLY); if (fd == -1) fprintf(stderr, "open failed: %s\n", strerror(errno)); return fd; } void make_header(file, st) char *file; register struct stat *st; { register char *ptr = header.member.m_name; struct passwd *pwd; struct group *grp; clear_header(); while (*ptr++ = *file++); if ((st->st_mode & S_IFMT) == S_IFDIR) { /* fixed test -Dal */ *(ptr - 1) = '/'; } string_print(header.member.m_mode, "%I ", st->st_mode & 07777); string_print(header.member.m_uid, "%I ", st->st_uid); string_print(header.member.m_gid, "%I ", st->st_gid); if ((st->st_mode & S_IFMT) == S_IFREG) string_print(header.member.m_size, "%L ", st->st_size); else strncpy(header.dbuf.size, "0", (size_t) TSIZLEN); string_print(header.member.m_time, "%L ", st->st_mtime); strncpy(header.dbuf.magic, TMAGIC, (size_t) TMAGLEN); header.dbuf.version[0] = 0; header.dbuf.version[1] = 0; pwd = getpwuid(st->st_uid); strncpy(header.dbuf.uname, (pwd != NULL ? pwd->pw_name : "nobody"), TUNMLEN); grp = getgrgid(st->st_gid); strncpy(header.dbuf.gname, (grp != NULL ? grp->gr_name : "nobody"), TGNMLEN); if (st->st_mode & (S_IFBLK | S_IFCHR)) { string_print(header.dbuf.devmajor, "%I ", (st->st_rdev >> 8)); string_print(header.dbuf.devminor, "%I ", (st->st_rdev & 0xFF)); } header.dbuf.prefix[0] = 0; } void is_added(st, file) struct stat *st; char *file; { struct link *new; char *name; if ((*file == 0) || (st->st_nlink == 1)) return; name = path_name(file); new = (struct link *) malloc(sizeof(struct link) + strlen(name)); if (new == NULL) { print("Out of memory\n"); return; } new->next = link_top; new->dev = st->st_dev; new->ino = st->st_ino; new->nlink = st->st_nlink - 1; strcpy(new->name, name); link_top = new; } void is_deleted(st) struct stat *st; { struct link *old; if ((old = link_top) != NULL) { link_top = old->next; free(old); } } char *is_linked(st) struct stat *st; { struct link *cur = link_top; struct link **pre = &link_top; static char name[NAMSIZ]; while (cur != NULL) if ((cur->dev != st->st_dev) || (cur->ino != st->st_ino)) { pre = &cur->next; cur = cur->next; } else { if (--cur->nlink == 0) { *pre = cur->next; strncpy(name, cur->name, NAMSIZ); return name; } return cur->name; } return NULL; } void clear_header() { register char *ptr = header.hdr_block; while (ptr < &header.hdr_block[TBLOCK_SIZE]) *ptr++ = '\0'; } void adjust_boundary() { clear_header(); mwrite(tar_fd, (char *) &header, sizeof(header)); #ifndef POSIX_COMP while (total_blocks++ < BLOCK_BOUNDARY) mwrite(tar_fd, (char *) &header, sizeof(header)); #else mwrite(tar_fd, (char *) &header, sizeof(header)); #endif (void) close(tar_fd); } void mread(fd, address, bytes) int fd, bytes; char *address; { if (bread(fd, address, bytes) != bytes) error("Tar: read error.", NIL_PTR); } void mwrite(fd, address, bytes) int fd, bytes; char *address; { if (bwrite(fd, address, bytes) != bytes) error("Tar: write error.", NIL_PTR); total_blocks++; } int bread(fd, address, bytes) int fd, bytes; char *address; { int n = 0, r; while (n < bytes) { if ((r = read(fd, address + n, bytes - n)) <= 0) { if (r < 0) return r; break; } n += r; } return n; } int bwrite(fd, address, bytes) int fd, bytes; char *address; { int n = 0, r; while (n < bytes) { if ((r = write(fd, address + n, bytes - n)) <= 0) { if (r < 0) return r; break; } n += r; } return n; } char output[TBLOCK_SIZE]; void print(str) register char *str; { int fd = (tar_fd == 1 ? 2 : 1); static int indx = 0; if (str == NIL_PTR) { write(fd, output, indx); indx = 0; return; } while (*str) { output[indx++] = *str++; if (indx == TBLOCK_SIZE) { write(fd, output, TBLOCK_SIZE); indx = 0; } } } char *num_out(number) register long number; { static char num_buf[12]; register int i; for (i = 11; i--;) { num_buf[i] = (number & 07) + '0'; number >>= 3; } return num_buf; } /*VARARGS2*/ #if __STDC__ void string_print(char *buffer, char *fmt,...) #else void string_print(buffer, fmt) char *buffer; char *fmt; #endif { va_list args; register char *buf_ptr; char *scan_ptr; char buf[STRING_SIZE]; BOOL pr_fl, i; if (pr_fl = (buffer == NIL_PTR)) buffer = buf; va_start(args, fmt); buf_ptr = buffer; while (*fmt) { if (*fmt == '%') { fmt++; switch (*fmt++) { case 's': scan_ptr = (char *) (va_arg(args, char *)); break; case 'I': scan_ptr = num_out((long) (va_arg(args, int))); for (i = 0; i < 5; i++) scan_ptr++; break; case 'L': scan_ptr = num_out((long) va_arg(args, long)); break; case 'd': scan_ptr = num_out((long) va_arg(args, int)); while (*scan_ptr == '0') scan_ptr++; scan_ptr--; break; default: scan_ptr = ""; } while (*buf_ptr++ = *scan_ptr++); buf_ptr--; } else *buf_ptr++ = *fmt++; } *buf_ptr = '\0'; if (pr_fl) print(buffer); va_end(args); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tcpd.c */ #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <minix/config.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/hton.h> /* This program can be compiled to be paranoid, i.e. check incoming connection * according to an access file, or to trust anyone. The much smaller "trust * 'em" binary will call the paranoid version if the access file exists. */ static char *arg0, *service; static unsigned nchildren; static void report(const char *label) { int err= errno; fprintf(stderr, "%s %s: %s: %s\n", arg0, service, label, strerror(err)); errno= err; } static void sigchld(int sig) { while (waitpid(0, NULL, WNOHANG) > 0) { if (nchildren > 0) nchildren--; } } static void release(int *fd) { if (*fd != -1) { close(*fd); *fd= -1; } } static void usage(void) { fprintf(stderr, "Usage: %s [-d] [-m maxclients] service program [arg ...]\n", arg0); exit(1); } int main(int argc, char **argv) { tcpport_t port; struct nwio_tcpcl tcplistenopt; struct nwio_tcpconf tcpconf; struct nwio_tcpopt tcpopt; struct servent *servent; int tcp_fd, client_fd, count, r; int pfd[2]; unsigned stall= 0; struct sigaction sa; sigset_t chldmask, chldunmask; char **progv; #if !PARANOID # define debug 0 # define max_children ((unsigned) -1) arg0= argv[0]; /* Switch to the paranoid version of me if there are flags, or if * there is an access file. */ if (argv[1][0] == '-' || access(_PATH_SERVACCES, F_OK) == 0) { execv("/usr/bin/tcpdp", argv); report("tcpdp"); exit(1); } if (argc < 3) usage(); service= argv[1]; progv= argv+2; #else /* PARANOID */ int debug, i; unsigned max_children; arg0= argv[0]; debug= 0; max_children= -1; i= 1; while (i < argc && argv[i][0] == '-') { char *opt= argv[i++] + 1; unsigned long m; char *end; if (*opt == '-' && opt[1] == 0) break; /* -- */ while (*opt != 0) switch (*opt++) { case 'd': debug= 1; break; case 'm': if (*opt == 0) { if (i == argc) usage(); opt= argv[i++]; } m= strtoul(opt, &end, 10); if (m <= 0 || m > UINT_MAX || *end != 0) usage(); max_children= m; opt= ""; break; default: usage(); } } service= argv[i++]; progv= argv+i; if (i >= argc) usage(); #endif /* Let SIGCHLD interrupt whatever I'm doing. */ sigemptyset(&chldmask); sigaddset(&chldmask, SIGCHLD); sigprocmask(SIG_BLOCK, &chldmask, &chldunmask); sigdelset(&chldunmask, SIGCHLD); sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = sigchld; sigaction(SIGCHLD, &sa, NULL); /* Open a socket to the service I'm to serve. */ if ((servent= getservbyname(service, "tcp")) == NULL) { unsigned long p; char *end; p= strtoul(service, &end, 0); if (p <= 0 || p > 0xFFFF || *end != 0) { fprintf(stderr, "%s: %s: Unknown service\n", arg0, service); exit(1); } port= htons((tcpport_t) p); } else { port= servent->s_port; if (debug) { fprintf(stderr, "%s %s: listening to port %u\n", arg0, service, ntohs(port)); } } /* No client yet. */ client_fd= -1; while (1) { if ((tcp_fd= open("/dev/tcp", O_RDWR)) < 0) { report("Can't open /dev/tcp"); if (errno == ENOENT || errno == ENODEV || errno == ENXIO) { exit(1); } goto bad; } tcpconf.nwtc_flags= NWTC_LP_SET | NWTC_UNSET_RA | NWTC_UNSET_RP; tcpconf.nwtc_locport= port; if (ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf) < 0) { report("Can't configure TCP channel"); exit(1); } tcpopt.nwto_flags= NWTO_DEL_RST; if (ioctl(tcp_fd, NWIOSTCPOPT, &tcpopt) < 0) { report("Can't set TCP options"); exit(1); } if (client_fd != -1) { /* We have a client, so start a server for it. */ tcpopt.nwto_flags= 0; (void) ioctl(client_fd, NWIOSTCPOPT, &tcpopt); fflush(NULL); /* Create a pipe to serve as an error indicator. */ if (pipe(pfd) < 0) { report("pipe"); goto bad; } (void) fcntl(pfd[1], F_SETFD, fcntl(pfd[1], F_GETFD) | FD_CLOEXEC); /* Fork and exec. */ switch (fork()) { case -1: report("fork"); close(pfd[0]); close(pfd[1]); goto bad; case 0: close(tcp_fd); close(pfd[0]); #if PARANOID /* Check if access to this service allowed. */ if (!servxcheck(client_fd, argv[1], NULL)) exit(1); #endif dup2(client_fd, 0); dup2(client_fd, 1); close(client_fd); execvp(progv[0], progv); report(progv[0]); write(pfd[1], &errno, sizeof(errno)); exit(1); default: nchildren++; release(&client_fd); close(pfd[1]); r= read(pfd[0], &errno, sizeof(errno)); close(pfd[0]); if (r != 0) goto bad; break; } } while (nchildren >= max_children) { /* Too many clients, wait for one to die off. */ sigsuspend(&chldunmask); } /* Wait for a new connection. */ sigprocmask(SIG_UNBLOCK, &chldmask, NULL); tcplistenopt.nwtcl_flags= 0; while (ioctl(tcp_fd, NWIOTCPLISTEN, &tcplistenopt) < 0) { if (errno != EINTR) { if (errno != EAGAIN || debug) { report("Unable to listen"); } goto bad; } } sigprocmask(SIG_BLOCK, &chldmask, NULL); /* We got a connection. */ client_fd= tcp_fd; tcp_fd= -1; if (debug && ioctl(client_fd, NWIOGTCPCONF, &tcpconf) == 0) { fprintf(stderr, "%s %s: Connection from %s:%u\n", arg0, service, inet_ntoa(tcpconf.nwtc_remaddr), ntohs(tcpconf.nwtc_remport)); } /* All is well, no need to stall. */ stall= 0; continue; bad: /* All is not well, release resources. */ release(&tcp_fd); release(&client_fd); /* Wait a bit if this happens more than once. */ if (stall != 0) { if (debug) { fprintf(stderr, "%s %s: stalling %u second%s\n", arg0, service, stall, stall == 1 ? "" : "s"); } sleep(stall); stall <<= 1; } else { stall= 1; } } } ��������������������������������������������������������������������������������/* tee - pipe fitting Author: Paul Polderman */ #include <sys/types.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <minix/minlib.h> #define MAXFD 18 #define CHUNK_SIZE 4096 int fd[MAXFD]; _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char **argv; { char iflag = 0, aflag = 0; char buf[CHUNK_SIZE]; int i, s, n; argv++; --argc; while (argc > 0 && argv[0][0] == '-') { switch (argv[0][1]) { case 'i': /* Interrupt turned off. */ iflag++; break; case 'a': /* Append to outputfile(s), instead of * overwriting them. */ aflag++; break; default: std_err("Usage: tee [-i] [-a] [files].\n"); exit(1); } argv++; --argc; } fd[0] = 1; /* Always output to stdout. */ for (s = 1; s < MAXFD && argc > 0; --argc, argv++, s++) { if (aflag && (fd[s] = open(*argv, O_RDWR)) >= 0) { lseek(fd[s], 0L, SEEK_END); continue; } else { if ((fd[s] = creat(*argv, 0666)) >= 0) continue; } std_err("Cannot open output file: "); std_err(*argv); std_err("\n"); exit(2); } if (iflag) signal(SIGINT, SIG_IGN); while ((n = read(0, buf, CHUNK_SIZE)) > 0) { for (i = 0; i < s; i++) write(fd[i], buf, n); } for (i = 0; i < s; i++) /* Close all fd's */ close(fd[i]); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* term - terminal simulator Author: Andy Tanenbaum */ /* This program allows the user to turn a MINIX system into a dumb * terminal to communicate with a remote computer through one of the ttys. * It forks into two processes. The parent sits in a tight loop copying * from stdin to the tty. The child sits in a tight loop copying from * the tty to stdout. * * 2 Sept 88 BDE (Bruce D. Evans): Massive changes to make current settings the * default, allow any file as the "tty", support fancy baud rates and remove * references to and dependencies on modems and keyboards, so (e.g.) * a local login on /dev/tty1 can do an external login on /dev/tty2. * * 3 Sept 88 BDE: Split parent again to main process copies from stdin to a * pipe which is copied to the tty. This stops a blocked write to the * tty from hanging the program. * * 11 Oct 88 BDE: Cleaned up baud rates and parity stripping. * * 09 Oct 90 MAT (Michael A. Temari): Fixed bug where terminal isn't reset * if an error occurs. * * Nov 90 BDE: Don't broadcast kill(0, SIGINT) since two or more of these * in a row will kill the parent shell. * * 19 Oct 89 RW (Ralf Wenk): Adapted to MINIX ST 1.1 + RS232 driver. Split * error into error_n and error. Added resetting of the terminal settings * in error. * * 24 Nov 90 RW: Adapted to MINIX ST 1.5.10.2. Forked processes are now * doing an exec to get a better performance. This idea is stolen from * a terminal program written by Felix Croes. * * 01 May 91 RW: Merged the MINIX ST patches with Andys current version. * Most of the 19 Oct 89 patches are deleted because they are already there. * * 10 Mar 96 KJB: Termios adaption, cleanup, command key interface. * * 27 Nov 96 KJB: Add -c flag that binds commands to keys. * * Example usage: * term : baud, bits/char, parity from /dev/tty1 * term 9600 7 even : 9600 baud, 7 bits/char, even parity * term odd 300 7 : 300 baud, 7 bits/char, odd parity * term /dev/tty2 : use /dev/tty2 rather than /dev/tty1 * : Any argument starting with "/" is * : taken as the communication device. * term 8 57600 /dev/tty2 -atdt4441234 : if an argument begins with * : - , the rest of that arg is * : sent to the modem as a * : dial string */ #include <sys/types.h> #include <fcntl.h> #include <termios.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdarg.h> #include <errno.h> #include <sys/wait.h> #include <sys/stat.h> #define CHUNK 1024 /* how much to read at once */ char TERM_LINE[] = "/dev/modem";/* default serial port to use */ /* device lock file */ char lockfile[] = "/usr/spool/locks/LK.iii.jjj.kkk"; char *commdev; /* communications device a.k.a. "modem". */ int commfd; /* open file no. for comm device */ struct termios tccomm; /* terminal parameters for commfd */ struct termios tcstdin; /* terminal parameters for stdin */ struct termios tcsavestdin; /* saved terminal parameters for stdin */ /* Special key to get term's attention. */ #define HOTKEY '\035' /* CTRL-] */ struct param_s { char *pattern; unsigned value; enum { BAD, BITS, PARITY, SPEED } type; } params[] = { { "5", CS5, BITS }, { "6", CS6, BITS }, { "7", CS7, BITS }, { "8", CS8, BITS }, { "even", PARENB, PARITY }, { "odd", PARENB|PARODD, PARITY }, { "50", B50, SPEED }, { "75", B75, SPEED }, { "110", B110, SPEED }, { "134", B134, SPEED }, { "200", B200, SPEED }, { "300", B300, SPEED }, { "600", B600, SPEED }, { "1200", B1200, SPEED }, { "1800", B1800, SPEED }, { "2400", B2400, SPEED }, { "4800", B4800, SPEED }, { "9600", B9600, SPEED }, { "19200", B19200, SPEED }, { "38400", B38400, SPEED }, { "57600", B57600, SPEED }, { "115200", B115200, SPEED }, { "", 0, BAD }, /* BAD type to end list */ }; #define NIL ((char *) NULL) /* tell(fd, ..., NIL) */ _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(int isdialstr, (char *arg)); _PROTOTYPE(void tell, (int fd, ...)); _PROTOTYPE(void reader, (int on)); _PROTOTYPE(void shell, (char *cmd)); _PROTOTYPE(void lock_device, (char *device)); _PROTOTYPE(void fatal, (char *label)); _PROTOTYPE(void setnum, (char *s, int n)); _PROTOTYPE(void set_uart, (int argc, char *argv[], struct termios *tcp)); _PROTOTYPE(void set_raw, (struct termios *tcp)); _PROTOTYPE(void quit, (int code)); int main(argc, argv) int argc; char *argv[]; { int i; unsigned char key; int candial; for (i = 1; i < argc; ++i) { if (argv[i][0] == '/') { if (commdev != NULL) { tell(2, "term: too many communication devices\n", NIL); exit(1); } commdev = argv[i]; } } if (commdev == NULL) commdev = TERM_LINE; /* Save tty attributes of the terminal. */ if (tcgetattr(0, &tcsavestdin) < 0) { tell(2, "term: standard input is not a terminal\n", NIL); exit(1); } lock_device(commdev); commfd = open(commdev, O_RDWR); if (commfd < 0) { tell(2, "term: can't open ", commdev, ": ", strerror(errno), "\n", NIL); quit(1); } /* Compute RAW modes of terminal and modem. */ if (tcgetattr(commfd, &tccomm) < 0) { tell(2, "term: ", commdev, " is not a terminal\n", NIL); quit(1); } signal(SIGINT, quit); signal(SIGTERM, quit); tcstdin = tcsavestdin; set_raw(&tcstdin); set_raw(&tccomm); set_uart(argc, argv, &tccomm); tcsetattr(0, TCSANOW, &tcstdin); tcsetattr(commfd, TCSANOW, &tccomm); /* Start a reader process to copy modem output to the screen. */ reader(1); /* Welcome message. */ tell(1, "Connected to ", commdev, ", command key is CTRL-], type ^]? for help\r\n", NIL); /* Dial. */ candial = 0; for (i = 1; i < argc; ++i) { if (!isdialstr(argv[i])) continue; tell(commfd, argv[i] + 1, "\r", NIL); candial = 1; } /* Main loop of the terminal simulator. */ while (read(0, &key, 1) == 1) { if (key == HOTKEY) { /* Command key typed. */ if (read(0, &key, 1) != 1) continue; switch (key) { default: /* Added command? */ for (i = 1; i < argc; ++i) { char *arg = argv[i]; if (arg[0] == '-' && arg[1] == 'c' && arg[2] == key) { reader(0); tcsetattr(0, TCSANOW, &tcsavestdin); shell(arg+3); tcsetattr(0, TCSANOW, &tcstdin); reader(1); break; } } if (i < argc) break; /* Unrecognized command, print list. */ tell(1, "\r\nTerm commands:\r\n", " ? - this help\r\n", candial ? " d - redial\r\n" : "", " s - subshell (e.g. for file transfer)\r\n", " h - hangup (+++ ATH)\r\n", " b - send a break\r\n", " q - exit term\r\n", NIL); for (i = 1; i < argc; ++i) { char *arg = argv[i]; static char cmd[] = " x - "; if (arg[0] == '-' && arg[1] == 'c' && arg[2] != 0) { cmd[1] = arg[2]; tell(1, cmd, arg+3, "\r\n", NIL); } } tell(1, "^] - send a CTRL-]\r\n\n", NIL); break; case 'd': /* Redial by sending the dial commands again. */ for (i = 1; i < argc; ++i) { if (!isdialstr(argv[i])) continue; tell(commfd, argv[i] + 1, "\r", NIL); } break; case 's': /* Subshell. */ reader(0); tcsetattr(0, TCSANOW, &tcsavestdin); shell(NULL); tcsetattr(0, TCSANOW, &tcstdin); reader(1); break; case 'h': /* Hangup by using the +++ escape and ATH command. */ sleep(2); tell(commfd, "+++", NIL); sleep(2); tell(commfd, "ATH\r", NIL); break; case 'b': /* Send a break. */ tcsendbreak(commfd, 0); break; case 'q': /* Exit term. */ quit(0); case HOTKEY: (void) write(commfd, &key, 1); break; } } else { /* Send keyboard input down the serial line. */ if (write(commfd, &key, 1) != 1) break; } } tell(2, "term: nothing to copy from input to ", commdev, "?\r\n", NIL); quit(1); } int isdialstr(char *arg) { /* True iff arg is the start of a dial string, i.e. "-at...". */ return (arg[0] == '-' && (arg[1] == 'a' || arg[1] == 'A') && (arg[2] == 't' || arg[2] == 'T')); } void tell(int fd, ...) { /* Write strings to file descriptor 'fd'. */ va_list ap; char *s; va_start(ap, fd); while ((s = va_arg(ap, char *)) != NIL) write(fd, s, strlen(s)); va_end(ap); } void reader([R��]R��^R��_R��`R��aR��bR��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������on) int on; { /* Start or end a process that copies from the modem to the screen. */ static pid_t pid; char buf[CHUNK]; ssize_t n, m, r; if (!on) { /* End the reader process (if any). */ if (pid == 0) return; kill(pid, SIGKILL); (void) waitpid(pid, (int *) NULL, 0); pid = 0; return; } /* Start a reader */ pid = fork(); if (pid < 0) { tell(2, "term: fork() failed: ", strerror(errno), "\r\n", NIL); quit(1); } if (pid == 0) { /* Child: Copy from the modem to the screen. */ while ((n = read(commfd, buf, sizeof(buf))) > 0) { m = 0; while (m < n && (r = write(1, buf + m, n - m)) > 0) m += r; } tell(2, "term: nothing to copy from ", commdev, " to output?\r\n", NIL); kill(getppid(), SIGTERM); _exit(1); } /* One reader on the loose. */ } void shell(char *cmd) { /* Invoke a subshell to allow one to run zmodem for instance. Run sh -c 'cmd' * instead if 'cmd' non-null. */ pid_t pid; char *shell, *sh0; _PROTOTYPE(void (*isav), (int)); _PROTOTYPE(void (*qsav), (int)); _PROTOTYPE(void (*tsav), (int)); if (cmd == NULL) { tell(1, "\nExit the shell to return to term, ", commdev, " is open on file descriptor 9.\n", NIL); } if (cmd != NULL || (shell = getenv("SHELL")) == NULL) shell = "/bin/sh"; if ((sh0 = strrchr(shell, '/')) == NULL) sh0 = shell; else sh0++; /* Start a shell */ pid = fork(); if (pid < 0) { tell(2, "term: fork() failed: ", strerror(errno), "\n", NIL); return; } if (pid == 0) { /* Child: Exec the shell. */ setgid(getgid()); setuid(getuid()); if (commfd != 9) { dup2(commfd, 9); close(commfd); } if (cmd == NULL) { execl(shell, sh0, (char *) NULL); } else { execl(shell, sh0, "-c", cmd, (char *) NULL); } tell(2, "term: can't execute ", shell, ": ", strerror(errno), "\n",NIL); _exit(1); } /* Wait for the shell to exit. */ isav = signal(SIGINT, SIG_IGN); qsav = signal(SIGQUIT, SIG_IGN); tsav = signal(SIGTERM, SIG_IGN); (void) waitpid(pid, (int *) 0, 0); (void) signal(SIGINT, isav); (void) signal(SIGQUIT, qsav); (void) signal(SIGTERM, tsav); tell(1, "\n[back to term]\n", NIL); } void lock_device(device) char *device; { /* Lock a device by creating a lock file using SYSV style locking. */ struct stat stbuf; unsigned int pid; int fd; int n; int u; if (stat(device, &stbuf) < 0) fatal(device); if (!S_ISCHR(stbuf.st_mode)) { tell(2, "term: ", device, " is not a character device\n", NIL); exit(1); } /* Compute the lock file name. */ setnum(lockfile + 23, (stbuf.st_dev >> 8) & 0xFF); /* FS major (why?) */ setnum(lockfile + 27, (stbuf.st_rdev >> 8) & 0xFF); /* device major */ setnum(lockfile + 31, (stbuf.st_rdev >> 0) & 0xFF); /* device minor */ /* Try to make a lock file and put my pid in it. */ u = umask(0); for (;;) { if ((fd = open(lockfile, O_RDONLY)) < 0) { /* No lock file, try to lock it myself. */ if (errno != ENOENT) fatal(device); if ((fd = open(lockfile, O_WRONLY|O_CREAT|O_EXCL, 0444)) < 0) { if (errno == EEXIST) continue; fatal(lockfile); } pid = getpid(); n = write(fd, &pid, sizeof(pid)); if (n < 0) { n = errno; (void) unlink(lockfile); errno = n; fatal(lockfile); } close(fd); break; } else { /* Already there, but who owns it? */ n = read(fd, &pid, sizeof(pid)); if (n < 0) fatal(device); close(fd); if (n == sizeof(pid) && !(kill(pid, 0) < 0 && errno == ESRCH)) { /* It is locked by a running process. */ tell(2, "term: ", device, " is in use by another program\n", NIL); if (getpgrp() == getpid()) sleep(3); exit(1); } /* Stale lock. */ tell(1, "Removing stale lock ", lockfile, "\n", NIL); if (unlink(lockfile) < 0 && errno != ENOENT) fatal(lockfile); } } /* Lock achieved, but what if two terms encounters a stale lock at the same * time? */ umask(u); } void fatal(char *label) { tell(2, "term: ", label, ": ", strerror(errno), "\n", NIL); exit(1); } void setnum(char *s, int n) { /* Poke 'n' into string 's' backwards as three decimal digits. */ int i; for (i = 0; i < 3; i++) { *--s = '0' + (n % 10); n /= 10; } } void set_uart(argc, argv, tcp) int argc; char *argv[]; struct termios *tcp; { /* Set up the UART parameters. */ int i; char *arg; struct param_s *param; /* Examine all the parameters and check for validity. */ for (i = 1; i < argc; ++i) { arg = argv[i]; if (arg[0] == '/' || arg[0] == '-') continue; /* Check parameter for legality. */ for (param = ¶ms[0]; param->type != BAD && strcmp(arg, param->pattern) != 0; ++param); switch (param->type) { case BAD: tell(2, "Invalid parameter: ", arg, "\n", NIL); quit(1); break; case BITS: tcp->c_cflag &= ~CSIZE; tcp->c_cflag |= param->value; break; case PARITY: tcp->c_cflag &= PARENB | PARODD; tcp->c_cflag |= param->value; break; case SPEED: cfsetispeed(tcp, (speed_t) param->value); cfsetospeed(tcp, (speed_t) param->value); break; } } } void set_raw(tcp) struct termios *tcp; { /* Set termios attributes for RAW mode. */ tcp->c_iflag &= ~(ICRNL|IGNCR|INLCR|IXON|IXOFF); tcp->c_lflag &= ~(ICANON|IEXTEN|ISIG|ECHO|ECHONL); tcp->c_oflag &= ~(OPOST); tcp->c_cc[VMIN] = 1; tcp->c_cc[VTIME] = 0; } void quit(code) int code; { /* Stop the reader process, reset the terminal, and exit. */ reader(0); tcsetattr(0, TCSANOW, &tcsavestdin); (void) unlink(lockfile); exit(code); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* termcap - print termcap settings Author: Terrence Holm */ #include <stdlib.h> #include <termcap.h> #include <stdio.h> #define TC_BUFFER 1024 /* Size of termcap(3) buffer */ /****************************************************************/ /* */ /* termcap [ type ] */ /* */ /* Prints out all of the termcap capabilities as described */ /* in termcap(4). If "type" is not supplied then $TERM is */ /* used. */ /* */ /****************************************************************/ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Print, (char *comment, char *name)); _PROTOTYPE(void Error, (char *message, char *arg)); int main(argc, argv) int argc; char *argv[]; { char *term; char buffer[ TC_BUFFER ]; /* Check for an argument */ if ( argc > 2 ) Error( "Usage: %s [ type ]\n", argv[0] ); if ( argc == 2 ) term = argv[1]; else term = getenv( "TERM" ); if ( term == NULL ) Error( "termcap: $TERM is not defined\n", "" ); /* Read in the termcap entry */ if ( tgetent( buffer, term ) != 1 ) Error( "termcap: No termcap entry for %s\n", term ); /* Print out the entry's contents */ printf( "TERM = %s\n\n", term ); if ( tgetflag( "am" ) == 1 ) printf( "End of line wraps to next line (am)\n" ); if ( tgetflag( "bs" ) == 1 ) printf( "Ctrl/H performs a backspace (bs)\n" ); printf( "Number of columns (co) = %d\n", tgetnum( "co" ) ); printf( "Number of lines (li) = %d\n", tgetnum( "li" ) ); Print( "Clear to end of line", "ce" ); Print( "Clear to end of screen", "cd" ); Print( "Clear the whole screen", "cl" ); Print( "Start \"stand out\" mode", "so" ); Print( "End \"stand out\" mode", "se" ); Print( "Start underscore mode", "us" ); Print( "End underscore mode", "ue" ); Print( "Start blinking mode", "mb" ); Print( "Start bold mode", "md" ); Print( "Start reverse mode", "mr" ); Print( "Return to normal mode", "me" ); Print( "Scroll backwards", "sr" ); Print( "Cursor motion", "cm" ); Print( "Up one line", "up" ); Print( "Down one line", "do" ); Print( "Left one space", "le" ); Print( "Right one space", "nd" ); Print( "Move to top left corner", "ho" ); Print( "Generated by \"UP\"", "ku" ); Print( "Generated by \"DOWN\"", "kd" ); Print( "Generated by \"LEFT\"", "kl" ); Print( "Generated by \"RIGHT\"", "kr" ); Print( "Generated by \"HOME\"", "kh" ); Print( "Generated by \"END\"", "k0" ); Print( "Generated by \"PGUP\"", "k1" ); Print( "Generated by \"PGDN\"", "k2" ); Print( "Generated by numeric \"+\"", "k3" ); Print( "Generated by numeric \"-\"", "k4" ); Print( "Generated by numeric \"5\"", "k5" ); return( 0 ); } /****************************************************************/ /* */ /* Print( comment, name ) */ /* */ /* If a termcap entry exists for "name", then */ /* print out "comment" and the entry. Control */ /* characters are printed as ^x. */ /* */ /****************************************************************/ void Print( comment, name ) char *comment; char *name; { char entry[ 50 ]; char *p = entry; if ( tgetstr( name, &p ) == NULL ) return; printf( "%-32s (%s) = ", comment, name ); for ( p = entry; *p != '\0'; ++p ) if ( *p < ' ' ) printf( "^%c", *p + '@' ); else if ( *p == '\177' ) printf( "^?" ); else putchar( *p ); putchar( '\n' ); } /****************************************************************/ /* */ /* Error( message, arg ) */ /* */ /* Printf the "message" and abort. */ /* */ /****************************************************************/ void Error( message, arg ) char *message; char *arg; { fprintf( stderr, message, arg ); exit( 1 ); } �������������������������������������������������������������������������������������������������/* tget 1.0 - get termcap values Author: Kees J. Bot * 6 Mar 1994 */ #define nil 0 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termcap.h> void fputchar(int c) { putchar(c); } void usage(void) { fprintf(stderr, "Usage: tget [-flag id] [-num id] [-str id] [-goto col line] [[-echo] string]\n" ); exit(-1); } void main(int argc, char **argv) { char termbuf[1024]; char string[256], *pstr; char *term; int i; int excode= 0; if ((term= getenv("TERM")) == nil) { fprintf(stderr, "tget: $TERM is not set\n"); exit(-1); } if (tgetent(termbuf, term) != 1) { fprintf(stderr, "tget: no termcap entry for '%s'\n", term); exit(-1); } for (i= 1; i < argc; i++) { char *option= argv[i]; char *id; if (option[0] != '-') { fputs(option, stdout); continue; } if (++i == argc) usage(); id= argv[i]; if (strcmp(option, "-flag") == 0) { excode= tgetflag(id) ? 0 : 1; } else if (strcmp(option, "-num") == 0) { int num; if ((num= tgetnum(id)) == -1) { excode= 1; } else { excode= 0; printf("%d", num); } } else if (strcmp(option, "-str") == 0) { char *str; if ((str= tgetstr(id, (pstr= string, &pstr))) == nil) { excode= 1; } else { excode= 0; tputs(str, 0, fputchar); } } else if (strcmp(option, "-goto") == 0) { char *cm; int col, line; col= atoi(id); if (++i == argc) usage(); line= atoi(argv[i]); if ((cm= tgetstr("cm", (pstr= string, &pstr))) == nil) { excode= 1; } else { excode= 0; tputs(tgoto(cm, col, line), 0, fputchar); } } else if (strcmp(option, "-echo") == 0) { fputs(id, stdout); } else { usage(); } } exit(excode); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* time - time a command Authors: Andy Tanenbaum & Michiel Huisjes */ #define NEW 1 #include <sys/types.h> #include <sys/times.h> #include <limits.h> #include <time.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <minix/minlib.h> #include <stdio.h> /* -DNEW prints time to 0.01 sec. */ #ifdef NEW #define HUNDREDTHS 1 #endif char **args; char *name; int digit_seen; char a[] = " . \0"; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void print_time, (clock_t t)); _PROTOTYPE(void twin, (int n, char *p)); _PROTOTYPE(void execute, (void)); int main(argc, argv) int argc; char *argv[]; { struct tms pre_buf, post_buf; int status, pid; #if _VMD_EXT struct timeval start_time, end_time; #else time_t start_time, end_time; #endif clock_t real_time; if (argc == 1) exit(0); args = &argv[1]; name = argv[1]; /* Get real time at start of run. */ #if _VMD_EXT (void) sysutime(UTIME_TIMEOFDAY, &start_time); #else (void) time(&start_time); #endif /* Fork off child. */ if ((pid = fork()) < 0) { std_err("Cannot fork\n"); exit(1); } if (pid == 0) execute(); /* Parent is the time program. Disable interrupts and wait. */ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); do { times(&pre_buf); } while (wait(&status) != pid); #if _VMD_EXT (void) sysutime(UTIME_TIMEOFDAY, &end_time); real_time = (end_time.tv_sec - start_time.tv_sec) * CLOCKS_PER_SEC + (end_time.tv_usec - start_time.tv_usec) * CLOCKS_PER_SEC / 1000000; #else (void) time(&end_time); real_time = (end_time - start_time) * CLOCKS_PER_SEC; #endif if ((status & 0377) != 0) std_err("Command terminated abnormally.\n"); times(&post_buf); /* Print results. -DNEW enables time on one line to 0.01 sec */ #ifndef NEW std_err("real "); print_time(real_time); std_err("\nuser "); print_time(post_buf.tms_cutime - pre_buf.tms_cutime); std_err("\nsys "); print_time(post_buf.tms_cstime - pre_buf.tms_cstime); std_err("\n"); #else print_time(real_time); std_err(" real"); print_time(post_buf.tms_cutime - pre_buf.tms_cutime); std_err(" user"); print_time(post_buf.tms_cstime - pre_buf.tms_cstime); std_err(" sys\n"); #endif return((status & 0377) ? -1 : (status >> 8)); } void print_time(t) register clock_t t; { /* Print the time 't' in hours: minutes: seconds. 't' is in ticks. */ int hours, minutes, seconds, hundredths, i; digit_seen = 0; for (i = 0; i < 8; i++) a[i] = ' '; hours = (int) (t / ((clock_t) 3600 * CLOCKS_PER_SEC)); t -= (clock_t) hours * 3600 * CLOCKS_PER_SEC; minutes = (int) (t / ((clock_t) 60 * CLOCKS_PER_SEC)); t -= (clock_t) minutes * 60 * CLOCKS_PER_SEC; seconds = (int) (t / CLOCKS_PER_SEC); t -= (clock_t) seconds * CLOCKS_PER_SEC; hundredths = (int) (t * 100 / CLOCKS_PER_SEC); if (hours) { twin(hours, &a[0]); a[2] = ':'; } if (minutes || digit_seen) { twin(minutes, &a[3]); a[5] = ':'; } if (seconds || digit_seen) twin(seconds, &a[6]); else a[7] = '0'; a[9] = hundredths / 10 + '0'; #ifdef HUNDREDTHS /* tenths used to be enough */ a[10] = hundredths % 10 + '0'; #endif std_err(a); } void twin(n, p) int n; char *p; { char c1, c2; c1 = (n / 10) + '0'; c2 = (n % 10) + '0'; if (digit_seen == 0 && c1 == '0') c1 = ' '; *p++ = c1; *p++ = c2; if (n > 0) digit_seen = 1; } void execute() { execvp(name, args); std_err("Cannot execute "); std_err(name); std_err("\n"); exit(-1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Touch - change file access and modification times. * * Usage: see end of file * * Conforms to P1003.2 draft 10, sec. 4.62, except that time values * are not checked for validity, but passed on to mktime, so that * 9301990000 will refer to Apr. 9th 1993. As a side effect, leap * seconds are not handled correctly. * * Authors: Original author unknown. Rewritten for POSIX by * Peter Holzer (hp@vmars.tuwien.ac.at). * * $Id: touch.c,v 1.8 1994/03/17 21:39:19 hjp Exp $ * $Log: touch.c,v $ * Revision 1.8 1994/03/17 21:39:19 hjp * fixed bug with 4-digit years * * Revision 1.7 1994/03/15 00:43:27 hjp * Changes from kjb (vmd 1.6.25.1): * fixed exit code * nonstandard flag 0 to make file very old * * Revision 1.6 1994/02/12 17:26:33 hjp * fixed -a and -m flags * * Revision 1.5 1994/02/12 16:04:13 hjp * fixed bug when -t argument was not given * removed debugging code * run through pretty to get Minix layout * * Revision 1.4 1994/02/07 21:23:11 hjp * POSIXified. * */ #define _POSIX_C_SOURCE 2 /* getopt */ #include <assert.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <time.h> #include <fcntl.h> #include <unistd.h> #include <utime.h> #define val2(string) ((string)[0] * 10 + (string)[1] - '0' * 11) #define val4(string) (val2(string) * 100 + val2(string + 2)) typedef enum { OLD, NEW } formatT; char *cmnd; int no_creat = 0; unsigned int to_change = 0; # define ATIME 1 # define MTIME 2 _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(int doit, (char *name, struct utimbuf tvp)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(time_t parsetime, (const char *string, formatT format)); time_t parsetime(string, format) const char *string; formatT format; { struct tm tm; time_t touchtime; size_t l; l = strspn(string, "0123456789"); if (l % 2 == 1) return -1; if (string[l] != '\0' && (string[l] != '.' || format == OLD)) { return -1; } if (format == OLD) { if (l == 10) { /* Last two digits are year */ tm.tm_year = val2(string + 8); if (tm.tm_year <= 68) tm.tm_year += 100; } else if (l == 8) { time(&touchtime); tm = *localtime(&touchtime); } else { return -1; } } else { if (l == 12) { /* First four digits are year */ tm.tm_year = val4(string) - 1900; string += 4; } else if (l == 10) { /* First two digits are year */ tm.tm_year = val2(string); if (tm.tm_year <= 68) tm.tm_year += 100; string += 2; } else if (l == 8) { time(&touchtime); tm = *localtime(&touchtime); } else { return -1; } } tm.tm_mon = val2(string) - 1; string += 2; tm.tm_mday = val2(string); string += 2; tm.tm_hour = val2(string); string += 2; tm.tm_min = val2(string); string += 2; if (format == NEW && string[0] == '.') { if (isdigit(string[1]) && isdigit(string[2]) && string[3] == '\0') { tm.tm_sec = val2(string + 1); } else { return -1; } } else { tm.tm_sec = 0; } tm.tm_isdst = -1; touchtime = mktime(&tm); return touchtime; } int main(argc, argv) int argc; char **argv; { time_t auxtime; struct stat sb; int c; struct utimbuf touchtimes; int fail = 0; cmnd = argv[0]; auxtime = time((time_t *) NULL); touchtimes.modtime = auxtime; touchtimes.actime = auxtime; while ((c = getopt(argc, argv, "r:t:acm0")) != EOF) { switch (c) { case 'r': if (stat(optarg, &sb) == -1) { fprintf(stderr, "%s: cannot stat %s: %s\n", cmnd, optarg, strerror(errno)); exit(1); } touchtimes.modtime = sb.st_mtime; touchtimes.actime = sb.st_atime; break; case 't': auxtime = parsetime(optarg, NEW); if (auxtime == (time_t) - 1) usage(); touchtimes.modtime = auxtime; touchtimes.actime = auxtime; break; case 'a': to_change |= ATIME; break; case 'm': to_change |= MTIME; break; case 'c': no_creat = 1; break; case '0': touchtimes.modtime = touchtimes.actime = 0; break; case '?': usage(); break; default: assert(0); } } if (to_change == 0) { to_change = ATIME | MTIME; } if (optind == argc) usage(); /* Now check for old style time argument */ if (strcmp(argv[optind - 1], "--") != 0 && (auxtime = parsetime(argv[optind], OLD)) != (time_t) - 1) { touchtimes.modtime = auxtime; touchtimes.actime = auxtime; optind++; if (optind == argc) usage(); } while (optind < argc) { if (doit(argv[optind], touchtimes) > 0) { fprintf(stderr, "%s: cannot touch %s: %s\n", cmnd, argv[optind], strerror(errno)); fail = 1; } optind++; } return fail ? 1 : 0; } int doit(name, tvp) char *name; struct utimbuf tvp; { int fd; struct stat sb; if (to_change != (ATIME | MTIME)) { if (stat(name, &sb) != -1) { if (!(to_change & ATIME)) { tvp.actime = sb.st_atime; } else { tvp.modtime = sb.st_mtime; } } } if (utime(name, &tvp) == 0) return 0; if (errno != ENOENT) return 1; if (no_creat == 1) return 0; if ((fd = creat(name, 0666)) >= 0) { if (fstat(fd, &sb) != -1) { if (!(to_change & ATIME)) { tvp.actime = sb.st_atime; } else { tvp.modtime = sb.st_mtime; } } else { assert(0); } close(fd); if (utime(name, &tvp) == 0) return 0; } return 1; } void usage() { fprintf(stderr, "Usage: %s [-c] [-a] [-m] [-r file] [-t [CC[YY]]MMDDhhmm[.ss]] " "[MMDDhhmm[YY]] file...\n", cmnd); exit(1); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tr - translate characters Author: Michiel Huisjes */ /* Usage: tr [-cds] [string1 [string2]] * c: take complement of string1 * d: delete input characters coded string1 * s: squeeze multiple output characters of string2 into one character */ #define BUFFER_SIZE 1024 #define ASCII 0377 typedef char BOOL; #define TRUE 1 #define FALSE 0 #define NIL_PTR ((char *) 0) BOOL com_fl, del_fl, sq_fl; unsigned char output[BUFFER_SIZE], input[BUFFER_SIZE]; unsigned char vector[ASCII + 1]; BOOL invec[ASCII + 1], outvec[ASCII + 1]; short in_index, out_index; #include <sys/types.h> #include <string.h> #include <stdlib.h> #include <unistd.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void convert, (void)); _PROTOTYPE(void map, (unsigned char *string1, unsigned char *string2)); _PROTOTYPE(void expand, (char *arg, unsigned char *buffer)); _PROTOTYPE(void complement, (unsigned char *buffer)); int main(argc, argv) int argc; char *argv[]; { register unsigned char *ptr; int index = 1; short i; if (argc > 1 && argv[index][0] == '-') { for (ptr = (unsigned char *) &argv[index][1]; *ptr; ptr++) { switch (*ptr) { case 'c': com_fl = TRUE; break; case 'd': del_fl = TRUE; break; case 's': sq_fl = TRUE; break; default: write(2,"Usage: tr [-cds] [string1 [string2]].\n", 38); exit(1); } } index++; } for (i = 0; i <= ASCII; i++) { vector[i] = i; invec[i] = outvec[i] = FALSE; } if (argv[index] != NIL_PTR) { expand(argv[index++], input); if (com_fl) complement(input); if (argv[index] != NIL_PTR) expand(argv[index], output); if (argv[index] != NIL_PTR) map(input, output); for (ptr = input; *ptr; ptr++) invec[*ptr] = TRUE; for (ptr = output; *ptr; ptr++) outvec[*ptr] = TRUE; } convert(); return(0); } void convert() { short read_chars = 0; short c, coded; short last = -1; for (;;) { if (in_index == read_chars) { if ((read_chars = read(0, (char *)input, BUFFER_SIZE)) <= 0) { if (write(1, (char *)output, out_index) != out_index) write(2, "Bad write\n", 10); exit(0); } in_index = 0; } c = input[in_index++]; coded = vector[c]; if (del_fl && invec[c]) continue; if (sq_fl && last == coded && outvec[coded]) continue; output[out_index++] = last = coded; if (out_index == BUFFER_SIZE) { if (write(1, (char *)output, out_index) != out_index) { write(2, "Bad write\n", 10); exit(1); } out_index = 0; } } /* NOTREACHED */ } void map(string1, string2) register unsigned char *string1, *string2; { unsigned char last; while (*string1) { if (*string2 == '\0') vector[*string1] = last; else vector[*string1] = last = *string2++; string1++; } } void expand(arg, buffer) register char *arg; register unsigned char *buffer; { int i, ac; while (*arg) { if (*arg == '\\') { arg++; i = ac = 0; if (*arg >= '0' && *arg <= '7') { do { ac = (ac << 3) + *arg++ - '0'; i++; } while (i < 4 && *arg >= '0' && *arg <= '7'); *buffer++ = ac; } else if (*arg != '\0') *buffer++ = *arg++; } else if (*arg == '[') { arg++; i = *arg++; if (*arg++ != '-') { *buffer++ = '['; arg -= 2; continue; } ac = *arg++; while (i <= ac) *buffer++ = i++; arg++; /* Skip ']' */ } else *buffer++ = *arg++; } } void complement(buffer) unsigned char *buffer; { register unsigned char *ptr; register short i, index; unsigned char conv[ASCII + 2]; index = 0; for (i = 1; i <= ASCII; i++) { for (ptr = buffer; *ptr; ptr++) if (*ptr == i) break; if (*ptr == '\0') conv[index++] = i & ASCII; } conv[index] = '\0'; strcpy((char *)buffer, (char *)conv); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* topo - topological sort Author: Kent Williams */ /* ** topo - perform a topological sort of the output of lorder. ** ** Usage : topo [infile] [outfile] ** ** Author: Kent Williams (williams@umaxc.weeg.uiowa.edu) */ #include <ctype.h> #include <stdlib.h> #include <string.h> #include <stdio.h> typedef struct __v { struct __v *next; /* link list node */ int indegree, /* number of edges into this vertex */ visited, /* depth-first search visited flag */ on_the_path, /* used to find cycles */ has_a_cycle; /* true if a cycle at this vertex */ struct __e *out; /* outgoing edges from this vertex */ char key[1]; /* name of this vertex */ } vertex; typedef struct __e { struct __e *next; /* link list node */ vertex *v; /* vertex to which this edge goes */ } edge; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void *xmalloc, (size_t siz)); _PROTOTYPE(edge *new_edge, (vertex *v)); _PROTOTYPE(char *copyupto, (char *name, char *buf, int stop)); _PROTOTYPE(int child_of, (vertex *parent, vertex *child)); _PROTOTYPE(vertex *add_v, (char *s)); _PROTOTYPE(void readin, (void)); _PROTOTYPE(void pushname, (char *s)); _PROTOTYPE(char *popname, (void)); _PROTOTYPE(void topo, (void)); _PROTOTYPE(void print_cycle, (vertex *parent, vertex *child)); _PROTOTYPE(void dfs, (vertex *v)); _PROTOTYPE(void check_cycles, (void)); /* ** xmalloc -- standard do or die malloc front end. */ void * xmalloc(siz) size_t siz; { void *rval = (void *)malloc(siz); if(rval == NULL) { fputs("Out of memory.\n",stderr); exit(1); } return rval; } /* ** edge allocater. */ edge * new_edge(v) vertex *v; { edge *rval; rval = (edge *)xmalloc(sizeof(edge)); rval->v = v; return rval; } /* ** copyupto - copy until you see the stop character. */ char * copyupto(name,buf,stop) char *name,*buf,stop; { while(*buf != '\0' && *buf != stop) *name++ = *buf++; *name = '\0'; while(*buf != '\0' && isspace(*buf)) buf++; return buf; } /* ** find out if the vertex child is a child of the vertex parent. */ int child_of(parent,child) vertex *parent,*child; { edge *e; for(e = parent->out; e != NULL && e->v != child; e = e->next) ; return e == NULL ? 0 : 1; } /* ** the vertex set. ** ** add_v adds a vertex to the set if it's not already there. */ vertex *vset = NULL; vertex * add_v(s) char *s; { vertex *v,*last; /* ** go looking for this key in the vertex set. */ for(last = v = vset; v != NULL && strcmp(v->key,s) != 0; last = v, v = v->next) ; if(v != NULL) { /* ** use the move-to-front heuristic to keep this from being ** an O(N^2) algorithm. */ if(last != vset) { last->next = v->next; v->next = vset; vset = v; } return v; } v = (vertex *)xmalloc(sizeof(vertex) + strlen(s)); v->out = NULL; strcpy(v->key,s); v->indegree = v->on_the_path = v->has_a_cycle = v->visited = 0; v->next = vset; vset = v; return v; } /* ** readin -- read in the dependency pairs. */ void readin() { static char buf[128]; static char name[64]; char *bp; vertex *child,*parent; edge *e; while(fgets(buf,sizeof(buf),stdin) != NULL) { bp = buf + strlen(buf); if (bp > buf && bp[-1] == '\n') *--bp = 0; bp = copyupto(name,buf,' '); child = add_v(name); parent = add_v(bp); if(child != parent && !child_of(parent,child)) { e = new_edge(child); e->next = parent->out; parent->out = e; child->indegree++; } } } /* ** the topological sort produces names of modules in reverse of ** the order we want them in, so use a stack to hold the names ** until we get them all, then pop them off to print them. */ struct name { struct name *next; char *s; } *namelist = NULL; void pushname(s) char *s; { struct name *x = (struct name *)xmalloc(sizeof(struct name)); x->s = s; x->next = namelist; namelist = x; } char * popname() { char *rval; struct name *tmp; if(namelist == NULL) return NULL; tmp = namelist; rval = namelist->s; namelist = namelist->next; free(tmp); return rval; } /* ** topo - do a topological sort of the dependency graph. */ void topo() { vertex *x = vset,*n; edge *e; vertex *outq = NULL,*tmp; #define insq(x) ((x->next = outq),(outq = x)) #define deq() ((tmp = outq),(outq = outq->next),tmp) /* ** find all vertices that don't depend on any other vertices ** Since it breaks the "next" links to insert x into the queue, ** x->next is saved before insq, to resume the list traversal. */ while (x != NULL) { n = x->next; if(x->indegree == 0) { insq(x); pushname(x->key); } x = n; } /* ** for each vertex V with indegree of zero, ** for each edge E from vertex V ** subtract one from the indegree of the vertex V' ** pointed to by E. If V' now has an indegree of zero, ** add it to the set of vertices with indegree zero, and ** push its name on the output stack. */ while(outq != NULL) { x = deq(); e = x->out; while(e != NULL) { if(--(e->v->indegree) == 0) { insq(e->v); pushname(e->v->key); } e = e->next; } } /* ** print the vertex names in opposite of the order they were ** encountered. */ while(namelist != NULL) puts(popname()); } /* ** print_cycle -- ** A cycle has been detected between parent and child. ** Start with the child, and look at each of its edges for ** the parent. ** ** We know a vertex is on the path from the child to the parent ** because the depth-first search sets on_the_path true for each ** vertex it visits. */ void print_cycle(parent,child) vertex *parent, *child; { char *s; vertex *x; edge *e; for(x = child; x != parent; ) { pushname(x->key); for(e = x->out; e != NULL; e = e->next) { /* ** stop looking for the path at the first node found ** that's on the path. Watch out for cycles already ** detected, because if you follow an edge into a cycle, ** you're stuck in an infinite loop! */ if(e->v->on_the_path && !e->v->has_a_cycle) { x = e->v; break; } } } /* ** print the name of the parent, and then names of each of the ** vertices on the path from the child to the parent. */ fprintf(stderr,"%s\n",x->key); while((s = popname()) != NULL) fprintf(stderr,"%s\n",s); } /* ** depth first search for cycles in the dependency graph. ** See "Introduction to Algorithms" by Udi Manber Addison-Wesley 1989 */ void dfs(v) vertex *v; { edge *e; if(v->visited) /* If you've been here before, don't go again! */ return; v->visited++; v->on_the_path++; /* this node is on the path from the root. */ /* ** depth-first search all outgoing edges. */ for(e = v->out; e != NULL; e = e->next) { if(!e->v->visited) dfs(e->v); if(e->v->on_the_path) { fprintf(stderr,"cycle found between %s and %s\n", v->key,e->v->key); print_cycle(v,e->v); v->has_a_cycle++; } } v->on_the_path = 0; } /* ** check cycles starts the recursive depth-first search from ** each vertex in vset. */ void check_cycles() { vertex *v; for(v = vset; v != NULL; v = v->next) dfs(v); } /* ** main program. */ int main(argc,argv) int argc; char **argv; { if(argc > 1 && freopen(argv[1],"r",stdin) == NULL) { perror(argv[1]); exit(0); } if(argc > 2 && freopen(argv[2],"w",stdout) == NULL) { perror(argv[2]); ~R��R���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� exit(0); } readin(); check_cycles(); topo(); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tic tac toe (noughts and crosses) Author: Warren Toomey */ /* Copyright 1988 by Warren Toomey wkt@cs.adfa.oz.au[@uunet.uu.net] * * You may freely copy or distribute this code as long as this notice * remains intact. * * You may modify this code, as long as this notice remains intact, and * you add another notice indicating that the code has been modified. * * You may NOT sell this code or in any way profit from this code without * prior agreement from the author. */ /* Compile with cc -o tic tic.c -lcurses -ltermcap */ #include <stdlib.h> #include <time.h> #ifdef CURSES #include <curses.h> #endif #include <stdio.h> #ifndef CURSES #define printw printf #endif typedef struct { int value; /* The move returned by the */ int path; /* alphabeta consists of a value */ } MOVE; /* and an actual move (path) */ _PROTOTYPE(int main, (void)); _PROTOTYPE(int stateval, (int board [], int whosemove)); _PROTOTYPE(MOVE alphabeta, (int board [], int whosemove, int alpha, int beta)); _PROTOTYPE(void draw, (int board [])); _PROTOTYPE(void getmove, (int board [])); _PROTOTYPE(int endofgame, (int board [])); _PROTOTYPE(int randommove, (void)); /* Static evaluator. Returns 100 if we have 3 in a row -100 if they have 3 * in a row * * Board is array of 9 ints, where 0=empty square 1=our move 4= their move * * and board is indices 0 1 2 3 4 5 6 7 8 */ int stateval(board, whosemove) int board[]; int whosemove; { static int row[8][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}, /* Indices of 3in-a-rows */ {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, {0, 4, 8}, {2, 4, 6}}; int temp; /* Temp row results */ int i, j; /* Loop counters */ int side; /* Depth multiplier */ int win, lose; if (whosemove == 1) { win = 100; lose = -100; side = 1; } else { /* Multiply by -1 if */ win = -100; lose = 100; side = -1; } /* not out move */ for (i = 0; i < 8; i++) { /* For every 3-in-a-row */ temp = 0; for (j = 0; j < 3; j++) /* Add up the board values */ temp += board[row[i][j]]; if (temp == 3) return(win); /* We've got 3 in a row */ if (temp == 12) return (lose); /* They've got 3 in a row */ } return(0); /* Finally return sum */ } MOVE alphabeta(board, whosemove, alpha, beta) /* Alphabeta: takes a board, */ int board[]; /* whose move, alpha & beta cutoffs, */ int whosemove; /* and returns a move to make and */ int alpha; /* the value that the move has */ int beta; { MOVE result, successor; int best_score, i, best_path, mademove; result.value = stateval(board, whosemove); /* Work out the board's */ /* Static value */ if ((result.value == 100) || /* If a win or loss already */ (result.value == -100)) return(result); /* return the result */ best_score = beta; /* Ok, set worst score */ mademove = 0; /* to the beta cutoff */ for (i = 0; i < 9; i++) { if (board[i] == 0) { /* For all valid moves */ mademove = 1; board[i] = whosemove; /* make the move on board */ successor = alphabeta(board, 5 - whosemove, -best_score - 1, -alpha - 1); /* Get value of the move */ board[i] = 0; /* Take move back */ if (-successor.value > best_score) { /* If a better score */ best_score = -successor.value; /* update our score */ best_path = i; /* and move */ if (best_score > alpha) break; /* If we've beaten alpha */ } /* return immediately */ } } if (mademove) { result.value = best_score; /* Finally return best score */ result.path = best_path;/* and best move */ } return(result); /* If no move, return static result */ } void draw(board) /* Draw the board */ int board[]; { int i, j, row; static char out[] = " X O"; /* Lookup table for character */ row = 6; #ifdef CURSES move(row, 0); #endif for (j = 0; j < 9; j += 3) { printw(" %d | %d | %d ", j, j + 1, j + 2); for (i = 0; i < 3; i++) { printw("%c ", out[board[j + i]]); if (i < 2) printw("| "); } if (j < 4) { #ifdef CURSES move(++row, 0); #else printw("\n"); #endif printw("---+---+--- ---+---+---"); } #ifdef CURSES move(++row, 0); #else printw("\n"); #endif } #ifdef CURSES refresh(); #else printw("\n"); #endif } void getmove(board) /* Get a player's move */ int board[]; { int Move; int ItemsRead; char dumc; do { do { #ifdef CURSES move(9, 40); printw("Your move: "); /* Prompt for move */ refresh(); #else printw("Your move: "); /* Prompt for move */ #endif ItemsRead = scanf("%d", &Move); /* Input the move */ if (ItemsRead == 0) scanf("%c", &dumc); /* Remove the offending character */ } while (ItemsRead != 1); } while (board[Move]); board[Move] = 4; /* If legal, add to board */ draw(board); /* Draw the board */ } int endofgame(board) /* Determine end of the game */ int board[]; { int eval; int count; eval = stateval(board, 1); #ifdef CURSES move(20, 25); #endif if (eval == 100) { printw("I have beaten you.\n"); return(1); } if (eval == -100) { printw("Bus error (core dumped)\n"); return(1); } count = 0; for (eval = 0; eval < 9; eval++) if (board[eval] != 0) count++; if (count == 9) { printw("A draw!\n"); return(1); } #ifdef CURSES refresh(); #endif return(0); } int randommove() { /* Make an initial random move */ int i; i = abs((int) time((long *) 0)); return(i % 9); } int main() { /* The actual game */ int i, board[9]; char ch; MOVE ourmove; for (i = 0; i < 9; i++) board[i] = 0; /* Initialise the board */ #ifdef CURSES initscr(); clear(); refresh(); #endif printw(" TIC TAC TOE \n\n"); printw(" Your moves are 'O'\n"); printw(" My moves are 'X'\n\n"); #ifdef CURSES move(5, 0); printw("Do you wish to move first: "); refresh(); while (scanf("%c", &ch) != 1); move(5, 0); printw(" ......."); /* Kludge to get rid */ refresh(); move(5, 0); printw(" "); /* of input letter */ refresh(); #else do printw("Do you wish to move first: "); while (scanf("%c", &ch) != 1); #endif if ((ch != 'y') && (ch != 'Y')) { i = randommove(); /* If we move first */ board[i] = 1; /* make it random */ #ifdef CURSES move(7, 42); printw("My move: %d\n", i); refresh(); #else printw("My move: %d\n", i); #endif } draw(board); getmove(board); while (1) { ourmove = alphabeta(board, 1, 99, -99); /* Get a move for us; * return wins */ /* Immediately & ignore losses */ board[ourmove.path] = 1;/* and make it */ #ifdef CURSES move(7, 42); printw("My move: %d\n", ourmove.path); refresh(); #else printw("My move: %d\n", ourmove.path); #endif draw(board); if (endofgame(board)) break; /* If end of game, exit */ getmove(board); /* Get opponent's move */ if (endofgame(board)) break; /* If end of game, exit */ } #ifdef CURSES endwin(); #endif return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* tty.c - Return tty name Author: Freeman P. Pascal IV */ /* Minor changes to make tty conform to POSIX1003.2 Draft10 Thomas Brupbacher (tobr@mw.lpc.ethz.ch) */ #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); int main(argc, argv) int argc; char *argv[]; { char *tty_name; tty_name = ttyname(STDIN_FILENO); if ((argc == 2) && (!strcmp(argv[1], "-s"))) /* Do nothing - shhh! we're in silent mode */ ; else puts((tty_name != NULL) ? tty_name : "not a tty"); if (isatty(STDIN_FILENO) == 0) return(1); else return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* umount - unmount a file system Author: Andy Tanenbaum */ #define _MINIX 1 /* for proto of the non-POSIX umount() */ #define _POSIX_SOURCE 1 /* for PATH_MAX from limits.h */ #include <sys/types.h> #include <sys/svrctl.h> #include <fcntl.h> #include <errno.h> #include <limits.h> #include <minix/minlib.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void update_mtab, (char *devname)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void tell, (char *this)); static char mountpoint[PATH_MAX+1]; int main(argc, argv) int argc; char *argv[]; { int sflag = 0; while (argc > 1 && argv[1][0] == '-') { char *opt = argv[1]+1; while (*opt) if (*opt++ == 's') sflag = 1; else usage(); argc--; argv++; } if (argc != 2) usage(); if ((sflag ? svrctl(MMSWAPOFF, NULL) : umount(argv[1])) < 0) { if (errno == EINVAL) std_err("Device not mounted\n"); else perror("umount"); exit(1); } update_mtab(argv[1]); tell(argv[1]); tell(" unmounted"); if (*mountpoint != '\0') { tell(" from "); tell(mountpoint); } tell("\n"); return(0); } void update_mtab(devname) char *devname; { /* Remove an entry from /etc/mtab. */ int n; char special[PATH_MAX+1], mounted_on[PATH_MAX+1], version[10], rw_flag[10]; if (load_mtab("umount") < 0) { std_err("/etc/mtab not updated.\n"); exit(1); } while (1) { n = get_mtab_entry(special, mounted_on, version, rw_flag); if (n < 0) break; if (strcmp(devname, special) == 0) { strcpy(mountpoint, mounted_on); continue; } (void) put_mtab_entry(special, mounted_on, version, rw_flag); } n = rewrite_mtab("umount"); if (n < 0) { std_err("/etc/mtab not updated.\n"); exit(1); } } void usage() { std_err("Usage: umount [-s] special\n"); exit(1); } void tell(this) char *this; { write(1, this, strlen(this)); } �������������������������������������������������������������������������������������������������������������������������������������������������������������/* uname - print system name Author: Earl Chew */ /* Print the following system information as returned by the uname() * function: * * system name Minix * node name waddles * release name 1.5 * version 10 * machine name i86 * arch i86 (Minix specific) */ #include <sys/types.h> #include <sys/utsname.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <unistd.h> /* Define the uname components. */ #define ALL ((unsigned) 0x1F) #define SYSNAME ((unsigned) 0x01) #define NODENAME ((unsigned) 0x02) #define RELEASE ((unsigned) 0x04) #define VERSION ((unsigned) 0x08) #define MACHINE ((unsigned) 0x10) #define ARCH ((unsigned) 0x20) _PROTOTYPE(int main, (int argc, char **argv )); _PROTOTYPE(void print, (int fd, ... )); _PROTOTYPE(void usage, (void )); #ifdef __STDC__ void print(int fd, ...) #else void print(fd) int fd; #endif { /* Print a sequence of strings onto the named channel. */ va_list argp; char *p; va_start(argp, fd); while (1) { p = va_arg(argp, char *); if (p == (char *) NULL) break; write(fd, p, strlen(p)); } va_end(argp); } char *name; void usage() { print(STDERR_FILENO, "Usage: ", name, " -snrvmpa\n", (char *) NULL); exit(EXIT_FAILURE); } int main(argc, argv) int argc; char **argv; { int info; char *p; struct utsname un; name = strrchr(argv[0], '/'); if (name == NULL) name = argv[0]; else name++; for (info = 0; argc > 1; argc--, argv++) { if (argv[1][0] == '-') { for (p = &argv[1][1]; *p; p++) { switch (*p) { case 'a': info |= ALL; break; case 'm': info |= MACHINE; break; case 'n': info |= NODENAME; break; case 'r': info |= RELEASE; break; case 's': info |= SYSNAME; break; case 'v': info |= VERSION; break; case 'p': info |= ARCH; break; default: usage(); } } } else { usage(); } } if (info == 0) info = strcmp(name, "arch") == 0 ? ARCH : SYSNAME; if (uname(&un) != 0) { print(STDERR_FILENO, "unable to determine uname values\n", (char *) NULL); exit(EXIT_FAILURE); } if ((info & SYSNAME) != 0) print(STDOUT_FILENO, un.sysname, (char *) NULL); if ((info & NODENAME) != 0) { if ((info & (SYSNAME)) != 0) print(STDOUT_FILENO, " ", (char *) NULL); print(STDOUT_FILENO, un.nodename, (char *) NULL); } if ((info & RELEASE) != 0) { if ((info & (SYSNAME|NODENAME)) != 0) print(STDOUT_FILENO, " ", (char *) NULL); print(STDOUT_FILENO, un.release, (char *) NULL); } if ((info & VERSION) != 0) { if ((info & (SYSNAME|NODENAME|RELEASE)) != 0) print(STDOUT_FILENO, " ", (char *) NULL); print(STDOUT_FILENO, un.version, (char *) NULL); } if ((info & MACHINE) != 0) { if ((info & (SYSNAME|NODENAME|RELEASE|VERSION)) != 0) print(STDOUT_FILENO, " ", (char *) NULL); print(STDOUT_FILENO, un.machine, (char *) NULL); } if ((info & ARCH) != 0) { if ((info & (SYSNAME|NODENAME|RELEASE|VERSION|MACHINE)) != 0) print(STDOUT_FILENO, " ", (char *) NULL); print(STDOUT_FILENO, un.arch, (char *) NULL); } print(STDOUT_FILENO, "\n", (char *) NULL); return EXIT_SUCCESS; } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* unexpand - convert spaces to tabs Author: Terrence W. Holm */ /* Usage: unexpand [ -a ] [ file ... ] */ #include <stdlib.h> #include <string.h> #include <stdio.h> #define TAB 8 int column = 0; /* Current column, retained between files */ int spaces = 0; /* Spaces since last tab stop */ int leading_blank = 1; /* Only unexpand leading blanks, */ /* Overruled by -a option */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void Unexpand, (FILE *f, int all)); int main(argc, argv) int argc; char *argv[]; { int all = 0; /* -a flag means unexpand all spaces */ int i; FILE *f; if (argc > 1 && argv[1][0] == '-') { if (strcmp(argv[1], "-a") == 0) all = 1; else { fprintf(stderr, "Usage: unexpand [ -a ] [ file ... ]\n"); exit(1); } --argc; ++argv; } if (argc == 1) Unexpand(stdin, all); else for (i = 1; i < argc; ++i) { if ((f = fopen(argv[i], "r")) == NULL) { perror(argv[i]); exit(1); } Unexpand(f, all); fclose(f); } /* If there are pending spaces print them. */ while (spaces > 0) { putchar(' '); --spaces; } return(0); } void Unexpand(f, all) FILE *f; int all; { int c; while ((c = getc(f)) != EOF) { if (c == ' ' && (all || leading_blank)) { ++column; ++spaces; /* If we have white space up to a tab stop, then output */ /* A tab. If only one space is required, use a ' '. */ if (column % TAB == 0) { if (spaces == 1) putchar(' '); else putchar('\t'); spaces = 0; } continue; } /* If a tab character is encountered in the input then */ /* Simply echo it. Any accumulated spaces can only be */ /* Since the last tab stop, so ignore them. */ if (c == '\t') { column = (column / TAB + 1) * TAB; spaces = 0; putchar('\t'); continue; } /* A non-space character is to be printed. If there */ /* Are pending spaces, then print them. There will be */ /* At most TAB-1 spaces to print. */ while (spaces > 0) { putchar(' '); --spaces; } if (c == '\n' || c == '\r') { column = 0; leading_blank = 1; putchar(c); continue; } if (c == '\b') column = column > 0 ? column - 1 : 0; else ++column; leading_blank = 0; putchar(c); } } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* uniq - compact repeated lines Author: John Woods */ /* Uniq [-udc] [-n] [+n] [infile [outfile]] * * Written 02/08/86 by John Woods, placed into public domain. Enjoy. * */ /* If the symbol WRITE_ERROR is defined, uniq will exit(1) if it gets a * write error on the output. This is not (of course) how V7 uniq does it, * so undefine the symbol if you want to lose your output to a full disk */ #define WRITE_ERROR 1 #include <ctype.h> #include <errno.h> #include <string.h> #include <stdlib.h> #include <stdio.h> char buffer[BUFSIZ]; int uflag = 1; /* default is union of -d and -u outputs */ int dflag = 1; /* flags are mutually exclusive */ int cflag = 0; int fields = 0; int chars = 0; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(FILE *xfopen, (char *fn, char *mode)); _PROTOTYPE(char *skip, (char *s)); _PROTOTYPE(int equal, (char *s1, char *s2)); _PROTOTYPE(void show, (char *line, int count)); _PROTOTYPE(int uniq, (void)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(int getline, (char *buf, int count)); FILE *xfopen(fn, mode) char *fn, *mode; { FILE *p; if ((p = fopen(fn, mode)) == NULL) { perror("uniq"); fflush(stdout); exit(1); } return(p); } int main(argc, argv) int argc; char *argv[]; { char *p; int inf = -1, outf; setbuf(stdout, buffer); for (--argc, ++argv; argc > 0 && (**argv == '-' || **argv == '+'); --argc, ++argv) { if (**argv == '+') chars = atoi(*argv + 1); else if (isdigit(argv[0][1])) fields = atoi(*argv + 1); else if (argv[0][1] == '\0') inf = 0; /* - is stdin */ else for (p = *argv + 1; *p; p++) { switch (*p) { case 'd': dflag = 1; uflag = 0; break; case 'u': uflag = 1; dflag = 0; break; case 'c': cflag = 1; break; default: usage(); } } } /* Input file */ if (argc == 0) inf = 0; else if (inf == -1) { /* if - was not given */ fclose(stdin); xfopen(*argv++, "r"); argc--; } if (argc == 0) outf = 1; else { fclose(stdout); xfopen(*argv++, "w"); argc--; } uniq(); fflush(stdout); return(0); } char *skip(s) char *s; { int n; /* Skip fields */ for (n = fields; n > 0; --n) { /* Skip blanks */ while (*s && (*s == ' ' || *s == '\t')) s++; if (!*s) return s; while (*s && (*s != ' ' && *s != '\t')) s++; if (!*s) return s; } /* Skip characters */ for (n = chars; n > 0; --n) { if (!*s) return s; s++; } return s; } int equal(s1, s2) char *s1, *s2; { return !strcmp(skip(s1), skip(s2)); } void show(line, count) char *line; int count; { if (cflag) printf("%4d %s", count, line); else { if ((uflag && count == 1) || (dflag && count != 1)) printf("%s", line); } } /* The meat of the whole affair */ char *nowline, *prevline, buf1[1024], buf2[1024]; int uniq() { char *p; int seen; /* Setup */ prevline = buf1; if (getline(prevline, 1024) < 0) return(0); seen = 1; nowline = buf2; /* Get nowline and compare if not equal, dump prevline and swap * pointers else continue, bumping seen count */ while (getline(nowline, 1024) > 0) { if (!equal(prevline, nowline)) { show(prevline, seen); seen = 1; p = nowline; nowline = prevline; prevline = p; } else seen += 1; } show(prevline, seen); return 0; } void usage() { fprintf(stderr, "Usage: uniq [-udc] [+n] [-n] [input [output]]\n"); } int getline(buf, count) char *buf; int count; { int c; int ct = 0; while (ct++ < count) { c = getc(stdin); if (c < 0) return(-1); *buf++ = c; if (c == '\n') { *buf++ = 0; return(ct); } } return(ct); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* update - do sync periodically Author: Andy Tanenbaum */ #include <sys/types.h> #include <signal.h> #include <unistd.h> _PROTOTYPE(int main, (void)); int main() { /* Release all (?) open file descriptors. */ close(0); close(1); close(2); /* Release current directory to avoid locking current device. */ chdir("/"); /* Flush the cache every 30 seconds. */ while (1) { sync(); sleep(30); } } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* uud - bulletproof version of uudecode */ /* * Uud -- decode a uuencoded file back to binary form. * * From the Berkeley original, modified by MSD, RDR, JPHD & WLS. * The Atari GEMDOS version compiled with MWC 2.x. * The MSDOS version with TurboC. * The Unix version with cc. * this version is made: 25 Nov 1988. * Jan 2 1990: Change system definition and change MSDOS to open the output * file for write binary do cr/lf replacement. */ #define UNIX 1 /* define one of: UNIX (Minix too!), MSDOS, or GEMDOS */ #ifdef GEMDOS #define SYSNAME "gemdos" #define SMALL 1 #endif #ifdef MSDOS #define SYSNAME "msdos" #define SMALL 1 #endif #ifdef UNIX #define SYSNAME "unix" #endif #include <sys/types.h> #include <stdarg.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <stdio.h> #ifdef GEMDOS #include <osbind.h> #define Error(n) { Bconin(2); exit(n); } #else #define Error(n) exit(n) #endif #ifdef UNIX #define WRITE "w" #else #define WRITE "wb" /* for both MSDOS and GEMDOS! */ #endif #define loop while (1) #define NCHARS 256 #define LINELEN 256 #define FILELEN 64 #define NORMLEN 60 /* allows for 80 encoded chars per line */ #define SEQMAX 'z' #define SEQMIN 'a' char seqc; int first, secnd, check, numl; FILE *in, *out; char *pos; char ifname[FILELEN], ofname[FILELEN]; char *source = NULL, *target = NULL; char blank, part = '\0'; int partn, lens; int debug = 0, nochk = 0, onedone = 0; int chtbl[NCHARS], cdlen[NORMLEN + 3]; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char *getnword, (char *str, int n)); _PROTOTYPE(void gettable, (void)); _PROTOTYPE(void decode, (void)); _PROTOTYPE(void getfile, (char *buf)); _PROTOTYPE(void format, (char *fp, ...)); _PROTOTYPE(void doprnt, (char *fp, char *ap)); _PROTOTYPE(void puti, (unsigned int i, unsigned int r)); _PROTOTYPE(void outc, (int c)); int main(argc, argv) int argc; char *argv[]; { int mode; register int i, j; char *curarg; char dest[FILELEN], buf[LINELEN]; while ((curarg = argv[1]) != NULL && curarg[0] == '-') { if (((curarg[1] == 'd') || (curarg[1] == 'D')) && (curarg[2] == '\0')) { debug = 1; } else if (((curarg[1] == 'n') || (curarg[1] == 'N')) && (curarg[2] == '\0')) { nochk = 1; } else if (((curarg[1] == 't') || (curarg[1] == 'T')) && (curarg[2] == '\0')) { argv++; argc--; if (argc < 2) { format("uud: Missing target directory.\n"); Error(15); } target = argv[1]; if (debug) format("Target dir = %s\n",target); } else if (((curarg[1] == 's') || (curarg[1] == 'S')) && (curarg[2] == '\0')) { argv++; argc--; if (argc < 2) { format("uud: Missing source directory.\n"); Error(15); } source = argv[1]; if (debug) format("Source dir = %s\n",source); } else if (curarg[1] != '\0') { format("Usage: uud [-n] [-d] [-s dir] [-t dir] [input-file]\n"); Error(1); } else break; argv++; argc--; } if (curarg == NULL || ((curarg[0] == '-') && (curarg[1] == '\0'))) { in = stdin; strcpy(ifname, "<stdin>"); } else { if (source != NULL) { strcpy(ifname, source); strcat(ifname, curarg); } else strcpy(ifname, curarg); if ((in = fopen(ifname, "r")) == NULL) { format("uud: Can't open %s\n", ifname); Error(2); } numl = 0; } /* * Set up the default translation table. */ for (i = 0; i < ' '; i++) chtbl[i] = -1; for (i = ' ', j = 0; i < ' ' + 64; i++, j++) chtbl[i] = j; for (i = ' ' + 64; i < NCHARS; i++) chtbl[i] = -1; chtbl['`'] = chtbl[' ']; /* common mutation */ chtbl['~'] = chtbl['^']; /* an other common mutation */ blank = ' '; /* * set up the line length table, to avoid computing lotsa * and / ... */ cdlen[0] = 1; for (i = 1, j = 5; i <= NORMLEN; i += 3, j += 4) cdlen[i] = (cdlen[i + 1] = (cdlen[i + 2] = j)); /* * search for header or translation table line. */ loop { /* master loop for multiple decodes in one file */ partn = 'a'; loop { if (fgets(buf, sizeof buf, in) == NULL) { if (onedone) { if (debug) format("End of file.\n"); exit(0); } else { format("uud: No begin line.\n"); Error(3); } } numl++; if (strncmp(buf, "table", (size_t)5) == 0) { gettable(); continue; } if (strncmp(buf, "begin", (size_t)5) == 0) { break; } } lens = strlen(buf); if (lens) buf[--lens] = '\0'; #ifdef SMALL if ((pos = getnword(buf, 3))) { strcpy(dest, pos); } else #else if(sscanf(buf,"begin%o%s", &mode, dest) != 2) #endif { format("uud: Missing filename in begin line.\n"); Error(10); } if (target != NULL) { strcpy(ofname, target); strcat(ofname, dest); } else strcpy(ofname, dest); if((out = fopen(ofname, WRITE)) == NULL) { format("uud: Cannot open output file: %s\n", ofname); Error(4); } if (debug) format("Begin uudecoding: %s\n", ofname); seqc = SEQMAX; check = nochk ? 0 : 1; first = 1; secnd = 0; decode(); fclose(out); #ifdef UNIX chmod(ofname, mode); #endif onedone = 1; if (debug) format("End uudecoding: %s\n", ofname); } /* master loop for multiple decodes in one file */ } /* * Bring back a pointer to the start of the nth word. */ char *getnword(str, n) register char *str; register int n; { while((*str == '\t') || (*str == ' ')) str++; if (! *str) return NULL; while(--n) { while ((*str != '\t') && (*str != ' ') && (*str)) str++; if (! *str) return NULL; while((*str == '\t') || (*str == ' ')) str++; if (! *str) return NULL; } return str; } /* * Install the table in memory for later use. */ void gettable() { char buf[LINELEN]; register int c, n = 0; register char *cpt; for (c = 0; c < NCHARS; c++) chtbl[c] = -1; again: if (fgets(buf, sizeof buf, in) == NULL) { format("uud: EOF while in translation table.\n"); Error(5); } numl++; if (strncmp(buf, "begin", (size_t)5) == 0) { format("uud: Incomplete translation table.\n"); Error(6); } cpt = buf + strlen(buf) - 1; *cpt = ' '; while (*(cpt) == ' ') { *cpt = 0; cpt--; } cpt = buf; while (c = *cpt) { if (chtbl[c] != -1) { format("uud: Duplicate char in translation table.\n"); Error(7); } if (n == 0) blank = c; chtbl[c] = n++; if (n >= 64) return; cpt++; } goto again; } /* * copy from in to out, decoding as you go along. */ void decode() { char buf[LINELEN], outl[LINELEN]; register char *bp, *ut; register int *trtbl = chtbl; register int n, c, rlen; register unsigned int len; loop { if (fgets(buf, sizeof buf, in) == NULL) { format("uud: EOF before end.\n"); fclose(out); Error(8); } numl++; len = strlen(buf); if (len) buf[--len] = '\0'; /* * Is it an unprotected empty line before the end line ? */ if (len == 0) continue; /* * Get the binary line length. */ n = trtbl[*buf]; if (n >= 0) goto decod; /* * end of uuencoded file ? */ if (strncmp(buf, "end", (size_t)3) == 0) return; /* * end of current file ? : get next one. */ if (strncmp(buf, "include", (size_t)7) == 0) { getfile(buf); continue; } format("uud: Bad prefix line %d in file: %s\n",numl, ifname); if (debug) format("Bad line =%s\n",buf); Error(11); /* * Sequence checking ? */ decod: rlen = cdlen[n]; /* * Is it the empty line before the end line ? */ if (n == 0) continue; /* * Pad with blanks. */ for (bp = &buf[c = len]; c < rlen; c++, bp++) *bp = blank; /* * Verify if asked for. */ if (debug) { for (len = 0, bp = buf; len < rlen; len++) { if (trtbl[*bp] < 0) { format( "Non uuencoded char <%c>, line %d in file: %s\n", *bp, numl, ifname); format("Bad line =%s\n",buf); Error(16); } bp++; } } /* * All this just to check for uuencodes that append a 'z' to each line.... */ if (secnd && check) { secnd = 0; if (buf[rlen] == SEQMAX) { check = 0; if (debug) format("Sequence check turned off (2).\n"); } else if (debug) format("Sequence check on (2).\n"); } else if (first && check) { first = 0; secnd = 1; if (buf[rlen] != SEQMAX) { check = 0; if (debug) format("No sequence check (1).\n"); } else if (debug) format("Sequence check R��R��R��R��R����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������on (1).\n"); } /* * There we check. */ if (check) { if (buf[rlen] != seqc) { format("uud: Wrong sequence line %d in %s\n", numl, ifname); if (debug) format( "Sequence char is <%c> instead of <%c>.\n", buf[rlen], seqc); Error(18); } seqc--; if (seqc < SEQMIN) seqc = SEQMAX; } /* * output a group of 3 bytes (4 input characters). * the input chars are pointed to by p, they are to * be output to file f.n is used to tell us not to * output all of them at the end of the file. */ ut = outl; len = n; bp = &buf[1]; while (n > 0) { *(ut++) = trtbl[*bp] << 2 | trtbl[bp[1]] >> 4; n--; if (n) { *(ut++) = (trtbl[bp[1]] << 4) | (trtbl[bp[2]] >> 2); n--; } if (n) { *(ut++) = trtbl[bp[2]] << 6 | trtbl[bp[3]]; n--; } bp += 4; } if ((n = fwrite(outl, (size_t)1, (size_t)len, out)) <= 0) { format("uud: Error on writing decoded file.\n"); Error(18); } } } /* * Find the next needed file, if existing, otherwise try further * on next file. */ void getfile(buf) register char *buf; { if ((pos = getnword(buf, 2)) == NULL) { format("uud: Missing include file name.\n"); Error(17); } else if (source != NULL) { strcpy(ifname, source); strcat(ifname, pos); } else strcpy(ifname, pos); #ifdef GEMDOS if (Fattrib(ifname, 0, 0) < 0) #else if (access(ifname, 04)) #endif { if (debug) { format("Cant find: %s\n", ifname); format("Continuing to read same file.\n"); } } else { if (freopen(ifname, "r", in) == in) { numl = 0; if (debug) format("Reading next section from: %s\n", ifname); } else { format("uud: Freopen abort: %s\n", ifname); Error(9); } } loop { if (fgets(buf, LINELEN, in) == NULL) { format("uud: No begin line after include: %s\n", ifname); Error(12); } numl++; if (strncmp(buf, "table", (size_t)5) == 0) { gettable(); continue; } if (strncmp(buf, "begin", (size_t)5) == 0) break; } lens = strlen(buf); if (lens) buf[--lens] = '\0'; /* * Check the part suffix. */ if ((pos = getnword(buf, 3)) == NULL ) { format("uud: Missing part name, in included file: %s\n", ifname); Error(13); } else { part = *pos; partn++; if (partn > 'z') partn = 'a'; if (part != partn) { format("uud: Part suffix mismatch: <%c> instead of <%c>.\n", part, partn); Error(14); } if (debug) format("Reading part %c\n", *pos); } } /* * Printf style formatting. (Borrowed from MicroEmacs by Dave Conroy.) * A lot smaller than the full fledged printf. */ #ifdef __STDC__ void format(char *fp, ...) { va_list args; va_start (args, fp); doprnt(fp, (char *)&args); va_end(args); } #else /* VARARGS1 */ void format(fp, args) char *fp; { doprnt(fp, (char *)&args); } #endif void doprnt(fp, ap) register char *fp; register char *ap; { register int c, k; register char *s; while ((c = *fp++) != '\0') { if (c != '%') outc(c); else { c = *fp++; switch (c) { case 'd': puti(*(int *)ap, 10); ap += sizeof(int); break; case 's': s = *(char **)ap; while ((k = *s++) != '\0') outc(k); ap += sizeof(char *); break; case 'c': outc(*(int *)ap); ap += sizeof(int); break; default: outc(c); } } } } /* * Put integer, in radix "r". */ void puti(i, r) register unsigned int i; register unsigned int r; { register unsigned int q, s; if ((q = i / r) != 0) puti(q, r); s = i % r; if (s <= 9) outc(s + '0'); else outc(s - 10 + 'A'); } void outc(c) register char c; { #ifdef GEMDOS if (c == '\n') Bconout(2, '\r'); Bconout(2, c); #else putchar(c); #endif } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* uue - bulletproof version of uuencode */ /* Uue -- encode a file so that it's printable ascii, short lines * * Slightly modified from a version posted to net.sources a while back, * and suitable for compilation on the IBM PC * * modified for Lattice C on the ST - 11.05.85 by MSD * modified for ALCYON on the ST - 10-24-86 by RDR * modified a little more for MWC... 02/09/87 by JPHD * (An optional first argument of the form: -nnumber (e.g. -500), will * produce a serie of files that long, linked by the include statement, * such files are automatically uudecoded by the companion program.) * More mods, - ... 05/06/87 by jphd * Mods for TOPS 20, and more. 08/06/87 by jphd * (remove freopen and rindex...change filename generation...) * (A lot more to do about I/O speed, avoiding completely the stdio.h...) * May be called as uuencode. Oct 2 1993 by Kees J. Bot * */ #include <ctype.h> #include <stdlib.h> #include <string.h> #include <stdio.h> #define USAGE #define FILE_NAME 10 /* affects how long names are truncated */ /* ENC is the basic 1 character encoding function to make a char printing */ #define ENC(c) (((c) & 077) + ' ') FILE *fp, *outp; char ofname[80]; int lenofname; int stdo = 0; #ifdef ST #define READ "rb" #else #define READ "r" #endif int part = 'a', chap = 'a'; #define SEQMAX 'z' #define SEQMIN 'a' char seqc = SEQMAX; int split = 0; int fileln = 32000; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void maketable, (void)); _PROTOTYPE(void makename, (void)); _PROTOTYPE(void encode, (void)); _PROTOTYPE(void outdec, (char *p)); _PROTOTYPE(int fr, (char *buf, int cnt)); int main(argc, argv) int argc; char *argv[]; { char *prog_name; char *fname; int filter; prog_name = argv[0] + strlen(argv[0]); while (prog_name > argv[0] && prog_name[-1] != '/') prog_name--; filter = strcmp(prog_name, "uuencode") == 0; if (argc < 2) { fprintf(stderr, "Usage: %s [-n] inputfile [-]\n", prog_name); exit(2); } if (argv[1][0] == '-') { fileln = -atoi(argv[1]); if (fileln <= 0) { fprintf(stderr, "Wrong file length arg.\n"); exit(3); } split = 1; argv++; argc--; } if (filter) { /* old uuencode reads from standard input */ fp = stdin; } else { if ((fp = fopen(argv[1], READ)) == NULL) { /* binary input !!! */ fprintf(stderr, "Cannot open %s\n", argv[1]); exit(1); } } fname = argv[1] + strlen(argv[1]); while (fname > argv[1] && fname[-1] != '/') fname--; strcpy(ofname, fname); fname = ofname; do { if (*fname == '.') *fname = '\0'; } while (*fname++); /* 10 char prefix + .uue -> 14 chars MAX */ lenofname = strlen(ofname); if (lenofname > FILE_NAME) ofname[FILE_NAME] = '\0'; strcat(ofname, ".uue"); lenofname = strlen(ofname); if (!split && (filter || (argc > 2) && (argv[2][0] == '-'))) { stdo = 1; outp = stdout; } else { makename(); if ((outp = fopen(ofname, "w")) == NULL) { fprintf(stderr, "Cannot open %s\n", ofname); exit(1); } } maketable(); fprintf(outp, "begin %o %s\n", 0644, argv[1]); encode(); fprintf(outp, "end\n"); fclose(outp); return(0); } /* Create ASCII table so a mailer can screw it up and the decode * program can restore the error. */ void maketable() { register int i, j; fputs("table\n", outp); for (i = ' ', j = 0; i < '`'; j++) { if (j == 32) putc('\n', outp); fputc(i++, outp); } putc('\n', outp); } /* Generate the names needed for single and multiple part encoding. */ void makename() { if (split) { ofname[lenofname - 1] = part; ofname[lenofname - 2] = chap; } } /* Copy from in to out, encoding as you go along. */ void encode() { char buf[80]; register int i, n; register int lines; lines = 6; for (;;) { n = fr(buf, 45); putc(ENC(n), outp); for (i = 0; i < n; i += 3) outdec(&buf[i]); putc(seqc, outp); seqc--; if (seqc < SEQMIN) seqc = SEQMAX; putc('\n', outp); ++lines; if (split && (lines > fileln)) { part++; if (part > 'z') { part = 'a'; if (chap == 'z') chap = 'a'; /* loop ... */ else chap++; } makename(); fprintf(outp, "include %s\n", ofname); fclose(outp); if ((outp = fopen(ofname, "w")) == NULL) { fprintf(stderr, "Cannot open %s\n", ofname); exit(1); } maketable(); fprintf(outp, "begin part %c %s\n", part, ofname); lines = 6; } if (n <= 0) break; } } /* Output one group of 3 bytes, pointed at by p, on file f. */ void outdec(p) register char *p; { register int c1, c2, c3, c4; c1 = *p >> 2; c2 = ((*p << 4) & 060) | ((p[1] >> 4) & 017); c3 = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03); c4 = p[2] & 077; putc(ENC(c1), outp); putc(ENC(c2), outp); putc(ENC(c3), outp); putc(ENC(c4), outp); } /* Fr: like read but stdio */ int fr(buf, cnt) register char *buf; register int cnt; { register int c, i; for (i = 0; i < cnt; i++) { c = fgetc(fp); if (feof(fp)) return(i); buf[i] = c; } return(cnt); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* vol - break stdin into volumes Author: Andy Tanenbaum */ /* This program reads standard input and writes it onto diskettes, pausing * at the start of each one. It's main use is for saving files that are * larger than a single diskette. Vol just writes its standard input onto * a diskette, and prompts for a new one when it is full. This mechanism * is transparent to the process producing vol's standard input. For example, * tar cf - . | vol -w 360 /dev/fd0 * puts the tar output as as many diskettes as needed. To read them back in, * use * vol -r 360 /dev/fd0 | tar xf - * * Changed 17 Nov 1993 by Kees J. Bot to handle buffering to slow devices. * Changed 27 Jul 1994 by Kees J. Bot to auto discover data direction + -rw. * Changed 19 Sep 1995 by Kees J. Bot to do better buffering to tapes. */ #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> #include <limits.h> #include <string.h> #include <sys/ioctl.h> #include <sys/mtio.h> #include <minix/partition.h> #include <minix/u64.h> /* Preferred block size to variable block length tapes, block devices or files. */ #define VAR_BLKSIZ 8192 /* Required block size multiple of fixed block size tapes (usually updated by * 'mt status' data) and character devices. */ #define FIX_BLKSIZ 512 /* Maximum multiple block size. */ #if __minix_vmd #define MULT_MAX 1048576 #else #define MULT_MAX ((ssize_t) (SSIZE_MAX < 65536L ? SSIZE_MAX : 65536L)) #endif char *buffer = NULL; size_t block_size = 0, mult_max = 0; size_t buffer_size; long volume_size; char *str_vol_size; int rflag = 0, wflag = 0, oneflag = 0, variable = 0; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(long str2size, (char *name, char *str, long min, long max, int assume_kb)); _PROTOTYPE(void tape_inquire, (char *name, int fd)); _PROTOTYPE(void allocate_buffer, (void)); _PROTOTYPE(void diskio, (int fd1, int fd2, char *file1, char *file2)); int main(argc, argv) int argc; char *argv[]; { int volume = 1, fd, tty, i, init, autovolsize; char *p, *name; struct stat stb; struct partition part; char key; /* Fetch and verify the arguments. */ i = 1; while (i < argc && argv[i][0] == '-') { p = argv[i++] + 1; if (p[0] == '-' && p[1] == 0) { /* -- */ i++; break; } while (*p != '\0') { switch (*p++) { case 'r': case 'u': rflag = 1; break; case 'w': wflag = 1; break; case '1': oneflag = 1; break; case 'b': if (*p == 0) { if (i == argc) usage(); p = argv[i++]; } block_size = str2size("block", p, 1L, (long) SSIZE_MAX, 0); p= ""; break; case 'm': if (*p == 0) { if (i == argc) usage(); p = argv[i++]; } mult_max = str2size("maximum", p, 1L, (long) SSIZE_MAX, 0); p= ""; break; default: usage(); } } } if (i < argc - 1) { str_vol_size = argv[i++]; volume_size = str2size("volume", str_vol_size, 1L, LONG_MAX, 1); autovolsize = 0; } else { volume_size = 0; /* unlimited (long tape) or use DIOCGETP */ autovolsize = 1; } if (i >= argc) usage(); name = argv[i]; if (!rflag && !wflag) { /* Auto direction. If there is a terminal at one side then data is * to go out at the other side. */ if (isatty(0)) rflag = 1; if (isatty(1)) wflag = 1; } if (rflag == wflag) { fprintf(stderr, "vol: should %s be read or written?\n", name); usage(); } if (stat(name, &stb) < 0) { fprintf(stderr, "vol: %s: %s\n", name, strerror(errno)); exit(1); } if (!S_ISBLK(stb.st_mode) && !S_ISCHR(stb.st_mode)) { fprintf(stderr, "vol: %s is not a device\n", name); exit(1); } variable = !S_ISCHR(stb.st_mode); if (!oneflag) { tty = open("/dev/tty", O_RDONLY); if (tty < 0) { fprintf(stderr, "vol: cannot open /dev/tty\n"); exit(1); } } /* Buffer initializations are yet to be done. */ init = 0; while (1) { sleep(1); if (oneflag) { if (volume != 1) { if (rflag) exit(0); fprintf(stderr, "vol: can't continue, volume is full\n"); exit(1); } } else { fprintf(stderr, "\007Please insert %sput volume %d and hit return\n", rflag ? "in" : "out", volume); while (read(tty, &key, sizeof(key)) == 1 && key != '\n') {} } /* Open the special file. */ fd = open(name, rflag ? O_RDONLY : O_WRONLY); if (fd < 0) { fprintf(stderr, "vol: %s: %s\n", name, strerror(errno)); exit(1); } if (!init) { /* Ask for the tape block size and allocate a buffer. */ if (S_ISCHR(stb.st_mode)) tape_inquire(name, fd); allocate_buffer(); init = 1; } if (autovolsize) { /* Ask the driver how big the volume is. */ if (ioctl(fd, DIOCGETP, &part) < 0) { autovolsize = 0; } else { volume_size = cv64ul(part.size); } } /* Read or write the requisite number of blocks. */ if (rflag) { diskio(fd, 1, name, "stdout"); /* vol -r | tar xf - */ } else { diskio(0, fd, "stdin", name); /* tar cf - | vol -w */ } close(fd); volume++; } } void usage() { fprintf(stderr, "Usage: vol [-rw1] [-b blocksize] [-m max] [size] block-special\n"); exit(1); } long str2size(name, str, min, max, assume_kb) char *name; char *str; long min, max; int assume_kb; { /* Convert a string to a size. The number may be followed by 'm', 'k', 'b' * or 'w' to multiply the size as shown below. If 'assume_kb' is set then * kilobytes is the default. */ long size, factor; char *ptr; int bad; errno = 0; size = strtol(str, &ptr, 10); bad = (errno != 0 || ptr == str || size < min || size > max); if (*ptr == 0 && assume_kb) ptr = "k"; while (!bad && *ptr != 0) { switch (*ptr++) { case 'm': case 'M': factor = 1024*1024L; break; case 'k': case 'K': factor = 1024; break; case 'b': case 'B': factor = 512; break; case 'w': case 'W': factor = 2; break; default: factor = 1; bad = 1; } if (size <= max / factor) size *= factor; else bad = 1; } if (bad) { fprintf(stderr, "vol: bad %s size '%s'\n", name, str); exit(1); } return size; } void tape_inquire(name, fd) char *name; int fd; { /* If the device happens to be a tape, then what is its block size? */ struct mtget mtget; if (ioctl(fd, MTIOCGET, &mtget) < 0) { if (errno != ENOTTY) { fprintf(stderr, "vol: %s: %s\n", name, strerror(errno)); exit(1); } } else { if (mtget.mt_blksize > SSIZE_MAX) { fprintf(stderr, "vol: %s: tape block size (%lu) is too large to handle\n", name, (unsigned long) mtget.mt_blksize); exit(1); } if (mtget.mt_blksize == 0) { variable = 1; } else { /* fixed */ block_size = mtget.mt_blksize; } } } void allocate_buffer() { /* Set block size and maximum multiple. */ if (block_size == 0) block_size = variable ? 1 : FIX_BLKSIZ; if (mult_max == 0) mult_max = variable ? VAR_BLKSIZ : MULT_MAX; /* Stretch the buffer size to the max. */ buffer_size = mult_max / block_size * block_size; if (buffer_size == 0) buffer_size = block_size; if (volume_size % block_size != 0) { fprintf(stderr, "vol: volume size (%s) is not a multiple of the block size (%lu)\n", str_vol_size, (unsigned long) block_size); exit(1); } buffer = (char *) malloc(buffer_size); if (buffer == NULL) { fprintf(stderr, "vol: cannot allocate a %luk buffer\n", (unsigned long) buffer_size / 1024); exit(1); } } void diskio(fd1, fd2, file1, file2) int fd1, fd2; char *file1, *file2; { /* Read 'volume_size' bytes from 'fd1' and write them on 'fd2'. Watch out for * the fact that reads on pipes can return less than the desired data. */ ssize_t n, in_needed, in_count, out_count; long needed = volume_size; int eof = 0; for (;;) { if (volume_size == 0) needed = buffer_size; if (needed == 0) break; in_count = 0; in_needed = needed > buffer_size ? buffer_size : needed; while (in_count < in_needed) { n = in_needed - in_count; n = eof ? 0 : read(fd1, buffer + in_count, n); if (n == 0) { eof = 1; if ((n = in_count % block_size) > 0) { n = block_size - n; memset(buffer + in_count, '\0', n); if ((in_count += n) > in_needed) in_count = in_needed; } break; } if (n < 0) { R��R���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� fprintf(stderr, "vol: %s: %s\n", file1, strerror(errno)); exit(1); } in_count += n; } if (in_count == 0) exit(0); /* EOF */ out_count = 0; while (out_count < in_count) { n = in_count - out_count; n = write(fd2, buffer + out_count, n); if (n < 0) { fprintf(stderr, "vol: %s: %s\n", file2, strerror(errno)); exit(1); } out_count += n; } needed -= in_count; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* wc - count lines, words and characters Author: David Messer */ #include <ctype.h> #include <stdlib.h> #include <stdio.h> /* * * Usage: wc [-lwc] [names] * * Flags: * l - count lines. * w - count words. * c - count characters. * * Flags l, w, and c are default. * Words are delimited by any non-alphabetic character. * * Released into the PUBLIC-DOMAIN 02/10/86 * * If you find this program to be of use to you, a donation of * whatever you think it is worth will be cheerfully accepted. * * Written by: David L. Messer * P.O. Box 19130, Mpls, MN, 55119 * Program (heavily) modified by Andy Tanenbaum */ int lflag; /* Count lines */ int wflag; /* Count words */ int cflag; /* Count characters */ long lcount; /* Count of lines */ long wcount; /* Count of words */ long ccount; /* Count of characters */ long ltotal; /* Total count of lines */ long wtotal; /* Total count of words */ long ctotal; /* Total count of characters */ _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(void count, (FILE *f)); _PROTOTYPE(void usage, (void)); int main(argc, argv) int argc; char *argv[]; { int k; char *cp; int tflag, files; /* Get flags. */ files = argc - 1; k = 1; cp = argv[1]; if (argc > 1 && *cp++ == '-') { files--; k++; /* points to first file */ while (*cp != 0) { switch (*cp) { case 'l': lflag++; break; case 'w': wflag++; break; case 'c': cflag++; break; default: usage(); } cp++; } } /* If no flags are set, treat as wc -lwc. */ if (!lflag && !wflag && !cflag) { lflag = 1; wflag = 1; cflag = 1; } /* Process files. */ tflag = files >= 2; /* set if # files > 1 */ /* Check to see if input comes from std input. */ if (k >= argc) { count(stdin); if (lflag) printf(" %6ld", lcount); if (wflag) printf(" %6ld", wcount); if (cflag) printf(" %6ld", ccount); printf(" \n"); fflush(stdout); exit(0); } /* There is an explicit list of files. Loop on files. */ while (k < argc) { FILE *f; if ((f = fopen(argv[k], "r")) == NULL) { fprintf(stderr, "wc: cannot open %s\n", argv[k]); } else { count(f); if (lflag) printf(" %6ld", lcount); if (wflag) printf(" %6ld", wcount); if (cflag) printf(" %6ld", ccount); printf(" %s\n", argv[k]); fclose(f); } k++; } if (tflag) { if (lflag) printf(" %6ld", ltotal); if (wflag) printf(" %6ld", wtotal); if (cflag) printf(" %6ld", ctotal); printf(" total\n"); } fflush(stdout); return(0); } void count(f) FILE *f; { register int c; register int word = 0; lcount = 0; wcount = 0; ccount = 0L; while ((c = getc(f)) != EOF) { ccount++; if (isspace(c)) { if (word) wcount++; word = 0; } else { word = 1; } if (c == '\n' || c == '\f') lcount++; } ltotal += lcount; wtotal += wcount; ctotal += ccount; } void usage() { fprintf(stderr, "Usage: wc [-lwc] [name ...]\n"); exit(1); } �������������������������������������������������������������������������������������������������������������������������������/* which - search paths for executable */ #define DELIMITER ':' #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (int argc, char **argv)); int main(ac, av) int ac; char **av; { char *path, *cp; char buf[400]; char prog[400]; char patbuf[512]; int quit, none; int excode = 0; if (ac < 2) { fprintf(stderr, "Usage: %s cmd [cmd, ..]\n", *av); exit(1); } av[ac] = 0; for (av++; *av; av++) { quit = 0; none = 1; if ((path = getenv("PATH")) == NULL) { fprintf(stderr, "Null path.\n"); exit(0); } strcpy(patbuf, path); path = patbuf; cp = path; while (1) { cp = strchr(path, DELIMITER); if (cp == NULL) quit++; else *cp = '\0'; if (strcmp(path, "") == 0 && quit == 0) { sprintf(buf, "%s./%s", path, *av); } else sprintf(buf, "%s/%s", path, *av); /* Fprintf(stderr,"Trying %s, path %s\n",buf,path); */ path = ++cp; if (access(buf, 1) == 0) { printf("%s\n", buf); none = 0; } sprintf(prog, "%s.%s", buf, "prg"); if (access(prog, 1) == 0) { printf("%s\n", prog); none = 0; } sprintf(prog, "%s.%s", buf, "ttp"); if (access(prog, 1) == 0) { printf("%s\n", prog); none = 0; } sprintf(prog, "%s.%s", buf, "tos"); if (access(prog, 1) == 0) { printf("%s\n", prog); none = 0; } if (quit) { if (none) { fprintf(stderr, "No %s in %s\n", *av, getenv("PATH")); excode = 1; } break; } } } return(excode); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* who 1.5 - tell who is currently logged in Author: Kees J. Bot * 9 Jul 1989 */ #define nil 0 #include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/stat.h> #include <utmp.h> #include <time.h> #include <string.h> char PATH_UTMP[] = "/etc/utmp"; char day[] = "SunMonTueWedThuFriSat"; char month[] = "JanFebMarAprMayJunJulAugSepOctNovDec"; int main(int argc, char **argv) { char *tmp= PATH_UTMP; FILE *f; struct utmp ut; struct tm *tm; int slot, wtmp= 0, once= 0; if (argc > 3) { fprintf(stderr, "Usage: who <account-file> | who am i\n"); exit(1); } if (argc == 2) { tmp= argv[1]; wtmp= 1; } if ((f= fopen(tmp, "r")) == nil) { fprintf(stderr, "who: can't open %s\n", tmp); exit(1); } if (argc == 3) { if ((slot= ttyslot()) < 0) { fprintf(stderr, "who: no access to terminal.\n"); exit(1); } fseek(f, (off_t) sizeof(ut) * slot, 0); once= 1; } while (fread((char *) &ut, sizeof(ut), 1, f) == 1) { if (!wtmp && ut.ut_name[0] == 0) continue; tm= localtime(&ut.ut_time); printf("%-9.8s %-9.8s %.3s %.3s %2d %02d:%02d", ut.ut_name, ut.ut_line, day + (3 * tm->tm_wday), month + (3 * tm->tm_mon), tm->tm_mday, tm->tm_hour, tm->tm_min ); if (ut.ut_host[0] != 0) printf(" (%.*s)", (int) sizeof(ut.ut_host), ut.ut_host); printf("\n"); if (once) break; } exit(0); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* whoami - print the current user name Author: Terrence W. Holm */ #include <sys/types.h> #include <pwd.h> #include <stdlib.h> #include <unistd.h> #include <stdio.h> _PROTOTYPE(int main, (void)); int main() { struct passwd *pw_entry; pw_entry = getpwuid(geteuid()); if (pw_entry == NULL) exit(1); puts(pw_entry->pw_name); return(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* write - write to a logged in user Authors: N. Andrew and F. van Kempen */ /* * Usage: write [-c] [-v] user [tty] * -c Read & write one character at a time (cbreak mode) * -v Verbose * * Version: 1.6 10/24/92 * * NOTES: Write requires 1.4a (or higher) libraries, * for getopt(), strchr(). * * Authors: Nick Andrew (nick@nswitgould.oz) - Public Domain * Fred van Kempen (minixug!waltje@kyber.uucp) */ #include <sys/types.h> #include <fcntl.h> #include <pwd.h> #include <termios.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <utmp.h> #include <time.h> #include <stdio.h> static char *Version = "@(#) WRITE 1.6 (10/24/92)"; int otty; /* file desc of callee's terminal */ short int cbreak = 0; /* are we in CBREAK (-c) mode? */ short int verbose = 0; /* are we in VERBOSE (-v) mode? */ short int writing = 0; /* is there a connection? */ char *user = NULL; /* callee's user name */ char *tty = NULL; /* callee's terminal if given */ char *ourtty = NULL; /* our terminal name */ struct termios ttyold, ttynew; /* our tty controlling structs */ extern int optind; _PROTOTYPE(int main, (int argc, char **argv)); _PROTOTYPE(char *finduser, (void)); _PROTOTYPE(void settty, (char *utty)); _PROTOTYPE(void sayhello, (void)); _PROTOTYPE(void escape, (char *cmd)); _PROTOTYPE(void writetty, (void)); _PROTOTYPE(void usage, (void)); _PROTOTYPE(void intr, (int dummy)); char *finduser() { /* Search the UTMP database for the user we want. */ static char utmptty[16]; struct utmp utmp; struct passwd *userptr; int utmpfd; ourtty = ttyname(0); if (ourtty == NULL) ourtty = "/dev/console"; if (user == NULL) exit(-1); if ((userptr = getpwnam(user)) == NULL) { fprintf(stderr, "No such user: %s\n", user); return(NULL); } if (verbose) fprintf(stderr, "Trying to write to %s\n", userptr->pw_gecos); if ((utmpfd = open("/etc/utmp", O_RDONLY)) < 0) { fprintf(stderr, "Cannot open utmp file\n"); return(NULL); } utmptty[0] = '\0'; /* We want to find if 'user' is logged on, and return in utmptty[] * 'user' `s terminal, and if 'user' is logged onto the tty the * caller specified, return that tty name. */ while (read(utmpfd, (char *) &utmp, sizeof(utmp)) == sizeof(utmp)) { /* is this the user we are looking for? */ if (strncmp(utmp.ut_name, user, sizeof(utmp.ut_name))) continue; strcpy(utmptty, utmp.ut_line); /* is he on the terminal we want to write to? */ if (tty == NULL || !strcmp(utmptty, tty)) { break; } } if (utmptty[0] == '\0') { fprintf(stderr, "%s is not logged on\n", user); return( NULL); } if (tty != NULL && strcmp(utmptty, tty)) { fprintf(stderr, "%s is logged onto %s, not %s\n", user, utmptty, tty); return( NULL); } close(utmpfd); if (verbose) fprintf(stderr, "Writing to %s on %s\n", user, utmptty); return(utmptty); } void settty(utty) char *utty; /* name of terminal found in utmp */ { /* Open other person's terminal and setup our own terminal. */ char buff[48]; sprintf(buff, "/dev/%s", utty); if ((otty = open(buff, O_WRONLY)) < 0) { fprintf(stderr, "Cannot open %s to write to %s\n", utty, user); fprintf(stderr, "It may have write permission turned off\n"); exit(-1); } tcgetattr(0, &ttyold); tcgetattr(0, &ttynew); ttynew.c_lflag &= ~(ICANON|ECHO); signal(SIGINT, intr); if (cbreak) tcsetattr(0, TCSANOW, &ttynew); } void sayhello() { struct passwd *pw; char buff[128]; long now; char *sp; time(&now); pw = getpwuid(getuid()); if (pw == NULL) { fprintf(stderr, "unknown user\n"); exit(-1); } if ((sp = strrchr(ourtty, '/')) != NULL) ++sp; else sp = ourtty; sprintf(buff, "\nMessage from %s (%s) %-24.24s...\n", pw->pw_name, sp, ctime(&now)); write(otty, buff, strlen(buff)); printf("\007\007"); fflush(stdout); } void escape(cmd) char *cmd; { /* Shell escape. */ register char *x; write(1, "!\n", 2); for (x = cmd; *x; ++x) if (*x == '\n') *x = '\0'; system(cmd); write(1, "!\n", 2); } void writetty() { /* The write loop. */ char line[80]; int n, cb_esc; writing = 1; cb_esc = 0; while ((n = read(0, line, 79)) > 0) { if (line[0] == '\004') break; /* EOT */ if (cbreak && line[0] == '\n') cb_esc = 1; if (cbreak) write(1, line, n); if (line[0] == '!') { if (cbreak && cb_esc) { cb_esc = 0; tcsetattr(0, TCSANOW, &ttyold); read(0, line, 79); escape(line); tcsetattr(0, TCSANOW, &ttynew); } else if (cbreak) write(otty, line, n); else escape(&line[1]); continue; } write(otty, line, n); } write(1, "\nEOT\n", 5); write(otty, "\nEOT\n", 5); } void usage() { fprintf(stderr, "usage: write [-c] [-v] user [tty]\n"); fprintf(stderr, "\t-c : cbreak mode\n\t-v : verbose\n"); exit(-1); } int main(argc, argv) int argc; char *argv[]; { register int c; char *sp; setbuf(stdout, (char *) NULL); /* Parse options. */ while ((c = getopt(argc, argv, "cv")) != EOF) switch (c) { case 'c': cbreak = 1; break; case 'v': verbose = 1; break; default: usage(); } /* Parse user and tty arguments */ if (optind < argc) { user = argv[optind++]; /* WTMP usernames are 1-8 chars */ if (strlen(user) > 8) *(user + 8) = '\0'; if (optind < argc) { tty = argv[optind++]; if (optind < argc) usage(); } } else usage(); sp = finduser(); /* find which tty to write onto */ if (sp != NULL) { /* did we find one? */ settty(sp); /* setup our terminal */ sayhello(); /* print the initial message */ writetty(); /* the write loop */ tcsetattr(0, TCSANOW, &ttyold); exit(0); } return(-1); } void intr(dummy) int dummy; /* to satisfy the prototype */ { /* The interrupt key has been hit. exit cleanly. */ signal(SIGINT, SIG_IGN); fprintf(stderr, "\nInterrupt. Exiting write\n"); tcsetattr(0, TCSANOW, &ttyold); if (writing) write(otty, "\nEOT\n", 5); exit(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* yes 1.4 - print 'y' or argv[1] continuously. Author: Kees J. Bot * 15 Apr 1989 */ #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, char **argv) { char *yes; static char y[] = "y"; int n; yes= argc == 1 ? y : argv[1]; n= strlen(yes); yes[n++]= '\n'; while (write(1, yes, n) != -1) {} exit(1); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O .�������������..������������P Makefile������Q net.c���������R net.h���������S proto.c�������T proto.h�������U screen.c������V screen.h������W talk.c��������X talk.h����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for talk # # 08/01/96 Michael Temari, <temari@ix.netcom.com> # CFLAGS= -O -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i BINDIR= /usr/bin PROG= talk OBJS= talk.o screen.o net.o proto.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) -lcurses install -S 16kw $@ clean: rm -f $(PROG) $(OBJS) install: $(BINDIR)/$(PROG) $(BINDIR)/$(PROG): $(PROG) install -cs -o bin $? $@ talk.o: talk.c talk.h proto.h net.h screen.h screen.o: screen.c screen.h net.o: net.c talk.h net.h proto.o: proto.c talk.h proto.h net.h screen.h ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.c Copyright Michael Temari 08/01/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/ioctl.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <signal.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/udp.h> #include <net/gen/udp_io.h> #include <net/gen/udp_hdr.h> #include "talk.h" #include "net.h" _PROTOTYPE(void TimeOut, (int sig)); static unsigned char buffer[8192]; static int udp_ctl; int tcp_fd; static udpport_t ntalk_port; char luser[USER_SIZE+1], ruser[USER_SIZE+1]; char lhost[HOST_SIZE+1], rhost[HOST_SIZE+1]; char ltty[TTY_SIZE+1], rtty[TTY_SIZE+1]; udpport_t ctlport; tcpport_t dataport; ipaddr_t laddr, raddr; int NetInit() { int s; struct servent *servent; char *udp_device; char *tcp_device; nwio_udpopt_t udpopt; nwio_tcpconf_t tcpconf; if((udp_device = getenv("UDP_DEVICE")) == (char *)NULL) udp_device = UDP_DEVICE; if((udp_ctl = open(udp_device, O_RDWR)) < 0) { fprintf(stderr, "talk: Could not open %s: %s\n", udp_device, strerror(errno)); return(-1); } if((servent = getservbyname("ntalk", "udp")) == (struct servent *)NULL) { fprintf(stderr, "talk: Could not find ntalk udp service\n"); close(udp_ctl); return(-1); } ntalk_port = (udpport_t)servent->s_port; udpopt.nwuo_flags = NWUO_NOFLAGS; udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SEL | NWUO_EN_LOC; udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET; udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT; udpopt.nwuo_remaddr = raddr; udpopt.nwuo_remport = ntalk_port; s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt); if(s < 0) { perror("talk: ioctl NWIOSUDPOPT"); close(udp_ctl); return(-1); } s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt); if(s < 0) { perror("talk: ioctl NWIOGUDPOPT"); close(udp_ctl); return(-1); } laddr = udpopt.nwuo_locaddr; ctlport = udpopt.nwuo_locport; if((tcp_device = getenv("TCP_DEVICE")) == (char *)NULL) tcp_device = TCP_DEVICE; if((tcp_fd = open(tcp_device, O_RDWR)) < 0) { fprintf(stderr, "talk: Could not open %s: %s\n", tcp_device, strerror(errno)); close(udp_ctl); return(-1); } tcpconf.nwtc_flags = NWTC_NOFLAGS; tcpconf.nwtc_flags |= NWTC_LP_SEL | NWTC_SET_RA | NWTC_UNSET_RP; tcpconf.nwtc_remaddr = raddr; s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { perror("talk: ioctl NWIOSTCPCONF"); close(udp_ctl); close(tcp_fd); return(-1); } s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("talk: ioctl NWIOGTCPCONF"); close(udp_ctl); close(tcp_fd); return(-1); } dataport = tcpconf.nwtc_locport; return(0); } int getreply(reply, timeout) struct talk_reply *reply; int timeout; { int s; int terrno; udp_io_hdr_t *udp_io_hdr; signal(SIGALRM, TimeOut); alarm(timeout); s = read(udp_ctl, buffer, sizeof(buffer)); terrno = errno; alarm(0); errno = terrno; if(s < 0 && errno == EINTR) return(1); if(s < 0) { perror("talk: Read error in getreply"); return(-1); } if(s == sizeof(struct talk_reply)) memcpy((char *)reply, buffer, s); return(0); } int sendrequest(request, here) struct talk_request *request; int here; { int s; nwio_udpopt_t udpopt; udp_io_hdr_t *udp_io_hdr; udpopt.nwuo_flags = NWUO_NOFLAGS; udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC; udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET; udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT; udpopt.nwuo_locport = ctlport; if(here) udpopt.nwuo_remaddr = laddr; else udpopt.nwuo_remaddr = raddr; udpopt.nwuo_remport = ntalk_port; s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt); if(s < 0) { perror("talk: ioctl NWIOSUDPOPT"); return(-1); } s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt); if(s < 0) { perror("talk: ioctl NWIOGUDPOPT"); return(-1); } s = write(udp_ctl, request, sizeof(struct talk_request)); if(s < 0) { perror("talk: write error in sendrequest"); return(-1); } if(s != sizeof(struct talk_request)) { fprintf(stderr, "talk: sendrequest size mismatch %d %d\n", s, sizeof(struct talk_request)); return(-1); } return(0); } void TimeOut(sig) int sig; { } int NetConnect(port) u16_t port; { int s; nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpcopt; tcpconf.nwtc_flags = NWTC_NOFLAGS; tcpconf.nwtc_flags |= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_locport = dataport; tcpconf.nwtc_remaddr = raddr; tcpconf.nwtc_remport = port; s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf); if(s < 0) { perror("talk: ioctl NWIOSTCPCONF"); return(-1); } s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("talk: ioctl NWIOGTCPCONF"); return(-1); } tcpcopt.nwtcl_flags = 0; s = ioctl(tcp_fd, NWIOTCPCONN, &tcpcopt); if(s < 0 && errno == ECONNREFUSED) return(1); if(s < 0) { perror("talk: ioctl NWIOTCPCONN"); return(-1); } return(0); } int NetListen(timeout) int timeout; { int s; nwio_tcpcl_t tcplopt; int terrno; tcplopt.nwtcl_flags = 0; signal(SIGALRM, TimeOut); alarm(timeout); s = ioctl(tcp_fd, NWIOTCPLISTEN, &tcplopt); terrno = errno; alarm(0); errno = terrno; if(s < 0 && errno == EINTR) return(1); if(s < 0) { perror("talk: ioctl NWIOTCPLISTEN"); return(-1); } return(0); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.h Copyright Michael Temari 08/01/1996 All Rights Reserved */ extern char luser[], ruser[]; extern char lhost[], rhost[]; extern char ltty[], rtty[]; extern udpport_t ctlport; extern tcpport_t dataport; extern ipaddr_t laddr, raddr; extern int tcp_fd; _PROTOTYPE(int NetInit, (void)); _PROTOTYPE(int getreply, (struct talk_reply *reply, int timeout)); _PROTOTYPE(int sendrequest, (struct talk_request *request, int here)); _PROTOTYPE(int NetConnect, (U16_t port)); _PROTOTYPE(int NetListen, (int timeout)); �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* proto.c Copyright Michael Temari 08/01/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/udp.h> #include "talk.h" #include "proto.h" #include "net.h" #include "screen.h" _PROTOTYPE(static int TalkChk, (int gotreply, struct talk_reply *reply, char *msg)); _PROTOTYPE(static int TalkTrans, (int type, long id, struct talk_reply *reply, int here)); static char *AnswerMsgs[] = { "Success", "User Not Logged In", "Failure", "Remote Does Not Know who we are", "User is not accepting calls", "Are request was not know", "Incorrect Version", "Bad Address", "Bad Control Address" }; static int TalkChk(gotreply, reply, msg) int gotreply; struct talk_reply *reply; char *msg; { if(!gotreply) { ScreenMsg(msg); return(-1); } if(reply->answer == SUCCESS) return(0); if(reply->answer < (sizeof(AnswerMsgs) / sizeof(AnswerMsgs[0]))) ScreenMsg(AnswerMsgs[reply->answer]); else ScreenMsg("Bad Answer"); return(-1); } static int TalkTrans(type, id, reply, here) int type; long id; struct talk_reply *reply; int here; { struct talk_request request; int tries; int gotreply; memset(&request, 0, sizeof(request)); request.version = TALK_VERSION; request.type = type; request.id = id; request.addr.sa_family = htons(AF_INET); request.addr.sin_port = dataport; request.addr.sin_addr = laddr; request.ctl_addr.sa_family = htons(AF_INET); request.ctl_addr.sin_port = ctlport; request.ctl_addr.sin_addr = laddr; request.pid = getpid(); strncpy(request.luser, luser, USER_SIZE); strncpy(request.ruser, ruser, USER_SIZE); strncpy(request.rtty, rtty, TTY_SIZE); tries = 0; gotreply = 0; while(!ScreenDone && tries++ < 3 && !gotreply) { if(!sendrequest(&request, here)) if(!getreply(reply, 5)) gotreply = 1; if(!gotreply) continue; if(reply->version != request.version || reply->type != request.type) gotreply = 0; } return(gotreply); } int TalkInit() { struct talk_reply reply; long id = 0; long rid; int s; int ring; char buff[32]; /* Check if someone was calling us */ ScreenMsg("Initiating Talk Protocol"); /* Check is someone was calling us */ s = TalkTrans(LOOK_UP, ++id, &reply, 0); /* Someone was calling us */ if(s && reply.answer == SUCCESS) { s = NetConnect(reply.addr.sin_port); if(s == 1) { ScreenMsg("Your party has hung up"); TalkTrans(DELETE, reply.id, &reply, 0); } return(s == 0 ? 0 : -1); } ScreenMsg("Ringing User"); ring = 0; while(!ScreenDone && ring++ < 5) { if(TalkChk(TalkTrans(ANNOUNCE, -1, &reply, 0), &reply, "No response to are ring")) return(-1); rid = reply.id; sprintf(buff, "Ring #%d", ring); ScreenMsg(buff); if(ring == 1) { if(TalkChk(TalkTrans(LEAVE_INVITE, ++id, &reply, 1), &reply, "Could not leave are invitaion locally")) return(-1); } s = NetListen(RING_WAIT); if(s <= 0) { TalkTrans(DELETE, reply.id, &reply, 1); TalkTrans(DELETE, rid, &reply, 0); return(s); } } return(-1); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* proto.h Copyright Michael Temari 08/01/1996 All Rights Reserved */ _PROTOTYPE(int TalkInit, (void)); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* screen.c Copyright Michael Temari 08/01/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <signal.h> #include <ctype.h> #include <string.h> #include <unistd.h> #include <curses.h> #include "screen.h" _PROTOTYPE(void gotsig, (int sig)); _PROTOTYPE(static char *delword, (WINDOW *w)); struct { WINDOW *win; char erase; char kill; char werase; } window[2]; static char line[80+1]; int ScreenDone = 0; static WINDOW *dwin; void gotsig(sig) int sig; { ScreenDone = 1; signal(sig, gotsig); } int ScreenInit() { int i; if(initscr() == (WINDOW *)NULL) { fprintf(stderr, "talk: Could not initscr\n"); return(-1); } signal(SIGINT, gotsig); signal(SIGQUIT, gotsig); signal(SIGPIPE, gotsig); signal(SIGHUP, gotsig); clear(); refresh(); noecho(); cbreak(); /* local window */ window[LOCALWIN].win = newwin(LINES / 2, COLS, 0, 0); scrollok(window[LOCALWIN].win, TRUE); wclear(window[LOCALWIN].win); /* divider between windows */ dwin = newwin(1, COLS, LINES / 2, 0); i = COLS; while(i-- > 0) waddch(dwin, '-'); wrefresh(dwin); /* remote window */ window[REMOTEWIN].win = newwin(LINES - (LINES / 2) - 1, COLS, LINES / 2 + 1, 0); scrollok(window[REMOTEWIN].win, TRUE); wclear(window[REMOTEWIN].win); return(0); } void ScreenMsg(msg) char *msg; { WINDOW *w; w =window[LOCALWIN].win; wmove(w, 0, 0); if(*msg != '\0') { wprintw(w, "[%s]", msg); wclrtoeol(w); } else werase(w); wrefresh(w); } void ScreenWho(user, host) char *user; char *host; { if(*host != '\0') { wmove(dwin, 0, (COLS - (1 + strlen(user) + 1 + strlen(host) + 1)) / 2); wprintw(dwin, " %s@%s ", user, host); } else { wmove(dwin, 0, (COLS - (1 + strlen(user) + 1)) / 2); wprintw(dwin, " %s ", user); } wrefresh(dwin); } void ScreenEdit(lcc, rcc) char lcc[]; char rcc[]; { window[LOCALWIN].erase = lcc[0]; window[LOCALWIN].kill = lcc[1]; window[LOCALWIN].werase = lcc[2]; window[REMOTEWIN].erase = rcc[0]; window[REMOTEWIN].kill = rcc[1]; window[REMOTEWIN].werase = rcc[2]; } void ScreenPut(data, len, win) char *data; int len; int win; { WINDOW *w; unsigned char ch; int r, c; w = window[win].win; while(len-- > 0) { ch = *data++; /* new line CR, NL */ if(ch == '\r' || ch == '\n') { waddch(w, '\n'); } else /* erase a character, BS, DEL */ if(ch == 0x08 || ch == 0x7f || ch == window[win].erase) { getyx(w, r, c); if(c > 0) c--; wmove(w, r, c); waddch(w, ' '); wmove(w, r, c); } else /* erase line CTL-U */ if(ch == 0x15 || ch == window[win].kill) { getyx(w, r, c); wmove(w, r, 0); wclrtoeol(w); } else /* refresh CTL-L */ if(ch == 0x0c) { if(win == LOCALWIN) { touchwin(w); wrefresh(w); touchwin(window[REMOTEWIN].win); wrefresh(window[REMOTEWIN].win); } } else /* bell CTL-G */ if(ch == 0x07) { putchar(ch); } else /* erase last word CTL-W */ if(ch == 0x17 || ch == window[win].werase) { (void) delword(w); } else { getyx(w, r, c); if(1 || isprint(ch)) { if(ch != ' ' && c == (COLS - 1)) wprintw(w, "\n%s", delword(w)); waddch(w, ch); } } } wrefresh(w); } static char *delword(w) WINDOW *w; { int r, c; int i = 0; char ch; char *p = &line[80]; *p-- = '\0'; getyx(w, r, c); if(c == 0) return; while(c >= 0) { c--; ch = mvwinch(w, r, c); if(ch == ' ') break; *p-- = ch; i = 1; waddch(w, ' '); } c += i; wmove(w, r, c); return(++p); } void ScreenEnd() { move(LINES - 1, 0); refresh(); endwin(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* screen.h Copyright Michael Temari 08/01/1996 All Rights Reserved */ _PROTOTYPE(int ScreenInit, (void)); _PROTOTYPE(void ScreenMsg, (char *msg)); _PROTOTYPE(void ScreenWho, (char *user, char *host)); _PROTOTYPE(void ScreenEdit, (char lcc[], char rcc[])); _PROTOTYPE(void ScreenPut, (char *data, int len, int mywin)); _PROTOTYPE(void ScreenEnd, (void)); extern int ScreenDone; #define LOCALWIN 0 #define REMOTEWIN 1 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* talk.c Copyright Michael Temari 08/01/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <signal.h> #include <utmp.h> #include <termios.h> #include <net/gen/netdb.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/udp.h> #include "talk.h" #include "proto.h" #include "net.h" #include "screen.h" _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(void DoTalk, (void)); int main(argc, argv) int argc; char *argv[]; { char *p; struct hostent *hp; struct stat st; struct utmp utmp; int slot; FILE *fp; if(argc < 2 || argc > 3) { fprintf(stderr, "Usage: talk user[@host] [tty]\n"); return(-1); } /* get local host name */ if(gethostname(lhost, HOST_SIZE) < 0) { fprintf(stderr, "talk: Error getting local host name\n"); return(-1); } /* get local user name and tty */ if((slot = ttyslot()) < 0) { fprintf(stderr, "talk: You are not on a terminal\n"); return(-1); } if((fp = fopen(UTMP, "r")) == (FILE *)NULL) { fprintf(stderr, "talk: Could not open %s\n", UTMP); return(-1); } if(fseek(fp, (off_t) sizeof(utmp) * slot, SEEK_SET)) { fprintf(stderr, "talk: Could not seek %s\n", UTMP); fclose(fp); return(-1); } if(fread((char *)&utmp, sizeof(utmp), 1 , fp) != 1) { fprintf(stderr, "talk: Could not read %s\n", UTMP); fclose(fp); return(-1); } fclose(fp); strncpy(luser, utmp.ut_user, USER_SIZE < sizeof(utmp.ut_user) ? USER_SIZE : sizeof(utmp.ut_user)); luser[USER_SIZE] = '\0'; /* get local tty */ if((p = ttyname(0)) == (char *)NULL) { fprintf(stderr, "talk: You are not on a terminal\n"); return(-1); } strncpy(ltty, p+5, TTY_SIZE); ltty[TTY_SIZE] = '\0'; /* check if local tty is going to be writable */ if(stat(p, &st) < 0) { perror("talk: Could not stat local tty"); return(-1); } if((st.st_mode & S_IWGRP) == 0) { fprintf(stderr, "talk: Your terminal is not writable. Use: mesg y\n"); return(-1); } /* get remote user and host name */ if((p = strchr(argv[1], '@')) != (char *)NULL) *p++ = '\0'; else p = lhost; strncpy(ruser, argv[1], USER_SIZE); ruser[USER_SIZE] = '\0'; strncpy(rhost, p, HOST_SIZE); rhost[HOST_SIZE] = '\0'; /* get remote tty */ if(argc > 2) strncpy(rtty, argv[2], TTY_SIZE); else rtty[0] = '\0'; rtty[TTY_SIZE] = '\0'; if((hp = gethostbyname(rhost)) == (struct hostent *)NULL) { fprintf(stderr, "talk: Could not determine address of %s\n", rhost); return(-1); } memcpy((char *)&raddr, (char *)hp->h_addr, hp->h_length); if(NetInit()) { fprintf(stderr, "talk: Error in NetInit\n"); return(-1); } if(ScreenInit()) return(-1); if(!TalkInit()) DoTalk(); ScreenEnd(); return(0); } struct pdata { int win; int len; char buffer[64]; } pdata; void DoTalk() { int s; int s2; int kid; int pfd[2]; int win; int len; struct termios termios; char lcc[3]; char rcc[3]; ScreenMsg(""); ScreenWho(ruser, rhost); /* Get and send edit characters */ s = tcgetattr(0, &termios); if(s < 0) { perror("talk: tcgetattr"); return; } lcc[0] = termios.c_cc[VERASE]; lcc[1] = termios.c_cc[VKILL]; lcc[2] = 0x17; /* Control - W */ s = write(tcp_fd, lcc, sizeof(lcc)); if(s != sizeof(lcc)) { ScreenMsg("Connection Closing due to error"); return; } s = read(tcp_fd, rcc, sizeof(rcc)); if(s != sizeof(rcc)) { ScreenMsg("Connection Closing due to error"); return; } ScreenEdit(lcc, rcc); s = pipe(pfd); if(s < 0) { ScreenMsg("Could not create pipes"); return; } if((kid = fork()) < 0) { ScreenMsg("Could not fork"); close(pfd[0]); close(pfd[1]); return; } if(kid == 0) { close(tcp_fd); close(pfd[1]); while(1) { s = read(pfd[0], &pdata, sizeof(pdata)); if(s != sizeof(pdata)) { close(pfd[0]); exit(-1); } ScreenPut(pdata.buffer, pdata.len, pdata.win); } } close(pfd[0]); if((kid = fork()) < 0) { ScreenMsg("Could not fork"); close(pfd[1]); return; } if(kid == 0) { pdata.win = REMOTEWIN; while(!ScreenDone) { s = read(tcp_fd, pdata.buffer, sizeof(pdata.buffer)); if(s <= 0) break; pdata.len = s; write(pfd[1], &pdata, sizeof(pdata)); } close(pfd[1]); close(tcp_fd); kill(getppid(), SIGINT); exit(-1); } pdata.win = LOCALWIN; while(!ScreenDone) { s = read(0, pdata.buffer, sizeof(pdata.buffer)); if(s <= 0) break; pdata.len = s; write(pfd[1], &pdata, sizeof(pdata)); s2 = write(tcp_fd, pdata.buffer, s); if(s2 != s) break; } kill(kid, SIGINT); close(pfd[1]); close(tcp_fd); return; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������/* talk.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ #define USER_SIZE 12 #define TTY_SIZE 16 #define HOST_SIZE 255 struct osockaddr { u16_t sa_family; u16_t sin_port; ipaddr_t sin_addr; char junk[8]; }; struct talk_request { u8_t version; u8_t type; u8_t answer; u8_t junk; u32_t id; struct osockaddr addr; struct osockaddr ctl_addr; long pid; char luser[USER_SIZE]; char ruser[USER_SIZE]; char rtty[TTY_SIZE]; }; struct talk_reply { u8_t version; u8_t type; u8_t answer; u8_t junk; u32_t id; struct osockaddr addr; }; #define TALK_VERSION 1 /* message type values */ #define LEAVE_INVITE 0 /* leave invitation with server */ #define LOOK_UP 1 /* check for invitation by callee */ #define DELETE 2 /* delete invitation by caller */ #define ANNOUNCE 3 /* announce invitation by caller */ /* answer values */ #define SUCCESS 0 /* operation completed properly */ #define NOT_HERE 1 /* callee not logged in */ #define FAILED 2 /* operation failed for unexplained reason */ #define MACHINE_UNKNOWN 3 /* caller's machine name unknown */ #define PERMISSION_DENIED 4 /* callee's tty doesn't permit announce */ #define UNKNOWN_REQUEST 5 /* request has invalid type value */ #define BADVERSION 6 /* request has invalid protocol version */ #define BADADDR 7 /* request has invalid addr value */ #define BADCTLADDR 8 /* request has invalid ctl_addr value */ #define MAX_LIFE 60 /* max time daemon saves invitations */ #define RING_WAIT 30 /* time to wait before resending invitation */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y .�������������..������������Z Makefile������[ finduser.c����\ finduser.h����] net.c���������^ net.h���������_ process.c�����` process.h�����a talk.h��������b talkd.c�������c talkd.h�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for talkd # # 07/22/96 Michael Temari, <temari@ix.netcom.com> # CFLAGS= -O -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i BINDIR= /usr/bin PROG= talkd OBJS= talkd.o net.o process.o finduser.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) install -S 8kw $@ clean: rm -f $(PROG) $(OBJS) install: $(BINDIR)/$(PROG) $(BINDIR)/$(PROG): $(PROG) install -cs -o bin $? $@ talkd.o: talkd.c talk.h talkd.h process.h net.h net.o: net.c talk.h talkd.h net.h process.o: process.c talk.h talkd.h finduser.h process.h finduser.o: finduser.c talk.h finduser.h ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* finduser.c Copyright Michael Temari 07/22/1996 All Rights Reserved */ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <time.h> #include <utmp.h> #include <net/gen/in.h> #include "talk.h" #include "finduser.h" int find_user(name, tty) char *name; char *tty; { int fd; int ret; struct utmp utmp; /* Now find out if the requested user is logged in. */ if((fd = open(UTMP, O_RDONLY)) < 0) { perror("talkd: opening UTMP file"); return(FAILED); } ret = NOT_HERE; while(read(fd, &utmp, sizeof(struct utmp)) == sizeof(struct utmp)) { if(utmp.ut_type != USER_PROCESS) continue; if(strncmp(utmp.ut_user, name, sizeof(utmp.ut_user))) continue; if(*tty && strncmp(utmp.ut_line, tty, sizeof(utmp.ut_line))) continue; strcpy(tty, utmp.ut_line); ret = SUCCESS; break; } close(fd); return(ret); } ����������������������������������������������������������������������������������������������������������������������/* finduser.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ _PROTOTYPE(int find_user, (char *name, char *tty)); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.c Copyright Michael Temari 07/22/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/ioctl.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/netdb.h> #include <net/gen/in.h> #include <net/gen/udp.h> #include <net/gen/udp_io.h> #include <net/gen/udp_hdr.h> #include "talk.h" #include "talkd.h" #include "net.h" static unsigned char buffer[8192]; static int udp_in; static int udp_out; static udpport_t ntalk_port; int NetInit() { int s; struct servent *servent; char *udp_device; nwio_udpopt_t udpopt; if((udp_device = getenv("UDP_DEVICE")) == (char *)NULL) udp_device = UDP_DEVICE; if((udp_in = open(udp_device, O_RDWR)) < 0) { fprintf(stderr, "talkd: Could not open %s: %s\n", udp_device, strerror(errno)); return(-1); } if((udp_out = open(udp_device, O_RDWR)) < 0) { fprintf(stderr, "talkd: Could not open %s: %s\n", udp_device, strerror(errno)); close(udp_in); return(-1); } if((servent = getservbyname("ntalk", "udp")) == (struct servent *)NULL) { fprintf(stderr, "talkd: Could not find ntalk udp service\n"); close(udp_in); close(udp_out); return(-1); } ntalk_port = (udpport_t)servent->s_port; udpopt.nwuo_flags = NWUO_NOFLAGS; udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC; udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_ANY | NWUO_RA_ANY; udpopt.nwuo_flags |= NWUO_RWDATALL | NWUO_DI_IPOPT; udpopt.nwuo_locport = ntalk_port; s = ioctl(udp_in, NWIOSUDPOPT, &udpopt); if(s < 0) { perror("talkd: ioctl NWIOSUDPOPT"); close(udp_in); close(udp_out); return(-1); } s = ioctl(udp_in, NWIOGUDPOPT, &udpopt); if(s < 0) { perror("talkd: ioctl NWIOGUDPOPT"); close(udp_in); close(udp_out); return(-1); } return(0); } int getrequest(request) struct talk_request *request; { int s; udp_io_hdr_t *udp_io_hdr; s = read(udp_in, buffer, sizeof(buffer)); if(s < 0) { perror("talkd: Read error in getrequest"); return(-1); } if(s < sizeof(udp_io_hdr_t)) { fprintf(stderr, "talkd: Packet size read %d is smaller the udp_io_hdr\n", s); return(-1); } udp_io_hdr = (udp_io_hdr_t *)buffer; s = s - sizeof(udp_io_hdr_t); /* why is uih_data_len already in host order??? */ if(udp_io_hdr->uih_data_len != s) { fprintf(stderr, "talkd: Size mismatch Packet %d Udp Data %d\n", s, udp_io_hdr->uih_data_len); return(-1); } if(s != sizeof(struct talk_request)) { fprintf(stderr, "talkd: Size mismatch in request %d %d\n", s, sizeof(struct talk_request)); return(-1); } memcpy((char *)request, buffer + sizeof(udp_io_hdr_t), s); if(opt_d) { fprintf(stderr, "Request: "); fprintf(stderr, "%02x %02x %02x %02x ", request->version, request->type, request->answer, request->junk); fprintf(stderr, "%08lx ", request->id); fprintf(stderr, "%04x %08lx:%04x\n", request->addr.sa_family, request->addr.sin_addr, request->addr.sin_port); fprintf(stderr, " %08lx ", request->pid); fprintf(stderr, "%04x %08lx:%04x\n", request->ctl_addr.sa_family, request->ctl_addr.sin_addr, request->ctl_addr.sin_port); fprintf(stderr, " %-12.12s %-12.12s %-16.16s\n", request->luser, request->ruser, request->rtty); } return(0); } int sendreply(request, reply) struct talk_request *request; struct talk_reply *reply; { int s; nwio_udpopt_t udpopt; udp_io_hdr_t *udp_io_hdr; udpopt.nwuo_flags = NWUO_NOFLAGS; udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC; udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET; udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT; udpopt.nwuo_locport = ntalk_port; udpopt.nwuo_remaddr = request->ctl_addr.sin_addr; udpopt.nwuo_remport = request->ctl_addr.sin_port; s = ioctl(udp_out, NWIOSUDPOPT, &udpopt); if(s < 0) { perror("talkd: ioctl NWIOSUDPOPT"); return(-1); } s = ioctl(udp_out, NWIOGUDPOPT, &udpopt); if(s < 0) { perror("talkd: ioctl NWIOGUDPOPT"); return(-1); } if(opt_d) { fprintf(stderr, "Reply: "); fprintf(stderr, "%02x %02x %02x %02x ", reply->version, reply->type, reply->answer, reply->junk); fprintf(stderr, "%08lx ", reply->id); fprintf(stderr, "%04x %08lx:%04x", reply->addr.sa_family, reply->addr.sin_addr, reply->addr.sin_port); fprintf(stderr, "\n"); } s = write(udp_out, reply, sizeof(struct talk_reply)); if(s < 0) { perror("talkd: write"); return(-1); } if(s != sizeof(struct talk_reply)) { fprintf(stderr, "talkd: write size mismatch %d %d\n", s, sizeof(struct talk_reply)); return(-1); } return(0); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ _PROTOTYPE(int NetInit, (void)); _PROTOTYPE(int getrequest, (struct talk_request *request)); _PROTOTYPE(int sendreply, (struct talk_request *request, struct talk_reply *reply)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* process.c Copyright Michael Temari 07/22/1996 All Rights Reserved */ #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #include <net/hton.h> #include <net/gen/socket.h> #include <net/gen/in.h> #include <net/gen/netdb.h> #include "talk.h" #include "talkd.h" #include "process.h" #include "finduser.h" struct entry { struct entry *prev; struct talk_request rq; time_t expire; struct entry *next; }; _PROTOTYPE(static int announce, (struct talk_request *request, char *rhost)); _PROTOTYPE(static struct talk_request *lookup, (struct talk_request *request, int type)); _PROTOTYPE(static int addreq, (struct talk_request *request)); _PROTOTYPE(static delete_invite, (long id)); _PROTOTYPE(static long nextid, (void)); _PROTOTYPE(static void delete, (struct entry *e)); static struct entry *entry = (struct entry *)NULL; int processrequest(request, reply) struct talk_request *request; struct talk_reply *reply; { char *p; struct talk_request *rq; struct hostent *hp; reply->version = TALK_VERSION; reply->type = request->type; reply->answer = 0; reply->junk = 0; reply->id = htonl(0); /* check version */ if(request->version != TALK_VERSION) { reply->answer = BADVERSION; return(0); } /* check address family */ if(ntohs(request->addr.sa_family) != AF_INET) { reply->answer = BADADDR; return(0); } /* check control address family */ if(ntohs(request->ctl_addr.sa_family) != AF_INET) { reply->answer = BADCTLADDR; return(0); } /* check local name */ p = request->luser; while(*p) if(!isprint(*p)) { reply->answer = FAILED; return(0); } else p++; switch(request->type) { case ANNOUNCE: reply->answer = find_user(request->ruser, request->rtty); if(reply->answer != SUCCESS) break; hp = gethostbyaddr((char *)&request->ctl_addr.sin_addr, sizeof(ipaddr_t), AF_INET); if(hp == (struct hostent *)NULL) { reply->answer = MACHINE_UNKNOWN; break; } if((rq = lookup(request, 1)) == (struct talk_request *)NULL) { reply->id = addreq(request); reply->answer = announce(request, hp->h_name); break; } if(ntohl(request->id) > ntohl(rq->id)) { rq->id = nextid(); reply->id = rq->id; reply->answer = announce(request, hp->h_name); } else { reply->id = rq->id; reply->answer = SUCCESS; } break; case LEAVE_INVITE: rq = lookup(request, 1); if(rq == (struct talk_request *)NULL) reply->id = addreq(request); else { reply->id = rq->id; reply->answer = SUCCESS; } break; case LOOK_UP: if((rq = lookup(request, 0)) == (struct talk_request *)NULL) reply->answer = NOT_HERE; else { reply->id = rq->id; memcpy((char *)&reply->addr, (char *)&rq->addr, sizeof(reply->addr)); reply->answer = SUCCESS; } break; case DELETE: reply->answer = delete_invite(request->id); break; default: reply->answer = UNKNOWN_REQUEST; } return(0); } static int announce(request, rhost) struct talk_request *request; char *rhost; { char tty[5+TTY_SIZE+1]; struct stat st; FILE *fp; time_t now; struct tm *tm; sprintf(tty, "/dev/%s", request->rtty); if(stat(tty, &st) < 0) return(PERMISSION_DENIED); if(!(st.st_mode & S_IWGRP)) return(PERMISSION_DENIED); if((fp = fopen(tty, "w")) == (FILE *)NULL) return(PERMISSION_DENIED); (void) time(&now); tm = localtime(&now); fprintf(fp, "\007\007\007\rtalkd: Message from talkd@%s at %d:%02d:%02d\r\n", myhostname, tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "talkd: %s@%s would like to talk to you\r\n", request->luser, rhost); fprintf(fp, "talkd: to answer type: talk %s@%s\r\n", request->luser, rhost); fclose(fp); return(SUCCESS); } static struct talk_request *lookup(request, type) struct talk_request *request; int type; { time_t now; struct entry *e; (void) time(&now); for(e = entry; e != (struct entry *)NULL; e = e->next) { if(now > e->expire) { delete(e); continue; } if(type == 0) { if(!strncmp(request->luser, e->rq.ruser, USER_SIZE) && !strncmp(request->ruser, e->rq.luser, USER_SIZE) && e->rq.type == LEAVE_INVITE) return(&e->rq); } else { if(request->type == e->rq.type && request->pid == e->rq.pid && !strncmp(request->luser, e->rq.luser, USER_SIZE) && !strncmp(request->ruser, e->rq.ruser, USER_SIZE)) { e->expire = now + MAX_LIFE; return(&e->rq); } } } return((struct talk_request *)NULL); } static int addreq(request) struct talk_request *request; { time_t now; struct entry *e; (void) time(&now); request->id = nextid(); e = (struct entry *) malloc(sizeof(struct entry)); if(e == (struct entry *)NULL) { fprintf(stderr, "talkd: out of memory in insert table\n"); exit(1); } e->expire = now + MAX_LIFE; memcpy((char *)&e->rq, (char *)request, sizeof(struct talk_request)); e->next = entry; if(e->next != (struct entry *)NULL) e->next->prev = e; e->prev = (struct entry *)NULL; entry = e; return(request->id); } static int delete_invite(id) long id; { time_t now; struct entry *e; (void) time(&now); for(e = entry; e != (struct entry *)NULL; e = e->next) { if(now > e->expire) { delete(e); continue; } if(e->rq.id == id) { delete(e); return(SUCCESS); } } return(NOT_HERE); } static void delete(e) struct entry *e; { if(e == (struct entry *)NULL) return; if(entry == e) entry = e->next; else if(e->prev != (struct entry *)NULL) e->prev->next = e->next; if(e->next != (struct entry *)NULL) e->next->prev = e->prev; free((char *)e); return; } static long nextid() { static long id = 0; id++; if(id <= 0) id = 1; return(htonl(id)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* process.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ _PROTOTYPE(int processrequest, (struct talk_request *request, struct talk_reply *reply)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* talk.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ #define USER_SIZE 12 #define TTY_SIZE 16 #define HOST_SIZE 255 struct osockaddr { u16_t sa_family; u16_t sin_port; ipaddr_t sin_addr; char junk[8]; }; struct talk_request { u8_t version; u8_t type; u8_t answer; u8_t junk; u32_t id; struct osockaddr addr; struct osockaddr ctl_addr; long pid; char luser[USER_SIZE]; char ruser[USER_SIZE]; char rtty[TTY_SIZE]; }; struct talk_reply { u8_t version; u8_t type; u8_t answer; u8_t junk; u32_t id; struct osockaddr addr; }; #define TALK_VERSION 1 /* message type values */ #define LEAVE_INVITE 0 /* leave invitation with server */ #define LOOK_UP 1 /* check for invitation by callee */ #define DELETE 2 /* delete invitation by caller */ #define ANNOUNCE 3 /* announce invitation by caller */ /* answer values */ #define SUCCESS 0 /* operation completed properly */ #define NOT_HERE 1 /* callee not logged in */ #define FAILED 2 /* operation failed for unexplained reason */ #define MACHINE_UNKNOWN 3 /* caller's machine name unknown */ #define PERMISSION_DENIED 4 /* callee's tty doesn't permit announce */ #define UNKNOWN_REQUEST 5 /* request has invalid type value */ #define BADVERSION 6 /* request has invalid protocol version */ #define BADADDR 7 /* request has invalid addr value */ #define BADCTLADDR 8 /* request has invalid ctl_addr value */ #define MAX_LIFE 60 /* max time daemon saves invitations */ #define RING_WAIT 30 /* time to wait before resending invitation */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* talkd.c Copyright Michael Temari 07/22/1996 All Rights Reserved */ #include <sys/types.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <net/gen/in.h> #include "talk.h" #include "talkd.h" #include "net.h" #include "process.h" _PROTOTYPE(int main, (int argc, char *argv[])); int opt_d = 0; char myhostname[HOST_SIZE+1]; int main(argc, argv) int argc; char *argv[]; { struct talk_request request; struct talk_reply reply; if(argc > 1) if(strcmp(argv[1], "-d") || argc > 2) { fprintf(stderr, "Usage: talkd [-d]\n"); return(-1); } else opt_d = 1; if(getuid() != 0) { fprintf(stderr, "talkd: Must be run as super user\n"); return(-1); } if(gethostname(myhostname, HOST_SIZE) < 0) { fprintf(stderr, "talkd: Error getting hostname\n"); return(-1); } if(NetInit()) { fprintf(stderr, "talkd: Error in NetInit\n"); return(-1); } while(getrequest(&request) == 0) { if(processrequest(&request, &reply)) break; if(sendreply(&request, &reply)) break; } return(-1); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* talkd.h Copyright Michael Temari 07/22/1996 All Rights Reserved */ extern int opt_d; /* debug option */ extern char myhostname[]; ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d .�������������..������������e Makefile������f ttn.c���������g ttn.h���������h ttn_conf.c��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for telnet CFLAGS= -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i SRC= ttn.c ttn_conf.c all: ttn ttn: $(SRC) $(CC) $(CFLAGS) $(LDFLAGS) -o ttn $(SRC) install -S 4kw $@ clean: rm -f ttn install: /usr/bin/telnet /usr/bin/telnet: ttn install -cs -o bin ttn $@ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ttn.c */ #ifndef _POSIX_SOURCE #define _POSIX_SOURCE 1 #endif #include <sys/types.h> #include <sys/ioctl.h> #include <assert.h> #include <errno.h> #include <fcntl.h> #include <termios.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/hton.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/netdb.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include "ttn.h" #if __STDC__ #define PROTOTYPE(func,args) func args #else #define PROTOTYPE(func,args) func() #endif PROTOTYPE (int main, (int argc, char *argv[]) ); static int do_read(int fd, char *buf, unsigned len); static void screen(void); static void keyboard (void); static int process_opt (char *bp, int count); static void do_option (int optsrt); static void dont_option (int optsrt); static void will_option (int optsrt); static void wont_option (int optsrt); static int writeall (int fd, char *buffer, int buf_size); static int sb_termtype (char *sb, int count); #if DEBUG #define where() (fprintf(stderr, "%s %d:", __FILE__, __LINE__)) #endif static char *prog_name; static tcp_fd; static char *term_env; main(argc, argv) int argc; char *argv[]; { struct hostent *hostent; struct servent *servent; ipaddr_t host; tcpport_t port; int pid, ppid; nwio_tcpconf_t tcpconf; int result, count; nwio_tcpcl_t tcpconnopt; char buffer[1024]; struct termios termios; char *tcp_device; prog_name= argv[0]; if (argc <2 || argc>3) { fprintf(stderr, "Usage: %s host <port>\r\n", argv[0]); exit(1); } hostent= gethostbyname(argv[1]); if (!hostent) { host= inet_addr(argv[1]); if (host == -1) { fprintf(stderr, "%s: unknown host (%s)\r\n", argv[0], argv[1]); exit(1); } } else host= *(ipaddr_t *)(hostent->h_addr); if (argc < 3) port= htons(TCPPORT_TELNET); else { servent= getservbyname (argv[2], "tcp"); if (!servent) { port= htons(strtol (argv[2], (char **)0, 0)); if (!port) { fprintf(stderr, "%s: unknown port (%s)\r\n", argv[0], argv[2]); exit(1); } } else port= (tcpport_t)(servent->s_port); } fprintf(stderr, "Connecting to %s:%u...\r\n", inet_ntoa(host), ntohs(port)); tcp_device= getenv("TCP_DEVICE"); if (tcp_device == NULL) tcp_device= TCP_DEVICE; tcp_fd= open (tcp_device, O_RDWR); if (tcp_fd<0) { perror ("unable to open /dev/tcp"); exit(1); } tcpconf.nwtc_flags= NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr= host; tcpconf.nwtc_remport= port; result= ioctl (tcp_fd, NWIOSTCPCONF, &tcpconf); if (result<0) { perror ("unable to NWIOSTCPCONF"); exit(1); } tcpconnopt.nwtcl_flags= 0; do { result= ioctl (tcp_fd, NWIOTCPCONN, &tcpconnopt); if (result < 0 && errno == EAGAIN) { fprintf(stderr,"%s: got EAGAIN, sleeping(1s)\r\n", prog_name); sleep(1); } } while (result <0 && errno == EAGAIN); if (result<0) { perror ("unable to NWIOTCPCONN"); exit(1); } fprintf(stderr, "Connected\r\n"); ppid= getpid(); pid= fork(); switch(pid) { case 0: keyboard(); #if DEBUG fprintf(stderr, "killing %d with %d\r\n", ppid, SIGKILL); #endif kill(ppid, SIGKILL); break; case -1: fprintf(stderr, "%s: fork failed: %s\r\n", argv[0], strerror(errno)); exit(1); break; default: tcgetattr(0, &termios); screen(); #if DEBUG fprintf(stderr, "killing %d with %d\r\n", pid, SIGKILL); #endif kill(pid, SIGKILL); tcsetattr(0, TCSANOW, &termios); break; } } static int do_read(fd, buf, len) int fd; char *buf; unsigned len; { nwio_tcpopt_t tcpopt; int count; for (;;) { count= read (fd, buf, len); if (count <0) { if (errno == EURG || errno == ENOURG) { /* Toggle urgent mode. */ tcpopt.nwto_flags= errno == EURG ? NWTO_RCV_URG : NWTO_RCV_NOTURG; if (ioctl(tcp_fd, NWIOSTCPOPT, &tcpopt) == -1) { return -1; } continue; } return -1; } return count; } } static void screen() { char buffer[1024], *bp, *iacptr; int count, optsize; for (;;) { count= do_read (tcp_fd, buffer, sizeof(buffer)); #if DEBUG && 0 { where(); fprintf(stderr, "read %d bytes\r\n", count); } #endif if (count <0) { perror ("read"); return; } if (!count) return; bp= buffer; do { iacptr= memchr (bp, IAC, count); if (!iacptr) { write(1, bp, count); count= 0; } if (iacptr && iacptr>bp) { #if DEBUG { where(); fprintf(stderr, "iacptr-bp= %d\r\n", iacptr-bp); } #endif write(1, bp, iacptr-bp); count -= (iacptr-bp); bp= iacptr; continue; } if (iacptr) { assert (iacptr == bp); optsize= process_opt(bp, count); #if DEBUG && 0 { where(); fprintf(stderr, "process_opt(...)= %d\r\n", optsize); } #endif if (optsize<0) return; assert (optsize); bp += optsize; count -= optsize; } } while (count); } } static void keyboard() { nwio_tcpatt_t nwio_tcpatt; char buffer[1024]; int result; int count; nwio_tcpatt.nwta_flags= 0; for (;;) { count= read (0, buffer, sizeof(buffer)); if (count<0) { fprintf(stderr, "%s: read: %s\r\n", prog_name, strerror(errno)); return; } if (!count) return; #if DEBUG && 0 { where(); fprintf(stderr, "writing %d bytes\r\n", count); } #endif count= write(tcp_fd, buffer, count); #if 0 if (buffer[0] == '\r') write(tcp_fd, "\n", 1); #endif if (count<0) { perror("write"); return; } if (!count) return; } } #define next_char(var) \ if (offset<count) { (var) = bp[offset++]; } \ else if (do_read(tcp_fd, (char *)&(var), 1) <= 0) \ { perror ("read"); return -1; } static int process_opt (char *bp, int count) { unsigned char iac, command, optsrt, sb_command; int offset, result; ; #if DEBUG && 0 { where(); fprintf(stderr, "process_opt(bp= 0x%x, count= %d)\r\n", bp, count); } #endif offset= 0; assert (count); next_char(iac); assert (iac == IAC); next_char(command); switch(command) { case IAC_NOP: break; case IAC_DataMark: /* Ought to flush input queue or something. */ break; case IAC_BRK: fprintf(stderr, "got a BRK\r\n"); break; case IAC_IP: fprintf(stderr, "got a IP\r\n"); break; case IAC_AO: fprintf(stderr, "got a AO\r\n"); break; case IAC_AYT: fprintf(stderr, "got a AYT\r\n"); break; case IAC_EC: fprintf(stderr, "got a EC\r\n"); break; case IAC_EL: fprintf(stderr, "got a EL\r\n"); break; case IAC_GA: fprintf(stderr, "got a GA\r\n"); break; case IAC_SB: next_char(sb_command); switch (sb_command) { case OPT_TERMTYPE: #if DEBUG && 0 fprintf(stderr, "got SB TERMINAL-TYPE\r\n"); #endif result= sb_termtype(bp+offset, count-offset); if (result<0) return result; else return result+offset; default: fprintf(stderr, "got an unknown SB (skiping)\r\n"); for (;;) { next_char(iac); if (iac != IAC) continue; next_char(optsrt); if (optsrt == IAC) continue; if (optsrt != IAC_SE) fprintf(stderr, "got IAC %d\r\n", optsrt); break; } } break; case IAC_WILL: next_char(optsrt); will_option(optsrt); break; case IAC_WONT: next_char(optsrt); wont_option(optsrt); break; case IAC_DO: next_char(optsrt); do_option(optsrt); break; case IAC_DONT: next_char(optsrt); dont_option(optsrt); break; case IAC: fprintf(stderr, "got a IAC\r\n"); break; default: fprintf(stderr, "got unknown command (%d)\r\n", command); } return offset; } static void do_option (int optsrt) { unsigned char reply[3], *rp; int count, result; switch (optsrt) { case OPT_TERMTYPE: if (WILL_terminal_type) return; if (!WILL_terminal_type_allowed) { reply[0]= IAC; reply[1]= IAC_WONT; reply[2]= optsrt; } else { WILL_terminal_type= TRUE; term_env= getenv("TERM"); if (!term_env) term_env= "unknown"; reply[0]= IAC; reply[1]= IAC_WILL; reply[2]= optsrt; } break; default: #if DEBUG { where(); fprintf(stderr, "got a DO (%d)\r\n", optsrt); } #endif #if DEBUG { where(); fprintf(stderr, "WONT (%d)\r\n", optsrt); } #endif reply[0]= IAC; reply[1]= IAC_WONT; reply[2]= optsrt; break; } result= writeall(tcp_fd, (char *)reply, 3); if (result<0) R��R��R��R���S���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� perror("write"); } static void will_option (int optsrt) { unsigned char reply[3], *rp; int count, result; switch (optsrt) { case OPT_ECHO: if (DO_echo) break; if (!DO_echo_allowed) { reply[0]= IAC; reply[1]= IAC_DONT; reply[2]= optsrt; } else { struct termios termios; tcgetattr(0, &termios); termios.c_iflag &= ~(ICRNL|IGNCR|INLCR|IXON|IXOFF); termios.c_oflag &= ~(OPOST); termios.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN|ISIG); tcsetattr(0, TCSANOW, &termios); DO_echo= TRUE; reply[0]= IAC; reply[1]= IAC_DO; reply[2]= optsrt; } result= writeall(tcp_fd, (char *)reply, 3); if (result<0) perror("write"); break; case OPT_SUPP_GA: if (DO_suppress_go_ahead) break; if (!DO_suppress_go_ahead_allowed) { reply[0]= IAC; reply[1]= IAC_DONT; reply[2]= optsrt; } else { DO_suppress_go_ahead= TRUE; reply[0]= IAC; reply[1]= IAC_DO; reply[2]= optsrt; } result= writeall(tcp_fd, (char *)reply, 3); if (result<0) perror("write"); break; default: #if DEBUG { where(); fprintf(stderr, "got a WILL (%d)\r\n", optsrt); } #endif #if DEBUG { where(); fprintf(stderr, "DONT (%d)\r\n", optsrt); } #endif reply[0]= IAC; reply[1]= IAC_DONT; reply[2]= optsrt; result= writeall(tcp_fd, (char *)reply, 3); if (result<0) perror("write"); break; } } static int writeall (fd, buffer, buf_size) int fd; char *buffer; int buf_size; { int result; while (buf_size) { result= write (fd, buffer, buf_size); if (result <= 0) return -1; assert (result <= buf_size); buffer += result; buf_size -= result; } return 0; } static void dont_option (int optsrt) { unsigned char reply[3], *rp; int count, result; switch (optsrt) { default: #if DEBUG { where(); fprintf(stderr, "got a DONT (%d)\r\n", optsrt); } #endif break; } } static void wont_option (int optsrt) { unsigned char reply[3], *rp; int count, result; switch (optsrt) { default: #if DEBUG { where(); fprintf(stderr, "got a WONT (%d)\r\n", optsrt); } #endif break; } } static int sb_termtype (char *bp, int count) { unsigned char command, iac, optsrt; unsigned char buffer[4]; int offset, result; offset= 0; next_char(command); if (command == TERMTYPE_SEND) { buffer[0]= IAC; buffer[1]= IAC_SB; buffer[2]= OPT_TERMTYPE; buffer[3]= TERMTYPE_IS; result= writeall(tcp_fd, (char *)buffer,4); if (result<0) return result; count= strlen(term_env); if (!count) { term_env= "unknown"; count= strlen(term_env); } result= writeall(tcp_fd, term_env, count); if (result<0) return result; buffer[0]= IAC; buffer[1]= IAC_SE; result= writeall(tcp_fd, (char *)buffer,2); if (result<0) return result; } else { #if DEBUG where(); #endif fprintf(stderr, "got an unknown command (skipping)\r\n"); } for (;;) { next_char(iac); if (iac != IAC) continue; next_char(optsrt); if (optsrt == IAC) continue; if (optsrt != IAC_SE) { #if DEBUG where(); #endif fprintf(stderr, "got IAC %d\r\n", optsrt); } break; } return offset; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ttn.h */ #ifndef TTN_H #define TTN_H #define IAC 255 #define IAC_SE 240 #define IAC_NOP 241 #define IAC_DataMark 242 #define IAC_BRK 243 #define IAC_IP 244 #define IAC_AO 245 #define IAC_AYT 246 #define IAC_EC 247 #define IAC_EL 248 #define IAC_GA 249 #define IAC_SB 250 #define IAC_WILL 251 #define IAC_WONT 252 #define IAC_DO 253 #define IAC_DONT 254 #define OPT_ECHO 1 #define OPT_SUPP_GA 3 #define OPT_TERMTYPE 24 #define TERMTYPE_SEND 1 #define TERMTYPE_IS 0 #define FALSE 0 #define TRUE (!(FALSE)) extern int DO_echo; extern int DO_echo_allowed; extern int WILL_terminal_type; extern int WILL_terminal_type_allowed; extern int DO_suppress_go_ahead; extern int DO_suppress_go_ahead_allowed; extern int WILL_suppress_go_ahead; extern int WILL_suppress_go_ahead_allowed; #endif /* TTN_H */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* ttn_conf.c */ #include "ttn.h" int DO_echo= FALSE; int DO_echo_allowed= TRUE; int WILL_terminal_type= FALSE; int WILL_terminal_type_allowed= TRUE; int DO_suppress_go_ahead= FALSE; int DO_suppress_go_ahead_allowed= TRUE; �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������i .�������������..������������j Makefile������k main.c��������l pty.c���������m telnet.c������n telnet.h������o telnetd.h�����p term.c��������q wtmp.c��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for telnetd # # 01/30/96 Initial Release Michael Temari, <temari@ix.netcom.com> # CFLAGS= -O -D_MINIX -D_POSIX_SOURCE LDFLAGS=-i BINDIR= /usr/bin PROG= in.telnetd OBJS= main.o telnet.o term.o pty.o wtmp.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) install -S 8kw $@ clean: rm -f $(PROG) $(OBJS) install: $(BINDIR)/$(PROG) $(BINDIR)/$(PROG): $(PROG) install -cs -o bin $? $@ main.o: main.c telnetd.h telnet.o: telnet.c telnetd.h telnet.h term.o: term.c telnetd.h telnet.h pty.o: pty.c telnetd.h wtmp.o: telnetd.h ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * This file contains an implementation of the "server" * for the TELNET protocol. This protocol can be used to * remote-login on other systems, just like a normal TTY * session. * * Usage: telnetd [-dv] * * Version: @(#)telnetd.c 1.00 07/26/92 * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Michael Temari, <temari@temari.ae.ge.com> */ #include <sys/types.h> #include <fcntl.h> #include <sys/wait.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <time.h> #include <stdio.h> #include <ttyent.h> #include <utmp.h> #include <net/gen/in.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include <net/gen/inet.h> #include "telnetd.h" static char *Version = "@(#) telnetd 1.00 (07/26/92)"; int opt_d = 0; /* debugging output flag */ _PROTOTYPE(void usage, (void)); _PROTOTYPE(int main, (int argc, char *argv[])); _PROTOTYPE(void wtmp, (int type, int linenr, char *line, pid_t pid, char *host)); void usage() { fprintf(stderr, "Usage: telnetd [-dv]\n"); exit(-1); } int main(argc, argv) int argc; char *argv[]; { char buff[128]; register int c; int pty_fd; int tty_fd; pid_t pid; int lineno; char *tty_name; struct ttyent *ttyp; nwio_tcpconf_t tcpconf; struct hostent *hostent; char *hostname; opterr = 0; while ((c = getopt(argc, argv, "dv")) != EOF) switch(c) { case 'd': case 'v': opt_d = 1; break; default: usage(); } /* No more arguments allowed. */ if (optind != argc) usage(); /* Obtain the name of the remote host. */ if (ioctl(0, NWIOGTCPCONF, &tcpconf) < 0) { sprintf(buff, "Unable to obtain your IP address\r\n"); (void) write(1, buff, strlen(buff)); return(-1); } if ((hostent = gethostbyaddr((char *) &tcpconf.nwtc_remaddr, sizeof(tcpconf.nwtc_remaddr), AF_INET)) != NULL) { hostname = hostent->h_name; } else { hostname = inet_ntoa(tcpconf.nwtc_remaddr); } /* Try allocating a PTY. */ if (get_pty(&pty_fd, &tty_name) < 0) { sprintf(buff, "I am sorry, but there is no free PTY left!\r\n"); (void) write(1, buff, strlen(buff)); return(-1); } /* Find the tty in the tty table. */ lineno = 0; for (;;) { if ((ttyp = getttyent()) == NULL) { sprintf(buff, "Can't find %s in the tty table\r\n"); (void) write(1, buff, strlen(buff)); } if (strcmp(ttyp->ty_name, tty_name+5) == 0) break; lineno++; } endttyent(); /* Initialize the connection to an 8 bit clean channel. */ term_init(); /* Fork off a child process and have it execute a getty(8). */ if ((pid = fork()) == 0) { /* Set up a new session. */ setsid(); if ((tty_fd = open(tty_name, O_RDWR)) < 0) { sprintf(buff, "Can't open %s\r\n", tty_name); (void) write(1, buff, strlen(buff)); return(-1); } close(pty_fd); dup2(tty_fd, 0); dup2(tty_fd, 1); dup2(tty_fd, 2); close(tty_fd); (void) execl("/usr/sbin/getty", "getty", (char *)NULL); (void) execl("/usr/bin/getty", "getty", (char *)NULL); (void) execl("/usr/bin/login", "login", (char *)NULL); (void) write(1, "EXEC failed!\r\n", 14); } else if (pid < 0) { sprintf(buff, "I am sorry, but the fork(2) call failed!\r\n"); (void) write(1, buff, strlen(buff)); (void) close(pty_fd); return(-1); } wtmp(LOGIN_PROCESS, lineno, tty_name+5, pid, hostname); term_inout(pty_fd); (void) close(pty_fd); wtmp(DEAD_PROCESS, lineno, tty_name+5, pid, hostname); chown(tty_name, 0, 0); chmod(tty_name, 0666); return(0); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * Handle the allocation of a PTY. * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> */ #include <sys/types.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include "telnetd.h" #define DEV_DIR "/dev" /* * Allocate a PTY, by trying to open one repeatedly, * until all PTY channels are done. If at that point * no PTY is found, go into panic mode :-( */ int get_pty(pty_fdp, tty_namep) int *pty_fdp; char **tty_namep; { char buff[128], temp[128]; register int i, j; int pty_fd; static char tty_name[128]; for(i = 'p'; i < 'w'; i++) { j = 0; do { sprintf(buff, "%s/pty%c%c", DEV_DIR, i, (j < 10) ? j + '0' : j + 'a' - 10); if (opt_d == 1) { (void) write(2, "Testing: ", 9); (void) write(2, buff, strlen(buff)); (void) write(2, "...: ", 5); } pty_fd = open(buff, O_RDWR); if (opt_d == 1) { if (pty_fd < 0) sprintf(temp, "error %d\r\n", errno); else sprintf(temp, "OK\r\n"); (void) write(2, temp, strlen(temp)); } if (pty_fd >= 0) break; j++; if (j == 16) break; } while(1); /* Did we find one? */ if (j < 16) break; } if (pty_fd < 0) return(-1); if (opt_d == 1) { sprintf(temp, "File %s, desc %d\n", buff, pty_fd); (void) write(1, temp, strlen(temp)); } sprintf(tty_name, "%s/tty%c%c", DEV_DIR, i, (j < 10) ? j + '0' : j + 'a' - 10); *pty_fdp = pty_fd; *tty_namep = tty_name; return(0); } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * This module handles telnet option processing. * * Author: Michael Temari, <temari@temari.ae.ge.com> 01/13/93 * */ #include <sys/types.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include "telnetd.h" #include "telnet.h" #include <stdio.h> #define IN_DATA 0 #define IN_CR 1 #define IN_IAC 2 #define IN_IAC2 3 _PROTOTYPE(static void dowill, (int c)); _PROTOTYPE(static void dowont, (int c)); _PROTOTYPE(static void dodo, (int c)); _PROTOTYPE(static void dodont, (int c)); _PROTOTYPE(static void respond, (int ack, int option)); #define LASTTELOPT TELOPT_SGA static int TelROpts[LASTTELOPT+1]; static int TelLOpts[LASTTELOPT+1]; static int telfdout; void tel_init() { int i; for(i = 0; i <= LASTTELOPT; i++) { TelROpts[i] = 0; TelLOpts[i] = 0; } } void telopt(fdout, what, option) int fdout; int what; int option; { char buf[3]; int len; buf[0] = IAC; buf[1] = what; buf[2] = option; len = 0; switch(what) { case DO: if(option <= LASTTELOPT) { TelROpts[option] = 1; len = 3; } break; case DONT: if(option <= LASTTELOPT) { TelROpts[option] = 1; len = 3; } break; case WILL: if(option <= LASTTELOPT) { TelLOpts[option] = 1; len = 3; } break; case WONT: if(option <= LASTTELOPT) { TelLOpts[option] = 1; len = 3; } break; } if(len > 0) (void) write(fdout, buf, len); } int tel_in(fdout, telout, buffer, len) int fdout; int telout; char *buffer; int len; { static int InState = IN_DATA; static int ThisOpt = 0; char *p; char *p2; int size; int c; telfdout = telout; p = p2 = buffer; size = 0; while(len > 0) { c = (unsigned char)*p++; len--; switch(InState) { case IN_CR: InState = IN_DATA; if(c == 0 || c == '\n') break; /* fall through */ case IN_DATA: if(c == IAC) { InState = IN_IAC; break; } *p2++ = c; size++; if(c == '\r') InState = IN_CR; break; case IN_IAC: switch(c) { case IAC: *p2++ = c; size++; InState = IN_DATA; break; case WILL: case WONT: case DO: case DONT: InState = IN_IAC2; ThisOpt = c; break; case EOR: case SE: case NOP: case BREAK: case IP: case AO: case AYT: case EC: case EL: case GA: case SB: break; default: break; } break; case IN_IAC2: if(size > 0) { write(fdout, buffer, size); p2 = buffer; size = 0; } InState = IN_DATA; switch(ThisOpt) { case WILL: dowill(c); break; case WONT: dowont(c); break; case DO: dodo(c); break; case DONT: dodont(c); break; } break; } } if(size > 0) write(fdout, buffer, size); } int tel_out(fdout, buf, size) int fdout; char *buf; int size; { char *p; int got_iac, len; p = buf; while(size > 0) { buf = p; got_iac = 0; if((p = (char *)memchr(buf, IAC, size)) != (char *)NULL) { got_iac = 1; p++; } else p = buf + size; len = p - buf; if(len > 0) (void) write(fdout, buf, len); if(got_iac) (void) write(fdout, p - 1, 1); size = size - len; } } static void dowill(c) int c; { int ack; switch(c) { case TELOPT_BINARY: case TELOPT_ECHO: case TELOPT_SGA: if(TelROpts[c] == 1) return; TelROpts[c] = 1; ack = DO; break; default: ack = DONT; } respond(ack, c); } static void dowont(c) int c; { if(c <= LASTTELOPT) { if(TelROpts[c] == 0) return; TelROpts[c] = 0; } respond(DONT, c); } static void dodo(c) int c; { int ack; switch(c) { default: ack = WONT; } respond(ack, c); } static void dodont(c) int c; { if(c <= LASTTELOPT) { if(TelLOpts[c] == 0) return; TelLOpts[c] = 0; } respond(WONT, c); } static void respond(ack, option) int ack, option; { unsigned char c[3]; c[0] = IAC; c[1] = ack; c[2] = option; /* write(telfdout, c, 3); */ } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * Definitions for the TELNET protocol (see RFC XXX). * * Version: @(#)arpa/telnet.h 1.00 07/02/92 * * Authors: Original taken from BSD 4.3/TAHOE. * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> */ #ifndef _ARPA_TELNET_H #define _ARPA_TELNET_H #define IAC 255 /* interpret as command: */ #define DONT 254 /* you are not to use option */ #define DO 253 /* please, you use option */ #define WONT 252 /* I won't use option */ #define WILL 251 /* I will use option */ #define SB 250 /* interpret as subnegotiation */ #define GA 249 /* you may reverse the line */ #define EL 248 /* erase the current line */ #define EC 247 /* erase the current character */ #define AYT 246 /* are you there */ #define AO 245 /* abort output--but let prog finish */ #define IP 244 /* interrupt process--permanently */ #define BREAK 243 /* break */ #define DM 242 /* data mark--for connect. cleaning */ #define NOP 241 /* nop */ #define SE 240 /* end sub negotiation */ #define EOR 239 /* end of record (transparent mode) */ #define SYNCH 242 /* for telfunc calls */ /* Telnet options. */ #define TELOPT_BINARY 0 /* 8-bit data path */ #define TELOPT_ECHO 1 /* echo */ #define TELOPT_RCP 2 /* prepare to reconnect */ #define TELOPT_SGA 3 /* suppress go ahead */ #define TELOPT_NAMS 4 /* approximate message size */ #define TELOPT_STATUS 5 /* give status */ #define TELOPT_TM 6 /* timing mark */ #define TELOPT_RCTE 7 /* remote controlled transmission and echo */ #define TELOPT_NAOL 8 /* negotiate about output line width */ #define TELOPT_NAOP 9 /* negotiate about output page size */ #define TELOPT_NAOCRD 10 /* negotiate about CR disposition */ #define TELOPT_NAOHTS 11 /* negotiate about horizontal tabstops */ #define TELOPT_NAOHTD 12 /* negotiate about horizontal tab disposition */ #define TELOPT_NAOFFD 13 /* negotiate about formfeed disposition */ #define TELOPT_NAOVTS 14 /* negotiate about vertical tab stops */ #define TELOPT_NAOVTD 15 /* negotiate about vertical tab disposition */ #define TELOPT_NAOLFD 16 /* negotiate about output LF disposition */ #define TELOPT_XASCII 17 /* extended ascic character set */ #define TELOPT_LOGOUT 18 /* force logout */ #define TELOPT_BM 19 /* byte macro */ #define TELOPT_DET 20 /* data entry terminal */ #define TELOPT_SUPDUP 21 /* supdup protocol */ #define TELOPT_SUPDUPOUTPUT 22 /* supdup output */ #define TELOPT_SNDLOC 23 /* send location */ #define TELOPT_TTYPE 24 /* terminal type */ #define TELOPT_EOR 25 /* end or record */ #define TELOPT_EXOPL 255 /* extended-options-list */ /* Sub-option qualifiers. */ #define TELQUAL_IS 0 /* option is... */ #define TELQUAL_SEND 1 /* send option */ #endif /* _ARPA_TELNET_H */ ����������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * Definitions for the TELNET server. * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> */ extern int opt_d; /* debugging flag */ _PROTOTYPE(int get_pty, (int *, char **)); _PROTOTYPE(void term_init, (void)); _PROTOTYPE(void term_inout, (int pty_fd)); _PROTOTYPE(void tel_init, (void)); _PROTOTYPE(void telopt, (int fdout, int what, int option)); _PROTOTYPE(int tel_in, (int fdout, int telout, char *buffer, int len)); _PROTOTYPE(int tel_out, (int fdout, char *buf, int size)); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * Handle the TERMINAL module. * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Michael Temari, <temari@temari.ae.ge.com> * * 07/29/92 MT Telnet options hack which seems to work okay * 01/12/93 MT Better telnet options processing instead of hack */ #include <sys/types.h> #include <errno.h> #if 0 #include <fcntl.h> #endif #include <stdlib.h> #include <unistd.h> #include <string.h> #include <stdio.h> #include <signal.h> #include "telnet.h" #include "telnetd.h" _PROTOTYPE(void sig_done, (int sig)); static char buff[4096]; void term_init() { tel_init(); telopt(1, WILL, TELOPT_SGA); telopt(1, DO, TELOPT_SGA); telopt(1, WILL, TELOPT_BINARY); telopt(1, DO, TELOPT_BINARY); telopt(1, WILL, TELOPT_ECHO); } static int io_done = 0; void term_inout(pty_fd) int pty_fd; { register int i; pid_t pid; struct sigaction sa; sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = sig_done; sigaction(SIGALRM, &sa, (struct sigaction *) NULL); if ((pid = fork()) == -1) { sprintf(buff, "telnetd: fork() failed: %s\r\n", strerror(errno)); (void) write(1, buff, strlen(buff)); } if (pid != 0) { /* network -> login process */ while (!io_done && (i = read(0, buff, sizeof(buff))) > 0) { tel_in(pty_fd, 1, buff, i); } /* EOF, kill opposite number and exit. */ (void) kill(pid, SIGKILL); } else { /* login process -> network */ while ((i = read(pty_fd, buff, sizeof(buff))) > 0) { tel_out(1, buff, i); } /* EOF, alert opposite number and exit. */ (void) kill(getppid(), SIGALRM); } /* EOF. */ } void sig_done(sig) int sig; { io_done = 1; alarm(1); /* there is always a chance... */ } ���������������������������������������������������������������������������������������������������������������������������������������/* * TNET A server program for MINIX which implements the TCP/IP * suite of networking protocols. It is based on the * TCP/IP code written by Phil Karn et al, as found in * his NET package for Packet Radio communications. * * This file contains an implementation of the "server" * for the TELNET protocol. This protocol can be used to * remote-login on other systems, just like a normal TTY * session. * * Usage: telnetd [-dv] * * Version: @(#)telnetd.c 1.00 07/26/92 * * Author: Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org> * Michael Temari, <temari@temari.ae.ge.com> */ #include <sys/types.h> #include <fcntl.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <utmp.h> #include <time.h> #include <stdio.h> #include "telnetd.h" static char PATH_UTMP[] = "/etc/utmp"; static char PATH_WTMP[] = "/usr/adm/wtmp"; _PROTOTYPE(void wtmp, (int type, int linenr, char *line, pid_t pid, char *host)); _PROTOTYPE(void report, (char *label)); void wtmp(type, linenr, line, pid, host) int type; /* type of entry */ int linenr; /* line number in ttytab */ char *line; /* tty name (only good on login) */ pid_t pid; /* pid of process */ char *host; /* name of the remote host */ { /* Log an event into the UTMP and WTMP files. */ struct utmp utmp; /* UTMP/WTMP User Accounting */ int fd; /* Clear the utmp record. */ memset((void *) &utmp, 0, sizeof(utmp)); /* Fill in utmp. */ switch (type) { case LOGIN_PROCESS: /* A new login, fill in line and host name. */ strncpy(utmp.ut_line, line, sizeof(utmp.ut_line)); strncpy(utmp.ut_host, host, sizeof(utmp.ut_host)); break; case DEAD_PROCESS: /* A logout. Use the current utmp entry, but make sure it is a * user process exiting, and not getty or login giving up. */ if ((fd = open(PATH_UTMP, O_RDONLY)) < 0) { if (errno != ENOENT) report(PATH_UTMP); return; } if (lseek(fd, (off_t) (linenr+1) * sizeof(utmp), SEEK_SET) == -1 || read(fd, &utmp, sizeof(utmp)) == -1 ) { report(PATH_UTMP); close(fd); return; } close(fd); if (utmp.ut_type != USER_PROCESS) return; strncpy(utmp.ut_name, "", sizeof(utmp.ut_name)); break; } /* Finish new utmp entry. */ utmp.ut_pid = pid; utmp.ut_type = type; utmp.ut_time = time((time_t *) 0); /* Write new entry to utmp. */ if ((fd = open(PATH_UTMP, O_WRONLY)) < 0 || lseek(fd, (off_t) (linenr+1) * sizeof(utmp), SEEK_SET) == -1 || write(fd, &utmp, sizeof(utmp)) == -1 ) { if (errno != ENOENT) report(PATH_UTMP); } if (fd != -1) close(fd); if (type == DEAD_PROCESS) { /* Add new wtmp entry. */ if ((fd = open(PATH_WTMP, O_WRONLY | O_APPEND)) < 0 || write(fd, &utmp, sizeof(utmp)) == -1 ) { if (errno != ENOENT) report(PATH_WTMP); } if (fd != -1) close(fd); } } void report(label) char *label; { char message[128]; sprintf(message, "telnetd: %s: %s\r\n", strerror(errno)); (void) write(1, message, strlen(message)); } �����������������������������������������������������������������������������������������������r .�������������..������������s Makefile������t NOTICE��������u READ_ME�������v assert.c������w assert.h������x commands.c����y commands.h����z display.c�����{ display.h�����| getcomm.c�����} getcomm.h�����~ getline.c����� getline.h����� help.c�������� help.h�������� in_all.h������ keys.c�������� keys.h�������� machine.c����� machine.h����� main.c�������� main.h�������� options.c����� options.h����� output.c������ output.h������ pattern.c����� pattern.h����� process.c����� process.h����� prompt.c������ prompt.h������ term.c�������� term.h������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# $Header: Makefile,v 7.2 88/09/20 16:46:02 ceriel Exp $ # CFLAGS : options for the C-compiler CFLAGS = -O -D_MINIX -D_POSIX_SOURCE -wa # LDFLAGS : flags for the loader # -i for a PDP-11 with separate I/D (not necessary) LDFLAGS = -i # BINDIR : where the binary will go when you type "make install" BINDIR = /usr/bin # LIBRARIES : -ltermcap or -ltermlib, # -lPW on USG systems (System III, System V), # -ljobs on Berkeley Unix system (4.1, 2.8?, 2.9) LIBRARIES = HFILES= assert.h\ commands.h\ display.h\ getcomm.h\ getline.h\ help.h\ in_all.h\ keys.h\ machine.h\ main.h\ options.h\ output.h\ pattern.h\ process.h\ prompt.h\ term.h CFILES= assert.c\ commands.c\ display.c\ getcomm.c\ getline.c\ help.c\ keys.c\ machine.c\ main.c\ options.c\ output.c\ pattern.c\ process.c\ prompt.c\ term.c OFILES= assert.o\ commands.o\ display.o\ getcomm.o\ getline.o\ help.o\ keys.o\ machine.o\ main.o\ options.o\ output.o\ pattern.o\ process.o\ prompt.o\ term.o all: yap yap: $(OFILES) $(CC) $(LDFLAGS) -o yap $(OFILES) $(LIBRARIES) install -S 16kw yap install: $(BINDIR)/yap $(BINDIR)/more $(BINDIR)/yap: yap install -cs -o bin yap $@ $(BINDIR)/more: $(BINDIR)/yap install -l $? $@ clean: rm -f yap $(OFILES) a.out core *.bak pr: pr Makefile $(HFILES) $(CFILES) lint: lint $(DEFINES) $(CFILES) #AUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTOAUTO assert.o: assert.h assert.o: in_all.h assert.o: output.h assert.o: term.h commands.o: assert.h commands.o: commands.h commands.o: display.h commands.o: getcomm.h commands.o: getline.h commands.o: help.h commands.o: in_all.h commands.o: keys.h commands.o: machine.h commands.o: main.h commands.o: options.h commands.o: output.h commands.o: pattern.h commands.o: process.h commands.o: prompt.h commands.o: term.h display.o: assert.h display.o: display.h display.o: getline.h display.o: in_all.h display.o: machine.h display.o: main.h display.o: options.h display.o: output.h display.o: process.h display.o: term.h getcomm.o: assert.h getcomm.o: commands.h getcomm.o: display.h getcomm.o: getcomm.h getcomm.o: getline.h getcomm.o: in_all.h getcomm.o: keys.h getcomm.o: machine.h getcomm.o: main.h getcomm.o: output.h getcomm.o: process.h getcomm.o: prompt.h getcomm.o: term.h getline.o: assert.h getline.o: display.h getline.o: getline.h getline.o: in_all.h getline.o: main.h getline.o: options.h getline.o: output.h getline.o: process.h getline.o: term.h help.o: commands.h help.o: display.h help.o: help.h help.o: in_all.h help.o: keys.h help.o: machine.h help.o: main.h help.o: options.h help.o: output.h help.o: prompt.h help.o: term.h keys.o: assert.h keys.o: commands.h keys.o: in_all.h keys.o: keys.h keys.o: machine.h keys.o: prompt.h machine.o: assert.h machine.o: getline.h machine.o: in_all.h machine.o: machine.h main.o: commands.h main.o: display.h main.o: in_all.h main.o: main.h main.o: options.h main.o: output.h main.o: process.h main.o: prompt.h main.o: term.h options.o: display.h options.o: in_all.h options.o: options.h options.o: output.h output.o: in_all.h output.o: main.h output.o: output.h pattern.o: in_all.h pattern.o: pattern.h process.o: commands.h process.o: display.h process.o: getline.h process.o: in_all.h process.o: main.h process.o: options.h process.o: output.h process.o: process.h process.o: prompt.h prompt.o: display.h prompt.o: getcomm.h prompt.o: getline.h prompt.o: in_all.h prompt.o: main.h prompt.o: options.h prompt.o: output.h prompt.o: process.h prompt.o: prompt.h prompt.o: term.h term.o: display.h term.o: getline.h term.o: in_all.h term.o: keys.h term.o: machine.h term.o: main.h term.o: options.h term.o: output.h term.o: term.h ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$Header: NOTICE,v 6.2 88/04/29 11:43:22 ceriel Exp $ The software and documentation contained within this directory is copyright (c) Ceriel J.H. Jacobs, 1988. Permission is granted to reproduce and distribute this software as long as no fee is charged and this notice is included. Other rights are reserved except as explicitly granted by written permission from the author. Ceriel J.H. Jacobs Dept. of Maths and Computer Science Vrije Universiteit De Boelelaan 1081 1081 HV Amsterdam The Netherlands email : ceriel@cs.vu.nl ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$Header: READ_ME,v 6.2 88/04/29 11:43:35 ceriel Exp $ This directory contains the sources of YAP, Yet Another Pager. It can do most of the things more(1) can, and much much more. Yap has been tested on the following systems: - DEC PDP 11/44 running V7 - DEC PDP 11/60 running V7 - DEC VAX 11/750 running 4.1BSD - IBM PC/XT running PC/IX - NCR Minitower running a System V - Several 68k systems - SUN-3 and SUN-4 On other systems, you might have some problems getting yap to run, but then again, you might not. You can always ask me for help, and maybe even get it. If you make any changes, please - tell me about them - mark them clearly, preferably through conditional compilation. What you need to run yap: - you need termlib/termcap. It probably is'nt too hard to adapt yap to terminfo. It might even work unchanged, but I don't know about that. We don't have terminfo or the system V curses. If you adapt yap to terminfo, I would sure like to get the changes you made, so please send them to me (email address at the bottom of this note); - you also need regex(III) (Either Berkeley style or USG will do). If you do not have it, you should define NOREGEX, which gives you simpleminded searches without meta-characters. How to install yap: - edit Makefile (easy) - edit in_all.h (easy) - type "make install" Ceriel Jacobs, Vrije Universiteit Amsterdam ceriel@cs.vu.nl ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: assert.c,v 7.1 88/04/29 11:43:49 ceriel Exp $"; # endif # define _ASSERT_ # include "in_all.h" # include "assert.h" # if DO_ASSERT # include "output.h" # include "term.h" /* * Assertion fails. Tell me about it. */ VOID badassertion(ass,f,l) char *ass, *f; { clrbline(); putline("Assertion \""); putline(ass); putline("\" failed "); putline(f); putline(", line "); prnum((long) l); putline(".\r\n"); flush(); resettty(); abort(); } # endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: assert.h,v 7.1 88/04/29 11:44:01 ceriel Exp $ */ /* Assertion macro */ # ifndef _ASSERT_ # define PUBLIC extern # else # define PUBLIC # endif #if DO_ASSERT #define assert(x) if(!(x)) badassertion("x",__FILE__,__LINE__) VOID badassertion(); /* * void badassertion(ass,fn,lineno) * char *ass, The assertion in string form, * *fn; The filename in which the assertion failed, * int lineno; The line number of the assertion. * * Reports the assertion on standard output and then aborts with a core dump. */ #else #define assert(x) /* nothing */ #endif # undef PUBLIC ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: commands.c,v 1.1 91/12/17 13:05:45 philip Exp $"; # endif # define _COMMANDS_ # include "in_all.h" # include "commands.h" # include "output.h" # include "process.h" # include "help.h" # include "term.h" # include "prompt.h" # include "getline.h" # include "getcomm.h" # include "pattern.h" # include "display.h" # include "options.h" # include "machine.h" # include "keys.h" # include "main.h" # include "assert.h" # if USG_OPEN # include <fcntl.h> # include <errno.h> extern int errno; # endif # if BSD4_2_OPEN # include <sys/file.h> # include <errno.h> extern int errno; # endif # if POSIX_OPEN # include <sys/types.h> # include <fcntl.h> # include <errno.h> # endif char *strcpy(), *strcat(); static long lastcount; /* Save last count for '.' command */ static int lastcomm; /* Save last command for '.' command */ /*ARGSUSED*/ STATIC int do_nocomm(cnt) long cnt; { /* Do nothing */ } /*ARGSUSED*/ int do_chkm(cnt) long cnt; { /* Change key map */ register struct keymap *p; if (!(p = othermap)) { error("No other keymap"); return; } othermap = currmap; currmap = p; } static int searchdir; /* Direction of last search */ /* * Perform searches */ STATIC VOID do_search(str,cnt,dir) char *str; long cnt; int dir; { register char *p; register long lineno; if (str) { /* * We have to get a pattern, which we have to prompt for * with the string "str". */ if ((p = readline(str)) == 0) { /* * User cancelled command */ return; } if ((p = re_comp(p))) { /* * There was an error in the pattern */ error(p); return; } searchdir = dir; } if (dir < 0) lineno = scr_info.firstline; else lineno = scr_info.lastline; for (;;) { p = 0; if ((lineno += dir) > 0) p = getline(lineno, 0); if (interrupt) return; if (!p) { /* End of file reached */ error("pattern not found"); return; } if (re_exec(p) && --cnt <= 0) { /* * We found the pattern, and we found it often enough. * Pity that we still don't know where the match is. * We only know the linenumber. So, we just hope the * following will at least bring it on the screen ... */ (VOID) display(lineno,0,pagesize,0); (VOID) scrollb(2,0); redraw(0); return; } } /* NOTREACHED */ } STATIC int do_fsearch(cnt) long cnt; { /* Forward search */ do_search("/", cnt, 1); } STATIC int do_bsearch(cnt) long cnt; { /* Backward search */ do_search("?", cnt, -1); } /* * Repeat last search in direction "dir" */ STATIC int n_or_rn_search(cnt,dir) long cnt; int dir; { register char *p; if (dir == 1) { p = "/\r"; } else if (dir == -1) { p = "?\r"; } else { error("No previous pattern"); return; } if (!stupid) clrbline(); putline(p); flush(); do_search((char *) 0, cnt, dir); } STATIC int do_nsearch(cnt) long cnt; { /* Repeat search in same direction */ n_or_rn_search(cnt,searchdir); } STATIC int do_rnsearch(cnt) long cnt; { /* Repeat search in opposite direction */ n_or_rn_search(cnt, -searchdir); } STATIC int shell(esc_ch, cnt) long cnt; { register char *p; static char buf[2]; buf[0] = esc_ch; if (p = readline(buf)) { shellescape(p, esc_ch); if (cnt >= 0 && !hardcopy) { p = startcomm; startcomm = 0; ret_to_continue(); putline(TI); if (!p) { /* * Avoid double redraw. * After a "startcomm", a redraw will * take place anyway. */ redraw(1); } } } } STATIC int do_shell(cnt) long cnt; { /* Execute a shell escape */ shell('!', cnt); } STATIC int do_pipe(cnt) long cnt; { /* Execute a shell escape */ shell('|', cnt); } /*ARGSUSED*/ STATIC int do_writefile(cnt) long cnt; { /* Write input to a file */ register char *p; int fd; if ((p = readline("Filename: ")) == 0 || !*p) { /* * No file name given */ return; } # if USG_OPEN || BSD4_2_OPEN || POSIX_OPEN if ((fd = open(p,O_CREAT|O_EXCL|O_WRONLY,0644)) < 0) { if (errno == EEXIST) { error("File exists"); return; } error("Could not open file"); return; } # else if (!access(p,0)) { error("File exists"); return; } if ((fd = creat(p,0644)) < 0) { error("Could not open file"); return; } # endif wrt_fd(fd); (VOID) close(fd); } VOID wrt_fd(fd) { register long l = 1; register char *p = getline(l,0), *pbuf; char buf[1024]; while (p) { pbuf = buf; while (p && pbuf < &buf[1024]) { if (!*p) { *pbuf++ = '\n'; p = getline(++l,0); } else *pbuf++ = *p++ & 0177; } if (write(fd, buf, pbuf - buf) < 0) { error("Write failed"); break; } } } STATIC int do_absolute(cnt) long cnt; { /* Go to linenumber "cnt" */ if (!getline(cnt,0)) { /* Not there or interrupt */ if (!interrupt) { /* * User did'nt give an interrupt, so the line number * was too high. Go to the last line. */ do_lline(cnt); } return; } (VOID) display(cnt,0,pagesize,1); } /*ARGSUSED*/ STATIC int do_visit(cnt) long cnt; { /* Visit a file */ register char *p; static char fn[128]; /* Keep file name */ if ((p = readline("Filename: ")) == 0) { return; } if (*p) { (VOID) strcpy(fn,p); visitfile(fn); } else { /* * User typed a return. Visit the current file */ if (!(p = filenames[filecount])) { error("No current file"); return; } visitfile(p); } (VOID) display(1L, 0, pagesize, 1); } /*ARGSUSED*/ STATIC int do_error(cnt) long cnt; { /* Called when user types wrong key sequence */ error(currmap->k_help); } /* * Interface routine for displaying previous screen, * depending on cflag. */ STATIC int prev_screen(sz,really) int sz, really; { register int retval; retval = scrollb(sz - 1, really && cflag); if (really && !cflag) { /* * The previous call did not display anything, but at least we * know where to start */ return display(scr_info.firstline, scr_info.nf, sz, 1); } return retval; } /* * Interface routine for displaying the next screen, * dependent on cflag. */ STATIC int next_screen(sz,really) int sz, really; { register int t; register struct scr_info *p = &scr_info; if (cflag) { return scrollf(sz-1,really); } t = p->tail->cnt - 1; if (p->lastline == p->firstline) { t += p->nf; } return display(p->lastline, t, sz, really); } /*ARGSUSED*/ STATIC int do_redraw(cnt) long cnt; { redraw(1); } STATIC int page_size(cnt) unsigned cnt; { if (cnt) { if (cnt > maxpagesize) return maxpagesize; if (cnt < MINPAGESIZE) return MINPAGESIZE; return (int) cnt; } return pagesize; } STATIC int do_forward(cnt) long cnt; { /* Display next page */ register int i; i = page_size((unsigned) cnt); if (status & EOFILE) { /* * May seem strange, but actually a visit to the next file * has already been done here */ (VOID) display(1L,0,i,1); return; } (VOID) next_screen(i,1); } STATIC int do_backward(cnt) long cnt; { register int i, temp; i = page_size((unsigned) cnt); if (!(status & START)) { (VOID) prev_screen(i,1); return; } if (stdf < 0) { (VOID) display(1L,0,i,1); return; } /* * The next part is a bit clumsy. * We want to display the last page of the previous file (for which * a visit has already been done), but the pagesize may temporarily * be different because the command had a count */ temp = pagesize; pagesize = i; do_lline(cnt); pagesize = temp; } /*ARGSUSED*/ STATIC int do_firstline(cnt) long cnt; { /* Go to start of input */ do_absolute(1L); } STATIC int do_lline(cnt) long cnt; { /* Go to end of input */ register int i = 0; register int j = pagesize - 1; if ((cnt = to_lastline()) < 0) { /* * Interrupted by the user */ return; } /* * Display the page such that only the last line of the page is * a "~", independant of the pagesize */ while (!(display(cnt,i,j,0) & EOFILE)) { /* * The last line could of course be very long ... */ i+= j; } (VOID) scrollb(j - scr_info.tail->cnt, 0); redraw(0); } STATIC int do_lf(cnt) long cnt; { /* Display next line, or go to line */ if (cnt) { /* Go to line */ do_absolute(cnt); return; } (VOID) scrollf(1,1); } STATIC int do_upline(cnt) lon*S��,S��-S��.S��/S��0S��1S��2S����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������g cnt; { /* Display previous line, or go to line */ if (cnt) { /* Go to line */ do_absolute(cnt); return; } (VOID) scrollb(1,1); } STATIC int do_skiplines(cnt) long cnt; { /* Skip lines forwards */ /* Should be interruptable ... */ (VOID) scrollf((int) (cnt + maxpagesize - 1), 0); redraw(0); } STATIC int do_bskiplines(cnt) long cnt; { /* Skip lines backwards */ /* Should be interruptable ... */ (VOID) scrollb((int) (cnt + pagesize - 1), 0); redraw(0); } STATIC int do_fscreens(cnt) long cnt; { /* Skip screens forwards */ do { if ((next_screen(pagesize,0) & EOFILE) || interrupt) break; } while (--cnt >= 0); redraw(0); } STATIC int do_bscreens(cnt) long cnt; { /* Skip screens backwards */ do { if ((prev_screen(pagesize,0) & START) || interrupt) break; } while (--cnt >= 0); redraw(0); } STATIC int scro_size(cnt) unsigned cnt; { if (cnt >= maxpagesize) return maxpagesize; if (cnt) return (int) cnt; return scrollsize; } STATIC int do_f_scroll(cnt) long cnt; { /* Scroll forwards */ (VOID) scrollf(scro_size((unsigned) cnt),1); } STATIC int do_b_scroll(cnt) long cnt; { /* Scroll backwards */ (VOID) scrollb(scro_size((unsigned) cnt),1); } STATIC int do_previousfile(cnt) long cnt; {/* Visit previous file */ if (nextfile(- (int) cnt)) { error("No (Nth) previous file"); return; } redraw(0); } STATIC int do_nextfile(cnt) long cnt; { /* Visit next file */ if (nextfile((int) cnt)) { error("No (Nth) next file"); return; } redraw(0); } STATIC int do_lcomm(); /* * The next array is initialized, sorted on the first element of the structs, * so that we can perform binary search */ struct commands commands[] = { {"", 0, do_error, ""}, {"", 0, do_nocomm, ""}, {"bf", STICKY|NEEDS_COUNT, do_previousfile,"Visit previous file"}, {"bl", NEEDS_SCREEN|STICKY, do_upline, "Scroll one line up, or go to line"}, {"bot", STICKY, do_lline, "Go to last line of the input"}, {"bp", BACK|NEEDS_SCREEN|TOPREVFILE|STICKY, do_backward, "display previous page"}, {"bps", SCREENSIZE_ADAPT|BACK|NEEDS_SCREEN|TOPREVFILE|STICKY, do_backward, "Display previous page, set pagesize"}, {"bs", BACK|NEEDS_SCREEN|STICKY, do_b_scroll, "Scroll backwards"}, {"bse", 0, do_bsearch, "Search backwards for pattern"}, {"bsl", BACK|NEEDS_SCREEN|STICKY|NEEDS_COUNT, do_bskiplines, "Skip lines backwards"}, {"bsp", BACK|NEEDS_SCREEN|STICKY|NEEDS_COUNT, do_bscreens, "Skip screens backwards"}, {"bss", SCROLLSIZE_ADAPT|BACK|NEEDS_SCREEN|STICKY, do_b_scroll, "Scroll backwards, set scrollsize"}, {"chm", 0, do_chkm, "Switch to other keymap"}, {"exg", STICKY, exgmark, "Exchange current page with mark"}, {"ff", STICKY|NEEDS_COUNT, do_nextfile, "Visit next file"}, {"fl", NEEDS_SCREEN|STICKY, do_lf, "Scroll one line down, or go to line"}, {"fp", TONEXTFILE|AHEAD|STICKY, do_forward, "Display next page"}, {"fps", SCREENSIZE_ADAPT|TONEXTFILE|AHEAD|STICKY, do_forward, "Display next page, set pagesize"}, {"fs", AHEAD|NEEDS_SCREEN|STICKY, do_f_scroll, "Scroll forwards"}, {"fse", 0, do_fsearch, "Search forwards for pattern"}, {"fsl", AHEAD|NEEDS_SCREEN|STICKY|NEEDS_COUNT, do_skiplines, "Skip lines forwards"}, {"fsp", AHEAD|NEEDS_SCREEN|STICKY|NEEDS_COUNT, do_fscreens, "Skip screens forwards"}, {"fss", SCROLLSIZE_ADAPT|AHEAD|NEEDS_SCREEN|STICKY, do_f_scroll, "Scroll forwards, set scrollsize"}, {"hlp", 0, do_help, "Give description of all commands"}, {"mar", 0, setmark, "Set a mark on the current page"}, {"nse", STICKY, do_nsearch, "Repeat the last search"}, {"nsr", STICKY, do_rnsearch, "Repeat last search in other direction"}, {"pip", ESC, do_pipe, "pipe input into shell command"}, {"qui", 0, quit, "Exit from yap"}, {"red", 0, do_redraw, "Redraw screen"}, {"rep", 0, do_lcomm, "Repeat last command"}, {"shl", ESC, do_shell, "Execute a shell escape"}, {"tom", 0, tomark, "Go to mark"}, {"top", STICKY, do_firstline, "Go to the first line of the input"}, {"vis", 0, do_visit, "Visit a file"}, {"wrf", 0, do_writefile, "Write input to a file"}, }; /* * Lookup string "s" in the commands array, and return index. * return 0 if not found. */ int lookup(s) char *s; { register struct commands *l, *u, *m; l = &commands[2]; u = &commands[sizeof(commands) / sizeof(*u) - 1]; do { /* * Perform binary search */ m = l + (u - l) / 2; if (strcmp(s, m->c_cmd) > 0) l = m + 1; else u = m; } while (l < u); if (!strcmp(s, u->c_cmd)) return u - commands; return 0; } /*ARGSUSED*/ STATIC int do_lcomm(cnt) long cnt; { /* Repeat last command */ if (!lastcomm) { error("No previous command"); return; } do_comm(lastcomm, lastcount); } /* * Execute a command, with optional count "count". */ VOID do_comm(comm, count) register int comm; register long count; { register struct commands *pcomm; register int temp; register int flags; pcomm = &commands[comm]; flags = pcomm->c_flags; /* * Check the command. * If the last line of the file is displayed and the command goes * forwards and does'nt have the ability to go to the next file, it * is an error. * If the first line of the file is displayed and the command goes * backwards and does'nt have the ability to go to the previous file, * it is an error. * Also check wether we need the next or previous file. If so, get it. */ if ((status & EOFILE) && (flags & AHEAD)) { if (qflag || !(flags & TONEXTFILE)) return; if (nextfile(1)) quit(); } if ((status & START) && (flags & BACK)) { if (qflag || !(flags & TOPREVFILE)) return; if (nextfile(-1)) quit(); } /* * Does the command stick around for LASTCOMM? */ if (flags & STICKY) { lastcomm = comm; lastcount = count; } if (!count) { if (flags & NEEDS_COUNT) count = 1; } else { /* * Does the command adapt the screensize? */ if (flags & SCREENSIZE_ADAPT) { temp = maxpagesize; if ((unsigned) count < temp) { temp = count; } if (temp < MINPAGESIZE) { temp = MINPAGESIZE; } count = 0; pagesize = temp; } /* * Does the command adapt the scrollsize? */ if (flags & SCROLLSIZE_ADAPT) { temp = maxpagesize - 1; if ((unsigned) count < temp) { temp = (int) count; } scrollsize = temp; count = 0; } } /* * Now execute the command. */ (*(pcomm->c_func))(count); } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: commands.h,v 7.1 88/04/29 11:44:32 ceriel Exp $ */ # ifndef _COMMANDS_ # define PUBLIC extern # else # define PUBLIC # endif /* Flags, describing properties of commands */ # define SCREENSIZE_ADAPT 01 /* Can change screen size */ # define SCROLLSIZE_ADAPT 02 /* Can change scrollsize */ # define TONEXTFILE 04 /* to next file */ # define AHEAD 010 /* goes ahead in the file */ # define BACK 020 /* goes back in the file */ # define NEEDS_SCREEN 040 /* needs screen info */ # define TOPREVFILE 0100 /* to previous file */ # define STICKY 0200 /* remember for lastcomm */ # define NEEDS_COUNT 0400 /* command needs a count */ # define ESC 01000 /* shell or pipe escape */ extern struct commands { char *c_cmd; /* Short mnemonic for a command */ int c_flags; /* describes command properties */ int (*c_func)(); /* Function executing the command */ char *c_descr; /* Short command description */ } commands[]; int do_chkm(); /* * int do_chkm(cnt) * long cnt; Ignored * * Switch to other keymap */ VOID do_comm(); /* * void do_comm(command, count) * int command; Index in the commands array * long count; Some commands possibly take a count * * Checks and executes commands. */ int lookup(); /* * int lookup(str) * char *str; * * Searches the string "str" in the command list. * It returns its index if it exists, otherwise it returns 0. */ VOID wrt_fd(); /* * void wrt_fd(fd) * int fd; File descriptor * * Write input to file descriptor fd */ # undef PUBLIC �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: display.c,v 7.3 90/03/05 16:57:39 ceriel Exp $"; # endif # define _DISPLAY_ # include "in_all.h" # include "display.h" # include "assert.h" # include "machine.h" # include "term.h" # include "output.h" # include "options.h" # include "process.h" # include "getline.h" # include "main.h" STATIC char * do_line(); /* * Fill n lines of the screen, each with "str". */ STATIC VOID fillscr(n,str) char *str; int n; { while (n-- > 0) { putline(str); } } /* * Skip "n" screenlines of line "p", and return what's left of it. */ STATIC char * skiplines(p,n) char *p; int n; { while (n-- > 0) { p = do_line(p,0); scr_info.currentpos--; } return p; } /* * Redraw screen. * "n" = 1 if it is a real redraw, 0 if one page must be displayed. * It is also called when yap receives a stop signal. */ VOID redraw(n) int n; { register struct scr_info *p = &scr_info; register int i; i = pagesize; if (n && p->currentpos) { i = p->currentpos; } (VOID) display(p->firstline,p->nf,i,1); } /* * Compute return value for the routines "display" and "scrollf". * This return value indicates wether we are at the end of file * or at the start, or both. * "s" contains that part of the last line that was not displayed. */ STATIC int compretval(s) char *s; { register int i; register struct scr_info *p = &scr_info; i = 0; if (!s || (!*s && !getline(p->lastline+1, 1))) { i = EOFILE; } if (p->firstline == 1 && !p->nf) { i |= START; } status = i; return i; } /* * Display nlines, starting at line n, not displaying the first * nd screenlines of n. * If reallydispl = 0, the actual displaying is not performed, * only the computing associated with it is done. */ int display(n,nd,nlines,reallydispl) long n; int nd; register int nlines; int reallydispl; { register struct scr_info *s = &scr_info; register char *p; /* pointer to line to be displayed */ if (startcomm) { /* No displaying on a command from the * yap command line. In this case, displaying * will be done after executing the command, * by a redraw. */ reallydispl = 0; } if (!n) { n = 1L; nd = 0; } if (reallydispl) { /* move cursor to starting point */ if (stupid) { putline(currentfile); putline(", line "); prnum(n); nlines--; } if (cflag) { putline("\r\n"); } else { home(); clrscreen(); } } /* * Now, do computations and display */ s->currentpos = 0; s->nf = nd; s->head = s->tail; s->tail->cnt = 0; s->tail->line = n; p = skiplines(getline(n,1),nd); while (nlines && p) { /* * While there is room, * and there is something left to display ... */ (s->tail->cnt)++; nlines--; if (*(p = do_line(p,reallydispl)) == '\0') { /* * File-line finished, get next one ... */ p = getline(++n,1); if (nlines && p) { s->tail = s->tail->next; s->tail->cnt = 0; s->tail->line = n; } } } if (!stupid) { s->currentpos += nlines; if (reallydispl) { fillscr(nlines, "~\r\n"); fillscr(maxpagesize - s->currentpos, "\r\n"); } } return compretval(p); } /* * Scroll forwards n lines. */ int scrollf(n,reallydispl) int n; int reallydispl; { register struct scr_info *s = &scr_info; register char *p; register long ll; register int i; /* * First, find out how many screenlines of the last line were already * on the screen, and possibly above it. */ if (n <= 0 || (status & EOFILE)) return status; if (startcomm) reallydispl = 0; /* * Find out where to begin displaying */ i = s->tail->cnt; if ((ll = s->lastline) == s->firstline) i += s->nf; p = skiplines(getline(ll, 1), i); /* * Now, place the cursor at the first free line */ if (reallydispl && !stupid) { clrbline(); mgoto(s->currentpos); } /* * Now display lines, keeping track of which lines are on the screen. */ while (n-- > 0) { /* There are still rows to be displayed */ if (!*p) { /* End of line, get next one */ if (!(p = getline(++ll, 1))) { /* * No lines left. At end of file */ break; } s->tail = s->tail->next; s->tail->cnt = 0; s->tail->line = ll; } if (s->currentpos >= maxpagesize) { /* * No room, delete first screen-line */ s->currentpos--; s->nf++; if (--(s->head->cnt) == 0) { /* * The first file-line on the screen is wiped * out completely; update administration * accordingly. */ s->nf = 0; s->head = s->head->next; assert(s->head->cnt > 0); } } s->tail->cnt++; p = do_line(p, reallydispl); } return compretval(p); } /* * Scroll back n lines */ int scrollb(n, reallydispl) int n, reallydispl; { register struct scr_info *s = &scr_info; register char *p; /* Holds string to be displayed */ register int i; register int count; register long ln; /* a line number */ register int nodispl; int cannotscroll; /* stupid or no insert-line */ /* * First, find out where to start */ if ((count = n) <= 0 || (status & START)) return status; if (startcomm) reallydispl = 0; cannotscroll = stupid || (!*AL && !*SR); ln = s->firstline; nodispl = s->nf; while (count) { /* While scrolling back ... */ if (i = nodispl) { /* * There were screen-lines of s->firstline that were not * displayed. * We can use them now, but only "count" of them. */ if (i > count) i = count; s->currentpos += i; nodispl -= i; count -= i; } else { /* Get previous line */ if (ln == 1) break; /* isn't there ... */ p = getline(--ln, 1); /* * Make it the first line of the screen and compute * how many screenlines it takes. These lines are not * displayed, but nodispl is set to this count, so * that it will be nonzero next time around */ nodispl = 0; do { /* Find out how many screenlines */ nodispl++; p = skiplines(p, 1); } while (*p); } } n -= count; if ((i = s->currentpos) > maxpagesize) i = maxpagesize; if (reallydispl && hardcopy) i = n; /* * Now that we know where to start, we can use "display" to do the * rest of the computing for us, and maybe even the displaying ... */ i = display(ln, nodispl, i, reallydispl && cannotscroll); if (cannotscroll || !reallydispl) { /* * Yes, "display" did the displaying, or we did'nt have to * display at all. * I like it, but the user obviously does not. * Let him buy another (smarter) terminal ... */ return i; } /* * Now, all we have to do is the displaying. And we are dealing with * a smart terminal (it can insert lines or scroll back). */ home(); /* * Insert lines all at once */ for (i = n; i; i--) { if (DB && *CE) { /* * Grumble..., terminal retains lines below, so we have * to clear the lines that we push off the screen */ clrbline(); home(); } if (*SR) { scrollreverse(); } else { # ifdef VT100_PATCH insert_line(0); # else insert_line(); # endif } } p = skiplines(getline(ln = s->firstline, 1), s->nf); for (i = 0; i < n; i++) { p = do_line(p,1); s->currentpos--; if (!*p) { p = getline(++ln, 1); } } return count; } /* * Process a line. * If reallydispl > 0 then display it. */ STATIC char * do_line(str, reallydispl) register char *str; int reallydispl; { char buf[1024]; register char *p = buf; register int pos = COLS; register int c; register int c1; register int do_ul = 0, do_hl = 0; int lastmode = 0, lasthlmode = 0; int c2; while (*str && pos > 0) { if (*str < ' ' && (c1 = match(str,&c2,sppat)) > 0) { /* * We found a string that matches, and thus must be * echoed literally */ if ((pos - c2) <= 0) { /* * It did not fit */ break; } pos -= c2; str += c1; if (reallydispl) { c = *str; *p = *str = 0; cputline(p = buf); putline(str - c1); *str = c; } continue; } c = *str++; do_hl = 0; if (*str == '\b' && *(str+1) != 0 && (c != '_' || *(str+2) == '\b')) { while (*str == '\b' && *(str+1) != 0) { str++; c = *str++; do_hl = 1; } } do_ul = 1; /* <S��>S��?S��@S�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� * Find underline sequences ... */ if (c == '_' && *str == '\b') { str++; c = *str++; } else { if (*str == '\b' && *(str+1) == '_') { str += 2; } else do_ul = 0; } if (reallydispl && do_hl != lasthlmode) { *p = 0; cputline(p = buf); if (do_hl) bold(); else end_bold(); } lasthlmode = do_hl; if (reallydispl && do_ul != lastmode) { *p = 0; cputline(p = buf); if (do_ul) underline(); else end_underline(); } lastmode = do_ul; *p++ = c; if (c >= ' ' && c < 0177) { pos--; if (reallydispl && do_ul && *UC && pos > 0) { /* * Underlining apparently is done one * character at a time. */ *p = 0; cputline(p = buf); backspace(); underchar(); } continue; } if (c == '\t') { p--; c1 = 8 - ((COLS - pos) & 07); /* * Actually, if COLS is a multiple of 8, this can be * simplified to * c1 = pos & 07; * But of course, we don't know that for sure. */ if (pos - c1 < 0) break; pos -= c1; if (reallydispl) { if (expandtabs) { /* * Expand tabs. We cannot let the * kernel take care of this * for two reasons: * 1. There can be tabs in cursor * addressing strings, * 2. We probably do it better. */ while (c1-- > 0) { *p++ = ' '; } } else { *p = 0; cputline(p = buf); givetab(); } } continue; } /* * Now we have a control character, which takes two positions */ if (pos <= 1) { p--; break; } pos -= 2; } if (reallydispl) { *p = 0; cputline(buf); if (pos > 0 || (pos <= 0 && (!AM || XN))) { putline("\r\n"); } /* * The next should be here! I.e. it may not be before printing * the newline. This has to do with XN. We don't know exactly * WHEN the terminal will stop ignoring the newline. * I have for example a terminal (Ampex a230) that will * continue to ignore the newline after a clear to end of line * sequence, but not after an end_underline sequence. */ if (do_ul) { end_underline(); } if (do_hl) { standend(); } } scr_info.currentpos++; return str; } /* ARGSUSED */ int setmark(cnt) long cnt; { /* Set a mark on the current page */ register struct scr_info *p = &scr_info; p->savfirst = p->firstline; p->savnf = p->nf; } /* ARGSUSED */ int tomark(cnt) long cnt; { /* Go to the mark */ register struct scr_info *p = &scr_info; (VOID) display(p->savfirst,p->savnf,pagesize,1); } /* ARGSUSED */ int exgmark(cnt) long cnt; { /* Exchange mark and current page */ register struct scr_info *p = &scr_info; register long svfirst; register int svnf; svfirst = p->firstline; svnf = p->nf; tomark(0L); p->savfirst = svfirst; p->savnf = svnf; } VOID d_clean() { /* Clean up */ register struct scr_info *p = &scr_info; p->savnf = 0; p->savfirst = 0; p->head = p->tail; p->head->line = 0; p->currentpos = 0; } �������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: display.h,v 7.0 86/12/05 09:36:03 ceriel Exp $ */ # ifndef _DISPLAY_ # define PUBLIC extern # else # define PUBLIC # endif # define MINPAGESIZE 5 PUBLIC int pagesize; /* How many lines on a page */ PUBLIC int maxpagesize; /* Maximum # of lines on a page */ PUBLIC int scrollsize; /* number of lines in a scroll */ struct scr_info { struct linelist { int cnt; /* # of screenlines for this line */ long line; /* lineno of this line */ # define firstline head->line # define lastline tail->line struct linelist *next; struct linelist *prev; } *tail, *head; /* Of all lines of the input file that are * on the screen, remember how many * screenlines they occupy. Keep this * info in a doubly linked list. */ int nf; /* How many screenlines of the first line * on the screen are not on the screen? */ int currentpos; /* Y coordinate of first free line */ struct linelist ssaavv; /* Mark */ # define savfirst ssaavv.line # define savnf ssaavv.cnt }; PUBLIC struct scr_info scr_info; PUBLIC int status; /* EOFILE on end of file * START on start of file * logical "or" if both */ /* Flags for status field */ # define EOFILE 01 # define START 02 VOID redraw(); /* * void redraw(flag) * int flag; Either 0 or 1 * * Redraws the screen. If flag = 1, the screen is redrawn as precisely * as possible, otherwise one page is displayed (which possibly does not * take a whole screen. */ int display(); /* * int display(firstline, nodispl, nlines, really) * long firstline; Line with which to start * int nodispl; Do not display nodispl lines of it * int nlines; Number of screen lines that must be displayed * int really; Either 0 or 1 * * Displays nlines as a page. if "really" = 0, the actual displaying is not * performed. Only the computing associated with it is done. */ int scrollf(); /* * int scrollf(nlines,really) * int nlines; Number of lines to scroll * int really; Either 0 or 1, see explanation above * * Scroll forwards "nlines" (screen)lines. */ int scrollb(); /* * int scrollb(nlines,really) * int nlines; Number of lines to scroll * int really; Either 0 or 1, see explanation above * * Scroll backwards "nlines" (screen)lines. */ int tomark(); /* * int tomark(cnt) * long cnt; (Argument ignored) * * Display a page starting at the mark. If there was no * mark, display the first page of the file. * (There is always assumed to be a mark, the initial one is on the first page * of the file). */ int setmark(); /* * int setmark(cnt) * long cnt; (Argument ignored) * * Sets a mark on the current page. * It returns nothing (but the address is taken ...) */ int exgmark(); /* * int exgmark(cnt) * long cnt; (Argumewnt ignored) * * Sets the mark on the current page and displays the * previously marked page. */ VOID d_clean(); /* * void d_clean() * * Clean up and initialize. To be called before displaying a new file */ # undef PUBLIC �����������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* * Command reader, also executes shell escapes */ # ifndef lint static char rcsid[] = "$Header: getcomm.c,v 1.1 91/12/17 13:05:58 philip Exp $"; # endif # define _GETCOMM_ # include <ctype.h> # include "in_all.h" # include "term.h" # include "process.h" # include "getcomm.h" # include "commands.h" # include "prompt.h" # include "main.h" # include "output.h" # include "getline.h" # include "machine.h" # include "keys.h" # include "display.h" # include "assert.h" #if USG_OPEN #include <fcntl.h> #endif #if POSIX_OPEN #include <sys/types.h> #include <fcntl.h> #endif char *strcpy(), *getenv(); STATIC int killchar(); /* * Read a line from the terminal, doing line editing. * The parameter s contains the prompt for the line. */ char * readline(s) char *s; { static char buf[80]; register char *p = buf; register int ch; register int pos; clrbline(); putline(s); pos = strlen(s); while ((ch = getch()) != '\n' && ch != '\r') { if (ch == -1) { /* * Can only occur because of an interrupted read. */ ch = erasech; interrupt = 0; } if (ch == erasech) { /* * Erase last char */ if (p == buf) { /* * There was none, so return */ return (char *) 0; } pos -= killchar(*--p); if (*p != '\\') continue; } if (ch == killch) { /* * Erase the whole line */ if (!(p > buf && *(p-1) == '\\')) { while (p > buf) { pos -= killchar(*--p); } continue; } pos -= killchar(*--p); } if (p > &buf[78] || pos >= COLS - 2) { /* * Line does not fit. * Simply refuse to make it any longer */ pos -= killchar(*--p); } *p++ = ch; if (ch < ' ' || ch >= 0177) { fputch('^'); pos++; ch ^= 0100; } fputch(ch); pos++; } fputch('\r'); *p++ = '\0'; flush(); return buf; } /* * Erase a character from the command line. */ STATIC int killchar(c) { backspace(); putch(' '); backspace(); if (c < ' ' || c >= 0177) { (VOID) killchar(' '); return 2; } return 1; } /* * Do a shell escape, after expanding '%' and '!'. */ VOID shellescape(p, esc_char) register char *p; { register char *p2; /* walks through command */ register int id; /* procid of child */ register int cnt; /* prevent array bound errors */ register int lastc = 0; /* will contain the previous char */ # ifdef SIGTSTP VOID (*savetstp)(); # endif static char previous[256]; /* previous command */ char comm[256]; /* space for command */ int piped[2]; p2 = comm; *p2++ = esc_char; cnt = 253; while (*p) { /* * expand command */ switch(*p++) { case '!': /* * An unescaped ! expands to the previous * command, but disappears if there is none */ if (lastc != '\\') { if (*previous) { id = strlen(previous); if ((cnt -= id) <= 0) break; (VOID) strcpy(p2,previous); p2 += id; } } else { *(p2-1) = '!'; } continue; case '%': /* * An unescaped % will expand to the current * filename, but disappears is there is none */ if (lastc != '\\') { if (nopipe) { id = strlen(currentfile); if ((cnt -= id) <= 0) break; (VOID) strcpy(p2,currentfile); p2 += id; } } else { *(p2-1) = '%'; } continue; default: lastc = *(p-1); if (cnt-- <= 0) break; *p2++ = lastc; continue; } break; } clrbline(); *p2 = '\0'; if (!stupid) { /* * Display expanded command */ cputline(comm); putline("\r\n"); } flush(); (VOID) strcpy(previous,comm + 1); resettty(); if (esc_char == '|' && pipe(piped) < 0) { error("Cannot create pipe"); return; } if ((id = fork()) < 0) { error("Cannot fork"); return; } if (id == 0) { /* * Close files, as child might need the file descriptors */ cls_files(); if (esc_char == '|') { close(piped[1]); #if USG_OPEN || POSIX_OPEN close(0); fcntl(piped[0], F_DUPFD, 0); #else dup2(piped[0], 0); #endif close(piped[0]); } execl("/bin/sh", "sh", "-c", comm + 1, (char *) 0); exit(1); } (VOID) signal(SIGINT,SIG_IGN); (VOID) signal(SIGQUIT,SIG_IGN); # ifdef SIGTSTP if ((savetstp = signal(SIGTSTP,SIG_IGN)) != SIG_IGN) { (VOID) signal(SIGTSTP,SIG_DFL); } # endif if (esc_char == '|') { (VOID) close(piped[0]); (VOID) signal(SIGPIPE, SIG_IGN); wrt_fd(piped[1]); (VOID) close(piped[1]); } while ((lastc = wait((int *) 0)) != id && lastc >= 0) { /* * Wait for child, making sure it is the one we expected ... */ } (VOID) signal(SIGINT,catchdel); (VOID) signal(SIGQUIT,quit); # ifdef SIGTSTP (VOID) signal(SIGTSTP, savetstp); # endif inittty(); } /* * Get all those commands ... */ int getcomm (plong) long *plong; { int c; long count; char *p; int i; int j; char buf[10]; for (;;) { count = 0; give_prompt(); while (isdigit((c = getch()))) { count = count * 10 + (c - '0'); } *plong = count; p = buf; for (;;) { if (c == -1) { /* * This should never happen, but it does, * when the user gives a TSTP signal (^Z) or * an interrupt while the program is trying * to read a character from the terminal. * In this case, the read is interrupted, so * we end up here. * Right, we will have to read again. */ if (interrupt) return 1; break; } *p++ = c; *p = 0; if ((i = match(buf, &j, currmap->k_mach)) > 0) { /* * The key sequence matched. We have a command */ return j; } if (i == 0) return 0; /* * We have a prefix of a command. */ assert(i == FSM_ISPREFIX); c = getch(); } } /* NOTREACHED */ } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: getcomm.h,v 7.0 86/12/05 09:36:21 ceriel Exp $ */ # ifndef _GETCOMM_ # define PUBLIC extern # else # define PUBLIC # endif int getcomm(); /* * int getcomm() * * Reads commands given by the user. The command is returned. */ VOID shellescape(); /* * void shellescape(command) * char *command; The shell command to be executed * * Expands '%' and '!' in the command "command" to the current filename * and the previous command respectively, and then executes "command". */ char * readline(); /* * char * readline(prompt) * char *prompt; Prompt given to the user * * Gives a prompt "prompt" and reads a line to be typed in by the user. * A pointer to this line is returned. Space for this line is static. */ # undef PUBLIC ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: getline.c,v 7.7 89/12/15 11:43:43 ceriel Exp $"; # endif # define _GETLINE_ # include <errno.h> # include "in_all.h" # include "getline.h" # include "options.h" # include "process.h" # include "term.h" # include "main.h" # include "display.h" # include "output.h" # include "assert.h" extern int errno; # define BLOCKSIZE 2048 /* size of blocks */ # define CHUNK 50 /* # of blockheaders allocated at a time */ /* * The blockheaders of the blocks that are in core are kept in a linked list. * The last added block is indicated by b_head, * the tail of the list is indicated by b_tail. * The links go from b_tail to b_head. * The blockheaders are all in an array, in the order of the line numbers. * Also, the blockheaders must always be in core, so they have to be rather * small. On systems with a small address space, yap can run out of core, * and panic. However, this should only happen with very large files (>> 1M). */ struct block { int b_flags; /* Contains the following flags: */ # define DUMPED 01 /* block dumped on temporary file */ # define PARTLY 02 /* block not filled completely (eof) */ int b_next; /* ptr in linked list */ long b_end; /* line number of last line in block */ char * b_info; /* the block */ int * b_offs; /* line offsets within the block */ long b_foff; /* offset of block in file */ }; static struct block * blocklist, /* beginning of the list of blocks */ * maxblocklist, /* first free entry in the list */ * topblocklist; /* end of allocated core for the list */ static int b_head, b_tail; static int tfdes, ifdes; /* File descriptors for temporary's */ static long lastreadline; /* lineno of last line read */ static int ENDseen; STATIC VOID readblock(); STATIC VOID nextblock(); STATIC char *re_alloc(); STATIC struct block * new_block() { register struct block *pblock = maxblocklist - 1; if (!maxblocklist || !(pblock->b_flags & PARTLY)) { /* * There is no last block, or it was filled completely, * so allocate a new blockheader. */ register int siz; pblock = blocklist; if (maxblocklist == topblocklist) { /* * No blockheaders left. Allocate new ones */ siz = topblocklist - pblock; blocklist = pblock = (struct block *) re_alloc((char *) pblock, (unsigned) (siz * sizeof(*pblock)), (unsigned) ((siz + CHUNK) * sizeof(*pblock))); pblock += siz; topblocklist = pblock + CHUNK; maxblocklist = pblock; for (; pblock < topblocklist; pblock++) { pblock->b_end = 0; pblock->b_info = 0; pblock->b_flags = 0; } if (!siz) { /* * Create dummy header cell. */ maxblocklist++; } } pblock = maxblocklist++; } nextblock(pblock); return pblock; } /* * Return the block in which line 'n' of the current file can be found. * If "disable_interrupt" = 0, the call may be interrupted, in which * case it returns 0. */ STATIC struct block * getblock(n, disable_interrupt) register long n; { register struct block * pblock; if (stdf < 0) { /* * Not file descriptor, so return end of file */ return 0; } pblock = maxblocklist - 1; if (n < lastreadline || (n == lastreadline && !(pblock->b_flags & PARTLY))) { /* * The line asked for has been read already. * Perform binary search in the blocklist to find the block * where it's in. */ register struct block *min, *mid; min = blocklist + 1; do { mid = min + (pblock - min) / 2; if (n > mid->b_end) { min = mid + 1; } else pblock = mid; } while (min < pblock); /* Found, pblock is now a reference to the block wanted */ if (!pblock->b_info) readblock(pblock); return pblock; } /* * The line was'nt read yet, so read blocks until found */ for (;;) { if (interrupt && !disable_interrupt) return 0; pblock = new_block(); if (pblock->b_end >= n) { return pblock; } if (pblock->b_flags & PARTLY) { /* * We did not find it, and the last block could not be * read completely, so return 0; */ return 0; } } /* NOTREACHED */ } char * getline(n, disable_interrupt) long n; { register struct block *pblock; if (!(pblock = getblock(n, disable_interrupt))) { return (char *) 0; } return pblock->b_info + pblock->b_offs[n - ((pblock-1)->b_end + 1)]; } /* * Find the last line of the input, and return its number */ long to_lastline() { for (;;) { if (!getline(lastreadline + 1, 0)) { /* * "lastreadline" always contains the linenumber of * the last line read. So, if the call to getline * succeeds, "lastreadline" is affected */ if (interrupt) return -1L; return lastreadline; } } /* NOTREACHED */ } #if MAXNBLOCKS int nblocks; /* Count number of large blocks */ #endif /* * Allocate some memory. If unavailable, free some and try again. * If all fails, panic. */ char * alloc(size, isblock) unsigned size; { register char *pmem; register struct block *pblock, *bllist; char *malloc(); long lseek(); register long i; bllist = blocklist; while ( #if MAXNBLOCKS (isblock && nblocks >= MAXNBLOCKS) || #endif !(pmem = malloc(size)) /* No space */ ) { if (b_tail == 0) { /* * Also, no blocks in core. Pity */ panic("No core"); } #if MAXNBLOCKS nblocks--; #endif pblock = bllist + b_tail; b_tail = pblock->b_next; if (!nopipe && !(pblock->b_flags & DUMPED)) { /* * Dump the block on a temporary file */ if (!tfdes) { /* * create and open temporary files */ tfdes = opentemp(0); ifdes = opentemp(1); } pblock->b_flags |= DUMPED; /* * Find out where to dump the block, and dump it */ i = (pblock-1)->b_end * sizeof(int); (VOID) lseek(tfdes, ((long) BLOCKSIZE * (pblock - bllist)), 0); if (write(tfdes, pblock->b_info, BLOCKSIZE) != BLOCKSIZE) { panic("write failed"); } /* * Also dump the offsets of the lines in the block */ (VOID) lseek(ifdes, i, 0); i = pblock->b_end * sizeof(int) - i; if (write(ifdes, (char *) pblock->b_offs, (int) i) != (int) i) { panic("Write failed"); } } /* * Now that the block is dumped, the space taken by it can * be freed */ free((char *) pblock->b_offs); free(pblock->b_info); pblock->b_info = (char *) 0; } #if MAXNBLOCKS if (isblock) nblocks++; #endif return pmem; } /* * Re-allocate the memorychunk pointed to by ptr, to let it * grow or shrink. * realloc of the standard C library is useless, as it is destructive * if the malloc fails. */ STATIC char * re_alloc(ptr,oldsize, newsize) char *ptr; unsigned oldsize; unsigned newsize; { register char *pmem; register char *c1, *c2; /* * We could be smarter here, by checking if newsize < oldsize, and in * that case using realloc, but this depends on realloc using the * same block if the block shrinks. The question is, wether all * reallocs in the world do this. */ pmem = alloc(newsize, 0); if (oldsize) { /* * This test makes re_alloc also work if there was no old block */ c1 = pmem; c2 = ptr; if (newsize > oldsize) { newsize = oldsize; } while (newsize--) { *c1++ = *c2++; } free(ptr); } return pmem; } /* * Append a block to the linked list of blockheaders of blocks that are * in core. */ STATIC VOID addtolist(pblock) register struct block *pblock; { register struct block *bllist = blocklist; pblock->b_next = 0; (bllist + b_head)->b_next = pblock - bllist; b_head = pblock - bllist; if (!b_tail) { /* * The list was empty, initialize */ b_tail = b_head; } } static char *saved; static long filldegree; /* * Try to read the block indicated by pblock */ STATIC VOID nextblock(pblock) register struct block *pblock; { register char *c, /* Run through pblock->b_info */ *c1; /* indicate end of pblock->b_info */ register int *poff; /* pointer in line-offset list */ register int cnt; /* # of characters read */ register unsigned siz; /* Size of allocated line-offset list */ static unsigned savedsiz; /* saved "siz" */ static int *savedpoff; /* saved "pofRS��TS��US��VS��WS��XS��YS��ZS��[S������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f" */ static char *savedc1; /* saved "c1" */ if (pblock->b_flags & PARTLY) { /* * The block was already partly filled. Initialize locals * accordingly */ poff = savedpoff; siz = savedsiz; pblock->b_flags = 0; c1 = savedc1; if (c1 == pblock->b_info || *(c1 - 1)) { /* * We had incremented "lastreadline" temporarily, * because the last line could not be completely read * last time we tried. Undo this increment */ poff--; --lastreadline; } } else { if (nopipe) pblock->b_foff = lseek(stdf, 0L, 1); if (saved) { /* * There were leftovers from the previous block */ pblock->b_info = saved; if (nopipe) pblock->b_foff -= savedc1 - saved; c1 = savedc1; saved = 0; } else { /* Allocate new block */ pblock->b_info = c1 = alloc(BLOCKSIZE + 1, 1); } /* * Allocate some space for line-offsets */ pblock->b_offs = poff = (int *) alloc((unsigned) (100 * sizeof(int)), 0); siz = 99; *poff++ = 0; } c = c1; for (;;) { /* * Read loop */ cnt = read(stdf, c1, BLOCKSIZE - (c1 - pblock->b_info)); if (cnt < 0) { /* * Interrupted read */ if (errno == EINTR) continue; error("Could not read input file"); cnt = 0; } c1 += cnt; if (c1 != pblock->b_info + BLOCKSIZE) { ENDseen = 1; pblock->b_flags |= PARTLY; } break; } assert(c <= c1); while (c < c1) { /* * Now process the block */ *c &= 0177; /* Most significant bit ignored */ if (*c == '\n') { /* * Newlines are replaced by '\0', so that "getline" * can deliver one line at a time */ *c = 0; lastreadline++; /* * Remember the line-offset */ if (poff == pblock->b_offs + siz) { /* * No space for it, allocate some more */ pblock->b_offs = (int *) re_alloc((char *) pblock->b_offs, (siz+1) * sizeof(int), (siz + 51) * sizeof(int)); poff = pblock->b_offs + siz; siz += 50; } *poff++ = c - pblock->b_info + 1; } else if (*c == '\0') { /* * 0-bytes are replaced by 0200, because newlines are * replaced by 0, and 0200 & 0177 gives again 0 ... */ *c = 0200; } c++; } assert(c==c1); *c = 0; if (c != pblock->b_info && *(c-1) != 0) { /* * The last line read does not end with a newline, so add one */ lastreadline++; *poff++ = c - pblock->b_info + 1; if (!(pblock->b_flags & PARTLY) && *(poff - 2) != 0) { /* * Save the started line; it will be in the next block. * Remove the newline we added just now. */ saved = c1 = alloc(BLOCKSIZE + 1, 1); c = pblock->b_info + *(--poff - 1); while (*c) *c1++ = *c++; c = pblock->b_info + *(poff - 1); savedc1 = c1; --lastreadline; } } pblock->b_end = lastreadline; if (pblock->b_flags & PARTLY) { /* * Take care, that we can call "nextblock" again, to fill in * the rest of this block */ savedsiz = siz; savedpoff = poff; savedc1 = c; if (c == pblock->b_info) { lastreadline++; pblock->b_end = 0; } } else { /* * Not completely read blocks are not in the linked list, * so can never be "swapped out". */ addtolist(pblock); cnt = pblock - blocklist; filldegree = ((c-pblock->b_info) + (cnt-1) * filldegree) / cnt; } assert(pblock->b_end - (pblock-1)->b_end <= poff - pblock->b_offs); } /* * Allocate core for the block, and read it back from * the temporary file. */ STATIC VOID readblock(pblock) register struct block *pblock; { register int size; register long i; /* * Find out where the block is, and read it */ pblock->b_info = alloc(BLOCKSIZE + 1, 1); i = (pblock - 1)->b_end * sizeof(int); size = (int) (pblock->b_end * sizeof(int) - i); pblock->b_offs = (int *) alloc((unsigned) size, 0); if (nopipe) { register char *c; register int line_index; int cnt; long l = lseek(stdf, 0L, 1); (VOID) lseek(stdf, pblock->b_foff, 0); cnt = read(stdf, pblock->b_info, BLOCKSIZE); (VOID) lseek(stdf, l, 0); c = pblock->b_info; pblock->b_offs[0] = 0; line_index = 1; size /= sizeof(int); while (c < pblock->b_info + cnt) { *c &= 0177; if (*c == '\n') { *c = '\0'; if (line_index < size) pblock->b_offs[line_index++] = (c - pblock->b_info) + 1; } else if (*c == '\0') *c = 0200; c++; } *c = '\0'; } else { (VOID) lseek(tfdes, (long) ((long) BLOCKSIZE * (pblock - blocklist)),0); if (read(tfdes, pblock->b_info,BLOCKSIZE) != BLOCKSIZE) { panic("read error"); } /* * Find out where the line-offset list is, and read it */ (VOID) lseek(ifdes, i, 0); if (read(ifdes, (char *) pblock->b_offs, size) != size) { panic("read error"); } pblock->b_info[BLOCKSIZE] = '\0'; } /* * Add this block to the list of incore blocks */ addtolist(pblock); } /* * Called after processing a file. * Free all core. */ VOID do_clean() { register struct block *pblock; register char *p; for (pblock = blocklist; pblock < maxblocklist; pblock++) { if (p = pblock->b_info) { free(p); free((char *) pblock->b_offs); } } if (p = (char *) blocklist) { free(p); } blocklist = 0; maxblocklist = 0; topblocklist = 0; lastreadline = 0; filldegree = 0; ENDseen = 0; if (p = saved) free(p); saved = 0; b_head = 0; b_tail = 0; # if MAXNBLOCKS nblocks = 0; # endif } /* * Close a file with file-descriptor "file", if it indeed is one */ STATIC VOID cls(file) { if (file) (VOID) close(file); } /* * Close all files */ VOID cls_files() { cls(tfdes); cls(ifdes); cls(stdf); } /* * Get a character. If possible, do some workahead. */ int getch() { # if USG_OPEN # include <fcntl.h> # include <sys/stat.h> register int i,j; struct stat buf; # else # ifdef FIONREAD # include <sys/stat.h> struct stat buf; long i; # endif # endif char c; int retval; flush(); if (startcomm) { /* * Command line option command */ if (*startcomm) return *startcomm++; return '\n'; } # if USG_OPEN if (stdf >= 0) { /* * Make reads from the terminal non-blocking, so that * we can see if the user typed something */ i = fcntl(0,F_GETFL,0); if (i != -1 && fcntl(0, F_SETFL, i|O_NDELAY) != -1) { j = 0; while (! ENDseen && ((j = read(0,&c,1)) == 0 #ifdef EWOULDBLOCK || (j < 0 && errno == EWOULDBLOCK) #endif ) && (nopipe || (fstat(stdf,&buf) >= 0 && buf.st_size > 0))) { /* * Do some read ahead, after making sure there * is input and the user did not type a command */ new_block(); } (VOID) fcntl(0,F_SETFL,i); if (j < 0) { /* * Could this have happened? * I'm not sure, because the read is * nonblocking. Can it be interrupted then? */ return -1; } if (j > 0) return c; } } # else # ifdef FIONREAD if (stdf >= 0) { /* * See if there are any characters waiting in the terminal input * queue. If there are not, read ahead. */ while (! ENDseen && ( ioctl(0, FIONREAD, (char *) &i) >= 0 && i == 0) && ( nopipe || fstat(stdf,&buf) >= 0 && buf.st_size > 0)) { /* * While the user does'nt type anything, and there is * input to be processed, work ahead */ if (interrupt) return -1; new_block(); } } # endif # endif if (read(0,&c,1) <= 0) retval = -1; else retval = c & 0177; return retval; } /* * Get the position of line "ln" in the file. */ long getpos(ln) long ln; { register struct block *pblock; register long i; pblock = getblock(ln,1); assert(pblock != 0); i = filldegree * (pblock - blocklist); return i - (filldegree - pblock->b_offs[ln - (pblock-1)->b_end]); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: getline.h,v 7.1 87/01/09 11:10:40 ceriel Exp $ */ # ifndef _GETLINE_ # define PUBLIC extern # else # define PUBLIC # endif char * getline(); /* * char * getline(ln,disable_interrupt) * long ln; The line number of the line to be returned * int disable_interrupt; 1 if interrupts must be ignored, 0 otherwise * * Returns a pointer to the line with linenumber "ln". * It returns 0 if * - there was an interrupt, and interrupts were not disabled, or * - there is no line with linenumber "ln". */ char * alloc(); /* * char * alloc(size, isblock) * unsigned size; The size in bytes * int isblock; Flag indicating whether this is a file-text * block * * Return a pointer to a block of "size" bytes. * Panics if no core can be found. */ VOID do_clean(); /* * void do_clean() * * Cleans up and initializes. */ VOID cls_files(); /* * void cls_files() * * Closes files. Useful for shell escapes. */ int getch(); /* * int getch() * * Get a character from input or command option line (only at start up). * Some systems allow us to do some workahead while the user is * thinking/reading. Use this to get parts of the input file in core. */ long to_lastline(); /* * long to_lastline() * * Finds the last line of the file, and returns its number. * This command can be interrupted, in which case it returns 0. */ long getpos(); /* * long getpos(line); * * get offset of line "line" in the input */ # undef PUBLIC ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ #ifndef lint static char rcsid[] = "$Header: help.c,v 7.2 88/04/29 11:45:22 ceriel Exp $"; #endif #define _HELP_ #include "in_all.h" #include "help.h" #include "machine.h" #include "commands.h" #include "keys.h" #include "output.h" #include "prompt.h" #include "main.h" #include "display.h" #include "term.h" #include "options.h" static int h_cnt; /* Count # of lines */ static struct state *origin; /* Keep track of startstate */ /* * Print a key sequence. * We arrived at an endstate. The s_next link in the state structure now * leads us from "origin" to the current state, so that we can print the key * sequence easily. */ STATIC VOID pr_comm() { register struct state *p = origin; register char *pb; register int c; char buf[30]; register int i = 0; /* How many characters printed? */ pb = buf; for (;;) { c = p->s_char & 0177; if (c < ' ' || c == 0177) { /* * Will take an extra position */ i++; } *pb++ = c; i++; if (!p->s_match) break; p = p->s_next; } do { *pb++ = ' '; } while (++i < 12); *pb = 0; cputline(buf); } /* * Print out a description of the keymap. This is done, by temporarily using * the s_next field in the state structure indicate the state matching the * next character, so that we can walk from "origin" to an endstate. */ STATIC VOID pr_mach(currstate, back) register struct state *currstate, *back; { struct state *save; while (currstate) { if (interrupt) break; if (back) { save = back->s_next; /* Save original link */ back->s_next = currstate; } if (!currstate->s_match) { /* * End state, print command */ pr_comm(); putline(commands[currstate->s_cnt].c_descr); putline("\r\n"); if (++h_cnt >= maxpagesize) { ret_to_continue(); h_cnt = 0; } } else pr_mach(currstate->s_match, currstate); currstate = currstate->s_next; if (back) back->s_next = save; /* restore */ else origin = currstate; } } /*ARGSUSED*/ int do_help(i) long i; { /* The help command */ startcomm = 0; h_cnt = 2; putline("\r\nSummary of yap commands:\r\n"); origin = currmap->k_mach; pr_mach(currmap->k_mach, (struct state *) 0); if (h_cnt) { ret_to_continue(); } if (!hardcopy && scr_info.currentpos) redraw(1); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: help.h,v 7.0 86/12/05 09:36:55 ceriel Exp $ */ # ifndef _HELP_ # define PUBLIC extern # else # define PUBLIC # endif int do_help(); /* * int do_help(cnt); * long cnt; This is ignored, but a count is given * to any command * * Give a summary of commands */ # undef PUBLIC ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: in_all.h,v 1.2 92/04/13 13:15:58 philip Exp $ */ #define DO_ASSERT 0 /* define when debugging */ # ifdef DO_ASSERT # define STATIC # else # define STATIC static # endif #define VOID void /* preferably void, but int if your compiler does not recognize void */ #if _POSIX_SOURCE #define POSIX_OPEN 1 /* POSIX "open" system call */ #else #define USG_OPEN 0 /* USG "open" system call (include <fcntl.h>) */ #define BSD4_2_OPEN 0 /* BSD 4.2 "open" system call (include <sys/file.h>)*/ #endif /* Sanity check 1 */ # if (!!USG_OPEN) + (!!BSD4_2_OPEN) + (!!POSIX_OPEN) > 1 Oops, now why did you do that? O, never mind, just try it again with USG_OPEN = 1 or for System III, System V etc. BSD4_2_OPEN = 1 or for Berkeley 4.2, Ultrix etc. POSIX_OPEN = 1 or for POSIX compliant systems. USG_OPEN = 0 and BSD4_2_OPEN = 0 and POSIX_OOPEN for Berkeley 4.1, v7 and whatever else # endif #define BSD_REGEX 0 /* Berkeley style re_comp/re_exec */ #define V8_REGEX 1 /* V8 style regexec/regcomp */ #define USG_REGEX 0 /* USG style regex/regcmp */ /* Sanity check 2 */ # if USG_REGEX + BSD_REGEX + V8_REGEX > 1 Select one style for the regular expressions please! # endif #define USG_TTY 0 /* define if you have an USG tty driver (termio) */ /* If you do not define this, you get either the * V7 tty driver or the BSD one. */ #if _POSIX_SOURCE #define POSIX_TTY 1 #endif #if __minix && !__minix_vmd #define MAXNBLOCKS 10 /* Limit the number of blocks that yap will use to keep * the input in core. * This was needed to let yap run on an IBM XT * running PC/IX. The problem is that malloc can * allocate almost all available space, leaving no * space for the stack, which causes a memory fault. * Internal yap blocks are 2K, but there is a lot of * additional information that yap keeps around. You * can also use it if you want to limit yap's maximum * size. If defined, it should be at least 3. * 10 is probably a reasonable number. */ #endif /* Sanity check 3 */ # ifdef MAXNBLOCKS # if MAXNBLOCKS < 3 Read the above comment! # endif # endif #define VT100_PATCH /* This involves a patch that will insert lines * correctly on a VT100 terminal. The termcap entry * for it contains an "al" with %-escapes. According * to the termcap-documentation this is not allowed, * but ... * If VT100_PATCH is defined, the "al" capability will * be offered to "tgoto", before "tputs"-ing it. * I don't know if there are any terminals out there * that have a % in their "al" capability. If there * are, yap will not work properly when compiled with * VT100_PATCH defined. * Also, escape sequences for standout and underline * will be tputs-ed if VT100_PATCH is defined. */ #if _MINIX #define LCASE 0 /* Minix doesn;t have LCASE */ #endif ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: keys.c,v 7.2 89/12/07 16:47:50 ceriel Exp $"; # endif # define _KEYS_ # include <ctype.h> # include "in_all.h" # include "machine.h" # include "keys.h" # include "commands.h" # include "prompt.h" # include "assert.h" char defaultmap[] = "\ bf=P:bl=k:bl=^K:bl=^[[A:bot=l:bot=$:bot=^[[Y:bp=-:bp=^[[V:bs=^B:bse=?:bsl=S:\ bsp=F:chm=X:exg=x:ff=N:fl=^J:fl=^M:fl=j:fl=^[[B:fp= :fp=^[[U:fs=^D:fse=/:\ fsl=s:fsp=f:hlp=h:nse=n:nsr=r:red=^L:rep=.:bps=Z:bss=b:fps=z:fss=d:shl=!:\ tom=':top=\\^:top=^[[H:vis=e:wrf=w:qui=q:qui=Q:mar=m:pip=|"; char *strcpy(); char *strcat(); char *getenv(); /* * Construct an error message and return it */ STATIC char * kerror(key, emess) char *key, *emess; { static char ebuf[80]; /* Room for the error message */ (VOID) strcpy(ebuf, key); (VOID) strcat(ebuf, emess); return ebuf; } /* * Compile a keymap into commtable. Returns an error message if there * is one */ STATIC char * compile(map, commtable) register char *map; register struct keymap *commtable; { register char *mark; /* Indicates start of mnemonic */ register char *c; /* Runs through buf */ register int temp; char *escapes = commtable->k_esc; char buf[10]; /* Will hold key sequence */ (VOID) strcpy(commtable->k_help,"Illegal command"); while (*map) { c = buf; mark = map; /* Start of mnemonic */ while (*map && *map != '=') { map++; } if (!*map) { /* * Mnemonic should end with '=' */ return kerror(mark, ": Syntax error"); } *map++ = 0; while (*map) { /* * Get key sequence */ if (*map == ':') { /* * end of key sequence */ map++; break; } *c = *map++ & 0177; if (*c == '^' || *c == '\\') { if (!(temp = *map++)) { /* * Escape not followed by a character */ return kerror(mark, ": Syntax error"); } if (*c == '^') { if (temp == '?') *c = 0177; else *c = temp & 037; } else *c = temp & 0177; } setused(*c); c++; if (c >= &buf[9]) { return kerror(mark,": Key sequence too long"); } } *c = 0; if (!(temp = lookup(mark))) { return kerror(mark,": Nonexistent function"); } if (c == &buf[1] && (commands[temp].c_flags & ESC) && escapes < &(commtable->k_esc[sizeof(commtable->k_esc)-1])) { *escapes++ = buf[0] & 0177; } temp = addstring(buf, temp, &(commtable->k_mach)); if (temp == FSM_ISPREFIX) { return kerror(mark,": Prefix of other key sequence"); } if (temp == FSM_HASPREFIX) { return kerror(mark,": Other key sequence is prefix"); } assert(temp == FSM_OKE); if (!strcmp(mark, "hlp")) { /* * Create an error message to be given when the user * types an illegal command */ (VOID) strcpy(commtable->k_help, "Type "); (VOID) strcat(commtable->k_help, buf); (VOID) strcat(commtable->k_help, " for help"); } } *escapes = 0; return (char *) 0; } /* * Initialize the keymaps */ VOID initkeys() { register char *p; static struct keymap xx[2]; currmap = &xx[0]; othermap = &xx[1]; p = compile(defaultmap, currmap); /* Compile default map */ assert(p == (char *) 0); p = getenv("YAPKEYS"); if (p) { if (!(p = compile(p, othermap))) { /* * No errors in user defined keymap. So, use it */ do_chkm(0L); return; } error(p); } othermap = 0; /* No other keymap */ } int is_escape(c) { register char *p = currmap->k_esc; while (*p) { if (c == *p++) return 1; } return 0; } static char keyset[16]; /* bitset indicating which keys are * used */ /* * Mark key "key" as used */ VOID setused(key) int key; { keyset[(key & 0177) >> 3] |= (1 << (key & 07)); } /* * return non-zero if key "key" is used in a keymap */ int isused(key) int key; { return keyset[(key & 0177) >> 3] & (1 << (key & 07)); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: keys.h,v 7.1 88/04/29 11:46:10 ceriel Exp $ */ # ifndef _KEYS_ # define PUBLIC extern # else # define PUBLIC # endif PUBLIC struct keymap { char k_help[80]; /* To be printed on illegal command */ struct state *k_mach; /* Finite state machine */ char k_esc[10]; /* escape chars */ } *currmap, /* pointer to current key map */ *othermap; /* pointer to other keymap */ VOID initkeys(); /* * void initkeys(); * * Initializes the keymap(s). */ VOID setused(); /* * void setused(key); * int key; * * Marks the key "key" as used. */ int isused(); /* * int isused(key); * int key; * * returns 0 if the key "key" is not used. * Otherwise it returns non-zero. */ int is_escape(); /* * int is_escape(c); * int c; * * Returns 1 if "c" is an escape char (shell or pipe) in the current * keymap. */ # undef PUBLIC ������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: machine.c,v 7.1 87/01/09 11:09:58 ceriel Exp $"; # endif # define _MACHINE_ # include <ctype.h> # include "in_all.h" # include "machine.h" # include "getline.h" # include "assert.h" /* * Add part of finite state machine to recognize the string s. */ STATIC int addtomach(s, cnt, list) char *s; struct state **list; { register struct state *l; register int i = FSM_OKE; /* Return value */ register int j; for (;;) { l = *list; if (!l) { /* * Create new list element */ *list = l = (struct state *) alloc(sizeof(*l), 0); l->s_char = *s; l->s_endstate = 0; l->s_match = 0; l->s_next = 0; } if (l->s_char == *s) { /* * Continue with next character */ if (!*++s) { /* * No next character */ j = l->s_endstate; l->s_endstate = 1; if (l->s_match || j) { /* * If the state already was an endstate, * or has a successor, the currently * added string is a prefix of an * already recognized string */ return FSM_ISPREFIX; } l->s_cnt = cnt; return i; } if (l->s_endstate) { /* * In this case, the currently added string has * a prefix that is an already recognized * string. */ i = FSM_HASPREFIX; } list = &(l->s_match); continue; } list = &(l->s_next); } /* NOTREACHED */ } /* * Add a string to the FSM. */ int addstring(s,cnt,machine) register char *s; struct state **machine; { if (!s || !*s) { return FSM_ISPREFIX; } return addtomach(s,cnt,machine); } /* * Match string s with the finite state machine. * If it matches, the number of characters actually matched is returned, * and the count is put in the word pointed to by i. * If the string is a prefix of a string that could be matched, * FSM_ISPREFIX is returned. Otherwise, 0 is returned. */ int match(s,i,mach) char *s; int *i; register struct state *mach; { register char *s1 = s; /* Walk through string */ register struct state *mach1 = 0; /* Keep track of previous state */ while (mach && *s1) { if (mach->s_char == *s1) { /* * Current character matches. Carry on with next * character and next state */ mach1 = mach; mach = mach->s_match; s1++; continue; } mach = mach->s_next; } if (!mach1) { /* * No characters matched */ return 0; } if (mach1->s_endstate) { /* * The string matched */ *i = mach1->s_cnt; return s1 - s; } if (!*s1) { /* * The string matched a prefix */ return FSM_ISPREFIX; } return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: machine.h,v 7.0 86/12/05 09:37:28 ceriel Exp $ */ # ifndef _MACHINE_ # define PUBLIC extern # else # define PUBLIC # endif /* * Simple minded finite state machine implementation to recognize * strings. */ struct state { char s_char; /* character to match with */ char s_endstate; /* flag, 1 if this state is an endstate */ struct state *s_match; /* new state if matched */ struct state *s_next; /* other characters to match with */ short s_cnt; /* if an endstate, this field is filled with * some info, dependant on the machine. */ }; # define FSM_OKE 0 # define FSM_ISPREFIX -1 /* Must be < 0 */ # define FSM_HASPREFIX 1 int addstring(); /* * int addstring(str,cnt,mach) * char *str; The string to be recognized * int cnt; Attribute of the string. * struct state **mach; The finite state machine * * This routine adds a string to a finite state automaton. * It returns FSM_ISPREFIX if the added string is a prefix of a string already * in the automaton, FSM_HASPREFIX if a string, already recognized by the * automaton, is a prefix of the added string. * Otherwise it returns FSM_OKE. */ int match(); /* * int match(str,p_int,mach) * char *str; pointer to string * int *p_int; Pointer to an integer * struct state *mach; The finite state machine * * A match of the string indicated by "str" is tried. If a head of "str" * is recognized by the finite state automaton, a machine dependant number * is put in the integer pointed to by "p_int". * The number of characters that match is returned, so a return value of 0 * means no match. * A return value of FSM_PREFIX means that the string "str" was a prefix of a * matched string. */ # undef PUBLIC ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: main.c,v 1.2 92/04/13 13:16:02 philip Exp $"; # endif # define _MAIN_ # include "in_all.h" # if USG_OPEN # include <fcntl.h> # endif # if BSD4_2_OPEN # include <sys/file.h> # endif # if POSIX_OPEN # include <sys/types.h> # include <fcntl.h> # endif # include "main.h" # include "term.h" # include "options.h" # include "output.h" # include "process.h" # include "commands.h" # include "display.h" # include "prompt.h" char *strcpy(); STATIC int initialize(); # ifdef SIGTSTP STATIC int suspsig(); # endif int main(argc,argv) register char ** argv; { register char ** av; if (! isatty(1)) { no_tty = 1; } argv[argc] = 0; progname = argv[0]; if ((av = readoptions(argv)) == (char **) 0 || initialize(*av ? 1 : 0)) { if (no_tty) { close(1); (VOID) dup(2); } putline("Usage: "); putline(argv[0]); putline( " [-c] [-u] [-n] [-q] [-number] [+command] [file ... ]\n"); flush(); exit(1); } if (no_tty) { *--av = "cat"; execve("/bin/cat", av, (char *) 0); } else processfiles(argc-(av-argv), av); (VOID) quit(); /* NOTREACHED */ } char *mktemp(); /* * Open temporary file for reading and writing. * Panic if it fails */ static char indexfile[30], tempfile[30]; int opentemp(i) { register fildes; register char *f; f = i ? mktemp(indexfile) : mktemp(tempfile); # if BSD4_2_OPEN || USG_OPEN || POSIX_OPEN if ((fildes = open(f,O_RDWR|O_TRUNC|O_CREAT,0600)) < 0) { # else if ((fildes = creat(f,0600)) <= 0 || close(fildes) < 0 || (fildes = open(f,2)) < 0) { # endif panic("Couldn't open temporary file"); } (VOID) unlink(f); return fildes; } /* * Collect initializing stuff here. */ STATIC int initialize(x) { if (!(nopipe = x)) { /* * Reading from pipe */ if (isatty(0)) { return 1; } stdf = dup(0); /* Duplicate file descriptor of input */ if (no_tty) return 0; /* * Make sure standard input is from the terminal. */ (VOID) close(0); # if BSD4_2_OPEN || USG_OPEN || POSIX_OPEN if (open("/dev/tty",O_RDONLY,0) != 0) { # else if (open("/dev/tty",0) != 0) { # endif putline("Couldn't open terminal\n"); flush(); exit(1); } } if (no_tty) return 0; (VOID) strcpy(tempfile,"/usr/tmp/yap_XXXXXX"); (VOID) strcpy(indexfile,"/usr/tmp/yap-XXXXXX"); /* * Handle signals. * Catch QUIT, DELETE and ^Z */ (VOID) signal(SIGQUIT,SIG_IGN); (VOID) signal(SIGINT, catchdel); ini_terminal(); # ifdef SIGTSTP if (signal(SIGTSTP,SIG_IGN) == SIG_DFL) { (VOID) signal(SIGTSTP,suspsig); } # endif (VOID) signal(SIGQUIT,quit); return 0; } int catchdel() { (VOID) signal(SIGINT, catchdel); interrupt = 1; } # ifdef SIGTSTP /* * We had a SIGTSTP signal. * Suspend, by a call to this routine. */ VOID suspend() { nflush(); resettty(); (VOID) signal(SIGTSTP,SIG_DFL); #if BSD4_2_OPEN sigsetmask(sigblock(0)&~(1 << (SIGTSTP - 1))); #endif (VOID) kill(0, SIGTSTP); /* * We are not here anymore ... * * * But we arive here ... */ inittty(); putline(TI); flush(); (VOID) signal(SIGTSTP,suspsig); } /* * SIGTSTP signal handler. * Just indicate that we had one, ignore further ones and return. */ STATIC int suspsig() { suspend(); if (DoneSetJmp) longjmp(SetJmpBuf, 1); } # endif /* * quit : called on exit. * I bet you guessed that much. */ int quit() { clrbline(); resettty(); flush(); exit(0); } /* * Exit, but nonvoluntarily. * At least tell the user why. */ VOID panic(s) char *s; { putline("\007\007\007\r\n"); putline(s); putline("\r\n"); quit(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: main.h,v 7.1 87/04/07 14:05:36 ceriel Exp $ */ # ifndef _MAIN_ # define PUBLIC extern # else # define PUBLIC # endif PUBLIC int nopipe; /* Not reading from pipe? */ PUBLIC char * progname; /* Name of this program */ PUBLIC int interrupt; /* Interrupt given? */ PUBLIC int no_tty; /* output not to a terminal, behave like cat */ int main(); /* * int main(argc,argv) * int argc; Argument count * char *argv[]; The arguments * * Main program. */ int opentemp(); /* * int opentemp(i) * int i; Either 0 or 1, indicates which temporary to open * * Returns a file descriptor for the temporary file, or panics if * it couldn't open one. */ int catchdel(); /* * int catchdel(); * * interrupt handler. Does not return a value, but PCC has some * difficulty with the type pointer to function returning void. * This routine only sets a flag indicating that there was an interrupt. */ int quit(); /* * int quit(); * * Quit signal handler. Also used for normal exits. * It resets the terminal and exits */ VOID panic(); /* * void panic(str) * char *str; Reason for panic * * Panic, but at least tell the user why. */ # ifdef SIGTSTP VOID suspend(); /* * void suspend() * * Suspends this process */ # endif # undef PUBLIC ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: options.c,v 7.0 86/12/05 09:37:45 ceriel Exp $"; # endif # define _OPTIONS_ # include "in_all.h" # include "options.h" # include "output.h" # include "display.h" # include <ctype.h> STATIC int parsopt(); char *getenv(); /* * Read the options. Return the argv pointer following them if there were * no errors, otherwise return 0. */ char ** readoptions(argv) char ** argv; { register char ** av = argv+1; register char *p; if (p = getenv("YAP")) { (VOID) parsopt(p); } while (*av && **av == '-') { if (parsopt(*av)) { /* * Error in option */ putline(*av); putline(": illegal option\n"); return (char **) 0; } av++; } if (*av && **av == '+') { /* * Command in command line */ startcomm = *av + 1; av++; } return av; } STATIC int parsopt(s) register char *s; { register i; if (*s == '-') s++; if (isdigit(*s)) { /* * pagesize option */ i = 0; do { i = i * 10 + *s++ - '0'; } while (isdigit(*s)); if (i < MINPAGESIZE) i = MINPAGESIZE; pagesize = i; } while (*s) { switch(*s++) { case 'c' : cflag++; break; case 'n' : nflag++; break; case 'u' : uflag++; break; case 'q' : qflag++; break; default : return 1; } } return 0; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: options.h,v 7.0 86/12/05 09:37:51 ceriel Exp $ */ # ifndef _OPTIONS_ # define PUBLIC extern # else # define PUBLIC # endif PUBLIC int cflag; /* no home before each page */ PUBLIC int uflag; /* no underlining */ PUBLIC int nflag; /* no pattern matching on input */ PUBLIC int qflag; /* no exit on the next page command */ PUBLIC char * startcomm; /* There was a command option */ char ** readoptions(); /* * char ** readoptions(argv) * char **argv; Arguments given to yap. * * process the options from the arguments. Return 0 if there was an error, * otherwise return a pointer to where the filenames start. */ # undef PUBLIC ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* * Handle output to screen */ # ifndef lint static char rcsid[] = "$Header: output.c,v 7.1 87/04/07 14:05:46 ceriel Exp $"; # endif # define _OUTPUT_ # include "in_all.h" # include "output.h" # include "main.h" # define OBUFSIZ 64*128 static char _outbuf[OBUFSIZ]; VOID flush() { /* Flush output buffer, by writing it */ register char *p = _outbuf; _ocnt = OBUFSIZ; if (_optr) (VOID) write(1, p, _optr - p); _optr = p; } VOID nflush() { /* Flush output buffer, ignoring it */ _ocnt = OBUFSIZ; _optr = _outbuf; } int fputch(ch) char ch; { /* print a character */ putch(ch); } VOID putline(s) register char *s; { /* Print string s */ if (!s) return; while (*s) { putch(*s++); } } /* * A safe version of putline. All control characters are echoed as ^X */ VOID cputline(s) char *s; { register c; while (c = *s++) { if ((unsigned) c > 0177) c &= 0177; if (c < ' ' || c == 0177) { putch('^'); c ^= 0100; } putch(c); } } /* * Simple minded routine to print a number */ VOID prnum(n) long n; { putline(getnum(n)); } static char * fillnum(n, p) long n; char *p; { if (n >= 10) { p = fillnum(n / 10, p); } *p++ = (int) (n % 10) + '0'; *p = '\0'; return p; } char * getnum(n) long n; { static char buf[20]; fillnum(n, buf); return buf; } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: output.h,v 7.1 87/04/07 14:05:56 ceriel Exp $ */ # ifndef _OUTPUT_ # define PUBLIC extern # else # define PUBLIC # endif PUBLIC int _ocnt; PUBLIC char *_optr; #define putch(ch) if (1) {if (--_ocnt <= 0) flush(); *_optr++ = (ch);} else VOID flush(); /* * void flush() * * Write the output buffer to the screen */ VOID nflush(); /* * void nflush() * * Clear output buffer, but do not write it */ int fputch(); /* * int fputch(c) * int c; The character to be printed * * Put character "c" in output buffer and flush if necessary. */ VOID putline(); /* * void putline(s) * char *s; The string to be printed * * Put string "s" in output buffer etc... */ VOID cputline(); /* * void cputline(s) * char *s; The string to be handled * * Put string "s" in the output buffer, expanding control characters */ VOID prnum(); /* * void prnum(n) * long n; The number to be printed * * print the number "n", using putch. */ char *getnum(); /* * char *getnum(n) * long n; The number to be converted to a string * * Convert a number to a string and return a pointer to it. */ # undef PUBLIC ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: pattern.c,v 7.2 88/04/29 11:46:44 ceriel Exp $"; # endif not lint # define _PATTERN_ # include "in_all.h" # include "pattern.h" # include "getline.h" # if V8_REGEX # include <regexp.h> # endif V8_REGEX /* * Interface to regular expression routines. * Also: simple minded patterns without meta-characters. */ # if USG_REGEX static char *pattern; /* Pointer to compiled pattern */ char *regcmp(), *regex(); # endif USG_REGEX # if V8_REGEX static struct regexp *pattern; static char *rc_error; struct regexp *regcomp(); # endif V8_REGEX # if USG_REGEX || V8_REGEX /* * Compile a new pattern, but first free previous result. */ char * re_comp(s) char *s; { if (!*s) { /* * user wants previous pattern */ return (char *) 0; } if (pattern) { /* * there was a compiled pattern */ free(pattern); pattern = 0; } # if USG_REGEX return (pattern = regcmp(s, (char *) 0)) ? (char *) 0 : "Error in pattern"; # endif USG_REGEX # if V8_REGEX pattern = regcomp(s); if (pattern) return (char *) 0; if (rc_error) return rc_error; return "Error in pattern"; # endif V8_REGEX } # if V8_REGEX VOID regerror(str) char *str; { rc_error = str; } # endif V8_REGEX /* * Search for compiled pattern in string "s". Return 0 if not found. */ re_exec(s) char *s; { # if USG_REGEX return !(regex(pattern,s) == 0); # endif USG_REGEX # if V8_REGEX # if _MINIX return regexec(pattern,s,1); # else return regexec(pattern,s); # endif # endif V8_REGEX } # else # ifndef BSD_REGEX /* * In this case, simple minded pattern search without meta-characters */ char *strcpy(); static char *pattern; /* * re_comp : Just remember pattern. */ char * re_comp(s) char *s; { if (!*s) { /* * User wants previous pattern */ if (!pattern) { return "No previous regular expression"; } return (char *) 0; } if (pattern) { /* * Free old pattern */ free(pattern); } pattern = alloc((unsigned) (strlen(s) + 1), 0); (VOID) strcpy(pattern,s); return (char *) 0; } /* * re-exec : Simple minded pattern matcher */ re_exec(s) register char *s; { register char *ppat, *pstr; for (; *s; s++) { /* * As long as there are characters ... */ ppat = pattern; /* Try the pattern again */ pstr = s; while (*ppat == *pstr) { if (*++ppat == '\0') { /* * The pattern matched! Report success */ return 1; } if (*++pstr == '\0') { /* * Not enough characters left in the string. * Report failure */ return 0; } } } return 0; /* Failure */ } # endif not BSD_REGEX # endif �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: pattern.h,v 7.0 86/12/05 09:38:12 ceriel Exp $ */ # ifndef _PATTERN_ # define PUBLIC extern # else # define PUBLIC # endif char * re_comp(); int re_exec(); # undef PUBLIC �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: process.c,v 1.1 91/12/17 13:06:57 philip Exp $"; # endif # define _PROCESS_ # include "in_all.h" # if USG_OPEN # include <fcntl.h> # endif # if BSD4_2_OPEN # include <sys/file.h> # endif # if POSIX_OPEN # include <sys/types.h> # include <fcntl.h> # endif # include <sys/types.h> # include <sys/stat.h> # include "process.h" # include "commands.h" # include "display.h" # include "prompt.h" # include "getline.h" # include "main.h" # include "options.h" # include "output.h" static int nfiles; /* Number of filenames on command line */ /* * Visit a file, file name is "fn". */ VOID visitfile(fn) char *fn; { struct stat statbuf; if (stdf > 0) { /* * Close old input file */ (VOID) close(stdf); } currentfile = fn; # if USG_OPEN || BSD4_2_OPEN || POSIX_OPEN if ((stdf = open(fn,O_RDONLY,0)) < 0) { # else if ((stdf = open(fn,0)) < 0) { # endif error(": could not open"); maxpos = 0; } else { /* Get size for percentage in prompt */ (VOID) fstat(stdf, &statbuf); maxpos = statbuf.st_size; } do_clean(); d_clean(); } /* * process the input files, one by one. * If there is none, input is from a pipe. */ VOID processfiles(n,argv) char ** argv; { static char *dummies[3]; long arg; if (!(nfiles = n)) { /* * Input from pipe */ currentfile = "standard-input"; /* * Take care that *(filenames - 1) and *(filenames + 1) are 0 */ filenames = &dummies[1]; d_clean(); do_clean(); } else { filenames = argv; (VOID) nextfile(0); } *--argv = 0; if (startcomm) { n = getcomm(&arg); if (commands[n].c_flags & NEEDS_SCREEN) { redraw(0); } do_comm(n,arg); startcomm = 0; } redraw(1); if (setjmp(SetJmpBuf)) { nflush(); redraw(1); } DoneSetJmp = 1; for (;;) { interrupt = 0; n = getcomm(&arg); do_comm(n, arg); } } /* * Get the next file the user asks for. */ int nextfile(n) { register i; if ((i = filecount + n) >= nfiles || i < 0) { return 1; } filecount = i; visitfile(filenames[i]); return 0; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: process.h,v 7.1 87/04/07 14:06:16 ceriel Exp $ */ # ifndef _PROCESS_ # define PUBLIC extern # else # define PUBLIC # endif # include <setjmp.h> PUBLIC jmp_buf SetJmpBuf; PUBLIC int DoneSetJmp; PUBLIC int stdf; /* input file descriptor */ PUBLIC int filecount; /* index in filename table */ PUBLIC char ** filenames; /* the filenametable */ PUBLIC char * currentfile; /* Name of current file */ PUBLIC long maxpos; /* Size of file */ VOID visitfile(); /* * void visitfile(fn) * char *fn; name of file to be visited * * Opens the file "fn" and gives an error message if this fails. */ VOID processfiles(); /* * void processfiles(n,argv) * int n; number of files to be handled * char ** argv; names of the files * * Does all the work according to the divide and conquer method */ int nextfile(); /* * int nextfile(n) * int n; * * Visits n'th next file. If not there in argument list, return 1. * Otherwise return 0. */ # undef PUBLIC ����/* Copyright (c) 1985 Ceriel J.H. Jacobs */ # ifndef lint static char rcsid[] = "$Header: prompt.c,v 7.3 89/12/07 16:47:58 ceriel Exp $"; # endif # define _PROMPT_ # include "in_all.h" # include "prompt.h" # include "term.h" # include "output.h" # include "options.h" # include "display.h" # include "process.h" # include "getline.h" # include "main.h" # include "getcomm.h" # include "keys.h" # include "assert.h" # include "commands.h" #define basename(x) x #ifndef basename STATIC char * basename(); #endif static char *errorgiven; /* Set to error message, if there is one */ char * copy(p, ep, s) register char *p, *s; char *ep; { while (p < ep && *s) { *p++ = *s++; } return p; } /* * display the prompt and refresh the screen. */ VOID give_prompt() { register char **name; register struct scr_info *p = &scr_info; char buf[256]; register char *pb = buf; if (startcomm) return; flush(); if (window()) { redraw(0); flush(); } if (!stupid) { /* * fancy prompt */ clrbline(); standout(); pb = copy(pb, &buf[255], basename(currentfile)); if (stdf >= 0) { pb = copy(pb, &buf[255], ", "); pb = copy(pb, &buf[255], getnum(p->firstline)); pb = copy(pb, &buf[255], "-"); pb = copy(pb, &buf[255], getnum(p->lastline)); } } else { *pb++ = '\007'; /* Stupid terminal, stupid prompt */ } if (errorgiven) { /* * display error message */ pb = copy(pb, &buf[255], " "); pb = copy(pb, &buf[255], errorgiven); if (stupid) { pb = copy(pb, &buf[255], "\r\n"); } errorgiven = 0; } else if (!stupid && (status || maxpos)) { pb = copy(pb, &buf[255], " ("); name = &filenames[filecount]; if (status) { /* * indicate top and/or bottom */ if (status & START) { if (!*(name - 1)) { pb = copy(pb, &buf[255], "Top"); } else { pb = copy(pb, &buf[255], "Previous: "); pb = copy(pb, &buf[255], basename(*(name - 1))); } if (status & EOFILE) { pb = copy(pb, &buf[255], ", "); } } if (status & EOFILE) { if (!*(name+1)) { pb = copy(pb, &buf[255], "Bottom"); } else { pb = copy(pb, &buf[255], "Next: "); pb = copy(pb, &buf[255], basename(*(name + 1))); } } } else { /* display percentage */ pb = copy(pb, &buf[255], getnum((100 * getpos(p->lastline))/maxpos)); pb = copy(pb, &buf[255], "%"); } pb = copy(pb, &buf[255], ")"); } *pb = '\0'; if (!stupid) { buf[COLS-1] = 0; putline(buf); standend(); } else putline(buf); } /* * Remember error message */ VOID error(str) char *str; { errorgiven = str; } #ifndef basename STATIC char * basename(fn) char *fn; { /* Return name without path */ register char *s; s = fn; while (*s++) ; /* Search end of name */ for (;;) { if (*--s == '/') { /* * Backwards to first '/' */ if (*(s+1)) { /* * There is a name after the '/' */ return s + 1; } *s = 0; /* No name after the '/' */ } if (s == fn) return s; } /* NOTREACHED */ } #endif VOID ret_to_continue() { /* Obvious */ int c; static char buf[2]; for (;;) { clrbline(); standout(); if (errorgiven) { putline(errorgiven); putline(" "); errorgiven = 0; } putline("[Type anything to continue]"); standend(); if (is_escape(c = getch())) { buf[0] = c; (VOID) match(buf, &c, currmap->k_mach); assert(c > 0); do_comm(c, -1L); } else break; } clrbline(); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: prompt.h,v 7.0 86/12/05 09:38:34 ceriel Exp $ */ # ifndef _PROMPT_ # define PUBLIC extern # else # define PUBLIC # endif VOID give_prompt(); /* * void give_prompt() * * Displays a prompt, with possibly an error message */ VOID error(); /* * void error(s) * char *s; The error * * Takes care that there will be an error message in the next prompt. */ VOID ret_to_continue(); /* * void ret_to_continue(); * * Asks the user to type something before continuing. */ # undef PUBLIC ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* * Terminal handling routines, mostly initializing. */ # ifndef lint static char rcsid[] = "$Header: term.c,v 1.2 92/04/13 13:16:08 philip Exp $"; # endif # define _TERM_ #include "in_all.h" #include "term.h" #include "machine.h" #include "output.h" #include "display.h" #include "options.h" #include "getline.h" #include "keys.h" #include "main.h" #ifdef TIOCGWINSZ static struct winsize w; #endif char *strcpy(), *strcat(), *tgoto(), *tgetstr(), *getenv(); static char tcbuf1[1024]; /* Holds terminal capability strings */ static char * ptc; /* Pointer in it */ static char tcbuf[1024]; /* Another termcap buffer */ short ospeed; /* Needed for tputs() */ char PC; /* Needed for tputs() */ char * UP; /* Needed for tgoto() */ static char *ll; struct linelist _X[100]; /* 100 is enough ? */ # if USG_TTY static struct termio _tty,_svtty; # elif POSIX_TTY static struct termios _tty, _svtty; # else # ifdef TIOCSPGRP static int proc_id, saved_pgrpid; # endif static struct sgttyb _tty,_svtty; # ifdef TIOCGETC static struct tchars _ttyc, _svttyc; # endif # ifdef TIOCGLTC static int line_discipline; static struct ltchars _lttyc, _svlttyc; # endif # endif static VOID handle(c) char *c; { /* if character *c is used, set it to undefined */ if (isused(*c)) *c = 0377; } /* * Set terminal in cbreak mode. * Also check if tabs need expanding. */ VOID inittty() { # if USG_TTY register struct termio *p = &_tty; ioctl(0,TCGETA,(char *) p); _svtty = *p; if (p->c_oflag & TAB3) { /* * We do tab expansion ourselves */ expandtabs = 1; } p->c_oflag &= ~(TAB3|OCRNL|ONLRET|ONLCR); p->c_oflag |= (/*ONOCR|*/OPOST); /* ONOCR does not seem to work very well in combination with ~ONLCR */ p->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON); if (isused('S'&037) || isused('Q'&037)) p->c_iflag &= ~IXON; handle(&(p->c_cc[0])); /* INTR and QUIT (mnemonics not defined ??) */ handle(&(p->c_cc[1])); erasech = p->c_cc[VERASE]; killch = p->c_cc[VKILL]; p->c_cc[VMIN] = 1; /* Just wait for one character */ p->c_cc[VTIME] = 0; ospeed = p->c_cflag & CBAUD; ioctl(0,TCSETAW,(char *) p); #elif POSIX_TTY register struct termios *p = &_tty; tcgetattr(0, p); _svtty = *p; #ifdef _MINIX /* Should be XTABS */ if (p->c_oflag & XTABS) { /* * We do tab expansion ourselves */ expandtabs = 1; } p->c_oflag &= (OPOST|XTABS); #else p->c_oflag &= ~OPOST; #endif p->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON); if (isused('S'&037) || isused('Q'&037)) p->c_iflag &= ~IXON; handle(&(p->c_cc[VINTR])); handle(&(p->c_cc[VQUIT])); erasech = p->c_cc[VERASE]; killch = p->c_cc[VKILL]; p->c_cc[VMIN] = 1; /* Just wait for one character */ p->c_cc[VTIME] = 0; ospeed = cfgetospeed(p); tcsetattr(0, TCSANOW, p); # else register struct sgttyb *p = &_tty; # ifdef TIOCSPGRP /* * If we can, we put yap in another process group, and the terminal * with it. This is done, so that interrupts given by the user * will only affect yap and not it's children (processes writing * on a pipe to yap) */ if (ioctl(0, TIOCSPGRP, (char *) &proc_id) != -1) { setpgrp(0, proc_id); } # endif ioctl(0,TIOCGETP,(char *) p); _svtty = *p; erasech = p->sg_erase; killch = p->sg_kill; ospeed = p->sg_ospeed; if (p->sg_flags & XTABS) { /* * We do tab expansion ourselves */ expandtabs = 1; } p->sg_flags |= (CBREAK); p->sg_flags &= ~(ECHO|XTABS|RAW|LCASE|CRMOD); #ifdef TIOCSETN ioctl(0, TIOCSETN, (char *) p); #else ioctl(0,TIOCSETP,(char *) p); #endif /* Bloody Sun ... */ #undef t_startc #undef t_stopc #undef t_intrc #undef t_quitc #undef t_suspc #undef t_dsuspc #undef t_flushc #undef t_lnextc # ifdef TIOCGETC { register struct tchars *q = &_ttyc; ioctl(0,TIOCGETC,(char *) q); _svttyc = *q; handle(&(q->t_intrc)); handle(&(q->t_quitc)); if (isused(q->t_startc) || isused(q->t_stopc)) { q->t_startc = q->t_stopc = 0377; } ioctl(0,TIOCSETC, (char *) q); } # endif # ifdef TIOCGLTC { register struct ltchars *q = &_lttyc; ioctl(0,TIOCGETD,(char *) &line_discipline); if (line_discipline == NTTYDISC) { ioctl(0, TIOCGLTC,(char *) q); _svlttyc = *q; handle(&(q->t_suspc)); handle(&(q->t_dsuspc)); q->t_flushc = q->t_lnextc = 0377; ioctl(0,TIOCSLTC, (char *) q); } } # endif # endif } /* * Reset the terminal to its original state */ VOID resettty() { # if USG_TTY ioctl(0,TCSETAW,(char *) &_svtty); # elif POSIX_TTY tcsetattr(0, TCSANOW, &_svtty); # else # ifdef TIOCSPGRP ioctl(0, TIOCSPGRP, (char *) &saved_pgrpid); setpgrp(0, saved_pgrpid); # endif ioctl(0,TIOCSETP,(char *) &_svtty); # ifdef TIOCGETC ioctl(0,TIOCSETC, (char *) &_svttyc); # endif # ifdef TIOCGLTC if (line_discipline == NTTYDISC) ioctl(0,TIOCSLTC, (char *) &_svlttyc); # endif # endif putline(TE); flush(); } /* * Get terminal capability "cap". * If not present, return an empty string. */ STATIC char * getcap(cap) char *cap; { register char *s; s = tgetstr(cap, &ptc); if (!s) return ""; return s; } /* * Initialize some terminal-dependent stuff. */ VOID ini_terminal() { register char * s; register struct linelist *lp, *lp1; register i; register UG, SG; char tempbuf[20]; char *mb, *mh, *mr; /* attributes */ initkeys(); #if !_MINIX # ifdef TIOCSPGRP proc_id = getpid(); ioctl(0,TIOCGPGRP, (char *) &saved_pgrpid); # endif #endif inittty(); stupid = 1; ptc = tcbuf1; BC = "\b"; TA = "\t"; if (!(s = getenv("TERM"))) s = "dumb"; if (tgetent(tcbuf, s) <= 0) { panic("No termcap entry"); } stupid = 0; hardcopy = tgetflag("hc"); /* Hard copy terminal?*/ PC = *(getcap("pc")); if (*(s = getcap("bc"))) { /* * Backspace if not ^H */ BC = s; } UP = getcap("up"); /* move up a line */ CE = getcap("ce"); /* clear to end of line */ CL = getcap("cl"); /* clear screen */ if (!*CL) cflag = 1; TI = getcap("ti"); /* Initialization for CM */ TE = getcap("te"); /* end for CM */ CM = getcap("cm"); /* cursor addressing */ SR = getcap("sr"); /* scroll reverse */ AL = getcap("al"); /* Insert line */ SO = getcap("so"); /* standout */ SE = getcap("se"); /* standend */ SG = tgetnum("sg"); /* blanks left by SO, SE */ if (SG < 0) SG = 0; US = getcap("us"); /* underline */ UE = getcap("ue"); /* end underline */ UG = tgetnum("ug"); /* blanks left by US, UE */ if (UG < 0) UG = 0; UC = getcap("uc"); /* underline a character */ mb = getcap("mb"); /* blinking attribute */ MD = getcap("md"); /* bold attribute */ ME = getcap("me"); /* turn off attributes */ mh = getcap("mh"); /* half bright attribute */ mr = getcap("mr"); /* reversed video attribute */ if (!nflag) { /* * Recognize special strings */ (VOID) addstring(SO,SG,&sppat); (VOID) addstring(SE,SG,&sppat); (VOID) addstring(US,UG,&sppat); (VOID) addstring(UE,UG,&sppat); (VOID) addstring(mb,0,&sppat); (VOID) addstring(MD,0,&sppat); (VOID) addstring(ME,0,&sppat); (VOID) addstring(mh,0,&sppat); (VOID) addstring(mr,0,&sppat); if (*UC) { (VOID) strcpy(tempbuf,BC); (VOID) strcat(tempbuf,UC); (VOID) addstring(tempbuf,0,&sppat); } } if (UG > 0 || uflag) { US = ""; UE = ""; } if (*US || uflag) UC = ""; COLS = tgetnum("co"); /* columns on page */ i = tgetnum("li"); /* Lines on page */ AM = tgetflag("am"); /* terminal wraps automatically? */ XN = tgetflag("xn"); /* and then ignores next newline? */ DB = tgetflag("db"); /* terminal retains lines below */ if (!*(s = getcap("ho")) && *CM) { s = tgoto(CM,0,0); /* Another way of getting home */ } if ((!*CE && !*AL) || !*s || hardcopy) { cflag = stupid = 1; } (VOID) strcpy(HO,s); if (*(s = getcap("ta"))) { /* * Tab (other than ^I or padding) */ TA = s; } if (!*(ll = getcap("ll")) && *CM && i > 0) { /* * Lower left hand corner */ (VOID) strcpy(BO, tgoto(CM,0,i-1)); } else (VOID) strcpy(BO, ll); if (COLS <= 0 || COLS > 256) { if ((unsigned) COLS >= 65409) { /* SUN bug */ COLS &= 0xffff; COLS -= (65409 - 128); } if (COLS <= 0 || COLS > 256) COLS = 80; } if (i <= 0) { i = 24; cflag = stupid = 1; } S��S��S��S��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������LINES = i; maxpagesize = i - 1; scrollsize = maxpagesize / 2; if (scrollsize <= 0) scrollsize = 1; if (!pagesize || pagesize >= i) { pagesize = maxpagesize; } /* * The next part does not really belong here, but there it is ... * Initialize a circular list for the screenlines. */ scr_info.tail = lp = _X; lp1 = lp + (100 - 1); for (; lp <= lp1; lp++) { /* * Circular doubly linked list */ lp->next = lp + 1; lp->prev = lp - 1; } lp1->next = scr_info.tail; lp1->next->prev = lp1; if (stupid) { (VOID) strcpy(BO,"\r\n"); } putline(TI); window(); } /* * Place cursor at start of line n. */ VOID mgoto(n) register n; { if (n == 0) home(); else if (n == maxpagesize && *BO) bottom(); else if (*CM) { /* * Cursor addressing */ tputs(tgoto(CM,0,n),1,fputch); } else if (*BO && *UP && n >= (maxpagesize >> 1)) { /* * Bottom and then up */ bottom(); while (n++ < maxpagesize) putline(UP); } else { /* Home, and then down */ home(); while (n--) putline("\r\n"); } } /* * Clear bottom line */ VOID clrbline() { if (stupid) { putline("\r\n"); return; } bottom(); if (*CE) { /* * We can clear to end of line */ clrtoeol(); return; } # ifdef VT100_PATCH insert_line(maxpagesize); # else insert_line(); # endif } # ifdef VT100_PATCH ins_line(l) { tputs(tgoto(AL, l, 0), maxpagesize - l, fputch); } # endif VOID home() { tputs(HO,1,fputch); } VOID bottom() { tputs(BO,1,fputch); if (!*BO) mgoto(maxpagesize); } int window() { #ifdef TIOCGWINSZ if (ioctl(1, TIOCGWINSZ, &w) < 0) return 0; if (w.ws_col == 0) w.ws_col = COLS; if (w.ws_row == 0) w.ws_row = LINES; if (w.ws_col != COLS || w.ws_row != LINES) { COLS = w.ws_col; LINES = w.ws_row; maxpagesize = LINES - 1; pagesize = maxpagesize; if (! *ll) (VOID) strcpy(BO, tgoto(CM,0,maxpagesize)); scr_info.currentpos = 0; scrollsize = maxpagesize / 2; if (scrollsize <= 0) scrollsize = 1; return 1; } #endif return 0; } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* Copyright (c) 1985 Ceriel J.H. Jacobs */ /* $Header: term.h,v 1.2 92/04/13 13:16:12 philip Exp $ */ /* All terminal and terminal dependent stuff */ # ifndef _TERM_ # define PUBLIC extern # else # define PUBLIC # endif # if USG_TTY # include <termio.h> # elif POSIX_TTY # include <termios.h> # else # include <sgtty.h> # endif #include <sys/types.h> #include <signal.h> #include <sys/ioctl.h> /* Terminal setting */ PUBLIC int expandtabs; /* Tabs need expanding? */ PUBLIC int stupid; /* Stupid terminal */ PUBLIC int hardcopy; /* Hardcopy terminal */ /* termcap stuff */ PUBLIC char *CE, /* clear to end of line */ *CL, /* clear screen */ *SO, /* stand out */ *SE, /* stand end */ *US, /* underline start */ *UE, /* underline end */ *UC, /* underline character */ *MD, /* bold start */ *ME, /* attributes (like bold) off */ *TI, /* initialize for CM */ *TE, /* End of CM */ *CM, /* Cursor addressing */ *TA, /* Tab */ *SR, /* Scroll reverse */ *AL; /* insert line */ PUBLIC int LINES, /* # of lines on screen */ COLS, /* # of colums */ AM, /* Automatic margins */ XN, /* newline ignored after wrap */ DB; /* terminal retains lines below */ PUBLIC char HO[20], /* Sequence to get to home position */ BO[20]; /* sequence to get to lower left hand corner */ PUBLIC int erasech, /* users erase character */ killch; /* users kill character */ PUBLIC struct state *sppat; /* Special patterns to be recognized */ PUBLIC char *BC; /* Back space */ #define backspace() putline(BC) #define clrscreen() tputs(CL,LINES,fputch) #define clrtoeol() tputs(CE,1,fputch) #define scrollreverse() tputs(SR,LINES,fputch) #ifdef VT100_PATCH #define insert_line(l) ins_line(l) #define standout() tputs(SO,1,fputch) #define standend() tputs(SE,1,fputch) #define underline() tputs(US,1,fputch) #define end_underline() tputs(UE,1,fputch) #define bold() tputs(MD,1,fputch) #define end_bold() tputs(ME,1,fputch) #define underchar() tputs(UC,1,fputch) # else #define insert_line() tputs(AL,LINES,fputch) #define standout() putline(SO) #define standend() putline(SE) #define underline() putline(US) #define end_underline() putline(UE) #define bold() putline(MD) #define end_bold() putline(ME) #define underchar() putline(UC) # endif #define givetab() tputs(TA,1,fputch) VOID inittty(); /* * void inittty() * * Initialises the terminal (sets it in cbreak mode, etc) */ VOID resettty(); /* * void resettty() * * resets the terminal to the mode in which it was before yap was invoked */ VOID ini_terminal(); /* * void ini_terminal() * * Handles the termcap entry for your terminal. In some cases, the terminal * will be considered stupid. */ VOID mgoto(); /* * void mgoto(n) * int n; Line to go to * * Put the cursor at the start of the n'th screen line. * This can be done in several ways (of course). */ VOID clrbline(); /* * void clrbline() * * clears the bottom line, by either clearing it to end of line, * or pushing it of the screen by inserting a line before it. */ VOID home(); VOID bottom(); /* * Obvious */ #ifdef WINDOW int window(); #endif # undef PUBLIC ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ crctab.c������ rbsb.c�������� rz.c���������� sz.c���������� zm.c���������� zmodem.h����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for zmodem all: rz sz CFLAGS= -DPOSIX -D_MINIX -D_POSIX_SOURCE -O -wo rz: rz.c rbsb.c zm.c zmodem.h cc $(CFLAGS) -i -o rz rz.c install -S 5kw $@ sz: sz.c rbsb.c zm.c zmodem.h cc $(CFLAGS) -i -o sz sz.c install -S 5kw $@ install: /usr/bin/rz /usr/bin/sz /usr/bin/rz: rz install -cs -o bin rz $@ /usr/bin/sz: sz install -cs -o bin sz $@ clean: rm -f *.bak *.o core rz sz ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Crc calculation stuff */ /* crctab calculated by Mark G. Mendel, Network Systems Corporation */ static unsigned short crctab[256] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 }; /* * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. * NOTE: First srgument must be in range 0 to 255. * Second argument is referenced twice. * * Programmers may incorporate any or all code into their programs, * giving proper credit within the source. Publication of the * source routines is permitted so long as proper credit is given * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, * Omen Technology. */ #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) /* * Copyright (C) 1986 Gary S. Brown. You may use this program, or * code or tables extracted from it, as desired without restriction. */ /* First, the polynomial itself and its table of feedback terms. The */ /* polynomial is */ /* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */ /* Note that we take it "backwards" and put the highest-order term in */ /* the lowest-order bit. The X^32 term is "implied"; the LSB is the */ /* X^31 term, etc. The X^0 term (usually shown as "+1") results in */ /* the MSB being 1. */ /* Note that the usual hardware shift register implementation, which */ /* is what we're using (we're merely optimizing it by doing eight-bit */ /* chunks at a time) shifts bits into the lowest-order term. In our */ /* implementation, that means shifting towards the right. Why do we */ /* do it this way? Because the calculated CRC must be transmitted in */ /* order from highest-order term to lowest-order term. UARTs transmit */ /* characters in order from LSB to MSB. By storing the CRC this way, */ /* we hand it to the UART in the order low-byte to high-byte; the UART */ /* sends each low-bit to hight-bit; and the result is transmission bit */ /* by bit from highest- to lowest-order term without requiring any bit */ /* shuffling on our part. Reception works similarly. */ /* The feedback terms table consists of 256, 32-bit entries. Notes: */ /* */ /* The table can be generated at runtime if desired; code to do so */ /* is shown later. It might not be obvious, but the feedback */ /* terms simply represent the results of eight shift/xor opera- */ /* tions for all combinations of data and CRC register values. */ /* */ /* The values must be right-shifted by eight bits by the "updcrc" */ /* logic; the shift must be unsigned (bring in zeroes). On some */ /* hardware you could probably optimize the shift in assembler by */ /* using byte-swap instructions. */ static long cr3tab[] = { /* CRC polynomial 0xedb88320 */ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd0S��S����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d }; #ifdef NFGM long UPDC32(b, c) long c; { return (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)); } #else #define UPDC32(b, c) (cr3tab[((int)c ^ b) & 0xff] ^ ((c >> 8) & 0x00FFFFFF)) #endif /* End of crctab.c */ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * * Rev 05-05-1988 * This file contains Unix specific code for setting terminal modes, * very little is specific to ZMODEM or YMODEM per se (that code is in * sz.c and rz.c). The CRC-16 routines used by XMODEM, YMODEM, and ZMODEM * are also in this file, a fast table driven macro version * * V7/BSD HACKERS: SEE NOTES UNDER mode(2) !!! * * This file is #included so the main file can set parameters such as HOWMANY. * See the main files (rz.c/sz.c) for compile instructions. */ #ifdef V7 #include <sys/types.h> #include <sys/stat.h> #include <sgtty.h> #define OS "V7/BSD" #ifdef LLITOUT long Locmode; /* Saved "local mode" for 4.x BSD "new driver" */ long Locbit = LLITOUT; /* Bit SUPPOSED to disable output translations */ #include <strings.h> #endif #endif #ifdef POSIX #include <sys/types.h> #include <sys/stat.h> #include <termios.h> #define OS "POSIX" #endif #ifndef OS #ifndef USG #define USG #endif #endif #ifdef USG #include <sys/types.h> #include <sys/stat.h> #include <termio.h> #include <sys/ioctl.h> #define OS "SYS III/V" #define MODE2OK #include <string.h> #endif #include "zmodem.h" _PROTOTYPE(static unsigned getspeed , (int code )); #if HOWMANY > 255 Howmany must be 255 or less #endif /* * return 1 iff stdout and stderr are different devices * indicating this program operating with a modem on a * different line */ int Fromcu; /* Were called from cu or yam */ void from_cu() { struct stat a, b; fstat(1, &a); fstat(2, &b); Fromcu = a.st_rdev != b.st_rdev; return; } void cucheck() { if (Fromcu) fprintf(stderr,"Please read the manual page BUGS chapter!\r\n"); } struct { unsigned baudr; int speedcode; } speeds[] = { 110, B110, 300, B300, #ifdef B600 600, B600, #endif 1200, B1200, 2400, B2400, 4800, B4800, 9600, B9600, #ifdef EXTA 19200, EXTA, 38400, EXTB, #endif 0, }; int Twostop; /* Use two stop bits */ #ifndef READCHECK #ifdef FIONREAD #define READCHECK /* * Return non 0 iff something to read from io descriptor f */ int rdchk(f) { static long lf; ioctl(f, FIONREAD, &lf); return ((int) lf); } #endif #ifdef SV #define READCHECK #include <fcntl.h> char checked = '\0' ; /* * Nonblocking I/O is a bit different in System V, Release 2 */ int rdchk(f) { int lf, savestat; savestat = fcntl(f, F_GETFL) ; fcntl(f, F_SETFL, savestat | O_NDELAY) ; lf = read(f, &checked, 1) ; fcntl(f, F_SETFL, savestat) ; return(lf) ; } #endif #endif static unsigned getspeed(code) int code; { register n; for (n=0; speeds[n].baudr; ++n) if (speeds[n].speedcode == code) return speeds[n].baudr; return 38400; /* Assume fifo if ioctl failed */ } #ifdef POSIX struct termios oldtty, tty; #else #ifdef ICANON struct termio oldtty, tty; #else struct sgttyb oldtty, tty; struct tchars oldtch, tch; #endif #endif int iofd = 0; /* File descriptor for ioctls & reads */ /* * mode(n) * 3: save old tty stat, set raw mode with flow control * 2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g * 1: save old tty stat, set raw mode * 0: restore original tty mode */ int mode(n) int n; { static did0 = FALSE; vfile("mode:%d", n); switch(n) { #ifdef POSIX case 2: /* Un-raw mode used by sz, sb when -g detected */ if(!did0) (void) tcgetattr(iofd, &oldtty); tty = oldtty; tty.c_iflag = BRKINT|IXON; tty.c_oflag = 0; /* Transparent output */ tty.c_cflag &= ~PARENB; /* Disable parity */ tty.c_cflag |= CS8; /* Set character size = 8 */ if (Twostop) tty.c_cflag |= CSTOPB; /* Set two stop bits */ tty.c_lflag = ISIG; tty.c_cc[VINTR] = Zmodem ? 03:030; /* Interrupt char */ tty.c_cc[VQUIT] = -1; /* Quit char */ tty.c_cc[VMIN] = 3; /* This many chars satisfies reads */ tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ (void) tcsetattr(iofd, TCSANOW, &tty); did0 = TRUE; return OK; case 1: case 3: if(!did0) (void) tcgetattr(iofd, &oldtty); tty = oldtty; tty.c_iflag = n==3 ? (IGNBRK|IXOFF) : IGNBRK; /* No echo, crlf mapping, INTR, QUIT, delays, no erase/kill */ tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); tty.c_oflag = 0; /* Transparent output */ tty.c_cflag &= ~PARENB; /* Same baud rate, disable parity */ tty.c_cflag |= CS8; /* Set character size = 8 */ if (Twostop) tty.c_cflag |= CSTOPB; /* Set two stop bits */ tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */ tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ (void) tcsetattr(iofd, TCSANOW, &tty); did0 = TRUE; Baudrate = cfgetospeed(&tty); return OK; #endif #ifdef USG case 2: /* Un-raw mode used by sz, sb when -g detected */ if(!did0) (void) ioctl(iofd, TCGETA, &oldtty); tty = oldtty; tty.c_iflag = BRKINT|IXON; tty.c_oflag = 0; /* Transparent output */ tty.c_cflag &= ~PARENB; /* Disable parity */ tty.c_cflag |= CS8; /* Set character size = 8 */ if (Twostop) tty.c_cflag |= CSTOPB; /* Set two stop bits */ #ifdef READCHECK tty.c_lflag = Zmodem ? 0 : ISIG; tty.c_cc[VINTR] = Zmodem ? -1:030; /* Interrupt char */ #else tty.c_lflag = ISIG; tty.c_cc[VINTR] = Zmodem ? 03:030; /* Interrupt char */ #endif tty.c_cc[VQUIT] = -1; /* Quit char */ #ifdef NFGVMIN tty.c_cc[VMIN] = 1; #else tty.c_cc[VMIN] = 3; /* This many chars satisfies reads */ #endif tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ (void) ioctl(iofd, TCSETAW, &tty); did0 = TRUE; return OK; case 1: case 3: if(!did0) (void) ioctl(iofd, TCGETA, &oldtty); tty = oldtty; tty.c_iflag = n==3 ? (IGNBRK|IXOFF) : IGNBRK; /* No echo, crlf mapping, INTR, QUIT, delays, no erase/kill */ tty.c_lflag &= ~(ECHO | ICANON | ISIG); tty.c_oflag = 0; /* Transparent output */ tty.c_cflag &= ~PARENB; /* Same baud rate, disable parity */ tty.c_cflag |= CS8; /* Set character size = 8 */ if (Twostop) tty.c_cflag |= CSTOPB; /* Set two stop bits */ #ifdef NFGVMIN tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */ #else tty.c_cc[VMIN] = HOWMANY; /* This many chars satisfies reads */ #endif tty.c_cc[VTIME] = 1; /* or in this many tenths of seconds */ (void) ioctl(iofd, TCSETAW, &tty); did0 = TRUE; Baudrate = getspeed(tty.c_cflag & CBAUD); return OK; #endif #ifdef V7 /* * NOTE: this should transmit all 8 bits and at the same time * respond to XOFF/XON flow control. If no FIONREAD or other * READCHECK alternative, also must respond to INTRRUPT char * This doesn't work with V7. It should work with LLITOUT, * but LLITOUT was broken on the machine I tried it on. */ case 2: /* Un-raw mode used by sz, sb when -g detected */ if(!did0) { #ifdef TIOCEXCL ioctl(iofd, TIOCEXCL, 0); #endif ioctl(iofd, TIOCGETP, &oldtty); ioctl(iofd, TIOCGETC, (struct sgttyb *) &oldtch); #ifdef LLITOUT ioctl(iofd, TIOCLGET, &Locmode); #endif } tty = oldtty; tch = oldtch; #ifdef READCHECK tch.t_intrc = Zmodem ? -1:030; /* Interrupt char */ #else tch.t_intrc = Zmodem ? 03:030; /* Interrupt char */ #endif #ifdef ODDP tty.sg_flags |= ODDP; #endif #ifdef EVENP tty.sg_flags |= EVENP; #endif #ifdef CBREAK tty.sg_flags |= CBREAK; #endif #ifdef ALLDELAY tty.sg_flags &= ~ALLDELAY; #endif #ifdef CRMOD tty.sg_flags &= ~CRMOD; #endif #ifdef ECHO tty.sg_flags &= ~ECHO; #endif #ifdef LCASE tty.sg_flags &= ~LCASE; #endif ioctl(iofd, TIOCSETP, &tty); ioctl(iofd, TIOCSETC, (struct sgttyb *) &tch); #ifdef LLITOUT ioctl(iofd, TIOCLBIS, &Locbit); #endif bibi(99); /* un-raw doesn't work w/o lit out */ did0 = TRUE; return OK; case 1: case 3: if(!did0) { #ifdef TIOCEXCL ioctl(iofd, TIOCEXCL, 0); #endif ioctl(iofd, TIOCGETP, &oldtty); ioctl(iofd, TIOCGETC, (struct sgttyb *) &oldtch); #ifdef LLITOUT ioctl(iofd, TIOCLGET, &Locmode); #endif } tty = oldtty; tty.sg_flags |= RAW; tty.sg_flags &= ~ECHO; ioctl(iofd, TIOCSETP, &tty); did0 = TRUE; Baudrate = getspeed(tty.sg_ospeed); return OK; #endif case 0: if(!did0) return ERROR; #ifdef POSIX /* Wait for output to drain, flush input queue, restore * modes and restart output. */ (void) tcsetattr(iofd, TCSAFLUSH, &oldtty); (void) tcflow(iofd, TCOON); #endif #ifdef US��S����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������SG (void) ioctl(iofd, TCSBRK, 1); /* Wait for output to drain */ (void) ioctl(iofd, TCFLSH, 1); /* Flush input queue */ (void) ioctl(iofd, TCSETAW, &oldtty); /* Restore modes */ (void) ioctl(iofd, TCXONC,1); /* Restart output */ #endif #ifdef V7 ioctl(iofd, TIOCSETP, &oldtty); ioctl(iofd, TIOCSETC, (struct sgttyb *) &oldtch); #ifdef TIOCNXCL ioctl(iofd, TIOCNXCL, 0); #endif #ifdef LLITOUT ioctl(iofd, TIOCLSET, &Locmode); #endif #endif return OK; default: return ERROR; } } void sendbrk() { #ifdef POSIX tcsendbreak(iofd, 1); #endif #ifdef V7 #ifdef TIOCSBRK #define CANBREAK sleep(1); ioctl(iofd, TIOCSBRK, 0); sleep(1); ioctl(iofd, TIOCCBRK, 0); #endif #endif #ifdef USG #define CANBREAK ioctl(iofd, TCSBRK, 0); #endif } /* End of rbsb.c */ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define VERSION "2.03 05-17-88" #define PUBDIR "/usr/spool/uucppublic" /*% cc -compat -M2 -Ox -K -i -DMD -DOMEN % -o rz; size rz; <-xtx-*> cc386 -Ox -DMD -DOMEN -DSEGMENTS=8 rz.c -o $B/rz; size $B/rz * * rz.c By Chuck Forsberg * * cc -O rz.c -o rz USG (3.0) Unix * cc -O -DV7 rz.c -o rz Unix V7, BSD 2.8 - 4.3 * * ln rz rb; ln rz rx For either system * * ln rz /usr/bin/rzrmail For remote mail. Make this the * login shell. rzrmail then calls * rmail(1) to deliver mail. * * To compile on VMS: * * define LNK$LIBRARY SYS$LIBRARY:VAXCRTL.OLB * cc rz.c * cc vvmodem.c * link rz,vvmodem * rz :== $disk:[username.subdir]rz.exe * * * Unix is a trademark of Western Electric Company * * A program for Unix to receive files and commands from computers running * Professional-YAM, PowerCom, YAM, IMP, or programs supporting XMODEM. * rz uses Unix buffered input to reduce wasted CPU time. * * Iff the program is invoked by rzCOMMAND, output is piped to * "COMMAND filename" (Unix only) * * Some systems (Venix, Coherent, Regulus) may not support tty raw mode * read(2) the same way as Unix. ONEREAD must be defined to force one * character reads for these systems. Added 7-01-84 CAF * * Alarm signal handling changed to work with 4.2 BSD 7-15-84 CAF * * BIX added 6-30-87 to support BIX(TM) upload protocol used by the * Byte Information Exchange. * * NFGVMIN Updated 2-18-87 CAF for Xenix systems where c_cc[VMIN] * doesn't work properly (even though it compiles without error!), * * SEGMENTS=n added 2-21-88 as a model for CP/M programs * for CP/M-80 systems that cannot overlap modem and disk I/O. * * VMS flavor hacks begin with rz version 2.00 * * -DMD may be added to compiler command line to compile in * Directory-creating routines from Public Domain TAR by John Gilmore * * HOWMANY may be tuned for best performance * * USG UNIX (3.0) ioctl conventions courtesy Jeff Martin */ #include <sys/types.h> #ifdef vax11c #include <types.h> #include <stat.h> #define LOGFILE "rzlog.tmp" #define OS "VMS" #define BUFREAD extern int errno; #define SS_NORMAL SS$_NORMAL #else /* Not vax11c */ #define SS_NORMAL 0 #define LOGFILE "/tmp/rzlog" #endif #include <time.h> #include <ctype.h> #include <errno.h> #include <signal.h> #include <setjmp.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <utime.h> #include <stdio.h> #define OK 0 #define FALSE 0 #define TRUE 1 #undef ERROR #define ERROR (-1) _PROTOTYPE(long getfree , (void)); _PROTOTYPE(void alrm , (int sig )); _PROTOTYPE(int main , (int argc , char *argv [])); _PROTOTYPE(int usage , (void)); _PROTOTYPE(int wcreceive , (int argc , char **argp )); _PROTOTYPE(int wcrxpn , (char *rpn )); _PROTOTYPE(int wcrx , (void)); _PROTOTYPE(int wcgetsec , (char *rxbuf , int maxtime )); _PROTOTYPE(int readline , (int timeout )); _PROTOTYPE(void purgeline , (void)); _PROTOTYPE(int procheader , (char *name )); _PROTOTYPE(int make_dirs , (char *pathname )); _PROTOTYPE(int makedir , (char *dpath , int dmode )); _PROTOTYPE(int putsec , (char *buf , int n )); _PROTOTYPE(void sendline , (int c )); _PROTOTYPE(void flushmo , (void)); _PROTOTYPE(void uncaps , (char *s )); _PROTOTYPE(int IsAnyLower , (char *s )); _PROTOTYPE(char *substr , (char *s , char *t )); void zperr(); _PROTOTYPE(void canit , (void)); _PROTOTYPE(void report , (int sct )); _PROTOTYPE(void chkinvok , (char *s )); _PROTOTYPE(void checkpath , (char *name )); _PROTOTYPE(int tryz , (void)); _PROTOTYPE(int rzfiles , (void)); _PROTOTYPE(int rzfile , (void)); _PROTOTYPE(void zmputs , (char *s )); _PROTOTYPE(int closeit , (void)); _PROTOTYPE(void ackbibi , (void)); _PROTOTYPE(void bttyout , (int c )); _PROTOTYPE(int sys2 , (char *s )); _PROTOTYPE(void exec2 , (char *s )); /* * Max value for HOWMANY is 255. * A larger value reduces system overhead but may evoke kernel bugs. * 133 corresponds to an XMODEM/CRC sector */ #ifndef HOWMANY #define HOWMANY 133 #endif /* Ward Christensen / CP/M parameters - Don't change these! */ #define ENQ 005 #define CAN ('X'&037) #define XOFF ('s'&037) #define XON ('q'&037) #define SOH 1 #define STX 2 #define EOT 4 #define ACK 6 #define NAK 025 #define CPMEOF 032 #define WANTCRC 0103 /* send C not NAK to get crc not checksum */ #define TIMEOUT (-2) #define RCDO (-3) #define ERRORMAX 5 #define RETRYMAX 5 #define WCEOT (-10) #define PATHLEN 257 /* ready for 4.2 bsd ? */ #define UNIXFILE 0xF000 /* The S_IFMT file mask bit for stat */ int Zmodem=0; /* ZMODEM protocol requested */ int Nozmodem = 0; /* If invoked as "rb" */ unsigned Baudrate = 2400; #ifdef vax11c #include "vrzsz.c" /* most of the system dependent stuff here */ #else #include "rbsb.c" /* most of the system dependent stuff here */ #endif #include "crctab.c" FILE *fout; /* * Routine to calculate the free bytes on the current file system * ~0 means many free bytes (unknown) */ long getfree() { return(~0L); /* many free bytes ... */ } int Lastrx; int Crcflg; int Firstsec; int Eofseen; /* indicates cpm eof (^Z) has been received */ int errors; int Restricted=0; /* restricted; no /.. or ../ in filenames */ #ifdef ONEREAD /* Sorry, Regulus and some others don't work right in raw mode! */ int Readnum = 1; /* Number of bytes to ask for in read() from modem */ #else int Readnum = HOWMANY; /* Number of bytes to ask for in read() from modem */ #endif #define DEFBYTL 2000000000L /* default rx file size */ long Bytesleft; /* number of bytes of incoming file left */ long Modtime; /* Unix style mod time for incoming file */ int Filemode; /* Unix style mode for incoming file */ char Pathname[PATHLEN]; char *Progname; /* the name by which we were called */ int Batch=0; int Topipe=0; int MakeLCPathname=TRUE; /* make received pathname lower case */ int Verbose=0; int Quiet=0; /* overrides logic that would otherwise set verbose */ int Nflag = 0; /* Don't really transfer files */ int Rxclob=FALSE; /* Clobber existing file */ int Rxbinary=FALSE; /* receive all files in bin mode */ int Rxascii=FALSE; /* receive files in ascii (translate) mode */ int Thisbinary; /* current file is to be received in bin mode */ int Blklen; /* record length of received packets */ #ifdef SEGMENTS int chinseg = 0; /* Number of characters received in this data seg */ char secbuf[1+(SEGMENTS+1)*1024]; #else char secbuf[1025]; #endif char linbuf[HOWMANY]; int Lleft=0; /* number of characters in linbuf */ time_t timep[2]; char Lzmanag; /* Local file management request */ char zconv; /* ZMODEM file conversion request */ char zmanag; /* ZMODEM file management request */ char ztrans; /* ZMODEM file transport request */ int Zctlesc; /* Encode control characters */ int Zrwindow = 1400; /* RX window size (controls garbage count) */ jmp_buf tohere; /* For the interrupt on RX timeout */ #define xsendline(c) sendline(c) #include "zm.c" int tryzhdrtype=ZRINIT; /* Header type to send corresponding to Last rx close */ void alrm(sig) int sig; { longjmp(tohere, -1); } /* called by signal interrupt or terminate to clean things up */ void bibi(n) int n; { if (Zmodem) zmputs(Attn); canit(); mode(0); fprintf(stderr, "rz: caught signal %d; exiting\n", n); cucheck(); exit(128+n); } int main(argc, argv) int argc; char *argv[]; { register char *cp; register npats; char *virgin, **patts; int exitcode = 0; Rxtimeout = 100; setbuf(stderr, (char *)NULL); if ((cp=getenv("SHELL")) && (substr(cp, "rsh") || substr(cp, "rksh"))) Restricted=TRUE; from_cu(); #ifdef vax11c Progname = virgin = "rz"; #else chkinvok(virgin=argv[0]); /* if called as [-]rzCOMMAND set flag */ #endif npats = 0; while (--argc) { cp = *++argv; if (*cp == '-') { while( *++cp) { switch(*cp) { case '\\': cp[1] = toupper(cp[1]); continue; case '+': Lzmanag = ZMAPND; break; case 'a': Rxascii=TRUE; break; case 'b': Rxbinary=TRUE; break; case 'c': Crcflg=TRUE; break; #ifndef vax11c case 'D': Nflag = TRUE; break; #endif case 'e': Zctlesc = 1; break; case 'p': Lzmanag = ZMPROT; break; case 'q': Quiet=TRUE; Verbose=0; break; case S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'t': if (--argc < 1) { usage(); } Rxtimeout = atoi(*++argv); if (Rxtimeout<10 || Rxtimeout>1000) usage(); break; case 'w': if (--argc < 1) { usage(); } Zrwindow = atoi(*++argv); break; case 'u': MakeLCPathname=FALSE; break; case 'v': ++Verbose; break; case 'y': Rxclob=TRUE; break; default: usage(); } } } else if ( !npats && argc>0) { if (argv[0][0]) { npats=argc; patts=argv; } } } if (npats > 1) usage(); if (Batch && npats) usage(); if (Verbose) { if (freopen(LOGFILE, "a", stderr)==NULL) { printf("Can't open log file %s\n",LOGFILE); exit(0200); } setbuf(stderr, (char *)NULL); fprintf(stderr, "argv[0]=%s Progname=%s\n", virgin, Progname); } if (Fromcu && !Quiet) { if (Verbose == 0) Verbose = 2; } vfile("%s %s for %s\n", Progname, VERSION, OS); mode(1); if (signal(SIGINT, bibi) == SIG_IGN) { signal(SIGINT, SIG_IGN); signal(SIGKILL, SIG_IGN); } else { signal(SIGINT, bibi); signal(SIGKILL, bibi); } signal(SIGTERM, bibi); if (wcreceive(npats, patts)==ERROR) { exitcode=0200; canit(); } mode(0); vfile("exitcode = %d\n",exitcode); if (exitcode && !Zmodem) /* bellow again with all thy might. */ canit(); if (exitcode) cucheck(); if (Verbose) putc('\n', stderr); exit(exitcode ? exitcode:SS_NORMAL); } int usage() { cucheck(); #ifdef vax11c fprintf(stderr,"Usage: rz [-abeuvy]\n"); #else fprintf(stderr,"Usage: rz [-abeuvy] (ZMODEM)\n"); fprintf(stderr,"or rb [-abuvy] (YMODEM)\n"); fprintf(stderr,"or rx [-abcv] file (XMODEM or XMODEM-1k)\n"); #endif fprintf(stderr," -a ASCII transfer (strip CR)\n"); fprintf(stderr," -b Binary transfer for all files\n"); #ifndef vax11c fprintf(stderr," -c Use 16 bit CRC (XMODEM)\n"); #endif fprintf(stderr," -e Escape control characters (ZMODEM)\n"); fprintf(stderr," -v Verbose more v's give more info\n"); fprintf(stderr," -y Yes, clobber existing file if any\n"); fprintf(stderr,"%s %s for %s by Chuck Forsberg, Omen Technology INC\n", Progname, VERSION, OS); fprintf(stderr, "\t\t\042The High Reliability Software\042\n"); exit(SS_NORMAL); } /* * Debugging information output interface routine */ /* VARARGS1 */ void vfile(f, a, b, c) register char *f,*a,*b,*c; { if (Verbose > 2) { fprintf(stderr, f, a, b, c); fprintf(stderr, "\n"); } } /* * Let's receive something already. */ char *rbmsg = "%s ready. To begin transfer, type \"%s file ...\" to your modem program\r\n\n"; int wcreceive(argc, argp) int argc; char **argp; { register c; if (Batch || argc==0) { Crcflg=1; if ( !Quiet) fprintf(stderr, rbmsg, Progname, Nozmodem?"sb":"sz"); if (c=tryz()) { if (c == ZCOMPL) return OK; if (c == ERROR) goto fubar; c = rzfiles(); if (c) goto fubar; } else { for (;;) { if (wcrxpn(secbuf)== ERROR) goto fubar; if (secbuf[0]==0) return OK; if (procheader(secbuf) == ERROR) goto fubar; if (wcrx()==ERROR) goto fubar; } } } else { Bytesleft = DEFBYTL; Filemode = 0; Modtime = 0L; procheader(""); strcpy(Pathname, *argp); checkpath(Pathname); fprintf(stderr, "\nrz: ready to receive %s\r\n", Pathname); if ((fout=fopen(Pathname, "w")) == NULL) return ERROR; if (wcrx()==ERROR) goto fubar; } return OK; fubar: canit(); #ifndef vax11c if (Topipe && fout) { pclose(fout); return ERROR; } #endif if (fout) fclose(fout); #ifndef vax11c if (Restricted) { unlink(Pathname); fprintf(stderr, "\r\nrz: %s removed.\r\n", Pathname); } #endif return ERROR; } /* * Fetch a pathname from the other end as a C ctyle ASCIZ string. * Length is indeterminate as long as less than Blklen * A null string represents no more files (YMODEM) */ int wcrxpn(rpn) char *rpn; /* receive a pathname */ { register c; #ifdef NFGVMIN readline(1); #else purgeline(); #endif et_tu: Firstsec=TRUE; Eofseen=FALSE; sendline(Crcflg?WANTCRC:NAK); Lleft=0; /* Do read next time ... */ while ((c = wcgetsec(rpn, 100)) != 0) { if (c == WCEOT) { zperr( "Pathname fetch returned %d", c); sendline(ACK); Lleft=0; /* Do read next time ... */ readline(1); goto et_tu; } return ERROR; } sendline(ACK); return OK; } /* * Adapted from CMODEM13.C, written by * Jack M. Wierda and Roderick W. Hart */ int wcrx() { register int sectnum, sectcurr; register char sendchar; int cblklen; /* bytes to dump this block */ Firstsec=TRUE;sectnum=0; Eofseen=FALSE; sendchar=Crcflg?WANTCRC:NAK; for (;;) { sendline(sendchar); /* send it now, we're ready! */ Lleft=0; /* Do read next time ... */ sectcurr=wcgetsec(secbuf, (sectnum&0177)?50:130); report(sectcurr); if (sectcurr==((sectnum+1) &0377)) { sectnum++; cblklen = Bytesleft>Blklen ? Blklen:Bytesleft; if (putsec(secbuf, cblklen)==ERROR) return ERROR; if ((Bytesleft-=cblklen) < 0) Bytesleft = 0; sendchar=ACK; } else if (sectcurr==(sectnum&0377)) { zperr( "Received dup Sector"); sendchar=ACK; } else if (sectcurr==WCEOT) { if (closeit()) return ERROR; sendline(ACK); Lleft=0; /* Do read next time ... */ return OK; } else if (sectcurr==ERROR) return ERROR; else { zperr( "Sync Error"); return ERROR; } } } /* * Wcgetsec fetches a Ward Christensen type sector. * Returns sector number encountered or ERROR if valid sector not received, * or CAN CAN received * or WCEOT if eot sector * time is timeout for first char, set to 4 seconds thereafter ***************** NO ACK IS SENT IF SECTOR IS RECEIVED OK ************** * (Caller must do that when he is good and ready to get next sector) */ int wcgetsec(rxbuf, maxtime) char *rxbuf; int maxtime; { register checksum, wcj, firstch; register unsigned short oldcrc; register char *p; int sectcurr; for (Lastrx=errors=0; errors<RETRYMAX; errors++) { if ((firstch=readline(maxtime))==STX) { Blklen=1024; goto get2; } if (firstch==SOH) { Blklen=128; get2: sectcurr=readline(1); if ((sectcurr+(oldcrc=readline(1)))==0377) { oldcrc=checksum=0; for (p=rxbuf,wcj=Blklen; --wcj>=0; ) { if ((firstch=readline(1)) < 0) goto bilge; oldcrc=updcrc(firstch, oldcrc); checksum += (*p++ = firstch); } if ((firstch=readline(1)) < 0) goto bilge; if (Crcflg) { oldcrc=updcrc(firstch, oldcrc); if ((firstch=readline(1)) < 0) goto bilge; oldcrc=updcrc(firstch, oldcrc); if (oldcrc & 0xFFFF) zperr( "CRC"); else { Firstsec=FALSE; return sectcurr; } } else if (((checksum-firstch)&0377)==0) { Firstsec=FALSE; return sectcurr; } else zperr( "Checksum"); } else zperr("Sector number garbled"); } /* make sure eot really is eot and not just mixmash */ #ifdef NFGVMIN else if (firstch==EOT && readline(1)==TIMEOUT) return WCEOT; #else else if (firstch==EOT && Lleft==0) return WCEOT; #endif else if (firstch==CAN) { if (Lastrx==CAN) { zperr( "Sender CANcelled"); return ERROR; } else { Lastrx=CAN; continue; } } else if (firstch==TIMEOUT) { if (Firstsec) goto humbug; bilge: zperr( "TIMEOUT"); } else zperr( "Got 0%o sector header", firstch); humbug: Lastrx=0; while(readline(1)!=TIMEOUT) ; if (Firstsec) { sendline(Crcflg?WANTCRC:NAK); Lleft=0; /* Do read next time ... */ } else { maxtime=40; sendline(NAK); Lleft=0; /* Do read next time ... */ } } /* try to stop the bubble machine. */ canit(); return ERROR; } #ifndef vax11c /* * This version of readline is reasoably well suited for * reading many characters. * (except, currently, for the Regulus version!) * * timeout is in tenths of seconds */ int readline(timeout) int timeout; { register n; static char *cdq; /* pointer for removing chars from linbuf */ if (--Lleft >= 0) { if (Verbose > 8) { fprintf(stderr, "%02x ", *cdq&0377); } return (*cdq++ & 0377); } n = timeout/10; if (n < 2) n = 3; if (Verbose > 5) fprintf(stderr, "Calling read: alarm=%d Readnum=%d ", n, Readnum); if (setjmp(tohere)) { #ifdef TIOCFLUSH /* ioctl(iofd, TIOCFLUSH, 0); */ #endif Lleft = 0; if (Verbose>1) fprintf(stderr, "Readline:TIMEOUT\n"); return TIMEOUT; } signal(SIGALRM, alrm); alarm(n); Lleft=read(iofd, cdq=linbuf, Readnum); alarm(0); if (Verbose > 5) { fprintf(stderr, "Read returned %d bytes\n", Lleft); } if (Lleft < 1) return TIMEOUT; --Lleft; if (Verbose > 8) { fprintf(stderr, "%02x ", *cdq&0377); } return (*cdq++ & 0377); } /* * Purge the modem input queue of all characters */ void purgeline() { Lleft = 0; #ifdef USG ioctl(iofd, TCFLSH, 0); #else lseek(iofd, 0L, 2); #endif } #endif /* * Process incoming file information header */ int procheader(name) char *name; { register char *openmode, *p; /* set default parameters and overrides */ openmode = "w"; Thisbinary = (!Rxascii) || Rxbinary; if (Lzmanag) zmanag = Lzmanag; /* * Process ZMODEM remote file management requests */ if (!Rxbinary && zconv == ZCNL) /* Remote ASCII override */ Thisbinary = 0; if (zconv == ZCBIN) /* Remote Binary override */ Thisbinary = TRUE; else if (zmanag == ZMAPND) openmode = "a"; #ifndef BIX /* Check for existing file */ if (!Rxclob && (zmanag&ZMMASK) != ZMCLOB && (fout=fopen(name, "r"))) { fclose(fout); return ERROR; } #endif Bytesleft = DEFBYTL; Filemode = 0; Modtime = 0L; p = name + 1 + strlen(name); if (*p) { /* file coming from Unix or DOS system */ sscanf(p, "%ld%lo%o", &Bytesleft, &Modtime, &Filemode); #ifndef vax11c if (Filemode & UNIXFILE) ++Thisbinary; #endif if (Verbose) { fprintf(stderr, "\nIncoming: %s %ld %lo %o\n", name, Bytesleft, Modtime, Filemode); } } #ifdef BIX if ((fout=fopen("scratchpad", openmode)) == NULL) return ERROR; return OK; #else else { /* File coming from CP/M system */ for (p=name; *p; ++p) /* change / to _ */ if ( *p == '/') *p = '_'; if ( *--p == '.') /* zap trailing period */ *p = 0; } #ifndef vax11c if (!Zmodem && MakeLCPathname && !IsAnyLower(name) && !(Filemode&UNIXFILE)) uncaps(name); #endif if (Topipe > 0) { sprintf(Pathname, "%s %s", Progname+2, name); if (Verbose) fprintf(stderr, "Topipe: %s %s\n", Pathname, Thisbinary?"BIN":"ASCII"); #ifndef vax11c if ((fout=popen(Pathname, "w")) == NULL) return ERROR; #endif } else { strcpy(Pathname, name); if (Verbose) { fprintf(stderr, "Receiving %s %s %s\n", name, Thisbinary?"BIN":"ASCII", openmode); } checkpath(name); if (Nflag) name = "/dev/null"; #ifndef vax11c #ifdef OMEN if (name[0] == '!' || name[0] == '|') { if ( !(fout = popen(name+1, "w"))) { return ERROR; } Topipe = -1; return(OK); } #endif #endif #ifdef MD fout = fopen(name, openmode); if ( !fout) if (make_dirs(name)) fout = fopen(name, openmode); #else fout = fopen(name, openmode); #endif if ( !fout) return ERROR; } return OK; #endif /* BIX */ } #ifdef MD /* * Directory-creating routines from Public Domain TAR by John Gilmore */ /* * After a file/link/symlink/dir creation has failed, see if * it's because some required directory was not present, and if * so, create all required dirs. */ int make_dirs(pathname) register char *pathname; { register char *p; /* Points into path */ int madeone = 0; /* Did we do anything yet? */ int save_errno = errno; /* Remember caller's errno */ char *strchr(); if (errno != ENOENT) return 0; /* Not our problem */ for (p = strchr(pathname, '/'); p != NULL; p = strchr(p+1, '/')) { /* Avoid mkdir of empty string, if leading or double '/' */ if (p == pathname || p[-1] == '/') continue; /* Avoid mkdir where last part of path is '.' */ if (p[-1] == '.' && (p == pathname+1 || p[-2] == '/')) continue; *p = 0; /* Truncate the path there */ if ( !makedir(pathname, 0777)) { /* Try to create it as a dir */ vfile("Made directory %s\n", pathname); madeone++; /* Remember if we made one */ *p = '/'; continue; } *p = '/'; if (errno == EEXIST) /* Directory already exists */ continue; /* * Some other error in the makedir. We return to the caller. */ break; } errno = save_errno; /* Restore caller's errno */ return madeone; /* Tell them to retry if we made one */ } #if (MD != 2) #define TERM_SIGNAL(status) ((status) & 0x7F) #define TERM_COREDUMP(status) (((status) & 0x80) != 0) #define TERM_VALUE(status) ((status) >> 8) /* * Make a directory. Compatible with the mkdir() system call on 4.2BSD. */ int makedir(dpath, dmode) char *dpath; int dmode; { int cpid, status; struct stat statbuf; if (stat(dpath,&statbuf) == 0) { errno = EEXIST; /* Stat worked, so it already exists */ return -1; } /* If stat fails for a reason other than non-existence, return error */ if (errno != ENOENT) return -1; switch (cpid = fork()) { case -1: /* Error in fork() */ return(-1); /* Errno is set already */ case 0: /* Child process */ /* * Cheap hack to set mode of new directory. Since this * child process is going away anyway, we zap its umask. * FIXME, this won't suffice to set SUID, SGID, etc. on this * directory. Does anybody care? */ status = umask(0); /* Get current umask */ status = umask(status | (0777 & ~dmode)); /* Set for mkdir */ execl("/bin/mkdir", "mkdir", dpath, (char *)0); _exit(-1); /* Can't exec /bin/mkdir */ default: /* Parent process */ while (cpid != wait(&status)) ; /* Wait for kid to finish */ } if (TERM_SIGNAL(status) != 0 || TERM_VALUE(status) != 0) { errno = EIO; /* We don't know why, but */ return -1; /* /bin/mkdir failed */ } return 0; } #endif /* MD != 2 */ #endif /* MD */ /* * Putsec writes the n characters of buf to receive file fout. * If not in binary mode, carriage returns, and all characters * starting with CPMEOF are discarded. */ int putsec(buf, n) char *buf; register int n; { register char *p; if (n == 0) return OK; if (Thisbinary) { for (p=buf; --n>=0; ) putc( *p++, fout); } else { if (Eofseen) return OK; for (p=buf; --n>=0; ++p ) { if ( *p == '\r') continue; if (*p == CPMEOF) { Eofseen=TRUE; return OK; } putc(*p ,fout); } } return OK; } #ifndef vax11c /* * Send a character to modem. Small is beautiful. */ void sendline(c) int c; { char d; d = c; if (Verbose>6) fprintf(stderr, "Sendline: %x\n", c); write(1, &d, 1); } void flushmo() {} #endif /* make string s lower case */ void uncaps(s) register char *s; { for ( ; *s; ++s) if (isupper(*s)) *s = tolower(*s); } /* * IsAnyLower returns TRUE if string s has lower case letters. */ int IsAnyLower(s) register char *s; { for ( ; *s; ++s) if (islower(*s)) return TRUE; return FALSE; } /* * substr(string, token) searches for token in string s * returns pointer to token within string if found, NULL otherwise */ char * substr(s, t) register char *s,*t; { register char *ss,*tt; /* search for first char of token */ for (ss=s; *s; s++) if (*s == *t) /* compare token with substring */ for (ss=s,tt=t; ;) { if (*tt == 0) return s; if (*ss++ != *tt++) break; } return (char *)NULL; } /* * Log an error */ /*VARARGS1*/ void zperr(s,p,u) char *s, *p, *u; { if (Verbose <= 0) return; fprintf(stderr, "Retry %d: ", errors); fprintf(stderr, s, p, u); fprintf(stderr, "\n"); } /* send cancel string to get the other end to shut up */ void canit() { static char canistr[] = { 24,24,24,24,24,24,24,24,24,24,8,8,8,8,8,8,8,8,8,8,0 }; #ifdef vax11c raw_wbuf(strlen(canistr), canistr); purgeline(); #else printf(canistr); Lleft=0; /* Do read next time ... */ fflush(stdout); #endif } void report(sct) int sct; { if (Verbose>1) fprintf(stderr,"%03d%c",sct,sct%10? ' ' : '\r'); } #ifndef vax11c /* * If called as [-][dir/../]vrzCOMMAND set Verbose to 1 * If called as [-][dir/../]rzCOMMAND set the pipe flag * If called as rb use YMODEM protocol */ void chkinvok(s) char *s; { register char *p; p = s; while (*p == '-') s = ++p; while (*p) if (*p++ == '/') s = p; if (*s == 'v') { Verbose=1; ++s; } Progname = s; if (s[0]=='r' && s[1]=='z') Batch = TRUE; if (s[0]=='r' && s[1]=='b') Batch = Nozmodem = TRUE; if (s[2] && s[0]=='r' && s[1]=='b') Topipe = 1; if (s[2] && s[0]=='r' && s[1]=='z') Topipe = 1; } #endif /* * Totalitarian Communist pathname processing */ void checkpath(name) char *name; { if (Restricted) { if (fopen(name, "r") != NULL) { canit(); fprintf(stderr, "\r\nrz: %s exists\n", name); bibi(-1); } /* restrict pathnames to current tree or uucppublic */ if ( substr(name, "../") || (name[0]== '/' && strncmp(name, PUBDIR, strlen(PUBDIR))) ) { canit(); fprintf(stderr,"\r\nrz:\tSecurity Violation\r\n"); bibi(-1); } } } /* * Initialize for Zmodem receive attempt, try to activate Zmodem sender * Handles ZSINIT frame * Return ZFILE if Zmodem filename received, -1 on error, * ZCOMPL if transaction finished, else 0 */ int tryz() { register c, n; register cmdzack1flg; if (Nozmodem) /* Check for "rb" program name */ return 0; for (n=Zmodem?15:5; --n>=0; ) { /* Set buffer length (0) and capability flags */ #ifdef SEGMENTS stohdr(SEGMENTS*1024L); #else stohdr(0L); #endif #ifdef CANBREAK Txhdr[ZF0] = CANFC32|CANFDX|CANOVIO|CANBRK; #else Txhdr[ZF0] = CANFC32|CANFDX|CANOVIO; #endif if (Zctlesc) Txhdr[ZF0] |= TESCCTL; zshhdr(tryzhdrtype, Txhdr); if (tryzhdrtype == ZSKIP) /* Don't skip too far */ tryzhdrtype = ZRINIT; /* CAF 8-21-87 */ again: switch (zgethdr(Rxhdr, 0)) { case ZRQINIT: continue; case ZEOF: continue; case TIMEOUT: continue; case ZFILE: zconv = Rxhdr[ZF0]; zmanag = Rxhdr[ZF1]; ztrans = Rxhdr[ZF2]; tryzhdrtype = ZRINIT; c = zrdata(secbuf, 1024); mode(3); if (c == GOTCRCW) return ZFILE; zshhdr(ZNAK, Txhdr); goto again; case ZSINIT: Zctlesc = TESCCTL & Rxhdr[ZF0]; if (zrdata(Attn, ZATTNLEN) == GOTCRCW) { stohdr(1L); zshhdr(ZACK, Txhdr); goto again; } zshhdr(ZNAK, Txhdr); goto again; case ZFREECNT: stohdr(getfree()); zshhdr(ZACK, Txhdr); goto again; case ZCOMMAND: #ifdef vax11c return ERROR; #else cmdzack1flg = Rxhdr[ZF0]; if (zrdata(secbuf, 1024) == GOTCRCW) { if (cmdzack1flg & ZCACK1) stohdr(0L); else stohdr((long)sys2(secbuf)); purgeline(); /* dump impatient questions */ do { zshhdr(ZCOMPL, Txhdr); } while (++errors<20 && zgethdr(Rxhdr,1) != ZFIN); ackbibi(); if (cmdzack1flg & ZCACK1) exec2(secbuf); return ZCOMPL; } zshhdr(ZNAK, Txhdr); goto again; #endif case ZCOMPL: goto again; default: continue; case ZFIN: ackbibi(); return ZCOMPL; case ZCAN: return ERROR; } } return 0; } /* * Receive 1 or more files with ZMODEM protocol */ int rzfiles() { register c; for (;;) { switch (c = rzfile()) { case ZEOF: case ZSKIP: switch (tryz()) { case ZCOMPL: return OK; default: return ERROR; case ZFILE: break; } continue; default: return c; case ERROR: return ERROR; } } } /* * Receive a file with ZMODEM protocol * Assumes file name frame is in secbuf */ int rzfile() { register c, n; long rxbytes; Eofseen=FALSE; if (procheader(secbuf) == ERROR) { return (tryzhdrtype = ZSKIP); } n = 20; rxbytes = 0l; for (;;) { #ifdef SEGMENTS chinseg = 0; #endif stohdr(rxbytes); zshhdr(ZRPOS, Txhdr); nxthdr: switch (c = zgethdr(Rxhdr, 0)) { default: vfile("rzfile: zgethdr returned %d", c); return ERROR; case ZNAK: case TIMEOUT: #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif if ( --n < 0) { vfile("rzfile: zgethdr returned %d", c); return ERROR; } case ZFILE: zrdata(secbuf, 1024); continue; case ZEOF: #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif if (rclhdr(Rxhdr) != rxbytes) { /* * Ignore eof if it's at wrong place - force * a timeout because the eof might have gone * out before we sent our zrpos. */ errors = 0; goto nxthdr; } if (closeit()) { tryzhdrtype = ZFERR; vfile("rzfile: closeit returned <> 0"); return ERROR; } vfile("rzfile: normal EOF"); return c; case ERROR: /* Too much garbage in header search error */ #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif if ( --n < 0) { vfile("rzfile: zgethdr returned %d", c); return ERROR; } zmputs(Attn); continue; case ZSKIP: #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif closeit(); vfile("rzfile: Sender SKIPPED file"); return c; case ZDATA: if (rclhdr(Rxhdr) != rxbytes) { if ( --n < 0) { return ERROR; } #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif zmputs(Attn); continue; } moredata: if (Verbose>1) fprintf(stderr, "\r%7ld ZMODEM%s ", rxbytes, Crc32?" CRC-32":""); #ifdef SEGMENTS if (chinseg >= (1024 * SEGMENTS)) { putsec(secbuf, chinseg); chinseg = 0; } switch (c = zrdata(secbuf+chinseg, 1024)) #else switch (c = zrdata(secbuf, 1024)) #endif { case ZCAN: #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif vfile("rzfile: zgethdr returned %d", c); return ERROR; case ERROR: /* CRC error */ #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif if ( --n < 0) { vfile("rzfile: zgethdr returned %d", c); return ERROR; } zmputs(Attn); continue; case TIMEOUT: #ifdef SEGMENTS putsec(secbuf, chinseg); chinseg = 0; #endif if ( --n < 0) { vfile("rzfile: zgethdr returned %d", c); return ERROR; } continue; case GOTCRCW: n = 20; #ifdef SEGMENTS chinseg += Rxcount; putsec(secbuf, chinseg); chinseg = 0; #else putsec(secbuf, Rxcount); #endif rxbytes += Rxcount; stohdr(rxbytes); zshhdr(ZACK, Txhdr); sendline(XON); goto nxthdr; case GOTCRCQ: n = 20; #ifdef SEGMENTS chinseg += Rxcount; #else putsec(secbuf, Rxcount); #endif rxbytes += Rxcount; stohdr(rxbytes); zshhdr(ZACK, Txhdr); goto moredata; case GOTCRCG: n = 20; #ifdef SEGMENTS chinseg += Rxcount; #else putsec(secbuf, Rxcount); #endif rxbytes += Rxcount; goto moredata; case GOTCRCE: n = 20; #ifdef SEGMENTS chinseg += Rxcount; #else putsec(secbuf, Rxcount); #endif rxbytes += Rxcount; goto nxthdr; } } } } /* * Send a string to the modem, processing for \336 (sleep 1 sec) * and \335 (break signal) */ void zmputs(s) char *s; { register c; while (*s) { switch (c = *s++) { case '\336': sleep(1); continue; case '\335': sendbrk(); continue; default: sendline(c); } } } /* * Close the receive dataset, return OK or ERROR */ int closeit() { time_t q; #ifndef vax11c if (Topipe) { if (pclose(fout)) { return ERROR; } return OK; } #endif if (fclose(fout)==ERROR) { fprintf(stderr, "file close ERROR\n"); return ERROR; } #ifndef vax11c if (Modtime) { timep[0] = time(&q); timep[1] = Modtime; utime(Pathname, (struct utimbuf *) timep); } #endif if ((Filemode&S_IFMT) == S_IFREG) chmod(Pathname, (07777 & Filemode)); return OK; } /* * Ack a ZFIN packet, let byegones be byegones */ void ackbibi() { register n; vfile("ackbibi:"); Readnum = 1; stohdr(0L); for (n=3; --n>=0; ) { purgeline(); zshhdr(ZFIN, Txhdr); switch (readline(100)) { case 'O': readline(1); /* Discard 2nd 'O' */ vfile("ackbibi complete"); return; case RCDO: return; case TIMEOUT: default: break; } } } /* * Local console output simulation */ void bttyout(c) int c; { if (Verbose || Fromcu) putc(c, stderr); } #ifndef vax11c /* * Strip leading ! if present, do shell escape. */ int sys2(s) register char *s; { if (*s == '!') ++s; return system(s); } /* * Strip leading ! if present, do exec. */ void exec2(s) register char *s; { if (*s == '!') ++s; mode(0); execl("/bin/sh", "sh", "-c", s); } #endif /* End of rz.c */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#define VERSION "sz 2.12 05-29-88" #define PUBDIR "/usr/spool/uucppublic" /*% cc -compat -M2 -Ox -K -i -DTXBSIZE=16384 -DNFGVMIN -DREADCHECK sz.c -lx -o sz; size sz Following is used for testing, might not be reasonable for production <-xtx-*> cc -Osal -DTXBSIZE=32768 -DSV sz.c -lx -o $B/sz; size $B/sz **************************************************************************** * * sz.c By Chuck Forsberg, Omen Technology INC * **************************************************************************** * * Typical Unix/Xenix/Clone compiles: * * cc -O sz.c -o sz USG (SYS III/V) Unix * cc -O -DSV sz.c -o sz Sys V Release 2 with non-blocking input * Define to allow reverse channel checking * cc -O -DV7 sz.c -o sz Unix Version 7, 2.8 - 4.3 BSD * * cc -O -K -i -DNFGVMIN -DREADCHECK sz.c -lx -o sz Classic Xenix * * ln sz sb **** All versions **** * ln sz sx **** All versions **** * **************************************************************************** * * Typical VMS compile and install sequence: * * define LNK$LIBRARY SYS$LIBRARY:VAXCRTL.OLB * cc sz.c * cc vvmodem.c * link sz,vvmodem * sz :== $disk$user2:[username.subdir]sz.exe * * If you feel adventureous, remove the #define BADSYNC line * immediately following the #ifdef vax11c line! Some VMS * systems know how to fseek, some don't. * **************************************************************************** * * * A program for Unix to send files and commands to computers running * Professional-YAM, PowerCom, YAM, IMP, or programs supporting Y/XMODEM. * * Sz uses buffered I/O to greatly reduce CPU time compared to UMODEM. * * USG UNIX (3.0) ioctl conventions courtesy Jeff Martin * * 2.1x hacks to avoid VMS fseek() bogosity, allow input from pipe * -DBADSEEK -DTXBSIZE=32768 * 2.x has mods for VMS flavor * * 1.34 implements tx backchannel garbage count and ZCRCW after ZRPOS * in accordance with the 7-31-87 ZMODEM Protocol Description */ #include <sys/types.h> #ifdef vax11c #define BADSEEK #define TXBSIZE 32768 /* Must be power of two, < MAXINT */ #include <types.h> #include <stat.h> #define LOGFILE "szlog.tmp" #define OS "VMS" #define READCHECK #define BUFWRITE #define iofd extern int errno; #define SS_NORMAL SS$_NORMAL #define xsendline(c) sendline(c) #else /* vax11c */ #define SS_NORMAL 0 #define LOGFILE "/tmp/szlog" #define sendline(c) putchar((c) & 0377) #define xsendline(c) putchar(c) #endif #include <signal.h> #include <setjmp.h> #include <ctype.h> #include <errno.h> #include <stdlib.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <utime.h> #include <stdio.h> #define PATHLEN 256 #define OK 0 #define FALSE 0 #define TRUE 1 #undef ERROR #define ERROR (-1) /* Ward Christensen / CP/M parameters - Don't change these! */ #define ENQ 005 #define CAN ('X'&037) #define XOFF ('s'&037) #define XON ('q'&037) #define SOH 1 #define STX 2 #define EOT 4 #define ACK 6 #define NAK 025 #define CPMEOF 032 #define WANTCRC 0103 /* send C not NAK to get crc not checksum */ #define WANTG 0107 /* Send G not NAK to get nonstop batch xmsn */ #define TIMEOUT (-2) #define RCDO (-3) #define RETRYMAX 10 #define HOWMANY 2 int Zmodem=0; /* ZMODEM protocol requested by receiver */ unsigned Baudrate=2400; /* Default, should be set by first mode() call */ unsigned Txwindow; /* Control the size of the transmitted window */ unsigned Txwspac; /* Spacing between zcrcq requests */ unsigned Txwcnt; /* Counter used to space ack requests */ long Lrxpos; /* Receiver's last reported offset */ int errors; #ifdef vax11c #include "vrzsz.c" /* most of the system dependent stuff here */ #else #include "rbsb.c" /* most of the system dependent stuff here */ #endif #include "crctab.c" int Filesleft; long Totalleft; /* * Attention string to be executed by receiver to interrupt streaming data * when an error is detected. A pause (0336) may be needed before the * ^C (03) or after it. */ #ifdef READCHECK char Myattn[] = { 0 }; #else #ifdef USG char Myattn[] = { 03, 0336, 0 }; #else char Myattn[] = { 0 }; #endif #endif FILE *in; #ifdef BADSEEK int Canseek = 0; /* 1: Can seek 0: only rewind -1: neither (pipe) */ #ifndef TXBSIZE #define TXBSIZE 16384 /* Must be power of two, < MAXINT */ #endif #else int Canseek = 1; /* 1: Can seek 0: only rewind -1: neither (pipe) */ #endif #ifdef TXBSIZE #define TXBMASK (TXBSIZE-1) char Txb[TXBSIZE]; /* Circular buffer for file reads */ char *txbuf = Txb; /* Pointer to current file segment */ #else char txbuf[1024]; #endif long vpos = 0; /* Number of bytes read from file */ char Lastrx; char Crcflg; int Verbose=0; int Modem2=0; /* XMODEM Protocol - don't send pathnames */ int Restricted=0; /* restricted; no /.. or ../ in filenames */ int Quiet=0; /* overrides logic that would otherwise set verbose */ int Ascii=0; /* Add CR's for brain damaged programs */ int Fullname=0; /* transmit full pathname */ int Unlinkafter=0; /* Unlink file after it is sent */ int Dottoslash=0; /* Change foo.bar.baz to foo/bar/baz */ int firstsec; int errcnt=0; /* number of files unreadable */ int blklen=128; /* length of transmitted records */ int Optiong; /* Let it rip no wait for sector ACK's */ int Eofseen; /* EOF seen on input set by zfilbuf */ int BEofseen; /* EOF seen on input set by fooseek */ int Totsecs; /* total number of sectors this file */ int Filcnt=0; /* count of number of files opened */ int Lfseen=0; unsigned Rxbuflen = 16384; /* Receiver's max buffer length */ int Tframlen = 0; /* Override for tx frame length */ int blkopt=0; /* Override value for zmodem blklen */ int Rxflags = 0; long bytcnt; int Wantfcs32 = TRUE; /* want to send 32 bit FCS */ char Lzconv; /* Local ZMODEM file conversion request */ char Lzmanag; /* Local ZMODEM file management request */ int Lskipnocor; char Lztrans; char zconv; /* ZMODEM file conversion request */ char zmanag; /* ZMODEM file management request */ char ztrans; /* ZMODEM file transport request */ int Command; /* Send a command, then exit. */ char *Cmdstr; /* Pointer to the command string */ int Cmdtries = 11; int Cmdack1; /* Rx ACKs command, then do it */ int Exitcode = 0; int Test; /* 1= Force receiver to send Attn, etc with qbf. */ /* 2= Character transparency test */ char *qbf="The quick brown fox jumped over the lazy dog's back 1234567890\r\n"; long Lastsync; /* Last offset to which we got a ZRPOS */ int Beenhereb4; /* How many times we've been ZRPOS'd same place */ jmp_buf tohere; /* For the interrupt on RX timeout */ jmp_buf intrjmp; /* For the interrupt on RX CAN */ _PROTOTYPE(void onintr , (int sig )); _PROTOTYPE(int main , (int argc , char *argv [])); _PROTOTYPE(int wcsend , (int argc , char *argp [])); _PROTOTYPE(int wcs , (char *oname )); _PROTOTYPE(int wctxpn , (char *name )); _PROTOTYPE(int getnak , (void)); _PROTOTYPE(int wctx , (long flen )); _PROTOTYPE(int wcputsec , (char *buf , int sectnum , int cseclen )); _PROTOTYPE(int filbuf , (char *buf , int count )); _PROTOTYPE(int zfilbuf , (void)); _PROTOTYPE(int fooseek , (FILE *fptr , long pos , int whence )); _PROTOTYPE(void alrm , (int sig )); _PROTOTYPE(int readline , (int timeout )); _PROTOTYPE(void flushmo , (void)); _PROTOTYPE(void purgeline , (void)); _PROTOTYPE(void canit , (void)); void zperr(); _PROTOTYPE(char *substr , (char *s , char *t )); _PROTOTYPE(int usage , (void)); _PROTOTYPE(int getzrxinit , (void)); _PROTOTYPE(int sendzsinit , (void)); _PROTOTYPE(int zsendfile , (char *buf , int blen )); _PROTOTYPE(int zsendfdata , (void)); _PROTOTYPE(int getinsync , (int flag )); _PROTOTYPE(void saybibi , (void)); _PROTOTYPE(void bttyout , (int c )); _PROTOTYPE(int zsendcmd , (char *buf , int blen )); _PROTOTYPE(void chkinvok , (char *s )); _PROTOTYPE(void countem , (int argc , char **argv )); _PROTOTYPE(void chartest , (int m )); /* called by signal interrupt or terminate to clean things up */ void bibi(n) int n; { canit(); fflush(stdout); mode(0); fprintf(stderr, "sz: caught signal %d; exiting\n", n); if (n == SIGQUIT) abort(); if (n == 99) fprintf(stderr, "mode(2) in rbsb.c not implemented!!\n"); cucheck(); exit(128+n); } /*S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S��S������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ Called when ZMODEM gets an interrupt (^X) */ void onintr(sig) int sig; { signal(SIGINT, SIG_IGN); longjmp(intrjmp, -1); } int Zctlesc; /* Encode control characters */ int Nozmodem = 0; /* If invoked as "sb" */ char *Progname = "sz"; int Zrwindow = 1400; /* RX window size (controls garbage count) */ #include "zm.c" int main(argc, argv) int argc; char *argv[]; { register char *cp; register npats; int dm; char **patts; static char xXbuf[BUFSIZ]; if ((cp = getenv("ZNULLS")) && *cp) Znulls = atoi(cp); if ((cp=getenv("SHELL")) && (substr(cp, "rsh") || substr(cp, "rksh"))) Restricted=TRUE; from_cu(); chkinvok(argv[0]); Rxtimeout = 600; npats=0; if (argc<2) usage(); setbuf(stdout, xXbuf); while (--argc) { cp = *++argv; if (*cp++ == '-' && *cp) { while ( *cp) { switch(*cp++) { case '\\': *cp = toupper(*cp); continue; case '+': Lzmanag = ZMAPND; break; #ifdef CSTOPB case '2': Twostop = TRUE; break; #endif case 'a': Lzconv = ZCNL; Ascii = TRUE; break; case 'b': Lzconv = ZCBIN; break; case 'C': if (--argc < 1) { usage(); } Cmdtries = atoi(*++argv); break; case 'i': Cmdack1 = ZCACK1; /* **** FALL THROUGH TO **** */ case 'c': if (--argc != 1) { usage(); } Command = TRUE; Cmdstr = *++argv; break; case 'd': ++Dottoslash; /* **** FALL THROUGH TO **** */ case 'f': Fullname=TRUE; break; case 'e': Zctlesc = 1; break; case 'k': blklen=1024; break; case 'L': if (--argc < 1) { usage(); } blkopt = atoi(*++argv); if (blkopt<24 || blkopt>1024) usage(); break; case 'l': if (--argc < 1) { usage(); } Tframlen = atoi(*++argv); if (Tframlen<32 || Tframlen>1024) usage(); break; case 'N': Lzmanag = ZMNEWL; break; case 'n': Lzmanag = ZMNEW; break; case 'o': Wantfcs32 = FALSE; break; case 'p': Lzmanag = ZMPROT; break; case 'r': Lzconv = ZCRESUM; case 'q': Quiet=TRUE; Verbose=0; break; case 't': if (--argc < 1) { usage(); } Rxtimeout = atoi(*++argv); if (Rxtimeout<10 || Rxtimeout>1000) usage(); break; case 'T': if (++Test > 1) { chartest(1); chartest(2); mode(0); exit(0); } break; #ifndef vax11c case 'u': ++Unlinkafter; break; #endif case 'v': ++Verbose; break; case 'w': if (--argc < 1) { usage(); } Txwindow = atoi(*++argv); if (Txwindow < 256) Txwindow = 256; Txwindow = (Txwindow/64) * 64; Txwspac = Txwindow/4; if (blkopt > Txwspac || (!blkopt && Txwspac < 1024)) blkopt = Txwspac; break; case 'X': ++Modem2; break; case 'Y': Lskipnocor = TRUE; /* **** FALLL THROUGH TO **** */ case 'y': Lzmanag = ZMCLOB; break; default: usage(); } } } else if ( !npats && argc>0) { if (argv[0][0]) { npats=argc; patts=argv; #ifndef vax11c if ( !strcmp(*patts, "-")) iofd = 1; #endif } } } if (npats < 1 && !Command && !Test) usage(); if (Verbose) { if (freopen(LOGFILE, "a", stderr)==NULL) { printf("Can't open log file %s\n",LOGFILE); exit(0200); } setbuf(stderr, (char *)NULL); } if (Fromcu && !Quiet) { if (Verbose == 0) Verbose = 2; } vfile("%s %s for %s\n", Progname, VERSION, OS); mode(1); if (signal(SIGINT, bibi) == SIG_IGN) { signal(SIGINT, SIG_IGN); signal(SIGKILL, SIG_IGN); } else { signal(SIGINT, bibi); signal(SIGKILL, bibi); } if ( !Fromcu) signal(SIGQUIT, SIG_IGN); signal(SIGTERM, bibi); if ( !Modem2) { if (!Nozmodem) { printf("rz\r"); fflush(stdout); } countem(npats, patts); if (!Nozmodem) { stohdr(0L); if (Command) Txhdr[ZF0] = ZCOMMAND; zshhdr(ZRQINIT, Txhdr); } } fflush(stdout); if (Command) { if (getzrxinit()) { Exitcode=0200; canit(); } else if (zsendcmd(Cmdstr, 1+strlen(Cmdstr))) { Exitcode=0200; canit(); } } else if (wcsend(npats, patts)==ERROR) { Exitcode=0200; canit(); } fflush(stdout); mode(0); dm = ((errcnt != 0) | Exitcode); if (dm) { cucheck(); exit(dm); } putc('\n',stderr); exit(SS_NORMAL); /*NOTREACHED*/ } int wcsend(argc, argp) int argc; char *argp[]; { register int n; Crcflg=FALSE; firstsec=TRUE; bytcnt = -1; for (n=0; n<argc; ++n) { Totsecs = 0; if (wcs(argp[n])==ERROR) return ERROR; } Totsecs = 0; if (Filcnt==0) { /* bitch if we couldn't open ANY files */ if ( !Modem2) { Command = TRUE; Cmdstr = "echo \"sz: Can't open any requested files\""; if (getnak()) { Exitcode=0200; canit(); } if (!Zmodem) canit(); else if (zsendcmd(Cmdstr, 1+strlen(Cmdstr))) { Exitcode=0200; canit(); } Exitcode = 1; return OK; } canit(); fprintf(stderr,"\r\nCan't open any requested files.\r\n"); return ERROR; } if (Zmodem) saybibi(); else if ( !Modem2) wctxpn(""); return OK; } int wcs(oname) char *oname; { register c; register char *p; struct stat f; char name[PATHLEN]; strcpy(name, oname); if (Restricted) { /* restrict pathnames to current tree or uucppublic */ if ( substr(name, "../") || (name[0]== '/' && strncmp(name, PUBDIR, strlen(PUBDIR))) ) { canit(); fprintf(stderr,"\r\nsz:\tSecurity Violation\r\n"); return ERROR; } } if ( !strcmp(oname, "-")) { if ((p = getenv("ONAME")) && *p) strcpy(name, p); else sprintf(name, "s%d.sz", getpid()); in = stdin; } else if ((in=fopen(oname, "r"))==NULL) { ++errcnt; return OK; /* pass over it, there may be others */ } BEofseen = Eofseen = 0; vpos = 0; /* Check for directory or block special files */ fstat(fileno(in), &f); c = f.st_mode & S_IFMT; if (c == S_IFDIR || c == S_IFBLK) { fclose(in); return OK; } ++Filcnt; switch (wctxpn(name)) { case ERROR: return ERROR; case ZSKIP: return OK; } if (!Zmodem && wctx(f.st_size)==ERROR) return ERROR; #ifndef vax11c if (Unlinkafter) unlink(oname); #endif return 0; } /* * generate and transmit pathname block consisting of * pathname (null terminated), * file length, mode time and file mode in octal * as provided by the Unix fstat call. * N.B.: modifies the passed name, may extend it! */ int wctxpn(name) char *name; { register char *p, *q; char name2[PATHLEN]; struct stat f; if (Modem2) { if ((in!=stdin) && *name && fstat(fileno(in), &f)!= -1) { fprintf(stderr, "Sending %s, %ld blocks: ", name, f.st_size>>7); } fprintf(stderr, "Give your local XMODEM receive command now.\r\n"); return OK; } zperr("Awaiting pathname nak for %s", *name?name:"<END>"); if ( !Zmodem) if (getnak()) return ERROR; q = (char *) 0; if (Dottoslash) { /* change . to . */ for (p=name; *p; ++p) { if (*p == '/') q = p; else if (*p == '.') *(q=p) = '/'; } if (q && strlen(++q) > 8) { /* If name>8 chars */ q += 8; /* make it .ext */ strcpy(name2, q); /* save excess of name */ *q = '.'; strcpy(++q, name2); /* add it back */ } } for (p=name, q=txbuf ; *p; ) if ((*q++ = *p++) == '/' && !Fullname) q = txbuf; *q++ = 0; p=q; while (q < (txbuf + 1024)) *q++ = 0; if (!Ascii && (in!=stdin) && *name && fstat(fileno(in), &f)!= -1) sprintf(p, "%lu %lo %o 0 %d %ld", f.st_size, f.st_mtime, f.st_mode, Filesleft, Totalleft); Totalleft -= f.st_size; if (--Filesleft <= 0) Totalleft = 0; if (Totalleft < 0) Totalleft = 0; /* force 1k blocks if name won't fit in 128 byte block */ if (txbuf[125]) blklen=1024; else { /* A little goodie for IMP/KMD */ txbuf[127] = (f.st_size + 127) >>7; txbuf[126] = (f.st_size + 127) >>15; } if (Zmodem) return zsendfile(txbuf, 1+strlen(p)+(p-txbuf)); if (wcputsec(txbuf, 0, 128)==ERROR) return ERROR; return OK; } int getnak() { register firstch; Lastrx = 0; for (;;) { switch (firstch = readline(800)) { case ZPAD: if (getzrxinit()) return ERROR; Ascii = 0; /* Receiver does the conversion */ return FALSE; case TIMEOUT: zperr("Timeout on pathname"); return TRUE; case WANTG: #ifdef MODE2OK mode(2); /* Set cbreak, XON/XOFF, etc. */ #endif Optiong = TRUE; blklen=1024; case WANTCRC: Crcflg = TRUE; case NAK: return FALSE; case CAN: if ((firstch = readline(20)) == CAN && Lastrx == CAN) return TRUE; default: break; } Lastrx = firstch; } } int wctx(flen) long flen; { register int thisblklen; register int sectnum, attempts, firstch; long charssent; charssent = 0; firstsec=TRUE; thisblklen = blklen; vfile("wctx:file length=%ld", flen); while ((firstch=readline(Rxtimeout))!=NAK && firstch != WANTCRC && firstch != WANTG && firstch!=TIMEOUT && firstch!=CAN) ; if (firstch==CAN) { zperr("Receiver CANcelled"); return ERROR; } if (firstch==WANTCRC) Crcflg=TRUE; if (firstch==WANTG) Crcflg=TRUE; sectnum=0; for (;;) { if (flen <= (charssent + 896L)) thisblklen = 128; if ( !filbuf(txbuf, thisblklen)) break; if (wcputsec(txbuf, ++sectnum, thisblklen)==ERROR) return ERROR; charssent += thisblklen; } fclose(in); attempts=0; do { purgeline(); sendline(EOT); fflush(stdout); ++attempts; } while ((firstch=(readline(Rxtimeout)) != ACK) && attempts < RETRYMAX); if (attempts == RETRYMAX) { zperr("No ACK on EOT"); return ERROR; } else return OK; } int wcputsec(buf, sectnum, cseclen) char *buf; int sectnum; int cseclen; /* data length of this sector to send */ { register checksum, wcj; register char *cp; unsigned oldcrc; int firstch; int attempts; firstch=0; /* part of logic to detect CAN CAN */ if (Verbose>2) fprintf(stderr, "Sector %3d %2dk\n", Totsecs, Totsecs/8 ); else if (Verbose>1) fprintf(stderr, "\rSector %3d %2dk ", Totsecs, Totsecs/8 ); for (attempts=0; attempts <= RETRYMAX; attempts++) { Lastrx= firstch; sendline(cseclen==1024?STX:SOH); sendline(sectnum); sendline(-sectnum -1); oldcrc=checksum=0; for (wcj=cseclen,cp=buf; --wcj>=0; ) { sendline(*cp); oldcrc=updcrc((0377& *cp), oldcrc); checksum += *cp++; } if (Crcflg) { oldcrc=updcrc(0,updcrc(0,oldcrc)); sendline((int)oldcrc>>8); sendline((int)oldcrc); } else sendline(checksum); if (Optiong) { firstsec = FALSE; return OK; } firstch = readline(Rxtimeout); gotnak: switch (firstch) { case CAN: if(Lastrx == CAN) { cancan: zperr("Cancelled"); return ERROR; } break; case TIMEOUT: zperr("Timeout on sector ACK"); continue; case WANTCRC: if (firstsec) Crcflg = TRUE; case NAK: zperr("NAK on sector"); continue; case ACK: firstsec=FALSE; Totsecs += (cseclen>>7); return OK; case ERROR: zperr("Got burst for sector ACK"); break; default: zperr("Got %02x for sector ACK", firstch); break; } for (;;) { Lastrx = firstch; if ((firstch = readline(Rxtimeout)) == TIMEOUT) break; if (firstch == NAK || firstch == WANTCRC) goto gotnak; if (firstch == CAN && Lastrx == CAN) goto cancan; } } zperr("Retry Count Exceeded"); return ERROR; } /* fill buf with count chars padding with ^Z for CPM */ int filbuf(buf, count) register char *buf; int count; { register c, m; if ( !Ascii) { m = read(fileno(in), buf, count); if (m <= 0) return 0; while (m < count) buf[m++] = 032; return count; } m=count; if (Lfseen) { *buf++ = 012; --m; Lfseen = 0; } while ((c=getc(in))!=EOF) { if (c == 012) { *buf++ = 015; if (--m == 0) { Lfseen = TRUE; break; } } *buf++ =c; if (--m == 0) break; } if (m==count) return 0; else while (--m>=0) *buf++ = CPMEOF; return count; } /* Fill buffer with blklen chars */ int zfilbuf() { int n; #ifdef TXBSIZE /* We assume request is within buffer, or just beyond */ txbuf = Txb + (bytcnt & TXBMASK); if (vpos <= bytcnt) { n = fread(txbuf, 1, blklen, in); vpos += n; if (n < blklen) Eofseen = 1; return n; } if (vpos >= (bytcnt+blklen)) return blklen; /* May be a short block if crash recovery etc. */ Eofseen = BEofseen; return (vpos - bytcnt); #else n = fread(txbuf, 1, blklen, in); if (n < blklen) Eofseen = 1; return n; #endif } #ifdef TXBSIZE int fooseek(fptr, pos, whence) FILE *fptr; long pos; { int m, n; vfile("fooseek: pos =%lu vpos=%lu Canseek=%d", pos, vpos, Canseek); /* Seek offset < current buffer */ if (pos < (vpos -TXBSIZE +1024)) { BEofseen = 0; if (Canseek > 0) { vpos = pos & ~TXBMASK; if (vpos >= pos) vpos -= TXBSIZE; if (fseek(fptr, vpos, 0)) return 1; } else if (Canseek == 0) if (fseek(fptr, vpos = 0L, 0)) return 1; else return 1; while (vpos <= pos) { n = fread(Txb, 1, TXBSIZE, fptr); vpos += n; vfile("n=%d vpos=%ld", n, vpos); if (n < TXBSIZE) { BEofseen = 1; break; } } vfile("vpos=%ld", vpos); return 0; } /* Seek offset > current buffer (crash recovery, etc.) */ if (pos > vpos) { if (Canseek) if (fseek(fptr, vpos = (pos & ~TXBMASK), 0)) return 1; while (vpos <= pos) { txbuf = Txb + (vpos & TXBMASK); m = TXBSIZE - (vpos & TXBMASK); n = fread(txbuf, 1, m, fptr); vpos += n; vfile("bo=%d n=%d vpos=%ld", txbuf-Txb, n, vpos); if (m < n) { BEofseen = 1; break; } } return 0; } /* Seek offset is within current buffer */ vfile("vpos=%ld", vpos); return 0; } #define fseek fooseek #endif /* VARARGS1 */ void vfile(f, a, b, c) register char *f,*a,*b,*c; { if (Verbose > 2) { fprintf(stderr, f, a, b, c); fprintf(stderr, "\n"); } } void alrm(sig) int sig; { longjmp(tohere, -1); } #ifndef vax11c /* * readline(timeout) reads character(s) from file descriptor 0 * timeout is in tenths of seconds */ int readline(timeout) int timeout; { register int c; static char byt[1]; fflush(stdout); if (setjmp(tohere)) { zperr("TIMEOUT"); return TIMEOUT; } c = timeout/10; if (c<2) c=2; if (Verbose>5) { fprintf(stderr, "Timeout=%d Calling alarm(%d) ", timeout, c); } signal(SIGALRM, alrm); alarm(c); c=read(iofd, byt, 1); alarm(0); if (Verbose>5) fprintf(stderr, "ret %x\n", byt[0]); if (c<1) return TIMEOUT; return (byt[0]&0377); } void flushmo() { fflush(stdout); } void purgeline() { #ifdef USG ioctl(iofd, TCFLSH, 0); #else lseek(iofd, 0L, 2); #endif } #endif /* send cancel string to get the other end to shut up */ void canit() { static char canistr[] = { 24,24,24,24,24,24,24,24,24,24,8,8,8,8,8,8,8,8,8,8,0 }; #ifdef vax11c raw_wbuf(strlen(canistr), canistr); purgeline(); #else printf(canistr); fflush(stdout); #endif } /* * Log an error */ /*VARARGS1*/ void zperr(s,p,u) char *s, *p, *u; { if (Verbose <= 0) return; fprintf(stderr, "\nRetry %d: ", errors); fprintf(stderr, s, p, u); fprintf(stderr, "\n"); } /* * substr(string, token) searches for token in string s * returns pointer to token within string if found, NULL otherwise */ char * substr(s, t) register char *s,*t; { register char *ss,*tt; /* search for first char of token */ for (ss=s; *s; s++) if (*s == *t) /* compare token with substring */ for (ss=s,tt=t; ;) { if (*tt == 0) return s; if (*ss++ != *tt++) break; } return (char *)NULL; } char *babble[] = { #ifdef vax11c " Send file(s) with ZMODEM Protocol", "Usage: sz [-2+abdefkLlNnquvwYy] [-] file ...", " sz [-2Ceqv] -c COMMAND", " \\ Force next option letter to upper case", #else "Send file(s) with ZMODEM/YMODEM/XMODEM Protocol", " (Y) = Option applies to YMODEM only", " (Z) = Option applies to ZMODEM only", "Usage: sz [-2+abdefkLlNnquvwYy] [-] file ...", " sz [-2Ceqv] -c COMMAND", " sb [-2adfkquv] [-] file ...", " sx [-2akquv] [-] file", #endif #ifdef CSTOPB " 2 Use 2 stop bits", #endif " + Append to existing destination file (Z)", " a (ASCII) change NL to CR/LF", " b Binary file transfer override", " c send COMMAND (Z)", #ifndef vax11c " d Change '.' to '/' in pathnames (Y/Z)", #endif " e Escape all control characters (Z)", " f send Full pathname (Y/Z)", " i send COMMAND, ack Immediately (Z)", " k Send 1024 byte packets (Y)", " L N Limit subpacket length to N bytes (Z)", " l N Limit frame length to N bytes (l>=L) (Z)", " n send file if source newer (Z)", " N send file if source newer or longer (Z)", " o Use 16 bit CRC instead of 32 bit CRC (Z)", " p Protect existing destination file (Z)", " r Resume/Recover interrupted file transfer (Z)", " q Quiet (no progress reports)", #ifndef vax11c " u Unlink file after transmission", #endif " v Verbose - provide debugging information", " w N Window is N bytes (Z)", " Y Yes, overwrite existing file, skip if not present at rx (Z)", " y Yes, overwrite existing file (Z)", "- as pathname sends standard input as sPID.sz or environment ONAME", "" }; int usage() { char **pp; for (pp=babble; **pp; ++pp) fprintf(stderr, "%s\n", *pp); fprintf(stderr, "%s for %s by Chuck Forsberg, Omen Technology INC\n", VERSION, OS); fprintf(stderr, "\t\t\042The High Reliability Software\042\n"); cucheck(); exit(SS_NORMAL); } /* * Get the receiver's init parameters */ int getzrxinit() { register n; struct stat f; for (n=10; --n>=0; ) { switch (zgethdr(Rxhdr, 1)) { case ZCHALLENGE: /* Echo receiver's challenge numbr */ stohdr(Rxpos); zshhdr(ZACK, Txhdr); continue; case ZCOMMAND: /* They didn't see out ZRQINIT */ stohdr(0L); zshhdr(ZRQINIT, Txhdr); continue; case ZRINIT: Rxflags = 0377 & Rxhdr[ZF0]; Txfcs32 = (Wantfcs32 && (Rxflags & CANFC32)); Zctlesc |= Rxflags & TESCCTL; Rxbuflen = (0377 & Rxhdr[ZP0])+((0377 & Rxhdr[ZP1])<<8); if ( !(Rxflags & CANFDX)) Txwindow = 0; vfile("Rxbuflen=%d Tframlen=%d", Rxbuflen, Tframlen); if ( !Fromcu) signal(SIGINT, SIG_IGN); #ifdef MODE2OK mode(2); /* Set cbreak, XON/XOFF, etc. */ #endif #ifndef READCHECK #ifndef USG /* Use 1024 byte frames if no sample/interrupt */ if (Rxbuflen < 32 || Rxbuflen > 1024) { Rxbuflen = 1024; vfile("Rxbuflen=%d", Rxbuflen); } #endif #endif /* Override to force shorter frame length */ if (Rxbuflen && (Rxbuflen>Tframlen) && (Tframlen>=32)) Rxbuflen = Tframlen; if ( !Rxbuflen && (Tframlen>=32) && (Tframlen<=1024)) Rxbuflen = Tframlen; vfile("Rxbuflen=%d", Rxbuflen); #ifndef vax11c /* If using a pipe for testing set lower buf len */ fstat(iofd, &f); if ((f.st_mode & S_IFMT) != S_IFCHR) { Rxbuflen = 1024; } #endif #ifdef BADSEEK Canseek = 0; Txwindow = TXBSIZE - 1024; Txwspac = TXBSIZE/4; #endif /* * If input is not a regular file, force ACK's to * prevent running beyond the buffer limits */ if ( !Command) { fstat(fileno(in), &f); if ((f.st_mode & S_IFMT) != S_IFREG) { Canseek = -1; #ifdef TXBSIZE Txwindow = TXBSIZE - 1024; Txwspac = TXBSIZE/4; #else return ERROR; #endif } } /* Set initial subpacket length */ if (blklen < 1024) { /* Command line override? */ if (Baudrate > 300) blklen = 256; if (Baudrate > 1200) blklen = 512; if (Baudrate > 2400) blklen = 1024; } if (Rxbuflen && blklen>Rxbuflen) blklen = Rxbuflen; if (blkopt && blklen > blkopt) blklen = blkopt; vfile("Rxbuflen=%d blklen=%d", Rxbuflen, blklen); vfile("Txwindow = %u Txwspac = %d", Txwindow, Txwspac); return (sendzsinit()); case ZCAN: case TIMEOUT: return ERROR; case ZRQINIT: if (Rxhdr[ZF0] == ZCOMMAND) continue; default: zshhdr(ZNAK, Txhdr); continue; } } return ERROR; } /* Send send-init information */ int sendzsinit() { register c; if (Myattn[0] == '\0' && (!Zctlesc || (Rxflags & TESCCTL))) return OK; errors = 0; for (;;) { stohdr(0L); if (Zctlesc) { Txhdr[ZF0] |= TESCCTL; zshhdr(ZSINIT, Txhdr); } else zsbhdr(ZSINIT, Txhdr); zsdata(Myattn, 1+strlen(Myattn), ZCRCW); c = zgethdr(Rxhdr, 1); switch (c) { case ZCAN: return ERROR; case ZACK: return OK; default: if (++errors > 19) return ERROR; continue; } } } /* Send file name and related info */ int zsendfile(buf, blen) char *buf; int blen; { register c; register UNSL long crc; for (;;) { Txhdr[ZF0] = Lzconv; /* file conversion request */ Txhdr[ZF1] = Lzmanag; /* file management request */ if (Lskipnocor) Txhdr[ZF1] |= ZMSKNOLOC; Txhdr[ZF2] = Lztrans; /* file transport request */ Txhdr[ZF3] = 0; zsbhdr(ZFILE, Txhdr); zsdata(buf, blen, ZCRCW); again: c = zgethdr(Rxhdr, 1); switch (c) { case ZRINIT: while ((c = readline(50)) > 0) if (c == ZPAD) { goto again; } /* **** FALL THRU TO **** */ default: continue; case ZCAN: case TIMEOUT: case ZABORT: case ZFIN: return ERROR; case ZCRC: crc = 0xFFFFFFFFL; if (Canseek >= 0) { while (((c = getc(in)) != EOF) && --Rxpos) crc = UPDC32(c, crc); crc = ~crc; clearerr(in); /* Clear EOF */ fseek(in, 0L, 0); } stohdr(crc); zsbhdr(ZCRC, Txhdr); goto again; case ZSKIP: fclose(in); return c; case ZRPOS: /* * Suppress zcrcw request otherwise triggered by * lastyunc==bytcnt */ if (Rxpos && fseek(in, Rxpos, 0)) return ERROR; Lastsync = (bytcnt = Txpos = Rxpos) -1; return zsendfdata(); } } } /* Send the data in the file */ int zsendfdata() { register c, e, n; register int newcnt; register long tcount = 0; int junkcount; /* Counts garbage chars received by TX */ static int tleft = 6; /* Counter for test mode */ Lrxpos = 0; junkcount = 0; Beenhereb4 = FALSE; somemore: if (setjmp(intrjmp)) { waitack: junkcount = 0; c = getinsync(0); gotack: switch (c) { default: case ZCAN: fclose(in); return ERROR; case ZSKIP: fclose(in); return c; case ZACK: case ZRPOS: break; case ZRINIT: return OK; } #ifdef READCHECK /* * If the reverse channel can be tested for data, * this logic may be used to detect error packets * sent by the receiver, in place of setjmp/longjmp * rdchk(fdes) returns non 0 if a character is available */ while (rdchk(iofd)) { #ifdef SV switch (checked) #else switch (readline(1)) #endif { case CAN: case ZPAD: c = getinsync(1); goto gotack; case XOFF: /* Wait a while for an XON */ case XOFF|0200: readline(100); } } #endif } if ( !Fromcu) signal(SIGINT, onintr); newcnt = Rxbuflen; Txwcnt = 0; stohdr(Txpos); zsbhdr(ZDATA, Txhdr); /* * Special testing mode. This should force receiver to Attn,ZRPOS * many times. Each time the signal should be caught, causing the * file to be started over from the beginning. */ if (Test) { if ( --tleft) while (tcount < 20000) { printf(qbf); fflush(stdout); tcount += strlen(qbf); #ifdef READCHECK while (rdchk(iofd)) { #ifdef SV switch (checked) #else switch (readline(1)) #endif { case CAN: case ZPAD: #ifdef TCFLSH ioctl(iofd, TCFLSH, 1); #endif goto waitack; case XOFF: /* Wait for XON */ case XOFF|0200: readline(100); } } #endif } signal(SIGINT, SIG_IGN); canit(); sleep(3); purgeline(); mode(0); printf("\nsz: Tcount = %ld\n", tcount); if (tleft) { printf("ERROR: Interrupts Not Caught\n"); exit(1); } exit(SS_NORMAL); } do { n = zfilbuf(); if (Eofseen) e = ZCRCE; else if (junkcount > 3) e = ZCRCW; else if (bytcnt == Lastsync) e = ZCRCW; else if (Rxbuflen && (newcnt -= n) <= 0) e = ZCRCW; else if (Txwindow && (Txwcnt += n) >= Txwspac) { Txwcnt = 0; e = ZCRCQ; } else e = ZCRCG; if (Verbose>1) fprintf(stderr, "\r%7ld ZMODEM%s ", Txpos, Crc32t?" CRC-32":""); zsdata(txbuf, n, e); bytcnt = Txpos += n; if (e == ZCRCW) goto waitack; #ifdef READCHECK /* * If the reverse channel can be tested for data, * this logic may be used to detect error packets * sent by the receiver, in place of setjmp/longjmp * rdchk(fdes) returns non 0 if a character is available */ fflush(stdout); while (rdchk(iofd)) { #ifdef SV switch (checked) #else switch (readline(1)) #endif { case CAN: case ZPAD: c = getinsync(1); if (c == ZACK) break; #ifdef TCFLSH ioctl(iofd, TCFLSH, 1); #endif /* zcrce - dinna wanna starta ping-pong game */ zsdata(txbuf, 0, ZCRCE); goto gotack; case XOFF: /* Wait a while for an XON */ case XOFF|0200: readline(100); default: ++junkcount; } } #endif /* READCHECK */ if (Txwindow) { while ((tcount = Txpos - Lrxpos) >= Txwindow) { vfile("%ld window >= %u", tcount, Txwindow); if (e != ZCRCQ) zsdata(txbuf, 0, e = ZCRCQ); c = getinsync(1); if (c != ZACK) { #ifdef TCFLSH ioctl(iofd, TCFLSH, 1); #endif zsdata(txbuf, 0, ZCRCE); goto gotack; } } vfile("window = %ld", tcount); } } while (!Eofseen); if ( !Fromcu) signal(SIGINT, SIG_IGN); for (;;) { stohdr(Txpos); zsbhdr(ZEOF, Txhdr); switch (getinsync(0)) { case ZACK: continue; case ZRPOS: goto somemore; case ZRINIT: return OK; case ZSKIP: fclose(in); return c; default: fclose(in); return ERROR; } } } /* * Respond to receiver's complaint, get back in sync with receiver */ int getinsync(flag) int flag; { register int c; for (;;) { if (Test) { printf("\r\n\n\n***** Signal Caught *****\r\n"); Rxpos = 0; c = ZRPOS; } else c = zgethdr(Rxhdr, 0); switch (c) { case ZCAN: case ZABORT: case ZFIN: case TIMEOUT: return ERROR; case ZRPOS: /* ************************************* */ /* If sending to a buffered modem, you */ /* might send a break at this point to */ /* dump the modem's buffer. */ clearerr(in); /* In case file EOF seen */ if (fseek(in, Rxpos, 0)) return ERROR; Eofseen = 0; bytcnt = Lrxpos = Txpos = Rxpos; if (Lastsync == Rxpos) { if (++Beenhereb4 > 4) if (blklen > 32) blklen /= 2; } Lastsync = Rxpos; return c; case ZACK: Lrxpos = Rxpos; if (flag || Txpos == Rxpos) return ZACK; continue; case ZRINIT: case ZSKIP: fclose(in); return c; case ERROR: default: zsbhdr(ZNAK, Txhdr); continue; } } } /* Say "bibi" to the receiver, try to do it cleanly */ void saybibi() { for (;;) { stohdr(0L); /* CAF Was zsbhdr - minor change */ zshhdr(ZFIN, Txhdr); /* to make debugging easier */ switch (zgethdr(Rxhdr, 0)) { case ZFIN: sendline('O'); sendline('O'); flushmo(); case ZCAN: case TIMEOUT: return; } } } /* Local screen character display function */ void bttyout(c) int c; { if (Verbose) putc(c, stderr); } /* Send command and related info */ int zsendcmd(buf, blen) char *buf; int blen; { register c; long cmdnum; cmdnum = getpid(); errors = 0; for (;;) { stohdr(cmdnum); Txhdr[ZF0] = Cmdack1; zsbhdr(ZCOMMAND, Txhdr); zsdata(buf, blen, ZCRCW); listen: Rxtimeout = 100; /* Ten second wait for resp. */ c = zgethdr(Rxhdr, 1); switch (c) { case ZRINIT: goto listen; /* CAF 8-21-87 */ case ERROR: case TIMEOUT: if (++errors > Cmdtries) return ERROR; continue; case ZCAN: case ZABORT: case ZFIN: case ZSKIP: case ZRPOS: return ERROR; default: if (++errors > 20) return ERROR; continue; case ZCOMPL: Exitcode = Rxpos; saybibi(); return OK; case ZRQINIT: #ifdef vax11c /* YAMP :== Yet Another Missing Primitive */ return ERROR; #else vfile("******** RZ *******"); system("rz"); vfile("******** SZ *******"); goto listen; #endif } } } /* * If called as sb use YMODEM protocol */ void chkinvok(s) char *s; { #ifdef vax11c Progname = "sz"; #else register char *p; p = s; while (*p == '-') s = ++p; while (*p) if (*p++ == '/') s = p; if (*s == 'v') { Verbose=1; ++s; } Progname = s; if (s[0]=='s' && s[1]=='b') { Nozmodem = TRUE; blklen=1024; } if (s[0]=='s' && s[1]=='x') { Modem2 = TRUE; } #endif } void countem(argc, argv) int argc; register char **argv; { register c; struct stat f; for (Totalleft = 0, Filesleft = 0; --argc >=0; ++argv) { f.st_size = -1; if (Verbose>2) { fprintf(stderr, "\nCountem: %03d %s ", argc, *argv); fflush(stderr); } if (access(*argv, 04) >= 0 && stat(*argv, &f) >= 0) { c = f.st_mode & S_IFMT; if (c != S_IFDIR && c != S_IFBLK) { ++Filesleft; Totalleft += f.st_size; } } if (Verbose>2) fprintf(stderr, " %ld", f.st_size); } if (Verbose>2) fprintf(stderr, "\ncountem: Total %d %ld\n", Filesleft, Totalleft); } void chartest(m) int m; { register int n; mode(m); printf("\r\n\nCharacter Transparency Test Mode %d\r\n", m); printf("If Pro-YAM/ZCOMM is not displaying ^M hit ALT-V NOW.\r\n"); printf("Hit Enter.\021"); fflush(stdout); readline(500); for (n = 0; n < 256; ++n) { if (!(n%8)) printf("\r\n"); printf("%02x ", n); fflush(stdout); sendline(n); flushmo(); printf(" "); fflush(stdout); if (n == 127) { printf("Hit Enter.\021"); fflush(stdout); readline(500); printf("\r\n"); fflush(stdout); } } printf("\021\r\nEnter Characters, echo is in hex.\r\n"); printf("Hit SPACE or pause 40 seconds for exit.\r\n"); while (n != TIMEOUT && n != ' ') { n = readline(400); printf("%02x\r\n", n); fflush(stdout); } printf("\r\nMode %d character transparency test ends.\r\n", m); fflush(stdout); } /* End of sz.c */ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Z M . C * ZMODEM protocol primitives * 05-09-88 Chuck Forsberg Omen Technology Inc * * Entry point Functions: * zsbhdr(type, hdr) send binary header * zshhdr(type, hdr) send hex header * zgethdr(hdr, eflag) receive header - binary or hex * zsdata(buf, len, frameend) send data * zrdata(buf, len) receive data * stohdr(pos) store position data in Txhdr * long rclhdr(hdr) recover position offset from header */ #ifndef CANFDX #include "zmodem.h" #endif int Rxtimeout = 100; /* Tenths of seconds to wait for something */ #ifndef UNSL #define UNSL #endif /* Globals used by ZMODEM functions */ int Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame received */ int Rxtype; /* Type of header received */ int Rxcount; /* Count of data bytes received */ char Rxhdr[4]; /* Received header */ char Txhdr[4]; /* Transmitted header */ long Rxpos; /* Received file position */ long Txpos; /* Transmitted file position */ int Txfcs32; /* TURE means send binary frames with 32 bit FCS */ int Crc32t; /* Display flag indicating 32 bit CRC being sent */ int Crc32; /* Display flag indicating 32 bit CRC being received */ int Znulls; /* Number of nulls to send at beginning of ZDATA hdr */ char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ static lastsent; /* Last char we sent */ static Not8bit; /* Seven bits seen on header */ static char *frametypes[] = { "Carrier Lost", /* -3 */ "TIMEOUT", /* -2 */ "ERROR", /* -1 */ #define FTOFFSET 3 "ZRQINIT", "ZRINIT", "ZSINIT", "ZACK", "ZFILE", "ZSKIP", "ZNAK", "ZABORT", "ZFIN", "ZRPOS", "ZDATA", "ZEOF", "ZFERR", "ZCRC", "ZCHALLENGE", "ZCOMPL", "ZCAN", "ZFREECNT", "ZCOMMAND", "ZSTDERR", "xxxxx" #define FRTYPES 22 /* Total number of frame types in this array */ /* not including psuedo negative entries */ }; static char badcrc[] = "Bad CRC"; /* Send ZMODEM binary header hdr of type type */ void zsbhdr(type, hdr) int type; register char *hdr; { register int n; register unsigned short crc; vfile("zsbhdr: %s %lx", frametypes[type+FTOFFSET], rclhdr(hdr)); if (type == ZDATA) for (n = Znulls; --n >=0; ) xsendline(0); xsendline(ZPAD); xsendline(ZDLE); if (Crc32t=Txfcs32) zsbh32(hdr, type); else { xsendline(ZBIN); zsendline(type); crc = updcrc(type, 0); for (n=4; --n >= 0; ++hdr) { zsendline(*hdr); crc = updcrc((0377& *hdr), crc); } crc = updcrc(0,updcrc(0,crc)); zsendline(crc>>8); zsendline(crc); } if (type != ZDATA) flushmo(); } /* Send ZMODEM binary header hdr of type type */ void zsbh32(hdr, type) register char *hdr; int type; { register int n; register UNSL long crc; xsendline(ZBIN32); zsendline(type); crc = 0xFFFFFFFFL; crc = UPDC32(type, crc); for (n=4; --n >= 0; ++hdr) { crc = UPDC32((0377 & *hdr), crc); zsendline(*hdr); } crc = ~crc; for (n=4; --n >= 0;) { zsendline((int)crc); crc >>= 8; } } /* Send ZMODEM HEX header hdr of type type */ void zshhdr(type, hdr) int type; register char *hdr; { register int n; register unsigned short crc; vfile("zshhdr: %s %lx", frametypes[type+FTOFFSET], rclhdr(hdr)); sendline(ZPAD); sendline(ZPAD); sendline(ZDLE); sendline(ZHEX); zputhex(type); Crc32t = 0; crc = updcrc(type, 0); for (n=4; --n >= 0; ++hdr) { zputhex(*hdr); crc = updcrc((0377 & *hdr), crc); } crc = updcrc(0,updcrc(0,crc)); zputhex(crc>>8); zputhex(crc); /* Make it printable on remote machine */ sendline(015); sendline(0212); /* * Uncork the remote in case a fake XOFF has stopped data flow */ if (type != ZFIN && type != ZACK) sendline(021); flushmo(); } /* * Send binary array buf of length length, with ending ZDLE sequence frameend */ static char *Zendnames[] = { "ZCRCE", "ZCRCG", "ZCRCQ", "ZCRCW"}; void zsdata(buf, length, frameend) register char *buf; int length; int frameend; { register unsigned short crc; vfile("zsdata: %d %s", length, Zendnames[(frameend-ZCRCE)&3]); if (Crc32t) zsda32(buf, length, frameend); else { crc = 0; for (;--length >= 0; ++buf) { zsendline(*buf); crc = updcrc((0377 & *buf), crc); } xsendline(ZDLE); xsendline(frameend); crc = updcrc(frameend, crc); crc = updcrc(0,updcrc(0,crc)); zsendline(crc>>8); zsendline(crc); } if (frameend == ZCRCW) { xsendline(XON); flushmo(); } } void zsda32(buf, length, frameend) register char *buf; int length; int frameend; { register int c; register UNSL long crc; crc = 0xFFFFFFFFL; for (;--length >= 0; ++buf) { c = *buf & 0377; if (c & 0140) xsendline(lastsent = c); else zsendline(c); crc = UPDC32(c, crc); } xsendline(ZDLE); xsendline(frameend); crc = UPDC32(frameend, crc); crc = ~crc; for (length=4; --length >= 0;) { zsendline((int)crc); crc >>= 8; } } /* * Receive array buf of max length with ending ZDLE sequence * and CRC. Returns the ending character or error code. * NB: On errors may store length+1 bytes! */ int zrdata(buf, length) register char *buf; int length; { register int c; register unsigned short crc; register char *end; register int d; if (Rxframeind == ZBIN32) return zrdat32(buf, length); crc = Rxcount = 0; end = buf + length; while (buf <= end) { if ((c = zdlread()) & ~0377) { crcfoo: switch (c) { case GOTCRCE: case GOTCRCG: case GOTCRCQ: case GOTCRCW: crc = updcrc((d=c)&0377, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = updcrc(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } Rxcount = length - (end - buf); vfile("zrdata: %d %s", Rxcount, Zendnames[(d-GOTCRCE)&3]); return d; case GOTCAN: zperr("Sender Canceled"); return ZCAN; case TIMEOUT: zperr("TIMEOUT"); return c; default: zperr("Bad data subpacket"); return c; } } *buf++ = c; crc = updcrc(c, crc); } zperr("Data subpacket too long"); return ERROR; } int zrdat32(buf, length) register char *buf; int length; { register int c; register UNSL long crc; register char *end; register int d; crc = 0xFFFFFFFFL; Rxcount = 0; end = buf + length; while (buf <= end) { if ((c = zdlread()) & ~0377) { crcfoo: switch (c) { case GOTCRCE: case GOTCRCG: case GOTCRCQ: case GOTCRCW: d = c; c &= 0377; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if ((c = zdlread()) & ~0377) goto crcfoo; crc = UPDC32(c, crc); if (crc != 0xDEBB20E3) { zperr(badcrc); return ERROR; } Rxcount = length - (end - buf); vfile("zrdat32: %d %s", Rxcount, Zendnames[(d-GOTCRCE)&3]); return d; case GOTCAN: zperr("Sender Canceled"); return ZCAN; case TIMEOUT: zperr("TIMEOUT"); return c; default: zperr("Bad data subpacket"); return c; } } *buf++ = c; crc = UPDC32(c, crc); } zperr("Data subpacket too long"); return ERROR; } /* * Read a ZMODEM header to hdr, either binary or hex. * eflag controls local display of non zmodem characters: * 0: no display * 1: display printing characters only * 2: display all non ZMODEM characters * On success, set Zmodem to 1, set Rxpos and return type of header. * Otherwise return negative on error. * Return ERROR instantly if ZCRCW sequence, for fast error recovery. */ int zgethdr(hdr, eflag) char *hdr; int eflag; { register int c, n, cancount; n = Zrwindow + Baudrate; /* Max bytes before start of frame */ Rxframeind = Rxtype = 0; startover: cancount = 5; again: /* Return immediate ERROR if ZCRCW sequence seen */ switch (c = readline(Rxtimeout)) { case RCDO: case TIMEOUT: goto fifi; case CAN: gotcan: if (--cancount <= 0) { c = ZCAN; goto fifi; } switch (c = readline(1)) { case TIMEOUT: goto again; case ZCRCW: c = ERROR; /* **** FALL THRU TO **** */ case RCDO: goto fifi; default: break; case CAN: if (--cancount <= 0) { c = ZCAN; goto fifi; } goto again; } /*S��S���T��T��T��T��T��T���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� **** FALL THRU TO **** */ default: agn2: if ( --n == 0) { zperr("Garbage count exceeded"); return(ERROR); } if (eflag && ((c &= 0177) & 0140)) bttyout(c); else if (eflag > 1) bttyout(c); #ifdef UNIX fflush(stderr); #endif goto startover; case ZPAD|0200: /* This is what we want. */ Not8bit = c; case ZPAD: /* This is what we want. */ break; } cancount = 5; splat: switch (c = noxrd7()) { case ZPAD: goto splat; case RCDO: case TIMEOUT: goto fifi; default: goto agn2; case ZDLE: /* This is what we want. */ break; } switch (c = noxrd7()) { case RCDO: case TIMEOUT: goto fifi; case ZBIN: Rxframeind = ZBIN; Crc32 = FALSE; c = zrbhdr(hdr); break; case ZBIN32: Crc32 = Rxframeind = ZBIN32; c = zrbhdr32(hdr); break; case ZHEX: Rxframeind = ZHEX; Crc32 = FALSE; c = zrhhdr(hdr); break; case CAN: goto gotcan; default: goto agn2; } Rxpos = hdr[ZP3] & 0377; Rxpos = (Rxpos<<8) + (hdr[ZP2] & 0377); Rxpos = (Rxpos<<8) + (hdr[ZP1] & 0377); Rxpos = (Rxpos<<8) + (hdr[ZP0] & 0377); fifi: switch (c) { case GOTCAN: c = ZCAN; /* **** FALL THRU TO **** */ case ZNAK: case ZCAN: case ERROR: case TIMEOUT: case RCDO: zperr("Got %s", frametypes[c+FTOFFSET]); /* **** FALL THRU TO **** */ default: if (c >= -3 && c <= FRTYPES) vfile("zgethdr: %s %lx", frametypes[c+FTOFFSET], Rxpos); else vfile("zgethdr: %d %lx", c, Rxpos); } return c; } /* Receive a binary style header (type and position) */ int zrbhdr(hdr) register char *hdr; { register int c, n; register unsigned short crc; if ((c = zdlread()) & ~0377) return c; Rxtype = c; crc = updcrc(c, 0); for (n=4; --n >= 0; ++hdr) { if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); *hdr = c; } if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); if ((c = zdlread()) & ~0377) return c; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } #ifdef ZMODEM Protocol = ZMODEM; #endif Zmodem = 1; return Rxtype; } /* Receive a binary style header (type and position) with 32 bit FCS */ int zrbhdr32(hdr) register char *hdr; { register int c, n; register UNSL long crc; if ((c = zdlread()) & ~0377) return c; Rxtype = c; crc = 0xFFFFFFFFL; crc = UPDC32(c, crc); #ifdef DEBUGZ vfile("zrbhdr32 c=%X crc=%lX", c, crc); #endif for (n=4; --n >= 0; ++hdr) { if ((c = zdlread()) & ~0377) return c; crc = UPDC32(c, crc); *hdr = c; #ifdef DEBUGZ vfile("zrbhdr32 c=%X crc=%lX", c, crc); #endif } for (n=4; --n >= 0;) { if ((c = zdlread()) & ~0377) return c; crc = UPDC32(c, crc); #ifdef DEBUGZ vfile("zrbhdr32 c=%X crc=%lX", c, crc); #endif } if (crc != 0xDEBB20E3) { zperr(badcrc); return ERROR; } #ifdef ZMODEM Protocol = ZMODEM; #endif Zmodem = 1; return Rxtype; } /* Receive a hex style header (type and position) */ int zrhhdr(hdr) char *hdr; { register int c; register unsigned short crc; register int n; if ((c = zgethex()) < 0) return c; Rxtype = c; crc = updcrc(c, 0); for (n=4; --n >= 0; ++hdr) { if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); *hdr = c; } if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); if ((c = zgethex()) < 0) return c; crc = updcrc(c, crc); if (crc & 0xFFFF) { zperr(badcrc); return ERROR; } switch ( c = readline(1)) { case 0215: Not8bit = c; /* **** FALL THRU TO **** */ case 015: /* Throw away possible cr/lf */ switch (c = readline(1)) { case 012: Not8bit |= c; } } #ifdef ZMODEM Protocol = ZMODEM; #endif Zmodem = 1; return Rxtype; } /* Send a byte as two hex digits */ void zputhex(c) register int c; { static char digits[] = "0123456789abcdef"; if (Verbose>8) vfile("zputhex: %02X", c); sendline(digits[(c&0xF0)>>4]); sendline(digits[(c)&0xF]); } /* * Send character c with ZMODEM escape sequence encoding. * Escape XON, XOFF. Escape CR following @ (Telenet net escape) */ void zsendline(c) int c; { /* Quick check for non control characters */ if (c & 0140) xsendline(lastsent = c); else { switch (c &= 0377) { case ZDLE: xsendline(ZDLE); xsendline (lastsent = (c ^= 0100)); break; case 015: case 0215: if (!Zctlesc && (lastsent & 0177) != '@') goto sendit; /* **** FALL THRU TO **** */ case 020: case 021: case 023: case 0220: case 0221: case 0223: xsendline(ZDLE); c ^= 0100; sendit: xsendline(lastsent = c); break; default: if (Zctlesc && ! (c & 0140)) { xsendline(ZDLE); c ^= 0100; } xsendline(lastsent = c); } } } /* Decode two lower case hex digits into an 8 bit byte value */ int zgethex() { register int c; c = zgeth1(); if (Verbose>8) vfile("zgethex: %02X", c); return c; } int zgeth1() { register int c, n; if ((c = noxrd7()) < 0) return c; n = c - '0'; if (n > 9) n -= ('a' - ':'); if (n & ~0xF) return ERROR; if ((c = noxrd7()) < 0) return c; c -= '0'; if (c > 9) c -= ('a' - ':'); if (c & ~0xF) return ERROR; c += (n<<4); return c; } /* * Read a byte, checking for ZMODEM escape encoding * including CAN*5 which represents a quick abort */ int zdlread() { register int c; again: /* Quick check for non control characters */ if ((c = readline(Rxtimeout)) & 0140) return c; switch (c) { case ZDLE: break; case 023: case 0223: case 021: case 0221: goto again; default: if (Zctlesc && !(c & 0140)) { goto again; } return c; } again2: if ((c = readline(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(Rxtimeout)) < 0) return c; if (c == CAN && (c = readline(Rxtimeout)) < 0) return c; switch (c) { case CAN: return GOTCAN; case ZCRCE: case ZCRCG: case ZCRCQ: case ZCRCW: return (c | GOTOR); case ZRUB0: return 0177; case ZRUB1: return 0377; case 023: case 0223: case 021: case 0221: goto again2; default: if (Zctlesc && ! (c & 0140)) { goto again2; } if ((c & 0140) == 0100) return (c ^ 0100); break; } if (Verbose>1) zperr("Bad escape sequence %x", c); return ERROR; } /* * Read a character from the modem line with timeout. * Eat parity, XON and XOFF characters. */ int noxrd7() { register int c; for (;;) { if ((c = readline(Rxtimeout)) < 0) return c; switch (c &= 0177) { case XON: case XOFF: continue; default: if (Zctlesc && !(c & 0140)) continue; case '\r': case '\n': case ZDLE: return c; } } } /* Store long integer pos in Txhdr */ void stohdr(pos) long pos; { Txhdr[ZP0] = pos; Txhdr[ZP1] = pos>>8; Txhdr[ZP2] = pos>>16; Txhdr[ZP3] = pos>>24; } /* Recover a long integer from a header */ long rclhdr(hdr) register char *hdr; { register long l; l = (hdr[ZP3] & 0377); l = (l << 8) | (hdr[ZP2] & 0377); l = (l << 8) | (hdr[ZP1] & 0377); l = (l << 8) | (hdr[ZP0] & 0377); return l; } /* End of zm.c */ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* * Z M O D E M . H Manifest constants for ZMODEM * application to application file transfer protocol * 05-23-87 Chuck Forsberg Omen Technology Inc */ #define ZPAD '*' /* 052 Padding character begins frames */ #define ZDLE 030 /* Ctrl-X Zmodem escape - `ala BISYNC DLE */ #define ZDLEE (ZDLE^0100) /* Escaped ZDLE as transmitted */ #define ZBIN 'A' /* Binary frame indicator */ #define ZHEX 'B' /* HEX frame indicator */ #define ZBIN32 'C' /* Binary frame with 32 bit FCS */ /* Frame types (see array "frametypes" in zm.c) */ #define ZRQINIT 0 /* Request receive init */ #define ZRINIT 1 /* Receive init */ #define ZSINIT 2 /* Send init sequence (optional) */ #define ZACK 3 /* ACK to above */ #define ZFILE 4 /* File name from sender */ #define ZSKIP 5 /* To sender: skip this file */ #define ZNAK 6 /* Last packet was garbled */ #define ZABORT 7 /* Abort batch transfers */ #define ZFIN 8 /* Finish session */ #define ZRPOS 9 /* Resume data trans at this position */ #define ZDATA 10 /* Data packet(s) follow */ #define ZEOF 11 /* End of file */ #define ZFERR 12 /* Fatal Read or Write error Detected */ #define ZCRC 13 /* Request for file CRC and response */ #define ZCHALLENGE 14 /* Receiver's Challenge */ #define ZCOMPL 15 /* Request is complete */ #define ZCAN 16 /* Other end canned session with CAN*5 */ #define ZFREECNT 17 /* Request for free bytes on filesystem */ #define ZCOMMAND 18 /* Command from sending program */ #define ZSTDERR 19 /* Output to standard error, data follows */ /* ZDLE sequences */ #define ZCRCE 'h' /* CRC next, frame ends, header packet follows */ #define ZCRCG 'i' /* CRC next, frame continues nonstop */ #define ZCRCQ 'j' /* CRC next, frame continues, ZACK expected */ #define ZCRCW 'k' /* CRC next, ZACK expected, end of frame */ #define ZRUB0 'l' /* Translate to rubout 0177 */ #define ZRUB1 'm' /* Translate to rubout 0377 */ /* zdlread return values (internal) */ /* -1 is general error, -2 is timeout */ #define GOTOR 0400 #define GOTCRCE (ZCRCE|GOTOR) /* ZDLE-ZCRCE received */ #define GOTCRCG (ZCRCG|GOTOR) /* ZDLE-ZCRCG received */ #define GOTCRCQ (ZCRCQ|GOTOR) /* ZDLE-ZCRCQ received */ #define GOTCRCW (ZCRCW|GOTOR) /* ZDLE-ZCRCW received */ #define GOTCAN (GOTOR|030) /* CAN*5 seen */ /* Byte positions within header array */ #define ZF0 3 /* First flags byte */ #define ZF1 2 #define ZF2 1 #define ZF3 0 #define ZP0 0 /* Low order 8 bits of position */ #define ZP1 1 #define ZP2 2 #define ZP3 3 /* High order 8 bits of file position */ /* Bit Masks for ZRINIT flags byte ZF0 */ #define CANFDX 01 /* Rx can send and receive true FDX */ #define CANOVIO 02 /* Rx can receive data during disk I/O */ #define CANBRK 04 /* Rx can send a break signal */ #define CANCRY 010 /* Receiver can decrypt */ #define CANLZW 020 /* Receiver can uncompress */ #define CANFC32 040 /* Receiver can use 32 bit Frame Check */ #define ESCCTL 0100 /* Receiver expects ctl chars to be escaped */ #define ESC8 0200 /* Receiver expects 8th bit to be escaped */ /* Parameters for ZSINIT frame */ #define ZATTNLEN 32 /* Max length of attention string */ /* Bit Masks for ZSINIT flags byte ZF0 */ #define TESCCTL 0100 /* Transmitter expects ctl chars to be escaped */ #define TESC8 0200 /* Transmitter expects 8th bit to be escaped */ /* Parameters for ZFILE frame */ /* Conversion options one of these in ZF0 */ #define ZCBIN 1 /* Binary transfer - inhibit conversion */ #define ZCNL 2 /* Convert NL to local end of line convention */ #define ZCRESUM 3 /* Resume interrupted file transfer */ /* Management include options, one of these ored in ZF1 */ #define ZMSKNOLOC 0200 /* Skip file if not present at rx */ /* Management options, one of these ored in ZF1 */ #define ZMMASK 037 /* Mask for the choices below */ #define ZMNEWL 1 /* Transfer if source newer or longer */ #define ZMCRC 2 /* Transfer if different file CRC or length */ #define ZMAPND 3 /* Append contents to existing file (if any) */ #define ZMCLOB 4 /* Replace existing file */ #define ZMNEW 5 /* Transfer if source newer */ /* Number 5 is alive ... */ #define ZMDIFF 6 /* Transfer if dates or lengths different */ #define ZMPROT 7 /* Protect destination file */ /* Transport options, one of these in ZF2 */ #define ZTLZW 1 /* Lempel-Ziv compression */ #define ZTCRYPT 2 /* Encryption */ #define ZTRLE 3 /* Run Length encoding */ /* Extended options for ZF3, bit encoded */ #define ZXSPARS 64 /* Encoding for sparse file operations */ /* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */ #define ZCACK1 1 /* Acknowledge, then do command */ /* Globals used by ZMODEM functions */ extern Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame received */ extern Rxtype; /* Type of header received */ extern Rxcount; /* Count of data bytes received */ extern Zrwindow; /* RX window size (controls garbage count) */ extern Rxtimeout; /* Tenths of seconds to wait for something */ extern char Rxhdr[4]; /* Received header */ extern char Txhdr[4]; /* Transmitted header */ extern long Rxpos; /* Received file position */ extern long Txpos; /* Transmitted file position */ extern Txfcs32; /* TURE means send binary frames with 32 bit FCS */ extern Crc32t; /* Display flag indicating 32 bit CRC being sent */ extern Crc32; /* Display flag indicating 32 bit CRC being received */ extern Znulls; /* Number of nulls to send at beginning of ZDATA hdr */ extern char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ /* crctab.c */ _PROTOTYPE(long UPDC32 , (int b , long c )); /* rbsb.c */ _PROTOTYPE(void from_cu , (void)); _PROTOTYPE(void cucheck , (void)); _PROTOTYPE(int rdchk , (int f )); _PROTOTYPE(int rdchk , (int f )); _PROTOTYPE(int mode , (int n )); _PROTOTYPE(void sendbrk , (void)); /* zm.c */ _PROTOTYPE(void zsbhdr , (int type , char *hdr )); _PROTOTYPE(void zsbh32 , (char *hdr , int type )); _PROTOTYPE(void zshhdr , (int type , char *hdr )); _PROTOTYPE(void zsdata , (char *buf , int length , int frameend )); _PROTOTYPE(void zsda32 , (char *buf , int length , int frameend )); _PROTOTYPE(int zrdata , (char *buf , int length )); _PROTOTYPE(int zrdat32 , (char *buf , int length )); _PROTOTYPE(int zgethdr , (char *hdr , int eflag )); _PROTOTYPE(int zrbhdr , (char *hdr )); _PROTOTYPE(int zrbhdr32 , (char *hdr )); _PROTOTYPE(int zrhhdr , (char *hdr )); _PROTOTYPE(void zputhex , (int c )); _PROTOTYPE(void zsendline , (int c )); _PROTOTYPE(int zgethex , (void)); _PROTOTYPE(int zgeth1 , (void)); _PROTOTYPE(int zdlread , (void)); _PROTOTYPE(int noxrd7 , (void)); _PROTOTYPE(void stohdr , (long pos )); _PROTOTYPE(long rclhdr , (char *hdr )); /* rz.c sz.c */ void vfile(); _PROTOTYPE(void bibi , (int n )); /* End of ZMODEM.H */ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ in.rld.c������ in.rld.h������ setup.c�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for rlogind. CFLAGS = $(OPT) -D_MINIX LDFLAGS = all: in.rld OBJ= in.rld.o setup.o in.rld: $(OBJ) $(CC) $(LDFLAGS) -o $@ $(OBJ) install -S 4kw $@ install: /usr/bin/in.rld /usr/bin/in.rld: in.rld install -c $? $@ clean: rm -f *.o in.rld core a.out # Dependencies. $(OBJ): in.rld.h �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* in.rld.c */ #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <termios.h> #include <time.h> #include <unistd.h> #include <utmp.h> #include <net/hton.h> #define EXTERN #include "in.rld.h" char pty_str[]= "/dev/ptyXX"; char tty_str[]= "/dev/ttyXX"; char hex_str[16]= "0123456789abcdef"; char PATH_UTMP[] = "/etc/utmp"; /* current logins */ char PATH_WTMP[] = "/usr/adm/wtmp"; /* login/logout history */ char term[64]= "TERM="; #define ENVSIZE (sizeof("TERM=")-1) /* skip null for concatenation. */ int confirmed= 0; char *env[2]; char *args[10]; static void do_child(int tty_fd, char *tty_str); static void dealloc_term(int slot, char *tty_str, int pid); static void wtmp(char *user, char *id, char *line, int pid, int type, int slot); static void setup_term(int fd); static speed_t num2speed(int num); static int do_control(char *buf, int cnt); static void readall(char *buf, int cnt); int main(int argc, char *argv[]) { int error; int i, j= 0; int tty_fd, pty_fd; int login_pid, write_pid; int count, bytes, tmp_count; char *lp= 0, *cp; struct stat struct_stat; int slot; prog_name= argv[0]; /* Check if the remote user is allowed in. */ authenticate(); write(1, "", 1); /* Send the '\0' */ confirmed= 1; /* We try to convince the other side not the do ^S/^Q, the rlogin * protocol indicates the we only send this when XOFF is turned off * but we don't know when this happens so we tell the other side that * it is turned off. */ tcp_urg(1, 1); write(1, "\220", 1); tcp_urg(1, 0); /* Let's look for a pty. */ pty_fd= -1; for (i= 'p'; i <= 'z'; i++) { pty_str[sizeof(pty_str)-3]= i; pty_str[sizeof(pty_str)-2]= '0'; error= stat(pty_str, &struct_stat); if (error == -1) continue; for (j= 0; j < 16; j++) { pty_str[sizeof(pty_str)-2]= hex_str[j]; pty_fd= open(pty_str, O_RDWR); if (pty_fd != -1) break; } if (pty_fd != -1) break; } if (pty_fd == -1) { printf("%s: out of ptys\r\n", prog_name); exit(1); } tty_str[sizeof(pty_str)-3]= i; tty_str[sizeof(pty_str)-2]= hex_str[j]; tty_fd= open(tty_str, O_RDWR); if (tty_fd == -1) { printf("%s: unable to open '%s': %s\r\n", prog_name, tty_str, strerror(errno)); exit(1); } slot= fttyslot(tty_fd); login_pid= fork(); if (login_pid == -1) { printf("%s: unable to fork: %s\r\n", prog_name, strerror(errno)); exit(1); } if (login_pid == 0) { close(pty_fd); wtmp("", "", tty_str, login_pid, LOGIN_PROCESS, slot); do_child(tty_fd, tty_str); } close(tty_fd); write_pid= fork(); if (write_pid == -1) { printf("%s: unable to fork: %s\r\n", prog_name, strerror(errno)); exit(1); } if (write_pid == 0) { dup2(pty_fd, 0); count= 0; for (;;) { if (!count) { count= read(0, line, sizeof(line)); if (count <= 0) break; lp= line; } bytes= write(1, lp, count); if (bytes <= 0 || bytes > count) break; lp += bytes; count -= bytes; } kill(getppid(), SIGKILL); dealloc_term(slot, tty_str, login_pid); _exit(1); } dup2(pty_fd, 1); count= 0; for (;;) { if (!count) { count= read(0, line, sizeof(line)); if (count <= 0) break; lp= line; } tmp_count= count; cp= memchr(lp, 255, count); if (cp) { tmp_count= cp-lp; if (tmp_count == 0) { tmp_count= do_control(lp, count); if (tmp_count) { lp += tmp_count; count -= tmp_count; continue; } } } bytes= write(1, lp, tmp_count); if (bytes <= 0 || bytes > count) break; lp += bytes; count -= bytes; } kill(write_pid, SIGKILL); dealloc_term(slot, tty_str, login_pid); return(0); } static void do_child(int tty_fd, char *tty_str) { int ctty_fd, tst_fd; FILE *tty_file; int sav_errno; char **argp; /* Set up the terminal attributes. */ setup_term(tty_fd); /* Let's start the new session. */ setsid(); ctty_fd= open(tty_str, O_RDWR); if (ctty_fd == -1) { printf("%s(do_child): unable to open '%s': %s\r\n", prog_name, tty_str, strerror(errno)); exit(1); } /* Test if we really got a controlling tty. */ tst_fd= open("/dev/tty", O_RDWR); if (tst_fd == -1) { printf( "%s(do_child): '%s' didn't result in a controlling tty (%s)\r\n", prog_name, tty_str, strerror(errno)); exit(1); } argp= args; *argp++= "login"; *argp++= "-p"; *argp++= "-h"; *argp++= hostname; if (authenticated) *argp++= "-f"; if (lusername[0] != '\0') *argp++= lusername; /* We reached the point of no return. */ close(tst_fd); close(tty_fd); if (ctty_fd != 0) { dup2(ctty_fd, 0); close(ctty_fd); ctty_fd= 0; } dup2(ctty_fd, 1); #if DEBUG fprintf(stderr, "execing login\r\n"); #endif dup2(ctty_fd, 2); execve("/bin/login", args, env); if (errno == ENOENT) execve("/usr/bin/login", args, env); sav_errno= errno; tty_file= fdopen(2, "w"); if (tty_file) { fprintf(tty_file, "%s(do_child): unable to exec login: %s\r\n", prog_name, strerror(sav_errno)); fflush(tty_file); } _exit(1); } static void dealloc_term(int slot, char *tty_str, int pid) { wtmp("", "", tty_str, pid, DEAD_PROCESS, slot); /* Finally we reset the owner and mode of the terminal. */ chown(tty_str, 0, 0); chmod(tty_str, 0666); } static void wtmp( char *user, /* name of user */ char *id, /* inittab ID */ char *line, /* TTY name */ int pid, /* PID of process */ int type, /* TYPE of entry */ int slot) /* slot number in UTMP */ { /* Log an event into the UTMP and WTMP files. */ struct utmp utmp; /* UTMP/WTMP User Accounting */ int fd= -1; int log = 1; /* log in wtmp */ char *p; /* Strip the /dev part of the TTY name. */ p = strrchr(line, '/'); if (p != 0) line= p+1; if (type == DEAD_PROCESS) { /* Don't add a logout entry for just a dying login. */ if ((fd = open(PATH_UTMP, O_RDONLY)) < 0) return; if (lseek(fd, (off_t) slot * sizeof(utmp), SEEK_SET) != -1 && read(fd, (void *) &utmp, sizeof(utmp)) == sizeof(utmp)) { if (utmp.ut_type != INIT_PROCESS && utmp.ut_type != USER_PROCESS) log= 0; } close(fd); } if (type == LOGIN_PROCESS) log= 0; /* and don't log this one */ /* Clear the utmp record. */ memset((void *) &utmp, 0, sizeof(utmp)); /* Enter new values. */ strncpy(utmp.ut_name, user, sizeof(utmp.ut_name)); strncpy(utmp.ut_id, id, sizeof(utmp.ut_id)); strncpy(utmp.ut_line, line, sizeof(utmp.ut_line)); strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host)); utmp.ut_pid = pid; utmp.ut_type = type; utmp.ut_time = time((time_t *)0); if (log) { if ((fd = open(PATH_WTMP, O_WRONLY | O_APPEND)) < 0) return; write(fd, (char *) &utmp, sizeof(struct utmp)); close(fd); } /* write entry to utmp */ if ((fd = open(PATH_UTMP, O_WRONLY)) < 0) return; if (lseek(fd, (off_t) slot * sizeof(utmp), SEEK_SET) != -1) write(fd, (char *) &utmp, sizeof(struct utmp)); close(fd); } void fatal(int fd, char *msg, int err) { int len; char buf[80], *bp; bp= buf; if (!confirmed) *bp++= '\1'; if (err) len= sprintf(bp, "rlogind: %s: %s.\r\n", msg, strerror(err)); else len= sprintf(bp, "rlogind: %s.\r\n", msg); write(fd, buf, bp+len-buf); exit(1); } static void setup_term(int fd) { char *cp, *speed; struct termios tt; speed_t spd; int num; char *check; cp= strchr(term, '/'); if (cp) { tcgetattr(fd, &tt); *cp++= '\0'; speed= cp; cp= strchr(speed, '/'); if (cp) *cp++= '\0'; num= strtol(speed, &check, 0); spd= num2speed(num); if (spd != B0 && check[0] == '\0') { cfsetospeed(&tt, spd); cfsetispeed(&tt, spd); } tcsetattr(fd, TCSANOW, &tt); } env[0]= term; env[1]= 0; } static speed_t num2speed(int num) { static struct { int num; speed_t value; } speed_table[]= { { 0, B0, }, { 50, B50, }, { 75, B75, }, { 110, B110, }, { 134, B134, }, { 150, B150, }, { 200, B200, }, { 300, B300, }, { 600, B600, }, { 1200, B1200, }, { 1800, B1800, }, { 2400, B2400, }, { 4800, B4800, }, { 9600, B9600, }, { 19200, B19200, }, { 38400, B38400, }, { -1, -1 }, }; int i; for (i= 0; speed_table[i].num != -1; i++) { T��T��T������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ if (speed_table[i].num == num) return (speed_table[i].value); } return B0; } static int do_control(char *cp, int cnt) { char buf[20]; struct winsize winsize; if (cnt > sizeof(buf)) cnt= sizeof(buf); memcpy(buf, cp, cnt); /* Let's fetch the first 2 bytes. */ if (cnt < 2) readall(buf+cnt, 2-cnt); if ((unsigned char)buf[1] != 255) return 0; /* Let's fetch the first 4 bytes. */ if (cnt < 4) readall(buf+cnt, 4-cnt); if (buf[2] != 's' || buf[3] != 's') return 0; /* Let's fetch a winsize structure. */ if (cnt < 4 + sizeof(winsize)) readall(buf+cnt, 4 + sizeof(winsize) - cnt); memcpy(&winsize, buf+4, sizeof(winsize)); winsize.ws_row= ntohs(winsize.ws_row); winsize.ws_col= ntohs(winsize.ws_col); winsize.ws_xpixel= ntohs(winsize.ws_xpixel); winsize.ws_ypixel= ntohs(winsize.ws_ypixel); #if DEBUG fprintf(stderr, "setting window size to %d, %d\r\n", winsize.ws_row, winsize.ws_col); #endif ioctl(1, TIOCSWINSZ, &winsize); return 4 + sizeof(winsize); } static void readall(char *buf, int cnt) { int res; while(cnt) { res= read(0, buf, cnt); if (res <= 0) return; buf += cnt; cnt -= res; } } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* in.rld.h */ #define NMAX 30 #ifndef EXTERN #define EXTERN extern #endif EXTERN char *prog_name; EXTERN char hostname[256+1]; EXTERN char line[1024]; EXTERN char lusername[NMAX+1], rusername[NMAX+1]; EXTERN char term[64]; EXTERN int authenticated; /* in.rld.c: */ void fatal(int fd, char *msg, int err); /* setup.c: */ void authenticate(void); int do_rlogin(void); void tcp_urg(int fd, int on); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* setup.c */ #include <sys/types.h> #include <sys/ioctl.h> #include <errno.h> #include <pwd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <net/netlib.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/netdb.h> #include <net/gen/socket.h> #include "in.rld.h" static void getstr(char *buf, int cnt, char *errmsg); void authenticate(void) { int result; struct nwio_tcpconf tcpconf; struct hostent *hostent; /* Let's lookup the hostname for the connection. */ result= ioctl (0, NWIOGTCPCONF, &tcpconf); if (result<0) { fprintf(stderr, "%s: ioctl(NWIOTCPCONF): %s\r\n", prog_name, strerror(errno)); exit(1); } hostent= gethostbyaddr((char *)&tcpconf.nwtc_remaddr, sizeof(tcpconf.nwtc_remaddr), AF_INET); if (!hostent) { printf("Host name for your adress (%s) unknown\r\n", inet_ntoa(tcpconf.nwtc_remaddr)); exit(1); } strncpy(hostname, hostent->h_name, sizeof(hostname)-1); hostname[sizeof(hostname)-1]= '\0'; authenticated = (do_rlogin() == 0); } int do_rlogin(void) { char c; struct passwd *pwd; getstr(&c, 1, "protocol violation"); getstr(rusername, sizeof(rusername), "remuser too long"); getstr(lusername, sizeof(lusername), "locuser too long"); strcpy(term, "TERM="); getstr(term+5, sizeof(term)-5, "Terminal type too long"); #if DEBUG fprintf(stderr, "got lu= %s, ru= %s, te= %s\r\n", lusername, rusername, term); #endif pwd= getpwnam(lusername); if (pwd == NULL) return -1; return(ruserok(hostname, 0, rusername, lusername)); } static void getstr(char *buf, int cnt, char *errmsg) { char c; errno= 0; do { if (read(0, &c, 1) != 1) fatal(1, "read failed", errno); cnt--; if (cnt < 0) fatal(1, errmsg, 0); *buf++= c; } while(c != 0); } void tcp_urg(int fd, int on) { struct nwio_tcpopt tcpopt; tcpopt.nwto_flags= on ? (NWTO_BSD_URG | NWTO_SND_URG) : NWTO_SND_NOTURG; if (ioctl(1, NWIOSTCPOPT, &tcpopt) == -1) { fprintf(stderr, "rlogind: NWIOSTCPOPT failed: %s\r\n", strerror(errno)); } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������..������������ Makefile������ net.c��������� net.h��������� urlget.c����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Makefile for urlget # # 07/02/96 Initial Release Michael Temari, <temari@ix.netcom.com> # CFLAGS= -D_MINIX $(OPT) LDFLAGS=-fnone BINDIR= /usr/bin PROG= urlget LINK1= httpget LINK2= ftpget OBJS= urlget.o net.o all: $(PROG) $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) install -S 4kw $@ clean: rm -f $(PROG) $(OBJS) tar: tar cvf urlget.tar Makefile urlget.c net.c net.h install: $(BINDIR)/$(PROG) $(BINDIR)/$(LINK1) $(BINDIR)/$(LINK2) $(BINDIR)/$(PROG): $(PROG) install -c $? $@ $(BINDIR)/$(LINK1) $(BINDIR)/$(LINK2): $(BINDIR)/$(PROG) install -l $? $@ $(OBJS): net.h �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* net.c Copyright 2000 by Michael Temari All Rights Reserved */ /* 04/05/2000 Michael Temari <Michael@TemWare.Com> */ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <time.h> #include <net/netlib.h> #include <net/hton.h> #include <net/gen/in.h> #include <net/gen/inet.h> #include <net/gen/tcp.h> #include <net/gen/tcp_io.h> #include <net/gen/socket.h> #include <net/gen/netdb.h> #include "net.h" int connect(host, port) char *host; int port; { nwio_tcpconf_t tcpconf; nwio_tcpcl_t tcpcopt; char *tcp_device; int netfd; ipaddr_t nethost; tcpport_t netport; struct hostent *hp; struct servent *sp; char *p; int s; int tries; if((hp = gethostbyname(host)) == (struct hostent *)NULL) { fprintf(stderr, "Unknown host %s!\n", host); return(-1); } else memcpy((char *) &nethost, (char *) hp->h_addr, hp->h_length); netport = htons(port); /* Connect to the host */ if((tcp_device = getenv("TCP_DEVICE")) == NULL) tcp_device = TCP_DEVICE; if((netfd = open(tcp_device, O_RDWR)) < 0) { perror("httpget: opening tcp"); return(-1); } tcpconf.nwtc_flags = NWTC_LP_SEL | NWTC_SET_RA | NWTC_SET_RP; tcpconf.nwtc_remaddr = nethost; tcpconf.nwtc_remport = netport; s = ioctl(netfd, NWIOSTCPCONF, &tcpconf); if(s < 0) { perror("httpget: NWIOSTCPCONF"); close(netfd); return(-1); } s = ioctl(netfd, NWIOGTCPCONF, &tcpconf); if(s < 0) { perror("httpget: NWIOGTCPCONF"); close(netfd); return(-1); } tcpcopt.nwtcl_flags = 0; tries = 0; do { s = ioctl(netfd, NWIOTCPCONN, &tcpcopt); if(s == -1 && errno == EAGAIN) { if(tries++ >= 10) break; sleep(10); } else break; } while(1); if(s < 0) { perror("httpget: NWIOTCPCONN"); close(netfd); return(-1); } return(netfd); } �����������������������������������������������������������������������������������������������������������/* net.h Copyright 2000 by Michael Temari All Rights Reserved */ /* 04/05/2000 Michael Temari <Michael@TemWare.Com> */ _PROTOTYPE(int connect, (char *host, int port)); ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* urlget.c Copyright 2000 by Michael Temari All Rights Reserved */ /* 04/05/2000 Michael Temari <Michael@TemWare.Com> */ #include <sys/types.h> #include <sys/ioctl.h> #include <sys/wait.h> #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <fcntl.h> #include <signal.h> #include <unistd.h> #include <time.h> #include "net.h" _PROTOTYPE(char *unesc, (char *s)); _PROTOTYPE(void encode64, (char **pp, char *s)); _PROTOTYPE(char *auth, (char *user, char *pass)); _PROTOTYPE(int skipit, (char *buf, int len, int *skip)); _PROTOTYPE(int httpget, (char *host, int port, char *user, char *pass, char *path, int headers, int discard, int post)); _PROTOTYPE(void ftppasv, (char *reply)); _PROTOTYPE(int ftpreply, (FILE *fpr)); _PROTOTYPE(int ftpcmd, (FILE *fpw, FILE *fpr, char *cmd, char *arg)); _PROTOTYPE(int ftpget, (char *host, int port, char *user, char *pass, char *path, int type)); _PROTOTYPE(int tcpget, (char *host, int port, char *user, char *pass, char *path)); _PROTOTYPE(int main, (int argc, char *argv[])); char ftpphost[15+1]; unsigned int ftppport; #define SCHEME_HTTP 1 #define SCHEME_FTP 2 #define SCHEME_TCP 3 #define SCHEME_NNTP 4 char buffer[16000]; #if 0 _PROTOTYPE(int strncasecmp, (const char *s1, const char *s2, size_t len)); int strncasecmp(s1, s2, len) const char *s1, *s2; size_t len; { int c1, c2; do { if (len == 0) return 0; len--; } while (c1= toupper(*s1++), c2= toupper(*s2++), c1 == c2 && (c1 & c2)) ; if (c1 & c2) return c1 < c2 ? -1 : 1; return c1 ? 1 : (c2 ? -1 : 0); } #endif char *unesc(s) char *s; { char *p; char *p2; unsigned char c; p = s; p2 = s; while(*p) { if(*p != '%') { *p2++ = *p++; continue; } p++; if(*p == '%') { *p2++ = *p++; continue; } if(*p >= '0' && *p <= '9') c = *p++ - '0'; else if(*p >= 'a' && *p <= 'f') c = *p++ - 'a' + 10; else if(*p >= 'A' && *p <= 'F') c = *p++ - 'A' + 10; else break; if(*p >= '0' && *p <= '9') c = c << 4 | (*p++ - '0'); else if(*p >= 'a' && *p <= 'f') c = c << 4 | (*p++ - 'a') + 10; else if(*p >= 'A' && *p <= 'F') c = c << 4 | (*p++ - 'A') + 10; else break; *p2++ = c; } *p2 = '\0'; return(s); } void encode64(pp, s) char **pp; char *s; { char *p; char c[3]; int i; int len; static char e64[64] = { 'A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z', '0','1','2','3','4','5','6','7','8','9','+','/' }; p = *pp; len = strlen(s); for(i=0; i < len; i += 3) { c[0] = *s++; c[1] = *s++; c[2] = *s++; *p++ = e64[ c[0] >> 2]; *p++ = e64[((c[0] << 4) & 0x30) | ((c[1] >> 4) & 0x0f)]; *p++ = e64[((c[1] << 2) & 0x3c) | ((c[2] >> 6) & 0x03)]; *p++ = e64[ c[2] & 0x3f]; } if(i == len+1) p[-1] = '='; else if(i == len+2) { p[-1] = '='; p[-2] = '='; } *p = '\0'; *pp = p; return; } char *auth(user, pass) char *user; char *pass; { static char a[128]; char up[128]; char *p; strcpy(a, "BASIC "); p = a + 6; sprintf(up, "%s:%s", user, pass); encode64(&p, up); return(a); } int skipit(buf, len, skip) char *buf; int len; int *skip; { static int lf = 0; static int crlf = 0; char *p; p = buf; while(--len >= 0) { if((crlf == 0 || crlf == 2) && *p == '\r') crlf++; else if((crlf == 1 || crlf == 3) && *p == '\n') crlf++; else crlf = 0; if(*p == '\n') lf++; else lf = 0; if(crlf == 4 || lf == 2) { *skip = 0; return(len); } p++; } return(0); } int httpget(host, port, user, pass, path, headers, discard, post) char *host; int port; char *user; char *pass; char *path; int headers; int discard; int post; { int fd; int skip; int s; int s2; char *a; char *qs; int len; if(port == 0) port = 80; fd = connect(host, port); if(fd < 0) { fprintf(stderr, "httpget: Could not connect to %s:%d\n", host, port); return(-1); } if(post) { qs = strrchr(path, '?'); if(qs != (char *)NULL) { *qs++ = '\0'; len = strlen(qs); } else len = 0; } if(post && len > 0) write(fd, "POST ", 5); else write(fd, "GET ", 4); write(fd, path, strlen(path)); write(fd, " HTTP/1.0\r\n", 11); write(fd, "User-Agent: urlget\r\n", 20); write(fd, "Connection: Close\r\n", 19); if(*user) { write(fd, "Authorization: ", 15); a = auth(user, pass); write(fd, a, strlen(a)); write(fd, "\r\n", 2); } if(post && len > 0) { sprintf(buffer, "Content-Length: %u\r\n", len); write(fd, buffer, strlen(buffer)); } write(fd, "Host: ", 6); write(fd, host, strlen(host)); write(fd, "\r\n", 2); write(fd, "\r\n", 2); if(post && len > 0) write(fd, qs, len); skip = 1; while((s = read(fd, buffer, sizeof(buffer))) > 0) { if(skip) { s2 = skipit(buffer, s, &skip); if(headers) write(1, buffer, s - s2); } else s2 = s; if(s2 && !discard) if(write(1, &buffer[s - s2], s2) != s2) { perror("write"); return(-1); } } if(s < 0) { fprintf(stderr, "httpget: Read error\n"); return(-1); } close(fd); return(0); } void ftppasv(reply) char *reply; { char *p; unsigned char n[6]; int i; ftppport = 0; p = reply; while(*p && *p != '(') p++; if(!*p) return; p++; i = 0; while(1) { n[i++] = atoi(p); if(i == 6) break; p = strchr(p, ','); if(p == (char *)NULL) return; p++; } sprintf(ftpphost, "%d.%d.%d.%d", n[0], n[1], n[2], n[3]); ftppport = n[4] * 256 + n[5]; return; } int ftpreply(fpr) FILE *fpr; { static char reply[256]; int s; char code[4]; int ft; do { ft = 1; do { if(fgets(reply, sizeof(reply), fpr) == (char *)NULL) return(-1); if(ft) { ft = 0; strncpy(code, reply, 3); code[3] = '\0'; } } while(strncmp(reply, code, 3) || reply[3] == '-'); s = atoi(code); } while(s < 200 && s != 125 && s != 150); if(s == 227) ftppasv(reply); return(s); } int ftpcmd(fpw, fpr, cmd, arg) FILE *fpw; FILE *fpr; char *cmd; char *arg; { fprintf(fpw, "%s%s%s\r\n", cmd, *arg ? " " : "", arg); fflush(fpw); return(ftpreply(fpr)); } int ftpget(host, port, user, pass, path, type) char *host; int port; char *user; char *pass; char *path; int type; { int fd; int fd2; FILE *fpr; FILE *fpw; int s; int s2; char *p; char *p2; char typec[2]; if(port == 0) port = 21; if(type == '\0') type = 'i'; fd = connect(host, port); if(fd < 0) { fprintf(stderr, "ftpget: Could not connect to %s:%d\n", host, port); return(-1); } fpr = fdopen(fd, "r"); fpw = fdopen(fd, "w"); s = ftpreply(fpr); if(s / 100 != 2) goto error; s = ftpcmd(fpw, fpr, "USER", *user ? user : "ftp"); if(s / 100 == 3) s = ftpcmd(fpw, fpr, "PASS", *pass ? pass : "urlget@"); if(s / 100 != 2) goto error; p = path; if(*p == '/') p++; while((p2 = strchr(p, '/')) != (char *)NULL) { *p2++ = '\0'; s = ftpcmd(fpw, fpr, "CWD", unesc(p)); p = p2; } sprintf(typec, "%c", type == 'd' ? 'A' : type); s = ftpcmd(fpw, fpr, "TYPE", typec); if(s / 100 != 2) goto error; s = ftpcmd(fpw, fpr, "PASV", ""); if(s != 227) goto error; fd2 = connect(ftpphost, ftppport); if(fd2 < 0) goto error; s = ftpcmd(fpw, fpr, type == 'd' ? "NLST" : "RETR", unesc(p)); if(s / 100 != 1) goto error; while((s = read(fd2, buffer, sizeof(buffer))) > 0) { s2 = write(1, buffer, s); if(s2 != s) break; } if(s2 != s && s != 0) s = -1; close(fd2); s = ftpreply(fpr); if(s / 100 == 2) s = 0; error: (void) ftpcmd(fpw, fpr, "QUIT", ""); fclose(fpr); fclose(fpw); close(fd); return(s == 0 ? 0 : -1); } int tcpget(host, port, user, pass, path) char *host; int port; char *user; char *pass; char *path; { int fd; int s; int s2; if(port == 0) { *T��,T��-T��.T��/T���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� fprintf(stderr, "tcpget: No port specified\n"); return(-1); } fd = connect(host, port); if(fd < 0) { fprintf(stderr, "httpget: Could not connect to %s:%d\n", host, port); return(-1); } if(*path == '\/') path++; write(fd, path, strlen(path)); write(fd, "\n", 1); while((s = read(fd, buffer, sizeof(buffer))) > 0) { s2 = write(1, buffer, s); if(s2 != s) break; } close(fd); return(0); } int main(argc, argv) int argc; char *argv[]; { char *prog; char *url; char scheme; char user[64]; char pass[64]; char host[64]; int port; char *path; int type; char *ps; char *p; char *at; int s, c; int opt_h = 0; int opt_d = 0; int opt_p = 0; prog = strrchr(*argv, '/'); if(prog == (char *)NULL) prog = *argv; argv++; argc--; while(argc && argv[0][0] == '-') { char *opt = *argv++ + 1; argc--; if (opt[0] == '-' && opt[1] == 0) break; while (*opt) switch (*opt++) { case 'h': opt_h = -1; break; case 'd': opt_d = -1; break; case 'p': opt_p = -1; break; default: argc = 0; break; } } if(strcmp(prog, "ftpget") == 0) { if(argc < 2 || argc > 4) { fprintf(stderr, "Usage: %s host path [user [pass]]\n", prog); return(-1); } strncpy(host, *argv++, sizeof(host)); port = 21; path = *argv++; if(argc) { strncpy(user, *argv++, sizeof(user)); argc++; } else *user = '\0'; if(argc) { strncpy(pass, *argv++, sizeof(pass)); argc++; } else *pass = '\0'; s = ftpget(host, port, user, path, path, 'i'); return(s); } if(strcmp(prog, "httpget") == 0) { if(argc != 2) { fprintf(stderr, "Usage: %s [-h] [-d] [-p] host path\n", prog); return(-1); } strncpy(host, *argv++, sizeof(host)); port = 80; path = *argv++; s = httpget(host, port, user, path, path, opt_h, opt_d, opt_p); return(s); } if(argc != 1) { usage: fprintf(stderr, "Usage: %s [-h] [-p] url\n", prog); return(-1); } url = *argv++; argc--; if(strncasecmp(url, "http://", 7) == 0) { scheme = SCHEME_HTTP; ps = url + 7; } else if(strncasecmp(url, "ftp://", 6) == 0) { scheme = SCHEME_FTP; ps = url + 6; } else if(strncasecmp(url, "tcp://", 6) == 0) { scheme = SCHEME_TCP; ps = url + 6; } else { fprintf(stderr, "%s: I do not handle this scheme\n", prog); return(-1); } user[0] = '\0'; pass[0] = '\0'; host[0] = '\0'; port = 0; p = ps; while(*p && *p != '/') p++; path = p; c = *path; *path = '\0'; at = strchr(ps, '@'); if(at != (char *)NULL) { *at = '\0'; p = ps; while(*p && *p != ':') p++; if(*p) *p++ = '\0'; strcpy(user, ps); strcpy(pass, p); ps = at + 1; } *path = c; p = ps; while(*p && *p != '/' && *p != ':') p++; strncpy(host, ps, p - ps); host[p - ps] = '\0'; if(*p == ':') { p++; ps = p; while(*p && *p != '/') port = port * 10 + (*p++ - '0'); } if(*p == '/') path = p; else path = "/"; if(scheme == SCHEME_FTP) { p = path; while(*p && *p != ';') p++; if(*p) { *p++ = '\0'; if(strncasecmp(p, "type=", 5) == 0) { p += 5; type = tolower(*p); } } } #if 0 fprintf(stderr, "Host: %s\n", host); fprintf(stderr, "Port: %d\n", port); fprintf(stderr, "User: %s\n", user); fprintf(stderr, "Pass: %s\n", pass); fprintf(stderr, "Path: %s\n", path); fprintf(stderr, "Type: %c\n", type); #endif switch(scheme) { case SCHEME_HTTP: s = httpget(host, port, user, pass, path, opt_h, opt_d, opt_p); break; case SCHEME_FTP: s = ftpget(host, port, user, pass, path, type); break; case SCHEME_TCP: s = tcpget(host, port, user, pass, path); break; } return(s); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ .��������������..������������ 2.0.3net����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������kernel����������������������������������������������������������  ���4�5�������8+������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �UVW}�t�% �ē�5Ɠ��@���&FC֓�%��Ɠ�ē�]U E�؎м9��RSj(jj0��ē�̓����0�f�؎f@��j�} ���������! ! j�|�Yt!$!�������������! ! j�Yt!$!�������������! ! j�Yt!$!�����������k��! ! j�Yt!$!�����������;��! ! j�Yt!$!����������� ��! ! j�Yt!$!�������������! @! j�Yt!$!�������������! ! j�Yt!$!�����������{�� 桰 �j�Yt$�������K�� 桰 �j �Yt$��������� 桰 �j �Yt$���������� 桰 �j �Yt$���������� 桰 �j �Yt$���������� 桰 �j �Yt$�������[��� @桰 �j�Yt$�������+��� 桰 �j�Yt$�������`ffffҎڎ‰�u9��h3��1`(�hU��`(������������UVWffffҎڎ�漨9��1SPQp ��F$=��ta��%���T$@D$@� �ffffaj�O���jH���jA���j:���j6j2j.j*jFj "j >j :j 6j 2j.j ����������69������69��������������69��69��PD$69��D$69��D$ 69��X59��59��59��59��59����%�hT��L��X��������UVW}u��Y�u s��Y�8��u`��YE�=���v���9��WP5�y�� h$������Yh ���Vr+�YYu ����h���VW+�YYu�����h���a���YP'�Y�h ���J���Yƅth���V +�YYu ����"h���V*�YYu�����_^UVW9��>�t.}?�t9uGF?�u >=uF Ft1_^��U VWEē�Uf��UBE̓�Uf�;��UBj�h4�5�h���j�h8+�5�hԓ�!��jj�j�hܓ���jj�j�h����jj�j�h �����E����s@VD�Mj�j Rͼ�P���U�UV@���E������j�jhPh�n����&��'��s"Wʎ���R7GP�� fz�h�_^UVuuu V=��� Uʚ���V^UVuuu V��� Uʒ���V^UVWu}��#U fVU VU VO�v ��fʀ���V��!fVV@V_^UVWU4ռ�VN N щ_^UUf!�UE UVU4ռ;����#U ffF0�UVU ��fV^UEH4�0����% �f(�ڎŽ_^]fˀ=��u%�%�UVWS䡈!P�%!桸(���Ї% �5�5�5�5�5�5�5�5�5�5�؎h* ��fl$L����������ē�t ��0����؎Ї% �̓�%�@����X! �[_^]��������������VW!���؎t$ t$|$ |$$D$���_^����T$)��������T$)f�������T$D$������T$D$f�����W!���T$ |$L$fm_W!���T$ |$L$l_�������V!���ًT$ t$L$fo^V!���ًT$ t$L$n^�����������������������������������L$Ās ! !� 桝ËL$Ās!u!���䡄u 桝���Ý1�����������VW!���t$|$D$= ���rك)&&%���&_^�َ\$D$�'��UVWu} U�#=�ѡ�)9v)=�tf,0��f+=�u_^]UVWu} U�9r6#5�#=�ѡ�)9v�)9v)@���u5t|#5�#=�эF9vG9v) ���u_^]5�=�&f+5�+=�ËD$�"�������UVW1o���W0(��h(��YEtQ(��(��sDVu`#�YYu0) '��EVEUuR<#�YY G_^��UXVWj]V��Y d����s~h4����G9E8���4�W '��E���P���P"�YYyCU؃z�~ UVdᆳދU؋RUUV8� UE����dž������BU}���������U�M �j RQ U U��U UE uE������U UUV|U쉖���UU���U艖���UUU艖���U艖���E�}4�s,E܋U9uUUEU܋MM+JىJEˋE؋V,���u������F4x������ V8V8t tV ��YFt����Vx��YG<�������ǂ��������_^U}�t2uh4����YY} ���tu h0����YYh,���w�YjA��YUVU4�=��u =|?���t@~m�u+Fm=��t �rp5�5�Fp����|������#Vtu���z��t���tFlT������B���ftFl�=��t���� 5�5��5�dž�������^UVW ���U Kr} z��t R���5�����u }t6Utuu V&��� ǃ}ttuu V�� _^UVWu���u} t} �t g��U <�����u J��UU U#���U UU9���w9Ur������9Ur ��Wtt?����U9uu ���URttU����UѺ���#WtuM���z��t Vh9���u6������u���vhgtn���W��Yb���U���~t�uVY��YNtU ������Uu��� U����t ���UU���dž�������1_^UVW}Wt������u���} z��tU 9VhuYu���������vh9���u������U������ftuV���Y1}���u���냀l�t*} z��t} uE�UB���Gl�1BU ���U���t�uW��YOt=��~h�u} z��uS��1_^UV5�t5��<5�t5��*5�t5��5�����^UVu���u5=��t���� 5�5��5�dž�������Y���u/=��t����5�5�dž�������!=��u5�����5�^UVW}���uZWd:ᆳtwhhH���YY5����9u"����9=��������E�b������u15����9u����pe���E�(5�tR9u����C;E�9���t���օu���������E98uE0_^U=��tE� ������������ǂ�������U|?��uu u E|?���U|?��v|?���U|?��uY|?���U|?��u5Y|?���U|?��$|?���UV=|?���u>5�Vp�u �����Fm�vhY5�u^UVW=��kE Ɓ(��}uh����Y|���=��u���uvwhO��YYV>�t �9Vvuh����YY6h����YYw,w0whh|����h���h`���YY_^���UVh?��hz��Y�YY]��h?����YZ��h?��N��YH��h?����Y6��h?��p��Y$��h?��'��Y��h?����Y���h?����Y���h?����Y���h?��u��Y���h?����Y���h?����Y���h?����Y���h?��; ��Y���h?�� ��Yp���h?�� ��Yah?�� ��YRh?�� ��YCh?��Y ��Y4h?����Y%h?��'��Y��?��j�5?��h?��5?���YYaU VW}W�U􃺠���thx��h���5)��Y�� W 4�����thh��h���5)��Y�� V@UuV:����UV@W VhNtftǍ���PY�Ydž�������W���F$����dž�������dž�������dž�������dž�������1_^UVWEUUzRUW Kr |���4�Uj$uj4�/��Euh��h ��5)��X�� Vx�j$Ru V ��YVtUft}�t ~t�uVY1_^UVWEUUzRUW Krh��h.��5)��iX�� 4�Uj$uj4�s��Euh��h4��5)��*X�� Vx�j$uR 1_^UVW}W4����th��hJ��5)��W��  �t jw ��YYWUV8jj�FTP� WV,ftuVuYjw7P�� Et9����jRu5 ���UU |EU�1_^U VWURUUR UU<����th��h{��5)��V�� U4����th��h}��5)��V�� ������������������dž�������~t�uVYh�����Pk�YYVt8T��:T��;T��<T��=T��>T��?T��@T��AT��BT��CT��DT��ET��FT��GT��HT��IT��JT��KT��LT��MT��NT��OT��PT��QT��RT��ST��TT��UT��VT��WT��XT��YT��ZT��[T��\T��]T��^T��_T��`T��aT��bT��cT��dT��eT��fT��gT��hT��iT��jT��kT��lT��mT��nT��oT��pT��qT��rT��sT��tT��uT��vT��wT��xT��yT��zT��{T��|T��}T��~T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������o�����^�������tM9���u������?���UU􋒼���Ut9uuM􋒼������UUҁ���떋Vtt ����P�Ydž�������Ft����dž�������1_^UVW}W4����th��h��5)��U�� V8W1_^UVW}W4����W���W ���W���W��G1_^UVWu~f���VB9=�sh��h��5)��T�� Wvv �� Euh��h��5)��T�� W5�u v2��Y1_^U���VWUR4����th(��h��5)��uT�� Ujrj5� ��Euh��h��5)��>T�� U�jRu }Ǹj@VEP2� E���UUjHWjV! ��Eu ���U�jHuR W䉕t}V,UVUtV}E����U쉕|UxjtjV ��Eu+x�juR tV8UV,1_^UPVW}W4����th4��h;��5)�� S�� jHwjV# ��Eu ���U�jHRu Uu `���UtUV$UЉVUV,UV81<V4UV0UfVfUfVfUfVfUffUj@EPV� 1_^UVuV����th@��ho��5)��)R�� v v5��YY1^UVW}W4�����u Q���th`��h��5)��Q�� ����t%����������u ftuVY1_^U VWuV UVUFE^ ]VUVU~}uVUUWuu4�l��E}uVUUWuu4�?��E}�t}�uWuu 1_^U���VWuVUV UVUVU}~ ���kE Pu6h�� Eu ���kE �PRu@ 19}t���k Uk Uk  URuu�� Euuu�� E܃}�t}�uuuu G1_^UVWu�4�s&VWV 4�VG����~ �u1_^UVuFV vvP4���F1^UVW}W4�������!��~t�uVAYNt f41������t=jwj�VH��Eu ��W�jRu ��jwjV ��Eu ��W�jRu }��Wu ���v d��WWS������tDjwj�V��Eu +��W�juR G������jwjVW��Eu ���W�juR G�������Wu<v ���WU0t}t}t}�t }t}<u y���}4u*#V4 ��#O щN4 UO G����GftuVMYG����1N4���ftuV0YG������G P �1_^UXVWUz4�R UURUURUN��}�t ���t B��}juWEPj��t ��dž������dž�������1��jEPjuWw��t ���}�m���} v ���u܍EPjuW:��t ���EPFYEu ����UUu% �Y���E�Uԋ�UuujV��EЅu8U9Uv)uuu 1 ��E �_^UVWUzr~8jEPjW���׋]3Q��tEP 9��YNj�8��Y1_^UV��sC���t ���u)UjR���P*� u UNhJ1 ���뵸^UVWU4�u ���P�YYuVu ���Pk�YY���Vtu6~t�uVYNt�=�Wtt���z��u���_^UV��z���Vttg?��@���Vh?�����?�� �h?��j�5� th���h��YY���P�Yft ���z^U VWu} }�u1}���UU Ut������9Us������k k ���TxM 9w1,k T|U UUUk Lx )ىMM_^UUuu j4�JUVWUuu j4�)NjUuuj4� ƅtuuVW 1_^UVWu������ U����uU ��� U���u������NjV| WuRFDP��� WuRFLP(��� V0 ��� ��fVfVV<��fVf_^��UVU��h?��hz���YY5?��/0B��?��0B������$P���Ug��N��Gh?����Y:h?����Y-h?�� ��Y 5?��h��YY ���?������Xh?��5?���YYAUVW?��9?�����?�����������g���?��9���6~hW <?���t=?��W ?�� jWYYdž�����������t?��9���} ���?�����u)��J)��u)4B��9�u)������4B��_^U?��?��U0B��?��UEU<���?��?��?��UU<���?��rZ)‰?��U VWURUURUUzU4�����u1���+?��;<���Й?�����t1Wuub��� _^U VWUzRU4�����u1���+?��;<���Й?��h/��uW��� _^UVU4�} �u1 U ?��Љ��� ���UM ?��?����s+����t?��9���} ���?�����^U$ ���?��A�����=)���u EPj��YYU(VW)�����1A��K} ����GE���1A��K}0>�t%����E��� EPR��YYE����G˃}�t)������EPjn��YY)�����U VW=��tja<Y ���PjaNYY=��t5�5�����������������95�t"95�t���� ����0B��0B��?��U9`� u,��YU9?��~ =)��u&4B��9�u=��tj,Y���*)��J)��u)������4B�����_^Uj6jCJYYhM��j@<YYjMj@1YYh0��j�3��YYj�YUj6jC YYj�j@�YYj�j@YYUEP���YEP ���Y9EwUUB����E�����UVW}j�jCYYj@~Yj@tY 9wr W)���w��1_^���Uy��h)��A��YUVux|15xB��8B��^UVWuU���� UxB��U8B��Ep p`��YYE}����UU~o���} m���1���U9Ur1{���U9UsU+U׋Ur2��YYEE} uWuu Wuu{ }t}>V)V~�XMM1_^UU rYu'=xB��t =xB��uU R 4�7Y1U 5�EP^��YYHXB�� \B���8+�PEP7��YYH`B�� dB��jEP��YYHPB�� TB��UhVWU rYEu ��U R �Ur��U z t q��U iB���E�� EE4�EUM9Js}�uh���hd��<YYՋUR+UMQEURU REPC��YYPu�����uEP'��YYUPR�������U z �uR)����U z uR)������U M jrq h)��jei��a��=xB��t=xB��t E��U j4rjugEu ��U�j4Ru E����U΅u>���h�1��fŰh���fUE����E������}�tK}���v ��uujuEu ~��u5h�uC EPh� ���e��h ��Yh�EP ���G��U�j4uR }���uu5h� ���=xB��t=xB��t ���U j rjuEu ���U�j Ru }r ���U zm u@UDMu<E���}�~ MGFU�j uR% HUDM4ʍ}E���}�~,MGFu h)��?��YYU ,��BT��1_^UxB��h���DB��@B��2�� ���1UBUB@���UB �����U$VW�d�sVL��YƤ��h��h��h��8�� h��+��Y�d�s>�tV��YƤ��EPhz����YY}tɋ}siǤ��Ɓƴ����u ����si¤��Ɓƴ�g������s���i¤��Ɓƴ�?���s0���i¤��Ɓƴ�}tEPV*��YY1t ~����juujDw��EPV���YYEPV��YYEPVG��YYEPV��YYEPV!��YYEPV��YYjuujD��q��E��UVWu} ~H�~ E���� E���www \ u E���FADFBG FCWVDWVHV~uU���~J����ujV��YYF���$~�uij�V|��YYj���VV��YV6��Y~H�t7G���tE1҉VLVH EFACuw 7jD��_^UVWu} ~X�~ E���� E���www ; u E_���FPDFQG FRWVTWVXVz��Y~X�tCG���t~\�~F\E1҉V\VX EFPCuw 7jD��_^UVWu} 6E$���:E���1E���(E���E� ��E���� ��G��}�t.uww L Eujw 7jD} �� ��E������Vx�uuR ��~X�~)F`G FaWVdWVhE�� T� �� T$@uV ��YVx�uRu V ��Y`��U�uRu 3V? ��Y:��VV0Y0��V) ��YVV0Y��E����E��U�uRu* L1}u@F>���������PVV,YY������PVV,YY���E�����E��~4����VV4Y�������uuR _�������uRu B�s:u��YE,�s$u$��YEE ��G��uw 7jDm ��_^UVWu} E����uWt-E$G���uG F?E���F@@F@uw 7jD ��_^U VWuU zp���F@HF@~@�[���F?�VL ��YVV0YVVpYh)��FxP �����ǜ���E|B��E���}�~MEEGV ��YU E j�r 0jDd ��_^UVWuU z RUt~H�tFC9uV ��Y1҉VLVHUt~X�tFR9u VV0Y1҉V\VX~d�tFa9uFd�������E jW0jD ��_^UVu����VVYVV(Y~d�tVY��Y>�uV4���YV9VL|(~H�~"FC^BNAvLPSQx ��1҉VLVH^UPVWu����uF����~H�"��V9V��U�UFC���� U}~H����~����V M� ��u3NHGU9u&UVDj@Ru FD@FL@���FL}F��9Vu ���VN E���tNV~tFH����hU9v)U)щMUVDQRu UVDUVL~H�u"FC^BNAvLPSQ.��1҉VLVH_^UVWuE����E����U9U��U  E Vx€tV~ tO~=�t F=��@�����9uF=j^V��YYjV��YYn�����9u Vw��YW�����u�@�� uVx7��Vxt ��� uVx t ���V~������9u"Vq��YV~��WV��YY�����9u=VD��YuV~��WV��YYV~��j V��YY�����9u�0�� u������9u���Vx���tP���9uF>���?��~>�t0���9t Vx���tF>�������9 ��V~@tH���9t ���9u2E������9uE���uV:��YYWV���YY���~ ���uV~������V~u=���}�u1���~&���~jV��YYE���V~ t WVV���YYǺ��!FFf��9Vu ���VF ���tF~ ���uVYE&E_^UVWu} V~u# ��uV~uj VV,YY���~ �u1F<Eʃ y���a���E����j VV,YYE}���V8u~���PVV,YYE����f���j^VV,YYʃ@QVV,YYE���Fp��!8����uj^VV,YYj?VV,YYE���PVV,YYE���� ��t}�~ jVV,YYMEF<U _^UVuF<EV~t u VV,YYEF<^UVWu~ �u1���~���9uǤ�����t1Y���~<�tVQ���Y~N V~t8���U}�~#jVVYYj VLYYjVBYYM׸���_^UVWuF<�~V U}�~&���9uǤ��W���uMԋU9V ^�������@��RVYYj VYYj VYY��9uǤ���PV_YY%��fEU9V _^U VWuEUEUUz8}�������O���1���UJz���}��� F9uuu  1Mmu������!ډUUJzu.U9UK���}MU+UU F9uuu Mu)}G X����F9uuu MM5���!MQ8E+UEE+UE_^UVu~X�n���~d T� tH~d T$@uV��YFa���� VhUVx�j$Ru V!���YFd����Fa^`j�PSjC���^UVWuV~u>V VU~}�~,�����f��9uǤ���Mj�V��YYV~t F���"���V~�u���~F���Vx���u F>��������u jVI���YYVVlY_^U$UUUUUUEPu Q��YYEtuh��YYUVu~?�tF?u PYYV~€u1҉VV VVVV0YF>����^UVu1҉VV VVVVY^UVu���VVF���h)��FxP ���(��WL��VpVlV0V�s V��YD�s V��YV ��Y^UV`�5d�t+U9V ~ V `�F�������V$d�jY^UVW}d�>�t9>uW$6$} �J���$���kÉ_ d�>�tO 9J }6$W$>`�9W } W `�_^UUVW}5u=B���t /������kE *��E=B��d�B��Ut}G|}S 1ۅÉߋUtU ���t 1ǃ=B���t'���=B���u =B���t���t ���1t���=B���t���U r_^U��E=B�� }K0��0��=0��B��u 0��B��B��id���ǀ����`��������UVWid����E=B�����0��0���ǁ=0��B��u 0��B��ѽ B��ֽW��YuW���YƁ���wUjEPu; 뉁��r9 ��w1EE[��Њ0��MjEPu H��ud�JR��Y#��(��ud�BR��Y��������R��Y��_^U VW=B���tA=B���t8}St}Ru,$0��=$0��uj�T��YjjdYYs�����#U1ǃeu YEB��UB������(��W}�tB��B���B�� B��B�� ��W}6uB��B���B�� B��B�����W}�tB��B���B�� B��B�����9=B��}d�B��ֹ���3 ���=B�����9=B��}d�B��ֹ���3 e���=B��T9=B��}d�B��ֹ���3 8���=B��'B�����tE��E��_^U=��t85���h���j`VYYS������d�4B��j`6YY3���UV��NtjdYEttj`Y^UV��Ntj`ɹY=���u^UUBM��W���h4M��j=��YYjpYU塬�*��h���Pu貺 1UVU€t1���kE *��ց��r��vW1h�����\v��U��N׀��Gjh�YY7jh�YY'j h�YY1u8Y�������^UVj`軸YEja谸Yƺ��� Rja辸YYVja贸YYE^U VWujj!蘸YY����I1��k��uhd��{��Y=��u���uGh8��]��Yb]EjdKYM9}ttWY5E־���u h,����Y=��v���m���j�k��Yj�j!ݷYYj�h���ϷYYu�(��j5�PѸ u���j 5�P诸 h ��Y�(0��jhr��P芸 h ��ڹY_^UPVWuVtUVXU��~>� ��}@vE@���FR���� VTUU�uRu }UVTUV\VX+UVX= ���rUB)U B��9Jsz PrGPu���YY0GU J ��][ @QMA @Yf ZE@MuVXUt ~>�&u��Y~X�u!FR^QNPv\PSQF\����_^UVWu~tu W ���YYW��Y_^UVuF)J��u VT��YYG��V��Y ��6��NyNx VB��VVz��Y��JzuF����B��J9Vu j�V���YYFV>��Y���F����V+��Y������VV9B��s$+B��VB��J9Vu j�V���YYFV��Y���V��YF)o���B��9Vr)B��J9Vu j�VS���YYFF����V��Y~ PuV��YU  N ��F F V@f BF t��E 2��^UVWuVL��Y�C��+B��׃} ����=B���tV B��WRQ M=B���u2�C��VB��9VwB��VWvR VVB��V#�VV#�Uw���=B���tB��VWRv蛵 P=B���u5B��V9Vs'V+�C��UB��WRvc UVV+B��#�VVUV$,0��5B��uj�д 95D��u vj ��YYV���Y_^UVWuU~ �~)v vF@P艴 F ����UNJ8UB<~�yF����B��9VvV~�yF����B��9VrJVVB��V~9~t95D��u Wje��YY~_^UVu���F*�V@V,F,V,����V09V,w*M N*F)���E PV���YYy���F)�p���E ����E =0���|&E =9���V@9V,sDV,k ] 0É1} ;uV@9V,s#F,E PV���YYF)��9��^UVWuVY~*�u3!~�u jV YYNV[YO��E =M���t?��~*[5��V0U��}�u���ENjV)VVY��}�u���E~VY��}�u���E~VY��}�u���ENjV)VVY��V0JVV4JVVY��V+V+�C��ډUVU>V+VUVU-�C��UVUE����VU ��E��V$,0��uuj�ɱ ��B��+VUVUAVUV+VU0B��UV+VUE����VU ��Ed��V$,0��uuj�V ��}���B��+V9s B��+V׋VB��VUB��UUB��+V)B��URuuA V$,0��B��Ruj�ʰ ��}���B��+V9s B��+V׋VB��VUB��UUB��+V)B��URuu走 V$,0��B��MMRQj�: ~��}���B��+V9s B��+V׋VUUB��+V)URuu@ V$,0��Wuj�ү ��}���B��+V9s B��+V׋VUUB��+V)URuuد V$,0��UUWRj�f ��V0UU9V,��V@9U��~(�/���p��#V ���#N  Ѻ���#V ʉV �����V$V F(���N ������=B����u f �����f �����N ������F(���'u%���1u(���=B�������|?%:40����#N щN 40����#N$ щN$U(|P/K(40�� ��#N щN (40�� ��#N$ щN$E8 ����~(�t%�p��#V ���#N  Ѻ���#V ʉV EjE L����F)�_^U̬u5B��YYU  B��APQYYUBR5B��YYU B��APQݫYY膬U$=B���x���h���jC赫YYj3jB誫YYjjB蟫YY8jaqY ���Pja胫YY,B�����E���EE���E_��EPjK��YYU߫jaY%Pja*YYB������ɫUVW}-���E900����i]���ށC��>wtWYG(S��G,T��GlCd��U�jRhJ��ȫ U�jRhc��诫 U�jRh��薫 U�jRh��} UB��UB��UB��=��t UB���B��=B����uE� ���@��E�� �����=��t ����1=��B��uh�h�輧 ���B��B���C���15�C��00��=���~ 00�����=00��~ B�������1500��EEFEFVVV���V$V ,0�����5�C��vj�脪 j�8��YW��Y_^U}�t} uj YuhC��YY hC��YU]���1=B���B��t����Ph����YYU%���B�����j����Y���(C��$C��UVWE����00��9Ud���iE���ƁC��V9VvA�+�C��׋V+V9sV+V׋V)5�C��Rv© V)VVYE5d����Y_^UVux<9500��~45d�i���C��D��pj cYYD��rjQYY^U=B����u��� ���0��=��u7hT0��*���Yh� ��h�� �uN hp0�� ���Y˧1UVWu���FPPYYBFPRYYO_^UVu��#B��f�����#B��f���B����f���B��B����f���^���UV=��t������Pj VYY}�tP������Pj!:YYjj!/YYjj!$YYjj!YY=��t������Ph���YY}�tp���p���Ph���إYYjh���ʥYYjh���輥YYjh���讥YYj h@��j 辦 1}|�e��F^U1UVux| Vh ��輪YYU 9|�t:<|�e��t Vh��薪YYVYU |���� �^��UVWu~tF>W9t*蕥W@W~>�t W⿈W膥N>O�t�X��G�W��Y���+WU`��+WU9U}UUU9VX}VXU}����~>����FR���� VTU�WuRub EPEP`��Pw`��PV}�{���F<誤UWW��Y訤UWW`��9WrG�UVTUV\VX+UVX~X� FR^QNPv\PSQ F\����~X�~*����u!FR^QNPjPSQ1҉V\VX_^U VUrt���+VUn���E���E VEPEP`��Pv`��Pu}�t2襣UVV��Y裣UVV`��9VrF�^UURtUBUVWuU���NUJ|t���1FE����E0��}1��sEU���9u URUE؃}����1UJ|@tUJ|u}��|UJ|  謢h���v<YYuv,YYURv0YYWv<֡YYvH謡Y^ Ã@^UJ~���t~t VVE_^UVW}-���Ei]`��l�_tމ>V`V VU0��UV$UV(UV,���UV0���UV4���UV8���UV<���UV@���UVD���UVHj v@YYF�VYj�v4͠YYvD裠Yv(蚠YvH葠Y^ Ã@^`��V VUt������EE��� U9Uu+���jj�EPjhD ��hL ��F��0 ����Utm��=m��PuYYuؠYjv4 YYGk��G( f��G,g��Gak��G0k��GlKh��G4l��Gpm��j v@ɟYYF_^UVUrtPF����VV j v@號YYF>^UVUrtVވVF����VV ^UVWUrtJ|uDVUVV؟U€tjuYYUǂ����������Vׅx���`��+V U9}}}Wv u DžtOgV)V~�u~���}j v@覞YYFKV V `��9V uV`V {_^UVuV VvD@Y tV|��Y^UVWUrtv<YǺ@��� Rv<+YYh��.YWv<YY_^UURtUUJ| tUj r@YYUVl�"V���YV��YVe��YV��Yv8莝YT �������^UV"�"V7���YV��YV��YV���Yv8FY| �������^UVWuv(#YFu8V9u V⿈V$F@uV@VvDY tV*��Y~���X���F~���u~�tj v@ٜYYF�VF`��9VuV`V~u���`�����_^UVuvDjYFLFLtFPFLtFTFLtFXFLtF\^UVuvH,Y%���=���uVʀ���V���`�����vHY^ u VV$FuVVvDțY tV���Y^UVuVpf���V Pv$趛YYF `��9V u `��V NuV!V���`�����~���u���`�����^UVW1h ��T��Y51���?������'��G(��V|U􋖈���U������+U���U샾����uvhh� ����YY���h ��ٹ��YYU ������1U ���P1U ���P1P������vtv8v,h ��z��$Vtt���j��YPh ��X��YY4Vtt���G��YPh ��5��YY~t�u h ��!��Y���Ph ����YY����u� h ����Y51��_^U VW1h ��ʸ��Y5 1�������������G���������+������U ������1P���������������������v|vx���Pvhh` ��,��4���[�uğ� hT ����Y5 1��_^U}z��u ��U�����UVW4�����1����U1҉UUhj�EPRh,1��h$1��t���Bhj�EPRh,1��h$1��Q���U}ׁ���U�9}}" E+U MQUR4�FV_^UVW} E����uKYƅuj�-��h8 ��V��YYuj��h4 ��V��YYuj���E���> uF>�uu���?����>,t >:T���?,t?:uEG9uF= ���}؉E ���(E���E���E����  ��鶿��uEPVI�� E9ut*uU9UL9E9E|]E���1u/YPuh ��͵�� h���j� YX_^Uuu uh< ��袵��h���j�YYUuuuu uhd ��s��h���j�賛YYU0VWu���EPhz��"��YYUЉUU܉U}p���}�f���uPh ���� 뻍EPVVYYPEPVVYYBEPVV YY4EPV���YY$EPV-��YY ��E��VED���UU؉}܍EPuZ��YY7UV,+�D���D��h�%��-���؉=���s,+�,+�5h�^UVWu ~�y ���vvv # Eu c���UvRYu K���~u ������EVUVUUjEPvuv RDžu V+U_^UVWu ~>�y VUZ���@v@���URv6m Eu6h ��蘙YY�D�Euuu@ ED�UvRYu2UWuvvv RE>�xuuu E_^U�� ���Jh'��U"1U ��B��U1UU h41��EP���豻��EPYU$E�����RhUUUU UEPj��YYU(VW} d@tdt ���UwRYƅu ���jww Eu |���U�Ud@u3juu赓 EPV���ۺ��EPFP���ɺ��2NU؉M܋VN UMUEPRYjuu` 1_^���UlVWUu RYDž��j�w wo�� ��h���w7蕶�� Eh���w w�� EEEPj�u u��uIN��E pKEP ��YE <���E EE JUUU€���U  ��EԹ��Uu RYDž���E����}���UM΋V VU9VvUUU9UvUU9VsVU9VvVUh���vEP譵�� PW���2��U+Vh���REP艵�� PGP��� ��}u;~uUU jRub ~t~uUU vRu��� E_^UlVW���E EE J׋U€���UE����EPuu u������EP}��YE����1���M΀~t~u VU���~�v���UuRYEu���UUVh���REPZ�� Pu���ݷ��h���v EP8�� UPR���跷��E���EtGNUU_^U��RhUU U,+�UE���Uu RYtUjEPuj uR}�tEPh ��ۭ��YY1A,+���Uu,+���t1,+�j@¾��Ru�� ���UVW���uU09vI~�tV9Vv6~�t0VEP���衶��FPV���蒶��EPFP���耶��O_^��UVF�G�sFdFhhb��jlYYj蟎Yh1��Y^UVu5G�!G�=G�r1���kG�hF�G����G�G�J}VG�JT1��G� G�G�Zh���SEP�� G�P R���{��|p|G�p(щ G�G�^U0���G�1��1��UG�����h��h���sYYU���VW}G�UUUG�r r��YYEԋU���� |E��t ��E����}���1}U9Us UrEU9Ur1��U9UsU+U֋G�h���ur2tP��p0腰�� E��t ;��G�€d���} t �� ��s ���G�|���j PR薌 =G��u �����։W}�~���G�ыE1UBG�MZYYG�ыE115G�UBUUU9UsE�����EE����}E15G�U؋EUЋURU��t ��}�t;Uع���щM؋MЉLm���E���E���G�9Ut 9uuE떃=G��t��V��G�9G�tDEG�JMEjEP{��YYG�BPh�� YYG�G���EUz u}� ��sB ����19u��Uz u}�u��t}��E}�u3U G�9J rB ����UR TUE8�u E@ ̓}�u%} uE|h���5h�Rn }�uu ���Yu ��YE}�u%} uE|h���R5h�( }�t*}~ E}u X���}uUB�1 ���u9wv7W)Wb+W֋WG����u1 M1_^Ujj ~YYj�j sYY}uJ���F���Pj WYY5h�jHYYh�Rj5YYh�Rh���YYh��jYYjjYYjj YYU,V G����։#G�U G�G� G�Rh��豇YYG�G�}�u$G�hd��BP;YYEPjg��YY^UG�9G�t%G� Rh��NYYG�G�UG�����U0V5G�~�u��t ���V9u1���EV G�UҋVUjEP-��YYt �����t m���jM��YN��EuG���� u G�9Vt4G�€thd��jYYEPj>��YYVF 1^UVW5G�~�u �� G����G�u ��G�€tVEMV G�U G�M G�M G�M G�MjEP��YY}���I��}u������EV G�UVUVU���V UEG�UG�JMEj EP��YYt �����t ������Et���G�tPh@ ����YY���G�t z���G� G� taG�€t1RG�+VG�G�+VG�G�J+V ׃t G�JV 1_^UVW1EPqYh��Y���!ǁ���u(}Hh��YBShG�VZYZ���u j评Y1(EP)Y=��rG����j舄Y_^UG�����jJY1Uhˉ��jxIYYG����} �~EES���YM =G��t1U=G��uMEPsYh��Y%���=���tEPjY=��rG����uh��YYU V5G�EG�UjEP3YYt e�����tUjVYWEF }�uG���� u =G��tG����F1^U(VG�����j�j�YY߂G�����G�����j�h��YYj h��YY躂EPj��YY=G�t1}jYF1} khƀF��FG�����^U$EPj胦��YYU$G����hˉ��jx>YYEPjj��YY=G�t=G�uG����1U=G�uG����j؆YU VW5G�~�u ��� G����G�u ���EJV G�UjEP5YYtT!tDdDžt5G�t%G� G� t G�V 1_^UVWU rYu ��|���#G�փp|1t5Jփ| ���G�J5G�AY1���G�€t ���G�zdt8 G����G�t1���G�BP~���Yu1n���1��1��sR֋G����Jt1VC���YuG�JW!ыG�J1=G�t릋G�Bd_^UG�MJUBG�URFYG�J M,+�UE���jEPuj j'}�tj�5G�h1�� 1UG�MZYUB���U G�J���U��RhM� ���h1��YU(VWU�Ujuhu��e U܉U~E���1G����9}e���uA���F���EU�jRP UMjuQ~ U܉V UމVUVUV(ʠ���V$F,���}��p��FGƄ��T_^UVU r���Yu ���5M�>�u7��t.��Phd ��?��YYt ������J���~0�uBt U Rt+ ��Etk�N�jPh1�� F01^UVu}9����N�i�N���G�M�T4N�L���@s=����N�i�N���G�M�Ä���ډN�1N�^UHVW5M�V$UEEP��Y(��h���5h�v| 1(},+����1D 6D=G,+� ,+�YJ ˉ^,+� ,+�YJ ˉ^,+� ,+�Y J ˉ^ VVV U,+�BctG}���v>N$@,+� ,+�YyJx ˋ,+�Jz ً,+�Z{ ˉ]~ ����VV VVV V~ ������kFFV V EEP��YuBh���5h�vz 1(},+����1D 6D=GE����0~ �u ���V VVVVV VVV Uh���uEP �� PF<P���莢�����t���t s���r���Ph ����YY tEPh ����YYv vvhx ����=�N�}������Fh$��v8YYvjzY1_^U0����N�1��1��U V5M�t��t ���o���V(UV UV M� Q$UEEP ��Yt=u1E�E�E�M�R$UEEP��Yt1^ULVW}5M�UUN�r r.��YYEVV UU���� UM�tuWuu u6����E��t ��E����}�}��E����}U9UsURŨEE��t U��U9Ur1F��UU9Us U+UŰN�h���ur2EP��p0f�� EU9V,wV,Űut ��V(U݋U UދV$@t,UUߋUUUUU V$UJ���E1uE؋E1uN 1EԋN E1UЃUߋU؈UUUU V$U} u0��� ���EEP4��YE}����}����} u< ��Et0M����M�h���5h�rv ���jj7��YYu E���} uU M�h���Rquv (U M�h���Rqv ��Eu5m���E������W���W�M}�}t E}M����� M�����1_^UVW}M�Urj�h���C��YYuPh ��舔��YY���GPFPbuYYj�h�����YYuPh ��J��YY���h+��h��YYUzr���1P��PuYYPFPtYYGPFPtYYGPFPtYYGPFPtYYGPFPtYYM����WM�RFPtYY1_^UVG�M�s&Ƅ��^UU rYu/M�R0 M�Q0M�z0�u t��1UVu]Yƅu`��M�����^UV5M�O~,���v F,���F,���5M�"Ph ��ƒ�� 'M�����5M�=yY ��M�'��^UVh��艚YM���JjQcsYYjiYM���Jj�QCsYYjIYj�h������YYuPh ��#��YY(G�M�sM�R9Vu&Ƅ��1^U$M�z�tM���tEPj覗��YYj�h���[���YYUVM�¡u10M�t M����JQOrYt M����^UEPpYM����JQ rYM�#E9E u���EPUY= {��ru1UM����JQqYM�5M�twY���UVW}5M�t/h���v@v<K�� ���1GG@���G ���V WVWVW_^Uh���h� �EP�� M�P<R���虙��1UUTVWM�UUUUN�r r膕��YYE؋U���� U1҉UU}���}���N�ur2EP��HUMh���uuB�� Eh���uu?�� E1҉׉UԋUUU9Us'URUԋUUȹ���1u}ԃEхt}ԋU Ut ��U9Ur1��UU9Us U+UUԋUUȁ�����1EЋ]uVt ��E(E�UUUUUUU܈UUUUЈUE�E�E�iE���PEP_��YYE$����E ��}}�tBt>u9v���v���M�V5h�rFo U)Uȉ)븃}�~���v���u9vU9rsrEU M�VRqn uU)Uԉ)׋E0E����UR)MQUz�uEME���x���v���M�V5h�rn )Ƀ}�cE}VM����� M�����1_^U(VW} 5M����Vv$RmYYj�h���YYu>Ph ����YY���h+��h��nYY��v�����Vj�RmYY���Vj�RmYY���Vj�RxmYY���NPQbmYY���NPQImYY���M����NRQ-mYYjh���YYuhx ����Y# M�����Uj RvIm 1_^UVWM�UU���JQlYEU���JQlYƋU���JQplY ƋU���JQYlYEM�tT���#M����#M щM!1*# ��E鋔�� M����_^���Uh1��YUVu}9���S�iS�d��N�S�TS�I���@s:���S�iS�d��N�S�dډS�11��9S�}S�1^U0���S�2��2��U@VW}S�UUUS�r r聏��YYE܋UMRQU؋U���� UE��t j��E����}�W��1}U9Us'UJ���v u��� UrE��t ��U9Ur1��U9UsU+U֋S�h���ur2EPW��p0ʎ�� E}�~���} N���E����}9us?WUU9v+UUh�UEMuRQj UUE뼋Uz�����} uC���B�������S���S����1��f��S�%��f�S�S�� ��fS�h�1��fS�h���fS�US�S��������E1u؉EȋUJE1UċE1u؋MI1E�} u������� ����h�1��f�h���f�UȈ����#U UĈ�U����S��h ��jY�tE};���} N���E����}9us?WUU9v+UUEU h�MuRQh UUEu9wv7W)W+W֋WG����u1 M1_^U=2���u���2�����U r;Yu6S�R ���ыS�K ukS�jPh1�� 1UU rYuS�R  S�Q 1UVW19=1�� ��kPY5S�������h ��hY�u �1��=���~ 1�����9=1�����BV�?V���� � ANNM��Af�U����=��t h ��@hY�����U�����������H�����S����1��f��S�%��f�fS��h ��gY�u F���S�U=S��tE~�tuPh���� vv6Ph��Ӄ��h���uEPw�� PFP�����G_^US�MQS�MRQS�MRQ��U��RhV�h2��YUVu }9���V�iV�T��S�|V�TV�I��� s:���V�iV�T��S�|V�TډV�1V�9V�}V�1^U0���V�:2��42��U=<2���u���<2�����U rYu4|V����ы|V� ukV�jPh2�� 1UU rYu|V� |V�1UVWj5h�hu��c ,+� V�~ V����h��j&YYjYcY195V����kP<Yjh ��V��� tPh��h��YY5V����V� V� υuGjh ��j~��� tPh����YYV�����U�<��#V� V�WNPh���� h���WEP蒆�� |V�P R�����F_^UVW} U V�V�������� RP��Y1}94V�h5��saYY bah5��-aYEtaFaj�B��Y��� 9V�t��� R��Yj���YO19u~8ah5��`YEuah5��`YV�vaFú��� R��Y1_^U8VW}UUV�r r��YYE؋U���� UE��t ��E����}���1}U9Us9UJ���v u%���Ur��t ��E뿋U9Ur1��U9UsU+U֋V�h���ur2EP��p0]�� E܃}�~���h�Uԃ} K���E����}9us<WUU9v+UUUUEMuRQy` UUEh��� _Y ���Ph���/_YYVuuu ���Eh���^Y%?Ph���^YY}�tE}���} K���E����}9us<WUU9v+UUEUMMuRQ_ UUEu9wv7W)W+W֋WG����u1 M1_^U VWV�փ}uF��F�� V�U V���#U V�U V���� R���Y1}94V�h5��]YYz^e^h5��]YEt^^GT^j����Y ��� 9V�t��� RT���Yj����Y@uuu��� jk���Y��� R���Y���#V�~1_^UVu]h5��\YEPt]Vh5��\YY]1^U$}�t������Ph5��\YYEPj詁��YYj�h5��\YY}�t���V�Rj\YYUh5��c\YV�5V�bY���U]���V�RjO\YY ���V�Rj:\YYu j.\YYU Rj\YYU Rj\YY@���V�Rj[YYUJRj[YYUJRj[YYp���V�Rj[YY}uD���L���Pj[YY���V�Rj[YY=\U|V�h���rr �� ���1UBUB@���UB �����U��Rhc� ���h2��YU VW1k���kPf���Yc�UI��ljujj�EPjh2��WUM E����jj�EPjh2��WEUBF_^UVu(}@c��������i`��V�c����PYщ c����������sC���c��������i`��V�c�`���PYʉc�K@s=@���t������c�i`��V�c�,c�1c�^U塨c�x�� 2��c�-V�`��0���2��2��UV=c��u��u ���U rYu ���5c����Et���Fy���U Rj���t���~ �d���-V�`��kjPh2�� @~ �t9U BF^1ɃuAFF|����F 1^UVW5c���Džt#FtPh��hw��YYF���Fu-��Džt��c�FFu jjX��YYj�j�M��YYE���^F���a�a�U^h��~Yjj��YYt.��Phl��v��YY��Ph\��v��YY���UJ UZ S��X��}=PhH��Uv��YY�����E��FuM��t ���c�hc� ~0��c�@2��P;Ph8��u��FuI9<��t>9��t.)�Ph��u��YYF��~��1_^U,+�Ujj��YYE=a�uB=a��t2}tUJuc�B%c�B1U VWj8j�5,+�{�� j8j.��YYtOc�=,+�E8���}�~ MGF=c��uh��hc�{��YYc�t1_^UVW5c�E���,+�U=c��t R��~uF ���FX���h���jr��YYt ��F%FUBt^F~uF ���F��a��a�%j5h���YYu9u��Y���EUR��YWuPh��s��Ph��s��YY���vWPh��ns�� L~WuEP y�� PFP���|���vЉF^F1_^U VW5c�=,+�=c�t=c�t h��jj ��YYt O��GP��YEGP��YEPuPh<��r��Ft~�t VUUfF��fF��F ����F$����F����U9UuFUVUV(F%F�F���F(����}�uEFh���j@��YYt ���F%FGt^FW|HGP��YPGPPh��q��G P��YP~�t����Pq��YYF ���F1_^U@VW}5c�UUc�r rv��YYE̋U���� UȋU a�a����}���Fuqt q��E����}U9U���URUEU9Ur1=��UU9Us U+UUc�ur2EPu��Ha� a�NE1uv5a�5a�v�� r���uWuu u����NE1t ��F=���u ��} u%~�t1w��m��Fp��Ly��a�����c� b�}U9U��EUURU}���UUU܋UUa�9Us U+a�UUa�9Vs V+a�U=a��t$U9UuUUԋc�uԃR��YYYc�9c�;��=a��tU3U#��c�u܃R��YYUUR5c�z��YYc�UUU؋Ua�UU+UUU9a���a�9V��Ev5a�5a�t�� E=�� �sE ��a�} u ������a�uha���YYNa�1a�K ��a�} u*���(���a�uha���YYNa�1Pha�_��YYj�j� ��YYE��}t} ua�Ja�!��}u7a�a�R��YPPh��|m�� E�������� ��a�} u ������a�N a�Na�1Pha���YYj�j� ��YYE���u@_���VV+a�ډa�} uUufF��4FfF�U€t"Na�1؉F$~�uF$F U t%~�u ���a�+Va�fF��}u3} u����PPh��Gl�� E����fF��F=���u���fF��~�uF$Na�1F$1} u@FF��Fu��a�Ua�9WvW+a�Wa�+Wa�WG����=a��u1 M1_^U,VWuc�Uc�r rp��YYEU���� U܃} t u��a����E}�X��VUU9Ur1E��UU9Us U+UUc�ur2EPo��Ha� a�Ur5a�5a�Gp�� E9Es���[��a��a�(uha�2��YYjha���YYUr5h�H��YYEt#}ua�Ja�s���UUUr5a�5a�o�� EUR+U9}s}U h�MWRQK }>V)V~�M1_^UVU rYu ���5c�V V ~t1���F�~�t?F=���t4jj��YYtPh@��Ni��YYfF��F$����F =c�u7jjU��YYt`Ph(��i��YYfF��F$����F ����1^UVW} w3Yu ��5c�Sd� u0~ v ��jj��YYt ��1��WucYY����F\��q��M@:��,+�UjEP5c�ww iitLU��~�t3F=���t(jj?��YYt +��F$����F F�F���E��?q��j�j���YYt ��F%Fv���jj��YYc�����j�j��YYt ��jj��YYt ��j�j��YYtp��E��p��fF��F$����F ����G��F=���u 4����a��a�UUE=���u]E=���u UJUuha�O ��YYE=���t E=���u1���a�j�j�|��YYE���t ��U@t6E=���t E=���ufF�F$����F ���� d��U€V��fF�FE=���uF$����F 1��F$V V ��E=���t E=���uUV$ F$����UV E=���uEZ��a��a�jha�, ��YYa�j�j�v��YYt ��F fF����F=���u ��}�y s��}�u1f����a��a�uha� ��YYj�j���YYt +��fF��F$����UV F� ��F=���u ��l��a��a�h�ha�; ��YYa�j�j���YYEF$����F �}�t}t ��V +VV }�tfF����j�j~��YYt j��fF��F$����F ����E= ���u}�uF�F������h���j-��YYt ��UJ} ��U�UB�UBE= ���u UMJUB�E= ���uUu R ��YYj j���YYt ���E= ���u FUVF%Fl���d���Z���E��l��Mu:Vu fF��F����jww FP5c�dt 1_^UVWu 1d���a��Ua�3a�4a�*&Vha���YYa� ��Ek��W5h�N���YY_^Ua�a�����fa���Ua� a�����a�����fa���U,VWc�Uc�%���Z Èa�=a�j���=a� u������a� ˆa�� b�Ec�- b�E =c�0u#a��h b�z��YEh b�l��YE u ha���YYuha���YYc�c�BjR/BYY=c��uEPjg��YYc��=a��g���=a�u�����Pa�P.Ph��`��Uzu UfB�a�a�jj�R;g�� ���-��=a����a�ցa�V}1҈V V =a�u~puV) ���"=a�u������jj�Vf�� ���!Ѻ�����tda�PSPh��`�� =a�ta�Ph��_��YY*���!F PF P4h2��FPh��_��Uzu%UfB�UfBFP��YUB���t1_^UV19u~,5c�3@YuE E c�BSR7@YYF19u~?5c��@Yu���c�R?Ytڋc�BR?YUEF뼺���c�R?Ytj 5c�?YY=c��t 5c�s@Y^U4VWE0��h��j�EPj�h2��h2��~=���u1��Uc�E���jjEPjh2��h2��DUUE���j@jEPjh2��h2��UUE����h���j�EPjh2��h2��UUh���5c�>YYEPfY5c�>YE%���=0���t'EPeY=��ruh��]��YY1��EEPjEPjE EPjEPjUۉc�D|>E(EPjEPj}�t E)E�M׈Mj�j�EPj���=c�0u���=c�D���������h���h���=YYjh���=YY���h���h���=YYjh���=YY���h���h���=YYjh���=YYt���j j r=YYj�j g=YY\h��e\��Y1��<��Ee�����C���< ���5 ���. ���' ��� h��\��Y1D��d��Ee��ha��VrYY5c�V=Ya�j�ha�e��YYa��a��a��h b�@s@���kZУc�c���a�Phc���YYc��EE�c�PEP���YYj�j�EPjEUUj�j�EPjEUUj�j�EPjE UUj�j�EPjEEE�E�Ej�j�EPjb���_^U���c�R;Yt1 j 5c�;YY5c�(AY���UU MUM JUU MU MQUM JUVWu} VVV_^UU Z ˁ��UU Z ˋUJ ىUVuN V N щ^UVWc�JRMUh���@uu^�� y @��� ��� ���?���h���uu^�� ։1UBUzUr_^U8VW��Rh2��E����h��j�EPj�h��h����#Uf0+�0+� 0+���� ف��f Xi�EPhz��^��YYEЅ1��uh��>YY��j�j�EP�� jj�EP�� j�EP/��YYjEP ��YY돍EP��Y냍EP ��YtEP ��YeE����c�}O~to���Fp���uh��h���52��7 ~x|hx��h���52�� <i��t i�����VE��YV ��YWS9YE؁Ɣ��ouh`��=YY4��E`��U VWh��]W��Y1c���~t�uWh��;W��YY~tu Whl��&W��YY~t\��WhL��W��YYvxh8���W��YYv|h$��V��YY���h��V��YY���h��V��YY���h��V��YY���h��V��YY���h��V��YY���h��V��YY���h��sV��YY���h��aV��YY���hp��OV��YY���h\��=V��YY���hH��+V��YY���h4��V��YY���h ��V��YY���h ��U��YY���V(R6YE���V(vpR6YPuh��U��GƔ��]_^U$V1}&iƔ��dd�uE���uEP%��YF^UVW}WUWU}�x}|uh��;YYiE��Ɓc�W `��~tu4} �th��h5��52��T Npj�j�V!�� ��~tth��h:��52�� Fp���uh��h;��52�� Vpth���h\��:YYV`UkE |D�t?} �th���h<��:YYWd��P ���]��Npj�j�V �� ��Vpth��hI��52��v }�n���D��P}~���EPww R!��U��W ��W��D��P��P#���]����P ��YE5WD��WH��dž�����W ��dž������WU}<| }��~uh��9YYkE TLuRj�D��PV��kE DD���U9VduTkE ���V(tLR4YYU���N(RQ3YYU���N(PQ3YYjv(3YY kE UTHEV\9UuE����}|h��hv��52�� UV`Np} �uLj�j�V�� ~tth��h��52��諜 Fp���uh��h��52��芜 _^U VW}WUWU}�x}|uhT��Z8YYiE��Ɓc�W `��~tuj�j�Vf�� L��~tth8��h��52�� Fp���uh��h��52�� Vpth���h��7YY} �n������P}~���EPww ��U8��W <��W@�����P��P#���gZ����PZ��YE5W���W���dž8�����W <��dž@������UU}��}uh�� 7YYNpV ��Y��#Vp��uV7��Yj�j�V�� _^U8VWURUx}|!E���EEPu��YY��iE��Ɓc�h��FPhW��YYVE~t�u;V��Y~t�u!E���EEPu"��YY`��~tuV���Y~tp���jh��F!P>W�� UV&Va��YE���URUE���UU̍~!E���}�~MȊGÜEEPu��YY���~tth��h��52��蓙 Fp���uhl��h��52��r fp?URtNp��URtNp���URtNp���E`��V(��YE���URUE���UU̍~!E���}�~MȊGÜEEPu��YY_^UURptjj�u�� UVW}WUx}|uh��4YYiE��Ɓc�W `��~tu&FxPj@ww ��j�j�V�� ���~tth��h4��52��) Fp���uh��h5��52�� ���V(R.Y������V(Rn.Y������V(RY.Y���FxPj@ww ��j�j�V�� _^UVWUzx| Wh ��3YYiǔ��Ɓc�~tt?~tth��hQ��52��Q Fp���tj!v(-YYVVYFp����_^UVWuFp����VV YVn��Yj!v(-YY���V(j�R-YY���V(v<R-YY���V(v@Ru-YY���V(v<Rb-YY ���V(j RP-YY ���V(j�R>-YY~0�t���V(j)R&-YY���V(j(R-YY ���V(j�R�-YY ���V(j�R,YY���V(h���R,YYj`v(,YY���V(F!PR,YY���V(F"PR,YY���V(F#PR,YY���V(F$PRy,YY���V(F%PRd,YY���V(F&PRO,YY���V(h���R:,YY ���V(h���R%,YY ���V(h���R,YY ���V(h���R+YY ���V(h���R+YY ���V(h���R+YY���V(h���R+YY���V(h���R+YYV<B���N(RQ+YYj v(+YYE����Vp@tMFp���tMVp€tM ���V(uRG+YY ���V(R+Y���V(R+Y���V(R*Y���V(j?R+YYj"v(*YYNp���19~\~k DD����GF`����Fd����~�u dž��Y��dž��}��dž����D~0�t dž����dž����dž����dž��M��dž��q��dž����h��v݄YYv+Y_^UVE-c����3��EPeP��YYh\��EPO��YY1}<UL2!Mh���j�EPVh3��EPݑ=���u UMT1!F뿅t tj�j�EPj�hX��EP襑^UVW}j�w()YY1Wp@tGp���tWp€t ���W(VR^)YY_^UVWuj!v(F)YY ���V(j�R4)YY ���V(j�R")YY1���}���V(R(YuG ���V(jR(YYj"v((YY ���V(jR(YY1���}���V(R(Y@uG���V(R(Y%���V(PR(YY1҉VdV`19~\~k DD����GV��Yfp_^U VWuFp���uh���h��-YY���V(R (YE?�����V(uR (YYU r��t F|������V(R'YEt���Uu���Ut���Ut���Ut���U t ������ wFPh��}F��YYU@t ������ wFPh��UF��YYU€t���~dk |D�uFPh��)F��YYk DD����G9~\u1~dk |D�t[k THUk ���V(tLR&YYU���N(RQ&YYU���N(PQ&YYjv(&YYVptV��YUtVptV���YUtFxU t? ���V(R3&Y������V(R&Y������V(R &Y���Ut!���Vpth`�� E��YV7���YU@t�U€Np�����#Vp��uVpY_^U VWuE�������V(R%Y@E9F@uV<Uj@v(%YY���V(RY%YEj�v(k%YYU9U��EPjj�uV��EPjjuV��UM уMU׃}<r }��vuFPh��D�� }���9~<w9~@wFPhx��C��YY}���Xi�M9u^= 3���tI 3������fXi�f0+�0+� 0+���� QFPhT��{C�� ���U���EtFPh(��XC��YY���}3Et-Fp���t$uuV�� EuKE������9~<uV@J���N(RQ#YYJ���N(RQ#YY}}�;_^UVuVptTfp>j�jd��P: 9jjd��P% $h��h��(YY��h��K��^UVW}U UUth��h*��52��芌 19uv#UMQlRAhPv$YYf_^UVWuUUU UU ���N(PQ"YYU ���N(RQ"YYU���N(PQ"YYU ���N(RQ"YYj v("YY19}vv,T"YUG_^UVWuUUU UU ���N(PQ6"YYU ���N(RQ"YYU���N(PQ"YYU ���N(RQ!YYj v(!YYUth��hb��52�� m19}vv,!Y%��UfzG_^UVWuVpu ���UJ���ЙE E9F@e���V@+U ׍���P��P#���I��U Wj���PRV��U)N<RW���PQV�� U uj����PRV��U\��Npfp1_^UVWUMJM1}����| u ��Y1U 9���h ��h��52��ɉ U M9Lw +LMF뫋U T+U9}s}U M WQ���L@ Euh���h��t%YYWuu+! U)U}}D}�th��h��52��. _^UVW}���W(j@RYYU ���O(PQYYU ���O(RQYYU���O(PQsYYU ���O(RQ\YYjw(PYY1}����| u 4��Y1U 9���h��h��52��d U M9Lw +LMF뫋U T+UU9UsUUU M uQ���> Euh���hl�� $YYuuw, U+UUUU;}�th`��h��52�� 1d}���W(R4Y@uFduh���h8��#YY_^UVW���UUU�UE����U���J(j@QYYUM ���Y(PSYYUM ���Y(RSYYUM���Y(PSYYUM ���Y(RSYYUjr(YY1}�^��| u c��Y1U 9���h��h$��52��蓆 U M9Lw +LMF뫋U T+U9}s}U M WQ���= Euh���h��>"YY}�tA���UjRu UEPr,YYMEOEE����!Ut0Uuur, U+UUUU+U׋UUth��hK��52��萅 juuL MEOEE���}�th��hT��52��L }�tUEPr,YY1d}U���J(QY@uFduh���h��!YY_^UVWUM JM1}����| uu��Y1U9���h0��h}��52��襄 UM9Lw +LMF뫋UT+U9}s}UM WQ���(; Euh���h��P YYWuu U)U}}D}�th ��h��52�� _^UVW}UM ���Y(PSYYUM ���Y(RSrYYU M���Y(PSXYYU M ���Y(RS>YYUj r(/YY1}����| W��Y19���hl��h��52��H M9Lw +LMF믉T+UU9UsUUM uQ���9 Euh���hT��YYUuur, U+UUUU>}�thH��h��52��袂 _^UVW���UUU�UE����UM ���Y(PSYYUM ���Y(RSYYU M���Y(PSYYU M ���Y(RSYYUj r(YYE����}�s��}|u��YE����ދUM9���h��h��52��证 UUM9JwUU+JME듋UUR+U9usuUM]VS���8 Džuh���h��DYY}�t+���UjWR MENGE����!Ut+UuWr, U+UUUU+U}th��h��52��豀 Ur,?Y%��fEjWuZ MENGE���}�th��h��52��\ _^UVu���h��h%��52��0 ������������V���~������P��������^U}�x}|h��h9��52�� Ui����52��Y1UVuFt����-c���E2��EPV���YY~t}���V ��Yu2V��Yu'Vk��Yu6FPh��4�� Ft����@~�tvFlPFhP ~�uF��Fp����h$3��FxP���=��^UVWu }Gt���UGt����0Gt���'h��j�EPj�hd3��v :}4��=��U��� VUjj�EPjhd3��v }UWVUh�j�EPjhd3��v |UWE����h���h� ��EPjhd3��v |UW4_^UVW11U9���~ | uY1ULFՉ_^U,VWu1VptVptE���-c���E䋖`��UU  U\��U#7EEP`��8��YYE=u}�u#}�yuhL��5YYdž\������fp_^UEu 08��YYth���hd��YYUVuu u3 ƅuh���h��YY�UuRV~ ^UVuu u`3 ƅuh���h��YY�UuVR9 ^���UVW} Urt��Ft E���� ��~ �t E��� E��www 2 u E��FDFG FWVWV V��YuHY~ ���G���tE1҉VV n��EFC^��Ft EL��~�t E:��� E(��www 2 u E��FDFG FWVWVuNGY~����G���t ~ �~F E1҉V V���FCE���~�t1E^Ft���E����Ft F�^���F ���FjuPYYAF9G u1҉VV F9G u1҉V VEE ��GM9��uw 7jD1P_^UVWu~tGt0~X�:��FR^QNPjPSQO1҉V\VX�����+W$U􍗰���+W(U9U}UUU9VX}VXU}����~>����FR���� VTU�W(uRu0 EPEP���Pw(G0PVL}�n���F<UW$UW(W(���9W(rG(W���YUVTUV\VX+UVX~X�FR^QNPv\PSQNF\����W��Y_^U VUrt���+V$U^���E���E V(EPEP���Pv(F0PuL}�t%UV$UV(V(���9V(rF(V���Y^UVWu���+V,9~$}~$9~ }~ d���F���� VU�V,WuR V$)V$V,V,���9V,uV0V,~~V )V y_^UVu~�~"F^NvPSQM1҉VV ^U VW}wtFt1H����GC_BOAwLPSQRM1҉WLWH}���~�s���F���� VUU�jRu jEPWD t/FF NuF^Nv PSQLF ����_^UVUrtFi���~ �~!F^Nj�PSQL1҉VV ~�~!F^NjPSQjL1҉V VFtF�F ���F^UVUrt~�~&VV F^NRPSQL1҉V V^UVUrtF$����V(V,^UVWu-D���Ei]���\i�^t߉7W0W,W(F��F(Y��F,��FB��F0{��Fp��_^���UVu~�u1������R Y ���PR YZк ���PR YZк ���PR YZк ���PR YZк ���PR YZк���PRs YZк���PRa YZЉE<t1F ��F|�F�������^U4VWu~tth ��jH5l3��t Fp���th ��jI5l3��ht ���R YF! ���R YF" ���R YF# ���R YF$ ���R YF% ���R YF&���V(F0����1V��Yt V��Yu*V��YtV4��YtV��Yt���tF0������R YE%���E@���#UU~4�|���}}BF4� �����t F4�@��[������O������R Yt=F4���4���t}�t����@��F4}�t���� ��F4 ���t0h���6 YY���!uM���h���Re YY7���t/���t���h���R? YY���jaR, YY ������j@6 YY���RYE ������PRYY ���RYE؋V N @ %��� Ⱥ ���PRYY#Uܹ���RQYY$h���6YYV ?@R6uYY���q��� ���e������R.YE���RYE%`������#U ‰Up3��UF���tV��� U���RQYY ���������RYE ������PRYY ���RYEԺ#Uܹ���RQYY@���#U ���#M щM3��UF���tV���R=YE ������PRFYYfvv6���t���1PFPh ��!&��F8����� ��F4E̅ E��� }~E���ỦV\E����U9U}kEk] DLEkEF<���F4F@_^UVu~0�t���jARYYh���6zYYj�6oYY^UVu���R6Y ���PR'YZ9t1������R Y ���PRYZ9t1w������RY ���PRYZ9t1Q���RY ���PRYZ9t1+���RY���PRYZ9t1���^UVu���j5RYY���RRY=5���t1/���j:RWYY���R(Y=:���t1���^UVWu���RYǺ���1���RQYY���RY9u4���RYE}t}'t })t}+u���1���WRYY���_^UE���RpY%���1ۅÉUE���RIYEU1ۃ+uC�UVWuV(F0����~0�����RYEj*+Y���uR YYj+Yj!v(YYE����}���}���V(RYuEv(Y%!���=!���t1O�� ���V(j RYY ���V(j�RYY~0�t���V(j)RvYY���V(j(RbYY~0�tE�@��E��' �E� ��E?���h3��uV׃ ���h3��uV׃ ���h3��uV׃ ���h3��uV׃ o���h3��uV׃ Y���h3��uV׃ tGh3��uV׃ t5h3��uV׃ t#F����F �F �F������ F0&1_^U VWu���V(h���R?YY ���V(jR-YY ���V(j�RYYU ���N(PQYYU  ���N(RQYYjv(YY1}U���PQYYG1d}���V(RY@uGdu1��� ���V(jRYY ���V(j�RrYYU ���N(PQ[YYU  ���N(RQDYYj v(8YY1}���RYD=GjuEP &�� 1ۅÉ]_^U VWu���V(h���R�YY ���V(jR�YY ���V(j�R�YYU ���N(PQ�YYU  ���N(RQ�YYjv(}�YY1}U���PQn�YY1d}���V(R"�Y@uGdu1��� ���V(jR�YY ���V(j�R �YYU ���N(PQYYU  ���N(RQYYj v(YY1}���RY%��fD=juEP$�� 1ۅÉ]_^U VWu~0�t ���V(j RjYY ���V(jRVYY ���V(j�RDYY���V(j�R2YY ���V(j�R YYj v(YY1}2~0�t���RYED>!���RYD>!Gɺ���V,~0�tF4�@��F8@���F4� ��F8 ���� ��F4E E��� }~E���UV\19}~kF8k DLGkF8F<���F4F8F@fv6~0�t������PFPh!��+��_^UE���RYEj%YE���uRYY���UVWu��RYE �����PRYY1RzYD>!G��uRYY��h���RnYYV(V,F����j!6TYY���j�RCYYh���65YY���RY%���1ۅÉ^0j!6 YYV4+V8� ��ЙE E��� }~E���UV\19}~k ���k DLGk ���F<F@@������v<RYY��v@RYY ��h���RwYY ��h���RcYY ��j�RRYYfVU uE���}|}~uh "��yYYM�����RQYY��jRYY ��j RYY ��j�RYY��jIRYYVV8Rv6FPh"����_^UE��h���RYYUVWuVt1���Ǻ��R6YEu1/����RYEu1��UJUu UJUt1������ ��RQYYj"Y��WRYYj!Y��� ��RQYY6Y=���u*���RY=`���u���RsY=���t1l�����WRvYYUt� �� �UP t�@��1ZЉFF8� ��F4� ��V+V8VV8V4F D �F����_^U��Rh3��h3��cYU0���T�3��3��UU r���Yu f���X�:�u 5X���YX�z�t<X�H�����ыX�H��ukT�jPh3��(g 1UU r+���YuX�H�� X�H��1U} }>���ET�iT���n�X�EL��\�1X�z�t1\�UXVWUUU}�W��E����UUU9UsURUE\�r r��YYEԋUU9Uw1 ��UU9Us U+UU\�r2��YYEX�M9Jw ��UU X�9Qs ��19}e���u5X� ��YYEuE U9Uu?X� X�<��E<��1Y)щM9MsU)U؋UU}E����UUtU9zw+JσEE}�w���U UX�R UUUUUUUċUUX�EPr��YYEthP"��h5��53��K` Uz�u1������EỦ}ЋU UX�R UUUUUỦUE���X�EPr��YYEthH"��hF��53��_ }�t!uU֋)}1_^UX� X�<��B1UBUB@���X�<�� MQUdVWu���F���EPF PFP5T� ��]��V[��YtPh #����YY;��h���j�V�� E ��}��Uu U��tpPh#��f��YY��G PG P��YYEtGP:Ph"��0�� ��dž4�� ���GPGP��YYEu)dž4�� ���G'PG&PG%PG$P��EUUUGPGPG��YYEFGPGP/��YYED��WUVVG/PG.PG-PG,P��EW UGPGP��YYEuG#PG"PG!PG P��Eu}�u���EX1F UU<��VD��V4�� u~ ��v dž4�����+V<��1���E9F vF 4�� E����UUȋUUU:\t:/uEUUU:�t:\t:/u EE��EލEPuuV��E̅��4��EPEP��YYEEPEPEPEP��EȋU:�t%ERuPh"���� n��EtuPh"���� M��EPEPEPEP?��F<��(��i(�����9Fv(��≖(��E����Mк���9(��vEMк���9(��t(��5Ph|"��+�� ���UЉ8��(��,��E����E����U9VvM,��uUЉAMЍN$]ȉ}�uPhX"����YYSuV��YYEȋ<��Udž0������V$@��F����vEP��YYPT��P�����_^U$VE���UR U3��UE���UEPr(��YYƅthP#��h��53��_Z utVPh4#���� 1^U<VWU U؋U ��!׋U���vh|#��h2��53��Y 1s7i��U9�u#i��U9�ui��8����Fċ53��3��=3��u 3������i��ǀ�����i���EE���E ���UR UU U3��UUĉUE���UEPr��YYE̅tht#��hI��53��Y }�tuPhX#���� 1+i��U�i��U؉�i��8�_^UU M с��UU M U M щU$VWu jj EP�� 1>�t+>.t&}aw  T=L=GFЀ>.uFjj EPe�� 1>�t&}aw  T=L=GFՃ}����E����UM9D��w��Jh���Qu ƅu n��1���}UM9D��vUjEPuA�� u2UjEPR(�� uj Rur�� 1��E  E����E����uu��YYEUUh���Ru ƅu ���1���W���UjEPu�� u2UjEPR~�� uj Ru�� 1^���E  띁E���UM9<��[uu5���YYEE����}�:u Ph#��� �� _^UVW���kE UBjPu ƅu1���FPP8YYNjU u ��������U MQjRu ƅu1{���FPPYYV���UM JjQuU ƅu1@FPFPFPPU#��4����U9z v1_^UUM <��JU VWu,��ҋ} !׋,��#0��U9}u U 90��v"8��U0��UN$@��0��<��9U rC<��0��@��V_YY@��@���uh#��h��53��uT 묋U +0��9<��wh#��h��53��JT @��VYYE +0��_^U VWEP!YDžu uPh$�� �� Z��j:V��YY1ۅÉ]\����E}�y$ ���U'��PW��YYtE:F}�uWBPh$��8 �� ���}�tOj�EPVd �� E=���rWPh`$���� ���9utU::tE����uF}�uWPhD$���� e���V��Y=���vWPh$$���� <Vh`���YYUE UEE�`�W\Ph$��R�� 1_^�Uh3��RYU}}8���E�k�d`��ET�1=�}�1U0����!4��4��U$VW}�UUU�r r ��YYEU���� U܃}���1}U9Us'UJ�@��v u�@�� UrEыUU9Uw1k��U9UsU+U֋�r2w ��YYE} N���E����}9us?WUU9v+UUh�UEMuRQ UUE뼋EU9����!f��BU��#J f ���#U��f�U��f�h ��Y�t8�P~��YPuEPh$����E�E��UE�!} u@���?����U��#J f ���!f����h�1��f�h���f�h ��Y�u �9tE����E0} N���E����}9us?WUU9v+UUEU h�MuRQ UUEu9wv7W)Wj+W֋WG����u1 M1_^UVWU roYu G��5�~���PYDžu#PPh%��`�� ���!f��0h ��Y�}HPhx%����YY��F�!f�"=����1��f����f�h ��+Y�tc�uWF��!f�@=����1��f����f�h ��Y�t-�P��YPWJPh\%�������V �!f�B��#V f�f���f���h ��=Y�t6�P��YPWPh4%����v ��Y8��� � щv v��YY9tE~�t%���%��P6WiPh%��=��6EP��YYPFP���j ���!���%���-A���=���s:u%���-@����h ��DY=��t�? ?/u /u� � Vk�jPh3��JP F~�u*U RtVV~�u v ~���Y1_^UU rYu,�R �Q�z�u r -���Y1UV`��s~�t v ���Yd^U�!�>��#Uf�h ��$YUVW$4��d4��sU9uFAo4�� ���E10OE1EuWhj4����YYd4��_^U�r r��YY�J1UBUB@����R MQ���U<VW} EE�ƅ��%t V7YߋEE�E���-uE����EE�E ���0uE0���EE�E����*uW׋RUEE�/0 s%kE 0‰UEE�-0���= ���rE.`���EE�=*���uW׋RUEE�60 s,E����kE 0‰UEE�-0���= ���rE܄4��E����E ���E���ltLuE����EE�ƅ����}�u W׋BW׋BEԅyEԉE2E���Ep4��E���}�u W׋BW׋BEЍUωU�E1uUPM؋UY E1uEЅu9UĉU؍W׋M؋RE���<UĉU%E���*W׋RUE����UU:�t U9U}EU+UU}�yM}0u}�yj-w5Y}u}�~ub5YM} u}�yj-I5Y}�~EES35YM}�0u5YMj%5YV5YL&����j�4Y1_^�UVuj j�V��� ^�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 04��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+4��"���}�t}�y��� UU_^�����������������D$T$T$T$ �P���1Q+Q QQQ +QQQ����ÉqA����A���D$|$�t���D$T$@������1ҋD$t$ D$t$ Y���L$D$d$ QUSE] ���![]USE] ���![]USE] ���![]UVWu} Mr6 u.uAfA(_^]�UVW}u M���������������UW}E Mr/���u'���uĉ fE_]�������������UW}���0))ϊE tu1_]XG_]����������������������UVW��E_^]������������������L$ k���������UVWM��E_^]��������U} v4�����M ���E 1U} v4�����M ���ҋE!1UE�����1UE��1U} v4�����M ���Et���1��UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ5��tPXP�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������oR��mca�at��bus�processor���vga�ega�video��� ��� %d� Kernel panic: %s���stack overrun by task���exception in system code����process number %d, pc = 0x%04x:0x%08x �� %s ���� Intel-reserved exception %d ���got spurious NMI ���Coprocessor error���Page fault��General protection��Stack exception�Segment not present�Invalid TSS�Copressor segment overrun���Double fault����Coprocessor not available���Invalid opcode��Bounds check����Overflow����Breakpoint��Nonmaskable interrupt���Debug exception�Divide error����system.c��������������������������&��8��n����������J��\������������isemptyp(rpc)���isuserp(rpp)����src_phys != 0���dst_phys != 0���isokprocn(k)����isuserp(rp)�<noname>����isuserp(rc)�isuserp(rp)�isuserp(rp)�src_phys != 0���len <= mon_parmsize�src_phys != 0���isuserp(rp)�isuserp(rp)�isuserp(proc_addr(m_ptr->PR))���isuserp(rp)�overflow in count in do_copy����,'�� ���!%��,'��@%��%��%��%��:&��~&��&��,'��'��(�����Sx'��S@'��can't inform MM�,��������,��,��,��,��,��,��clock task got bad message��G8�����m5��m k7��m4 6��m@4��m@5��m @k7��Not enough memory for RAM disk��z:���������i:��z:��z:��:��%:��6:��G:��X:��Executing in 32-bit protected mode ����0.3�2���Minix %s.%s Copyright 2001 Prentice-Hall, Inc. ���<�����T<��T$<�� T� <��T�@<�� T@<��T@<��T@<��T@<��T@<��T@<�� T$@<�� T$@<�� T$@<��k�F<��=��������=��=��=��[>��������>��>��5>��H>��>�����T>��T$=�� T� 7=��T�@>�� T@t>��T@>��T@=��T@>��T@>��T@>�� T$@=�� T$@7=�� T$@7=��k�F>��F����� ���E�� ��E�� ��E��H��������H��KH��H��XH��H��H��QH��tty_reply failed, status ���P����� ��O����#P����PP�����oO�����O�����O�����}P��R�������Q����Q����Q����Q����Q����Q����R��delay;boot������Rebooting ��Hit ESC to reboot, F-keys for debug dumps ��System Halted ��V�� �������V�����CU�����TU�� ���U�� ���vU�� ���U�� ���U�� ���U����� V��X�����M���X��[���X��WY��������X��X��Z���������bZ��{Z��Z��[���������Z��Z��Z��]���������]��]��]��]��]��]��]��]��^�� ���@���f\��A���Y��B���Y��C���Z��D���"Z��H���HZ��J���Z��K���[��L���J[��M���[��P���\��m���:]��Hard����Soft����%sware scrolling enabled. ��attempt to register second irq handler for irq��invalid call to put_irq_handler�j��������j��j��x:d:x:x�DPETH0��}m���������Zm��}m��Qm��}m��Hm��}m��cm��m���������m��m��m��m��m��m��m��--more-- ���%s � �S:%-5.5s����%-7.7s�� %5lx %6lx %2x %7lu %7lu %5uK %5uK %5uK ����%5d�(%3d)��� --pid --pc- ---sp- flag -user --sys-- -text- -data- -size- -recv- command �--more-- ���%3d %-6.6s %4x %4x %4x %4x %4x %4x %4x %4x %4x %5uK ���� PROC NAME- -----TEXT----- -----DATA----- ----STACK----- -SIZE- ����ANY�Ht�����c���s��d���s��o���s��x���s��Bad environment setting: '%s = %s' �on��off�panic at %s(%d): assertion "%s" failed �panic at %s(%d): compare (%d) %s (%d) failed ���ku��������t��Ku��Ku��=u��!u��/u��[u��[u��%s: got message from %d ����bad I/O vector by���w��������w��ww��~w��y���������ky��qy��y��%s: can't read partition table �%s: diskette is write protected. ���%s: probe failed ���%ux%ux%u ���%.40s ��%s: ����%s: drive not ready ����%s: controller not ready ���P����������� ���7��0���7��%s: timeout on command %02x ����%s: reset failed, drive busy ���before=%u, nbytes=%u, count=%u �block=%lu, before=%u, nbytes=%u, nblocks=%u ����%s: timeout (BSY|DRQ -> DRQ) ���%s: drive not ready ���������� ���۞������מ����������������ACD: Phase Unknown �ACD: Phase Data In %d ��ACD: Phase Data Out %d �ACD: Phase Command Out �ACD: Phase Command Aborted �ACD: Phase Command Complete ����S=%02x E=%02x L=%04x I=%02x ����%s: %d cylinders, %d heads, %d sectors per track ���%s: %lu sectors ����%s: %lu sectors ����%s: unable to get dma channel ��%s: unable to get parameters ���COMM����JUKEBOX�OPTICAL�SCANNER�CDROM���WORM����CPU�PRINTER�TAPE����DISK����SENSE RESERVED��MISCOMPARE��VOLUME OVERFLOW�EQUAL���ABORTED COMMAND�COPY ABORTED����VENDOR UNIQUE ERROR�BLANK CHECK�DATA PROTECT����UNIT ATTENTION��ILLEGAL REQUEST�HARDWARE ERROR��MEDIUM ERROR����NOT READY���RECOVERED ERROR�NO SENSE INFO���dtt������������L���������������������@����M����f���:��f����������.����������k���������K��[��k��k��K��K��k��K��%s: unsupported ����UNKNOWN�%s: %-7s %.48s �%s: hardware error �%s: not ready ��%s: no media loaded ����%s: offline ����(unknown)���%s: can't handle %lu byte blocks ���%s: unknown capacity ���%s: capacity %lu x %lu bytes ���variable ���%lu ����%s: density 0x%02x, nblocks %lu, block len �%s: limits: min block len %u, max block len %lu ����,���������W����,��,��W��W��,��W��J�����������ɼ��J��J������J����write���read����%s: soft %s error (recovered) ��%s: soft read error at block %lu (recovered) ���%s: failed to rewind ���%s: failed to add filemark ����������b��������b��b����b������� ���������������������������������Q����~���������� ����� �� �� �� ������������G������������������{������������������������������{������{����������{����sense key 0x%02x (%s), additional 0x%02x%02x ���target status 0x%02x ���%s: error on command 0x%02x, ������� (Selection timeout)����%s: host adapter error 0x%02x%s �������������� �����@���]�����9���������������������������� �����@�����aha0: strange IRQ setting ��aha0: AHA154x: strange DMA channel �aha0: AHA154x controller not responding, status = 0x%02x ���dp8390.c����DPETH1��DPETH0��������������������������dp8390: illegal message�irq >= 0 && irq < NR_IRQ_VECTORS����dep->de_flags & DEF_ENABLED�dp8390: receive failed��x���ETH_IGN_PROTO���dp_isr = 0x%x + 0x%x, de_flags = 0x%x ��OWC :%8ld ���CDheartbeat:%8ld ���fifoOver :%8ld ���fifoUnder :%8ld ���carrSense :%8ld ���transAb :%8ld ���collision :%8ld ���transDef :%8ld ���packetT :%8ld ���packetR :%8ld ���missedP :%8ld ���frameAll :%8ld ���CRCerr :%8ld ���OVW :%8ld ���sendErr :%8ld ���recvErr :%8ld ���dp8390 statistics of port %d: ��dp8390 port %d is in sink mode �dp8390 port %d is disabled � ���dep->de_flags & DEF_ENABLED�dep->de_mode == DEM_ENABLED�sendq_head < SENDQ_NR���dp8390: invalid packet size�!(dep->de_flags & DEF_PACK_SEND)����dp8390: should not be sending ��dp8390: send already in progress����dep->de_flags & DEF_ENABLED�dep->de_mode == DEM_ENABLED�!from_int���dp8390: illegal port����dp8390: wrong packet size���dp8390: read already in progress����dep->de_flags & DEF_ENABLED�dep->de_mode == DEM_ENABLED�dp8390: illegal port����dep->de_flags & DEF_ENABLED�dep->de_mode == DEM_ENABLED�ZDP�dp8390#0����dep->de_flags & DEF_ENABLED�dep->de_mode == DEM_ENABLED�dp8390: illegal port����dep->de_mode == DEM_ENABLED�dp8390: illegal port����%x%c����%s: Ethernet address ���?���_EA�dp_check_ints: strange: overwrite warning and pending read request �%s: transmit interrupt, but not sending ����!debug��%s: CD heart beat failure ��%s: fifo underrun ��dp8390: got premature interrupt�%s: fifo overrun, resetting receive buffer �%s: dropping proto 0x%04x packets ��%s: strange next page ��%s: packet with strange length arrived: %d ���������k����dp8390: wrong type:�!(size & 1)�!(size & 1)�count == 0��dp8390: umap failed ����i < iovp->iod_iovec_s���dp8390: remote dma failed to complete���count == 0��dp8390: umap failed ����i < iovp->iod_iovec_s���dp8390: remote dma failed to complete���count == 0��bytes == 1��dp8390: umap failed ����i < iovp->iod_iovec_s���count == 0��dp8390: umap failed ����i < iovp->iod_iovec_s���count == 0��dp8390: umap failed ����i < iovp->iod_iovec_s���count == 0��bytes == 1��dp8390: umap failed ����i < iovp->iod_iovec_s���iovp->iod_iovec_s > IOVEC_NR����irq >= 0 && irq < NR_IRQ_VECTORS����%s: No ethernet card found at 0x%x ���������������dp8390: send failed:����dp8390: unable to mess_reply����dp8390: umap failed�dp8390: umap failed�-�����������-��-��&����-������wdeth.c�����in a 16-bit slot �������with an interface chip �Ethernet����Network�Starlan�����16-bit �%s: Western Digital %s%s card %s%s at I/O address 0x%X, memory address 0x%lX, memory size 0x%X, irq %d �%s: WD80%d3 at %X:%d:%lX ���!(dep->de_flags & DEF_ENABLED)��dep->de_mode == DEM_ENABLED�%s: NE1000 remote DMA test failed ��%s: NE2000 remote DMA test failed ��%s: Novell NE%d000 ethernet card at I/O address 0x%X, memory size 0x%X, irq %d �%s: NE%d000 at %X:%d �������(16-bit) ���%s: 3Com Etherlink II %sat I/O address 0x%X, memory address 0x%lX, irq %d ��%s: 3c503 at %X:%d:%lX �bad 3c503 irq configuration�fatfile.c���r == OK�r == OK�%s: cluster chain finishes early! ��%s: ff_map_step (= %ld) is not a power of 2 ����%s: '%s' is not a file �%s: '%s' is not a directory ����%s: strange number of fats: %d �%s: magic AA55 not found ���%s: init_hd failed �%s: dev_open failed: %d ����r == OK�%s: dev_read failed: %d ����r == OK�off+size <= SECTOR_SIZE�%s: '%s' not found �)���� ���B����� ����pos-ffp->ff_cache_pos < ffp->ff_cluster_size����ffp->ff_cache_cluster != 0��%s: using %s ���%s: file name too long in '%s' �%s: unable to parse '%s' ���%s: minor device number in '%s' is out of range ����%s: driver named in '%s' is not available ��%s: no environment variable '%s' ���%s: seek to %lu failed: %s � (read-only)��������%s: using '%s', %lu bytes%s ����%s: can't determine size of '%s': %s ���%s: can't open '%s': %s ����%s: No DOS 3.0+ running ����%s: boot environent variable '%s' not set ��Access code invalid�Invalid handle��Access denied���Too many open files�Path not found��File not found��Function number invalid�No error����-� ���%���R,�X���+�c���6,�d���+�o���+�p���+�s���d,�u���+�x���+�j������q�����x����������������������������������� ����� ����� ����� ����� ����������������P������Q��� ��R���P��S�����T�����U�����V�����W���@��p���p��q�����r�����s������t���0��u���`��v�����w������!��<��"����������8�����TTY����������DP8390��w�����(C1)����w�����(C0)����0�����SYN_AL��G��(���IDLE����}�����FLOPPY��2�����MEMORY��l,�����CLOCK��������SYS�������������HARDWAR���������MM��������������FS��������������INIT����at��������bios������esdi������aha1540�د��dosfile�!�fatfile� �c0�������V��������V����� ���V��������V��������V�������������������p��������`�� �����D�� �����8�� �����$�� ������� �������� �������� ��������������������������������Uw��3��rw��4��2��2��w��n8�� �@���������� �.�s��������������?������������������1�!�����2�@������3�#�����4�$�����5�%�����6�^�����7�&�����8�*�����9�(���� �0�)������-�_�����=�+������������ � ���� �qQ�����wW�����eE�����rR�����tT�����yY�����uU�����iI���� �oO�����pP�����[�{�����]�}����� � ���� �������aA�����sS�����dD�����fF�����gG�����hH�����jJ���� �kK���� �lL���� �;�:������'�"������`�~������������\�|�����zZ�����xX�����cC�����vV�����bB�����nN�����mM���� �,�<������.�>������/�?������������*�*������������ � ������                7��8��9�� -�  � 4�� 5�  � 6�� +�  � 1��2��3�� 0�  � �.����� � ���� �������������<�>������  ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������B��B��HYABDCVUGST@����4������������������������������������������������� ��� ������0�����@��X���P������`��@���p�������������`������@������0������������ ����������������������������ğ�memory��x:x,���Uw��rw��rw��rw��w������w������ ($-*P� (* P$-* (# P$#P�H2L22 )~����rw��x��P}��d~��D~��f��fd0�}������x��X��A��w��T��at-d0������П��ǣ��1��x��(����w����bios-d0�����������x��ۦ��q��w����esdi-d0�������x��p��l��d��\��T��L��D��<��h��X��L��<��,���� ��������������������p����p��8��~����w��q��d:d,d���aha1540-d0��AHA0����x:d:d:x���z��������� �,��������� �$��x:x:x:x:x:x��������������������������������������������������������������������x:d:x:x��� ������������ ��� ������������� ������������ ��� ����������ZiiZ<"������z��+�F��x���f�w���fatfile-d0��M"�r%�(�x��!�h"�w��)�dosfile-d0������@&�����(&�����&�����&�����%�����%�����%�� ���%��Error 65535�0123456789ABCDEF����0123456789abcdef��������� ((((( AAAAAABBBBBB ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������mm��������������������������������������������������������������  ���p9����T������د��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1$T$Lt����su;SSSSu���� QRPP�� ���P3�����UVW;�����=@P��Nr E@P�� ��E}tu5PP�����YY"��1XP��@}���#<�����u*H��PW3��YYt Wh���%��YY<��Gl��UhP��hz��3��YYth���h���%��YYP��PP�� P��@P��hXP��=PP���y1PP��il��ZУTP��UViEl��ƁXP��U L��<�����<�����tV!��Y^UhVWhLP��2��Y����sPhLP��2��YYFhHP��2��Y����sPhHP��c2��YYFEPjK0��YYUU+UUE����}?iEl��ǁXP��<��Wu0��YY�t<�� W W+WUEXS�����hxS��1��Yh|S��1��YDP�����EPj�2��YYth���h���$��YYUȉUEPEP��YYU ������1Ph���:+��YYU ������1Ph|���+��YYU ������1Phh���*��YYU ������1PhT���*��YYEPj%1��YYth���h8���P#��YYjh,���0��YYE=thXP��hm@u0�� u0��Y_^U(VW=TP��=DP��@u ��=DP��>|W:t ��W UW+W UU Uu��YEu q��U U؋W Uuuj�huj�h8-��Eyuh���a"��YYXP��X��s<��tl��-XP��l��EDP��WV[���+4��PP��V4<��!<�� uUVUVW+W VVF$�F%�E����=��0u��} ��B�����XP��X��s!��9W(t9W,u E���l��׋��V(}�uv(u5PP��,�� v(u5PP��j!��Vu(-��YYj�uYY��_^U5$P��5TP�� ���YYUVWu-XP��l��NjTP��R,9V(u TP��B,1E싖<��t j�W��YYj�j�Wj!��Wv4y-��YYF@vDPF>PV��u vv ��YYV V+V Rv��YYE F$i^4l��XP��]S0U���#<��U}tU9V(t9V,u���1E}�t}�t V��Ydž<�����ju��YYXP��X��sA<��t.9~4u)F4������#lT��Ut<��tVK��Yl��뷃}�tUjR��YY_^UVW=@P��u$P��ǃ=@P��u1(P��Eu TP��R,ډE����XP��X�����<��{���PP��9V4l���~ 9~(_���} 9V,uQE<��tV���Yp���<��€t'~%�t!F% ���TP��P��F%�F(>l��_}�~(Ut1!TP��<��TP��z0_^UVWuiF4l��ǁXP��F$V% ‰UP��v(v4YY<��dž<������ DP��_^���UVW5TP��0P��U�� 9~ vdžd��A+V ׍EP5PP��r)��YYuWV#��� Eu0P��d��E_^U,VW}W UE����~�u1��VU؋U U9Uw ���+UUԅ~EE]U U9Us ���URUUM 9JtJM}�~+UԉV+UԉVUVM ���#<��Uww w wwub���Eu"}�t-XP��l��WPl(��YY12Ut UMJUtUUVV+UԉV_^UUU9Us1���U���VW5TP��(P��U�@��v ��=$P���~ =$P�����~ ��0P��UEЄ��5$P��ujj�uj5PP��|&��Džt��4P��UEЄ ��uujj�uj5PP��B&��Džt \��1E܄��pʉlj�j�5PP��j ��jluW�� Ey ����U UhPuEPEPEPEPEPEPu��$E=0u*G$h��EPh ��uf��E܅K}�y&u (��Y}�@��v |��r��llrPAPV��Euuuuuu��Džtu'��Y��lfRfV>lffV@lRVDV UV UU+UURh ��9��YYEԄ ��uuj5PP��ujj�$��Džt5PP��h�����YY}�tjuu'�� uj�5PP��uj���uj5PP��uj���u&��Y<��@j���t���t%fxfV:F:^8PS5PP��jd��t���t'zF=^=N<SQ5PP��j..��U@��E���}@uFLPj&��YYt)uFLPH&��YYkE D\����kE \`S4&��YE뺃<��ߋU <��UUj�j�5PP��j;��j/u&��YYE؅uU܉UEغ@���#<��huRu5PP��G#��_^ULVW}j EPu%�� =���} f��}#u}!u 0P�� t A��}u}t +��}t ��Ut ��E t ���1] UEUUċEŰEUЋE E8�u ���E 8 t]E�����UȋE(E�� UE�� UE�� U9Ur X���E 8 u1EEU+U$UU] Ruu$uu3MUU ~j�uu#�� _^U,VW}�tE ����<����U UUU�� U��U U��U U+U+UUy Z��UUR!��YEu <��5TP��F@vDPF>PV��u vvG��YYV V+V Rv3��YY}�tuV���'��UV����UVUUVF ����UVUVUVUV UVUV V5PP��"!��YY<��UUU ׋V U܋U UU܉+UԉׅtT���s���EPuj�hh��jj���th���h�����YYUU܉+U؉1_^UVWE�uE=���}(U�@��9v>�t >} >E@E_^UVW}E Uu"��Y���EWUr9U1���UU}�t$U9Uu1���MUAM:�uE���E]]E UE �@��v1j���U+UM]]RQS!�� UuR!��YY}�u URGPGP!�� uWYYUW���_^U VW}E����jWuu u1���j�ju �� =t,h���Wu �� Exuj W �� ƅu1g���9v N> t> t9t3F�9v~ t ~ tNuj�Vuu Eu1!E���Eu��YE_^UVWiEl��k] XP��É]uUM M ME ׅX����v�E}�uuWu�� EuWu�� EU9Uu}׉+U_^UV0S��X��s<<�� t)9ut$U N>9uF@]9u U9VDu l��1^���UV=(P�� u1��=(P���~ =(P��~ ~��TP��k(P�� \ЉE=4P���t,j 54P��j5PP��ujj���ƅt4��=0P���u1$��j EPjj�50P��j5PP����ƅt���}uGTP��5(P��HRC��YYTP��5(P��XR4��YYTP��5(P��LR��YYMTP��5(P��HR��YY}�uTP��5(P��LR��YYTP��5(P��LR��YYTP��k(P�� ML\j EP��YYTP��k(P�� ML`TP��k(P�� MLdTP�� 8P��4��1^UTP�� TP��RX\��1UVTP�� TP��RP\�����j h0P��&��YY������Vh0P����YYtTP��VPR��YYFѾ���&Vh0P����YYtTP��VPR��YYF5TP��}��YAj h0P����YYTP�� 0P��JP5TP��R��Y��$P�� ��1^UTP�� TP��RPQTTP�� 0P��JPTP��j PR7��YYTP��<�����5TP����YUTP�� 0P��JPTP��j PR��YY5(P��58P��5PP��\�� E5TP����YEU5(P��5$P�� ��YYUVW=PP��t ���$P��UiEl��ƁXP�����#<��t ���V(U0P��UTP��XP��TP��N,J,���a���WEP+��YYu.LE����/E&<��t/<��UU 0����Wu3��YYu4��YG떸_^U5$P��5PP�����YYU$VW} �tiEl��Q��ƺ��� iEl��Q��ƺ#E���UUkE <E<���19E tEEPjy��YYth���hX��| ��YY}9}uy_^UTP��<��U VWu} -XP��l��E���#<��t:<��uWtp��h��Phx��S��h���hd�� ��YY<��@t tu��YWVD��YY��WFHPb��YY��WFPPN��YYtWFXP&��YY��k TdUWFLP#��YY���<�����tWFXP��YYV��YB��<�����tVTUVPU}k T\U苖4��UEPu��YYUUU\URvV_ s���k T` VPUtWFPPg��YY WFPPQ��YYUtWFLPE��YYk D\����EPu��YYWFXP ��YYu.��Ym���WhHP����YYu\F%WhLP����YYt9<�����tWFXP��YYV��Y"j�j�uj f ��V��Yj�VYY_^U VW}} �x} ~ B��u} u -��E����E0S��X�����<�����t } ����~ 9~(���uTP��N,9J,���u ~(���} 9V,w���TP��J:tQTP��B8^89t?TP��B:^89t-TP��B8^:9tTP��B:^:9t EE} �tu VYY l��TP�����#<��t }�~1E_^UVWu���:WFXP,��YYt'WFPP��YYuWFXP��YYWVYYG_^UViEl��ƁXP��<�� ��t<��juYYj�j�ujAR��^U,VWu-XP��l��E^8V:9���h��hA ��h��D�� Dž���F% ���F%EPuH��YYuvV j$VW2�� =$���t W��Y���E����EPuuj��u,jEPW�� =���t W��YDE���EE����}}#kE P RuuWjzEWK��Y_^��U VW5O��tBO��9Vs7U9Vr)VUUVV+UV~�u VW���YYE6V��u1_^U VW} �z���5O��uh���h��N��YYUVU VO��=O��tU9Wr>5O��Vb���Y(tU9Ws}?EE0u8���Y_^UVWu }95O��u O��O��5O��_^UVWu>t>VV9WuWVWVYY>tVV9WuWVWVYY_^U0VWI��O��s V  xO������O������O��I��E �����E ���EPj��YYth���h����YYU؉U}܅t2WuhYYUEE 8U9O��sUO��O��1+O��O��_^UVu=��t c���j�j�5PP��j ��ju��YY��y x��ډ.U O�� 95O��s5O��tV5O��YY^U VW=��u1���0S��X��s<�����tV���Yl�����0S��X��s<�����tMl��݋=O��t#O��9WrWuYY=O��}?5����Y��1_^UVWu<�����u*O��?�t ?D��7džD������<�����_^UVWO��7���-XP��l��EV V+V U<�����u D��uYEu D��먋VUUVV+V VVVu��YYU+O�� O��Uj�u5���� U Rju5��j�uuYY<��D��VY_^U VW5���l��X��u0S��<�� ����<��@����-XP��l��EV V+V UE����=O��tO��9WrU9Ws}?���WUUWW+UW�u WuYYU+O�� O��Uj�u5���� U Rju5��jVUUVV+V VVVu ��YYuuYY<�����5������95���1_^UVuu&��YYyx��ډ���j�j�j�j���h���u��YYƋx��UTP��B:TP��Z:PSj�j���y UډKu V ��YYyh���h��:���YY}u#U J������tV ��Y^UUuh��L��YY} ���tu h��4��YYh��(��Yj�j�j�j$ ���j( ��YU$U UUUUUEPuj{ �� ��UVut =O��Pu0��� uj YtO��A O��ӈO��^U=O���tLO�����O������O������ P��O��O���P��hO��j ��YYO�������UV=(P���u#TP��<��@TP��ǂ`������1���5$P�����Yƅt<��€|������54P��VeYYTP��ǂ`������1���=4P���x =4P��~ ���=4P���~<��54P��VYY<��@<����(P��,��-XP��l��h4P��50P��P5(P��b ��t x��ډTP�� 4P��`��1^UVT��X��s<��t U9V(u l��1^UVWuiF4l��ǁXP��-XP��l��j�j�Pj ��uC<�����<��t%<��U P��v(v4YY E F%_^���UVW5TP��^��F8F:P��X��F<F=P��C��iPP��l��P��iF4l��P��P����F8P$P��Z9tV:t ���$P��fF8$P��fF:$P��P$P��P5PP��j1���F<P$P��Z9tV:t ���$P��F<$P��F=$P��P$P��P5PP��j.1DV(9V,u7V(V,j�j�5PP��j>~,��@P�� ��_^�U���V5TP��V:m���j���=(P�����rj���(P��BR|Pjj�50P��j5PP����tj���|(P��:�tjn���jg���T��$P�� ��j jYYj�j�jjj�j�j�jj�j�j�j$5(P��|Pj�5$P���� X^U���VW$P��U8P��UUS��TP��J:1uPu5PP������TP��J:t m��TP��iB4l��ƁXP��j�j�5PP��j>~0<��tItTP��9z(tڋ TP��9Q,u*džP������TP�� TP��r(q4>YY<��XP��X��s%<��tPP��9V4uF4���l��1ҋ TP��Q, TP��Q(TP��B4����1���TP��J:t {���h���hPjj�uj5PP����tMlhpP= 0TP��J:t t��E ��_^U<VW} EE�ƅ��%t VYߋEE�E���-uE����EE�E ���0uE0���EE�E����*uW׋RUEE�/0 s%kE 0‰UEE�-0���= ���rE.`���EE�=*���uW׋RUEE�60 s,E����kE 0‰UEE�-0���= ���rEX��E����E ���E���ltLuE����EE�ƅ����}�u W׋BW׋BEԅyEԉE2E���ED��E���}�u W׋BW׋BEЍUωU�E1uUPM؋UY E1uEЅu9UĉU؍W׋M؋RE���<UĉU%E���*W׋RUE����UU:�t U9U}EU+UU}�yM}0u}�yj-Y}u}�~uYM} u}�yj-kY}�~EESUYM}�0u=YMj%0YV)Y����j�Y1_^�U$Vu UUu!V֋RUV֋RUV֋RUEPj j9�� ^���U$} �u1:U UUUUUUUUUUUU UEPjj�� U$UUEPjj�� ��U$UUUUU UUUUUEPjj�� ��U$UUU UUUEPjjg�� ��U$UUU UEPjjA�� U(UUEPjj#�� E؋UE EU$UUU UEPjj��� U$UUU UEPjj��� U$UUUUU UEPjj��� ��U$UUU UUUUUEPjjq��� U(VuU UUUUUtUEPj j:��� E؅tUE^�U$UUU UEPjj��� UVWuU VVu���YYDžtF_^��UV5l��Nx X��^U=p���tp��u���Y�/�����G�����k�������������������������O�����s�������������������������USE] ���![]USE] ���![]USE] ���![]UW}E MuG_]1_]�������������UVW��E_^]������������������UW}0OE uG_]1_]��������U$UUEPjj�'�� ��U$U UEPu��YYEPj!j�� U$UUEPjj�� ��U$UUU UEPjj�� U$UUU UUUEPj6j�� ��U$UUU UUUEPjj_�� yEU(VuU @t*uY���EU UV֋RUUUEPu��YYU UEPjj�� ^�U$UUUUU UEPjj�� ��U} vx�����M ���E 1U} vx�����M ���ҋE!1UE�����1UE��1U} vx�����M ���Et���1��U$UUUUU UEPjj��� ��UVW}u M)9r/r uu fE_^]t|�������������} 0)ʇʋu }���������UW}0ʀuA)_]�����UVuY���ƋU rU MJwU uReYY^UVWuU VVuYYDžt~~�yVډx��F_^���{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ|��tPXP�������������������������������������������������������������������������������������������������������������������������������������������������������������MM can't reply to���MM receive error����/dev/ram����MM can't sync up with FS����Available = %uK ���RAM disk = %uK ���MINIX = %uK �� Memory size = %uK ���MM can't obtain RAM disk size from FS���do_fork can't copy��do_exec stack copy err on���new_mem can't zero�����������.��p��������q��������M�����M�� ���V�����_��alarm er��������dead����zombie��MM: signal %d sent to %s process %d ����Hole table full�bad SYS_MEM?����allowed: fstat failed��� ���%d��Memory manager panic: %s ���(��������`(��;(��`(��++��������)�����&*�����)��.���*��/���)��>���*��?���&+��+���������+��+��+��k+��+��.�����M� ,��M� -��M@-��1�� ���%���B0��X���/��c���&0��d���/��o���/��p���/��s���T0��u���/��x���/��P�� ���������0S��core����&������&��&��&��&��0��&��&��&��0��&��&��&��&��&����&��&��)��&��&��)��)��&��'����&��]��&��&��&��&��&��&��&����&��&��&��&��&��&��&��&��)��)��&��&��&��&��&��&��&��&��&��&��&�� ��&��&��)��)����&��&��&��&��&��&��@��������M��H+��<,��0123456789ABCDEF����0123456789abcdef������������SSSS�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������fs��������������������������������������������������������������  ���Pp��` ��h!�����y!�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1$T$LL��` ��su;SSSSu���� QRP$L�� ���Pzk�����UV|�������0L����P^u���14l��N!�����=e!��x =e!�N|e!�,��ƃ=N!��uV5�����YY=d���z��pUV=,L���}���0L��0l��s_~uuQ-0L�������Vdʉ e!�Vdʉ p��Vh|��Vlt��Ft�Fu� ,L��Wƀ���h���h���Vd��YYhh��hz��Nl��YYth���h���0d��YYh����l��e!�^UU D��h@��uk��YYU,VW����������������50l����Y1������0L����j50l��@��YYƋ��rV{G��Y��r��fB\����fB^����B`���Ba���f}�����BxG\E���E���E����Em@E0L��EPj k��YY_^UV<l������8l����e!�J!���N!�s3dž ������fdž�������������������N!�������N!�s�������8l��@l��^UPUUuj��Y���EUUE@���EPjhS@j)g��EPg��YU(VWh��Y0l��h��YEh��YEjj50l�� �� th���h��a��YY=0l��������jju �� th���hl��la��YYE䌬��EUfB$u<��Yth���hT��:a��YYUMA RU9UsUUBi� ��EUJIMUZ QZU9UvUD�����L�����H������P��m@UT��h@��jh��YYu =L���th���h<��`��YYiE��� H��h@��j�h��YYth���h ��\`��YY=0l�����U��h���a��YfN!��`N!�UfN!�U؉N!�E����U9U���iE���h���PuhN!�s��ju50l��C�� h���VWg�� Ƈ��jV9E��YYjW/E��YYiE������Ph���`��YYErh���`��YuG��Yu��Yj�j50l��aC�� ƉuUB UU��MRq,_��YY%��UfBUur,_��YYUBƆ��h���V|D��YY_^UVW����s fF$��D��fUfV$V0:��Y1ۅÉ]u/EjP <��YY����@��u G=���}E}�th���h��k^��YY~W\B��Y~F(����_^��Uj5p��5x��]�� tdg!���#t��RhA��r���YYEUVW1t��@t =x��j5p��5|��D]�� j5p��5x��*]�� ƅtdg!�W5t�� ���YYƉ_^U VW}E������! ��%��fEEPhp��EPj�UH��Etk��@���r���U �� ��!Ӂ�����f] j�E Ph`f!�-�� Ƌdg!�Uu E����<}tE������!1Eh`f!� ��Yƅu dg!����� p��]UB���Ur Uz}�f��EPVM��YYEN��4�����=��jVM��YYE(��Vy1��YV;��YjV:<��YY ��Ut1E���VfU!M ER5��P �� E������UzWEPV�� E���Ut������EUB����uV-G��YYEt)�� p��]CUr UzND>UB���}uV4UV8UUMJ�����Fe��}�t,�� p������UB����V8��YEp��_^UVWEPu,��YYDžu1���EPWw ��YYƅ���=dg!����G@] SP8��YYƅuWn8��Y1���F@FUVjVi:��YYjFBPEPW!��Et@W+8��YFHFFTV8��YUdg!�1(t E dg!�UW7��YUdg!�_^UVWu}U t������PVeE��YYu"���tU t<;j��Y+=hg!��~"5hg!�jV�� 5hg!�jV�� FU1_^U��#t��fU=4l���uU������t s���j5p��5|��X�� tdg!�RU �� ��!U��� ځ��fU5x��EPh`f!� EP6��Ydg!�UVWj5p��5|��X�� t dg!�?��EPh`f!���YYDžu dg!���W|WM6��Y������# t��!ف�@����fMj�EPh`f!�: ƅt =dg!�uV5��YW5��Ydg!����fWBfUfVBfUfUfjEPh$��V-��EjEPh(��V��E}�u&}�u ^CF_CGGTjj�EPW��FHFFTWJ5��YVC5��Ydg!�_^UVW5p��B��YDžu dg!�V��w WJZ���tS���U� ��t }�`��u6VfU}�`��uV2��YuIQ��EP>��YEP<��Y~Uu%t������Ej@uV�� Ou)~Uu~D~uWV4WV8VV4��Y p�����ҡ��!P|�� p������=`g!��u1Y���`g!�UEe!�}`f!�s.U t9ru ��Ix9Ju f�� `g!�EɋU9`g!�}N��1_^UVW5p��.A��YDžu dg!����W zUu%���1&w!W rd��� ��t��k_��=|���~|��9}9=|���y|��9~5|��9wtW BWw5T��1_^��Uj����YUPVWE����E����=���u0p���t$p��UЋp��Ũ%p����UE���=t���y 5��5p��?��YEu dg!���UP}�u������ZuU u ����=t���u1��UzRU܋Ur VUE����~Uu��RpUE����}�u������E�����fUU���t U���u���1EU� ��u���1EU�`��u���1EȅtEpg!�����}�tGVfUEu5t��W5|��uPu��E؅��E}E������}u?}�u9VPR +t��9s ��E���t}9}sj�uVt �� ~Uu&EPW5t��uuV ��E؅C��}�~E���=t���������1U}�t+M9MsE ���+UЉE$���+U9t��st�� ���+UЉEԃ}�y ���+UUԃ}�uU)U9}���9UvUuu5|��u5t��uuWV��$E؅uK=pg!��xBU|��|��t��+Uԉt��UU}ԃ}� U+UԉU}u}�u U�@��u69}s1~,~Uu&9~w!F����1jV<��YYEt@����Uz}�u3~W�u-���1u}�u U�@��u 5d��=lg!�FW�=pg!��t pg!�U؃=pg!�uE����}�n���}�uFX ���FX}uFX ���FXFT}�t(E����E���u��MJpj ��Y1��Bp����EE_^UVW}���1�`��u@Et���E 1EWfUu Wc��YYEfW@fU}�uG}�uA}�uj�j�j�3�� VD ��Y���u W8��YYƅk���dg!���}�uuu uW,��E}���u���1E}�u}�uU 9WwE���EuuPg3�� ƃ}u$}���t}�uU 9Ww }�uV��Y}�u#Uuu u$u(RjjS��E(UuRjju u$u(S��EƆ��UU���u������EPV?4��YYE_^U4VW}WPB E���E 1E̋ME+E؉EWHUWLUU9U~(UO4u1���MUU؉���U+UU9U~UO4l���UBOօu1���U+UUԋMUG@j�uP1�� EEԙ}EPu~���YYjuH3��YYEԙ}Uԅu1U���MUG@j�uP1�� EUԉURu+���YYju2��YYu1MUU؉_^UVWU��P$(��Yǃ0uU MQPw,yM��YYU M4w,M��YYƅt/W9w9ww"u Vh8��5N�� h���h$��L��YY_^U V5d��d������5lg!�VYYEt&h���5lg!�uV���Eju2��YY^U(VWu���1�`��u@Et VfUfV@fUދU UEjuP60�� E��tE/�����E1UU+UUUU��U1ǃ}�t~�u E@���IV+U�����1E}�u)VPZ ]M���VHU9Uw 9VvGE@v@��� s ~W�u ���9}s}E����UAMM؉ ��Ot;=<l����}/EEjuP4/�� E��tju0��YYEj�uh ��P3��Ej�u P.�� _^��UjYU8VWuFT1VPB E���E 1MEȋVHUVLU9E~EVM 1��U+UUE����E����9U~UNUE������UBNU؅u4F@vP0��YYE؅u dg!�e��UBN]؉E���U+UỦЙ}EE̙}ŰU9U| #��MUUЃ}�t���1^@PuS-�� ǃ}�tW��YuWBYYEE����}�^���F@vP/��YYEԃ}�t UNuuW��� E���tƇ��}�ujW.��YYdg!�l���jW.��YYMUUЃ}�t���1^@PuS,�� ǃ}�tWC��YỦUuuW��� Ƈ��jW>.��YY1_^UVU��P#��Yƃ~0uuv,H��YY%��U MfQuv,H��YYU M^UVWURPB E���M���׃}u E 1ljE ��U U1PE 1Z9c���uuCYYEtOM���-���EUUU9Uw-UB@juP+�� V��YjV(-��YYE_^U VWuu VYYE���~�uVPUJMVUF@uP-��YYEu1���uu Va Et^@uS+.��YYUdg!�1k���U 9Vtju V VPB EMUU���UE 1u���1EEF@juP*�� W���Y_^UVuh���j�VN�� Ɔ��^���UVW=��EPEPjj�M1��EtC��UO ]UB���EPEPjj�1��EtUO ����UB����E���UO ]UB���h���50l��#$��YYƅu8UO ����UB����UO ����UB����dg!����VQ8��Yth���hp��yE��YYFU��f�����fUr UB����V5)��YUr UB���jV+%��YYUH��UL��FX1_^UVWu}E����} �uS9~D��jVv0��YYt4E���t Ej/��Y=hg!��~5hg!�jV�� E��jV,0��YYu&��-0L�����j PiI��YY���U������E���t}���} ���E���t>}���~5���)E~5hg!�jV�� ���j���`���}���~(���)E~5hg!�jV��� ���/j,���Y1#u5hg!�jV��� E��������_^UVutuhg!���Btp�� e!� ��Qdډ��Bvu �� |��Jh�� t��Jl�� |��Jh�� t��JlN!����^UVW}0L��0l��Q���~tuC~u�u=Vd9M u2N 9z u$-0L�����j�P���YY hg!�Mtƀ���_^UVW}�x}@|uh��aB��YYUց0L��~t�W���~uM���Fv؉ǃtu Fu,L��/Ft�uVdRuYYU Vlu uYY_^U<VW=���~ ���=p��x@| Wh��A��YYց0L��~t�u1���Fv؉E���VdʉMx}|h���h��hA��YYUN UR RfUEЉỦ}ЋVdu������EE����5��]k EPuh��YY ��EJ��Ft�jWYY1_^�UVWEЉ95��1k ǁd��Euu PjE=uwh��@��YYE_^UE]k j�j�Pjd��U(VE k Ɓd��UUE ЉUUUUUUUUUU UEPvVYY}uDE ���t2E����UUE ЉUEPvVYY}uE v4YE^U(VE k Ɓd��UUE ЉUUUUUEPvVYYE^UVW��zw�t��Jbt M���(0M��0l��sFb] 9uM���ƀ���E uuPuSǃu��fM fJb1_^U��Jbu1UV=���tp��ց0L��FwfFb��^U VW5p��)��YDžu dg!�Y���w ���� ��t����`��t-VfUEw5x��j�5��5��Pj_^U,VWu V UVuF��YY=S���EPuE��YYDžu?~�u U9U���}Ctuuuh@��>��uu YY땅th���h ��=��YYU9Vt9~Ctvv6h��>��v vYYVuTE��YY_^UV��Jbu U B 9��Bbk Ɓd����BbU ȉJu vVYY^UU,VWE k ǁd��E ЉUUU؋UU܋UUUUEPwWYY}���}����U9Uz���E %� EfE h-��50l����YYƅuE j�uPj\dg!�AE F�� p��r ��Y�� p��r E����E_^���UVWEPu1���YYƅu1!}�uEPVu��YYV��Y_^UVWU:/u ��B ��Bƀ~�tU:�udg!�1���VS��Yu us���YYEuV+��Y1X���U:�u*����@��u;V���Ydg!�1&u V���YYV��Yu1 UU_^UVW} uE=/���uFU���9v%}/t}�tU 9vUGFE΃}/uU���9v FEU 9v�U���9wdg!�1_^UVWU :�uUMA@ZBSP��YYq��}�u1d��j�EPu uW��Et dg!�1=����M9Ju8hx��u dB��YYu%} (��tUMA@ZBSP��YY���UB@]SP��YYDžu1���WB���UJBu���U z.h���Ь����W���F$_@9uFW��YVfR@fUVJBMEQPr��YYEu uYYu��YD띅u1<t6Vu0����s9~uW��YF$jP��YY˃DՉ_^U8VWuE��������@��t 0��E����}O���}�u������%��fE} $��t } (��u}�tV*��YEEPV)��YYE}�tE��VUE����E����E����E����U9V��uVYYE^@j�uS�� ENjU���9:��E؋U9Uv}%��E�����}^���S���}u1h��GP?��YYt9h|��GP?��YYt%E���ju GP?�� uE���}����E����}u E\���}u7E ���WUff f��UƂ��FX ���FXFTVPUPr,6��YY%��Ufju��YYE?��}uu E���}�uju��YYE���f}t}u1������}�u5Eu ���vVpYYEu dg!����}E���jj�GP/>�� E����U U:�t}}U UOMEڋVPŰUMPq,5��YY%��fUƂ��ju��YYFX ���FXFTU9UvUV}�t jVO��YY1_^�U$VW=4l���u ��j5p��5|��q4�� t dg!�m��h`f!���YfEu dg!�M��E����E����E��}��s-UB$]9uE���UJ$uUUEDʃ}�t ��}�u ��=x���t������]P5��Sl t ��UfMfJ$u��YEt]SYE}��j5t��5��]3�� tUfB$��EP[Ydg!�E��h`f!�YDžuUfB$��EP,Ydg!���E����D~E�����fUU�`��t U� ��uE1}�uEjP��YYƅu dg!�UtuE}�uA���1�@��u@E���1ہ�@��uC]}�u }�tE}�t.W��YV��Y<-��EP��YEP/YEGVUzUrU x��J(1_^UVW=4l���u ���j5p��5x��1�� t dg!����h`f!����YfEu dg!����E����N!�e!�s~D�~F@]9uVDU\ۃ}~ z���1E��}��sUB$]9u}ED.,��EP��Yu3EPYWBV�wy��Ywp��YG����fG$��1_^UVuwYƅu18����`��tdg!�V!��Y1VfUV��YE^�U VWj5p��5|��`0�� t dg!�E��h`f!�Yƅu dg!�*��1V|u����@��u=4l���utV��Y���j5t��5��/�� tVZ��Ydg!����EPh`f!�YYEu=dg!�u2EPuYYEu=dg!�u1u��YuF@UZ@9tujFBPEPuBDžuF@F^XFXFTV ��Yu ��Y_^UVWj5p��5x��.�� t dg!����EPh`f!�YYEu dg!����1EPu YYƅu=dg!�tu ��Y���VBuu ��YV ��Yr���=e!� uE����@��u=4l���uVBuu&EPVu �� EPVu<�� V ��Yu ��Y_^ULVW1j5p��5|��-�� t dg!���EPh`f!�YYEu dg!�s��EPuYYEu5dg!�j5t��5��s-�� t5dg!�EPh`f!�RYYDžu5dg!�EPWYYE}�tU ���1ہ�@��uC]��19}u@E؃}�^���}�T���}W��YU9Uu2h(��u,YYEuL ��YU9UtUUuľu, ��Yh��EP5��YYt<h��EP5��YYt(h��EP5��YYth��EP5��YYuUB@_@9tjuE��YYEujW4��YYEtu}�uJUB@UZ@9t}����W|���}�r���j���`���U9Uu��UB@UZ@9tU ���1�@��u@E܃}u }�u}�u }uu2}�t,}�tEPuWt�� EPuW0�� ƅm���UfRBfU}�t0jj�EPu�ƅuCjEPEPu,jEPEPWƅujj�EPuO���}�tI}�uCfWBfUh(��j�u�� jEPh(��usuG@GGTu��Yu��YW��Yu��Y��u1_^U4VWu���U� ��4��}�`��'��fV@fU΋VPB EM���UVLU^U1u@E܅tF���E����U9Vv0uVYYDžtMUERP1��YYUUFT}�t V` ��Y���VHU؍NE4P��YYUBNUf���MEj�WP �� EE����U9U}"uuNYYE]PS��YYEju��YYEuP��YY_^UVW} jj�h��WEt���h��u1��YYth��u1��YYu s���WBu `���M��0l��s9~t9~uBƀ���uWu2��� Et"h$��j�W��� h(��j�W ��� 1_^UVWu uGj�EPuudg!�uUZ@EPS��YYƃ=dg!��uudg!�FV; ��Yjj�uuDžuFHF^XFXFTV��Y_^U4VWu~(�th���h��'��YY} �uE���BUFE F���EVJ+VډU^]U9UrE����� ��E1EE1U���UUUUF$j�RP\ �� E���E؋UM9}��������Pv,l'��YY%��fEE����Mк���MօtE+U���Йi]� ��]Љ]9]vTMк���M с��fMEPv,&��YY%��fUƂ��ju ��YYE89ju ��YYEU9UrE����E����M1_^UVW}(�th���h��&��YY} �u E��� G���E� ��E1EE1U���E1UM�����fUUUG$j�RP �� ƋUQPw,%��YY%��fEUMuh���} �u����Pd%��YYUM!с��fMEPw,%��YY%��UfQƆ��jV ��YY_^UV����sF$]9uDEPh,��$��YY1^UVW}WfUE90l��u���'����sF$]9u���D1_^UVWufV$fUF$j�jPv�� jDWV,�� h���W ��YYfF$��FE=��th��j�$��YY9EuE���1}��u@E>}h$��thh$��j�R$��YY9EuE���1}h$��u@E 4��Pu$��YY%��fFPu$��YY%��fF^Su#��YYfF^Su#��YYfFFPu#��YY%��fF^ Su#��YYfF v u#��YYF vu#��YYF}uVVF ���F4���F8���F ���F4���F8���F<����F@����UV0UV,F~ F~~~r F =���v fUfV$1_^���UVW1N!�e!�s)~D�~F@]9uVB9U u FDL\υudg!�13fUfW@��#U fWBGD���Ut j�W(��YYGX�_^UVuO���NDuJ~�u#V+Yf��FTF@^BSP_��YY ~UuVYFU�~Tu jV��YY^UVWEPYƃ~(�tdg!�1���v<j�V~ EuRdg!�^$ӉU^$ӉU^$Ru90l��u`��\��Phh��t"��1q���UV<UURj�rYYDžuuj�V CfU fG���fR^fW��JaOfUfW@V4WHV8WLwPW���Y_^UVWuF����FXFT1 } V����G_^UVWEPPYU ~%U 9|U Wj�V 9~<v~<_^UVWuVPUz(�u&G��FXt~ FXt~FXt~FX�_^UVWuF@PYlj~PG_Ã]VBJO 1EEN@j�uQ�� EVBJP ���1YʉUVBJ���1UU} u~X�tV&Y(�u UƂ��0uw,u uV+���w,u uVb��j�u��YYFT�_^UVWu} }����Pu>��YY%��f_Su'��YYfFwu=��YYFwu-��YYFF VVO NO NFH���FL���E����} ���UOQPu��YYUNEPu��YY%��f^Su��YYfGvu��YYGvu��YYGNO NO E����} }'UN4u1��YY%��UOfQE_^UVWu} }����Pu��YY%��f_Su��YYfFGPu��YYFGPu��YYFwu��YYFw u��YYF wu��YYFwu��YYFFH���FL���E����} ���UO4uc��YYUNEPu��YY%��f^Su��YYfG^Su��YY%��fG^Su��YY%��fGvu��YYGv u��YYG vu��YYGvu��YYGE����} }!UN4u��YYUOE_^UE@D��UVWUt`��#U U4@l��tJU 9 ��u7��]9u(���uVY��Y��@������벋58l��uh���h��n��YYV��Y��# ��U<@l��9u�� @l��'���t9��u��������t��u��P?��YfUf��U ����@����# ��U@l����U4@l��Ut!}u fdž����}�u j�V��YY_^UVu�����H�������� <l��U €t;dž������8l�����=8l���u5e!� 8l����58l��9e!���dž�������=e!��u58l�� e!����5e!�U @t��u��t jV���YY^UVWEPwYV9U uV@U VJ+U ډUujVj DžuRdg!�F$ЉUF$ЉU^$Qu90l��u����Ph��^��1V9U u~@VJ_^UVWEPYV9U r(U 9Vv VJ+U ډWjV{ 9~@v~@_^UVWu��fU���i �����E} �u������E]j�h���uVjSuǁ���tIxt&E] ��QPh��Z��fdž����} �u=pg!�Ɔ���_^UV��N!�s ��]9u fdž������^UVW��1N!�s1��u ��]9uBVh+��WZY��EjWh+��P���_^UVWE���kE@E9E}}u������EEEU9U}݋U+UօG���UM  ��9 ��s+U <UM ] UM <+UE뜃}�`��E����E)��}@}?U9U}7UM <E M ��9 ��uE8UB���EE뻋E i �����Mj�uSh)��jQ}u��� ���PE1E)��9u���U <Uz�tC}�g���_���E] ��QPh�����fLJ����.}�ufUf��jW)YYƇ���FEwU U U)U}�}�E E j0YYM_^UVW<l��U�����t���=8l��t��5e!�_^��UVWE�}}�� <�uE8GE8�y;tg!�tq!�s)~�ufU fF����F����E01 ϸ_^Udg!�}�x}|1�� MUVW}tg!�tq!�s~�t9~ uU t1_^UV=������p��ց0L����rYV ��QRY��rYV ��QRYV^ ��fQ^ ��fQ\Va ��Qa ��Q`��ff 1!��5p��5x��RB��� E^UV=4l���u"��5p��5x��R ��� Ɖ^UVWjuu u�� t dg!�]���h`f!�YDžudg!�E����@��t jWD��YYƅt WYE0YE81_^UVWj5p��5|���� tdg!�4h`f!�Yƅudg!�5��j�VD��� V7Y_^UV5p��Yƅudg!�5|��Vv ��� ^U,Vu~X�tVY�����fUUށ� ��t Uށ�`��u���1EfV@fUfVBfUffUVfUfVfUVfU}�tF1fEVU~Uu.U��fU} �tU  t M+JMV UVUVUj uj5��EPjj��^��UVWj5p��5x��_�� t dg!����h`f!�Yƅu dg!����F��Z^9t=4l���u Vk��YDžtVYh���� ��# t�� с��f=4l���u$F��Za9t��fFX ���FXFTVY1_^UVWj5p��5|��r�� t dg!����h`f!� Yƅu dg!����V��YDžuV=4l���tt��fF?F��Z^9tF9t��t��Ba9x��tu0x��F��fFX ���FXFTV4Y_^U�� с��fM��#p��ҁ�� ��fEUVWt��t=t���tXj5p��5x��1�� tdg!�7h`f!�YDžudg!���#t��RW���YYWzY_^UVWuu~Vu)Ь����s9wuG$jPYYDffU=e!�!u ��B\ ��B^E=e!�!u��Z` ��BaE}�u+U����@��t UItfE�IfE�AF9Eu E���F9Eu E���E����MU��fUE����U M M9tE}�uU t V���YE9utV3YE_^UVUrP~(�t1^�UVWp��Uu t��Uju5��U �� t dg!����h`f!�Yƅu dg!����1F��Z^9t=4l���u=p���ut jV YYVHYtu0=p���u ��F F|��V ��VFXFTV/Y_^U^ ��T��1UV=4l���u9K�����|��K��hK��j��YYƅt Vh,�� ��YY1^UEP5����YYUH��UL��UP��UT��UX��1�U@VWE����E����|��UjEPjjuj5����Et {��EЉEUffU}t}t}t N��} u}u 8��UR  ������t ��} t}uUu ��} t:}u4Uu+��1+Uz#UR z��Eһ<��n��}�~U9s ��}�yU9v x��}ԋUU}�uE9}s N��E����e!�`f!�t��u}�[��uS��UR 9VD��U9V 8��9~/��}u=�����}t��Rx9V��E���} ���}t}u} u ��jY1��E���9~ rU9Vwf�� `g!����9~ r���UV ���U9Vw JV{���=`g!�u 2��E����}}kEe!�tEkEe!�EffUċNJUċNJ���UMĉQ UċNJJV`g!�}�t���} X���}�t'ffUfE��V UԋV+V U؋VUfE�juj5��EPjj ��EU���}u1H���}�u;UMf ��MRxQUMR QUz UMJ`g!�1_^UVM��0l��s6Fv؉E~tu}u-0L�����j�PYYƀ���^���UVWp��!WYƅu dg!�y���9=p��uEPht��j�j�"Et;S=t���x =t��|:9=t��ut��+t��p��螯F�� t��4t��_^UVW5p��)Yƅ ��dg!���=x���x =x��| ���EPEPj�5x��fEt���F�� M4E����� p��R|t ������1��� p�����Ux��tE1E��M#J| MJ|1TV ��!׉F� ��#V# x�� щN1)5t��VYYET��t����_^UVWN!�e!�sD�~Tu jWqYY\ݾ��N!�s*��t��u��P{Y��1_^UVW=���t ���p��Ћt��0L��P0L��S �����t��ց0L��E����}}!UN <�tN ׋BEًx��VxFw�vYvyY1_^UVW=���tBp��0L����x|u1"1}5p��tڬF1_^UVW=���t ��p��0L����p��Uxtu:��Bv؉E=t}u hg!�Up����Bt�1}=p��FG��rnY��r_Y��B������B������zw�u1�����Bw���Jbu1�����fRbfU0M��0l��z���Fb]9ufFb��1R���V UtB t;R U ���� ��u$B]9uEPYUf��G륁ƀ���z��Bx����1_^UV=���tSp��ց0L��=e!�ut��fF\x��fF^=e!�.ux��Fat��F`1^U=��|��zxt5t��5p��^YYN!����1U VW�����J^t ���jEPjj5��j5��<��Et���EЉ9=�� ���k Ɓd��~z��t)f���&��$d&��(��G��E ��F'����V��Bx1=p��F@_^���UVK�����hK��j��YYƅt Vh�����YYK��^U VW} �dg!�l���} ���~dg!�O���}u$} `f!�|��FGM uE����"u h`f!�jjuj5����EE_^UU=K���uIK�����uh��*��YY} ���tu h����YYh����Y'j��YU}�t ��#U U  ˉU }�tE <��#U Rj�YYEU ��Rj�YYEU UU�UVuu = L���u = L��Pu*j�5 L��j�hK��jh���j藾 L������ uj Yt  L�����щ L��ӈK��^�U<VW} EE�ƅ��%t V[YߋEE�E���-uE����EE�E ���0uE0���EE�E����*uW׋RUEE�/0 s%kE 0‰UEE�-0���= ���rE.`���EE�=*���uW׋RUEE�60 s,E����kE 0‰UEE�-0���= ���rE0��E����E ���E���ltLuE����EE�ƅ����}�u W׋BW׋BEԅyEԉE2E���E��E���}�u W׋BW׋BEЍUωU�E1uUPM؋UY E1uEЅu9UĉU؍W׋M؋RE���<UĉU%E���*W׋RUE����UU:�t U9U}EU+UU}�yM}0u}�yj-Y}u}�~uYM} u}�yj-Y}�~EESYM}�0uYMj%YVY����j�tY1_^�U$Vu UUu!V֋RUV֋RUV֋RUEPj j��� ^���U$} �u1:U UUUUUUUUUUUU UEPjj��� U$UUU UEPj j��� U$UUU UUUUUEPjjQ��� U(Vu UUuEPjj,��� E؋UUVUVUV UVE^���UVWuU VVui��YYDžtF_^��UVuj j�VC��� ^�UV5D��Nx tq!�^U=H���tH��u��Y�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0U��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+P��"���}�t}�y��� UU_^��������USE] ���![]USE] ���![]USE] ���![]UVW}u M����������������UW}E Mr/���u'���uĉ fE_]�����������������������L$ ����������U$UUEPjj���� ��UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����UW}0ʀuA)_]�����UVWuU VVueYYDžt~~�yVډP��F_^���{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P������������o���1ۇX ��tPXP���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������fs receive error����get_work couldn't revive anyone�Too few bits in fp_cloexec��V2 inode size != 64�V1 inode size != 32�NR_BUFS < 6�OPEN_MAX > 127��BLOCK_SIZE % V2_INODE_SIZE != 0�SUPER_SIZE > BLOCK_SIZE� RAM disk loaded. ��%5ldK ���Loading RAM disk.Loaded: 0K ����FS can't sync up with MM����Can't set RAM disk size�Bad root file system����Cannot open RAM image device����Cannot open root device�ramsize�ramimagedev�rootdev�Invalid root file system���� �������� ��� �� ���@�� ���`�� �����i ��H���������7��;��@��check file system���Illegal zone number %ld in indirect block, index %d ����pipe device is read only����revive err��B$�����$��$��$��unpause err 2���unpause err 1���Suspend on open from����fs: strange device reply from %d, type = %d, proc = %d �call_task: can't send/receive���fs: strange device reply from %d, type = %d, proc = %d �..��..��.���..��.���..��.���..��.�������can't allocate bit on read-only filesys.����tried to free unused block��tried to free unused inode��can't free bit on read-only filesys.����can't find superblock for device (in decimal)�������root ���Out of i-nodes on %sdevice %d/%d ���all buffers in use������root ���No space on %sdevice %d/%d �Unrecoverable disk error on device %d/%d, block %ld ����fs: I/O error on device %d/%d, block %lu ���do_stime error��F[���������/[��3[��;[��)`���������-_��_��_��_��_��`��`��`��d���������d��d��d��d��clock_time err�� ���%d��File system panic: %s ��j�� ���%���Bi��X���h��c���&i��d���h��o���h��p���h��s���Ti��u���h��x���h��(L���.���..��e��a��`����������e����4��-6��e��Q��Y��g ��T��U��e��0S����e��0��D3��Xc��e��Y��e��e��S��e��X��e��e��V��e��e��C`��e��C7�� ��-6��\^��X��Y��e��e��Xc��e��e��e��e��e��e��e��7'��_��e��e��e��Ya��V��sR��'��e��e��#��e��c��e��e��e��e��e��e��e��e��e��d��(����������&��'��&��'��&��'��d&��'��&��(��(����������(������z��&��'��(����������(����������(����������(����������(����������(�������������0123456789ABCDEF����0123456789abcdef������������SSSS����� ((((( AAAAAABBBBBB ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������init������������������������������������������������������������  ���P��$��L������p��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1$T$L��$��su;SSSSu`��`�� QRP �� ���P~ �����UhVWEPj�I��YYy$j�hh���G��YYjh\���9��YYj ��YEPV��YE����E��j�EPj2�� E��j�EPj�� E��j�EPj�� ��Et$j���Y9E���=���tj� ��YE��ED���E ���UUE���EPhS@ ��YYu UEEE�<���h����Yh0���j��YYj ��Yh��h��. ��YYEx u ��Yj�j�j�j��E���}�t���1Pj�jD �� E~71 }֍< ��U9Wuuj�Vj0��G����E���F˃=���t&������1 } ������FE���=���t������ht��j����YY=���P���}�F���1 }:< ��C ��Et'x�tP:�t�u? } uVd���YYFR��E����U����������U������U$��=$��uj� ��Y�����U4VWu U< ��EP ��Yy UUY ��E=uh���j��YYj ��Y��}���u ��Yju ��YY ���Pju �� 5 ��h���EP ��YYj6EP� �� j� ��Yj ��YjEP ��YYx j� ��Yyjh��u �� j_ ��Y~ ���V :����{ ��E=u2h���j��YY������jh��u �� j ��Y}�u'j  ��Yv ��YV 2j��YYj ��Yj�EPut �� 9Eu}�g���h���jz��YY6jo��YYh���ja��YYV 2jS��YYh���jE��YY������jh��u �� jT ��Yjj�j ��YYv"��Yjjf ��YY ���PjjU �� }�tV2j��YYjh��u �� j��Yt��tUWu��Yjh��u. �� x���! ���u��Y���6j��YYt�������u��YB |)h���j>��YY6j3��YYh���j%��YY3j��Y)uS��Yt��tu6uj�������_^U���VW}h��pP���B��:/uh��W7�� ���1���p ��Y���P7 ��YZ���=���v��$���UpEP��YYh���EP��YY7EPs��YYh��WEP�� =��uFl_^U0VW}j0j�EP�� ���h��EP9��YYh��EP)��YY���j uEPT�� ���j�h��(��YYƅy =����h��j��YYx��U Bk0j�PV�� =tj0EPV�� =uh��j]��YYV|��Y.��Vp��YE=�����jh��EP�� ,����UfUfUj���YEp���jh��V��YYƅx0U Bk0j�PV6�� =tj0EPV�� =u=��th��j���YYj���V��Y^���T����h��h����YYƅxj0EPV#�� =u=��th��j=���YYtVW��Y l����_^Uu q��YPu u�� UVWu=��h��VYYu VYYh��VYYW^���YPVYYh��VYY=��_^�UV5��Nx  ��^U=���t��u��Y�UVux95������^U=���x 5��5��Y��������U=���xj�h����YY��y'j5����YY ���Pj5���� 1U ��( �� ��( ��=���u/h���h(��5��u�� ��1V ��(��= ��( ��u1< �� �� �� �� ��= ���u ��( �����U} t} u���1UV ��PYt ��}�u ��:#u1b���5 �� ��U ��:�u1D ��: t(}�t :"u* �� ���P_YtU�>�u1^UV ��U ��P'Yt �� ��:"uR ��jYƅt(>"t#= �� ��u1{��� �� ��0ʋ ��:"u; ���0j�Yƅu1C= �� ��u13 �� ��0= �� ��u1 �� �������E^U=���y _y1Du17j�RY ��tj�AY �� �� �� ��UVƅtu69��YYu^�U$UUEPjj[�� ��U(VuE����E����V֋RUV֋RU ��E  ��UUU UEPj7j�� ^U(VuU @t*u��Y���EU UV֋RUUUEPup��YYU UEPjj�� ^�U$UUUUU UEPjjk�� �������������������������+��������+�����;�����W�������������o������������������7����������3�����c��������������������UW}E Mr/���u'���uĉ fE_]�����&��������F��������UVWa��E_^]����������f��������T$ ���������UVWM#��E_^]��������U$Vu UUuV֋RUV֋RUEPjLj���� ^��U$UUU U5EPjMj�{��� 6EPjMji��� $�����U8��h ����UVuY���ƋU rU MJwU uRYY^UVWuU VVu��YYDžt~~�yVډ��F_^���U$UUEPjj� ��U$UUEPjj� ��Uj�j�u UVu x~�� ���5juYYy9uuVYVj�u ^���ULVWE����1E����E����U UE8�t+0Y���E9uvE���EEE͋UUE8�t(0Y���E9uvE���EEЃ E V!փ}�u s�����K��VC��YE=u�����&��UEUUU}׋U UE8�t=+UEEE0Y���E܋]P3WI�� }׃E뻋E�����EUUE8�t=+UEEE0vY���E܋]P3W�� }׃E뻋E�����EU9v�Gu-Y���EuUUȋUUE����E����EPj;j� R��Y_^���U$EPjj� U$UUU UEPjj U$UUU UUUEPjj yEU$EPj*ju yUEUMJ1��U$EPj>j�= U$UUU UUUEd��EPjGj� ���U} v�����M ���E 1U} v�����M ���ҋE!1UE�����1UE��1U} v�����M ���Et���1��UU$VWEP��YEPEPj��� j�YƋ}t9uvE��EPYE����EPEPj WYUUjEP=��YYEPJ��YWj�]YZ)‰j�EPj j�EPj�� t9r)օu j��YVYU)_^�U$EPj jQ y}�tUEEU$EPjj� y}�tUEEU$UUUUEPj j� y} �tUE EU$UUUUU UEPjj ������������������z��USE] ���![]USE] ���![]USE] ���![]UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVW}u M���������������U}�x}~u���P���YYU$��9Ut*UUEPjj� y U��1UVW5����}׃}�~9r }�y 9vWYu_^U$EPjj� U$UUU UEPj%j� U$} �uE���E����UUE UEPjJj�I y}�tUEEUHVuUVUVUV UVUЋU UEP���Y^UVuEPCYj�EPjM V �� ��5 ��h ��jKj� ^���U$EUEPjHj� UVW}u M)9r/r uu fE_^]t|�������������{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������CTRL-ALT-DEL����now�shutdown����-���console�sh /etc/rc��start���bootopts����/etc/rc�sh��/dev/log����/dev/null�����������������������������: excessive errors, shutting down ��init: ��: bad exit status ��: ��init: ��fork()��/dev/���fork()��/���/usr/bin����/usr/sbin���/bin����/sbin���A��������Q��A��A��A��v��A����, ��������^��, ��^��8 �������������������~���reboot�� ���: ��init: ��unknown error��� ��������� �� �� �� �� �� �� �� ��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�p�����F���^��I���^��M���L��S���L�� ���������������(���$���d������/etc/utmp���/usr/adm/wtmp��������������X���P�������������������$����������������SSSS����/etc/ttytab�����Unknown error���0��$������������������t��P��@��,�� ��������������������l��X��H��8�� ������������������t��X��D����������������������0������������������p��\��D��0����������C���p ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .��������������..������������ bin����������� run����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .������������� ..������������ add_route����� del_route����� dhcpd��������� hostaddr������ ifconfig������ in.rld�������� in.rshd������� inet���������� tcpd���������� tcpdp��������� nonamed������� ping���������� pr_routes����� ps������������ rcp����������� rsh����������� telnet�������� urlget����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���S����������_������1$T$L ����su;SSSSu �� �� QRP�� ���P�����U���VWE����E j/02��YY��u ] ����h��5��2��YYu ������Bh��5��1��YYu ����� 5��h��hd ��/�� j��YDž|����Džx����Džt����Džp����E����E����E����E����E����h��u uy'�� E=$����|�t��Dž|���x�to��Džx���릃p�tU��Džp���댃t�t;��Džt���o}�t!����UV}�t����U=}�t����U$}�t����U }�t����U��5��h��hd �� .�� jh��Y���EQ��U9, ��th��|�tx�tQ��|U|�t}�t }�t}�u(��}�t }�u }�t��UUuUUUU}EPuh��YYu#u5��h��hd ��A-��j��YE����E����Džl�������EPEPVg�� t Džl���WEPVT��YYuGV ��YEtP U1EPV��YYu!V5��hx��hd ��,��j��YMMEu}�tPE���GE@u E��8E u E�)u ��YP5��hT��hd ��F,��EU҅UtEl�uUU}�tCl�t��EPue��YYu#u5��h8��hd ��+��j=��Y}�t?j�EPu�� EU:�u}�$u5��h ��hd ��+��E���u h����YDžu ��jW9-��YYE=u.5$ ��6��YPW5��h���hd ��6+��j��Yp����u��YP}�t������P=���u������Ph���+��u��YPh���v+��YYup��YPh���`+��YY}�t=���uuh|���B+��YYhx���6+��YE����UUȋUŰUUЃ=���uE1Eԃ=��u t�t1���EE����E����=���u'EP}�t,n(@)n(@Pu+�� E%EP}�t-n(@*n(@Pu+�� E}uV5$ ����YP}�tI���O���P=���uS���D���P5��h\���hd ��)��j��Yj���Y_^U=���u����P=��u(��$��P=���u4��0��P=��uH��D��P5��hP��hd ��)��jc��YUVu uQ ��YYu9uK��Yƅu1+~t1!~ t1Vj2u *�� ���^UVWj/u*��YYƅu1����FE���EPu ��YYuE����j EPVw�� 9ut U:�u vE����N/}�u1m���UE u1 ���)ѺУ������� ʋ ����� ы����� ʋE���_^UV5 ��Nx ��^U= ���t ��u,)��Y�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVux95 ���� ��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+$ ��"���}�t}�y��� UU_^��U8VWE���U UUUUfRft��t�� t����� ىM؋UfRft��t�� t����� ىME<��E��u }����}�`���uuVuuS ��Džyp�����1��W΋U��u&��Y���ljUUU)UVuV ��YY���ZMԃ}�~DVuV ��YY���Z߃}�t&UBt p����� p�����1+��E��E���������E ��E������� ��E����M��9u��uuVuuC ��Dž��V9 ��YEV, ��YEV ��Yǃ}u@ց}8��sUEEuY%��Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U������}�u}t }�t&9=��t U9UtQ=��UŨ}u���1��}�u U��uut$��Y���ZЉE���E1UU=��s-UEȉEWVR#�� UUE;}�tE�����E������� p�����1_^U��VW}-0���= ������>����N>.���W��Y@��=up�����1���=���������������������� ��@���������� ����X-0���= ���r>.uF\h����PjjWN ��y1j��Pi _^U��VW}}t1���PGPGPGPh��P3!��h���Pj jP ��Ey1HjuP ƅu1*UVU V  ��@��������@��_^��UVW5x��P���Y���Džt-u7!��YYtw>�tu6!��YYt=x���uD���_^���U=D���uh��h����YYD�� 5D�� ��YU x��U=D���t5D����YD������x������UVW=D���u!h8��h<��k��YYD��u1��5D��h���hH���� Eu1���U:#th4��u$��YYƅt�UL��h0��u$��YYƅt�F> t> uFh,��V$��YYEt��EV��YX��T�����\��P��׃}�tut8>�t3> t> uF��s7h(��V$��YYƅt�F����L��_^���UVuEPV���YYtE$ �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU L��E>��} �tF=�� ����� ً����� ʋ ����� ыE ���_^��U(VWuUU1E ���>0uE���F>xt>XuE���FUj���E-0���= ���sE-0���UF̃}u>E ��Dt1E ���]aPsa���A���Z)‰F눀>.u!U9Ur }���E܉8EF:>�t ��u S���E܉8EUM)ѻ���șE=���v'1E����U9UsU؋T E_^���UVuFPFPFPPhh��h������^UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#Ut��<���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��:��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��J9��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW��u��=u ���h����Pj�j�j�uu uj���$ƅp��������uuV�P��ƅyp��������}Gu^fWft��t�� t����� uL0p�����7p�����+p�����p�����W��a7��_^UVWE������u��=u N��$ ������p�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u ��€u$}����N>.�������������?�q���uuuu 7u���E~���=$ ��;up�����l���=p��uE=p��t =p��u�����t놃}�t"uuuu j�u%���E~}�t p�����_^U��VW}} �uBW��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h��PM��uuuu_^U��VWh��YEth��u��YYEu1���E�uh���P�� ���>�t ��uF>�n����uP. ��YYuF ��u>�tDG?�t ��uG1҈��h���Vh���� u ��Y�� u ��Y1_^���U@��VWE����E����E����UUЋUUE=�����u��=u ����u } ���~���1EUffUE������9UY��E������9U;��}�T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Dž������U= ���y2UMEPU��P4��w��  ��=����#U ft��t�� t����� ف��fMjEP5 ���� =���t$$ ��U5 ����Y ��^��u u5 ���� 9E t$$ ��U5 ��R��Y ����}fE�U܅t2EPW5 ��8�� ƅ~U)��fUU܅tB$ ��U5 ����Y ��}<��}���E���M��}fft��t�� t����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5 ��\�� ƅ~U)��fUU܅t$$ ��U5 ����Y �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5 ���� ƅ��U)��fU멃= ���y�� ��y$ ��U'��UMU��P4��u u5 ��(��9E ���M|��Uԃ}�~ Eԙ=��Eԃ}�E���uuu5 ����E=u=$ �����E������E���UM9u�� u+UBt"5 ����Y ��E���}�t��t}�u �����u5 ��:��Y ��Ea���EE= ���x5 ����Y ��}�u}�u $ ��;���$ ��=��� Uȉ$ ��_^U= ��t5 �� ��Y ��U$VWh��TYDžu��jW ��YYƃu$ ��E���E1��UUfU fUEPh0n@V> �� E=u$ ��EV ��YGE����EPh2n@V �� E=u$ ��EV ��Y E�����_^UVWuut.Vu u �� Dž U)U U )΋E_^U VWh ��4YDžu��jWh ��YYƃuEE7��3EPh@n@V: �� E=u $ ��UV ��YU$ ��_^UVW���UR\ ��Yƅu$ �� ���w���UWfUfW fG ����#UfWuu FP �� ���URVu �� E$ ��UV��Y}r UUU$ ��E_^Uh&��jL��YYj3 ��YUVW���UR ��YDžu$ �� ������h&��j��YYEu ��YE���URWu �� Ƌ$ ��Uxw7~1W?��Yj� ��Yuj��YYu ��YU$ ��@RGPu �� W ��Yj�_ ��Yujd��YYuJ ��Y_^��UVWEE�P��YNjE E �P��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P]��YNjE E �PK��Y9uuąt9}���t��� t1_^��UVW=0 ��a���U9, ��} , ��M :-u, ��z�u ��, ��M hh��4 ��YYu, ����, ��M 0 ��ǣ��:tWu ��YYƅ}���=( ���t=E hd ��07��YYhd ��hP��&��YYhd ��W��YYhd ��j ��YY, ��M 0 ��0 ��:�u, ��0 �����?��� ��F>:���, ��M 0 ��C;�t!A , ��M 0 ��C�����, ��U9, ��|W=( ���t=E hd ��0f��YYhd ��h,��U��YYhd ��W��YYhd ��j ��YY0 �����?���`, ��A , ��M ��0 �����7, ��M 0 ��0 ��:�u0 �����, ��������_^���UVW11}U9| ��u | ������F߃| j���ug���YtUr��YtURtUz�t rB ��Y}4 ��t}L ��t}d ��t u ��Y_^�UVWuE����u41}%<| ���t4| ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv5�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv?�� E����U9Uu1 N _^UV1}*<| ���t| ��B���t 4| ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���g��YF~�uN NF ���1}9<| ���t,| ��R@t| ��B���t 4| ��YGƒ~�uF��FF ���VVv vvU�� >�uNN FFSX_^UVWE����E����11<| ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �l��$��U :�t! E���E E ���#��U uuu��YYEy@Ut8h��uQ��YYE~"��� tu��Yuu��YYE}�y1]���j��YEu u��Y1A���!uE�����UMJUzUB����U| ��E_^UUUuuu �� �UVu JxUʋFF Vu��YY^�UVWu }E����?�t:JxG^FSX GVP��YY=uEE_^�UU UhL ��uu"�� ���Uj�j�u �� E`�UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj���YYEUuu hu�� ����� ����� ����� �����o ����� ����������UVW}u M#���������������UW}���0))ϊE tu1_]XG_]����������������������V��������UVWM#��E_^]��������UW}0OE uG_]1_]��������UV��U9��wU�����9��v$ �� ���16V ��Yt1'��rF����5��&��Y5�����^UVW}�u1���E����}������UUs$ �� ���1���=���u8j7 ��Y=u1���V!փ5��5��F����E����5��O���VU}9}r69v2W9UvUW~>}�t E��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=��<���9}r79}u+UOJ}�t E��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���15��t 9ur6E0tU U��tU9ru NJEtU9Wu RWE_^��UVu~  u$ �����6EPj ��YE����U UEPEPV �� yE^��UVW}?�t!u >�t 9tF>�tG1_^UUas U E���U ��VWDž����Dž����|�����������������������j�h< ����YYup�����g����#Jfh0 ��oYƅth���Vh��8 h ��h ��<YYE(��uh���Ps ���jh ��P�� _����u> t> uF>�t> th���Vh�� j h��1YYƅt�Dž����djh ��PD�� ����9> t> uF>�> h���Vh�� j h��YYƅt�����7E����>�t3��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h��PO�� Q=��D> t> uF>�(> ����PVYY��ff U����uY=���u"����ff�������=���u=h���P��YYu&j.P2YYƅtFPh��<��YY�]���������E����>�t >.uEF��}|��sj.VYYF7M���� ��1_^���U<VW}$�t}( s ��j j�u$F�� }$��B��f��f��ft��t�� t����� ف��fG�G�UxO шO��t���1W ˆW��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu tEy ��u֋U(+UU(VuhYYVuZYYft���t�� t����� ف��fO}�`��}�V��m( učEPu(VuEy 2��u֋U(+UU(Vj YYVuYYVj�YYVj�YYft���t�� t����� ف��fO ��� ���U9U(} ����FVuDYYVu6YYVj�DYYVuYY}�tuuV uft���t�� t����� ف��fO D ��Ep��+U$_^�U$ ��9Ut*UUEPjj�d��� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^UVWuU VVu��YYDžt~~�yVډ$ ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$UUEPjjc ��U$U UEPu��YYEPjj5 U$UUU UUUEPj6j ��U$UUU UUUEPjj yEU(VuU @t*uY���EU UV֋RUUUEPu��YYU UEPjjo ^�U$UUUUU UEPjjC ��U$UUU UUUE8M��EPjGj� ���U} v$ �����M ���E 1U} v$ �����M ���ҋE!1UE�����1UE��1U} v$ �����M ���Et���1��U$UUUUU UEPjj/ ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U X ��3��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���Ep ��n��uVuu ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U ��}��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U ����JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEИ ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P ��E6U U RU U RUEE�E �� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu } ��-��~�y U��Vu C��V€tu ,��fN���V���~����L ��u>5P ����Yt.h���<YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vw =u N 3uvvl uNN N_^���UVWu1fϋV€t}u ~�tu>����F���tV YU )uRv EVt tfVV}u1_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�*��USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����UVWaE_^]����������L$ �������Uh ��hd ��YYjY��U Vj�h ��EYYƅyHu uV2 EVY}u"U JU�j u4YYEt��1^���UVW5��h��Y��DžD���7u6YYtw>�t6uYYt} �tu w YYu=���uA��_^UVuY���ƋU rU MJwU uRYY^U$EPu���YY1ۅÉ�UHVuUVUVUV UVUЋU UEP���Y^UVuEPkYj�EPje�� V0��(��58��h��jKj� ^���Uu hT$u U= ���uh ��h �� YY �� 5 ��=YU ��U= ���t5 ��Y ������������UVW= ���u!h ��h� ��YY ��u1D��5 ��h���h@�� Eu1��U:#th ��u ��YYƅt�UD��h ��u���YYEt��EU: t: uEh ��u���YYƅj�Fu7��Y%��ft��t�� t����� ى L��5P��T��H��h ��VW���YYƅt�Ft8>�t3> t> uF��s7h ��V���YYƅt�F����D��_^UVW}Utu >�t]9uFG1_^�U$} �uE���E����UUE UEPjJj�] y}�tUEEUVuj j�V# ^�+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ ��tPXP�����R�� ���?���M��D�����I���4��d�����g�����i���e��m�����n�����o�����v�����%s: NWIO%cIP%cROUTE: %s ���� ��� at distance %d�using gateway %s����with netmask %s ����output��input���deleting����adding��%s %s route to %s ��%s: unable to open('%s'): %s ���/dev/ip�IP_DEVICE���%s: illegal metric %s ��%s: illegal netmask'%s' ����%s: Warning: Martian address '%s' ��%s: unknown network/host '%s' ��%s: unknown host '%s' ��%s: getopt failed ��iovDg:d:m:n:I:?�Don't know what to do when named '%s' ��del_route���add_route�������-m metric ������[-D] �������[-m metric] ��������[-D] ���Usage: %s [-o] %s-g gw [-d dst [-n netmask]] %s[-I ipdev] [-v] -i %s-g gw -d dst [-n netmask] %s[-I ipdev] [-v] Note: <dst> may be in CIDR notation ��unknown error���%u.%u.%u.%u.in-addr.arpa����r���/etc/networks��� �� �� ��# ��r���/etc/networks���}��������}�� ��&��G��%d.%d.%d.%d�U����������������X���������P�����_�� �������������������������������������%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��: option requires an argument -- ���: illegal option -- ����--��c/�����a���P/��r���+/��w���:/��/�����+���/��b���}/��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��=���������;��A=��!B����� ���A��@���A��C�����X���C��b���B��d���B��i���B��o���B��p���C��u���B��x���C��C����� ���C��#���C��+���C��-���C��0���C��F�����L���D��h���D��l���D��D�����E���F��G���pF��X���E��b���E��c���WF��d���F��e���F��f���F��g���pF��i���F��n���?E��o���E��p���E��r���F��s���E��u���E��x���E��(null)��cannot print floating point ����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services�������������SSSS�����������������������������������������������������������������B���������������4 ��L ��d ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���������������|��h��T��D��8��������������������|��l��X��D��0���� ����������������|��`��L��8������ �� �� �� �� �� �� �� �� �� ��������������l��X��H��4�� ��������������C�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���p����H������@��p��1$T$L ����su;SSSSu���� QRP42�� ��P"V�����U5$��BY��YPu5<2��h<���hX��褐��UuYjU��YUujV��YEu hH���YEUVWuF<iuF<pt3j EPVX�� 9utU:�tr_^UV195D��v�� 9Mu ��F1^UU���}���+U���}��U���}�UVh��u5���� ƅy=$��t 5��YA}�t9fE�fE��E����E����EPjV茐�� y 5��Y^UVj@u u蓐�� ƅy 5��TYu1@@u E 8]�t+5��5<2��h`���hX��迎��u���Y1���^Uj@u u[�� xU h2��9Jv1��y 5��YU��Vj�uuj�j�j�j�TP9�� u1&��jYƅy1��j�PPjTPX��jPLP�� EEPVYYE���}�tU3ULuU9U uu uEPg�� thUp2�� p2����� ًp2����� ʋ p2����� щM9MhEPxP�����NV~��Y}�tEU9h2��r|1^UDVjeYƅy1���EPVYYuV(��Y1���U9UuڋUp2�� p2����� ًp2����� ʋ p2����� щMċUUuu EP蒏�� jjVٍ�� =u 5��YEPVYYV艍��Y���^UXVWu %]��YEtxt#u 5<2��h���hX����jEQ��Y1UR<�tGt$Wu 5<2��h���hX��ċ��j Q��YURj2EPƎ�� jBYƅy 5��YE����EEPVYYY���}�tMU9Uu)u 5��5<2��h���hX��;��jP��Y}�e���}[���UUSU9UuKj@j�EPO�� E]�E����j�uVW�� =u 5��/YEPVYYE@=}�tP}t!j�uV�� =u 5��Yj@j�EP΍�� E]�UUEPVYYV訋��Y_^U VW=D2���$��=T���u^h���h���貈��YYDžt4聋��Ph���W�� =tW葄��Y=u h���PYT�����EA��E���h2��p2�� p2����� ًp2����� ʋ p2����� ыU Jh��u5���� ƅx:iE$��j�PVъ�� =t h$��u V �� x V脊��Yy=$��t 5��Y_^U��VWd.��j�5��y��YYEy 5��JY1h$��Pu^�� =$��u&�tVhd����YYPE?��YF붃�y 5��Yuˉ��Yj�YER��5h2��h@��諈��YYPu2YY���tދp2�� p2����� ًp2����� ʋ p2����� uh8��P͋��YY^uh,��P賋��YYD9=h2��vh2��)Rh$��P�� +h2��Rh��P�� P^��YPh ��譇�� 19~5Ph��芇��YYFh@��j I��YYuf��Y_^Uh��u[��YYEu#u5<2��h��hX����j(L��YU��#JUVURP��Yƅy h��Yuu VW�� EyURRYj ��YV跇��Y1}�^UXVWu }E����=D2���t11��Vz�tBGEj�EPj5vP��t U MEEPEPj=vbP��u5VJMVNBPQEP�� UU؋VJAMEPEPj<vP��uE����j�EPj6vO��uWUj�EPj2vO��uE����G��V:��Jz��}�tjGPuه�� [��EPE>��YE����}uVR UP���Uj�uj�uuuurK0�� URRUuuuu? EtE���}�t&Uj�uuuuuur/�� u EP=��Y}���Uj�EPj3rN��t���juȍEPM�� Uĉp2�� p2����� ًp2����� ʋ p2�����  h2��M9 h2��,��E ��}�t*uA[��YP5<2��h ��hX��袃��jH��YE����E��E}���@���h2��RuuuN��EP<��Y��E}�tjEPu�� uVz �tM9J t Eo��}�e��}[��uuuu?��EPQ<��Y0��}����}����jEPuh�� ���5<2��h��hX��舂�� E����U9Us!UUPh��hX��]�� EuY��YPh��hX��<�� EPEPj8vL��tuuh��hX�� ��hX��j ��YYuj�j�uEP`;��YB}�t5h2��uuuEP7;��YEP+;��Y ��Ef��}���VMIRQVMIRQURB�VMIRQURfB��VMIfR fQ URB ����}u1EURB}u URB����VMIRQVMIjRQ�� UjGPj6r��}�uUjEPj3r��}u<Uj�j�j3r��Uj�j�j:ro��Uj�j�j;r[��}e���URj@j�,R蛃�� URh���j�lR肃�� URh4��h������Rc�� Uj!h��j8r��UjEPj5r��}u,URǂ�������URh4��j����R�� UR O UR f \2��fJVz�t"MI RQUR f \2��fJ s���VJ ���t UR BUR f `2��fJ DV :�tMI QUR f `2��fJ UR BUR f `2��fJ UR fB ��UR fB$Uh��RFP�� EP?8��Y4�����GI���V:uAz�u;OJV O V f \2��fJV O$JV f \2��fJ EX���GL���V O$9 uBV:u:B����V O V f \2��fJV BV f `2��fJ E1_^UH2��H2������ 0��E骞��U5<2��hH��hX��}�� j C��YUdVWEE����E <2��j�K��Yh2��d2��H2���������9}��U :-��Bu WZYU:-u z�o��U:�tO��U:�u9}u?Bu WZYUU��E��뾋U:�u9}u Bu WZYUU��E��뉋U:�u9}uBu WZYUU��E��QD2�����U-0���= ���1j EPu E�� D2��H2�����U-0���= ���j EPuD�� H2��8�����<�����@�����EE���關��@��<��8��~=<���u =@���t*9}~Bu WZY45<��KYYj�@��Y9}t=8���t Aj�@��Yh��4Yf\2��h��#Yf`2��E��EP|��YE����j�EPj |�� j�EPj |�� 1��EPEPW9��YP9�� E=������4��ƋD�����щ D����jjV4�� Z���~Zt������F=H2��r2~ux��t��PFPG��YVPRh��z��jV$8��YY}�u;U؉VUԉV=H2��r&vv��YYPP'8��YPhP��Fz�� ~tV<V8V4G19=D����4��F��~�u E����FPEP��YYE���EP2��YUVj�vuȍEPjhH��r$�� URRU܅��MVRRuȍEPjh@��q$�� X��=D2��K��UrPYYU܉VUj�EPjroC��jučFP|�� Uj�EPjrHC��tjučF P{�� F ����Uj�EPjrC��tGjučEP{�� fUft2��t2�� t2����� ف��fMfE��EPvvPY6��YP7��=H2��r&vv��YYPP/6��YPh��Nx�� VVV<V8V4F F@����1EPN1��YGj�{y��Yh2��l2��19=D����4��h2��9V4c��9V8F$h2��9V<j���Ft jVP5��YYV���uA1҉V1ɉNj�RQP_5��YP6��=H2��rPC5��YPh��bw��YYVVFujjV@1�� u��jjV*1�� ��Fuh2��V,F0���VVEP/��YUrB��YURURBURBV, щ p2��p2����� ڋ p2����� ыp2����� ʋMIQh2��+V,��~�� h2��+V,%��ft2��t2�� t2����� ف��URfJURjFPRx�� h2��9V< ED���EFtURNJ ,UjFPj2rk��UjF$Pj6rU��UjEPj5r?��FPEPo��YYUjEPj=r��Ujh��j<r��Ujh��j7r��~(�tv(x��YUPv(j r��UR N UR N$JUR f `2��fJUR f \2��fJ UR fB ��UR fB$Fq���VuT4��YYEhN��0V ���=H2�����EP*��YVPRh��{t�� =H2��q���Ur*��Y`���Uh4��r V2 tH=H2��r?v$iK��YPEP_*��YVPRh��t��=H2��r UrP*��YEP"-��YFN���h2��9V8~F8F<E+h2�����E=���}E���Uh2��V49U}(U܉V4 h2��V0V4kF0F0~0@~F0@���l2��9V4} V4l2��Ga19=D�����4��F���FuHj�jV)-�� ���VR,��YVRNh��2PhL2�� ^��EGj�jV,�� _���VR+��YVRNh��r PhL2��]��E}u-=$��t=$��2tVRjYj s��YG9=D�� ��VREP+��YYFu+}��r"uw3��YtUR  `2��Z 9tF��}���{��UR:l��URz\��URzL��V, щ p2��p2����� ڋ p2����� ыp2����� ʋMI9QT��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T��T���U��U��U��U��U��U��U��U��U�� U�� U�� U�� U�� U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������URjFPRs�� ��UR UUj�EPj6rs;��tjuEPt�� UUUj�EPj5r@;��t U ME���=H2��c���u"H��YPu'��YVPRh��p��uG��YUP9Ut����Pp��YY=H2��r Ur&��YUj�EPjr:��tjuEP7s�� URr &YEUj�EPjre:��tGjuEPr�� fUft2��t2�� t2����� ف��fMfE��Uj�EPjr9��tjuEPr�� E����Uj�EPj3r9��tXjuEP]r�� Up2�� p2����� ًp2����� ʋ p2����� щMEUj�EPj;rQ9��tXjuEPq�� Up2�� p2����� ًp2����� ʋ p2����� щMU)ىMUj�EPj:r8��tXjuEPcq�� Up2�� p2����� ًp2����� ʋ p2����� щMUU}���V49V8���URRVUVUV$UV F0���h2��V4@���h2��V<V8Vu/��YYEj<0V t=H2��rvD��YPhx��m��YYV⿈V}[��F@Q��UrPYYURRVUVUV$EPvvP(+��YP+��=H2��r&vv ��YYPP*��YPh`��m�� +h2��9UrV<V8V4$Uh2��V<Uh2��V4Uh2��V8=D2��rA<���h2��V4=D2��rF4 <���V4ЉF8=D2��r <���V8ЉF<F uFt������F F@����VVVVjV)��YYjV)��YY}��F@��E���Ur97��YURURBURBV, щ p2��p2����� ڋ p2����� ыp2����� ʋMIQURfB��URjFPRWn�� UjFPj2r��UjEPj5r��FPEP+ ��YYUjEPj=r��F P08��YPh��n��YYh��n��YUPh��j8r��UR f `2��fJUR f \2��fJ UR fB ��UR fB$VuJ*��YYEhN��0V t<=H2��r3u ��YVPRhH��{j�� =H2��r Ur ��Y@���h2��V<V8V4F0���}4��@���h2��V<V8V4F0���uSA��YP5<2��h0��hX��i��U9Utu)A��YPh$��hX��i�� UEPEPj8r3��tuuh��hX��\i��hX��j mi��YY���F���h2��9V8s���}<i���Vuj,��YYtZV@Vv@��YVPR5<2��h��hX��h��F P.6��YPv$V@��YPh��hX��h��EP2"��Yl2��9V4} V4l2��19=D��.��4��h2��9V@���jjV"�� ���F@EP!��Y~ �tUVu,��YYUj$rVl t'=H2��rv ?��YVPRh��Xh�� ���h2��V@F ]���F HF ^ xJu+��YUjrV t=H2��rVRh��g��YY���h2��V@ jVt%��YYEP ��Yl2��9V@} V@l2��G19=D�����4��F u���j�jV!�� `���VR^ ��YVRNh��rPhL2��aR��E=u-=$��t=$��2tVRYj wh��YGf9=D��|���}r���VREP= ��YYu+��YEtF=H2��ru>��YVPRhx��f�� F@F V VjV6$��YYEP��Y19=D��v;4��Ft+FtV$3VVu VVF t @2�����G뽺���d2��9h2��O19=D��vE��@��� h2��9J4 @2����������� h2��9J@ @2������G19=D�����4��F���F ���=@2���u���j�jV�� `���VR~��YVRNh��r PhL2��P��E=u-=$��t=$��2tVR'Yj f��YGQ9=D�����}������VREPZ��YY=H2��rTUR 2+<��YVPRhX��d�� UR r<��YPhT��d��YY=H2��r Ur��YuuV EX���Uur Vl tB=H2��r9UR r;��YVPRh8��Rd�� =H2��r Ur��YEPb��Y=H2��r:j�de��Y9H��tj�Te��YH��-@4��Ph$��c��YYh@��^��Y=@2���u =l2��t^l2��L��=l2��u1L��Pj�hL2��!O�� =$��|h��lYj d��Yd=H2��r h��gc��Y1_^Uuuu u.��u 5<2��h��hX��b�� j'(��YUVWu f��YEEuu :8��YYt ���%��5��ƅ ��Uuuu 1L�� ���UU:�tUU:.���Vj2EPae�� Up2�� p2����� ًp2����� ʋ p2����� ыUp2��p2����� Ëp2����� ڋp2����� 1ˉ]9]UEUUGVUK4��}s ������=@2������u Y2��Yƅ���~���1V<����j4EPFd�� Up2�� p2����� ًp2����� ʋ p2����� ыUp2��p2����� Ëp2����� ڋp2����� 1ˉ]9]vUEUUG@���1_^UVg3��ƅtVjEP2c�� u3��u=@2���tjjEP92�� ƅt1^UVWj/uc��YYƅu1����FEPuy5��YYEj EPV(�� 9ut U:�u vE����N/}�u1m���UE u1 ���)ѺУp2��p2����� ʋ p2����� ыp2����� ʋE���_^UVW ���xT=p2�� p2����� ًp2����� ʋ p2����� 9M t!NVuS6��YPh��h$��._��u%u 26��YPj/h$��<b��YY���Pb��YY$��_^UVWE����E����EE�Džw���0 w0(awWAw7 P���}�uU 9Us)MMU 9UsUU Euv}�uE_^UUUju R`�� UVu **��YEtuuYY���u j u Ɖ^U,VWE���}���U<��GG����Ejph��h\��J`�� L��d��sW��P���}��݋X��U}���Urh��FP0F��YY��VT��Y=�����R@s��B���b��B���O��R@;��R@%��j j�R%�� EUU܋j j�R$�� Ej j�R$�� EE����}sU4d��u6E��YYtE݃}J���}���=���}3���}u}t}t}t}t}r}w }���v v vh��hX��j[��j ��YU<��U؈WUWUWUW v vhd��hX��&[��jm ��YEUE����}s!Ex����U  E_^UV\��$��s ~�tuvD��YYu1^U5X��j�5��Q�� X��PmR��Yt U(��VWu Dž����hp ��FPC��YYuEVUR��Y=���u B���t v vhL ��hX��Z��jc��Y6Dž���FP YEu$FPv vh( ��hX��Y��j"��YUBt$FPv vh��hX��Y��j��YDž�����V��>v��tG���u?�t$FPv vh��hX��NY��j��Yh��GPP^]�� h��Pd]��YYZЉ��t1G���u(h��GP;B��YYt8h��GP'B��YYt$FPv vh��hX��X��j��YU9s#ft Ft���1��t G���t$FPv vht��hX��FX��j��Y/���j PGP �� -���=���wi:�u^ ���+Ѻp2�� p2����� ًp2����� ʋ p2����� щ>uGPP u$GPw wh@��hX��nW��j��YU9wjPdZ�� B��tWu$FPv vh��hX�� W��jQ��Yj�j�GP�� UJU9w'ыꋍ�u���tG���u?�t$FPv vh��hX��kV��j��YGPh��P =u$GPw wh��hX��"V��ji��YUJ��v��?uU9v v vh��hX��U��j��YUJt=UJ1t(UBPv vhh��hX��{U��j��YUz�t=UJ9v.UBPv vh0��hX��5U��j|��YUBq���UMYJˉUJuU Mj�Q)X�� )ыU]QPSW�� ()ыUQPPuw_^U���VWE����Eu��YUU���щM X��L}� ��UJ|�uMUJTrUJTMITE����hD ��FPH=��YY+��VK��Y-���=�����B�����REPYY|=��B�����RYt=uVK��Y=���vDRYt=g��VRK��Y=���U��B���B��|9U��uEPuU�� q��tt}$�tU$ 9tP��:tt?Wxu xEP ��}�t U9U ��Up2�� p2����� ًp2����� ʋ p2����� ыU p2��p2����� Ëp2����� ڋp2����� 1ˉp9]t��UMJUpUX��v vh ��hX��Q��j��Y3��h ��FP;��YY���Dž|����xx�P���x8�tExB���u6}�t uu RuU�� u Dž|���xx룋x9t x8�tv vh ��hX�� Q��|�r��xUd��h ��FP6:��YY���VH��Y=������B������}�!��EPEPR{ L���U3UU��j�j�ju��ujEPjuIUMJU��u REP\ ��U9U��MQU~��v vh ��hX��O��j8��YY��ht ��FP+9��YY:��VG��Y-���=������B������B������}$���RYPlYxu*Rq shL ��hX��NO��j��Yj�REP] u0 Rq sh ��hX��O��jK��YxMJU$9xV��UMJU?��}u �� ��Pv vh ��hX��N��j��Y��h ��FP7��YYuPVF��Y=���uB���uU��}��v vh ��hX��;N��j��Y��h ��FPu7��YYu3}��FPv vh| ��hX��M��j;��Y\��ht ��FP.7��YY5��>^���G���uUGPMY|=t>|苽Yxu$GPw whH ��hX��sM��j��Y? U$xWfE��Y=���uBG���u9h@ ��GP6��YYu%}$���xJxJ��WE��Y=������G������h8 ��GP66��YY���B���r���}$�3��u REP u*Rq sh ��hX��L��j��YxJxJxMJ$���W^D��Y=���uEG���u<h� ��GP5��YYu(}$����xJɀ���xJx���W D��Y=���u9G���u0h ��GP35��YYuB���u}$�t<M$Q(1v vh ��hX��K��j��Yu Vu }�BUB������=X�����Wxh ��R4��YYm���xEC��Y=���u6xB���u%B���tURQV4��YYu&+xxr qh ��hX��J��?cu1 xBE URU}u&UMr qht ��hX��J��j��YU���щMML'j�EPju��u1���juEPWM�� U 3UUt1���uYEt���j.uM��YYƅt�Fj�j�j ub��uuM��YPuj ut+j�j�ju/��uVM��YPVju���_^Uh��}sE1ZUh��} sE1ZU VW\��$��{��F���UUVNʉMVue>u UJM>u Uz!��>u Uz��>lt>,u6j�EPj4u<��t>lu������U ��19}v U:�uG9}u$��EPEPPu����~�tvh ��H��YYPh ��H��YY19}R��:��uuh ��jH�� }ډuW���ZYр9�u �� ��P:H��Y믋UjREPJ�� uS��YPh ��H��YYE����VUuW���ZYыU ډUMuuh ��G��YYFt>�uuYPh ��G��YYF>5 uYPh ��G��YYuh@��j 8G��YYuW���ZYPh ��GG��YYV ��g��h@��j F��YYy_^���UVE8�u2h���!YƍV@VV VVVE0^UE8�t0s��YE�����UuYE EE �����UVjD謵YjDj�VxI�� F(����F@F ^UVu~�tHPhL2��K3��YYP4G��YF�F����FPTY=H2��rFPh �� F��YY^U���VW}E����E$��$��s7N9uV9U u w���V��U9V uVUUz�t}�u$�� ���1 ��Gu;DžL$��L8�t L苅L8G����WWE 9=$��uUz�t0h2��9U~%l2��9U} Ul2��$�� ���1��WWW$��uYuNU P��Ph ��FPD��wjFPE��YY��=$��t=$��t =$��u1��FP肳Y��W]ShnHPrE�� yPBE��Y1��WDUHDž@���@�~$@HHD DE3��]Shn@PD�� >��5$�� ��YPFP5<2��h ��hX��[C��j��Y��Dž`3�E�EE�ƅh�E`Sh"n8@PD�� ���5$�� ��YPFP5<2��hh ��hX��B��j+��Y���DžP;��3f`2��fTDžP9��3f\2��fTPSh@n@PC�� =u@5$�� ��YPFP5<2��h@ ��hX��]B��j��Y  ��E c��U Vh2��V=H2��rFPh4 ��mB��YY���_^UV$��$��s#U V9uV9U uVY^Uuh ��h$��:B�� $��UVWh��u#C��YYDžy.=$��t=$��t =$��u ���`���uӰY=D2���t ���>EPh!n WB�� y5$�� tu虰YUE UE1WiB��Y_^UV=D2���uTjuxB��YYƅy uMYE���U UUUEPh n @V5B�� y uYVA��Y^���U VW}UUU UE�EfWfUfWft2��t2�� t2����� ى���tj�WV���ZYZVWj EPj�A�� PA�� _^UVWuv EP���`��>E��E���}�~MEEGU >UE���}�~MEEGfB �VEVB�U��ft2��t2�� t2����� ف��VfJVfB��VfB@�VBVB VfB ��VB ����VBjvj�@�� %��VfB VfMf VfMfJU��ft2��t2�� t2����� ف��VfJVfB��VNvrq %��VfB_^UVuJ uBV:Eu:z u4jvj�@�� =��uVNvrq =��t1}���VR UVRUVffUVfRfUfE��VfRft2��t2�� t2����� ك��fMEPv ���Y^�����^UVWEUj<j�u@�� u��E���}�~ MGFU uzE���}�~ MGFUfB UfB�UfB�UBUBUfB�U uzE���}�~ MGFU MjRQ?�� U MjR&Q?�� _^UVWEUJ �����UJ������UJz���UJ���g���U MjRQ?�� G���U MjRQ>�� t+Uu zE���}�~ MGF���1_^UVUrREURB F�F����fF��jVj�{=�� %��fF^UVUrREURB�� F�FFft2���t2�� t2����� ف��fNU R VF fF��jVj�<�� %��fF^UVWUz? u)1W9~WMII 9 u URB F1_^��UV5��Nx x2��^U=���t��u;��Y�UV%��U9%��wU%�����9%��v$�� ���16Vt$��Yt1'%��rF����5%��&��Y5%�����^UVW}�u1���E����}������UUs$�� ���1���=%���u8j#$��Y=u1���V!փ5%��5%��F����E����5 %��O���VU}9}r69v2W9UvUW~>}�t E %��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����= %��<���9}r79}u+UOJ}�t E %��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV,;�� u���Y_^U VWUUb���15 %��t 9ur6E0tU U %��tU9ru NJEtU9Wu RWE_^��UVux95�� ����^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+$��"���}�t}�y��� UU_^��U(VWU���cSct1���U���UE4��UlUE����U,UE����1���tTT9{���UF}���g���}�u1FSXE؋U 9Uu }�tE0}�tU؋E���2}4utE���tE@���uuGb1_^�Uh���j�u7�� Uǂ���cScUh4��h������R7�� UVW} �~ } ���|1���u���U$��9]���>tXV���9U u=U)ʉ$��RQV(7�� UWh��� $��P7�� 1뒃}�t4VUM$��9wU FUFuuV6�� 1���_^���U VW}�u1e���1U���jEPu Džx���~17}U::u u U:�t1%��UUF뢸%��_^��UVWu} u jYDžt+FPFPFPFPFPPh ��W'3�� _^Uh%��uYY��U8VWE���U UUUUfRft2��t2�� t2����� ىM؋UfRft2��t2�� t2����� ىME\&��E��u }����}�`���uuVuu ��Džy2�����1��W΋U%��u5��Y���ljUUU)UVuV$ ��YY���ZMԃ}�~DVuV ��YY���Z߃}�t&UBt 2����� 2�����1+��E%��E�����%��%��E,%��E�����%��,%��E����M��9u��uuVuu��Dž��V ��YEVt ��YEVg ��Yǃ}u@ց}X&��sUEEu}4��Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U%��%����}�u}t }�t&9=%��t U9UtQ=%��UŨ}u���1%��}�u U%��uu3��Y���ZЉE���E1UU]*��s-UEȉEWVRg2�� UUE;}�tE�����E�����%�� 2�����1_^U��VW}-0���= ������>����N>.���W��Y`*��=u2�����1���=%��%��%��%������%�����%�����,%��`*��0%������%��,%��%��X-0���= ���r>.uF\h����PjjW ��y1j��Pi _^U��VW}}t1���PGPGPGPh ��P+.��h���Pj jP ��Ey1HjuP ƅu1*UVU V ,%��`*��0%������`*��_^��U���U=d*���t5d*��'��Yd*����������U VW=d*���u7=���u1��h$��5��[+��YYd*��u ������,+��d*��d*��:�xd*��X@ 5d*��)��YE=t} t ,,��sF봃}u%5d*��&��Yd*������������D,,��8�*��,+��= ���w>�tF>�t/>#t*(+��t"7= ���v>�tF>�t�F뺁(+������*��unh��5*��/��YYuX5d*��6&��Yd*������������5*��/��Y=���~5*��hh*��Z/��YY��h*��]*��Qh(+��5*�����YY7*������_^��UVW52��0��Y#1��DžD���7u.��YYtw>�t6u.��YYt} �tu w .��YYu=2���u0��_^UVuEPV���YYtE$�����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU (��EI��} �tF=p2�� p2����� ًp2����� ʋ p2����� ыE ���_^��UVuFPFPFPPhD��h,,��(��,,��^UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#UP�� H���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!h��F��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��NE��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW3��u]+��=u ���h����Pj�j�j�uu uj�/��$ƅ2��������uuV�P��ƅy2��������}Gu^fWft2��t2�� t2����� uL02�����72�����+2�����2�����W��eC��_^UVWE����3��u=*��=u N��$������2�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u 3��€u$}����N>.���3��������$4��?�q���uuuu 7u���E~���=$��;u2�����l���=2��uE=2��t =2��u3�����t놃}�t"uuuu j�u%���E~}�t 2�����_^U��VW}} �uBW$��Y-���Ɖ:.u#��sVWP#�� Ƅ5�*"u h���Wh���h��P ��uuuu_^U��VWh��$��YEth��u��YYEu1���E�uh���P�� ���>�t��uF>�n����uP. ��YYuF��u>�tDG?�t��uG1҈?-��h���Vh@,��#�� u��Y@,�� u��Y1_^���U@��VWE����E����E����UUЋUUE=���3��u&��=u ��3��u } ���~���1EUffUE����3��9UY��E���� 3��9U;��}���Dž����3��U=����y2UMEPU3��P43��w�� ���=����#U ft2��t2�� t2����� ف��fMjEP5����� =���t$$��U5���E��Y���^��u u5����� 9E t$$��U5�����Y�����}fE�U܅t2EPW5����� ƅ~U)��fUU܅tB$��U5�����Y���}<��}���E���M��}fft2��t2�� t2����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5���4�� ƅ~U)��fUU܅t$$��U5�����Y��������UJÜJU+U��fUU܅V��U܁���v���E܉VP5����� ƅ��U)��fU멃=����y�����y$��U'��UMU3��P43��u u5���(��9E ���M�3��Uԃ}�~ Eԙ= 3��Eԃ}�E���uuu5�����E=u=$�����E������E���UM9u3�� u+UBt"5���/��Y���E���}�t3��t}�u 3�����u5�����Y���Ea���EE=����x5�����Y���}�u}�u $��;���$��=��� Uȉ$��_^U=���t5���[��Y���U$VWh����YDžu��jWX��YYƃu$��E���E1��UUfU fUEPh0n@V�� E=u$��EV��YGE����EPh2n@V�� E=u$��EV��Y E�����_^UVWuut.Vu u�� Dž U)U U )΋E_^U VWh��|��YDžu��jW8��YYƃuEE7��3EPh@n@V�� E=u $��UV��YU$��_^UVW���UR<Yƅu$�� ���w���UWfUfW fG ����#UfWuu FP!�� ���URVu�� E$��UVY}r UUU$��E_^Uhiy��j��YYj��YUVW���URuYDžu$�� ������hiy��j��YYEu��YE���URWu�� Ƌ$��Uxw7~1WYj�U��Yuj6��YYu@��YU$��@RGPu �� WYj���Yuj��YYu��Y_^��UVWEE�P(��YNjE E �P��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P��Y9uuąt9}���t��� t1_^��U$��9Ut*UUEPjj� �� y U��1UVW5����}׃}�~9r }�y 9vWYu_^UU�UB�UVu {���95@-��tF9Et��5@-��EFEFEFUVUV$�����395@-��tF9EtM��V $��F��n5��^Uuuj�u ujOUuuj�u uj2Uj�uuu ujUj ��YU$VWu95@-��t��U t��>u�F�1P��}����j� ��YE]9$����� ��j�> ��YEE|��EPf ��YE����EPEPj �� E+U9}v}W ��Yv�����F$��V FvvPA �� F$��V RFvvP �� F$��V 1F^vPS �� F$��V F ��3��}�t!j�a ��Yj�EPj �� uH ��Y~u~ u$�����1_^UUuUY��Uu uYYEu&5T-��5P-��h<��hX��f��jYEUVutu6uAY^U VW}1t}?E0utu~6uY_^UVu6YvYv YVY^U=X-�� uT-��L-��L-��:�xL-��X@ 5L-����YX-��=uAL-��R t35$��YP5T-��5P-��h\��hX��I��jYUX-����t'Z=X-��#uL=X-��tփ=X-�� uUX-��UE�=X-��up��EP5T-��5P-��ht��hX����jYUVWE����E ���j5j�YY����F����P-��VT-��V F����=X-��'t =X-��"uX-��U~EU9UuE ���URVYYƃ}u=X-�������=X-�����p���5X-��h����YYuZ��=X-��t =X-�� u.v 5T-��5P-��h��hX����jY��U9X-��u k��=X-��\t#X-��U���щMDX-����t �H-�����t8U���щMD\U9UuE ���URVpYYƁN���X-��0 sT���E����U X-��0щMO~X-��0 rԋEU���щMDZ=X-��xt =X-��X4�����E����X-����Du&5T-��5P-��h��hX��K��jYX-��as X-��W&X-��As X-��7 X-��0ЋU‰U#O~X-����DuEU���щMDX-�����o���X-�����cX-�����WX-�� ���KX-�� ���?X-�� ���3X-�� ���'X-�� ���X-�� �����X-��.��X-��U���щMDXVU�}t N���r���}�u1\�����PEPFP U:�u ��� V��PEPFPp U:�u O��� VG뛺���URVYY_^UVWE����}*=X-�����=X-��}���=X-��;ur}�tv���}�^���=X-��{uUOjj�zYY����P-��VT-��V ;���FF���7=X-��}t`RE_^UVWE����UUDž���h��GPd��YY���7t>�u F���t#w 5P-��hL��hX��N ��jYF���t=VUUU U =\���u EUMU:�tEE̍FP_���YWYE0E8�8Ujj�1YY����~WVW V F���E0uE_^U@VWL-��Uԋ=P-��T-��ŰX-��UE����U:/ttj/W��YYEt)@EuJ��YE ���Pj�YYuWFP8 �� VUuR ��YYD-��5D-��VP-��T-������h��u^��YYL-��t]SpS��YYyF=$��t*5$��)YPuh��hX�� ��jYFX-��UVX-�� ���E=X-��tK=L-���t 5L-����YUԉL-��=P-��ỦT-��UȉX-��E_^U,VWu_���U}�t;UEPR��YYy=$��uEUM9Ju EU뿃}�u���VY$������D-������U H-��uYƅtDFPy ��YE���PVYYǺ���URWGP �� D-��GG5D-��YVY1_^UV}�u���UBƋUB�^UV1}�t FEU^���UVWuU VVue ��YYDžt~~�yVډ$��F_^���U$UUEPjj� ��U$UUU UEPjj} U$UUU UUUEPj6jS ��U$UUUUU UEPjj' ��U$UUU UUUE��EPjGj� ���U} v$�����M ���E 1U} v$�����M ���ҋE!1UE�����1UE��1U} v$�����M ���Et���1��U$u ��Y���EUUU UEPjj ���U$EPj j y}�tUEEU$UUUUU UEPjj ��UVW11}U9p��u p������F߃| j���ug���YtUr��YtURtUz�t rY}(��t}@��t}X��t uY_^�UVWuE����u41}%<p���t4p��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv E����U9Uu1 N _^UV1}*<p���tp��B���t 4p��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���YF~�uN NF ���1}9<p���t,p��R@tp��B���t 4p��YGƒ~�uF\-��FF ���VVv vv >�uNN FFSX_^UVWE����E����11<p���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���!��U :�t! E���E E ���!��U uuu��YYEy@Ut8h��u��YYE~"��� tuw��Yuu��YYE}�y1]���jIYEu uB��Y1A���!uE�����UMJUzUB����Up��E_^UUUuuu �� �UVu JxUʋFF Vuf��YY^�UU Uh@��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuuH�� E���UJUx ]E� EPj���YYEUuu hu�� �����+��� ����� ����� �����O�����G���{���������������S������o�����������g�����o������UVWEu }10���ttOF����"���������FFF FF����s�����������������st#������ff��_^]����������^��USE] ���![]USE] ���![]USE] ���![]UVWu} Mr6 u.uAfA(_^]�UVW}u M����������������������������UW}E Mr/���u'���uĉ fE_]�����UW}���0))ϊE tu1_]XG_]��������������>��������UVWY��E_^]����������^��������L$ ���������UVWM��E_^]��������L$���������UW}0OE uG_]1_]��������U=���t��j_���YUVW��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�U}�x}~u ��P ��YYUVu~  u$�����6EP>YE����U UEPEPV yE^��UUas U E���U=���uh@��hD��YY�� 5����YU 2��U=���t5��Y������2������UVW=���u!hh��hl��KYY��u1D��5��h���hp-��| Eu1��U:#thd��u ��YYƅt�Ut1��h`��u���YYEt��EU: t: uEh\��u���YYƅj�Fu��Y%��ft2��t2�� t2����� ى |1��51��1��x1��hX��VW���YYƅt�Ft8>�t3> t> uF 2��s7hT��V���YYƅt�F����t1��_^UVW}Utu >�t]9uFG1_^�U ��VWDž����Dž�����3�����3�����3���� 3������$3���j�h��YYu2�����g����#Jfh��CYƅth���Vh$3�� h��h��YYE(��uh���P' ���jh��PI _����u> t> uF>�t> th���Vh$3�� j h$3��yYYƅt�Dž����djh��P ����9> t> uF>�> h���Vh$3�� j h$3��YYƅt�$3��$4��7E����>�t3<4��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h|��P Q= 3��D> t> uF>�(>  3��3��PVYY 3��ff U3�� 3��uY= 3���u"3����ff3�� 3�����=$3���u=h���P��YYu&j.PzYYƅtFPh$3��YY�]���$4��$3��$3��E����>�t >.uEF$3��}|04��sj.VYYF7M���� 3��1_^���U<VW}$�t}( s ��j j�u$n }$"3��B��f"3��f"3��ft2��t2�� t2����� ف��fG�G�UxO шO3��t���1W ˆW3��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu �Ey ��u֋U(+UU(VuYYVuYYft2���t2�� t2����� ف��fO}�`��}�V��m( učEPu(VucEy 2��u֋U(+UU(Vj XYYVuJYYVj�XYYVj�0YYft2���t2�� t2����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuYY}�tuuV uft2���t2�� t2����� ف��fO ��E���+U$_^�U$UUEPjj�? ��U$UUEPjj ��U$U UEPu��YYEPjj Uj�j�u��� U(VuE����E����V֋RUV֋RU ��E 3��UUU UEPj7j~ ^U$EPjj�e U$UUU UEPj%j�A U$UUU UUUEPjj yEU(VuU @t*uY���EU UV֋RUUUEPu��YYU UEPjj ^�U$EPjj� UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj�� V$2��2��5,2��h2��jKj� ^���UU$VWEPf ��YEPEPj�^ �� j�YƋ}t9uvET��EPYE����EPEPj� WYUUjEP ��YYEP ��YWj�yYZ)‰j�EPj j�EPj �� t9r)օu jYV1YU)_^�U$EPj$j UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U �� ��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E�� ��uVuu+ ��ƀ}Xu9utUPoYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���Ud�� ��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U��- ��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuED��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E�� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }��ƍ��~�y U��Vu C��V€tu ,��fN���V���~����@��u>5D��D��Yt.h���訪YFu NL���NHF ���9h���zYFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPvh =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u�� E`������������/�����UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVuj j�V ^�UhL��hX��>YYj膦Y��U Vj�hl��YYƅyHu uV EVBY}u"U JU�j utYYEt��1^���UVuY���ƋU rU MJwU uRyYY^U$EPu���YY1ۅÉ�U$} �uE���E����UUE UEPjJj�] y}�tUEEU$EUEPjHj�! Uu hT$u UVWu1fϋV€t}u ~�tu>����F���tVYU )uRvs EVt tfVV}u1_^É{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP���������/etc/dhcp.conf��/usr/adm/dhcp.pool��/usr/adm/dhcp.cache�%s: %s: %s �Can't allocate memory���%s: %s: Pool table is corrupt ��%s: %s: %s is already present ��%s: %s has %d addresses ����%s: %s: Unknown host ���/usr/run/dhcpd.pid��%d �w���/usr/run/dhcpd.pid��%02X���� %-15s %8s ����+%lu����-%lu����infinite����unused��Dynamic address pool since %ld: ����DHCP data for network %d: ��%s: Unknown port "%s" ��udp�Can't dup()�m�� ��� ��m�� ��m�� ��V��m��m��D�� �� saying: "%.*s"� declines %s����%02X����%s: ����%s: No lease set for address %s ����B�� ������!��B��)��Usage: %s [-qar] [-t[L]] [-d[L]] [-f config] [-c cache] [-p pool] [host ...] ���8��a��������8��(����8����8��8��8��8��8��8��8��8��8��]�� ��)��8����Nothing more to do! Bailing out... �asyn_wait()�Memory use = %lu ���%s: Sent DHCP packet to %s �%s �%s: Got DHCP packet from %s to �%s: Router advert received from %s �%s: Broadcast router solicitation ��%s: Sent advert for %s to self �%s is already in use by %s �%s: %s: %s offered by �� saying: "%.*s"� through %s�%s: Got a NAK from %s���%s: Broadcast DHCP %s ��%s: Address set to %s ��Sent ARP for %s ���� ��� through %s ����%s: Got a DHCP %s from %s���%s: Sent DHCP %s to %s �%s: Broadcast DHCP %s ��Minix���%s: Interface disabled (lease expired) �%s: IP address is %s (dhcp.conf) ���Minix���Minix���%s: IP address is %s (ifconfig?) ������� (sink)�%s: Ethernet address is %s%s ���bootpc��bootps��������������%s: DHCP packet too big, please trim the configuration �%s/%-2d�file����sname���chaddr��giaddr��siaddr��yiaddr��ciaddr��flags���secs����xid�hops����hlen����htype���op��"%s", line %u: Usage: tag number name type granularity max �"%s", line %u: Tag definition is incorrect �tag�octet���number��ip��boolean�ascii���DNSserver���gateway�netmask�3;���������7��"8��8��9��:��"%s", line %u: Got %d initializers, can have only %d ���"%s", line %u: Expected a multiple of %d initializers ��"%s", line %u: Tag value is way too big ����"%s", line %u: %s: Bad hexdigit string �"%s", line %u: Usage: %s hexdigits �"%s", line %u: Usage: %s number ... ����"%s", line %u: Can't translate %s to an IP address �"%s", line %u: Usage: %s host ... ��"%s", line %u: Usage: %s false|true ... ����true����false���"%s", line %u: Usage: %s string ����"%s", line %u: Tag '%s' can't be configured ����"%s", line %u: Unknown tag '%s' ����"%s", line %u: Usage: no tag-name ��no��"%s", line %u: Nesting is too deep �"%s", line %u: Usage: macro macro-name {params} ����macro���"%s", line %u: Unknown option ��hostname����possessive��"%s", line %u: Can't find IP address of %s �relay���server��"%s", line %u: Interface %s is not enabled �option��"%s", line %u: A %s can't be defined here ��tag�"%s", line %u: Usage: macro macro-name �macro������� [macro|{params}]���"%s", line %u: Usage: interface ip# host%s �"%s", line %u: Can't find IP address of %s �"%s", line %u: Can't find interface %s �interface���"%s", line %u: Usage: host host-spec macro|{params} ����host����"%s", line %u: Usage: class class-name ... macro|{params} ��class���"%s", line %u: Usage: client ID [ip#] host [macro|{params}] ����client��REPLY���REQUEST�???�INFORM��RELEASE�NAK�ACK�DECLINE�REQUEST�OFFER���DISCOVER����???�H���������H��I��9I��hI��I��%02X���� (%s)��� (%s)��� %lu���� %s� true��� false�� "%.*s"� T%d =�� %s =���%s: Closed �N��������M��M��LN��fN��%s: Opened �%s: %s: Unable to set UDP options: %s ��%s: %s: Unable to set IP options: %s ���%s: %s: Unable to set eth options: %s ��/dev/%s%d���/dev/ip%d���unknown error���%x:%x:%x:%x:%x:%x���%u.%u.%u.%u.in-addr.arpa����/etc/hosts��include�r���Qh��������Qh��g��g��h��%d.%d.%d.%d�i���������i�����i��k���������k�����k��l���������Cl�����l��hn���������\n��hn��Pn��Dn��hn��hn��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��~|��������� |��{��M|��&~���������}��}��}��}��"%s", line %u: Out of memory ���"%s", line %u: %s ��EOF�"%s", line %u: parse error at '%s' �ރ��a������`��o��ރ��ރ��{����ރ��ރ��ރ��ރ��ރ��ރ��ރ����ރ��ރ��ރ��������ރ��Ã��"%s", line %u: bad hex escape ��"%s", line %u: string at line %u not closed ����"%s", line %u: 'include' command requires an argument ��include�"%s", line 1: %s ���r��������a������r���ۏ��w�����V�����+���7��b���-��������No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain�������������=�������������������������������� �����@����������X�����b�����d�����i�����o�����p�����u�����x���������� �����#�����+���ߥ��-���ڥ��0����������L���ͦ��h�����l���¦�������E�����G���l��X���ק��b���ק��c���S��d�����e�����f�����g���l��i�����n���;��o���ק��p���ק��r���Ũ��s�����u���ק��x���ק��(null)��cannot print floating point ����/etc/hostname.file��82��������(���IP address requested isn't yours�����Address in use by 00:00:00:00:00:00��`��X��P��H��D��<�� 4�� ,��$�� ���� ��,@��l�������������������2456789�\ ��T ��L �� �� �� �� ��x ��t ��p ��h ��` ������eth�ip��udp�udp�����������/etc/hosts����(+����������*����������!#$%&*+-./:<=>?[\]^_|~��� SSSS��������������������������������������������������������B���������������(��@��X����������������������������������������������������������������������@4��� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���8��,�������������������|��X��H��4��(���������������������t��`��P��@��(�������������������|��`��L����������������������8�� ����������������x��d��L��8�� ��������C�����������������begrom��������_cachefi����_defaultB����_openpoo����_readpoo����_writepoy����_findpoo����_commitp����_updatep����_cachedh����_printda����_portbyn ����_send���Y ����_servdhc ����_onsig������_usage��D����_network����_qflag��8����_aflag��<����_rflag��@����_n_nets�D����I_72����H����I_35����L����I_10����T����_name2ipM.����_ip2name0����_cidr_at1����_ascii2o2����_ascii2co3����_statict����_inittag3����_tagdefbD6����_configt6����_dhcpopnG����_dhcpconX����_alltagd\����I_2�����$����_fds����$����_fdwaitq$����I_9�����$����_BCAST_E����_udp_ckstP����__calls�XV����_grow���V����__bottom%����__top���%����__empty� %����_string2Y����I_1�����%����I_2�����%����_getansw^����_h_addr_,%����_host���%����_host_al%����_hostbuf\&����_host_ad`*����_HOSTS������_hosts������_hfp����d*����I_7�����h*����I_4�����*����I_3�����(+����I_2�����,+����I_1�����,,����_dn_findl����I_3�����@,����_s�����������_tcp_conw����_tcpip_ww����_udp_con>x����_udp_senx����_alarm_hiy����_udp_recy����_operati{����_time_ou|����_asyn_cu@-����_allocat~����_delete_~����_delete_~����_nextc��T����_skipwhi����_parse_e����_read_wom����_read_li����_read_lij����_read_fi����_c_filesD-����_c_flagsH-����_c_fp���L-����_c_file�P-����_c_line�T-����_c������X-����I_1�����\-����align�������aligned�����add6����,����add6testE����add1����\����add1testf����done��������mask��������SEND���������RECEIVE������BOTH���������SYSVEC��!�����SRCDEST������MESSAGE� �����clword�������cword�������cbyte���*����last����,����slword������sword�������sbyte�������done��������next����͔����found�������failure�����_unknown����_servf������_any��������_line���p-����_serv���t1����_serv_al1����I_1�����2����_handlerT����_gnum���X����_o_print����_do_writ����uplword�����upword������upbyte��$����done����&����downward-����compare�X����done����d����no0���������begtext�������begdata�����begbss������crtso���������___main�P�����__penvir����__fpu_pr42����__penvp�82����__edata�����_exit���qV����_environ ����endtext�l����_main���i����_configf����_poolfil����_report�T�����_fatal�������_allocat�����_ifname2�����_if2net�����_program<2����_serving@2����_test���D2����_debug��H2����_asyn���L2����_port_se\2����_port_cl`2����_start��d2����_now����h2����_event��l2����__end���@4����_strerroY����_malloc�W����_strlen�0����_sbrk�������_memcmp�����___stdou@����_getpid�����_fcntl��|����_write������_memcpy�@����_dhcp_in\����_sync���Ԓ����_fputc��@����_sleep��̒����_dhcp_ge[����_give_buJ����_settag�.����_sigacti����.csa4�������_fflush�X����_put_bufJ����_opendevjK����.blm����Ա����_get_buf`J����__tmp_l�p2����_is_arp_pT����_icmp_isV����_asyn_wa|����_asyn_re|����_newnetwJ����_set_ipc P����_get_ipcdO����_strtoulY����_gethost!b����_initdhcz6����_make_arS����_close��l����_sigemptĒ����_fclose�����_time���ܒ����___stderX����_fopen������_errno��$����_dhcptypG����_ether2cP3����_ipdev��EO����_strcpy�����_icmp_so3U����_makedhc<����_udp2ethQ����_sprintf����_printf�p����_read�������_icmp_adU����_fprintf ����__tmp���t2����_open�������_getservf����_lseek������_closedeO����_dup����t����_inet_nth����_memset�p����_ether2uR����_printdhG����_ether_nv^����_cidr_nt1����__endhosc����__gethosd����_inet_atf����_strcasexz����_strncasz����_ether_a]����_dhcp_se\����_config_1����_strncmp@����_strncpyP����_strchr�����_config_����_config_ ����_strnlenp����_gethost*c����_closefdK����_free���&Y����_asyn_clx~����_ioctl������_oneC_su����___funcc����__clean�����___functx2����__exit��\����_reallocX����__sbrk��{����__brk���P{����__sys_er����__sys_ne����_strtol�Y����___ctype����_memmove`����_ether_e(^����_h_errno2����_res_quexm����_inet_ad|f����__getshol����_dn_expah����_dn_skipk����_res_sean����__sethosc����___fillbl����_strcmp������__serv_s2����_endserv����_getserv=����_setservԖ����_dn_compj����__getlonm����___putsh1m����___putloLm����.csb4�������_res_quep����___hostap����_res_ini����_fgets�������__res����3����_getenv�̕����_res_mkq؜����_res_senq����__res_clv����_alarm��d����_signal�P����_toupper����__brksiz����__syscalP����_asyn_in{����_asyn_wr|����_asyn_io|����_asyn_sys~����__sigfilЊ����__read������__alarm�����_abort������__sigact0����_pause������__time��P����__ioctl�؉����__write�����_config_&����_strrchr����__fstat�����__stat������__sendre̓����___sigre����__sigaddd����__sigdel����__sigemp����__sigism����___stdin(����___iotabp����__close�����___cleanƍ����__lseek�����__open��L����__creat�8����__doprntV����___flushЫ����_snprint����_vsnprinؑ����_vsprint?����___exit�����__dup���d����__fcntl�x����__getpidؠ����__pause�����__sleep�Y����__sync��@����__sigret����__send������__receiv����endbss��@4����__memcpy����__memmov����__strncmH����__strncpx����__strnle����_raise��(����__kill������_rewind�����_atoi�������_gethost����__loadna`����__sigjmpȡ����__sigpro����_sigprocخ����_sigfillЮ����_sigsusp����_sigdelsȮ����__f_prinЯ����__i_compT����__isatty����_fseek��L����__sigsus����__fp_hoo����__tcgeta4����ECASE��������.fat����@����.stop���L����.trp����T����.trppc������ERANGE�������ESET���������EIDIVZ�������EHEAP��������EILLINS������EODDZ��������.ignmask����__etext�l����endrom������enddata�����������������������������������������������������������������@4����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ����P�� ��( �������������1$T$L �� ��su;SSSSu �� �� QRP�� ���Pv�����U��VWE���E $��1҉UUU1҉UUh��u u\"�� E=��������}�t��E���}�t��E���뭃}�t��E���뙃}�t��(��U냃}�tz��E���l}�tc��(��USP��I���EdN��U9� ��t.��UU܃}�tUUh|��r��YE̅uEp��UU؋UUԋUUЃ}�tUUhd��9��YEȅuE\��}�u }�u}�u}�u���UԉU؉U܃}����ju`*��YYE=u05 ��5��YPu5$��h<��h8 ��o(��j��YtPhnHu*�� E=u-5 ����YP5$��h��h8 ��!(��jD��YtP ��YP}�t�����Ph��(�� E����}�u}�u }����ju)��YYE=u05 ��V��YPu5$��h���h8 ��'��j��YhPh!n u))�� E=u-5 ����YP5$��h���h8 ��B'��je��Y(��P(��Y}�t4l ��YP}�t������Ph���'�� E����}�u }���11jjlP �� dtd3[��j�h ��a(��YY4=uD= ��3��5 ��&��YPh ��5$��h���h8 ��^&��j��Y���h$�� P4'�� 0=$��ul9u˃0�y25 ����YPh ��5$��h���h8 ��%��j ��Y4{'��Y0$��p���PPj Pv��t�PPj PM��tt �t ��t j.VV'��YYt"j.VH'��YY�Gl ��Y1V\Pq'��YYt"h���\P&��YYW\P&��YY}�t.\P}�t������Ph���k%�� E����}�|���hh���hl���$#��YYt4\Phd���y$�� =t��Y=u-5 �����YP5$��hH���h8 ��:$��j]���Y}�u hD���$��Yj�D���Y_^U5$��h��h8 ��#�� j���Y�UV5 ��Nx ,��^U= ���t ��uL%��Y�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVux95 ���� ��^U(VWU���cSct1���U���UE4��UlUE����U,UE����1���tTT9{���UF}���g���}�u1FSXE؋U 9Uu }�tE0}�tU؋E���2}4utE���tE@���uuGb1_^�UVWu} u jM%��YDžt+FPFPFPFPFPPh��W"�� _^Uh ��uYY��U8VWE���U UUUUfRf���� ����� ىM؋UfRf���� ����� ىME��E��u }����}�`���uuVuu��Džy�����1��W΋U| ��uk#��Y���ljUUU)UVuV ��YY���ZMԃ}�~DVuVm ��YY���Z߃}�t&UBt ����� �����1+��E ��E����� �� ��E ��E����� �� ��E����M��9u��uuVuu��Dž��V ��YEV ��YEV ��Yǃ}u@ց}��sUEEu-"��Y���ljUUU)U]}�tE} u?uuVuuV��Džy +֋U| ��| ����}�u}t }�t&9= ��t U9UtQ= ��UŨ}u���1 ��}�u U| ��uuH!��Y���ZЉE���E1UU��s-UEȉEWVRg �� UUE;}�tE�����E�����| �� �����1_^U��VW}-0���= ������>����N>.���W��Y ��=u�����1���=| �� �� �� ������ ����� ����� �� �� ������ �� ��| ��X-0���= ���r>.uF\h����PjjW��y1j��Pi _^U��VW}}t1���PGPGPGPh��P��h���Pj jPX��Ey1HjuP ƅu1*UVU V  �� �� ������ ��_^��UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E?��} �tF=�� ����� ً����� ʋ ����� ыE ���_^��UVuFPFPFPPh(��h$����$��^UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U4��>���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!L��<��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#Ud��B;��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW��u��=u ���h����Pj�j�j�uu uj�^��$ƅ��������uuV�P��ƅy��������}Gu^fWf���� ����� uL0�����7�����+����������W|��Y9��_^UVWE������u��=u N�� �����������uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u ��€u$}����N>.�������������?�q���uuuu 7u���E~���= ��;u�����l���=��uE=��t =��u�����t놃}�t"uuuu j�u%���E~}�t �����_^U��VW}} �uBW<��Y-���Ɖ:.u#��sVWPu�� Ƅ5�*"u h���Wh���h��P1��uuuu_^U��VWh��{YEth��u��YYEu1���E�uh���P�� ���>�t ��uF>�n����uP. ��YYuF ��u>�tDG?�t ��uG1҈7��h���Vh8���� u ��Y8�� u ��Y1_^���U@��VWE����E����E����UUЋUUE=�����uA��=u ����u } ���~���1EUffUE������9UY��E������9U;��}���Dž������U= ���y2UMEPU��P4��w�� ��=����#U f���� ����� ف��fMjEP5 ���� =���t$ ��U5 ��y��Y ��^��u u5 ���� 9E t$ ��U5 ��6��Y ����}fE�U܅t2EPW5 ��$�� ƅ~U)��fUU܅tB ��U5 ����Y ��}<��}���E���M��}ff���� ����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5 ��H�� ƅ~U)��fUU܅t$ ��U5 ����Y �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5 ���� ƅ��U)��fU멃= ���y�� ��y ��U'��UMU��P4��u u5 ��(��9E ���M��Uԃ}�~ Eԙ=��Eԃ}�E���uuu5 ����E=u= �����E������E���UM9u�� u+UBt"5 ��c��Y ��E���}�t��t}�u �����u5 ����Y ��Ea���EE= ���x5 �� ��Y ��}�u}�u  ��;��� ��=��� Uȉ ��_^U= ��t5 �� ��Y ��U$VWh��YDžu��jWt ��YYƃu ��E���E1��UUfU fUEPh0n@V* �� E=u ��EV ��YGE����EPh2n@V �� E=u ��EV ��Y E�����_^UVWuut.Vu u �� Dž U)U U )΋E_^U&U��(U��)U��*U��+U��,U��-U��.U��/U��0U��1U��2U��3U��4U��5U��6U��7U���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� VWh��YDžu��jWT ��YYƃuEE7��3EPh@n@V& �� E=u  ��UV ��YU ��_^UVW���URP ��Yƅu �� ���w���UWfUfW fG ����#UfWuu FP �� ���URVu �� E ��UV��Y}r UUU ��E_^Uh !��j@��YYj ��YUVW���UR ��YDžu �� ������h !��j��YYEu ��YE���URWu �� Ƌ ��Uxw7~1W3��Yj� ��Yuj��YYut ��YU ��@RGPu �� W ��Yj�C ��YujX��YYu. ��Y_^��UVWEE�P��YNjE E �P~��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P ��Y9uuąt9}���t��� t1_^��UVW= ��a���U9� ��} � ��M :-u� ��z�u ��� ��M h(��4 ��YYu� ����� ��M  ��ǣ��:tWu ��YYƅ}���= ���t=E h8 ��07��YYh8 ��h��&��YYh8 ��W��YYh8 ��j ��YY� ��M  �� ��:�u� �� �����?��� ��F>:���� ��M  ��C;�t!A � ��M  ��C(������ ��U9� ��|W= ���t=E h8 ��0f��YYh8 ��h��U��YYh8 ��W��YYh8 ��j ��YY �����?���`� ��A � ��M (�� �����7� ��M  �� ��:�u ������ ��(������_^���UVW11}U9P ��u P ������F߃| j���ug���YtUrr��YtURtUz�t r6 ��Y} ��t} ��t}8 ��t u ��Y_^�UVWuE����u41}%<P ���t4P ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv;�� E����U9Uu1 N _^UV1}*<P ���tP ��B���t 4P ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���[��YF~�uN NF ���1}9<P ���t,P ��R@tP ��B���t 4P ��YGƒ~�uF8��FF ���VVv vv1�� >�uNN FFSX_^UVWE����E����11<P ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �,��&��U :�t! E���E E �L��%��U uuu��YYEy@Ut8h��u��YYE~"��� tu��Yuu��YYE}�y1]���j��YEu u��Y1A���!uE�����UMJUzUB����UP ��E_^UUUuuu �� �UVu JxUʋFF Vu��YY^�UVWu }E����?�t:JxG^FSX GVP��YY=uEE_^�UU Uh ��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj���YYEUuu hu��{ ����� ����� ����� ����� �����_ ����� ����� ����������UVW}u M�����������������������UW}���0))ϊE tu1_]XG_]����������������������UVW��E_^]������������������UVWM��E_^]��������UVP��U9P��wUP�����9P��v �� ���16VT ��Yt1'P��rF����5P��&��Y5P�����^UVW}�u1���E����}������UUs �� ���1���=L���u8j ��Y=u1���V!փ5L��5P��F����E����5T��O���VU}9}r69v2W9UvUW~>}�t ET��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=T��<���9}r79}u+UOJ}�t ET��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���15T��t 9ur6E0tU UT��tU9ru NJEtU9Wu RWE_^��UVu~  u �����6EPr ��YE����U UEPEPV �� yE^��UUas U E���U ��VWDž����Dž���������������������������j�h����YYu�����g����#Jfh��sYƅth���Vh�� h��h��|YYE(��uh���P ���jh��P�� _����u> t> uF>�t> th���Vh�� j h��uYYƅt�Dž����djh��P�� ����9> t> uF>�> h���Vh��{ j h��YYƅt�����7E����>�t3��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h��P�� Q=��D> t> uF>�(> ����PVYY��ff U����uPY=���u"����ff�������=���u=h���Pz��YYu&j.PvYYƅtFPh��YY�]���������E����>�t >.uEF��}|��sj.V YYF7M���� ��1_^���U<VW}$�t}( s ��j j�u$*�� }$��B��f��f��f���� ����� ف��fG�G�UxO шO��t���1W ˆW��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf����� ����� ف��fO}�`��}�V��m( učEPu(VuEy 2��u֋U(+UU(Vj YYVuYYVj� YYVj�YYf����� ����� ف��fO ��� ���U9U(} ����FVuYYVuvYYVj�YYVu[YY}�tuuV uf����� ����� ف��fO ��E��+U$_^�U$ ��9Ut*UUEPjj�d��� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^UVWuU VVu��YYDžt~~�yVډ ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$UUEPjjc ��U$U UEPuX��YYEPjj5 U$EPjj� �U$UUU UUUEPj6j ��U$UUU UUUEPjj yEU(VuU @t*uBY���EU UV֋RUUUEPu|��YYU UEPjjS ^�U$UUUUU UEPjj' ��U$UUEPjj� ��U$UUU UUUEF��EPjGj� ���U} v �����M ���E 1U} v �����M ���ҋE!1UE�����1UE��1U} v �����M ���Et���1��U$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ��/��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E0��j��uVuu+ ��ƀ}Xu9utUPOYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���Ux��y��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U����JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEX ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E����E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu } ��>'��~�y U��Vu C��V€tu ,��fN���V���~���� ��u>5$ ��<��Yt.h���4YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�vf =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vW =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�:��USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����L$ 7�������Uh` ��h8 ��YYj2Y��U Vj�h ��YYƅyHu uV EVnY}u"U JU�j uYYEt��1^���UVW5��h��Y��DžD���7uYYtw>�t6uYYt} �tu w YYu=���uA��_^UVuY���ƋU rU MJwU uRAYY^U$EPu���YY1ۅÉ�UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPje�� Vl��d��5t��hX��jKj� ^���Uu hT$u U= ���uh ��h ��YY �� 5 ��E��YU ��U= ���t5 ��VY ������������UVW= ���u!h ��h ��YY ��u1D��5 ��h���h|��H Eu1��U:#th ��u ��YYƅt�U��h ��u���YYEt��EU: t: uEh ��u���YYƅj�FuS��Y%��f���� ����� ى ��5������h ��VW���YYƅt�Ft8>�t3> t> uF��s7h ��V���YYƅt�F������_^UVW}Utu >�t]9uFG1_^�U$} �uE���E����UUE UEPjJj� y}�tUEEUj�j�u�� E`�UVuj j�V��� ^�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��UVWu1fϋV€t}u ~�tu>����F���tVYU )uRv7 EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ ��tPXP�����1�����?������E������I�����a������e������h������i����� ���%s: /etc/hostname.file: %s �%s �w���/etc/hostname.file�� �������%s%s����.���%s: %s: %s �%s: %s: %s � �������%s%s����%s: Unable to fetch IP address: %s �%s: Unable to open '%s': %s ���� �������%s%s����%s: Unable to fetch ethernet address: %s ���%s: Unable to open '%s': %s ����/dev/ip�IP_DEVICE���/dev/eth����ETH_DEVICE��?aheE:iI:���Usage: %s -[eiah] [-E <eth-device>] [-I <ip-device>] ���unknown error���%x:%x:%x:%x:%x:%x���%u.%u.%u.%u.in-addr.arpa��������������������%d.%d.%d.%d�}��������������,�����������x�������3��������������:�����������������������%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��: option requires an argument -- ���: illegal option -- ����--��)�����a���x)��r���S)��w���b)��)�����+���)��b���)��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��7���������5��)7��E<����� ���;��@���<��B=�����X���+=��b���=��d���"=��i���"=��o���=��p���+=��u���"=��x���+=��>����� ��� >��#���>��+���>��-���>��0���>�� A�����L���>��h���>��l���>��?�����E���@��G���@��X���?��b���?��c���{@��d���=@��e���@��f���@��g���@��i���=@��n���c?��o���?��p���?��r���@��s���?��u���?��x���?��(null)��cannot print floating point ����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services��� ��/usr/adm/dhcp.cache���������SSSS�����������������������������������������������������������������B��������������� �� ��8 ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���������|��d��X��<��(������������������|��p��\��L��<��,������������������|��l��`��P��<�� �� �������� �� �� �� �� �� �� �� �� �� ��������l��`��H��,������������������x��d��C����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���%�� ���������L������1$T$L �� ��su;SSSSu �� �� QRP �� ���PV�����UPVWE ( ��E����E����E����E����E����E����1h���u u �� E=������`��}�tU��, ��U뿃}�t?��, ��U멃}�t)��, ��U듃}�t��, ��Uz}�t��E���c}�t��E���Lt�����9u5( ��h���hX ��> ��j)��Y���E#��}�u }�u}�t���1Et }�tb��}�uE���}�t ��P ��YU9 ��t0��UUUUUUỦUE����uuu h�����Yƅu!���uh���h ��> �� ��jV ��YYEyLt= ����= ����5 ����YPV5( ��h���hX �� ��j��Y}�tuuu��� }�tuuuq�� }�t uu��YY}����EPus��YYu+g���V5( ��hh���hX �� ��jy��YDu ��YPVhX��� �� Utu��YPhL��� ��YYh@ ��j _ ��YYu ��Yt E܃}j���Y_^UVu p��Yƃu#u 5( ��h��hX �� ��j��Y}�t uZ���YuRE���uEPh n @ug �� Ey-5 ����YP5( ��h���hX �� ��jn��Y^U EPu$���YYu1Uu h<����Y���UVWju ��YYE ���Pju �� EPh!n u �� Ƌ= ��uju �� y3 t.= ��WH��YP5( ��h��hX ����j��YuEPu �����1_^U5( ��h��hX ��z�� je��YUVu ��Yƃu#u 5( ��h(��hX ��>��j)��Y}�t u���YuRE���uEPh n @u �� Ey-5 ��d��YP5( ��h���hX ����j���Y^Uj�EPu O�� EU:�t#u 5( ��hD��hX ����j|���YU EPu3YYu 5( ��h\��hX ��W�� jB���Y���#UUhX ��u��YYI �����UV5 ��Nx 0 ��^U= ���t ��u��Y�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVux95 ���� ��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E3��} �tF= �� ����� ً ����� ʋ ����� ыE ���_^��UVuFPFPFPPh��h� ����� ��^UVW=$ ��a���U9 ��}  ��M :-u ��z�u �� ��M h��4��YYu ���� ��M $ ��ǣ ��:tWuk��YYƅ}���= ���t=E hX ��0��YYhX ��h�����YYhX ��Wy��YYhX ��j k��YY ��M $ ��$ ��:�u ��$ �����?��� ��F>:��� ��M $ ��C;�t!A ��M $ ��C, ����� ��U9 ��|W= ���t=E hX ��0���YYhX ��h�����YYhX ��W���YYhX ��j ���YY$ �����?���` ��A ��M , ��$ �����7 ��M $ ��$ ��:�u$ ����� ��, ������_^���UUUuuu �� �UVu JxUʋFF Vu: ��YY^�UVWu }E����?�t:JxG^FSX GVP ��YY=uEE_^�UU Uh@ ��uuB�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj� ��YYEUuu hu��������������������g�����{���������������UW}���0))ϊE tu1_]XG_]��������������F ��������U= ���t ��j���YU}�x}~u���P��YYU$UUEPjj�7�� ��U$UUEPjj�� ��U(VuE����E����V֋RUV֋RU t��E ��UUU UEPj7j�� ^U$EPjj��� U$EPjj��� �U$UUU UUUEPj6jW�� ��U$UUU UEPj%j�1�� U(VuU @t*u ��Y���EU UV֋RUUUEPu��YYU UEPjj�� ^�U$UUEPjj��� ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E����uVuu+ ��ƀ}Xu9utUP ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U�����E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U0����JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P_ ��E6U U RU U RUEE�EP�� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u �� ƅ~9})׉U U 1_^UVWu } ��#��~�y U��Vu C��V€tu ,��fN���V���~����@ ��u>5D ����Yt.h������YFu NL���NHF ���9h�����YFuN!NF ���V@u��VVVh���U����F���t$jj�vn�� =uN ?��jEPv�� =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v�� =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v_�� =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�UVWtu} u ~�tIu(_^]�������������UV ��U9 ��wU �����9 ��v �� ���16V��Yt1' ��rF����5 ��&��Y5 �����^UVW}�u1���E����}������UUs �� ���1���= ���u8j��Y=u1���V!փ5 ��5 ��F����E����5 ��O���VU}9}r69v2W9UvUW~>}�t E ��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����= ��<���9}r79}u+UOJ}�t E ��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuVx�� u���Y_^?U��AU��BU��CU��DU��EU������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������U VWUUb���15 ��t 9ur6E0tU U ��tU9ru NJEtU9Wu RWE_^��UUas U E���Uh��hX ��YYj Y��U$ ��9Ut*UUEPjj���� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^UVu Y���ƋU rU MJwU uR ��YY^UVWuU VVu��YYDžt~~�yVډ ��F_^���U$EPuF���YY1ۅÉ�U$UUU UUUEPjjw yEUu hT$u U$UUUUU UEPjj' ��UVWuE����u41}%<p ���t4p ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v^ =u N /uvv E����U9Uu1 N _^UV1}*<p ���tp ��B���t 4p ��aYF^��USE] ���![]USE] ���![]USE] ���![]UW}0ʀuA)_]�����UVW}u MC����������������UVWq���E_^]����������UVW}u M)9r/r uu fE_^]t|�������������} 0)ʇʋu }���������{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ ��tPXP�����Z�����?������I������a���G��h������i�����m������n������v���0�� netmask %s�%s: address %s��%s: %s: Host address not set ���%s: Unable to open '%s': %s ����/dev/ip%d���/dev/ip�IP_DEVICE���%s: getopt failed: '%c' ����?I:h:m:n:iva����%s: Unable to set IP configuration: %s �%s: Invalid host address (%s) ��Assertion "ipconf.nwic_flags & NWIC_IPADDR_SET" failed, file "ifconfig.c", line 228 ����%s: Unable to get IP configuration: %s �Usage: %s [-I ip-device] [-h ipaddr] [-n netmask] [-m mtu] [-iva] ��%s: Unable to set IP configuration: %s �%s: Invalid netmask (%s) ���%s: Invalid mtu (%s) ���%s: Unable to determine if netmask is set, please set IP address first �unknown error��� �������� ��} �� �� ��%d.%d.%d.%d�: option requires an argument -- ���: illegal option -- ����--��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0����������n����n����n��{��{��{������� ���%��@���Z��~�����X���g��b���L��d���^��i���^��o���U��p���g��u���^��x���g��W����� ���H��#���M��+���C��-���>��0���R��I�����L���1��h�����l���&��O�����E�����G�����X���;��b���;��c�����d���y��e�����f�����g�����i���y��n�����o���;��p���;��r���)��s�����u���;��x���;��(null)��cannot print floating point ����$ ����������SSSS�����������������������������������������������������������������B���������������( ��@ ��X ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���l��`��D��4������������������|��h��\��D��4��(��������������������t��\��L��4��$������������������ �� �� �� �� �� �� �� �� �� ��l��T��8��$�������������������l��T��D��0����C������ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���pm����`������ m��`��1$T$L ����su;SSSSux ��x �� QRP%�� ���P �����UTVWE����1E %�� ��jh|���j>�� � �����jjb ��YYjhx���j>�� j�jF ��YYEEp���}zn���U �� ��0EPh| ��s>��YYE=t?E����}},E􊈔 �� ��jh| ��>��YYE=uE΃}uE눃}u5%��hd���<��YYj ��YU ��E􊈔 �� ��jh ��=��YYE=u-5 �� ��YPh ��5%��hD���5<��j ��Yu5��YE==��E=u(5 �� ��YP5%��h(���;�� jq ��Y}�u7u<��Yujuh ��h ���h$�����h ��u��YYu<��Y<��E=u(5 ��3 ��YP5%��h���u;�� j ��Y}����j�uj<��YY1uh���h&��j�<�� ƅ~-&��VWj<�� E܅~9u}׉+U܉j <<��PF<��YYuh ��u}�� j;��Yju;��YY1u#h���h&��j�<�� ƅr���&��uVh���WM<�� EЅt')Eu VW'��YYE؅t}׉+U؉uWj;�� E܅~9u}׉+U܉lj u};��YYuh ��u�� 1_^UVWu��Yl;��ju R;��YYǃu+5 ����YPu 5%��h,��9��jL��Yjh ��;��YYE=u+5 ��K��YPu 5%��h���9��j ��Y+�����������%��=+���t ���=*���t *��u6:��Yu-:��Ytj�W(:��YYW:��Y1jW:��YYjW :��YYh +��h+��h���9�� = ��uh +��h+��h���9��  ��Uh���j-��YYEt)uD��YP5%��h���uc8��u3��Yj\9��Y_^Uujuu hT��hX��#���j�j�u C9�� h��u +9��YYU<VW���j/u;��YYEąt���E}d���j�h ��D9��YYƅ9��kE0j�PV#9�� =t.j0EPV9�� =0���uE=���t E=���t1V8��Y}u1j0j�EPo9�� juEPN:�� ju EP=:�� j uEP,:�� jh%��EP:�� UfUUfUj�8��YEt1h��h ��b8��YYƅW���j0EPV8�� V7��Yjh ��48��YYƅx-kE0j�PV8�� =tj0EPVI8�� V7��Y_^UTVWu=� ���uF}�tu%��YPu hl��V6��u h\��Vx6�� ljM)REPu7�� j��Y_^U8VWj/h ��j8��YYƅk���EPu7��YY�Fuj/u?8��YYƅt�Fj�EPu�� EP>���YDžtUȀ:�u}}܍EPju.7��  +�� ��+������_^UV1< ��tU9 ��u  ��F1^UVu v���VuEP 7�� }���)RD5PQ��YY}t1?��}���)RD5P+��YY}su}st1�� s ���)RD5P���YYjEPEP6�� fUf<+��<+�� <+����� ف��fMfUf<+��<+�� <+����� ف��fMfUf<+��<+�� <+����� ف��fMfUf<+��<+�� <+����� ف��fMEPhT@j5�� ���^UVWu t$Vuj�5�� Dž~UU)_^��UVEPh1nj�4�� Ey-5 ����YP5%��h��h ��53��j��YjjEP{�� ƅuuP ��YPh�� 3��YYj��Yh���6h%��5�� &������1ۅÉ+��^Uh��jEP��� h���jh*��p��� h��jh*��\��� h��h ��:5��YYh��j;h ��7��� h*��+��YEuh*��h*��j�h%��(��U ������jEPj�3�� =���t5 ��h(��jt M yj�uj` UM E}�uU} �t������EEPh6n@j3�� =u5 ��U���YPh4��h ��x1�� ���UV5 ��Nx @+��^U= ���t ��uD2��Y�UVux95x��X��l��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0Y��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��U8VWE���U UUUUfRf<+��<+�� <+����� ىM؋UfRf<+��<+�� <+����� ىME��E��u }����}�`���uuVuuk��Džy+�����1��W΋U<��u;1��Y���ljUUU)UVuV��YY���ZMԃ}�~DVuV��YY���Z߃}�t&UBt +����� +�����1+��EP��E�����@��P��EȬ��E�����L����E����M��9u��uuVuu[��Dž��VQ��YEVD��YEV7��Yǃ}u@ց}��sUEEu/��Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U<��<����}�u}t }�t&9=H��t U9UtQ=H��UŨ}u���1D��}�u U<��uu/��Y���ZЉE���E1UU��s-UEȉEWVR-�� UUE;}�tE�����E�����<�� +�����1_^U��VW}-0���= ������>����N>.���W��Y��=u+�����1���=<��@��P��P������D�����H���������������L����<��X-0���= ���r>.uF\h����PjjWf��y1j��Pi _^U��VW}}t1���PGPGPGPhh��P*��h���Pj jP��Ey1HjuP ƅu1*UVU V ������������_^��UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAEY��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s Y��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E3W��} �tF=+�� +����� ً+����� ʋ +����� ыE ���_^��UVuFPFPFPPh��h��'����^U@VWE��uC(��Ef��������#M с��f ��}�����|h`��p*��YEuET��E0XYEu!]3h@��h ��&�� ��EEE�����J��f�������} f��ju(��YYDžy'5 ��KYPuh(��h ��k&��7��E!��f��f<+��<+�� <+����� ف��fM��#U fUURUEPh0n@Wa'�� ƅy9= ��:u W'��Y���5 ��YPh��h ��%�� ��E���EPh0n@W '�� ƅy$5 ��]YPh��h ��%�� L��E����EPh2n@W&�� ƅy= �� uj&��Yy = �� tʅy-= ��:t$5 ��YPh��h ��%�� ��y M}�0}�uh��h ��$��YY��}�u?jh��W&�� =���/��5 ��xYPh��h ��$�� g��ju&��YYEy'5 ��AYPuh|��h ��a$��-��E"��f��f<+��<+�� <+����� ف��fMEPh0n@un%�� ƅy$5 ��YPhX��h ��#�� ��%��EЅy$5 ��YPhD��h ��#�� ��}����j�$��Yj�jR*��YYj$��YE����EPh3n@u$�� ƅy= �� uj$��Yy = �� tȅy0= ��:t'5 ��YPh ��h �� #�� jYx j�YjYj$��Y��Ph��EP%#�� EP%��Y���PEPW$�� PEP%��Y���Z9t$5 ��mYPh��h ��"�� \��ud%��Y���PuW,$�� uI%��Y���PuW$�� u.%��Y���PuW#�� jEPW#�� =���t$5 ��YPh��h ��"�� ���}�t5jEPWo#�� =������jEPj#�� } u���}����UEEPh1nu#�� ƅy!5 ��WYPh��h ��z!�� IfUf<+��<+�� <+����� ف���|h��h ��4!��YYxWN"��Y}�x u?"��Y_^U8��VWDž���Džu>�tF>.uu +UFG-A���=���s FP'��YFG�} �t1h|��h����YYE}�t;uuPu��uu��Y1���u��Y���= ���u } ����Dž����u��Yu ���rP"��YYhp��P)"��YYhl��P:��YYEu]UPr ��YYu0tB9uu��Y_^U��VWuh���P�� ���> t2> t-> t(>�t#-A���=���s P &��YFɀ> t> u*�F> t> uF> t> t> t >�tF�uPu 7��� N?�tEPu#!��YY/1_^UVW} }uWu ��YY1ۅÉ ��uWu!�� t1���Wu ��YYu ������U:�t1���= ���tMU��OU��PU��QU��RU��SU��TU��UU��VU��WU��XU��YU��ZU��[U��\U��]U��^U��_U��`U��aU��bU��cU��dU��eU��fU��gU��hU��iU��jU��kU������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1���= ������h��h��%%��YY=u �����1������j.h��X��YY ��u �����1T �� ��ր>�t-A���=���s Pq$��YF݋UUR5 ����YY1ۅÉ_^���UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��PK���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��KI��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��~H��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW+��u= ��=u ���h����Pj�j�j�uu uj�#��$ƅ+��������uuV�P��ƅy+��������}Gu^fWf<+��<+�� <+����� uL0+�����7+�����++�����+�����W��F��_^UVWE����+��u��=u N�� ������+�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u +��€u$}����N>.���+��������,��?�q���uuuu 7u���E~���= ��;u+�����l���=+��uE=+��t =+��u+�����t놃}�t"uuuu j�u%���E~}�t +�����_^U��VW}} �uBW��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h���P��uuuu_^U��VWh����YEth ��u��YYEu1���E�uh���P�� ���>�tY��uF>�n����uP. ��YYuFY��u>�tDG?�tY��uG1҈��h���Vh���m�� u��Y��� u��Y1_^���U@��VWE����E����E����UUЋUUE=���+��u��=u ��+��u } ���~���1EUffUE����+��9UY��E����+��9U;��}���Dž����+��U= ���y2UMEPU+��P4+��w�� ��=����#U f<+��<+�� <+����� ف��fMjEP5 ���� =���t$ ��U5 ����Y ��^��u u5 ���� 9E t$ ��U5 ����Y ����}fE�U܅t2EPW5 ���� ƅ~U)��fUU܅tB ��U5 ��O��Y ��}<��}���E���M��}ff<+��<+�� <+����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5 ���� ƅ~U)��fUU܅t$ ��U5 ��s��Y �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5 ��V�� ƅ��U)��fU멃= ���y�� ��y ��U'��UMU+��P4+��u u5 ��(��9E ���M+��Uԃ}�~ Eԙ=+��Eԃ}�E���uuu5 ����E=u= �����E������E���UM9u+�� u+UBt"5 ����Y ��E���}�t+��t}�u +�����u5 ����Y ��Ea���EE= ���x5 ��o��Y ��}�u}�u  ��;��� ��=��� Uȉ ��_^U= ��t5 ����Y ��U$VWh(�� ��YDžu��jW4��YYƃu ��E���E1��UUfU fUEPh0n@V�� E=u ��EV��YGE����EPh2n@V�� E=u ��EVH��Y E�����_^UVWuut.Vu u�� Dž U)U U )΋E_^U VWh@�����YDžu4��jW��YYƃuEE7��3EPh@n@V�� E=u  ��UV��YU ��_^UVW���URT��Yƅu �� ���w���UWfUfW fG ����#UfWuu FP�� ���URVu�� E ��UV��Y}r UUU ��E_^Uh11��jD��YYj ��YUVW���UR��YDžu �� ������h11��j��YYEuB ��YE���URWu �� Ƌ ��Uxw7~1W7��Yj� ��Yuj��YYu ��YU ��@RGPu �� W��Yj� ��Yuj\��YYu ��Y_^��UVWEE�P��YNjE E �P��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�PA��YNjE E �P/��Y9uuąt9}���t��� t1_^��UVW1}�y1���1<���t,|1���Fρ���(�����1���E E �L��9��U :�tE E �l��t9��jL��YEu1E���t���tE�����UMJUzUB����U��E_^U= ���x 5 ��5��Y �� ������U= ���x=����u ��� ��j�5���m��YY ��y'j5 ����YY ���Pj5 ���� 1U^U���U ����= ���u/h���h��5 ��X�� ��1V����= ����u1< ������ �� ��= ���u �������U ��U ��U ��:�u1 ��: t  ��::uҋU�EUV= ���yy1���u1�����tx��tjƅtj�j�V f��Lƅtj�j�V ��/��t! ��y��g ��:�X��^UV%ƅt F9Eu^UV{ƅtu6 ��YYu[^��UVj�$���Yƅu j���Yƅu j���YƉ^U VWu ��Yƅu1Pjh��V �� t18�����Et]3VS ��YYu �� G��1_^��U$UUEPjjK�� ��U(VuE����E����V֋RUV֋RU ��E ?5��UUU UEPj7j�� ^U(VuU @t*u��Y���EU UV֋RUUUEPu`��YYU UEPjj�� ^�U$UUUUU UEPjj[�� ��UVW11}U9��u ������F߃| j���ug���YtUrYtURtUz�t r6 ��Y} ��t} ��t} ��t u ��Y_^�UVWuE����u41}%<���t4��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juva�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv�� E����U9Uu1 N _^UV1}*<���t��B���t 4��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���[��YF~�uN NF ���1}9<���t,��R@t��B���t 4��YGƒ~�uF$��FF ���VVv vv >�uNN FFSX_^UVWE����E����11<���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���?0��U :�t! E���E E ���0��U uuuYYEy@Ut8h��uq��YYE~"��� tuYuusYYE}�y1]���j��YEu uY1A���!uE�����UMJUzUB����U��E_^UUUuuu @�� �UU Uh ��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj�"��YYEUuu hu�������7�����O�����s�����O�������������'�����7�����S�����c���������������������������������������������������C�����o�������������������UW}E MuG_]1_]UVW}u MK%���������������UW}E Mr/���u'���uĉ fE_]�����.%��������UW}���0))ϊE tu1_]XG_]��������������%��������UVW)%��E_^]����������.%��������L$ $���������UVWM$��E_^]��������UW}0OE uG_]1_]��������UVWx ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UV<��U9<��wU<�����9<��v �� ���16V ��Yt1'<��rF����5<��&��Y5<�����^UVW}�u1���E����}������UUs �� ���1���=8���u8j ��Y=u1���V!փ58��5<��F����E����5@��O���VU}9}r69v2W9UvUW~>}�t E@��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=@��<���9}r79}u+UOJ}�t E@��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���15@��t 9ur6E0tU U@��tU9ru NJEtU9Wu RWE_^��UVu~  u �����6EP*��YE����U UEPEPV~�� yE^��UUAs UE���UUas U E���U Vj�hH ��YYƅyHu uV EVY}u"U JU�j uYYEt��1^���U ��VWDž����Dž����+�����+�����+����+������+���j�h ��V ��YYu+�����g����#Jfh ��Yƅth���Vh+�� hx ��h| ��YYE(��uh���P# ���jhp ��P _����u> t> uF>�t> th���Vh+�� j h+��IYYƅt�Dž����djhh ��P ����9> t> uF>�> h���Vh+��_ j h+��YYƅt�+��,��7E����>�t3-��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h\ ��P Q=+��D> t> uF>�(> +��+��PVYY+��ff U+��+��uY=+���u"+����ff+��+�����=+���u=h���PNYYu&j.PJYYƅtFPh+��YY�]���,��+��+��E����>�t >.uEF+��}|,��sj.VYYF7M���� +��1_^���U<VW}$�t}( s ��j j�u$. }$+��B��f+��f+��f<+��<+�� <+����� ف��fG�G�UxO шO+��t���1W ˆW+��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf<+���<+�� <+����� ف��fO}�`��}�V��m( učEPu(VuEy 2��u֋U(+UU(Vj xYYVujYYVj�xYYVj�PYYf<+���<+�� <+����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuYY}�tuuVo uf<+���<+�� <+����� ف��fO ��EP ��+U$_^�U$UUEPjj��� y U��1UVW5����}׃}�~9r }�y 9vWYu_^���U=���x 5�� Y��������U=���xj�h|��YYY��y'j5��YY ���Pj5�� 1U ��D�� ��D ��=���u/h���hD��5��M ��1V ��D��= ��D ��u1< �� �� �� �� ��= ���u ��D�����U} t} u���1UV ��PYt ��}�u ��:#u1b���5 �� ��U ��:�u1D ��: t(}�t :"u* �� ���P_YtU�>�u1^UV ��U ��P'Yt �� ��:"uR ��jYƅt(>"t#= �� ��u1{��� �� ��0ʋ ��:"u; ���0j�Yƅu1C= �� ��u13 �� ��0= �� ��u1 �� �������E^U=���y _y1Du17j�RY ��tj�AY �� �� �� ��UVƅtu6YYu^�UVu0Y���ƋU rU MJwU uRYY^UVWuU VVu-��YYDžt~~�yVډ ��F_^���UHVWEPuYYxU܁���� ��t1���h��S��Yƅu1���VG��YDž���U9uh��h ��&YYh ��h ��YYGPh ��YYEPh ��YYxU���� ��uUM9uE]9pE]9`V��Y �� V��Y1_^��U$UUEPjj� ��U$UUEPjj�{ ��U$U UEPu YYEPjjM U$u:Y���EU UUUUUEPjj �U$U UEPuYYEPjj UVu x~ �� ���5juqYYy9uuV5YVj�uI ^���ULVWE����1E����E����U UE8�t+0PY���E9uvE���EEE͋UUE8�t(0Y���E9uvE���EEЃ E V!փ}�u s �����K��VYE=u �����&��UEUUU}׋U UE8�t=+UEEE0bY���E܋]P3W] }׃E뻋E�����EUUE8�t=+UEEE0 Y���E܋]P3W }׃E뻋E�����EU9v�GuY���EuUUȋUUE����E����EPj;j� RY_^���U$EPjj�a U$UUU UEPjj= U$EPjj�% U$EPjj� yE��U$UUU UUUEPj6j ��U$UUU UEPj%j� U$UUU UUUEPjj yEU$EPj>j�] U$UUU UUUEd��EPjGj�, ���U} v �����M ���E 1U} v �����M ���ҋE!1UE�����1UE��1U} v �����M ���Et���1��UU$VWEPV ��YEPEPj�N �� j�pYƋ}t9uvE8W��EP ��YE����EPEPj �� W/YUUjEP ��YYEP ��YWj� YZ)‰j�EPj �� j�EPj �� t9r)օu j ��YVYU)_^�U$uvY���EUUU UEPjjT ���Uu hT$uA UV& T$@, T$@% T$@ ����� ��E 7��uVu ^�U$EPj j y}�tUEEU$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E ��.��uVuu+ ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U4 ��=��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��Ud ��]��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E ��M��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu } ��j:��~�y U��Vu C��V€tu ,��fN���V���~���� ��u>5 ����Yt.h���YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�vB =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v3 =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�G���������������������?���G���W�����3�������USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����U}�x}~uRPYYUh ��h ��YYj*Y��UVW5-����Y��DžD���7uYYtw>�t6uYYt} �tu w YYu=-���u��_^U}�u �� ���UEuYuMY��U$EPuNYY1ۅÉ�U0VWEPuYYy1���U؁����@��t �����1���h���uWYYDžy1���EPWYYxS �����U؁����@��u7jWYYEx& ���PjW xh$��Yƅu ��UWVYUЉ ��1FfF��F����_^�UVWuu �� ���1���FQh���^ SP fF^1���FfFV VF=uFF~�u~. ��VffGVjRGP G�WBVVFWB)ډfFWBV4_^�U$} �uE���E����UUE UEPjJj�i y}�tUEEUHVuUVUVUV UVUЋU UEP���Y^UVuEPCYj�EPjM V!���!��5!��h ��jKj� ^���U$EUEPjHj� U=���uh< ��h@ ��%YY�� 5����YU -��U=���t5��Y������-������UVW=���u!hd ��hh ��YY��u1D��5��h���h!�� Eu1��U:#th` ��u ��YYƅt�U%��h\ ��u���YYEt��EU: t: uEhX ��u���YYƅj�Fu���Y%��f<+��<+�� <+����� ى $%��5(%��,%�� %��hT ��VW���YYƅt�Ft8>�t3> t> uF%��s7hP ��V���YYƅt�F����%��_^UVW}Utu >�t]9uFG1_^�Uj�j�u%��� E`�UVuj j�V_ ^�UVWu1fϋV€t}u ~�tu>����F���tV]YU )uRvO EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP�����������������%s: unable to fork: %s ������������%s: unable to fork: %s ����%s: unable to open '%s': %s ���%s: out of ptys ����������%s(do_child): unable to exec login: %s ����w���/usr/bin/login��/bin/login��-f��-h��-p��login���%s(do_child): '%s' didn't result in a controlling tty (%s) ����/dev/tty����%s(do_child): unable to open '%s': %s ���������rlogind: %s. ��rlogind: %s: %s. ��Host name for your adress (%s) unknown ����%s: ioctl(NWIOTCPCONF): %s ����Terminal type too long��TERM=���locuser too long����remuser too long����protocol violation��read failed�rlogind: NWIOSTCPOPT failed: %s ���unknown error���%u.%u.%u.%u.in-addr.arpa��������������A��Z��{��%d.%d.%d.%d�unable to setup 2nd channel ����unable to ioctl(NWIOGTCPCONF): %s ��unable to read: %s �unable to write: %s ����%d��unable to ioctl(NWIOTCPLISTEN): %s �unable to fork: %s �unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��unable to write: %s�����can't get port �unable to ioctl(NWIOTCPCONN): %s ���unable to ioctl(NWIOSTCPCONF): %s ��unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��%s: unknown host ���/dev/tcp����TCP_DEVICE��r���/.rhosts����r���/etc/hosts.equiv����!��������� �����T!��#���������#�����#��[$��������� $�����b$��0&���������$&��0&��&�� &��0&��0&��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��`3�����a���R3��r���J3��w���X3��3�����+���3��b���z3��/dev/���7���������~7��7��~7��7��~7��7��7��7��<�����a���<��r���<��w���<��<�����+���<��b���<��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�/etc/hostname.file��nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��L���������J��K��/���X��������zX��X��X��Y����� ���Y��@���Y��Z�����X���Z��b���Z��d���Z��i���Z��o���Z��p���Z��u���Z��x���Z��[����� ���[��#���[��+���[��-���[��0���[��^�����L���\��h���\��l���\��\�����E���I^��G���4^��X���]��b���]��c���^��d���]��e���I^��f���I^��g���4^��i���]��n���]��o���]��p���]��r���^��s���Y]��u���]��x���]��(null)��cannot print floating point ����r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���%��/dev/ptyXX��/dev/ttyXX��0123456789abcdef/etc/utmp���/usr/adm/wtmp���TERM=�����������������������������������������������������������������������2������K���� ��n����0������@������P������`��,���p��X���������������` ����������%������K������������������������������SSSS����/etc/passwd���������������������������������������������������������B��������������� �� �� ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���@ ��4 �� �� �� �� �� �� �� �� �� ��` ��P ��< ��0 �� �� ����������������|��h��X��H��0�� ������������������h��T��\��\��\��\��\��\��\��\��\��\��@��(�� ����������������l��T��@��(��������C���/etc/ttytab�����/dev���� -����������������begrom��������_do_chil����_deallocy����_wtmp�������_setup_t����_num2spe]����_do_cont����_readall ����_getstr� ����__calls�T ����_string2 ����_getansw����_h_addr_����_host���<����_host_alP����_hostbuf����_host_ad����I_1���������__checkhl����I_25��������I_1���������_dn_find#����I_3����������_s������ ����_tcp_con.����_tcpip_w/����_udp_con0����_udp_sen0����_alarm_h11����_udp_recL1����_PASSWD� ����_pwfd��� ����_buflen� ����_getline4����_scan_co85����_pwfile������_buf��������_pwline�����_entry������_bufptr�����_lineptr ����I_1�����$����failure�?����slword��?����sword���@����sbyte���@����done����@����next����E@����found���c@����failure� A����_unknown\����_grow���tA����__bottom8����__top���<����__empty�@����_TTYTAB�|����_ttfd�������_buflen�����_getlineM����_white��CN����_scan_wh]N����_scan_quN����_buf����D����_ttline�D����_ttargv�D ����_entry�� ����_bufptr� ����_lineptr ����_argvptr ����_base�������_path��� ����_handler8W����_gnum��� Y����_o_printsY����_do_writ\a����SEND���������RECEIVE������BOTH���������SYSVEC��!�����SRCDEST������MESSAGE� �����uplword�(e����upword��5e����upbyte��<e����done����>e����downwardEe����no0�����~e����compare�e����done����e����no0�����e����I_1����� ����_servf������_any����k����_line���!����_serv���%����_serv_al,%����begtext�������begdata�x ����begbss������crtso���������___main�P�����__penvirx ����__fpu_pr%����__penvp�%����__edata�����_exit���m ����_environ ����endtext�dm����_main���T�����_pty_str| ����_tty_str ����_hex_str ����_PATH_UT ����_PATH_WT ����_term��� ����_confirm� ����_fatal��E����_prog_na%����_hostnam%����_line���&����_luserna*����_ruserna*����_authent+����_env���� +����_args���+����_strerro ����_fork���?����_memchr�?����_write��?����_memcpy�?����_strrchr@����_setsid�P?����_tcp_urg ����_fflush�8����_tcsetatp?����_getppid ?����_close��>����_chmod��>����_time���x?����_strtol� ����_strncpy@����_ioctl��(?����_errno�� ����__exit��>����_strchr�8@����_execve��?����_authentL ����_kill���0?����_dup2���>����_sprintf>����_printf�=����_read���H?����_fprintf=����_tcgetath?����__tmp���<+����_chown��>����_open���@?����_stat���`?����_lseek��8?����_memset�?����_fttyslo6����_fdopen�3����_do_rlog ����_ruserok����___stder ����_strcpy�@����_getpwnat6����_inet_nt����_gethost"����___funcc ����__clean� ����___funct@+����__sys_erl����__sys_nex����_strtoul ����___ctypeX����_gethost����_h_errno+����_res_que@%����_strlen�@����_inet_ad����__getsho$����_dn_expa ����_dn_skip#����_res_sea\&����__tmp_l�+����_inet_at ����.csa4���l����_rcmd���<����__check_ ����__validu����_getpid�?����_alarm��>����_sleep��X?����_index��?����_tolowerD����_strncmp@����_strcat�(@����_fgets��:����_fclose�T8����_fopen��L<����_fstat��?����_signal�D����_strcmp�x@����_getenv�A����_gethost(E����_dn_comp!����__getlon$����___putsh$����___putlo%����.csb4���m����_res_que'����___hosta(����_res_iniE����_strcase@2����__res���+����_res_mkqI����_res_sen)����__res_cl.����_free���D����_malloc�A����_strncas2����_toupperE����___iotab����_endpwen3����_setpwen&4����_setpwfi4����_getpwen5����_getpwuiM6����__read��(8����__open��7����__fcntl�d7����__close�D7����_ttyslot6����_ttynameP����_endttye M����_getttyeO����__syscalP����__loadnalP����___stdin ����___stdou ����___cleanj:����__lseek��V����__write�X����___fillb;����__creat�R����__doprnt[����_snprint*>����_vsnprinL>����_vsprint>����___flusha����___exit�Q����__alarm�R����__chmod�4R����__chown�`R����__dup2��R����__execve$S����__fork��4U����__fstat�LU����__getpidpU����__getppiU����__ioctl�U����__kill��U����__setsid8V����__sleep�=W����__stat��$X����__tcgeta\X����__tcsetatX����__time��X����__memcpye����__strnca`e����__strncme����__strncpe����__strnlee����_reallocB����__sbrk��L����__brk���L����__sigactPV����__sigempV����_getservHf����__brksiz����_setttyeNM����_getttyn=P����__sendred����_readdird����_opendir|d����_closeditd����___sigred����__sigaddV����__sigdelV����__sigfilV����__sigism�W����_sigprocd����_sigfilld����_sigsuspd����_sigactid����_raise���f����_sigemptd����_sigdelsd����__f_prin(f����__i_compd����__isattyf����__closedf����__opendig����__readdih����__sigproi����__sigsusi����__sigreti����__send��d����__receivd����endbss�� -����__memmov�e����__fp_hoo����__serv_s-����_endservGj����_getservuj����_setserv j����__sigjmp`i����_rewind�(l����_atoi���Dl����_fseek��\l����ECASE��������.fat����8m����.stop���Dm����.trp����Lm����.trppc������ERANGE�������ESET���������EIDIVZ�������EHEAP��������EILLINS������EODDZ��������.ignmask����__etext�dm����endrom��x ����enddata�����__end��� -����������������������������������������x ������������������������ -��������������������������������������������������������������������������������������������������������  ���a����\?������L������1$T$L����su;SSSSu< ��< �� QRPL%�� ���P" �����UtVWE x5��}t#u5x5��hD��hP��8��j��Yj�jW ��YYj�jL ��YYj�jA ��YYEPh1nj�9�� ƅy35�� ��YP5��5x5��h ��hP��.8��ju��YfUf|Q��|Q�� |Q����� ف��fMUʁ���} Uʁ���} EP5x5��h��7�� j ��Yj<8��YfE��jEPj� 9�� ƅy+5����YP5��5x5��h��hP��k7��j��Y}�tUk ]Ã0��f]j�G8��YUȅf��u8��EE���U���#M щM}}���|E���M}���}E��jh��G8��YYEąy35����YP5��5x5��h��hP��6��j��Yu��YE!����#Uf|Q��|Q�� |Q����� ف��fMfUf|Q��|Q�� |Q����� ف��fMUUEPh0n@uh7�� ƅtR=��:t35����YP5��5x5��h��hP��5��j��Yu6��YM}�}�uh��5��Yj��YE���EPh0n@u6�� ƅy35����YP5��5x5��hp��hP��G5��j��YE����E���EPh2n@u6�� ƅtT=�� t<=��;t35��+��YP5��5x5��hL��hP��4��j!��YMt jg6��YjjEP �� Euu} ��YPh ��4��YYj��Yh��jhh5��8�� h��jhX5��$�� h��h��hT%�� �� a*��hX5��,��YDžuh���L4��Yju��Y *��w25��Yy h���#5��YEhX5��hh5��j�0��yh���3��Yj(��YUȅ,��Y5��E5��EyG=�� t+5����YP5��5x5��h���hP��3��h���3��Yj��Y}�^���j�4��Yjz4��Yj�jx4��YYjjm4��YYjEPu4�� j�t��YE����EUPRw4��YYȍEPz4��Yƅy"h��� 3��YjA4��PK4��YYj'��Y4��EyV=�� t+5����YP5��5x5��h���hP��2��ht���2��YUjR3��YYj��Y}����u3��Yh���h|5��u3�� ƅju3��YYj���YE|5��~Vuu3�� EB5��9��YP5��5x5��h\���hP��1��UjRD3��YYj ��Y+Uu2��Yu2��Yju2��YYu2��YW :�uG T���GP3��YGP3��YhP�����YE����j:whT ��3�� j9w h ��3�� j7h@ ��3�� }�th��uh ��3�� ������j/w 3��YYEtEW UUȅu jj2��YYjhL���jr2�� j�hT%��hH���uw 1��j1��Yjh<��� 2��YY5����YP5��hT%��uw 5x5��h���hP��`0�� j1��P1��YYj���Y_^UjEPj�1�� =���tjo���YUM EM uuhh�� 0��YYjH���Y}�uUju1��YY ���Pju 1�� ��UV5��Nx Q��^U=���t��u0��Y�UVW< ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVu~  u�����6EP6)��YE����U UEPEPV(�� yE^��UVux95��x����^U8VWE���U UUUUfRf|Q��|Q�� |Q����� ىM؋UfRf|Q��|Q�� |Q����� ىME ��E��u }����}�`���uuVuuk��Džy�R�����1��W΋U��u+0��Y���ljUUU)UVuV��YY���ZMԃ}�~DVuV��YY���Z߃}�t&UBt �R����� �R�����1+��E��E���������E��E���������E����M��9u��uuVuu[��Dž��VQ��YEVD��YEV7��Yǃ}u@ց}��sUEEu.��Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U������}�u}t }�t&9=��t U9UtQ=��UŨ}u���1��}�u U��uu.��Y���ZЉE���E1UU!��s-UEȉEWVR'-�� UUE;}�tE�����E������� �R�����1_^U��VW}-0���= ������>����N>.���W��Y$��=u�R�����1���=������������������������$��������������X-0���= ���r>.uF\h����PjjWf��y1j��Pi _^U��VW}}t1���PGPGPGPh��P*��h���Pj jP��Ey1HjuP ƅu1*UVU V ��$��������$��_^��UVuEPV���YYtE�����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��EO��} �tF=R�� R����� ًR����� ʋ R����� ыE ���_^��UVuFPFPFPPh��h(��?'��(��^U@VWE@��uC (��Ef@���@�����#M с��f @��}@�����|h��YEuEt��E0XYEu!]3h`��hP��O&�� ��EEE���@��J��f@��@�����} f@��jun'��YYDžy'5��YPuhH��hP��%��7��E!��f@��f|Q��|Q�� |Q����� ف��fM��#U fUURUEPh0n@W&�� ƅy9=��:u Wq&��Y���5��pYPh$��hP��+%�� ��E���EPh0n@Wq&�� ƅy$5��-YPh���hP��$�� L��E����EPh2n@W.&�� ƅy=�� ujU&��Yy =�� tʅy-=��:t$5��YPh��hP��z$�� ��y M}�0}�uh��hP��L$��YY��}�u?jh��W%�� =���/��5��HYPh��hP��$�� g��jue%��YYEy'5��YPuh��hP��#��-��E"��f@��f|Q��|Q�� |Q����� ف��fMEPh0n@u$�� ƅy$5��YPhx��hP��M#�� ��$��EЅy$5��bYPhd��hP��#�� ��}����j�$��Yj�jYYj$��YE����EPh3n@u<$�� ƅy=�� ujc$��Yy =�� tȅy0=��:t'5��YPh@��hP��"�� jYx j�YjYj$��Y@��Ph<��EP"�� EP$��Y���PEPW#�� PEP$��Y���Z9t$5��=YPh$��hP��!�� \��uT$��Y���PuW#�� u9$��Y���PuWi#�� u$��Y���PuWN#�� jEPW#�� =���t$5��YPh��hP��m!�� ���}�t5jEPW"�� =������jEPj"�� } u���}����UEEPh1nuk"�� ƅy!5��'YPh��hP�� �� IfUf|Q��|Q�� |Q����� ف���|h��hP�� ��YYxW!��Y}�x u!��Y_^U8��VWDž���Džu>�tF>.uu +UFG-A���=���s FP'��YFG�} �t1h��h��j��YYE}�t;uuPu��uu=��Y1���u-��Y���=���u } ����Dž����u��Yu ���rP!��YYh��P!��YYh��P��YYEu]UPrD ��YYu0tB9uuJ��Y_^U��VWuh���Pj�� ���> t2> t-> t(>�t#-A���=���s P&��YFɀ> t> u*�F> t> uF> t> t> t >�tF�uPu 7��� N?�tEPu ��YY/1_^UVW} }uWu��YY1ۅÉ ��uWu �� t1���Wu��YYu ������U:�t1���=���t1���=������h��h<��5%��YY=u�����1���<���j.h<����YY��u�����1T����ր>�t-A���=���s P$��YF݋UUR5����YY1ۅÉ_^���UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��C���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��A��+U_^UVWUUU9U���usU��uU��vU��wU��xU��yU��zU��{U��|U��}U��~U��U��U��U��U��U��U��U��U��U��U��U��U����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��@��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VWR��uM ��=u ���h����Pj�j�j�uu uj�$��$ƅ�R��������uuV�P��ƅy�R��������}Gu^fWf|Q��|Q�� |Q����� uL0�R�����7�R�����+�R������R�����W�� ?��_^UVWE����R��u-��=u N���������R�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u R��€u$}����N>.���R��������,S��?�q���uuuu 7u���E~���=��;u�R�����l���=�R��uE=�R��t =�R��uR�����t놃}�t"uuuu j�u%���E~}�t �R�����_^U��VW}} �uBW��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h ��P��uuuu_^U��VWh0�� YEth,��u ��YYEu1���E�uh���P:�� ���>�t��uF>�n����uP. ��YYuF��u>�tDG?�t��uG1҈C��h���VhD��m�� uV��YD�� uF��Y1_^���U@��VWE����E����E����UUЋUUE=���R��u��=u ��R��u } ���~���1EUffUE���� R��9UY��E����R��9U;��}���Dž���� R��U=����y2UMEPU$R��P4R��w�� ���=����#U f|Q��|Q�� |Q����� ف��fMjEP5����� =���t$��U5���a��Y���^��u u5����� 9E t$��U5�����Y�����}fE�U܅t2EPW5���L�� ƅ~U)��fUU܅tB��U5�����Y���}<��}���E���M��}ff|Q��|Q�� |Q����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5���p�� ƅ~U)��fUU܅t$��U5�����Y��������UJÜJU+U��fUU܅V��U܁���v���E܉VP5����� ƅ��U)��fU멃=����y�����y��U'��UMU$R��P4R��u u5���(��9E ���MR��Uԃ}�~ Eԙ=R��Eԃ}�E���uuu5�����E=u=�����E������E���UM9uR�� u+UBt"5���K��Y���E���}�tR��t}�u R�����u5�����Y���Ea���EE=����x5�����Y���}�u}�u ��;�����=��� Uȉ��_^U=���t5���w��Y���U$VWhH��YDžu<��jW��YYƃu��E���E1��UUfU fUEPh0n@VB�� E=u��EV��YGE����EPh2n@V�� E=u��EV��Y E�����_^UVWuut.Vu u�� Dž U)U U )΋E_^U VWh`��YDžuT��jWt��YYƃuEE7��3EPh@n@V>�� E=u ��UV ��YU��_^UVW���UR��Yƅu�� ���w���UWfUfW fG ����#UfWuu FP�� ���URVu �� E��UV��Y}r UUU��E_^Uh%-��jYYj ��YUVW���UR1��YDžu�� ������h%-��jsYYEu ��YE���URWu �� Ƌ��Uxw7~1W��Yj�i ��YujYYuT ��YU��@RGPu �� W��Yj�# ��YujYYu ��Y_^��UVWEE�P��YNjE E �P��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�PQ��YNjE E �P?��Y9uuąt9}���t��� t1_^��U=���x 5����Y��������U=���x=D���u D�� ��j�5D����YY��y'j5��N��YY ���Pj5��9�� 1U^UD��Ud ��H��=���u/h���hH��5���� ��1V` ��H��=d ��H ��u1< ��` ��` ��d ��d ��= ���ud ��H�����Ud ��Ud ��Ud ��:�u1d ��: t d ��::uҋU�EUV=���yy1���u1���H ��txX ��tjƅtj�j�V*�� fL ��Lƅtj�j�V �� N ��/\ ��t!P ��yT ��gd ��:�XH ��^UV%ƅt F9Eu^UV{ƅtu6 ��YYu[^��U$UUEPjj�� ��U(VuE����E����V֋RUV֋RU l��E 7/��UUU UEPj7j.�� ^U(VuU @t*u: ��Y���EU UV֋RUUUEPu��YYU UEPjj�� ^�U$UUUUU UEPjj�� ��U$UUU UUUE:��EPjGj�l�� ���U} v�����M ���E 1U} v�����M ���ҋE!1UE�����1UE��1U} v�����M ���Et���1��UVW11}U9h��u h������F߃| j���ug���YtUrYtURtUz�t rr ��Y} ��t}8��t}P��t uN ��Y_^�UVWuE����u41}%<h���t4h��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv+�� E����U9Uu1 N _^UV1}*<h���th��B���t 4h��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h�����YF~�uN NF ���1}9<h���t,h��R@th��B���t 4h��YGƒ~�uFh ��FF ���VVv vv% >�uNN FFSX_^UVWE����E����11<h���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���O)��U :�t! E���E E ���&)��U uuuYYEy@Ut8h��u��YYE~"��� tuYuuYYE}�y1]���j��YEu uY1A���!uE�����UMJUzUB����Uh��E_^UUUuuu �� �UU Uh8��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj�h��YYEUuu hu��s���������������o��������;�����w���W�����g����������������������������#��������K�����c�����s�����������������;��������������UVW}u M ���������������!��������UW}���0))ϊE tu1_]XG_]�������������� ��������UVW ��E_^]����������!��������T$ s ���������L$ ���������UVWM ��E_^]��������UW}0OE uG_]1_]��������UV ��U9 ��wU �����9 ��v�� ���16VP ��Yt1' ��rF����5 ��&��Y5 �����^UVW}�u1���E����}������UUs�� ���1���=| ���u8j ��Y=u1���V!փ5| ��5 ��F����E����5 ��O���VU}9}r69v2W9UvUW~>}�t E ��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����= ��<���9}r79}u+UOJ}�t E ��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV` u���Y_^U VWUUb���15 ��t 9ur6E0tU U ��tU9ru NJEtU9Wu RWE_^��UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+��"���}�t}�y��� UU_^��UUAs UE���UUas U E���U Vj�h( ��UYYƅyHu uVJ EVY}u"U JU�j uYYEt��1^���U ��VWDž����Dž����R����� R�����R����R������,R���j�h| ��Z��YYu�R�����g����#Jfhp ��_Yƅth���Vh,R��p hX ��h\ ��DYYE(��uh���P{ ���jhP ��P _����u> t> uF>�t> th���Vh,R�� j h,R��)YYƅt�Dž����djhH ��P ����9> t> uF>�> h���Vh,R��O j h,R��YYƅt�,R��,S��7E����>�t3DS��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h< ��P Q=R��D> t> uF>�(> R��R��PVYYR��ff U$R��R��uY=R���u"R����ff$R��R�����=,R���u=h���PNYYu&j.P*YYƅtFPh,R��dYY�]���,S��,R��,R��E����>�t >.uEF,R��}|8S��sj.VYYF7M���� R��1_^���U<VW}$�t}( s ��j j�u$ �� }$*R��B��f*R��f*R��f|Q��|Q�� |Q����� ف��fG�G�UxO шOR��t���1W ˆWR��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf|Q���|Q�� |Q����� ف��fO}�`��}�V��m( učEPu(VusEy 2��u֋U(+UU(Vj hYYVuZYYVj�hYYVj�@YYf|Q���|Q�� |Q����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuYY}�tuuV uf|Q���|Q�� |Q����� ف��fO ��E��+U$_^�U$UUEPjj���� y U��1UVW5����}׃}�~9r }�y 9vWYu_^���UVu\Y���ƋU rU MJwU uRYY^UVWuU VVu-��YYDžt~~�yVډ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$EPu.YYEPj j[ ��U$U UEPu�YYEPjj- UVu x~�� ���5juuYYy9uuV9YVj�uM ^���U< ��2E Pu��� ULVWE����1E����E����U UE8�t+0Y���E9uvE���EEE͋UUE8�t(0oY���E9uvE���EEЃ E V!փ}�u s�����K��VdYE=u�����&��UEUUU}׋U UE8�t=+UEEE0Y���E܋]P3W }׃E뻋E�����EUUE8�t=+UEEE0bY���E܋]P3W }׃E뻋E�����EU9v�GuY���EuUUȋUUE����E����EPj;j� R%Y_^���U$EPjj� U$UUU UEPjji U$EPjj�Q U$EPjj�9 yE��U$UUU UUUEPj6j ��U$UUU UEPj%j� U$UUU UUUEPjj yEU$EPj*j yUEUMJ1��U$EEEPj.j�J �U$EPj>j�1 U$UUEPjj� ��UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj9�� V �� ��5 ��h ��jKj� ^���UU$VWEPn ��YEPEPj�f �� j�$YƋ}t9uvEN��EP+ ��YE����EPEPj �� WYUUjEP ��YYEP ��YWj�YZ)‰j�EPj �� j�EPj �� t9r)օu jR ��YVuYU)_^�U$UUUUU UEPjjo ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E ����uVuu+ ��ƀ}Xu9utUP'YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U ����E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U( �� ��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�EH �� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }��5��~�y U��Vu C��V€tu ,��fN���V���~����8��u>5<����Yt.h���YFu NL���NHF ���9h���RYFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v] =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�w������������w����������USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����U}�x}~uP<YYUh ��hP��YYj&Y��UVW5HS����Y{��DžD���7uYYtw>�t6uYYt} �tu w YYu=HS���u���_^U$EPu���YY1ۅÉ�U$} �uE���E����UUE UEPjJj�A y}�tUEEU$EUEPjHj� Uu hT$u U=���uh� ��h ��YY�� 5����YU HS��U=���t5��Y������HS������UVW=���u!h( ��h, ��YY��u1D��5��h���h �� Eu1��U:#th$ ��u ��YYƅt�U$��h ��u���YYEt��EU: t: uEh ��u���YYƅj�Fu���Y%��f|Q��|Q�� |Q����� ى $��5$��$��$��h ��VW���YYƅt�Ft8>�t3> t> uFH%��s7h ��V���YYƅt�F����$��_^UVW}Utu >�t]9uFG1_^�Uj�j�u%��� E`�UVuj j�V[ ^�UVWu1fϋV€t}u ~�tu>����F���tVMYU )uRvo EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP�����PATH=:/bin:/usr/bin�%s: execl(%s, %s, .., %s)= %d : %s �/dev/tty����-c������TZ��/bin/sh�%s: write()= %d : %s ���Try again. ����%s: fork()= %d : %s ����Can't make pipe ���Try again. ����%s: fork()= %d : %s ����Permission denied. ����/���Login incorrect. ��cmdbuf��locuser�remuser�Host name for your adress (%s) unknown ����%s: ioctl(NWIOTCPCONN)= %d : %s ����%s: ioctl(NWIOSTCPCONF)= %d : %s ���can't get stderr port �%s: ioctl(NWIOSTCPCONF)= %d : %s ���%s: open= %d : %s ��/dev/tcp����%s: read= %d : %s ��%s: unprotected port (%d) �%s: ioctl(NWIOGTCPCONF)= %d : %s ���%s: wrong number of arguments (%d) �%s too long����unknown error���%u.%u.%u.%u.in-addr.arpa��������������5��N��o��%d.%d.%d.%d�unable to setup 2nd channel ����unable to ioctl(NWIOGTCPCONF): %s ��unable to read: %s �unable to write: %s ����%d��unable to ioctl(NWIOTCPLISTEN): %s �unable to fork: %s �unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��unable to write: %s�����can't get port �unable to ioctl(NWIOTCPCONN): %s ���unable to ioctl(NWIOSTCPCONF): %s ��unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��%s: unknown host ���/dev/tcp����TCP_DEVICE��r���/.rhosts����r���/etc/hosts.equiv������������������H������������������O ��������������V ��$"���������"��$"�� "���"��$"��$"��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��2���������1��2��1��2��1��1��1��1��8�����a����8��r���7��w���7��V8�����+���78��b���-8��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�/etc/hostname.file��nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��H���������F��G��P����� ���aP��@���P��Q�����X���Q��b���Q��d���Q��i���Q��o���Q��p���Q��u���Q��x���Q��R����� ���R��#���R��+���R��-���zR��0���R��U�����L���mS��h���WS��l���bS��S�����E���!U��G��� U��X���wT��b���wT��c���T��d���T��e���!U��f���!U��g��� U��i���T��n���S��o���wT��p���wT��r���eU��s���1T��u���wT��x���wT��(null)��cannot print floating point ����r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���P%��USER=���������������HOME=�����������������������������������������������������������SHELL=����������������������������������������������������������TZ=�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������T �� ��@ �� ����������������������������SSSS����/etc/passwd���������������������������������������������������������B��������������� ��8��P����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error��� �� �� �� �� �� �� �� �� ��p ��d ��@ ��0 �� �� ������������������p��\��H��8��(�������������������x��d��H��4���������������������� ����������������t��`��L��4�� ����������C���LS��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���X�O��l����� X�����1$T$LO��O��su;SSSSuN��N�� QRPL� ���PP����UVW���=d��td��=`��tkK�a��ƅujw5N����YYhl���K�Y��Vhz��Q�YYEy#j|5N����YYuhT���K�YY���I�>u V��Yg9=X�uVI�YV2��YL~tjh0���vh���5N����V4��YV��YU ��R��@E��K-�Ru��5��&��j�hM� O�YY=uh���J�Yj~O�YEPhSO�YY=uO�UT�f\�fUE���EPhF@O�YY=u5O��h���J�YY[O�j�hX�h���vN� t"h���5N��F���YYh|���GJ�YL���`��38�G�-��R��_D��j,�yt��W��&��Uu uh���I� Uh ��I�Yj%��jM�YUu uYYuh ��I�YYUu uYYuuuh8��I��U5O��uhT��nI� jN�YUufN�Yy=O��tuYuhh��2I�YYU$Vu\�%��� EfEލEPVM�YYy=O��t9VnY0U���� ��u E]9tRVM�YyV<YEU � ��PRVyM� yVY\�uPVhp��H�^U@VWu }EPW\M�YYyWYEPVEM�YYy=O��t3VY*E]9u UM9t5V'M�YyVYVWL�YYyVtYVWh��G� _^UVW1���N��UE0EPN�YYEPPN�YZփ} | ���E 0���F ���E 0F�}�tu}u u,}t&EPYN��9U R���E0YEUM ZًUZ��QSEP N��9U uE0EPzYYG_^U5O��h��F�YYjkK�YUVO���N�� ?=N�� uO��jhN��5O��zK� =���tɃ}�������O��s N��FjhN��5O��9K� =���tN�� =O��;t=O��{t =O��}u }�t20+N�� ~=N��;t=N��{t =N��}y�^U VW}1-0���E= ���s9u r k uGހ?�u9u su uh��E� _^U@VWj�h��TJ�YYO��=u h��Yt�E��j�Y=O�����jh��hO��TL� z���jhO��.YYEFE���h�Uj+YhO��L�Y���P��YhO��6K�YYjYjhO��YYFh�_���jh��hO��K� u1jhO��YYEUE���l�UEl�hO��h|��OD�YY^UE􈐴O��UWUUWj�YY=O��{y���j�DYht��hO��J�YYu5=N��tu5N��hH��C� UN��j�Y=O��;uj�Y=O��}tj�Y=O��;t=O���tp�&=N��uh��eC�YjG�Yj�]H�YEPh ��>H�YYy h��YfUf\�E����}sEuO��S&YYE_^U���URG�YUhVWE����5�Et�h�9U��Ej�]S0F� Et)j,5N��YYEu0h��B� UJNhUVd��PZ��YE���VhUЋT�UE����EPvd�H�YYEyuhP��B�YY���EPvdG�YYyjD5N��YYh<��A�Y}uvhvdh��A� ���U9Vht#jR5N��YYuh��A�YYU܉UE���}�~MEEGUJAh)]��h2U��hY��hy\��h]��hT��uQ�� F ����F����Vp��Y\��E\��ED_^UlVWu~ �th��jo5N�� U V VpUE����1U U}C}�t=U�R �R QMURMTUUGURU븃f���u 3�YE F E����1U U}C}�t=U�R �R QMURMTUUGURU븃|h��h���5N��" }<}h��h���5N�� uURUEUE���}UUE���VhUT�UE����EPvdTE�YYE=��EPvdLE�YYEy"h���5N��FYYh��G?�YLuU9Vht EP� ��YEUuh`��h���5N��4 UtP9uuhH��h���5N�� UEP��R ���4J�UUMRh��XQ<W�� UUEP8��R ���I�UUMRh����QV�� }�y"h���5N��GYYh8��H>�YMEPvdD�YYEy"h���5N��YYh$��>�Y}uU9u T�9Uth��h���5N�� Uth��h���5N�� Ut-EP8��P ���I�uVh����PV�� Uj���U �R �IJ MUuVl€t,EP��P ���H�uVh��FXPU�� v .�YF ����_^U VW}th8��h���5N�� w-:�YE����5�h�9U}W9Vhu9Vdt E\��ۋh�9Uu)h���5N��~YYw7h��z<� }��#WUuh��h��5N��u UtV��YUt wV'��YY_^UPVW}E ���WhU܋T�UU UEPwdA�YYƃ[���EPwdA�YYƅth��h��5N�� }tjh��uh ��5N��EPY댅th��h#��5N�� EPwdAA�YYƅth��h&��5N��l }th`��h'��5N��N UօthT��h*��5N��* }�t EPY1_^UPVW}1U tU @tU €tE���WhU܋T�UuEPwdb@�YYE=a���EPwdZ@�YYy"hV��5N��WYYh\��X:�Y]}tjh8��uhY��5N��EPY}y}�y&h_��5N��YYuh$��9�YYEPwd?�YYy"hb��5N��YYh��9�Y}th��hd��5N�� U9Wht"hg��5N��xYYh��y9�Y~U Wl_^U VW}w G ����5�V �IJ MUuWl€tV+�YPVWiM�� V*�YWL��Y_^UVWu~F����u j�W-� EWR*�Yu uVM�� &V���Y_^UdVWu`th��h��5N�� ~�thx��h��5N�� ���Uh��K(�YEE����E}G���}�tAU�R �R QM]ˋUMMRQEURU믃}�thl��h��5N�� E���VhU؋T�U܋UUUUEPvd=�YYE=���EPvdw=�YYEy"h��5N��qYYhX��r7�YwU9Wht EP,��YNjUuh(��h��5N��a Ut*EP��P ���B�}Wh��GXPO�� U99uh��h��5N�� EP8��P ���/B�}Wh����P:O�� }�y"h��5N��YYh���6�YEPvdV<�YYEy"h��5N��PYYh��Q6�YV}uU9u T�9Uth��h��5N��F Ut!Uj�hp��Rh��5N��AUt-uj�u*� EuH'�YuuVJ�� UV Ut*EP��P ���@�uVh��FXP N��  @_^UVW} ��9Uth4��h��5N��n 8��~th��h��5N��H V9Whth��h��5N��( Vuh��h ��5N�� fvWYY_^UVW} WX9Uth��h��5N�� ��~th��h��5N�� V9Whth|��h��5N�� Vuh\��h��5N��g fWY_^UVW15�9=h�~UR9Vht G\��9=h�h��h0��5N�� _^��UVe������1���},k,e��O��k,O��e��k,ǃO������F^UV5e��uh ��j&5N�� V$e��F$����~(�th� ��j*5N��r F(���^UVue��V$5e��~(th$ ��j45N��5 F(����^UU VWu=t���0��~�u%j�j�v �� Dž��VY1��j�j�hz�� �� ���V��YE���E������VB��Y1E���E������V��YDžt th ��h���5N��h 1u@EE����}���V��YDžtth ��h���5N��$ 1u@EE���F����8h���5N��YYv6hp ��1� D ��F&=�}�t j�WVP�� }�tVMY_^UV}�x}@rh ��h���5N�� kE<Ɓe��th ��h���5N��[ ���U VUV UVUVUVU VU$V ^UVWURUx}@v ���kE<e��u }���1@sk<e��tF@r V���k<ǁe��kE<e��PW���;����j�h0#��h!��VwW Ey ����EUW_^UVUrl��YƅuhP ��h��5N��; <th0 ��h��5N�� th ��h ��5N�� vVY����^U VWUr��Yƅ���h4 ��h��5N�� {���V,UV0UE���E���l���V4UV8UE���E���PV$UV(UE���E@���4h1��5N��YYh ��/�YUX ��B|:�U\���Uuh� ��h7��5N�� E8�uh ��h8��5N�� EMJ$UED��E8�th ��h>��5N�� UEEU ���UrvVYY���UrvVYY���URU��U���vC-e��<���jj�jP��Džth ��hV��5N�� 1���uvVYY4h^��5N��YYh ��-�YUp ��B9�t-t%Wh ��z-�YYh ��hc��5N�� uU _^U VWUR UE����E����Ur[��Yƅuh ��hv��5N��* uujF(Pv$V���ǃt���uujF0Pv,Vy���ǃtd���uujF8Pv4VS���ĒU��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��U��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ǃtAh��5N��sYYUM]Ej�j�r qs0h< ��Y,�\_^U VW1u j���U9V W���u4UMurQ YYEth ��h��5N��! 1+V$W$VY$�uE8 v$뎸_^UVW}yj�h ��Wh��5N��@rj@h ��Wh��5N��k<Ɓe��uuh ��h��5N��x _^U4VWuV UE����VU}�t}GC���UWU W W60�YYE=u(}�t"=t���t t��r$5t��5t��5}�t"h��5N��YYh ��*�Y}�tV^Y_^U0VWkE<Ɓe��}�t$V(UE���E@���4V8UE���E���Uuh ��h��5N��R }����U����EU}�uh ��h ��5N�� UR$UU Ujuu U#U؋U U!}�tuuu�� }�th ��h��5N�� 10M JMԋuEPur ��E܅y1E_^U,VWkE<Ɓe��}�t$V(UE���E@���,V0UE���E���Uuh@ ��hB��5N�� }����Uuh< ��hG��5N�� ����EUUR$UU UjuuC U#U؋U U!}�tuuuG��� }�th8 ��hV��5N��i 1M JMԋQr uJ�� _^UVut-uv$u<YE=ut]r$U E^UVWu�YƋE01���VUk U t��5�V �R Qk t��k Ut��UU U vGtuu�����Uu��T�u��=u��u��t��hu��j$-�YYy"h��5N�� YYh\ ��'�Y=u���yE0p�YE�����u�� 11_^U VW}1���WUt7=�W �R Qk t��k Ut��k Ut��FUUUtuu�����T�u��U u��5u��u��t��hu��j%,�YYy"h��5N��YYhp ��&�Y=u���yus�Yu��1u\�Y1_^UVW15t�����U9Vu#th< ��h��5N�� v$̓>�uh ��h��5N�� ~Cth ��h��5N�� V6 +�YYEt&h��5N��.YYuh ��,%�YY0uv$uYGt���������?�uh ��h��5N�� Cth ��h��5N�� W7*�YYEt&h��5N��YYuh ��$�YYWLY���1_^�UVW)�ƅt0VU>uhP ��P$�YYt9w hL ��<$�YhH ��+$�Y_^��Ukp�dPYu��UVWhD���Y15u��E�9=p�~P~ Fu��UJhC��h/.��hW=��h15��h<��h*��WQ# V���YGdE_^U VWu��F���V h6��h,��h*��RRJP��F~�y F������h"n8@v]S��YYE=u}����~���&h!n v*S��YYE=u}����~u���&E����u��}s&t9wut wue��YYE@V ��Y1h���5N��YYhX��"�Y <��F-�_^UVW1sЋu��tGr `���ցu�����kEdu��FU V F����UV UV$~(�thh��h��5N�� F<����_^UVWkEdu����}�uh@��h��5N�� }�u2U Uy F�����F���tVY1j��} �th8��h,��5N��r }8th ��h-��5N��T j8�YE죤�P HJ ME�3�UB4E���}�th��h8��5N�� uh��h9��5N�� }�v���U U~�uh��h=��5N�� v�YF����t6~�t~F����'j�uW@��  tIV��Y@&;uu v$� *vuu uh�� � ��F}+�1_^U VW}kEdu��y��u6U UyF���1l��F���X��VYL��j W�YYlj=�W �IJ MEuh��h��5N�� URVW�Y���h��h��5N��W uh��h��5N��8 uEU Uyj�h��uh��5N��3t&V2��Yy���&q���} �th��h��5N�� Wt�YPWu �� =h��5N��sYYvWu uh`��j�m L��F)�1_^UVWUցu��uh<��h��5N��C VUU VUz������V���Y���j �YExth��h��5N�� U�R �IJ MFPu���(�VMRQjuj�v V$Džu-jj�V�� jjV?�� 1 ��E (�t&_^UPVW}jjj�w W E؅u ��ju.�YYE؃xth\��h��5N�� U؉�R �R QREP���(�u#�YGPEP���'���#UUċU��UUܾ��!��UȅutjjWA�� 1��UtjjW%�� 1�����u ���#U ֋U tjjW�� 1�� ���u ���#U fUfUP ���!u-u��@���P��YfE( ���!uUujjW�� 1Q��U u���#U ֺ���#U UȋU u ���#U ֺ ���#U UȋU ���u���#U ֺ���#U UfUfUU ���u���#U ֺ���#U UȋUUU ���u���#U ֺ���#U UȋU � ��u� ��#U ֺ� ��#U UȋU U���t% t E� �tjjW�� 1E�� ���#Ut ���#U���E����Eu��}���9}o���Ea���UO9JR���RU t ���#Uu7UMZ9u(���#U���#M9tjjW�� 1���EE@rtWE��YUU܍EPGP���%�U Ut8 t3t. t)E���t E���tE���tE� ��t'tW��Yjj�W5�� 1_^U���U��f�� ���� ف��fMEP��Yt E���fEU��}ZfUf�� ���� ف��fMEP���YtE5UB��fUh��5N��\YYh��]�Yb1UUMuj�u r Q$Eth��h��5N��B UUMuj�u r Q Eth��h��5N�� UVW1u��stUN9u1 G@޸���_^UVWuh@��v$W��YYǁu(th��h��5N�� t_^U VWUցu��uj�jV 1GU V0~(�t3�9F8| V/���Y(~(tWUWf�Y}F(����_^UVW}w(VW(V �YEG������jV �YYƃ~}h��h,��5N�� 5�V �IJ MQ U9Ush��h5��5N��i U+UURuV% � EV�YuU9W0s#w0j�V � EVw�YuW0UUUj�Vj�w W$ExU9Uv EUU'j�j�uw W$Eth��hR��5N�� E_^UhVWkEdu��Ejj�u ^ � jV�YYƉ5�V �IJ MUЃt>V�Yuj�u  � uV<�YYƉ5�V �IJ Muu �YYEE ����U+UЉUsV<�Yu3�Y��ju�YYE죤�P HJ MfQf�� ���� ىM9MsV�Yu�Y��U܋R UU܋RUUJ���E�U܊J Mu ��YfEjEPEP� fEjEPEP� fEjEPEP� fEUjREP� fEU��tV�Yu�Y��z�X��EUffUUfRfUE����UM9Ju E���E ���E���j)�YE䣤�P HJ MԋUEԉUԋMJUfMfJUfMfJ ŨUȋUfB ����#UȋMfQuju� UB}uUUE����j�YE裤�P R PuR����U�R �IJ MԋUЃUā��fQ ujVM� E];th��h��5N��X Uz�tht��h��5N��7 UMJUMRQUz�tRUBEUU1UeE����}��E����}�uUB U$MDž ��}�tUO9���uhT��h��5N�� uh4��h��5N��j U9W���WUU���E���tUO9y���E���t U9Wd���}�tE������#Uu}�t(�u}9E� ��tUU UU E �uu W �� tWY<}�H���URU� ��tUU UU E �uu u, �� Et ugYEh}�t u�Y}�t u�Y}�u,uVB�YYE 1E����Uju r -�� Juh(��hT��5N�� V9�Y}�uh ��hV��5N�� u�Y_^U VWUցu��uh��hb��5N�� tV��Y����~(tWUW��Y}F(����_^UVUցu��VUuj�jV 1?th��h��5N�� U V4V���Yt1^U8VWu~t \��uhh��h��5N�� &�thP��h��5N��~ j�v4j�v V Eu&j�jV ��VUj��YE�P HJ Mj��YE�P HJ ME������ju�YYE�P HJ MQ U؃9V4s-u ��Yu��Yu��Yj�jVs I��Ut-u��Yu��Yu��Yj�jV> ��}�tuju2� EE����V4+U؉UԹ���MRQu� Eux��Y!E����E����V4UE����UU���UM܈UB�UfB��UBUB E���t U܋NJ*}�uhD��h��5N�� UM܋RQ ���#UЃ t UfNf +}�uh8��h��5N��a UMfRfE���t UfNfJ,}�uh,��h ��5N�� UMfR fQ���Uԁ��f�� ���� ف��UfJUfB��UMJuY��YfE΋VjREP� fE΋UjREPv� fEE�EjEPEPW� fE΋UjREP=� fEU҅tUҁ��fU΋UfMfJ}�tuu��YYEUPUUUMJ�th��h'��5N�� th��h(��5N�� UWuP��YPw\��YYE=u w$}�yj�uV5 j�v4V% _^UVW}�uh��hB��5N��8 fE��E����}����U�R �R y׋Ur[���}�t%MjEPEP� fEGNE�������tE���N MtVWEP� fEURUe}�tE�jEPEPg� fEE_^UVWu~�th��ho��5N��> th��hp��5N��  R���&E����~}sy��uu��t#t9wuWYt W@V E@_^UVUցu�����uhP��h��5N��舾 &j�jV ���uh0��h��5N��T &V9ruB����j�jV b���uh��h��5N�� &jjV 1h��5N��跽YYh���Y载 ��E #�1^UVW}u51u��s)~(�tV(z�tURV(u��YG@҃}u/1u��s#~(�tV(URV(u��YG@_^UVWu }>tVJ��YEVz��YuF����(�u UW8w(W,rw,_^UVW}WU ���#W uUR W<Uz %W։1փU$W<U$<_^UVWURUU ���#J u U UUJω1׃U$UE����E0t 9utuv<uhp��h!��5N��% }�t UN<J<V<E_^�Ukh�PPY��UVW15��9=h�~ F���GP_^U VWuD��Vj�hJ��hCH��RR{ ��F~�+��F���hnHv ��YYE=u � �����}�thX��h���5N��J ������F ���y��E����}@}#G��������G����G����E hn@v ��YYE=u � ��v���}�thH��h���5N�� F@������tV��YV��Y9h���5N��YYYvvh��T� W ��F�_^U$VWkEP����}�u2U Uy F���{��� ��t &VPY1a��} �u}th��h ��5N�� j��YE裤�P HJ ME�#��UfBE��uh��h��5N��蘹 }�u0U Uy F����� tV��Y1��UU <vh��h,��5N��? j<��YE�P HJ MURU MQUMJ~@u&}V4UE���}�~9M܋EEGUUBUBUBUBUBUfB�UfB�UBUB��#V@f�� ���� ف��UfJ}VUE���}�~M܋EEGUjFPR]� } V4UE���}�~M܋EEGUjF<P&R� E*vuu uh��� h��F3 �1_^UVW}kEP��֋u��u.U Uy1q��t &Ve��Y&1T��} �th��hu��5N��8 j<W9��YYǃ<r WVi��YYWg��Y1 ��u2U Uy F������� ��t &VY1���W|��Y=H���t"jHh��Wg��YPh��5N��϶jHW��YYǃHtjHhh��wh��5N��蠶=�W �IJ MVUME���}�~MEEU EW��Y1*vWu uh0���� ~۸_^UVuuh��v��YYE=u݃^UVWu���������t7&VDV<F@���vhwS��R�����PF P�����Ey��E����}@f���EO���U9rC���E U4UE���}�~MEEGURV<F@��� EE 됃}@|&/#j<v ��YYE=u }�_^U$VWo��EU �R �IJ MjQEP� Uj&REP� UJ�����Uz��UJ��Uz��uu��YYƅtU9V} F����1q���UM9J��������F���UUE���}�~M܋EEGUVUV@�UVU��V~t ~V���UUE���}�~M܋EEG~uF���URuu��� F���UjRFP� w���h����Yu&��Yh����YFP&��Yh����YUR&��Yh����YUUE���}�~M܋EEG@�UVUJ���u,UM9Ju!E���Eu uY_^UVu���tU 9VDu&F PP��Yuu vVL ^UVW1y��@} ~�tU9Vu U 9VuG 1_^U VW1E����y��}@}&~�u:~ttW9V}E ԅuh��hv��5N��x _^UV}�x8h�9U}-kEP��֋U V���&~uVeY^UVW}yh��h��5N�� 9=h�2kP��։~U V F��������UVLVY1_^UVW}�x h�9U|h��h��5N��荰 kEP��Ex@t'ph��B��YYh8��h��5N��S ��Eu u3YYƅtU9V} F����1q���UV~u-}VUE���}�~MEEG1���~u ���~th��h��5N��踯 z���E����t e�������F���U VUV@�UVUVE���UM JDUBH����Eu uoY_^UVWkEP��֍V 9U th0��h��5N�� FH~H}���|���V Yp���vDVYYDž[���t'wh����YYh��h��5N��萮 Q��EG���,��UWUWj�wV _^���Uih�\��PY�Uhc����YUVWiE\���E]u ���1sЋ��tGr X���ց�����F�UVU V ~$�th��h���5N��荭 UV,UV0UV4_^UhVWUց��VUo��hD��h���5N��6 R��jjj�v V,E�P HJ MFPEP���9�uEP���(���#U܉UU��UUȿ��!��U}tu��YjjVi�� 1��Utu��YjjVD�� 1�����u ���#U ׋U u���#U ׺���#U UU u ���#U ׺ ���#U UU @uC@���#U ׺@���#U UỦUUUE���}�~MEEU EU €u���#U ׺���#U UU ���uC���#U ׺���#U UU҉UUUE���}�~MEEU EU ���u���#U ׺���#U UfUfU؋U ���u���#U ׺���#U UtV��YU UȍEPFP���.��V��YEąyEPFP�����4U3VU U��Utu. ��YEPu艹YYtV'��Yu��YjuV? �� 1��j*��YE�P HJ MFPu�����juj�v V0Eąx jj�V% �� ES��VUEujjV� �� 1/��jH��YEP��Y=H���t$jHh���us��YPh@��5N��۩U�R �IJ MUMUE���}�~MEEU EURuYYEąth��hG��5N��< u��Y=H���t$jHh��u��YPhH��5N��.juj�v V0Eąx jj�V �� E��E S��jjV �� 1_^UVWUց��~uj�jV[ �� 1���thp��hh��5N��l U V<F���tE } <r } ��vj�jV �� 1��� �t n���j�v<j�v V,Eu&j�jV �� 1Cv<uu9��� Ethd��h��5N��ŧ &j�v<V} �� 1_^U(VWU��EPU]u J��UUUB���tE}<r }��v ��Uz �t ��URU���tj��YEU Pju ��YYEU�R �IJ ME���t!UuzE���}�~ M؊GFU€u$UuzE���}�~ M؊GFE���tUMfRfQ UjRuK�� u&UMJ UUMRh`^��XQ�� uuYY1_^UVWUց��uj�jV�� 1~���} ��sj�jV�� 1a���th��h��5N��ĥ ~$�t4~$WV$s��9F8|v8WV�� u1W��YƸ_^UVUց�����uh��h��5N��H &j�jV?�� b���uh��h��5N�� &j�jV�� 1h��5N��躤YYh����Y ��E &��1^U VWUց��tth(��h��5N��蒤 tVo��Y~$�t~$WV$W��Y����VUR��YEPu9YY_^UVWu VX9Uthl��h2��5N�� ~ W��YPWV1�� F ����V��Y_^UVWuVUVU��#M ���t=���t5 ���t-@���t%ǀ���t���t���t ���t&~$�tV$URV$u��Y1_^UVW}WUG���tRWUz%W։1փUWU<_^UVWURUUB���t UUUJω1׃UUE����E0t 9utuvuh��h��5N��薢 }�t UNJVE_^U VW} ����y���'E������}`������#uL9~uG �tD&-��@���v<PJYYEth��h��5N�� E@_^U(VW} ����EjW��YYlj=�W �IJ MMt(jhN��uf�� u E ���1E@���(UjRu<�� u E���E���UfR fUUU1UeE����E����}���E����}�uUB UMƅ���}�tUN9o���UVc���F���tUjFPR�� =������#Vu}�uu%~$�uu}�uuuWV��� vk}�tuWuh��� E}�B���Uz4�t(EtUB���uMuWr Q4 uWu��� }u�W5��Y_^U VWu} uh��h;��5N��賟 uF?tW��YEW��Y}E����G����~$�u ~$UV8V(z~(j���F���t jW��YYW��YE~4�tuWv V4 6&j�Wj�v V0Exj�uV�� j�uV�� _^U VW}u51��s)~$�tV$z�tURV$u��YG@҃}u/1��s#~$�tV$URV$u��YG@_^UVWE����1��s ���# uU9VuV UG@ۋE_^UUMuj�u r Q,Eth��h��5N�� UUMuj�u r Q0Eth��h��5N�� ���UE�����UB����UVu>�th��j 5N��肝 U EPFP�����F����=d��u5d� ��r5��^UVW=d��t:5d�Vd�>����uh��j75N�� vVYY_^UE1ۃ8�ÉUkp�P詣Y��UVW15��9=p�~ ~Gho����Y15��9=p�~ V ���YG_^UVWu���F����Vj�h h��hf��RR��F ~ �d���F���&h"n8@v )��YYǁu<th8��h���5N�� F���&V��Y $��F8��_^U VWkE��֋��}�u/v���YF����} y�t &V@��Y1���uu vJ�� ���}�uD} th��h���5N��N y F������tVY1���}8thl��h���5N�� j8��YEx8thH��h���5N�� U�R �IJ ME�3�UB4E1~1_^UVkE��֋V���}�th��h���5N��^ }�uU Uy�t &V���Y1uVW��YY11^UVuuuh��h��5N�� &h ��v N#��YYE=u^U Vu }�x p�9U|h4��h(��5N��蘙 kE��EEPV[ ��YYƅt?U UMJUYjRSG�� %��UfBVu��YY^U Vu }�x p�9U|h\��h>��5N�� kE��EEPV ��YYƅq���UUMJUMJUYjRS�� %��UfBUMYjRS}�� %��UfBVu��YY^U Vu }�x p�9U|h��hV��5N��: kE��EEPV��YYƅt?UUMJUYjRS�� %��UfBVuN��YY^UVWu jh���V�� jV��YYƉ5�V �IJ MU~%uV��YYƉ5�V �IJ MV��YE+EE=���s V��Y���uuV�� jW/��YYlj=�W �IJ MW��Y%�����V@��YW9��Y���uuWuuVuO��t���uuWuu��Z���uuWuuVuV���MuuWui��+uuWuuVu��U����V��YW��Y_^UVWU z�tu v��Yum��Y��}su Y��YuP��Y���uu��YYEj��YExth��h��5N�� U�R �R y�G�U Jс��U )Ή��!։��!։ҁ��fWUMJURju �� UBu y��Yup��Yuu��YY_^UVW}�uh��h��5N�� fE��E����}����U�R �R y׋Ur[���}�t%MjEPEP�� fEGNE�������tE���N MtVWEPF�� fEURUe}�tjEPEP�� fEE_^U VW} ~E ������UR��YNjU9Wth ��h3��5N��Փ =�W �R q֋UUJNF<F UR VfF��_^UVWu} G����~�tVz~G����~uV���Y_^UVuthh��h\��5N��( ~�X���~�thD��h`��5N��� VVVRVv��YPv %/��YYE=u&^UVW}u315��9=p�~#~�tVURVu��YG_^UVW}���URju*�� jVW��YYƉ5�V �R y׋UR9W t Vr��Yc���URU@WUR��YE#Eh��uPumA��(h��jwuVA��U ��B��V ��Y_^U VW}���URjua�� jV��YYƉ5�V �R y׋UR9W t V��Y:URUh��jwuA��U ��Bx��Vm��Y_^UVW}} �����WUWU}����}���U9U���fWf�� ���� ف��fMU(#�����E����U9Uq���V� ���� ً���� ʋ ���� Uk<Uj�Qj�jP6j�j�r;��$Eu_^UVW}���URju�� jV��YYƉ5�V �R y׋URUX���WUR{��YEUM #Eh@�rq uPuH?��4UM h@�rq jwu%?��U��B��V{��Y_^U(VWujV��YYƉ5�V �R y׀ t2fWf�� ���� ��tV ��Y1e��W UR��YEP��YE܃}t}t }t}uU҅UtU#UM9u-hD��0��Yu ��Yh@����YV��Y1��fWf�� ���� ىMU9Ur V��Y9Ev4h����YV��YPuuh����V��Y1m�����U9Uv ���UUuj�Vf�� EV��YuE�������UR4��YEVuy��YYƋUUuV[��YYƉ5�V �IJ E E �E B�E fB��E B����VY%��] fB���UR��YE�P R x׋UG�UU��f�� ���� ف��fOfG��G<G UWUz�th��h��5N��V UrE_^��UE PE PE PEPhl����UVuFPFPFPFPFPPhx����^��Uip����P讒Y4�UVW154�E�9=p����~F@r|��FDr|��FHr|��U NfF>@���UJNV譧��YE=���}����h��j]5N��> j���UJN V��YE=tR}�tIh��je5N�� 2jk5N��輊YYvh����YY辊 ��F$��G���Ehz��+��Y83��154�9=p�~[tKQ��%��fF<k�hox��h|��h��h��h%z��hhy��WR蟢 VV@YG���_^U VkEdƁƴ����uh��h���5N�� &jj�jvDVPE���h��h���5N��̉ ���uh��h���5N��訉 &j�j�jvDVTEtKh��h���5N��w 1h���5N��-YYh��.��Y3 l��E ��1^U VWiE���4�E]u ���1 skd�tG r f���kdƁƴ����F0�F5�F7�F6F �UV<U VD~H�th��h���5N��蚈 UVPUVTUVX_^UVWkEdƁƴ�t th��h���5N��M tV ��Y~H�t~HWVHWz��Y����_^UVWE����4�Up�9U���UzuE}e���r(twW!��YUr(Ur twW��YUr *Uzu!}urtwW��YUr}O���UrLt~�twW��Yt'UTRQYt hP�� ��Y V~��Y1UrLEE���}D���E����E�} s0UzH�tRHz�tUzHOJHW$��YEEdʃ}u8E����E�} s$UzH�tzHOJHW��YEEdփ}G���E����E8�}}3E0E8�t8WEW��YUB ����EE _^Uh��5N��YYUrh����YYU���VW}�x} vh ��j,5N��ۅ kEdƁƴ� ��h| ��j/5N��诅 ��jj8j�vDVPj8W��YYǃ8thP ��j85N��r =�W �IJ MFPEP�����uEP���t����#UhU��d��#UpU��lptW9��YjjV �� 1 ��ltW��YjjVg �� 1��pu���#h pl pu"���#h p���#d ll p u" ���#h p ���#d ll p���u(���#h p���#d lUUl p���u(���#h p���#d lMMl p���}������#h p���#d lMMMMMMUPUĉTDžL)���L�~$LTTP PӋl p���u"���#h p���#d ll p`���t'`���tW ��YjjV^�� 1��tV ��Y`UEPFP�����Vv��YtyEPFP�����W製��YjtV�� 1i��j8��Ylj=�W �IJ MFPu���D��jWj�vDVTtjj�tvDVT ��V<Ujj j�vDVPj Wž��YYǃ th$ ��h���5N��蚁 E\=�W �IJ ME�tW趼��Yjj�jvDVT��EK���UMRQ0EUr; ��YP\ ��YUB4]u UMR4Q8UuRDYEtUMRQ8EW&��Yjj�j�vDVT��V<UEu ��&j \��Ylj=�W �IJ ME����UMR0QUMR8QEtEjWj�vDVTtjj�tvDVTQ��jj(j�vDVPDžujj�jvDVT(��j(W��YYlj=�W �IJ ||XW��Yj(x��Ylj=�W �IJ |QX07��YYty Wʺ��Y5t�th ��h���5N��V jWj�vDVTtjj�tvDVTY��jj(j�vDVPDžujj�jvDVT0��j(W��YYlj=�W �IJ |���#Q1Qj�Pt��� |B|||PF<rq sp6��tWʹ��Yjj�tvDVT��jj(j�vDVPDžujj�jvDVTg��j(W9��YYlj=�W �IJ ||XWM��Yj(跷��Ylj=�W �IJ |QX.��YYty W ��Y5t�th ��h0��5N��} jWj�vDVTtjj�tvDVT��jj(j�vDVPDžujj�jvDVTo��j(WA��YYlj=�W �IJ |���#Q1QPt��� |B|||PF<rq sp5��tW ��Yjj�tvDVT���jj(j�vDVPDžujj�jvDVT���j(Wz��YYlj=�W �IJ ||���#Z1|j�qP|rV<j�sq pr'��$tWS��Yjj�tvDVT��E a��jj�jvDVT_^UVWu~<F���t W`V@w`V8UOdV@UOd4_^UVWUR<UUB���t}`UJ8MUd<E����7t 9utuv@uh ��h��5N��{ }�t UN@J@V@_^UVWuVU��#M E���tF PF P���YYEyf������t<���t4 ���t,���t$���t���t���t VY&~H�tVHURVHu誵��Y1_^UUMuj�u rDQPEth ��h��5N��z Uu��YP>��YUVWuE����E����E����E����E����U th(!��j 5N��y 19} h��V��1j��GF}�t V��E���~ t ?��VV뮃}�t ��E���V} ��VVo}�t ���E���V} ���VV0}�t ���E���V} ���VV}�t `���E���~tLE ��F��VV ����9} }1_^UU}�x p�9U|h8!��h���5N��w iE���4�@0UVu5� ���� ً���� ʋ ���� ։U}�uu E�������E������U} E������}u E������U���} E���l���U���} E���T���U���} E���?U���} E���*U���} E���u E���E���E^U 1)���"��� `!��E��UVWkEdƁƴ�uj�j�jvDVTp���U V`~H�X�����9F\|6~HWVHv\WV�� th!��j65�O��v 1~H�t~HWVHWK��Y_^U4VW} UM]Erq K QXSu��EUfRf�� ���� ف��fMU MfRf�� ���� +MMU��UG����EU؋E�����}�u E81��E����1U؉U܃}�g���U܉�R �IJ MfQf�� ���� ف��M9Mruu܋U܋RU독uH}�th!��js5�O��kt }�uh!��jt5�O��Pt uW��YYƉu/WV���YYƃ}�t uV���YYƃ}�tUru؋U؋E׉=�W �IJ MfQf�� ���� ف��fMU?��c���UR ŰE�����UB �����tWUԋRWuî��Y1��UkZ<]9~UjWr 1_^U(VWu} uF������~}h"��h���5�O��s }h"��h���5�O��r 5�V �IJ MfQf�� ���� ف��MU MfRf�� ���� +MM=�W �IJ MfQf�� ���� ف��MU MfRf�� ���� +MMVm��YUU9thh"��h���5�O��q WD��YUU9th0"��h���5�O��xq U9Ush"��h���5�O��Xq UU9Uv ~���UUMM9wV}��Y���UJ uUJ߁��UfJUUMM)ىMUUU+UQRW誯�� E܋WUW��Y}؋UUUU��f�� ���� ف��UfJuV英��YYƉ~V��YUU9th!��h���5�O��Gp _^UVW1E����8�}R���?�u �u?U9Wu)U9Wu!U9WuU 9WuU9Wu���tV 9W }E 뤃>�F���RU}�tURUu��YUUU����Ujur F���UV4��F UVUVUVU V_^UVWUzs1���U�R �R q׋U9z}1���t1���u莫��YfVf�� ���� 9t1T���WVj�藽�� %��t1;~1M �I �I KRQlYYt1���_^UVWu }uh4#��hi��5�O��*n uF>tV.��YEV^��YuE����F����H�u wHUW\WLrwL?��V耪��YEG������jVǪ��YYƃ~}h#��h��5�O��m 5�V �IJ MU9Ush"��h��5�O��[m U+UUuVʭ��YYƋU9W`s#w`j�V�� EVv��YuW`UUUX�tuVwDWX ^���j�Vj�wDWTExU9Uv EUU'j�j�uwDWTEyh"��h��5�O��l _^U(VWu >�h#��h��5�O��rl ~}h#��h��5�O��Tl UfRf�� ���� ?�����uVu ƅ,��~}h#��h��5�O��k 5�V �IJ MfQf�� ���� ?��thP#��h��5�O��k C��UJAk<É]؋UMI09Ju E���E ���UJ M܃ME����E����}���E����}�uUB` UdMDž|���}�t W89Ua���UWU���G���tUO9J =������#Wu}�u}%H�u}}�u}uVW4 @|}�tuVu E0}�t���UzX�V���EtLUB���u@UfRf�� ���� ًU]QVrDSX uVu }u�V'��Y_^U(VWu Vj��YE=���s V���Y[��jjV}�� jV蜦��YYƃ~}hL$��h4��5�O��qi 5�V �R yU~3jjV�� uV:��YYƉ5�V �R yfWf�� ���� ىM9Mvuuj�u裧�� u��YVuYu V��Y`��WUUM9J0uWVu =��uu��YYtWVu ��W}Uj�Vr ��WJWuW ��YYuDYE=���t:}t4}t.}t}u VV��Y��UjVr ��Uuru��YYEt x ���uUjVrO e��UiB���4�E9E���z�tj�VruPH/��UM9J0uWVu ��EU9u E���"URҋE 9Uu E���E����UuVuuRH���Uz�u?h,$��ְ��Yw Yh$$��°��YwYh $��记��YV"��Y}���UR03W MQ8uUMrjVqn<h�$��k��Yw FYh#��W��Yw2Yh#��C��YV跡��YUMj�VruQH_^UVWu V��YE=���s Vy��Y\��jjV�� jV��YYƃ~}h$��h��5�O��e 5�V �R yU~3jjV蕫�� uV賢��YYƉ5�V �R yfWf�� ���� ىM9Mvuuj�u�� u萠��YVYu V~��Ya���wuZ���YYuCUrh|$��ܮ��YYw Yht$��Ǯ��YwYhp$��賮��YV'��Y WVu0 _^UVWu} ���!���u ������u ������3V0V4t$u ���s���u ���e���1^���3V0V8t+V4!N49u���=V4҅u���-1)V8!N89u���V8҅u���1_^UVWu VT9Uth$��hU��5�O��c VLׅtWVLWVYY_^�UVWkEdƁƴ�} @��vjV ��YY1d���j�u j�vDVPEu1Iu uu?��� ǃuh%��j-5O��Ac u u V ��YY WVv ��YY1_^UDVWu kEd�Ex<]uVG��Y��V菟��YEUR<uh%��jP5O��b UB���tjo��YE؉pu؃E}sV��Y.��jV艟��YYƉ5�V �IJ M>u V :o���j��YEأ�P HJ Muu���d��URjV�� U؉BVY��YUUu؃~}hl%��jk5O��a UB�����J M̅���jj�V芠�� E؋URjVu�� EV��Yju蘞��YYƉ5�V �IJ Mu-��YE؋U�H I Hũ RQ膱�� U؉VU؋MԉJ���ỦUE������EЙUUMR5QUfB��Uz7�tUJ@��UfJUMR6QE�����U ME����}} E!U9Uv EUz�uE}�tVě��YE��uVk��YYƉ5�V �IJ M}t=UЃ5�N �I KRQYYEȅtV\��YE��UJMU @ ��#Uf�� ���� ف��UfJUJ@���UfJUB���t MR8Q W<A��fO<f�� ���� ف��UfJUR<MR0Q UB���t MRQURU� ���� ً���� ʋ ���� щME����}tC������t5���#U���u EU3W0W8uW8҅UuE}�yV™��YE��uu��YYjV]��YYƃ~}hH%��h���5O��2^ 5�V �IJ MUU܀:r���>th0%��h���5O��] URUUMR QUMJ F����L�uwL}Wh��GTP WPrwP1?��}ujVuWWHE$��ucYEU9W0T���>th%��h���5O��I] F����L�uwL}Wh��GTP脿 WPrwP1���U3W0W8u'W8 W019Uu@EPVuWWHE���+4����Й]SuuP��EȅL���U9W0u2F����L�uwL}Wh��GTP WPrwPj�VuWWHEV讗��YE_^UUfB ��u uj�.�� %��UfB UHVWE 0E �����E����jV��YYƃ~}h&��hK��5O��[ 5�V �R yUVc��YE9E|h&��hQ��5O��[ W@tUjVr 1��fWf�� ���� +MMU+UU+MMUQRV�� EЉűUUURj�uݙ�� uQ��Yu躔��YE̋UЉPỦUЉ�R �IJ MWu�����fWf�� ���� ٻ���E%��f�� ���� ف��UfJUUE����}�6��uV:��YYƉ5�V �R y׋U9V}hl&��hs��5O��Y 5�V �R QUċUЉ�R �R QUE����U9U���E���!UJMU %��Ӯ��UU9U}hL&��h��5O��[Y UUUt%UU؋UIMtEEċU EUUĉUdUtU�EE���U؉UU���ES���Z!ЋUUU��f�� ���� ف��UfJUЋMJ>th0&��h��5O��uX V :th&��h��5O��UX W ��fWUU��f�� ���� ف��fOUJ@th%��h��5O��W uWYYUU9U| uumYYUЋE _^UUMj�j�u rDQPt"h��5O��NWYYh&��O��YTW���U U(VW ��E܋U U1U؋U 1U؋U1U؋UUUց��U 9u~���U 9Vu2VN UMVFP���-��EPV�����}���U 9VuDVNUMFPFP�����VFP�����EPV���ҫ��}]���U 9VuSVNUMFPFP���褫��FPFP���蒫��VFP���胫��EPV���t��}1tw��E����E������}��� ��W���U 3W���}�u}���UR9W���W� ���� ً���� ʋ ���� ыUR����� Ë���� ڋ���� 9v?}:���#WM���#Y9t Qt}UR9Wt U9Wu}E}�u1AFPFP�����FPFP�����VFP�����U UVE_^UVu uZ��YYƅtU9V ~ VE1^U$VW1.��Ei]���4�]U3S0S8t +��} �t=��| �������5��tU9uU 9VuU9Vtv$t U9Vtv(���V p���U9V d���9V c���U$9VW���}�t UU܉VF����U܉VU9thP'��h��5O��sS }(�tE(01L��v,tt/U9th4'��h%��5O��6S V��YF �������E������} R���V F���~�tU9V}Vh��YF ����(V u~�tu W9V}E0뤃} }*uh$'��hO��5O��R W ��YG ����U WUWUW}�t UU܉WG����U܉WUW UG ���U$W} �tO E������U}�M���EU9u2UM 9Ju'M9Ju}�t MR$Q$UR$��UUUR$U멋UUE����UU}�t8UM9Ju}�t MR(Q(UR(UUUUR(U‹UW,}WW��YEUP(UUR��YE��P$U��U9UtUMrqx��YY}(�tE(81_^UVWʗ��E1�� m���V [���U 9VO���~�tU9V|Aj�j�j�h���uu vvu5$Ethl'��h��5O��P G0_^UVu u-��YYƅtAj�j�j�h���uvuu u$Eth|'��h��5O��%P ^UVWu u��YYƅ���U9V���V t U 9VuD|���j�j�j�h���j<vuu uP$Džth'��h��5O��O j�j�j�juuuu u$Džth'��h��5O��iO _^U VWu u��YYƅZ���V ׁ���~V Bׁ���=j�j�j�Wuvuu u$Eth'��h��5O��N _^UVW} }�x} | ���kE0Ɓ��V t~�tq��9F} V ��Yf UG ���VWVW VWV WG����V tOV tOVW6"YG$1_^U(VW��E܋U U1U؋U 1U؋U1U؋UUUց��U 9u~���U 9Vu2VN UMVFP�����EPV�����}���U 9VuDVNUMFPFP���ʢ��VFP���転��EPV���謢��}]���U 9VuSVNUMFPFP���~��FPFP���l��VFP���]��EPV���N��}1tAU9th'��hq��5O��L �tU9W} WS��Yg A��E����=�����U 3WW���U9���}�u}���UR9Wuh'��h��5O��eL W� ���� ً���� ʋ ���� ыUR����� Ë���� ڋ���� 9v}$}�u1AFPFP�����FPFP���ޠ��VFP���Ϡ��U UVE_^UVWE����5��t$E9uUN9JuN9Jtuv$؅uh(��h��5O��'K }�t UN$J$ V$��uE����tUO9Jt}(uh (��h��5O��J }�t UO(J(w(E����}}�tU9UtUUR,U}�uh�(��h��5O��vJ }�tUMR,Q,Uz,WD���YDžtw(V���Yƅt��V$5��9utUMrql��YY_^UVW1E����ut7tU9V t9V ~ U9V~UUV UVUuv,Ņu#}�th4(��h��5O��I E9}�u"9}th$(��h��5O��yI EUO,J,UW,_^UVW1E����ut7tU9V t9V ~ U9V~UUV UVUuv(Ņu#}�thT(��h!��5O��H E9}�u"9}thD(��h&��5O��H EUO(J(UW(_^UVWE������} }21}#M3 M u����D����GE _^UVWu }�x }���| k���kEǁ��F���VWV WVW VF����WtNWtN ���uNF����wYF$1_^U VWE����}�t11�����}VtG���\���uT���1�����}:Vuu'VuU9VuU 9uU9VuU9VtG뾁���tu}�u J���uUVU UVUVUV F���}�tNv6���YY} �tE 01_^UVW1�����A���Vt3U9Vu+U 9u$U9VuU9Vu���#V19EtG볁���uv6���YYF����1_^UVWE������} }21}#M3 M u����D����GE _^Uip�,��PLY�UVWh��O��Y15�9=p����>E����}}+E����}}UMT,�EEk�h��h��h��hI��h��h��WR] V���YG,��o_^UVW}|��G���h-��h��h ��RRʻG  �y G���R��h"n8@w ݾYYE=uO}�+��!��gh!n w 訾YYE=uO}�����gG����i���ƁƜ����~�th4)��h���5 O��ND fF��WVfF��F ����F����F����F$����F(����F,����F0����V0V4V0V8V0V<V0V@Ft����VtVxVtV|Vt���Vt���~ dž�������dž�������Fh����dž�������dž�������Fl����Ɔ����Ɔ���fdž���� dž���@�dž�������dž�������Fd���fdž���xdž�������fFT�@FPx���FX����F\����V0V`E����E-�}(s8Et%U9zutE Ur u��YYEE@WN��Y1h���5 O��BYYh$)��艌��YB )��G��_^UVWiE,���h��}�u0} y F���\��F���VtVY1A��} �th)��h��5 O��)B }8th)��h��5 O�� B j8{��YE�P HJ ME� UB4E���Vuh)��h��5 O��A }�j���} yu~�t v!��Y~�uh)��h3��5 O��tA v|��YF����Vtf~�tJVG��YAf;uu v�� *vuu uh`)���� H)��F]��1_^U VW}iE,���T��u7U UyF���1G��F���V2��VtY&��j W}��YYlj=�W �IJ MEuh*��hq��5 O��`@ URVW{��Y���Vuhd*��hw��5 O��+@ uMU Uy"h|��5 O��?YYhP*��։��Y?VtfVd��Yc���fZ���} �thH*��h��5 O��? W_|��YPWu1��� &vWu uh*��g�� )��FՔ��1_^UDVW} iE,���E=�W �IJ MU؋U+U؉Uu Wzz��Y��}juu�� E裤�P HJ MuWs��YYWu!��YYfE҃}su!z��YWz��Y)��jW{��YYlj=�W �IJ MQ ���U9Ur}s}s�uy��YWy��Y��}juu5�� E䣤�P HJ MU9Uu Wy��Y1 uW~��YYNjU+UԉUUҁ��tuRy��YuIy��YWBy��YQ��UR UċURUUffUUfRfUU3UM1M1щM1M̋U1ŰU3ŨUȋUM,֋MZ9u(MZ9uM9J uM9JuU���VMZ9u4VMZ9u%VM9J uM9JuUVU���VMZ9u:VMZ9u+VM9J u M9JuUVVVUW���V MZ9=���V MZ9u.V M9J u#M9JuUVV VVVUE����}�t Uz�t UB tE����}�Q���uu��YYEuutw��Yukw��YWdw��Ys���Uz�tVV VVVUUz�th*��hA��5 O��; E@uWuuuw*��EHuv��Yuv��Y_^UVW1(sЋ-�tG(r _���ցƜ-�������iE,���FU VF��F����fF��F ����UV$UV(F,����_^UVWUցƜ-�uh\+��h}��5 O��: VUU V UzK��M�����t&jjV �� 1,��V,��Y��j4t��YExth0+��h��5 O��P: U�R �IJ MFPu���a�����t+V,UMfRfQ UMR QUMfRfQVMRQjuj�vV(ǃ&jWV �� 1b��Vf��YT��jjs��YExth+��h��5 O��9 U�R �IJ MV Ejuj�vV(ǃ&jWV�� 1������t&jjV�� 1���V ��Y������t&jjVt�� 1���V��Y������u&jjVG�� 1g���U V V,URBMQuN��YEHj�u>��YYu1*#&jjV�� 1 *��E ܍��_^UPVWujjj�vV$E؅u ��ju)u��YYE؃xth+��h��5 O��7 U؉�R �IJ MFPEP��� ��uEP�������#UUU��UUܿ��!��Uą}t &jjV�� ur��Y1��Ut &jjV�� ur��Y1�����u ���#U ׋U0t &jjV�� u`r��Y1��0���u0���#U fUfU\���0���!0u--�@���P��YfE40���! u(Uu &jjV�� uq��Y18��U ���u ���#U ׺���#U UċUUV������t&}�uH&jjV�� uq��Y1��E���uh+��hZ��5 O��6 E����U ���u"���#U ׺���#U UfUfUW������t(UuG&jjV9�� uq��Y1V��E���uh|+��ht��5 O��5 fE��U U܋U U0���E����E̜-�}(���9u���E̋q���ŰN9Jb���RU0P���UMZ9uA���#U���#M9u ���#Uu &jjVS�� up��Y1p���EE@bEPFP�����Ut,0 t 0���#U0uE���tE���t&uo��Y&jj�V�� 1_^U8VWujjj�vV$Eu ��ju%q��YYExth+��h��5 O��3 U�R �IJ MV UEU��#UU؋U��UԺ��#UUU��U܅Ut&jjV�� 1S��U Uu���#U U���#U U܋U Uu���#U U���#U U܋U Uu���#U U���#U U&~,�u u]n��Y&jjVz�� 1���U Uu���#U U���#U U܋U UUEPF P�����Ut���&Ut���&~,�t&UtV,׹@��� V,׹# Ut� ��&um��Y&jj�V�� 1_^U���U��f�� ���� ف��fMEP���Yt E���fE(U��}ZfUf�� ���� ف��fMEPB���YtE5UB��fUh>��5 O��1YYh,��{��Y11UVW1E-�(s$EtUMZ9u1EFE@׋5p�i���ǁǜ�Ps tUO9u1F���۸���_^U}�uhL,��hc��5 O��0 UMuj�u rQ(UUMuj�u rQ$EthT,��hq��5 O��I0 UVW}w,fWfVWRVG���t fWfVfF��G���tWV F ����Ve��YWV ~F$���F(���F���dž�����_^U VW=p�i���ƁƜ�PJ���>�uF$����F����5~�u$>v��9F,~�t jVH��YY���� G���1_^U VWUuhd,��h��5 O��"/ }�uh\,��h��5 O��/ =p�i���ƁƜ�P\���>�J���UN9u>U 9Vu6UN9u*U9V u"~�t#VUt jVG��YY G���1_^UVWuNh� ��v ݷYYǁuN(thl,��h��5 O��>. fVt_^U(VWURUUR U܋U fRfUڋU ffUU؅ufE��E����E����1p�UiE���ƁƜ�}P������U9Vu-UN9u!UN9uU9V u ~�t^��U9V���E����VtUN9���EVtUN9j���E~ �tU9V U���EU9UE���}t~u9}u"~�u}�tUN0+J0���uuU B tUUE���}�������U B t#EPuEPus��t1a��E�����p�9U}tU9Vt E���ۅuh -��ho��5 O��5, ~�th,��hp��5 O��, fUfVUVfUfVU܉V ~�th,��hv��5 O��+ ���}����Uz�th,��h|��5 O��+ uE~���WUt $�t9z,th,��h��5 O��r+ Uz�t juD��YYUR0W0UO,9J,~R,W,uh|,��h��5 O��#+ _^UVWp�UiE���ƁƜ�}Pt���^���U9VR���U N9B���~(�t<~t5G���t UN9u G���tU9V u� ��t��� E���1_^UVuuh-��h��5 O��S* ~ 5n� t*~ 3n@t!~ 2n@th,-��h��5 O�� * &ju V ^UVu€uh-��h��5 O��) &j�u VP ^UVu���uh-��h��5 O��) &j�u V ^UVWUׁǜ-�uhl.��h��5 O��_) ���uj�jW 1���w,~�uj����W 1��� tj�jW 1������G0����U W4V<9V4uV49���uV|A��Y����u*VT��Yhh.��r��Yh.��h ��5 O��( ~�th-��h ��5 O��( FVs>��YNj�V-��YY€u1_^UVWUցƜ-�uh.��h#��5 O��,( ���uj�jV[ 1U���~,���F8����U V<�th.��h0��5 O��' Gj�W=*��YYO���u1_^UVWuuhp/��hG��5 O��' uhP/��hH��5 O��q' ~ 3n@t!~ 2n@th/��hJ��5 O��G' ~,uh.��hN��5 O��(' $�uh.��hO��5 O�� ' �u6���U9wth.��hT��5 O��& F,����G���� ���E����G$����uV8YY_^UVWUׁǜ-�uh/��hm��5 O��y& ��th/��ho��5 O��Y& ',�u���w,9~th/��hv��5 O��,& F����~$�thx/��hy��5 O��& V&>��Y~uF���dž�����V<9V4u jV>��YY_^U VWUցƜ-�uh0��h��5 O��% ~,x��€uh0��h��5 O��w% &~0�tj�v0V G��j�jV 5�����uh0��h��5 O��&% &~8�tj�v8VP ���j�jV> ���uh0��h��5 O��$ &���jjV ���jjV- ���$�uht0��h��5 O��$ G$����G����F,����jW=��YYjjV MjjV >0��F y��h��5 O��#YYh\0��m��Y�$ D0��E fy��1_^UVWuujVxYY1��� tjV`YY1������#V���tjV?YY1v���~,�th1��h��5 O��# VvFPrFP/Džt�t'jVYY1#DžujVYY1 ~,V���Y_^UVW}w,fWfVWRVG���uhP1��h��5 O��" G���uh$1��h��5 O��" fWfVWV V4��Y~WV F$���F(����F���dž���PF��V2;��Yj�V (��YY~$�t1_^UVWu }VUWN9t1?E���t W 9Vt1*E���tWN9t1W 9Vt1���_^UVWuu&jjVh 1��� t&jjVJ 1���~,th|1��h]��5 O��! ���#V���G���VvFPrFP0Džt&�t&jjV 15~,VY)Džu&jjV 1 ~,VY_^UVW}u81�Ps,t~l�t~�uvl<\��YFl����G���σ}uA1�Ps5t%~�u����t���[��Ydž�������G���ƃ}G���1�Ps;t+~�u%~�u~�t����u~h�t jVt9��YYG���} uA1�Ps5t%~�u~�t����u~h�t jV-9��YYG���_^UVW}���ց���uuIjW8��YY=u������~���򈗡���LJ�������W4W8jW%��YY_^UVu~$�thX2��h��5 O��g tO~�th42��h��5 O��B ~h�th2��h��5 O��$ e��9F,}SF0����J~�th2��h��5 O�� F,����F0����Ɔ����Ɔ���fdž���� F����~0�ue��<���i�F0V0V4V0V8���V0V<V0V@V0VDFt����VtVxVtV|Vt���Vt�������th1��h1��5 O��B ����th1��h2��5 O��! ~h�th1��h3��5 O�� dž�������dž�������~l�th1��h7��5 O�� dž�������dž���@�dž�������Fd���fdž���xdž����������V4VHFL�@��FPx���fFT�@FX����F\����V0V`������Pf��Ydž�������^���UU  Mu�UU J ���Mu�U$VW}U��#W ��fUW ����fU��#W��fUW����fUfE�fWf�� ���� +M��f �� ���� ف��fMj EPj�k�� fEu E����r���5�V �IJ MVU܅tKuuEPj�� fEUt,1ۃ}�É]UM ˁ��f]v놃}�t UM ˁ��f]E_^UU����uU �U �UVW}����uE �����k������NX��Y������W��YƋ����R �R QM VRQ#k�� ���tU D2�V!֋E 0_^UlVWu1~�E����u �������EPVYYEPV/YYEth2��h���5O��] Uth2��h���5O��= U׃(URS��YE�P HJ MσE}�tEPEPu8j�� UUUUE}�tuEPuj�� UMJU׃���UMQ 4j(bS��YE�P R x׍WUUMJUB P}�u~�uuT��Y1������O���OG VW V WfG��UfNf UfNfJUN|JUB ����+Vx��f�� ���� ف��UfJUfB��E 8UEE_^UVu-����PhD3��_b��YYo���h83��Hb��Yl���h03��8b��Y_h(3��+b��YRh3��b��YEh 3��b��Y8h�3��b��Y+h2��a��Yvh2��a��YY 2��FVm��^UVWuE�������t4���thd6��h ��5O�� h86��a��YE��~x9~tuG9~|utOV|U9VtuEtMU)UyJh6��Ba��Yv4v<h5��1a�� uWh5�� a�� uh5��a��YYE�����������u9}����h5��`��YV��YuWh5��`�� E����������S��Y9Et9hp5��`��YVR��Y���fS��YPuWh85��`��E����7}�t1~�t~t ~t~uh5��N`��YV��YE�������+V|���tv|���h4��`�� E����~49~0uG9~<u tOV<U9V0uE tMU)UyAh4��_��Yv<v4v0h4��_��uWuhx4��_��E�������~h�uB}����h`4��~_��Yv4v<hD4��m_�� uWh(4��\_�� E����ZvhR��Y9EtLh�4��8_��Yv4v<h3��'_�� uWh3��_�� vhQ��YPh3��^��YYE����V4+V0���th3��^��YE����V<+V4���th3��^��YE����V8+V4���thx3��^��YE����V<+V8���thd3��~^��YE����E_^UVWu }uh6��h��5O��p t w Y h6��,^��Yff�� ���� Qh6��]��YYt w͇Y h6��]��YfVf�� ���� Qh6��]��YYV� ���� ً���� ʋ ���� Qh6��W]��YYF t h6��E]��YF t h6��4]��YF t h6��#]��YF t h6��]��YF {���fVf�� ���� ًV����� Ë���� ڋ���� QSh6��\�� F tFPh6��w\��YYV ���UtRh6��R\��YY_^UVWu~0VtUVYV<)^8)RV4Q)SPRQWh7�� \�� VH+N4RQh7��[�� h7��[��Y����u h7��[��Y���)RQh7��[�� ���+M^|+ERVxQ+MSPRQuhT7��[�� t hH7��u[��Yt h87��c[��Yt h(7��Q[��Yt h7��?[��Yt h7��-[��Y t h6��[��Y_^��U(VWuU  MUJ ���MUJ ?MUR� ���� ً���� ʋ ���� щMUR� ���� ً���� ʋ ���� ׋UfRf�� ���� ف��fM ��U ��uuu V��jV��YY��U��t!uuu V��jVg��YY��U��u VYYuVYYWVxWV|���Vx������~tV0V4V0V8���V0V<V0V@V0VDF���dž�������VVYuhD9��jz5O��: U RVUfRfVU R V UffVjV��YYV'��Y��Us���V0+U���tV<+U���t-U��uuu Vl��jV4��YY��U+V4���uV<+U���u���1EE����Ut}�>��jV'��YY/��U#��WVxWV|���Vx������~tUtUV4V0+V4������F���dž���@�VYuh(9��h���5O�� ~$�uh 9��h���5O�� vYjV$��YY}�l��uuuu VBa��F���VnYuh8��h���5O��O V0V8jV��YY�����UU tE}�i���U9V|u19}u@E���V|+U���uh8��h��5O�� +V|���u+U���t���1Ec���V|+U���tN+V|���u +U���u&U+V|���uU+U���t���1EE����}�uU��jV��YY��UtK~(�t6VUF$����F����jV(%��YY}���uY��jV%��YY��UX���+V|���uK~(�t6VUF$����F����jV$��YY}�k��uCY]��jV$��YYN��UB��V4+U������V<+U������F���dž���@�EPuV�� VYuh8��h��5O��� ~$�uh8��h��5O�� v#Yuuuu V��uuu Vb ��jV*��YYw�����UU tE}�i���U9V|u19}u@E���V|+U���uh`8��h��5O��B +V|���u+U���t���1Ec���V|+U���tN+V|���u +U���u&U+V|���uU+U���t���1EE����}�]���Uw��jV��YY����]��UQ��~�D��V���5��jV ��YY&��Ut0"���#"u~h�uj�VQ"��YY��jVB"��YY��Ut+V|���ujV"��YY��U��~t dž�������U9V4b���V49VHu@Ut8���M9}�����fUUV4VHjV��YYUf���V4V8VHX���V4+U���t*V<+U���uEPuV�� ~�u%��V<+U���tjV ��YY���u VYYuVYY}�tEV|)���uuuuV���uuuV@��jV: ��YY���U{���V|)���j���uV|+������tF|jV ��YY~�t8V���t-jV ��YY!h@8��Q��YVY 8��F|\��}�t uiB��Y_^U4VWu}~�uh:��h��5O�� U B th:��h��5O�� U R� ���� ً���� ʋ ���� щMU fRf�� ���� ف��fMUUU J ?M ���U9U} ��#UfUUUU+������u ���U@t@Vx+V|���t2W)A��Y~�D��V���5��jV ��YY&�����+U���t U􉖄���U9U~$UURj�WID�� EW@��Y}؃eUtU+V|���t#V|+UURWE��YYNjUUU+U܉UU9V|th:��h!��5O�� UUU���+U���t2���+UURj�WC�� EW@��Y}؋UUUe���+U���thp:��h-��5O�� ���Udž�������WuE��YYE؉���UV|UtV|+������tuF|~�tV���t jV��YY������Ut8-����PhL:��M��YY���dž�������W,?��YO�����UV|+U���4�����dž�������WN@��YEU+V|���t6V|+UU9Uw W>��Y��uWC��YYNjUUU+U܉UU9V|th,:��hf��5O��= UUU���+U���th�:��hi��5O��  ���Udž�������WuD��YYE؉���UV|���|?��YFx9F|t*VMYh9��L��Yh|9��hs��5O�� ~�tV���t jV��YY���UЅ������UV|U+U������dž�������u>��YEU+U���t=E+Eة���uuk=��Y���U+UURuB��YYEЋU+ỦU����u UЉ���u���B��YY���UV<VYuh`9��h��5O�� ~�tV���t jV��YY_^UVWu~�uh:��h��5O��Z jV��YYU B ���U B tU R� ���� ً���� ʋ ���� щMM+���������������Udž�������E�u UU}GUU9UuWuA��YYNjUU'W+=��YE9EuuWA��YY u;��Y���U���_^U|VWu}~�uh;��h��5O��"� G u }�z�����UtE����UtE�u VYYWVYYj�EPEPV E����t ����;��YU�������t ���:��YU���U MRQ U MR QUfOf UffJG tUOJUB ���UB����W� ���� ً���� ʋ ���� MQG t���1ZPG t���1ZУ����� ʋ ���� ы���� ʋMQUB u";��YE%��f�� ���� ف��UfJf���f�� ���� ف��UfJUfB��E�U  MQu_>��YYEPuYY%��UfBu9��Y~l�t vl8��YUVljV��YY_^U(VWu~�uhd;��hW��5O��k ~���uhD;��h[��5O��H ~�u)8�tw8WdYY�����WQYY��Vx+������1E���#U���#UV|+VxU}�tM}�t���+VxUUUU9W<wW<U/}�u}�u}�u }�����}�u }����}�&��}�t-���u%8�tw8WYY��jW|YY��}�u-���t%8�tw8WXYY��jWIYY��U9Uu���UE�uj����:�� Ej�uw8wW(Ey&8�tw8WYY4��uWYY$��UW8W<+UW<U9Uu���6��Ydž�������u���;��YY���UVxU+UU������)ы���+Vx9j������+V|U���Vx���+V|U؃}�x9U~h;��h��5O�� ���9U}���9U| jVM���YY����u ����u&}�u }�u<�u w8WYY8�t w8WYY_^��UVW}uh;��j 5O��T w U���Gp����~�u<~~} �t'uF P)]Yu(uh�F Pe\ V>���Y Vzp~_^UVu V 9Uth;��jI5O�� V���Y^U VW}Wth<��jT5O�� �H��wuh\<��jY5O��n ~l�tVlUFl����FV��YEN}�i���u5��YPuw Et}tD}u VY띃}t}�tuh@<��B��YYh<��jy5O�� h}�y���OUWuc5��YPw YYE=uOY}�th;��h���5O�� gWh;��h���5O��X &VpW_^UDVWu~�uh >��h���5O�� >��EI��1i��V<9V8uu1S��&����th=��h���5O�� j1��Y����P HJ MUB���MQ���MQj�EPEPV���2��Ydž�������u1��W3��YEV8U~uE�EU9V0uA����u*VYh=��@��Yh=��h���5O�� U̓U̓F8U� ���� ً���� ʋ ���� ыUJV|� ���� ً���� ʋ ���� ыUJUM͈J f���f�� ���� ف��UfJ��#Uf�� ���� ف��UfJU MQW@6��YYEPuYY%��UfBu0��Y���kxEE9F,}F,��V8UE�1fE��t'E&j�EPEPVDžu1��V<9V4��+U���thh=��h��5O�� U9VHR��V09V4uh<=��h ��5O�� UU܋V4U؋V<UԉUЋ t+U9Ut U̓U͋U9UuM؋U9UuMMЅu j�EPEPVDžu1��W1��YE���+UM+M9s���U+UUЉUU̓U͋VH+U���tVHUЉUU̓U͋U+U_��U9V4t#U+UU���9vU̓U4��V@+U���U���V@+U���uU+U��fUV@+U��fUU̓ U͋@tU΅uU̓߈UfE��U+VD���tU+VD���u U̓U͋UԉV8����u*VYh8=��=��Yh<��hr��5O�� ~\�uV`+U���tUVXUV`V\U+Ut3}Uz�tRUU+U܋M+MRQvh1�� UBU̓UEutW-��Y1��U� ���� ً���� ʋ ���� ыUJV|� ���� ً���� ʋ ���� ыUJUM͈J ���+V|��f�� ���� ف��UfJfUf�� ���� ف��UfJW%.��YE%��f�� ���� ف��UfJU MQW1��YYEPuYY%��UfBuS,��Y���kxEE9F,}F,Kh��5O��YYh<��:��Y <��F F��h<��h��5O�� 1_^U(VWu~�uhH?��h��5O��n U +V4���th?��h��5O��H V<+U ���th>��h��5O��" 6��E~\���V\+U ��� ��9FX~h>��h��5O�� U+VXU~dF\����u }���9} U9���9}~>Vd~dX��~FdX��~d����h>��h��5O��o y���U +V\���9u5kǃ}���~d~d�uMh>��h��5O��& 3kǃ}���~d~d�uh>��h��5O�� VH+V4Uf���fUދU 9V4uhp>��h)��5O�� UUغ��#VLfUU9UvUVP��fUU܉VLU܉UU9UvUU؋U U؉VHV4UV<UU V4V8+U ���tU V8VH+U ���thD>��hM��5O�� U9V0uE tU9U uM U9UuMMU +UUU+U UVhUFh����}�uu)��Y���V4VHuu).��YYEFhVH+V8���tVHV8~�t$V‚tLV<+V8���9v;VX��Y2V<9V4u*~th >��h��5O��< jVZ��YYV89VHt9V<t jVYY_^UVW3��iE���ƁƜ�uh(@��h��5O�� ~�uh@��h��5O�� ~uh?��h��5O�� V49V<o���9V8th?��h��5O��s V4���dž�������dž�������~�;��V€-��hp?��h��5O��& ��V49���tI���dž�������dž�������-����VdPh�R���P$3��������������<} dž���<���6Vd9���}���#k���������PF��~ dž���PF�����F\����-�������Ph�R���P2��%��V`+V8���tV8V`V4V8f���fUU��fUV49VHuFHUV4+VH���t3UV4VH+V8���tVHV8VLVLU9VLsUVL���U9~h\?��h��5O�� +U9���}jV��YY^���+UU9Vd~VdU}-����Ph�u썆���P1��~\�u+VdVXV4V\j�VYY_^U0VWu~�uhh@��h8��5O�� ~tY€uT 5n� ��~�u���W=YY�� u V��Y��V<9V4��j�WYY��€uhH@��h[��5O��b ~�u)0�tw0WAYYg�����W.YYT�����#U���#UVTV4U}�tEU+V4UU+V<U9W4wW4UUU}����@tDV4+V<���t6V4+V@���1E}�t }����}�u }����j�uw0wW$E؅u%0�tw0W_YY���jWPYYv���UW0W4+UW4VhUFh����uuB)��YYEЉFhUV<}�t@tV<V@ V<V@}�t 4�uV<VD4�u w0WսYY_^UVujV���YYa���|@��F =�� uM F<VYu*V Yh@��a1��Yh@��h��5O��s jVYYV���Y^UVWu~�uhA��h��5O��9 ~uh@��h��5O�� -��lj-����VdPh�R���P<.��������_^U VWuVYuhB��h��5O�� uhtB��h��5O�� U ���V U~~���F����'��F9w,thXB��h��5O��B ���t jVYY���th4B��h��5O�� €tVYjVYY€thB��h ��5O�� tVYjVHYYt! 5n� uhA��h��5O�� ~$�t vԽY~$�thA��h��5O��l t'w hA��-/��YYhlA��h��5O��> N����t���w ��Ydž�������&V|Vx����t���O ��Ydž�������~h�tvh6 ��YFh����V4V<V8V4V<V8����t��� ��Ydž�����������t�����Ydž�������~l�tvl��YFl����k���URU}�tU9rptRpU}�u+U9rthHA��hN��5O��( UNpJUNpJpUzp�uMQ&���P&-��Ydž�������&VYuh,A��h_��5O�� _^��UVuh,�h!�hv �vvv5F~�yGF ����F���F ����F$����F(����F,����F@f�FD"�FH"�fF>1^UVWu���F ���hn@v5YYE=uN}����~ ���h'�vv1 Etuh C��,��YY���F ���u N���F ���E�����} s(t9w<uth!n uv\YYEdV] ��Y5h���5O��"YYv h C�� ,��YY$ B��F 7��_^UVWiE���4���}�u)} y F �����VtVY1���} �u}thC��h���5O�� j{��YE죤�P HJ ME�c��UfB�E���}�u4} y�v��YF����V€tfV?��Y1_���uu v �� EuhC��h���5O�� E*v uu uh\C��*�� DC��F H6��1_^U ViE���4�hD��h���5O�� Vq���}�u1U Uy1���V t fVx ��Yf1m���} �thD��h���5O��\ u��YPuu �� 13v hC��*��YYh ��5O��YYhC��)��Y^UVuv0v.YY~ uVY^U,VWuj��Yǃ�thD��h*��5O�� UWWP��YE=<���s<���+URP��YEPW ��YYlj=�W �IJ M}�t0ME O��E���}���MԋEE܋U؊ EU #V8N8#N09t"h=��5O��YYhD��(��YV8#U UuhD��hC��5O�� U 9V0uhD��hD��5O�� uu v- E=u;UUZ%��]UM JG����~(�u~(V,z~,1G��}uW��Y0��}�thD��ha��5O��/ W��YE~����V>9U���uWvQ6 Eu1���}thD��ht��5O�� ~uv5YYE=u'V€th\D��hz��5O�� N���}�t!}th<D��h}��5O��h 1G%$��EUjEPR-�� G����~ �u~ V$z~$~�uV���Y1_^U8VWu#��E~ �5��~ WV =�W �IJ MW~��YEV>9U���WUUF>PEPV Eu W��YjQ��YE裤�P HJ MԉM̋U؉UE���}�~MȋEEЋŮ EUMJUB����~ �uUV V$MJUV$UWW��YE܋UjREP:,�� <���U9U~CWuuY�� E=u W��Y}�thE��h��5O�� }<s<���+URX��YEPW��YYǃ~�th`E��h��5O��i uWv3 EI}thLE��h��5O��1 ~uvd2YYE=u)V€thE��h��5O�� N���'}�h E��h��5O�� _^U0VW}�x p�9U|hE��h���5O�� iE���4�E����w(t(5�V �IJ MU 9Qtuvԅ���}�uVW(UNJUz�uW,}�u Vd��Y됋EU5�V �IJ MMԋUUE���}�~MЋEE؋UԊ EUjEPR)�� F���� �uw W$rw$(����w(5�V �IJ MEPqw( E=���VW(}u V��Y릃}�thE��hM��5O�� EU5�V �IJ MMԍUމUE���}�~MЋEE؋UԊ EUjEPR(�� F���� �uw W$rw$�uWtY_^UVWU +U<���ЙEk<]U 9UM9M |h\F��ht��5O��? URUzsh4F��hw��5O�� E8u UR :thE��hy��5O�� U�R �R yW9U| ���W Ҿ��!fWfUU9vU��) U)щW+UWfWfUUց��v����thE��h��5O��D ҁ��fW WhE��h��5O�� 1_^UVWuVthF��h��5O�� Nh��v0YYǁu&V thF��h��5O�� N fy_^UVWu iE���4�׉5�V �R Q MjV��YYƃ}�t VWoYY VWilYY_^��UVWuvv q��YYǃuF@-�FD-�FH.�_^UVW}�x p�9U|h G��j45,O�� iE���4�փ~thF��j65,O�� ~�M���~WVWv d��YYE=t}�thF��j?5,O��X 뻋VW~�u~_^UV}�x p�9U|hpG��jP5,O�� iE���4�փ~thLG��jR5,O�� u VkYY^UUVW1� s)tU9V<ut h!n WNYYGd_^UVWu}}�tW��YPV,nYY~�[���Wv G��YYE=t#}�thG��h���5,O��8 E5~�thG��h���5,O�� ~Vz~G����1_^���Ukl�PY��U VW15��9=l�~ Gh9�- ��Y_^UVW}x9=l�hH��j{50O�� k��֋uhG��j~50O��] U V�BhR6�h02�h4�h3�ho5�h1�WRv 1_^U$VW}�x l�9U|htH��h���50O�� kE��׃�uu ��Y1��WUE����}M���w u ��VW t/F���� �uw Wrw9uu N��E멃}u"h���50O��YYhdH����YuhDH��h���50O�� &u ��YE9F���~���j ��YEࣤ�P HJ Mjj�u="�� U � E �UM JUB�����tWMJUWUWUW �tW��Yj�u j�vVEuUUEj�j�uvVEth0H��h���50O��% }U1_^UVW}�x l�9U|hH��h���50O�� kE��E]u H���1���s tG u#U VUVUV UVE@_^UVW}�x}rh�I��h��50O��K Uց�����jjj�vV Eu E���ju ��YYExthH��h#��50O�� U�R �IJ MQV#��YYEu ��Y}�uVtV׹��� &juV�� f���j= ��YE�P HJ MVEjuj�vVEu+jj�V�� jjV�� H��E $��1_^UVW}�x}rhI��hO��50O�� Uց���~U V �uw WrF����wt W��Y wYt1_^UVW}�x}rhXI��hn��50O��] Uׁ���WUj�u j�wW ƅu4j�j�jwW ƅthHI��hx��50O�� 1���Ew���j��YE�P HJ Mjj�u6�� U  UrUB����Uz�t RMJUMJUz �t u��YUVr.YYj�j�u wW ƅth8I��h��50O��> 1_^UVW}�x}rhI��h��50O�� Uׁ���w~�htI��h��50O�� N����vYg���&E�������}s���#u 9wuE ܋u-VUF����}�tURUu��YUU_^UVW}�x}rh`J��h��50O��) Uց���VU&��h��50O��YYhLJ����Yuh,J��h��50O�� E����Uz t 9t}u"h��50O��fYYhJ��g��Yl}�u UNJ UNJ~�u UMJ&j�j�jvVEtmhI��h��50O��2 Sh��50O��YYhI����Yh��50O��YYhI����Y I��E 2 ��1_^UVW}���WUE����}sAw ���VW u)F���� �uw Wrw9u���E빃}u"h��50O�� YYhJ��!��Y&uhJ��h ��50O��' &WUR��YE9Fr(URWj�uj�vVEuUUEj�j�uvVEh|J��h2��50O�� _^U(VWURU��UU��UE ��!��!օtF u���#U ׺���#U ։ U܋Uu R���\��UM܉J1_^UVW}M���E����5��l�9U}5t&~�t ~tWUW��Y}F����E_^UUMuj�u rQEthJ��h��50O��q UUMuj�u rQ EthJ��h��50O��3 ��U VW����E����1}�����F�����1���}Akjj��PH�� kǀ�����k��k��F������1������=�u"h���54O��BYYh�K��C��YHW�����i��h��j���P�� i��ǀ������i��ǀ��'H�i��ǀ�����i��i������i����G ��W=��F2=����v ����}���sE���}���thJ��h���54O�� _^UV1}<��u U�%Fh���54O��YYh K����Y!^UVW}�uhK��h���54O�� E����}�;��1=���f���5��V��>�thhK��h��54O�� ���V UE8�thTK��h��54O�� E�������7�����E����U97�s5} }/E����}}U<��t u�YEEU97�!h'��54O��YYh8K����Y}�uuwW RU9UsUUG����UWU+UUG����E_^UuuYUVWu���>�hK��hm��54O�� J���~ uhK��hv��54O��T ?�hK��h}��54O��7 J~$F ����VU�V5�ueW7�VUVWYuI_^UVW}=��u0k ��=��u"h��54O��YYhK�� ��Y5�V�WV������tWUBE �tW UBE���_^UVWuuhL��h��54O��3 1t0�rp�vhK��h��54O�� ~v̉_^UVutU 9V|V���Y^U VW}�tUz�uE8uR :uEr��uHYEuhtL��h��54O�� u9YE}uE����E����}���uhhL��h��54O��9 U9Wu E����ƋU9Wwh@L��h ��54O�� W+UUuh4L��h ��54O�� U9VuE����vjU9Vwh L��h��54O�� V+UU9UsUU=�W �R QU5�N �I KMuRQ�� UUUU+UUuYE_^UVWuu} �u }�u1��uhL��h5��54O�� uhL��h8��54O�� }�u'VYwYG����G����'��tU 9Vw +VU vuhL��hN��54O��w VYwYG����WU WW+U W9Ur U+WU UWE����}vH���}�tBU9Vw:V#YUBURUrEYUB����vUM+JM밃}�tNuhL��hn��54O��跿 VYUBURUrYUB����UMJ_^UVWuuhL��h��54O��[ U 9Ww'+WU uhL��h��54O��, 9t VnY>tV&YVWYVU VV+U V_^ULVW} }�uP��uED��E����}����E8uUU5uYEԋ]ԃ;th`M��h��54O��{ uYUԋRUUԃz�uB����uY덃}�uUԉUUԉVuq}�u��F����t�u}ԋtuPY߅uEm��WVN 9Qs ~ET��V �9J���:���~�t.v5�V �R QN Rq �� F����5�V �R QVỦ=�W �IJ Mwuu �� WVWV�tWUBEWoYE��WVRLYEEE����E����VUȃ}����}�uhTM��h��54O��Ǽ UM9JuE����RU뾋UM9Jwh,M��h��54O��芼 U9Vwh M��h��54O��j V+UĉUUR+UU9UsUU5�V �R QUċM �I �I KMuRQJ �� UUUċU+UUE����WUȃ}����}�uh�M��h%��54O��辻 UM9JuE����RU뾋UM9JwhL��h,��54O��聻 U9WwhL��h-��54O��a W+UĉUUR+UU9UsUU=�W �R QUċM �I �I KMuRQA �� UUUċU+UUVEP�����uV��� ��EPu�����uY~�tvWV�tWUBEWYE_^UU ��JU��UVW1=��u/ }*1} 7�����<��t W�YFG_^UVWuU 9Vr(5�V �IJ MUJUu���VYE} �t}�uhM��h��54O��躹 U 9UwVYƉ\���u j�Vf NjU+U Ru VQ EVYWYǃ�thxM��h��54O��N UW_^���UU=��uP����h�j��YYx =��tj+58O��ĸYYhM����Yʸ���U=��u U�U�����UVWu~�tV���Y~�thM��jL58O��聸 ����UVUVU V F���=��u5�7�M 9J ~ 5�=�?�tM 9J }?7=��t� �9J }|���_^U�����f���UVW}�N���9=�u��/5�t9>t6uhM��j~58O��获 G����_^UVW=�����.Nj�r 9`����v���=��t95�~e5�)����T��5�h�j��YYx =��t"h���58O��讶YYhM�����Y贶_^UuY@UV`�����=��n���`E=��tX�M9J Jz�uhM��h���58O��b �B����5���VvVYY^���U<VW} EE�ƅ��%t V��YߋEE�E���-uE����EE�E ���0uE0���EE�E����*uW׋RUEE�/0 s%kE 0‰UEE�-0���= ���rE.`���EE�=*���uW׋RUEE�60 s,E����kE 0‰UEE�-0���= ���rE܄O��E����E ���E���ltLuE����EE�ƅ����}�u W׋BW׋BEԅyEԉE2E���EpO��E���}�u W׋BW׋BEЍUωU�E1uUPM؋UY E1uEЅu9UĉU؍W׋M؋RE���<UĉU%E���*W׋RUE����UU:�t U9U}EU+UU}�yM}0u}�yj-���Y}u}�~u|���YM} u}�yj-c���Y}�~EESM���YM}�0u5���YMj%(���YV!���YN����j����Y1_^�U$}�u =H��u =H�P]���H�UE�E���EPj��YYt+E���H�UE�E���EPji��YYH�����}�t!EH����щ H�ӈ�U$Vu UUu!V֋RUV֋RUV֋RUEPj jU��� ^���U(juEP�� UUE����E����EPjj��� E؋UE E�UVWuU VVu��YYDžtF_^��UV5O��Nx 7�^U=O���tO��u���Y����������������S�����������������������������������������UVWEu }10���ttOF����"���������FFF FF����s�����������������st#\N������ff��_^]����������USE] ���![]USE] ���![]USE] ���![]UVWu} Mr6 u.uAfA(_^]�UVW}u M����������������������������UW}E Mr/���u'���uĉ fE_]�������������UVW��E_^]������������������L$ ���������UVWM��E_^]��������U$O��9Ut*UUEPjj���� y UO��1UVW5O��O��}׃}�~9r }�y 9vWYu_^U$UUU U5EPjMj�?��� 6EPjMj-��� $O�����UlN��p����UVWuU VVuYYDžt~~�yVډO��F_^���U$UUEPjj� ��U$ufY���Eu UY���EUUU UEPj j[ ��U$uY���EU UUUUUE����EPjj ��U(VuU @t*uY���EU UV֋RUUUEPu��YYU UEPjj ^�U$EPjj� U$UUUUU UEPjjo ��U$u2Y���EUUU UEPjj8 ���U$UUEPj<j %���U$EPu���YYEPj j ��UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVuY���ƋU rU MJwU uRYY^É{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇO��tPXP���������inet.c��task is not allowed to terminate����mq->mq_mess.m_type == DL_TASK_REPLY�unable to receive: %d���out of messages�unable to find synchronous alarm task ��SYN_AL��inet: error %d on registering ethernet devices �inet: server signon failed �panic at %s, %d: ��� inet stacktrace: ��assertion "%s" failed���compare (%d) %s (%d) failed�init: %s: Error %d �rm %s ��mknod %s c %d %d ���ln %s %s ���/dev/udp����/dev/tcp����/dev/ip�/dev/psip���/dev/eth����inet: error on line %u �inet: '%s' is not a number <= %u ���/dev/ip�/dev/ip�inet: No networks or no default network defined ����inet: ip%d and ip%d can't both be default ��default�inet: Unknown device '%s' ��psip����eth�/etc/inet.conf��/etc/inet.conf��mnx_eth.c���osdep_eth_init: DL_INIT error or wrong port: %d ����osdep_eth_init: no ethernet device at task=%d,port=%d ��unable to receive���osdep_eth_init: unable to send to ethernet task, error= %d �unable to find task %s: %d �(mess1.DL_STAT >> 16) == OK�mess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_proc���unable to receive���unable to send��loc_port != eth_port����block_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)�unable to receive���pack_size >= ETH_MIN_PACK_SIZE��i< IOVEC_NR�eth_port->etp_wr_pack == NULL���stat & (DL_PACK_SEND|DL_PACK_RECV)��message from unknown source: %d:%d��m->m_type == DL_TASK_REPLY��result == 0�mess.m_type == DL_TASK_REPLY����result == OK����result == OK����mlocked.m_type == DL_TASK_REPLY�result == OK����got reply for wrong port����repl_mess.m_type == DL_INIT_REPLY���unable to receive���unable to send(%d)��repl_mess.m_type == DL_TASK_REPLY���unable to receive���(mess1.DL_STAT >> 16) == OK�mess1.m_type == DL_TASK_REPLY && mess1.DL_PORT == mess1.DL_PORT && mess1.DL_PROC == this_proc���unable to receive���unable to send��loc_port != eth_port����block_msg.DL_STAT & (DL_PACK_SEND|DL_PACK_RECV)�unable to receive���!pack_ptr���!eth_port->etp_rd_pack��!(eth_port->etp_flags & (EPF_READ_IP|EPF_READ_SP))��m_ptr->DL_STAT & DL_PACK_RECV���eth_port->etp_osdep.etp_port == m_ptr->DL_PORT��m_ptr->m_type == DL_TASK_REPLY��ev == ð_port->etp_osdep.etp_recvev���m_ptr->DL_STAT & DL_PACK_SEND���eth_port->etp_osdep.etp_port == m_ptr->DL_PORT��m_ptr->m_type == DL_TASK_REPLY��ev == ð_port->etp_sendev�i<eth_conf_nr���mq.c����mq->mq_allocated == 0���mq != NULL��mq->mq_allocated == 1���sr.c�������������Y����������������unknown message, from %d, type %d���result == OK || result == EINTR�result == OK || result == SUSPEND���!(sr_fd->srf_flags & SFF_INUSE)�minor>=0 && minor<FD_NR�!(sr_fd->srf_flags & SFF_MINOR)�!(sr_fd->srf_flags & SFF_BUSY)��sr_fd���L������������0������������3��H��r == OK || r == SUSPEND || (printf("r= %d\n", r), 0)����r= %d ��illegal case entry��r == OK�!*q_head_ptr����*q_head_ptr�sr_fd->srf_flags & susp_flag����illegal case entry��sr_fd���request not found: from %d, type %d, MINOR= %d, PROC= %d, REF= %d OPERATION= %d�sr_fd���result == OK����!(loc_fd->srf_flags & SFF_MINOR) && (loc_fd->srf_flags & SFF_INUSE)�minor < FD_NR���minor >= 0��unable to send��!mq�m���loc_fd->srf_flags & ip_flag�!mq�m���loc_fd->srf_flags & ip_flag�unable to sendrec���unable to sendrec���unable to send: %d��m_cancel->mq_mess.m_type == REVIVE��m_cancel->mq_mess.m_source != MM_PROC_NR����unable to send: %d��m->mq_mess.m_type == REVIVE�m->mq_mess.m_source != MM_PROC_NR���!m_cancel��� ���???�0x%lx ��udp.c���UDP_IO_HDR_SIZE == sizeof(udp_io_hdr_t)�UDP_HDR_SIZE == sizeof(udp_hdr_t)���BUF_S >= sizeof(struct udp_io_hdr)��BUF_S >= sizeof(struct nwio_udpopt)�BUF_S >= sizeof(struct nwio_ipconf)�BUF_S >= sizeof(struct nwio_ipopt)��)���������(��)��f)��)��unknown state���udp_fd->uf_rdbuf_head == NULL���W,��������*��W,��+��udp_get_data(%d, 0x%x, 0x%x) called but up_state= 0x%x �udp_port->up_wr_pack����udp_port->up_flags & UPF_WRITE_IP���!for_ioctl��count == sizeof(*ipopt)�!offset�for_ioctl���-��������,��8-��udp_put_data(%d, 0x%x, 0x%x) called but up_state= 0x%x �!offset�result >= 0�udp_port->up_flags & UPF_READ_IP����0���ipconf->nwic_flags & NWIC_IPADDR_SET����/�����An.��@n@.��opt_acc->acc_length == sizeof(*udp_opt)�udp_fd->uf_flags & UFF_INUSE����data->acc_length == sizeof(nwio_udpopt_t)���unable to find unused port (shouldn't occur)����result == NW_OK�!result�result == NW_OK�result == 0�size>= hdr_len��pack->acc_length >= UDP_IO_HDR_SIZE�udp_acc�ip_hdr_acc��udp_fd->uf_flags & UFF_OPTSET���udp_fd->uf_flags & UFF_INUSE����tmp_acc->acc_next == NULL���tmp_acc->acc_linkC == 1�udp_fd->uf_flags & UFF_INUSE����!(udp_fd->uf_flags & UFF_WRITE_IP)��!(udp_port->up_flags & UPF_WRITE_IP)����!udp_port->up_wr_pack���udp_io_hdr��udp_io_hdr��udp_io_hdr��!udp_port->up_wr_pack���udp_fd->uf_flags & UFF_WRITE_IP�pack����!(udp_port->up_flags & (UPF_WRITE_IP|UPF_WRITE_SP))�!udp_port->up_wr_pack���D��������wD���D��4D��got unknown cancel request��udp_fd->uf_flags & UFF_IOCTL_IP�udp_fd->uf_flags & UFF_WRITE_IP�udp_fd->uf_flags & UFF_READ_IP��curr����arp.c���BUF_S >= sizeof(arp46_t)����BUF_S >= sizeof(struct nwio_ethopt)�BUF_S >= sizeof(struct nwio_ethstat)����H���������F�����]G�����iG�� ���G��arp_main(&arp_port_table[%d]) called but ap_state=0x%x �result == NW_OK�result == NW_OK�J����� ���^H��@���H��arp_getdata(%d, 0x%d, 0x%d) called but ap_state=0x%x ���offset+count <= sizeof(arp46_t)�arp_port->ap_flags & APF_ARP_WR_IP��(!offset) && (count == sizeof(struct nwio_ethopt))��arp_putdata(%d, 0x%d, 0x%lx) called but ap_state=0x%x ��data->acc_length == sizeof(*ethstat)����bf_bufsize(data) == sizeof(*ethstat)����!offset� ��� to ���� changed from ��arp: ethernet address for IP address ���old�eth_port >= 0���ce->ac_state == ACS_INCOMPLETE��arp_port->ap_state == APS_ARPMAIN || (printf("ap_state= %d\n", arp_port->ap_state), 0)��ap_state= %d ���eth_port >= 0 && eth_port < eth_conf_nr�ce->ac_state == ACS_INCOMPLETE || (printf("ce->ac_state= %d\n", ce->ac_state),0)����ce->ac_state= %d ���timer == &arp_port->ap_timer����eth.c���BUF_S >= ETH_HDR_SIZE���BUF_S >= sizeof(nwio_ethopt_t)��eth_fd->ef_rdbuf_head == NULL���Y�����n8X��nHX��n@vU��bf_bufsize(acc) == sizeof(*ethstat)�result == 0�bf_bufsize(acc) == sizeof(*ethstat)�sizeof(nwio_ethstat_t) <= BUF_S�eth_fd->ef_flags & EFF_INUSE����r == NW_OK��!(eth_fd->ef_flags & EFF_WRITE_IP)��!(eth_fd->ef_flags & EFF_READ_IP)���]��������@]��t]��got unknown cancel request��eth_fd->ef_flags & EFF_WRITE_IP�eth_fd->ef_flags & EFF_READ_IP��(eth_fd->ef_flags & EFF_INUSE) && !(eth_fd->ef_flags & EFF_BUSY)����ev == ð_port->etp_sendev�curr����r == NW_OK��eth_fd->ef_flags & EFF_INUSE����!data���error == NW_OK��event.c�ev->ev_func == 0����func != 0���icmp.c��BUF_S >= sizeof (nwio_ipopt_t)��f���������3f��f��result == NW_OK�data->acc_length == sizeof(*ipopt)��count == sizeof (*ipopt)����result == NW_OK�!for_ioctl��!(icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP) || (icmp_port->icp_flags & (ICPF_READ_IP|ICPF_READ_SP)) == (ICPF_READ_IP|ICPF_READ_SP))����0 <= port_nr && port_nr < ip_conf_nr����0 <= port_nr && port_nr < ip_conf_nr����0 <= port_nr && port_nr < ip_conf_nr����Vl������ ���Vl��Vl��Vl��k��Vl��k��Vl��Vl��k��l��Vl��+l��repl_icmp->acc_length == ICMP_MIN_HDR_LEN���icmp_pack���repl->acc_length == repl_hdr_len����icmp_port->icp_write_pack == NULL���!(icmp_port->icp_flags & ICPF_WRITE_IP)�p���������p��p��p��p��q���������\q��q��vs��������� s��Bs��ip_pack->acc_next == NULL��� hdrlen= %d, ih_length= %d, bufsize= %d ����icmp_err_pack: wrong packet size: �� ���icmp_err_pack: invalid source address: �%d.%d.%d.%d�%x:%x:%x:%x:%x:%x���ip.c����w��������+w��nw��unknown ip_dl_type %d���result == NW_OK�result == NW_OK�BUF_S >= sizeof(nwio_route_t)���BUF_S >= sizeof(nwio_ipopt_t)���BUF_S >= IP_MAX_HDR_SIZE + ETH_HDR_SIZE�BUF_S >= sizeof(struct nwio_ethopt)�2y��������x��x��unknown cancel request��!result�ip_fd->if_flags & IFF_READ_IP���!repl_res���ip_fd->if_flags & IFF_GIPCONF_IP����ip_fd->if_rdbuf_head == NULL����(ip_fd->if_flags & IFF_INUSE) && !(ip_fd->if_flags & IFF_BUSY)��not freeing ip_loopb_head, ip_loopb_event enqueued �no callback filled in for port %d���ip_ioctl.c��dž�� ���!n ��#n8m��(n(F��+n(�� n @̀��)n(@��,n(@}��-n(@>��"n8@|��result == NW_OK�result == NW_OK�data->acc_length == sizeof(nwio_ipconf_t)���data->acc_length == sizeof(nwio_ipopt_t)����ip_fd->if_flags & IFF_INUSE�fd>=0 && fd<=IP_FD_NR���curr����!result�ip_lib.c����)���������>��>��)��>��S�������������� �����Ɖ����������H������������!(optlen & 3)���port_nr >= 0 && port_nr < ip_conf_nr�����������������������ip_read.c���!(ip_fd->if_flags & IFF_READ_IP)����next_acc != NULL����prev_acc == NULL����first_hdr_size + first_datasize == bf_bufsize(first)����second_offset >= first_offset���second_hdr_size + second_datasize == bf_bufsize(second)�first_hdr_size + first_datasize == bf_bufsize(first)����second->acc_length >= IP_MIN_HDR_SIZE���first->acc_length >= IP_MIN_HDR_SIZE����result >= 0�size >= ip_hdr_len��pack->acc_length >= IP_MIN_HDR_SIZE�ip_fd->if_flags & IFF_INUSE�!(ntohs(ip_hdr->ih_flags_fragoff) & (IH_FRAGOFF_MASK|IH_MORE_FRAGS))����pack->acc_length >= IP_MIN_HDR_SIZE�pack->acc_length >= IP_MIN_HDR_SIZE�pack->acc_linkC>0��� ��� dst=���packet is wrongly routed, src=�� ��� dst=���packet should not be here, src=�pack->acc_length >= IP_MIN_HDR_SIZE� ��� dst=���ip[%d]: broadcast packet for ip-nonbroadcast addr, src=�pack->acc_length >= IP_MIN_HDR_SIZE�ev == &ip_port->ip_loopb_event��ip_write.c��r != NW_WOULDBLOCK��data->acc_linkC == 1����data->acc_linkC == 1����data->acc_length >= IP_MIN_HDR_SIZE�data->acc_length >= IP_MIN_HDR_SIZE�ip_fd->if_port->ip_flags & IPF_IPADDRSET�����������������!(second_hdr->ih_flags_fragoff & HTONS(IH_DONT_FRAG))���first_pack->acc_buffer->buf_linkC == 1��first_pack->acc_linkC == 1��i + optlen <= first_opt_size����first_pack->acc_length>=first_hdr_len���pack_siz > first_size���first_pack->acc_length >= IP_MIN_HDR_SIZE���can't error_reply���ipr.c���IROUTE_HASH_ASS_NR == 4�OROUTE_HASH_ASS_NR == 4�oldest_route����oroute->ort_port == port_nr�oroute->ort_port == port_nr�result == NW_OK�result == NW_OK�result == NW_OK�result == NW_OK�result == NW_OK�oroute->ort_dest != bestroute->ort_dest�oroute->ort_port == port_nr�dist_route��gw_route����nw_route����best == oroute��oroute == NULL��best == oroute��oroute == NULL��tcp.c���BUF_S >= IP_MAX_HDR_SIZE + TCP_MAX_HDR_SIZE�BUF_S >= sizeof(struct nwio_tcpconf)����BUF_S >= sizeof(struct nwio_ipconf)�BUF_S >= sizeof(struct nwio_ipopt)��׿�����������׿������unknown state���!tcp_conn->tc_busy��w��������*��w����tcp_get_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x �tcp_port->tp_pack���tcp_port->tp_flags & TPF_WRITE_IP���count == sizeof(struct nwio_ipopt)��!offset�����������\��tcp_put_data(%d, 0x%x, 0x%x) called but tp_state= 0x%x �!offset�ip_read() failed����tcp_port->tp_flags & TPF_READ_IP����ipconf->nwic_flags & NWIC_IPADDR_SET����tcp_conn->tc_busy == 0��+�����7n��1n.��5n� ��6n@��2n@l��3n@��0n@��opt_acc->acc_length == sizeof(*tcp_opt)�conf_acc->acc_length == sizeof(*tcp_conf)���tcp_fd->tf_flags & TFF_INUSE����new_di_flags & NWTC_REMPORT_MASK����new_di_flags & NWTC_REMADDR_MASK����data->acc_length == sizeof(nwio_tcpconf_t)��data->acc_length == sizeof(nwio_tcpopt_t)���unable to find unused port (shouldn't occur)����tcp_fd��!result�remaddr�remport�result == NW_OK�listen_conn�tcp_fd && listen_conn->tc_connInprogress && tcp_fd->tf_conn == listen_conn��!best_conn->tc_fd���!tcp_conn->tc_fd����tcp_conn->tc_state == TCS_CLOSED����tcp_conn����tcp_fd->tf_ioreq == NWIOTCPSHUTDOWN || tcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONN�tcp_fd->tf_flags & TFF_IOCTL_IP�tcp_fd->tf_flags & TFF_WRITE_IP�tcp_fd->tf_flags & TFF_READ_IP��tcp_conn->tc_busy == 0��tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)��� ���tcp_fd->tf_flags & TFF_INUSE����tcp_conn->tc_busy == 0��tcp_fd->tf_flags & TFF_INUSE����tcp_conn->tc_fd == tcp_fd���tcp_conn->tc_connInprogress�tcp_conn����tcp_fd->tf_ioreq == NWIOTCPLISTEN || tcp_fd->tf_ioreq == NWIOTCPCONN����tcp_fd->tf_flags & TFF_IOCTL_IP�tcp_fd��!tcp_conn->tc_connInprogress����tcp_conn->tc_fd == tcp_fd���!(tcp_fd->tf_flags & (TFF_IOCTL_IP|TFF_READ_IP|TFF_WRITE_IP))���tcp_fd->tf_flags & TFF_INUSE����I�����1n��5n� ��2n@��3n@��0n@��e����������a����unknown cancel request��tcp_conn->tc_connInprogress�tcp_fd->tf_flags & TFF_IOCTL_IP�tcp_fd->tf_flags & TFF_READ_IP��tcp_fd->tf_flags & TFF_WRITE_IP�tcp_fd->tf_flags & TFF_INUSE����!tcp_fd->tf_conn����tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RA�tcp_fd->tf_tcpconf.nwtc_flags & NWTC_SET_RP�!tcp_conn���tcp_conn->tc_frag2send == NULL��tcp_conn->tc_send_data == NULL��tcp_conn->tc_adv_data == NULL���tcp_conn->tc_rcvd_data == NULL��!tcp_conn->tc_busy��!tcp_conn->tc_send_data�tcp_conn->tc_state == TCS_CLOSED����!tcp_conn->tc_connInprogress����tcp_lib.c���!(tcp_hdropt.tho_opt_siz & 3)���!(ip_hdropt.iho_opt_siz & 3)�������������:��G��T��a��n��{��unknown (=%d)���CLOSING�ESTABLISHED�SYN_SENT����SYN_RECEIVED����LISTEN��CLOSED��not inuse ��tcp_conn_table[%d]->tc_state= ��SND_NXT<SND_TRM ����SND_TRM<SND_UNA ����SND_NXT<SND_UNA ����SND_UNA < ISS ��bf_bufsize(data)= %d ���lo_queue= %d, lo_queue= %d �SND_NXT= %d, SND_UNA= %d ���SND_NXT-SND_UNA != sizeof tc_send_data �lo_queue= %d, hi_queue= %d �SND_NXT= %d, SND_UNA= %d ���SND_NXT-SND_UNA != 0 ���hi_queue= 0x%x, lo_queue= 0x%x, size= %d ���SND_ISS= 0x%x, SND_UNA= 0x%x, SND_NXT= 0x%x ����snd hi_queue-lo_queue < 0 ��tc_RCV_HI (%d) < tc_RCV_NXT (%d) ���received data but not connected ����lo_queue= %lu, hi_queue= %lu, sizeof tc_rcvd_data= %d ��RCV_NXT-RCV_LO != sizeof tc_rcvd_data ��lo_queue= %lu, hi_queue= %lu ���RCV_NXT-RCV_LO != 0 ����size= %d ���lo_queue= 0x%x, hi_queue= 0x%x �SND_NXT= 0x%x, SND_UNA= 0x%x ���rcv hi_queue-lo_queue < 0 ��tcp_check_conn: connection is inconsistent �tcp_conn->tc_inconsistent == 1�� <options %d>��� <URG %u>��� <ACK 0x%x %u>�� <PSH>�� <RST>�� <SYN>�� <FIN>�� 0x%lx��,%u ����???�,%u ����???�tcp_hdr� TCF_FIN_SENT��� TCF_SEND_ACK��� TCF_MORE2WRITE� TCF_RCV_PUSH��� TCF_FIN_RECV��� TCF_INUSE�� IRS 0x%lx LO +0x%x(0x%lx) NXT +0x%x(0x%lx) HI +0x%x(0x%lx)�+0x%lx(0x%lx)���0��� transmit_seq �� snd_cwnd +0x%lx(0x%lx)� ISS 0x%lx UNA +0x%lx(0x%lx) TRM +0x%lx(0x%lx) NXT +0x%lx(0x%lx)����tcp_recv.c��_���������m����m���� �� ��tcp_frag2conn: unknown state ���tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)����tcp_conn->tc_connInprogress�tcp_check_conn(tcp_conn)����tcp_Gmod4G(rcv_hi, tcp_conn->tc_RCV_NXT)����tcp_check_conn(tcp_conn)����tcp_conn->tc_connInprogress�tcp_check_conn(tcp_conn)����tcp_check_conn(tcp_conn)����tcp_check_conn(tcp_conn)����tcp_conn->tc_RCV_LO + bf_bufsize(tcp_conn->tc_rcvd_data) == tcp_conn->tc_RCV_NXT || (tcp_print_conn(tcp_conn), printf("\n"), 0)� ���tcp_LEmod4G(hi_seq, tcp_conn->tc_RCV_HI)����lo_seq == tcp_conn->tc_RCV_NXT��conn[%d]: advanced data after FIN ��tcp_LEmod4G(hi_seq, tcp_conn->tc_RCV_HI)����lo_seq == tcp_conn->tc_RCV_NXT��!(tcp_hdr->th_flags & THF_SYN)��tcp_conn->tc_busy���tcp_conn->tc_busy���tcp_conn->tc_busy���old_window >=0 && new_window >= old_window��tcp_fd->tf_flags & TFF_READ_IP��tcp_conn->tc_busy���tcp_send.c��tcp_conn->tc_flags & TCF_INUSE��ev == &tcp_port->tp_snd_event���!(tcp_port->tp_flags & (TPF_WRITE_IP|TPF_WRITE_SP))�r == NW_OK��r == NW_OK || (printf("ip_send failed, error %d\n", r),0)���ip_send failed, error %d ���tcp_conn->tc_flags & TCF_MORE2WRITE�!(tcp_port->tp_flags & TPF_WRITE_IP)������������ �� � �. �. �0���Illegal state���tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)��� ���tcp_conn->tc_SND_UNA != tcp_conn->tc_ISS����tcp_LEmod4G(seg_seq, tcp_conn->tc_SND_NXT)��tcp_conn->tc_transmit_timer.tim_active || (tcp_print_conn(tcp_conn), printf("\n"), 0)��� ���tcp_conn->tc_tcpopt == NULL�tcp_conn->tc_busy���tcp_conn->tc_state == TCS_CLOSING���tcp_GEmod4G(tcp_conn->tc_snd_cwnd, seg_ack)�seg_ack != tcp_conn->tc_SND_UNA�tcp_conn->tc_rtt����tcp_conn->tc_rtt����tcp_conn->tc_rtt����curr_time >= tcp_conn->tc_rt_time���tcp_LEmod4G(seg_ack, tcp_conn->tc_SND_NXT)��tcp_GEmod4G(seg_ack, tcp_conn->tc_SND_UNA)��tcp_conn->tc_busy���stt <= curr_time����!tcp_conn->tc_fd || !(tcp_conn->tc_fd->tf_flags & TFF_WRITE_IP)�tcp_conn->tc_SND_TRM == tcp_conn->tc_SND_UNA����tcp_conn->tc_state != TCS_LISTEN����tcp_conn->tc_state != TCS_CLOSED����tcp_conn->tc_flags & TCF_INUSE��tcp_fd->tf_flags & TFF_WRITE_IP�tcp_conn->tc_busy���������������tcp_check_conn(tcp_conn) || (tcp_print_conn(tcp_conn), printf("\n"), 0)� ���tcp_conn->tc_state != TCS_LISTEN����tcp_conn->tc_state != TCS_CLOSED����tcp_check_conn(tcp_conn)����tcp_port->tp_snd_head == tcp_conn���!(tcp_fd->tf_flags & TFF_IOCTL_IP) || (printf("req= 0x%lx\n", tcp_fd->tf_ioreq), 0)�req= 0x%lx �!tcp_conn->tc_connInprogress����tcp_fd->tf_ioreq != NWIOTCPSHUTDOWN�!(tcp_fd->tf_flags & TFF_WRITE_IP)��!(tcp_fd->tf_flags & TFF_READ_IP)���tcp_fd->tf_conn == tcp_conn�tcp_conn->tc_flags & TCF_INUSE��tcp_check_conn(tcp_conn)����ip_eth.c����BUF_S >= sizeof(eth_hdr_t)��BUF_S >= sizeof(xmit_hdr_t)�= ��������v���unknown state: %d���ipeth_main: arp_set_cb failed: %d ��!������� �!�!�get_eth_data(%d, 0x%d, 0x%d) called but ip_state=0x%x ��data����(!offset) && (count == sizeof(struct nwio_ethopt))��strange status��ip_port->ip_dl.dl_eth.de_state= 0x%x����!offset�0���sizeof(t) <= sizeof(eth_hdr->eh_src)����r == NW_OK || r == NW_SUSPEND���!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)����r == NW_WOULDBLOCK��r == NW_OK��dest != ip_port->ip_ipaddr��hostpart != 0���invalid destination�eth_pack->acc_next == NULL��r == NW_OK��!(ip_port->ip_dl.dl_eth.de_flags & IEF_WRITE_SP)����r == NW_WOULDBLOCK��ip_port->ip_dl.dl_eth.de_frame == NULL��r == NW_OK��r == NW_OK��ip_port_nr >= 0 && ip_port_nr < ip_conf_nr��ip_hdr->ih_ttl > 0��!(sum & 0xffff0000)�ip_pack->acc_linkC == 1 && ip_pack->acc_buffer->buf_linkC == 1��ip_pack->acc_length >= sizeof(*ip_hdr)��enq_time <= now && enq_time + HZ > now��!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_SP)�!(ip_port->ip_dl.dl_eth.de_flags & IEF_READ_IP)�ip_ps.c�result == NW_OK�ip_port->ip_dl_type == IPDL_PSIP����ip_port_nr >= 0 && ip_port_nr < ip_conf_nr��ip_port->ip_dl_type == IPDL_PSIP����ip_port_nr >= 0 && ip_port_nr < ip_conf_nr��ip_port->ip_dl.dl_ps.ps_send_head == NULL���result == NW_OK�psip.c��psip_port->pp_flags & PPF_CONFIGURED����port_nr >= 0 && port_nr < psip_conf_nr��result1 == NW_OK����psip_fd->pf_flags & PFF_READ_IP�psip_send: loop�port_nr >= 0 && port_nr < psip_conf_nr��port >= 0 && port < psip_conf_nr����o3����Qn%3�Pn@o2�data->acc_length == sizeof(*psip_opt)���fd >= 0 && fd < PSIP_FD_NR��fd >= 0 && fd < PSIP_FD_NR��pack == NULL����pack == NULL����fd >= 0 && fd < PSIP_FD_NR��psip_port->pp_opencnt >0����fd >= 0 && fd < PSIP_FD_NR��7�������6�6�w7�invalid operation for cancel����should not be here��result == NW_OK�unable to find to request to cancel�psip_fd->pf_flags & PFF_READ_IP�should not be here��fd >= 0 && fd < PSIP_FD_NR��result1 == NW_OK����psip_fd->pf_flags & PFF_READ_IP�psip'promisc_restart_read: loop�result == NW_OK�!result�buf.c���buf_s == BUF_S��fewer accessors than buffers����buf.c: to many clients��not enough buffers freed����buf->buf_linkC == 0�new_acc->acc_linkC == 0�size>0��buf->buf_linkC>0����buf�acc->acc_linkC>0����buf.c: out of accessors�acc_ptr >= accessors && acc_ptr <= &accessors[ACC_NR-1]�acc_ptr�offset_new < acc_ptr_new->acc_length����acc_ptr_new�offset_old < acc_ptr_old->acc_length����acc_ptr_old�size > 0����data����data����data����data����new_acc�data����offset_old < data_second->acc_length����offset_new < acc_ptr_new->acc_length����acc_ptr_new�offset_old < tail->acc_length���offset_new < acc_ptr_new->acc_length����acc_ptr_new�curr->acc_linkC == 1����head->acc_next == NULL��size != 0 && buf_size != 0��clock.c�can't read clock����!timer->tim_active��timer_index�can't set timer�timer_chain->tim_active�eO� ���%���N�X���+N�c���N�d���M�o���"N�p���+N�s���N�u���9N�x���2N�������T����F���T�I���T�M���pT�S���pT�P������������������� �������< ��X ��x��P������������ ��!��$��&��d(��x2��8��x;��B����F��G��J��M��inet 0.35K, last compiled on May 22 2001 20:18:24���0123456789ABCDEF����0123456789abcdef������������SSSS���� 8������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���P.�� ��������P������1$T$L$�� ��su;SSSSu���� QRP������P�����UV5(��V��YPu5� ��5 ��h���h\��< ��5(��^Ujj�j� �� ~= ���t  ��UE8t0 ��YE�U5 ��h���h\���� j]��YU`VW} 1 ��W:-tj�h|�� ��YYu Whl�� ��YYhd��Yj ��Y}}W� ��WUEP ��YjEP ��YYEPEPj� �� jEP ��YYEP} ��YE����E���j�EPjI �� h`��5� ����YYE܅���j�EP5� ���� Et}��wU:�t&5� ��5 ��hD��h\����j%��Y��#Uf���� ����� ف��fMUܹ��#JfMEjh��c��YYE؅y7h��Y=(��t=(��t =(��I��j��Y<��E ��fUfUEPh0n@u�� yh���VYjO��YE���EPh6n@u�� yh���$Yj��Y}?��E����EPh6n@u�� j���YEP��Yyh���Y��juJ��YY ���Pju8�� ���h���Yu��Yu��Y?��u��Yu��Yj�u��YYju��YYu��YEu0��YYE0>Yjh(��u"�� j%��Y ��EPxYuo��Yjh(��u�� EuQ��Y}�t���h��P���N)��= ��r EP��Yj�EPj�� E����EPh3n@u)�� y=(��t߃=(�� t1h���rY$j�EPj�6�� U؉UE1xEPYEPYtV��YR���H���UV5��Nx  ��^U= ���t ��u4��Y�UVux95 ���� ��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+(��"���}�t}�y��� UU_^��UVW5����YG��DžD���7u��YYtw>�t6u��YYt} �tu w ��YYu=���u��_^UVuFPFPFPPh��h ���� ��^UVWuE����u41}%<t���t4t��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juvq �� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv �� E����U9Uu1 N _^UV1}*<t���tt��B���t 4t��aYF^��UUUuuu @�� �UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu �� E���UJUx ]E� EPj�`��YYEUuu hu������������ �����#�����w�������������������������o�����������������������������������3�����7 �����T �����k ����� �������������U= ���uh��h����YY �� 5 ����YU ��U= ���t5 ����Y ������������UVW= ���u!h,��h0����YY ��u1D��5 ��h���h ���� Eu1��U:#th(��u ��YYƅt�U ��h$��u���YYEt��EU: t: uEh ��u���YYƅj�Fu��Y%��f���� ����� ى (��5,��0��$��h��VW���YYƅt�Ft8>�t3> t> uF��s7h��V���YYƅt�F���� ��_^UVW}Utu >�t]9uFG1_^�U$UUEPjj�G�� ��U$U UEPu��YYEPj!j�� U$UUEPjj�� ��UVu x~(�� ���5juu��YYy9uuVYVj�uM�� ^���U��2u u��� �ULVWE����1E����E����U UE8�t+0��Y���E9uvE���EEE͋UUE8�t(0O��Y���E9uvE���EEЃ E V!փ}�u s(�����K��V3��YE=u(�����&��UEUUU}׋U UE8�t=+UEEE0��Y���E܋]P3W�� }׃E뻋E�����EUUE8�t=+UEEE0B��Y���E܋]P3W�� }׃E뻋E�����EU9v�Gu��Y���EuUUȋUUE����E����EPj;j��� R��Y_^���U4VWE���j/u3��YYuhD����Yƅu@��Vq��Y���Pub��YZ���EЃeu��YE=u(��������}؀>�t >:tFG9}s/GuW��YYEPuR��YY=t4��2u u =(��t (��Ũ}t} uFuUR��YỦ(��_^U(VuE����E����V֋RUV֋RU L��E ��UUU UEPj7j�� ^U$EPjj��� U$UUU UUUEPj6j�� ��U$UUU UUUEPjj�� yEU(VuU @t*u��Y���EU UV֋RUUUEPu��YYU UEPjj�� ^�U$EPj*j�� yUEUMJ1��U$UUUUU UEPjj�� ��U$UUU UUUEd%��EPjGj��� ���U$} �uE���E����UUE UEPjJj�E�� y}�tUEEU} v(�����M ���E 1U} v(�����M ���ҋE!1UE�����1UE��1U} v(�����M ���Et���1��U$EUEPjHj�U�� UU$VWEP��YEPEPj�v j���YƋ}t9uvE��EPCYE����EPEPj WW��YUUjEP YYEPYWj�1��YZ)‰j�EPj j�EPj t9r)օu jN��YV��YU)_^�U$u��Y���EUUU UEPjj4�� ���U$UUUUEPj j� �� y} �tUE EU$UUUUU UEPjj�� ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U x����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E����uVuu ��ƀ}Xu9utUP��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vut��YY=u}�t Uډ����E1!,'"���U��-��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U��M��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEи��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE Pw��E6U U RU U RUEE�E(��=��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VPT��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VP��YY=u}�t Uډ����JxUʋFF Vux��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP��YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vu��YY=u˃}�t Uډ E_^���UVW11}U9t��u t������F߃| j���uYtUrYtURtUz�t r^ ��Y},��t}D��t}\��t u: ��Y_^�UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+U���V��V��V��V��V��V��V����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������~�u%h���+��YF~�uN NF ���1}9<t���t,t��R@tt��B���t 4t��YGƒ~�uF��FF ���VVv vv >�uNN FFSX_^UVW}Wu u4 ƅ~9})׉U U 1_^UVWu } �� ��~�y U��Vu C��V€tu ,��fN���V���~����D��u>5H�� ��Yt.h�����YFu NL���NHF ���9h���r��YFuN!NF ���V@u��VVVh���U����F���t$jj�v" =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWE����E����11<t���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ��� ��U :�t! E���E E ��� ��U uuu;YYEy@Ut8h��u��YYE~"��� tugYuuYYE}�y1]���j��YEu u2Y1A���!uE�����UMJUzUB����Ut��E_^UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u%�� E`�����������UVWtu} u ~�tIu(_^]�����UVW}u M���������������UW}���0))ϊE tu1_]XG_]��������������UVW��E_^]������������������UVuj j�V_ ^�UVW��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UV��U9��wU�����9��v(�� ���16V0��Yt1'��rF����5��&��Y5�����^UVW}�u1���E����}������UUs(�� ���1���=���u8j��Y=u1���V!փ5��5��F����E����5��O���VU}9}r69v2W9UvUW~>}�t E��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=��<���9}r79}u+UOJ}�t E��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV| u���Y_^U VWUUb���15��t 9ur6E0tU U��tU9ru NJEtU9Wu RWE_^��U}�x}~u��P��YYUUas U E���Uh��h\��YYjBY��U$ ��9Ut*UUEPjj���� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^UVupY���ƋU rU MJwU uR%YY^UVWuU VVu)��YYDžt~~�yVډ(��F_^���U$UUEPjj� ��U$U UEPuHYYEPjju U$EPjj�] U$EPu���YY1ۅÉ�U$UUU UEPj%j� UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj= V����5��h��jKj� ^���Uu hT$u UVWu1fϋV€t}u ~�tu>����F���tViYU )uRvk EVt tfVV}u1_^USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������} 0)ʇʋu }���������UW}0ʀuA)_]�����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P������������G���1ۇ ��tPXP�����%s %s: %s: %s ��Usage: %s [-d] [-m maxclients] service program [arg ...] ���1���������s�������%s %s: stalling %u second%s ����%s %s: Connection from %s:%u ���Unable to listen����fork����pipe����Can't set TCP options���Can't configure TCP channel�Can't open /dev/tcp�/dev/tcp����%s %s: listening to port %u ����%s: %s: Unknown service ����tcp�tcpdp���/usr/bin/tcpdp��/etc/serv.access����unknown error���%d.%d.%d.%d�No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�r���/etc/services��� �� ��,/�� ��# ��r���/etc/services�������PATH���������������������������������� �����@����������X�����b�����d�����i�����o�����p�����u�����x���������� �����#�����+�����-�����0����������L�����h���{��l����������E���E��G���0��X�����b�����c�����d�����e���E��f���E��g���0��i�����n�����o�����p�����r�����s���U��u�����x�����(null)��#�����a���#��r���#��w���#��$�����+���#��b���#��cannot print floating point ��������������SSSS��������������������������������������������������������B���������������,��D��\����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error�����������������p��\��L��@���� ������������������t��`��L��8��$��������������������h��T��@��$���� �� �� �� �� �� �� �� �� �� ��������������t��`��P��<��(��������������C�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���0j����������������1$T$L ����su;SSSSu �� �� QRP�����P�����UV5 ��V��YPu5��5��h���h$ ����5 ��^Ujj�j��� ~=���t ��UE8t0��YE�U5��h���h$ ��v�� j1��YUpVW1E ��E����E���9u���U :-���Bu VZYU:-u z����U:�tm���E���U:�u9uuPBu VZYUj EPu�� Et}wU:�tUUE|���놋EE�P���g��Bu VZY��U U9uEP��YjEP��YYEPEPj��� jEP��YYEP��YE����E���j�EPj�� hx��5����YYE܅���j�EP5���� Et}��wU:�t&5��5��h\��h$ ����jK��Y��#Uf���� ����� ف��fM^Uܹ��#JfM}�tIfUf���� ����� Q5��5��h<��h$ ����Ejh0��R��YYE؅y7h��Y= ��t= ��t = ����je��Y��E ��fUfUEPh0n@u�� yh���YYj&��YE���EPh6n@u�� yh���'Yj��Y}^��E����EPh6n@u|�� j���YEPx��Yyh���Y(��ju9��YY ���Pju'�� ���h���Yu��Yu��Y��u��Yu��YU j�ru\�� uj2��Yj�u��YYju��YYu��YEu0��YYE0"Yjh ��u�� j��Y��EP\YuG��Yjh ��uw�� Eu)��Y}�t��8��h���d��U9��r EPj��Yj�EPjR�� E����EPh3n@u�� y,= ��t߃= �� u }����h���JY���j�EPj��� U؉UE}�k���EPh1nu�� uSfUf���� ����� Qu6��YP5��5��h���h$ ����1EPYEPYtE}�t1u���|���PW5��5��h���h$ ��o��W&��Yx���nUV5 ��Nx ��^U= ���t ��u\��Y�UVux95 ���� ��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��UVW5<��&��YC'��DžD���7uz��YYtw>�t6ub��YYt} �tu w F��YYu=<���u&��_^UVuFPFPFPPh��h�� ����^U VW}E����JxGGSXW ��Y=u ���#u E���à u E����뵃}�u ~U U:t;uU EX���U ���9Us U EJxGGSXW ��Yƃt ~ :t;ut WV ��YYU�U _^UVWU:�u1���j/u��YYƅu ���u;'��Y] /FE 8u1���1-0���= ���sF-0���k ǃ ~1x���>�uu1ku1 ���)Ѻ ���)У@��@����� ʋ @����� ы@����� ʋE���_^UVWU-A���=���w U -A���=���w *u���E U :*t-A���=���w u ���j���t@9u U MRQ|YYt���BEU-A���=���w 1"tu 19u@9u EE 41_^UVWE����jjEP"�� ƅM���6u  ��YYu !��Yƅt2~u,1V<�t!jEP47 �� u E���Gփ}�t uYPu ��YYE_^U��VWEPh1nuC�� y �����Ut9Uu �����h$��5 ��S��YYEu1ۃ= ��tC��Dž���Dž����Dž����DžDž������PuYY=��:u Dž����у;uDž���Dž����붃�t\Pu YYtu PpYYt���m�`Dž���Qlu3h ��P3 ��YYu�(Dž���-t3+t.}�P5 ��h���h$ ��a���u+u������1u@1ۃ+uC9�u-u������PPPX t-3UM-u������5uPuYY�u ���PPYY-u������u9��Y%��uPu^YY}�t1u@SPUYY���h �� P ���Y��h��h��=��YY=���@Pz��Y@Pe ��Y<Pu����<<<P<u 3<[rqp Ph��DP]��(DP��YPDP��� ,���Y1u@_^U ��UU ��E��U$UUEPjj 6�� ��U$UUU UUUEPj6j5�� ��U(VuU @t*u*��Y���EU UV֋RUUUEPuT5��YYU UEPjj{5�� ^�U$UUUUU UEPjjO5�� ��UVW11}U9< ��u < ������F߃| j���ug���YtUrYtURtUz�t rN ��Y} ��t} ��t}$ ��t u* ��Y_^�UVWuE����u41}%<< ���t4< ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juvy6�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v5�� =u N /uvv E����U9Uu1 N _^UV1}*<< ���t< ��B���t 4< ��aYF^��UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h�����YF~�uN NF ���1}9<< ���t,< ��R@t< ��B���t 4< ��}YGƒ~�uF��FF ���VVv vv4�� >�uNN FFSX_^UVWE����E����11<< ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �(��_S��U :�t! E���E E �H��6S��U uuu#YYEy@Ut8h��uA1��YYE~"��� tuYuuYYE}�y1]���j ��YEu ujY1A���!uE�����UMJUzUB����U< ��E_^UUUuuu 88�� �UUURu hu���UUURuu u_�����UVWu }tV€u4V9Vu>�t FN~U9tUE_^���UEE��UUUUU JUEPuu`7�� E���UJUx ]E� EPj�>��YYEUuu hu��C/��������/�����/�����0�����;1�����������s1�����1�����1�����K2�����p2�����2�����1�����2�����2�����4�����?4��������UVWu} Mr6 u.uAfA(_^]�UW}���0))ϊE tu1_]XG_]��������������?��������UVW@��E_^]����������@��������UVW ��u@��Yƹ<��� ��+F؉F ��+ډV ��YV ��YDžt"<���1FF1V ��Y_^UV ��U9 ��wU �����9 ��v �� ���16V ,��Yt1' ��rF����5 ��&��Y5 �����^UVW}�u1���E����}������UUs �� ���1���=���u8j+��Y=u1���V!փ5��5 ��F����E����5$��O���VU}9}r69v2W9UvUW~>}�t E$��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=$��<���9}r79}u+UOJ}�t E$��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV@=�� u���Y_^U VWUUb���15$��t 9ur6E0tU U$��tU9ru NJEtU9Wu RWE_^��UVWu 1>:u1G���>�t1-0���= ���r">,t>-t>+t } U EFGʃ}1U�_^U VW} 1}}�tU1E}�tUUE�����=0���|=9���G-0���k 9}u1���x|1���i��]?:���G1=0���|=9���G-0���k 9}u1|���x<|1l���k<]?:uDG1=0���|=9���G-0���k 9}u1-x<|1 E0}�tUM EUJ_^U(VWu }E����E����h��EP���J��>M���>Ju FGEJEZu=0���|#=9���-0���k] É]FG9uu1���E1=J���V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V�� V��!V��"V��#V��$V��%V��&V������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������uC9]| }m��~1���UMۈ UMJ���EMFGuE����=0���|#=9���-0���k] É]FG9uu1J���UM9L9L}14UM]E}}>.t}t1 �UMۈ _^UVWu }h ��VW ƅu1���WW8YZ׀>/u5Fuh ��VEP ƅu1���9ut EEG>,t1j���Fh ��VW ƅu1M���WWYZ׀>/u0Fuh ��VEP ƅu1EEGu>�t1_^UVWuE�����}��>:t��Vh��YY_�� ��� ��� ��U �� �� ��U�� ��VY=�����Vh��YYVh(��wYYƅ���>-uF>+uFj�VEP ƅ���UU ��j h(��5 ��7�� 1 �����(���Vh(��YYƅp���j h(��5 ��7�� (���>�t>,tj�VEP ƅt5U ��>�t'>,u"FVY=x���wVh(��YYƅu�_^Uhh��m7��YPLY �� �� �� ��UVWu }V+V¤�����ЙU:|Cl��V���Йu-l��Vd���Йul��V��ЙuG9}~E+U���Й)ډ_^UVW}U l��J���șu9U l��Jd���șuU l��J��șu���1E?Mt'w?Ju}�t :}���1Z)‰���1E���U9W~kE0JX��4EU M R+Q¤�����ЙЙUuW +UЙOIkkE0X��UM 9_^UVWuE �� ��E����= ��u ��V = ���u1���U:UtVuYYE VjYYYE?UtVWxYYEVh��YYEU9U}U9V~(U9V} E���U9VU9V}E���}�`���U9Vt U9VL���U9Vu URUWUkF<Fk<EU9Vu9E~U9VuU9U}E���}�t �� F ����1_^��U VWu<���Fy<N<���FFFV~�yF<N���FNjFV~�yFO ���FFFV~�yF NV Jׅm���Ny NF ���l��V���ЙhX��u3l��Vd���Йul��V��Йu���1k0Z‹N<닺l��V���ЙhX��u3l��Vd���Йul��V��Йu���1k0Z‹N9<|���l��V���ЙWhX��u3l��Vd���Йul��V��Йu���1k0Z‹N[+F~ 1F����F"BV E��Ul��9V} k��E����1E����l��VU+U|Y�~EU+Uim��NjU+U���Й@)9~E���EtEERY9}���1U+UP���ЙZǹd���EWtEERY9}���1U+UPd���ЙZZ)‰׹��EtEERY9}���1U+UP��ЙZ1҉UUU9V~O���EhX��u%d���Eu��Eu���1k0Z‹MUE멋V JUUyE}UV���GVkF<Fk<E+U蹀Q�19sEiǀQ�E= ���~+ ��9Uw= ���y ��9UsE ��U~ �y VYE~ �t  ��UE����U9UvEU+UU}�tU9UtE_^U8VWE���U UUUUfRf���� ����� ىM؋UfRf���� ����� ىME��E��u }����}�`���uuVuu��DžyD�����1��W΋U ��uSY���ljUUU)UVuVt ��YY���ZMԃ}�~DVuVU ��YY���Z߃}�t&UBt D����� D�����1+��E4��E�����$��4��EȐ��E�����0����E����M��9u��uuVuu��Dž��V ��YEV ��YEV ��Yǃ}u@ց}��sUEEuY���ljUUU)U]}�tE} u?uuVuu>��Džy +֋U �� ����}�u}t }�t&9=,��t U9UtQ=,��UŨ}u���1(��}�u U ��uu0Y���ZЉE���E1UU��s-UEȉEWVR3,�� UUE;}�tE�����E����� �� D�����1_^U��VW}-0���= ������>����N>.���W��Y��=uD�����1���= ��$��4��4������(�����,���������������0���� ��X-0���= ���r>.uF\h����PjjW ��y1j��Pi _^U��VW}}t1���PGPGPGPhl��Ph���Pj jP@ ��Ey1HjuP ƅu1*UVU V ������������_^��U=���uh��h��YY�� 5��)��YU <��U=���t5��Y������<������UVW=���u!h��h��3YY��u1D��5��h���h��%�� Eu1��U:#th��u ��YYƅt�U��h��u���YYEt��EU: t: uEh��u���YYƅj�Fu+)��Y%��f���� ����� ى ��5������h��VW���YYƅt�Ft8>�t3> t> uFd��s7h��V���YYƅt�F������_^UVW}Utu >�t]9uFG1_^�UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E5��} �tF=@�� @����� ً@����� ʋ @����� ыE ���_^��UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��<4���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��72��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��j1��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VWP��um$��=u ���h����Pj�j�j�uu uj�"(��$ƅD��������uuV�P��ƅyD��������}Gu^fWf���� ����� uL0D�����7D�����+D�����D�����W(��/��_^UVWE����P��uM#��=u N�� ������D�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u P��€u$}����N>.���P��������l��?�q���uuuu 7u���E~���= ��;uD�����l���=D��uE=D��t =D��uP�����t놃}�t"uuuu j�u%���E~}�t D�����_^U��VW}} �uBW<Y-���Ɖ:.u#��sVWPY�� Ƅ5�*"u h���Wh���hL��PQuuuu_^U��VWh\��G��YEthX��unYYEu1���E�uh���PN�� ���>�t ��uF>�n����uP. ��YYuF ��u>�tDG?�t ��uG1҈g��h���Vhh��I�� u&Yh�� uY1_^���U@��VWE����E����E����UUЋUUE=���P��u ��=u ��P��u } ���~���1EUffUE����L��9UY��E����T��9U;��}���Dž����L��U=���y2UMEPUd��P4X��w�� ��=����#U f���� ����� ف��fMjEP5���� =���t$ ��U5��Y��^��u u5���� 9E t$ ��U5��Y����}fE�U܅t2EPW5�� ƅ~U)��fUU܅tB ��U5��7Y��}<��}���E���M��}ff���� ����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5�� ƅ~U)��fUU܅t$ ��U5��[Y�������UJÜJU+U��fUU܅V��U܁���v���E܉VP5��& ƅ��U)��fU멃=���y����y ��U'��UMUd��P4X��u u5��(��9E ���MH��Uԃ}�~ Eԙ=T��Eԃ}�E���uuu5����E=u= �����E������E���UM9uP�� u+UBt"5��Y��E���}�tP��t}�u P�����u5��Y��Ea���EE=���x5��WY��}�u}�u  ��;��� ��=��� Uȉ ��_^U=��t5��Y��U$VWht����YDžuh��jWYYƃu ��E���E1��UUfU fUEPh0n@V E=u ��EVlYGE����EPh2n@Vv E=u ��EV0Y E�����_^UVWuut.Vu u Dž U)U U )΋E_^U VWh����YDžu��jWYYƃuEE7��3EPh@n@V E=u  ��UVjYU ��_^UVW���URYƅu �� ���w���UWfUfW fG ����#UfWuu FP�� ���URVul E ��UVEY}r UUU ��E_^UhE��j��YYjw��YUVW���URYDžu �� ������hE��j��YYEu*��YE���URWul Ƌ ��Uxw7~1WYj���YujB��YYu��YU ��@RGPu x�� WAYj���Yuj��YYu��Y_^��UVWEE�P4��YNjE E �P"��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P��Y9uuąt9}���t��� t1_^��U$UUEPjj���� y U��1UVW5����}׃}�~9r }�y 9vWYu_^���UVuY���ƋU rU MJwU uRQYY^UVWuU VVu��YYDžt~~�yVډ ��F_^���U$UUEPjj� ��U$U UEPuHYYEPjju UVu x~ �� ���5juI��YYy9uuVYVj�u!�� ^���U4VWE���j/uYYuh����Yƅu��VEY���Pu6YZ���EЃeu*YE=u ��������}؀>�t >:tFG9}s/GuWYYEPu��YY=t4 ��2u u^�� = ��t  ��Ũ}t} uFuURYỦ ��_^U(VuE����E����V֋RUV֋RU ��E ��UUU UEPj7j ^U$EPjj� U$UUU UUUEPjj_ yEU$EPj*j9 yUEUMJ1��U$UUUUU UEPjj ��U$UUU UUUEY��EPjGj� ���U$} �uE���E����UUE UEPjJj�} y}�tUEEU} v �����M ���E 1U} v �����M ���ҋE!1UE�����1UE��1U} v �����M ���Et���1��U$EUEPjHj� UU$VWEPf ��YEPEPj� j�D ��YƋ}t9uvE L��EPYE����EPEPjl W ��YUUjEPaYYEPnYWj� ��YZ)‰j�EPj* j�EPj: t9r)օu j��YV ��YU)_^�U$uY���EUUU UEPjjl ���U$EPj jQ y}�tUEEU$UUUUEPj j� y} �tUE EUVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E��V��uVuu ��ƀ}Xu9utUP ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu��YY=u}�t Uډ����E1!,'"���U0 ��e��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U` ����JxUʋFF Vu.��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P_ ��E6U U RU U RUEE�E ��u��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VPp��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VP��YY=u}�t Uډ����JxUʋFF Vu��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP.��YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vu���YY=u˃}�t Uډ E_^���UVWu}M } �~/JxFFSXV芾YE=t G} uȃ}uVt 9}u1 1�E_^�UVW}Wu u ƅ~9})׉U U 1_^UVWu } ��v��~�y U��Vu C��V€tu ,��fN���V���~���� ��u>5 ����Yt.h���YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�vb =uN ?��jEPvL =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vS =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�uM�� E`� �������� ��USE] ���![]USE] ���![]USE] ���![]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVW}u M���������������UVWME_^]��������UVuj j�VǬ ^�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVWh��EUE��Q�E1UE1ǹ<���E1��E1<���1F��E1F���G1V���Eu%d���Eu��Eun��m��9wG���EWu%d���Eu��Eun��m��Z)‰E|Ul��V~F�������EhX��u%d���Eu��Eu���1k0Z‹N9<wS���EWhX��u%d���Eu��Eu���1k0Z‹N[+FdWV F ����_^�U}�x}~u ��P ��YYUVu~  u �����6EP~YE����U UEPEPVz yE^��UUas U E���Uh ��h$ ��ֹYYj蒩Y��U ��VWDž����Dž����H�����L�����P����T������l���j�hx ��JYYuD�����g����#Jfhl ��{Yƅth���Vhl��, hT ��hX ��舷YYE(��uh���Po ���jhL ��Pi �� _����u> t> uF>�t> th���Vhl�� j hl��豺YYƅt�Dž����djhD ��P �� ����9> t> uF>�> h���Vhl�� j hl��(YYƅt�l��l��7E����>�t3��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h8 ��P�� Q=T��D> t> uF>�(> T��X��PVYYT��ff Ud��T��uȱY=T���u"X����ffd��T�����=l���u=h���P>��YYu&j.P貸YYƅtFPhl��YY�]���l��l��l��E����>�t >.uEFl��}|x��sj.VHYYF7M���� P��1_^���U<VW}$�t}( s ��j j�u$�� }$j��B��fj��fj��f���� ����� ف��fG�G�UxO шOP��t���1W ˆWP��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf����� ����� ف��fO}�`��}�V��m( učEPu(VuSEy 2��u֋U(+UU(Vj HYYVu:YYVj�HYYVj� YYf����� ����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuYY}�tuuV uf����� ����� ف��fO ��E ��+U$_^�U$UUEPjj� ��ULVWE����1E����E����U UE8�t+0Y���E9uvE���EEE͋UUE8�t(0Y���E9uvE���EEЃ E V!փ}�u s �����K��VYE=u �����&��UEUUU}׋U UE8�t=+UEEE0.Y���E܋]P3W] }׃E뻋E�����EUUE8�t=+UEEE0ֳY���E܋]P3W }׃E뻋E�����EU9v�Gu荳Y���EuUUȋUUE����E����EPj;j� RYY_^���U$EPjj� U$EPu���YY1ۅÉ�U$UUU UEPj%j�} UHVuUVUVUV UVUЋU UEP���Y^UVuEP;Yj�EPji V����5��h��jKj� ^���Uu hT$uթ UVWu1fϋV€t}u ~�tu>����F���tVYU )uRv EVt tfVV}u1_^UVW}u M)9r/r uu fE_^]t|�������������UW}E Mr/���u'���uĉ fE_]�����L$ �������U Vj�h ��譯YYƅyHu uV袯 EVVY}u"U JU�j u,YYEt��1^���{sƉ����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP�����������������%s %s: %s: %s ��Usage: %s [-d] [-m maxclients] service program [arg ...] ��������d���k��m���t��M���������s�������%s %s: stalling %u second%s ����%s %s: Connection from %s:%u ���Unable to listen����fork����pipe����Can't set TCP options���Can't configure TCP channel�Can't open /dev/tcp�/dev/tcp����%s %s: listening to port %u ����%s: %s: Unknown service ����tcp�����unknown error���%d.%d.%d.%d�/etc/serv.access����denied��granted�%s %02d %02d:%02d:%02d service '%s' %s to %s ���/usr/adm/log����%s: strange check word '%s' ����log�r���W�����a���D��r�����w���.�������+���{��b���q��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�Saturday����Friday��Thursday����Wednesday���Tuesday�Monday��Sunday��December����November����October�September���August��July����June����May�April���March���February����January�TZ��%u.%u.%u.%u.in-addr.arpa����r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���!4��������!4��3��3��3��y5���������4�����(5��|7���������t7�����7��/8���������7�����68��:���������9��:��9��9��:��:��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE������PATH����I���������I��I��I��I��I��I��I��I��}N����� ���!N��@���VN��zO�����X���cO��b���HO��d���ZO��i���ZO��o���QO��p���cO��u���ZO��x���cO��SP����� ���DP��#���IP��+���?P��-���:P��0���NP��ES�����L���-Q��h���Q��l���"Q��KQ�����E���R��G���R��X���7R��b���7R��c���R��d���uR��e���R��f���R��g���R��i���uR��n���Q��o���7R��p���7R��r���%S��s���Q��u���7R��x���7R��(null)��cannot print floating point ����nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��d���������b��c��/etc/hostname.file��������������/32�Jan�Feb�Mar�Apr�May�Jun�Jul�Aug�Sep�Oct�Nov�Dec�SSSS��������������������������������������������������������B��������������� �� ��$ ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error���������x��`��T��8��$�������������������x��l��X��H��8��(�������������������x��h��\��L��8������������ �� �� �� �� �� �� �� �� �� ������|��h��\��D��(������������������t��`��C���GMT���������GDT������������������� �� �� �� ��U��������������� ��U��������������� ����������������`��T��L��D��@��8��0��(������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���j��D��4������x������1$T$Ll��D��su;SSSSu �� �� QRP#��0��Pf6�����U5p�� :��YPuh���h��Q��UuY=D��r j�MM��Y5��j6��YUu u8��YYEu h���YEUu8��YU Vu<���UƉUƹ���Uuuuh$���h��S����^U5H��YUUM UM JUVuM M NMNMN^UU MJMEUVuMNMNMNME^Uu uh��R�� ��UUJs UJP��uh���YYUVuJs Jk`��,���s���k�� Vh���sYY^U$��VWuU Uh���PVu?��=u #��֍V9s ��VYf#��#�� #����� ف��fV}Yf#��#�� #����� ف��fPh<��P��YY}�tBPYPh4��lP��YYPYPh,��QP��YY+U1��V9s ��VY#��#����� ʋ #����� ы#����� ʉVYf#��#�� #����� ف��f9s w��h$��jO��YYPbYPh ��OO��YYPqYPh��4O��YYs �� ��ǀ?�����V9s ��VYP#=��YPh��N��YY��V9s ��VqY#��#����� ʋ #����� ы#����� Rh ��dN��YY!��h���PVu<��=u ��Ph��N��YY���9w ���FSh���M��YY���B9s ���FPPh���M�� aV9s s���V(Yf#��#�� #����� Qh���NM��YYG���c��?*!9vGG +U_^UVWu } (��h��uh��L�� Ft|��t��Ph��L��YYVUs kE ��uhh��YYPhp��L��YYFt hd��L��YFt h`��nL��YFt h\��]L��YFt hX��LL��YF@t hT��;L��Yh��j J��YYfVf#��#�� #����� ىMfVf#��#�� #����� ىMfVf#��#�� #����� ىMfV f#��#�� #����� ىMV UE����}���U|�z���hL��uhP��AK�� U��PhD��)K��YY1}�PuuVEh��j I��YY}t&UUUUT׋xEf_^UD��VW1҉UUEĀ3U UU} s1}��UJMUfRf#��#�� #����� ىMЋUfRf#��#�� #����� ىMԋUfRf#��#�� #����� ىM؋UfR f#��#�� #����� ىM܋u E����}z��9uq��U|�[��h���PVuu8��E=2�����փ}���V9U��FPYEVY#��#����� ʋ #����� ы#����� ʉU9Uv1U+UЉẼ}���}���}������VUh���Puuu&7��E=V��EEh���Puuu6��E=%�����EE���9E ��uY#��#����� ʋ #����� ы#����� ʉU9UvUE���}�tKỦ#�� #����� ً#����� ʋ #����� QV3YYU9UsỦUE���VV3Yf#��#�� #����� كZ֋UTЉ׋E|}�u}�u }u }�tE1_^UVuu h��)��Yv>�tBd���6~�tF`������V+l��ډl��^U ��VW5`�����UH��+L��9V wVpYP{YX���VVh���PF$PRFP4��ǃt.uPZ9��YYuD>$PY9E u VY uo1_^UVWuV>�tBd���V~�tF`������Vl�� ��9l�����=d������d��J��d��fJd��Jtd�� H��+ L��9J w5d��UYP`Y닋d�� `�� `�� d��Jd��`��d��Rd������`��B����;=D��r@15`��tG6j�F��YP5l��u����PWh��D��_^U`��EUB����uYU0VW=\�����h ��EPG��YYhd��EP`G��YYh`��EPTA��YYDžu.=p��t =p��u =D��/��EPY ��=D��rEPhP��D��YYWjjh��C��5d��S��H��+L��9V 6��=D��r2H��+VFPRFPh(��C��vFPj V#�� #����� ً#����� ʋ #����� QEPYYNM��#Vf#��#�� #����� ف��QEPYYfVf#��#�� #����� ف��QEPIYYWj jEPOB��WvjFP=B��W uvW uW;��Y=uEPYEPD��Ye���=D��rh ��EPh��WB�� h ��EP.D��YYy25p��(��YPh ��EPh��h��@��EP'D��Y_^UVW=\�����h��h ��>��YYDžu&=p��u =D��R��h ��:YB��=D��rh ��h��A��YYWjjEP@��W ��jEPh��C�� ��Wj jEPl@��Ws�� j��EPYf#��#�� #����� ىMQj�YYƍEPY#��#����� ʋ #����� ы#����� ʉVMNFt h�����UVEP8Yf#��#�� #����� ف��fNWvjFPd?��Wu t V0Yf���j�uFPY FF =D��r2H��+VFPRFPh��?��uFPj VYpW tQW t5p��O&��Yl��Ph ��ht��h��>��=d���t5d��kYPvYW8��Y_^UVWjj�3YYƋUVU V UVp��?�tN 9J ?~7>�tr_^UVuu vVYYt"V >�tNJVY���1^UVWp��7t9U9Vu-~ �t'>�tzvj�v7 VYʼn_^UVWj�uA��YYE9usN>.u9usN>.uU)U9}u1AO?.uuVW1�� uU:.u���jh��W1�� u���_^UVt��A��f t��fU���E4t��fUffU fVUVfUf#��#�� #����� ف��^UVfUf#��#�� #����� ف��fMU t��)с�����~1E���E4t��Vu1&U ff UfNf VEfF�����^U EPu>��YYuE1UH��VW���3Uu ��Uh ��YEh ��YE��9Uu��9Uu 9����U��U��U��=D��rSf��f#��#�� #����� Q5��W*��YPh ��hPh,��;��P����L������������=\���+��j�G%��Yy%��ƅ��Vj2EPs>�� U#�� #����� ً#����� ʋ #����� щMh��6g.��YYu UP��h ��6L.��YYu UL��h��61.��YYu U ��h��6.��YY2��9Uu�� ��9=�������щ ��M ��-$��=�����j�h ��Z<��YYEy=p�����h �� Y���h$��Pu0<�� =$��u��9u҅y h ��Yu;��Y$�����PPjP~"��t���g���jEP<�� ��9Uu�� ��9t=��s�����щ ��M ��������_^U��VW=\���t1R��ƅƅfDž�DžD����fDž��fDž��HDžL�����PHPh��Vu(��ǃu1��ֺ��#U RV/YYh���VYYj h��u,�� uE��0Dž4(��Dž@0��0Uj�!��Y��E0u_+��YY���U)ESHSRV0'��ǃu1��֍UN9v1��h���VaYYh���VQYY5P��VVYYh���V0YYURj2Vu:�� D��Ej.0:��YYE����UMR<���UR4P:��YY�t(j.P8:��YYuP:��YYPu'*��YY ��U)PHPRVP&��ǃu1��֍UN 9v1��h���V'YYh���VYY5P��VYYU)ESHSRV0&��ǃu1`����!f#��#�� #����� ف��QFPYYD} �����EzE:%j��URMI ][E@�P$QRKQXShl��P6��Pu(��YY��U)PHPRVP%��ǃu1X��֍UN 9v1A��h� ��VYYh���VYY5P��VYYU)ESHSRV0$��ǃu1�����!f#��#�� #����� ف��QFPYYD L��E K��2��Eu��D�u1e��#Df#��#�� #����� ف��f)ыEQPu6�� ���_^.V��0V��1V��2V��3V��4V��5V��6V��7V��8V��9V��:V��;V��<V��=V��>V��?V��@V��AV��BV��CV��DV��EV��FV��GV��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������U��VW} ���uh��u&��YYt1��ƅƅfDž�fDž�fDž����#��f#��#�� #����� ف��fPDžT�����PPPh��Vu"��ǃu16��ֺ��#U RVwYYh���VgYYU)PPPRVu"��ǃu1��h���V#YYh���VYYj�VYYf��f#��#�� #����� Q5�� ��YPh ��h��FP&3��FP5��Y���Ǻ��!f#��#�� #����� ف��QFP_YYJE������U��9U���U)PPPRVh��N!��ǃu1���֍UN9v1���h���VYYh���VYYj�VYYh���VYYUj��PV3�� EUB15��U;)ыEQPu3�� ���_^U ��VWUJ{��UJ���h��} UU h���PWRu��E=5��}WYfEW Y=�����EPPYYƅtUVUVUVY`��UE����E���j�u u0 ������U Rj�YYƋUUVH��VF���#UfVU Vu uFPk2�� VV VqY=D��r h��v/��Y=���u%�����,��H��j�Rh$�� _^U} �u1������U ��VWuE U h���PWRVj��E=t6}׉UO9s EWlYEW_YEUVU}u3VVVʄ���VV VVʁ���V��}���u'u Vu荅Pt E Ud��}������u荅PYYYE���PUR���PV0�� VVU H��+JQuV }�t:U H��9J JUJh�����UJA��UfJuY���}���u'u Vu荅Prt E U���=���tPYt0VVVʄ���VV VVʃ���V:}�u0VVVʀ���VV VVʀ���V1,��#UfVVV UVUE ���_^U��VW=h���5��5d��tFtH��+L��9V wvuh��������VVVVh���PF$PRFP��E=��V$URYEDDDžH����PPDPh��WPv��E=d��}׺��#URWYYh���WYYD)щM����j�Rh���Y fDƅFƅG�fDžH�fDžJ��fDžL��fDžN������8f��f>fDž@����#UfB=D��rcf��f#��#�� #����� ً��Q4����YPh��*�� u썅DPj�{ ���UUR4P5��,�� y 5|��Y_^UVW} �t h�� ��Yh��h��5��h��=��ƉUuV=p��u } �u19��=p��u 5|��Y=D��r?5p��a��YP'Phx��)�� =D��rVPh`��)�� j�hh)�� s �����=D��rZf��f#��#�� #����� Q5��x��YPhT��()�� uh��j� 5��9Y��d������EPEPEPRLu ��� ��}�u���Ui���=$���~`19=��vV��9��uD=��=D��r ��4����YPh@��e(��YY$������h6/��mYG뢃=���t������h!0��LYuh��@YYw}�u ���L��fUf��U��fUf��=D����fUf#��#�� #����� Qu��YPh,��'�� �������t �����EPh��LYY�������f��f��f������#Uf��U���փ=D��6��f��f#��#�� #����� Q5��'��YPh ��&�� uh��j� ������� ����5��RQ f��������f��f��=���u%��������H��j�Rh!0�� =D��rOf��f#��#�� #����� ً��Q4��9��YPh��%�� Vh��5��'�� y 5|��fY���_^U���U������j�Rj� f�ƅ�ƅ�fDž�fDž��fDž��fDž ��ƅ �h��� PYYh���PYY=D��r)uY��YPh�� %��YYj�Pj� Uf��ffDž��fDž�j!P5��&�� y 5|��HYU} �u1���=D��rPh��y$��YY=$���y��$����$��J$��yHj�=L���u =���t,��H��Ph6/�� h.��'Y���H�����15����4��+Y���H��j�Rh6/��O ���U} �u1G=D��rPh��#��YY=���t=$���$��h6/��Y���U,X�����-T�����!D��D������ ��E9��Uh@��h��w!��YYj��YUDVWE����j�j@j�h��#��j�h��u��YYEuh��h��%!��YYj��YU��#Jf ����#Jf �����9u/��U :- ��Bu VZYÙ:-���z�������D�����U-0���= ���wj EPu�� D��눋Ù:�u9uuBu VZYUj�EPu�� %��f#��#�� #����� ف��f ��U9Ut:�twUȉU�\�����E���LEE�l��7��9ut*}�t-D�����j�D#��YH�� ��1��E���EP#��YE����j�EPj "�� Ew0��j�EPj"�� j�EPj"�� j�EPj "�� j�EPj "�� j�EPj"�� hx����Yx��u x��l��h`��q��Y|��u |��T��j5|�� "��YY��y 5|��YE� 3f��fUEPh@n@5��!�� =tEPhAn5��!�� =u 5|��Yj�!��YH��uY=\���u7hP��h ����YYEԅt^!��PhL��u�� u��Yj�hh)�� j�j�h.�� j�j�h6/�� =X�����=p���u h ����Yp�� H��9J %j5p��YY=p���uh����Yʋ=p��tj�WYYu?p��z ����=D��rPh����YYp��z t4R UE����UU=D��r6uYPh��q��YYE����=D��rh��j ��YYh��Q��Yuj�h���� y=p��t=p�� t h��Yj� ��YH��=T���T������EPhAn5���� =u 5|��gYuY$��h6/��YR=D��rj�{��YPh����YY1_^���U=<���t<��j��YUh��u���YY���UV58��Nx #��^U=<���t<��u��Y�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UV$��U9$��wU$�����9$��vp�� ���16VH��Yt1'$��rF����5$��&��Y5$�����^UVW}�u1���E����}������UUsp�� ���1���= ���u8j��Y=u1���V!փ5 ��5$��F����E����5(��O���VU}9}r69v2W9UvUW~>}�t E(��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=(��<���9}r79}u+UOJ}�t E(��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV�� u���Y_^U VWUUb���15(��t 9ur6E0tU U(��tU9ru NJEtU9Wu RWE_^��U}�x}~u��P<��YYUVux950����$��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+p��"���}�t}�y��� UU_^��U(VWU���cSct1���U���UE4��UlUE����U,UE����1���tTT9{���UF}���g���}�u1FSXE؋U 9Uu }�tE0}�tU؋E���2}4utE���tE@���uuGb1_^�U���U=,���t5,����Y,������L����U VW=,���u7=L���u1��h��5L����YY,��u L��������,��,��:�x,��X@ 5,����YE=t} t ��sF봃}u%5,����Y,������L������D��8�����= ���w>�tF>�t/>#t*��t"7= ���v>�tF>�t�F뺁��������unh��5��7��YYuX5,��N��Y,������L������5��6��Y=���~5��h0����YYL��0��]��Qh��5�����YY7��X��X��_^��UVW5t$����YO��DžD���7ur��YYtw>�t6uZ��YYt} �tu w >��YYu=t$���u��_^UVuEPV���YYtEp�����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E(��} �tF=#�� #����� ً#����� ʋ #����� ыE ���_^��UVuFPFPFPPh��h��{����^UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��� '���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��%��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U0��:$��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�UVWEE�PT��YNjE E �PB��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P��Y9uuąt9}���t��� t1_^��U$ ��9Ut*UUEPjj��� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^UU�UB�UVu {���95��tF9Et5��EFEFEFUVUVp�����395��tF9EtV p��FH��Z!��^Uuuj�u ujOUuuj�u uj2Uj�uuu ujUj��YU$VWu95��tU t>u�F�1P��}����j�8��YE]9p����� ��j�v��YEENI��EP��YE����EPEPj�� E+U9}v}W0��Yv��� ��Fp��V FvvP�� Fp��V RFvvP�� Fp��V 1F^vPS��� Fp��V F`����}�t!j����Yj�EPj?�� u���Y~u~ up�����1_^UUuUY��UVWuU VVu ��YYDžt~~�yVډp��F_^���U$UUEPjj� ��U$EPjj� U$UUU UUUEPj6j_ ��U$UUU UEPj%j�9 U$UUUUU UEPjj ��U$UUU UUUE�V��EPjGj� ���U} vp�����M ���E 1U} vp�����M ���ҋE!1UE�����1UE��1U} vp�����M ���Et���1��U$EPj j y}�tUEEU$UUUUU UEPjj ��UVW11}U9��u ������F߃| j���ug���YtUr ��YtURtUz�t rY}t��t}��t}��t uY_^�UVWuE����u41}%<���t4��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juvu �� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v �� =u N /uvv E����U9Uu1 N _^UV1}*<���t��B���t 4��aYF^��UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���YF~�uN NF ���1}9<���t,��R@t��B���t 4��}YGƒ~�uF ��FF ���VVv vv1 >�uNN FFSX_^UVWE����E����11<���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �|��+��U :�t! E���E E �����U uuu��YYEy@Ut8h��u)��YYE~"��� tu��Yuug��YYE}�y1]���jYEu u��Y1A���!uE�����UMJUzUB����U��E_^UUUuuu �� �UVu JxUʋFF Vu>��YY^�UVWu }E����?�t:JxG^FSX GVP��YY=uEE_^�UVWu}E����} �L���U9U@���U UJxFFSXVTYE=tGE MuE봋E_^��U VW}uE����} �O���U9UC���U UJxʋGG WP��YY=uEFMuE뱋E_^���UU Uh��uu �� ���UVWu} E����<��RO��}�t}@t}t ���~�tVt vyYft }�uEu(}t"}�tu4YDžu EN~����U VVVu F ���UV E_^��UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj�d��YYEUuu hu���������������������������� ��������6�������������������������*��USE] ���![]USE] ���![]USE] ���![]UVWu} Mr6 u.uAfA(_^]�UVW}u M���������������R��������UW}���0))ϊE tu1_]XG_]��������������2��������UVWM��E_^]����������R��������UUas U E���U=4���uh ��h ��9YY4�� 54����YU t$��U=4���t54��vY4������t$������UVW=4���u!h4 ��h8 ��YY4��u1D��54��h���h �� �� Eu1��U:#th0 ��u ��YYƅt�U$#��h, ��u���YYEt��EU: t: uEh( ��u���YYƅj�Fu��Y%��f#��#�� #����� ى ,#��50#��4#��(#��h$ ��VW���YYƅt�Ft8>�t3> t> uF#��s7h ��V���YYƅt�F����$#��_^UVW}Utu >�t]9uFG1_^�U$UUEPjj�S ��U$UUEPjj3 ��U$U UEPu��YYEPjj U$UUU UUUEPjj yEU(VuU @t*uY���EU UV֋RUUUEPu|��YYU UEPjjk ^�U$EPjj�Q U$uY���Eu uY���EUUU UEPj&j ��UHVuUVUVUV UVUЋU UEP���Y^UVuEPOYj�EPj�� V#��#��5#��h#��jKj� ^���U$uY���EUUU UEPjjH ���U$EPu* ��YYEPj j ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U H �� ��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E` �� ��uVuu ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu��YY=u}�t Uډ����E1!,'"���U �� ��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U �� ��JxUʋFF Vu.��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEЈ ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E ����E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VPp��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VP��YY=u}�t Uډ����JxUʋFF Vu��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP.��YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vu���YY=u˃}�t Uډ E_^���UVWu}M } �~/JxFFSXV:YE=t G} uȃ}uVt 9}u1 1�E_^�UVW}Wu up ƅ~9})׉U U 1_^UVWu }<��RO��~�y U��Vu C��V€tu ,��fN���V���~������u>5����Yt.h���PYFu NL���NHF ���9h���"YFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�vu =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u�� E`�UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVuj j�V ^�Uh ��h��VYYjY��UVu@Y���ƋU rU MJwU uRYY^U$EPuf���YY1ۅÉ�U$} �uE���E����UUE UEPjJj�q y}�tUEEUu hT$u UVWu1fϋV€t}u ~�tu>����F���tVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ<��tPXP���������nonamed: %s: %s ����malloc()����%02u:%02u:%02u��s*��hd��dd��ss��d���icc*����c*��d���d���d���ddlllll�d���d���d���d���i���c*��C_%u����HS��CHAOS���CS��IN��T_%u������c��������~��������>������������������������ %u� "%.*s"� %02X��� %s� %ld���� %s� %-5s��� %s� %5lu��� %-5s��� %8s����%-25s��� %s ��������%*s� PR� RA� RD� TC� AA�ERR_%lu� %s�query���reply���DNS %s:�����%*s�Assertion "qp != nil" failed, file "nonamed.c", line 440 ���ies�y���%u cached repl%s, %u bytes, sbrk(0) = %u ���nonamed: mv %s %s: %s ��mv %s %s ���Usage = %u, Age = %ld, Flags = %02X: ���Writing %s: ����w���.new����Corrupt�nonamed: %s: %s ����Usage = %u, Age = %ld, Flags = %02X: ���Reading %s: ����r���.in-addr.arpa.��.in-addr.arpa.��%nameserver�%nameserver�%memory�%memory�%stale��%stale��%ttl����%ttl����%s: I am nonamed %s at %s:%u ���Y�������������@��� ����%d.%d.%d.%d.in-addr.arpa����localhost���localhost.��localhost.��%nameserver�nonamed %s at %s:%u�version.bind����version.bind����Answer cached ��Refresh to %s:%u: ��To named %s:%u �%s:%u UDP ��To client %s:%u ����Current named = %s �%s:%u UDP ��%s: UDP read, %d bytes �%s: UDP read: %s ���Assertion "!expired" failed, file "nonamed.c", line 1318 ���PROBE %s ���%s: Find named �%s: Expect named ���0��������0��|0��0��0��0��0��0��0��0��0��0��0��0��0��|0��Usage: nonamed [-qs] [-d[level]] [-p port] �f2�����d���1��p���1��q���Z2��s���K2��sbrk(0) = %u ���fwait()� (expires %s) ��%s: I/O wait����Assertion "queue != nil" failed, file "nonamed.c", line 2106 ���Assertion "queue != nil" failed, file "nonamed.c", line 2101 ���%u �w���/dev/udp����UDP_DEVICE��/dev/tcp����TCP_DEVICE��nonamed: "domain": unknown service �domain��unknown error���/etc/hosts��include�r���A��������A��UA��nA��A��%d.%d.%d.%d�QC���������B������C��TE���������LE�����[E��F���������E�����F��H���������H��jH��H��J���������J��'J��HJ��iJ��3Q�����a��� Q��r���P��w��� Q��vQ�����+���WQ��b���MQ��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���\����� ���M\��@���\��]�����X���]��b���t]��d���]��i���]��o���}]��p���]��u���]��x���]��^����� ���p^��#���u^��+���k^��-���f^��0���z^��qa�����L���Y_��h���C_��l���N_��w_�����E��� a��G���`��X���c`��b���c`��c���`��d���`��e��� a��f��� a��g���`��i���`��n���_��o���c`��p���c`��r���Qa��s���`��u���c`��x���c`��(null)��cannot print floating point ����#��2.5�/etc/hosts��/usr/run/nonamed.pid����/usr/adm/nonamed.cache��/usr/adm/dhcp.cache�NND|���x���t���p���l���h���`���\���X���T���P���H���D���@���<���8���4���������������A�����NS����MD����MF����CNAME�SOA���MB����MG����MR����NULL��WKS���PTR���HINFO�MINFO�MX����TXT���AXFR��MAILB�MAILA�ANY���QD:�AN:�NS:�AR:�NOERROR��FORMERR��SERVFAIL�NXDOMAIN�NOTIMP���REFUSED�����@��������,��������������/etc/hosts��@��������������������P��SSSS��������������������������������������������������������B���������������t��������������������������������������������������������������������������x$��� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error��� �� �� �� �� �� �� ��x ��d ��T ��H ��$ �� ��� �� �� �� �� �� �� �� ��| ��h ��T ��@ ��, �� �� �� �� �� �� �� �� �� ��p ��\ ��H ��, �� ���������������������� ������������|��h��X��D��0��������������C�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���H�� ��L������������1$T$L�� ��su;SSSSu���� QRP�� ���P�����U`VW} }|}~7h���h��P%�� j��Yw��YEu4w5 ��YE=u.w7h���h��%��j]��Y URU}u:j�j�w�� E=0���s(w7h���h��$��j��YE���jh���Y&��YYEyh|���$��Yj��YE��EEPh"n8@u&�� ƅyhh���v$��Yj��YEPh#n8u%�� ƅyhT���I$��Yjz��YE����}���E��UMJE��UUB�UfB��j uj�%�� %��UfBuh��u}%�� ƅyhL���#��Yj���Y9ut4jyh<���hD���h��~#��Vh0���h��k#�� j���Yj�$��Yh��j���YYj$��Yh�@��h��u$�� ƅy=��uE}|wh���#��YYjS���Yyh��� #��Yj<���Ywh���#��YYj�%���Y_^U��UV5��Nx V��^U=���t��u $��Y�UVu~  u�����6EP��YE����U UEPEPV�� yE^��UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0Y ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+��"���}�t}�y��� UU_^��U8VWE���U UUUUfRf8W��8W�� 8W����� ىM؋UfRf8W��8W�� 8W����� ىME ��E��u }����}�`���uuVuu��Džy4W�����1��W΋U ��u"��Y���ljUUU)UVuVX ��YY���ZMԃ}�~DVuV9 ��YY���Z߃}�t&UBt 4W����� 4W�����1+��E4 ��E�����$ ��4 ��EȐ ��E�����0 �� ��E����M��9u��uuVuu��Dž��V ��YEV ��YEV ��Yǃ}u@ց} ��sUEEu ��Y���ljUUU)U]}�tE} u?uuVuu"��Džy +֋U �� ����}�u}t }�t&9=, ��t U9UtQ=, ��UŨ}u���1( ��}�u U ��uu��Y���ZЉE���E1UU��s-UEȉEWVR�� UUE;}�tE�����E����� �� 4W�����1_^U��VW}-0���= ������>����N>.���W��Y��=u4W�����1���= ��$ ��4 ��4 ������( �����, ����� ���� ������0 �� �� ��X-0���= ���r>.uF\h����PjjW��y1j��Pi _^U��VW}}t1���PGPGPGPh���PC��h���Pj jP$��Ey1HjuP ƅu1*UVU V  ���� ��������_^��UVuEPV���YYtE�����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAEY ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s Y ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E;��} �tF=<W�� <W����� ً<W����� ʋ <W����� ыE ���_^��UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U(��D:���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!@��?8��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#UX��r7��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VWHW��u��=u ���h����Pj�j�j�uu uj�R��$ƅ4W��������uuV�P��ƅy4W��������}Gu^fWf8W��8W�� 8W����� uL04W�����74W�����+4W�����4W�����Wp��5��_^UVWE����HW��u}��=u N��������4W�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u HW��€u$}����N>.���HW��������dX��?�q���uuuu 7u���E~���=��;u4W�����l���=4W��uE=4W��t =4W��uHW�����t놃}�t"uuuu j�u%���E~}�t 4W�����_^U��VW}} �uBW��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h��P��uuuu_^U��VWh����YEth��uN��YYEu1���E�uh���P~ �� ���>�tY ��uF>�n����uP. ��YYuFY ��u>�tDG?�tY ��uG1҈��h���Vh���� u ��Y�� u ��Y1_^���U@��VWE����E����E����UUЋUUE=���HW��u5��=u ��HW��u } ���~���1EUffUE����DW��9UY��E����LW��9U;��}���Dž����DW��U=���y2UMEPU\W��P4PW��w�� ��=����#U f8W��8W�� 8W����� ف��fMjEP5���� =���t$��U5��)��Y��^��u u5���� 9E t$��U5����Y����}fE�U܅t2EPW5���� ƅ~U)��fUU܅tB��U5��w��Y��}<��}���E���M��}ff8W��8W�� 8W����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5���� ƅ~U)��fUU܅t$��U5����Y�������UJÜJU+U��fUU܅V��U܁���v���E܉VP5��>�� ƅ��U)��fU멃=���y����y��U'��UMU\W��P4PW��u u5��(��9E ���M@W��Uԃ}�~ Eԙ=LW��Eԃ}�E���uuu5����E=u=�����E������E���UM9uHW�� u+UBt"5�� ��Y��E���}�tHW��t}�u HW�����u5�� ��Y��Ea���EE=���x5�� ��Y��}�u}�u ��;�����=��� Uȉ��_^U=��t5��? ��Y��U$VWh��P ��YDžu��jW ��YYƃu��E���E1��UUfU fUEPh0n@V �� E=u��EV ��YGE����EPh2n@V �� E=u��EVp ��Y E�����_^UVWuut.Vu u[ �� Dž U)U U )΋E_^U VWh��0 ��YDžu��jW ��YYƃuEE7��3EPh@n@V �� E=u ��UV ��YU��_^UVW���UR ��Yƅu�� ���w���UWfUfW fG ����#UfWuu FP �� ���URVu< �� E��UV%��Y}r UUU��E_^Uh��jYYj ��YUVW���UR ��YDžu�� ������h��jcYYEuz ��YE���URWu �� Ƌ��Uxw7~1Wg ��Yj�9 ��Yuj YYu$ ��YU��@RGPu �� W! ��Yj���YujYYu��Y_^��UVWEE�P ��YNjE E �Pr ��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P ��YNjE E �P ��Y9uuąt9}���t��� t1_^��U$UUU UUUEL(��EPjGj�<�� ���U} v�����M ���E 1U} vOV��QV��RV��SV��TV��UV��VV��WV��XV��YV��ZV��[V��\V��]V��^V�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������M ���ҋE!1UE�����1UE��1U} v�����M ���Et���1��UVW11}U9 ��u  ������F߃| j���ug���YtUr��YtURtUz�t r ��Y}��t}��t}��t u ��Y_^�UVWuE����u41}%< ���t4 ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv1�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv�� E����U9Uu1 N _^UV1}*< ���t ��B���t 4 ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h�����YF~�uN NF ���1}9< ���t, ��R@t ��B���t 4 ��YGƒ~�uF��FF ���VVv vvQ�� >�uNN FFSX_^UVWE����E����11< ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���#��U :�t! E���E E ����^#��U uuu��YYEy@Ut8h��uM��YYE~"��� tu��Yuu��YYE}�y1]���j ��YEu u��Y1A���!uE�����UMJUzUB����U ��E_^UUUuuu p�� �UVW5����YNj5��h��Yh��Y}�t.U:�t&uC��YPuV�� jh��V�� W��YPWV�� jh��V�� _^���UU Uh��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu@�� E���UJUx ]E� EPj���YYEUuu hu�� ����� ����� �����+ ����� ����� ����������UVWEu }10���ttOF����"���������FFF FF����s�����������������st#������ff��_^]���������� ��UVW}u M�����������������������UVWM��E_^]��������UVW��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UV��U9��wU�����9��v�� ���16V ��Yt1'��rF����5��&��Y5�����^UVW}�u1���E����}������UUs�� ���1���=���u8j ��Y=u1���V!փ5��5��F����E����5��O���VU}9}r69v2W9UvUW~>}�t E��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=��<���9}r79}u+UOJ}�t E��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���15��t 9ur6E0tU U��tU9ru NJEtU9Wu RWE_^��UVux95| ��,��p ��^UUas U E���U ��VWDž����Dž����@W�����DW�����HW����LW������dW���j�h|��*��YYu4W�����g����#Jfhp��Yƅth���VhdW�� hX��h\��8YYE(��uh���Po ���jhP��P�� _����u> t> uF>�t> th���VhdW�� j hdW��-��YYƅt�Dž����djhH��P`�� ����9> t> uF>�> h���VhdW��_ j hdW����YYƅt�dW��dX��7E����>�t3|X��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h<��Pk�� Q=LW��D> t> uF>�(> LW��PW��PVYYLW��ff U\W��LW��u Y=LW���u"PW����ff\W��LW�����=dW���u=h���P��YYu&j.P.��YYƅtFPhdW��X��YY�]���dX��dW��dW��E����>�t >.uEFdW��}|pX��sj.V��YYF7M���� HW��1_^���U<VW}$�t}( s ��j j�u$"�� }$bW��B��fbW��fbW��f8W��8W�� 8W����� ف��fG�G�UxO шOHW��t���1W ˆWHW��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf8W���8W�� 8W����� ف��fO}�`��}�V��m( učEPu(Vu#Ey 2��u֋U(+UU(Vj YYVu YYVj�YYVj�YYf8W���8W�� 8W����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVugYY}�tuuVO uf8W���8W�� 8W����� ف��fO ��E��+U$_^�U$UUEPjj�g��� y U\ ��1UVW5\ ��\ ��}׃}�~9r }�y 9vWYu_^���UVWuU VVu ��YYDžt~~�yVډ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$UUEPjjc ��U$U UEPu��YYEPjj5 U$UUU UUUEPj6j ��U$UUU UUUEPjj yEU(VuU @t*uJY���EU UV֋RUUUEPu��YYU UEPjjo ^�U$UUUUU UEPjjC ��UHVuUVUVUV UVUЋU UEP���Y^UVuEP'Yj�EPj�� V����5��h��jKj� ^���U$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U �� ��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E��F��uVuu+ ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U��U��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U(��u��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�EH��e ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }��r"��~�y U��Vu C��V€tu ,��fN���V���~������u>5��4��Yt.h���YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�vI =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����UW}���0))ϊE tu1_]XG_]��������������UVW!E_^]����������L$ ���������Uh8��h��rYYj¿Y��U Vj�hX�� YYƅyHu uV EVY}u"U JU�j uYYEt��1^���UVW5X��t��Y��DžD���7uJ��YYtw>�t6u2��YYt} �tu w ��YYu=X���uM��_^UVuY���ƋU rU MJwU uRYY^U$EPuf���YY1ۅÉ�U$} �uE���E����UUE UEPjJj� y}�tUEEUu hT$u UVWtu} u ~�tIu(_^]�����������U= ���uhl��hp��YY �� 5 ����YU X��U= ���t5 ��Y ������X������UVW= ���u!h��h��oYY ��u1D��5 ��h���h �� Eu1��U:#th��u ��YYƅt�U��h��u���YYEt��EU: t: uEh��u���YYƅj�Fu���Y%��f8W��8W�� 8W����� ى ��5�� ����h��VW���YYƅt�Ft8>�t3> t> uF��s7h��V���YYƅt�F������_^UVW}Utu >�t]9uFG1_^�Uj�j�u%��� E`�UVuj j�V ^�UVWu1fϋV€t}u ~�tu>����F���tVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ ��tPXP�����������������%s is alive ����read����no answer from %s ��result= %d �ping.c��%s %d:��write���ioctl (NWIOGIPOPT)��ioctl (NWIOSIPOPT)��open����/dev/ip�%s: length too small (%s) ��%s: unknown host (%s) ��Usage: %s hostname [-l length] [-t timeout] ����%u.%u.%u.%u.in-addr.arpa���� �������� ��9 ��R ��s �����������; ����� ���������������� �����������g��������������������t��h������%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��$�����a���$��r���$��w���$��%�����+���$��b���$�� ���: ��������unknown error���nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��P3���������Q1��2��7����� ���6��@���6��8�����X���8��b���7��d���7��i���7��o���7��p���8��u���7��x���8��8����� ���8��#���8��+���8��-���8��0���8��;�����L���9��h���9��l���9��9�����E���;��G���l;��X���:��b���:��c���S;��d���;��e���;��f���;��g���l;��i���;��n���;:��o���:��p���:��r���;��s���:��u���:��x���:��(null)��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�cannot print floating point ����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services�������������SSSS��������������������������������������������������������B������������������������������������������������������������������������������������������ ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������X��Unknown error���0��$������������������t��P��@��,�� ��������������������l��X��H��8�� ������������������t��X��D��` ��` ��` ��` ��` ��` ��` ��` ��` ��` ��0������������������p��\��D��0����������C�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ��� �� ���������J������1$T$L0�� ��su;SSSSu���� QRPL �� ���Pf�����U`VWE T ��E����E����E����E����h���u u�� E=��������}�t��E���}�t��\ ��U뫃}�u}�t��E���둃}�u}�ts��E���tu5T ��h���ht����j��YL���E|��U9<��t"��uUX ��}�t E+n(E(n(u h���T��Yƅu���j�V��YYE=u.54����YPV5T ��h���ht����j��YEPh!n u�� ǃu-54��<��YP5T ��h|���ht����j��YE����EPuu4�� ǃu-54����YP5T ��hX���ht��h��jO��Y���UԉUE����U9Ul���UUЍEPuu�� ǃu-54����YP5T ��h4���ht����j��Y=X ���uU9Uu EP��YEj���Y_^UhX��5 ��h`��[�� hL��5��hP��C�� h<��5��hD��+�� h,��5��h4���� h��5��h$���� h ��5 ��h���� h���5$��h���� h���h�����YYh�����YUVW ���xT=` �� ` ����� ً` ����� ʋ ` ����� 9M t!NVu"��YPhh��h ��M��u%u ��YPj/h ����YY���PR��YY ��_^UVuV���65 ��h���� v$��YP5��h���� v vYYP5��h���� vm��YP5��h��s�� v5��h��]�� v5 ��h��G�� v 5$��h��1�� Vt h|����YVt ht�� ��Yhp����Y^U5T ��h��ht��6�� j���Y�UV5(��Nx d ��^U=,���t,��u��Y�UVW��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVux95 ������^UVuFPFPFPPh��h, ����, ��^UVW=@��a���U9<��} <��M :-u<��z�u ��<��M hD��4��YYu<����<��M @��ǣ ��:tWuK��YYƅ}���=8���t=E ht��0��YYht��h,����YYht��Wy��YYht��j k��YY<��M @��@��:�u<��@�����?��� ��F>:���<��M @��C;�t!A <��M @��C\ �����<��U9<��|W=8���t=E ht��0���YYht��h�����YYht��W���YYht��j ���YY@�����?���`<��A <��M \ ��@�����7<��M @��@��:�u@�����<��\ ������_^���UUUuuu �� �UVu JxUʋFF Vu ��YY^�UVWu }E����?�t:JxG^FSX GVP ��YY=uEE_^�UU Uh\��uu�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj� ��YYEUuu hu��������������������UW}���0))ϊE tu1_]XG_]��������������* ��������UVWE ��E_^]����������U$UUEPjj�_�� ��U$UUU UUUEPj6j3�� ��U(VuU @t*u ��Y���EU UV֋RUUUEPu��YYU UEPjj�� ^�UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ��/��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E��j��uVuu+ ��ƀ}Xu9utUP ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U���y��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U0����JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P ��E6U U RU U RUEE�EP�� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u,�� ƅ~9})׉U U 1_^UVWu },����~�y U��Vu C��V€tu ,��fN���V���~����\��u>5`�� ��Yt.h��� ��YFu NL���NHF ���9h�����YFuN!NF ���V@u��VVVh���U����F���t$jj�v�� =uN ?��jEPv�� =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v�� =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v�� =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }�����������������UVD ��U9D ��wUD �����9D ��v4�� ���16V��Yt1'D ��rF����5D ��&��Y5D �����^UVW}�u1���E����}������UUs4�� ���1���=@ ���u8j��Y=u1���V!փ5@ ��5D ��F����E����5H ��O���VU}9}r69v2W9UvUW~>}�t EH ��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=H ��<���9}r79}u+UOJ}�t EH ��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuVx�� u���Y_^U VWUUb���15H ��t 9ur6E0tU UH ��tU9ru NJEtU9Wu RWE_^��UUas U E���Uh��ht��:YYj"Y��U$� ��9Ut*UUEPjj���� y U� ��1UVW5� ��� ��}׃}�~9r }�y 9vWYu_^UVu Y���ƋU rU MJwU uRmYY^UVWuU VVu��YYDžt~~�yVډ4��F_^���U$EPuF���YY1ۅÉ�U$UUU UUUEPjjw yEUu hT$u U$UUUUU UEPjj' ��UVWuE����u41}%<���t4��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v^ =u N /uvv E����U9Uu1 N _^UV1}*<���t��B���t 4��aYF^��USE] ���![]USE] ���![]USE] ���![]UW}0ʀuA)_]�����UVW}u M#����������������UVW}u M)9r/r uu fE_^]t|�������������KI|;u[u ���P���������������1ۇ ��tPXP����������������������?������I������a������i������o������%s: unable to NWIOGIPxROUTE: %s ����%s: unable to NWIOGIPxROUTE: %s ����%s: unable to NWIOIPGCONF: %s ��%s: unable to open %s: %s ��/dev/ip�fV��hV��iV��jV��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IP_DEVICE���%s: getopt failed: '%c' ����?aI:io�� ���flags���%s��mtu�%*s ����pref����%*s ����dist����%*s ����gateway�%*s ����dest����%*s ����if��%*s ����ent #���%*s ����%s/%-2d� ��� dead��� static�%*lu����%*ld����%*lu ���%*s ����%*s ����%*s ����%*lu ���Usage: %s [-i|-o] [ -a ] [ -I <ip-device> ] ����unknown error���%d.%d.%d.%d�: option requires an argument -- ���: illegal option -- ����--��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�Y ����� ��� ��@���2 ��V �����X���? ��b���$ ��d���6 ��i���6 ��o���- ��p���? ��u���6 ��x���? ��/����� ��� ��#���%��+�����-�����0���*��!�����L��� ��h�����l�����'�����E�����G�����X�����b�����c�����d���Q��e�����f�����g�����i���Q��n���w��o�����p�����r�����s�����u�����x�����(null)��cannot print floating point ����P �������������������������������SSSS�����������������������������������������������������������������B���������������D��\��t����������������������������������������������������������������������Unknown error�������p��`��H��<�� �� ����������������p��`��T��@��0�� ������������������x��`��P��D��4�� ������������������������������������d��P��D��,������������������p��\��H��C������ �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ����*�� ��D������`O�����1$T$L�� ��su;SSSSu���� QRPN����P �����UVUuUu���B195N��v3kN��8�t%kN��@9EukN�����FŸ���^UN��Ui���N�����UVWu~Hz��u H������vHYE~ St���D���~H�u8Vt <���m���Vt 4���[���F���N���,���G~HuAVڃu$���0Vڃu���Vڃu���VR%YuWh ���hJ����J��_^Uuh���h$ ���� hL���h$ �� ��YYj5 ��YU���VW��EE����E����E����h��j .��YY���9uf���U U:-uEU:�tJ5E������UUE���E���΋E 0 ��YEE����'��Fj�hx��p��YYN��=u hl�� ��Yj�h`��K��YYN��=u hT����Y) ��=u h@����YlPhm5N���� =u h ����YlN��nN��N��i���Pj ��YN��iN��l��ST ��YN��N��R? ��YN��=N���t=N���t =N���u h����YN��N��i���P5N��pj�5N����N��N��i���9t h����YiN��l��iN�����N��P5N��t���5N��B��iN��l��9t h��v��YN�� N��Ai���N��R5N��x���5N����N��9t h��!��Y���95N��~-N��i���N��h�����P��YYtFˉ5N��}�tL��4��Ph�� ��YYN��ډ95N����EPV��YY=��}�uE9Et E9E��}�uE<��}�uVh,��^P�� uh(��^P�� UU<���Йǁ��s$1R1Ph��IPa��Y@~�s1<���1lj1R1Ph��IP(�� ��1Ph��IP�� }����95N��}}�u VtYE]PIPSYUPt EPhY���UU+UÚ���P���1]UPuu^PSRuh���K��0B95N��}}�u VYE]PIPSjYP^Ph�����F�1_^U VWUMRX+Q8QDUU]+ZD+Y,ۉ߁�@��~�@��}j�u5N���� uh ��5N���� 9Et1r���E ��EUUMR+QXׅx9}}1E��� ��EE����uE ��9v>�uEU9U} F9uu1�E_^UVWu }N��UN��99=N�� B��iE���N������u!il��N��<��u ��iE���N��PtV9=N��&N��fRbfN��BvF f��F����9=N�����il��N��fP8fVil��N��fP:fVil��N��P(VN��il��i@4l��‹R(V il��N��P,Vil��N��<��V&F����F ����1fVfVF����F����9=N�����il��N��<��t F Z���il��N��<��€t F Tk���iE���N��xt�uF RRil��N��<�� ��uN��ztuF S#F WiE���N��xt�uF RF WiE���N����� V$iE���N����� V(iE���N����� V,iE���N��Px V0iE���N����� V4iE���N����� V8iE���N��P| V<iE���N����� V@iE���N����� VDiE���N�����VHiE���N�����VLiE���N�����VPil��N��@��VX~ Zu FT��9=N��} VYFT1_^UU Uj�Ru �� uuu �� Uuh��h$ ��4 �� j_��YU=���uuh��h$ �� �� "5����YPuh��h$ �� ��j��YU VW1��Dž���h��h ��x ��YY7h ��J ��YYEPh �� ��YY=tU���� ��u95N��w0VN��kP5N��5��YYN��u h��YkN��fUfPkN��7P ��YYFG��95N��vBj�5N��VZkZYfJ1_^��UV5��Nx N��^U=���t��u ��Y�UVJ��U9J��wUJ�����9J��v�� ���16VP��Yt1'J��rF����5J��&��Y5J�����^UVW}�u1���E����}������UUs�� ���1���=J���u8j��Y=u1���V!փ5J��5J��F����E����5J��O���VU}9}r69v2W9UvUW~>}�t EJ��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=J��<���9}r79}u+UOJ}�t EJ��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV�� u���Y_^U VWUUb���15J��t 9ur6E0tU UJ��tU9ru NJEtU9Wu RWE_^��UVu~  u�����6EP��YE����U UEPEPVb�� yE^��UVux95 ���� ��^U$ ��9Ut*UUEPjj��� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^U=���x 5��y��Y��������U=���xj�h����YY��y'j5��F��YY ���Pj5��1�� 1UN��L��N��M��=���u/h���hJ��5���� ��1VN��J��=N��M��u1< ��N��N��N��N��= ���uN��L�����U} t} u���1UVN��PYtN��}�uN��:#u1b���5N��N��UN��:�u1DN��: t(}�t :"u*N��N���P_YtU�>�u1^UVN��UN��P'YtN��N��:"uRN��jYƅt(>"t#=N��pN��u1{���N��N��0ʋN��:"u;N���0j�Yƅu1C=N��pN��u13N��N��0=N��pN��u1N��N�������E^U=���y _y1Du17j�RYpN��tj�AYtN��xN��|N��pN��UVƅtu6��YYu^�UVWuU VVu��YYDžt~~�yVډ��F_^���U$UUEPjj ��U(VuE����E����V֋RUV֋RU ��E '��UUU UEPj7jB ^U(VuU @t*uF��Y���EU UV֋RUUUEPu(��YYU UEPjj ^�U$UUUUU UEPjj ��U$UUU UUUE(��EPjGj� ���U} v�����M ���E 1U} v�����M ���ҋE!1UE�����1UE��1U} v�����M ���Et���1��UUUuuu |�� �UU Uh ��uuZ�� ���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj�( ��YYEUuu hu��#�����;�����O�����s�����W�������������USE] ���![]USE] ���![]USE] ���![]UVW}u Mg ��������������� �������� ��������UVW ��E_^]���������� ��������UVuY���ƋU rU MJwU uRYY^U$UUEPjj�w ��U$EPjj�] �U$UUU UUUEPj6j/ ��U$UUU UUUEPjj yEUHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj �� VN��N��5N��hN��jKj�m ^���U$uzY���EUUU UEPjj4 ���UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U \��'��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���Et��b ��uVuu+ ��ƀ}Xu9utUPg ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U��q ��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U�� ��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEМ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P�rV��tV��uV��vV��wV��xV��yV���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E6U U RU U RUEE�E �� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u�� ƅ~9})׉U U 1_^UVWu }��:)��~�y U��Vu C��V€tu ,��fN���V���~���� ��u>5 ����Yt.h���,YFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�vf =uN ?��jEPv`�� =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vW =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UUas U E���Uh��h$ ��YYjY��U$EPuf���YY1ۅÉ�U$} �uE���E����UUE UEPjJj�A y}�tUEEUu hT$u U$UUUUU UEPjj ��UVWuE����u41}%<< ���t4< ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v =u N /uvv E����U9Uu1 N _^UV1}*<< ���t< ��B���t 4< ��aYF^��+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P������������?���1ۇ ��tPXP�����������������?���co��(%s) %s�flock���popen���pipe����ssusp���wait����pause���?���ANY�Was ps recompiled since the last kernel change? ����Ooops, got signal %d ���q�����a���I��e���R��f���_��l���_��x���h��%5s %3s %s %s ������%3o %c %3d %5s %5d %5d %4d %10s %3s %s %s ��%4luh���%2luh%02lu��%2lu:%02lu��%d��(%d)���� PID TTY TIME CMD ���� F S UID PID PPID PGRP SZ RECV TTY TIME CMD ��%s��INIT����Can't get fs proc table from /dev/mem���Can't get mm proc table from /dev/mem���Can't get kernel proc table from /dev/kmem��Out of memory���can't get PS info from kernel���Can't get tty names�/dev/mem����/dev/mem����/dev/kmem���/dev/kmem���<defunct>���Usage: %s [-][alx] �ps: %s: %s �ps: %s �Out of memory���unknown error���M���������&��M��&��M��&��3��3��3��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�A����� �����@�����>�����X���'��b��� ��d�����i�����o�����p���'��u�����x���'������� �����#��� ��+�����-�����0����� �����L�����h�����l����������E�����G�����X�����b�����c���w��d���9��e�����f�����g�����i���9��n���_��o�����p�����r�����s�����u�����x�����(null)��cannot print floating point ����N��/dev/�����������SSSS����/etc/ttytab���������������������������������������������������������B����������������� ��$ ����������������������������������������������������������������������`O��Unknown error���T��H��,������������������t��d��P��D��,��������������������|��l��\��D��4���� ���������������|��h�� �� �� �� �� �� �� �� �� �� ��T��<�� �� �����������������h��T��<��,������C�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���o����\������������1$T$L����su;SSSSu���� QRP"�� ���P�����U0��VWu }h��h ��h��YYuh���h��.��YYj��YR#��/��#��P%��Y#��uh���h��-��YYjD��YO���:-���:����y���#��#��#������#����� ��OVWU��YY5"����Y�#�����OVW ��YY5"����Y|��j��Yw����m��OH=�#���tj-��Yjh���-.��YY} ,��jW��Y"��~ #�����=#���t������P=#���t������P=#���t������Ph���P},��h ��j ��YYJ4+��YE����EU:�uE���Jj@43.��YYEt:��EJU:�u #��U-u��Yu j\��YJU#��UE����J9U$��U4��YE�����EU:�uE���Uj@4-��YYEc���E��UU:�u #��Uu@��Y���uuuuPuuh���P+��$/UuuuuP4hp���P*�� P'��Y���="��l���uPhd���P*��UU#��j�Pu25#��EP!��"��yj��Y��yj��YURj*��YYEs=#���tJ4��YE����J9Uy��U4��YEb���J]44=#���tH���D���P=#���tP���L���PhT���P)��P��Y���U�EU:�uE@���Uj@4z+��YYEt5E��UU:�u #��U(u4��Yu���UU#��UuPh4���P)��#��j�Pu25#��EP��"��y"��&DPj��YY5"��)��Y"��E{5"����Y_^U EPu)��YYxU����@��t/"�����5"��T��YPuh(�� �� j��YUVu>�t>:u>/u1F1^UVWuǀ���u*��u0 r _t-u F>�uи���uh8��h��'�� 1_^U VW(��Eu$j�uhT��hX��h\��(��jE(��Yjj��YYjj��YYƍEP(��YE9Et}u}uEWj��YYVj��YYE_^U@��VWE����U9UH��UЋM <j�W#(��YYƅy 5"����YPWh�� �� ��EPV'��YYy<!=#���tV'��YEPW��YY��Vr'��YWh��> ��YY��U܁���d��f��j/W(��YYEu}E=#���tRuuh��P0&��P(��YPP5"��'�� >��y V&��Y1��U܁��uuRh��P%��P8(��YPP5"��('�� ��y V~&��Y���h���Vh�� �� Eԅu VX&��Y���E����E����U9U^���EԋUU9Us U+UUă}�uUurVj&�� 9EtE���Uur5"��&�� EԋUV%��Y}�ujh��5"��S&�� Wh|�� ��YY��E_^U��VW}W%��YEu 5"����YPWh4��< �� ��j/W'��YYEu}E=#���tZU M rqh$��P=$��P&��YPP5"��%�� K��yu$��Y5��U J��uj�Qh��P#��PA&��YPP5"��1%�� ���yu$��Y���u$��Yƅ���th��FP%��YYth ��FP%��YYtW%��Y���PFP%��YZ=��rFPWh���� 뉍FPWh��P#��PjYYOu#��Yjh��5"��K$�� ���_^U��VjEP5"��#�� =������j����Y���1���MFjEP5"��#�� =���tj�i���YMFU9s} uʃ=�#���u)QPj#�� "��}ujv��YED��Hb��^U=�#���uh\��h��!��YYj<��YUt��VWE����j�#��YEDž����=#���u u"��Y}th��;��Yj��YE U=#���t uYjh��5"��"�� EPu"��YYuU����@��uE���E���jV5"��E"�� 3��F< u �� ��jV5"��"�� =���t ����F< u�t uD=�#���uP #��YPPj!�� uj��Y"����N�>Eujh��5"��!�� w��>T1��FDž����-0���= ���sF-0���k É׊F< t ����Dž����-0���= ���sF-0���k É׊F< t ����Dž����-0���= ���sF-0���k É׊F< t x����Dž����-0���= ���sF-0���k É׊Ft \��B��jhX��5"�� �� ��>Ct*>Dt%}�tVhT����YYjM��Y<����FE����9s4=0���| =7���~ 0����-0���U ‰UFŠF< t ����E����-0���= ���sF-0���k] É]݊F< t ��g��}�t/UV:�t����Puh���P��uPS ��YYEPPE��YY1ۅÉ]؀D���}�t=U����@��t"��������=#���t,uPm��YYuP��YY���UEPjYY�m��Dž����PP��YYF��5"��'��YPPh���� ��uP��YYEy&5"����YPPh���� ��}�t=#���tuP��YYjh��5"���� h���uh���� EȅuuQ��Y��UȋrE����E����E����U9U������UU9Us U+UŰUUuV5"��V�� Eujr��YU+UỦuփ}�ɋEȋU9u/}�uUuruE�� 9EtEE����UȋrE���Y}�t"}�uUuru�� 9EtEuY��Y�tDDž����PP��YYy!5"��@��YPPh����� }�t#5"����YPPh����� jh��5"��c�� E����Wht�����YYj5��Y_^U VWuEPu ��YYy5"����YPh ��G���YY1=1u}9>}.~�t v��YWt��YF~�uh�� ���Y1>_^U��V�U "��FuV�� �P{��YP�P5"��k�� =�#���uPO��YPPjC�� ^Uh0��h����YY���UV5��Nx  #��^U=���t��u<��Y�UV��U9��wU�����9��v"�� ���16V0��Yt1'��rF����5��&��Y5�����^UVW}�u1���E����}������UUs"�� ���1���=���u8j ��Y=u1���V!փ5��5��F����E����5��O���VU}9}r69v2W9UvUW~>}�t E��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=��<���9}r79}u+UOJ}�t E��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV�� u���Y_^U VWUUb���15��t 9ur6E0tU U��tU9ru NJEtU9Wu RWE_^��UVu~  u"�����6EPF��YE����U UEPEPV�� yE^��UVux95|��d��p��^UVW5#�� ��Y!��DžD���7u��YYtw>�t6u��YYt} �tu w ��YYu=#���uy ��_^U@VWE��uCL��Ef��������#M с��f ��}�����|h(����YEuE��E0��YEu!]3h��h���� ��EEE�����J��f�������} f��ju��YYDžy'5"��[YPuh��h��#��7��E!��f��f#��#�� #����� ف��fM��#U fUURUEPh0n@W�� ƅy9="��:u W��Y���5"��YPh��h��{�� ��E���EPh0n@W�� ƅy$5"��mYPh��h��8�� L��E����EPh2n@WZ�� ƅy="�� ujq��Yy ="�� tʅy-="��:t$5"��YPh��h���� ��y M}�0}�uht��h����YY��}�u?jhp��W�� =���/��5"��YPh\��h��S�� g��ju��YYEy'5"��QYPuhD��h����-��E"��f��f#��#�� #����� ف��fMEPh0n@u�� ƅy$5"��YPh ��h���� ����EЅy$5"��YPh ��h��m�� ��}����j�D��Yj�j YYj1��YE����EPh3n@uh�� ƅy="�� uj��Yy ="�� tȅy0="��:t'5"�� YPh��h���� j[Yx j�OYjEYj ��Y��Ph��EP�� EP!��Y���PEPW�� PEP��Y���Z9t$5"��}YPh��h��H�� \��u��Y���PuW�� u��Y���PuW�� u��Y���PuW�� jEPWC�� =���t$5"��YPh��h���� ���}�t5jEPW�� =������jEPj �� } u���}����UEEPh1nu�� ƅy!5"��gYPh��h��2�� IfUf#��#�� #����� ف���|ht��h����YYxW��Y}�x u��Y_^U8��VWDžV��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Džu>�tF>.uu +UFG-A���=���s FPj��YFG�} �t1hD��hH�� ��YYE}�t;uuPu��uu��Y1���u}��Y���=���u } ����Dž����u��Yu ���rP��YYh8��P��YYh4��P ��YYEu]UPrp��YYu0tB9uu��Y_^U��VWuh���P �� ���> t2> t-> t(>�t#-A���=���s P��YFɀ> t> u*�F> t> uF> t> t> t >�tF�uPu 7��� N?�tEPu��YY/1_^UVW} }uWu]��YY1ۅÉ ��uWu�� t1���Wu*��YYu ������U:�t1���=���t1���=������h��h����YY=u�����1������j.h��0 ��YY��u�����1T����ր>�t-A���=���s P��YF݋UUR5��N ��YY1ۅÉ_^���U$UUEPjj��� y U\��1UVW5\��\��}׃}�~9r }�y 9vWYu_^���U=���x 5����Y��������U=���x=���u ����j�5����YY��y'j5����YY ���Pj5��}�� 1U^U��U����=���u/h���h��5���� ��1V����=����u1< ����������= ���u�������U��U��U��:�u1��: t ��::uҋU�EUV=���yy1���u1�����tx��tjƅtj�j�V �� f��Lƅtj�j�V �� ��/��t!��y��g��:�X��^UV%ƅt F9Eu^UV{ƅtu6" ��YYu[^��UVWuU VVue ��YYDžt~~�yVډ"��F_^���U$UUEPjj ��U(VuE����E����V֋RUV֋RU \��E wG��UUU UEPj7jB ^U(VuU @t*ub ��Y���EU UV֋RUUUEPuT(��YYU UEPjj ^�U$UUUUU UEPjj ��U$UUU UUUE40��EPjGj� ���U} v"�����M ���E 1U} v"�����M ���ҋE!1UE�����1UE��1U} v"�����M ���Et���1��UVW11}U9 ��u  ������F߃| j���ug���YtUrYtURtUz�t r6Y}��t}��t}��t uY_^�UVWuE����u41}%< ���t4 ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv)�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v.)�� =u N /uvv-�� E����U9Uu1 N _^UV1}*< ���t ��B���t 4 ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���[YF~�uN NF ���1}9< ���t, ��R@t ��B���t 4 ��YGƒ~�uF��FF ���VVv vv% >�uNN FFSX_^UVWE����E����11< ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���A��U :�t! E���E E ���fA��U uuuYYEy@Ut8h��u1#��YYE~"��� tuYuuYYE}�y1]���jYEu uY1A���!uE�����UMJUzUB����U ��E_^UUUuuu `,�� �UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu+�� E���UJUx ]E� EPj�02��YYEUuu hu��!�����!�����3!��������O!�����!�����!�����#�����#�����#�����$�����$�����w$��������$��������%�����'�����'�����(�����/(�����(�����(�����z&��USE] ���![]USE] ���![]USE] ���![];��������������UVW}u M+4���������������^4��������UW}���0))ϊE tu1_]XG_]��������������>4��������UVWY4��E_^]����������^4��������L$ 3���������UW}0OE uG_]1_]��������UVW��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+"��"���}�t}�y��� UU_^��UUAs UE���U8VWE���U UUUUfRf#��#�� #����� ىM؋UfRf#��#�� #����� ىME ��E��u }����}�`���uuVuu[ ��Džy#�����1��W΋U��u{Y���ljUUU)UVuV ��YY���ZMԃ}�~DVuV ��YY���Z߃}�t&UBt #����� #�����1+��E��E���������E��E���������E����M��9u��uuVuuK��Dž��VA ��YEV4 ��YEV' ��Yǃ}u@ց}��sUEEu=Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U������}�u}t }�t&9=��t U9UtQ=��UŨ}u���1��}�u U��uuXY���ZЉE���E1UU!��s-UEȉEWVRw UUE;}�tE�����E������� #�����1_^U��VW}-0���= ������>����N>.���W��Y$��=u#�����1���=������������������������$��������������X-0���= ���r>.uF\h����PjjWV ��y1j��Pi _^U��VW}}t1���PGPGPGPh ��Ph���Pj jP ��Ey1HjuP ƅu1*UVU V ��$��������$��_^��U Vj�h4 ��YYƅyHu uV EV>Y}u"U JU�j u@YYEt��1^���U=���uhH ��hL ��uYY�� 5��*��YU #��U=���t5��FY������#������UVW=���u!hp ��ht ��YY��u1D��5��h���h(��8 Eu1��U:#thl ��u ��YYƅt�U,!��hh ��u���YYEt��EU: t: uEhd ��u���YYƅj�Fu+��Y%��f#��#�� #����� ى 4!��58!��<!��0!��h` ��VW���YYƅt�Ft8>�t3> t> uF!��s7h\ ��V���YYƅt�F����,!��_^UVW}Utu >�t]9uFG1_^�UVuEPV���YYtE"�����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E1��} �tF=#�� #����� ً#����� ʋ #����� ыE ���_^��UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U ��@0���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���! ��;.��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U ��n-��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW#��u#��=u ���h����Pj�j�j�uu uj�z'��$ƅ#��������uuV�P��ƅy#��������}Gu^fWf#��#�� #����� uL0#�����7#�����+#�����#�����W ��+��_^UVWE����#��u"��=u N��"������#�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u #��€u$}����N>.���#��������$��?�q���uuuu 7u���E~���="��;u#�����l���=#��uE=#��t =#��u#�����t놃}�t"uuuu j�u%���E~}�t #�����_^U��VW}} �uBWY-���Ɖ:.u#��sVWP- Ƅ5�*"u h���Wh���h ��P%uuuu_^U��VWh ��YEth ��uBYYEu1���E�uh���Pr ���>�t��uF>�n����uP. ��YYuF��u>�tDG?�t��uG1҈"��h���Vh!��%�� uY!�� u~Y1_^���U@��VWE����E����E����UUЋUUE=���#��u]��=u ��#��u } ���~���1EUffUE����#��9UY��E����#��9U;��}���Dž����#��U=���y2UMEPU#��P4#��w�� ��=����#U f#��#�� #����� ف��fMjEP5���� =���t$"��U5��uY��^��u u5���� 9E t$"��U5��2Y����}fE�U܅t2EPW5��` ƅ~U)��fUU܅tB"��U5��Y��}<��}���E���M��}ff#��#�� #����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5�� ƅ~U)��fUU܅t$"��U5��Y�������UJÜJU+U��fUU܅V��U܁���v���E܉VP5�� ƅ��U)��fU멃=���y����y"��U'��UMU#��P4#��u u5��(��9E ���M#��Uԃ}�~ Eԙ=#��Eԃ}�E���uuu5����E=u="�����E������E���UM9u#�� u+UBt"5��_Y��E���}�t#��t}�u #�����u5��Y��Ea���EE=���x5��Y��}�u}�u "��;���"��=��� Uȉ"��_^U=��t5��Y��U$VWh4 ��PYDžu( ��jWYYƃu"��E���E1��UUfU fUEPh0n@VV E=u"��EVYGE����EPh2n@V E=u"��EVY E�����_^UVWuut.Vu u Dž U)U U )΋E_^U VWhL ��0YDžu@ ��jWYYƃuEE7��3EPh@n@VR E=u "��UVYU"��_^UVW���URYƅu"�� ���w���UWfUfW fG ����#UfWuu FPq ���URVu� E"��UVY}r UUU"��E_^UhaN��jYYj YUVW���UR-YDžu"�� ������haN��jYYEuYE���URWu Ƌ"��Uxw7~1WYj�}YujBYYuhYU"��@RGPu L WYj�7YujYYu"Y_^��UVWEE�P��YNjE E �Pz��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P��Y9uuąt9}���t��� t1_^��UVuY���ƋU rU MJwU uRYY^U$UUEPjj�K ��U$UUEPjj�+ ��U$U UEPulYYEPjj U}�u"�� ���UEuYuY��U$U UEPuYYEPjj U��2E Pu��� ULVWE����1E����E����U UE8�t+0Y���E9uvE���EEE͋UUE8�t(0GY���E9uvE���EEЃ E V!փ}�u s"�����K��VYE=u"�����&��UEUUU}׋U UE8�t=+UEEE0Y���E܋]P3W }׃E뻋E�����EUUE8�t=+UEEE0:Y���E܋]P3W }׃E뻋E�����EU9v�GuY���EuUUȋUUE����E����EPj;j�~ RyY_^���U$EPjj�Q U$UUU UEPjj- U$EPjj� U$EPjj� �U$UUU UUUEPj6j ��U$UUU UUUEPjj yEU$uY���EU UUUEPj'j` ���U0VWEPuP��YYy1���U؁����@��t"�����1���h���uYYDžy1���EPWYYxS"�����U؁����@��u7jW(YYEx& ���PjW xh$��sYƅu"��UWYUЉ"��1FfF��F����_^�UVWuu"�� ���1���FQh���^ SPM fF^1���FfFV VF=uFF~�u~. ��VffGVjRGPT G�WBVVFWB)ډfFWBV4_^�UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj�� V"��"��5"��h"��jKj� ^���UU$VWEPz ��YEPEPj�r �� j�LYƋ}t9uvEW��EP7 ��YE����EPEPj �� W YUUjEP ��YYEP ��YWj�YZ)‰j�EPj �� j�EPj �� t9r)օu j ��YVYU)_^�U$u&Y���EUUU UEPjj ���U$UUEPj<j %���U$} �uE����uY���E"E UU RUuY���EUUEPjj= U$EPjj�% y}�tUEEU$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U X ��#��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���Ep ��^��uVuu+ ��ƀ}Xu9utUP ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U ��m��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U ����JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuEИ ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E ��}��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }��:+��~�y U��Vu C��V€tu ,��fN���V���~������u>5��H ��Yt.h���蠳YFu NL���NHF ���9h���rYFuN!NF ���V@u��VVVh���U����F���t$jj�vr =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vc =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u �� E`�������7���?��������G �����UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVWME_^]��������UVuj j�V ^�U}�x}~uPl��YYUUas U E���Uh ��h��RYYj֮Y��U ��VWDž����Dž����#�����#�����#����#������#���j�h���2YYu#�����g����#Jfh ��Yƅth���Vh#�� h ��h ��YYE(��uh���P; ���jh ��P _����u> t> uF>�t> th���Vh#�� j h#��YYƅt�Dž����djh ��Pd ����9> t> uF>�> h���Vh#�� j h#��YYƅt�#��$��7E����>�t3$��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h ��Po Q=#��D> t> uF>�(> #��#��PVYY#��ff U#��#��uؿY=#���u"#����ff#��#�����=#���u=h���PYYu&j.PYYƅtFPh#��LYY�]���$��#��#��E����>�t >.uEF#��}|$��sj.VYYF7M���� #��1_^���U<VW}$�t}( s ��j j�u$R�� }$#��B��f#��f#��f#��#�� #����� ف��fG�G�UxO шO#��t���1W ˆW#��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVu~YYf#���#�� #����� ف��fO}�`��}�V��m( učEPu(VuEy 2��u֋U(+UU(Vj YYVuYYVj�YYVj�YYf#���#�� #����� ف��fO ��� ���U9U(} ����FVuhYYVuZYYVj�hYYVu?YY}�tuuV uf#���#�� #����� ف��fO ��E��+U$_^�U$EPu���YY1ۅÉ�U$UUU UEPj%j�Q U$} �uE���E����UUE UEPjJj� y}�tUEEU$EUEPjHj�ٸ Uu hT$u UVWu1fϋV€t}u ~�tu>����F���tV]YU )uRv EVt tfVV}u1_^UW}E Mr/���u'���uĉ fE_]�����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇ��tPXP�����������������n�����d�����f���#��p�����r�����t���K��%s -f %s����.������� -p����� -r�cp%s%s %s %s����%s -t %s����rsh %s -n %s %s '%s@%s:%s'��rsh %s -l %s -n %s %s '%s@%s:%s'����.���.������� -d����� -p����� -r�rcp%s%s%s���/dev/tty����who are you? ���rcp: shell/tcp: unknown service ����tcp�shell���rcp: %s: %s. ���rcp: invalid user name %s ��-c��sh��/bin/sh�������@�������K��rcp: %s: file changed size �����C%04o %ld %s ���T%ld 0 %ld 0 ���rcp: %s: not a plain file ��rcp: %s: %s ����E ��%s/%s���%s/%s: Name too long. ��..��.���D%04o %d %s ����T%ld 0 %ld 0 ���rcp: %s: %s ����0 ���������) ��6 ��6 ��rcp: lost connection ���rcp: protocol screwup: %s ������rcp: %s: %s ����rcp: can't set times on %s: %s �����rcp: %s: %s ����rcp: can't set times on %s: %s �����/���%s%s%s��size not delimited��mode not delimited��bad mode����expected control record�%s �����atime.usec not delimited����atime.sec not delimited�mtime.usec not delimited����mtime.sec not delimited�����lost connection�unexpected '\n'�����rcp: ambiguous target ��rcp: malloc: out of memory �rcp: fstat: %s �Usage: rcp [-p] f1 f2; or: rcp [-rp] f1 ... fn d2 ��unknown error���unable to setup 2nd channel ����unable to ioctl(NWIOGTCPCONF): %s ��unable to read: %s �unable to write: %s ����%d��unable to ioctl(NWIOTCPLISTEN): %s �unable to fork: %s �unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��unable to write: %s�����can't get port �unable to ioctl(NWIOTCPCONN): %s ���unable to ioctl(NWIOSTCPCONF): %s ��unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��%s: unknown host ���/dev/tcp����TCP_DEVICE��r���/.rhosts����r���/etc/hosts.equiv����'���������f'��'��f'��'��f'��s'��s'��s'��-�����a���t-��r���O-��w���^-��-�����+���-��b���-��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�%u.%u.%u.%u.in-addr.arpa����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���}=��������}=�� =��&=��G=��>���������>�����>��@���������@�����@��A���������;A�����A��`C���������TC��`C��HC��<C��`C��`C��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��Y����� ���yY��@���Y��Z�����X���Z��b���Z��d���Z��i���Z��o���Z��p���Z��u���Z��x���Z��[����� ���[��#���[��+���[��-���[��0���[��^�����L���\��h���o\��l���z\��\�����E���9^��G���$^��X���]��b���]��c��� ^��d���]��e���9^��f���9^��g���$^��i���]��n���\��o���]��p���]��r���}^��s���I]��u���]��x���]��(null)��cannot print floating point ����nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��Lm���������Mk��l��"��@(#) Copyright (c) 1983 Regents of the University of California. All rights reserved. �@(#)rcp.c 1.1 87/12/21 SMI��� ((((( AAAAAABBBBBB ������������������������������������������������������������������������������������������������������������������������������������������������������SSSS/etc/passwd���������������������������������������������������������B�����������������������������������������������������������������������������������������$��Unknown error��� �� �� �� �� �� �� �� ��p ��` ��T ��0 �� �� ��� �� �� �� �� �� �� �� ��t ��` ��L ��8 ��( �� ��� ��������������|��h��T��8��$��`��`��`��`��`��`��`��`��`��`����������������t��d��P��<��$������������C���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���_����,������0������1$T$L ����su;SSSSuh ��h �� QRPL �� ���P�����U@VW} 1҉UUUUE���1҉UUj/7g#��YYƅtF7h��V#��YYtuE���}�u}~W:-t UE���UM+Mh ��RQ�� E=t3$E���΋X ��UE�����볻���E^��U ��}�u  ��A  ��UąuG�� ��<�u8}�t��Wh���!��YYh���h���h` ���� jF��YU+ ��U ��|!��EP��YEuh���h` ����YYj��Y}�uEUW��YEE����}�uh���h�����YYE}�uh���h` ��U��YYj��YEUhT ��uu0rEP��Eԅyjp��Y=T ���yhd���h` ����YYjN��Yu ��Yjjn��YY=���th��jY��YYjjN��YY=���th��j9��YYjj.��YY=���th��j��YY}�u3 ��E؅y'5 ��^��YPhT���h` ��a�� j��Yuuuu'���}�u}�t j u��YYj�x��Y_^U��VW}����}�z���5T ��x��Y ������h���Pj��� ƅ~.VWu�� Ex}׉+Uօuj�h5n� uD�� j���Y��=u'5 ��T��YPh��h` ��W�� j��Y�tT ��EP��Y ������h���P�tET ��P�� ƅ"�tj ��YY3j�.��YVP�t������P�� {_^UjEP5T ��y�� UVWE����u>�t6b��Y���EEuL��YEu#j 6��YPh,��h` ��9�� j���Y}u>�t-6W��YY6W��YYǀ?�tG~�t G΋E_^Uh8��h<��h@��h` ����j���Y��UV5 ��Nx \ ��^U= ���t ��u���Y�UV��U9��wU�����9��v �� ���16V0��Yt1'��rF����5��&��Y5�����^UVW}�u1���E����}������UUs �� ���1���=���u8j ��Y=u1���V!փ5��5��F����E����5 ��O���VU}9}r69v2W9UvUW~>}�t E ��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����= ��<���9}r79}u+UOJ}�t E ��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuVH�� u���Y_^U VWUUb���15 ��t 9ur6E0tU U ��tU9ru NJEtU9Wu RWE_^��UVu~  u �����6EP~��YE����U UEPEPV�� yE^��UVux95 ��p�� ��^UVW5 ��4#��Y#��DžD���7u��YYtw>�t6un��YYt} �tu w R��YYu= ���u #��_^U@VWE��uC��Ef��������#M с��f ��}�����|h4��L��YEuE(��E0 ��YEu!]3h��h` ���� ��EEE�����J��f�������} f��juF��YYDžy'5 ��[YPuh��h` ��[��7��E!��f��f �� �� ����� ف��fM��#U fUURUEPh0n@W�� ƅy9= ��:u WY��Y���5 ��YPh��h` ���� ��E���EPh0n@WI�� ƅy$5 ��mYPh��h` ��p�� L��E����EPh2n@W�� ƅy= �� uj��Yy = �� tʅy-= ��:t$5 ��YPh��h` ���� ��y M}�0}�uh��h` ����YY��}�u?jh|��W�� =���/��5 ��YPhh��h` ���� g��ju=��YYEy'5 ��QYPuhP��h` ��Q��-��E"��f��f �� �� ����� ف��fMEPh0n@u�� ƅy$5 ��YPh,��h` ���� ��\��EЅy$5 ��YPh��h` ���� ��}����j���Yj�j YYj��YE����EPh3n@u�� ƅy= �� uj#��Yy = �� tȅy0= ��:t'5 �� YPh��h` ���� j[Yx j�OYjEYj��Y��Ph��EP}�� EP��Y���PEPW�� PEP��Y���Z9t$5 ��}YPh��h` ���� \��u`��Y���PuWD�� uE��Y���PuW)�� u*��Y���PuW�� jEPW�� =���t$5 ��YPh��h` ���� ���}�t5jEPW�� =������jEPj�� } u���}����UEEPh1nuC�� ƅy!5 ��gYPh��h` ��j�� IfUf �� �� ����� ف���|h��h` ��$��YYxW��Y}�x u��Y_^U8��VWDž���Džu>�tF>.uu +UFG-A���=���s FP��YFG�} �t1hP��hT����YYE}�t;uuPu��uu ��Y1���u ��Y���= ���u } ����Dž����u��Yu ���rP��YYhD��P%��YYh@��P*��YYEu]UPr��YYu0tB9uu ��Y_^U��VWuh���P �� ���> t2> t-> t(>�t#-A���=���s PA��YFɀ> t> u*�F> t> uF> t> t> t >�tF�uPu 7��� N?�tEPu��YY/1_^UVW} }uWu��YY1ۅÉ ��uWu�� t1���Wu��YYu ������U:�t1���= ���t1���=� ������h��h����YY=u �����1������j.h����YY� ��u �����1T� ��� ��ր>�t-A���=���s P��YF݋UUR5� ����YY1ۅÉ_^���U$UUEPjj�K�� y U ��1UVW5 �� ��}׃}�~9r }�y 9vWYu_^���UVW= ��a���U9 ��}  ��M :-u ��z�u �� ��M h��4��YYu ���� ��M  ��ǣ ��:tWus��YYƅ}���= ���t=E h` ��0 ��YYh` ��h�� ��YYh` ��W ��YYh` ��j ��YY ��M  �� ��:�u �� �����?��� ��F>:��� ��M  ��C;�t!A  ��M  ��CX ����� ��U9 ��|W= ���t=E h` ��0N ��YYh` ��hh��= ��YYh` ��W� ��YYh` ��j ��YY �����?���` ��A  ��M X �� �����7 ��M  �� ��:�u ����� ��X ������_^���U=( ���x 5( ����Y( ��, ������U=( ���x=���u �� ��j�5����YY( ��y'j5( ����YY ���Pj5( ��}�� 1U^U��U8����=, ���u/h���h��5( ���� , ��1V4����=8����u1< , ��4��4��8��8��= ���u8�������U8��U8��U8��:�u18��: t 8��::uҋU�EUV=( ���yy1���u1�����tx,��tjƅtj�j�V �� f ��Lƅtj�j�V �� "��/0��t!$��y(��g8��:�X��^UV%ƅt F9Eu^UV{ƅtu6~ ��YYu[^��UVWuU VVu ��YYDžt~~�yVډ ��F_^���U$UUEPjj ��U(VuE����E����V֋RUV֋RU ��E wD��UUU UEPj7jB ^U(VuU @t*u ��Y���EU UV֋RUUUEPu(��YYU UEPjj ^�U$UUUUU UEPjj ��U$UUU UUUEx#��EPjGj� ���U} v �����M ���E 1U} v �����M ���ҋE!1UE�����1UE��1U} v �����M ���Et���1��UVW11}U9x ��u x ������F߃| j���ug���YtUrYtURtUz�t rY}0 ��t}H ��t}` ��t uY_^�UVWuE����u41}%<x ���t4x ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv)�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�vF)�� =u N /uvv*�� E����U9Uu1 N _^UV1}*<x ���tx ��B���t 4x ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���#YF~�uN NF ���1}9<x ���t,x ��R@tx ��B���t 4x ��YGƒ~�uF<��FF ���VVv vv%V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ >�uNN FFSX_^UVWE����E����11<x ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E ���>��U :�t! E���E E ���f>��U uuuYYEy@Ut8h��u%#��YYE~"��� tuYuuYYE}�y1]���jMYEu uY1A���!uE�����UMJUzUB����Ux ��E_^UUUuuu )�� �UVu JxUʋFF Vu/��YY^�UVWu }E����?�t:JxG^FSX GVP/��YY=uEE_^�UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuux(�� E���UJUx ]E� EPj�.��YYEUuu hu�� ����� ��������'!�����K#�����[#�����w#�����#�����#�����#�����O������$�����$�����%�����B$��USE] ���![]USE] ���![]USE] ���![]K��������������UVW}u M1�����������������������������&1��������UW}���0))ϊE tu1_]XG_]��������������1��������UVW!1��E_^]����������&1��������L$ 0���������UW}0OE uG_]1_]��������UVWh ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��UUAs UE���U8VWE���U UUUUfRf �� �� ����� ىM؋UfRf �� �� ����� ىME��E��u }����}�`���uuVuu[ ��Džy �����1��W΋U��u{Y���ljUUU)UVuV ��YY���ZMԃ}�~DVuV ��YY���Z߃}�t&UBt  �����  �����1+��E��E���������EP��E�������P��E����M��9u��uuVuuK��Dž��VA ��YEV4 ��YEV' ��Yǃ}u@ց}|��sUEEu=Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U������}�u}t }�t&9=��t U9UtQ=��UŨ}u���1��}�u U��uuXY���ZЉE���E1UU��s-UEȉEWVRg UUE;}�tE�����E�������  �����1_^U��VW}-0���= ������>����N>.���W��Y��=u �����1���=����������������������P����T��������P����X-0���= ���r>.uF\h����PjjWV ��y1j��Pi _^U��VW}}t1���PGPGPGPhd��PCh���Pj jP ��Ey1HjuP ƅu1*UVU V P����T��������_^��U Vj�h��YYƅyHu uV EVfY}u"U JU�j u@YYEt��1^���U= ���uh��h��YY �� 5 ��q'��YU  ��U= ���t5 ��Y ������ ������UVW= ���u!h��h��YY ��u1D��5 ��h���h�� Eu1��U:#th��u ��YYƅt�U��h��u���YYEt��EU: t: uEh��u���YYƅj�Fu'��Y%��f �� �� ����� ى ��5������h��VW���YYƅt�Ft8>�t3> t> uF$��s7h��V���YYƅt�F������_^UVW}Utu >�t]9uFG1_^�UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU ��E+.��} �tF= �� ����� ً ����� ʋ ����� ыE ���_^��UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��,���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���! ��*��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U ��*��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW ��u ��=u ���h����Pj�j�j�uu uj�B$��$ƅ ��������uuV�P��ƅy ��������}Gu^fWf �� �� ����� uL0 �����7 �����+ ����� �����W4 ��)(��_^UVWE���� ��um��=u N�� ������ �����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u  ��€u$}����N>.��� ��������"��?�q���uuuu 7u���E~���= ��;u �����l���= ��uE= ��t = ��u �����t놃}�t"uuuu j�u%���E~}�t  �����_^U��VW}} �uBWY-���Ɖ:.u#��sVWP Ƅ5�*"u h���Wh���hX ��PUuuuu_^U��VWhh ��YEthd ��uYYEu1���E�uh���P ���>�t ��uF>�n����uP. ��YYuF ��u>�tDG?�t ��uG1҈' ��h���Vh(���� u2Y(�� u"Y1_^���U@��VWE����E����E����UUЋUUE=��� ��u%��=u �� ��u } ���~���1EUffUE���� ��9UY��E���� ��9U;��}���Dž���� ��U= ���y2UMEPU !��P4�!��w�� ��=����#U f �� �� ����� ف��fMjEP5 ���� =���t$ ��U5 ��Y ��^��u u5 ���� 9E t$ ��U5 ��ZY ����}fE�U܅t2EPW5 ��p ƅ~U)��fUU܅tB ��U5 ��Y ��}<��}���E���M��}ff �� �� ����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5 �� ƅ~U)��fUU܅t$ ��U5 ��Y �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5 �� ƅ��U)��fU멃= ���y�� ��y ��U'��UMU !��P4�!��u u5 ��(��9E ���M ��Uԃ}�~ Eԙ= ��Eԃ}�E���uuu5 ����E=u= �����E������E���UM9u �� u+UBt"5 ��Y ��E���}�t ��t}�u  �����u5 ��BY ��Ea���EE= ���x5 �� Y ��}�u}�u  ��;��� ��=��� Uȉ ��_^U= ��t5 ��Y ��U$VWh ��PYDžut ��jWYYƃu ��E���E1��UUfU fUEPh0n@Vn E=u ��EV YGE����EPh2n@V2 E=u ��EVY E�����_^UVWuut.Vu u Dž U)U U )΋E_^U VWh ��0YDžu ��jWYYƃuEE7��3EPh@n@Vj E=u  ��UVYU ��_^UVW���UR`Yƅu �� ���w���UWfUfW fG ����#UfWuu FPa ���URVu E ��UVY}r UUU ��E_^UhA��jPYYj;YUVW���URYDžu �� ������hA��jYYEuYE���URWu( Ƌ ��Uxw7~1WCYj�YujYYuYU ��@RGPu < WYj�gYujhYYuRY_^��UVWEE�PT��YNjE E �PB��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P��YNjE E �P��Y9uuąt9}���t��� t1_^��UVuY���ƋU rU MJwU uRYY^U$UUEPjj� ��U$UUEPjj� ��U$U UEPulYYEPjj Uh ��2u u��� �ULVWE����1E����E����U UE8�t+0Y���E9uvE���EEE͋UUE8�t(0Y���E9uvE���EEЃ E V!փ}�u s �����K��VYE=u �����&��UEUUU}׋U UE8�t=+UEEE0Y���E܋]P3W5 }׃E뻋E�����EUUE8�t=+UEEE0Y���E܋]P3W }׃E뻋E�����EU9v�GuYY���EuUUȋUUE����E����EPj;j� RMY_^���U$EPjj�] U$UUU UEPjj9 U$EPjj�! U$EPjj� �U$UUU UUUEPj6j ��U$UUU UEPj%j� U$UUU UUUEPjj yEU$UUEPjj�_ ��UHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPj�� V< ��4 ��5D ��h( ��jKj� ^���UU$VWEP ��YEPEPj� �� j�YƋ}t9uvEH��EPG ��YE����EPEPj �� WYUUjEP ��YYEP" ��YWj�]YZ)‰j�EPj �� j�EPj �� t9r)օu j ��YVYU)_^�U$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E ��:��uVuu+ ��ƀ}Xu9utUP ��YUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U ��I��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U4 ��i��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�ET ��Y��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu } ��2��~�y U��Vu C��V€tu ,��fN���V���~����H ��u>5L ��H ��Yt.h���DYFu NL���NHF ���9h���YFuN!NF ���V@u��VVVh���U����F���t$jj�vf =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�vW =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u �� E`������������������# �����UVW}u M)9r/r uu fE_^]t|�������������UVW}0OW} uA)ʉыu _󤪋E_^]UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UVWME_^]��������UVuj j�V+ ^�U}�x}~uPYYUUas U E���Uh ��h` ��.YYjzY��U ��VWDž����Dž���� ����� ����� ���� ������!���j�hL ��ֲYYu �����g����#Jfh@ ��Yƅth���Vh!�� h( ��h, ��YYE(��uh���P ���jh ��P _����u> t> uF>�t> th���Vh!�� j h!��IYYƅt�Dž����djh ��P ����9> t> uF>�> h���Vh!�� j h!��YYƅt�!��"��7E����>�t3,"��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h ��P Q= ��D> t> uF>�(>  ���!��PVYY ��ff U !�� ��uY= ���u"�!����ff !�� �����=!���u=h���PYYu&j.PJYYƅtFPh!��YY�]���"��!��!��E����>�t >.uEF!��}| "��sj.VYYF7M���� ��1_^���U<VW}$�t}( s ��j j�u$.�� }$!��B��f!��f!��f �� �� ����� ف��fG�G�UxO шO ��t���1W ˆW ��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYf ��� �� ����� ف��fO}�`��}�V��m( učEPu(Vu3Ey 2��u֋U(+UU(Vj (YYVuYYVj�(YYVj��YYf ��� �� ����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuwYY}�tuuV uf ��� �� ����� ف��fO T ��E��+U$_^�U$EPu���YY1ۅÉ�U$} �uE���E����UUE UEPjJj� y}�tUEEU$EUEPjHj�ٻ Uu hT$u UVWu1fϋV€t}u ~�tu>����F���tV]YU )uRv EVt tfVV}u1_^UW}E Mr/���u'���uĉ fE_]�����+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P������������w���1ۇ��tPXP����������� ���8������?�����K������L������d������e������l������n��� ��w������rsh: fork: %s. �rsh: can't establish stderr. ���rsh: shell/tcp: unknown service. ���tcp�shell���rsh: unknown user id. ��/usr/bin/rlogin�rsh: can't exec %s. ����/usr/bin/rlogin�rlogin��8KLdel:nw���rsh�rsh: fork: %s. �rsh: %s. ��� �������usage: rsh [-nd%s]%s[-l login] host [command] ��unknown error���unable to setup 2nd channel ����unable to ioctl(NWIOGTCPCONF): %s ��unable to read: %s �unable to write: %s ����%d��unable to ioctl(NWIOTCPLISTEN): %s �unable to fork: %s �unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��unable to write: %s�����can't get port �unable to ioctl(NWIOTCPCONN): %s ���unable to ioctl(NWIOSTCPCONF): %s ��unable to ioctl(NWIOSTCPCONF): %s ��unable to open %s: %s ��%s: unknown host ���/dev/tcp����TCP_DEVICE��r���/.rhosts����r���/etc/hosts.equiv����: option requires an argument -- ���: illegal option -- ����--�����������^����^����^��k��k��k�� �����a���l ��r���G ��w���V �� �����+��� ��b��� ��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�%u.%u.%u.%u.in-addr.arpa����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���0��������0��a0��z0��0��)2���������c1�����1��,4���������$4�����34��4���������4�����4��6���������6��6��6��6��6��6��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��I����� ���I��@���I��J�����X���J��b���J��d���J��i���J��o���J��p���J��u���J��x���J��K����� ���K��#���K��+���K��-���K��0���K��N�����L���L��h���L��l���L��L�����E���UN��G���@N��X���M��b���M��c���'N��d���M��e���UN��f���UN��g���@N��i���M��n���M��o���M��p���M��r���N��s���eM��u���M��x���M��(null)��cannot print floating point ����nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��h]���������i[��\��P ��@(#) Copyright (c) 1983, 1990 The Regents of the University of California. All rights reserved. ���@(#)rsh.c 5.24 (Berkeley) 7/1/91�����������������������SSSS�������������/etc/passwd���������������������������������������������������������B���������������0 ��H ��` ����������������������������������������������������������������������0"��Unknown error���\��P��4��$�� ���������������|��l��X��L��4��$��������������������t��d��L��<��$������������������p�� �� �� �� �� �� �� �� �� �� ��\��D��(������������������p��\��D��4�� �� ��C�������� ((((( AAAAAABBBBBB ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���@V���� ������\������1$T$L0 ����su;SSSSu �� �� QRPD�� ���P*�����U`��VWu ��}|}~6h ��hh ��y0�� j ��Yv��YEu4v��YE=u.v6h���hh ��70��j ��Y URU}}7fL���L�� L����� ف��fM���h���v��YYEl���j�j�v �� %��fL��L�� L����� ف��fMUu0v6h���hh ��g/��j ��YU��#JfMfUfL��L�� L����� Qu���YPh���hh ��/��h��� ��Yu Dž���j0��YY ��yh���?/��Yj4 ��YE0��UUfUfUEPh0n@5 ��0�� Džyht���.��Yj ��YE����EPh2n@5 ��R0�� Džy)=4 �� u 5��hT���hh ��3.�� jA0��Yy =4 �� tyh<���.��Yj~ ��Yh0���hh ��-��YY/��E/��Ew�����j u/��YYn���54 �� ��YP6h���hh ��-��j ��YCPj�/��YY���j u~/��YYPjj�/�� ���ER��_^UVuu uQ/�� ƅV���=4 ��>t =4 ��?u==4 ��>u������EEPh6n@5 ��.�� =u ^U��VWh����P5 ��a Džyh�� -��Y�������Wh���V.�� uWVj.�� 1�t29v*)RVjw.�� ))ډ׋W�tN9t hX��W ��YWV���YYx5�u h$��0 ��Y։+ׅ?_^U��VE����h���Pj�-�� ƅy'54 �� ��YP5��h��hh ��w+��1t-VP5 ��-�� ƅy h��+��Yu^U VW}1} �u h(��e��Y9u ~BWVZYъ M-jEP5 �� h ��c+��Y��}t h����Y9u ~BWVZYъ M��jEP5 ��J x��h��+��Ys��h��hh ��q*��YY[��h��hh ��[*��YYE��h��hh ��E*��YY/��h��hh ��/*��YY��h��hh ��*��YY��h��hh ��*��YY��h��hh ��)��YY��9u ~BWVZYъ M*��jEP5 ��e ��h��"*��Y��U )RQ���YYEyp��Ud��hd��hh ��b)��YY9u ~BWVZYъ M-jEP5 �� h\��)��Y��}u9u ~BWVZYъ M-jEP5 �� hT��Y)��Y��}h}��EPhD��hh ��(�� ��}"9u ~BWVZYъ M-jEP5 �� h<��(��YB��EP��Y0��9u ~BWVZYъ M-jEP5 �� h4��(��Y���EP^��Y���9u ~BWVZYъ M-jEP5 ��m h,��.(��Y���EP���Y���9u ~BWVZYъ M*jEP5 �� h$��'��YIEP��Y:h��hh ��:'��YY'EPh��hh ��"'�� ��EK��_^UVuk���= ������= ���uEEUM �����hl��]��Y��u ��d��EEUEEUtjEP5 ���� Ey h\��&��Y^U4VW}W��= ���V��= ���uEEUj���EPj�<(��YYÚ��fUU΃��fUU҃ↁ��fUҍEPjj�'��  �����EEUjEP5 ����� ƅ���h��&��Y���= ������= ���uEEU �����EEUjEP5 ��Z��� ƅyMh��%��Y@EEUjEP5 ��&��� ƅyh��w%��Y t��I��_^UVW}t;Wu u�'�� ƅ!9~ h����YU U )1_^UUUVW19u ~BuVZYъ M-jEP5 �� h0��$��Yy��}���EEEE�jEP5 ��( Džy>��5��}&��YE u(����Rd&��YE u 5��5 �� Džy���EEjEP5 �� Džy���h��hh ��|#��YY9u ~BuVZYъ M-jEP5 �� h��#��Yr���}u9u ~BuVZYъ M*jEP5 �� h��o#��Y)}g}tEPh��hh ��"�� _^��Uhh ��u"��YY]%�����UV5$ ��Nx P��^U=( ���t( ��u8$��Y�UVW ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVux95��8�� ��^UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0 ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+4 ��"���}�t}�y��� UU_^��U8VWE���U UUUUfRfL��L�� L����� ىM؋UfRfL��L�� L����� ىMED��E��u }����}�`���uuVuu{��Džy�����1��W΋U��u!��Y���ljUUU)UVuV ��YY���ZMԃ}�~DVuV ��YY���Z߃}�t&UBt ����� �����1+��E��E���������E��E���������E����M��9u��uuVuuk��Dž��Va ��YEVT ��YEVG ��Yǃ}u@ց}@��sUEEuu ��Y���ljUUU)U]}�tE} u?uuVuu��Džy +֋U������}�u}t }�t&9=��t U9UtQ=��UŨ}u���1��}�u U��uu��Y���ZЉE���E1UUE��s-UEȉEWVR�� UUE;}�tE�����E������� �����1_^U��VW}-0���= ������>����N>.���W��YH��=u�����1���=������������������������H��������������X-0���= ���r>.uF\h����PjjWv ��y1j��Pi _^U��VW}}t1���PGPGPGPhH��P?��h���Pj jP��Ey1HjuP ƅu1*UVU V ��H��������H��_^��UVW5��<!��Y!��DžD���7u ��YYtw>�t6u��YYt} �tu w ��YYu=���u!��_^UVuEPV���YYtE4 �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s  ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU d��E#=��} �tF=�� ����� ً����� ʋ ����� ыE ���_^��UVuFPFPFPPh��hL����L��^UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��;���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��9��+U_^UVWUUU9U���uE8}GЉU���s���Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��8��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW��u��=u ���h����Pj�j�j�uu uj���$ƅ��������uuV�P��ƅy��������}Gu^fWfL��L�� L����� uL0�����7�����+����������W��6��_^UVWE������u��=u N��4 �����������uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u ��€u$}����N>.��������������?�q���uuuu 7u���E~���=4 ��;u�����V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������l���=��uE=��t =��u�����t놃}�t"uuuu j�u%���E~}�t �����_^U��VW}} �uBW ��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h��P1��uuuu_^U��VWh��YEth��uf��YYEu1���E�uh���P �� ���>�t ��uF>�n����uP. ��YYuF ��u>�tDG?�t ��uG1҈_��h���Vh`���� u ��Y`�� u ��Y1_^���U@��VWE����E����E����UUЋUUE=�����uq��=u ����u } ���~���1EUffUE������9UY��E������9U;��}���Dž������U=, ���y2UMEPU��P4��w�� , ��=����#U fL��L�� L����� ف��fMjEP5, ���� =���t$4 ��U5, ��y��Y, ��^��u u5, ���� 9E t$4 ��U5, ��6��Y, ����}fE�U܅t2EPW5, ��4�� ƅ~U)��fUU܅tB4 ��U5, ����Y, ��}<��}���E���M��}ffL��L�� L����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5, ��X�� ƅ~U)��fUU܅t$4 ��U5, �� ��Y, �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5, �� �� ƅ��U)��fU멃=, ���y��, ��y4 ��U'��UMU��P4��u u5, ��(��9E ���M��Uԃ}�~ Eԙ=��Eԃ}�E���uuu5, ����E=u=4 �����E������E���UM9u�� u+UBt"5, ��c ��Y, ��E���}�t��t}�u �����u5, �� ��Y, ��Ea���EE=, ���x5, �� ��Y, ��}�u}�u 4 ��;���4 ��=��� Uȉ4 ��_^U=, ��t5, �� ��Y, ��U$VWh ��,YDžu��jW ��YYƃu4 ��E���E1��UUfU fUEPh0n@V2 �� E=u4 ��EV ��YGE����EPh2n@V �� E=u4 ��EV ��Y E�����_^UVWuut.Vu u �� Dž U)U U )΋E_^U VWh8�� YDžu,��jWd ��YYƃuEE7��3EPh@n@V. �� E=u 4 ��UV ��YU4 ��_^UVW���UR< ��Yƅu4 �� ���w���UWfUfW fG ����#UfWuu FP �� ���URVu �� E4 ��UV ��Y}r UUU4 ��E_^Uh)��jT ��YYj ��YUVW���URu ��YDžu4 �� ������h)��j ��YYEu��YE���URWu�� Ƌ4 ��Uxw7~1W ��Yj���Yuj ��YYut��YU4 ��@RGPu �� W ��Yj�C��Yujl ��YYu.��Y_^��UVWEE�P ��YNjE E �P ��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P1 ��YNjE E �P ��Y9uuąt9}���t��� t1_^��UVW11}U9 ��u  ������F߃| j���ug���YtUr��YtURtUz�t rZ ��Y}8 ��t}P ��t}h ��t u6 ��Y_^�UVWuE����u41}%< ���t4 ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v&�� =u N /uvv�� E����U9Uu1 N _^UV1}*< ���t ��B���t 4 ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h�����YF~�uN NF ���1}9< ���t, ��R@t ��B���t 4 ��YGƒ~�uF`��FF ���VVv vv�� >�uNN FFSX_^UVWE����E����11< ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �D��%��U :�t! E���E E �d��%��U uuus��YYEy@Ut8h��uq��YYE~"��� tu7��Yuu/��YYE}�y1]���j��YEu u��Y1A���!uE�����UMJUzUB����U ��E_^UUUuuu �� �UVWu }E����?�t:JxG^FSX GVP��YY=uEE_^�UVW54 ��lYNj5l ��hP ��Yhh ��Y}�t.U:�t&u��YPuV�� jh��V�� W��YPWV�� jh|��V�� _^���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu,�� E���UJUx ]E� EPj�|��YYEUuu hu����������������������'�����7�����[���������� ��������������� �����O�����UW}E MuG_]1_]UVW}u M?���������������r����������������UVWM��E_^]��������U=( ���t( ��j��YUVx��U9x��wUx�����9x��v4 �� ���16V ��Yt1'x��rF����5x��&��Y5x�����^UVW}�u1���E����}������UUs4 �� ���1���=t���u8j< ��Y=u1���V!փ5t��5x��F����E����5|��O���VU}9}r69v2W9UvUW~>}�t E|��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=|��<���9}r79}u+UOJ}�t E|��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���15|��t 9ur6E0tU U|��tU9ru NJEtU9Wu RWE_^��U}�x}~u ��PX ��YYUVu~  u4 �����6EP ��YE����U UEPEPV �� yE^��UUas U E���U=���uh ��h ��YY�� 5��E��YU ��U=���t5��Y������������UVW=���u!h ��h ��oYY��u1D��5��h���h�� Eu1��U:#th� ��u ��YYƅt�U��h ��u���YYEt��EU: t: uEh ��u���YYƅj�FuW��Y%��fL��L�� L����� ى ��5������h ��VW���YYƅt�Ft8>�t3> t> uF��s7h ��V���YYƅt�F������_^UVW}Utu >�t]9uFG1_^�U ��VWDž����Dž����������������������������j�hX ��>YYu�����g����#JfhL ��WYƅth���Vh���< h4 ��h8 ��YYE(��uh���PK ���jh, ��Pa�� _����u> t> uF>�t> th���Vh��� j h�����YYƅt�Dž����djh$ ��P�� ����9> t> uF>�> h���Vh��� j h���(��YYƅt�������7E����>�t3��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h ��P�� Q=��D> t> uF>�(> ����PVwYY��ff U����uY=���u"����ff�������=����u=h���Pn��YYu&j.P��YYƅtFPh�����YY�]������������E����>�t >.uEF���}| ��sj.VH��YYF7M���� ��1_^���U<VW}$�t}( s ��j j�u$�� }$��B��f��f��fL��L�� L����� ف��fG�G�UxO шO��t���1W ˆW��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuxYYVujYYfL���L�� L����� ف��fO}�`��}�V��m( učEPu(VuEy 2��u֋U(+UU(Vj YYVuYYVj�YYVj�YYfL���L�� L����� ف��fO ��� ���U9U(} ����FVuTYYVuFYYVj�TYYVu+YY}�tuuV ufL���L�� L����� ف��fO ` ��E ��+U$_^�U$UUEPjj�g��� y U��1UVW5����}׃}�~9r }�y 9vWYu_^���UVWuU VVu5��YYDžt~~�yVډ4 ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$UUEPjjc ��U$U UEPu��YYEPjj5 U$EPjj� U$EPjj� U$UUU UUUEPj6j ��U$UUU UEPj%j� U$UUU UUUEPjj yEU(VuU @t*uY���EU UV֋RUUUEPu��YYU UEPjj ^�U$UUUUU UEPjj ��U$UUU UUUEPQ��EPjGj� ���U} v4 �����M ���E 1U} v4 �����M ���ҋE!1UE�����1UE��1U} v4 �����M ���Et���1��UU$VWEP ��YEPEPj� �� j�tYƋ}t9uvE4D��EP ��YE����EPEPj �� W3YUUjEPq ��YYEP ��YWj� YZ)‰j�EPjB �� j�EPjR �� t9r)օu jYVYU)_^�Uu hT$u UV& T$@, T$@% T$@4 �����t ��E C��uVu ^�U$UUUUU UEPjj ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ��3��}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E ��n��uVuu+ ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U ��} ��E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U �� ��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE ��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P'��E6U U RU U RUEE�E< �� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }( ��-��~�y U��Vu C��V€tu ,��fN���V���~����P ��u>5T ��X��Yt.h���YFu NL���NHF ���9h���bYFuN!NF ���V@u��VVVh���U����F���t$jj�v6 =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v' =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^�Uj�j�u�� E`�'����������������������b��USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����UW}���0))ϊE tu1_]XG_]��������������UVW!E_^]����������L$ �������UVuj j�V ^�Uh ��hh ��YYj"Y��U Vj�h ��YYƅyHu uV EVJY}u"U JU�j uYYEt��1^���UVuY���ƋU rU MJwU uRYY^U$EPuYY1ۅÉ�U$} �uE���E����UUE UEPjJj� y}�tUEEUHVuUVUVUV UVUЋU UEP���Y^UVuEPYj�EPjM V4��,��5<��h ��jKj�1 ^���U$EUEPjHj� UVWu1fϋV€t}u ~�tu>����F���tVYU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P������������_���1ۇ���tPXP�����������������c�����8��"��%s: fork failed: %s ���Connected �unable to NWIOTCPCONN���%s: got EAGAIN, sleeping(1s) ��unable to NWIOSTCPCONF��unable to open /dev/tcp�/dev/tcp����TCP_DEVICE��Connecting to %s:%u... ����%s: unknown port (%s) �tcp�%s: unknown host (%s) �Usage: %s host <port> �Assertion "optsize" failed, file "ttn.c", line 255 �Assertion "iacptr == bp" failed, file "ttn.c", line 248 ����read����write���%s: read: %s �� �������� �� ������������������m���� ��i �� ��got unknown command (%d) ��got a IAC �read����read����read����read����got IAC %d ����read����read����got an unknown SB (skiping) ���read����got a GA ��got a EL ��got a EC ��got a AYT �got a AO ��got a IP ��got a BRK �read����Assertion "iac == IAC" failed, file "ttn.c", line 318 ��read����Assertion "count" failed, file "ttn.c", line 316 ���write���unknown�TERM���� �������� �� ��q ��write���write���write���Assertion "result <= buf_size" failed, file "ttn.c", line 528 ��got IAC %d ����read����read����got an unknown command (skipping) �unknown�read����unknown error���%u.%u.%u.%u.in-addr.arpa��������������!��:��[��%d.%d.%d.%d����������W������� ��������������'���������������������������������������%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��/�����a���/��r���/��w���/��60�����+���0��b��� 0�� ���: ��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�r���/etc/services��� �� ��,/�� ��# ��r���/etc/services���nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��@���������>��?��SE��������>E��EE��LE��uF����� ���F��@���NF��rG�����X���[G��b���@G��d���RG��i���RG��o���IG��p���[G��u���RG��x���[G��KH����� ���<H��#���AH��+���7H��-���2H��0���FH��=K�����L���%I��h���I��l���I��CI�����E���J��G���J��X���/J��b���/J��c���J��d���mJ��e���J��f���J��g���J��i���mJ��n���I��o���/J��p���/J��r���K��s���I��u���/J��x���/J��(null)��cannot print floating point ����/etc/hostname.file��H�������������������������������SSSS��������������������������������������������������������B���������������8 ��P ��h ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������Unknown error��� �� �� �� �� ��x ��\ ��H ��4 ��$ �� ����������������|��l��\��L��8��$��������������������p��\��@��,�������� �� �� �� �� �� �� �� �� �� ������������h��L��8��(�������������������C�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  ���Z��\��M������d��0��1$T$L ��\��su;SSSSu, ��, �� QRP�� ��P:�����U VWu}>���>%tFGF>%uFG=0���|=9���F-0���EJ=a���|=f���F-W���E(=A������=F������F-7���E=0���|$=9���F-0���U ˆUT���=a���|!=f���F-W���U ˆU)=A���|*=F��� F-7���U ˆUMG�E_^UVW} E0W5��YEE����U9U���GE'GeGEE0 ��FE%0���] É؊0 ��FE%<���] É؊0 ��FE%?���0 ��FEqUB9UuF=���U9UuF=F=�E0_^U���h ���h\��4��YYDž|b��u uh���EPK3��EP|PYY\��UVW} uO���=t ���t =t ��u > ut ��)=t ��t =t ��u > ut �� t ������> up �� p ������=t ��t =p ��u E�����Fu1_^UVW} �uE P���u u+ ��YYƅy"u uh���h ��1��O��}$�t(j?u4��YYEt��Eu3��Y1}$�t~jh���V3�� jh���V2�� u3��YPuV2�� j h���V2�� jh���V2�� jhp���V2�� U:�tDjh`���V2�� uuYYEP3��YPuVp2�� jh\���V`2�� }$�t1~-WhD���h��C1�� h��2��YPh��V)2�� jh<���V2�� u2��YPuV2�� jh8���V1�� jh4���V1�� }$�t~ WuV1�� E���h>��h��V1�� E���}�t5EPuh��^ E}�tU+URh��jn1�� UU}�t} �uU+Uu��Pj?1�� 9Eqh,���/��Y'}�yh���h ��`/��YY V0��Y1_^U VW������u>�t>(tF>�p���F1V. ��YBSEPWZYZtj,V0��YYƅt<FEPEPEPEPh���h���q/��UMщ ��_^UVW���uh���h\��l+�� u w���t1jh\��EP0�� E�jEPh\��0�� u=_��-tEPM ��YƁ���}}t ���v���u h\��Y_^UUu:�t������Puh���u-��u)��Yu YU$VW} �uE ���}�uEi���u u��YYEy"u uh\��h ��s-��o��hX��u '��YYhT��u&��YYEWYƹd���=�����U:�tEH��PhL��Wuƹd���=���u&U:�tE8��Ph@��Wuƹd���=�����UU:/uEj/uo.��YYEt+��EuYPh4��WutƋUUƒ}duA���EPh0��EP,�� EPh(��Wu3ƹd���=������h��h ��WuƁ������5��h���I��YYE���uYP}du�� ��PWuƹd���=���e���h>��h��u"-�� ƅ~Vh��j-�� E9t9ut tu,��YWYƹd���=���u1h���h��Wu W%��Yu%��Yu,��Yu1_^U VW}} �uh��h ��*��YY���u u ��YYƅy"u uh��h ��*��e���?/uGW,��YPWV),�� jh��V,�� h>��h��V+�� E~uh��j+�� E9EtV+��Y1_^U���VW} Dž����Dž ����Dž����j/7x,��YYEuUM}�x���:-m���M:-uz�tS:�t-DžDž DžE����Ƌ���M��h��ue+��YY���}|}~uh��h ��))�� z��j@P7Pl+�� Dž0���,}�tj@PEP=+�� EE�}�tj@PwP+�� Eƅw�ji,,EP07P��h��uy*��YY���}tuhd��h ��C(�� ��j@P7P*�� Dž0P���, ,,EP07P &��}tuhH��h ��'�� ��UMjh@��u �� uEU$o���jh8��u �� uEU$Gjh0��uq �� uEU$uh ��h �� '�� \��E�ƅw�ƅ7�Dž0����$>�t>/tF,,�j@$~(��YYtN��$>�t>:tF>�t�F$EP(��YYVwP(��YY$, $>�t >/t>:tF+$R$7Ps(�� +$Ƅ7�>:u+F$>�t>/tF-0���k0 É0܀>/u, Dž,��}���,>�t>;tF>�����Fjh���V�� ���P��Y(��� ,wPEP07P? p���(,wPEP07P1<,wPEP07PE��H��_^��U<VWu��YEԅuuh4��h ��r$�� v��UԋMԋIr 1EP&�� ��#U fY��Y�� Y����� ف��fMh(��u��YEuE��ju%��YYƅyh��#��Y���E0��U܉UfUfUEPh0n@V;%�� Džyh��#��YV%��Y���EPh1nV%�� Džyh��#��YV$��Yg���E����E����EPh2n@V$�� ǃu!= �� uUĉAMă } j $��Yƅyh�� #��YV}$��Y_^���UVuj j�V��� ^�UV5x ��Nx Y��^U=| ���t| ��u $��Y�UVW, ��Ut}�u16EEׅt%u>�tG9uF>�uր?=uэG1_^�UVujuu V!���^UVuj�uu V���^UVWuE����E����E���u} �tE 0% ��tFǃ-t+u -uEFu}�u,>0uF>xt>Xu E���F)E��� E ���}u>0u F>xt>XuFlj0 w 0U&aw WUAw77UU9Uv'+U1u9EvEUUUUF뒃} �t9uu UE E 0}�u'}�t!}�y }���w}�~ }vE}�t+ ��"���}�t}�y��� UU_^��UUAs UE���U8VWE���U UUUUfRfY��Y�� Y����� ىM؋UfRfY��Y�� Y����� ىME ��E��u }����}�`���uuVuu��DžyZ�����1��W΋Ul��u!��Y���ljUUU)UVuVX ��YY���ZMԃ}�~DVuV9 ��YY���Z߃}�t&UBt Z����� Z�����1+��E��E�����p����E��E�����|����E����M��9u��uuVuu��Dž��V ��YEV ��YEV ��Yǃ}u@ց}��sUEEue ��Y���ljUUU)U]}�tE} u?uuVuu"��Džy +֋Ul��l����}�u}t }�t&9=x��t U9UtQ=x��UŨ}u���1t��}�u Ul��uu��Y���ZЉE���E1UU ��s-UEȉEWVR�� UUE;}�tE�����E�����l�� Z�����1_^U��VW}-0���= ������>����N>.���W��Y��=uZ�����1���=l��p����������t�����x���������������|����l��X-0���= ���r>.uF\h����PjjW��y1j��Pi _^U��VW}}t1���PGPGPGPhH��P��h���Pj jP$��Ey1HjuP ƅu1*UVU V ������������_^��UVuEPV���YYtE �����^U$VWuUU1E ���>0uF>xt>Xu E���FE���U���E=���s&E-0���= ���sE-0���UF}uLE=���sAE% ��Dt4E ���]aPsa���A���Z)‰Fo>.u&U9Us���v1 ��E܉8EF>�t=���s % ��u1���UM)ѻ���ș@Ec����v1���U W��v1���UM 6���v1x���UM ыU d��E_=��} �tF=Z�� Z����� ًZ����� ʋ Z����� ыE ���_^��UVWEE����u}UUUGЉU������9ut9uw ���.FU9Uw ���UBUMxGЉU<.uU9Uw ���\FUF9} wȸ���}�y +UBU?���#U ʋM9}w9} wIEU +U9U+/(���#U��<���}�y+UUE_^U$VW}u UU}�t,EEU܅t#UUE8�tEUUE����UG}�#��}�z���uuu܍GP|��Ex;V9Uw ��U���F���EF+U ���}�tU9UsE0EE�����FE}.u UGD���}\u GЉUt19uw}�t E�����|���UFGЉUu+UJUu }�uN/}�~}?~}�t E�����3UM 9uw}�t E����� �F+U _^UVWu9u v3FЉׄt'F���!��:��+U_^UVWUUU9U���uE8}GЉU���sV��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V��V�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Mx$>.���>\uFF'G9tm���FЉUu?�u U+U \���}.uH뚸M?���#U ыU w���#U��F9��>�u U+U E4_^UU Z ˁ��UVuN V N щ^UVWu }V_^UVWu} WWW_^�U���VW(Z��uy��=u ���h����Pj�j�j�uu uj�.��$ƅZ��������uuV�P��ƅyZ��������}Gu^fWfY��Y�� Y����� uL0Z�����7Z�����+Z�����Z�����W��]7��_^UVWE����(Z��uY��=u N�� ������Z�����uE����>�t >.uEF}�u)u��Yƅtuuuu V_���}�u (Z��€u$}����N>.���(Z��������D[��?�q���uuuu 7u���E~���= ��;uZ�����l���=Z��uE=Z��t =Z��u(Z�����t놃}�t"uuuu j�u%���E~}�t Z�����_^U��VW}} �uBW��Y-���Ɖ:.u#��sVWP�� Ƅ5�*"u h���Wh���h��P��uuuu_^U��VWh��?YEth��uF��YYEu1���E�uh���Pv �� ���>�t% ��uF>�n����uP. ��YYuF% ��u>�tDG?�t% ��uG1҈��h���Vh��q�� u ��Y�� u ��Y1_^���U@��VWE����E����E����UUЋUUE=���(Z��u��=u ��(Z��u } ���~���1EUffUE����$Z��9UY��E����,Z��9U;��}���Dž����$Z��U= ���y2UMEPU<Z��P40Z��w�� ��=����#U fY��Y�� Y����� ف��fMjEP5 ���� =���t$ ��U5 ����Y ��^��u u5 ���� 9E t$ ��U5 ����Y ����}fE�U܅t2EPW5 ���� ƅ~U)��fUU܅tB ��U5 ��K��Y ��}<��}���E���M��}ffY��Y�� Y����� ىM9M}��#UfUDž��� ��#UfUU܅t2EPW5 ���� ƅ~U)��fUU܅t$ ��U5 ��o��Y �������UJÜJU+U��fUU܅V��U܁���v���E܉VP5 ���� ƅ��U)��fU멃= ���y�� ��y ��U'��UMU<Z��P40Z��u u5 ��(��9E ���M Z��Uԃ}�~ Eԙ=,Z��Eԃ}�E���uuu5 ����E=u= �����E������E���UM9u(Z�� u+UBt"5 �� ��Y ��E���}�t(Z��t}�u (Z�����u5 �� ��Y ��Ea���EE= ���x5 ��k ��Y ��}�u}�u  ��;��� ��=��� Uȉ ��_^U= ��t5 �� ��Y ��U$VWh��YDžu��jW ��YYƃu ��E���E1��UUfU fUEPh0n@V �� E=u ��EV ��YGE����EPh2n@Vj �� E=u ��EVD ��Y E�����_^UVWuut.Vu u7 �� Dž U)U U )΋E_^U VWh,��YDžu ��jW ��YYƃuEE7��3EPh@n@V �� E=u  ��UV~ ��YU ��_^UVW���UR ��Yƅu �� ���w���UWfUfW fG ����#UfWuu FP5 �� ���URVu �� E ��UV ��Y}r UUU ��E_^Uh -��j ��YYj ��YUVW���UR5 ��YDžu �� ������h -��j ��YYEuN ��YE���URWuX �� Ƌ ��Uxw7~1W ��Yj� ��YujJ ��YYu��YU ��@RGPu  �� W ��Yj���Yuj ��YYu��Y_^��UVWEE�P` ��YNjE E �PN ��Y9uuԅt9}���t��� t1_^UVW}�u1]���MEE�P ��YNjE E �P ��Y9uuąt9}���t��� t1_^��UVW1}�y1���1< ���t,|1���Fρ���(�����1���E E �8��^*��U :�tE E �X��<*��j��YEu1E���t���tE�����UMJUzUB����U ��E_^UVW11}U9 ��u  ������F߃| j���ug���YtUr��YtURtUz�t r: ��Y} ��t} ��t} ��t u ��Y_^�UVWuE����u41}%< ���t4 ��YtEG֋E ��~�tV€uF���u1��V€c���E����~�tVuډU����juv�� =uN ���VtfVV1���Vt1���VtfV+VUVV}�1Y���F���t!jj�v�� =u N /uvv �� E����U9Uu1 N _^UV1}*< ���t ��B���t 4 ��aYF^��UVWu}M } �~/JxFFSXV:���YE=t G} uȃ}uVt 9}u1 1�E_^�UVWu����~�y ��V0t ��VuN ���F���tN ���V€uN���Vu+~�u%h���_��YF~�uN NF ���1}9< ���t, ��R@t ��B���t 4 ��YGƒ~�uF��FF ���VVv vv5�� >�uNN FFSX_^UVWE����E����11< ���tN|1D��Fρ���E����C��E���E0���-��E���MP1��E E �p��c%��U :�t! E���E E ���:%��U uuu��YYEy@Ut8h��u1��YYE~"��� tu��Yuu��YYE}�y1]���j��YEu u��Y1A���!uE�����UMJUzUB����U ��E_^UUUuuu �� �UVW5 ����YNj5 ��h ��Yh ��Y}�t.U:�t&u��YPuV�� jh��V �� W��YPWV�� jh��V�� _^���UUURu hu'���UUURuu u�����UEE��UUUUU JUEPuu�� E���UJUx ]E� EPj���YYEUuu hu�� ����� ����� �����3 ����� ����� ���������������UVW}u M���������������UW}���0))ϊE tu1_]XG_]����������������������UVW��E_^]������������������L$ ���������UVWM��E_^]��������UW}0OE uG_]1_]��������UV,��U9,��wU,�����9,��v �� ���16Vx ��Yt1',��rF����5,��&��Y5,�����^UVW}�u1���E����}������UUs �� ���1���=(���u8j ��Y=u1���V!փ5(��5,��F����E����50��O���VU}9}r69v2W9UvUW~>}�t E0��u6uYtE1_^UVWUUuu Y���} �uu���Y1������U UURU+UUE����=0��<���9}r79}u+UOJ}�t E0��URU}?뼋Uu9ur%9uw V9UvUVUrV7���YE-u Yƅu1uuV u���Y_^U VWUUb���150��t 9ur6E0tU U0��tU9ru NJEtU9Wu RWE_^��UVu~  u �����6EPR ��YE����U UEPEPV �� yE^��UVux95H����< ��^UUas U E���U ��VWDž����Dž���� Z�����$Z�����(Z����,Z������DZ���j�h�����YYuZ�����g����#Jfh��gYƅth���VhDZ��H h��h��TYYE(��uh���P ���jh��P _����u> t> uF>�t> th���VhDZ�� j hDZ��YYƅt�Dž����djh��Pd ����9> t> uF>�> h���VhDZ��' j hDZ��YYƅt�DZ��D[��7E����>�t3\[��s+> t> u �E���}�t 7E����FȀ>�t > t> tF�����Dž���oj h��Po Q=,Z��D> t> uF>�(> ,Z��0Z��PV YY,Z��ff U<Z��,Z��u(Y=,Z���u"0Z����ff<Z��,Z�����=DZ���u=h���P:��YYu&j.PYYƅtFPhDZ��LYY�]���D[��DZ��DZ��E����>�t >.uEFDZ��}|P[��sj.VYYF7M���� (Z��1_^���U<VW}$�t}( s ��j j�u$�� }$BZ��B��fBZ��fBZ��fY��Y�� Y����� ف��fG�G�UxO шO(Z��t���1W ˆW(Z��@t���1W ˆWW�Wu$ U( U(ỦUȋU$EȉEE�����EUU��m(y ��učEPu(Vu Ey ��u֋U(+UU(VuYYVuYYfY���Y�� Y����� ف��fO}�`��}�V��m( učEPu(VuGEy 2��u֋U(+UU(Vj <YYVu.YYVj�<YYVj�YYfY���Y�� Y����� ف��fO ��� ���U9U(} ����FVuYYVuYYVj�YYVuYY}�tuuV ufY���Y�� Y����� ف��fO ��E��+U$_^�U$UUEPjj�g��� y U( ��1UVW5( ��( ��}׃}�~9r }�y 9vWYu_^���UVWuU VVua��YYDžt~~�yVډ ��F_^���U$UUEPjj� ��U$UUEPjj� ��U$UUEPjjc ��U$U UEPu ��YYEPjj5 U$UUU UUUEPj6j ��U$UUU UUUEPjj yEU(VuU @t*uY���EU UV֋RUUUEPu`��YYU UEPjjo ^�U$UUUUU UEPjjC ��U$UUU UUUE|R��EPjGj� ���U} v �����M ���E 1U} v �����M ���ҋE!1UE�����1UE��1U} v �����M ���Et���1��UU$VWEPn ��YEPEPj�f �� j�YƋ}t9uvEE��EP+ ��YE����EPEPj �� WkYUUjEP ��YYEP ��YWj�EYZ)‰j�EPj �� j�EPj �� t9r)օu j* ��YVYU)_^�U$UUUUU UEPjjC ��UVWu>*uEERE F%1-0���Ex}  k }FE 8_^UVWu}u���}�tBEv�����#JM_���}�tRUG���RU8}�tRU#RU`���#U ����}�t/}�y -F]U t+F U t FUUU t }ou0F}�u}�`������U t }xt }Xt}pu?0F}XuX���x���F$E���)E��� E ���E���E4����uVuu+ ��ƀ}Xu9utUPYUE_^U4��VWuE����EE�E ��}%M���JxUʋFF Vu$��YY=u}�t Uډ����E1!,'"���U|����E���tUUԍE PEPu, E9Et���U:.u+EUUԍE PEPu E}�x������t }�y]���uE�������t���tUЉU$ E#��@E��π���E ��U��%��JxUʋFF Vu��YY=u}�t Uډd��Z��E0 ���tEU U Rf@���tU U RM؉ U U RM؉ U U RUЅuE\��UЉU}�u ���8��U:�,��EM���u E��� }ptEj�uPuWE PE���������u E���EjuPuWE PcE���U U MRE������t }�uE������uE���}��rE������EuPuWE P��E6U U RU U RUEE�E�� ��E ������tE0���U+UЉUE�������t7}xt}Xu���u }pt���tUЀ:+t :-t: uE܋U+UUa�����U��UU؃}�������\���ME؋JxEEFFEE�VP��YY=���}�t Uډ����mEJxEEFFEE�VP��YY=t6JxEEFFEE�VPp��YY=u}�t Uډ����JxUʋFF Vu(��YY=u}�t Uډ������MuUUMR���JxEEFFEE�VP���YY=u}�t Uډd���Z���}�~UUM#JxUʋFF Vue���YY=u˃}�t Uډ E_^���UVW}Wu u ƅ~9})׉U U 1_^UVWu }| ��1��~�y U��Vu C��V€tu ,��fN���V���~���� ��u>5 ��l��Yt.h���hYFu NL���NHF ���9h���:YFuN!NF ���V@u��VVVh���U����F���t$jj�v =uN ?��jEPv =���tN ����V@���FF t V 9���ډUVV����F���t$jj�v =uN ���uvv ���N ���V+VUV JVV}�Q���F���t!jj�v =u N 3uvvl uNN N_^���UVWuE1u ׋E1u Eu}~UJRVu uƃ ~ ꩉG0F_^��������'���/���7������������USE] ���![]USE] ���![]USE] ���![]UVW}u M)9r/r uu fE_^]t|�������������UVWtu} u ~�tIu(_^]�����} 0)ʇʋu }���������UW}0ʀuA)_]�����UW}E Mr/���u'���uĉ fE_]�����U}�x}~uN��P��YYUh ��h ��&YYjfY��U Vj�h ��YYƅyHu uV EVbY}u"U JU�j uYYEt��1^���UVW5`[����Y��DžD���7uYYtw>�t6uzYYt} �tu w ^YYu=`[���u��_^UVuhY���ƋU rU MJwU uRYY^U$EPjj� U$EPu6��YY1ۅÉ�U$UUU UEPj%j� U$} �uE���E����UUE UEPjJj�U y}�tUEEUHVuUVUVUV UVUЋU UEP���Y^UVuEPKYj�EPjM VH��@��5P��h4��jKj� ^���U$EUEPjHj� Uu hT$uE U=P���uh ��h ��YYP�� 5P����YU `[��U=P���t5P��YP������`[������UVW=P���u!h ��h ��{YYP��u1D��5P��h���hX�� Eu1��U:#th ��u ��YYƅt�U\��h ��u���YYEt��EU: t: uEh ��u���YYƅj�FuWY%��fY��Y�� Y����� ى d��5h��l��`��h ��VW���YYƅt�Ft8>�t3> t> uF��s7h ��V���YYƅt�F����\��_^UVW}Utu >�t]9uFG1_^�Uj�j�u ��� E`�UVWu1fϋV€t}u ~�tu>����F���tV9YU )uRv EVt tfVV}u1_^Ë+C;Cw Ë[ uӅu ���P-������KI|;u[u ���P���������������1ۇT��tPXP�����������������%s:%s���BASIC ��httpget: Read error ����write��� �� ��Host: ��Content-Length: %u ���� ��Authorization: �Connection: Close �User-Agent: urlget ���� HTTP/1.0 �GET ����POST ���httpget: Could not connect to %s:%d ����%d.%d.%d.%d����� ���%s%s%s ��������QUIT����RETR����NLST��������PASV����TYPE����%c��CWD�urlget@�PASS����ftp�USER����w���r���ftpget: Could not connect to %s:%d � ���httpget: Could not connect to %s:%d ����tcpget: No port specified �� �����d��� ��h��� ��p��� ������������(��\��type=���/���%s: I do not handle this scheme ����tcp://��ftp://��http://�Usage: %s [-h] [-p] url ����Usage: %s [-h] [-d] [-p] host path �httpget�Usage: %s host path [user [pass]] ��ftpget��httpget: NWIOTCPCONN����httpget: NWIOGTCPCONF���httpget: NWIOSTCPCONF���httpget: opening tcp����/dev/tcp����TCP_DEVICE��Unknown host %s! ���%u.%u.%u.%u.in-addr.arpa����%��������%��������}��������������,�����������x�������3 ��������������: ��"���������!��"��!��!��"��"��%.*s.%.*s���r���HOSTALIASES�/dev/tcp����TCP_DEVICE��/dev/udp����UDP_DEVICE��8/�����a���*/��r���"/��w���0/��t/�����+���\/��b���R/��34�����a��� 4��r���3��w��� 4��v4�����+���W4��b���M4�� ���: ��unknown error���nameserver��search��domain��r���/etc/resolv.conf����LOCALDOMAIN�domain��B���������@��A��G����� ���aG��@���G��H�����X���H��b���H��d���H��i���H��o���H��p���H��u���H��x���H��I����� ���I��#���I��+���I��-���zI��0���I��L�����L���mJ��h���WJ��l���bJ��J�����E���!L��G��� L��X���wK��b���wK��c���K��d���K��e���!L��f���!L��g��� L��i���K��n���J��o���wK��p���wK��r���eL��s���1K��u���wK��x���wK��(null)��No such connection��Already shutdown����No connection���No urgent data present��Urgent data present�Connection timed out����Connection reset����Connection refused��Address in use��Already connected���Destination not reachable���Bad destination address�Would block�Bad mode for ioctl��Illegal ioctl for device����Not enough buffers left�Invalid packet size�Directory not empty�Function not implemented����No locks available��File name too long��Resource deadlock avoided���Result too large����Math argument���Broken pipe�Too many links��Read-only file system���Illegal seek����No space left on device�File too large��Text file busy��Not a typewriter����Too many open files�File table overflow�Invalid argument����Is a directory��Not a directory�No such device��Cross-device link���File exists�Resource busy���Block device required���Bad address�Permission denied���Not enough core�Resource temporarily unavailable����No children�Bad file number�Exec format error���Arg list too long���No such device or address���I/O error���Interrupted system call�No such process�No such file or directory���Not owner���Error 0�cannot print floating point ����/etc/hostname.file��r���/etc/services��� �� ��,/�� ��# ��r���/etc/services�����ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/����������������SSSS��������������������������������������������������������B��������������� �� �� ����������������������������������������������������������������������� ((((( AAAAAABBBBBB �����������������������������������������������������������������������������������������������������������������������������������d[��Unknown error��� �� �� ��| ��d ��X ��< ��( �� �� �� �� �� �� �� �� ��| ��p ��\ ��L ��< ��, �� �� ��������������|��l��`��P��<�� �� ��������, ��, ��, ��, ��, ��, ��, ��, ��, ��, ��������l��`��H��,������������������x��d��C�����������������begrom��������I_22����\����I_2�����\����__calls�p����_string2>����_getansw����_h_addr_����_host���l����_host_al����_hostbuf ����_host_ad����_dn_find����I_3���������_s������ ����_tcp_con*����_tcpip_w+����_udp_con+����_udp_sen],����_alarm_h -����_udp_rec$-����I_1���������next����!7����found���?7����failure�7����_grow���7����__bottom(����__top���,����__empty�0����_handlerE����_gnum���F����_o_printKG����_do_writ4O����SEND���������RECEIVE������BOTH���������SYSVEC��!�����SRCDEST������MESSAGE� �����uplword�R����upword��R����upbyte��R����done����R����downwardS����compare�0S����done����<S����no0�����S����slword��S����sword���S����sbyte���S����done����S����_unknown, ����I_1�����4����_servf��P����_any����X����_line���X����_serv���\����_serv_all����begtext�������begdata�, ����begbss��\����crtso���������___main�P�����__penvir, ����__fpu_pr����__penvp�����__edata�\����_exit�������_environ ����endtext�Z����_main��� ����_unesc��T�����_encode6����_auth���i����_skipit�����_httpgetY����_ftppasv����_ftprepl����_ftpcmd�@����_ftpget�����_tcpget�M ����_ftpphos�����_ftpppor����_buffer�����_perror�`5����_strlen�7����_write��6����_strncas{.����_atoi���X����_strrchr7����_tolower����.csa4���Y����.csb4���Y����_fflush�x0����_connect����_strncmp7����_fgets�� 2����_close��6����_fclose�/����___stder ����_strncpy7����_strchr�7����_strcmp�T7����_strcpy�d7����_sprintf5����_read���6����_fprintf@5����_fdopen�.����_memcpy�6����_sleep��6����_gethost����_ioctl��6����_errno�� ����_getenv�����__tmp���Y����_open���6����_strtol�����___funccx ����__clean�| ����___functY����__exit��6����_strtoul#����___ctype$ ����_gethost����_h_errnoZ����_res_que!����_inet_adP����__getsho ����_dn_expa|����_dn_skip]����_res_sea4"����__tmp_l�Z����_inet_at����_dn_comp����__getlon ����___putsh ����___putlo ����_res_que#����___hostaX$����_res_ini;����_strcase.����_fopen��3����__res��� Z����_res_mkq?����_res_senX%����__res_cl*����_free���:����_malloc�o8����_alarm��6����_signal�;����_toupper;����___iotab ����___stdin ����___stdou ����__close�C����___clean1����__lseek�0D����__write�F����___fillb2����__read��D����__open��hD����__creat�C����__doprntH����_strerroh;����_snprint6����_vsnprin06����_vsprint6����___flushpO����___exit�xC����__alarm�C����__ioctl�D����__sleep�E����__memcpyR����__strncm S����__strncpPS����__strnlepS����_realloc|9����__sbrk��B����__brk���B����__sigactD����__sigempE����__sys_er< ����__sys_neH����_gethost(T����_getservT����_memset�S����__brksiz( ����__syscal4C����__sendreR����__loadnaU����___sigre|R����__sigadd,E����__sigdelYE����__sigfilE����__sigismE����_sigproclR����_sigfilldR����_sigsusptR����_sigactiLR����_raise��S����_sigempt\R����_sigdelsTR����__f_prinT����__i_compQ����__isattydU����__sigproU����__sigsusV����__sigret:V����__send��R����__receivR����endbss��d[����__memmovR����__kill��U����__getpidLU����__fp_hooL����__serv_s`[����_endservV����_getserv-W����_setservV����__tcgetaV����__sigjmp�V����_rewind�X����_fseek��X����ECASE��������.fat����Y����.stop���Y����.trp����Y����.trppc��T����ERANGE�������ESET���������EIDIVZ�������EHEAP��������EILLINS������EODDZ��������.ignmaskX����__etext�Z����endrom��, ����enddata�\����__end���d[����������������������������������������, ������������\������������d[������������������������������������������������������������������������ .������������� ..��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������shutdown~~��~������������������������������=reboot������~������������������������������=root��������console�����������������������=shutdown~~��~������������������������������='=reboot������~������������������������������|=root��������console������������������������=shutdown~~��~������������������������������=reboot������~������������������������������8=root��������console�����������������������M=������������console�����������������������=shutdown~~��~������������������������������=reboot������~������������������������������ƚ=root��������console�����������������������қ=halt����~~��~������������������������������=reboot������~������������������������������=root��������console�����������������������?=shutdown~~��~������������������������������=reboot������~������������������������������=shutdown~~��~������������������������������=reboot������~������������������������������p=root��������console����������������������� =shutdown~~��~���Oct 02 08:13:50 shutdown: system shutdown by root@noname Dec 06 22:39:57 shutdown: system shutdown by root@noname Dec 12 23:15:22 reboot: system reboot by root@noname Dec 13 08:09:21 shutdown: system shutdown by root@noname Dec 13 09:09:04 halt: system halt by root@noname Dec 13 09:46:49 reboot: system reboot by root@noname Dec 13 09:53:33 shutdown: system shutdown by root@noname Dec 13 10:07:30 shutdown: system shutdown by root@noname Dec 13 10:18:43 shutdown: system shutdown by root@noname Dec 13 11:17:49 reboot: system reboot by root@noname Dec 13 11:22:00 halt: system halt by root@noname Dec 13 11:28:43 shutdown: system shutdown by root@noname Dec 13 13:05:22 shutdown: system shutdown by root@noname Dec 13 13:18:28 shutdown: system shutdown by root@noname Dec 12 23:40:47 reboot: system reboot by root@noname Dec 12 23:44:20 shutdown: system shutdown by root@noname Dec 13 02:39:50 shutdown: system shutdown by root@noname Oct 24 18:04:30 shutdown: system shutdown by root@noname Oct 27 18:39:45 shutdown: syst20 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� .�������������?�..������������ passwd.1������ shadow.1������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������root:##root:0:0:Big Brother:/: daemon:*:1:1:The Deuce:/etc: bin:##root:2:0:Binaries:/usr/src: uucp:*:5:5:UNIX to UNIX copy:/usr/spool/uucp:/usr/bin/uucico news:*:6:6:Usenet news:/usr/spool/news: ftp:*:7:7:Anonymous FTP:/usr/ftp: ast:*:8:3:Andrew S. Tanenbaum:/usr/ast: www:*:9:9:World Wide Web:/usr/www: nobody:*:9999:99::/tmp: ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������root::0:0::: ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������root��������console�����������������������7oC�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b=reboot������~������������������������������β=root��������console�����������������������=shutdown~~��~������������������������������=reboot������~������������������������������*=root��������console�����������������������V=shutdown~~��~������������������������������=reboot������~������������������������������=root��������console�����������������������(=halt����~~��~������������������������������=reboot������~������������������������������=root��������console�����������������������=shutdown~~��~������������������������������k=reboot������~������������������������������=root��������console�����������������������=shutdown~~��~������������������������������=reboot������~������������������������������u=root��������console�����������������������=shutdown~~��~������������������������������$=reboot������~������������������������������=root��������console�����������������������=������������console�����������������������;=root��������console���������������������!��=shutdown~~��~������������������������������=reboot������~������������������������������=root��������console�����������������������=shutdown~~��~������������������������������T=reboot������~������������������������������=root��������console�����������������������J=shutdown~~��~������������������������������vH=reboot������~������������������������������#]Croot��������console�����������������������]C������������console�����������������������n!]Croot��������console���������������������(��!]Cshutdown~~��~������������������������������."]Creboot������~������������������������������`Croot��������console�����������������������`Creboot������~������������������������������T`Croot��������console�����������������������^`C������������console�����������������������`Creboot������~������������������������������*aCroot��������console�����������������������baCshutdown~~��~������������������������������aCem shutdown by root@noname Oct 27 19:01:23 shutdown: system shutdown by root@noname Oct 27 19:16:58 shutdown: system shutdown by root@noname Oct 27 19:28:30 shutdown: system shutdown by root@noname Oct 27 19:26:47 shutdown: system shutdown by root@noname Oct 27 19:34:47 shutdown: system shutdown by root@noname Oct 27 19:55:58 shutdown: system shutdown by root@noname �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������reboot������~������������������������������aCroot��������console�����������������������aCshutdown~~��~������������������������������$aCreboot������~������������������������������$aCroot��������console�����������������������$aCreboot������~������������������������������e(aCroot��������console�����������������������o(aCreboot������~������������������������������7aCroot��������console�����������������������8aCreboot������~������������������������������!aCroot��������console�����������������������!aC������������console�����������������������"aCreboot������~������������������������������."aCroot��������console�����������������������"aCreboot������~������������������������������#aCroot��������console����������������������� #aCshutdown~~��~������������������������������'aCreboot������~������������������������������e%aCroot��������console�����������������������v%aCreboot������~������������������������������z'aCroot��������console�����������������������'aCshutdown~~��~������������������������������^*aCreboot������~������������������������������)aCroot��������console����������������������� )aCshutdown~~��~������������������������������)aCreboot������~������������������������������~)aCroot��������console�����������������������)aCshutdown~~��~������������������������������+aCreboot������~������������������������������W,aCroot��������console�����������������������_,aC������������console�����������������������-aCreboot������~������������������������������,aCroot��������console�����������������������W-aCshutdown~~��~������������������������������0aCreboot������~������������������������������.oCroot��������console�����������������������Q/oC������������console�����������������������l<oCreboot������~������������������������������/oCroot��������console�����������������������C0oC������������console�����������������������MoCreboot������~������������������������������0oCroot��������console�����������������������1oC������������console�����������������������JoCreboot������~������������������������������2oCroot��������console�����������������������3oCreboot������~������������������������������2oCroot��������console�����������������������3oCreboot������~������������������������������83oCroot��������console�����������������������3oC������������console�����������������������S8oCreboot������~������������������������������6oCroot��������console�����������������������7oC��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������